diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b694934 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv \ No newline at end of file diff --git a/adaptive_number/LICENSE b/adaptive_number/LICENSE new file mode 100644 index 0000000..b0e8b7e --- /dev/null +++ b/adaptive_number/LICENSE @@ -0,0 +1,11 @@ +Copyright 2021 Philipp Sessler + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/adaptive_number/lib/adaptive_number.dart b/adaptive_number/lib/adaptive_number.dart new file mode 100644 index 0000000..6078d6a --- /dev/null +++ b/adaptive_number/lib/adaptive_number.dart @@ -0,0 +1,6 @@ +/// Support for doing something awesome. +/// +/// More dartdocs go here. +library adaptive_number; + +export 'src/number.dart'; diff --git a/adaptive_number/lib/src/int.dart b/adaptive_number/lib/src/int.dart new file mode 100644 index 0000000..9798828 --- /dev/null +++ b/adaptive_number/lib/src/int.dart @@ -0,0 +1,120 @@ +import 'package:adaptive_number/src/number.dart'; + +class NumberInt implements Number { + final int _value; + + NumberInt(this._value); + + @override + NumberInt operator +(Number value) { + return NumberInt(_value + (value.val as int)); + } + + @override + NumberInt operator -(Number value) { + return NumberInt(_value - (value.val as int)); + } + + @override + NumberInt operator -() { + return NumberInt(-(val)); + } + + @override + NumberInt operator *(Number value) { + return NumberInt(_value * (value.val as int)); + } + + @override + NumberInt operator &(Number value) { + return NumberInt(_value & (value.val as int)); + } + + @override + NumberInt operator >>(int value) { + return NumberInt(_value >> value); + } + + @override + NumberInt operator <<(int value) { + return NumberInt(_value << value); + } + + @override + NumberInt operator ^(Number value) { + return NumberInt(_value ^ (value.val as int)); + } + + @override + NumberInt operator |(Number value) { + return NumberInt(_value | (value.val as int)); + } + + @override + bool operator <(Number value) { + return (intValue < value.intValue); + } + + @override + bool operator <=(Number value) { + return (intValue <= value.intValue); + } + + @override + bool operator >(Number value) { + return (intValue > value.intValue); + } + + @override + bool operator >=(Number value) { + return (intValue >= value.intValue); + } + + @override + NumberInt operator %(Number value) { + return NumberInt(_value % (value.val as int)); + } + + @override + Number operator ~/(Number value) { + return NumberInt(_value ~/ (value.val as int)); + } + + @override + int get val => _value; + + @override + int get intValue => _value; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is NumberInt && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + @override + String toString() { + return _value.toString(); + } + + @override + String toRadixString(int radix) { + return _value.toRadixString(radix); + } + + @override + NumberInt abs() { + return NumberInt(_value.abs()); + } + + @override + int compareTo(Number other) { + return _value.compareTo(other.intValue); + } +} + +Number createNumber(int val) => NumberInt(val); diff --git a/adaptive_number/lib/src/int64.dart b/adaptive_number/lib/src/int64.dart new file mode 100644 index 0000000..39b39e3 --- /dev/null +++ b/adaptive_number/lib/src/int64.dart @@ -0,0 +1,121 @@ +import 'package:adaptive_number/src/number.dart'; +import 'package:fixnum/fixnum.dart'; + +class NumberInt64 implements Number { + final Int64 _value; + + NumberInt64(this._value); + + @override + NumberInt64 operator +(Number value) { + return NumberInt64(_value + (value.val as Int64)); + } + + @override + NumberInt64 operator -(Number value) { + return NumberInt64(_value - (value.val as Int64)); + } + + @override + NumberInt64 operator -() { + return NumberInt64(-(val)); + } + + @override + NumberInt64 operator *(Number value) { + return NumberInt64(_value * (value.val as Int64)); + } + + @override + NumberInt64 operator &(Number value) { + return NumberInt64(_value & (value.val as Int64)); + } + + @override + NumberInt64 operator >>(int value) { + return NumberInt64(_value >> value); + } + + @override + NumberInt64 operator <<(int value) { + return NumberInt64(_value << value); + } + + @override + NumberInt64 operator ^(Number value) { + return NumberInt64(_value ^ (value.val as Int64)); + } + + @override + NumberInt64 operator |(Number value) { + return NumberInt64(_value | (value.val as Int64)); + } + + @override + bool operator <(Number value) { + return (intValue < value.intValue); + } + + @override + bool operator <=(Number value) { + return (intValue <= value.intValue); + } + + @override + bool operator >(Number value) { + return (intValue > value.intValue); + } + + @override + bool operator >=(Number value) { + return (intValue >= value.intValue); + } + + @override + NumberInt64 operator %(Number value) { + return NumberInt64(_value % (value.val as Int64)); + } + + @override + Number operator ~/(Number value) { + return NumberInt64(_value ~/ (value.val as Int64)); + } + + @override + Int64 get val => _value; + + @override + int get intValue => _value.toInt(); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is NumberInt64 && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + @override + String toString() { + return _value.toString(); + } + + @override + String toRadixString(int radix) { + return _value.toRadixString(radix); + } + + @override + NumberInt64 abs() { + return NumberInt64(_value.abs()); + } + + @override + int compareTo(Number value) { + return _value.compareTo(value.val as Int64); + } +} + +Number createNumber(int val) => NumberInt64(Int64(val)); diff --git a/adaptive_number/lib/src/number.dart b/adaptive_number/lib/src/number.dart new file mode 100644 index 0000000..df64950 --- /dev/null +++ b/adaptive_number/lib/src/number.dart @@ -0,0 +1,78 @@ +import 'package:adaptive_number/src/stub.dart' +// ignore: uri_does_not_exist + if (dart.library.io) 'package:adaptive_number/src/int.dart' +// ignore: uri_does_not_exist + if (dart.library.html) 'package:adaptive_number/src/int64.dart'; + +abstract class Number { + static Number zero = Number(0); + static Number one = Number(1); + static Number two = Number(2); + + factory Number(int val) => createNumber(val); + + dynamic get val; + + /// Returns the value as int (caution: May overflow on JS runtimes) + int get intValue; + + @override + int get hashCode; + + /// Addition operator. + Number operator +(Number value); + + /// Subtraction operator. + Number operator -(Number value); + + /// Negate operator. + Number operator -(); + + /// Multiplication operator. + Number operator *(Number value); + + /// Bitwise and operator. + Number operator &(Number value); + + /// Right bit-shift operator. + Number operator >>(int value); + + /// Left bit-shift operator. + Number operator <<(int value); + + /// Bitwise xor operator. + Number operator ^(Number value); + + /// Bitwise or operator. + Number operator |(Number value); + + /// Relational less than operator. + bool operator <(Number value); + + /// Relational less than or equal to operator. + bool operator <=(Number value); + + /// Relational greater than operator. + bool operator >(Number value); + + /// Relational greater than or equal to operator. + bool operator >=(Number value); + + /// Euclidean modulo operator. + Number operator %(Number value); + + /// Truncating division operator. + Number operator ~/(Number value); + + @override + String toString(); + + /// Returns a string representing the value of this integer in the given radix. + String toRadixString(int radix); + + /// Returns the absolute value of this integer. + Number abs(); + + // Compares this to `other` + int compareTo(Number other); +} diff --git a/adaptive_number/lib/src/stub.dart b/adaptive_number/lib/src/stub.dart new file mode 100644 index 0000000..1e4ce05 --- /dev/null +++ b/adaptive_number/lib/src/stub.dart @@ -0,0 +1,4 @@ +import 'package:adaptive_number/src/number.dart'; + +Number createNumber(int val) => throw UnsupportedError( + 'Cannot create a Number without package dart.library.io or dart.library.html being available'); diff --git a/adaptive_number/pubspec.yaml b/adaptive_number/pubspec.yaml new file mode 100644 index 0000000..a408604 --- /dev/null +++ b/adaptive_number/pubspec.yaml @@ -0,0 +1,17 @@ +name: adaptive_number +version: 1.0.0 + +description: >- + Library providing an adaptive number implementation. On JS runtimes, a 64-bit signed fixed-width integer will be used and + for all other platforms the default Dart int data type. +homepage: https://github.com/lemoony/adaptive_number_dart + +environment: + sdk: '>=2.12.0 <3.0.0' + +dependencies: + fixnum: ^1.0.0 + +dev_dependencies: + pedantic: ^1.10.0 + test: ^1.16.0 diff --git a/adaptive_number/test/adaptive_number_test.dart b/adaptive_number/test/adaptive_number_test.dart new file mode 100644 index 0000000..52931d7 --- /dev/null +++ b/adaptive_number/test/adaptive_number_test.dart @@ -0,0 +1,128 @@ +import 'package:adaptive_number/adaptive_number.dart'; +import 'package:test/test.dart'; + +// Since both implementations of Number only forward most method call, +// tests are kept minimal and should mainly concentrate on verifying that no +// wrong operator and/or method is being called because of a mix up +void main() { + group('utility functions', () { + test('retrieve value as int', () { + expect(Number.zero.intValue, 0); + expect(Number.one.intValue, 1); + expect(Number.two.intValue, 2); + expect(Number(42).intValue, 42); + }); + }); + + group('other overwrites', () { + test('hash code', () { + expect(Number.zero.hashCode, 0.hashCode); + expect(Number.one.hashCode, 1.hashCode); + expect(Number.two.hashCode, 2.hashCode); + expect(Number(42).hashCode, 42); + }); + + test('to string', () { + expect(Number.one.toString(), '1'); + expect((-Number.one).toString(), '-1'); + }); + + test('toRadixString', () { + expect(Number(42).toRadixString(2), '101010'); + }); + + test('abs', () { + expect(Number(-42).abs(), Number(42)); + }); + + test('compare to', () { + expect(Number.one.compareTo(Number.two), -1); + expect(Number.two.compareTo(Number.one), 1); + expect(Number.one.compareTo(Number.one), 0); + }); + }); + + group('operator tests', () { + test('add', () { + expect(Number.one + Number.two, Number(3)); + }); + + test('subtract', () { + expect(Number.two - Number.one, Number.one); + }); + + test('invert', () { + expect((-Number.one).intValue, -1); + expect((-Number.zero).intValue, 0); + }); + + test('multiply', () { + expect(Number.two * Number(3), Number(6)); + }); + + test('& bitwise and', () { + expect(Number(1234) & Number(9876), Number(1168)); + expect(Number(-1234) & Number(9876), Number(8708)); + }); + + test('>> bitwise shift right', () { + expect(Number(23423) >> 8, Number(91)); + expect(Number(-87653) >> 12, Number(-22)); + }); + + test('<< bitwise shift left', () { + expect(Number(23423) << 8, Number(5996288)); + expect(Number(-87653) << 12, Number(-359026688)); + }); + + test('^ bitwise xor', () { + expect(Number(1234) ^ Number(9876), Number(8774)); + }); + + test('| bitwise or', () { + expect(Number(1234) | Number(9876), Number(9942)); + expect(Number(-1234) | Number(9876), Number(-66)); + }); + + test('< less than', () { + expect(Number.one < Number.two, isTrue); + expect(Number.two < Number.one, isFalse); + }); + + test('< less than or equal', () { + expect(Number.two <= Number.one, isFalse); + expect(Number.one <= Number.two, isTrue); + expect(Number.two <= Number.two, isTrue); + }); + + test('< greater than', () { + expect(Number.two > Number.one, isTrue); + expect(Number.one > Number.two, isFalse); + }); + + test('< greater than or equal', () { + expect(Number.two >= Number.one, isTrue); + expect(Number.one >= Number.two, isFalse); + expect(Number.two >= Number.two, isTrue); + }); + + test('modulo', () { + expect(Number.two % Number.one, Number.zero); + expect(Number(3) % Number.one, Number.zero); + expect(Number.one % Number.two, Number.one); + }); + + test('truncating division', () { + expect(Number(1000) ~/ Number(-3), Number(-333)); + }); + + test('equals', () { + expect(Number(0) == Number.zero, isTrue); + expect(Number(1) == Number.one, isTrue); + expect(Number(2) == Number.two, isTrue); + + expect(Number(1) == Number.zero, isFalse); + expect(Number.one == Number.zero, isFalse); + }); + }); +} diff --git a/config.lock.yaml b/config.lock.yaml new file mode 100644 index 0000000..f35cbdb --- /dev/null +++ b/config.lock.yaml @@ -0,0 +1,14 @@ +adaptive_number: ea9178fdd4d82ac45cf0ec966ac870dae661124f +dots_indicator: 508f5883ac79bdbc10254092de3f28f571d261cd +ed25519_edwards: 7353ba759ea9f4646cbf481c2ef949625c8ce4cf +hashlib: 983cdbd5ee2529b908876b57a7217c09c6bc148a +hashlib_codecs: 2a966c37c3b9b1f5541ae88e99ab34acf3fc968b +introduction_screen: 4a90e557630b28834479ed9c64a9d2d0185d8e48 +libsignal_protocol_dart: 618f0c0b49534245a640a31d204265440cbac9ee +lottie: 4f1a5a52bdf1e1c1e12fa97c96174dcb05419e19 +mutex: 84ca903a3ac863735e3228c75a212133621f680f +optional: 71c638891ce4f2aff35c7387727989f31f9d877d +photo_view: a13ca2fc387a3fb1276126959e092c44d0029987 +pointycastle: bbd8569f68a7fccbdf0b92d0b44a9219c126c8dd +qr_dart: ff808bb3f354e6a7029ec953cbe0144a42021db6 +x25519: ecb1d357714537bba6e276ef45f093846d4beaee diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..6e10d40 --- /dev/null +++ b/config.yaml @@ -0,0 +1,42 @@ +qr_dart: + git: https://github.com/kevmoo/qr.dart.git + +mutex: + git: https://github.com/hoylen/dart-mutex.git + +photo_view: + git: https://github.com/bluefireteam/photo_view.git + +introduction_screen: + git: https://github.com/Pyozer/introduction_screen.git + +dots_indicator: + git: https://github.com/Pyozer/dots_indicator.git + +hashlib: + git: https://github.com/bitanon/hashlib.git + replace: + - + - "abstract class MACHashBase" + - "abstract mixin class MACHashBase" + dependencies: + hashlib_codecs: + git: https://github.com/bitanon/hashlib_codecs.git + +lottie: + git: https://github.com/xvrh/lottie-flutter.git + + +libsignal_protocol_dart: + git: https://github.com/MixinNetwork/libsignal_protocol_dart.git + dependencies: + adaptive_number: + git: https://github.com/lemoony/adaptive_number_dart + ed25519_edwards: + git: https://github.com/Tougee/ed25519.git + optional: + git: https://github.com/tonio-ramirez/optional.dart.git + pointycastle: + git: https://github.com/bcgit/pc-dart.git + x25519: + git: https://github.com/Tougee/curve25519.git diff --git a/dots_indicator/LICENSE b/dots_indicator/LICENSE new file mode 100644 index 0000000..d195f29 --- /dev/null +++ b/dots_indicator/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Jean-Charles Moussé + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/dots_indicator/lib/dots_indicator.dart b/dots_indicator/lib/dots_indicator.dart new file mode 100644 index 0000000..9d8f13a --- /dev/null +++ b/dots_indicator/lib/dots_indicator.dart @@ -0,0 +1,4 @@ +library dots_indicator; + +export 'src/dots_indicator.dart' show DotsIndicator; +export 'src/dots_decorator.dart' show DotsDecorator; diff --git a/dots_indicator/lib/src/dots_decorator.dart b/dots_indicator/lib/src/dots_decorator.dart new file mode 100644 index 0000000..98d394d --- /dev/null +++ b/dots_indicator/lib/src/dots_decorator.dart @@ -0,0 +1,156 @@ +import 'package:flutter/material.dart'; + +const Size kDefaultSize = Size.square(9.0); +const Size kDefaultFadeOutSize = Size.square(6.0); +const EdgeInsets kDefaultSpacing = EdgeInsets.all(6.0); +const ShapeBorder kDefaultShape = CircleBorder(); + +class DotsDecorator { + /// Inactive dot color + /// + /// @Default `Colors.grey` + final Color color; + + /// List of inactive dot colors + /// One color by dot + /// + /// @Default `Value of color parameter applied to each dot` + final List colors; + + /// Active dot color + /// + /// @Default `Theme.of(context).primaryColor` + final Color? activeColor; + + /// List of active dot colors + /// One color by dot + /// + /// @Default `Value of activeColor parameter applied to each dot` + final List activeColors; + + /// Inactive dot size + /// + /// @Default `Size.square(9.0)` + final Size size; + + /// List of inactive dot size + /// One size by dot + /// + /// @Default `Value of size parameter applied to each dot` + final List sizes; + + /// Fade out dot size + /// + /// @Default `Size.square(6.0)` + final Size fadeOutSize; + + /// List of fade out dot size + /// One size by dot + /// + /// @Default `Value of activeSize parameter applied to each dot` + final List fadeOutSizes; + + /// Active dot size + /// + /// @Default `Size.square(9.0)` + final Size activeSize; + + /// List of active dot size + /// One size by dot + /// + /// @Default `Value of activeSize parameter applied to each dot` + final List activeSizes; + + /// Inactive dot shape + /// + /// @Default `CircleBorder()` + final ShapeBorder shape; + + /// List of inactive dot shape + /// One shape by dot + /// + /// @Default `Value of shape parameter applied to each dot` + final List shapes; + + /// Active dot shape + /// + /// @Default `CircleBorder()` + final ShapeBorder activeShape; + + /// List of active dot shapes + /// One shape by dot + /// + /// @Default `Value of activeShape parameter applied to each dot` + final List activeShapes; + + /// Spacing between dots + /// + /// @Default `EdgeInsets.all(6.0)` + final EdgeInsets spacing; + + /// Shadows of the dots + /// + /// @Default `null` + final List? shadows; + + /// Shadows of the active dots + /// + /// @Default `shadows` or `null` + final List? activeShadows; + + const DotsDecorator({ + this.color = Colors.grey, + this.colors = const [], + this.activeColor, + this.activeColors = const [], + this.size = kDefaultSize, + this.sizes = const [], + this.fadeOutSize = kDefaultFadeOutSize, + this.fadeOutSizes = const [], + this.activeSize = kDefaultSize, + this.activeSizes = const [], + this.shape = kDefaultShape, + this.shapes = const [], + this.activeShape = kDefaultShape, + this.activeShapes = const [], + this.spacing = kDefaultSpacing, + this.shadows, + this.activeShadows, + }); + + Color? getActiveColor(int index) { + return activeColors.isNotEmpty ? activeColors[index] : activeColor; + } + + Color getColor(int index) { + return colors.isNotEmpty ? colors[index] : color; + } + + Size getFadeOutSize(int index) { + return fadeOutSizes.isNotEmpty ? fadeOutSizes[index] : fadeOutSize; + } + + Size getActiveSize(int index) { + return activeSizes.isNotEmpty ? activeSizes[index] : activeSize; + } + + Size getSize(int index) { + return sizes.isNotEmpty ? sizes[index] : size; + } + + ShapeBorder getActiveShape(int index) { + return activeShapes.isNotEmpty ? activeShapes[index] : activeShape; + } + + ShapeBorder getShape(int index) { + return shapes.isNotEmpty ? shapes[index] : shape; + } + + List? getShadows(int index) { + return shadows; + } + + List? getActiveShadows(int index) { + return activeShadows ?? shadows; + } +} diff --git a/dots_indicator/lib/src/dots_indicator.dart b/dots_indicator/lib/src/dots_indicator.dart new file mode 100644 index 0000000..aa35b1a --- /dev/null +++ b/dots_indicator/lib/src/dots_indicator.dart @@ -0,0 +1,187 @@ +library dots_indicator; + +import 'dart:math'; + +import 'package:dots_indicator/src/dots_decorator.dart'; +import 'package:flutter/material.dart'; + +typedef OnTap = void Function(int position); + +class DotsIndicator extends StatelessWidget { + final int dotsCount; + final double position; + + /// If true, the last dot will fade out when the position is at the last dot. + final bool fadeOutLastDot; + + /// Distance from currently selected dot to the one that fades out. + final int fadeOutDistance; + final DotsDecorator decorator; + final Axis axis; + final bool reversed; + final OnTap? onTap; + final MainAxisSize mainAxisSize; + final MainAxisAlignment mainAxisAlignment; + + /// If true, the dots will animate when the position changes. + final bool animate; + + /// Duration of the animation when the position changes. + final Duration animationDuration; + + DotsIndicator({ + super.key, + required this.dotsCount, + this.position = 0.0, + this.decorator = const DotsDecorator(), + this.axis = Axis.horizontal, + this.reversed = false, + this.mainAxisSize = MainAxisSize.min, + this.mainAxisAlignment = MainAxisAlignment.center, + this.onTap, + this.fadeOutLastDot = false, + this.fadeOutDistance = 0, + this.animate = false, + this.animationDuration = const Duration(milliseconds: 200), + }) : assert(dotsCount > 0, 'dotsCount must be superior to zero'), + assert(position >= 0.0, 'position must be superior or equals to zero'), + assert( + position < dotsCount, + "position must be less than dotsCount", + ), + assert( + decorator.colors.isEmpty || decorator.colors.length == dotsCount, + "colors param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + decorator.activeColors.isEmpty || + decorator.activeColors.length == dotsCount, + "activeColors param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + decorator.sizes.isEmpty || decorator.sizes.length == dotsCount, + "sizes param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + decorator.activeSizes.isEmpty || + decorator.activeSizes.length == dotsCount, + "activeSizes param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + decorator.shapes.isEmpty || decorator.shapes.length == dotsCount, + "shapes param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + decorator.activeShapes.isEmpty || + decorator.activeShapes.length == dotsCount, + "activeShapes param in decorator must empty or have same length as dotsCount parameter", + ), + assert( + fadeOutLastDot == false || fadeOutDistance > 0, + "fadeOutDistace must be superior to zero when fadeOutLastDot is true", + ), + assert( + fadeOutDistance < dotsCount, + "fadeOutDistace must be inferior to dotsCount", + ); + + Widget _wrapInkwell(Widget dot, int index) { + return InkWell( + customBorder: position == index + ? decorator.getActiveShape(index) + : decorator.getShape(index), + onTap: () => onTap!(index), + child: dot, + ); + } + + Widget _buildDot(BuildContext context, int index) { + final double absPositionIndexRelation = (position - index).abs(); + final bool isCurrentlyVisible = absPositionIndexRelation <= fadeOutDistance; + + final double lerpValue = min(1.0, absPositionIndexRelation).toDouble(); + + Size size = Size.lerp( + decorator.getActiveSize(index), + decorator.getSize(index), + lerpValue, + )!; + + if (fadeOutLastDot && absPositionIndexRelation >= fadeOutDistance) { + size = Size.lerp( + decorator.getSize(index), + decorator.getFadeOutSize(index), + absPositionIndexRelation == fadeOutDistance ? 1 : 0.0, + )!; + } + + final dot = Container( + height: fadeOutLastDot && isCurrentlyVisible + ? max( + max(decorator.getActiveSize(index).height, + decorator.getSize(index).height), + decorator.getFadeOutSize(index).height, + ) + + (axis == Axis.horizontal + ? decorator.spacing.vertical + : decorator.spacing.horizontal) + : null, + child: Center( + child: AnimatedOpacity( + duration: animate ? animationDuration : Duration.zero, + opacity: + !fadeOutLastDot || absPositionIndexRelation <= fadeOutDistance + ? 1.0 + : 0.0, + child: AnimatedContainer( + duration: animate ? animationDuration : Duration.zero, + width: size.width, + height: size.height, + margin: fadeOutLastDot && !isCurrentlyVisible + ? EdgeInsets.all(0) + : decorator.spacing, + decoration: ShapeDecoration( + color: Color.lerp( + decorator.getActiveColor(index) ?? Theme.of(context).primaryColor, + decorator.getColor(index), + lerpValue, + ), + shape: ShapeBorder.lerp( + decorator.getActiveShape(index), + decorator.getShape(index), + lerpValue, + )!, + shadows: BoxShadow.lerpList( + decorator.getActiveShadows(index), + decorator.getShadows(index), + lerpValue, + ), + ), + ), + ), + ), + ); + return onTap == null ? dot : _wrapInkwell(dot, index); + } + + @override + Widget build(BuildContext context) { + final dotsList = List.generate( + dotsCount, + (i) => _buildDot(context, i), + ); + final dots = reversed ? dotsList.reversed.toList() : dotsList; + + return axis == Axis.vertical + ? Column( + mainAxisAlignment: mainAxisAlignment, + mainAxisSize: mainAxisSize, + children: dots, + ) + : Row( + mainAxisAlignment: mainAxisAlignment, + mainAxisSize: mainAxisSize, + children: dots, + ); + } +} diff --git a/dots_indicator/pubspec.yaml b/dots_indicator/pubspec.yaml new file mode 100644 index 0000000..e195e28 --- /dev/null +++ b/dots_indicator/pubspec.yaml @@ -0,0 +1,14 @@ +name: dots_indicator +description: Dots indicator to show progression of a PageView for example +version: 4.0.1 +homepage: https://github.com/pyozer/dots_indicator + +environment: + sdk: '>=2.17.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_lints: ^5.0.0 diff --git a/ed25519_edwards/LICENSE b/ed25519_edwards/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/ed25519_edwards/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ed25519_edwards/lib/ed25519_edwards.dart b/ed25519_edwards/lib/ed25519_edwards.dart new file mode 100644 index 0000000..be808df --- /dev/null +++ b/ed25519_edwards/lib/ed25519_edwards.dart @@ -0,0 +1,204 @@ +/// Package ed25519 implements the Ed25519 signature algorithm. See +/// https://ed25519.cr.yp.to/. +/// +/// These functions are also compatible with the “Ed25519” function defined in +/// RFC 8032. However, unlike RFC 8032's formulation, this package's private key +/// representation includes a public key suffix to make multiple signing +/// operations with the same key more efficient. This package refers to the RFC +/// 8032 private key as the “seed”. + +library edwards25519; + +import 'dart:typed_data'; +import 'package:convert/convert.dart'; +import 'package:collection/collection.dart'; +import 'package:crypto/crypto.dart'; +import 'package:ed25519_edwards/src/edwards25519.dart'; +import 'package:ed25519_edwards/src/util.dart'; + +/// PublicKeySize is the size, in bytes, of public keys as used in this package. +const PublicKeySize = 32; + +/// PrivateKeySize is the size, in bytes, of private keys as used in this package. +const PrivateKeySize = 64; + +/// SignatureSize is the size, in bytes, of signatures generated and verified by this package. +const SignatureSize = 64; + +/// SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. +const SeedSize = 32; + +/// PublicKey is the type of Ed25519 public keys. +class PublicKey { + List bytes; + + PublicKey(this.bytes); +} + +/// PrivateKey is the type of Ed25519 private keys. +class PrivateKey { + List bytes; + + PrivateKey(this.bytes); +} + +/// KeyPair is the type of Ed25519 public/private key pair. +class KeyPair { + final PrivateKey privateKey; + + final PublicKey publicKey; + + KeyPair(this.privateKey, this.publicKey); + + @override + int get hashCode => publicKey.hashCode; + + @override + bool operator ==(other) => + other is KeyPair && + publicKey == other.publicKey && + privateKey == other.privateKey; +} + +/// public returns the PublicKey corresponding to PrivateKey. +PublicKey public(PrivateKey privateKey) { + var publicKey = privateKey.bytes.sublist(32, 32 + PublicKeySize); + return PublicKey(publicKey); +} + +/// Seed returns the private key seed corresponding to priv. It is provided for +/// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds +/// in this package. +Uint8List seed(PrivateKey privateKey) { + var seed = privateKey.bytes.sublist(0, SeedSize); + return seed as Uint8List; +} + +/// GenerateKey generates a public/private key pair using entropy from secure random. +KeyPair generateKey() { + var seed = Uint8List(32); + fillBytesWithSecureRandomNumbers(seed); + var privateKey = newKeyFromSeed(seed); + var publicKey = privateKey.bytes.sublist(32, PrivateKeySize); + return KeyPair(privateKey, PublicKey(publicKey)); +} + +/// NewKeyFromSeed calculates a private key from a seed. It will throw +/// ArgumentError if seed.length is not SeedSize. +/// This function is provided for interoperability with RFC 8032. +/// RFC 8032's private keys correspond to seeds in this package. +PrivateKey newKeyFromSeed(Uint8List seed) { + if (seed.length != SeedSize) { + throw ArgumentError('ed25519: bad seed length ${seed.length}'); + } + var h = sha512.convert(seed); + var digest = h.bytes.sublist(0, 32); + digest[0] &= 248; + digest[31] &= 127; + digest[31] |= 64; + + var A = ExtendedGroupElement(); + var hBytes = digest.sublist(0); + GeScalarMultBase(A, hBytes as Uint8List); + var publicKeyBytes = Uint8List(32); + A.ToBytes(publicKeyBytes); + + var privateKey = Uint8List(PrivateKeySize); + arrayCopy(seed, 0, privateKey, 0, 32); + arrayCopy(publicKeyBytes, 0, privateKey, 32, 32); + return PrivateKey(privateKey); +} + +/// Sign signs the message with privateKey and returns a signature. It will +/// throw ArumentError if privateKey.bytes.length is not PrivateKeySize. +Uint8List sign(PrivateKey privateKey, Uint8List message) { + if (privateKey.bytes.length != PrivateKeySize) { + throw ArgumentError( + 'ed25519: bad privateKey length ${privateKey.bytes.length}'); + } + var h = sha512.convert(privateKey.bytes.sublist(0, 32)); + var digest1 = h.bytes; + var expandedSecretKey = digest1.sublist(0, 32); + expandedSecretKey[0] &= 248; + expandedSecretKey[31] &= 63; + expandedSecretKey[31] |= 64; + + var output = AccumulatorSink(); + var input = sha512.startChunkedConversion(output); + input.add(digest1.sublist(32)); + input.add(message); + input.close(); + var messageDigest = output.events.single.bytes; + + var messageDigestReduced = Uint8List(32); + ScReduce(messageDigestReduced, messageDigest as Uint8List); + var R = ExtendedGroupElement(); + GeScalarMultBase(R, messageDigestReduced); + + var encodedR = Uint8List(32); + R.ToBytes(encodedR); + + output = AccumulatorSink(); + input = sha512.startChunkedConversion(output); + input.add(encodedR); + input.add(privateKey.bytes.sublist(32)); + input.add(message); + input.close(); + var hramDigest = output.events.single.bytes; + var hramDigestReduced = Uint8List(32); + ScReduce(hramDigestReduced, hramDigest as Uint8List); + + var s = Uint8List(32); + ScMulAdd(s, hramDigestReduced, expandedSecretKey as Uint8List, + messageDigestReduced); + + var signature = Uint8List(SignatureSize); + arrayCopy(encodedR, 0, signature, 0, 32); + arrayCopy(s, 0, signature, 32, 32); + + return signature; +} + +/// Verify reports whether sig is a valid signature of message by publicKey. It +/// will throw ArgumentError if publicKey.bytes.length is not PublicKeySize. +bool verify(PublicKey publicKey, Uint8List message, Uint8List sig) { + if (publicKey.bytes.length != PublicKeySize) { + throw ArgumentError( + 'ed25519: bad publicKey length ${publicKey.bytes.length}'); + } + if (sig.length != SignatureSize || sig[63] & 224 != 0) { + return false; + } + + var A = ExtendedGroupElement(); + var publicKeyBytes = Uint8List.fromList(publicKey.bytes); + if (!A.FromBytes(publicKeyBytes)) { + return false; + } + FeNeg(A.X, A.X); + FeNeg(A.T, A.T); + + var output = AccumulatorSink(); + var input = sha512.startChunkedConversion(output); + input.add(sig.sublist(0, 32)); + input.add(publicKeyBytes); + input.add(message); + input.close(); + var digest = output.events.single.bytes; + + var hReduced = Uint8List(32); + ScReduce(hReduced, digest as Uint8List); + + var R = ProjectiveGroupElement(); + var s = sig.sublist(32); + + if (!ScMinimal(s)) { + return false; + } + + GeDoubleScalarMultVartime(R, hReduced, A, s); + + var checkR = Uint8List(32); + R.ToBytes(checkR); + return ListEquality().equals(sig.sublist(0, 32), checkR); +} diff --git a/ed25519_edwards/lib/src/const.dart b/ed25519_edwards/lib/src/const.dart new file mode 100644 index 0000000..b8405d8 --- /dev/null +++ b/ed25519_edwards/lib/src/const.dart @@ -0,0 +1,10162 @@ +import 'edwards25519.dart'; + +var d = FieldElement.fromList([ + -10913610, + 13857413, + -15372611, + 6949391, + 114729, + -8787816, + -6275908, + -3247719, + -18696448, + -12055116, +]); + +/// d2 is 2*d. +var d2 = FieldElement.fromList([ + -21827239, + -5839606, + -30745221, + 13898782, + 229458, + 15978800, + -12551817, + -6495438, + 29715968, + 9444199, +]); + +/// SqrtM1 is the square-root of -1 in the field. +var SqrtM1 = FieldElement.fromList([ + -32595792, + -7943725, + 9377950, + 3500415, + 12389472, + -272473, + -25146209, + -2005654, + 326686, + 11406482, +]); + +/// A is a constant in the Montgomery-form of curve25519. +var A = FieldElement.fromList([ + 486662, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +]); + +/// bi contains precomputed multiples of the base-point. See the Ed25519 paper +/// for a discussion about how these values are used. +var bi = List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 25967493, + -14356035, + 29566456, + 3660896, + -12694345, + 4014787, + 27544626, + -11754271, + -6079156, + 2047605 + ]), + FieldElement.fromList([ + -12545711, + 934262, + -2722910, + 3049990, + -727428, + 9406986, + 12720692, + 5043384, + 19500929, + -15469378 + ]), + FieldElement.fromList([ + -8738181, + 4489570, + 9688441, + -14785194, + 10184609, + -12363380, + 29287919, + 11864899, + -24514362, + -4438546 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15636291, + -9688557, + 24204773, + -7912398, + 616977, + -16685262, + 27787600, + -14772189, + 28944400, + -1550024 + ]), + FieldElement.fromList([ + 16568933, + 4717097, + -11556148, + -1102322, + 15682896, + -11807043, + 16354577, + -11775962, + 7689662, + 11199574 + ]), + FieldElement.fromList([ + 30464156, + -5976125, + -11779434, + -15670865, + 23220365, + 15915852, + 7512774, + 10017326, + -17749093, + -9920357 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10861363, + 11473154, + 27284546, + 1981175, + -30064349, + 12577861, + 32867885, + 14515107, + -15438304, + 10819380 + ]), + FieldElement.fromList([ + 4708026, + 6336745, + 20377586, + 9066809, + -11272109, + 6594696, + -25653668, + 12483688, + -12668491, + 5581306 + ]), + FieldElement.fromList([ + 19563160, + 16186464, + -29386857, + 4097519, + 10237984, + -4348115, + 28542350, + 13850243, + -23678021, + -15815942 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5153746, + 9909285, + 1723747, + -2777874, + 30523605, + 5516873, + 19480852, + 5230134, + -23952439, + -15175766 + ]), + FieldElement.fromList([ + -30269007, + -3463509, + 7665486, + 10083793, + 28475525, + 1649722, + 20654025, + 16520125, + 30598449, + 7715701 + ]), + FieldElement.fromList([ + 28881845, + 14381568, + 9657904, + 3680757, + -20181635, + 7843316, + -31400660, + 1370708, + 29794553, + -1409300 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -22518993, + -6692182, + 14201702, + -8745502, + -23510406, + 8844726, + 18474211, + -1361450, + -13062696, + 13821877 + ]), + FieldElement.fromList([ + -6455177, + -7839871, + 3374702, + -4740862, + -27098617, + -10571707, + 31655028, + -7212327, + 18853322, + -14220951 + ]), + FieldElement.fromList([ + 4566830, + -12963868, + -28974889, + -12240689, + -7602672, + -2830569, + -8514358, + -10431137, + 2207753, + -3209784 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25154831, + -4185821, + 29681144, + 7868801, + -6854661, + -9423865, + -12437364, + -663000, + -31111463, + -16132436 + ]), + FieldElement.fromList([ + 25576264, + -2703214, + 7349804, + -11814844, + 16472782, + 9300885, + 3844789, + 15725684, + 171356, + 6466918 + ]), + FieldElement.fromList([ + 23103977, + 13316479, + 9739013, + -16149481, + 817875, + -15038942, + 8965339, + -14088058, + -30714912, + 16193877 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -33521811, + 3180713, + -2394130, + 14003687, + -16903474, + -16270840, + 17238398, + 4729455, + -18074513, + 9256800 + ]), + FieldElement.fromList([ + -25182317, + -4174131, + 32336398, + 5036987, + -21236817, + 11360617, + 22616405, + 9761698, + -19827198, + 630305 + ]), + FieldElement.fromList([ + -13720693, + 2639453, + -24237460, + -7406481, + 9494427, + -5774029, + -6554551, + -15960994, + -2449256, + -14291300 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -3151181, + -5046075, + 9282714, + 6866145, + -31907062, + -863023, + -18940575, + 15033784, + 25105118, + -7894876 + ]), + FieldElement.fromList([ + -24326370, + 15950226, + -31801215, + -14592823, + -11662737, + -5090925, + 1573892, + -2625887, + 2198790, + -15804619 + ]), + FieldElement.fromList([ + -3099351, + 10324967, + -2241613, + 7453183, + -5446979, + -2735503, + -13812022, + -16236442, + -32461234, + -12290683 + ]), + ) +]); + +/// base contains precomputed multiples of the base-point. See the Ed25519 paper +/// for a discussion about how these values are used. +var base = List.from([ + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 25967493, + -14356035, + 29566456, + 3660896, + -12694345, + 4014787, + 27544626, + -11754271, + -6079156, + 2047605 + ]), + FieldElement.fromList([ + -12545711, + 934262, + -2722910, + 3049990, + -727428, + 9406986, + 12720692, + 5043384, + 19500929, + -15469378 + ]), + FieldElement.fromList([ + -8738181, + 4489570, + 9688441, + -14785194, + 10184609, + -12363380, + 29287919, + 11864899, + -24514362, + -4438546 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12815894, + -12976347, + -21581243, + 11784320, + -25355658, + -2750717, + -11717903, + -3814571, + -358445, + -10211303 + ]), + FieldElement.fromList([ + -21703237, + 6903825, + 27185491, + 6451973, + -29577724, + -9554005, + -15616551, + 11189268, + -26829678, + -5319081 + ]), + FieldElement.fromList([ + 26966642, + 11152617, + 32442495, + 15396054, + 14353839, + -12752335, + -3128826, + -9541118, + -15472047, + -4166697 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15636291, + -9688557, + 24204773, + -7912398, + 616977, + -16685262, + 27787600, + -14772189, + 28944400, + -1550024 + ]), + FieldElement.fromList([ + 16568933, + 4717097, + -11556148, + -1102322, + 15682896, + -11807043, + 16354577, + -11775962, + 7689662, + 11199574 + ]), + FieldElement.fromList([ + 30464156, + -5976125, + -11779434, + -15670865, + 23220365, + 15915852, + 7512774, + 10017326, + -17749093, + -9920357 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -17036878, + 13921892, + 10945806, + -6033431, + 27105052, + -16084379, + -28926210, + 15006023, + 3284568, + -6276540 + ]), + FieldElement.fromList([ + 23599295, + -8306047, + -11193664, + -7687416, + 13236774, + 10506355, + 7464579, + 9656445, + 13059162, + 10374397 + ]), + FieldElement.fromList([ + 7798556, + 16710257, + 3033922, + 2874086, + 28997861, + 2835604, + 32406664, + -3839045, + -641708, + -101325 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10861363, + 11473154, + 27284546, + 1981175, + -30064349, + 12577861, + 32867885, + 14515107, + -15438304, + 10819380 + ]), + FieldElement.fromList([ + 4708026, + 6336745, + 20377586, + 9066809, + -11272109, + 6594696, + -25653668, + 12483688, + -12668491, + 5581306 + ]), + FieldElement.fromList([ + 19563160, + 16186464, + -29386857, + 4097519, + 10237984, + -4348115, + 28542350, + 13850243, + -23678021, + -15815942 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -15371964, + -12862754, + 32573250, + 4720197, + -26436522, + 5875511, + -19188627, + -15224819, + -9818940, + -12085777 + ]), + FieldElement.fromList([ + -8549212, + 109983, + 15149363, + 2178705, + 22900618, + 4543417, + 3044240, + -15689887, + 1762328, + 14866737 + ]), + FieldElement.fromList([ + -18199695, + -15951423, + -10473290, + 1707278, + -17185920, + 3916101, + -28236412, + 3959421, + 27914454, + 4383652 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5153746, + 9909285, + 1723747, + -2777874, + 30523605, + 5516873, + 19480852, + 5230134, + -23952439, + -15175766 + ]), + FieldElement.fromList([ + -30269007, + -3463509, + 7665486, + 10083793, + 28475525, + 1649722, + 20654025, + 16520125, + 30598449, + 7715701 + ]), + FieldElement.fromList([ + 28881845, + 14381568, + 9657904, + 3680757, + -20181635, + 7843316, + -31400660, + 1370708, + 29794553, + -1409300 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14499471, + -2729599, + -33191113, + -4254652, + 28494862, + 14271267, + 30290735, + 10876454, + -33154098, + 2381726 + ]), + FieldElement.fromList([ + -7195431, + -2655363, + -14730155, + 462251, + -27724326, + 3941372, + -6236617, + 3696005, + -32300832, + 15351955 + ]), + FieldElement.fromList([ + 27431194, + 8222322, + 16448760, + -3907995, + -18707002, + 11938355, + -32961401, + -2970515, + 29551813, + 10109425 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -13657040, + -13155431, + -31283750, + 11777098, + 21447386, + 6519384, + -2378284, + -1627556, + 10092783, + -4764171 + ]), + FieldElement.fromList([ + 27939166, + 14210322, + 4677035, + 16277044, + -22964462, + -12398139, + -32508754, + 12005538, + -17810127, + 12803510 + ]), + FieldElement.fromList([ + 17228999, + -15661624, + -1233527, + 300140, + -1224870, + -11714777, + 30364213, + -9038194, + 18016357, + 4397660 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -10958843, + -7690207, + 4776341, + -14954238, + 27850028, + -15602212, + -26619106, + 14544525, + -17477504, + 982639 + ]), + FieldElement.fromList([ + 29253598, + 15796703, + -2863982, + -9908884, + 10057023, + 3163536, + 7332899, + -4120128, + -21047696, + 9934963 + ]), + FieldElement.fromList([ + 5793303, + 16271923, + -24131614, + -10116404, + 29188560, + 1206517, + -14747930, + 4559895, + -30123922, + -10897950 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -27643952, + -11493006, + 16282657, + -11036493, + 28414021, + -15012264, + 24191034, + 4541697, + -13338309, + 5500568 + ]), + FieldElement.fromList([ + 12650548, + -1497113, + 9052871, + 11355358, + -17680037, + -8400164, + -17430592, + 12264343, + 10874051, + 13524335 + ]), + FieldElement.fromList([ + 25556948, + -3045990, + 714651, + 2510400, + 23394682, + -10415330, + 33119038, + 5080568, + -22528059, + 5376628 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -26088264, + -4011052, + -17013699, + -3537628, + -6726793, + 1920897, + -22321305, + -9447443, + 4535768, + 1569007 + ]), + FieldElement.fromList([ + -2255422, + 14606630, + -21692440, + -8039818, + 28430649, + 8775819, + -30494562, + 3044290, + 31848280, + 12543772 + ]), + FieldElement.fromList([ + -22028579, + 2943893, + -31857513, + 6777306, + 13784462, + -4292203, + -27377195, + -2062731, + 7718482, + 14474653 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 2385315, + 2454213, + -22631320, + 46603, + -4437935, + -15680415, + 656965, + -7236665, + 24316168, + -5253567 + ]), + FieldElement.fromList([ + 13741529, + 10911568, + -33233417, + -8603737, + -20177830, + -1033297, + 33040651, + -13424532, + -20729456, + 8321686 + ]), + FieldElement.fromList([ + 21060490, + -2212744, + 15712757, + -4336099, + 1639040, + 10656336, + 23845965, + -11874838, + -9984458, + 608372 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -13672732, + -15087586, + -10889693, + -7557059, + -6036909, + 11305547, + 1123968, + -6780577, + 27229399, + 23887 + ]), + FieldElement.fromList([ + -23244140, + -294205, + -11744728, + 14712571, + -29465699, + -2029617, + 12797024, + -6440308, + -1633405, + 16678954 + ]), + FieldElement.fromList([ + -29500620, + 4770662, + -16054387, + 14001338, + 7830047, + 9564805, + -1508144, + -4795045, + -17169265, + 4904953 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 24059557, + 14617003, + 19037157, + -15039908, + 19766093, + -14906429, + 5169211, + 16191880, + 2128236, + -4326833 + ]), + FieldElement.fromList([ + -16981152, + 4124966, + -8540610, + -10653797, + 30336522, + -14105247, + -29806336, + 916033, + -6882542, + -2986532 + ]), + FieldElement.fromList([ + -22630907, + 12419372, + -7134229, + -7473371, + -16478904, + 16739175, + 285431, + 2763829, + 15736322, + 4143876 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 2379352, + 11839345, + -4110402, + -5988665, + 11274298, + 794957, + 212801, + -14594663, + 23527084, + -16458268 + ]), + FieldElement.fromList([ + 33431127, + -11130478, + -17838966, + -15626900, + 8909499, + 8376530, + -32625340, + 4087881, + -15188911, + -14416214 + ]), + FieldElement.fromList([ + 1767683, + 7197987, + -13205226, + -2022635, + -13091350, + 448826, + 5799055, + 4357868, + -4774191, + -16323038 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 6721966, + 13833823, + -23523388, + -1551314, + 26354293, + -11863321, + 23365147, + -3949732, + 7390890, + 2759800 + ]), + FieldElement.fromList([ + 4409041, + 2052381, + 23373853, + 10530217, + 7676779, + -12885954, + 21302353, + -4264057, + 1244380, + -12919645 + ]), + FieldElement.fromList([ + -4421239, + 7169619, + 4982368, + -2957590, + 30256825, + -2777540, + 14086413, + 9208236, + 15886429, + 16489664 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 1996075, + 10375649, + 14346367, + 13311202, + -6874135, + -16438411, + -13693198, + 398369, + -30606455, + -712933 + ]), + FieldElement.fromList([ + -25307465, + 9795880, + -2777414, + 14878809, + -33531835, + 14780363, + 13348553, + 12076947, + -30836462, + 5113182 + ]), + FieldElement.fromList([ + -17770784, + 11797796, + 31950843, + 13929123, + -25888302, + 12288344, + -30341101, + -7336386, + 13847711, + 5387222 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -18582163, + -3416217, + 17824843, + -2340966, + 22744343, + -10442611, + 8763061, + 3617786, + -19600662, + 10370991 + ]), + FieldElement.fromList([ + 20246567, + -14369378, + 22358229, + -543712, + 18507283, + -10413996, + 14554437, + -8746092, + 32232924, + 16763880 + ]), + FieldElement.fromList([ + 9648505, + 10094563, + 26416693, + 14745928, + -30374318, + -6472621, + 11094161, + 15689506, + 3140038, + -16510092 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -16160072, + 5472695, + 31895588, + 4744994, + 8823515, + 10365685, + -27224800, + 9448613, + -28774454, + 366295 + ]), + FieldElement.fromList([ + 19153450, + 11523972, + -11096490, + -6503142, + -24647631, + 5420647, + 28344573, + 8041113, + 719605, + 11671788 + ]), + FieldElement.fromList([ + 8678025, + 2694440, + -6808014, + 2517372, + 4964326, + 11152271, + -15432916, + -15266516, + 27000813, + -10195553 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -15157904, + 7134312, + 8639287, + -2814877, + -7235688, + 10421742, + 564065, + 5336097, + 6750977, + -14521026 + ]), + FieldElement.fromList([ + 11836410, + -3979488, + 26297894, + 16080799, + 23455045, + 15735944, + 1695823, + -8819122, + 8169720, + 16220347 + ]), + FieldElement.fromList([ + -18115838, + 8653647, + 17578566, + -6092619, + -8025777, + -16012763, + -11144307, + -2627664, + -5990708, + -14166033 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23308498, + -10968312, + 15213228, + -10081214, + -30853605, + -11050004, + 27884329, + 2847284, + 2655861, + 1738395 + ]), + FieldElement.fromList([ + -27537433, + -14253021, + -25336301, + -8002780, + -9370762, + 8129821, + 21651608, + -3239336, + -19087449, + -11005278 + ]), + FieldElement.fromList([ + 1533110, + 3437855, + 23735889, + 459276, + 29970501, + 11335377, + 26030092, + 5821408, + 10478196, + 8544890 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 32173121, + -16129311, + 24896207, + 3921497, + 22579056, + -3410854, + 19270449, + 12217473, + 17789017, + -3395995 + ]), + FieldElement.fromList([ + -30552961, + -2228401, + -15578829, + -10147201, + 13243889, + 517024, + 15479401, + -3853233, + 30460520, + 1052596 + ]), + FieldElement.fromList([ + -11614875, + 13323618, + 32618793, + 8175907, + -15230173, + 12596687, + 27491595, + -4612359, + 3179268, + -9478891 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31947069, + -14366651, + -4640583, + -15339921, + -15125977, + -6039709, + -14756777, + -16411740, + 19072640, + -9511060 + ]), + FieldElement.fromList([ + 11685058, + 11822410, + 3158003, + -13952594, + 33402194, + -4165066, + 5977896, + -5215017, + 473099, + 5040608 + ]), + FieldElement.fromList([ + -20290863, + 8198642, + -27410132, + 11602123, + 1290375, + -2799760, + 28326862, + 1721092, + -19558642, + -3131606 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 7881532, + 10687937, + 7578723, + 7738378, + -18951012, + -2553952, + 21820786, + 8076149, + -27868496, + 11538389 + ]), + FieldElement.fromList([ + -19935666, + 3899861, + 18283497, + -6801568, + -15728660, + -11249211, + 8754525, + 7446702, + -5676054, + 5797016 + ]), + FieldElement.fromList([ + -11295600, + -3793569, + -15782110, + -7964573, + 12708869, + -8456199, + 2014099, + -9050574, + -2369172, + -5877341 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -22472376, + -11568741, + -27682020, + 1146375, + 18956691, + 16640559, + 1192730, + -3714199, + 15123619, + 10811505 + ]), + FieldElement.fromList([ + 14352098, + -3419715, + -18942044, + 10822655, + 32750596, + 4699007, + -70363, + 15776356, + -28886779, + -11974553 + ]), + FieldElement.fromList([ + -28241164, + -8072475, + -4978962, + -5315317, + 29416931, + 1847569, + -20654173, + -16484855, + 4714547, + -9600655 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15200332, + 8368572, + 19679101, + 15970074, + -31872674, + 1959451, + 24611599, + -4543832, + -11745876, + 12340220 + ]), + FieldElement.fromList([ + 12876937, + -10480056, + 33134381, + 6590940, + -6307776, + 14872440, + 9613953, + 8241152, + 15370987, + 9608631 + ]), + FieldElement.fromList([ + -4143277, + -12014408, + 8446281, + -391603, + 4407738, + 13629032, + -7724868, + 15866074, + -28210621, + -8814099 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 26660628, + -15677655, + 8393734, + 358047, + -7401291, + 992988, + -23904233, + 858697, + 20571223, + 8420556 + ]), + FieldElement.fromList([ + 14620715, + 13067227, + -15447274, + 8264467, + 14106269, + 15080814, + 33531827, + 12516406, + -21574435, + -12476749 + ]), + FieldElement.fromList([ + 236881, + 10476226, + 57258, + -14677024, + 6472998, + 2466984, + 17258519, + 7256740, + 8791136, + 15069930 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 1276410, + -9371918, + 22949635, + -16322807, + -23493039, + -5702186, + 14711875, + 4874229, + -30663140, + -2331391 + ]), + FieldElement.fromList([ + 5855666, + 4990204, + -13711848, + 7294284, + -7804282, + 1924647, + -1423175, + -7912378, + -33069337, + 9234253 + ]), + FieldElement.fromList([ + 20590503, + -9018988, + 31529744, + -7352666, + -2706834, + 10650548, + 31559055, + -11609587, + 18979186, + 13396066 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 24474287, + 4968103, + 22267082, + 4407354, + 24063882, + -8325180, + -18816887, + 13594782, + 33514650, + 7021958 + ]), + FieldElement.fromList([ + -11566906, + -6565505, + -21365085, + 15928892, + -26158305, + 4315421, + -25948728, + -3916677, + -21480480, + 12868082 + ]), + FieldElement.fromList([ + -28635013, + 13504661, + 19988037, + -2132761, + 21078225, + 6443208, + -21446107, + 2244500, + -12455797, + -8089383 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -30595528, + 13793479, + -5852820, + 319136, + -25723172, + -6263899, + 33086546, + 8957937, + -15233648, + 5540521 + ]), + FieldElement.fromList([ + -11630176, + -11503902, + -8119500, + -7643073, + 2620056, + 1022908, + -23710744, + -1568984, + -16128528, + -14962807 + ]), + FieldElement.fromList([ + 23152971, + 775386, + 27395463, + 14006635, + -9701118, + 4649512, + 1689819, + 892185, + -11513277, + -15205948 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9770129, + 9586738, + 26496094, + 4324120, + 1556511, + -3550024, + 27453819, + 4763127, + -19179614, + 5867134 + ]), + FieldElement.fromList([ + -32765025, + 1927590, + 31726409, + -4753295, + 23962434, + -16019500, + 27846559, + 5931263, + -29749703, + -16108455 + ]), + FieldElement.fromList([ + 27461885, + -2977536, + 22380810, + 1815854, + -23033753, + -3031938, + 7283490, + -15148073, + -19526700, + 7734629 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -8010264, + -9590817, + -11120403, + 6196038, + 29344158, + -13430885, + 7585295, + -3176626, + 18549497, + 15302069 + ]), + FieldElement.fromList([ + -32658337, + -6171222, + -7672793, + -11051681, + 6258878, + 13504381, + 10458790, + -6418461, + -8872242, + 8424746 + ]), + FieldElement.fromList([ + 24687205, + 8613276, + -30667046, + -3233545, + 1863892, + -1830544, + 19206234, + 7134917, + -11284482, + -828919 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11334899, + -9218022, + 8025293, + 12707519, + 17523892, + -10476071, + 10243738, + -14685461, + -5066034, + 16498837 + ]), + FieldElement.fromList([ + 8911542, + 6887158, + -9584260, + -6958590, + 11145641, + -9543680, + 17303925, + -14124238, + 6536641, + 10543906 + ]), + FieldElement.fromList([ + -28946384, + 15479763, + -17466835, + 568876, + -1497683, + 11223454, + -2669190, + -16625574, + -27235709, + 8876771 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25742899, + -12566864, + -15649966, + -846607, + -33026686, + -796288, + -33481822, + 15824474, + -604426, + -9039817 + ]), + FieldElement.fromList([ + 10330056, + 70051, + 7957388, + -9002667, + 9764902, + 15609756, + 27698697, + -4890037, + 1657394, + 3084098 + ]), + FieldElement.fromList([ + 10477963, + -7470260, + 12119566, + -13250805, + 29016247, + -5365589, + 31280319, + 14396151, + -30233575, + 15272409 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12288309, + 3169463, + 28813183, + 16658753, + 25116432, + -5630466, + -25173957, + -12636138, + -25014757, + 1950504 + ]), + FieldElement.fromList([ + -26180358, + 9489187, + 11053416, + -14746161, + -31053720, + 5825630, + -8384306, + -8767532, + 15341279, + 8373727 + ]), + FieldElement.fromList([ + 28685821, + 7759505, + -14378516, + -12002860, + -31971820, + 4079242, + 298136, + -10232602, + -2878207, + 15190420 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -32932876, + 13806336, + -14337485, + -15794431, + -24004620, + 10940928, + 8669718, + 2742393, + -26033313, + -6875003 + ]), + FieldElement.fromList([ + -1580388, + -11729417, + -25979658, + -11445023, + -17411874, + -10912854, + 9291594, + -16247779, + -12154742, + 6048605 + ]), + FieldElement.fromList([ + -30305315, + 14843444, + 1539301, + 11864366, + 20201677, + 1900163, + 13934231, + 5128323, + 11213262, + 9168384 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -26280513, + 11007847, + 19408960, + -940758, + -18592965, + -4328580, + -5088060, + -11105150, + 20470157, + -16398701 + ]), + FieldElement.fromList([ + -23136053, + 9282192, + 14855179, + -15390078, + -7362815, + -14408560, + -22783952, + 14461608, + 14042978, + 5230683 + ]), + FieldElement.fromList([ + 29969567, + -2741594, + -16711867, + -8552442, + 9175486, + -2468974, + 21556951, + 3506042, + -5933891, + -12449708 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -3144746, + 8744661, + 19704003, + 4581278, + -20430686, + 6830683, + -21284170, + 8971513, + -28539189, + 15326563 + ]), + FieldElement.fromList([ + -19464629, + 10110288, + -17262528, + -3503892, + -23500387, + 1355669, + -15523050, + 15300988, + -20514118, + 9168260 + ]), + FieldElement.fromList([ + -5353335, + 4488613, + -23803248, + 16314347, + 7780487, + -15638939, + -28948358, + 9601605, + 33087103, + -9011387 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -19443170, + -15512900, + -20797467, + -12445323, + -29824447, + 10229461, + -27444329, + -15000531, + -5996870, + 15664672 + ]), + FieldElement.fromList([ + 23294591, + -16632613, + -22650781, + -8470978, + 27844204, + 11461195, + 13099750, + -2460356, + 18151676, + 13417686 + ]), + FieldElement.fromList([ + -24722913, + -4176517, + -31150679, + 5988919, + -26858785, + 6685065, + 1661597, + -12551441, + 15271676, + -15452665 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11433042, + -13228665, + 8239631, + -5279517, + -1985436, + -725718, + -18698764, + 2167544, + -6921301, + -13440182 + ]), + FieldElement.fromList([ + -31436171, + 15575146, + 30436815, + 12192228, + -22463353, + 9395379, + -9917708, + -8638997, + 12215110, + 12028277 + ]), + FieldElement.fromList([ + 14098400, + 6555944, + 23007258, + 5757252, + -15427832, + -12950502, + 30123440, + 4617780, + -16900089, + -655628 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4026201, + -15240835, + 11893168, + 13718664, + -14809462, + 1847385, + -15819999, + 10154009, + 23973261, + -12684474 + ]), + FieldElement.fromList([ + -26531820, + -3695990, + -1908898, + 2534301, + -31870557, + -16550355, + 18341390, + -11419951, + 32013174, + -10103539 + ]), + FieldElement.fromList([ + -25479301, + 10876443, + -11771086, + -14625140, + -12369567, + 1838104, + 21911214, + 6354752, + 4425632, + -837822 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -10433389, + -14612966, + 22229858, + -3091047, + -13191166, + 776729, + -17415375, + -12020462, + 4725005, + 14044970 + ]), + FieldElement.fromList([ + 19268650, + -7304421, + 1555349, + 8692754, + -21474059, + -9910664, + 6347390, + -1411784, + -19522291, + -16109756 + ]), + FieldElement.fromList([ + -24864089, + 12986008, + -10898878, + -5558584, + -11312371, + -148526, + 19541418, + 8180106, + 9282262, + 10282508 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -26205082, + 4428547, + -8661196, + -13194263, + 4098402, + -14165257, + 15522535, + 8372215, + 5542595, + -10702683 + ]), + FieldElement.fromList([ + -10562541, + 14895633, + 26814552, + -16673850, + -17480754, + -2489360, + -2781891, + 6993761, + -18093885, + 10114655 + ]), + FieldElement.fromList([ + -20107055, + -929418, + 31422704, + 10427861, + -7110749, + 6150669, + -29091755, + -11529146, + 25953725, + -106158 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4234397, + -8039292, + -9119125, + 3046000, + 2101609, + -12607294, + 19390020, + 6094296, + -3315279, + 12831125 + ]), + FieldElement.fromList([ + -15998678, + 7578152, + 5310217, + 14408357, + -33548620, + -224739, + 31575954, + 6326196, + 7381791, + -2421839 + ]), + FieldElement.fromList([ + -20902779, + 3296811, + 24736065, + -16328389, + 18374254, + 7318640, + 6295303, + 8082724, + -15362489, + 12339664 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 27724736, + 2291157, + 6088201, + -14184798, + 1792727, + 5857634, + 13848414, + 15768922, + 25091167, + 14856294 + ]), + FieldElement.fromList([ + -18866652, + 8331043, + 24373479, + 8541013, + -701998, + -9269457, + 12927300, + -12695493, + -22182473, + -9012899 + ]), + FieldElement.fromList([ + -11423429, + -5421590, + 11632845, + 3405020, + 30536730, + -11674039, + -27260765, + 13866390, + 30146206, + 9142070 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 3924129, + -15307516, + -13817122, + -10054960, + 12291820, + -668366, + -27702774, + 9326384, + -8237858, + 4171294 + ]), + FieldElement.fromList([ + -15921940, + 16037937, + 6713787, + 16606682, + -21612135, + 2790944, + 26396185, + 3731949, + 345228, + -5462949 + ]), + FieldElement.fromList([ + -21327538, + 13448259, + 25284571, + 1143661, + 20614966, + -8849387, + 2031539, + -12391231, + -16253183, + -13582083 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31016211, + -16722429, + 26371392, + -14451233, + -5027349, + 14854137, + 17477601, + 3842657, + 28012650, + -16405420 + ]), + FieldElement.fromList([ + -5075835, + 9368966, + -8562079, + -4600902, + -15249953, + 6970560, + -9189873, + 16292057, + -8867157, + 3507940 + ]), + FieldElement.fromList([ + 29439664, + 3537914, + 23333589, + 6997794, + -17555561, + -11018068, + -15209202, + -15051267, + -9164929, + 6580396 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12185861, + -7679788, + 16438269, + 10826160, + -8696817, + -6235611, + 17860444, + -9273846, + -2095802, + 9304567 + ]), + FieldElement.fromList([ + 20714564, + -4336911, + 29088195, + 7406487, + 11426967, + -5095705, + 14792667, + -14608617, + 5289421, + -477127 + ]), + FieldElement.fromList([ + -16665533, + -10650790, + -6160345, + -13305760, + 9192020, + -1802462, + 17271490, + 12349094, + 26939669, + -3752294 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12889898, + 9373458, + 31595848, + 16374215, + 21471720, + 13221525, + -27283495, + -12348559, + -3698806, + 117887 + ]), + FieldElement.fromList([ + 22263325, + -6560050, + 3984570, + -11174646, + -15114008, + -566785, + 28311253, + 5358056, + -23319780, + 541964 + ]), + FieldElement.fromList([ + 16259219, + 3261970, + 2309254, + -15534474, + -16885711, + -4581916, + 24134070, + -16705829, + -13337066, + -13552195 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9378160, + -13140186, + -22845982, + -12745264, + 28198281, + -7244098, + -2399684, + -717351, + 690426, + 14876244 + ]), + FieldElement.fromList([ + 24977353, + -314384, + -8223969, + -13465086, + 28432343, + -1176353, + -13068804, + -12297348, + -22380984, + 6618999 + ]), + FieldElement.fromList([ + -1538174, + 11685646, + 12944378, + 13682314, + -24389511, + -14413193, + 8044829, + -13817328, + 32239829, + -5652762 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -18603066, + 4762990, + -926250, + 8885304, + -28412480, + -3187315, + 9781647, + -10350059, + 32779359, + 5095274 + ]), + FieldElement.fromList([ + -33008130, + -5214506, + -32264887, + -3685216, + 9460461, + -9327423, + -24601656, + 14506724, + 21639561, + -2630236 + ]), + FieldElement.fromList([ + -16400943, + -13112215, + 25239338, + 15531969, + 3987758, + -4499318, + -1289502, + -6863535, + 17874574, + 558605 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -13600129, + 10240081, + 9171883, + 16131053, + -20869254, + 9599700, + 33499487, + 5080151, + 2085892, + 5119761 + ]), + FieldElement.fromList([ + -22205145, + -2519528, + -16381601, + 414691, + -25019550, + 2170430, + 30634760, + -8363614, + -31999993, + -5759884 + ]), + FieldElement.fromList([ + -6845704, + 15791202, + 8550074, + -1312654, + 29928809, + -12092256, + 27534430, + -7192145, + -22351378, + 12961482 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -24492060, + -9570771, + 10368194, + 11582341, + -23397293, + -2245287, + 16533930, + 8206996, + -30194652, + -5159638 + ]), + FieldElement.fromList([ + -11121496, + -3382234, + 2307366, + 6362031, + -135455, + 8868177, + -16835630, + 7031275, + 7589640, + 8945490 + ]), + FieldElement.fromList([ + -32152748, + 8917967, + 6661220, + -11677616, + -1192060, + -15793393, + 7251489, + -11182180, + 24099109, + -14456170 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5019558, + -7907470, + 4244127, + -14714356, + -26933272, + 6453165, + -19118182, + -13289025, + -6231896, + -10280736 + ]), + FieldElement.fromList([ + 10853594, + 10721687, + 26480089, + 5861829, + -22995819, + 1972175, + -1866647, + -10557898, + -3363451, + -6441124 + ]), + FieldElement.fromList([ + -17002408, + 5906790, + 221599, + -6563147, + 7828208, + -13248918, + 24362661, + -2008168, + -13866408, + 7421392 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 8139927, + -6546497, + 32257646, + -5890546, + 30375719, + 1886181, + -21175108, + 15441252, + 28826358, + -4123029 + ]), + FieldElement.fromList([ + 6267086, + 9695052, + 7709135, + -16603597, + -32869068, + -1886135, + 14795160, + -7840124, + 13746021, + -1742048 + ]), + FieldElement.fromList([ + 28584902, + 7787108, + -6732942, + -15050729, + 22846041, + -7571236, + -3181936, + -363524, + 4771362, + -8419958 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 24949256, + 6376279, + -27466481, + -8174608, + -18646154, + -9930606, + 33543569, + -12141695, + 3569627, + 11342593 + ]), + FieldElement.fromList([ + 26514989, + 4740088, + 27912651, + 3697550, + 19331575, + -11472339, + 6809886, + 4608608, + 7325975, + -14801071 + ]), + FieldElement.fromList([ + -11618399, + -14554430, + -24321212, + 7655128, + -1369274, + 5214312, + -27400540, + 10258390, + -17646694, + -8186692 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11431204, + 15823007, + 26570245, + 14329124, + 18029990, + 4796082, + -31446179, + 15580664, + 9280358, + -3973687 + ]), + FieldElement.fromList([ + -160783, + -10326257, + -22855316, + -4304997, + -20861367, + -13621002, + -32810901, + -11181622, + -15545091, + 4387441 + ]), + FieldElement.fromList([ + -20799378, + 12194512, + 3937617, + -5805892, + -27154820, + 9340370, + -24513992, + 8548137, + 20617071, + -7482001 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -938825, + -3930586, + -8714311, + 16124718, + 24603125, + -6225393, + -13775352, + -11875822, + 24345683, + 10325460 + ]), + FieldElement.fromList([ + -19855277, + -1568885, + -22202708, + 8714034, + 14007766, + 6928528, + 16318175, + -1010689, + 4766743, + 3552007 + ]), + FieldElement.fromList([ + -21751364, + -16730916, + 1351763, + -803421, + -4009670, + 3950935, + 3217514, + 14481909, + 10988822, + -3994762 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15564307, + -14311570, + 3101243, + 5684148, + 30446780, + -8051356, + 12677127, + -6505343, + -8295852, + 13296005 + ]), + FieldElement.fromList([ + -9442290, + 6624296, + -30298964, + -11913677, + -4670981, + -2057379, + 31521204, + 9614054, + -30000824, + 12074674 + ]), + FieldElement.fromList([ + 4771191, + -135239, + 14290749, + -13089852, + 27992298, + 14998318, + -1413936, + -1556716, + 29832613, + -16391035 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 7064884, + -7541174, + -19161962, + -5067537, + -18891269, + -2912736, + 25825242, + 5293297, + -27122660, + 13101590 + ]), + FieldElement.fromList([ + -2298563, + 2439670, + -7466610, + 1719965, + -27267541, + -16328445, + 32512469, + -5317593, + -30356070, + -4190957 + ]), + FieldElement.fromList([ + -30006540, + 10162316, + -33180176, + 3981723, + -16482138, + -13070044, + 14413974, + 9515896, + 19568978, + 9628812 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 33053803, + 199357, + 15894591, + 1583059, + 27380243, + -4580435, + -17838894, + -6106839, + -6291786, + 3437740 + ]), + FieldElement.fromList([ + -18978877, + 3884493, + 19469877, + 12726490, + 15913552, + 13614290, + -22961733, + 70104, + 7463304, + 4176122 + ]), + FieldElement.fromList([ + -27124001, + 10659917, + 11482427, + -16070381, + 12771467, + -6635117, + -32719404, + -5322751, + 24216882, + 5944158 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 8894125, + 7450974, + -2664149, + -9765752, + -28080517, + -12389115, + 19345746, + 14680796, + 11632993, + 5847885 + ]), + FieldElement.fromList([ + 26942781, + -2315317, + 9129564, + -4906607, + 26024105, + 11769399, + -11518837, + 6367194, + -9727230, + 4782140 + ]), + FieldElement.fromList([ + 19916461, + -4828410, + -22910704, + -11414391, + 25606324, + -5972441, + 33253853, + 8220911, + 6358847, + -1873857 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 801428, + -2081702, + 16569428, + 11065167, + 29875704, + 96627, + 7908388, + -4480480, + -13538503, + 1387155 + ]), + FieldElement.fromList([ + 19646058, + 5720633, + -11416706, + 12814209, + 11607948, + 12749789, + 14147075, + 15156355, + -21866831, + 11835260 + ]), + FieldElement.fromList([ + 19299512, + 1155910, + 28703737, + 14890794, + 2925026, + 7269399, + 26121523, + 15467869, + -26560550, + 5052483 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -3017432, + 10058206, + 1980837, + 3964243, + 22160966, + 12322533, + -6431123, + -12618185, + 12228557, + -7003677 + ]), + FieldElement.fromList([ + 32944382, + 14922211, + -22844894, + 5188528, + 21913450, + -8719943, + 4001465, + 13238564, + -6114803, + 8653815 + ]), + FieldElement.fromList([ + 22865569, + -4652735, + 27603668, + -12545395, + 14348958, + 8234005, + 24808405, + 5719875, + 28483275, + 2841751 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -16420968, + -1113305, + -327719, + -12107856, + 21886282, + -15552774, + -1887966, + -315658, + 19932058, + -12739203 + ]), + FieldElement.fromList([ + -11656086, + 10087521, + -8864888, + -5536143, + -19278573, + -3055912, + 3999228, + 13239134, + -4777469, + -13910208 + ]), + FieldElement.fromList([ + 1382174, + -11694719, + 17266790, + 9194690, + -13324356, + 9720081, + 20403944, + 11284705, + -14013818, + 3093230 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16650921, + -11037932, + -1064178, + 1570629, + -8329746, + 7352753, + -302424, + 16271225, + -24049421, + -6691850 + ]), + FieldElement.fromList([ + -21911077, + -5927941, + -4611316, + -5560156, + -31744103, + -10785293, + 24123614, + 15193618, + -21652117, + -16739389 + ]), + FieldElement.fromList([ + -9935934, + -4289447, + -25279823, + 4372842, + 2087473, + 10399484, + 31870908, + 14690798, + 17361620, + 11864968 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -11307610, + 6210372, + 13206574, + 5806320, + -29017692, + -13967200, + -12331205, + -7486601, + -25578460, + -16240689 + ]), + FieldElement.fromList([ + 14668462, + -12270235, + 26039039, + 15305210, + 25515617, + 4542480, + 10453892, + 6577524, + 9145645, + -6443880 + ]), + FieldElement.fromList([ + 5974874, + 3053895, + -9433049, + -10385191, + -31865124, + 3225009, + -7972642, + 3936128, + -5652273, + -3050304 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30625386, + -4729400, + -25555961, + -12792866, + -20484575, + 7695099, + 17097188, + -16303496, + -27999779, + 1803632 + ]), + FieldElement.fromList([ + -3553091, + 9865099, + -5228566, + 4272701, + -5673832, + -16689700, + 14911344, + 12196514, + -21405489, + 7047412 + ]), + FieldElement.fromList([ + 20093277, + 9920966, + -11138194, + -5343857, + 13161587, + 12044805, + -32856851, + 4124601, + -32343828, + -10257566 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -20788824, + 14084654, + -13531713, + 7842147, + 19119038, + -13822605, + 4752377, + -8714640, + -21679658, + 2288038 + ]), + FieldElement.fromList([ + -26819236, + -3283715, + 29965059, + 3039786, + -14473765, + 2540457, + 29457502, + 14625692, + -24819617, + 12570232 + ]), + FieldElement.fromList([ + -1063558, + -11551823, + 16920318, + 12494842, + 1278292, + -5869109, + -21159943, + -3498680, + -11974704, + 4724943 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 17960970, + -11775534, + -4140968, + -9702530, + -8876562, + -1410617, + -12907383, + -8659932, + -29576300, + 1903856 + ]), + FieldElement.fromList([ + 23134274, + -14279132, + -10681997, + -1611936, + 20684485, + 15770816, + -12989750, + 3190296, + 26955097, + 14109738 + ]), + FieldElement.fromList([ + 15308788, + 5320727, + -30113809, + -14318877, + 22902008, + 7767164, + 29425325, + -11277562, + 31960942, + 11934971 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -27395711, + 8435796, + 4109644, + 12222639, + -24627868, + 14818669, + 20638173, + 4875028, + 10491392, + 1379718 + ]), + FieldElement.fromList([ + -13159415, + 9197841, + 3875503, + -8936108, + -1383712, + -5879801, + 33518459, + 16176658, + 21432314, + 12180697 + ]), + FieldElement.fromList([ + -11787308, + 11500838, + 13787581, + -13832590, + -22430679, + 10140205, + 1465425, + 12689540, + -10301319, + -13872883 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5414091, + -15386041, + -21007664, + 9643570, + 12834970, + 1186149, + -2622916, + -1342231, + 26128231, + 6032912 + ]), + FieldElement.fromList([ + -26337395, + -13766162, + 32496025, + -13653919, + 17847801, + -12669156, + 3604025, + 8316894, + -25875034, + -10437358 + ]), + FieldElement.fromList([ + 3296484, + 6223048, + 24680646, + -12246460, + -23052020, + 5903205, + -8862297, + -4639164, + 12376617, + 3188849 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 29190488, + -14659046, + 27549113, + -1183516, + 3520066, + -10697301, + 32049515, + -7309113, + -16109234, + -9852307 + ]), + FieldElement.fromList([ + -14744486, + -9309156, + 735818, + -598978, + -20407687, + -5057904, + 25246078, + -15795669, + 18640741, + -960977 + ]), + FieldElement.fromList([ + -6928835, + -16430795, + 10361374, + 5642961, + 4910474, + 12345252, + -31638386, + -494430, + 10530747, + 1053335 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -29265967, + -14186805, + -13538216, + -12117373, + -19457059, + -10655384, + -31462369, + -2948985, + 24018831, + 15026644 + ]), + FieldElement.fromList([ + -22592535, + -3145277, + -2289276, + 5953843, + -13440189, + 9425631, + 25310643, + 13003497, + -2314791, + -15145616 + ]), + FieldElement.fromList([ + -27419985, + -603321, + -8043984, + -1669117, + -26092265, + 13987819, + -27297622, + 187899, + -23166419, + -2531735 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -21744398, + -13810475, + 1844840, + 5021428, + -10434399, + -15911473, + 9716667, + 16266922, + -5070217, + 726099 + ]), + FieldElement.fromList([ + 29370922, + -6053998, + 7334071, + -15342259, + 9385287, + 2247707, + -13661962, + -4839461, + 30007388, + -15823341 + ]), + FieldElement.fromList([ + -936379, + 16086691, + 23751945, + -543318, + -1167538, + -5189036, + 9137109, + 730663, + 9835848, + 4555336 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23376435, + 1410446, + -22253753, + -12899614, + 30867635, + 15826977, + 17693930, + 544696, + -11985298, + 12422646 + ]), + FieldElement.fromList([ + 31117226, + -12215734, + -13502838, + 6561947, + -9876867, + -12757670, + -5118685, + -4096706, + 29120153, + 13924425 + ]), + FieldElement.fromList([ + -17400879, + -14233209, + 19675799, + -2734756, + -11006962, + -5858820, + -9383939, + -11317700, + 7240931, + -237388 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -31361739, + -11346780, + -15007447, + -5856218, + -22453340, + -12152771, + 1222336, + 4389483, + 3293637, + -15551743 + ]), + FieldElement.fromList([ + -16684801, + -14444245, + 11038544, + 11054958, + -13801175, + -3338533, + -24319580, + 7733547, + 12796905, + -6335822 + ]), + FieldElement.fromList([ + -8759414, + -10817836, + -25418864, + 10783769, + -30615557, + -9746811, + -28253339, + 3647836, + 3222231, + -11160462 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 18606113, + 1693100, + -25448386, + -15170272, + 4112353, + 10045021, + 23603893, + -2048234, + -7550776, + 2484985 + ]), + FieldElement.fromList([ + 9255317, + -3131197, + -12156162, + -1004256, + 13098013, + -9214866, + 16377220, + -2102812, + -19802075, + -3034702 + ]), + FieldElement.fromList([ + -22729289, + 7496160, + -5742199, + 11329249, + 19991973, + -3347502, + -31718148, + 9936966, + -30097688, + -10618797 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 21878590, + -5001297, + 4338336, + 13643897, + -3036865, + 13160960, + 19708896, + 5415497, + -7360503, + -4109293 + ]), + FieldElement.fromList([ + 27736861, + 10103576, + 12500508, + 8502413, + -3413016, + -9633558, + 10436918, + -1550276, + -23659143, + -8132100 + ]), + FieldElement.fromList([ + 19492550, + -12104365, + -29681976, + -852630, + -3208171, + 12403437, + 30066266, + 8367329, + 13243957, + 8709688 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12015105, + 2801261, + 28198131, + 10151021, + 24818120, + -4743133, + -11194191, + -5645734, + 5150968, + 7274186 + ]), + FieldElement.fromList([ + 2831366, + -12492146, + 1478975, + 6122054, + 23825128, + -12733586, + 31097299, + 6083058, + 31021603, + -9793610 + ]), + FieldElement.fromList([ + -2529932, + -2229646, + 445613, + 10720828, + -13849527, + -11505937, + -23507731, + 16354465, + 15067285, + -14147707 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 7840942, + 14037873, + -33364863, + 15934016, + -728213, + -3642706, + 21403988, + 1057586, + -19379462, + -12403220 + ]), + FieldElement.fromList([ + 915865, + -16469274, + 15608285, + -8789130, + -24357026, + 6060030, + -17371319, + 8410997, + -7220461, + 16527025 + ]), + FieldElement.fromList([ + 32922597, + -556987, + 20336074, + -16184568, + 10903705, + -5384487, + 16957574, + 52992, + 23834301, + 6588044 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 32752030, + 11232950, + 3381995, + -8714866, + 22652988, + -10744103, + 17159699, + 16689107, + -20314580, + -1305992 + ]), + FieldElement.fromList([ + -4689649, + 9166776, + -25710296, + -10847306, + 11576752, + 12733943, + 7924251, + -2752281, + 1976123, + -7249027 + ]), + FieldElement.fromList([ + 21251222, + 16309901, + -2983015, + -6783122, + 30810597, + 12967303, + 156041, + -3371252, + 12331345, + -8237197 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 8651614, + -4477032, + -16085636, + -4996994, + 13002507, + 2950805, + 29054427, + -5106970, + 10008136, + -4667901 + ]), + FieldElement.fromList([ + 31486080, + 15114593, + -14261250, + 12951354, + 14369431, + -7387845, + 16347321, + -13662089, + 8684155, + -10532952 + ]), + FieldElement.fromList([ + 19443825, + 11385320, + 24468943, + -9659068, + -23919258, + 2187569, + -26263207, + -6086921, + 31316348, + 14219878 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28594490, + 1193785, + 32245219, + 11392485, + 31092169, + 15722801, + 27146014, + 6992409, + 29126555, + 9207390 + ]), + FieldElement.fromList([ + 32382935, + 1110093, + 18477781, + 11028262, + -27411763, + -7548111, + -4980517, + 10843782, + -7957600, + -14435730 + ]), + FieldElement.fromList([ + 2814918, + 7836403, + 27519878, + -7868156, + -20894015, + -11553689, + -21494559, + 8550130, + 28346258, + 1994730 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -19578299, + 8085545, + -14000519, + -3948622, + 2785838, + -16231307, + -19516951, + 7174894, + 22628102, + 8115180 + ]), + FieldElement.fromList([ + -30405132, + 955511, + -11133838, + -15078069, + -32447087, + -13278079, + -25651578, + 3317160, + -9943017, + 930272 + ]), + FieldElement.fromList([ + -15303681, + -6833769, + 28856490, + 1357446, + 23421993, + 1057177, + 24091212, + -1388970, + -22765376, + -10650715 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -22751231, + -5303997, + -12907607, + -12768866, + -15811511, + -7797053, + -14839018, + -16554220, + -1867018, + 8398970 + ]), + FieldElement.fromList([ + -31969310, + 2106403, + -4736360, + 1362501, + 12813763, + 16200670, + 22981545, + -6291273, + 18009408, + -15772772 + ]), + FieldElement.fromList([ + -17220923, + -9545221, + -27784654, + 14166835, + 29815394, + 7444469, + 29551787, + -3727419, + 19288549, + 1325865 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15100157, + -15835752, + -23923978, + -1005098, + -26450192, + 15509408, + 12376730, + -3479146, + 33166107, + -8042750 + ]), + FieldElement.fromList([ + 20909231, + 13023121, + -9209752, + 16251778, + -5778415, + -8094914, + 12412151, + 10018715, + 2213263, + -13878373 + ]), + FieldElement.fromList([ + 32529814, + -11074689, + 30361439, + -16689753, + -9135940, + 1513226, + 22922121, + 6382134, + -5766928, + 8371348 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9923462, + 11271500, + 12616794, + 3544722, + -29998368, + -1721626, + 12891687, + -8193132, + -26442943, + 10486144 + ]), + FieldElement.fromList([ + -22597207, + -7012665, + 8587003, + -8257861, + 4084309, + -12970062, + 361726, + 2610596, + -23921530, + -11455195 + ]), + FieldElement.fromList([ + 5408411, + -1136691, + -4969122, + 10561668, + 24145918, + 14240566, + 31319731, + -4235541, + 19985175, + -3436086 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -13994457, + 16616821, + 14549246, + 3341099, + 32155958, + 13648976, + -17577068, + 8849297, + 65030, + 8370684 + ]), + FieldElement.fromList([ + -8320926, + -12049626, + 31204563, + 5839400, + -20627288, + -1057277, + -19442942, + 6922164, + 12743482, + -9800518 + ]), + FieldElement.fromList([ + -2361371, + 12678785, + 28815050, + 4759974, + -23893047, + 4884717, + 23783145, + 11038569, + 18800704, + 255233 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -5269658, + -1773886, + 13957886, + 7990715, + 23132995, + 728773, + 13393847, + 9066957, + 19258688, + -14753793 + ]), + FieldElement.fromList([ + -2936654, + -10827535, + -10432089, + 14516793, + -3640786, + 4372541, + -31934921, + 2209390, + -1524053, + 2055794 + ]), + FieldElement.fromList([ + 580882, + 16705327, + 5468415, + -2683018, + -30926419, + -14696000, + -7203346, + -8994389, + -30021019, + 7394435 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 23838809, + 1822728, + -15738443, + 15242727, + 8318092, + -3733104, + -21672180, + -3492205, + -4821741, + 14799921 + ]), + FieldElement.fromList([ + 13345610, + 9759151, + 3371034, + -16137791, + 16353039, + 8577942, + 31129804, + 13496856, + -9056018, + 7402518 + ]), + FieldElement.fromList([ + 2286874, + -4435931, + -20042458, + -2008336, + -13696227, + 5038122, + 11006906, + -15760352, + 8205061, + 1607563 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14414086, + -8002132, + 3331830, + -3208217, + 22249151, + -5594188, + 18364661, + -2906958, + 30019587, + -9029278 + ]), + FieldElement.fromList([ + -27688051, + 1585953, + -10775053, + 931069, + -29120221, + -11002319, + -14410829, + 12029093, + 9944378, + 8024 + ]), + FieldElement.fromList([ + 4368715, + -3709630, + 29874200, + -15022983, + -20230386, + -11410704, + -16114594, + -999085, + -8142388, + 5640030 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10299610, + 13746483, + 11661824, + 16234854, + 7630238, + 5998374, + 9809887, + -16694564, + 15219798, + -14327783 + ]), + FieldElement.fromList([ + 27425505, + -5719081, + 3055006, + 10660664, + 23458024, + 595578, + -15398605, + -1173195, + -18342183, + 9742717 + ]), + FieldElement.fromList([ + 6744077, + 2427284, + 26042789, + 2720740, + -847906, + 1118974, + 32324614, + 7406442, + 12420155, + 1994844 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14012521, + -5024720, + -18384453, + -9578469, + -26485342, + -3936439, + -13033478, + -10909803, + 24319929, + -6446333 + ]), + FieldElement.fromList([ + 16412690, + -4507367, + 10772641, + 15929391, + -17068788, + -4658621, + 10555945, + -10484049, + -30102368, + -4739048 + ]), + FieldElement.fromList([ + 22397382, + -7767684, + -9293161, + -12792868, + 17166287, + -9755136, + -27333065, + 6199366, + 21880021, + -12250760 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4283307, + 5368523, + -31117018, + 8163389, + -30323063, + 3209128, + 16557151, + 8890729, + 8840445, + 4957760 + ]), + FieldElement.fromList([ + -15447727, + 709327, + -6919446, + -10870178, + -29777922, + 6522332, + -21720181, + 12130072, + -14796503, + 5005757 + ]), + FieldElement.fromList([ + -2114751, + -14308128, + 23019042, + 15765735, + -25269683, + 6002752, + 10183197, + -13239326, + -16395286, + -2176112 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -19025756, + 1632005, + 13466291, + -7995100, + -23640451, + 16573537, + -32013908, + -3057104, + 22208662, + 2000468 + ]), + FieldElement.fromList([ + 3065073, + -1412761, + -25598674, + -361432, + -17683065, + -5703415, + -8164212, + 11248527, + -3691214, + -7414184 + ]), + FieldElement.fromList([ + 10379208, + -6045554, + 8877319, + 1473647, + -29291284, + -12507580, + 16690915, + 2553332, + -3132688, + 16400289 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15716668, + 1254266, + -18472690, + 7446274, + -8448918, + 6344164, + -22097271, + -7285580, + 26894937, + 9132066 + ]), + FieldElement.fromList([ + 24158887, + 12938817, + 11085297, + -8177598, + -28063478, + -4457083, + -30576463, + 64452, + -6817084, + -2692882 + ]), + FieldElement.fromList([ + 13488534, + 7794716, + 22236231, + 5989356, + 25426474, + -12578208, + 2350710, + -3418511, + -4688006, + 2364226 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16335052, + 9132434, + 25640582, + 6678888, + 1725628, + 8517937, + -11807024, + -11697457, + 15445875, + -7798101 + ]), + FieldElement.fromList([ + 29004207, + -7867081, + 28661402, + -640412, + -12794003, + -7943086, + 31863255, + -4135540, + -278050, + -15759279 + ]), + FieldElement.fromList([ + -6122061, + -14866665, + -28614905, + 14569919, + -10857999, + -3591829, + 10343412, + -6976290, + -29828287, + -10815811 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 27081650, + 3463984, + 14099042, + -4517604, + 1616303, + -6205604, + 29542636, + 15372179, + 17293797, + 960709 + ]), + FieldElement.fromList([ + 20263915, + 11434237, + -5765435, + 11236810, + 13505955, + -10857102, + -16111345, + 6493122, + -19384511, + 7639714 + ]), + FieldElement.fromList([ + -2830798, + -14839232, + 25403038, + -8215196, + -8317012, + -16173699, + 18006287, + -16043750, + 29994677, + -15808121 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9769828, + 5202651, + -24157398, + -13631392, + -28051003, + -11561624, + -24613141, + -13860782, + -31184575, + 709464 + ]), + FieldElement.fromList([ + 12286395, + 13076066, + -21775189, + -1176622, + -25003198, + 4057652, + -32018128, + -8890874, + 16102007, + 13205847 + ]), + FieldElement.fromList([ + 13733362, + 5599946, + 10557076, + 3195751, + -5557991, + 8536970, + -25540170, + 8525972, + 10151379, + 10394400 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 4024660, + -16137551, + 22436262, + 12276534, + -9099015, + -2686099, + 19698229, + 11743039, + -33302334, + 8934414 + ]), + FieldElement.fromList([ + -15879800, + -4525240, + -8580747, + -2934061, + 14634845, + -698278, + -9449077, + 3137094, + -11536886, + 11721158 + ]), + FieldElement.fromList([ + 17555939, + -5013938, + 8268606, + 2331751, + -22738815, + 9761013, + 9319229, + 8835153, + -9205489, + -1280045 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -461409, + -7830014, + 20614118, + 16688288, + -7514766, + -4807119, + 22300304, + 505429, + 6108462, + -6183415 + ]), + FieldElement.fromList([ + -5070281, + 12367917, + -30663534, + 3234473, + 32617080, + -8422642, + 29880583, + -13483331, + -26898490, + -7867459 + ]), + FieldElement.fromList([ + -31975283, + 5726539, + 26934134, + 10237677, + -3173717, + -605053, + 24199304, + 3795095, + 7592688, + -14992079 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 21594432, + -14964228, + 17466408, + -4077222, + 32537084, + 2739898, + 6407723, + 12018833, + -28256052, + 4298412 + ]), + FieldElement.fromList([ + -20650503, + -11961496, + -27236275, + 570498, + 3767144, + -1717540, + 13891942, + -1569194, + 13717174, + 10805743 + ]), + FieldElement.fromList([ + -14676630, + -15644296, + 15287174, + 11927123, + 24177847, + -8175568, + -796431, + 14860609, + -26938930, + -5863836 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12962541, + 5311799, + -10060768, + 11658280, + 18855286, + -7954201, + 13286263, + -12808704, + -4381056, + 9882022 + ]), + FieldElement.fromList([ + 18512079, + 11319350, + -20123124, + 15090309, + 18818594, + 5271736, + -22727904, + 3666879, + -23967430, + -3299429 + ]), + FieldElement.fromList([ + -6789020, + -3146043, + 16192429, + 13241070, + 15898607, + -14206114, + -10084880, + -6661110, + -2403099, + 5276065 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30169808, + -5317648, + 26306206, + -11750859, + 27814964, + 7069267, + 7152851, + 3684982, + 1449224, + 13082861 + ]), + FieldElement.fromList([ + 10342826, + 3098505, + 2119311, + 193222, + 25702612, + 12233820, + 23697382, + 15056736, + -21016438, + -8202000 + ]), + FieldElement.fromList([ + -33150110, + 3261608, + 22745853, + 7948688, + 19370557, + -15177665, + -26171976, + 6482814, + -10300080, + -11060101 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 32869458, + -5408545, + 25609743, + 15678670, + -10687769, + -15471071, + 26112421, + 2521008, + -22664288, + 6904815 + ]), + FieldElement.fromList([ + 29506923, + 4457497, + 3377935, + -9796444, + -30510046, + 12935080, + 1561737, + 3841096, + -29003639, + -6657642 + ]), + FieldElement.fromList([ + 10340844, + -6630377, + -18656632, + -2278430, + 12621151, + -13339055, + 30878497, + -11824370, + -25584551, + 5181966 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 25940115, + -12658025, + 17324188, + -10307374, + -8671468, + 15029094, + 24396252, + -16450922, + -2322852, + -12388574 + ]), + FieldElement.fromList([ + -21765684, + 9916823, + -1300409, + 4079498, + -1028346, + 11909559, + 1782390, + 12641087, + 20603771, + -6561742 + ]), + FieldElement.fromList([ + -18882287, + -11673380, + 24849422, + 11501709, + 13161720, + -4768874, + 1925523, + 11914390, + 4662781, + 7820689 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12241050, + -425982, + 8132691, + 9393934, + 32846760, + -1599620, + 29749456, + 12172924, + 16136752, + 15264020 + ]), + FieldElement.fromList([ + -10349955, + -14680563, + -8211979, + 2330220, + -17662549, + -14545780, + 10658213, + 6671822, + 19012087, + 3772772 + ]), + FieldElement.fromList([ + 3753511, + -3421066, + 10617074, + 2028709, + 14841030, + -6721664, + 28718732, + -15762884, + 20527771, + 12988982 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -14822485, + -5797269, + -3707987, + 12689773, + -898983, + -10914866, + -24183046, + -10564943, + 3299665, + -12424953 + ]), + FieldElement.fromList([ + -16777703, + -15253301, + -9642417, + 4978983, + 3308785, + 8755439, + 6943197, + 6461331, + -25583147, + 8991218 + ]), + FieldElement.fromList([ + -17226263, + 1816362, + -1673288, + -6086439, + 31783888, + -8175991, + -32948145, + 7417950, + -30242287, + 1507265 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 29692663, + 6829891, + -10498800, + 4334896, + 20945975, + -11906496, + -28887608, + 8209391, + 14606362, + -10647073 + ]), + FieldElement.fromList([ + -3481570, + 8707081, + 32188102, + 5672294, + 22096700, + 1711240, + -33020695, + 9761487, + 4170404, + -2085325 + ]), + FieldElement.fromList([ + -11587470, + 14855945, + -4127778, + -1531857, + -26649089, + 15084046, + 22186522, + 16002000, + -14276837, + -8400798 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4811456, + 13761029, + -31703877, + -2483919, + -3312471, + 7869047, + -7113572, + -9620092, + 13240845, + 10965870 + ]), + FieldElement.fromList([ + -7742563, + -8256762, + -14768334, + -13656260, + -23232383, + 12387166, + 4498947, + 14147411, + 29514390, + 4302863 + ]), + FieldElement.fromList([ + -13413405, + -12407859, + 20757302, + -13801832, + 14785143, + 8976368, + -5061276, + -2144373, + 17846988, + -13971927 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -2244452, + -754728, + -4597030, + -1066309, + -6247172, + 1455299, + -21647728, + -9214789, + -5222701, + 12650267 + ]), + FieldElement.fromList([ + -9906797, + -16070310, + 21134160, + 12198166, + -27064575, + 708126, + 387813, + 13770293, + -19134326, + 10958663 + ]), + FieldElement.fromList([ + 22470984, + 12369526, + 23446014, + -5441109, + -21520802, + -9698723, + -11772496, + -11574455, + -25083830, + 4271862 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25169565, + -10053642, + -19909332, + 15361595, + -5984358, + 2159192, + 75375, + -4278529, + -32526221, + 8469673 + ]), + FieldElement.fromList([ + 15854970, + 4148314, + -8893890, + 7259002, + 11666551, + 13824734, + -30531198, + 2697372, + 24154791, + -9460943 + ]), + FieldElement.fromList([ + 15446137, + -15806644, + 29759747, + 14019369, + 30811221, + -9610191, + -31582008, + 12840104, + 24913809, + 9815020 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4709286, + -5614269, + -31841498, + -12288893, + -14443537, + 10799414, + -9103676, + 13438769, + 18735128, + 9466238 + ]), + FieldElement.fromList([ + 11933045, + 9281483, + 5081055, + -5183824, + -2628162, + -4905629, + -7727821, + -10896103, + -22728655, + 16199064 + ]), + FieldElement.fromList([ + 14576810, + 379472, + -26786533, + -8317236, + -29426508, + -10812974, + -102766, + 1876699, + 30801119, + 2164795 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15995086, + 3199873, + 13672555, + 13712240, + -19378835, + -4647646, + -13081610, + -15496269, + -13492807, + 1268052 + ]), + FieldElement.fromList([ + -10290614, + -3659039, + -3286592, + 10948818, + 23037027, + 3794475, + -3470338, + -12600221, + -17055369, + 3565904 + ]), + FieldElement.fromList([ + 29210088, + -9419337, + -5919792, + -4952785, + 10834811, + -13327726, + -16512102, + -10820713, + -27162222, + -14030531 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -13161890, + 15508588, + 16663704, + -8156150, + -28349942, + 9019123, + -29183421, + -3769423, + 2244111, + -14001979 + ]), + FieldElement.fromList([ + -5152875, + -3800936, + -9306475, + -6071583, + 16243069, + 14684434, + -25673088, + -16180800, + 13491506, + 4641841 + ]), + FieldElement.fromList([ + 10813417, + 643330, + -19188515, + -728916, + 30292062, + -16600078, + 27548447, + -7721242, + 14476989, + -12767431 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10292079, + 9984945, + 6481436, + 8279905, + -7251514, + 7032743, + 27282937, + -1644259, + -27912810, + 12651324 + ]), + FieldElement.fromList([ + -31185513, + -813383, + 22271204, + 11835308, + 10201545, + 15351028, + 17099662, + 3988035, + 21721536, + -3148940 + ]), + FieldElement.fromList([ + 10202177, + -6545839, + -31373232, + -9574638, + -32150642, + -8119683, + -12906320, + 3852694, + 13216206, + 14842320 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -15815640, + -10601066, + -6538952, + -7258995, + -6984659, + -6581778, + -31500847, + 13765824, + -27434397, + 9900184 + ]), + FieldElement.fromList([ + 14465505, + -13833331, + -32133984, + -14738873, + -27443187, + 12990492, + 33046193, + 15796406, + -7051866, + -8040114 + ]), + FieldElement.fromList([ + 30924417, + -8279620, + 6359016, + -12816335, + 16508377, + 9071735, + -25488601, + 15413635, + 9524356, + -7018878 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12274201, + -13175547, + 32627641, + -1785326, + 6736625, + 13267305, + 5237659, + -5109483, + 15663516, + 4035784 + ]), + FieldElement.fromList([ + -2951309, + 8903985, + 17349946, + 601635, + -16432815, + -4612556, + -13732739, + -15889334, + -22258478, + 4659091 + ]), + FieldElement.fromList([ + -16916263, + -4952973, + -30393711, + -15158821, + 20774812, + 15897498, + 5736189, + 15026997, + -2178256, + -13455585 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -8858980, + -2219056, + 28571666, + -10155518, + -474467, + -10105698, + -3801496, + 278095, + 23440562, + -290208 + ]), + FieldElement.fromList([ + 10226241, + -5928702, + 15139956, + 120818, + -14867693, + 5218603, + 32937275, + 11551483, + -16571960, + -7442864 + ]), + FieldElement.fromList([ + 17932739, + -12437276, + -24039557, + 10749060, + 11316803, + 7535897, + 22503767, + 5561594, + -3646624, + 3898661 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 7749907, + -969567, + -16339731, + -16464, + -25018111, + 15122143, + -1573531, + 7152530, + 21831162, + 1245233 + ]), + FieldElement.fromList([ + 26958459, + -14658026, + 4314586, + 8346991, + -5677764, + 11960072, + -32589295, + -620035, + -30402091, + -16716212 + ]), + FieldElement.fromList([ + -12165896, + 9166947, + 33491384, + 13673479, + 29787085, + 13096535, + 6280834, + 14587357, + -22338025, + 13987525 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -24349909, + 7778775, + 21116000, + 15572597, + -4833266, + -5357778, + -4300898, + -5124639, + -7469781, + -2858068 + ]), + FieldElement.fromList([ + 9681908, + -6737123, + -31951644, + 13591838, + -6883821, + 386950, + 31622781, + 6439245, + -14581012, + 4091397 + ]), + FieldElement.fromList([ + -8426427, + 1470727, + -28109679, + -1596990, + 3978627, + -5123623, + -19622683, + 12092163, + 29077877, + -14741988 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5269168, + -6859726, + -13230211, + -8020715, + 25932563, + 1763552, + -5606110, + -5505881, + -20017847, + 2357889 + ]), + FieldElement.fromList([ + 32264008, + -15407652, + -5387735, + -1160093, + -2091322, + -3946900, + 23104804, + -12869908, + 5727338, + 189038 + ]), + FieldElement.fromList([ + 14609123, + -8954470, + -6000566, + -16622781, + -14577387, + -7743898, + -26745169, + 10942115, + -25888931, + -14884697 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 20513500, + 5557931, + -15604613, + 7829531, + 26413943, + -2019404, + -21378968, + 7471781, + 13913677, + -5137875 + ]), + FieldElement.fromList([ + -25574376, + 11967826, + 29233242, + 12948236, + -6754465, + 4713227, + -8940970, + 14059180, + 12878652, + 8511905 + ]), + FieldElement.fromList([ + -25656801, + 3393631, + -2955415, + -7075526, + -2250709, + 9366908, + -30223418, + 6812974, + 5568676, + -3127656 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11630004, + 12144454, + 2116339, + 13606037, + 27378885, + 15676917, + -17408753, + -13504373, + -14395196, + 8070818 + ]), + FieldElement.fromList([ + 27117696, + -10007378, + -31282771, + -5570088, + 1127282, + 12772488, + -29845906, + 10483306, + -11552749, + -1028714 + ]), + FieldElement.fromList([ + 10637467, + -5688064, + 5674781, + 1072708, + -26343588, + -6982302, + -1683975, + 9177853, + -27493162, + 15431203 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 20525145, + 10892566, + -12742472, + 12779443, + -29493034, + 16150075, + -28240519, + 14943142, + -15056790, + -7935931 + ]), + FieldElement.fromList([ + -30024462, + 5626926, + -551567, + -9981087, + 753598, + 11981191, + 25244767, + -3239766, + -3356550, + 9594024 + ]), + FieldElement.fromList([ + -23752644, + 2636870, + -5163910, + -10103818, + 585134, + 7877383, + 11345683, + -6492290, + 13352335, + -10977084 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -1931799, + -5407458, + 3304649, + -12884869, + 17015806, + -4877091, + -29783850, + -7752482, + -13215537, + -319204 + ]), + FieldElement.fromList([ + 20239939, + 6607058, + 6203985, + 3483793, + -18386976, + -779229, + -20723742, + 15077870, + -22750759, + 14523817 + ]), + FieldElement.fromList([ + 27406042, + -6041657, + 27423596, + -4497394, + 4996214, + 10002360, + -28842031, + -4545494, + -30172742, + -4805667 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11374242, + 12660715, + 17861383, + -12540833, + 10935568, + 1099227, + -13886076, + -9091740, + -27727044, + 11358504 + ]), + FieldElement.fromList([ + -12730809, + 10311867, + 1510375, + 10778093, + -2119455, + -9145702, + 32676003, + 11149336, + -26123651, + 4985768 + ]), + FieldElement.fromList([ + -19096303, + 341147, + -6197485, + -239033, + 15756973, + -8796662, + -983043, + 13794114, + -19414307, + -15621255 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 6490081, + 11940286, + 25495923, + -7726360, + 8668373, + -8751316, + 3367603, + 6970005, + -1691065, + -9004790 + ]), + FieldElement.fromList([ + 1656497, + 13457317, + 15370807, + 6364910, + 13605745, + 8362338, + -19174622, + -5475723, + -16796596, + -5031438 + ]), + FieldElement.fromList([ + -22273315, + -13524424, + -64685, + -4334223, + -18605636, + -10921968, + -20571065, + -7007978, + -99853, + -10237333 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 17747465, + 10039260, + 19368299, + -4050591, + -20630635, + -16041286, + 31992683, + -15857976, + -29260363, + -5511971 + ]), + FieldElement.fromList([ + 31932027, + -4986141, + -19612382, + 16366580, + 22023614, + 88450, + 11371999, + -3744247, + 4882242, + -10626905 + ]), + FieldElement.fromList([ + 29796507, + 37186, + 19818052, + 10115756, + -11829032, + 3352736, + 18551198, + 3272828, + -5190932, + -4162409 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12501286, + 4044383, + -8612957, + -13392385, + -32430052, + 5136599, + -19230378, + -3529697, + 330070, + -3659409 + ]), + FieldElement.fromList([ + 6384877, + 2899513, + 17807477, + 7663917, + -2358888, + 12363165, + 25366522, + -8573892, + -271295, + 12071499 + ]), + FieldElement.fromList([ + -8365515, + -4042521, + 25133448, + -4517355, + -6211027, + 2265927, + -32769618, + 1936675, + -5159697, + 3829363 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 28425966, + -5835433, + -577090, + -4697198, + -14217555, + 6870930, + 7921550, + -6567787, + 26333140, + 14267664 + ]), + FieldElement.fromList([ + -11067219, + 11871231, + 27385719, + -10559544, + -4585914, + -11189312, + 10004786, + -8709488, + -21761224, + 8930324 + ]), + FieldElement.fromList([ + -21197785, + -16396035, + 25654216, + -1725397, + 12282012, + 11008919, + 1541940, + 4757911, + -26491501, + -16408940 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 13537262, + -7759490, + -20604840, + 10961927, + -5922820, + -13218065, + -13156584, + 6217254, + -15943699, + 13814990 + ]), + FieldElement.fromList([ + -17422573, + 15157790, + 18705543, + 29619, + 24409717, + -260476, + 27361681, + 9257833, + -1956526, + -1776914 + ]), + FieldElement.fromList([ + -25045300, + -10191966, + 15366585, + 15166509, + -13105086, + 8423556, + -29171540, + 12361135, + -18685978, + 4578290 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 24579768, + 3711570, + 1342322, + -11180126, + -27005135, + 14124956, + -22544529, + 14074919, + 21964432, + 8235257 + ]), + FieldElement.fromList([ + -6528613, + -2411497, + 9442966, + -5925588, + 12025640, + -1487420, + -2981514, + -1669206, + 13006806, + 2355433 + ]), + FieldElement.fromList([ + -16304899, + -13605259, + -6632427, + -5142349, + 16974359, + -10911083, + 27202044, + 1719366, + 1141648, + -12796236 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12863944, + -13219986, + -8318266, + -11018091, + -6810145, + -4843894, + 13475066, + -3133972, + 32674895, + 13715045 + ]), + FieldElement.fromList([ + 11423335, + -5468059, + 32344216, + 8962751, + 24989809, + 9241752, + -13265253, + 16086212, + -28740881, + -15642093 + ]), + FieldElement.fromList([ + -1409668, + 12530728, + -6368726, + 10847387, + 19531186, + -14132160, + -11709148, + 7791794, + -27245943, + 4383347 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28970898, + 5271447, + -1266009, + -9736989, + -12455236, + 16732599, + -4862407, + -4906449, + 27193557, + 6245191 + ]), + FieldElement.fromList([ + -15193956, + 5362278, + -1783893, + 2695834, + 4960227, + 12840725, + 23061898, + 3260492, + 22510453, + 8577507 + ]), + FieldElement.fromList([ + -12632451, + 11257346, + -32692994, + 13548177, + -721004, + 10879011, + 31168030, + 13952092, + -29571492, + -3635906 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 3877321, + -9572739, + 32416692, + 5405324, + -11004407, + -13656635, + 3759769, + 11935320, + 5611860, + 8164018 + ]), + FieldElement.fromList([ + -16275802, + 14667797, + 15906460, + 12155291, + -22111149, + -9039718, + 32003002, + -8832289, + 5773085, + -8422109 + ]), + FieldElement.fromList([ + -23788118, + -8254300, + 1950875, + 8937633, + 18686727, + 16459170, + -905725, + 12376320, + 31632953, + 190926 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -24593607, + -16138885, + -8423991, + 13378746, + 14162407, + 6901328, + -8288749, + 4508564, + -25341555, + -3627528 + ]), + FieldElement.fromList([ + 8884438, + -5884009, + 6023974, + 10104341, + -6881569, + -4941533, + 18722941, + -14786005, + -1672488, + 827625 + ]), + FieldElement.fromList([ + -32720583, + -16289296, + -32503547, + 7101210, + 13354605, + 2659080, + -1800575, + -14108036, + -24878478, + 1541286 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 2901347, + -1117687, + 3880376, + -10059388, + -17620940, + -3612781, + -21802117, + -3567481, + 20456845, + -1885033 + ]), + FieldElement.fromList([ + 27019610, + 12299467, + -13658288, + -1603234, + -12861660, + -4861471, + -19540150, + -5016058, + 29439641, + 15138866 + ]), + FieldElement.fromList([ + 21536104, + -6626420, + -32447818, + -10690208, + -22408077, + 5175814, + -5420040, + -16361163, + 7779328, + 109896 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30279744, + 14648750, + -8044871, + 6425558, + 13639621, + -743509, + 28698390, + 12180118, + 23177719, + -554075 + ]), + FieldElement.fromList([ + 26572847, + 3405927, + -31701700, + 12890905, + -19265668, + 5335866, + -6493768, + 2378492, + 4439158, + -13279347 + ]), + FieldElement.fromList([ + -22716706, + 3489070, + -9225266, + -332753, + 18875722, + -1140095, + 14819434, + -12731527, + -17717757, + -5461437 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -5056483, + 16566551, + 15953661, + 3767752, + -10436499, + 15627060, + -820954, + 2177225, + 8550082, + -15114165 + ]), + FieldElement.fromList([ + -18473302, + 16596775, + -381660, + 15663611, + 22860960, + 15585581, + -27844109, + -3582739, + -23260460, + -8428588 + ]), + FieldElement.fromList([ + -32480551, + 15707275, + -8205912, + -5652081, + 29464558, + 2713815, + -22725137, + 15860482, + -21902570, + 1494193 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -19562091, + -14087393, + -25583872, + -9299552, + 13127842, + 759709, + 21923482, + 16529112, + 8742704, + 12967017 + ]), + FieldElement.fromList([ + -28464899, + 1553205, + 32536856, + -10473729, + -24691605, + -406174, + -8914625, + -2933896, + -29903758, + 15553883 + ]), + FieldElement.fromList([ + 21877909, + 3230008, + 9881174, + 10539357, + -4797115, + 2841332, + 11543572, + 14513274, + 19375923, + -12647961 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 8832269, + -14495485, + 13253511, + 5137575, + 5037871, + 4078777, + 24880818, + -6222716, + 2862653, + 9455043 + ]), + FieldElement.fromList([ + 29306751, + 5123106, + 20245049, + -14149889, + 9592566, + 8447059, + -2077124, + -2990080, + 15511449, + 4789663 + ]), + FieldElement.fromList([ + -20679756, + 7004547, + 8824831, + -9434977, + -4045704, + -3750736, + -5754762, + 108893, + 23513200, + 16652362 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -33256173, + 4144782, + -4476029, + -6579123, + 10770039, + -7155542, + -6650416, + -12936300, + -18319198, + 10212860 + ]), + FieldElement.fromList([ + 2756081, + 8598110, + 7383731, + -6859892, + 22312759, + -1105012, + 21179801, + 2600940, + -9988298, + -12506466 + ]), + FieldElement.fromList([ + -24645692, + 13317462, + -30449259, + -15653928, + 21365574, + -10869657, + 11344424, + 864440, + -2499677, + -16710063 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -26432803, + 6148329, + -17184412, + -14474154, + 18782929, + -275997, + -22561534, + 211300, + 2719757, + 4940997 + ]), + FieldElement.fromList([ + -1323882, + 3911313, + -6948744, + 14759765, + -30027150, + 7851207, + 21690126, + 8518463, + 26699843, + 5276295 + ]), + FieldElement.fromList([ + -13149873, + -6429067, + 9396249, + 365013, + 24703301, + -10488939, + 1321586, + 149635, + -15452774, + 7159369 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9987780, + -3404759, + 17507962, + 9505530, + 9731535, + -2165514, + 22356009, + 8312176, + 22477218, + -8403385 + ]), + FieldElement.fromList([ + 18155857, + -16504990, + 19744716, + 9006923, + 15154154, + -10538976, + 24256460, + -4864995, + -22548173, + 9334109 + ]), + FieldElement.fromList([ + 2986088, + -4911893, + 10776628, + -3473844, + 10620590, + -7083203, + -21413845, + 14253545, + -22587149, + 536906 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 4377756, + 8115836, + 24567078, + 15495314, + 11625074, + 13064599, + 7390551, + 10589625, + 10838060, + -15420424 + ]), + FieldElement.fromList([ + -19342404, + 867880, + 9277171, + -3218459, + -14431572, + -1986443, + 19295826, + -15796950, + 6378260, + 699185 + ]), + FieldElement.fromList([ + 7895026, + 4057113, + -7081772, + -13077756, + -17886831, + -323126, + -716039, + 15693155, + -5045064, + -13373962 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -7737563, + -5869402, + -14566319, + -7406919, + 11385654, + 13201616, + 31730678, + -10962840, + -3918636, + -9669325 + ]), + FieldElement.fromList([ + 10188286, + -15770834, + -7336361, + 13427543, + 22223443, + 14896287, + 30743455, + 7116568, + -21786507, + 5427593 + ]), + FieldElement.fromList([ + 696102, + 13206899, + 27047647, + -10632082, + 15285305, + -9853179, + 10798490, + -4578720, + 19236243, + 12477404 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -11229439, + 11243796, + -17054270, + -8040865, + -788228, + -8167967, + -3897669, + 11180504, + -23169516, + 7733644 + ]), + FieldElement.fromList([ + 17800790, + -14036179, + -27000429, + -11766671, + 23887827, + 3149671, + 23466177, + -10538171, + 10322027, + 15313801 + ]), + FieldElement.fromList([ + 26246234, + 11968874, + 32263343, + -5468728, + 6830755, + -13323031, + -15794704, + -101982, + -24449242, + 10890804 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -31365647, + 10271363, + -12660625, + -6267268, + 16690207, + -13062544, + -14982212, + 16484931, + 25180797, + -5334884 + ]), + FieldElement.fromList([ + -586574, + 10376444, + -32586414, + -11286356, + 19801893, + 10997610, + 2276632, + 9482883, + 316878, + 13820577 + ]), + FieldElement.fromList([ + -9882808, + -4510367, + -2115506, + 16457136, + -11100081, + 11674996, + 30756178, + -7515054, + 30696930, + -3712849 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 32988917, + -9603412, + 12499366, + 7910787, + -10617257, + -11931514, + -7342816, + -9985397, + -32349517, + 7392473 + ]), + FieldElement.fromList([ + -8855661, + 15927861, + 9866406, + -3649411, + -2396914, + -16655781, + -30409476, + -9134995, + 25112947, + -2926644 + ]), + FieldElement.fromList([ + -2504044, + -436966, + 25621774, + -5678772, + 15085042, + -5479877, + -24884878, + -13526194, + 5537438, + -13914319 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -11225584, + 2320285, + -9584280, + 10149187, + -33444663, + 5808648, + -14876251, + -1729667, + 31234590, + 6090599 + ]), + FieldElement.fromList([ + -9633316, + 116426, + 26083934, + 2897444, + -6364437, + -2688086, + 609721, + 15878753, + -6970405, + -9034768 + ]), + FieldElement.fromList([ + -27757857, + 247744, + -15194774, + -9002551, + 23288161, + -10011936, + -23869595, + 6503646, + 20650474, + 1804084 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -27589786, + 15456424, + 8972517, + 8469608, + 15640622, + 4439847, + 3121995, + -10329713, + 27842616, + -202328 + ]), + FieldElement.fromList([ + -15306973, + 2839644, + 22530074, + 10026331, + 4602058, + 5048462, + 28248656, + 5031932, + -11375082, + 12714369 + ]), + FieldElement.fromList([ + 20807691, + -7270825, + 29286141, + 11421711, + -27876523, + -13868230, + -21227475, + 1035546, + -19733229, + 12796920 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 12076899, + -14301286, + -8785001, + -11848922, + -25012791, + 16400684, + -17591495, + -12899438, + 3480665, + -15182815 + ]), + FieldElement.fromList([ + -32361549, + 5457597, + 28548107, + 7833186, + 7303070, + -11953545, + -24363064, + -15921875, + -33374054, + 2771025 + ]), + FieldElement.fromList([ + -21389266, + 421932, + 26597266, + 6860826, + 22486084, + -6737172, + -17137485, + -4210226, + -24552282, + 15673397 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -20184622, + 2338216, + 19788685, + -9620956, + -4001265, + -8740893, + -20271184, + 4733254, + 3727144, + -12934448 + ]), + FieldElement.fromList([ + 6120119, + 814863, + -11794402, + -622716, + 6812205, + -15747771, + 2019594, + 7975683, + 31123697, + -10958981 + ]), + FieldElement.fromList([ + 30069250, + -11435332, + 30434654, + 2958439, + 18399564, + -976289, + 12296869, + 9204260, + -16432438, + 9648165 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 32705432, + -1550977, + 30705658, + 7451065, + -11805606, + 9631813, + 3305266, + 5248604, + -26008332, + -11377501 + ]), + FieldElement.fromList([ + 17219865, + 2375039, + -31570947, + -5575615, + -19459679, + 9219903, + 294711, + 15298639, + 2662509, + -16297073 + ]), + FieldElement.fromList([ + -1172927, + -7558695, + -4366770, + -4287744, + -21346413, + -8434326, + 32087529, + -1222777, + 32247248, + -14389861 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14312628, + 1221556, + 17395390, + -8700143, + -4945741, + -8684635, + -28197744, + -9637817, + -16027623, + -13378845 + ]), + FieldElement.fromList([ + -1428825, + -9678990, + -9235681, + 6549687, + -7383069, + -468664, + 23046502, + 9803137, + 17597934, + 2346211 + ]), + FieldElement.fromList([ + 18510800, + 15337574, + 26171504, + 981392, + -22241552, + 7827556, + -23491134, + -11323352, + 3059833, + -11782870 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10141598, + 6082907, + 17829293, + -1947643, + 9830092, + 13613136, + -25556636, + -5544586, + -33502212, + 3592096 + ]), + FieldElement.fromList([ + 33114168, + -15889352, + -26525686, + -13343397, + 33076705, + 8716171, + 1151462, + 1521897, + -982665, + -6837803 + ]), + FieldElement.fromList([ + -32939165, + -4255815, + 23947181, + -324178, + -33072974, + -12305637, + -16637686, + 3891704, + 26353178, + 693168 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30374239, + 1595580, + -16884039, + 13186931, + 4600344, + 406904, + 9585294, + -400668, + 31375464, + 14369965 + ]), + FieldElement.fromList([ + -14370654, + -7772529, + 1510301, + 6434173, + -18784789, + -6262728, + 32732230, + -13108839, + 17901441, + 16011505 + ]), + FieldElement.fromList([ + 18171223, + -11934626, + -12500402, + 15197122, + -11038147, + -15230035, + -19172240, + -16046376, + 8764035, + 12309598 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 5975908, + -5243188, + -19459362, + -9681747, + -11541277, + 14015782, + -23665757, + 1228319, + 17544096, + -10593782 + ]), + FieldElement.fromList([ + 5811932, + -1715293, + 3442887, + -2269310, + -18367348, + -8359541, + -18044043, + -15410127, + -5565381, + 12348900 + ]), + FieldElement.fromList([ + -31399660, + 11407555, + 25755363, + 6891399, + -3256938, + 14872274, + -24849353, + 8141295, + -10632534, + -585479 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12675304, + 694026, + -5076145, + 13300344, + 14015258, + -14451394, + -9698672, + -11329050, + 30944593, + 1130208 + ]), + FieldElement.fromList([ + 8247766, + -6710942, + -26562381, + -7709309, + -14401939, + -14648910, + 4652152, + 2488540, + 23550156, + -271232 + ]), + FieldElement.fromList([ + 17294316, + -3788438, + 7026748, + 15626851, + 22990044, + 113481, + 2267737, + -5908146, + -408818, + -137719 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16091085, + -16253926, + 18599252, + 7340678, + 2137637, + -1221657, + -3364161, + 14550936, + 3260525, + -7166271 + ]), + FieldElement.fromList([ + -4910104, + -13332887, + 18550887, + 10864893, + -16459325, + -7291596, + -23028869, + -13204905, + -12748722, + 2701326 + ]), + FieldElement.fromList([ + -8574695, + 16099415, + 4629974, + -16340524, + -20786213, + -6005432, + -10018363, + 9276971, + 11329923, + 1862132 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14763076, + -15903608, + -30918270, + 3689867, + 3511892, + 10313526, + -21951088, + 12219231, + -9037963, + -940300 + ]), + FieldElement.fromList([ + 8894987, + -3446094, + 6150753, + 3013931, + 301220, + 15693451, + -31981216, + -2909717, + -15438168, + 11595570 + ]), + FieldElement.fromList([ + 15214962, + 3537601, + -26238722, + -14058872, + 4418657, + -15230761, + 13947276, + 10730794, + -13489462, + -4363670 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -2538306, + 7682793, + 32759013, + 263109, + -29984731, + -7955452, + -22332124, + -10188635, + 977108, + 699994 + ]), + FieldElement.fromList([ + -12466472, + 4195084, + -9211532, + 550904, + -15565337, + 12917920, + 19118110, + -439841, + -30534533, + -14337913 + ]), + FieldElement.fromList([ + 31788461, + -14507657, + 4799989, + 7372237, + 8808585, + -14747943, + 9408237, + -10051775, + 12493932, + -5409317 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25680606, + 5260744, + -19235809, + -6284470, + -3695942, + 16566087, + 27218280, + 2607121, + 29375955, + 6024730 + ]), + FieldElement.fromList([ + 842132, + -2794693, + -4763381, + -8722815, + 26332018, + -12405641, + 11831880, + 6985184, + -9940361, + 2854096 + ]), + FieldElement.fromList([ + -4847262, + -7969331, + 2516242, + -5847713, + 9695691, + -7221186, + 16512645, + 960770, + 12121869, + 16648078 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -15218652, + 14667096, + -13336229, + 2013717, + 30598287, + -464137, + -31504922, + -7882064, + 20237806, + 2838411 + ]), + FieldElement.fromList([ + -19288047, + 4453152, + 15298546, + -16178388, + 22115043, + -15972604, + 12544294, + -13470457, + 1068881, + -12499905 + ]), + FieldElement.fromList([ + -9558883, + -16518835, + 33238498, + 13506958, + 30505848, + -1114596, + -8486907, + -2630053, + 12521378, + 4845654 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28198521, + 10744108, + -2958380, + 10199664, + 7759311, + -13088600, + 3409348, + -873400, + -6482306, + -12885870 + ]), + FieldElement.fromList([ + -23561822, + 6230156, + -20382013, + 10655314, + -24040585, + -11621172, + 10477734, + -1240216, + -3113227, + 13974498 + ]), + FieldElement.fromList([ + 12966261, + 15550616, + -32038948, + -1615346, + 21025980, + -629444, + 5642325, + 7188737, + 18895762, + 12629579 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 14741879, + -14946887, + 22177208, + -11721237, + 1279741, + 8058600, + 11758140, + 789443, + 32195181, + 3895677 + ]), + FieldElement.fromList([ + 10758205, + 15755439, + -4509950, + 9243698, + -4879422, + 6879879, + -2204575, + -3566119, + -8982069, + 4429647 + ]), + FieldElement.fromList([ + -2453894, + 15725973, + -20436342, + -10410672, + -5803908, + -11040220, + -7135870, + -11642895, + 18047436, + -15281743 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25173001, + -11307165, + 29759956, + 11776784, + -22262383, + -15820455, + 10993114, + -12850837, + -17620701, + -9408468 + ]), + FieldElement.fromList([ + 21987233, + 700364, + -24505048, + 14972008, + -7774265, + -5718395, + 32155026, + 2581431, + -29958985, + 8773375 + ]), + FieldElement.fromList([ + -25568350, + 454463, + -13211935, + 16126715, + 25240068, + 8594567, + 20656846, + 12017935, + -7874389, + -13920155 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 6028182, + 6263078, + -31011806, + -11301710, + -818919, + 2461772, + -31841174, + -5468042, + -1721788, + -2776725 + ]), + FieldElement.fromList([ + -12278994, + 16624277, + 987579, + -5922598, + 32908203, + 1248608, + 7719845, + -4166698, + 28408820, + 6816612 + ]), + FieldElement.fromList([ + -10358094, + -8237829, + 19549651, + -12169222, + 22082623, + 16147817, + 20613181, + 13982702, + -10339570, + 5067943 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -30505967, + -3821767, + 12074681, + 13582412, + -19877972, + 2443951, + -19719286, + 12746132, + 5331210, + -10105944 + ]), + FieldElement.fromList([ + 30528811, + 3601899, + -1957090, + 4619785, + -27361822, + -15436388, + 24180793, + -12570394, + 27679908, + -1648928 + ]), + FieldElement.fromList([ + 9402404, + -13957065, + 32834043, + 10838634, + -26580150, + -13237195, + 26653274, + -8685565, + 22611444, + -12715406 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 22190590, + 1118029, + 22736441, + 15130463, + -30460692, + -5991321, + 19189625, + -4648942, + 4854859, + 6622139 + ]), + FieldElement.fromList([ + -8310738, + -2953450, + -8262579, + -3388049, + -10401731, + -271929, + 13424426, + -3567227, + 26404409, + 13001963 + ]), + FieldElement.fromList([ + -31241838, + -15415700, + -2994250, + 8939346, + 11562230, + -12840670, + -26064365, + -11621720, + -15405155, + 11020693 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 1866042, + -7949489, + -7898649, + -10301010, + 12483315, + 13477547, + 3175636, + -12424163, + 28761762, + 1406734 + ]), + FieldElement.fromList([ + -448555, + -1777666, + 13018551, + 3194501, + -9580420, + -11161737, + 24760585, + -4347088, + 25577411, + -13378680 + ]), + FieldElement.fromList([ + -24290378, + 4759345, + -690653, + -1852816, + 2066747, + 10693769, + -29595790, + 9884936, + -9368926, + 4745410 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -9141284, + 6049714, + -19531061, + -4341411, + -31260798, + 9944276, + -15462008, + -11311852, + 10931924, + -11931931 + ]), + FieldElement.fromList([ + -16561513, + 14112680, + -8012645, + 4817318, + -8040464, + -11414606, + -22853429, + 10856641, + -20470770, + 13434654 + ]), + FieldElement.fromList([ + 22759489, + -10073434, + -16766264, + -1871422, + 13637442, + -10168091, + 1765144, + -12654326, + 28445307, + -5364710 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 29875063, + 12493613, + 2795536, + -3786330, + 1710620, + 15181182, + -10195717, + -8788675, + 9074234, + 1167180 + ]), + FieldElement.fromList([ + -26205683, + 11014233, + -9842651, + -2635485, + -26908120, + 7532294, + -18716888, + -9535498, + 3843903, + 9367684 + ]), + FieldElement.fromList([ + -10969595, + -6403711, + 9591134, + 9582310, + 11349256, + 108879, + 16235123, + 8601684, + -139197, + 4242895 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 22092954, + -13191123, + -2042793, + -11968512, + 32186753, + -11517388, + -6574341, + 2470660, + -27417366, + 16625501 + ]), + FieldElement.fromList([ + -11057722, + 3042016, + 13770083, + -9257922, + 584236, + -544855, + -7770857, + 2602725, + -27351616, + 14247413 + ]), + FieldElement.fromList([ + 6314175, + -10264892, + -32772502, + 15957557, + -10157730, + 168750, + -8618807, + 14290061, + 27108877, + -1180880 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -8586597, + -7170966, + 13241782, + 10960156, + -32991015, + -13794596, + 33547976, + -11058889, + -27148451, + 981874 + ]), + FieldElement.fromList([ + 22833440, + 9293594, + -32649448, + -13618667, + -9136966, + 14756819, + -22928859, + -13970780, + -10479804, + -16197962 + ]), + FieldElement.fromList([ + -7768587, + 3326786, + -28111797, + 10783824, + 19178761, + 14905060, + 22680049, + 13906969, + -15933690, + 3797899 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 21721356, + -4212746, + -12206123, + 9310182, + -3882239, + -13653110, + 23740224, + -2709232, + 20491983, + -8042152 + ]), + FieldElement.fromList([ + 9209270, + -15135055, + -13256557, + -6167798, + -731016, + 15289673, + 25947805, + 15286587, + 30997318, + -6703063 + ]), + FieldElement.fromList([ + 7392032, + 16618386, + 23946583, + -8039892, + -13265164, + -1533858, + -14197445, + -2321576, + 17649998, + -250080 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -9301088, + -14193827, + 30609526, + -3049543, + -25175069, + -1283752, + -15241566, + -9525724, + -2233253, + 7662146 + ]), + FieldElement.fromList([ + -17558673, + 1763594, + -33114336, + 15908610, + -30040870, + -12174295, + 7335080, + -8472199, + -3174674, + 3440183 + ]), + FieldElement.fromList([ + -19889700, + -5977008, + -24111293, + -9688870, + 10799743, + -16571957, + 40450, + -4431835, + 4862400, + 1133 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -32856209, + -7873957, + -5422389, + 14860950, + -16319031, + 7956142, + 7258061, + 311861, + -30594991, + -7379421 + ]), + FieldElement.fromList([ + -3773428, + -1565936, + 28985340, + 7499440, + 24445838, + 9325937, + 29727763, + 16527196, + 18278453, + 15405622 + ]), + FieldElement.fromList([ + -4381906, + 8508652, + -19898366, + -3674424, + -5984453, + 15149970, + -13313598, + 843523, + -21875062, + 13626197 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 2281448, + -13487055, + -10915418, + -2609910, + 1879358, + 16164207, + -10783882, + 3953792, + 13340839, + 15928663 + ]), + FieldElement.fromList([ + 31727126, + -7179855, + -18437503, + -8283652, + 2875793, + -16390330, + -25269894, + -7014826, + -23452306, + 5964753 + ]), + FieldElement.fromList([ + 4100420, + -5959452, + -17179337, + 6017714, + -18705837, + 12227141, + -26684835, + 11344144, + 2538215, + -7570755 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -9433605, + 6123113, + 11159803, + -2156608, + 30016280, + 14966241, + -20474983, + 1485421, + -629256, + -15958862 + ]), + FieldElement.fromList([ + -26804558, + 4260919, + 11851389, + 9658551, + -32017107, + 16367492, + -20205425, + -13191288, + 11659922, + -11115118 + ]), + FieldElement.fromList([ + 26180396, + 10015009, + -30844224, + -8581293, + 5418197, + 9480663, + 2231568, + -10170080, + 33100372, + -1306171 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15121113, + -5201871, + -10389905, + 15427821, + -27509937, + -15992507, + 21670947, + 4486675, + -5931810, + -14466380 + ]), + FieldElement.fromList([ + 16166486, + -9483733, + -11104130, + 6023908, + -31926798, + -1364923, + 2340060, + -16254968, + -10735770, + -10039824 + ]), + FieldElement.fromList([ + 28042865, + -3557089, + -12126526, + 12259706, + -3717498, + -6945899, + 6766453, + -8689599, + 18036436, + 5803270 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -817581, + 6763912, + 11803561, + 1585585, + 10958447, + -2671165, + 23855391, + 4598332, + -6159431, + -14117438 + ]), + FieldElement.fromList([ + -31031306, + -14256194, + 17332029, + -2383520, + 31312682, + -5967183, + 696309, + 50292, + -20095739, + 11763584 + ]), + FieldElement.fromList([ + -594563, + -2514283, + -32234153, + 12643980, + 12650761, + 14811489, + 665117, + -12613632, + -19773211, + -10713562 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30464590, + -11262872, + -4127476, + -12734478, + 19835327, + -7105613, + -24396175, + 2075773, + -17020157, + 992471 + ]), + FieldElement.fromList([ + 18357185, + -6994433, + 7766382, + 16342475, + -29324918, + 411174, + 14578841, + 8080033, + -11574335, + -10601610 + ]), + FieldElement.fromList([ + 19598397, + 10334610, + 12555054, + 2555664, + 18821899, + -10339780, + 21873263, + 16014234, + 26224780, + 16452269 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -30223925, + 5145196, + 5944548, + 16385966, + 3976735, + 2009897, + -11377804, + -7618186, + -20533829, + 3698650 + ]), + FieldElement.fromList([ + 14187449, + 3448569, + -10636236, + -10810935, + -22663880, + -3433596, + 7268410, + -10890444, + 27394301, + 12015369 + ]), + FieldElement.fromList([ + 19695761, + 16087646, + 28032085, + 12999827, + 6817792, + 11427614, + 20244189, + -1312777, + -13259127, + -3402461 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30860103, + 12735208, + -1888245, + -4699734, + -16974906, + 2256940, + -8166013, + 12298312, + -8550524, + -10393462 + ]), + FieldElement.fromList([ + -5719826, + -11245325, + -1910649, + 15569035, + 26642876, + -7587760, + -5789354, + -15118654, + -4976164, + 12651793 + ]), + FieldElement.fromList([ + -2848395, + 9953421, + 11531313, + -5282879, + 26895123, + -12697089, + -13118820, + -16517902, + 9768698, + -2533218 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -24719459, + 1894651, + -287698, + -4704085, + 15348719, + -8156530, + 32767513, + 12765450, + 4940095, + 10678226 + ]), + FieldElement.fromList([ + 18860224, + 15980149, + -18987240, + -1562570, + -26233012, + -11071856, + -7843882, + 13944024, + -24372348, + 16582019 + ]), + FieldElement.fromList([ + -15504260, + 4970268, + -29893044, + 4175593, + -20993212, + -2199756, + -11704054, + 15444560, + -11003761, + 7989037 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31490452, + 5568061, + -2412803, + 2182383, + -32336847, + 4531686, + -32078269, + 6200206, + -19686113, + -14800171 + ]), + FieldElement.fromList([ + -17308668, + -15879940, + -31522777, + -2831, + -32887382, + 16375549, + 8680158, + -16371713, + 28550068, + -6857132 + ]), + FieldElement.fromList([ + -28126887, + -5688091, + 16837845, + -1820458, + -6850681, + 12700016, + -30039981, + 4364038, + 1155602, + 5988841 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 21890435, + -13272907, + -12624011, + 12154349, + -7831873, + 15300496, + 23148983, + -4470481, + 24618407, + 8283181 + ]), + FieldElement.fromList([ + -33136107, + -10512751, + 9975416, + 6841041, + -31559793, + 16356536, + 3070187, + -7025928, + 1466169, + 10740210 + ]), + FieldElement.fromList([ + -1509399, + -15488185, + -13503385, + -10655916, + 32799044, + 909394, + -13938903, + -5779719, + -32164649, + -15327040 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 3960823, + -14267803, + -28026090, + -15918051, + -19404858, + 13146868, + 15567327, + 951507, + -3260321, + -573935 + ]), + FieldElement.fromList([ + 24740841, + 5052253, + -30094131, + 8961361, + 25877428, + 6165135, + -24368180, + 14397372, + -7380369, + -6144105 + ]), + FieldElement.fromList([ + -28888365, + 3510803, + -28103278, + -1158478, + -11238128, + -10631454, + -15441463, + -14453128, + -1625486, + -6494814 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 793299, + -9230478, + 8836302, + -6235707, + -27360908, + -2369593, + 33152843, + -4885251, + -9906200, + -621852 + ]), + FieldElement.fromList([ + 5666233, + 525582, + 20782575, + -8038419, + -24538499, + 14657740, + 16099374, + 1468826, + -6171428, + -15186581 + ]), + FieldElement.fromList([ + -4859255, + -3779343, + -2917758, + -6748019, + 7778750, + 11688288, + -30404353, + -9871238, + -1558923, + -9863646 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 10896332, + -7719704, + 824275, + 472601, + -19460308, + 3009587, + 25248958, + 14783338, + -30581476, + -15757844 + ]), + FieldElement.fromList([ + 10566929, + 12612572, + -31944212, + 11118703, + -12633376, + 12362879, + 21752402, + 8822496, + 24003793, + 14264025 + ]), + FieldElement.fromList([ + 27713862, + -7355973, + -11008240, + 9227530, + 27050101, + 2504721, + 23886875, + -13117525, + 13958495, + -5732453 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23481610, + 4867226, + -27247128, + 3900521, + 29838369, + -8212291, + -31889399, + -10041781, + 7340521, + -15410068 + ]), + FieldElement.fromList([ + 4646514, + -8011124, + -22766023, + -11532654, + 23184553, + 8566613, + 31366726, + -1381061, + -15066784, + -10375192 + ]), + FieldElement.fromList([ + -17270517, + 12723032, + -16993061, + 14878794, + 21619651, + -6197576, + 27584817, + 3093888, + -8843694, + 3849921 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -9064912, + 2103172, + 25561640, + -15125738, + -5239824, + 9582958, + 32477045, + -9017955, + 5002294, + -15550259 + ]), + FieldElement.fromList([ + -12057553, + -11177906, + 21115585, + -13365155, + 8808712, + -12030708, + 16489530, + 13378448, + -25845716, + 12741426 + ]), + FieldElement.fromList([ + -5946367, + 10645103, + -30911586, + 15390284, + -3286982, + -7118677, + 24306472, + 15852464, + 28834118, + -7646072 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -17335748, + -9107057, + -24531279, + 9434953, + -8472084, + -583362, + -13090771, + 455841, + 20461858, + 5491305 + ]), + FieldElement.fromList([ + 13669248, + -16095482, + -12481974, + -10203039, + -14569770, + -11893198, + -24995986, + 11293807, + -28588204, + -9421832 + ]), + FieldElement.fromList([ + 28497928, + 6272777, + -33022994, + 14470570, + 8906179, + -1225630, + 18504674, + -14165166, + 29867745, + -8795943 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -16207023, + 13517196, + -27799630, + -13697798, + 24009064, + -6373891, + -6367600, + -13175392, + 22853429, + -4012011 + ]), + FieldElement.fromList([ + 24191378, + 16712145, + -13931797, + 15217831, + 14542237, + 1646131, + 18603514, + -11037887, + 12876623, + -2112447 + ]), + FieldElement.fromList([ + 17902668, + 4518229, + -411702, + -2829247, + 26878217, + 5258055, + -12860753, + 608397, + 16031844, + 3723494 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28632773, + 12763728, + -20446446, + 7577504, + 33001348, + -13017745, + 17558842, + -7872890, + 23896954, + -4314245 + ]), + FieldElement.fromList([ + -20005381, + -12011952, + 31520464, + 605201, + 2543521, + 5991821, + -2945064, + 7229064, + -9919646, + -8826859 + ]), + FieldElement.fromList([ + 28816045, + 298879, + -28165016, + -15920938, + 19000928, + -1665890, + -12680833, + -2949325, + -18051778, + -2082915 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16000882, + -344896, + 3493092, + -11447198, + -29504595, + -13159789, + 12577740, + 16041268, + -19715240, + 7847707 + ]), + FieldElement.fromList([ + 10151868, + 10572098, + 27312476, + 7922682, + 14825339, + 4723128, + -32855931, + -6519018, + -10020567, + 3852848 + ]), + FieldElement.fromList([ + -11430470, + 15697596, + -21121557, + -4420647, + 5386314, + 15063598, + 16514493, + -15932110, + 29330899, + -15076224 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25499735, + -4378794, + -15222908, + -6901211, + 16615731, + 2051784, + 3303702, + 15490, + -27548796, + 12314391 + ]), + FieldElement.fromList([ + 15683520, + -6003043, + 18109120, + -9980648, + 15337968, + -5997823, + -16717435, + 15921866, + 16103996, + -3731215 + ]), + FieldElement.fromList([ + -23169824, + -10781249, + 13588192, + -1628807, + -3798557, + -1074929, + -19273607, + 5402699, + -29815713, + -9841101 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 23190676, + 2384583, + -32714340, + 3462154, + -29903655, + -1529132, + -11266856, + 8911517, + -25205859, + 2739713 + ]), + FieldElement.fromList([ + 21374101, + -3554250, + -33524649, + 9874411, + 15377179, + 11831242, + -33529904, + 6134907, + 4931255, + 11987849 + ]), + FieldElement.fromList([ + -7732, + -2978858, + -16223486, + 7277597, + 105524, + -322051, + -31480539, + 13861388, + -30076310, + 10117930 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -29501170, + -10744872, + -26163768, + 13051539, + -25625564, + 5089643, + -6325503, + 6704079, + 12890019, + 15728940 + ]), + FieldElement.fromList([ + -21972360, + -11771379, + -951059, + -4418840, + 14704840, + 2695116, + 903376, + -10428139, + 12885167, + 8311031 + ]), + FieldElement.fromList([ + -17516482, + 5352194, + 10384213, + -13811658, + 7506451, + 13453191, + 26423267, + 4384730, + 1888765, + -5435404 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25817338, + -3107312, + -13494599, + -3182506, + 30896459, + -13921729, + -32251644, + -12707869, + -19464434, + -3340243 + ]), + FieldElement.fromList([ + -23607977, + -2665774, + -526091, + 4651136, + 5765089, + 4618330, + 6092245, + 14845197, + 17151279, + -9854116 + ]), + FieldElement.fromList([ + -24830458, + -12733720, + -15165978, + 10367250, + -29530908, + -265356, + 22825805, + -7087279, + -16866484, + 16176525 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23583256, + 6564961, + 20063689, + 3798228, + -4740178, + 7359225, + 2006182, + -10363426, + -28746253, + -10197509 + ]), + FieldElement.fromList([ + -10626600, + -4486402, + -13320562, + -5125317, + 3432136, + -6393229, + 23632037, + -1940610, + 32808310, + 1099883 + ]), + FieldElement.fromList([ + 15030977, + 5768825, + -27451236, + -2887299, + -6427378, + -15361371, + -15277896, + -6809350, + 2051441, + -15225865 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -3362323, + -7239372, + 7517890, + 9824992, + 23555850, + 295369, + 5148398, + -14154188, + -22686354, + 16633660 + ]), + FieldElement.fromList([ + 4577086, + -16752288, + 13249841, + -15304328, + 19958763, + -14537274, + 18559670, + -10759549, + 8402478, + -9864273 + ]), + FieldElement.fromList([ + -28406330, + -1051581, + -26790155, + -907698, + -17212414, + -11030789, + 9453451, + -14980072, + 17983010, + 9967138 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25762494, + 6524722, + 26585488, + 9969270, + 24709298, + 1220360, + -1677990, + 7806337, + 17507396, + 3651560 + ]), + FieldElement.fromList([ + -10420457, + -4118111, + 14584639, + 15971087, + -15768321, + 8861010, + 26556809, + -5574557, + -18553322, + -11357135 + ]), + FieldElement.fromList([ + 2839101, + 14284142, + 4029895, + 3472686, + 14402957, + 12689363, + -26642121, + 8459447, + -5605463, + -7621941 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -4839289, + -3535444, + 9744961, + 2871048, + 25113978, + 3187018, + -25110813, + -849066, + 17258084, + -7977739 + ]), + FieldElement.fromList([ + 18164541, + -10595176, + -17154882, + -1542417, + 19237078, + -9745295, + 23357533, + -15217008, + 26908270, + 12150756 + ]), + FieldElement.fromList([ + -30264870, + -7647865, + 5112249, + -7036672, + -1499807, + -6974257, + 43168, + -5537701, + -32302074, + 16215819 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -6898905, + 9824394, + -12304779, + -4401089, + -31397141, + -6276835, + 32574489, + 12532905, + -7503072, + -8675347 + ]), + FieldElement.fromList([ + -27343522, + -16515468, + -27151524, + -10722951, + 946346, + 16291093, + 254968, + 7168080, + 21676107, + -1943028 + ]), + FieldElement.fromList([ + 21260961, + -8424752, + -16831886, + -11920822, + -23677961, + 3968121, + -3651949, + -6215466, + -3556191, + -7913075 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16544754, + 13250366, + -16804428, + 15546242, + -4583003, + 12757258, + -2462308, + -8680336, + -18907032, + -9662799 + ]), + FieldElement.fromList([ + -2415239, + -15577728, + 18312303, + 4964443, + -15272530, + -12653564, + 26820651, + 16690659, + 25459437, + -4564609 + ]), + FieldElement.fromList([ + -25144690, + 11425020, + 28423002, + -11020557, + -6144921, + -15826224, + 9142795, + -2391602, + -6432418, + -1644817 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23104652, + 6253476, + 16964147, + -3768872, + -25113972, + -12296437, + -27457225, + -16344658, + 6335692, + 7249989 + ]), + FieldElement.fromList([ + -30333227, + 13979675, + 7503222, + -12368314, + -11956721, + -4621693, + -30272269, + 2682242, + 25993170, + -12478523 + ]), + FieldElement.fromList([ + 4364628, + 5930691, + 32304656, + -10044554, + -8054781, + 15091131, + 22857016, + -10598955, + 31820368, + 15075278 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31879134, + -8918693, + 17258761, + 90626, + -8041836, + -4917709, + 24162788, + -9650886, + -17970238, + 12833045 + ]), + FieldElement.fromList([ + 19073683, + 14851414, + -24403169, + -11860168, + 7625278, + 11091125, + -19619190, + 2074449, + -9413939, + 14905377 + ]), + FieldElement.fromList([ + 24483667, + -11935567, + -2518866, + -11547418, + -1553130, + 15355506, + -25282080, + 9253129, + 27628530, + -7555480 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 17597607, + 8340603, + 19355617, + 552187, + 26198470, + -3176583, + 4593324, + -9157582, + -14110875, + 15297016 + ]), + FieldElement.fromList([ + 510886, + 14337390, + -31785257, + 16638632, + 6328095, + 2713355, + -20217417, + -11864220, + 8683221, + 2921426 + ]), + FieldElement.fromList([ + 18606791, + 11874196, + 27155355, + -5281482, + -24031742, + 6265446, + -25178240, + -1278924, + 4674690, + 13890525 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 13609624, + 13069022, + -27372361, + -13055908, + 24360586, + 9592974, + 14977157, + 9835105, + 4389687, + 288396 + ]), + FieldElement.fromList([ + 9922506, + -519394, + 13613107, + 5883594, + -18758345, + -434263, + -12304062, + 8317628, + 23388070, + 16052080 + ]), + FieldElement.fromList([ + 12720016, + 11937594, + -31970060, + -5028689, + 26900120, + 8561328, + -20155687, + -11632979, + -14754271, + -10812892 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 15961858, + 14150409, + 26716931, + -665832, + -22794328, + 13603569, + 11829573, + 7467844, + -28822128, + 929275 + ]), + FieldElement.fromList([ + 11038231, + -11582396, + -27310482, + -7316562, + -10498527, + -16307831, + -23479533, + -9371869, + -21393143, + 2465074 + ]), + FieldElement.fromList([ + 20017163, + -4323226, + 27915242, + 1529148, + 12396362, + 15675764, + 13817261, + -9658066, + 2463391, + -4622140 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -16358878, + -12663911, + -12065183, + 4996454, + -1256422, + 1073572, + 9583558, + 12851107, + 4003896, + 12673717 + ]), + FieldElement.fromList([ + -1731589, + -15155870, + -3262930, + 16143082, + 19294135, + 13385325, + 14741514, + -9103726, + 7903886, + 2348101 + ]), + FieldElement.fromList([ + 24536016, + -16515207, + 12715592, + -3862155, + 1511293, + 10047386, + -3842346, + -7129159, + -28377538, + 10048127 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -12622226, + -6204820, + 30718825, + 2591312, + -10617028, + 12192840, + 18873298, + -7297090, + -32297756, + 15221632 + ]), + FieldElement.fromList([ + -26478122, + -11103864, + 11546244, + -1852483, + 9180880, + 7656409, + -21343950, + 2095755, + 29769758, + 6593415 + ]), + FieldElement.fromList([ + -31994208, + -2907461, + 4176912, + 3264766, + 12538965, + -868111, + 26312345, + -6118678, + 30958054, + 8292160 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31429822, + -13959116, + 29173532, + 15632448, + 12174511, + -2760094, + 32808831, + 3977186, + 26143136, + -3148876 + ]), + FieldElement.fromList([ + 22648901, + 1402143, + -22799984, + 13746059, + 7936347, + 365344, + -8668633, + -1674433, + -3758243, + -2304625 + ]), + FieldElement.fromList([ + -15491917, + 8012313, + -2514730, + -12702462, + -23965846, + -10254029, + -1612713, + -1535569, + -16664475, + 8194478 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 27338066, + -7507420, + -7414224, + 10140405, + -19026427, + -6589889, + 27277191, + 8855376, + 28572286, + 3005164 + ]), + FieldElement.fromList([ + 26287124, + 4821776, + 25476601, + -4145903, + -3764513, + -15788984, + -18008582, + 1182479, + -26094821, + -13079595 + ]), + FieldElement.fromList([ + -7171154, + 3178080, + 23970071, + 6201893, + -17195577, + -4489192, + -21876275, + -13982627, + 32208683, + -1198248 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -16657702, + 2817643, + -10286362, + 14811298, + 6024667, + 13349505, + -27315504, + -10497842, + -27672585, + -11539858 + ]), + FieldElement.fromList([ + 15941029, + -9405932, + -21367050, + 8062055, + 31876073, + -238629, + -15278393, + -1444429, + 15397331, + -4130193 + ]), + FieldElement.fromList([ + 8934485, + -13485467, + -23286397, + -13423241, + -32446090, + 14047986, + 31170398, + -1441021, + -27505566, + 15087184 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -18357243, + -2156491, + 24524913, + -16677868, + 15520427, + -6360776, + -15502406, + 11461896, + 16788528, + -5868942 + ]), + FieldElement.fromList([ + -1947386, + 16013773, + 21750665, + 3714552, + -17401782, + -16055433, + -3770287, + -10323320, + 31322514, + -11615635 + ]), + FieldElement.fromList([ + 21426655, + -5650218, + -13648287, + -5347537, + -28812189, + -4920970, + -18275391, + -14621414, + 13040862, + -12112948 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 11293895, + 12478086, + -27136401, + 15083750, + -29307421, + 14748872, + 14555558, + -13417103, + 1613711, + 4896935 + ]), + FieldElement.fromList([ + -25894883, + 15323294, + -8489791, + -8057900, + 25967126, + -13425460, + 2825960, + -4897045, + -23971776, + -11267415 + ]), + FieldElement.fromList([ + -15924766, + -5229880, + -17443532, + 6410664, + 3622847, + 10243618, + 20615400, + 12405433, + -23753030, + -8436416 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -7091295, + 12556208, + -20191352, + 9025187, + -17072479, + 4333801, + 4378436, + 2432030, + 23097949, + -566018 + ]), + FieldElement.fromList([ + 4565804, + -16025654, + 20084412, + -7842817, + 1724999, + 189254, + 24767264, + 10103221, + -18512313, + 2424778 + ]), + FieldElement.fromList([ + 366633, + -11976806, + 8173090, + -6890119, + 30788634, + 5745705, + -7168678, + 1344109, + -3642553, + 12412659 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -24001791, + 7690286, + 14929416, + -168257, + -32210835, + -13412986, + 24162697, + -15326504, + -3141501, + 11179385 + ]), + FieldElement.fromList([ + 18289522, + -14724954, + 8056945, + 16430056, + -21729724, + 7842514, + -6001441, + -1486897, + -18684645, + -11443503 + ]), + FieldElement.fromList([ + 476239, + 6601091, + -6152790, + -9723375, + 17503545, + -4863900, + 27672959, + 13403813, + 11052904, + 5219329 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 20678546, + -8375738, + -32671898, + 8849123, + -5009758, + 14574752, + 31186971, + -3973730, + 9014762, + -8579056 + ]), + FieldElement.fromList([ + -13644050, + -10350239, + -15962508, + 5075808, + -1514661, + -11534600, + -33102500, + 9160280, + 8473550, + -3256838 + ]), + FieldElement.fromList([ + 24900749, + 14435722, + 17209120, + -15292541, + -22592275, + 9878983, + -7689309, + -16335821, + -24568481, + 11788948 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -3118155, + -11395194, + -13802089, + 14797441, + 9652448, + -6845904, + -20037437, + 10410733, + -24568470, + -1458691 + ]), + FieldElement.fromList([ + -15659161, + 16736706, + -22467150, + 10215878, + -9097177, + 7563911, + 11871841, + -12505194, + -18513325, + 8464118 + ]), + FieldElement.fromList([ + -23400612, + 8348507, + -14585951, + -861714, + -3950205, + -6373419, + 14325289, + 8628612, + 33313881, + -8370517 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -20186973, + -4967935, + 22367356, + 5271547, + -1097117, + -4788838, + -24805667, + -10236854, + -8940735, + -5818269 + ]), + FieldElement.fromList([ + -6948785, + -1795212, + -32625683, + -16021179, + 32635414, + -7374245, + 15989197, + -12838188, + 28358192, + -4253904 + ]), + FieldElement.fromList([ + -23561781, + -2799059, + -32351682, + -1661963, + -9147719, + 10429267, + -16637684, + 4072016, + -5351664, + 5596589 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28236598, + -3390048, + 12312896, + 6213178, + 3117142, + 16078565, + 29266239, + 2557221, + 1768301, + 15373193 + ]), + FieldElement.fromList([ + -7243358, + -3246960, + -4593467, + -7553353, + -127927, + -912245, + -1090902, + -4504991, + -24660491, + 3442910 + ]), + FieldElement.fromList([ + -30210571, + 5124043, + 14181784, + 8197961, + 18964734, + -11939093, + 22597931, + 7176455, + -18585478, + 13365930 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -7877390, + -1499958, + 8324673, + 4690079, + 6261860, + 890446, + 24538107, + -8570186, + -9689599, + -3031667 + ]), + FieldElement.fromList([ + 25008904, + -10771599, + -4305031, + -9638010, + 16265036, + 15721635, + 683793, + -11823784, + 15723479, + -15163481 + ]), + FieldElement.fromList([ + -9660625, + 12374379, + -27006999, + -7026148, + -7724114, + -12314514, + 11879682, + 5400171, + 519526, + -1235876 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 22258397, + -16332233, + -7869817, + 14613016, + -22520255, + -2950923, + -20353881, + 7315967, + 16648397, + 7605640 + ]), + FieldElement.fromList([ + -8081308, + -8464597, + -8223311, + 9719710, + 19259459, + -15348212, + 23994942, + -5281555, + -9468848, + 4763278 + ]), + FieldElement.fromList([ + -21699244, + 9220969, + -15730624, + 1084137, + -25476107, + -2852390, + 31088447, + -7764523, + -11356529, + 728112 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 26047220, + -11751471, + -6900323, + -16521798, + 24092068, + 9158119, + -4273545, + -12555558, + -29365436, + -5498272 + ]), + FieldElement.fromList([ + 17510331, + -322857, + 5854289, + 8403524, + 17133918, + -3112612, + -28111007, + 12327945, + 10750447, + 10014012 + ]), + FieldElement.fromList([ + -10312768, + 3936952, + 9156313, + -8897683, + 16498692, + -994647, + -27481051, + -666732, + 3424691, + 7540221 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30322361, + -6964110, + 11361005, + -4143317, + 7433304, + 4989748, + -7071422, + -16317219, + -9244265, + 15258046 + ]), + FieldElement.fromList([ + 13054562, + -2779497, + 19155474, + 469045, + -12482797, + 4566042, + 5631406, + 2711395, + 1062915, + -5136345 + ]), + FieldElement.fromList([ + -19240248, + -11254599, + -29509029, + -7499965, + -5835763, + 13005411, + -6066489, + 12194497, + 32960380, + 1459310 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 19852034, + 7027924, + 23669353, + 10020366, + 8586503, + -6657907, + 394197, + -6101885, + 18638003, + -11174937 + ]), + FieldElement.fromList([ + 31395534, + 15098109, + 26581030, + 8030562, + -16527914, + -5007134, + 9012486, + -7584354, + -6643087, + -5442636 + ]), + FieldElement.fromList([ + -9192165, + -2347377, + -1997099, + 4529534, + 25766844, + 607986, + -13222, + 9677543, + -32294889, + -6456008 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -2444496, + -149937, + 29348902, + 8186665, + 1873760, + 12489863, + -30934579, + -7839692, + -7852844, + -8138429 + ]), + FieldElement.fromList([ + -15236356, + -15433509, + 7766470, + 746860, + 26346930, + -10221762, + -27333451, + 10754588, + -9431476, + 5203576 + ]), + FieldElement.fromList([ + 31834314, + 14135496, + -770007, + 5159118, + 20917671, + -16768096, + -7467973, + -7337524, + 31809243, + 7347066 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -9606723, + -11874240, + 20414459, + 13033986, + 13716524, + -11691881, + 19797970, + -12211255, + 15192876, + -2087490 + ]), + FieldElement.fromList([ + -12663563, + -2181719, + 1168162, + -3804809, + 26747877, + -14138091, + 10609330, + 12694420, + 33473243, + -13382104 + ]), + FieldElement.fromList([ + 33184999, + 11180355, + 15832085, + -11385430, + -1633671, + 225884, + 15089336, + -11023903, + -6135662, + 14480053 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 31308717, + -5619998, + 31030840, + -1897099, + 15674547, + -6582883, + 5496208, + 13685227, + 27595050, + 8737275 + ]), + FieldElement.fromList([ + -20318852, + -15150239, + 10933843, + -16178022, + 8335352, + -7546022, + -31008351, + -12610604, + 26498114, + 66511 + ]), + FieldElement.fromList([ + 22644454, + -8761729, + -16671776, + 4884562, + -3105614, + -13559366, + 30540766, + -4286747, + -13327787, + -7515095 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -28017847, + 9834845, + 18617207, + -2681312, + -3401956, + -13307506, + 8205540, + 13585437, + -17127465, + 15115439 + ]), + FieldElement.fromList([ + 23711543, + -672915, + 31206561, + -8362711, + 6164647, + -9709987, + -33535882, + -1426096, + 8236921, + 16492939 + ]), + FieldElement.fromList([ + -23910559, + -13515526, + -26299483, + -4503841, + 25005590, + -7687270, + 19574902, + 10071562, + 6708380, + -6222424 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 2101391, + -4930054, + 19702731, + 2367575, + -15427167, + 1047675, + 5301017, + 9328700, + 29955601, + -11678310 + ]), + FieldElement.fromList([ + 3096359, + 9271816, + -21620864, + -15521844, + -14847996, + -7592937, + -25892142, + -12635595, + -9917575, + 6216608 + ]), + FieldElement.fromList([ + -32615849, + 338663, + -25195611, + 2510422, + -29213566, + -13820213, + 24822830, + -6146567, + -26767480, + 7525079 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23066649, + -13985623, + 16133487, + -7896178, + -3389565, + 778788, + -910336, + -2782495, + -19386633, + 11994101 + ]), + FieldElement.fromList([ + 21691500, + -13624626, + -641331, + -14367021, + 3285881, + -3483596, + -25064666, + 9718258, + -7477437, + 13381418 + ]), + FieldElement.fromList([ + 18445390, + -4202236, + 14979846, + 11622458, + -1727110, + -3582980, + 23111648, + -6375247, + 28535282, + 15779576 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30098053, + 3089662, + -9234387, + 16662135, + -21306940, + 11308411, + -14068454, + 12021730, + 9955285, + -16303356 + ]), + FieldElement.fromList([ + 9734894, + -14576830, + -7473633, + -9138735, + 2060392, + 11313496, + -18426029, + 9924399, + 20194861, + 13380996 + ]), + FieldElement.fromList([ + -26378102, + -7965207, + -22167821, + 15789297, + -18055342, + -6168792, + -1984914, + 15707771, + 26342023, + 10146099 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -26016874, + -219943, + 21339191, + -41388, + 19745256, + -2878700, + -29637280, + 2227040, + 21612326, + -545728 + ]), + FieldElement.fromList([ + -13077387, + 1184228, + 23562814, + -5970442, + -20351244, + -6348714, + 25764461, + 12243797, + -20856566, + 11649658 + ]), + FieldElement.fromList([ + -10031494, + 11262626, + 27384172, + 2271902, + 26947504, + -15997771, + 39944, + 6114064, + 33514190, + 2333242 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -21433588, + -12421821, + 8119782, + 7219913, + -21830522, + -9016134, + -6679750, + -12670638, + 24350578, + -13450001 + ]), + FieldElement.fromList([ + -4116307, + -11271533, + -23886186, + 4843615, + -30088339, + 690623, + -31536088, + -10406836, + 8317860, + 12352766 + ]), + FieldElement.fromList([ + 18200138, + -14475911, + -33087759, + -2696619, + -23702521, + -9102511, + -23552096, + -2287550, + 20712163, + 6719373 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 26656208, + 6075253, + -7858556, + 1886072, + -28344043, + 4262326, + 11117530, + -3763210, + 26224235, + -3297458 + ]), + FieldElement.fromList([ + -17168938, + -14854097, + -3395676, + -16369877, + -19954045, + 14050420, + 21728352, + 9493610, + 18620611, + -16428628 + ]), + FieldElement.fromList([ + -13323321, + 13325349, + 11432106, + 5964811, + 18609221, + 6062965, + -5269471, + -9725556, + -30701573, + -16479657 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -23860538, + -11233159, + 26961357, + 1640861, + -32413112, + -16737940, + 12248509, + -5240639, + 13735342, + 1934062 + ]), + FieldElement.fromList([ + 25089769, + 6742589, + 17081145, + -13406266, + 21909293, + -16067981, + -15136294, + -3765346, + -21277997, + 5473616 + ]), + FieldElement.fromList([ + 31883677, + -7961101, + 1083432, + -11572403, + 22828471, + 13290673, + -7125085, + 12469656, + 29111212, + -5451014 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 24244947, + -15050407, + -26262976, + 2791540, + -14997599, + 16666678, + 24367466, + 6388839, + -10295587, + 452383 + ]), + FieldElement.fromList([ + -25640782, + -3417841, + 5217916, + 16224624, + 19987036, + -4082269, + -24236251, + -5915248, + 15766062, + 8407814 + ]), + FieldElement.fromList([ + -20406999, + 13990231, + 15495425, + 16395525, + 5377168, + 15166495, + -8917023, + -4388953, + -8067909, + 2276718 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 30157918, + 12924066, + -17712050, + 9245753, + 19895028, + 3368142, + -23827587, + 5096219, + 22740376, + -7303417 + ]), + FieldElement.fromList([ + 2041139, + -14256350, + 7783687, + 13876377, + -25946985, + -13352459, + 24051124, + 13742383, + -15637599, + 13295222 + ]), + FieldElement.fromList([ + 33338237, + -8505733, + 12532113, + 7977527, + 9106186, + -1715251, + -17720195, + -4612972, + -4451357, + -14669444 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -20045281, + 5454097, + -14346548, + 6447146, + 28862071, + 1883651, + -2469266, + -4141880, + 7770569, + 9620597 + ]), + FieldElement.fromList([ + 23208068, + 7979712, + 33071466, + 8149229, + 1758231, + -10834995, + 30945528, + -1694323, + -33502340, + -14767970 + ]), + FieldElement.fromList([ + 1439958, + -16270480, + -1079989, + -793782, + 4625402, + 10647766, + -5043801, + 1220118, + 30494170, + -11440799 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -5037580, + -13028295, + -2970559, + -3061767, + 15640974, + -6701666, + -26739026, + 926050, + -1684339, + -13333647 + ]), + FieldElement.fromList([ + 13908495, + -3549272, + 30919928, + -6273825, + -21521863, + 7989039, + 9021034, + 9078865, + 3353509, + 4033511 + ]), + FieldElement.fromList([ + -29663431, + -15113610, + 32259991, + -344482, + 24295849, + -12912123, + 23161163, + 8839127, + 27485041, + 7356032 + ]), + ), + ]), + List.from([ + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 9661027, + 705443, + 11980065, + -5370154, + -1628543, + 14661173, + -6346142, + 2625015, + 28431036, + -16771834 + ]), + FieldElement.fromList([ + -23839233, + -8311415, + -25945511, + 7480958, + -17681669, + -8354183, + -22545972, + 14150565, + 15970762, + 4099461 + ]), + FieldElement.fromList([ + 29262576, + 16756590, + 26350592, + -8793563, + 8529671, + -11208050, + 13617293, + -9937143, + 11465739, + 8317062 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -25493081, + -6962928, + 32500200, + -9419051, + -23038724, + -2302222, + 14898637, + 3848455, + 20969334, + -5157516 + ]), + FieldElement.fromList([ + -20384450, + -14347713, + -18336405, + 13884722, + -33039454, + 2842114, + -21610826, + -3649888, + 11177095, + 14989547 + ]), + FieldElement.fromList([ + -24496721, + -11716016, + 16959896, + 2278463, + 12066309, + 10137771, + 13515641, + 2581286, + -28487508, + 9930240 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -17751622, + -2097826, + 16544300, + -13009300, + -15914807, + -14949081, + 18345767, + -13403753, + 16291481, + -5314038 + ]), + FieldElement.fromList([ + -33229194, + 2553288, + 32678213, + 9875984, + 8534129, + 6889387, + -9676774, + 6957617, + 4368891, + 9788741 + ]), + FieldElement.fromList([ + 16660756, + 7281060, + -10830758, + 12911820, + 20108584, + -8101676, + -21722536, + -8613148, + 16250552, + -11111103 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -19765507, + 2390526, + -16551031, + 14161980, + 1905286, + 6414907, + 4689584, + 10604807, + -30190403, + 4782747 + ]), + FieldElement.fromList([ + -1354539, + 14736941, + -7367442, + -13292886, + 7710542, + -14155590, + -9981571, + 4383045, + 22546403, + 437323 + ]), + FieldElement.fromList([ + 31665577, + -12180464, + -16186830, + 1491339, + -18368625, + 3294682, + 27343084, + 2786261, + -30633590, + -14097016 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -14467279, + -683715, + -33374107, + 7448552, + 19294360, + 14334329, + -19690631, + 2355319, + -19284671, + -6114373 + ]), + FieldElement.fromList([ + 15121312, + -15796162, + 6377020, + -6031361, + -10798111, + -12957845, + 18952177, + 15496498, + -29380133, + 11754228 + ]), + FieldElement.fromList([ + -2637277, + -13483075, + 8488727, + -14303896, + 12728761, + -1622493, + 7141596, + 11724556, + 22761615, + -10134141 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + 16918416, + 11729663, + -18083579, + 3022987, + -31015732, + -13339659, + -28741185, + -12227393, + 32851222, + 11717399 + ]), + FieldElement.fromList([ + 11166634, + 7338049, + -6722523, + 4531520, + -29468672, + -7302055, + 31474879, + 3483633, + -1193175, + -4030831 + ]), + FieldElement.fromList([ + -185635, + 9921305, + 31456609, + -13536438, + -12013818, + 13348923, + 33142652, + 6546660, + -19985279, + -3948376 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -32460596, + 11266712, + -11197107, + -7899103, + 31703694, + 3855903, + -8537131, + -12833048, + -30772034, + -15486313 + ]), + FieldElement.fromList([ + -18006477, + 12709068, + 3991746, + -6479188, + -21491523, + -10550425, + -31135347, + -16049879, + 10928917, + 3011958 + ]), + FieldElement.fromList([ + -6957757, + -15594337, + 31696059, + 334240, + 29576716, + 14796075, + -30831056, + -12805180, + 18008031, + 10258577 + ]), + ), + PreComputedGroupElement.fromList( + FieldElement.fromList([ + -22448644, + 15655569, + 7018479, + -4410003, + -30314266, + -1201591, + -1853465, + 1367120, + 25127874, + 6671743 + ]), + FieldElement.fromList([ + 29701166, + -14373934, + -10878120, + 9279288, + -17568, + 13127210, + 21382910, + 11042292, + 25838796, + 4642684 + ]), + FieldElement.fromList([ + -20430234, + 14955537, + -24126347, + 8124619, + -5369288, + -5990470, + 30468147, + -13900640, + 18423289, + 4177476 + ]), + ), + ]), +]); diff --git a/ed25519_edwards/lib/src/edwards25519.dart b/ed25519_edwards/lib/src/edwards25519.dart new file mode 100644 index 0000000..c9f1b5b --- /dev/null +++ b/ed25519_edwards/lib/src/edwards25519.dart @@ -0,0 +1,2127 @@ +import 'dart:typed_data'; + +import 'package:adaptive_number/adaptive_number.dart'; +import 'package:ed25519_edwards/src/numbers.dart'; + +import 'const.dart'; + +class FieldElement { + late List innerList; + + FieldElement() { + innerList = List.generate(10, (index) => Number.zero); + } + + FieldElement.fromList(List list) { + innerList = list.map((e) => Number(e)).toList(); + } + + Number operator [](int index) { + return innerList[index]; + } + + void operator []=(int index, Number value) { + innerList[index] = value; + } + + int get length => innerList.length; +} + +void fieldElementCopy( + FieldElement src, int srcPos, FieldElement dest, int destPos, int length) { + dest.innerList.setRange(destPos, length + destPos, src.innerList, srcPos); +} + +void fieldElementFullCopy(FieldElement src, FieldElement dest) { + fieldElementCopy(src, 0, dest, 0, dest.length); +} + +var zero = FieldElement(); + +void FeZero(FieldElement fe) { + fieldElementFullCopy(zero, fe); +} + +void FeOne(FieldElement fe) { + FeZero(fe); + fe[0] = Number.one; +} + +void FeAdd(FieldElement dst, FieldElement a, FieldElement b) { + dst[0] = a[0] + b[0]; + dst[1] = a[1] + b[1]; + dst[2] = a[2] + b[2]; + dst[3] = a[3] + b[3]; + dst[4] = a[4] + b[4]; + dst[5] = a[5] + b[5]; + dst[6] = a[6] + b[6]; + dst[7] = a[7] + b[7]; + dst[8] = a[8] + b[8]; + dst[9] = a[9] + b[9]; +} + +void FeSub(FieldElement dst, FieldElement a, FieldElement b) { + dst[0] = a[0] - b[0]; + dst[1] = a[1] - b[1]; + dst[2] = a[2] - b[2]; + dst[3] = a[3] - b[3]; + dst[4] = a[4] - b[4]; + dst[5] = a[5] - b[5]; + dst[6] = a[6] - b[6]; + dst[7] = a[7] - b[7]; + dst[8] = a[8] - b[8]; + dst[9] = a[9] - b[9]; +} + +void FeCopy(FieldElement dst, FieldElement src) { + fieldElementFullCopy(src, dst); +} + +/// Replace (f,g) with (g,g) if b == 1; +/// replace (f,g) with (f,g) if b == 0. +/// +/// Preconditions: b in {0,1}. +void FeCMove(FieldElement f, FieldElement g, Number b) { + b = -b; + f[0] ^= b & (f[0] ^ g[0]); + f[1] ^= b & (f[1] ^ g[1]); + f[2] ^= b & (f[2] ^ g[2]); + f[3] ^= b & (f[3] ^ g[3]); + f[4] ^= b & (f[4] ^ g[4]); + f[5] ^= b & (f[5] ^ g[5]); + f[6] ^= b & (f[6] ^ g[6]); + f[7] ^= b & (f[7] ^ g[7]); + f[8] ^= b & (f[8] ^ g[8]); + f[9] ^= b & (f[9] ^ g[9]); +} + +Number load3(Uint8List input) { + int r; + r = input[0]; + r |= input[1] << 8; + r |= input[2] << 16; + return Number(r); +} + +Number load4(Uint8List input) { + int r; + r = input[0]; + r |= input[1] << 8; + r |= input[2] << 16; + r |= input[3] << 24; + return Number(r); +} + +void FeFromBytes(FieldElement dst, Uint8List src) { + var h0 = load4(src.sublist(0, src.length)); + var h1 = load3(src.sublist(4, src.length)) << 6; + var h2 = load3(src.sublist(7, src.length)) << 5; + var h3 = load3(src.sublist(10, src.length)) << 3; + var h4 = load3(src.sublist(13, src.length)) << 2; + var h5 = load4(src.sublist(16, src.length)); + var h6 = load3(src.sublist(20, src.length)) << 7; + var h7 = load3(src.sublist(23, src.length)) << 5; + var h8 = load3(src.sublist(26, src.length)) << 4; + var h9 = (load3(src.sublist(29, src.length)) & Number(8388607)) << 2; + + FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); +} + +/// FeToBytes marshals h to s. +/// Preconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +/// +/// Write p=2^255-19; q=floor(h/p). +/// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). +/// +/// Proof: +/// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. +/// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. +/// +/// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). +/// Then 0.filled(10, Number.zero); + + var q = (Numbers.v19 * h[9] + (Number.one << 24)) >> 25; + q = (h[0] + q) >> 26; + q = (h[1] + q) >> 25; + q = (h[2] + q) >> 26; + q = (h[3] + q) >> 25; + q = (h[4] + q) >> 26; + q = (h[5] + q) >> 25; + q = (h[6] + q) >> 26; + q = (h[7] + q) >> 25; + q = (h[8] + q) >> 26; + q = (h[9] + q) >> 25; + + // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. + h[0] += Numbers.v19 * q; + // Goal: Output h-2^255 q, which is between 0 and 2^255-20. + + carry[0] = h[0] >> 26; + h[1] += carry[0]; + h[0] -= carry[0] << 26; + carry[1] = h[1] >> 25; + h[2] += carry[1]; + h[1] -= carry[1] << 25; + carry[2] = h[2] >> 26; + h[3] += carry[2]; + h[2] -= carry[2] << 26; + carry[3] = h[3] >> 25; + h[4] += carry[3]; + h[3] -= carry[3] << 25; + carry[4] = h[4] >> 26; + h[5] += carry[4]; + h[4] -= carry[4] << 26; + carry[5] = h[5] >> 25; + h[6] += carry[5]; + h[5] -= carry[5] << 25; + carry[6] = h[6] >> 26; + h[7] += carry[6]; + h[6] -= carry[6] << 26; + carry[7] = h[7] >> 25; + h[8] += carry[7]; + h[7] -= carry[7] << 25; + carry[8] = h[8] >> 26; + h[9] += carry[8]; + h[8] -= carry[8] << 26; + carry[9] = h[9] >> 25; + h[9] -= carry[9] << 25; + // h10 = carry9 + + // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; + // evidently 2^255 h10-2^255 q = 0. + // Goal: Output h[0]+...+2^230 h[9]. + + s[0] = (h[0] >> 0).intValue; + s[1] = (h[0] >> 8).intValue; + s[2] = (h[0] >> 16).intValue; + s[3] = ((h[0] >> 24) | (h[1] << 2)).intValue; + s[4] = (h[1] >> 6).intValue; + s[5] = (h[1] >> 14).intValue; + s[6] = ((h[1] >> 22) | (h[2] << 3)).intValue; + s[7] = (h[2] >> 5).intValue; + s[8] = (h[2] >> 13).intValue; + s[9] = ((h[2] >> 21) | (h[3] << 5)).intValue; + s[10] = (h[3] >> 3).intValue; + s[11] = (h[3] >> 11).intValue; + s[12] = ((h[3] >> 19) | (h[4] << 6)).intValue; + s[13] = (h[4] >> 2).intValue; + s[14] = (h[4] >> 10).intValue; + s[15] = (h[4] >> 18).intValue; + s[16] = (h[5] >> 0).intValue; + s[17] = (h[5] >> 8).intValue; + s[18] = (h[5] >> 16).intValue; + s[19] = ((h[5] >> 24) | (h[6] << 1)).intValue; + s[20] = (h[6] >> 7).intValue; + s[21] = (h[6] >> 15).intValue; + s[22] = ((h[6] >> 23) | (h[7] << 3)).intValue; + s[23] = (h[7] >> 5).intValue; + s[24] = (h[7] >> 13).intValue; + s[25] = ((h[7] >> 21) | (h[8] << 4)).intValue; + s[26] = (h[8] >> 4).intValue; + s[27] = (h[8] >> 12).intValue; + s[28] = ((h[8] >> 20) | (h[9] << 6)).intValue; + s[29] = (h[9] >> 2).intValue; + s[30] = (h[9] >> 10).intValue; + s[31] = (h[9] >> 18).intValue; +} + +int FeIsNegative(FieldElement f) { + var s = Uint8List(32); + FeToBytes(s, f); + return s[0] & 1; +} + +int FeIsNonZero(FieldElement f) { + var s = Uint8List(32); + FeToBytes(s, f); + var x = 0; + for (var i = 0; i < s.length; i++) { + x |= s[i]; + } + x |= x >> 4; + x |= x >> 2; + x |= x >> 1; + return x & 1; +} + +/// FeNeg sets h = -f +/// +/// Preconditions: +/// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +void FeNeg(FieldElement h, FieldElement f) { + h[0] = -f[0]; + h[1] = -f[1]; + h[2] = -f[2]; + h[3] = -f[3]; + h[4] = -f[4]; + h[5] = -f[5]; + h[6] = -f[6]; + h[7] = -f[7]; + h[8] = -f[8]; + h[9] = -f[9]; +} + +void FeCombine(FieldElement h, Number h0, Number h1, Number h2, Number h3, + Number h4, Number h5, Number h6, Number h7, Number h8, Number h9) { + var c0 = Number.zero; + var c1 = Number.zero; + var c2 = Number.zero; + var c3 = Number.zero; + var c4 = Number.zero; + var c5 = Number.zero; + var c6 = Number.zero; + var c7 = Number.zero; + var c8 = Number.zero; + var c9 = Number.zero; + + /* + |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 + */ + + c0 = (h0 + (Number.one << 25)) >> 26; + h1 += c0; + h0 -= c0 << 26; + c4 = (h4 + (Number.one << 25)) >> 26; + h5 += c4; + h4 -= c4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.51*2^58 */ + /* |h5| <= 1.51*2^58 */ + + c1 = (h1 + (Number.one << 24)) >> 25; + h2 += c1; + h1 -= c1 << 25; + c5 = (h5 + (Number.one << 24)) >> 25; + h6 += c5; + h5 -= c5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.21*2^59 */ + /* |h6| <= 1.21*2^59 */ + + c2 = (h2 + (Number.one << 25)) >> 26; + h3 += c2; + h2 -= c2 << 26; + c6 = (h6 + (Number.one << 25)) >> 26; + h7 += c6; + h6 -= c6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.51*2^58 */ + /* |h7| <= 1.51*2^58 */ + + c3 = (h3 + (Number.one << 24)) >> 25; + h4 += c3; + h3 -= c3 << 25; + c7 = (h7 + (Number.one << 24)) >> 25; + h8 += c7; + h7 -= c7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.52*2^33 */ + /* |h8| <= 1.52*2^33 */ + + c4 = (h4 + (Number.one << 25)) >> 26; + h5 += c4; + h4 -= c4 << 26; + c8 = (h8 + (Number.one << 25)) >> 26; + h9 += c8; + h8 -= c8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.51*2^58 */ + + c9 = (h9 + (Number.one << 24)) >> 25; + h0 += c9 * Numbers.v19; + h9 -= c9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.8*2^37 */ + + c0 = (h0 + (Number.one << 25)) >> 26; + h1 += c0; + h0 -= c0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/// FeMul calculates h = f * g +/// Can overlap h with f or g. +/// +/// Preconditions: +/// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +/// +/// Notes on implementation strategy: +/// +/// Using schoolbook multiplication. +/// Karatsuba would save a little in some cost models. +/// +/// Most multiplications by 2 and 19 are 32-bit precomputations; +/// cheaper than 64-bit postcomputations. +/// +/// There is one remaining multiplication by 19 in the carry chain; +/// one *19 precomputation can be merged into this, +/// but the resulting data flow is considerably less clean. +/// +/// There are 12 carries below. +/// 10 of them are 2-way parallelizable and vectorizable. +/// Can get away with 11 carries, but then data flow is much deeper. +/// +/// With tighter constraints on inputs, can squeeze carries into int32. +void FeMul(FieldElement h, FieldElement f, FieldElement g) { + var f0 = f[0]; + var f1 = f[1]; + var f2 = f[2]; + var f3 = f[3]; + var f4 = f[4]; + var f5 = f[5]; + var f6 = f[6]; + var f7 = f[7]; + var f8 = f[8]; + var f9 = f[9]; + + var f1_2 = Number.two * f[1]; + var f3_2 = Number.two * f[3]; + var f5_2 = Number.two * f[5]; + var f7_2 = Number.two * f[7]; + var f9_2 = Number.two * f[9]; + + var g0 = g[0]; + var g1 = g[1]; + var g2 = g[2]; + var g3 = g[3]; + var g4 = g[4]; + var g5 = g[5]; + var g6 = g[6]; + var g7 = g[7]; + var g8 = g[8]; + var g9 = g[9]; + + var g1_19 = Numbers.v19 * g[1]; /* 1.4*2^29 */ + var g2_19 = Numbers.v19 * g[2]; /* 1.4*2^30; still ok */ + var g3_19 = Numbers.v19 * g[3]; + var g4_19 = Numbers.v19 * g[4]; + var g5_19 = Numbers.v19 * g[5]; + var g6_19 = Numbers.v19 * g[6]; + var g7_19 = Numbers.v19 * g[7]; + var g8_19 = Numbers.v19 * g[8]; + var g9_19 = Numbers.v19 * g[9]; + + var h0 = f0 * g0 + + f1_2 * g9_19 + + f2 * g8_19 + + f3_2 * g7_19 + + f4 * g6_19 + + f5_2 * g5_19 + + f6 * g4_19 + + f7_2 * g3_19 + + f8 * g2_19 + + f9_2 * g1_19; + var h1 = f0 * g1 + + f1 * g0 + + f2 * g9_19 + + f3 * g8_19 + + f4 * g7_19 + + f5 * g6_19 + + f6 * g5_19 + + f7 * g4_19 + + f8 * g3_19 + + f9 * g2_19; + var h2 = f0 * g2 + + f1_2 * g1 + + f2 * g0 + + f3_2 * g9_19 + + f4 * g8_19 + + f5_2 * g7_19 + + f6 * g6_19 + + f7_2 * g5_19 + + f8 * g4_19 + + f9_2 * g3_19; + var h3 = f0 * g3 + + f1 * g2 + + f2 * g1 + + f3 * g0 + + f4 * g9_19 + + f5 * g8_19 + + f6 * g7_19 + + f7 * g6_19 + + f8 * g5_19 + + f9 * g4_19; + var h4 = f0 * g4 + + f1_2 * g3 + + f2 * g2 + + f3_2 * g1 + + f4 * g0 + + f5_2 * g9_19 + + f6 * g8_19 + + f7_2 * g7_19 + + f8 * g6_19 + + f9_2 * g5_19; + var h5 = f0 * g5 + + f1 * g4 + + f2 * g3 + + f3 * g2 + + f4 * g1 + + f5 * g0 + + f6 * g9_19 + + f7 * g8_19 + + f8 * g7_19 + + f9 * g6_19; + var h6 = f0 * g6 + + f1_2 * g5 + + f2 * g4 + + f3_2 * g3 + + f4 * g2 + + f5_2 * g1 + + f6 * g0 + + f7_2 * g9_19 + + f8 * g8_19 + + f9_2 * g7_19; + var h7 = f0 * g7 + + f1 * g6 + + f2 * g5 + + f3 * g4 + + f4 * g3 + + f5 * g2 + + f6 * g1 + + f7 * g0 + + f8 * g9_19 + + f9 * g8_19; + var h8 = f0 * g8 + + f1_2 * g7 + + f2 * g6 + + f3_2 * g5 + + f4 * g4 + + f5_2 * g3 + + f6 * g2 + + f7_2 * g1 + + f8 * g0 + + f9_2 * g9_19; + var h9 = f0 * g9 + + f1 * g8 + + f2 * g7 + + f3 * g6 + + f4 * g5 + + f5 * g4 + + f6 * g3 + + f7 * g2 + + f8 * g1 + + f9 * g0; + + FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); +} + +List feSquare(FieldElement f) { + var f0 = f[0]; + var f1 = f[1]; + var f2 = f[2]; + var f3 = f[3]; + var f4 = f[4]; + var f5 = f[5]; + var f6 = f[6]; + var f7 = f[7]; + var f8 = f[8]; + var f9 = f[9]; + var f0_2 = Number.two * f[0]; + var f1_2 = Number.two * f[1]; + var f2_2 = Number.two * f[2]; + var f3_2 = Number.two * f[3]; + var f4_2 = Number.two * f[4]; + var f5_2 = Number.two * f[5]; + var f6_2 = Number.two * f[6]; + var f7_2 = Number.two * f[7]; + var f5_38 = Numbers.v38 * f5; // 1.31*2^30 + var f6_19 = Numbers.v19 * f6; // 1.31*2^30 + var f7_38 = Numbers.v38 * f7; // 1.31*2^30 + var f8_19 = Numbers.v19 * f8; // 1.31*2^30 + var f9_38 = Numbers.v38 * f9; // 1.31*2^30 + + var h0 = f0 * f0 + + f1_2 * f9_38 + + f2_2 * f8_19 + + f3_2 * f7_38 + + f4_2 * f6_19 + + f5 * f5_38; + var h1 = f0_2 * f1 + f2 * f9_38 + f3_2 * f8_19 + f4 * f7_38 + f5_2 * f6_19; + var h2 = f0_2 * f2 + + f1_2 * f1 + + f3_2 * f9_38 + + f4_2 * f8_19 + + f5_2 * f7_38 + + f6 * f6_19; + var h3 = f0_2 * f3 + f1_2 * f2 + f4 * f9_38 + f5_2 * f8_19 + f6 * f7_38; + var h4 = f0_2 * f4 + + f1_2 * f3_2 + + f2 * f2 + + f5_2 * f9_38 + + f6_2 * f8_19 + + f7 * f7_38; + var h5 = f0_2 * f5 + f1_2 * f4 + f2_2 * f3 + f6 * f9_38 + f7_2 * f8_19; + var h6 = f0_2 * f6 + + f1_2 * f5_2 + + f2_2 * f4 + + f3_2 * f3 + + f7_2 * f9_38 + + f8 * f8_19; + var h7 = f0_2 * f7 + f1_2 * f6 + f2_2 * f5 + f3_2 * f4 + f8 * f9_38; + var h8 = + f0_2 * f8 + f1_2 * f7_2 + f2_2 * f6 + f3_2 * f5_2 + f4 * f4 + f9 * f9_38; + var h9 = f0_2 * f9 + f1_2 * f8 + f2_2 * f7 + f3_2 * f6 + f4_2 * f5; + + return [h0, h1, h2, h3, h4, h5, h6, h7, h8, h9]; +} + +/// FeSquare calculates h = f*f. Can overlap h with f. +/// +/// Preconditions: +/// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +void FeSquare(FieldElement h, FieldElement f) { + var fs = feSquare(f); + var h0 = fs[0]; + var h1 = fs[1]; + var h2 = fs[2]; + var h3 = fs[3]; + var h4 = fs[4]; + var h5 = fs[5]; + var h6 = fs[6]; + var h7 = fs[7]; + var h8 = fs[8]; + var h9 = fs[9]; + FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); +} + +/// FeSquare2 sets h = 2 * f * f +/// +/// Can overlap h with f. +/// +/// Preconditions: +/// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +/// See fe_mul.c for discussion of implementation strategy. +void FeSquare2(FieldElement h, FieldElement f) { + var fs = feSquare(f); + var h0 = fs[0]; + var h1 = fs[1]; + var h2 = fs[2]; + var h3 = fs[3]; + var h4 = fs[4]; + var h5 = fs[5]; + var h6 = fs[6]; + var h7 = fs[7]; + var h8 = fs[8]; + var h9 = fs[9]; + + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + + FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); +} + +void FeInvert(FieldElement out, FieldElement z) { + var t0 = FieldElement(); + var t1 = FieldElement(); + var t2 = FieldElement(); + var t3 = FieldElement(); + var i = 0; + + FeSquare(t0, z); // 2^1 + FeSquare(t1, t0); // 2^2 + for (i = 1; i < 2; i++) { + // 2^3 + FeSquare(t1, t1); + } + FeMul(t1, z, t1); // 2^3 + 2^0 + FeMul(t0, t0, t1); // 2^3 + 2^1 + 2^0 + FeSquare(t2, t0); // 2^4 + 2^2 + 2^1 + FeMul(t1, t1, t2); // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 + FeSquare(t2, t1); // 5,4,3,2,1 + for (i = 1; i < 5; i++) { + // 9,8,7,6,5 + FeSquare(t2, t2); + } + FeMul(t1, t2, t1); // 9,8,7,6,5,4,3,2,1,0 + FeSquare(t2, t1); // 10..1 + for (i = 1; i < 10; i++) { + // 19..10 + FeSquare(t2, t2); + } + FeMul(t2, t2, t1); // 19..0 + FeSquare(t3, t2); // 20..1 + for (i = 1; i < 20; i++) { + // 39..20 + FeSquare(t3, t3); + } + FeMul(t2, t3, t2); // 39..0 + FeSquare(t2, t2); // 40..1 + for (i = 1; i < 10; i++) { + // 49..10 + FeSquare(t2, t2); + } + FeMul(t1, t2, t1); // 49..0 + FeSquare(t2, t1); // 50..1 + for (i = 1; i < 50; i++) { + // 99..50 + FeSquare(t2, t2); + } + FeMul(t2, t2, t1); // 99..0 + FeSquare(t3, t2); // 100..1 + for (i = 1; i < 100; i++) { + // 199..100 + FeSquare(t3, t3); + } + FeMul(t2, t3, t2); // 199..0 + FeSquare(t2, t2); // 200..1 + for (i = 1; i < 50; i++) { + // 249..50 + FeSquare(t2, t2); + } + FeMul(t1, t2, t1); // 249..0 + FeSquare(t1, t1); // 250..1 + for (i = 1; i < 5; i++) { + // 254..5 + FeSquare(t1, t1); + } + FeMul(out, t1, t0); // 254..5,3,1,0 +} + +void fePow22523(FieldElement out, FieldElement z) { + var t0 = FieldElement(); + var t1 = FieldElement(); + var t2 = FieldElement(); + var i = 0; + + FeSquare(t0, z); + for (i = 1; i < 1; i++) { + FeSquare(t0, t0); + } + FeSquare(t1, t0); + for (i = 1; i < 2; i++) { + FeSquare(t1, t1); + } + FeMul(t1, z, t1); + FeMul(t0, t0, t1); + FeSquare(t0, t0); + for (i = 1; i < 1; i++) { + FeSquare(t0, t0); + } + FeMul(t0, t1, t0); + FeSquare(t1, t0); + for (i = 1; i < 5; i++) { + FeSquare(t1, t1); + } + FeMul(t0, t1, t0); + FeSquare(t1, t0); + for (i = 1; i < 10; i++) { + FeSquare(t1, t1); + } + FeMul(t1, t1, t0); + FeSquare(t2, t1); + for (i = 1; i < 20; i++) { + FeSquare(t2, t2); + } + FeMul(t1, t2, t1); + FeSquare(t1, t1); + for (i = 1; i < 10; i++) { + FeSquare(t1, t1); + } + FeMul(t0, t1, t0); + FeSquare(t1, t0); + for (i = 1; i < 50; i++) { + FeSquare(t1, t1); + } + FeMul(t1, t1, t0); + FeSquare(t2, t1); + for (i = 1; i < 100; i++) { + FeSquare(t2, t2); + } + FeMul(t1, t2, t1); + FeSquare(t1, t1); + for (i = 1; i < 50; i++) { + FeSquare(t1, t1); + } + FeMul(t0, t1, t0); + FeSquare(t0, t0); + for (i = 1; i < 2; i++) { + FeSquare(t0, t0); + } + FeMul(out, t0, z); +} + +/// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 * +/// y^2 where d = -121665/121666. +/// +/// Several representations are used: +/// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z +/// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT +/// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T +/// PreComputedGroupElement: (y+x,y-x,2dxy) +class ProjectiveGroupElement { + FieldElement X = FieldElement(); + FieldElement Y = FieldElement(); + FieldElement Z = FieldElement(); + + void Zero() { + FeZero(X); + FeOne(Y); + FeOne(Z); + } + + void Double(CompletedGroupElement r) { + var t0 = FieldElement(); + + FeSquare(r.X, X); + FeSquare(r.Z, Y); + FeSquare2(r.T, Z); + FeAdd(r.Y, X, Y); + FeSquare(t0, r.Y); + FeAdd(r.Y, r.Z, r.X); + FeSub(r.Z, r.Z, r.X); + FeSub(r.X, t0, r.Y); + FeSub(r.T, r.T, r.Z); + } + + void ToBytes(Uint8List s) { + var recip = FieldElement(); + var x = FieldElement(); + var y = FieldElement(); + + FeInvert(recip, Z); + FeMul(x, X, recip); + FeMul(y, Y, recip); + FeToBytes(s, y); + s[31] ^= FeIsNegative(x) << 7; + } +} + +class ExtendedGroupElement { + FieldElement X = FieldElement(); + FieldElement Y = FieldElement(); + FieldElement Z = FieldElement(); + FieldElement T = FieldElement(); + + void Zero() { + FeZero(X); + FeOne(Y); + FeOne(Z); + FeZero(T); + } + + void Double(CompletedGroupElement r) { + var q = ProjectiveGroupElement(); + ToProjective(q); + q.Double(r); + } + + void ToCached(CachedGroupElement r) { + FeAdd(r.yPlusX, Y, X); + FeSub(r.yMinusX, Y, X); + FeCopy(r.Z, Z); + FeMul(r.T2d, T, d2); + } + + void ToProjective(ProjectiveGroupElement r) { + FeCopy(r.X, X); + FeCopy(r.Y, Y); + FeCopy(r.Z, Z); + } + + void ToBytes(Uint8List s) { + var recip = FieldElement(); + var x = FieldElement(); + var y = FieldElement(); + + FeInvert(recip, Z); + FeMul(x, X, recip); + FeMul(y, Y, recip); + FeToBytes(s, y); + s[31] ^= FeIsNegative(x) << 7; + } + + bool FromBytes(Uint8List s) { + var u = FieldElement(); + var v = FieldElement(); + var v3 = FieldElement(); + var vxx = FieldElement(); + var check = FieldElement(); + + FeFromBytes(Y, s); + FeOne(Z); + FeSquare(u, Y); + FeMul(v, u, d); + FeSub(u, u, Z); // y = y^2-1 + FeAdd(v, v, Z); // v = dy^2+1 + + FeSquare(v3, v); + FeMul(v3, v3, v); // v3 = v^3 + FeSquare(X, v3); + FeMul(X, X, v); + FeMul(X, X, u); // x = uv^7 + + fePow22523(X, X); // x = (uv^7)^((q-5)/8) + FeMul(X, X, v3); + FeMul(X, X, u); // x = uv^3(uv^7)^((q-5)/8) + + var tmpX = Uint8List(32); + var tmp2 = Uint8List(32); + + FeSquare(vxx, X); + FeMul(vxx, vxx, v); + FeSub(check, vxx, u); // vx^2-u + if (FeIsNonZero(check) == 1) { + FeAdd(check, vxx, u); // vx^2+u + if (FeIsNonZero(check) == 1) { + return false; + } + FeMul(X, X, SqrtM1); + + FeToBytes(tmpX, X); + for (var i = 0; i < tmp2.length; i++) { + tmp2[31 - i] = tmp2[i]; + } + } + + if (FeIsNegative(X) != (s[31] >> 7)) { + FeNeg(X, X); + } + + FeMul(T, X, Y); + return true; + } +} + +class CompletedGroupElement { + FieldElement X = FieldElement(); + FieldElement Y = FieldElement(); + FieldElement Z = FieldElement(); + FieldElement T = FieldElement(); + + void ToProjective(ProjectiveGroupElement r) { + FeMul(r.X, X, T); + FeMul(r.Y, Y, Z); + FeMul(r.Z, Z, T); + } + + void ToExtended(ExtendedGroupElement r) { + FeMul(r.X, X, T); + FeMul(r.Y, Y, Z); + FeMul(r.Z, Z, T); + FeMul(r.T, X, Y); + } +} + +class PreComputedGroupElement { + FieldElement yPlusX = FieldElement(); + FieldElement yMinusX = FieldElement(); + FieldElement xy2d = FieldElement(); + + PreComputedGroupElement(); + + PreComputedGroupElement.fromList( + FieldElement ypx, FieldElement ymx, FieldElement xy2d) { + yPlusX = ypx; + yMinusX = ymx; + this.xy2d = xy2d; + } + + void Zero() { + FeOne(yPlusX); + FeOne(yMinusX); + FeZero(xy2d); + } +} + +class CachedGroupElement { + FieldElement yPlusX = FieldElement(); + FieldElement yMinusX = FieldElement(); + FieldElement Z = FieldElement(); + FieldElement T2d = FieldElement(); +} + +void geAdd( + CompletedGroupElement r, ExtendedGroupElement p, CachedGroupElement q) { + var t0 = FieldElement(); + + FeAdd(r.X, p.Y, p.X); + FeSub(r.Y, p.Y, p.X); + FeMul(r.Z, r.X, q.yPlusX); + FeMul(r.Y, r.Y, q.yMinusX); + FeMul(r.T, q.T2d, p.T); + FeMul(r.X, p.Z, q.Z); + FeAdd(t0, r.X, r.X); + FeSub(r.X, r.Z, r.Y); + FeAdd(r.Y, r.Z, r.Y); + FeAdd(r.Z, t0, r.T); + FeSub(r.T, t0, r.T); +} + +void geSub( + CompletedGroupElement r, ExtendedGroupElement p, CachedGroupElement q) { + var t0 = FieldElement(); + + FeAdd(r.X, p.Y, p.X); + FeSub(r.Y, p.Y, p.X); + FeMul(r.Z, r.X, q.yMinusX); + FeMul(r.Y, r.Y, q.yPlusX); + FeMul(r.T, q.T2d, p.T); + FeMul(r.X, p.Z, q.Z); + FeAdd(t0, r.X, r.X); + FeSub(r.X, r.Z, r.Y); + FeAdd(r.Y, r.Z, r.Y); + FeSub(r.Z, t0, r.T); + FeAdd(r.T, t0, r.T); +} + +void geMixedAdd(CompletedGroupElement r, ExtendedGroupElement p, + PreComputedGroupElement q) { + var t0 = FieldElement(); + + FeAdd(r.X, p.Y, p.X); + FeSub(r.Y, p.Y, p.X); + FeMul(r.Z, r.X, q.yPlusX); + FeMul(r.Y, r.Y, q.yMinusX); + FeMul(r.T, q.xy2d, p.T); + FeAdd(t0, p.Z, p.Z); + FeSub(r.X, r.Z, r.Y); + FeAdd(r.Y, r.Z, r.Y); + FeAdd(r.Z, t0, r.T); + FeSub(r.T, t0, r.T); +} + +void geMixedSub(CompletedGroupElement r, ExtendedGroupElement p, + PreComputedGroupElement q) { + var t0 = FieldElement(); + + FeAdd(r.X, p.Y, p.X); + FeSub(r.Y, p.Y, p.X); + FeMul(r.Z, r.X, q.yMinusX); + FeMul(r.Y, r.Y, q.yPlusX); + FeMul(r.T, q.xy2d, p.T); + FeAdd(t0, p.Z, p.Z); + FeSub(r.X, r.Z, r.Y); + FeAdd(r.Y, r.Z, r.Y); + FeSub(r.Z, t0, r.T); + FeAdd(r.T, t0, r.T); +} + +void slide(Int8List r, Uint8List a) { + for (var i = 0; i < r.length; i++) { + r[i] = 1 & (a[i >> 3] >> (i & 7)); + } + + for (var i = 0; i < r.length; i++) { + if (r[i] != 0) { + for (var b = 1; b <= 6 && i + b < 256; b++) { + if (r[i + b] != 0) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; + r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + for (var k = i + b; k < 256; k++) { + if (r[k] == 0) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else { + break; + } + } + } + } + } +} + +/// GeDoubleScalarMultVartime sets r = a*A + b*B +/// where a = a[0]+256*a[1]+...+256^31 a[31]. +/// and b = b[0]+256*b[1]+...+256^31 b[31]. +/// B is the Ed25519 base point (x,4/5) with x positive. +void GeDoubleScalarMultVartime(ProjectiveGroupElement r, Uint8List a, + ExtendedGroupElement A, Uint8List b) { + var aSlide = Int8List(256); + var bSlide = Int8List(256); + var Ai = List.generate( + 8, (index) => CachedGroupElement()); // A,3A,5A,7A,9A,11A,13A,15A + var t = CompletedGroupElement(); + var u = ExtendedGroupElement(); + var A2 = ExtendedGroupElement(); + int i; + + slide(aSlide, a); + slide(bSlide, b); + + A.ToCached(Ai[0]); + A.Double(t); + t.ToExtended(A2); + + for (i = 0; i < 7; i++) { + geAdd(t, A2, Ai[i]); + t.ToExtended(u); + u.ToCached(Ai[i + 1]); + } + + r.Zero(); + + for (i = 255; i >= 0; i--) { + if (aSlide[i] != 0 || bSlide[i] != 0) { + break; + } + } + + for (; i >= 0; i--) { + r.Double(t); + + if (aSlide[i] > 0) { + t.ToExtended(u); + geAdd(t, u, Ai[aSlide[i] ~/ 2]); + } else if (aSlide[i] < 0) { + t.ToExtended(u); + geSub(t, u, Ai[(-aSlide[i]) ~/ 2]); + } + + if (bSlide[i] > 0) { + t.ToExtended(u); + geMixedAdd(t, u, bi[bSlide[i] ~/ 2]); + } else if (bSlide[i] < 0) { + t.ToExtended(u); + geMixedSub(t, u, bi[(-bSlide[i]) ~/ 2]); + } + + t.ToProjective(r); + } +} + +/// equal returns 1 if b == c and 0 otherwise, assuming that b and c are +/// non-negative. +Number equal(Number b, Number c) { + if (b == c) { + return Number.one; + } else { + return Number.zero; + } +// var x = b ^ c; +// x--; +// return x >> 31; +} + +/// negative returns 1 if b < 0 and 0 otherwise. +Number negative(Number b) { + if (b < Number.zero) { + return Number.one; + } else { + return Number.zero; + } +// return (b >> 31) & 1; +} + +void PreComputedGroupElementCMove( + PreComputedGroupElement t, PreComputedGroupElement u, Number b) { + FeCMove(t.yPlusX, u.yPlusX, b); + FeCMove(t.yMinusX, u.yMinusX, b); + FeCMove(t.xy2d, u.xy2d, b); +} + +void selectPoint(PreComputedGroupElement t, int pos, Number b) { + var minusT = PreComputedGroupElement(); + var bNegative = negative(b); + var bAbs = b - (((-bNegative) & b) << 1); + + t.Zero(); + for (var i = 0; i < 8; i++) { + PreComputedGroupElementCMove(t, base[pos][i], equal(bAbs, Number(i + 1))); + } + FeCopy(minusT.yPlusX, t.yMinusX); + FeCopy(minusT.yMinusX, t.yPlusX); + FeNeg(minusT.xy2d, t.xy2d); + PreComputedGroupElementCMove(t, minusT, bNegative); +} + +/// GeScalarMultBase computes h = a*B, where +/// a = a[0]+256*a[1]+...+256^31 a[31] +/// B is the Ed25519 base point (x,4/5) with x positive. +/// +/// Preconditions: +/// a[31] <= 127 +void GeScalarMultBase(ExtendedGroupElement h, Uint8List a) { + var e = List.filled(64, Number.zero); + + for (var i = 0; i < a.length; i++) { + var v = a[i]; + e[2 * i] = Number(v) & Numbers.v15; + e[2 * i + 1] = Number((v >> 4)) & Numbers.v15; + } + + // each e[i] is between 0 and 15 and e[63] is between 0 and 7. + + var carry = Number.zero; + for (var i = 0; i < 63; i++) { + e[i] += carry; + carry = (e[i] + Numbers.v8) >> 4; + e[i] -= carry << 4; + } + e[63] += carry; + // each e[i] is between -8 and 8. + + h.Zero(); + var t = PreComputedGroupElement(); + var r = CompletedGroupElement(); + for (var i = 1; i < 64; i += 2) { + selectPoint(t, i ~/ 2, e[i]); + geMixedAdd(r, h, t); + r.ToExtended(h); + } + + var s = ProjectiveGroupElement(); + + h.Double(r); + r.ToProjective(s); + s.Double(r); + r.ToProjective(s); + s.Double(r); + r.ToProjective(s); + s.Double(r); + r.ToExtended(h); + + for (var i = 0; i < 64; i += 2) { + selectPoint(t, i ~/ 2, e[i]); + geMixedAdd(r, h, t); + r.ToExtended(h); + } +} + +/// The scalars are GF(2^252 + 27742317777372353535851937790883648493). + +/// Input: +/// a[0]+256*a[1]+...+256^31*a[31] = a +/// b[0]+256*b[1]+...+256^31*b[31] = b +/// c[0]+256*c[1]+...+256^31*c[31] = c +/// +/// Output: +/// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l +/// where l = 2^252 + 27742317777372353535851937790883648493. +void ScMulAdd(Uint8List s, Uint8List a, Uint8List b, Uint8List c) { + var a0 = Numbers.v2097151 & load3(a.sublist(0, a.length)); + var a1 = Numbers.v2097151 & (load4(a.sublist(2, a.length)) >> 5); + var a2 = Numbers.v2097151 & (load3(a.sublist(5, a.length)) >> 2); + var a3 = Numbers.v2097151 & (load4(a.sublist(7, a.length)) >> 7); + var a4 = Numbers.v2097151 & (load4(a.sublist(10, a.length)) >> 4); + var a5 = Numbers.v2097151 & (load3(a.sublist(13, a.length)) >> 1); + var a6 = Numbers.v2097151 & (load4(a.sublist(15, a.length)) >> 6); + var a7 = Numbers.v2097151 & (load3(a.sublist(18, a.length)) >> 3); + var a8 = Numbers.v2097151 & load3(a.sublist(21, a.length)); + var a9 = Numbers.v2097151 & (load4(a.sublist(23, a.length)) >> 5); + var a10 = Numbers.v2097151 & (load3(a.sublist(26, a.length)) >> 2); + var a11 = (load4(a.sublist(28, a.length)) >> 7); + + var b0 = Numbers.v2097151 & load3(b.sublist(0, b.length)); + var b1 = Numbers.v2097151 & (load4(b.sublist(2, b.length)) >> 5); + var b2 = Numbers.v2097151 & (load3(b.sublist(5, b.length)) >> 2); + var b3 = Numbers.v2097151 & (load4(b.sublist(7, b.length)) >> 7); + var b4 = Numbers.v2097151 & (load4(b.sublist(10, b.length)) >> 4); + var b5 = Numbers.v2097151 & (load3(b.sublist(13, b.length)) >> 1); + var b6 = Numbers.v2097151 & (load4(b.sublist(15, b.length)) >> 6); + var b7 = Numbers.v2097151 & (load3(b.sublist(18, b.length)) >> 3); + var b8 = Numbers.v2097151 & load3(b.sublist(21, b.length)); + var b9 = Numbers.v2097151 & (load4(b.sublist(23, b.length)) >> 5); + var b10 = Numbers.v2097151 & (load3(b.sublist(26, b.length)) >> 2); + var b11 = (load4(b.sublist(28, b.length)) >> 7); + + var c0 = Numbers.v2097151 & load3(c.sublist(0, c.length)); + var c1 = Numbers.v2097151 & (load4(c.sublist(2, c.length)) >> 5); + var c2 = Numbers.v2097151 & (load3(c.sublist(5, c.length)) >> 2); + var c3 = Numbers.v2097151 & (load4(c.sublist(7, c.length)) >> 7); + var c4 = Numbers.v2097151 & (load4(c.sublist(10, c.length)) >> 4); + var c5 = Numbers.v2097151 & (load3(c.sublist(13, c.length)) >> 1); + var c6 = Numbers.v2097151 & (load4(c.sublist(15, c.length)) >> 6); + var c7 = Numbers.v2097151 & (load3(c.sublist(18, c.length)) >> 3); + var c8 = Numbers.v2097151 & load3(c.sublist(21, c.length)); + var c9 = Numbers.v2097151 & (load4(c.sublist(23, c.length)) >> 5); + var c10 = Numbers.v2097151 & (load3(c.sublist(26, c.length)) >> 2); + var c11 = (load4(c.sublist(28, c.length)) >> 7); + + var carry = List.filled(23, Number.zero); + + var s0 = c0 + a0 * b0; + var s1 = c1 + a0 * b1 + a1 * b0; + var s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + var s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + var s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + var s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + var s6 = + c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + var s7 = c7 + + a0 * b7 + + a1 * b6 + + a2 * b5 + + a3 * b4 + + a4 * b3 + + a5 * b2 + + a6 * b1 + + a7 * b0; + var s8 = c8 + + a0 * b8 + + a1 * b7 + + a2 * b6 + + a3 * b5 + + a4 * b4 + + a5 * b3 + + a6 * b2 + + a7 * b1 + + a8 * b0; + var s9 = c9 + + a0 * b9 + + a1 * b8 + + a2 * b7 + + a3 * b6 + + a4 * b5 + + a5 * b4 + + a6 * b3 + + a7 * b2 + + a8 * b1 + + a9 * b0; + var s10 = c10 + + a0 * b10 + + a1 * b9 + + a2 * b8 + + a3 * b7 + + a4 * b6 + + a5 * b5 + + a6 * b4 + + a7 * b3 + + a8 * b2 + + a9 * b1 + + a10 * b0; + var s11 = c11 + + a0 * b11 + + a1 * b10 + + a2 * b9 + + a3 * b8 + + a4 * b7 + + a5 * b6 + + a6 * b5 + + a7 * b4 + + a8 * b3 + + a9 * b2 + + a10 * b1 + + a11 * b0; + var s12 = a1 * b11 + + a2 * b10 + + a3 * b9 + + a4 * b8 + + a5 * b7 + + a6 * b6 + + a7 * b5 + + a8 * b4 + + a9 * b3 + + a10 * b2 + + a11 * b1; + var s13 = a2 * b11 + + a3 * b10 + + a4 * b9 + + a5 * b8 + + a6 * b7 + + a7 * b6 + + a8 * b5 + + a9 * b4 + + a10 * b3 + + a11 * b2; + var s14 = a3 * b11 + + a4 * b10 + + a5 * b9 + + a6 * b8 + + a7 * b7 + + a8 * b6 + + a9 * b5 + + a10 * b4 + + a11 * b3; + var s15 = a4 * b11 + + a5 * b10 + + a6 * b9 + + a7 * b8 + + a8 * b7 + + a9 * b6 + + a10 * b5 + + a11 * b4; + var s16 = + a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + var s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + var s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + var s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + var s20 = a9 * b11 + a10 * b10 + a11 * b9; + var s21 = a10 * b11 + a11 * b10; + var s22 = a11 * b11; + var s23 = Number.zero; + + carry[0] = (s0 + (Number.one << 20)) >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[2] = (s2 + (Number.one << 20)) >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[4] = (s4 + (Number.one << 20)) >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[6] = (s6 + (Number.one << 20)) >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[8] = (s8 + (Number.one << 20)) >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[10] = (s10 + (Number.one << 20)) >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + carry[12] = (s12 + (Number.one << 20)) >> 21; + s13 += carry[12]; + s12 -= carry[12] << 21; + carry[14] = (s14 + (Number.one << 20)) >> 21; + s15 += carry[14]; + s14 -= carry[14] << 21; + carry[16] = (s16 + (Number.one << 20)) >> 21; + s17 += carry[16]; + s16 -= carry[16] << 21; + carry[18] = (s18 + (Number.one << 20)) >> 21; + s19 += carry[18]; + s18 -= carry[18] << 21; + carry[20] = (s20 + (Number.one << 20)) >> 21; + s21 += carry[20]; + s20 -= carry[20] << 21; + carry[22] = (s22 + (Number.one << 20)) >> 21; + s23 += carry[22]; + s22 -= carry[22] << 21; + + carry[1] = (s1 + (Number.one << 20)) >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[3] = (s3 + (Number.one << 20)) >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[5] = (s5 + (Number.one << 20)) >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[7] = (s7 + (Number.one << 20)) >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[9] = (s9 + (Number.one << 20)) >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[11] = (s11 + (Number.one << 20)) >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + carry[13] = (s13 + (Number.one << 20)) >> 21; + s14 += carry[13]; + s13 -= carry[13] << 21; + carry[15] = (s15 + (Number.one << 20)) >> 21; + s16 += carry[15]; + s15 -= carry[15] << 21; + carry[17] = (s17 + (Number.one << 20)) >> 21; + s18 += carry[17]; + s17 -= carry[17] << 21; + carry[19] = (s19 + (Number.one << 20)) >> 21; + s20 += carry[19]; + s19 -= carry[19] << 21; + carry[21] = (s21 + (Number.one << 20)) >> 21; + s22 += carry[21]; + s21 -= carry[21] << 21; + + s11 += s23 * Numbers.v666643; + s12 += s23 * Numbers.v470296; + s13 += s23 * Numbers.v654183; + s14 -= s23 * Numbers.v997805; + s15 += s23 * Numbers.v136657; + s16 -= s23 * Numbers.v683901; + s23 = Number.zero; + + s10 += s22 * Numbers.v666643; + s11 += s22 * Numbers.v470296; + s12 += s22 * Numbers.v654183; + s13 -= s22 * Numbers.v997805; + s14 += s22 * Numbers.v136657; + s15 -= s22 * Numbers.v683901; + s22 = Number.zero; + + s9 += s21 * Numbers.v666643; + s10 += s21 * Numbers.v470296; + s11 += s21 * Numbers.v654183; + s12 -= s21 * Numbers.v997805; + s13 += s21 * Numbers.v136657; + s14 -= s21 * Numbers.v683901; + s21 = Number.zero; + + s8 += s20 * Numbers.v666643; + s9 += s20 * Numbers.v470296; + s10 += s20 * Numbers.v654183; + s11 -= s20 * Numbers.v997805; + s12 += s20 * Numbers.v136657; + s13 -= s20 * Numbers.v683901; + s20 = Number.zero; + + s7 += s19 * Numbers.v666643; + s8 += s19 * Numbers.v470296; + s9 += s19 * Numbers.v654183; + s10 -= s19 * Numbers.v997805; + s11 += s19 * Numbers.v136657; + s12 -= s19 * Numbers.v683901; + s19 = Number.zero; + + s6 += s18 * Numbers.v666643; + s7 += s18 * Numbers.v470296; + s8 += s18 * Numbers.v654183; + s9 -= s18 * Numbers.v997805; + s10 += s18 * Numbers.v136657; + s11 -= s18 * Numbers.v683901; + s18 = Number.zero; + + carry[6] = (s6 + (Number.one << 20)) >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[8] = (s8 + (Number.one << 20)) >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[10] = (s10 + (Number.one << 20)) >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + carry[12] = (s12 + (Number.one << 20)) >> 21; + s13 += carry[12]; + s12 -= carry[12] << 21; + carry[14] = (s14 + (Number.one << 20)) >> 21; + s15 += carry[14]; + s14 -= carry[14] << 21; + carry[16] = (s16 + (Number.one << 20)) >> 21; + s17 += carry[16]; + s16 -= carry[16] << 21; + + carry[7] = (s7 + (Number.one << 20)) >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[9] = (s9 + (Number.one << 20)) >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[11] = (s11 + (Number.one << 20)) >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + carry[13] = (s13 + (Number.one << 20)) >> 21; + s14 += carry[13]; + s13 -= carry[13] << 21; + carry[15] = (s15 + (Number.one << 20)) >> 21; + s16 += carry[15]; + s15 -= carry[15] << 21; + + s5 += s17 * Numbers.v666643; + s6 += s17 * Numbers.v470296; + s7 += s17 * Numbers.v654183; + s8 -= s17 * Numbers.v997805; + s9 += s17 * Numbers.v136657; + s10 -= s17 * Numbers.v683901; + s17 = Number.zero; + + s4 += s16 * Numbers.v666643; + s5 += s16 * Numbers.v470296; + s6 += s16 * Numbers.v654183; + s7 -= s16 * Numbers.v997805; + s8 += s16 * Numbers.v136657; + s9 -= s16 * Numbers.v683901; + s16 = Number.zero; + + s3 += s15 * Numbers.v666643; + s4 += s15 * Numbers.v470296; + s5 += s15 * Numbers.v654183; + s6 -= s15 * Numbers.v997805; + s7 += s15 * Numbers.v136657; + s8 -= s15 * Numbers.v683901; + s15 = Number.zero; + + s2 += s14 * Numbers.v666643; + s3 += s14 * Numbers.v470296; + s4 += s14 * Numbers.v654183; + s5 -= s14 * Numbers.v997805; + s6 += s14 * Numbers.v136657; + s7 -= s14 * Numbers.v683901; + s14 = Number.zero; + + s1 += s13 * Numbers.v666643; + s2 += s13 * Numbers.v470296; + s3 += s13 * Numbers.v654183; + s4 -= s13 * Numbers.v997805; + s5 += s13 * Numbers.v136657; + s6 -= s13 * Numbers.v683901; + s13 = Number.zero; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = (s0 + (Number.one << 20)) >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[2] = (s2 + (Number.one << 20)) >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[4] = (s4 + (Number.one << 20)) >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[6] = (s6 + (Number.one << 20)) >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[8] = (s8 + (Number.one << 20)) >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[10] = (s10 + (Number.one << 20)) >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + + carry[1] = (s1 + (Number.one << 20)) >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[3] = (s3 + (Number.one << 20)) >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[5] = (s5 + (Number.one << 20)) >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[7] = (s7 + (Number.one << 20)) >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[9] = (s9 + (Number.one << 20)) >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[11] = (s11 + (Number.one << 20)) >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = s0 >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[1] = s1 >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[2] = s2 >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[3] = s3 >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[4] = s4 >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[5] = s5 >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[6] = s6 >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[7] = s7 >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[8] = s8 >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[9] = s9 >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[10] = s10 >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + carry[11] = s11 >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = s0 >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[1] = s1 >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[2] = s2 >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[3] = s3 >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[4] = s4 >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[5] = s5 >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[6] = s6 >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[7] = s7 >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[8] = s8 >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[9] = s9 >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[10] = s10 >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + + s[0] = (s0 >> 0).intValue; + s[1] = (s0 >> 8).intValue; + s[2] = ((s0 >> 16) | (s1 << 5)).intValue; + s[3] = (s1 >> 3).intValue; + s[4] = (s1 >> 11).intValue; + s[5] = ((s1 >> 19) | (s2 << 2)).intValue; + s[6] = (s2 >> 6).intValue; + s[7] = ((s2 >> 14) | (s3 << 7)).intValue; + s[8] = (s3 >> 1).intValue; + s[9] = (s3 >> 9).intValue; + s[10] = ((s3 >> 17) | (s4 << 4)).intValue; + s[11] = (s4 >> 4).intValue; + s[12] = (s4 >> 12).intValue; + s[13] = ((s4 >> 20) | (s5 << 1)).intValue; + s[14] = (s5 >> 7).intValue; + s[15] = ((s5 >> 15) | (s6 << 6)).intValue; + s[16] = (s6 >> 2).intValue; + s[17] = (s6 >> 10).intValue; + s[18] = ((s6 >> 18) | (s7 << 3)).intValue; + s[19] = (s7 >> 5).intValue; + s[20] = (s7 >> 13).intValue; + s[21] = (s8 >> 0).intValue; + s[22] = (s8 >> 8).intValue; + s[23] = ((s8 >> 16) | (s9 << 5)).intValue; + s[24] = (s9 >> 3).intValue; + s[25] = (s9 >> 11).intValue; + s[26] = ((s9 >> 19) | (s10 << 2)).intValue; + s[27] = (s10 >> 6).intValue; + s[28] = ((s10 >> 14) | (s11 << 7)).intValue; + s[29] = (s11 >> 1).intValue; + s[30] = (s11 >> 9).intValue; + s[31] = (s11 >> 17).intValue; +} + +/// Input: +/// s[0]+256*s[1]+...+256^63*s[63] = s +/// +/// Output: +/// s[0]+256*s[1]+...+256^31*s[31] = s mod l +/// where l = 2^252 + 27742317777372353535851937790883648493. +void ScReduce(Uint8List out, Uint8List s) { + var s0 = Numbers.v2097151 & load3(s.sublist(0, s.length)); + var s1 = Numbers.v2097151 & (load4(s.sublist(2, s.length)) >> 5); + var s2 = Numbers.v2097151 & (load3(s.sublist(5, s.length)) >> 2); + var s3 = Numbers.v2097151 & (load4(s.sublist(7, s.length)) >> 7); + var s4 = Numbers.v2097151 & (load4(s.sublist(10, s.length)) >> 4); + var s5 = Numbers.v2097151 & (load3(s.sublist(13, s.length)) >> 1); + var s6 = Numbers.v2097151 & (load4(s.sublist(15, s.length)) >> 6); + var s7 = Numbers.v2097151 & (load3(s.sublist(18, s.length)) >> 3); + var s8 = Numbers.v2097151 & load3(s.sublist(21, s.length)); + var s9 = Numbers.v2097151 & (load4(s.sublist(23, s.length)) >> 5); + var s10 = Numbers.v2097151 & (load3(s.sublist(26, s.length)) >> 2); + var s11 = Numbers.v2097151 & (load4(s.sublist(28, s.length)) >> 7); + var s12 = Numbers.v2097151 & (load4(s.sublist(31, s.length)) >> 4); + var s13 = Numbers.v2097151 & (load3(s.sublist(34, s.length)) >> 1); + var s14 = Numbers.v2097151 & (load4(s.sublist(36, s.length)) >> 6); + var s15 = Numbers.v2097151 & (load3(s.sublist(39, s.length)) >> 3); + var s16 = Numbers.v2097151 & load3(s.sublist(42, s.length)); + var s17 = Numbers.v2097151 & (load4(s.sublist(44, s.length)) >> 5); + var s18 = Numbers.v2097151 & (load3(s.sublist(47, s.length)) >> 2); + var s19 = Numbers.v2097151 & (load4(s.sublist(49, s.length)) >> 7); + var s20 = Numbers.v2097151 & (load4(s.sublist(52, s.length)) >> 4); + var s21 = Numbers.v2097151 & (load3(s.sublist(55, s.length)) >> 1); + var s22 = Numbers.v2097151 & (load4(s.sublist(57, s.length)) >> 6); + var s23 = (load4(s.sublist(60, s.length)) >> 3); + + s11 += s23 * Numbers.v666643; + s12 += s23 * Numbers.v470296; + s13 += s23 * Numbers.v654183; + s14 -= s23 * Numbers.v997805; + s15 += s23 * Numbers.v136657; + s16 -= s23 * Numbers.v683901; + s23 = Number.zero; + + s10 += s22 * Numbers.v666643; + s11 += s22 * Numbers.v470296; + s12 += s22 * Numbers.v654183; + s13 -= s22 * Numbers.v997805; + s14 += s22 * Numbers.v136657; + s15 -= s22 * Numbers.v683901; + s22 = Number.zero; + + s9 += s21 * Numbers.v666643; + s10 += s21 * Numbers.v470296; + s11 += s21 * Numbers.v654183; + s12 -= s21 * Numbers.v997805; + s13 += s21 * Numbers.v136657; + s14 -= s21 * Numbers.v683901; + s21 = Number.zero; + + s8 += s20 * Numbers.v666643; + s9 += s20 * Numbers.v470296; + s10 += s20 * Numbers.v654183; + s11 -= s20 * Numbers.v997805; + s12 += s20 * Numbers.v136657; + s13 -= s20 * Numbers.v683901; + s20 = Number.zero; + + s7 += s19 * Numbers.v666643; + s8 += s19 * Numbers.v470296; + s9 += s19 * Numbers.v654183; + s10 -= s19 * Numbers.v997805; + s11 += s19 * Numbers.v136657; + s12 -= s19 * Numbers.v683901; + s19 = Number.zero; + + s6 += s18 * Numbers.v666643; + s7 += s18 * Numbers.v470296; + s8 += s18 * Numbers.v654183; + s9 -= s18 * Numbers.v997805; + s10 += s18 * Numbers.v136657; + s11 -= s18 * Numbers.v683901; + s18 = Number.zero; + + var carry = List.filled(64, Number.zero); + + carry[6] = (s6 + (Number.one << 20)) >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[8] = (s8 + (Number.one << 20)) >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[10] = (s10 + (Number.one << 20)) >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + carry[12] = (s12 + (Number.one << 20)) >> 21; + s13 += carry[12]; + s12 -= carry[12] << 21; + carry[14] = (s14 + (Number.one << 20)) >> 21; + s15 += carry[14]; + s14 -= carry[14] << 21; + carry[16] = (s16 + (Number.one << 20)) >> 21; + s17 += carry[16]; + s16 -= carry[16] << 21; + + carry[7] = (s7 + (Number.one << 20)) >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[9] = (s9 + (Number.one << 20)) >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[11] = (s11 + (Number.one << 20)) >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + carry[13] = (s13 + (Number.one << 20)) >> 21; + s14 += carry[13]; + s13 -= carry[13] << 21; + carry[15] = (s15 + (Number.one << 20)) >> 21; + s16 += carry[15]; + s15 -= carry[15] << 21; + + s5 += s17 * Numbers.v666643; + s6 += s17 * Numbers.v470296; + s7 += s17 * Numbers.v654183; + s8 -= s17 * Numbers.v997805; + s9 += s17 * Numbers.v136657; + s10 -= s17 * Numbers.v683901; + s17 = Number.zero; + + s4 += s16 * Numbers.v666643; + s5 += s16 * Numbers.v470296; + s6 += s16 * Numbers.v654183; + s7 -= s16 * Numbers.v997805; + s8 += s16 * Numbers.v136657; + s9 -= s16 * Numbers.v683901; + s16 = Number.zero; + + s3 += s15 * Numbers.v666643; + s4 += s15 * Numbers.v470296; + s5 += s15 * Numbers.v654183; + s6 -= s15 * Numbers.v997805; + s7 += s15 * Numbers.v136657; + s8 -= s15 * Numbers.v683901; + s15 = Number.zero; + + s2 += s14 * Numbers.v666643; + s3 += s14 * Numbers.v470296; + s4 += s14 * Numbers.v654183; + s5 -= s14 * Numbers.v997805; + s6 += s14 * Numbers.v136657; + s7 -= s14 * Numbers.v683901; + s14 = Number.zero; + + s1 += s13 * Numbers.v666643; + s2 += s13 * Numbers.v470296; + s3 += s13 * Numbers.v654183; + s4 -= s13 * Numbers.v997805; + s5 += s13 * Numbers.v136657; + s6 -= s13 * Numbers.v683901; + s13 = Number.zero; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = (s0 + (Number.one << 20)) >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[2] = (s2 + (Number.one << 20)) >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[4] = (s4 + (Number.one << 20)) >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[6] = (s6 + (Number.one << 20)) >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[8] = (s8 + (Number.one << 20)) >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[10] = (s10 + (Number.one << 20)) >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + + carry[1] = (s1 + (Number.one << 20)) >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[3] = (s3 + (Number.one << 20)) >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[5] = (s5 + (Number.one << 20)) >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[7] = (s7 + (Number.one << 20)) >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[9] = (s9 + (Number.one << 20)) >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[11] = (s11 + (Number.one << 20)) >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = s0 >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[1] = s1 >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[2] = s2 >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[3] = s3 >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[4] = s4 >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[5] = s5 >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[6] = s6 >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[7] = s7 >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[8] = s8 >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[9] = s9 >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[10] = s10 >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + carry[11] = s11 >> 21; + s12 += carry[11]; + s11 -= carry[11] << 21; + + s0 += s12 * Numbers.v666643; + s1 += s12 * Numbers.v470296; + s2 += s12 * Numbers.v654183; + s3 -= s12 * Numbers.v997805; + s4 += s12 * Numbers.v136657; + s5 -= s12 * Numbers.v683901; + s12 = Number.zero; + + carry[0] = s0 >> 21; + s1 += carry[0]; + s0 -= carry[0] << 21; + carry[1] = s1 >> 21; + s2 += carry[1]; + s1 -= carry[1] << 21; + carry[2] = s2 >> 21; + s3 += carry[2]; + s2 -= carry[2] << 21; + carry[3] = s3 >> 21; + s4 += carry[3]; + s3 -= carry[3] << 21; + carry[4] = s4 >> 21; + s5 += carry[4]; + s4 -= carry[4] << 21; + carry[5] = s5 >> 21; + s6 += carry[5]; + s5 -= carry[5] << 21; + carry[6] = s6 >> 21; + s7 += carry[6]; + s6 -= carry[6] << 21; + carry[7] = s7 >> 21; + s8 += carry[7]; + s7 -= carry[7] << 21; + carry[8] = s8 >> 21; + s9 += carry[8]; + s8 -= carry[8] << 21; + carry[9] = s9 >> 21; + s10 += carry[9]; + s9 -= carry[9] << 21; + carry[10] = s10 >> 21; + s11 += carry[10]; + s10 -= carry[10] << 21; + + out[0] = (s0 >> 0).intValue; + out[1] = (s0 >> 8).intValue; + out[2] = ((s0 >> 16) | (s1 << 5)).intValue; + out[3] = (s1 >> 3).intValue; + out[4] = (s1 >> 11).intValue; + out[5] = ((s1 >> 19) | (s2 << 2)).intValue; + out[6] = (s2 >> 6).intValue; + out[7] = ((s2 >> 14) | (s3 << 7)).intValue; + out[8] = (s3 >> 1).intValue; + out[9] = (s3 >> 9).intValue; + out[10] = ((s3 >> 17) | (s4 << 4)).intValue; + out[11] = (s4 >> 4).intValue; + out[12] = (s4 >> 12).intValue; + out[13] = ((s4 >> 20) | (s5 << 1)).intValue; + out[14] = (s5 >> 7).intValue; + out[15] = ((s5 >> 15) | (s6 << 6)).intValue; + out[16] = (s6 >> 2).intValue; + out[17] = (s6 >> 10).intValue; + out[18] = ((s6 >> 18) | (s7 << 3)).intValue; + out[19] = (s7 >> 5).intValue; + out[20] = (s7 >> 13).intValue; + out[21] = (s8 >> 0).intValue; + out[22] = (s8 >> 8).intValue; + out[23] = ((s8 >> 16) | (s9 << 5)).intValue; + out[24] = (s9 >> 3).intValue; + out[25] = (s9 >> 11).intValue; + out[26] = ((s9 >> 19) | (s10 << 2)).intValue; + out[27] = (s10 >> 6).intValue; + out[28] = ((s10 >> 14) | (s11 << 7)).intValue; + out[29] = (s11 >> 1).intValue; + out[30] = (s11 >> 9).intValue; + out[31] = (s11 >> 17).intValue; +} + +/// order is the order of Curve25519 in little-endian form. +var order = List.from( + [ + BigInt.parse('0x5812631a5cf5d3ed'), + BigInt.parse('0x14def9dea2f79cd6'), + BigInt.zero, + BigInt.parse('0x1000000000000000') + ], +); + +/// ScMinimal returns true if the given scalar is less than the order of the +/// curve. +bool ScMinimal(Uint8List scalar) { + for (var i = 3;; i--) { + // var v = binary.LittleEndian.Uint64(scalar[i*8:]); + var v = Uint64(scalar.sublist(i * 8, scalar.length)); + if (v > order[i].toInt()) { + return false; + } else if (v < order[i].toInt()) { + break; + } else if (i == 0) { + return false; + } + } + + return true; +} + +int Uint64(Uint8List b) { + return b[0] | + b[1] << 8 | + b[2] << 16 | + b[3] << 24 | + b[4] << 32 | + b[5] << 40 | + b[6] << 48 | + b[7] << 56; +} diff --git a/ed25519_edwards/lib/src/numbers.dart b/ed25519_edwards/lib/src/numbers.dart new file mode 100644 index 0000000..ba603f9 --- /dev/null +++ b/ed25519_edwards/lib/src/numbers.dart @@ -0,0 +1,18 @@ +import 'package:adaptive_number/adaptive_number.dart'; + +abstract class Numbers { + static Number v8 = Number(8); + static Number v15 = Number(15); + static Number v19 = Number(19); + static Number v24 = Number(24); + static Number v25 = Number(25); + static Number v26 = Number(26); + static Number v38 = Number(38); + static Number v136657 = Number(136657); + static Number v2097151 = Number(2097151); + static Number v470296 = Number(470296); + static Number v683901 = Number(683901); + static Number v654183 = Number(654183); + static Number v666643 = Number(666643); + static Number v997805 = Number(997805); +} diff --git a/ed25519_edwards/lib/src/util.dart b/ed25519_edwards/lib/src/util.dart new file mode 100644 index 0000000..301b952 --- /dev/null +++ b/ed25519_edwards/lib/src/util.dart @@ -0,0 +1,16 @@ +import 'dart:math'; + +import 'dart:typed_data'; + +void arrayCopy(List src, int srcPos, List dest, int destPos, int length) { + dest.setRange(destPos, length + destPos, src, srcPos); +} + +final _defaultSecureRandom = Random.secure(); + +void fillBytesWithSecureRandomNumbers(Uint8List bytes, {Random? random}) { + random ??= _defaultSecureRandom; + for (var i = 0; i < bytes.length; i++) { + bytes[i] = random.nextInt(256); + } +} diff --git a/ed25519_edwards/pubspec.yaml b/ed25519_edwards/pubspec.yaml new file mode 100644 index 0000000..90d2cea --- /dev/null +++ b/ed25519_edwards/pubspec.yaml @@ -0,0 +1,18 @@ +name: ed25519_edwards +description: Dart port of ed25519 from Go Cryptography ed25519 +version: 0.3.1 +homepage: https://github.com/Tougee/ed25519 + +environment: + sdk: '>=2.12.0 <3.0.0' + +dependencies: + collection: ^1.15.0 + crypto: ^3.0.0 + convert: ^3.0.0 + adaptive_number: ^1.0.0 +dev_dependencies: + pedantic: ^1.10.0 + test: ^1.16.4 + hex: ^0.2.0 + benchmark_harness: ^2.0.0 diff --git a/ed25519_edwards/test/benchmark/ed25519_benchmark.dart b/ed25519_edwards/test/benchmark/ed25519_benchmark.dart new file mode 100644 index 0000000..d1740af --- /dev/null +++ b/ed25519_edwards/test/benchmark/ed25519_benchmark.dart @@ -0,0 +1,38 @@ +import 'dart:typed_data'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; + +import 'rate_benchmark.dart'; + +class Ed25519Benchmark extends RateBenchmark { + Ed25519Benchmark(bool forSigning, [int dataLength = 1024 * 1024]) + : _forSigning = forSigning, + _data = Uint8List(dataLength), + super('Ed25519 - ${forSigning ? 'sign' : 'verify'}'); + + final Uint8List _data; + final bool _forSigning; + late final KeyPair _keyPair; + Uint8List? _signature; + + @override + void setup() { + _keyPair = generateKey(); + _signature = sign(_keyPair.privateKey, _data); + } + + @override + void run() { + if (_forSigning) { + sign(_keyPair.privateKey, _data); + } else if (_signature != null) { + verify(_keyPair.publicKey, _data, _signature!); + } + addSample(_data.length); + } +} + +void main() { + Ed25519Benchmark(true).report(); + Ed25519Benchmark(false).report(); +} diff --git a/ed25519_edwards/test/benchmark/rate_benchmark.dart b/ed25519_edwards/test/benchmark/rate_benchmark.dart new file mode 100644 index 0000000..aa63e50 --- /dev/null +++ b/ed25519_edwards/test/benchmark/rate_benchmark.dart @@ -0,0 +1,64 @@ +import 'package:benchmark_harness/benchmark_harness.dart'; + +abstract class RateBenchmark extends BenchmarkBase { + RateBenchmark(String name, {this.runLength = 5000}) + : super(name, emitter: RateEmitter()) { + (emitter as RateEmitter).benchmark = this; + } + + final int runLength; + int _totalData = 0; + int _iterations = 0; + + @override + ScoreEmitter get emitter => super.emitter; + + void addSample(int processedData) { + _totalData += processedData; + } + + @override + void exercise() { + _totalData = 0; + _iterations = 0; + + var watch = Stopwatch()..start(); + while (watch.elapsedMilliseconds < runLength) { + run(); + _iterations++; + } + } +} + +class RateEmitter implements ScoreEmitter { + late RateBenchmark benchmark; + + int get totalData => benchmark._totalData; + int get iterations => benchmark._iterations; + + @override + void emit(String testName, double value) { + final ms = value / 1000; + final s = ms / 1000; + final date = DateTime.now().toString().split('.')[0]; + + print('| $date | ' + '$testName | ' + '${_formatDataLength(totalData / s)}/s | ' + '$iterations iterations | ' + '${ms.toInt()} ms | ' + '${_formatDataLength(totalData)} |'); + } + + String _formatDataLength(num dataLen) { + if (dataLen < 1024) { + return '${dataLen.toStringAsFixed(2)} B'; + } else if (dataLen < (1024 * 1024)) { + return '${(dataLen / 1024).toStringAsFixed(2)} KB'; + } else if (dataLen < (1024 * 1024 * 1024)) { + return '${(dataLen / (1024 * 1024)).toStringAsFixed(2)} MB'; + } else { + return '${(dataLen / (1024 * 1024 * 1024)).toStringAsFixed(2)} GB'; + } + } +} diff --git a/ed25519_edwards/test/ed25519_test.dart b/ed25519_edwards/test/ed25519_test.dart new file mode 100644 index 0000000..42bda1d --- /dev/null +++ b/ed25519_edwards/test/ed25519_test.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:ed25519_edwards/ed25519_edwards.dart' as ed; +import 'package:hex/hex.dart'; +import 'package:test/test.dart'; + +void main() { + void testVector( + String plain, String seedStr, String publicStr, String sigStr) { + var seed = HEX.decode(seedStr); + var public = HEX.decode(publicStr); + var privateKey = ed.PrivateKey([...seed, ...public]); + var publicKey = ed.public(privateKey); + var message = HEX.decode(plain); + var sig = ed.sign(privateKey, message as Uint8List); + + var targetSig = HEX.decode(sigStr); + assert(ListEquality().equals(targetSig, sig)); + + var result = ed.verify(publicKey, message, sig); + assert(result == true); + } + + test('test rfc8032 cases', () { + testVector( + '', + '9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60', + 'd75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a', + 'e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b'); + testVector( + '72', + '4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb', + '3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c', + '92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00'); + testVector( + 'af82', + 'c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7', + 'fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025', + '6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a'); + testVector( + '08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0', + 'f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5', + '278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e', + '0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03'); + testVector( + 'ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f', + '833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42', + 'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf', + 'dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704'); + }); + + test('testSignVerify', () { + var keyPair = ed.generateKey(); + var privateKey = keyPair.privateKey; + var publicKey = keyPair.publicKey; + var message = utf8.encode('test message'); + var sig = ed.sign(privateKey, message as Uint8List); + var result = ed.verify(publicKey, message, sig); + assert(result == true); + + var wrongMessage = utf8.encode('wrong message'); + var wrongResult = ed.verify(publicKey, wrongMessage as Uint8List, sig); + assert(wrongResult == false); + }); +} diff --git a/hashlib/LICENSE b/hashlib/LICENSE new file mode 100644 index 0000000..f8437f8 --- /dev/null +++ b/hashlib/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2023, Sudipto Chandra +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/hashlib/lib/codecs.dart b/hashlib/lib/codecs.dart new file mode 100644 index 0000000..ea87732 --- /dev/null +++ b/hashlib/lib/codecs.dart @@ -0,0 +1,7 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +/// Implementations of fast and error resilient codecs +library; + +export 'package:hashlib_codecs/hashlib_codecs.dart'; diff --git a/hashlib/lib/hashlib.dart b/hashlib/lib/hashlib.dart new file mode 100644 index 0000000..8b4c11a --- /dev/null +++ b/hashlib/lib/hashlib.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +/// Collection of hashing algorithms, checksum generators, message +/// authentication code (MAC) utilities and key derivation functions. +/// +/// This library serves as a convenience export so that all supported +/// algorithms can be used with a single import. +library; + +export 'src/hashlib.dart'; diff --git a/hashlib/lib/random.dart b/hashlib/lib/random.dart new file mode 100644 index 0000000..bf471ac --- /dev/null +++ b/hashlib/lib/random.dart @@ -0,0 +1,8 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +/// Implementation of secure random generators based on hashlib +library; + +export 'package:hashlib/src/random.dart'; +export 'package:hashlib/src/uuid.dart'; diff --git a/hashlib/lib/src/adler32.dart b/hashlib/lib/src/adler32.dart new file mode 100644 index 0000000..6eafe05 --- /dev/null +++ b/hashlib/lib/src/adler32.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/adler32.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +/// [Adler-32][wiki] is composed of two sums accumulated per byte. +/// +/// +/// According to [RFC-1950][rfc], the algorithm is described as follows: +/// - `a` is the sum of all bytes, `b` is the sum of all `a` values. +/// Both sums are done modulo `65521`. +/// - `a` is initialized to 1, `b` to 0. +/// - Final output is `b * 65536 + a` +/// +/// [rfc]: https://www.ietf.org/rfc/rfc1950.html +/// [wiki]: https://en.wikipedia.org/wiki/Adler-32 +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const HashBase adler32 = _Adler32(); + +class _Adler32 extends HashBase { + const _Adler32(); + + @override + final String name = 'ALDER-32'; + + @override + Adler32Hash createSink() => Adler32Hash(); +} + +/// Gets the Adler-32 value of a String +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +int adler32code(String input, [Encoding? encoding]) { + return adler32.string(input, encoding).number(); +} diff --git a/hashlib/lib/src/algorithms/adler32.dart b/hashlib/lib/src/algorithms/adler32.dart new file mode 100644 index 0000000..3c2f3ff --- /dev/null +++ b/hashlib/lib/src/algorithms/adler32.dart @@ -0,0 +1,46 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_base.dart'; + +const int _adler32Mod = 65521; + +/// This implementation is derived from the [ ZLIB Compressed Data Format +/// Specification version 3.3 ][rfc] +/// +/// [rfc]: https://www.ietf.org/rfc/rfc1950.html +class Adler32Hash extends HashDigestSink { + int a = 1, b = 0; + + Adler32Hash(); + + @override + final int hashLength = 4; + + @override + void reset() { + a = 1; + b = 0; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++) { + a = (a + chunk[start]) % _adler32Mod; + b = (b + a) % _adler32Mod; + } + } + + @override + Uint8List $finalize() { + return Uint8List.fromList([ + b >>> 8, + b, + a >>> 8, + a, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/argon2/argon2.dart b/hashlib/lib/src/algorithms/argon2/argon2.dart new file mode 100644 index 0000000..b95ef92 --- /dev/null +++ b/hashlib/lib/src/algorithms/argon2/argon2.dart @@ -0,0 +1,149 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/core/kdf_base.dart'; + +import 'argon2_64bit.dart' if (dart.library.js) 'argon2_32bit.dart'; +import 'common.dart'; +import 'security.dart'; + +export 'common.dart'; +export 'security.dart'; + +/// Creates a context for [Argon2][wiki] password hashing. +/// +/// Argon2 is a key derivation algorithm that was selected as the winner of the +/// 2015 [Password Hashing Contest][phc], and the best password hashing / key +/// derivation algorithm known to date. +/// +/// Example of password hashing using Argon2: +/// +/// ```dart +/// final salt = utf.encode("some salt") +/// final password = utf8.encode('password'); +/// final argon2 = Argon2( +/// version: Argon2Version.v13, +/// type: Argon2Type.argon2id, +/// hashLength: 32, +/// iterations: 2, +/// parallelism: 8, +/// memorySizeKB: 1 << 18, +/// salt: salt, +/// ); +/// final digest = argon2.encode(password); +/// ``` +/// +/// [phc]: https://www.password-hashing.net/ +/// [wiki]: https://en.wikipedia.org/wiki/Argon2 +class Argon2 extends KeyDerivatorBase { + final Argon2Context _ctx; + + @override + String get name => _ctx.type.name; + + /// Argon2 Hash Type + Argon2Type get type => _ctx.type; + + /// The current version is 0x13 (decimal: 19) + Argon2Version get version => _ctx.version; + + /// Degree of parallelism (i.e. number of threads) + int get parallelism => _ctx.lanes; + + /// Desired number of returned bytes + int get hashLength => _ctx.hashLength; + + /// Amount of memory (in kibibytes) to use + int get memorySizeKB => _ctx.memorySizeKB; + + /// Number of iterations to perform + int get iterations => _ctx.passes; + + /// Salt (16 bytes recommended for password hashing) + List get salt => _ctx.salt; + + /// Optional key + List? get key => _ctx.key; + + /// Optional arbitrary additional data + List? get personalization => _ctx.personalization; + + @override + int get derivedKeyLength => hashLength; + + /// Generate a derived key from a [password] using Argon2 algorithm + @override + Argon2HashDigest convert(List password) { + final result = Argon2Internal(_ctx).convert(password); + return Argon2HashDigest(_ctx, result); + } + + /// Generate an Argon2 encoded string from a [password] + String encode(List password) => convert(password).encoded(); + + const Argon2._(this._ctx); + + factory Argon2({ + Argon2Type type = Argon2Type.argon2id, + Argon2Version version = Argon2Version.v13, + required int parallelism, + required int memorySizeKB, + required int iterations, + int? hashLength, + List? salt, + List? key, + List? personalization, + }) { + var ctx = Argon2Context( + salt: salt, + version: version, + type: type, + hashLength: hashLength, + iterations: iterations, + parallelism: parallelism, + memorySizeKB: memorySizeKB, + key: key, + personalization: personalization, + ); + return Argon2._(ctx); + } + + /// Creates an [Argon2] instance from [Argon2Security] parameter. + factory Argon2.fromSecurity( + Argon2Security security, { + List? salt, + List? key, + int? hashLength, + List? personalization, + }) { + return Argon2( + salt: salt, + version: security.version, + type: security.type, + hashLength: hashLength, + iterations: security.t, + parallelism: security.p, + memorySizeKB: security.m, + key: key, + personalization: personalization, + ); + } + + /// Creates an [Argon2] instance from an encoded PHC-compliant string. + /// + /// The encoded string may look like this: + /// `$argon2i$v=19$m=16,t=2,p=1$c29tZSBzYWx0$u1eU6mZFG4/OOoTdAtM5SQ` + factory Argon2.fromEncoded( + CryptData data, { + List? key, + List? personalization, + }) { + var ctx = Argon2Context.fromEncoded( + data, + key: key, + personalization: personalization, + ); + return Argon2._(ctx); + } +} diff --git a/hashlib/lib/src/algorithms/argon2/argon2_32bit.dart b/hashlib/lib/src/algorithms/argon2/argon2_32bit.dart new file mode 100644 index 0000000..4a197b9 --- /dev/null +++ b/hashlib/lib/src/algorithms/argon2/argon2_32bit.dart @@ -0,0 +1,516 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'common.dart'; +import '../blake2/blake2b_32bit.dart'; + +const int _mask16 = 0xFFFF; +const int _mask32 = 0xFFFFFFFF; + +const int _zero = 0; +const int _input = _zero + 256; +const int _address = _input + 256; + +// slice 0 slice 1 slice 2 slice 3 +// ____/\____ ____/\____ ____/\____ ____/\____ +// / \ / \ / \ / \ +// +------------+------------+------------+------------+ +// | segment 0 | segment 1 | segment 2 | segment 3 | -> lane 0 +// +------------+------------+------------+-----------+ +// | segment 4 | segment 5 | segment 6 | segment 7 | -> lane 1 +// +------------+------------+------------+------------+ +// | segment 8 | segment 9 | segment 10 | segment 11 | -> lane 2 +// +------------+------------+------------+------------+ +// | ... ... ... | ... +// +------------+------------+------------+------------+ +// | | | | | -> lane p - 1 +// +------------+------------+------------+------------+ + +class Argon2Internal { + final Argon2Context ctx; + final _blockR = Uint32List(256); + final _blockT = Uint32List(256); + final _temp = Uint32List(_address + 256); + + Argon2Internal(this.ctx); + + Uint8List convert(List password) { + int i, j, k, p; + int pass, slice, lane; + var hash0 = Uint8List(64 + 8); + var hash0as32 = Uint32List.view(hash0.buffer); + var buffer32 = Uint32List(ctx.blocks << 8); + var buffer = Uint8List.view(buffer32.buffer); + var result = Uint8List(ctx.hashLength); + + // H_0 Generation (64 + 8 = 72 bytes) + _initialHash(hash0, password); + + // Initial block generation + // Lane Starting Blocks + k = 0; + hash0as32[16] = 0; + for (i = 0; i < ctx.lanes; i++, k += ctx.columns) { + // B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i)) + hash0as32[17] = i; + _expandHash(1024, hash0, buffer, k << 10); + } + + // Second Lane Blocks + k = 1; + hash0as32[16] = 1; + for (i = 0; i < ctx.lanes; i++, k += ctx.columns) { + // B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i)) + hash0as32[17] = i; + _expandHash(1024, hash0, buffer, k << 10); + } + + // Further block generation + for (pass = 0; pass < ctx.passes; ++pass) { + for (slice = 0; slice < ctx.slices; ++slice) { + for (lane = 0; lane < ctx.lanes; ++lane) { + _fillSegment(buffer32, pass, slice, lane); + } + } + } + + // Finalization + /* XOR the blocks */ + j = ctx.columns - 1; + var block = Uint8List.view(buffer.buffer, j << 10, 1024); + for (k = 1; k < ctx.lanes; ++k) { + j += ctx.columns; + p = j << 10; + for (i = 0; i < 1024; ++i, ++p) { + block[i] ^= buffer[p]; + } + } + + /* Hash the result */ + _expandHash(ctx.hashLength, block, result, 0); + return result; + } + + void _initialHash(Uint8List hash0, List password) { + // H_0 = H^(64)(LE32(p) || LE32(T) || LE32(m) || LE32(t) || + // LE32(v) || LE32(y) || LE32(length(P)) || P || + // LE32(length(S)) || S || LE32(length(K)) || K || + // LE32(length(X)) || X) + var blake2b = Blake2bHash(64); + blake2b.addUint32(ctx.lanes); + blake2b.addUint32(ctx.hashLength); + blake2b.addUint32(ctx.memorySizeKB); + blake2b.addUint32(ctx.passes); + blake2b.addUint32(ctx.version.value); + blake2b.addUint32(ctx.type.index); + blake2b.addUint32(password.length); + blake2b.add(password); + blake2b.addUint32(ctx.salt.length); + blake2b.add(ctx.salt); + blake2b.addUint32(ctx.key?.length ?? 0); + if (ctx.key != null) { + blake2b.add(ctx.key!); + } + blake2b.addUint32(ctx.personalization?.length ?? 0); + if (ctx.personalization != null) { + blake2b.add(ctx.personalization!); + } + + var hash = blake2b.digest().bytes; + for (int i = 0; i < 64; ++i) { + hash0[i] = hash[i]; + } + } + + static void _expandHash( + int digestSize, + Uint8List message, + Uint8List output, + int offset, + ) { + int i, j; + + // Take smaller hash unchanged + if (digestSize <= 64) { + var blake2b = Blake2bHash(digestSize); + blake2b.addUint32(digestSize); + blake2b.add(message); + var hash = blake2b.digest().bytes; + for (i = 0; i < digestSize; ++i, offset++) { + output[offset] = hash[i]; + } + return; + } + + // Otherwise, expand to digestSize by repeatedly hashing + // and taking the first 32-bytes from the each hash + + var blake2b = Blake2bHash(64); + blake2b.addUint32(digestSize); + blake2b.add(message); + var hash = blake2b.digest().bytes; + + // first block + for (i = 0; i < 32; ++i, ++offset) { + output[offset] = hash[i]; + } + + // subsequent blocks + for (j = digestSize - 32; j > 64; j -= 32) { + blake2b.reset(); + blake2b.add(hash); + hash = blake2b.digest().bytes; + for (i = 0; i < 32; ++i, ++offset) { + output[offset] = hash[i]; + } + } + + // final block + blake2b.reset(); + blake2b.add(hash); + hash = blake2b.digest().bytes; + for (i = 0; i < j; ++i, ++offset) { + output[offset] = hash[i]; + } + } + + void _fillSegment(Uint32List buffer, int pass, int slice, int lane) { + int refLane, refIndex; // l, z + int previous, current; + int i, j, startIndex, rand0, rand1; + + bool dataIndependentAddressing = (ctx.type == Argon2Type.argon2i); + if (ctx.type == Argon2Type.argon2id) { + dataIndependentAddressing = (pass == 0) && (slice < ctx.midSlice); + } + + if (dataIndependentAddressing) { + _temp[_input + 0] = pass; + _temp[_input + 1] = 0; + _temp[_input + 2] = lane; + _temp[_input + 3] = 0; + _temp[_input + 4] = slice; + _temp[_input + 5] = 0; + _temp[_input + 6] = ctx.blocks; + _temp[_input + 7] = ctx.blocks >>> 32; + _temp[_input + 8] = ctx.passes; + _temp[_input + 9] = 0; + _temp[_input + 10] = ctx.type.index; + _temp[_input + 11] = 0; + _temp[_input + 12] = 0; + _temp[_input + 13] = 0; + } + + startIndex = 0; + if (pass == 0 && slice == 0) { + startIndex = 2; + if (dataIndependentAddressing) { + _increment(_temp, _input + 12); + _fillBlock(_temp, prev: _zero, ref: _input, next: _address); + _fillBlock(_temp, prev: _zero, ref: _address, next: _address); + } + } + + /* Offset of the current block */ + current = lane * ctx.columns + slice * ctx.segments + startIndex; + + if (current % ctx.columns == 0) { + /* Last block in this lane */ + previous = current + ctx.columns - 1; + } else { + /* Previous block */ + previous = current - 1; + } + + for (i = startIndex; i < ctx.segments; ++i, ++current, ++previous) { + /* 1.1 Rotating prev_offset if needed */ + if (current % ctx.columns == 1) { + previous = current - 1; + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + if (dataIndependentAddressing) { + j = i & 0x7F; + if (j == 0) { + _increment(_temp, _input + 12); + _fillBlock(_temp, prev: _zero, ref: _input, next: _address); + _fillBlock(_temp, prev: _zero, ref: _address, next: _address); + } + rand0 = _temp[_address + (j << 1)]; + rand1 = _temp[_address + (j << 1) + 1]; + } else { + rand0 = buffer[previous << 8]; + rand1 = buffer[(previous << 8) + 1]; + } + + /* 1.2.2 Computing the lane of the reference block */ + refLane = rand1 % ctx.lanes; + + if (pass == 0 && slice == 0) { + /* Can not reference other lanes yet */ + refLane = lane; + } + + /* 1.2.3 Computing the number of possible reference block within the lane */ + refIndex = _alphaIndex( + pass: pass, + slice: slice, + lane: lane, + index: i, + random: rand0, + sameLane: refLane == lane, + ); + + /* 2 Creating a new block */ + _fillBlock( + buffer, + next: current << 8, + prev: previous << 8, + ref: (refLane * ctx.columns + refIndex) << 8, + /* 1.2.1 v10 and earlier: overwrite, not XOR */ + xor: ctx.version != Argon2Version.v10 && pass > 0, + ); + } + } + + // B[next] ^= G(B[prev], B[ref]) + /// Fills a new memory block and optionally XORs the old block over the new one. + void _fillBlock( + Uint32List buffer, { + required int prev, + required int ref, + required int next, + bool xor = false, + }) { + int i, j; + + // T = R = ref ^ prev + for (i = 0; i < 256; ++i) { + _blockT[i] = _blockR[i] = buffer[ref + i] ^ buffer[prev + i]; + } + + if (xor) { + // T = ref ^ prev ^ next + for (i = 0; i < 256; ++i) { + _blockT[i] ^= buffer[next + i]; + } + } + + // Apply Blake2 on columns of 64-bit words: (0,1,...,15), + // then (16,17,..31)... finally (112,113,...127) + for (i = j = 0; i < 8; i++, j += 16) { + _blake2bMixer( + _blockR, + (j) << 1, + (j + 1) << 1, + (j + 2) << 1, + (j + 3) << 1, + (j + 4) << 1, + (j + 5) << 1, + (j + 6) << 1, + (j + 7) << 1, + (j + 8) << 1, + (j + 9) << 1, + (j + 10) << 1, + (j + 11) << 1, + (j + 12) << 1, + (j + 13) << 1, + (j + 14) << 1, + (j + 15) << 1, + ); + } + + // Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), + // then (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) + for (i = j = 0; i < 8; i++, j += 2) { + _blake2bMixer( + _blockR, + (j) << 1, + (j + 1) << 1, + (j + 16) << 1, + (j + 17) << 1, + (j + 32) << 1, + (j + 33) << 1, + (j + 48) << 1, + (j + 49) << 1, + (j + 64) << 1, + (j + 65) << 1, + (j + 80) << 1, + (j + 81) << 1, + (j + 96) << 1, + (j + 97) << 1, + (j + 112) << 1, + (j + 113) << 1, + ); + } + + // next = T ^ R + for (i = 0; i < 256; ++i) { + buffer[next + i] = _blockT[i] ^ _blockR[i]; + } + } + + int _alphaIndex({ + required int pass, + required int slice, + required int lane, + required int index, + required int random, + required bool sameLane, + }) { + int area, pos, start; + + if (pass == 0) { + // First pass + if (slice == 0) { + // First slice + area = index - 1; // all but the previous + } else if (sameLane) { + // The same lane => add current segment + area = slice * ctx.segments + index - 1; + } else { + area = slice * ctx.segments + (index == 0 ? -1 : 0); + } + } else { + // Other passes + if (sameLane) { + area = ctx.columns - ctx.segments + index - 1; + } else { + area = ctx.columns - ctx.segments + (index == 0 ? -1 : 0); + } + } + + // 1.2.4. Mapping pseudo_rand to 0.. + // and produce relative position + pos = _multiplyAndGetMSB(random, random); + pos = area - 1 - _multiplyAndGetMSB(area, pos); + + /* 1.2.5 Computing starting position */ + start = 0; + if (pass != 0 && slice != ctx.slices - 1) { + start = (slice + 1) * ctx.segments; + } + + /* 1.2.6. Computing absolute position */ + return (start + pos) % ctx.columns; + } + + /// `v[i]++` + static void _increment(Uint32List v, int i) { + if (v[i] == _mask32) { + v[i] = 0; + v[i + 1]++; + } else { + v[i]++; + } + } + + /// `((x * y) mod 2^64) >> 32` + static int _multiplyAndGetMSB(int x, int y) { + int lx, hx, ly, hy; + + hx = (x >>> 16) & _mask16; + lx = x & _mask16; + hy = (y >>> 16) & _mask16; + ly = y & _mask16; + + return ((hy * hx) + ((lx * hy + hx * ly) >>> 16)) & _mask32; + } + + /// `v[x] += v[y] + 2 * ((v[x] & _mask32) * (v[y] & _mask32))` + static void _fBlaMka(Uint32List v, int x, int y) { + var t = (BigInt.from(v[x]) * BigInt.from(v[y])) << 1; + t += (BigInt.from(v[x + 1]) << 32) + BigInt.from(v[x]); + t += (BigInt.from(v[y + 1]) << 32) + BigInt.from(v[y]); + + v[x] = t.toUnsigned(32).toInt(); + v[x + 1] = (t >> 32).toUnsigned(32).toInt(); + } + + // v[k] = (v[i] << (64 - n)) | (v[i] >>> n) + static void _rotr(int n, List v, int i, int k) { + var a = v[i + 1]; + var b = v[i]; + if (n == 32) { + v[k + 1] = b; + v[k] = a; + } else if (n < 32) { + v[k + 1] = (b << (32 - n)) | (a >>> n); + v[k] = (a << (32 - n)) | (b >>> n); + } else { + v[k + 1] = (a << (64 - n)) | (b >>> (n - 32)); + v[k] = (b << (64 - n)) | (a >>> (n - 32)); + } + } + + /// `v[k] = v[i] ^ v[j]` + static void _xor(List v, int i, int j, int k) { + v[k] = v[i] ^ v[j]; + v[k + 1] = v[i + 1] ^ v[j + 1]; + } + + static void _mix(Uint32List v, int a, int b, int c, int d) { + _fBlaMka(v, a, b); + // v[d] = _rotr(v[d] ^ v[a], 32); + _xor(v, d, a, d); + _rotr(32, v, d, d); + + _fBlaMka(v, c, d); + // v[b] = _rotr(v[b] ^ v[c], 24); + _xor(v, b, c, b); + _rotr(24, v, b, b); + + _fBlaMka(v, a, b); + // v[d] = _rotr(v[d] ^ v[a], 16); + _xor(v, d, a, d); + _rotr(16, v, d, d); + + _fBlaMka(v, c, d); + // v[b] = _rotr(v[b] ^ v[c], 63); + _xor(v, b, c, b); + _rotr(63, v, b, b); + } + + static void _blake2bMixer( + Uint32List v, + int v0, + int v1, + int v2, + int v3, + int v4, + int v5, + int v6, + int v7, + int v8, + int v9, + int v10, + int v11, + int v12, + int v13, + int v14, + int v15, + ) { + _mix(v, v0, v4, v8, v12); + _mix(v, v1, v5, v9, v13); + _mix(v, v2, v6, v10, v14); + _mix(v, v3, v7, v11, v15); + _mix(v, v0, v5, v10, v15); + _mix(v, v1, v6, v11, v12); + _mix(v, v2, v7, v8, v13); + _mix(v, v3, v4, v9, v14); + } +} + +extension on Blake2bHash { + void addUint32(int value) { + add([ + value, + value >>> 8, + value >>> 16, + value >>> 24, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/argon2/argon2_64bit.dart b/hashlib/lib/src/algorithms/argon2/argon2_64bit.dart new file mode 100644 index 0000000..697f43f --- /dev/null +++ b/hashlib/lib/src/algorithms/argon2/argon2_64bit.dart @@ -0,0 +1,591 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'common.dart'; +import '../blake2/blake2b_64bit.dart'; + +const int _mask32 = 0xFFFFFFFF; + +// slice 0 slice 1 slice 2 slice 3 +// ____/\____ ____/\____ ____/\____ ____/\____ +// / \ / \ / \ / \ +// +------------+------------+------------+------------+ +// | segment 0 | segment 1 | segment 2 | segment 3 | -> lane 0 +// +------------+------------+------------+-----------+ +// | segment 4 | segment 5 | segment 6 | segment 7 | -> lane 1 +// +------------+------------+------------+------------+ +// | segment 8 | segment 9 | segment 10 | segment 11 | -> lane 2 +// +------------+------------+------------+------------+ +// | ... ... ... | ... +// +------------+------------+------------+------------+ +// | | | | | -> lane p - 1 +// +------------+------------+------------+------------+ + +class Argon2Internal { + final Argon2Context ctx; + final _hash0 = Uint8List(64 + 8); + final _blockR = Uint64List(128); + final _blockT = Uint64List(128); + final _input = Uint64List(128); + final _address = Uint64List(128); + + late final _digest = Uint8List(ctx.hashLength); + late final _memory = Uint64List(ctx.blocks << 7); + + Argon2Internal(this.ctx); + + Uint8List convert(List password) { + int i, j, k, cols; + int pass, slice, lane; + var hash0_32 = Uint32List.view(_hash0.buffer); + var memoryBytes = Uint8List.view(_memory.buffer); + + // H_0 Generation (64 + 8 = 72 bytes) + _initialHash(_hash0, password); + + // Initial block generation: First Lane Blocks + k = 0; + hash0_32[16] = 0; + cols = ctx.columns << 10; + for (i = 0; i < ctx.lanes; i++, k += cols) { + // B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i)) + hash0_32[17] = i; + _expandHash(1024, _hash0, memoryBytes, k); + } + + // Initial block generation: Second Lane Blocks + k = 1024; + hash0_32[16] = 1; + for (i = 0; i < ctx.lanes; i++, k += cols) { + // B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i)) + hash0_32[17] = i; + _expandHash(1024, _hash0, memoryBytes, k); + } + + // Further block generation + for (pass = 0; pass < ctx.passes; ++pass) { + for (slice = 0; slice < ctx.slices; ++slice) { + for (lane = 0; lane < ctx.lanes; ++lane) { + _fillSegment(pass, slice, lane); + } + } + } + + // Finalization : XOR the last column blocks + j = cols - 1024; + var block = Uint8List.view(memoryBytes.buffer, j, 1024); + for (k = 1; k < ctx.lanes; ++k) { + j += cols; + for (i = 0; i < 1024; ++i) { + block[i] ^= memoryBytes[j + i]; + } + } + + // Extend the block to make final result + _expandHash(ctx.hashLength, block, _digest, 0); + return _digest; + } + + void _initialHash(Uint8List hash0, List password) { + // H_0 = H^(64)(LE32(p) || LE32(T) || LE32(m) || LE32(t) || + // LE32(v) || LE32(y) || LE32(length(P)) || P || + // LE32(length(S)) || S || LE32(length(K)) || K || + // LE32(length(X)) || X) + var blake2b = Blake2bHash(64); + blake2b.addUint32(ctx.lanes); + blake2b.addUint32(ctx.hashLength); + blake2b.addUint32(ctx.memorySizeKB); + blake2b.addUint32(ctx.passes); + blake2b.addUint32(ctx.version.value); + blake2b.addUint32(ctx.type.index); + blake2b.addUint32(password.length); + blake2b.add(password); + blake2b.addUint32(ctx.salt.length); + blake2b.add(ctx.salt); + blake2b.addUint32(ctx.key?.length ?? 0); + if (ctx.key != null) { + blake2b.add(ctx.key!); + } + blake2b.addUint32(ctx.personalization?.length ?? 0); + if (ctx.personalization != null) { + blake2b.add(ctx.personalization!); + } + + var hash = blake2b.digest().bytes; + for (int i = 0; i < 64; ++i) { + hash0[i] = hash[i]; + } + } + + static void _expandHash( + int digestSize, + Uint8List message, + Uint8List output, + int offset, + ) { + int i, j; + + // Take smaller hash unchanged + if (digestSize <= 64) { + var blake2b = Blake2bHash(digestSize); + blake2b.addUint32(digestSize); + blake2b.add(message); + var hash = blake2b.digest().bytes; + for (i = 0; i < digestSize; ++i, offset++) { + output[offset] = hash[i]; + } + return; + } + + // Otherwise, expand to digestSize by repeatedly hashing + // and taking the first 32-bytes from the each hash + + var blake2b = Blake2bHash(64); + blake2b.addUint32(digestSize); + blake2b.add(message); + var hash = blake2b.digest().bytes; + + // first block + for (i = 0; i < 32; ++i, ++offset) { + output[offset] = hash[i]; + } + + // subsequent blocks + for (j = digestSize - 32; j > 64; j -= 32) { + blake2b.reset(); + blake2b.add(hash); + hash = blake2b.digest().bytes; + for (i = 0; i < 32; ++i, ++offset) { + output[offset] = hash[i]; + } + } + + // final block + blake2b.reset(); + blake2b.add(hash); + hash = blake2b.digest().bytes; + for (i = 0; i < j; ++i, ++offset) { + output[offset] = hash[i]; + } + } + + void _fillSegment(int pass, int slice, int lane) { + int refLane, refIndex; // l, z + int previous, current; + int i, startIndex, random; + + bool xor = ctx.version != Argon2Version.v10 && pass > 0; + bool useAddress = (ctx.type == Argon2Type.argon2i); + if (ctx.type == Argon2Type.argon2id) { + useAddress = (pass == 0) && (slice < ctx.midSlice); + } + + if (useAddress) { + _input[0] = pass; + _input[1] = lane; + _input[2] = slice; + _input[3] = ctx.blocks; + _input[4] = ctx.passes; + _input[5] = ctx.type.index; + _input[6] = 0; + } + + startIndex = 0; + if (pass == 0 && slice == 0) { + startIndex = 2; + if (useAddress) { + _input[6]++; + _nextAddress(_input, _address); + } + } + + /* Offset of the current block */ + current = lane * ctx.columns + slice * ctx.segments + startIndex; + + for (i = startIndex; i < ctx.segments; ++i, ++current) { + if (current % ctx.columns == 0) { + /* Last block in this lane */ + previous = current + ctx.columns - 1; + } else { + /* Previous block */ + previous = current - 1; + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + if (useAddress) { + if (i & 0x7F == 0) { + _input[6]++; + _nextAddress(_input, _address); + } + random = _address[i & 0x7F]; + } else { + random = _memory[previous << 7]; + } + + /* 1.2.2 Computing the lane of the reference block */ + refLane = (random >>> 32) % ctx.lanes; + + if (pass == 0 && slice == 0) { + /* Can not reference other lanes yet */ + refLane = lane; + } + + /* 1.2.3 Computing the number of possible reference block within the lane */ + refIndex = _alphaIndex( + random: random & _mask32, + index: i, + slice: slice, + lane: lane, + pass: pass, + sameLane: refLane == lane, + ); + + /* 2 Creating a new block */ + _fillBlock( + _memory, + xor: xor, + next: current << 7, + prev: previous << 7, + ref: (refLane * ctx.columns + refIndex) << 7, + ); + } + } + + int _alphaIndex({ + required int pass, + required int slice, + required int lane, + required int index, + required int random, + required bool sameLane, + }) { + int area, pos, start; + + if (pass == 0) { + // First pass + if (slice == 0) { + // First slice + area = index - 1; // all but the previous + } else if (sameLane) { + // The same lane => add current segment + area = slice * ctx.segments + index - 1; + } else if (index == 0) { + area = slice * ctx.segments - 1; + } else { + area = slice * ctx.segments; + } + } else { + // Other passes + if (sameLane) { + area = ctx.columns - ctx.segments + index - 1; + } else if (index == 0) { + area = ctx.columns - ctx.segments - 1; + } else { + area = ctx.columns - ctx.segments; + } + } + + // 1.2.4. Mapping pseudo_rand to 0.. + // and produce relative position + pos = (random * random) >>> 32; + pos = area - 1 - ((area * pos) >>> 32); + + /* 1.2.5 Computing starting position */ + start = 0; + if (pass != 0 && slice != ctx.slices - 1) { + start = (slice + 1) * ctx.segments; + } + + /* 1.2.6. Computing absolute position */ + return (start + pos) % ctx.columns; + } + + /// Fills a memory block and optionally XORs the old block over it. + void _nextAddress(Uint64List input, Uint64List address) { + for (int i = 0; i < 128; ++i) { + _blockR[i] = address[i] = input[i]; + } + + for (int k = 0; k < 2; ++k) { + // Apply Blake2 on columns of 64-bit words: (0,1,...,15), + // then (16,17,..31)... finally (112,113,...127) + for (int j = 0; j < 128; j += 16) { + _blake2bMixer( + _blockR, + j, + j + 1, + j + 2, + j + 3, + j + 4, + j + 5, + j + 6, + j + 7, + j + 8, + j + 9, + j + 10, + j + 11, + j + 12, + j + 13, + j + 14, + j + 15, + ); + } + + // Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), + // then (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) + for (int j = 0; j < 16; j += 2) { + _blake2bMixer( + _blockR, + j, + j + 1, + j + 16, + j + 17, + j + 32, + j + 33, + j + 48, + j + 49, + j + 64, + j + 65, + j + 80, + j + 81, + j + 96, + j + 97, + j + 112, + j + 113, + ); + } + + for (int i = 0; i < 128; ++i) { + address[i] = _blockR[i] ^= address[i]; + } + } + } + + /// Fills a memory block and optionally XORs the old block over it. + void _fillBlock( + Uint64List memory, { + required int prev, + required int ref, + required int next, + bool xor = false, + }) { + // R = ref ^ prev + for (int i = 0; i < 128; ++i) { + _blockT[i] = _blockR[i] = memory[ref + i] ^ memory[prev + i]; + } + + if (xor) { + // T ^= next + for (int i = 0; i < 128; ++i) { + _blockT[i] ^= memory[next + i]; + } + } + + // Apply Blake2 on columns of 64-bit words: (0,1,...,15), + // then (16,17,..31)... finally (112,113,...127) + for (int j = 0; j < 128; j += 16) { + _blake2bMixer( + _blockR, + j, + j + 1, + j + 2, + j + 3, + j + 4, + j + 5, + j + 6, + j + 7, + j + 8, + j + 9, + j + 10, + j + 11, + j + 12, + j + 13, + j + 14, + j + 15, + ); + } + + // Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), + // then (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) + for (int j = 0; j < 16; j += 2) { + _blake2bMixer( + _blockR, + j, + j + 1, + j + 16, + j + 17, + j + 32, + j + 33, + j + 48, + j + 49, + j + 64, + j + 65, + j + 80, + j + 81, + j + 96, + j + 97, + j + 112, + j + 113, + ); + } + + // next = T ^ R + for (int i = 0; i < 128; ++i) { + memory[next + i] = _blockR[i] ^ _blockT[i]; + } + } + + @pragma('vm:prefer-inline') + static int _mul32(int a, int b) => (a & _mask32) * (b & _mask32); + + @pragma('vm:prefer-inline') + static int _rotr(int x, int n) => (x >>> n) ^ (x << (64 - n)); + + static void _blake2bMixer( + Uint64List v, + int i0, + int i1, + int i2, + int i3, + int i4, + int i5, + int i6, + int i7, + int i8, + int i9, + int i10, + int i11, + int i12, + int i13, + int i14, + int i15, + ) { + int v0 = v[i0]; + int v1 = v[i1]; + int v2 = v[i2]; + int v3 = v[i3]; + int v4 = v[i4]; + int v5 = v[i5]; + int v6 = v[i6]; + int v7 = v[i7]; + int v8 = v[i8]; + int v9 = v[i9]; + int v10 = v[i10]; + int v11 = v[i11]; + int v12 = v[i12]; + int v13 = v[i13]; + int v14 = v[i14]; + int v15 = v[i15]; + + // _mix(v, v0, v4, v8, v12); + v0 += v4 + (_mul32(v0, v4) << 1); + v12 = _rotr(v12 ^ v0, 32); + v8 += v12 + (_mul32(v8, v12) << 1); + v4 = _rotr(v4 ^ v8, 24); + v0 += v4 + (_mul32(v0, v4) << 1); + v12 = _rotr(v12 ^ v0, 16); + v8 += v12 + (_mul32(v8, v12) << 1); + v4 = _rotr(v4 ^ v8, 63); + + // _mix(v, v1, v5, v9, v13); + v1 += v5 + (_mul32(v1, v5) << 1); + v13 = _rotr(v13 ^ v1, 32); + v9 += v13 + (_mul32(v9, v13) << 1); + v5 = _rotr(v5 ^ v9, 24); + v1 += v5 + (_mul32(v1, v5) << 1); + v13 = _rotr(v13 ^ v1, 16); + v9 += v13 + (_mul32(v9, v13) << 1); + v5 = _rotr(v5 ^ v9, 63); + + // _mix(v, v2, v6, v10, v14); + v2 += v6 + (_mul32(v2, v6) << 1); + v14 = _rotr(v14 ^ v2, 32); + v10 += v14 + (_mul32(v10, v14) << 1); + v6 = _rotr(v6 ^ v10, 24); + v2 += v6 + (_mul32(v2, v6) << 1); + v14 = _rotr(v14 ^ v2, 16); + v10 += v14 + (_mul32(v10, v14) << 1); + v6 = _rotr(v6 ^ v10, 63); + + // _mix(v, v3, v7, v11, v15); + v3 += v7 + (_mul32(v3, v7) << 1); + v15 = _rotr(v15 ^ v3, 32); + v11 += v15 + (_mul32(v11, v15) << 1); + v7 = _rotr(v7 ^ v11, 24); + v3 += v7 + (_mul32(v3, v7) << 1); + v15 = _rotr(v15 ^ v3, 16); + v11 += v15 + (_mul32(v11, v15) << 1); + v7 = _rotr(v7 ^ v11, 63); + + // _mix(v, v0, v5, v10, v15); + v0 += v5 + (_mul32(v0, v5) << 1); + v15 = _rotr(v15 ^ v0, 32); + v10 += v15 + (_mul32(v10, v15) << 1); + v5 = _rotr(v5 ^ v10, 24); + v0 += v5 + (_mul32(v0, v5) << 1); + v15 = _rotr(v15 ^ v0, 16); + v10 += v15 + (_mul32(v10, v15) << 1); + v5 = _rotr(v5 ^ v10, 63); + + // _mix(v, v1, v6, v11, v12); + v1 += v6 + (_mul32(v1, v6) << 1); + v12 = _rotr(v12 ^ v1, 32); + v11 += v12 + (_mul32(v11, v12) << 1); + v6 = _rotr(v6 ^ v11, 24); + v1 += v6 + (_mul32(v1, v6) << 1); + v12 = _rotr(v12 ^ v1, 16); + v11 += v12 + (_mul32(v11, v12) << 1); + v6 = _rotr(v6 ^ v11, 63); + + // _mix(v, v2, v7, v8, v13); + v2 += v7 + (_mul32(v2, v7) << 1); + v13 = _rotr(v13 ^ v2, 32); + v8 += v13 + (_mul32(v8, v13) << 1); + v7 = _rotr(v7 ^ v8, 24); + v2 += v7 + (_mul32(v2, v7) << 1); + v13 = _rotr(v13 ^ v2, 16); + v8 += v13 + (_mul32(v8, v13) << 1); + v7 = _rotr(v7 ^ v8, 63); + + // _mix(v, v3, v4, v9, v14); + v3 += v4 + (_mul32(v3, v4) << 1); + v14 = _rotr(v14 ^ v3, 32); + v9 += v14 + (_mul32(v9, v14) << 1); + v4 = _rotr(v4 ^ v9, 24); + v3 += v4 + (_mul32(v3, v4) << 1); + v14 = _rotr(v14 ^ v3, 16); + v9 += v14 + (_mul32(v9, v14) << 1); + v4 = _rotr(v4 ^ v9, 63); + + v[i0] = v0; + v[i1] = v1; + v[i2] = v2; + v[i3] = v3; + v[i4] = v4; + v[i5] = v5; + v[i6] = v6; + v[i7] = v7; + v[i8] = v8; + v[i9] = v9; + v[i10] = v10; + v[i11] = v11; + v[i12] = v12; + v[i13] = v13; + v[i14] = v14; + v[i15] = v15; + } +} + +extension on Blake2bHash { + void addUint32(int value) { + add([ + value, + value >>> 8, + value >>> 16, + value >>> 24, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/argon2/common.dart b/hashlib/lib/src/algorithms/argon2/common.dart new file mode 100644 index 0000000..8b60c06 --- /dev/null +++ b/hashlib/lib/src/algorithms/argon2/common.dart @@ -0,0 +1,298 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/random.dart'; + +const int _slices = 4; +const int _minParallelism = 1; +const int _maxParallelism = 0x7FFF; +const int _minDigestSize = 4; +const int _maxDigestSize = 0x3FFFFFF; +const int _minIterations = 1; +const int _maxIterations = 0x3FFFFFF; +const int _maxMemory = 0x3FFFFFF; +const int _minSaltSize = 8; +const int _maxSaltSize = 0x3FFFFFF; +const int _minKeySize = 1; +const int _maxKeySize = 0x3FFFFFF; +const int _minAD = 1; +const int _maxAD = 0x3FFFFFF; +const int _defaultHashLength = 32; + +/// The Argon2 types +enum Argon2Type { + argon2d._('argon2d'), + argon2i._('argon2i'), + argon2id._('argon2id'); + + /// Name of this type + final String name; + + const Argon2Type._(this.name); + + /// Gets the type from string name + static Argon2Type fromName(String name) { + switch (name) { + case 'argon2d': + return Argon2Type.argon2d; + case 'argon2i': + return Argon2Type.argon2i; + case 'argon2id': + return Argon2Type.argon2id; + default: + throw ArgumentError('Unknown type'); + } + } +} + +/// The Argon2 versions +enum Argon2Version { + v10._(0x10), + v13._(0x13); + + /// The version value + final int value; + + const Argon2Version._(this.value); + + /// Gets the version from integer value + static Argon2Version fromValue(int value) { + switch (value) { + case 0x10: + return Argon2Version.v10; + case 0x13: + return Argon2Version.v13; + default: + throw ArgumentError('Unknown version'); + } + } +} + +/// The HashDigest for Argon2 with [Argon2Context] +class Argon2HashDigest extends HashDigest { + final Argon2Context ctx; + + const Argon2HashDigest(this.ctx, super.bytes); + + @override + String toString() => encoded(); + + /// Gets the PHC-compliant string for this [Argon2HashDigest] + String encoded() => ctx.toEncoded(bytes); +} + +/// The configuration used by the **Argon2** algorithm +class Argon2Context { + /// Argon2 Hash Type + final Argon2Type type; + + /// The current version is 0x13 (decimal: 19) + final Argon2Version version; + + /// Degree of parallelism (i.e. number of threads) + final int lanes; + + /// Desired number of returned bytes + final int hashLength; + + /// Amount of memory (in kibibytes) to use + final int memorySizeKB; + + /// Number of iterations to perform + final int passes; + + /// Salt (16 bytes recommended for password hashing) + final List salt; + + /// Optional key + final List? key; + + /// Optional arbitrary additional data + final List? personalization; + + /// Number of slices per column + final int slices; + + /// The start index of the second half of the slices + final int midSlice; + + /// Number of segments per lane + final int segments; + + /// Total number of columns per lane + final int columns; + + /// Total number of memory blocks (1024 bytes each) + final int blocks; + + const Argon2Context._({ + required this.salt, + required this.version, + required this.type, + required this.hashLength, + required this.passes, + required this.lanes, + required this.memorySizeKB, + required this.slices, + required this.segments, + required this.columns, + required this.blocks, + required this.key, + required this.personalization, + }) : midSlice = slices ~/ 2; + + /// Creates a context for Argon2 password hashing + /// + /// Required Parameters: + /// - [iterations] Number of iterations to perform. + /// - [parallelism] Degree of parallelism (i.e. number of threads). + /// - [memorySizeKB] Amount of memory (in kibibytes) to use. + /// + /// Optional Parameters: + /// - [salt] Salt (16 bytes recommended for password hashing). If absent, a + /// 64 bytes random salt is generated. + /// - [hashLength] Desired number of returned bytes. Default: 32. + /// - [key] Additional key. + /// - [personalization] Arbitrary additional data. + /// - [version] Algorithm version; Default: `Argon2Version.v13`, + /// - [type] Argon2 type; Default: `Argon2Type.argon2id`. + factory Argon2Context({ + required int iterations, + required int parallelism, + required int memorySizeKB, + List? key, + List? salt, + List? personalization, + int? hashLength, + Argon2Version version = Argon2Version.v13, + Argon2Type type = Argon2Type.argon2id, + }) { + hashLength ??= _defaultHashLength; + if (hashLength < _minDigestSize) { + throw ArgumentError('The tag length must be at least $_minDigestSize'); + } + if (hashLength > _maxDigestSize) { + throw ArgumentError('The tag length must be at most $_maxDigestSize'); + } + if (parallelism < _minParallelism) { + throw ArgumentError('The parallelism must be at least $_minParallelism'); + } + if (parallelism > _maxParallelism) { + throw ArgumentError('The parallelism must be at most $_maxParallelism'); + } + if (iterations < _minIterations) { + throw ArgumentError('The iterations must be at least $_minIterations'); + } + if (iterations > _maxIterations) { + throw ArgumentError('The iterations must be at most $_maxIterations'); + } + if (memorySizeKB < (parallelism << 3)) { + throw ArgumentError('The memory size must be at least 8 * parallelism'); + } + if (memorySizeKB > _maxMemory) { + throw ArgumentError('The memorySizeKB must be at most $_maxMemory'); + } + salt ??= randomBytes(64); + if (salt.length < _minSaltSize) { + throw ArgumentError('The salt must be at least $_minSaltSize bytes long'); + } + if (salt.length > _maxSaltSize) { + throw ArgumentError('The salt must be at most $_maxSaltSize bytes long'); + } + if (key != null) { + if (key.length < _minKeySize) { + throw ArgumentError('The key must be at least $_minKeySize bytes long'); + } + if (key.length > _maxKeySize) { + throw ArgumentError('The key must be at most $_maxKeySize bytes long'); + } + } + if (personalization != null) { + if (personalization.length < _minAD) { + throw ArgumentError('The extra data must be at least $_minAD bytes'); + } + if (personalization.length > _maxAD) { + throw ArgumentError('The extra data must be at most $_maxAD'); + } + } + + int segments = memorySizeKB ~/ (_slices * parallelism); + int columns = _slices * segments; + int blocks = parallelism * _slices * segments; + + return Argon2Context._( + salt: salt, + version: version, + type: type, + hashLength: hashLength, + passes: iterations, + slices: _slices, + lanes: parallelism, + memorySizeKB: memorySizeKB, + columns: columns, + segments: segments, + blocks: blocks, + key: key, + personalization: personalization, + ); + } + + /// Creates an [Argon2Context] instance from an encoded PHC-compliant string. + /// + /// The encoded string may look like this: + /// `$argon2i$v=19$m=16,t=2,p=1$c29tZSBzYWx0$u1eU6mZFG4/OOoTdAtM5SQ` + factory Argon2Context.fromEncoded( + CryptData data, { + List? key, + List? personalization, + }) { + var type = Argon2Type.fromName(data.id); + var version = Argon2Version.fromValue( + int.tryParse(data.version ?? '0') ?? 0, + ); + if (data.params == null) { + throw ArgumentError('No paramters'); + } + var m = data.params!['m']; + if (m == null) { + throw ArgumentError('Missing parameter: m'); + } + var t = data.params!['t']; + if (t == null) { + throw ArgumentError('Missing parameter: t'); + } + var p = data.params!['p']; + if (p == null) { + throw ArgumentError('Missing parameter: p'); + } + return Argon2Context( + type: type, + version: version, + iterations: int.parse(t), + parallelism: int.parse(p), + memorySizeKB: int.parse(m), + salt: data.saltBytes(), + hashLength: data.hashBytes()?.lengthInBytes, + key: key, + personalization: personalization, + ); + } + + /// Gets the PHC-compliant string for this [Argon2HashDigest] + String toEncoded(Uint8List hashBytes) { + return toCrypt( + CryptDataBuilder(type.name) + .version('${version.value}') + .param('m', memorySizeKB) + .param('t', passes) + .param('p', lanes) + .saltBytes(salt) + .hashBytes(hashBytes) + .build(), + ); + } +} diff --git a/hashlib/lib/src/algorithms/argon2/security.dart b/hashlib/lib/src/algorithms/argon2/security.dart new file mode 100644 index 0000000..7361892 --- /dev/null +++ b/hashlib/lib/src/algorithms/argon2/security.dart @@ -0,0 +1,110 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'argon2.dart'; + +/// This contains some recommended values of memory, iteration and parallelism +/// values for [Argon2] algorithm. +/// +/// It is best to try out different combinations of these values to achieve the +/// desired runtime on a target machine. +class Argon2Security { + final String name; + + /// The amount of memory to use in KB. The more the better, but slower. + final int m; + + /// Number of threads or lanes to use. The more the better, but slower. + final int p; + + /// Number of iterations. The more the better, but slower. + final int t; + + /// The type of the algorithm + final Argon2Type type; + + /// The version of the algorithm + final Argon2Version version; + + const Argon2Security( + this.name, { + required this.m, + required this.p, + required this.t, + this.type = Argon2Type.argon2id, + this.version = Argon2Version.v13, + }); + + /// Provides a very low security. Use it for test purposes. + /// + /// It uses 32KB of memory, 2 lanes, and 2 iterations. + /// + /// **WARNING: Not recommended for general use.** + static const test = Argon2Security('test', m: 1 << 5, p: 4, t: 3); + + /// Provides low security but faster. Suitable for low-end devices. + /// + /// It uses 1MB of memory, 8 lanes, and 2 iterations. + static const little = Argon2Security('little', m: 1 << 10, p: 8, t: 2); + + /// Provides moderate security. Suitable for modern mobile devices. + /// + /// It uses 8MB of memory, 4 lanes, and 3 iterations. + /// This is 10x slower than the [little] one. + static const moderate = Argon2Security('moderate', m: 1 << 13, p: 4, t: 2); + + /// Provides good security. Second recommended option by [RFC-9106][rfc]. + /// + /// It uses 64MB of memory, 4 lanes, and 3 iterations. + /// This is 10x slower than the [moderate] one. + /// + /// [rfc]: https://www.ietf.org/rfc/rfc9106.html + static const good = Argon2Security('good', m: 1 << 16, p: 4, t: 3); + + /// Provides strong security. First recommended option by [RFC-9106][rfc]. + /// + /// It uses 2GB of memory, 4 lanes, and 1 iteration. + /// This is 10x slower than the [good] one. + /// + /// [rfc]: https://www.ietf.org/rfc/rfc9106.html + static const strong = Argon2Security('strong', m: 1 << 21, p: 4, t: 1); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses 46MB of memory, 1 lane, and 1 iteration. + /// + /// **Do not use with Argon2i.** + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp = Argon2Security('owasp1', m: 47104, t: 1, p: 1); + + /// Second recommendation from [OWASP][link]. + /// + /// It uses 19MB of memory, 1 lane, and 2 iterations. + /// + /// **Do not use with Argon2i.** + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp2 = Argon2Security('owasp2', m: 19456, t: 2, p: 1); + + /// Third recommendation from [OWASP][link]. + /// + /// It uses 12MB of memory, 1 lane, and 3 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp3 = Argon2Security('owasp3', m: 12288, t: 3, p: 1); + + /// Fourth recommendation from [OWASP][link]. + /// + /// It uses 9MB of memory, 1 lane, and 4 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp4 = Argon2Security('owasp4', m: 9216, t: 4, p: 1); + + /// Second recommendation from [OWASP][link]. + /// + /// It uses 7MB of memory, 1 lane, and 5 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp5 = Argon2Security('owasp5', m: 7168, t: 5, p: 1); +} diff --git a/hashlib/lib/src/algorithms/bcrypt/bcrypt.dart b/hashlib/lib/src/algorithms/bcrypt/bcrypt.dart new file mode 100644 index 0000000..6029137 --- /dev/null +++ b/hashlib/lib/src/algorithms/bcrypt/bcrypt.dart @@ -0,0 +1,488 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/bcrypt/common.dart'; +import 'package:hashlib/src/algorithms/bcrypt/security.dart'; +import 'package:hashlib/src/core/kdf_base.dart'; + +/// Implementation for the bcrypt key generator +class Bcrypt extends KeyDerivatorBase { + final BcryptContext _ctx; + + @override + String get name => 'Bcrypt/${_ctx.version.name}'; + + @override + final int derivedKeyLength = 23; + + const Bcrypt._(this._ctx); + + /// Creates an [Bcrypt] instance with a sink for MAC generation. + factory Bcrypt({ + required int cost, + List? salt, + BcryptVersion version = BcryptVersion.$2b, + }) { + var ctx = BcryptContext( + cost: cost, + salt: salt, + version: version, + ); + return Bcrypt._(ctx); + } + + /// Creates an [Bcrypt] instance from [BcryptSecurity] parameter. + factory Bcrypt.fromSecurity( + BcryptSecurity security, { + List? salt, + BcryptVersion version = BcryptVersion.$2b, + }) { + var ctx = BcryptContext( + cost: security.nb, + salt: salt, + version: version, + ); + return Bcrypt._(ctx); + } + + /// Creates an [Bcrypt] instance from encoded string. + factory Bcrypt.fromEncoded(CryptData data) { + var ctx = BcryptContext.fromEncoded(data); + return Bcrypt._(ctx); + } + + /// Generate a derived key using the Bcrypt algorithm. + @override + BcryptHashDigest convert(List password) { + int i, j, l, h, t; + int s0, s1, s2, s3; + int nb = 1 << _ctx.cost; + var pass32 = _ctx.makePassword(password); + var salt32 = _makeSaltKey(_ctx.salt); + + // Initialize state: P (Subkeys) + S (Substitution boxes) + var state = Uint32List.fromList(_sv); + var p = Uint32List.view(state.buffer, 0, 18); + var s = Uint32List.view(state.buffer, 18 << 2, 1024); + + // Blowfish encrypt routine + l = 0; + h = 0; + void encrypt() { + l ^= p[0]; + h ^= _fsub(s, l) ^ p[1]; + l ^= _fsub(s, h) ^ p[2]; + h ^= _fsub(s, l) ^ p[3]; + l ^= _fsub(s, h) ^ p[4]; + h ^= _fsub(s, l) ^ p[5]; + l ^= _fsub(s, h) ^ p[6]; + h ^= _fsub(s, l) ^ p[7]; + l ^= _fsub(s, h) ^ p[8]; + h ^= _fsub(s, l) ^ p[9]; + l ^= _fsub(s, h) ^ p[10]; + h ^= _fsub(s, l) ^ p[11]; + l ^= _fsub(s, h) ^ p[12]; + h ^= _fsub(s, l) ^ p[13]; + l ^= _fsub(s, h) ^ p[14]; + h ^= _fsub(s, l) ^ p[15]; + l ^= _fsub(s, h) ^ p[16]; + h ^= p[17]; + // swap + t = l; + l = h; + h = t; + } + + // Key Expansion + l = 0; + h = 0; + s0 = salt32[0]; + s1 = salt32[1]; + s2 = salt32[2]; + s3 = salt32[3]; + for (i = 0; i < 18; ++i) { + p[i] ^= pass32[i]; + } + for (i = 0; i < state.length; i += 2) { + // block ^= salt + l ^= s0; + h ^= s1; + // blowfish encrypt + encrypt(); + // set state + state[i] = l; + state[i + 1] = h; + // s0 <-> s2 + t = s0; + s0 = s2; + s2 = t; + // s1 <-> s3 + t = s1; + s1 = s3; + s3 = t; + } + + // Bcrypt Rounds + for (j = 0; j < nb; ++j) { + // mix with password + l = 0; + h = 0; + for (i = 0; i < 18; ++i) { + p[i] ^= pass32[i]; + } + for (i = 0; i < state.length;) { + encrypt(); + state[i++] = l; + state[i++] = h; + } + // mix with salt + l = 0; + h = 0; + for (i = 0; i < 18; ++i) { + p[i] ^= salt32[i]; + } + for (i = 0; i < state.length;) { + encrypt(); + state[i++] = l; + state[i++] = h; + } + } + + // Encrypt IV + var result = Uint32List.fromList(_iv); + for (i = 0; i < 64; i++) { + l = result[0]; + h = result[1]; + encrypt(); + result[0] = l; + result[1] = h; + + l = result[2]; + h = result[3]; + encrypt(); + result[2] = l; + result[3] = h; + + l = result[4]; + h = result[5]; + encrypt(); + result[4] = l; + result[5] = h; + } + + // Transform to bytes + for (i = 0; i < result.length; ++i) { + result[i] = _swap32(result[i]); + } + var output = Uint8List.view(result.buffer, 0, derivedKeyLength); + return BcryptHashDigest(_ctx, output); + } + + static Uint32List _makeSaltKey(Uint8List salt) { + var salt32 = Uint32List.view(salt.buffer); + var dest = Uint32List(18); + dest[0] = _swap32(salt32[0]); + dest[1] = _swap32(salt32[1]); + dest[2] = _swap32(salt32[2]); + dest[3] = _swap32(salt32[3]); + for (int i = 4, j = 0; i < 18; i++, j++) { + dest[i] = dest[j]; + } + return dest; + } + + @pragma('vm:prefer-inline') + static int _swap32(int x) => + ((x << 24) & 0xff000000) | + ((x << 8) & 0x00ff0000) | + ((x >>> 8) & 0x0000ff00) | + ((x >>> 24) & 0x000000ff); + + /// Feistel substitution + @pragma('vm:prefer-inline') + static int _fsub(Uint32List s, int l) => + ((s[(l >>> 24) & 0xff] + // + s[0x100 | ((l >>> 16) & 0xff)]) ^ + s[0x200 | ((l >>> 8) & 0xff)]) + + s[0x300 | (l & 0xff)]; +} + +/// Hex form of text: 'OrpheanBeholderScryDoubt' +const List _iv = [ + 0x4f727068, + 0x65616e42, + 0x65686f6c, + 0x64657253, + 0x63727944, + 0x6f756274, +]; + +/// Fractional part of PI +const List _sv = [ + // first 18 bytes + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b, + // next 1024 bytes + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, +]; diff --git a/hashlib/lib/src/algorithms/bcrypt/common.dart b/hashlib/lib/src/algorithms/bcrypt/common.dart new file mode 100644 index 0000000..d3af198 --- /dev/null +++ b/hashlib/lib/src/algorithms/bcrypt/common.dart @@ -0,0 +1,177 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/bcrypt/bcrypt.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/random.dart'; + +/// The [Bcrypt] algorithm version +enum BcryptVersion { + /// This is a revised version of original v2 with UTF-8 character support + /// and inclusion of the null terminator with the password. + $2a._('2a'), + + /// This is the bug-fixed version of OpenBSD implementation of bcrypt, which + /// fixes the support for password longer than 255 characters. + $2b._('2b'), + + /// This was introduced by PHP `crypt_blowfish` implementation to mark hashes + /// generated with a bug in their implementation. + $2x._('2x'), + + /// This was introduced by PHP `crypt_blowfish` implementation to mark hashes + /// generated after fixing the bug in their implementation. + $2y._('2y'); + + /// The name of this version + final String name; + + const BcryptVersion._(this.name); + + /// Gets the version from string name + static BcryptVersion fromName(String name) { + switch (name) { + case '2a': + return BcryptVersion.$2a; + case '2b': + return BcryptVersion.$2b; + case '2x': + return BcryptVersion.$2x; + case '2y': + return BcryptVersion.$2y; + default: + throw FormatException('Invalid version'); + } + } +} + +/// The HashDigest for Bcrypt with [BcryptContext] +class BcryptHashDigest extends HashDigest { + final BcryptContext ctx; + + const BcryptHashDigest(this.ctx, super.bytes); + + @override + String toString() => encoded(); + + /// Gets a PHC-compliant encoded string + String encoded() => ctx.toEncoded(bytes); +} + +/// The configuration used by the [Bcrypt] algorithm +class BcryptContext { + /// The BCrypt version + final BcryptVersion version; + + /// Number of rounds in terms of power of 2 + final int cost; + + /// 16-byte salt + final Uint8List salt; + + const BcryptContext._({ + required this.salt, + required this.version, + required this.cost, + }); + + /// Creates an [BcryptContext] instance from encoded string. + /// + /// Parameters: + /// - [version] : The BcryptVersion to use. Default `BcryptVersion.$2b`. + /// - [salt] : An uniquely and randomly generated string. + /// - [cost] : Number of rounds in terms of power of 2. 0 < [cost] < 31. + factory BcryptContext({ + required int cost, + List? salt, + BcryptVersion version = BcryptVersion.$2b, + }) { + // validate parameters + if (cost < 0) { + throw ArgumentError('The cost must be at least 0'); + } + if (cost > 31) { + throw ArgumentError('The cost must be at most 31'); + } + salt ??= randomBytes(16); + if (salt.length != 16) { + throw ArgumentError('The salt must be exactly 16-bytes'); + } + return BcryptContext._( + cost: cost, + version: version, + salt: salt is Uint8List ? salt : Uint8List.fromList(salt), + ); + } + + /// Creates an [BcryptContext] instance from encoded string. + /// + /// The encoded string may look like this: + /// `$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC` + factory BcryptContext.fromEncoded(CryptData data) { + var version = BcryptVersion.fromName(data.id); + var cost = int.tryParse(data.salt ?? '0'); + if (cost == null) { + throw FormatException('Invalid cost'); + } + Uint8List? salt; + var hash = data.hash; + if (hash != null) { + if (hash.length != 22 && hash.length != 53) { + throw FormatException('Invalid hash'); + } + salt = fromBase64( + hash.substring(0, 22), + codec: Base64Codec.bcrypt, + ); + } + return BcryptContext( + salt: salt, + cost: cost, + version: version, + ); + } + + /// Gets a PHC-compliant encoded string + String toEncoded([Uint8List? hashBytes]) { + var hash = toBase64(salt, codec: Base64Codec.bcrypt); + if (hashBytes != null) { + hash += toBase64(hashBytes, codec: Base64Codec.bcrypt); + } + return toCrypt( + CryptDataBuilder(version.name) + .salt('$cost'.padLeft(2, '0')) + .hash(hash) + .build(), + ); + } + + /// Make the 72-byte long password using version-specific strategy. + Uint32List makePassword(List password) { + int i, j; + var long32 = Uint32List(18); + var long = Uint8List.view(long32.buffer); + var pass8 = Uint8List.fromList(password); + for (i = 0; i < 72 && i < pass8.length; i++) { + long[i] = pass8[i]; + } + if (i < 72) { + long[i++] = 0; + } + for (j = 0; i < 72; i++, j++) { + long[i] = long[j]; + } + for (i = 0; i < 18; ++i) { + j = long32[i]; + j = ((j << 24) & 0xff000000) | + ((j << 8) & 0x00ff0000) | + ((j >>> 8) & 0x0000ff00) | + ((j >>> 24) & 0x000000ff); + long32[i] = j; + } + return long32; + } +} diff --git a/hashlib/lib/src/algorithms/bcrypt/security.dart b/hashlib/lib/src/algorithms/bcrypt/security.dart new file mode 100644 index 0000000..f89c121 --- /dev/null +++ b/hashlib/lib/src/algorithms/bcrypt/security.dart @@ -0,0 +1,51 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'bcrypt.dart'; + +/// This contains some recommended parameters for [Bcrypt] algorithm. +class BcryptSecurity { + final String name; + + /// The number of rounds in terms of power of 2. + final int nb; + + const BcryptSecurity( + this.name, { + required this.nb, + }); + + /// Provides a very low security. Use it for test purposes. + /// + /// It uses 2^1 = 2 round for encryption. + /// + /// **WARNING: Not recommended for general use.** + static const test = BcryptSecurity('test', nb: 1); + + /// Provides low security but faster. Suitable for low-end devices. + /// + /// It uses 2^5 = 32 rounds for encryption. + static const little = BcryptSecurity('little', nb: 5); + + /// Provides moderate security. Suitable for modern mobile devices. + /// + /// It uses 2^8 = 256 rounds for encryption. + static const moderate = BcryptSecurity('moderate', nb: 8); + + /// Provides good security. + /// + /// It uses 2^12 = 4096 rounds for encryption. + static const good = BcryptSecurity('good', nb: 12); + + /// Provides strong security. + /// + /// It uses 2^15 = 32768 rounds for encryption. + static const strong = BcryptSecurity('strong', nb: 15); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses 2^10 = 1024 rounds for encryption. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp = BcryptSecurity('owasp', nb: 10); +} diff --git a/hashlib/lib/src/algorithms/blake2/blake2b.dart b/hashlib/lib/src/algorithms/blake2/blake2b.dart new file mode 100644 index 0000000..e4209e9 --- /dev/null +++ b/hashlib/lib/src/algorithms/blake2/blake2b.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'blake2b_64bit.dart' if (dart.library.js) 'blake2b_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/blake2/blake2b_32bit.dart b/hashlib/lib/src/algorithms/blake2/blake2b_32bit.dart new file mode 100644 index 0000000..415d4bf --- /dev/null +++ b/hashlib/lib/src/algorithms/blake2/blake2b_32bit.dart @@ -0,0 +1,354 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +/* + | BLAKE2b | +--------------+------------------+ + Bits in word | w = 64 | + Rounds in F | r = 12 | + Block bytes | bb = 128 | + Hash bytes | 1 <= nn <= 64 | + Key bytes | 0 <= kk <= 64 | + Input bytes | 0 <= ll < 2**128 | +--------------+------------------+ + G Rotation | (R1, R2, R3, R4) | + constants = | (32, 24, 16, 63) | +--------------+------------------+ +*/ + +const int _mask32 = 0xFFFFFFFF; + +const int _r1 = 32; +const int _r2 = 24; +const int _r3 = 16; +const int _r4 = 63; + +const _seed = [ + 0xF3BCC908, 0x6A09E667, // + 0x84CAA73B, 0xBB67AE85, + 0xFE94F82B, 0x3C6EF372, + 0x5F1D36F1, 0xA54FF53A, + 0xADE682D1, 0x510E527F, + 0x2B3E6C1F, 0x9B05688C, + 0xFB41BD6B, 0x1F83D9AB, + 0x137E2179, 0x5BE0CD19, +]; + +// This is used to contruct sigma2 map. Kept for future reference. +// const _sigma = [ +// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 0 +// [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], // round 1 +// [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], // round 2 +// [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], // round 3 +// [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], // round 4 +// [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], // round 5 +// [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], // round 6 +// [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], // round 7 +// [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], // round 8 +// [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], // round 9 +// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 10 +// [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], // round 11 +// ]; + +// _sigma.map((e) => e.map((e) => e << 1).toList()).toList(); +const _sigma2 = [ + [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30], // round 0 + [28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6], // round 1 + [22, 16, 24, 0, 10, 4, 30, 26, 20, 28, 6, 12, 14, 2, 18, 8], // round 2 + [14, 18, 6, 2, 26, 24, 22, 28, 4, 12, 10, 20, 8, 0, 30, 16], // round 3 + [18, 0, 10, 14, 4, 8, 20, 30, 28, 2, 22, 24, 12, 16, 6, 26], // round 4 + [4, 24, 12, 20, 0, 22, 16, 6, 8, 26, 14, 10, 30, 28, 2, 18], // round 5 + [24, 10, 2, 30, 28, 26, 8, 20, 0, 14, 12, 6, 18, 4, 16, 22], // round 6 + [26, 22, 14, 28, 24, 2, 6, 18, 10, 0, 30, 8, 16, 12, 4, 20], // round 7 + [12, 30, 28, 18, 22, 6, 0, 16, 24, 4, 26, 14, 2, 8, 20, 10], // round 8 + [20, 4, 16, 8, 14, 12, 2, 10, 30, 22, 18, 28, 6, 24, 26, 0], // round 9 + [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30], // round 10 + [28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6], // round 11 +]; + +const int _w0 = 0; +const int _w1 = _w0 + 2; +const int _w2 = _w1 + 2; +const int _w3 = _w2 + 2; +const int _w4 = _w3 + 2; +const int _w5 = _w4 + 2; +const int _w6 = _w5 + 2; +const int _w7 = _w6 + 2; +const int _w8 = _w7 + 2; +const int _w9 = _w8 + 2; +const int _w10 = _w9 + 2; +const int _w11 = _w10 + 2; +const int _w12 = _w11 + 2; +const int _w13 = _w12 + 2; +const int _w14 = _w13 + 2; +const int _w15 = _w14 + 2; + +/// Implementation is derived from [RFC-7693][rfc] document for +/// "The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)". +/// +/// For reference, the official [blake2][blake2] implementation was followed. +/// +/// Note that blake2b uses 64-bit operations. +/// +/// [rfc]: https://www.ietf.org/rfc/rfc7693.html +/// [blake2]: https://github.com/BLAKE2/BLAKE2/blob/master/ref/blake2b-ref.c +class Blake2bHash extends BlockHashSink implements MACSinkBase { + final List? key; + late int _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7; + late int _s8, _s9, _s10, _s11, _s12, _s13, _s14, _s15; + final Uint32List _var = Uint32List(_w15 + 2); + final Uint32List state = Uint32List(_seed.length); + + @override + final int hashLength; + + @override + final int derivedKeyLength; + + /// For internal use only. + Blake2bHash( + int digestSize, { + this.key, + List? salt, + List? aad, + }) : hashLength = digestSize, + derivedKeyLength = digestSize, + super(1024 >>> 3) { + if (digestSize < 1 || digestSize > 64) { + throw ArgumentError('The digest size must be between 1 and 64'); + } + + // Parameter block from the seed + _s0 = _seed[0] ^ 0x01010000 ^ hashLength; + _s1 = _seed[1]; + _s2 = _seed[2]; + _s3 = _seed[3]; + _s4 = _seed[4]; + _s5 = _seed[5]; + _s6 = _seed[6]; + _s7 = _seed[7]; + _s8 = _seed[8]; + _s9 = _seed[9]; + _s10 = _seed[10]; + _s11 = _seed[11]; + _s12 = _seed[12]; + _s13 = _seed[13]; + _s14 = _seed[14]; + _s15 = _seed[15]; + + if (key != null && key!.isNotEmpty) { + if (key!.length > 64) { + throw ArgumentError('The key should not be greater than 64 bytes'); + } + // Add key length to parameter + _s0 ^= key!.length << 8; + } + + if (salt != null && salt.isNotEmpty) { + if (salt.length != 16) { + throw ArgumentError('The valid length of salt is 16 bytes'); + } + for (int i = 0, p = 0; i < 4; i++, p += 8) { + _s8 ^= (salt[i] & 0xFF) << p; + } + for (int i = 4, p = 0; i < 8; i++, p += 8) { + _s9 ^= (salt[i] & 0xFF) << p; + } + for (int i = 8, p = 0; i < 12; i++, p += 8) { + _s10 ^= (salt[i] & 0xFF) << p; + } + for (int i = 12, p = 0; i < 16; i++, p += 8) { + _s11 ^= (salt[i] & 0xFF) << p; + } + } + + if (aad != null && aad.isNotEmpty) { + if (aad.length != 16) { + throw ArgumentError('The valid length of personalization is 16 bytes'); + } + for (int i = 0, p = 0; i < 4; i++, p += 8) { + _s12 ^= (aad[i] & 0xFF) << p; + } + for (int i = 4, p = 0; i < 8; i++, p += 8) { + _s13 ^= (aad[i] & 0xFF) << p; + } + for (int i = 8, p = 0; i < 12; i++, p += 8) { + _s14 ^= (aad[i] & 0xFF) << p; + } + for (int i = 12, p = 0; i < 16; i++, p += 8) { + _s15 ^= (aad[i] & 0xFF) << p; + } + } + + reset(); + } + + @override + void reset() { + super.reset(); + state[0] = _s0; + state[1] = _s1; + state[2] = _s2; + state[3] = _s3; + state[4] = _s4; + state[5] = _s5; + state[6] = _s6; + state[7] = _s7; + state[8] = _s8; + state[9] = _s9; + state[10] = _s10; + state[11] = _s11; + state[12] = _s12; + state[13] = _s13; + state[14] = _s14; + state[15] = _s15; + // If the key is present, the first block is the key padded with zeroes + if (key != null) { + int i; + for (i = 0; i < key!.length; ++i) { + buffer[i] = key![i]; + } + for (; i < blockLength; ++i) { + buffer[i] = 0; + } + messageLength = pos = blockLength; + } + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++, messageLength++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + } + + /// `v[k] = (v[i] << (64 - n)) | (v[i] >>> n)` + static void _rotr(int n, List v, int i, int k) { + var a = v[i + 1]; + var b = v[i]; + if (n == 32) { + v[k + 1] = b; + v[k] = a; + } else if (n < 32) { + v[k + 1] = (b << (32 - n)) | (a >>> n); + v[k] = (a << (32 - n)) | (b >>> n); + } else { + v[k + 1] = (a << (64 - n)) | (b >>> (n - 32)); + v[k] = (b << (64 - n)) | (a >>> (n - 32)); + } + } + + /// `v[k] = v[i] ^ v[j]` + static void _xor(List v, int i, int j, int k) { + v[k] = v[i] ^ v[j]; + v[k + 1] = v[i + 1] ^ v[j + 1]; + } + + /// `v[k] = v[i] + v[j]` + static void _add2(List v, int i, int j, int k) { + var t = v[i] + v[j]; + v[k] = t; + v[k + 1] = (v[i + 1] + v[j + 1]) + (v[k] < t ? 1 : 0); + } + + /// `v[k] = v[i] + v[j] + n[x]` + static void _add3(List v, int i, int j, List n, int x, int k) { + var t = v[i] + v[j]; + v[k] = t; + v[k + 1] = v[i + 1] + v[j + 1] + (v[k] < t ? 1 : 0); + t = v[k] + n[x]; + v[k] += n[x]; + v[k + 1] += n[x + 1] + (v[k] < t ? 1 : 0); + } + + // The G function for mixing + static void _mix( + List v, + int a, + int b, + int c, + int d, + List m, + int x, + int y, + ) { + // v[a] = (v[a] + v[b] + x); + _add3(v, a, b, m, x, a); + // v[d] = _rotr(v[d] ^ v[a], _r1); + _xor(v, d, a, d); + _rotr(_r1, v, d, d); + // v[c] = (v[c] + v[d]); + _add2(v, c, d, c); + // v[b] = _rotr(v[b] ^ v[c], _r2); + _xor(v, b, c, b); + _rotr(_r2, v, b, b); + // v[a] = (v[a] + v[b] + y); + _add3(v, a, b, m, y, a); + // v[d] = _rotr(v[d] ^ v[a], _r3); + _xor(v, d, a, d); + _rotr(_r3, v, d, d); + // v[c] = (v[c] + v[d]); + _add2(v, c, d, c); + // v[b] = _rotr(v[b] ^ v[c], _r4); + _xor(v, b, c, b); + _rotr(_r4, v, b, b); + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + // Copy state and seed + for (int i = 0; i < 16; ++i) { + _var[i] = state[i]; + _var[_w8 + i] = _seed[i]; + } + + _var[_w12] ^= messageLength & _mask32; + _var[_w12 + 1] ^= (messageLength >>> 32) & _mask32; + + if (last) { + _var[_w14] ^= _mask32; + _var[_w14 + 1] ^= _mask32; + } + + // Cryptographic mixing + for (int i = 0; i < 12; i++) { + var s = _sigma2[i]; + _mix(_var, _w0, _w4, _w8, _w12, sbuffer, s[0], s[1]); + _mix(_var, _w1, _w5, _w9, _w13, sbuffer, s[2], s[3]); + _mix(_var, _w2, _w6, _w10, _w14, sbuffer, s[4], s[5]); + _mix(_var, _w3, _w7, _w11, _w15, sbuffer, s[6], s[7]); + _mix(_var, _w0, _w5, _w10, _w15, sbuffer, s[8], s[9]); + _mix(_var, _w1, _w6, _w11, _w12, sbuffer, s[10], s[11]); + _mix(_var, _w2, _w7, _w8, _w13, sbuffer, s[12], s[13]); + _mix(_var, _w3, _w4, _w9, _w14, sbuffer, s[14], s[15]); + } + + // Build new state + for (int i = 0; i < 16; ++i) { + state[i] ^= _var[i] ^ _var[_w8 + i]; + } + } + + @override + Uint8List $finalize() { + // Fill remaining buffer to put the message length at the end + for (; pos < blockLength; pos++) { + buffer[pos] = 0; + } + + // Update with the final block + $update(buffer, 0, true); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/blake2/blake2b_64bit.dart b/hashlib/lib/src/algorithms/blake2/blake2b_64bit.dart new file mode 100644 index 0000000..d1d81fb --- /dev/null +++ b/hashlib/lib/src/algorithms/blake2/blake2b_64bit.dart @@ -0,0 +1,323 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +/* + | BLAKE2b | +--------------+------------------+ + Bits in word | w = 64 | + Rounds in F | r = 12 | + Block bytes | bb = 128 | + Hash bytes | 1 <= nn <= 64 | + Key bytes | 0 <= kk <= 64 | + Input bytes | 0 <= ll < 2**128 | +--------------+------------------+ + G Rotation | (R1, R2, R3, R4) | + constants = | (32, 24, 16, 63) | +--------------+------------------+ +*/ + +const int _r1 = 32; +const int _r2 = 24; +const int _r3 = 16; +const int _r4 = 63; + +const _seed = [ + 0x6A09E667F3BCC908, + 0xBB67AE8584CAA73B, + 0x3C6EF372FE94F82B, + 0xA54FF53A5F1D36F1, + 0x510E527FADE682D1, + 0x9B05688C2B3E6C1F, + 0x1F83D9ABFB41BD6B, + 0x5BE0CD19137E2179, +]; + +const _sigma = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 0 + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], // round 1 + [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], // round 2 + [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], // round 3 + [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], // round 4 + [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], // round 5 + [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], // round 6 + [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], // round 7 + [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], // round 8 + [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], // round 9 + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 10 + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], // round 11 +]; + +/// Implementation is derived from [RFC-7693][rfc] document for +/// "The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)". +/// +/// For reference, the official [blake2][blake2] implementation was followed. +/// +/// Note that blake2b uses 64-bit operations. +/// +/// [rfc]: https://www.ietf.org/rfc/rfc7693.html +/// [blake2]: https://github.com/BLAKE2/BLAKE2/blob/master/ref/blake2b-ref.c +class Blake2bHash extends BlockHashSink implements MACSinkBase { + final List? key; + late int _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7; + final Uint64List state = Uint64List(_seed.length); + late final Uint64List qbuffer = Uint64List.view(buffer.buffer); + + @override + final int hashLength; + + @override + final int derivedKeyLength; + + /// For internal use only. + Blake2bHash( + int digestSize, { + this.key, + List? salt, + List? aad, + }) : hashLength = digestSize, + derivedKeyLength = digestSize, + super(1024 >>> 3) { + if (digestSize < 1 || digestSize > 64) { + throw ArgumentError('The digest size must be between 1 and 64'); + } + + // Parameter block from the seed + _s0 = _seed[0] ^ 0x01010000 ^ hashLength; + _s1 = _seed[1]; + _s2 = _seed[2]; + _s3 = _seed[3]; + _s4 = _seed[4]; + _s5 = _seed[5]; + _s6 = _seed[6]; + _s7 = _seed[7]; + + if (key != null && key!.isNotEmpty) { + if (key!.length > 64) { + throw ArgumentError('The key should not be greater than 64 bytes'); + } + // Add key length to parameter + _s0 ^= key!.length << 8; + } + + if (salt != null && salt.isNotEmpty) { + if (salt.length != 16) { + throw ArgumentError('The valid length of salt is 16 bytes'); + } + for (int i = 0, p = 0; i < 8; i++, p += 8) { + _s4 ^= (salt[i] & 0xFF) << p; + } + for (int i = 8, p = 0; i < 16; i++, p += 8) { + _s5 ^= (salt[i] & 0xFF) << p; + } + } + + if (aad != null && aad.isNotEmpty) { + if (aad.length != 16) { + throw ArgumentError('The valid length of personalization is 16 bytes'); + } + for (int i = 0, p = 0; i < 8; i++, p += 8) { + _s6 ^= (aad[i] & 0xFF) << p; + } + for (int i = 8, p = 0; i < 16; i++, p += 8) { + _s7 ^= (aad[i] & 0xFF) << p; + } + } + + reset(); + } + + @override + void reset() { + super.reset(); + state[0] = _s0; + state[1] = _s1; + state[2] = _s2; + state[3] = _s3; + state[4] = _s4; + state[5] = _s5; + state[6] = _s6; + state[7] = _s7; + // If the key is present, the first block is the key padded with zeroes + if (key != null) { + int i; + for (i = 0; i < key!.length; ++i) { + buffer[i] = key![i]; + } + for (; i < blockLength; ++i) { + buffer[i] = 0; + } + messageLength = pos = blockLength; + } + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++, messageLength++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + } + + /// Rotates x right by n bits. + @pragma('vm:prefer-inline') + static int _rotr(int x, int n) => (x >>> n) ^ (x << (64 - n)); + + // static void _G(Uint64List v, int a, int b, int c, int d, int x, int y) { + // v[a] = (v[a] + v[b] + x); + // v[d] = _rotr(v[d] ^ v[a], _r1); + // v[c] = (v[c] + v[d]); + // v[b] = _rotr(v[b] ^ v[c], _r2); + // v[a] = (v[a] + v[b] + y); + // v[d] = _rotr(v[d] ^ v[a], _r3); + // v[c] = (v[c] + v[d]); + // v[b] = _rotr(v[b] ^ v[c], _r4); + // } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + var m = qbuffer; + int w0, w1, w2, w3, w4, w5, w6, w7; + int w8, w9, w10, w11, w12, w13, w14, w15; + + // first half from state + w0 = state[0]; + w1 = state[1]; + w2 = state[2]; + w3 = state[3]; + w4 = state[4]; + w5 = state[5]; + w6 = state[6]; + w7 = state[7]; + + // second half from IV + w8 = _seed[0]; + w9 = _seed[1]; + w10 = _seed[2]; + w11 = _seed[3]; + w12 = _seed[4] ^ messageLength; + w13 = _seed[5]; + w14 = _seed[6]; + w15 = _seed[7]; + + if (last) { + w14 = ~w14; // invert bits + } + + // Cryptographic mixing + for (int i = 0; i < 12; i++) { + var s = _sigma[i]; + + // _G(v, 0, 4, 8, 12, m[s[0]], m[s[1]]); + w0 += w4 + m[s[0]]; + w12 = _rotr(w12 ^ w0, _r1); + w8 += w12; + w4 = _rotr(w4 ^ w8, _r2); + w0 += w4 + m[s[1]]; + w12 = _rotr(w12 ^ w0, _r3); + w8 += w12; + w4 = _rotr(w4 ^ w8, _r4); + + // _G(v, 1, 5, 9, 13, m[s[2]], m[s[3]]); + w1 += w5 + m[s[2]]; + w13 = _rotr(w13 ^ w1, _r1); + w9 += w13; + w5 = _rotr(w5 ^ w9, _r2); + w1 += w5 + m[s[3]]; + w13 = _rotr(w13 ^ w1, _r3); + w9 += w13; + w5 = _rotr(w5 ^ w9, _r4); + + // _G(v, 2, 6, 10, 14, m[s[4]], m[s[5]]); + w2 += w6 + m[s[4]]; + w14 = _rotr(w14 ^ w2, _r1); + w10 += w14; + w6 = _rotr(w6 ^ w10, _r2); + w2 += w6 + m[s[5]]; + w14 = _rotr(w14 ^ w2, _r3); + w10 += w14; + w6 = _rotr(w6 ^ w10, _r4); + + // _G(v, 3, 7, 11, 15, m[s[6]], m[s[7]]); + w3 += w7 + m[s[6]]; + w15 = _rotr(w15 ^ w3, _r1); + w11 += w15; + w7 = _rotr(w7 ^ w11, _r2); + w3 += w7 + m[s[7]]; + w15 = _rotr(w15 ^ w3, _r3); + w11 += w15; + w7 = _rotr(w7 ^ w11, _r4); + + // _G(v, 0, 5, 10, 15, m[s[8]], m[s[9]]); + w0 += w5 + m[s[8]]; + w15 = _rotr(w15 ^ w0, _r1); + w10 += w15; + w5 = _rotr(w5 ^ w10, _r2); + w0 += w5 + m[s[9]]; + w15 = _rotr(w15 ^ w0, _r3); + w10 += w15; + w5 = _rotr(w5 ^ w10, _r4); + + // _G(v, 1, 6, 11, 12, m[s[10]], m[s[11]]); + w1 += w6 + m[s[10]]; + w12 = _rotr(w12 ^ w1, _r1); + w11 += w12; + w6 = _rotr(w6 ^ w11, _r2); + w1 += w6 + m[s[11]]; + w12 = _rotr(w12 ^ w1, _r3); + w11 += w12; + w6 = _rotr(w6 ^ w11, _r4); + + // _G(v, 2, 7, 8, 13, m[s[12]], m[s[13]]); + w2 += w7 + m[s[12]]; + w13 = _rotr(w13 ^ w2, _r1); + w8 += w13; + w7 = _rotr(w7 ^ w8, _r2); + w2 += w7 + m[s[13]]; + w13 = _rotr(w13 ^ w2, _r3); + w8 += w13; + w7 = _rotr(w7 ^ w8, _r4); + + // _G(v, 3, 4, 9, 14, m[s[14]], m[s[15]]); + w3 += w4 + m[s[14]]; + w14 = _rotr(w14 ^ w3, _r1); + w9 += w14; + w4 = _rotr(w4 ^ w9, _r2); + w3 += w4 + m[s[15]]; + w14 = _rotr(w14 ^ w3, _r3); + w9 += w14; + w4 = _rotr(w4 ^ w9, _r4); + } + + // XOR the two halves for new state + state[0] ^= w0 ^ w8; + state[1] ^= w1 ^ w9; + state[2] ^= w2 ^ w10; + state[3] ^= w3 ^ w11; + state[4] ^= w4 ^ w12; + state[5] ^= w5 ^ w13; + state[6] ^= w6 ^ w14; + state[7] ^= w7 ^ w15; + } + + @override + Uint8List $finalize() { + // Fill remaining buffer to put the message length at the end + for (; pos < blockLength; pos++) { + buffer[pos] = 0; + } + + // Update with the final block + $update(buffer, 0, true); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/blake2/blake2s.dart b/hashlib/lib/src/algorithms/blake2/blake2s.dart new file mode 100644 index 0000000..3274410 --- /dev/null +++ b/hashlib/lib/src/algorithms/blake2/blake2s.dart @@ -0,0 +1,323 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +/* + | BLAKE2s | +--------------+------------------+ + Bits in word | w = 32 | + Rounds in F | r = 10 | + Block bytes | bb = 64 | + Hash bytes | 1 <= nn <= 32 | + Key bytes | 0 <= kk <= 32 | + Input bytes | 0 <= ll < 2**64 | +--------------+------------------+ + G Rotation | (R1, R2, R3, R4) | + constants = | (16, 12, 8, 7) | +--------------+------------------+ +*/ + +const int _mask32 = 0xFFFFFFFF; + +const int _r1 = 16; +const int _r2 = 12; +const int _r3 = 8; +const int _r4 = 7; + +// Same as SHA-256 +const _seed = [ + 0x6A09E667, // a + 0xBB67AE85, // b + 0x3C6EF372, // c + 0xA54FF53A, // d + 0x510E527F, // e + 0x9B05688C, // f + 0x1F83D9AB, // g + 0x5BE0CD19, // h +]; + +const _sigma = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 0 + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], // round 1 + [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], // round 2 + [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], // round 3 + [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], // round 4 + [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], // round 5 + [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], // round 6 + [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], // round 7 + [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], // round 8 + [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], // round 9 +]; + +/// Implementation is derived from [RFC-7693][rfc] document for +/// "The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)". +/// +/// For reference, the official [blake2][blake2] implementation was followed. +/// +/// Note that blake2s uses only 32-bit operations. +/// +/// [rfc]: https://www.ietf.org/rfc/rfc7693.html +/// [blake2]: https://github.com/BLAKE2/BLAKE2/blob/master/ref/blake2b-ref.c +class Blake2sHash extends BlockHashSink implements MACSinkBase { + final List? key; + late int _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7; + final Uint32List state = Uint32List(_seed.length); + + @override + final int hashLength; + + @override + final int derivedKeyLength; + + /// For internal use only. + Blake2sHash( + int digestSize, { + this.key, + List? salt, + List? aad, + }) : hashLength = digestSize, + derivedKeyLength = digestSize, + super(64) { + if (digestSize < 1 || digestSize > 32) { + throw ArgumentError('The digest size must be between 1 and 32'); + } + + // Parameter block from the seed + _s0 = _seed[0] ^ 0x01010000 ^ hashLength; + _s1 = _seed[1]; + _s2 = _seed[2]; + _s3 = _seed[3]; + _s4 = _seed[4]; + _s5 = _seed[5]; + _s6 = _seed[6]; + _s7 = _seed[7]; + + // Add key length to parameter + if (key != null && key!.isNotEmpty) { + if (key!.length > 32) { + throw ArgumentError('The key should not be greater than 32 bytes'); + } + _s0 ^= key!.length << 8; + } + + if (salt != null && salt.isNotEmpty) { + if (salt.length != 8) { + throw ArgumentError('The valid length of salt is 8 bytes'); + } + for (int i = 0, p = 0; i < 4; i++, p += 8) { + _s4 ^= (salt[i] & 0xFF) << p; + } + for (int i = 4, p = 0; i < 8; i++, p += 8) { + _s5 ^= (salt[i] & 0xFF) << p; + } + } + + if (aad != null && aad.isNotEmpty) { + if (aad.length != 8) { + throw ArgumentError('The valid length of personalization is 8 bytes'); + } + for (int i = 0, p = 0; i < 4; i++, p += 8) { + _s6 ^= (aad[i] & 0xFF) << p; + } + for (int i = 4, p = 0; i < 8; i++, p += 8) { + _s7 ^= (aad[i] & 0xFF) << p; + } + } + + reset(); + } + + @override + void reset() { + super.reset(); + state[0] = _s0; + state[1] = _s1; + state[2] = _s2; + state[3] = _s3; + state[4] = _s4; + state[5] = _s5; + state[6] = _s6; + state[7] = _s7; + // If the key is present, the first block is the key padded with zeroes + if (key != null) { + int i; + for (i = 0; i < key!.length; ++i) { + buffer[i] = key![i]; + } + for (; i < blockLength; ++i) { + buffer[i] = 0; + } + messageLength = pos = blockLength; + } + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++, messageLength++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + } + + /// Rotates x right by n bits. + @pragma('vm:prefer-inline') + static int _rotr(int x, int n) => ((x & _mask32) >>> n) | ((x << (32 - n))); + + // static void _G(Uint32List v, int a, int b, int c, int d, int x, int y) { + // v[a] = (v[a] + v[b] + x); + // v[d] = _rotr(v[d] ^ v[a], _r1); + // v[c] = (v[c] + v[d]); + // v[b] = _rotr(v[b] ^ v[c], _r2); + // v[a] = (v[a] + v[b] + y); + // v[d] = _rotr(v[d] ^ v[a], _r3); + // v[c] = (v[c] + v[d]); + // v[b] = _rotr(v[b] ^ v[c], _r4); + // } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + var m = sbuffer; + int w0, w1, w2, w3, w4, w5, w6, w7; + int w8, w9, w10, w11, w12, w13, w14, w15; + + // first half from state + w0 = state[0]; + w1 = state[1]; + w2 = state[2]; + w3 = state[3]; + w4 = state[4]; + w5 = state[5]; + w6 = state[6]; + w7 = state[7]; + + // second half from IV + w8 = _seed[0]; + w9 = _seed[1]; + w10 = _seed[2]; + w11 = _seed[3]; + w12 = _seed[4] ^ (messageLength & _mask32); + w13 = _seed[5] ^ (messageLength >>> 32); + w14 = _seed[6]; + w15 = _seed[7]; + + if (last) { + w14 ^= _mask32; // invert bits + } + + // Cryptographic mixing + for (int i = 0; i < 10; i++) { + var s = _sigma[i]; + + // _G(v, 0, 4, 8, 12, m[s[0]], m[s[1]]); + w0 += w4 + m[s[0]]; + w12 = _rotr(w12 ^ w0, _r1); + w8 += w12; + w4 = _rotr(w4 ^ w8, _r2); + w0 += w4 + m[s[1]]; + w12 = _rotr(w12 ^ w0, _r3); + w8 += w12; + w4 = _rotr(w4 ^ w8, _r4); + + // _G(v, 1, 5, 9, 13, m[s[2]], m[s[3]]); + w1 += w5 + m[s[2]]; + w13 = _rotr(w13 ^ w1, _r1); + w9 += w13; + w5 = _rotr(w5 ^ w9, _r2); + w1 += w5 + m[s[3]]; + w13 = _rotr(w13 ^ w1, _r3); + w9 += w13; + w5 = _rotr(w5 ^ w9, _r4); + + // _G(v, 2, 6, 10, 14, m[s[4]], m[s[5]]); + w2 += w6 + m[s[4]]; + w14 = _rotr(w14 ^ w2, _r1); + w10 += w14; + w6 = _rotr(w6 ^ w10, _r2); + w2 += w6 + m[s[5]]; + w14 = _rotr(w14 ^ w2, _r3); + w10 += w14; + w6 = _rotr(w6 ^ w10, _r4); + + // _G(v, 3, 7, 11, 15, m[s[6]], m[s[7]]); + w3 += w7 + m[s[6]]; + w15 = _rotr(w15 ^ w3, _r1); + w11 += w15; + w7 = _rotr(w7 ^ w11, _r2); + w3 += w7 + m[s[7]]; + w15 = _rotr(w15 ^ w3, _r3); + w11 += w15; + w7 = _rotr(w7 ^ w11, _r4); + + // _G(v, 0, 5, 10, 15, m[s[8]], m[s[9]]); + w0 += w5 + m[s[8]]; + w15 = _rotr(w15 ^ w0, _r1); + w10 += w15; + w5 = _rotr(w5 ^ w10, _r2); + w0 += w5 + m[s[9]]; + w15 = _rotr(w15 ^ w0, _r3); + w10 += w15; + w5 = _rotr(w5 ^ w10, _r4); + + // _G(v, 1, 6, 11, 12, m[s[10]], m[s[11]]); + w1 += w6 + m[s[10]]; + w12 = _rotr(w12 ^ w1, _r1); + w11 += w12; + w6 = _rotr(w6 ^ w11, _r2); + w1 += w6 + m[s[11]]; + w12 = _rotr(w12 ^ w1, _r3); + w11 += w12; + w6 = _rotr(w6 ^ w11, _r4); + + // _G(v, 2, 7, 8, 13, m[s[12]], m[s[13]]); + w2 += w7 + m[s[12]]; + w13 = _rotr(w13 ^ w2, _r1); + w8 += w13; + w7 = _rotr(w7 ^ w8, _r2); + w2 += w7 + m[s[13]]; + w13 = _rotr(w13 ^ w2, _r3); + w8 += w13; + w7 = _rotr(w7 ^ w8, _r4); + + // _G(v, 3, 4, 9, 14, m[s[14]], m[s[15]]); + w3 += w4 + m[s[14]]; + w14 = _rotr(w14 ^ w3, _r1); + w9 += w14; + w4 = _rotr(w4 ^ w9, _r2); + w3 += w4 + m[s[15]]; + w14 = _rotr(w14 ^ w3, _r3); + w9 += w14; + w4 = _rotr(w4 ^ w9, _r4); + } + + // XOR the two halves for new state + state[0] ^= w0 ^ w8; + state[1] ^= w1 ^ w9; + state[2] ^= w2 ^ w10; + state[3] ^= w3 ^ w11; + state[4] ^= w4 ^ w12; + state[5] ^= w5 ^ w13; + state[6] ^= w6 ^ w14; + state[7] ^= w7 ^ w15; + } + + @override + Uint8List $finalize() { + // Fill remaining buffer to put the message length at the end + for (; pos < blockLength; pos++) { + buffer[pos] = 0; + } + + // Update with the final block + $update(buffer, 0, true); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/crc/crc16.dart b/hashlib/lib/src/algorithms/crc/crc16.dart new file mode 100644 index 0000000..e9752d2 --- /dev/null +++ b/hashlib/lib/src/algorithms/crc/crc16.dart @@ -0,0 +1,246 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_base.dart'; + +const int _mask16 = 0xFFFF; + +/// Predefined polynomials for CRC-16. +/// +/// The predefined polynomials comes from various sources: +/// - https://crccalc.com/ +/// - https://docs.rs/crate/crc16 +/// - https://crcmod.sourceforge.net/crcmod.predefined.html +/// - https://en.wikipedia.org/wiki/Cyclic_redundancy_check +class CRC16Params { + // 0x8005 group + static const arc = + CRC16Params._('ARC', 0x8005, 0x0000, true, 0x0000); // 0xBB3D + static const cms = + CRC16Params._('CMS', 0x8005, 0xFFFF, false, 0x0000); // 0xAEE7 + static const dds110 = + CRC16Params._('DDS-110', 0x8005, 0x800D, false, 0x0000); // 0x9ECF + static const maximDow = + CRC16Params._('MAXIM-DOW', 0x8005, 0x0000, true, 0xFFFF); // 0x44C2 + static const modbus = + CRC16Params._('MODBUS', 0x8005, 0xFFFF, true, 0x0000); // 0x4B37 + static const umts = + CRC16Params._('UMTS', 0x8005, 0x0000, false, 0x0000); // 0xFEE8 + static const usb = + CRC16Params._('USB', 0x8005, 0xFFFF, true, 0xFFFF); // 0xB4C8 + + // 0x1021 group + static const genibus = + CRC16Params._('GENIBUS', 0x1021, 0xFFFF, false, 0xFFFF); // 0xD64E + static const gsm = + CRC16Params._('GSM', 0x1021, 0x0000, false, 0xFFFF); // 0xCE3C + static const ibm3740 = + CRC16Params._('IBM-3740', 0x1021, 0xFFFF, false, 0x0000); // 0x29B1 + static const ccittFalse = + CRC16Params._('CCITT-FALSE', 0x1021, 0xFFFF, false, 0x0000); // 0x29B1 + static const ibmSdlc = + CRC16Params._('IBM-SDLC', 0x1021, 0xFFFF, true, 0xFFFF); // 0x906E + static const x25 = + CRC16Params._('X-25', 0x1021, 0xFFFF, true, 0xFFFF); // 0x906E + static const iso = + CRC16Params._('ISO-IEC-14443-3-A', 0x1021, 0x6363, true); // 0xBF05 + static const kermit = + CRC16Params._('KERMIT', 0x1021, 0x0000, true, 0x0000); // 0x2189 + static const mcrf4xx = + CRC16Params._('MCRF4XX', 0x1021, 0xFFFF, true, 0x0000); // 0x6F91 + static const riello = + CRC16Params._('RIELLO', 0x1021, 0x554D, true, 0x0000); // 0x63D0 + static const augCcitt = + CRC16Params._('AUG-CCITT', 0x1021, 0x1D0F, false, 0x0000); // 0xE5CC + static const spiFujitsu = + CRC16Params._('SPI-FUJITSU', 0x1021, 0x1D0F, false, 0x0000); // 0xE5CC + static const tms37157 = + CRC16Params._('TMS37157', 0x1021, 0x3791, true, 0x0000); // 0x26B1 + static const xmodem = + CRC16Params._('XMODEM', 0x1021, 0x0000, false, 0x0000); // 0x31C3 + + // Others + static const cdma2000 = + CRC16Params._('CDMA2000', 0xC867, 0xFFFF, false, 0x0000); // 0x4C06 + static const dectR = + CRC16Params._('DECT-R', 0x0589, 0x0000, false, 0x0001); // 0x007E + static const dectX = + CRC16Params._('DECT-X', 0x0589, 0x0000, false, 0x0000); // 0x007F + static const dnp = + CRC16Params._('DNP', 0x3D65, 0x0000, true, 0xFFFF); // 0xEA82 + static const en13757 = + CRC16Params._('EN-13757', 0x3D65, 0x0000, false, 0xFFFF); // 0xC2B7 + static const lj1200 = + CRC16Params._('LJ1200', 0x6F63, 0x0000, false, 0x0000); // 0xBDF4 + static const nrsc5 = + CRC16Params._('NRSC-5', 0x080B, 0xFFFF, true, 0x0000); // 0xA066 + static const m17 = + CRC16Params._('M17', 0x5935, 0xFFFF, false, 0x0000); // 0x772B + static const opensafetyA = + CRC16Params._('OPENSAFETY-A', 0x5935, 0x0000, false, 0x0000); // 0x5D38 + static const opensafetyB = + CRC16Params._('OPENSAFETY-B', 0x755B, 0x0000, false, 0x0000); // 0x20FE + static const profibus = + CRC16Params._('PROFIBUS', 0x1DCF, 0xFFFF, false, 0xFFFF); // 0xA819 + static const t10Dif = + CRC16Params._('T10-DIF', 0x8BB7, 0x0000, false, 0x0000); // 0xD0DB + static const teledisk = + CRC16Params._('TELEDISK', 0xA097, 0x0000, false, 0x0000); // 0x0FB3 + + // From Wikipedia + static const arinc = + CRC16Params._("ARINC", 0xA02B, 0x0000, false, 0x0000); // 0xEBA4 + + // aliases + static const ibm = arc; + static const ansi = arc; + static const lha = arc; + static const arinc453 = arc; + static const ccitt = kermit; + static const bluetooth = kermit; + static const buypass = umts; + static const autosar = genibus; + + //-------------------------------------------------------------------------- + // Implementation + //-------------------------------------------------------------------------- + + /// Polynomial name + final String name; + + /// Polynomial value + final int poly; + + /// Initial CRC + final int seed; + + /// Output XOR value + final int xorOut; + + /// To use the reverse of the polynomial + final bool reversed; + + const CRC16Params._( + this.name, + this.poly, + this.seed, + this.reversed, [ + this.xorOut = 0, + ]); + + /// Create a custom polynomial for CRC-16 + /// + /// Parameters: + /// - [seed]: initial counter to start from + /// - [xorOut]: the value to xor with the final output + /// - [reversed]: to use reversed or reflected polynomial and input + CRC16Params( + this.poly, { + this.seed = 0, + this.xorOut = 0, + this.reversed = false, + }) : name = poly.toRadixString(16); +} + +/// A CRC-16 code generator with a polynomial. +abstract class CRC16Hash extends HashDigestSink { + final int seed; + final int xorOut; + final int polynomial; + final table = Uint16List(256); + + int _crc; + + /// Creates a sink for generating CRC-16 Hash + CRC16Hash(CRC16Params params) + : seed = params.seed, + xorOut = params.xorOut, + polynomial = params.poly, + _crc = params.seed { + $generate(); + } + + @override + final int hashLength = 2; + + @override + void reset() { + _crc = seed; + super.reset(); + } + + /// Generates the lookup table for CRC-16 + void $generate(); + + @override + Uint8List $finalize() { + _crc ^= xorOut; + return Uint8List.fromList([ + _crc >>> 8, + _crc, + ]); + } +} + +/// A CRC-16 code generator with a polynomial. +class CRC16NormalHash extends CRC16Hash { + /// Creates a sink for generating CRC-16 Hash + CRC16NormalHash(super.params); + + @override + void $generate() { + int i, j, r, p; + p = polynomial & _mask16; + for (i = 0; i < 256; ++i) { + r = i << 8; + for (j = 0; j < 8; ++j) { + r = (((r >>> 15) & 1) * p) ^ (r << 1); + } + table[i] = r; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int index; start < end; start++) { + index = ((_crc >>> 8) ^ chunk[start]) & 0xFF; + _crc = table[index] ^ (_crc << 8); + } + } +} + +/// A CRC-16 code generator with a reversed or reflected polynomial. +class CRC16ReverseHash extends CRC16Hash { + /// Creates a sink for generating CRC-16 Hash + CRC16ReverseHash(super.params); + + @override + void $generate() { + int i, j, r, p; + + // reverse polynomial + p = 0; + for (i = 0; i < 16; ++i) { + p ^= ((polynomial >>> i) & 1) << (15 - i); + } + + // generate table + for (i = 0; i < 256; ++i) { + r = i; + for (j = 0; j < 8; ++j) { + r = ((r & 1) * p) ^ (r >>> 1); + } + table[i] = r; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int index; start < end; start++) { + index = (_crc ^ chunk[start]) & 0xFF; + _crc = table[index] ^ (_crc >>> 8); + } + } +} diff --git a/hashlib/lib/src/algorithms/crc/crc32.dart b/hashlib/lib/src/algorithms/crc/crc32.dart new file mode 100644 index 0000000..c772ec9 --- /dev/null +++ b/hashlib/lib/src/algorithms/crc/crc32.dart @@ -0,0 +1,215 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_base.dart'; + +const int _mask32 = 0xFFFFFFFF; + +/// Predefined polynomials for CRC-32. +/// +/// The predefined polynomials comes from various sources: +/// - https://crccalc.com/ +/// - https://pkg.go.dev/hash/crc32 +/// - https://crcmod.sourceforge.net/crcmod.predefined.html +/// - https://en.wikipedia.org/wiki/Cyclic_redundancy_check +class CRC32Params { + /// IEEE is by far and away the most common CRC-32 polynomial. + /// Used by ethernet (IEEE 802.3), v.42, fddi, gzip, zip, png, etc. + static const ieee = CRC32Params._( + 'IEEE', 0x04C11DB7, 0xFFFFFFFF, true, 0xFFFFFFFF); // 0xCBF43926 + + /// Castagnoli's polynomial, used in iSCSI. + /// Has better error detection characteristics than IEEE. + /// https://dx.doi.org/10.1109/26.231911 + static const castagnoli = CRC32Params._( + 'Castagnoli', 0x1EDC6F41, 0xFFFFFFFF, true, 0xFFFFFFFF); // 0xE3069283 + + /// Koopman's polynomial. + /// Also has better error detection characteristics than IEEE. + /// https://dx.doi.org/10.1109/DSN.2002.1028931 + static const koopman = CRC32Params._( + 'Koopman', 0x741B8CD7, 0xFFFFFFFF, true, 0x00000000); // 0xD2C22F51 + + // 0x04C11DB7 group + static const bzip2 = CRC32Params._( + 'BZIP2', 0x04C11DB7, 0xFFFFFFFF, false, 0xFFFFFFFF); // 0xFC891918 + static const cksum = CRC32Params._( + 'CKSUM', 0x04C11DB7, 0x00000000, false, 0xFFFFFFFF); // 0x765E7680 + static const jamcrc = CRC32Params._( + 'JAMCRC', 0x04C11DB7, 0xFFFFFFFF, true, 0x00000000); // 0x340BC6D9 + static const mpeg2 = CRC32Params._( + 'MPEG-2', 0x04C11DB7, 0xFFFFFFFF, false, 0x00000000); // 0x0376E6E7 + + // Others + static const aixm = CRC32Params._( + 'AIXM', 0x814141AB, 0x00000000, false, 0x00000000); // 0x3010BF7F + static const autosar = CRC32Params._( + 'AUTOSAR', 0xF4ACFB13, 0xFFFFFFFF, true, 0xFFFFFFFF); // 0x1697D06A + static const base91D = CRC32Params._( + 'BASE91-D', 0xA833982B, 0xFFFFFFFF, true, 0xFFFFFFFF); // 0x87315576 + static const cdRomEdc = CRC32Params._( + 'CD-ROM-EDC', 0x8001801B, 0x00000000, true, 0x00000000); // 0x6EC2EDC4 + static const xfer = CRC32Params._( + 'XFER', 0x000000AF, 0x00000000, false, 0x00000000); // 0xBD0BE338 + + // aliases + static const iso = ieee; + static const isoHdlc = ieee; + static const adccp = ieee; + static const v42 = ieee; + static const xz = ieee; + static const pkzip = ieee; + static const iscsi = castagnoli; + static const interlaken = castagnoli; + static const nvme = castagnoli; + static const base91C = castagnoli; + static const mef = koopman; + static const aal5 = bzip2; + static const dectB = bzip2; + static const posix = cksum; + + //-------------------------------------------------------------------------- + // Implementation + //-------------------------------------------------------------------------- + + /// Polynomial name + final String name; + + /// Polynomial value + final int poly; + + /// Initial CRC + final int seed; + + /// Output XOR value + final int xorOut; + + /// To use the reverse of the polynomial + final bool reversed; + + const CRC32Params._( + this.name, + this.poly, + this.seed, + this.reversed, [ + this.xorOut = 0, + ]); + + /// Create a custom polynomial for CRC-32 + /// + /// Parameters: + /// - [seed]: initial counter to start from + /// - [xorOut]: the value to xor with the final output + /// - [reversed]: to use reversed or reflected polynomial and input + CRC32Params( + this.poly, { + this.seed = 0, + this.xorOut = 0, + this.reversed = false, + }) : name = poly.toRadixString(16); +} + +/// A CRC-32 code generator with a polynomial. +abstract class CRC32Hash extends HashDigestSink { + final int seed; + final int xorOut; + final int polynomial; + final table = Uint32List(256); + + int _crc; + + /// Creates a sink for generating CRC-32 Hash + CRC32Hash(CRC32Params params) + : seed = params.seed, + xorOut = params.xorOut, + polynomial = params.poly, + _crc = params.seed { + $generate(); + } + + @override + final int hashLength = 4; + + @override + void reset() { + _crc = seed; + super.reset(); + } + + /// Generates the lookup table for CRC-32 + void $generate(); + + @override + Uint8List $finalize() { + _crc ^= xorOut; + return Uint8List.fromList([ + _crc >>> 24, + _crc >>> 16, + _crc >>> 8, + _crc, + ]); + } +} + +/// A CRC-32 code generator with a polynomial. +class CRC32NormalHash extends CRC32Hash { + /// Creates a sink for generating CRC-32 Hash + CRC32NormalHash(super.params); + + @override + void $generate() { + int i, j, r, p; + p = polynomial & _mask32; + for (i = 0; i < 256; ++i) { + r = i << 24; + for (j = 0; j < 8; ++j) { + r = (((r >>> 31) & 1) * p) ^ (r << 1); + } + table[i] = r; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int index; start < end; start++) { + index = ((_crc >>> 24) ^ chunk[start]) & 0xFF; + _crc = table[index] ^ (_crc << 8); + } + } +} + +/// A CRC-32 code generator with a reversed or reflected polynomial. +class CRC32ReverseHash extends CRC32Hash { + /// Creates a sink for generating CRC-32 Hash + CRC32ReverseHash(super.params); + + @override + void $generate() { + int i, j, r, p; + + // reverse polynomial + p = 0; + for (i = 0; i < 32; ++i) { + p ^= ((polynomial >>> i) & 1) << (31 - i); + } + + // generate table + for (i = 0; i < 256; ++i) { + r = i; + for (j = 0; j < 8; ++j) { + r = ((r & 1) * p) ^ (r >>> 1); + } + table[i] = r; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int index; start < end; start++) { + index = (_crc ^ chunk[start]) & 0xFF; + _crc = table[index] ^ (_crc >>> 8); + } + } +} diff --git a/hashlib/lib/src/algorithms/crc/crc64.dart b/hashlib/lib/src/algorithms/crc/crc64.dart new file mode 100644 index 0000000..81f25b6 --- /dev/null +++ b/hashlib/lib/src/algorithms/crc/crc64.dart @@ -0,0 +1,265 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +const int _pow32 = 2 ^ 32; +const int _mask32 = 0xFFFFFFFF; + +/// Predefined polynomials for CRC-64. +/// +/// The predefined polynomials comes from various sources: +/// - https://pkg.go.dev/hash/crc64 +/// - https://crcmod.sourceforge.net/crcmod.predefined.html +/// - https://en.wikipedia.org/wiki/Cyclic_redundancy_check +/// - https://github.com/emn178/js-crc/blob/master/src/models.js +class CRC64Params { + /// Defined in ISO 3309 (HDLC), Swiss-Prot/TrEMBL. + static const iso = CRC64Params._("ISO-HDLC", 0x00000000, 0x0000001B, true, + 0x00000000, 0x00000000, 0x00000000, 0x00000000); // 46a5a9388a5beffe + + /// Defined in ECMA-182 p. 51, XZ Utils. + static const ecma = CRC64Params._("ECMA-182", 0x42F0E1EB, 0xA9EA3693, false, + 0x00000000, 0x00000000, 0x00000000, 0x00000000); // b90956c775a41001 + + static const goIso = CRC64Params._("GO-ISO", 0x00000000, 0x0000001B, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); // 46a5a9388a5beffe + static const goEcma = CRC64Params._("GO-ECMA", 0x42F0E1EB, 0xA9EA3693, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); // 995dc9bbdf1939fa + static const ms = CRC64Params._("MS", 0x259C84CB, 0xA6426349, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000); // 75d4b74f024eceea + static const nvme = CRC64Params._("NVME", 0xAD93D235, 0x94C93659, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); // ae8b14860a799888 + static const redis = CRC64Params._("Redis", 0xAD93D235, 0x94C935A9, true, + 0x00000000, 0x00000000, 0x00000000, 0x00000000); // e9c6d914c4b8d9ca + static const we = CRC64Params._("WE", 0x42F0E1EB, 0xA9EA3693, false, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); // 62ec59e3f1a4f00a + static const xz = CRC64Params._("XZ", 0x42F0E1EB, 0xA9EA3693, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); // 995dc9bbdf1939fa + static const jones = CRC64Params._("Jones", 0xAD93D235, 0x94C935A9, true, + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000); // caa717168609f281 + + //-------------------------------------------------------------------------- + // Implementation + //-------------------------------------------------------------------------- + + /// Polynomial name + final String name; + + /// Most significant 32-bytes of polynomial (first 32) + final int high; + + /// Least significant 32-bytes of polynomial (last 32) + final int low; + + /// Initial CRC (most significant 32-bytes) + final int seedHigh; + + /// Initial CRC (least significant 32-bytes) + final int seedLow; + + /// Output XOR value (least significant 32-bytes) + final int xorOutHigh; + + /// Output XOR value (most significant 32-bytes) + final int xorOutLow; + + /// To use the reverse of the polynomial + final bool reversed; + + const CRC64Params._( + this.name, + this.high, + this.low, + this.reversed, + this.seedHigh, + this.seedLow, [ + this.xorOutHigh = 0, + this.xorOutLow = 0, + ]); + + /// Create a custom polynomial for CRC-64 + /// + /// Parameters: + /// - [seed]: initial counter to start from + /// - [xorOut]: the value to xor with the final output + /// - [reversed]: to use reversed or reflected polynomial and input + CRC64Params( + int poly, { + this.reversed = false, + int seed = 0, + int xorOut = 0, + }) : high = poly ~/ _pow32, + low = poly % _pow32, + seedHigh = seed ~/ _pow32, + seedLow = seed % _pow32, + xorOutHigh = xorOut ~/ _pow32, + xorOutLow = xorOut % _pow32, + name = poly.toRadixString(16); + + /// Create a custom polynomial from hexadecimal + /// + /// Parameters: + /// - [poly]: the polynomial in hexadecimal (MSB first) + /// - [seed]: initial counter to start from (MSB first) + /// - [xorOut]: the value to xor with the final output (MSB first) + /// - [reversed]: to use reversed or reflected polynomial and input + factory CRC64Params.hex({ + required String poly, + bool reversed = false, + String seed = "0000000000000000", + String xorOut = "0000000000000000", + }) { + Uint8List p = fromHex(poly); + Uint8List s = fromHex(seed); + Uint8List x = fromHex(xorOut); + int high = (p[0] << 24) ^ (p[1] << 16) ^ (p[2] << 8) ^ (p[3]); + int low = (p[4] << 24) ^ (p[5] << 16) ^ (p[6] << 8) ^ (p[7]); + int seedHigh = (s[0] << 24) ^ (s[1] << 16) ^ (s[2] << 8) ^ (s[3]); + int seedLow = (s[4] << 24) ^ (s[5] << 16) ^ (s[6] << 8) ^ (s[7]); + int xorOutHigh = (x[0] << 24) ^ (x[1] << 16) ^ (x[2] << 8) ^ (x[3]); + int xorOutLow = (x[4] << 24) ^ (x[5] << 16) ^ (x[6] << 8) ^ (x[7]); + return CRC64Params._( + poly, + high, + low, + reversed, + seedHigh, + seedLow, + xorOutHigh, + xorOutLow, + ); + } +} + +/// A CRC-64 code generator with a polynomial. +abstract class CRC64Hash extends HashDigestSink { + final int polyHigh; + final int polyLow; + final int seedHigh; + final int seedLow; + final int xorOutHigh; + final int xorOutLow; + final table = Uint32List(512); + + int _high, _low; + + /// Creates a sink for generating CRC-64 Hash + CRC64Hash(CRC64Params params) + : polyHigh = params.high, + polyLow = params.low, + seedHigh = params.seedHigh, + seedLow = params.seedLow, + xorOutHigh = params.xorOutHigh, + xorOutLow = params.xorOutLow, + _high = params.seedHigh, + _low = params.seedLow { + $generate(); + } + + @override + final int hashLength = 8; + + @override + void reset() { + super.reset(); + _high = seedHigh; + _low = seedLow; + } + + /// Generates the lookup table for CRC-64 + void $generate(); + + @override + Uint8List $finalize() { + _high ^= xorOutHigh; + _low ^= xorOutLow; + return Uint8List.fromList([ + _high >>> 24, + _high >>> 16, + _high >>> 8, + _high, + _low >>> 24, + _low >>> 16, + _low >>> 8, + _low, + ]); + } +} + +/// A CRC-64 code generator with a normal polynomial. +class CRC64NormalHash extends CRC64Hash { + /// Creates a sink for generating CRC-64 Hash + CRC64NormalHash(super.params); + + @override + void $generate() { + int i, j, h, l, f, ph, pl; + ph = polyHigh & _mask32; + pl = polyLow & _mask32; + for (i = 0; i < 512; i += 2) { + h = i << 23; // (i / 2) << 24 + l = 0; + for (j = 0; j < 8; ++j) { + f = (h >>> 31) & 1; + h = (f * ph) ^ (h << 1) ^ ((l >>> 31) & 1); + l = (f * pl) ^ (l << 1); + } + table[i] = h; + table[i + 1] = l; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int i; start < end; start++) { + i = (((_high >>> 24) ^ chunk[start]) & 0xFF) << 1; + _high = table[i] ^ (_high << 8) ^ ((_low >>> 24) & 0xFF); + _low = table[i + 1] ^ (_low << 8); + } + } +} + +/// A CRC-64 code generator with reversed or reflected polynomial. +class CRC64ReverseHash extends CRC64Hash { + /// Creates a sink for generating CRC-64 Hash + CRC64ReverseHash(super.params); + + @override + void $generate() { + int i, j, h, l, f, ph, pl; + + // reverse polynomial + ph = 0; + pl = 0; + for (i = 0; i < 32; ++i) { + pl ^= ((polyHigh >>> i) & 1) << (31 - i); + ph ^= ((polyLow >>> i) & 1) << (31 - i); + } + + // generate table + for (i = 0; i < 512; i += 2) { + h = 0; + l = i >>> 1; + for (j = 0; j < 8; ++j) { + f = l & 1; + l = (f * pl) ^ ((h & 1) << 31) ^ ((l & _mask32) >>> 1); + h = (f * ph) ^ ((h & _mask32) >>> 1); + } + table[i] = h; + table[i + 1] = l; + } + } + + @override + void $process(List chunk, int start, int end) { + for (int i; start < end; start++) { + i = ((_low ^ chunk[start]) & 0xFF) << 1; + _low = table[i + 1] ^ ((_high & 0xFF) << 24) ^ ((_low & _mask32) >>> 8); + _high = table[i] ^ ((_high & _mask32) >>> 8); + } + } +} diff --git a/hashlib/lib/src/algorithms/hmac.dart b/hashlib/lib/src/algorithms/hmac.dart new file mode 100644 index 0000000..02c4f26 --- /dev/null +++ b/hashlib/lib/src/algorithms/hmac.dart @@ -0,0 +1,70 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +/// This implementation is derived from the RFC document +/// [HMAC: Keyed-Hashing for Message Authentication][rfc2104]. +/// +/// [rfc2104]: https://www.ietf.org/rfc/rfc2104.html +class HMACSink extends MACSinkBase { + final BlockHashSink _sink; + + @override + late final int hashLength = _sink.hashLength; + + late final innerKey = Uint8List(_sink.blockLength); + late final outerKey = Uint8List(_sink.blockLength); + + HMACSink( + T algo, + List keyBytes, + ) : _sink = algo.createSink() { + var key = keyBytes is Uint8List ? keyBytes : Uint8List.fromList(keyBytes); + + // Keys longer than blockLength are shortened by hashing them + if (key.length > _sink.blockLength) { + _sink.reset(); + _sink.add(key); + key = _sink.$finalize(); + } + + // Calculated padded keys for inner and outer sinks + int i = 0; + for (; i < key.length; i++) { + innerKey[i] = key[i] ^ 0x36; + outerKey[i] = key[i] ^ 0x5c; + } + for (; i < _sink.blockLength; i++) { + innerKey[i] = 0x36; + outerKey[i] = 0x5c; + } + + _sink.reset(); + _sink.add(innerKey); + } + + @override + void reset() { + _sink.reset(); + _sink.add(innerKey); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + _sink.$process(chunk, start, end); + } + + @override + Uint8List $finalize() { + var hash = _sink.$finalize(); + _sink.reset(); + _sink.add(outerKey); + _sink.add(hash); + return _sink.$finalize(); + } +} diff --git a/hashlib/lib/src/algorithms/keccak/keccak.dart b/hashlib/lib/src/algorithms/keccak/keccak.dart new file mode 100644 index 0000000..01b7736 --- /dev/null +++ b/hashlib/lib/src/algorithms/keccak/keccak.dart @@ -0,0 +1,42 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'keccak_64bit.dart' if (dart.library.js) 'keccak_32bit.dart'; + +export 'keccak_64bit.dart' if (dart.library.js) 'keccak_32bit.dart'; + +/// Implementation of Keccak-224 that generates a 224-bit hash. +class Keccak224Hash extends KeccakHash { + Keccak224Hash() + : super( + stateSize: 224 >>> 3, + paddingByte: 0x01, + ); +} + +/// Implementation of Keccak-256 that generates a 256-bit hash. +class Keccak256Hash extends KeccakHash { + Keccak256Hash() + : super( + stateSize: 256 >>> 3, + paddingByte: 0x01, + ); +} + +/// Implementation of Keccak-384 that generates a 384-bit hash. +class Keccak384Hash extends KeccakHash { + Keccak384Hash() + : super( + stateSize: 384 >>> 3, + paddingByte: 0x01, + ); +} + +/// Implementation of Keccak-512 that generates a 512-bit hash. +class Keccak512Hash extends KeccakHash { + Keccak512Hash() + : super( + stateSize: 512 >>> 3, + paddingByte: 0x01, + ); +} diff --git a/hashlib/lib/src/algorithms/keccak/keccak_32bit.dart b/hashlib/lib/src/algorithms/keccak/keccak_32bit.dart new file mode 100644 index 0000000..9b9b7fb --- /dev/null +++ b/hashlib/lib/src/algorithms/keccak/keccak_32bit.dart @@ -0,0 +1,409 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +// Rotation constants +const int _rot01 = 36; +const int _rot02 = 3; +const int _rot03 = 41; +const int _rot04 = 18; +const int _rot05 = 1; +const int _rot06 = 44; +const int _rot07 = 10; +const int _rot08 = 45; +const int _rot09 = 2; +const int _rot10 = 62; +const int _rot11 = 6; +const int _rot12 = 43; +const int _rot13 = 15; +const int _rot14 = 61; +const int _rot15 = 28; +const int _rot16 = 55; +const int _rot17 = 25; +const int _rot18 = 21; +const int _rot19 = 56; +const int _rot20 = 27; +const int _rot21 = 20; +const int _rot22 = 39; +const int _rot23 = 8; +const int _rot24 = 14; + +// 200-bit round constants iota mapping [little endian] +const _rc = [ + 0x00000001, 0x00000000, // + 0x00008082, 0x00000000, + 0x0000808a, 0x80000000, + 0x80008000, 0x80000000, + 0x0000808b, 0x00000000, + 0x80000001, 0x00000000, + 0x80008081, 0x80000000, + 0x00008009, 0x80000000, + 0x0000008a, 0x00000000, + 0x00000088, 0x00000000, + 0x80008009, 0x00000000, + 0x8000000a, 0x00000000, + 0x8000808b, 0x00000000, + 0x0000008b, 0x80000000, + 0x00008089, 0x80000000, + 0x00008003, 0x80000000, + 0x00008002, 0x80000000, + 0x00000080, 0x80000000, + 0x0000800a, 0x00000000, + 0x8000000a, 0x80000000, + 0x80008081, 0x80000000, + 0x00008080, 0x80000000, + 0x80000001, 0x00000000, + 0x80008008, 0x80000000, +]; + +// State variable indices +const int _a0 = 0; +const int _a1 = _a0 + 2; +const int _a2 = _a1 + 2; +const int _a3 = _a2 + 2; +const int _a4 = _a3 + 2; +const int _a5 = _a4 + 2; +const int _a6 = _a5 + 2; +const int _a7 = _a6 + 2; +const int _a8 = _a7 + 2; +const int _a9 = _a8 + 2; +const int _a10 = _a9 + 2; +const int _a11 = _a10 + 2; +const int _a12 = _a11 + 2; +const int _a13 = _a12 + 2; +const int _a14 = _a13 + 2; +const int _a15 = _a14 + 2; +const int _a16 = _a15 + 2; +const int _a17 = _a16 + 2; +const int _a18 = _a17 + 2; +const int _a19 = _a18 + 2; +const int _a20 = _a19 + 2; +const int _a21 = _a20 + 2; +const int _a22 = _a21 + 2; +const int _a23 = _a22 + 2; +const int _a24 = _a23 + 2; + +// Temp variable indices +const int _b0 = 0; +const int _b1 = _b0 + 2; +const int _b2 = _b1 + 2; +const int _b3 = _b2 + 2; +const int _b4 = _b3 + 2; +const int _b5 = _b4 + 2; +const int _b6 = _b5 + 2; +const int _b7 = _b6 + 2; +const int _b8 = _b7 + 2; +const int _b9 = _b8 + 2; +const int _b10 = _b9 + 2; +const int _b11 = _b10 + 2; +const int _b12 = _b11 + 2; +const int _b13 = _b12 + 2; +const int _b14 = _b13 + 2; +const int _b15 = _b14 + 2; +const int _b16 = _b15 + 2; +const int _b17 = _b16 + 2; +const int _b18 = _b17 + 2; +const int _b19 = _b18 + 2; +const int _b20 = _b19 + 2; +const int _b21 = _b20 + 2; +const int _b22 = _b21 + 2; +const int _b23 = _b22 + 2; +const int _b24 = _b23 + 2; +const int _c0 = _b24 + 2; +const int _c1 = _c0 + 2; +const int _c2 = _c1 + 2; +const int _c3 = _c2 + 2; +const int _c4 = _c3 + 2; +const int _d = _c4 + 2; + +/// This is an implementation of Keccak-f\[1600\] derived from +/// [FIPS-202 SHA-3 Standard][fips202] published by NIST. +/// +/// Followed the optimizations in [PyCryptodome's implementation][keccak]. +/// Special thanks to [tiny_sha3] for readable code and test cases. +/// +/// It uses 32-bit integers to accommodate 64-bit integer operations, designed +/// specially to be supported by Web VM. It is albeit slower than the native +/// implementation. +/// +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +/// [keccak]: https://github.com/Legrandin/pycryptodome/blob/master/src/keccak.c +/// [tiny_sha3]: https://github.com/mjosaarinen/tiny_sha3/blob/master/sha3.c +class KeccakHash extends BlockHashSink { + final int stateSize; + final int paddingByte; + final _var = Uint32List(_d + 2); + late final Uint32List state = sbuffer; + + @override + final int hashLength; + + KeccakHash({ + required this.stateSize, + required this.paddingByte, + int? outputSize, // equals to state size if not provided + }) : assert(stateSize >= 0 && stateSize < 100), + hashLength = outputSize ?? stateSize, + super( + 200 - (stateSize << 1), // rate as blockLength + bufferLength: 200, // 1600-bit state as buffer + ); + + @override + void reset() { + buffer.fillRange(0, buffer.length, 0); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] ^= chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + // (x << n) | (x >>> (64 - n)) + static void _rotl(int n, List x, int i, List z, int k) { + // *numbers are in little-endian order* + var a = x[i]; + var b = x[i + 1]; + if (n == 32) { + z[k] = b; + z[k + 1] = a; + } else if (n < 32) { + z[k] = (a << n) | (b >>> (32 - n)); + z[k + 1] = (b << n) | a >>> (32 - n); + } else { + z[k] = (b << (n - 32)) | (a >>> (64 - n)); + z[k + 1] = (a << (n - 32)) | (b >>> (64 - n)); + } + } + + // z = x ^ y + static void _xor(List x, int i, List y, int j, List z, int k) { + z[k] = x[i] ^ y[j]; + z[k + 1] = x[i + 1] ^ y[j + 1]; + } + + // z = x[i1] ^ x[i2] ^ x[i3] ^ x[i4] ^ x[i5] + static void _xor5( + List x, int i1, int i2, int i3, int i4, int i5, List z, int k) { + z[k] = x[i1] ^ x[i2] ^ x[i3] ^ x[i4] ^ x[i5]; + z[k + 1] = x[i1 + 1] ^ x[i2 + 1] ^ x[i3 + 1] ^ x[i4 + 1] ^ x[i5 + 1]; + } + + // z = x[i1] ^ (~x[i2] & x[i3]); + static void _chi(List x, int i1, int i2, int i3, List z, int k) { + z[k] = x[i1] ^ (~x[i2] & x[i3]); + z[k + 1] = x[i1 + 1] ^ (~x[i2 + 1] & x[i3 + 1]); + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + for (int r = 0; r < _rc.length; r += 2) { + // ---- Theta parity ---- + // c0 = a0 ^ a5 ^ a10 ^ a15 ^ a20; + _xor5(state, _a0, _a5, _a10, _a15, _a20, _var, _c0); + // c1 = a1 ^ a6 ^ a11 ^ a16 ^ a21; + _xor5(state, _a1, _a6, _a11, _a16, _a21, _var, _c1); + // c2 = a2 ^ a7 ^ a12 ^ a17 ^ a22; + _xor5(state, _a2, _a7, _a12, _a17, _a22, _var, _c2); + // c3 = a3 ^ a8 ^ a13 ^ a18 ^ a23; + _xor5(state, _a3, _a8, _a13, _a18, _a23, _var, _c3); + // c4 = a4 ^ a9 ^ a14 ^ a19 ^ a24; + _xor5(state, _a4, _a9, _a14, _a19, _a24, _var, _c4); + + // ---- Theta + Rho + Pi ---- + // d = c4 ^ _rotl(c1, 1); + _rotl(1, _var, _c1, _var, _d); + _xor(_var, _c4, _var, _d, _var, _d); + // b0 = d ^ a0; + _xor(_var, _d, state, _a0, _var, _b0); + // b16 = _rotl(d ^ a5, _rot01); + _xor(_var, _d, state, _a5, _var, _b16); + _rotl(_rot01, _var, _b16, _var, _b16); + // b7 = _rotl(d ^ a10, _rot02); + _xor(_var, _d, state, _a10, _var, _b7); + _rotl(_rot02, _var, _b7, _var, _b7); + // b23 = _rotl(d ^ a15, _rot03); + _xor(_var, _d, state, _a15, _var, _b23); + _rotl(_rot03, _var, _b23, _var, _b23); + // b14 = _rotl(d ^ a20, _rot04); + _xor(_var, _d, state, _a20, _var, _b14); + _rotl(_rot04, _var, _b14, _var, _b14); + + // d = c0 ^ _rotl(c2, 1); + _rotl(1, _var, _c2, _var, _d); + _xor(_var, _c0, _var, _d, _var, _d); + // b10 = _rotl(d ^ a1, _rot05); + _xor(_var, _d, state, _a1, _var, _b10); + _rotl(_rot05, _var, _b10, _var, _b10); + // b1 = _rotl(d ^ a6, _rot06); + _xor(_var, _d, state, _a6, _var, _b1); + _rotl(_rot06, _var, _b1, _var, _b1); + // b17 = _rotl(d ^ a11, _rot07); + _xor(_var, _d, state, _a11, _var, _b17); + _rotl(_rot07, _var, _b17, _var, _b17); + // b8 = _rotl(d ^ a16, _rot08); + _xor(_var, _d, state, _a16, _var, _b8); + _rotl(_rot08, _var, _b8, _var, _b8); + // b24 = _rotl(d ^ a21, _rot09); + _xor(_var, _d, state, _a21, _var, _b24); + _rotl(_rot09, _var, _b24, _var, _b24); + + // d = c1 ^ _rotl(c3, 1); + _rotl(1, _var, _c3, _var, _d); + _xor(_var, _d, _var, _c1, _var, _d); + // b20 = _rotl(d ^ a2, _rot10); + _xor(_var, _d, state, _a2, _var, _b20); + _rotl(_rot10, _var, _b20, _var, _b20); + // b11 = _rotl(d ^ a7, _rot11); + _xor(_var, _d, state, _a7, _var, _b11); + _rotl(_rot11, _var, _b11, _var, _b11); + // b2 = _rotl(d ^ a12, _rot12); + _xor(_var, _d, state, _a12, _var, _b2); + _rotl(_rot12, _var, _b2, _var, _b2); + // b18 = _rotl(d ^ a17, _rot13); + _xor(_var, _d, state, _a17, _var, _b18); + _rotl(_rot13, _var, _b18, _var, _b18); + // b9 = _rotl(d ^ a22, _rot14); + _xor(_var, _d, state, _a22, _var, _b9); + _rotl(_rot14, _var, _b9, _var, _b9); + + // d = c2 ^ _rotl(c4, 1); + _rotl(1, _var, _c4, _var, _d); + _xor(_var, _c2, _var, _d, _var, _d); + // b5 = _rotl(d ^ a3, _rot15); + _xor(_var, _d, state, _a3, _var, _b5); + _rotl(_rot15, _var, _b5, _var, _b5); + // b21 = _rotl(d ^ a8, _rot16); + _xor(_var, _d, state, _a8, _var, _b21); + _rotl(_rot16, _var, _b21, _var, _b21); + // b12 = _rotl(d ^ a13, _rot17); + _xor(_var, _d, state, _a13, _var, _b12); + _rotl(_rot17, _var, _b12, _var, _b12); + // b3 = _rotl(d ^ a18, _rot18); + _xor(_var, _d, state, _a18, _var, _b3); + _rotl(_rot18, _var, _b3, _var, _b3); + // b19 = _rotl(d ^ a23, _rot19); + _xor(_var, _d, state, _a23, _var, _b19); + _rotl(_rot19, _var, _b19, _var, _b19); + + // d = c3 ^ _rotl(c0, 1); + _rotl(1, _var, _c0, _var, _d); + _xor(_var, _c3, _var, _d, _var, _d); + // b15 = _rotl(d ^ a4, _rot20); + _xor(_var, _d, state, _a4, _var, _b15); + _rotl(_rot20, _var, _b15, _var, _b15); + // b6 = _rotl(d ^ a9, _rot21); + _xor(_var, _d, state, _a9, _var, _b6); + _rotl(_rot21, _var, _b6, _var, _b6); + // b22 = _rotl(d ^ a14, _rot22); + _xor(_var, _d, state, _a14, _var, _b22); + _rotl(_rot22, _var, _b22, _var, _b22); + // b13 = _rotl(d ^ a19, _rot23); + _xor(_var, _d, state, _a19, _var, _b13); + _rotl(_rot23, _var, _b13, _var, _b13); + // b4 = _rotl(d ^ a24, _rot24); + _xor(_var, _d, state, _a24, _var, _b4); + _rotl(_rot24, _var, _b4, _var, _b4); + + // ---- Chi + Iota ---- + // a0 = b0 ^ (~b1 & b2) ^ r; + _chi(_var, _b0, _b1, _b2, state, _a0); + _xor(state, _a0, _rc, r, state, _a0); + // a1 = b1 ^ (~b2 & b3); + _chi(_var, _b1, _b2, _b3, state, _a1); + // a2 = b2 ^ (~b3 & b4); + _chi(_var, _b2, _b3, _b4, state, _a2); + // a3 = b3 ^ (~b4 & b0); + _chi(_var, _b3, _b4, _b0, state, _a3); + // a4 = b4 ^ (~b0 & b1); + _chi(_var, _b4, _b0, _b1, state, _a4); + + // a5 = b5 ^ (~b6 & b7); + _chi(_var, _b5, _b6, _b7, state, _a5); + // a6 = b6 ^ (~b7 & b8); + _chi(_var, _b6, _b7, _b8, state, _a6); + // a7 = b7 ^ (~b8 & b9); + _chi(_var, _b7, _b8, _b9, state, _a7); + // a8 = b8 ^ (~b9 & b5); + _chi(_var, _b8, _b9, _b5, state, _a8); + // a9 = b9 ^ (~b5 & b6); + _chi(_var, _b9, _b5, _b6, state, _a9); + + // a10 = b10 ^ (~b11 & b12); + _chi(_var, _b10, _b11, _b12, state, _a10); + // a11 = b11 ^ (~b12 & b13); + _chi(_var, _b11, _b12, _b13, state, _a11); + // a12 = b12 ^ (~b13 & b14); + _chi(_var, _b12, _b13, _b14, state, _a12); + // a13 = b13 ^ (~b14 & b10); + _chi(_var, _b13, _b14, _b10, state, _a13); + // a14 = b14 ^ (~b10 & b11); + _chi(_var, _b14, _b10, _b11, state, _a14); + + // a15 = b15 ^ (~b16 & b17); + _chi(_var, _b15, _b16, _b17, state, _a15); + // a16 = b16 ^ (~b17 & b18); + _chi(_var, _b16, _b17, _b18, state, _a16); + // a17 = b17 ^ (~b18 & b19); + _chi(_var, _b17, _b18, _b19, state, _a17); + // a18 = b18 ^ (~b19 & b15); + _chi(_var, _b18, _b19, _b15, state, _a18); + // a19 = b19 ^ (~b15 & b16); + _chi(_var, _b19, _b15, _b16, state, _a19); + + // a20 = b20 ^ (~b21 & b22); + _chi(_var, _b20, _b21, _b22, state, _a20); + // a21 = b21 ^ (~b22 & b23); + _chi(_var, _b21, _b22, _b23, state, _a21); + // a22 = b22 ^ (~b23 & b24); + _chi(_var, _b22, _b23, _b24, state, _a22); + // a23 = b23 ^ (~b24 & b20); + _chi(_var, _b23, _b24, _b20, state, _a23); + // a24 = b24 ^ (~b20 & b21); + _chi(_var, _b24, _b20, _b21, state, _a24); + } + } + + @override + Uint8List $finalize() { + // Update the final block + if (pos == blockLength) { + $update(); + pos = 0; + } + + // Setting the signature bytes + buffer[pos] ^= paddingByte; + buffer[blockLength - 1] ^= 0x80; + $update(); + + if (hashLength <= stateSize) { + return buffer.sublist(0, hashLength); + } + + // sponge construction + var bytes = Uint8List(hashLength); + for (int i = 0, j = 0; i < hashLength; i++, j++) { + if (j == blockLength) { + $update(); + j = 0; + } + bytes[i] = buffer[j]; + } + return bytes; + } +} diff --git a/hashlib/lib/src/algorithms/keccak/keccak_64bit.dart b/hashlib/lib/src/algorithms/keccak/keccak_64bit.dart new file mode 100644 index 0000000..74c1ad2 --- /dev/null +++ b/hashlib/lib/src/algorithms/keccak/keccak_64bit.dart @@ -0,0 +1,282 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +// Rotation constants +const int _rot01 = 36; +const int _rot02 = 3; +const int _rot03 = 41; +const int _rot04 = 18; +const int _rot05 = 1; +const int _rot06 = 44; +const int _rot07 = 10; +const int _rot08 = 45; +const int _rot09 = 2; +const int _rot10 = 62; +const int _rot11 = 6; +const int _rot12 = 43; +const int _rot13 = 15; +const int _rot14 = 61; +const int _rot15 = 28; +const int _rot16 = 55; +const int _rot17 = 25; +const int _rot18 = 21; +const int _rot19 = 56; +const int _rot20 = 27; +const int _rot21 = 20; +const int _rot22 = 39; +const int _rot23 = 8; +const int _rot24 = 14; + +// 200-bit round constants iota mapping +const List _rc = [ + 0x0000000000000001, + 0x0000000000008082, + 0x800000000000808a, + 0x8000000080008000, + 0x000000000000808b, + 0x0000000080000001, + 0x8000000080008081, + 0x8000000000008009, + 0x000000000000008a, + 0x0000000000000088, + 0x0000000080008009, + 0x000000008000000a, + 0x000000008000808b, + 0x800000000000008b, + 0x8000000000008089, + 0x8000000000008003, + 0x8000000000008002, + 0x8000000000000080, + 0x000000000000800a, + 0x800000008000000a, + 0x8000000080008081, + 0x8000000000008080, + 0x0000000080000001, + 0x8000000080008008, +]; + +/// This is an implementation of Keccak-f\[1600\] derived from +/// [FIPS-202 SHA-3 Standard][fips202] published by NIST. +/// +/// Followed the optimizations in [PyCryptodome's implementation][keccak]. +/// Special thanks to [tiny_sha3] for readable code and test cases. +/// +/// It uses 64-bit integer operations internally which is not supported by +/// Web VM, but a lot faster. +/// +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +/// [keccak]: https://github.com/Legrandin/pycryptodome/blob/master/src/keccak.c +/// [tiny_sha3]: https://github.com/mjosaarinen/tiny_sha3/blob/master/sha3.c +class KeccakHash extends BlockHashSink { + final int stateSize; + final int paddingByte; + late final Uint64List qstate = Uint64List.view(buffer.buffer); + + @override + final int hashLength; + + KeccakHash({ + required this.stateSize, + required this.paddingByte, + int? outputSize, // equals to state size if not provided + }) : assert(stateSize >= 0 && stateSize < 100), + hashLength = outputSize ?? stateSize, + super( + 200 - (stateSize << 1), // rate as blockLength + bufferLength: 200, // 1600-bit state as buffer + ); + + @override + void reset() { + buffer.fillRange(0, buffer.length, 0); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] ^= chunk[start]; + } + if (pos == blockLength) { + $update(); + pos = 0; + } + } + + @override + Uint8List $finalize() { + // Setting the signature bytes + buffer[pos] ^= paddingByte; + buffer[blockLength - 1] ^= 0x80; + $update(); + + if (hashLength <= stateSize) { + return buffer.sublist(0, hashLength); + } + + // sponge construction + var bytes = Uint8List(hashLength); + for (int i = 0, j = 0; i < hashLength; i++, j++) { + if (j == blockLength) { + $update(); + j = 0; + } + bytes[i] = buffer[j]; + } + return bytes; + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + // Use variables to avoid index processing + int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; + int a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24; + + int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12; + int b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24; + + int c0, c1, c2, c3, c4, d, r; + + // Prepare the state (little-endian) + a0 = qstate[0]; + a1 = qstate[1]; + a2 = qstate[2]; + a3 = qstate[3]; + a4 = qstate[4]; + a5 = qstate[5]; + a6 = qstate[6]; + a7 = qstate[7]; + a8 = qstate[8]; + a9 = qstate[9]; + a10 = qstate[10]; + a11 = qstate[11]; + a12 = qstate[12]; + a13 = qstate[13]; + a14 = qstate[14]; + a15 = qstate[15]; + a16 = qstate[16]; + a17 = qstate[17]; + a18 = qstate[18]; + a19 = qstate[19]; + a20 = qstate[20]; + a21 = qstate[21]; + a22 = qstate[22]; + a23 = qstate[23]; + a24 = qstate[24]; + + for (r in _rc) { + // ---- Theta parity ---- + c0 = a0 ^ a5 ^ a10 ^ a15 ^ a20; + c1 = a1 ^ a6 ^ a11 ^ a16 ^ a21; + c2 = a2 ^ a7 ^ a12 ^ a17 ^ a22; + c3 = a3 ^ a8 ^ a13 ^ a18 ^ a23; + c4 = a4 ^ a9 ^ a14 ^ a19 ^ a24; + + // ---- Theta + Rho + Pi ---- + d = c4 ^ _rotl(c1, 1); + b0 = d ^ a0; + b16 = _rotl(d ^ a5, _rot01); + b7 = _rotl(d ^ a10, _rot02); + b23 = _rotl(d ^ a15, _rot03); + b14 = _rotl(d ^ a20, _rot04); + + d = c0 ^ _rotl(c2, 1); + b10 = _rotl(d ^ a1, _rot05); + b1 = _rotl(d ^ a6, _rot06); + b17 = _rotl(d ^ a11, _rot07); + b8 = _rotl(d ^ a16, _rot08); + b24 = _rotl(d ^ a21, _rot09); + + d = c1 ^ _rotl(c3, 1); + b20 = _rotl(d ^ a2, _rot10); + b11 = _rotl(d ^ a7, _rot11); + b2 = _rotl(d ^ a12, _rot12); + b18 = _rotl(d ^ a17, _rot13); + b9 = _rotl(d ^ a22, _rot14); + + d = c2 ^ _rotl(c4, 1); + b5 = _rotl(d ^ a3, _rot15); + b21 = _rotl(d ^ a8, _rot16); + b12 = _rotl(d ^ a13, _rot17); + b3 = _rotl(d ^ a18, _rot18); + b19 = _rotl(d ^ a23, _rot19); + + d = c3 ^ _rotl(c0, 1); + b15 = _rotl(d ^ a4, _rot20); + b6 = _rotl(d ^ a9, _rot21); + b22 = _rotl(d ^ a14, _rot22); + b13 = _rotl(d ^ a19, _rot23); + b4 = _rotl(d ^ a24, _rot24); + + // ---- Chi + Iota ---- + a0 = b0 ^ ((~b1) & b2) ^ r; + a1 = b1 ^ ((~b2) & b3); + a2 = b2 ^ ((~b3) & b4); + a3 = b3 ^ ((~b4) & b0); + a4 = b4 ^ ((~b0) & b1); + + a5 = b5 ^ ((~b6) & b7); + a6 = b6 ^ ((~b7) & b8); + a7 = b7 ^ ((~b8) & b9); + a8 = b8 ^ ((~b9) & b5); + a9 = b9 ^ ((~b5) & b6); + + a10 = b10 ^ ((~b11) & b12); + a11 = b11 ^ ((~b12) & b13); + a12 = b12 ^ ((~b13) & b14); + a13 = b13 ^ ((~b14) & b10); + a14 = b14 ^ ((~b10) & b11); + + a15 = b15 ^ ((~b16) & b17); + a16 = b16 ^ ((~b17) & b18); + a17 = b17 ^ ((~b18) & b19); + a18 = b18 ^ ((~b19) & b15); + a19 = b19 ^ ((~b15) & b16); + + a20 = b20 ^ ((~b21) & b22); + a21 = b21 ^ ((~b22) & b23); + a22 = b22 ^ ((~b23) & b24); + a23 = b23 ^ ((~b24) & b20); + a24 = b24 ^ ((~b20) & b21); + } + + // Save the state (little-endian) + qstate[0] = a0; + qstate[1] = a1; + qstate[2] = a2; + qstate[3] = a3; + qstate[4] = a4; + qstate[5] = a5; + qstate[6] = a6; + qstate[7] = a7; + qstate[8] = a8; + qstate[9] = a9; + qstate[10] = a10; + qstate[11] = a11; + qstate[12] = a12; + qstate[13] = a13; + qstate[14] = a14; + qstate[15] = a15; + qstate[16] = a16; + qstate[17] = a17; + qstate[18] = a18; + qstate[19] = a19; + qstate[20] = a20; + qstate[21] = a21; + qstate[22] = a22; + qstate[23] = a23; + qstate[24] = a24; + } + + /// Rotates 64-bit number x by n bits + @pragma('vm:prefer-inline') + static int _rotl(int x, int n) => (x << n) ^ (x >>> (64 - n)); +} diff --git a/hashlib/lib/src/algorithms/md2.dart b/hashlib/lib/src/algorithms/md2.dart new file mode 100644 index 0000000..9c40224 --- /dev/null +++ b/hashlib/lib/src/algorithms/md2.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +/// Permutation of 0..255 constructed from the digits of pi. It gives a +/// "random" nonlinear byte substitution operation. +const _pi = [ + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, // + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 +]; + +const _padding = >[ + [], + [01], + [02, 02], + [03, 03, 03], + [04, 04, 04, 04], + [05, 05, 05, 05, 05], + [06, 06, 06, 06, 06, 06], + [07, 07, 07, 07, 07, 07, 07], + [08, 08, 08, 08, 08, 08, 08, 08], + [09, 09, 09, 09, 09, 09, 09, 09, 09], + [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11], + [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12], + [13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13], + [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14], + [15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15], + [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], +]; + +/// This implementation is derived from the RSA Laboratories' +/// [The MD2 Message-Digest Algorithm][rfc1319]. +/// +/// [rfc1319]: https://www.ietf.org/rfc/rfc1319.html +class MD2Hash extends BlockHashSink { + final state = Uint8List(48); + final checksum = Uint8List(16); + + @override + final int hashLength; + + MD2Hash() + : hashLength = 128 >>> 3, + super(16); + + @override + void reset() { + state.fillRange(0, 16, 0); + checksum.fillRange(0, 16, 0); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @override + void $update(List block, [int offset = 0, bool last = false]) { + int i, j, t; + for (i = 0; i < 16; i++) { + state[16 + i] = block[i]; + state[32 + i] = block[i] ^ state[i]; + } + t = 0; + for (i = 0; i < 18; i++) { + for (j = 0; j < 48; ++j) { + t = state[j] ^= _pi[t]; + } + t = (t + i) & 0xFF; + } + t = checksum[15]; + for (i = 0; i < 16; i++) { + t = checksum[i] ^= _pi[block[i] ^ t]; + } + } + + @override + Uint8List $finalize() { + // add padding + $process(_padding[blockLength - pos], 0, blockLength - pos); + + // process checksum + $update(checksum); + + // Convert the state to 8-bit byte array + return state.sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/md4.dart b/hashlib/lib/src/algorithms/md4.dart new file mode 100644 index 0000000..faf2d26 --- /dev/null +++ b/hashlib/lib/src/algorithms/md4.dart @@ -0,0 +1,142 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, // a + 0xEFCDAB89, // b + 0x98BADCFE, // c + 0x10325476, // d +]; + +/// Shift constants +const _rc = [ + 03, 07, 11, 19, 03, 07, 11, 19, 03, 07, 11, 19, 03, 07, 11, 19, // + 03, 05, 09, 13, 03, 05, 09, 13, 03, 05, 09, 13, 03, 05, 09, 13, // + 03, 09, 11, 15, 03, 09, 11, 15, 03, 09, 11, 15, 03, 09, 11, 15, +]; + +/// This implementation is derived from the RSA Data Security, Inc. +/// [MD4 Message-Digest Algorithm][rfc1320]. +/// +/// [rfc1320]: https://www.ietf.org/rfc/rfc1320.html +class MD4Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + MD4Hash() + : state = Uint32List.fromList(_iv), + hashLength = 128 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, e, f, g, h, t; + var x = sbuffer; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + for (int i = 0; i < 16; i++) { + e = (b & c) | ((~b & _mask32) & d); + f = i; + t = d; + d = c; + c = b; + g = (a + e + x[f]) & _mask32; + h = _rc[i]; + b = ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + for (int i = 16; i < 32; i++) { + e = (b & c) | (b & d) | (c & d); + f = ((i >>> 2) & 3) + ((i & 3) << 2); + t = d; + d = c; + c = b; + g = (a + e + 0x5a827999 + x[f]) & _mask32; + h = _rc[i]; + b = ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + for (int i = 32; i < 48; i++) { + e = b ^ c ^ d; + f = ((i & 1) << 3) | ((i & 2) << 1) | ((i >>> 1) & 2) | ((i >>> 3) & 1); + t = d; + d = c; + c = b; + g = (a + e + 0x6ed9eba1 + x[f]) & _mask32; + h = _rc[i]; + b = ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/md5.dart b/hashlib/lib/src/algorithms/md5.dart new file mode 100644 index 0000000..685b0a6 --- /dev/null +++ b/hashlib/lib/src/algorithms/md5.dart @@ -0,0 +1,175 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, // a + 0xEFCDAB89, // b + 0x98BADCFE, // c + 0x10325476, // d +]; + +/// 64 constants [Formula: floor(2^32 * abs(sin(i + 1)))] +const _k = [ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, // + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +]; + +/// Shift constants +const _rc = [ + 07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, // + 05, 09, 14, 20, 05, 09, 14, 20, 05, 09, 14, 20, 05, 09, 14, 20, // + 04, 11, 16, 23, 04, 11, 16, 23, 04, 11, 16, 23, 04, 11, 16, 23, // + 06, 10, 15, 21, 06, 10, 15, 21, 06, 10, 15, 21, 06, 10, 15, 21, +]; + +/// This implementation is derived from the RSA Data Security, Inc. +/// [MD5 Message-Digest Algorithm][rfc1321]. +/// +/// [rfc1321]: https://www.ietf.org/rfc/rfc1321.html +class MD5Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + MD5Hash() + : state = Uint32List.fromList(_iv), + hashLength = 128 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, e, f, g, h, t; + var x = sbuffer; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + for (int i = 0; i < 16; i++) { + e = (b & c) | ((~b & _mask32) & d); + f = i; + t = d; + d = c; + c = b; + g = (a + e + _k[i] + x[f]) & _mask32; + h = _rc[i]; + b += ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + for (int i = 16; i < 32; i++) { + e = (d & b) | ((~d & _mask32) & c); + f = ((i << 2) + i + 1) & 15; + t = d; + d = c; + c = b; + g = (a + e + _k[i] + x[f]) & _mask32; + h = _rc[i]; + b += ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + for (int i = 32; i < 48; i++) { + e = b ^ c ^ d; + f = ((i << 1) + i + 5) & 15; + t = d; + d = c; + c = b; + g = (a + e + _k[i] + x[f]) & _mask32; + h = _rc[i]; + b += ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + for (int i = 48; i < 64; i++) { + e = c ^ (b | (~d & _mask32)); + f = ((i << 3) - i) & 15; + t = d; + d = c; + c = b; + g = (a + e + _k[i] + x[f]) & _mask32; + h = _rc[i]; + b += ((g << h) & _mask32) | (g >>> (32 - h)); + a = t; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/pbkdf2/pbkdf2.dart b/hashlib/lib/src/algorithms/pbkdf2/pbkdf2.dart new file mode 100644 index 0000000..3423ffb --- /dev/null +++ b/hashlib/lib/src/algorithms/pbkdf2/pbkdf2.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/core/kdf_base.dart'; +import 'package:hashlib/src/core/mac_base.dart'; +import 'package:hashlib/src/random.dart'; + +import 'security.dart'; + +int _defaultKeyLength = 24; +int _defaultSaltLength = 16; + +/// This is an implementation of Password Based Key Derivation Algorithm, +/// PBKDF2 derived from [RFC-8081][rfc], which internally uses a MAC based +/// Pseudo Random Function (PRF) for key derivation. +/// +/// PBKDF2 is part of Public-Key Cryptography Standards (PKCS) series published +/// by the RSA Laboratories, specifically PKCS #5 v2.0. It supersedes PBKDF1, +/// which could only produce derived keys up to 160 bits long. +/// +/// The strength of the generated password using PBKDF2 depends on the number +/// of iterations. The idea is to prevent a brute force attack on the original +/// password by making the key derivation time long. This implementation can be +/// used for both to [convert] a passphrase and [verify] it with a derived key. +/// +/// [rfc]: https://www.rfc-editor.org/rfc/rfc8018.html#section-5.2 +class PBKDF2 extends KeyDerivatorBase { + @override + String get name => '${algo.name}/PBKDF2'; + + /// The underlying algorithm used as Pseudo Random Function (PRF) + final MACHash algo; + + /// The byte array containing salt + final List salt; + + /// The number of iterations + final int iterations; + + @override + final int derivedKeyLength; + + const PBKDF2._({ + required this.algo, + required this.salt, + required this.iterations, + required this.derivedKeyLength, + }); + + /// Create a [PBKDF2] instance with a MAC instance. + factory PBKDF2( + MACHash mac, + int iterations, { + List? salt, + int? keyLength, + }) { + keyLength ??= _defaultKeyLength; + salt ??= randomBytes(_defaultSaltLength); + + // validate parameters + if (iterations < 1) { + throw StateError('The iterations must be at least 1'); + } + if (iterations > 0x7FFFFFFF) { + throw StateError('The iterations must be less than 2^31'); + } + if (keyLength < 1) { + throw StateError('The keyLength must be at least 1'); + } + + // create instance + return PBKDF2._( + algo: mac, + salt: salt, + iterations: iterations, + derivedKeyLength: keyLength, + ); + } + + /// Create a [PBKDF2] instance from [PBKDF2Security]. + factory PBKDF2.fromSecurity( + PBKDF2Security security, { + List? salt, + MACHash? mac, + int? iterations, + int? keyLength, + }) => + PBKDF2( + mac ?? security.mac, + iterations ?? security.c, + keyLength: keyLength ?? security.dklen, + salt: salt, + ); + + @override + HashDigest convert(List password) { + int i, j, k, t; + Uint8List hash, block; + var result = Uint8List(derivedKeyLength); + + // Initialize the MAC with provided password + var sink = algo.by(password).createSink(); + + k = 0; + for (i = 1; k < derivedKeyLength; i++) { + // Generate the first HMAC: U_1 + sink.reset(); + sink.add(salt); + sink.add([i >>> 24, i >>> 16, i >>> 8, i]); + hash = sink.digest().bytes; + + // For storing the combined XORs + block = hash; + + // Subsequence HMAC generation: U_2 .. U_c + for (t = 1; t < iterations; ++t) { + sink.reset(); + sink.add(hash); + hash = sink.digest().bytes; + + for (j = 0; j < hash.length; ++j) { + block[j] ^= hash[j]; + } + } + + // Append the hash to the result + for (j = 0; j < hash.length && k < derivedKeyLength; ++j, ++k) { + result[k] = block[j]; + } + } + + return HashDigest(result); + } +} diff --git a/hashlib/lib/src/algorithms/pbkdf2/security.dart b/hashlib/lib/src/algorithms/pbkdf2/security.dart new file mode 100644 index 0000000..dc77715 --- /dev/null +++ b/hashlib/lib/src/algorithms/pbkdf2/security.dart @@ -0,0 +1,90 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/core/mac_base.dart'; +import 'package:hashlib/src/hmac.dart'; +import 'package:hashlib/src/md5.dart'; +import 'package:hashlib/src/sha1.dart'; +import 'package:hashlib/src/sha256.dart'; +import 'package:hashlib/src/sha3_256.dart'; +import 'package:hashlib/src/sha512.dart'; + +import 'pbkdf2.dart'; + +/// This contains some recommended parameters for [PBKDF2] algorithm. +class PBKDF2Security { + final String name; + + /// The number of iterations + final int c; + + /// The length of the derived key + final int dklen; + + /// The underlying algorithm + final MACHash mac; + + const PBKDF2Security( + this.name, { + required this.c, + required this.mac, + required this.dklen, + }); + + /// Provides a very low security. Use it only for test purposes. + /// + /// It uses MD5/HMAC algorithm with a cost of 10. + /// + /// **WARNING: Not recommended for general use.** + static const test = PBKDF2Security('test', mac: HMAC(md5), c: 10, dklen: 16); + + /// Provides low security. Can be used on low-end devices. + /// + /// It uses SHA3-256/HMAC algorithm with 100 iterations. + /// + /// **WARNING: Not recommended for general use.** + static const little = + PBKDF2Security('little', mac: HMAC(sha3_256), c: 100, dklen: 32); + + /// Provides moderate security. + /// + /// It uses SHA-256/HMAC algorithm with 3,000 iterations. + static const moderate = + PBKDF2Security('moderate', mac: hmac_sha256, c: 3000, dklen: 32); + + /// Provides good security. + /// + /// It uses SHA-256/HMAC algorithm with 50,000 iterations. + static const good = + PBKDF2Security('good', mac: hmac_sha256, c: 50000, dklen: 64); + + /// Provides strong security. It uses similar parameters as [owasp2]. + /// + /// It uses SHA-256/HMAC algorithm with 600,000 iterations. + static const strong = + PBKDF2Security('strong', mac: HMAC(sha256), c: 600000, dklen: 64); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses SHA1/HMAC algorithm with 1,300,000 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp = + PBKDF2Security('owasp1', mac: HMAC(sha1), c: 1300000, dklen: 32); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses SHA-256/HMAC algorithm with 600,000 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp2 = + PBKDF2Security('owasp2', mac: HMAC(sha256), c: 600000, dklen: 64); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses SHA-512/HMAC algorithm with 210,000 iterations. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp3 = + PBKDF2Security('owasp3', mac: HMAC(sha512), c: 210000, dklen: 64); +} diff --git a/hashlib/lib/src/algorithms/poly1305/poly1305_32bit.dart b/hashlib/lib/src/algorithms/poly1305/poly1305_32bit.dart new file mode 100644 index 0000000..d193708 --- /dev/null +++ b/hashlib/lib/src/algorithms/poly1305/poly1305_32bit.dart @@ -0,0 +1,105 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +const List _clamp = [ + 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, // + 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, +]; + +/// This implementation is derived from the [The Poly1305 Algorithms] described +/// in the [ChaCha20 and Poly1305 for IETF Protocols][rfc8439] document. +/// +/// [rfc8439]: https://www.ietf.org/rfc/rfc8439.html +class Poly1305Sink extends BlockHashSink implements MACSinkBase { + BigInt _n = BigInt.zero; + BigInt _r = BigInt.zero; + BigInt _s = BigInt.zero; + BigInt _h = BigInt.zero; + final BigInt _m = BigInt.two.pow(128); + final BigInt _p = BigInt.two.pow(130) - BigInt.from(5); + + @override + final int hashLength = 16; + + @override + final int derivedKeyLength = 16; + + /// Creates a new instance to process 16-bytes blocks with 17-bytes buffer + /// + /// Parameters: + /// - [key] : The key-pair (`r`, `s`) - 16 or 32-bytes. + Poly1305Sink(Uint8List key) : super(16, bufferLength: 17) { + if (key.length != 16 && key.length != 32) { + throw ArgumentError('The key length must be either 16 or 32 bytes'); + } + + int i; + _r = BigInt.zero; + for (i = 15; i >= 0; i--) { + _r <<= 8; + _r += BigInt.from(key[i] & _clamp[i]); + } + + if (key.length == 32) { + _s = BigInt.zero; + for (i = 31; i >= 16; i--) { + _s <<= 8; + _s += BigInt.from(key[i]); + } + } + } + + @override + void reset() { + _n = BigInt.zero; + _h = BigInt.zero; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + for (; start < end; start++, pos++) { + if (pos == blockLength) { + _n += BigInt.one << 128; + $update(); + _n = BigInt.zero; + pos = 0; + } + _n += BigInt.from(chunk[start]) << (pos << 3); + } + if (pos == blockLength) { + _n += BigInt.one << 128; + $update(); + _n = BigInt.zero; + pos = 0; + } + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + _h = ((_h + _n) * _r) % _p; + } + + @override + Uint8List $finalize() { + if (pos > 0) { + _n += BigInt.one << (pos << 3); + $update(); + } + + _h += _s; + + var result = Uint32List.fromList([ + (_h % _m).toUnsigned(32).toInt(), + ((_h >> 32) % _m).toUnsigned(32).toInt(), + ((_h >> 64) % _m).toUnsigned(32).toInt(), + ((_h >> 96) % _m).toUnsigned(32).toInt(), + ]); + return Uint8List.view(result.buffer); + } +} diff --git a/hashlib/lib/src/algorithms/poly1305/poly1305_64bit.dart b/hashlib/lib/src/algorithms/poly1305/poly1305_64bit.dart new file mode 100644 index 0000000..077b0dd --- /dev/null +++ b/hashlib/lib/src/algorithms/poly1305/poly1305_64bit.dart @@ -0,0 +1,220 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +const int _mask32 = 0xFFFFFFFF; +const int _mask26 = 0x03FFFFFF; + +/// This implementation is derived from the [The Poly1305 Algorithms][pdf] +/// described in the [ChaCha20 and Poly1305 for IETF Protocols][rfc] document. +/// +/// The Reference implementation used for optimization: +/// https://github.com/floodyberry/poly1305-opt +/// +/// [rfc]: https://www.ietf.org/rfc/rfc8439.html +/// [pdf]: https://cr.yp.to/mac/poly1305-20050329.pdf +class Poly1305Sink extends BlockHashSink implements MACSinkBase { + // secret key: r + int _r0 = 0; + int _r1 = 0; + int _r2 = 0; + int _r3 = 0; + int _r4 = 0; + // authentication key: s + int _s0 = 0; + int _s1 = 0; + int _s2 = 0; + int _s3 = 0; + // accumulator: a + int _h0 = 0; + int _h1 = 0; + int _h2 = 0; + int _h3 = 0; + int _h4 = 0; + // g = 5 * r + int _g1 = 0; + int _g2 = 0; + int _g3 = 0; + int _g4 = 0; + + @override + final int hashLength = 16; + + @override + final int derivedKeyLength = 16; + + /// Creates a new instance to process 16-bytes blocks with 17-bytes buffer + /// + /// Parameters: + /// - [key] : The key-pair (`r`, `s`) - 16 or 32-bytes. + Poly1305Sink(Uint8List key) : super(16, bufferLength: 17) { + if (key.length != 16 && key.length != 32) { + throw ArgumentError('The key length must be either 16 or 32 bytes'); + } + + // r = key[15..0] + _r0 = key[0] | (key[1] << 8) | (key[2] << 16) | (key[3] << 24); + _r1 = (key[3] >>> 2) | (key[4] << 6) | (key[5] << 14) | (key[6] << 22); + _r2 = (key[6] >>> 4) | (key[7] << 4) | (key[8] << 12) | (key[9] << 20); + _r3 = (key[9] >>> 6) | (key[10] << 2) | (key[11] << 10) | (key[12] << 18); + _r4 = key[13] | (key[14] << 8) | (key[15] << 16); + + // clamp(r): r &= 0x0ffffffc0ffffffc0ffffffc0fffffff + _r0 &= 0x03ffffff; + _r1 &= 0x03ffff03; + _r2 &= 0x03ffc0ff; + _r3 &= 0x03f03fff; + _r4 &= 0x000fffff; + + _g1 = 5 * _r1; + _g2 = 5 * _r2; + _g3 = 5 * _r3; + _g4 = 5 * _r4; + + if (key.length == 32) { + // s = key[31..16] + _s0 = key[16] | (key[17] << 8) | (key[18] << 16) | (key[19] << 24); + _s1 = key[20] | (key[21] << 8) | (key[22] << 16) | (key[23] << 24); + _s2 = key[24] | (key[25] << 8) | (key[26] << 16) | (key[27] << 24); + _s3 = key[28] | (key[29] << 8) | (key[30] << 16) | (key[31] << 24); + } + } + + @override + void reset() { + _h0 = 0; + _h1 = 0; + _h2 = 0; + _h3 = 0; + _h4 = 0; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + buffer[16] = 1; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(); + pos = 0; + } + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int d0, d1, d2, d3, d4; + + // a += n + _h0 += buffer[0] | + (buffer[1] << 8) | + (buffer[2] << 16) | + ((buffer[3] & 0x03) << 24); + _h1 += (buffer[3] >>> 2) | + (buffer[4] << 6) | + (buffer[5] << 14) | + ((buffer[6] & 0xF) << 22); + _h2 += (buffer[6] >>> 4) | + (buffer[7] << 4) | + (buffer[8] << 12) | + ((buffer[9] & 0x3F) << 20); + _h3 += (buffer[9] >>> 6) | + (buffer[10] << 2) | + (buffer[11] << 10) | + (buffer[12] << 18); + _h4 += buffer[13] | + (buffer[14] << 8) | + (buffer[15] << 16) | + ((buffer[16] & 0x03) << 24); + + // a *= r + d0 = _h0 * _r0 + _h1 * _g4 + _h2 * _g3 + _h3 * _g2 + _h4 * _g1; + d1 = _h0 * _r1 + _h1 * _r0 + _h2 * _g4 + _h3 * _g3 + _h4 * _g2; + d2 = _h0 * _r2 + _h1 * _r1 + _h2 * _r0 + _h3 * _g4 + _h4 * _g3; + d3 = _h0 * _r3 + _h1 * _r2 + _h2 * _r1 + _h3 * _r0 + _h4 * _g4; + d4 = _h0 * _r4 + _h1 * _r3 + _h2 * _r2 + _h3 * _r1 + _h4 * _r0; + + // a %= 2^130 - 5; + d1 += d0 >>> 26; + d2 += d1 >>> 26; + d3 += d2 >>> 26; + d4 += d3 >>> 26; + _h0 = d0 & _mask26; + _h1 = d1 & _mask26; + _h2 = d2 & _mask26; + _h3 = d3 & _mask26; + _h4 = d4 & _mask26; + _h0 += 5 * (d4 >>> 26); + _h1 += _h0 >>> 26; + _h0 &= _mask26; + } + + @override + Uint8List $finalize() { + if (pos > 0) { + buffer[pos] = 1; + for (pos++; pos <= 16; pos++) { + buffer[pos] = 0; + } + $update(); + } + + int d0, d1, d2, d3, d4; + + // fully carry + _h1 += _h0 >>> 26; + _h2 += _h1 >>> 26; + _h3 += _h2 >>> 26; + _h4 += _h3 >>> 26; + _h0 &= _mask26; + _h1 &= _mask26; + _h2 &= _mask26; + _h3 &= _mask26; + + // compute d = h - p + d0 = _h0 + 5; + d1 = _h1 + (d0 >>> 26); + d2 = _h2 + (d1 >>> 26); + d3 = _h3 + (d2 >>> 26); + d4 = _h4 + (d3 >>> 26) - (1 << 26); + d4 &= _mask32; + + // if h < p, take h; else, take d + if ((d4 >>> 31) != 1) { + _h0 = d0 & _mask26; + _h1 = d1 & _mask26; + _h2 = d2 & _mask26; + _h3 = d3 & _mask26; + _h4 = d4 & _mask26; + } + + // modulus 2^128 + _h0 = ((_h0) | (_h1 << 26)) & _mask32; + _h1 = ((_h1 >>> 6) | (_h2 << 20)) & _mask32; + _h2 = ((_h2 >>> 12) | (_h3 << 14)) & _mask32; + _h3 = ((_h3 >>> 18) | (_h4 << 8)) & _mask32; + + // h += s + _h0 += _s0; + _h1 += _s1 + (_h0 >>> 32); + _h2 += _s2 + (_h1 >>> 32); + _h3 += _s3 + (_h2 >>> 32); + + var result = Uint32List.fromList([ + _h0, + _h1, + _h2, + _h3, + ]); + return Uint8List.view(result.buffer); + } +} diff --git a/hashlib/lib/src/algorithms/poly1305/poly1305_sink.dart b/hashlib/lib/src/algorithms/poly1305/poly1305_sink.dart new file mode 100644 index 0000000..f4e9b1f --- /dev/null +++ b/hashlib/lib/src/algorithms/poly1305/poly1305_sink.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'poly1305_64bit.dart' if (dart.library.js) 'poly1305_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/ripemd/ripemd128.dart b/hashlib/lib/src/algorithms/ripemd/ripemd128.dart new file mode 100644 index 0000000..782317d --- /dev/null +++ b/hashlib/lib/src/algorithms/ripemd/ripemd128.dart @@ -0,0 +1,328 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, + 0xefcdab89, + 0x98badcfe, + 0x10325476, +]; + +/// This implementation is derived from the Bouncy Castle's implementation of +/// [RIPEMD-128][bc]. +/// +/// [bc]: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/digests/RIPEMD128Digest.java +class RIPEMD128Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + RIPEMD128Hash() + : state = Uint32List.fromList(_iv), + hashLength = 128 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @pragma('vm:prefer-inline') + static int _f1(int x, int y, int z) => x ^ y ^ z; + + @pragma('vm:prefer-inline') + static int _f2(int x, int y, int z) => (x & y) | (((~x) & _mask32) & z); + + @pragma('vm:prefer-inline') + static int _f3(int x, int y, int z) => (x | ((~y) & _mask32)) ^ z; + + @pragma('vm:prefer-inline') + static int _f4(int x, int y, int z) => (x & z) | (y & ((~z) & _mask32)); + + @pragma('vm:prefer-inline') + static int _lr1(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f1(b, c, d) + x, s); + + @pragma('vm:prefer-inline') + static int _lr2(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f2(b, c, d) + x + 0x5a827999, s); + + @pragma('vm:prefer-inline') + static int _lr3(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f3(b, c, d) + x + 0x6ed9eba1, s); + + @pragma('vm:prefer-inline') + static int _lr4(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f4(b, c, d) + x + 0x8f1bbcdc, s); + + @pragma('vm:prefer-inline') + static int _rr1(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f1(b, c, d) + x, s); + + @pragma('vm:prefer-inline') + static int _rr2(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f2(b, c, d) + x + 0x6d703ef3, s); + + @pragma('vm:prefer-inline') + static int _rr3(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f3(b, c, d) + x + 0x5c4dd124, s); + + @pragma('vm:prefer-inline') + static int _rr4(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f4(b, c, d) + x + 0x50a28be6, s); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, aa, bb, cc, dd; + int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + + a = aa = state[0]; + b = bb = state[1]; + c = cc = state[2]; + d = dd = state[3]; + + x0 = sbuffer[0]; + x1 = sbuffer[1]; + x2 = sbuffer[2]; + x3 = sbuffer[3]; + x4 = sbuffer[4]; + x5 = sbuffer[5]; + x6 = sbuffer[6]; + x7 = sbuffer[7]; + x8 = sbuffer[8]; + x9 = sbuffer[9]; + x10 = sbuffer[10]; + x11 = sbuffer[11]; + x12 = sbuffer[12]; + x13 = sbuffer[13]; + x14 = sbuffer[14]; + x15 = sbuffer[15]; + + // + // Round 1 + // + a = _lr1(a, b, c, d, x0, 11); + d = _lr1(d, a, b, c, x1, 14); + c = _lr1(c, d, a, b, x2, 15); + b = _lr1(b, c, d, a, x3, 12); + a = _lr1(a, b, c, d, x4, 5); + d = _lr1(d, a, b, c, x5, 8); + c = _lr1(c, d, a, b, x6, 7); + b = _lr1(b, c, d, a, x7, 9); + a = _lr1(a, b, c, d, x8, 11); + d = _lr1(d, a, b, c, x9, 13); + c = _lr1(c, d, a, b, x10, 14); + b = _lr1(b, c, d, a, x11, 15); + a = _lr1(a, b, c, d, x12, 6); + d = _lr1(d, a, b, c, x13, 7); + c = _lr1(c, d, a, b, x14, 9); + b = _lr1(b, c, d, a, x15, 8); + + // + // Round 2 + // + a = _lr2(a, b, c, d, x7, 7); + d = _lr2(d, a, b, c, x4, 6); + c = _lr2(c, d, a, b, x13, 8); + b = _lr2(b, c, d, a, x1, 13); + a = _lr2(a, b, c, d, x10, 11); + d = _lr2(d, a, b, c, x6, 9); + c = _lr2(c, d, a, b, x15, 7); + b = _lr2(b, c, d, a, x3, 15); + a = _lr2(a, b, c, d, x12, 7); + d = _lr2(d, a, b, c, x0, 12); + c = _lr2(c, d, a, b, x9, 15); + b = _lr2(b, c, d, a, x5, 9); + a = _lr2(a, b, c, d, x2, 11); + d = _lr2(d, a, b, c, x14, 7); + c = _lr2(c, d, a, b, x11, 13); + b = _lr2(b, c, d, a, x8, 12); + + // + // Round 3 + // + a = _lr3(a, b, c, d, x3, 11); + d = _lr3(d, a, b, c, x10, 13); + c = _lr3(c, d, a, b, x14, 6); + b = _lr3(b, c, d, a, x4, 7); + a = _lr3(a, b, c, d, x9, 14); + d = _lr3(d, a, b, c, x15, 9); + c = _lr3(c, d, a, b, x8, 13); + b = _lr3(b, c, d, a, x1, 15); + a = _lr3(a, b, c, d, x2, 14); + d = _lr3(d, a, b, c, x7, 8); + c = _lr3(c, d, a, b, x0, 13); + b = _lr3(b, c, d, a, x6, 6); + a = _lr3(a, b, c, d, x13, 5); + d = _lr3(d, a, b, c, x11, 12); + c = _lr3(c, d, a, b, x5, 7); + b = _lr3(b, c, d, a, x12, 5); + + // + // Round 4 + // + a = _lr4(a, b, c, d, x1, 11); + d = _lr4(d, a, b, c, x9, 12); + c = _lr4(c, d, a, b, x11, 14); + b = _lr4(b, c, d, a, x10, 15); + a = _lr4(a, b, c, d, x0, 14); + d = _lr4(d, a, b, c, x8, 15); + c = _lr4(c, d, a, b, x12, 9); + b = _lr4(b, c, d, a, x4, 8); + a = _lr4(a, b, c, d, x13, 9); + d = _lr4(d, a, b, c, x3, 14); + c = _lr4(c, d, a, b, x7, 5); + b = _lr4(b, c, d, a, x15, 6); + a = _lr4(a, b, c, d, x14, 8); + d = _lr4(d, a, b, c, x5, 6); + c = _lr4(c, d, a, b, x6, 5); + b = _lr4(b, c, d, a, x2, 12); + + // + // Parallel round 1 + // + aa = _rr4(aa, bb, cc, dd, x5, 8); + dd = _rr4(dd, aa, bb, cc, x14, 9); + cc = _rr4(cc, dd, aa, bb, x7, 9); + bb = _rr4(bb, cc, dd, aa, x0, 11); + aa = _rr4(aa, bb, cc, dd, x9, 13); + dd = _rr4(dd, aa, bb, cc, x2, 15); + cc = _rr4(cc, dd, aa, bb, x11, 15); + bb = _rr4(bb, cc, dd, aa, x4, 5); + aa = _rr4(aa, bb, cc, dd, x13, 7); + dd = _rr4(dd, aa, bb, cc, x6, 7); + cc = _rr4(cc, dd, aa, bb, x15, 8); + bb = _rr4(bb, cc, dd, aa, x8, 11); + aa = _rr4(aa, bb, cc, dd, x1, 14); + dd = _rr4(dd, aa, bb, cc, x10, 14); + cc = _rr4(cc, dd, aa, bb, x3, 12); + bb = _rr4(bb, cc, dd, aa, x12, 6); + + // + // Parallel round 2 + // + aa = _rr3(aa, bb, cc, dd, x6, 9); + dd = _rr3(dd, aa, bb, cc, x11, 13); + cc = _rr3(cc, dd, aa, bb, x3, 15); + bb = _rr3(bb, cc, dd, aa, x7, 7); + aa = _rr3(aa, bb, cc, dd, x0, 12); + dd = _rr3(dd, aa, bb, cc, x13, 8); + cc = _rr3(cc, dd, aa, bb, x5, 9); + bb = _rr3(bb, cc, dd, aa, x10, 11); + aa = _rr3(aa, bb, cc, dd, x14, 7); + dd = _rr3(dd, aa, bb, cc, x15, 7); + cc = _rr3(cc, dd, aa, bb, x8, 12); + bb = _rr3(bb, cc, dd, aa, x12, 7); + aa = _rr3(aa, bb, cc, dd, x4, 6); + dd = _rr3(dd, aa, bb, cc, x9, 15); + cc = _rr3(cc, dd, aa, bb, x1, 13); + bb = _rr3(bb, cc, dd, aa, x2, 11); + + // + // Parallel round 3 + // + aa = _rr2(aa, bb, cc, dd, x15, 9); + dd = _rr2(dd, aa, bb, cc, x5, 7); + cc = _rr2(cc, dd, aa, bb, x1, 15); + bb = _rr2(bb, cc, dd, aa, x3, 11); + aa = _rr2(aa, bb, cc, dd, x7, 8); + dd = _rr2(dd, aa, bb, cc, x14, 6); + cc = _rr2(cc, dd, aa, bb, x6, 6); + bb = _rr2(bb, cc, dd, aa, x9, 14); + aa = _rr2(aa, bb, cc, dd, x11, 12); + dd = _rr2(dd, aa, bb, cc, x8, 13); + cc = _rr2(cc, dd, aa, bb, x12, 5); + bb = _rr2(bb, cc, dd, aa, x2, 14); + aa = _rr2(aa, bb, cc, dd, x10, 13); + dd = _rr2(dd, aa, bb, cc, x0, 13); + cc = _rr2(cc, dd, aa, bb, x4, 7); + bb = _rr2(bb, cc, dd, aa, x13, 5); + + // + // Parallel round 4 + // + aa = _rr1(aa, bb, cc, dd, x8, 15); + dd = _rr1(dd, aa, bb, cc, x6, 5); + cc = _rr1(cc, dd, aa, bb, x4, 8); + bb = _rr1(bb, cc, dd, aa, x1, 11); + aa = _rr1(aa, bb, cc, dd, x3, 14); + dd = _rr1(dd, aa, bb, cc, x11, 14); + cc = _rr1(cc, dd, aa, bb, x15, 6); + bb = _rr1(bb, cc, dd, aa, x0, 14); + aa = _rr1(aa, bb, cc, dd, x5, 6); + dd = _rr1(dd, aa, bb, cc, x12, 9); + cc = _rr1(cc, dd, aa, bb, x2, 12); + bb = _rr1(bb, cc, dd, aa, x13, 9); + aa = _rr1(aa, bb, cc, dd, x9, 12); + dd = _rr1(dd, aa, bb, cc, x7, 5); + cc = _rr1(cc, dd, aa, bb, x10, 15); + bb = _rr1(bb, cc, dd, aa, x14, 8); + + // + // combine the results + // + dd += c + state[1]; + state[1] = state[2] + d + aa; + state[2] = state[3] + a + bb; + state[3] = state[0] + b + cc; + state[0] = dd; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/ripemd/ripemd160.dart b/hashlib/lib/src/algorithms/ripemd/ripemd160.dart new file mode 100644 index 0000000..d5f9046 --- /dev/null +++ b/hashlib/lib/src/algorithms/ripemd/ripemd160.dart @@ -0,0 +1,494 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, + 0xefcdab89, + 0x98badcfe, + 0x10325476, + 0xc3d2e1f0, +]; + +/// This implementation is derived from the Bouncy Castle's implementation of +/// [RIPEMD-160][bc]. +/// +/// [bc]: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/digests/RIPEMD160Digest.java +class RIPEMD160Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + RIPEMD160Hash() + : state = Uint32List.fromList(_iv), + hashLength = 160 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @pragma('vm:prefer-inline') + static int _f1(int x, int y, int z) => x ^ y ^ z; + + @pragma('vm:prefer-inline') + static int _f2(int x, int y, int z) => (x & y) | (((~x) & _mask32) & z); + + @pragma('vm:prefer-inline') + static int _f3(int x, int y, int z) => (x | ((~y) & _mask32)) ^ z; + + @pragma('vm:prefer-inline') + static int _f4(int x, int y, int z) => (x & z) | (y & ((~z) & _mask32)); + + @pragma('vm:prefer-inline') + static int _f5(int x, int y, int z) => x ^ (y | ((~z) & _mask32)); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, e, aa, bb, cc, dd, ee; + int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + + a = aa = state[0]; + b = bb = state[1]; + c = cc = state[2]; + d = dd = state[3]; + e = ee = state[4]; + + x0 = sbuffer[0]; + x1 = sbuffer[1]; + x2 = sbuffer[2]; + x3 = sbuffer[3]; + x4 = sbuffer[4]; + x5 = sbuffer[5]; + x6 = sbuffer[6]; + x7 = sbuffer[7]; + x8 = sbuffer[8]; + x9 = sbuffer[9]; + x10 = sbuffer[10]; + x11 = sbuffer[11]; + x12 = sbuffer[12]; + x13 = sbuffer[13]; + x14 = sbuffer[14]; + x15 = sbuffer[15]; + + // + // Rounds 1 - 16 + // + // left + a = _rotl32(a + _f1(b, c, d) + x0, 11) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x1, 14) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x2, 15) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x3, 12) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x4, 5) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x5, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x6, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x7, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x8, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x9, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x10, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x11, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x12, 6) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x13, 7) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x14, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x15, 8) + e; + c = _rotl32(c, 10); + + // right + aa = _rotl32(aa + _f5(bb, cc, dd) + x5 + 0x50a28be6, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x14 + 0x50a28be6, 9) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x7 + 0x50a28be6, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x0 + 0x50a28be6, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x9 + 0x50a28be6, 13) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x2 + 0x50a28be6, 15) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x11 + 0x50a28be6, 15) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x4 + 0x50a28be6, 5) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x13 + 0x50a28be6, 7) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x6 + 0x50a28be6, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x15 + 0x50a28be6, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x8 + 0x50a28be6, 11) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x1 + 0x50a28be6, 14) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x10 + 0x50a28be6, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x3 + 0x50a28be6, 12) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x12 + 0x50a28be6, 6) + ee; + cc = _rotl32(cc, 10); + + // + // Rounds 16-31 + // + // left + e = _rotl32(e + _f2(a, b, c) + x7 + 0x5a827999, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x4 + 0x5a827999, 6) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x13 + 0x5a827999, 8) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x1 + 0x5a827999, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x10 + 0x5a827999, 11) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x6 + 0x5a827999, 9) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x15 + 0x5a827999, 7) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x3 + 0x5a827999, 15) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x12 + 0x5a827999, 7) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x0 + 0x5a827999, 12) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x9 + 0x5a827999, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x5 + 0x5a827999, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x2 + 0x5a827999, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x14 + 0x5a827999, 7) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x11 + 0x5a827999, 13) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x8 + 0x5a827999, 12) + d; + b = _rotl32(b, 10); + + // right + ee = _rotl32(ee + _f4(aa, bb, cc) + x6 + 0x5c4dd124, 9) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x11 + 0x5c4dd124, 13) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x3 + 0x5c4dd124, 15) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x7 + 0x5c4dd124, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x0 + 0x5c4dd124, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x13 + 0x5c4dd124, 8) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x5 + 0x5c4dd124, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x10 + 0x5c4dd124, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x14 + 0x5c4dd124, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x15 + 0x5c4dd124, 7) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x8 + 0x5c4dd124, 12) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x12 + 0x5c4dd124, 7) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x4 + 0x5c4dd124, 6) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x9 + 0x5c4dd124, 15) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x1 + 0x5c4dd124, 13) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x2 + 0x5c4dd124, 11) + dd; + bb = _rotl32(bb, 10); + + // + // Rounds 32-47 + // + // left + d = _rotl32(d + _f3(e, a, b) + x3 + 0x6ed9eba1, 11) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x10 + 0x6ed9eba1, 13) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x14 + 0x6ed9eba1, 6) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x4 + 0x6ed9eba1, 7) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x9 + 0x6ed9eba1, 14) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x15 + 0x6ed9eba1, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x8 + 0x6ed9eba1, 13) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x1 + 0x6ed9eba1, 15) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x2 + 0x6ed9eba1, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x7 + 0x6ed9eba1, 8) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x0 + 0x6ed9eba1, 13) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x6 + 0x6ed9eba1, 6) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x13 + 0x6ed9eba1, 5) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x11 + 0x6ed9eba1, 12) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x5 + 0x6ed9eba1, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x12 + 0x6ed9eba1, 5) + c; + a = _rotl32(a, 10); + + // right + dd = _rotl32(dd + _f3(ee, aa, bb) + x15 + 0x6d703ef3, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x5 + 0x6d703ef3, 7) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x1 + 0x6d703ef3, 15) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x3 + 0x6d703ef3, 11) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x7 + 0x6d703ef3, 8) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x14 + 0x6d703ef3, 6) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x6 + 0x6d703ef3, 6) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x9 + 0x6d703ef3, 14) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x11 + 0x6d703ef3, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x8 + 0x6d703ef3, 13) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x12 + 0x6d703ef3, 5) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x2 + 0x6d703ef3, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x10 + 0x6d703ef3, 13) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x0 + 0x6d703ef3, 13) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x4 + 0x6d703ef3, 7) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x13 + 0x6d703ef3, 5) + cc; + aa = _rotl32(aa, 10); + + // + // Rounds 48-63 + // + // left + c = _rotl32(c + _f4(d, e, a) + x1 + 0x8f1bbcdc, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x9 + 0x8f1bbcdc, 12) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x11 + 0x8f1bbcdc, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x10 + 0x8f1bbcdc, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x0 + 0x8f1bbcdc, 14) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x8 + 0x8f1bbcdc, 15) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x12 + 0x8f1bbcdc, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x4 + 0x8f1bbcdc, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x13 + 0x8f1bbcdc, 9) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x3 + 0x8f1bbcdc, 14) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x7 + 0x8f1bbcdc, 5) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x15 + 0x8f1bbcdc, 6) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x14 + 0x8f1bbcdc, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x5 + 0x8f1bbcdc, 6) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x6 + 0x8f1bbcdc, 5) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x2 + 0x8f1bbcdc, 12) + b; + e = _rotl32(e, 10); + + // right + cc = _rotl32(cc + _f2(dd, ee, aa) + x8 + 0x7a6d76e9, 15) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x6 + 0x7a6d76e9, 5) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x4 + 0x7a6d76e9, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x1 + 0x7a6d76e9, 11) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x3 + 0x7a6d76e9, 14) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x11 + 0x7a6d76e9, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x15 + 0x7a6d76e9, 6) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x0 + 0x7a6d76e9, 14) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x5 + 0x7a6d76e9, 6) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x12 + 0x7a6d76e9, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x2 + 0x7a6d76e9, 12) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x13 + 0x7a6d76e9, 9) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x9 + 0x7a6d76e9, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x7 + 0x7a6d76e9, 5) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x10 + 0x7a6d76e9, 15) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x14 + 0x7a6d76e9, 8) + bb; + ee = _rotl32(ee, 10); + + // + // Rounds 64-79 + // + // left + b = _rotl32(b + _f5(c, d, e) + x4 + 0xa953fd4e, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x0 + 0xa953fd4e, 15) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x5 + 0xa953fd4e, 5) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x9 + 0xa953fd4e, 11) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x7 + 0xa953fd4e, 6) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x12 + 0xa953fd4e, 8) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x2 + 0xa953fd4e, 13) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x10 + 0xa953fd4e, 12) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x14 + 0xa953fd4e, 5) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x1 + 0xa953fd4e, 12) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x3 + 0xa953fd4e, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x8 + 0xa953fd4e, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x11 + 0xa953fd4e, 11) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x6 + 0xa953fd4e, 8) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x15 + 0xa953fd4e, 5) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x13 + 0xa953fd4e, 6) + a; + d = _rotl32(d, 10); + + // right + bb = _rotl32(bb + _f1(cc, dd, ee) + x12, 8) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x15, 5) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x10, 12) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x4, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x1, 12) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x5, 5) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x8, 14) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x7, 6) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x6, 8) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x2, 13) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x13, 6) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x14, 5) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x0, 15) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x3, 13) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x9, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x11, 11) + aa; + dd = _rotl32(dd, 10); + + dd += c + state[1]; + state[1] = state[2] + d + ee; + state[2] = state[3] + e + aa; + state[3] = state[4] + a + bb; + state[4] = state[0] + b + cc; + state[0] = dd; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/ripemd/ripemd256.dart b/hashlib/lib/src/algorithms/ripemd/ripemd256.dart new file mode 100644 index 0000000..6fcc252 --- /dev/null +++ b/hashlib/lib/src/algorithms/ripemd/ripemd256.dart @@ -0,0 +1,343 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, + 0xefcdab89, + 0x98badcfe, + 0x10325476, + 0x76543210, + 0xFEDCBA98, + 0x89ABCDEF, + 0x01234567, +]; + +/// This implementation is derived from the Bouncy Castle's implementation of +/// [RIPEMD-256][bc]. +/// +/// [bc]: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/digests/RIPEMD256Digest.java +class RIPEMD256Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + RIPEMD256Hash() + : state = Uint32List.fromList(_iv), + hashLength = 256 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @pragma('vm:prefer-inline') + static int _f1(int x, int y, int z) => x ^ y ^ z; + + @pragma('vm:prefer-inline') + static int _f2(int x, int y, int z) => (x & y) | (((~x) & _mask32) & z); + + @pragma('vm:prefer-inline') + static int _f3(int x, int y, int z) => (x | ((~y) & _mask32)) ^ z; + + @pragma('vm:prefer-inline') + static int _f4(int x, int y, int z) => (x & z) | (y & ((~z) & _mask32)); + + @pragma('vm:prefer-inline') + static int _lr1(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f1(b, c, d) + x, s); + + @pragma('vm:prefer-inline') + static int _lr2(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f2(b, c, d) + x + 0x5a827999, s); + + @pragma('vm:prefer-inline') + static int _lr3(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f3(b, c, d) + x + 0x6ed9eba1, s); + + @pragma('vm:prefer-inline') + static int _lr4(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f4(b, c, d) + x + 0x8f1bbcdc, s); + + @pragma('vm:prefer-inline') + static int _rr1(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f1(b, c, d) + x, s); + + @pragma('vm:prefer-inline') + static int _rr2(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f2(b, c, d) + x + 0x6d703ef3, s); + + @pragma('vm:prefer-inline') + static int _rr3(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f3(b, c, d) + x + 0x5c4dd124, s); + + @pragma('vm:prefer-inline') + static int _rr4(int a, int b, int c, int d, int x, int s) => + _rotl32(a + _f4(b, c, d) + x + 0x50a28be6, s); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, aa, bb, cc, dd, t; + int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + aa = state[4]; + bb = state[5]; + cc = state[6]; + dd = state[7]; + + x0 = sbuffer[0]; + x1 = sbuffer[1]; + x2 = sbuffer[2]; + x3 = sbuffer[3]; + x4 = sbuffer[4]; + x5 = sbuffer[5]; + x6 = sbuffer[6]; + x7 = sbuffer[7]; + x8 = sbuffer[8]; + x9 = sbuffer[9]; + x10 = sbuffer[10]; + x11 = sbuffer[11]; + x12 = sbuffer[12]; + x13 = sbuffer[13]; + x14 = sbuffer[14]; + x15 = sbuffer[15]; + + // + // Round 1 + // + a = _lr1(a, b, c, d, x0, 11); + d = _lr1(d, a, b, c, x1, 14); + c = _lr1(c, d, a, b, x2, 15); + b = _lr1(b, c, d, a, x3, 12); + a = _lr1(a, b, c, d, x4, 5); + d = _lr1(d, a, b, c, x5, 8); + c = _lr1(c, d, a, b, x6, 7); + b = _lr1(b, c, d, a, x7, 9); + a = _lr1(a, b, c, d, x8, 11); + d = _lr1(d, a, b, c, x9, 13); + c = _lr1(c, d, a, b, x10, 14); + b = _lr1(b, c, d, a, x11, 15); + a = _lr1(a, b, c, d, x12, 6); + d = _lr1(d, a, b, c, x13, 7); + c = _lr1(c, d, a, b, x14, 9); + b = _lr1(b, c, d, a, x15, 8); + + aa = _rr4(aa, bb, cc, dd, x5, 8); + dd = _rr4(dd, aa, bb, cc, x14, 9); + cc = _rr4(cc, dd, aa, bb, x7, 9); + bb = _rr4(bb, cc, dd, aa, x0, 11); + aa = _rr4(aa, bb, cc, dd, x9, 13); + dd = _rr4(dd, aa, bb, cc, x2, 15); + cc = _rr4(cc, dd, aa, bb, x11, 15); + bb = _rr4(bb, cc, dd, aa, x4, 5); + aa = _rr4(aa, bb, cc, dd, x13, 7); + dd = _rr4(dd, aa, bb, cc, x6, 7); + cc = _rr4(cc, dd, aa, bb, x15, 8); + bb = _rr4(bb, cc, dd, aa, x8, 11); + aa = _rr4(aa, bb, cc, dd, x1, 14); + dd = _rr4(dd, aa, bb, cc, x10, 14); + cc = _rr4(cc, dd, aa, bb, x3, 12); + bb = _rr4(bb, cc, dd, aa, x12, 6); + + t = a; + a = aa; + aa = t; + + // + // Round 2 + // + a = _lr2(a, b, c, d, x7, 7); + d = _lr2(d, a, b, c, x4, 6); + c = _lr2(c, d, a, b, x13, 8); + b = _lr2(b, c, d, a, x1, 13); + a = _lr2(a, b, c, d, x10, 11); + d = _lr2(d, a, b, c, x6, 9); + c = _lr2(c, d, a, b, x15, 7); + b = _lr2(b, c, d, a, x3, 15); + a = _lr2(a, b, c, d, x12, 7); + d = _lr2(d, a, b, c, x0, 12); + c = _lr2(c, d, a, b, x9, 15); + b = _lr2(b, c, d, a, x5, 9); + a = _lr2(a, b, c, d, x2, 11); + d = _lr2(d, a, b, c, x14, 7); + c = _lr2(c, d, a, b, x11, 13); + b = _lr2(b, c, d, a, x8, 12); + + aa = _rr3(aa, bb, cc, dd, x6, 9); + dd = _rr3(dd, aa, bb, cc, x11, 13); + cc = _rr3(cc, dd, aa, bb, x3, 15); + bb = _rr3(bb, cc, dd, aa, x7, 7); + aa = _rr3(aa, bb, cc, dd, x0, 12); + dd = _rr3(dd, aa, bb, cc, x13, 8); + cc = _rr3(cc, dd, aa, bb, x5, 9); + bb = _rr3(bb, cc, dd, aa, x10, 11); + aa = _rr3(aa, bb, cc, dd, x14, 7); + dd = _rr3(dd, aa, bb, cc, x15, 7); + cc = _rr3(cc, dd, aa, bb, x8, 12); + bb = _rr3(bb, cc, dd, aa, x12, 7); + aa = _rr3(aa, bb, cc, dd, x4, 6); + dd = _rr3(dd, aa, bb, cc, x9, 15); + cc = _rr3(cc, dd, aa, bb, x1, 13); + bb = _rr3(bb, cc, dd, aa, x2, 11); + + t = b; + b = bb; + bb = t; + + // + // Round 3 + // + a = _lr3(a, b, c, d, x3, 11); + d = _lr3(d, a, b, c, x10, 13); + c = _lr3(c, d, a, b, x14, 6); + b = _lr3(b, c, d, a, x4, 7); + a = _lr3(a, b, c, d, x9, 14); + d = _lr3(d, a, b, c, x15, 9); + c = _lr3(c, d, a, b, x8, 13); + b = _lr3(b, c, d, a, x1, 15); + a = _lr3(a, b, c, d, x2, 14); + d = _lr3(d, a, b, c, x7, 8); + c = _lr3(c, d, a, b, x0, 13); + b = _lr3(b, c, d, a, x6, 6); + a = _lr3(a, b, c, d, x13, 5); + d = _lr3(d, a, b, c, x11, 12); + c = _lr3(c, d, a, b, x5, 7); + b = _lr3(b, c, d, a, x12, 5); + + aa = _rr2(aa, bb, cc, dd, x15, 9); + dd = _rr2(dd, aa, bb, cc, x5, 7); + cc = _rr2(cc, dd, aa, bb, x1, 15); + bb = _rr2(bb, cc, dd, aa, x3, 11); + aa = _rr2(aa, bb, cc, dd, x7, 8); + dd = _rr2(dd, aa, bb, cc, x14, 6); + cc = _rr2(cc, dd, aa, bb, x6, 6); + bb = _rr2(bb, cc, dd, aa, x9, 14); + aa = _rr2(aa, bb, cc, dd, x11, 12); + dd = _rr2(dd, aa, bb, cc, x8, 13); + cc = _rr2(cc, dd, aa, bb, x12, 5); + bb = _rr2(bb, cc, dd, aa, x2, 14); + aa = _rr2(aa, bb, cc, dd, x10, 13); + dd = _rr2(dd, aa, bb, cc, x0, 13); + cc = _rr2(cc, dd, aa, bb, x4, 7); + bb = _rr2(bb, cc, dd, aa, x13, 5); + + t = c; + c = cc; + cc = t; + + // + // Round 4 + // + a = _lr4(a, b, c, d, x1, 11); + d = _lr4(d, a, b, c, x9, 12); + c = _lr4(c, d, a, b, x11, 14); + b = _lr4(b, c, d, a, x10, 15); + a = _lr4(a, b, c, d, x0, 14); + d = _lr4(d, a, b, c, x8, 15); + c = _lr4(c, d, a, b, x12, 9); + b = _lr4(b, c, d, a, x4, 8); + a = _lr4(a, b, c, d, x13, 9); + d = _lr4(d, a, b, c, x3, 14); + c = _lr4(c, d, a, b, x7, 5); + b = _lr4(b, c, d, a, x15, 6); + a = _lr4(a, b, c, d, x14, 8); + d = _lr4(d, a, b, c, x5, 6); + c = _lr4(c, d, a, b, x6, 5); + b = _lr4(b, c, d, a, x2, 12); + + aa = _rr1(aa, bb, cc, dd, x8, 15); + dd = _rr1(dd, aa, bb, cc, x6, 5); + cc = _rr1(cc, dd, aa, bb, x4, 8); + bb = _rr1(bb, cc, dd, aa, x1, 11); + aa = _rr1(aa, bb, cc, dd, x3, 14); + dd = _rr1(dd, aa, bb, cc, x11, 14); + cc = _rr1(cc, dd, aa, bb, x15, 6); + bb = _rr1(bb, cc, dd, aa, x0, 14); + aa = _rr1(aa, bb, cc, dd, x5, 6); + dd = _rr1(dd, aa, bb, cc, x12, 9); + cc = _rr1(cc, dd, aa, bb, x2, 12); + bb = _rr1(bb, cc, dd, aa, x13, 9); + aa = _rr1(aa, bb, cc, dd, x9, 12); + dd = _rr1(dd, aa, bb, cc, x7, 5); + cc = _rr1(cc, dd, aa, bb, x10, 15); + bb = _rr1(bb, cc, dd, aa, x14, 8); + + t = d; + d = dd; + dd = t; + + // + // combine the results + // + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += aa; + state[5] += bb; + state[6] += cc; + state[7] += dd; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/ripemd/ripemd320.dart b/hashlib/lib/src/algorithms/ripemd/ripemd320.dart new file mode 100644 index 0000000..0790d72 --- /dev/null +++ b/hashlib/lib/src/algorithms/ripemd/ripemd320.dart @@ -0,0 +1,527 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, + 0xefcdab89, + 0x98badcfe, + 0x10325476, + 0xc3d2e1f0, + 0x76543210, + 0xFEDCBA98, + 0x89ABCDEF, + 0x01234567, + 0x3C2D1E0F, +]; + +/// This implementation is derived from the Bouncy Castle's implementation of +/// [RIPEMD-320][bc]. +/// +/// [bc]: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/digests/RIPEMD320Digest.java +class RIPEMD320Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + RIPEMD320Hash() + : state = Uint32List.fromList(_iv), + hashLength = 320 >>> 3, + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @pragma('vm:prefer-inline') + static int _f1(int x, int y, int z) => x ^ y ^ z; + + @pragma('vm:prefer-inline') + static int _f2(int x, int y, int z) => (x & y) | (((~x) & _mask32) & z); + + @pragma('vm:prefer-inline') + static int _f3(int x, int y, int z) => (x | ((~y) & _mask32)) ^ z; + + @pragma('vm:prefer-inline') + static int _f4(int x, int y, int z) => (x & z) | (y & ((~z) & _mask32)); + + @pragma('vm:prefer-inline') + static int _f5(int x, int y, int z) => x ^ (y | ((~z) & _mask32)); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, e, aa, bb, cc, dd, ee, t; + int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + aa = state[5]; + bb = state[6]; + cc = state[7]; + dd = state[8]; + ee = state[9]; + + x0 = sbuffer[0]; + x1 = sbuffer[1]; + x2 = sbuffer[2]; + x3 = sbuffer[3]; + x4 = sbuffer[4]; + x5 = sbuffer[5]; + x6 = sbuffer[6]; + x7 = sbuffer[7]; + x8 = sbuffer[8]; + x9 = sbuffer[9]; + x10 = sbuffer[10]; + x11 = sbuffer[11]; + x12 = sbuffer[12]; + x13 = sbuffer[13]; + x14 = sbuffer[14]; + x15 = sbuffer[15]; + + // + // Rounds 1 - 16 + // + // left + a = _rotl32(a + _f1(b, c, d) + x0, 11) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x1, 14) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x2, 15) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x3, 12) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x4, 5) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x5, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x6, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x7, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x8, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x9, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x10, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f1(a, b, c) + x11, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f1(e, a, b) + x12, 6) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f1(d, e, a) + x13, 7) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f1(c, d, e) + x14, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f1(b, c, d) + x15, 8) + e; + c = _rotl32(c, 10); + + // right + aa = _rotl32(aa + _f5(bb, cc, dd) + x5 + 0x50a28be6, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x14 + 0x50a28be6, 9) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x7 + 0x50a28be6, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x0 + 0x50a28be6, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x9 + 0x50a28be6, 13) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x2 + 0x50a28be6, 15) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x11 + 0x50a28be6, 15) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x4 + 0x50a28be6, 5) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x13 + 0x50a28be6, 7) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x6 + 0x50a28be6, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x15 + 0x50a28be6, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f5(aa, bb, cc) + x8 + 0x50a28be6, 11) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f5(ee, aa, bb) + x1 + 0x50a28be6, 14) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f5(dd, ee, aa) + x10 + 0x50a28be6, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f5(cc, dd, ee) + x3 + 0x50a28be6, 12) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f5(bb, cc, dd) + x12 + 0x50a28be6, 6) + ee; + cc = _rotl32(cc, 10); + + t = a; + a = aa; + aa = t; + + // + // Rounds 16-31 + // + // left + e = _rotl32(e + _f2(a, b, c) + x7 + 0x5a827999, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x4 + 0x5a827999, 6) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x13 + 0x5a827999, 8) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x1 + 0x5a827999, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x10 + 0x5a827999, 11) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x6 + 0x5a827999, 9) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x15 + 0x5a827999, 7) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x3 + 0x5a827999, 15) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x12 + 0x5a827999, 7) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x0 + 0x5a827999, 12) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x9 + 0x5a827999, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f2(e, a, b) + x5 + 0x5a827999, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f2(d, e, a) + x2 + 0x5a827999, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f2(c, d, e) + x14 + 0x5a827999, 7) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f2(b, c, d) + x11 + 0x5a827999, 13) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f2(a, b, c) + x8 + 0x5a827999, 12) + d; + b = _rotl32(b, 10); + + // right + ee = _rotl32(ee + _f4(aa, bb, cc) + x6 + 0x5c4dd124, 9) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x11 + 0x5c4dd124, 13) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x3 + 0x5c4dd124, 15) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x7 + 0x5c4dd124, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x0 + 0x5c4dd124, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x13 + 0x5c4dd124, 8) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x5 + 0x5c4dd124, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x10 + 0x5c4dd124, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x14 + 0x5c4dd124, 7) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x15 + 0x5c4dd124, 7) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x8 + 0x5c4dd124, 12) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f4(ee, aa, bb) + x12 + 0x5c4dd124, 7) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f4(dd, ee, aa) + x4 + 0x5c4dd124, 6) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f4(cc, dd, ee) + x9 + 0x5c4dd124, 15) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f4(bb, cc, dd) + x1 + 0x5c4dd124, 13) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f4(aa, bb, cc) + x2 + 0x5c4dd124, 11) + dd; + bb = _rotl32(bb, 10); + + t = b; + b = bb; + bb = t; + + // + // Rounds 32-47 + // + // left + d = _rotl32(d + _f3(e, a, b) + x3 + 0x6ed9eba1, 11) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x10 + 0x6ed9eba1, 13) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x14 + 0x6ed9eba1, 6) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x4 + 0x6ed9eba1, 7) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x9 + 0x6ed9eba1, 14) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x15 + 0x6ed9eba1, 9) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x8 + 0x6ed9eba1, 13) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x1 + 0x6ed9eba1, 15) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x2 + 0x6ed9eba1, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x7 + 0x6ed9eba1, 8) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x0 + 0x6ed9eba1, 13) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f3(d, e, a) + x6 + 0x6ed9eba1, 6) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f3(c, d, e) + x13 + 0x6ed9eba1, 5) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f3(b, c, d) + x11 + 0x6ed9eba1, 12) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f3(a, b, c) + x5 + 0x6ed9eba1, 7) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f3(e, a, b) + x12 + 0x6ed9eba1, 5) + c; + a = _rotl32(a, 10); + + // right + dd = _rotl32(dd + _f3(ee, aa, bb) + x15 + 0x6d703ef3, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x5 + 0x6d703ef3, 7) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x1 + 0x6d703ef3, 15) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x3 + 0x6d703ef3, 11) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x7 + 0x6d703ef3, 8) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x14 + 0x6d703ef3, 6) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x6 + 0x6d703ef3, 6) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x9 + 0x6d703ef3, 14) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x11 + 0x6d703ef3, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x8 + 0x6d703ef3, 13) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x12 + 0x6d703ef3, 5) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f3(dd, ee, aa) + x2 + 0x6d703ef3, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f3(cc, dd, ee) + x10 + 0x6d703ef3, 13) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f3(bb, cc, dd) + x0 + 0x6d703ef3, 13) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f3(aa, bb, cc) + x4 + 0x6d703ef3, 7) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f3(ee, aa, bb) + x13 + 0x6d703ef3, 5) + cc; + aa = _rotl32(aa, 10); + + t = c; + c = cc; + cc = t; + + // + // Rounds 48-63 + // + // left + c = _rotl32(c + _f4(d, e, a) + x1 + 0x8f1bbcdc, 11) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x9 + 0x8f1bbcdc, 12) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x11 + 0x8f1bbcdc, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x10 + 0x8f1bbcdc, 15) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x0 + 0x8f1bbcdc, 14) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x8 + 0x8f1bbcdc, 15) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x12 + 0x8f1bbcdc, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x4 + 0x8f1bbcdc, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x13 + 0x8f1bbcdc, 9) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x3 + 0x8f1bbcdc, 14) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x7 + 0x8f1bbcdc, 5) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f4(c, d, e) + x15 + 0x8f1bbcdc, 6) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f4(b, c, d) + x14 + 0x8f1bbcdc, 8) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f4(a, b, c) + x5 + 0x8f1bbcdc, 6) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f4(e, a, b) + x6 + 0x8f1bbcdc, 5) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f4(d, e, a) + x2 + 0x8f1bbcdc, 12) + b; + e = _rotl32(e, 10); + + // right + cc = _rotl32(cc + _f2(dd, ee, aa) + x8 + 0x7a6d76e9, 15) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x6 + 0x7a6d76e9, 5) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x4 + 0x7a6d76e9, 8) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x1 + 0x7a6d76e9, 11) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x3 + 0x7a6d76e9, 14) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x11 + 0x7a6d76e9, 14) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x15 + 0x7a6d76e9, 6) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x0 + 0x7a6d76e9, 14) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x5 + 0x7a6d76e9, 6) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x12 + 0x7a6d76e9, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x2 + 0x7a6d76e9, 12) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f2(cc, dd, ee) + x13 + 0x7a6d76e9, 9) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f2(bb, cc, dd) + x9 + 0x7a6d76e9, 12) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f2(aa, bb, cc) + x7 + 0x7a6d76e9, 5) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f2(ee, aa, bb) + x10 + 0x7a6d76e9, 15) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f2(dd, ee, aa) + x14 + 0x7a6d76e9, 8) + bb; + ee = _rotl32(ee, 10); + + t = d; + d = dd; + dd = t; + + // + // Rounds 64-79 + // + // left + b = _rotl32(b + _f5(c, d, e) + x4 + 0xa953fd4e, 9) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x0 + 0xa953fd4e, 15) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x5 + 0xa953fd4e, 5) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x9 + 0xa953fd4e, 11) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x7 + 0xa953fd4e, 6) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x12 + 0xa953fd4e, 8) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x2 + 0xa953fd4e, 13) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x10 + 0xa953fd4e, 12) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x14 + 0xa953fd4e, 5) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x1 + 0xa953fd4e, 12) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x3 + 0xa953fd4e, 13) + a; + d = _rotl32(d, 10); + a = _rotl32(a + _f5(b, c, d) + x8 + 0xa953fd4e, 14) + e; + c = _rotl32(c, 10); + e = _rotl32(e + _f5(a, b, c) + x11 + 0xa953fd4e, 11) + d; + b = _rotl32(b, 10); + d = _rotl32(d + _f5(e, a, b) + x6 + 0xa953fd4e, 8) + c; + a = _rotl32(a, 10); + c = _rotl32(c + _f5(d, e, a) + x15 + 0xa953fd4e, 5) + b; + e = _rotl32(e, 10); + b = _rotl32(b + _f5(c, d, e) + x13 + 0xa953fd4e, 6) + a; + d = _rotl32(d, 10); + + // right + bb = _rotl32(bb + _f1(cc, dd, ee) + x12, 8) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x15, 5) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x10, 12) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x4, 9) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x1, 12) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x5, 5) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x8, 14) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x7, 6) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x6, 8) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x2, 13) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x13, 6) + aa; + dd = _rotl32(dd, 10); + aa = _rotl32(aa + _f1(bb, cc, dd) + x14, 5) + ee; + cc = _rotl32(cc, 10); + ee = _rotl32(ee + _f1(aa, bb, cc) + x0, 15) + dd; + bb = _rotl32(bb, 10); + dd = _rotl32(dd + _f1(ee, aa, bb) + x3, 13) + cc; + aa = _rotl32(aa, 10); + cc = _rotl32(cc + _f1(dd, ee, aa) + x9, 11) + bb; + ee = _rotl32(ee, 10); + bb = _rotl32(bb + _f1(cc, dd, ee) + x11, 11) + aa; + dd = _rotl32(dd, 10); + + // + // do (e, ee) swap as part of assignment. + // + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += ee; + state[5] += aa; + state[6] += bb; + state[7] += cc; + state[8] += dd; + state[9] += e; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits, Endian.little); + bdata.setUint32(60, messageLengthInBits >>> 32, Endian.little); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + return Uint8List.view(state.buffer).sublist(0, hashLength); + } +} diff --git a/hashlib/lib/src/algorithms/scrypt/scrypt.dart b/hashlib/lib/src/algorithms/scrypt/scrypt.dart new file mode 100644 index 0000000..0f1d148 --- /dev/null +++ b/hashlib/lib/src/algorithms/scrypt/scrypt.dart @@ -0,0 +1,282 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/core/kdf_base.dart'; +import 'package:hashlib/src/pbkdf2.dart'; +import 'package:hashlib/src/random.dart'; + +import 'security.dart'; + +const int _mask32 = 0xFFFFFFFF; + +/// This is an implementation of Password Based Key Derivation Algorithm, +/// scrypt derived from [RFC-7914][rfc], which internally uses [PBKDF2]. +/// +/// The function derives one or more secret keys from a secret string. It is +/// based on memory-hard functions, which offer added protection against +/// attacks using custom hardware. +/// +/// The strength of the generated password using scrypt depends on the +/// CPU/Memory cost, block size and parallelism parameters. Poor parameter +/// choices can be harmful for security; for example, if you tune the +/// parameters so that memory use is reduced to small amounts that will affect +/// the properties of the algorithm. +/// +/// [rfc]: https://www.rfc-editor.org/rfc/rfc7914.html +class Scrypt extends KeyDerivatorBase { + @override + final String name = 'Scrypt'; + + /// The byte array containing salt + final List salt; + + /// CPU/Memory cost parameter (N) + final int cost; + + /// Block size parameter (r) + final int blockSize; + + /// Parallelization parameter (p) + final int parallelism; + + @override + final int derivedKeyLength; + + const Scrypt._({ + required this.salt, + required this.cost, + required this.blockSize, + required this.parallelism, + required this.derivedKeyLength, + }); + + /// Creates an [Scrypt] instance with a sink for MAC generation. + factory Scrypt({ + List? salt, + required int cost, + int blockSize = 8, + int parallelism = 1, + int derivedKeyLength = 64, + }) { + // validate parameters + if (cost < 1) { + throw StateError('The cost must be at least 1'); + } + if (cost > 0xFFFFFF) { + throw StateError('The cost must be less than 2^24'); + } + if (cost & (cost - 1) != 0) { + throw StateError('The cost must be a power of 2'); + } + if (derivedKeyLength < 1) { + throw StateError('The derivedKeyLength must be at least 1'); + } + if (blockSize < 1) { + throw StateError('The blockSize must be at least 1'); + } + if (parallelism < 1) { + throw StateError('The parallelism must be at least 1'); + } + if (blockSize * parallelism > 0x1FFFFFF) { + throw StateError('The blockSize * parallelism is too big'); + } + salt ??= randomBytes(16); + + // create instance + return Scrypt._( + salt: salt, + cost: cost, + blockSize: blockSize, + parallelism: parallelism, + derivedKeyLength: derivedKeyLength, + ); + } + + /// Creates an [Scrypt] instance from [ScryptSecurity] parameter. + factory Scrypt.fromSecurity( + ScryptSecurity security, { + List? salt, + int derivedKeyLength = 64, + }) { + return Scrypt( + salt: salt, + cost: security.N, + blockSize: security.r, + parallelism: security.p, + derivedKeyLength: derivedKeyLength, + ); + } + + /// Generate a derived key using the scrypt algorithm. + @override + HashDigest convert(List password) { + int N = cost; + int midRO = (blockSize << 4); + int roLength = (blockSize << 7); + int roLength32 = (roLength >>> 2); + int innerKeyLength = parallelism * roLength; + int innerKeyLength32 = parallelism * roLength32; + Uint32List inp = Uint32List(roLength32); + Uint32List out = Uint32List(roLength32); + Uint32List t = Uint32List(16); + Uint32List v; + + // Initialize the memory + List acc = List.filled(N, Uint32List(roLength32)); + for (int i = 1; i < N; ++i) { + acc[i] = Uint32List(roLength32); + } + + // Derive the inner blocks + var inner = pbkdf2(password, salt, 1, innerKeyLength).bytes; + var inner32 = Uint32List.view(inner.buffer); + + /// [length] = 128 * r = 2 * 64 * r = 4 * 32 * r bytes + @pragma('vm:prefer-inline') + void blockMix() { + int i, j, p, q; + p = 0; + q = midRO; + for (j = 0; j < 16; j++) { + t[j] = inp[roLength32 - 16 + j]; + } + for (i = 0; i < roLength32; i += 32) { + // even + for (j = 0; j < 16; j++) { + t[j] ^= inp[i + j]; + } + _salsa20(t); + for (j = 0; j < 16; j++, p++) { + out[p] = t[j]; + } + + // odd + for (j = 0; j < 16; j++) { + t[j] ^= inp[i + j + 16]; + } + _salsa20(t); + for (j = 0; j < 16; j++, q++) { + out[q] = t[j]; + } + } + } + + // Mix the inner blocks to derive the outer salt + for (int i, j, k = 0; k < innerKeyLength32; k += roLength32) { + /// Number of iterations, [N] is a power of 2 + /// length of [x] = 128 * r = 2 * 64 * r = 4 * 32 * r bytes + for (j = 0; j < roLength32; ++j) { + inp[j] = inner32[j + k]; + } + for (i = 0; i < N; ++i) { + v = acc[i]; + for (j = 0; j < roLength32; ++j) { + v[j] = inp[j]; + } + blockMix(); + // swap inp <-> out + v = inp; + inp = out; + out = v; + } + for (i = 0; i < N; ++i) { + v = acc[inp[roLength32 - 16] & (N - 1)]; + for (j = 0; j < roLength32; ++j) { + inp[j] ^= v[j]; + } + blockMix(); + // swap inp <-> out + v = inp; + inp = out; + out = v; + } + for (j = 0; j < roLength32; ++j) { + inner32[j + k] = inp[j]; + } + } + + // Derive final blocks with the outer salt + return pbkdf2(password, inner, 1, derivedKeyLength); + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + /// size of [b] = 4 * 16 = 64 bytes + static void _salsa20(Uint32List b) { + int i, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + + x0 = b[0]; + x1 = b[1]; + x2 = b[2]; + x3 = b[3]; + x4 = b[4]; + x5 = b[5]; + x6 = b[6]; + x7 = b[7]; + x8 = b[8]; + x9 = b[9]; + x10 = b[10]; + x11 = b[11]; + x12 = b[12]; + x13 = b[13]; + x14 = b[14]; + x15 = b[15]; + + for (i = 8; i > 0; i -= 2) { + x4 ^= _rotl32(x0 + x12, 7); + x8 ^= _rotl32(x4 + x0, 9); + x12 ^= _rotl32(x8 + x4, 13); + x0 ^= _rotl32(x12 + x8, 18); + x9 ^= _rotl32(x5 + x1, 7); + x13 ^= _rotl32(x9 + x5, 9); + x1 ^= _rotl32(x13 + x9, 13); + x5 ^= _rotl32(x1 + x13, 18); + x14 ^= _rotl32(x10 + x6, 7); + x2 ^= _rotl32(x14 + x10, 9); + x6 ^= _rotl32(x2 + x14, 13); + x10 ^= _rotl32(x6 + x2, 18); + x3 ^= _rotl32(x15 + x11, 7); + x7 ^= _rotl32(x3 + x15, 9); + x11 ^= _rotl32(x7 + x3, 13); + x15 ^= _rotl32(x11 + x7, 18); + x1 ^= _rotl32(x0 + x3, 7); + x2 ^= _rotl32(x1 + x0, 9); + x3 ^= _rotl32(x2 + x1, 13); + x0 ^= _rotl32(x3 + x2, 18); + x6 ^= _rotl32(x5 + x4, 7); + x7 ^= _rotl32(x6 + x5, 9); + x4 ^= _rotl32(x7 + x6, 13); + x5 ^= _rotl32(x4 + x7, 18); + x11 ^= _rotl32(x10 + x9, 7); + x8 ^= _rotl32(x11 + x10, 9); + x9 ^= _rotl32(x8 + x11, 13); + x10 ^= _rotl32(x9 + x8, 18); + x12 ^= _rotl32(x15 + x14, 7); + x13 ^= _rotl32(x12 + x15, 9); + x14 ^= _rotl32(x13 + x12, 13); + x15 ^= _rotl32(x14 + x13, 18); + } + + b[0] += x0; + b[1] += x1; + b[2] += x2; + b[3] += x3; + b[4] += x4; + b[5] += x5; + b[6] += x6; + b[7] += x7; + b[8] += x8; + b[9] += x9; + b[10] += x10; + b[11] += x11; + b[12] += x12; + b[13] += x13; + b[14] += x14; + b[15] += x15; + } +} diff --git a/hashlib/lib/src/algorithms/scrypt/security.dart b/hashlib/lib/src/algorithms/scrypt/security.dart new file mode 100644 index 0000000..35f1e9f --- /dev/null +++ b/hashlib/lib/src/algorithms/scrypt/security.dart @@ -0,0 +1,95 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'scrypt.dart'; + +/// This contains some recommended values of memory, iteration and parallelism +/// values for [Scrypt] algorithm. +/// +/// It is best to try out different combinations of these values to achieve the +/// desired runtime on a target machine. +class ScryptSecurity { + final String name; + + /// The size of a single block in bytes + final int r; + + /// The CPU/Memory cost parameter as a power of 2. 1 < [N] < 2^32 + final int N; + + /// The parallelization parameter. [p] <= (2^32 - 1) / (128 * [r]) + final int p; + + const ScryptSecurity( + this.name, { + required this.N, + required this.r, + required this.p, + }); + + /// Provides a very low security. Use it only for test purposes. + /// + /// It uses cost of 16, block size of 2 and parallelism of 1. + /// + /// **WARNING: Not recommended for general use.** + static const test = ScryptSecurity('test', N: 1 << 4, r: 2, p: 1); + + /// Provides low security. Can be used on low-end devices. + /// + /// It uses cost of 256, block size of 4 and parallelism of 2. + /// + /// **WARNING: Not recommended for general use.** + static const little = ScryptSecurity('little', N: 1 << 8, r: 4, p: 2); + + /// Provides moderate security. + /// + /// It uses cost of 2^10, block size of 8 and parallelism of 3. + static const moderate = ScryptSecurity('moderate', N: 1 << 10, r: 8, p: 3); + + /// Provides good security. The default parameters from [RFC-7914][rfc] + /// + /// It uses cost of 2^14, block size of 8 and parallelism of 1. + /// + /// [rfc]: https://www.ietf.org/rfc/rfc7914.html + static const good = ScryptSecurity('good', N: 1 << 14, r: 8, p: 1); + + /// Provides strong security. + /// + /// It uses cost of 2^18, block size of 16 and parallelism of 2. + static const strong = ScryptSecurity('strong', N: 1 << 18, r: 8, p: 2); + + /// Provides strong security recommended by [OWASP][link]. + /// + /// It uses cost of 2^17, block size of 8 and parallelism of 1. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp = ScryptSecurity('owasp1', N: 1 << 17, r: 8, p: 1); + + /// The second recommendation by [OWASP][link]. + /// + /// It uses cost of 2^16, block size of 8 and parallelism of 2. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp2 = ScryptSecurity('owasp2', N: 1 << 16, r: 8, p: 2); + + /// The third recommendation by [OWASP][link]. + /// + /// It uses cost of 2^15, block size of 8 and parallelism of 3. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp3 = ScryptSecurity('owasp3', N: 1 << 15, r: 8, p: 3); + + /// The fourth recommendation by [OWASP][link]. + /// + /// It uses cost of 2^14, block size of 8 and parallelism of 5. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp4 = ScryptSecurity('owasp4', N: 1 << 14, r: 8, p: 5); + + /// The fifth recommendation by [OWASP][link]. + /// + /// It uses cost of 2^13, block size of 8 and parallelism of 10. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html + static const owasp5 = ScryptSecurity('owasp5', N: 1 << 13, r: 8, p: 10); +} diff --git a/hashlib/lib/src/algorithms/sha1.dart b/hashlib/lib/src/algorithms/sha1.dart new file mode 100644 index 0000000..3244c1a --- /dev/null +++ b/hashlib/lib/src/algorithms/sha1.dart @@ -0,0 +1,163 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x67452301, // a + 0xEFCDAB89, // b + 0x98BADCFE, // c + 0x10325476, // d + 0xC3D2E1F0, // e +]; + +/// This implementation is derived from The Internet Society +/// [US Secure Hash Algorithm 1 (SHA1)][rfc3174]. +/// +/// [rfc3174]: https://www.ietf.org/rfc/rfc3174.html +class SHA1Hash extends BlockHashSink { + final Uint32List state; + final Uint32List chunk; + + @override + final int hashLength; + + SHA1Hash() + : chunk = Uint32List(80), + hashLength = 160 >>> 3, + state = Uint32List.fromList(_iv), + super(512 >>> 3); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $update(List block, [int offset = 0, bool last = false]) { + var w = chunk; + + int a, b, c, d, e; + int t, x, ch, i, j; + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + + // Convert the block to chunk + i = 0; + j = offset; + for (; i < 16; i++, j += 4) { + w[i] = ((block[j] & 0xFF) << 24) | + ((block[j + 1] & 0xFF) << 16) | + ((block[j + 2] & 0xFF) << 8) | + (block[j + 3] & 0xFF); + } + + // Extend the first 16 words into the remaining 64 words + for (i = 16; i < 80; i++) { + x = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + w[i] = (x << 1) | ((x & _mask32) >>> 31); + } + + for (i = 0; i < 20; i++) { + ch = (b & c) | ((~b) & d); + t = ((a << 5) & _mask32) | (a >>> 27); + x = t + ch + e + w[i] + 0x5A827999; + e = d; + d = c; + c = ((b << 30) & _mask32) | (b >>> 2); + b = a; + a = x & _mask32; + } + + for (; i < 40; i++) { + ch = (b ^ c ^ d); + t = ((a << 5) & _mask32) | (a >>> 27); + x = t + ch + e + w[i] + 0x6ED9EBA1; + e = d; + d = c; + c = ((b << 30) & _mask32) | (b >>> 2); + b = a; + a = x & _mask32; + } + + for (; i < 60; i++) { + ch = ((b & c) | (b & d) | (c & d)); + t = ((a << 5) & _mask32) | (a >>> 27); + x = t + ch + e + w[i] + 0x8F1BBCDC; + e = d; + d = c; + c = ((b << 30) & _mask32) | (b >>> 2); + b = a; + a = x & _mask32; + } + + for (; i < 80; i++) { + ch = (b ^ c ^ d); + t = ((a << 5) & _mask32) | (a >>> 27); + x = t + ch + e + w[i] + 0xCA62C1D6; + e = d; + d = c; + c = ((b << 30) & _mask32) | (b >>> 2); + b = a; + a = x & _mask32; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(buffer); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + int n = messageLengthInBits; + buffer[56] = n >>> 56; + buffer[57] = n >>> 48; + buffer[58] = n >>> 40; + buffer[59] = n >>> 32; + buffer[60] = n >>> 24; + buffer[61] = n >>> 16; + buffer[62] = n >>> 8; + buffer[63] = n; + + // Update with the final block + $update(buffer); + + // Convert the state to 8-bit byte array + var bytes = Uint8List(hashLength); + for (int j = 0, i = 0; j < hashLength; i++, j += 4) { + bytes[j] = state[i] >>> 24; + bytes[j + 1] = state[i] >>> 16; + bytes[j + 2] = state[i] >>> 8; + bytes[j + 3] = state[i]; + } + return bytes; + } +} diff --git a/hashlib/lib/src/algorithms/sha2/sha2.dart b/hashlib/lib/src/algorithms/sha2/sha2.dart new file mode 100644 index 0000000..c843d12 --- /dev/null +++ b/hashlib/lib/src/algorithms/sha2/sha2.dart @@ -0,0 +1,113 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'sha2_1024_64bit.dart' if (dart.library.js) 'sha2_1024_32bit.dart'; +import 'sha2_512.dart'; + +/// Implementation of 224-bit hash generator based on 512-bit SHA2. +class SHA224Hash extends SHA2of512 { + SHA224Hash() + : super( + hashLength: 224 >>> 3, + seed: [ + 0xC1059ED8, // a + 0x367CD507, // b + 0x3070DD17, // c + 0xF70E5939, // d + 0xFFC00B31, // e + 0x68581511, // f + 0x64F98FA7, // g + 0xBEFA4FA4, // h + ], + ); +} + +/// Implementation of 256-bit hash generator based on 512-bit SHA2. +class SHA256Hash extends SHA2of512 { + SHA256Hash() + : super( + hashLength: 256 >>> 3, + seed: [ + 0x6A09E667, // a + 0xBB67AE85, // b + 0x3C6EF372, // c + 0xA54FF53A, // d + 0x510E527F, // e + 0x9B05688C, // f + 0x1F83D9AB, // g + 0x5BE0CD19, // h + ], + ); +} + +/// Implementation of 384-bit hash generator based on 1024-bit SHA2. +class SHA384Hash extends SHA2of1024 { + SHA384Hash() + : super( + hashLength: 384 >>> 3, + seed: [ + 0xCBBB9D5D, 0xC1059ED8, // a + 0x629A292A, 0x367CD507, // b + 0x9159015A, 0x3070DD17, // c + 0x152FECD8, 0xF70E5939, // d + 0x67332667, 0xFFC00B31, // e + 0x8EB44A87, 0x68581511, // f + 0xDB0C2E0D, 0x64F98FA7, // g + 0x47B5481D, 0xBEFA4FA4, // h + ], + ); +} + +/// Implementation of 512-bit hash generator based on 1024-bit SHA2. +class SHA512Hash extends SHA2of1024 { + SHA512Hash() + : super( + hashLength: 512 >>> 3, + seed: [ + 0x6A09E667, 0xF3BCC908, // a + 0xBB67AE85, 0x84CAA73B, // b + 0x3C6EF372, 0xFE94F82B, // c + 0xA54FF53A, 0x5F1D36F1, // d + 0x510E527F, 0xADE682D1, // e + 0x9B05688C, 0x2B3E6C1F, // f + 0x1F83D9AB, 0xFB41BD6B, // g + 0x5BE0CD19, 0x137E2179, // h + ], + ); +} + +/// Implementation of 224-bit hash generator based on 1024-bit SHA2. +class SHA512t224Hash extends SHA2of1024 { + SHA512t224Hash() + : super( + hashLength: 224 >>> 3, + seed: [ + 0x8C3D37C8, 0x19544DA2, // a + 0x73E19966, 0x89DCD4D6, // b + 0x1DFAB7AE, 0x32FF9C82, // c + 0x679DD514, 0x582F9FCF, // d + 0x0F6D2B69, 0x7BD44DA8, // e + 0x77E36F73, 0x04C48942, // f + 0x3F9D85A8, 0x6A1D36C8, // g + 0x1112E6AD, 0x91D692A1, // h + ], + ); +} + +/// Implementation of 256-bit hash generator based on 1024-bit SHA2. +class SHA512t256Hash extends SHA2of1024 { + SHA512t256Hash() + : super( + hashLength: 256 >>> 3, + seed: [ + 0x22312194, 0xFC2BF72C, // a + 0x9F555FA3, 0xC84C64C2, // b + 0x2393B86B, 0x6F53B151, // c + 0x96387719, 0x5940EABD, // d + 0x96283EE2, 0xA88EFFE3, // e + 0xBE5E1E25, 0x53863992, // f + 0x2B0199FC, 0x2C85B8AA, // g + 0x0EB72DDC, 0x81C52CA2, // h + ], + ); +} diff --git a/hashlib/lib/src/algorithms/sha2/sha2_1024_32bit.dart b/hashlib/lib/src/algorithms/sha2/sha2_1024_32bit.dart new file mode 100644 index 0000000..6d1861b --- /dev/null +++ b/hashlib/lib/src/algorithms/sha2/sha2_1024_32bit.dart @@ -0,0 +1,305 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +// Initialize array of round 64-bit constants +const List _k = [ + 0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD, 0xB5C0FBCF, 0xEC4D3B2F, // + 0xE9B5DBA5, 0x8189DBBC, 0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019, + 0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118, 0xD807AA98, 0xA3030242, + 0x12835B01, 0x45706FBE, 0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2, + 0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1, 0x9BDC06A7, 0x25C71235, + 0xC19BF174, 0xCF692694, 0xE49B69C1, 0x9EF14AD2, 0xEFBE4786, 0x384F25E3, + 0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65, 0x2DE92C6F, 0x592B0275, + 0x4A7484AA, 0x6EA6E483, 0x5CB0A9DC, 0xBD41FBD4, 0x76F988DA, 0x831153B5, + 0x983E5152, 0xEE66DFAB, 0xA831C66D, 0x2DB43210, 0xB00327C8, 0x98FB213F, + 0xBF597FC7, 0xBEEF0EE4, 0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725, + 0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70, 0x27B70A85, 0x46D22FFC, + 0x2E1B2138, 0x5C26C926, 0x4D2C6DFC, 0x5AC42AED, 0x53380D13, 0x9D95B3DF, + 0x650A7354, 0x8BAF63DE, 0x766A0ABB, 0x3C77B2A8, 0x81C2C92E, 0x47EDAEE6, + 0x92722C85, 0x1482353B, 0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001, + 0xC24B8B70, 0xD0F89791, 0xC76C51A3, 0x0654BE30, 0xD192E819, 0xD6EF5218, + 0xD6990624, 0x5565A910, 0xF40E3585, 0x5771202A, 0x106AA070, 0x32BBD1B8, + 0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53, 0x2748774C, 0xDF8EEB99, + 0x34B0BCB5, 0xE19B48A8, 0x391C0CB3, 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB, + 0x5B9CCA4F, 0x7763E373, 0x682E6FF3, 0xD6B2B8A3, 0x748F82EE, 0x5DEFB2FC, + 0x78A5636F, 0x43172F60, 0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC, + 0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9, 0xBEF9A3F7, 0xB2C67915, + 0xC67178F2, 0xE372532B, 0xCA273ECE, 0xEA26619C, 0xD186B8C7, 0x21C0C207, + 0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F, 0xEE6ED178, 0x06F067AA, 0x72176FBA, + 0x0A637DC5, 0xA2C898A6, 0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B, + 0x28DB77F5, 0x23047D84, 0x32CAAB7B, 0x40C72493, 0x3C9EBE0A, 0x15C9BEBC, + 0x431D67C4, 0x9C100D4C, 0x4CC5D4BE, 0xCB3E42B6, 0x597F299C, 0xFC657E2A, + 0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817, +]; + +const int _sig1 = 0; +const int _sig2 = _sig1 + 2; +const int _sig3 = _sig2 + 2; +const int _sig4 = _sig3 + 2; +const int _a = _sig4 + 2; +const int _b = _a + 2; +const int _c = _b + 2; +const int _d = _c + 2; +const int _e = _d + 2; +const int _f = _e + 2; +const int _g = _f + 2; +const int _h = _g + 2; +const int _t1 = _h + 2; +const int _t2 = _t1 + 2; +const int _t3 = _t2 + 2; +const int _t4 = _t3 + 2; +const int _t5 = _t4 + 2; + +/// Implementation is derived from [RFC6234][rfc6234] which follows the +/// [FIPS 180-4][fips180] standard for SHA and SHA-based HMAC and HKDF. +/// +/// It uses 32-bit integers to accommodate 64-bit integer operations, designed +/// specially to be supported by Web VM. It is albeit slower than the native +/// implementation. +/// +/// [rfc6234]: https://www.ietf.org/rfc/rfc6234.html +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +class SHA2of1024 extends BlockHashSink { + final List seed; + final Uint32List state; + final Uint32List chunk; + final _var = Uint32List(_t5 + 2); + + @override + final int hashLength; + + /// For internal use only. + SHA2of1024({ + required this.seed, + required this.hashLength, + }) : chunk = Uint32List(160), + state = Uint32List.fromList(seed), + super(1024 >>> 3); + + @override + void reset() { + state.setAll(0, seed); + super.reset(); + } + + /// z = x ^ y + static void _xor(List x, int i, List y, int j, List z, int k) { + z[k] = x[i] ^ y[j]; + z[k + 1] = x[i + 1] ^ y[j + 1]; + } + + /// z = x + y + static void _add(List x, int i, List y, int j, List z, int k) { + z[k + 1] = x[i + 1] + y[j + 1]; + z[k] = x[i] + y[j] + (z[k + 1] < x[i + 1] ? 1 : 0); + } + + /// x += z + static void _addAndSet(List x, int i, List z, int j) { + var t = x[i + 1]; + x[i + 1] += z[j + 1]; + x[i] += z[j] + (x[i + 1] < t ? 1 : 0); + } + + // x >>> n + static void _shr(int n, List x, int i, List z, int k) { + var a = x[i]; + var b = x[i + 1]; + if (n == 32) { + z[k] = 0; + z[k + 1] = a; + } else if (n < 32) { + z[k] = a >>> n; + z[k + 1] = (a << (32 - n)) | (b >>> n); + } else { + z[k] = 0; + z[k + 1] = a >>> (n - 32); + } + } + + // (x << (64 - n)) | (x >>> n) + static void _rotr(int n, List x, int i, List z, int k) { + var a = x[i]; + var b = x[i + 1]; + if (n == 32) { + z[k] = b; + z[k + 1] = a; + } else if (n < 32) { + z[k] = (b << (32 - n)) | (a >>> n); + z[k + 1] = (a << (32 - n)) | (b >>> n); + } else { + z[k] = (a << (64 - n)) | (b >>> (n - 32)); + z[k + 1] = (b << (64 - n)) | (a >>> (n - 32)); + } + } + + // z = _rotr(x, 28) ^ _rotr(x, 34) ^ _rotr(x, 39) + void _bsig0(List x, int i, List z, int j) { + _rotr(28, x, i, _var, _sig1); + _rotr(34, x, i, _var, _sig2); + _rotr(39, x, i, _var, _sig3); + _xor(_var, _sig2, _var, _sig3, _var, _sig4); + _xor(_var, _sig1, _var, _sig4, z, j); + } + + // z = _rotr(x, 14) ^ _rotr(x, 18) ^ _rotr(x, 41) + void _bsig1(List x, int i, List z, int j) { + _rotr(14, x, i, _var, _sig1); + _rotr(18, x, i, _var, _sig2); + _rotr(41, x, i, _var, _sig3); + _xor(_var, _sig2, _var, _sig3, _var, _sig4); + _xor(_var, _sig1, _var, _sig4, z, j); + } + + // z = _rotr(x, 1) ^ _rotr(x, 8) ^ (x >>> 7) + void _ssig0(List x, int i, List z, int j) { + _rotr(1, x, i, _var, _sig1); + _rotr(8, x, i, _var, _sig2); + _shr(7, x, i, _var, _sig3); + _xor(_var, _sig2, _var, _sig3, _var, _sig4); + _xor(_var, _sig1, _var, _sig4, z, j); + } + + // z = _rotr(x, 19) ^ _rotr(x, 61) ^ (x >>> 6) + void _ssig1(List x, int i, List z, int j) { + _rotr(19, x, i, _var, _sig1); + _rotr(61, x, i, _var, _sig2); + _shr(6, x, i, _var, _sig3); + _xor(_var, _sig2, _var, _sig3, _var, _sig4); + _xor(_var, _sig1, _var, _sig4, z, j); + } + + // z = (e & f) ^ ((~e) & g) + static void _ch(List e, int i, List f, int j, List g, int k, + List z, int l) { + z[l] = (e[i] & (f[j] ^ g[k])) ^ g[k]; + z[l + 1] = (e[i + 1] & (f[j + 1] ^ g[k + 1])) ^ g[k + 1]; + } + + // z = (a & b) ^ (a & c) ^ (b & c) + static void _maj(List a, int i, List b, int j, List c, int k, + List z, int l) { + z[l] = (a[i] & (b[j] | c[k])) | (b[j] & c[k]); + z[l + 1] = (a[i + 1] & (b[j + 1] | c[k + 1])) | (b[j + 1] & c[k + 1]); + } + + @override + void $update(List block, [int offset = 0, bool last = false]) { + var w = chunk; + + _var.setAll(_a, state); + + // Convert the block to chunk + for (int i = 0, j = offset; i < 32; i++, j += 4) { + w[i] = ((block[j] & 0xFF) << 24) | + ((block[j + 1] & 0xFF) << 16) | + ((block[j + 2] & 0xFF) << 8) | + ((block[j + 3] & 0xFF)); + } + + // Extend the first 32 words into nest 160 words + for (var i = 32; i < 160; i += 2) { + // w[i] = _ssig1(w[i - 2]) + w[i - 7] + _ssig0(w[i - 15]) + w[i - 16]; + _ssig1(w, i - 4, _var, _t1); + _add(_var, _t1, w, i - 14, _var, _t2); + _ssig0(w, i - 30, _var, _t1); + _add(_var, _t1, w, i - 32, _var, _t3); + _add(_var, _t2, _var, _t3, w, i); + } + + for (int i = 0; i < 160; i += 2) { + // t1 = h + _bsig1(e) + _ch(e, f, g) + k[i] + w[i]; + _bsig1(_var, _e, _var, _t1); + _add(_var, _h, _var, _t1, _var, _t2); + _ch(_var, _e, _var, _f, _var, _g, _var, _t3); + _add(_var, _t2, _var, _t3, _var, _t4); + _add(_k, i, w, i, _var, _t5); + _add(_var, _t4, _var, _t5, _var, _t1); + + // t2 = _bsig0(A) + _maj(a, b, c); + _bsig0(_var, _a, _var, _t3); + _maj(_var, _a, _var, _b, _var, _c, _var, _t4); + _add(_var, _t3, _var, _t4, _var, _t2); + + // h = g; + _var[_h] = _var[_g]; + _var[_h + 1] = _var[_g + 1]; + // g = f; + _var[_g] = _var[_f]; + _var[_g + 1] = _var[_f + 1]; + // f = e; + _var[_f] = _var[_e]; + _var[_f + 1] = _var[_e + 1]; + // e = d + t1; + _add(_var, _d, _var, _t1, _var, _e); + // d = c; + _var[_d] = _var[_c]; + _var[_d + 1] = _var[_c + 1]; + // c = b; + _var[_c] = _var[_b]; + _var[_c + 1] = _var[_b + 1]; + // b = a; + _var[_b] = _var[_a]; + _var[_b + 1] = _var[_a + 1]; + // a = t1 + t2; + _add(_var, _t1, _var, _t2, _var, _a); + } + + _addAndSet(state, 0, _var, _a); + _addAndSet(state, 2, _var, _b); + _addAndSet(state, 4, _var, _c); + _addAndSet(state, 6, _var, _d); + _addAndSet(state, 8, _var, _e); + _addAndSet(state, 10, _var, _f); + _addAndSet(state, 12, _var, _g); + _addAndSet(state, 14, _var, _h); + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 112) { + for (; pos < 128; pos++) { + buffer[pos] = 0; + } + $update(buffer); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 120; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + int n = messageLengthInBits; + buffer[120] = n >>> 56; + buffer[121] = n >>> 48; + buffer[122] = n >>> 40; + buffer[123] = n >>> 32; + buffer[124] = n >>> 24; + buffer[125] = n >>> 16; + buffer[126] = n >>> 8; + buffer[127] = n; + + // Update with the final block + $update(buffer); + + // Convert the state to 8-bit byte array + var bytes = Uint8List(hashLength); + for (int j = 0, i = 0; j < hashLength; i++, j += 4) { + bytes[j] = state[i] >>> 24; + bytes[j + 1] = state[i] >>> 16; + bytes[j + 2] = state[i] >>> 8; + bytes[j + 3] = state[i]; + } + return bytes; + } +} diff --git a/hashlib/lib/src/algorithms/sha2/sha2_1024_64bit.dart b/hashlib/lib/src/algorithms/sha2/sha2_1024_64bit.dart new file mode 100644 index 0000000..383f6f7 --- /dev/null +++ b/hashlib/lib/src/algorithms/sha2/sha2_1024_64bit.dart @@ -0,0 +1,208 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +// Initialize array of round 64-bit constants +const List _k = [ + 0x428A2F98D728AE22, 0x7137449123EF65CD, 0xB5C0FBCFEC4D3B2F, // + 0xE9B5DBA58189DBBC, 0x3956C25BF348B538, 0x59F111F1B605D019, + 0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118, 0xD807AA98A3030242, + 0x12835B0145706FBE, 0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2, + 0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1, 0x9BDC06A725C71235, + 0xC19BF174CF692694, 0xE49B69C19EF14AD2, 0xEFBE4786384F25E3, + 0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65, 0x2DE92C6F592B0275, + 0x4A7484AA6EA6E483, 0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5, + 0x983E5152EE66DFAB, 0xA831C66D2DB43210, 0xB00327C898FB213F, + 0xBF597FC7BEEF0EE4, 0xC6E00BF33DA88FC2, 0xD5A79147930AA725, + 0x06CA6351E003826F, 0x142929670A0E6E70, 0x27B70A8546D22FFC, + 0x2E1B21385C26C926, 0x4D2C6DFC5AC42AED, 0x53380D139D95B3DF, + 0x650A73548BAF63DE, 0x766A0ABB3C77B2A8, 0x81C2C92E47EDAEE6, + 0x92722C851482353B, 0xA2BFE8A14CF10364, 0xA81A664BBC423001, + 0xC24B8B70D0F89791, 0xC76C51A30654BE30, 0xD192E819D6EF5218, + 0xD69906245565A910, 0xF40E35855771202A, 0x106AA07032BBD1B8, + 0x19A4C116B8D2D0C8, 0x1E376C085141AB53, 0x2748774CDF8EEB99, + 0x34B0BCB5E19B48A8, 0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB, + 0x5B9CCA4F7763E373, 0x682E6FF3D6B2B8A3, 0x748F82EE5DEFB2FC, + 0x78A5636F43172F60, 0x84C87814A1F0AB72, 0x8CC702081A6439EC, + 0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9, 0xBEF9A3F7B2C67915, + 0xC67178F2E372532B, 0xCA273ECEEA26619C, 0xD186B8C721C0C207, + 0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178, 0x06F067AA72176FBA, + 0x0A637DC5A2C898A6, 0x113F9804BEF90DAE, 0x1B710B35131C471B, + 0x28DB77F523047D84, 0x32CAAB7B40C72493, 0x3C9EBE0A15C9BEBC, + 0x431D67C49C100D4C, 0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A, + 0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817, +]; + +/// Implementation is derived from [RFC6234][rfc6234] which follows the +/// [FIPS 180-4][fips180] standard for SHA and SHA-based HMAC and HKDF. +/// +/// It uses 64-bit integer operations internally which is not supported by +/// Web VM, but a lot faster. +/// +/// [rfc6234]: https://www.ietf.org/rfc/rfc6234.html +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +class SHA2of1024 extends BlockHashSink { + final List seed; + final Uint32List state; + final Uint64List chunk; + + @override + final int hashLength; + + /// For internal use only. + SHA2of1024({ + required this.seed, + required this.hashLength, + }) : chunk = Uint64List(80), + state = Uint32List.fromList(seed), + super(1024 >>> 3); + + @override + void reset() { + state.setAll(0, seed); + super.reset(); + } + + /// Rotates 64-bit number x by n bits + @pragma('vm:prefer-inline') + static int _bsig0(int x) => + ((x >>> 28) | (x << 36)) ^ + ((x >>> 34) | (x << 30)) ^ + ((x >>> 39) | (x << 25)); + + @pragma('vm:prefer-inline') + static int _bsig1(int x) => + ((x >>> 14) | (x << 50)) ^ + ((x >>> 18) | (x << 46)) ^ + ((x >>> 41) | (x << 23)); + + @pragma('vm:prefer-inline') + static int _ssig0(int x) => + ((x >>> 1) | (x << 63)) ^ ((x >>> 8) | (x << 56)) ^ (x >>> 7); + + @pragma('vm:prefer-inline') + static int _ssig1(int x) => + ((x >>> 19) | (x << 45)) ^ ((x >>> 61) | (x << 3)) ^ (x >>> 6); + + @override + void $update(List block, [int offset = 0, bool last = false]) { + // Convert the block to chunk + for (int i = 0, j = offset; i < 16; i++, j += 8) { + chunk[i] = ((block[j] & 0xFF) << 56) | + ((block[j + 1] & 0xFF) << 48) | + ((block[j + 2] & 0xFF) << 40) | + ((block[j + 3] & 0xFF) << 32) | + ((block[j + 4] & 0xFF) << 24) | + ((block[j + 5] & 0xFF) << 16) | + ((block[j + 6] & 0xFF) << 8) | + (block[j + 7] & 0xFF); + } + + var w = chunk; + int t1, t2, ch, maj; + int a, b, c, d, e, f, g, h; + int ta, tb, tc, td, te, tf, tg, th; + + ta = a = (state[0] << 32) | (state[1]); + tb = b = (state[2] << 32) | (state[3]); + tc = c = (state[4] << 32) | (state[5]); + td = d = (state[6] << 32) | (state[7]); + te = e = (state[8] << 32) | (state[9]); + tf = f = (state[10] << 32) | (state[11]); + tg = g = (state[12] << 32) | (state[13]); + th = h = (state[14] << 32) | (state[15]); + + // Extend the first 16 words into the 80 words (64-bit) + for (int i = 16; i < 80; i++) { + w[i] = _ssig1(w[i - 2]) + w[i - 7] + _ssig0(w[i - 15]) + w[i - 16]; + } + + for (int i = 0; i < 80; ++i) { + ch = (e & f) ^ ((~e) & g); + maj = (a & b) ^ (a & c) ^ (b & c); + t1 = h + _bsig1(e) + ch + _k[i] + w[i]; + t2 = _bsig0(a) + maj; + + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + } + + ta += a; + tb += b; + tc += c; + td += d; + te += e; + tf += f; + tg += g; + th += h; + state[0] = ta >>> 32; + state[1] = ta; + state[2] = tb >>> 32; + state[3] = tb; + state[4] = tc >>> 32; + state[5] = tc; + state[6] = td >>> 32; + state[7] = td; + state[8] = te >>> 32; + state[9] = te; + state[10] = tf >>> 32; + state[11] = tf; + state[12] = tg >>> 32; + state[13] = tg; + state[14] = th >>> 32; + state[15] = th; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 112) { + for (; pos < 128; pos++) { + buffer[pos] = 0; + } + $update(buffer); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 120; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + int n = messageLengthInBits; + buffer[120] = n >>> 56; + buffer[121] = n >>> 48; + buffer[122] = n >>> 40; + buffer[123] = n >>> 32; + buffer[124] = n >>> 24; + buffer[125] = n >>> 16; + buffer[126] = n >>> 8; + buffer[127] = n; + + // Update with the final block + $update(buffer); + + // Convert the state to 8-bit byte array + var bytes = Uint8List(hashLength); + for (int j = 0, i = 0; j < hashLength; i++, j += 4) { + bytes[j] = state[i] >>> 24; + bytes[j + 1] = state[i] >>> 16; + bytes[j + 2] = state[i] >>> 8; + bytes[j + 3] = state[i]; + } + return bytes; + } +} diff --git a/hashlib/lib/src/algorithms/sha2/sha2_512.dart b/hashlib/lib/src/algorithms/sha2/sha2_512.dart new file mode 100644 index 0000000..1109da3 --- /dev/null +++ b/hashlib/lib/src/algorithms/sha2/sha2_512.dart @@ -0,0 +1,179 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +// Initialize array of round constants +const List _k = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, // + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, +]; + +/// Implementation is derived from [RFC6234][rfc6234] which follows the +/// [FIPS 180-4][fips180] standard for SHA and SHA-based HMAC and HKDF. +/// +/// [rfc6234]: https://www.ietf.org/rfc/rfc6234.html +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +class SHA2of512 extends BlockHashSink { + final List seed; + final Uint32List state; + final Uint32List chunk; + + @override + final int hashLength; + + /// For internal use only. + SHA2of512({ + required this.seed, + required this.hashLength, + }) : chunk = Uint32List(64), + state = Uint32List.fromList(seed), + super(64); + + @override + void reset() { + state.setAll(0, seed); + super.reset(); + } + + /// Rotates x right by n bits. + @pragma('vm:prefer-inline') + static int _bsig0(int x) => + (((x & _mask32) >>> 2) | ((x << 30) & _mask32)) ^ + (((x & _mask32) >>> 13) | ((x << 19) & _mask32)) ^ + (((x & _mask32) >>> 22) | ((x << 10) & _mask32)); + + @pragma('vm:prefer-inline') + static int _bsig1(int x) => + (((x & _mask32) >>> 6) | ((x << 26) & _mask32)) ^ + (((x & _mask32) >>> 11) | ((x << 21) & _mask32)) ^ + (((x & _mask32) >>> 25) | ((x << 7) & _mask32)); + + @pragma('vm:prefer-inline') + static int _ssig0(int x) => + (((x & _mask32) >>> 7) | ((x << 25) & _mask32)) ^ + (((x & _mask32) >>> 18) | ((x << 14) & _mask32)) ^ + (x >>> 3); + + @pragma('vm:prefer-inline') + static int _ssig1(int x) => + (((x & _mask32) >>> 17) | ((x << 15) & _mask32)) ^ + (((x & _mask32) >>> 19) | ((x << 13) & _mask32)) ^ + (x >>> 10); + + @override + void $update(List block, [int offset = 0, bool last = false]) { + // Convert the block to chunk + for (int i = 0, j = offset; i < 16; i++, j += 4) { + chunk[i] = ((block[j] & 0xFF) << 24) | + ((block[j + 1] & 0xFF) << 16) | + ((block[j + 2] & 0xFF) << 8) | + (block[j + 3] & 0xFF); + } + + var w = chunk; + int t1, t2, ch, maj; + int a, b, c, d, e, f, g, h; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + // Extend the first 16 words into the 64 words + for (int i = 16; i < 64; i++) { + w[i] = _ssig1(w[i - 2]) + w[i - 7] + _ssig0(w[i - 15]) + w[i - 16]; + } + + for (int i = 0; i < 64; ++i) { + ch = (e & f) ^ ((~e) & g); + maj = (a & b) ^ (a & c) ^ (b & c); + t1 = h + _bsig1(e) + ch + _k[i] + w[i]; + t2 = _bsig0(a) + maj; + + h = g; + g = f; + f = e; + e = (d + t1) & _mask32; + d = c; + c = b; + b = a; + a = (t1 + t2) & _mask32; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(buffer); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + int n = messageLengthInBits; + buffer[56] = n >>> 56; + buffer[57] = n >>> 48; + buffer[58] = n >>> 40; + buffer[59] = n >>> 32; + buffer[60] = n >>> 24; + buffer[61] = n >>> 16; + buffer[62] = n >>> 8; + buffer[63] = n; + + // Update with the final block + $update(buffer); + + // Convert the state to 8-bit byte array + var bytes = Uint8List(hashLength); + for (int j = 0, i = 0; j < hashLength; i++, j += 4) { + bytes[j] = state[i] >>> 24; + bytes[j + 1] = state[i] >>> 16; + bytes[j + 2] = state[i] >>> 8; + bytes[j + 3] = state[i]; + } + return bytes; + } +} diff --git a/hashlib/lib/src/algorithms/sha3.dart b/hashlib/lib/src/algorithms/sha3.dart new file mode 100644 index 0000000..a4c0c29 --- /dev/null +++ b/hashlib/lib/src/algorithms/sha3.dart @@ -0,0 +1,44 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'keccak/keccak.dart'; + +/// Implementation of 224-bit hash generator based on [KeccakHash] +/// with SHA3 padding. +class SHA3d224Hash extends KeccakHash { + SHA3d224Hash() + : super( + stateSize: 224 >>> 3, + paddingByte: 0x06, + ); +} + +/// Implementation of 256-bit hash generator based on [KeccakHash] +/// with SHA3 padding. +class SHA3d256Hash extends KeccakHash { + SHA3d256Hash() + : super( + stateSize: 256 >>> 3, + paddingByte: 0x06, + ); +} + +/// Implementation of 384-bit hash generator based on [KeccakHash] +/// with SHA3 padding. +class SHA3d384Hash extends KeccakHash { + SHA3d384Hash() + : super( + stateSize: 384 >>> 3, + paddingByte: 0x06, + ); +} + +/// Implementation of 512-bit hash generator based on [KeccakHash] +/// with SHA3 padding. +class SHA3d512Hash extends KeccakHash { + SHA3d512Hash() + : super( + stateSize: 512 >>> 3, + paddingByte: 0x06, + ); +} diff --git a/hashlib/lib/src/algorithms/shake.dart b/hashlib/lib/src/algorithms/shake.dart new file mode 100644 index 0000000..0de8aca --- /dev/null +++ b/hashlib/lib/src/algorithms/shake.dart @@ -0,0 +1,36 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'keccak/keccak.dart'; + +/// Implementation of 128-bit arbitrary hash generator based on [KeccakHash]. +class Shake128Hash extends KeccakHash { + /// Create a SHAKE-128 hash generator with arbitrary output size. + /// + /// If [outputLengthInBytes] is 0, it will generate an infinite sequence of + /// numbers with generate(), but the digest() will return an empty string. + /// + /// If [outputLengthInBytes] is null, 128-bit output is generated by default. + Shake128Hash([int? outputLengthInBytes]) + : super( + stateSize: 128 >>> 3, + paddingByte: 0x1f, + outputSize: outputLengthInBytes, + ); +} + +/// Implementation of 256-bit arbitrary hash generator based on [KeccakHash]. +class Shake256Hash extends KeccakHash { + /// Create a SHAKE-256 hash generator with arbitrary output size. + /// + /// If [outputLengthInBytes] is 0, it will generate an infinite sequence of + /// numbers with generate(), but the digest() will return an empty string. + /// + /// If [outputLengthInBytes] is null, 256-bit output is generated by default. + Shake256Hash([int? outputLengthInBytes]) + : super( + stateSize: 256 >>> 3, + paddingByte: 0x1f, + outputSize: outputLengthInBytes, + ); +} diff --git a/hashlib/lib/src/algorithms/sm3.dart b/hashlib/lib/src/algorithms/sm3.dart new file mode 100644 index 0000000..69899b8 --- /dev/null +++ b/hashlib/lib/src/algorithms/sm3.dart @@ -0,0 +1,176 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const _iv = [ + 0x7380166f, + 0x4914b2b9, + 0x172442d7, + 0xda8a0600, + 0xa96f30bc, + 0x163138aa, + 0xe38dee4d, + 0xb0fb0e4e, +]; + +/// This implementation is derived from the draft of +/// [The SM3 Cryptographic Hash Function][rfc]. +/// +/// [rfc]: https://datatracker.ietf.org/doc/draft-sca-cfrg-sm3/ +class SM3Hash extends BlockHashSink { + final Uint32List state; + + @override + final int hashLength; + + SM3Hash() + : state = Uint32List.fromList(_iv), + hashLength = 256 >>> 3, + super( + 512 >>> 3, + bufferLength: 68 << 2, + ); + + @override + void reset() { + state.setAll(0, _iv); + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(buffer); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @pragma('vm:prefer-inline') + static int _swap32(int x) => + ((x << 24) & 0xff000000) | + ((x << 8) & 0x00ff0000) | + ((x >>> 8) & 0x0000ff00) | + ((x >>> 24) & 0x000000ff); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int a, b, c, d, e, f, g, h; + int i, t, ss1, ss2, tt1, tt2; + var x = sbuffer; + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + // Message Expansion + for (i = 0; i < 16; i++) { + x[i] = _swap32(x[i]); + } + for (i = 16; i < 68; i++) { + t = x[i - 16] ^ x[i - 9] ^ _rotl32(x[i - 3], 15); + t ^= _rotl32(t, 15) ^ _rotl32(t, 23); + t ^= _rotl32(x[i - 13], 7) ^ x[i - 6]; + x[i] = t; + } + + // Compression Function + for (i = 0; i < 16; i++) { + t = _rotl32(a, 12) + e + _rotl32(0x79cc4519, i); + ss1 = _rotl32(t, 7); + ss2 = ss1 ^ _rotl32(a, 12); + t = a ^ b ^ c; + tt1 = (t + d + ss2 + (x[i] ^ x[i + 4])) & _mask32; + t = e ^ f ^ g; + tt2 = (t + h + ss1 + x[i]) & _mask32; + d = c; + c = _rotl32(b, 9); + b = a; + a = tt1; + h = g; + g = _rotl32(f, 19); + f = e; + e = tt2 ^ _rotl32(tt2, 9) ^ _rotl32(tt2, 17); + } + for (i = 16; i < 64; i++) { + t = _rotl32(a, 12) + e + _rotl32(0x7a879d8a, i & 31); + ss1 = _rotl32(t, 7); + ss2 = ss1 ^ _rotl32(a, 12); + t = (a & b) | (b & c) | (c & a); + tt1 = (t + d + ss2 + (x[i] ^ x[i + 4])) & _mask32; + t = (e & f) | (g & (~e)); + tt2 = (t + h + ss1 + x[i]) & _mask32; + d = c; + c = _rotl32(b, 9); + b = a; + a = tt1; + h = g; + g = _rotl32(f, 19); + f = e; + e = tt2 ^ _rotl32(tt2, 9) ^ _rotl32(tt2, 17); + } + + state[0] ^= a; + state[1] ^= b; + state[2] ^= c; + state[3] ^= d; + state[4] ^= e; + state[5] ^= f; + state[6] ^= g; + state[7] ^= h; + } + + @override + Uint8List $finalize() { + // Adding the signature byte + buffer[pos++] = 0x80; + + // If no more space left in buffer for the message length + if (pos > 56) { + for (; pos < 64; pos++) { + buffer[pos] = 0; + } + $update(); + pos = 0; + } + + // Fill remaining buffer to put the message length at the end + for (; pos < 56; pos++) { + buffer[pos] = 0; + } + + // Append original message length in bits to message + bdata.setUint32(56, messageLengthInBits >>> 32, Endian.big); + bdata.setUint32(60, messageLengthInBits, Endian.big); + + // Update with the final block + $update(); + + // Convert the state to 8-bit byte array + var output = Uint32List(hashLength >>> 2); + for (int i = 0; i < output.length; i++) { + output[i] = _swap32(state[i]); + } + return Uint8List.view(output.buffer); + } +} diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_128.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_128.dart new file mode 100644 index 0000000..68e2d11 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_128.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'xxh3_128_64bit.dart' if (dart.library.js) 'xxh3_128_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_128_32bit.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_128_32bit.dart new file mode 100644 index 0000000..1ee4f68 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_128_32bit.dart @@ -0,0 +1,32 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +/// Stub for 32-bit machines. +class XXH3Sink128bit extends BlockHashSink { + @override + final int hashLength = 16; + + factory XXH3Sink128bit.withSeed(int seed) { + seed; + throw UnimplementedError('XXH3-128 is not supported in Node platform'); + } + + factory XXH3Sink128bit.withSecret([List? secret]) { + secret; + throw UnimplementedError('XXH3-128 is not supported in Node platform'); + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + throw UnimplementedError('XXH3-128 is not supported in Node platform'); + } + + @override + Uint8List $finalize() { + throw UnimplementedError('XXH3-128 is not supported in Node platform'); + } +} diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_128_64bit.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_128_64bit.dart new file mode 100644 index 0000000..7439fc5 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_128_64bit.dart @@ -0,0 +1,509 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:collection'; +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const int _stripeLen = 64; +const int _midsizeMax = 240; +const int _minSecretSize = 136; + +// Pseudorandom secret taken directly from FARSH (little-endian) +const List _kSecret = [ + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, // + 0xf7, 0x21, 0xad, 0x1c, 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, + 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, 0xcb, 0x79, 0xe6, 0x4e, + 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, + 0x81, 0x3a, 0x26, 0x4c, 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, + 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, 0x71, 0x64, 0x48, 0x97, + 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, + 0xc7, 0x0b, 0x4f, 0x1d, 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, + 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, 0xea, 0xc5, 0xac, 0x83, + 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, + 0x29, 0xd4, 0x68, 0x9e, 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, + 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, 0x45, 0xcb, 0x3a, 0x8f, + 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +]; + +/// This implementation is derived from +/// https://github.com/RedSpah/xxhash_cpp/blob/master/include/xxhash.hpp +class XXH3Sink128bit extends BlockHashSink { + final int seed; + final int rounds; + final Uint8List secret; + final Uint64List state = Uint64List(8); + final ListQueue last = ListQueue(_midsizeMax); + late final Uint64List qbuffer = Uint64List.view(buffer.buffer); + late final Uint64List secret64 = Uint64List.view(secret.buffer); + late final ByteData secretBD = secret.buffer.asByteData(); + + @override + final int hashLength = 16; + + static const int prime32_1 = 0x9E3779B1; + static const int prime32_2 = 0x85EBCA77; + static const int prime32_3 = 0xC2B2AE3D; + static const int prime64_1 = 0x9E3779B185EBCA87; + static const int prime64_2 = 0xC2B2AE3D27D4EB4F; + static const int prime64_3 = 0x165667B19E3779F9; + static const int prime64_4 = 0x85EBCA77C2B2AE63; + static const int prime64_5 = 0x27D4EB2F165667C5; + + factory XXH3Sink128bit.withSeed(int seed) { + if (seed == 0) { + return XXH3Sink128bit.withSecret(); + } + var secret = Uint8List.fromList(_kSecret); + var secret64 = Uint64List.view(secret.buffer); + for (int i = 0; i < secret64.length; i += 2) { + secret64[i] += seed; + } + for (int i = 1; i < secret64.length; i += 2) { + secret64[i] -= seed; + } + return XXH3Sink128bit._( + seed: seed, + secret: secret, + rounds: (secret.lengthInBytes - _stripeLen) >>> 3, + ); + } + + factory XXH3Sink128bit.withSecret([List? secret]) { + var key = Uint8List.fromList(secret ?? _kSecret); + if (key.lengthInBytes < _minSecretSize) { + throw ArgumentError('The secret length must be at least $_minSecretSize'); + } + return XXH3Sink128bit._( + seed: 0, + secret: key, + rounds: (key.lengthInBytes - _stripeLen) >>> 3, + ); + } + + XXH3Sink128bit._({ + required this.seed, + required this.secret, + required this.rounds, + }) : super(rounds << 6) { + reset(); + } + + @override + void reset() { + state[0] = prime32_3; + state[1] = prime64_1; + state[2] = prime64_2; + state[3] = prime64_3; + state[4] = prime64_4; + state[5] = prime32_2; + state[6] = prime64_5; + state[7] = prime32_1; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + if (last.length == _midsizeMax) { + last.removeFirst(); + } + last.add(chunk[start]); + } + } + + @pragma('vm:prefer-inline') + static int _crossSwap(int x) => (x & _mask32) * (x >>> 32); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int n, i, v, l, k; + // accumulate + for (n = 0; n < rounds; n++) { + l = n << 3; + for (i = 0; i < state.length; i++) { + v = qbuffer[l + i]; + state[i ^ 1] += v; + v ^= secret64[n + i]; + state[i] += _crossSwap(v); + } + } + // scramble + k = secret.lengthInBytes - _stripeLen; + for (i = 0; i < 8; ++i) { + state[i] ^= state[i] >>> 47; + state[i] ^= secretBD.getUint64(k + (i << 3), Endian.little); + state[i] *= prime32_1; + } + } + + @pragma('vm:prefer-inline') + static int _avalanche(int hash) { + hash ^= hash >>> 37; + hash *= 0x165667919E3779F9; + hash ^= hash >>> 32; + return hash; + } + + @pragma('vm:prefer-inline') + static int _midsizeAvalanche(int hash) { + hash ^= hash >>> 33; + hash *= prime64_2; + hash ^= hash >>> 29; + hash *= prime64_3; + hash ^= hash >>> 32; + return hash; + } + + @pragma('vm:prefer-inline') + static Uint8List _combine(int a, int b) { + return Uint8List.fromList([ + b >>> 56, + b >>> 48, + b >>> 40, + b >>> 32, + b >>> 24, + b >>> 16, + b >>> 8, + b, + a >>> 56, + a >>> 48, + a >>> 40, + a >>> 32, + a >>> 24, + a >>> 16, + a >>> 8, + a, + ]); + } + + Uint8List _finalizeLong(Uint64List stripe) { + // XXH3_hashLong_128b + int low, high; + int t, n, i, v, l, a, b; + const int lastAccStart = 7; + const int mergeAccStart = 11; + + // accumulate last partial block + for (t = n = 0; t + _stripeLen < pos; n++, t += _stripeLen) { + l = n << 3; + for (i = 0; i < state.length; i++) { + v = qbuffer[l + i]; + state[i ^ 1] += v; + v ^= secret64[n + i]; + state[i] += _crossSwap(v); + } + } + + // last stripe + t = secret.lengthInBytes - _stripeLen - lastAccStart; + for (i = 0; i < state.length; i++, t += 8) { + v = stripe[i]; + state[i ^ 1] += v; + v ^= secretBD.getUint64(t, Endian.little); + state[i] += _crossSwap(v); + } + + // converge into final hash + low = messageLength * prime64_1; + high = ~(messageLength * prime64_2); + t = mergeAccStart; + for (i = 0; i < 8; i += 2, t += 16) { + a = secretBD.getUint64(t, Endian.little); + b = secretBD.getUint64(t + 8, Endian.little); + low += _mul128fold64(state[i] ^ a, state[i + 1] ^ b); + } + t = secret.lengthInBytes - _stripeLen - mergeAccStart; + for (i = 0; i < 8; i += 2, t += 16) { + a = secretBD.getUint64(t, Endian.little); + b = secretBD.getUint64(t + 8, Endian.little); + high += _mul128fold64(state[i] ^ a, state[i + 1] ^ b); + } + + // avalanche + return _combine(_avalanche(low), _avalanche(high)); + } + + @pragma('vm:prefer-inline') + static int _swap32(int x) => + ((x << 24) & 0xff000000) | + ((x << 8) & 0x00ff0000) | + ((x >>> 8) & 0x0000ff00) | + ((x >>> 24) & 0x000000ff); + + @pragma('vm:prefer-inline') + static int _swap64(int x) => + ((x << 56) & 0xff00000000000000) | + ((x << 40) & 0x00ff000000000000) | + ((x << 24) & 0x0000ff0000000000) | + ((x << 8) & 0x000000ff00000000) | + ((x >>> 8) & 0x00000000ff000000) | + ((x >>> 24) & 0x0000000000ff0000) | + ((x >>> 40) & 0x000000000000ff00) | + ((x >>> 56) & 0x00000000000000ff); + + @pragma('vm:prefer-inline') + static int _rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + // Multiply two 64-bit numbers to get 128-bit number + static void _mul128(int a, int b, Uint64List result) { + int al, ah, bl, bh, ll, hl, lh, hh, cross; + + al = a & _mask32; + ah = a >>> 32; + bl = b & _mask32; + bh = b >>> 32; + + ll = al * bl; + hl = ah * bl; + lh = al * bh; + hh = ah * bh; + + cross = (ll >>> 32) + (hl & _mask32) + lh; + result[0] = (cross << 32) | (ll & _mask32); + result[1] = (hl >>> 32) + (cross >>> 32) + hh; + } + + // Multiply two 64-bit numbers to get 128-bit number and + // xor the low bits of the product with the high bits + static int _mul128fold64(int a, int b) { + int al, ah, bl, bh, ll, hl, lh, hh, cross, upper, lower; + + al = a & _mask32; + ah = a >>> 32; + bl = b & _mask32; + bh = b >>> 32; + + ll = al * bl; + hl = ah * bl; + lh = al * bh; + hh = ah * bh; + + cross = (ll >>> 32) + (hl & _mask32) + lh; + upper = (hl >>> 32) + (cross >>> 32) + hh; + lower = (cross << 32) | (ll & _mask32); + + return upper ^ lower; + } + + static int _mix16B(ByteData input, int i, ByteData key, int j, int seed) { + int lhs, rhs; + lhs = key.getUint64(j, Endian.little) + seed; + rhs = key.getUint64(j + 8, Endian.little) - seed; + lhs ^= input.getUint64(i, Endian.little); + rhs ^= input.getUint64(i + 8, Endian.little); + return _mul128fold64(lhs, rhs); + } + + static void _mix32B( + Uint64List acc, + ByteData input, + int a, + int b, + ByteData key, + int c, + int seed, + ) { + acc[0] += _mix16B(input, a, key, c, seed); + acc[0] ^= input.getUint64(b, Endian.little) + + input.getUint64(b + 8, Endian.little); + acc[1] += _mix16B(input, b, key, c + 16, seed); + acc[1] ^= input.getUint64(a, Endian.little) + + input.getUint64(a + 8, Endian.little); + } + + Uint8List _finalizeShort(ByteData input, int length, ByteData key) { + int low, high; + int i, lhs, rhs, a, b, c, x, y; + Uint64List acc = Uint64List(2); + if (length == 0) { + // hash_t len_0to16 + low = seed; + low ^= key.getUint64(64, Endian.little); + low ^= key.getUint64(72, Endian.little); + + high = seed; + high ^= key.getUint64(80, Endian.little); + high ^= key.getUint64(88, Endian.little); + + low = _midsizeAvalanche(low); + high = _midsizeAvalanche(high); + } else if (length <= 3) { + // hash_t len_1to3 + a = input.getUint8(0); + b = input.getUint8(length >>> 1); + c = input.getUint8(length - 1); + x = (a << 16) | (b << 24) | (c) | (length << 8); + y = _rotl32(_swap32(x), 13); + + low = key.getUint32(0, Endian.little); + low ^= key.getUint32(4, Endian.little); + low += seed; + low ^= x; + + high = key.getUint32(8, Endian.little); + high ^= key.getUint32(12, Endian.little); + high -= seed; + high ^= y; + + low = _midsizeAvalanche(low); + high = _midsizeAvalanche(high); + } else if (length <= 8) { + // hash_t len_4to8 + lhs = input.getUint32(0, Endian.little); + rhs = input.getUint32(length - 4, Endian.little); + + x = key.getUint64(16, Endian.little); + x ^= key.getUint64(24, Endian.little); + x += seed ^ (_swap32(seed & _mask32) << 32); + x ^= (rhs << 32) | lhs; + + _mul128(x, prime64_1 + (length << 2), acc); + low = acc[0]; + high = acc[1]; + + high += low << 1; + low ^= high >>> 3; + low ^= low >>> 35; + low *= 0x9FB21C651E98DF25; + low ^= low >>> 28; + + high = _avalanche(high); + } else if (length <= 16) { + // hash_t len_9to16 + lhs = key.getUint64(32, Endian.little); + lhs ^= key.getUint64(40, Endian.little); + lhs -= seed; + lhs ^= input.getUint64(0, Endian.little); + lhs ^= input.getUint64(length - 8, Endian.little); + + rhs = key.getUint64(48, Endian.little); + rhs ^= key.getUint64(56, Endian.little); + rhs += seed; + rhs ^= input.getUint64(length - 8, Endian.little); + + _mul128(lhs, prime64_1, acc); + low = acc[0]; + high = acc[1]; + low += length - 1 << 54; + high += (rhs & (_mask32 << 32)) + ((rhs & _mask32) * prime32_2); + + low ^= _swap64(high); + _mul128(low, prime64_2, acc); + low = acc[0]; + high = acc[1] + (high * prime64_2); + + low = _avalanche(low); + high = _avalanche(high); + } else if (length <= 128) { + // hash_t len_17to128 + acc[0] = length * prime64_1; + acc[1] = 0; + if (length > 32) { + if (length > 64) { + if (length > 96) { + _mix32B(acc, input, 48, length - 64, key, 96, seed); + } + _mix32B(acc, input, 32, length - 48, key, 64, seed); + } + _mix32B(acc, input, 16, length - 32, key, 32, seed); + } + _mix32B(acc, input, 0, length - 16, key, 0, seed); + + low = acc[0] + acc[1]; + high = acc[0] * prime64_1 + acc[1] * prime64_4; + high += (length - seed) * prime64_2; + low = _avalanche(low); + high = -_avalanche(high); + } else { + // hash_t len_129to240 + const int startOffset = 3; + const int lastOffset = 17; + acc[0] = length * prime64_1; + acc[1] = 0; + // first 128 bytes + for (i = 0; i < 128; i += 32) { + _mix32B( + acc, + input, + i, + i + 16, + key, + i, + seed, + ); + } + acc[0] = _avalanche(acc[0]); + acc[1] = _avalanche(acc[1]); + // remaining bytes + for (i = 128; i + 32 <= length; i += 32) { + _mix32B( + acc, + input, + i, + i + 16, + key, + startOffset + i - 128, + seed, + ); + } + // last byte + _mix32B( + acc, + input, + length - 16, + length - 32, + key, + _minSecretSize - lastOffset - 16, + -seed, + ); + // mid-range avalanche + low = _avalanche(acc[0] + acc[1]); + high = acc[1] * prime64_4; + high += acc[0] * prime64_1; + high += (length - seed) * prime64_2; + high = -_avalanche(high); + } + // combine + return _combine(low, high); + } + + @override + Uint8List $finalize() { + int i; + ByteData key; + Uint64List input = Uint64List(_midsizeMax >>> 3); + Uint8List input8 = Uint8List.view(input.buffer); + + if (messageLength <= _midsizeMax) { + var it = last.iterator; + for (i = 0; it.moveNext(); ++i) { + input8[i] = it.current; + } + if (seed == 0) { + key = secretBD; + } else { + key = Uint8List.fromList(_kSecret).buffer.asByteData(); + } + return _finalizeShort(input.buffer.asByteData(), i, key); + } else { + for (i = _stripeLen - 1; i >= 0; --i) { + input8[i] = last.removeLast(); + } + return _finalizeLong(input); + } + } +} diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_64.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_64.dart new file mode 100644 index 0000000..8e5d659 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_64.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'xxh3_64_64bit.dart' if (dart.library.js) 'xxh3_64_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_64_32bit.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_64_32bit.dart new file mode 100644 index 0000000..98cc433 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_64_32bit.dart @@ -0,0 +1,32 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +/// Stub for 32-bit machines. +class XXH3Sink64bit extends BlockHashSink { + @override + final int hashLength = 8; + + factory XXH3Sink64bit.withSeed(int seed) { + seed; + throw UnimplementedError('XXH3 is not supported in Node platform'); + } + + factory XXH3Sink64bit.withSecret([List? secret]) { + secret; + throw UnimplementedError('XXH3 is not supported in Node platform'); + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + throw UnimplementedError('XXH3 is not supported in Node platform'); + } + + @override + Uint8List $finalize() { + throw UnimplementedError('XXH3 is not supported in Node platform'); + } +} diff --git a/hashlib/lib/src/algorithms/xxh3/xxh3_64_64bit.dart b/hashlib/lib/src/algorithms/xxh3/xxh3_64_64bit.dart new file mode 100644 index 0000000..b1923d2 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh3/xxh3_64_64bit.dart @@ -0,0 +1,391 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:collection'; +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const int _stripeLen = 64; +const int _midsizeMax = 240; +const int _minSecretSize = 136; + +// Pseudorandom secret taken directly from FARSH (little-endian) +const List _kSecret = [ + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, // + 0xf7, 0x21, 0xad, 0x1c, 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, + 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, 0xcb, 0x79, 0xe6, 0x4e, + 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, + 0x81, 0x3a, 0x26, 0x4c, 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, + 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, 0x71, 0x64, 0x48, 0x97, + 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, + 0xc7, 0x0b, 0x4f, 0x1d, 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, + 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, 0xea, 0xc5, 0xac, 0x83, + 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, + 0x29, 0xd4, 0x68, 0x9e, 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, + 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, 0x45, 0xcb, 0x3a, 0x8f, + 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +]; + +/// This implementation is derived from +/// https://github.com/RedSpah/xxhash_cpp/blob/master/include/xxhash.hpp +class XXH3Sink64bit extends BlockHashSink { + final int seed; + final int rounds; + final Uint8List secret; + final Uint64List acc = Uint64List(8); + final ListQueue last = ListQueue(_midsizeMax); + late final Uint64List qbuffer = Uint64List.view(buffer.buffer); + late final Uint64List secret64 = Uint64List.view(secret.buffer); + late final ByteData secretBD = secret.buffer.asByteData(); + + @override + final int hashLength = 8; + + static const int prime32_1 = 0x9E3779B1; + static const int prime32_2 = 0x85EBCA77; + static const int prime32_3 = 0xC2B2AE3D; + static const int prime64_1 = 0x9E3779B185EBCA87; + static const int prime64_2 = 0xC2B2AE3D27D4EB4F; + static const int prime64_3 = 0x165667B19E3779F9; + static const int prime64_4 = 0x85EBCA77C2B2AE63; + static const int prime64_5 = 0x27D4EB2F165667C5; + + factory XXH3Sink64bit.withSeed(int seed) { + if (seed == 0) { + return XXH3Sink64bit.withSecret(); + } + var secret = Uint8List.fromList(_kSecret); + var secret64 = Uint64List.view(secret.buffer); + for (int i = 0; i < secret64.length; i += 2) { + secret64[i] += seed; + } + for (int i = 1; i < secret64.length; i += 2) { + secret64[i] -= seed; + } + return XXH3Sink64bit._( + seed: seed, + secret: secret, + rounds: (secret.lengthInBytes - _stripeLen) >>> 3, + ); + } + + factory XXH3Sink64bit.withSecret([List? secret]) { + var key = Uint8List.fromList(secret ?? _kSecret); + if (key.lengthInBytes < _minSecretSize) { + throw ArgumentError('The secret length must be at least $_minSecretSize'); + } + return XXH3Sink64bit._( + seed: 0, + secret: key, + rounds: (key.lengthInBytes - _stripeLen) >>> 3, + ); + } + + XXH3Sink64bit._({ + required this.seed, + required this.secret, + required this.rounds, + }) : super(rounds << 6) { + reset(); + } + + @override + void reset() { + acc[0] = prime32_3; + acc[1] = prime64_1; + acc[2] = prime64_2; + acc[3] = prime64_3; + acc[4] = prime64_4; + acc[5] = prime32_2; + acc[6] = prime64_5; + acc[7] = prime32_1; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + if (last.length == _midsizeMax) { + last.removeFirst(); + } + last.add(chunk[start]); + } + } + + @pragma('vm:prefer-inline') + static int _crossSwap(int x) => (x & _mask32) * (x >>> 32); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + int n, i, v, l, k; + // accumulate + for (n = 0; n < rounds; n++) { + l = n << 3; + for (i = 0; i < acc.length; i++) { + v = qbuffer[l + i]; + acc[i ^ 1] += v; + v ^= secret64[n + i]; + acc[i] += _crossSwap(v); + } + } + // scramble + k = secret.lengthInBytes - _stripeLen; + for (i = 0; i < 8; ++i) { + acc[i] ^= acc[i] >>> 47; + acc[i] ^= secretBD.getUint64(k + (i << 3), Endian.little); + acc[i] *= prime32_1; + } + } + + @pragma('vm:prefer-inline') + static int _avalanche(int hash) { + hash ^= hash >>> 37; + hash *= 0x165667919E3779F9; + hash ^= hash >>> 32; + return hash; + } + + @pragma('vm:prefer-inline') + static int _midsizeAvalanche(int hash) { + hash ^= hash >>> 33; + hash *= prime64_2; + hash ^= hash >>> 29; + hash *= prime64_3; + hash ^= hash >>> 32; + return hash; + } + + @pragma('vm:prefer-inline') + static int _rrmxmx(int hash, int length) { + hash ^= _rotl64(hash, 49) ^ _rotl64(hash, 24); + hash *= 0x9FB21C651E98DF25; + hash ^= (hash >>> 35) + length; + hash *= 0x9FB21C651E98DF25; + hash ^= hash >>> 28; + return hash; + } + + int _finalizeLong(Uint64List stripe) { + // void hash_long_internal_loop + int hash; + int t, n, i, v, l, a, b; + const int lastAccStart = 7; + const int mergeAccStart = 11; + + // last partial block + for (t = n = 0; t + _stripeLen < pos; n++, t += _stripeLen) { + l = n << 3; + for (i = 0; i < acc.length; i++) { + v = qbuffer[l + i]; + acc[i ^ 1] += v; + v ^= secret64[n + i]; + acc[i] += _crossSwap(v); + } + } + + // last stripe + t = secret.lengthInBytes - _stripeLen - lastAccStart; + for (i = 0; i < acc.length; i++, t += 8) { + v = stripe[i]; + acc[i ^ 1] += v; + v ^= secretBD.getUint64(t, Endian.little); + acc[i] += _crossSwap(v); + } + + // converge into final hash: uint64_t merge_accs + hash = messageLength * prime64_1; + t = mergeAccStart; + for (i = 0; i < 8; i += 2, t += 16) { + a = acc[i] ^ secretBD.getUint64(t, Endian.little); + b = acc[i + 1] ^ secretBD.getUint64(t + 8, Endian.little); + hash += _mul128fold64(a, b); + } + + // avalanche + return _avalanche(hash); + } + + @pragma('vm:prefer-inline') + static int _swap32(int x) => + ((x << 24) & 0xff000000) | + ((x << 8) & 0x00ff0000) | + ((x >>> 8) & 0x0000ff00) | + ((x >>> 24) & 0x000000ff); + + @pragma('vm:prefer-inline') + static int _swap64(int x) => + ((x << 56) & 0xff00000000000000) | + ((x << 40) & 0x00ff000000000000) | + ((x << 24) & 0x0000ff0000000000) | + ((x << 8) & 0x000000ff00000000) | + ((x >>> 8) & 0x00000000ff000000) | + ((x >>> 24) & 0x0000000000ff0000) | + ((x >>> 40) & 0x000000000000ff00) | + ((x >>> 56) & 0x00000000000000ff); + + @pragma('vm:prefer-inline') + static int _rotl64(int x, int n) => (x << n) | (x >>> (64 - n)); + + // Multiply two 64-bit numbers to get 128-bit number and + // xor the low bits of the product with the high bits + static int _mul128fold64(int a, int b) { + int al, ah, bl, bh, ll, hl, lh, hh, cross, upper, lower; + + al = a & _mask32; + ah = a >>> 32; + bl = b & _mask32; + bh = b >>> 32; + + ll = al * bl; + hl = ah * bl; + lh = al * bh; + hh = ah * bh; + + cross = (ll >>> 32) + (hl & _mask32) + lh; + upper = (hl >>> 32) + (cross >>> 32) + hh; + lower = (cross << 32) | (ll & _mask32); + + return upper ^ lower; + } + + static int _mix16B(ByteData input, int i, ByteData key, int j, int seed) { + int lhs, rhs; + lhs = input.getUint64(i, Endian.little); + rhs = input.getUint64(i + 8, Endian.little); + lhs ^= key.getUint64(j, Endian.little) + seed; + rhs ^= key.getUint64(j + 8, Endian.little) - seed; + return _mul128fold64(lhs, rhs); + } + + int _finalizeShort(ByteData input, int length, ByteData key) { + int hash, lhs, rhs, a, b, c, i; + if (length == 0) { + // hash_t len_0to16 + hash = seed; + hash ^= key.getUint64(56, Endian.little); + hash ^= key.getUint64(64, Endian.little); + return _midsizeAvalanche(hash); + } else if (length <= 3) { + // hash_t len_1to3 + a = input.getUint8(0); + b = input.getUint8(length >>> 1); + c = input.getUint8(length - 1); + hash = key.getUint32(0, Endian.little); + hash ^= key.getUint32(4, Endian.little); + hash += seed; + hash ^= (a << 16) | (b << 24) | (c) | (length << 8); + return _midsizeAvalanche(hash); + } else if (length <= 8) { + // hash_t len_4to8 + lhs = input.getUint32(0, Endian.little); + rhs = input.getUint32(length - 4, Endian.little); + hash = key.getUint64(8, Endian.little); + hash ^= key.getUint64(16, Endian.little); + hash -= seed ^ ((_swap32(seed) & _mask32) << 32); + hash ^= (lhs << 32) | rhs; + return _rrmxmx(hash, length); + } else if (length <= 16) { + // hash_t len_9to16 + lhs = key.getUint64(24, Endian.little); + lhs ^= key.getUint64(32, Endian.little); + lhs += seed; + + rhs = key.getUint64(40, Endian.little); + rhs ^= key.getUint64(48, Endian.little); + rhs -= seed; + + lhs ^= input.getUint64(0, Endian.little); + rhs ^= input.getUint64(length - 8, Endian.little); + + hash = length + _swap64(lhs) + rhs + _mul128fold64(lhs, rhs); + return _avalanche(hash); + } else if (length <= 128) { + // hash_t len_17to128 + hash = length * prime64_1; + if (length > 32) { + if (length > 64) { + if (length > 96) { + hash += _mix16B(input, 48, key, 96, seed); + hash += _mix16B(input, length - 64, key, 112, seed); + } + hash += _mix16B(input, 32, key, 64, seed); + hash += _mix16B(input, length - 48, key, 80, seed); + } + hash += _mix16B(input, 16, key, 32, seed); + hash += _mix16B(input, length - 32, key, 48, seed); + } + hash += _mix16B(input, 0, key, 0, seed); + hash += _mix16B(input, length - 16, key, 16, seed); + return _avalanche(hash); + } else { + // hash_t len_129to240 + const int startOffset = 3; + const int lastOffset = 17; + hash = length * prime64_1; + // first 128 bytes + for (i = 0; i < 128; i += 16) { + hash += _mix16B(input, i, key, i, seed); + } + hash = _avalanche(hash); + // remaining bytes + for (i = 128; i + 16 <= length; i += 16) { + c = startOffset + i - 128; + hash += _mix16B(input, i, key, c, seed); + } + // last byte + c = _minSecretSize - lastOffset; + hash += _mix16B(input, length - 16, key, c, seed); + return _avalanche(hash); + } + } + + @override + Uint8List $finalize() { + int i; + int hash; + ByteData key; + Uint64List input = Uint64List(_midsizeMax >>> 3); + Uint8List input8 = Uint8List.view(input.buffer); + + if (messageLength <= _midsizeMax) { + var it = last.iterator; + for (i = 0; it.moveNext(); ++i) { + input8[i] = it.current; + } + if (seed == 0) { + key = secretBD; + } else { + key = Uint8List.fromList(_kSecret).buffer.asByteData(); + } + hash = _finalizeShort(input.buffer.asByteData(), i, key); + } else { + for (i = 63; i >= 0; --i) { + input8[i] = last.removeLast(); + } + hash = _finalizeLong(input); + } + + return Uint8List.fromList([ + hash >>> 56, + hash >>> 48, + hash >>> 40, + hash >>> 32, + hash >>> 24, + hash >>> 16, + hash >>> 8, + hash, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/xxh32/xxh32.dart b/hashlib/lib/src/algorithms/xxh32/xxh32.dart new file mode 100644 index 0000000..5863dea --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh32/xxh32.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'xxh32_64bit.dart' if (dart.library.js) 'xxh32_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/xxh32/xxh32_32bit.dart b/hashlib/lib/src/algorithms/xxh32/xxh32_32bit.dart new file mode 100644 index 0000000..fa16e08 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh32/xxh32_32bit.dart @@ -0,0 +1,136 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask16 = 0xFFFF; +const int _mask32 = 0xFFFFFFFF; + +/// This implementation is derived from +/// https://github.com/easyaspi314/xxhash-clean/blob/master/xxhash32-ref.c +class XXHash32Sink extends BlockHashSink { + final int seed; + + @override + final int hashLength = 4; + + static const int prime32_1 = 0x9E3779B1; + static const int prime32_2 = 0x85EBCA77; + static const int prime32_3 = 0xC2B2AE3D; + static const int prime32_4 = 0x27D4EB2F; + static const int prime32_5 = 0x165667B1; + + int _acc1 = 0; + int _acc2 = 0; + int _acc3 = 0; + int _acc4 = 0; + + XXHash32Sink(this.seed) : super(16) { + reset(); + } + + @override + void reset() { + _acc1 = (seed & _mask32) + prime32_1 + prime32_2; + _acc2 = (seed & _mask32) + prime32_2; + _acc3 = (seed & _mask32) + 0; + _acc4 = (seed & _mask32) - prime32_1; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(); + pos = 0; + } + } + + /// Returns ([a] * [b]) within 32-bit Galois field + static int cross32(int a, int b) { + int ah = (a >>> 16) & _mask16; + int al = a & _mask16; + int bh = (b >>> 16) & _mask16; + int bl = b & _mask16; + a = (ah * bl + al * bh) & _mask32; + b = (al * bl) & _mask32; + return ((a << 16) + b) & _mask32; + } + + /// Rotates 32-bit number [x] by [n] bits + static int rotl32(int x, int n) => + ((x << n) & _mask32) | ((x & _mask32) >>> (32 - n)); + + @override + void $update([List? block, int offset = 0, bool last = false]) { + _acc1 += cross32(sbuffer[0], prime32_2); + _acc1 = rotl32(_acc1, 13); + _acc1 = cross32(_acc1, prime32_1); + + _acc2 += cross32(sbuffer[1], prime32_2); + _acc2 = rotl32(_acc2, 13); + _acc2 = cross32(_acc2, prime32_1); + + _acc3 += cross32(sbuffer[2], prime32_2); + _acc3 = rotl32(_acc3, 13); + _acc3 = cross32(_acc3, prime32_1); + + _acc4 += cross32(sbuffer[3], prime32_2); + _acc4 = rotl32(_acc4, 13); + _acc4 = cross32(_acc4, prime32_1); + } + + @override + Uint8List $finalize() { + int i, t; + int hash; + + if (messageLength < 16) { + hash = (seed & _mask32) + prime32_5; + } else { + hash = rotl32(_acc1, 1); + hash += rotl32(_acc2, 7); + hash += rotl32(_acc3, 12); + hash += rotl32(_acc4, 18); + } + + hash += messageLength & _mask32; + + // process the remaining data + for (i = t = 0; t + 4 <= pos; ++i, t += 4) { + hash += cross32(sbuffer[i], prime32_3); + hash = rotl32(hash, 17); + hash = cross32(hash, prime32_4); + } + for (; t < pos; t++) { + hash += cross32(buffer[t], prime32_5); + hash = rotl32(hash, 11); + hash = cross32(hash, prime32_1); + } + + // avalanche + hash &= _mask32; + hash ^= hash >>> 15; + hash = cross32(hash, prime32_2); + hash ^= hash >>> 13; + hash = cross32(hash, prime32_3); + hash ^= hash >>> 16; + + return Uint8List.fromList([ + hash >>> 24, + hash >>> 16, + hash >>> 8, + hash, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/xxh32/xxh32_64bit.dart b/hashlib/lib/src/algorithms/xxh32/xxh32_64bit.dart new file mode 100644 index 0000000..af20e76 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh32/xxh32_64bit.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +const int _mask32 = 0xFFFFFFFF; + +/// This implementation is derived from +/// https://github.com/easyaspi314/xxhash-clean/blob/master/xxhash32-ref.c +class XXHash32Sink extends BlockHashSink { + final int seed; + + @override + final int hashLength = 4; + + static const int prime32_1 = 0x9E3779B1; + static const int prime32_2 = 0x85EBCA77; + static const int prime32_3 = 0xC2B2AE3D; + static const int prime32_4 = 0x27D4EB2F; + static const int prime32_5 = 0x165667B1; + + int _acc1 = 0; + int _acc2 = 0; + int _acc3 = 0; + int _acc4 = 0; + + XXHash32Sink(this.seed) : super(16) { + reset(); + } + + @override + void reset() { + _acc1 = (seed & _mask32) + prime32_1 + prime32_2; + _acc2 = (seed & _mask32) + prime32_2; + _acc3 = (seed & _mask32) + 0; + _acc4 = (seed & _mask32) - prime32_1; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(); + pos = 0; + } + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + _acc1 = (_acc1 + sbuffer[0] * prime32_2) & _mask32; + _acc1 = (_acc1 << 13) | (_acc1 >>> 19); + _acc1 = (_acc1 * prime32_1) & _mask32; + + _acc2 = (_acc2 + sbuffer[1] * prime32_2) & _mask32; + _acc2 = (_acc2 << 13) | (_acc2 >>> 19); + _acc2 = (_acc2 * prime32_1) & _mask32; + + _acc3 = (_acc3 + sbuffer[2] * prime32_2) & _mask32; + _acc3 = (_acc3 << 13) | (_acc3 >>> 19); + _acc3 = (_acc3 * prime32_1) & _mask32; + + _acc4 = (_acc4 + sbuffer[3] * prime32_2) & _mask32; + _acc4 = (_acc4 << 13) | (_acc4 >>> 19); + _acc4 = (_acc4 * prime32_1) & _mask32; + } + + @override + Uint8List $finalize() { + int i, t; + int hash; + + if (messageLength < 16) { + hash = (seed & _mask32) + prime32_5; + } else { + hash = (_acc1 << 1) | (_acc1 >>> 31); + hash += (_acc2 << 7) | (_acc2 >>> 25); + hash += (_acc3 << 12) | (_acc3 >>> 20); + hash += (_acc4 << 18) | (_acc4 >>> 14); + } + + hash = (hash + messageLength) & _mask32; + + // process the remaining data + for (i = t = 0; t + 4 <= pos; ++i, t += 4) { + hash = (hash + sbuffer[i] * prime32_3) & _mask32; + hash = (hash << 17) | (hash >>> 15); + hash = (hash * prime32_4) & _mask32; + } + for (; t < pos; t++) { + hash = (hash + buffer[t] * prime32_5) & _mask32; + hash = (hash << 11) | (hash >>> 21); + hash = (hash * prime32_1) & _mask32; + } + + // avalanche + hash ^= hash >>> 15; + hash = (hash * prime32_2) & _mask32; + hash ^= hash >>> 13; + hash = (hash * prime32_3) & _mask32; + hash ^= hash >>> 16; + + return Uint8List.fromList([ + hash >>> 24, + hash >>> 16, + hash >>> 8, + hash, + ]); + } +} diff --git a/hashlib/lib/src/algorithms/xxh64/xxh64.dart b/hashlib/lib/src/algorithms/xxh64/xxh64.dart new file mode 100644 index 0000000..5d5f8c7 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh64/xxh64.dart @@ -0,0 +1,4 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'xxh64_64bit.dart' if (dart.library.js) 'xxh64_32bit.dart'; diff --git a/hashlib/lib/src/algorithms/xxh64/xxh64_32bit.dart b/hashlib/lib/src/algorithms/xxh64/xxh64_32bit.dart new file mode 100644 index 0000000..6db62b7 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh64/xxh64_32bit.dart @@ -0,0 +1,27 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +/// Stub for 32-bit machines. +class XXHash64Sink extends BlockHashSink { + @override + final int hashLength = 8; + + XXHash64Sink(int seed) : super(32) { + seed; + throw UnimplementedError('XXHash64 is not supported in Node platform'); + } + + @override + void $update([List? block, int offset = 0, bool last = false]) { + throw UnimplementedError('XXHash64 is not supported in Node platform'); + } + + @override + Uint8List $finalize() { + throw UnimplementedError('XXHash64 is not supported in Node platform'); + } +} diff --git a/hashlib/lib/src/algorithms/xxh64/xxh64_64bit.dart b/hashlib/lib/src/algorithms/xxh64/xxh64_64bit.dart new file mode 100644 index 0000000..f6e0677 --- /dev/null +++ b/hashlib/lib/src/algorithms/xxh64/xxh64_64bit.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/block_hash.dart'; + +/// This implementation is derived from +/// https://github.com/easyaspi314/xxhash-clean/blob/master/xxhash64-ref.c +class XXHash64Sink extends BlockHashSink { + final int seed; + + @override + final int hashLength = 8; + + static const int prime64_1 = 0x9E3779B185EBCA87; + static const int prime64_2 = 0xC2B2AE3D27D4EB4F; + static const int prime64_3 = 0x165667B19E3779F9; + static const int prime64_4 = 0x85EBCA77C2B2AE63; + static const int prime64_5 = 0x27D4EB2F165667C5; + + int _acc1 = 0; + int _acc2 = 0; + int _acc3 = 0; + int _acc4 = 0; + + late final Uint64List qbuffer = Uint64List.view(buffer.buffer); + + XXHash64Sink(this.seed) : super(32) { + reset(); + } + + @override + void reset() { + _acc1 = seed + prime64_1 + prime64_2; + _acc2 = seed + prime64_2; + _acc3 = seed + 0; + _acc4 = seed - prime64_1; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + messageLength += end - start; + for (; start < end; start++, pos++) { + if (pos == blockLength) { + $update(); + pos = 0; + } + buffer[pos] = chunk[start]; + } + if (pos == blockLength) { + $update(); + pos = 0; + } + } + + @pragma('vm:prefer-inline') + static int _rotl(int x, int n) => (x << n) | (x >>> (64 - n)); + + @pragma('vm:prefer-inline') + static int _accumulate(int x, int y) => + _rotl((x + y * prime64_2), 31) * prime64_1; + + @override + void $update([List? block, int offset = 0, bool last = false]) { + _acc1 = _accumulate(_acc1, qbuffer[0]); + _acc2 = _accumulate(_acc2, qbuffer[1]); + _acc3 = _accumulate(_acc3, qbuffer[2]); + _acc4 = _accumulate(_acc4, qbuffer[3]); + } + + @pragma('vm:prefer-inline') + static int _merge(int h, int a) => + (h ^ _accumulate(0, a)) * prime64_1 + prime64_4; + + @override + Uint8List $finalize() { + int i, t; + int hash; + + if (messageLength < 32) { + hash = seed + prime64_5; + } else { + // accumulate + hash = _rotl(_acc1, 1); + hash += _rotl(_acc2, 7); + hash += _rotl(_acc3, 12); + hash += _rotl(_acc4, 18); + + // merge round + hash = _merge(hash, _acc1); + hash = _merge(hash, _acc2); + hash = _merge(hash, _acc3); + hash = _merge(hash, _acc4); + } + + hash += messageLength; + + // process the remaining data + for (i = t = 0; t + 8 <= pos; ++i, t += 8) { + hash ^= _accumulate(0, qbuffer[i]); + hash = _rotl(hash, 27); + hash *= prime64_1; + hash += prime64_4; + } + for (i <<= 1; t + 4 <= pos; ++i, t += 4) { + hash ^= sbuffer[i] * prime64_1; + hash = _rotl(hash, 23); + hash *= prime64_2; + hash += prime64_3; + } + for (; t < pos; t++) { + hash ^= buffer[t] * prime64_5; + hash = _rotl(hash, 11); + hash *= prime64_1; + } + + // avalanche + hash ^= hash >>> 33; + hash *= prime64_2; + hash ^= hash >>> 29; + hash *= prime64_3; + hash ^= hash >>> 32; + + return Uint8List.fromList([ + hash >>> 56, + hash >>> 48, + hash >>> 40, + hash >>> 32, + hash >>> 24, + hash >>> 16, + hash >>> 8, + hash, + ]); + } +} diff --git a/hashlib/lib/src/argon2.dart b/hashlib/lib/src/argon2.dart new file mode 100644 index 0000000..1080775 --- /dev/null +++ b/hashlib/lib/src/argon2.dart @@ -0,0 +1,110 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/argon2/argon2.dart'; + +export 'package:hashlib/src/algorithms/argon2/argon2.dart'; + +const _defaultSecurity = Argon2Security.good; + +/// Verifies if the original [password] was derived from the [encoded] +/// Argon2 hash. +/// +/// The encoded hash may look like this: +/// `$argon2i$v=19$m=16,t=2,p=1$c29tZSBzYWx0$u1eU6mZFG4/OOoTdAtM5SQ` +bool argon2Verify(String encoded, List password) { + var data = fromCrypt(encoded); + var hash = data.hashBytes(); + if (hash == null) { + throw ArgumentError('No password hash in the encoded string'); + } + var instance = Argon2.fromEncoded(data); + return instance.verify(hash, password); +} + +/// Encode a password using default Argon2d algorithm +/// +/// Parameters: +/// - [password] is the raw password to be encoded +/// - [salt] should be at least 8 bytes long. 16 bytes is recommended. +/// - [security] is the parameter choice for the algorithm. +/// - [hashLength] is the number of output bytes +/// - [key] is an optional key bytes to use +/// - [personalization] is optional additional data bytes +Argon2HashDigest argon2d( + List password, + List salt, { + int? hashLength, + List? key, + List? personalization, + Argon2Security security = _defaultSecurity, +}) => + Argon2( + salt: salt, + type: Argon2Type.argon2d, + hashLength: hashLength, + iterations: security.t, + parallelism: security.p, + memorySizeKB: security.m, + key: key, + personalization: personalization, + ).convert(password); + +/// Encode a password using default Argon2i algorithm +/// +/// Parameters: +/// - [password] is the raw password to be encoded +/// - [salt] should be at least 8 bytes long. 16 bytes is recommended. +/// - [security] is the parameter choice for the algorithm. +/// - [hashLength] is the number of output bytes +/// - [key] is an optional key bytes to use +/// - [personalization] is optional additional data bytes +/// +/// +Argon2HashDigest argon2i( + List password, + List salt, { + int? hashLength, + List? key, + List? personalization, + Argon2Security security = _defaultSecurity, +}) => + Argon2( + salt: salt, + type: Argon2Type.argon2i, + hashLength: hashLength, + iterations: security.t, + parallelism: security.p, + memorySizeKB: security.m, + key: key, + personalization: personalization, + ).convert(password); + +/// Encode a password using default Argon2id algorithm +/// +/// Parameters: +/// - [password] is the raw password to be encoded +/// - [salt] should be at least 8 bytes long. 16 bytes is recommended. +/// - [security] is the parameter choice for the algorithm. +/// - [hashLength] is the number of output bytes +/// - [key] is an optional key bytes to use +/// - [personalization] is optional additional data bytes +Argon2HashDigest argon2id( + List password, + List salt, { + int? hashLength, + List? key, + List? personalization, + Argon2Security security = _defaultSecurity, +}) => + Argon2( + salt: salt, + type: Argon2Type.argon2id, + hashLength: hashLength, + iterations: security.t, + parallelism: security.p, + memorySizeKB: security.m, + key: key, + personalization: personalization, + ).convert(password); diff --git a/hashlib/lib/src/bcrypt.dart b/hashlib/lib/src/bcrypt.dart new file mode 100644 index 0000000..dfdde97 --- /dev/null +++ b/hashlib/lib/src/bcrypt.dart @@ -0,0 +1,88 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/bcrypt/bcrypt.dart'; +import 'package:hashlib/src/algorithms/bcrypt/common.dart'; +import 'package:hashlib/src/algorithms/bcrypt/security.dart'; + +export 'algorithms/bcrypt/bcrypt.dart' show Bcrypt; +export 'algorithms/bcrypt/common.dart' + show BcryptContext, BcryptHashDigest, BcryptVersion; +export 'algorithms/bcrypt/security.dart' show BcryptSecurity; + +/// Generate a secure password using the [Bcrypt] algorithm. +/// +/// [Bcrypt][wiki] is a password hashing algorithm based on the Blowfish cipher. +/// It uses a unique salt and a configurable cost factor to prevent rainbow +/// table attacks and remain secure as hardware improves. Bcrypt's iterative +/// hashing and expensive key setup phase ensure resistance to brute-force +/// attacks. +/// +/// Parameters: +/// - [password] : The password to hash. The algorithm uses first 72 bytes, and +/// the rest are ignored. +/// - [salt] : An randomly generated 16-byte string. +/// - [nb] : Number of rounds in terms of power of 2. 0 < [nb] < 31 +/// - [version] : The [BcryptVersion] to use. Default [BcryptVersion.$2b] +/// - [security] : The default parameter source for [nb] if not provided +/// (default is [BcryptSecurity.good]). +/// +/// [wiki]: https://en.wikipedia.org/wiki/Bcrypt +BcryptHashDigest bcryptDigest( + List password, { + List? salt, + BcryptVersion version = BcryptVersion.$2b, + BcryptSecurity security = BcryptSecurity.good, + int? nb, +}) => + Bcrypt( + version: version, + salt: salt, + cost: nb ?? security.nb, + ).convert(password); + +/// Generate the encoded salt to be used by the [Bcrypt] algorithm. +/// +/// Parameters: +/// - [nb] : Number of rounds in terms of power of 2. 0 < [nb] < 31 +/// - [version] : The [BcryptVersion] to use. Default [BcryptVersion.$2b] +/// - [security] : The default parameter source for [nb] if not provided +/// (default is [BcryptSecurity.good]). +String bcryptSalt({ + int? nb, + BcryptVersion version = BcryptVersion.$2b, + BcryptSecurity security = BcryptSecurity.good, +}) => + BcryptContext( + version: version, + cost: nb ?? security.nb, + ).toEncoded(); + +/// Generates a secure password using the [Bcrypt] algorithm, and returns a +/// 60-byte encoded string containing the version, cost, salt, and password. +/// +/// Parameters: +/// - [password] : The password to hash. The algorithm uses first 72 bytes, and +/// the rest are ignored. +/// - [salt] : Encoded salt, e.g.: `$2b$04$SQe9knOzepOVKoYXo9xTte` +/// If not provided, [bcryptSalt] is used to get a random one. +/// +/// **Note**: Complete encoded string is also accepted, e.g.: +/// `$2b$04$SQe9knOzepOVKoYXo9xTteNYr6MBwVz4tpriJVe3PNgYufGIsgKcW` +String bcrypt(List password, [String? salt]) => + Bcrypt.fromEncoded(fromCrypt(salt ?? bcryptSalt())) + .convert(password) + .encoded(); + +/// Verifies if the [plain] password was derived from the [encoded] hash. +/// +/// The encoded hash may look like this: +/// `$2b$04$SQe9knOzepOVKoYXo9xTteNYr6MBwVz4tpriJVe3PNgYufGIsgKcW` +bool bcryptVerify(String encoded, List plain) { + var data = fromCrypt(encoded); + var hash = data.hash!.substring(22); + var hashBytes = fromBase64(hash, codec: Base64Codec.bcrypt); + var instance = Bcrypt.fromEncoded(data); + return instance.verify(hashBytes, plain); +} diff --git a/hashlib/lib/src/blake2b.dart b/hashlib/lib/src/blake2b.dart new file mode 100644 index 0000000..e37e77d --- /dev/null +++ b/hashlib/lib/src/blake2b.dart @@ -0,0 +1,126 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/blake2/blake2b.dart'; +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +export 'algorithms/blake2/blake2b.dart' show Blake2bHash; + +/// For generating un-keyed message digest with BLAKE2b-160. +/// +/// Use [Blake2b] for keyed hash generation. +const Blake2b blake2b160 = Blake2b._(160 >>> 3); + +/// For generating un-keyed message digest with BLAKE2b-256. +/// +/// Use [Blake2b] for keyed hash generation. +const Blake2b blake2b256 = Blake2b._(256 >>> 3); + +/// For generating un-keyed message digest with BLAKE2b-384. +/// +/// Use [Blake2b] for keyed hash generation. +const Blake2b blake2b384 = Blake2b._(384 >>> 3); + +/// For generating un-keyed message digest with BLAKE2b-512. +/// +/// Use [Blake2b] for keyed hash generation. +const Blake2b blake2b512 = Blake2b._(512 >>> 3); + +/// Blake2b is a highly secure cryptographic hash function optimized for 64-bit +/// platforms. It generates hash values of data ranging from 1 to 64 bytes in +/// size. It doesn't require a separate keying mechanism and can be used in +/// various applications, serving as a more efficient alternative to other hash +/// algorithms like SHA and HMAC-SHA. +/// +/// This implementation is based on the [RFC-7693][rfc] +/// +/// [rfc]: https://www.ietf.org/rfc/rfc7693.html +class Blake2b extends BlockHashBase with MACHashBase { + final List? _key; + final List? _salt; + final List? _aad; + + /// The number of bytes in the output. + final int digestSize; + + @override + final String name; + + const Blake2b._( + this.digestSize, [ + this._key, + this._salt, + this._aad, + String? _name, + ]) : name = _name ?? 'BLAKE2b-${digestSize << 3}'; + + /// Creates an instance to generate hash using BLAKE-2b algorithm. + /// + /// Parameters: + /// - [digestSize] The number of bytes in the output. + /// - [salt] An optional nonce. Must be exactly 16 bytes long. + /// - [aad] Second optional nonce. Must be exactly 16 bytes long. + /// + /// See also: + /// - [mac] or [Blake2bMAC] for generating MAC with this algorithm. + factory Blake2b( + int digestSize, { + List? salt, + List? aad, + }) => + Blake2b._(digestSize, null, salt, aad); + + @override + Blake2bHash createSink() => Blake2bHash( + digestSize, + key: _key, + salt: _salt, + aad: _aad, + ); + + /// Get a builder to generate MAC using this algorithm. + /// + /// Example: + /// ``` + /// final key = 'secret key'.codeUnits; + /// final message = 'plain message'.codeUnits; + /// final mac = blake2s256.mac.by(key).convert(message); + /// ``` + Blake2bMAC get mac => Blake2bMAC(digestSize); +} + +/// A MAC generator based on Blake2b algorithm. +class Blake2bMAC extends MACHash { + /// The number of bytes in the output. + final int digestSize; + + @override + final String name; + + /// Creates an instance to generate MAC using BLAKE-2b algorithm. + /// + /// Parameters: + /// - [digestSize] The number of bytes in the output. + /// + /// See also: + /// - [Blake2b] for generating hash only. + const Blake2bMAC( + this.digestSize, + ) : name = 'BLAKE2b-${digestSize << 3}/MAC'; + + /// Get an [MACHashBase] instance initialized by a [key]. + /// + /// Parameters: + /// - [key] An optional key for MAC generation. Should not exceed 64 bytes. + /// - [salt] An optional nonce. Must be exactly 16 bytes long. + /// - [aad] Second optional nonce. Must be exactly 16 bytes long. + @override + @pragma('vm:prefer-inline') + MACHashBase by( + List key, { + List? salt, + List? aad, + }) => + Blake2b._(digestSize, key, salt, aad, name); +} diff --git a/hashlib/lib/src/blake2s.dart b/hashlib/lib/src/blake2s.dart new file mode 100644 index 0000000..e47a09d --- /dev/null +++ b/hashlib/lib/src/blake2s.dart @@ -0,0 +1,125 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/blake2/blake2s.dart'; +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +export 'algorithms/blake2/blake2s.dart' show Blake2sHash; + +/// For generating un-keyed message digest with BLAKE2s-128. +/// +/// Use [Blake2s] for keyed hash generation. +const Blake2s blake2s128 = Blake2s._(128 >>> 3); + +/// For generating un-keyed message digest with BLAKE2s-160. +/// +/// Use [Blake2s] for keyed hash generation. +const Blake2s blake2s160 = Blake2s._(160 >>> 3); + +/// For generating un-keyed message digest with BLAKE2s-224. +/// +/// Use [Blake2s] for keyed hash generation. +const Blake2s blake2s224 = Blake2s._(224 >>> 3); + +/// For generating un-keyed message digest with BLAKE2s-256. +/// +/// Use [Blake2s] for keyed hash generation. +const Blake2s blake2s256 = Blake2s._(256 >>> 3); + +/// Blake2s is a cryptographic hash function optimized for 8-bit to 32-bit +/// platforms. It generates hash values of data ranging from 1 to 32 bytes in +/// size. Blake2s is highly secure and can be used in various applications as a +/// fast and secure replacement for legacy algorithms like MD5 and HMAC-MD5. +/// +/// This implementation is based on the [RFC-7693][rfc] +/// +/// [rfc]: https://www.ietf.org/rfc/rfc7693.html +class Blake2s extends BlockHashBase with MACHashBase { + final List? _key; + final List? _salt; + final List? _aad; + + /// The number of bytes in the output. + final int digestSize; + + @override + final String name; + + const Blake2s._( + this.digestSize, [ + this._key, + this._salt, + this._aad, + String? _name, + ]) : name = _name ?? 'BLAKE2s-${digestSize << 3}'; + + /// Creates an instance to generate hash using BLAKE-2s algorithm. + /// + /// Parameters: + /// - [digestSize] The number of bytes in the output. + /// - [salt] An optional nonce. Must be exactly 8 bytes long. + /// - [aad] Second optional nonce. Must be exactly 8 bytes long. + /// + /// See also: + /// - [mac] or [Blake2sMAC] for generating MAC with this algorithm. + factory Blake2s( + int digestSize, { + List? salt, + List? aad, + }) => + Blake2s._(digestSize, null, salt, aad); + + @override + Blake2sHash createSink() => Blake2sHash( + digestSize, + key: _key, + salt: _salt, + aad: _aad, + ); + + /// Get a builder to generate MAC using this algorithm. + /// + /// Example: + /// ``` + /// final key = 'secret key'.codeUnits; + /// final message = 'plain message'.codeUnits; + /// final mac = blake2s256.mac.by(key).convert(message); + /// ``` + Blake2sMAC get mac => Blake2sMAC(digestSize); +} + +/// A MAC generator based on Blake2s algorithm. +class Blake2sMAC extends MACHash { + /// The number of bytes in the output. + final int digestSize; + + @override + final String name; + + /// Creates an instance to generate MAC using BLAKE-2s algorithm. + /// + /// Parameters: + /// - [digestSize] The number of bytes in the output. + /// + /// See also: + /// - [Blake2s] for generating hash only. + const Blake2sMAC( + this.digestSize, + ) : name = 'BLAKE2s-${digestSize << 3}/MAC'; + + /// Get an [MACHashBase] instance initialized by a [key]. + /// + /// Parameters: + /// - [key] The key for MAC generation. Should not exceed 32 bytes. + /// - [salt] An optional nonce. Must be exactly 8 bytes long. + /// - [aad] Second optional nonce. Must be exactly 8 bytes long. + @override + @pragma('vm:prefer-inline') + MACHashBase by( + List key, { + List? salt, + List? aad, + }) => + Blake2s._(digestSize, key, salt, aad, name); +} diff --git a/hashlib/lib/src/core/block_hash.dart b/hashlib/lib/src/core/block_hash.dart new file mode 100644 index 0000000..6da21c9 --- /dev/null +++ b/hashlib/lib/src/core/block_hash.dart @@ -0,0 +1,82 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/core/hash_base.dart'; + +/// Base class used by block hash algorithms +abstract class BlockHashBase extends HashBase { + const BlockHashBase(); +} + +/// Base class used by block hash algorithm sink implementations +abstract class BlockHashSink extends HashDigestSink { + /// The current position of data in the [buffer] + int pos = 0; + + /// The message length in bytes + int messageLength = 0; + + /// The internal block length of the algorithm in bytes + final int blockLength; + + /// The main buffer + final Uint8List buffer; + + /// The [buffer] as Uint32List + late final Uint32List sbuffer = Uint32List.view(buffer.buffer); + + /// The [buffer] as ByteData + late final ByteData bdata = buffer.buffer.asByteData(); + + /// Get the message length in bits + int get messageLengthInBits => messageLength << 3; + + /// Initialize a new sink for the block hash + /// + /// Parameters: + /// - [blockLength] is the length of each block in each [$update] call. + /// - [bufferLength] is the buffer length where blocks are stored temporarily + BlockHashSink(this.blockLength, {int? bufferLength}) + : assert(blockLength > 0 && (bufferLength ?? 0) >= 0), + buffer = Uint8List(bufferLength ?? blockLength); + + @override + void reset() { + pos = 0; + messageLength = 0; + super.reset(); + } + + @override + void $process(List chunk, int start, int end) { + int t = start; + if (pos > 0) { + for (; t < end && pos < blockLength; pos++, t++) { + buffer[pos] = chunk[t]; + } + messageLength += t - start; + if (pos < blockLength) return; + + $update(buffer); + pos = 0; + } + + while ((end - t) >= blockLength) { + messageLength += blockLength; + $update(chunk, t); + t += blockLength; + } + + messageLength += end - t; + for (; t < end; pos++, t++) { + buffer[pos] = chunk[t]; + } + } + + /// Internal method to update the message-digest with a single [block]. + /// + /// The method starts reading the block from [offset] index + void $update(List block, [int offset = 0, bool last = false]); +} diff --git a/hashlib/lib/src/core/hash_base.dart b/hashlib/lib/src/core/hash_base.dart new file mode 100644 index 0000000..722e5bd --- /dev/null +++ b/hashlib/lib/src/core/hash_base.dart @@ -0,0 +1,170 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:convert' show Encoding; +import 'dart:typed_data' show Uint8List; + +import 'package:hashlib/src/core/hash_digest.dart'; + +export 'hash_base_stub.dart' if (dart.library.io) 'hash_base_io.dart'; + +/// This sink allows adding arbitrary length byte arrays +/// and produces a [HashDigest] on [close]. +abstract class HashDigestSink implements Sink> { + HashDigestSink(); + + /// The flag tracking if the [digest] is called once. + bool _closed = false; + + /// The message digest (available after the [digest] call) + late HashDigest _digest; + + /// Returns true if the sink is closed, false otherwise + bool get closed => _closed; + + /// The length of generated hash in bytes + int get hashLength; + + /// Resets the current state to start from fresh state + void reset() { + _closed = false; + } + + /// Adds [data] to the message-digest. + /// + /// Throws [StateError], if it is called after closing the digest. + @override + void add(List data, [int start = 0, int? end]) { + if (_closed) { + throw StateError('The message-digest is already closed'); + } + $process(data, start, end ?? data.length); + } + + /// Processes a chunk of input data + void $process(List chunk, int start, int end); + + /// Finalizes the message-digest and returns a [HashDigest] + HashDigest digest() { + if (_closed) return _digest; + _digest = HashDigest($finalize()); + _closed = true; + return _digest; + } + + /// Finalizes the message digest with the remaining message block, + /// and returns the output as byte array. + Uint8List $finalize(); + + /// Finalizes the message-digest. It calls [digest] method internally. + @override + @pragma('vm:prefer-inline') + void close() => digest(); +} + +/// The base class used by the hash algorithm implementations. It implements +/// the [StreamTransformer] and exposes few convenient methods to handle any +/// types of data source. +abstract class HashBase + implements StreamTransformer, HashDigest> { + const HashBase(); + + /// The name of this algorithm + String get name; + + /// Create a [HashDigestSink] for generating message-digests + T createSink(); + + /// Process the byte array [input] and returns a [HashDigest]. + @pragma('vm:prefer-inline') + HashDigest convert(List input) { + var sink = createSink(); + sink.add(input); + return sink.digest(); + } + + /// Process the byte array [input] and returns a hash in hexadecimal. + @pragma('vm:prefer-inline') + String hex(List input) => convert(input).hex(); + + /// Process the [input] string and returns a [HashDigest]. + /// + /// If [encoding] is not specified, the [String.codeUnits] are used. + HashDigest string(String input, [Encoding? encoding]) { + var sink = createSink(); + if (encoding != null) { + sink.add(encoding.encode(input)); + } else { + sink.add(input.codeUnits); + } + return sink.digest(); + } + + /// Transforms the byte array input stream to generate a new stream + /// which contains a single [HashDigest] + /// + /// The expected behavior of this method is described below: + /// + /// - When the returned stream has a subscriber (calling [Stream.listen]), + /// the message-digest generation begins from the input [stream]. + /// - If the returned stream is paused, the processing of the input [stream] + /// is also paused, and on resume, it continue processing from where it was + /// left off. + /// - If the returned stream is cancelled, the subscription to the input + /// [stream] is also cancelled. + /// - When the input [stream] is closed, the returned stream also gets closed + /// with a [HashDigest] data. The returned stream may produce only one + /// such data event in its life-time. + /// - On error reading the input [stream], or while processing the message + /// digest, the subscription to input [stream] cancels immediately and the + /// returned stream closes with an error event. + @override + Stream bind(Stream> stream) async* { + var sink = createSink(); + await for (var x in stream) { + sink.add(x); + } + yield sink.digest(); + } + + /// Consumes the entire [stream] of byte array and generates a [HashDigest]. + Future byteStream( + Stream stream, [ + int bufferSize = 1024, + ]) async { + var sink = createSink(); + var buffer = Uint8List(bufferSize); + int p = 0; + await for (var x in stream) { + buffer[p++] = x; + if (p == bufferSize) { + sink.add(buffer); + p = 0; + } + } + if (p > 0) { + sink.add(buffer, 0, p); + } + return sink.digest(); + } + + /// Consumes the entire [stream] of string and generates a [HashDigest]. + /// + /// If [encoding] is not specified, the [String.codeUnits] are used. + Future stringStraem( + Stream stream, [ + Encoding? encoding, + ]) { + if (encoding == null) { + return bind(stream.map((s) => s.codeUnits)).first; + } else { + return bind(stream.transform(encoding.encoder)).first; + } + } + + @override + StreamTransformer cast() { + throw UnsupportedError('The transformer do not support casting'); + } +} diff --git a/hashlib/lib/src/core/hash_base_io.dart b/hashlib/lib/src/core/hash_base_io.dart new file mode 100644 index 0000000..193a029 --- /dev/null +++ b/hashlib/lib/src/core/hash_base_io.dart @@ -0,0 +1,55 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'hash_base.dart'; +import 'hash_digest.dart'; + +/// Extends the base hash algorithm class with file IO support +extension HashBaseFileSupport on HashBase { + /// Converts the [input] file and returns a [HashDigest] asynchronously. + /// + /// If [start] is present, the file will be read from byte-offset [start]. + /// Otherwise from the beginning (index 0). + /// + /// If [end] is present, only bytes up to byte-index [end] will be read. + /// Otherwise, until end of file. + @pragma('vm:prefer-inline') + Future file(File input, [int start = 0, int? end]) { + return bind(input.openRead(start, end)).first; + } + + /// Converts the [input] file and returns a [HashDigest] synchronously. + /// + /// If [start] is present, the file will be read from byte-offset [start]. + /// Otherwise from the beginning (index 0). + /// + /// If [end] is present, only bytes up to byte-index [end] will be read. + /// Otherwise, until end of file. + /// + /// If [bufferSize] is present, the file will be read in chunks of this size. + /// By default the [bufferSize] is `2048`. + HashDigest fileSync( + File input, { + int start = 0, + int? end, + int bufferSize = 2048, + }) { + var raf = input.openSync(); + try { + var sink = createSink(); + var buffer = Uint8List(bufferSize); + int length = end ?? raf.lengthSync(); + for (int i = start, l; i < length; i += l) { + l = raf.readIntoSync(buffer); + sink.add(buffer, 0, l); + } + return sink.digest(); + } finally { + raf.closeSync(); + } + } +} diff --git a/hashlib/lib/src/core/hash_base_stub.dart b/hashlib/lib/src/core/hash_base_stub.dart new file mode 100644 index 0000000..18da769 --- /dev/null +++ b/hashlib/lib/src/core/hash_base_stub.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; + +import 'hash_base.dart'; +import 'hash_digest.dart'; + +/// Stub for machines that does not have file IO support. +extension HashBaseFileSupport on HashBase { + /// Converts the [input] file and returns a [HashDigest] asynchronously. + /// + /// If [start] is present, the file will be read from byte-offset [start]. + /// Otherwise from the beginning (index 0). + /// + /// If [end] is present, only bytes up to byte-index [end] will be read. + /// Otherwise, until end of file. + @pragma('vm:prefer-inline') + Future file(dynamic input, [int start = 0, int? end]) { + throw UnsupportedError('Unavailable for this platform'); + } + + /// Converts the [input] file and returns a [HashDigest] synchronously. + /// + /// If [start] is present, the file will be read from byte-offset [start]. + /// Otherwise from the beginning (index 0). + /// + /// If [end] is present, only bytes up to byte-index [end] will be read. + /// Otherwise, until end of file. + /// + /// If [bufferSize] is present, the file will be read in chunks of this size. + /// By default the [bufferSize] is `2048`. + HashDigest fileSync( + dynamic input, { + int start = 0, + int? end, + int bufferSize = 2048, + }) { + throw UnsupportedError('Unavailable for this platform'); + } +} diff --git a/hashlib/lib/src/core/hash_digest.dart b/hashlib/lib/src/core/hash_digest.dart new file mode 100644 index 0000000..45d4f2f --- /dev/null +++ b/hashlib/lib/src/core/hash_digest.dart @@ -0,0 +1,146 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert' as cvt; +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; + +/// This holds generated hash digest and provides utilities to extract it in +/// multiple formats. +class HashDigest extends Object { + final Uint8List bytes; + + const HashDigest(this.bytes); + + /// Returns the length of this digest in bytes. + int get length => bytes.length; + + /// Returns the byte buffer associated with this digest. + ByteBuffer get buffer => bytes.buffer; + + /// The message digest as a string of hexadecimal digits. + @override + String toString() => hex(); + + /// The message digest as a binary string. + String binary() => toBinary(bytes); + + /// The message digest as a octal string. + String octal() => toOctal(bytes); + + /// The message digest as a hexadecimal string. + /// + /// Parameters: + /// - If [upper] is true, the string will be in uppercase alphabets. + String hex([bool upper = false]) => toHex(bytes, upper: upper); + + /// The message digest as a Base-32 string. + /// + /// If [upper] is true, the output will have uppercase alphabets. + /// If [padding] is true, the output will have `=` padding at the end. + String base32({bool upper = true, bool padding = true}) => + toBase32(bytes, lower: !upper, padding: padding); + + /// The message digest as a Base-64 string with no padding. + /// + /// If [urlSafe] is true, the output will have URL-safe base64 alphabets. + /// If [padding] is true, the output will have `=` padding at the end. + String base64({bool urlSafe = false, bool padding = true}) => + toBase64(bytes, padding: padding, url: urlSafe); + + /// The message digest as a BigInt. + /// + /// If [endian] is [Endian.little], it will treat the digest bytes as a little + /// endian number; Otherwise, if [endian] is [Endian.big], it will treat the + /// digest bytes as a big endian number. + BigInt bigInt({Endian endian = Endian.little}) => + toBigInt(bytes, msbFirst: endian == Endian.big); + + /// Gets unsiged integer of [bitLength]-bit from the message digest. + /// + /// If [endian] is [Endian.little], it will treat the digest bytes as a little + /// endian number; Otherwise, if [endian] is [Endian.big], it will treat the + /// digest bytes as a big endian number. + int number([int bitLength = 64, Endian endian = Endian.big]) { + if (bitLength < 8 || bitLength > 64 || (bitLength & 7) > 0) { + throw ArgumentError( + 'Invalid bit length. ' + 'It must be a number between 8 to 64 and a multiple of 8.', + ); + } else { + bitLength >>>= 3; + } + int result = 0; + int n = bytes.length; + if (endian == Endian.little) { + for (int i = (n > bitLength ? bitLength : n) - 1; i >= 0; i--) { + result <<= 8; + result |= bytes[i]; + } + } else { + for (int i = n > bitLength ? n - bitLength : 0; i < n; i++) { + result <<= 8; + result |= bytes[i]; + } + } + return result; + } + + /// The message digest as a string of ASCII alphabets. + String ascii() => cvt.ascii.decode(bytes); + + /// The message digest as a string of UTF-8 alphabets. + String utf8() => cvt.utf8.decode(bytes); + + /// Returns the digest in the given [encoding] + String to(cvt.Encoding encoding) => encoding.decode(bytes); + + @override + int get hashCode => bytes.hashCode; + + @override + bool operator ==(Object other) => other is HashDigest && bytes == other.bytes; + + /// Checks if the message digest equals to [other]. + /// + /// Here, the [other] can be a one of the following: + /// - Another [HashDigest] object. + /// - An [Iterable] containing an array of bytes + /// - Any [ByteBuffer] or [TypedData] that will be converted to [Uint8List] + /// - A [String], which will be treated as a hexadecimal encoded byte array + /// + /// This function will return True if all bytes in the [other] matches with + /// the [bytes] of this object. If the length does not match, or the type of + /// [other] is not supported, it returns False immediately. + bool isEqual(dynamic other) { + if (other is HashDigest) { + return isEqual(other.bytes); + } else if (other is ByteBuffer) { + return isEqual(Uint8List.view(buffer)); + } else if (other is TypedData && other is! Uint8List) { + return isEqual(Uint8List.view(other.buffer)); + } else if (other is String) { + return isEqual(fromHex(other)); + } else if (other is List) { + if (other.length != bytes.length) { + return false; + } + for (int i = 0; i < bytes.length; ++i) { + if (other[i] != bytes[i++]) { + return false; + } + } + return true; + } else if (other is Iterable) { + int i = 0; + for (int x in other) { + if (i >= bytes.length || x != bytes[i++]) { + return false; + } + } + return true; + } + return false; + } +} diff --git a/hashlib/lib/src/core/kdf_base.dart b/hashlib/lib/src/core/kdf_base.dart new file mode 100644 index 0000000..b621517 --- /dev/null +++ b/hashlib/lib/src/core/kdf_base.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/core/hash_digest.dart'; + +/// Base class for key generator algorithms +abstract class KeyDerivatorBase { + const KeyDerivatorBase(); + + /// The name of this algorithm + String get name; + + /// The length of derived key in bytes + int get derivedKeyLength; + + /// Generate a derived key from a [password] + HashDigest convert(List password); + + /// Returns the derived key in hexadecimal. + @pragma('vm:prefer-inline') + String hex(List password) => convert(password).hex(); + + /// Process the [password] string and returns derived key as [HashDigest]. + /// + /// If [encoding] is not specified, the [String.codeUnits] are used. + @pragma('vm:prefer-inline') + HashDigest string(String password, [Encoding? encoding]) => convert( + encoding != null ? encoding.encode(password) : password.codeUnits, + ); + + /// Verify if the [derivedKey] was derived from the original [password] + /// using the current parameters. + bool verify(List derivedKey, List password) { + if (derivedKey.length != derivedKeyLength) { + return false; + } + var other = convert(password).bytes; + for (int i = 0; i < other.length; ++i) { + if (derivedKey[i] != other[i]) { + return false; + } + } + return true; + } +} diff --git a/hashlib/lib/src/core/mac_base.dart b/hashlib/lib/src/core/mac_base.dart new file mode 100644 index 0000000..520b0b6 --- /dev/null +++ b/hashlib/lib/src/core/mac_base.dart @@ -0,0 +1,52 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/core/hash_base.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; + +/// Base class for the sink used by Message-Authentication-Code generators +abstract class MACSinkBase extends HashDigestSink { + /// The length of generated key in bytes + int get derivedKeyLength => hashLength; +} + +/// This can be used as a mixin for MAC algorithm interfaces +abstract class MACHashBase implements HashBase { + /// Signing the [message] using this MAC to generate a tag. + @pragma('vm:prefer-inline') + HashDigest sign(List message) => convert(message); + + /// Verify if the [tag] is derived from the [message] using this MAC. + @pragma('vm:prefer-inline') + bool verify(List tag, List message) => + convert(message).isEqual(tag); +} + +abstract class MACHash { + const MACHash(); + + /// The name of this algorithm + String get name; + + /// Get a [MACHashBase] instance initialized by a [key]. + @pragma('vm:prefer-inline') + MACHashBase by(List key); + + /// Get a [MACHashBase] instance initialized by a string [key]. + /// + /// If [encoding] is not specified, the [String.codeUnits] are used. + @pragma('vm:prefer-inline') + MACHashBase byString(String key, [Encoding? encoding]) => + by(encoding != null ? encoding.encode(key) : key.codeUnits); + + /// Signing the [message] using a [key] to generate a tag. + @pragma('vm:prefer-inline') + HashDigest sign(List key, List message) => by(key).sign(message); + + /// Verify if the [tag] is derived from the [message] using a [key]. + @pragma('vm:prefer-inline') + bool verify(List key, List tag, List message) => + by(key).verify(tag, message); +} diff --git a/hashlib/lib/src/core/otpauth.dart b/hashlib/lib/src/core/otpauth.dart new file mode 100644 index 0000000..bb6a758 --- /dev/null +++ b/hashlib/lib/src/core/otpauth.dart @@ -0,0 +1,30 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +/// Represents an abstract class for implementing [ One-Time Password (OTP) +/// authentication ][rfc2289] methods in Dart. +/// +/// This class provides a foundation for creating variable length OTP generation +/// algorithms. Subclasses must implement the [value] method to generate OTP +/// values based on a specific algorithm. +/// +/// [rfc2289]: https://www.ietf.org/rfc/rfc2289.html +abstract class OTPAuth { + /// The number of digits in the generated OTP + final int digits; + final String? label; + final String? issuer; + + const OTPAuth( + this.digits, { + this.label, + this.issuer, + }) : assert(digits >= 4); + + /// Generates the next OTP value + int value(); + + /// Returns the next OTP value as string + @pragma('vm:prefer-inline') + String valueString() => value().toString().padLeft(digits, '0'); +} diff --git a/hashlib/lib/src/core/registry.dart b/hashlib/lib/src/core/registry.dart new file mode 100644 index 0000000..c914154 --- /dev/null +++ b/hashlib/lib/src/core/registry.dart @@ -0,0 +1,141 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; + +const int _zero = 48; +const int _nine = 57; +const int _smallA = 97; +const int _smallZ = 122; +const int _bigA = 65; +const int _bigZ = 90; + +final _hash = {}; +final _blockHash = {}; + +/// Transform [value] to uppercase and keeps only letters and digits. +@Deprecated('It will be removed in 2.0.0') +String normalizeName(String value) { + List normal = []; + for (int c in value.codeUnits) { + if ((c >= _zero && c <= _nine) || (c >= _bigA && c <= _bigZ)) { + normal.add(c); + } else if (c >= _smallA && c <= _smallZ) { + normal.add(c - _smallA + _bigA); + } + } + return String.fromCharCodes(normal); +} + +@pragma('vm:prefer-inline') +String _norm(String name) => + // ignore: deprecated_member_use_from_same_package + normalizeName(name); + +void _buildRegistry() { + if (_hash.isNotEmpty) return; + + _hash.addAll({ + _norm(adler32.name): adler32, + _norm(crc16.name): crc16, + _norm(crc32.name): crc32, + _norm(crc64.name): crc64, + }); + + _blockHash.addAll({ + _norm(blake2b160.name): blake2b160, + _norm(blake2b256.name): blake2b256, + _norm(blake2b384.name): blake2b384, + _norm(blake2b512.name): blake2b512, + _norm('BLAKE2'): blake2b512, + _norm('BLAKE2b'): blake2b512, + _norm(blake2s128.name): blake2s128, + _norm(blake2s160.name): blake2s160, + _norm(blake2s224.name): blake2s224, + _norm(blake2s256.name): blake2s256, + _norm('BLAKE2s'): blake2s256, + _norm(keccak224.name): keccak224, + _norm(keccak256.name): keccak256, + _norm(keccak384.name): keccak384, + _norm(keccak512.name): keccak512, + _norm(md2.name): md2, + _norm(md4.name): md4, + _norm(md5.name): md5, + _norm(ripemd128.name): ripemd128, + _norm(ripemd160.name): ripemd160, + _norm(ripemd256.name): ripemd256, + _norm(ripemd320.name): ripemd320, + _norm(sha1.name): sha1, + _norm(sha3_224.name): sha3_224, + _norm(sha3_256.name): sha3_256, + _norm(sha3_384.name): sha3_384, + _norm(sha3_512.name): sha3_512, + _norm('SHA3'): sha3_512, + _norm(sha224.name): sha224, + _norm(sha256.name): sha256, + _norm('SHA2'): sha256, + _norm(sha384.name): sha384, + _norm(sha512.name): sha512, + _norm(sha512t224.name): sha512t224, + _norm(sha512t256.name): sha512t256, + _norm(shake128_128.name): shake128_128, + _norm(shake128_160.name): shake128_160, + _norm(shake128_224.name): shake128_224, + _norm(shake128_256.name): shake128_256, + _norm('SHAKE-128'): shake128_256, + _norm(shake128_384.name): shake128_384, + _norm(shake128_512.name): shake128_512, + _norm(shake256_128.name): shake256_128, + _norm(shake256_160.name): shake256_160, + _norm(shake256_224.name): shake256_224, + _norm(shake256_256.name): shake256_256, + _norm(shake256_384.name): shake256_384, + _norm(shake256_512.name): shake256_512, + _norm('SHAKE-512'): shake256_512, + _norm(sm3.name): sm3, + _norm(xxh3.name): xxh3, + _norm('XXH3-64'): xxh3, + _norm(xxh32.name): xxh32, + _norm(xxh64.name): xxh64, + _norm(xxh128.name): xxh128, + _norm('XXH3-128'): xxh128, + }); + _hash.addAll(_blockHash); +} + +/// A registry to find a block hash algorithm by name +@Deprecated('It will be removed in 2.0.0') +class BlockHashRegistry { + /// Find a [BlockHashBase] algorithm given a string name + static BlockHashBase? lookup(String name) { + _buildRegistry(); + return _blockHash[_norm(name)]; + } + + /// Register a new [BlockHashBase] algorithm on the fly given a string name + static void register(BlockHashBase algo, [String? name]) { + _buildRegistry(); + name = _norm(name ?? algo.name); + _blockHash[name] = algo; + } +} + +/// A registry to find a hash algorithm by name +@Deprecated('It will be removed in 2.0.0') +class HashRegistry { + /// Find a [HashBase] algorithm given a string name + static HashBase? lookup(String name) { + _buildRegistry(); + return _hash[_norm(name)]; + } + + /// Register a new [HashBase] algorithm on the fly given a string name + static void register(HashBase algo, [String? name]) { + _buildRegistry(); + name = _norm(name ?? algo.name); + _hash[name] = algo; + if (algo is BlockHashBase) { + _blockHash[name] = algo; + } + } +} diff --git a/hashlib/lib/src/crc16.dart b/hashlib/lib/src/crc16.dart new file mode 100644 index 0000000..484756f --- /dev/null +++ b/hashlib/lib/src/crc16.dart @@ -0,0 +1,52 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/crc/crc16.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +export 'package:hashlib/src/algorithms/crc/crc16.dart' + show CRC16Hash, CRC16Params; + +/// A CRC or cyclic redundancy check is code commonly used for error detection +/// and correction of digital data. This generates a 16-bit number as output. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const crc16 = CRC16(CRC16Params.ibm); + +/// CRC-16 code generator +class CRC16 extends HashBase { + final CRC16Params params; + + /// Create a instance for generating CRC-16 hashes + const CRC16(this.params); + + @override + String get name => "CRC-16/${params.name}"; + + @override + CRC16Hash createSink() => + params.reversed ? CRC16ReverseHash(params) : CRC16NormalHash(params); + + /// Gets the CRC-16 code for a String + /// + /// Parameters: + /// - [input] is the string to hash + /// - The [encoding] is the encoding to use. Default is `input.codeUnits` + int code(String input, [Encoding? encoding]) => + string(input, encoding).number(); +} + +/// Gets the CRC-16 value. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - The [params] is the parameters to use. Default: [CRC16Params.ansi] +int crc16code( + String input, { + Encoding? encoding, + CRC16Params params = CRC16Params.ansi, +}) => + CRC16(params).code(input, encoding); diff --git a/hashlib/lib/src/crc32.dart b/hashlib/lib/src/crc32.dart new file mode 100644 index 0000000..d7c7f5f --- /dev/null +++ b/hashlib/lib/src/crc32.dart @@ -0,0 +1,55 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/crc/crc32.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +export 'package:hashlib/src/algorithms/crc/crc32.dart' + show CRC32Hash, CRC32Params; + +/// A CRC-32 code generator with **IEEE** 802.3 CRC-32 polynomial. +/// +/// A CRC or cyclic redundancy check is code commonly used for error detection +/// and correction of digital data. This generates a 32-bit number as output. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const crc32 = CRC32(CRC32Params.ieee); + +/// CRC-32 code generator +class CRC32 extends HashBase { + final CRC32Params params; + + /// Create a instance for generating CRC-32 hashes + const CRC32(this.params); + + @override + String get name => "CRC-32/${params.name}"; + + @override + CRC32Hash createSink() => + params.reversed ? CRC32ReverseHash(params) : CRC32NormalHash(params); + + /// Gets the CRC-32 code for a String + /// + /// Parameters: + /// - [input] is the string to hash + /// - The [encoding] is the encoding to use. Default is `input.codeUnits` + @pragma('vm:prefer-inline') + int code(String input, [Encoding? encoding]) => + string(input, encoding).number(); +} + +/// Gets the CRC-32 value. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - The [params] is the parameters to use. Default: [CRC32Params.ieee] +int crc32code( + String input, { + Encoding? encoding, + CRC32Params params = CRC32Params.ieee, +}) => + CRC32(params).code(input, encoding); diff --git a/hashlib/lib/src/crc64.dart b/hashlib/lib/src/crc64.dart new file mode 100644 index 0000000..4a5b9c7 --- /dev/null +++ b/hashlib/lib/src/crc64.dart @@ -0,0 +1,77 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/crc/crc64.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +export 'package:hashlib/src/algorithms/crc/crc64.dart' + show CRC64Hash, CRC64Params; + +/// A CRC-64 code generator with **ISO** CRC-64 polynomial. +/// +/// A CRC or cyclic redundancy check is code commonly used for error detection +/// and correction of digital data. This generates a 64-bit number as output. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const crc64 = CRC64(CRC64Params.iso); + +/// CRC-64 code generator +class CRC64 extends HashBase { + final CRC64Params params; + + /// Create a instance for generating CRC-64 hashes + const CRC64([this.params = CRC64Params.iso]); + + @override + String get name => "CRC-64/${params.name}"; + + @override + CRC64Hash createSink() => + params.reversed ? CRC64ReverseHash(params) : CRC64NormalHash(params); + + /// Gets the CRC-64 code for a String + /// + /// Parameters: + /// - [input] is the string to hash + /// - The [encoding] is the encoding to use. Default is `input.codeUnits` + @pragma('vm:prefer-inline') + int code(String input, [Encoding? encoding]) => + string(input, encoding).number(); + + /// Gets the CRC-64 checksum for a String + /// + /// Parameters: + /// - [input] is the string to hash + /// - The [encoding] is the encoding to use. Default is `input.codeUnits` + @pragma('vm:prefer-inline') + String checksum(String input, [Encoding? encoding]) => + string(input, encoding).hex(); +} + +/// Gets the CRC-64 value. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - The [params] is the parameters to use. Default: [CRC64Params.iso] +int crc64code( + String input, { + Encoding? encoding, + CRC64Params params = CRC64Params.iso, +}) => + CRC64(params).code(input, encoding); + +/// Gets the CRC-64 hash in hexadecimal. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - The [params] is the parameters to use. Default: [CRC64Params.iso] +String crc64sum( + String input, { + Encoding? encoding, + CRC64Params params = CRC64Params.iso, +}) => + CRC64(params).checksum(input, encoding); diff --git a/hashlib/lib/src/hashlib.dart b/hashlib/lib/src/hashlib.dart new file mode 100644 index 0000000..c33aaaf --- /dev/null +++ b/hashlib/lib/src/hashlib.dart @@ -0,0 +1,52 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'adler32.dart'; +export 'argon2.dart'; +export 'bcrypt.dart'; +export 'blake2b.dart'; +export 'blake2s.dart'; +export 'core/block_hash.dart'; +export 'core/hash_base.dart'; +export 'core/hash_digest.dart'; +export 'core/kdf_base.dart'; +export 'core/mac_base.dart'; +export 'core/otpauth.dart'; +export 'core/registry.dart'; +export 'crc16.dart'; +export 'crc32.dart'; +export 'crc64.dart'; +export 'hmac.dart'; +export 'hotp.dart'; +export 'keccak224.dart'; +export 'keccak256.dart'; +export 'keccak384.dart'; +export 'keccak512.dart'; +export 'md2.dart'; +export 'md4.dart'; +export 'md5.dart'; +export 'pbkdf2.dart'; +export 'poly1305.dart'; +export 'ripemd128.dart'; +export 'ripemd160.dart'; +export 'ripemd256.dart'; +export 'ripemd320.dart'; +export 'scrypt.dart'; +export 'sha1.dart'; +export 'sha224.dart'; +export 'sha256.dart'; +export 'sha384.dart'; +export 'sha3_224.dart'; +export 'sha3_256.dart'; +export 'sha3_384.dart'; +export 'sha3_512.dart'; +export 'sha512.dart'; +export 'sha512t.dart'; +export 'shake128.dart'; +export 'shake256.dart'; +export 'sm3.dart'; +export 'totp.dart'; +export 'xxh128.dart'; +export 'xxh3.dart'; +export 'xxh32.dart'; +export 'xxh64.dart'; diff --git a/hashlib/lib/src/hmac.dart b/hashlib/lib/src/hmac.dart new file mode 100644 index 0000000..3fc2df6 --- /dev/null +++ b/hashlib/lib/src/hmac.dart @@ -0,0 +1,53 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/hmac.dart'; +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/hash_base.dart'; +import 'package:hashlib/src/core/mac_base.dart'; +import 'package:hashlib/src/sha256.dart'; + +/// The HMAC/SHA-256 algorithm +// ignore: constant_identifier_names +const hmac_sha256 = HMAC(sha256); + +/// HMAC is a hash-based message authentication code that can be used to +/// simultaneously verify both the data integrity and authenticity of a message. +class _HMAC extends HashBase> + with MACHashBase> { + /// The algorithm for the MAC generation + final T algo; + final List key; + + const _HMAC(this.algo, this.key); + + @override + String get name => '${algo.name}/HMAC'; + + @override + HMACSink createSink() => HMACSink(algo, key); +} + +/// HMAC is a hash-based message authentication code that can be used to +/// simultaneously verify both the data integrity and authenticity of a message. +class HMAC extends MACHash> { + /// The algorithm for the MAC generation + final T algo; + + const HMAC(this.algo); + + @override + String get name => '${algo.name}/HMAC'; + + @override + MACHashBase> by(List key) => _HMAC(algo, key); +} + +/// Extension on [BlockHashBase] to get an [HMAC] instance +extension HMAConBlockHashBase on T { + /// Gets a [HMAC] instance builder for this algorithm. + /// + /// HMAC is a hash-based message authentication code that can be used to + /// simultaneously verify both the data integrity and authenticity of a message. + HMAC get hmac => HMAC(this); +} diff --git a/hashlib/lib/src/hotp.dart b/hashlib/lib/src/hotp.dart new file mode 100644 index 0000000..c6ea56c --- /dev/null +++ b/hashlib/lib/src/hotp.dart @@ -0,0 +1,85 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/mac_base.dart'; +import 'package:hashlib/src/core/otpauth.dart'; +import 'package:hashlib/src/hmac.dart'; +import 'package:hashlib/src/sha1.dart'; + +// power of 10 upto max safe integer in javascript +const _pow10 = [ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, +]; + +/// An HMAC-based One-Time Password (HOTP) algorithm implementation derived +/// from [rfc4226]. +/// +/// [rfc4226]: https://www.ietf.org/rfc/rfc4226.html +class HOTP extends OTPAuth { + final int _max; + + /// The underlying MAC algorithm + final MACHashBase algo; + + /// The secret key + final List secret; + + /// The counter value + final List counter; + + /// The algorithm name + String get name => algo.name; + + /// Creates an instance of the [HOTP] class with the specified parameters. + /// + /// Parameters: + /// - [secret] is the shared secret as a list of bytes for generating the OTP. + /// - [digits] is the number of digits in the generated OTP (default is 6). + /// - [counter] is the counter value used in the HOTP algorithm (required). + /// - [algo] is the block hash algorithm to use (default is [sha1]). + /// - [label] is an optional string to identify the account or service the OTP + /// is associated with. + /// - [issuer] is an optional string to specify the entity issuing the OTP. + HOTP( + this.secret, { + int digits = 6, + required this.counter, + BlockHashBase algo = sha1, + String? label, + String? issuer, + }) : assert(digits <= 15), + algo = HMAC(algo).by(secret), + _max = _pow10[digits], + super( + digits, + label: label, + issuer: issuer, + ); + + @override + int value() { + var digest = algo.convert(counter).bytes; + int offset = digest.last & 0xF; + int dbc = ((digest[offset] & 0x7F) << 24) | + ((digest[offset + 1] & 0xFF) << 16) | + ((digest[offset + 2] & 0xFF) << 8) | + (digest[offset + 3] & 0xFF); + return dbc % _max; + } +} diff --git a/hashlib/lib/src/keccak224.dart b/hashlib/lib/src/keccak224.dart new file mode 100644 index 0000000..4f132c8 --- /dev/null +++ b/hashlib/lib/src/keccak224.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// Keccak-224 is a member of Keccak family hash functions that generates +/// a 224-bit hash. +/// +/// Keccak is a secure and versatile hash function family that uses a simple +/// [sponge construction][sponge] and Keccak-f cryptographic permutation. +/// After its selection as the winner of the SHA-3 competition, Keccak has +/// been standardized in NIST standards [FIPS 202][fips202] +/// +/// _Note that the standard implementation of Keccak-224 is available as +/// SHA3-224. This one follows the original design. However, the only +/// difference between them is the choice of the final padding._ +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase keccak224 = _Keccak224(); + +class _Keccak224 extends BlockHashBase { + const _Keccak224(); + + @override + final String name = 'Keccak-224'; + + @override + Keccak224Hash createSink() => Keccak224Hash(); +} + +/// Generates a Keccak-224 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String keccak224sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return keccak224.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/keccak256.dart b/hashlib/lib/src/keccak256.dart new file mode 100644 index 0000000..97800d5 --- /dev/null +++ b/hashlib/lib/src/keccak256.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// Keccak-256 is a member of Keccak family hash functions that generates +/// a 256-bit hash. +/// +/// Keccak is a secure and versatile hash function family that uses a simple +/// [sponge construction][sponge] and Keccak-f cryptographic permutation. +/// After its selection as the winner of the SHA-3 competition, Keccak has +/// been standardized in NIST standards [FIPS 202][fips202] +/// +/// _Note that the standard implementation of Keccak-256 is available as +/// SHA3-256. This one follows the original design. However, the only +/// difference between them is the choice of the final padding._ +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase keccak256 = _Keccak256(); + +class _Keccak256 extends BlockHashBase { + const _Keccak256(); + + @override + final String name = 'Keccak-256'; + + @override + Keccak256Hash createSink() => Keccak256Hash(); +} + +/// Generates a Keccak-256 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String keccak256sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return keccak256.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/keccak384.dart b/hashlib/lib/src/keccak384.dart new file mode 100644 index 0000000..196725a --- /dev/null +++ b/hashlib/lib/src/keccak384.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// Keccak-384 is a member of Keccak family hash functions that generates +/// a 384-bit hash. +/// +/// Keccak is a secure and versatile hash function family that uses a simple +/// [sponge construction][sponge] and Keccak-f cryptographic permutation. +/// After its selection as the winner of the SHA-3 competition, Keccak has +/// been standardized in NIST standards [FIPS 202][fips202] +/// +/// _Note that the standard implementation of Keccak-384 is available as +/// SHA3-384. This one follows the original design. However, the only +/// difference between them is the choice of the final padding._ +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase keccak384 = _Keccak384(); + +class _Keccak384 extends BlockHashBase { + const _Keccak384(); + + @override + final String name = 'Keccak-384'; + + @override + Keccak384Hash createSink() => Keccak384Hash(); +} + +/// Generates a Keccak-384 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String keccak384sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return keccak384.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/keccak512.dart b/hashlib/lib/src/keccak512.dart new file mode 100644 index 0000000..b028252 --- /dev/null +++ b/hashlib/lib/src/keccak512.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// Keccak-512 is a member of Keccak family hash functions that generates +/// a 512-bit hash. +/// +/// Keccak is a secure and versatile hash function family that uses a simple +/// [sponge construction][sponge] and Keccak-f cryptographic permutation. +/// After its selection as the winner of the SHA-3 competition, Keccak has +/// been standardized in NIST standards [FIPS 202][fips202] +/// +/// _Note that the standard implementation of Keccak-512 is available as +/// SHA3-512. This one follows the original design. However, the only +/// difference between them is the choice of the final padding._ +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase keccak512 = _Keccak512(); + +class _Keccak512 extends BlockHashBase { + const _Keccak512(); + + @override + final String name = 'Keccak-512'; + + @override + Keccak512Hash createSink() => Keccak512Hash(); +} + +/// Generates a Keccak-512 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String keccak512sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return keccak512.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/md2.dart b/hashlib/lib/src/md2.dart new file mode 100644 index 0000000..bfa6a63 --- /dev/null +++ b/hashlib/lib/src/md2.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/md2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// MD2 was primarily used in early software systems and digital signature +/// standards (such as early versions of X.509 certificates), but its use has +/// been deprecated due to security weaknesses. +/// +/// **WARNING: It is considered cryptographically broken and insecure.** +const BlockHashBase md2 = _MD2(); + +class _MD2 extends BlockHashBase { + const _MD2(); + + @override + final String name = 'MD2'; + + @override + MD2Hash createSink() => MD2Hash(); +} + +/// Generates a MD2 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String md2sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return md2.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/md4.dart b/hashlib/lib/src/md4.dart new file mode 100644 index 0000000..caffa46 --- /dev/null +++ b/hashlib/lib/src/md4.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/md4.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// MD4 can be used as a checksum to verify data integrity against unintentional +/// corruption. Although it was widely used as a cryptographic hash function +/// once, it has been found to suffer from extensive vulnerabilities. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const BlockHashBase md4 = _MD4(); + +class _MD4 extends BlockHashBase { + const _MD4(); + + @override + final String name = 'MD4'; + + @override + MD4Hash createSink() => MD4Hash(); +} + +/// Generates a MD4 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String md4sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return md4.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/md5.dart b/hashlib/lib/src/md5.dart new file mode 100644 index 0000000..abf456a --- /dev/null +++ b/hashlib/lib/src/md5.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/md5.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// MD5 can be used as a checksum to verify data integrity against unintentional +/// corruption. Although it was widely used as a cryptographic hash function +/// once, it has been found to suffer from extensive vulnerabilities. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const BlockHashBase md5 = _MD5(); + +class _MD5 extends BlockHashBase { + const _MD5(); + + @override + final String name = 'MD5'; + + @override + MD5Hash createSink() => MD5Hash(); +} + +/// Generates a MD5 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String md5sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return md5.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/pbkdf2.dart b/hashlib/lib/src/pbkdf2.dart new file mode 100644 index 0000000..21eb48f --- /dev/null +++ b/hashlib/lib/src/pbkdf2.dart @@ -0,0 +1,81 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/pbkdf2/pbkdf2.dart'; +import 'package:hashlib/src/algorithms/pbkdf2/security.dart'; +import 'package:hashlib/src/core/block_hash.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/core/mac_base.dart'; +import 'package:hashlib/src/hmac.dart'; +import 'package:hashlib/src/sha256.dart'; + +export 'algorithms/pbkdf2/pbkdf2.dart' show PBKDF2; +export 'algorithms/pbkdf2/security.dart' show PBKDF2Security; + +/// Extension to the HashBase to get an [PBKDF2] instance +extension PBKDF2onMACHashBase on MACHash { + /// Generate a secret using [PBKDF2] hash algorithm. + @pragma('vm:prefer-inline') + PBKDF2 pbkdf2( + List salt, { + PBKDF2Security security = PBKDF2Security.good, + int? iterations, + int? keyLength, + }) => + PBKDF2.fromSecurity( + security, + mac: this, + salt: salt, + keyLength: keyLength, + iterations: iterations, + ); +} + +/// Extension on [BlockHashBase] to get an [PBKDF2] instance +extension PBKDF2onBlockHashBase on BlockHashBase { + /// Generate a secret using [PBKDF2] hash algorithm. + @pragma('vm:prefer-inline') + PBKDF2 pbkdf2( + List salt, { + PBKDF2Security security = PBKDF2Security.good, + int? iterations, + int? keyLength, + }) => + PBKDF2.fromSecurity( + security, + mac: HMAC(this), + salt: salt, + keyLength: keyLength, + iterations: iterations, + ); +} + +/// This is an implementation of Password Based Key Derivation Algorithm, +/// PBKDF2 derived from [RFC-8081][rfc], which internally uses [sha256] hash +/// function for key derivation. +/// +/// Parameters: +/// - [password] is the raw password to be encoded. +/// - [salt] should be at least 8 bytes long. 16 bytes is recommended. +/// - [iterations] is the number of iterations. Default: 50000 +/// - [keyLength] is the length of the generated key. Default: 32 +/// +/// The strength of the generated key depends on the number of [iterations]. +/// The idea is to prevent a brute force attack on the original password by +/// making the key derivation time long. +/// +/// [rfc]: https://www.rfc-editor.org/rfc/rfc8018.html#section-5.2 +@pragma('vm:prefer-inline') +HashDigest pbkdf2( + List password, + List salt, [ + int? iterations, + int? keyLength, +]) => + hmac_sha256 + .pbkdf2( + salt, + keyLength: keyLength, + iterations: iterations, + ) + .convert(password); diff --git a/hashlib/lib/src/poly1305.dart b/hashlib/lib/src/poly1305.dart new file mode 100644 index 0000000..6e0c4e6 --- /dev/null +++ b/hashlib/lib/src/poly1305.dart @@ -0,0 +1,127 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/src/algorithms/poly1305/poly1305_sink.dart'; +import 'package:hashlib/src/core/hash_base.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; +import 'package:hashlib/src/core/mac_base.dart'; + +export 'algorithms/poly1305/poly1305_sink.dart' show Poly1305Sink; + +class _Poly1305 extends MACHash { + const _Poly1305(); + + @override + final String name = 'Poly1305'; + + /// Create a new instance of [_Poly1305] with a 16 or 32-byte long keypair. + /// The first 16-bytes will be used as a secret key to encode the message, + /// and the last 16-bytes will be used as the authentication key to sign it. + /// + /// Parameters: + /// - [keypair] is required and must contain exactly 16 or 32 bytes. + /// + /// If [keypair] length is 16 bytes, the final digest will not be signed. + /// + /// **Warning**: + /// The algorithm is designed to ensure unforgeability of a message with a + /// random key. Authenticating multiple messages using the same key could + /// allow for forgeries. + /// + /// See also: + /// - [_Poly1305.pair] to input key(`r`) and secret(`s`) pair separately. + @override + MACHashBase by(List keypair) => + Poly1305(keypair is Uint8List ? keypair : Uint8List.fromList(keypair)); + + /// Creates a new instance of [_Poly1305]. + /// + /// Parameters: + /// - [key] is required and must contain exactly 16 bytes. + /// - [secret] is optional and must contain exactly 16 bytes. + /// + /// Here, the [key] is used to encode the message, and the [secret] + /// is the authentication code used to sign it. The [secret] parameter is + /// optional and if not provided, the final digest will not be signed. + /// + /// **Warning**: + /// The algorithm is designed to ensure unforgeability of a message with a + /// random key. Authenticating multiple messages using the same key could + /// allow for forgeries. + /// + /// See also: + /// - [_Poly1305.by] to input key(`r`) and secret(`s`) pair together. + MACHashBase pair(List key, [List? secret]) { + if (secret == null) { + return by(key); + } + if (key.length != 16) { + throw StateError('The key length must be 16 bytes'); + } + if (secret.length != 16) { + throw StateError('The secret length must be 16 bytes'); + } + var pair = Uint8List(32); + pair.setAll(0, key); + pair.setAll(16, secret); + return Poly1305(pair); + } +} + +/// The Poly1305 MAC (message authentication code) generator for an input +/// message using either 16 or 32-byte long authentication key. +const poly1305 = _Poly1305(); + +/// Poly1305 MAC generator with a custom 16 or 32-byte long keypair. +class Poly1305 extends HashBase with MACHashBase { + final Uint8List keypair; + + @override + final String name = 'Poly1305'; + + /// Create a new instance of Poly1305 MAC with a 16 or 32-byte long keypair. + /// The first 16-bytes will be used as a secret key to encode the message, + /// and the last 16-bytes will be used as the authentication key to sign it. + /// + /// Parameters: + /// - [keypair] is required and must contain exactly 16 or 32 bytes. + /// + /// If [keypair] length is 16 bytes, the final digest will not be signed. + /// + /// **Warning**: + /// The algorithm is designed to ensure unforgeability of a message with a + /// random key. Authenticating multiple messages using the same key could + /// allow for forgeries. + /// + /// See also: + /// - [_Poly1305.pair] to input key(`r`) and secret(`s`) pair separately. + const Poly1305(this.keypair); + + @override + Poly1305Sink createSink() => Poly1305Sink(keypair); +} + +/// Computes the Poly1305 MAC (message authentication code) of the given +/// [message] using the given the 16 or 32-byte long [keypair] for authentication. +/// +/// Parameters: +/// - [message] is a variable-length list of bytes +/// - [keypair] is required and must contain exactly 16 or 32 bytes. +/// +/// If [keypair] length is 16 bytes, the final digest will not be signed. +/// +/// **Warning**: +/// The algorithm is designed to ensure unforgeability of a message with a +/// random key. Authenticating multiple messages using the same key could +/// allow for forgeries. +/// +/// Example usage: +/// ``` +/// final keypair = randomBytes(32); +/// print('TAG(signed): ${poly1305auth(message, keypair)}'); +/// ``` +@pragma('vm:prefer-inline') +HashDigest poly1305auth(List message, List keypair) => + poly1305.by(keypair).convert(message); diff --git a/hashlib/lib/src/random.dart b/hashlib/lib/src/random.dart new file mode 100644 index 0000000..8348ec9 --- /dev/null +++ b/hashlib/lib/src/random.dart @@ -0,0 +1,81 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'random/generators.dart'; +import 'random/random.dart'; + +export 'random/generators.dart' show RNG; +export 'random/random.dart' show HashlibRandom; + +/// Generate a list of random 8-bit numbers of size [length] +@pragma('vm:prefer-inline') +Uint8List randomBytes( + int length, { + RNG generator = RNG.secure, +}) => + HashlibRandom(generator).nextBytes(length); + +/// Generate a list of random 32-bit numbers of size [length] +@pragma('vm:prefer-inline') +Uint32List randomNumbers( + int length, { + RNG generator = RNG.secure, +}) => + HashlibRandom(generator).nextNumbers(length); + +/// Fills the [buffer] with random numbers. +/// +/// Both the [start] and [length] are in bytes. +@pragma('vm:prefer-inline') +void fillRandom( + ByteBuffer buffer, { + int start = 0, + int? length, + RNG generator = RNG.secure, +}) => + HashlibRandom(generator).fill(buffer, start, length); + +/// Fills the [list] with random 32-bit numbers. +/// +/// Both the [start] and [length] are in bytes. +void fillNumbers( + List list, { + int start = 0, + int? length, + RNG generator = RNG.secure, +}) { + int n = length ?? list.length; + if (n == 0) return; + var rand = HashlibRandom(generator); + for (; n > 0 && start < list.length; ++start, --n) { + list[start] = rand.nextInt(); + } +} + +/// Generate a list of random ASCII string of size [length]. +/// +/// Check the [HashlibRandom.nextString] documentation for more details. +@pragma('vm:prefer-inline') +String randomString( + int length, { + bool? lower, + bool? upper, + bool? numeric, + bool? controls, + bool? punctuations, + List? whitelist, + List? blacklist, + RNG generator = RNG.secure, +}) => + HashlibRandom(generator).nextString( + length, + lower: lower, + upper: upper, + numeric: numeric, + controls: controls, + punctuations: punctuations, + whitelist: whitelist, + blacklist: blacklist, + ); diff --git a/hashlib/lib/src/random/generator_js.dart b/hashlib/lib/src/random/generator_js.dart new file mode 100644 index 0000000..99f6fbb --- /dev/null +++ b/hashlib/lib/src/random/generator_js.dart @@ -0,0 +1,24 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:math' show Random; + +const int _mask32 = 0xFFFFFFFF; + +int _seedCounter = Zone.current.hashCode; + +/// Returns a secure random generator in JS runtime +Random secureRandom() => Random($generateSeed()); + +/// Generates a random seed in JS runtime +int $generateSeed() { + int code = DateTime.now().millisecondsSinceEpoch; + code -= _seedCounter++; + if (code.bitLength & 1 == 1) { + code *= ~code; + } + code ^= ~_seedCounter << 5; + _seedCounter += code & 7; + return code & _mask32; +} diff --git a/hashlib/lib/src/random/generator_vm.dart b/hashlib/lib/src/random/generator_vm.dart new file mode 100644 index 0000000..3c2bb5d --- /dev/null +++ b/hashlib/lib/src/random/generator_vm.dart @@ -0,0 +1,16 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math' show Random; + +const int _mask32 = 0xFFFFFFFF; + +/// Returns a secure random generator +@pragma('vm:prefer-inline') +Random secureRandom() => Random.secure(); + +/// Generates a random seed +@pragma('vm:prefer-inline') +int $generateSeed() => + (DateTime.now().microsecondsSinceEpoch & _mask32) ^ + Random.secure().nextInt(_mask32); diff --git a/hashlib/lib/src/random/generators.dart b/hashlib/lib/src/random/generators.dart new file mode 100644 index 0000000..31462e1 --- /dev/null +++ b/hashlib/lib/src/random/generators.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math' show Random; +import 'dart:typed_data'; + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/src/algorithms/md4.dart'; +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/algorithms/sm3.dart'; +import 'package:hashlib/src/algorithms/xxh64/xxh64.dart'; +import 'package:hashlib/src/core/hash_base.dart'; + +import 'generator_vm.dart' if (dart.library.js) 'generator_js.dart'; +export 'generator_vm.dart' if (dart.library.js) 'generator_js.dart'; + +const int _mask32 = 0xFFFFFFFF; + +typedef NextIntFunction = int Function(); + +/// Available Random Number Generators +enum RNG { + secure, + system, + keccak, + sha256, + md5, + xxh64, + sm3; + + /// Gets the function returning the next 32-bit integer by this RNG + NextIntFunction build([int? seed]) { + switch (this) { + case RNG.keccak: + return _keccakGenerateor(seed); + case RNG.sha256: + return _hashGenerateor(SHA256Hash(), seed); + case RNG.md5: + return _hashGenerateor(MD4Hash(), seed); + case RNG.xxh64: + return _hashGenerateor(XXHash64Sink(111), seed); + case RNG.sm3: + return _hashGenerateor(SM3Hash(), seed); + case RNG.system: + return _systemGenerator(seed); + case RNG.secure: + default: + return _secureGenerator(); + } + } +} + +/// Expands the seed to fill the list +void $seedList(TypedData data, int seed) { + var list = Uint32List.view(data.buffer); + var inp = [ + seed & _mask32, + seed >>> 32, + list.length, + 0xD5A79147, + 0x14292967 + list.length, + 0x59F111F1 ^ -seed.bitLength, + 0x106AA070 + seed, + 0x71374491 - seed, + 0x06CA6351 ^ seed, + 0x650A7354, + 0xF40E3585, + 0x766A0ABB ^ -seed, + 0x81C2C92E, + 0x92722C85, + 0x748F82EE ^ -list.length, + 0x78A5636F | -seed, + ]; + + int i, x; + for (i = 0; i < 16 && i < list.length; ++i) { + list[i] ^= inp[i]; + } + for (x = seed; i < list.length; ++i) { + list[i] ^= x = (x >>> (i & 15)) ^ seed; + list[i] ^= list[i - 16]; + list[i] ^= -list[i - 7]; + } + var list8 = Uint8List.view(data.buffer); + for (i = list.lengthInBytes; i < list8.length; ++i) { + list8[i] ^= seed >>> (i & 31); + } +} + +/// Returns a iterable of 32-bit integers backed by system's [Random]. +NextIntFunction _secureGenerator() { + final random = secureRandom(); + return () => random.nextInt(_mask32); +} + +/// Returns a iterable of 32-bit integers backed by system's [Random]. +NextIntFunction _systemGenerator([int? seed]) { + final random = Random(seed ?? $generateSeed()); + return () => random.nextInt(_mask32); +} + +/// Returns a iterable of 32-bit integers generated from the [KeccakHash]. +NextIntFunction _keccakGenerateor([int? seed]) { + int l, p; + var sink = KeccakHash(stateSize: 64, paddingByte: 0); + $seedList(sink.sbuffer, seed ?? $generateSeed()); + p = l = sink.sbuffer.length; + return () { + if (p == l) { + p = 0; + sink.$update(); + } + return sink.sbuffer[p++]; + }; +} + +/// Returns a iterable of 32-bit integers generated from the [sink]. +NextIntFunction _hashGenerateor( + HashDigestSink sink, [ + int? seed, +]) { + int l, p; + var input = Uint8List(64); + var input32 = Uint32List(0); + $seedList(input, seed ?? $generateSeed()); + l = p = sink.hashLength >>> 2; + return () { + if (p == l) { + p = 0; + sink.reset(); + sink.add(input); + input = sink.$finalize(); + input32 = Uint32List.view(input.buffer); + } + return input32[p++]; + }; +} diff --git a/hashlib/lib/src/random/random.dart b/hashlib/lib/src/random/random.dart new file mode 100644 index 0000000..0cec008 --- /dev/null +++ b/hashlib/lib/src/random/random.dart @@ -0,0 +1,203 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'generators.dart'; + +const int _mask32 = 0xFFFFFFFF; + +const String _alphaLower = 'abcdefghijklmnopqrstuvwxyz'; +const String _alphaUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +const String _numeric = '0123456789'; +const List _controls = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 127 +]; +const List _punctuations = [ + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // + 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, +]; + +/// Provides a generator for secure random values +class HashlibRandom { + final NextIntFunction _nextInt; + + /// Create a instance with custom generator + const HashlibRandom.custom(this._nextInt); + + /// Creates an instance based on [generator] with optional [seed] value. + factory HashlibRandom(RNG generator, {int? seed}) => + HashlibRandom.custom(generator.build(seed)); + + /// Creates an instance based on `RNG.secure` generator with + /// optional [seed] value. + factory HashlibRandom.secure({int? seed}) => + HashlibRandom.custom(RNG.secure.build(seed)); + + /// Generates a 32-bit bit random number + @pragma('vm:prefer-inline') + int nextInt() => _nextInt(); + + /// Generates a 16-bit bit random number + @pragma('vm:prefer-inline') + int nextWord() => nextInt() & 0xFFFF; + + /// Generates a 8-bit bit random number + @pragma('vm:prefer-inline') + int nextByte() => (nextInt() >>> 11) & 0xFF; + + /// Generates a boolean value + @pragma('vm:prefer-inline') + bool nextBool() => nextByte() & 0x55 == 0; + + /// Generates a double number + @pragma('vm:prefer-inline') + double nextDouble() => nextInt() / _mask32; + + /// Generates a 32-bit bit random number between [low] and [high], inclusive. + int nextBetween(int low, int high) { + if (low == high) { + return low; + } + if (low > high) { + int t = low; + low = high; + high = t; + } + return (nextInt() % (high - low)) + low; + } + + /// Fill the buffer with random values. + /// + /// Paramters: + /// - [offsetInBytes] the start offset in bytes for the fill operation. + /// - [lengthInBytes] the total bytes to fill. If `null`, fills to the end. + void fill(ByteBuffer buffer, [int offsetInBytes = 0, int? lengthInBytes]) { + int i, n; + i = offsetInBytes; + n = lengthInBytes ?? buffer.lengthInBytes; + if (n <= 0) return; + var list8 = Uint8List.view(buffer); + for (; n > 0 && i < list8.length && i & 3 != 0; i++, n--) { + list8[i] = nextByte(); + } + if (n <= 0) return; + var list32 = Uint32List.view(buffer); + for (i >>>= 2; n >= 4 && i < list32.length; i++, n -= 4) { + list32[i] = nextInt(); + } + if (n <= 0) return; + for (i <<= 2; n > 0 && i < list8.length; i++, n--) { + list8[i] = nextByte(); + } + } + + /// Generate a list of random 8-bit bytes of size [length] + @pragma('vm:prefer-inline') + Uint8List nextBytes(int length) { + var data = Uint8List(length); + fill(data.buffer); + return data; + } + + /// Generate a list of random 32-bit numbers of size [length] + @pragma('vm:prefer-inline') + Uint32List nextNumbers(int length) { + var data = Uint32List(length); + fill(data.buffer); + return data; + } + + /// Generate the next random string of specific [length]. + /// + /// If no parameter is provided, it will return a random string using + /// ASCII characters only (character code 0 to 127). + /// + /// If [whitelist] or [blacklist] are provided, they will get priority over + /// other parameters. Otherwise, these two list will be generated from the + /// other parameter. + /// + /// Other Parameters: + /// - [lower] : lowercase letters. + /// - [upper] : uppercase letters. + /// - [controls] : control characters. + /// - [punctuations] : punctuations. + /// + /// If these parameters are set, it will be ignored. Otherwise, if `true`, the + /// corresponding characters will be added to the [whitelist], or if `false`, + /// to the [blacklist]. + /// + /// If the [whitelist] is already set, these parameters has no effect when + /// they are set to true. If the [blacklist] is already set, these parameters + /// has no effect when they are set to false. + String nextString( + int length, { + bool? lower, + bool? upper, + bool? numeric, + bool? controls, + bool? punctuations, + List? whitelist, + List? blacklist, + }) { + Set white = {}; + Set black = {}; + if (lower != null) { + if (lower) { + white.addAll(_alphaLower.codeUnits); + } else { + black.addAll(_alphaLower.codeUnits); + } + } + if (upper != null) { + if (upper) { + white.addAll(_alphaUpper.codeUnits); + } else { + black.addAll(_alphaUpper.codeUnits); + } + } + if (numeric != null) { + if (numeric) { + white.addAll(_numeric.codeUnits); + } else { + black.addAll(_numeric.codeUnits); + } + } + if (controls != null) { + if (controls) { + white.addAll(_controls); + } else { + black.addAll(_controls); + } + } + if (punctuations != null) { + if (punctuations) { + white.addAll(_punctuations); + } else { + black.addAll(_punctuations); + } + } + + if (whitelist != null) { + white.addAll(whitelist); + black.removeAll(whitelist); + } else if (white.isEmpty) { + white.addAll(List.generate(128, (i) => i)); + } + white.removeAll(black); + if (blacklist != null) { + white.removeAll(blacklist); + } + if (white.isEmpty) { + throw StateError('Empty whitelist'); + } + + var list = white.toList(growable: false); + Iterable codes = nextBytes(length); + codes = codes.map((x) => list[x % list.length]); + return String.fromCharCodes(codes); + } +} diff --git a/hashlib/lib/src/random/uuid_v1.dart b/hashlib/lib/src/random/uuid_v1.dart new file mode 100644 index 0000000..41d442e --- /dev/null +++ b/hashlib/lib/src/random/uuid_v1.dart @@ -0,0 +1,98 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; + +import 'generators.dart' show secureRandom; + +const int _mask32 = 0xFFFFFFFF; +const int _pow32 = _mask32 + 1; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_mid | ver | time_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| clock_seq | node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 1 +class UUIDv1 { + const UUIDv1(); + + static const int _g0 = 0x13814000; + static const int _g1 = 0x01b21dd2; + + /// UUIDv1 is a time-based UUID featuring a 60-bit timestamp represented by + /// Coordinated Universal Time (UTC) as a count of 100-nanosecond intervals + /// since 00:00:00.00, 15 October 1582. + String generate({ + DateTime? now, + int? clockSeq, + int? node, + }) { + final rng = secureRandom(); + final codec = Base16Codec.lower.encoder; + + now ??= DateTime.now().toUtc(); + clockSeq ??= rng.nextInt(0xFFFF); + + int tl, th, t0, t1, t2; + t0 = now.millisecondsSinceEpoch & _mask32; + t1 = now.millisecondsSinceEpoch ~/ _pow32; + t2 = now.microsecondsSinceEpoch % 1000; + + tl = (10000 * t0 + 10 * t2 + _g0); + th = (10000 * t1 + _g1); + th += tl ~/ _pow32; + tl &= _mask32; + + int nl, nh; + if (node != null) { + nl = node & _mask32; + nh = node ~/ _pow32; + } else { + nl = rng.nextInt(_mask32); + nh = rng.nextInt(0xFFFF); + } + + final part1 = codec.convert([ + tl >>> 24, + tl >>> 16, + tl >>> 8, + tl, + ]); + final part2 = codec.convert([ + th >>> 8, + th, + ]); + final part3 = codec.convert([ + 0x10 ^ ((th >>> 24) & 0xF), + th >>> 16, + ]); + final part4 = codec.convert([ + 0x80 ^ ((clockSeq >>> 8) & 0x3F), + clockSeq, + ]); + final part5 = codec.convert([ + nh >>> 8, + nh, + nl >>> 24, + nl >>> 16, + nl >>> 8, + nl, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v3.dart b/hashlib/lib/src/random/uuid_v3.dart new file mode 100644 index 0000000..a7df8dd --- /dev/null +++ b/hashlib/lib/src/random/uuid_v3.dart @@ -0,0 +1,85 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/md5.dart'; +import 'package:hashlib/src/random.dart'; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_high | ver | md5_mid | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| md5_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 3 +class UUIDv3 { + const UUIDv3(); + + /// UUIDv3 values are created by computing an MD5 hash over a given + /// [namespace] concatenated with the desired [name] value. + String generate({ + String? namespace, + String? name, + }) { + final codec = Base16Codec.lower.encoder; + + final sink = MD5Hash(); + if (namespace != null) { + sink.add(fromHex(namespace.split('-').join())); + } else { + sink.add(randomBytes(16)); + } + if (name != null) { + sink.add(utf8.encode(name)); + } + final hash = Uint32List.view(sink.digest().buffer); + int h0 = hash[0]; + int h1 = hash[1]; + int h2 = hash[2]; + int h3 = hash[3]; + + final part1 = codec.convert([ + h0, + h0 >>> 8, + h0 >>> 16, + h0 >>> 24, + ]); + final part2 = codec.convert([ + h1, + h1 >>> 8, + ]); + final part3 = codec.convert([ + 0x30 ^ ((h1 >>> 16) & 0xF), + h1 >>> 24, + ]); + final part4 = codec.convert([ + 0x80 ^ (h2 & 0x3F), + h2 >>> 8, + ]); + final part5 = codec.convert([ + h2 >>> 16, + h2 >>> 24, + h3, + h3 >>> 8, + h3 >>> 16, + h3 >>> 24, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v4.dart b/hashlib/lib/src/random/uuid_v4.dart new file mode 100644 index 0000000..8391b3d --- /dev/null +++ b/hashlib/lib/src/random/uuid_v4.dart @@ -0,0 +1,73 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; + +import 'generators.dart' show secureRandom; + +const int _mask32 = 0xFFFFFFFF; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_a | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_a | ver | random_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| random_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 4 +class UUIDv4 { + const UUIDv4(); + + /// UUIDv4 is meant for generating UUIDs from random numbers. + String generate() { + int rah, ral, rb, rch, rcl; + final rng = secureRandom(); + final codec = Base16Codec.lower.encoder; + + rah = rng.nextInt(0xFFFF); + ral = rng.nextInt(_mask32); + rb = rng.nextInt(0xFFFF); + rch = rng.nextInt(_mask32); + rcl = rng.nextInt(_mask32); + + final part1 = codec.convert([ + rah >>> 8, + rah, + ral >>> 24, + ral >>> 16, + ]); + final part2 = codec.convert([ + ral >>> 8, + ral, + ]); + final part3 = codec.convert([ + 0x40 ^ ((rb >>> 8) & 0xF), + rb, + ]); + final part4 = codec.convert([ + 0x80 ^ ((rch >>> 24) & 0x3F), + rch >>> 16, + ]); + final part5 = codec.convert([ + rch >>> 8, + rch, + rcl >>> 24, + rcl >>> 16, + rcl >>> 8, + rcl, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v5.dart b/hashlib/lib/src/random/uuid_v5.dart new file mode 100644 index 0000000..3483653 --- /dev/null +++ b/hashlib/lib/src/random/uuid_v5.dart @@ -0,0 +1,85 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/algorithms/sha1.dart'; +import 'package:hashlib/src/random.dart'; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_high | ver | sha1_mid | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| sha1_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 5 +class UUIDv5 { + const UUIDv5(); + + /// UUIDv5 values are created by computing an SHA1 hash over a given + /// [namespace] concatenated with the desired [name] value. + String generate({ + String? namespace, + String? name, + }) { + final codec = Base16Codec.lower.encoder; + + final sink = SHA1Hash(); + if (namespace != null) { + sink.add(fromHex(namespace.split('-').join())); + } else { + sink.add(randomBytes(16)); + } + if (name != null) { + sink.add(utf8.encode(name)); + } + final hash = Uint32List.view(sink.digest().buffer); + int h0 = hash[0]; + int h1 = hash[1]; + int h2 = hash[2]; + int h3 = hash[3]; + + final part1 = codec.convert([ + h0, + h0 >>> 8, + h0 >>> 16, + h0 >>> 24, + ]); + final part2 = codec.convert([ + h1, + h1 >>> 8, + ]); + final part3 = codec.convert([ + 0x50 ^ ((h1 >>> 16) & 0xF), + h1 >>> 24, + ]); + final part4 = codec.convert([ + 0x80 ^ (h2 & 0x3F), + h2 >>> 8, + ]); + final part5 = codec.convert([ + h2 >>> 16, + h2 >>> 24, + h3, + h3 >>> 8, + h3 >>> 16, + h3 >>> 24, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v6.dart b/hashlib/lib/src/random/uuid_v6.dart new file mode 100644 index 0000000..bca2c8d --- /dev/null +++ b/hashlib/lib/src/random/uuid_v6.dart @@ -0,0 +1,97 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; + +import 'generators.dart' show secureRandom; + +const int _mask32 = 0xFFFFFFFF; +const int _pow32 = _mask32 + 1; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_mid | ver | time_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| clock_seq | node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 6 +class UUIDv6 { + const UUIDv6(); + + static const int _g0 = 0x13814000; + static const int _g1 = 0x01b21dd2; + + /// UUIDv6 is a field-compatible version of UUIDv1 reordered for improved DB + /// locality. + String generate({ + DateTime? now, + int? clockSeq, + int? node, + }) { + final rng = secureRandom(); + final codec = Base16Codec.lower.encoder; + + now ??= DateTime.now().toUtc(); + clockSeq ??= rng.nextInt(0xFFFF); + + int tl, th, t0, t1, t2; + t0 = now.millisecondsSinceEpoch & _mask32; + t1 = now.millisecondsSinceEpoch ~/ _pow32; + t2 = now.microsecondsSinceEpoch % 1000; + + tl = (10000 * t0 + 10 * t2 + _g0); + th = (10000 * t1 + _g1); + th += tl ~/ _pow32; + tl &= _mask32; + + int nl, nh; + if (node != null) { + nl = node & _mask32; + nh = node ~/ _pow32; + } else { + nl = rng.nextInt(_mask32); + nh = rng.nextInt(0xFFFF); + } + + final part1 = codec.convert([ + th >>> 20, + th >>> 12, + th >>> 4, + ((th & 0xF) << 4) ^ (tl >>> 28), + ]); + final part2 = codec.convert([ + tl >>> 20, + tl >>> 12, + ]); + final part3 = codec.convert([ + 0x60 ^ ((tl >>> 8) & 0xF), + tl, + ]); + final part4 = codec.convert([ + 0x80 ^ ((clockSeq >>> 8) & 0x3F), + clockSeq, + ]); + final part5 = codec.convert([ + nh >>> 8, + nh, + nl >>> 24, + nl >>> 16, + nl >>> 8, + nl, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v7.dart b/hashlib/lib/src/random/uuid_v7.dart new file mode 100644 index 0000000..988d5be --- /dev/null +++ b/hashlib/lib/src/random/uuid_v7.dart @@ -0,0 +1,79 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; + +import 'generators.dart' show secureRandom; + +const int _mask32 = 0xFFFFFFFF; +const int _pow32 = _mask32 + 1; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| unix_ts_ms | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| unix_ts_ms | ver | rand_a | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| rand_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| rand_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 7 +class UUIDv7 { + const UUIDv7(); + + /// UUIDv7 features a time-ordered value field derived from the widely + /// implemented and well-known Unix Epoch timestamp source, the number of + /// milliseconds since midnight 1 Jan 1970 UTC, leap seconds excluded. + String generate({ + DateTime? now, + }) { + int ra, rbh, rbl, tl, th; + final rng = secureRandom(); + final codec = Base16Codec.lower.encoder; + + now ??= DateTime.now().toUtc(); + ra = rng.nextInt(0xFFFF); + rbh = rng.nextInt(_mask32); + rbl = rng.nextInt(_mask32); + tl = now.millisecondsSinceEpoch & _mask32; + th = now.millisecondsSinceEpoch ~/ _pow32; + + final part1 = codec.convert([ + th >>> 8, + th, + tl >>> 24, + tl >>> 16, + ]); + final part2 = codec.convert([ + tl >>> 8, + tl, + ]); + final part3 = codec.convert([ + 0x70 ^ ((ra >>> 8) & 0xF), + ra, + ]); + final part4 = codec.convert([ + 0x80 ^ ((rbh >>> 24) & 0x3F), + rbh >>> 16, + ]); + final part5 = codec.convert([ + rbh >>> 8, + rbh, + rbl >>> 24, + rbl >>> 16, + rbl >>> 8, + rbl, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/random/uuid_v8.dart b/hashlib/lib/src/random/uuid_v8.dart new file mode 100644 index 0000000..74da6d2 --- /dev/null +++ b/hashlib/lib/src/random/uuid_v8.dart @@ -0,0 +1,86 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; + +import 'generators.dart' show secureRandom; + +const int _mask32 = 0xFFFFFFFF; + +/* ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| nonce | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| nonce | ver | nonce | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| nonce | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| nonce | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/// Implementation of Universally Unique Identifier version 8 +class UUIDv8 { + const UUIDv8(); + + /// UUIDv8 provides a format for experimental or vendor-specific use cases. + /// This implementation uses random number by default. + String generate({Uint8List? nonce}) { + int a, b, c, d; + final rng = secureRandom(); + final codec = Base16Codec.lower.encoder; + + if (nonce != null) { + if (nonce.length != 16) { + throw ArgumentError('Nonce length must be 16-byte'); + } + var nonce32 = Uint32List.view(nonce.buffer); + a = nonce32[0]; + b = nonce32[1]; + c = nonce32[2]; + d = nonce32[3]; + } else { + a = rng.nextInt(_mask32); + b = rng.nextInt(_mask32); + c = rng.nextInt(_mask32); + d = rng.nextInt(_mask32); + } + + final part1 = codec.convert([ + a, + a >>> 8, + a >>> 16, + a >>> 24, + ]); + final part2 = codec.convert([ + b, + b >>> 8, + ]); + final part3 = codec.convert([ + 0x80 ^ ((b >>> 16) & 0xF), + b >>> 24, + ]); + final part4 = codec.convert([ + 0x80 ^ (c & 0x3F), + c >>> 8, + ]); + final part5 = codec.convert([ + c >>> 16, + c >>> 24, + d, + d >>> 8, + d >>> 16, + d >>> 24, + ]); + + return [ + String.fromCharCodes(part1), + String.fromCharCodes(part2), + String.fromCharCodes(part3), + String.fromCharCodes(part4), + String.fromCharCodes(part5), + ].join('-'); + } +} diff --git a/hashlib/lib/src/ripemd128.dart b/hashlib/lib/src/ripemd128.dart new file mode 100644 index 0000000..8eeedaf --- /dev/null +++ b/hashlib/lib/src/ripemd128.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/ripemd/ripemd128.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// RIPEMD-128 (RACE Integrity Primitives Evaluation Message Digest) is a +/// cryptographic hash function that produces a fixed-size, 128-bit hash value. +/// +/// While it provides reasonable level of security, it is less commonly used +/// than RIPEMD-160, the more secure algorithm in the same family. +const BlockHashBase ripemd128 = _RIPEMD128(); + +class _RIPEMD128 extends BlockHashBase { + const _RIPEMD128(); + + @override + final String name = 'RIPEMD-128'; + + @override + RIPEMD128Hash createSink() => RIPEMD128Hash(); +} + +/// Generates a RIPEMD-128 hash in hexadecimal +/// +/// Parameters: +/// - [input] is the message string +/// - [encoding] specifies the character encoding. Default is [utf8]. +/// - [uppercase] flag indicates whether the output should be in uppercase. +String ripemd128sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return ripemd128.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/ripemd160.dart b/hashlib/lib/src/ripemd160.dart new file mode 100644 index 0000000..da2c777 --- /dev/null +++ b/hashlib/lib/src/ripemd160.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/ripemd/ripemd160.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// RIPEMD-160 (RACE Integrity Primitives Evaluation Message Digest) is a +/// cryptographic hash function that produces a fixed-size, 160-bit hash value. +/// It is used to verify the integrity and authenticity of messages and is +/// resistant to various types of attacks, including collisions and preimage +/// attacks. It is commonly used in security protocols and applications. +const BlockHashBase ripemd160 = _RIPEMD160(); + +class _RIPEMD160 extends BlockHashBase { + const _RIPEMD160(); + + @override + final String name = 'RIPEMD-160'; + + @override + RIPEMD160Hash createSink() => RIPEMD160Hash(); +} + +/// Generates a RIPEMD-160 hash in hexadecimal +/// +/// Parameters: +/// - [input] is the message string +/// - [encoding] specifies the character encoding. Default is [utf8]. +/// - [uppercase] flag indicates whether the output should be in uppercase. +String ripemd160sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return ripemd160.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/ripemd256.dart b/hashlib/lib/src/ripemd256.dart new file mode 100644 index 0000000..6bcfa92 --- /dev/null +++ b/hashlib/lib/src/ripemd256.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/ripemd/ripemd256.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// RIPEMD-256 (RACE Integrity Primitives Evaluation Message Digest) is a +/// cryptographic hash function that produces a fixed-size, 256-bit hash value. +/// +/// It shares some design principles with RIPEMD-128, but provides a higher +/// level of security. It is also less commonly used than RIPEMD-160. +const BlockHashBase ripemd256 = _RIPEMD256(); + +class _RIPEMD256 extends BlockHashBase { + const _RIPEMD256(); + + @override + final String name = 'RIPEMD-256'; + + @override + RIPEMD256Hash createSink() => RIPEMD256Hash(); +} + +/// Generates a RIPEMD-256 hash in hexadecimal +/// +/// Parameters: +/// - [input] is the message string +/// - [encoding] specifies the character encoding. Default is [utf8]. +/// - [uppercase] flag indicates whether the output should be in uppercase. +String ripemd256sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return ripemd256.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/ripemd320.dart b/hashlib/lib/src/ripemd320.dart new file mode 100644 index 0000000..3043545 --- /dev/null +++ b/hashlib/lib/src/ripemd320.dart @@ -0,0 +1,39 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/ripemd/ripemd320.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// RIPEMD-320 (RACE Integrity Primitives Evaluation Message Digest) is a +/// cryptographic hash function that produces a fixed-size, 320-bit hash value. +/// +/// It shares some design principles with RIPEMD-160, but provides a higher +/// level of security having a larger output size and a more complex message +/// expansion function. +const BlockHashBase ripemd320 = _RIPEMD320(); + +class _RIPEMD320 extends BlockHashBase { + const _RIPEMD320(); + + @override + final String name = 'RIPEMD-320'; + + @override + RIPEMD320Hash createSink() => RIPEMD320Hash(); +} + +/// Generates a RIPEMD-320 hash in hexadecimal +/// +/// Parameters: +/// - [input] is the message string +/// - [encoding] specifies the character encoding. Default is [utf8]. +/// - [uppercase] flag indicates whether the output should be in uppercase. +String ripemd320sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return ripemd320.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/scrypt.dart b/hashlib/lib/src/scrypt.dart new file mode 100644 index 0000000..84a57e9 --- /dev/null +++ b/hashlib/lib/src/scrypt.dart @@ -0,0 +1,51 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/scrypt/scrypt.dart'; +import 'package:hashlib/src/algorithms/scrypt/security.dart'; +import 'package:hashlib/src/core/hash_digest.dart'; + +export 'algorithms/scrypt/scrypt.dart' show Scrypt; +export 'algorithms/scrypt/security.dart' show ScryptSecurity; + +/// Generate a secure password using the [scrypt][rfc] algorithm. +/// +/// The scrypt algorithm is a modern password-based key derivation function +/// that is designed to be highly secure against brute-force attacks. It uses +/// a large amount of memory and is highly customizable, allowing the user to +/// tune the parameters according to their specific needs. +/// +/// Parameters: +/// - [password] : The passphrase string to hash. +/// - [salt] : An uniquely and randomly generated string. +/// - [r] : The size of a single block in bytes. +/// - [N] : The CPU/Memory cost parameter as a power of 2. 1 < [N] < 2^32 +/// - [p] : The parallelization paramete. [p] <= (2^32 - 1) / (128 * [r]) +/// - [dklen] : The intended output length in bytes. [dklen] <= 2^32 - 1 +/// - [security] : The default parameter source for [N], [r], [p] if they are +/// not provided (default is [ScryptSecurity.good]). +/// +/// The parameters N, r, and p should be tuned according to the amount of +/// memory and computing power available, as well as the desired level of +/// parallelism. At the current time, the values of r=8 and p=1 appear to +/// yield good results, but as technology advances, it is likely that the +/// optimum values for both r and p will increase. +/// +/// [rfc]: https://www.rfc-editor.org/rfc/rfc7914.html +@pragma('vm:prefer-inline') +HashDigest scrypt( + List password, + List salt, { + int? N, + int? r, + int? p, + int dklen = 64, + ScryptSecurity security = ScryptSecurity.good, +}) => + Scrypt( + salt: salt, + cost: N ?? security.N, + blockSize: r ?? security.r, + parallelism: p ?? security.p, + derivedKeyLength: dklen, + ).convert(password); diff --git a/hashlib/lib/src/sha1.dart b/hashlib/lib/src/sha1.dart new file mode 100644 index 0000000..c5b53ca --- /dev/null +++ b/hashlib/lib/src/sha1.dart @@ -0,0 +1,40 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha1.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-1 produces a message digest based on principle similar to MD5, except +/// it can generate a 160-bit hash. Since 2005, SHA-1 has not been considered +/// secure and NIST formally deprecated it in 2001. It is no longer allowed +/// in digital signatures, however it is safe to use it as a checksum to verify +/// data integrity. +/// +/// **WARNING: It should not be used for cryptographic purposes.** +const BlockHashBase sha1 = _SHA1(); + +class _SHA1 extends BlockHashBase { + const _SHA1(); + + @override + final String name = 'SHA1'; + + @override + SHA1Hash createSink() => SHA1Hash(); +} + +/// Generates a SHA-1 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha1sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha1.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha224.dart b/hashlib/lib/src/sha224.dart new file mode 100644 index 0000000..f381dec --- /dev/null +++ b/hashlib/lib/src/sha224.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-224 is a member of SHA-2 family which uses 256-bit internal state to +/// generate a message digest of 224-bit long. +/// +/// SHA-2 is a family of algorithms designed by the United States National +/// Security Agency (NSA), first published in 2001 and later standardized in +/// [FIPS 180-4][fips180]. +/// +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +const BlockHashBase sha224 = _SHA224(); + +class _SHA224 extends BlockHashBase { + const _SHA224(); + + @override + final String name = 'SHA-224'; + + @override + SHA224Hash createSink() => SHA224Hash(); +} + +/// Generates a SHA-224 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha224sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha224.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha256.dart b/hashlib/lib/src/sha256.dart new file mode 100644 index 0000000..ebbc0c3 --- /dev/null +++ b/hashlib/lib/src/sha256.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-256 is a member of SHA-2 family which uses 256-bit internal state to +/// generate a message digest of 256-bit long. +/// +/// SHA-2 is a family of algorithms designed by the United States National +/// Security Agency (NSA), first published in 2001 and later standardized in +/// [FIPS 180-4][fips180]. +/// +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +const BlockHashBase sha256 = _SHA256(); + +class _SHA256 extends BlockHashBase { + const _SHA256(); + + @override + final String name = 'SHA-256'; + + @override + SHA256Hash createSink() => SHA256Hash(); +} + +/// Generates a SHA-256 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha256sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha256.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha384.dart b/hashlib/lib/src/sha384.dart new file mode 100644 index 0000000..33b246d --- /dev/null +++ b/hashlib/lib/src/sha384.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-384 is a member of SHA-2 family which uses 512-bit internal state to +/// generate a message digest of 384-bit long. +/// +/// SHA-2 is a family of algorithms designed by the United States National +/// Security Agency (NSA), first published in 2001 and later standardized in +/// [FIPS 180-4][fips180]. +/// +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +const BlockHashBase sha384 = _SHA384(); + +class _SHA384 extends BlockHashBase { + const _SHA384(); + + @override + final String name = 'SHA-384'; + + @override + SHA384Hash createSink() => SHA384Hash(); +} + +/// Generates a SHA-384 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha384sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha384.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha3_224.dart b/hashlib/lib/src/sha3_224.dart new file mode 100644 index 0000000..54bd6f0 --- /dev/null +++ b/hashlib/lib/src/sha3_224.dart @@ -0,0 +1,44 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha3.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA3-224 is a member of SHA-3 family which uses 224-bit blocks to +/// generate a message digest of 224-bit long. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a 224-bit output using +/// the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase sha3_224 = _SHA3d224(); + +class _SHA3d224 extends BlockHashBase { + const _SHA3d224(); + + @override + final String name = 'SHA3-224'; + + @override + SHA3d224Hash createSink() => SHA3d224Hash(); +} + +/// Generates a SHA3-224 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha3_224sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha3_224.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha3_256.dart b/hashlib/lib/src/sha3_256.dart new file mode 100644 index 0000000..e2871c8 --- /dev/null +++ b/hashlib/lib/src/sha3_256.dart @@ -0,0 +1,44 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha3.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA3-256 is a member of SHA-3 family which uses 256-bit blocks to +/// generate a message digest of 256-bit long. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a 256-bit output using +/// the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase sha3_256 = _SHA3d256(); + +class _SHA3d256 extends BlockHashBase { + const _SHA3d256(); + + @override + final String name = 'SHA3-256'; + + @override + SHA3d256Hash createSink() => SHA3d256Hash(); +} + +/// Generates a SHA3-256 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha3_256sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha3_256.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha3_384.dart b/hashlib/lib/src/sha3_384.dart new file mode 100644 index 0000000..538a0ad --- /dev/null +++ b/hashlib/lib/src/sha3_384.dart @@ -0,0 +1,44 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha3.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA3-384 is a member of SHA-3 family which uses 384-bit blocks to +/// generate a message digest of 384-bit long. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a 384-bit output using +/// the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase sha3_384 = _SHA3d384(); + +class _SHA3d384 extends BlockHashBase { + const _SHA3d384(); + + @override + final String name = 'SHA3-384'; + + @override + SHA3d384Hash createSink() => SHA3d384Hash(); +} + +/// Generates a SHA3-384 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha3_384sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha3_384.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha3_512.dart b/hashlib/lib/src/sha3_512.dart new file mode 100644 index 0000000..2cce916 --- /dev/null +++ b/hashlib/lib/src/sha3_512.dart @@ -0,0 +1,44 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha3.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA3-512 is a member of SHA-3 family which uses 512-bit blocks to +/// generate a message digest of 512-bit long. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a 512-bit output using +/// the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const BlockHashBase sha3_512 = _SHA3d512(); + +class _SHA3d512 extends BlockHashBase { + const _SHA3d512(); + + @override + final String name = 'SHA3-512'; + + @override + SHA3d512Hash createSink() => SHA3d512Hash(); +} + +/// Generates a SHA3-512 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha3_512sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha3_512.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha512.dart b/hashlib/lib/src/sha512.dart new file mode 100644 index 0000000..9f49248 --- /dev/null +++ b/hashlib/lib/src/sha512.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-512 is a member of SHA-2 family which uses 512-bit internal state to +/// generate a message digest of 512-bit long. +/// +/// SHA-2 is a family of algorithms designed by the United States National +/// Security Agency (NSA), first published in 2001 and later standardized in +/// [FIPS 180-4][fips180]. +/// +/// [fips180]: https://csrc.nist.gov/publications/detail/fips/180/4/final +const BlockHashBase sha512 = _SHA512(); + +class _SHA512 extends BlockHashBase { + const _SHA512(); + + @override + final String name = 'SHA-512'; + + @override + SHA512Hash createSink() => SHA512Hash(); +} + +/// Generates a SHA-512 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha512sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha512.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/sha512t.dart b/hashlib/lib/src/sha512t.dart new file mode 100644 index 0000000..c7d2e8f --- /dev/null +++ b/hashlib/lib/src/sha512t.dart @@ -0,0 +1,63 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sha2/sha2.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHA-512/256 is a variation of SHA-512 which uses 512-bit internal state to +/// generate a message digest of 256-bit long truncating the last bits. +const BlockHashBase sha512t256 = _SHA512t256(); + +class _SHA512t256 extends BlockHashBase { + const _SHA512t256(); + + @override + final String name = 'SHA-512/256'; + + @override + SHA512t256Hash createSink() => SHA512t256Hash(); +} + +/// SHA-512/224 is a variation of SHA-512 which uses 512-bit internal state to +/// generate a message digest of 224-bit long truncating the last bits. +const BlockHashBase sha512t224 = _SHA512t224(); + +class _SHA512t224 extends BlockHashBase { + const _SHA512t224(); + + @override + final String name = 'SHA-512/224'; + + @override + SHA512t224Hash createSink() => SHA512t224Hash(); +} + +/// Generates a SHA-512/256 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines whether the hexadecimal output should be in uppercase +String sha512t256sum( + final String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha512t256.string(input, encoding).hex(uppercase); +} + +/// Generates a SHA-512/224 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sha512t224sum( + final String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sha512t224.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/shake128.dart b/hashlib/lib/src/shake128.dart new file mode 100644 index 0000000..6a66b33 --- /dev/null +++ b/hashlib/lib/src/shake128.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/shake.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHAKE-128 is a member of SHA-3 family which uses 128-bit blocks to +/// generate a message digest of arbitrary length. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a arbitrary length output +/// using the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const shake128 = _Shake128Builder(); + +/// [Shake128] instance to generate a 128-bit message digest. +const shake128_128 = Shake128(128 >>> 3); + +/// [Shake128] instance to generate a 160-bit message digest. +const shake128_160 = Shake128(160 >>> 3); + +/// [Shake128] instance to generate a 224-bit message digest. +const shake128_224 = Shake128(224 >>> 3); + +/// [Shake128] instance to generate a 256-bit message digest. +const shake128_256 = Shake128(256 >>> 3); + +/// [Shake128] instance to generate a 384-bit message digest. +const shake128_384 = Shake128(384 >>> 3); + +/// [Shake128] instance to generate a 512-bit message digest. +const shake128_512 = Shake128(512 >>> 3); + +class _Shake128Builder { + const _Shake128Builder(); + + /// Returns a [Shake128] instance. + /// + /// Parameters: + /// - [outputSizeInBytes] is the length of the output digest in bytes. + Shake128 of(int outputSizeInBytes) => Shake128(outputSizeInBytes); +} + +/// SHAKE-128 is a member of SHA-3 family which uses 128-bit blocks to +/// generate a message digest of arbitrary length. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a arbitrary length output +/// using the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +class Shake128 extends BlockHashBase { + final int outputSizeInBytes; + + /// Creates an instance to generate arbitrary size hash using SHAKE-128 + /// + /// Parameters: + /// - [outputSizeInBytes] is the length of the output digest in bytes. + const Shake128(this.outputSizeInBytes); + + @override + String get name => 'SHAKE-128/${outputSizeInBytes << 3}'; + + @override + Shake128Hash createSink() => Shake128Hash(outputSizeInBytes); +} + +/// Generates a SHAKE-128 checksum in hexadecimal of arbitrary length +/// +/// Parameters: +/// - [input] is the string to hash +/// - [outputSize] is the length of the output digest in bytes. The +/// hexadecimal string output is twice as that. You can expect a string of +/// length `2 * outputSizeInBytes` from this function. +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String shake128sum( + String input, + int outputSize, [ + Encoding? encoding, + bool uppercase = false, +]) { + return Shake128(outputSize).string(input, encoding).hex(uppercase); +} + +/// Creates a SHAKE-128 based **infinite** hash generator. +/// +/// If [seed] is provided it will be used as an input to the algorithm. +/// With a proper seed, this can work as a random number generator. +/// +/// Example: +/// ``` +/// final hash = shake128generator().take(500).toList(); +/// ``` +/// +/// **Warning: This is an infinite `Iterable`. Do not call `toList` directly!** +Iterable shake128generator([List? seed]) sync* { + int i; + final sink = Shake128Hash(0); + if (seed != null && seed.isNotEmpty) { + sink.$process(seed, 0, seed.length); + } + sink.$finalize(); + while (true) { + for (i = 0; i < sink.blockLength; ++i) { + yield sink.buffer[i]; + } + sink.$update(); + } +} diff --git a/hashlib/lib/src/shake256.dart b/hashlib/lib/src/shake256.dart new file mode 100644 index 0000000..d906c58 --- /dev/null +++ b/hashlib/lib/src/shake256.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/shake.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SHAKE-256 is a member of SHA-3 family which uses 256-bit blocks to +/// generate a message digest of arbitrary length. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a arbitrary length output +/// using the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +const shake256 = _Shake256Builder(); + +/// [Shake256] instance to generate a 128-bit message digest. +const shake256_128 = Shake256(128 >>> 3); + +/// [Shake256] instance to generate a 160-bit message digest. +const shake256_160 = Shake256(160 >>> 3); + +/// [Shake256] instance to generate a 224-bit message digest. +const shake256_224 = Shake256(224 >>> 3); + +/// [Shake256] instance to generate a 256-bit message digest. +const shake256_256 = Shake256(256 >>> 3); + +/// [Shake256] instance to generate a 384-bit message digest. +const shake256_384 = Shake256(384 >>> 3); + +/// [Shake256] instance to generate a 512-bit message digest. +const shake256_512 = Shake256(512 >>> 3); + +class _Shake256Builder { + const _Shake256Builder(); + + /// Returns a [Shake256] instance. + /// + /// Parameters: + /// - [outputSizeInBytes] is the length of the output digest in bytes. + Shake256 of(int outputSizeInBytes) => Shake256(outputSizeInBytes); +} + +/// SHAKE-256 is a member of SHA-3 family which uses 256-bit blocks to +/// generate a message digest of arbitrary length. +/// +/// SHA-3 is a subset of Keccak cryptographic family, standardized by NIST +/// on 2015 to substitute SHA-2 if necessary. Since the algorithm uses the +/// [sponge construction][sponge], it can generate any arbitrary length of +/// message digest. This implementation generates a arbitrary length output +/// using the [standard SHA-3 algorithm][fips202]. +/// +/// [sponge]: https://en.wikipedia.org/wiki/Sponge_function +/// [fips202]: https://csrc.nist.gov/publications/detail/fips/202/final +class Shake256 extends BlockHashBase { + final int outputSizeInBytes; + + /// Creates an instance to generate arbitrary size hash using SHAKE-256 + /// + /// Parameters: + /// - [outputSizeInBytes] is the length of the output digest in bytes. + const Shake256(this.outputSizeInBytes); + + @override + String get name => 'SHAKE-256/${outputSizeInBytes << 3}'; + + @override + Shake256Hash createSink() => Shake256Hash(outputSizeInBytes); +} + +/// Generates a SHAKE-256 checksum in hexadecimal of arbitrary length +/// +/// Parameters: +/// - [input] is the string to hash +/// - [outputSize] is the length of the output digest in bytes. The +/// hexadecimal string output is twice as that. You can expect a string of +/// length `2 * outputSizeInBytes` from this function. +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String shake256sum( + String input, + int outputSize, [ + Encoding? encoding, + bool uppercase = false, +]) { + return Shake256(outputSize).string(input, encoding).hex(uppercase); +} + +/// Creates a SHAKE-256 based **infinite** hash generator. +/// +/// If [seed] is provided it will be used as an input to the algorithm. +/// With a proper seed, this can work as a random number generator. +/// +/// Example: +/// ``` +/// final hash = shake256generator().take(500).toList(); +/// ``` +/// +/// **Warning: This is an infinite `Iterable`. Do not call `toList` directly!** +Iterable shake256generator([List? seed]) sync* { + int i; + final sink = Shake256Hash(0); + if (seed != null && seed.isNotEmpty) { + sink.$process(seed, 0, seed.length); + } + sink.$finalize(); + while (true) { + for (i = 0; i < sink.blockLength; ++i) { + yield sink.buffer[i]; + } + sink.$update(); + } +} diff --git a/hashlib/lib/src/sm3.dart b/hashlib/lib/src/sm3.dart new file mode 100644 index 0000000..e26c35e --- /dev/null +++ b/hashlib/lib/src/sm3.dart @@ -0,0 +1,43 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/sm3.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// SM3 [ISO.IEC.10118-3] [GBT.32905-2016] is a cryptographic hash algorithm +/// published by the [State Cryptography Administration (SCA) of China][SCA] +/// as an authorized cryptographic hash algorithm for the use within China. +/// +/// It can be used on digital signatures, generating message authentication +/// codes, and random numbers. +/// +/// [SCA]: http://www.sca.gov.cn +/// [ISO.IEC.10118-3]: https://www.iso.org/standard/67116.html +/// [GBT.32905-2016]: https://www.chinesestandard.net/PDF.aspx/GBT32905-2016 +const BlockHashBase sm3 = _SM3(); + +class _SM3 extends BlockHashBase { + const _SM3(); + + @override + final String name = 'SM3'; + + @override + SM3Hash createSink() => SM3Hash(); +} + +/// Generates a SM3 checksum in hexadecimal +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +/// - [uppercase] defines if the hexadecimal output should be in uppercase +String sm3sum( + String input, [ + Encoding? encoding, + bool uppercase = false, +]) { + return sm3.string(input, encoding).hex(uppercase); +} diff --git a/hashlib/lib/src/totp.dart b/hashlib/lib/src/totp.dart new file mode 100644 index 0000000..3d217e1 --- /dev/null +++ b/hashlib/lib/src/totp.dart @@ -0,0 +1,82 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:hashlib/src/hotp.dart'; +import 'package:hashlib/src/sha1.dart'; + +/// A Time-based One-Time Password (TOTP) algorithm implementation derived +/// from [rfc6238]. +/// +/// [rfc6238]: https://www.ietf.org/rfc/rfc6238.html +class TOTP extends HOTP { + final Duration period; + int _timeDelta = 0; + final int _periodMS; + final _controller = StreamController.broadcast(); + + /// Creates an instance of the [TOTP] class with the specified parameters. + /// + /// Parameters: + /// - [secret] is the shared secret as a list of bytes for generating the OTP. + /// - [digits] is the number of digits in the generated OTP (default is 6). + /// - [period] is duration in seconds an OTP is valid for (default is 30). + /// - [algo] is the block hash algorithm to use (default is [sha1]). + /// - [label] is an optional string to identify the account or service the OTP + /// is associated with. + /// - [issuer] is an optional string to specify the entity issuing the OTP. + TOTP( + super.secret, { + super.algo = sha1, + super.digits = 6, + super.label, + super.issuer, + this.period = const Duration(seconds: 30), + }) : _periodMS = period.inMilliseconds, + super(counter: Uint8List(8)) { + // setup stream controller + Timer? timer; + _controller.onCancel = () { + timer?.cancel(); + }; + _controller.onListen = () { + int d = _periodMS - (currentTime % _periodMS); + timer = Timer(Duration(milliseconds: d), () { + timer = Timer.periodic(period, (_) { + _controller.sink.add(value()); + }); + _controller.sink.add(value()); + }); + _controller.sink.add(value()); + }; + } + + /// A broadcast stream that reports new OTP value on every [period] interval + Stream get stream => _controller.stream; + + /// A broadcast stream that reports new OTP value as string on every [period] + /// interval + Stream get streamString => + _controller.stream.map((e) => e.toString().padLeft(digits, '0')); + + /// The current time in milliseconds since EPOCH with adjusted delta shift + int get currentTime => DateTime.now().millisecondsSinceEpoch + _timeDelta; + + @override + int value() { + int i, c; + c = currentTime ~/ _periodMS; + for (i = 7; i >= 0; --i, c >>>= 8) { + counter[i] = c & 0xFF; + } + return super.value(); + } + + /// Adjust the internal clock with the parameter [delta] - the difference in + /// milliseconds between the actual clock and the current system clock. + void adjustClock(int delta) { + _timeDelta = delta; + } +} diff --git a/hashlib/lib/src/uuid.dart b/hashlib/lib/src/uuid.dart new file mode 100644 index 0000000..a07b773 --- /dev/null +++ b/hashlib/lib/src/uuid.dart @@ -0,0 +1,140 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'random/uuid_v1.dart'; +import 'random/uuid_v3.dart'; +import 'random/uuid_v4.dart'; +import 'random/uuid_v5.dart'; +import 'random/uuid_v6.dart'; +import 'random/uuid_v7.dart'; +import 'random/uuid_v8.dart'; + +const _v1 = UUIDv1(); +const _v3 = UUIDv3(); +const _v4 = UUIDv4(); +const _v5 = UUIDv5(); +const _v6 = UUIDv6(); +const _v7 = UUIDv7(); +const _v8 = UUIDv8(); + +/// A UUID is 128 bits long and is intended to guarantee uniqueness. This class +/// contains implementations for different versions of UUIDs based on the +/// specification from [RFC-9562][rfc]. +/// +/// [rfc]: https://www.ietf.org/rfc/rfc9562.html +const uuid = _UUID(); + +enum Namespace { + dns._('6ba7b810-9dad-11d1-80b4-00c04fd430c8'), + url._('6ba7b811-9dad-11d1-80b4-00c04fd430c8'), + oid._('6ba7b812-9dad-11d1-80b4-00c04fd430c8'), + x500._('6ba7b814-9dad-11d1-80b4-00c04fd430c8'), + nil._('00000000-0000-0000-0000-000000000000'), + max._('ffffffff-ffff-ffff-ffff-ffffffffffff'); + + /// The string value of this namespace + final String value; + + const Namespace._(this.value); + + static String get time => _v6.generate(); +} + +class _UUID { + const _UUID(); + + /// Generate a time-based UUID. Use [v6] instead of [v1] wherever possible. + /// + /// Parameters: + /// - [utc] : The time in UTC (Default: current time). + /// - [node] : The node ID (48-bit integer, Default: random). + /// - [clockSeq] : The clock sequence (14-bit integer, Default: random). + @pragma('vm:prefer-inline') + String v1({ + DateTime? utc, + int? node, + int? clockSeq, + }) => + _v1.generate( + now: utc, + node: node, + clockSeq: clockSeq, + ); + + /// Generate a UUID based on MD5-hash. Due to vulnerability of MD5, it is + /// recommended to use [v5] instead. + /// + /// The [namespace] must be a valid UUID. Some predefined namespaces are + /// available in [Namespace]. i.e.: `Namespace.dns.value`. A random namespace + /// is used if not provided. + @pragma('vm:prefer-inline') + String v3({ + String? namespace, + String? name, + }) => + _v3.generate( + name: name, + namespace: namespace, + ); + + /// Generate a random-based UUID. + @pragma('vm:prefer-inline') + String v4() => _v4.generate(); + + /// Generate a UUID based on SHA1-hash. + /// + /// The [namespace] must be a valid UUID. Some predefined namespaces are + /// available in [Namespace]. i.e.: `Namespace.dns.value`. A random namespace + /// is used if not provided. + @pragma('vm:prefer-inline') + String v5({ + String? namespace, + String? name, + }) => + _v5.generate( + name: name, + namespace: namespace, + ); + + /// Generate a time-based UUID. + /// + /// Parameters: + /// - [utc] : The time in UTC (Default: current time). + /// - [node] : The node ID (48-bit integer, Default: random). + /// - [clockSeq] : The clock sequence (14-bit integer, Default: random). + @pragma('vm:prefer-inline') + String v6({ + DateTime? utc, + int? node, + int? clockSeq, + }) => + _v6.generate( + now: utc, + node: node, + clockSeq: clockSeq, + ); + + /// Generate a time-based and random-based UUID. + /// + /// Parameters: + /// - [utc] : The time in UTC (Default: current time). + @pragma('vm:prefer-inline') + String v7({ + DateTime? utc, + }) => + _v7.generate(now: utc); + + /// Generate a nonce based UUID. + /// + /// Parameters: + /// - [nonce] : A 16-byte nonce (128-bit) + @pragma('vm:prefer-inline') + String v8({ + Uint8List? nonce, + }) => + _v8.generate( + nonce: nonce, + ); +} diff --git a/hashlib/lib/src/xxh128.dart b/hashlib/lib/src/xxh128.dart new file mode 100644 index 0000000..e77812d --- /dev/null +++ b/hashlib/lib/src/xxh128.dart @@ -0,0 +1,63 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/xxh3/xxh3_128.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// An instance of [XXH128] with seed = 0 +const XXH128 xxh128 = XXH128(seed: 0); + +/// An instance of [XXH128] with seed = 0 +const XXH128 xxh3_128 = xxh128; + +/// This is an implementation of 128-bit XXH3 hash algorithm of xxHash family +/// derived from https://github.com/Cyan4973/xxHash +/// +/// XXH3 is a new high-performance variant XXHash algorithm that is designed to +/// be fast, with a low memory footprint, and to produce high-quality hash +/// values with good distribution and [low collision rates][wiki]. +/// +/// One of the main improvements in XXH3 compared to XXHash is its use of a +/// new mixing function that provides better mixing of the input data and +/// results in improved distribution of the resulting hash values. +/// +/// [wiki]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison +/// +/// **WARNING: It should not be used for cryptographic purposes.** +class XXH128 extends BlockHashBase { + final int seed; + final List? secret; + + /// Creates a new instance of [XXH128]. + /// + /// Parameters: + /// - [seed] is an optional 64-bit integer. Default: 0 + /// - [secret] is an array of bytes. The length should be at least 136. + /// - If the [secret] is present, the [seed] is ignored. + const XXH128({this.seed = 0, this.secret}); + + @override + final String name = 'XXH128'; + + @override + XXH3Sink128bit createSink() => secret == null + ? XXH3Sink128bit.withSeed(seed) + : XXH3Sink128bit.withSecret(secret); + + /// Get an instance of [xxh128] with an specific seed + XXH128 withSeed(int seed) => XXH128(seed: seed, secret: secret); + + /// Get an instance of [xxh128] with a secret + XXH128 withSecret(List secret) => XXH128(seed: seed, secret: secret); +} + +/// Gets the 128-bit XXH3 hash of a String in hexadecimal. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +String xxh128sum(String input, [Encoding? encoding]) { + return xxh128.string(input, encoding).hex(); +} diff --git a/hashlib/lib/src/xxh3.dart b/hashlib/lib/src/xxh3.dart new file mode 100644 index 0000000..a4e4b43 --- /dev/null +++ b/hashlib/lib/src/xxh3.dart @@ -0,0 +1,72 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/xxh3/xxh3_64.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// An instance of [XXH3] with seed = 0 +const XXH3 xxh3 = XXH3(seed: 0); + +/// An instance of [XXH3] with seed = 0 +const XXH3 xxh3_64 = xxh3; + +/// This is an implementation of 64-bit XXH3 hash algorithm of xxHash family +/// derived from https://github.com/Cyan4973/xxHash +/// +/// XXH3 is a new high-performance variant XXHash algorithm that is designed to +/// be fast, with a low memory footprint, and to produce high-quality hash +/// values with good distribution and [low collision rates][wiki]. +/// +/// One of the main improvements in XXH3 compared to XXHash is its use of a +/// new mixing function that provides better mixing of the input data and +/// results in improved distribution of the resulting hash values. +/// +/// [wiki]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison +/// +/// **WARNING: It should not be used for cryptographic purposes.** +class XXH3 extends BlockHashBase { + final int seed; + final List? secret; + + /// Creates a new instance of [XXH3]. + /// + /// Parameters: + /// - [seed] is an optional 64-bit integer. Default: 0 + /// - [secret] is an array of bytes. The length should be at least 136. + /// - If the [secret] is present, the [seed] is ignored. + const XXH3({this.seed = 0, this.secret}); + + @override + final String name = 'XXH3'; + + @override + XXH3Sink64bit createSink() => secret == null + ? XXH3Sink64bit.withSeed(seed) + : XXH3Sink64bit.withSecret(secret); + + /// Get an instance of [xxh3] with an specific seed + XXH3 withSeed(int seed) => XXH3(seed: seed, secret: secret); + + /// Get an instance of [xxh3] with a secret + XXH3 withSecret(List secret) => XXH3(seed: seed, secret: secret); +} + +/// Gets the 64-bit XXH3 value of a String. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +int xxh3code(String input, [Encoding? encoding]) { + return xxh3.string(input, encoding).number(); +} + +/// Gets the 64-bit XXH3 hash of a String in hexadecimal. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +String xxh3sum(String input, [Encoding? encoding]) { + return xxh3.string(input, encoding).hex(); +} diff --git a/hashlib/lib/src/xxh32.dart b/hashlib/lib/src/xxh32.dart new file mode 100644 index 0000000..2ed95f4 --- /dev/null +++ b/hashlib/lib/src/xxh32.dart @@ -0,0 +1,58 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/xxh32/xxh32.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// An instance of [XXHash32] with seed = 0 +const XXHash32 xxh32 = XXHash32(0); + +/// XXHash32 is a fast and efficient non-cryptographic hash function for +/// 32-bit platforms. It is designed for producing a quick and reliable hash +/// value for a given data, which can be used for many applications, such as +/// checksum, data validation, etc. In addition, it has a good distribution of +/// hash values, which helps to reduce [collisions][wiki]. +/// +/// This implementation was derived from https://github.com/Cyan4973/xxHash +/// +/// [wiki]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison +/// +/// **WARNING: It should not be used for cryptographic purposes.** +class XXHash32 extends BlockHashBase { + final int seed; + + /// Creates a new instance of [XXHash32]. + /// + /// Parameters: + /// - [seed] is an optional 32-bit integer. Default: 0 + const XXHash32([this.seed = 0]); + + @override + final String name = 'XXH32'; + + @override + XXHash32Sink createSink() => XXHash32Sink(seed); + + /// Get and instance of [XXHash32] with an specific seed + XXHash32 withSeed(int seed) => XXHash32(seed); +} + +/// Gets the 32-bit xxHash value of a String +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +int xxh32code(String input, [Encoding? encoding]) { + return xxh32.string(input, encoding).number(); +} + +/// Gets the 32-bit xxHash hash of a String in hexadecimal. +/// +/// Parameters: +/// - [input] is the string to hash +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +String xxh32sum(String input, [Encoding? encoding]) { + return xxh32.string(input, encoding).hex(); +} diff --git a/hashlib/lib/src/xxh64.dart b/hashlib/lib/src/xxh64.dart new file mode 100644 index 0000000..b445145 --- /dev/null +++ b/hashlib/lib/src/xxh64.dart @@ -0,0 +1,58 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/src/algorithms/xxh64/xxh64.dart'; +import 'package:hashlib/src/core/block_hash.dart'; + +/// An instance of [XXHash64] with seed = 0 +const XXHash64 xxh64 = XXHash64(0); + +/// XXHash64 is a fast and efficient non-cryptographic hash function for +/// 64-bit platforms. It is designed for producing a quick and reliable hash +/// value for a given data, which can be used for many applications, such as +/// checksum, data validation, etc. In addition, it has a good distribution of +/// hash values, which helps to reduce [collisions][wiki]. +/// +/// This implementation was derived from https://github.com/Cyan4973/xxHash +/// +/// [wiki]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison +/// +/// **WARNING: It should not be used for cryptographic purposes.** +class XXHash64 extends BlockHashBase { + final int seed; + + /// Creates a new instance of [XXHash64]. + /// + /// Parameters: + /// - [seed] is an optional 64-bit integer. Default: 0 + const XXHash64([this.seed = 0]); + + @override + final String name = 'XXH64'; + + @override + XXHash64Sink createSink() => XXHash64Sink(seed); + + /// Get and instance of [XXHash64] with an specific seed + XXHash64 withSeed(int seed) => XXHash64(seed); +} + +/// Gets the 64-bit xxHash value of a String. +/// +/// Parameters: +/// - [input] is the string to hash. +/// - The [encoding] is the encoding to use. Default is `input.codeUnits`. +int xxh64code(String input, [Encoding? encoding]) { + return xxh64.string(input, encoding).number(); +} + +/// Gets the 64-bit xxHash hash of a String in hexadecimal. +/// +/// Parameters: +/// - [input] is the string to hash. +/// - The [encoding] is the encoding to use. Default is `input.codeUnits` +String xxh64sum(String input, [Encoding? encoding]) { + return xxh64.string(input, encoding).hex(); +} diff --git a/hashlib/pubspec.yaml b/hashlib/pubspec.yaml new file mode 100644 index 0000000..32b9742 --- /dev/null +++ b/hashlib/pubspec.yaml @@ -0,0 +1,34 @@ +name: hashlib +description: Secure hash functions, checksum generators, and key derivation algorithms optimized for Dart. +homepage: https://github.com/bitanon/hashlib +version: 2.2.0 + +environment: + sdk: '>=2.19.0 <4.0.0' + +platforms: + android: + ios: + linux: + macos: + web: + windows: + +dependencies: + hashlib_codecs: ^3.0.1 + +dev_dependencies: + lints: any + test: any + crypto: any + hash: any + pointycastle: any + benchmark_harness: any + argon2: any + pana: any + coverage: any + cobertura: any + junitreport: any + +funding: + - https://paypal.me/sd1pu diff --git a/hashlib/test/adler32_test.dart b/hashlib/test/adler32_test.dart new file mode 100644 index 0000000..156e5d3 --- /dev/null +++ b/hashlib/test/adler32_test.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/adler32.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('Adler-32 test', () { + test("name", () { + expect(adler32.name, 'ALDER-32'); + }); + test('adler32code with empty string', () { + expect(adler32code(""), 1); + }); + test('adler32code with a string', () { + expect(adler32code("Wikipedia"), 300286872); + }); + test('sink test', () { + final sink = Adler32Hash(); + expect(sink.closed, isFalse); + expect(sink.a, 1); + expect(sink.b, 0); + sink.add([10, 20]); + expect(sink.closed, isFalse); + sink.close(); + expect(sink.closed, isTrue); + expect(() => sink.add([10]), throwsStateError); + sink.reset(); + expect(sink.closed, isFalse); + expect(sink.a, 1); + expect(sink.b, 0); + sink.add([10, 20]); + expect(sink.digest().number(), (sink.b << 16) | sink.a); + expect(sink.closed, isTrue); + }); + }); +} diff --git a/hashlib/test/argon2_test.dart b/hashlib/test/argon2_test.dart new file mode 100644 index 0000000..84c35e7 --- /dev/null +++ b/hashlib/test/argon2_test.dart @@ -0,0 +1,565 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('functionality test', () { + test("name", () { + expect( + Argon2( + parallelism: 1, + memorySizeKB: 10, + iterations: 1, + ).name, + r'argon2id', + ); + expect( + Argon2( + parallelism: 1, + memorySizeKB: 10, + iterations: 1, + type: Argon2Type.argon2id, + ).name, + r'argon2id', + ); + expect( + Argon2( + parallelism: 1, + memorySizeKB: 10, + iterations: 1, + type: Argon2Type.argon2d, + ).name, + r'argon2d', + ); + expect( + Argon2( + parallelism: 1, + memorySizeKB: 10, + iterations: 1, + type: Argon2Type.argon2i, + ).name, + r'argon2i', + ); + }); + }); + // Test cases are generated by https://argon2.online/ + group('Argon2 v19 test', () { + test("argon2i m=16, t=2, p=1 @ out = 16", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2i, + hashLength: 16, + iterations: 2, + parallelism: 1, + memorySizeKB: 16, + salt: "some salt".codeUnits, + ); + final password = 'password'.codeUnits; + final matcher = "bb5794ea66451b8fce3a84dd02d33949"; + final encoded = + r"$argon2i$v=19$m=16,t=2,p=1$c29tZSBzYWx0$u1eU6mZFG4/OOoTdAtM5SQ"; + var result = argon2.convert(password); + expect(result.toString(), equals(encoded)); + expect(result.hex(), matcher); + expect(result.encoded(), encoded); + expect(argon2.encode(password), encoded); + }); + test("argon2d m=16, t=2, p=1 @ out = 16", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2d, + hashLength: 16, + iterations: 2, + parallelism: 1, + memorySizeKB: 16, + salt: "some salt".codeUnits, + ); + final matcher = "cf916880b91ba8a1390fff6b624baa27"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + test("argon2id m=16, t=2, p=1 @ out = 16", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2id, + hashLength: 16, + iterations: 2, + parallelism: 1, + memorySizeKB: 16, + salt: "some salt".codeUnits, + ); + final matcher = "88c91661b3cea3c3853593608881f324"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + + test("argon2i m=256, t=2, p=4 @ out = 32", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2i, + hashLength: 32, + iterations: 2, + parallelism: 4, + memorySizeKB: 256, + salt: "some salt".codeUnits, + ); + final matcher = + "aaef1c23ce86889c7d76f5ea214760fb66900916546cde42ebdc47914daed123"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + test("argon2d m=256, t=2, p=4 @ out = 32", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2d, + hashLength: 32, + iterations: 2, + parallelism: 4, + memorySizeKB: 256, + salt: "some salt".codeUnits, + ); + final matcher = + "c31433dbefadf7aa527bbbcc7beace0d8d70973719c6efb1c24fb21278569701"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + test("argon2id m=256, t=2, p=4 @ out = 32", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2id, + hashLength: 32, + iterations: 2, + parallelism: 4, + memorySizeKB: 256, + salt: "some salt".codeUnits, + ); + final matcher = + "c23e4a305f649971527eda884bda6b481004aedd31740460da3d43db8946786f"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + + test("encoded hash instance check", () { + final encoded = + r"$argon2id$v=19$m=128,t=1,p=4$c29tZSBzYWx0$24VHMpaU5EkkdH5rpdnb5zeOf3Y"; + final matcher = "db8547329694e44924747e6ba5d9dbe7378e7f76"; + final argon2 = Argon2.fromEncoded(fromCrypt(encoded)); + expect(argon2.type, Argon2Type.argon2id); + expect(argon2.version, Argon2Version.v13); + expect(argon2.memorySizeKB, 128); + expect(argon2.parallelism, 4); + expect(argon2.iterations, 1); + expect(argon2.hashLength, 20); + expect(argon2.salt, "some salt".codeUnits); + var result = argon2.convert("password".codeUnits); + expect(result.hex(), matcher); + expect(result.encoded(), encoded); + }); + + test("argon2Verify with encoded", () { + final encoded = + r"$argon2id$v=19$m=128,t=1,p=4$c29tZSBzYWx0$24VHMpaU5EkkdH5rpdnb5zeOf3Y"; + expect(argon2Verify(encoded, "password".codeUnits), isTrue); + }); + + test("argon2Verify without the hash", () { + final password = "password".codeUnits; + final encoded = r"$argon2id$v=19$m=128,t=1,p=4$c29tZSBzYWx0"; + expect(() => argon2Verify(encoded, password), throwsArgumentError); + }); + + test("argon2Verify with password", () { + final matcher = "db8547329694e44924747e6ba5d9dbe7378e7f76"; + var result = Argon2( + type: Argon2Type.argon2id, + salt: 'some salt'.codeUnits, + hashLength: 20, + iterations: 1, + parallelism: 4, + memorySizeKB: 128, + ).verify( + fromHex(matcher), + "password".codeUnits, + ); + expect(result, true); + }); + + test('argon2i', () { + final result = argon2i( + 'password'.codeUnits, + "some salt".codeUnits, + hashLength: 16, + security: Argon2Security( + 'custom', + m: 16, + p: 1, + t: 2, + ), + ); + final matcher = "bb5794ea66451b8fce3a84dd02d33949"; + final encoded = + r"$argon2i$v=19$m=16,t=2,p=1$c29tZSBzYWx0$u1eU6mZFG4/OOoTdAtM5SQ"; + expect(result.hex(), matcher); + expect(result.encoded(), encoded); + }); + + test('argon2d', () { + final result = argon2d( + 'password'.codeUnits, + "some salt".codeUnits, + hashLength: 16, + security: Argon2Security( + 'custom', + m: 16, + p: 1, + t: 2, + ), + ); + final matcher = "cf916880b91ba8a1390fff6b624baa27"; + final salt = r"$argon2d$v=19$m=16,t=2,p=1$c29tZSBzYWx0"; + expect(result.hex(), matcher); + expect(result.encoded(), startsWith(salt)); + }); + + test('argon2id', () { + final result = argon2id( + 'password'.codeUnits, + "some salt".codeUnits, + hashLength: 16, + security: Argon2Security( + 'custom', + m: 16, + p: 1, + t: 2, + ), + ); + final matcher = "88c91661b3cea3c3853593608881f324"; + final salt = r"$argon2id$v=19$m=16,t=2,p=1$c29tZSBzYWx0"; + expect(result.hex(), matcher); + expect(result.encoded(), startsWith(salt)); + }); + + test("multiple call with same instance", () { + final argon2 = Argon2( + version: Argon2Version.v13, + type: Argon2Type.argon2i, + hashLength: 16, + iterations: 2, + parallelism: 1, + memorySizeKB: 16, + salt: "some salt".codeUnits, + ); + final matcher = "bb5794ea66451b8fce3a84dd02d33949"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + expect(argon2.convert('password'.codeUnits).hex(), matcher); + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + + test("with personalization", () { + final personalization = "personalization".codeUnits; + final argon2 = Argon2.fromSecurity( + Argon2Security.test, + hashLength: 16, + salt: "some salt".codeUnits, + personalization: personalization, + ); + final matcher = "33561b7ad59b447aa5f6e3113d2f32ca"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + expect(argon2.personalization, equals(personalization)); + }); + + test("with key", () { + final key = "random key".codeUnits; + final argon2 = Argon2.fromSecurity( + Argon2Security.test, + hashLength: 16, + salt: "some salt".codeUnits, + key: key, + ); + final matcher = "4ad0d2f98a6e7f6e3e99c520d1813c07"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + expect(argon2.key, equals(key)); + }); + + test("with key and personalization", () { + final argon2 = Argon2.fromSecurity( + Argon2Security.test, + hashLength: 16, + salt: "some salt".codeUnits, + key: "random key".codeUnits, + personalization: "personalization".codeUnits, + ); + final matcher = "0bd2a8c0386b4125a6f439f2f863fc35"; + expect(argon2.convert('password'.codeUnits).hex(), matcher); + }); + }); + + group('Argon2Context Tests', () { + // Test for Argon2Context constructor + test('Creates Argon2Context with valid parameters', () { + var salt = List.generate(16, (i) => i); + var context = Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + salt: salt, + hashLength: 32, + ); + + expect(context.salt, equals(salt)); + expect(context.passes, equals(3)); + expect(context.lanes, equals(2)); + expect(context.memorySizeKB, equals(8192)); + expect(context.hashLength, equals(32)); + }); + + // Tests for invalid parameters + test('Throws if hashLength is too small', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + hashLength: 3, + ), + throwsA(isA().having( + (e) => e.message, 'message', 'The tag length must be at least 4')), + ); + }); + + test('Throws if hashLength is too large', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + hashLength: 0x3FFFFFF + 1, + ), + throwsA(isA().having((e) => e.message, 'message', + 'The tag length must be at most 67108863')), + ); + }); + + test('Throws if parallelism is too small', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 0, + memorySizeKB: 8192, + ), + throwsA(isA().having( + (e) => e.message, 'message', 'The parallelism must be at least 1')), + ); + }); + + test('Throws if parallelism is too large', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 0x7FFF + 1, + memorySizeKB: 8192, + ), + throwsA(isA().having((e) => e.message, 'message', + 'The parallelism must be at most 32767')), + ); + }); + + test('Throws if iterations are too few', () { + expect( + () => Argon2Context( + iterations: 0, + parallelism: 2, + memorySizeKB: 8192, + ), + throwsA(isA().having( + (e) => e.message, 'message', 'The iterations must be at least 1')), + ); + }); + + test('Throws if iterations are too many', () { + expect( + () => Argon2Context( + iterations: 0x3FFFFFF + 1, + parallelism: 2, + memorySizeKB: 8192, + ), + throwsA(isA().having((e) => e.message, 'message', + 'The iterations must be at most 67108863')), + ); + }); + + test('Throws if memorySizeKB is too small for parallelism', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 15, + ), + throwsA(isA().having((e) => e.message, 'message', + 'The memory size must be at least 8 * parallelism')), + ); + }); + + test('Throws if memorySizeKB is too large', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 0x3FFFFFF + 1, + ), + throwsA(isA().having((e) => e.message, 'message', + 'The memorySizeKB must be at most 67108863')), + ); + }); + + test('Throws if salt is too short', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + salt: List.generate(7, (i) => i), + ), + throwsA(isA().having((e) => e.message, 'message', + 'The salt must be at least 8 bytes long')), + ); + }); + + test('Throws if salt is too long', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + salt: Uint8List(0x3FFFFFF + 1), + ), + throwsA(isA().having((e) => e.message, 'message', + 'The salt must be at most 67108863 bytes long')), + ); + }); + + test('Throws if key is too short', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + key: [], + ), + throwsA(isA().having((e) => e.message, 'message', + 'The key must be at least 1 bytes long')), + ); + }); + + test('Throws if key is too long', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + key: Uint8List(0x3FFFFFF + 1), + ), + throwsA(isA().having((e) => e.message, 'message', + 'The key must be at most 67108863 bytes long')), + ); + }); + + test('Throws if personalization data is too short', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + personalization: [], + ), + throwsA(isA()), + ); + }); + + test('Throws if personalization data is too long', () { + expect( + () => Argon2Context( + iterations: 3, + parallelism: 2, + memorySizeKB: 8192, + personalization: Uint8List(0x3FFFFFF + 1), + ), + throwsArgumentError, + ); + }); + + // Test for Argon2Context.fromEncoded factory method + test('Creates Argon2Context from encoded string with valid parameters', () { + var cryptData = fromCrypt( + r'$argon2id$v=19$m=8192,t=3,p=2$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + var context = Argon2Context.fromEncoded(cryptData); + + expect(context.type, equals(Argon2Type.argon2id)); + expect(context.version, equals(Argon2Version.v13)); + expect(context.memorySizeKB, equals(8192)); + expect(context.passes, equals(3)); + expect(context.lanes, equals(2)); + expect(context.salt.length, equals(9)); + }); + + test('Throws if encoded string has invalid type', () { + var cryptData = fromCrypt( + r'$argon2x$v=19$m=8192,t=3,p=2$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'Unknown type')), + ); + }); + + test('Throws if encoded string has invalid version', () { + var cryptData = fromCrypt( + r'$argon2i$v=99$m=8192,t=3,p=2$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'Unknown version')), + ); + }); + + test('Throws if encoded string has no parameters', () { + var cryptData = + fromCrypt(r'$argon2i$v=19$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'No paramters')), + ); + }); + + test('Throws if encoded string is missing "m" parameter', () { + var cryptData = fromCrypt( + r'$argon2i$v=19$t=3,p=2$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'Missing parameter: m')), + ); + }); + + test('Throws if encoded string is missing "t" parameter', () { + var cryptData = fromCrypt( + r'$argon2i$v=19$m=8192,p=2$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'Missing parameter: t')), + ); + }); + + test('Throws if encoded string is missing "p" parameter', () { + var cryptData = fromCrypt( + r'$argon2i$v=19$m=8192,t=3$c29tZSBzYWx0$CZOgzrCgoVUzMoR/dcUZyw'); + expect( + () => Argon2Context.fromEncoded(cryptData), + throwsA(isA() + .having((e) => e.message, 'message', 'Missing parameter: p')), + ); + }); + }); +} diff --git a/hashlib/test/bcrypt_test.dart b/hashlib/test/bcrypt_test.dart new file mode 100644 index 0000000..ef8437b --- /dev/null +++ b/hashlib/test/bcrypt_test.dart @@ -0,0 +1,643 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('bcrypt test', () { + group('functionality test', () { + test("name", () { + expect(Bcrypt(cost: 10).name, r'Bcrypt/2b'); + expect(Bcrypt(cost: 10, version: BcryptVersion.$2a).name, r'Bcrypt/2a'); + expect(Bcrypt(cost: 10, version: BcryptVersion.$2x).name, r'Bcrypt/2x'); + expect(Bcrypt(cost: 10, version: BcryptVersion.$2y).name, r'Bcrypt/2y'); + expect(Bcrypt(cost: 10, version: BcryptVersion.$2b).name, r'Bcrypt/2b'); + }); + + // http://openwall.info/wiki/john/sample-hashes + test("bcrypt", () { + const password = r"password"; + const salt = r"$2a$05$bvIG6Nmid91Mu9RcmmWZfO"; + const encoded = + r"$2a$05$bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe"; + var output = bcrypt(utf8.encode(password), salt); + expect(output, equals(encoded)); + }); + + test("bcryptVerify", () { + const password = r"password"; + const encoded = + r"$2a$05$bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe"; + expect(bcryptVerify(encoded, password.codeUnits), true); + }); + + test("bcryptSalt", () { + final salt = bcryptSalt(nb: 5, version: BcryptVersion.$2a); + expect(salt.length, 29); + expect(salt, startsWith(r"$2a$05$")); + }); + + test("bcryptSalt with security", () { + final salt = bcryptSalt(security: BcryptSecurity.strong); + expect(salt.length, 29); + expect(salt, startsWith(r"$2b$15$")); + }); + + test("bcryptSalt with security overrides", () { + final salt = bcryptSalt(security: BcryptSecurity.strong, nb: 10); + expect(salt.length, 29); + expect(salt, startsWith(r"$2b$10$")); + }); + + test("bcryptDigest", () { + var password = "password".codeUnits; + var salt = fromBase64( + "bvIG6Nmid91Mu9RcmmWZfO", + codec: Base64Codec.bcrypt, + ); + var result = fromBase64( + '5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe', + codec: Base64Codec.bcrypt, + ); + const encoded = + r"$2a$05$bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe"; + final output = bcryptDigest( + password, + nb: 5, + salt: salt, + version: BcryptVersion.$2a, + ); + expect(output.bytes, equals(result)); + expect(output.encoded(), equals(encoded)); + expect(output.toString(), equals(encoded)); + }); + test("bcryptDigest with security", () { + var password = "password".codeUnits; + var salt = fromBase64( + "bvIG6Nmid91Mu9RcmmWZfO", + codec: Base64Codec.bcrypt, + ); + var result = fromBase64( + '5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe', + codec: Base64Codec.bcrypt, + ); + final output = bcryptDigest( + password, + salt: salt, + version: BcryptVersion.$2a, + security: BcryptSecurity.little, + ); + expect(output.bytes, equals(result)); + }); + test("Bcrypt instance with security", () { + var password = "password".codeUnits; + var salt = fromBase64( + "bvIG6Nmid91Mu9RcmmWZfO", + codec: Base64Codec.bcrypt, + ); + var result = fromBase64( + '5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe', + codec: Base64Codec.bcrypt, + ); + final output = Bcrypt.fromSecurity( + BcryptSecurity.little, + salt: salt, + version: BcryptVersion.$2a, + ).convert(password); + expect(output.bytes, equals(result)); + }); + test("The cost must be at least 0", () { + BcryptContext(cost: 0); + expect(() => BcryptContext(cost: -10), throwsArgumentError); + expect(() => BcryptContext(cost: -1), throwsArgumentError); + }); + test("The cost must be at most 31", () { + BcryptContext(cost: 31); + expect(() => BcryptContext(cost: 32), throwsArgumentError); + expect(() => BcryptContext(cost: 100), throwsArgumentError); + }); + test("The salt must be exactly 16-bytes", () { + BcryptContext(cost: 4, salt: List.filled(16, 0)); + expect( + () => BcryptContext(cost: 4, salt: []), + throwsArgumentError, + ); + expect( + () => BcryptContext(cost: 4, salt: List.filled(15, 0)), + throwsArgumentError, + ); + expect( + () => BcryptContext(cost: 4, salt: List.filled(17, 0)), + throwsArgumentError, + ); + }); + test("Bcrypt from encoded", () { + Bcrypt.fromEncoded(fromCrypt(r"$2a$05$bvIG6Nmid91Mu9RcmmWZfO")); + }); + test("Bcrypt from encoded with invalid version", () { + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2c$05$bvIG6Nmid91Mu9RcmmWZfO")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'Invalid version', + ), + ), + ); + }); + test("Bcrypt from encoded with invalid cost", () { + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2x$bvIG6Nmid91Mu9RcmmWZfO")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'Invalid cost', + ), + ), + ); + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2y$32$bvIG6Nmid91Mu9RcmmWZfO")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'The cost must be at most 31', + ), + ), + ); + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2y$-1$bvIG6Nmid91Mu9RcmmWZfO")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'The cost must be at least 0', + ), + ), + ); + }); + test("Bcrypt from encoded with invalid salt", () { + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2b$05$bvIG6Nmid91Mu9RcmmWZf")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'Invalid hash', + ), + ), + ); + expect( + () => Bcrypt.fromEncoded(fromCrypt(r"$2b$05$bvIG6Nmid91Mu9RcmmWZf0")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'Invalid length', + ), + ), + ); + expect( + () => Bcrypt.fromEncoded(fromCrypt( + r"$2b$05$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1")), + throwsA( + isA().having( + (e) => e.message, + 'message', + 'Invalid hash', + ), + ), + ); + Bcrypt.fromEncoded(fromCrypt( + r"$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s1", + )); + }); + }); + + group('version 2a', () { + // http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/glibc/crypt_blowfish/wrapper.c?rev=HEAD + test(r"$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.", () { + const password = r""; + const encoded = + r"$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s."; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + // https://stackoverflow.com/a/12761326/774398 + test(r"$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle", () { + const password = r"ππππππππ"; + const encoded = + r"$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + // https://bitbucket.org/vadim/bcrypt.net/src/464c41416dc9/BCrypt.Net.Test/TestBCrypt.cs?fileviewer=file-view-default + test(r"$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye", () { + const password = r""; + const encoded = + r"$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe", () { + const password = r"a"; + const encoded = + r"$2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i", () { + const password = r"abc"; + const encoded = + r"$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC", () { + const password = r"abcdefghijklmnopqrstuvwxyz"; + const encoded = + r"$2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO", () { + const password = r"~!@#$%^&*() ~!@#$%^&*()PNBFRD"; + const encoded = + r"$2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + // https://github.com/pyca/bcrypt/blob/main/tests/test_bcrypt.py + test(r"$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW", () { + var password = "U*U"; + var encoded = + r"$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK", () { + var password = "U*U*"; + var encoded = + r"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a", () { + var password = "U*U*U"; + var encoded = + r"$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui", () { + var password = "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "chars after 72 are ignored"; + var encoded = + r"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6", () { + var password = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + "chars after 72 are ignored as usual"; + var encoded = + r"$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6"; + var output = bcrypt(password.codeUnits, encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq", () { + var password = "\xa3"; + var encoded = + r"$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq"; + var output = bcrypt(password.codeUnits, encoded); + expect(output, equals(encoded)); + }); + + test(r"$2a$04$tecY.9ylRInW/rAAzXCXPOOlyYeCNzmNTzPDNSIFztFMKbvs/s5XG", () { + var password = + "g7\r\x01\xf3\xd4\xd0\xa9JB^\x18\x007P\xb2N\xc7\x1c\xee\x87&\x83C" + "\x8b\xe8\x18\xc5>\x86\x14/\xd6\xcc\x1cJ\xde\xd7ix\xeb\xdeO\xef" + "\xe1i\xac\xcb\x03\x96v1' \xd6@.m\xa5!\xa0\xef\xc0("; + var encoded = + r"$2a$04$tecY.9ylRInW/rAAzXCXPOOlyYeCNzmNTzPDNSIFztFMKbvs/s5XG"; + var output = bcrypt(password.codeUnits, encoded); + expect(output, equals(encoded)); + }); + }); + + group('version 2y', () { + test(r"$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq", () { + var password = "\xa3"; + var encoded = + r"$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq"; + var output = bcrypt(password.codeUnits, encoded); + expect(output, equals(encoded)); + }); + test(r"$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", () { + var password = "\xff\xff\xa3"; + var encoded = + r"$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e"; + var output = bcrypt(password.codeUnits, encoded); + expect(output, equals(encoded)); + }); + }); + + // https://github.com/pyca/bcrypt/blob/main/tests/test_bcrypt.py + group('version 2b', () { + test(r"$2b$04$cVWp4XaNU8a4v1uMRum2SO026BWLIoQMD/TXg5uZV.0P.uO8m3YEm", () { + var password = "Kk4DQuMMfZL9o"; + var encoded = + r"$2b$04$cVWp4XaNU8a4v1uMRum2SO026BWLIoQMD/TXg5uZV.0P.uO8m3YEm"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$pQ7gRO7e6wx/936oXhNjrOUNOHL1D0h1N2IDbJZYs.1ppzSof6SPy", () { + var password = "9IeRXmnGxMYbs"; + var encoded = + r"$2b$04$pQ7gRO7e6wx/936oXhNjrOUNOHL1D0h1N2IDbJZYs.1ppzSof6SPy"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$SQe9knOzepOVKoYXo9xTteNYr6MBwVz4tpriJVe3PNgYufGIsgKcW", () { + var password = "xVQVbwa1S0M8r"; + var encoded = + r"$2b$04$SQe9knOzepOVKoYXo9xTteNYr6MBwVz4tpriJVe3PNgYufGIsgKcW"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$eH8zX.q5Q.j2hO1NkVYJQOM6KxntS/ow3.YzVmFrE4t//CoF4fvne", () { + var password = "Zfgr26LWd22Za"; + var encoded = + r"$2b$04$eH8zX.q5Q.j2hO1NkVYJQOM6KxntS/ow3.YzVmFrE4t//CoF4fvne"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$ahiTdwRXpUG2JLRcIznxc.s1.ydaPGD372bsGs8NqyYjLY1inG5n2", () { + var password = "Tg4daC27epFBE"; + var encoded = + r"$2b$04$ahiTdwRXpUG2JLRcIznxc.s1.ydaPGD372bsGs8NqyYjLY1inG5n2"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$nQn78dV0hGHf5wUBe0zOFu8n07ZbWWOKoGasZKRspZxtt.vBRNMIy", () { + var password = "xhQPMmwh5ALzW"; + var encoded = + r"$2b$04$nQn78dV0hGHf5wUBe0zOFu8n07ZbWWOKoGasZKRspZxtt.vBRNMIy"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$cvXudZ5ugTg95W.rOjMITuM1jC0piCl3zF5cmGhzCibHZrNHkmckG", () { + var password = "59je8h5Gj71tg"; + var encoded = + r"$2b$04$cvXudZ5ugTg95W.rOjMITuM1jC0piCl3zF5cmGhzCibHZrNHkmckG"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$YYjtiq4Uh88yUsExO0RNTuEJ.tZlsONac16A8OcLHleWFjVawfGvO", () { + var password = "wT4fHJa2N9WSW"; + var encoded = + r"$2b$04$YYjtiq4Uh88yUsExO0RNTuEJ.tZlsONac16A8OcLHleWFjVawfGvO"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$WLTjgY/pZSyqX/fbMbJzf.qxCeTMQOzgL.CimRjMHtMxd/VGKojMu", () { + var password = "uSgFRnQdOgm4S"; + var encoded = + r"$2b$04$WLTjgY/pZSyqX/fbMbJzf.qxCeTMQOzgL.CimRjMHtMxd/VGKojMu"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$2moPs/x/wnCfeQ5pCheMcuSJQ/KYjOZG780UjA/SiR.KsYWNrC7SG", () { + var password = "tEPtJZXur16Vg"; + var encoded = + r"$2b$04$2moPs/x/wnCfeQ5pCheMcuSJQ/KYjOZG780UjA/SiR.KsYWNrC7SG"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$HrEYC/AQ2HS77G78cQDZQ.r44WGcruKw03KHlnp71yVQEwpsi3xl2", () { + var password = "vvho8C6nlVf9K"; + var encoded = + r"$2b$04$HrEYC/AQ2HS77G78cQDZQ.r44WGcruKw03KHlnp71yVQEwpsi3xl2"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$vVYgSTfB8KVbmhbZE/k3R.ux9A0lJUM4CZwCkHI9fifke2.rTF7MG", () { + var password = "5auCCY9by0Ruf"; + var encoded = + r"$2b$04$vVYgSTfB8KVbmhbZE/k3R.ux9A0lJUM4CZwCkHI9fifke2.rTF7MG"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$JfoNrR8.doieoI8..F.C1OQgwE3uTeuardy6lw0AjALUzOARoyf2m", () { + var password = "GtTkR6qn2QOZW"; + var encoded = + r"$2b$04$JfoNrR8.doieoI8..F.C1OQgwE3uTeuardy6lw0AjALUzOARoyf2m"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$HP3I0PUs7KBEzMBNFw7o3O7f/uxaZU7aaDot1quHMgB2yrwBXsgyy", () { + var password = "zKo8vdFSnjX0f"; + var encoded = + r"$2b$04$HP3I0PUs7KBEzMBNFw7o3O7f/uxaZU7aaDot1quHMgB2yrwBXsgyy"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$xnFVhJsTzsFBTeP3PpgbMeMREb6rdKV9faW54Sx.yg9plf4jY8qT6", () { + var password = "I9VfYlacJiwiK"; + var encoded = + r"$2b$04$xnFVhJsTzsFBTeP3PpgbMeMREb6rdKV9faW54Sx.yg9plf4jY8qT6"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$WQp9.igoLqVr6Qk70mz6xuRxE0RttVXXdukpR9N54x17ecad34ZF6", () { + var password = "VFPO7YXnHQbQO"; + var encoded = + r"$2b$04$WQp9.igoLqVr6Qk70mz6xuRxE0RttVXXdukpR9N54x17ecad34ZF6"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$xgZtlonpAHSU/njOCdKztOPuPFzCNVpB4LGicO4/OGgHv.uKHkwsS", () { + var password = "VDx5BdxfxstYk"; + var encoded = + r"$2b$04$xgZtlonpAHSU/njOCdKztOPuPFzCNVpB4LGicO4/OGgHv.uKHkwsS"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$2Siw3Nv3Q/gTOIPetAyPr.GNj3aO0lb1E5E9UumYGKjP9BYqlNWJe", () { + var password = "dEe6XfVGrrfSH"; + var encoded = + r"$2b$04$2Siw3Nv3Q/gTOIPetAyPr.GNj3aO0lb1E5E9UumYGKjP9BYqlNWJe"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$7/Qj7Kd8BcSahPO4khB8me4ssDJCW3r4OGYqPF87jxtrSyPj5cS5m", () { + var password = "cTT0EAFdwJiLn"; + var encoded = + r"$2b$04$7/Qj7Kd8BcSahPO4khB8me4ssDJCW3r4OGYqPF87jxtrSyPj5cS5m"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$04$VvlCUKbTMjaxaYJ.k5juoecpG/7IzcH1AkmqKi.lIZMVIOLClWAk.", () { + var password = "J8eHUDuxBB520"; + var encoded = + r"$2b$04$VvlCUKbTMjaxaYJ.k5juoecpG/7IzcH1AkmqKi.lIZMVIOLClWAk."; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + + test(r"$2b$10$keO.ZZs22YtygVF6BLfhGOI/JjshJYPp8DZsUtym6mJV2Eha2Hdd.", () { + var password = [ + 125, 62, 179, 254, 241, 139, 160, 230, 40, 162, 76, 122, 113, 195, // + 80, 127, 204, 200, 98, 123, 249, 20, 246, 246, 96, 129, 71, 53, 236, + 29, 135, 16, 191, 167, 225, 125, 73, 55, 32, 150, 223, 99, 242, 191, + 179, 86, 104, 223, 77, 136, 113, 247, 255, 27, 130, 126, 122, 19, 221, + 233, 132, 0, 221, 52 + ]; + var encoded = + r"$2b$10$keO.ZZs22YtygVF6BLfhGOI/JjshJYPp8DZsUtym6mJV2Eha2Hdd."; + var output = bcrypt(password, encoded); + expect(output, equals(encoded)); + }); + }); + + group('big cost', () { + test(r"$2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW", () { + const password = r""; + const encoded = + r"$2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO", () { + const password = r""; + const encoded = + r"$2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V.", () { + const password = r"a"; + const encoded = + r"$2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V."; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u", () { + const password = r"a"; + const encoded = + r"$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS", () { + const password = r"a"; + const encoded = + r"$2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$08$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm", () { + const password = r"abc"; + const encoded = + r"$2a$08$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$10$WvvTPHKwdBJ3uk0Z37EMR.hLA2W6N9AEBhEgrAOljy2Ae5MtaSIUi", () { + const password = r"abc"; + const encoded = + r"$2a$10$WvvTPHKwdBJ3uk0Z37EMR.hLA2W6N9AEBhEgrAOljy2Ae5MtaSIUi"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9q", () { + const password = r"abc"; + const encoded = + r"$2a$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9q"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz.", () { + const password = r"abcdefghijklmnopqrstuvwxyz"; + const encoded = + r"$2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz."; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq", () { + const password = r"abcdefghijklmnopqrstuvwxyz"; + const encoded = + r"$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG", () { + const password = r"abcdefghijklmnopqrstuvwxyz"; + const encoded = + r"$2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW", () { + const password = r"~!@#$%^&*() ~!@#$%^&*()PNBFRD"; + const encoded = + r"$2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS", () { + const password = r"~!@#$%^&*() ~!@#$%^&*()PNBFRD"; + const encoded = + r"$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + test(r"$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC", () { + const password = r"~!@#$%^&*() ~!@#$%^&*()PNBFRD"; + const encoded = + r"$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC"; + var output = bcrypt(utf8.encode(password), encoded); + expect(output, equals(encoded)); + }); + }, skip: true); + }); +} diff --git a/hashlib/test/blake2b_test.dart b/hashlib/test/blake2b_test.dart new file mode 100644 index 0000000..097df95 --- /dev/null +++ b/hashlib/test/blake2b_test.dart @@ -0,0 +1,213 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('Blake2bHash functionality test', () { + test('The digest size must be between 1 and 64', () { + Blake2bHash(1); + Blake2bHash(64); + expect(() => Blake2bHash(0), throwsArgumentError); + expect(() => Blake2bHash(65), throwsArgumentError); + }); + test('The valid length of salt is 16 bytes ', () { + Blake2bHash(16, salt: Uint8List(0)); + Blake2bHash(16, salt: Uint8List(16)); + expect(() => Blake2bHash(16, salt: Uint8List(1)), throwsArgumentError); + expect(() => Blake2bHash(16, salt: Uint8List(17)), throwsArgumentError); + }); + test('The valid length of personalization is 16 bytes ', () { + Blake2bHash(16, aad: Uint8List(0)); + Blake2bHash(16, aad: Uint8List(16)); + expect(() => Blake2bHash(16, aad: Uint8List(1)), throwsArgumentError); + expect(() => Blake2bHash(16, aad: Uint8List(17)), throwsArgumentError); + }); + test('The key should not be greater than 64 bytes ', () { + Blake2bHash(16, key: Uint8List(0)); + Blake2bHash(16, key: Uint8List(1)); + Blake2bHash(16, key: Uint8List(64)); + expect(() => Blake2bHash(16, key: Uint8List(65)), throwsArgumentError); + }); + }); + + group('Blake2b funtionality test', () { + test("Blake2b name", () { + expect(Blake2b(8).name, 'BLAKE2b-64'); + expect(blake2b160.name, 'BLAKE2b-160'); + expect(blake2b256.name, 'BLAKE2b-256'); + expect(blake2b384.name, 'BLAKE2b-384'); + expect(blake2b512.name, 'BLAKE2b-512'); + }); + test("Blake2bMac name", () { + expect(blake2b160.mac.name, 'BLAKE2b-160/MAC'); + expect(blake2b256.mac.name, 'BLAKE2b-256/MAC'); + expect(blake2b384.mac.name, 'BLAKE2b-384/MAC'); + expect(blake2b512.mac.name, 'BLAKE2b-512/MAC'); + expect(blake2b160.mac.by([1]).name, 'BLAKE2b-160/MAC'); + expect(blake2b256.mac.by([1]).name, 'BLAKE2b-256/MAC'); + expect(blake2b384.mac.by([1]).name, 'BLAKE2b-384/MAC'); + expect(blake2b512.mac.by([1]).name, 'BLAKE2b-512/MAC'); + expect(blake2b512.mac.pbkdf2([2]).name, 'BLAKE2b-512/MAC/PBKDF2'); + expect(blake2b512.hmac.pbkdf2([2]).name, 'BLAKE2b-512/HMAC/PBKDF2'); + }); + test('sink test', () { + final input = List.generate(512, (i) => i & 0xFF); + final output = + "c59ab1095ca4579525338b6b74689ff234bc3fe9765fe26dfb04ddceaee0ab84" + "dfd8967594cb261fcd88687f4454d80f718116c1b3c32f9f7e169357468cbe67"; + final sink = blake2b512.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < 512; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + expect(sink.closed, isFalse); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); + + group('blake2b512 test', () { + test('with empty string', () { + expect( + blake2b512.string("").hex(), + "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419" + "d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce"); + }); + test('with a', () { + expect( + blake2b512.string('a').hex(), + "333fcb4ee1aa7c115355ec66ceac917c8bfd815bf7587d325aec1864edd24e34" + "d5abe2c6b1b5ee3face62fed78dbef802f2a85cb91d455a8f5249d330853cb3c"); + }); + test('with abc', () { + expect( + blake2b512.string("abc").hex(), + "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d1" + "7d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923"); + }); + test('with long string', () { + expect( + blake2b512.convert(List.generate(512, (i) => i & 0xFF)).hex(), + "c59ab1095ca4579525338b6b74689ff234bc3fe9765fe26dfb04ddceaee0ab84" + "dfd8967594cb261fcd88687f4454d80f718116c1b3c32f9f7e169357468cbe67"); + }); + test('with very long string', () { + expect( + blake2b512.convert(List.generate(646154, (i) => i & 0xFF)).hex(), + "9ddaedc61db231a9dd3de20ea031d8f612f1d541179d3cd0bf90bf5a6740880c" + "d5d4b42a5db783e04c278679e75f2047c6105441062d08175d4c2708ce2e74f3"); + }, skip: true); + test('with block size string', () { + expect( + blake2b512.convert(List.generate(128, (i) => i & 0xFF)).hex(), + "2319e3789c47e2daa5fe807f61bec2a1a6537fa03f19ff32e87eecbfd64b7e0e" + "8ccff439ac333b040f19b0c4ddd11a61e24ac1fe0f10a039806c5dcc0da3d115"); + }); + test('with block size + 1 string', () { + expect( + blake2b512.convert(List.generate(129, (i) => i & 0xFF)).hex(), + "f59711d44a031d5f97a9413c065d1e614c417ede998590325f49bad2fd444d3e" + "4418be19aec4e11449ac1a57207898bc57d76a1bcf3566292c20c683a5c4648f"); + }); + test('with twice block size string', () { + expect( + blake2b512.convert(List.generate(256, (i) => i & 0xFF)).hex(), + "1ecc896f34d3f9cac484c73f75f6a5fb58ee6784be41b35f46067b9c65c63a67" + "94d3d744112c653f73dd7deb6666204c5a9bfa5b46081fc10fdbe7884fa5cbf8"); + }); + test('with half block size string', () { + expect( + blake2b512.convert(List.generate(64, (i) => i & 0xFF)).hex(), + "2fc6e69fa26a89a5ed269092cb9b2a449a4409a7a44011eecad13d7c4b045660" + "2d402fa5844f1a7a758136ce3d5d8d0e8b86921ffff4f692dd95bdc8e5ff0052"); + }); + + test('with a secret', () { + expect( + blake2b512.mac.byString('secret').string("a").hex(), + "4a1f6558272af9c63689a9383883671379cab5ff6a38b69643529bd27c5b61fe" + "e24bc919c36d1bb3747630bf90d3459a453c2c3bb5775bbe0c15cc324222114c"); + }); + test('with empty string and a secret', () { + expect( + blake2b512.mac.byString('secret').string('').hex(), + "865aca2ba0b9b941352e4680e14f543d1af37f7a3479304262a5da8c97468d9f" + "e22636bae941d9c7b83b93efc36e82177606c72a1c00af48bb182c69d1f1abc3"); + }); + }); + + group('blake2b256 test', () { + test('with empty string', () { + expect(blake2b256.string('').hex(), + "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8"); + }); + test('with abc', () { + expect(blake2b256.string('abc').hex(), + "bddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319"); + }); + test('with empty string and a secret', () { + expect(blake2b256.mac.byString('secret').string('').hex(), + "080989147a9b01f885f00d9b90cee0855cfb08aa68d57dc2c92333b2df70a5ea"); + }); + test('with abc and a secret', () { + expect(blake2b256.mac.byString('secret').string('abc').hex(), + "e23c35713e7249f369b7c6f60291c0af9d6ac0231d80f46e13b1313fe7f4a4d5"); + }); + }); + + group('blake2b160 test', () { + test('with empty string', () { + expect(blake2b160.string('').hex(), + "3345524abf6bbe1809449224b5972c41790b6cf2"); + }); + test('with abc', () { + expect(blake2b160.string('abc').hex(), + "384264f676f39536840523f284921cdc68b6846b"); + }); + test('with empty string and a secret', () { + expect(blake2b160.mac.byString('secret').string('').hex(), + "f8630ddf0a315edbc8977f2c52040e9cedb70a85"); + }); + test('with abc and a secret', () { + expect(blake2b160.mac.byString('secret').string('abc').hex(), + "0c3d973f5f44547f37c0c0c34ae8cd9015c324ef"); + }); + }); + + group('blake2b384 test', () { + test('with empty string', () { + expect( + blake2b384.string('').hex(), + "b32811423377f52d7862286ee1a72ee540524380fda1724a" + "6f25d7978c6fd3244a6caf0498812673c5e05ef583825100"); + }); + test('with abc', () { + expect( + blake2b384.string('abc').hex(), + "6f56a82c8e7ef526dfe182eb5212f7db9df1317e57815dbd" + "a46083fc30f54ee6c66ba83be64b302d7cba6ce15bb556f4"); + }); + test('with empty string and a secret', () { + expect( + blake2b384.mac.byString('secret').string('').hex(), + "6f65d5a686d1eb9783f19bc3fe7dbd077d61714ceba63b2d" + "11594faee11f98950c2c221379d98d397dfe04c697839472"); + }); + test('with abc and a secret', () { + expect( + blake2b384.mac.byString('secret').string('abc').hex(), + "5dad40c5f4f12bde483498c651ce1f5e86e6f47454c953fb" + "c953c74e34aba9541b689c2000e984c909278304af01c991"); + }); + }); +} diff --git a/hashlib/test/blake2s_test.dart b/hashlib/test/blake2s_test.dart new file mode 100644 index 0000000..ac833ee --- /dev/null +++ b/hashlib/test/blake2s_test.dart @@ -0,0 +1,182 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('Blake2sHash functionality test', () { + test('The digest size must be between 1 and 32', () { + Blake2sHash(1); + Blake2sHash(32); + expect(() => Blake2sHash(0), throwsArgumentError); + expect(() => Blake2sHash(33), throwsArgumentError); + expect(() => Blake2sHash(64), throwsArgumentError); + }); + test('The valid length of salt is 8 bytes ', () { + Blake2sHash(16, salt: Uint8List(0)); + Blake2sHash(16, salt: Uint8List(8)); + expect(() => Blake2sHash(16, salt: Uint8List(1)), throwsArgumentError); + expect(() => Blake2sHash(16, salt: Uint8List(9)), throwsArgumentError); + expect(() => Blake2sHash(16, salt: Uint8List(16)), throwsArgumentError); + }); + test('The valid length of personalization is 8 bytes ', () { + Blake2sHash(16, aad: Uint8List(0)); + Blake2sHash(16, aad: Uint8List(8)); + expect(() => Blake2sHash(16, aad: Uint8List(1)), throwsArgumentError); + expect(() => Blake2sHash(16, aad: Uint8List(9)), throwsArgumentError); + expect(() => Blake2sHash(16, aad: Uint8List(16)), throwsArgumentError); + }); + test('The key should not be greater than 32 bytes ', () { + Blake2sHash(16, key: Uint8List(0)); + Blake2sHash(16, key: Uint8List(1)); + Blake2sHash(16, key: Uint8List(32)); + expect(() => Blake2sHash(16, key: Uint8List(33)), throwsArgumentError); + expect(() => Blake2sHash(16, key: Uint8List(64)), throwsArgumentError); + }); + }); + group('Blake2s funtionality test', () { + test("Blake2s name", () { + expect(Blake2s(8).name, 'BLAKE2s-64'); + expect(blake2s128.name, 'BLAKE2s-128'); + expect(blake2s160.name, 'BLAKE2s-160'); + expect(blake2s224.name, 'BLAKE2s-224'); + expect(blake2s256.name, 'BLAKE2s-256'); + }); + test("Blake2sMac name", () { + final key = [1]; + expect(blake2s128.mac.name, 'BLAKE2s-128/MAC'); + expect(blake2s160.mac.name, 'BLAKE2s-160/MAC'); + expect(blake2s224.mac.name, 'BLAKE2s-224/MAC'); + expect(blake2s256.mac.name, 'BLAKE2s-256/MAC'); + expect(blake2s128.mac.by(key).name, 'BLAKE2s-128/MAC'); + expect(blake2s160.mac.by(key).name, 'BLAKE2s-160/MAC'); + expect(blake2s224.mac.by(key).name, 'BLAKE2s-224/MAC'); + expect(blake2s256.mac.by(key).name, 'BLAKE2s-256/MAC'); + }); + test('sink test', () { + final input = List.generate(512, (i) => i & 0xFF); + final output = + "aeb5499d81f14cb10c2539411cbe3e71167293458543bfa4ca1f9584625fd4c6"; + final sink = blake2s256.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < 512; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + expect(sink.closed, isFalse); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); + + group('blake2s256 test', () { + test('with empty string', () { + expect(blake2s256.string("").hex(), + "69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9"); + }); + test('with a', () { + expect(blake2s256.string('a').hex(), + "4a0d129873403037c2cd9b9048203687f6233fb6738956e0349bd4320fec3e90"); + }); + test('with abc', () { + expect(blake2s256.string("abc").hex(), + "508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"); + }); + test('with long string', () { + expect(blake2s256.convert(List.generate(512, (i) => i & 0xFF)).hex(), + "aeb5499d81f14cb10c2539411cbe3e71167293458543bfa4ca1f9584625fd4c6"); + }); + test('with very long string', () { + expect(blake2s256.convert(List.generate(646154, (i) => i & 0xFF)).hex(), + "8e13a3e326c071e9d9dabd66025e49d3f467767cd10b5e6e1df1de9354ea2af9"); + }, skip: true); + test('with block size string', () { + expect(blake2s256.convert(List.generate(64, (i) => i & 0xFF)).hex(), + "56f34e8b96557e90c1f24b52d0c89d51086acf1b00f634cf1dde9233b8eaaa3e"); + }); + test('with block size + 1 string', () { + expect(blake2s256.convert(List.generate(65, (i) => i & 0xFF)).hex(), + "1b53ee94aaf34e4b159d48de352c7f0661d0a40edff95a0b1639b4090e974472"); + }); + test('with twice block size string', () { + expect(blake2s256.convert(List.generate(128, (i) => i & 0xFF)).hex(), + "1fa877de67259d19863a2a34bcc6962a2b25fcbf5cbecd7ede8f1fa36688a796"); + }); + test('with half block size string', () { + expect(blake2s256.convert(List.generate(32, (i) => i & 0xFF)).hex(), + "05825607d7fdf2d82ef4c3c8c2aea961ad98d60edff7d018983e21204c0d93d1"); + }); + + test('with a secret', () { + expect(blake2s256.mac.byString('secret').string("a").hex(), + "6252d094f32c706b6fa11529126bdf2910c4dd7638bf866348808df63f62531d"); + }); + test('with empty string and a secret', () { + expect(blake2s256.mac.byString('secret').string('').hex(), + "864f60ce88fc1c80c7b3b4f0bb920255fb464484a9dc7346f1d0e4e190d358cd"); + }); + }); + + group('blake2s128 test', () { + test('with empty string', () { + expect(blake2s128.string('').hex(), "64550d6ffe2c0a01a14aba1eade0200c"); + }); + test('with abc', () { + expect( + blake2s128.string('abc').hex(), "aa4938119b1dc7b87cbad0ffd200d0ae"); + }); + test('with empty string and a secret', () { + expect(blake2s128.mac.byString('secret').string('').hex(), + "5697f332469e36135bad2a52a79803be"); + }); + test('with abc and a secret', () { + expect(blake2s128.mac.byString('secret').string('abc').hex(), + "9af4e6ccbbfafb7c9dbc6088ca27f3da"); + }); + }); + + group('blake2s160 test', () { + test('with empty string', () { + expect(blake2s160.string('').hex(), + "354c9c33f735962418bdacb9479873429c34916f"); + }); + test('with abc', () { + expect(blake2s160.string('abc').hex(), + "5ae3b99be29b01834c3b508521ede60438f8de17"); + }); + test('with empty string and a secret', () { + expect(blake2s160.mac.byString('secret').string('').hex(), + "3bdb8b311ae9f0547671fef3933653996ee65f45"); + }); + test('with abc and a secret', () { + expect(blake2s160.mac.byString('secret').string('abc').hex(), + "1fda19951bd14742e8b3587b1f195f09975ff628"); + }); + }); + + group('blake2s224 test', () { + test('with empty string', () { + expect(blake2s224.string('').hex(), + "1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4"); + }); + test('with abc', () { + expect(blake2s224.string('abc').hex(), + "0b033fc226df7abde29f67a05d3dc62cf271ef3dfea4d387407fbd55"); + }); + test('with empty string and a secret', () { + expect(blake2s224.mac.byString('secret').string('').hex(), + "7a37923d75c9d7be6b8fb2946a23d2d7f46067637380f0e91ef8ad0c"); + }); + test('with abc and a secret', () { + expect(blake2s224.mac.byString('secret').string('abc').hex(), + "d19a652b914f52e1437a5273d74aee9aba8921bbde5656ebddc8ffa8"); + }); + }); +} diff --git a/hashlib/test/compare_test.dart b/hashlib/test/compare_test.dart new file mode 100644 index 0000000..133942e --- /dev/null +++ b/hashlib/test/compare_test.dart @@ -0,0 +1,432 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore_for_file: library_annotations + +@Tags(['vm-only']) + +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart' as crypto; +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:hashlib/random.dart'; +import 'package:pointycastle/digests/blake2b.dart' as pc_blake2b; +import 'package:pointycastle/digests/keccak.dart' as pc_keccak; +import 'package:pointycastle/digests/md4.dart' as pc_md4; +import 'package:pointycastle/digests/sha3.dart' as pc_sha3; +import 'package:pointycastle/digests/sm3.dart' as pc_sm3; +import 'package:test/test.dart'; + +void main() { + group('blake2b512 comparison', () { + test('with pointycastle', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = blake2b512.convert(data).hex(); + final out2 = toHex( + pc_blake2b.Blake2bDigest(digestSize: 64).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + + test('with pointycastle with key', () { + final key = randomBytes(16); + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = blake2b512.mac.by(key).convert(data).hex(); + final out2 = toHex( + pc_blake2b.Blake2bDigest(digestSize: 64, key: key).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + + test('with pointycastle with salt', () { + final salt = randomBytes(16); + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = Blake2b(64, salt: salt).convert(data).hex(); + final out2 = toHex( + pc_blake2b.Blake2bDigest(digestSize: 64, salt: salt).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + + test('with pointycastle with personalization', () { + final personalization = randomBytes(16); + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = Blake2b( + 64, + aad: personalization, + ).convert(data).hex(); + final out2 = toHex( + pc_blake2b.Blake2bDigest( + digestSize: 64, + personalization: personalization, + ).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + + test('with pointycastle with salt and personalization', () { + final salt = randomBytes(16); + final personalization = randomBytes(16); + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = Blake2b( + 64, + salt: salt, + aad: personalization, + ).convert(data).hex(); + final out2 = toHex( + pc_blake2b.Blake2bDigest( + digestSize: 64, + salt: salt, + personalization: personalization, + ).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + + test('with pointycastle with key, salt and personalization', () { + final key = randomBytes(16); + final salt = randomBytes(16); + final aad = randomBytes(16); + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final out1 = Blake2b(64).mac.by(key, salt: salt, aad: aad).hex(data); + final out2 = toHex( + pc_blake2b.Blake2bDigest( + digestSize: 64, + key: key, + salt: salt, + personalization: aad, + ).process(data), + ); + expect(out1, equals(out2), reason: 'size: $i'); + } + }); + }); + + group('HMAC comparison', () { + test('with crypto for MD5', () { + var key = "key"; + var msg = "The quick brown fox jumps over the lazy dog"; + var expected = "80070713463e7749b90c2dc24911e275"; + var actual = toHex( + md5.hmac.byString(key).convert(msg.codeUnits).bytes, + ); + var actual2 = toHex( + crypto.Hmac(crypto.md5, key.codeUnits).convert(msg.codeUnits).bytes, + ); + expect(actual2, expected, reason: "Key: $key | Message: $msg"); + expect(actual, expected, reason: "Key: $key | Message: $msg"); + }); + + test('with crypto', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + final key = randomBytes(i & 0x7F); + expect( + toHex(sha1.hmac.by(key).convert(data).bytes), + toHex(crypto.Hmac(crypto.sha1, key).convert(data).bytes), + reason: 'Key: "${String.fromCharCodes(key)}" [${key.length}]\n' + 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + final key = randomBytes(i & 0x7F); + expect( + toHex(sha384.hmac.by(key).convert(data).bytes), + toHex(crypto.Hmac(crypto.sha384, key).convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('Keccak comparison', () { + test('with keccak256', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + var pc = pc_keccak.KeccakDigest(256); + var other = pc.process(Uint8List.fromList(data)); + expect( + keccak256.convert(data).hex(), + toHex(other), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('with sha3', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + var pc = pc_sha3.SHA3Digest(256); + var other = pc.process(Uint8List.fromList(data)); + expect( + sha3_256.convert(data).hex(), + toHex(other), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + }); + + group('MD5 comparison', () { + test('for a file async', () async { + var file = File('LICENSE'); + var hash = await crypto.md5.bind(file.openRead()).first; + var hash2 = await md5.file(file); + expect(hash2.hex(), toHex(hash.bytes)); + }, tags: 'vm-only'); + + test('for a file sync', () async { + var file = File('LICENSE'); + var hash = await crypto.md5.bind(file.openRead()).first; + var hash2 = md5.fileSync(file); + expect(hash2.hex(), toHex(hash.bytes)); + }, tags: 'vm-only'); + + test('with crypto', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(md5.convert(data).bytes), + toHex(crypto.md5.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(md5.convert(data).bytes), + toHex(crypto.md5.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('MD4 comparison', () { + test('with pointy-castle', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(md4.convert(data).bytes), + toHex(pc_md4.MD4Digest().process(data)), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('for a file sync', () { + var file = File('LICENSE'); + var hash = pc_md4.MD4Digest().process(file.readAsBytesSync()); + var hash2 = md4.fileSync(file); + expect(hash2.hex(), toHex(hash)); + }, tags: 'vm-only'); + }); + + group('SM3 comparison', () { + test('with pointy-castle', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + sm3.convert(data).hex(), + toHex(pc_sm3.SM3Digest().process(data)), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('for a file sync', () { + var file = File('LICENSE'); + var hash = pc_sm3.SM3Digest().process(file.readAsBytesSync()); + var hash2 = sm3.fileSync(file); + expect(hash2.hex(), toHex(hash)); + }, tags: 'vm-only'); + }); + + group('SHA1 comparison', () { + test('against known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha1.convert(data).bytes), + toHex(crypto.sha1.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha1.convert(data).bytes), + toHex(crypto.sha1.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('SHA-224 comparison', () { + test('against known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha224.convert(data).bytes), + toHex(crypto.sha224.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha224.convert(data).bytes), + toHex(crypto.sha224.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + + group('SHA-256 comparison', () { + test('against known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha256.convert(data).bytes), + toHex(crypto.sha256.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha256.convert(data).bytes), + toHex(crypto.sha256.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + }); + + group('SHA-384 comparison', () { + test('against known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha384.convert(data).bytes), + toHex(crypto.sha384.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha384.convert(data).bytes), + toHex(crypto.sha384.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('SHA-512/224 comparison', () { + test('with known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha512t224.convert(data).bytes), + toHex(crypto.sha512224.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha512t224.convert(data).bytes), + toHex(crypto.sha512224.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('SHA-512/256 comparison', () { + test('with known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha512t256.convert(data).bytes), + toHex(crypto.sha512256.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha512t256.convert(data).bytes), + toHex(crypto.sha512256.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); + + group('SHA-512 comparison', () { + test('with known implementations', () { + for (int i = 0; i < 100; ++i) { + final data = randomBytes(i); + expect( + toHex(sha512.convert(data).bytes), + toHex(crypto.sha512.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + } + }); + + test('run in parallel', () async { + await Future.wait(List.generate(10, (i) => i).map((i) async { + final data = randomBytes(i); + expect( + toHex(sha512.convert(data).bytes), + toHex(crypto.sha512.convert(data).bytes), + reason: 'Message: "${String.fromCharCodes(data)}" [${data.length}]', + ); + })); + }); + }); +} diff --git a/hashlib/test/core/block_hash_test.dart b/hashlib/test/core/block_hash_test.dart new file mode 100644 index 0000000..ed29969 --- /dev/null +++ b/hashlib/test/core/block_hash_test.dart @@ -0,0 +1,102 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; +import 'package:test/test.dart'; +import 'package:hashlib/hashlib.dart'; + +// Concrete implementation for testing purposes +class TestBlockHashSink extends BlockHashSink { + TestBlockHashSink(super.blockLength, [int? bufferLength]) + : super(bufferLength: bufferLength); + + @override + int hashLength = 8; + + @override + void $update(List block, [int offset = 0, bool last = false]) { + // + } + + @override + Uint8List $finalize() { + return buffer; + } +} + +void main() { + group('BlockHashSink', () { + test('Invalid block size', () { + expect( + () => TestBlockHashSink(0), + throwsA(isA()), + ); + expect( + () => TestBlockHashSink(-1), + throwsA(isA()), + ); + expect( + () => TestBlockHashSink(-10), + throwsA(isA()), + ); + }); + + test('Invalid buffer size', () { + TestBlockHashSink(1, 0); + expect( + () => TestBlockHashSink(10, -1), + throwsA(isA()), + ); + expect( + () => TestBlockHashSink(10, -100), + throwsA(isA()), + ); + }); + + test('Initial state', () { + final sink = TestBlockHashSink(16); + expect(sink.closed, isFalse); + expect(sink.messageLength, equals(0)); + expect(sink.pos, equals(0)); + }); + + test('Reset method', () { + final sink = TestBlockHashSink(16); + sink.add([1, 2, 3]); + sink.reset(); + expect(sink.closed, isFalse); + expect(sink.messageLength, equals(0)); + expect(sink.pos, equals(0)); + }); + + test('Add and process data', () { + final sink = TestBlockHashSink(16); + sink.add([1, 2, 3, 4, 5]); + expect(sink.messageLength, equals(5)); + expect(sink.pos, equals(5)); + }); + + test('Digest after close', () { + final sink = TestBlockHashSink(16); + sink.add([1, 2, 3, 4, 5]); + final digest = sink.digest(); + expect(sink.closed, isTrue); + expect(digest.bytes.isNotEmpty, isTrue); + }); + + test('Throws error if adding data after close', () { + final sink = TestBlockHashSink(16); + sink.add([1, 2, 3, 4, 5]); + sink.close(); + expect(() => sink.add([6, 7, 8]), throwsA(isA())); + }); + + test('Buffer processing', () { + final sink = TestBlockHashSink(16); + final data = List.filled(32, 1); // Two full blocks + sink.add(data); + expect(sink.messageLength, equals(32)); + expect(sink.pos, equals(0)); // Should be 0 after processing full blocks + }); + }); +} diff --git a/hashlib/test/core/hash_base_file_test.dart b/hashlib/test/core/hash_base_file_test.dart new file mode 100644 index 0000000..af85f65 --- /dev/null +++ b/hashlib/test/core/hash_base_file_test.dart @@ -0,0 +1,51 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore_for_file: library_annotations +// ignore_for_file: always_declare_return_types + +@Tags(['skip-vm']) + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +class MockHashBase extends HashBase { + @override + final String name = "mock"; + + @override + createSink() { + throw UnimplementedError(); + } +} + +void main() { + group('HashBaseFileSupport', () { + test('UnsupportedError for asynchronous file operation', () { + final mock = MockHashBase(); + expect(() => mock.file('dummy_file.txt'), throwsUnsupportedError); + }); + + test('throws UnsupportedError for synchronous file operation', () { + final mock = MockHashBase(); + expect(() => mock.fileSync('dummy_file.txt'), throwsUnsupportedError); + }); + + test('UnsupportedError for asynchronous file with parameters', () { + final mock = MockHashBase(); + expect( + () => mock.file('dummy_file.txt', 10, 100), + throwsUnsupportedError, + ); + }); + + test('UnsupportedError for synchronous file with parameters', () { + final mock = MockHashBase(); + expect( + () => mock.fileSync('dummy_file.txt', + start: 10, end: 100, bufferSize: 4096), + throwsA(isA()), + ); + }); + }); +} diff --git a/hashlib/test/core/hash_digest_test.dart b/hashlib/test/core/hash_digest_test.dart new file mode 100644 index 0000000..32bab28 --- /dev/null +++ b/hashlib/test/core/hash_digest_test.dart @@ -0,0 +1,166 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('HashDigest', () { + late Uint8List bytes; + late HashDigest digest; + + setUp(() { + bytes = Uint8List.fromList([1, 2, 3, 4, 5, 6, 7, 8]); + digest = HashDigest(bytes); + }); + + test('toString returns correct hex representation', () { + expect(digest.toString(), equals('0102030405060708')); + }); + + test('binary returns correct binary representation', () { + final matcher = equals( + '00000001000000100000001100000100' + '00000101000001100000011100001000', + ); + expect(digest.binary(), matcher); + expect(digest.binary(), matcher); + }); + + test('octal returns correct octal representation', () { + expect(digest.octal(), equals('0004020060200501403410')); + }); + + test('hex returns correct hexadecimal representation', () { + expect(digest.hex(), equals('0102030405060708')); + var digest2 = HashDigest(Uint8List.fromList([9, 10, 11, 12])); + expect(digest2.hex(), equals('090a0b0c')); + expect(digest2.hex(true), equals('090A0B0C')); + }); + + test('base32 returns correct Base-32 representation', () { + expect(digest.base32(), equals('AEBAGBAFAYDQQ===')); + expect(digest.base32(upper: false), equals('aebagbafaydqq===')); + expect(digest.base32(padding: false), equals('AEBAGBAFAYDQQ')); + }); + + test('base64 returns correct Base-64 representation', () { + expect(digest.base64(), equals('AQIDBAUGBwg=')); + expect(digest.base64(padding: false), + equals('AQIDBAUGBwg')); // Without padding + expect(digest.base64(urlSafe: true), + equals('AQIDBAUGBwg=')); // URL-safe base64 + }); + + test('bigInt returns correct BigInt representation', () { + expect(digest.bigInt(), + equals(BigInt.parse('0807060504030201', radix: 16))); // Little-endian + expect(digest.bigInt(endian: Endian.big), + equals(BigInt.parse('0102030405060708', radix: 16))); // Big-endian + }); + + test('number returns correct integer representation', () { + expect(digest.number(8), equals(8)); + expect(digest.number(16), equals(0x0708)); + expect(digest.number(16, Endian.little), equals(0x0201)); + expect(digest.number(32), equals(0x05060708)); + expect(digest.number(32, Endian.little), equals(0x04030201)); + }); + + test('number does not accept invalid bit length', () { + expect(() => digest.number(-8), throwsArgumentError); + expect(() => digest.number(0), throwsArgumentError); + expect(() => digest.number(4), throwsArgumentError); + expect(() => digest.number(7), throwsArgumentError); + expect(() => digest.number(9), throwsArgumentError); + expect(() => digest.number(26), throwsArgumentError); + expect(() => digest.number(63), throwsArgumentError); + expect(() => digest.number(65), throwsArgumentError); + expect(() => digest.number(96), throwsArgumentError); + expect(() => digest.number(128), throwsArgumentError); + }); + + test('ascii returns correct ASCII representation', () { + final asciiBytes = Uint8List.fromList('ABCDEFGH'.codeUnits); + final asciiDigest = HashDigest(asciiBytes); + expect(asciiDigest.ascii(), equals('ABCDEFGH')); + }); + + test('utf8 returns correct UTF-8 representation', () { + final utf8Bytes = Uint8List.fromList(utf8.encode('Hello, World!')); + final utf8Digest = HashDigest(utf8Bytes); + expect(utf8Digest.utf8(), equals('Hello, World!')); + }); + + test('to(encoding) returns correct encoded string', () { + final utf16Bytes = Uint8List.fromList(ascii.encode('Hello, World!')); + final utf16Digest = HashDigest(utf16Bytes); + expect(utf16Digest.to(ascii), equals('Hello, World!')); + }); + + test('hashCode returns correct hash code', () { + expect(digest.hashCode, equals(bytes.hashCode)); + }); + + test('equality check compares correctly', () { + expect(digest == digest, isTrue); + expect(digest == HashDigest(bytes), isTrue); + expect(digest == HashDigest(Uint8List.fromList([...bytes])), isFalse); + }); + + test('isEqual returns true for equal digests', () { + final otherDigest = + HashDigest(Uint8List.fromList([1, 2, 3, 4, 5, 6, 7, 8])); + expect(digest.isEqual(otherDigest), isTrue); + }); + + test('isEqual returns true for equal byte arrays', () { + final byteArray = [1, 2, 3, 4, 5, 6, 7, 8]; + expect(digest.isEqual(byteArray), isTrue); + }); + + test('isEqual returns true for equal byte iterables', () { + final byteIterables = {1, 2, 3, 4, 5, 6, 7, 8}; + expect(digest.isEqual(byteIterables), isTrue); + }); + + test('isEqual returns true for equal ByteBuffer', () { + final buffer = bytes.buffer; + expect(digest.isEqual(buffer), isTrue); + }); + + test('isEqual returns true for equal hexadecimal string', () { + final hexString = '0102030405060708'; + expect(digest.isEqual(hexString), isTrue); + }); + + test('isEqual returns false for unequal digests', () { + final otherDigest = + HashDigest(Uint8List.fromList([8, 7, 6, 5, 4, 3, 2, 1])); + expect(digest.isEqual(otherDigest), isFalse); + }); + + test('isEqual returns true with other buffer type', () { + final data = Uint32List.fromList([0x04030201, 0x08070605]); + expect(digest.isEqual(data), isTrue); + }); + + test('isEqual returns false for unequal byte arrays', () { + final byteArray = [8, 7, 6, 5, 4, 3, 2, 1]; + expect(digest.isEqual(byteArray), isFalse); + }); + + test('isEqual returns false for different length', () { + final otherDigest = HashDigest(Uint8List.fromList([1, 2, 3])); + expect(digest.isEqual(otherDigest), isFalse); + }); + + test('isEqual returns false for unsupported types', () { + expect(digest.isEqual(12345), isFalse); + expect(digest.isEqual(null), isFalse); + }); + }); +} diff --git a/hashlib/test/core/hash_sink_test.dart b/hashlib/test/core/hash_sink_test.dart new file mode 100644 index 0000000..01ac7a4 --- /dev/null +++ b/hashlib/test/core/hash_sink_test.dart @@ -0,0 +1,102 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +// Concrete implementation for testing purposes +class TestHashDigestSink extends HashDigestSink { + final List _data = []; + + @override + int get hashLength => 16; + + @override + void $process(List data, int start, int end) { + _data.addAll(data.sublist(start, end)); + } + + @override + Uint8List $finalize() { + int hash = _data.fold(0, (prev, elem) => prev ^ elem); + final result = List.filled(hashLength, hash); + return Uint8List.fromList(result); + } +} + +class TestHashBase extends HashBase { + @override + String get name => 'TestHash'; + + @override + HashDigestSink createSink() => TestHashDigestSink(); +} + +void main() { + group('HashBase', () { + test('convert method', () { + final hashBase = TestHashBase(); + final digest = hashBase.convert([1, 2, 3, 4]); + expect(digest.bytes, equals(List.filled(16, 1 ^ 2 ^ 3 ^ 4))); + }); + test('string method with default encoding', () { + final hash = TestHashBase(); + final digest = hash.string('test'); + expect(digest.bytes, + equals(List.filled(16, 'test'.codeUnits.reduce((a, b) => a ^ b)))); + }); + + test('string method with custom encoding', () { + final hash = TestHashBase(); + final digest = hash.string('test', utf8); + expect(digest.bytes, + equals(List.filled(16, utf8.encode('test').reduce((a, b) => a ^ b)))); + }); + + test('bind method', () async { + final hash = TestHashBase(); + final stream = Stream.fromIterable([ + [1, 2, 3], + [4, 5, 6] + ]); + final digest = await hash.bind(stream).first; + expect(digest.bytes, equals(List.filled(16, 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6))); + }); + + test('byteStream method', () async { + final hash = TestHashBase(); + final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6]); + final digest = await hash.byteStream(stream, 4); + expect(digest.bytes, equals(List.filled(16, 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6))); + }); + + test('stringStream method with default encoding', () async { + final hash = TestHashBase(); + final stream = Stream.fromIterable(['hello', 'world']); + final digest = await hash.stringStraem(stream); + expect( + digest.bytes, + equals( + List.filled(16, 'helloworld'.codeUnits.reduce((a, b) => a ^ b)))); + }); + + test('stringStream method with custom encoding', () async { + final hash = TestHashBase(); + final stream = Stream.fromIterable(['hello', 'world']); + final digest = await hash.stringStraem(stream, utf8); + expect( + digest.bytes, + equals(List.filled( + 16, utf8.encode('helloworld').reduce((a, b) => a ^ b)))); + }); + + test('cast throws error', () { + final hashBase = TestHashBase(); + expect(() => hashBase.cast(), throwsUnsupportedError); + }); + }); +} diff --git a/hashlib/test/core/kdf_base_test.dart b/hashlib/test/core/kdf_base_test.dart new file mode 100644 index 0000000..98e9e78 --- /dev/null +++ b/hashlib/test/core/kdf_base_test.dart @@ -0,0 +1,52 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +class TestKDF extends KeyDerivatorBase { + @override + String get name => 'TestKDF'; + + @override + final int derivedKeyLength = 3; + + @override + HashDigest convert(List password) { + password = List.filled(derivedKeyLength, password.length); + return HashDigest(Uint8List.fromList(password)); + } +} + +void main() { + group('KeyDerivatorBase', () { + test('TestKDF is defined properly', () { + final algo = TestKDF(); + expect(algo.name, 'TestKDF'); + expect(algo.derivedKeyLength, 3); + expect(algo.convert([1, 2]).bytes, equals([2, 2, 2])); + }); + + test('hex method works correctly', () { + expect(TestKDF().hex([]), equals('000000')); + expect(TestKDF().hex([1, 2, 3, 4, 5]), equals('050505')); + }); + + test('string method works correctly', () { + expect(TestKDF().string('').bytes, equals([0, 0, 0])); + expect(TestKDF().string('abcd').bytes, equals([4, 4, 4])); + }); + + test('string method works correctly with encoding', () { + expect(TestKDF().string('', utf8).bytes, equals([0, 0, 0])); + expect(TestKDF().string('abcd', utf8).bytes, equals([4, 4, 4])); + }); + + test('verify method works correctly', () { + expect(TestKDF().verify([2, 2, 2], [8, 4]), isTrue); + }); + }); +} diff --git a/hashlib/test/core/mac_base_test.dart b/hashlib/test/core/mac_base_test.dart new file mode 100644 index 0000000..9d603da --- /dev/null +++ b/hashlib/test/core/mac_base_test.dart @@ -0,0 +1,82 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('MACSinkBase', () { + test('derivedKeyLength should be defined', () { + final algo = md5.hmac.by([]); + final sink = algo.createSink(); + expect(sink.derivedKeyLength, sink.hashLength); + }); + + test('should initialize with the provided key', () { + final key = [1, 2, 3, 4, 5]; + final sink1 = md5.hmac.by(key).createSink(); + final sink2 = md5.hmac.by([1]).createSink(); + expect(sink1.innerKey, isNot(equals(sink2.innerKey))); + expect(sink1.outerKey, isNot(equals(sink2.outerKey))); + final sink3 = md5.hmac.by([1]).createSink(); + expect(sink2.innerKey, (equals(sink3.innerKey))); + expect(sink2.outerKey, (equals(sink3.outerKey))); + }); + }); + + group('MACHash', () { + test('createSink should create a MACSinkBase', () { + expect(sha256.hmac.by([2]).createSink(), isA()); + }); + + test('sign should return a HashDigest', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final result = md5.hmac.by(key).sign(message); + expect(result, isA()); + expect(result.bytes.length, equals(16)); + }); + + test('verify should return true if the tag matches the message', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final tag = md5.hmac.by(key).sign(message).bytes; + expect(md5.hmac.by(key).verify(tag, message), isTrue); + }); + + test('verify should return false if the tag does not match', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final tag = [1, 2, 3]; + expect(md5.hmac.by(key).verify(tag, message), isFalse); + }); + }); + + group('MACHashBase', () { + test('by create a MACHash', () { + expect(sha1.hmac.by([2]), isA()); + }); + + test('sign should return a HashDigest', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final result = md5.hmac.sign(key, message); + expect(result, isA()); + expect(result.bytes.length, equals(16)); + }); + + test('verify should return true if the tag matches the message', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final tag = md5.hmac.sign(key, message).bytes; + expect(md5.hmac.verify(key, tag, message), isTrue); + }); + + test('verify should return false if the tag does not match', () { + final key = [10]; + final message = [1, 2, 3, 4, 5]; + final tag = [1, 2, 3]; + expect(md5.hmac.verify(key, tag, message), isFalse); + }); + }); +} diff --git a/hashlib/test/crc16_test.dart b/hashlib/test/crc16_test.dart new file mode 100644 index 0000000..826515f --- /dev/null +++ b/hashlib/test/crc16_test.dart @@ -0,0 +1,103 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +/// CRC-16 code for "123456789" +var known = { + CRC16Params.ibm: 0xBB3D, + CRC16Params.ccitt: 0x2189, + CRC16Params.arinc: 0xEBA4, + CRC16Params.cms: 0xAEE7, + CRC16Params.dds110: 0x9ECF, + CRC16Params.maximDow: 0x44C2, + CRC16Params.modbus: 0x4B37, + CRC16Params.umts: 0xFEE8, + CRC16Params.usb: 0xB4C8, + CRC16Params.genibus: 0xD64E, + CRC16Params.gsm: 0xCE3C, + CRC16Params.ibm3740: 0x29B1, + CRC16Params.ccittFalse: 0x29B1, + CRC16Params.ibmSdlc: 0x906E, + CRC16Params.x25: 0x906E, + CRC16Params.iso: 0xBF05, + CRC16Params.mcrf4xx: 0x6F91, + CRC16Params.riello: 0x63D0, + CRC16Params.augCcitt: 0xE5CC, + CRC16Params.spiFujitsu: 0xE5CC, + CRC16Params.tms37157: 0x26B1, + CRC16Params.xmodem: 0x31C3, + CRC16Params.cdma2000: 0x4C06, + CRC16Params.dectR: 0x007E, + CRC16Params.dectX: 0x007F, + CRC16Params.dnp: 0xEA82, + CRC16Params.en13757: 0xC2B7, + CRC16Params.lj1200: 0xBDF4, + CRC16Params.nrsc5: 0xA066, + CRC16Params.m17: 0x772B, + CRC16Params.opensafetyA: 0x5D38, + CRC16Params.opensafetyB: 0x20FE, + CRC16Params.profibus: 0xA819, + CRC16Params.t10Dif: 0xD0DB, + CRC16Params.teledisk: 0x0FB3, +}; + +void main() { + group('CRC test', () { + test("name", () { + expect(crc16.name, 'CRC-16/ARC'); + }); + test("name for defined polynomial", () { + expect(CRC16(CRC16Params.arinc).name, 'CRC-16/ARINC'); + }); + test("name for custom polynomial", () { + expect(CRC16(CRC16Params(0x1919)).name, 'CRC-16/1919'); + }); + + test('code with an empty string', () { + expect(crc16code(""), 0); + }); + test('with a string', () { + expect(crc16.string("Wikipedia").hex(), "ee3e"); + }); + test('code with a string', () { + expect(crc16.code("Wikipedia", utf8), 0xee3e); + }); + + test('createSink produces same result for same input', () { + final sink1 = crc16.createSink(); + sink1.add(utf8.encode("TestString")); + final result1 = sink1.digest().hex(); + + final sink2 = crc16.createSink(); + sink2.add(utf8.encode("TestString")); + final result2 = sink2.digest().hex(); + + expect(result1, equals(result2)); + }); + + test('sink test', () { + final sink = crc16.createSink(); + expect(sink.closed, isFalse); + sink.add([10, 20]); + expect(sink.closed, isFalse); + sink.close(); + expect(sink.closed, isTrue); + expect(() => sink.add([10]), throwsStateError); + sink.reset(); + expect(sink.closed, isFalse); + sink.add([10, 20, 30]); + expect(sink.digest().length, 2); + expect(sink.closed, isTrue); + }); + + for (var e in known.entries) { + test('check "${e.key.name}"', () { + expect(crc16code("123456789", params: e.key), e.value); + }); + } + }); +} diff --git a/hashlib/test/crc32_test.dart b/hashlib/test/crc32_test.dart new file mode 100644 index 0000000..1607204 --- /dev/null +++ b/hashlib/test/crc32_test.dart @@ -0,0 +1,79 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +/// CRC-32 code for "123456789" +var known = { + CRC32Params.ieee: 0xCBF43926, + CRC32Params.bzip2: 0xFC891918, + CRC32Params.cksum: 0x765E7680, + CRC32Params.jamcrc: 0x340BC6D9, + CRC32Params.mpeg2: 0x0376E6E7, + CRC32Params.aixm: 0x3010BF7F, + CRC32Params.autosar: 0x1697D06A, + CRC32Params.base91D: 0x87315576, + CRC32Params.cdRomEdc: 0x6EC2EDC4, + CRC32Params.castagnoli: 0xE3069283, + CRC32Params.koopman: 0xD2C22F51, + CRC32Params.xfer: 0xBD0BE338, +}; + +void main() { + group('CRC-32 test', () { + test("name", () { + expect(crc32.name, 'CRC-32/IEEE'); + }); + test("name for defined polynomial", () { + expect(CRC32(CRC32Params.aixm).name, 'CRC-32/AIXM'); + }); + test("name for custom polynomial", () { + expect(CRC32(CRC32Params(0x1919)).name, 'CRC-32/1919'); + }); + test('code with an empty string', () { + expect(crc32code(""), 0); + }); + test('with a string', () { + expect(crc32.string("Wikipedia").hex(), "adaac02e"); + }); + test('code with a string', () { + expect(crc32.code("Wikipedia", utf8), 0xadaac02e); + }); + + test('createSink produces same result for same input', () { + final sink1 = crc32.createSink(); + sink1.add(utf8.encode("TestString")); + final result1 = sink1.digest().hex(); + + final sink2 = crc32.createSink(); + sink2.add(utf8.encode("TestString")); + final result2 = sink2.digest().hex(); + + expect(result1, equals(result2)); + }); + + test('sink test', () { + final sink = crc32.createSink(); + expect(sink.closed, isFalse); + sink.add([10, 20]); + expect(sink.closed, isFalse); + sink.close(); + expect(sink.closed, isTrue); + expect(() => sink.add([10]), throwsStateError); + sink.reset(); + expect(sink.closed, isFalse); + sink.add([10, 20, 30]); + expect(sink.digest().length, 4); + expect(sink.closed, isTrue); + }); + + for (var e in known.entries) { + test('check "${e.key.name}"', () { + expect(crc32code("123456789", params: e.key), e.value); + }); + } + }); +} diff --git a/hashlib/test/crc64_test.dart b/hashlib/test/crc64_test.dart new file mode 100644 index 0000000..e9c305c --- /dev/null +++ b/hashlib/test/crc64_test.dart @@ -0,0 +1,95 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +/// CRC-64 code for "123456789" +var known = { + CRC64Params.iso: '46a5a9388a5beffe', + CRC64Params.ecma: '6c40df5f0b497347', + CRC64Params.goIso: 'b90956c775a41001', + CRC64Params.ms: '75d4b74f024eceea', + CRC64Params.we: '62ec59e3f1a4f00a', + CRC64Params.jones: 'caa717168609f281', + CRC64Params.goEcma: '995dc9bbdf1939fa', + CRC64Params.xz: '995dc9bbdf1939fa', + CRC64Params.redis: 'e9c6d914c4b8d9ca', + CRC64Params.nvme: 'ae8b14860a799888', +}; + +void main() { + group('CRC-64 test', () { + test("name", () { + expect(crc64.name, 'CRC-64/ISO-HDLC'); + }); + test("name for defined polynomial", () { + expect(CRC64(CRC64Params.ecma).name, 'CRC-64/ECMA-182'); + }); + test("name for custom polynomial", () { + expect(CRC64(CRC64Params(0x1919)).name, 'CRC-64/1919'); + }); + + test('code with an empty string', () { + expect(crc64code(""), 0); + }); + test('with a string', () { + expect(crc64.string("Wikipedia").hex(), "352d6c9d31566506"); + }); + test('code with a string', () { + expect(crc64code("Wikipedia"), (0x352d6c9d << 32) | 0x31566506); + }, tags: ['vm-only']); + test('hex output', () { + expect(crc64sum("Wikipedia"), "352d6c9d31566506"); + }); + + test('createSink produces same result for same input', () { + final sink1 = crc64.createSink(); + sink1.add(utf8.encode("TestString")); + final result1 = sink1.digest().hex(); + + final sink2 = crc64.createSink(); + sink2.add(utf8.encode("TestString")); + final result2 = sink2.digest().hex(); + + expect(result1, equals(result2)); + }); + + test('sink test', () { + final sink = crc64.createSink(); + expect(sink.closed, isFalse); + sink.add([10, 20]); + expect(sink.closed, isFalse); + sink.close(); + expect(sink.closed, isTrue); + expect(() => sink.add([10]), throwsStateError); + sink.reset(); + expect(sink.closed, isFalse); + sink.add([10, 20, 30]); + expect(sink.digest().length, 8); + expect(sink.closed, isTrue); + }); + + test('CRC64Params.hex', () { + var params = CRC64Params.hex( + poly: '42F0E1EBA9EA3693', + seed: 'FFFFFFFFFFFFFFFF', + xorOut: 'FFFFFFFFFFFFFFFF', + ); + expect(params.high, 0x42F0E1EB); + expect(params.low, 0xA9EA3693); + expect(params.seedHigh, 0xFFFFFFFF); + expect(params.seedLow, 0xFFFFFFFF); + expect(params.xorOutHigh, 0xFFFFFFFF); + expect(params.xorOutLow, 0xFFFFFFFF); + }); + + for (var e in known.entries) { + test('check "${e.key.name}"', () { + expect(crc64sum("123456789", params: e.key), e.value); + }); + } + }); +} diff --git a/hashlib/test/fixures/long.txt b/hashlib/test/fixures/long.txt new file mode 100644 index 0000000..978e956 --- /dev/null +++ b/hashlib/test/fixures/long.txt @@ -0,0 +1,27 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lacinia quis vel eros donec ac. Nisi vitae suscipit tellus mauris a diam maecenas sed enim. Enim neque volutpat ac tincidunt vitae semper. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ultrices eros in cursus turpis massa tincidunt dui ut. Lorem donec massa sapien faucibus et. Nunc vel risus commodo viverra maecenas accumsan lacus vel facilisis. Cursus turpis massa tincidunt dui ut. Malesuada fames ac turpis egestas integer eget. Non odio euismod lacinia at quis risus. Risus in hendrerit gravida rutrum quisque non. + +Id ornare arcu odio ut sem nulla. Tristique sollicitudin nibh sit amet. Elit ut aliquam purus sit. Amet justo donec enim diam. Et netus et malesuada fames ac turpis egestas. Non arcu risus quis varius quam quisque id diam vel. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Sed odio morbi quis commodo odio aenean sed. Mauris sit amet massa vitae tortor condimentum lacinia. Proin sagittis nisl rhoncus mattis rhoncus. Egestas pretium aenean pharetra magna ac placerat. Condimentum lacinia quis vel eros. At tempor commodo ullamcorper a lacus vestibulum. Pretium aenean pharetra magna ac placerat. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. A pellentesque sit amet porttitor eget. Tristique magna sit amet purus gravida quis. + +Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Condimentum vitae sapien pellentesque habitant. Consectetur purus ut faucibus pulvinar elementum integer. Mattis enim ut tellus elementum. Pretium quam vulputate dignissim suspendisse. Nulla facilisi morbi tempus iaculis urna. Pretium fusce id velit ut tortor pretium. Ac tortor dignissim convallis aenean et tortor. Non blandit massa enim nec dui nunc mattis enim. Diam donec adipiscing tristique risus nec. Tellus at urna condimentum mattis pellentesque id nibh. Eu non diam phasellus vestibulum lorem. Aliquet nibh praesent tristique magna sit amet purus. At volutpat diam ut venenatis. + +Aliquam faucibus purus in massa tempor. Nec nam aliquam sem et tortor consequat. Ullamcorper morbi tincidunt ornare massa. Vulputate enim nulla aliquet porttitor lacus. Non pulvinar neque laoreet suspendisse. Nam libero justo laoreet sit amet cursus. Tristique nulla aliquet enim tortor at auctor urna nunc. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet. Ut etiam sit amet nisl purus in mollis. Egestas purus viverra accumsan in nisl nisi scelerisque eu ultrices. Amet nisl suscipit adipiscing bibendum est ultricies integer. Sed pulvinar proin gravida hendrerit lectus. Sem integer vitae justo eget magna fermentum iaculis eu. Ipsum a arcu cursus vitae congue mauris rhoncus aenean. Sed tempus urna et pharetra pharetra. Auctor elit sed vulputate mi sit amet mauris commodo. Fusce id velit ut tortor pretium viverra suspendisse potenti. + +Eget nunc lobortis mattis aliquam faucibus purus in massa tempor. Gravida rutrum quisque non tellus. In mollis nunc sed id semper. Feugiat nibh sed pulvinar proin gravida hendrerit lectus. Id ornare arcu odio ut sem. Tellus in metus vulputate eu scelerisque felis. Pretium quam vulputate dignissim suspendisse in est ante in. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit ut aliquam purus sit. Sed odio morbi quis commodo odio aenean sed adipiscing diam. Et pharetra pharetra massa massa ultricies mi quis. Nunc aliquet bibendum enim facilisis gravida. Vivamus arcu felis bibendum ut tristique et egestas. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Amet risus nullam eget felis. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan. Euismod elementum nisi quis eleifend quam. Felis imperdiet proin fermentum leo. + +Sit amet risus nullam eget. Urna nec tincidunt praesent semper feugiat nibh sed. Neque gravida in fermentum et sollicitudin ac orci phasellus egestas. Nulla facilisi nullam vehicula ipsum a arcu. Quis blandit turpis cursus in hac habitasse platea. Id porta nibh venenatis cras sed felis. Eget mi proin sed libero enim sed faucibus turpis in. Facilisi cras fermentum odio eu feugiat pretium nibh. Imperdiet massa tincidunt nunc pulvinar. Libero justo laoreet sit amet cursus sit amet dictum sit. Orci a scelerisque purus semper eget duis at tellus at. Consectetur purus ut faucibus pulvinar elementum. Dolor sit amet consectetur adipiscing elit ut aliquam purus sit. Semper eget duis at tellus. Pellentesque elit eget gravida cum sociis natoque penatibus et magnis. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. + +Viverra justo nec ultrices dui sapien eget mi. Cras tincidunt lobortis feugiat vivamus. Lectus proin nibh nisl condimentum id. Quam nulla porttitor massa id neque aliquam vestibulum. Ultrices eros in cursus turpis massa. Neque viverra justo nec ultrices dui sapien eget. Dui ut ornare lectus sit. Neque vitae tempus quam pellentesque nec nam. Nibh venenatis cras sed felis eget velit aliquet. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. + +Turpis cursus in hac habitasse platea dictumst quisque sagittis. Scelerisque felis imperdiet proin fermentum leo. Id faucibus nisl tincidunt eget nullam non nisi est sit. Facilisis sed odio morbi quis commodo odio aenean sed. Nulla porttitor massa id neque aliquam. Eros in cursus turpis massa tincidunt dui ut ornare lectus. Turpis cursus in hac habitasse platea dictumst. Eros in cursus turpis massa tincidunt dui ut ornare lectus. Diam quam nulla porttitor massa id neque. Tristique senectus et netus et malesuada fames ac. Nibh ipsum consequat nisl vel pretium lectus quam id. Tellus mauris a diam maecenas sed. + +Mi sit amet mauris commodo quis imperdiet massa tincidunt. Sit amet consectetur adipiscing elit ut aliquam purus sit. Lobortis mattis aliquam faucibus purus in massa tempor. Sem viverra aliquet eget sit. Sit amet luctus venenatis lectus. Aliquam vestibulum morbi blandit cursus risus at ultrices. Neque convallis a cras semper auctor neque vitae tempus quam. Pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Eros donec ac odio tempor orci dapibus. Vel pretium lectus quam id leo in vitae turpis. Nulla malesuada pellentesque elit eget gravida. Ridiculus mus mauris vitae ultricies leo. Vel turpis nunc eget lorem. Pharetra pharetra massa massa ultricies mi quis hendrerit dolor magna. At lectus urna duis convallis convallis tellus. Nibh tellus molestie nunc non blandit massa enim nec. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. Ultricies tristique nulla aliquet enim tortor at auctor urna. + +Quis varius quam quisque id. Felis donec et odio pellentesque diam volutpat commodo sed. Adipiscing elit pellentesque habitant morbi tristique senectus. Sit amet cursus sit amet dictum sit. Ut venenatis tellus in metus vulputate eu scelerisque felis imperdiet. Sagittis purus sit amet volutpat consequat mauris nunc. Ut tellus elementum sagittis vitae et. Interdum consectetur libero id faucibus nisl. Leo integer malesuada nunc vel risus commodo viverra. Suscipit tellus mauris a diam. Tortor condimentum lacinia quis vel eros donec. Donec massa sapien faucibus et. A scelerisque purus semper eget duis at. Sed viverra ipsum nunc aliquet. Nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Neque viverra justo nec ultrices dui sapien eget. Tempus egestas sed sed risus pretium quam vulputate dignissim. Lectus nulla at volutpat diam ut. Nibh sed pulvinar proin gravida hendrerit lectus. + +Quis hendrerit dolor magna eget est. Varius vel pharetra vel turpis nunc. Nullam vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Arcu vitae elementum curabitur vitae nunc sed. Dui accumsan sit amet nulla. Purus sit amet luctus venenatis lectus magna fringilla. Egestas tellus rutrum tellus pellentesque. Sed tempus urna et pharetra pharetra massa massa ultricies mi. Nullam eget felis eget nunc. Integer malesuada nunc vel risus commodo. Pellentesque adipiscing commodo elit at imperdiet dui accumsan sit amet. + +Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Bibendum enim facilisis gravida neque convallis a cras. Scelerisque in dictum non consectetur a erat nam. Metus vulputate eu scelerisque felis. Vestibulum sed arcu non odio euismod lacinia at quis risus. Nisi est sit amet facilisis. Sed risus ultricies tristique nulla aliquet enim tortor at. Bibendum arcu vitae elementum curabitur vitae. Eu ultrices vitae auctor eu augue. Est pellentesque elit ullamcorper dignissim cras tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus. Pretium fusce id velit ut tortor pretium. Turpis egestas maecenas pharetra convallis. Donec pretium vulputate sapien nec. Ante metus dictum at tempor commodo ullamcorper. Augue ut lectus arcu bibendum at varius vel pharetra vel. Consequat semper viverra nam libero justo. + +Aliquet porttitor lacus luctus accumsan tortor. Faucibus a pellentesque sit amet porttitor eget. Risus sed vulputate odio ut enim blandit volutpat maecenas. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas maecenas pharetra convallis. Enim neque volutpat ac tincidunt vitae. Urna et pharetra pharetra massa massa ultricies mi quis hendrerit. Facilisis mauris sit amet massa. Pretium nibh ipsum consequat nisl vel pretium lectus. Enim nunc faucibus a pellentesque sit amet. Donec ac odio tempor orci dapibus ultrices in iaculis nunc. Condimentum mattis pellentesque id nibh. Cursus euismod quis viverra nibh cras pulvinar mattis nunc. Arcu non odio euismod lacinia at quis risus. Mauris ultrices eros in cursus. Faucibus turpis in eu mi bibendum neque egestas congue quisque. + +Morbi tristique senectus et netus et malesuada fames ac turpis. Laoreet suspendisse interdum consectetur libero id faucibus. Tempor nec feugiat nisl pretium fusce id velit. Pellentesque nec nam aliquam sem et tortor consequat id. Est lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Sit amet facilisis magna etiam tempor orci eu. Malesuada fames ac turpis egestas integer. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Senectus et netus et malesuada fames ac turpis egestas sed. Mi sit amet mauris commodo. Feugiat in ante metus dictum at tempor commodo ullamcorper. Cras tincidunt lobortis feugiat vivamus at. Ut tortor pretium viverra suspendisse potenti nullam. diff --git a/hashlib/test/fixures/xxh32.csv b/hashlib/test/fixures/xxh32.csv new file mode 100644 index 0000000..9650096 --- /dev/null +++ b/hashlib/test/fixures/xxh32.csv @@ -0,0 +1,10240 @@ +0,02cc5d05 +1,bd0f6f71 +2,c3bfcd7f +3,b872db1f +4,0df3e9ea +5,07f39c9b +6,c9943929 +7,1f92202c +8,c27c8a68 +9,07116278 +10,6c5d250a +11,2f858de0 +12,8c0a9c9c +13,5d5a79a4 +14,ec0eba1e +15,6f0374d7 +16,63001dca +17,e6d859c8 +18,e037f5c2 +19,a16d98c0 +20,fd348260 +21,b47a9e54 +22,8515180d +23,5afcc41e +24,db7fe300 +25,48da266f +26,96d6d2c2 +27,57cc808f +28,d4d98208 +29,43bb2a24 +30,f92b5bab +31,f6b608e8 +32,6ade9e85 +33,d2c37bc3 +34,1f195fa0 +35,0aaf796d +36,3bc45ee4 +37,16e43ff2 +38,68baadd5 +39,17839fff +40,dbb1cd2b +41,12bdd7d0 +42,d022cab7 +43,dc76bf3d +44,c2bdcf67 +45,2bde972a +46,fbe89ea0 +47,6d0a8532 +48,24242815 +49,6dc1939b +50,fdd11877 +51,54112f9a +52,341e977f +53,f7b9bfe9 +54,138cf461 +55,1ad841dc +56,9ce0b0e9 +57,e73ccb73 +58,12c880a0 +59,8b4bf63a +60,11e7607d +61,e0f6a057 +62,73d2a53f +63,a3928c9c +64,cd4f8467 +65,3975e32e +66,48ab4f28 +67,2fc5e761 +68,fd3c13db +69,cdf2d703 +70,48d15996 +71,d8b3c7a2 +72,bbf9fda8 +73,c026d1b3 +74,09efe994 +75,3d9656f9 +76,b1dc4667 +77,fa531c6a +78,431be963 +79,f28a674b +80,96a23763 +81,79f6e3ac +82,c0b41962 +83,635ecaa8 +84,8790b54b +85,77011fb2 +86,7173912f +87,d1202d36 +88,c485bbd4 +89,4411d7e5 +90,46fa2c51 +91,bdb2ee13 +92,4fb7515e +93,3ef804be +94,9c192bd3 +95,66e32993 +96,2b6bab83 +97,b012a103 +98,00063a8b +99,040f41dc +100,612d81ee +101,8bda846e +102,ef4a2a50 +103,e2195320 +104,d0643c48 +105,d5474c49 +106,d48cd64c +107,5d5f3703 +108,c05833bb +109,2f237d03 +110,cb51e8b7 +111,77971c7e +112,0a4ea068 +113,96c0eaa9 +114,778de8de +115,562e38d5 +116,cac09434 +117,c2126743 +118,55281888 +119,227d5ec2 +120,fd1778e7 +121,f2794b06 +122,e4f673e7 +123,d2fbd629 +124,62e86f88 +125,60b288ed +126,c56b7914 +127,379e48b8 +128,229177f4 +129,23b5cca4 +130,297bec3a +131,1c64660b +132,fb168e7f +133,dc46d46e +134,96d08663 +135,21c92163 +136,3305d22c +137,1c868e05 +138,13d6aba7 +139,8d0438a4 +140,990d2db0 +141,5efb7a15 +142,72deffc0 +143,7b66b3fb +144,0ba42669 +145,c8d0c5c6 +146,536a7373 +147,0a7293a2 +148,3379e15c +149,d9d014f2 +150,18a179ed +151,a5fc5cb8 +152,5132e628 +153,378fde7b +154,dc44db3b +155,b0346493 +156,a116e713 +157,bbb40e58 +158,35254e2d +159,791524a2 +160,2a10be19 +161,38ac81bb +162,90258a5f +163,6adcc7db +164,0dad0292 +165,c893220d +166,bec0e1d7 +167,5c6fbf6a +168,6b94315a +169,47dab30b +170,8e4abaf9 +171,2a17df41 +172,f842be6d +173,154ee7f7 +174,97da6aa1 +175,0195beab +176,acc032d2 +177,38456f54 +178,4a450855 +179,c02551d8 +180,a0d7b81c +181,307642d5 +182,fb50e475 +183,b1c1081c +184,5ffc4e9c +185,041f1dbb +186,21f66a8a +187,f4fb4260 +188,4ec19bdb +189,c912c29e +190,5fc87853 +191,62b1f311 +192,5e680d06 +193,897126b6 +194,02eccd4d +195,60bc3a1d +196,6017b5b1 +197,ed8f5458 +198,e718b098 +199,68931a6b +200,9d35c45b +201,95b0f056 +202,b47428f4 +203,843f8a65 +204,0cb7dc20 +205,cce0943e +206,3ee910d3 +207,94023a44 +208,ba276693 +209,16ef2ccf +210,9df26998 +211,0174a9d8 +212,ff69012a +213,d960f479 +214,52841136 +215,484f6bc0 +216,75839848 +217,f4b71759 +218,4df90e6a +219,118f7ab0 +220,174a6b92 +221,61568c93 +222,06566919 +223,5062c56d +224,09894395 +225,da465e12 +226,6e3ce7f6 +227,dd679003 +228,42ed8d1e +229,ef055eec +230,71f92baa +231,865987a5 +232,4764aabc +233,ce7ffc6f +234,e90e9582 +235,9c5461b6 +236,64586c71 +237,00d8e1d8 +238,b6968fa1 +239,269c2920 +240,18b72134 +241,37c9e884 +242,f5b79d8a +243,73ee2be5 +244,0e7a1355 +245,dc3c5491 +246,e621159d +247,39fd98bc +248,08425efe +249,17afa568 +250,18f06b6d +251,ab6fc98e +252,2d5dc0a3 +253,e9c57b00 +254,cc4f34ef +255,24a18590 +256,4a695586 +257,f60b6d64 +258,1e720705 +259,acb57f4c +260,b48a1efe +261,9e02ea6f +262,93edd103 +263,88ecd7b1 +264,f6258994 +265,ba269597 +266,cfb44a09 +267,19d57e28 +268,7762d8ce +269,b679f57e +270,bbda2aa9 +271,5bde0106 +272,90ee74ce +273,6d71d3ec +274,ed414f81 +275,1cee8656 +276,ccdc10d1 +277,e2bee942 +278,752e95a2 +279,18c30b88 +280,80aabb12 +281,7c30f75a +282,77ec3499 +283,c8dfc2c9 +284,8148c96b +285,8e3f29cf +286,9ac37ec2 +287,0570188d +288,c325b705 +289,9691df6b +290,9b0f159f +291,5a2528ed +292,2e8e1ec9 +293,2ca2f363 +294,60e01bc9 +295,fbd0b96e +296,934f7781 +297,f7a396f8 +298,02aecad6 +299,19b57969 +300,69b6ead5 +301,743344b8 +302,aec52eae +303,bf7d11c4 +304,b729e552 +305,73afa0d5 +306,ff5b0214 +307,976eb7d9 +308,1ab5aa86 +309,b278e2ff +310,a8dfec2b +311,7adff269 +312,bf5540ca +313,e8ff5977 +314,d8c866e9 +315,69599867 +316,43dd9e80 +317,c7f3c04f +318,8792b6d0 +319,01720a92 +320,60b0e641 +321,45403d58 +322,620e1ab6 +323,9357b19d +324,4c643c36 +325,6a632d6d +326,53d352c1 +327,a7b6a926 +328,48dd66fe +329,e44c2b0e +330,e8da2a8d +331,8fb35ab4 +332,21ce373c +333,17c53be3 +334,81cc53ad +335,43d705f7 +336,ae0701d2 +337,87c357e6 +338,b9a0538a +339,228f0c9b +340,62abf341 +341,af805b1c +342,26a72255 +343,5626779d +344,329e84e0 +345,e7e1ceea +346,64dfaa14 +347,8b0c0710 +348,42d7c0a9 +349,9fd4bef4 +350,ae7dc40c +351,0c00e966 +352,e0fe4094 +353,4df01cfb +354,9b1f65b3 +355,fe1572b6 +356,a98d722f +357,ad27746a +358,2678b9b4 +359,8692416c +360,b26ebf97 +361,49303233 +362,2e84e787 +363,efa89b3a +364,3a5c1e50 +365,71386890 +366,c0e7aa49 +367,332e59bf +368,5a7aa619 +369,95289d3c +370,5d45ebe1 +371,cf20782d +372,92f66751 +373,4bb54b36 +374,810aaadd +375,0f053f90 +376,14c61dbd +377,04e97dd0 +378,1d8dbc13 +379,7152d721 +380,6050deb5 +381,0e1f1707 +382,e58369c7 +383,51888b70 +384,6d25aea6 +385,6f54a7fe +386,3448bc4c +387,b7ec3dc3 +388,e946dda4 +389,a8dbed9c +390,ea4ae3dd +391,6d7ae1fb +392,cc1610ca +393,60a66d27 +394,0021a050 +395,f61c04cb +396,97e3d017 +397,ab1cb02c +398,7dc10502 +399,ed553366 +400,81280afd +401,41887830 +402,6b3173ac +403,60fbd4ed +404,2be4360e +405,b19d796a +406,3f9e217a +407,92644c98 +408,885a28ca +409,9a7c5a83 +410,3310ce9c +411,8f647e49 +412,406b0478 +413,459b5adb +414,6c073515 +415,54d6f20f +416,dd85eec6 +417,b9e42a33 +418,e8bd622c +419,561d2c6a +420,8f31e887 +421,56d35d73 +422,fa5db6d5 +423,ffcdc9c0 +424,35b7f0f4 +425,931e2fe3 +426,10948372 +427,3fda5439 +428,f25ffbb5 +429,2143cf56 +430,510842a7 +431,f49cf470 +432,e66e0138 +433,d85d5745 +434,ebd65c26 +435,3c21b3a4 +436,a056556b +437,10e8352b +438,16ab7c29 +439,65242f89 +440,605c6969 +441,d6db1f9e +442,94c81b67 +443,319d62a5 +444,de18ddc3 +445,8f59cc00 +446,fa07d744 +447,a8b65f3a +448,dd7c0b4c +449,b4f66448 +450,1ebee589 +451,bf7e2197 +452,ed6a9364 +453,afb539f2 +454,0e1cf791 +455,737049a9 +456,acecc90e +457,ec6dac27 +458,07d3ec87 +459,d8e277b9 +460,b3c5b17c +461,8c17da7a +462,47acc588 +463,68401252 +464,ad1cb1c4 +465,82d6254e +466,a360db79 +467,5e32d3c2 +468,247649e3 +469,b194c76f +470,9c4678e8 +471,0c74a4a6 +472,5d1c1d65 +473,15b6ce0c +474,aa987d51 +475,92b0e224 +476,5154a398 +477,2e2d36f3 +478,8c5cb57d +479,e70df8aa +480,c6e0fbe5 +481,bd78e9b1 +482,5392deb4 +483,4f5491ef +484,4511f358 +485,039d50fc +486,be811784 +487,c56b2f4e +488,d320d555 +489,e47f1475 +490,b795cdc7 +491,3cb0b59c +492,ca86b1fe +493,28ab373f +494,cc8b70b8 +495,13da11ed +496,6c3ae50a +497,50399f5f +498,13b08214 +499,4d96eb40 +500,a0ab276d +501,bfba9485 +502,8318425b +503,500cfe95 +504,0e4af8e5 +505,773df1c4 +506,6763d3c3 +507,d105baa2 +508,acc6d182 +509,1f3de2cc +510,64303669 +511,ef01bc04 +512,1acd005b +513,dd10d855 +514,ef6fda05 +515,2280250c +516,6fc5537a +517,232d0ca8 +518,de78aa9e +519,877b55a3 +520,fe3f1a6e +521,a16c281f +522,54931c5d +523,ab0800f0 +524,0f935fa5 +525,172122cb +526,0c6a415d +527,8844a501 +528,787c9423 +529,34681262 +530,8a3897c7 +531,60afe409 +532,fe5f2795 +533,44c3bc8a +534,12a78c52 +535,2e6754e7 +536,6ac5b942 +537,9d83d1b4 +538,a6c43685 +539,c919ba5a +540,e1797e15 +541,a825b0d9 +542,91c6edfa +543,868fb2fe +544,ccf3c8ec +545,b0258ef5 +546,d73554ba +547,955fd585 +548,f2e19340 +549,b76df586 +550,46593514 +551,a8554ba9 +552,43855589 +553,fc2adadd +554,fd571fb6 +555,6dbd50ff +556,5d25c1cb +557,0d30d8fb +558,eef46f40 +559,d5319691 +560,dff453b3 +561,e473ca94 +562,d69f47aa +563,902633c7 +564,1fd9732a +565,7db10b4b +566,00be41fb +567,11737c8a +568,8fb5a6d5 +569,bad57631 +570,36bcdbce +571,6ae91d51 +572,ec39ad46 +573,7db9d758 +574,fb6b6007 +575,630bbde8 +576,168e9db5 +577,6566d7ec +578,69aa2e7e +579,040de2d6 +580,e815e6a9 +581,8bfad80a +582,4773fa7c +583,1aad04d5 +584,2c91e617 +585,9dffc14b +586,aa1c0bac +587,80e6cdad +588,7b33aa96 +589,10493744 +590,23a00450 +591,ea4a9000 +592,5fa14701 +593,eac82f2d +594,e09305ba +595,348cb9e0 +596,7da1a290 +597,502ef491 +598,5ea5449b +599,5ff303d8 +600,48be3e2d +601,24d9bb11 +602,b3322d14 +603,b92f413e +604,bab55031 +605,0c854afe +606,090e888a +607,d2653e3b +608,c0e823df +609,cff2413a +610,8e2ca887 +611,834c0976 +612,9684624d +613,9fa709ac +614,d635e49b +615,f7ebdb8b +616,afec8d0c +617,355f68d1 +618,008596fa +619,2cc2a12e +620,14d3332c +621,fa3dd385 +622,20c82fec +623,c4dda2ba +624,66144a73 +625,c91b6c4a +626,0ea36b0c +627,ffd1692a +628,1bba7e95 +629,0465be87 +630,a3855ddd +631,574f814e +632,24d2d7a7 +633,2448bf94 +634,16cd0f69 +635,51ef4a1d +636,0fae3c87 +637,1e564274 +638,f88cad8b +639,cbd60c5c +640,dbf1f1d3 +641,0811102f +642,6f20df66 +643,a3b18688 +644,93bfe756 +645,178c449e +646,9029dde9 +647,e8769b3a +648,271a6a8f +649,22dcdb68 +650,649c2d1d +651,30b5694c +652,5adb4698 +653,609f83c7 +654,c1e29d43 +655,b000f551 +656,82dad8a1 +657,f26608f2 +658,29582cba +659,0749d7a3 +660,09563fe3 +661,aea8b71c +662,79ad66c9 +663,b23a0f91 +664,f6fc4231 +665,b40c3c3d +666,86b746ec +667,be0e7fa6 +668,e66e4792 +669,219f7814 +670,f9a53fea +671,f114257a +672,ddf66880 +673,bc1e8221 +674,d3731c71 +675,a6ba1be7 +676,b559eb78 +677,4658574c +678,9c7fe9ef +679,4f9b8254 +680,5c1f65f5 +681,b771b052 +682,fa0e5e15 +683,3adac332 +684,272cf6c0 +685,0ec8cbdb +686,d72890f3 +687,f8dd076d +688,3928a1ba +689,dbbaef68 +690,ceb6601b +691,38a56aa0 +692,c3c0ff47 +693,db639585 +694,e4032569 +695,1b981e39 +696,ca1fcfa9 +697,c79ed5eb +698,c45db9c8 +699,299cd299 +700,fbdf2c41 +701,e10859e1 +702,0fb171f0 +703,50c9f268 +704,51507b72 +705,438a40e6 +706,68ed143d +707,8759f884 +708,f321d557 +709,08e78177 +710,052d475f +711,b3425f23 +712,21b7e756 +713,e82b4097 +714,3d7e25e5 +715,85f71e58 +716,51fc5e2d +717,e53a7cc3 +718,04f60598 +719,b6718890 +720,b181b86c +721,e605c72b +722,48b9af08 +723,e2a3cb44 +724,0377deac +725,0c4b1e9e +726,86b5798a +727,b514f216 +728,f16a13eb +729,0ed08c1d +730,bdc090fa +731,5ffed383 +732,c3716570 +733,468d8553 +734,94483253 +735,bcf7b6bd +736,2878172f +737,bbe7dc82 +738,9d2dc2e0 +739,972ad6e9 +740,90d981df +741,f22fbab8 +742,b0a34663 +743,a8334c43 +744,74efd3dd +745,903f2983 +746,afd54f8a +747,84ae50b7 +748,f1aff2eb +749,108d4237 +750,eaacc752 +751,675edc5d +752,304dc122 +753,f7f55fa1 +754,026016b7 +755,5b7e53ba +756,ee2dbc19 +757,c7dce83d +758,e6c26cc6 +759,0d41fffe +760,53ad8cd2 +761,12e02fba +762,bf609cc0 +763,53113984 +764,ea87e94b +765,a6907225 +766,16d14699 +767,5047c415 +768,785f7ca7 +769,9b14f4ec +770,4075b235 +771,5580ce5f +772,96dfce82 +773,73d008e6 +774,811f3cd7 +775,e787b491 +776,f9127f35 +777,7f28d9f3 +778,2aae4a7d +779,594f17cf +780,37de931f +781,93fd3f05 +782,fd656d7e +783,104127d3 +784,aa0fd75f +785,5eb91fa1 +786,f1d0b937 +787,e9fb6737 +788,58169891 +789,b48ec2ed +790,ed1c5f0c +791,dba96475 +792,2246707b +793,cea5b8b4 +794,f3bee338 +795,4aafc790 +796,2b8390fd +797,685a145c +798,2d496f39 +799,9367d633 +800,44ffc03b +801,c607407e +802,7e3ae111 +803,47b47bc2 +804,261b6c02 +805,1ccecffb +806,a249293d +807,099f0514 +808,9bb4d412 +809,0110cc97 +810,96588bdc +811,0d75df7d +812,c307545d +813,899f4bf9 +814,79ac283f +815,ffe6feca +816,1fb3907e +817,1f126b58 +818,026e0f91 +819,29686785 +820,33da1c21 +821,9cc8a101 +822,0b5fab60 +823,c3cc5873 +824,7e6ac2cc +825,f41880c3 +826,e7c4c343 +827,434eb267 +828,562da9c5 +829,b8be1609 +830,7ce9b6e6 +831,6c52bbb6 +832,6641002f +833,b92c5f33 +834,14b802c6 +835,caaeabe8 +836,05b15562 +837,f799684a +838,13645b7b +839,b8f8490e +840,bac8d326 +841,f90bb6bf +842,5b7d7d9e +843,0cf58238 +844,ac08a75d +845,e9b28f40 +846,19a058a4 +847,7c1bfdce +848,43a971f5 +849,81e9773a +850,8b9c8779 +851,6e2f14f8 +852,48bbd4c4 +853,2586c597 +854,530b2f99 +855,4825ea5d +856,e188770a +857,3cfb384a +858,9c8348c6 +859,258d2a6d +860,096ee594 +861,3cd4090c +862,10352596 +863,33e0295d +864,2ef14246 +865,95957ef6 +866,bc1f5581 +867,d51d60d5 +868,b431e5ad +869,c3f81c72 +870,e45c3e24 +871,fdaa22f3 +872,e83e802b +873,3685a78a +874,26cc23ed +875,d72307c1 +876,1ffe4892 +877,c85cda0c +878,c3d39028 +879,99d4e123 +880,c3b9bae6 +881,1265d95d +882,01a70845 +883,032de0bf +884,bc003e96 +885,c1f6bb5d +886,58bbe475 +887,049f5f4f +888,358db367 +889,ad657e49 +890,b7f26ce4 +891,43582165 +892,e87c7023 +893,d4b1a1c2 +894,9fc251c6 +895,f530e24f +896,20a2490d +897,5835f64b +898,6805dbee +899,9ea79c6e +900,9c315626 +901,016c5909 +902,c0062262 +903,a1394a81 +904,d549d2d5 +905,f692f9bd +906,e9098404 +907,6283a3ee +908,c7392143 +909,39998aca +910,87a7a29a +911,2a7f70fe +912,cd48f790 +913,d996bfde +914,4558a886 +915,198048ae +916,38ba18c5 +917,01ef2bfb +918,85079bff +919,b89453e1 +920,f07fd215 +921,95bc9819 +922,63f0a60e +923,c52eb1f9 +924,0deba6b3 +925,7a7d3757 +926,a2c86d2e +927,343052d4 +928,46fee238 +929,768c4720 +930,d45c322f +931,b005e84e +932,dd78095d +933,4af8a4bd +934,071a0303 +935,c95b7edc +936,2893dd80 +937,f4d84a5f +938,a46424a5 +939,2d2fefbd +940,faaaaca9 +941,3356dd8d +942,d8b2fd7e +943,76989056 +944,7b84a9e1 +945,b46f8772 +946,117a6860 +947,2ff913ea +948,cf1b907f +949,5dbda40a +950,90f5b03d +951,aa6e0347 +952,b2d96aa4 +953,daa344ff +954,275cbfad +955,8b40c6d3 +956,9fa00d08 +957,ed2e80b6 +958,533f33b1 +959,b9987fc2 +960,22aefa9e +961,ab8ecb74 +962,19226d7b +963,9fe03ffa +964,92941026 +965,fb0ece70 +966,de9d716a +967,9f9bde9d +968,76c893d6 +969,88cf3551 +970,65462844 +971,bbd27244 +972,27ac3115 +973,c32258a7 +974,13e67ea9 +975,54293ba9 +976,06177aa3 +977,98eb7035 +978,d94d07fb +979,2687a969 +980,28b3a17f +981,f57f12dd +982,82c3b2a7 +983,2d44c726 +984,19d30ba0 +985,96910f30 +986,47344456 +987,36af196c +988,c958be9d +989,68712853 +990,95dcb848 +991,8124e68a +992,102763be +993,374c4390 +994,cb7a270d +995,2565c23f +996,b38c72d0 +997,b5d0921d +998,dcf18fed +999,2dc477fd +1000,408e0443 +1001,f41d5bc2 +1002,b06941eb +1003,86f3acfe +1004,874a012f +1005,bd9c3a2a +1006,f4f96001 +1007,d9e73dc2 +1008,4486488e +1009,288f2520 +1010,3264d15a +1011,bacfe29c +1012,5c284435 +1013,4af4a858 +1014,9e50fbf2 +1015,c22a33b9 +1016,6ae6813c +1017,b560598e +1018,268cc57d +1019,8964440c +1020,6f9b09f8 +1021,a17130b7 +1022,fa5f9def +1023,3e3d4db5 +1024,485ea2a1 +1025,8074b062 +1026,94323045 +1027,4b8018f6 +1028,6cc81deb +1029,62915d8a +1030,6bf375a4 +1031,3bfadfef +1032,59c167c1 +1033,0e25337e +1034,ad2ee21a +1035,ca20b58f +1036,ce49c75f +1037,c2acbbf4 +1038,a47410c4 +1039,c85f2f5a +1040,87af52f9 +1041,00105891 +1042,d3466f8e +1043,98c22e48 +1044,e6a39394 +1045,8ab30c30 +1046,7a12078c +1047,b4ec56e4 +1048,9d27a5e9 +1049,93d5e446 +1050,acbefa89 +1051,2fb6eee2 +1052,73d414c6 +1053,e46d301e +1054,88064ee1 +1055,75c71fdf +1056,805fb058 +1057,bf5279a8 +1058,64cb510a +1059,9b0bedb9 +1060,97b49d2f +1061,45436e56 +1062,f01a6e01 +1063,1df68156 +1064,fa46689b +1065,e6fae616 +1066,b22d9b66 +1067,34e83663 +1068,1885bc2e +1069,02648d46 +1070,8ccc1690 +1071,f27621da +1072,5c03d59b +1073,77aa5a8a +1074,747fa5b5 +1075,5c242e92 +1076,6d305e3e +1077,16cd11fb +1078,830ae0ac +1079,0e17ca94 +1080,0fe4c809 +1081,58b4639e +1082,386df645 +1083,6a910286 +1084,71a36299 +1085,3bbeb93e +1086,602023f2 +1087,af3a0866 +1088,151f4f7d +1089,127823e6 +1090,63f87535 +1091,630facea +1092,d4bb8b66 +1093,7ab7498a +1094,fdf8b46c +1095,85d13534 +1096,3d58b0a6 +1097,c0db7eae +1098,c69866f3 +1099,64256e0c +1100,24f302fb +1101,535ca958 +1102,4321bf45 +1103,cbc8a1f8 +1104,2e98b553 +1105,11fa425d +1106,c907640b +1107,d8798632 +1108,310172a6 +1109,80b76eac +1110,9aa4e55a +1111,fc5b234d +1112,ff329b8d +1113,0b13d651 +1114,fcd6e73c +1115,1fd74f5e +1116,5e43eaf1 +1117,0416ce4a +1118,e73f0079 +1119,82c86f27 +1120,4a185d00 +1121,4e38cd6f +1122,15d7f893 +1123,8c577909 +1124,7ebb0e92 +1125,9b156bcc +1126,0a8f1dd6 +1127,d84bcabe +1128,a7663781 +1129,e6980745 +1130,79795819 +1131,49e3156a +1132,39d4bef4 +1133,02271761 +1134,55a4f718 +1135,379f547b +1136,9468e8ac +1137,a98a017a +1138,57f22f37 +1139,83fe52dd +1140,55f40b11 +1141,1b409773 +1142,6a0a78fd +1143,268b7c7e +1144,b96b193d +1145,7bbcd50b +1146,284eb0fe +1147,17caa411 +1148,479d6dd3 +1149,0bbca53c +1150,ad083341 +1151,b99cff38 +1152,ea532ce5 +1153,1b06037e +1154,69563e31 +1155,ddda6fae +1156,3a06ec36 +1157,93e9aeab +1158,fb11fb14 +1159,2bc16f21 +1160,dea7a7c3 +1161,a5e00c80 +1162,f54970fd +1163,12670d74 +1164,e09ae40d +1165,bb67f368 +1166,ea7cda74 +1167,0ab31e42 +1168,d7dd57ee +1169,ac400cf9 +1170,85cfbe6b +1171,56d63814 +1172,b75bf210 +1173,8db9336f +1174,d35d7ec7 +1175,6e0355b9 +1176,78e3fbe2 +1177,3ad9cd33 +1178,bc77c836 +1179,15d4eed1 +1180,932d55a0 +1181,dce512b5 +1182,84be2abe +1183,07ebe3ba +1184,8805b4d9 +1185,d041d0dd +1186,688fd28c +1187,5b7185a5 +1188,7e8cbeea +1189,356299bf +1190,09063656 +1191,5b66e39e +1192,ac03372f +1193,58539a3d +1194,09c01889 +1195,e9e9ce54 +1196,2c7971d5 +1197,c967f5cf +1198,cebbb259 +1199,b8b91685 +1200,07fad1b9 +1201,52654049 +1202,8ed1044c +1203,00d4ab46 +1204,9bdaec61 +1205,d9e531b4 +1206,2a7d612c +1207,780611ab +1208,8927bb51 +1209,fe51e4a6 +1210,5aa0542f +1211,a7cf698d +1212,7d57972c +1213,473fad1c +1214,ddc3d8d6 +1215,a067a82a +1216,180da36c +1217,b5b8909c +1218,9ca350d0 +1219,d33e9ec8 +1220,41348d67 +1221,23052ea1 +1222,72eb34da +1223,0b1ea2b4 +1224,32bf737d +1225,fd348b03 +1226,c6f3416b +1227,4e435046 +1228,6188b3f7 +1229,f83dc13f +1230,fcb3e092 +1231,6ec0024f +1232,e6f2fdbd +1233,a788612f +1234,c15947e6 +1235,ea0890df +1236,d2f69968 +1237,c3914fb0 +1238,fc50f5fb +1239,91fff895 +1240,0d7784d4 +1241,a1a18ac7 +1242,9eee2b18 +1243,811ef486 +1244,ab26f02e +1245,baa98936 +1246,2cb69c56 +1247,97cda697 +1248,b4459286 +1249,c9f7c87d +1250,0570e3b3 +1251,253da08e +1252,a4ebeb37 +1253,aa9163f7 +1254,29852494 +1255,c68f8b84 +1256,0d46344b +1257,002ce6b5 +1258,05c0ac6e +1259,e128343e +1260,0d6af4bf +1261,08e0522b +1262,181940b7 +1263,2c301a02 +1264,4269a40e +1265,5765d4c6 +1266,34e0f562 +1267,1b1ff923 +1268,6828ddae +1269,991be08d +1270,cc564183 +1271,42ddde09 +1272,8a153bba +1273,23d593a0 +1274,8119ba57 +1275,b997b58b +1276,a865c944 +1277,efa0645d +1278,e3ca55f2 +1279,40afd4b1 +1280,a0712dfc +1281,7ef66a4c +1282,ba1630eb +1283,355b1d47 +1284,390adecd +1285,32f2d976 +1286,3c78a7f8 +1287,93153ff0 +1288,f9026cf6 +1289,2eab02cb +1290,adb7bb3a +1291,5cd7a3b8 +1292,83e98317 +1293,8dc9bb0a +1294,2e40f352 +1295,1c890b50 +1296,5426cc68 +1297,ebab61e2 +1298,c342369d +1299,e267bf28 +1300,1d90996a +1301,ea7c2a27 +1302,d78fe144 +1303,11d1c945 +1304,f1dcafe4 +1305,d8bdb34e +1306,80ed427e +1307,6fc5c5b7 +1308,ce610b90 +1309,99985e45 +1310,8e6d6dea +1311,2bf349d9 +1312,e917cc0f +1313,34c91c7f +1314,ae548aa9 +1315,1fe4d3b5 +1316,b6f2b0e4 +1317,ad47c826 +1318,e52aa4da +1319,d300f4c0 +1320,3afedb62 +1321,46081c15 +1322,94f24c6a +1323,04ce9d0b +1324,cea8afe0 +1325,d4d7e596 +1326,8431b1a9 +1327,fbd531e4 +1328,5fdbe956 +1329,c2a79a51 +1330,f7047c15 +1331,8b29b6d5 +1332,0536f7da +1333,c44175f2 +1334,d57a4b95 +1335,fb4d52d7 +1336,d02bd3f5 +1337,bfe64b3e +1338,8c1c08d3 +1339,0d78bbaf +1340,ae125056 +1341,13943695 +1342,6b4d676e +1343,f9164417 +1344,918620ae +1345,a9cd180d +1346,440710d2 +1347,ed96ebd4 +1348,05aecce2 +1349,9d0173a8 +1350,35952eba +1351,66c3ddf4 +1352,c2db12b8 +1353,acfb1a9e +1354,bc1415b2 +1355,de3115ca +1356,765e2528 +1357,26b1f5e2 +1358,9f7576a4 +1359,eb05a2ed +1360,f212623c +1361,6966482b +1362,e03fb916 +1363,7af1194d +1364,449238ac +1365,14ebf429 +1366,36ef16a1 +1367,11c71c9e +1368,222d8c54 +1369,4d0e117e +1370,3b506427 +1371,ee861c11 +1372,3a8d1725 +1373,38f916d6 +1374,35c00746 +1375,2a2e9228 +1376,5a7379c1 +1377,0dda66aa +1378,8641665a +1379,85f51f90 +1380,c90ef3f6 +1381,8207d5fe +1382,e9da8e64 +1383,6a245b37 +1384,1baf3d35 +1385,5c8d3417 +1386,c681ea6a +1387,c558a5cf +1388,5b3df141 +1389,433da007 +1390,bc53e774 +1391,84e43256 +1392,fca912d3 +1393,8263ad44 +1394,68e1d04a +1395,4d8dccca +1396,03101c60 +1397,b24e4aed +1398,202a533f +1399,091eeecf +1400,7f0dd925 +1401,613192aa +1402,1d5ce20b +1403,9bdd3aef +1404,65951b38 +1405,6ce48a79 +1406,56a58d8b +1407,a88f6fce +1408,4c31a46f +1409,87edb889 +1410,d35ca6da +1411,6048634c +1412,3e15fc5c +1413,2b3dc491 +1414,6115b5bd +1415,98c526c2 +1416,89ed40aa +1417,91374da5 +1418,826e75b9 +1419,3e780dae +1420,ed653ad0 +1421,f0940a80 +1422,bbe0bab9 +1423,925c763f +1424,3ffaa104 +1425,5982f511 +1426,119169d6 +1427,976720ce +1428,191745c7 +1429,38ee5741 +1430,2fc4c248 +1431,68c88a9a +1432,fac2a079 +1433,86c2cd4c +1434,cb65e6f6 +1435,e0fee648 +1436,fcd3c42c +1437,2e917f5a +1438,0bb5565b +1439,6c92466a +1440,c08e6f73 +1441,427cb2f3 +1442,11cba553 +1443,11eaff89 +1444,36bc88a3 +1445,0b6fc746 +1446,5be3b08a +1447,9f691033 +1448,57ac42c6 +1449,3b41cdb4 +1450,9d7c2c33 +1451,28a981fa +1452,37a10f1c +1453,3b98ad46 +1454,b86d17b6 +1455,69cc84e1 +1456,dbdef471 +1457,2bf9f46d +1458,c8daaf58 +1459,70502b65 +1460,6f8e70d2 +1461,3dcf4b91 +1462,84825ef4 +1463,fa939150 +1464,641d7bcf +1465,6e80250f +1466,56da0728 +1467,5d2dafe2 +1468,d9fc8ba4 +1469,02c0a1be +1470,16117e2b +1471,e77f42ff +1472,00582768 +1473,61211d67 +1474,8d678d17 +1475,afdcc242 +1476,f0cb275c +1477,0dc53a4a +1478,7b660ea8 +1479,82c2c871 +1480,4146ee07 +1481,c448df51 +1482,355a4b1c +1483,93a0a2fd +1484,0aa2151a +1485,0cfdb160 +1486,b438dd31 +1487,fec0cf19 +1488,583c495e +1489,7adb07d2 +1490,f002235e +1491,cb882caf +1492,538f59f0 +1493,19aa246a +1494,33485acd +1495,b5793cd0 +1496,d36effdc +1497,f4de731c +1498,138060d5 +1499,f7178b78 +1500,96fa9094 +1501,7bde7e80 +1502,16656015 +1503,eafc4cb3 +1504,a877be19 +1505,f8083981 +1506,d56a6fcb +1507,a2186da9 +1508,f81dd26d +1509,d7bdefbe +1510,8622e2db +1511,8b4d4cda +1512,082f3988 +1513,b656ffe1 +1514,f406a51e +1515,dee62c8a +1516,f5f76ae3 +1517,5420fff3 +1518,5821ac77 +1519,a9246445 +1520,c02c137b +1521,e594909a +1522,e7966d70 +1523,2ef25e9a +1524,783ddcdb +1525,187a511b +1526,fe8c4de8 +1527,1db3fe7d +1528,3b2a9b3c +1529,ffdaf5d0 +1530,077daf48 +1531,7aae5f98 +1532,aaf00c20 +1533,c3e83ced +1534,2f2cb135 +1535,e4bdd20e +1536,d3b28ea0 +1537,1d866d23 +1538,f2199608 +1539,4aeaa33c +1540,0e90d41d +1541,e51d3bd0 +1542,124cf012 +1543,3a11d375 +1544,94e8497b +1545,d5f32fbd +1546,78d0950b +1547,3f675687 +1548,05a43f7e +1549,58dfe2c1 +1550,99500aaf +1551,56a75ea5 +1552,3aaac71e +1553,5b8e15e6 +1554,c0465281 +1555,0a9ded5c +1556,5b7f6533 +1557,b3786a06 +1558,1109fe26 +1559,d1fa5a17 +1560,5223a4ba +1561,cfe3a75c +1562,b9105568 +1563,e5d9b061 +1564,e7e46742 +1565,c9943e0b +1566,89b959c0 +1567,f4683114 +1568,e8ff4f4c +1569,e0c8341e +1570,a5a0db62 +1571,c021bdc3 +1572,7556a939 +1573,84a684d2 +1574,dd70f158 +1575,ece8c92a +1576,6815fa1b +1577,9d5830b5 +1578,9550d114 +1579,60263f11 +1580,a11dc6f7 +1581,31a9831e +1582,df11d5ad +1583,14df6c2e +1584,3e6202df +1585,7d3f307b +1586,4484758c +1587,d99b0db7 +1588,bb1d3105 +1589,a0bfa936 +1590,c2455ee1 +1591,f440959d +1592,5547425c +1593,4dea06a7 +1594,60cd7dc8 +1595,90f4afff +1596,2b686bf6 +1597,b883b569 +1598,36bf540c +1599,f5068325 +1600,f850191a +1601,025904fd +1602,ced688e7 +1603,d7cf62fb +1604,a3cf8268 +1605,e1008733 +1606,8643a9ea +1607,69d58b86 +1608,55adcf3d +1609,65913799 +1610,d2465c03 +1611,a830f2d2 +1612,793f02eb +1613,1e2cece1 +1614,09889a0a +1615,812dc1f4 +1616,899ee344 +1617,31f76286 +1618,3d22b4df +1619,684a823a +1620,e0f55a8a +1621,c99daefa +1622,7b1f0b5a +1623,e0a8fc1a +1624,ac1ccbbe +1625,2a853d9e +1626,a56d56ef +1627,756348fb +1628,09ffaa1e +1629,14b3f359 +1630,ca5317c9 +1631,71c72c9d +1632,bf912626 +1633,1661f002 +1634,aac8fccc +1635,3a154dc3 +1636,11b70af3 +1637,761f26b0 +1638,9f2885dc +1639,de6f647d +1640,8ad535c8 +1641,b6038508 +1642,8c8d65f8 +1643,830a7053 +1644,d3914e1d +1645,ecdd1d6e +1646,f992a3c0 +1647,ac416992 +1648,8d0397ac +1649,83109f3c +1650,a99ca0d3 +1651,80bfab29 +1652,936d14c4 +1653,af8643da +1654,ab42c29c +1655,2a252c19 +1656,7a3e1afd +1657,068ff650 +1658,ebf92c9d +1659,dca7b40d +1660,0ddabc90 +1661,ee4525a2 +1662,5aebd4da +1663,464853e6 +1664,73143ceb +1665,eb00f482 +1666,a2f756c7 +1667,d8ae7e99 +1668,cd8314e7 +1669,780ac064 +1670,a66269a1 +1671,e262cbf4 +1672,c3d71a1b +1673,4da112dd +1674,5009e56d +1675,6e59f95d +1676,b7a4c897 +1677,eef51a63 +1678,1371623a +1679,2c63cb22 +1680,38c17c20 +1681,dfd81d57 +1682,b181ce91 +1683,347446fe +1684,a797f4fd +1685,1c1c7a3b +1686,daa18d51 +1687,a3936774 +1688,19a64678 +1689,35d2f5b7 +1690,f4610d2e +1691,0c3877a8 +1692,6bf77826 +1693,006ba82b +1694,c20c66ee +1695,35f0ded8 +1696,0530a355 +1697,ae7e9226 +1698,596320b6 +1699,9cf873b2 +1700,f528886c +1701,888bd28b +1702,f012a8e8 +1703,2af25dfa +1704,94880430 +1705,fa8c9ed9 +1706,2459e1a2 +1707,5c3b7989 +1708,0551de95 +1709,09f6ff20 +1710,9aa04e3d +1711,b33e48bb +1712,dfc78b6b +1713,2688f134 +1714,dd771d27 +1715,3d6a661f +1716,3974586d +1717,0c8aef88 +1718,43b21234 +1719,10d41be7 +1720,abdebc9e +1721,f667d98c +1722,c9a14e22 +1723,d0381e3b +1724,55c47898 +1725,6e217dd8 +1726,1d610ee7 +1727,a92fff93 +1728,6cd88da4 +1729,90984e46 +1730,b4d5cece +1731,46a580cd +1732,d6ebbd63 +1733,8ebf544e +1734,75f7cfdc +1735,76cac2e2 +1736,ed0b5d01 +1737,9ac306cb +1738,c713f394 +1739,031b9857 +1740,cb62847c +1741,590c97be +1742,cd25b088 +1743,8499748a +1744,48b60ba0 +1745,9fe96784 +1746,1b0bcca9 +1747,be4f6714 +1748,2634f61b +1749,4a0f9512 +1750,810d04e0 +1751,747002d0 +1752,56e1b79f +1753,d89d5f65 +1754,e01374cf +1755,184a53cb +1756,06c65df1 +1757,1caa2391 +1758,69ccee2b +1759,0c5fe183 +1760,5a934173 +1761,cdb3d571 +1762,70faf17b +1763,3fcacf09 +1764,4951f883 +1765,d7923314 +1766,fae97ca6 +1767,89baf52c +1768,41fb7702 +1769,7aa68e3b +1770,e62886be +1771,a14d187d +1772,43f41de3 +1773,91c7b7e4 +1774,68139935 +1775,25d22e84 +1776,f0d238a9 +1777,4d84cf50 +1778,edcc9f48 +1779,8f6ba96b +1780,9743d47a +1781,f25b6ac1 +1782,95c357ba +1783,1d08b6c8 +1784,f2b4765f +1785,72cf2b42 +1786,87aa9249 +1787,95f8f304 +1788,ce115cba +1789,68320c15 +1790,317f8770 +1791,54cd203e +1792,990ccb08 +1793,5f78ee6a +1794,ede45895 +1795,b517fb4f +1796,8da2e78b +1797,f071f56c +1798,7ef0776a +1799,bb8a8c96 +1800,3f9fcb2f +1801,2517f9da +1802,7077fe83 +1803,7ef670c1 +1804,872366c5 +1805,89f30ce5 +1806,404a2824 +1807,a3177396 +1808,bfdb71ab +1809,375385d2 +1810,a757709c +1811,d1255586 +1812,9de96536 +1813,751e0a45 +1814,7213a5ed +1815,f3cbe5df +1816,a088b7bd +1817,f4a0be77 +1818,cad101fb +1819,2769ef8a +1820,0b7487a9 +1821,09fca74a +1822,00a02341 +1823,3e7a9d1d +1824,07a25234 +1825,9ca33e3a +1826,ec40425d +1827,e733b0a3 +1828,b140631f +1829,05daa9af +1830,711a9e95 +1831,59aa290b +1832,8fc3002e +1833,7127dc29 +1834,97c3b663 +1835,43fddb37 +1836,3ccaec4a +1837,8a43f963 +1838,976caee8 +1839,322c84ad +1840,6fe8e592 +1841,703cf887 +1842,78e597d5 +1843,5cb51ccd +1844,59ab68e7 +1845,92365750 +1846,56542f7b +1847,f38c2c83 +1848,e0784bb1 +1849,a5613ea9 +1850,dee0ceb4 +1851,be17dc42 +1852,1dab781c +1853,96f940c8 +1854,e4135218 +1855,38878e3a +1856,4a1268a8 +1857,61e49437 +1858,39498e9c +1859,d6d6dc4a +1860,ee477a3b +1861,68de189d +1862,479f86a6 +1863,43b53adc +1864,1da01c0c +1865,2003df5f +1866,a16fc6de +1867,82b0867f +1868,b10db2bc +1869,552965d9 +1870,9ffd9c78 +1871,38207dca +1872,4df285ce +1873,89ab5eb2 +1874,360cc68b +1875,a6d6956e +1876,ef0a0645 +1877,33509e21 +1878,6702c7aa +1879,f8fdb215 +1880,e5313883 +1881,ce518ae6 +1882,58adc092 +1883,4169db7c +1884,3b4e2f8e +1885,62d71047 +1886,2a3e445d +1887,f590fea0 +1888,93a05658 +1889,b19a9c20 +1890,1e6f621c +1891,b3deaf05 +1892,65df7bf1 +1893,3057c871 +1894,68aab1e8 +1895,f650f192 +1896,2e51c844 +1897,019a7b23 +1898,54954463 +1899,57b0141d +1900,b340b6f2 +1901,76aad1ba +1902,4942d2ca +1903,5d1da04e +1904,557a26c4 +1905,191437fd +1906,d567a839 +1907,80476a4d +1908,31e3b50e +1909,887d35fd +1910,efce647b +1911,41a4bf4e +1912,272a2a8f +1913,4aee96db +1914,eee54cd3 +1915,6ea2d3d5 +1916,08c7aeaf +1917,86f292ce +1918,52646cb3 +1919,2f997ec8 +1920,876fcb05 +1921,14b5389a +1922,4a1992cd +1923,ed052052 +1924,6c74d2e9 +1925,12888478 +1926,6d8c5204 +1927,25bcdd88 +1928,adb744fc +1929,989f024a +1930,6cc05682 +1931,67f70e2a +1932,7f4b6148 +1933,0f9f0ebc +1934,bc293692 +1935,a7638b08 +1936,0a76b8ec +1937,1de81739 +1938,e272803b +1939,8ece1803 +1940,597c542a +1941,f39509df +1942,baca3ac7 +1943,d5519671 +1944,8d9c20d1 +1945,7a0d43f0 +1946,76910ef8 +1947,768d81f1 +1948,a6fdbeca +1949,fe86ab51 +1950,e58dd896 +1951,014a9b03 +1952,56c63326 +1953,fc1c5825 +1954,bac89ef7 +1955,d2dcc8fd +1956,6fdc41da +1957,19b14fe0 +1958,660e17e2 +1959,c08d0a60 +1960,1a5137b0 +1961,9dcc3a9e +1962,6d068390 +1963,551e4619 +1964,32979186 +1965,d6ccc558 +1966,0821a7ab +1967,db61d288 +1968,20460b61 +1969,43eedf7f +1970,79e8385d +1971,0d05fccd +1972,dbc97e71 +1973,5dcd29ae +1974,fac17532 +1975,c4449980 +1976,cb11daa1 +1977,1764d9b8 +1978,9218da34 +1979,27ad8020 +1980,48f62e37 +1981,95ee0aea +1982,2f11d53f +1983,589a7eda +1984,1724621d +1985,b643e1f0 +1986,e41f78d5 +1987,8cdce972 +1988,37ca46b2 +1989,e36b0b9a +1990,6f91ad46 +1991,8528d536 +1992,4f438ae8 +1993,1f9a4d89 +1994,ac66b375 +1995,0ab49ecd +1996,a5314fdf +1997,c7b8df44 +1998,6dc65821 +1999,9578392d +2000,e306bfe7 +2001,e73677e1 +2002,4f663791 +2003,7fa7ca8d +2004,522d03dc +2005,8a101c71 +2006,1b48bc86 +2007,d500b04c +2008,dc8a4f7b +2009,947ef858 +2010,9750da45 +2011,95a60a94 +2012,2cb96752 +2013,81c187ee +2014,897d6cf7 +2015,0143f50b +2016,1859a6b1 +2017,44d3974b +2018,cdc2cb94 +2019,d51c3fc6 +2020,cd6d2833 +2021,fa4e3fe7 +2022,536898ef +2023,9922370d +2024,29319624 +2025,ee915194 +2026,991b2d5a +2027,a6118c14 +2028,8831027e +2029,26479e11 +2030,db7f7ecb +2031,26c6a720 +2032,c343c280 +2033,141c3942 +2034,a00372bd +2035,4dcb14b7 +2036,254bcd4c +2037,6306eca9 +2038,bbe09892 +2039,aa6ac576 +2040,c9e863e0 +2041,6d91c3c9 +2042,aeb801e3 +2043,f55ea79e +2044,33fba799 +2045,8ba64725 +2046,30a25dce +2047,08642076 +2048,1957c855 +2049,d54f9eb0 +2050,9e580906 +2051,6df74863 +2052,e7819657 +2053,7e053e6b +2054,ce16e673 +2055,e807d015 +2056,e2aeea60 +2057,e11d2df3 +2058,9df7989f +2059,5c34b4af +2060,77974861 +2061,256503ab +2062,5342ec9f +2063,8d281a6a +2064,b921a656 +2065,d302d8c4 +2066,cc8d61c8 +2067,a39cdef5 +2068,25f3141d +2069,8dec7ae3 +2070,343dc4a3 +2071,658ca039 +2072,6bcf9eba +2073,655521a4 +2074,b00dd8b9 +2075,707d05e7 +2076,1d4daf71 +2077,56f90173 +2078,7455aaaa +2079,8b6db66d +2080,44453fbc +2081,e03102af +2082,80e6ccc3 +2083,60fa7921 +2084,2eb77848 +2085,75626c43 +2086,70c539bb +2087,481810e0 +2088,c36b6885 +2089,aa873502 +2090,0f6b0cdc +2091,d7f65998 +2092,b84fef41 +2093,8c95ec24 +2094,bbf3f88d +2095,a8bd69ef +2096,da3079c4 +2097,5a725488 +2098,640eaad1 +2099,3c18650c +2100,0255e073 +2101,f431f234 +2102,52fd2d83 +2103,41717fc9 +2104,0694037f +2105,22d36a94 +2106,d5e213b6 +2107,06873da5 +2108,61487764 +2109,1ea58672 +2110,c39e2fae +2111,08f7e3e7 +2112,967fb151 +2113,74c17b56 +2114,7b2d4f15 +2115,41fc7d6b +2116,20a32f35 +2117,a76ffc27 +2118,d5f0f6bd +2119,68087d11 +2120,099fb97d +2121,65b70956 +2122,a3ccd27a +2123,586e862c +2124,8317d1a3 +2125,4bd382f7 +2126,52b1e390 +2127,85f1db6f +2128,36332167 +2129,75678469 +2130,493757bc +2131,5adeacc7 +2132,f217a7d2 +2133,950236ae +2134,96916abc +2135,7529b77c +2136,8f7d8057 +2137,7c11de21 +2138,2c00c0c0 +2139,41823325 +2140,52b4f376 +2141,b517a30e +2142,4a0372d2 +2143,57fb81db +2144,4064f040 +2145,71768ba8 +2146,7b0b54f7 +2147,037d58a1 +2148,11650ca3 +2149,0606f687 +2150,eb103c9a +2151,ca8484e3 +2152,c7face3a +2153,5c86a19f +2154,8cf9121b +2155,970d63b5 +2156,81bd2d95 +2157,aaed217c +2158,867984f7 +2159,491164b5 +2160,51374137 +2161,17fa7f87 +2162,515059e5 +2163,4878bc01 +2164,4868149d +2165,de3b0228 +2166,e522b8c4 +2167,5aaee9be +2168,83b57b96 +2169,67031a56 +2170,fcd6e3d4 +2171,41478528 +2172,744e037c +2173,b67460ba +2174,dd4c421c +2175,e10ed78f +2176,25520517 +2177,266df8b9 +2178,74e126e7 +2179,95359373 +2180,f567c216 +2181,7002d2b9 +2182,849ddf82 +2183,17ed011a +2184,594c1b2f +2185,5c7f8e1e +2186,5ba97ace +2187,4ce92a73 +2188,25f5dd59 +2189,f2d497df +2190,3f4e0b1b +2191,0b352567 +2192,6537f37d +2193,278aaf37 +2194,4f1c7cea +2195,ede6e1f0 +2196,7e6a8fb5 +2197,1963392a +2198,4b7a0a81 +2199,c48a5b47 +2200,40f607ac +2201,8bd1fd57 +2202,f86f562f +2203,6d0a26a3 +2204,ac634b57 +2205,8ecd02eb +2206,71a73f3e +2207,3313fd58 +2208,10a8079c +2209,613776c3 +2210,095b7ee8 +2211,e454b5c0 +2212,6b7373eb +2213,446ce812 +2214,20b4e345 +2215,f7953cb9 +2216,5059f202 +2217,1c7a8b7f +2218,3a9a6e99 +2219,99597a4c +2220,470912c0 +2221,6b0b3a7e +2222,9f6aa765 +2223,b90ff928 +2224,c570cce9 +2225,1ff49b2d +2226,356219c9 +2227,22e0518d +2228,47a5735b +2229,8e7a28ec +2230,f47bc225 +2231,f7c2b7cf +2232,f2a562e2 +2233,486464d1 +2234,e063340c +2235,5a130825 +2236,845b9208 +2237,c7fee4d8 +2238,116bc47a +2239,3dc0b935 +2240,c1dea1df +2241,b4e99991 +2242,96d2cdaa +2243,3b7ddc6b +2244,9a986d7e +2245,3fe9ef49 +2246,ddd918a0 +2247,f97ecfdb +2248,05b7674e +2249,80531213 +2250,42b89163 +2251,216b1af8 +2252,5c8e33b9 +2253,876fefaa +2254,48734a99 +2255,95e52c78 +2256,6dd44d03 +2257,26910f50 +2258,cf1b90aa +2259,83d6318e +2260,8241eb41 +2261,26c2be5d +2262,4164be2e +2263,4beefdec +2264,a2308fc9 +2265,fafc5064 +2266,40e96da6 +2267,72c77025 +2268,b1c18729 +2269,d0cc1841 +2270,c4b53ab9 +2271,a4364568 +2272,75c27179 +2273,40eba0ad +2274,0c6982ec +2275,5da07212 +2276,0f801355 +2277,e2c126b4 +2278,cfba5f26 +2279,42cdd1b3 +2280,c2b46674 +2281,cbb70da9 +2282,5bbe6c7c +2283,9d655f89 +2284,3f4d3b12 +2285,8ab6a2f3 +2286,cd8cbcd5 +2287,843da4c2 +2288,2fa21ba9 +2289,ed5d38b3 +2290,4808665c +2291,f77d70fb +2292,d31ee5a9 +2293,79d066ff +2294,07c3ff04 +2295,f2ce0975 +2296,06e911eb +2297,465aec0c +2298,3a8c00c4 +2299,e237806c +2300,c5d2323d +2301,fdddb7fc +2302,7cf671bd +2303,6ff3045b +2304,153ad2ab +2305,6818cdc9 +2306,cc34d7dc +2307,5f14968c +2308,56422938 +2309,496a7358 +2310,218fe7f1 +2311,2b05485e +2312,c803864e +2313,b62feb06 +2314,79d398ad +2315,c5abbe64 +2316,084cf742 +2317,059250a0 +2318,69a197e7 +2319,822431a0 +2320,5155ea53 +2321,e3fcd7a8 +2322,1440e5b0 +2323,44daf3bb +2324,fb4c041b +2325,cf712744 +2326,3d873975 +2327,be408cdc +2328,8ca3842a +2329,6a4c2a0b +2330,662ef057 +2331,979e6e68 +2332,8a30f513 +2333,de0cad8a +2334,03e08b8b +2335,f1084433 +2336,38db0455 +2337,ba2da45b +2338,e6b9fdae +2339,b0563079 +2340,479d5673 +2341,9309cb1f +2342,21cbfef7 +2343,ed069233 +2344,32a57b35 +2345,36549ee6 +2346,4caf0bd7 +2347,6796aa73 +2348,a42dd685 +2349,c96d71f5 +2350,762ab419 +2351,cccd3671 +2352,f379f1ca +2353,c12db7b0 +2354,7dfacaaf +2355,507fe11b +2356,e9845918 +2357,30094a09 +2358,fdf38cdf +2359,1045ba23 +2360,eac017a2 +2361,8919a9ab +2362,bb5cf597 +2363,dd30ee0b +2364,63166e10 +2365,f2ce4c84 +2366,831a5b5f +2367,56b2273f +2368,a34e82d1 +2369,74a07ea0 +2370,21835b69 +2371,0bc6fa48 +2372,f82b15f3 +2373,49546294 +2374,b9853331 +2375,203c1b27 +2376,fc5d9a8f +2377,44d13636 +2378,1e788330 +2379,9374b518 +2380,0d2de366 +2381,6db654b5 +2382,077b9fca +2383,52562072 +2384,366743e8 +2385,272088e3 +2386,c82dea94 +2387,2f34b015 +2388,7b333607 +2389,c4039500 +2390,f186fb59 +2391,e45f7cfa +2392,b28555f4 +2393,69e7b059 +2394,d509f386 +2395,87ee74ba +2396,39339b57 +2397,5d21a074 +2398,e7d911a0 +2399,940b1652 +2400,2ab03e20 +2401,b4bc8b12 +2402,daf971f3 +2403,838b4bf3 +2404,ee593b7c +2405,5a1f111d +2406,3b7cf60e +2407,0e3e6f5f +2408,cbb7bb03 +2409,4d7e18bf +2410,715d9da0 +2411,42551c20 +2412,97acf5c7 +2413,20e397e2 +2414,825aead7 +2415,c03ee3e1 +2416,fb1fa77a +2417,7f9cb17c +2418,8cf62640 +2419,2dab6eab +2420,1ceaf6f6 +2421,fa31e7cd +2422,9b0f557a +2423,4d47a96e +2424,091e611b +2425,1a5504a1 +2426,f084968a +2427,9a5ee4a5 +2428,88385c66 +2429,b6761383 +2430,3e3d15e8 +2431,4d93a9d1 +2432,ac15be7c +2433,97b5deda +2434,ddbede3e +2435,88fe23e7 +2436,6b7163ce +2437,cc9f1103 +2438,2387f046 +2439,b07d28e8 +2440,b3e5c555 +2441,781474f0 +2442,1f870762 +2443,a26665c1 +2444,3ed1b7b7 +2445,32fc6138 +2446,3959c24b +2447,be38b198 +2448,469de4dd +2449,64d89216 +2450,0641abfb +2451,f391b6c4 +2452,0c39b3de +2453,8bc9ad6a +2454,3002e7ec +2455,f73c9780 +2456,a281bdf4 +2457,b76c85ef +2458,6f16dd2a +2459,5c7bf811 +2460,4214b4c3 +2461,e3ce9f04 +2462,2750b7a8 +2463,dbe2292a +2464,de895db2 +2465,e6ea2a1e +2466,fe2c433e +2467,a36195ab +2468,82e37475 +2469,f323df78 +2470,b71b84ee +2471,0b78c29b +2472,50bd0f47 +2473,e6efe99a +2474,273ca625 +2475,bc901c72 +2476,bee2b365 +2477,6926a1a2 +2478,e7516640 +2479,fc2dd0ba +2480,0c04b0f0 +2481,fb3669e5 +2482,54f5c9b9 +2483,e77ffb44 +2484,1ab8a540 +2485,231e8bb3 +2486,239a2fb5 +2487,8f682fb0 +2488,710a249f +2489,5857d92e +2490,6cc5b4ef +2491,fff09016 +2492,e732211a +2493,d0112fb6 +2494,03e6936f +2495,f25a530d +2496,017d762c +2497,559a91e2 +2498,980cd9a1 +2499,668d29a8 +2500,42ab866a +2501,bae1e5f3 +2502,cda2ff3f +2503,20f50ab7 +2504,2adf231f +2505,9d993af0 +2506,ad14e881 +2507,a1a4995e +2508,516e9da7 +2509,3612f407 +2510,e91079ba +2511,56b39616 +2512,742894c8 +2513,6ec92339 +2514,96f2445f +2515,7f59ae4c +2516,bee2da1e +2517,43a2c3aa +2518,0465ad54 +2519,521924a4 +2520,51c80079 +2521,aa0a4afb +2522,52a31d18 +2523,d5ae5109 +2524,f7c19663 +2525,d38e9d8e +2526,9d7c27eb +2527,28121473 +2528,e4f75d35 +2529,4b66ba0c +2530,d93b1836 +2531,dc213f32 +2532,403e8da8 +2533,a2789e31 +2534,c578533b +2535,2bb31c63 +2536,180e7c47 +2537,793b4e61 +2538,9d69a353 +2539,720738ab +2540,d48cfee3 +2541,dd1700a3 +2542,32edf6a9 +2543,4de6d2dd +2544,1408c231 +2545,0382e28a +2546,a6e54622 +2547,b5580267 +2548,ac9b7744 +2549,7858fe45 +2550,14d9c72c +2551,fc2727da +2552,b340c1ba +2553,c7a3a8d3 +2554,912ffb79 +2555,1889f5f5 +2556,305556fa +2557,b7f6a4ac +2558,106aa41e +2559,7a9cfb81 +2560,3495a818 +2561,0eb2e400 +2562,37fd3c83 +2563,3ac82573 +2564,e7b639ce +2565,7dac635e +2566,faf28f25 +2567,4db73157 +2568,d98b5d86 +2569,0dbbada9 +2570,02f5640d +2571,696bba4a +2572,a8cb42dd +2573,7e14894b +2574,3e372aea +2575,afe8a085 +2576,1caa7178 +2577,bfee87e6 +2578,6bc13d1d +2579,e9b2ddd8 +2580,d4014972 +2581,050d637a +2582,a2f66d46 +2583,3b3dc1ba +2584,a4f8b252 +2585,9129bd39 +2586,1b47bec1 +2587,a0f4c103 +2588,fa2e5a86 +2589,2932ec54 +2590,93526a80 +2591,0b429308 +2592,b4ec2fe1 +2593,7a18fc76 +2594,e0922d09 +2595,63a506c3 +2596,5128c19c +2597,71d2f90b +2598,ee82c6ea +2599,905eaa1f +2600,0b0876b5 +2601,e3818071 +2602,89035391 +2603,c2a73873 +2604,0432f7dd +2605,9c6b19c9 +2606,2e99dc5e +2607,fdb1901b +2608,94746a90 +2609,15c5589e +2610,39a37f5f +2611,dac34265 +2612,18574e07 +2613,7b158b96 +2614,2f0562cf +2615,31a3cc22 +2616,a5c00f77 +2617,05877a78 +2618,f755e97d +2619,1d9e10b6 +2620,9baff810 +2621,6096453e +2622,e1c9e188 +2623,2b47ab44 +2624,fbda8592 +2625,3e15f859 +2626,fb746bbf +2627,abe3c786 +2628,cc2ca560 +2629,3a43800e +2630,bb297a17 +2631,83ebbfc1 +2632,ccfcd541 +2633,ce3512bb +2634,7ff77987 +2635,905b9da5 +2636,5ace78c0 +2637,0171791a +2638,f7eb2287 +2639,a3d0fc50 +2640,56fda7bb +2641,8164a004 +2642,8c23106b +2643,55696083 +2644,d594ed7b +2645,1d14df56 +2646,7bfa0de1 +2647,44e3de36 +2648,74cf2efe +2649,3ebd1e68 +2650,8165f77a +2651,5209e72c +2652,63000202 +2653,5b3fa38f +2654,489b6fb6 +2655,225f5134 +2656,18edc7bd +2657,25d8d9c4 +2658,ff904e32 +2659,903fc22a +2660,767efccd +2661,fb2cc208 +2662,8ec41b7b +2663,895856dd +2664,6183f6bf +2665,8aae3109 +2666,c60243ab +2667,f46b83bc +2668,5005b2f8 +2669,55d96247 +2670,efa477a9 +2671,dfde6150 +2672,d6525cdc +2673,23e51584 +2674,fa6c8f9f +2675,9eef959f +2676,5ba4376f +2677,1a22177a +2678,f0542134 +2679,b555c5c6 +2680,e2ad66bf +2681,6f6b11ef +2682,d2beb699 +2683,36f58795 +2684,3a4023ef +2685,ec633403 +2686,bcb0c4e2 +2687,9a601f36 +2688,a803bf0a +2689,dda60e5f +2690,a1661db7 +2691,f8405865 +2692,6c3b68be +2693,4b45d664 +2694,6d6d1505 +2695,27c3024b +2696,19f14c65 +2697,65e56dad +2698,f022e5db +2699,2b2c5a4e +2700,9cc8e0ac +2701,f4b23963 +2702,d94972b9 +2703,9aee9e84 +2704,7f214392 +2705,334edb68 +2706,d5a6bfc4 +2707,2cbf5ddd +2708,85a9bd18 +2709,a293aa32 +2710,877a45a7 +2711,fad190b1 +2712,13c97ccf +2713,a5aabcdc +2714,7b4c8a70 +2715,966be2c8 +2716,f62e97fd +2717,65e93d6e +2718,f724f9cc +2719,82f93dd7 +2720,bda0beaa +2721,71613ea2 +2722,15b27104 +2723,f78fbf2f +2724,7e9d54ae +2725,b70ec1ab +2726,4499b540 +2727,ee7ff81b +2728,d9dd2761 +2729,7968acbb +2730,1af4c7f2 +2731,0b1a5a2a +2732,3997521a +2733,fbfe9a92 +2734,86168055 +2735,74bc3ef5 +2736,09a55e85 +2737,2a1cbac2 +2738,ed082e5f +2739,2857825b +2740,028bfe47 +2741,b2896e58 +2742,ee121f27 +2743,6b3d454b +2744,45ed21d9 +2745,8540013e +2746,c63f2691 +2747,658e6567 +2748,04bc91cb +2749,c2ec97c4 +2750,14d82738 +2751,0fb15cdd +2752,a8deeef4 +2753,99b524a9 +2754,349e2124 +2755,8185e41c +2756,866eb17b +2757,3438b912 +2758,d806c246 +2759,8fd2a5cf +2760,a6fa76ff +2761,eebf7a94 +2762,92cee1b7 +2763,2734bce3 +2764,aec56113 +2765,b711c333 +2766,980eb6b2 +2767,9f3f32e6 +2768,9d6aec98 +2769,01269a30 +2770,1bfa8d13 +2771,5906dac7 +2772,0cbd52bf +2773,3700ed5b +2774,0e3c3ec8 +2775,3ab74a74 +2776,6db25284 +2777,c44b358a +2778,0ab4257c +2779,4590b714 +2780,fc764813 +2781,2417ccd2 +2782,5b8b55dc +2783,0d13f869 +2784,5e03cc5a +2785,2b60f21e +2786,985f84e3 +2787,946c23ba +2788,ed429c8d +2789,67a382e6 +2790,c643cbb9 +2791,65ebaafb +2792,acb56d54 +2793,295933eb +2794,db69ae2a +2795,d17caa92 +2796,e6765da2 +2797,9df53f61 +2798,2181466c +2799,fb2a1067 +2800,686f0cc1 +2801,3702f424 +2802,83658dfa +2803,a933af21 +2804,df8b2121 +2805,c7f8740f +2806,5b23ab84 +2807,6a8b57ec +2808,14aed66f +2809,312b3f28 +2810,3159ac67 +2811,056a1a19 +2812,2b52d5a1 +2813,be4aa665 +2814,0d5bf27d +2815,05194dc2 +2816,7f7806a6 +2817,47e4e44e +2818,ff6c2e63 +2819,1caa7d57 +2820,6cae50a3 +2821,75afad0a +2822,76be4f33 +2823,82ea2608 +2824,d4ac2213 +2825,434ace1d +2826,99d9e87f +2827,23751a93 +2828,d3f3a958 +2829,c680c7bb +2830,c55296ad +2831,7f9a0b27 +2832,517ca160 +2833,68a3d292 +2834,01d11cae +2835,368b10c7 +2836,d60955cc +2837,ab51b442 +2838,5a1b2fa7 +2839,4e88d093 +2840,d8601006 +2841,88b19996 +2842,4b32c98d +2843,7407022e +2844,3365b483 +2845,a25bcd48 +2846,c87a7fdf +2847,3840820b +2848,e1402de3 +2849,485c581e +2850,e5d468b6 +2851,1e042416 +2852,35793022 +2853,45490032 +2854,fc42f6e1 +2855,e523a120 +2856,7073d0eb +2857,07f8ce8d +2858,f2f341dd +2859,c1e65af3 +2860,92842229 +2861,dd38acf7 +2862,b05d7c65 +2863,2981dda2 +2864,055fb4a8 +2865,03335ac5 +2866,a3a34b2f +2867,446354ee +2868,42a14f7c +2869,4a38c2b9 +2870,4de38e2a +2871,263976ee +2872,2682443b +2873,062be978 +2874,4791e490 +2875,8c64d6af +2876,2cce4f21 +2877,6e321936 +2878,d0b06b35 +2879,d5857fc8 +2880,148f3092 +2881,893929a9 +2882,c2821051 +2883,24c7ee28 +2884,b7712ffd +2885,8a88ab0d +2886,caf53b8c +2887,225243d8 +2888,8429c6cb +2889,0723b9b8 +2890,664e1ca4 +2891,ebd883dc +2892,b66e0234 +2893,67bb8160 +2894,58baef62 +2895,25b82a04 +2896,b6e9ffaf +2897,0b9da628 +2898,ed654a3a +2899,b2f22588 +2900,56c549c6 +2901,4ad4af5a +2902,7013ad6a +2903,ff12cc1d +2904,d58c1fd8 +2905,610f78d3 +2906,159b5e3d +2907,eaabc04b +2908,ca681392 +2909,876d418f +2910,8dff5c7a +2911,e580c5c6 +2912,35a57695 +2913,21b221b2 +2914,aedd753d +2915,13a880d0 +2916,a0e8cf19 +2917,1a1438c8 +2918,d83bcbff +2919,b816d9a4 +2920,dd531d68 +2921,c97cd27f +2922,1b1650a6 +2923,5263e072 +2924,96360ef6 +2925,e6844b0c +2926,e2e30fc0 +2927,cc0c9202 +2928,e1c837c7 +2929,f5fe3035 +2930,7265d933 +2931,e720e368 +2932,11f9c72b +2933,f19ad855 +2934,5fe8b4d5 +2935,43c8a5d5 +2936,d3379246 +2937,d097c6a0 +2938,2b961096 +2939,095ab1fe +2940,efae3b45 +2941,339bb20e +2942,d7a457ae +2943,6490a94b +2944,35317f4a +2945,5aaf6db1 +2946,38aa17b0 +2947,90fcfab3 +2948,c946114e +2949,89d371ec +2950,3bdeb332 +2951,c8a3987c +2952,bee2127f +2953,5735fa6c +2954,0ef29a9c +2955,776bd346 +2956,884b141c +2957,0fe13a3a +2958,0ee46cba +2959,12221815 +2960,78a74881 +2961,fe5b9651 +2962,4001455d +2963,4a7adc84 +2964,e8029e87 +2965,fbdfdf1b +2966,67f27102 +2967,fc2eef71 +2968,db8a1707 +2969,706c2fbc +2970,1b89d5d3 +2971,29a4d2aa +2972,75ad4a1f +2973,554cd770 +2974,1e81e48f +2975,4f8f426a +2976,1900dc83 +2977,22824ee5 +2978,b9311184 +2979,4e570209 +2980,9d8414e5 +2981,f49fd699 +2982,7dde6501 +2983,3603a784 +2984,ece1a3db +2985,3a113f6c +2986,63ef0120 +2987,cd6910de +2988,f3a94cff +2989,b5533783 +2990,5acd5ff0 +2991,54399a3c +2992,7469ddbf +2993,788bdb96 +2994,df7c12bd +2995,7d8f35f3 +2996,1fab8111 +2997,34c9e15c +2998,15b7090f +2999,763a048c +3000,d414f3a3 +3001,42454b25 +3002,e8e6e12d +3003,2794435f +3004,d17d9cc1 +3005,4a1b0f42 +3006,9b3313d8 +3007,dbf0bccb +3008,1e7a7603 +3009,b789e26e +3010,6409574e +3011,e1b56a26 +3012,84f5da45 +3013,632d7656 +3014,ea075251 +3015,029b6de5 +3016,cdaac894 +3017,fc8e07d0 +3018,eb381a16 +3019,b15aa2e7 +3020,80f60335 +3021,1f2306ee +3022,0df8c9d5 +3023,700b6928 +3024,03ab270a +3025,d5a6cc1c +3026,ff42f7e6 +3027,e0d2c49b +3028,8b00b1ab +3029,01e00d87 +3030,6dcd47d0 +3031,37cbd669 +3032,4d667190 +3033,c4b2be2d +3034,3b15db4c +3035,a07654e5 +3036,e9a54b4f +3037,9341e9b2 +3038,f645517f +3039,48215e17 +3040,1509dc14 +3041,0abd2c93 +3042,c1f23ea8 +3043,fa01e0be +3044,dea71c10 +3045,f2a93b9b +3046,93342dfe +3047,a745ff39 +3048,27600fdf +3049,6704bffe +3050,e7c108a6 +3051,ffaaa7f2 +3052,69edc6e4 +3053,bc5b5e98 +3054,6f746456 +3055,622f506c +3056,03fb29f6 +3057,bfe4fc6b +3058,09e20982 +3059,83e13172 +3060,e4abbc2f +3061,1baceb21 +3062,895478bb +3063,dd64ab18 +3064,af2e04a6 +3065,0094d24e +3066,cd7cd1b7 +3067,c22ee2f8 +3068,d5106245 +3069,cb282caa +3070,faa3a12f +3071,61cb3e49 +3072,752afbb3 +3073,47e47c5d +3074,74935ad5 +3075,26b72614 +3076,dc38f2c2 +3077,60a0eafb +3078,7af864df +3079,5590c186 +3080,568a8b6d +3081,175f9d0b +3082,bde04a5e +3083,e5034ee5 +3084,c42db04d +3085,111a0d92 +3086,eb38714e +3087,86ae6175 +3088,6b41b2c9 +3089,36cdee9c +3090,49561a90 +3091,88f835ae +3092,496754d9 +3093,e92f9905 +3094,8e473574 +3095,0bd322a7 +3096,d3ea4d32 +3097,e90f4065 +3098,48c67086 +3099,105c44bb +3100,efbd6285 +3101,c7ff6845 +3102,d9fa8160 +3103,91ec644f +3104,aa5d0d9a +3105,0d6f5059 +3106,10dac571 +3107,eba2120d +3108,161f5ad6 +3109,704d0d5b +3110,8f73fe55 +3111,f01ea3aa +3112,dee09c12 +3113,960f5ee8 +3114,87079079 +3115,93719156 +3116,219febd5 +3117,2f50db00 +3118,c8c3d642 +3119,d73c529f +3120,d7ad9ba1 +3121,231a9cbb +3122,ce600a25 +3123,1c474fc7 +3124,da0f1dcf +3125,c6775507 +3126,14314ab7 +3127,cb169c9c +3128,0b6af129 +3129,98c541a2 +3130,00e52b50 +3131,58095779 +3132,4195533a +3133,40329ab7 +3134,ee65ef86 +3135,dca30adc +3136,14269e8d +3137,48e1500d +3138,fc9bc03f +3139,42d8d39b +3140,ae0ccb2f +3141,c7a641fb +3142,bffb2c97 +3143,fcb68234 +3144,d29afa77 +3145,3aba9ea5 +3146,7412970e +3147,a655f1bb +3148,784fe30d +3149,0c3be5d8 +3150,7eedf6bf +3151,576e7a66 +3152,cf43a528 +3153,79ba8afa +3154,bfd7a273 +3155,40209e33 +3156,95244732 +3157,7343fdd6 +3158,8ae7d6af +3159,28b368fd +3160,0669583d +3161,7ebeab87 +3162,a33fba07 +3163,845aa2f7 +3164,3cfca74e +3165,b35c51ac +3166,f1537191 +3167,986a8c49 +3168,a704d4ec +3169,febe0fdd +3170,bb50bfa8 +3171,e05d520f +3172,26c07dab +3173,2d21aecc +3174,21ea16c9 +3175,c2f91047 +3176,ddc7e46f +3177,01818502 +3178,a9bdc088 +3179,f08efad8 +3180,23317577 +3181,c0ee9ef6 +3182,7299d672 +3183,108dc4fc +3184,627a24c3 +3185,f598c726 +3186,14d5011c +3187,715de21e +3188,3b646658 +3189,a83e861a +3190,6ecd7efe +3191,bbcd0697 +3192,0290a18a +3193,2c368c5f +3194,739f33d9 +3195,8b828ae6 +3196,0c476103 +3197,2be65081 +3198,0800767c +3199,d8d694d4 +3200,0e1a8744 +3201,73e53d61 +3202,cb41b8c6 +3203,d57277ac +3204,256fd29d +3205,6c0bb2e5 +3206,9b576d87 +3207,d1a4522d +3208,1968a2a2 +3209,de67dd1e +3210,682dd913 +3211,ee81abaa +3212,095e559f +3213,48e45e28 +3214,b7b70df4 +3215,f554cb67 +3216,b3dfb6da +3217,79c40ed0 +3218,8f08b4d0 +3219,4e347314 +3220,583d6510 +3221,b95943fd +3222,d10eaf27 +3223,5129f521 +3224,51889fc8 +3225,76d4d27a +3226,0de5e15c +3227,6facbfb3 +3228,e4f827ab +3229,cdae2c09 +3230,aac03d36 +3231,76807397 +3232,63b8c624 +3233,2df498fe +3234,3fd33c22 +3235,496cbb43 +3236,b3efccdc +3237,7df3e453 +3238,a0399e30 +3239,88e4ac8b +3240,179ff083 +3241,39952db0 +3242,56ea032d +3243,6a3690ec +3244,5e0c97b0 +3245,4a492ec5 +3246,2e4f975d +3247,6dd4eb68 +3248,408e172c +3249,040aeaa9 +3250,013132d1 +3251,a0806d1e +3252,3fb60b06 +3253,a516afa4 +3254,50c9d608 +3255,750bf1fb +3256,b070ff33 +3257,64a2b313 +3258,4f4a6248 +3259,c6dcda81 +3260,ebb84a96 +3261,1597307d +3262,2ebe4a39 +3263,9b1ea13d +3264,4f76e90f +3265,17e84630 +3266,61b1a05c +3267,66a89ceb +3268,fd81f902 +3269,f4e22174 +3270,ebad2291 +3271,df5f5b1c +3272,b6be3be7 +3273,d0e312d1 +3274,07f74cdc +3275,116e3262 +3276,21e10c51 +3277,f63a4643 +3278,4771eda9 +3279,6e56512b +3280,41f27d5f +3281,810eba1d +3282,1d4bf448 +3283,7715e83b +3284,75edb0c2 +3285,23a4ad26 +3286,47aad19d +3287,c8be0855 +3288,8fbc2356 +3289,827bb14c +3290,9b64f909 +3291,bd1677fc +3292,161475b7 +3293,a02cd377 +3294,9b90e47a +3295,8a3d1252 +3296,4bf07d85 +3297,acd65ee8 +3298,e9c70946 +3299,6c3671d5 +3300,f1d5770e +3301,a648c517 +3302,8e9d9f6c +3303,3e87b803 +3304,cb802e02 +3305,5344acdb +3306,dc02f208 +3307,e22139e3 +3308,0557aa53 +3309,867f9f9d +3310,b43771be +3311,8bb79d7b +3312,696a4fee +3313,bd042c52 +3314,228ff71d +3315,8f23be98 +3316,700f28d7 +3317,612b53d5 +3318,a50e50f6 +3319,63502465 +3320,ee17ac2c +3321,ada37154 +3322,586ed464 +3323,9c5ab59b +3324,384aa933 +3325,1c40eb1d +3326,1bf68711 +3327,9fca3868 +3328,ff14f28e +3329,ffafa0f3 +3330,d3dc7b09 +3331,c98acfd9 +3332,525e21a5 +3333,4ae07ad1 +3334,ff0c2eae +3335,07f1095a +3336,06f8d8e6 +3337,88378047 +3338,30069669 +3339,669c93b6 +3340,85b6aceb +3341,a72a0d97 +3342,9fe481f3 +3343,08e45372 +3344,0aff218a +3345,03727974 +3346,edd97fda +3347,9153ebbb +3348,f5c24a7c +3349,0e53bbb1 +3350,6fa3b05a +3351,24a8e33c +3352,e68fd9c6 +3353,a12b854a +3354,3b2c3ddf +3355,1bb1ac04 +3356,522bd1db +3357,9035a938 +3358,35d20fbd +3359,e2528c4d +3360,218af416 +3361,afd27385 +3362,b754bebc +3363,14d05228 +3364,e0246e01 +3365,a33eef90 +3366,4ae401da +3367,fa1e4f18 +3368,2ddfc9c4 +3369,8e045c08 +3370,9f4d39be +3371,84ded7c2 +3372,3629c355 +3373,71a8790e +3374,0e350265 +3375,ba40c509 +3376,268d0e69 +3377,ef0b3ace +3378,2eeb2628 +3379,eac76ece +3380,c74c01f9 +3381,0e5f0717 +3382,d4f696b4 +3383,461b1ecf +3384,34dcd8dc +3385,23023152 +3386,8407cd3f +3387,ffb16e20 +3388,aefe4cf2 +3389,fb2286a0 +3390,038e0049 +3391,bed6bfb3 +3392,30e36298 +3393,e0f59845 +3394,2e799cbd +3395,fcbf4831 +3396,fad732e6 +3397,62353ab3 +3398,63e8c158 +3399,4bd382be +3400,c3eaf6a2 +3401,d098a821 +3402,a54571e5 +3403,15157939 +3404,b8880867 +3405,a31ceb4a +3406,5e16abbb +3407,415221cb +3408,7c8ccfcd +3409,7eea0a0b +3410,c0b7e0ba +3411,c1ca3582 +3412,309751d3 +3413,caeeebe9 +3414,4261b6e9 +3415,526c9b82 +3416,62214808 +3417,f26887d8 +3418,983127dc +3419,26b22913 +3420,2228cb3c +3421,643f6438 +3422,3b6b7d57 +3423,2bdbeb1e +3424,8ce1bcbc +3425,aeaf18a2 +3426,1cc44191 +3427,bf53ccc5 +3428,839f4de6 +3429,59457429 +3430,21c8a2be +3431,81d400dd +3432,9030de49 +3433,1cb8ffc0 +3434,44dfdced +3435,ed6388ac +3436,3f9e2816 +3437,e986c962 +3438,23cc79ba +3439,105cdd8a +3440,075683a0 +3441,8676ef28 +3442,231299f4 +3443,d476ea4d +3444,904b4d4d +3445,4525fe62 +3446,dcae7829 +3447,c7d70d20 +3448,d2ed6701 +3449,f2301e71 +3450,ec2b7f00 +3451,ec852246 +3452,6e5c2068 +3453,f4d4c816 +3454,af0e3939 +3455,a9832e5c +3456,cacb579f +3457,06eb9da7 +3458,2cdf7b94 +3459,790d4603 +3460,81eba329 +3461,ecaf0a28 +3462,09422276 +3463,b21ac61e +3464,53b11c36 +3465,d1ff3b22 +3466,08f26833 +3467,dd1fe350 +3468,6eaced2c +3469,fecd46db +3470,f083252e +3471,6b113db6 +3472,a0f0f52c +3473,d199b645 +3474,2111ed95 +3475,ae72299a +3476,e2e08db2 +3477,f2b6d31a +3478,22eca8a0 +3479,c0e11d6b +3480,260673e6 +3481,36c72e2c +3482,70d219b6 +3483,7f6be4a7 +3484,aef91293 +3485,ed937204 +3486,bccedf83 +3487,1f2703a2 +3488,57f03c2b +3489,12309191 +3490,5a065310 +3491,ce3634ab +3492,bd882f62 +3493,e190685b +3494,00a7e67c +3495,9a60e2cd +3496,b8b820d3 +3497,76d2f8f5 +3498,421887e9 +3499,50c06264 +3500,50656a2c +3501,5abedd38 +3502,7a4ab0d2 +3503,791ea0e8 +3504,e5b897a5 +3505,a81fea36 +3506,48a68f72 +3507,063e9b6b +3508,e62bfdbd +3509,cb9b87b1 +3510,d0da6427 +3511,93c2dc06 +3512,1c88f616 +3513,b0c35cb7 +3514,f40b87a7 +3515,8f3b88fe +3516,b26047d0 +3517,107990d0 +3518,0399ddad +3519,afe7d435 +3520,d704c8f8 +3521,4dd8e9fb +3522,337ad098 +3523,66d246c8 +3524,095d8769 +3525,bb008ed1 +3526,f3a4adad +3527,e752e489 +3528,489274df +3529,68153a73 +3530,e976e0d8 +3531,a611c565 +3532,f023e72c +3533,4dba38ed +3534,85735d6a +3535,90a59d71 +3536,3e095b46 +3537,2fa1b49b +3538,3e91b2cd +3539,2ce3e167 +3540,dc3f549c +3541,6c8bfb25 +3542,7948fe10 +3543,8369cf8e +3544,7e309a12 +3545,3247c65a +3546,01201154 +3547,d3eb669b +3548,3ccc4627 +3549,6aba888c +3550,7776ca85 +3551,d1f1d2e1 +3552,7e5c3d00 +3553,a9186963 +3554,befdcd27 +3555,bef4f999 +3556,365694ca +3557,bf6d1dd1 +3558,d51f7356 +3559,36b3c929 +3560,a023c9ea +3561,8cb57f34 +3562,75a2a319 +3563,8558fdf0 +3564,a2375cba +3565,dc985a96 +3566,c6e3ce63 +3567,7e90b9e2 +3568,5f66a910 +3569,02d05cb0 +3570,728a9090 +3571,72bf6a39 +3572,14b6c6bc +3573,a17253a7 +3574,b6e78f22 +3575,4f29ca33 +3576,9f705bbe +3577,ad8c06db +3578,36c9d920 +3579,f5d4c1c2 +3580,596dd7a9 +3581,3ab2be77 +3582,bf11fefb +3583,9df7b84e +3584,c18be106 +3585,4057562b +3586,c7522b9e +3587,69bed74f +3588,3f41632e +3589,d7b3e2c8 +3590,e6412ba6 +3591,309eba99 +3592,ed578c53 +3593,51d1f27c +3594,dfbbf6ba +3595,89c48d44 +3596,50a99f58 +3597,ff2e1c76 +3598,633e27d2 +3599,1d77a836 +3600,92792146 +3601,a7e673b9 +3602,7b2f59ab +3603,e278e9e4 +3604,5b2d71c9 +3605,2d5a3f08 +3606,daca2e0f +3607,f27aa3b3 +3608,81c953dd +3609,f0848e8f +3610,6e8366dd +3611,dc0ae886 +3612,1335737d +3613,e60b7406 +3614,9dbaf3ad +3615,7f7d0010 +3616,272e9616 +3617,0ba96ce7 +3618,d6e464a0 +3619,98a51205 +3620,2ecc3a03 +3621,2eafcc4e +3622,1fb74b2a +3623,b11969ca +3624,9c2459d9 +3625,906bf314 +3626,db997007 +3627,8e474556 +3628,7410a308 +3629,257ff1fe +3630,50aeb6b2 +3631,465fcaf5 +3632,1f8a0b0a +3633,6d599979 +3634,e33157ff +3635,9e7548c8 +3636,d62b904e +3637,8d7cd627 +3638,9662ac2d +3639,b4e939a4 +3640,840c6433 +3641,5102260b +3642,6edc48ca +3643,4ff366f9 +3644,2ee8e867 +3645,2dd6d9a6 +3646,79f9a1a2 +3647,19124051 +3648,f4457c34 +3649,b3479e30 +3650,25cb44ce +3651,247604bd +3652,7d441db7 +3653,b17d2df7 +3654,64bd2ebb +3655,35013941 +3656,4b341490 +3657,5b93395b +3658,d2523e9c +3659,0b1980dc +3660,b109fd56 +3661,a64848b4 +3662,64888401 +3663,f5c1522c +3664,0c198e44 +3665,58be7823 +3666,c03da411 +3667,fdd4661b +3668,5f22ecb0 +3669,e7ac5e98 +3670,09f3c669 +3671,878b6885 +3672,e609b9b1 +3673,ca9ce922 +3674,513cc5fd +3675,49c340bd +3676,a98aa9b1 +3677,626e3e96 +3678,592d9ab4 +3679,782d9446 +3680,db0f2e00 +3681,1f34412a +3682,35823cb7 +3683,00faac1f +3684,78fa9304 +3685,406b1d21 +3686,cdb60ceb +3687,f6c905ea +3688,833e182a +3689,2ba69f2a +3690,811623d3 +3691,e1567e32 +3692,79b2c58d +3693,19328d9d +3694,fa4c98be +3695,2398f44e +3696,2b0db6c6 +3697,bff15bf4 +3698,b8c42e88 +3699,cd065b70 +3700,86bb8aca +3701,b492b822 +3702,2c2a29b6 +3703,44db500f +3704,21ac0d21 +3705,7d01e7e6 +3706,fe7e0d35 +3707,d225c1fc +3708,a7028b54 +3709,0258559b +3710,f33f9e53 +3711,a9f4eddb +3712,a025b94f +3713,729dd6f1 +3714,3bd14652 +3715,4aa61eaa +3716,2f69775f +3717,b6417ae5 +3718,6ca1c63c +3719,8f7b004e +3720,4ab31916 +3721,c3e258b5 +3722,25308c4f +3723,8d451572 +3724,3660ccb3 +3725,885ec88b +3726,c3bc9e1e +3727,fea651f9 +3728,ce97ca4a +3729,68a2ff31 +3730,85d13d78 +3731,1f6e48a9 +3732,76e81a97 +3733,d0809215 +3734,8e32845a +3735,90878d13 +3736,d73c5fed +3737,bfc89ea8 +3738,2f590c38 +3739,aafeb4b3 +3740,a45e942e +3741,11eee8c3 +3742,904b2724 +3743,bd3892ae +3744,d428df24 +3745,4e5ec4fc +3746,33b7bdc4 +3747,42681329 +3748,4ecd8170 +3749,440ab9d0 +3750,b3176dba +3751,33d96b43 +3752,2880cce8 +3753,d3921e38 +3754,6bf718fc +3755,54c28e16 +3756,7f575e33 +3757,23816040 +3758,7618e230 +3759,609b8baa +3760,1b57dfef +3761,41f73aeb +3762,2d0ecd69 +3763,fd0cd526 +3764,35bb2ced +3765,372869ce +3766,d1501edd +3767,f2d9a880 +3768,628fc934 +3769,c854d742 +3770,90ebd72e +3771,fd767f9e +3772,eeebf7fc +3773,0bef7740 +3774,4dd9f9c6 +3775,b346a62c +3776,46f0c543 +3777,6262c145 +3778,20ee2404 +3779,ddf4b8f8 +3780,4fe7a18b +3781,52c51281 +3782,7e5a9bd8 +3783,f3351685 +3784,afc3db35 +3785,d6d86d4d +3786,fb8682f6 +3787,9c3e8078 +3788,2d59ce71 +3789,80540f70 +3790,28d7d664 +3791,e42cde9f +3792,39abe439 +3793,2378a34c +3794,7fa55615 +3795,a7c625e6 +3796,2ce17cc1 +3797,c86bc14a +3798,d8e963b9 +3799,f491a07e +3800,dbd9de41 +3801,e2d79db1 +3802,91144577 +3803,9de1cdc3 +3804,bbbffe25 +3805,56b53d9c +3806,c1beb429 +3807,2507b7ce +3808,c24f758e +3809,fc34f8dd +3810,3a4253fa +3811,6a848021 +3812,f1a0c959 +3813,cce76453 +3814,dbef40fa +3815,00fee1a5 +3816,f9c9473f +3817,f408ed44 +3818,450934f7 +3819,3475ba93 +3820,0f60a8dd +3821,77b8f4bd +3822,c6e40688 +3823,93bd54d7 +3824,4fa4f610 +3825,abc76de7 +3826,2988b0e5 +3827,884f762d +3828,57f91cd4 +3829,7f1b082d +3830,d102bb54 +3831,f1acbf8e +3832,a2ac7b95 +3833,afc4ce44 +3834,b126049f +3835,ef6b1f3b +3836,aac8673a +3837,457b9d7c +3838,c5efe506 +3839,9ea161ea +3840,081acfcc +3841,12629464 +3842,2d763cae +3843,2a176f48 +3844,44364be4 +3845,1c29003b +3846,8d13fb0d +3847,a92a3ea1 +3848,1760a719 +3849,7a5da507 +3850,0fcd8f44 +3851,2c50cd30 +3852,c386ec01 +3853,629c6c86 +3854,6b532a91 +3855,76d3fbbb +3856,c58c631a +3857,bde36f27 +3858,9ee74ae9 +3859,db596676 +3860,b9ca2cdc +3861,add1de70 +3862,f793c387 +3863,0200b3ed +3864,99fed5d3 +3865,d843ae4a +3866,e11a9ab7 +3867,29900e0e +3868,c3b9c4a5 +3869,ff1e11c4 +3870,35d7481f +3871,f67e301e +3872,a67563df +3873,da35c8c0 +3874,f684f68b +3875,7e3487c7 +3876,1dddb202 +3877,adc27c5b +3878,8115a112 +3879,18682969 +3880,bbc41089 +3881,afe97fe8 +3882,51fd4319 +3883,4b5364d6 +3884,81e0e24c +3885,824889ce +3886,c732c739 +3887,ffd8a385 +3888,f06f763c +3889,9f26812e +3890,21c8cd8c +3891,94a8d216 +3892,c40bf383 +3893,45bf2cb9 +3894,c797b7fc +3895,b14cdef2 +3896,fc3c6f07 +3897,0f10718e +3898,83f84f1e +3899,74d2054a +3900,280c34d7 +3901,a5980063 +3902,d414c2e3 +3903,b3f209a9 +3904,a70cccb1 +3905,4990da73 +3906,ef6eb600 +3907,19608f63 +3908,c0c8f4f9 +3909,ff908b0b +3910,24dccc65 +3911,e6fae2d7 +3912,7bb107f0 +3913,2ccb2685 +3914,a3a9eedf +3915,f7992f0d +3916,8c323811 +3917,643f0e43 +3918,aec1f0a1 +3919,c2da24dc +3920,027c02e0 +3921,bf5b7276 +3922,da582eba +3923,0478a079 +3924,1d4b93ee +3925,41e3c594 +3926,ccb3a49b +3927,8ba8d75b +3928,3d0bd20a +3929,847671cc +3930,3275b0e7 +3931,ebe209bc +3932,37137859 +3933,ab6d725c +3934,06197045 +3935,16f03189 +3936,9451fd71 +3937,510df556 +3938,ac192b38 +3939,96cf5d97 +3940,5429541f +3941,4ccaa6e6 +3942,216df4e0 +3943,059c5b99 +3944,987fa868 +3945,09b405a0 +3946,78635ca6 +3947,65f23f12 +3948,6ff8bea6 +3949,8fea2d73 +3950,7bc7bb0d +3951,83217042 +3952,9ea1de92 +3953,baaa7547 +3954,1303db53 +3955,8bba1013 +3956,bcb280b5 +3957,22cb14f2 +3958,589a8869 +3959,67da8b23 +3960,a0038115 +3961,61fb5639 +3962,bf5b418d +3963,4b4a050a +3964,e1b17aba +3965,d4aa41aa +3966,7944b3bc +3967,2216516e +3968,c04d85f0 +3969,96fc3fa0 +3970,6633fd8d +3971,aa8862f9 +3972,034970c8 +3973,9871e60e +3974,d2b7a973 +3975,c3f419fe +3976,4fd44296 +3977,5214bdac +3978,18f19821 +3979,4fde19a2 +3980,5c0a11f2 +3981,38c8b3b6 +3982,b0c6ec3b +3983,2ba553ac +3984,cd7e521f +3985,628bf931 +3986,a8c92f46 +3987,e3ed7154 +3988,85fc6c32 +3989,c71eae81 +3990,38bf99ee +3991,20c68d44 +3992,348e2a59 +3993,9ca9fafb +3994,5c2ef998 +3995,6e20cedd +3996,b1836497 +3997,e44f6efa +3998,e95d3916 +3999,6f6fbcb8 +4000,3cec1864 +4001,56cf2432 +4002,276de3fc +4003,94b788d9 +4004,45ba1696 +4005,955ce046 +4006,12396edd +4007,efdb9a34 +4008,61dc019f +4009,ed038955 +4010,d1466ce1 +4011,74fbce25 +4012,85d45b4c +4013,e507ec58 +4014,fa1996e7 +4015,3dca9154 +4016,abe14b30 +4017,b7f8b280 +4018,d2930168 +4019,239ef539 +4020,1fafafed +4021,f642f1ab +4022,22eee23b +4023,a4e7179e +4024,7ae03078 +4025,fca99a60 +4026,c431fefa +4027,977b40e1 +4028,61389a5f +4029,e7c3b567 +4030,8b2317e8 +4031,71c026a8 +4032,82575d12 +4033,dc7c69f7 +4034,aa5481f2 +4035,fdfa8bbc +4036,19eb3fb2 +4037,3ee7f6a3 +4038,8aa00e18 +4039,9701965e +4040,3badf50e +4041,2bdab9d3 +4042,3fff8505 +4043,f67bfb0f +4044,b1946397 +4045,d19af82a +4046,3c921ddb +4047,a69b983c +4048,b99c8b98 +4049,3ee44a10 +4050,fd0eb417 +4051,5d4980f1 +4052,2f652c5d +4053,5e672a47 +4054,fd065238 +4055,a3dfdec1 +4056,787728b4 +4057,784cae06 +4058,3b187644 +4059,1e74f224 +4060,b9253940 +4061,89817a8c +4062,05ade2a1 +4063,6c7a3bda +4064,d3b36644 +4065,b1312318 +4066,a2f0cc8d +4067,aaee30ed +4068,a83a5de7 +4069,74c0c9cf +4070,64acf076 +4071,971c084a +4072,6b85d08f +4073,045daaf1 +4074,5236daa9 +4075,201c3b4b +4076,2dfd70f1 +4077,d0cc77d1 +4078,78025b9a +4079,99d0086b +4080,ad257959 +4081,6e8651bf +4082,c5f2033b +4083,98b28863 +4084,b9a83bbb +4085,45a30c95 +4086,22b7ab1b +4087,42d8cacd +4088,c03cec31 +4089,772faa23 +4090,10dbdec9 +4091,ee3376ad +4092,ac9d05df +4093,eceb3069 +4094,6cfcfdc1 +4095,57f5f6a4 +4096,f45a4e21 +4097,3081a765 +4098,b76899c1 +4099,39b6cb60 +4100,f74fe9bb +4101,35a9a44a +4102,185154d4 +4103,baadc4b7 +4104,8faa88d9 +4105,2f907da4 +4106,c302af54 +4107,60bbd834 +4108,8b1c6518 +4109,cc15ae68 +4110,b16b2f8d +4111,68a4d4a4 +4112,20dd510a +4113,4a624765 +4114,469b70a2 +4115,07e10e9a +4116,887f1a04 +4117,246eda11 +4118,58c46581 +4119,e1c34c79 +4120,f481e793 +4121,2a6c05b7 +4122,cb613203 +4123,c6816fd9 +4124,8f3f7064 +4125,cc7e7d35 +4126,7698dddf +4127,88e94b28 +4128,2c43069d +4129,1281f0a4 +4130,5888d04a +4131,48c85772 +4132,77e4df57 +4133,b1ee9c6f +4134,e0794446 +4135,6df0598d +4136,a1833bef +4137,23311f10 +4138,5e0b171a +4139,3bffabbd +4140,fe0dd972 +4141,eba25700 +4142,b7d2f78d +4143,38acedc2 +4144,74798b03 +4145,5a9d349c +4146,425e0c4f +4147,b91b2a28 +4148,8b85e338 +4149,17a829bb +4150,0d885664 +4151,69b0068d +4152,6b0f80ec +4153,a370e849 +4154,0049e1f4 +4155,539fa924 +4156,273203f2 +4157,0df59e98 +4158,58036d83 +4159,2d99e30e +4160,d7303776 +4161,af5cc2e4 +4162,df206e3d +4163,4d12a22d +4164,5e3bb270 +4165,286ef5e3 +4166,22b3b1f0 +4167,3df431b4 +4168,82c5c9cd +4169,d4da1134 +4170,10d11bcf +4171,c1b581ba +4172,1b7c1046 +4173,992211e7 +4174,30358bc9 +4175,ababc891 +4176,c9c4c5e6 +4177,ff8182be +4178,a3cc40f7 +4179,4a3ff05b +4180,15e2b09b +4181,f2d1d8ff +4182,14168778 +4183,8e576bdf +4184,92b78a03 +4185,776216c3 +4186,a35e696e +4187,fa68462c +4188,c2368c37 +4189,cd036cb8 +4190,0ac7a87b +4191,a3cfedf0 +4192,23c7759e +4193,54ff78dc +4194,8996024c +4195,796f2183 +4196,33c6310f +4197,471e0bfe +4198,c16195ec +4199,90d99c6e +4200,5f13d733 +4201,b8334c34 +4202,b1d0bf07 +4203,dd9306d3 +4204,44b91b36 +4205,942ffcb1 +4206,597fd2c8 +4207,d9b6b5b0 +4208,e9d49ad7 +4209,a8c0655b +4210,c92e5e35 +4211,31f850a3 +4212,dc3ec430 +4213,6f5ca462 +4214,7894077d +4215,a09f12b5 +4216,42aee836 +4217,e06036aa +4218,54e42fb8 +4219,7a9da435 +4220,27f25ca3 +4221,e06f1ff7 +4222,0cdbd69d +4223,2b410863 +4224,70ef0919 +4225,f84bb843 +4226,1bcd7d89 +4227,c219fb6b +4228,d2436682 +4229,059b90c2 +4230,61ebd505 +4231,7d72947f +4232,39597e64 +4233,07c5b8d3 +4234,45af6af6 +4235,03c74011 +4236,6f740277 +4237,9681bdbd +4238,54ede1ee +4239,eebfb1c1 +4240,20ba8184 +4241,bbb88f96 +4242,89eb002b +4243,06453dca +4244,14257507 +4245,193c9b82 +4246,93594e60 +4247,c3929923 +4248,c1e1a8f8 +4249,e7dbf8f7 +4250,9eb8f96a +4251,3a689389 +4252,8a972490 +4253,84cdd196 +4254,e7f1c61d +4255,05106984 +4256,3780641a +4257,e5bf02f7 +4258,2c34742a +4259,8ffc9ee5 +4260,f3369ab4 +4261,1af3837c +4262,fd3dc534 +4263,f688cfaa +4264,54ea2c62 +4265,e871eaeb +4266,e2fbb436 +4267,8982ca7b +4268,74969ed0 +4269,945c14f5 +4270,b8e1ad0e +4271,d84be4fb +4272,e1a2e7bf +4273,eaf5db13 +4274,76adb67f +4275,900839a7 +4276,10d0fd72 +4277,6a3bd664 +4278,c8cacb80 +4279,3d35b710 +4280,e7e33bab +4281,ec31ee9e +4282,716b9f52 +4283,980395b9 +4284,7df71608 +4285,815b2995 +4286,b38b22ce +4287,8021f039 +4288,4b4beead +4289,fe899f3b +4290,bd8f2172 +4291,1d93c3a5 +4292,76987b57 +4293,e0e69191 +4294,00e6f7a5 +4295,d2401520 +4296,06ebae02 +4297,8630c54a +4298,c194dce5 +4299,6156e994 +4300,d0a6784c +4301,e950cf70 +4302,cf750c22 +4303,e553140c +4304,e7e445f5 +4305,cfbbe635 +4306,3bc7ee16 +4307,6b56e636 +4308,27857d06 +4309,ab1a356f +4310,d3ae4265 +4311,9729ab1d +4312,ea1888be +4313,906c54fe +4314,7b6c85aa +4315,ec66b4f0 +4316,11609112 +4317,62432c5c +4318,a58a3eea +4319,de8ddcc5 +4320,b1dbaf4e +4321,fb30ae76 +4322,7f98df0a +4323,60d51706 +4324,409121ef +4325,d1e87525 +4326,1e2d3762 +4327,6e685e4c +4328,5353f1e6 +4329,f8a22ec9 +4330,8b27aa6c +4331,1988012e +4332,de6d24dc +4333,9f6b9f34 +4334,3d18cd8f +4335,fc78c5e6 +4336,98ee682d +4337,e584c47d +4338,5bde96f2 +4339,f974ad55 +4340,15abb928 +4341,4c8d5d98 +4342,63942e57 +4343,a6352804 +4344,87c03989 +4345,15fd34a6 +4346,a118fa39 +4347,f108323f +4348,378e7563 +4349,9f2e922f +4350,1ca1be5f +4351,1dc64dd7 +4352,14b92963 +4353,5540fbf6 +4354,b889a53a +4355,3ca70e5a +4356,de798e96 +4357,85f5a19e +4358,2cb6d717 +4359,14b529b9 +4360,8d8f5686 +4361,a19f80d0 +4362,bb782162 +4363,9c8ed9d0 +4364,4cba55cc +4365,6d963c56 +4366,059ec23b +4367,b34847fd +4368,364493b0 +4369,74b91b40 +4370,2749ac0c +4371,807c2ad2 +4372,7044f69b +4373,6edc44d3 +4374,74a8c4a6 +4375,c72b11ef +4376,9dc87d54 +4377,be758399 +4378,3e561ce3 +4379,6f22f8d2 +4380,1a218f63 +4381,fc58a90a +4382,22e4810e +4383,7f829461 +4384,b2d49d08 +4385,df98cd16 +4386,d155234e +4387,a87dc51c +4388,16dbbf34 +4389,1b4ceadb +4390,2396e7bc +4391,eab40a85 +4392,bd6f926e +4393,278b225b +4394,a9d615fb +4395,221ee939 +4396,11f94681 +4397,723c0690 +4398,89c1ae4c +4399,47e6cb7c +4400,63b829b4 +4401,6cffe32b +4402,d8ead1a7 +4403,54b92d9f +4404,c05ec628 +4405,d2c22fd1 +4406,bd7da539 +4407,20088bba +4408,0e25c71c +4409,865b4987 +4410,d7a6262d +4411,f1977bb2 +4412,41b4265d +4413,39cb49db +4414,f8cc6725 +4415,72eaecf0 +4416,b114ce91 +4417,788c888e +4418,9759efb4 +4419,0078440c +4420,d154645d +4421,779998d8 +4422,29291392 +4423,632e4d33 +4424,fa9997e8 +4425,44edc09d +4426,b40ea9a2 +4427,2af261f9 +4428,c2e3c48e +4429,652b9b98 +4430,cc7255df +4431,eb9229cb +4432,3126eb6a +4433,55a3a057 +4434,969cd899 +4435,3ff95bce +4436,7db20a58 +4437,ecb609dc +4438,7d9bf138 +4439,02ebff77 +4440,c5d76b08 +4441,adeef511 +4442,095b3e7d +4443,7d08e634 +4444,30b84816 +4445,ff887fb5 +4446,e2b39e5c +4447,4d583e43 +4448,d281aabb +4449,df23d1dc +4450,515b6c66 +4451,6c87d62e +4452,0b277454 +4453,15126382 +4454,5545ddb6 +4455,f6096b4d +4456,36c21ad5 +4457,18cf763a +4458,1958bd87 +4459,49609048 +4460,5217e05f +4461,dd3a92d2 +4462,8d6f2b67 +4463,e3cc6e2e +4464,17f72407 +4465,d56e59a8 +4466,316e453f +4467,f6cf2a06 +4468,fa24723d +4469,f05cfe1e +4470,6f3f026c +4471,56ca201c +4472,ca08f900 +4473,55c471d4 +4474,42c7c5e5 +4475,4f3a3f88 +4476,e0e8c1d3 +4477,3858172e +4478,f0a63a4d +4479,b83859dd +4480,1c91c29b +4481,817c4bdc +4482,00989399 +4483,53a3f30b +4484,26db8ca3 +4485,fbe24f2c +4486,843a6041 +4487,c3576f64 +4488,1150777e +4489,ed2da41f +4490,c57be2b5 +4491,0a4e4878 +4492,dd0e7861 +4493,18b26d8a +4494,7ad1f0a9 +4495,93816741 +4496,e9648ebb +4497,13b9151d +4498,bc12414a +4499,059c44f8 +4500,db713424 +4501,6fe2561f +4502,cc703a1b +4503,6fde5e3f +4504,910f71a2 +4505,c8343e4a +4506,94a5159a +4507,e1a71d45 +4508,438df2b1 +4509,1495d4be +4510,bb0af172 +4511,9a86bd80 +4512,a2957361 +4513,fe5b1efc +4514,f02d9ebb +4515,6956fad2 +4516,8a0f67f9 +4517,fc6b41e2 +4518,13c64f2d +4519,a6cb30e9 +4520,d8ed6757 +4521,e1c006bf +4522,cd205a88 +4523,ab41c765 +4524,89e3721e +4525,128559fd +4526,1f331650 +4527,1b8ece3e +4528,89db5ac3 +4529,b844c38e +4530,51fda4ba +4531,4d293f11 +4532,f3afb20a +4533,6d3fff67 +4534,a9f11b4b +4535,747cf067 +4536,515b47cb +4537,87fb3d1b +4538,c05ed4a1 +4539,05257e28 +4540,b3dbf3e4 +4541,e99b98cb +4542,c0643e47 +4543,7a2a4b54 +4544,cdec9f94 +4545,3fb8c11b +4546,53c93cc6 +4547,552d566b +4548,cf184948 +4549,622585a0 +4550,963e8a54 +4551,e22cf611 +4552,ebf9ae00 +4553,8d332642 +4554,49cb613b +4555,7ac8c690 +4556,f1877287 +4557,e7700d8d +4558,9c0e00eb +4559,c7682bb0 +4560,34af96e7 +4561,1e3bed61 +4562,be35b836 +4563,9d620ae2 +4564,b3f4a8a1 +4565,b9b97a33 +4566,ee050cde +4567,8a4df3e1 +4568,17827043 +4569,ee9ed591 +4570,b7c8e635 +4571,a0e329c5 +4572,49c3f64d +4573,299423d5 +4574,0b86c7b4 +4575,d0fe1db3 +4576,4bebb689 +4577,4453a168 +4578,ff4c2a40 +4579,6fbc57f1 +4580,ec537f27 +4581,649e9f4e +4582,0bd49fd1 +4583,e166b0a2 +4584,9e8f676e +4585,21934d38 +4586,3bbc2a97 +4587,c0f46f40 +4588,8bdd3dba +4589,9608923c +4590,29911d9c +4591,83b490c5 +4592,1c489502 +4593,83932676 +4594,f22131f8 +4595,e6f914a9 +4596,ec72e501 +4597,b69e3e50 +4598,d41c4004 +4599,73f19eb5 +4600,d067fe33 +4601,cc6530d6 +4602,f25b3782 +4603,184f3140 +4604,c953f14a +4605,5a32cebf +4606,427d902d +4607,2f2055bc +4608,0a09c9e6 +4609,684fe5a2 +4610,720e5fa4 +4611,2ad77d6d +4612,72b62663 +4613,8cb387fe +4614,fabdf014 +4615,eae3a451 +4616,95db7da5 +4617,3ed1fafb +4618,fcd5b43b +4619,aef48578 +4620,81842d32 +4621,a13bdb44 +4622,94e7ecd4 +4623,adada6db +4624,92cc7bed +4625,0ed1dcc0 +4626,8f00fdce +4627,6615fcb0 +4628,d7d67bc1 +4629,96615842 +4630,cb9ca7d2 +4631,db2b89bb +4632,778bdc62 +4633,bacaf8db +4634,47190abf +4635,3daa667b +4636,8cea1fa7 +4637,9ed1b8ab +4638,64409438 +4639,3b32afbe +4640,68d6841c +4641,a34a4c60 +4642,7645e5d4 +4643,605a53fb +4644,22527486 +4645,d934e160 +4646,0753bb85 +4647,1af4980f +4648,883de230 +4649,5026ef7e +4650,be5e5191 +4651,19aa4a09 +4652,8a0cd3f1 +4653,6e7232db +4654,f02209a0 +4655,6c03c356 +4656,d9eef37d +4657,57b8d875 +4658,b79972e2 +4659,f9226e94 +4660,0790b9b3 +4661,8d57d5c3 +4662,586029bc +4663,666fc032 +4664,cbeb85cc +4665,7ca82f7b +4666,f0ca7ab5 +4667,48306131 +4668,ac31c399 +4669,6780e747 +4670,71dbb470 +4671,aa00a2d5 +4672,3389c19f +4673,e0460fa7 +4674,ee91e29a +4675,be20a9fb +4676,57602a0d +4677,c96b5f3c +4678,ee924170 +4679,348bc601 +4680,7a53c9c6 +4681,d0989cce +4682,ac04d86b +4683,5d63d2a0 +4684,64be0440 +4685,ebbf426d +4686,db353278 +4687,de0df3a3 +4688,3bf3c2d1 +4689,2d473109 +4690,29dd4b06 +4691,f8be3eff +4692,eb815bbe +4693,d6e9b08f +4694,b0d39aff +4695,21a8ff11 +4696,d0e4314d +4697,9c796c42 +4698,cde63aec +4699,5364952f +4700,962cad4f +4701,99ff3a36 +4702,2132bf7e +4703,c89b7694 +4704,6803b07c +4705,64014ef5 +4706,071ed56f +4707,028d1c1f +4708,d6aea1f9 +4709,16217d80 +4710,466a3c8c +4711,8f2bdd15 +4712,8a32fefd +4713,1752be2e +4714,0ed30c25 +4715,a44ddedb +4716,d8e08afa +4717,436b96ee +4718,9ec310a1 +4719,d7b80bb5 +4720,36f55d6c +4721,6da30b51 +4722,5e948acd +4723,32a388ab +4724,2e97562f +4725,03a87e27 +4726,f744e448 +4727,55ef6774 +4728,ea4945e7 +4729,9b61bb62 +4730,10a9ee03 +4731,f5b28051 +4732,f376ee85 +4733,f3274dfc +4734,76abb0b0 +4735,2aba8ccb +4736,8b810f9f +4737,c44ff730 +4738,a33cef95 +4739,fbfeba5b +4740,c45e3b04 +4741,b198648d +4742,0a498402 +4743,0b29f6f7 +4744,c890fec3 +4745,ffb4c6a4 +4746,0c4256bd +4747,6e0ac565 +4748,4f3ab79b +4749,c01c3325 +4750,8d022a3b +4751,2c014762 +4752,3fbeb53b +4753,01700361 +4754,c5612408 +4755,6449e12f +4756,63c0a641 +4757,506f1ba3 +4758,7aa494f8 +4759,98a5b60d +4760,26121434 +4761,34abf37f +4762,8dd79b1c +4763,54f2f306 +4764,9ddccdd8 +4765,7f310dad +4766,e0c0f966 +4767,3e737caa +4768,8703f392 +4769,ee3d2cd5 +4770,204a19ae +4771,e7a894a7 +4772,27d693a5 +4773,c42b6ec0 +4774,2cee952c +4775,24636baa +4776,3d977b0f +4777,c46e877b +4778,19eeae25 +4779,3835e5db +4780,38e38569 +4781,78a4e722 +4782,9c085541 +4783,3b3c0421 +4784,af30f6d0 +4785,405ce8df +4786,82c990ca +4787,654a9046 +4788,1a738e40 +4789,72207d30 +4790,f6a5e07d +4791,1ee9f84f +4792,6d925cf1 +4793,26432930 +4794,a1b6375f +4795,7b2f9e94 +4796,0a349075 +4797,42b7f952 +4798,ce6a931c +4799,4155a0a1 +4800,aad78447 +4801,abe815e8 +4802,35678b51 +4803,33f18176 +4804,ac88b819 +4805,55bd28da +4806,e5c46b22 +4807,e4ea109a +4808,840456cd +4809,01960d5c +4810,8b81281e +4811,e1005a3a +4812,6906e3d0 +4813,e969bade +4814,0a80c33b +4815,9908bf29 +4816,f5a53b17 +4817,03d913ee +4818,b06c899f +4819,2435f2f4 +4820,2e5f239e +4821,df544859 +4822,438de077 +4823,3596096b +4824,28109e02 +4825,8896d8ec +4826,e6ffee41 +4827,87fbb19f +4828,f1e688e5 +4829,74e1a2b1 +4830,b55b768d +4831,2c5bc9f4 +4832,5eb4337c +4833,735d8cce +4834,28fa4929 +4835,51c8ec77 +4836,b21dd1b9 +4837,b56bad1d +4838,97194faa +4839,ac0c651d +4840,521fb601 +4841,b0138319 +4842,fe4ca6fb +4843,2f6e6fd9 +4844,4fa81135 +4845,d8f658f0 +4846,015c31e4 +4847,e4359f30 +4848,20c61fff +4849,5a49479b +4850,9e8b21af +4851,1acb7789 +4852,860f3afe +4853,31491976 +4854,84973d65 +4855,ef5ca47f +4856,a2b9a02b +4857,dc5734e4 +4858,37552139 +4859,5824cb00 +4860,65dd4d3b +4861,054bba40 +4862,272f8d7e +4863,91026d9d +4864,721890de +4865,585a36ce +4866,63258a5b +4867,6a875b26 +4868,313a247d +4869,8b78f661 +4870,e5f8955b +4871,2a7dd236 +4872,d5addd00 +4873,0ac4a272 +4874,7d679ffd +4875,69d06090 +4876,90e8f9a6 +4877,e7dc0b77 +4878,f936e936 +4879,a3af207e +4880,b7994eee +4881,bad46d52 +4882,8328d092 +4883,9078e60e +4884,590014a8 +4885,2bbbd83c +4886,6841bbab +4887,7ce68bef +4888,61175f6b +4889,16fa4080 +4890,759df37d +4891,6df24001 +4892,836fe52b +4893,6351804f +4894,0c9a7eb9 +4895,ddb3d25b +4896,4280b60d +4897,e804b2f7 +4898,fc428b52 +4899,568949d6 +4900,ba86c331 +4901,6615bb7b +4902,29acc7a0 +4903,22b803ec +4904,fafb2c60 +4905,3247cf25 +4906,0bf1059a +4907,8e77268d +4908,791e0856 +4909,8990b4d5 +4910,3affc68b +4911,8647c008 +4912,054a2bc1 +4913,4762dea9 +4914,68481b38 +4915,baf93767 +4916,4c408dee +4917,227935c5 +4918,a8ab0c2a +4919,ffaf5c9e +4920,674ea4d8 +4921,47277205 +4922,97e8a622 +4923,a8de77df +4924,878e46ce +4925,acbde3dd +4926,50c21d8a +4927,99cb5dba +4928,840cd684 +4929,06129647 +4930,b8009717 +4931,45997758 +4932,0cbf62e4 +4933,ffa74d3f +4934,39ed70e4 +4935,a4cc84bf +4936,52756c48 +4937,24084643 +4938,1b9e549e +4939,43c2a3c1 +4940,5a7c6ac1 +4941,e44b6bc3 +4942,1e5cba8f +4943,5af608af +4944,3ef7e355 +4945,d6107c16 +4946,83d2ab36 +4947,84807710 +4948,00c74fc8 +4949,ff7021bd +4950,375a3ee8 +4951,591930f6 +4952,24060467 +4953,dc389d8e +4954,865375e4 +4955,938966de +4956,0ea1605c +4957,b306ba18 +4958,db196dea +4959,75218c73 +4960,43546555 +4961,29a26b71 +4962,689ec6f5 +4963,c87f697c +4964,2c3368cf +4965,b369c4b6 +4966,75ab3180 +4967,580b7ad5 +4968,8e4a6dbe +4969,1affefb7 +4970,ebb2e88f +4971,cd7f7779 +4972,5fdcdeea +4973,b62a5b4f +4974,c4cf5aa7 +4975,94b3c149 +4976,6f46ea41 +4977,a2f6ec38 +4978,af250b4b +4979,146437b7 +4980,9918124a +4981,b0093c9d +4982,4d678648 +4983,f3092637 +4984,1ff52753 +4985,adf906b9 +4986,1b3536a4 +4987,62af16f5 +4988,766f4729 +4989,6fe27072 +4990,700187e4 +4991,a8c05ef9 +4992,f6838c16 +4993,a3550c1c +4994,d394a5aa +4995,f7de9857 +4996,6558b35a +4997,b887f6a9 +4998,81e88314 +4999,36eb5da2 +5000,8e982b95 +5001,23606139 +5002,ddccdc4b +5003,b0c60fd1 +5004,5a837b9e +5005,5f7ed1ac +5006,1e0188ae +5007,918e07bb +5008,12d00eec +5009,66d6bfb3 +5010,e0f36316 +5011,6b4a5d22 +5012,f68dcc63 +5013,b649533f +5014,aced138c +5015,51556752 +5016,af95695d +5017,bfa5af04 +5018,841eadd6 +5019,46debc4a +5020,5c016f10 +5021,442a063b +5022,1113b653 +5023,72407358 +5024,28bd3b2e +5025,a439b74c +5026,7f8599fb +5027,ce14bf48 +5028,7cac8f52 +5029,89b1ddca +5030,5e433c64 +5031,b3656184 +5032,7fb0ec90 +5033,004e3b27 +5034,44cc9111 +5035,9e88b85e +5036,a9798aa5 +5037,642691a6 +5038,4c3c0995 +5039,71551835 +5040,9460aead +5041,3dec173b +5042,9075f34a +5043,3bf45c1d +5044,441f1888 +5045,aff89ffa +5046,b192890a +5047,957ffe34 +5048,e8c3c6fe +5049,d88ffc29 +5050,5ada9575 +5051,e7ca51e2 +5052,716d6162 +5053,9b4a81f4 +5054,10415ec8 +5055,e9253b43 +5056,e9610d88 +5057,7112dd87 +5058,9bef0707 +5059,395ffc7f +5060,3e21f4d7 +5061,f48c589c +5062,e751c04b +5063,b8bc4351 +5064,17e521c9 +5065,cb14f639 +5066,94e4d100 +5067,d80c361a +5068,bdcc8b88 +5069,79657fba +5070,38c71554 +5071,eba7bd30 +5072,e7a92c2f +5073,2e2fa916 +5074,d8367d8a +5075,994ca611 +5076,aab7f117 +5077,0a77af6f +5078,fbe0cd4e +5079,353d1529 +5080,bc1bd5d8 +5081,84df689b +5082,470983ff +5083,1bdb0288 +5084,c3396b74 +5085,e2090055 +5086,ac1cf806 +5087,daec2158 +5088,262abb27 +5089,fa3655be +5090,8f52ad69 +5091,7d817b3d +5092,90280c02 +5093,746d7fc0 +5094,a23df21a +5095,40bea67a +5096,ef4111ce +5097,3ab63a7b +5098,18c0e0fb +5099,081d0954 +5100,8a73c73a +5101,2257f5ad +5102,a97b26e4 +5103,618e71ce +5104,a52077b7 +5105,22a0681d +5106,f96a8292 +5107,f21a3dfe +5108,73b631f2 +5109,ab0a54a3 +5110,3c50cc0b +5111,48877ca2 +5112,2352babd +5113,15f2c022 +5114,a1ef540a +5115,c7dc48dc +5116,3867cfa3 +5117,d7565cdf +5118,8fea5b04 +5119,b48ae612 +5120,7901809e +5121,0a7ebdc7 +5122,82484224 +5123,823ac50b +5124,2ce38cee +5125,0cefb5c8 +5126,e4fbfacf +5127,83fd1eec +5128,fd1650af +5129,8a24cf48 +5130,03469bdb +5131,99c6bd53 +5132,55a83d82 +5133,7f329102 +5134,2dc368bf +5135,d6142a58 +5136,f4c84690 +5137,bac7a55d +5138,880e5c57 +5139,5d66e494 +5140,6d514d36 +5141,75ab7101 +5142,29577f44 +5143,cf3ae2c0 +5144,62fb9f06 +5145,b5849448 +5146,f8990be6 +5147,9c16abf8 +5148,3300add7 +5149,b7300c41 +5150,939b2d56 +5151,ebd3194e +5152,9d42ac75 +5153,25edaaa4 +5154,7b8d641b +5155,8894863b +5156,42845edc +5157,efe79e2f +5158,fa2c2212 +5159,55c41e37 +5160,699292de +5161,12067a71 +5162,a612795a +5163,61f5e92f +5164,14a656ff +5165,05c2c7b7 +5166,8a1bce62 +5167,3e5197a4 +5168,4f84320b +5169,0bbad705 +5170,53d7f415 +5171,10653d24 +5172,105f5a21 +5173,df23a4d8 +5174,f6957ab9 +5175,c5ed95e2 +5176,a74a8887 +5177,7c776470 +5178,21e7f11f +5179,c5adeddc +5180,32fdc590 +5181,43fe0eb8 +5182,ceae6b57 +5183,6e7ced2f +5184,8a4aec9d +5185,fc0fc4f1 +5186,9deac3c5 +5187,ed66ad80 +5188,d0839adc +5189,f74cbf8f +5190,f6e5f2b4 +5191,1804bfe9 +5192,1e352507 +5193,ff61ab62 +5194,f1c6f7ee +5195,22df08c8 +5196,7cfd131f +5197,ac5d9bb7 +5198,44a63cc3 +5199,df24a49f +5200,987f740f +5201,dc2ce253 +5202,b4b77bec +5203,e0b97657 +5204,1a08d20d +5205,f69a8cce +5206,7358aab9 +5207,89f1f872 +5208,5bb27aea +5209,3c527c01 +5210,a4c46948 +5211,971665ca +5212,7c35489d +5213,5eb66ea9 +5214,a9414b86 +5215,c3bd19e2 +5216,f0ddb87b +5217,8ecfbcff +5218,de61e212 +5219,1e99f8dc +5220,4743956b +5221,fd173440 +5222,2517228c +5223,641871d6 +5224,b30a37f0 +5225,ad0cbd36 +5226,9c5ee4cf +5227,ae4c4a73 +5228,c02a5e03 +5229,4f5aba4e +5230,8031dd82 +5231,0e1a5c00 +5232,e6a7848c +5233,831c42b9 +5234,0ab4caef +5235,42ec6803 +5236,d950e96b +5237,c4744148 +5238,a976f704 +5239,c6a6d7de +5240,f3501f86 +5241,077f36d7 +5242,5ce63512 +5243,6a57904b +5244,880aac3a +5245,3fca7daf +5246,56b459c4 +5247,032be8a6 +5248,cb6ea03d +5249,d52a99d6 +5250,76ac6eb8 +5251,061e7c3c +5252,0605d4d2 +5253,7819c01c +5254,aed2840e +5255,5d4e1b28 +5256,9d7cc232 +5257,e9cbf7b3 +5258,36b3cefb +5259,9469af63 +5260,d76ae54b +5261,66df6568 +5262,d727138f +5263,01b2708d +5264,f98a30a0 +5265,69b60135 +5266,67ede46e +5267,8aeb1cb0 +5268,336a14bd +5269,2014e804 +5270,9677869c +5271,c59c9c2a +5272,029869c1 +5273,e62f2aa5 +5274,5cc74c31 +5275,ac8beaa7 +5276,ae866ec0 +5277,a4a8b18e +5278,ecbbbe78 +5279,3cfebed0 +5280,18ac56aa +5281,28489448 +5282,645d51b4 +5283,1a65fb6f +5284,1071dc82 +5285,1eba2346 +5286,3f34b774 +5287,a53bf2c9 +5288,7ef20c44 +5289,d3b51cbd +5290,00fbfc97 +5291,ea5e7997 +5292,17a85869 +5293,6928a9f7 +5294,39ca057c +5295,952ebcef +5296,b6159160 +5297,f89dc269 +5298,5664da50 +5299,48bb0e87 +5300,533007f6 +5301,33af2c3f +5302,26632ad5 +5303,f68b3957 +5304,0a59eb87 +5305,e950cd58 +5306,07f90f43 +5307,759e3b2c +5308,df2827b6 +5309,cc8625e0 +5310,adc18ae7 +5311,86db6bdd +5312,09a79bb2 +5313,724cbb42 +5314,83462563 +5315,0f8d9559 +5316,991b47b6 +5317,20666e1f +5318,b7364469 +5319,68085236 +5320,d37f8a1a +5321,98124d35 +5322,c25b900c +5323,f16edced +5324,fc9fb179 +5325,1f04aa79 +5326,f79ad9e0 +5327,03a8b374 +5328,b6f42cc3 +5329,b8515d49 +5330,1de98563 +5331,4fceb8cf +5332,359e0f5e +5333,0527e132 +5334,20ce2949 +5335,8c302ed7 +5336,dfda27c3 +5337,7c68ba5c +5338,77f00687 +5339,0337ddad +5340,c8fbbe51 +5341,2a685197 +5342,26ba9b07 +5343,1bed0196 +5344,0851d795 +5345,67a682bf +5346,ca5b6d30 +5347,ff734742 +5348,83c8ac8f +5349,4fd5691c +5350,bb8369a8 +5351,11f0384a +5352,a33be8de +5353,46ea22cb +5354,cea91b0d +5355,172f976a +5356,b5652cfb +5357,713ac5e1 +5358,eb207521 +5359,b088be17 +5360,93cdf80b +5361,10c58645 +5362,df6bd525 +5363,3930bf25 +5364,10902b46 +5365,ad6fc53b +5366,633952b1 +5367,8f38594b +5368,d88e6fb5 +5369,2a9315ae +5370,6a614fc5 +5371,8d74be0f +5372,c5b61014 +5373,aee2db09 +5374,6ca861c6 +5375,6ed08366 +5376,196db70e +5377,bf16cb59 +5378,2c21bc82 +5379,37510312 +5380,9ca743ed +5381,6201548f +5382,64a452f3 +5383,7b358be7 +5384,73cfd191 +5385,8274752b +5386,269a4128 +5387,e21a5938 +5388,d8efcef6 +5389,b765ac2d +5390,5168f437 +5391,82f74d0a +5392,713ee289 +5393,a4b24b06 +5394,0264a779 +5395,17ffb183 +5396,e460dc36 +5397,bd890a3e +5398,5cec2cca +5399,df9e7148 +5400,b9320826 +5401,7490dd4e +5402,dbd61c7c +5403,f45530e6 +5404,7296c6ab +5405,f9d0c90e +5406,640ebd7b +5407,eaba2c56 +5408,78b44036 +5409,aee33468 +5410,ec8823ff +5411,5791a40a +5412,edabc3a3 +5413,82687c47 +5414,05fbe879 +5415,ecf5fd7a +5416,5a9ae327 +5417,bd54a72b +5418,84471019 +5419,9a7d1f72 +5420,cb9a3a44 +5421,1d7805b3 +5422,b075482f +5423,f90fda89 +5424,f337d1f5 +5425,fe493b55 +5426,f4918805 +5427,1a277d41 +5428,607b2613 +5429,8fd0980d +5430,dde4cae6 +5431,e1f178d7 +5432,05d2b9df +5433,99d4bb1b +5434,1e9ace18 +5435,4c46e57e +5436,3f2e645c +5437,7112626b +5438,d1d91ca2 +5439,b0781ff0 +5440,6994afa3 +5441,d19a7292 +5442,f7c43e81 +5443,7fab06d1 +5444,29e54542 +5445,0de1227a +5446,120927df +5447,4faf7a1b +5448,26938a80 +5449,6929579b +5450,afc25634 +5451,f142d6a7 +5452,aa28e11f +5453,6ed53c90 +5454,9fd54c80 +5455,29c522fa +5456,9a4740fb +5457,bc8ad7ca +5458,944aa87b +5459,86f6b9e4 +5460,0e7a7103 +5461,e09e61b8 +5462,31cadd2a +5463,72538bce +5464,e2f24170 +5465,202e566a +5466,1844515f +5467,afb552b1 +5468,f7bb758c +5469,b2394e8a +5470,f9a74318 +5471,750a0b83 +5472,74dcca26 +5473,8616dc59 +5474,a9187d2d +5475,dd759522 +5476,5651ea56 +5477,2a24f80a +5478,e3669e9f +5479,92603257 +5480,844f53a1 +5481,0bf98a04 +5482,81c833e9 +5483,af81aafd +5484,77d657df +5485,9e77ec39 +5486,1b018502 +5487,8d812af1 +5488,6e4642b2 +5489,52a2ef61 +5490,c679fab4 +5491,af70515d +5492,c894a614 +5493,619139fa +5494,ab014466 +5495,4d8102a3 +5496,4f4a8804 +5497,67b9613b +5498,a59f712a +5499,48ef6734 +5500,4e5fcd2c +5501,25eb935e +5502,6c80e0be +5503,ca07ffc3 +5504,eb5f20a9 +5505,aa0ea59e +5506,18a9b53c +5507,03a345fa +5508,c1c5b8ed +5509,1dfe7b35 +5510,af476457 +5511,75e2efa7 +5512,e1d6a2f0 +5513,5a480359 +5514,fdbb99a0 +5515,8b8a7f2c +5516,870ca09d +5517,234b5593 +5518,5429db8c +5519,4b24fb09 +5520,fdadce06 +5521,3681b6fd +5522,ee77a9f0 +5523,b1068439 +5524,4de09dfa +5525,738f028d +5526,ecfde7e8 +5527,90f0d121 +5528,f9007b70 +5529,1e65cf51 +5530,06d5b4d1 +5531,16e4f121 +5532,5062000c +5533,600ac3bc +5534,72604f98 +5535,058dafed +5536,1c660434 +5537,4872ddf0 +5538,bd5ee51c +5539,d4f140ea +5540,40b800d2 +5541,6bdb5509 +5542,191d91ee +5543,d5db39d7 +5544,6660744d +5545,eb053909 +5546,43747ce3 +5547,033606ba +5548,8e5ad413 +5549,6353ede6 +5550,bea08846 +5551,9a61d04b +5552,85518dbf +5553,0f54cab9 +5554,0b012734 +5555,f7a26640 +5556,181a82b9 +5557,d3aefce5 +5558,6ced4cea +5559,93f2e365 +5560,916d680d +5561,be972e52 +5562,ee9ba4a9 +5563,0daff4f5 +5564,07d931ee +5565,379cc2a8 +5566,3dc6f4fc +5567,4ed57b8a +5568,ded18adf +5569,5f5b5cc7 +5570,2b2de679 +5571,d3fafbb2 +5572,f5d26277 +5573,9009d612 +5574,6fd432a6 +5575,f259aa54 +5576,54e8be20 +5577,abe523c5 +5578,89c92d93 +5579,c2bc57f5 +5580,c0fcf475 +5581,a943e1d9 +5582,40b7dccd +5583,5fc8720f +5584,11ab9be9 +5585,518ee0a3 +5586,fb23f8a9 +5587,310d6dae +5588,e96961cc +5589,9e6cb250 +5590,7b8c3549 +5591,ffd398f2 +5592,45d3ce0a +5593,0d8dd286 +5594,eadaab2d +5595,c7cf65fe +5596,c28e005a +5597,32683f0d +5598,8d3a2b5e +5599,74339b8b +5600,08efed37 +5601,c4c721fd +5602,3574260b +5603,834ba4cd +5604,19631466 +5605,333068ad +5606,0e9deec0 +5607,c8fb904b +5608,72b0ec78 +5609,9231c978 +5610,167dcba2 +5611,585f607a +5612,42506d3c +5613,042f75cf +5614,239b0273 +5615,6bdbf60e +5616,d03b31c2 +5617,b853f8a4 +5618,28e4c7fa +5619,4de56296 +5620,ceed12c7 +5621,515da46f +5622,91147e61 +5623,0602a8d1 +5624,95db6f38 +5625,c1f9e1f8 +5626,e6a237dd +5627,2ede1103 +5628,b1ab09fb +5629,f1a0aba3 +5630,91c8f339 +5631,89db951e +5632,455cdb9b +5633,3139a503 +5634,5e84894f +5635,3b22b8c7 +5636,aa7b3398 +5637,747726a8 +5638,07922617 +5639,ffacc8de +5640,87264cbb +5641,673a946d +5642,59fa3069 +5643,1d765f2a +5644,9d9f88d7 +5645,6da532be +5646,35804bdb +5647,a1b46a79 +5648,40f93b8f +5649,12d852e5 +5650,39f52045 +5651,e51de352 +5652,822c8dcc +5653,36a43afd +5654,39640dfe +5655,5351573a +5656,f2432da3 +5657,c77b6315 +5658,62ee3959 +5659,1254ee58 +5660,0e099697 +5661,92ff082d +5662,6c25e474 +5663,5f1ab06b +5664,c6f3b9ca +5665,7a890627 +5666,79069f42 +5667,39d2098d +5668,59e2fc0a +5669,cd079e83 +5670,c897a420 +5671,7dbe768b +5672,f977ad49 +5673,4576d1ad +5674,3b6fb21e +5675,dd8cd151 +5676,efc072ce +5677,1e396aae +5678,29951b8c +5679,2059b8a9 +5680,91d36c99 +5681,6df7b439 +5682,114fac2d +5683,079f09e9 +5684,280f881f +5685,fbc9c633 +5686,ed324e0d +5687,5247f211 +5688,29ed01ad +5689,a4ed15d1 +5690,e1e61df1 +5691,156c746e +5692,0324b6c1 +5693,e494b16e +5694,d07a13ed +5695,3add5514 +5696,8d7ad0dc +5697,cfde6fce +5698,c826ff22 +5699,dab91d48 +5700,5b33c3e5 +5701,3a3a8e70 +5702,729b5594 +5703,b271779e +5704,83bb693a +5705,27e4333e +5706,4cbd0d17 +5707,7320872f +5708,d3fe0225 +5709,1f937df4 +5710,665b4c22 +5711,ffcdf2cb +5712,0e2a90a7 +5713,ef447da7 +5714,ff92320f +5715,6e818ba5 +5716,c03f92a5 +5717,a3597a64 +5718,974c249d +5719,f10603d3 +5720,9d69ca09 +5721,74914cfc +5722,1054bd0f +5723,4807f275 +5724,59ba49ff +5725,ec98409e +5726,b99f5e42 +5727,6482cbc9 +5728,d29b51e8 +5729,f1185c89 +5730,67c0db50 +5731,37a59fc7 +5732,1119d075 +5733,f516edfc +5734,c9e800fc +5735,6a68a384 +5736,6d3f28e1 +5737,68b03bf1 +5738,73adbed4 +5739,7e9b2b2b +5740,3cb46e20 +5741,4edb27ea +5742,eb6648e8 +5743,90d8b0b6 +5744,46d56478 +5745,693e62d5 +5746,fff6f4b0 +5747,e9c3a294 +5748,29092d31 +5749,897bc55d +5750,b39d3b30 +5751,81f218e9 +5752,0969c4db +5753,9f8df871 +5754,33ef5d21 +5755,1854a136 +5756,c4e8158c +5757,ccc3f6c3 +5758,adc1fe9b +5759,d72b720a +5760,7334d21f +5761,8fc8551d +5762,e0bce64e +5763,e7fe2efe +5764,20ff730e +5765,4f208ad2 +5766,0ce07039 +5767,9aeb4aa6 +5768,1318c8e6 +5769,9f5db4f4 +5770,cca89675 +5771,cc35ff6b +5772,c01731c8 +5773,995fe928 +5774,e1304c59 +5775,ac0819b3 +5776,2dad5f7d +5777,62573197 +5778,e8fd2c15 +5779,9a193ace +5780,871bd4a8 +5781,b13f53a0 +5782,f99f6d48 +5783,8ca6fba1 +5784,b630a9d9 +5785,4d48cb6e +5786,0c6bd000 +5787,83508498 +5788,fabfe116 +5789,ebc8018c +5790,110f139e +5791,39aa8ac2 +5792,cfdc529e +5793,fe674ac3 +5794,c3054bfb +5795,1698b2cd +5796,94cce665 +5797,778f533d +5798,34056137 +5799,63d996dd +5800,63b4d92a +5801,c3c6ff6d +5802,4ed59fcc +5803,69aad8fc +5804,4fc043b7 +5805,6064d469 +5806,5fcf7de0 +5807,b4dc3bc4 +5808,6ce9c12d +5809,550c3f94 +5810,7414e0a4 +5811,37444c5f +5812,b995e4a0 +5813,fd50b0da +5814,079b3118 +5815,a1475a9d +5816,6d715faf +5817,64d179f2 +5818,6646f61e +5819,dffba7dd +5820,c7edc148 +5821,250a20be +5822,0b472dd6 +5823,abd12956 +5824,965587e1 +5825,874bfd81 +5826,bee37d0b +5827,8dbc8b05 +5828,9b4ba4a2 +5829,de4b67ae +5830,1520d89f +5831,deacec52 +5832,e7d4b473 +5833,6bdcfc95 +5834,76d94f89 +5835,270807f5 +5836,49d0bc6f +5837,e8559b2a +5838,f6ac5511 +5839,0ef5c96d +5840,1f556d0e +5841,78d87d7b +5842,30bca194 +5843,f2ca58d7 +5844,4195b869 +5845,c91ebb7d +5846,04246d83 +5847,ed3e618d +5848,f8b80a22 +5849,10292a2b +5850,ac1a3606 +5851,bed3e7ad +5852,1ac142b8 +5853,b0a14ac2 +5854,6d62bc2c +5855,089488a4 +5856,17069798 +5857,ab6d269f +5858,79041b0e +5859,1a158df5 +5860,9e72b09d +5861,1178d566 +5862,b2c3efb8 +5863,1285adaf +5864,bd6fdc05 +5865,5f5cfcec +5866,79b3843e +5867,4e551b8a +5868,d62419df +5869,7d1fb7b6 +5870,74ba9abf +5871,201398b8 +5872,2bc37397 +5873,0c089f21 +5874,407e9716 +5875,191a1a80 +5876,7b01cdcb +5877,6d3aa57f +5878,d196b40e +5879,168c1f35 +5880,b5d888a0 +5881,9ad246b2 +5882,0d1b44a0 +5883,4102ee39 +5884,03ea2b80 +5885,74e1cf14 +5886,f8ca4790 +5887,eefa4565 +5888,84b2f8a9 +5889,8d49ec13 +5890,ca5c049e +5891,44ca571d +5892,42799ea7 +5893,d26a3955 +5894,036cb4d1 +5895,0ddafc32 +5896,bd18cdb5 +5897,fbe31e53 +5898,ed701e54 +5899,4833038d +5900,ad529489 +5901,b02b3e52 +5902,cfea3370 +5903,dd23a3c7 +5904,87f77d9f +5905,9db96296 +5906,f53db540 +5907,4bf4f44b +5908,fbfbfbf2 +5909,282365d5 +5910,eb5f733d +5911,5e31f510 +5912,3a40b1ce +5913,104c7bbb +5914,b556f275 +5915,7d46586c +5916,f7b239c7 +5917,dc99f44b +5918,64ff1ee6 +5919,4b3b4014 +5920,c2ffed68 +5921,89c5cb71 +5922,a42fe85c +5923,00448e73 +5924,414e45b7 +5925,18501ae1 +5926,5d7232cc +5927,f0cc5440 +5928,61ed7be8 +5929,6573845f +5930,2618cbc5 +5931,ea2e37a8 +5932,11a80204 +5933,bc33d45a +5934,930bc749 +5935,44f47333 +5936,aad66c20 +5937,f929df1c +5938,0cd0bd4f +5939,5ffdeac4 +5940,e5894efe +5941,77e6c839 +5942,27625582 +5943,70784ede +5944,261ff1cb +5945,f9b60c47 +5946,fcdb76d0 +5947,b425b768 +5948,bc16bc37 +5949,e00d92e0 +5950,e2420dfb +5951,9890268c +5952,589756aa +5953,221bd8bf +5954,bcaa3ee8 +5955,0d2ffe18 +5956,28d234ee +5957,bb5c9b4e +5958,1e3e312b +5959,432b8acd +5960,89099d6d +5961,878912bf +5962,afe67649 +5963,2ea0f405 +5964,a2a5007f +5965,28b698ae +5966,cb1b7bac +5967,691c96fe +5968,47d4242c +5969,a26c876c +5970,8d0bc2b7 +5971,92d6342e +5972,917a2d06 +5973,5a4cfa30 +5974,f3cbc41f +5975,83b8b91d +5976,626fc8a0 +5977,b9bdce2f +5978,639d3267 +5979,08397089 +5980,7352b897 +5981,94d9cec2 +5982,c407a75d +5983,cf727718 +5984,6e5047a1 +5985,3b9a904b +5986,b249e5bc +5987,b8535ddc +5988,97b44d8b +5989,322cbc0e +5990,7173c7e1 +5991,80e170c8 +5992,b4cfc457 +5993,ff5985ec +5994,75a4c502 +5995,40fb3373 +5996,ae9a0ecb +5997,1e795f92 +5998,bc453606 +5999,b5bd0fee +6000,02a535dc +6001,3b9abafe +6002,d4930ea5 +6003,625aaeb0 +6004,2260e4f7 +6005,ea33a3e3 +6006,864d4c0b +6007,edbf28d0 +6008,ecc05199 +6009,8e0c7f8c +6010,1bdf36c5 +6011,b693370e +6012,50963ac2 +6013,6f969ccd +6014,4c609728 +6015,3d3a2f4b +6016,1a4dc1c9 +6017,eda66ae3 +6018,b98e41c2 +6019,6d2fd3b8 +6020,38d1ee76 +6021,1ef1a073 +6022,2e0565bd +6023,0b7e3b0c +6024,f08c59b8 +6025,06b1e1b2 +6026,987d418e +6027,18f26ff3 +6028,0f05e8cc +6029,5c617279 +6030,ac789303 +6031,8a4cb39d +6032,1a30de40 +6033,ad852792 +6034,26b2eab4 +6035,97d35a59 +6036,f251d46d +6037,67a1b573 +6038,6c937942 +6039,69277dfa +6040,f2840432 +6041,ed78cdcd +6042,4dacc700 +6043,bc74769a +6044,9ecf47c2 +6045,6bac0f99 +6046,f6921ef7 +6047,8b764e20 +6048,242aafcd +6049,56f879ad +6050,36bbf034 +6051,30681ccd +6052,6f0acc8a +6053,767f623d +6054,454fbd2e +6055,c90d0db8 +6056,5bd5c69d +6057,80c7d93b +6058,1b789709 +6059,66fe7dc7 +6060,65a4879f +6061,f434b8c5 +6062,7d275e6d +6063,8850ef7a +6064,cb7109d2 +6065,2bf00165 +6066,82cf786e +6067,a2fc4354 +6068,d3a69d95 +6069,0c29fcc0 +6070,786f8419 +6071,2210d82a +6072,7b9f7fad +6073,2bb2bcdd +6074,c2bbf41f +6075,8dec98cb +6076,ecfffb44 +6077,8b06f1f8 +6078,6321ff26 +6079,d6e77928 +6080,b12574d2 +6081,3088d707 +6082,6e936086 +6083,9896fab5 +6084,c2c5ac5e +6085,a83e624b +6086,8d9dfaf7 +6087,a19efd39 +6088,ad5c070d +6089,07abb3f6 +6090,a53ec4cd +6091,6ccf8ea5 +6092,77703134 +6093,8a7d84e2 +6094,a5c45df2 +6095,1b60b542 +6096,9976b965 +6097,45f0e9fd +6098,b7809c31 +6099,86143116 +6100,ee785c9c +6101,1dd97cca +6102,58b0694d +6103,7c6012d5 +6104,6c520ac3 +6105,d291cf96 +6106,05c24544 +6107,ee9bf116 +6108,2af10f91 +6109,d7a80df7 +6110,65f55678 +6111,d16ceb28 +6112,a433ead5 +6113,e16341e4 +6114,075f3eb3 +6115,f95ceb2a +6116,c6cc2b16 +6117,1c1cdd95 +6118,57ecb4f0 +6119,306ddae8 +6120,986215e0 +6121,1fb4b569 +6122,2afd3395 +6123,25004ff8 +6124,548d9e4c +6125,b1520d27 +6126,f4981e9a +6127,3958c7af +6128,8a7e6221 +6129,bed43d54 +6130,de2305b6 +6131,1d498da5 +6132,0a4c2302 +6133,ab495241 +6134,603782e5 +6135,20929562 +6136,8573e173 +6137,64464002 +6138,3a6d6586 +6139,d9fa05fa +6140,dd1749d8 +6141,4e1258e3 +6142,4582a494 +6143,119003f8 +6144,bc9340b2 +6145,cb24b65d +6146,7b2782c2 +6147,ad86df3d +6148,d49e45d1 +6149,296f0bef +6150,727950b1 +6151,c13bdca5 +6152,98bbcd0a +6153,ae1f0fec +6154,c04e95ba +6155,d279e7d5 +6156,24cb62a4 +6157,ce805bd0 +6158,f5ffdfdd +6159,0546970d +6160,5a59d479 +6161,5f3feebb +6162,3d39a87d +6163,756495d1 +6164,6d70ab18 +6165,fe421cf4 +6166,db3ccf51 +6167,3d341b2d +6168,4fcc222a +6169,b2625ae3 +6170,14d439d1 +6171,d4299727 +6172,c65cb466 +6173,9a3edd6c +6174,f3344c63 +6175,64dddf00 +6176,13d4867d +6177,b7d929e6 +6178,43d48fe0 +6179,4d8766c0 +6180,7e238543 +6181,a8852115 +6182,bce988ab +6183,b6e2bf7f +6184,913fcd7c +6185,96418853 +6186,6fc132c2 +6187,a3adc7b6 +6188,de4a754b +6189,864424dc +6190,2a270f7d +6191,38242cfc +6192,decf458a +6193,45068edd +6194,a9ab3c3c +6195,f26c5cae +6196,9ce429a4 +6197,3194e10f +6198,de3edb96 +6199,0caec80b +6200,4a72e552 +6201,b0b170e1 +6202,19a07435 +6203,cca86f95 +6204,972dca56 +6205,9cd6c411 +6206,f8d5d2ac +6207,0f83fda2 +6208,83ce4d77 +6209,4011c0a4 +6210,1491e451 +6211,84a1bddf +6212,9d29ce5a +6213,3c07dc66 +6214,0a859302 +6215,6a73a730 +6216,cefde4e3 +6217,ad673941 +6218,04802209 +6219,275e86f9 +6220,1443ca46 +6221,33e7fbf3 +6222,738e5809 +6223,0e3e3a15 +6224,2cf96bb9 +6225,5cb1bddd +6226,4ec0a71a +6227,cb60ed09 +6228,a0b76249 +6229,9b6053ed +6230,3050d044 +6231,8ff0e1b4 +6232,63effecd +6233,ba0e7700 +6234,1bf92d60 +6235,bfbe496f +6236,87a42329 +6237,41f69e61 +6238,a4ce67f3 +6239,8216261d +6240,e3dc0708 +6241,7acf7dca +6242,60061050 +6243,8c5da68b +6244,6f38abc1 +6245,4dd356be +6246,916d7368 +6247,c02ba91c +6248,2ef84585 +6249,d2e539cd +6250,95226752 +6251,3282a25e +6252,778e2519 +6253,c3a17cbf +6254,700190e9 +6255,0b8f6b09 +6256,90df9b81 +6257,1905f94a +6258,759d6597 +6259,49bdb91b +6260,8e4e0b09 +6261,19d3116c +6262,5e3eff1a +6263,269929e7 +6264,caf92942 +6265,862caa20 +6266,e55e91b5 +6267,0f3b6af8 +6268,2854c597 +6269,289e075c +6270,be27dc55 +6271,c34e422e +6272,43432a16 +6273,18c72cff +6274,2af1f756 +6275,877bc9ce +6276,cebd0b3f +6277,99d9b748 +6278,357312b3 +6279,037b6268 +6280,817e9592 +6281,74a51d86 +6282,c7333012 +6283,b31d6337 +6284,df8ab965 +6285,59272677 +6286,87ec737d +6287,f1f14c7b +6288,fc4364a0 +6289,6b97853d +6290,b2b4607d +6291,9c146903 +6292,e31d81f4 +6293,c9d2bcb7 +6294,9594de07 +6295,5b99b19b +6296,ba2e71bf +6297,47c22337 +6298,99dc1f4b +6299,bc4161e0 +6300,43c85372 +6301,1f843fac +6302,27866581 +6303,4b8e34de +6304,349a5bb5 +6305,0c461c4b +6306,aac0e3c1 +6307,bc42cb85 +6308,28f1f2d6 +6309,727a46d8 +6310,0e90a9ad +6311,4f54ad78 +6312,0c327cba +6313,db7791e8 +6314,661dcaf6 +6315,735eccac +6316,32500a9b +6317,adbc95c4 +6318,adc1483c +6319,202ae50a +6320,b9f1af41 +6321,c267169f +6322,3de69bd3 +6323,d657a1e4 +6324,8ad4d59d +6325,b47ab20e +6326,c7510507 +6327,995fe653 +6328,bf0201e9 +6329,56614054 +6330,2892a243 +6331,de903395 +6332,84d34f30 +6333,b20afa05 +6334,c56c1822 +6335,3a8ec6d8 +6336,13e87717 +6337,e45c3690 +6338,db39dbb6 +6339,72115a1c +6340,ef69978d +6341,400bd78a +6342,6c3cb59d +6343,f8d5addb +6344,40f91853 +6345,9b49beb1 +6346,b20c396c +6347,07c21a4c +6348,24d90b5e +6349,62543de7 +6350,c4d71592 +6351,91cd478c +6352,364b8f12 +6353,b7a0e781 +6354,34070ca9 +6355,c7de05eb +6356,596772a0 +6357,9b5aebc2 +6358,de9944cf +6359,b7b81c1a +6360,632dba3c +6361,e08cbb29 +6362,a7d3353c +6363,4c0a17b4 +6364,64aa0609 +6365,ac75155c +6366,ce485b14 +6367,af2c2b99 +6368,566eb0a4 +6369,d56e7860 +6370,7f8c1c19 +6371,7f463793 +6372,61ec0f5a +6373,e5fb5f17 +6374,81038723 +6375,28a5369e +6376,75e15053 +6377,9e2aa96d +6378,286f3227 +6379,0da7fa4e +6380,47188234 +6381,b6568241 +6382,36c0bf2e +6383,6d01ad19 +6384,d66bbdbb +6385,965ad9fe +6386,4f5e5d3c +6387,83b8de87 +6388,170d33ed +6389,9231452d +6390,95cb0d65 +6391,b8006150 +6392,c92d1933 +6393,38207b0a +6394,e0d6296b +6395,8b171188 +6396,233e8a92 +6397,7a8c90be +6398,9066e116 +6399,c1ea7ca7 +6400,6492319a +6401,684053c3 +6402,d6e5904a +6403,fed55664 +6404,932d0038 +6405,17e53043 +6406,cca939ea +6407,196de92b +6408,dd0d81a3 +6409,19b0d5e3 +6410,314b4cc4 +6411,91c1fefa +6412,eeda603e +6413,55cdea8c +6414,7bf2e7e6 +6415,81ac3fae +6416,f5b44147 +6417,60410990 +6418,7c1f57df +6419,11635838 +6420,27ea897c +6421,3ea43ac1 +6422,e97b781d +6423,75f74eb6 +6424,fda9f3ac +6425,8c15ab8b +6426,ab2d4dcb +6427,78c5e07f +6428,dfa500a7 +6429,5efa11fd +6430,2eaaf1c0 +6431,42a05816 +6432,10a52ccc +6433,a8c9102d +6434,e4fcd2eb +6435,6efa823e +6436,bfa0471a +6437,8623320f +6438,56675ced +6439,ff84d331 +6440,8465cc29 +6441,d1ade7a5 +6442,7808658f +6443,fc27bc56 +6444,3c658a42 +6445,3a863788 +6446,2e730889 +6447,42a64e2f +6448,78fa0444 +6449,b4263a04 +6450,2d4b1f78 +6451,1ef1cc86 +6452,b1f1fce6 +6453,56bee16b +6454,ab85ff74 +6455,d78b4aa8 +6456,7c51935f +6457,2c773f29 +6458,3998ee11 +6459,3c47fb36 +6460,87b9e26b +6461,ef1bd4fc +6462,faecb50b +6463,a559b6e9 +6464,33712751 +6465,962bc71a +6466,e73c88c9 +6467,6b68a4e9 +6468,e55b915e +6469,0d1afcba +6470,5aeec542 +6471,0e13d305 +6472,14b090fe +6473,6e2e71d1 +6474,951c1f18 +6475,9115eb9e +6476,04036a59 +6477,60f05c04 +6478,20e130ae +6479,b13327d4 +6480,e7a4b19a +6481,cafa4811 +6482,cb0d98c9 +6483,a3b13b6d +6484,4af12cde +6485,a63e9e5b +6486,05a6cfa5 +6487,9e770f93 +6488,8090263f +6489,2f835ce7 +6490,3d7cb451 +6491,dbe8a280 +6492,27004375 +6493,1106c834 +6494,a51d8fda +6495,4ae6b1c3 +6496,25202f57 +6497,384f7365 +6498,c748e782 +6499,30a00857 +6500,718999c0 +6501,febc0fcc +6502,c6caf145 +6503,dcb71836 +6504,63c5ba35 +6505,dd8df9e8 +6506,283b106c +6507,29e38d9f +6508,d10a9d75 +6509,32c57610 +6510,13087d4f +6511,bd7181a1 +6512,5704a6c6 +6513,5f7c6c26 +6514,851ff0dd +6515,5bb0cfd0 +6516,66598d85 +6517,2004a545 +6518,9f28f7cc +6519,40cda031 +6520,1552be6b +6521,a0445e8e +6522,0ed0881d +6523,7613a14f +6524,fd8a43f3 +6525,0440ba30 +6526,734fa2ee +6527,5f765a1e +6528,d37b1fbc +6529,f666a3b2 +6530,a3ecc240 +6531,f8f6f50b +6532,c46e072d +6533,b4df8ad4 +6534,926aec00 +6535,8fb1da00 +6536,1444257b +6537,cfa44262 +6538,ff269840 +6539,a95aa213 +6540,18985df7 +6541,1b35bb3e +6542,c7f41d43 +6543,6dd24106 +6544,adefd779 +6545,ce96b816 +6546,1941d62b +6547,59ce0fb9 +6548,a7f7ab83 +6549,55ef8f55 +6550,565bc0f7 +6551,912a8a75 +6552,cabf9836 +6553,912ee915 +6554,f707c6bc +6555,1be66af8 +6556,dd9bcd37 +6557,d6b13ecd +6558,b95ded1b +6559,a359441e +6560,5fffa430 +6561,836e037b +6562,1233beb1 +6563,dee2cbac +6564,f877fa3c +6565,530f2059 +6566,70995612 +6567,8f32a507 +6568,bb621f8b +6569,a820cf31 +6570,5ef15e00 +6571,c56a0d05 +6572,40747e26 +6573,b47a5b0b +6574,22a90964 +6575,46ca5d13 +6576,5f3b0d33 +6577,7f2a6e26 +6578,b50def99 +6579,a4b0880a +6580,1200eaac +6581,6bfca140 +6582,a0e6cac8 +6583,0b0d8e17 +6584,09d76b1f +6585,204f3b41 +6586,9e6f9d4c +6587,2894f55d +6588,36efd640 +6589,344479f1 +6590,d7b97ae9 +6591,d66a3937 +6592,76aa99a1 +6593,3d2d2819 +6594,0fa2fc45 +6595,794207ee +6596,68824abc +6597,075c7094 +6598,28a48dc8 +6599,fa4a8c40 +6600,097b37c7 +6601,e0d66692 +6602,f928b380 +6603,a30e97de +6604,46d142e6 +6605,1650ec7e +6606,c15c2c7b +6607,43e1c514 +6608,4e5907e5 +6609,087de773 +6610,58755e1f +6611,efb07026 +6612,8ae47e75 +6613,ae98d319 +6614,88b545ce +6615,fbec269b +6616,5dc94fd8 +6617,874286d9 +6618,db8e9493 +6619,4a02655c +6620,57d99675 +6621,88eb1194 +6622,8b354429 +6623,bcaae66c +6624,f02a7341 +6625,e4516651 +6626,39c7e300 +6627,f8fe76a0 +6628,f4505fec +6629,75979b6c +6630,94244f9c +6631,0a85329b +6632,23cb8f2c +6633,69087269 +6634,a499dcc1 +6635,a702113d +6636,6b8c62ff +6637,089bc281 +6638,3396dbb6 +6639,ad390f4b +6640,fdfb0921 +6641,b83c2368 +6642,355cca49 +6643,0a40fcea +6644,ce325511 +6645,f6ba310a +6646,bb342d0e +6647,62cabc80 +6648,b1b634c9 +6649,864b3eb1 +6650,21f533f0 +6651,2c7317f2 +6652,7aef0695 +6653,c0de479c +6654,e221b1ac +6655,bcb23834 +6656,794f3def +6657,6818bf3d +6658,9d5c327a +6659,180476b1 +6660,7a6a3eaa +6661,8c241260 +6662,cf9c13e3 +6663,09a57b8d +6664,69c96bfa +6665,76370a3e +6666,490c2f45 +6667,3ed7d2d0 +6668,d4f9f9a0 +6669,fcb989cb +6670,d005e68c +6671,92536ea5 +6672,c1d9c57d +6673,637406ad +6674,0b6e3c77 +6675,52a47595 +6676,c89dc9e1 +6677,91f0aac2 +6678,4cbcd024 +6679,d01b7a3a +6680,a3cffb33 +6681,4a9904c2 +6682,626404f6 +6683,d551c0b6 +6684,07c43408 +6685,854fe7a1 +6686,2a95dce3 +6687,e1efad53 +6688,5c7a75a3 +6689,7336e9d7 +6690,55acb49e +6691,d1a13efc +6692,1a689f4e +6693,7a0afcd0 +6694,2a07a4bc +6695,13e58396 +6696,efa8918a +6697,15b152c3 +6698,46b0fbc0 +6699,ed67d756 +6700,4a3db216 +6701,a83782a6 +6702,b957a1eb +6703,67780703 +6704,c4ec4414 +6705,3be11028 +6706,710ca9ec +6707,b5737530 +6708,ecadfb65 +6709,749329a0 +6710,c74e2e48 +6711,0476836b +6712,99b75f7a +6713,b59238b6 +6714,3b1b309b +6715,c53308ef +6716,60f3aef3 +6717,3df932cd +6718,b29d882d +6719,89c350d6 +6720,e680442d +6721,202f919a +6722,5392adef +6723,b3d16eb9 +6724,e1b0975d +6725,684ace94 +6726,10bb4e77 +6727,60727d02 +6728,7ec3964b +6729,06b59cf1 +6730,f6135940 +6731,bc0f8cff +6732,89d0ad00 +6733,34c1e051 +6734,438f38de +6735,d65e041c +6736,addbba50 +6737,a307ab70 +6738,43acab12 +6739,1a629649 +6740,dd6a54d9 +6741,c94ffee4 +6742,c600faec +6743,acf93b0e +6744,bb937d28 +6745,808af667 +6746,4dd01f34 +6747,672260ae +6748,d24cd06e +6749,b6abea9c +6750,98b79ced +6751,9e00c4af +6752,6eb5c92a +6753,9398eac2 +6754,76432be2 +6755,a2b00bf0 +6756,7f8255eb +6757,a8570e0b +6758,525453fb +6759,fa0f7123 +6760,8ad93892 +6761,82097aa4 +6762,17289c67 +6763,73679fc8 +6764,6894b68e +6765,33487a92 +6766,82de7b48 +6767,80502ecd +6768,a71ebf6b +6769,7c11a3f7 +6770,5125e7e3 +6771,303d3033 +6772,ed767ffb +6773,76d8c2a8 +6774,b624dbe5 +6775,ee169c17 +6776,46d58f2e +6777,01dfb931 +6778,cba3bf8b +6779,878d79ee +6780,d1b43ce0 +6781,b161c095 +6782,e436cb96 +6783,05eb5e60 +6784,f600e2d8 +6785,2e8a63e0 +6786,6ea0933d +6787,7f410570 +6788,b17c11e6 +6789,f3133dac +6790,a82dfd9c +6791,61b474a6 +6792,48952a50 +6793,ef7a015a +6794,9a1f2601 +6795,c555f426 +6796,17d53322 +6797,a5c2ec00 +6798,29341572 +6799,7f74a2b7 +6800,46e4b7da +6801,f7f482db +6802,b2c08b6e +6803,4259b7af +6804,64f2d5d3 +6805,67a5c65f +6806,e0965601 +6807,2ae828a6 +6808,78a669b8 +6809,4b4b59bf +6810,307032f1 +6811,762e0b11 +6812,11ff4b26 +6813,fc8f21fb +6814,8682ef1f +6815,ffb1b463 +6816,d38b4052 +6817,c85d954b +6818,3fd614cf +6819,11d9f541 +6820,54df1a5d +6821,ef20c181 +6822,746ed098 +6823,b9bd0e01 +6824,450e3c8f +6825,d7ee67bc +6826,c8a16fac +6827,66419d21 +6828,01d3ad57 +6829,30d31e0f +6830,a0b1f605 +6831,48380242 +6832,8b6a85d5 +6833,879ea588 +6834,7cac30c9 +6835,4cf6c649 +6836,e6b91f5e +6837,46f0d907 +6838,13755fd0 +6839,30023898 +6840,9060f7c8 +6841,5b288cdb +6842,aff4e468 +6843,0b0b0f32 +6844,26ac90af +6845,7edd70b9 +6846,eae8481d +6847,4a6a32e7 +6848,4d95166f +6849,08209212 +6850,3b95f93b +6851,b8da6034 +6852,3cfc87c9 +6853,db1ec293 +6854,cc28bb54 +6855,3a90d130 +6856,29137bfd +6857,e7357173 +6858,febeff40 +6859,0a701072 +6860,86bf74eb +6861,ecf35631 +6862,bd1b1c34 +6863,8cbf4192 +6864,c90f3578 +6865,f694481e +6866,17878aaf +6867,8f277c4f +6868,b97681e1 +6869,80de7557 +6870,c7a81891 +6871,0bdf6e44 +6872,71578ef8 +6873,18c72991 +6874,da2a6cde +6875,3dcb7b81 +6876,1c73cf80 +6877,a9f54727 +6878,bc7f6ecd +6879,91e19a18 +6880,5383e624 +6881,dd06b6f2 +6882,e8c43fc0 +6883,1d828538 +6884,b9cbdc49 +6885,bd2fd639 +6886,beb8560e +6887,deb7f0ce +6888,5a141fbf +6889,dcf052c8 +6890,cb524e52 +6891,b42f2d19 +6892,99d26bb7 +6893,6cb035dd +6894,86c7ea82 +6895,dfb16e99 +6896,222a2c11 +6897,5a5249c2 +6898,dcc2b33f +6899,7d9ce6db +6900,6a9297f4 +6901,ba5d3476 +6902,498e31ae +6903,25a04cec +6904,91815abe +6905,af8529ff +6906,728b98cc +6907,16fcff8c +6908,da626c37 +6909,3ef8e1b5 +6910,0d224e13 +6911,3b685844 +6912,22b17001 +6913,1a201b34 +6914,9f8fb7e5 +6915,fefd29ff +6916,f9bf9986 +6917,722916a8 +6918,b889da10 +6919,5b4e137c +6920,c030d83b +6921,1e3dba5d +6922,7143e9a8 +6923,838768e8 +6924,54e53fd6 +6925,32c90036 +6926,da9025b9 +6927,debb7805 +6928,b4dec97b +6929,5497271a +6930,9374c071 +6931,47f1c189 +6932,71447f08 +6933,f516161f +6934,5cafbece +6935,8bc2d552 +6936,02fa5937 +6937,24891e97 +6938,247e88dc +6939,d50f3c17 +6940,747f7cd1 +6941,9f95e720 +6942,0cb2b96c +6943,320faf21 +6944,d0e28115 +6945,528b5152 +6946,cbc4c107 +6947,aba1d3c8 +6948,7f737ab6 +6949,af07f13f +6950,16172882 +6951,ca2170e0 +6952,089afc4e +6953,2e84dd03 +6954,6837c867 +6955,000c3dfe +6956,24fa3202 +6957,9b66f1c8 +6958,58c1b4cc +6959,8c5cccb7 +6960,7254c454 +6961,70868db4 +6962,a63476a7 +6963,97448337 +6964,eecdfd91 +6965,318ef42a +6966,f51b685b +6967,375fbc05 +6968,aa7ec4c8 +6969,3ea1efaf +6970,145bec0e +6971,9b281712 +6972,e2c08503 +6973,2d05bcbe +6974,b0b0d7ce +6975,45a1f314 +6976,834ef76e +6977,4347ed6f +6978,2fad081c +6979,0c2b5eb7 +6980,dd43be92 +6981,b23c296a +6982,15d9633c +6983,667c0223 +6984,90468077 +6985,a3510a7a +6986,da6a20ce +6987,944fa132 +6988,430bd9d4 +6989,dfe519be +6990,26530441 +6991,f4e38168 +6992,9438d5e6 +6993,9da1eac6 +6994,d9652ae1 +6995,37b1e05f +6996,51ba0e95 +6997,e32c8e6e +6998,d3405cc3 +6999,bfc6af76 +7000,6a90f4b6 +7001,54bd635e +7002,24cb8e6a +7003,8018949a +7004,9c245f36 +7005,1bd96b44 +7006,98cdc6ef +7007,18624943 +7008,4d404878 +7009,34c5be99 +7010,3bff26e4 +7011,4b8cdfd4 +7012,18fe0e82 +7013,26ef8e6f +7014,174f1891 +7015,20c22070 +7016,190fdf8a +7017,41bf806f +7018,a9203f50 +7019,b0aae85e +7020,cea0a7aa +7021,39062994 +7022,171b6282 +7023,044cb087 +7024,caaa3fa4 +7025,76c4caf8 +7026,e2e6bd8f +7027,2c04a325 +7028,d91552d9 +7029,d014615d +7030,c567f4bd +7031,e5097aa1 +7032,43534b0a +7033,442ea4c4 +7034,cf03d6df +7035,6b43f508 +7036,c0896403 +7037,26905936 +7038,7e9d07c4 +7039,723aad6e +7040,c5334ee6 +7041,10d1de19 +7042,1b752b07 +7043,771fedc8 +7044,e1f217c6 +7045,df57dced +7046,2176ea8a +7047,c3750c37 +7048,f220ca45 +7049,bc1557b2 +7050,0957973f +7051,35826b42 +7052,67485927 +7053,bb3eb027 +7054,7566fcb1 +7055,8e80cc62 +7056,2e4fa05a +7057,e54ca7fe +7058,7835b2da +7059,0bdfe9aa +7060,866b376d +7061,391a8691 +7062,3d347756 +7063,2310de01 +7064,88ffe166 +7065,48bda971 +7066,fcfd156a +7067,e8d12f38 +7068,26d365ac +7069,2d75cc38 +7070,99fb252d +7071,1767a2b2 +7072,ffba9eff +7073,6eedf350 +7074,e778cc4f +7075,209f2419 +7076,6dd5db00 +7077,10b55490 +7078,a3316a8c +7079,cec5a142 +7080,566dbde3 +7081,95692dba +7082,52c1d9b3 +7083,aaae4a65 +7084,c2d56d56 +7085,cd48f82f +7086,f69b92d1 +7087,5b46dfce +7088,bc4deb04 +7089,01d4df48 +7090,a00b468a +7091,754ef7e2 +7092,def92fe6 +7093,855afb67 +7094,6e11f181 +7095,873e6940 +7096,a735ea43 +7097,965f1a5d +7098,0a8768de +7099,a1dd233c +7100,53ed0918 +7101,4cf0fe5f +7102,e46daab6 +7103,10a690fb +7104,6798ca1c +7105,912fbb1f +7106,2f4cb65d +7107,e58c08a9 +7108,735a5dc9 +7109,d002d9c4 +7110,38a83e65 +7111,fd06d622 +7112,6b3a0245 +7113,6a38f33f +7114,bc02ac6f +7115,1d005fdb +7116,d6c60c09 +7117,0defabd5 +7118,689d4cac +7119,9951a944 +7120,544a5eb0 +7121,41fd7ea6 +7122,f8f3d250 +7123,c4d7035a +7124,990b5c68 +7125,5959e8f7 +7126,b280e530 +7127,5d270530 +7128,9daebf9f +7129,3abc1c38 +7130,b811fcc9 +7131,ccbcbf5c +7132,c904b73d +7133,29b12bae +7134,162ded9c +7135,6c54df87 +7136,ef8cf030 +7137,99b537ae +7138,f65a61c1 +7139,2ab951a5 +7140,68edd166 +7141,141e81a0 +7142,429a838f +7143,445c7dac +7144,222ae1e6 +7145,73409f94 +7146,c6553efa +7147,0fd5d659 +7148,62c1a666 +7149,28d32b29 +7150,c1d39de2 +7151,cf49283c +7152,0195d4cf +7153,a66153cf +7154,7de0f3c9 +7155,8177516c +7156,fa953737 +7157,0bc6eb0c +7158,ae099b62 +7159,09c26d34 +7160,e849bbc0 +7161,dd909a0a +7162,0c43c447 +7163,beacbb42 +7164,ed3e80db +7165,299b54ec +7166,ac01ebec +7167,626ae667 +7168,8cdb93be +7169,3a173280 +7170,77c2989b +7171,b71e243d +7172,201b716b +7173,22cde4b6 +7174,20c17c10 +7175,cc82f316 +7176,ca4456d3 +7177,12511aa9 +7178,f6aff9c6 +7179,dfa6b9fa +7180,02b5fc42 +7181,bda8c3eb +7182,363ff93d +7183,eac1af38 +7184,3b285b7c +7185,9b525a8a +7186,665c25e0 +7187,54fd8112 +7188,c71760bc +7189,a70cdb3d +7190,0d07c4f7 +7191,c9201150 +7192,94d638f0 +7193,691db85f +7194,898b8b5f +7195,236029d0 +7196,ab07549f +7197,260a0368 +7198,e261cdfc +7199,70d254ee +7200,e4a47be6 +7201,966b1045 +7202,38d9d62e +7203,d5843a6a +7204,1b0c40a8 +7205,b276a72d +7206,8d613fe8 +7207,1d210641 +7208,6372c6dc +7209,2f7bdebc +7210,11710412 +7211,7bcd5f33 +7212,05411efe +7213,5ef294d8 +7214,005339cc +7215,9fc42041 +7216,ce013bfb +7217,1f21fda5 +7218,2c600d5c +7219,d23a38c0 +7220,dd606a47 +7221,71e250fe +7222,31b77bff +7223,53fdde22 +7224,c5a068a4 +7225,7e92f0af +7226,b3ccb718 +7227,8a678398 +7228,ce6cdd5d +7229,c5f914eb +7230,a8eae234 +7231,5b129aa7 +7232,3e986f99 +7233,063963d8 +7234,4cf75941 +7235,1402f463 +7236,1570cf49 +7237,063833a5 +7238,dabe475c +7239,a2adc4b5 +7240,dab6eb42 +7241,fa747783 +7242,c61992a9 +7243,aff55332 +7244,ffae84bd +7245,11cba283 +7246,1455dd5d +7247,548b7450 +7248,ee338965 +7249,335b458e +7250,e25e002f +7251,bcb88a76 +7252,3b8c42d1 +7253,7bdfc153 +7254,73875970 +7255,c3f5f54b +7256,fcc4cd6c +7257,6bfb55dc +7258,f2f40882 +7259,07dcb03c +7260,93efc7ae +7261,0fac8002 +7262,08b16bfc +7263,6f04f814 +7264,c216d747 +7265,2b496d63 +7266,4b50ef83 +7267,9af2a9b7 +7268,fd296d7e +7269,eb356fb7 +7270,d519a0ac +7271,6662f4f4 +7272,3e67c6c5 +7273,3e7cff09 +7274,10a3fc8f +7275,610a5aa0 +7276,d2e04fb5 +7277,5ab34c4d +7278,107df611 +7279,6fabce69 +7280,3684888c +7281,5df7b51c +7282,ef3d7355 +7283,4b7bf5f7 +7284,4af0d26e +7285,5b84ed3b +7286,fa1fda6c +7287,86e8be7e +7288,fae87560 +7289,81a3b9c8 +7290,3ddfab5c +7291,bef5f4b4 +7292,3e4769eb +7293,b3a74b24 +7294,5d990a88 +7295,0b044bf1 +7296,bf1bdd06 +7297,a74684e8 +7298,53d8c625 +7299,535dba52 +7300,959dd0f6 +7301,4c64d7f8 +7302,af01cb36 +7303,8e4de597 +7304,4fdf545f +7305,251a0658 +7306,46f11f69 +7307,8f1336ce +7308,aa93f253 +7309,c36df64b +7310,2bea6c2e +7311,d6dfe145 +7312,eb6933a4 +7313,5c577877 +7314,0f26d4b9 +7315,22c78d13 +7316,6eafcd7b +7317,4fea39d2 +7318,ad6cfd80 +7319,eab12a47 +7320,3e911c7c +7321,125a9ffc +7322,c15b7498 +7323,6ec2f0ba +7324,8044aca7 +7325,a967c395 +7326,f4ab107c +7327,390ed566 +7328,b0132242 +7329,4aa013af +7330,c140102d +7331,e70cd206 +7332,7248b1ab +7333,00f009b3 +7334,630e6953 +7335,342b5aba +7336,60fc0dfb +7337,22786148 +7338,8ad61f1a +7339,038e37eb +7340,4a4394db +7341,6c5b1874 +7342,0455bf5b +7343,b0a038d9 +7344,fd9aacff +7345,ec54d7b7 +7346,cb2af439 +7347,d5d02392 +7348,67b799e7 +7349,cc0f5f85 +7350,f1fc00b2 +7351,39ded388 +7352,5e37dbbc +7353,36f10e68 +7354,a50969b4 +7355,d2dfcd7a +7356,d252e8e6 +7357,fc87ff66 +7358,062872d0 +7359,0f74b99c +7360,650c4c8d +7361,aa48cbe1 +7362,11677e59 +7363,cfc8e409 +7364,2d980ab5 +7365,45972aba +7366,bfd2ad5d +7367,e66800d8 +7368,052c3d49 +7369,850ef7d2 +7370,7b644e8a +7371,7dd1bed3 +7372,f870bd43 +7373,20126de5 +7374,f672dc8d +7375,a2f280b0 +7376,49a924a9 +7377,44836033 +7378,5ff5cbe0 +7379,cc54912f +7380,a8b1e2e0 +7381,1766462c +7382,cd459a2f +7383,f4b5397a +7384,ece2d7ea +7385,e89c7856 +7386,4633f4e7 +7387,25c8e353 +7388,8295a320 +7389,06d408f7 +7390,af30e765 +7391,1e1bf7b1 +7392,814e65f3 +7393,b4b9d72b +7394,c8b18a64 +7395,a9711291 +7396,66629717 +7397,4c3fe486 +7398,31be2725 +7399,c5c9d5ac +7400,a68c61bf +7401,f689d039 +7402,676a30df +7403,849ef3d4 +7404,20c5ed87 +7405,8746490b +7406,a116d196 +7407,bdc6657f +7408,ccac8717 +7409,60a24e7c +7410,d0a8d1bd +7411,e343177c +7412,b9bac1b9 +7413,1eacf97d +7414,c34e6245 +7415,26b4f907 +7416,9bd8c5a5 +7417,87587d54 +7418,9f489312 +7419,192f02cd +7420,224c3102 +7421,d4d71395 +7422,84b4fbf7 +7423,d08e5974 +7424,1c313f41 +7425,48450d60 +7426,037f61c1 +7427,8fdbff22 +7428,7af6cc61 +7429,8087b6f7 +7430,68f5666d +7431,4d9a7ebc +7432,5d5fcf1d +7433,f0310ab5 +7434,a021356d +7435,2e46b7d4 +7436,43ca858b +7437,3ea8aad7 +7438,517e195e +7439,f71dfa79 +7440,9a1c1690 +7441,f4d1c2d9 +7442,ca9b64d7 +7443,25da569a +7444,ad04ae42 +7445,3b8a0672 +7446,db23b60c +7447,cc015a8f +7448,895834bb +7449,9288191e +7450,e5770468 +7451,22162484 +7452,b50dbf64 +7453,824b112e +7454,969af4b2 +7455,1a6937fb +7456,d05c6e55 +7457,718c1118 +7458,87eddd44 +7459,2993aeae +7460,cd116004 +7461,6ebc9b91 +7462,2408561a +7463,e45c569e +7464,a73746fe +7465,43facdc9 +7466,3f174684 +7467,684fbe75 +7468,48fb3ca5 +7469,fb6e01ca +7470,334278b1 +7471,f0bac89b +7472,303e1db7 +7473,435307b1 +7474,41f6f66d +7475,5e1b2fda +7476,66155b64 +7477,e705e739 +7478,5fffa69b +7479,493c1a50 +7480,412b827d +7481,9cd5eee0 +7482,21451405 +7483,31e62597 +7484,fb1b18f8 +7485,97072f70 +7486,7a6daf34 +7487,96b639e7 +7488,aff32de2 +7489,addefdb2 +7490,801985cf +7491,e0a9bebc +7492,daa0a2f6 +7493,76c29350 +7494,b54799aa +7495,70df9951 +7496,27d37e25 +7497,b035d7de +7498,7864060c +7499,0be6a27e +7500,a5fdae45 +7501,d610f700 +7502,4f2a78cd +7503,b480fed5 +7504,408468ca +7505,d7b3a3e7 +7506,be726a71 +7507,d867fcec +7508,6597106c +7509,0b42ca68 +7510,33c3aef1 +7511,42a42382 +7512,fe73cc39 +7513,2f9cc487 +7514,b5f8623f +7515,f06d6b2b +7516,3823eb7a +7517,388cebf7 +7518,e228ca25 +7519,27ff933d +7520,b9f98fb2 +7521,ee4753e8 +7522,ceceb93b +7523,d729142a +7524,0824f053 +7525,18ad3f6f +7526,75d7c450 +7527,1f625346 +7528,2b393c4e +7529,1240e3df +7530,e3ceb5a4 +7531,1c6effa4 +7532,ead0046c +7533,8ba76600 +7534,9bf103f7 +7535,14e0fbba +7536,c2dd05fd +7537,1cff9ed2 +7538,26d72c77 +7539,e294d139 +7540,4aafe858 +7541,f6a71397 +7542,def8a06a +7543,2edadab5 +7544,f7094e15 +7545,efa062c0 +7546,6f0cd4ee +7547,22b009a5 +7548,5672ae4b +7549,47d8cec3 +7550,209a1968 +7551,00615bbd +7552,2eeed365 +7553,6db09afd +7554,a5903b4a +7555,f9914a3d +7556,b484b099 +7557,df474899 +7558,1600b572 +7559,a7aa72c4 +7560,1ff7f990 +7561,23116dc8 +7562,83515838 +7563,52426e7e +7564,c3adbd6a +7565,bc376a10 +7566,2c68b5f2 +7567,ab11122c +7568,f50ba651 +7569,9f86a4e9 +7570,6f7bb948 +7571,097cd867 +7572,31edf5c5 +7573,70ddf623 +7574,7687a959 +7575,837658e2 +7576,8b87c8bd +7577,b91e2cc6 +7578,f66c76ea +7579,00359d4b +7580,060c0ea7 +7581,4996c552 +7582,7d5ab09d +7583,258ea07f +7584,bb15dfd6 +7585,b4d7516e +7586,9627e29b +7587,d8ccfa5d +7588,5f25d39d +7589,21b6de46 +7590,7d45b831 +7591,b0301415 +7592,4830072e +7593,02af2392 +7594,9f46a754 +7595,5f14f86d +7596,8ce45783 +7597,4a3bf55e +7598,fd9755e8 +7599,5a850d89 +7600,8b3d1d6d +7601,48ddce9a +7602,7195f856 +7603,154f08bc +7604,bd7b7875 +7605,191bf919 +7606,6ba7d053 +7607,58744ddb +7608,705d4cf6 +7609,940b5f8c +7610,852efacc +7611,96181c0a +7612,bbdaaa24 +7613,72a74661 +7614,0378762b +7615,9bc3fa5c +7616,20b1115f +7617,7ea17685 +7618,5d68fc5f +7619,74cb7795 +7620,a9037f16 +7621,56609238 +7622,8c6c6405 +7623,25f21485 +7624,99ac3b42 +7625,958d4a80 +7626,4af592d4 +7627,887d203a +7628,4c9290fc +7629,7085ee14 +7630,5e074ff7 +7631,67c0d080 +7632,a85fe052 +7633,65e6c978 +7634,37436050 +7635,f69ca844 +7636,e25e3ac1 +7637,ab690763 +7638,bd112bc0 +7639,f9bf52eb +7640,0345f2a4 +7641,1105e8db +7642,9cafcb66 +7643,7f3b2467 +7644,1f6ab79a +7645,b5e85a90 +7646,a9de368e +7647,309bd626 +7648,8c3caeb5 +7649,f024347f +7650,8e641b3f +7651,a30e99bd +7652,16b7fc05 +7653,2a3bcfc9 +7654,2b8a88a3 +7655,9f881cdd +7656,db271c9b +7657,cf31ad51 +7658,fcee2c58 +7659,4ef83755 +7660,d0072ef4 +7661,098ea35a +7662,09560405 +7663,f3817a31 +7664,f810a01b +7665,1387c6b2 +7666,2f1480ca +7667,629e1b53 +7668,25867bf7 +7669,bb128b97 +7670,f1c1ec56 +7671,d31b07ff +7672,cefeca5a +7673,fa75d75c +7674,6e7c7de3 +7675,bd5dc426 +7676,51fdfe17 +7677,e6226357 +7678,a7e929e0 +7679,ed35ef0f +7680,ef5cf91b +7681,2d2dfb28 +7682,b15cc75d +7683,0ff3e78e +7684,a03b91c1 +7685,b636f589 +7686,47946bc8 +7687,376e1ab9 +7688,0a812307 +7689,7a60711c +7690,e77023a9 +7691,a8d70b21 +7692,1c9efbb2 +7693,bf157247 +7694,c3ec5dc4 +7695,4d63216c +7696,2eae7a58 +7697,19318cb4 +7698,2b53517c +7699,f422c566 +7700,6abd6b6f +7701,ea89dccb +7702,4c90102e +7703,e5a77436 +7704,00bdbe36 +7705,adda7b19 +7706,a597edc1 +7707,258b1112 +7708,0386ec76 +7709,30b7ab22 +7710,9e6d5cd3 +7711,8a8e0d62 +7712,5a30a983 +7713,22eaa58d +7714,9b2a6282 +7715,f57f5004 +7716,21b84df2 +7717,3a467efa +7718,ff1aaad2 +7719,9149f0da +7720,333eecfa +7721,81465e15 +7722,3f4d12e6 +7723,5fb04e70 +7724,72dafca0 +7725,9b811db4 +7726,4ac366c2 +7727,3d236f3c +7728,fdc5f9b4 +7729,4bcc67e4 +7730,189aa0a8 +7731,00f03861 +7732,82bbfbe2 +7733,3a017de9 +7734,f57b1d17 +7735,4ca59973 +7736,2ded6cd8 +7737,6686f291 +7738,0749e68c +7739,e6df511c +7740,d781ba94 +7741,8eabe077 +7742,95b12036 +7743,ac59ca52 +7744,a4fdd815 +7745,09f23910 +7746,7a91475d +7747,c88c6e49 +7748,929b97a2 +7749,72c117c8 +7750,d66743b7 +7751,38ef08a5 +7752,b96f6abb +7753,77aa2409 +7754,b42f3581 +7755,14780331 +7756,1394b18e +7757,a3503752 +7758,c6fce631 +7759,d3ff21f6 +7760,60033b49 +7761,481b6dfb +7762,e674ceee +7763,f61a1261 +7764,998d655d +7765,23249d26 +7766,1c35247f +7767,3e5ef32e +7768,bcf85cf5 +7769,2a9aef52 +7770,bbce6914 +7771,ca209b65 +7772,5b86fe20 +7773,2e9e1cf7 +7774,faba77c0 +7775,c5e52628 +7776,e1a89be9 +7777,dfa60e11 +7778,bb131d9b +7779,24fe4c7b +7780,f2136b62 +7781,4fb2a108 +7782,262eb262 +7783,df06cd3d +7784,e7d2576d +7785,a7c507b2 +7786,efc4d2a0 +7787,1bb4b7c6 +7788,a946eb78 +7789,d377c6ee +7790,356bc589 +7791,00b30bad +7792,3b19ef90 +7793,f82055c2 +7794,7e0e997c +7795,dd72ace4 +7796,bc49c5e1 +7797,cb6c57f7 +7798,517a1952 +7799,3e9f9e41 +7800,a98a13d7 +7801,f7b77b99 +7802,e76048e6 +7803,13544b14 +7804,30ae5c6c +7805,518085dc +7806,4e75b94f +7807,d3812b27 +7808,5fe25551 +7809,43ae8828 +7810,42f21dd7 +7811,6d4b1302 +7812,5be063cf +7813,da29cdc2 +7814,91c40ae4 +7815,4e6439c8 +7816,35f82f5b +7817,685f2097 +7818,206f219c +7819,93fa4406 +7820,a6bded1f +7821,2a477c88 +7822,da36ff0c +7823,27801a03 +7824,0d499f09 +7825,0b5c99f5 +7826,1f2b5a69 +7827,3b9c99bb +7828,af017c60 +7829,1739009a +7830,c11cbd37 +7831,e855365d +7832,1cc39b41 +7833,17b46630 +7834,e862b558 +7835,b9fc53b7 +7836,6c3f7560 +7837,f9bb695d +7838,6d555012 +7839,a4e28240 +7840,2fe51c6b +7841,4ef5bd79 +7842,9336a895 +7843,e615f729 +7844,083b53dd +7845,8ae60140 +7846,61b577ad +7847,cc2de5ea +7848,f9614261 +7849,32aacc28 +7850,8f1e9f91 +7851,cd50ecec +7852,8789ba16 +7853,00df2ecf +7854,1309a2d2 +7855,4e0ff14f +7856,4ef7bed8 +7857,af15c9ec +7858,a781f89a +7859,d40de0ab +7860,f36f4f4c +7861,9fab63ac +7862,1b87451c +7863,8de31d4c +7864,e94e210a +7865,4941f8ab +7866,6168f9b8 +7867,25f23cee +7868,36a06d48 +7869,4ab8692d +7870,f2c7fa16 +7871,c27c0cc1 +7872,3ac8f7ef +7873,6744d1bd +7874,dc66ceda +7875,27f502c8 +7876,42291973 +7877,a4b72e8d +7878,e46971d5 +7879,c0f7173f +7880,d68f4fc0 +7881,fd705f61 +7882,a8213fe5 +7883,05e3dcc4 +7884,01ca4a0d +7885,250c2d10 +7886,6a964c7e +7887,c65a5511 +7888,e5f192b6 +7889,4373f2ec +7890,63968f57 +7891,dae18dab +7892,67bdd8af +7893,e13ecb94 +7894,9945bdb8 +7895,29b06cee +7896,36a9ff11 +7897,be8d8ceb +7898,034432c4 +7899,94dfd51a +7900,294c63ea +7901,542766e9 +7902,c7a40e42 +7903,0a875699 +7904,334a6682 +7905,ba7ce666 +7906,5c732eb3 +7907,a3c812e1 +7908,333f68c6 +7909,36963a94 +7910,53295a9f +7911,90474d4e +7912,841346c8 +7913,441d81c6 +7914,9e318cd4 +7915,906134cb +7916,6eee97a5 +7917,135cd06e +7918,4b23cd1c +7919,9748c959 +7920,717af3f7 +7921,dc14d864 +7922,84727e50 +7923,535fb987 +7924,a8158bf1 +7925,73e5dcb7 +7926,41e6f23e +7927,414cb085 +7928,7c45ea8e +7929,29a71890 +7930,7faa0c0e +7931,0376c856 +7932,f376a4f3 +7933,a37fe832 +7934,ba6031f5 +7935,cf981316 +7936,9e7fb653 +7937,130a0d42 +7938,c3a34292 +7939,0363f31f +7940,ad4573b4 +7941,9eebd264 +7942,0df289c3 +7943,e7c0bec2 +7944,73adb9e6 +7945,3a981b3d +7946,4ecf773c +7947,3e93d51d +7948,21414c63 +7949,28118e98 +7950,e0a86ffc +7951,ed79d989 +7952,e5778b4c +7953,84e22a61 +7954,29424bee +7955,b4f8acc9 +7956,3491ad43 +7957,62ac19d6 +7958,80aaa0cc +7959,017a4374 +7960,d6d67a3a +7961,1348962c +7962,a534258b +7963,7011e1db +7964,60c272bb +7965,6f1e962a +7966,7b3669e7 +7967,0dcaee35 +7968,20134371 +7969,f16d2b8a +7970,0c83a509 +7971,23431679 +7972,c06df0df +7973,0e44a09b +7974,56ed8b57 +7975,b0952022 +7976,b6324a40 +7977,a7f21877 +7978,7ba00a05 +7979,0e849d21 +7980,ac69d2a6 +7981,3b79d52b +7982,05991979 +7983,131036b3 +7984,8bb3a81f +7985,7a7e5c14 +7986,d937ec98 +7987,a8126253 +7988,321ea290 +7989,8fb6b0a6 +7990,234c2ff9 +7991,cabc182b +7992,d470fb1d +7993,7637f16f +7994,6409b5cc +7995,6ef8dfc2 +7996,c81e3152 +7997,4cc2d9ec +7998,276f1e83 +7999,3e666296 +8000,04832458 +8001,2249f399 +8002,d9339aea +8003,cac6f4c9 +8004,4d2a1d3c +8005,4552dd60 +8006,38e298c0 +8007,db371cd4 +8008,894163d2 +8009,a783c26d +8010,076fb212 +8011,0440ec81 +8012,0c47a719 +8013,4df5a18c +8014,c6d77e36 +8015,a8bedd67 +8016,df57c445 +8017,a380353d +8018,e0d50c11 +8019,56ea2c25 +8020,b6e631a3 +8021,2aea61e6 +8022,cd45b0f7 +8023,ebe54dd5 +8024,8a77a1e2 +8025,b7634bd2 +8026,02a958c8 +8027,c750fbbc +8028,c83355a8 +8029,e23a9203 +8030,2233eea6 +8031,1d93d616 +8032,741ebc72 +8033,83de27e4 +8034,c3702a70 +8035,9b0d16ad +8036,1e271e00 +8037,4f9a264f +8038,b4ebd09f +8039,128213f1 +8040,d4e528b8 +8041,5b512ed5 +8042,e9cc328a +8043,dc4c8e44 +8044,ced7bc51 +8045,abdd3eec +8046,bdba4050 +8047,5b5dff7a +8048,10ca5afb +8049,878a4061 +8050,5d7522dc +8051,b236f8ab +8052,fc79f796 +8053,3ca954d7 +8054,51a469cc +8055,0dea512f +8056,d5f4e3c4 +8057,8f16ac75 +8058,afc93702 +8059,35550e8a +8060,2c23f795 +8061,a1327691 +8062,c78ac6b4 +8063,f1cbc366 +8064,5ed2b321 +8065,61f67bc3 +8066,6d3b481a +8067,4a1fdbbd +8068,2f00a4fc +8069,0e79fe58 +8070,aacf3558 +8071,571aaaa1 +8072,c41b27ec +8073,49eeb3cc +8074,2effe97e +8075,99308522 +8076,666637a4 +8077,95d56f1f +8078,7735ffec +8079,fe081d8d +8080,6bcc4b67 +8081,403428c8 +8082,7b2cb7f4 +8083,31d65246 +8084,cc0d764c +8085,86aec54f +8086,ff500825 +8087,510e59ab +8088,c5896bfc +8089,94ed1d34 +8090,a8e8adc3 +8091,9f8b0ca3 +8092,321c63a6 +8093,80032353 +8094,c845be30 +8095,4bdc3a54 +8096,41090d59 +8097,5d606d12 +8098,8c48312d +8099,3146c5d5 +8100,1e122d03 +8101,eca03edf +8102,058fdad8 +8103,1c957f05 +8104,598222e7 +8105,73385a34 +8106,75329c59 +8107,22918fae +8108,c5bf3fa9 +8109,18932daa +8110,caac4402 +8111,f66257b7 +8112,14790057 +8113,804aa19a +8114,64991e93 +8115,3ec761c0 +8116,a4d75a24 +8117,f34b2723 +8118,65c29682 +8119,47fc5fe4 +8120,c8860e03 +8121,7e30c589 +8122,6657265d +8123,e97fd6a8 +8124,af19e7bd +8125,26b17b1c +8126,3ef68245 +8127,339d4b70 +8128,a0eefb7f +8129,34d1f540 +8130,b92c75fa +8131,d41dd15f +8132,788d7545 +8133,4e5d9909 +8134,8860eefd +8135,27f97071 +8136,f56c7f62 +8137,c675275d +8138,b739ff76 +8139,d672577d +8140,d671f95a +8141,6280d9b8 +8142,60f26b31 +8143,ade0bb21 +8144,3c7fecfc +8145,da728110 +8146,4cf4d62f +8147,e5525a85 +8148,bb155388 +8149,a081a18c +8150,9b964de7 +8151,73dcc3dc +8152,d4d01520 +8153,aed2be7e +8154,5f7fbd4e +8155,48e312a1 +8156,f1586bc9 +8157,a257ede5 +8158,839c82bc +8159,0ed8bd18 +8160,83b5da59 +8161,f36edf75 +8162,bf0f55be +8163,7d55f7b1 +8164,8d9f70b5 +8165,2eb4536b +8166,2233b3b5 +8167,943bb5a7 +8168,b1a7af2c +8169,55b99e3a +8170,147e1f26 +8171,110a0c4e +8172,8fac7dbf +8173,48208028 +8174,4d78d08a +8175,94ccda3a +8176,5fb5d813 +8177,7cff2f0e +8178,83792b18 +8179,cb6a238b +8180,3a834d79 +8181,e5a19d89 +8182,6711fff5 +8183,2cbbce9f +8184,ce223757 +8185,2e496561 +8186,3b780f5f +8187,9162e859 +8188,52e5bba3 +8189,8f8093ed +8190,c54fe6cf +8191,3e65ffe6 +8192,fff96e90 +8193,e26b5001 +8194,7f06611a +8195,7a146f76 +8196,50468bf2 +8197,8824ca1d +8198,1ecb0135 +8199,2245910e +8200,43b2c894 +8201,a5d5b320 +8202,0118e120 +8203,cbc84b12 +8204,d6848f85 +8205,57d09b0d +8206,c704a143 +8207,02257577 +8208,0af42b01 +8209,cf505764 +8210,f2c14c4c +8211,6cc3e9a3 +8212,d3e483c1 +8213,111fefe9 +8214,b9b30643 +8215,1ab2b4d5 +8216,13bf97f9 +8217,6a40c9ef +8218,2bbc6993 +8219,bd432f39 +8220,2a4f4b47 +8221,0b624b95 +8222,b2a4236a +8223,b382bdd0 +8224,e8cbd564 +8225,03a71060 +8226,97d7e59a +8227,417e286a +8228,a60fa380 +8229,8dbf6229 +8230,bf14ab2f +8231,f7d60ffe +8232,5e15b104 +8233,97129f2d +8234,1636f7f1 +8235,ded0876b +8236,5f77b739 +8237,ba9e3083 +8238,6611b206 +8239,0375c36f +8240,23a1cc42 +8241,3d7605be +8242,52284f22 +8243,88597a7c +8244,35ba86ac +8245,2b6d321d +8246,0011e728 +8247,db10f51e +8248,00b761d8 +8249,2b0ac3b2 +8250,251143f4 +8251,4732fb66 +8252,a9d22d88 +8253,5509028f +8254,6399622a +8255,1576cc19 +8256,990de944 +8257,2d735dc0 +8258,d9a6259e +8259,101d30b9 +8260,7ec740bf +8261,e3f2456a +8262,8d432774 +8263,7066b3f4 +8264,6da1814c +8265,8f3c4df1 +8266,91eb83cc +8267,339deace +8268,734ed037 +8269,f4e8f885 +8270,341ef3b5 +8271,89d3ba9b +8272,e58a985d +8273,e38e965c +8274,bccf69be +8275,c7e224c7 +8276,aa1a3a1c +8277,7dd4357a +8278,b0623a3f +8279,505fe183 +8280,ad740a82 +8281,a053a858 +8282,07061cf1 +8283,d52ba073 +8284,89b9f42d +8285,0b0ba4d6 +8286,931f8e63 +8287,9507b039 +8288,2b2673a0 +8289,b0321ec0 +8290,9f3a5627 +8291,f548a010 +8292,3fa14de1 +8293,1984437d +8294,6115dc46 +8295,0ccaa41a +8296,8f1468c4 +8297,d2568ded +8298,cd259dd2 +8299,624c528f +8300,7ccc852f +8301,ba49ceae +8302,636aedd0 +8303,f1c8b10f +8304,29ae7bbe +8305,ecff56ba +8306,cb2abb64 +8307,3002f081 +8308,375dd8ee +8309,f78beb47 +8310,8185339e +8311,101d9e12 +8312,cfa301bb +8313,eb099adf +8314,6b3c8a79 +8315,56cc78fb +8316,7d6ecb2f +8317,2b5b4d31 +8318,64093936 +8319,3aea3387 +8320,1dcf1dbb +8321,2283ba9f +8322,3c489dfa +8323,b55f16a5 +8324,d9035ebb +8325,27d4e482 +8326,e6ac8eeb +8327,b5bf61f5 +8328,9c4f6aa8 +8329,035ea47e +8330,339cc678 +8331,c43018cf +8332,ddf1f575 +8333,f04ae633 +8334,789980d7 +8335,2da67869 +8336,48f86203 +8337,9617ec5a +8338,b4a4766d +8339,0219533b +8340,0f9ac6e9 +8341,dd1d14df +8342,aeda15e3 +8343,a95bed59 +8344,07b3c716 +8345,3e3e3307 +8346,412e456a +8347,d0f552fd +8348,1cc9712d +8349,9328a818 +8350,e7f0c5a6 +8351,ff83e5e7 +8352,260905e0 +8353,de318e31 +8354,b8534713 +8355,0e8792b8 +8356,f33ec4f8 +8357,c5ace169 +8358,4c3fb8fb +8359,361dc6e6 +8360,7df85826 +8361,23453dc3 +8362,9694dae5 +8363,0a711f8e +8364,b51fd143 +8365,ffe9a569 +8366,9b17ffa8 +8367,e89992cc +8368,252dbd08 +8369,1b478390 +8370,0dba08c9 +8371,b3a96108 +8372,4fad98a7 +8373,4057bdcd +8374,95c8292d +8375,a7e36b8c +8376,77cb4a42 +8377,a6d2be1b +8378,dd90a1f2 +8379,0d543002 +8380,9f9df354 +8381,7c0764bb +8382,e9916142 +8383,60cb2439 +8384,955b8f3e +8385,9315a905 +8386,21498954 +8387,28a91c14 +8388,8468f588 +8389,b5c48ef3 +8390,119c22fa +8391,986f6aca +8392,f30f55ad +8393,15be7158 +8394,315fca0b +8395,4da4c700 +8396,96a1d0a1 +8397,1a8ec44c +8398,9b930d62 +8399,90e5b9a4 +8400,e6fd487c +8401,5d3d2d60 +8402,081ad73d +8403,6da357c8 +8404,ac635781 +8405,6438df59 +8406,5988470d +8407,e63a1177 +8408,f5123975 +8409,173af11f +8410,084007c2 +8411,4842f919 +8412,f563fc7e +8413,4608c824 +8414,5fa5e4f0 +8415,112dfa97 +8416,5e59e6d2 +8417,ecf97b47 +8418,0efcba0a +8419,68e21fe8 +8420,0d0611fe +8421,3157dc98 +8422,f434b97a +8423,cc02964f +8424,464e95ef +8425,6ba9ccc8 +8426,be435e02 +8427,865b55cc +8428,a4d818c8 +8429,2d84feed +8430,97691985 +8431,c0599d4c +8432,f49c4c87 +8433,ad0c767b +8434,c6ac6851 +8435,0031716c +8436,38a1e8e4 +8437,05da344a +8438,1b3c9daf +8439,0404973d +8440,677bc030 +8441,19249f95 +8442,c775618c +8443,88c56fd7 +8444,853120b8 +8445,820efa6c +8446,d647393a +8447,3cf2df25 +8448,beefe529 +8449,7828ec35 +8450,f89ba044 +8451,28f90fe5 +8452,7f43f760 +8453,29ed5749 +8454,72b2c1c1 +8455,6b16c0ae +8456,759407d4 +8457,5e38720c +8458,abd99275 +8459,0563367c +8460,70687b69 +8461,ae325c09 +8462,0baf7ac5 +8463,6330d529 +8464,d0312ccd +8465,2ec927df +8466,5786e1a0 +8467,1b30a6e7 +8468,92ad7a61 +8469,310148ec +8470,04c7ee2a +8471,59bc1cf3 +8472,cbfb2935 +8473,4d3ee54a +8474,5c274a68 +8475,f4bb5ea2 +8476,c885f4c2 +8477,000f3881 +8478,853cc316 +8479,ec4c2af2 +8480,92b37569 +8481,b49a7df5 +8482,8d4b1dfa +8483,49d95732 +8484,0b3f9121 +8485,4240a2b2 +8486,f60534e0 +8487,09236382 +8488,d176f9b4 +8489,d91a0cf1 +8490,9c23531c +8491,a816337b +8492,733917c0 +8493,235fc352 +8494,d68dccd4 +8495,3a5f1967 +8496,8afc5616 +8497,6f9cae15 +8498,501c75ef +8499,7ecb1ce5 +8500,39d567c5 +8501,ba869298 +8502,debf129b +8503,8f3bf61d +8504,3d9d3459 +8505,54421e94 +8506,e00c8b1a +8507,c9bd30be +8508,39f33c7d +8509,2629402d +8510,6125b7d1 +8511,9c31f337 +8512,280e1b54 +8513,2b9608b4 +8514,848dd290 +8515,459236b2 +8516,51efa210 +8517,b06784d9 +8518,27c901a7 +8519,e8a89332 +8520,be98b3a5 +8521,ce7c0317 +8522,6f4d50a1 +8523,168a3127 +8524,0216d660 +8525,649a3f5a +8526,d0cb5100 +8527,c55494fc +8528,e14b9c6b +8529,1d53f37f +8530,4b1207d0 +8531,9ca40cfc +8532,2c336f3a +8533,93d43b86 +8534,46ae8006 +8535,2fda19d1 +8536,63836563 +8537,81a05240 +8538,47a07dac +8539,3c1fad23 +8540,caab38ee +8541,a98b07d0 +8542,084d548f +8543,382ff002 +8544,1a199a6a +8545,ae68267a +8546,207bd459 +8547,63c92360 +8548,6a22930d +8549,dda2a281 +8550,837c2cff +8551,ad1c6e4e +8552,ef7cff3b +8553,44c3ddd4 +8554,d6bed823 +8555,f1acfdd0 +8556,9e6191f9 +8557,b01ba1fa +8558,c46fc88c +8559,97cc758b +8560,651b05b0 +8561,5b158640 +8562,6c4e3e48 +8563,cd7ca847 +8564,1fef4e90 +8565,4bf10a47 +8566,42097580 +8567,513de284 +8568,ba1a5c10 +8569,5ff246bf +8570,bac85a5b +8571,15fe359c +8572,2ace9f2c +8573,38fd203b +8574,cfe1dee6 +8575,09ebcf1d +8576,944b0b9c +8577,05c5533f +8578,e18c6013 +8579,b9f8498a +8580,8c5d6885 +8581,364ccb87 +8582,c6083ce2 +8583,72a46eae +8584,eb1337e8 +8585,1b5036dc +8586,1fd7a41f +8587,45351e08 +8588,a89bd761 +8589,430a0b70 +8590,aabea7a5 +8591,95a9765b +8592,b7dc5224 +8593,f361fdaf +8594,fc87185d +8595,e453a7c0 +8596,72b50d05 +8597,bcd55e90 +8598,6427bd30 +8599,49604b73 +8600,2beed4eb +8601,76442438 +8602,9d4e0aa0 +8603,2e3e06bc +8604,c2ebd771 +8605,13601e66 +8606,1af68f04 +8607,692d33dc +8608,ea0c1c75 +8609,9a29c3df +8610,145b1aaf +8611,7140e855 +8612,5465a800 +8613,90a33772 +8614,69aa0236 +8615,48b5a51b +8616,e5aac4b6 +8617,5864e4d6 +8618,c63610b6 +8619,9a613729 +8620,943941e8 +8621,043d34b4 +8622,f55675ee +8623,4b2de010 +8624,0296d474 +8625,82ac08ea +8626,03981ad4 +8627,af5d2ad2 +8628,b585e44f +8629,b92c6aeb +8630,93ab36bf +8631,592916cd +8632,43067591 +8633,31ad0df8 +8634,786bb668 +8635,04129cf3 +8636,1664eeb5 +8637,83ef35d6 +8638,5f88eb36 +8639,4d0a2c36 +8640,01be3472 +8641,4373b2f6 +8642,2a9cc4bf +8643,7b708301 +8644,a748ee22 +8645,f7bed1bb +8646,7d07d77c +8647,9ba6fd54 +8648,33e11fb4 +8649,bb6bd939 +8650,43166cf7 +8651,dc553495 +8652,9e08d7fe +8653,9a2a73f2 +8654,de1ca99c +8655,f2b5f898 +8656,8da037a3 +8657,070e694b +8658,6021825e +8659,10c04fc1 +8660,5cb466a7 +8661,0cc65d1b +8662,210b1cd4 +8663,00dacb4d +8664,7468c6d6 +8665,faacf51a +8666,5779d5b5 +8667,3d421977 +8668,7bd25348 +8669,dd56cf9a +8670,722c1789 +8671,6d2e34e7 +8672,f321979f +8673,8f08f7e0 +8674,f56431b3 +8675,a1d5d663 +8676,9a2498c8 +8677,d3b14d4b +8678,adaa9143 +8679,6f5684c3 +8680,eec5e8cb +8681,212064b5 +8682,8f73474d +8683,011f4b83 +8684,b2ac9528 +8685,eef6e83b +8686,4e0ef222 +8687,18d55677 +8688,cea0a453 +8689,b0b56d74 +8690,cdbd3551 +8691,af1780b2 +8692,b90682ea +8693,3f29599a +8694,5454fec5 +8695,2a65f2eb +8696,2fd500d1 +8697,cbf9cbff +8698,eb40cc48 +8699,d9ba2e82 +8700,ff56404c +8701,228e80e1 +8702,b06d83ca +8703,72137cd9 +8704,8a3566e0 +8705,91227534 +8706,f2a336cc +8707,0562e11b +8708,b179b456 +8709,12f0e198 +8710,157b7fca +8711,3ca2537a +8712,94748d76 +8713,ca52af57 +8714,5b4c88ae +8715,93ff5984 +8716,019a22ef +8717,b57d087b +8718,b24f50f8 +8719,6914bcb6 +8720,1e34fc3c +8721,81e6f912 +8722,6b4014f1 +8723,52199e4b +8724,a1173101 +8725,feabd2b0 +8726,a9a2fa74 +8727,5d147c25 +8728,168ea67d +8729,2271dd17 +8730,76a1c7d1 +8731,398a6553 +8732,0bcf1fb6 +8733,779fe10e +8734,393fbda7 +8735,59413848 +8736,06648143 +8737,09f8b8c3 +8738,fa0d3325 +8739,aeb3127c +8740,777ca2aa +8741,602d8278 +8742,282c0f04 +8743,453e7591 +8744,b7cf15db +8745,748535fe +8746,5ed1b1cf +8747,9c1809b9 +8748,359c5fc1 +8749,d5da9a44 +8750,de4cd183 +8751,00f1fb05 +8752,6667d63a +8753,0a451dc8 +8754,741bf33f +8755,0bf117d8 +8756,5319a717 +8757,4d5e140e +8758,eed414e4 +8759,dc021b32 +8760,beb83837 +8761,54588046 +8762,6bf3dd07 +8763,85134e11 +8764,727a19b3 +8765,779cbffb +8766,e155a5fa +8767,bcc82020 +8768,f2bd5c47 +8769,9450ce46 +8770,494e9826 +8771,06961c74 +8772,e872ce6c +8773,9b4f6854 +8774,02be4853 +8775,f8ec7450 +8776,0b942387 +8777,d8f3987e +8778,0188124a +8779,bbb4a651 +8780,eeeef84f +8781,e1c1816c +8782,d37ab868 +8783,2e7a95a4 +8784,3ca1e34f +8785,9eaa0c27 +8786,90f95480 +8787,a569e155 +8788,ab0e1fd0 +8789,21720ea0 +8790,613c3041 +8791,fad7c055 +8792,c03d6a9e +8793,5d534c18 +8794,84996795 +8795,f6d9a543 +8796,88af0e65 +8797,6d2e5f22 +8798,257c111b +8799,0c7374e4 +8800,6f6bb26a +8801,f4c3d7b5 +8802,9e55e8b5 +8803,d17beb7c +8804,20fd0277 +8805,9c256c64 +8806,59424f81 +8807,77e65960 +8808,5e209232 +8809,4e6f7bc7 +8810,c042d8dc +8811,e3389518 +8812,2b5102eb +8813,5060b66e +8814,1f7fc0a4 +8815,b3b9deb4 +8816,fee4c2d0 +8817,ccf02702 +8818,32c6d2f2 +8819,7e2c8c63 +8820,b93c9a64 +8821,b5c59068 +8822,966cee24 +8823,1a431252 +8824,7dfbbc2d +8825,d9650209 +8826,e204ff58 +8827,d33a2425 +8828,530d02f4 +8829,4e7faa64 +8830,c2099bcb +8831,1a4c443f +8832,b88f80ce +8833,74192cc0 +8834,8de12eda +8835,270f1347 +8836,3ed31d39 +8837,3e05c019 +8838,c25033b9 +8839,37bc2cd5 +8840,2810f2a0 +8841,0585b30f +8842,103cc3fc +8843,e4c1d89e +8844,27afffb0 +8845,b44828d5 +8846,60b6da0b +8847,d2d67ecb +8848,45988b07 +8849,3d2de2e6 +8850,bff92ada +8851,0a26160e +8852,80e905dc +8853,c9980fc7 +8854,027ed6ba +8855,38b35d8b +8856,873092ce +8857,8ef95a62 +8858,8912ae03 +8859,9b5b1ed5 +8860,5e20409d +8861,ddcb346e +8862,39485217 +8863,4000e09e +8864,2c5d7ba1 +8865,a6002a63 +8866,c11addb4 +8867,26c918d9 +8868,75794425 +8869,6f5c372c +8870,dd34674f +8871,a4812707 +8872,2097df4b +8873,28cd655a +8874,7bd87a85 +8875,3677ba53 +8876,a3f8d1ae +8877,33f24d4f +8878,bf4ef7f7 +8879,9a8b9ffc +8880,aaa870ff +8881,00daaeb7 +8882,b4b69fb5 +8883,cbe58181 +8884,e867b17c +8885,a8e832b4 +8886,cbc07143 +8887,ab519ad7 +8888,607d8ebc +8889,cf02544f +8890,c7d40386 +8891,817309a4 +8892,6b28ebd2 +8893,57600e0e +8894,57f0eede +8895,cc6db1d5 +8896,d128da73 +8897,3abbb41b +8898,1cec73db +8899,bede9289 +8900,57ba40c3 +8901,0a274fd0 +8902,5722c45b +8903,c323caf3 +8904,551a84a7 +8905,395c4f8b +8906,8b9070bd +8907,f676ad19 +8908,2667986a +8909,3ed590ac +8910,e53ef652 +8911,9287ca0e +8912,b618f86e +8913,9b3be08a +8914,b098adc4 +8915,ed7795e7 +8916,00236e22 +8917,f7f91199 +8918,65aa19f0 +8919,38a79ed3 +8920,ed1e9494 +8921,2b840e3b +8922,04378087 +8923,95c3cc2d +8924,fe0ed522 +8925,74be4600 +8926,e1d74475 +8927,77a08744 +8928,b8fb15f0 +8929,bae81022 +8930,f062a73e +8931,ec3d5c03 +8932,9bdc2a30 +8933,7e2dc58c +8934,95eaf790 +8935,4fd071ff +8936,9ffb9eef +8937,3652d081 +8938,beed7fb3 +8939,9c602034 +8940,3c1e8f93 +8941,b7aa4456 +8942,de129576 +8943,42505a4d +8944,175d5201 +8945,89220d98 +8946,1b3ee1b2 +8947,e79eea10 +8948,6a6af260 +8949,daeca4eb +8950,991f12ea +8951,76c6d4bd +8952,673eb978 +8953,156ea18a +8954,02456b93 +8955,6557b4cc +8956,15869efc +8957,1a3a3556 +8958,67d84d58 +8959,b13ce567 +8960,a76519bd +8961,1f9c79db +8962,bb29a5ae +8963,176c6884 +8964,6b1578ce +8965,358ecd28 +8966,76bd9454 +8967,5fa88178 +8968,27ca4cb7 +8969,8de339aa +8970,dc9368a9 +8971,948f03de +8972,a921031a +8973,fad772f3 +8974,567bb5ca +8975,88c98a4f +8976,5fc5f7aa +8977,1362bef6 +8978,9b23b6cd +8979,b57b9f49 +8980,a98b6efa +8981,d72409bd +8982,dcd91b1c +8983,74aea134 +8984,c7655fc6 +8985,aa0e3d57 +8986,8c6aaa2b +8987,be01e1db +8988,0bfba18c +8989,5d0d9a72 +8990,3e10f5b7 +8991,2e84e48a +8992,06b26ca4 +8993,943a6b38 +8994,45e381cc +8995,e6b7fb80 +8996,6d2d9abe +8997,306efc54 +8998,e8947b11 +8999,02ae1a8a +9000,e53d0c1b +9001,817c316c +9002,470135fb +9003,e79c7221 +9004,51034497 +9005,2f6600e9 +9006,2b2135f4 +9007,77f2cd1f +9008,516d08ec +9009,ea5a272d +9010,bc587fbd +9011,dccff631 +9012,548731f2 +9013,f913e41a +9014,2359c352 +9015,5bbdcf9a +9016,62b47dd1 +9017,c1d89f20 +9018,4c3592d5 +9019,3520b82e +9020,c541083d +9021,bf7ca6c5 +9022,6b8d1fce +9023,55cc4bd3 +9024,d487421d +9025,857a3de7 +9026,388e59ae +9027,2ba8261d +9028,e6f96a1b +9029,a1a8dc55 +9030,04f75874 +9031,1ac0c476 +9032,dfb9069f +9033,4faa1a78 +9034,b12588e3 +9035,b7ab8406 +9036,8d0fd1f5 +9037,2b694b5a +9038,6ed074d5 +9039,9c3ae7a1 +9040,0325fc82 +9041,93efe260 +9042,50ed8c17 +9043,d9af4be9 +9044,f6ba8dec +9045,0531d88e +9046,dd5c1c82 +9047,cb6145e6 +9048,1f056473 +9049,43fd172a +9050,96be2e1a +9051,fff9f5e4 +9052,cd4a57a6 +9053,a5078c67 +9054,3f5fc746 +9055,b5a887a9 +9056,94eb64c3 +9057,9b340f31 +9058,24b9a762 +9059,083dea98 +9060,99fe1182 +9061,37057b48 +9062,8a824b80 +9063,a6dba917 +9064,6962d4fc +9065,c87eded8 +9066,b1f79615 +9067,e9f39263 +9068,eb7fd50b +9069,0839f1fe +9070,c0de57ba +9071,b873ae9a +9072,5ba52d31 +9073,5cfc57c4 +9074,4479b8d2 +9075,00fccf1d +9076,507024fd +9077,c0412879 +9078,033be534 +9079,2416debf +9080,2f91daaf +9081,e849c6a0 +9082,a32e68f8 +9083,a4033588 +9084,6967b7cd +9085,78d8504d +9086,933d223d +9087,ede2955f +9088,697472d5 +9089,70f88825 +9090,1c4ffb20 +9091,4d7c0c02 +9092,30cf08a5 +9093,efae8009 +9094,ec9ed9f5 +9095,427ceb4f +9096,4826f7b7 +9097,dc61bc12 +9098,7d02897b +9099,a509a3e9 +9100,4839b4a9 +9101,4cac0356 +9102,3f6b6a51 +9103,07cb0622 +9104,083e84b3 +9105,a3184595 +9106,be47f937 +9107,ae656c3a +9108,2f83cea2 +9109,73f34c89 +9110,f0d41ef1 +9111,f7f649e2 +9112,b7728e3b +9113,2ebe1f52 +9114,20ec742b +9115,18dc2bc2 +9116,d16b1360 +9117,5e3c38e3 +9118,82b75f80 +9119,355af055 +9120,822d4aa8 +9121,9d1d1aef +9122,cace82de +9123,bbccc415 +9124,5b70dd92 +9125,331687b0 +9126,7d0a9f22 +9127,3134ff19 +9128,70c807b5 +9129,310d2f9e +9130,ebb2fd6a +9131,6bf7b47b +9132,afb017e7 +9133,aef6aa21 +9134,5d82a08b +9135,1e760a15 +9136,107599f9 +9137,5b87e1d6 +9138,74da2539 +9139,cef39907 +9140,a1c87288 +9141,dfe91ec6 +9142,e97fcf64 +9143,c4b8a1b6 +9144,89168a93 +9145,e5ab34b4 +9146,c651f57b +9147,6573a05c +9148,dd459ad3 +9149,111cfb86 +9150,92094fa8 +9151,aa40ffc4 +9152,b4451aae +9153,53b15d6b +9154,b0d26aaa +9155,0a576fa9 +9156,7713211f +9157,d8df7984 +9158,e37eb06a +9159,2477c252 +9160,6c18757d +9161,3dc84b19 +9162,566c995a +9163,06e55a4d +9164,f56d268c +9165,f0a62c72 +9166,2a8f1fc4 +9167,169a3853 +9168,fdbb41dd +9169,1e56db99 +9170,2ef449dd +9171,82f1db72 +9172,b9d4095f +9173,ce08ab7a +9174,c339751c +9175,005b6707 +9176,57c1843e +9177,55a2cc70 +9178,05494673 +9179,a1968c6d +9180,99138504 +9181,421e3e31 +9182,ca02adaa +9183,8feb1954 +9184,471ecdb3 +9185,84fe7ae4 +9186,f460364a +9187,9b60475c +9188,cb9cdcb9 +9189,c3d7c22e +9190,3c699066 +9191,3c67e491 +9192,3ac697f5 +9193,bd15a48b +9194,8fada880 +9195,d2f9dbe4 +9196,2aac2492 +9197,194553d8 +9198,a28a4789 +9199,a65a6708 +9200,2198280f +9201,ae844378 +9202,f7744858 +9203,f19defd8 +9204,5f5b3e3f +9205,14fffc76 +9206,a43c4aeb +9207,44f94593 +9208,2bbd2171 +9209,837ef19b +9210,66050290 +9211,b2ff0b2b +9212,416117e9 +9213,242e5e8b +9214,c66470d6 +9215,ca588187 +9216,8e5c2cc4 +9217,fe5bbc31 +9218,b172306b +9219,6c07ec51 +9220,c31620c7 +9221,d717e020 +9222,3acaf0d7 +9223,df85d03c +9224,5688a52c +9225,46e61427 +9226,376950dc +9227,f8608ea0 +9228,62a8f4e3 +9229,dada0fce +9230,760a2fd7 +9231,c4775c7c +9232,629a6483 +9233,0e0ec9ca +9234,22d58f2a +9235,7f0ec0d3 +9236,f58b5092 +9237,87598ca2 +9238,9ab6098d +9239,7dab4b80 +9240,1a91711e +9241,551803eb +9242,4fa27c8b +9243,c81fa8bd +9244,148d09fd +9245,c75d838e +9246,a84cdd5e +9247,e566195d +9248,214416cf +9249,3b7646b7 +9250,15d3d778 +9251,c887cd2f +9252,75825b7f +9253,c6bd3dae +9254,df97eec6 +9255,0917f450 +9256,05cb22cb +9257,ee5504c3 +9258,1f3ccccb +9259,792ae092 +9260,83718b6c +9261,764d0cb3 +9262,aedffd31 +9263,552b7654 +9264,6e0c2a9a +9265,74eeb461 +9266,177982ff +9267,4ffbdd58 +9268,17454cd5 +9269,92fdbc4b +9270,e9bc0c02 +9271,2f1a009b +9272,10b09dbf +9273,0cf537fa +9274,3cd818c1 +9275,1b853f3b +9276,18a0c328 +9277,b29a3480 +9278,99fb26e6 +9279,c86d5d68 +9280,d6255789 +9281,6b7221dd +9282,7ef134a6 +9283,54cf6f06 +9284,ca6d7387 +9285,490afd17 +9286,76d98e71 +9287,19d17e26 +9288,27c678b9 +9289,3b39de5d +9290,fc64c9fa +9291,bc629f2e +9292,28a35369 +9293,c57e3c0c +9294,a516477f +9295,d049fd11 +9296,8abafc69 +9297,873651c9 +9298,8209265e +9299,40ea104c +9300,1848e1b3 +9301,8c3669f5 +9302,4ca85593 +9303,2c38e913 +9304,57a29e30 +9305,8b5b33df +9306,07b0ece6 +9307,1bf90856 +9308,6aab54d2 +9309,f4364aa6 +9310,2314095f +9311,b1f6d57a +9312,c82833e7 +9313,3f200fbb +9314,ee310ea8 +9315,ebe6476a +9316,ca1a5997 +9317,dafa2644 +9318,8a757dfc +9319,252a45d2 +9320,68bf667e +9321,6d7187c6 +9322,1a93ea8d +9323,40526f2a +9324,ff443875 +9325,81e9d361 +9326,f0e01f96 +9327,56f9f2d8 +9328,da0784a3 +9329,a8e469d2 +9330,7e3478fd +9331,6f24481a +9332,0d65dfed +9333,847a72ba +9334,0f21d236 +9335,13e9183e +9336,d2b8996a +9337,3bae1636 +9338,18d2538f +9339,2bcb5390 +9340,1d38657e +9341,4c32a3a0 +9342,ec08fec0 +9343,120b8bb7 +9344,8aee1eb6 +9345,02eb024e +9346,1511945b +9347,a80daa19 +9348,2532344c +9349,a4800f0d +9350,5de15da6 +9351,7ff60f1d +9352,387196ae +9353,ba23a43f +9354,b17dac1f +9355,4d7a1689 +9356,dfecaed2 +9357,20cb77a2 +9358,52044ce8 +9359,7b7a7809 +9360,f0974795 +9361,5429d210 +9362,425cc36a +9363,d094082e +9364,9573c246 +9365,660f05e2 +9366,3e7fc1cd +9367,d67f9c9d +9368,57292ea1 +9369,d65a96d5 +9370,8a057366 +9371,9351f271 +9372,2a61224a +9373,228badac +9374,13d87da9 +9375,1979aa00 +9376,e8c4f63d +9377,ae192321 +9378,3f518080 +9379,8c20c68e +9380,b3452d7e +9381,97a63f05 +9382,5067daa2 +9383,191ed049 +9384,161d228d +9385,2a8b8c10 +9386,259b7399 +9387,64cfadb7 +9388,7f57fd4f +9389,ff705c24 +9390,463f6691 +9391,fe84bc74 +9392,979cb05f +9393,4a4b66e6 +9394,f6deadc4 +9395,633981e8 +9396,114f7447 +9397,12d32e62 +9398,8e72a101 +9399,45237275 +9400,f68508c2 +9401,5e95d8f1 +9402,65b88656 +9403,23026aec +9404,c91a1188 +9405,371eb509 +9406,39673d80 +9407,f931c05e +9408,eb7bf62d +9409,ef367c99 +9410,7b26961f +9411,e23e92be +9412,f4d939b3 +9413,2d9bfd98 +9414,0db1fb7a +9415,108a4a11 +9416,3f2c001a +9417,f3c2dbab +9418,bb3cd6ae +9419,fa841547 +9420,b09aa022 +9421,170b7665 +9422,c0bbe778 +9423,8dd15b9e +9424,d48a5e04 +9425,47168574 +9426,3712c741 +9427,a98974a8 +9428,42b8c4f7 +9429,8dd4f19c +9430,802b2afe +9431,15d305f4 +9432,4334e1b0 +9433,4fd83458 +9434,01bfed8f +9435,2f3746c0 +9436,75fdfd6f +9437,a137cb58 +9438,6fbf6b2a +9439,49369a57 +9440,5ad4913c +9441,b8d5e3ca +9442,40ddbe4d +9443,5006e9f1 +9444,edaa3a07 +9445,37b524ac +9446,48394ea5 +9447,ff4c70b2 +9448,08dc72a1 +9449,f74ec9c7 +9450,6fc53b5c +9451,c4afe8f2 +9452,d7908961 +9453,c78cbc6f +9454,a31e2cc4 +9455,51e63c66 +9456,1182f9a4 +9457,5a61ac3b +9458,b6cbce1a +9459,3e7ea85e +9460,07fb2a4c +9461,f3abd6a0 +9462,69586c4b +9463,f939bd23 +9464,fc75bd38 +9465,c298d44b +9466,0f26da55 +9467,a9994541 +9468,fd2443c5 +9469,b70b7033 +9470,811c9a59 +9471,4d51faaf +9472,57745f0b +9473,ac224b64 +9474,fd066835 +9475,41aea3fe +9476,c118dc33 +9477,df1cb811 +9478,68a52191 +9479,681605ec +9480,c2cea50e +9481,6e58b236 +9482,ecf98365 +9483,6697edcb +9484,ae5b6aa2 +9485,1b42cc0c +9486,7ad62bf7 +9487,8171194a +9488,db35affc +9489,4cb2ca04 +9490,972b1feb +9491,3046746c +9492,61d507be +9493,073a3653 +9494,0ad971e9 +9495,ba36c0ac +9496,5a86911c +9497,97d7b5c8 +9498,fc2e33a9 +9499,750ab182 +9500,f12c36f7 +9501,eac3909b +9502,a952ce22 +9503,53a97c26 +9504,16770d44 +9505,e48eb2b3 +9506,fe71459a +9507,7ac09923 +9508,23a1a0a4 +9509,4599091a +9510,53871568 +9511,717f085d +9512,c7b44c9a +9513,898c15f2 +9514,66006e0c +9515,0ab7f10a +9516,6ca708f8 +9517,a73276a1 +9518,73cbb438 +9519,5a628ddd +9520,2782e470 +9521,d7396deb +9522,b5dd1c77 +9523,782d0762 +9524,135d596e +9525,635a22c1 +9526,4998d6ab +9527,53578a9f +9528,ec7ed2a6 +9529,d5da4745 +9530,aa094f0b +9531,23004e3d +9532,6a4f5680 +9533,eb9e14cd +9534,5bb512f6 +9535,b2d433ea +9536,71bcb4c0 +9537,854590fa +9538,58dacd99 +9539,12cd5743 +9540,54791a38 +9541,40d18ec5 +9542,a985cc19 +9543,32fb1fac +9544,720b61d2 +9545,10802d56 +9546,1c75e585 +9547,44e5ff91 +9548,e8d56648 +9549,5f8c3725 +9550,8e4576a2 +9551,44129992 +9552,85755409 +9553,b92fe35c +9554,dd94dd0e +9555,dd8e3a94 +9556,03ec6c2a +9557,6f8727e2 +9558,83673ae0 +9559,faa341f9 +9560,5a5bd464 +9561,21fa481a +9562,ca58dfdf +9563,e8a1e837 +9564,693beff7 +9565,2e10c23e +9566,c31cbc89 +9567,bf11ba01 +9568,6b8cf305 +9569,67a1a646 +9570,54c95d7c +9571,062200d9 +9572,5e66cf96 +9573,cb1f5f6a +9574,b0633812 +9575,d161bf8a +9576,6d7a8fc3 +9577,562ac5a6 +9578,038320fc +9579,e7b60345 +9580,c72572ba +9581,38fe2ea7 +9582,bcf1a8c6 +9583,2f42ed88 +9584,417e07da +9585,1e6bde5c +9586,e3acdccf +9587,ee0a4caa +9588,52e2f692 +9589,1d288636 +9590,3b6f0409 +9591,2a0503f4 +9592,6a88a191 +9593,bfd6b33c +9594,47f19b0a +9595,17aec0d7 +9596,4d537309 +9597,99b959fb +9598,a657affa +9599,fff86ad5 +9600,dc5f072a +9601,1ec379fc +9602,58a41854 +9603,01e66490 +9604,4ee5f15c +9605,50593c4f +9606,738df364 +9607,be0e6d6f +9608,fbe15249 +9609,d8666299 +9610,83f33314 +9611,caa656d4 +9612,074cbb5a +9613,707cd299 +9614,7d6a97ad +9615,19f691b1 +9616,cfbecc8d +9617,820d7996 +9618,c003abf5 +9619,bad940b8 +9620,a11acf10 +9621,37cded92 +9622,c14f0dd4 +9623,e06a6c63 +9624,6f4142c6 +9625,a1596deb +9626,13f1fa15 +9627,db08fa9e +9628,81c2f657 +9629,c9ef1406 +9630,7b73b3d1 +9631,22255cf9 +9632,b7f5239a +9633,1131b51b +9634,435b5eec +9635,c75446be +9636,354de7ce +9637,59e82c98 +9638,9f4c033d +9639,1fe25dc6 +9640,421bc970 +9641,f252a546 +9642,c2dd9423 +9643,e4115074 +9644,c8995742 +9645,f601f1e0 +9646,abda051d +9647,72627b2d +9648,0a2a9e11 +9649,2f36a717 +9650,bc81e73a +9651,bf8eb97e +9652,1276ef9c +9653,5aac4ae5 +9654,65f3e0d9 +9655,545a9c53 +9656,08ed5e0a +9657,3e22a9c4 +9658,a75ae431 +9659,b4836b6e +9660,a5e51ce2 +9661,094fb7e9 +9662,289d968f +9663,a1227570 +9664,b4f99888 +9665,f9f8e139 +9666,35465b81 +9667,3b966ae4 +9668,3ffcd749 +9669,0b56da75 +9670,6b404514 +9671,451b5a64 +9672,722996ec +9673,6a4bbec8 +9674,d2f1d8e3 +9675,72e92eea +9676,ccee3cd5 +9677,c0db1824 +9678,69a8f45b +9679,45d3b94f +9680,c651f69c +9681,606783f6 +9682,25ecaca9 +9683,1d12bfde +9684,18cd9b67 +9685,140da0a5 +9686,f5e2baf3 +9687,3e504ef1 +9688,adb89ba5 +9689,a4dc9b48 +9690,260dc227 +9691,a7df5514 +9692,35e53e2d +9693,9d15d706 +9694,0ed590f1 +9695,ede5a3a7 +9696,338eca65 +9697,f81e8814 +9698,1be0db23 +9699,90b1c17f +9700,7d61333d +9701,56afea2f +9702,c9be9713 +9703,5ceffeb5 +9704,e1d74090 +9705,5b0d1cee +9706,619b06f6 +9707,80b13ed5 +9708,b6a729d6 +9709,8717af59 +9710,6c0b746e +9711,3529ae1e +9712,8d953d9c +9713,e3604411 +9714,cb7e265f +9715,38ea8da9 +9716,891a34cc +9717,f54c815d +9718,1b0b1186 +9719,8bc6c82a +9720,99289c7d +9721,70e0604b +9722,04e1833b +9723,36379f92 +9724,018bcf64 +9725,96ecb640 +9726,bc3c8fe7 +9727,324188ec +9728,71da31e9 +9729,92d5eeca +9730,a226f55b +9731,45178850 +9732,0b07db48 +9733,48113cba +9734,d805f8d3 +9735,6fb08939 +9736,89d7b6a9 +9737,02327323 +9738,6ec86502 +9739,3f964b85 +9740,7e27034c +9741,24d97a97 +9742,ab2421ff +9743,bf5137db +9744,742e277d +9745,85537775 +9746,470f77ca +9747,333989a2 +9748,4562a53c +9749,4149c4e4 +9750,23ac31b0 +9751,b45368c1 +9752,656d71dd +9753,c9d15a60 +9754,772a4b70 +9755,2494c5ea +9756,43e08e14 +9757,9be3d895 +9758,412570e2 +9759,055a3c98 +9760,a49bbae6 +9761,03724333 +9762,47d36913 +9763,a24b6777 +9764,4caa3689 +9765,a2d56103 +9766,42771c0b +9767,26bd2b0e +9768,f38be10f +9769,11d5c234 +9770,73b0be1f +9771,9da9b57e +9772,35724b6e +9773,e5997fff +9774,f22b9336 +9775,519c1663 +9776,50833461 +9777,99ced6c8 +9778,d3795d55 +9779,916a072c +9780,adb9b087 +9781,2c414e9c +9782,64367e78 +9783,bc5440d0 +9784,9fc9828c +9785,d6f3bf33 +9786,d36d8c07 +9787,f7668db5 +9788,7e5484c9 +9789,3e2d3358 +9790,20883d41 +9791,23465aa7 +9792,920fddcb +9793,caf62f3a +9794,10ada412 +9795,73d14ee6 +9796,fb16563d +9797,2a4dcbe4 +9798,8897d89e +9799,3b3c9c06 +9800,671b9436 +9801,cf05926f +9802,d8780005 +9803,03c587b8 +9804,84d9c355 +9805,fdfdc4e8 +9806,ea5d1f2f +9807,4e7b4545 +9808,9d6c5951 +9809,969a96a9 +9810,313057ed +9811,1c102d25 +9812,b57727b6 +9813,eb80e1e5 +9814,fbbc6971 +9815,1fcfc819 +9816,bf48583e +9817,7c4c3b32 +9818,eaafa1c9 +9819,43dbf44b +9820,414731b5 +9821,7e194d76 +9822,9f0dc01c +9823,f47d3b2c +9824,0e1e302b +9825,d2f86632 +9826,72fd73a8 +9827,72732cf0 +9828,ffe59a47 +9829,37ede554 +9830,64f7a20d +9831,b1e771c7 +9832,797008b0 +9833,f3528747 +9834,0b009973 +9835,f883db6e +9836,f84ea5a9 +9837,354a8254 +9838,67f25d77 +9839,c7e17c72 +9840,00209f65 +9841,f2a72b37 +9842,f958a0d8 +9843,bce58673 +9844,f4c85336 +9845,4a7c58d6 +9846,025b57d4 +9847,0096d05e +9848,6b3b0fa8 +9849,45d5e8a9 +9850,155b43c8 +9851,37ed20ee +9852,518ffb5d +9853,306d5421 +9854,8c3ca8f0 +9855,5f90786f +9856,a8693bcc +9857,f344123d +9858,c7bbfed4 +9859,478f98fd +9860,d57eedab +9861,a3976cf6 +9862,415416d9 +9863,7fd0f993 +9864,2dee075b +9865,8bf4ef6c +9866,fcb24f18 +9867,f6da2911 +9868,399ee130 +9869,ae58666a +9870,cf006a8f +9871,edf78791 +9872,af29bdec +9873,cdc696f0 +9874,74acef21 +9875,49291a71 +9876,6188425d +9877,a8c6a9aa +9878,0b1e82ee +9879,1ae84d79 +9880,cab57b40 +9881,e544bb6f +9882,b801dd3d +9883,0d633ac2 +9884,47a0336c +9885,9a82a506 +9886,c7e386ec +9887,579957b6 +9888,d5f796d8 +9889,90a2212d +9890,9faac12a +9891,a48e0f00 +9892,fc8e4252 +9893,32979c14 +9894,c6eaa94c +9895,8665d138 +9896,a73e5497 +9897,af3674f4 +9898,7170b536 +9899,f1464e77 +9900,3af2ad76 +9901,46e5df67 +9902,e79860d2 +9903,05a29284 +9904,5eb3efe7 +9905,07a5c388 +9906,b8695e6e +9907,bdba9f3e +9908,3203a279 +9909,2176abfa +9910,88b6ad57 +9911,0b5a01c0 +9912,0d63fa92 +9913,cb6590b2 +9914,c88b4f46 +9915,a1a03a41 +9916,df1ba99f +9917,2ac86aa6 +9918,8a0b4f6a +9919,0beac709 +9920,83838fcd +9921,7e03e861 +9922,583292b1 +9923,b20e94c3 +9924,66afe3de +9925,8c30d644 +9926,7bc72b22 +9927,4730062f +9928,6bb5aeb3 +9929,cca323fa +9930,59386015 +9931,a1dcd291 +9932,ee0870f2 +9933,b45879bc +9934,6d323ca7 +9935,e2bd1a80 +9936,c2d8d4d7 +9937,432a02b7 +9938,e0aae338 +9939,f908c120 +9940,41d58929 +9941,739c0212 +9942,c0490e21 +9943,4ffbf7e0 +9944,38d99e7e +9945,9b146a01 +9946,05bdb9eb +9947,7ef59722 +9948,0522bc1b +9949,814a86c5 +9950,51c5e0df +9951,415be80a +9952,f432d03c +9953,2c5ddedb +9954,eb8ceb8e +9955,b388884f +9956,63357a6a +9957,67eb1e4d +9958,b134ed85 +9959,8fb475bb +9960,20be3b70 +9961,69db0f14 +9962,90df0701 +9963,0d72c5d2 +9964,4be756f9 +9965,1a4e96b3 +9966,0a6ca772 +9967,718695fd +9968,1d24d1bb +9969,3c9c6c69 +9970,5f76aa55 +9971,678850c4 +9972,da8e3d46 +9973,92f7df84 +9974,55e03938 +9975,0a41128d +9976,cc96420e +9977,2a73a740 +9978,91d61f55 +9979,b7305624 +9980,f0472bfa +9981,e34b50d6 +9982,3250be63 +9983,eb53f223 +9984,1db45e66 +9985,8fd9505c +9986,d377ca84 +9987,fea4e3f1 +9988,98ced4d4 +9989,c5240710 +9990,531f97af +9991,f860e217 +9992,1f55f042 +9993,8eaee101 +9994,16451bea +9995,3940baad +9996,dbb5817f +9997,2057e4b4 +9998,47350890 +9999,ab8a03d0 +10000,17b1f547 +10001,aa5bc981 +10002,0dbb5d17 +10003,7b72f377 +10004,9e14a3b0 +10005,f8c429fa +10006,77d0ce45 +10007,3b0d6167 +10008,3e4f8a49 +10009,b6a63edb +10010,eddb5813 +10011,f0eec31f +10012,711c2faa +10013,7a75c47e +10014,15a1008f +10015,2213a3c5 +10016,603d681b +10017,10786e3b +10018,7c4be7bd +10019,0d361f51 +10020,57198660 +10021,c5c2a7b7 +10022,9dd5069f +10023,c7870bc0 +10024,6b2ed843 +10025,9cba44c4 +10026,4f896dd6 +10027,aa190ecd +10028,c19a1b63 +10029,1ab62bd8 +10030,7a7aa105 +10031,20316499 +10032,f59ea3a2 +10033,e0c1c462 +10034,6a921206 +10035,74dc0e82 +10036,bfa1e553 +10037,48c66505 +10038,145a9d7a +10039,6e7bb5fc +10040,7260099e +10041,b2b967d3 +10042,421db297 +10043,a36fb7d9 +10044,3fb7aa36 +10045,16c340f4 +10046,4f6a98f7 +10047,d44340a6 +10048,a256f26f +10049,b5f53294 +10050,3401fc8a +10051,554ba564 +10052,fc19f6fa +10053,1363303d +10054,1cbb6893 +10055,2457cd61 +10056,ec130aa7 +10057,ebb12f2b +10058,a96bd88f +10059,ee257d63 +10060,7058c9eb +10061,1f20abae +10062,e63d7c4c +10063,d4c09b9e +10064,21bf0521 +10065,bf5c4d41 +10066,d19a2880 +10067,daa07694 +10068,d91eefc5 +10069,473a8e59 +10070,afcd363e +10071,b629ec51 +10072,e58649ca +10073,16f30cc6 +10074,967c7c5f +10075,bddbf7bd +10076,ec364b2c +10077,9b376f96 +10078,24b65d12 +10079,ce3549e5 +10080,dc6256fa +10081,0ec22523 +10082,7e343ff4 +10083,47d8dce1 +10084,574baea6 +10085,7b3d9bdc +10086,6389343a +10087,98f9db82 +10088,6aaff5e7 +10089,8cb15c1c +10090,c3ff1311 +10091,0054cb7c +10092,6a1c6c4e +10093,856f9813 +10094,54ad5125 +10095,f354a5aa +10096,258c2e13 +10097,c66e8302 +10098,33f0a6a3 +10099,7506aa6a +10100,5495e299 +10101,aaab3a1b +10102,5f6dbb89 +10103,559b433a +10104,e10cfc53 +10105,bcacd3e5 +10106,6f0af149 +10107,75cf05c1 +10108,6ddb95b7 +10109,47d3bd79 +10110,43229715 +10111,1cf59acc +10112,3eb26d31 +10113,08539a5b +10114,bf6f079b +10115,550749ab +10116,006777a9 +10117,1d32ced4 +10118,3845d2c6 +10119,a4c8481d +10120,fb6e74f6 +10121,fe7cdbc8 +10122,43afd0ba +10123,a6b504d7 +10124,6618825d +10125,e8891a31 +10126,720c2d35 +10127,0e27833c +10128,982937a5 +10129,fa46d347 +10130,4a40459f +10131,e3ff0817 +10132,a5027f16 +10133,97c56c6b +10134,a6a722a7 +10135,1f6605f5 +10136,8534f100 +10137,0b6877d1 +10138,2df0838e +10139,e7d34523 +10140,c7c99e2e +10141,d088a606 +10142,8a91508a +10143,4067571b +10144,253271f6 +10145,e9bde805 +10146,99f32e07 +10147,f30bd089 +10148,79b4cfd6 +10149,ff9ed808 +10150,4edd7a2b +10151,67cff703 +10152,adb18c27 +10153,fd9dae4c +10154,654b29a7 +10155,a8448591 +10156,983428f7 +10157,84affdf4 +10158,0011f240 +10159,7b40bc25 +10160,d7ed777b +10161,05985a50 +10162,49665c48 +10163,b59b623a +10164,bd6290c3 +10165,2fb70dd1 +10166,2e66a6e2 +10167,1acb3883 +10168,bf69e33f +10169,ad6a00c7 +10170,2e61a87c +10171,0fe998e1 +10172,c85afcaf +10173,bc2f3917 +10174,c5313c3f +10175,d0a064cc +10176,effffe14 +10177,73840413 +10178,a789c66a +10179,6f17acf2 +10180,c017c35d +10181,ee1a6825 +10182,6d65d4bc +10183,d7b2770d +10184,268df1d9 +10185,2383b40e +10186,7fb15921 +10187,32f82ae4 +10188,ec055785 +10189,49b842f9 +10190,7f3512fa +10191,4ef57693 +10192,f60968d4 +10193,fc1d9171 +10194,2c92b174 +10195,c55a964f +10196,7259d8c8 +10197,b0967ccb +10198,1fd02610 +10199,98b03a9c +10200,5c3244eb +10201,e2b6295f +10202,9e58d79f +10203,5f343cd2 +10204,a0788895 +10205,21d456f0 +10206,e1960c1e +10207,627e18df +10208,3d4563f7 +10209,eac9649d +10210,ddfb2a2a +10211,287d94b4 +10212,88cb2f49 +10213,786d08ee +10214,d250a3d2 +10215,d37f7389 +10216,1bcdf96a +10217,8f3a6174 +10218,2957e333 +10219,32a5e6d9 +10220,6c354589 +10221,f049ef33 +10222,3bd31baf +10223,0d278c05 +10224,f4357ae8 +10225,b9d5d066 +10226,418fa8bb +10227,b6ad89b1 +10228,2c288e73 +10229,42cb89a6 +10230,0a7483aa +10231,e949feb9 +10232,be76d61b +10233,1e457962 +10234,1a11f10d +10235,f0e22fbe +10236,88ff8902 +10237,02075256 +10238,f445f996 +10239,d71cf181 diff --git a/hashlib/test/fixures/xxh3_128.csv b/hashlib/test/fixures/xxh3_128.csv new file mode 100644 index 0000000..6a8aa50 --- /dev/null +++ b/hashlib/test/fixures/xxh3_128.csv @@ -0,0 +1,10240 @@ +0,99aa06d3014798d86001c324468d497f +1,5475b13fc0b8d7cf77ead0d66864b856 +2,69678912745c112c05c08cdb816da6bf +3,46dba47e4156ef81fa5bb15de9326deb +4,d1906609236b32ee279fc3d1d13bb06b +5,8b3de1383f8a636aa7392a60f9276fa9 +6,b08462f8071a74e872badba361c36316 +7,8d35a615774aa328371acfb0d64f3414 +8,f4b3bf0800ae5000024dab1f476f3ab6 +9,5bbac6329a486831d6a4ed92ff20f6fd +10,83869ee7243df66f1c940126d360fc8f +11,5bd05995281890b9844e500f73940921 +12,6c6b422f39209d39ec26331d57ccbe56 +13,1f034ab82388226402249379a642b840 +14,69f12649819e99ff444f45ae8efff136 +15,817408ab1b6a0c6eead22b57631ef53f +16,58af7a6e2d2a850b7552683e3834f987 +17,84a8b2d9ac249b55fabb09ac607b2233 +18,c87732764b8a69cec820bf90eb718ad7 +19,1835ed1a87e9d64491ebdd52a35207a1 +20,2568bd0835258f43892d18cd9cd549af +21,76f2ee70bf0568df8b5144bf93b5e63a +22,f17da06a1d9c9ae8d035cb16ef8406c3 +23,6cd48319561c1727c067a961975b84a6 +24,bdd3f1b8926a57189965c742c1d72c73 +25,2c66f967a267edd11f39c5a2cf8e990a +26,3afa0e317a799dd5e68a67890d8b3fc1 +27,3d8e8faa289474585cf873631fb41665 +28,483ca382be9378a077fa7f6baa4e6130 +29,892a1c0a097a0199c6b46645513d096e +30,2dc74b8c5f2c33e64ef4a5204b04a4e6 +31,74a8ae5eed384b65b2acc9142c909000 +32,8ce7de94da44cf5711fa26bb4c40463d +33,50a5e276825855ddca67a6a9c4c7de00 +34,7bb71404cdf4e7f67d3ddac2a764b248 +35,2922b6de08de9b8eaac85eddd953bc6b +36,c55de976a9de4007e7ebccec88a75f2d +37,04eb2dbad45f41fa7cb14d6dc0b24268 +38,b16dfa6f5cacf7e491719749b48d44a4 +39,5109b03cca943f6ee310948d2bc7b33b +40,9d83ce1eb0bdc8d1a810722ed4a95433 +41,5349496491c14e695e7cb21eefdb5df7 +42,aca193d167139bf2ccea4fdf093d950b +43,146bfdb96f78ddb9de05bab00101a7ac +44,03ee3dbb67eca1ac3528c42c81ff97e8 +45,db7c1f69c4a01bbcd3f8b8c5ac0db189 +46,836e7fd6394a229cae4bc6f6cf482757 +47,b365bbc4d9a038dde19b002926a9786f +48,1dbfe3430bda31988359def0c4ff6344 +49,1d9c1deeb8d845571469ad82629a007e +50,696fa9a54f6599aba901b07411c6437e +51,066bc49826ab1a953d2b1b3499de5304 +52,757450f0c351822b9d9619fa9745328a +53,af1f2062aa946f5febefe6ab6dd7d411 +54,562241cfe1ae09f264cb99542eb3523e +55,9d20531a96122c2e16390b7eb18f5c72 +56,059e132f67bb372c49fbeac49026d370 +57,5727994b0570390e3e30291e7621624f +58,8f52715b8bc2c65a5110f83dd6468725 +59,b26932f2cb6e0eec8af6f0f44b00666a +60,dbea7aea3a9d2be65f775e76d8d9c8d3 +61,a3966b0946d635802224a843b42978c4 +62,994b12d4b0850dbc0dfe002f261bc2e0 +63,baf4fbdd1b0672a8dce97c0ef0821381 +64,a3011477853f296ed7608f281e51eb89 +65,083590bfe168f58de4b2f1bc0022df71 +66,553a12433db5a800bc9007cd2fbce445 +67,0b9d75dc284609a204446baf3c1f10e4 +68,4c8c0cbb311878a2d9653bacaf64b519 +69,ea4b92ec63e23bcc7fd0a43870008473 +70,f3a6ae4b8dc75478707e70c6abb7421f +71,f02ab3433bf344d43c2d577f01bda67a +72,17812467922eeed3e5e6e230cd098a05 +73,dea49fe28221032bf7476665e5d5c441 +74,32f4d82ad99bfd61da718dd99da519e9 +75,d9aca64761ce1caf2120b8f7dd7caf46 +76,650f214f9a2836c85da392643903f0eb +77,03c3fc127395e1d5c201ed2aa60e5f07 +78,2e35b77e1c0d9f6aa801ceaf0a9ab946 +79,606a3fdf47d3cbb06226b85e69b2b932 +80,81d716fcc7b21fa22d0dba88166fdf61 +81,7f650ddac1ed96125c665d80fdf70096 +82,f0d70c6bbe15438cfc14e03be0a7c5a1 +83,df360e5e2e25e068fe3d114b52b7f3b3 +84,54fb79f3f9b464fbc2dc11e6add08666 +85,cd33360b648e76c1083bed6b8b9e8a47 +86,0b37f51c67bcf0313566123ae61cc8d0 +87,69a15c31feb0376b00523827254c7254 +88,3db50fe088c1f39463ca1cc860abf8a8 +89,3835166676f7dd93549c832842c30e36 +90,a41e2e2207bf95fd363b9d764546d429 +91,a971303bd1132ab5fceea0a118dc4634 +92,489d3445759b1257c3a105019d8553b5 +93,323e1bb34dcb04be1a8aa12ee06e346b +94,d21d53368a29d7ab2291ab2c8cdb88b1 +95,8a6b46d29a72fde199c505f051b80e75 +96,d642f7e144e5e169d8e05c047e548829 +97,4ba7847e11bbf6aba2fbcfbdeb8cc8d2 +98,0a46c9a62f0a26b7c2be68dda905a86a +99,8664e6ece4e24bb00b73206127ac9f09 +100,baba3723c7e5901ce962627dac510f02 +101,53cdd58805b1fba6c8bac6dc78779b25 +102,1b4f8e6271023f376daf5088874db10b +103,63df775c411ec01ed7aa472a28214e24 +104,921f9ef1f3fd333f5ab26243934ee10d +105,2c2d35045e9a9750a2e72d26798bf4a5 +106,64ff6de0b55132483f2fb7a8c8652cda +107,bab619630b155a394388b1de6489eef2 +108,1e86df45764c6d4c807908aba269c39d +109,687379e399a5561d12fe03d08d292477 +110,dda53b47c45ed71f13e846dc8395392c +111,4e1e33219f9f897dfe6f73c9ecfc4154 +112,558329a47961c74e3c147ad93ea3fc89 +113,0fe2e6b70072e5bd9a93f43d0d7effdd +114,965e00b1e4ed0396ef8358be80c2394a +115,68b246cd67259740cc5a23858c700f7e +116,b2fe480752c0777a16828e99cc070be9 +117,24cdcb0ab7ae918ac743d711c7e9f2f8 +118,c3d99eb4741ae6b1df61fff042e090d1 +119,cac253879bb1cd210bec22aef94da477 +120,0b1fdc716ff79d2ce8b44f7bc9f611da +121,93144b9d11aa4205b8ef41e7fe0dc84b +122,6701a4fc17c7681925ebc48810542a08 +123,11d2c0487e40a970896d55d440aa4917 +124,67f27cc064aaa319ef4121cc31a8879b +125,4de408dc237a24efd578dc0387c292a0 +126,3ef1f9a792a1a5446e54b0ea309802cd +127,25b78dc77e5408913457c620813be349 +128,0f878c798a30731c1276753697c0c193 +129,057a4332765d4cd8ef9eecc8a479e87c +130,bb7590fec3a65641512e93d55ca5e387 +131,94ce8dca48c4fd21ab9b9cc9ec3d3449 +132,89c012a02dce7820621c5e4d068100d7 +133,fb2e83f1664ebc6e9a1b5c2f215405f9 +134,91d74cb57f1b6710db512426592f47bd +135,036450b3754b8818ce4db61b93af9541 +136,77f46677692b9de39dab57dc4d9ac318 +137,912d571ae6da8c387e6d0818f1b482af +138,e8f47317ff7d934c6ffe856bddd628cf +139,8fd29514c11d24ed88825acccf557f80 +140,2aa61e64e984a62d8e527466c0daa01e +141,1e642cd2f249691f86de70dd29d351a0 +142,2b8e550234508f054abf9fbbc64c3499 +143,01e1961a886c096bc525e8962b1dd5d8 +144,ce33363b814085aff13ae621236021dc +145,684dd395c9b8d3f8fc72c62e3db2e046 +146,8b761d122553e1a297194d7cc3997818 +147,070a5c10b3776d5b5aae4baf604a8eaa +148,4ce21e39157e6d23f4313ef97d545f15 +149,6e7c1a37c50cbb95075cc5cd336a6bae +150,920055b624350305f7fce2add1e82968 +151,463fdc426a43cc421967873a19a80b40 +152,1e8122718b7f45ef18c98a85e52ac8e2 +153,83a224d1011443193729a7e5f33fa41a +154,48d617b10caa98356844016cce8db459 +155,07831ad74582dc806da78539c50fbb8d +156,47fda6cd9ead4fe19bea4b7d3edede60 +157,9be19d4b62e25c06e061dac145fe1945 +158,cfcec698219aa7c993b3cd3fd821ccc0 +159,517bfb5a6fd36f2ed297403b6922da7b +160,afe2a2fdd59eb41820df4ce2b273f0aa +161,7e0d998f0de50c41be187dc96a8e882a +162,67986699c97e540fc0d58593923d0070 +163,ceb62388b1e9ee16caa4c694363aafe1 +164,a210d3fb6ab249e81ca4ae3bf0b2fad0 +165,625093049c59b5ee52c20a74fbcc76b8 +166,ed06cec1de35d5e814a6b617db5bad6f +167,38b3d0c51621e29c6724ea52fe1890fb +168,0459b83d718633ebfcdff77ef5eabb1a +169,4744c90377fad20da156d60862dceeed +170,dfac2ed619458ec073be010da2f2827e +171,843860524500c24ccf2c8260438dcb2b +172,9b77e00e1db0303b596f8a846e740355 +173,a5df5728cc994e56b19ff9b86e4ad50d +174,80742bdd61def2070ce24477e17344a7 +175,672959592cac28a2a41525173f6dfa4d +176,ba1e7bf9799b0c1cc580d96086df78e4 +177,83086673f3932d0e18fb021eb23b7feb +178,bed28348e090e4112388e3f1297da00b +179,725e718c506d8b7a5229a96370cded2d +180,7f3d97119442ee8ddf0d86ad291dde4d +181,8f76b124be70cda599d4e2dffd24d538 +182,8529416425ca0af6bd71bf8ca819ac1b +183,e8fc31dd8a3cdca38808b62454f88bc7 +184,8c7d983fb21046e5f0b357cdb23ceff9 +185,78d0f3c5645d5f272527d22989fd16d7 +186,3d635db7a35c35de6564f90c48087a59 +187,a6b276e505078b48999e97bedc65dbcb +188,0285be74e72a267d240b3ad1f9fdb89a +189,cc3eb4a183abd48f1fbec133b4690942 +190,41a0bc49a47e5e4b821e9e199ccc9722 +191,060ffd03a1db64bd9b3883630f3e6504 +192,0a0f47d0f7f8fe034e0ddc2c25b331d3 +193,8db57dce5484261882a7948bf4db425a +194,e369b9ea72cf0266f4697769ccffcdaa +195,238f872ae2cd6e37d330eb29dd5d9148 +196,8ab12f7405acf46e4a66a6941058c375 +197,9b039e177d8dee4e2f4322528371d750 +198,26e94d3ca819f48220cad60e999af02c +199,3e3e1b4a499bfb4283959171809c754a +200,afe63024875f4e66d577e16e9bdbf162 +201,b7ff2e9d6acef56eee636e2338ee1fa5 +202,7ea228aac7e704a89cdcb1f843a25098 +203,5c5cc84dd8e51169a76dfd0c552bdf08 +204,796c0cff8139750fc8ce192990f25ed7 +205,264ba8157bff432fdb4ad503deba47da +206,534ee7beae08127d34a80dc3c4e64951 +207,ed9c97aa1425b24b62531b77972ca69b +208,8156f06cf93350983ba41cd1d96bbf61 +209,31a535ecb3e4c6cd6354810f66a8dd41 +210,9fc6c54462ac2d0a12b5821c5f54830f +211,a56e07cd7732244cad9d33d62dedca12 +212,637d51a5327b5d9a9a80b315712cc110 +213,d6c8db72c1bd5a7723c1ac85405c9a1c +214,5401b5f33332e726f693893b2c0f5e3c +215,3f0437a90bbf59778873b0d1927a2dbc +216,a1e1c0b58cd104f0db28c65f65ef643e +217,bdd4ea220efce79bf281a476999488f0 +218,bcb1696380df82d40bd0ccc4d4c14847 +219,653ded0e82e124584e926409dbdac580 +220,bf8da2a37d6ec2ef9d4d41518821c9eb +221,0884b1f004119e3b43ad92ff7278d97d +222,d76bf64122dd40f6a93668e7f7a83a0d +223,93d2687900c34fab9ffc8a0035dc42b7 +224,7a120ddd89de2cdc2c33e6f33f063fe2 +225,cea7d4df694b59c6f44746184039d877 +226,6fdb2ee4a35328b8aec4239b11bf3f00 +227,c97f9b214b65a2f79c9670365e132497 +228,b2a5ec16e8f35795fd9069909183cf1e +229,4dd02f8114882d175f9e540d9ce1d525 +230,d21f30ee939d98a0c5c6f2cb3db86800 +231,250f5b3e89fb406eca7a7b0cefe4b8de +232,040ec7a385755d4494ee7c42d56de3a9 +233,f5db1a53b8ea2c6c272f67a0649f80ce +234,6a2bbd4004ff8c799eb858cd5dd06aad +235,a9b2fc2c2bd171f607360e523c47dcdf +236,288f2b9863c7ea3d4faff8341e5a75dd +237,25e1ad4e878c99b55f006a7f459b31bf +238,acae026cea9dc58b6391a20056bdee53 +239,cfcadcae4b5292df103dc86b7b00ce33 +240,b1507ea4fafea54ccaf36cbdbef4fec4 +241,6a5435e3c8e40f1d99be286ee0cadc35 +242,56e378cfb4b2c0c5cd25b4ae0eb1f30e +243,a613d5da10ecba512f345a20084c415d +244,f0ddd670b22f4b2fe4fe1900b4758823 +245,aab324a6fe660484111507439e906b8e +246,f86b9e6b36aa944a4ae37cbb69e6dd9e +247,7d7567adebb692c2ae5cd69628159762 +248,faa986e0949c5c5155092228169c53fa +249,0ec4a3454ff2af67e3a58c41acda5ba0 +250,85c7b9649445eb6c59b1249cd17870b9 +251,82ed617f34e1d8c56548d0234c320037 +252,48a99f39c546361bde8825bb706434c8 +253,bf6d1abb9cec70f08277d3e463f15b1b +254,9e9d876ba8ac07d0716862b5619b5c39 +255,17d7b310bc1bedb2bb01d7e7eeb9e64f +256,14cc540aa2704f8a29189de8bfcc5dd4 +257,72b5917bae802e020e9fe81ff4d617d8 +258,e7b97b24ba629a295ba4821a157e39eb +259,1ce045cf963f131d8ae8a0d72e091d19 +260,ff2c553b021ea71a1c124b722ca44bb7 +261,f272a4e61ab96be909687e846b91d89e +262,a0cfe3dc509188445d9c483021e72a14 +263,ac1e1b202165449658905ca05de5411c +264,7ce3bacb8fe135e3769b85137eaba2f2 +265,c1d885fa4f76c94a6f551e17c871a6b8 +266,d2342884d230acf38dd3c5b85f026908 +267,1d599679c8bf6a29ccdecad2203a67ac +268,c125766bbbe426b6d0a397d4431cb4cf +269,95fa5b3eb252ca4c4c7818b3a269a49c +270,989de45d82572dfe5c0f3b0442231cae +271,aff016ab632784dd146f7e91fe668f28 +272,fef1949844d60ec6b29b40ac0f1fd3d0 +273,0a509f46422ae9f6ce48a1e93f0e479e +274,37f750a2a28be16ff71e3b01b2549d22 +275,ee9a3a9880e82c0902879a0b355deefc +276,687f78661f0bdba9a13d4e4500500285 +277,d34c129646acebefe070e38b58d441b1 +278,9d5bde29b9059b7f99e8d5d68d1706e8 +279,638141214b5c09e460db46e19f79c550 +280,9c781f64a7be7a399cc2fee827b3da26 +281,076f38b83b15ef4332a06b7a5bd58f0f +282,6e969afa3180e9a47de9dd809b8b0f60 +283,04674c27b36d13c87eeb3b61a284efdf +284,3799cba0d2c64619b17c87b37ed04f57 +285,0f5444d199e230a8576f556c5fa3ee95 +286,4a24b4aadc45c4c22ea95935bbdd6f92 +287,170abbbbc4cc5fea0c283a1e9c517ef4 +288,64a6ed97e5956043990fba9d1374bbae +289,7d1cdf862f3722e90b1603c2a79d3fbd +290,1181e5038ffc5de81fb97beca05ac48b +291,a4be8c158dc4a65f6c1a0ce179c9aeca +292,f490c159f7050b19becd2520116899cb +293,f6881135c4c3619cd713d84a38b22da6 +294,701f125af12bd29d575cc5557de74527 +295,6c88ea7b3d5c756fbc0ea8b791b17690 +296,ac4ab88423986cfd01998295c2357eb3 +297,6dd70bbb2c5517e33871129ba6bba81d +298,539542bd58e3e391c07261e4352bf028 +299,c31ceb7d5f1c6f91f30bd3b7ee93928a +300,a9a2eae9afc58a673dda14d16a77138f +301,69cd8936c39ae7b664e69ed9ba5c27ae +302,669debcb253d8117758905ffbd3e8752 +303,8cdd003487b041087d9211c2be785673 +304,ebd5e1da2d9d5a84f3550cc6793b89cd +305,34d2dc35a4343707d7241123b344357a +306,371bcd482ee70f5e53feef199ba8595d +307,2759bfe8ddc32a353094c71284b65f46 +308,549af78364a6ce0160eb5f6e8134f246 +309,658a99dc50dac41671ec86c94d7bb739 +310,c78481b00959efb18419212c61ecddaf +311,67a5b85c1b3f76d9eff61055cfac9462 +312,dedbb836de52d55cd0f86694515f4b69 +313,96b37d8d978b80607f136c7bb7dfdba4 +314,941ba25c1a23b2642804383b1186cc9b +315,a1af66724af54104d85197a4b7af7c66 +316,0f1093ec49525795eaf77261467927b4 +317,552b9864cd80d7da3119c5592e4a3dab +318,b277a24e7f110701fb5faf5e97feacfe +319,4df05095076c2a1fec4b59072d207244 +320,df341a8eff703dc2a27e7af17431f4fe +321,dcfc7d368b7cf74990f9e80b2f1fe869 +322,190a2e84d8c1ddd4a4510e240d3b0937 +323,ecf0f62328afcdea8dcbe37a13b0909b +324,e57eb752f9614d7e54b6f9c0f11c9463 +325,3a41b03191317c5fa7bfaad203816f42 +326,4cf813097c38d3a7e8bcad11d94eb5d8 +327,ea17028544e1c7208e82e9c81d53f94c +328,1028642295836cdd3dd18252fe697532 +329,303c855df37742d22823bbdf90c80d06 +330,d57cec62946a9d7482fb48bd52870acf +331,fcfd6eadbea8872b8dc0f66f19b71390 +332,45552c4125209fde53cb1600df0fea44 +333,4e450f6eed271774a3af597c2bd02994 +334,e5a0ee76da1e12bc8d0dcf9310795f10 +335,bcea72795420b083be60831e840c5cfc +336,de0b8a63fa19dc64cfd997b6e1b052fb +337,9e254b378eb662d3bfe14dd334786279 +338,5c96eae1365ecf397dc3821fe6e425fb +339,647d83d4dcac806c68b995000629e9f9 +340,3b803c8e460ba30759a4ebfbf98ee600 +341,9d7cb52f6b563d45ec56fbe4b9d6e83a +342,81f712220cd7ca5570235a3ae4c1c066 +343,954cc467ced176d53af44bac36789f71 +344,2702f85f8f0159bb5f5e98d337fd7fd5 +345,9e2c332d5f654edf4382ac075282051d +346,4ca7be3f8b0b82f093a4d5230a26b213 +347,4edcb1680a9d5c2a98fefe56ebb7081e +348,bf2e723ad1a5f8f36f53dd11b61f977c +349,04dbd46e4e6c95e9921f11abd7c385f8 +350,a45f34c3cfbe70555b21c415e6e554fe +351,6dd6e27f145b215a9a35c0fdf144922e +352,48ac117000a011b4bd965154a6f61ed3 +353,342f639d364643b1f1e336ca2156b4d0 +354,e9a839cfafb1850fcc5d2ffd7c2c913c +355,a36fb36a36555f109ec4fe4dd81f8efc +356,46308fd4655f1a63e81ac7a9c3b363ae +357,20f74b5e9810feba83fd4cf000b29673 +358,71736b99a6465898f7c4f35417cd4f21 +359,a3ae08b873750e30082aca0383c0ad2a +360,accb72c2216a4a73290e6227d9aee805 +361,37ffbd776f751df9557f789592025c5c +362,0ea8d3357b65980a58ad1e3dc47683da +363,9dedb33e5b89159c435397929cafb1a2 +364,1569b5f5e551ea953c781f3fb2c957dc +365,019e30f04638d7cde5331e303090aea5 +366,e30de833b83a97000983f8f5f301c10d +367,9c1933cf53e7f2e02ed9d48d96e6abba +368,fa8382909c8e00d9392edd6f8a23efee +369,488790a804da3abc24cb45927ecf61fa +370,e464cbca7d561eef4d38cbf605313604 +371,31cb3ade3493f7cbf29833cc91f73024 +372,cb5177fc90d97e11627b2ab212bac037 +373,d5e984c49578950375af21376b9af215 +374,5c70cb9b9697bc67d1d023885ec67f64 +375,f2e8c18072bcf98a783eac72fd7d6202 +376,86c371e9fbb940133c0bbf4bfa84732d +377,9158b3670f14dd62f7b9d14ec1dbcc84 +378,7315e56de1e8e07da8e8574e22a7d2ad +379,6d34e8f9c8db04a51d74c18eced7ed6e +380,b0a3009f6fefee969b273acc66d3eb11 +381,9503c95529809f6276e7eb5e24f43d64 +382,8a12834c853ff78b2886f9cad76dd07d +383,dc1b4a04f923e660d6ad1f3618874932 +384,d3716a6baa6f79decd4b75f77120275c +385,3859fbffaf59298acb179f72269730e2 +386,5be2c7425a858ab5d94294eed98fbea8 +387,ea0a0d75230ab6a63ee94a91c6c16419 +388,77e13580b750244899196699cb352dd4 +389,686680bd42f8503e9ee0ab639a0f3521 +390,b23c4b8b616f1ff0a4983a5d5db4eee6 +391,8ebc574a40fb67c3bbd1dd4f60d69a7c +392,df5965b690a5ea6c9519ffba87fb002c +393,68e60803bbe93ba001cf0303e0a47bfc +394,530ddd94e2ff93637bb6471ce048a0e2 +395,0e44ce4b5083ff026cf473c0a7d59f1a +396,85e9ba80ca54aaa68c412cb6c512f54e +397,cec3390467b4187be64083db32f8ce7b +398,9fc538c83b395893f01b90991dcc4116 +399,80931abdfaa4ae26335386ad4ded18c7 +400,3cf9ba66559d6fcfdde1be8f611984d9 +401,b1a8e9c468fd8e966aea5da6eb5083b1 +402,b5f07b8e40a8dd857f0a68ec238315e8 +403,ad54ce78fba08eb72bce6e99fa5671b5 +404,0f92bae40d8642bb1b3dacd30edba65f +405,fc58f8968d7f55b4b553aa8d678ab8f3 +406,6e631f6a6606b66ab0b8ea11120c8820 +407,b19f9ee357ba5a6036f416989d21e604 +408,dce47d06ecee546b11d778491e455482 +409,4739aa963de1aa0384ae48f55db110aa +410,592fdb164a942bfd5dac71caa81ea25f +411,1cec7949f23399d185d82483fc9ab777 +412,e15157844f2c2b3688725ac36bd075af +413,6dcda7389ad712b3d04c54fd421db1f0 +414,5ded774239f5d47fc454d8e79a7e8c77 +415,b419d3269bd7eec8ecc4a301920e9784 +416,53be8a86b1d831a37b7f097e4898b475 +417,72b6e485e415d7b28fb44b08eacf1ced +418,0d4b6fbfa08c0719df2d32c6429d5426 +419,67dce95d89377eecb574d8c03aaff16e +420,42d120b5301c09e214c228a8c3e10970 +421,15e7a375e5dc2210bc2705911891c583 +422,8c644eeb0c53ea04a89571320501f4da +423,1c282bfcad0ad2b8aca90c495c1839c8 +424,9c9dcfd4439aa27ca47eb533df3a8498 +425,eb2ce6e97cebcbf5a6272f61dc21160b +426,25cb9a3c7c0d1d862246eb47fae98af7 +427,50c938cde9c214ee254af25b061814ce +428,8629918e6c6f4cb1e69b32a172175f39 +429,f52a04e72a9d6f9a6a072e5853ba9031 +430,aa1257e3f919b02a12366ce722c71b68 +431,7e39e40782a65905b8297a8997d71acd +432,7826a58c7db93455cdf6d6e6929ad2a8 +433,f74053611fba9d076b207bb925cb755f +434,57c73b2c0415c1453e24760846c2e54e +435,c211270abd7ecdaf2ebc8c13567cba36 +436,aa7836d1e50b1b1a2397bf75131d5857 +437,ec150b11d67bdbb0646f5967da43c1e2 +438,e4e9eb0decc5cf2153f6f93b837a26e4 +439,2f3a440e41fe0f570bb8ee531779ce92 +440,7af688e481531616ea455e09251ef3f8 +441,9622064f5f287485e0f8a4d32f9192f4 +442,59d0096f57ba49aa21db213e78ebfb95 +443,727dbcaf8b7dc83c916463b3f7ac3bb2 +444,65c66bd913067ac5dff98b13fe594975 +445,9529400c71e5dc6bfde9e4be98f5ca3b +446,52c0e2f3b507758badfa7ea027058b2d +447,5aaf44425e2f9f0ec708cd24bfa0a5bf +448,7632a2aa8b7b9fed1821605669e4a80f +449,28d040f3621a350680cee0112cb83c2a +450,28ce4ba1756c9fb2c8505c3d4afb76fd +451,53697212541e49b979274a9d7f530455 +452,372007bdbc5014b1738ec45486925130 +453,659f977ae01142f1f266bd99210e2c27 +454,c68d3c6b5c92ce555c5f06422bb3cf69 +455,339de3aa80c0af9d808b289307faab30 +456,db212a220a4fee468df1611c95f54bc0 +457,d2a46c936e414c8e8c4f56139e5c3f63 +458,116f39a7858f3a82babfb8751eb4a99a +459,1d42c03757826ca5b6ce96d958c44006 +460,aa86ad67de76aba371aff67b62fd201d +461,5dc9eeaacf24d06c9e6ba7faaedc38b6 +462,5b6da44e1b5aafab00bbeb3499a84ea4 +463,a42054a0fa60a17d55be2b18dafd3901 +464,30eeebff8519d3e3e08dc14ddbd62ad1 +465,a100dd591a062fbc632b0bd646653e7f +466,6459b017de518395b229623c9ee5366b +467,53d8cc2fa24909a634dad2efa1f7cacb +468,1608eb367717a72c67883b818d9e59cf +469,c07a533fccc94b0d8f6903c6ed79b1e7 +470,1c47ed41a14e0a715f73fae41851a44f +471,a61ee0652d873879853525f7cf6d83e6 +472,60a6cf9387ba6ebda5bf9391cbac42cf +473,f5d78fe6d26ea028d019a4a1658b7326 +474,f554580834dc86911c38e7431d720307 +475,86501b0f9c322fae21ce26ee2fafebf0 +476,245f29a6dc487568a26acbfd6b2f2dea +477,c7690a46cdb63700fac905955ca77ef1 +478,2593ab07fb7aff0c6ee8a8ddd3794a19 +479,26a1cdb719dd3e166419e90698769434 +480,d9d32927cd8bba44b78bab92d7756b64 +481,72c75b89338f9ea2263dcf649858f98f +482,d75080f88a0739cd09dc412746abbf4b +483,db0033ab74f7b583348e3ff4a917b6b0 +484,edbbbd71e63f39271cdd6a735b000f39 +485,46f32859123bc4b9e46bdba7a25d2730 +486,690649d64b465ec34e582727ef97f810 +487,362d35b1ea4da9b91a8d146ec1f72534 +488,22f84354340b02dd06e1f7dc7e6b839d +489,bc92d44b0762786c0101f2ec7df97de9 +490,dc8174f54bd7b27f6401792dd97ab945 +491,2c026bf27b87005334094b816b7b9f7f +492,db5a497b158cb81251829a3a4bb451e6 +493,3fbd2c9013c61598eb283222adbdfdb5 +494,4db54a7e1b880a0f6206f7697425576e +495,1bfbb21545fca38a5f7beb20fefb6b62 +496,9e9a80791bf7f2a233410da57438aaf2 +497,20704d47e58d6290542fa7a9486fa3a0 +498,b001d21cf4a8c5f55d0851252cba6356 +499,56a1a513507a4e1acd38149dcc4f2d03 +500,8ef6c2703dae5c538ff0e8e11195ad82 +501,e1f92bc26692e9fd20581e0856547919 +502,588b5cd147dcfeb4cb8b15cd540fe3b8 +503,4319979e504db4a36a3fafb4402de747 +504,b92add94462d387af9dcb14ac21fd3cd +505,5f6865e584e9230029e54ee25d3eb31d +506,5749a498f9211097de83270ff89b47d4 +507,f7faa8b88d498c87c272f4aff0ff40b7 +508,507ad87e3d5a41d66dea145ed7813bf5 +509,ce19862008c887f656f3d62360dbbbad +510,af92a4c25606477d4552f7dfec612e41 +511,cd78ee8398fe9eab7f2ca356e93571e5 +512,5e51a02bec51f89d218da7a5e018c37f +513,1af9bdfe73bd594f961db3e43a948207 +514,77b33d7eac52b0f3b883be80c3d46486 +515,90cdbe15a042786b1baff6333d3ecb25 +516,c6f30cad324a91320e309ecf31bd1ab8 +517,3897e07579aa168910372baa11fd7666 +518,740a47b50fc15f8f8caacb42c1942322 +519,bb0cac3432fbdb577565588cb475a256 +520,2814fffa72fc9e979c538c92b5904296 +521,ae8a1b34dfab063ce2003217dd6045da +522,46035d9337d9d6e3a2f07a2cea03587b +523,fc0b890a5672d4e8a90771eceb6b80a2 +524,d9739e6b5b35b8a6fe39e55b9489bef8 +525,f0902cc40c36ddccb91ee5a873450129 +526,074febaff23c6da0193bccdcce469306 +527,f6f6f9927dcd3d9495d5d64b8b8d36c5 +528,9a6148ce1334a15f45945c6c790f33f5 +529,2f96ae2aaeb026a0a9f500fa8bd51ebe +530,ee1ea4c21ef98266663b1b5a1a2b191e +531,047030539b1adb8f661cf8c31248fba6 +532,d8b7587b071e8e8dce85bbe44a1d3335 +533,12671f97d61c50f7d3afee0eb719505a +534,31b91999673df7fe6b73c3f976a7ae5b +535,3e11cffff4953061026967ef34c4e487 +536,a4cd951bbf966d83678e66c471ff2eff +537,dce835689afe11ac0c33288ff407459f +538,b8f5fc0c0bf176c6480d63fbb8f2562c +539,ded9a268ff3d44a1823afeea870ce8a5 +540,438e7bacd8ba3e71b40e5e96781a626a +541,57e19fe8573ed2439de4e1286dd25515 +542,104e16e64aba68b88fc5ea5a2eb7ee09 +543,11a816015d8c314766e086a8c2020f7c +544,2b97278df6db4ab8c8d4f76cddb3f8a6 +545,b8bd6b382787909f8b11bbbd87617cfb +546,d64800f5860580136ca5d69d45c8bee6 +547,851d7e941f21bd56d0ac6ff48d59d613 +548,e4950b09d5137b377bfed5a77c571cdb +549,9448d9e847b0f9fbe697e44c33e506a5 +550,d836936ddf0665b9cb35a21304b47b91 +551,cf094e929962dcababacf57971307207 +552,e86fa022c5a5cc82be52980f17194f40 +553,57c57cc3480714a3ff20900024d4e4ab +554,d101da536717ecc421e42503a748d996 +555,fdfead7db32c1fc5b1500b136fe9f24b +556,7af07a045a0d3ddddc842aa007273b25 +557,300da728bac7930c51b4879c28b8c6d7 +558,851bec5ec73ad447555db21fa1101cdc +559,0165e47e5b0d4589c5307e55c11d4922 +560,fe2efcd81bbcde44e70057528a44e55b +561,73371011207b57243b291706a7afcac1 +562,d3d4733b24a594173c7ed3ceba622e55 +563,391d04c5d837d453067dd2fc5a5f1544 +564,b5117a86ef0ff371073847c80a859fa7 +565,152c20834b406d571a43ffc7dc0b83cf +566,77f85c03cedd0b5c503478e724e77211 +567,d726a211136c534ef07f4ad99f79c5e0 +568,9f750d055700564cb0b2a010e3b4ffff +569,defb0549b578e2f3aafc1904376a6386 +570,bc83f36d8c20160b464eee6913d974de +571,ad94e5743666fc910bd09f1a374d0f9e +572,f91d156527db3b601e34926250bd9822 +573,d638adfb4b628a4d1e5fd499c3b4aedd +574,e49b36b0df722d893c43afc29c631d13 +575,1f4be64f1747378569663d612905b252 +576,6e6c6c1577546376db045b133482b68c +577,474d5d365fb437d9ce5fff25732a11a8 +578,5e5f7958aefb67482e8a7c407649c66c +579,0c9c43e870b4c638ee67c54cfff0dd9d +580,490e08a06c8f9c65e142c8756d932e0e +581,7866627be3c69f6deec22e6c41508f29 +582,147a52c66f7dc5b2c1d453ce1e2419a4 +583,b09a92f92f594790629917871a7a4a89 +584,55b91f370e3bb1fe2d8ae017fbf09693 +585,a7503cc2b19fbfd737fc7c9c78e046a5 +586,2e0cab881a451790dbdb889243be06bd +587,ebeb7a55126cb88f5ac375e36ebf456b +588,bd9b287c32463eaefefb6ca4c324a6be +589,f05788d8d21405cae1a1d80629b03c10 +590,e6b85b92674d016eda7ece26ba64a78a +591,1041d39be43360e7c47a8304ca699b04 +592,854816fdcfcda7d8ab831b787e22ce00 +593,6d4a8fb49303b0b11c09b8a831e3d053 +594,554997f162b6a472d354a5f66fb802a5 +595,17550246ebcd923df02fc75419d373e0 +596,785c35767cb4cd2eaa4d29abb87ad74e +597,9923c14625984a15bbe728e0c25c1fa2 +598,9e9e4a6e81be492009280187a447720e +599,c1c9ce429e030284ffd34ccf3400fbe1 +600,dd357d21903c4b4b1261a4640ee5a196 +601,764beedab833e56f3e0ae8a59a3920ba +602,e73de09538d2aa32ac3d3783c166cfc0 +603,0628c44cea54dfe88832ff4f3f6c31c1 +604,0cf73a2401f2b5d0780aa43552db52b1 +605,3c38ae0644708baecc97f6fde10c145b +606,e887c5a0118879873b5f34f79675e110 +607,2334646327eeb52aaf6ba9c65b3c1c69 +608,b60dde6853beb82654752e61210368f1 +609,5cd94e1d8878a0af8491f05c2e708c46 +610,8dc363815062339e1ee4eb7c4dc53c28 +611,d358e0612d447801438fe4b224c64274 +612,5c121b4b574062705879655db9eeeacf +613,560af3829b075002e6915cf8ab46f554 +614,9885e7c60e7219057799c7ec87846c27 +615,7c5e41ca01c57cb9db9c95b0a19ebed9 +616,c466d814d950f92a50fd8bcde439bb5a +617,82d3f68f89ccb3e69c76e99058476a24 +618,309927eb9e97d2e3d4c2fc607db544f3 +619,0cd859629245d99e704d9b87ba4347eb +620,4cf7754ef6fa70b979079c92f75c5345 +621,669a36d6cb50086cd72eeae82e82118c +622,570b2dfdd3fed8b21b496195c6e68c6c +623,5da3f7bf219e389d87b3cdc07aa22d84 +624,f99ed61dabace5e6fd75f8b0f08674a4 +625,910648b7d6b5ac7cecd9c862de906839 +626,ef5c46d004d87de18abd376ff6b389da +627,9a018b0351f255158a39b7a6240e19ea +628,496369b5ff34b0c2947c2915b88f2ab4 +629,e309764c4dc15936b28ca246c224f900 +630,6bb0f2297fe771e468c390f4da4fcefe +631,58864da52b690504b812fee594f69976 +632,c8530ea749600a3bf3988f8b81f95fa5 +633,91f340a45dd55bdd28b5071918b4bd67 +634,766f3e5ef3cf48a4035bf907f22693ca +635,9fd9cc993848184fb5e16d1fc134627f +636,cb26a273e7510ad2e2d331118a2726d5 +637,87e4d08bdc7627af68a7fb82a1c412d5 +638,3d599fd25c5e014ddcc216099d62a29d +639,4976cdea44f1a3ab33c92dba23313890 +640,dfa20c1197245f52814e46583f1b4001 +641,f4e2f8ae714fa74fec23cc6ba76ad32d +642,8c4a46f9575c48923e22116e90e54647 +643,5def27ad254015b0bb847d333aebe445 +644,1349ec772e7bbe42aa5a8e699f2a8d30 +645,bfb28447a3abb63e53ce531403d643b8 +646,c8f93d8d66d77d935dea21f768aeec64 +647,981c3c616a98e81e8bdb550c44886611 +648,00c7f5da5dc972ba1f82c8e229a314b8 +649,8e1f82647ee687e44eb5902ca2300c39 +650,9c024061128c4852fdd0f489c1731e66 +651,756e8a4b9917bb1be27a2990d9bffbca +652,353c808ff77d724c8637a434ec6c1de8 +653,b38d67269de2c85c79987432db3c0555 +654,c904dbcec4849b005269863336495abb +655,f00400d6fb5d1436849a9df0cd1ac9d9 +656,f10bd52bbed1358381c9d4c4f076db8a +657,6a05dbdb8b0a70b8a2e9ac9ed85a34cd +658,3b7b04d4a2481b21479652216b805b43 +659,1f1a15e2dd351d40fe0296543b60a339 +660,18b3c849a6df31ff0894a5bdd70024ed +661,778575526f158fad0c2a82f868a75d0e +662,5063b2ad5e8eeb88ca2a998239591cb8 +663,3a9b24770009aa59ce1b4738229b9692 +664,9746372a8177f3efc0e545be2f59e493 +665,8bc1e596e9eceeba0add3170233b75ec +666,8be18c126dd56ea14044776043717b29 +667,19c800d182d5ad0316a5d2469a0cf03f +668,5ae47feaaab9ca1402ec30ce2081f98b +669,3a3d8ace69be353f7771f14c5d125082 +670,6e236159a5d4fb4bea8e04dd6c3000d1 +671,f6e92bb8654fb14209ec67a34012b066 +672,1d5c4971fc584f45ac9997658a72e292 +673,a96d176811d9e2a91d25753798f8a9c5 +674,79c3433feaa7e43d814b7f6e2a66ab8e +675,7e8e689869b8c8e8264e7e48dfec9110 +676,01f289ed174e73a152b87806cccdfe33 +677,7f17fb6d867a7680ff55649c0d6a0f84 +678,5d6b0b47eb8f5cb903a65fc6e822aed5 +679,70fc7c9b247e6e54894590cece816a5c +680,1f8f65da7d3b2158dce8fa3308960027 +681,72888e2fbb07a951b567fc0d036f7ae6 +682,55dfa5eb52a313be8448195747ef6be2 +683,908af9e38334b0af868ffd4b8129e6ca +684,3f3dcd5a3beb429c8fb01954e50bdd4f +685,c8af1c2c0f0eaa01679c23716dde2247 +686,52d6c7c28b21e6bfb70606ca4cab7795 +687,56c9d7391e29896f999ea6e912beaa40 +688,09cb49cdd71fe7e0238420d843f16f10 +689,bfe9906ab37425744d754d1610e04917 +690,2103b6cc08b94061a59cc66524494d39 +691,89efd55e4891b983d07d9d134951b360 +692,f7cf3e67aaa892dd271e161972c9ae58 +693,886333334aa1d6585704617cc4e936bd +694,d571a73ee22737afee0e29ef567f0e5c +695,d0cfbfe68dd29e07f2fa2d83bc378883 +696,f236a09fbc285ee65417feb7b3842a07 +697,4ab05e3910b70bf1cdb76b5a8f65ee48 +698,25f25d2465536e9d6752a98b1e6be0ca +699,440efa9f8a5603b9bc35c46eea89c6ab +700,a706ff5442102bf8a83cd658b145c2f9 +701,707fc25a29f8cb55e0c3c2b8b7dcf362 +702,a4f9b4ead71b27acd5c0b21aee5f330b +703,9c621b2105a8661c552a0b6262337b23 +704,1137c0840893c9ebc3b1ae4fc4d4ad68 +705,0f8237195178c2e71287078b85687d7c +706,36ea1b0d3042fd0a544606ced6fa3767 +707,9aef47c692f2a479275839ae86bdbd80 +708,839893d87b9766a2154020c5584eaa02 +709,0d60c84b02f7b6a8b08a528067dae860 +710,3bcca948c5fba1f7a45f80d67af185b2 +711,bf9c45aeb7f4e02f2d3d4646dac01993 +712,b121d5d9acd4f5265c78d89133090c97 +713,ae450ae73737a73a863aeccfbda5d323 +714,ae021b82d0ef20e97bf5d5eae0614bab +715,1a52640831ac085f5d41bcad930ee016 +716,643db7b9e6e50427245297bf6a5cadbb +717,a3bf33e7ab5bf2960a5bdf6241f0508b +718,f75c121cd161943102344bdbec297a18 +719,16ef0174dddf1d08e5f993ed1d7b8c74 +720,b12a778f384c7f0181d21a10ea8de6e5 +721,7064ad62f0034490bd3fe9d29fc9534e +722,11b11033d36cab11eaa4e786df3a7519 +723,9a7e8119c51d5a05b2737d0dbfe82c78 +724,0b2eb280302765fe9f8af61cfc582ea5 +725,ce48b9a80a96a4464c9ee71b532870a7 +726,46520920d6bc107b446d08a0a3ec77c8 +727,3b20d354aa0ac3c1109f556a9acefac7 +728,ca23f9d4fb81c959b9da5747305e3f57 +729,a6a368cbc6968729b8269aac09b8ed04 +730,185afeae69b242a68e3dde4734a0d461 +731,a751b7f3b400ff42cd5dad1842f59c39 +732,80b7905a3d26a5f0397a59f00168df51 +733,ead430a3ac7a544e7cc8ebac20883577 +734,7e4f39e3a2b9841254313db21b3778bb +735,c39aa534fc29c97cc12ae1ebdc04b09f +736,26233a7f5088530b3349aaefff6c33ed +737,31b93f992882d2ca83e40f4eb1114f90 +738,dbfe4f939d83cd02455012e9d35bed9a +739,0905a7c24b321ab2f9eea57a6037361e +740,2783cb459599261c22368dd118580c48 +741,6401286a9d038297dd8f1bf85455e24a +742,2d85cdd1b8eb45b64f72eebcbf2038cf +743,413cad1828405fc573cd5edbb5877065 +744,a1c43da778a5451b39de995c64515ce0 +745,5f21e6fece4cabd58015b49d73f5a877 +746,84418d95c2948394c8a5204ae6c9e05d +747,b12b9c917a5e13daecafbda2119f73eb +748,57d5410b589fa3f53c008c28ab4bb6ae +749,88ab95e662e06e34c696fc3a104382ec +750,e65ccd334fbcfc1db28444caed8510a6 +751,bb210a703242c638218d61e65f108e6e +752,af64e19e39ddcada2737e84fe46ef05a +753,f0c2e31b3fdd43688d8e8388fb18a151 +754,f89bc9d6e474b0ffa3d74298932d7000 +755,597344b68d0d8f5da20410f34f3371e6 +756,ab78bfe714599092262faa181d365007 +757,7cb2619dc558219dba60f8bc3036442c +758,49d5291a72f2a6dc9717442516ac0059 +759,e5958d170a6f561799d40496feb58c81 +760,f573c048d92707968a60a42c0eaeb1d6 +761,f328aaf7e55cf01dcdeb594acfbd613c +762,892ec554b76dc15b9de2c7290bd29236 +763,e131587f416b28c749f05e7e108d43bd +764,41a053a013f2b997996c1104f9ad2bf7 +765,5c1e242198a6f50dcc14ca735f28c306 +766,3dcd6c8694fa25fbba45c31880129e6a +767,37fff1e67a49ee4a927dd8044b5efbb7 +768,938b368bf11f8def8edc221f22c30827 +769,e18c53df765005eec9eacc0d7b1cfe79 +770,8438a2c002da8c523779b894e02c1405 +771,50ba3f6fbc3893ec0c8f5409812bb1a3 +772,7450f709d1940b63423e2d7d14d2af50 +773,0421814509e9b6e6b8c231a0304e58de +774,caf4443fdde596669ca5813b49d479d1 +775,a3ecaba484c982e9b800f7968e9dc9ec +776,97c140eda1c1bc3db54b9dadc6139831 +777,6a781b5a6646d4b1fb32e3b86f5234ea +778,b13a58b1e84e2cafcf885e9f4a275dc7 +779,83f9f28effabde82530f857f5dc1ce6b +780,07919eed83acb00e2a11d415899963e6 +781,ff89b7f2dbd87035a9f078ddaae42166 +782,a5f149aafebe02f7f896a9eee4b0cae1 +783,2fef1a39de28911343138b0155be8f16 +784,a15007187ef5feae4c1803c4a7580140 +785,8777cff3e9f6d107c351eb356d184021 +786,0811f4a61640813ec4aa0789f45818a2 +787,faec1d8862979bf53d6b97e74972d25a +788,d539711ab8bb0968cde1ae88d8e166d1 +789,5f47ccdf3027de0ca487a78e1c1b29db +790,86f8410e6c45e6fe8d584fd3f0fc53ea +791,149622bbd26336e26f68c647289eee26 +792,71f1c677715ec4e765fc1e30b8bf9661 +793,3669e780ea25d1b6baa39e15448db6dd +794,d41af9298fc8b093e6cdfe4f057ad8b2 +795,17d5524083bdab4205808ba246f54865 +796,03c4fbd15e5d89b5da852d375857c77c +797,530b4855a11b2d171a44534e8c186f4c +798,4af34bec971c176ad8740376bad70418 +799,d357c7b6780144c8c42cdce2d13bbf9c +800,dd89dae2e3454bd1b88322d6c4a86d0c +801,e2c8978e0f9e5af4e42a0bc6d500b79b +802,32a08a438761caf20d1e6f45b4f3d5e2 +803,072950ce812c5c8becbaa9d8e539af67 +804,3559270702d4938cde750dbe58835088 +805,7bb93f7c69abff1fac689ec73a20dce2 +806,6fd2717663497212ba0237d1f9a1736b +807,b371128f42673336d6fdea3012c2b8a1 +808,9848ae89e2ce2acd2ce6a86bdb89f15f +809,02183e36da99c19d9677d99a174fd119 +810,796fb3d8ecb20a7b1de00211fea48a73 +811,4a02ecd8e05029b27a84c14511c7a0a6 +812,874cfcc748a88a45b3eb964d20ffd3db +813,81964fb7db414cc1b1efbf2c57aee93e +814,dd8ac4c530f4f251724ec8af553e1c5b +815,aa72a1e0794c142f02e1c649ccc284f5 +816,5d48abf99a79b6d9237f195120ad6000 +817,8f3ebee3462dfac7ac571e49e30cbc41 +818,0cea2a1f2e39bb6d8de0fd1ae2101b30 +819,b279e6e4df612279364b2ed8d74ec4c8 +820,2e0fab22b3443e2a1276894a94e0503c +821,b7f0a8bc2323c3c008381cead9c4f7e7 +822,01c0ac2d611da8ae58d2f16c7660f6c6 +823,5bbe51838f3528c6e352e8a51e8537eb +824,4430017f7a3c25b96e8964f77e7439f4 +825,19925a75e3af945a3678f10d0aa080fd +826,d76dc9f515bfac518b6bfd73b91089d4 +827,940bacc64ae18e6f02cabbbe83b6a888 +828,df3c82cb5668a5d08ba279e49d8079d8 +829,64d1eb4ebcf1eb1865112a36f2648db3 +830,4edbce3714203a23442302d889fdc639 +831,a647b5300c97fd740163ae781376de60 +832,f5bb0ce9b2f68764dac51f7f4d209c99 +833,7fcae5fe6a4522672f48f4c90fee7442 +834,fd9e93fd3dfa0d1c2d475fca61c3ce1a +835,641636002483ac194b38b441e68ebbf8 +836,db1a4cf51ee5f227b916310276973d46 +837,5940d7e44dd6980704b80b5950fd0fba +838,22906c4cc200d029bbbd888e5db70656 +839,28f9c556837a0d85bac5b81746a5ad35 +840,8dae766441dc93e583befbac299fb7de +841,9863ee3e7088091505a29b405952bac7 +842,5112ae0a31667a787290ac4066fe136a +843,2628c5c9a78228ea21b4507cf5f53a56 +844,5be3dcc9be65f365c396b3571890ff65 +845,d87851631990247be5a893b826cea65a +846,76ae010a97be8e09acd3b38def3602dc +847,a5ce16633e01f8438dfcfd4e5b4fd565 +848,5dea251bd5c0b05b416146445912620c +849,1929b351570f28164451c40bab339907 +850,d333c26867ed4692d6b302b178ff750b +851,fd081030fc018fcd93218ad6089a73ba +852,a624f67380aa0e1d3a82b68d819416b3 +853,437d76609c213c76ed90cca571d18eb3 +854,9cf49c61e0b623e495a016a2436c8b3f +855,b39c5f36c084fa8ce3df1f022e5c05da +856,3fc91a1565a8ca4768987a83b56c8855 +857,f844a4c41b5a26f959e892f90137bfac +858,8ed588df3676338f8a78b6c4055b8e56 +859,baec52efe6b98ba163ccc5f39555a8da +860,517083006c524e51a3cdcae0cac60f46 +861,da13c1dfe6389599e398546da1ab5ca7 +862,e4f6de1e4165d31a5977d2684751cf32 +863,be52d91acdb68dc416fa9d74e400e0d1 +864,ad669a06cea8f89c729d63e969ed18ac +865,204c4038b9dd5f5ceb5de699efe561de +866,48eeff94f794b844c3eb359452d07c89 +867,a0056ae196f302f5e8b611f08732b90c +868,18c5242e06691a9a78354e74784c1e54 +869,7705f07d6b4e0a028885060167fbbbdb +870,4a844619795b4e207ca6b5c79b5373c1 +871,4af1b5efad790fe68560c203b0bc5289 +872,c1d9823a0cff616e4c59dc6742033750 +873,f165bfc2e3c74b7f8855872e404d75fa +874,de98cc214100c0167a0b9b8024adc8ab +875,57550fbfc3b8b42a02163f47c8222cf9 +876,702d3ce7797546584d6b0e9eaf6b3561 +877,b338327f8dbf6a7b4028813a3f35ad2f +878,9c2188c2fcc8b2e8937cecc574e8b9f6 +879,c965920d6d7c0b49b1ba0004b338355b +880,4b2943fb0b6c54d036fed1c4a47fbbc3 +881,95434347bb260f9a463d64848c3b0072 +882,b39e5ed5298762019011a9a4fe3f549d +883,043b2a1bc096743dea0ca6170e910214 +884,7fa384cd2977e5ee0a5efb0314875213 +885,c77471e8739a53fae16b9c325312cea6 +886,136fe01b5b0c8aa29d34e1ade7d6f06b +887,d76f138fa2babf4dbfe3b7819597447a +888,89b435bf014da4c3e8506ff29f508bee +889,1d9933539cf69f535ddddd739ecf908d +890,fa7bf72a2fc25f2880e174247ceefe9c +891,4d6cd112cd3efff63ff6e13a651cc49c +892,93e89570996f1cf4e009e7bb12fb6e82 +893,777843b6d0fcd6960a8210f71c721cfd +894,10cb9355ee6b1b659dba38d3c8c34aa1 +895,51cf6a87ea2bcd584cf8f32b6ae5dd85 +896,55b5cceb2c7a5582ad8ae1ebce7db334 +897,f02773fdbbad6ec2e92c2219d5b2b411 +898,611dfdb097688c419ee966522695748c +899,8cc29ef1bf42912ae54eb09bc6657290 +900,914cadd1a2f88c7648d56c73f6adb3f5 +901,d72c002cb7340afa0d0dadc6926a932b +902,69b5bc92ec04b236caffb049855f00b1 +903,c374ced520bbc1937d62e32a1a0d16d6 +904,d0afeda4a383e101f93841b5c9df2361 +905,82e8762490dc0b39130cc58492924551 +906,4562a7c4d1521aef54181565b482721f +907,39846bd5af9826e0770f487d218e0310 +908,25e7a7311141ffda4715b3a5969407a6 +909,b294593b2e0855d23c478580aaa09397 +910,bb5ee7dd60abd43f34fab57632cb8ce1 +911,012c6893005bbf8ba42e4f2a3c2df0c5 +912,33f2709a621b22e96fc90eb06a9f22e7 +913,2a4c8b40e8065d7b6b12c7d001f8377c +914,7419912dc256732a463dd713aca0a51e +915,28011caae8778a7f0b1b4bccfde22e75 +916,259287fc20adb706cc528bf43d544325 +917,5f707daec3d6a63c67e4975b051eeb2d +918,6d155bd79de9cdfc375204c2b16e2611 +919,15cb915dbc85590ad1a947a82c238da6 +920,778259993d692a3cc65a8953c6f719f5 +921,1b2c9990e5cf4f1feebd909d46065241 +922,a9acd7e527bc2b2ac12741922e72c6cd +923,24315eb5eb7b4ae6e9bbb62dd4cac966 +924,bf8f2f89e9bbbae09d73acd05a172b94 +925,79186f20848ff46c6c8648a9d6ee5f6d +926,da54bd0abdfb76d562be173d17c3dcb8 +927,3d3b941479f4711731a173cf44aa4f94 +928,ba75ba5eabdca4bde9eb7554cec88347 +929,774c562fecaa5a4d924d70774746fe74 +930,cb711ec514b8b3cb7c2a4fadc61c2021 +931,2f621da87e18eac2a48e3f3b57b5e150 +932,f6b1599a7785a5460dd35d4ea111c983 +933,edc204ffe6056149893bc6c193a63ffe +934,f2300249df43367790383d82060f8ba1 +935,37c44fb289b42ee95a924daf38a46e76 +936,122ca4bf58ac0db3f76c364e38e8a17c +937,4a0132780405a5cbfa076f7dccaa0d57 +938,add235aa4d454a644935d082aeb9a663 +939,0d1a589bc018a25f79c3f470549495f0 +940,46660786dcb1f54a7f811eb7626027fe +941,ca2acb9c8d746a31f2676feb201c10f7 +942,5e83c7b4c0871c64b850f904d845b03b +943,58d08e5e6998af559d32e9ed962b268d +944,31329595f2d682efb8233abb0811fd30 +945,e8b599494e07bbd56e43292c2ab55312 +946,bcd88e1ab5b3f261c51226b22f27fbed +947,3d31af9c20a31436ed5157a48f74dec1 +948,5ea4ad4c6ac28e3d6300db283d11ce03 +949,ede8e42d1c4842ec79960dd20e517d24 +950,620662b50242048d3f0dd8a2d1fcc1fd +951,85dc7f24cee70f03ddc76d1d4cc1479c +952,4f781e76194c53fcbedf0a7c1fbf9da4 +953,11f3c2d1b769ea2886f5fa35a0b7549d +954,33590edaec0e5c4f964bf247e30d8fe4 +955,f74d0485cb23429d5100ed833c330239 +956,05f4d2f6d234d3b926d9e516a0e36997 +957,0d55376366e537026e20760908a1809c +958,b74488f864118176f39a8aad5c64d737 +959,8760ae04567c19ff3e1da1241cbe7580 +960,3dde7d4d21fd23142a81bf3df05f2ba8 +961,395bbce2d23056ba1690a0e1b2e3bfca +962,74022b3987f12fd8bd1e76419e115fa3 +963,80a732aaca8fa678134df78252ceb283 +964,ea85bff9b83652ea9acd45011193230a +965,ef16b4f4aaee020578f2e99be4ce347a +966,88c8130e94408dcd3c4d0a98a46ec656 +967,20b51152fb013e5d084ce3854291933c +968,86192c76bfe062a3851d34e93e6fec0b +969,2cd1a09610a8a3e99baebf78265c8baf +970,39d82ef805e43cb4bbcfc21447bd1a47 +971,6b9549eda4d1426e83b0f9f012460e44 +972,76f3db896b1480aa9f00782d041107c7 +973,e9c16f06fc7c8f6bf64e4cc464ab10b8 +974,32214a84a9e133143cf11f63bdd517ac +975,946e9e52dddc4725f586977984691334 +976,b874d8ef3f9da32eb1d357f07ebebf7a +977,8a00a12958d94ca3267c3629b5666809 +978,bf0dba9dcde3eb1e7c9e99d48264aac3 +979,353d7336ccb8b4edff111339388bcb0e +980,996291cb902a7834fc956d8bf7740e58 +981,154cb6409559cb0261cee794caf2a9e7 +982,697603701f29bef9b0eb64a4d90bd64f +983,116ec4dd2a6bc346abe568e80732fba5 +984,a568d360597dbde3d3c681f45605d59c +985,0cdbd8ae86215b0ee2b2a08469652c56 +986,07454b2aa72faf15a6f2e7c7daeb4fac +987,43f56298d44d735ab5b66d7f067f7623 +988,2de084dd05744dee455b6f2561801031 +989,3d17d09ddab4a95eb1f12358dc34148f +990,c9857764a96738010cdf3193d20324e0 +991,a4a21d18106d104217a59c64fb32319a +992,7a18cd28dc47992b22f0831705f613c2 +993,426146df3668809e0ac25a5f7cd54820 +994,e75689b7eaf237f318866f52cd67816d +995,cc2d91172cd75191089bed9eb60893bf +996,a43e76a7db5897970870ddc128c8ecd3 +997,c52fd6ad3b032e19e792d591b4978ecc +998,89e5abae6db82a35d53fe06185af2f60 +999,051e9235f22727ff44e7c42c924268ea +1000,8b7510ab99ace3be9e6bc944162b8d17 +1001,fd34ef6efb34ba33c5d7cb06b1a07c65 +1002,66019ee9509bb7aa0f689c5cf391aa5b +1003,ccc0e22e3d67d2fc1ccc90f0e487cd64 +1004,beb2b1f7b163f1fd5ce809e973c1e910 +1005,58f80baaee7762b121a3ba56855c7c67 +1006,d4c0112a0be9a145daf8998fac5d2d1e +1007,df3b2a48b6a04238a2d91dfccd91d347 +1008,96735cfdd0e4a6edad9e3ac6416e0536 +1009,6c89ed42ee31843b67860798a18bcb75 +1010,6297a734dc857b2a4a94c48533ed1ece +1011,72213dcda0033834f6c5e9f5089463e6 +1012,acee5a9a2b1f4bb56b0dab746836cf72 +1013,33681da259daaedfec5509aed9d75ad3 +1014,5291cb7ed1431531eeed4fe695da9cd3 +1015,956da53a40b55eb307d72208594809db +1016,8edbb5bf90cbae584ec528b5ef24a5c3 +1017,576731c8a1c26173eba1570d1dd84940 +1018,581de1e00edd85eb724e33aa5097617e +1019,a9d6c5e76115ee4e03425249c07143da +1020,1a70f0e4383a6de113a7a497404e1b04 +1021,21dc6b6a46682528376ab9fa01c2a125 +1022,6cab299d0645b761f16b5b177890e33a +1023,14245a66f6f9b15d2cd035593114f1b5 +1024,0431e8341e8bd87a4e5a3638fc59c244 +1025,d864e359cae82d1e0b33fefe2401629b +1026,99e4c9d132063226acc5e389d7c530da +1027,570cf160e633cc70f84d7b98351c78ce +1028,1bbcdcdcedbc1ac3dbc8b65e0a778bde +1029,c2ad22188d98b1987ec83dab72821f97 +1030,413f11c8d5208b4ca4dca8d08c160a0e +1031,176e6d8e6141fbf5ebf34921ca10eb59 +1032,72722b30c769eed8e0685c9179d4660b +1033,7ad53291298fd720e9b1a92fac547855 +1034,9fc5ead1857e841055bc7daacf80c1a3 +1035,172f49b69751e06af506bee22621e822 +1036,dc4f5691c5a2f68612bd249bc34f5e89 +1037,a3ade4496c8b478b9c15e58001523931 +1038,199d015d2bcf43c80f9c077311620e5a +1039,47bd344697b8d82079967c65226bd1f4 +1040,a99e57d92f312a36aa4f09f441bd378a +1041,9508e3cde55c5e67dd4aacbef7199f89 +1042,c39219db1c6e42214e559da2f4639859 +1043,54c16f39cea1cbae5b93c081cb976aa0 +1044,8e9133420e154b87d6be2675c07de7e2 +1045,92e05bb511264109454f9c7afc4035a2 +1046,c71945097d19ee788bf3ffc7573ae25f +1047,fca43e663f7b4d832fa366975a98a0f8 +1048,e54e1d3651140f871a8737d86d770fbc +1049,5244377ef57b1198bb0dfbc049f2d332 +1050,5ddaea83c133bf2f7bb8032ee9241a10 +1051,15011abf3fad3413f7cfc3134d43bd42 +1052,04dacd29a79c292d87688ac179808dc3 +1053,428c6ac6d62a0140a7d2a07e2ff644ab +1054,6c0b2c8650a1d2ce703c45851307d42d +1055,f6ae030b19044dd6e8714c7fac2b690c +1056,4fdc6b6699b0ad005a511e18ff5fde05 +1057,71bae3b8ea223a5b87cb640ff53201d1 +1058,ed96285e2a2fa5671c77d8cc5d71b8c7 +1059,0f985d46289a4202170c5af03b19162a +1060,277c6f8ea872bc7794bc6b0849898fe2 +1061,c84bd383e23ff4b71a5588741c02bbe0 +1062,d429a813796e100999d69deb73d18e07 +1063,55dbc516cf47089eeb6f2ea98fc732d6 +1064,6a2329d844d923fbad3b089369a6327d +1065,e99bf278a8ca56c04943af35b6498eec +1066,198206f76e469438def054460cf89a7a +1067,fa43ad4dfc09e72659fd24fb7ec15bab +1068,32216e6907a1f04f87eb69495aebf4cf +1069,222fea95387f3032bdcc5c9f0d10fd45 +1070,3abc385bb510aaff9649413f0bfe5797 +1071,f1cda90d93c1a32c8891524258b6dfb0 +1072,59933e50006c03f2f9485438bf596c00 +1073,ac5e0f32a6510f68fd69ab15ecab69df +1074,fbbc74190b0a1e8914ab4885dbbb5521 +1075,0e37f960e76b8ebafa637bc6328ca789 +1076,10e8d34e6734e54e75b28d30cc4d6936 +1077,c828ad543f61d9d8809877a6ecd047d3 +1078,dd82d696656c26976f3975bb2f1c99e5 +1079,f90edba021f4fb6129507c5bab49528b +1080,ddc995f9d1993a4bc3e2fe9d75d93816 +1081,6f4d668e5049ae0772b90b37ecd703e7 +1082,d3bafe67389c4c30842879c4b073408b +1083,213577be1beb863a9f4cd65275a973f0 +1084,f2286947b882dfa147fb23bdcf66f948 +1085,c85673843fb27bb4a47bfaf1ab303faa +1086,0b25deda5b2ff4e9ee08505d7e25c954 +1087,2e5e2fd00bfc49788821ed7a834cef86 +1088,62fdd6bbf1e7c56d673a2a981a15e647 +1089,efaa0545710f8f0c46548aa9852ae43d +1090,df47bcb9285dd97907c16930629f8223 +1091,899356f7b90df49d57866b6927bd8e43 +1092,74e54636b81499b13ef8a5f883660ac3 +1093,8df3dcb1fe29f3e4f71eddf8c46e063f +1094,509089a22ba49ec015fed519387b65d4 +1095,30e1a534301249b3ffc87ea3adffcce4 +1096,e89444bd907c90477ebdf35e62e9c248 +1097,f9a6eddbb2436df2cc30972491a20d85 +1098,4d266a07a8c6837b729a27fe43744b75 +1099,7b9a5bb83aa113083535fdfd6ca2deb3 +1100,7cae44f9d26c54743f33e9910fcc6d03 +1101,4fbb8691a5c4e4ea38441cf31c1e75d8 +1102,90859d2deb06bc4e50ed0153dd6409f4 +1103,de948449dfb57dc26749cd546f8cd496 +1104,fa9b15db15c76fee98f58be7c13d7319 +1105,3919cfd02f7e06208ad8b6e9df458ed3 +1106,4c0c17c5c397e4c8f83695515048ab84 +1107,a7c271d1ae2f5b99fa3fa19de21e42bd +1108,9046c3d71484aa9eb9b7581e4a37f90a +1109,607476df1c2c21eed6744bb6f02a4769 +1110,3ad68c54541b033c65d152503bba6bf9 +1111,3178b72d217640a2a5e4d9c03776d139 +1112,82543da9ccbec5b7df29d1c2f27c7465 +1113,09e9dc1d487d75b30851f4ef253f57de +1114,0de3127f772cc225c8ef4833ae512347 +1115,6ece20517c8f728e73efe0b2604e7c2f +1116,dad3724bd3c6e80d5ad744f4704d103a +1117,6d17cdc087d81e389a3206a6fdf2c6f2 +1118,a9f919c860de81b2b5746a4a9b94769a +1119,461e4cd9406f113e97c0bed3ab55143d +1120,1adc8c6a064f01f66d95a44e063db5ca +1121,83c5aaa6ac56e986be3ad94c3a44b842 +1122,e1b4309cbab592bbcb78cebbfea24b0f +1123,736fe051786988fd071eb029431f7acb +1124,f09b4f8bed3d7ed19a47dae8df3a7380 +1125,a1b9cebec2a157f1a8ee6ac1059b69de +1126,27381fe2f9ea72a69676d63551351f9f +1127,aa912e949018e41ceef0a5ff80be73d9 +1128,53cc59804670d0b30c17abb9b473d624 +1129,b932aa1c2a13a4afb8bcdadc3c81c682 +1130,838b8da1a116501adac87b903256b1b0 +1131,02c01352041e0b0e9c5df3b675073b5c +1132,5de7af636e053b0cce2a5b4d52874cb3 +1133,69f03e5eb959cdd642f3e6613981d500 +1134,54d8bbe2fb97a744cdf94d48f40831ba +1135,601f352e6e8bf4d784cff5f75a1a1a85 +1136,281c08b1c42b62a5ce0a370368ce7ca4 +1137,5cc0583dc589c537e652387a3b5c6570 +1138,61f2fa39d48731bfd037c895c8d72c78 +1139,80c57b1c8bc6228820775f28b311670c +1140,6d503a4f81def12f2ed5b4357e132162 +1141,d1b16fa7b6d0d8d292c7fcb1ff235229 +1142,7887216137985f530e40a82dd8293bd0 +1143,906a18b7c4ce3d267a55181dd288c853 +1144,890fc4ebd243df38f010807490d0bf2f +1145,cfc9f34d35cda213d85e262847a7edee +1146,0b50036753a738ea9251fac561427dac +1147,a6fe3e776615f8f92729167b194eea82 +1148,dfb976dd3404fedf87936c11d01060a6 +1149,71ae693c3ddd397122898e1374f2be3c +1150,abd3af960ce627b64d0a05259cb30224 +1151,caeb426d4f099f9ec25019d07df5d3f1 +1152,fefa72e7d85afcd6d3a6ea593e828b53 +1153,54c0ffb54cdf0bb05862b74c003c7693 +1154,0a373c06dc1fea77f49e5bc5beea828e +1155,67e2f1404c0abb757bbb49f60ed89f0c +1156,711f1e93cbf3a72edfa2d56552f552a6 +1157,79f8be1faa15b440a8a7adc710507577 +1158,ec0d59a9ca06cbe9d4af84f23ada2a51 +1159,a1c2ad1ebdd94deb48e90389ade7d49b +1160,9a4996090f09dc44b015eae38033df00 +1161,b5fd3a0c749dfc046463ae8afb2089e6 +1162,857ba1892acabec8b09697aa87e89d4f +1163,3211a45f0b5a7a95d6e7f5ab1b3194e0 +1164,7e86544ea6e94910d4e1827ad4836045 +1165,87657753efb45cd0b189ed0917a9bd4a +1166,689213493e92a99b459c9f801a32740f +1167,a069c8b0eee83e556aaec4fe0762b8a3 +1168,0accd79b7061048c2c0db85e816d78ba +1169,921ecb3c20cd7f386288e250376827e8 +1170,e68d289aacea7ea4cfb13d338747d845 +1171,ec30732612688b4abbd68edd02a6ed20 +1172,c34be965e271eb828571e232db778b5c +1173,b6b8d5ea2c7d7d5057b7f5387526c004 +1174,f2d341fe4322971604a5d5e5f6d4525b +1175,f4016408739751d1ccf3d75669728dcb +1176,3a5207f1d3c00356d7a3c1264fe10678 +1177,7c816f7e4685864cfb4cd33db9827c12 +1178,143ad10117b0f80af39e98a17921e338 +1179,7625f9a5080c976befdd19b6f76ea3c9 +1180,eb776fa9826c0e6fc07cb10ae0560a74 +1181,97838aca7d202e5254880d3107f3adc7 +1182,1de119435db3131fd2b34261a7cb42d6 +1183,fc3f3387b3eb7fb7d80c3036762c79c5 +1184,43b507223aea00b9bcb5b87638d06010 +1185,22eb4ab43bea79513f22f60b5927e0ff +1186,7549d03da6402676bb6f4f14e8f23837 +1187,b69c595deb7b72c08a6ea2d8134b9d1e +1188,763b554979666d9e50e63116ddc26a87 +1189,d6242fd21f1bf6b578f2e4dd76c1598f +1190,3163c3225308bdc0dbb45dab184aa68e +1191,4ce6dbe5dac3ab74d8e71c2534f30411 +1192,cbf8f319efa0aa4b2e6cd3e5f31635df +1193,d723e0c3a489867df8bd3add66b9d391 +1194,286fff5000e68b77ee95fa5069b267c6 +1195,365b7b1e6dfb3be2f3634fffe3d049a4 +1196,7be78ea3fe9faf9f446ebd4d0d4115d8 +1197,e33c4f932eb55f2d43289a2024a981a0 +1198,115c9e6a887c049e55b265e17e44c1ba +1199,19df9f61be790b46580d01fb984d0c6a +1200,53fd8b3116d30e839842886d509345dd +1201,58b3bf1298d933c2edf6ac787f360ee9 +1202,af7d1a6679aa79f5422ef09df63494a6 +1203,5d34462a57fcddadc290520faf830966 +1204,9f91516e25642085abb2793fd557c151 +1205,3ed77cda93bd9055275ccd88ee1eff41 +1206,576d14bf89db1b7bf2550149919b0d5c +1207,25545ef35d1e076d5013c08f53a9b233 +1208,d32d72902a632d4023df41af933b42e0 +1209,2635826393b4774ee0c2157b131b393f +1210,12fc1c72aa3e35169d53f401bc176ae4 +1211,31a9af80eadb12e82be763838585e898 +1212,ccebd3959056c171b6285934465314fb +1213,4798f93d8d03055695b86c1ccf8a0592 +1214,75dae5513de62a8c3fee3b0f675e7009 +1215,2692d8ca85f9380d8255b5b4ec6d0a16 +1216,4f69c1d95be568b744cdd67ace3a1a4e +1217,932d41c1f5904aee029dfcd989dd7daf +1218,1e0fca2804d7a496cfc6a6426c56beb6 +1219,73eecbd9ae675a3cc7c9253d935c1b53 +1220,29577702650cab1dd3f28489f831bd69 +1221,754e4231ad9ea9e531640202da5b10e8 +1222,8315d3fd6471a70d313c07f02b6cc4e4 +1223,818e12d6dfa0e09371e19ddc35c4b2c0 +1224,fc0b65220906c9cfd1ef9477eb4e251a +1225,ab2f68cd1f5206b96a76a0ee79a82694 +1226,4b2461432f318d7a446ed51ee484039f +1227,962a95e987b23b1041c64d2ca3f9e07a +1228,788833bb6198d0c87cd00bc9185632c5 +1229,09eef42b9bd0b82edcf9d260d4d3e6fd +1230,875f6f2471bb911a26d937bcc58395fb +1231,e1207c45a5c8350ed5b48df514574c4a +1232,1e8fec6338025a1a9520ac369c86b637 +1233,285c1a761620834eefc2427b0d749f36 +1234,80bc2a4c010391f0290490249511bf76 +1235,6b9f7b6fb2a160a9743c23834e13e09f +1236,acf4c15764658da45c55526041527b02 +1237,8da70d4b8a206f8129e63c41120c7b4c +1238,e4a4314afb0661ee91e97f598aad126b +1239,174f545dd6f0dc58589c6c6c64ae5350 +1240,e9f419a7d5e876ec2f895b7096fd0c08 +1241,59c6804710eb64653a9155a63f27ab49 +1242,74f778f029d881b68ad4e85e4aff276d +1243,3faef3d3adf8f7dc04a8f2e839b53e6e +1244,13243d3e33fab9ea34991a4fefb805af +1245,c9cbd1f20860c9478c55d6c6392df617 +1246,9f473c226fafde9b8135c23954f00ca3 +1247,0fd84ae2b1040c5fe7b3de2e90995fc2 +1248,eb3bd7eaeac4e2ceb6abf9a104b4b56c +1249,dcc435ea45492ae20d3188d5b7098f93 +1250,5be13ac0a212225f28fb0036d312b23d +1251,440a6733f940da2ea493a61b2af5bca1 +1252,a6c478544a47eaa50db961d7a669b03a +1253,39d53350dd7aba30f1ca81eabbbd3063 +1254,8cb4378b98167e7099d6c80b7e3a2110 +1255,82f1f6722f559fdbd7029be4f07c737d +1256,8b5bba082afe0cdf9ccb9fae6ad7b036 +1257,86ba1e87b52f46038d05f288078ac8fb +1258,2883011cb27d0b06c010a3bb5303a367 +1259,f77188541842152072f1aa685840aa35 +1260,4fcdbb434c368c3ccb1cf87cb39c2756 +1261,e931f6b6f3d13b9f14b16d65d9bef1ff +1262,bdc8f44751dea36d8950e324f2053e0e +1263,b0e3c7931875be11171e470af8e6a52d +1264,331f349d5837648169d813614f36ed59 +1265,142cc7cd2d46dc525888795343435be3 +1266,7c3da6d2afdc20064636e3af530ce1b7 +1267,7b639f559555a083e91204f3072e59d0 +1268,d6e5e588667fb0f46973b3f68673ba01 +1269,c21e8494b4ade2310c22d0406c497286 +1270,62580b0d853d28bc83eb71e481466a7d +1271,87d7470efca297e4a14e1e341d46f33b +1272,446fd1ed63e874562fa4758f8624af22 +1273,97ffabe9791c35c0104978d0c56fa87a +1274,e2ed667a7d21cc925781d744bfd6e087 +1275,6de1d0118fc2fdc687741b9f28ccd4ca +1276,789016acce6fc3c0755ff5406e4058a8 +1277,9049dce01b91ca6b19f2d908302d5ddc +1278,6d9c69c12cc542709b12d26a4c087a94 +1279,09f355f56121cdbbe21ec430e8b57dd2 +1280,ea6efc70d5aaccc7e21deedec6a6cfc9 +1281,ff0e131f75266863136e4f22e2715eb4 +1282,1c34917869cef1907bb8dc3879006cff +1283,b52d072501cc140a6d0a257363a4a472 +1284,c840651d1b7aa7a0d9a41b22192f8c89 +1285,bf5a3fc11bd967dbb8ba9f58b7da7d59 +1286,44ba8bade74741f9ea9e14dbfdba0177 +1287,e5e3f6aec5d1b55a005787eeab7c28c1 +1288,30a8d1f0f53d6eaf7d5fdda0faa1de10 +1289,9e09010f324852bc7447d2876e959bee +1290,1718fe08af847a2d4fe8bbc759a0087b +1291,5ca4fd8265b41dfd26718a5aa4776d84 +1292,34b9c1a18ae7fdea6c6933b0a62fcefa +1293,7d8153c3869dec702ef9edd49ee7be4b +1294,5b6c96ada3f3a18fcb8af5d93b999cd9 +1295,081f214a9f5663f9f7ae79ba36c15484 +1296,46d71115fb0571c14b3e7f220d0e0b3b +1297,1d5356d19b84ba2203a84efea5675a59 +1298,611a16d5d1f4d87ade9a9d7b21040bc8 +1299,99d326f629a61258b0e017c8e9fdfbfe +1300,d584f8317b37d862fa4bed9336616249 +1301,5febd3d9b5285b9addbc7a7af46d647c +1302,536f4097d4d0035edc8819998377bd72 +1303,de4e6213a9e3505d5a2a7ad3013d7368 +1304,2f639d7a0fb439c79c911b3838a624ad +1305,e77525c8f9ef75b0bc24a60bfbad2cf0 +1306,e3bd7c61d326d5832398de359896ba87 +1307,c9f905cf076e6e234c1e6884ddf0878a +1308,d34b1e9253887e3685353cf5541af907 +1309,7e8b69c09cc05ab781a8ddf5bb431cda +1310,852c6aef5329504be8ec21f256cc2288 +1311,f27a5c2ebf0157addce93da8d5831ea9 +1312,b5597905fa23ae12350eb3145f3b007d +1313,7f03654530bc5372f4f0bf3542aeb357 +1314,e6c8eb3d30dd247963ae0bbbf8200ee8 +1315,7059d2aee262b9d4fa6a0d7d54023fb9 +1316,50829fbc27057f3a8ad112ae7760e82a +1317,15f7708cd954ab7e56b9382047e9914b +1318,b2765c7d5900d294545947e06efa5d20 +1319,64e19db0838e4762f54c6ec6d2464a1d +1320,db5f3cd3df948338db0d9bb91cbada77 +1321,6d2370609e224728db56b1742d18eeec +1322,7877bbc6f93ec3a36635494ebd86a87f +1323,24e3e8baeda04cbf4b0a34e49079579a +1324,a119315ec6d1fdb546a8302c34568009 +1325,4da98fd92a9eb408b0827aa13b55166f +1326,de8c6c2262cbbb09a848db03b6740735 +1327,e97c4490a3491a39e8a35081c89eb273 +1328,ad662abb0377d3496902a1fb7019d22b +1329,0842417ec86a1a92020528e991eae911 +1330,77c8990e026adac0517a2b3e6ba19acf +1331,51e1673aa1830dda95379afe12146244 +1332,6e09eef20fda94c2871e8a80d812d792 +1333,23faf222360b845ec75adb343ddb8fad +1334,211488edc3b34082dcf5a5ed302a2966 +1335,0be0fe2332f9c6d6a5ffce6325cb918d +1336,1b4764fcbf4085acca55ada1cdfbe7ee +1337,9f438de70ea1ed2f55f52206126caf33 +1338,1d204eff0002e294170d9f96ec8f0263 +1339,a7b04428a350a94d52eabe089cc83596 +1340,b961b77e18551ebe31376a660e879516 +1341,6e69cd6fa8619bb38d911a027ff4f31a +1342,772dccaf9857c37954f10e9fd91d545c +1343,4564adc728175bf0c813b5f7be127ae5 +1344,a3223e2b4b63994bc3fcde773e85232a +1345,5fa5277893d88f92a1e7e3a8e039be1f +1346,b5d6393ef0c9e098f2344fa25d5f215d +1347,2d92874f5365aace4f2c1251cda8b016 +1348,8551ba12bfd7f7f4794fa681ac9b0c80 +1349,f3fccc95b056f52701d433802db8a0d8 +1350,ce412cbe94e6baddee4f810666b15ecf +1351,27855c66b08f19305db4d229b98b2825 +1352,7e83c8e23a2a305af79b35f6221f9c41 +1353,4674a02e0de3f974befe6047552e7342 +1354,8dc292bb6a14dd8c5f5ac332b55caa48 +1355,06fa95cd5406c7a822979c9b9fccc55d +1356,7084626f40dfa11cfbbe044e58453459 +1357,5c406a505f3c8e9af50919845ebed6d3 +1358,83593cec9030e430df7ab72f68ea5c65 +1359,e9e657d65c195e88d9663cf4817eff00 +1360,38bed2158f4b7237dbe5e7b5d7b57782 +1361,403a153491a99ebccd90db32f211161c +1362,7d130615696c2ef3f069fb65533f3f55 +1363,bcfbb29a08e06dd559ba5d99cc182e55 +1364,1cace727fe6af7876d2e82602982d8d2 +1365,34d08fed117c4ba763ca6481c34165d6 +1366,bbc5e786e3d3268013060fcaa3ae992c +1367,92a45123c1ad3f0626a51f8b9b0906ce +1368,133cba2745c6988bd7d0696f0994bef0 +1369,d8d6a9686bda8ae69081788c5b59b44d +1370,c7319110f6275de7938009b4dd9fe04b +1371,ae44f91c849e8e9a9ce3fca8d1943a3c +1372,8ac0ce4143e07b91cd8dd66eef7c25bd +1373,4e7b664732f8f2677665749bc8df84ca +1374,740d5aee78fd2ef084197439eec83c92 +1375,a2452491b4103ec37714a0b0b6774b1e +1376,795a4fd2bf08b8c2a5510f93ec57f6dc +1377,22507193b9de9621f2aafbd1b1093f5b +1378,c5ea39f881394e3f040c59522362e9ad +1379,75017b852eb5eb0380a3e65000fafec5 +1380,0006bedd53050c117825d623905651f4 +1381,184d9b23494c97075a271a0e8f883cc1 +1382,d07429784a0249648f91baf5bd9cc47c +1383,a273e653803515cf61998388aee152e3 +1384,548019e23323bdfd7ff7c816ac38fee1 +1385,9ff2272a9566459e635040f71d21d672 +1386,d2dd1711bbb3b5417c8c805ff63d3885 +1387,984117a1bd9b7383954afa066f8bbc21 +1388,732efbaad96702bff505d58b6ac185f5 +1389,e2fb0e6adc30383e75681c64da785254 +1390,a8f7c8348f9f59ad36d204d9a7343fd7 +1391,7e1b91f3bd8fe9f4824d0af5177d7cec +1392,3950347f0cf5f2d6063f068ffd0f53b1 +1393,c8c521c6406d2722a9d54db75efa89f1 +1394,0f09f896302f49c0cfaa258360c9d650 +1395,550f60f3aa9302cf66149f1df9c44175 +1396,898c86e96b1876b23f30eec83ef8eec4 +1397,226cdd64967b31275c532d1c0a229668 +1398,0da947878599e1611fe2ef04d137ed41 +1399,c1ddc3dc6a775f623bb14b8ca026b8fa +1400,effed888dcf2dd8f2d2e75adcf3a9637 +1401,45d5cc118c7787e86d1d3a7a42a34bd1 +1402,16396a2941a59eb1af7307e4e78d1c61 +1403,cf9933259ce752bb5d5528ba14473112 +1404,67a0b7d27134c7623efa5866bba2b8c1 +1405,7b50e3b8dddf778b4010668e4837c307 +1406,53ee560506720276105031c4ce58082c +1407,64714a938dbd278d28652126744c0abd +1408,e3d66a4b891f1a48ad8068b6122b05a5 +1409,f56665669f18d9aa98bf41a48690e272 +1410,953e6b63a2b94aa394d7a6d74ba80bb9 +1411,8b9ba95a9262f46f03819d62503d41ea +1412,0916ef4fdf7f3eebb8f4397cb218166a +1413,c1cce12aab37f3e754311ae0c28b55a2 +1414,8bdf76e09ff5931a62795e0df4635601 +1415,95b21711fefe4fc3e6de212e4905aad7 +1416,1b4ae95310c5e9af6753f0123e91cb10 +1417,23a6f2adf93737d396ab91238bd40ac3 +1418,b049cc066925f6737f1de817d517be6d +1419,966aef9927ac9f1aad3aff3d9688958a +1420,c90c34503c3e29ca564f67eb414b1425 +1421,583d1bf7126280b5a438c46fce193473 +1422,4149e86f07b69978c8412b0fd59cb173 +1423,ff30842bb5978dacf2bb30cd70d02786 +1424,a4ec2d770592ebb20900e54908124581 +1425,54f2e2aa51e258d57bf7db445470f987 +1426,9e336521e244216fd79c74395e9c9089 +1427,c0fba776d67286e2303a71b5a3c0b247 +1428,709613bb67e0c6dc33e20290d5fb9598 +1429,0d5710ea00ce348beb5a911e02675c47 +1430,102733ac6efae77ed94d1e5279282e4a +1431,9daf23c63495476f1f905bfefc3fc029 +1432,897960b45ea674ce0951df4e6f52889d +1433,48624d06e914f11b1d807c0de4e82cf2 +1434,9a2cdd369f793eccafc00c2d9dfe3ae3 +1435,7dbe5e9863f39b2a5c4d0ddd96d3bea4 +1436,cdefe76128802c21241a0c05af7482e7 +1437,522b51f08b76a82b0fce040a3edc6243 +1438,6170ee3900e75a63a2bd37709e265490 +1439,c97aaa67f5b8ac903597d5a23d452219 +1440,3d782db2f672a29168e7768af7ac038b +1441,3bf85022539b5a7d851245be79f906d6 +1442,2efb629aedacb29c576725a84c304107 +1443,1e5b2c136c5729a6f4834317048bda2d +1444,073dd723e2f1959dbedbf0c2e854a583 +1445,cc661449a11329972d3239f288fc7ef3 +1446,9a6782a0058d5a6bf6e438d8dce1ffcd +1447,e4eccfdeeb1119eaaea3396b559d963b +1448,c79ff2a0b15a0710605d81799a34885b +1449,6cd9288be1eec52e95400fbd5e326b6a +1450,ca205c1bf5bed28b61742efc01bf1345 +1451,6cc3b7e6e7ef55eb32b25cf7a2ea3acc +1452,529c98403267b7142bcdcd1374ee7674 +1453,35777b8f8f9d6cded9de003dda29de7e +1454,c85a5996df12f87a1b999e3d60fcf207 +1455,6f21671d8854a9370f9681ef36bfe795 +1456,539b43148d31db8976d292f112a6cda0 +1457,fc069749bb2a1cc38ff313343d417281 +1458,a358130f42bf55070acce363665fe99f +1459,e11752a35babed259743149be0ba6804 +1460,cba84c2d8f98055e632baddac8f26521 +1461,da4c162f0759f49b061a31e11eb96c7a +1462,d47a64c851c437befebee73425b1a201 +1463,6901fce27567cb4599c40624c6ef2025 +1464,bc2a3df8cce0635dd27e0e2e2a062a32 +1465,470970e0f01d9ff7f921c6ccb8c9ab35 +1466,4211de7a745ac5808ff9446b2279cb9c +1467,b4322e6072635d03a82949106bd58bb7 +1468,de1f6446570c4d453d1b94f4c7cb7657 +1469,7ae92f7a99aaee6ceb11eb9bbcb290f2 +1470,5ec9a30114cb926dd9538e203efc7749 +1471,d6bc402feb3c6b6f00b4ae6a1bd5859e +1472,78d15a356289fbc49f10ad66ccb82b97 +1473,a63befd6bfc259a36e9fc04a740fac9e +1474,ff66f11878326065fe3e2728a709664f +1475,be3e935ce7b7c8055863f206977eabb4 +1476,aa343f8652fe0e2f20162479dc2a04dd +1477,6755e10bf8080f2a2d309dbe5d0483f7 +1478,cb732e846332b6cf9eda7e7c345de73e +1479,1d65934d0052ee35d8a34df64d7402a2 +1480,0c78ba09ed434fc94e3588ddbaa51c71 +1481,b9de9d966d48b50edab825e2a443e9c2 +1482,0ff3df81efb6ecc6f5bf6f8939e4b11e +1483,7785b5b92bde0572c3f252ab9eae7925 +1484,3f1f3b49c20f3e705452e1362ca53498 +1485,a84803ca03be6ccb0370928c30eb15b9 +1486,fa8bc4f34af4627aeedbb2b9731c9af4 +1487,fdab3ca1fe6507256338598c1a983480 +1488,8be8ac30e4a823733ad40446978c9aa1 +1489,281d2f5f9aeee9dceae5685f1c9db95c +1490,fc41c8ef9a0fcad782e7af65a8d35342 +1491,e508e4ba2ad4964d097609c88904743d +1492,2cc7e20ccfca707ae4f537643ffc82ef +1493,2a46954ea3654a13373c8b4ec2c5eedf +1494,c13eaee84b07596a849c635a3f7e2498 +1495,c35888b1c8779c2ad5db1cd16423ab65 +1496,8b370c549b5492927cbd4cfbf3b009ab +1497,2fb7fc78ecf09b68084dd43c4c76b574 +1498,49ce1bf659ade890c26579eed4831efd +1499,e0d4a1442890930849e538c74ba61bf0 +1500,ef05300185a66cd41031d7d882441ba7 +1501,e33421f163817fb8039c0a64cdbd50c5 +1502,d3092549748facb4cca2b813022408ec +1503,079bff6cbc74fa1fbf2af8dd371b5fef +1504,de726edc0a053dcfbd3404ccf717a26f +1505,b0f630761fc693087e1612f335cdaaf8 +1506,e6d54a1a4f4e326e8f7e4cf2789d410a +1507,2012abfdb8f063d9c7b433b20262acf1 +1508,30933cea481a7b9eca9fe0e88470260b +1509,8d7083f82f3a9dd37cef3eaa17a8ad66 +1510,e1cfbd1db38749f03859ad04318e053a +1511,1d5d195f149d68ec6d47dea2fbf9c047 +1512,07b8bc5ca29284cc27b158377109d856 +1513,dafa50cccde6ac7296afa3fa3d22d281 +1514,a6ce213f930d167fbf01c74d69f82be6 +1515,b204253a99e37006ee7c0c122f511ccf +1516,1dc97531423ba72e9e94ea84abf7d9cd +1517,c0ef10749da6bf893fbe3b42f59b668b +1518,ba361bbd1574040dded530575f7b2f3b +1519,044d413886b08f834f78bf6528f382be +1520,27cdd66321e33355be4514800bffdb59 +1521,d254920d4f41abf05c8c73c1bbdc3f4e +1522,77a3d8e4ef6c6b1c0e465952faec37c0 +1523,16471fdefb58a2153f5c5385933c1729 +1524,b238930cd58eaeceba81fa81d231c3fd +1525,338d39572862ae076cde3802f91e208f +1526,be4ea8d1f179d168f2f061eb9c28bde3 +1527,b3d2c2f641a2ba8d81c7ae8b146707ec +1528,5e4478e5c27c2af33b7ac95aca87f7f5 +1529,2c1933fe7e6945c30d9ad577d2a73119 +1530,6a1dd8e85528f315d9373de742f5c8f1 +1531,89a0289ae46ddc5e5e725800f6144e2c +1532,0e1958e32c9396e662b41840ae2e6d00 +1533,379896d481610234bc778d86c7e2b843 +1534,b26c17f6761bcbabb83d7101c27dd505 +1535,2f99e3b42ee72e787bbf19f9a90ae465 +1536,c3be0d280548d17d625d0dc2003c1fed +1537,f95ea3eeef2a0dcf1de460a1310a3950 +1538,e3711cddc6038cd452bc337c3f11828c +1539,ede29db6bc5698d821901f1ef98a276c +1540,e4b64d70cbb86b813315c1c034dcb376 +1541,bb85af9ff33dfba621adbdd1a1d91711 +1542,3518d54cb9c6ad8cf1cb728205de83c8 +1543,c769b4a0a65e595c1992230b2aa55392 +1544,21269d6015b697653c62a3946a9eb604 +1545,5a6c02b414057a38cf019136855b07b4 +1546,fecd323792b27ad9ef12be4e351ee89f +1547,4de6828325f72560d46553adf47dc86d +1548,5a5c9ca2b3a6fb22b2e82143fcda2fd2 +1549,e51cdce58f038051f692f047a546c5ea +1550,b4e7a69886f3115af30d027b5f9916b5 +1551,732584f8a0370d3a461747f0dc5991c9 +1552,3337ee7c10d6d97ae9f63399e4807b3f +1553,3a53c47b776540e52a8ed5355d755dea +1554,c91f6036b513130de631a58f55488209 +1555,8da9278e392e4cb200c8c12696ce44f5 +1556,69a91641c1f48c992b73aea7cc2ee554 +1557,b38e669915739991d9adc441ad5951b8 +1558,b2fe77c55c2ef15d797dcf09d993f747 +1559,0348d37331508f2806865eb0d4c4bf3b +1560,cfbd0b29929c59ada9e4087b60ca09c4 +1561,1a708b62d8692a487c729c6bcebf73c7 +1562,5c8f89349e690585b71af8a6c2fe3bda +1563,eafe26e175872ce0f8d39d439b8666d7 +1564,49d6af01b245c606d7d80d6564999373 +1565,ad8023f68d2ce23beeb83c2a1a14fe26 +1566,364ee5fc5662426f4bf97d2242186dd9 +1567,adb58017eaa62d5e83286ca1d348dd14 +1568,b3420766d04bf642a1a30b759d4c80d1 +1569,e7ca64dcd36a033b4d17dcd15fb1e21c +1570,376318cbe3c784f9ea4adeb5a90a1d4a +1571,bcdf043750a3f4c0bf5129b12a5ba032 +1572,258d154b59abd26d2d20d57572801029 +1573,86dc8686e1c7e52f5320423b20e7da50 +1574,0c5d064d4dc782b907f19e634c02f0f5 +1575,917eb8c04983dd5fa71c213dce720fef +1576,f6afc41874309223468d6beb74c14501 +1577,1e840400be0ea59b16958b2379264426 +1578,0391279fb4e191a451859f2901202fc5 +1579,afd8928fe655aa4f9cffe569c71665f1 +1580,2ea85486c9bc7092a15a9aa0f2142cd0 +1581,2fbba7cee777b487c214981cdd4b55d7 +1582,abf9ebd6d7235aa80ee81e57f7153e36 +1583,c1d95f0c3240d2ef1b1230059941ab62 +1584,b93f689bd96a482bda91296ba9a51de6 +1585,0f4511bea97d6a9542faf6095546cd79 +1586,02419d8e091fb658a45793acf462a428 +1587,b159b51a4915bb2ba9fb4d565c889909 +1588,004684fba4dd671ae155f64ec0b069d4 +1589,9b1e88a22f5551736aee942603b8e68f +1590,8b658d98c2f2bac432e047a093cf3690 +1591,ef60ef8bbb4b40bf6156eb2ea110756b +1592,5fb15292d8425f626982da80b9a1a81d +1593,a5aea757157ac09024c9c1a23872f387 +1594,78f7370fd30169253ee033dc14713dee +1595,5d276b1c858d8a4072b1aa9312db1d89 +1596,bfda6832f367b6bd86de550a821005eb +1597,f9b5966e0c21fec0937855f6a93d44a7 +1598,89153f71dfd1b83257f83a401658729f +1599,c3bc9ca2d21d4d4929b3678bf079eeef +1600,e3305e8d9e5c19073b0cde63ab13de56 +1601,b31a2eb22830c219e9a112a3f904859e +1602,368ca21153af4b143f913502e7acbc5d +1603,71e230e91fc246d6856ca28ac53edbf2 +1604,e19909df795c33cd663ef61e6e42ced4 +1605,c270cba9afd31cde3c58aff2e7e747b4 +1606,a4194a063cdad60351f52a049b7a5668 +1607,56cda859bd99bb7c552533677436491a +1608,bf155676e1def1abc3f579168c2657f3 +1609,c92654f752f28679ff1ac3d69d93fd82 +1610,eb048c53d52145fe8e413f36a8e356b2 +1611,bc5b904b7a4e74c7bb6b0c51ada9dcde +1612,404b576e2759e6f0abc123c635d34595 +1613,5958e912c4a8c84a58670deb46516064 +1614,6fd1fc379c2200f4fcf4d5074c8ad61b +1615,ea2ad0989a000d3243fe2e61f5af09e1 +1616,db34cade560a86a50742e15935525a4d +1617,c4f94ed55dfe74c6e71b521d496b48da +1618,788f2537a6412035a195b4b3069cb087 +1619,98174c4dfb1cfdec3e45369ef2d01ee8 +1620,773f0cb5d0d53dd1895ecb37fb821da9 +1621,17fbec820c19be63b950395acaa2b318 +1622,1f441c5e21ab96449b15771765220dc7 +1623,8fec82e3d4c2a671b1d3cddaddab5ede +1624,ca682e2736b374b0aa7ed31d030962a5 +1625,31e0d312384c1f553477458c826781f2 +1626,f3ec2ee00dfc7a95bd3f3b41014a37c1 +1627,19596b4ca95a73f360a145cb42541e91 +1628,74695a252c8802c2402ab15a751e38b7 +1629,e1f0d9d78931c33c20f10601c2436b0f +1630,b4bc9ee3ba76c5fd64f1c8e927f7b392 +1631,41ea2fa361bee1fea725b036088a7770 +1632,1f852f50ebc637d1aaea7f3bddf94f9e +1633,d15da586601a2d0a8142f6a96d13658a +1634,f365d41b51ee7e8724d6d127ee54d32a +1635,276fd491eb4457c013e7f5842029b7d9 +1636,3250048b5079f8ba0521176a2b1c26b7 +1637,b5e9c765fc405c0ac10137148c97d1ce +1638,9132a05a283e03fffd0c45cb36528792 +1639,6178615cbe896cea3b4a63dde8900fd5 +1640,9a51c81348580acc5de257bb27883216 +1641,779ceefa84fdf495c8b6ded4edaca7c2 +1642,29f7ea6109e2c0a2462ac5f7e54da4f9 +1643,09ddbcca0ffd02c01849ac7a23a44d9f +1644,4b8a76de745bb150629dfca187d66b4e +1645,027bcce723988ff970a76274ae3ccafb +1646,9238c11c05fd832122ec11b8b8d9ee2f +1647,6efac79ca76a2c943db894929eaeb28e +1648,92e24cfb5a87ec5b62db69c4171d675c +1649,0bcd8664d35cc65a06254761cb5b5ef1 +1650,eed19cbdf3856d9369e801e9552bccc2 +1651,e1fceb8257232ffb36c164e690f67db6 +1652,71b20caf1b9e86169e0018b1551a2f00 +1653,a5bfd47ef4ed9b4b21009752b932572d +1654,79b53ad116631636595ff4918c21547b +1655,03f96415f0c9374c693070c180df2134 +1656,b3ca44f0a519a410fb15bd4c53b7da3e +1657,95576224c23c5a025dc0eec034174b1a +1658,544e1ee9ebf5597098fbc1d311f161cd +1659,72605acdc72fe6a4a05f1503d2766524 +1660,de4b5c9d046b6a3ce1e5645569a70253 +1661,56769e4f92a5eebd08f7129285b3e071 +1662,9f6ea959752a5042529d523086cb06f6 +1663,b2bf312e9cf7ddaf38c5d5ed1bf49050 +1664,7bb392496b4ac0d76412d5f6b0db0a1b +1665,4c7896d28984f827d540dfcc00336295 +1666,eeb56fd150edf654c546106ced064b02 +1667,0e85a14a513bed652bab046a5c777bb5 +1668,55d62aa6e4bff0321cbbc63813564389 +1669,74d0fb33546dd4c04b3b10161ca193fa +1670,603051ffc48b04afd981b3946a66208b +1671,addf8ae63fe3291f19ff945a74b99bee +1672,9adc02658514870d356278dc75aa30de +1673,4595053b1b489605885c4d54ecfa4f78 +1674,c071fc39d3a764f23abac705b4c11f43 +1675,8c224f1df65354b76e46fc57df24ba4f +1676,2772f1617ec0cc6a4217cba0fba6650a +1677,47b4c8dbd06a24c4ee0b0cd884e67428 +1678,3c06f167db21b071eff5cd6683affbd6 +1679,56d2049be898fd9c0eeda31cffec5c71 +1680,167140b070a826a4088124383888a3f3 +1681,d49783be6bac51e0210735c5b73c0ae1 +1682,675e3c8c464da453fad437a15493948d +1683,1643df5e80d54ddf34f3a42ed74b7d4e +1684,0fd0e2e803c38380421ffc12e795155f +1685,eea90f11fbc9aa4b7409ddd854a90aaf +1686,b8fae27247943b005e4027d9d13dd23f +1687,c01b80c812aed48830a41fed0d82430e +1688,1d1e5fe1c4ac22267ecbbdb1ff46ba55 +1689,8daaf3f5bec058aad9882f799731978b +1690,1d1723ea75c7b59ff721c11ac2c470f4 +1691,10214c4efa63d7e6fd8f6508a877f73e +1692,f488c2295a852c2c4a3f93c56b7a72b4 +1693,c5c3a83f1ee23042ff3c9865d1df8ff8 +1694,ce7014f5aa471eba6a5329b933750f58 +1695,b094ee79d589af39e80bce42f36a2688 +1696,8705fbe686fa218b22ef33a5092d441e +1697,5bf474dd3720f64ed4b677d6ec8abfc4 +1698,abeb75139e4e3ff892b3ca6262d7352a +1699,07d4a47b1d9e56b44202e4b4de6ed712 +1700,cbf12a941dcaf378e5b96fc57e0cc2b5 +1701,8cfb689941fb507a69f2650f0f319c0e +1702,0cb702fde019a5b30dadd3e403f772cc +1703,0603a7d5cf2f3994aefe142eb1eeb0e0 +1704,63773efaad186268a3954f48aa2fbae5 +1705,b7869a040aad871a52d548b113a1433b +1706,7908c0d440854b6244a8310672841009 +1707,61ef43440c17fd8fa7113ccf690dfbeb +1708,5b55042ff38b87e3d9eab9bef6bd7200 +1709,cc6d8f49e0f68e3c8088a093df834ee8 +1710,2637838ae37091bf6f73ff646ee30aca +1711,dfeec1e1bc852517bb3b9de6097f7758 +1712,337ca50e3de66c286bfb4b9cfa72c6ed +1713,ce9fcdc63b90b96eb70db1a9acc500e1 +1714,c5e6087b54aa5217a63cd4dc5ead9ae4 +1715,1be6ab1ff736b47cb771b20cfb27c92f +1716,43ce3a02ba60f097c7bed5c2a0d929fa +1717,16c0058c7440c8e6b6081dd692c709a6 +1718,890fc97a68a53b5860ba243a8f7bfa64 +1719,cf794e94673c37299e881e25ee8de50a +1720,3717b759f2019a6148ebbfe0a8af2d49 +1721,07b65a976750b0bec35c298cc1932763 +1722,9c6b709de482e3a03fd272b8e72b0e9b +1723,f91b4e33da9b59c5d8753c3a5b743a44 +1724,20ccddfebb22cb087b45d01eb8a7b61e +1725,2b91515f4db0ebcf9d96635a92fdeb36 +1726,c880f0ab3fc3534b6ac6eebc6ca8f4eb +1727,56447fce31f7906ba0e9ba47de5c0b60 +1728,07291a6464de73ca9eba57e483846b5c +1729,438039a2d3cc15500c56ea92a2fc0bce +1730,983abf4d8d88411720c402ca6d4b208a +1731,3c63e7a586096159f80e6ad1be2d79ca +1732,5139ce1fa1dcf34b4ce3299453f3e40e +1733,8a11654f3c40f119e1df67f37e72a2b8 +1734,c4f6995fe2694c6adcb2268ed0fbabb8 +1735,f7458e732e1fc27bd7396b6a5eb4e4fb +1736,e461d2a4d95e366add9cd90b5a28358b +1737,0cc0ac8d6c10ba4392ecce436478c82a +1738,2706e51dc02090e551cb40995ea9e123 +1739,697891757650ce320375be974e4357b1 +1740,40a03b48e16923cc2c5a13bc3d1159dd +1741,e837d0bdb67a4f80028d7992ead89fff +1742,e31839c3607ab484a670c1a37a721592 +1743,b4b87339c75a9e3caf2a5cb99c9672be +1744,1b018ad5f585d05741d3c571b700c7d8 +1745,1614dda201789914055e37ce59fdf9a4 +1746,e0fbf4206cd03cc6ee5ce46f41d1369e +1747,25af646e2244c8b1a985bd756f0f31a4 +1748,ab65e582d95e5ef53eada1a48fa1c382 +1749,d9c18606d89fc1ce52e29e99daf4c83d +1750,9e7cbca32ea6293b16b03aa306858c2a +1751,f4c1e3abfd8262e0c3427d6f8523db1f +1752,fe9bc1a755e344c0c0d7f73d194798b8 +1753,5f732dd2a7adb1e917eb276a2ae7c577 +1754,678617776aa7a4ef09ecf2d679073aff +1755,2d8ddd4f2872ca5d19b55b8f703bb767 +1756,32241f2164e2a98545205224e53fbfe9 +1757,ba392125f255a81e3b5996a823220a2a +1758,2353cdb003e63b4fa730ae34aefa2062 +1759,0f7f5e93465e0a858f344f4ce4483b4c +1760,a431b225d1fabdfa49bd68deff04eb41 +1761,2a4e0ce6446d70bb7da18964e288d352 +1762,831d989a4b0fa4bb4ff00f8e30ad5bbe +1763,c174536890027aa0e6a4a11b116838b2 +1764,882c5769aa5da62f3d3e1585f71248b6 +1765,43bd3ad486c404b33e3449d861817422 +1766,6b43c8bdab3b00218d5880550040d252 +1767,3f719e8a35ec61656c8d6ae3e6a4183d +1768,a5ab21e5fbcf690b87dea15f1350d70f +1769,1f4fedfa83274db2e39fe85c87f0bdfe +1770,4f2e36be59368711da2cbeb1bfcbe176 +1771,1f60ac8817ae440b10b4bac6043d1d10 +1772,8a3badb78eaf68e3090812226dc209da +1773,261d552d9f0eafba349bd1f17a31c2b6 +1774,347e4bc4716a7326704a2535db23dbb5 +1775,5278323efedc94f92fc8aaffddfdd101 +1776,538b7a26f27699478f88bd65bd5d69f2 +1777,ef94181c7fccbd4e051782a1740411ae +1778,30055e4d50c8defe30efc4f44888bba6 +1779,cd3a6e378af83e31811de9e3a9e71925 +1780,7e7c897672d73a06ab61cbb6271a4f51 +1781,3361c956c7fb00f1b160eb461b13962f +1782,7750df89400cb15b8048fe0f39fa5f5f +1783,74fe8185add4471f99ad33489945b5eb +1784,e2b9c8e73470a7b320b1b44b28f537e6 +1785,fb9392eb2e0b99c7017e04237ff77227 +1786,129165f65273018b2ab2f4483db1ed32 +1787,0b58818d367431e23ade24f8f6cc9372 +1788,4c51aa45d00b61cefe0ae99dd99b963c +1789,f590caca6233649c74b40c67c0b5efa0 +1790,7f5620982f5986e00bc851a625578ba4 +1791,4cc01825d04153983db7a59ffd7f4966 +1792,d5470f07de191ddc76fac8a33f4bf3f7 +1793,d40965e608b12216bb257c27d4ad408e +1794,f29df9b50cf9abb77d45a70bae0ba4ea +1795,8036c0ffa5b4d94d41956c45c4172723 +1796,eb8eb4240e2b2d8e42622a0e195f1f23 +1797,d69042d27c31cf8d61d2cf5c1b91493a +1798,cce5f1965a3a20b076f44bb4f53fb19f +1799,1d313c37faab6c701ead525681a69595 +1800,7e489b573a95b06a4af5ecac0f468eff +1801,bb0853fbc05edc75f8029a54397a4738 +1802,4bf5c97e1f3c698b1c25b92f0bab78f9 +1803,7bc04509f44c763f28b2e1dd1a80fcd3 +1804,31ff4bb5b289e2254f4f57da65274f3e +1805,6d0e8b44bfaa1e41a53ddc14aa3bc8ec +1806,e573ec3d7de5417e3f8fefc1a4bac3d9 +1807,efdd33998e3881ddf505f5cec7e77007 +1808,44b3850d30d58dd0f91e7fc2f418091b +1809,f7083a2a14aff69efd99f363ae4d4628 +1810,e8ddc938158737a9826292f3a413d614 +1811,851fb38a851789533002da3892fd2109 +1812,885e1ca486b9ecc0a75e21a4a7c560e9 +1813,ab570d883bd21fbf0c2bc0e109335fd1 +1814,e7f893294c3d3c56c6a0d43f3d1c2404 +1815,0faf05fb51fc0369ac1371c15836bb3a +1816,98daacde3a0585191af53010c9224db9 +1817,e9ee221c2fe0754e8f00d2c16f4bc5a1 +1818,060e047091400cd5ef38971f04a98268 +1819,7ce1d386463c03c9223d791d4df55d7d +1820,03a2cf64e14b6e660d2bd4472ae9c688 +1821,c52dc765d6d896e7440d9692993df7a4 +1822,b5d2d55b74da9efdd773eb4d1fe8cede +1823,cccb9a579ca7ecc3c6ad4e08af5e638b +1824,609757c2345c9f3274bdd13ed3f8b978 +1825,9b91f71abe90ff9029d60d3d44caca88 +1826,34aabe2ffccf47597641790582ffb2be +1827,ad5536cf6bdc1b03361c47112d8396d9 +1828,8c2121d9d6e46c8f98aa790be1d824fb +1829,cb069a9b584b7c296c8b66c4fa039718 +1830,99bb01b9a04008f3cb8ffd5bac2ec395 +1831,87e2ebbb4dc9c55780642e6f2f2f0eb4 +1832,2e1a20993742a076245a6ae5c5280f3e +1833,ccd86cfb5fa2e2bef9f3c4a5933f67cb +1834,f11508c70fc74a6382187577ba047026 +1835,578f692c5ae20facfa230ec26947adb0 +1836,286b0e6bb8185431089da104e209141d +1837,0c872426f36d3bdcd17153b747d207dc +1838,149a76f3c27c0a17ed74205de5f62847 +1839,277066779e6b8ed563700e1b809d762e +1840,6810120fc79420a0081d0c6bcb84a0d6 +1841,4c6f0d2f8c9361fb3014dfbbfbd20205 +1842,2e09ee95a98ad913f376d8f94a8d7323 +1843,497f6f0e2c7f88dd05506880ac7f34ed +1844,f835d49a9ab150d0afeb9ca3a9b92233 +1845,cce2ae20d2ff9b106fa83be7839e6068 +1846,c0e2d8b132984763d9637365885936c1 +1847,4db37d5d27cb198ee0dcc87b9b76f542 +1848,9e50849ffdbd283ad07b1fc55e7016d8 +1849,3abe98958db681f1a0723ed341f01da9 +1850,70beb98ab2e96856635181feac88f1dc +1851,7474a605cb15e9293e8066a6fd76f6af +1852,8dc6f8d36e4ecdcfdf1292750d010716 +1853,8779a24e30aba6a6738460999ba0493d +1854,000f5993f1975b26b344e336bdd1d0ba +1855,433de007031a4c5c17dc3da7af665e4e +1856,c74d31068df1bd847190f733d9c5ff57 +1857,1d2795c4006b459b863af6144badc24e +1858,b8bc4cd5a9277156a610635b52123336 +1859,e96f587b6eb789f6a3fae2e30d19430d +1860,ca13856ed815a856df5a9f659eb92afe +1861,6e4585ccf4d4efff9a9faea370e5947d +1862,e6d8889ffc686756eeb1b100e27f7fe9 +1863,698c05d491d239636bfa285cb1005d1d +1864,8b42f07d7075899000dad18332112e94 +1865,59246fbb0637ccaced80b63bc08fde9b +1866,96e63892300a7af43452e31b144e79c7 +1867,1c3e8698fd28bbf8f3960cdf6d003011 +1868,7b642a06c5d6b602dbdef53fadf8e4a8 +1869,586190950724502af99f2adcd9e0b6c9 +1870,2fd05b51d68867920da9d125e5dda9fe +1871,1a36df617cbe9a8314f5011aa4fead63 +1872,f84ea92617eaea8aa6413e738ce44852 +1873,a9b776ca3c9785dd697ad2ac23a3c7f2 +1874,76b801f7691f3edd015d0e8edb27d255 +1875,d34d417893b83dd00153980fdec39088 +1876,138098f56abe551dd8d91bc93b40869c +1877,b1c191b946f95b256a865fc802c5e1ad +1878,e22c08c1219dd2988cfe44b17595b669 +1879,005b01dd26debda5680b3f32bfbefe37 +1880,8decb9ea20543db1a8b5f4ba92f2b5cd +1881,fe9d26ee2240f7a8ca2f558c091cd635 +1882,567610133ab0c64bbc6b03d7b8b357f6 +1883,e179bd338c4c78b3706f0115a13f1b81 +1884,5813cd5989a724e706ed830c73f00069 +1885,9ba8fbe0a858a1f87fafb1603a5cd78d +1886,b2ef04500cb9bd130dccc11bdb4201d1 +1887,ba9dbd1e131e97538ed37799afe2a69d +1888,18f25b9b73d63539a1cbd56dcdd2a2eb +1889,5a9ceb542c0ca4d487f29838afb66f6d +1890,1c0a018f3dab174d1c541e7cd5ffed79 +1891,71c901bbf96fbdb4c9e6cfd5ef7ae234 +1892,0f5edb878bc82db0bd6a3e579955fabd +1893,374659b017bf27f9113a0bc5e1182499 +1894,2872c57b63fb9706c2e12ecc5290f1f4 +1895,84399fecdde93a6ee741cbd437589739 +1896,fe63315688beca901c43c4ff5f3e6d58 +1897,9795bef9ebf94ca940a84c21fd868a47 +1898,eeb913d3796947794f0418c2ab7e89a2 +1899,391d44b926b8b3c648aabe934bbd7e55 +1900,af426ed228777cfdbf1cdf9dd19be4c3 +1901,e2f6be6f22eae10f14066f903494264f +1902,9c1307e8f4ddeebc127e73765347e4ff +1903,d86ca4a011f56b5b71c4217565a55a7a +1904,713a5ef96d81791118aeb501c303d29c +1905,67f3a7d396aec5c6b024aa26acba9034 +1906,4d039474d7ac743e1d61476694ced78f +1907,5c6cf81720ed108360642a700f14f3bb +1908,3bf2e711522e1a4d7c64ba52b0ab9f89 +1909,4bd0bc716f8b0bc635683472ca1cf1d5 +1910,92ac44d659e24770231ad841b1ae0655 +1911,fbb3eb037c05baa086393e1eb819c08e +1912,09fe7361969440ddb79e52409f0ecb94 +1913,4357d27d5cd0106b6d8e152dc1fa60e9 +1914,0a8e0bb9d62aeb3fc68911439c800d21 +1915,f0d32e14b06c2afeef9e1ed2ee919dfd +1916,6a22693506017a6da4c5c1ba0be3fe0c +1917,b79d86793a478a464cf1c103e0adb841 +1918,41de1db21d1550bed6d2574f5e7273bb +1919,59f8aad51f6e6c5bfc326d18cbc18c47 +1920,d4ef0587461d472b85d01dbce4ec9f3c +1921,501a0ee6a8b418f4c452e186985b2957 +1922,b8d00fa344b390c9cd778e5397e3851f +1923,c75a79bc13ef18878b52e665e644bf82 +1924,7c3d0b68a0905cf37bccb3fa72537b5b +1925,a568ddb681ca419f2d4359d8549d690d +1926,ad6a77479ddeb2b2bf0b0c584e9ea28f +1927,eb0796c720be3cdf09f6f6f6b8a50727 +1928,c5d785219a915da9aef7c4f00ac118e5 +1929,5b78297fa8cd5037fc2795ecf20b10e9 +1930,e078928f97ac9dd91c390da5ff546489 +1931,7341319a364263a65d8a4de417b5c632 +1932,ca244cf358f1b947d00b3fd7c1df6c41 +1933,b0f37292744e6b9c012f7b51c6e8aa3f +1934,050b87be8dc0eb2f7cb22eceff6a633c +1935,0537c0a03448b681af622e4a8c93e33b +1936,874619f251eec76cf6e3daa1e8bc22fa +1937,4b23586174ffe0b33d2eeb25b2913df1 +1938,70bdd944af3675919c61dbe4a1ee779b +1939,750d49fc715d0a15591960f8713c6bcb +1940,2b26cfc7b47beda2e8050777aa5f502f +1941,4ddeb6ad8ebbfd244293c9acce389df2 +1942,d543c1b9d531a6819c9ee1f982460253 +1943,e11f64eebdfcfc91ae39a07a84ba82f7 +1944,6552ca474824b6ee0c7448898c0b28d6 +1945,b9eeb85cd59926a381d40c7828ed4c42 +1946,a8e72dd6d94ee3613d47c02eccf173f1 +1947,546b61a8456f79ef148ca8467711af8d +1948,53e56883fb64a91f2e797d4765ea175e +1949,07d7d48a3a164944f6b289652837f592 +1950,95364dd09aa58afa8364e18be58f7281 +1951,30a5561ae3c47cf270b477a74d7272f3 +1952,50c6658a91df85b729b489c7ee729e24 +1953,e11385cd1534c0296e724978ab7d1179 +1954,f31fd5ff34fbd9b979691b1bf5136360 +1955,8b2aa5f623ee58ec0c55706e736d6e8e +1956,4fe05d63b01d60b755316073f19711c6 +1957,f117bea46475b2c758fe33dd9419f361 +1958,7655fa7d9dadf7d853c5a7081b547b89 +1959,fc9701ee46d953450206b3da435588d0 +1960,bd4e077d86fc38b32bed1dec4e6e4d10 +1961,d7424e5ec86c9532bad2623f64e518db +1962,69d5db6bf9a5db408faeae526a25bb31 +1963,4fb5c3b7590c676d4225ed584622a0b3 +1964,b9c0e545a805fa4f6ba7dfe296127bde +1965,42703bc915b87dcadd4f9d9a84db0a2b +1966,8699f9320bfbc3d11635de322ef14f44 +1967,bc63118bdc0efb2fd099ba2c3840df71 +1968,6c780d609057736ed0aed30572bc434f +1969,6410857a8d34695f64396dac1ae6cc5b +1970,8bc51d59852d127a77898b3ea5d047bf +1971,cd76dd8b0021ab58ea4536de5683d7fb +1972,0a129fe65313dd96b80f95173c9f2689 +1973,508df99984eec22403cc37bbba2d7aa9 +1974,d081a35062b1ee9b90b83c7de997b81a +1975,fbd6be94a799812e5923b4cd1f26bb98 +1976,7e9bc282d1f23598486666404a49acd3 +1977,364191a60d66bb547d354d1a2f8c86ea +1978,b8538b47a356f8345c821f9f7f9d4f8e +1979,c8c478c6f646b2f2fb65a777e1f6ad73 +1980,c25dd3ffd58451cc2a1bcb144859bf48 +1981,3c8d5b85f55499cf671ee69016b018d8 +1982,243bd9313f819fc0c18f7e1bec7089a5 +1983,aa2b3390cb3b58d34dbebf18a4f40f82 +1984,305e1ab7cf016d012dedc0382e76d46e +1985,3ce5d5c49b19855950cc60f13a83336a +1986,d069aec10cf746cc80cd620ef7a1cb46 +1987,aeb2c0dc67003b6f105ebd021b515bc5 +1988,cd6f522d0bd18eb9fafc83fbf4505983 +1989,8dfe6a124618a47d433ddbfe12e21d38 +1990,9a7ed51775edd73444ccd15f70e55752 +1991,486a72f18d6285da232367ed37b7857d +1992,a4cb1e467425e751bed9579e40a980f1 +1993,3d0dea8ba693ff08cea7080cdbd9ef22 +1994,b6bc73ecfea7e0a35e451cff9b3fe03c +1995,bae49f13a62ae64b5fc6733fa2b9aeda +1996,016ceccda869f300fd4a397292a680dc +1997,0aa5ca860e4e6072d4da96c37652d029 +1998,03de753020afb572c4ec45a5fb6ce670 +1999,2df99be57436a7619d0102cf5199d89d +2000,6f1d6f52ccefd9fa08920ae76c0d388e +2001,3699230a47b712a185d7d685b185c4ae +2002,330b57167e52869967eab4f523ea2253 +2003,ee2d86900412cc55cc869ec7dc35eba9 +2004,ce801b041bdf3aaa66222fecb37cadf8 +2005,d9c322a381c9378724a199b538945004 +2006,804f5346969f3f98188f20c98b98a8d8 +2007,8705494a077e847c947e310ab1dfe809 +2008,68f5afcbb92a96cd9a64ccf8ef7e8cab +2009,de39cc6dfd226f7ed41137c196837339 +2010,95f4664bf51cc8595855869ca17491ae +2011,0455a35ad6968030442b86e5f5cf2334 +2012,3bbdc69bb1bfcb17b9c630aa34bf34df +2013,13241e622c66f2e3fd42af1e5f781886 +2014,a86b3ce1fb8753e134b86752545d42a2 +2015,f51d16a5ce2cbea86e34b39bcca9c3e1 +2016,61a82a64a745d900874f998a75768041 +2017,fe588df9f6412d71c99da02357650a7d +2018,e8172a01cf18455ea9b6ba3a969e354c +2019,7f8cacfbe8f8549b0d74f29dfa369d4b +2020,54684383cc13fd4371b7e5d983d1f854 +2021,bdaacbda60531f982d41fb21747cb4c2 +2022,7d30bae211e7f581b641521c605e3d99 +2023,bad87294f06be29692d00cfcd669e67d +2024,6ab3cc1cf08f4b728c45e438e2b783ec +2025,70645e621b4bf868fead78d3c59d1644 +2026,0de3f972e9f344eab985267309252cad +2027,cdfcb930a452be8ed0734cf67310922f +2028,376260bb56d0b19e91756214883e1db5 +2029,8c785115a56eba4e248fe35f800a0862 +2030,bb9ad6b0f6f2b173a2089498c6765759 +2031,c239cf0dfd15add07ec512712f703702 +2032,1f45eea60cc443319d5b9a562be196a7 +2033,3a5a829cd23d4597b7074a9530e3fb5e +2034,8cd53cd7668730a205286259aa2b9a64 +2035,fc957e94f39ef2c10d3bff0233feaf21 +2036,15ee04ef880625a1eaf1ef7a27078295 +2037,794fc3252087e7039ad679c16018af49 +2038,f54f2fd5e1d57d7f4f789ccfb5122db2 +2039,8c9c9204d3d67ddd4956a9d7bf2c505a +2040,fa85b123c2f95863af906af3a6657f8a +2041,2a8b384e7c98be304e43b173a5fa335f +2042,1915dbd3fef051f5d7c4b97c8a475f91 +2043,1d8174fce2d00557396350b5269477de +2044,3139eaf748a0a667814e59526bfe8dbd +2045,bd1ae7929521263e68536cb8beae1638 +2046,ecde28509e52ac1b3d2d929119c44f75 +2047,f5b03104235907133706db0e9d5744ea +2048,be7806ac6db14766b03f1fd34adcd3d0 +2049,da70a3c6cdd4ec59d62db9d0814d0a94 +2050,b6c234dd9986f8b08925ceff77ea4c24 +2051,7707818056e1c37a086e531d699bf846 +2052,98a24711f64650408fee2190ba6e3e81 +2053,7ccfed7a3d7aa5e2f79912721d285e7f +2054,db9f95e9e669667d5d05f196afe78096 +2055,c79100bb423f839ef2c916027df9b4fe +2056,dee37c96a3a39262e546e0ee62bca97d +2057,06e6f4c4125e28131964592bdd4ef0f8 +2058,729889300609eba1276a8de914355999 +2059,165ecdee7513944879da56c217023b6c +2060,358579ac8ad9570ea7bf025c6f1b49dc +2061,a6a5a0f014ec89cd9675c9b04b06e164 +2062,053cf7c40af568bb3a240f0f57b36aee +2063,388e0466658019e5903c7fac43418793 +2064,cddca2f5ad96a6326193d48c94e96522 +2065,5dabc693224740db4b63d06bb551dc6b +2066,0dadf32c26c74ab2769c045a9bf4fb27 +2067,300bb5d3602bbb9415e843f76f63e24e +2068,bad57bc3a949060958a4e0ebb1cdbaf8 +2069,79bab4286f0768b65db99f9dbedd2dd7 +2070,072d6b7de89f448791533932e5bce03c +2071,367a4f9e0c40af8670b64417a4226087 +2072,83572139f8e333b97f08a23248fe4c91 +2073,7ac1de2f60cd5b37023cf28abb0815be +2074,142981722f57dd21392c7809001cee6b +2075,0af45d644703bee9e998e780b2d26e62 +2076,4d0845d4ee628bd920ead26d617b34db +2077,330c31ed83a1f985c3398764782e826b +2078,3e0f94519ab1cb2dc650b642a1a8086b +2079,c9b8d21ef4744cb62cb78300ee6dd58a +2080,47deb37d6559ee46b5d89ec6f342f9e0 +2081,b8ea37726167316c77ae148e43714250 +2082,4d12d467f06203263c8b28ee1ea5569b +2083,a04dba1c87946706dadb3c662f01596c +2084,7abb982672d8b5db7dda443610a27c80 +2085,48610cf35f92825470c0f8a78c689d91 +2086,1cac550f1ea57501fb1c72246a3e2129 +2087,5735145ed411201fbdf8ea6217e494e8 +2088,fa9c1b9f2caefd38deac45c0ed7baa99 +2089,18f01da87d6118fd9f629c60a0adbec3 +2090,5394d2fe064e726732b439932b18a7da +2091,0ff946a36cc956068fb5972cc1aced2b +2092,61694bfe75b498bc6b8037f22414c9a0 +2093,38784aeaea36640491069bc025b47b77 +2094,1a578b594a34a42097afffa103c50de6 +2095,ab840f30183635f23edcc1079f448910 +2096,415c969a856d56c387b958ced25b9871 +2097,7328c1ede50f1397fc8267d5018a92c9 +2098,b81bcfb175d3820d7a09901c97be77f6 +2099,58fda4bbff02c4ea6bc7434164b4234b +2100,6a59b7118895597b4a83167e5bf5c4c6 +2101,ecebdd9dcdb1fa14de8167a9cdce97ed +2102,b0f759567c2a2b117876521d92eed821 +2103,7b885ffeb0332d6daf41bdfae22e6948 +2104,ffeb5aeefa58cade7239de110b6c8726 +2105,034a0ce1ae0bc635b24c484536744558 +2106,a9fa004ea45723a1ca88446a7980f094 +2107,1d6bdaed769e803c3f97b6e488e6635f +2108,06c7af0542b089c521065fef60829af6 +2109,91e59570b2b3b7a3d50f01009409cabf +2110,278e8712ebe02acd6d09b474d6cef8a8 +2111,edf2df57d209b02065a51822dd82744d +2112,b77920ebaf258b175d5cd5f37743f034 +2113,4620fe9024b67053cef09108b400d21d +2114,5688aff2fe7ce8c891512f34f8239ada +2115,cb5abd7da8260700efaf27d123e8a81b +2116,8f142cdc6b565bda6cc870371623e495 +2117,3bb6884232152aece75f3220f66abfd9 +2118,d1b9c055bc6fcf5a9b5ffb13e880ce55 +2119,0be30d2df6f0d90ffcfeb1c3f3e3eee6 +2120,d343cf11e5fa1b6bba452a7d7a58559f +2121,40531a2364d97a3a2ea9af9566c50595 +2122,ebb946e4cdf9e13d16f3f2912cba9492 +2123,c5587b36f821e595bbdc89807d75dd99 +2124,75618c77e861f9505902e9305af4f05b +2125,8d6db921e047f20e4c0baba52d33d73a +2126,52a6da0f15166763c96e7b2101e0a5b3 +2127,12f4411b24db69a179f8a9be31f81c32 +2128,a00c401a9f1c5d48b6e3b8fc82f6d510 +2129,d5a7b21d0773c693ccf917db55b7010d +2130,d07b8179a0625073b969da0940410128 +2131,e35a990261b98716b6583fbdb52fa9e2 +2132,bae24cd5bdae3935e5da8112c7627a1d +2133,cc959c4fb98b72305720053c5d6eac24 +2134,c5e70bde18d04845e2b883144432b3b7 +2135,4193648168a6f6d20d8ba2f2b6780f14 +2136,f789b8a82880310de0abb74e8bcdda26 +2137,8a315e3bff61d63bdbf39cdf83c25881 +2138,f0e4ff58fe6651619aaa2d06a792d5a5 +2139,07aa4f6c39f04f98c2e6326d4ba977cc +2140,786b94f7308786d1ef1de8d4da602c95 +2141,5850fab5661b393d269e468fbaf75029 +2142,d5a70294b0833a5cab33a8a851ca41cd +2143,0af2061160f0211bd93a924c88678b20 +2144,c9ba75cf228e7aea71d21841c6726879 +2145,e5dc0e89ca1d41b4f5022e933396d366 +2146,f1b3b823822d6244d1e747d3f937e774 +2147,bfa0e2c9c45fdb88bfd54533c40a9ec0 +2148,9bcedd5c46c001d9f772ed13ee619674 +2149,6323f87e3d21a52dd8102dd268efdd6c +2150,293551288fae2a4ebe587665c7caec0b +2151,81167c9fada7dce431aa9eaf01917f9a +2152,6c0ff1f566b45b9cbf1413e172c9032b +2153,4ecc32e9b9d14779e12c29cda40098a9 +2154,107fabe9aa740b9c6454c49f31f1a084 +2155,2d66ff4086c31a089367eac4605a5404 +2156,5bd6e0e93cbdd00e5aca5ca0a727bc14 +2157,044b744c698db781338c20143d4cfa01 +2158,2a1a072d312add3fc6d9a14094a96ce7 +2159,2dc217628cb5ecadbaac995a8f4751a3 +2160,00b08d0b8a73e800c7b60e58bf5b7f04 +2161,ae261212e7127ab84cf709c85f1e4735 +2162,3c48fc7a5556eb6637eab6726fd50074 +2163,4c67986f7d29fff68e4fb1274c64560e +2164,8c075ad990a52eb6613910d71bce053f +2165,6cf218e5dea217d8cea8bb5c95324c38 +2166,cd846ca8435174fba3183db08d27558c +2167,cabe5ef1ad7ae7bfee94d978cf5a4697 +2168,a0dd1225eb74dd4babe8afb069db2330 +2169,446f17dc969e58771836132cd871e925 +2170,daf85e063e472d211328487a2e175a1e +2171,2a476871cd66ffe8989b799e2901fbd0 +2172,bea3b561c09d92f4716e7c30a2b869d3 +2173,65f9fa9a45570598164104a7ea6b5c7b +2174,cdd8c00af366787ebf4e529feccf0914 +2175,935dbd392d07e931500a4a4dc638f145 +2176,f26e19f3998724e4cb8499e8065f269d +2177,6d931ac3e7f6bb066a4e85cedfad8d17 +2178,bd9cbecdac60e7ac872d2831ea35904f +2179,4c411c9f4881dc56032ab85ffa936014 +2180,a7041588536f75ba51c41c4ea2f25337 +2181,76e1249d328c6e3b434b1f12f8ede286 +2182,4341a0a72b20341ee4ffafae76e415a9 +2183,187376a323804471e5b40642d14c20fa +2184,3a736882a60e6f217bf7d0094405555f +2185,55d50df425e5dbd42e3a26c1a998910b +2186,346414656e68354e3aa22267e6730277 +2187,b44c0fd7bc4d2788f0e79f2a88d311d9 +2188,570c0b1b80667492f66f1da70458bf1d +2189,2e628b36cd940ce1e424bdbc5ee8f410 +2190,201fac0a4972d2c14e7caf7bdc00e8a7 +2191,a931c8cbec064f8dfb625f7047c0ae4b +2192,9efbd150189e5054719d6940dc993710 +2193,75a8cb00f79dea1bac06bea142e45ff1 +2194,ec7906fd6dfd9ba4ce0b97ad11ec0ccf +2195,eed8db2cd6a061ada8152a881c04244e +2196,29161e822896e99cc39b7275d9faa25c +2197,6a607c9079b8d3023990b48c4dc6e431 +2198,3f78bdaf0a9698e7615894e99a6472de +2199,dece80985056bb09a84d06fe2b3a6616 +2200,521d15dd79f9386e8e6ad8b2a06cd43d +2201,63ee45dd928d26c7642b42b1f9cbc0aa +2202,45c4bbd7405137f2945b23bb391a0fe7 +2203,284059888c10fe0c27118e257bc98197 +2204,254d62115956ee2969fe8319b7aa0cb2 +2205,c703fe3e25efb884611b699a2aa72214 +2206,e5ed94fd660b2d46e7f734582b10a5bf +2207,a9ddfa0f8adfbe762275dda228db413a +2208,91d899b16602c6e0be907db112b987ba +2209,e94879007ba7b9e1afac234e41bb4fbd +2210,a15244afbf8a2cc9ad1b6d25170705ea +2211,9f9dc01edb40becc95642183d253d2ef +2212,18dda66d2dbc9f69b35b66f86928303e +2213,8ce5a94a5dbeda36d4eca07461a15ac2 +2214,c649e3ced95b03f024142f9b084e49c2 +2215,7fcec66fd66b6986f75b6ff4480e9c60 +2216,c121375a504984e5044f8c7ab058ac53 +2217,2f214675bae0a50c93965a7ab5047555 +2218,f82949504b75cbf59189c13741369941 +2219,a25959d5230e3561617c485121ec6a32 +2220,0a08fb33ca79481378a72c6e3a061ed7 +2221,0832ba5a89c9430d2c1b488eab78fe88 +2222,07df896bd1b8acc156ac83f21bef18f5 +2223,bc5e798cd673faf4cc830a0328e8b254 +2224,ad50dcfc47830cca2af48c58c410c01a +2225,d4ef3f6ee0e3026b81d63e8f2bbb33f2 +2226,3a3fe55d647607fe18dd18b00db0a66c +2227,2c0706ad7a6b114d429f4eb360706e5b +2228,0bf70a161e7ab5d927b354134953e80c +2229,f6427b1b57051c4f418440a3d85a0331 +2230,2e9b701eacec28b51b2868752e47bfe6 +2231,063488051120226700cdbc5cac96b75e +2232,a8a5cf6ef91a3cf61a8813f12f950beb +2233,594e507894dac7eed7668430a956d9c5 +2234,2b785d33aa154c30bf2591c75441e409 +2235,95e7a8689b22117ee70d790c52fe0723 +2236,07875767dff6ae57251bd20421ce8441 +2237,fce6b141271de536adf7ac4329835c7f +2238,23353517927d246223ca420d2ec5693f +2239,8e82259e261f15c7ef8fba68a1cba342 +2240,e00e472ea2bdb529178f043c6e8fb9bf +2241,9facf3759fe592f5c0d63d0c20915e35 +2242,ad0a40d381e122df57191f43dc1270f2 +2243,0727521526d6f2a3bfe6096713ea0c4e +2244,ffab4ba5efcafb7b39cb249f1c2afddd +2245,373a52c8b41aac2dcf1a1805483b6340 +2246,fed52ba3d89f0d00464f509f49e60072 +2247,2b9a40e9b3f583278140e74be6a18d26 +2248,56a4a5ac3392beda27621868e4c4b571 +2249,a4005b0a33b4c93a01df7b568948f062 +2250,6f509f1f6c5071d7a0c4ee88f6319ff4 +2251,947879a98a24f5f7c86f3d9e269b6512 +2252,7a31136512c7c2caa705cf1722e70b4e +2253,bfcc4c7c51f9b6e8cd8138970d45d617 +2254,a92ad8f5fde82aa662baeb706a8262fa +2255,9219952052c699bfeeeecb44676420a6 +2256,14f34306a2e18311922bf177137d902d +2257,33108ffed46d64135a7ea310ce0705cf +2258,69f5f96f69205a73114addbb43159689 +2259,a924cb709a5ac4684aaffad05a856257 +2260,ef900f3b40a01e2845b9c1e9659f1d86 +2261,277e6dda10290641c5640c444b01938d +2262,deb2f720faae03f529149f34b6322721 +2263,dcca4f76141116a84c031551a000b159 +2264,e9fe626428105273f6ac790c1ed639fb +2265,39b3782a8f5bad3d6582e60d377fec87 +2266,996891757882833922e110b030f65698 +2267,10a9d58ed1a6026b49611594b07d27b9 +2268,62ad15a43f98c0033fc99a8c28a34b19 +2269,22340dcfac30c6904aad3b7e5f2a8597 +2270,19f4fc450502fd9e219f31b06738adc6 +2271,fef689eca5fe5672ebfaebe2e0ddac05 +2272,cec555cb0f2fecb77128d279d359e6e9 +2273,7423d93c763262ee8e3e352dc237dbc2 +2274,4823103aa677cb9b869c877bed309e1b +2275,2f89e3cd9ffb75ba6ea63f8f1baebf86 +2276,62ea877aad2ae656e993e6aa231db868 +2277,ae42c85d0342505201182c154337efa5 +2278,d1dbad7b2c21fd52c8b9a7574be7a11b +2279,3894ade050ea4b405198b84dc810194d +2280,00bfc4a5fa26ec5cfb8f18a6ca326c46 +2281,272f9cfacfb1803ade4285b1e28d940f +2282,182e1c1af031dd9cec2a005d9d59cc61 +2283,2b562e3a0391e5a04211b353c53d83a6 +2284,e93134c82f647d8bf72966597c5729b4 +2285,d758fad1d9edf951ae5c7d4cd5f3b446 +2286,5ec920c033874cbab5a0279debe88aa3 +2287,8a5b06fd1c1916398e9e581e47638b0c +2288,00dd28f73cca9e2fdc8c3e71adef2fb7 +2289,fb40a3075846a7395fab3143a429157b +2290,9921e37b5c58b59662112081e5aa2319 +2291,b2693204204596bc4ad440d46d83eb4c +2292,ae257df41863a68f7604bc41c438c0d8 +2293,8527a61f67c80787899d183b8bb5b585 +2294,c04cf14e97babf62bf833e34aa653be2 +2295,6a1054cb55ed417bf80c0f4a3f5a83ff +2296,78222225f2e47540467e042b566673f4 +2297,a40cbb326f82c53bed3285953bf8a7a8 +2298,33401c6c2cbff56b63f51a1cb92e9990 +2299,8492d4357676e82a86df230be08d20bf +2300,964b4fd95b04eccaab8adaf1a41cd36f +2301,33878b733ce29b0c3afee56f306e1f22 +2302,2ac98f1eddf900379e6513a9f9b11a7f +2303,a37c98d44dc9aef296d93e2d61413015 +2304,fdbd6e7233b1c55380ec7f9d20acda32 +2305,92ad0497ac28669b0b651e5584ec1eb4 +2306,8a66d3969f79e89a7459cbb40af28681 +2307,c5082c9a1a2474d3ccc0295a25c804eb +2308,d7e175062cad1585ee893cbd7a47a539 +2309,336fab813a0893f5eeb4a7d1287636bf +2310,699dfa3f471559981965d5a9ebca0cc4 +2311,a7f53046546433948b04cf568be4ffac +2312,2f56c896ee402f1ccc44f33231ba377c +2313,99d51280b6302f576acc3c932cde3c6f +2314,aba3d3640a109681ba401b7b026b06a5 +2315,f0b46a4329f816101cc282fc0f4486b2 +2316,f17a4121f7896fba44162ab13df7fe97 +2317,0255b2de261e62483de7aa788164e9b2 +2318,76c06d4cc6eb1d48f2ed19c498dd0a66 +2319,9e59bf6453764eeddf4c850a6ca23407 +2320,f1a4da681807cce77d95af70a00bf2a8 +2321,6686fb48b42a38c0ce3fe4072c73c2b2 +2322,93ff99787c44920f5c2f35ac7ba9e416 +2323,8e51ce0103fb0abbff09aa85510099ca +2324,3cfeb8b247f4bfd788342933f8af62f2 +2325,70c321a075ef3f3ad0b06e85d200a29e +2326,4d984bfc050641314c52b820cb225f9d +2327,0c13c4d7f33894ea7022caee09c3ec15 +2328,b8261c5241bb3ffc969a353a756f8a1e +2329,14a614c31d100dbab57b9dd14093a29a +2330,f8074bd0bc60af8eb9ed9bc49e56303b +2331,f873f437ef0e46847e51e4e79cbdb9cf +2332,011cde94bec647c167b3010fe93d63b6 +2333,642b43779d771f295276487613643ffb +2334,0e3143130f840a48d609f779e04108bf +2335,a96cc99934d420de68735168b051bd5b +2336,1f7a1ecb7939fbcd0e272abb8eb03f5c +2337,43f45b45a83f0b52c4095cef362fa601 +2338,fb7b7eded22ca6c478541d0739cc1f9c +2339,978eb4a24fe02f3d21819c7e02cf65a1 +2340,2705cf4c42bce2807912a8e02575abb1 +2341,f37d33314629ab7145e69a721ea79410 +2342,e336cbca7e2ff289717ed2e9711e2bc2 +2343,fbf958896a67e929f1620322f1ca03fd +2344,d1a9058d10c6a153fad231eb93576461 +2345,5fd492aa0d10af00da6497bfcb709abe +2346,e3b2f70057be4abf929e4b59bb6ecdb2 +2347,379f961fd8646681df6c35c720388f1a +2348,3e310539cfcf697dfb068db36561c0b6 +2349,e0c5760eec5d6853205d17be8f5f821a +2350,2dd33252085573301eaf7dfa12417f0e +2351,3db482febd156a851a32f94d45f99277 +2352,4cfd9cf79f263fa9986af74f3c02b8af +2353,0b62cc367fb7808e3b5ae97902eafe4a +2354,51aed07bce1615cac8db2512bafe38e3 +2355,9593a312dd0130c851f51a95bfa7e08b +2356,6f423fbfd822e2f4e9d7ead4a386fdab +2357,80fb5797bf5f000c8ede1af691c57d26 +2358,ad1da6a76aea50154bbefc42849f0a53 +2359,48426a0c2f353838d6e462a1e4aa5483 +2360,ac2e72476b1b6df26652ad5e6ab1db87 +2361,b81c8b7964bd0951a8c7f2c812ff60db +2362,283e01f8bf0acf56cf33f07e718ca881 +2363,71ca4ebc2cad18579d81bfff7a46f7ad +2364,cac50e21f77a606365577576d70f408c +2365,a0e208590ae8eadef957cacfbaad10f9 +2366,9a667ab4107859aa1053657f8d7d22c4 +2367,3a042c74fbc4fc8a8de6c264ab4d450c +2368,e370517f3880d43f8f521ef6602640a7 +2369,b68495f98e7a9cee2d9d38b6c577a3f8 +2370,c04840078c306f8354fbac504bf494c0 +2371,c8f0fbb96d78645ea885e9be92d8aa59 +2372,04079b6f26128585deafa41cf35a4187 +2373,4883ad23aba42ff461336d566c4affdb +2374,124b8a15f375c9767878c09f13136c63 +2375,7466ccba969be59ea81fd10646381c9c +2376,17faad5cddb512339a7f7bff6ae64b06 +2377,42151aff8594130a889dac764f31c532 +2378,8c2fce9b0ce1ab900b7fdda0628f3b75 +2379,34e449a070ad370c84f589ad72a1297c +2380,c1e3aee2eeb02f411f7c5a2fb37ad9a5 +2381,71bfdc0b0c080e5f999db7567f48cdd7 +2382,2cf9e8bc8d1e79524d98623ca3f68a71 +2383,d29f14478f3d710d9918856c161d792f +2384,308e1145ad2c57ed4957abffa10a3834 +2385,fd1d2b4b21d3d4fafc84c82c89c6f54d +2386,558496e5aa460a8fe377141378d129d7 +2387,398c250d53d25b5f434a43f1e235d7ff +2388,ac4164e37824acd6b09e485104e79263 +2389,f12df15f5d4bb592450da690aae07b0e +2390,86414adce70dd03c4f849d2df952282a +2391,e22ec61868c13c66e4e2e31a9c6437fb +2392,c25782eacece5d6c7730c43dd7ea47b8 +2393,91646679f7ed20767a2ae2e47abf998c +2394,33b708fc90ac2625fc6156f3f6011e91 +2395,b63596dac0b77d010ffad6b6f8c5a84f +2396,3df22d899b717b754b66487617a5ef36 +2397,b11faad4086070cf02a19313352992ca +2398,bbe3a00172a14236b7e45a47e796301d +2399,318bf0c947cdcbbdb3e25dbd51adaf0d +2400,bc841c4a8e2a84a12b0f2597a3a6f723 +2401,922ea21469899913a94e47053a3e23d5 +2402,edc6a24b8bc1abdaecbac1bf58bb6db5 +2403,d3817ce84ad5afd35ac34f8a7873ec79 +2404,c0c6d1fc1176d908d95d417285a934b0 +2405,0b4d2a654a1833f8e719dea19773c1ab +2406,b9bb075077498866f22a36832c8687e8 +2407,1bcf39b30396826ae3c9f24b1d34a18f +2408,48793cee881be6801ff418000bdeeb4b +2409,4cea700450539c58e8502aeecb05ab92 +2410,9563d0edd3f1346f99f3868e7d4bf339 +2411,ff86d5cc8bb6e458b9503fd0d6433465 +2412,ece37c22dee07dc38bf28fb20b5743be +2413,cd3e51760caab06e293ea42a02970b55 +2414,8b1ef1db5a4147eb87ebc0f49fea2f97 +2415,9fc8e90a917de915a5d3c02e548144d2 +2416,5f98507cae1d41b8ad60b5128f9b8cc0 +2417,bb7315f0856477fc430f52a356fa80ba +2418,33a5c7f04e59c9db1b65e009db01f097 +2419,ff1141711e99626ff34f0dcf6f3a5571 +2420,e61ddfea3201b6a273fa27f21d274d4c +2421,6facad2340c2fe83d42dcb0cbd93e354 +2422,1aa3252b9f7385980cf20cb07e47cb57 +2423,cf01c5b14796829abe4f9e815ad50076 +2424,830c8993b8b117d81a8bc927009faca9 +2425,0b73c8d44661030aedaf50fcf4c893ea +2426,348a6c8544e0bf73a3fd14fe5a0e4b19 +2427,a46067db4b240819005839da79caf0a5 +2428,15b4ddd2429531a991c571442ca6bdca +2429,59f184f6fb4349eb475582f1664417db +2430,69dba31ef3891791211224cc68fc53f1 +2431,e6e18017f4594901fdde438a2e7ccce4 +2432,08828887e6c20c5996efa684a5ec0289 +2433,7ab5c647ed62036b633e16e8589c8e79 +2434,747e4034d7a292f662cf89081d4fb548 +2435,be301d01e1647550c4e2e5ffe6a0cdea +2436,f8daeab2f9fa77795306bdc0fd269d12 +2437,b7311a4afbbc7721cd4d0699f7b43d22 +2438,61376cd3fb36ab681454cd2528d4bb4a +2439,c41e83ac6f5204ab76c507be7f588b43 +2440,0d0972b0c19117e81ab81656750eed60 +2441,d587ba5e2734a549b26ec36ca96a6510 +2442,f9caa22ce2347b6ad0625d4061e6598b +2443,f3abf0227c8292c22d1e961ec65b7abc +2444,1cdcb65fd69800b3a1c2af78d1538d86 +2445,0face6720c8e4c9f2ae27b69a03cb3f2 +2446,f4bacf7c48918dffe7a812d623c5ba3e +2447,30ae6986b4463806a69492c74114f254 +2448,900024d9125e6464de8eb3f31cec3202 +2449,acc79183ac6093c336f6fb71f74f182f +2450,e7cf84b95d979e26c64963b7c733b15e +2451,1588ad2ebf8a8deaa1b20177975d57f2 +2452,bd030714d12534c6aa777511824636cb +2453,34b829e66c417317f49df16648613204 +2454,1e69fa38f5658b3004ad3af6bd21dd5f +2455,7da325a319390d252e3032ecd14aff75 +2456,bf51a73ebdb6fde55acf8e6371a0278d +2457,5ef0e53a72b74637fdb472c11b28c309 +2458,d365bf8f6e2e56f30475cb6f42d6dfe5 +2459,611390baf5e433b2eb6f24ff6d623dd6 +2460,d740b14b38b90bbec59aebd2a2a742d8 +2461,d469421e9f50c9f43947b27eafcf0a37 +2462,83d1682b2e681ce8aa3a2e701db013a7 +2463,6a55a205f4a0c18f25687593cf2baa3e +2464,8c0f5a67c7f03dca67354c75cc9a6b86 +2465,e04215a059c94d210a7f3465fa83643c +2466,4ca5cdd9715a0421a8facabedd1f809b +2467,72f2cb8911672b7a322b72600fbb18ca +2468,b2931f79b47448493a0cdfd762314bc4 +2469,0e6c83b4f95d1d441cbf34c2279f201b +2470,f7e13c03eeff9ddc2312e82962c83160 +2471,e7cd6c6ca4b550238cdc0b7d52bfee69 +2472,4e88f1e9cc9f79c5454d0d7908365c51 +2473,62f4dd770f2db6985ffef1cfc4b7ae5b +2474,85644fcaf33b788d96791a641905104f +2475,80aa53ff731aec29de26b175768ac641 +2476,d7a8183bd89dc421a2de7f5d1be7f10f +2477,8c070777c24457ada102a9c1603409fc +2478,1f3078a366c8e0f35a8c038b46c8fb9e +2479,63774f9a13794426a91a3d37585ae58e +2480,96f67aa49f89601d7630ffefe43a2794 +2481,edad8edd9b9c59e6d64a0cfbb054c9a1 +2482,3bca79ca5c2cf2e795574abeae355bce +2483,ee5e1e56d70e6929f4406e9e411935f1 +2484,f4abc9316760dc304093074d393bbdf1 +2485,5cef7b06b0418d83c7969952f2a31788 +2486,91ee17a133c1371a694dd2eb7f67811e +2487,7d69be2f41a5a6dda79d6dd65b3b5861 +2488,78c7c5a8beee7f52b5bbb94de715deb7 +2489,3994886657c598372c7820cd8e150214 +2490,103ec23cd96d53508e4cd8ad070b2cb9 +2491,4c74a801c4c3f971f5b227e94558fdbd +2492,b99fea6430e813dd627cf0b7f7c10083 +2493,d31b80fa94a8c811b5984dab6d662d4f +2494,d43e14eed1b7eb82a2c1eb6c5fbc6ce6 +2495,5b841aa3b14d1937f872638317f87323 +2496,eded0b6ffdcc1d5a8e080bab9def2597 +2497,f0b217b4343469a911fc89dc7b698e8d +2498,f65d549b6f3b56e4682661b920dab34d +2499,9995d0dbfc00b7a7caaaac39585c3a78 +2500,6aad46bdf5fc10b40504c004faa099da +2501,b82649bd42c4163662651abdb0eecfa2 +2502,cee6a4b8f1eb1eaa47cba5a8c66cf2a0 +2503,89c436626f055972d4642b26f733b065 +2504,c4476bf228d83d2df0ed6a5961aa86fb +2505,179bb55a5e8a6b84091cb945e3bb570a +2506,63a0f66b61ddb18a05e5d873f7f7e8b9 +2507,05209152e36b82140ac08ef70770f602 +2508,e5f134e3e457486d5fc8d0b0513ad3ad +2509,1a655a3e816c01bc692f3f14c4f31ea9 +2510,843bce1c59e2eceb3d48f8b3d0ed5ad3 +2511,2f4cae7ffefe68e304053e8348762dac +2512,b06686d1135a95a92a4cc0ff60eadb3e +2513,d915ffb3ecfe8763fa33908f6560cdb0 +2514,a4712b1109beb4a1a68a01ad00c7d254 +2515,98d855d6d60985e0a125198d1ab22ea8 +2516,35694d6580a9044db602f79001c3b2f5 +2517,37f5f7be10d1bcc182af624b0cee6e69 +2518,ce12c6d18817a1e2b07a075545f72dce +2519,7ee1fa3228f7b5621313f79947caa391 +2520,3647cdfd12b32ec7dab45ca7c06ff362 +2521,fa229c8ae76f287286c8d07424711013 +2522,4f6574c99797453a9ba1351c7dc25fab +2523,8f9298978485a42e8b879d56c2041a4e +2524,d42d8e5e5167bf1dc6821ee6385b0346 +2525,aa84bb17adbb3909abe64006e5707e89 +2526,8a2efa3439a943b0a06220e5ba9da532 +2527,289493df86113a5f23cea0ce87b71ec0 +2528,9a033cf3cf1f1311a027b6cdace68f0b +2529,18c97fbb08f6593dbb98d67c5a456491 +2530,6470e6bfce7df86568502748cb96d770 +2531,9080856fefcf2b8e13105f31fc4baac5 +2532,c8c47f0a6de07a8810c13951b21d75f1 +2533,359ed3535b9555c6bbaec8f43954c167 +2534,6e4249a522caf1c35f4e9e58956e9f10 +2535,6126343dac2906b243a2541be327844e +2536,585d5970bd236936b140b83279f4914c +2537,0e32a33c8f624494915a2969950e12c6 +2538,9d1c33c22c2f066791274bb326739ba7 +2539,650d5f4c4cb16837a0e99dc905b99534 +2540,a4c03bfc052d85d3ee442d877c4f9bdb +2541,12a3e3d74f4d460f57d7ffbdbd90077c +2542,7f741ef2b51b2e2142cd55f91d087b1f +2543,1455a5a5e23951dabd601d8c6a1b0cfb +2544,44df9643023f3df6db6097c859f5e39e +2545,ad24f4fd95dae93e0815719ec111d271 +2546,4f62b4c7d0f53e300df62b08b5052afd +2547,fc1e29ab0507956f8811c86b74ef8154 +2548,b9d27d2668b8e85d69f4adf98e5e2dec +2549,de99a4e965b1c63d08bb8b1cfc26081c +2550,5109c462fb82280e5e0215555a34bd3a +2551,9fcbe34173e8d2c18dbf09788ce6fe91 +2552,24020b94c75543bd848b1d9d7a639fd3 +2553,ce2bd8e4f1bb95ca53693a3b7bf28e0d +2554,eefef691bacd6987cf4e9acdc4a81573 +2555,76c3582b1f3fc061961009bbe9134585 +2556,8186730831a6442f57f42d0f4e51606f +2557,052e505942f205bf44bd71905fb0746b +2558,b1e616a9c596969c732c86e42ceb7085 +2559,3597bd17c1f6588a44826784ba6cb5a5 +2560,72bf4573c97e9baa606c4b3ed40099a2 +2561,a1d3ceb7503e2866d9c27ac0990808b2 +2562,d876904077abd53f065e6ab319ab48b5 +2563,3c0395944caf890282db1989796ee97e +2564,b39714b5d33531931bbd3108e8280e74 +2565,84bf50a1313767d0e4150ce256db4957 +2566,3510876651c116d95de367b5d0a34751 +2567,9b3426248ec199681cf8c15cafd5a832 +2568,c60fd18fa56c230868ad1f7e02987bf7 +2569,31d43977c23b5109f2c7b81acf411e5a +2570,1ca162d3fb6e2b79b685e0610d381cbf +2571,1f127ff5e8803e507c9dad7d5a980fd2 +2572,f4bf065350bb9b16809b2769a3d745ff +2573,00f64254df1a04d6f4ae501e213e0e96 +2574,722217a78f75d34e8badb4a10c21676b +2575,104ed34c83ae98b3fdd9775e08fc0871 +2576,16c1d862dd654fe5fa1272141a853754 +2577,1d65b60b7c864748fce518057e601949 +2578,0661efb5a72506e8b42a8f843f10deb2 +2579,b463617940a22285b4373cf3bc77bd30 +2580,e62b1c494318cda928eb981c8130daa0 +2581,2fd60508820bfc838d7e5468e6355294 +2582,70f3eb51a562b71424e73dcc13baa735 +2583,5ae4957fba8894c468bf632fb10b62f3 +2584,87fe26dfad047d6afc05ce548f3edf89 +2585,7d7a8cb681b462decf41acc3eb2f8bce +2586,67f92be1daf14fc0cd989f833b4f7c8c +2587,36167f41387a407f7f319ce58b077ec8 +2588,d09f335013852f7ef1ac3c2e05a1e75a +2589,fccfe90a520d63e4f809d1c431408855 +2590,1abe4c34b456b6fc604bfc40b0b0fd28 +2591,2c0b3724f3b976c9202d9cc3768fa52c +2592,5f1156b009839638d817e5a3da592b08 +2593,8825c9fdb25759c024799fcf5b591a92 +2594,7c06b14c1491ea443dafabae47220263 +2595,0848a03be0b2900bf9028dcf771cc6c3 +2596,4e6a4024785f5fd1686aebeb1c090ada +2597,8de16a1e5f87de3d4b89bc951b0022bc +2598,2589ff7eca10a8b4c7ecef96cd0422e1 +2599,4fde1fbd9d13a3e2fef56dfa46eb61a6 +2600,7edd9957c45671e050ee8e6b93ebf08e +2601,4f3f172ccc92b3972fb893a5447bf996 +2602,80e624cf0246b5cf04bb4f2bf5a3233a +2603,18ba4c620a41200c40d2fb6c656f1a10 +2604,2e21d169b316f8b13c9db225a0c9dcbd +2605,fd4376d77207d629e50f40d97a04f7f0 +2606,8cdaa1373eb332e96471c0df9a5a4315 +2607,9294a61344326d8876bc8da444cbc414 +2608,cef8e159fdeec38519bba4d33082dc92 +2609,cbd748c5ecaa38ced0df02fba53187e4 +2610,40e4d163e8bf851ee51d526d7c4be086 +2611,0b7fcc3d682e4d9d18a8ce5b4dc5c07a +2612,c6555ca36a9bf2b21acaa719247cdb2f +2613,b98d3bdfe01f449b9bceec1b7137cdd8 +2614,13d52d849dda499f7ed81c8c55d5f7e0 +2615,a3beda0ddb5f1b30661946c8b9ae3fa9 +2616,7854699f56f5e663fa59e5509d257292 +2617,8a9e168c917b5a9ff3223642b634dc8d +2618,25adda43532758d2a6fa0b2a66e5609e +2619,525b68abd7cb07c05265b34f048b17ab +2620,e941668cb71c8f8bc36905aef7b9f322 +2621,32f85c3247fea74ad25c3cbeafd96f26 +2622,ee6392af574206328be8c0555a8b20fd +2623,744121e4ae2d28c0f93f8d55eebc7d40 +2624,be41c931f918eebbca1f3f5fc6b2efb3 +2625,98aeb80012124d9aa5cbd17ed8af0f9b +2626,0178d12b94c8afed45fb7748bd80d435 +2627,a4ea1bce6d23459fec91d5f859fe7589 +2628,3e00bfdfa41dc299484bc70aee99fcfd +2629,d7cad5483aff29680a4f0eb41e9a4c66 +2630,4a763027f38691ee52747b146af9ad5c +2631,c191d7ab712f1e6cfea208af8de5326d +2632,69401a21067d1569bd9ccfd9c545d037 +2633,ecb37b1129890b24fafb9aef65d50d0d +2634,e10aa5c8750f06bbfc81da2ab404a435 +2635,87f6acb948e456c4925d68d6b9342d34 +2636,e326543bbe5d6840049ae2c2e28c3d57 +2637,0ebf2096306ea8e07dc8d9022db7004f +2638,768d2c0b6a4cfc8a24956384054cba54 +2639,6dfa782e548bc55998030328c175af00 +2640,97552a86d9080da6f6a7d6bfa253b34a +2641,17cff19d4c69b8ba14114f38ae824219 +2642,18e92eebc5c6b151dd59fd4f0417ccb3 +2643,c5c2f6918b662bd35675808256d12513 +2644,20d69c5965eca95c1ef0e070605836fc +2645,aa3fa51547002f5ec12a35c298554fc6 +2646,4d0d1b91e33e176f267886c44698989c +2647,3c2b69ab0ef4a377d587738833516559 +2648,7969b28ffcacb7105b8a10d19f7e85df +2649,17bb484cbef855d07f39400e9edfb52a +2650,d8bacc3ae5da546a9b1c2239e4f80f2b +2651,1bc1d835ca699ba10b67409cdf3d62cc +2652,9329d39e7fb4629f773d6cc7793e002d +2653,ed552433db1271765f2e95a1c97d016d +2654,5456784c028584e877bfc329309f8bc9 +2655,7441278ebcf472d9044670b5295d649c +2656,a3487787db5cfbc4e957bb800d7ccd6b +2657,4ef340855d098b749cd45a705f43d0d6 +2658,fd684afff59cc7422712c445e53b78a3 +2659,e09d3174e82e0a5dacf749dd4a00c59d +2660,31b32908b18041ce9157df208bbda243 +2661,93b18bdd294b4b89030dd9a88df93ce0 +2662,f6d63dae90629299f3964340304d2537 +2663,de3849f92ee899c470bed4df2700bb92 +2664,4f65dcfcff4a19e2094deb476468b154 +2665,8215f227324fee9dde12a0488cd93dbd +2666,db67321ef73c15079ce2a6c97ea98925 +2667,70bd3d622dd05a0e2128c0813888fad0 +2668,3db820f07e7b03efcce2ccfe41b51798 +2669,7a923cc80568df3831d004c8f36f5ccb +2670,6615352f3c7bbdd771731553d8a633b9 +2671,e53735dfefd8afb9f96cd33438ef8d43 +2672,be9326c157334fec081fdea8723c1f20 +2673,161e19ed4de8cc4bff167999113d80c7 +2674,9bd96be052fdaf7935b64ed7d6104d3b +2675,8da5f86715957bbf49cf94963f9312fa +2676,434c9341642a2e7d0036bcb38d50817d +2677,afe95e304acf0c910b566bd18601f1d1 +2678,cd19ce0d97443b552795f58e363d6146 +2679,24bf9d862ccd38e81c296d83c6152a91 +2680,b7e8238f7c6bb7358ecc6999e8ea6a5b +2681,adb1f3b0e21fcade0199e37e9d0cde3d +2682,2185243a97a784012b30b0361acec582 +2683,04f2c558a9dbeb7b200684890a79dfd1 +2684,896bfde16733012311caba6e6aa38648 +2685,073c71c3c61d0f66e4f1ce166a088619 +2686,40aba0415c78e39fd1e9b08f33753396 +2687,3d99c6c639f8d1fcce2db93a0d93c0df +2688,3752ead8d365a4298cf9679bbb5871ce +2689,a4ff87ceb203f89e9ec93d6fea8ab681 +2690,4df86754241d187568f9b7c0be35c32d +2691,7dcf57e8a11e19e8233ba41cbb498d72 +2692,5be959a4bfb45e8b7e325ea7cf464927 +2693,6600edbd952053aa3c1bb08480d7b23c +2694,919e024f26b571969fa4c4942b9e79ed +2695,fdadd245216220da018892bf84092fa0 +2696,3397b87118665ff4bc233debadbf3e2f +2697,f4eff266017af104d63aac9a5c6f2216 +2698,d222216b483d134cec80eb56e13e46d6 +2699,2cb4a7e3516b4885e39892d0280c2729 +2700,bf0a3bb641bb944be8035f6fced0582e +2701,34baae9800cc0676a7a51bac51a8c886 +2702,4ac0b7ec4b2f554b56979c7d5d907416 +2703,02673d3d53572ebfea90db1e9c342786 +2704,4b5a2dac7c6dcef8326df13db3f4417c +2705,79d7bb37376952a4a6ee8ddcd55d2375 +2706,e27b9f388198be6217e1484299f071d2 +2707,f5baa31d173af1297e5003de316a099e +2708,90dbb27efba6bf8e0f55ed9b3191193e +2709,a78b6100163c19e5c111a5036b830e7e +2710,e4c29b00067eed059c07586785e3b2a9 +2711,a988681866ed513e207bbcb3aa4dfec6 +2712,1b0da0edec418cc537f61b55255766c2 +2713,a9fd8d6f749877d7a3098e4d32e75d3f +2714,c5ca5b040bc48a39d393ef832132133c +2715,4009d4701fde90713cf8b0f5c4b4519c +2716,384f109318e3bf8911f0ec4450f9dd0e +2717,1e5e3a5b82cf2aeb516208cb34594d37 +2718,821001b4fc055af25db95f59ca611c74 +2719,933ac08a46a736dea8d8524bf38a3ecd +2720,47d6adc56df2eef8765be5ec6957327b +2721,2e7661689f5a0cf759050d39b509dc44 +2722,5e00f285e663d262a765a80031ec8a43 +2723,71fc600b6c4bb548e05a2dcc87c402a7 +2724,d41ad0bb5fab92969fd16f19bfab91b4 +2725,846f06902eb7ceba4058b70c47f4c508 +2726,24f913c3c3310a61890bf58aba554ad5 +2727,f0d9ee706443604401f45b5d0ce63d41 +2728,5cb4abcb88f76ea633057fbfc569045f +2729,8ed5a10de242b4439e461e5b66dbfdc6 +2730,ea829933dcff94c2c28f1250a582547b +2731,260c0fe258188cd97b900d585a788822 +2732,2ed5d28ddbed529c2ef57e61cb3a662c +2733,837a1175b53af287f895e4eaf9e62bbe +2734,23eead35133bcb9ec0fc95995cca8d47 +2735,0939d7a6b2b2025baf5f1fee1791c50e +2736,b567942ca163f582672d6aeccfa94a44 +2737,68da88fd183f0d0ef593aa10f56f93c5 +2738,ef62cf14d45137be53dede044536b7c3 +2739,7d1072431877b2bee4a68ef489d5d080 +2740,3476a25a49b188ffac4a5b876c1a6b79 +2741,3c3c4322060c8a4ccd99250d96d453f6 +2742,652329e5b01ea447ddc7118deddb4957 +2743,dc67f85b17a5fd789e368f927d5eebee +2744,21bbc7456d85ad5f8fd0517707d4aff3 +2745,1be7a0e5f53db9bc5aac3e4f9760f323 +2746,4030edd3add95af3158c44977feae2eb +2747,fe251637685f8c65317537c85d182b1c +2748,48a3ff9a34676b65ac2f91381704d3c2 +2749,a8e9a567683fa3b7bb291ba7bc82dbf6 +2750,540b92012e3d07be91e059a01a21e84d +2751,3802ab270cecbf3dbe041c54e11c9426 +2752,80fde70d78f3bb198119ce7d91ec2478 +2753,a3a0438d26beae04505d2c8bb0710f78 +2754,b5a8c730f043731e153c1f84370c310f +2755,8ff530a5346eca80323a9bbefabe27e0 +2756,00b9d567d10473e7ef27b16b9f1bc969 +2757,437bdefca8d5825cba242ff2bfae9c11 +2758,74fdae3b69f16a96964f7972dc3ba005 +2759,a39467e14e0a1d6bbbfefffd62cd18d8 +2760,f6950fe1baf5858f085a73d18a49a29c +2761,0235dc6fab1a3ce9f11553e45f4cbcaa +2762,1f540f49c707bdd895655b45e0e7d06e +2763,066e521d5d8a3978df87206b07ca1245 +2764,e61c7c5dd26f38da5aaf8bbdde0fd337 +2765,f5d754cc4f1a93601bbbeee88a4ecfe0 +2766,39acfd51b937373fc5f565b0c6f4d20f +2767,10d4ef25b755f690630b6fe69da3933d +2768,b714341662fe4bdb2d2f69255219b763 +2769,63a395aa1af6dacb7cea6ec61e180b60 +2770,6d9cdcd3123c827f8872f8e195fd32fa +2771,081b3169919772c737a160579a1ab1d0 +2772,c6cf4600e2e5d2a703a2d60b85b0034f +2773,443ab2bcfe6fe171491021d72d55e42d +2774,b82e5b652905e67433d6c1fbd699e4b0 +2775,88cba62dd7099362646236377a5bbba8 +2776,256ff6e5ef472cf0900660f67a1d3227 +2777,ca892ad678017d7acbb7bf9fd6723382 +2778,77d3fdc769d27acb8732d3820551f6bd +2779,f740b362a91960664462f6ffb9377a84 +2780,9eeb99f8e9049d55c442def2a4ce6315 +2781,5abd2ca1cd36071406f88ab76c8e99dd +2782,a06077f3666c19f31405b7c491f2e3d2 +2783,c9e5ffef2be20e7f57a5e2496e208343 +2784,5e57a48b3e63f1623caf519873cd0842 +2785,928d718bcf05d707c88df81de12577d1 +2786,28bcfa51f63bf43e3c7d94b202b07fde +2787,15a015c0bd7c9f94d6f40a18e120734e +2788,7ee581dcb5961fcbf1b925c63a187999 +2789,f53821e62085cec71fae7eabac87329f +2790,d6f2ae281c9159eaaa9a2ac311283ad4 +2791,c49e7b64bba59396fd1f996f7f5fec32 +2792,7efe3f533e402278d28e692109c8e938 +2793,44662bf695c53c0e3eacd8c0d93e6978 +2794,45ec920553836d0d23ad68ff1813a329 +2795,712313e9ba03f58a081491716648a583 +2796,812ebe34a104bef080c134816bf552c0 +2797,c890901f818bc568c62e0d4e18fdc672 +2798,e94c81f60345c651487a799154e6f9c4 +2799,c0a8e3b3684e63d07a3c400c6d923203 +2800,29383d308a95c62ec46efb9e9c03b5b4 +2801,af4921ed67f2f4ecc8d374366ba30a58 +2802,d667f9c828da11bc0974c2b9b3ab1bfd +2803,92756853293ecc8cfe5a24f8e28f8607 +2804,ee14b7c4ff4ff67d4ecf7e6bcd702217 +2805,39691d375dc318eb3fa290dc54d46a11 +2806,1cb87cccd23736ac0c030943ab6e9240 +2807,4e9ce2d5237cb772f8fa1f5b499066b7 +2808,13a473de7a2f5e846fdbf0381ccd47b4 +2809,08304dd21af585a5cc444775ace033f3 +2810,62cbe47985f9c4b39cc90e4e062e0c2f +2811,0234c6ff8fb1800655de9a285b2cfaf7 +2812,ef53fd8614ec532c032890664afcc7a7 +2813,d629fe38942d71647fbea0c2cd5955b1 +2814,97ebd435306cbb89b74ca4d46928643a +2815,91ae27cebf61e9daa801f6cd66cdb380 +2816,45060b4ffdfd671d2bb2263f9f86f9fe +2817,a2e2442611dec49bab2efc429b8a74fb +2818,277de42027e65c149444d2de8026ac35 +2819,2db1a01b3c97b4bbcbf1f1114918eeb1 +2820,0d75f76085ada1935cd01af41ef0d27f +2821,9bb90db16956d198b871803861d88c6e +2822,410c7e1afd4de0675617ce81b6e9cdc8 +2823,2562bf953a263240831bd145dd306d12 +2824,7179c4484895f2e63d8513c6c7c36f7d +2825,bc8a5ca0a93703a8542ddfa46c61df0a +2826,8cc4a46e28a30748de4633e982b02f57 +2827,82f9d67cc6aadd45e4ae105f42db81bb +2828,3ad22bc8f603595760fac14f9fd63f14 +2829,11d0c2c354a316c590b7a02ecd719b6e +2830,524f3bbbe91bcb2a0f891d791e4b2e6e +2831,04cba8d7a4e67e9b96e9f314630f3e6a +2832,9f9e18987d473063600fed75b006ada4 +2833,9e3575bcf7098ad4998358096616aca2 +2834,321a05817d193c672232bfaaa2dcf434 +2835,a0149a416af091ea16b0e71f849ebf37 +2836,6ee9b9f116ec16e5e0e463361ac9b078 +2837,a0c10803970a2375ec560f0e249ea4bc +2838,463bd4c3cff40482ffabdf5e7da537f5 +2839,5c0c7761feb24aee59430ad4c371b82c +2840,5421d90b6e0b875c841fd8150bc2173f +2841,91c9181ce57a1ade2bef399c36619cfa +2842,7e45a9f918a0882b5037e7d20a226055 +2843,41de652acbd78a6f455fe70922f7e037 +2844,93ae16783df2c010650e0f1b4ff25271 +2845,52272923cc2d8c7ee9c2ffe6ffb97c1f +2846,14c64186c50eb976cfa8f145a9d8c598 +2847,e2140648eb7ce8bb4ef25dca242d6974 +2848,e433eea3a005c53db306b28971e5b837 +2849,a5371358368e98314336e0cba72979b3 +2850,8be6cd47f69d79125cb9d0a0075bb281 +2851,9e8c0f3b358a31a395748ff70b1ff155 +2852,61752010aa87d57cc9dffefc89f3f0e5 +2853,a9bcd2f0576f01649004c977fbcedd29 +2854,f03393034c79b904a55b41a55468d77f +2855,1bb1417dc331d1ea1c4fe74c9f0e8b59 +2856,dba739c182b016858ac30b882e232a4e +2857,781a924561ab6eee3d6653d8acec0afc +2858,e1127276758359722ab13d7afe1091f4 +2859,055f4e67af2a9e1c56d7b826ceec4087 +2860,fbab9029e6fe034c40ef531220fc56ac +2861,bace4d67a23efb59e954d4ae9f163147 +2862,3fc55ff069d510096f6ba11f78402153 +2863,d829f1178f0faeda0cb60d1e9ea354a9 +2864,ea0454ff637262fb733c8d503a045328 +2865,9e131ad5c91093299bac6772e1c755e7 +2866,3c8fbc4934f87ca9d62223978c12dfc7 +2867,c4ee7c320a6c285d7c88e86a7b93fd12 +2868,3043ff8613d177edd90180cec3451c06 +2869,3bdc7cea29c8b3659d0519de14d0f5e4 +2870,6761670d840dcfb590f0be8f05518b59 +2871,12cee4fadb8b9620423e2bcb00cb592c +2872,75e36cb5140210ef9cfe1410a8fd6323 +2873,615857e7aa5dfcf39fa57112fea5e193 +2874,2b6a16fd69c049a653a5317c70c4bd0e +2875,b8ac05c150bb367149ba1365f23d1a89 +2876,00c489ae66e3ffa5ea546a3bd7685c9e +2877,d7802ae9ff8a27670a741b690498c074 +2878,89aeea5517d769b445bc6ef9bf739c3c +2879,b7196acf0cef4e8d22708aacf5c5903b +2880,294cb8dac04751a1f56e86daf6065c02 +2881,385c35f559814348324fb251b5ca6c28 +2882,bddc8eaae88111d2ef3fca9d4a1c255c +2883,8d68b010dd40a236984bbde2d92abd2d +2884,91feda3e4dc4649e70ed56d64bb650d0 +2885,1ff94ce6cdbac1ab0bbae4e5c622b9d5 +2886,1bf63b5ee24c4cedc53c65f511819856 +2887,7abead91c439b64b5f4c68bea6661a42 +2888,8b644047573271b80bf86a808d0d86ea +2889,48b4af3a7452fd0e179d993fce98ad0e +2890,a2bec2b37c5a6238bb4657ad170f3c17 +2891,1da9de688cfc38f998766a6c3428df54 +2892,aa705befb05439d8d14d392e43230e9f +2893,a59905841d4b89479584aeabf15f18a3 +2894,67b5e3a852ed2fc360dae7351d87bfb2 +2895,6227087946b71bdf1e63e8e530e559cd +2896,ef72dba9b04403e081853004cf28bdc0 +2897,ec8cee2f26dda9515488c5a5f1c80e96 +2898,14effe2ae9a43c682fe8413444bca63a +2899,bd91b7fe8130feeacf2bec4fc2e35e53 +2900,24882d70e00d213000dad544acb51177 +2901,38ef73d20d5d548f5675c0c934c5e993 +2902,577339f9feac5cc602c9032f4aae22e4 +2903,da5f38921953a54d76a79802e4038ede +2904,d2c950c7fc7048e472f3dea40870fde3 +2905,eebf2ed8ed7389fd03f3e3de476dcccb +2906,0daa6d495e02aafb8cd52e7093b267fb +2907,95bdf9e53fd51ab7d4e1c2ceb762b486 +2908,036c320afd5e9e3bc7499c53bc6bc1cc +2909,94f8b9b5e02abada4d38ab524bc75722 +2910,8f9002747ac5166bfb9181fa6ae96752 +2911,bdf74fbf02a35d69163304733ddff8bf +2912,ac6ea0267610cd44c818b9c111713b81 +2913,3ede709442824a6135262ca4b1886f48 +2914,f96bd8fad2cb927c275180b3bb9c72ad +2915,c9bbd9d9feca453e8685324ef1440326 +2916,bbfbea574119fa5dcb2e6dc260d2e7a6 +2917,17001f0c94453da63bd0821bc0badc64 +2918,06afdc8986a5bd0b37ab66c081fcf124 +2919,b863631d337202ae5c28069c891fdc9e +2920,af78d0bd1527365f683e5ecba8506178 +2921,3fce9eaf96333be20c23489b18f5be32 +2922,3379ca06824585e07e37b05dc214e062 +2923,c1fc79fbbdbdceb230b7754db6692e0c +2924,f1393c2b280f9c11cd0fd6e5e6830525 +2925,b33e81590e8fe50f52ea1014db01c4f8 +2926,4bbf114d1f926fd4462c097794668f25 +2927,7fe47ab514cff212dcad3695d56d6292 +2928,e79180cda5d67fbb397d1dfadafe9812 +2929,365aed6dd959bf7e40c482c1c33eb4a4 +2930,7523fa0a23eb3b8eb0acf6487992e4c8 +2931,33e09685934d03ffd7c5883cc6eb53e9 +2932,acecc5e83da7f163816bde3bd42c6539 +2933,ab6cebd41849ed552bcc788082a863c5 +2934,c7bbac8a00970f91f427af575263a98c +2935,1511e6dbdf8e3c4030810cf3a0bba137 +2936,2ddb99b9f1efe8751c3e825ac0cbdb19 +2937,78677fb9ffee44c58d79f55a8b9ef77e +2938,f69fb484b9e5a5fd087d5d48710c9311 +2939,164128a142717cafbcd1fa7b549b1944 +2940,ba74455df2fff1994a9d710910ac7a24 +2941,5936a5a6d16fcf3813ec24a7e2331b07 +2942,14ed39b15c4c107c699305b688c70b58 +2943,0aab1380d7dc64c5e18e331c38b433f2 +2944,fcc15834da21ec18cd81296cf3ca8c33 +2945,ea015bd23061c3b44f3978dedf1a70f9 +2946,b793d13c75aab55803436d57ffa62b52 +2947,5cf00b61f7c70d1da1acb6dd8ccc5721 +2948,eb45cbd353040a0915367a7def3a012a +2949,9fec795d8f1833d883b3c871f35921fb +2950,9bc0eff392caef6e1812ed846dd017fd +2951,9ed49d42e72a26c7aeecf5f5c9b9d640 +2952,c61639a65c746310fc3e3bb25abb5ab3 +2953,dfa39ef628caeb77b560a69372c1c3a2 +2954,dae8fc868e120ca064708e2fbab03169 +2955,cdd1bfad40f0a9f9607443a1d7ccdafd +2956,414459645dac0157977c11f03357bdb5 +2957,e51d005d66a5ca3a3eaddde323d577cd +2958,298843492cf4b0a6d402cc79da756a0e +2959,ce7fd77e6dd9f5ae05feda56ea3e9bdb +2960,14a371bfec02e01f6bf23f052d11e768 +2961,6077e7cd8340d2d01b66994127baac9c +2962,5294f744a414104b099980655661ab65 +2963,ddda297015422dcfbb08e92b2ff05953 +2964,508b79744fd09f385e1021b90d8d920e +2965,de82100f61a6772da9fbe05dd7c0c65a +2966,63f76f01af583cf5ed861a0944ee4699 +2967,290dd9de72cc9167f50ffcb998be9699 +2968,36541e64ebf5fdae7753eb07cbbbb463 +2969,cf43757d038c330ab881ddf3092e1602 +2970,a1db2da23b0fe9485c9714a7e49a3b69 +2971,89b0f81affabd12526ac485efaa358c2 +2972,28b2f115c2777304f01235b44a62c1d6 +2973,5eed9a132d20581e017fdb8f36af9342 +2974,d8e598c741b4c34ef3313e8c5d7bd10e +2975,eeff2347ad76a8f24d32e56f432bb049 +2976,a8e5d8ed4bccfdc7baa155074e7fdcd4 +2977,f0b6e25a9a5f98f4765ed519cc168ed4 +2978,717fd24a3cc8f391e9add07708b6a4c8 +2979,aba9db232bd422dc89f1f29b9cc2683e +2980,5c4039a8e121c26851683ea0a2fa62a7 +2981,cf32adb4b24fb1a700e33842dca7e8e3 +2982,16688469aa6d4caeb24835b0ca2bf8ae +2983,61d85aadabf766a5ecc8ef6ac3a1ecca +2984,98a6f2ad22d8d562fa2da66810469914 +2985,07562d042534b12e9c899b5bfa18725f +2986,4c60d765b8b7c6ab1f033ae94a438b1b +2987,683f6ecd5959129704cadc18c7dd6326 +2988,f8ef4233347f68265d8846e7966f1fae +2989,abc0dbafb5eb12171e1a0a650af181e9 +2990,2e95a123155b10b9655ab752ac7bac57 +2991,497408be275196ca744cc73919e3b854 +2992,24100b57d87b3f32ef2c043943f88b12 +2993,89b8b2dec3889da59b13c1effff55b45 +2994,411024b5153365c7f0249e812096f2a9 +2995,1ce9f5f132713d042bc0c771cb4b3558 +2996,c242eb61eef2310011a61f9b8da44cbf +2997,90baae4e0adbbf56ac963c10a4f12ef6 +2998,4cb312644fe2e3a39565c7336f6533e2 +2999,f00e12a172c80ab6138201563eb7c616 +3000,cafb27fa389f8316ea6786d8382a5902 +3001,1e0601c0bd17fe857ac869f1adfa377a +3002,646f6ac57f46cf6334af92dc932050df +3003,4f10747832635a1302bd810811cfaab2 +3004,ec6742a4f3c516e3534e45ad8d07cf8c +3005,7b57ba6df9f8451ddc93e2b1624c4a43 +3006,61796144fa7ef5c9daa29e715ad478a9 +3007,204e0a7f99f0123a3952bc703064de07 +3008,c890d174f9029c45d778f0f46373fd88 +3009,1585f11308e39b9765cf9701c5aec124 +3010,afc153fb3338aa7c107197088bbc83e8 +3011,d60fcf016977733e2b64de1627b1dc46 +3012,8e30c648f191f98655229496c99295d7 +3013,50c1c4e29553dabd0e411ebcd5268603 +3014,8ae3a5b15e9b48b6c397bb8e5672cb4d +3015,51e52de2d51187e1d497646bc943dda0 +3016,f75bf05a231df0beeb02a0a50a27264c +3017,d1f3ec10e438272d539129b77566ae82 +3018,37c58550579b28d56c714c69990411cc +3019,ba9ea295d07f6a3fde10745fa2f6e3ec +3020,bd9ebedbbd1a8fd977bf6849fe420682 +3021,3a3572a95d73d8d82fae6ff8ffb2cdfe +3022,fee3792145e67e2b2cc1c3cbb4173bbd +3023,d60b3939e7c5dfa1bea083a18ea17f86 +3024,40a84123db8a6f4f86303a737a8a38bb +3025,2001bd4c68e9580999e57c9125161f1d +3026,e1444410de150ca0153e4922809e7d54 +3027,4439799ba84288809aac95e2350c2823 +3028,2002a8545d5da9ba6b4bc5109cdbbf85 +3029,c67859f70fa02c5a51bf6e6aad3e5816 +3030,ee6e57ffd10cebf353c3f2b5dca0bb00 +3031,e534e6da957345bf39b64c0851dcc95a +3032,98948339f4d37361ef4bd530ba126cd6 +3033,b69b228f65ba826f57061ff075cf3bf0 +3034,e04c34e21a93be980c5b95463421dad3 +3035,723c81ca02e78b6e6cf41009cc070371 +3036,f4cb68ce892aadabd526e0efd9f95ef2 +3037,03a619038785e347c965efbc1fcf3891 +3038,84b18dfcc8d0deac571889fb6febd8cb +3039,b5ed36a870c150e57e1008861a20a06f +3040,193c39ed8fd5a37a6db037b8158cf95e +3041,25b9d27c4a8b57871d629d0d29b11659 +3042,eba0f4ce46372e67e1a84ed2b0b42ea2 +3043,3cf30ffb8b9ca8fa3697e1dfa44d1466 +3044,f29f7a4c4ad25a52bc5280a6b33ef6ff +3045,c28627cbcf1c526be8ce422b8cd644af +3046,a2ec7c26249d69d6f9619b79a725271d +3047,8367e708e478b2df075f3c576ba3efba +3048,430b079d5e08fe6608f6b5974942c9d0 +3049,d3fad83ff580f1d262504981fab33f46 +3050,dca24e72c92d41deea5871a211e69854 +3051,9f877c6cb69ab5c623fe9c31dc4dac75 +3052,5aec9ac85934e1b881ed0f2fa00ae16c +3053,9cff1d90fd0cec2a01979637b301f2bf +3054,af4cc4432e0f897e0c31df284810eb16 +3055,8e82d0019582242291d1152c55e2d00e +3056,8fd57ad807b69e144d17323d20bfaf84 +3057,48113949d252704a24f4b0836e1f5f88 +3058,cd42ae93908daf9759366b0761f279fa +3059,f508c4344185203abfc79419a0740e37 +3060,3665e655672e9027814e740963707040 +3061,fb4b7c0aee647a5f2828366c0879da93 +3062,b9867dc5c5d2d08c0d9ace88b3c311a8 +3063,93ecb5ba1b083ef25a74a0336649f280 +3064,2c24c5dd121a11aae1859d0ba35fb121 +3065,31c466cc5ab4aac4439326641914675c +3066,81b5c9a1092d4a5e0f6851b0b01d6a9a +3067,2575914456e37ecf40e0977ba30d85a9 +3068,d4230ecf6042c8c08d4d4ae11856eb6d +3069,f560e9ca0d1c229907e805b1d4ee7ae4 +3070,e303ddf60534443de4d223c63bf02df1 +3071,cc0ee2193c88d72c1f7299f16c0ef45d +3072,b8c7727483bb03056266e07612821b0a +3073,6726d902f2a4173e7c7db375ca0d55e7 +3074,75a34d477d238ebc4d1ee959f8a97d05 +3075,ec71b6dd282af33be8cd85713c5dbd02 +3076,77dd4176448661fba7da22d66d2ec92e +3077,f590f278c6a4dacb9b2c5bf8c9df2237 +3078,4801b81bcf16005d8d621f4538bf4429 +3079,d395a0231f1d1a5386d785cc09ecea78 +3080,98d5ec5a7abebdeff91be2a713629ce4 +3081,a0422759a74c66044e5c7a17d019ac14 +3082,b0cd5c5ddd3f78df2a56797e1a5127e8 +3083,1d636fa7a96a26e0c43fe1edb095ac45 +3084,93bd5f884308398ee299954100e33370 +3085,14368210511dd2ff07475adac1f0c510 +3086,e9b0ef917e02ea14433b9164273d47ff +3087,7d51aaa9d6d6e9bb49a7ee0dc6342d3d +3088,3193fe23d1fc4d178282cde74135d8c9 +3089,5be5b374fb713f15f0ef928347012d85 +3090,36447e313ff65f1d1b981a5e5300c812 +3091,63dc293aafa4fe20ffaa40726a4191f6 +3092,081da66a48e116ad2def0a29c4e09f8a +3093,f1bfb81b65c9401842055b76cbde92ed +3094,5d8a0a1c42613158935fa54982e81c69 +3095,15bd75b7f67279388374ba4e8d5c34c8 +3096,6bca777cff71b56a5c95c02c9cea92d3 +3097,22de1f962d67f6fc6fd5e7ea39dff020 +3098,4944333ddbc0ee655327aba14b690a1e +3099,037f939804bf9ca77ff0e0f420b28ba0 +3100,0d177531b564a1868b6a47e5af581986 +3101,22c6e06ae0b6797c35586a7c9153749e +3102,ade6d45e95cf0fe3413e2d2b107f6e72 +3103,63265603c2affc23813998fae9e88cd0 +3104,8100399737b538f72165c80c4d83b110 +3105,2f6fd3a60982fd8c87ec0be060f0b44d +3106,08946a6dfef8620e8cdc5f7cd4841d8a +3107,6e125c22fdf7055cc8d3b7691f5e60be +3108,0b401a5f0794aa03397ac1849ea5fbc9 +3109,6c49ed26283e0d5dc0c3cc2d9e41ed17 +3110,4ae309fc5fc878c347f9019297eca040 +3111,17cf7cd705c1c9841812013e34984b00 +3112,5542300827dcda1e837c63cf6e6252ce +3113,1516de0646e313d5e2098d76c915ba78 +3114,17efdfe9f659b80c9377923fbf28a803 +3115,2474db80935ee6a29b002c4128328e8d +3116,6e4a846ffe7069776e742108fbc7ea21 +3117,601121fe4c37c0cc31913bf33080da06 +3118,58b212e26783b5650d3dabf66bdea5ac +3119,016f2d0aaa781b5fe03a9a413f6f7951 +3120,c343e1705cde5f3d820fbfb778052a9a +3121,6d42a23a76bd7caffeedbfb2bc4f8ec2 +3122,8a783bcbe3d80000640c3f90af042d03 +3123,25d8cbb8eca97a50299de515dd7ea62b +3124,acc7c0df8ec9020e64db8df6d29b2c77 +3125,9885d568f7cb88743ef43f28800d4d7d +3126,2df6d63c0034a5ec7d7330a308525b30 +3127,638b91c5eb6b867292c9610cd824c81f +3128,c80906f3f4760e4c564104182a516d8d +3129,a27778fa6a0f5dd77c81105ebb5bb592 +3130,a87ab8acb5cf9b1efcf554c1acd724df +3131,a95083f5ce0983c207cc3c5b0dd1e217 +3132,f33105fe49d155ac0f88a9216c737282 +3133,ffbb9d7cf5de835f6292eb45c3887095 +3134,2bd881a01c1244deec836a5159697539 +3135,e743f5492f3ac62b942b0595064f57b9 +3136,77a60799e9b673497b0b6b39343a2ddb +3137,6b97e940064badf994d08284c8968240 +3138,d78dc4f3773c69d06f7091ca1e769423 +3139,5f3e249cce1d7db0c660e29f4853a31c +3140,f0f52ac22462b9eee07b736b4cdc9d7f +3141,bef09be71da321a7e87e6b2aefb07dc5 +3142,27cfe5c35569389c9118f283ed23f8e8 +3143,8dfd9acf2476652b6af1bdb05414a855 +3144,1954df3ecc19a02efe16289f2e0427c4 +3145,bb191d879a5c356c13c83ee753c328fd +3146,38386dd70c6abf4f233f89a60bae8b45 +3147,02be92b5498fd8335c143c861c5a5a33 +3148,38f630a417736e0ea68ddd66268eddb4 +3149,c911261b104f3095f531383f44947514 +3150,a70c8e1ecdc5d74eaf4ef138fd6137c1 +3151,a8e4509a71e186cd3f3d486fa37062b6 +3152,bba41f05a2919c8a774451cda8adf048 +3153,0eb3cb86b8a2cb58692144f920456baf +3154,60ab137496c6148dacc8f5eceeb1fc38 +3155,405c470378bb67d5c3c8bd299aa138c3 +3156,b18d0b9306522ae80a1988fd660697fd +3157,43a70c8cd81cd138c65350b20098069d +3158,2d6ce2b77d92a9efa5a3b8d29abd62a3 +3159,0b2bb3eb899faa04b0974842f9f4ebd7 +3160,b44902c41c3ac1b341a87087e95a3115 +3161,942866344066e898a47034bb4ff13495 +3162,945d6579e0fc8368d52a0a8305184774 +3163,5d714d0237a9aa803cf1914b5ea7f4b1 +3164,68202eeecaa40165c945544777c5ff0c +3165,2fb51f984c5f4580875ce77b64ef789f +3166,f299faae9a557022201e90ea2d828b12 +3167,53dd0c0bf3fce56f38bde4ab0f77f2e6 +3168,a39265903f0fa0e394bac85d4e479ea7 +3169,70da862836974953e87f308e39062615 +3170,7ab3c82d67e8773ff9be513fbce5badf +3171,e57c30d5ef54156623ef68f656044c8b +3172,4b97f6f7d90e8775adbfa94281eee632 +3173,a52bc8b6dfaebd2f4c6a2539ce580da4 +3174,48505ac82a0e439d4fc64d9b258dd93f +3175,6abf589a92c26ad3fc85bf39cd049430 +3176,98351cf879cada41f898c5a3bb29422e +3177,6a57e42d7afd15bafc3a82c602e47394 +3178,b76eeb42fc148041bdced8326a844f73 +3179,725f12f7ad80ea0ef0aa35ac35786986 +3180,85b2fbaccd364b723d33450f258a73ef +3181,5db9a5b9b60d44c29e3a23ca173a3126 +3182,5d486e8df4bf1350ac2847a6a5affa51 +3183,3ea4a4d6f8b13eca761c7aaee42c7568 +3184,47a85977d9476dd5b493dbddfa6acd32 +3185,b6d1d0468badec4a32514cf5934396af +3186,036f85541e2b952f9c78b86ca817207f +3187,27907e39084420783abaedace25939aa +3188,0cbd4a85bfe0c4e38925b374230d2041 +3189,511ebe70ff80d638f1386f8511696b66 +3190,15be845663ae1f9bb73caa4230d7f1c6 +3191,e41353182c2076b536a22e0fa1374655 +3192,6cddcefd8381939d642d25946f596d85 +3193,f7ad0aaef77d948b761ddac6a30d3f70 +3194,891c9b57dbbd4ef9b6d8c036bad91d93 +3195,9ad05caea795f760ea2cd7c1f1b20883 +3196,d704d7a6a2779fa17e226998775533d0 +3197,9c5565e2849106492cb126f83de19879 +3198,16fa346a91e8a0976e8fc2d0a8532a9e +3199,8f27e7b95fc4fd8693e60f503e909f90 +3200,fc40dc7c449af0fe4fbed078c4c03fe7 +3201,6e72a7529894331b6014de2bda91cc3b +3202,0765b04754f394a07d497a51dd83df42 +3203,52223910f880fced8902ba7a18a5022a +3204,44c0483fda988cae7cedeb91ac7c69bd +3205,a94c28873e4451f70609916aa4a41419 +3206,049575f9e49737280f95e441e0abe3a0 +3207,a0673d357de963e7be3e848500b31309 +3208,cd1b538ea8d1e6ec592a8a90f7b9bbbc +3209,de1ed4816f8489f11511d49b2d8064fc +3210,5d881f5f45ee383b3e2c6020cd92f739 +3211,969bbaf401fc08d78b177f74ab1599dc +3212,ba66127a236654f619321af7919f008f +3213,fd2cefcdac88191684d8ef5a8d9fbc82 +3214,c1acf84fe24f305ece5a8d61ca2ca423 +3215,ad8740e0952f4d675f18a1e527d93844 +3216,2e9fc39b92d0b02fb87b13f5667297a1 +3217,1dca2c66851a3a631511669de3840adb +3218,cb79f3deee218b674ebbe2188bcfde57 +3219,638746691626e9584dfa1590234f7298 +3220,d6405ac9d29f860991e52d9338fddeb5 +3221,dd1d7f1ad99ba7dc149f7a9b1622f3c5 +3222,d5f273873485e2bea945144ff6e30e3c +3223,1d5962d83c1778f1af092dc6467bbeb3 +3224,415336fd790f31be2d3c8c224a7fa916 +3225,19b7c3e18b204bba765c6b10a002e3c5 +3226,39be51e639c7fa95d23bbe86a17bad34 +3227,a11b356ae99d5918a122a400fdc4eb39 +3228,a86b91016b57d80ec0c7b2f04fc07701 +3229,bece128d0640ab98b1389ee4dc041172 +3230,f4930b9cbb057cbd38348e8df4b1629d +3231,48787584978bf97b13754d15359f6466 +3232,71e82eed81a4d8eb4aff38905af1b8bf +3233,0a0c593d11aa331196ba2aa7a60e99fe +3234,852fc2ef12e1893e040822dd2859c772 +3235,b69fcd94752b92bcc15cc00011a3eb2c +3236,cf471f3a95f13b181d3bc67fa867b1d1 +3237,7870379f8779c4fb4073dbaadd1303c4 +3238,5cb2a86657455ac0017df378f10c1690 +3239,3f5df4eea44ac5bd95f564d6df8151be +3240,f28333bd61e93b1133b2161a162f7ed4 +3241,f1d70c0c986e9ef9e4d4e991db485021 +3242,8ec64daf2e26eb5730263a2b567097ee +3243,a52bc13d85de893b071f477634b372be +3244,3a8a5d10853991abe464d66f2f6e5616 +3245,db0b38a591e014f7d4f912393b89a986 +3246,ba23976dc6a85bcdd87591748f90306f +3247,2f78bc0a26921d47ab8896285aabe0cc +3248,296002b9e41333426223ac71c09b12d0 +3249,e6f87d2a133290eea9fd81c6077bd3af +3250,b55eae55e40c2c55cbc3bba97faed5c6 +3251,2a0e0185a28c159627a42aa576cd2898 +3252,a0225f22d9c5d4dfbfd6e92345f84d86 +3253,aa78fdf5245a1432b1b73626d43ad486 +3254,797e97b269801201b271edb7b4f9f859 +3255,9cc41af3fb6d8a66c9d7231ce676248c +3256,4b8b6512df2c6b1bf722c96e82835aca +3257,02511bd362b81cccd3dd672fe35fa32a +3258,356013492fdfa95a42ca565f26b01894 +3259,ea39353ec5def03c1f3c2151367c738f +3260,9144a0ded3127fb1a4787335519c9f44 +3261,1cea801676b926db0c4798fa7dec99ef +3262,5dca2e0797eeab5dc90e256af474dcc0 +3263,a0032a3dca65d8cad1b822e1275ff9d0 +3264,200a106f54f5345c960b61141b8d73e2 +3265,c7f4feec73d720a38653a8e37bfe9bcc +3266,495f9e1285001b7c6b325fed8edf686b +3267,0871b2c3f1f54cf20fe7c9ea78f96496 +3268,d1529094b86d9bf26613ba1106dd35d2 +3269,7b3829d57951aa4fa282723ff11c269a +3270,ac7c548a2d81ebed92479802ffdfd92b +3271,e36285cc3ac4305350191a1a4101eff7 +3272,c7b5d1e3df4a2b75df82de8d7a62d466 +3273,b24860ee290d8f5a487bad8298dd3922 +3274,36377bf5468c40988e38e9cb04a8d5c8 +3275,45f8a4e541131e28152c206b6b5d36e2 +3276,5f6159907f433c29345dfd7c85901c5c +3277,82b797c1c6c8b2341dd29abd4ec35514 +3278,bec8a55803b036351847aae53b211a1e +3279,1627710eb24cf67c7cda26cb001c46bc +3280,89ee1165a10725a71b81bfc30c74ce5d +3281,f5be92d00a33d9f866a49fbf5db5c291 +3282,6bbdfd019aa85ea86d2902bbc31d7091 +3283,f97ab6dfb905b74c9e60c85f2579e6fd +3284,f68a1c1b219e595bb28671516ac1025a +3285,2e11421aef825f444f60da1be4d414df +3286,147918b89a8781247fd8db72b4290e2c +3287,310973b0dae3718db77b707d78a16598 +3288,4003e3f9a875c7a2d71e6f26f9f44ff9 +3289,54236dbc7fa9c535397b30002206ad65 +3290,aa64a14f2c390b0d4fb1cce2b50c4531 +3291,580576d7cba8e2432e0f9c21616f3252 +3292,a1c3b5ed9eb2a591209994f543bd8192 +3293,3bbbabb3bbb14301fd5d7d72dff243dc +3294,4373be8c8f5904edc652c3ca9e97b69a +3295,7b8a80d06c5c0c977c826ef72f82ca08 +3296,73c69705da92ba57bc06a54a68e61217 +3297,78ec1e1db3a6f672eec93d3c15e78979 +3298,66145689358020353606897678a0878a +3299,b2d9c376fbdad9fb2952bcdd8ebe0a47 +3300,2cfbf184d59f91b61d9fac7d97bcb8c3 +3301,4ba7ac323712036de49ea87bb5e7a020 +3302,2d53af6fc21d27967afb3ebcde51b980 +3303,54baf72abef214925b37b9f06259d84c +3304,c62e6a27b5d022a5e6d1e48a8bdcb783 +3305,db2f3b8a5f84028bf930969f06de81f8 +3306,77b42d5c85b0990181c74e2e6012e9cc +3307,38cba3c2416a0247653525f4e1dfe8a3 +3308,6745b644ea9f258f1091e45ae25a722e +3309,fdadf22f0dabeff11907b0040e3f678f +3310,fb3cffff45b5688d123c97a6f4a18f28 +3311,8bd3777487dc9310ee547ef1700e629b +3312,e409db0f9cd759cec679c2c452b688bb +3313,33350b7c6c9a82f2eb5bbbc1437b272e +3314,40107b9d1ea446056dbb909c300025d5 +3315,ffcff0ef2e2448b2caa740b14f1b0092 +3316,8c0c17a00165a37ac1e8a3f238eebff6 +3317,4bf31e6d4e5ccf7cc5f94b3f396b7f28 +3318,1b90a32cfda5e24eff628271754181b7 +3319,22f6902477f27bd483a1b0d5709ef3d7 +3320,6564ab3b99f77ce14d1797b1dd5b0381 +3321,bf1c365d0a24d7b0993dc0bffb52ad50 +3322,bc68bb52f8c279ac38878f0d3b6368df +3323,396270ab6031c2f9f3258c8867fd99c2 +3324,61c894aeb4223d836120e13342001eeb +3325,6c0ecc6dd507c951e4711fa00a82c864 +3326,64971b20f40e060ee270f888b88e7f14 +3327,c0b0016fcea3506283f07aaccd43440d +3328,261f25ecbb6797c9b1dc6c3ec53d16b0 +3329,5aa597446bde1550b5c623d931185199 +3330,fb9fa41d5724b66233b87752e12ad7aa +3331,0520c4930b407379bcc169c268522f7c +3332,991dbb8ab1f7a878c73441ee46f0f691 +3333,16ea50646a3345d41357a70dcff09561 +3334,493212e60cc2fd0515980ac3516dd499 +3335,c5098231489b512f654fef311e611a27 +3336,96e22e3eb6fc8f000f0ba8e00aefabd4 +3337,4a0e959ebb2722c5c8942928dfb5a9dc +3338,34bda5a2b8b172e7111d00ed95060f80 +3339,6b46dea7bd467fb947997e13a6b100d4 +3340,691c9fdd8669d280481c79611bf48adc +3341,6bb5fae18b5e1dd6258e18fbc951c9bf +3342,d37e719421bfb9b142157687ffd80080 +3343,a2b9ce65b8a0181385839903436b5a00 +3344,0e532f67160a845c6d3de077c3c947c2 +3345,015531319655ea7339e3e00f4259c154 +3346,795248be81552ffd031386c6b8491f86 +3347,7c1dc6daee13841de8ed7a6b8b2b4a28 +3348,30af98a5da90978774ce8de7dc236340 +3349,148ebd1ca63566e3dfb82ffcdda6a3e6 +3350,4b1d7e7bc05825b4c81ae449ec93cd9f +3351,1bdff091c718672c29cfa2f3b54fef2d +3352,29e23f53473adf96a0de4a68dcf551b0 +3353,95829267d3e26b53526ad2ac0d313705 +3354,a2787ddd5cf0120a71a94e8f172c50c9 +3355,52a6f47abcc5269d533068fc03a95207 +3356,72903e245604783ba6f75591e9c1e728 +3357,4b497329821214e0ec96aa6c41495953 +3358,5ef9e96832453cdc78efeee05b7f7fc1 +3359,cb034bb29dc710737d9bd6a7a8713042 +3360,826e199c298beeb50040d5dc8a990445 +3361,c5e7b976a84dd605d499091940c83557 +3362,a80165389fb2e37eb4ef52939a249b66 +3363,b5b918f7e448d5756cd6ecbe5e373cbc +3364,297d323db4df4c4bef84799593f6211d +3365,32626e37dc87343f31b62c80ff6b8040 +3366,b9f648417403a310bb6f8348f09b6ded +3367,324764f775919cc6ec88c082c95945e8 +3368,40bbcad1e5bb9d35e23e11cdfd94944d +3369,f3e9dd8c586aa895e3f78be6acd7da6b +3370,df2f9cbf1f91f850234caa576460d8dd +3371,40677a153cd342b48b951ae9da228b89 +3372,f1fa286458e76adf35cd9124cebc7f79 +3373,65128e2bcbb50680afa6854adba731b7 +3374,62678c2ef9535a0e7b75fc590b28b79f +3375,067988793828920d92df1ba5a94aab9c +3376,c1e90b163a810470d1ff83c34ab9a3d0 +3377,5defc463bd1c8ebcdf4a1951fe1a3326 +3378,e3bf193adc81dbe16d96e09611a403b0 +3379,529e00e812cc4f04ae2345102f3195ab +3380,5f87608f293f7309749e91c479bc2cfb +3381,8bfee764b705c8561dbf5938e53b0e13 +3382,a08fabe8ead0644119eaa83767f3485a +3383,d78d0ce53e9dd3316007d4b963044e44 +3384,25951b372430a6c710c4cc0d55747b07 +3385,196bfb76f049c700fdbd96c688a27197 +3386,997f038577e6097324a4206549495f76 +3387,7d3fd4bb42457d3d925749adfde11369 +3388,1b91bbb8366932d4b7e0fd896a6bae07 +3389,8556bd97021ea291ed5aa0f35b866406 +3390,61e8f5a8f520c1cfa5fef8083a8d471f +3391,c1867bf493e42f60d9a516952d3ffd44 +3392,749b30139324280d77b4af5604728df3 +3393,d44f4f54cf06c4bc8c561a2996fda511 +3394,2db74f7020c1db3205cdd5bce86232d6 +3395,71e9604b30a932d345f055d32a1ebca1 +3396,570f81c2f98cee4b71db66ed15c4402b +3397,45c807a93cc37315f7c18bc5b3fa5798 +3398,69894d13703a25d47822125338737ea0 +3399,85fe8cb12a275eedf3c158a9c5f698ca +3400,2f2879d54d1a11d75c1e74bbb98fca07 +3401,2d63406c357b6481cb8775011a6b8426 +3402,d6e5bd03a0d24148dfa1a62e0482fb28 +3403,571bd0b9fae234f54fccf9e7b8dc5426 +3404,0ec73cfc23a3e8987521e63e9ccb268d +3405,17b6527c18bd2a2feb806b4f9747acd1 +3406,03fc5fbcc88671061b0e9817379e6bd0 +3407,c829a8ab0d4e4dd1bece843a9efe9aa4 +3408,b1e0b94c0fa5c8310895099bcccf5715 +3409,d7e0a825cd46f547f3a45fca4764cd18 +3410,85a49d0ecdb48e8107bd3368abbcc6c6 +3411,ecef2f99e6768f49141555336307ec1f +3412,c9c0e51da5b771383d984a735caa8b70 +3413,48b397d4b78e1ec084e4f7b51549137b +3414,bceea44bca518b5c5e16b52a35b63a29 +3415,e7ada092f5f9b42f99947b1788c078c3 +3416,93a6a521fe3e739b635adfa134473240 +3417,3ffa913562280ad32d687e9e56b40fa3 +3418,905d3d2b3dd21fe8b71003a4e80aa986 +3419,c1a285050fe0faf481a75661c1a34a98 +3420,5f36d24f7ea8d6c697e3eeb140cd0aef +3421,27e473f18b5ce79d26879e96d56c88fc +3422,2ba0a0bceef660390897ea35be60e6f2 +3423,ca74466fbfa3f9fd72bed730ca0e0b02 +3424,8a39babe4d26422f6c8a67844057fbb6 +3425,deee7fc2068b9429e0729da3baa08094 +3426,a044dc97398a4fa9b96253383931b8a1 +3427,74cf3fc0abf282941a027cb9495a7a76 +3428,7f0e987e2a6b11fdadcb5528269b6a68 +3429,6e3a7d5db52d9148045bba9bfe42b9b4 +3430,faf66577a454afb7e3bc37b795817aa0 +3431,7f65272ffc94654a18ad02493bae237e +3432,8f77e1ce594ea3c0d6925f8c08009c50 +3433,2c2d1f71ea897ce46fb4b6e76a3d4732 +3434,ae03211a763bc337fac1546285ed3ae9 +3435,f4069594d9dcac93edbc271d8bfff151 +3436,f96f5d27182ea29cedba0351bd394c4c +3437,022a08a58a1fa33b6e4bb5bdc1bec3de +3438,53deab7408af07acd724b4fefe9d75dc +3439,99af1d69e0adf035f50b10d4f12aa9e9 +3440,7b56e17a531d538ca482213fceca9f70 +3441,59a1c0a4867ae518702064c280a9adb2 +3442,23783c1867b0b4131806f6536b05751e +3443,06035a830065f3ce7f15436c52124703 +3444,3417eabf61a360eb86d764a0355d4989 +3445,6c02ff0084c3ba708cf44cfee6af0764 +3446,806f1e51aac512e397033056a5d97f27 +3447,6a270b16647fb0b342ef86fa148764f4 +3448,f980be9681d1ad961d9378bf0c0fb0f0 +3449,9a43ea9ff0bc36ad44f77d810d909d9e +3450,98a003c2e7c89fb104156d31df7f0e4c +3451,91fe4cca975c1c58adfe71c9b7ba6440 +3452,a0f23d7806aec2737c10b9e3bfc01830 +3453,b5945136e89bddd406920bab52e68220 +3454,807e2cdbb25d14f59fdca365f6185ba2 +3455,fea2c785cf93e0bf86e8d6fa4cf31df6 +3456,713e2c6fa299e1362898bb878fed9b61 +3457,2baf8964549f228874185e8f1260b1d7 +3458,e627f58c836f0622eb2a149ae9fe7d13 +3459,972ef8d6ed60113c46989d8f656ed3d6 +3460,0272fb763225ccf30a80bace685eefc6 +3461,b0b3cec9b4ba89aa897e1ed64f457dda +3462,2c628989754b6fe957e9304aa007ca0f +3463,77ba48630d33abe71a3a175be65f37e1 +3464,f2276b9a40aba1e6e76078c6d3e92541 +3465,8419761aa25bfefc4dc29bf3ae3b1c05 +3466,afee8211b361264bba56f2da33365f2a +3467,ef3ed57bb3a1811f58b987db967d4768 +3468,c1a466199209d005908d06552661a4db +3469,6f10770965d9364ac9ac6567ae790787 +3470,55a74e17151c8fdf019596a5647dbcb2 +3471,a57cc40263534a3e9bfe1a6b53fb6b93 +3472,ca1c271b65a6b6794ed89427f47f28fe +3473,7e89169a0005d4624c45b4ca9a90febc +3474,600bd8de72ee1bef03633d17985572ce +3475,78d7b43c90aa5819286fb1f4e1f42870 +3476,976ac66068547197a8ddb1e5d05ab470 +3477,07e35c232c0f297241fdfd17d5a435af +3478,149f26ff1c8e32368bc61286d0fe9430 +3479,f04afa39f9e5b36fa9af92055b25ba7f +3480,e18d6ca4c881c4331d5e13ba63230713 +3481,5df44c72837c3088d574c0cd1f577f35 +3482,00b8046207e84af06ee14d48ed199817 +3483,0b71818408d6c7570124e8bc71fec8f0 +3484,d6bdec9119d23406c65982ca31c0764d +3485,e12654726c6f469176e9eb17041be21d +3486,e1a70a08a1e8b48d04d7cefd2c3b07eb +3487,bae28b66c7ad7f8ebd180c42078d6a1b +3488,9d186931630445e368649cb52e280505 +3489,f9c94b22733eaeb5148481eafcb58c76 +3490,a0c967aadc28cb2d3f7f90f0cf4f12f6 +3491,8c789d90996093bd9fec18f45908a2ef +3492,9336a38cb3a79f450a48aeeb9db04ef7 +3493,f8e4288b4f5a3fed01756833ec6cd124 +3494,9f3f661eca61b5e0a8c00300d04a2575 +3495,46c7c9a313a9ac05f6bf68e6c8ab09f8 +3496,42820b7ac3a2a239074b2f9a44834bd6 +3497,19b937899042e6465909170db0efb665 +3498,456b3ae3a2ed48ba2996ac1ec5dd7073 +3499,d330797638359acce9e987b161b11fa3 +3500,7e11a7ca6e2a8266e468d1b3cc48c76f +3501,43eac85d03f94f5e591b4d571efb0391 +3502,53802d4d090d216bda99563bd1f0f863 +3503,38550baf5cd310dbba86ea8ace4c4b66 +3504,c0691e5cdf8b3b2c3f3f5647a7850768 +3505,6d1abc60f426599fc1994f505237bcf8 +3506,14686f76c9e42d8de23c9d5437bf59d2 +3507,53cda55f5eb2de28f46cf301aedad170 +3508,dc21c493df3ff3769e7883b72b25fcea +3509,dee2f9781d787bc441f6b285ce4ca8e2 +3510,3f5453610e461082972721e35d988ac9 +3511,d2d558ed54f5ffec9c093ca71cead5bd +3512,85c32b9a31586bad14dc6e4e16cc86dc +3513,eb9d98dfce0382230fd27e8435a0bce4 +3514,ec1d50dd0fad4bb34f9bc71a4d467738 +3515,257a1bb7c50a0ad02ed8bdfa15822ed7 +3516,5284df8ba61cda54d9cdbcd6b75c3d55 +3517,d34946d40920b0e31d32436ec3b439e7 +3518,7ee41514644e58a38e042d2a1d3c633c +3519,e270e55916afeee291bbbe90a19f3578 +3520,9046c82b9ceb97959caff53c8af332b7 +3521,a932c6b41cfcb09ea549ae0cd16f46d9 +3522,75b078fc31d296f4751002e4db31bd01 +3523,9d4af636df6e0217a5086344b257e961 +3524,44d835bdfdf765fc19a9d591fb948d0c +3525,4aa6d47b49daa3f5f6b86a3666fb442d +3526,d125adc0e43aacdd082bde948ed444f8 +3527,e7e2a5590e0371453f2867f013c7299e +3528,7198a41416b7551425acf0bd088d3a21 +3529,a513554eb8024522f706a797f5a6eaba +3530,61c950138f5e144efcec5ae3050026f9 +3531,250968e040d177d89b70c63b2023b2c6 +3532,92cd6d866203133dd2a9f5d242188690 +3533,2ca6469b8d554b45807ac127d1e462c5 +3534,c6385fe5900877b4fdd5ac09e9a646ed +3535,5e22be2f65a1ecea03bd6dfe753628e2 +3536,e303b9a427cbcd577c8203b914ce0bb4 +3537,b61dfc4996a74a6b40fcb45e1faea8f6 +3538,5de92f12ac6d9df095528ae074aadd49 +3539,003908cb8b3d394b38893c003f0744f3 +3540,a9c6c90cf7136ef6e3d25308d3964144 +3541,b9727b52717f7618ba888f44457c6567 +3542,40a76d8b625c2a005d5edf636f481b75 +3543,8b3f9b3ba613acd18f08aea8b58b314d +3544,5290968250ccf4a297a893cecacb27af +3545,a5d6c821f2fb00be74d2064fb861d882 +3546,67574a9bcc832ecab74795aaca64b430 +3547,58bca6b90951087e790aea584ab48c26 +3548,8bc306a9cf4e633499b1e6a143b15554 +3549,b621181a5673108fabe9bdd15e3388de +3550,a3a2eb5dec7965c313025e9449a96229 +3551,156206f52976eeabfcb4254d80283926 +3552,5bd97873f0e0a3a0e97abfbe648cac99 +3553,067611b703e94e18df06054fc4a4f9fe +3554,bb7af6f25eabd8cf74ff8607b1c10cdd +3555,0be0d7c5c87143e38fe8ab545bf29f9b +3556,603ee6b7f12768b6f317807fe090356d +3557,e308c08e50cf360de0bac8d9e859a307 +3558,17bd3fe079faf701531c94dd77e2adce +3559,289d5cba7c50c81b7241f91e05cf9773 +3560,0366742dd97cc70ba79bf6283045eef2 +3561,5c8c3715b55d34fc7e1089b1a6281815 +3562,ebc901216d874f8bca568282b0ee8113 +3563,934499c93dd2d275472aec7e5ac01852 +3564,2ca03bc222bd0f04d46bab6c733bd234 +3565,cce483efb2efce74772c8b464c3dded6 +3566,aa99b9ad82d6f59b56652689a29c1937 +3567,ab245032258451754521551293c5b496 +3568,602fa0cd3fe250b6f29a0e74510b691d +3569,89aa86eb1bdac46acd9d14d31c5b48df +3570,9b0dd37f9b862a83076ce4f2816ecb7f +3571,2f223b749a199355990e9f41f2c9b2d7 +3572,9ff392118321a93138f69f6a671e5efd +3573,9efb7f3302e72ac9d0f8ddded4063232 +3574,36fc54f5e985633fff7c06a1c60f2feb +3575,ecc769b653704dea3229a87f6e277061 +3576,6b38748c7817e6729297330ca51be07d +3577,ab8d4b6df91ce53df487455389ad202f +3578,08aa22614054a82240695023dd0965b4 +3579,f1d4679c1361d7206b5c9c1aedf2565a +3580,c440888ebe1b81589a664a1d3b702cb4 +3581,3416554844eb6485a41e4b7e3c0ffc63 +3582,fcb96151ba83875d704ad1fcb0ade2dc +3583,10fb83674c0f477953ce5ea17f0f38b5 +3584,641390beb9e81ad2359d79b57dc7471e +3585,336ff8e2413a342a5a75b19b87f55104 +3586,f1110dbdcac483008650771d73d5cccf +3587,1e3d46130a8ef2fcb61667c526b966d4 +3588,c3cca7bb22e55d188b38760aaeee2333 +3589,871b7f3db2c15dba1b2fcc54ffb58922 +3590,f45f1252b6591945416f57c66cd8398c +3591,2f5a6a6bc9cceae892a2b90d10b180a3 +3592,51ee06102b1cfe9e5bc544929adcf950 +3593,63efa97d9feb8a047b8209f23c409a9f +3594,22fe675298c97abda347b6d616ee36ee +3595,5eaff7f6ddd323e35fb56269808aa234 +3596,a6a9a3bbbaede0420d73d81c07f3469b +3597,841fbba268924e7def9bf9b7bbf488de +3598,b0dc211a63577f0e134bb5aa53c088c1 +3599,e7912fbe2f069d1d5bdc815f2a7fc8c9 +3600,0b06099769cf57cac1fefb9c5c0e6963 +3601,ccecddb81e8db4b15c50eaf26d83e6bf +3602,4e93cc96bd1caf1cf842cbda585e7c77 +3603,0d23f8ad0cbc1aead914be10f9a3c377 +3604,693195903a0fa52e75a713afa6807cdd +3605,8d3882ffb5753aa73d2230bfab281e42 +3606,1d049060d51a4055344cb6c63c3d5415 +3607,8bf447261b46df3fd6e813ec1ee379c8 +3608,e914f12e68b80eb2416063c737a997b5 +3609,11233c0b3b0bd29a2439c6ae2e5a79ca +3610,04f3b35c58249ab0a45bcdd583745c52 +3611,b89bc652111db35d16a4d88b2955b2db +3612,04512c1aa5c06cf204aee680dbd1a260 +3613,54e45fc071ca87a4ca0376697deea40f +3614,d5eede85c351c2fb52f40640e182d69f +3615,84cf03aaea664060526d36d3455233f5 +3616,0082ca0abe0a5e7190600c8485d94a5f +3617,f71b6c4871eb10be45783baf157826f6 +3618,7f728a6f2dedb5cdefceb1d397614d31 +3619,c3a08e831bb6eac366e5440c138a6766 +3620,f511820c2eac33ca06bda7e591d7f71a +3621,d3d467f4cd844087bb3e0dabc82e7f7b +3622,c3524bf76d27fc50d43d09319c808536 +3623,b98d702be4794ea64a73a4f1cacba330 +3624,fcba5d5fc86a60c009185be29b20f9fb +3625,71fe8a5978107825253029e32c11e4c0 +3626,a124af9bcc3d97503b4ce9e8d0ff6897 +3627,8d4e9bd40529558df9c00412d570eeb2 +3628,57d6b84f48de6af58929fa15662c4739 +3629,571df751cbe8bc56b9dc4df32ccf3b91 +3630,5c50af9a36328c892fa61c414b8b7832 +3631,d37d083129b5cb7025232b7f2b471d63 +3632,b0cf0b4a7ae9bb42a2ca4331c37f402d +3633,ef80fd97cb5c1c19060eb8ac1e957e15 +3634,202c48d6cf19ddbc14154ebfe8fbd210 +3635,79bec2d34f517eea552c802fa61564da +3636,e075d5eefd616145f1d526e979fbf330 +3637,d8c4e63f9b27b9a6e057799eb1967240 +3638,afbb8bebac74bd136546014cce759853 +3639,595dfe4c28af147e383309720f338347 +3640,4377f55f7780a159b09a7663726a326d +3641,44d41431227dc6b25c2e34af1e47df03 +3642,0465c760b9ea56cd434c8a8cc6a0c969 +3643,8dd27dbbb44a2854ef89b00e8d5fbbaa +3644,752c27e06933313780bc2130b741bc69 +3645,085f767f640317559ea4f72354fa41a5 +3646,b70143557f5e35f7b3ac4c41303306e6 +3647,bba962d0fdceaff5a8100f265160fbed +3648,d8ace07fce924696b3cded842cf39e39 +3649,a27974b6855b3558b2f485ccfb5de1ee +3650,43d36642b8e525933daca91d8c294dc8 +3651,68d7ab018163fd2fe6d3bb095dfa475e +3652,ab5bc7589cc164f84dea05cf339941ff +3653,b5cec223269d2e8fb250bb9890de4b35 +3654,95a0193a99e0ae77ba89f03958a408dd +3655,4a0869760957ffed93327814522192c3 +3656,e77d251e5bff8944fb2913371408669d +3657,468db5ceb40300fa1d98b55bd2a6009a +3658,c7b9741fb4a0d578bb468ee01594b8be +3659,d36e2c4844b01c6d9a4e1bd5049218d6 +3660,c24afda088bacdcc7762433710ffcc91 +3661,c0cdc6c1c02686c6cf7bbb0841e26646 +3662,f6f3d19383db54d245286ef1f3ab57cc +3663,a95361c4b97817f6a8325b0632412797 +3664,229bc8ecc7d3f58457d02260cd563724 +3665,0e7c4cf0cc60954433fe4f03a60f3ab7 +3666,666e61be1f012e70167c17e1dab487dc +3667,93a71ffb09f0d6082db90968dc136624 +3668,5d0de05a0ae028794bba1015f49593ae +3669,1f4066984b188705bf10d14f422d9b25 +3670,86f6964f6842f8b0e39731849ae5cf3c +3671,4a6997b0c01cd3461c1df4a5dabce2d1 +3672,460748a3154cced5d803e79c4338b7b3 +3673,87714cd4467613024d18e52db7ccbeb3 +3674,acf003ed8f27ca125c743012e42176d6 +3675,f01d662155a362e537dcb85aa1028547 +3676,6eee64431bf1fcec81c1940c477f49ca +3677,c6a4c39ff9b3b3723bc25c3d06e9dc5d +3678,2fce65b5a24f1a6b0b3f0beb48f23069 +3679,356361628056c99dede11863d4c94f2b +3680,02782f5b726a90e4426966d4492860c9 +3681,a34aaf82f23c32ed6611fa84cde833f6 +3682,0c28ea30276650d914d6614afff0e735 +3683,aa54274c7407f836759c4da3bd1360a5 +3684,abb2baaa3f9f4f4c3f7e4407167737b9 +3685,b3cd089ddefeec79d8a21dea944a312e +3686,739a3745fac5963f8fd1f9d4caf9ab4c +3687,8c5b301af66628dedac4d101b903acfb +3688,680ec977abe8c85cf97094513429be1c +3689,720ea0c92532427f1f150a2bdab05318 +3690,adbcb78f7680b3ce92aaa6f5db11a4f4 +3691,9170902b622c8cfd5ac7ec5e5dbff229 +3692,097214490698a8890715be5746d9eac9 +3693,d36585840fbbf303a437bcf5770d1086 +3694,2ceeb9ecb00f0128b36aab4accfd1c17 +3695,a173b94a0f45b44d65af18ca49838234 +3696,1c996aa7827deadb9bc3e4c1595217d7 +3697,6edb169f31c0e13aac6d9c0122a33d89 +3698,23e29dfad667fe589b2fcc81d74acf8e +3699,9546cfc74785571a2e3def89d82da120 +3700,7a327e08fc4474c5129f302d2d2f7cad +3701,e01953f5e60a318be84715be877b4885 +3702,a40b18f81f6b5531c916d2a9fe5f65f9 +3703,0cb38f3db57b23ab120d360c10fd8dba +3704,898ab152ce39cf9a29b73155de3fb5fe +3705,058bfb0684270d3fca5eeaff6024d8b1 +3706,88d0376368d4f69fc6f68cab1117d70d +3707,e64e197bf3e8c039e76b1e6d09d4eb9f +3708,dccc4c283e11cdd8e82d9da741794b9e +3709,ddfe53e0b3c48cf837da45cdd101c5e3 +3710,78de405a3c85efb01aed5783d4fc2879 +3711,2b670dc2b25c17b4b196ec4185de6812 +3712,537cac33bb73e0df4bcf4c4b4d6a602c +3713,33bc0b31f50d1ca2c2fca3d5052d4e3f +3714,97ecf38f3bf8f1ce55232ecd6e476dd6 +3715,ce32f1bd131899f14508aa986408f3dc +3716,6ab654d88a7a87a700868fb364d653f8 +3717,e228abfd53d2c813eb9bc5a2a9ed5b9e +3718,fffb56d8dc33c845abffb091691f2ba2 +3719,7087c98bbf9bf1a0fd9953c549d5b1f3 +3720,2b553b2d2b6ca40e1c758896c88a6f38 +3721,534e64a853133bb55f744333c84ecb0d +3722,edd6a194e46ccb4ec38c9fd20a6bd344 +3723,fc503fde2c41ff675eff45f1c5b239f1 +3724,0c4831943c981078d4439bc2efa99c69 +3725,50b1e8a1d04cd8913197bdd36b5bf7e4 +3726,94dea9259b45b0154f8e805d750d7c44 +3727,0f3874474e7d06cc24c09269f67f56eb +3728,e6b8f8822885811d99c375e1e6ca2384 +3729,8c2b7c7c946365c928eda79472ef03e2 +3730,6ec0327ec988c7820e77f9bbcfe22270 +3731,531bace50906b71358ad808a11081586 +3732,ab2754e64d644545aab90597de58e8dc +3733,7b5836f2f3668a5bd1f1fdd9b6c37252 +3734,84d737eb1eed3dab8b38abc0173a5532 +3735,8bab6dd2483e235c0283a998d3ccf292 +3736,98ae4a429d90722dc3fbce9e203f3027 +3737,d3cf8f9d5d2bc1f3d93c5efee22314a2 +3738,92c1bf338417244264366c27c0c12519 +3739,ce6980e2023b093d17781a274ccb6bf4 +3740,b4f38c9e370627a5750fe1be5c128150 +3741,9d1907a754754886335446e326e95c56 +3742,053e6d54a9c18781dd853e0c0e22a0dc +3743,0d0e55f61dc3189bc6cc706dcd7f91ee +3744,4c861addc00b008928b421471b681405 +3745,8c7c358e56b63cd0b8fa8abdb80f1479 +3746,42e026080e2aea5132e68b24c04f97c0 +3747,26677ab4fc3c9b469ee3822617a1151e +3748,558038df908e413ca00a32652c7f84b9 +3749,fed207b91bca7035e8b64ffc2d244d58 +3750,4e4bc374ca5d824c81ec68ddbf3cbed2 +3751,f9de877b58679471f7a0399b699366cf +3752,a8d6fd4c314ab91788b0871c6b324bc9 +3753,01d44abfd3e63e8c22ab1890d8761e9b +3754,6f9684d51d476d955800227d7f43928a +3755,078a1863828f6bb663619d227a7cb526 +3756,b3c4fffbe499149cbf003bbb380b9be2 +3757,511b61b9c442911ccede34af3685b47d +3758,890a3e902e38b918863f9ba61f7c642d +3759,26945e2fea9025eb7bb39d50b89dceb4 +3760,14800b17e2eab2e29f8622a960133939 +3761,c3a658ea05f16d5acde5131f4ecebae4 +3762,e80ae3073944f4e1a34602a6ec9696e7 +3763,8b53cd1fa0ce2e6017a46071b4bfa21d +3764,1cfe5e8593719839dadc646f192ca294 +3765,61863d70c99f383e7b16615e4d6805cc +3766,9820ba57dcd5a05873d33e12ddef5c35 +3767,7230fc2b0188cd2d696e86b8cd388a6a +3768,57e0b368d52c9f797d32d84ddb751454 +3769,9ec4a1c27e34afd921ef8b9a053d4a94 +3770,62d5b34c062b320597e3e837b6abac66 +3771,f5883a6a3de911603b80d8231c6db32b +3772,35acd071119f678ff26cc3d9c9c60c04 +3773,505ae94cc6212327c8727031b74fdf1b +3774,a4b01a6d4770dfa971d8328ece0333e9 +3775,e859043a3e6d92ee688f1d7ff47b341e +3776,be984c4bf0cbb2fae14a1e88024d6acc +3777,835fbacaad8e74c74dc0e048c5605faf +3778,1aa85c4c9bd80c049b6029d3d265cf30 +3779,87f0aba339e9c269b1c560520b18964c +3780,d890d546eac8de241771ee78388f8e60 +3781,5244772758162704d5f99cfe246bf840 +3782,5512f3f27f066280944ec6d137a92659 +3783,231aec23250190bc50905d8764e648ae +3784,b85f552aa5e27762e534127f6c5fa486 +3785,d80f44185a514d77c1de38ec3a7ea3f3 +3786,17c999457a85c7b8420767acff00cb69 +3787,c5b8ddd6c79bf5065f2c9ca6e5315fb2 +3788,0724a73b61122fe9e2b7821bdb1464c2 +3789,75256c7f4b5365d50ff337950eb0de59 +3790,f10a3e2c0d62a6e12b1ad2ee1d502561 +3791,bf7e2811c2443a3e43ba7409e2d4d455 +3792,a5ed67ae2b1de9ea50943ff6f7620b57 +3793,9a6c09389185f0aeaf28789508add966 +3794,c7d8b6bfe3af5858d41d523051eea272 +3795,d44ded03182d2e60fd3227a05377f951 +3796,97a631c9a0c44758ce1781289949289c +3797,e69d2d7acf54e99b877920ad79876a3c +3798,887861e7083d255ce408fe9d2550b01c +3799,acb9d7a50ae668b4a56831a9bb4e0bae +3800,d7419ec8abb9a3a7dfa7689814903e5c +3801,ba9efc9d2a15386cd2e6160711469b2d +3802,1824f2b3d685e78b64505ad79d175f41 +3803,dea5b0c207fa7317016c6d7466f96ce1 +3804,364562f783c461028ce21036b04b8694 +3805,6176c315c5f1898a61200c6b2e719531 +3806,560ef0bf4d9707492292f2cbfc21dae3 +3807,92a99caf68d95f6e4d698afa8b18e837 +3808,7cbebe9dbee7e4380241031b807ca64c +3809,6994859bd0a9ec09eac7251122a54269 +3810,9606292c5aee68d1bbff756ca6151a6a +3811,fd5a0b70d20bfe8b2bd0e26b2c311d83 +3812,33f739363bb057fb1647d9ee18b908c4 +3813,3adff4f594413d95791e16bca49e27bd +3814,d8c896d91a5fb62a0dd43e43b027972e +3815,2b4972e29d57e30ca083ef555d609329 +3816,600ccdafa1e1e486257b3f66bae96627 +3817,ad82177f044de36c775966da50496bac +3818,bfea9c23e8ea79fba3e630463e2d98f2 +3819,db954c7d8fe81de49f1d7266ad7cd04e +3820,7633a042693c9033253a3f52d65d73a2 +3821,873e309d4fb047cb240ebb501070ca06 +3822,b3cd05602652086287d694d4dcdb487c +3823,8bacf924bf37efeaad53bad3375e703b +3824,fb29adf5807d002b1e6c4f5e924be65a +3825,af20441a4c7f37ff8fa36a7074cd5b33 +3826,9021254e6ec5d06ca63ac48cad5f639b +3827,97b8a95d6bda6fdf2d97c3f902133b85 +3828,488b10fa1788ec6fde7903ac3947e5ce +3829,51ec52dcda3d64c460a988bfc42c01a7 +3830,283d05343e357a262add1f9c533dadc3 +3831,12867dbbf90a86f98a2cf075cf5faddb +3832,8e74e2e2c059a26142c1bfc0f9e9abe8 +3833,b886dce41b94488bc8a4774e9781b598 +3834,816ac01ce5f4a92621d5c00f9c386d75 +3835,bff7ef51d49352295fa0dac507e87221 +3836,ecd36c779c25f4a2b4dca46a99174659 +3837,6cfa9cc4f4ad616373c2a96b4322bc19 +3838,4dfe7bcb13a68dde24dc1f23ae64120d +3839,9833c5ec9ed34abb75f00a226b548b49 +3840,14e1d3fa65d23b58a1b97280ef26aca3 +3841,f81ba6af9be6d60ee0c387746d362642 +3842,eab7972c4e2d6ae45a429ed378201ea4 +3843,1425f0a90619789d4546c074b5e0be5b +3844,62c3514cac48e2ab846dd727bec9a524 +3845,99b8d2a8d371f3c03e7bcd344668ec5c +3846,86dbe2c893dab388a225a18f3e999ecf +3847,83ab583a237b15404417ca3c50221f40 +3848,f54239e1093faf7af1323793f484a678 +3849,faf2ed6d1665f09ac920dad58181252c +3850,3a5604a916ed0a7daf0d502b24eae634 +3851,4223bd89e66b39444980a3c6cc5ab6fe +3852,8c3ea6fd08284c445d190f3793e84f11 +3853,e58b61301993d376c3870747156b3112 +3854,676cbda49b7bbd7175a0d501826e8978 +3855,36517c170b17afcb154051d782950631 +3856,659578cd2b54b826441090eb6926df35 +3857,66a9e920b0fdc1169541cf922f5ef464 +3858,6884a3ab61921612f94ecd0cc5e33fee +3859,0b3b717204519d43da934b6ba95b43bd +3860,ae83c77ec646ad72b1b834142ef6b1d9 +3861,4c232e889ef2645a2835655660de53ae +3862,b12b0ccc1c082b54732625bb906ce80c +3863,cddb08683a1514d38116808853f413b8 +3864,a1325fca3645278fb16468a2cbfbcc9f +3865,c3713a0462826d421df22e951cac992e +3866,7d1cdc44b184e439e8e58371abcd5126 +3867,41c99147266bd5c26cef1f8ecd7fc7f2 +3868,765cfdd73bb3f98049e6117f2e084338 +3869,6648cc030517a20b98a5d1197125dabb +3870,f00b7de35a4a5a70b2505208c575b022 +3871,2d8caad0872126d7e257139a1b56a501 +3872,6627dc01b5bf559812a67e9b0eabab6b +3873,e61e9aae6afe6df522b78801f48ee0ef +3874,21545a7df134fe5c1bb5331b21fd7a0f +3875,524b7182fcfac4db85cc69e4bd49dc7c +3876,c1a30e279b4badd94ac0c89e99a2d6e6 +3877,33365a3e2ddadf685f52777e5c872e8a +3878,df64dc16b4610728a28642448fb5c013 +3879,68af3ed6315d5bfbb7abc78cfc7404ac +3880,7c57253394b39618b5b6b8428558b930 +3881,c7469350753e48715223b9f143483721 +3882,2a24d926376a14563076b497390e851d +3883,a51de23781d1147c20d1a3d82da7b8c0 +3884,acb23831462c2542c9f4423c4da03179 +3885,e0e8aa4ae3ef9603a829f29a6c8fea64 +3886,4e7ba16f862b606246310e81664ab895 +3887,db6f29cda2ea6bf4e58a1f019ddfdb12 +3888,9651b1971cae624ff2b90a082ff54383 +3889,5f9eb8755eab52600e82e0194b5f48ac +3890,ebdb51dc9b4647c0c315125c530101ac +3891,3a55e2575622962a29e4227bd4bdc8d1 +3892,8a5ea6cf5cad1d853cb300363419bc3d +3893,82fe5f3ccc0158545726ec847ece8f82 +3894,1eefe9a38b7d8c1aaf92f2aa9b355be3 +3895,12e13a1f9702c166a28658ee811dc15e +3896,e092a0e95f1dc6b46d6c5bcd73038ddc +3897,9726d5e9361d309420bfa6b0fdee1170 +3898,687e1f39a0065b0027bd480621a0019c +3899,7d15835bb725d4726a1d27e4f6494ae2 +3900,6dd4928b2cac9fe50c14414ab5bc8006 +3901,497c7648c3f6f3eae460cd3f205ee2bb +3902,8a5e84f91f6e285b08acd53704593963 +3903,66870635c651583cce3b774474d5ec4f +3904,929af630a6ee6834fe11133e5f1dd42b +3905,9dd869ec890be9b12811f54a8461f04d +3906,63b66344fce018ddcb06279ee2a3977c +3907,a8d3f9a34facc624efa0becb184c716c +3908,fe5bfb19e16541b8b7ddf912f5692e3d +3909,431182a8832e54bf0a8b93b1f78742f6 +3910,c7475b2ab9bbb042fe65614f7f6c9c71 +3911,f241362ce7e159698a4797d0ba77cb84 +3912,561fa6e176967766bdb459167abf1f56 +3913,27535394b43416bacf4cd61408f93e84 +3914,12414ca94671d7f084027eb44399781f +3915,6249a0434f2ac2a7a5481ba3d7dfb328 +3916,f9146ecaf234f8db4ffa307aef0a95ac +3917,55e77c9441123003a511ed3b52731257 +3918,8d434a0182d720c648441094ff94d542 +3919,34ce05d55af35b30ecccb401d9ffe358 +3920,a198a77ef387c9a41658499a412c242c +3921,1827bc35665b310f602c646c15f2661e +3922,c48c229d8a86f532e11eb412a0cf17b5 +3923,d90db5a0955f73b97f5fb0e732ee634e +3924,883221d59dedbb66c7cd2110f6970121 +3925,f321e3ba0bd044a816e1468c1f04aa9c +3926,25094a9a51f030621724281a3c9a58e9 +3927,e19a3c64738988e7a6e8b894e1874fe5 +3928,d46dfa08ae2a8630ca7c1437f5d662e7 +3929,807d08126b772645a9f03aa91478ffed +3930,649b1d0026f822a0aa86d6051e488638 +3931,724e013385de4413c942c6aed3debda6 +3932,df3c85db19fc26ddff7074f480911b02 +3933,0a84d5207d70a18f28de31c240a5d8aa +3934,e66739a04a32fd98d97280ca74eec414 +3935,2ff3b9602b9fa702e14551965c873911 +3936,20083a3cc8a1d4d971875f152f1cb39f +3937,fe68be11dff913af5d271ca9d77fdb41 +3938,98172e3e50b159b655744f881a93c7a5 +3939,2de620df7acc822a1891da08c916b885 +3940,f2e1d09583ee03c753cb0b527bc64df9 +3941,3a48742a549c8108e1637e69bd941608 +3942,2ce70b1de0655af72de3915740b1d5ce +3943,fadef0c400e337c414734086b3c782f0 +3944,fb2779d0631a752a50434589642c759a +3945,3d153c9b2ce8fd1c95e20469721688f4 +3946,d8bbd13e1c801d0cc09ea44cec8badbb +3947,9bf74ee3956fe81732921704c2f0272e +3948,f390e933bcef4060d1769b38c5e0ff50 +3949,b6b2935062898675d0b7879edfc8edb5 +3950,cf665603f870d1d1d64c7ca6a89d5a60 +3951,118717ef19f3c36e623a6afab4037adc +3952,e2297d829efef054a2c2ea7712e5b3f9 +3953,b957344ec22bf69ffcd35f0321256a4a +3954,769c3f71db7a5469bbf8e452defcfb6d +3955,f7c9d8dc5fa8ea7145bb9992321bbf8d +3956,61b90f7035c52831eec118b2329dba7f +3957,5dd3430b1f5621cfd036179a0cb1df76 +3958,fcd54f7ee84476bf305401e084936c8c +3959,6fa6ab013321c08d8c9d916e21385ffb +3960,0903426c3407054347f5bbfe95bc8d0b +3961,4b3bcf6dd2219e0a85a904028f12ef58 +3962,bad3e66d7c7828db785446bdbfc3b9e3 +3963,6c322355088226faff5f5a0dfb86a470 +3964,c53f45747ea497be70e7e4036852f65c +3965,99b08707469575917ab25fde761999b4 +3966,1879cafe3ef180673806cb23d4372bc5 +3967,b30978fc5ddfd89e8e62f4524d92495c +3968,21af0258638b8928b7e5756e43ac20c8 +3969,559d8c927325efe473156ac8fb139cc0 +3970,2840cb75a8515b84336e564318f1a403 +3971,a166ff46dee13e07493a04f5e1417417 +3972,88f69aa0f1722b083e94ed3267d41de0 +3973,1e7d33dc900cb35bdef77c7d5b78ef4b +3974,7ccf56931100cdebc69c3611c3b20746 +3975,fca00007cd29df99dc2f97bafdbb5070 +3976,69db92caccbaa2e7186d34fb47134f49 +3977,83b8c3bf39762b10f830471f8f2dc1d3 +3978,ca98c472f78f9cc4ea96834b054abd80 +3979,34e221a9d3d95f284f426eaa19bc85cf +3980,4bc9380581e5790d7bd3b3b69355987a +3981,62140d6aa75fa27412be4d1a98c4ae14 +3982,11557f514bfa34d95973fee84a4819c0 +3983,5421f93cd012d80e5d453dd35a36a483 +3984,d8439348de83934bd1484faf21430a3c +3985,a60182bfb41063f29b669d8145a1fbe3 +3986,16b4cf8786c1ae21df4e6ff0bf25a911 +3987,0cb4f19de5640fe2e6a951429dac2ab6 +3988,55ab50d0532eec405b261ee2234f658c +3989,12130bbfed3a8163eb71e916bc39c044 +3990,e5f2df9c61a774e82b97e0b9ded909e7 +3991,f53ae1a861e9880a88442dbfc1b07657 +3992,74610918cb8533462edf564c6b73fbe1 +3993,970f46e1923f79d20ef783aca1ccd513 +3994,be847d7a8c5f015396d823761b4771b1 +3995,f3575395beceb6ad393fc52093f23608 +3996,2d1e6bdc83c4a6b534eed40ecd89e33e +3997,e3ae7e5a56516ecd386f0e191680dc6e +3998,d88007ab23031c87116b810ed8bcf71b +3999,0fb0558ffffad8e4c85b18aacc9eba3d +4000,94066c1cf969b0b4ef83c63e8c87ad3c +4001,b6f58113afe585368a09af6b9c9ba4b1 +4002,19a7067fd48912a298eadcb64d709b96 +4003,e1ac5c01841eff78da4d3d322d0225df +4004,f8cb0b21ec98585fc3e34e4aec06b251 +4005,9831ad9a1ebe3269ab6da0d0fd988e88 +4006,b1c5a19b86e4d49b239900e95d872a5c +4007,5caecae11eafc52c68c6d2290d072a2c +4008,3a1d5f4b793857b95f8c29d8d75a6a76 +4009,baf4519970edaebd210026f763b24c39 +4010,a2316b9662d2ea3833df3b4382cbde66 +4011,eef46234ca55193934497078582ed946 +4012,374122fac33058bb8c9675db6d2f81e4 +4013,4e9e8c95b41b934d872ae5f60147cb0d +4014,f1bdcee3e5311bad5cbb4137cf2fa2b6 +4015,facd66366087ad81a52ff89e03c82297 +4016,64627529274adb8b8113a4678dbe732c +4017,4ee6e1fb7539eb9127c17a7491709770 +4018,2dbcd4999b9501deddb1c2738751e31b +4019,4797361c9f62111fdd612f32ee6f1a92 +4020,2276e50d48587733b6d7e269c99c3685 +4021,f2ea1747b298e9b6eb9b3f246a66d9fe +4022,6a47903def884a129ffe38ef95047475 +4023,873884d7b4b984d964b19a7c4a46a10f +4024,7a0cabdf1ab824a8e3f3bde5ce96b2e3 +4025,876a7f771c8971aac26c595ab8079ced +4026,03a12ae95cbd4e828790313f4c1df63e +4027,3abf8a567d7b2a16a6477506fb26e570 +4028,c64f74363d20bbb7e4c084dfacd88c83 +4029,95478b468058a0e1877fb042bb6f2884 +4030,9e09d3e0d4daae27f4c779604ea67527 +4031,0de17c9b411b96b20be015bd8cdcce5d +4032,493f9384bfe3becf0a345f518c21dd2f +4033,6c71974bf467d6ef485008c98554be8c +4034,2222835ec2ffdef61e39a911da9bf232 +4035,88f13e813e4325fae48ca9dbc86bc1c7 +4036,d851dd5d455a46c6a96f1647478b6672 +4037,f91fa65039e352ea8170646360dd5ecc +4038,d87292d91c755dd37b6c1498026a9997 +4039,d63f343c9366865d51db179c91705b38 +4040,e1321be50f5c74e51560f1a29cdea204 +4041,cbfa58b0b9512c3d7db1ba7f33a39dc8 +4042,34fb516a76656a58a9bcf1b60ac6599d +4043,607ba9ff7987d862a21d7b2fe4c8e609 +4044,b9b6302dbbf40708d46990d23ab85568 +4045,26e20786f6b6dc33257a1e31fcc2ee20 +4046,e4c8712d4630e7fbbe7933b2f22ae461 +4047,b182606ce2aaaefee621f40b7b7bbbf4 +4048,c919286729709d3365d0c298d119d768 +4049,da4aa928fd69842c9486780715ec5475 +4050,0bb48a15b5dc56ef1672c127945220e0 +4051,cc3229396e319b8e8b07d67c52118b01 +4052,db8c84bbbfa91ab4c88ccc547355bb3f +4053,3e7a7a63f17a593baded24d5cdace938 +4054,85f5ee458c1be8777cd69a6b024d0c2c +4055,adc3e3e025e82c62dc40625c017ba828 +4056,991736fdf8e18406ecd5c4a0d655708c +4057,89fd3ad00e8f3777b4e88605f3aeadcb +4058,a68bfb69ca35fc6a326e6a41fc4b589d +4059,e6f96726aa6e36037a4056c13491f0ae +4060,3c463257a669bcf42df08e3236188fcd +4061,a49f7943d326b75a594d4d16a2730697 +4062,64cce6f01d83e78313137856e33d6726 +4063,3bad89f7c2e7c9dba57bd9f87f14f09b +4064,b20ea0b44b48eb9f76652f35f0b87966 +4065,aae1ac508cdaa849f18d91ca192726af +4066,113bf1be26747493de26422ed54d48a0 +4067,011b7e794e416483a7d2fdb7b40424b6 +4068,6550780f9b70dc027773fc181e5c1e66 +4069,e440f3eff85e001f0f69c0a4b00bce9c +4070,7acfec34d01e1649a4051c6d9d5bf98a +4071,5b41377c2aa24ee2ec1e4a4a1d8ed6b6 +4072,e8ecdab23a3af7daae01ff2c2afcb17b +4073,7c09eb864b2a6ff8ab1553cc15d384fb +4074,1b4b271fad9be031a83cdc1a30eae687 +4075,a14d21ccc85fe86ef2f8b31a2b8304e1 +4076,b9878bdf976dcf48684733004f0e1870 +4077,04fe956daf20bcbce96be756c5c96287 +4078,2c9a0b6caac5957582d01d0de133055c +4079,b4bb0671eb91ebaca815ed6fafd6d0d3 +4080,3209d01253c689bdc273b92e686a7f5a +4081,3521856bd690421db265c2dc6e25ee33 +4082,99903d8c2be3c41c735e72b5afdad1c1 +4083,46812265164ea1c6fd7fd4ab02f1c772 +4084,e21c438d72c2ac26ab57e6d19c8ae378 +4085,7b6a51f52c4d268a278b08c1dd43a8b3 +4086,c36441aa62e4ec76fba6216e6da1057d +4087,a27ca9c87fe3f445908d6d86634e691b +4088,a3bcd2334571eec0ca082ee22a83eb7a +4089,e658bf587159693e1f6ae21a7f0b83f0 +4090,1fe1f0d85b2618e5e58178aeec02533f +4091,8d2007bb48f052160d9b89e99fcaa417 +4092,bb373430e9eeba5b4fddea9d3a51c5e4 +4093,d7a384525c93673268881fd90e1ef2a4 +4094,851f8e62754d6b0c3d2ac44ce26a5434 +4095,cb5e2b94c18864b6da440c157b08d277 +4096,4cfa81b8134fe81c7841f956ed8faefc +4097,6f9b9ca6b93490d19752f783bb0ea480 +4098,1e061b562a2ea9c425b0c77e5510f96b +4099,95d932eb1e565c40c23808ff30372505 +4100,a994ad3561a42a040a19fe556b844036 +4101,c446609a8e1876841b7319a3403978ba +4102,5a2810c7770c8f54a21c938e437af4de +4103,fdc8bf4557524ca18a6dd473c2b3f35e +4104,7cff36476d44b3abf73b2d29cdae9109 +4105,5d6640f0d507b9db084f827e9be749e8 +4106,f7eb84e9a5ed7a94ecb3faf98452caca +4107,6a9901f43d81246b3701e20c5a775415 +4108,c6bdd9c0f23893e7e5e0c14087d9875a +4109,f0363c6dea75cc2707bb498abe33b360 +4110,2663caaec7267031ac27f6ea7f223140 +4111,7d58276c269f7255fb8663854f03332b +4112,1087839eb408ff3fcb55841c50952add +4113,87bcce58e104251cf52c120d4ce53dd0 +4114,7938a6721eeff42e9bb1a9b6ec69c474 +4115,2b2430e0c4f929bc24df92b1b395a161 +4116,c907e8a19dbdfe195ff95073dfd1cc5e +4117,5a427c5c22203929b4d02fb34c4ac1eb +4118,9a562b92ef45a5eef801eb5a96edd441 +4119,c5e6fffdf49913877f11a5bf785e49eb +4120,2e3a106ad3f8284d4e0f54014bf4db16 +4121,908734470c7f48735fe883a60a302ee3 +4122,3610425de00ee881ba0c8d185a51b55e +4123,5e8e85f1deb84675c0f8be6bcd5ef6b8 +4124,fce861660172f76c95632a9eb0115c5b +4125,4e48ade9cfeff7f14e6a567cb18657cd +4126,b8ead534fe4788ce1f0ee899973b4574 +4127,7bb9f849d08e21be2dc3f1c085952e79 +4128,e2e2282cadc177ebfb23f216efc5f330 +4129,e143611208952ec003a61438d5b923fa +4130,826523418ee65280ac9de4d8384b1f35 +4131,dc81a21eb37a5b73615b6302b5116b03 +4132,19745f3f5a1221dcd56ea2c2f801119b +4133,d5e46c3159b100d75fa642fc8000523e +4134,2783097296c95abcd3fa9ab188c21f76 +4135,24376d7cde9cd7f2e132fe11c041ba8d +4136,161fc7bb02f8c8413eddbce42f0588d5 +4137,141d42127a8a73d27dc8dc9031c69e90 +4138,8ff5e7be4caf7eefd1fd9321bbb2b6c8 +4139,de7b4a16a93fda08a4b5c9aa281a24ba +4140,f163f79bd98d74ac7a83d21fed44a646 +4141,47c0ee4d3be4eced10d84b9134c696e8 +4142,a9445a2f6a6333db5cea9252fdd97da1 +4143,7caaac613646f6a54708b4abb1bb79ad +4144,983cf4c104b21ab467ecec75d69e2be0 +4145,c2a6cb73b3c8e8cfe87ffd41c1747adf +4146,71523dad97366d05b7aefea7feabd667 +4147,127351437052389ee9b37b8b7f22d437 +4148,4571f4bbfaa85d0dd0a445348d10e305 +4149,991d1fcd4deee82011b5dc24183050b1 +4150,24ccd94161cdabdef847977b5d4122bc +4151,1f1b5c5f57cf6db110c5c70f3907790f +4152,9663d239370694f968065ba51c9f8efc +4153,b79e81d8e02300cd5cc46425cec4687f +4154,c05363e39656b432aa2542a6077b3e3d +4155,6a9a8ab2c795bdd00f158940311450b1 +4156,0aa5ddb1bf67a770383a73ac3d2cf244 +4157,542dc073b40ca660a6ec41c37a7bc749 +4158,2f42c6138f4aa8d8e83459b6d410ac0e +4159,5f6bb28330a388e5e4f8c93c180898c4 +4160,bc9fe3ce4751175039b8174e1ff2ea93 +4161,453a3753d045c808a1b98791cf910c23 +4162,8faf9c0ecefd040c43651df6ca0f81f7 +4163,ae29aab0e5f5712fa9b24474462e3732 +4164,0c6a94cdf8900ccfdceede68a393084c +4165,5bd6495783831dbf1521a627b0096e6a +4166,1620bc2dc2737b0b278bab6bf8ee9c23 +4167,9c3aa571ecc5f905e9fb28e65d28a601 +4168,bf718814a5a90ac325b6eee14d651e95 +4169,d163a231a25f56a4d7c2a34460d9e2c7 +4170,dff1a8f63151404f1a9dea83d2f315ca +4171,d866018d2390ff8e3ed8ed03bbb83760 +4172,81a97bbb25228970a692b3112864d20e +4173,593b85a7101f4134f43e91f63d24a61a +4174,7e50208b992c7b3b650d0beb345998a5 +4175,1578ea764d11b08b9e6159205ae3800e +4176,912898ec7fd463e09fcf02e4c2d9ee09 +4177,06f95c8ce23c52ddb84f0f23a860762e +4178,89a5eddfe1a39becf991795d02a80d27 +4179,4419542175694062b27b618d67ad62d1 +4180,16e2086876733eaf385c304d6a4b38d3 +4181,155db7579533157f02e1c3ecf64bd3a0 +4182,869b58fabd80d5181736b33ae8ae01b8 +4183,7a5d3a213d86f0f8c618d6c6cd11b057 +4184,d62be2c4f46bbd91cd1d3d05b1a26109 +4185,d25c87edfd57191c2f7eaebedc49f31e +4186,f517be14004aa40120a1e03fa4564419 +4187,41703fc012cc3cfadca3b99eb140a473 +4188,aae583d585cb173a190c16a3c7c0dffb +4189,dd1689faaa8d08c5bf839e3790eb124b +4190,67e48cb617b7982969308de96e062154 +4191,136ee7658a67e87a21537c8793d72ff3 +4192,82e299e8b667c4c889234e97cc0d9875 +4193,77c92d4f1b6260ad66c2d04a7e06dfc6 +4194,345e616de9e5dc66c6847bd24cbe776c +4195,b0fffd26b26220714912ea3185b5e513 +4196,af41a6fe86d252cb0fc6e192196d679a +4197,9cf3dc61cf48b310f6f576e0f583fa7b +4198,8afed5bf4216b9e47f02f3f542a947fc +4199,d0384b504b80c2203bec84e55d423cda +4200,67b9d55e0ed4ea3b6425bcfe531a6792 +4201,9356ed71fafa484772d1c06cf6ff2207 +4202,eca047c1135323c1e40be10a51565259 +4203,311da53ae6f6c05bd395814ae49a818b +4204,afaad2c1c89fdf8221e7fa641aba9615 +4205,07c5748cd4ebfcfcec59b2e1b4174521 +4206,66b1b8f206f2b5e640763d24133b0f1e +4207,d8669b56ed90f314198e0bd994368b6d +4208,9fd14ad772e9d0d0bd2bdceb25f4b27f +4209,eb00d9109e4d19c146324c6f226092c1 +4210,8b097b4501b7eb4e4ad48f868910cf2d +4211,6a1acac0fabbbcfd18c1cc34e4f093ba +4212,f5a5ba897a7afb67f0deae0c629807e0 +4213,afb541d799dfc92362bfbaa8d331d6f4 +4214,c4ae275848b81e2045293e21edcb972b +4215,04cf17bb21659335c836fbed0c4134c8 +4216,4955d9a540753ddd803af8b9dff0d955 +4217,945ac969e010f2b8dd17c0c6b0d9f262 +4218,999e9f3e35257bd3bdde070cea9c42fc +4219,02e9ef6e62fab88401b9805c7eb4f65c +4220,8866d92f3aca157467e086790f394f27 +4221,843b5e7575ea0c5362d378e1e377b11a +4222,15029b0a9e024074aedd1f1efb965520 +4223,d6bab7e10171596df83cc1199fbff558 +4224,37759192cd578967fc28ba0d87c75b8c +4225,2d917e2976ac1400dca01c2672c707d1 +4226,466fe55741427cdafa3f65c78b15154d +4227,68f6e99578c509c1e62fcdcaaab4c04b +4228,6a307a723d257ba4b77acfc2f20f2fc4 +4229,ab52480bf45a917840907e904271bc68 +4230,cb58a74d700e21bb21a80e4789a547b5 +4231,0cf52ca2808eb104d6755748ae08cdc2 +4232,b80d4b690b0db8af5612928cdb7d85d1 +4233,e008ac5d28c7a7accdd6d9b135e74197 +4234,81e4d6f5babb92bae7001efcc07cbf79 +4235,c274dfba09bbffb7dc21b584484f96e9 +4236,bb54bf9ea039a5df158378d08be1068e +4237,476b7b1f1922ae3bf71d8cc7bcf0f73d +4238,05cc7834f312f58e2a14f9fd713171b9 +4239,27cbcff1eff42dd4d7ed02d3e4899a8e +4240,7667b82d2164c3fd8db3714d8dac3f27 +4241,e71b00e8e6c979bba51ccb9fb263c614 +4242,9994e4a02a444d91b4732a2648d950b6 +4243,04179f4434dc1e81140cf32e352bbc1c +4244,d97da905b38fc32b5170fc734ea1a3cf +4245,e72d677a74617feeb5ade8e7cffc0674 +4246,381c55e2c64293c8bd770a1d1fe42827 +4247,a786c3cd3454bc135a115e3e895c69d0 +4248,1375557d932810795599cdd1e3088aaa +4249,6877c402c51aa04e0656add8a511b717 +4250,e333d0ba02decba243a1e74a01d96f47 +4251,001806c5ba363db2a9f13ce3bbc7d23d +4252,db1b975d38c39b00300605972413a046 +4253,edbd003085ab7777ed233a9519ccec95 +4254,8ea419212c7e15d3a608be0edb048c35 +4255,d7579b1fb428a58a7eca41ea6820dc70 +4256,c8f66979d69e1e581607fb25fd2042e0 +4257,86006868f639e50a3358524789c0a91c +4258,1499a7b89ec62f4ee0209df9f1fe6a5d +4259,5cb7eb225782046677cd0b58b5cad16b +4260,03b2c06c23fe9d0a5225b9af32315295 +4261,f1c06a96e422c67984dd79e44eabdf1a +4262,9ae89e7d32db96866151ff074af283ab +4263,23634518628cef8bedca47b8bfb12235 +4264,769e2e303994e8e5d5796c91ddd57f9e +4265,e75fc809abd4755fe55dc13178b799bd +4266,cc5687a998b39241d74c7c198b36b83d +4267,61eff7cceba03dd02828cf74e2c42281 +4268,fce7742bfe0d83528514ec172bf78192 +4269,5acf760786b1c65e06a3c4916147458d +4270,b9c7576e0339eb5ba59bc2d380a01a20 +4271,e4cf83cebe67846ed9f8d8c34fb6d35d +4272,a7a927fb279f9bcefee654099ff505ee +4273,9647fe37463a4d49d52171dbb925ed7e +4274,6332d32886bcb884f369ab76a2f52358 +4275,5100d5cd52112345225de1aa415f8d34 +4276,441a0ee743b883d65d8d629b8fd20800 +4277,16e62a6a49f3a8f0ce8068e5c70dca80 +4278,15914eda2c316c34c1614a651d53ad3c +4279,eb7a046e09fd2f2db77e02a0094ea004 +4280,b513e9cff48cfaf1ec609e4f4d8d637f +4281,fc5567b9301d2aeeb998e2d5500f606b +4282,94193cbcbb48c9ef8cafd4a71732d89f +4283,ff5da7ad3a121cb759a95c5f64dadf10 +4284,041d3900705cd9b37cca59495e9b8259 +4285,b9432b2728e1d6823f8594c8312593d4 +4286,f7dcf8f93066f293d177fd8b538e96cd +4287,ecfb0e4d859c1c56fdf60566a1576794 +4288,d7896dd30785b81dbb1bfdd5c84c5f04 +4289,ccccd9239e1e11a2f74b8a61c4496291 +4290,4e224d90063f64388d8887207993359e +4291,601499f875b9e1af9176bdc79a67e02e +4292,b3015d7ce2cb21d805fb20b7bc391a4e +4293,58aca052e8682b5ceb1ac61b78b17ecd +4294,8319469e5d57bc8a207aec282c6b9eb9 +4295,52ce2f3574d091653d7420fa4d736b61 +4296,434f981d881cf509d7c8140ee57b5093 +4297,b96fcfc7597b9a1868796434f5d63a5a +4298,3bd87f37e08e4a98e0e0ae64e762b0d5 +4299,43f05f63d177f0685933d066eb8672f8 +4300,44786abba6d572a2a73bb77454d72df5 +4301,f29032455b26aab98d7001b9b5a132d3 +4302,557282fb08e87e1f4d9e49decf3cdec1 +4303,38edb9b4a05e7ec5e6c055b654c00162 +4304,a54ba76808eaa2bcff48ecc76135f27c +4305,accef71b2b40a40a594ad1b1569fb35e +4306,9ba918fc11592ab089a4d2eef2b99900 +4307,c2e4024db2611f6b6ba7bed4d4230f00 +4308,9b6d6aabf144b4133c60942f21f26f0f +4309,5f6136eadce0fdac00e0e89ed0132828 +4310,25cdc44cec56e458d5f0c60ddab48898 +4311,9f444162125278a5b5dfe4319a9ef054 +4312,dd3b4ca4b639d3f2370aabcdc8ec7110 +4313,ff56a1ed946715b7daaf5c295edd52e9 +4314,0611051a4c5cd435bb76f85c40a36e16 +4315,dd76150031a737ff7fceba4683d202bc +4316,fba848d50121b05fa24acc2d4dc96879 +4317,39b6a4cb3712965261354ba2bb7301d6 +4318,c8719c580ad41ebd3d19cc2d8a971ef7 +4319,63d587649565ddd046b217cfd363b51c +4320,0f1a3baf2996a7e7dd4ea7f7f9804091 +4321,a431b8f33fb7138d4d1f392ef506754c +4322,01e20105b5e4597c0d61b9a9be0b6416 +4323,fc4ed0a2adb8e61c5e620c4e214511ac +4324,b0d93222d6c3882eed95546c55026f94 +4325,0cead715ee2aac720c8106feec93ddb6 +4326,c5859b36fa32284425117d561438fd9f +4327,fe804e1ae0a3f6c901acba0c0eef07cb +4328,87934ee09b33deb495286c55b52b1f29 +4329,0c64ca8c8cb87edad2fef48d80323d01 +4330,a62ce353ad706075794aaccf2a7737c1 +4331,9fcf771a9798d064b2a0dbe28b5394e0 +4332,7029d70924c93765cc4dfc13e3293300 +4333,f5f86278cb3d30c62a14698304bcec9e +4334,7b949b81c81d8af11b556c14e0ba1239 +4335,955447aadb5fc865ec16bd5006096d22 +4336,ad6f4e196ab4e0facf0dabe69bda8001 +4337,6838e43d16f0f0f4c82c79d0fa24309d +4338,0483adfc9e65056c6ca3a083db538234 +4339,3c199916b39a924b7b284054fbaf4a67 +4340,4e94ff798eac016161bc022cbf82e331 +4341,bfd39e36fe39851474e423275f2249f3 +4342,6c0f1e1f493f7a7a603bad819813f5de +4343,91898177dedf8137d0c3b29d0cc78ab0 +4344,49b2b25adba4afaa1cf6c559286c3ff1 +4345,daec5abf03f9d3ad9fd8ab0d36ea94f0 +4346,310965fc15e71b16b487b112f8c9a464 +4347,93703ce2dfc08e43f239a91ea45b83c5 +4348,f5aec51a41ef3fbcf89487da8b0cb7a0 +4349,8bb621847aa3a5ed460dd22058d06572 +4350,0241c743e24a7ef07238a403c4cd9a5a +4351,5fe65dc37bc8ed9382fd4fa802da8d68 +4352,84e9f92d3f2c674e0fbdf4a616687cd9 +4353,5718150f10bfadffa019690e32ff0f9b +4354,f5b7155117dca0884ca73d587a32acab +4355,7451b31b4430ae520b27273ad2005561 +4356,f0fa2f4eef004af6038a856c4ee7ce03 +4357,2b9968a3b6c2ab52e93354a755067296 +4358,bd5ed58e8a56bb726abf7943cc4b3006 +4359,6440ca010e2b8a423ed7e1e372765d3a +4360,e0ac53e2f52871e8ffa4fefac5bc4d5b +4361,8b133de0c4f540222745ba1c8a15f679 +4362,44a4c58fab8ea0331029b15cb51c6c6b +4363,f3a41e48152c8762705b4a9b1c39906e +4364,8c2ca9e3c58046c972d9df186e39ab10 +4365,0cc6ee1af81eb63c675616e2fda7864c +4366,12b16c3a79f9d61479826ff07c7e6123 +4367,a8a6294ab30a9a8ff6b6917112e2c46a +4368,699dcab4108c51093b74c8c1cf962dab +4369,71a4f1360c63a6052c57bbb0f6318204 +4370,9ed3d9cdf975a683aa229060e384c197 +4371,f74190eeffd2e2541d1020761a54aa86 +4372,ea0812ad473fe2596d7c97dbee9c656e +4373,abc24870430063acd678fa7cd03ef739 +4374,526da7cead9ea1d3edf25df9f4e826f6 +4375,9a65a40a83ed35ee1649eadee5131e1a +4376,d174c1081dfdf032d94afac2b18e5c31 +4377,37995187056012bbd4baa4cfe6e767bb +4378,5f93e9a248638646e01c0409a9222203 +4379,527536ef9fafda880e7da1b726342a27 +4380,3deca43112c07eb77223c33aa0b6ef60 +4381,2b677b0b6eb6b7068c74574f764fa486 +4382,3df4769b3f12cf4d3be7a8e2b58015a7 +4383,c85eb235b0f96feafc015ef779ae6488 +4384,5da58d71905ffb26a719c41a8f8314c4 +4385,0c5a3d9d32ccc8e41732749bfff76a90 +4386,3e3c837c7646155cc97c0686f75979d2 +4387,5778fc6786edd9d9bd88909cb7932f0d +4388,4bb4f72684ecb509b1bd4857a1ca6f20 +4389,8879ddc17bcc198e462fd86b58ed203c +4390,8c9fba4a9381ea2b2716262119a7e174 +4391,db0a14ddc37f2d35006f6be2dcaacf5d +4392,decb9ff0a738caff383029f46eda73c5 +4393,ad2f8a99c43c54b99b32d1253db7c750 +4394,a4bbaddc16f4426504f93875843c70fc +4395,497843db13d5fdd598145befa0d90c9c +4396,ee33c0e8d996d90d198582a98301b394 +4397,a98e1c3df378275cbacb7a99f7bb5374 +4398,6213afc0ee01e7c3b975efa5fd1da2c2 +4399,ab2b4022aa600a6c82615262066de6ff +4400,6bd6c54657342092076a8ed4908404b2 +4401,e228e518b84197b57f47a963790529c1 +4402,b6889809a76c4b03160b59b5d08c9f8b +4403,04afa7c8ea16f3ae3f37be15b9d74a64 +4404,6c9d611204b46b2ccd3a2e41fc7bedc1 +4405,e2c712a59690c1f6cc2029143e960d19 +4406,e7c5fc02a62179b84b4859366cea4160 +4407,1609af629b3aecccc8514e8b78bf013f +4408,0782b2714d6f8e49bf8e55adf382e8e5 +4409,761cd00f783600d9ff397a56d1e99525 +4410,ff28f309e84a37a8bc4c29b44a799186 +4411,262dd215475b88ea11926f06e2760ec7 +4412,cef77832779d9099084ea138d1e6ad33 +4413,ea1d88d2a350bc3fd8dcbd591a0aea71 +4414,f7841154f7547b0f1b2aef0c6830ca81 +4415,25c23cfe071eb04ff884725bb9b627a1 +4416,3595bc86f92712a569e345ae82b61b5b +4417,999a3b5d7652cdd485898832b59fad9c +4418,d5619692d612ee38ef835e57ab6675c7 +4419,55db76fd906b5e6899ac0494e54f174a +4420,67d7fe346f12db415c52b2346510197b +4421,681156ed29e0408221fb310009d8605c +4422,1fa3db45e18477a5ddd37da880157789 +4423,84394e3b56cf9d2f3a94c4fb442b7c41 +4424,d32c37a61ea08b67376826fcfa133c10 +4425,970e62c9ceb9c25171cddc4a792954f0 +4426,5e618a265d32736219bfdf218f7062a6 +4427,56c01f910695c71075228242a6bf06f9 +4428,a01ca0e8c7b04361f973bc724eef6db4 +4429,e8e9deae85f39f9605784c48fbb9a38a +4430,c2e2a714226837a6b401639b6da61b01 +4431,e4aed9fc81b9fd6b05bbe114d6f99bf1 +4432,7ea4d0a23c63e92222d3f6b89b4e0ecf +4433,d1ec86d4b94007a6d04d8b829b13027a +4434,44718a7d351935f3113e6214e113fe92 +4435,2ae1bbe4b57697da320876ca67eb6e33 +4436,3a3214c6e5fc5408e0eab61e43943875 +4437,9b1651eb37774cb349c5f1e17c5daba0 +4438,46b11243e5689bdf25952cb3d8a22a98 +4439,30b9f8e6863de719cb3ae23661b39e31 +4440,19e68023dadeee9d612e0e798ccbfbe5 +4441,599a7bfbfdf03ae2459852b04eade418 +4442,65ac8c9116ef480d05c7d96f00803287 +4443,ee22cc6b66e550ca7a7ed8c60ae16b09 +4444,5c629976b921b3327a00156d4d6e4970 +4445,3deb5f8ef1432a6022c93544c35a8aeb +4446,2e17d98c00739b60e5ad4f0e651b981a +4447,cd648baeb4c9a8048b66c01768f31f55 +4448,3d52361a6a160d693d96abcde20d304d +4449,98f630bbf027e3a750ccea621317312c +4450,1e6e48022900b5d659e9a0d75a24c997 +4451,a8432997682170db339f98e442e813cb +4452,6ea1c354603760042367636350066eb7 +4453,dd9254d6820a704b50751d3ac7096e9e +4454,43e11ddbc1bf12f653456f1cb42a331d +4455,b50aa8b49f9be3cb74253bc6e797a273 +4456,422c54846a16f52d74db826df98f5e58 +4457,6d86899579ce9d153013955ea4c5d491 +4458,6cc237e34b1cdeac0d1e787f13e4ea1f +4459,f64ca374458d456ea3c5a748fc883cbd +4460,e6f93b3cad561f700d0aaa47e2142430 +4461,bfab7a168877c61d08c38b5ee70f37d4 +4462,20bb7d5b7d6d9408e8b2b8880922e87d +4463,ea894aa37f1f77f5b365c783e9c9d72f +4464,82fe71037b84b84929c6e950722c7f78 +4465,80db31f082b4f381a86a3d60be829b68 +4466,3530db9382e2ba06fd59a9325f1a33ca +4467,8e8b2596168cb21e5f24b171efd29ac9 +4468,dc2d6a22ec06d02037cf3e99a102fb38 +4469,bed9d2e369bc16e1fd59e03c5ca6b42e +4470,45d7938e3d73d11cdf1b959eb03ccdc2 +4471,8211edcdf8f6466ef7f48d041819ac6d +4472,ea43034aeb64455d016508e853b6ac7b +4473,da90e87d64eb9ae3d8065ad2b8dce74a +4474,828bfd85968566ddd8f7211797c7daef +4475,07afb72428907d99864a80220458adb3 +4476,a59ebb3e07d0b07521ebd231e3b723b6 +4477,f8d0b292906c55cc261d43f0f89de5e8 +4478,a2e752a5da3c2b19a8cc90f2490964f3 +4479,cfbc6fe331e2e174058ed31ae128dafb +4480,f2c4e678018fab0070943352dd10d5d7 +4481,49537a7eb004a36f0d2407a1f29b43ba +4482,ac7c5a3deb1ed53637be7409bd696e32 +4483,ec482d0992953ee5ee93df06e84b5561 +4484,da92b0ebbe142ccdc1fe7b3c37564647 +4485,064f2aefbfe2f48bd14dc0eba90cf594 +4486,e4fcd54b89d62db26a5a3413a873e465 +4487,9e0efc43f02dc055c31903c2c093afdf +4488,ee04b0eb8d6d6b531f68898202f38b71 +4489,1d08fbfb43f5d9df07c1a4a5d213e683 +4490,ad5637ae04a79e95c30faa92fa3ebdae +4491,b3326731e5c879c328e337cdd334462e +4492,1c963ce9b0fe004a639dc596c3b29755 +4493,50e1e54f9686cb7d316348f2afb70215 +4494,f5a6051e755b73bf4ca650eb8e164c24 +4495,926b1a697b2b45d52bd2f88096c7208e +4496,f0eaaa5632ca1f206afcca5ad4704391 +4497,cb0b5eafa0bc367c61d1f503f4f180c0 +4498,e36849ea4939f20fa5f20d0cca75c0f4 +4499,3dd8501ca9a03d65d884a4b16ded6458 +4500,013ba26c1f4b8a0dc8f9a2e790f55a20 +4501,702c7678ba05251360183c3f5949fcba +4502,ea3d8ff799cab3e57484382588df7a6c +4503,da49a774c0d931138d3a5d3f55510f72 +4504,bf0bebb4bfde33180b5374927333468b +4505,aae9fb47a3a121e0b11239b81bcd7621 +4506,3c0f4432dbfb2814c33a7b62fbee48e3 +4507,cc0e8a65258493ef284833f0d8328658 +4508,153f5aa84a06179cefc31ddd011398cb +4509,6f5b726ec00b4b7e3f6780108ba99b7e +4510,dd7d9008e6c2359031d87d66227df0b8 +4511,632d435a30abb5c6db97a86913e51155 +4512,40316b05f9330fbc7fb652c02e2a23ca +4513,a8263263711bae55de9c9324522c430a +4514,a5926aa99bebb945670d2b28f62c3c60 +4515,22856b68c18dfa177ef562049a93f886 +4516,70cce1a7f060d3e3a2490fc7a27808b0 +4517,fd93eb294a4d843ea4214b7f0617381b +4518,a06da896db6c192143d87a0d444c2e99 +4519,d22c2b00b609b0aa0bfe6b58ef5fe16c +4520,5ac348a018b13d30702e5b2086d98129 +4521,154866ac882bba345f850902ead92c33 +4522,be0d042a99d3aa716ff60b40d3b2e946 +4523,4ae78025ce9d5cfb4d33d63af1c5878e +4524,5139a28142587a0e32cecba4b8a6059a +4525,ab46f7a7b5663df7e96d220b58d659c4 +4526,9e8b3985a0c4267aca4c0d56741ba185 +4527,511cbeedf32a31e0b41434ea8913fb9a +4528,5f8b6d109f7dbe65981779a62dd9660b +4529,2f8b5ec230e79b7024bb0cdcc79331d5 +4530,4861edfbb3e1791eba2e45c1bacb9c0c +4531,a7347e4d266f1a125146072842bf1b16 +4532,65a82840116835c1700a49a3a2959640 +4533,41fa44f6d3c1100dddba3d547027ea19 +4534,e54d08616e113ab51c4abe18d1def7d8 +4535,185f68b9840fe3deb01f6cc525b8d24f +4536,3f3d9e18c4dc7516fa5508ecfe4f9a8a +4537,99afd3bc1d816b5d14b8ae9418eeaa49 +4538,a92ce1533a74bc6e12dbc8dda4ca4d4b +4539,4676ec8a037a410620986da2cf6948d2 +4540,a65661a29436ec87479ff063340ad532 +4541,df2f37c13d9d9459479b5be0fd1f8545 +4542,b6feaa07d3a345a769ba6aeb76ff8693 +4543,8a7634c5bddf9a2ba8102e00ae0d64eb +4544,5868e3842f377fb6801e2a3df8ffd037 +4545,409050a7eb375912217b3ee9a55619a6 +4546,d8ac02571b643c8a86671355ed9a7b27 +4547,711c22121578e72b059825aa0ad6cb22 +4548,493bf27f2402fa1bf1362992c085b3b1 +4549,359f3e66bbd51b8206bd35007fbda2e7 +4550,a04bfd695ffeba87b11a010e3ef73f27 +4551,e31b26ee00046d9f73e1bc1c76261f89 +4552,75c87576a92f8c359b015c7bb76567b7 +4553,6f448831abe716cebae41eb10048afc3 +4554,dc24219200210e96f8dd9a25072cd140 +4555,73004d77caf23a1eea0ca86cce801a62 +4556,fb2fe4ec5a7e9cf2c60f31b18acd032b +4557,42d82a63ce60a179f2e232a3d15fd2b0 +4558,025a99cf9d9f6c54c440aa69ce897f59 +4559,0bb12aae326c9ef8bd597ef09828e790 +4560,06e069a252fc4b1a05215809ba1cf2ea +4561,b7df9d4ba727ecd2e9dc98c4019dbf53 +4562,42a0ad14bb06ef3455a31ac14ca9e055 +4563,cd7df1708a6921156e6433a7a18fe82a +4564,b6e1cf5fb152b33839fdf6280e861406 +4565,e51a333bff6f5b1a5582005f35c1b38e +4566,2ca968fd4b943ff7ff313b6286ab7186 +4567,e9a2e12697ea0c1bf24feb560e4d18ee +4568,6b5927563527e61a84145c91fa2adc04 +4569,39a42a56c5d850694af2835ae1737760 +4570,37cc72ddd62faee1d346a14bfb7a0484 +4571,d99e54ed134eec0a0e1f4d541d24ffc7 +4572,11ba2ae6a30b54048b635f67a956dcec +4573,a0d1672a96afb02aa448cd75e7b93539 +4574,164de616c421206c19832ddf5a13ad05 +4575,423b1ba2cca288dbf76a4bdeb9360d21 +4576,5df9d0972f283b9443122cfeb16eee9f +4577,44cbbf13ca8cfaf191c53ebe23602b8b +4578,d5bbd5cb36c393b70ce84f610c8b669a +4579,de6717a27b5626ca9a5c5cd649201f40 +4580,ee5afaf87a23fad9f9091d672fc2c064 +4581,e9cf65e65b19e2b8e84a491eeb6b973c +4582,c8acd34b81b42ea8cf8121814b65ee1a +4583,8e953b3fc135f93273215fe32ec117b1 +4584,dc0eb6d28acbd20ad6014c2f9f09efcb +4585,2100a3eefe03715d293defb5644c14a1 +4586,212c1d07fc2f64442aa9b69ade482b37 +4587,923dc58464b63bfe55b063038876c536 +4588,0e8ebcf1fd823057612442995cf8b6ba +4589,8de2d9fd377e0b4f7db8401ae16b1b30 +4590,ff4042e3f02e89034525f3d57c6117d6 +4591,32fb005831f8d3fa592ce53fa84a790e +4592,8358e37d9425a6b7b69e99a0d76cf8c5 +4593,12c643a2a1cb38c7b61b4edd0d45efec +4594,8d78293771190165870ad0b308221491 +4595,873f43fcde2e0ad881eaf4cc0ff1750c +4596,2676822f168e145cb369f3759994fcb2 +4597,b42b313806bd07fe9873f4dcf89d4d61 +4598,179c23a2ad5f4093bf0c0b18d49fff87 +4599,0c92368f87f606a6886bc85b12a4f0f6 +4600,d01742396bd4a7f0d2e96a3fcbbec76b +4601,f8140d4e5b0958e0cd18a3d4d0919a82 +4602,68edd4a3e22b6335a1c8ebb4cf56df97 +4603,0096632040a8d4a2185bfebe818cec41 +4604,91e4b2738e798f96f4b5b58fbaea66d2 +4605,0f4a6f88d1c1ef78bf55c8f7b0d67afc +4606,ccb0c45671a64fb3a705ffb0df68be2b +4607,eefccf29ae080b97de6498bcc03e0b43 +4608,e487da4de1a2a7185c3d8d2cc3b3954a +4609,10708ea76042c22931e15cdd67d92e10 +4610,18e1c6d195b48eb9c3d0ca39ea9a5d49 +4611,5d3384420917fe7bf1754b2f82ecac0b +4612,d5eced6809087e5ffaa1c0a3d3c1a6bf +4613,01aa080b05dbbaebf727ff7ee0d2232f +4614,6ba02b0b2c5de0e52bfe6b68c3a7c69a +4615,7ba29f2f8007b6b16a05fdd31601c420 +4616,04c9603b6c8df3d3f5420184d6285be0 +4617,628c03c7aa6edda757d113437f77f91a +4618,d113f788b61285896afeb8431865ebfa +4619,786effaeffb87d046b018dffdeb4f6a0 +4620,6f589f71659fe439f81a384ab6ebaf38 +4621,004b659dc11f5caf9326cea4f8056d2b +4622,dfd43c5fa38344a3a5c3bf00ed681bf1 +4623,2eb4015fd95c71761b3acb06590a61ac +4624,8848814939e2f9ec4b20424bc54c238a +4625,5341004e6fa4bc4b405a03b1a0221c7d +4626,ff982bae22e31bb1b9c1e91fcd75e438 +4627,b308ea309b840daef8afef6e2454e86b +4628,e0ba506dddff59b5d76e584ca51f808f +4629,e98b6b0702f7ac9ec15311abe7106e92 +4630,c33c8045d19f0bcf1345640fa9ce2326 +4631,9e7e39e32a7868d81a74542622b91943 +4632,e4dbb2e7735a7bcd0b6f74416a140f12 +4633,5a4cbe826efab71602b7824b1b23b91c +4634,57339fabc7cdd868a2d9493bf80e2e90 +4635,fac4f9795dd1d151d7fcb8e65f1e08e3 +4636,4ac4ff31779da17b14b0c69aec8273ee +4637,75590b21dadc5e5f5a9cadb0431993a5 +4638,11356d256c33ae9a10524a63641fbb2a +4639,017b5d49f07aa7a3def37a1b3d9e7be3 +4640,8d6da0b913f81a43db23cd99a880b108 +4641,1b0c4b0e7e24fa772daccb932335daea +4642,6a36148a3ec7914f4f1c0a5be4eb7516 +4643,ff9fe7cbf985890e8a5752ab009f2b34 +4644,a83a202fd7e41f14f256c5b39c206006 +4645,e23918da7756a5d2cc5e569a47342daf +4646,c39a29c9480b7fb20501520e1b2e8f03 +4647,a149798819e22bd50b142d7a8cb93031 +4648,38861162e69bb5282ad4c1064ae70dc9 +4649,8a26c4d56bb0af45ef7d81561bcd803c +4650,7a09d99f63a30b4ad4ec8db7d03fa8ba +4651,5f1ce4a08e41383ea337c6bdffa0d928 +4652,261583336582872dc40a40e231177d5c +4653,6b3e454da98c50a2abd0008b60f8e60a +4654,65644503f47f247126128e20bb4f82ab +4655,291952bf2542b0c57d81b2f43a441250 +4656,b9ae8299ddc172cf81b40791b858f0f1 +4657,4ba6cd6ae0d5c35b103b182fae48b2d9 +4658,614f74657c98e83182d75e2640b76dbb +4659,78f8f149512321c51e78b634e917eba4 +4660,72973147d89b0424fc111c234631e8b7 +4661,712b802dc0b7479a0ae711d7c7c9eedb +4662,36f8f3a2ff2942ee38da3e72f9b91f38 +4663,f1d0e38990bfde0a6f8d1598c5757a88 +4664,23df479b92795b1201bbacf46ec6906f +4665,756362e94927f95ca84ba889c03d8eb9 +4666,b74582bef62bc412d0fd5d8271a4d822 +4667,fb29c96599b0f877eec279a2c8ffe336 +4668,014b54d42af5c66eff026696697093f2 +4669,344ad054c0c957995d5539370d38a3dc +4670,f96dde1036a0f536ee75202b256ad37c +4671,387cbf1a059df7e5b971ee7c8c1fbbee +4672,4e6b50831e553d958bba228ea7ed8d50 +4673,a83b72bccd65e31439769d154620c612 +4674,6dc45e5b800f69ce7ca4fd9d87b87a27 +4675,bc0b0394636a6154873e523e1c945812 +4676,981c1e3e2a8a6cffdfeb8fd163aeb6dd +4677,a88f923eed2dba72742dbbf6b038e22d +4678,8e24c7d0a381f1dfad177749296fac1f +4679,cc1070fb86b0a0579650d11ce067892f +4680,5a473d1cccaa15bc643a16a7e41c97a7 +4681,17990ded4e1481b2ddc12e15d271e2b7 +4682,f316fcb1ca33addb5e5e6913cc27ff07 +4683,11a6e52478711fc0dd69856d11adb1a1 +4684,6908dd194916ebb618751904841da748 +4685,2fd066145713210c1697bb20dbf17102 +4686,ca3406703583c8b798a3e8cb1566ac20 +4687,221bd34f27e92aa0dbf8535546bc541b +4688,cfe5a97d14eefd5d55be5dfdd9801daa +4689,03740bb182ad4c6c9e68d59bea6f596b +4690,4e4b010bf21116693bfc21f44860526e +4691,09857581a566dc0112d9d49553503b2e +4692,9d3fc0140b6ff85c350642ca29c63e75 +4693,f0a78f4320b453f1c7503f51e2d1c92e +4694,8741691bc8da3987ebcc2f3cd66fa647 +4695,99019a0627db0c350fc82c58d24bae6b +4696,4bc8130bea4566746e8f04c182182df9 +4697,80ddd18d52b65cfc5d06bf1c5902bdc1 +4698,bcad021cdb95d9386108c2fe20865ff9 +4699,e33bc0c83e08224b6d7ac101f1882049 +4700,c3b304f7c99bedbf4ca560421ec3b435 +4701,8c222c06473097e5fcd55fda1a7a099b +4702,7f0b91573ba32d8ccec592dd160158cf +4703,02fdb80fcea294ecc2f34cd74c7ce52f +4704,bcc36c34f6bd72ad2a351caed3dae544 +4705,dce317d6e6d9339bf9f5d1760e6c2fcd +4706,5bf7523c1ed997e6d072089aea51b5af +4707,de7556a1ae9fd36789fd480d4d998cff +4708,7d792edbf8633d679583b0f811b9ca20 +4709,9b31f48ad913e5eb09537a43f54b947f +4710,7f3f1c77c9ef11ea31a03b4c5ed0b160 +4711,9989979f9c55e304d862d38486c0f9dc +4712,cb6f69fc1b35dd7ff336467319b9f419 +4713,9ef11fa95f416b628d78bcc87d29cb48 +4714,04ca7e11de58c287d4ab1906f73180fc +4715,427e7273f92709970f1e4edad363319e +4716,c2b5269e9c8af184d4bcd7a3aaddd659 +4717,fdb705ba148669b50644da2a188f00a5 +4718,7a2c8f3169b2f5112b16b202a41670c0 +4719,e1a3e2a1fbf45f128248d49f52d36137 +4720,65e0316dc574e10e6a6e098e48a974ab +4721,a1a22ce448ab1d75146494a4ad50cf3d +4722,e5b91d4107d74c5715d84282e6526379 +4723,f0a72d672577a0ef3499ce4bea31924e +4724,cbec80ffa2d6c550a425d60087eaaa7a +4725,79d8890e7101dc5b6970bd0d971dc060 +4726,4b80e80156dcde5a1c92d41c5ea04412 +4727,3b44b43a60cbdee6df15709ab5b91ff9 +4728,bc630d751f2debd645d6daee7a81a60b +4729,1f053f81f09d6ed63d0c3399dd0b5c4d +4730,660a9dcf02a9c234ade11dc1fa24076f +4731,6eb2bc18f467d9d4d27676a353060bc7 +4732,9502288013a3f366f18d46297b7ce146 +4733,7f643f01729b41c2e2a3b74933e46ea1 +4734,839090d41f9c77c5ec2a89b7667e8222 +4735,a91c232af2fa3af7f6a77d21152508d1 +4736,0cc133742e7bebcac63e7c3741e1468a +4737,075aa6160a2e890700186e516d29bd95 +4738,143c4c42b7a2563e2509512c0dd0bd5c +4739,8e40b665591eb0cc5166f9e9a3718186 +4740,80625793d060784e6af2f6b817c867da +4741,ac0e7f4ed4890a6b78875f88241f9da2 +4742,ae8a49878a1a76c95a9ff36c475adbd2 +4743,0cfecb63274f025dd43c4209094818f8 +4744,0edddbb58e41b550682266376ea31d4c +4745,98c55ceadc540ea44c83e72157cbee36 +4746,960c8806985db0ab7d8cec55d7592175 +4747,7668a0c205a622c939c2419e06d0e0c8 +4748,4fb0d3a9e0f174eda1729ce57317dc4a +4749,8fa91d3a5a1137b3cad23d213d862c04 +4750,c534c0ff8d46cca3b2f5a52876831331 +4751,bed303138c13c3791a775add2122ccb2 +4752,6dfa60a80a3e7e36a5b518fd3cbb0b5b +4753,9e3da6ba8e52afbd5dece07fd9129472 +4754,3df36315fd97cdd9c344b143fb978704 +4755,bbdf6d69672d58e1f6bf3c93cb4152ba +4756,aeb1345acbfa6d19a610400105e4162b +4757,4a7a1e27c10e0645265746c04c3e650b +4758,90a4b7d19be98efe7b17f5f95f26bace +4759,cbcd37433e1c4ebbf5947b4dc1a4243b +4760,7edf61c44022dbb9c26d7e66e6e2fbe6 +4761,3df7151159133fcafa8556266867f9b0 +4762,e4e603c8c120de617f2c6edc63416775 +4763,d8fb40f44847ec3861b081198cc44ee2 +4764,ddeacb4e7e05d153802c1397019b70f7 +4765,de2ab0153dea2f2770446d47eb92b873 +4766,5b6c5639286acb9a44378e785230bc36 +4767,780f8902cfd6d54f2b47a3b1f4b85a13 +4768,8d1ef5c981c5db99f8316582db45ed6e +4769,e0d52486891dd522dd1d1782626bb54b +4770,7edf28ceb60d1c2d552896935eebf8af +4771,f517cd6cf80fa2115b5ed88649608109 +4772,2f5f62cfd5fa071bee39ec7eae9af0e6 +4773,c217df5ba2cd34ba6c999bbd34e84aa4 +4774,664d5124c93ebc3b4394c94a1538a22e +4775,3f3014f62a3b113e1a42c57904336fcf +4776,080cd20c4bcd2fe33832191b8dd41e7d +4777,8484626329f8479a6855cb67414c84fe +4778,7b1554ae2c9170745029d90b8c8944cc +4779,f043b1efcc06829c8edc726845c236f0 +4780,49c10b30bad6268d70f425aec7515bc5 +4781,13fd847c1d40c23832d64d24e09d56b3 +4782,20a966001ebf5c68359ed5482bc403b7 +4783,7eae4477e2cf470358ed2fee0e66db66 +4784,9ea5323bf313ed84dac8e55658a6f347 +4785,f836ae5b8573dcaffb41c0bbd739617f +4786,8e96f17d9bc9a3829ee868eefb3db1e1 +4787,4c1f45791a0337d6a7fd05d7d67e8fff +4788,ef8ffbd0a129a29aa00c225c0c26c10f +4789,78f92408f4e2894f628eba87217bce8a +4790,f28e017f66d4105d4b013543c407c8c1 +4791,4657e3755ca842b0b140f1bc8ba2b093 +4792,1459c7ca239651f477a2ec9f6adebe9e +4793,2f4831202e839150606a48355f676908 +4794,d7d546c4b2522688fbba0030ae0be5e0 +4795,aab8001a8437d237c8c63f85b99cfa6e +4796,bba13fbad7baa91a2b7aaf01facd3bee +4797,a66c5859b097b050ebba813c91fbcbcd +4798,0698e8a06fc61af4b3b3adffd834cd45 +4799,aece024aec5eee465b33f70d0643e5bd +4800,24cb45a78377a358151cc1223b1a63d3 +4801,ccbd4e0776761e36cb944e0bf33a3c68 +4802,2deff0b41797005c38b00ed80b661410 +4803,43c81e7a46052b4aa8455119e6efc9d4 +4804,87436fc752008971b6dd49ee61888ee3 +4805,208de9aed3ab17bbd3afcd3fe624d474 +4806,41b20e61400e8227a6b8c94f9b1c5fbb +4807,81a74c190e8c9edb9f2539c838a18152 +4808,3704641d3b3ad21232ecd454bca769f6 +4809,cbfbaa166d7ef26c2f73d5ac19f74ba7 +4810,b8ce4b14b79617d8aabbb555853e89d6 +4811,cd30a19fc82c2d6f820477b870f34d84 +4812,8db1c6a928bd19099e617aa423363ba5 +4813,c4e1c2e79740f6047e6dd7aba546cf7b +4814,e04cb82019df659f61ebd447ff227264 +4815,9e44e3ab7a4701f4b12324709a09d34a +4816,4083c3c18f45e92858a62158f9ccee37 +4817,736ec1d8c5e3467697035be9e3917f76 +4818,ad56c562ed686f49c9529e605e401ec5 +4819,6cb26b2e49df8330f2d9793aa9c65682 +4820,27af4c72b02cb1a671200c6c0a3cd0b2 +4821,20f803193506333484440bdf8492adb7 +4822,f4e5ea8ed2eef82217fdf972cdfe8d40 +4823,c316be03ec823f7abfe4fda8e5c39386 +4824,c1f8d9c74b245411353a8f3bc9cac3fe +4825,ab4f33720c479c0cd2d73a494c0955a8 +4826,e10412abe22961fd3dbb062c1ecc4ca4 +4827,bb8c8b9585ece322789de29220726901 +4828,1598d41f42d244964181b0fe346f2bd4 +4829,ac5423bb156e222d8fb1108376919db5 +4830,5cfca1593f3b0abc0e3c378790ec93a2 +4831,0d0aee7f68ce81c69d7700b9031acdfa +4832,70d663f78e3d544d5dd081401b1799a8 +4833,30bff13dcacd056417a8bc2a04ac0af5 +4834,e28076627f60e0e080163ae7e708352d +4835,ccc4f5f90d3d585d71e91c6f4ed1bd09 +4836,a284971f7ec7942306dab2b16cdb98f8 +4837,e290ec03f5de07ebc171cb1264860cbb +4838,caa0fcb56ee23650a8a5b08d2e96298f +4839,7f2893cd2126973eb356f80eded40e50 +4840,9e9767dbdc35317dc4bedabe4f28a9a4 +4841,6b14bc10e3f1751f8f7a926140a8a069 +4842,8c288d1626fc41e0165ffd1562020b9d +4843,db8256ae486a7b6fc9d18910180da8db +4844,0f24ed202f4dd0de510b26a0c0c65fac +4845,9cdba1a2629bb529aa467336ce7f0596 +4846,58dc3d5663a5efc431d9ff1503d2c5cb +4847,2b39a5deb3aa209c216e9bead598bcb6 +4848,f0e7b3e664e43dd06bdb248a8006f99c +4849,662ca7b9e92b6006cc118dee351ed6ae +4850,5e778a4d95ba7b7d024d3b17e41a6923 +4851,3ad92c9221c557134a4a679ae6b4a5d6 +4852,d348fdd79f061ff4c1f3cee47df1f917 +4853,d40d376198becf056dc9b5555c276b84 +4854,fd3ebec2ee32d5ab84aa25fcd4eeeacc +4855,1dca8ff2e056e1fc7b0b5d2574a6c6df +4856,84f1409e8a1479644df94d4d53d3ba17 +4857,11fd50fe1e3951a27a88fb691b5ede8a +4858,8d7bdd5a257b02f6efa234cd78fb7703 +4859,20e6d40f00e2671fbde6d0ce58316c51 +4860,ea019ec84833a9db518bc433181d223d +4861,eacb80e082c231eae17da52ab8698335 +4862,9e16beb83ef1643e32fe3795643a17ef +4863,dc03f6d0035ef7ee234b9e188d6a4002 +4864,d9e3678c6b9a9c33cae91fd682c37158 +4865,819bc30e6a23c5957d3d06b181b95ba7 +4866,6722fe9b64297a7803501e778c67a9f1 +4867,46ff196b15bad2df8d8d7f8adb1ae874 +4868,df7c665abc485b34dbd3099abb708a01 +4869,fb6229d86a1cc96faf3e2d5d27751758 +4870,0c8a49d7022474383133e1fac5c747f0 +4871,aa23c0ea522cc99f37164ba3c90bc5c9 +4872,b15404c5e3c88fea74c756536b420ff6 +4873,6fb2fd763e72e691ccbd5d35eb96e5d1 +4874,0504bbd2fab39be1e041561a51dc5ca0 +4875,7a29ccc39f338047b50d15143bca4256 +4876,1fb4c5428ee146f73d92113e513432ec +4877,185cbedcbf379da087459df27b2ef5ab +4878,7f7548911a001dc4c4254c9d0411d3a6 +4879,40f7654f53aa83c14675569b16be983b +4880,4df431f8651e4e42089a94926504c057 +4881,8b08792a129411e5bb1ae808d0784d8b +4882,f7fcfafc691404db03172547f9256ff4 +4883,4e9f02c9eaee891f3c4adf69a848bdef +4884,54431154300b40e67ad90470f279029c +4885,c75776c39b54578ce158ef419a947698 +4886,b3ad296d042cc5232d9affe974d5225d +4887,4e89f5b0f3914201c4d28889bb8f961a +4888,6c375c51d5b57cc48023d801d068cc2c +4889,815d4e2a9c08f7417349f9266ec8ce67 +4890,633eac2d4441e0e48e3eb796e039ea4a +4891,26461203f68e1f3881ee7c2a1d2bf0b2 +4892,a48a82b6432b8085f377fced60ca2c1a +4893,06ee9ddbd1b0e9bc1381ab8cf0089bf7 +4894,d8a8668cb017239bc7ae1c166842e9ca +4895,6fc817672b02b200fc950afce519d287 +4896,c54bef9c157b9f1e51ff8e661b0ed29c +4897,2855b6ec57532e640764824c6301365f +4898,a371920ddf51e5b719144e599dcdf5bc +4899,045d31a8129386b2659757b46071e4d7 +4900,16033f51777e59c9c62fc55ce25f1d16 +4901,4b5b6f33802fc9a59de0d58cf378e684 +4902,ff650a78627425211c72d5e7ef40bcf7 +4903,e458fffd6c62eb5a5fc34784485218bf +4904,c3d8246e473f33273b4a5953eae35437 +4905,abac7fd0a350cc0187dbd8a1ba7aa9e5 +4906,1ced35824c53cec93739bb87537a5254 +4907,2b349386aec7b4daa2dc4979ab9d6ecf +4908,1d5b79f60a8012bd8d54e4e0270ea16a +4909,64f68ffe841be9652e270558c3347b16 +4910,4406c2f90edc47583e807962bff772db +4911,e07f4cd8e1a3bcdc1aeb36654a5b8312 +4912,5802e65ac591ee6c7499bd7e5f21c869 +4913,4af7bf87ec03fc0348ac29901b7c364a +4914,6bd65be2bff7281887f5f920dde76f61 +4915,2fca4d9f04ac4775f824c273d2a0fe5b +4916,ee65d4926df93423a3c5d2f12f5ced72 +4917,518fa89c299923caa8597900c6a2f95b +4918,12f694b34cfbcaeaf76198f3810b8e7f +4919,6a4be0c89c4dc3450d0b5099cd0790ba +4920,19f613c0f8281197e9548a3ecb9335ea +4921,3c0ab2fcb7019d485c3164ed8374763c +4922,0155a5232b16f8b31fd5a5a8903adbfb +4923,ac9cad08c3cb75995bee4df939fcf57a +4924,d9bfd0b31f1bff0f521c360df1820ac8 +4925,88323f4299cd2ac35ca01b8d5cc9fed3 +4926,0e959aec8f9f0afdbec595b2761279be +4927,f43128ad15eb6584ca6b6434382d44d0 +4928,e3ad5db1109f73dbd6fe073d5159c598 +4929,d44a1217884a6a04063f344851349d00 +4930,519df2504dba95001d7a7b013551ff0e +4931,57fc0e6ef536bd435734eae0a943d8ec +4932,f1993d0af82055c2e969e5155d2f6cda +4933,cb39885a65bfa5d63d5c3448f823cef4 +4934,216204ab9f7ced8089900e8c92c0441b +4935,272d7b2b9fb283bca4061f6c1476be9a +4936,39a91e43a38d4bd5d20955912c73f9bb +4937,d41e7fe2b981ee78aba3a28a7e795e64 +4938,92e5e44a5df448ba99360c735efc8bd1 +4939,704eeaab3ca291ab2e15db021de42b40 +4940,6f717b97649f84c69b979d48c496d28a +4941,66abf3b8245753508164b1bfc2c6c00a +4942,3c47967c503fcc6ba870ff4fb23b6db4 +4943,2e29b38bac026c0f80b7dae2de3bfb1b +4944,d6fdf1761e568513da0b190d570dedbb +4945,3ba4858911993cf76f9475ffb12c9a0f +4946,67cacb8ec4713391d246a1831513460e +4947,13a3878bdb730cc6d72280788be5fe22 +4948,ee862589d0bc655d048178bbc5482a55 +4949,7f08d11a424a4cc9bed3f82d79e92c54 +4950,48c618b832654056238fcb21af76be43 +4951,203257545153cd481c2bbd5363a2916a +4952,eaabde7562502012992c5e4ab3b8faf4 +4953,c22337d6d4d38ba86a9648d643f42d47 +4954,3135f3bc2dc8387f1e281dcc961bb533 +4955,cbc2b7c36740a3c95d4bfdfafc588ca6 +4956,ee9f78787fc4425e63008a3ade22f995 +4957,b1a058a03675c46fa920d7bfc847e380 +4958,458a71a63beadfa7f0e696f13ff7a8c3 +4959,5b83605073d8c662732614d75b14a6f0 +4960,16111bc7c550e5da5fc7195e50abfa20 +4961,429aa1c9e35f672596087609b1ae49c2 +4962,2db562bfaa66a8ff1dfddb80628d7c4f +4963,798de0a210090d7dd26b5811e0215f57 +4964,c63f90b2498405752757cf9e994d0a4d +4965,d9c42b93bc4cdd725c8559c518d5214e +4966,15010bd80529b7e6b37d3b3c4598df65 +4967,455748833040bd47828e295b0cb95352 +4968,71025e8af9febc244de0397d13b8ddba +4969,069586f11cb18152d2daf435b2ffa566 +4970,753e061ff8ecc30ef85fe600d907ec42 +4971,ed34737540879fb7b8eeeffe02e74cbb +4972,b459abcd1819773bc5976034f7d6dc6d +4973,b66dde149cf382927832134349f2182d +4974,7132b103d332adc3adb67fb363a276dc +4975,c9c8d1e82e53700aaf4f90a86d92d5ab +4976,69d5d5ff2fe0c92f439c5f7e6fad8099 +4977,92ed57c038ffaabf3a4e45bfa633ed72 +4978,61b6b0ee1a6683b43792e29a38489ed7 +4979,1366fdd7165638c9fc6576c254a72242 +4980,ab6a8e4c0267b59ab19b1ad04d277a97 +4981,2723fd3cd59bb938bf196ef78128e939 +4982,ccff0303b0f4a02fb618080bb0be1151 +4983,83386ef41e6cdef4f1f8aabf83af471d +4984,217e2a214622a1e7d9ce4fc8b8425c3a +4985,d175a9b0e27f174e5957d453a9a29690 +4986,61dc2dd7739ed23d7b4800f0020a637b +4987,79210e94e03978a4d1b39139b804fa55 +4988,e446f7be4f6e5b75c38b72f95676e939 +4989,94e8fd725d4d704b1ea588b351cc2aa0 +4990,11367c166985b47ba8e2b9833953aa89 +4991,ac9e6006230538bc4d02f3b9ae204998 +4992,7ab829e9bac34956d96c493e8ff5bec1 +4993,81aed722a0efb678c4addd10eb8b224b +4994,8dd0f88e9eb696a7685abca463c2e466 +4995,7dd32d8468d750f641aa571f450838f5 +4996,d3fe916c054d71ca74d51af1c9aa5254 +4997,3df2256c27b711d35405d09bb224a171 +4998,6b2dd2f1cca9ceb87b244b1e24297e46 +4999,5040f6f87993e1db78d6732c7c5982c7 +5000,738a85f1e9f6b57e69509210ac9f8394 +5001,5c745cde54d4b34bf3f74e4f9a010722 +5002,dc64593a1780253e6183decd53ad9384 +5003,ef39d5b39278942e432db3cd37f2d99f +5004,cd091180d3270ab6557165136bf4f61b +5005,06d9d69876e942074cf75869ef85350a +5006,e8cda34f22e8fb0ae87aaf0c46b02861 +5007,82bace46d2798c3edc599ca9a42c824f +5008,4f3f27e7cbf5d15cd74b1309ce5d8e1e +5009,4789374206da54efa99c9820e57832cf +5010,327f13a81693947bdff3ffd478b95480 +5011,bb78df21af18e9d9b9adfc861d795b39 +5012,51fca0f61013824ae6658e7a5b172c37 +5013,161a463046fc4f1c61dad7d31fa3c73c +5014,fc440fae16fa1e267651c8cb02a188a3 +5015,3e1295ca1d72093011aacef6d8ecdc8a +5016,ea2683889ec727c91d8f28a3f3d3d275 +5017,79f79537a1b97f630d755468a50e3447 +5018,af3c27d88f4696df4cf0564d3276b9c8 +5019,3c58419109dca74749fb41fb980c0edd +5020,74486fe6a3cadef27a60d0919efdd1ac +5021,b114e4b09d15211263b8ed04a6ffefad +5022,0cd41aed40652a818234f28ec4485a00 +5023,1efb930685f175971d2125500c627fea +5024,e3d15dc265a8125e6d744a01503e1696 +5025,ea07bc41b600745d1996f8eea48850b3 +5026,11d59cc102c16ac3fe571c1b6d704fb8 +5027,3811a10992c56696b1e0e2049afb3272 +5028,52199e6614d62cb2d9ba2b316b271bc2 +5029,a03575e3326cff34091080f2e3495049 +5030,f98c2d17e5c7d30612e914a14fecd060 +5031,26b3fc96682062c5e48d11dc985d9f3c +5032,1f179dba62418e8b9e71f018c59a5534 +5033,3536d209d4b401db3bcfdce930310d37 +5034,705cff70be7629b9fb0045ea2b6657e7 +5035,7897ae741ad5b0c319d7b7259c3c3652 +5036,7bc378af53654aafd953bc672bf8bb83 +5037,dde7f44aa93d487558b1032f7ff3f192 +5038,25fcd92290837f136dccfcf95ec73976 +5039,16fba605a856991982e827417b08cd5a +5040,98af24075e3d7039d8c5cac48e2d5c86 +5041,c875aa45647655e59069c16d2ff8eef3 +5042,6bfd5b230659cbf9e73ad9aa218b2b69 +5043,34fe1698e12560b199d16cde46eb1e30 +5044,e19dcf2e3c19248d02ab95599f330465 +5045,c9d16fd2dd84471fa54a9014f1e1b37e +5046,857b1c650e9e6b9338c4e1d8bf02271b +5047,01f102de369b0eaa5a0eb44001cacb84 +5048,f1a54f19ebbddac5e8d9538ae2107022 +5049,99605f48b43dd86b6258e0a550956b2c +5050,3e2ba6db31788d8bef5723e121c6f6a8 +5051,087c5d07b79ba28172e2211cd036e5b7 +5052,549220a7008fb036c01354bf848dce21 +5053,1d6743c784d4f4e5bdfad848fbf3024d +5054,6200a505d90c6437f774c91a22250dee +5055,71b4e18f14894dd0fa20ab0a47adef39 +5056,7c2a8f3cf2d621b7d4cb384e8139cf6b +5057,abf2f862c253d5937fec8290bddf7b13 +5058,6b0ec8c2418c0f32f9a3b02f830612ea +5059,d061911d0e66069376e0928d0aa4a2d6 +5060,a072bfca5c4e2e538a9e3f12f3839b2e +5061,44de74362081a65572e220e773aaf6cc +5062,43293b9ed25664e8b39c5beb7f12758a +5063,24bf113ea2bb0d4ed084db559512a6fc +5064,0fba4ac121d536070ba6e9cb61eff2ce +5065,686e1b98de5aca98b053110755ab2b5f +5066,4b86951a7c015300f33c8967130bfb93 +5067,ca0c6d7b530347cdc808a793eca9b3ef +5068,2dc4f307aac87de3cab07fd9ed873ca4 +5069,31a7ac119c577ddb7f069cde0f865ee4 +5070,1fc21c2190d58dc6643c9cfb92f8b6d1 +5071,c161e5b8db1b0b995c376c949417d0e9 +5072,2b2c06aa455bd38f50c3dca9e0ec7186 +5073,b85a2d54221245fff8251e758f675722 +5074,5eeaf1a2c8f01fa02dd239a5f667dea5 +5075,9fd3ce52ac05bb384fac87a3f3970b13 +5076,071172dca39a39ed9c80c6903d4278cf +5077,9ed0cb0df6fa07ea71abc7c9d5df54c1 +5078,35fbe97557fe77b7036cd128d11c456f +5079,3cc5d18e360cdf78c28677d9d85221f1 +5080,5b3a6e8641cf6a4b9f12ff15d1e598f9 +5081,d04638143c7ff5fe5dadeca499d31295 +5082,6b23222d587b256e2ade478e278d0111 +5083,38a7300f63f93ea124fce8784c18b784 +5084,7dd892a3adcfd40031c8a8089891a709 +5085,dc0f6a317b83306ab226b6b6d4538793 +5086,e6232b98b69fa62a8202e0f5313a2f33 +5087,4e5cf6fd2610655fbd79081b9facf84d +5088,c0edd63474a849dbe46a6af271c0f216 +5089,3fde59e2a78bd56b338fbaf8f2020e2a +5090,e0b6d9a449545a0af7060cdbfe05d065 +5091,4783d368da80f8a04c83fc1010bc4299 +5092,c0b6c6350221785d4259e2cf734c8fb5 +5093,dbd59ca61ff293bf0cc9fa374171b8e1 +5094,f25e32520a9e25196ccd6514f4c5c8e9 +5095,004a84a06755a4a75a7963d364fe2e24 +5096,7421d5ed6af70c94b40a6d462b7027f0 +5097,742c98aedab457074e990df7c0eb307e +5098,b5dfa2e7a5466ffa3d38b95dd3e7b90c +5099,dba12bce7ab11f75a903285182a1e7eb +5100,9aa25719a326c290e4a562e69a5e6823 +5101,2bfa3f0504c4aa906584ca2def2f99d5 +5102,f514ff342241873f3523404ad40f1d18 +5103,4adae445574e33ffcb6e60078d47b212 +5104,a9dd6299d38e10916ab5de83b057755c +5105,68a2107228ef92ea9109150c862ea2b3 +5106,7aea1b96e77beeb18999460f363fa888 +5107,9373b6401007f11aa9e97ce355d5c817 +5108,0b931f097bf8f883f0c2dad271764ebe +5109,6461d35abd21be284bfcf09c94cb5c9d +5110,b471beb5bf645be9ee2f44506e3575af +5111,de81008a489568d2ceef2447ee70505c +5112,154ecc9a672fb41073210d1d0e87686b +5113,27255f761ca20a1a4c00d9c3543d06bf +5114,48fb83382d6c91e1921dedadec88fba8 +5115,18e851a5c2ca03a546e775f05d15e951 +5116,5343225ce527437aecc2b73e9d77e360 +5117,d1b3f18960d239dd691d69831a56f7b7 +5118,e01fa818213fd852e5dbb6e06835deca +5119,ecf78fc44ea12546505ed034ad445fe1 +5120,0b669233251207d436d23c512e7da2e9 +5121,233bb739ad16362a60425f3617d50fe6 +5122,c971178b40e1fba811c61d38899e449f +5123,530b0708927b4985d63ea9913b72921f +5124,826153eb473bda5d4d5c16c5d4292e4c +5125,9e2e9b3db2448feba402c302aa3de7b5 +5126,15859ddf6505d32d1b161060b1f87634 +5127,ae01a74d583114f14e3bbdc2d4ca5cae +5128,cb9199c8f5b23f603e2a3f6b3ebd65c3 +5129,0f8ae460189295f2c217da363b96bd48 +5130,a14f111577ee39baac7cbe00a307beca +5131,1a18ea82ba9cb0f5f3ecc58f350f7259 +5132,fd4d957b0f6ab9c1fad3742046ebc554 +5133,040dd60be53e76a7837305428e6aa9bd +5134,5fca4e7587f21f93824f010b1013f30e +5135,927a81f3213f4679b516ad9490796430 +5136,13f43e2b9d6e504d1af7c398b6bffa95 +5137,d58c957c1f05b2655b96132dc73df535 +5138,428bd1d0d570efa1ef03ebbe218f553e +5139,1f52594ce2779f6ddc0c73a84ee32cf6 +5140,5c6bf9ec9bb997d658a58a155f0a8ac6 +5141,e813e7ec170580c6f362bde5e4d0952c +5142,51a58481c5f83c9173478488d6706a87 +5143,384f675bda7430c84bde1f8553fe7f77 +5144,0c1a49f6c82cc0092555a3a4ebd9249f +5145,6113a747746b4d4fe8f0fa36a2f0c9be +5146,26ade76f1fbe2c07555c9f1c4004c7ce +5147,fb6f6da128106a07788eb31de7811b63 +5148,cf86e411e4a6e1d10fe09590ea835f8d +5149,6f881763a34b0e61acf878cd866be7cd +5150,ef6f3d724c735d873ab0e5a964997c40 +5151,d3a5f6bb11148b616c3cc4efa341ac7f +5152,39389a0aba456e86f593412a8a67d192 +5153,ef74136c2f347e018c3a2b85e67e4831 +5154,674775c186105b5ed7f66b4578d18237 +5155,eb5890fc52b10ce70bcb3ccf04d0d3c1 +5156,bad78b17369730343ff138d3e7225a76 +5157,6732ec1326f17ff3f30d68c2da820f67 +5158,3e1b419d3569b6f22cec1c9a96aae81c +5159,9a2c5c969d2d83d759e6398dc6536994 +5160,a585596cee30207ff206501b4ebdc6d7 +5161,99e5d3a3639c1239d4832bfeba62fc0f +5162,dbd748254956d6b46b3498d26fc05078 +5163,4846df84941f9bbe2608f0bfd304c194 +5164,b67627df6c720d4de92a53ed2db58c41 +5165,f468cee1bda6ea36c76e32f0bd31e3b4 +5166,d7a801152305e8f4246917201b6ef2dd +5167,db3377dc4e576d567604c52d24098ae9 +5168,cd02884bf4da92b6f3603803d5e9ccbe +5169,6b561c2ace00034f5316bfead4823c06 +5170,91f8501c5e6d25f2c3e7d560055f74f1 +5171,fa09ce8cd0fa232e9ec856d015ec6adb +5172,3b0f2f27ca58211424400f5a58cd8130 +5173,dcc5709e07f05e52ab29231961776486 +5174,f8bd62dac08b96c06c809a2be0502899 +5175,13d8a89b46797b3a92b4a56d77ba7618 +5176,9ffa3800eb3fb61ff834133743d8cd4c +5177,977b17335f1d13a051530c6bbd5d2944 +5178,9ac7f656b9ede759327f9de35710a843 +5179,d2c4b9aa58d72fbc006efafd5a7eb1a2 +5180,099179f80681471ae2560581cd2f49c7 +5181,b6881dff8567f4147cf9096aac00f733 +5182,a58c6532c782985372ce3dacbb445f62 +5183,112df7b7339750c537ea476911e9d492 +5184,a15a6ad4f73a501966d8538830832a72 +5185,03419353acd29e07eb5ee50754216029 +5186,d0451f653039fc7df15189fe0e658e53 +5187,52a601bda5b33487e356ea7b01f3284f +5188,bebfbeeadffcdac4e68033298e07dbc8 +5189,f7c53cdc997ab8a476b343b076c71743 +5190,a33721985940e30e46eb34964caf7368 +5191,a0c53d3a33b88cc57d2702b4babee0be +5192,2cd1894ddc070dab6bb7e0c0c7c6a956 +5193,e806ea723966a4791f032d03251edb07 +5194,31d2ad4c5bcefb507430816c79343c73 +5195,b0536393e06e91bf665bf417d728e40b +5196,58725dfb3f55da1e2bbcab92d647bd34 +5197,6b8df041fd6869cd4586ac35d01638cc +5198,1b2704cb9ab66d96da702d6e7e46a6e5 +5199,3a9ebf034fb809777f8cc94ff7c4add8 +5200,22c7bb370066c4cb2936fe22fe0e6cd2 +5201,204ae5aa8719639d715da5d8b0d8d1c6 +5202,01b6cd7a729bad2cf8fa8095cc29163f +5203,4e0709d9f55a020ba07cdd56149d6f9d +5204,57f3b70d37c364dd709143fe610170ee +5205,ec905e14a3037dc216c788e8f2399b46 +5206,dbc2b022217a78affbd68c55e09407d0 +5207,96a09fa3420d714522da1113d3f08b10 +5208,c4deffc6ad37ea1f03456a38d75eadb2 +5209,b380c6b26ad92a37cd9f9e0cac5fb2c2 +5210,f9c8406b2e15bfacac0df00862fa4075 +5211,adfba087a4910b72303b3bb19acbbd1f +5212,019661496c406dc5719b1fc362867206 +5213,12dbde305745b1742b9bdd3844158c68 +5214,b9f8fa63ba9f05e52200cc5e9a39ad16 +5215,5da5c350fc0f0f2707d69e3f2879b1bd +5216,4b9be748a1773278b9cf450a90ef6678 +5217,aefd4548ed86125e3c521850d30e12b7 +5218,c9c3ad9e46f70a8e107c2a592bd02cf6 +5219,dafa86ef6c78a7d1f8d0c774a2b5c955 +5220,075dd52361756a361e48aeb09874bd93 +5221,88efc145796f0c69a0dfa285886abaf9 +5222,822f9fb685f5f6a7e96610a2b48fe662 +5223,76bfe6e2608baaed31949b8bc43f3b84 +5224,7d581a392321cd305d757eae68ed701c +5225,f7dce025a4c0d71181365168d9adfcb9 +5226,653cd7332dc9bff00a3737ed20fea22f +5227,82f6c05b68a26b733145914d0a7b02a8 +5228,e13f4c6ca05e015d104c67671a6a0e2e +5229,24fcfa552d5b33c06c68a70ba599df8a +5230,1bca05c011199a73d44966064d3294e9 +5231,5e3e7c867ce27481bc061423af1a3fa5 +5232,97e065c441f99ec0b19b8ae87385e8e8 +5233,f7ab220ad09373964665760da86ac856 +5234,b1e53279c4424ae519d73e0b20368c71 +5235,2d2ecad835b6d5187b8f4207e4ed739f +5236,8a24f8c3b1124edcd6de9e4eae286943 +5237,c94c93a84c4affe8f853c7313c0931cb +5238,30ac1be6ebfcdfd3a90064c66af4cb85 +5239,02d041da1d26b7fef2047210462a578e +5240,36748ef0541fe628d486baf63792bf29 +5241,5cc8406c95f3f54e82f58e78bd9d0cbb +5242,ec078bdfd8809ce10936291759690307 +5243,dd313f03b9c9f4014de711f7bd1c0f1d +5244,3c56d5ef2a66dfb0fcd7a5b5e08b28e4 +5245,adf7869ec11db36daad6ca33cf3b53c0 +5246,4747a28c6400d842d31f6b5e2627c794 +5247,87d774b37092a0a6be63efe25d0d7816 +5248,84e1d322e7e51afa00ee0dc70b1927ac +5249,a788c28614799556247fdeef80c94b1a +5250,3afb7fc03855f1cae269f622386bf464 +5251,da46061d440cab1226fcf7208a4bd462 +5252,ee29a05d1d21737906a23c1adcfb32a1 +5253,5bcfb82edb653f42edffb0a84f15eb85 +5254,7a788f8567f4f045eb6bc488cc88bdfc +5255,80975f0a00f4e5a03bbc0140b0bad26f +5256,e5d3a2ae79aab163361c0a1e416f23f1 +5257,23f9b40b39046fc84eaa041a502cc062 +5258,6a023e2ab59b153cc2e238e8b549b9d0 +5259,ab9c0c24d81702e2443ef99ddd6db71b +5260,0ec787cd820bc10c7612479df56f9dc5 +5261,91da1ebca55c1b2c9e9472dddf48d39a +5262,c0aa6a55671e9bbecbc5fe46c7a8f3d5 +5263,573ad59b736024afc7adb13471a3f24d +5264,658e11b704f84f3c74e7af5a4b6a27ee +5265,fafbd6bb12683e6714b8aaf5982a5b08 +5266,74ffa53548ab8db3ce928f94a50a6e83 +5267,b1d93cf0ac5bf64eb2821ef1e8a051d4 +5268,90f95dc47997a15590b65fc82bf5cd70 +5269,1e6ccf3521c41a390dd20e6fdf331539 +5270,390b6f1dc8341700d8b5e01e36ce463e +5271,2f02526ef2b956ad8d3b17939776c08b +5272,6f89309f0c52246462374d19118fe347 +5273,10fd103b6e2a1e1777a09fde69a63c16 +5274,a322f57cec5e1278a914d5f56b8a8da7 +5275,f99704a65a95b765229d3952e322e71e +5276,bc3ae62f680cfe2e51b50df59439836b +5277,bf55d972161a4080474fd74ac444c59d +5278,66db78d428033e1ea8714782168d6c66 +5279,3d7be30296d7ee5c9ee6f87ef9dc84a9 +5280,c044bc4800bcf84f6310cc91a6be50f8 +5281,99f5ddfbe7fa2a10d9b02ac2d57e7951 +5282,1e0765943889234b09653c5d76464fc9 +5283,11e5e3b74b76c7d9bc7b00522f100724 +5284,993f0931b41995bc80f3d38cd4b4058b +5285,a8c606944f788e59e742f5cfc6a5a32d +5286,1c9871d169472e75832ff0e7f2af2f60 +5287,e7ca62adeee13614dc3b5428269a9fd7 +5288,7372b5898b37b0a9b9ce539a90e3ca29 +5289,ff8aad6af8431e048e20132c503f199f +5290,bd93f086387baf0cee6d5788d5957948 +5291,cc6347bb761476956acd53617eebf72c +5292,46999e30ea798a5e19dcff38134d0882 +5293,da9b29a8382f086d282addbd5e93f827 +5294,fe2f9d9a112585ecfd6d6f95ce038030 +5295,a0330e084364adfb8be64220a1512439 +5296,0cbafa1a9b9e85cad5fb60408845cfe5 +5297,38ebdc6e1da07f09bb15783cd982f4a1 +5298,f60960f99f8d630438a9ff36dcaf6178 +5299,3a2c8dd22c680f9956a5d1044fd319fd +5300,ce93e862524145799528c76cce341ee1 +5301,345eb7f4be88f6f2140284cb30f94031 +5302,2e17702843e2682e1eb9825c32c2af66 +5303,b8d8942be29eb429e6414fdd4357d3dd +5304,dce0f5249d21579d5fd64e4481bdb28b +5305,ed6373a1eda4a9f73118dcc33e53ea7a +5306,3ee8385e8d6b244847c598a175a6f864 +5307,5ef513e053f4b7686988ea2fa3ed89ae +5308,6814da143411c8c28cd4efc415ca76c0 +5309,2f883bcec47c1b6e6585699c70570bd2 +5310,82b35825156da3d6a83518a92d846add +5311,0b64977374d0d685e5e61008a2e3cee8 +5312,a796203acf07ef3ff03c3638bdb4ef5a +5313,46f9443dc8ba9d3b058ca6c01a353ef1 +5314,86a7fae1db1b1cacdfbdfb57deb3650f +5315,d74c47ccf5892aae6780b3dd6c9e9aab +5316,67151986c1fbdc23d2d46de771ff8448 +5317,c9c12bd8413f2c6a7385bf3c420ca555 +5318,3b832b4915ca22e8723b138bf586019f +5319,8753b7d3b08af86cb066db02398c7663 +5320,e9a0dcde61a822ce0763abee73873835 +5321,073eec9e1468deb5b42581203420f51c +5322,3841bda3d6f23adc1a41e9d96777dde6 +5323,a8f57562f34fe26eab909e7fae46de1d +5324,b5e1a3931d743fe953bdf6be6a894a70 +5325,fccccf8ec1354030a57886ed43ec0244 +5326,6194e48b5b40f81cf6b0aa96bca011ee +5327,818f4643a6c62660fb75ac107d87710a +5328,f644e88f69c6f9cc22ab9a9c8e4d19c0 +5329,391d080d809a561befaf70f982774dbf +5330,033908a1b87b1d525abfa0aa1d2aab55 +5331,44a14163866e62d5b14c0ba61c069d39 +5332,9089e8fdd701e233c4f76016e3d89a30 +5333,077fa772d7616457dcbc2acc8a2a3211 +5334,a8dc965bf57a84bf83f3903fb001f815 +5335,c942ccacb40e84c1df33eb007dadf4c9 +5336,8679a8ffbd8006f9bbb381a4fa554929 +5337,d774d20e2d297fceac9b58e271cafc14 +5338,2f1ebe6274323acbee0e1b887e79e480 +5339,f7838224ccfa7f7c1e4ec7fdce586367 +5340,d6c87f33bb4afc23c3f83e073f492e82 +5341,4edca615719265c1a9e70b0f7a668164 +5342,c109a64fc97d5c080a48ee3b78e1da8e +5343,d1b8935aa3b1fbc44041599dd2f43acf +5344,73e1f90501e84e0b5633bdd5f7523557 +5345,d753f666e62e44fdb23bd5e4f8c75f9e +5346,348e725de012b2cd2e157cd5dfd39209 +5347,394dd9fafc8e4f41828741708d2150bf +5348,9ae55ffecb76221276a16d8ac835d1a3 +5349,e95f9fce4cd1d9d9981fd09165d54217 +5350,4b76c8c9ec7e9e896bd7ddfa84906d72 +5351,52bbccfbc7878cad5b2aad5f899dff4a +5352,afb43b5ffe21aebad6c15180b49d16bf +5353,5e3b31881a2349520e8009b53fc605b8 +5354,0ee6c83626e7d603ed97e3a1f49e4b90 +5355,75908a908ba63b345984232beea0b6f7 +5356,4fa662d16a6c3df611409a0562a0b8df +5357,9d65d5e8983065263b6355fcee1b9192 +5358,f883abc01224f0cc00a9573e15042b09 +5359,c5a28e0ad524b665d0dac28998ea8dfb +5360,a722dfa9ef52f39ec2fb006f6212d89f +5361,a3d963f8bdfb74d80a3ff0dec6d9f7f0 +5362,a9401853eccca06054e0a96a70be33db +5363,e1439d1519fc65995b9a8fea5961e1ac +5364,9ca19bf4ee0a9818fa13deefc590cae0 +5365,475516b5ddfd934d125dd1285dcdbe86 +5366,bb3ed818b80d7a9a0176f4d1c34658cc +5367,ff82229918dfc4268d65866e7f100b2c +5368,199f27f3d380ac44a187af89d6873f2e +5369,5fba14c74d824cf57dcc0a39cded6f7b +5370,2e6a0dbf11fc23db40c075628dfcb031 +5371,5f00e37ec43a4e7357ff268fcdbb79ad +5372,1b9c5bd44ad817f19c57b52267fbcbd1 +5373,717893af99be80e8b9cd10594908db77 +5374,9ea0698e6f3879f84959bdade5c14026 +5375,43b37727f40215c0699e4a5101d75851 +5376,44f6782d272c94e8754c167df8884005 +5377,18384e8b2f81f0654ae32baabce6f553 +5378,f884d0c1de8c20a7a531c3ccbfea3dd6 +5379,b1df69f23dcd7a127f3c41d622b61a00 +5380,6cc2dbbc6d352e51684844b0959504c2 +5381,703780bd777a4cf326da940033e0693e +5382,cfe796adaa1085e6eb3e49b6530d221e +5383,d7c16ec04fac54dde1f00eb92849cda0 +5384,cc746c787def82701a31741f41908498 +5385,562a884894b0e3083551425fae412d8f +5386,f85a7de1c11ff11b2a4404901ef6f96a +5387,6655ab9fa550ce9d12a229198323c49a +5388,50a5c3ff7c7708f4c6b3e1cc2668167e +5389,811f89a79d18107c8fad175603ff925e +5390,7793a76b2678b6b7a44afc2d968eb711 +5391,e3af268e493f1fd950ab018c10e8ef6f +5392,79dd7082d71cfd461a198edc47a98e16 +5393,40794bd5ce4c5619c8076c12fe037dc3 +5394,2f30e1f4ebc1f2ad7db8669d9fc35b3d +5395,3e0f1b5dfd405d814dd6a23de921e820 +5396,7c79d26d85ce7221b741ad6426842d6d +5397,f2d36382894d2dd7028d126dfd34a96e +5398,19222dfa556e4195d34d0f09bbb749a8 +5399,23e93a82c302c46530d50cc2da5626cd +5400,3d82b5a5d8a5f66833a3c651be891cc5 +5401,a62d1f3538cf6899f8e9875aabc83229 +5402,fd155c196a09e6f80ee49f1f1ab9176d +5403,5432eb420bd89e8d71351fe1cbb514ba +5404,d40a90204fd621a056488ffa6e464efa +5405,22592bd45a03d31c40a35eab181a20af +5406,28a2e99b1a5495889e54ca6fff30344a +5407,42535374ea487c3d74c7e46a0c5cc98b +5408,2492411f913f839570f2779b39f1a333 +5409,26eabe7bf19e63fa56ed24a8aadaebbc +5410,2431ed5ea032da8d46f9f786c3b91755 +5411,a0161ff7ab832a668bfc932f5c41a720 +5412,08c4d3f6d654a7779aa0aee947a58828 +5413,b66f1015d8d57acf39198073dfea63b4 +5414,af053d93b6f82ed6758968ac4c55030b +5415,20f2918b02a414d586016cd7f2d5c018 +5416,2fec858c4e30e01e030615f488c799ed +5417,c380d4b78a3b12047f217140fbc60f70 +5418,759839461b5571d3f3c266f52caa8769 +5419,5add23a19dc1bc9b3d5d2680f16e263d +5420,f845f6d2e29c1b904504069c9b129f5f +5421,5f615a4e60f18c9b7d2260717ed24ea5 +5422,d114e2b9c6fb4a2f38e1a1f2b9fd8a1f +5423,33b7e4bb261bd1137057a3baf87ede66 +5424,670fe8b81032c00e2903c3fba7e66c23 +5425,0843380508c5ca51fa860cf5c29c3fdc +5426,5229b4135d434ff23d14591e8e57a6d0 +5427,79fba1b7181ae9a4c004267089d1521e +5428,582ec49228ee2782202d3dbd7833d5b6 +5429,afcf75071a9a24901d3a0e0a648dd416 +5430,5ff231c23a37a61fad7c8684bd61d9aa +5431,4aaeb5b019f678985c23790719dbbcf9 +5432,b57ae4be625d4cbb49753c5bc37cd837 +5433,64a947a38b1f357c470628029556a83d +5434,5ca3dacb4d88ca087152655271464df5 +5435,5effc770d045bf968f3bd1ac7ea0e1a6 +5436,540f18d0cb24431e0892dae79405bf8f +5437,dcbe82c0deddf9b704f35a632cf3d0d7 +5438,bb1a554fda5d32f29c65c9b965fdf2b4 +5439,38a3bbae46604da409224dfa98bcec32 +5440,3c7cfd1bffe3599385f55675ebfbb5e8 +5441,678677adb17b6c855c432fa491784944 +5442,1aed37b3ed638dd365c4b994f1390555 +5443,dbeb61705aa7d32173cd9bfcf2c1f116 +5444,bfa777318f7b6dd80c05d2cd3bad3c05 +5445,929a2089623ae7ed0c00300e8c19df6f +5446,b9b565ab3c2521c61b4bf5ef0595791a +5447,02642947fc49dd34bae8076b1cfc83b4 +5448,c7d80249d488fcb4f13902469f4c57a3 +5449,1a2c234faf6ad564161fcd3287be045f +5450,19335bb93106f56d301c55b23df8a3f8 +5451,86781f7378344bf11e6b03af8f5c1485 +5452,bae3f6281bee1570dc6bb62a68f32d6c +5453,3012ca6174d920344bdce425a5943a60 +5454,026f444b6e1cac6b07d05c049f16d084 +5455,f3d1091ca7bdc17c5e1073870daac70c +5456,8ab25461cf5c0fc6d54aaff8d4d61c7f +5457,a9c1784029344f8569442b422903d814 +5458,f5af1d13d9f649b0d009739f87949b36 +5459,8d3c40743f69a2aaf72cf66b6338034c +5460,43c01c231d66a217ddce11b1773a55e5 +5461,1d82793d3ff70a59a3399042c1db5236 +5462,6114e31a9776f1d95c0f0c5e383b1f40 +5463,525e8bf476669389f2917d41a9db2e47 +5464,3d5dcd7ff5a448458bab31a04f31c9b4 +5465,f40176d5f9d4a52bd19752d3448079ad +5466,f58b1b28df28af111aeeffc029a215c6 +5467,5cf84d538cf74f6d737bf9a31c368a99 +5468,31fa657c879356e0138e7f46a8e8df0e +5469,0ec9494183668317df48fbded8753286 +5470,919f4feda682a5ed27a0f9e442acd7f8 +5471,adf69b00d77a056eb8c4426dd32dba95 +5472,3169fafbf0a7667db2a3a0bca693ff13 +5473,f8dba932335f7ecd7cf7fbced79253bf +5474,a7e2d4d768bb3bcf7230dd239f1543a4 +5475,83f111a9286a56bdfc50f2a5d4fb3b0c +5476,ac5ac26c3f1f1e35f6bb1fee58ea3020 +5477,f129b87f2ea50253f42979e02c8bdb58 +5478,18b2f660ff55929dbe16eca64531edf7 +5479,600767196c483800a17faeb159226f60 +5480,828e6acd60f6044f6e541d99ace67e15 +5481,646f638e60795992baefc2a644117573 +5482,a345b85f10bfc5e9ac1ab6ffd283ac2b +5483,0da16776c9ad2a05f6361ed14bdfa3e8 +5484,a2969c212204a706013dc5f9edd2a320 +5485,38d671523beb03daeb3202cb951b4960 +5486,4b1e2dbc1465f0a1be511a206f5aa4b6 +5487,17d6945df3348011a0744e9f0b965b82 +5488,84f2b08f07c0b91b68ba6e82f97614a7 +5489,e4ba9855c80ba3d7ad2f0279098a6cad +5490,d3d385e5c26602f6a8a97738469dd8d4 +5491,39f67a231f66c75e13f0a7d4e7e3a06c +5492,baf7948dca584a5e871b1d501c1f3912 +5493,c08bf91d46817c73257558e16341fb81 +5494,0a755be688ebca34042e9e16933f415d +5495,607be09231d03e8f944935c55b788916 +5496,48d3d3f2a56ca822dad7f8946f131dde +5497,41e2cc15be5df508381eea485812c41a +5498,19eaf17c17c7f861eb4ea80c47eb8856 +5499,126e2c767f407928a944a47ffe0c461b +5500,2741aa298fac0123e4b5ba1f28b439be +5501,832166ed8009e0308b3ce9329986ec45 +5502,bae13b7d9cd001b82ea0c01fec1db5cc +5503,162e8a23b4e411e1e284c810f5d9e96f +5504,fd1993dc6b3e0b2bf88effcc11776194 +5505,520f8dc3bcccb76dad2e3750c6820c4b +5506,cf8d302425f1aa4aeda5d569e6aa6691 +5507,da3ccff3d9192b4e4aaf07a23d4ca8a2 +5508,1b5c131f2309c5160b08ff8aa53481e9 +5509,366bdfc2f23272dc03c279d69947a834 +5510,97be9e27d2cd45da83c961edbebc4010 +5511,01139bcd11f61d874a3661f70f394fce +5512,88b7f67093cb0f2804e664b667a1ad02 +5513,4bd73219ed5b63db4119ef05e0bb6bdd +5514,050e0de25841c1567d85a303286d9690 +5515,f0642edf8ab62025faaf4b601b15218e +5516,09b1664664cccbb997be930100231ebc +5517,481ab0c0c76de0b7f2b5d56002348359 +5518,b4d996fa54a653433d78f8382b17939c +5519,276e91789cf823396ce9ef1d3efe55dd +5520,2e3c096d2be403e77cc49141d5123e98 +5521,c7a436efb5428d9f20b10ea38a20507b +5522,1e7f47323c923d103d677e2e2059f867 +5523,ab3fed0200c363f072132224eb57e882 +5524,80fab3270a04a7d890a09fef51119535 +5525,c7096e8c85a1d479b51a467ebcb6373f +5526,855981faa1cc552ae1be4985a9247aaa +5527,c35d95404a2eba7b6ca9863a73601e20 +5528,51728f3ae4af3ebf22475b0e683c6d5c +5529,2af0ad630a7c906a6e2ba4e5805b2e7d +5530,bb52b14661d679adf61a224b6fe59fef +5531,1803e03d5db5e07932789dae2d666563 +5532,83b8119247428e4c9768cf96b62d6ae5 +5533,9ef96165b28f6b37eaaa2f55d021ecb9 +5534,b22aa1fa6ffb22d50d91e016b7f9293d +5535,858279f8c5ade21735f1b32cbb4b2722 +5536,47560af564f7466572203906baa314c3 +5537,db2a034c726819125731e8fe811e4693 +5538,2959e87c6f7670d71034e7273809e842 +5539,66cd4d059a853e0a4d66deb67843cf5c +5540,f1562221b0b492ad7657c12038d61889 +5541,a900dc926f318948c6a7d00f4f5592d0 +5542,d630d87f803f69da0fc63c9292ed34fe +5543,0538e034b42b8776e412cff597dd09ca +5544,5553ca1bfaf231427d233b1a9bdab6a3 +5545,d2952237694c70ae99bff77de95e809d +5546,dc6dfe0d2cf74dca261a49974c27d7e7 +5547,0baedceb82b3fba55d295a7a09d12849 +5548,cc817dcebdfd4be563fb5b09b330d464 +5549,1766c89f8aa9cec8015882efd70df97f +5550,288bef446aec4ca11c65600ce89084ec +5551,948e44a1da971b1c2d3ba4a102df6b87 +5552,450e0a0264ed6ac888963bfcdf6e2f59 +5553,be17b8491fe2933e76c14bdb48948198 +5554,258f1401dc3a8253daacc0787169c3a3 +5555,8f4d37577afc5afe9de7e3a41acddb09 +5556,19b6b77ed3cefb5dabce995be581ac59 +5557,a0a5554dd285d84ae27e8d20731ce424 +5558,1432009aaaf154312a8a9e51bdb17413 +5559,f29391c53f680275e80fb78019346d02 +5560,3254ff9de9fb69b66711aa11dd44fc76 +5561,0270c3c97904a22baf836a7f846bb6ec +5562,de2020598df2a544422489cbcda4ea5b +5563,0c40ebad182b793edebdaab5f6a622fe +5564,fb25906712f2cc45844f64a2a3fb204f +5565,da28980421fac0e8decf9f1d5427acbf +5566,6d022c9c723f625255cfab0dc65fb8e5 +5567,2de10006171d0288facc1320c162580d +5568,86f20863f81493b292c8e8920716381c +5569,7d6c36d4f36f4215be4f1dc9f30c27ae +5570,d541747b2627cc2462dc9fe6b74b022a +5571,4dffc622f03939caa512cf8d7d543d76 +5572,4d70aba6258fce9532f92867ed5608d3 +5573,8cd6e78f807036d2b4c41083c2749320 +5574,a9f0ab4b2bfb28a30d80195808fec4b5 +5575,7f85c47652aaca9cb655ff60136399e9 +5576,01123c6a460a2fdf4f3e9f115c2745a3 +5577,21c03309f8fdefc0e1b2601858cb1bb9 +5578,c9e014e29a896dc3f9344caf7f058afe +5579,4e44d9e1ccf405d18642b2d0f04fe793 +5580,e70168962f2ea144c4e326cab3516b71 +5581,de830e67d5fae586c1d234cfab28d515 +5582,bf70db860756a18ea4320b4931eb918f +5583,87c7776cf5c75d22f7318f8d598bacb6 +5584,e4c1f1439b13d410791a3eda54e92dc2 +5585,9e6ce58d99915b25ceb535a9d009ce02 +5586,da23b644c2cc00af1dbe3d7214c95140 +5587,5411880ba2468b8f1fa5561e901e30d0 +5588,a2e01fd900d86c4fbf529f5b08fcf108 +5589,5d0a683b1477f46db9610597776b5cf2 +5590,e5b83bd8d0c62dc01f14672efa8d19d2 +5591,082fab306f6607b7144ca9a23e28f958 +5592,1794723928b780999a6300153f10294c +5593,7d041858e1268d7f09394a70c2069e2b +5594,458ece3fbd6ae37e10617e882e5a4c4a +5595,b0227cd0531c0a4a0b4b4cbd265a3caa +5596,3d8c1c8ea682c9a8ea01a002c74f8657 +5597,22230d0822f274b7e8005ffffc0cd4ee +5598,68996ebc4cb59ea7cc04fae207c260f5 +5599,f1c678ffc9e6977a1265fe9360c20a0f +5600,bda1dcfc3c7c40442edfb4fb4430c2d3 +5601,ac8ccef17b77c472fef0715310019a0c +5602,ff1e258a8b4bca34385b33972c4cf576 +5603,070402ed6b54c2e8f8b4b082afdd0e9c +5604,4155dc8c24546b56b73043eaf392fe79 +5605,7dd0fcf67696f118640f9f898d37daaa +5606,87722427e9f6252384dce0678ff8e33a +5607,42bfc6bf51f16bd3ce1a91d280ba4e0e +5608,d4773e52283482ab881dbea78c02c2e6 +5609,797e21643ab73cdf2d6c1cbbb762779e +5610,0c05305cb1814ccf848ec7b3f939eaf1 +5611,00b946423e409558d7538652b6792bbf +5612,db7f186abdab13209ff870a0c094ef1b +5613,3053d07e7dc7c8366713663d8e73ea32 +5614,5d2b2921324bea169f0fe05371f6c09c +5615,7bb84b49ddaa9f63d5112a0dc9673646 +5616,70db631cd27e908f18863fd945735e78 +5617,06b614a208e0d2f03984f8192410d1a0 +5618,67e6b2c894d4ddef24d3a8e776f26419 +5619,e14178264cf497b97c094490f2d00d1b +5620,d1b32b41f3f8427944439282b63b4170 +5621,58a9fbb9ec3d092ed2751753f450adf1 +5622,70e92def7d57dd6c25d047a47e0bbd7e +5623,4e805824548c00bf3eabfd28f74df246 +5624,22dd0ad07bf9e73b87061f9cbecf09a9 +5625,b56abb0ac9820bfdf7949f4618d58bd8 +5626,104785c52a602626c2c833ceca9ab5b7 +5627,dca1516ed0d777f4fe77b2f2a3aa3fa1 +5628,dfa70ff0fc8c3250e40e9769d6cfd452 +5629,4336ee4147f2bfa9453cc94a155ed194 +5630,28a572fb6a4ba7698fc702a4c46b6daf +5631,8be99672267d9917f212a3e72c9e0906 +5632,7be3b31068dd902951c38d469e477c55 +5633,dcd63b7f27efb2e36b8e795998db6cb3 +5634,23261e2ae6ca16147fbf805c082dbf31 +5635,4bed931dc41040f50c47c8155b5d8f70 +5636,e7b9a93a05df4da0edf77be1ba93c5f3 +5637,d468eed890b00e123098edad829cd6bd +5638,d773fab5871b8712e5b45fd298b2b611 +5639,f852495dbd734372dec9d87a58942242 +5640,293d401c870757a3be423405f9abc51c +5641,2f315278fd87bf6f44a64baf134dbbd5 +5642,51a6548b1d232a6b934fa2ec18ee32df +5643,5bb3f350a114840cafce6e94553837eb +5644,12146f6b745a668c2a54cdbce66e63a0 +5645,9e2f9b0c5df001bd4ba9ef77a674dbde +5646,896de6e4e13bd90fc9e4e1c1d48a1644 +5647,9859fff3f70b0e737ce6005fc28bb28e +5648,4818513bf3abeb864ad4400c8265857b +5649,ec8164999a30f7d3fc464bbe676b1368 +5650,14dcc234e1baf8c0d80718cb71edc597 +5651,c47a8a548506e97f00dd092c52757548 +5652,af0a0175899e6e677aa02366d0e02251 +5653,bc9eb2bd4d72658b4d01db91586f3d65 +5654,7cc9c95e1a65a28a8aeb2dc367188969 +5655,0ef54c9b6d04093dfca841cdd317bd6f +5656,1c5086e90e7eab4993c5968d0cab5c28 +5657,085f6e69cefddd2a1946942d4dfed1eb +5658,226f3ef3f3d617b1473b0ae645d0d1b1 +5659,6c3a8d79c693308fb326651ffc5edec7 +5660,5fe7522cd5b2497fe5762b45941c0714 +5661,9d81e64cf7301c62a3760182de176fd3 +5662,33561d17cb1481a9b44a0fed9dcfb73a +5663,a19854bd22663164cf09c7f6e6261515 +5664,9f350e4e1ad34a123c887ebb8d5f20c6 +5665,64e39cf1a3530aa2c0ecfe87b7c3d236 +5666,b59c2ea3230f7f71f2c69bf915df5008 +5667,169124b44a3523983f82bc3d74158732 +5668,428066ce165d28be06c8d61a41af280b +5669,782c99d5f88bdc3e6c61cb55ae5b2e8d +5670,9c2da1ad9df2b28d3fd94453e8342c8b +5671,ebdae40827324cf6903630a156f6541a +5672,0be7318740431947e32d525b9ed65ebf +5673,dfefc36efe1c5a459ee38497cff91de3 +5674,fc70b52c209e13ae847055b5f389dbae +5675,f19603673a102c127d743d9b35ea41e6 +5676,13e76279ef2c669c599ef4731745ebe3 +5677,7c2fd6777000a6a5518cd1c438007036 +5678,93aa53de1093c56010fb03db15166e32 +5679,8632647c94d065e36053c17a83173d76 +5680,de5792f1e20def4866bb4e23335c0715 +5681,bf59e88a68ea290014b8f0d78ec773c8 +5682,6b3bb281cf3941569581f4c69acaa154 +5683,2ad6e5abfd73ab2f2b2e4a1052881871 +5684,712840a59d125d12858390c3f2fb2102 +5685,6dd40af7f6de983c38e93e718228a651 +5686,8acd287d7182cf45165be49725d8635a +5687,bd6f3a09989002d4f6bb61d7d2e54ffb +5688,fa1abed0cf392ca45d19b5d6ff4484db +5689,870b5db09dab8962f5672043c37412da +5690,fe2508e7384a752b29ec80414a6f55fb +5691,e47ce8ad6ab72a364861ed309b8add04 +5692,63a4f405faffb8f2cd63921453770c73 +5693,717895bcda601863ed20c1699d116c3a +5694,59bde37d37edc28cdebf6cb1b01dcb2b +5695,da160694267219a75243533bac623486 +5696,bc05c35568db256631b3c6ba454b3a6b +5697,769b83e9ab25db150734111d3fa8574c +5698,a29dd0c3827ed628cbc32a8282700fc6 +5699,1867a66d08e2dd297362a92e1071dc15 +5700,0de378019671dc88edde5d324a4e1a31 +5701,78ecab1763514950f87565abf0a5a155 +5702,5752480e54ed32ea5ac0a25a3fd610e4 +5703,29507d7b5bbeb28f3f966a598f2b5b82 +5704,b39726e748d9f1a9b582dde86de31a8e +5705,12851ad75a6ef14ec1c58621f24895ac +5706,12de05ebc0c21fba371e89f628dfc80a +5707,28a9c25f032455f65804eb603a012917 +5708,fb4608a09572d0150325346386c97a14 +5709,ba6075a62d8a748cf407aa1ebe5d78c5 +5710,fdab2448597ca98d65926d603951ce1b +5711,c2d2027f3024dbe6e3da824cb957cc49 +5712,81781baa7d06f8d81ef009f2b23e3060 +5713,a5cde7ec047e0326f0120a44281a2b52 +5714,d1f1d6ff7b64fd978088f1e3bb0b02b3 +5715,8f588e7a58389e78cfe8eefbe3ca25ad +5716,1d6902f6e38e9edd296fcff8ac273ccb +5717,b647702b0d68a044a0e7bdaa6285138a +5718,2e5caa42d7b0a16430a1e2b204bebcd1 +5719,7a290ad2ea6d4e2eb68fd279b593bcd9 +5720,67440590f9bab8329edac27cf59fc200 +5721,f6031af8c6a0f4fbaafd8b8542170cbd +5722,bfba80a842fb4aa0e7bc7f5ee9ff2995 +5723,b23bc732cc8ff15a8aac13e6ac338509 +5724,7ac4446d03a0df7c9dfbb148bbd1c88b +5725,ae2c32bc07ed1fdf07656b13eec5cbdf +5726,93e04791d0cbb8cba5d58d5cb33ff4b4 +5727,769dee89fb11e3cec79af9512abeb796 +5728,d80f0be0f1702df60de61a12bcddd368 +5729,ea8b716ceb74b4d38753d2e571b8c0ba +5730,827052c29ade7331b225eb5a4bfde699 +5731,377f89bbe47e99e63cb41b7189d85a46 +5732,88da8938a9b7b49340f3db2fd3169734 +5733,2adc0d41f05e513f5c51b56de8f78a65 +5734,810cfd13b5b0add7dff00665a814f1d0 +5735,e7b4c99655de66734ba951a276ca8bd7 +5736,0b6a62afdf3084d8263415f755988153 +5737,a969526df347298eae86ced33aada6fa +5738,95b99fc3001ffc1069f5d9a44ca82704 +5739,459ded7673555c64061f3aec2e7bbf95 +5740,7f77d96a9438ca52b42f35a0c770ea70 +5741,1ef311587df3b7e8fb057ba788714007 +5742,ae5a7addd2b1d33b4a0bd8a2f3b797b6 +5743,85e8f44b43b69135e27774bd737272ba +5744,5fb7704f1607a1172a318f3109738f7d +5745,083e00a97a71ebd72edfe778b4efff57 +5746,f524c8ab6c98a38335f6331bed525f91 +5747,60844bd031dcd71a027095bf72f1e152 +5748,143c830350872f4f70dafc9d04d1fc7d +5749,9b0d0d05ae83d994b8b8fd99ceb50115 +5750,263047f32dcee9d78ebd7517dd956c5c +5751,a747b284904ac6c64f065890547a13a9 +5752,85ccdd416b2130ec7e3c617a788ada58 +5753,1e08ecceb671ef6d9292bba74edba97e +5754,8311662f48447433b170378510ea5655 +5755,54f548062bd2b371c74e34827fbdb019 +5756,4f87c65087b662ce62a8184f97c355d7 +5757,8d6ed5ab092ec148a62992bf302a1dc3 +5758,3b7508bef986979c4a113398b2a6368f +5759,e74ec198fa78d9808b4ee97feefebd9c +5760,44290ba04f9e4ebb1b2353bcfebe3eac +5761,e224b2b45bb1660facbfa052e23c8c9f +5762,98a531788ab33a4d04497d1c670ec066 +5763,ff493d7e302038237330d411daddbf2b +5764,2bc8441a12c3535d0107a4661f1c7e50 +5765,33512d695b2dbe5f78aea5b3df7b3628 +5766,1666774a178825d91f655c30f1d25cd3 +5767,aab1d8d496a6417fb1a8b1d11a397ece +5768,204fe701ac32060b96874c66f870dc66 +5769,c1d70a9a0555a009e5ab9212267e42d8 +5770,3a995a6f5c87018af0358ddfd5ab9dee +5771,899d3e341b0d7533e8fbcc34ee29d5c9 +5772,0a08bacb934c1c8c0f80a00f3b1f2fad +5773,d052326a8ee983eca7ae285c8e68a079 +5774,c03d50290095bbd8506bc3d30abdc345 +5775,5a8bbea42de4d9dca4dca05f7332f633 +5776,4ca45149000007e0cb55d0380780334f +5777,c2e3bc530e754169cbecf72908f20d79 +5778,eec2de863827697f9e194a22c87f95cc +5779,1d69f2f4e9f876caa5be6e2d822c43bb +5780,2d8c4cf8c24b36da96ae057f0c0a03fe +5781,feababe1aee1dd69e1c87d3708548283 +5782,8a0f0c127bf63bdd35b3f6fa594ad5c7 +5783,07c2d795e9fc4110c8ccd032fea3a8cb +5784,42408eff8646b41cebbeb99bc6e0e9ac +5785,e2d8becce7f08b2ea13ab00622a1f79f +5786,cad249dc78bf4c40b11e8f8c440d64b7 +5787,42072c9833425ec71696bbd2623ff116 +5788,1786eee7fabdd53121889325230d6492 +5789,2bd1a0d6b3d6bc4aa98e2f163d0ac263 +5790,366591d70b748d035cb2b4db692237ba +5791,6cde54c346aa3b2fa448ec622b5729cd +5792,5b08354b3319f422c9e4794bbe193ea6 +5793,4cc04c3ceefe207bb93870eb1832c589 +5794,c4a48d018429b96eb71713ba55f6d369 +5795,05ca4083ae6bff4efab633f9fa80163f +5796,9c2033f0f7a5399a5c8768d9c0839931 +5797,9e52bd13d71fc7853bdf6cee5b2e2ebe +5798,fca80f1d09d18e1a164a2af7e5be35f4 +5799,ccc98aa97bb2668baa98c7a9f8a19d72 +5800,b63ca49016068ab3411b011cdd132fcc +5801,c540eb94695ed297d749112b3b2becee +5802,115e0f0c11452889c2f6e26476a4b649 +5803,e0261e5358e4fdf8fc4693b5af966d14 +5804,690d067879a7196552b20559704ec7a6 +5805,02df3f29d3f36c1a08d60d6867b65a7f +5806,f4847d6ccdc994b3ae9669cc0736e870 +5807,eb5283925081823db6104cde7c68025f +5808,0cedf38331fb830f9ad0a13d41a58de9 +5809,4538a504f768215467d65597ca92efb5 +5810,a088ebb24510ea4184b94c73001dfbff +5811,5a0cd8b388146b294a370f897f82bfca +5812,af3c38c563ad8f3c7930bf267a1cd303 +5813,cde571f877b8c90090e05095194805ed +5814,64061d028fd1f4681a1054ec2815ddab +5815,395871dabf99fd9801ee089964199cbe +5816,6f8c7e58a31a7e0da10ecf6b2724bc09 +5817,0ed0fce610424c2b7ba9ca7667ae2c22 +5818,b5c236082e00ddb7ce60ee0e57dd008d +5819,64cd50b5d8b252a38d59f552419b0efa +5820,663d6bcfc5056aed03536d543a718a05 +5821,9e28f68b5b293f2b1e0077a1dfe6609f +5822,588df4699268cf677e67e58e900416a8 +5823,ca428d406ce064f3101927925afedb8b +5824,7ed35b9327f43920dcbd94e0ccd7d2ef +5825,9a0972d77a9f0948b0b0cfae54c011d1 +5826,93087cc1dd5c2790f890353a0778783c +5827,ae50cc06c1400a1625bea92aa3743609 +5828,ca2b4ae479b52131c0c5913068337b42 +5829,031d07f360e830718737690e8ae5fff5 +5830,55a0cb46e85d07986db587d1269bc193 +5831,b883766edb40fc5944d3ae5075c271ab +5832,6b00d645445af2e7bc07a3c2902f8666 +5833,1a5593bb45afe460ff3302b456d8c30b +5834,eab016e708f00c260d2dea06d8861c26 +5835,9a367d9130ef880bbc4b4ca8b4ecda32 +5836,bfccd22bf50b3ba9dc74f8fac0420870 +5837,4599d5cc906a8c2cd1c0cbd5b1fa4d7c +5838,9c059b669fed1340028bf94b92952044 +5839,e99ebb5ad60c41733e696532cab99ec9 +5840,4c04cbeae124110c249d700ae40fbdc8 +5841,8b8a549dcea50fd922b14407358255e3 +5842,f0e909daf80609559cf33079987ca844 +5843,fa5d7d85fa2f7ed8a4d283abddb970d7 +5844,6eb90f96be7bdebf5fbdcc3d2d739c9d +5845,1380c58008f1b0b538548bd08be4862c +5846,32dbaabaca405d55e691f165cfeee2d7 +5847,69cb8c23dc6257d546b44d963a1137ce +5848,a68cde0d5a9ffd9b8285327bf72ac48a +5849,ad217fe5b6cc43078e5891a757f4d980 +5850,53d825b4b7471a54dbabec2f647bd680 +5851,f555499958007898ee7a7a6634911611 +5852,57efbca2d8e4eeeed6e48dd36d809fc3 +5853,ef6fc917a1354dba932130c097d9637c +5854,fd73363aa01b649efca168b7cdffd5d9 +5855,3f8f49066fd0e0f8d9c5841b30a495fa +5856,0de5babccb218196de52de076ff0ce4f +5857,355c21485428feb94ecf905d1cf1cc9c +5858,826189088477061c2b2ffd4a958a89e8 +5859,f72764beaef23e1617df0cdc6ddab579 +5860,531e05e73dd1bc0a1c1963d89ec78799 +5861,f248a50637ebb55b6403a08796083dfa +5862,8eb6c9c007acc563305a462c1429a596 +5863,976edd846274532eeddb28c66693bf03 +5864,2f7816807ed616ec227d37f852e3adbc +5865,c9fd52bbcf89b7c615226c4349396ed7 +5866,faaa8aba185bb372437461da2ec9397e +5867,537b01ee0ef6fd4f2fead76b10204a0b +5868,79ae395a3aaa91f4ae781143f6daf982 +5869,dea6407671a37cfcaccbef3b892c6253 +5870,310d1031753f5e15142f9e6e62776c25 +5871,a9e7609867cf796aeea7e83d63df59c9 +5872,609ab6ffc8a253dbb6c6e8946eca9425 +5873,1a67dd86f79ae88840fe7a75645e616d +5874,fbd5eaf662961a08d09b3b82135503bb +5875,8058ef31c6449a77709ffdd1fddb8e00 +5876,b75b2a7fc315bd1ae844c16a99841b4b +5877,28676a068117b878a0417aef44f2196a +5878,788a1c174377fa209f8baf4c47e0aaa5 +5879,7a0e5c891700b0f17e0fcf6fb9366194 +5880,63f95dd039db76302685b185419b9111 +5881,142426ac722348a15ccd8c740fcef0e8 +5882,2111454012c33d4ec37e568fdb0e065b +5883,e51eab9be32275cadbb28ce52582970c +5884,bf118a99b6f1a4ad988dd6e3dc6dc9b2 +5885,46f53f2e355de9515132185a7d70343c +5886,f8e14da2ef1da00fd2dad6624d98cdde +5887,42220652b4e249c169495fdf185868d9 +5888,2bebd5fc960f493f892deaa5419d6684 +5889,a95e38ba75d7f323831dde9c92f4d981 +5890,361dd3d05a0950002abb1d8453a597bc +5891,0fb8085a94260fcc1ac5b0df01628264 +5892,5579ae0aabafefb401169b51e8e585ac +5893,3663834f088d6fa3563b976458f63b07 +5894,302b75b434073281964f7072994d6020 +5895,d78a917e310aa850e9f8aeafebb6e4fe +5896,ec7bfb0d91a2a2752b7ed4d6fc48a0c1 +5897,03a6e32a0641d29162e19703896e978e +5898,294e09bf024d9839fff85ecc1d891811 +5899,26c617376bbccc238d8ddbac103b80bb +5900,fff228f5221d481e1e5ba375acf49c02 +5901,16645817792dc0040aefbc4f8b8f7406 +5902,30b5c6a7315b1d72a0c1cef4f31ff3ab +5903,766f7af5c5f97f887718bf828a7a0b00 +5904,4094ab0cc115184dcb991f424637eb35 +5905,b14e7ce19ea58d09a4451164d7c05dce +5906,dce2d1de3cf79850dd289917193bb988 +5907,1fd3cc7515933a9add863564c31d1d25 +5908,ff6892d8c74626c54c86660a57952e0e +5909,45127bcc1c2555e8175699bf74b3bac8 +5910,09cf1f77761b7edbe16d8a62a6fdb0ba +5911,2d56ffd38147068f9f0df1f2c2dea6eb +5912,6ecd0a7979cb441a30d692687859d4e8 +5913,ec7de1e8a212aad49f04bf9dbd4f1aea +5914,9f576f13dd5ef158bed6166f3592e253 +5915,ac9194f00ded8b4f6c570820f0d9f584 +5916,80685cb5ec810290b81eea4394021edc +5917,0e17043a606eea4f7aa4e3a2afd27ce6 +5918,cea1e3e8c62210b50123082d5ab477b3 +5919,3ab7caa25a08bc954f7ea2dfac6e12c4 +5920,19812647093061f074b44a388137f7dd +5921,41a624f30cc158ae2d9bda29d20088c8 +5922,b7036dc3cb78de341eeb0f046cf49c0a +5923,c7a0ecc9b6ab13d6ff9d7dac98deeb20 +5924,93f2834821d0b98a0e15f0f5b37ad7eb +5925,92526d809002c038e9126d995c4f4904 +5926,b3574ed12711f9f756b2e2b59b64ad7b +5927,dbc5b08d4476a954848cf37fb24d5528 +5928,4dfbc3cd3b7db5b117b2de46fa090a84 +5929,1a71483c285c028a021b4cf4de4a6a06 +5930,655527f95159bd595550ae6b04bec3dd +5931,19508d3258c4fdfae50b85102d9bd6c9 +5932,555829dc44fd040f5d34d94b55351e56 +5933,b7feaee2cf54328507ac82941da63fb0 +5934,5c60ba6852222632a7165558421926ff +5935,19e5764ca8b64569c082d41613263058 +5936,4dc5919e38360057280c1a75905dc2d7 +5937,21a39dae99b627a72dd1a0f9f6852ec3 +5938,249f28b0797e5d832aa89cbeef016888 +5939,dfa07ef64ca0a3e8537a21be0ae70fc9 +5940,315bbe6d4990b2082c3aa60176e412e2 +5941,f9ff5a9eb6b26c28f107644ede05c8e5 +5942,78b1164785416c38d9b76bb27d0d5a45 +5943,d5a9c6b25d971ff49080859433d8f4b9 +5944,401398bbaa2e9a5f88b2e4ec80042967 +5945,ae4a99e597760ba1eb4ad8104f5096d2 +5946,157d54bee990c01fab9af70bb4511331 +5947,6cc51a0691b97c1ae516e55e36d6b377 +5948,b60208cbd93d97eed1b43a5250597ce8 +5949,b3de18529c325a2a2bce4bfd83727e73 +5950,acd055b5fe4a8641c16f6c5aef8b25ac +5951,66e7dea66b0aa11367cd351a49ae6fc2 +5952,d712d5a7d1c72e95b94038852c6c7aff +5953,92e3568a8753a8223e3d17dc3376acf9 +5954,fd2e16b9ec8dc75439bec63f78e6e209 +5955,0331ead67efdbb802aeb79eb1ea29a64 +5956,ab0481d9c07c8dda965f18270efeba6b +5957,9b5db5e8205d34f2805ca8e244c9e4fb +5958,12bb6ccf67d4ed188211a3ee2bee0166 +5959,af96349458f1370a0357e11031ef8a3d +5960,314e19fe9f9e81791710303a21fcfc21 +5961,a305749c4103abd7545ed309b49932ae +5962,f698279f535ff52d5bf86b3a88002c5d +5963,0b77307e1f3cddc54a7f676bdf944a93 +5964,eda0ab1d2f09446d80127beee99a18fa +5965,096bd1f320490ebba6b11b8e6b978c46 +5966,0fed754538e154355a5adc2c9b94d41f +5967,200d15f493c6e0c8e94a59a2bc542ad8 +5968,caad016682ca62f54998e4b28913adb0 +5969,150df83a40c3ba51376660ce4a90f647 +5970,18849e0b78c188abf1feafb3fe0afbd7 +5971,dc173d02e91e958f315a1534bcf4634e +5972,b1b326a6f366d75603f3a87ac82a8c27 +5973,dac9b9fc4a2160b07315714a6897c731 +5974,0b6876ba3428d5e9ef2e13ca8a3799ca +5975,1c9300e1eab8c6e40827aa866e96eabe +5976,d871620cf8e35c5f3fe2fa9dc83050dd +5977,7b9e847595177b2ef342ef6a6ca0b43c +5978,ed06bc14e78f9b64b49447f7c1983ea8 +5979,97a6e6a1fd8af9ce1c729f732df98a36 +5980,4f92617c18b3d3e6254bb342b92f78b2 +5981,f104a51b352e22b1155d78fc1c6ea071 +5982,6d707b30cdd2f51c97a63c616940e2e5 +5983,e68355378096fd6fd209b39174344cd2 +5984,063592f02759464ebecf750f13306f13 +5985,42c7f8c2cceca4e3bc7f21c8f27b798f +5986,643ae94e8b15eabaf8b4e7df7188b21a +5987,bd4b47477471ec2afb4ff07c61f90d04 +5988,8e645f7a7f4f32d176e7cc8d26724ffe +5989,bdb03c992c955f1ef13cf60c83eed0c8 +5990,8f16305caec37de5b63e29b83f48f25f +5991,97d19eeb0291bacd191903a946a9419b +5992,6297fa84e4c427ba1470b95d3830a442 +5993,98ab7235ab3123cca46c54c951adfd17 +5994,d8bed97fa38932455d9f970a0bd2a770 +5995,1c127620b32ad731036a47dd9e26bd98 +5996,511a7faaee1efa1d2e1cc2cd96f949d5 +5997,20c2d89c1714d109b926b546b7b7e7de +5998,ced195f2bd954461abd38afc638c9379 +5999,a87b92f5284214f1816a495ea783f718 +6000,58dc1a93638dc6bf6e7f5089c9a9a161 +6001,f8851f7fd9ecb96a41cdbf8997036746 +6002,7927d0840ad6bcd44e797d0c2065f4a1 +6003,ac24abd795e32c93dc618c2d22ce1c01 +6004,4617b21b8352ebbe8e16ba05a5ecff22 +6005,686ddf35133012f04480c520f160cffc +6006,2b1826d08dccb088b105e9467f19d6e4 +6007,b8adb15a2af109fe9694d81e764706bf +6008,868dfdc02e8b9ca75f9f94529ad3fc76 +6009,06f053d53d1c6a1579eb55fa12a3c7bb +6010,723acd38c60e6479108cbd5d9eb3cafa +6011,b425cce4e889d9adb0c1c95b07d9399a +6012,06ce17813c6a6a23421dee6069723c15 +6013,f3b5d5ab2c2f64767fdd3195ab694d7a +6014,c1feb91b3404e97a9ff83d7796cca65e +6015,21810cbc5841576262588cf8c1e788c5 +6016,901b7317bebbcaafeaba89b76edd3d9e +6017,32e84f35c33eb2cbb3ad83a85eba5d2c +6018,f497354e6f07e348fe75db5a06db102d +6019,4f3480bd251c70d776d23da47e464b9f +6020,c02a3cba4636cbf868496fa08c2a26c7 +6021,898fd3b7ccf92938d7db311cb80625be +6022,5e2a37721469d61446ec7595d523b176 +6023,b3bdc5425c4945f3f0f24f623fbcbffd +6024,535f58824097e6642577898dc38e4b5c +6025,8c0ec67a97502cb1be72d56ac9ec942a +6026,e4847eddbebd41a9a9f980e2fc9d80a4 +6027,598c506aa58b3453c4c763a219371a12 +6028,f4ae0ed74c602f9d8733a026a495b2d1 +6029,7886e8c74945d32a7b39c5a118cc11e4 +6030,3a709546c7943db0992aca56251c18b7 +6031,69194f55b3ae62900e85f8ca8c842f44 +6032,3852d61287df07475cd9c29517fba1ef +6033,0b76ec6dc53761e925fd372373cecf62 +6034,b0bcdc716e773bcd8e05c37dcb3bd1f3 +6035,e1e341412475809640c076b6035d53fb +6036,08f39caf6f51e78837859ecbbff84664 +6037,3b0ec3206d7a0ec2c812e702182a2700 +6038,088e8ae02bea4b54c35d419ba0b36adc +6039,a16201eb2d27de2fdf88ab3b7945abf8 +6040,402174abfc7a1cc473f97c54eebfb252 +6041,ca324d47d97c14c8c25b5102d7dd7802 +6042,3372b44e00b772213cb87e47ab689eed +6043,b6a71accbfda72a10141479ad157686f +6044,43ea068cfc894169041f97013a1868fd +6045,caa2b218ac5907193f958213c7c80021 +6046,e69dbb05da6b54793b293d9045e05cc7 +6047,2f36de0760c6b6198ecf52683c53bdf8 +6048,30c14750a5af0ed1c93fc15a720be766 +6049,b92f9f4062ea8cd774abb7e5eb64ec6b +6050,0f620459afe3948811f9f9e56960b177 +6051,ae70f2fa468affbbdffcec109320f2c4 +6052,4e4231945cdf553d14e1a092649d398c +6053,8ca35ea56fdffb680bfd0d0dde88dec1 +6054,92eced46321bd35d822c72d4d12c000c +6055,78f03ea2cd01495548b379909b8a5e3a +6056,83978960e31e0d6439544eaefba6a523 +6057,63c7837681af24a3da2874790d9357b2 +6058,e710863a9d5201ea26b61bb52ff8fad6 +6059,ea9e2acf565090042ce193cbff509a4f +6060,78abda3a54875befb31e561e685931d4 +6061,c724e4dc26952bd2c6a55e0538ec44b1 +6062,4823121add4858e31aecdfe2d48aedc4 +6063,74291a6c317ee2e24542a295c8c8caba +6064,ba0bf0cbf3fee850e9e22a2237a9ec75 +6065,d35bb0bf450835197114144e3417fb34 +6066,7ee30811d638b413812a16aec75760f3 +6067,e9f316452d9ffd80e3274d110961ba19 +6068,c75638210122bf2b673c6e482cf57122 +6069,38fb9516d2b360ae7ffdc119387e9ccc +6070,adb67eadf04756767fa58f186ff0d90b +6071,cef232fd5c002ba0369af449fbfb99d8 +6072,4659894c3c8bc5e9ee29998bb2cf3c1e +6073,36c6861953d15548048e42dcbc8f582e +6074,e55511b90f6ea68009eb468d8c800d43 +6075,2631f230c12a91b57b02c9050069121c +6076,f08abb93e1ad7ee62fd13b301f4073bb +6077,f29d92c0f095e9d5c642a5b0cf71d535 +6078,b6899a51e73fa230f66be874e7994968 +6079,3bbe8bcefc25297ebb025ed9a2fb1f34 +6080,d941f73c1467193f6a84c69e152bf6fe +6081,339b96362a5cae08f154869bc3c9295e +6082,3fa3270bdef4a7040614758357fc1618 +6083,70c1793e0252b226e5a2919a1d780bb9 +6084,5662770223684d7ed1d91fd8e7fb967c +6085,08d75023c47d25c0bc6a17b804115211 +6086,84eed89cbef9c1f54068d3649afc52e0 +6087,7a32bfeb099da98b05c40832ce080793 +6088,33bddd1e67467d3afb11600a5b01f977 +6089,06b29f930cc98967fc6b166b74a37e44 +6090,8f0c21a85d8787b2b970cd3810c1a09f +6091,026bc6cb582336c4ff8c03e2ef211a13 +6092,e38a1c03f40b134d6f38518bdea83d5e +6093,9a87f2ea223a43cbe59b40e6cd239862 +6094,2de0eafac512ffb4b5d69fec405d9da0 +6095,fdaa9dc14a7b17b4c891b09634f4790e +6096,8ffe7a3b8802584fad24eb0028e214de +6097,58a8fee1e25ae0deae22fd2ee8089f68 +6098,15fc6bc26d184f694e8954cff256d91c +6099,4ed9215eebf5fe814f3c4e67b05a124c +6100,b0efb55e3ace156680adfaf73f4fa324 +6101,585147a3381e3bb3281e0cca9a4807e2 +6102,b56b01160d8a0a206b2880a368c2c5ba +6103,eb5c1a507faf95522e18b7a098d20f11 +6104,5d5927780326a79eec6413454ee19a9f +6105,f97d8993cba0af45bc113a792962a66b +6106,a5d410008871fb2612693add4f326099 +6107,8753173e9e3689c7d91d300624017899 +6108,2f77671dab6aa7a58a2a4f362f04f3c5 +6109,edfd8c11513cf664799e6e4bbc1c4ccd +6110,e99aaa3ecc525fb238e031d02987b531 +6111,3e8143670663555f4751e95daa62d843 +6112,1b06878e34f406b739a59331361aac6a +6113,53038973ce87fb03552b5a16cd455e5a +6114,4515263b3cc9d7e72edb5ba8d7f7b8e3 +6115,b927d2c5e0ffb3ac35d676a2f0d87573 +6116,af92c64a6bf647fc180b4bdc57e4bfe7 +6117,fb2cc6d744e426bd85a9f72dc30eb3bc +6118,05d9608079706d4f0374b28ab81caaea +6119,37ea9cba1add6fa2a18c48399ec94586 +6120,76817c1f6d563e5e355640cccba34151 +6121,ac32c83165f275c5523af49b98e452a1 +6122,a4813b7fb71bc2b2b358bba8fafb052f +6123,f5fb2eb071142749d6070ed70130ad04 +6124,7058e0a78f7a2c39ac1f2a557ed8147f +6125,b79ecd88ba8faabf16d57c2fa68fc96d +6126,5f1a62a83bf5b1db2d66cf556f94f7fb +6127,036a0107f3f50d67b48baedde7cfaf91 +6128,ac2755d71a52295ed2656d9be33c700d +6129,8361259f17bbfdcdacaf04c44b70ef52 +6130,68b488bf59d38a2a71d3f5c6d604520a +6131,ca33806ff6adb23694c8993953c2226d +6132,ac292a0d9f994744f920c8710851ed97 +6133,76dc34062112aa96644e0b150291f6eb +6134,7df2f23d29a5faaf755860d92acaab5a +6135,6a19e851baa460f40c80bda0eeed4bad +6136,6e8df1b4dd6ada0004c9c64001ce5b5d +6137,8364b489e8bbc0d18ad4f82d1828cf32 +6138,49764bf8ec10dd653254f2ff689e8574 +6139,46ddb3e844aadcacd6580badbfc0b236 +6140,13c0082e7113d130d8b024d5ab423782 +6141,b7b0e4726e28dc2cb01c3712be8a5098 +6142,42ba4ad05083dcb300ad4aeb6ca01730 +6143,80d558742dbc0ff75658927f8d599ffb +6144,3b2f3b7ef175c16342ba3856db4d5646 +6145,3ebff4044694c94aa215c42b1b4dd790 +6146,434c1692fed93c2ec57dcd80acd182b1 +6147,43773fb63e00f07fc3dd6ef1b7704626 +6148,947b038f5d1bd62d60a968db6cbadd7f +6149,dc15d1c5b31422779cb213e386a23cc1 +6150,9a96e0662c1f750fdf5db7b8b375b47f +6151,5f2f757aa0baee05a11c610fa705534a +6152,90b2390a9429e00458b5f17da6064f90 +6153,4a705535c9d330788b72194d00e1b765 +6154,41708fc86ee6fe2d2758a36eb8da1504 +6155,dac15a5c4be720a593c86fb080ea8c3f +6156,bb6bf8dda95c93043cefeae7e1d00c11 +6157,ceb623ab07734dc2c4cebd99b03a42d5 +6158,c43a89a460ac9d2dd8ca988e6e6dea5f +6159,1bcd6323c407464b7013bcc66ac5044f +6160,d08c3631e19dd32b79c771610d8302ab +6161,c37ef8959e4d29ed004f5e4136725137 +6162,b0959982821ca94191a048bda44d5231 +6163,1957b66e92a4678cba4c9d73cab28d83 +6164,f21dfee1932473cc43fed4eb184330b9 +6165,443251a6d647c5318c06d4047d8055fb +6166,855773523d40496b9a692a1d84d3fed4 +6167,97e0d9e4043941321d688631a251a8d6 +6168,bcc2f98dbb97a92449454a60a01823b5 +6169,9391fbe698d706d9250d1ce64ad3a400 +6170,48ec29e3e54b797dcbfa897136717f8b +6171,ce3254e33fed0f0136d3c30cec2c8e65 +6172,a1a52bd4d3f103d75a05bd03bf76e2e2 +6173,7479612f21b81b0df553cc1fe49d025e +6174,7468ff8ae7ba6ac275ff700add170be3 +6175,f92782db18f85cc76cc3b56323c84aa1 +6176,45113aa36d12279e3450108f63eeea9c +6177,4bffdd101418ff6a9977bf9c0a6e8fe1 +6178,b1731235b2bd5fc6dbdd999cdd0ed1d2 +6179,1f5636ab03ecef03cb30f0a5a9dd9d13 +6180,a58fb599aa6363b175d013541466cfda +6181,8d84541edc0a107e213d6fcf374acbc6 +6182,fc40fc51c30473eb84cedb6932b4db20 +6183,fe4c9858ed764edd7f4535608a199a4f +6184,809dfc3e2c99dd59cfea065acc137c62 +6185,4c21fc1ba81179eca119bae8131caa1c +6186,67d7268b0e9ee9439a0cad8a3989bc37 +6187,22bc9892f6e1083c1c75928c3ac3045d +6188,8f14544faf0b81e1dc68e4ca8a7c9376 +6189,f6866a1a1b68d54d8c864c3e457985de +6190,ef924ba43ea25f47b21ddfe17e0d2cc7 +6191,7bdeca024399ffa85648eb5c809a1003 +6192,7f87999b36686e8720303fe5fea11c14 +6193,5e8d84dc63b20b63bf2e0882197a9fae +6194,305e9a6f716644f32b60421508111cb1 +6195,02029b9400a1cfc94d768691ef2160bb +6196,119b87d9aef920d0b4eb4360c47beb2c +6197,47258d77a066aceba8c150b112213753 +6198,1afd3f1ecbc6fb5721bdf37fc1cfc1ce +6199,4ab661053509b6e4616b616aba4652b2 +6200,6106d32bbe076253645b10c87990145b +6201,4aac9257e103cb32287571e5f4e56aac +6202,50096942e4fc57fed4269fac57892395 +6203,49b76088b553e94d8d8ca308280c0846 +6204,16aa854ab0e51d57edb01ffcc163ad5a +6205,71d72ff8759e375a92421c34e02dc300 +6206,c064000d5bd1930c90ef95761d857c2e +6207,811a5ace3ae994ed3129e209e650161e +6208,3731fcffaffda003dc86dea621ce9e0f +6209,e6125664ac1cf0414421df4ea388364a +6210,33934054bae159288c7e794b0e019050 +6211,6e739d0720a96412c9681c82c5f21bf6 +6212,ea35d2e727630def5b3e9ff0f4a4109a +6213,9bdd5bc0bd13be7b08fb34280eb42a48 +6214,175018b8fd1b9e7393cda441881b73f2 +6215,fa19fa3a8dbf8801a7ab5b5ee672045f +6216,f820c864687f9afba5f9bfa8dd923384 +6217,754adcc1cdf7bda6aea547402bfb1005 +6218,726a62f804871c27a9951af996259f8f +6219,16747e7e6d75894cc570927b1470d569 +6220,b09017900c71c0e5a7cf4199c25646ef +6221,6476a9077229d8ac3c55cd7649770f09 +6222,400724db5fc50a81df0369dd31162a1c +6223,c518aacb1fcf5cefd9f6cd5152cd4cd9 +6224,c374f6608ad126da7324e5609a14232b +6225,90e36b6d833c2b1754872273254bfb15 +6226,e7bc8358b68fd4b9b6ce95510413c278 +6227,8e26a3174d0dcce370b01473c272e077 +6228,7fb05ad33ee9415136ce3bf03750c502 +6229,51f4ad4c746260e58b8163d06c5699d5 +6230,9632def2cf174d7905941af84dbbc906 +6231,13bcd48f2ed703a7c32d1ecab529bd1d +6232,ee3dc4089f23a99e9e15bee0610b85f6 +6233,82b985defcd8e4db1fa351caadac1785 +6234,48c42eb2109f5ba845b4488abcc973c9 +6235,92e73f76913adcfdcdb005464df8006f +6236,e14ba18c71be67eff3ebee4eb6d11142 +6237,55674d3b4a71682547d22bbcd28a524c +6238,ad2e69d63a1deaccc1dd94bffc30af94 +6239,3feed703005050d12af53e0c0741fed4 +6240,fcec469aa3ba9fa901eacf3dbe4e49cb +6241,6048c9728a7950068f43a1b464e026c2 +6242,5d97d82182fae13b80774fd0aed2894c +6243,bee4c49d584daa5271321c9e1b5224d8 +6244,8f5de7d13b460fc15715277910a0c441 +6245,7691a9b2567360ce86ff3725e7564e6d +6246,1bbe71848fc8ae2c593305df10c51803 +6247,7c3853f783347bde359f1ec87b8057c3 +6248,ef1a20f8365a221a0cb9a9598c56be15 +6249,7cb15f02fd9c065ef0aa31f82d46e6a3 +6250,dd9920212ff8383cfa181b045d084b8d +6251,2fe1aad7262130ec07bee7299191add0 +6252,ba429458c127d0662bb90189be04b7e9 +6253,f36cb5478f45895495d784ebf097295e +6254,90447ac2dbf042d8a6b4bccb486fb8ee +6255,7a2e452034f4c6ac609143dab7db4f2d +6256,0a68d7f046bb18774245652252d752e3 +6257,68379072de16308a91d53ab69ac174df +6258,1be81605eb353d067e13220717cdd18e +6259,8de696ec63eb67eb6d83d78065668f0d +6260,dad1e2a018f92a15c955f2d2124d768f +6261,9c7d4306b6ed654e74728920ac02fc1a +6262,1b27f4e9382544c6ecc9de07ba30b64c +6263,30bdb3b2874ab935ac7a6401ee04f027 +6264,f21497c98ffa84ce522243c4c6b9db16 +6265,e63e9818319882177051e89b95353b73 +6266,95e5d4ad1545a4000b72d1654140bfe9 +6267,1848edf4d2a1bcc659d502ca55b4aca0 +6268,5d6fee1e180f7847c1df2c22c32ef63d +6269,95362d886d9f18750446b10263617f1e +6270,23baa17cd7f9e69c17bdafdbc0a3fd40 +6271,bb3b6d4fbaae19e5ca55b3d6ccd9a797 +6272,30adffa9b4996eb5ffb5c7945ba155ee +6273,8ee9ed2120539e8997a4456767fb495c +6274,787b2cc53847ebffd4754005551b3234 +6275,9ef5ab4c54e8d62ad8310df38a8d5875 +6276,3fb59972f4b6940cd5700f74ea9c97de +6277,674f5870d5215b92fc7c10b2874ae6d6 +6278,2d33a746a6385728d27ac8860069abef +6279,6feed80508bd77e49e2c5d9c7887f4bd +6280,5b7385ad3f199965fa2c222176c48a6c +6281,00e2d773d1caefb684f53aca279a716f +6282,2b2d53661d123e55c8a9def8d1a85e10 +6283,5b064ac1dd8d37e9b0ba4eb109da96b1 +6284,185eaedca38bb99afe1a4a90c87e3fa6 +6285,f41e3daf714b52a232ff7619b9ba6da2 +6286,bd79df19b1e31898e7d630fe1618b09e +6287,238b651818e91f299683f8eef2d59373 +6288,b3c78d57db188284773953f99d5a54c3 +6289,30817fe69fce2e2131e04d7ddf823b52 +6290,4c5d47ca36384c9b80a0b23a69a1aa47 +6291,2779f325b24a1963fa996e307ed69bb0 +6292,5fd61e041329f2df2627ef3c4979c7c4 +6293,54577875137c3edc34b8c6d140b397dc +6294,77f45a1fcf6040f243a845b8752e02ba +6295,8e79462c2aadd396f728fd2b098534ef +6296,a25abeb91ee0e1e832e54f0a52f3c816 +6297,04b6027d2dc920f8923d48807b78a3de +6298,33a7a3405723a0fdf02348c65ff8fbbb +6299,76550609517522067e1f658fd491cdcf +6300,148a3ca92b128a1b642d0f9025cc511c +6301,e105afd1dd0cc9125add061c392b9c2c +6302,687ba0cb150258d5abbb939bf3c0322b +6303,92936c234349fc080b3288ca638b6f15 +6304,b138d5919ba32a2506ad01f8c967fa3e +6305,b62f4614326d77261d7471852fb795a1 +6306,0a4d1dbd5d001a5418892dfd68cd3f8a +6307,5e627274968ad4f5e9c196a656629d5f +6308,daa7b9c2c8bafbfbf4aff460b896cd1b +6309,3b31b208d18212b5aac8edd9c9088fb8 +6310,513c5a5fbba44f3ea903c433c1bf3007 +6311,05fa55f0b8789f62d8776f0209508167 +6312,6f1ca2a5d8c25ba185c54195532f421f +6313,b62877f8afb958456457183ff38b5976 +6314,2ac09b042d0a8753b38d6b3cfe04489c +6315,669f49a4e4e64ba651596a5f1bac3d78 +6316,f9fa04b72aa3f56258c9626454bc4079 +6317,0d5ab25befd570b8dc229dae6bb70870 +6318,9aa3c440afa1914e549e217eceb4eb16 +6319,3130265a4be75e014535293178c9fddd +6320,22c8875c30d7c49257a8d5c387ebc860 +6321,13b3cf8c6950382a7dd6c3fde15820f9 +6322,4fd0154af75e0c02aa91f57077d4792e +6323,af48c7b8672d534b1d47a10931a1a510 +6324,16bca4ffc1d947a6b69388976bd4112e +6325,d4976b6c1cf85a4be83f506b42201afc +6326,24ad6c3e58ed338a00fa83365fdf1fe0 +6327,245d694a387901f760ed0f23d763421f +6328,621123749aa3c4bbee55da0455447887 +6329,7b68a67d9bf8cd439e8da74ff3920370 +6330,d12e5adff05ed3d683644fc5cfd13be3 +6331,10f2f42ec125d472ae243289ccb699cc +6332,49094cad20d58a6ade60e4d56ea883b7 +6333,efc3bb2877f69ec77002db53fbec1528 +6334,113493e77dd2246ca364f34a2b56ea8d +6335,6afa971866afed2b8c2cb410c30d3879 +6336,de1fb231260976a8e12aeeefe4c1744f +6337,70a1237de7aa5ae7bb7f826e22ef2aa2 +6338,0ef06e587ba5185dd6b8fc9f709cddfc +6339,5d8739213e15aae8abf1887a9bfec0e0 +6340,fbc458359042fd1abd1298f98a1ffcc6 +6341,63ceb3ab9a2173ded74b171209c83097 +6342,2a388b62fa876dd3e48e7fc834108228 +6343,d16bcaf9c352bfbc0aa1eb5bc0caa631 +6344,83ad9df81fd08a0399499a5045f47ace +6345,759ade6ad0243cc89a49ef998d32d4a5 +6346,aa17b0061f3022e310e19be441dc3838 +6347,e6428ea74c45ae68a8917b368367415b +6348,716a05b445ab21d14ed2bec1db6762a4 +6349,502d2fd231369f3da0ad41f8f5ce3cb4 +6350,31755ac2e618bfcc919b676d37f6765c +6351,8366c7c5084361d17e5c8c7b16586c41 +6352,b2716e2fe31e909f13f796b875cb2d4d +6353,f8223ef223868d362e073d5c0c7eeaab +6354,832ab4f76d169fd0e40cbbb8beed0b65 +6355,baf882d97717b3dff70fcc4756614f66 +6356,7fb46a7a8ec761c18e65b1bdc06a767c +6357,8f2c5e8eb8d0b263e603ad191bb8056d +6358,bd9291d9906b401f122ca8c9b1da49fc +6359,8d002f432a5d68935b7bbec5d37f35e7 +6360,555aa0f00113ce717ec3399289d4c484 +6361,eaf48844fc8cfd415159dda451055f3a +6362,49d5b855ee9f504fb4b879ded5c7051a +6363,0cc0dda56de21c10d2cf670f5b0a200a +6364,e67587d38b4b6eef438b1c20c5a67c0f +6365,4d73cd067f0736205a3a0554ab5df86c +6366,56f5b460db0f2a8ac9a9b9382f75c12f +6367,6203a2020be1f67e9afc1ad86be246ff +6368,2b6a77c38cb4bcdd2ad5be81c14f501f +6369,cb098364d1324029b64566ec2ceaf908 +6370,e9a07919c4799a2180e489b4ba7ad2c4 +6371,0a3eec364874b784a01f697d0e53886f +6372,8dd95c92a63f6ad1818567e27513c770 +6373,2d5599d51bd4827a35dc6e478fc4d0a9 +6374,28ba662cf6b20037b0345f60f314be4b +6375,c45fd6a940458f6af26a6b5391e2258c +6376,a0348b79b1c20c3f5830ef0a6701c168 +6377,47d558071a69ba4d165706db612ac8f1 +6378,2dcefa13acc75169714db982c1252a5b +6379,50230b888bdb20b1d75cce8525a32db9 +6380,e0b706fa669ab7e23ba8bec5a211a850 +6381,e42c53fc3ef914e753713e3e9991aaea +6382,db040d4b9e660d58c25150c063aef5d0 +6383,17d21be1832989b88efcc5bf82332ae7 +6384,a29b9a9eca531a90ffb537117c3e3a02 +6385,d1cb7a62b5022ed50446b2ca5431b7bf +6386,66a0d7aadac24f53e904c6a5552ecedc +6387,10b8b57de12a88d61020a269b1f67406 +6388,11699e930c7cffc00107cba20bcafe89 +6389,6e50a53c6a43d17374da5e4e7237e415 +6390,e0fd0856ce888b90134667527f663c6f +6391,c60021ccaafa376ba5b44870ce3d7ac1 +6392,42616ac95dde93e418fcb7969637a430 +6393,381d2a7750531983424eeab7aa1b2910 +6394,3bc007317a2291b279d18c31600fc346 +6395,24f577bb3163854764d71a4d3706d4b1 +6396,efdc633d2e4d0d32976a0f2e53e079c0 +6397,654202197771747d41c0d9c8de0cb3bc +6398,b3516b47b3cae924ed090ba43c654e7a +6399,e71e0b7efe97169d3c469fff6e5feacc +6400,f92338b2d9aa59f6a2ca23502d8b8f93 +6401,dfae45ae8725bf34999ea3b270e0c54e +6402,a8d5f74e4f6ddbb79b3d419e989dc836 +6403,39e78f55b9d17ef756e5d698c41e17f3 +6404,b5dce55118b13a1b23e873db6e94ca6d +6405,55b1f90646b02a280bc372f3885d3938 +6406,a22bfbd543d90e8d1fd087be7e31743b +6407,ae1a27109c7edb9c0bcf09101c5a7b8f +6408,9754106fe5c67fe8f10bee7254f83bf8 +6409,a748f8c9c246bf5e62378c818915724a +6410,2a03e26c92d2bafeeb5d2a9759da0b40 +6411,9bf566b55135cb9d384ed68e3dd3fb66 +6412,584fc435141d47a76f3e73614a0277c1 +6413,ce940bdff03d6cc6bd4a22d71579b0ff +6414,f65591acc17d63445b134c5818246cde +6415,b11323d9885ed4ad846b00428a24ac81 +6416,fca60d44e495efca081738475ab21b15 +6417,0039cc6f4a1892f32abcba889e415f05 +6418,ce1ce917698ab307fb2b1bf398b773b1 +6419,347cda80adfafc7d3ddfc6e656e97424 +6420,12b9da1867d415e2edc6fdf27e3b432e +6421,7ddb8f05eedb6fe59384b2fccebacd0e +6422,8a94011466df193adfbd14ed22d02e2d +6423,87a0cafc5fead6a16293ddac708f3dfd +6424,ab8da0df1dd73a2c41fa0b45572abe5d +6425,2661b5cee86180e9f74b5bd7809c045e +6426,0fcb015bd7f712a518f72b9eec115db6 +6427,80c01d9c9d5fb0a95f9214c44d211a07 +6428,1580ced14274a424f78c35fcf0a2ed01 +6429,4e06c55570dcb0d2525cd46f6db463c0 +6430,ec294f740e9e52e5f8e3c03fd02ce77a +6431,bb7e174923b1b4280280e02dd18948d0 +6432,795d23aae492e37139e40cd83c5656fd +6433,add27df2917d7c09cdf47624f680ee14 +6434,4d5154b90698c589904e622192ff3b73 +6435,7c2e212ef05f9a57a12b98bc1fc0abbf +6436,67a6835929269560aed035f3c5e5bf52 +6437,ebd3b93337cef024539efcee8d5debfd +6438,ef587763c4faef81b65c78beb50f7ad2 +6439,89a3bc8736d2b960cae5f8282427f43e +6440,15ff4abe6f3f522e12f584b0a26c5c22 +6441,b0b965d4fe969be4fce21e632629292b +6442,e4d1d17068b70576ea00a1d0ded92971 +6443,5476dafa535ecf502fd3fd9a639fad0d +6444,97d9cd5ff26fbe164f3322a5fa8c305c +6445,2a8cba99c30458de48d3b9e5dda1ec50 +6446,1bfa0f28b301f039948b7072bfa8a220 +6447,f8591c1c2ed206968a1b7b04966a5c9c +6448,3b4fc49cfa174761c7c5bb3ef779162e +6449,fd5fda2e04ba44e31b83c29811f2dca6 +6450,f8df18eec7e147c2f082b16edca44ae6 +6451,1a805b7954106ce746e3f88a4541f3a2 +6452,18edd80ff119282a0d91a548991d0222 +6453,aba4cab6f1de5579f1c8ed453d0baf3c +6454,15bd85ea6e72938dd5a29e587c75e405 +6455,041f9a93b5ecd57835d9d6b8ed3e9a2e +6456,b23159e1ec7234037103e8c199477b46 +6457,9a133fbce27e61749f7d8cdf602ae238 +6458,7c378a0976bbbb870385053e9d1eba13 +6459,2536413670f129a21985098ee3857d78 +6460,615cf040c978e5b4644382c88309d213 +6461,a191fa3ed5fb9309e010d33a62537915 +6462,47cde59e198abc63ee426b2edb40779c +6463,f773ff1dc28d729675ab7b8983970e92 +6464,da2ae719cc2d3eb015582ec058424a23 +6465,dd23c46df518c8193e724e6899209cbd +6466,791fad9db3a4e8da225e111f11559cdc +6467,7aa2e41550166838cc53fb5b08d8a7ee +6468,63ab1fa8ddd635e0aa578879d76f94d4 +6469,e57566f0e4876b7fade721a136398ca6 +6470,09ebe2ad5c64056ca7e5298c1bb95401 +6471,c6d6ea7ed264955f81991b00313f7cd2 +6472,b168f7e143abbbc82fa62a146b7dcdaa +6473,bf1a0d476695cfb778970aedc95dc1df +6474,e421d236b6dcda49820d82adc22a5c67 +6475,d352950d6ab32387166efd995786acd9 +6476,809d49d24c764e08207eedf5221eb6ed +6477,33e960c59650f1681536a1fda62f2066 +6478,90d1cab65d61d4ea4679d4b6ab093a3c +6479,d46e5fbbb1d70b662ee92214bddbf7d4 +6480,15a7a541bef47a24545bd1e0a027ec9e +6481,d62d2e22447f022d89eed0f84614ae83 +6482,bbcc44de0ac5580daef94f6cd3015538 +6483,a0504f7d6eae794a18b7d2cae35de8ee +6484,8c64617a6a2945e77495a3b9f681a900 +6485,d3deb29c868892f5932e9875ca64e60c +6486,22033f640f0372a53553682f536285ac +6487,fb67bffa4cc2e2d92379c13a542c6e4c +6488,e922f488eaefccec7d01527da6fd3e29 +6489,f9d531cefecc5ef3073d26bb33eea22f +6490,eb9dde2f52160d6c497a018782646930 +6491,162971e2a3b32a7280a8077c1217fae8 +6492,8e1932e2787dcc024370d954aa3a6f14 +6493,04b5f08f6c0d5ce19becbac4d07703ba +6494,527403b738424ee38883b9cfe24c3894 +6495,40aeb3d873b1b2a36903580a5bae3d52 +6496,3449eac14df1d1dec42ef7dd712fbd52 +6497,70d3b188d1fce769f649d1476d5fa617 +6498,7db737a74845b7a2dae20202f2b12903 +6499,56e7d5ce7847ac79e77dfd821b79379d +6500,c05b40f767075d427d9d725ba69e7757 +6501,df89baef2a13bd3b00bafe28b35c7367 +6502,e5c459fc566649759d9449c5ff43d9e9 +6503,7f521242a1642b70e972086c587994a3 +6504,762fa13d47153dd351790ab9bbc39156 +6505,6608fed47979a571456e6c059fabdb12 +6506,80c257c2db8255a6ca7cc5770c2fb495 +6507,365f0c39a1ce876fbc51a4f6402977ec +6508,0e0b2beceda9374d531ad56885fa11c0 +6509,5218450e43e829f8f5d580d318c6d7bc +6510,cef2c41d158651bd67cefe2ac726dfd3 +6511,af9988b9c5f1fc72607beb331e4cee5d +6512,07c88c679c3101b37bbc545f85b53b46 +6513,8193319ce72cca694f813276b21b06a8 +6514,dce9d6778ae29c3e3a395743970177d2 +6515,7ad5307755d3e918e2e6ce395101ad8e +6516,21dfede7c06d4a52571b6018fd535794 +6517,12b5d77e2d51b694c952a30c43584514 +6518,f2b087e630f6da28bd063e2ea74c9fde +6519,ac7b383df2219620ddef18d0637bb542 +6520,4befd320e6e886ec70e45a62c8562090 +6521,c7bffe6eca38752acd8555ad06b74233 +6522,9d46c50e42a36bb8eb6b40a379b7bf18 +6523,9d102c862acbe24ba3da84e69cc72bc2 +6524,a5adba54c24590349dad67f2119939f4 +6525,1506704c892111c3ccfc61373c1f9b2e +6526,26378230e171b502e712d23d380df356 +6527,012a3350b1b1f1fe6397c745583a0bb0 +6528,dd15187e2ef72843c7a5b9bbc6c0183c +6529,3c58db6742bede87c92f6415a5c87c5a +6530,50a839a7f31547686161951a50c052c7 +6531,08701a8fafd3b867c8065df37cb943ac +6532,32db554f3a44984da725b15f846d7272 +6533,32a7935f1acabe17b215b0368ee85283 +6534,12eeeec187ce2c65eaea1bc177b24125 +6535,e5e8ae9a1227eda654855584a8576e96 +6536,01cea2270e91d57615ff11d6db9d5051 +6537,a597bea1be21b8e0c3182c04d9d871c5 +6538,d3550294c73eaac9413f89fd44011e7f +6539,f76d22c75c105b2aec672cb8517cc02f +6540,083ebbafbb5f863c310318954d7d9575 +6541,82aec099535066f4c38951f7c1bbbafa +6542,7646134250c8ba760c2f4f113193d99a +6543,eae10230929d038550295f4e2298faa2 +6544,7e7cec2217f0c0202a1f2dd078a5c7f2 +6545,f65efc0064e7d63bff8d1518f402249a +6546,2ffa4e90418121b08561a6f80ae97a0e +6547,5179b6ca940aea439ed053c1091d12c2 +6548,a7ea5c51221561fbccc2dd9556938a49 +6549,4ee9bc7f3f51f486d6593121ade486a3 +6550,1cc21092a544a37b984a55ff1ccf39de +6551,226849bcf089373e3881861f1cabec00 +6552,2b33229628594ef455c6f50b7ba0d821 +6553,e8bfa8784b0c8ef81482fb964c3767a8 +6554,6409b7d921a3670226113f1273fb4fea +6555,7f5517e8e6d77bc3bf741365b5505c65 +6556,bbf7f0050ff9ddeab4dd918501c09130 +6557,4c0452d867770744424e16cb3b698c7c +6558,c227f81c7d8a730673ca9846659ad0df +6559,9e060bf6acc4a624dddcb4253ceada67 +6560,4efa8fa9739ed4eaa97e376cf53504fe +6561,d8416db9dccd18caacf38e38b2433f9d +6562,9477b1eab198cf3b0b4b9f3ec53fdd8d +6563,0cbd5b3250c54645cfa9d1ca53feda5d +6564,c7e1764c3ff273be2bfd4a81a14d807a +6565,17ea9237af92b9ef2f7831a4ff8837b2 +6566,36e527bf3c87c616f826437692c8577f +6567,5b990b2475b3c8e51a729c67b85ea2c6 +6568,f48f6893b409993d83f54d465603500c +6569,cafbc049916a8d1f16748f588472f051 +6570,426492f5bbdef04cf00cb71ced893d32 +6571,67becbdaee8dd5b7f543c3cd9cae3e81 +6572,63db903f592604669f2bc4a5159d80e0 +6573,e2a8d065f49646fdb5f1f80850a579b8 +6574,d2480d29732937344745fae8c5031c85 +6575,da43880b4f9d641b3a58d390349dc6dc +6576,16e8bf369de63e3746da9f10bb5023a2 +6577,5c4804b34c1ed1a65c25502c24238a8c +6578,a6bd8988be8ba4731103d9ab9a46d937 +6579,dd62660d8df544c287c46d0820b48690 +6580,8c5690597278eaadcacaa529c248aac5 +6581,310c5cf63d0a262d58bef15859128ec4 +6582,4da32b27022f34ef2f4c4d52e1773ace +6583,7eb3e3a0eea673826d60ea1579eba607 +6584,44e39d439a79216509439e54031515e0 +6585,b74a5d900c1822a13e1f5f3bcda991b2 +6586,8a0b9815fff765726d6146f4847f2ea3 +6587,5b4ce13ca881b5230e73ffd2b2cbd948 +6588,06cd9b884ff1a2877ecbe9a8178c5649 +6589,7ce420199894c566923b5cef520b6dd7 +6590,49e70473f4d515a0c735eafd6ee679df +6591,9172041595ac1a4909c23476a46ea831 +6592,aceb0af4b189f4f045538b3b6f8a56c7 +6593,d0ef9b8ad7e291c456d7d571d8226a8b +6594,52fe4d59c9353d2b8c55af10cd966303 +6595,f05c66c31cd792f247c91095601bfbe5 +6596,aebb9f4eb41bee9320c976247cf51e86 +6597,160675aa19b08d3131fe0f34a3ff7e28 +6598,225ebdc446cae436c444b33aed0b4336 +6599,ab85c5306f4e39e0ddd72b43ba002723 +6600,da2939fbdb99f9c6b4a4e7a52126d3f1 +6601,74811446d491b48a0fc2e0453fc4dfe0 +6602,442adef1a6b6c70a81086c90beddf2b6 +6603,3ee4d3353b51a02dfb01ae5a2591f338 +6604,e86f2f6962518fe8edcf7204e6ce334f +6605,cab053ced7cc0878885c814a6b9b9ba7 +6606,503b61df23f5e5cb4f171d1d11681e65 +6607,d0a6a431db528525221a53422af96f12 +6608,42d1e851ce68474034bacf75158ca8d3 +6609,5aaf50b7ce953ad5499a1cc6e67bf4a1 +6610,e2bcc15df3b043324e41c38f0c6d5160 +6611,6f857b332419595a7bc62fcf8b7f5bd3 +6612,aca262d26323d9758c2071f91b5efdc9 +6613,9c71661439049b5fc5520aca5cbb9274 +6614,ff5269f03c90d2239fd6c8a0f2274217 +6615,b7582e665e9c57ab3749d017c0d8e68d +6616,e6358a78a3231a9cf3796eceecad33ac +6617,52d5e1055057ce77e0a232192119842c +6618,9deacdc8100058170430ab179f6ca967 +6619,cb7e80a50396dd65878ba64405bd3d24 +6620,d9d026023033ebaa41f890b65ea8a24b +6621,d9ee7e851a0e4ab3fc6372ebcc47886b +6622,ae455706430fe20f8490e9a172c2d575 +6623,ead16a9e2cb5d7cfb583999de156a6ea +6624,6a024093902c87be53eeb61af0a52771 +6625,3c111d87aad9dcfd3c788ae581a00cb0 +6626,60754e01e271729966dc5e21ad9c448f +6627,b8969e0340b3797b00a48d64f4583db8 +6628,618a367c57ca11e4b952316f28c2fa5b +6629,aa1bae13154afafbee2163d94e31f910 +6630,24592d500a4473b6c411f9f85952127d +6631,c24f4fceb34333644bf70340a8aca522 +6632,588d1f52cefec5f24c01ff8099d2b270 +6633,fbabb996fa1761559172f92c166ad063 +6634,64a0998f3124a8836b1cf482933b5cde +6635,47c39b26fa2492e88df307b0e0f97ba3 +6636,4ec74db129b8e15f3178649fb61f315c +6637,8ca012550522d7bd787f8b1a7e0eeb72 +6638,1159fb47596e8cfb70277ff3ee83263e +6639,d2f1603a56bdaf3c1fed05da8a61558b +6640,68bf87ddb168c8ab61568148e5530742 +6641,44e8462c766de226632f77051969dd63 +6642,306ee09edc863761c389ca4d246faede +6643,80ad1e0a2c6aa980ab74003eaff5a4f5 +6644,36c586a6d62f9f367f5af5835d77c071 +6645,de8b205e6fbc0ffb37ca43f6afafb98d +6646,2f31c5dea722d7cbbe31d5a971851ad7 +6647,1ba2093755d55210510a4dc2b81bbcda +6648,2e26f5c6ecfc12df50735b5e3fa2df2b +6649,fcce299773fc9355b87b732229433c68 +6650,c04c30be0889a1e042fb1b71bce6e971 +6651,5c20567f12d5d40249c174e94396e3c6 +6652,2f9be5806dc64311baa4a6bfeb8e064d +6653,a42f69b47f4e91e60703cfdcfeba096a +6654,a6257f6ac8a08da0c8de6e71f95631f5 +6655,11f358dfa3d26475111395903e5bf616 +6656,dc448a8809340712e6d7ee61b8777c45 +6657,6e1c0a28e8b624c8781e89eb5e86f2a2 +6658,24cdbe0f86ab554e8088a6c650bdd2b2 +6659,0615b29091615a04617a6eca2ed19a67 +6660,6dfb2476aad41367de76c43bbc1a7525 +6661,a27d6e635f1b914c5c070327517f2fa8 +6662,ced52bb48049856fcc1f60289ff056c3 +6663,bbad1f1527a5771c3d827707c2bcaf08 +6664,93617e3bd8dd3385c2f8d575138a7e83 +6665,31e92738f52c60c0b8957d8fa7362c49 +6666,a55b9c71e2a93c235863f09fb75b1f9c +6667,4fa3058bbd0673cde30b412e114705ab +6668,00edb6f09455837efa61d53cba5cfd0a +6669,f5a9479d6c9c3c3a81bc04d40cc6a0aa +6670,0d503635d067a1621bd34b9797b8aeec +6671,aa43d8942bee9b1c1838de6ec24218dd +6672,7b6b637a2849514f46820f61c64f9aad +6673,c3ddf9f4bf9b4393025c2e8862f18524 +6674,9daadfe9c09e7aab69faba644effd787 +6675,b26b2d2418ef134aeb7185d0494713e8 +6676,34240055607132b38b11809a6f1a0f95 +6677,fa83de0f854390d2783d1301d0f15188 +6678,55216607ce6775b0d9974896099f80ea +6679,65cf36cbc07065701252a91ddfa84aa2 +6680,f3dbf0ec5ef584eb30095e8444f47e19 +6681,5d491d4c6365a39c32d38800a801d371 +6682,d989c593d245c6e05a454a095dd71e9a +6683,4cfb7ac3f8f2a7d9e32426e75f671d2b +6684,62fc2cac88ed080fd541cbfef6fc2fa7 +6685,88ef2ead17845cc71ba0da5271040c19 +6686,f488303e34f343b66f88ffa8c77a5833 +6687,c6040573336526a7c7b443411f7ca4aa +6688,581e6cdb4c2e6462632a1a0d183d0506 +6689,c8933c7c51b5c79093c4ce02c07eabac +6690,2872518b3110f9aac67cd731c81351a0 +6691,2eb3c6172232bad58347b7b8b0fdf5e9 +6692,1934b26e689766ac91856649ab691137 +6693,1f0181a493db24e20cf5a4a7b06b6712 +6694,47d9abdc48029ad4baa42fec708c7fd4 +6695,37bb1a411f2e46fe44516c1770913153 +6696,697af23b1bbd6e38ba992943550703f5 +6697,7589a2db9da9cd7b1a72638643ecadf5 +6698,ea069b2d89777741d6340bca31932b12 +6699,cf4d5756c223958c6d9931136d993690 +6700,8ea605f34a5ce929e74b50793b995b01 +6701,3225adefa7eb0b0069af6f27d068edc6 +6702,14c2e2c3f7eee1be01f0e0863480ca0a +6703,5b9fb0cee25b14cdb213d5eea60ad604 +6704,6ccb185514eeb115d2008c295f216765 +6705,4b9c6be4cd467243ce65e9eb00611e49 +6706,a98dbcfa75aceca0f76f7cfca6a88277 +6707,29eba52bed3b9e031a950b4bd09311af +6708,adaa8fa8856cec450c3f37bdd63eb63a +6709,2550e89c6f50f4e52e3412932443b0b8 +6710,048fc22ba899ee5ce8f812a22cb04c87 +6711,91b4ddddd7fdc51e644c130220ac7e4f +6712,5e46a30760a6c545b2e08bf03466e9cd +6713,e4c7693a15ddbd2a3f02166e2861a157 +6714,af2b8a3755120ed3f49f871735d0df66 +6715,cdfcacf234cf43171674aa303c10f8d5 +6716,72f66f6d88ea22a068cb417b159668f8 +6717,5bdf31157319dfe669dad18a41dbfb66 +6718,72fab381240f63c39ed5792f46be65f0 +6719,22d9ec5141c082e762ed3bbdabd89301 +6720,b9bc20542a605679394c24663c7916a4 +6721,fc10894f435ce3597cd00598beb7c8ca +6722,8e262f9064f7f8016c294ee81bbbed7d +6723,aefa69e9ac46ec70b614db8cd5c395b1 +6724,f6f428db7b37e27e48346785567ba749 +6725,9f2e6f08de37cfa8f7132bb442fb93da +6726,8ca31ecd1153b37c42432a346903204b +6727,8e8d88580d94a83f9db2d73f1a722d17 +6728,55761c0cce41f4dadf5dbbb8129a37e0 +6729,206cc5fce3cddc8d6efced8209ba7e6a +6730,8f4328e40dd09e403e1cebb6719a8a03 +6731,2cb784cda10bed19ea25593f4f40be8d +6732,8f0deeeb9505fb4428edd7935c2f69ea +6733,f74533d924ab6de7f09748e08d3c2deb +6734,77b41bb7e37e128a228d5d8ee358d788 +6735,834bb9137a5226ec46d4796f1fada240 +6736,5ec0b976415b38359b19bfd054cbacd6 +6737,9d8f1ad12dd1b77e8131caf4fe8e4860 +6738,048b4d664ff17b8079f5335a01717ff5 +6739,f5d881504c3d1d24671f87e8c7c3167c +6740,3639928af4e91c24d4bf2ff9f8e84e94 +6741,e92f87af9984da0a1f91508c2d6bece8 +6742,91bcc8d56aebaa0711420fef192486e0 +6743,a7836e89e5b7e0d939b2dc2b94f8e97a +6744,cd3cfb47c803e3e70e201307b8ea355b +6745,9c61351da6b9f2b056e15ea497a70767 +6746,5e29d1d172d8e08a7a24bdc5dd13487b +6747,19db40412d007fbf3e6e9db77df59c39 +6748,b4fcadf1af1a855f41859d8e00d835c1 +6749,06c6493c6b2215b508da3cf6fa82b13b +6750,bfaeb7b226365d5d3c4905f6d93d365c +6751,65c2c5c8b47067c190b71b88a0afc5ef +6752,703dfdb346e8838db3661f789ce17c88 +6753,3a5b59841cca271c73c542d327123dcd +6754,0b661ee5492d941e59bc835c54b7f9cc +6755,a2d61b4445c01adc7be621226bb57737 +6756,c4c31c70221be9f9f59e169496eae00c +6757,6cff0bc7bf25c9ab9f7c3af35c18fd04 +6758,af31279d5d0b7c21a44b4b97fdc9a23f +6759,812d18ed543dc8ccc71f58838ce68f3c +6760,01549e71a5867ae4271f9ce3b4d93adc +6761,44172a8e9dab6284d66e746104133fde +6762,1a0de112e9bca57fe2b92efa38d97d67 +6763,8b3c8ec2606d80061dd6246cecdbdeda +6764,3e2cb8997b4355f495048fba3e3e083f +6765,e00f9ef1d66ed0f3d0fde8c95d1a8efa +6766,076123587f2f2cc0878e34815591406c +6767,1f5f37b623f22041a6f43d9815571d23 +6768,b76db63a9a14e0638d09f708f9bf5c65 +6769,b59cc678eaf496bdac233332cfe0c934 +6770,4d7ef5d3ea2035d66692e9f5d16db8dc +6771,a98367f2a6934942250bd4f58311b656 +6772,ca607ce19b2c5e9ca686982345117ad5 +6773,30ebdd7d1355c3819bbee30a856f69f3 +6774,e7b38ff13be2367bd269d741cc81b311 +6775,262e3086762a0cf13d99deab2aac743a +6776,b0cdd26fc75583105a22c73273cae9b7 +6777,3d28fa8a216e424d7f8b075d42212d8e +6778,5dfce3c91feb9e63c8b31be7fcc4e7e3 +6779,9aad77d430ad1358cd881d035d317c26 +6780,2299d2a97e43a3d65d862c1e461b22bc +6781,144504ca61a633444cf39f7168c07c2d +6782,41ec918c6f3bae8f80abef1a5228135c +6783,ffd3c39c99331208062b96fb95d74fcf +6784,3da0f6c48a4b02195ce172f65c94a61b +6785,bf555423ea9a05b2848a062be4168048 +6786,e40aad27d92099c48b4e5fb3384192d4 +6787,027c0882a88953d798d62aa557da6b84 +6788,c13e50db4b0c809892f3f65a012d333d +6789,8268ca31b1be5515a64f80c006e6aaf4 +6790,39e9e4fe293dad380b2422a411d189c2 +6791,65c6c050ebebbef18802dcdda55081e6 +6792,f7568e86668d784c8ed7255a18b1a95f +6793,db86e64bdf7bbb5acb23c661fff1ac99 +6794,1da91add226ef39d5ccb230bad232ec4 +6795,a4adda9127a2563b7fd7c86523757922 +6796,76a591adae277b838fea2ce3e85f7aa6 +6797,244f3f443ea0b4c78633c9237a29dc10 +6798,aecd8494d7bac3f8b153016c1fbb1a05 +6799,dbe7931b048f930df1f99d8ea2f5cbba +6800,1b36c623b2a92b6a128c9dac87195714 +6801,17fe57564b2a7585c7dd63d7d120e1d6 +6802,630384f0bf526aa6e231a9a96bd956ab +6803,b66f0989ecd38678334d5ff80e68a306 +6804,a608673578c4f1c15c0f00c35dee8207 +6805,883d59cef32631568d5f1ae279bba730 +6806,1a3651b51d51e80700074b64b4dae507 +6807,d932ff29565c4a9c8c13ab425cb02b07 +6808,89f65fefe3f3e6bfe662c27619156496 +6809,fc992680ef51f9cdf82b73b65e0b61d7 +6810,65127aedd0bc6ce97c7cc0c069de8510 +6811,6bc00f96ad9762e4602d11e08c369f21 +6812,fc34ec0545a0ef61204a50a21c107010 +6813,8f57bb3ba08695078e85195dbd9c4dc8 +6814,ec5c00a6b3fa129f79d601f03d625986 +6815,96fc43ff805e87e41a8df468bcd717ec +6816,12e668093e96670728dd7785cc7a70bc +6817,3b9791b16a2e6740c1e1bf0f0d0387c5 +6818,46358d97fca2cfb682c4d13a31b941ff +6819,72b4fb988e30d4bd5b9a610f2b93fd36 +6820,c87272577d53d0ae109e846ab0c7041a +6821,f40aec531baec7f5dd408f3af5296ffe +6822,3a41e23671735f2c4153113b9086d64f +6823,be7f63af6b0449ec5ffb5a735ed7ef5c +6824,4d5b00bf08c4f48aad3a92a3297f24aa +6825,e71bc847cc2026342c26acb52d8e4eab +6826,ee71a574038b572b19328f6e17fa98d8 +6827,48baf241d7d4d8fb5e10baffc656e2e2 +6828,b2e56628712fa6a1f86a2bc52083243a +6829,bc900522607a3e8422198027db19acb6 +6830,eca2a674de5bdb256e0911204c3001e6 +6831,bee2912ebe005f2d6226487a1b6a9d5e +6832,0d9d38600cfa321510f1cd68421d86f0 +6833,bba8b4293a00f1338ccabbc73be77255 +6834,5b87445a0109554e52f314c936ca86cc +6835,75a569e8112306714c8244415e6449fc +6836,3e6176a5dc970a2e4fa894a0ddf3ecc9 +6837,4bd1fade62becb5f8721c547c3a1afa6 +6838,65020a07868adfc8005b7ea9d7642a02 +6839,99906c66afdf5a728220d3ab50522ff7 +6840,c880b69ed98359427da5cbc8b63199e6 +6841,acaeb17b01c3a9e042349675eb68110c +6842,764d5a1f5b2495ef4fe591cd4db528d8 +6843,0276953f4707603430111623896faa6a +6844,81d920d975c589a754cd0cd38ff77815 +6845,e01a172a10ef0875bb20448342220dc9 +6846,1d1458e223a59c7b3ca33ab7436e247e +6847,bd96529db95975d75ad0b143986da1c9 +6848,57608ead77f354cc858a1fc81a77e8ca +6849,8c353d07d7a831ee37e3cbe93159fe41 +6850,f8c4fd3767476678172ec76f8b935b73 +6851,6c28b807f8d35de9ac44f1821d82c1e3 +6852,064a6a6676c9f445026db2bfed136d57 +6853,70e9b5178173dc9ff152c8bda6f73990 +6854,8e9c0f0f5f26a542d88193ffd20394c6 +6855,5c109fbb1165895a3a28e2a2d4a1cca6 +6856,158fcfacb9d1d0fd3d17375c27eb5beb +6857,20b96d6e374c62ff47d6a94b4c3aa501 +6858,fa9510419b31c838f9de73580266db8d +6859,c94594b9fa3157bd0deb7277861fefa7 +6860,597dbeaf6741a95be4682835ec9504b7 +6861,435a63d494474d9f75a29f2312ca5ffe +6862,b707395062f9587148918bfd541eafe3 +6863,b8b054d30d3a604c0ced60ca05b9838c +6864,eb31c700cdfd5abf1adb335f77f459cb +6865,ec96d3f6d4cecfd15e4dc32550cce0ab +6866,0712d1317821d5bdd77fc7bd2162aa80 +6867,7aa3528a0dc2d701462bceb6abfb30d1 +6868,b4ed5df9e6c86e6e0bb247a5ca004036 +6869,f2626bbc5b7a02dca139ee63d108d1ad +6870,86dbec6b00e4591b231d86b07019f455 +6871,2c6d9d0593303c33f28da2881def7fa2 +6872,fa0e6daaf3d06a6e18305d6603e7a613 +6873,d6fc3685b7a953efa84c05b7d7648d5d +6874,a0ec6bedeea29e5b05dd8b1b3d6bacbd +6875,b955b2e2d4fcc61cce9c5398aadc930a +6876,c30c0d875d0375ac7d2d7ed60b33271e +6877,16d171c9105bc239223596eab258a58a +6878,0c2bfce78a54b3545edb828f9f48c608 +6879,c0833a78929fe10085757ae7121ed336 +6880,a05a201428d55d16d11776b8f92fe6b3 +6881,2255fb757083cb5a9b5733002423dd36 +6882,2fbff94fcd33f9f5aff3cc7b096eae7f +6883,fe7980efc78e1076b01ba78d0e284d30 +6884,a1bb4a4f152ac689a543df5155df48e6 +6885,a3f1a2dcc08c6d114cd82bde6e32007b +6886,3fba7f846ac0770e900d6d49cff2a4ad +6887,325aa959bf95a9ea54b81cf8680d5ebf +6888,b5e2030f24b9d90bca48438b83cbb8ae +6889,c321036cd324884d3aaceb20e837b7a4 +6890,0f5f0e22cce89f5329036690f80b13c3 +6891,27cd4a7a721d5c523d38405e28fdcc27 +6892,87732111ade41b9d0c0d5748f70f8688 +6893,dd6b5fc878dec4ea30b03d8cb8f5f887 +6894,52bec258419145f7838ca1ed1f18af43 +6895,5bf5808791939adc0d938bb36772009c +6896,da60000a52240bec34237b76b5a26e3a +6897,1def8c0ba6815695bdf873d0b2280a84 +6898,8b71a18d30a40adc553a868aa36748c1 +6899,72a06116df6279750638ba4089afc782 +6900,f8e28674cd6440a954d580fd90c29008 +6901,f63cecc5ec46e603555d26638b625cfa +6902,5eed4630faa0134fb6b1eac91b14d56a +6903,63d5346da3de6f3631618a943f379e6e +6904,b0cb88835dc5109424aeefc3e4018a12 +6905,3e9f191f58de22ae59242d3bf5a40125 +6906,9c8af814802186da7ecba71c219498a5 +6907,12f3fc764115ce3602004911de3760d1 +6908,8b5aecf62a194bdcb5036fe22c73e58d +6909,5e8012077ee12f8d8411acd8e4ada406 +6910,128f4f9430cc8a57435aec8a7a1d0c80 +6911,31d3729259ac0f871fb5a41715308a85 +6912,43a284c9874d3993a08277bae697e17c +6913,81f1cfd26c564228748d2780aa07293e +6914,e13d2256c223268ad68df56912a75e48 +6915,bfbac1d252f22be02e75df838fe38ada +6916,1bc5c55a59ba1931161506db1723e3bd +6917,e24769305a3ff1ebad15d18a259aace5 +6918,7bdf4f20922c5b27a41266bc77ddb453 +6919,fcf884944e4e441ccc1fa5542e2b0eb9 +6920,e38dd33d16d836453f5d08351c1d0407 +6921,711277ef7aa765e3293c4294ba500386 +6922,d9289375e56f99e95d1045c676117a03 +6923,692793c2a58c1d0fdfb38dcb130bcdfc +6924,c39c1a827ed925f0cfab4c6478e66317 +6925,65f6d5dbd94f3d206c6d2b3b61fedc5d +6926,ce51c86382099186ebdce6720ad3f56e +6927,7d82c2b4487deafb0183d0813a1cb059 +6928,81c3d96f1750468c628f72f0ef8ab991 +6929,9f454a46655e64aa7e2d338a9793aa7e +6930,3f52844ffdb0bb6ef88fb950a9defe54 +6931,ffe0726328cde9a9e9bcb79a497fa430 +6932,d740c5e3c7c557e25601c8b76e1a41f0 +6933,287b623714b290edf51a8cb4064bbfe9 +6934,7c1b5d8e9259f592f1d7d21a2895ea02 +6935,03c1316a1d3ad158e2470018bd84dbc8 +6936,a4da98742c1ca480443a5caffc2db630 +6937,c968ae6f0147585e346a0a9893328efe +6938,e8f8db6635835dc0161b71ee4a138fa2 +6939,57061f94a7a703ff7d8df294392c843b +6940,9dde72aeaa4e6a7840e4b70decc347ea +6941,d0781ec8c626f95d23d8bd9b5c866fa4 +6942,f4512fd8e54912f8e7c4b4a516e2af5e +6943,2bdc6368d1eb894ee54fe2769dfeef20 +6944,161089aecc8211dbd9633b0296e447d8 +6945,71047665d3d84c9850e62acd89501c43 +6946,8a9094313435dcc71ca413b4af7ae0e0 +6947,6ca3788f7cbb01ed2a896ae27adb6a8a +6948,cf980ee0bc5f217e9da4dbf9d4ce548e +6949,4097e2742ef19b4a557ca3159be45535 +6950,8e7580fca1d4b7f066ccbfb984e482d5 +6951,553af67d5954071b3ec511eb994544f6 +6952,a18cc8885dfad9c83acf3f45affd288c +6953,ad912c9bc63d1421e2ab2269578aaabf +6954,200fb1b9f50cfd9beb8ec0c1e8e51524 +6955,480a9a8797ef748d7d1d4cd658169f1e +6956,976fb8ef95ba2f6448b1584387051250 +6957,41580e80b8a896468f3845dd00f65977 +6958,ff8cbeb2b570082c479e487f96fb98d6 +6959,ed4af0064ab0c98abd480ee6a57552fe +6960,e503576d099f99352cfa96a21bd21828 +6961,f1e71b5ae9ba9fbb97269beeec4ef1bf +6962,de8edb24c4dec350cde3e9bd8df1b2c7 +6963,5f9569194c5dc658c628a4b51716bf54 +6964,2ce3c99ff45963da6df3620218b9ed13 +6965,b9d37e324575579d9dfeb3e16a270028 +6966,175ffbfe0a1d5149490b94f84ae711fb +6967,686615a6b8bbe7deb01374c55c8d6a80 +6968,e3d9d02d7ddf5cfdd143d61e37e5674c +6969,feab8f7d33c007d595ba6e40b3041f27 +6970,52c581bf4561abc6b859ce1af9c7d25d +6971,2c2a34ee7ebe0d6b3711d01cef4fbab8 +6972,d6bc6360e22a2376899f30df9fc967bf +6973,8b6fc4982c11646b82a12008bf80c5c4 +6974,7ede19d77cfbd93bca9aa89f957dc530 +6975,2bad5fe1569de79e0bfc0e810c48f264 +6976,842cc64410d4f64ad8dd400054c12352 +6977,dd399a9798310cb7ffbc8940c21fe4f4 +6978,0e567dfe7b485337193ac00075d70dba +6979,4f12afd39b50fd526a066f25df2244ae +6980,32792a349c12d59936012845cbf5f8ba +6981,0ae6332bc7c92dcb5bc26e20762bbbf1 +6982,02b3bbf6cd65aa8ed01c93b26aa6aa44 +6983,84ad5d342088c0af53474a04d593a39d +6984,a714edb5eee1287af817553b818b47f2 +6985,f9668b91f91c7c2888f4dd68c95cb5a9 +6986,34e1d69ffef6143985b4da110a1d7395 +6987,7a477824ed00f35c20cc602f3ee8cca0 +6988,7b92d324825c7b4df06b3b6d8b079e73 +6989,37dde747972584daa4f75cb68fef36e2 +6990,407397f9ccf468335e8e929e63df7581 +6991,2ba94c74e38f246bf51c544d0ae2b0e6 +6992,2b6856f8035eed5aa981a4feacfb0aa2 +6993,6ce4961422613d8357678628d839594f +6994,f0ad9d07469df738035c2188711252dd +6995,cbb4e1faec88ccbca79b0b98a2d04904 +6996,1a9e225ce24f66b800780111df4f88f0 +6997,11cb28752612c28c8ed9a2c58dab1c67 +6998,4a2797c8429718066758a802c99bd076 +6999,e265f0aba8ea9d315afe02b7d1180ff3 +7000,9ac9327ff62a4c3f958ca6f28a09c4ae +7001,56dba1e883b9dfbf41924ae132cebfe2 +7002,37437fad5df34c0994b6d1ad4f9cb288 +7003,e6078587be60ab02a82d8c2e1ad08e86 +7004,c5f04de778fe4063a74a015ee075f959 +7005,31adbd944b5046826fdca27314d88649 +7006,06f3dad99b6c5a856e8f8c78eb854a30 +7007,95f5c38ff4c9a48932acd5df4c0487a6 +7008,1fd1ee73922b2f41570c39dec6c21080 +7009,865c83c570c1fe7f8cd4210258f10b3f +7010,bd80a712d7f3d95bdb940f21c1ff321e +7011,e9e7b01f17c8ad87b88a88178a90c541 +7012,a07e4fb9a915113737252d782267cccd +7013,e310abd3f7bb07168d1f57cc6de6c05c +7014,c167ca4c06417e4e3c2fa1346018c078 +7015,86fc322741ff2bcdbfaeb9e77439ba81 +7016,4d0c6ca09644c2a8658403d6cee74009 +7017,a7b55fd7529d934606ff5146559304af +7018,393fe4372b20549f4496514b5b4ad442 +7019,657a7c00619f73f94ad49178ff0c998e +7020,4e184af0e991d0fadcb422c5cb9e703b +7021,5d4aff14b205d83d78b71b6a58ae82cf +7022,a69223c44574de3aafa28084abbf06cd +7023,9ed7a52aabab41198e9aa9d48082d2f2 +7024,03eeb7a61b6ffc9f4f1e5f47e24f0ad0 +7025,5159fde12ffd650fa3a98078eca21536 +7026,afd38c2c1ccab80ec3d8ae61bf77189e +7027,b77873a38bb2139911905e7121088b95 +7028,5befd79da817d17b5b423cf70c64b316 +7029,11391873dd7c52622f42081da9a8674f +7030,ecdf9911cf945db5da4c7d2a0a32e5fa +7031,245701626204110ca46846128d99516b +7032,e604c204a908208e2fc9fddbfb02c335 +7033,c24da7263ad8f35ef9430e8dc8601406 +7034,89cc2945b119eba0025d38159e1365ca +7035,8da245cdbde0e74f4f2a3c60752b4c8c +7036,980399ffb83c6eaa857966f6b1dd630f +7037,9f14023a078236de0bda18de62119adf +7038,2c38ff2ffc224f6793ba9e2ef0727fd7 +7039,3a1a56af96b8dea0d13734c82e7039a1 +7040,9b93c28b397de7a36dd7728cc497e6ee +7041,b37d4fb2983f24e3971a37087add8c47 +7042,2b829247be1768d3900005bf5757fbdf +7043,710cba1041ebe272c7006253fb8d334f +7044,537fbc5c854c77898e153bf61c621e2e +7045,6c60026dc3b90c8c8d5315197af8a66f +7046,15a56be482f6f9a3e81a47a2271d371c +7047,e92c4c513dcbd6c2093eb2132881699c +7048,8623a9d5389f462ec50a0128c9ff388c +7049,40ce796334fd70cfb08ef61ddda19131 +7050,1b532621967dfde21f6a5412c8d42e1c +7051,3579c7adf6d62970b8f9ff86ff1e73b5 +7052,661eab608d9f4e2254ffd8ac1cfec0a2 +7053,41bd42383250a5b162a27c5431150b1d +7054,f8b117d16e602558eae7873616f411d1 +7055,a494f1607a077742b2b0faaba9f6e4f8 +7056,67c1316e7d1cd0ecc3b5679f2373796f +7057,8afd6b804876cb76d92a7705061f5e3a +7058,ac40d316b4c59a9018d2160d407a128f +7059,bbdca595af5397c8f0292f956bbfe3b2 +7060,960a4f038c4574ecd524bde301a5782b +7061,ae6b452ebb0599591e1d4fe9a54cd2c3 +7062,ff73c669206dcc4da56a323198536fd8 +7063,27bf265cac1e8f1c65d249969621c565 +7064,7b278d78ec80b6baf91b9c0cdd87d889 +7065,89850cb5d5a15855ab419abb77c7bcc7 +7066,1ad2f8291942f0438729a123dae75bea +7067,d92bcfa068eed393f2e75ef75e1cf632 +7068,ae422dc0c9c3d622c57eea7615edc403 +7069,c265a68340d3f70b991fc1f18ffcd9f3 +7070,e78a5d2f946f74ef5a34b8bae9719290 +7071,7a6dd8da88a3dd475f03699a2fe8d39a +7072,b915a3b2b0b119e5b29ad97fb5a4bcc6 +7073,002a4c481baf5f8fea3ae59cae3d8a32 +7074,59c5d844095661ea0538f2c98f875b8f +7075,214683960481e95e8dab04efdc0ee8b8 +7076,1d94c14f682f64c9bea1ea2fec31f7ec +7077,7cab3736b19dd6154fb00ff770b8d7c5 +7078,2f3047d8417b99a693e3c45806263791 +7079,c49a012f7396c997b1fcb2a3db87cf4b +7080,623be8f5d93d1639d324608947235090 +7081,f2dbb43ed85720ab23a666aad2963240 +7082,1e523d3e0e94f2ab826c1fdae2af59d2 +7083,e41425d4a11d28f33d200fb08aed226e +7084,c4027ad37326db9cbeb86e739de3c771 +7085,e7c5a7d90d7f8f1b8c45809b7dbf72d2 +7086,5e8eb5c2578519de5913e31962d4646f +7087,696395aac74cf091673b26977dba6397 +7088,7160bc3c64bd762c21ca05c54ea75263 +7089,c6c072dc01ddd9ff8bb1afe1543a2252 +7090,ea82b0d1c2eeb031679662c591f83bb9 +7091,85c95c70bdb48eca4f35c74c49b089e3 +7092,25623c288d1095f527396d8f254055d9 +7093,261b2b69e7aeb46625eef2d1ab13b2d3 +7094,1c87b48c260e02b9295c46b81e661107 +7095,2324716a7f55c73aa6b99d5f3a1e4094 +7096,e5862e1af2a0aef422fd6c06d11853df +7097,4ee50c584639a6aa1f2753d44a1848f5 +7098,f48299641b4c312028506e0363d3130b +7099,16e2b0e6f917102cbe97e1c2c2bebca9 +7100,d3358c99543f57547f83ac6e67914299 +7101,f187cfcdc4ea48ed0a62fee3d1cfe327 +7102,bb87ba9d76cdeb936a15f905f507e3f4 +7103,0ce850016b7dd2e119da2da1ee196269 +7104,a71cea283f49b07d4ba7cd415e409f09 +7105,ab8c3b914a84039560e096e015a342ac +7106,d9e650f21090b3ec4c8ece4ae57b54ba +7107,a70d3ccec9743390336c3fa47e851292 +7108,e59faf81a5b76a80effaf64cad8ef9d3 +7109,78cdd865c772bd9f39d9b6850f9fad6e +7110,6209eae7ba86fc132e847b3fa533d534 +7111,b1ff6a48b12af67bdef5bf7a1424a749 +7112,9e17abaca95ef989d6513332258ef64f +7113,940af2b8975f840391123be1e546e32b +7114,044bbef187675f1df08472bf3c4193d4 +7115,050f0b097e5533ccd84a4f6c04ece24a +7116,94e230a4c125db86225842e2b3a5bff7 +7117,40ed835fcec7f719d4237bd823384916 +7118,c359b38564bc20d0fccf11bd29396044 +7119,6a1fdbde942c144618ff7ac12f194a37 +7120,0b91e3adc68a3c851970db3426d0b398 +7121,c91d64af246c2a00217a34c010508573 +7122,60f5a3a72b88b61506c69fd42dc7b2f2 +7123,3135b695402c36724d4a11c66594a085 +7124,5ab8eac2a59744b61f82415ef416f6af +7125,8e0dba307bdfc463a89a342900c5bbfa +7126,ce2ad176c37c36a0dfe11bcfc307a382 +7127,8cada837883b098c587fb867700c59d7 +7128,17f0d133cf9a2658d09e6f6aabd0b01b +7129,954fb06764f1f86446a197936967b6a0 +7130,5ee7b84a4c499291f8296b755060851d +7131,b377730c3688e259d27c0c8e3c5ccf44 +7132,972d25c41513540a8a8716d8b96d53b5 +7133,2e50daefbd23284e0d689ba0d6fde2c5 +7134,70ca39381e2f3c3f374927525b9d6548 +7135,f91b82643ffabde3c25b9a36875a3aa2 +7136,57812f308fe2c860745ce3ab52156136 +7137,9e4b5b7f273fdc24403b9ff720528038 +7138,7db9a62e68c61f8af3100ef39c108db0 +7139,2f3c1a20b4f6581ed781ac693389c08d +7140,311864d5056b99202c6e0a61acd1999f +7141,2c26cdfb4aa47db8a4f89d301d058d09 +7142,a64d830705ef33348e4c942e80683681 +7143,cc02e3eff8bcf6dbb7f38806fc6f171d +7144,9f0dc3cc301b00f1cf5c3410644ff026 +7145,2b3c3e4e35e003bbd90892ef5444a7be +7146,ca910e80fdf4e8c130f69f1f9de61732 +7147,05af63cff79dba98cbe8ebff84b922bd +7148,6076e48ed3e3c6ee99f07fcd19f16714 +7149,de81c57b28f2d7dda4c8f07cc702d044 +7150,ca03a06e7c6cf3282f53af92baf96eb5 +7151,6c26ed4d5e28755b02a88dad793d68d8 +7152,f2ea7799708b6a89286675c011e00ea5 +7153,42afdcac671d0a1586864d9f0b1d7b42 +7154,3d5c480939e9279fab395b4b709b63b9 +7155,7be89954a2ad521d40f40963869b1c82 +7156,7890487978b87871b8dcfc79290a9633 +7157,57783339ce73011033c9d2f6d9ed0479 +7158,80e7ee9aa17997118ee0cdca837d2bb5 +7159,da934f99d5c74d43e4bf72b27c64c7d2 +7160,8ab3465f23a38f276cefc6686b5e8ca9 +7161,b7934bc7acd82b929763ea162537d3f0 +7162,63e02bf8a9401615cfb5f8a18caa9acd +7163,dd6c6667f0cebe9d34ba2aa2fa1a629e +7164,6e5a3063b7f581904784d0853ebb0eca +7165,6a030d14f07f8b562c9c417985f337e7 +7166,36d7e51e1ef38f23b8392583fc84624d +7167,717699f98efeb79ff5e64f216b4bb59f +7168,acabe4f8cbaeacc11603daf1a215a814 +7169,d303d4d30bb0e87658e2c90688dc1a47 +7170,c07fda29cd4bc6f535965fd8a11c4176 +7171,518a165971af3873ebc271a76bcd8b13 +7172,1eb5a4d7c9a3e600030567765ef14bc1 +7173,69858c55f12208b5a4f1d6cdab700014 +7174,74d2771853bb1e97d9c4da3a19976944 +7175,04b78ad8d63528aa055c45e1d8cafb2c +7176,4899354eadeb8c59d5b78d6c99eb7f36 +7177,138b0996495ff1c3a7d25584331fdad8 +7178,45c2b1327a355c49e5420a3e723db0d7 +7179,be331bd242f44e7dfd949df3137cdea8 +7180,9f02f1c7d656b2e8f863c51f02322288 +7181,56007fc75cb59eb07d85f929bd849105 +7182,77180bbe53263363bbd79cf96af7d437 +7183,e85db5c20afed1121236000286a98562 +7184,e54a9f44aa5785e13d82d0e02ead460b +7185,709f97fb95422a9dede46e6e3d560797 +7186,f75dc9813447ecb0b6fd97a973133f2d +7187,d1d1a1062323d3d37a03a0e22989f0d4 +7188,8d4cc80e523b54d1b12dd173f0c3d622 +7189,44b692575292817b5933abc84756b10f +7190,4b21452f68e323654cbdf7fc2a7ac16d +7191,bb1c214fd97d32dc43a8121dd0faeb57 +7192,c5d5c93c58387d7f4e0f3a8c955183e0 +7193,934e7abf8380014caebae0d4dd1822fd +7194,747bb694871a3dd2ef0f0ab7e7955a1d +7195,803f0129252918197884cab1d3a99b82 +7196,4e5c21fd8c47f27f4e6a16ee20bf1044 +7197,0caf195c206bb7c2cec37dbf368301ed +7198,1c4bef8a24214a5da8c26c19763bb51b +7199,9e06d42825b8a4bbc75274c49bac4195 +7200,9b1a97f5c08ee810eec0635dbb0e7baa +7201,f221acb6b42795bea043bc914839db2d +7202,c510858ce6d7b65bad59761fe73ce81c +7203,ec724ef78d31d5c72c7e124ceaeaa486 +7204,97edefe25797232010c5f0190aa3a453 +7205,b063c0cba51a1a1d1a4091157086bea6 +7206,a33dd597c5ce3547b5cc48f48954dcf4 +7207,58d5e5898b3fc3c1c7209e04f2f2c0a4 +7208,1a925256066522a4efb2379fc8720368 +7209,7fabe1ce53692b855adeefe76b08f022 +7210,0a1bfd8ecfa483d55f83209594725e7e +7211,f5c8451a7cb84bea48027ed85c742aac +7212,c849bbfc88fef5ae145ef43d5ddf98d2 +7213,da000aa777035ead535130bdf6ff3988 +7214,322116ca8b67130ca0169512bfc76874 +7215,1bcd12a58c65084dc112585fa28944dc +7216,e8900e06dbeb03d7d79e67b9ca57a977 +7217,68ae4c5205cee734d522e4184bd772ce +7218,888763c8e2171547817f0c46c68e7736 +7219,3d448442c2a9d6f0465fb35650d471a1 +7220,6fbc84d661f83950d1ba49ccce062c90 +7221,ce406fb964c37b5e2972ae730c3aa877 +7222,7d5cc23b948b29e7898e698b30934049 +7223,b1b5f72f2a0857ba4606dcd55acbbdb1 +7224,ede21ec62e3f5b5d2cdec35f8872dbd1 +7225,b53d67a3b2c26a7cf0a0f9217e972ce7 +7226,817a131c67cb6577912446d3ced532d3 +7227,5c96535bb12471fa50722b50818575f3 +7228,45bd8997a95605d60590636b6651bcf7 +7229,3f4168942e9a2c73f93a564c1e9f9e7e +7230,e9a22f457dbc4bbed3c5f9f167d4d7fc +7231,b8a611b970b06fa6afd0873a82535f00 +7232,2e033a67abe3b5a41d43718c38b5b0d6 +7233,16122c348860e9239e4454cf129cb3f6 +7234,4949a7421cc0774f7c6341cc04efe471 +7235,f59d5bc0b26755afd73b4ccb7e680e70 +7236,220da977137466187a70e556324c66c6 +7237,4ce71d4f8aa66ad426af4fb8f95a6ef8 +7238,5b51ac435b8d8461d249af5d3b123d94 +7239,7f62c88c7e13c7b908f6d0ef990282f6 +7240,71fe3dab7ed51b9e96a323d28c8997c3 +7241,2d2750e2efd5df79194bb940f57adddc +7242,76c928d21b30a6ada152e5866ef56a1a +7243,2634b693fd84075465e758ac2ec9af51 +7244,e227deb3a8752bcc631000c004339322 +7245,0bf646603050e151bd08601b1f9a5a7d +7246,0af0f5579ecfc0e34c6f3e09343b7133 +7247,abbeff54471b5de526a3075fa84ecf3c +7248,f2d5c0ba5d7cd622a0ccb6c1348bf8d1 +7249,30274e98af6df47d083b1c9ed41a9e57 +7250,4f2176ba10a2f2e4a6bc08d5c5dfca08 +7251,d6582b8106be8f4da45b18760c10ef34 +7252,44dfbcb750a75be4a846cc6d6ff09bfb +7253,d57cc2ceff4dc7ab2aaabd0a5490e490 +7254,5d599f3e17331760dc2b0072bd75620c +7255,0e2a3a6775169176c1ce089e3fee09da +7256,6a6e4bb3eb31a0d440d0f1566502b103 +7257,8ebec5ce05e8f474f3ed2992a19ddbec +7258,886d13fd500701319fef0d93025b060d +7259,882f85483faff2be1774423929ac43bd +7260,c6d74c11046b67a08932a7f9ac84102f +7261,5537dca8cdb279dbae9d2bd66beb5015 +7262,c34f7e5dea2688cda64898d895e03ea2 +7263,1373552c09eced1b0523c9107b03ae91 +7264,a0b189116e7d87e92b86088962197204 +7265,66d617ae4a401b0e398fe9b26153f778 +7266,b0fb2d1fedf469c565f66a7c5966397e +7267,57b263d5760bb035bc691ab9abadd504 +7268,426150d8c08334522c58228d02e27428 +7269,c7a686c09abf803a67104be7f4dba44b +7270,141f0430833e4aa1dd440ccbfdca5784 +7271,bd84ac224dc26a0470b32a388033bf1c +7272,07a7c72a8aeca52b014f3210668dcb6e +7273,9f354b634e748566ede7fbc6adf25dce +7274,607dd9a76c2a5800003bbe25e0c9baeb +7275,2f408e7a471b0681e448f50831399984 +7276,596c6c08a3e73040e2b7717ba6152e77 +7277,d1c5cd7089adfa8bd39e2e7ffa32fb8b +7278,4bb8c74021022b819f5bc48058f4745d +7279,5aa88982f8a4409274d75f884b03f67c +7280,c4fba35d8622a8b487b4724657aee6b9 +7281,efaa4263705b350a69c495d76351247a +7282,7e0ee5d04c776e643094a4e617f4c5a8 +7283,bf7ebdc8cdae6a05c40423e8d9d5243e +7284,c6196a4eb36f578c229df9157f36e490 +7285,636a73fb0ffdde50fd16689c74bbc19c +7286,ed1e795f62e8601c3230f732201da8f0 +7287,57afa841113810422630f267fd2bd0cd +7288,957aaa6ae72ec70de4c186fea824d1fa +7289,aabbc9ae7a0521902b39b3a0f70f933b +7290,f9185b3a458b0c2f24322165b936fbb2 +7291,8529630ebb68ad15c3fc627037f939c4 +7292,7ba68574a2910ff9f0f7319dcfcdbdb0 +7293,b02662edf3f7de490466747c9094b641 +7294,4ef7dab1c46adefbae34b5fa63b97a9d +7295,5276074b6dad3194d11911b754eb91d3 +7296,10b9f101769d5c7c6ed9f84fe86ce927 +7297,40dd26072418a94a561712e4812b4db9 +7298,f8ece1cb8d489fcf50091b758ee734ac +7299,0541aceb337628dda233e15c585555f3 +7300,b7cedf75392c6cae96bb3c29f7c8273b +7301,c85dad9f778d487ae6b04e0fafd2db68 +7302,8b78fca12c146d4584410e69f8b11a93 +7303,3e6dbef2e04d9ad043bf04fd71f86348 +7304,ac8311acdaabdf19d55b4e6d1b85c6ce +7305,8614ce1e17a07d5b31db1f121a7c645a +7306,ea9b923efe19d1894a7f8a2a4525b7ae +7307,ea6189e4ed09fc878538e0fa4a672b1d +7308,20ed2e9f0a4a0add0be4786f7369663b +7309,086925689fed0849a92d63e612e805de +7310,d7718dcb84f0f56842aeeccaf2723976 +7311,465cc9feafbdc101c88cea638341e0c8 +7312,d17708d3e78ab6549e5e2fd97f641837 +7313,28955fcc6bbe6bf2d44694fea5b332fe +7314,080124a804e25540baeb6ee78bdb2fe9 +7315,aff022c8868c1772363ea504d35f83b2 +7316,d0532ed8a94f56091db2132775dcb6ec +7317,0dfb4b16bda4ac04f000dbb39c22765d +7318,7f1cb816f63b9d561842a8f4dcfc44cb +7319,9d7fef6720c095f4894b5d55f167a80d +7320,66d86b2f5481de77220ce1d98389121b +7321,302cbff71f778c29d839e9f438473c0c +7322,3abea08e1694b53de878c100e3b05e1a +7323,ad0d0f5095554e77d11aab1928f00b83 +7324,55f383baf048938637d8d12ab8e2f353 +7325,79c95be9c4604925a9c97e314f4a8c76 +7326,309b57d40d3021619a46e707abcbb907 +7327,73dad6ac481a8b1d7c5a4b6404cc0310 +7328,5c21ff50fc7906848c2bc562174ef19f +7329,5fd61eaf2cad9d75e53a7155a2504f6d +7330,f70253152431736586e6813adb7a906a +7331,ca081e8fd6526f9397b691bffd619b08 +7332,72a824a8fa583baee8fe89bd237e9c86 +7333,3ae7830145607410ebd4822bec51ec14 +7334,75cef55998a7b261b8dce062b0ec3ecc +7335,6db887e005b78a0771f396b7cb7b9f96 +7336,17d3caebdcd95de426bfd4cbf5a54613 +7337,32c5babfa60df7f4984970f200eb9118 +7338,fae578cf055be2949f89f627e93a55f8 +7339,c05af9408a0bf894756daee0288af96f +7340,0980ee6cee7d3a1252aab01ff8952487 +7341,f033904198358f313d0c8fd20425802c +7342,f607a22461251498e9b2b01048d95354 +7343,09712098fb1e61edb603e6a9618d876e +7344,3b4ec8eaaebefe7f108dde59ba4d928d +7345,2f0e6289b20ff9278bf2ff09dd762542 +7346,15f55f231d1058869338ce882f1655da +7347,1c0f4eba1beb0675a6344d06aa28d758 +7348,db0c88f0646bcf5c9d6e6159c84f4277 +7349,54ca45870242c7f2512bfed21a48db0f +7350,085a9251db2d245a9f92b472b2153786 +7351,0cae340708741a6231d92ba1e328801c +7352,9524440800497790d173841a3c479da7 +7353,41f2f3f4e3bc3d374ca831f2dc008f5b +7354,a2b12fd3ed51805eecaa0b315a26c63a +7355,dbebc1e3078cd961be157bd192212abd +7356,7bc1f8306aa59aabca664e0c93684297 +7357,5f306d0f6fae007381184a52060eaf62 +7358,c1d269e9935b1c774c849e09fce84fc8 +7359,16ee1b5d802ed24a1dbc1b1d93f99769 +7360,5b33b6ed7e5dd495495a2c6d29ab5880 +7361,364be37c1a0bf1335255c43324b6c222 +7362,778c62a1d0deedb472f20179945a298d +7363,4f5db09e6778e24c4c729351694a59f8 +7364,63b744892cf5bdea019aa32662b0ed3f +7365,6c33553250db13fb40f969c6a5fbe6dc +7366,f71199abe743f5edfaab8149bdf7c582 +7367,06d98216c06fd27466fa53e806d7d8ed +7368,eb8e23e7325771b15066b6c7858a4364 +7369,fd361acfd347301e053ffa1c531d0ddb +7370,5f467ce2c59e86d179ccb09974059ff2 +7371,317e0bd4b3ef411ef16c4e336e9355f3 +7372,2dc7b19668429d2884e2cd86674a2bdf +7373,0b968aaa2e3fb2a05c1098cb7766dd7e +7374,ca0754d486e5d94a6c05338b62b407c5 +7375,60b0699d500f738b6450d8f53e9207bf +7376,ffc31f7f68cbefda69265d8d03587559 +7377,e151bfe18ddedfc08b9893777fa4e304 +7378,7247eaf7e01c0b4470a06a0690a1183c +7379,b56ce56d30a47b3719a4014cc9d6d7ce +7380,be212c524d07aee08369d7f16344740d +7381,f671697a421841dfb6007689217750e6 +7382,d3a6c6a3421449cd9d4a60c2203736f0 +7383,a19fef1f1da53a35e4dce36c81cc8ba7 +7384,2a7e380943cdc7b8dbf1dc7ec567910a +7385,db11850360b3d593a59a0484ab7d43a8 +7386,c360214883d61389e96615024fee130d +7387,8c95b80d42affbda2a9be34e08719e20 +7388,ca81af8de1a1afe589e22d1fd44234dc +7389,fc9253c252e1b25d48a16e61044aba56 +7390,ccca99653d5d424251ff8734f8e31a9e +7391,d243c567f1b43b183ebc906d2ac9e549 +7392,f9a677e1aa67db702c5b1029571002e6 +7393,9fe18ec72f383213a89f3acd263939c5 +7394,d914b0c29e5428d544e1e94f789c206f +7395,b120c33d789597f2f887228c4ac55d4c +7396,f8da33fb703d173d8e5e82be428ad246 +7397,d98a44181cbb176131ec9be908c86592 +7398,5050c42bc63dcdd688f8ac6212cf60ec +7399,51504924951c2af3bb25d00ac1aae1c0 +7400,38cece2e261578c7031862808537dba3 +7401,e49de8c015c7a750a99990180dbf2f0e +7402,77f029171389948509434ec24a222c27 +7403,043461d2bff3da460b4919a59aa363be +7404,77ac54a53ebaa0a8933b608d98d17b62 +7405,1df77a14de7c73aba382fd28bd1081fd +7406,2f8de3966b7f02b7050943e74eda7f00 +7407,3d4b2e0f48be07e2226ec9d2418639d8 +7408,ff25339969e2b3c885788e27c2d7dc48 +7409,0b471420ae84803dcbc1f86cd9b0f4a0 +7410,7195f204311dde54f04576d365cb4768 +7411,0dc528e1cb4d2e99029e514f9e5bf7ae +7412,2d0fcfb8ff6393ceea1442ed1bf24a75 +7413,d94211e01fc55177c8bf13ba06edbb5a +7414,ef9ab8ee76cecd7d12749e6246a38ea5 +7415,ff51c7b0d5b1f0e3ede3db853ed9051b +7416,658f5030d565fa3053f3e90c7ee068b3 +7417,8c587047009eccba5ac1375df97d0e01 +7418,9ff55c2b105a9c046cd3941efc44f449 +7419,0037eb369b1d180485c7a7343b32dbc5 +7420,108d4178ca0b4487ec65fadc2cefd2d4 +7421,99a45098b6830a7b55cc183812898ada +7422,e97335234b35a9753e955b273987f0ac +7423,b7d3f8391c9b16f9f982a46fc4a18738 +7424,9d0a60d383e3534795306446cb4f79d0 +7425,da841768ea5a32ad095f8ff27b64c451 +7426,24bf4265de8fdd3e15eb6688d8ed744b +7427,1796e8a0f2f88b20fb33e77aa2e88279 +7428,4d2f6b05304299b45012ffd87f035df6 +7429,5141548665ba8e43bcb10d9161c12690 +7430,e3af92f04f900a57bf00b58abdcd4be8 +7431,4acb9d9dc3397a80ee8dfe9c7df62aa0 +7432,6f59a3d87d51bfdb3c8ae894d60cecdd +7433,2116eb57a440ae00a733b76cb24ef361 +7434,c716ebf86fb35cef5f11337557511206 +7435,f32f6872695c4e724f0ce0c230c5057a +7436,f049264f31f3c59d6b229c6c1de6b8fc +7437,e25760880e0e5a7a035a12ab37759727 +7438,f61cd322341c8b34b1977226d51fe621 +7439,f912d19096fc3a62a9e34a2226aa2b61 +7440,1bb8b8eae4b8ad760dab0c1652f1a222 +7441,227fbc8c672d1a75422ade0c9fb31e7e +7442,4281e4b2e7a5403b26db18ddccc8d238 +7443,60092089847573abdec0f462be1ef246 +7444,c27d4ad58b23b4543ff34b931ef0871b +7445,52cb31206ef6aaa54044827eafe6b489 +7446,cd0ca9da82fb9b40e4e332b0b7a0d045 +7447,a09e69ba4e4fc56d1c7fa10aeb12f11e +7448,b86fdb2705143b5b8c467bee60cf4a4f +7449,fe751b1f92b6272bdb7e0ae6e1e3f0c0 +7450,9f7f70ae78bdf915f3b3a6ff8873afb5 +7451,1ad0aedd386bb7a01d1c3ac17c960f2d +7452,6d864d66facecf9b908612c152f19632 +7453,c7e6921e84a91f4dbcf3988eb67ef7fb +7454,d607c5dfab67ffee904d784118e15561 +7455,bed46b843e8c2fa31f7d8d1c178e2161 +7456,cdb9bc2e735f04ed535199c4bd990ba3 +7457,a55684b0dd0d7aa76396d916c366b22f +7458,9c989582194b6256a07ddf640c1a559b +7459,a579703ac5436941a869c0e27cc3897f +7460,a810df41be06a211075ad21bb87506a0 +7461,feb8fbede51fac8ab151921ba6399250 +7462,f4f7d94da81a397c82f2551ef56355d4 +7463,7d090b30ec5841aba235b271a3f5df6b +7464,d1cc66b192772aecfdc173e47b4f6d87 +7465,15d847fb7ff5a91d9419324873e27f70 +7466,1ae61919f59df3ceb18a5cf4a732986e +7467,30e92f101d344e8011f3ba9718eea7fd +7468,9737f478a60eda4866990dd46bdc80f5 +7469,812980f4092176a2733435e090f29215 +7470,5ed18e239d8baf0cf31095d8a060a8c5 +7471,7052d20e5ed700b367dbac0cafb75ad4 +7472,9b80156b584fe08d6e8767cf7ace9924 +7473,72e06e405bdf953f1bbb645967214e11 +7474,0c27cb2e78b0876062173fda12239440 +7475,1e9f8f514690fc89aeb08ba0f641db44 +7476,b04a884117f729734d52f94ec9c65237 +7477,df95f6532c0e6732d9012a8a469c4991 +7478,240ef02e4df4fe85c0c599bd1d57e219 +7479,17086c1e8307cec03c1b47672198f68f +7480,d3245fbc5b7821ab8677df9a8c0be92c +7481,2cbffa63e9cc7118cd9a5c738a1b7b52 +7482,556155f93027a76caf404342382a2d72 +7483,be7a8e3b836a0a274ac5ed3e6dd4aed3 +7484,27ea2eda02a02c657167c0e0501ef35f +7485,f7810bfb01a07a9c27f7dabca8d75eb4 +7486,38c8b3990ff0b55648b792ee5d0f01eb +7487,a7f68be1e048a4a0caf41229a38d4583 +7488,964f27d016c891ab304a30cc5822cfe5 +7489,df03994541c97c3c1bb29a9321d35e97 +7490,b089b0f533df114f34be8a9de7b1ce72 +7491,56f44acea3fd6ca83367f420a1f26554 +7492,2a506289b88e38c690ae93d5685e8b29 +7493,91d94eee131c44dc4c8458808ce39b77 +7494,f27d1dea5a62d5506dd0b91468a3b5f3 +7495,6f32d878a43588bc7ea9d964e831f101 +7496,adc85628cb696137683088171f93bfbe +7497,01bb1b1e6e519e2d99563ce20707573b +7498,22e8b2b37bec442c2993a649baacca38 +7499,a025b7426d563d336238ac3c45fa118f +7500,7661ce605ad8c25ab7dd55cce48d5164 +7501,0919db0cabc97a465e3ef7f5cff6f547 +7502,cbb03b6b378fbf63f4e83cc02073a774 +7503,4f9cbfb14f878225b58842c4f24e8c8f +7504,aef5b0b57648971c4abe75a665abdf8d +7505,49d3ac0664bb02614b65ca14a1975d7b +7506,3f07a55bc8e5aa86ce65fb420f45e2f5 +7507,8afa567f1ccb486381c70b25c5bb620e +7508,a7c3e9b56dd6dde17d297ba75b18c318 +7509,14037672300b3064754c844f60247d17 +7510,18ac602ed46aed2b4067a2aea41bf1e8 +7511,5c69aaa4e8f1d1a7e6494992de65d3cd +7512,90882f45c466b07a73b87768623ed20b +7513,b24f14472e7411c803c8b9889e2bb6e5 +7514,efc32bfa0c02c482e5f419cade5d8f21 +7515,75438826a5f1747667e084f628dfd94d +7516,655761939dcf012b4c08c215e995e530 +7517,56b2421644aae03bf1b3125b119a2b4b +7518,8f2b376d17c1e328e06b812be8e87679 +7519,8f6bc1fc567dfb3be6da0c8f1f1bf343 +7520,3a05ca65c064e27d4072acca0fec6122 +7521,1977ac713b6032ea951a9dfd99210869 +7522,7f2a46906cd345bb48f41f7adcf8ac88 +7523,fc6b6162c8601c102157d4665fc5ab49 +7524,de3bd4e9c96e9a80944dcb71b8dee0d5 +7525,8d4466559e1608ef84423f7488f67698 +7526,056f8dc03c52a5ea40997f96f951c94b +7527,ea16ebe64772d1fae6380e7a2557bace +7528,7047f5b1c3a99e98ef82493ce7f47765 +7529,29cfc1064795f16393537fd371ed6594 +7530,4cc32d95ca4be7efbc7634df1dd82b9c +7531,174ab1c3e6809a2991c4d6dbbd5346ff +7532,a32e816456c6fb144a3041baa323a50f +7533,f2dd1f5f2440dc0d0fb1b8f5ac97182a +7534,4ec65572942468ce6d6057865a4dbca2 +7535,2c1399bb84691aa283d930b004a23d9d +7536,780dbeb9978d7c0694d6312177619d09 +7537,1fc7e6eefaa86ca6d3a8fc316f36f1fd +7538,52f9dc0adef901c6daf93892a854cb6a +7539,6b591fa6a8907bbb718994342ee5e321 +7540,ffc005d728956df7ca35dd781ba03c5b +7541,0cc070d02a7500562325c517f3cdaad3 +7542,ed2bbaa60068c515335ad0f50d0bc4e7 +7543,89ea092b8d67a7bdae24bd76969f2544 +7544,3dccccacabdc9e8a622635dac3bb7552 +7545,458e0f0a373a104b6b13edf491989d71 +7546,9407714ebd204bba6fab3569baf3d022 +7547,51723cea668db268cd432378bcb1bc7e +7548,843e92023bd28556bf68e53407d4b31b +7549,8eba234929a5bc96c9572d1a9a92383b +7550,47f00f579602c1f7b9e34e453b1181b3 +7551,fa7082d1acca61090ecc1134a60b7fa1 +7552,e44d46daec930a66987a21447e41803c +7553,08debe5045b9beddd88283e0b1a7bd3e +7554,5baa178ea844a2492cd945306340cae1 +7555,0fbdf022ac977119058a735e2669a1fd +7556,2c16b62ce556863d10a08b83404ed776 +7557,87d50d11ca95a277b183b97c403e2dd4 +7558,08b4d91afbe16744dc40a62ecbd6898b +7559,6497e5f99afce48c7b7eaad1716642fa +7560,d95c930e70c5b93c4d4fca2a26d05906 +7561,f9f6fdd65d21fb8d8bc16fe2cc588254 +7562,a21865cf1029283cc5e6102e28932d93 +7563,1ed325da8a5275f2b86599fa4f82db65 +7564,6cb6e0252da55515025d6c2367c568ad +7565,6b187cdcea94cb4cd6d237093ba8b095 +7566,de17b9f5f73bcf8002f5db7a28561eed +7567,e9928a906f1db97eda1b0843b9c9d397 +7568,35989f5fe8cff26671fc101d02d798c1 +7569,778b1114a5b76cf135687de9aa1dd605 +7570,b5d9d77e1a9222c22b55203886ede379 +7571,e46cd8109fab04cf0b9112d248819a17 +7572,9a02d164c543a9b5a58b2a034c455884 +7573,e45f3dcecbc325285abc7311f740a30c +7574,78d2be21c3ce4d6267537a4387cd83e3 +7575,f2d80d4cdfdbc31fc21215e31647e2e1 +7576,9e81a667057f13af8e182404ed8e331e +7577,a434138e2e4d93a4366fe8d75df9e6b0 +7578,d9eb69cd389b420eabc193f879e43c79 +7579,06c212b376938608157f1b1e0e32a1fa +7580,53836f0d56c0aca92a781ca9efeacdb8 +7581,8771e95ba06542fbd8ce9d98f16dd415 +7582,b40fc101f93453489de117ff406b9c05 +7583,7e23777f9d78f66581f42ae2268aa292 +7584,d3cf984b738a116a7661769ff8b7504a +7585,9d0f44029907eef0be61f8ef2997b7b5 +7586,24cc45d5e5050fc6cb027494cfb226b2 +7587,97dd3d1b0205dba22e1840aae701dac2 +7588,123ece90cb955c0e73cc69a78d3e5b66 +7589,7dbfb64ea29316b62094c265e0f31e52 +7590,cf798061091017aca1eb50e8f8bc93dd +7591,c6387c90d7b02b59d39f5aebd0949e2d +7592,7bb1467039fc2c264fb4b1aec76b0f8b +7593,687d4fe3bb3e0c7aa6acc4bd1edb68bc +7594,da281edffd7381f04e185b262a51c717 +7595,932832cdb7585524a908797c3d6be308 +7596,73791b1ac55e2bcdeda1418c2ca620d7 +7597,a7dcb4b182ff1d6fa2b9b9419d4d543c +7598,788de2062a37d93045e92a1c34affea6 +7599,dfd6e0c17d3ff0b6623beff9172bc0d3 +7600,0b9db2f580a934712109426385b061b8 +7601,fea90bd4023c15a558b9d035e0c02918 +7602,3d1bb69c5520f36042510654af662271 +7603,05afc339a1fe5d71444225288d6ca79f +7604,c7edb2dcdc760ba179946a614e5b4f68 +7605,d0a6e9a16518c058b5e6dd00594193dc +7606,b1c7732d57f2befd3a2122a1f8d6502c +7607,3deab080711257c2806e3bc231c326a0 +7608,740a611c35384ae73ab5c5178f2639a0 +7609,198c05331aeb5a05a495400f85a09467 +7610,5af3b6dd19430d9fd7f58170ef49ca38 +7611,5c591af1807e3087f6c6f3764a61e01c +7612,e3927e98bf1ca26378ffe2d9a9039365 +7613,a36278cf46ba701ca39da1ecc87d4c3b +7614,446d524654d947d2de207c1c651b2411 +7615,788a2931afc08768c1be3631a44300db +7616,5b7f3aab922388fede5c4906850e01a1 +7617,52359c5b59e86f821a69235c0926cd10 +7618,145d7fe768b5f16eb33764cbeee09f63 +7619,e1b55f25dc76f63304154d454ac98724 +7620,1004e14d26c2e2f74ff2d55daf9e5a0e +7621,0805c01903f37dca9171e756452f746e +7622,4497f33801493cf619eb1d95897b4cd3 +7623,e72a394ea146fff6d1a68794a0841805 +7624,3ea7a3fcf71ff9f8553c04bb56c2fb9b +7625,0f0756ce163f80bc532ed3f16d2d46dc +7626,df104b5a5cb691d6e5d4c75481e9094b +7627,56b6a2a9281477dcaf3500c16fb8b5ff +7628,4503ddaccdc7638fa5f437ab9ce7dd7c +7629,a5d928ac47b902585836c4598acc1481 +7630,7aff6cc7e80bac07eeafc9d171ba8766 +7631,5a94804cfb34060c3596ba1507b5f1a9 +7632,63c36685f40a64e804f40def08e05912 +7633,3d5efe9c3ebd44b720fbcaab5bc12974 +7634,75d0a48703e1feeb04c604ca6ea2d981 +7635,c1af5a9cd64f7c73cb3de7b8cba2c435 +7636,b202ef8989b8398de067ee2878864a9a +7637,ac47cd6776fd3bb2bc8d8d518fad4861 +7638,db6c335c01e4979cdfaa3a9e40da3134 +7639,1f9f7a7d6810c149795b0a6f2657158e +7640,b66b2f799306148e19fbd6b009d24ce3 +7641,ce2d26afca39e0d13ffc5fbff519dbe6 +7642,bcf18d0f1d637245639ec15c06f051e5 +7643,04b717f9996302be6bff963f846c7fc1 +7644,f3892fef5d2a6467e6ffa0aad75749e9 +7645,94593c18df214d9007fa39f76c4f8024 +7646,ae67e8f0851ae6550e8359d37df584cc +7647,71b82e4b04bb09472ce2c4f31272971c +7648,1e56ee20554dcef3f5f77a4d48d9294a +7649,e17e2cc6d952ecaf0d4f0bb5d494b226 +7650,01f9a68713aa823af71a9a24b68cb008 +7651,7efd0fcdd8427fb06f1d552e7bc3ddf5 +7652,51538ec44bad21d96916407482c159f7 +7653,e7277711680b9815988ae08ef989eb49 +7654,002a4484a52e6b2aff202afbe0f3ed10 +7655,0817884456aaa0d5d0b221e00e3fde9c +7656,de2db0bcd36fc7a4b0d8db271d35b685 +7657,9c6f5007642ebd6113611b674790131f +7658,b845eab24c00a50cf0b775d829a0f4a5 +7659,3a093a0a6ab1c0abf363fd1b0733de5b +7660,6f700226272724b27c6513354ed1a521 +7661,fdda0c7e762e56014d79a37d92b59d1f +7662,e9b412535ca54ce22a4f06cc8883e716 +7663,0d641a3bba1afe7f471daaa937dc4d5a +7664,d854d0a4373a787af9efcdb53b29497b +7665,c3f4b7cfcd68e25b006a2aecec981e4b +7666,24fca3cdeba764fcab722e4e3dfeff16 +7667,c118fa9d85325d621eae238a4e2efe9b +7668,d94247b041cfb41e7748c196c44715c8 +7669,b750ce94b2da84c15558e66cc55e886b +7670,419e3d36a983b35b81dd1e14be9d88bf +7671,ec9e36e4fe4bc48db1f4869ffacf37f0 +7672,f20db56c1a95426312462f4627561721 +7673,ea19d2e4e42463a3821d90e94270c682 +7674,5e9f9bde864f06e2b0649a3ba5cb1ee8 +7675,c27a6cc7a8c235ba2941fb09d84b71fc +7676,d6cd18d8ffdf53a105c1bc13d8d12123 +7677,931c2ac4a7d3167c4cf0f3054d247665 +7678,94710d774ab898d799040593c2f7e8da +7679,ffd3015f24a3d2903370fbb579735e24 +7680,75cfaa01340921d0adfccf6de6274f7c +7681,ece4fa8f48e1a06dea3c393f9309c772 +7682,3d3911fd749a58cec0e71988c38b582d +7683,c182ed2030b88f27e8ef254dab54255c +7684,591df3a0d0f88383c25bb1160f767945 +7685,e99b905ad0a550a6accf2274ba6ff860 +7686,b84fe5295606446ee4d0a85fd76fbc52 +7687,9257bf952ff412f5c813fc5e126d0a17 +7688,a973b2e24e756031feba92dbe8990555 +7689,bc431e9adf8ea185d14557dc3d11246b +7690,e0e7f880b8911ae249569ba7bc3a63ea +7691,34da03ebe7ec8a21cd489e8ce1e98e75 +7692,41a3c8f8b7163ce58385320d6f9f561c +7693,1dad7d772b5a2ca6b640d02466b3a587 +7694,723298e0544ef387dad06f57f650e837 +7695,ae7d5028d61ca5afdf90fbd7194c666d +7696,c31f706d39a8afd9f21e19c992c2750c +7697,9bc32c3c41f9d7def7227d6b60767583 +7698,b37e8eb6b320239f542a8b1068bbd8d4 +7699,5e5e9bc65b7df0550f74f44dca276f13 +7700,737fc4355ce8d27c231007ef79d22c97 +7701,fe4baca7de4d2dfc92382d2a32c301a8 +7702,6965df2b110db002ad376b2338950045 +7703,3ba3af3cf1e18e1b814ddee1a9645bc1 +7704,90d873003f5031b71f6a086f1ce6e780 +7705,619e296c576a77731628c3ff1d4b05b3 +7706,f683bacc9e280f066eff6028f944c239 +7707,c6d0fcd6acd0c73e47ecac553034359a +7708,fa0e094e6ecf242d31ce6eec79f320dc +7709,01a5ff19f6736ef58d009577802da069 +7710,df317ca1a89c28c30e1e03dc24a166bf +7711,ceda9f408cfbd0b0078a5fd374085f68 +7712,6ad878ad3ba0fbf621c29f2f2cca01fc +7713,5b36a8bce055ffdd744305e785937f6d +7714,682880d90a4de38646d05f850ab66b25 +7715,fcdabf4dce56d9656c46ae36eafeeb05 +7716,741122d65fe5fdd8900687d70da63bf8 +7717,1686defeb8c777e15b6b480050448002 +7718,c2fb5abd51a8548e43989c087a73c062 +7719,0f8cfb4ab13b7d16f4b3fb60773d7f7e +7720,2e8c189fedf6a187b819b37e4067400b +7721,f9c015ef1e80495e7c8a91a68b2fda64 +7722,50e2c66043d715c322d803de655cfc7a +7723,2bc32cd6f79334d6503bf73fb284a4dc +7724,c0c940726814e9bbebe264e8a63a7553 +7725,76e37452c39143b1f988e54f211cd811 +7726,2abb75e15ef2945884b00d830dd2880e +7727,b6fab86954ac83db0de1656df292426c +7728,b83201c364cef0c9d2ba39d57134c3d4 +7729,8417e127ed84e60a59675496dbb6a5cf +7730,c7bdafc14acf2b2658f2768dc46876c0 +7731,74d237222d75ada39e8a02938789f780 +7732,ff4ad28248505453b0f8d6c1f44548ec +7733,0c8ccdfa67ff598299dab1b468a3516a +7734,d17c4b3c40ee9faa41b759a6eeac0d6e +7735,29c3290a1bbe8e2c2a0c3d6522a805e8 +7736,e6aa7e399314b52b8b12d94a874b64c6 +7737,55a98ceb5105751e740741d122ff4380 +7738,f0536acdc34ff9d13f8ddb214d90300b +7739,c68fcbd6c66cb054ea67557774b5e7b5 +7740,697391aa365fefbda084bffa098163d0 +7741,5c88c9b7c7400c07d0bda71e27477435 +7742,e24c4733f351752f82ff4d643653c13b +7743,4e8eb59cb28b70d1b1d3ef9d4f3b8a13 +7744,e30c35f9df5cfc4372974cb45205391b +7745,36cae32c126564f11401f18886fc6d95 +7746,6a8a74b9fb4fb6b611052448604969fa +7747,137e1eb7502f73e64ee8712e4ce6ad9a +7748,1d6c136f2b0615e38bc0b2345496347c +7749,a2dc580b52804e2a0dd27fbbd1abc25a +7750,9f04ee88a63eac036cd60978b179fbd8 +7751,6f478aa74428120f42c1fcc71b47a530 +7752,fa52d9b4b3d410bbf06687499d47f4ac +7753,003db9445ab1409a01a354c4427c4f4a +7754,7156a2e77ac75670b7d7e1bc068e1382 +7755,f7f150be1ed7dfeaca950a912ea60ca5 +7756,1906184190a306f26c6cbaff120d0829 +7757,362cb3646d0a535eabd9091c0c10833c +7758,cc63b715086c8c345c1207fb87e3863c +7759,f67ce2cbfcc0f120b7de055187ac2d57 +7760,de950956322e9c24af9bc6c7d6d1cb0f +7761,ca1f3caf3de1bf0c2a9b968ae677cf95 +7762,f517346ab7ef9cb40a6948099a2a36be +7763,344cfaa3fa3463923451af38ca32b4a1 +7764,785137096aea1466b361469e9d0b28cf +7765,aeebff2ec3248d9b1d0713e1ba778c88 +7766,0293d4178f37f94bddde88a55417a966 +7767,2b255820a6ed43b6e5cb1360df9729ce +7768,89411fcf09f070b612a9c1e96b32eb80 +7769,171a62c94b87dabfc6a46cc1825411c5 +7770,47ad44367f12b946c63fdbbc94f32cd0 +7771,ebf8fbbe117538366b976b90745614cf +7772,e1889c8b17daa9b2bb3c315b0f3dda17 +7773,4fc044db7f60c5fdf69bfbe2f57d3811 +7774,57cdd3e732b812e59a546ceac4f48737 +7775,8ec4e1d05e36f3fa43883bab5558edaa +7776,355278b61ad9b680460758da8669344f +7777,0d86d179873e380c8352d16357e9456c +7778,111c3b986b96837e4d9a0ee471537b5d +7779,085ead696eb85211864d6902b8b97b75 +7780,9211ae6999e890aa00ba8788a1ee4e67 +7781,2c48621e43f3cbb97a8826a9926fa1ba +7782,7b0bf21cdbb50520837d952305d38c77 +7783,9001b8e681045d78e9a34b17c15dd029 +7784,a06fd633c4dc999b940bc1b76692eb5d +7785,0f8c58c5a9dc0a6f4f55f28682e55bcc +7786,4b65730f2fecd2a5b47250cb55254dbc +7787,863c19b2d07e9ef660c6ed2453db33e3 +7788,8d1ab158013adf197d2d0ba11a309745 +7789,914b5c668e970eed73e76553d2d888cf +7790,f3f5cb741660de5be966f089395acf30 +7791,7329dcde6995e27328f6891a12c6b272 +7792,fdf2d276a9dd456ddbeb845e2da7b6bb +7793,b202dd3da6c52f08f4492e7b06e0382b +7794,b9bc71b8bb5ccfc8cf37900db65a2305 +7795,ca638f956a4fbc917b5819a5b6ff2d00 +7796,55c7dbdd8cb6671c45cabe122560323b +7797,eea9e19a4e2bc9d2bbffc46a270d455f +7798,b4f23368d7c6a9e723389261d72b05a6 +7799,be645691fede5edf358cfd5ef38ed536 +7800,e5dd8bd078b133ce1d014aa3cc87d06f +7801,feae91db5ad19729b7b08aa4155f4a8a +7802,78ddc9330d923013d14d1eea5b6fafd4 +7803,da99037a6d0be55b81086d6c6b21fd4c +7804,7dcf8ceb1a72f9cc0a6819b65487d0d7 +7805,a4dcfbbe6d5ffdddd9658feb31d39b3f +7806,cdbbaa6694905d7a6688766460043ad3 +7807,6b8720552a7c99f6b3362f446ef70fde +7808,17ece29cf841f2b0ac01835a8be2a37c +7809,cb2f81c1c2e22f025ca476f6adb800a5 +7810,fe0281ff7fb2dbe4b6598fe238e4d68d +7811,27baddb7d4df1be8d6eff7b09ce2b5a1 +7812,be3858b4ab644208b8e68d0456af154a +7813,0059f8055f90ba2ab71e67c5159b6d77 +7814,3b37635c523352ed80394739c9652831 +7815,61af5f18fe73fa9fa423ccee23b2c544 +7816,28ce92ecce11e38fb8562b48e5f9ae48 +7817,f09c03a7b627316c87a885db44ad6a5b +7818,70753e145f40e30a5cd5d3ade6bd4644 +7819,60f6d8c7f601f35f8e64e4d43d831b63 +7820,e8719889bfcb8a3eb29a4165454be091 +7821,ac71e08e96bda12e39ea5ac942b3267f +7822,4677ba90d18307570baa97d15107d072 +7823,74dde2d0fb562c0cf5d1b1fe9547e282 +7824,659e689266209ebb37b4bc5763a0b77b +7825,77d08e5d7f2a1fce15e74379a0eadbf8 +7826,5d74d8e89fee68a43360aec50c411ead +7827,94180b014a541580ff375b6c860c7bed +7828,8b87c748fb7d3d992ae50644dc3e0ec4 +7829,13b6712c0eaac6fdda0b4c4e8dd1e006 +7830,7d12d466f700f0e6445fcbea38c14143 +7831,e703af9a655fc01a635b2ad72c99b3c6 +7832,1503e6b392ad08b10550d0665635f178 +7833,a379495b0b3a2174c01cb5993405eec8 +7834,a81a42c96b89d7519b86978a9a4dc8f0 +7835,928fb0fcd2a9ff51e5eeb9ec6899b67e +7836,722b19cc8c8edf0ba478bd63c99d9a1e +7837,517cea4f8d793ca90f515d65dc6d4ebd +7838,f8c759de35b8d14ba6cfc322fa44c27f +7839,61c7d726c01ded61f87db2e55262f5b8 +7840,2798d04abe181cfb28ed8acdc28d8491 +7841,329eb3941d3cb42f3b2ee1aaa798c0b7 +7842,639747e38dd1774b631fd31f654ad586 +7843,a94e1e7dff80ea4016d06009d93b40c2 +7844,ce10fe76feb4396f8d49bf8eaf061d2a +7845,145c8c56808cb91c657a998f63b37ef8 +7846,cfd1400a0630b5c5feb4b5fbdc6a6794 +7847,fe436494f491036d185aa607b1100247 +7848,d877f18e84c1105f944ca73cff121443 +7849,41347ab2eed5453f49531d6159f69ea8 +7850,42a318f2a47e712d32b669dffcd96251 +7851,d7009c39efb7bd4e66cf74f28099a453 +7852,161f5c225aa9bc2160368a7c40554893 +7853,c378340c83b85c69540d6a4eeefec419 +7854,429233eb1603c92bc5948d1b257df6bc +7855,c67a25de25ce207d1ad85032196e8588 +7856,e7cb058dbd67e4aa90ba28c521a27015 +7857,b30c347c80cb8bf5efd421ff87fa1a3c +7858,e8d30d57b3c7dfb0f99f26208946f21e +7859,672d276b912931bb516e8007423e9ec8 +7860,168a43ceb48ecff1c7ace6fcc38089e8 +7861,7e1e361463cd3f885d65fe028a82c68c +7862,1b1500a37dd2ab40b4c88accdf1da4b8 +7863,6711286f2f3e20128aac22c045799445 +7864,596d9d7fe8b5dfb6597db70d5d809e17 +7865,d214ed09b9d9dd836d52b75c4cc1a326 +7866,8f5cc18b8c529f921666e390cc922068 +7867,bba92b58107551595bf2b1539ce8e7b9 +7868,00ffb44964e59fd1c6485311ceb4eaec +7869,fc4b415ff7179bdbb5c5c2ddb71df152 +7870,2cfd755902dfe735597a20f566f4afdc +7871,e3814db89387c3d87f5dd780b7b0c744 +7872,b0f7113742d3352d87f8714f6c6cf888 +7873,dae20915e83b839da3daf5296ed7fa62 +7874,40f21c9f005c2f76857db4193337f8f3 +7875,ad6413e40300e2dc128cf95477436244 +7876,127b2c1305f663517b2e5a8ed3d19b5d +7877,2d9070021469a0f4b56487471385fb2f +7878,5c466ef2b84fd232594611eef1ffa486 +7879,8568ec913119ffdc4297f756ced8d316 +7880,f2058d852a10436bb154baf29dfa6bea +7881,afd1b284fcc5a59549a43d0d1b6069dd +7882,878d8d077589d1019ca9647927fd55fd +7883,ea1f46aa4b078cda54efcb2ce8bcfb51 +7884,f50def8caca81c473abc41e7b1048a50 +7885,be9e32f1e7bdcd01aaac68a2197dff9a +7886,36ece76c8422c77ce8a5b3b4a6ba7fcc +7887,101149cf32d086f3e167f5fdd25da402 +7888,5dfaebc14a93636a87817b5e2347e845 +7889,8e1563053d0da6237a6460bd4fd28d58 +7890,6edc8d84b319ba0228e4227cdffe9e46 +7891,a0b6aab848b05f9b0aa628996a09e34c +7892,e062c0f33de4785df45a1f6d1be053f1 +7893,fce2e8c44d2fcbc44dd984100828953e +7894,b4d4e8c450b2885f4ef854545e877e82 +7895,1f822c1ebbd94ee2291438d985c55a18 +7896,59b421fbea66771d072b8ab3a6e86686 +7897,ce5fd4ce24a04823de660d9cc916b49c +7898,0a4e4129a9427e3b98e2de4a71ef2fa5 +7899,1ec935bf94beb4213f176ab7cb78623c +7900,d9041d0241edf074aaa5381f649d685f +7901,b73edea622a147792041692d6b22cda8 +7902,72f7b1f2020a69ff1fbc962fe19c85f7 +7903,b2be71427e960dbe5cad9b1082f6baaa +7904,4aef238f77d02bc2311e1616366b2a73 +7905,08d2a1b455b386eba20615317456f548 +7906,b308df9373a5f9dbc903c2d6c17309ca +7907,b1970aec027724b6d80612c317febfa6 +7908,f3b8c2612a2c4b7886fbe8ceb8cfdf16 +7909,8f765101ff75d47fa4bbba4b3d4b8e83 +7910,5dce6bffb8ce2384e40f1c924a4785df +7911,6bd72b86dec86429b723dafaec76d830 +7912,3dc2dfc92dbad0715509dce64e65a7ad +7913,a3c69acebcc6fe7cbd893748eecc6bcd +7914,23d0f3c474c603b19f3eb0193ac2130d +7915,481a09a3cba0a4ef0c619095f106172f +7916,ad0f309f64f5b0d7b8a2177248e56a9b +7917,87d60e85aa7da8a4b2630fe4cdc6d5af +7918,c762cd57820c66be59119ed514cac763 +7919,89e023188e0868e6b396fc357026093d +7920,c70cb768cbadc15d8671e69043f6c527 +7921,2066fc13aed631662b7664b3d0a9f2fd +7922,5af964fe18d56e06946a81293c540215 +7923,f8267951bc546f5d2d88361cf3878085 +7924,f12720a89d33e8efa41dd359fe54e4ac +7925,95bd651526060e97ffe8a67170d23f46 +7926,b98623ff1d215e64c8a0d84376653b62 +7927,ebe20b773eb1444e03b6953e2ff7ac07 +7928,60b488c01c535c75ceea3a4cb7927425 +7929,48427f8a63f2b52077609dfc457eea1c +7930,268af3b80499acb05770d197592a1228 +7931,0c1a67528ad20b15dc3cbc8672133bde +7932,8c4a38c7889446df0576f1e78f709d04 +7933,f30179695cd7db440a1387f670a562c0 +7934,46fe290993d64838312e6f0f2086687f +7935,fdecb8c7c982996fd5410fa714500dbb +7936,4fb5e04022e9d16dff48703a5c794ed3 +7937,a0212311b83bc77e884997785f70e59d +7938,1b36b9b49a66c364d4c9912cbd0a5c3a +7939,4eb515f0a2fd8e0679cf7792e938fa78 +7940,5585619a65ae6f18cf44b8015a89833a +7941,9ac12ce68ab041d8a47a0fc060c6f4c4 +7942,22225294ee7d2a2a8f8c219924fc53f9 +7943,a60d820cb1621d91a010abc5756e8f36 +7944,af83a0be679cc7b906ee903539bf79e0 +7945,620d2fddbe3dfb873c5c64673b7a1e32 +7946,2376ef5aa27e9e21df523d8f5af7cced +7947,aca69a3f7c336874a78c8a0db04ad46e +7948,d096c55e1d6a89a8a4874e7d929dd75e +7949,a8fd0eaaec689350d26156dbe3b667e2 +7950,6536d0b5c3b0aafd897e9b90a3ae03d4 +7951,ca8710e39c4f56160f826c025ec36607 +7952,258ea39908070dedc7c24805d76ccbe0 +7953,9b1841c7a7d12da36f6de71fa0969c8f +7954,f4b600895cdc6e9e49e343c3c93bedba +7955,01821be9bfa24f748c0948bfb2a337ad +7956,43d59d536d6b1a9248f1d86d86bbc6b8 +7957,6191ffecfade5a8c913badea454f5e6e +7958,fe03d1408edb7de85f6a1412165403db +7959,1e6951acafc57f382e890980920d0341 +7960,66c406e9088aa62983fec04bf8ea00eb +7961,7f051616d89617d473f27e358bbe52af +7962,ba774db00a7a161a2dac5c06939a9e25 +7963,8c6ccb4b40a3e06671b876b23868d919 +7964,0aec344b3b176994505fd1c1fab8ea2d +7965,c8dea95f7e2334062f4827c172c9bff1 +7966,34ff7fa89cde33efbaa673cc860bfa08 +7967,a0a50ea7b82c2b9bb2ad4a81924a5bd1 +7968,27f4e577b2ce77bab69e96fb40b88c26 +7969,fd6cad85f3fba5facd12e82cc614683a +7970,1098c3211d386019383a5f71a6d44bc2 +7971,dba16b479fed3fe59b4f91e030223661 +7972,71241473cf38cd65dddb3d104ab4cb96 +7973,9c2508b406accc1291bba3194b00492b +7974,f70935f8c6d2939d5ceb48336c8466bf +7975,ae1a01fe7b4f1db31b5c86c1038c009a +7976,f7e59253e1ec230ed0ee01a47285536b +7977,c3c44c88517b039063fd624ec159d4db +7978,6e3a3e6b0214a522288104a505ab67b0 +7979,9056523101c71a0959fbc98de6d27a87 +7980,c0f7c8bb6cde46ce2b6067edfcb258e3 +7981,29afb0d43491c9134f1bf09b7218c6ae +7982,937818cdb33dba8a8904a1df2d904664 +7983,0340a4c1a80a254f681024cd2768c3fe +7984,3656d87ce1b4a152a0020099ad3ae254 +7985,7a508e508196ad60895e56ce10bb84a7 +7986,0b9255a1712693273fa3f446163eaf84 +7987,659ecb2fd1df359b13d6467c6e4d46fc +7988,56c48225cf8d1ab0ae53f10a077d76e9 +7989,65e7e340bb59f4d49f40ac5efdcf9b27 +7990,7d03b4137838989be6583fecb7deb37b +7991,5e460ee31a9735e76b3906fac7808376 +7992,bbc6d88a5e75f59406c856bd425d5947 +7993,31767f14eb074a4d185a26df4708ccff +7994,361eff52d42f625e1a3591171f0b8e53 +7995,2478cbe5022f5c181f9e6bc0a6507c91 +7996,7651513c5b1998b90bbd2bfce2232ac1 +7997,834e4e9c17adac2021ceeb4636328705 +7998,489679e79bd5f94badd7b0c3dfd7ada4 +7999,2e0fa501bbf43cf7cdd1ff8e02ad004a +8000,19453394b596848fd34c5353625f1e88 +8001,8606925a78974ee2b8074051bc0c9f03 +8002,8350d94ad0561300b20d1f8e91279b38 +8003,17b5cd5db928894b656a57075fa44836 +8004,4ca3e54c594c648317f7d5eba4920d9a +8005,3c9d6e294487d5e970af02be381a02a5 +8006,f3cc5f4160f47181c978b4d4d499a3f3 +8007,a8a2b798728aa75606038e6f6e4ceed8 +8008,f5e719230ddf1c48c2c9faca0548b6c5 +8009,ec94bd7cabc0db0095d55289a5270f08 +8010,7e85260bde26d6ac44b17ed956674282 +8011,a5d8d42000488315614c32e692ea924a +8012,81c06c7507d24798c75ef7e12ee2b01e +8013,470a21b1fa2558afee36f7d70f41e50d +8014,468cb8689d8012b52984bd8905782597 +8015,2604785dd60ee2a50f2b4a10927e8a10 +8016,50395b7191ee4d13a53e7e4b69219def +8017,91df5070d5f65cb11cd2b92034a613fa +8018,2715bb8caa968ad992df7bd0134c7ae9 +8019,a5351234a2860c3f9c604a440ef57f60 +8020,508b57a090b5263f701019b13d3b1a5e +8021,b7b4ea3f57938ecde8598c3d97ec45ff +8022,9ef1ba28547819c2e251cbc600d36610 +8023,21bc4638c03437702390c98095c56f0c +8024,6c058c27841b247b075c8664ef1d1bb4 +8025,bf4f134df648dbfd4ca8086b03e59fe5 +8026,9af51f01eeb0ca9013f913cf89ce4202 +8027,bcb18d548b23c0b4311c81a8c4d3d011 +8028,ee07ba026f0861c12a9aa8672b9e94bb +8029,0b05364659574d1c72c8dbc8f345457f +8030,8138daafd2bb03a6a97a8f3330853154 +8031,4b2c563a48d88e1d7fe8d5aa62b72bb9 +8032,efd8d1c85c14f5c557267a48eacf8942 +8033,98c7a4d9f85d2d8e51897937925bdaee +8034,0c946d59f3b0b563ecbe2e1483e14cf9 +8035,e30fecd717624223c611d783d21a5308 +8036,f664ef73e3519c52241c70043151ac59 +8037,33948e634c72b71829f00c14daf2de62 +8038,1824d25483748c6c26646632ef53472b +8039,9115dfa5a5551c1018e72e59108f6f2d +8040,11e12e29f3d96a4b1ae298e1150319b3 +8041,6c6b3a3286c2b2755c1a2b61bd216177 +8042,c0ee7624f144aec8c3832311077a207c +8043,1c582817f7752a1e840a0b4fdcebd8c3 +8044,efa2accb2101e50f0883ad1b63db8733 +8045,3ac19ca184970e1b14d0cb4f7bfd0e76 +8046,5671b596f5562e18af94cd75f38aef4b +8047,67ca47b9fa7a9595201aaab70e6407ed +8048,77ac7575ca57d37f1b41a2d8409a47c6 +8049,ce6d2272bc7b93c053bfca7be1bb8321 +8050,5bd63ba7cca58bb671443942bdf0b61e +8051,0387f54b75ffba0667345d6fa4f78796 +8052,9ff7976666d7c13d552cb039975da6ad +8053,0012ad06c31f48c21d4b93d766ccc869 +8054,73773719d66d7c57b6b6779bcb9d9315 +8055,c52c5213e72d4bbf9b0c0f05ce3c8ec9 +8056,f609c58a16d0bb2b8faf9a7c92f20b3e +8057,9456ab9284473879f26669418e4eecc8 +8058,d76b6a4491b9a256c7194a2ba2f197f0 +8059,d8c3aaa7d2c129a68ff983b64c95f962 +8060,63f8f8b4f8979ffd960c68fc670fc365 +8061,c8b832745334627e78bee2f92b4fa15d +8062,e6ee2196cb8b9f2ce02ccc3c94532c12 +8063,6a692892f1f794fed77b083e23f39b72 +8064,76ad82897a1176a62f73d1c1b2f63d4b +8065,d09c90a8a0821194d0cb7cf0520ceaa3 +8066,52e1a033edfd1d7e9f110480c3428dd0 +8067,c28d5d27ff769591fb1fc59c17063507 +8068,9b37195d8405c2918e2067f4291b268b +8069,0824c9a336c9ef862114dd7a16878d73 +8070,0c97403eef19a6435ae3992e5b140d9d +8071,248e093b5e8a08ff7ca25c421f360f08 +8072,dc5a491b0424415aefa42b4fbf4074fe +8073,e4704c6f5da495deed84ba885d032bd8 +8074,cb10824b38617acc0a0fd010e06bc1c9 +8075,c5e7bbe63807043f31a8b9b17861a34f +8076,d01d25a2c0423d99400b85a8dc260236 +8077,ccbc230924efc2c211c975395e3cee90 +8078,050fd57b7cd9fa4043ae881c07c450ac +8079,bf7f2884616894360de845110299e2eb +8080,194e7b062387f42bf7311424a38f0ddc +8081,55f2ed21ea53090c095f8c439fabe2a3 +8082,8ebe94c6004d918498eab5f16668a9b4 +8083,3d439d9a8e7ed2d18466405c0a4ed93b +8084,72450c71b8e658e508117d3dd01d72b6 +8085,826f6853d9b51cf39e5629fbb2b9cbbe +8086,f02328e95fe7a93e2bde51a9ce9e49a3 +8087,e5ee43734f0d30bd94ff7d3531bd9747 +8088,7b946896c038fced4207c4c5b121f3e5 +8089,c6ad65d82788d145bec346b0248649b6 +8090,8aa3ab3bfce11c336996006833c2981e +8091,c07dfbae4840e41df88fd5b2ff61da1f +8092,e74e374cbe62fecc71f5a0d54c08440e +8093,f376e843bc4f1acab356ddf868077d2e +8094,07e235b6e5f5872cf9059ec23a4e742b +8095,149999e50c4bb70def9db52c081bccb0 +8096,aa0c823f8268877d83d843cd14fbbfe6 +8097,a308a969cf18eef284f353d9b42e7e95 +8098,2b03bfcdd9a4e6d8df0a29c5fc23b05e +8099,f9b5553b0a07e582bb57e9308b1b3cd1 +8100,3a18afadb9924b07d04cf559e266425a +8101,33e8874253547c482b0c55588b13aad7 +8102,badfdc47e5aff16c9fdbd6c392b82a7a +8103,742f13d4d4575b01df8b5e8c7f9f1e31 +8104,7b0d391d4c3695ff8edad53a840d80ce +8105,de6a077f3c3a0d882170d3871db6a359 +8106,088cd9f7ecce021d8d837eab41fdddb0 +8107,8289a9b73346ad725b1e465eb640d6b7 +8108,d3e8afa5613d2588919fc75dda8198fe +8109,b97cea3ab1eb2bb290d555401121aa0d +8110,e92f584339f09dc60b971977b9894fb1 +8111,08bfb5678c87485e99a22f0d69f08303 +8112,b2dd83ebac478dcb60d4127f3d9e41d9 +8113,885f2105a3c49870e593eb003175cebc +8114,6c967b2cdc0e3349ab0cf9b8e23ce712 +8115,a1844c7a3a3564c0b631ad3867ff27ac +8116,714d2bf34beba669ff86fdb418e39f08 +8117,a4b5121e68aa559bebfc419333b8926a +8118,ab6b4883aa46c142c71e27613d2bd0d2 +8119,5e0d7e4da46e4f031a3d68de4da122a7 +8120,376415d0e5c9d5c8a5be4bae4ab0d195 +8121,c8147d64fe2996e18875e81c90fd1dcd +8122,52a3cb874efe22bc775c6b81738bf5a8 +8123,d75c79bf20db994e90982f22fb7a6dba +8124,3dd688bd877974226d9ed38137c20a9a +8125,3828b9c4334250f242de090b404b232d +8126,7ede69506df1a6d9357cb4ae03f4519e +8127,2c92f7c31b2382d96ec17eb1e990c04c +8128,d7020fc6b500d5a72405ad50730c3c07 +8129,bc7c80399f9d6eb3bd2e98407e683bee +8130,a892661c0fe0b11688d3979c7f678bb0 +8131,3f00d28221edac31b89f8aa7a60ae36b +8132,2e3e80b11e2b4b92a6cd32605c258664 +8133,0c1522930dd4000b1aa2c9f345846f7b +8134,2c67259c14ec391df01424a13fe48e88 +8135,d7ae3f45958ce5fd46dec5d99ec9e438 +8136,4aa835f98654b78c40d3764335745fcb +8137,9f460abd2f73b86b3ecc0ef17af454b1 +8138,4887f8316b6d68827847fdb2cf04d5e9 +8139,bf8dacf2ad9ec1db1eac314294389205 +8140,b56f8e2762f58d980418de512a8b292a +8141,d5b5ca0da9bd61646b206ad2493949ed +8142,6d63056bf099f1bc2e51b4459c0c67bb +8143,f499b230f5be2347f7e9a42bc59354e3 +8144,715c5e33a879e442e0323474b6931fea +8145,f97631ce620f6bea177a6092b22108b6 +8146,31b582ecab96ba5090db31cf094f1ddb +8147,6c5aa5850ea5c50f3f3b075b99fee453 +8148,37a1a019e7da0b2b90a2cd25eecb4bcf +8149,5dbe3bdcc3a3a62245855bd61c7ea50b +8150,581205d610da9c4b651b29f96c5a114d +8151,ab105398ccb91994a0e12016dde09724 +8152,48c419e7467c7a5aab9808a213a1926c +8153,9c2f2ef21f1178a8819b94e80a1e9789 +8154,a57d7eb229550beb10b78baf13323c2d +8155,b96e520428799e1fad4523043083ffeb +8156,7c6493e2c63c74d155c9491270dbc2bb +8157,e61fa87aa6b8637233678922e8de4f74 +8158,514270988fb87e0df6aa796e9a6313a0 +8159,0c7aa4bbb8a379b8f3a93434743c0bd5 +8160,c5b740986ec1444c95c1997d1dc631a3 +8161,0c88c44af8f5e71fe2b1936c429e72f2 +8162,f6028f5c0d1058f03f9c9962394137a1 +8163,b9b41ef7c6166f83b01773fc79698a64 +8164,435af53377a56d2388c67939bce5ad25 +8165,eb23139b84d57f561c2c060a462076fa +8166,579bb20bff426764e6f53d0c7003023c +8167,8f833003a82a4cd9e1f167cd24449291 +8168,c29b9a325590aa757bcde78591e51439 +8169,f267a2f56c1dde53e2f46d390814a696 +8170,c6c834626463531a460da8ac2501ecf2 +8171,ae9d2c94dd5d7adc6b137c9241e78814 +8172,678d4afb9b85d8354e7dabf3c5adeb83 +8173,45118a1f05f44872de4f3abd8edb232c +8174,86c27444e9277c5250d79d1a2fa6f63c +8175,98b40c3cca8a4a0f2e59452e5450bbea +8176,185b44bcd614387b174aa9826e69c85b +8177,667af6cf6a00fe504c3d06204f33999b +8178,4da13f66e1e829a6d89619181b0e0176 +8179,4f09a68cebcc9cc6555495d9121a55f9 +8180,b93c1555705e5ce964995e33c0656e49 +8181,5648edaad86d69cd690467b2d3039701 +8182,b4e332d57143194c849dc8c4e1b1ced3 +8183,19bc23b40438fc4a782c3ecd9d5343e7 +8184,304b7e01f08cba93a08ef549d1b93b77 +8185,b5314cf8966beae139773be9f414c518 +8186,2191fa03036efc1fdcf680fd21b25f41 +8187,cc2aa98f402543683bab6ec3cc4909a7 +8188,9773cb8695712c6f3195d90fbd2ca3eb +8189,6033e68afcd0a794e285ce312b84d14a +8190,267190c006691884bd63da22ebdfcd59 +8191,13f66e411c8bcf9fdcae3acf062105bd +8192,938424d59b36a8846706d8180ada3f13 +8193,6dedd6047fd70134b39988ce509bc60e +8194,8b2457bdd80b52732c9cb23ffd3d4f60 +8195,6bf2cd5750c6841795f4252c7fc76ecb +8196,4f0e8d1e7dec6705d5696d5d5bb650b4 +8197,7ca10caa52219ba46bea20d3792ebdd2 +8198,7787b09acfffac5a97298ca05f0a274c +8199,d4c9b2cbe6b89477b947d9946d6433c5 +8200,b79a83d5fce4e2bcdc28ddd0d247a448 +8201,4756b03c2e506a7df1d6dc76e4d8ab7d +8202,11f6ad2925c8d42cbb4e094579028c43 +8203,f6d220931a685c6d5e3271351802474c +8204,3fb0eda26f2a007e783e01a12c505a95 +8205,852ec707610f5303db3a93369a92e40b +8206,1f525d4c9e906d30b9ae8da868d04c08 +8207,50901914ca081b16873abb7330efb0eb +8208,4031d86309b56117c5f0c4e336e081e6 +8209,49582096429efd0c86c3964b5dbf985f +8210,4301aa975df1fde1d9ba2fb3b236ce85 +8211,a28947d35372aaf831362ef032931495 +8212,eba8f129f0a3c7bf767c61881bc7ade5 +8213,ba79ca931a277fe8cbee02be48001692 +8214,171e73270b0a466b84994a1a7d30e9fd +8215,30d179655a844c79b02c510f646d019a +8216,f9a4d1539b9a559ec9350f324c93a29c +8217,923a8c05d8c1ce2f09e3484b4d64ea19 +8218,d220649fe3fd9666bcd1698806b3428a +8219,53d89870bfa69682fe2d515c155c5e18 +8220,4a6deb31a422e6e3e5700e8b07ad1633 +8221,b554836b878681347644d9074a66bc69 +8222,00d1ad98bf145418fc1c33c3457cdc68 +8223,d8e0112ae91949dae9a72b3e02218b97 +8224,e25e82b84914467fef366b60ef953bc4 +8225,1cf46907bccb1272dd38b49d4b716f35 +8226,9432dd1732eeaf1a1d6ab718d5e37ba2 +8227,96df13d265dd85d7dc6778e2e122ac1d +8228,69b727310363b73dcf7c04e4fef96785 +8229,1b778bb3582bb5138e94312f9993fb42 +8230,e9e1604db2be2e6a11dde670bcfd39ec +8231,d0405a91c4abdde348847a610cba5f26 +8232,3f9a91dac12d791b7e20c71d0858ef43 +8233,787fa1713f353e825a71248db07d8bc4 +8234,c56326719356aa4d598754be7723ccff +8235,ca090956d4c99b304bbc971609921ea0 +8236,4ffc8dbd62cebc61df6bcd1781ac595f +8237,5e5868e8dbe028cab0cc7d60087dc826 +8238,e291204bff5b0d2af61bf2da26220f04 +8239,8a7286b558db4baff86dab9b5736fa46 +8240,6fd3d1b527c82aeae22f6fab1d76734d +8241,11b4ff07b0f8cc35f6f1bbff103686a1 +8242,0f86845c573a51b25e7f8ce877bae9e7 +8243,b79453b8bee2b32941081f5eedf726e8 +8244,f2c8c1e8d1480dd2c95c48c7896c6130 +8245,cf342892729147b1863abd4225140e7e +8246,4269c6d96a56605e051ea17de941373f +8247,e0005fcd9b633e24af2a1e418741ac95 +8248,fff2fb3eea6261d550c48c7fadc3c814 +8249,9adae85c64ca61433e1d75f4f1d88172 +8250,f0698800f7a9c3c9fa120fb5ccc19c35 +8251,fbcac478fd2592eb3dca04e6909b85d2 +8252,1b6c3ddd49aa19debd70845853220935 +8253,5c804003c08d56f911e00b7e5cb6f16d +8254,e16f667d001048de1305b2993a4868e8 +8255,1695c5b723041b125baddb5d2013757f +8256,e08f963f6c839a6b1425bc4b70872706 +8257,6607ecc231447c7babe1bb50dfd5fc1a +8258,d2483f954473ed92b09cefa9572f0909 +8259,12bbc999d420e706ad3217f48efe646e +8260,1687fae683c0a32a0c02d76a2c2efffc +8261,286d05f069e1cd6a5b6b71cb2a6ce9ae +8262,332be601a38254e3f2a9543b78946f4b +8263,d5728f7216ec1660e99dbe0e4396d2f7 +8264,cb729e40b23a96060f7f9ef3535fe7b5 +8265,585dd412bc831e6d6068881b4201ea1e +8266,0bffd82258ca462c504bf2c3d4f42fbb +8267,7540a196e4c925e639951c4019875555 +8268,af49155fca9edcd5e86a43c1d17187e5 +8269,af74cfa6961e2b2509cbd04349a4a4e7 +8270,9646883a276c84bd36e74750ab2c371e +8271,5bc9cebe577226dbb19a272d3adb3a4e +8272,f1bedb38703c8de3d598ec0ba659eb0b +8273,143ff27ce32b417d4987675945271528 +8274,a19479c73a236a79797a0e8d21b9a08a +8275,3971752c90c19b65ce089fba4260654c +8276,07ceabebc87fd6ff2db990cf22a0105b +8277,f283c1180bd3d245811e0711d439c3d7 +8278,c58d8cb7ddcd8400fd5025fe0724d46b +8279,8f87d022abdc10b4cb7c0d0d00b7d828 +8280,b3601569f1f669459c5786234316345e +8281,3b1c95a4f259eb17c268a5fa1b525176 +8282,a803b9e5e1f966ea834e8cfa02a4aac7 +8283,a50946988bfd02f4f9383c10946e5219 +8284,425a4b0c1d22b3a1f216bde60a2908ce +8285,838974f217706049e76a596b9254ef03 +8286,9185a9d541e6377f9b99822bcf51a6c7 +8287,4f0b34e361532e8a384dfeec8001a3f6 +8288,3e2b228d6fd8ff9ffc1382876d081631 +8289,0c2657288005c0ccb32e081ce91c25ee +8290,22bfd47cc40033db6c197d620c1ad10e +8291,5f895e0e4f3d1183de949eb49f6e30db +8292,6cd45669328799504ca9f0d175556196 +8293,ca9db73950a86257977e0ffcc3ddd825 +8294,a75c79b8b910e8cc4fe5762b1bd4688d +8295,3a18e3610486ae609f802d93fef12b61 +8296,2606270f7a70c665cbbb1fe58421f7e1 +8297,be3d3b01cd614c2022a651c15a24d13a +8298,1151ad3d12c68ef11e19796488899640 +8299,9bdd5b4033943d379b56a188fba7aa31 +8300,a01e1e54460b89f99de5fd5862f6b08d +8301,6170030ad9443b256ca4fc46c69839a2 +8302,b7960e5876e3570a0d28f9c30d300364 +8303,7c9a506fc5a84b48222f9347fb4b799d +8304,e67fba4367900900dfee4bc6f43cf6e9 +8305,5c4ad3422553a1ccd01efc813b55d27c +8306,9c33841af9b943ba054c6e0262fe57ff +8307,02b2953df2bb869a0e3fe21b9660b197 +8308,c16bff4807d6a8200e7d26c78e6ba128 +8309,f735f9d69bb1e440e9ef28c7f74e1978 +8310,274795b90e5277e501add285e9de1c36 +8311,b0c8fed3eb90e6a8e7c972228d0ffe78 +8312,f3038fa8e24f87ab926394f82cfc3633 +8313,e423694db6c97b51b8f8c749ea3e07cd +8314,a923a142bb3963aa3e701b3d5c1044b8 +8315,392ecf51d0861f60a51d1a96021a76bb +8316,c18dac0f0026690a4b1f9e06b833dabb +8317,b5b592464973454f403f9bb86ecf8f1a +8318,7d7d3903c52bcf02920cf8c353aed42c +8319,f99903ea10441739b6e62b8f9ffcc5e4 +8320,889ffe82e8b432d93ab191649fb259eb +8321,f7b5f5864dddc6c29f53f914420c3ab2 +8322,206dc6d617fc28415f48753b734f54ea +8323,4b9d527c07df9cbc245989292d2b9317 +8324,bf91e1d4510b47b1208422ce11032ff5 +8325,1662b2c299fa8625c999cc40930cd881 +8326,8a88e1224c3bb29d4dc4ee8051acc8cb +8327,cd8300f7229f4653ca09ebbb935f36fc +8328,6df9480d4d543a5e22cd3bd078e000ec +8329,5a1cd897cdc5ea08c629176cc93cb487 +8330,461025150c79266eb227a2502f1a9361 +8331,b7ea3b74a14e9138c6147bb26070178e +8332,edac2e880700f0a692218770588bf416 +8333,88e1aa40630d4368c77e4edd37eb2a34 +8334,942d4c4251efbf05614b024662b5434d +8335,06229775d2caae50fc26f50f18305e6b +8336,6c3285e888b4370fb352e6c458d2650d +8337,102d9d6f79dcb72e7d595f567fe2a573 +8338,81555984ac582b32d6d520cae09032e2 +8339,bfe03015546cebf7c4f5c6e5aebad6f5 +8340,300dec54ea13ff5175a73b544c60c736 +8341,e3781fd76fa5d8506569d6f7033c9510 +8342,8e74e13660083583e4e14ca480459ec7 +8343,ad00ba43c52a6e9855f7dd40deef2dc7 +8344,501ee8d2ac6ba35589579f04e0707cd6 +8345,ec2dcd3e1ed0bfe633517b296efa0060 +8346,9fb96ca269c42ac1ecd3fee1c35674ad +8347,1611aa2a02c047b1c243e2184d6345bc +8348,33e78b8dbf632ce95d4dd53ac58b9afe +8349,a27842bf1988b1d0c740b7e239a7d539 +8350,058250082b2b2fc8d0518dfa604e7d58 +8351,ed70097514215362b599370058b3a2f0 +8352,a272714239de78190dc53b567d23e210 +8353,fd354596b32b7b2349dbbfb5f6637f8e +8354,6fec1859179647bf9c29f71819eae421 +8355,9568210f027221b9f0481c110dafcdf8 +8356,bd8c2ea510a8324630ebd83fd6a9d228 +8357,c5bd63284ae5b17d21af6220dc48af98 +8358,9171eb4806d85788af6259fb8b58dda5 +8359,ad3eb63e19eb258801a1810a8536d8cc +8360,8a23be934ce2f5ed42df8ac14a69da7a +8361,7c94b11e83198cc303f8e9751ab41715 +8362,5859775143174ceb56d211fb6e8b7d3d +8363,8eeef3f08127bc2f26a53cfa757deb2f +8364,b1986733b0d4040260f1f7ea163acd9a +8365,386279ee65b1f99248b916abfb6d2fdf +8366,62651c64760e317a1a6f23e6431e0174 +8367,881384b43ffc5730562a2d5ce6b91adc +8368,eee097609670ae7c5a2256fc7f8676ca +8369,917830318a33167941ea9a44c6afedf9 +8370,50293a0a4084ff2040e4d50d5a0f2fd0 +8371,2db2dc55acd781a82e9a9b4e7e867378 +8372,99ab94c221136b87651639aa6a6fe1c1 +8373,bdc876bd1d9303a7794ece5fc7597322 +8374,1e8cad9b651ec5587cd3f2885f9536e8 +8375,256e78f4bf60acde605c214045ceaa78 +8376,689b86de6acf76a116fd11e9320d0211 +8377,9956fb0888ac1e9eeb5ca509d1239d81 +8378,c83aa64975d75738c232cc8b71571c23 +8379,b000a7fb1fff38417cc0246cf40ccc0d +8380,7ac1f819466ac1d062203cfa5192b73a +8381,8b012b8c420372fafeccddc5d8ba09cd +8382,022e2744775149531e54c4f1c6312961 +8383,797050fffe62622b0ba63a64604e98b8 +8384,bb6b617e8963c3ce3b6889af41657d50 +8385,8da2dd2c18f3f7fcb94f44a1a551b009 +8386,95527b19d7c766715e15e5cfa5f5d941 +8387,b26491cb5b031cf8d889cd65ac2f07d8 +8388,4a37a11ae2f6fdb4db83ef77c1158eae +8389,6b0a0b292721409276109c1771ffdffe +8390,297ca32b80d0153a6d94b0ffb0bf42b3 +8391,55fd1737fb5a9fba48db450e001f2b2a +8392,d9d5c4d05aafe9a92a5816180685ecd6 +8393,9703765a63b60ad81d50e0d5d9a6f215 +8394,2e20e46c34c1ded2e7ab965a2a6ee150 +8395,0d2e202b363defdb5fe4038b32552371 +8396,1a969b095baf03fd86f216d9c296f02b +8397,bca5b3cc599c1c97d8703e8c0820b88e +8398,0ad3fe8233e08d2f4fd8b448152fbe53 +8399,fb91824f1a3fa7a56ac67730e084e5f9 +8400,a20237468d26649204204e3be740eabc +8401,b8dd24f4215019c9e5e89ab1927645ed +8402,0be291498f15a3c03ac012a5b5d21d37 +8403,cd23663e07240a20a3916992854e9293 +8404,c5953a60359017075bcf659edba33971 +8405,624517da134b3d89101bf6b061199903 +8406,9ec008a224424cd3847d15c643ad0489 +8407,02b2eef53296d422216e6c8d964413e3 +8408,83eca283105d3b6ab80c895caf710a7a +8409,9e19587c321d536a58589858c72d756d +8410,f7c0158f57605a735613b55f0abf5e68 +8411,c92b37acc9eb5f41f5d1a6a2dc909f3c +8412,8824c5b7f7bd6e1162d5230d81da9b7b +8413,2301ff3cf1828b76596ab84b99edf83e +8414,c338ae91ec797e6bbd26617996567e23 +8415,68031cfac1a5bab3454ac163d79b6465 +8416,5b7a7ebdfc6e9784211a192db14cb233 +8417,d66f57595d805f58d86630339b838f7a +8418,b338c81427eba2193c2d383375d929ee +8419,4b492cd1edfc5136fbfd93e50b645c8c +8420,1a2c7f6f324fae68fe188b0c308db379 +8421,a709a54963c5d49a685c7c6703d2db0c +8422,68bf3d794a5357b332389c31d01344f7 +8423,b38ae01f411a82d0b9530ca99761df8e +8424,8f983a3e01728395e58c891cba2fdf4e +8425,058f0634aa032eadf40bdf2f7df0091f +8426,f12b248fde8f11ec0ff0d2acbe2714e7 +8427,72b314f050acad9b74c64801466dcd8e +8428,5730f6bcd9c18967b6ef9f3e96852bf9 +8429,a39a38181147afa59c9f569dcae670fc +8430,538e5f55e708a0bafffcd0edda8eee5c +8431,4aa1919515e4515f72dbb70cc5a17442 +8432,248fd45633e029a53f34c06f63063106 +8433,d845151298c5c34603d2205c39fc320e +8434,13364c62c0c724b8505f52b985f9f4c7 +8435,336454e871e60785a3432a471f41eb6c +8436,922b4647acfe6892f55b178582c95aaa +8437,f1ccfbe87192bf8e0325b32419757aa2 +8438,804e2c0d7eb202348e47198e58a454f2 +8439,47bde4507ee3b8ee0cb7ff693354ee0f +8440,403855702e5292db8864374ae0180260 +8441,a3f35466eb0e08384e9b3ef89be6ee03 +8442,6c145beb2d6dbaa1b58d8cc6ca650341 +8443,0740da01ce9387150e5414701e026bba +8444,e9cdaffa370b42fe9910ccac4cbf4006 +8445,3f658f5d9619e2139f20707022ec53c9 +8446,5b8ea3cefc29b6ddbb18f76ff3ba72a9 +8447,29e2cbe267445acc4a62f3b7db8479ed +8448,b27607e782d3be0dbeff7655cf35b306 +8449,c66b1eccca616e9606085d25008ee556 +8450,1674b9764ac6feef6d415f5a469fff8a +8451,42018647f64d44ae2298255a111f9ab0 +8452,a87a769d28ea96b419f2bbf2d46cd1ef +8453,0cd8ced2b8ebe9ee114f6c0f3ef9ede7 +8454,af7228dc9b47147744d6ce1f49b495aa +8455,cce3f422195d5717bc53f3550372811f +8456,3e61a201b6bc64af6144248fd3ac25e1 +8457,8ad44d3c7b735e468c17d307d275fa82 +8458,0516b4157069fb353b35dfbf80572794 +8459,24d18790bc4e3b56f7845434e37c1f1a +8460,fa6315a6fb6f3ca32be1d72dfe8e8aaa +8461,e9a4f04d3694f57b65ddc64d17b7df50 +8462,39497e1da26e5cdc59fac499a8299850 +8463,cc58b35674594a20aecae333bfaaa782 +8464,a5e36314dbacf19a07945eb5a6c0d1f0 +8465,fccf7480b1bf00b00f82de9796fdc9d4 +8466,c0193c33b2808124435a1b9812a95362 +8467,374e5d2d435b245e08ed77bf749aa2b4 +8468,244e984ce07673e16cedd923441dbdb8 +8469,112665cfa946c05aad446c438eab56f2 +8470,30b9252163e8a967e445c69ef6df7ed4 +8471,629a9fdf257be9471b8a680da80c32e6 +8472,7a520960599e686adca81b39e7b0fabe +8473,73633ca5772dafb0896fa7f2d2f77bb9 +8474,25f5a0388cc59caaddb45a37ae9e6f1a +8475,359779607f1dc74f7d9fc749ce47ab50 +8476,a023ea0c0f047f0f481a97b754c6dc9e +8477,05ac0cc15622a66a43aa5eca735c48d8 +8478,63ad95310fe50ff99cda701f0dc65890 +8479,e73dc76c25b35832e87ebccfde350fd9 +8480,04ac489d7a23ea31851312bc2101eb03 +8481,37306f3d43a791159c9321de89f91d68 +8482,43910a38accc686350ecd40144027b3f +8483,33ef9b777bb5283c881500264744e3ba +8484,a98e705e5b930c551dd4bffbadbd502d +8485,e9162d283100dd17ce85ac39dc1e3e38 +8486,0433d815e74d2566fdc23212377b353c +8487,8dd1da7df75afff8f46f5abccdd0c64f +8488,d1dbbf71be1f0a802ab7da5f37a6283e +8489,aabd7408871f94b1e6a51cb3980be36d +8490,f0c1b8c5f9a19573fea17660959ee732 +8491,59c8f53554ff583c76318583ea944ab2 +8492,71c30bf8ec69a0a0b6e769faa3520c14 +8493,bd84714ba577df981b2aaa74142033a5 +8494,ae2efd67fda8e0073966d08e2060fdfe +8495,8dfe90be7e3dd99bdc58c4d7b39ffd22 +8496,cb5f8deca06dc8dc5223a97636e2c8c3 +8497,9ef6263f03845cab4b3c9b9c67b244e7 +8498,b9d97407350034b53e81e0f863f84ba9 +8499,15e43b661a72d22a63b1e6a15d121104 +8500,b6952877a05d0e86a7d13073ab69fd34 +8501,b9bc4e2b84596bf6e33d12da4401eadc +8502,5797dafae5585095be5cdc3d75d3b143 +8503,39335e56ab732384d3edb4a4595f80fc +8504,0f33e0edacc71c5dcefa0a374a723ab9 +8505,eb106499e738f99118feec171fefa3ec +8506,b9e95a4c95bb51f3674249e339f4661b +8507,3e7e9eaa347a761d7bc8737fb34db145 +8508,3849192933bc7b07aab8721bf10ed818 +8509,818e3e898fffae8351bee26640c6768a +8510,f513ff6cbaaacdaa96fe8640f5015d60 +8511,e234e613f57a057c81ff4e531442f1e3 +8512,aebac3711212565be60264e87c2fa6cc +8513,497d96d4c35b558d8e10440590eac915 +8514,45f062136d67210095bd2146ff27d216 +8515,55b669b0207f81bbe331e38b0db1e765 +8516,0d0696fda615348404718af20043d972 +8517,d936d7fcc03873a03530c71fe10f92e4 +8518,d4eaa67d2d7946e61f8155a1e802d511 +8519,d570dd8d10c15ee22b7f6a310310933d +8520,cea80ad3743e19488746b799f84c5631 +8521,58cf38a5f7846afffb446da7e9cf0a4a +8522,2b581dac5d0ed4323b8b2a7e0ac2691e +8523,3706aa3063724402204fd6e880308b12 +8524,609e78f37c44f0baea44533ce40e9e97 +8525,acab7163ec1240877b1916c9b32711e4 +8526,74cff9168e78b7e8c36e526fc6b692d1 +8527,3906ab22039261e888b9520146ca2253 +8528,de901700327fe14f8c7d4f7f40f1ba72 +8529,2eef52374e655e1206a125619251dc38 +8530,0b28d32e30ae2dd8bd133ca222363d22 +8531,b6ec23c59121719c68bcced5d52e8d64 +8532,97540af7232a19b3487b58c4f3174743 +8533,57d1a012208771e24438f06716cde824 +8534,520b17ca534cf7908d92cbab6005fc23 +8535,42a0035b82b597b366bd98636d26253f +8536,011392952c9d4be6484c809def45605a +8537,93a545462f4f1a82d793313c2c54a2af +8538,e500a3604297e43d252cddd8ecd868a8 +8539,bd20d5e8a1c34c954f06172099581968 +8540,6d508e0b8d1c300383df5b10e26683be +8541,30b357bdb7535221952105335de826e9 +8542,eb36fd0014eaa200631343be8d772fc7 +8543,28afdc68c70f13a4b9e653b9cf3abd9f +8544,d2b91116261b8cdd77e61a7711646e02 +8545,7248ed07f1d1ef671e510111091ee855 +8546,441c8732aed7438a865b7acac72319ac +8547,387ab80aeef59dbac521e332cb9ea8db +8548,b287fbf970ca39473c27fab126b3b8e9 +8549,bfb8d747f525680244995dcd8095dd87 +8550,3ee3353f20a186456dd4cbea814bd48d +8551,962806c7a48cb09cf063ef496bcea925 +8552,61c0489bc89ee92d2f3e3516f90e13c3 +8553,7e8aee5088837df4fc5b69a94792557e +8554,2d568b31d1117b786b287ed998d3a584 +8555,d6a80dce48596546635a426c200c2532 +8556,9c06f9b85913dca04915b3bfe85fda0b +8557,00a8cf052eb6c9b860f63c9eeb69f6c6 +8558,3d3fb8440f77fe5d671ab37a3b0e6d3b +8559,72a2303ee4e020309e3c031676c1089e +8560,a048424db9c99911c026deb2a66d786f +8561,b8ac1b3cb109f385d1bfd59a2715fdb7 +8562,1b234b92cce238b27607d2641cbe20e0 +8563,17163cdd8139eecbd73ab774214ef634 +8564,72845a39e2e7078be6a3a23675fcc779 +8565,2fbed53c6e8dd7111cc00548862504b4 +8566,08a506a70f70a9f6c354e8014273547b +8567,d41d9838aafdf1dbe682e9d57e1036b5 +8568,c5d771acbae3ddb91b958ce7d5ed5eaf +8569,85f82586c21d239ad4b7a876072a6e81 +8570,83861f8eab83cc67e7fab5140a387390 +8571,178ed01ffbbee9442b0cea12406e862c +8572,5bd4e16a7ed1b11b1119b338ed39de63 +8573,22cf7fc1b1a8241291a6b33bd7a18413 +8574,6576037c547bf1899fb8a341270c89b3 +8575,27315b2f43f5cb8abd22e535c6fd86cd +8576,e83a3148ed4418fabe8383fea07a557f +8577,bf3d9b4844079f3f4bf5f3d17dd99d1e +8578,44806059a55d37b9b7d4f75d3401c67c +8579,e1f2d2ecf1f8eff415e1221392168edc +8580,918abf9f28c30f41eb9f80ff9c061661 +8581,5593af1d221aad6dc91043d1c15251e8 +8582,e13dd1c143dac915b60693fbb194f333 +8583,7a68c397e15924df3c1ebbd46d0ccca5 +8584,d3b6b353b1f764e1f3595882cf8e9551 +8585,16b2e3fef4bdc24f38326c16a731e311 +8586,9c748046a1fdafca16109fe7b22678af +8587,bf3972426657cba3100c8ea290bd3591 +8588,52908ba0d2d1dbccdfdf586c213d277d +8589,670a604c5299ff0123f053f36072fb5c +8590,49e9494a5dbe330da4a2ec3aa5a3bd70 +8591,53e90a3da4d6a8fd66b4b93f77c8ee2d +8592,591c8c18434c5dcfa21303de4b0b32f9 +8593,0daa45c095bb14e5a781877504122a33 +8594,6a5eba599d2138953d5902287e81f70e +8595,cbe23ec9b54cf04a6f0e2210542d3524 +8596,5b5f462dddc2e1c2c3821fa659c2db16 +8597,db108e22b2b0a3e7497cc60f4c704afd +8598,9629087dbbc729f811ea0e6e201ca96a +8599,e95d8a00928ce07d94a264741381be7f +8600,be56ba3460ebc6f2b69f903db401def7 +8601,79e30e5e0d0f2f5148bc719ed8a4ac2d +8602,82e6c3bd43b66f4557132446a708fe7c +8603,85eef59896c2d2274c1f90ca4305eb9f +8604,9cb067143b253c16665b248736cd1a96 +8605,6770daa6320fdce91cd05b186523b057 +8606,e855d0374153908bd8abf62fd2566d13 +8607,feb21fd6d947c29c4687250c050eec25 +8608,6098fcd300c8a88e04a8ffa6972bf431 +8609,1675c5290c0b7b41a006cb9c01650f18 +8610,2840e38f2663df0995e6ddbb68e203ff +8611,667f6b182d97b92d97533daf8463787b +8612,2d01a4af18049a82a7439aed391c5ae9 +8613,08b80c88c384601360bd3310d506de82 +8614,833d681737778f59790c3f643259abe5 +8615,9347f1dedce024af9e935ec0196d78ea +8616,e1cd8eee1af92a5522413e2837481a75 +8617,eec9e259ef4f0fc08d1b0d4857b3a799 +8618,cb35598e11bafdded4835a05f4514d16 +8619,698db3e27b37fd0c12acd8e6bc6e5319 +8620,0b59cedff1b72eded1a19f37e1b4a231 +8621,1751bfdb8b08f25511f127000a5c34fe +8622,370f060c8a8d1adfbbb137b2807f5a1e +8623,8eee4be971948e977dd0f9e1012f3ac8 +8624,bcb71e4d2af1c738dc70fc571c91a437 +8625,2a4edf1b131c5da8a74b54310db87b33 +8626,0c13e70bad624900fbf9d5bb55c812d3 +8627,c8cd5f6ab2ac67b9a6d9b6f45cb2828b +8628,b4e7934cf1d8a055093981a2297effa2 +8629,812d6b7f2058eb01f4bdbc1188921f6b +8630,afd1340da29fd45009a66954207f8b6d +8631,1aa3863aa97b5bcb5a8133b22ee2f320 +8632,c1ccd1d9103dad32feced0121b247301 +8633,4f6076cf113bb53156279f0f582f5a97 +8634,164de2816f4807c20d13d360405718d8 +8635,57d91b924ec57b5e8c703e0f34da3c7a +8636,77be7e06471eb0591e2697e6b04cf0c0 +8637,baa6887a108b9b577303c623a2c8d35e +8638,770df90b54b81f1335377bd301f0dbfc +8639,c4ab88f88dc1c966110343b4b1f5c84b +8640,8330e340e61d9ea7501d73d3aad746e8 +8641,e643c6e46b2efb8f6970623936ffef23 +8642,d987be2bf826ee2fbd3c137a8b96ceda +8643,728e82b5014057e6b46caa3c680681f7 +8644,06daf21ebe08ccbd37dca9d2cfcebe76 +8645,671a2c9249e8b270e2ea9eb1445286b3 +8646,24b8f8703eaae213d40fa7e07926818a +8647,3669e962dd4b33ca198288a84683080d +8648,28737edcf15358150e6fee22ad29bf45 +8649,40677b5db1fecd41dfb6ee112310ac66 +8650,44092894514241fc53e85034eeff42df +8651,271610074fd83b0110d2ce8a7f6389bc +8652,19e9693b61a7c64fb0f930c549c8f9fb +8653,5e424e7f787f246fd95c9d24521841e4 +8654,69581b87708048c597aa2320cabd1b1d +8655,fa589ff2658564701984950d99a656ae +8656,20d168be222a82a267341887e8cc7ce4 +8657,764c8ee8d634b581519a8c1b9925a368 +8658,0cbbc26e5f1729a5a53d51dae9bf177b +8659,15ed871a96e147049d4bf47b3aab7bd0 +8660,f2152e53dd4ad011058af4c6e32e0a3b +8661,c3a9b151912aada119f6cea31dfdbdd1 +8662,e0890c1787e7a6503191cbd55c713e16 +8663,262dedcdceb58910688db09d9f124272 +8664,ef87bd0c080d9922f016d075398c56af +8665,4fa76a3fceb7d71b165e3ae53a91bc24 +8666,20aa3991aee5147ef50aafe628dc7d74 +8667,65b027e3e78602b4a0dd03687e7a7072 +8668,ec3b662485c728452d04c402f4c0ef1f +8669,d032607b4162ba448e011c31ea13a477 +8670,5208c0848269b140c07acb86b80c46e9 +8671,c1d14a625e5fcd3471b1406bdbbb9bde +8672,36c7a712d2e614822e49fd20d3186abd +8673,45a8c6a3436c2ceeb04d65786be54ceb +8674,ffe410b571b32414d2b0f9181dba9ac7 +8675,ceb365343400fb424d81c9a15e020b04 +8676,06e125c0d999654273e0102930b45e4e +8677,4fe38bc9301779916f134a233c8ecb48 +8678,cc170560b0cf7eb5caab505d87eea5ae +8679,30431e1cfe3cb4073fa29660a35c6f54 +8680,602084dd27d8930233ecc05791709cc4 +8681,ac8d7bae5429030c8ca86fd4860dde26 +8682,4b15b831bfb0bdc94ffe8ba7569bb4bf +8683,add44e5b02db689ad6f32439878addd0 +8684,1b5511a81085aea8c6e80916eb0bca40 +8685,89c08659020af4d123c1b1e98933874c +8686,696d8fc43ba8da28940b2606a4ff74d0 +8687,097909f535850685763b6cc70b199712 +8688,4fae5eefa280be0f294f2e0b5e2e5589 +8689,a8c7a5247deb4f89591ffeb25613f61d +8690,cc56871b10e3d100b6bcb27b388daafa +8691,922d5c452ed3b289077e3df6fa1983c5 +8692,5632dfbf4864fe15be6a6157fda0e8c9 +8693,58ecb05633db25d42072d414ab865c7b +8694,4b3fa84108b9bcccb2b5c5bc1e8a5384 +8695,cfe608c3d8114567e71dd6c4e96be6c1 +8696,517bb9db83a0ac4926e7a8e924316795 +8697,2b6f1985a84a2431057d2206daa133fa +8698,c383463dd91f77458fdf368bedbe3411 +8699,2a727254e21ce1be89bfc9213f8edf8a +8700,3d315c26202afb559051d0dce499b856 +8701,7208ae35c5de93ec9a021f23c8e41d5b +8702,5e11012e6545117382a0762656cc9e20 +8703,46b71375c19aa4d29d9aa5d04c0356c1 +8704,89e839de079dc986cebb3b15c87ef003 +8705,16b2a8feea52729dc8868a7a4087aae1 +8706,4df71fa9721f69aee297dce7898da364 +8707,0cea68fed97cde08ba2931f88beaca81 +8708,ebe9fca86fe25cbbc4b62e11cfcadd3b +8709,9d6b2206115e10e797cab754a9c594db +8710,8f2b7f541acf43d60f5c867c5b620264 +8711,cb95c6ce5316881c2f42121a8f8f1919 +8712,d13b5858a20cda2843c408c2645144e0 +8713,73a8df46bdb33160a0ee0db59f64e396 +8714,6330205d3edb95ff9b28e57fffc1d647 +8715,45dce0c44a19fdd3ba85a8d0a6515f86 +8716,bf0efcff305747932780d934db63f41d +8717,9450558576d5fa41ccd4e586deb8885f +8718,b4b77523abe9db7777924a682c710bf8 +8719,8e605236aad15dc816bd72433f28f4d2 +8720,41db9b9bd53631856c64dc2e749a65c0 +8721,7cea952cc7c6fcac578c3e83571afac7 +8722,5c2e2b4742de02fbae927c94c01a59fa +8723,b67a521f79016da68d02ea6f474c2036 +8724,677a1a7aa3b51ad72aa862952347cb25 +8725,2ea153376fc91d28144f8e9eaf603918 +8726,13be0e3979521abab59928aeb64a834a +8727,bdc822f23f46129b0c1196a8a1ca7b4c +8728,b018fb923589dbc2c046e7b8dd23ffc4 +8729,66a82fd7285187058038e73311c613c2 +8730,63704aa85bd9faa4c6787e571c166a53 +8731,6b779dd1e89f3d83a66b39e52e2e9e8d +8732,965cbbb2bb7096f2be18bdd38d199a5e +8733,ab451220b2611291e7fac3c6959bf7d0 +8734,9b1d2c2291bf8d074d92c65f0403716d +8735,416c25b388b0cb8a4af9da8bab4053df +8736,2a30644f42d51453ff8787203937b474 +8737,e7df2689e1fa3cf4d33b529d80224174 +8738,32540e86870094166397a7d30df0083b +8739,54e0373e8ce67699028333c009cb9190 +8740,e340498208a39fc40b2594a1ed8999fe +8741,d5485e73134dde5bd9354fd9d0d64257 +8742,ce8f542638f463ed0e3257812d27a95f +8743,a86e9a9d84afe79d8b8c89f4ac5f4664 +8744,b5c4e49001d3c74b5a476926a0c9a6a4 +8745,e4f6be28ec744cbd81b2a68198df288c +8746,4db6c5ff8c1e69dc75c3055d30e6fa3f +8747,ee0925b7c83f757913634571b227df8d +8748,04545957ee86c4210c882877bcbc31da +8749,af2ca7fe7082fd770497c2b6605ab8e3 +8750,361ff2f41d6f6c72feec1a7e84dd2c3c +8751,8de631307a9481b824ba0ac536fbc909 +8752,881d2d20247813c01b60f54cd7f8421a +8753,700ab41ac452c4df39efb376447bb259 +8754,8c45a90922b32f252ad92dcad8672927 +8755,b0b3e59b8ee05d19a27cbdd0409250a9 +8756,3912e05bf334edb616db8df6ee214b48 +8757,f952c35077e4758bfbd14bba286dd196 +8758,9286149cfe81340d1515f6126c4f978b +8759,773f185c7a8dfe976060db6d67bd614a +8760,8d241d1b5e3dbfc56810f10b7269fed2 +8761,fc610e294ce717b9376e8dd5a7152684 +8762,125fee454dda9143a5458a55d07e54af +8763,17483688f4b1ac20974b8ff7cceb496b +8764,80e7b56674b6df2d90b303aa80c1566f +8765,4297aa235a01bd01e52900d7c01a7652 +8766,2f7f196d4414487e25dfe3b3a5d18fed +8767,cd00e0c1fa70532bc4ad31bda6562433 +8768,290f1dfcaf30a53eba9287a989e9c844 +8769,6d8d411b330149bba3774e473b12b49a +8770,3ac12a07337dd892b446a581d4e78e20 +8771,292d9f6ded288ec9f80bc4488c906e18 +8772,2f9f53ca528797427c0eefdba489660c +8773,fedbfe437bdb7933c4b9a6f68cbd5efa +8774,f4b570d08c1cecb0e60caf951fcabf62 +8775,6885b37607bcf657a292a15e66106e70 +8776,25088b1cbda864d6e622ce46087627f6 +8777,b543c89fe6345c1c69b9a47fc82b7ed6 +8778,3d1edc62aca37a92ffca4541bc9ee000 +8779,b14aa70624cadc0549424c7aa2ab7b2d +8780,b4dbf25da3201027353c7b7dfb600766 +8781,f7dee849b806a06fec92bdccfffa54f7 +8782,781ef84bebf6aaf890aa8bcfe0b659f2 +8783,1f90769c09330c0c59f6652773c9b1e6 +8784,2fb783c18931e2afd522b008fd69707a +8785,7d96967b5b7e7a8bb45ba5e35820f2be +8786,d7c45716bec0fbe591e4a4510b168b9e +8787,93524c05b870635cdc89a67973b19503 +8788,c5624ef22a3dc94c14588f91a3ad6bf2 +8789,e7ad1011f73576d94dffd19c15c281a8 +8790,0b9de02cba57c267840f9056d286a88f +8791,08ab1bffddcfb9dedf0282ceea6b3a19 +8792,2c1604952c849fe3e2b7194599de4b73 +8793,ddfed4a1b97cfd455b1b4fc35e02dac4 +8794,61d8315e8ecd6d5b1af80a6275ce7a10 +8795,dd81a96cac326b08eb7454f86582b11b +8796,ea3b82fc4599686e67f8d1286650879f +8797,3a745e1bd2166748ba130a2dd659c091 +8798,048070982872d04f29a8bf5c7faa60e8 +8799,6d67a9c78787bd50bb244999afc5bc4d +8800,33f1e3c21c4f28171a9a99d96fc6d4de +8801,c70730ee2bf0ca49b65588425e5e9b40 +8802,fcb08a529131ce3c90be7df734912a8a +8803,75f74bf78b185abb89112742943176da +8804,cb5bc91a66a21662759396728718d410 +8805,35274ddeb482ab29641cdb806ec2c5eb +8806,857401eefce0ca048032de939cd4d8d7 +8807,e090bff5268ac3b91366a1a2b5a8454d +8808,abfed632f62588ed19f831a3c62662de +8809,4e69a10bc23976fd5fdbd4e8dd368afd +8810,fb3af906d3fe2a005531b0ace3521297 +8811,a1dc465451e3c0dc0adc5834ee396706 +8812,ab5b1a4a69cc87cf1b0ef3c8caa21f6c +8813,7a908aa06ed5b0f82f8d595bb5df4146 +8814,020ea6259d97dc6839001b88e7da808f +8815,81e656c8ef9b9fdc207be5174aa1fe36 +8816,fcaf0162587fad17175458924a88983e +8817,217655fed2d05b8762517d777dda9d4f +8818,3d90a2e35de1e5a94e5cfcbd78345b40 +8819,e073f065022b62199f53f46364f83717 +8820,3adbf4562a7a49604bd4a5e4864a3a6b +8821,e1bf193628bf9d9074bffa6f54e3a9c8 +8822,226e59aa4608ac514153c0337976b574 +8823,043e2f6900028b8a3692c3039bd1464e +8824,8855f585ad03f5b0eeef0e6063a5261f +8825,9640178e3b83bb572653a7770e0793aa +8826,45f0e311fc9535283c2d94a52e82e715 +8827,e523e16dc2715557e249ae89e3288e52 +8828,ee36d6180220c6046c68eb067b1d775d +8829,c277f16fe8c36afa1f56e55331269dc7 +8830,77069e76df004fdd585829944e2e301e +8831,7f4996dd7485280d1d0bbca7917153cd +8832,ff52c724b687b60be4dd557efa30217f +8833,6c85c3e4388bc6ed00387235bea63293 +8834,f720a05b1eacd53471fcef4094ab9715 +8835,972cf4900920f1ff8d5380f2880d901f +8836,864e9e2ebce159490f458515ca2c56e3 +8837,0cf908c19ea513e7075239544aa38c5b +8838,3b719b5abc0b4776acb451a905d25260 +8839,ca4e385c0cffd6e13726359d7aa2f7c8 +8840,a18262550f288a89952b87cd42ae214c +8841,b3b7d4a1d14b8fecc95ab8ffe49f1d75 +8842,1b11cbf362a2354296f043ea22e67fc4 +8843,53e5e303c488050ffc3287f316eed45a +8844,f14762443eb3a9b3328dc4caa89274b1 +8845,1a1c49e1953d9352e5684e12a9509b83 +8846,b1ef9b9d28525dc6f73c2ba423d566a5 +8847,bc81a07ed579b064000199a035184bed +8848,d9db53e7f47b7c5b84dc6c638c735ed7 +8849,e2b6e701e3d3a508e08071307d3c06b3 +8850,9757a549dc3a4ae8895677cef966a3f8 +8851,4b2b9eb5fd25fc78684b53e142aac343 +8852,bc257adefa95bddd9b5bf8e1485176c7 +8853,be46f7096c7d4e17bdc8c7338a6b47bc +8854,e917c1cac9b11d9d51f0448263191f4f +8855,168f88213601702728fc158bbad4360e +8856,8bd0bfeb94b2761966900be01cf6b530 +8857,2076eaa6cdff4ced9afc5bbe1539b595 +8858,f68553904ea33db1c026633c46ad1691 +8859,3a9247b38970f95781405325b67b8239 +8860,4135a24d54b384e906cff080d53ec993 +8861,c1001070df88d31d73f80f3574ea9a59 +8862,87af70c1826a50347254f625fa40116b +8863,52bbb5640de58dc0c402c887c7f9e252 +8864,8feedafb3ed330a24b69ebe7ffcda887 +8865,6f0082404bec94e978a850e243568e49 +8866,4944daf37b039cb9115219a20a00d46f +8867,041cc5e8cc67415b30653a63eb61b7b6 +8868,e4e0c6d9f64d78a38b202efb698847e4 +8869,d62c1bd7b6bd2d3e45e5f61af9f9d57c +8870,2aa3deb71d76f3a625da070fe2419cfb +8871,d7ef3cb70829b2ab713b6f8c913ab055 +8872,84d9e79c6e2241e553973d6601eadf51 +8873,55c305fd989947342a0f5d9d3f4803eb +8874,979e3e67842f0c78ec6799e21cfecbf1 +8875,6a898fef8f4e8dbe98caf02a0ccffd8e +8876,1f25c122ce7f81fb98eeb84f8487bf92 +8877,8bf01e54a0f0a642d901d13c88a9a6fa +8878,75eda134b9ab253a047f2a053ec5a957 +8879,40dee0e281cbf54efae4b8fd600ad517 +8880,127ffe4b7bc3d047fc9e8e659c857430 +8881,6e6885a888e32653e0ae4cb00adb3e1b +8882,fcb7868c91a04cbe47499beba59562cb +8883,6b5b81c3b5232aee24171ec51e1522ba +8884,863638966c51d51c64191c31cb9da243 +8885,87dae0ddc0025873f3d75dc6df45dcbd +8886,40063b08fd9cfaca93349034688afa5e +8887,e182755ff71cd84c82d796a236fcc4bc +8888,aa2e5afb805e293fd340d97894726165 +8889,0d059fa62c880c1d41fbd9cb3c7401dd +8890,62159e8bb2fe68ba946da027f20006c4 +8891,cc486e64ab1cef17019c3e6a481a75de +8892,8be84c9e3937d427f1c94ae1b1a94343 +8893,3e2685c128884df5b626764243ed0899 +8894,1fddb3e3693ddd4b2aa9e0059940fcb0 +8895,78499f8ed563dabcdc291402d6ffb6f2 +8896,1a639a0b7249f4a6a513425edf29543b +8897,fb8ccb74d63a4650b2c2aa41f41800f3 +8898,36ed601d1c9bf9f6e8c1a6ea28251c3e +8899,875f4ed6ec5e39bb71b3e30caac1a1c3 +8900,ab8262dcbf8c50d47354f2004b48f472 +8901,63580ded58a8e9b9b10d49fd47b0cf35 +8902,cf6a05ced307785749da82e27c7522cd +8903,25135b6f5b8de530b5950dd1ec889064 +8904,70eb5dc37c1d248b1facf374a034b870 +8905,34a97c03e96a447a3744df9602a81757 +8906,2829c5882f2b6d6abcd0474c6db2a9e4 +8907,47ea8663ebd80a9f4515019e94efaf5e +8908,7877c6e63b984fc9332554b15161fa96 +8909,9fb6c68fda509cc048fddbc703f68cae +8910,f27fd31226fe9657c424ab27fc6dd73f +8911,4b6c1d3f74b42ae55c9b34d8d4678425 +8912,3da04ad50e86e65c799e54185dc7b823 +8913,607e33efae929dc6af3376828975c94f +8914,67b86d942b2a468a318b051e9e4ebeb3 +8915,ea708cbf1de3d4eef945df3442353d87 +8916,6e65103aefc50c776a0432e1aab35b59 +8917,fb3d7a9c57f4c1b20460c5de60215e5b +8918,1d9c6c0ce63b72b3e366f5763c5819d0 +8919,8d41a528c43de23de0b5cf442d2273c1 +8920,ba80b8a956862baecd344919804a7042 +8921,f7a92a9f2b4c5c546163e88866b91e4d +8922,7f2d2a2ab3e0c8aeec061161b457e0bd +8923,a36ddeb5492f2d22d884757cc522f201 +8924,b1e9b8d80b649b2ed847befa36bb67f2 +8925,3e2c705b886d34a40fcf77b731ba68c2 +8926,4e72d7dc6db77b3b6202dd7acf5c98d7 +8927,96a655d582917d22a71cb447fce1bd18 +8928,8a029258e46f8c48b81597e9f1c57985 +8929,792f5b0bae16c1810d97be7b1e0e6241 +8930,4e7d3c0c88147333bd735967db0e69b4 +8931,63b39b9bf87ef0af0c7c2ba1aa14bbf5 +8932,c9e56c5c227061ee7d78654d3745cfa9 +8933,2b2e72039d55df27d9d0c0384232465a +8934,81d082470a398619d36fa7cb11f998bd +8935,8c931807882b2dd3950bc6a3e88ff73e +8936,22c1fa0e158ed2afea9950415ed8dd1b +8937,50ff4ff0e233ba05b53997bf2755ce3a +8938,d4842640ef4588e6a7a63f47b7839a02 +8939,58b8135d4899a49f84aef74318ae02b8 +8940,2f254c8daebaca3537796eb83f84521b +8941,bdcd7a2319117775fcb9d4176007b88e +8942,44655f21ce4f9a00c5f77e7f7d701f2a +8943,fb0948666799daa880282d7898c3eff2 +8944,4f8499038e078d6fbde1c3bfb4fdb65d +8945,982586cb919dc183bbb1f6292cb6e2b8 +8946,3cba18809f81a322bf884e5d6710c881 +8947,2b11e18c9d7868ac72ac029b6c8297a6 +8948,fd76bbd9db0cfafd29b0b81a58af3cf8 +8949,fb05dd3a82b0041d171dab91bf4107c0 +8950,1c455cc4ae854d5dc05ab9c8526ab2e4 +8951,586a43f8e0d5bfb5b522abb67d0bd1d9 +8952,7679740e1e10d3f461f3f7bbb6ba768e +8953,faf92a63d47fd85806dfbd9c827d214f +8954,b97ca216d77f0d7b337f19e859ecf576 +8955,94233fbe92ecc96a036a1c88319ba29d +8956,caca524e8ee51e1235e509b5ba70ac90 +8957,70f77969ffe55d8eecd43960fb1b65ee +8958,adc4b6155ce4b0e504cb0a747b7f1ef4 +8959,2d951034a8e13dd1781bde69f9de84d6 +8960,149355dd4857232255666dad90a74085 +8961,31fa7a91b6c32dd1c00437451e27da4b +8962,bb6a482d9795d34c2cde26a5c397f32e +8963,89ca094bec938c87401cf33837597660 +8964,ac8569e35e4a5d225f10025c9090dd21 +8965,84a2f91825037e6adf037ddaaac49fe9 +8966,54ecfdc084b3e47aa2858ce2f176d108 +8967,c6d0b630c54ff23c9afed6f1b2da855c +8968,a6d9e3814a1edc206001034a416a3f99 +8969,f097abe46c791e7f2b5bc6263a2d8c55 +8970,9e538a03bc53c684b6dbfbdec1835b7c +8971,6cbdc1ad2fe765980bb91c2eaf41605e +8972,93310cd8873dc72591165666475536bd +8973,7eaf55ddf27da285ef5b84e40ea8340f +8974,f6a39d70d3c390bebf90c71e6fcd9690 +8975,59147e0441d9b7685ae7d6b5bc35604d +8976,2b2368afe6f0fe9459546917e9f500b5 +8977,19a8ced2df139a90022d1b6a776697cd +8978,a2349a84dd50f900fbe52fbe7d1745ee +8979,c25013557af1a7049f3c6e37bf0e1c29 +8980,4f7734713dd13d252f8806f1415467fd +8981,05fadb33e019c5da16e3f8620c4e2099 +8982,1cc988f01a5ab792b9791add5aa43ce3 +8983,82cd7f49b95692054eed8436c49aa96e +8984,3a6d8ae14b46cfc740f2e97243926342 +8985,6b2d245597b787b8baf46fa2b0719321 +8986,f77e82198bd6c8437e9d87ea8c4994d8 +8987,e69b3b6e00536649cf690294da591a65 +8988,11683a2cf90b84008a135b49b6c3a2d4 +8989,db37950ab71edbf995d1d318c18d3237 +8990,6051a7b9a8ace8c8b0477d890f358ea2 +8991,dcec89d8379e1fbe5c6b71629ab15040 +8992,ced2055f8eeeac42effa72d4ee225243 +8993,b11ae472fab484ddf7345af480590f1f +8994,bd7006a522766285de84637c8847ae85 +8995,da161fc9a23b23f9bef3872b55c22fe4 +8996,6feb18fe28512c337c76f32286bd5077 +8997,8b203c6ebfbb0f0a3264cf8630780988 +8998,6635993aab69de2fe4e5103f1525149d +8999,c5eb4032d1cfa7445fa98d0b20f13b66 +9000,a82a328a4fc6ff24396a66704ce89fb8 +9001,8de40febf8ae620ab491851ca82daabe +9002,3800dc1121ecad7cdb97bfa1666a97b0 +9003,9456a1eea81494e96a6d5ad73eb6017a +9004,0829a71f6edb6e3c350c35859ea6e079 +9005,24de0a9f07a2acb336c1c080866a0207 +9006,d0611c1d25923cc74423d7f2f9d7588a +9007,f3de045d17ecc9725d8eb3e6729293a6 +9008,aa415c3671b625913b93dc2d5af483f9 +9009,be7eae0c1ab061daf6c3d013da0c3b65 +9010,15029594ce676f02c8011e90fc7a8e48 +9011,5046a48365ebc1d52713f92197f07cf7 +9012,ba3ce92cc1b9615164005278075acca5 +9013,4d90afd00af07f638d6070e335d18884 +9014,a096dd25b37c16dde463ebfecad39c77 +9015,edb02f2ec609b476713bbe664f86ebd5 +9016,9706a8c4538de5b5267d1a76e8aa7d67 +9017,d1a11b45de8d3d31fef30ed51ee76626 +9018,8c66e2103871ca3313bb9c6f1f0d46a3 +9019,df81a87640ad11dd2187775d4f54f659 +9020,6b944e15d6f08484a4a64b01b80505d6 +9021,c3e87ca203a4f9a1d255ca8254ef4c60 +9022,ac767d72da02afa5e775f1b1f814665f +9023,b1f51f1039e295332229384c6d850fd8 +9024,c6ea85b94c46bc9e60044e320ce9cfa7 +9025,1f9648732dd4b7648a6abb7aac1c2386 +9026,bcc744123fa90ac7ec5470909cd38527 +9027,bdc0c9860534fb84f5ea5125a6caed4d +9028,9e2f3d287a21266a3b9a9f999e900249 +9029,443b9cc8319a5d905571e063a43551d3 +9030,fe2a7a1e1fe5ae1cebba26c12063ac43 +9031,b2de256e64c7d0a69e0f6a5124459889 +9032,9515447137617e1b1c4425486f93af4a +9033,e42996ddb24a196969aafb360087cb85 +9034,d3fab58adf2fc0cee1002f757672df6a +9035,0c4ebcd47a0b04314aad82d5bfd61b71 +9036,7019d0156ea0fd1cf008233a57dd8923 +9037,0c9d7a046fe0d601ae5ce3c102dc1861 +9038,626b176bede103927e9ce70c774cbab9 +9039,bd6c0d737d05ecf41c302aaf1622d1cf +9040,880dea83d8274320f47e9dfc2fd4f786 +9041,6fc1dd7806140b7879d722b523e962c0 +9042,db5dc15aec65dafa26b5b7f5670795e9 +9043,a66c3c48aa04999b87bf1c2e3ce67c6e +9044,9b3730f7cf1dc3a4f6283ac89f9fa864 +9045,bd2c7d7e6ddc596ca454724e6688be5f +9046,f2534c90ff808ad0e75725d8360cc8cf +9047,c75821ef004175436b20dacccad6768a +9048,2453ae71df7fd5b502a8c8325b79a934 +9049,a41b72eb4a39338abd5890cf31728fe5 +9050,288fca3f15914c458af0e78a1796a41a +9051,881a78a8d6594f9d3327fc1a3c29fb74 +9052,6243ba20e4a391f1ee444712a9fffb91 +9053,e187a4192c71d8e1e74efbe928242ffe +9054,c8c1719f1290cd8fdea4adecd4d298e1 +9055,5ede80f83e6e71a3c0c7571564bff457 +9056,7c5e4b4e29864e1bfa7c631542ab1d23 +9057,9bb3d8a203fe776af0d7b4dac5b5423a +9058,1ab2636e5b47625d689dcb6a5ab87f3c +9059,a2b1a9243b6f35bfabbbf64f5161f745 +9060,398dac9688a336514980fc518efcde99 +9061,f52a65a0353d9fcc90173375a3e22465 +9062,5a83928393fdfc696fc6b83e5d9f9f5d +9063,acd7089e5788b9e6897fbf81d41f1c4d +9064,704024e8c5bd8375fcc73396969c003d +9065,27f15eff5defa78c53e2b5cec6733a49 +9066,aa52cdba38684eb35d1567adb5535224 +9067,649e66f5906632020292f06125d05b71 +9068,2d13270ccb1b0f657e81b640c0b381ae +9069,9a6b78d12e4d4821c8e925b2a24177e6 +9070,0f59928bdd467ac6a665ffa7410e55a2 +9071,5519b2f89116421457f1e65bfd90b7c6 +9072,19e2d923e55938b75104934402b43bb0 +9073,9c3b548103accd5f69f059914499b9be +9074,a5b987721abaa97c8bce49f5c0963e5f +9075,6af94421cf61539841af36e3a5f02861 +9076,b1c9cb1f23c6af5df589392c79719c48 +9077,7ad6d634e2e179dd834728d58057005f +9078,88ae6e24267c2959e5dd8b2d29ae4e93 +9079,3853aed10395eba1d111907c81b7daab +9080,d449d1af0c501694553ce693f2e6827b +9081,314875984807d72208243919e750744d +9082,05ab169d5ca41ad42e6e02e70b87a708 +9083,fb8107815916aadf295e736e72633329 +9084,93d4e456972ee7c4066cfd3a5e91418c +9085,c6eb4b7c2c5e2c1a9f573c25a8599a64 +9086,ba1cd03bd1a44886a6b4b6f437adaf20 +9087,77d9b38bb31e1a2125740baf1ddd957d +9088,8919bb86af84894db97e986524393f01 +9089,1eebd356657ae48ed192eee331dc5a10 +9090,ae0b6b3a96bcb42f6945bf0fcd138eab +9091,1191dfc9732bbab60cb090b6471d123a +9092,c5314e29e8541ea370db500706780d4f +9093,a33ec1e8ad45622576c3a5bf331d913c +9094,a1ff87737aadf63e9ad3a4f7aa0b14d9 +9095,7fb38bc45c29060798419e1b0d2f3225 +9096,5b710681efe0773ebac600b8abd29534 +9097,45ab5f08f119970f96518ef526c0e369 +9098,b7e68ad9efe9ef0a8190134f989503d3 +9099,79412709b43955d64f00014aa5bb1967 +9100,67499d3e0869bc24a26ac0f6de6893a4 +9101,42332b0ecb85dd4ae015ce6048b12ff2 +9102,8ee792d7f2a0dd6be9cbf3ef357282c9 +9103,f6829b7a5bfbc731b3ef2c42d37161b7 +9104,af23be4ca96afeb8b881bebc09249306 +9105,633012c74a680aa34291a6227e7b9218 +9106,c294c78c8dc06e323b82b4ab909f0968 +9107,65e2aa674e71af9223700c2b0de49b92 +9108,3c66d783f9a5d6cfcc201b50c7df56ad +9109,ea680019e2e7d02f0c08d443b4ffe9e9 +9110,7893f18cc0e2be4023ec8e7e22ea6eb2 +9111,844235a7f68c815a07d26421abf74d69 +9112,31ebc790cec2bf97dc92d882ea2c1f5d +9113,96a9c0b9b3155f1acca7328c58d2aa24 +9114,fcda0681dcff102dcb09665b2c3bdf04 +9115,1a228a760a87b42ca9922079b56b9501 +9116,bd5a5c93ed67402ebe5f5c451b80664d +9117,63944f6530128638d5fbb94e28965202 +9118,67a54252d31dab48a955f1edbdcfda7c +9119,290883e84f7cea88c4eb621caa72618c +9120,f0ab5d84830aabc1f5eff8a7283c8c9b +9121,9bc19adc08882e8a103d08d9527be489 +9122,8260296284576f6278a1e0135a11d19c +9123,5337f0c50f6d10f8a8f9c2a43d84300b +9124,3a7cb7c2e253c24368e60d0acc2e5327 +9125,3e23fef9409f4a7005aeb20f7715abfd +9126,866b8edbcd6786a7c084dcd46bc67ad9 +9127,cadf304a54f1944de46f79b3b49454a3 +9128,611e4a63a9aa8421db8eb32e472cb79e +9129,bb64434be032835206f0d65c545e1f13 +9130,ddf041ed93af751635238280a7156ae9 +9131,1a86ac9be3cead352a875f85f1ae5a03 +9132,0589e7476eb7a842a8de669795ef3fcd +9133,3fe0fe59bd306ced2c31d078741fc4a2 +9134,0e92fb44d1860a77ceb7a2a7e1249469 +9135,88858368a0a6852398b77ae6b853828e +9136,cac79ab9e20f7ad6377778ac8b2da202 +9137,08c7514deda7277d887a044ee88f9479 +9138,f21fb7f9014b42526e927e90d039a435 +9139,f455e8bd19d06353826a7f6589d25135 +9140,5de724873d756e67c82e552c69a1c900 +9141,792cdf7b613d05eb462daa7bc7353bde +9142,0677acc1ee3efb8232c628911778ec60 +9143,67235eed7012a416670c5691164f0134 +9144,31d8df3677c8637fa58c3578242942e7 +9145,41994a6527b1e399b5031194bd89c13d +9146,0a2f7a52fadfb1eac2a1247bfe35bc7d +9147,39feb40b2bc57f5cf1f61a7f26ba0fbc +9148,3b558c71b95c59571b7d7659ad53f445 +9149,b20c990977647b42c29b6526fdedac7b +9150,26627040e14b707880fc579304e3514d +9151,29f59bff88702bac428a986291794318 +9152,b6e90e28070d5379cc506188cddda1e5 +9153,88540fc1d3901d5144a09b73ca87ff6e +9154,b25083563ce22e4c350e88a4fbdba72d +9155,63aced483b47de15263bd0a5c0671405 +9156,b1a86f35524ab255d0ee9e88caf642f2 +9157,907d33f0c7f15cda96a1ff7a88d36c9a +9158,88b57955da19cff85311e3872b88fed6 +9159,bb3569d8328f194a25813cccbf97bc23 +9160,21637e814d852635121e350028ea3122 +9161,eaec1ae69e95774454152232922897a3 +9162,f2fb069560900478797970dab939e5ff +9163,3c60b417c682201c6b41e8eac0dfa2a3 +9164,8249bccbc44fe69796f9e4fa560dfcab +9165,69979fb08ca260a6af79fb0d3610b952 +9166,4d9ec27d883eef099b3e78a8cbf3a591 +9167,7022cd602374d8c4a506263a7deb4565 +9168,af9a25a0c98daa096aaa815ef6f19076 +9169,4fa8c54a711b542452fa31285b15649b +9170,2ed333abc426cf641c3c910b3232fa02 +9171,1e1a66bbc4de98c459eed1fcb81f645b +9172,1d490cd771c3c94f65a262e87a915240 +9173,e54e82bfcbe00be5854fa42c2621b09c +9174,cf26a827bc497f9db3a3639fb2e10778 +9175,34444469df9411d685eb514fcaab9141 +9176,5489c6a6e58a3a4f643e7c0cd3be865f +9177,4a97a6eb77c03287dde0d87c4b6954ff +9178,ea5b54567a83bf1a8358e602ae77baac +9179,d8259b048db7f1de70c2de7770f34745 +9180,581666b59ed4478497195f2a7f611e1a +9181,a4983a6d5a4dc2032df60872be511bd3 +9182,4f89becc7f47a5497755a4c530276767 +9183,2e18dfb0712bf57e23351f12aa183eb3 +9184,5c33149f9293bf5a930d7e1f0631151a +9185,e1fee8a84e7f67292cfa267da90dffc7 +9186,4412c1b573e907bfbd9ef332409be99b +9187,a51de2e2a331fa49f78c26217a5fd423 +9188,a1c18c2d7f8fb36a032555f9c83379da +9189,0a04a1e22f0fce22b7cf9b9c26344103 +9190,adc11a3166e06f57d45fb8be136e0fb3 +9191,31513c27247b8c445b10c060c6640848 +9192,131e7288d1cd6eff42ffae83e5d85019 +9193,3b2908b4cb44a5b65799d329054988d7 +9194,e8b38bba70aaa7b12f0563d324050985 +9195,2f7f3c5d4f43807b10a24710d1861789 +9196,45fe32adc2c1df874311c4c95fe14e1f +9197,47e24b66ffbca8de79fa47bbeefa6f7c +9198,6618eb7f918aba375e073ac7859ed19a +9199,61290c1cb0fc510060139162854e6c2b +9200,b0c55a8fc969f5483d5fd19382947b35 +9201,526678e52fd199d15c9cfabc61b99b33 +9202,e2b7859e92afdf54361cde8db10d01a3 +9203,4152c9590e8e5681bc9252c4b1a38cbb +9204,e5d687e1ae8a338f4365bdf94098a355 +9205,2c4899e45f60f7430fcb72892ad8c99a +9206,b7f8140e8e4fbf404848e2a762ffb50d +9207,7825592db2a72d1c75a061a213e153a7 +9208,a0777fdbae838a1b656c92574d0a6c58 +9209,382e675e6fa714f7075a29a288067e84 +9210,143cbcd5cdf80ec3a337c8c388c2b365 +9211,276218e130bdc8e0e2ad57b02b6535a8 +9212,2a53f2217434a1c65bcdfc01051f640b +9213,a0c5e411e433cac58b3a2dcb9396966b +9214,bd31f8c70127b12ed3fc7888c1eaefde +9215,d73bc73b705d4699263eb2da3e2392b8 +9216,3db2aac0ada1cc9db659f408c065a742 +9217,60b2b93d12fbfa319c568a9069fe4189 +9218,5ee6411dbd3661b3c0909b6ee6e4cc3e +9219,b4860a66a72b718ece2c938c048a8933 +9220,85aafdeddc2354e270440148698cdc35 +9221,ff6cc2e6f447300929867f4374257636 +9222,3858dd18bd97a22f47e771d671558ca3 +9223,af7dea2a581682b7d3beadef6ae29439 +9224,cd475c764660384f8755b62d82064afd +9225,e8f260ac5776b326d8daa8fc9b463bc3 +9226,582d7d424c7c2b142de06908c25f7e22 +9227,d4ce77413061377b284ae58b2f56ec07 +9228,b69ced40398d4351c695590dcc8fd701 +9229,20b2c4b5561d903d9ac331e854d2c225 +9230,a3b0a691daae470c739f67782e116927 +9231,b28af1871ef1eaf8816e8d2eb56264d5 +9232,e66f71c7d09218e7423205686fc9bbc3 +9233,022853674523f9abd250fd0feb300fb2 +9234,6bea8ba355b7a90512870cd5fab31066 +9235,55083e288886e0e1a99dfb9c5b4981a0 +9236,367afeb25752437f8c05d2f239bc8c64 +9237,bd71dcfd0fb281a4ec3b78eb8c2ba723 +9238,c0c7ed1f807d608fbfd7af62191c6ada +9239,3aeff196567f0a064a44f448dcccd110 +9240,883c49d69e13c5cbc2fc25096b0c02d5 +9241,93101ac4da519969bd78db7e95bb3d58 +9242,1a05cc56316aec9e7a5bb029ff8801b8 +9243,8821aeed8949fdc8560de72b9e475078 +9244,43b03e7a0db8a4e64cbd120058ea780f +9245,8f51a216cd44e8fa38112cf53a777e82 +9246,b0de3dca401e1bc301d520732b4ec091 +9247,cd18fc33b7c2b77cec5069dbd0c88766 +9248,d4706ce6c7ebf6fe5d86c412f0648c8b +9249,8a8456ff810ac2419f5df715bc0a84ec +9250,b11dbfc74bcc17457c3ba0441f8adf5f +9251,c6cc45a350b3b97164d31f3ea89ece4a +9252,8bf65e344330feae50a909d4fc00005b +9253,08c9ad06f3ce285a78eab1ba663a6e22 +9254,fae1ff2aa0fc12f7433a39c4acb9d0aa +9255,5534f605e1e0eeac9574615b2bd0bc5a +9256,64bc3302ca923966ef86b85f9288d3b9 +9257,8c12ad5c984a94ab43ffedd613b7faeb +9258,5971c15e849f78f5feeed6bc2bc63e19 +9259,35b95beaae900c7749b8f00c2e749fa6 +9260,2e0817b3775f3681dcac210fdb17931c +9261,695347fab38f133888fa2e9c0018f0a3 +9262,0de8b81785816cc7de7e459ca02beb2d +9263,afa2e8d2962ef7a27801c3a89c2a3396 +9264,04af59eb961d2caa0cc45b771d0dec32 +9265,74ec22c04173ce2402fa935a2d534741 +9266,2b60f2015b7e8bb01b5730713b3cf40b +9267,bfa768bd9d9466979cb34970e2d1b467 +9268,31ceb139279b2cd5016ff426dc8882c6 +9269,90e1174d5904691fdab3e87aa5bb2e57 +9270,af042e464a2c6d35cd0b536dc2503fee +9271,2227b18847657ecc554881f5f43857d1 +9272,4acb73d55b059a59dc02e77a44277e2c +9273,971e375bb29402885389f014f4bdd8ed +9274,3f0fd393818b240af321959094cc3817 +9275,b4b82fa0d1b72ea567fcd6aedf0a72af +9276,0b20c52a6862bb54794d6f96ff583012 +9277,41ed3ec6a93679d55f4e042ed622e272 +9278,85812e752d655280e57fc5d36c4dbd25 +9279,0deb98a427152fc763109b1027672662 +9280,6abc108563ccdc10c148f66b561aa41b +9281,c166f05eb28f8ec75ccb95225ad9ea7f +9282,c247ea91becf0da7132bae3e3b6c4a48 +9283,16641405fc395c762bd9240f14a0c7eb +9284,ac165dcc61a1c1e20bd8b3f6fb248fdd +9285,9978db89f8e27e1017b4f00bb7f54146 +9286,a20288039172d6fa57ba4edf8b87caf7 +9287,994c8f383e0e889eff5e674ee4f1e3d4 +9288,80469a79026d0322e6791536c36878d5 +9289,70f5784cb3636128496c51131d82d77b +9290,b17286e0448256090276cb129397f191 +9291,52960aeb64f91830b6c0d5b9df0b064c +9292,89462d358aef6af400592f74df8a4bd6 +9293,296aa856f79fe5e94aaf596a18cbd3de +9294,d7a183d154e0fc680a294716f7d31a1c +9295,6aade8152ac8f1c6416ce21b5ae7761d +9296,0cfc358ceb21cbd58fa7dc7215543077 +9297,00d9f63b369c086057bb3cbf6f798c18 +9298,323ccc15530c31fead895646c9ab845c +9299,b901ffca7045bd313d95270c2875a8f0 +9300,2f6bb9e0698b6258d20a0ddef33bae5d +9301,f09afeacea5c48d34659aae5ff56ed02 +9302,eb539b3d88564698fc9d3e6cdba180cc +9303,a706bb0becb284315b33bf446b974cdc +9304,27d56f330f0e3987690a4df67ea90823 +9305,4d2069ae5741855aecf8056cfa0c7420 +9306,b7efc93f0c76b50d5bfb9c06e7045188 +9307,9166b8e9ec18259d9376e62ea41dd8f8 +9308,b6036b69b5999e6aad11d1a7238cffb5 +9309,2183c976c485ad8fa2f9f413f0eaca7d +9310,e99204fc6bfc506c37dac8e9f7cf492f +9311,4986fa333b4d6737f893d167bd058fbe +9312,b830019611f0e2e7fe86d16062bf131d +9313,8928bba4846db336c41a12eeeb8d3228 +9314,98f15a9c7da6a4ef69cd7c3aec932ee4 +9315,b5515ed6accd8c8553b2adac4ce6893f +9316,d9dcdf481d35e3160dc87ac1c64c08ef +9317,8529343479117698badb62ffb500c5dd +9318,a6f41beac62e9fa3b64ffe1c864f6826 +9319,f77b88222ab9f29289b6e6e505bd3260 +9320,589769e60ebd5276ff257a6aba1ece16 +9321,70acf4f9718ea4b0bb094f5a8906a070 +9322,7f778c9ca1db7bde96c5275fcb33522f +9323,596fd73177db0a26c4909feb1ac874ce +9324,9ad74f45917549e86637103799e995b6 +9325,aaba583e54e5a0a6e985585e82ae0eb7 +9326,24e98f98a40091245895ef20de143133 +9327,9a7a388514c0b829d13ee2403338dd4d +9328,39ead172357b128916b95fd0f46d06d3 +9329,84e20a040b686bfc8bf5b9383d4d428f +9330,9de8c59d587c4a6b75a87168e14d1821 +9331,6e849deceafa38705414db781e8fbaf3 +9332,e094acd0fed8ec74320545011bc49f55 +9333,f0352379d4f67819b8e75fed148d8849 +9334,83d3243256615590fae7ec47b36ef1b0 +9335,b06d20e89233f5117ed72110558d94fb +9336,36956fbcfedb2d132d64f5b0eeb531a6 +9337,9836ef5ef2f404606d4a50d2204e06b6 +9338,e71f88c36a6a409f77f1b4c065f5b36a +9339,e61d9bdefc886cd6238a80feb622ac60 +9340,d3584668c8217b04ae0420c14704f942 +9341,294ab7343d84ac24d0cec432c4bd424b +9342,74a87a31d264b0663ebfee1b3e8ccc73 +9343,a88a636eb4d3db59b7f267e21c4ca738 +9344,bb92b5cbf147b75dc179767f4b8a01d4 +9345,7c3ab7daa65bb9c161c9da5dee0ff120 +9346,f38dacab30123789623e99ef3374c9b4 +9347,5c95fc43d8498ec300de01627c8ca9c6 +9348,a427315d240c284ae670d28de71c8a45 +9349,2da184d5ebf1b077857e4d29edc8ff59 +9350,bd1c20d98b053af7f4fe621eff3851c4 +9351,b0af40d94e8d0a26b20775ef7e904362 +9352,c6a16bd5382bd1be219e4cd730fb4110 +9353,93053e318ab2c300240f4d55c76ab7fb +9354,9a5aab2b556324c242557f6cb7d3a1b7 +9355,5b6e61a66b6eeab0d486b1c2be75434e +9356,dfd83aae13d4e1c74c86d49d717bfe3d +9357,48d3be8b7201e7485fe59366cc72b96a +9358,6f3069623671580ba7fbd478fa782ef3 +9359,0f9b5ac0d36966b8ba5ccd19c2a6cda1 +9360,789e67c313e67301f18ae6dccd194320 +9361,a38e4a36984fe9a058380e6728a65749 +9362,92d5ed06e41a34fb50deaad7dced3174 +9363,6bad5c9785642bb04280e89b11a63440 +9364,2f5d69728edeeb5e448008e8448e074c +9365,ce1adad1fd4a5627e5f8b9635c2a14ff +9366,92a9c69b1d2fccc61fb2f9728470d05e +9367,252c40affd41441e1b5ff58d7555a57d +9368,84fa017b0c6fc457857faf714cdf224a +9369,683d5cb7b524dc07b11883a78ae7e57d +9370,818859c6048459b839674d47d7a8e42c +9371,e1229d05d12ba1d78c1728456290829d +9372,d131a8ede8f9b51bb7044d6a24f0e787 +9373,068dd8894c1523a31511af81f9193bc0 +9374,93aab8f001c7cb724904fbcebe6cc59e +9375,16b8f8bd6d9ab2ee4392408e4d8b1006 +9376,f2967e0cfe1736ba8dbdafe0c8ecb0bd +9377,ba269b4bde0a63bff6540b02dcf9a28c +9378,96e309298766cb8d8665e3ca847b642a +9379,76ca3fcc10486261470789efd5fd454d +9380,ea51c3cbde4a9ade9a77779519dc65d8 +9381,83ffbe48996eb7722b009eedc709b543 +9382,4a30229b12c5b853c36cfd276a7c5781 +9383,92188be6f09ff19c6dfcf2e33824fb71 +9384,6fa120406f5902ec0d084d9e702e7fa4 +9385,9161681d4d976763ba1b3899901303fa +9386,ca76179cd98441203f86168d22ab11fe +9387,5fa11e909669d802735c5e76ca134f50 +9388,d1aa43b4fdcc620073d1a25f4fde385c +9389,8fbf3cc653179e509ee7e248b2e4af65 +9390,622575dd56eaa87805ce3443b3a4ea75 +9391,67360adfa8efe6a4d1bed24427454d8c +9392,edebeb544080c2ed12af7ad7cbaec07d +9393,81f73a354848aa6d84f1b6579b4f5349 +9394,06af0aa4e8f398020dea80850890c1c9 +9395,8ecfa44771b6ef003f9e42adab5a6b5a +9396,b41eb52f7f071ee46b9b65239bbc16ba +9397,3dc836a0bacc448bfae988a94c35eb93 +9398,e2c980d0b89bf19e849dd9b74c38d7aa +9399,5ab1e84f2b185a0f332c01df2f3c0e08 +9400,c2d06403d2bab262d402838883d3cad9 +9401,eef4c0ea5243ec51c44a0a5e5e6f3b89 +9402,915cfe59317c73d0db8400f7ab5ec673 +9403,80dba5af557c1b46f9015b6fe44a94e8 +9404,29a07ec49c6a17fef9ddb2d0a08b5acf +9405,e70faa77d92baab5ad3f3a6f59f8d7a9 +9406,a9bf5c73cd09ac9a49f39fa348b5da30 +9407,3fa187d9ad420031f0c8e9d0537bc047 +9408,7960a08632890bad3801a8c958efe3bb +9409,aaa1e25ff1bf270edca5aced670e0f02 +9410,939946d41fe3f468d1301cb74ba89897 +9411,9c54a541f3687ca7a83f606ba01263ad +9412,59ff649d6cb3181b82aa1ff23afce69a +9413,a96bb74c0cc925c0aaeec0347feff746 +9414,bee4d40d46883f9413666f6138b68f4a +9415,d02bc69662e888d56e76cb89c48c4423 +9416,621a587e99692d4e8363ff028e82e6e0 +9417,113d6a3bcb8e915831b7f3f129a9ee13 +9418,1fca3ecbc47c59224479dc0673a40505 +9419,ab6d7a892196b4604b76745e904c01d9 +9420,07f9b1bd595f30a049cb633d570d829f +9421,4f12efe090aa722af86e50ff18a6bd5b +9422,2897ac8c00207ea913240f307cabc9dc +9423,713b6a493de5a68f849d73c10fcee737 +9424,a19469cad626af425182d63dfa4a0156 +9425,9b53002c09172387e3092b2a16ba98f3 +9426,83e68b928a8da0ff58af33b90ab51256 +9427,c01d7411d9f459b16caec1bf8ebe05c8 +9428,c238fb86c7c195121c662c1cfa74cb15 +9429,220948ec4792c4f68f74da9bb316f35f +9430,1976ad6533ecbd4308631f8ae1fceed1 +9431,fb3ae74943f5430105643448d3deeb2b +9432,773ddf4141d574efa54712659d5738a6 +9433,00fee4f1e06d2a8957c3ad275c5ba16e +9434,29d27ec98b140808747cd863a026ee03 +9435,2ead8067f59ea8a96a3b6c87f1c928e4 +9436,0e32c89e1470a3e7f34b23041f30380f +9437,3b63447a8fdd1fd4bcbe5502d9b45cc0 +9438,6a7ac3bb52c7bcbfc13ee97d30261ab8 +9439,c82e7d246686556ea446927f7d71ea24 +9440,92c8d6e53fc4aac7dcbd1a75ddcf3cf2 +9441,a82af4f3944dafe2fa77a3adf7f38c13 +9442,12b204e43cd1b5f1dfe2f30bba3f2625 +9443,6a60b199c151fcc7203216981a129766 +9444,7ab0d389d9f6fbb9e7718277e1654f07 +9445,5824c003b00bf3e20290b28f9b417210 +9446,206c2cfaeb094c4c330f3b7fae16dbf7 +9447,5657ee646653d703d24afaf84c123d81 +9448,2c9dd29a4be253f4c102404f69019a2b +9449,b5ec4177eed7c430b6e3f3267f916f49 +9450,0c8e573378e411bc9bdb5cf228275f54 +9451,e3c0dd5781d3e552a6c89031b90b3665 +9452,640ce8de6dc3482b7292bc2ab6cd55d0 +9453,16b2f61d9a959bae0367764fde55b45f +9454,503949e4cd532b3449ffa227db32d800 +9455,6a4941e7db973335b88af07143511338 +9456,7176fce9b840fbd83632f7af899829f3 +9457,fcadf2487a40a400a7cf5d977b9a9d81 +9458,c3b0f6ec05e6c2f03c008f0ed9fb7874 +9459,667e600492969ad4e75b34df3d30b565 +9460,53d8480d193f6b72deb7f823bedc8c33 +9461,e82e5fbb446599b409f0fc19636737ec +9462,5fcd7fe6726df8d92ee41a5295c0157b +9463,0af9ebd0454c3832cd6da5026a1de944 +9464,ce58c32d751096dcab408e107e7f057e +9465,db2c65e06d41619bb7ba181897ae26df +9466,2a91f1360b2234f792247a0958a1f14d +9467,99958a7b26f568616b94c0678aef507a +9468,da694e2065e4e2197809a31821a1f68c +9469,80fb4fc98de7015929de34cbf082d5bf +9470,f82fdac734bbea27ce4f773d0d2d3829 +9471,23543a3c87767fe7198c5ae247340c6f +9472,a977496acc3f076d706be029321994e0 +9473,242bdee234ac055652e065b9a709ea0b +9474,dc79b0bfc90f9f6f9b44afd0e0ef028a +9475,f0b3b34ff0e0d7abb36e3735192aa610 +9476,d8c81a3a6c3049e04701c6ae9f60691e +9477,75a16c8f05f7c44207af1c64dbba1422 +9478,23d47519980d45f8f647a1192511c9d9 +9479,18aac0686a579ffdbffbd3ef0d88d85d +9480,fe65a53ac23defb99fb257844b4d2772 +9481,9e11c473841d157810aca731c4d16e5d +9482,ec6b2dc1f2c90d2bedd395b2417cd60a +9483,f26557c847f2408e7b5ce182290ecdd4 +9484,f265ab06b8050919e4327f63dca912e5 +9485,45bdecd5693b722452ef85bb9d5de6d6 +9486,9d60880f7c063ff92da91ba9f648234d +9487,98c65fa5e76440b0f692071a353e6279 +9488,9df8d16c677845589d206124acea6b1b +9489,449ab12672853b941ef0b921f9f9306a +9490,26dcc33f99fd610506e07b37f3c1f522 +9491,d8c8c817e4a719f1749616b74ab45e74 +9492,bbfa154181f04047e229e22ebc11ee3f +9493,ab502b70e42e7d091ba9afe6175c4602 +9494,71d6a3ee9f35023cfa792ad4170b81bc +9495,cc0300ced44ea69f767f72c1bd640f9a +9496,39b64509aa1aa793871f9bb4579622db +9497,c17ae102b5a2fbf6ba46cb248e0f3c24 +9498,967b02115ee134d8ad9c8ce02d18d773 +9499,135777abf9fbada20f1b993280f057ed +9500,a69f5d0b018f33ac0b786910cd91a49e +9501,16a16f5669389df7dee780cb6a1af714 +9502,a5a03c519d6bbbb2c25307496a2029df +9503,5fefc2f1b96a213a45e2518f0d2a6032 +9504,8d72dfd9568ff2a64d4d5682d144647f +9505,07924701f38668986532412f3fcd9396 +9506,857c0372829e1ac28fe774dd5ccdf2fa +9507,96676775a94557cc53b3e43231e6fc17 +9508,ec306ac3e4b86cb444a37a7e6b5d00b1 +9509,f45d75e9e9e12d253a1301ca342da0d7 +9510,b2a8ac242fc44a4c6d5873bc64275fcf +9511,94e2d03ba4b8f237b7896407663312de +9512,dd4102c6247bb213a8641a15dba48ff3 +9513,9fbeff52f9a0bb6ed4d29ddc9379621a +9514,997b7153bfdd747f9d4f9a67bf4c5108 +9515,f5dd2f20d1b78dd6ffb78c77861e51b7 +9516,c1792d185dc28f2398fda3961ff67d1c +9517,76bdf1b4731387e14334efc280cdf911 +9518,250e4a8700b020e4bdb9c9197f1022dd +9519,e93211655e2cfcda50d0b0f5ceda6e5d +9520,7118dccea091ddbca2c00f64d9526a72 +9521,15e3a2c473d7236985478820fc4793f3 +9522,0a7bb630ff4390a3885f4174608a7be1 +9523,d0686fdd9a52e977feff182abdd92d9f +9524,0c4a28796626cc27bb107353fd6a15d1 +9525,8ad81a022c5a6b8f700968ce666937cd +9526,99abf892668099e15ba8c24e76ce8068 +9527,9f86357af589f671da3019cad54eba67 +9528,7b7e15c66cc51e590a2feed594e0918d +9529,f0b468174eb8ac2afdefc2507d953519 +9530,2cf157c95893acc3f3ae0ce8778ec549 +9531,f04ca068543f57ff027c553a78c97568 +9532,19fc7c9b022ee6a1436401a2502ec3e8 +9533,cd96c1baa4f7d18075f6df5223bd736b +9534,89e83cb0e2bd4d0d31fd1c8e6cacea44 +9535,16546b24b2893c717ef170ab834116ba +9536,d4275ae9bcd6ef1aa5512cee2ad4f12b +9537,1b845860d962a53468b0de42f759b6ba +9538,568b1ce5517fd17d6629fa5154b144b0 +9539,71aaf9e8618f88c6bc968fe55c3ed25f +9540,9f0a639e0ac0bcdc580133ac9a11c54f +9541,d9ce0383633233dcffd53858f4e6e447 +9542,18862d264e05c9097dad5720c766af25 +9543,296c65df6264c252a75c17b87aa727d4 +9544,69831889edb6348752be71e59461368f +9545,f7503cd48b7861ccc492c414afac2427 +9546,45e147a04c8ec156b414c31eac9872a5 +9547,2e716de61f5434a191aad2f9d6f70fc9 +9548,853967ef2541fb2082ba1bb2df17c7d4 +9549,41139418dec86727cb30fb8f25143d10 +9550,7ddb7488d8b77eeade59f9bcaacd9ced +9551,b00f4c6100e1a5e3a1afb99895b6893f +9552,30f63a5869b25b99fc3baed5495aaef9 +9553,6c8e89a0b27d20c84085c4f6c85b342d +9554,00b3c728849f67194bf4ff7cf7c50852 +9555,a126f47cb5d4a04b7a7b0dd6ca802f34 +9556,314abd17a11996fd1e6b09ee652c3ac9 +9557,ac6c98bad158a892610386094abae795 +9558,f45ed3e9ed7b5a612f28dc2dcfcb87eb +9559,f921a20a22969e98525decb27c9bb7b1 +9560,a3c1ce3c62d27f0bf6ba18254a84270e +9561,e789cd6b6ea883be8030bea601f1e513 +9562,7141a8dcfccdeb0c35d8d3b2416921b5 +9563,80ace61824d21763b4adfbfc958e961a +9564,76acc8fe19b25ffc5fc8bd077a126d1b +9565,ac7eea66b8ecf7c587c461ea003f337b +9566,59fb7218bc161a5d2712c3ad5ee94cdc +9567,942afdcac3a5e8ef10242dbd55b35d89 +9568,152664dee97e00510345ffb3a270d1d8 +9569,dd26d54ec35d4734092dc73bf8e4b06b +9570,a26cb1d33304c6f1ccc87326b87d654c +9571,11f9735ed008159b5b9d16a6c29f7f80 +9572,51a0489285d3db9df462f9757df551f5 +9573,89e3bae247ebab7f83a1d042f5c80220 +9574,5d721349a1d884f263a535ae19c2f5ad +9575,1bce0f4be1f543417dc8b59bf93138a2 +9576,4325726bbdc951b93c956ed98a54d6cc +9577,2aa2c439c5850ac5feeff214a90a8e9b +9578,ab059cd88a323478a861ad7fb8b44a62 +9579,3366984509ebe32bb8236952b398b22b +9580,d9c3890d3173b1904562780890bed8ed +9581,fdef5aad9425b30974a6342c7d2ca3a7 +9582,b0033ee97c0d4374b5e83d3535dbf7c4 +9583,2087a6c9975f6648c0805158da110784 +9584,a6b7a465bb7344edef6a1d3a7ae8d3cb +9585,9e3c688436ac8eae3bc42f5dffc4be51 +9586,7593bec05feb1848f19bdc83eaca034e +9587,1bede616790efd690a3e5c8e94718f59 +9588,bb9a3e4c310e87911fd38434529fec0c +9589,e1cb8245bf4eb979064e93913b5cf80b +9590,ab5f17f15903c68c241e77a0a351c675 +9591,0f52f9b06d77c18777770c02af8282fb +9592,d2ba4454c568aa838d577bf351779197 +9593,9103fb61cff36c637322d786914914cc +9594,e01d7421b8704634f3bfd49ae6c853aa +9595,6596e27e2cabec7c3cec88a57ea00b7d +9596,61aa8690741d39736a7829852ded9ff9 +9597,a0755c39c5dcb5ae839ad024b85ff03b +9598,6ba7420be7d3faff29a66acbedf89cb5 +9599,ccdeaa0be32fb61f779c5b83cdfcc113 +9600,a75463718797d42e9f8697fa0d92ce1b +9601,44ab77c44451c4ab706c9da9e5a6e308 +9602,53e0f82c743049cd10f61b5db8117e67 +9603,58dd912a57cc89b579fdf9bc13c7b4f6 +9604,370e5c4bf4eb49071223b4bde6488267 +9605,ac801ca81e62ce16b887033fd119ebc3 +9606,23f6e56b0d35a5eeffd2bad2cb67bc76 +9607,fd8a6dd2c3b265bee87ec3ea11359e94 +9608,1b24a4147f873e7aa70f2292a7cac4ae +9609,7aa829080fad5076c17aa6cb1a4bfad4 +9610,da240a067f1471dbbb92e754be624803 +9611,046396e60dd1e28ba4687ef86d3dd179 +9612,6fabc7a9edd8eeb10e2027a0f292e5b4 +9613,37276e12d38e289df495eba74a8f2a2e +9614,c7b629acd8d48ccc71a493f84608e74a +9615,995d532508b5b8422293518c118b6940 +9616,334317a8b8dbfbeba43365fcfa4ba482 +9617,fc042777f9e05befce23f7857f1b7062 +9618,6c406f77093e5dafa8b55cd47ef6793b +9619,bcb780d9ff798326782d6dcfcb300537 +9620,0e24ecc10481730595dba7d4da27d8c0 +9621,546eb7830a12f18310efdfbbd5a06221 +9622,a0c46410df55de0ad6a72487a3a5ac3b +9623,7462a73f2904e5c4efcff55b671e5030 +9624,ca4d2ae022ede391be7ca86d78ecc2eb +9625,79417cb0b4d0e08535df28b55dfe8545 +9626,6a2954c28843214211c19d77e66d0a0b +9627,eda2d427216481183d2d973e189a4342 +9628,0b7beb95cf6c7f52c53ef6ef112d5476 +9629,0e8f9129a3cc4c710dbaeaff65b0d7e1 +9630,9b5b7c179d1cda92496e991a9e9d3252 +9631,7d7d7c84f504c94e5b7a8be1970af6ff +9632,0b3fb42c962388f33dadf30929b2dea3 +9633,1efb1d90fb89ecbf0e1098fdde02e5bd +9634,7b66c663446b2ad739b55135690f506f +9635,4065ca293e5a6190f0225c0acd336b84 +9636,028bd945e837188ccba216fd7c055641 +9637,af587f9343555a4beecfb24f8501aa0a +9638,3f2a4f4be9965965952c91f25111f6cc +9639,3b3f4f31584cec56fff0788cee784739 +9640,0d4c6f296fb3ee4db02cd9b6bd8cc9b7 +9641,e076d17d2f849fb3068f11c0893590ff +9642,7f1f70d6bcfa22804cead936c729ba43 +9643,5e71501e010521f8fcd33dca03925b5b +9644,ee88fdf57e2e9f05f54adf9d0dfda1be +9645,8375f23445476df5b49d89d600c28367 +9646,c7e56221fd6507b8beb49af0090c626d +9647,906cb703eaf54dc9cfc1f739ad2c2142 +9648,d89bf3fd7133ad65bcd358c84020777e +9649,eb392e0e44eee2c607a69d31b9b4df8b +9650,595d66065a4ba95292a461f53a3aafe8 +9651,714074af062e6c9183fd26be30215bf0 +9652,17540426ac509d8ab7b18b44794991d4 +9653,694130afb09c1b5ae048063d86acbe6e +9654,001e1f0bd2331318c654dd8ed9cbd1f2 +9655,73b6104323f09376b45c4b50615501d5 +9656,cbddc103584cc6530b8f83aab44041bc +9657,cb055300946c766f01bee9cabf4c461a +9658,974d6380ba37008671cc18453734bb14 +9659,fbd14bda1e7e80fa984b69b4bfdebf9b +9660,3de3879bd04d98f42dcfc04fe131c88a +9661,41a65e8b625ee8ab1dddec5b85744e6a +9662,a230d08b7c4a0eac9d95549c26dc5352 +9663,93fb3122c4cf23aac7f8d97348feb160 +9664,05b3d31834db423901e75ef488920f34 +9665,d4f267f27be1cc3bf0190af7d545157f +9666,1031c085ae67b779bc533f331410ca67 +9667,1c37b89a73a6f3ef39e9dd4dc17f9f10 +9668,ef47223d8652a4ef61ab9c2c8f0edc28 +9669,aa3642f9b35e27b60b6f563fdc8493d4 +9670,90c935a2bb7cffbc9d1a0ea4398e6e9b +9671,822ee4fc4971ef95e319a55bd40091d8 +9672,a7474232e1fd7487d7d7c735cfb1ecbd +9673,dfb8827d237cf2d4207857b3913ae1dc +9674,e36aa3b993e67a00a5be8139efe2570b +9675,58b0774ce1f92d0a0999ea465d1898f7 +9676,c09c3132f67d54e87f3db2f39ff52935 +9677,c449d810243f05f60704d74f2a0e8079 +9678,bc4625b34530e472366364e66cc6029d +9679,843bc2b4f6bce1fb77029783be17e89f +9680,15dc2e9f505a254165c81c8e18b5d155 +9681,f155cfdf5410887f03ed7059ce29c8e0 +9682,b889a17e9c224247b033747f9c6df2f6 +9683,a12dfdd26eee1ebc1db4a4ca1c8b6626 +9684,bc2f19df545b054554ff4900179c9218 +9685,c77f961de8577319d847821977d94671 +9686,6c5381f7f66c0a144eac81fb33df6714 +9687,639c9355aac7d9a49ae0b0ffa9f71d3a +9688,058cf1aa3eb5c86e1730eb29ac251552 +9689,c366cf9c71b206ca26dae150e1df1c42 +9690,ebc954e7272810a9916c5a618b5f6464 +9691,eb4d838d942b4ecf216deb7019d11dda +9692,bc084323db469dc668c6c7f0837d48fd +9693,dc349508e432cd1f75864ad85874dfd0 +9694,225cdf681cf17e7032e56915839ab3c2 +9695,f9918634f53a623cffeb1a6bc80910c7 +9696,ca5b69b877356a2ae99497ab93e3f0ab +9697,9b73ca74ffbb954845d8ce13ccaab383 +9698,33660038975ffdb32e9073ccea1c849f +9699,5708f5ba1690e375a0676e78e32008ae +9700,27c513fb8db10db8d6ddea96eb0c0bf8 +9701,d57a30855ebe3867dce6357b0213e82f +9702,563917cf92984154ead8885b9cfb8834 +9703,cc6681994a48c0cb4300f89636002e5f +9704,2ed5e9762e0bacfbaf463648605572c8 +9705,8689501a53375532aec0d33d2a5c4de8 +9706,d0f9fc7aa7ef5e60f32576b7559650b0 +9707,1d3e4f63fdbe483b6e2dd97e87392db8 +9708,274aeeacb17d3e2a17c930234061be25 +9709,023764a3bb6ec529a65b654b2198198f +9710,debc20b2e141818bc8fff3b26b4e9f89 +9711,d8da2de5e8273f4eb752d4be1ab6849b +9712,365d8580f40e8e8c31f567fbb981a536 +9713,84658b917605afe2b5aa3ee6a3e6aae8 +9714,8671f487118d7c4e5207128a27acd3d9 +9715,2b3a03e663739947ab79fa96f0efd3ab +9716,a3b9f0e4c1eb882afa3313b512ff2e4d +9717,4aa9fcdb3f8d34e27685a87ee7586309 +9718,ae8a571f01a8f753c61d25e39dd4acef +9719,8b6de82d4412f162c6b3cf304f89aa23 +9720,eea110dde464e8b2cda331e5833a72a8 +9721,342c56dad496e4bae321e8bc9a87b3d5 +9722,93e31f25c601fb477bd10444b8f4952f +9723,1516b2f64c3cf87a01644eb9249a813d +9724,80e9d3c716d5fbeeb585d8dd7bcf622d +9725,4b7452ce8f01a88429fdb1560d4ab392 +9726,339a9bf0e4a98feae0014214b003370e +9727,d401bdce5a2b47bb3f75c189921da731 +9728,77495409f9dbf9bb53b95448e67e2696 +9729,ef230a1d3e2f0fe3a9cbfb60108d8757 +9730,76d54e8e56b41aee90504a9363761e10 +9731,1bd39953ebc4171b4c53926ec6d5dc7d +9732,049932603537a733b6272d121b137e90 +9733,a31f5bb26f066fd20e797cf6639eadfc +9734,19b3feb79ecc05e5df1ce7bcf141e1f1 +9735,985444f73a94face2adc49d3067a668f +9736,ee235d2ba9dd1f428e281c4ad1c68f0c +9737,6eeb5dce931f79fb80928296759faa1a +9738,55f4e92d8bfd8fcfeb83c3c66b482f04 +9739,88dbb43c1a38882ed4161f74d76764ae +9740,e748779ec0e19de6235f855ea3f11695 +9741,fe9a8d0b10abaaf0bc95aa56d4f9e1c9 +9742,d448c0d48ae5703a0cfc9ab640085727 +9743,941031bf5b5f69c9980687211373ad4a +9744,725839ae1c078cdb7ef08946a829be74 +9745,ccc8a6daff2e38fe3813411fa5b888f8 +9746,351e4b18a8d5af0a7877a4f7f3f4de7e +9747,9c3230bda130044149669f724e820aeb +9748,98bf53154740dd445dafb59fadaec7af +9749,c3e9b014e005b6c5690446142285baed +9750,df2ff9405fc7b7ee217541e1c22083d8 +9751,55187e01504d94470fc99b00c1bfee09 +9752,4c80c818b7f1454cae8e4c6a5b7b4ba7 +9753,d87dc8175fa85f3308458864beb0360c +9754,c03c721f5ef516d4d4ccf136f0f89c6b +9755,83778b2b1e712a5ff75c23551057ef22 +9756,b454dda561742ba023cc69df40d0ebb1 +9757,ee743ae53622284f03ddf67ea8ff59a2 +9758,bf0eee75e7c6920be93fd3ecd6ddb38c +9759,526a78bf171ea82554bf06a1739b9815 +9760,6eab928a030a446e817949d458edb4ac +9761,c85c83117a77a0f8e377fae1f6e0e287 +9762,0e8d1a93cf144680981b038d120eaeef +9763,40d8da93a8b15c1889e63bdcf4356bc5 +9764,d70aca4f6a5cb6a5c0e3af6cb3651f70 +9765,124bdc50b9ecf7f46b4e9426577c4124 +9766,826f1214a148f3ab342e80f6eae94aaa +9767,e456b94a36875bce9bf39e9fd94856c0 +9768,2af4a4f1efaef47edabe9a23e99ace63 +9769,604e83a70dbb275809748c92e7dadf66 +9770,7a6ab0e21bddaafd2afd5af047854e22 +9771,abe43fd12651667a636c488e8b4d2006 +9772,f621f89203d0dcd5ef95b57c868aa8e6 +9773,51f18ee82598fe28b9bd6d8baecb5d2e +9774,b7d65a12b63ad106029357014339bf86 +9775,e619d6466db4d45f96f247e2472196a8 +9776,8b294899713236bece22b271dd7e0ff6 +9777,324ce95ba76bb0b1c30eaf4bcf9c8d40 +9778,f845cb46220fb3b2fcb0d68f372b6799 +9779,8cc077cc57b9033f86ea93bbef592e98 +9780,3f73c0aaf369ea40f11d9c083291a773 +9781,85c03b11aa2fa9785976e794ea1300f5 +9782,0d3781fff900ef750312b6cfc15c1464 +9783,a7536efcfd3559cd097ac4607747fd61 +9784,6f649a9c87d0f03cbeb7eb20f29f1d0e +9785,dbcdef3c1eb1cc2505c145f4270d5ee6 +9786,f00c8f604b0fac98da38abdea7ae6068 +9787,03803207bae2cb5008c4fb1cff95e4f1 +9788,aba7e093d9626c3f1d2e669bf5603f96 +9789,af669ddf2e0fbfdad7d313c0086ac01f +9790,4b70378179c37a960c8efabb29cbe7a6 +9791,9a0fd6dae3f0bbcc38641d67eb783c5e +9792,218321811e53b48ff91ab2fdaf123692 +9793,f03b1f08ecc9d441df92d8f25fea932a +9794,c799da91b138230e0a94f9e772d102dd +9795,41bb12c280d1295eccf615bce1478298 +9796,c1b9deaae33be7b012ae6c5e7f6b179c +9797,5a5058188337afeca87d7c37ec2d1f03 +9798,d14311ffebf13648227a1ec1a71d4ada +9799,2583b4b7726989beb6422f9ac2214ec9 +9800,b102ff2621474cb10fa2d3a562b40cfc +9801,5a52c014f7f15542436dc0cf396cef17 +9802,04deadd60d417abbb87f49cbb2522c60 +9803,95337b58f3c89d9d4f1022cbddcf3b6f +9804,9a6c60bde8c038c25e49965f9919ada1 +9805,9e115be482491d10f72f0f9529411745 +9806,cdc2c921ef04ee5d2f0326954fe0101d +9807,74cac864fab660e3596cbcfb53461f4d +9808,38a8c70e212c69e99401b249f8c62501 +9809,cf7bfc4ebb7e8685ca81f56a24fed7fb +9810,b2694599d9672296acff5bce093431cb +9811,cef72f87eff3a046c755b6bf1e246273 +9812,481af02d5f2ac0d73c2f17eda39579c1 +9813,06da0165db17c3bfcf74f25543226c0e +9814,5e2850b765f7e80704f1271a20d6365f +9815,347ad05c97dc6bf9617a00b9ebdefd1d +9816,f63b24c6f384568ca4fbd35c5ce913f2 +9817,6043e7f644f1b86b6d16138e11762735 +9818,85f28a226040f934b024a6c88e1dc12b +9819,afb5034ff877753f577ddfb8599dbf36 +9820,2c5273ae6dad9c881e9beed0b42f7b67 +9821,4c6d092a700295101f0f642fada471e8 +9822,3a67b2eaa31f72525eb0ba084804d57c +9823,39cb17bdcc649be4be641f4861531b09 +9824,fcf7d223cd9e57e4e9a65d2cf743aa04 +9825,a2096e36e07edc407ae985f3a36f35eb +9826,0c42dbf872e9623f5c3054a05cf07670 +9827,02624f8cf65d4ad2fdb8085f40f65bb7 +9828,a4c6b77a8fa1a04ffeb74324d570f50d +9829,0ef3bf64c2877d603d17fa04aa570cbd +9830,d0efe97e1216b7e6476b59a6c2ef9387 +9831,6673b293d60a5f9d7d9cd815fe1290de +9832,5ff0525ce45277b8c3da02291d1135fb +9833,4c72d30a566209b9cd933dc032600788 +9834,a355dbff5a841d9b386183a9d4364ddb +9835,45d5309a6b9a39c6b30f83ca2630e74b +9836,220c3ff44836cef241913db74210e91b +9837,fdc436c5d3cc03082f9648f2b424dddb +9838,e4f7dc3fd15757e211680251eda1b016 +9839,d70473a22e623a6e469c918732a1382e +9840,7f0fd352c89251c90aa889b15add9ae7 +9841,7e43f6a0e81c12c1380a618526ce1d19 +9842,82dd44bbc1c1d05f980b73f725a43898 +9843,e0336c8dce297b32afe3f8a543a37718 +9844,6eafd78bd24a9407f5e1b4a1f19109ee +9845,a84a6ef0d137ad8cb8626710830ceb9c +9846,575fb6a0eac28b94e204915d69d33acf +9847,9b0bdaddca30ae16174ce50cbe1b086a +9848,a115afa5624794b53f73de7ab4776b52 +9849,f0a786b76890b6267c7ba0bb82d172d2 +9850,3b807bea8863bdfe777aabc0d2508fcb +9851,43aebca642237d1363897f07c0561b50 +9852,9ba6e29d9c597f7ba2fcfb332c44091d +9853,685a08f3ac8cb5906bd696c98a8d362f +9854,389fcdf6c687cb3f52cd17effd39f0ba +9855,3af844170eabfd1dc4a7a9e2ac97ff8b +9856,c765512327922d48da8b65e247cdb75a +9857,75bac6e9a8501869bb92a1f3610caaa8 +9858,3e85fc4ef664d6303114e54fcfad8b0d +9859,00f3c10320eeec60596b3f8299d413b1 +9860,bf04127eeff17757bab6dfa2984380b7 +9861,606b0b53536937f916530143ce8275d4 +9862,8ec7dcea7a04aac7250ac10dd9b3ead5 +9863,13fc339eeb82baf1febe56f30883ebf5 +9864,dd5e057322e60ab3b9ff472d10448618 +9865,74dec841343650f57667b6bd7d85de80 +9866,0acbcef4be512c61c92708c5b70bda28 +9867,76c7f53bb9c99d1bef8fd3e6e0aaa442 +9868,5c4e618b13214a9ebc9dd0697498ee9f +9869,f54f2d206cdf723ce0a8fbd449ad11ba +9870,947c40d360d4bd5ec5e9cf38a21dd71e +9871,266c6b616e92eb2d960f1003096a1896 +9872,52af46eb40850be2a0ddb84012deabf6 +9873,6c63fc1fec2c491342e11bf83a2f359a +9874,f5eb8e5d34e230215cf2ed29cf57c63c +9875,f7c549401f25361e1aa3f43b48df7c8b +9876,99bf3376590caa590836713e1decfb46 +9877,37e8499abf52330af86328cdc6272d9a +9878,69d7438ae0a423ec8a3c684f312c3c51 +9879,c4054fff0172533360cd017779502fb9 +9880,97a6d1796120dba9e99a74a4510d3363 +9881,240a30bc86550c1c2607c1a900ecb8f9 +9882,92cf2d018e2aef27b38eb8181882559d +9883,c12c162d705b868c61acebf20b872fd3 +9884,224876660e1081888f15d6c43e3af61d +9885,79ad72493d8689fd6ae8570f7c048473 +9886,33b8f3f0005b2ab2b1ac312876a930d3 +9887,18f69eaf5896d4b4272457ed5939bd92 +9888,27cf94082c983aa60c626d977ea59750 +9889,42f2a585100d6f80700351ea4b23bc04 +9890,b71e281544a261c6520062046675271f +9891,360accfdb949e8acfd0f7b95195c7a70 +9892,59d0968f61e0887620e326e59674fa71 +9893,f09979f91918890a386f3f1192a4422e +9894,1cf48fc4ba1ca87207f8a4c933946d9f +9895,5514f49f97802f16a1ad8172ddc23444 +9896,4f88ab6e15be38d42160c099438ed5d8 +9897,7364d7d8f168d4d2a45b88d5e0dd934e +9898,f1036a2cd77416991c3c5e33076d7b42 +9899,bfcf928fe174118c002067253f2b52a8 +9900,61e354baff2d4047f1de011c5cb164f4 +9901,f84545d06a2535c5c5743673a676204f +9902,7a4824f97ef35e9a734ce9486fa6fd83 +9903,db44330b502af4d32d40e3ae7abb976a +9904,339e0bf42beddfb91150237f96fdbc8f +9905,7b1a7907a72d1458fc036fcebd633a63 +9906,3de3b36af7ef9ae6738c162c2275af9d +9907,3d69f55de0b9a7df0b86e842efb02338 +9908,0e3cdf739bbc9a9a77b2f325eb292ae1 +9909,249a8c221641b496214838f6f7fd018c +9910,fb2f10bd1082471cde4428b41d2bfd2b +9911,54d5ac7e26efdb4113cf4b62263d1eff +9912,67fb3b6c804528908b032e5889926e87 +9913,3662d832808dc1d45d8d3e4142cb3d87 +9914,3f7baa9e234a9640d984c9b02b903982 +9915,44110a8117b9ef927e0075a5ab3de891 +9916,0878d121b8e3f23eb556fc00a950a721 +9917,425e219fa2b9cbf360624274d82dc456 +9918,ab2301166eae35d9f3fe880a4b61b0d5 +9919,13de8c5e2c9fc5e29c1695b597a4e9b4 +9920,16a0215cf2ec42527da306d7f399eed9 +9921,1b70b687513025a8d539b301f5f64d26 +9922,5ead4948fe4c7329e93f8e44a4ee0f3b +9923,6345217218127067cf2aaa1691afd45c +9924,8e250e72d8d71e79eaa215d58b8864b1 +9925,1ce9ff3ab32b1f90b6d564196f5e11d9 +9926,24e1eaa761cf7be2ac3931990c9bb907 +9927,97c06c59934c893e9bfadead6385d017 +9928,662716edc4373a7e8447904e76500fe6 +9929,79c9019554434c295d97637c970f2fd7 +9930,76f1b46fd723b33d2302259a3fd83f41 +9931,a21aefc3329e125b03e476c388d6a933 +9932,59a7d8775e755e2f3dd78b577d4d62f7 +9933,35ba843b749e5e8b579e02f4cd5cede7 +9934,30d959892a23487b2d13892c2e5d7527 +9935,90e8309e6cf26cbca986457025c2ff99 +9936,0ab5a894b3cb60b038532dfd3c3fceca +9937,5cd0e3338ce4613b2f7698fa7cce68cf +9938,33da311bfcd52e1130bf8819c0a87322 +9939,c39b36b49f7d8533cb7358feec46d737 +9940,10b545677c9037eb0390b92bb1905300 +9941,69815f268b52e3789fa5d1ce63e7905b +9942,5cdc422536c1ede5ef0e6e7f5d21ce33 +9943,b83d42eda6e156f802aff78ec5493707 +9944,32d27fa67d476bd630e23774cd8626ee +9945,50508c69e6c5e25b5f3b30bae47461a9 +9946,fca37fdd1e4dcf7efad278dabf3eee18 +9947,5cc3ed6d776aea86f74384631aeb9558 +9948,a048e03a7fb2aa303e007320aaf22239 +9949,21fdff6347aa545563c8e782756f4478 +9950,cb8d66babbdeed42ebf3057d39110f2a +9951,a910f8730f15ed51978ff84e3417e18b +9952,009a0cace0ddd7cef65d086fe3c8025d +9953,b8912b3d9af1c6ed76bc5595b8e26283 +9954,f5c28af331b1e6c96d22af96447c5a0d +9955,c0e54f40e3b7c44f959b1d53b1a5149a +9956,00d826a878bdd4c8f9de6760b430a961 +9957,22d2251ddd0d1ab7ca32259a8a426dbd +9958,e63ad0e44c7414601e8d895611ea0783 +9959,581de33654a3d1eed42f8b8cf1ed5cf5 +9960,846faab1108f8671cff945e52393f393 +9961,835c912783d70ab11fce2b06d203a909 +9962,b8d8e31595eb6bbbb0c5ee2247747511 +9963,0a2c2478b71fe500bb5d11d79ef36b17 +9964,392807ed88c0378abcfa4162bb032ac6 +9965,b0328c589c85a6d61c353f2a1ccea9c3 +9966,6ae06271120c941c6405e5a58fddb952 +9967,5e6a42f51222490d1c9815ff42ebb533 +9968,a59318288330aa2db8190d8ae2b9bbff +9969,0ea8522ca0756744bb26475e97506d10 +9970,6e3d39a151f64fb4314f919ff7c5b727 +9971,d0c32fe3643730d27289322ead732744 +9972,1ada78a98c2ec1e6d1baeba48204ce1d +9973,fe3b7671c1386f92e0424e887fb879a1 +9974,af1af7aa3db84e3948287c741600d078 +9975,75a8f3120136debf2f81c447bab1efc9 +9976,5fffcadc0350febeccdccc00f9a07dfe +9977,7dc1a5324d755fed659c01156047d276 +9978,b96752be66c2cc8dc4bfed26022c8f3b +9979,2c398a4da0217a065e421e795ee42e6d +9980,e03fda9406385653c044d18bdb31b932 +9981,f01c35a299c40e531636f8ad25b649c4 +9982,268e01fed8eb5f8a903500123b659543 +9983,87bc33f804486414243cc49e7cde271e +9984,1f8f46ea97402d82ffc3ad6ebb175f81 +9985,8f6e589bca5f27d36cd92a32804685b9 +9986,fe85f1277be6de65a0e28bc69085fc31 +9987,bba1b7922c5729bf84937a2b018d82e7 +9988,16bb081e7aacc1093d850c14b3a31161 +9989,6ab9c934a1dc75b74be24600b500b606 +9990,a79472b6b328a954a06af1073aa7eb14 +9991,05f4db7c57115c2f4363dbda56ed5298 +9992,c61d5fb1201f09adacca547d90989f0e +9993,e997fa2e2dba0dd208b5273ca7fa5c05 +9994,857afb3ea7574784ae4a69c7a5a9041c +9995,4b749995d844e438223c44c0c6319e53 +9996,655656bcc5abe75df48ec2e4d3cb8f48 +9997,96eb103f26e1f6ecd3e1645482c945af +9998,df348e45f84f76ad6ee00eb6a6790ee0 +9999,ab724e1d6813855107dec66810def4cc +10000,69881f78a70533e677c59f09385c77ba +10001,a52298aefffc5701a9a20159fd68c636 +10002,792c7879ba8a91b27936f84ff703f316 +10003,aa25dbb896d82830852e60a07a927633 +10004,429f1474341f1a07924d9d27697b3070 +10005,b52108f8bfa726bc67a5cdfdd0f309ae +10006,34e21986c82b6a0503a9152c2cc29416 +10007,c595f8ea249d06398f26123044e60afe +10008,c0ae4e341b4d75782965bc15e61c1aae +10009,85b787fd93f8e4b98032ff423e9580e3 +10010,d3db2c23885be7f7cafe75f79cd526d6 +10011,8aee625c494786ae782201e9ed992ff6 +10012,36fcd7ca325d2cce3062b09657e10d51 +10013,3be39cd919b5d83497e80dc0f6801481 +10014,5b1151fff457ea71358c7577c23d10bd +10015,296a2b124de5c3868a523fdf42d657cd +10016,14c17658e08f2db3594bf6cdba5216ac +10017,0ca24568399d2e30a93ca4e3e92c7735 +10018,ab1ba9d4cd591f391725384fbfd10aae +10019,d8ba8b619d0c37a08783ed68db02f4cd +10020,295ca5d2ebef10bf40d94d1401c372a0 +10021,158d2465e182a94db98d2f09bfe55284 +10022,303e3332a4d8b4fd8c577e99158889f7 +10023,de8c725157ba712da1d260c56894a1fa +10024,ec79163d8deb77c3fe097f876514dbd2 +10025,35f2ead9c95a3191eb2aa367c08e61ba +10026,d5ed1d0acd1e239630f7653b9e67f418 +10027,49113c6f9682360f829f80ac1cee158b +10028,8f1488e1e94505007b10e74f174a4bdd +10029,2f10107fd41ce02df331ef17bfc72966 +10030,9b2ce8b5ba0390d5eeed8272ec8c7d4e +10031,36b520ce1a3f1e41cd68e693396856c3 +10032,e8e3c498527f37f7b6b0eca2fb332260 +10033,dafeca12bcaa33c677d09813c471e44b +10034,0d710bfc03a5582260921b4c2849debd +10035,d661bccbc6298cf99ebabb31388a7792 +10036,359f84084657377afdb2c0266405f9dc +10037,e9638798eb90523ce56f9751b547a418 +10038,f6744ba87fc98b180db1257c2e8f729e +10039,6b4dac0b407c1bb938a706d33097a3ea +10040,f79ddfbd8fed10e91d4e9665a097ec4a +10041,aec6b0dcf66998cf737909a64197fb46 +10042,a6880b8586bddf457e49b50bad9b46ec +10043,4d6c3b279e30c5fe1917d7a16bf45245 +10044,1139d3451de6d7ff95bd4aa9a65a3709 +10045,cf28149b14210dce83c57fb85d4f53a7 +10046,a1bb7df611aa6ed8ff922609583d1774 +10047,1fb28e7919de28d1140d70d2aa1ddc39 +10048,9e55cd234979714c85aeaecd79a195fc +10049,b4fe111fa2b78d73bb680c1b4ebafc41 +10050,b25266908f45af8e493edf6df134a5e4 +10051,39d54e4c34649edfb0d561e435aeab35 +10052,4b0b4681282f1c89b6b262156162baec +10053,9ce7297f71fe295fb74cdf3516da6192 +10054,f88ca0d17f8019081c905048fb961d02 +10055,d01a97c1cccd15fc3cacd6c58a67b8b2 +10056,90ed90e19e286ec4e12d4fae81b8324e +10057,ea743ad2c856b480de8fe7082920dff9 +10058,1646f74959eb428c3af32642b1788378 +10059,55169e6edf18c3702320e2ffe3621ae0 +10060,77e3d3863af872ce362ce2681b0e0cc3 +10061,c76e8075cef5fe210cc3df3c6c92252a +10062,ea339f494b7cd2d2d7ff1166ad4d93de +10063,f72db3890f5e7950fef74d0966bd2d59 +10064,72d7227a295f648c2f6144901c3fc3fc +10065,8614eba5a75f849700f4c653511f746d +10066,64cc4c77ade1f617a814135893e57903 +10067,990655bb5ac324cbaf46df5f1bfca71b +10068,fc5f4ee9f49891c56d46f446b9995f35 +10069,43cb5e9aaa513a5ef9bb0fb994d0a284 +10070,0a17d95166dfc9b3591153ff10b3ba95 +10071,817d585ee42e3aa59e010cfab8099470 +10072,811bd1fde5215151a77752c4fcb463cd +10073,a96d611457d579830db28d21b647546c +10074,c9bfbf956486b438831405af928dcf29 +10075,6e3561916966fb9f564389cc5dd8b8b0 +10076,c3ad784c0b65f8dbb11f56e75b6478c1 +10077,64858a87c7139e22ef6dec89c3f1909c +10078,fcc2e753fed261f852e22ed6bde67303 +10079,6f13571c15db27fa71d999a56e486233 +10080,07c9233c38a535ce08069df4931517da +10081,54adc445aca17244f0f1f45d6bca3f6e +10082,7061dad6d832a5599e0ffe242865d0c8 +10083,f4f3a406febedfdd61b2f7ed5369ee6f +10084,2cbb91b08e647fa0f24eea17fd2c589d +10085,03785cbf84b1f75864b75615eb56c4e4 +10086,ea1018d0a41e83914aaa1787f93a5a0f +10087,6b83fbf2e0d61cdd5100b0c2b62a3822 +10088,1031e44e4bacc9d4599d12b7b1d4b18f +10089,bd58aac161b9ed899d59569ecd390a0c +10090,2746f4816609cc6eeec058b85452f766 +10091,0fcdc5558af5db26c1b390f23d635f2c +10092,338b74cd8bbb1c3996ba7166d1ca55da +10093,f2e656662244a649853b0545a6de8e35 +10094,2d432159666f886a9dc4fdd15c958bd7 +10095,f3c4fb2f5dd1a5717ba06fcd66261aff +10096,387cb0dc2ff6b10ae2948cce1a051aab +10097,b70c6a1054d8ec4dc503b7e71e3e5fe6 +10098,d30ba2fb23f1815b430314836b8c48f5 +10099,98fc254d3d1af7aa04e78588e71e00f7 +10100,f58b62decbad66e93e0d3463d4c53b12 +10101,97cc3baa40a597e2834014c0c85557bf +10102,079f06079c787aa11f7dcb93e77d7568 +10103,9294d16f75761c4ac0f3f604ea8a91ae +10104,4a5bdc0b2f177f7a0bb7be947f8efba3 +10105,2eeb16a934eff9e4d46afa7edb17c007 +10106,3d974986fa0372704304392959aaac2e +10107,ea0e2fafdff3136fdde9c8bcdce07f89 +10108,7fa40a6e699b337baa92c781626c44d1 +10109,65a6958b9e975b4b86c06c2ecfae273e +10110,4cfdb7c15df3e330f4b6b3cffab62391 +10111,8a1b7fb79b23a67df6fb2a894486526d +10112,b68b73a135cd9b7b6827e518644cc4b3 +10113,58435ca799a1cd3427001200dba953f5 +10114,64f7e5dac4522c33cbbe38f40ce74082 +10115,8d26dba6f70fc17a098b420f75a88a61 +10116,307b7f76b83410377edde2f33eb9ac1a +10117,3faaa8a656c729914f28a7148e428a60 +10118,05e799ecbbc3275f3d574366eb051766 +10119,2336689dd62b9a58807fb557b0ae3aab +10120,6fde4b18fffce0e0f1c5b2d736b834d9 +10121,8dd9d8f3bce4f6af64d196cf71c1c484 +10122,6d392c1474baa61cd8a01fac383f4784 +10123,baeb872b028c644b6cd6b401ade97915 +10124,e068e93a024b4f8ace4ae11e174d066b +10125,6eadef212c1bf8a0644cda7c7b3c5c24 +10126,45264cca77cfdc1f6d5b04e812733eb6 +10127,8842b71f8e289cee7d8aacebc60cfcb1 +10128,dcba7083bf00fb56e4727c7056251a78 +10129,a3e26687f374016c5a00e14b59821fc9 +10130,5a22bc842006d249dca783e08cc9e72f +10131,7662f2fe40ff944529e67baad7a8833b +10132,201e7106d034a59f8d0ddf52940bd7eb +10133,622043a1d45c2aeceb7a0049c47c5cf8 +10134,5162cdda367d53f9f63fd85428f84fe5 +10135,7e47aa5b95a80911fa3863a4d2960785 +10136,b2b449b47d2040d48e0cbf3469c8c8ad +10137,0c9a769f1d702864eabc72cf23b40bbc +10138,13097b10b44cb1018227ed363a594fe2 +10139,8ecc1094db38ad1e920d3393cd19c1f8 +10140,f9cdfb900a5f2cdd08516edc4e535649 +10141,94965f04406d0a38566c4cb538fe2df4 +10142,78e0ce1e05cd49c13f5594bf13f702a7 +10143,7ce7ff929b4dad56d945bad1118aca40 +10144,5a6ad8cfaccfe91e26f65961e060ba24 +10145,9686a6762f6d9f8dd694ba5e71ea60c7 +10146,882ee71ab9d9a6ba0a642ca96bf7a434 +10147,1a1ace7e5a35fdf33a9877b3f7194aa0 +10148,3baf010c2e75e07fbf5fe6afb10d6a55 +10149,724d4d60e7d1b1f92e35876f108ad0df +10150,bf6d0547b702b5e994222afef6e8477d +10151,c3f29d17e4cd3dc5294be3e461ac66da +10152,affe07fd4a93eff7168eb9c616f95c5c +10153,b88b1be21efa3939abb61e3e1de6201f +10154,3f18ef787c9de8d3c5dc07609293a8dd +10155,fe6ea53123db5ff06e9169dc671a5f6f +10156,d11a359d94447eb0aa51484a17b0f797 +10157,80fa536be1aaa378dcbaa4333dd2c56c +10158,3e34c22869fd47a59aaf3717bb9507c1 +10159,a7c4e0f239b1b773e47c0eb46ebc603e +10160,1cc3094e6c345b7667dab81f9150e350 +10161,8a19ea576469cd6c9dc59b5b7bfcd3bf +10162,5de3ede8b2064a43557363c77f0dc34c +10163,38ded204a60544e0af44df9a4b31497d +10164,922895b76c9e5cbd0852c813a9a60861 +10165,6e116dc3909677aed6123a9d31a9e28d +10166,c455d80103fd7065d21452fe1d37ee92 +10167,deddc00af0bcce79ed1e1e5c4e0934c8 +10168,6e200cfe6f68555246386d3727230b32 +10169,eaed179872656aa51ec8bc58d541a598 +10170,6cdae9e12bc696824bcbe4405440b9dc +10171,a4768db65d675d61cdf0fa9d9cf0e350 +10172,02caf2d6edf0d265ac6e5b8afaf49e98 +10173,2ac44488577aa917cccaed50ac4bf402 +10174,4513e8651c7bbef57c60120e3bc5f0df +10175,86c8924b77580cdd8104384316de63ca +10176,5fedcd4e5970e82c7cb6135de6fbcd43 +10177,3ec8a8f40c864c94184539ea7995f953 +10178,b509527bc95d93ca5bec485153dd4d0e +10179,989c6c3284cb4b5f57f4c48e78231e00 +10180,4cce99d7eb1cfe4b15d9afd72307c66c +10181,1c69cbb715e8cfb89b583b449d52a7de +10182,928dc6cac29be9d97ff009c425646204 +10183,2661c982bc1c7422721e5ce78e1b85ce +10184,4bbb471199f8ade0526c916bb80c4ea1 +10185,9212e33747dbd4706c608eb4e10f698c +10186,4b976af9ef76c24abb70e73018bc019b +10187,02b4d1902608adeec8f481e5fc2db145 +10188,ed7febe773a021c532721b87746c5350 +10189,ab0c6722da52804ec9a40d3ecc5f6bca +10190,0e931782a463caa31a209543446bb924 +10191,83d96227fec532ac607ed9b6858ad7c6 +10192,eb88237bb571ca3c653d275c4fd2c09d +10193,14f4ab589a65004728ccd5e6d6f4c479 +10194,de69f9c0f479cc2945c889fd9d6540fe +10195,ad358c3886bdac38fbcf1af0b53378d6 +10196,6027a5a36e73afefe6cfbac746509101 +10197,687400a0a1868898f209cfc38af5ca01 +10198,bd623c12b34b83b0f118d9bbddb5bb09 +10199,44a925bb62a123ffb466548b81a5e2e5 +10200,05884e1ce25595c32e1befd6088eec16 +10201,80b0676a5ef7be7b3715114de774752d +10202,e025b47ea629c40d6f0c6747b8979a3b +10203,2549780d4ab35b285dfc6a804c489065 +10204,f272830966dfd0e9f0166a0fed3a3c3a +10205,9d2da218739bb45fb9f9fd793387b134 +10206,4c69c67f7173e888f08879b9abde758a +10207,dd765f4ec46d09e9cecdc10412c34604 +10208,b7f837dddd8c8cffe5876ca699261bc0 +10209,ffd20d76bd38d8964a0419e33e08feca +10210,bb3797cfd5c38aaebb0f164fbfc68eaa +10211,a72c7cd22698f2bf5b164e4de0ddb86a +10212,4097010cae6212065b858ee55c3f41cb +10213,2e8609253faea783327eee9e78e1c5a1 +10214,b05823d6a90156dd979bd5185d2b5a3f +10215,a243f95d6ebf1c40bc3059d52ca8c520 +10216,02bc744e7b555196a22a490a2bfa2c3d +10217,bc2bc0d4f8e76967609d724b0d55aeab +10218,f024d16c076c1ef44d2a7dbb8d7365ac +10219,d8b02bcd7f6728902940026ade832be6 +10220,1cf2ef228e38c21c99e3fa7ba3b90f55 +10221,48950ec27da86e2aff30c814f6bd784d +10222,1d1fc93e8bc14876428c614ac39e2f9e +10223,c8798c5ee6fa7975416a520542b50411 +10224,f856ae28465f9361980200710e929169 +10225,9b7907e5d6411e8afdfe24645a0b751a +10226,cbca5a1881f33cc95fb04207dbf94802 +10227,4693ed022ef3e75c0a86368583d078f6 +10228,1c420c4ef6e21079bfdbd5a11c5e5e0d +10229,be4602fcc3f64a84e425967e330cc790 +10230,dbbe5c2cbdb1c626ddd469aa8dc73b3e +10231,14e13a8647c734cb1ae19891242ee0cc +10232,3727162d82578152ea47e41b4b49142d +10233,deb954395da8eee0d85bafe6819a0e64 +10234,dceb392edcd338e2430e297691e6d7f6 +10235,cb91d703082d1ee2889e338f28dcaaa0 +10236,81599d9d2b506601d3801ec33eec9367 +10237,7616c237344bff69a26b9b6483012af6 +10238,0be2f0695086359e97b705853c869852 +10239,435c857d9e9ad4973be29ef7c5dddef9 diff --git a/hashlib/test/fixures/xxh3_64.csv b/hashlib/test/fixures/xxh3_64.csv new file mode 100644 index 0000000..111f79f --- /dev/null +++ b/hashlib/test/fixures/xxh3_64.csv @@ -0,0 +1,10240 @@ +0,2d06800538d394c2 +1,77ead0d66864b856 +2,05c08cdb816da6bf +3,fa5bb15de9326deb +4,53aa07f42959aae6 +5,28d742e197c0fc6c +6,b955ef3603293d45 +7,90d63cefc8dbea9b +8,e51be922965c2d64 +9,0f4a2a09b575af5e +10,1a4d82e6bf2ede3f +11,29e2e38a730f05c1 +12,fa170e55447e813d +13,fb426264a2cc4a69 +14,c7dc2b5095fd6e54 +15,c8d6a9297d4192a9 +16,fa3e85343bd1eb85 +17,d0195250b7c091a8 +18,ec6a3c41e54cce74 +19,ac30293411b79370 +20,f7809c18547d31cf +21,3cb90b10611c4ee2 +22,38d341d9f67116a0 +23,bfc8170c100fa2a1 +24,1e58154588131767 +25,afc4bf00d51d156e +26,db2b89e68f540d84 +27,45099d2d95b49f18 +28,3a91d051e2db6ac6 +29,586e86c7372e0de6 +30,f33a2825a7068e80 +31,e33d11fc9119b648 +32,67853ddf6e4cf75a +33,94efd2bd22008cd8 +34,837013a298470d6a +35,a39da6e5f94c2c86 +36,a0cec1454a5dcea5 +37,9cafc51bb372f3e5 +38,b124d0a66c00b966 +39,017e78912832d874 +40,7876dd1bb7ab8e52 +41,e01b0cb2bcacebe1 +42,ce476e35bec02cd7 +43,c6687d2144f10262 +44,e5a17b689b3537e1 +45,c114a7b7cd3429a6 +46,7435bcdaf52225cc +47,cd6e3f3974075818 +48,12f377337d5a5d0d +49,c1873ee0762a0e80 +50,a2cd71e2feaf5544 +51,316d63a887aa2171 +52,bf3f503c15bf558c +53,e91b817bab140f7f +54,1d2945c2ba92678f +55,31ca316ec35d4a49 +56,c9d3ddea9b43183a +57,5c8c585a6f2b0fe1 +58,b750c2e3ede6bf32 +59,d5ea5d32d92f602e +60,daea55e4a66dcfee +61,c46e7b3a7ab9e22c +62,14d9bb4c079a7c60 +63,04e2ed1933b7cbad +64,6dd53939c35d1946 +65,b602e4aab8777e61 +66,cc877997ffce24b6 +67,248e7f85b71c00ff +68,62ec04333564baaf +69,1ae71797150bbb4c +70,72830abd2a7fa640 +71,e7241636efc2378f +72,d473571cd29bd46b +73,6822e7347ffce412 +74,948d419bc3b8c3b2 +75,b9a314e7bfa44abc +76,ef5f5cf624495d78 +77,ae7dde1d97a4bf8d +78,6c42487bd5461c26 +79,ead65a3c15dec384 +80,bc0aa8222172c090 +81,f2ae15292f308919 +82,b69de985c2cee30b +83,b27b95a5797ee018 +84,a2acf51aa3f4e44a +85,debfe9c36c0806db +86,fdcb503bd53e9d45 +87,c0fc567b43b1c779 +88,cc40a57ead9882a4 +89,a22302f1d22e7332 +90,507425dae2e0ae09 +91,34bdb0a3b2df52b0 +92,2d3d08152cd639c5 +93,dced684b42025ace +94,1c88e29d55f7aa0a +95,a1b69f145c6059ee +96,ed29f7fce45b343a +97,c727372dabe74054 +98,413fb1ad61cc2651 +99,fc309ecc6f99880c +100,596cb463752aa02e +101,061be10a0b55072b +102,f7fc1828169e1908 +103,7598cc3c04bc75c8 +104,2f203985ac7fca5e +105,e8de6bf4c477e867 +106,43bfa07e4233058e +107,9460f55207be2f21 +108,e5ce43683c12e71f +109,7ada66c49bf5e7b5 +110,6a80231c92caa724 +111,842653e9752f7cd7 +112,d7c0fc9325387219 +113,8035488f713819bd +114,c372562c8370ebf7 +115,fb1cfbd3f09d5764 +116,1bf9559696ff0acd +117,b2268ae2af520ec2 +118,a54f900fd68143e1 +119,6dbe002ef8e0108e +120,e2258d3c4370de72 +121,7c5fb3e53309c26f +122,df740cbf9f560120 +123,25faa84afdce2a8d +124,b4a3088a793a7bb2 +125,a615792a5f04c544 +126,d14044666c0c2097 +127,dab295d2b949369d +128,b2742b85d442f6f0 +129,c0ed0c2466103433 +130,2b735f2c96c4a8d5 +131,7bd81560ec137ed3 +132,0ed20f410362c4cd +133,d7428b4e8ee8221c +134,d2b39e06b1eed204 +135,af0930660ef35d17 +136,ca8f4f470c8b43e6 +137,92fd3d96ff119119 +138,7dd7b94006a59423 +139,58510f8d95687bf3 +140,b8cded020d272b53 +141,9e0db620f4b4629f +142,dacc0554701f9acf +143,0033c5210c995c77 +144,93a379603448ade6 +145,24dca185aa4aa964 +146,f7712491d459c40c +147,91e362d899ae9c4c +148,aa01e3778e9c9777 +149,3d1708f74fc57641 +150,8e84d715c5130c76 +151,0d876be9e4994f58 +152,8ed94e5097701530 +153,c8dfa24e894677cd +154,1d64be650e6cd143 +155,92809afc6361d577 +156,8ed575ef2204d3c0 +157,c8559f987d94a485 +158,0e04188091ae86eb +159,b8063465891ef6c9 +160,234346471f2fccb6 +161,94330cae742bc8ab +162,cb8b713a41507df5 +163,d715fb51ca9eec0a +164,1899f04f0d761af0 +165,cfc0a9df11a2b0df +166,a585b1fcaefecbed +167,d7d2c5dd6c2f1a94 +168,d4e610d225755a61 +169,78d57b7429cfa54f +170,d5006f28802296e8 +171,861ad4946eb22717 +172,080a1d656e321efd +173,86c733dbf459317e +174,b2143a157f750258 +175,d30d25f38720d941 +176,2d413bb8389f927f +177,50cedc0b55022900 +178,6700cba1cacd7e81 +179,63d5534dea6322a5 +180,c144fc1b28b92f0d +181,c33b870e028996a6 +182,6af016f0b2cb9bcb +183,b3ba29bb56ae830b +184,241f00e1eef231a2 +185,2da64739ccb74293 +186,5f595bb87a317a9f +187,09bfbbf87d71d75e +188,01520965cf452877 +189,ab9607ee0b63b06b +190,08d5948e4ed7b2f7 +191,e4cab9ada740fcc4 +192,bcba219fd3ed2e29 +193,00ecb29a855d62d9 +194,142a96a7ed470445 +195,20686d918a9ca098 +196,9760a04e18689fe9 +197,7e3fea10c3c99594 +198,69b10ced66405088 +199,208f15684645ee9b +200,b743bc28ba9e2410 +201,2e17337a48f49303 +202,f14af6734cb0248d +203,2ace37cd58b02dc5 +204,64a1e21c03d424cc +205,13252fc16cf8b6da +206,baf943d9419f0db8 +207,7f042c5ca46ae629 +208,ea5b289d682fd69e +209,acd7d2b06cb471e0 +210,642dace9ae9bc258 +211,fdf1fb223fc9d353 +212,cdfeea4404419a6c +213,40095168cf8debfd +214,2c3330b7076e75be +215,9c18eaf56a3294c4 +216,2b6d65a5914c0e23 +217,0d14ec13deb1acf3 +218,804ecf75b9926e60 +219,7752df1e7a85ad8b +220,3e1ec727d6ce4f7d +221,e5a6a19ecc0d8a03 +222,8267f6545575d993 +223,64ffc76f9e3683cf +224,c60a487ec511c1fc +225,92820c57eec0bff6 +226,5e826812f474adfe +227,7bed066e25a0fb59 +228,98fb075f6f0f983b +229,c59b88d3e47c114c +230,35c718bc4061c017 +231,25374ea6ea7ee63c +232,02cd5e0e2d227ed6 +233,64a6dc9979005884 +234,c389a07ccffdf0ca +235,6b8951e2e6bf5693 +236,6fbbf09d124d7b7c +237,a395bcdbc059a9db +238,b24ec9a540312d77 +239,d3edc0b602d9118c +240,7ae7545710b555c3 +241,99be286ee0cadc35 +242,cd25b4ae0eb1f30e +243,2f345a20084c415d +244,e4fe1900b4758823 +245,111507439e906b8e +246,4ae37cbb69e6dd9e +247,ae5cd69628159762 +248,55092228169c53fa +249,e3a58c41acda5ba0 +250,59b1249cd17870b9 +251,6548d0234c320037 +252,de8825bb706434c8 +253,8277d3e463f15b1b +254,716862b5619b5c39 +255,bb01d7e7eeb9e64f +256,29189de8bfcc5dd4 +257,0e9fe81ff4d617d8 +258,5ba4821a157e39eb +259,8ae8a0d72e091d19 +260,1c124b722ca44bb7 +261,09687e846b91d89e +262,5d9c483021e72a14 +263,58905ca05de5411c +264,769b85137eaba2f2 +265,6f551e17c871a6b8 +266,8dd3c5b85f026908 +267,ccdecad2203a67ac +268,d0a397d4431cb4cf +269,4c7818b3a269a49c +270,5c0f3b0442231cae +271,146f7e91fe668f28 +272,b29b40ac0f1fd3d0 +273,ce48a1e93f0e479e +274,f71e3b01b2549d22 +275,02879a0b355deefc +276,a13d4e4500500285 +277,e070e38b58d441b1 +278,99e8d5d68d1706e8 +279,60db46e19f79c550 +280,9cc2fee827b3da26 +281,32a06b7a5bd58f0f +282,7de9dd809b8b0f60 +283,7eeb3b61a284efdf +284,b17c87b37ed04f57 +285,576f556c5fa3ee95 +286,2ea95935bbdd6f92 +287,0c283a1e9c517ef4 +288,990fba9d1374bbae +289,0b1603c2a79d3fbd +290,1fb97beca05ac48b +291,6c1a0ce179c9aeca +292,becd2520116899cb +293,d713d84a38b22da6 +294,575cc5557de74527 +295,bc0ea8b791b17690 +296,01998295c2357eb3 +297,3871129ba6bba81d +298,c07261e4352bf028 +299,f30bd3b7ee93928a +300,3dda14d16a77138f +301,64e69ed9ba5c27ae +302,758905ffbd3e8752 +303,7d9211c2be785673 +304,f3550cc6793b89cd +305,d7241123b344357a +306,53feef199ba8595d +307,3094c71284b65f46 +308,60eb5f6e8134f246 +309,71ec86c94d7bb739 +310,8419212c61ecddaf +311,eff61055cfac9462 +312,d0f86694515f4b69 +313,7f136c7bb7dfdba4 +314,2804383b1186cc9b +315,d85197a4b7af7c66 +316,eaf77261467927b4 +317,3119c5592e4a3dab +318,fb5faf5e97feacfe +319,ec4b59072d207244 +320,a27e7af17431f4fe +321,90f9e80b2f1fe869 +322,a4510e240d3b0937 +323,8dcbe37a13b0909b +324,54b6f9c0f11c9463 +325,a7bfaad203816f42 +326,e8bcad11d94eb5d8 +327,8e82e9c81d53f94c +328,3dd18252fe697532 +329,2823bbdf90c80d06 +330,82fb48bd52870acf +331,8dc0f66f19b71390 +332,53cb1600df0fea44 +333,a3af597c2bd02994 +334,8d0dcf9310795f10 +335,be60831e840c5cfc +336,cfd997b6e1b052fb +337,bfe14dd334786279 +338,7dc3821fe6e425fb +339,68b995000629e9f9 +340,59a4ebfbf98ee600 +341,ec56fbe4b9d6e83a +342,70235a3ae4c1c066 +343,3af44bac36789f71 +344,5f5e98d337fd7fd5 +345,4382ac075282051d +346,93a4d5230a26b213 +347,98fefe56ebb7081e +348,6f53dd11b61f977c +349,921f11abd7c385f8 +350,5b21c415e6e554fe +351,9a35c0fdf144922e +352,bd965154a6f61ed3 +353,f1e336ca2156b4d0 +354,cc5d2ffd7c2c913c +355,9ec4fe4dd81f8efc +356,e81ac7a9c3b363ae +357,83fd4cf000b29673 +358,f7c4f35417cd4f21 +359,082aca0383c0ad2a +360,290e6227d9aee805 +361,557f789592025c5c +362,58ad1e3dc47683da +363,435397929cafb1a2 +364,3c781f3fb2c957dc +365,e5331e303090aea5 +366,0983f8f5f301c10d +367,2ed9d48d96e6abba +368,392edd6f8a23efee +369,24cb45927ecf61fa +370,4d38cbf605313604 +371,f29833cc91f73024 +372,627b2ab212bac037 +373,75af21376b9af215 +374,d1d023885ec67f64 +375,783eac72fd7d6202 +376,3c0bbf4bfa84732d +377,f7b9d14ec1dbcc84 +378,a8e8574e22a7d2ad +379,1d74c18eced7ed6e +380,9b273acc66d3eb11 +381,76e7eb5e24f43d64 +382,2886f9cad76dd07d +383,d6ad1f3618874932 +384,cd4b75f77120275c +385,cb179f72269730e2 +386,d94294eed98fbea8 +387,3ee94a91c6c16419 +388,99196699cb352dd4 +389,9ee0ab639a0f3521 +390,a4983a5d5db4eee6 +391,bbd1dd4f60d69a7c +392,9519ffba87fb002c +393,01cf0303e0a47bfc +394,7bb6471ce048a0e2 +395,6cf473c0a7d59f1a +396,8c412cb6c512f54e +397,e64083db32f8ce7b +398,f01b90991dcc4116 +399,335386ad4ded18c7 +400,dde1be8f611984d9 +401,6aea5da6eb5083b1 +402,7f0a68ec238315e8 +403,2bce6e99fa5671b5 +404,1b3dacd30edba65f +405,b553aa8d678ab8f3 +406,b0b8ea11120c8820 +407,36f416989d21e604 +408,11d778491e455482 +409,84ae48f55db110aa +410,5dac71caa81ea25f +411,85d82483fc9ab777 +412,88725ac36bd075af +413,d04c54fd421db1f0 +414,c454d8e79a7e8c77 +415,ecc4a301920e9784 +416,7b7f097e4898b475 +417,8fb44b08eacf1ced +418,df2d32c6429d5426 +419,b574d8c03aaff16e +420,14c228a8c3e10970 +421,bc2705911891c583 +422,a89571320501f4da +423,aca90c495c1839c8 +424,a47eb533df3a8498 +425,a6272f61dc21160b +426,2246eb47fae98af7 +427,254af25b061814ce +428,e69b32a172175f39 +429,6a072e5853ba9031 +430,12366ce722c71b68 +431,b8297a8997d71acd +432,cdf6d6e6929ad2a8 +433,6b207bb925cb755f +434,3e24760846c2e54e +435,2ebc8c13567cba36 +436,2397bf75131d5857 +437,646f5967da43c1e2 +438,53f6f93b837a26e4 +439,0bb8ee531779ce92 +440,ea455e09251ef3f8 +441,e0f8a4d32f9192f4 +442,21db213e78ebfb95 +443,916463b3f7ac3bb2 +444,dff98b13fe594975 +445,fde9e4be98f5ca3b +446,adfa7ea027058b2d +447,c708cd24bfa0a5bf +448,1821605669e4a80f +449,80cee0112cb83c2a +450,c8505c3d4afb76fd +451,79274a9d7f530455 +452,738ec45486925130 +453,f266bd99210e2c27 +454,5c5f06422bb3cf69 +455,808b289307faab30 +456,8df1611c95f54bc0 +457,8c4f56139e5c3f63 +458,babfb8751eb4a99a +459,b6ce96d958c44006 +460,71aff67b62fd201d +461,9e6ba7faaedc38b6 +462,00bbeb3499a84ea4 +463,55be2b18dafd3901 +464,e08dc14ddbd62ad1 +465,632b0bd646653e7f +466,b229623c9ee5366b +467,34dad2efa1f7cacb +468,67883b818d9e59cf +469,8f6903c6ed79b1e7 +470,5f73fae41851a44f +471,853525f7cf6d83e6 +472,a5bf9391cbac42cf +473,d019a4a1658b7326 +474,1c38e7431d720307 +475,21ce26ee2fafebf0 +476,a26acbfd6b2f2dea +477,fac905955ca77ef1 +478,6ee8a8ddd3794a19 +479,6419e90698769434 +480,b78bab92d7756b64 +481,263dcf649858f98f +482,09dc412746abbf4b +483,348e3ff4a917b6b0 +484,1cdd6a735b000f39 +485,e46bdba7a25d2730 +486,4e582727ef97f810 +487,1a8d146ec1f72534 +488,06e1f7dc7e6b839d +489,0101f2ec7df97de9 +490,6401792dd97ab945 +491,34094b816b7b9f7f +492,51829a3a4bb451e6 +493,eb283222adbdfdb5 +494,6206f7697425576e +495,5f7beb20fefb6b62 +496,33410da57438aaf2 +497,542fa7a9486fa3a0 +498,5d0851252cba6356 +499,cd38149dcc4f2d03 +500,8ff0e8e11195ad82 +501,20581e0856547919 +502,cb8b15cd540fe3b8 +503,6a3fafb4402de747 +504,f9dcb14ac21fd3cd +505,29e54ee25d3eb31d +506,de83270ff89b47d4 +507,c272f4aff0ff40b7 +508,6dea145ed7813bf5 +509,56f3d62360dbbbad +510,4552f7dfec612e41 +511,7f2ca356e93571e5 +512,218da7a5e018c37f +513,961db3e43a948207 +514,b883be80c3d46486 +515,1baff6333d3ecb25 +516,0e309ecf31bd1ab8 +517,10372baa11fd7666 +518,8caacb42c1942322 +519,7565588cb475a256 +520,9c538c92b5904296 +521,e2003217dd6045da +522,a2f07a2cea03587b +523,a90771eceb6b80a2 +524,fe39e55b9489bef8 +525,b91ee5a873450129 +526,193bccdcce469306 +527,95d5d64b8b8d36c5 +528,45945c6c790f33f5 +529,a9f500fa8bd51ebe +530,663b1b5a1a2b191e +531,661cf8c31248fba6 +532,ce85bbe44a1d3335 +533,d3afee0eb719505a +534,6b73c3f976a7ae5b +535,026967ef34c4e487 +536,678e66c471ff2eff +537,0c33288ff407459f +538,480d63fbb8f2562c +539,823afeea870ce8a5 +540,b40e5e96781a626a +541,9de4e1286dd25515 +542,8fc5ea5a2eb7ee09 +543,66e086a8c2020f7c +544,c8d4f76cddb3f8a6 +545,8b11bbbd87617cfb +546,6ca5d69d45c8bee6 +547,d0ac6ff48d59d613 +548,7bfed5a77c571cdb +549,e697e44c33e506a5 +550,cb35a21304b47b91 +551,abacf57971307207 +552,be52980f17194f40 +553,ff20900024d4e4ab +554,21e42503a748d996 +555,b1500b136fe9f24b +556,dc842aa007273b25 +557,51b4879c28b8c6d7 +558,555db21fa1101cdc +559,c5307e55c11d4922 +560,e70057528a44e55b +561,3b291706a7afcac1 +562,3c7ed3ceba622e55 +563,067dd2fc5a5f1544 +564,073847c80a859fa7 +565,1a43ffc7dc0b83cf +566,503478e724e77211 +567,f07f4ad99f79c5e0 +568,b0b2a010e3b4ffff +569,aafc1904376a6386 +570,464eee6913d974de +571,0bd09f1a374d0f9e +572,1e34926250bd9822 +573,1e5fd499c3b4aedd +574,3c43afc29c631d13 +575,69663d612905b252 +576,db045b133482b68c +577,ce5fff25732a11a8 +578,2e8a7c407649c66c +579,ee67c54cfff0dd9d +580,e142c8756d932e0e +581,eec22e6c41508f29 +582,c1d453ce1e2419a4 +583,629917871a7a4a89 +584,2d8ae017fbf09693 +585,37fc7c9c78e046a5 +586,dbdb889243be06bd +587,5ac375e36ebf456b +588,fefb6ca4c324a6be +589,e1a1d80629b03c10 +590,da7ece26ba64a78a +591,c47a8304ca699b04 +592,ab831b787e22ce00 +593,1c09b8a831e3d053 +594,d354a5f66fb802a5 +595,f02fc75419d373e0 +596,aa4d29abb87ad74e +597,bbe728e0c25c1fa2 +598,09280187a447720e +599,ffd34ccf3400fbe1 +600,1261a4640ee5a196 +601,3e0ae8a59a3920ba +602,ac3d3783c166cfc0 +603,8832ff4f3f6c31c1 +604,780aa43552db52b1 +605,cc97f6fde10c145b +606,3b5f34f79675e110 +607,af6ba9c65b3c1c69 +608,54752e61210368f1 +609,8491f05c2e708c46 +610,1ee4eb7c4dc53c28 +611,438fe4b224c64274 +612,5879655db9eeeacf +613,e6915cf8ab46f554 +614,7799c7ec87846c27 +615,db9c95b0a19ebed9 +616,50fd8bcde439bb5a +617,9c76e99058476a24 +618,d4c2fc607db544f3 +619,704d9b87ba4347eb +620,79079c92f75c5345 +621,d72eeae82e82118c +622,1b496195c6e68c6c +623,87b3cdc07aa22d84 +624,fd75f8b0f08674a4 +625,ecd9c862de906839 +626,8abd376ff6b389da +627,8a39b7a6240e19ea +628,947c2915b88f2ab4 +629,b28ca246c224f900 +630,68c390f4da4fcefe +631,b812fee594f69976 +632,f3988f8b81f95fa5 +633,28b5071918b4bd67 +634,035bf907f22693ca +635,b5e16d1fc134627f +636,e2d331118a2726d5 +637,68a7fb82a1c412d5 +638,dcc216099d62a29d +639,33c92dba23313890 +640,814e46583f1b4001 +641,ec23cc6ba76ad32d +642,3e22116e90e54647 +643,bb847d333aebe445 +644,aa5a8e699f2a8d30 +645,53ce531403d643b8 +646,5dea21f768aeec64 +647,8bdb550c44886611 +648,1f82c8e229a314b8 +649,4eb5902ca2300c39 +650,fdd0f489c1731e66 +651,e27a2990d9bffbca +652,8637a434ec6c1de8 +653,79987432db3c0555 +654,5269863336495abb +655,849a9df0cd1ac9d9 +656,81c9d4c4f076db8a +657,a2e9ac9ed85a34cd +658,479652216b805b43 +659,fe0296543b60a339 +660,0894a5bdd70024ed +661,0c2a82f868a75d0e +662,ca2a998239591cb8 +663,ce1b4738229b9692 +664,c0e545be2f59e493 +665,0add3170233b75ec +666,4044776043717b29 +667,16a5d2469a0cf03f +668,02ec30ce2081f98b +669,7771f14c5d125082 +670,ea8e04dd6c3000d1 +671,09ec67a34012b066 +672,ac9997658a72e292 +673,1d25753798f8a9c5 +674,814b7f6e2a66ab8e +675,264e7e48dfec9110 +676,52b87806cccdfe33 +677,ff55649c0d6a0f84 +678,03a65fc6e822aed5 +679,894590cece816a5c +680,dce8fa3308960027 +681,b567fc0d036f7ae6 +682,8448195747ef6be2 +683,868ffd4b8129e6ca +684,8fb01954e50bdd4f +685,679c23716dde2247 +686,b70606ca4cab7795 +687,999ea6e912beaa40 +688,238420d843f16f10 +689,4d754d1610e04917 +690,a59cc66524494d39 +691,d07d9d134951b360 +692,271e161972c9ae58 +693,5704617cc4e936bd +694,ee0e29ef567f0e5c +695,f2fa2d83bc378883 +696,5417feb7b3842a07 +697,cdb76b5a8f65ee48 +698,6752a98b1e6be0ca +699,bc35c46eea89c6ab +700,a83cd658b145c2f9 +701,e0c3c2b8b7dcf362 +702,d5c0b21aee5f330b +703,552a0b6262337b23 +704,c3b1ae4fc4d4ad68 +705,1287078b85687d7c +706,544606ced6fa3767 +707,275839ae86bdbd80 +708,154020c5584eaa02 +709,b08a528067dae860 +710,a45f80d67af185b2 +711,2d3d4646dac01993 +712,5c78d89133090c97 +713,863aeccfbda5d323 +714,7bf5d5eae0614bab +715,5d41bcad930ee016 +716,245297bf6a5cadbb +717,0a5bdf6241f0508b +718,02344bdbec297a18 +719,e5f993ed1d7b8c74 +720,81d21a10ea8de6e5 +721,bd3fe9d29fc9534e +722,eaa4e786df3a7519 +723,b2737d0dbfe82c78 +724,9f8af61cfc582ea5 +725,4c9ee71b532870a7 +726,446d08a0a3ec77c8 +727,109f556a9acefac7 +728,b9da5747305e3f57 +729,b8269aac09b8ed04 +730,8e3dde4734a0d461 +731,cd5dad1842f59c39 +732,397a59f00168df51 +733,7cc8ebac20883577 +734,54313db21b3778bb +735,c12ae1ebdc04b09f +736,3349aaefff6c33ed +737,83e40f4eb1114f90 +738,455012e9d35bed9a +739,f9eea57a6037361e +740,22368dd118580c48 +741,dd8f1bf85455e24a +742,4f72eebcbf2038cf +743,73cd5edbb5877065 +744,39de995c64515ce0 +745,8015b49d73f5a877 +746,c8a5204ae6c9e05d +747,ecafbda2119f73eb +748,3c008c28ab4bb6ae +749,c696fc3a104382ec +750,b28444caed8510a6 +751,218d61e65f108e6e +752,2737e84fe46ef05a +753,8d8e8388fb18a151 +754,a3d74298932d7000 +755,a20410f34f3371e6 +756,262faa181d365007 +757,ba60f8bc3036442c +758,9717442516ac0059 +759,99d40496feb58c81 +760,8a60a42c0eaeb1d6 +761,cdeb594acfbd613c +762,9de2c7290bd29236 +763,49f05e7e108d43bd +764,996c1104f9ad2bf7 +765,cc14ca735f28c306 +766,ba45c31880129e6a +767,927dd8044b5efbb7 +768,8edc221f22c30827 +769,c9eacc0d7b1cfe79 +770,3779b894e02c1405 +771,0c8f5409812bb1a3 +772,423e2d7d14d2af50 +773,b8c231a0304e58de +774,9ca5813b49d479d1 +775,b800f7968e9dc9ec +776,b54b9dadc6139831 +777,fb32e3b86f5234ea +778,cf885e9f4a275dc7 +779,530f857f5dc1ce6b +780,2a11d415899963e6 +781,a9f078ddaae42166 +782,f896a9eee4b0cae1 +783,43138b0155be8f16 +784,4c1803c4a7580140 +785,c351eb356d184021 +786,c4aa0789f45818a2 +787,3d6b97e74972d25a +788,cde1ae88d8e166d1 +789,a487a78e1c1b29db +790,8d584fd3f0fc53ea +791,6f68c647289eee26 +792,65fc1e30b8bf9661 +793,baa39e15448db6dd +794,e6cdfe4f057ad8b2 +795,05808ba246f54865 +796,da852d375857c77c +797,1a44534e8c186f4c +798,d8740376bad70418 +799,c42cdce2d13bbf9c +800,b88322d6c4a86d0c +801,e42a0bc6d500b79b +802,0d1e6f45b4f3d5e2 +803,ecbaa9d8e539af67 +804,de750dbe58835088 +805,ac689ec73a20dce2 +806,ba0237d1f9a1736b +807,d6fdea3012c2b8a1 +808,2ce6a86bdb89f15f +809,9677d99a174fd119 +810,1de00211fea48a73 +811,7a84c14511c7a0a6 +812,b3eb964d20ffd3db +813,b1efbf2c57aee93e +814,724ec8af553e1c5b +815,02e1c649ccc284f5 +816,237f195120ad6000 +817,ac571e49e30cbc41 +818,8de0fd1ae2101b30 +819,364b2ed8d74ec4c8 +820,1276894a94e0503c +821,08381cead9c4f7e7 +822,58d2f16c7660f6c6 +823,e352e8a51e8537eb +824,6e8964f77e7439f4 +825,3678f10d0aa080fd +826,8b6bfd73b91089d4 +827,02cabbbe83b6a888 +828,8ba279e49d8079d8 +829,65112a36f2648db3 +830,442302d889fdc639 +831,0163ae781376de60 +832,dac51f7f4d209c99 +833,2f48f4c90fee7442 +834,2d475fca61c3ce1a +835,4b38b441e68ebbf8 +836,b916310276973d46 +837,04b80b5950fd0fba +838,bbbd888e5db70656 +839,bac5b81746a5ad35 +840,83befbac299fb7de +841,05a29b405952bac7 +842,7290ac4066fe136a +843,21b4507cf5f53a56 +844,c396b3571890ff65 +845,e5a893b826cea65a +846,acd3b38def3602dc +847,8dfcfd4e5b4fd565 +848,416146445912620c +849,4451c40bab339907 +850,d6b302b178ff750b +851,93218ad6089a73ba +852,3a82b68d819416b3 +853,ed90cca571d18eb3 +854,95a016a2436c8b3f +855,e3df1f022e5c05da +856,68987a83b56c8855 +857,59e892f90137bfac +858,8a78b6c4055b8e56 +859,63ccc5f39555a8da +860,a3cdcae0cac60f46 +861,e398546da1ab5ca7 +862,5977d2684751cf32 +863,16fa9d74e400e0d1 +864,729d63e969ed18ac +865,eb5de699efe561de +866,c3eb359452d07c89 +867,e8b611f08732b90c +868,78354e74784c1e54 +869,8885060167fbbbdb +870,7ca6b5c79b5373c1 +871,8560c203b0bc5289 +872,4c59dc6742033750 +873,8855872e404d75fa +874,7a0b9b8024adc8ab +875,02163f47c8222cf9 +876,4d6b0e9eaf6b3561 +877,4028813a3f35ad2f +878,937cecc574e8b9f6 +879,b1ba0004b338355b +880,36fed1c4a47fbbc3 +881,463d64848c3b0072 +882,9011a9a4fe3f549d +883,ea0ca6170e910214 +884,0a5efb0314875213 +885,e16b9c325312cea6 +886,9d34e1ade7d6f06b +887,bfe3b7819597447a +888,e8506ff29f508bee +889,5ddddd739ecf908d +890,80e174247ceefe9c +891,3ff6e13a651cc49c +892,e009e7bb12fb6e82 +893,0a8210f71c721cfd +894,9dba38d3c8c34aa1 +895,4cf8f32b6ae5dd85 +896,ad8ae1ebce7db334 +897,e92c2219d5b2b411 +898,9ee966522695748c +899,e54eb09bc6657290 +900,48d56c73f6adb3f5 +901,0d0dadc6926a932b +902,caffb049855f00b1 +903,7d62e32a1a0d16d6 +904,f93841b5c9df2361 +905,130cc58492924551 +906,54181565b482721f +907,770f487d218e0310 +908,4715b3a5969407a6 +909,3c478580aaa09397 +910,34fab57632cb8ce1 +911,a42e4f2a3c2df0c5 +912,6fc90eb06a9f22e7 +913,6b12c7d001f8377c +914,463dd713aca0a51e +915,0b1b4bccfde22e75 +916,cc528bf43d544325 +917,67e4975b051eeb2d +918,375204c2b16e2611 +919,d1a947a82c238da6 +920,c65a8953c6f719f5 +921,eebd909d46065241 +922,c12741922e72c6cd +923,e9bbb62dd4cac966 +924,9d73acd05a172b94 +925,6c8648a9d6ee5f6d +926,62be173d17c3dcb8 +927,31a173cf44aa4f94 +928,e9eb7554cec88347 +929,924d70774746fe74 +930,7c2a4fadc61c2021 +931,a48e3f3b57b5e150 +932,0dd35d4ea111c983 +933,893bc6c193a63ffe +934,90383d82060f8ba1 +935,5a924daf38a46e76 +936,f76c364e38e8a17c +937,fa076f7dccaa0d57 +938,4935d082aeb9a663 +939,79c3f470549495f0 +940,7f811eb7626027fe +941,f2676feb201c10f7 +942,b850f904d845b03b +943,9d32e9ed962b268d +944,b8233abb0811fd30 +945,6e43292c2ab55312 +946,c51226b22f27fbed +947,ed5157a48f74dec1 +948,6300db283d11ce03 +949,79960dd20e517d24 +950,3f0dd8a2d1fcc1fd +951,ddc76d1d4cc1479c +952,bedf0a7c1fbf9da4 +953,86f5fa35a0b7549d +954,964bf247e30d8fe4 +955,5100ed833c330239 +956,26d9e516a0e36997 +957,6e20760908a1809c +958,f39a8aad5c64d737 +959,3e1da1241cbe7580 +960,2a81bf3df05f2ba8 +961,1690a0e1b2e3bfca +962,bd1e76419e115fa3 +963,134df78252ceb283 +964,9acd45011193230a +965,78f2e99be4ce347a +966,3c4d0a98a46ec656 +967,084ce3854291933c +968,851d34e93e6fec0b +969,9baebf78265c8baf +970,bbcfc21447bd1a47 +971,83b0f9f012460e44 +972,9f00782d041107c7 +973,f64e4cc464ab10b8 +974,3cf11f63bdd517ac +975,f586977984691334 +976,b1d357f07ebebf7a +977,267c3629b5666809 +978,7c9e99d48264aac3 +979,ff111339388bcb0e +980,fc956d8bf7740e58 +981,61cee794caf2a9e7 +982,b0eb64a4d90bd64f +983,abe568e80732fba5 +984,d3c681f45605d59c +985,e2b2a08469652c56 +986,a6f2e7c7daeb4fac +987,b5b66d7f067f7623 +988,455b6f2561801031 +989,b1f12358dc34148f +990,0cdf3193d20324e0 +991,17a59c64fb32319a +992,22f0831705f613c2 +993,0ac25a5f7cd54820 +994,18866f52cd67816d +995,089bed9eb60893bf +996,0870ddc128c8ecd3 +997,e792d591b4978ecc +998,d53fe06185af2f60 +999,44e7c42c924268ea +1000,9e6bc944162b8d17 +1001,c5d7cb06b1a07c65 +1002,0f689c5cf391aa5b +1003,1ccc90f0e487cd64 +1004,5ce809e973c1e910 +1005,21a3ba56855c7c67 +1006,daf8998fac5d2d1e +1007,a2d91dfccd91d347 +1008,ad9e3ac6416e0536 +1009,67860798a18bcb75 +1010,4a94c48533ed1ece +1011,f6c5e9f5089463e6 +1012,6b0dab746836cf72 +1013,ec5509aed9d75ad3 +1014,eeed4fe695da9cd3 +1015,07d72208594809db +1016,4ec528b5ef24a5c3 +1017,eba1570d1dd84940 +1018,724e33aa5097617e +1019,03425249c07143da +1020,13a7a497404e1b04 +1021,376ab9fa01c2a125 +1022,f16b5b177890e33a +1023,2cd035593114f1b5 +1024,4e5a3638fc59c244 +1025,0b33fefe2401629b +1026,acc5e389d7c530da +1027,f84d7b98351c78ce +1028,dbc8b65e0a778bde +1029,7ec83dab72821f97 +1030,a4dca8d08c160a0e +1031,ebf34921ca10eb59 +1032,e0685c9179d4660b +1033,e9b1a92fac547855 +1034,55bc7daacf80c1a3 +1035,f506bee22621e822 +1036,12bd249bc34f5e89 +1037,9c15e58001523931 +1038,0f9c077311620e5a +1039,79967c65226bd1f4 +1040,aa4f09f441bd378a +1041,dd4aacbef7199f89 +1042,4e559da2f4639859 +1043,5b93c081cb976aa0 +1044,d6be2675c07de7e2 +1045,454f9c7afc4035a2 +1046,8bf3ffc7573ae25f +1047,2fa366975a98a0f8 +1048,1a8737d86d770fbc +1049,bb0dfbc049f2d332 +1050,7bb8032ee9241a10 +1051,f7cfc3134d43bd42 +1052,87688ac179808dc3 +1053,a7d2a07e2ff644ab +1054,703c45851307d42d +1055,e8714c7fac2b690c +1056,5a511e18ff5fde05 +1057,87cb640ff53201d1 +1058,1c77d8cc5d71b8c7 +1059,170c5af03b19162a +1060,94bc6b0849898fe2 +1061,1a5588741c02bbe0 +1062,99d69deb73d18e07 +1063,eb6f2ea98fc732d6 +1064,ad3b089369a6327d +1065,4943af35b6498eec +1066,def054460cf89a7a +1067,59fd24fb7ec15bab +1068,87eb69495aebf4cf +1069,bdcc5c9f0d10fd45 +1070,9649413f0bfe5797 +1071,8891524258b6dfb0 +1072,f9485438bf596c00 +1073,fd69ab15ecab69df +1074,14ab4885dbbb5521 +1075,fa637bc6328ca789 +1076,75b28d30cc4d6936 +1077,809877a6ecd047d3 +1078,6f3975bb2f1c99e5 +1079,29507c5bab49528b +1080,c3e2fe9d75d93816 +1081,72b90b37ecd703e7 +1082,842879c4b073408b +1083,9f4cd65275a973f0 +1084,47fb23bdcf66f948 +1085,a47bfaf1ab303faa +1086,ee08505d7e25c954 +1087,8821ed7a834cef86 +1088,673a2a981a15e647 +1089,46548aa9852ae43d +1090,07c16930629f8223 +1091,57866b6927bd8e43 +1092,3ef8a5f883660ac3 +1093,f71eddf8c46e063f +1094,15fed519387b65d4 +1095,ffc87ea3adffcce4 +1096,7ebdf35e62e9c248 +1097,cc30972491a20d85 +1098,729a27fe43744b75 +1099,3535fdfd6ca2deb3 +1100,3f33e9910fcc6d03 +1101,38441cf31c1e75d8 +1102,50ed0153dd6409f4 +1103,6749cd546f8cd496 +1104,98f58be7c13d7319 +1105,8ad8b6e9df458ed3 +1106,f83695515048ab84 +1107,fa3fa19de21e42bd +1108,b9b7581e4a37f90a +1109,d6744bb6f02a4769 +1110,65d152503bba6bf9 +1111,a5e4d9c03776d139 +1112,df29d1c2f27c7465 +1113,0851f4ef253f57de +1114,c8ef4833ae512347 +1115,73efe0b2604e7c2f +1116,5ad744f4704d103a +1117,9a3206a6fdf2c6f2 +1118,b5746a4a9b94769a +1119,97c0bed3ab55143d +1120,6d95a44e063db5ca +1121,be3ad94c3a44b842 +1122,cb78cebbfea24b0f +1123,071eb029431f7acb +1124,9a47dae8df3a7380 +1125,a8ee6ac1059b69de +1126,9676d63551351f9f +1127,eef0a5ff80be73d9 +1128,0c17abb9b473d624 +1129,b8bcdadc3c81c682 +1130,dac87b903256b1b0 +1131,9c5df3b675073b5c +1132,ce2a5b4d52874cb3 +1133,42f3e6613981d500 +1134,cdf94d48f40831ba +1135,84cff5f75a1a1a85 +1136,ce0a370368ce7ca4 +1137,e652387a3b5c6570 +1138,d037c895c8d72c78 +1139,20775f28b311670c +1140,2ed5b4357e132162 +1141,92c7fcb1ff235229 +1142,0e40a82dd8293bd0 +1143,7a55181dd288c853 +1144,f010807490d0bf2f +1145,d85e262847a7edee +1146,9251fac561427dac +1147,2729167b194eea82 +1148,87936c11d01060a6 +1149,22898e1374f2be3c +1150,4d0a05259cb30224 +1151,c25019d07df5d3f1 +1152,d3a6ea593e828b53 +1153,5862b74c003c7693 +1154,f49e5bc5beea828e +1155,7bbb49f60ed89f0c +1156,dfa2d56552f552a6 +1157,a8a7adc710507577 +1158,d4af84f23ada2a51 +1159,48e90389ade7d49b +1160,b015eae38033df00 +1161,6463ae8afb2089e6 +1162,b09697aa87e89d4f +1163,d6e7f5ab1b3194e0 +1164,d4e1827ad4836045 +1165,b189ed0917a9bd4a +1166,459c9f801a32740f +1167,6aaec4fe0762b8a3 +1168,2c0db85e816d78ba +1169,6288e250376827e8 +1170,cfb13d338747d845 +1171,bbd68edd02a6ed20 +1172,8571e232db778b5c +1173,57b7f5387526c004 +1174,04a5d5e5f6d4525b +1175,ccf3d75669728dcb +1176,d7a3c1264fe10678 +1177,fb4cd33db9827c12 +1178,f39e98a17921e338 +1179,efdd19b6f76ea3c9 +1180,c07cb10ae0560a74 +1181,54880d3107f3adc7 +1182,d2b34261a7cb42d6 +1183,d80c3036762c79c5 +1184,bcb5b87638d06010 +1185,3f22f60b5927e0ff +1186,bb6f4f14e8f23837 +1187,8a6ea2d8134b9d1e +1188,50e63116ddc26a87 +1189,78f2e4dd76c1598f +1190,dbb45dab184aa68e +1191,d8e71c2534f30411 +1192,2e6cd3e5f31635df +1193,f8bd3add66b9d391 +1194,ee95fa5069b267c6 +1195,f3634fffe3d049a4 +1196,446ebd4d0d4115d8 +1197,43289a2024a981a0 +1198,55b265e17e44c1ba +1199,580d01fb984d0c6a +1200,9842886d509345dd +1201,edf6ac787f360ee9 +1202,422ef09df63494a6 +1203,c290520faf830966 +1204,abb2793fd557c151 +1205,275ccd88ee1eff41 +1206,f2550149919b0d5c +1207,5013c08f53a9b233 +1208,23df41af933b42e0 +1209,e0c2157b131b393f +1210,9d53f401bc176ae4 +1211,2be763838585e898 +1212,b6285934465314fb +1213,95b86c1ccf8a0592 +1214,3fee3b0f675e7009 +1215,8255b5b4ec6d0a16 +1216,44cdd67ace3a1a4e +1217,029dfcd989dd7daf +1218,cfc6a6426c56beb6 +1219,c7c9253d935c1b53 +1220,d3f28489f831bd69 +1221,31640202da5b10e8 +1222,313c07f02b6cc4e4 +1223,71e19ddc35c4b2c0 +1224,d1ef9477eb4e251a +1225,6a76a0ee79a82694 +1226,446ed51ee484039f +1227,41c64d2ca3f9e07a +1228,7cd00bc9185632c5 +1229,dcf9d260d4d3e6fd +1230,26d937bcc58395fb +1231,d5b48df514574c4a +1232,9520ac369c86b637 +1233,efc2427b0d749f36 +1234,290490249511bf76 +1235,743c23834e13e09f +1236,5c55526041527b02 +1237,29e63c41120c7b4c +1238,91e97f598aad126b +1239,589c6c6c64ae5350 +1240,2f895b7096fd0c08 +1241,3a9155a63f27ab49 +1242,8ad4e85e4aff276d +1243,04a8f2e839b53e6e +1244,34991a4fefb805af +1245,8c55d6c6392df617 +1246,8135c23954f00ca3 +1247,e7b3de2e90995fc2 +1248,b6abf9a104b4b56c +1249,0d3188d5b7098f93 +1250,28fb0036d312b23d +1251,a493a61b2af5bca1 +1252,0db961d7a669b03a +1253,f1ca81eabbbd3063 +1254,99d6c80b7e3a2110 +1255,d7029be4f07c737d +1256,9ccb9fae6ad7b036 +1257,8d05f288078ac8fb +1258,c010a3bb5303a367 +1259,72f1aa685840aa35 +1260,cb1cf87cb39c2756 +1261,14b16d65d9bef1ff +1262,8950e324f2053e0e +1263,171e470af8e6a52d +1264,69d813614f36ed59 +1265,5888795343435be3 +1266,4636e3af530ce1b7 +1267,e91204f3072e59d0 +1268,6973b3f68673ba01 +1269,0c22d0406c497286 +1270,83eb71e481466a7d +1271,a14e1e341d46f33b +1272,2fa4758f8624af22 +1273,104978d0c56fa87a +1274,5781d744bfd6e087 +1275,87741b9f28ccd4ca +1276,755ff5406e4058a8 +1277,19f2d908302d5ddc +1278,9b12d26a4c087a94 +1279,e21ec430e8b57dd2 +1280,e21deedec6a6cfc9 +1281,136e4f22e2715eb4 +1282,7bb8dc3879006cff +1283,6d0a257363a4a472 +1284,d9a41b22192f8c89 +1285,b8ba9f58b7da7d59 +1286,ea9e14dbfdba0177 +1287,005787eeab7c28c1 +1288,7d5fdda0faa1de10 +1289,7447d2876e959bee +1290,4fe8bbc759a0087b +1291,26718a5aa4776d84 +1292,6c6933b0a62fcefa +1293,2ef9edd49ee7be4b +1294,cb8af5d93b999cd9 +1295,f7ae79ba36c15484 +1296,4b3e7f220d0e0b3b +1297,03a84efea5675a59 +1298,de9a9d7b21040bc8 +1299,b0e017c8e9fdfbfe +1300,fa4bed9336616249 +1301,ddbc7a7af46d647c +1302,dc8819998377bd72 +1303,5a2a7ad3013d7368 +1304,9c911b3838a624ad +1305,bc24a60bfbad2cf0 +1306,2398de359896ba87 +1307,4c1e6884ddf0878a +1308,85353cf5541af907 +1309,81a8ddf5bb431cda +1310,e8ec21f256cc2288 +1311,dce93da8d5831ea9 +1312,350eb3145f3b007d +1313,f4f0bf3542aeb357 +1314,63ae0bbbf8200ee8 +1315,fa6a0d7d54023fb9 +1316,8ad112ae7760e82a +1317,56b9382047e9914b +1318,545947e06efa5d20 +1319,f54c6ec6d2464a1d +1320,db0d9bb91cbada77 +1321,db56b1742d18eeec +1322,6635494ebd86a87f +1323,4b0a34e49079579a +1324,46a8302c34568009 +1325,b0827aa13b55166f +1326,a848db03b6740735 +1327,e8a35081c89eb273 +1328,6902a1fb7019d22b +1329,020528e991eae911 +1330,517a2b3e6ba19acf +1331,95379afe12146244 +1332,871e8a80d812d792 +1333,c75adb343ddb8fad +1334,dcf5a5ed302a2966 +1335,a5ffce6325cb918d +1336,ca55ada1cdfbe7ee +1337,55f52206126caf33 +1338,170d9f96ec8f0263 +1339,52eabe089cc83596 +1340,31376a660e879516 +1341,8d911a027ff4f31a +1342,54f10e9fd91d545c +1343,c813b5f7be127ae5 +1344,c3fcde773e85232a +1345,a1e7e3a8e039be1f +1346,f2344fa25d5f215d +1347,4f2c1251cda8b016 +1348,794fa681ac9b0c80 +1349,01d433802db8a0d8 +1350,ee4f810666b15ecf +1351,5db4d229b98b2825 +1352,f79b35f6221f9c41 +1353,befe6047552e7342 +1354,5f5ac332b55caa48 +1355,22979c9b9fccc55d +1356,fbbe044e58453459 +1357,f50919845ebed6d3 +1358,df7ab72f68ea5c65 +1359,d9663cf4817eff00 +1360,dbe5e7b5d7b57782 +1361,cd90db32f211161c +1362,f069fb65533f3f55 +1363,59ba5d99cc182e55 +1364,6d2e82602982d8d2 +1365,63ca6481c34165d6 +1366,13060fcaa3ae992c +1367,26a51f8b9b0906ce +1368,d7d0696f0994bef0 +1369,9081788c5b59b44d +1370,938009b4dd9fe04b +1371,9ce3fca8d1943a3c +1372,cd8dd66eef7c25bd +1373,7665749bc8df84ca +1374,84197439eec83c92 +1375,7714a0b0b6774b1e +1376,a5510f93ec57f6dc +1377,f2aafbd1b1093f5b +1378,040c59522362e9ad +1379,80a3e65000fafec5 +1380,7825d623905651f4 +1381,5a271a0e8f883cc1 +1382,8f91baf5bd9cc47c +1383,61998388aee152e3 +1384,7ff7c816ac38fee1 +1385,635040f71d21d672 +1386,7c8c805ff63d3885 +1387,954afa066f8bbc21 +1388,f505d58b6ac185f5 +1389,75681c64da785254 +1390,36d204d9a7343fd7 +1391,824d0af5177d7cec +1392,063f068ffd0f53b1 +1393,a9d54db75efa89f1 +1394,cfaa258360c9d650 +1395,66149f1df9c44175 +1396,3f30eec83ef8eec4 +1397,5c532d1c0a229668 +1398,1fe2ef04d137ed41 +1399,3bb14b8ca026b8fa +1400,2d2e75adcf3a9637 +1401,6d1d3a7a42a34bd1 +1402,af7307e4e78d1c61 +1403,5d5528ba14473112 +1404,3efa5866bba2b8c1 +1405,4010668e4837c307 +1406,105031c4ce58082c +1407,28652126744c0abd +1408,ad8068b6122b05a5 +1409,98bf41a48690e272 +1410,94d7a6d74ba80bb9 +1411,03819d62503d41ea +1412,b8f4397cb218166a +1413,54311ae0c28b55a2 +1414,62795e0df4635601 +1415,e6de212e4905aad7 +1416,6753f0123e91cb10 +1417,96ab91238bd40ac3 +1418,7f1de817d517be6d +1419,ad3aff3d9688958a +1420,564f67eb414b1425 +1421,a438c46fce193473 +1422,c8412b0fd59cb173 +1423,f2bb30cd70d02786 +1424,0900e54908124581 +1425,7bf7db445470f987 +1426,d79c74395e9c9089 +1427,303a71b5a3c0b247 +1428,33e20290d5fb9598 +1429,eb5a911e02675c47 +1430,d94d1e5279282e4a +1431,1f905bfefc3fc029 +1432,0951df4e6f52889d +1433,1d807c0de4e82cf2 +1434,afc00c2d9dfe3ae3 +1435,5c4d0ddd96d3bea4 +1436,241a0c05af7482e7 +1437,0fce040a3edc6243 +1438,a2bd37709e265490 +1439,3597d5a23d452219 +1440,68e7768af7ac038b +1441,851245be79f906d6 +1442,576725a84c304107 +1443,f4834317048bda2d +1444,bedbf0c2e854a583 +1445,2d3239f288fc7ef3 +1446,f6e438d8dce1ffcd +1447,aea3396b559d963b +1448,605d81799a34885b +1449,95400fbd5e326b6a +1450,61742efc01bf1345 +1451,32b25cf7a2ea3acc +1452,2bcdcd1374ee7674 +1453,d9de003dda29de7e +1454,1b999e3d60fcf207 +1455,0f9681ef36bfe795 +1456,76d292f112a6cda0 +1457,8ff313343d417281 +1458,0acce363665fe99f +1459,9743149be0ba6804 +1460,632baddac8f26521 +1461,061a31e11eb96c7a +1462,febee73425b1a201 +1463,99c40624c6ef2025 +1464,d27e0e2e2a062a32 +1465,f921c6ccb8c9ab35 +1466,8ff9446b2279cb9c +1467,a82949106bd58bb7 +1468,3d1b94f4c7cb7657 +1469,eb11eb9bbcb290f2 +1470,d9538e203efc7749 +1471,00b4ae6a1bd5859e +1472,9f10ad66ccb82b97 +1473,6e9fc04a740fac9e +1474,fe3e2728a709664f +1475,5863f206977eabb4 +1476,20162479dc2a04dd +1477,2d309dbe5d0483f7 +1478,9eda7e7c345de73e +1479,d8a34df64d7402a2 +1480,4e3588ddbaa51c71 +1481,dab825e2a443e9c2 +1482,f5bf6f8939e4b11e +1483,c3f252ab9eae7925 +1484,5452e1362ca53498 +1485,0370928c30eb15b9 +1486,eedbb2b9731c9af4 +1487,6338598c1a983480 +1488,3ad40446978c9aa1 +1489,eae5685f1c9db95c +1490,82e7af65a8d35342 +1491,097609c88904743d +1492,e4f537643ffc82ef +1493,373c8b4ec2c5eedf +1494,849c635a3f7e2498 +1495,d5db1cd16423ab65 +1496,7cbd4cfbf3b009ab +1497,084dd43c4c76b574 +1498,c26579eed4831efd +1499,49e538c74ba61bf0 +1500,1031d7d882441ba7 +1501,039c0a64cdbd50c5 +1502,cca2b813022408ec +1503,bf2af8dd371b5fef +1504,bd3404ccf717a26f +1505,7e1612f335cdaaf8 +1506,8f7e4cf2789d410a +1507,c7b433b20262acf1 +1508,ca9fe0e88470260b +1509,7cef3eaa17a8ad66 +1510,3859ad04318e053a +1511,6d47dea2fbf9c047 +1512,27b158377109d856 +1513,96afa3fa3d22d281 +1514,bf01c74d69f82be6 +1515,ee7c0c122f511ccf +1516,9e94ea84abf7d9cd +1517,3fbe3b42f59b668b +1518,ded530575f7b2f3b +1519,4f78bf6528f382be +1520,be4514800bffdb59 +1521,5c8c73c1bbdc3f4e +1522,0e465952faec37c0 +1523,3f5c5385933c1729 +1524,ba81fa81d231c3fd +1525,6cde3802f91e208f +1526,f2f061eb9c28bde3 +1527,81c7ae8b146707ec +1528,3b7ac95aca87f7f5 +1529,0d9ad577d2a73119 +1530,d9373de742f5c8f1 +1531,5e725800f6144e2c +1532,62b41840ae2e6d00 +1533,bc778d86c7e2b843 +1534,b83d7101c27dd505 +1535,7bbf19f9a90ae465 +1536,625d0dc2003c1fed +1537,1de460a1310a3950 +1538,52bc337c3f11828c +1539,21901f1ef98a276c +1540,3315c1c034dcb376 +1541,21adbdd1a1d91711 +1542,f1cb728205de83c8 +1543,1992230b2aa55392 +1544,3c62a3946a9eb604 +1545,cf019136855b07b4 +1546,ef12be4e351ee89f +1547,d46553adf47dc86d +1548,b2e82143fcda2fd2 +1549,f692f047a546c5ea +1550,f30d027b5f9916b5 +1551,461747f0dc5991c9 +1552,e9f63399e4807b3f +1553,2a8ed5355d755dea +1554,e631a58f55488209 +1555,00c8c12696ce44f5 +1556,2b73aea7cc2ee554 +1557,d9adc441ad5951b8 +1558,797dcf09d993f747 +1559,06865eb0d4c4bf3b +1560,a9e4087b60ca09c4 +1561,7c729c6bcebf73c7 +1562,b71af8a6c2fe3bda +1563,f8d39d439b8666d7 +1564,d7d80d6564999373 +1565,eeb83c2a1a14fe26 +1566,4bf97d2242186dd9 +1567,83286ca1d348dd14 +1568,a1a30b759d4c80d1 +1569,4d17dcd15fb1e21c +1570,ea4adeb5a90a1d4a +1571,bf5129b12a5ba032 +1572,2d20d57572801029 +1573,5320423b20e7da50 +1574,07f19e634c02f0f5 +1575,a71c213dce720fef +1576,468d6beb74c14501 +1577,16958b2379264426 +1578,51859f2901202fc5 +1579,9cffe569c71665f1 +1580,a15a9aa0f2142cd0 +1581,c214981cdd4b55d7 +1582,0ee81e57f7153e36 +1583,1b1230059941ab62 +1584,da91296ba9a51de6 +1585,42faf6095546cd79 +1586,a45793acf462a428 +1587,a9fb4d565c889909 +1588,e155f64ec0b069d4 +1589,6aee942603b8e68f +1590,32e047a093cf3690 +1591,6156eb2ea110756b +1592,6982da80b9a1a81d +1593,24c9c1a23872f387 +1594,3ee033dc14713dee +1595,72b1aa9312db1d89 +1596,86de550a821005eb +1597,937855f6a93d44a7 +1598,57f83a401658729f +1599,29b3678bf079eeef +1600,3b0cde63ab13de56 +1601,e9a112a3f904859e +1602,3f913502e7acbc5d +1603,856ca28ac53edbf2 +1604,663ef61e6e42ced4 +1605,3c58aff2e7e747b4 +1606,51f52a049b7a5668 +1607,552533677436491a +1608,c3f579168c2657f3 +1609,ff1ac3d69d93fd82 +1610,8e413f36a8e356b2 +1611,bb6b0c51ada9dcde +1612,abc123c635d34595 +1613,58670deb46516064 +1614,fcf4d5074c8ad61b +1615,43fe2e61f5af09e1 +1616,0742e15935525a4d +1617,e71b521d496b48da +1618,a195b4b3069cb087 +1619,3e45369ef2d01ee8 +1620,895ecb37fb821da9 +1621,b950395acaa2b318 +1622,9b15771765220dc7 +1623,b1d3cddaddab5ede +1624,aa7ed31d030962a5 +1625,3477458c826781f2 +1626,bd3f3b41014a37c1 +1627,60a145cb42541e91 +1628,402ab15a751e38b7 +1629,20f10601c2436b0f +1630,64f1c8e927f7b392 +1631,a725b036088a7770 +1632,aaea7f3bddf94f9e +1633,8142f6a96d13658a +1634,24d6d127ee54d32a +1635,13e7f5842029b7d9 +1636,0521176a2b1c26b7 +1637,c10137148c97d1ce +1638,fd0c45cb36528792 +1639,3b4a63dde8900fd5 +1640,5de257bb27883216 +1641,c8b6ded4edaca7c2 +1642,462ac5f7e54da4f9 +1643,1849ac7a23a44d9f +1644,629dfca187d66b4e +1645,70a76274ae3ccafb +1646,22ec11b8b8d9ee2f +1647,3db894929eaeb28e +1648,62db69c4171d675c +1649,06254761cb5b5ef1 +1650,69e801e9552bccc2 +1651,36c164e690f67db6 +1652,9e0018b1551a2f00 +1653,21009752b932572d +1654,595ff4918c21547b +1655,693070c180df2134 +1656,fb15bd4c53b7da3e +1657,5dc0eec034174b1a +1658,98fbc1d311f161cd +1659,a05f1503d2766524 +1660,e1e5645569a70253 +1661,08f7129285b3e071 +1662,529d523086cb06f6 +1663,38c5d5ed1bf49050 +1664,6412d5f6b0db0a1b +1665,d540dfcc00336295 +1666,c546106ced064b02 +1667,2bab046a5c777bb5 +1668,1cbbc63813564389 +1669,4b3b10161ca193fa +1670,d981b3946a66208b +1671,19ff945a74b99bee +1672,356278dc75aa30de +1673,885c4d54ecfa4f78 +1674,3abac705b4c11f43 +1675,6e46fc57df24ba4f +1676,4217cba0fba6650a +1677,ee0b0cd884e67428 +1678,eff5cd6683affbd6 +1679,0eeda31cffec5c71 +1680,088124383888a3f3 +1681,210735c5b73c0ae1 +1682,fad437a15493948d +1683,34f3a42ed74b7d4e +1684,421ffc12e795155f +1685,7409ddd854a90aaf +1686,5e4027d9d13dd23f +1687,30a41fed0d82430e +1688,7ecbbdb1ff46ba55 +1689,d9882f799731978b +1690,f721c11ac2c470f4 +1691,fd8f6508a877f73e +1692,4a3f93c56b7a72b4 +1693,ff3c9865d1df8ff8 +1694,6a5329b933750f58 +1695,e80bce42f36a2688 +1696,22ef33a5092d441e +1697,d4b677d6ec8abfc4 +1698,92b3ca6262d7352a +1699,4202e4b4de6ed712 +1700,e5b96fc57e0cc2b5 +1701,69f2650f0f319c0e +1702,0dadd3e403f772cc +1703,aefe142eb1eeb0e0 +1704,a3954f48aa2fbae5 +1705,52d548b113a1433b +1706,44a8310672841009 +1707,a7113ccf690dfbeb +1708,d9eab9bef6bd7200 +1709,8088a093df834ee8 +1710,6f73ff646ee30aca +1711,bb3b9de6097f7758 +1712,6bfb4b9cfa72c6ed +1713,b70db1a9acc500e1 +1714,a63cd4dc5ead9ae4 +1715,b771b20cfb27c92f +1716,c7bed5c2a0d929fa +1717,b6081dd692c709a6 +1718,60ba243a8f7bfa64 +1719,9e881e25ee8de50a +1720,48ebbfe0a8af2d49 +1721,c35c298cc1932763 +1722,3fd272b8e72b0e9b +1723,d8753c3a5b743a44 +1724,7b45d01eb8a7b61e +1725,9d96635a92fdeb36 +1726,6ac6eebc6ca8f4eb +1727,a0e9ba47de5c0b60 +1728,9eba57e483846b5c +1729,0c56ea92a2fc0bce +1730,20c402ca6d4b208a +1731,f80e6ad1be2d79ca +1732,4ce3299453f3e40e +1733,e1df67f37e72a2b8 +1734,dcb2268ed0fbabb8 +1735,d7396b6a5eb4e4fb +1736,dd9cd90b5a28358b +1737,92ecce436478c82a +1738,51cb40995ea9e123 +1739,0375be974e4357b1 +1740,2c5a13bc3d1159dd +1741,028d7992ead89fff +1742,a670c1a37a721592 +1743,af2a5cb99c9672be +1744,41d3c571b700c7d8 +1745,055e37ce59fdf9a4 +1746,ee5ce46f41d1369e +1747,a985bd756f0f31a4 +1748,3eada1a48fa1c382 +1749,52e29e99daf4c83d +1750,16b03aa306858c2a +1751,c3427d6f8523db1f +1752,c0d7f73d194798b8 +1753,17eb276a2ae7c577 +1754,09ecf2d679073aff +1755,19b55b8f703bb767 +1756,45205224e53fbfe9 +1757,3b5996a823220a2a +1758,a730ae34aefa2062 +1759,8f344f4ce4483b4c +1760,49bd68deff04eb41 +1761,7da18964e288d352 +1762,4ff00f8e30ad5bbe +1763,e6a4a11b116838b2 +1764,3d3e1585f71248b6 +1765,3e3449d861817422 +1766,8d5880550040d252 +1767,6c8d6ae3e6a4183d +1768,87dea15f1350d70f +1769,e39fe85c87f0bdfe +1770,da2cbeb1bfcbe176 +1771,10b4bac6043d1d10 +1772,090812226dc209da +1773,349bd1f17a31c2b6 +1774,704a2535db23dbb5 +1775,2fc8aaffddfdd101 +1776,8f88bd65bd5d69f2 +1777,051782a1740411ae +1778,30efc4f44888bba6 +1779,811de9e3a9e71925 +1780,ab61cbb6271a4f51 +1781,b160eb461b13962f +1782,8048fe0f39fa5f5f +1783,99ad33489945b5eb +1784,20b1b44b28f537e6 +1785,017e04237ff77227 +1786,2ab2f4483db1ed32 +1787,3ade24f8f6cc9372 +1788,fe0ae99dd99b963c +1789,74b40c67c0b5efa0 +1790,0bc851a625578ba4 +1791,3db7a59ffd7f4966 +1792,76fac8a33f4bf3f7 +1793,bb257c27d4ad408e +1794,7d45a70bae0ba4ea +1795,41956c45c4172723 +1796,42622a0e195f1f23 +1797,61d2cf5c1b91493a +1798,76f44bb4f53fb19f +1799,1ead525681a69595 +1800,4af5ecac0f468eff +1801,f8029a54397a4738 +1802,1c25b92f0bab78f9 +1803,28b2e1dd1a80fcd3 +1804,4f4f57da65274f3e +1805,a53ddc14aa3bc8ec +1806,3f8fefc1a4bac3d9 +1807,f505f5cec7e77007 +1808,f91e7fc2f418091b +1809,fd99f363ae4d4628 +1810,826292f3a413d614 +1811,3002da3892fd2109 +1812,a75e21a4a7c560e9 +1813,0c2bc0e109335fd1 +1814,c6a0d43f3d1c2404 +1815,ac1371c15836bb3a +1816,1af53010c9224db9 +1817,8f00d2c16f4bc5a1 +1818,ef38971f04a98268 +1819,223d791d4df55d7d +1820,0d2bd4472ae9c688 +1821,440d9692993df7a4 +1822,d773eb4d1fe8cede +1823,c6ad4e08af5e638b +1824,74bdd13ed3f8b978 +1825,29d60d3d44caca88 +1826,7641790582ffb2be +1827,361c47112d8396d9 +1828,98aa790be1d824fb +1829,6c8b66c4fa039718 +1830,cb8ffd5bac2ec395 +1831,80642e6f2f2f0eb4 +1832,245a6ae5c5280f3e +1833,f9f3c4a5933f67cb +1834,82187577ba047026 +1835,fa230ec26947adb0 +1836,089da104e209141d +1837,d17153b747d207dc +1838,ed74205de5f62847 +1839,63700e1b809d762e +1840,081d0c6bcb84a0d6 +1841,3014dfbbfbd20205 +1842,f376d8f94a8d7323 +1843,05506880ac7f34ed +1844,afeb9ca3a9b92233 +1845,6fa83be7839e6068 +1846,d9637365885936c1 +1847,e0dcc87b9b76f542 +1848,d07b1fc55e7016d8 +1849,a0723ed341f01da9 +1850,635181feac88f1dc +1851,3e8066a6fd76f6af +1852,df1292750d010716 +1853,738460999ba0493d +1854,b344e336bdd1d0ba +1855,17dc3da7af665e4e +1856,7190f733d9c5ff57 +1857,863af6144badc24e +1858,a610635b52123336 +1859,a3fae2e30d19430d +1860,df5a9f659eb92afe +1861,9a9faea370e5947d +1862,eeb1b100e27f7fe9 +1863,6bfa285cb1005d1d +1864,00dad18332112e94 +1865,ed80b63bc08fde9b +1866,3452e31b144e79c7 +1867,f3960cdf6d003011 +1868,dbdef53fadf8e4a8 +1869,f99f2adcd9e0b6c9 +1870,0da9d125e5dda9fe +1871,14f5011aa4fead63 +1872,a6413e738ce44852 +1873,697ad2ac23a3c7f2 +1874,015d0e8edb27d255 +1875,0153980fdec39088 +1876,d8d91bc93b40869c +1877,6a865fc802c5e1ad +1878,8cfe44b17595b669 +1879,680b3f32bfbefe37 +1880,a8b5f4ba92f2b5cd +1881,ca2f558c091cd635 +1882,bc6b03d7b8b357f6 +1883,706f0115a13f1b81 +1884,06ed830c73f00069 +1885,7fafb1603a5cd78d +1886,0dccc11bdb4201d1 +1887,8ed37799afe2a69d +1888,a1cbd56dcdd2a2eb +1889,87f29838afb66f6d +1890,1c541e7cd5ffed79 +1891,c9e6cfd5ef7ae234 +1892,bd6a3e579955fabd +1893,113a0bc5e1182499 +1894,c2e12ecc5290f1f4 +1895,e741cbd437589739 +1896,1c43c4ff5f3e6d58 +1897,40a84c21fd868a47 +1898,4f0418c2ab7e89a2 +1899,48aabe934bbd7e55 +1900,bf1cdf9dd19be4c3 +1901,14066f903494264f +1902,127e73765347e4ff +1903,71c4217565a55a7a +1904,18aeb501c303d29c +1905,b024aa26acba9034 +1906,1d61476694ced78f +1907,60642a700f14f3bb +1908,7c64ba52b0ab9f89 +1909,35683472ca1cf1d5 +1910,231ad841b1ae0655 +1911,86393e1eb819c08e +1912,b79e52409f0ecb94 +1913,6d8e152dc1fa60e9 +1914,c68911439c800d21 +1915,ef9e1ed2ee919dfd +1916,a4c5c1ba0be3fe0c +1917,4cf1c103e0adb841 +1918,d6d2574f5e7273bb +1919,fc326d18cbc18c47 +1920,85d01dbce4ec9f3c +1921,c452e186985b2957 +1922,cd778e5397e3851f +1923,8b52e665e644bf82 +1924,7bccb3fa72537b5b +1925,2d4359d8549d690d +1926,bf0b0c584e9ea28f +1927,09f6f6f6b8a50727 +1928,aef7c4f00ac118e5 +1929,fc2795ecf20b10e9 +1930,1c390da5ff546489 +1931,5d8a4de417b5c632 +1932,d00b3fd7c1df6c41 +1933,012f7b51c6e8aa3f +1934,7cb22eceff6a633c +1935,af622e4a8c93e33b +1936,f6e3daa1e8bc22fa +1937,3d2eeb25b2913df1 +1938,9c61dbe4a1ee779b +1939,591960f8713c6bcb +1940,e8050777aa5f502f +1941,4293c9acce389df2 +1942,9c9ee1f982460253 +1943,ae39a07a84ba82f7 +1944,0c7448898c0b28d6 +1945,81d40c7828ed4c42 +1946,3d47c02eccf173f1 +1947,148ca8467711af8d +1948,2e797d4765ea175e +1949,f6b289652837f592 +1950,8364e18be58f7281 +1951,70b477a74d7272f3 +1952,29b489c7ee729e24 +1953,6e724978ab7d1179 +1954,79691b1bf5136360 +1955,0c55706e736d6e8e +1956,55316073f19711c6 +1957,58fe33dd9419f361 +1958,53c5a7081b547b89 +1959,0206b3da435588d0 +1960,2bed1dec4e6e4d10 +1961,bad2623f64e518db +1962,8faeae526a25bb31 +1963,4225ed584622a0b3 +1964,6ba7dfe296127bde +1965,dd4f9d9a84db0a2b +1966,1635de322ef14f44 +1967,d099ba2c3840df71 +1968,d0aed30572bc434f +1969,64396dac1ae6cc5b +1970,77898b3ea5d047bf +1971,ea4536de5683d7fb +1972,b80f95173c9f2689 +1973,03cc37bbba2d7aa9 +1974,90b83c7de997b81a +1975,5923b4cd1f26bb98 +1976,486666404a49acd3 +1977,7d354d1a2f8c86ea +1978,5c821f9f7f9d4f8e +1979,fb65a777e1f6ad73 +1980,2a1bcb144859bf48 +1981,671ee69016b018d8 +1982,c18f7e1bec7089a5 +1983,4dbebf18a4f40f82 +1984,2dedc0382e76d46e +1985,50cc60f13a83336a +1986,80cd620ef7a1cb46 +1987,105ebd021b515bc5 +1988,fafc83fbf4505983 +1989,433ddbfe12e21d38 +1990,44ccd15f70e55752 +1991,232367ed37b7857d +1992,bed9579e40a980f1 +1993,cea7080cdbd9ef22 +1994,5e451cff9b3fe03c +1995,5fc6733fa2b9aeda +1996,fd4a397292a680dc +1997,d4da96c37652d029 +1998,c4ec45a5fb6ce670 +1999,9d0102cf5199d89d +2000,08920ae76c0d388e +2001,85d7d685b185c4ae +2002,67eab4f523ea2253 +2003,cc869ec7dc35eba9 +2004,66222fecb37cadf8 +2005,24a199b538945004 +2006,188f20c98b98a8d8 +2007,947e310ab1dfe809 +2008,9a64ccf8ef7e8cab +2009,d41137c196837339 +2010,5855869ca17491ae +2011,442b86e5f5cf2334 +2012,b9c630aa34bf34df +2013,fd42af1e5f781886 +2014,34b86752545d42a2 +2015,6e34b39bcca9c3e1 +2016,874f998a75768041 +2017,c99da02357650a7d +2018,a9b6ba3a969e354c +2019,0d74f29dfa369d4b +2020,71b7e5d983d1f854 +2021,2d41fb21747cb4c2 +2022,b641521c605e3d99 +2023,92d00cfcd669e67d +2024,8c45e438e2b783ec +2025,fead78d3c59d1644 +2026,b985267309252cad +2027,d0734cf67310922f +2028,91756214883e1db5 +2029,248fe35f800a0862 +2030,a2089498c6765759 +2031,7ec512712f703702 +2032,9d5b9a562be196a7 +2033,b7074a9530e3fb5e +2034,05286259aa2b9a64 +2035,0d3bff0233feaf21 +2036,eaf1ef7a27078295 +2037,9ad679c16018af49 +2038,4f789ccfb5122db2 +2039,4956a9d7bf2c505a +2040,af906af3a6657f8a +2041,4e43b173a5fa335f +2042,d7c4b97c8a475f91 +2043,396350b5269477de +2044,814e59526bfe8dbd +2045,68536cb8beae1638 +2046,3d2d929119c44f75 +2047,3706db0e9d5744ea +2048,b03f1fd34adcd3d0 +2049,d62db9d0814d0a94 +2050,8925ceff77ea4c24 +2051,086e531d699bf846 +2052,8fee2190ba6e3e81 +2053,f79912721d285e7f +2054,5d05f196afe78096 +2055,f2c916027df9b4fe +2056,e546e0ee62bca97d +2057,1964592bdd4ef0f8 +2058,276a8de914355999 +2059,79da56c217023b6c +2060,a7bf025c6f1b49dc +2061,9675c9b04b06e164 +2062,3a240f0f57b36aee +2063,903c7fac43418793 +2064,6193d48c94e96522 +2065,4b63d06bb551dc6b +2066,769c045a9bf4fb27 +2067,15e843f76f63e24e +2068,58a4e0ebb1cdbaf8 +2069,5db99f9dbedd2dd7 +2070,91533932e5bce03c +2071,70b64417a4226087 +2072,7f08a23248fe4c91 +2073,023cf28abb0815be +2074,392c7809001cee6b +2075,e998e780b2d26e62 +2076,20ead26d617b34db +2077,c3398764782e826b +2078,c650b642a1a8086b +2079,2cb78300ee6dd58a +2080,b5d89ec6f342f9e0 +2081,77ae148e43714250 +2082,3c8b28ee1ea5569b +2083,dadb3c662f01596c +2084,7dda443610a27c80 +2085,70c0f8a78c689d91 +2086,fb1c72246a3e2129 +2087,bdf8ea6217e494e8 +2088,deac45c0ed7baa99 +2089,9f629c60a0adbec3 +2090,32b439932b18a7da +2091,8fb5972cc1aced2b +2092,6b8037f22414c9a0 +2093,91069bc025b47b77 +2094,97afffa103c50de6 +2095,3edcc1079f448910 +2096,87b958ced25b9871 +2097,fc8267d5018a92c9 +2098,7a09901c97be77f6 +2099,6bc7434164b4234b +2100,4a83167e5bf5c4c6 +2101,de8167a9cdce97ed +2102,7876521d92eed821 +2103,af41bdfae22e6948 +2104,7239de110b6c8726 +2105,b24c484536744558 +2106,ca88446a7980f094 +2107,3f97b6e488e6635f +2108,21065fef60829af6 +2109,d50f01009409cabf +2110,6d09b474d6cef8a8 +2111,65a51822dd82744d +2112,5d5cd5f37743f034 +2113,cef09108b400d21d +2114,91512f34f8239ada +2115,efaf27d123e8a81b +2116,6cc870371623e495 +2117,e75f3220f66abfd9 +2118,9b5ffb13e880ce55 +2119,fcfeb1c3f3e3eee6 +2120,ba452a7d7a58559f +2121,2ea9af9566c50595 +2122,16f3f2912cba9492 +2123,bbdc89807d75dd99 +2124,5902e9305af4f05b +2125,4c0baba52d33d73a +2126,c96e7b2101e0a5b3 +2127,79f8a9be31f81c32 +2128,b6e3b8fc82f6d510 +2129,ccf917db55b7010d +2130,b969da0940410128 +2131,b6583fbdb52fa9e2 +2132,e5da8112c7627a1d +2133,5720053c5d6eac24 +2134,e2b883144432b3b7 +2135,0d8ba2f2b6780f14 +2136,e0abb74e8bcdda26 +2137,dbf39cdf83c25881 +2138,9aaa2d06a792d5a5 +2139,c2e6326d4ba977cc +2140,ef1de8d4da602c95 +2141,269e468fbaf75029 +2142,ab33a8a851ca41cd +2143,d93a924c88678b20 +2144,71d21841c6726879 +2145,f5022e933396d366 +2146,d1e747d3f937e774 +2147,bfd54533c40a9ec0 +2148,f772ed13ee619674 +2149,d8102dd268efdd6c +2150,be587665c7caec0b +2151,31aa9eaf01917f9a +2152,bf1413e172c9032b +2153,e12c29cda40098a9 +2154,6454c49f31f1a084 +2155,9367eac4605a5404 +2156,5aca5ca0a727bc14 +2157,338c20143d4cfa01 +2158,c6d9a14094a96ce7 +2159,baac995a8f4751a3 +2160,c7b60e58bf5b7f04 +2161,4cf709c85f1e4735 +2162,37eab6726fd50074 +2163,8e4fb1274c64560e +2164,613910d71bce053f +2165,cea8bb5c95324c38 +2166,a3183db08d27558c +2167,ee94d978cf5a4697 +2168,abe8afb069db2330 +2169,1836132cd871e925 +2170,1328487a2e175a1e +2171,989b799e2901fbd0 +2172,716e7c30a2b869d3 +2173,164104a7ea6b5c7b +2174,bf4e529feccf0914 +2175,500a4a4dc638f145 +2176,cb8499e8065f269d +2177,6a4e85cedfad8d17 +2178,872d2831ea35904f +2179,032ab85ffa936014 +2180,51c41c4ea2f25337 +2181,434b1f12f8ede286 +2182,e4ffafae76e415a9 +2183,e5b40642d14c20fa +2184,7bf7d0094405555f +2185,2e3a26c1a998910b +2186,3aa22267e6730277 +2187,f0e79f2a88d311d9 +2188,f66f1da70458bf1d +2189,e424bdbc5ee8f410 +2190,4e7caf7bdc00e8a7 +2191,fb625f7047c0ae4b +2192,719d6940dc993710 +2193,ac06bea142e45ff1 +2194,ce0b97ad11ec0ccf +2195,a8152a881c04244e +2196,c39b7275d9faa25c +2197,3990b48c4dc6e431 +2198,615894e99a6472de +2199,a84d06fe2b3a6616 +2200,8e6ad8b2a06cd43d +2201,642b42b1f9cbc0aa +2202,945b23bb391a0fe7 +2203,27118e257bc98197 +2204,69fe8319b7aa0cb2 +2205,611b699a2aa72214 +2206,e7f734582b10a5bf +2207,2275dda228db413a +2208,be907db112b987ba +2209,afac234e41bb4fbd +2210,ad1b6d25170705ea +2211,95642183d253d2ef +2212,b35b66f86928303e +2213,d4eca07461a15ac2 +2214,24142f9b084e49c2 +2215,f75b6ff4480e9c60 +2216,044f8c7ab058ac53 +2217,93965a7ab5047555 +2218,9189c13741369941 +2219,617c485121ec6a32 +2220,78a72c6e3a061ed7 +2221,2c1b488eab78fe88 +2222,56ac83f21bef18f5 +2223,cc830a0328e8b254 +2224,2af48c58c410c01a +2225,81d63e8f2bbb33f2 +2226,18dd18b00db0a66c +2227,429f4eb360706e5b +2228,27b354134953e80c +2229,418440a3d85a0331 +2230,1b2868752e47bfe6 +2231,00cdbc5cac96b75e +2232,1a8813f12f950beb +2233,d7668430a956d9c5 +2234,bf2591c75441e409 +2235,e70d790c52fe0723 +2236,251bd20421ce8441 +2237,adf7ac4329835c7f +2238,23ca420d2ec5693f +2239,ef8fba68a1cba342 +2240,178f043c6e8fb9bf +2241,c0d63d0c20915e35 +2242,57191f43dc1270f2 +2243,bfe6096713ea0c4e +2244,39cb249f1c2afddd +2245,cf1a1805483b6340 +2246,464f509f49e60072 +2247,8140e74be6a18d26 +2248,27621868e4c4b571 +2249,01df7b568948f062 +2250,a0c4ee88f6319ff4 +2251,c86f3d9e269b6512 +2252,a705cf1722e70b4e +2253,cd8138970d45d617 +2254,62baeb706a8262fa +2255,eeeecb44676420a6 +2256,922bf177137d902d +2257,5a7ea310ce0705cf +2258,114addbb43159689 +2259,4aaffad05a856257 +2260,45b9c1e9659f1d86 +2261,c5640c444b01938d +2262,29149f34b6322721 +2263,4c031551a000b159 +2264,f6ac790c1ed639fb +2265,6582e60d377fec87 +2266,22e110b030f65698 +2267,49611594b07d27b9 +2268,3fc99a8c28a34b19 +2269,4aad3b7e5f2a8597 +2270,219f31b06738adc6 +2271,ebfaebe2e0ddac05 +2272,7128d279d359e6e9 +2273,8e3e352dc237dbc2 +2274,869c877bed309e1b +2275,6ea63f8f1baebf86 +2276,e993e6aa231db868 +2277,01182c154337efa5 +2278,c8b9a7574be7a11b +2279,5198b84dc810194d +2280,fb8f18a6ca326c46 +2281,de4285b1e28d940f +2282,ec2a005d9d59cc61 +2283,4211b353c53d83a6 +2284,f72966597c5729b4 +2285,ae5c7d4cd5f3b446 +2286,b5a0279debe88aa3 +2287,8e9e581e47638b0c +2288,dc8c3e71adef2fb7 +2289,5fab3143a429157b +2290,62112081e5aa2319 +2291,4ad440d46d83eb4c +2292,7604bc41c438c0d8 +2293,899d183b8bb5b585 +2294,bf833e34aa653be2 +2295,f80c0f4a3f5a83ff +2296,467e042b566673f4 +2297,ed3285953bf8a7a8 +2298,63f51a1cb92e9990 +2299,86df230be08d20bf +2300,ab8adaf1a41cd36f +2301,3afee56f306e1f22 +2302,9e6513a9f9b11a7f +2303,96d93e2d61413015 +2304,80ec7f9d20acda32 +2305,0b651e5584ec1eb4 +2306,7459cbb40af28681 +2307,ccc0295a25c804eb +2308,ee893cbd7a47a539 +2309,eeb4a7d1287636bf +2310,1965d5a9ebca0cc4 +2311,8b04cf568be4ffac +2312,cc44f33231ba377c +2313,6acc3c932cde3c6f +2314,ba401b7b026b06a5 +2315,1cc282fc0f4486b2 +2316,44162ab13df7fe97 +2317,3de7aa788164e9b2 +2318,f2ed19c498dd0a66 +2319,df4c850a6ca23407 +2320,7d95af70a00bf2a8 +2321,ce3fe4072c73c2b2 +2322,5c2f35ac7ba9e416 +2323,ff09aa85510099ca +2324,88342933f8af62f2 +2325,d0b06e85d200a29e +2326,4c52b820cb225f9d +2327,7022caee09c3ec15 +2328,969a353a756f8a1e +2329,b57b9dd14093a29a +2330,b9ed9bc49e56303b +2331,7e51e4e79cbdb9cf +2332,67b3010fe93d63b6 +2333,5276487613643ffb +2334,d609f779e04108bf +2335,68735168b051bd5b +2336,0e272abb8eb03f5c +2337,c4095cef362fa601 +2338,78541d0739cc1f9c +2339,21819c7e02cf65a1 +2340,7912a8e02575abb1 +2341,45e69a721ea79410 +2342,717ed2e9711e2bc2 +2343,f1620322f1ca03fd +2344,fad231eb93576461 +2345,da6497bfcb709abe +2346,929e4b59bb6ecdb2 +2347,df6c35c720388f1a +2348,fb068db36561c0b6 +2349,205d17be8f5f821a +2350,1eaf7dfa12417f0e +2351,1a32f94d45f99277 +2352,986af74f3c02b8af +2353,3b5ae97902eafe4a +2354,c8db2512bafe38e3 +2355,51f51a95bfa7e08b +2356,e9d7ead4a386fdab +2357,8ede1af691c57d26 +2358,4bbefc42849f0a53 +2359,d6e462a1e4aa5483 +2360,6652ad5e6ab1db87 +2361,a8c7f2c812ff60db +2362,cf33f07e718ca881 +2363,9d81bfff7a46f7ad +2364,65577576d70f408c +2365,f957cacfbaad10f9 +2366,1053657f8d7d22c4 +2367,8de6c264ab4d450c +2368,8f521ef6602640a7 +2369,2d9d38b6c577a3f8 +2370,54fbac504bf494c0 +2371,a885e9be92d8aa59 +2372,deafa41cf35a4187 +2373,61336d566c4affdb +2374,7878c09f13136c63 +2375,a81fd10646381c9c +2376,9a7f7bff6ae64b06 +2377,889dac764f31c532 +2378,0b7fdda0628f3b75 +2379,84f589ad72a1297c +2380,1f7c5a2fb37ad9a5 +2381,999db7567f48cdd7 +2382,4d98623ca3f68a71 +2383,9918856c161d792f +2384,4957abffa10a3834 +2385,fc84c82c89c6f54d +2386,e377141378d129d7 +2387,434a43f1e235d7ff +2388,b09e485104e79263 +2389,450da690aae07b0e +2390,4f849d2df952282a +2391,e4e2e31a9c6437fb +2392,7730c43dd7ea47b8 +2393,7a2ae2e47abf998c +2394,fc6156f3f6011e91 +2395,0ffad6b6f8c5a84f +2396,4b66487617a5ef36 +2397,02a19313352992ca +2398,b7e45a47e796301d +2399,b3e25dbd51adaf0d +2400,2b0f2597a3a6f723 +2401,a94e47053a3e23d5 +2402,ecbac1bf58bb6db5 +2403,5ac34f8a7873ec79 +2404,d95d417285a934b0 +2405,e719dea19773c1ab +2406,f22a36832c8687e8 +2407,e3c9f24b1d34a18f +2408,1ff418000bdeeb4b +2409,e8502aeecb05ab92 +2410,99f3868e7d4bf339 +2411,b9503fd0d6433465 +2412,8bf28fb20b5743be +2413,293ea42a02970b55 +2414,87ebc0f49fea2f97 +2415,a5d3c02e548144d2 +2416,ad60b5128f9b8cc0 +2417,430f52a356fa80ba +2418,1b65e009db01f097 +2419,f34f0dcf6f3a5571 +2420,73fa27f21d274d4c +2421,d42dcb0cbd93e354 +2422,0cf20cb07e47cb57 +2423,be4f9e815ad50076 +2424,1a8bc927009faca9 +2425,edaf50fcf4c893ea +2426,a3fd14fe5a0e4b19 +2427,005839da79caf0a5 +2428,91c571442ca6bdca +2429,475582f1664417db +2430,211224cc68fc53f1 +2431,fdde438a2e7ccce4 +2432,96efa684a5ec0289 +2433,633e16e8589c8e79 +2434,62cf89081d4fb548 +2435,c4e2e5ffe6a0cdea +2436,5306bdc0fd269d12 +2437,cd4d0699f7b43d22 +2438,1454cd2528d4bb4a +2439,76c507be7f588b43 +2440,1ab81656750eed60 +2441,b26ec36ca96a6510 +2442,d0625d4061e6598b +2443,2d1e961ec65b7abc +2444,a1c2af78d1538d86 +2445,2ae27b69a03cb3f2 +2446,e7a812d623c5ba3e +2447,a69492c74114f254 +2448,de8eb3f31cec3202 +2449,36f6fb71f74f182f +2450,c64963b7c733b15e +2451,a1b20177975d57f2 +2452,aa777511824636cb +2453,f49df16648613204 +2454,04ad3af6bd21dd5f +2455,2e3032ecd14aff75 +2456,5acf8e6371a0278d +2457,fdb472c11b28c309 +2458,0475cb6f42d6dfe5 +2459,eb6f24ff6d623dd6 +2460,c59aebd2a2a742d8 +2461,3947b27eafcf0a37 +2462,aa3a2e701db013a7 +2463,25687593cf2baa3e +2464,67354c75cc9a6b86 +2465,0a7f3465fa83643c +2466,a8facabedd1f809b +2467,322b72600fbb18ca +2468,3a0cdfd762314bc4 +2469,1cbf34c2279f201b +2470,2312e82962c83160 +2471,8cdc0b7d52bfee69 +2472,454d0d7908365c51 +2473,5ffef1cfc4b7ae5b +2474,96791a641905104f +2475,de26b175768ac641 +2476,a2de7f5d1be7f10f +2477,a102a9c1603409fc +2478,5a8c038b46c8fb9e +2479,a91a3d37585ae58e +2480,7630ffefe43a2794 +2481,d64a0cfbb054c9a1 +2482,95574abeae355bce +2483,f4406e9e411935f1 +2484,4093074d393bbdf1 +2485,c7969952f2a31788 +2486,694dd2eb7f67811e +2487,a79d6dd65b3b5861 +2488,b5bbb94de715deb7 +2489,2c7820cd8e150214 +2490,8e4cd8ad070b2cb9 +2491,f5b227e94558fdbd +2492,627cf0b7f7c10083 +2493,b5984dab6d662d4f +2494,a2c1eb6c5fbc6ce6 +2495,f872638317f87323 +2496,8e080bab9def2597 +2497,11fc89dc7b698e8d +2498,682661b920dab34d +2499,caaaac39585c3a78 +2500,0504c004faa099da +2501,62651abdb0eecfa2 +2502,47cba5a8c66cf2a0 +2503,d4642b26f733b065 +2504,f0ed6a5961aa86fb +2505,091cb945e3bb570a +2506,05e5d873f7f7e8b9 +2507,0ac08ef70770f602 +2508,5fc8d0b0513ad3ad +2509,692f3f14c4f31ea9 +2510,3d48f8b3d0ed5ad3 +2511,04053e8348762dac +2512,2a4cc0ff60eadb3e +2513,fa33908f6560cdb0 +2514,a68a01ad00c7d254 +2515,a125198d1ab22ea8 +2516,b602f79001c3b2f5 +2517,82af624b0cee6e69 +2518,b07a075545f72dce +2519,1313f79947caa391 +2520,dab45ca7c06ff362 +2521,86c8d07424711013 +2522,9ba1351c7dc25fab +2523,8b879d56c2041a4e +2524,c6821ee6385b0346 +2525,abe64006e5707e89 +2526,a06220e5ba9da532 +2527,23cea0ce87b71ec0 +2528,a027b6cdace68f0b +2529,bb98d67c5a456491 +2530,68502748cb96d770 +2531,13105f31fc4baac5 +2532,10c13951b21d75f1 +2533,bbaec8f43954c167 +2534,5f4e9e58956e9f10 +2535,43a2541be327844e +2536,b140b83279f4914c +2537,915a2969950e12c6 +2538,91274bb326739ba7 +2539,a0e99dc905b99534 +2540,ee442d877c4f9bdb +2541,57d7ffbdbd90077c +2542,42cd55f91d087b1f +2543,bd601d8c6a1b0cfb +2544,db6097c859f5e39e +2545,0815719ec111d271 +2546,0df62b08b5052afd +2547,8811c86b74ef8154 +2548,69f4adf98e5e2dec +2549,08bb8b1cfc26081c +2550,5e0215555a34bd3a +2551,8dbf09788ce6fe91 +2552,848b1d9d7a639fd3 +2553,53693a3b7bf28e0d +2554,cf4e9acdc4a81573 +2555,961009bbe9134585 +2556,57f42d0f4e51606f +2557,44bd71905fb0746b +2558,732c86e42ceb7085 +2559,44826784ba6cb5a5 +2560,606c4b3ed40099a2 +2561,d9c27ac0990808b2 +2562,065e6ab319ab48b5 +2563,82db1989796ee97e +2564,1bbd3108e8280e74 +2565,e4150ce256db4957 +2566,5de367b5d0a34751 +2567,1cf8c15cafd5a832 +2568,68ad1f7e02987bf7 +2569,f2c7b81acf411e5a +2570,b685e0610d381cbf +2571,7c9dad7d5a980fd2 +2572,809b2769a3d745ff +2573,f4ae501e213e0e96 +2574,8badb4a10c21676b +2575,fdd9775e08fc0871 +2576,fa1272141a853754 +2577,fce518057e601949 +2578,b42a8f843f10deb2 +2579,b4373cf3bc77bd30 +2580,28eb981c8130daa0 +2581,8d7e5468e6355294 +2582,24e73dcc13baa735 +2583,68bf632fb10b62f3 +2584,fc05ce548f3edf89 +2585,cf41acc3eb2f8bce +2586,cd989f833b4f7c8c +2587,7f319ce58b077ec8 +2588,f1ac3c2e05a1e75a +2589,f809d1c431408855 +2590,604bfc40b0b0fd28 +2591,202d9cc3768fa52c +2592,d817e5a3da592b08 +2593,24799fcf5b591a92 +2594,3dafabae47220263 +2595,f9028dcf771cc6c3 +2596,686aebeb1c090ada +2597,4b89bc951b0022bc +2598,c7ecef96cd0422e1 +2599,fef56dfa46eb61a6 +2600,50ee8e6b93ebf08e +2601,2fb893a5447bf996 +2602,04bb4f2bf5a3233a +2603,40d2fb6c656f1a10 +2604,3c9db225a0c9dcbd +2605,e50f40d97a04f7f0 +2606,6471c0df9a5a4315 +2607,76bc8da444cbc414 +2608,19bba4d33082dc92 +2609,d0df02fba53187e4 +2610,e51d526d7c4be086 +2611,18a8ce5b4dc5c07a +2612,1acaa719247cdb2f +2613,9bceec1b7137cdd8 +2614,7ed81c8c55d5f7e0 +2615,661946c8b9ae3fa9 +2616,fa59e5509d257292 +2617,f3223642b634dc8d +2618,a6fa0b2a66e5609e +2619,5265b34f048b17ab +2620,c36905aef7b9f322 +2621,d25c3cbeafd96f26 +2622,8be8c0555a8b20fd +2623,f93f8d55eebc7d40 +2624,ca1f3f5fc6b2efb3 +2625,a5cbd17ed8af0f9b +2626,45fb7748bd80d435 +2627,ec91d5f859fe7589 +2628,484bc70aee99fcfd +2629,0a4f0eb41e9a4c66 +2630,52747b146af9ad5c +2631,fea208af8de5326d +2632,bd9ccfd9c545d037 +2633,fafb9aef65d50d0d +2634,fc81da2ab404a435 +2635,925d68d6b9342d34 +2636,049ae2c2e28c3d57 +2637,7dc8d9022db7004f +2638,24956384054cba54 +2639,98030328c175af00 +2640,f6a7d6bfa253b34a +2641,14114f38ae824219 +2642,dd59fd4f0417ccb3 +2643,5675808256d12513 +2644,1ef0e070605836fc +2645,c12a35c298554fc6 +2646,267886c44698989c +2647,d587738833516559 +2648,5b8a10d19f7e85df +2649,7f39400e9edfb52a +2650,9b1c2239e4f80f2b +2651,0b67409cdf3d62cc +2652,773d6cc7793e002d +2653,5f2e95a1c97d016d +2654,77bfc329309f8bc9 +2655,044670b5295d649c +2656,e957bb800d7ccd6b +2657,9cd45a705f43d0d6 +2658,2712c445e53b78a3 +2659,acf749dd4a00c59d +2660,9157df208bbda243 +2661,030dd9a88df93ce0 +2662,f3964340304d2537 +2663,70bed4df2700bb92 +2664,094deb476468b154 +2665,de12a0488cd93dbd +2666,9ce2a6c97ea98925 +2667,2128c0813888fad0 +2668,cce2ccfe41b51798 +2669,31d004c8f36f5ccb +2670,71731553d8a633b9 +2671,f96cd33438ef8d43 +2672,081fdea8723c1f20 +2673,ff167999113d80c7 +2674,35b64ed7d6104d3b +2675,49cf94963f9312fa +2676,0036bcb38d50817d +2677,0b566bd18601f1d1 +2678,2795f58e363d6146 +2679,1c296d83c6152a91 +2680,8ecc6999e8ea6a5b +2681,0199e37e9d0cde3d +2682,2b30b0361acec582 +2683,200684890a79dfd1 +2684,11caba6e6aa38648 +2685,e4f1ce166a088619 +2686,d1e9b08f33753396 +2687,ce2db93a0d93c0df +2688,8cf9679bbb5871ce +2689,9ec93d6fea8ab681 +2690,68f9b7c0be35c32d +2691,233ba41cbb498d72 +2692,7e325ea7cf464927 +2693,3c1bb08480d7b23c +2694,9fa4c4942b9e79ed +2695,018892bf84092fa0 +2696,bc233debadbf3e2f +2697,d63aac9a5c6f2216 +2698,ec80eb56e13e46d6 +2699,e39892d0280c2729 +2700,e8035f6fced0582e +2701,a7a51bac51a8c886 +2702,56979c7d5d907416 +2703,ea90db1e9c342786 +2704,326df13db3f4417c +2705,a6ee8ddcd55d2375 +2706,17e1484299f071d2 +2707,7e5003de316a099e +2708,0f55ed9b3191193e +2709,c111a5036b830e7e +2710,9c07586785e3b2a9 +2711,207bbcb3aa4dfec6 +2712,37f61b55255766c2 +2713,a3098e4d32e75d3f +2714,d393ef832132133c +2715,3cf8b0f5c4b4519c +2716,11f0ec4450f9dd0e +2717,516208cb34594d37 +2718,5db95f59ca611c74 +2719,a8d8524bf38a3ecd +2720,765be5ec6957327b +2721,59050d39b509dc44 +2722,a765a80031ec8a43 +2723,e05a2dcc87c402a7 +2724,9fd16f19bfab91b4 +2725,4058b70c47f4c508 +2726,890bf58aba554ad5 +2727,01f45b5d0ce63d41 +2728,33057fbfc569045f +2729,9e461e5b66dbfdc6 +2730,c28f1250a582547b +2731,7b900d585a788822 +2732,2ef57e61cb3a662c +2733,f895e4eaf9e62bbe +2734,c0fc95995cca8d47 +2735,af5f1fee1791c50e +2736,672d6aeccfa94a44 +2737,f593aa10f56f93c5 +2738,53dede044536b7c3 +2739,e4a68ef489d5d080 +2740,ac4a5b876c1a6b79 +2741,cd99250d96d453f6 +2742,ddc7118deddb4957 +2743,9e368f927d5eebee +2744,8fd0517707d4aff3 +2745,5aac3e4f9760f323 +2746,158c44977feae2eb +2747,317537c85d182b1c +2748,ac2f91381704d3c2 +2749,bb291ba7bc82dbf6 +2750,91e059a01a21e84d +2751,be041c54e11c9426 +2752,8119ce7d91ec2478 +2753,505d2c8bb0710f78 +2754,153c1f84370c310f +2755,323a9bbefabe27e0 +2756,ef27b16b9f1bc969 +2757,ba242ff2bfae9c11 +2758,964f7972dc3ba005 +2759,bbfefffd62cd18d8 +2760,085a73d18a49a29c +2761,f11553e45f4cbcaa +2762,95655b45e0e7d06e +2763,df87206b07ca1245 +2764,5aaf8bbdde0fd337 +2765,1bbbeee88a4ecfe0 +2766,c5f565b0c6f4d20f +2767,630b6fe69da3933d +2768,2d2f69255219b763 +2769,7cea6ec61e180b60 +2770,8872f8e195fd32fa +2771,37a160579a1ab1d0 +2772,03a2d60b85b0034f +2773,491021d72d55e42d +2774,33d6c1fbd699e4b0 +2775,646236377a5bbba8 +2776,900660f67a1d3227 +2777,cbb7bf9fd6723382 +2778,8732d3820551f6bd +2779,4462f6ffb9377a84 +2780,c442def2a4ce6315 +2781,06f88ab76c8e99dd +2782,1405b7c491f2e3d2 +2783,57a5e2496e208343 +2784,3caf519873cd0842 +2785,c88df81de12577d1 +2786,3c7d94b202b07fde +2787,d6f40a18e120734e +2788,f1b925c63a187999 +2789,1fae7eabac87329f +2790,aa9a2ac311283ad4 +2791,fd1f996f7f5fec32 +2792,d28e692109c8e938 +2793,3eacd8c0d93e6978 +2794,23ad68ff1813a329 +2795,081491716648a583 +2796,80c134816bf552c0 +2797,c62e0d4e18fdc672 +2798,487a799154e6f9c4 +2799,7a3c400c6d923203 +2800,c46efb9e9c03b5b4 +2801,c8d374366ba30a58 +2802,0974c2b9b3ab1bfd +2803,fe5a24f8e28f8607 +2804,4ecf7e6bcd702217 +2805,3fa290dc54d46a11 +2806,0c030943ab6e9240 +2807,f8fa1f5b499066b7 +2808,6fdbf0381ccd47b4 +2809,cc444775ace033f3 +2810,9cc90e4e062e0c2f +2811,55de9a285b2cfaf7 +2812,032890664afcc7a7 +2813,7fbea0c2cd5955b1 +2814,b74ca4d46928643a +2815,a801f6cd66cdb380 +2816,2bb2263f9f86f9fe +2817,ab2efc429b8a74fb +2818,9444d2de8026ac35 +2819,cbf1f1114918eeb1 +2820,5cd01af41ef0d27f +2821,b871803861d88c6e +2822,5617ce81b6e9cdc8 +2823,831bd145dd306d12 +2824,3d8513c6c7c36f7d +2825,542ddfa46c61df0a +2826,de4633e982b02f57 +2827,e4ae105f42db81bb +2828,60fac14f9fd63f14 +2829,90b7a02ecd719b6e +2830,0f891d791e4b2e6e +2831,96e9f314630f3e6a +2832,600fed75b006ada4 +2833,998358096616aca2 +2834,2232bfaaa2dcf434 +2835,16b0e71f849ebf37 +2836,e0e463361ac9b078 +2837,ec560f0e249ea4bc +2838,ffabdf5e7da537f5 +2839,59430ad4c371b82c +2840,841fd8150bc2173f +2841,2bef399c36619cfa +2842,5037e7d20a226055 +2843,455fe70922f7e037 +2844,650e0f1b4ff25271 +2845,e9c2ffe6ffb97c1f +2846,cfa8f145a9d8c598 +2847,4ef25dca242d6974 +2848,b306b28971e5b837 +2849,4336e0cba72979b3 +2850,5cb9d0a0075bb281 +2851,95748ff70b1ff155 +2852,c9dffefc89f3f0e5 +2853,9004c977fbcedd29 +2854,a55b41a55468d77f +2855,1c4fe74c9f0e8b59 +2856,8ac30b882e232a4e +2857,3d6653d8acec0afc +2858,2ab13d7afe1091f4 +2859,56d7b826ceec4087 +2860,40ef531220fc56ac +2861,e954d4ae9f163147 +2862,6f6ba11f78402153 +2863,0cb60d1e9ea354a9 +2864,733c8d503a045328 +2865,9bac6772e1c755e7 +2866,d62223978c12dfc7 +2867,7c88e86a7b93fd12 +2868,d90180cec3451c06 +2869,9d0519de14d0f5e4 +2870,90f0be8f05518b59 +2871,423e2bcb00cb592c +2872,9cfe1410a8fd6323 +2873,9fa57112fea5e193 +2874,53a5317c70c4bd0e +2875,49ba1365f23d1a89 +2876,ea546a3bd7685c9e +2877,0a741b690498c074 +2878,45bc6ef9bf739c3c +2879,22708aacf5c5903b +2880,f56e86daf6065c02 +2881,324fb251b5ca6c28 +2882,ef3fca9d4a1c255c +2883,984bbde2d92abd2d +2884,70ed56d64bb650d0 +2885,0bbae4e5c622b9d5 +2886,c53c65f511819856 +2887,5f4c68bea6661a42 +2888,0bf86a808d0d86ea +2889,179d993fce98ad0e +2890,bb4657ad170f3c17 +2891,98766a6c3428df54 +2892,d14d392e43230e9f +2893,9584aeabf15f18a3 +2894,60dae7351d87bfb2 +2895,1e63e8e530e559cd +2896,81853004cf28bdc0 +2897,5488c5a5f1c80e96 +2898,2fe8413444bca63a +2899,cf2bec4fc2e35e53 +2900,00dad544acb51177 +2901,5675c0c934c5e993 +2902,02c9032f4aae22e4 +2903,76a79802e4038ede +2904,72f3dea40870fde3 +2905,03f3e3de476dcccb +2906,8cd52e7093b267fb +2907,d4e1c2ceb762b486 +2908,c7499c53bc6bc1cc +2909,4d38ab524bc75722 +2910,fb9181fa6ae96752 +2911,163304733ddff8bf +2912,c818b9c111713b81 +2913,35262ca4b1886f48 +2914,275180b3bb9c72ad +2915,8685324ef1440326 +2916,cb2e6dc260d2e7a6 +2917,3bd0821bc0badc64 +2918,37ab66c081fcf124 +2919,5c28069c891fdc9e +2920,683e5ecba8506178 +2921,0c23489b18f5be32 +2922,7e37b05dc214e062 +2923,30b7754db6692e0c +2924,cd0fd6e5e6830525 +2925,52ea1014db01c4f8 +2926,462c097794668f25 +2927,dcad3695d56d6292 +2928,397d1dfadafe9812 +2929,40c482c1c33eb4a4 +2930,b0acf6487992e4c8 +2931,d7c5883cc6eb53e9 +2932,816bde3bd42c6539 +2933,2bcc788082a863c5 +2934,f427af575263a98c +2935,30810cf3a0bba137 +2936,1c3e825ac0cbdb19 +2937,8d79f55a8b9ef77e +2938,087d5d48710c9311 +2939,bcd1fa7b549b1944 +2940,4a9d710910ac7a24 +2941,13ec24a7e2331b07 +2942,699305b688c70b58 +2943,e18e331c38b433f2 +2944,cd81296cf3ca8c33 +2945,4f3978dedf1a70f9 +2946,03436d57ffa62b52 +2947,a1acb6dd8ccc5721 +2948,15367a7def3a012a +2949,83b3c871f35921fb +2950,1812ed846dd017fd +2951,aeecf5f5c9b9d640 +2952,fc3e3bb25abb5ab3 +2953,b560a69372c1c3a2 +2954,64708e2fbab03169 +2955,607443a1d7ccdafd +2956,977c11f03357bdb5 +2957,3eaddde323d577cd +2958,d402cc79da756a0e +2959,05feda56ea3e9bdb +2960,6bf23f052d11e768 +2961,1b66994127baac9c +2962,099980655661ab65 +2963,bb08e92b2ff05953 +2964,5e1021b90d8d920e +2965,a9fbe05dd7c0c65a +2966,ed861a0944ee4699 +2967,f50ffcb998be9699 +2968,7753eb07cbbbb463 +2969,b881ddf3092e1602 +2970,5c9714a7e49a3b69 +2971,26ac485efaa358c2 +2972,f01235b44a62c1d6 +2973,017fdb8f36af9342 +2974,f3313e8c5d7bd10e +2975,4d32e56f432bb049 +2976,baa155074e7fdcd4 +2977,765ed519cc168ed4 +2978,e9add07708b6a4c8 +2979,89f1f29b9cc2683e +2980,51683ea0a2fa62a7 +2981,00e33842dca7e8e3 +2982,b24835b0ca2bf8ae +2983,ecc8ef6ac3a1ecca +2984,fa2da66810469914 +2985,9c899b5bfa18725f +2986,1f033ae94a438b1b +2987,04cadc18c7dd6326 +2988,5d8846e7966f1fae +2989,1e1a0a650af181e9 +2990,655ab752ac7bac57 +2991,744cc73919e3b854 +2992,ef2c043943f88b12 +2993,9b13c1effff55b45 +2994,f0249e812096f2a9 +2995,2bc0c771cb4b3558 +2996,11a61f9b8da44cbf +2997,ac963c10a4f12ef6 +2998,9565c7336f6533e2 +2999,138201563eb7c616 +3000,ea6786d8382a5902 +3001,7ac869f1adfa377a +3002,34af92dc932050df +3003,02bd810811cfaab2 +3004,534e45ad8d07cf8c +3005,dc93e2b1624c4a43 +3006,daa29e715ad478a9 +3007,3952bc703064de07 +3008,d778f0f46373fd88 +3009,65cf9701c5aec124 +3010,107197088bbc83e8 +3011,2b64de1627b1dc46 +3012,55229496c99295d7 +3013,0e411ebcd5268603 +3014,c397bb8e5672cb4d +3015,d497646bc943dda0 +3016,eb02a0a50a27264c +3017,539129b77566ae82 +3018,6c714c69990411cc +3019,de10745fa2f6e3ec +3020,77bf6849fe420682 +3021,2fae6ff8ffb2cdfe +3022,2cc1c3cbb4173bbd +3023,bea083a18ea17f86 +3024,86303a737a8a38bb +3025,99e57c9125161f1d +3026,153e4922809e7d54 +3027,9aac95e2350c2823 +3028,6b4bc5109cdbbf85 +3029,51bf6e6aad3e5816 +3030,53c3f2b5dca0bb00 +3031,39b64c0851dcc95a +3032,ef4bd530ba126cd6 +3033,57061ff075cf3bf0 +3034,0c5b95463421dad3 +3035,6cf41009cc070371 +3036,d526e0efd9f95ef2 +3037,c965efbc1fcf3891 +3038,571889fb6febd8cb +3039,7e1008861a20a06f +3040,6db037b8158cf95e +3041,1d629d0d29b11659 +3042,e1a84ed2b0b42ea2 +3043,3697e1dfa44d1466 +3044,bc5280a6b33ef6ff +3045,e8ce422b8cd644af +3046,f9619b79a725271d +3047,075f3c576ba3efba +3048,08f6b5974942c9d0 +3049,62504981fab33f46 +3050,ea5871a211e69854 +3051,23fe9c31dc4dac75 +3052,81ed0f2fa00ae16c +3053,01979637b301f2bf +3054,0c31df284810eb16 +3055,91d1152c55e2d00e +3056,4d17323d20bfaf84 +3057,24f4b0836e1f5f88 +3058,59366b0761f279fa +3059,bfc79419a0740e37 +3060,814e740963707040 +3061,2828366c0879da93 +3062,0d9ace88b3c311a8 +3063,5a74a0336649f280 +3064,e1859d0ba35fb121 +3065,439326641914675c +3066,0f6851b0b01d6a9a +3067,40e0977ba30d85a9 +3068,8d4d4ae11856eb6d +3069,07e805b1d4ee7ae4 +3070,e4d223c63bf02df1 +3071,1f7299f16c0ef45d +3072,6266e07612821b0a +3073,7c7db375ca0d55e7 +3074,4d1ee959f8a97d05 +3075,e8cd85713c5dbd02 +3076,a7da22d66d2ec92e +3077,9b2c5bf8c9df2237 +3078,8d621f4538bf4429 +3079,86d785cc09ecea78 +3080,f91be2a713629ce4 +3081,4e5c7a17d019ac14 +3082,2a56797e1a5127e8 +3083,c43fe1edb095ac45 +3084,e299954100e33370 +3085,07475adac1f0c510 +3086,433b9164273d47ff +3087,49a7ee0dc6342d3d +3088,8282cde74135d8c9 +3089,f0ef928347012d85 +3090,1b981a5e5300c812 +3091,ffaa40726a4191f6 +3092,2def0a29c4e09f8a +3093,42055b76cbde92ed +3094,935fa54982e81c69 +3095,8374ba4e8d5c34c8 +3096,5c95c02c9cea92d3 +3097,6fd5e7ea39dff020 +3098,5327aba14b690a1e +3099,7ff0e0f420b28ba0 +3100,8b6a47e5af581986 +3101,35586a7c9153749e +3102,413e2d2b107f6e72 +3103,813998fae9e88cd0 +3104,2165c80c4d83b110 +3105,87ec0be060f0b44d +3106,8cdc5f7cd4841d8a +3107,c8d3b7691f5e60be +3108,397ac1849ea5fbc9 +3109,c0c3cc2d9e41ed17 +3110,47f9019297eca040 +3111,1812013e34984b00 +3112,837c63cf6e6252ce +3113,e2098d76c915ba78 +3114,9377923fbf28a803 +3115,9b002c4128328e8d +3116,6e742108fbc7ea21 +3117,31913bf33080da06 +3118,0d3dabf66bdea5ac +3119,e03a9a413f6f7951 +3120,820fbfb778052a9a +3121,feedbfb2bc4f8ec2 +3122,640c3f90af042d03 +3123,299de515dd7ea62b +3124,64db8df6d29b2c77 +3125,3ef43f28800d4d7d +3126,7d7330a308525b30 +3127,92c9610cd824c81f +3128,564104182a516d8d +3129,7c81105ebb5bb592 +3130,fcf554c1acd724df +3131,07cc3c5b0dd1e217 +3132,0f88a9216c737282 +3133,6292eb45c3887095 +3134,ec836a5159697539 +3135,942b0595064f57b9 +3136,7b0b6b39343a2ddb +3137,94d08284c8968240 +3138,6f7091ca1e769423 +3139,c660e29f4853a31c +3140,e07b736b4cdc9d7f +3141,e87e6b2aefb07dc5 +3142,9118f283ed23f8e8 +3143,6af1bdb05414a855 +3144,fe16289f2e0427c4 +3145,13c83ee753c328fd +3146,233f89a60bae8b45 +3147,5c143c861c5a5a33 +3148,a68ddd66268eddb4 +3149,f531383f44947514 +3150,af4ef138fd6137c1 +3151,3f3d486fa37062b6 +3152,774451cda8adf048 +3153,692144f920456baf +3154,acc8f5eceeb1fc38 +3155,c3c8bd299aa138c3 +3156,0a1988fd660697fd +3157,c65350b20098069d +3158,a5a3b8d29abd62a3 +3159,b0974842f9f4ebd7 +3160,41a87087e95a3115 +3161,a47034bb4ff13495 +3162,d52a0a8305184774 +3163,3cf1914b5ea7f4b1 +3164,c945544777c5ff0c +3165,875ce77b64ef789f +3166,201e90ea2d828b12 +3167,38bde4ab0f77f2e6 +3168,94bac85d4e479ea7 +3169,e87f308e39062615 +3170,f9be513fbce5badf +3171,23ef68f656044c8b +3172,adbfa94281eee632 +3173,4c6a2539ce580da4 +3174,4fc64d9b258dd93f +3175,fc85bf39cd049430 +3176,f898c5a3bb29422e +3177,fc3a82c602e47394 +3178,bdced8326a844f73 +3179,f0aa35ac35786986 +3180,3d33450f258a73ef +3181,9e3a23ca173a3126 +3182,ac2847a6a5affa51 +3183,761c7aaee42c7568 +3184,b493dbddfa6acd32 +3185,32514cf5934396af +3186,9c78b86ca817207f +3187,3abaedace25939aa +3188,8925b374230d2041 +3189,f1386f8511696b66 +3190,b73caa4230d7f1c6 +3191,36a22e0fa1374655 +3192,642d25946f596d85 +3193,761ddac6a30d3f70 +3194,b6d8c036bad91d93 +3195,ea2cd7c1f1b20883 +3196,7e226998775533d0 +3197,2cb126f83de19879 +3198,6e8fc2d0a8532a9e +3199,93e60f503e909f90 +3200,4fbed078c4c03fe7 +3201,6014de2bda91cc3b +3202,7d497a51dd83df42 +3203,8902ba7a18a5022a +3204,7cedeb91ac7c69bd +3205,0609916aa4a41419 +3206,0f95e441e0abe3a0 +3207,be3e848500b31309 +3208,592a8a90f7b9bbbc +3209,1511d49b2d8064fc +3210,3e2c6020cd92f739 +3211,8b177f74ab1599dc +3212,19321af7919f008f +3213,84d8ef5a8d9fbc82 +3214,ce5a8d61ca2ca423 +3215,5f18a1e527d93844 +3216,b87b13f5667297a1 +3217,1511669de3840adb +3218,4ebbe2188bcfde57 +3219,4dfa1590234f7298 +3220,91e52d9338fddeb5 +3221,149f7a9b1622f3c5 +3222,a945144ff6e30e3c +3223,af092dc6467bbeb3 +3224,2d3c8c224a7fa916 +3225,765c6b10a002e3c5 +3226,d23bbe86a17bad34 +3227,a122a400fdc4eb39 +3228,c0c7b2f04fc07701 +3229,b1389ee4dc041172 +3230,38348e8df4b1629d +3231,13754d15359f6466 +3232,4aff38905af1b8bf +3233,96ba2aa7a60e99fe +3234,040822dd2859c772 +3235,c15cc00011a3eb2c +3236,1d3bc67fa867b1d1 +3237,4073dbaadd1303c4 +3238,017df378f10c1690 +3239,95f564d6df8151be +3240,33b2161a162f7ed4 +3241,e4d4e991db485021 +3242,30263a2b567097ee +3243,071f477634b372be +3244,e464d66f2f6e5616 +3245,d4f912393b89a986 +3246,d87591748f90306f +3247,ab8896285aabe0cc +3248,6223ac71c09b12d0 +3249,a9fd81c6077bd3af +3250,cbc3bba97faed5c6 +3251,27a42aa576cd2898 +3252,bfd6e92345f84d86 +3253,b1b73626d43ad486 +3254,b271edb7b4f9f859 +3255,c9d7231ce676248c +3256,f722c96e82835aca +3257,d3dd672fe35fa32a +3258,42ca565f26b01894 +3259,1f3c2151367c738f +3260,a4787335519c9f44 +3261,0c4798fa7dec99ef +3262,c90e256af474dcc0 +3263,d1b822e1275ff9d0 +3264,960b61141b8d73e2 +3265,8653a8e37bfe9bcc +3266,6b325fed8edf686b +3267,0fe7c9ea78f96496 +3268,6613ba1106dd35d2 +3269,a282723ff11c269a +3270,92479802ffdfd92b +3271,50191a1a4101eff7 +3272,df82de8d7a62d466 +3273,487bad8298dd3922 +3274,8e38e9cb04a8d5c8 +3275,152c206b6b5d36e2 +3276,345dfd7c85901c5c +3277,1dd29abd4ec35514 +3278,1847aae53b211a1e +3279,7cda26cb001c46bc +3280,1b81bfc30c74ce5d +3281,66a49fbf5db5c291 +3282,6d2902bbc31d7091 +3283,9e60c85f2579e6fd +3284,b28671516ac1025a +3285,4f60da1be4d414df +3286,7fd8db72b4290e2c +3287,b77b707d78a16598 +3288,d71e6f26f9f44ff9 +3289,397b30002206ad65 +3290,4fb1cce2b50c4531 +3291,2e0f9c21616f3252 +3292,209994f543bd8192 +3293,fd5d7d72dff243dc +3294,c652c3ca9e97b69a +3295,7c826ef72f82ca08 +3296,bc06a54a68e61217 +3297,eec93d3c15e78979 +3298,3606897678a0878a +3299,2952bcdd8ebe0a47 +3300,1d9fac7d97bcb8c3 +3301,e49ea87bb5e7a020 +3302,7afb3ebcde51b980 +3303,5b37b9f06259d84c +3304,e6d1e48a8bdcb783 +3305,f930969f06de81f8 +3306,81c74e2e6012e9cc +3307,653525f4e1dfe8a3 +3308,1091e45ae25a722e +3309,1907b0040e3f678f +3310,123c97a6f4a18f28 +3311,ee547ef1700e629b +3312,c679c2c452b688bb +3313,eb5bbbc1437b272e +3314,6dbb909c300025d5 +3315,caa740b14f1b0092 +3316,c1e8a3f238eebff6 +3317,c5f94b3f396b7f28 +3318,ff628271754181b7 +3319,83a1b0d5709ef3d7 +3320,4d1797b1dd5b0381 +3321,993dc0bffb52ad50 +3322,38878f0d3b6368df +3323,f3258c8867fd99c2 +3324,6120e13342001eeb +3325,e4711fa00a82c864 +3326,e270f888b88e7f14 +3327,83f07aaccd43440d +3328,b1dc6c3ec53d16b0 +3329,b5c623d931185199 +3330,33b87752e12ad7aa +3331,bcc169c268522f7c +3332,c73441ee46f0f691 +3333,1357a70dcff09561 +3334,15980ac3516dd499 +3335,654fef311e611a27 +3336,0f0ba8e00aefabd4 +3337,c8942928dfb5a9dc +3338,111d00ed95060f80 +3339,47997e13a6b100d4 +3340,481c79611bf48adc +3341,258e18fbc951c9bf +3342,42157687ffd80080 +3343,85839903436b5a00 +3344,6d3de077c3c947c2 +3345,39e3e00f4259c154 +3346,031386c6b8491f86 +3347,e8ed7a6b8b2b4a28 +3348,74ce8de7dc236340 +3349,dfb82ffcdda6a3e6 +3350,c81ae449ec93cd9f +3351,29cfa2f3b54fef2d +3352,a0de4a68dcf551b0 +3353,526ad2ac0d313705 +3354,71a94e8f172c50c9 +3355,533068fc03a95207 +3356,a6f75591e9c1e728 +3357,ec96aa6c41495953 +3358,78efeee05b7f7fc1 +3359,7d9bd6a7a8713042 +3360,0040d5dc8a990445 +3361,d499091940c83557 +3362,b4ef52939a249b66 +3363,6cd6ecbe5e373cbc +3364,ef84799593f6211d +3365,31b62c80ff6b8040 +3366,bb6f8348f09b6ded +3367,ec88c082c95945e8 +3368,e23e11cdfd94944d +3369,e3f78be6acd7da6b +3370,234caa576460d8dd +3371,8b951ae9da228b89 +3372,35cd9124cebc7f79 +3373,afa6854adba731b7 +3374,7b75fc590b28b79f +3375,92df1ba5a94aab9c +3376,d1ff83c34ab9a3d0 +3377,df4a1951fe1a3326 +3378,6d96e09611a403b0 +3379,ae2345102f3195ab +3380,749e91c479bc2cfb +3381,1dbf5938e53b0e13 +3382,19eaa83767f3485a +3383,6007d4b963044e44 +3384,10c4cc0d55747b07 +3385,fdbd96c688a27197 +3386,24a4206549495f76 +3387,925749adfde11369 +3388,b7e0fd896a6bae07 +3389,ed5aa0f35b866406 +3390,a5fef8083a8d471f +3391,d9a516952d3ffd44 +3392,77b4af5604728df3 +3393,8c561a2996fda511 +3394,05cdd5bce86232d6 +3395,45f055d32a1ebca1 +3396,71db66ed15c4402b +3397,f7c18bc5b3fa5798 +3398,7822125338737ea0 +3399,f3c158a9c5f698ca +3400,5c1e74bbb98fca07 +3401,cb8775011a6b8426 +3402,dfa1a62e0482fb28 +3403,4fccf9e7b8dc5426 +3404,7521e63e9ccb268d +3405,eb806b4f9747acd1 +3406,1b0e9817379e6bd0 +3407,bece843a9efe9aa4 +3408,0895099bcccf5715 +3409,f3a45fca4764cd18 +3410,07bd3368abbcc6c6 +3411,141555336307ec1f +3412,3d984a735caa8b70 +3413,84e4f7b51549137b +3414,5e16b52a35b63a29 +3415,99947b1788c078c3 +3416,635adfa134473240 +3417,2d687e9e56b40fa3 +3418,b71003a4e80aa986 +3419,81a75661c1a34a98 +3420,97e3eeb140cd0aef +3421,26879e96d56c88fc +3422,0897ea35be60e6f2 +3423,72bed730ca0e0b02 +3424,6c8a67844057fbb6 +3425,e0729da3baa08094 +3426,b96253383931b8a1 +3427,1a027cb9495a7a76 +3428,adcb5528269b6a68 +3429,045bba9bfe42b9b4 +3430,e3bc37b795817aa0 +3431,18ad02493bae237e +3432,d6925f8c08009c50 +3433,6fb4b6e76a3d4732 +3434,fac1546285ed3ae9 +3435,edbc271d8bfff151 +3436,edba0351bd394c4c +3437,6e4bb5bdc1bec3de +3438,d724b4fefe9d75dc +3439,f50b10d4f12aa9e9 +3440,a482213fceca9f70 +3441,702064c280a9adb2 +3442,1806f6536b05751e +3443,7f15436c52124703 +3444,86d764a0355d4989 +3445,8cf44cfee6af0764 +3446,97033056a5d97f27 +3447,42ef86fa148764f4 +3448,1d9378bf0c0fb0f0 +3449,44f77d810d909d9e +3450,04156d31df7f0e4c +3451,adfe71c9b7ba6440 +3452,7c10b9e3bfc01830 +3453,06920bab52e68220 +3454,9fdca365f6185ba2 +3455,86e8d6fa4cf31df6 +3456,2898bb878fed9b61 +3457,74185e8f1260b1d7 +3458,eb2a149ae9fe7d13 +3459,46989d8f656ed3d6 +3460,0a80bace685eefc6 +3461,897e1ed64f457dda +3462,57e9304aa007ca0f +3463,1a3a175be65f37e1 +3464,e76078c6d3e92541 +3465,4dc29bf3ae3b1c05 +3466,ba56f2da33365f2a +3467,58b987db967d4768 +3468,908d06552661a4db +3469,c9ac6567ae790787 +3470,019596a5647dbcb2 +3471,9bfe1a6b53fb6b93 +3472,4ed89427f47f28fe +3473,4c45b4ca9a90febc +3474,03633d17985572ce +3475,286fb1f4e1f42870 +3476,a8ddb1e5d05ab470 +3477,41fdfd17d5a435af +3478,8bc61286d0fe9430 +3479,a9af92055b25ba7f +3480,1d5e13ba63230713 +3481,d574c0cd1f577f35 +3482,6ee14d48ed199817 +3483,0124e8bc71fec8f0 +3484,c65982ca31c0764d +3485,76e9eb17041be21d +3486,04d7cefd2c3b07eb +3487,bd180c42078d6a1b +3488,68649cb52e280505 +3489,148481eafcb58c76 +3490,3f7f90f0cf4f12f6 +3491,9fec18f45908a2ef +3492,0a48aeeb9db04ef7 +3493,01756833ec6cd124 +3494,a8c00300d04a2575 +3495,f6bf68e6c8ab09f8 +3496,074b2f9a44834bd6 +3497,5909170db0efb665 +3498,2996ac1ec5dd7073 +3499,e9e987b161b11fa3 +3500,e468d1b3cc48c76f +3501,591b4d571efb0391 +3502,da99563bd1f0f863 +3503,ba86ea8ace4c4b66 +3504,3f3f5647a7850768 +3505,c1994f505237bcf8 +3506,e23c9d5437bf59d2 +3507,f46cf301aedad170 +3508,9e7883b72b25fcea +3509,41f6b285ce4ca8e2 +3510,972721e35d988ac9 +3511,9c093ca71cead5bd +3512,14dc6e4e16cc86dc +3513,0fd27e8435a0bce4 +3514,4f9bc71a4d467738 +3515,2ed8bdfa15822ed7 +3516,d9cdbcd6b75c3d55 +3517,1d32436ec3b439e7 +3518,8e042d2a1d3c633c +3519,91bbbe90a19f3578 +3520,9caff53c8af332b7 +3521,a549ae0cd16f46d9 +3522,751002e4db31bd01 +3523,a5086344b257e961 +3524,19a9d591fb948d0c +3525,f6b86a3666fb442d +3526,082bde948ed444f8 +3527,3f2867f013c7299e +3528,25acf0bd088d3a21 +3529,f706a797f5a6eaba +3530,fcec5ae3050026f9 +3531,9b70c63b2023b2c6 +3532,d2a9f5d242188690 +3533,807ac127d1e462c5 +3534,fdd5ac09e9a646ed +3535,03bd6dfe753628e2 +3536,7c8203b914ce0bb4 +3537,40fcb45e1faea8f6 +3538,95528ae074aadd49 +3539,38893c003f0744f3 +3540,e3d25308d3964144 +3541,ba888f44457c6567 +3542,5d5edf636f481b75 +3543,8f08aea8b58b314d +3544,97a893cecacb27af +3545,74d2064fb861d882 +3546,b74795aaca64b430 +3547,790aea584ab48c26 +3548,99b1e6a143b15554 +3549,abe9bdd15e3388de +3550,13025e9449a96229 +3551,fcb4254d80283926 +3552,e97abfbe648cac99 +3553,df06054fc4a4f9fe +3554,74ff8607b1c10cdd +3555,8fe8ab545bf29f9b +3556,f317807fe090356d +3557,e0bac8d9e859a307 +3558,531c94dd77e2adce +3559,7241f91e05cf9773 +3560,a79bf6283045eef2 +3561,7e1089b1a6281815 +3562,ca568282b0ee8113 +3563,472aec7e5ac01852 +3564,d46bab6c733bd234 +3565,772c8b464c3dded6 +3566,56652689a29c1937 +3567,4521551293c5b496 +3568,f29a0e74510b691d +3569,cd9d14d31c5b48df +3570,076ce4f2816ecb7f +3571,990e9f41f2c9b2d7 +3572,38f69f6a671e5efd +3573,d0f8ddded4063232 +3574,ff7c06a1c60f2feb +3575,3229a87f6e277061 +3576,9297330ca51be07d +3577,f487455389ad202f +3578,40695023dd0965b4 +3579,6b5c9c1aedf2565a +3580,9a664a1d3b702cb4 +3581,a41e4b7e3c0ffc63 +3582,704ad1fcb0ade2dc +3583,53ce5ea17f0f38b5 +3584,359d79b57dc7471e +3585,5a75b19b87f55104 +3586,8650771d73d5cccf +3587,b61667c526b966d4 +3588,8b38760aaeee2333 +3589,1b2fcc54ffb58922 +3590,416f57c66cd8398c +3591,92a2b90d10b180a3 +3592,5bc544929adcf950 +3593,7b8209f23c409a9f +3594,a347b6d616ee36ee +3595,5fb56269808aa234 +3596,0d73d81c07f3469b +3597,ef9bf9b7bbf488de +3598,134bb5aa53c088c1 +3599,5bdc815f2a7fc8c9 +3600,c1fefb9c5c0e6963 +3601,5c50eaf26d83e6bf +3602,f842cbda585e7c77 +3603,d914be10f9a3c377 +3604,75a713afa6807cdd +3605,3d2230bfab281e42 +3606,344cb6c63c3d5415 +3607,d6e813ec1ee379c8 +3608,416063c737a997b5 +3609,2439c6ae2e5a79ca +3610,a45bcdd583745c52 +3611,16a4d88b2955b2db +3612,04aee680dbd1a260 +3613,ca0376697deea40f +3614,52f40640e182d69f +3615,526d36d3455233f5 +3616,90600c8485d94a5f +3617,45783baf157826f6 +3618,efceb1d397614d31 +3619,66e5440c138a6766 +3620,06bda7e591d7f71a +3621,bb3e0dabc82e7f7b +3622,d43d09319c808536 +3623,4a73a4f1cacba330 +3624,09185be29b20f9fb +3625,253029e32c11e4c0 +3626,3b4ce9e8d0ff6897 +3627,f9c00412d570eeb2 +3628,8929fa15662c4739 +3629,b9dc4df32ccf3b91 +3630,2fa61c414b8b7832 +3631,25232b7f2b471d63 +3632,a2ca4331c37f402d +3633,060eb8ac1e957e15 +3634,14154ebfe8fbd210 +3635,552c802fa61564da +3636,f1d526e979fbf330 +3637,e057799eb1967240 +3638,6546014cce759853 +3639,383309720f338347 +3640,b09a7663726a326d +3641,5c2e34af1e47df03 +3642,434c8a8cc6a0c969 +3643,ef89b00e8d5fbbaa +3644,80bc2130b741bc69 +3645,9ea4f72354fa41a5 +3646,b3ac4c41303306e6 +3647,a8100f265160fbed +3648,b3cded842cf39e39 +3649,b2f485ccfb5de1ee +3650,3daca91d8c294dc8 +3651,e6d3bb095dfa475e +3652,4dea05cf339941ff +3653,b250bb9890de4b35 +3654,ba89f03958a408dd +3655,93327814522192c3 +3656,fb2913371408669d +3657,1d98b55bd2a6009a +3658,bb468ee01594b8be +3659,9a4e1bd5049218d6 +3660,7762433710ffcc91 +3661,cf7bbb0841e26646 +3662,45286ef1f3ab57cc +3663,a8325b0632412797 +3664,57d02260cd563724 +3665,33fe4f03a60f3ab7 +3666,167c17e1dab487dc +3667,2db90968dc136624 +3668,4bba1015f49593ae +3669,bf10d14f422d9b25 +3670,e39731849ae5cf3c +3671,1c1df4a5dabce2d1 +3672,d803e79c4338b7b3 +3673,4d18e52db7ccbeb3 +3674,5c743012e42176d6 +3675,37dcb85aa1028547 +3676,81c1940c477f49ca +3677,3bc25c3d06e9dc5d +3678,0b3f0beb48f23069 +3679,ede11863d4c94f2b +3680,426966d4492860c9 +3681,6611fa84cde833f6 +3682,14d6614afff0e735 +3683,759c4da3bd1360a5 +3684,3f7e4407167737b9 +3685,d8a21dea944a312e +3686,8fd1f9d4caf9ab4c +3687,dac4d101b903acfb +3688,f97094513429be1c +3689,1f150a2bdab05318 +3690,92aaa6f5db11a4f4 +3691,5ac7ec5e5dbff229 +3692,0715be5746d9eac9 +3693,a437bcf5770d1086 +3694,b36aab4accfd1c17 +3695,65af18ca49838234 +3696,9bc3e4c1595217d7 +3697,ac6d9c0122a33d89 +3698,9b2fcc81d74acf8e +3699,2e3def89d82da120 +3700,129f302d2d2f7cad +3701,e84715be877b4885 +3702,c916d2a9fe5f65f9 +3703,120d360c10fd8dba +3704,29b73155de3fb5fe +3705,ca5eeaff6024d8b1 +3706,c6f68cab1117d70d +3707,e76b1e6d09d4eb9f +3708,e82d9da741794b9e +3709,37da45cdd101c5e3 +3710,1aed5783d4fc2879 +3711,b196ec4185de6812 +3712,4bcf4c4b4d6a602c +3713,c2fca3d5052d4e3f +3714,55232ecd6e476dd6 +3715,4508aa986408f3dc +3716,00868fb364d653f8 +3717,eb9bc5a2a9ed5b9e +3718,abffb091691f2ba2 +3719,fd9953c549d5b1f3 +3720,1c758896c88a6f38 +3721,5f744333c84ecb0d +3722,c38c9fd20a6bd344 +3723,5eff45f1c5b239f1 +3724,d4439bc2efa99c69 +3725,3197bdd36b5bf7e4 +3726,4f8e805d750d7c44 +3727,24c09269f67f56eb +3728,99c375e1e6ca2384 +3729,28eda79472ef03e2 +3730,0e77f9bbcfe22270 +3731,58ad808a11081586 +3732,aab90597de58e8dc +3733,d1f1fdd9b6c37252 +3734,8b38abc0173a5532 +3735,0283a998d3ccf292 +3736,c3fbce9e203f3027 +3737,d93c5efee22314a2 +3738,64366c27c0c12519 +3739,17781a274ccb6bf4 +3740,750fe1be5c128150 +3741,335446e326e95c56 +3742,dd853e0c0e22a0dc +3743,c6cc706dcd7f91ee +3744,28b421471b681405 +3745,b8fa8abdb80f1479 +3746,32e68b24c04f97c0 +3747,9ee3822617a1151e +3748,a00a32652c7f84b9 +3749,e8b64ffc2d244d58 +3750,81ec68ddbf3cbed2 +3751,f7a0399b699366cf +3752,88b0871c6b324bc9 +3753,22ab1890d8761e9b +3754,5800227d7f43928a +3755,63619d227a7cb526 +3756,bf003bbb380b9be2 +3757,cede34af3685b47d +3758,863f9ba61f7c642d +3759,7bb39d50b89dceb4 +3760,9f8622a960133939 +3761,cde5131f4ecebae4 +3762,a34602a6ec9696e7 +3763,17a46071b4bfa21d +3764,dadc646f192ca294 +3765,7b16615e4d6805cc +3766,73d33e12ddef5c35 +3767,696e86b8cd388a6a +3768,7d32d84ddb751454 +3769,21ef8b9a053d4a94 +3770,97e3e837b6abac66 +3771,3b80d8231c6db32b +3772,f26cc3d9c9c60c04 +3773,c8727031b74fdf1b +3774,71d8328ece0333e9 +3775,688f1d7ff47b341e +3776,e14a1e88024d6acc +3777,4dc0e048c5605faf +3778,9b6029d3d265cf30 +3779,b1c560520b18964c +3780,1771ee78388f8e60 +3781,d5f99cfe246bf840 +3782,944ec6d137a92659 +3783,50905d8764e648ae +3784,e534127f6c5fa486 +3785,c1de38ec3a7ea3f3 +3786,420767acff00cb69 +3787,5f2c9ca6e5315fb2 +3788,e2b7821bdb1464c2 +3789,0ff337950eb0de59 +3790,2b1ad2ee1d502561 +3791,43ba7409e2d4d455 +3792,50943ff6f7620b57 +3793,af28789508add966 +3794,d41d523051eea272 +3795,fd3227a05377f951 +3796,ce1781289949289c +3797,877920ad79876a3c +3798,e408fe9d2550b01c +3799,a56831a9bb4e0bae +3800,dfa7689814903e5c +3801,d2e6160711469b2d +3802,64505ad79d175f41 +3803,016c6d7466f96ce1 +3804,8ce21036b04b8694 +3805,61200c6b2e719531 +3806,2292f2cbfc21dae3 +3807,4d698afa8b18e837 +3808,0241031b807ca64c +3809,eac7251122a54269 +3810,bbff756ca6151a6a +3811,2bd0e26b2c311d83 +3812,1647d9ee18b908c4 +3813,791e16bca49e27bd +3814,0dd43e43b027972e +3815,a083ef555d609329 +3816,257b3f66bae96627 +3817,775966da50496bac +3818,a3e630463e2d98f2 +3819,9f1d7266ad7cd04e +3820,253a3f52d65d73a2 +3821,240ebb501070ca06 +3822,87d694d4dcdb487c +3823,ad53bad3375e703b +3824,1e6c4f5e924be65a +3825,8fa36a7074cd5b33 +3826,a63ac48cad5f639b +3827,2d97c3f902133b85 +3828,de7903ac3947e5ce +3829,60a988bfc42c01a7 +3830,2add1f9c533dadc3 +3831,8a2cf075cf5faddb +3832,42c1bfc0f9e9abe8 +3833,c8a4774e9781b598 +3834,21d5c00f9c386d75 +3835,5fa0dac507e87221 +3836,b4dca46a99174659 +3837,73c2a96b4322bc19 +3838,24dc1f23ae64120d +3839,75f00a226b548b49 +3840,a1b97280ef26aca3 +3841,e0c387746d362642 +3842,5a429ed378201ea4 +3843,4546c074b5e0be5b +3844,846dd727bec9a524 +3845,3e7bcd344668ec5c +3846,a225a18f3e999ecf +3847,4417ca3c50221f40 +3848,f1323793f484a678 +3849,c920dad58181252c +3850,af0d502b24eae634 +3851,4980a3c6cc5ab6fe +3852,5d190f3793e84f11 +3853,c3870747156b3112 +3854,75a0d501826e8978 +3855,154051d782950631 +3856,441090eb6926df35 +3857,9541cf922f5ef464 +3858,f94ecd0cc5e33fee +3859,da934b6ba95b43bd +3860,b1b834142ef6b1d9 +3861,2835655660de53ae +3862,732625bb906ce80c +3863,8116808853f413b8 +3864,b16468a2cbfbcc9f +3865,1df22e951cac992e +3866,e8e58371abcd5126 +3867,6cef1f8ecd7fc7f2 +3868,49e6117f2e084338 +3869,98a5d1197125dabb +3870,b2505208c575b022 +3871,e257139a1b56a501 +3872,12a67e9b0eabab6b +3873,22b78801f48ee0ef +3874,1bb5331b21fd7a0f +3875,85cc69e4bd49dc7c +3876,4ac0c89e99a2d6e6 +3877,5f52777e5c872e8a +3878,a28642448fb5c013 +3879,b7abc78cfc7404ac +3880,b5b6b8428558b930 +3881,5223b9f143483721 +3882,3076b497390e851d +3883,20d1a3d82da7b8c0 +3884,c9f4423c4da03179 +3885,a829f29a6c8fea64 +3886,46310e81664ab895 +3887,e58a1f019ddfdb12 +3888,f2b90a082ff54383 +3889,0e82e0194b5f48ac +3890,c315125c530101ac +3891,29e4227bd4bdc8d1 +3892,3cb300363419bc3d +3893,5726ec847ece8f82 +3894,af92f2aa9b355be3 +3895,a28658ee811dc15e +3896,6d6c5bcd73038ddc +3897,20bfa6b0fdee1170 +3898,27bd480621a0019c +3899,6a1d27e4f6494ae2 +3900,0c14414ab5bc8006 +3901,e460cd3f205ee2bb +3902,08acd53704593963 +3903,ce3b774474d5ec4f +3904,fe11133e5f1dd42b +3905,2811f54a8461f04d +3906,cb06279ee2a3977c +3907,efa0becb184c716c +3908,b7ddf912f5692e3d +3909,0a8b93b1f78742f6 +3910,fe65614f7f6c9c71 +3911,8a4797d0ba77cb84 +3912,bdb459167abf1f56 +3913,cf4cd61408f93e84 +3914,84027eb44399781f +3915,a5481ba3d7dfb328 +3916,4ffa307aef0a95ac +3917,a511ed3b52731257 +3918,48441094ff94d542 +3919,ecccb401d9ffe358 +3920,1658499a412c242c +3921,602c646c15f2661e +3922,e11eb412a0cf17b5 +3923,7f5fb0e732ee634e +3924,c7cd2110f6970121 +3925,16e1468c1f04aa9c +3926,1724281a3c9a58e9 +3927,a6e8b894e1874fe5 +3928,ca7c1437f5d662e7 +3929,a9f03aa91478ffed +3930,aa86d6051e488638 +3931,c942c6aed3debda6 +3932,ff7074f480911b02 +3933,28de31c240a5d8aa +3934,d97280ca74eec414 +3935,e14551965c873911 +3936,71875f152f1cb39f +3937,5d271ca9d77fdb41 +3938,55744f881a93c7a5 +3939,1891da08c916b885 +3940,53cb0b527bc64df9 +3941,e1637e69bd941608 +3942,2de3915740b1d5ce +3943,14734086b3c782f0 +3944,50434589642c759a +3945,95e20469721688f4 +3946,c09ea44cec8badbb +3947,32921704c2f0272e +3948,d1769b38c5e0ff50 +3949,d0b7879edfc8edb5 +3950,d64c7ca6a89d5a60 +3951,623a6afab4037adc +3952,a2c2ea7712e5b3f9 +3953,fcd35f0321256a4a +3954,bbf8e452defcfb6d +3955,45bb9992321bbf8d +3956,eec118b2329dba7f +3957,d036179a0cb1df76 +3958,305401e084936c8c +3959,8c9d916e21385ffb +3960,47f5bbfe95bc8d0b +3961,85a904028f12ef58 +3962,785446bdbfc3b9e3 +3963,ff5f5a0dfb86a470 +3964,70e7e4036852f65c +3965,7ab25fde761999b4 +3966,3806cb23d4372bc5 +3967,8e62f4524d92495c +3968,b7e5756e43ac20c8 +3969,73156ac8fb139cc0 +3970,336e564318f1a403 +3971,493a04f5e1417417 +3972,3e94ed3267d41de0 +3973,def77c7d5b78ef4b +3974,c69c3611c3b20746 +3975,dc2f97bafdbb5070 +3976,186d34fb47134f49 +3977,f830471f8f2dc1d3 +3978,ea96834b054abd80 +3979,4f426eaa19bc85cf +3980,7bd3b3b69355987a +3981,12be4d1a98c4ae14 +3982,5973fee84a4819c0 +3983,5d453dd35a36a483 +3984,d1484faf21430a3c +3985,9b669d8145a1fbe3 +3986,df4e6ff0bf25a911 +3987,e6a951429dac2ab6 +3988,5b261ee2234f658c +3989,eb71e916bc39c044 +3990,2b97e0b9ded909e7 +3991,88442dbfc1b07657 +3992,2edf564c6b73fbe1 +3993,0ef783aca1ccd513 +3994,96d823761b4771b1 +3995,393fc52093f23608 +3996,34eed40ecd89e33e +3997,386f0e191680dc6e +3998,116b810ed8bcf71b +3999,c85b18aacc9eba3d +4000,ef83c63e8c87ad3c +4001,8a09af6b9c9ba4b1 +4002,98eadcb64d709b96 +4003,da4d3d322d0225df +4004,c3e34e4aec06b251 +4005,ab6da0d0fd988e88 +4006,239900e95d872a5c +4007,68c6d2290d072a2c +4008,5f8c29d8d75a6a76 +4009,210026f763b24c39 +4010,33df3b4382cbde66 +4011,34497078582ed946 +4012,8c9675db6d2f81e4 +4013,872ae5f60147cb0d +4014,5cbb4137cf2fa2b6 +4015,a52ff89e03c82297 +4016,8113a4678dbe732c +4017,27c17a7491709770 +4018,ddb1c2738751e31b +4019,dd612f32ee6f1a92 +4020,b6d7e269c99c3685 +4021,eb9b3f246a66d9fe +4022,9ffe38ef95047475 +4023,64b19a7c4a46a10f +4024,e3f3bde5ce96b2e3 +4025,c26c595ab8079ced +4026,8790313f4c1df63e +4027,a6477506fb26e570 +4028,e4c084dfacd88c83 +4029,877fb042bb6f2884 +4030,f4c779604ea67527 +4031,0be015bd8cdcce5d +4032,0a345f518c21dd2f +4033,485008c98554be8c +4034,1e39a911da9bf232 +4035,e48ca9dbc86bc1c7 +4036,a96f1647478b6672 +4037,8170646360dd5ecc +4038,7b6c1498026a9997 +4039,51db179c91705b38 +4040,1560f1a29cdea204 +4041,7db1ba7f33a39dc8 +4042,a9bcf1b60ac6599d +4043,a21d7b2fe4c8e609 +4044,d46990d23ab85568 +4045,257a1e31fcc2ee20 +4046,be7933b2f22ae461 +4047,e621f40b7b7bbbf4 +4048,65d0c298d119d768 +4049,9486780715ec5475 +4050,1672c127945220e0 +4051,8b07d67c52118b01 +4052,c88ccc547355bb3f +4053,aded24d5cdace938 +4054,7cd69a6b024d0c2c +4055,dc40625c017ba828 +4056,ecd5c4a0d655708c +4057,b4e88605f3aeadcb +4058,326e6a41fc4b589d +4059,7a4056c13491f0ae +4060,2df08e3236188fcd +4061,594d4d16a2730697 +4062,13137856e33d6726 +4063,a57bd9f87f14f09b +4064,76652f35f0b87966 +4065,f18d91ca192726af +4066,de26422ed54d48a0 +4067,a7d2fdb7b40424b6 +4068,7773fc181e5c1e66 +4069,0f69c0a4b00bce9c +4070,a4051c6d9d5bf98a +4071,ec1e4a4a1d8ed6b6 +4072,ae01ff2c2afcb17b +4073,ab1553cc15d384fb +4074,a83cdc1a30eae687 +4075,f2f8b31a2b8304e1 +4076,684733004f0e1870 +4077,e96be756c5c96287 +4078,82d01d0de133055c +4079,a815ed6fafd6d0d3 +4080,c273b92e686a7f5a +4081,b265c2dc6e25ee33 +4082,735e72b5afdad1c1 +4083,fd7fd4ab02f1c772 +4084,ab57e6d19c8ae378 +4085,278b08c1dd43a8b3 +4086,fba6216e6da1057d +4087,908d6d86634e691b +4088,ca082ee22a83eb7a +4089,1f6ae21a7f0b83f0 +4090,e58178aeec02533f +4091,0d9b89e99fcaa417 +4092,4fddea9d3a51c5e4 +4093,68881fd90e1ef2a4 +4094,3d2ac44ce26a5434 +4095,da440c157b08d277 +4096,7841f956ed8faefc +4097,9752f783bb0ea480 +4098,25b0c77e5510f96b +4099,c23808ff30372505 +4100,0a19fe556b844036 +4101,1b7319a3403978ba +4102,a21c938e437af4de +4103,8a6dd473c2b3f35e +4104,f73b2d29cdae9109 +4105,084f827e9be749e8 +4106,ecb3faf98452caca +4107,3701e20c5a775415 +4108,e5e0c14087d9875a +4109,07bb498abe33b360 +4110,ac27f6ea7f223140 +4111,fb8663854f03332b +4112,cb55841c50952add +4113,f52c120d4ce53dd0 +4114,9bb1a9b6ec69c474 +4115,24df92b1b395a161 +4116,5ff95073dfd1cc5e +4117,b4d02fb34c4ac1eb +4118,f801eb5a96edd441 +4119,7f11a5bf785e49eb +4120,4e0f54014bf4db16 +4121,5fe883a60a302ee3 +4122,ba0c8d185a51b55e +4123,c0f8be6bcd5ef6b8 +4124,95632a9eb0115c5b +4125,4e6a567cb18657cd +4126,1f0ee899973b4574 +4127,2dc3f1c085952e79 +4128,fb23f216efc5f330 +4129,03a61438d5b923fa +4130,ac9de4d8384b1f35 +4131,615b6302b5116b03 +4132,d56ea2c2f801119b +4133,5fa642fc8000523e +4134,d3fa9ab188c21f76 +4135,e132fe11c041ba8d +4136,3eddbce42f0588d5 +4137,7dc8dc9031c69e90 +4138,d1fd9321bbb2b6c8 +4139,a4b5c9aa281a24ba +4140,7a83d21fed44a646 +4141,10d84b9134c696e8 +4142,5cea9252fdd97da1 +4143,4708b4abb1bb79ad +4144,67ecec75d69e2be0 +4145,e87ffd41c1747adf +4146,b7aefea7feabd667 +4147,e9b37b8b7f22d437 +4148,d0a445348d10e305 +4149,11b5dc24183050b1 +4150,f847977b5d4122bc +4151,10c5c70f3907790f +4152,68065ba51c9f8efc +4153,5cc46425cec4687f +4154,aa2542a6077b3e3d +4155,0f158940311450b1 +4156,383a73ac3d2cf244 +4157,a6ec41c37a7bc749 +4158,e83459b6d410ac0e +4159,e4f8c93c180898c4 +4160,39b8174e1ff2ea93 +4161,a1b98791cf910c23 +4162,43651df6ca0f81f7 +4163,a9b24474462e3732 +4164,dceede68a393084c +4165,1521a627b0096e6a +4166,278bab6bf8ee9c23 +4167,e9fb28e65d28a601 +4168,25b6eee14d651e95 +4169,d7c2a34460d9e2c7 +4170,1a9dea83d2f315ca +4171,3ed8ed03bbb83760 +4172,a692b3112864d20e +4173,f43e91f63d24a61a +4174,650d0beb345998a5 +4175,9e6159205ae3800e +4176,9fcf02e4c2d9ee09 +4177,b84f0f23a860762e +4178,f991795d02a80d27 +4179,b27b618d67ad62d1 +4180,385c304d6a4b38d3 +4181,02e1c3ecf64bd3a0 +4182,1736b33ae8ae01b8 +4183,c618d6c6cd11b057 +4184,cd1d3d05b1a26109 +4185,2f7eaebedc49f31e +4186,20a1e03fa4564419 +4187,dca3b99eb140a473 +4188,190c16a3c7c0dffb +4189,bf839e3790eb124b +4190,69308de96e062154 +4191,21537c8793d72ff3 +4192,89234e97cc0d9875 +4193,66c2d04a7e06dfc6 +4194,c6847bd24cbe776c +4195,4912ea3185b5e513 +4196,0fc6e192196d679a +4197,f6f576e0f583fa7b +4198,7f02f3f542a947fc +4199,3bec84e55d423cda +4200,6425bcfe531a6792 +4201,72d1c06cf6ff2207 +4202,e40be10a51565259 +4203,d395814ae49a818b +4204,21e7fa641aba9615 +4205,ec59b2e1b4174521 +4206,40763d24133b0f1e +4207,198e0bd994368b6d +4208,bd2bdceb25f4b27f +4209,46324c6f226092c1 +4210,4ad48f868910cf2d +4211,18c1cc34e4f093ba +4212,f0deae0c629807e0 +4213,62bfbaa8d331d6f4 +4214,45293e21edcb972b +4215,c836fbed0c4134c8 +4216,803af8b9dff0d955 +4217,dd17c0c6b0d9f262 +4218,bdde070cea9c42fc +4219,01b9805c7eb4f65c +4220,67e086790f394f27 +4221,62d378e1e377b11a +4222,aedd1f1efb965520 +4223,f83cc1199fbff558 +4224,fc28ba0d87c75b8c +4225,dca01c2672c707d1 +4226,fa3f65c78b15154d +4227,e62fcdcaaab4c04b +4228,b77acfc2f20f2fc4 +4229,40907e904271bc68 +4230,21a80e4789a547b5 +4231,d6755748ae08cdc2 +4232,5612928cdb7d85d1 +4233,cdd6d9b135e74197 +4234,e7001efcc07cbf79 +4235,dc21b584484f96e9 +4236,158378d08be1068e +4237,f71d8cc7bcf0f73d +4238,2a14f9fd713171b9 +4239,d7ed02d3e4899a8e +4240,8db3714d8dac3f27 +4241,a51ccb9fb263c614 +4242,b4732a2648d950b6 +4243,140cf32e352bbc1c +4244,5170fc734ea1a3cf +4245,b5ade8e7cffc0674 +4246,bd770a1d1fe42827 +4247,5a115e3e895c69d0 +4248,5599cdd1e3088aaa +4249,0656add8a511b717 +4250,43a1e74a01d96f47 +4251,a9f13ce3bbc7d23d +4252,300605972413a046 +4253,ed233a9519ccec95 +4254,a608be0edb048c35 +4255,7eca41ea6820dc70 +4256,1607fb25fd2042e0 +4257,3358524789c0a91c +4258,e0209df9f1fe6a5d +4259,77cd0b58b5cad16b +4260,5225b9af32315295 +4261,84dd79e44eabdf1a +4262,6151ff074af283ab +4263,edca47b8bfb12235 +4264,d5796c91ddd57f9e +4265,e55dc13178b799bd +4266,d74c7c198b36b83d +4267,2828cf74e2c42281 +4268,8514ec172bf78192 +4269,06a3c4916147458d +4270,a59bc2d380a01a20 +4271,d9f8d8c34fb6d35d +4272,fee654099ff505ee +4273,d52171dbb925ed7e +4274,f369ab76a2f52358 +4275,225de1aa415f8d34 +4276,5d8d629b8fd20800 +4277,ce8068e5c70dca80 +4278,c1614a651d53ad3c +4279,b77e02a0094ea004 +4280,ec609e4f4d8d637f +4281,b998e2d5500f606b +4282,8cafd4a71732d89f +4283,59a95c5f64dadf10 +4284,7cca59495e9b8259 +4285,3f8594c8312593d4 +4286,d177fd8b538e96cd +4287,fdf60566a1576794 +4288,bb1bfdd5c84c5f04 +4289,f74b8a61c4496291 +4290,8d8887207993359e +4291,9176bdc79a67e02e +4292,05fb20b7bc391a4e +4293,eb1ac61b78b17ecd +4294,207aec282c6b9eb9 +4295,3d7420fa4d736b61 +4296,d7c8140ee57b5093 +4297,68796434f5d63a5a +4298,e0e0ae64e762b0d5 +4299,5933d066eb8672f8 +4300,a73bb77454d72df5 +4301,8d7001b9b5a132d3 +4302,4d9e49decf3cdec1 +4303,e6c055b654c00162 +4304,ff48ecc76135f27c +4305,594ad1b1569fb35e +4306,89a4d2eef2b99900 +4307,6ba7bed4d4230f00 +4308,3c60942f21f26f0f +4309,00e0e89ed0132828 +4310,d5f0c60ddab48898 +4311,b5dfe4319a9ef054 +4312,370aabcdc8ec7110 +4313,daaf5c295edd52e9 +4314,bb76f85c40a36e16 +4315,7fceba4683d202bc +4316,a24acc2d4dc96879 +4317,61354ba2bb7301d6 +4318,3d19cc2d8a971ef7 +4319,46b217cfd363b51c +4320,dd4ea7f7f9804091 +4321,4d1f392ef506754c +4322,0d61b9a9be0b6416 +4323,5e620c4e214511ac +4324,ed95546c55026f94 +4325,0c8106feec93ddb6 +4326,25117d561438fd9f +4327,01acba0c0eef07cb +4328,95286c55b52b1f29 +4329,d2fef48d80323d01 +4330,794aaccf2a7737c1 +4331,b2a0dbe28b5394e0 +4332,cc4dfc13e3293300 +4333,2a14698304bcec9e +4334,1b556c14e0ba1239 +4335,ec16bd5006096d22 +4336,cf0dabe69bda8001 +4337,c82c79d0fa24309d +4338,6ca3a083db538234 +4339,7b284054fbaf4a67 +4340,61bc022cbf82e331 +4341,74e423275f2249f3 +4342,603bad819813f5de +4343,d0c3b29d0cc78ab0 +4344,1cf6c559286c3ff1 +4345,9fd8ab0d36ea94f0 +4346,b487b112f8c9a464 +4347,f239a91ea45b83c5 +4348,f89487da8b0cb7a0 +4349,460dd22058d06572 +4350,7238a403c4cd9a5a +4351,82fd4fa802da8d68 +4352,0fbdf4a616687cd9 +4353,a019690e32ff0f9b +4354,4ca73d587a32acab +4355,0b27273ad2005561 +4356,038a856c4ee7ce03 +4357,e93354a755067296 +4358,6abf7943cc4b3006 +4359,3ed7e1e372765d3a +4360,ffa4fefac5bc4d5b +4361,2745ba1c8a15f679 +4362,1029b15cb51c6c6b +4363,705b4a9b1c39906e +4364,72d9df186e39ab10 +4365,675616e2fda7864c +4366,79826ff07c7e6123 +4367,f6b6917112e2c46a +4368,3b74c8c1cf962dab +4369,2c57bbb0f6318204 +4370,aa229060e384c197 +4371,1d1020761a54aa86 +4372,6d7c97dbee9c656e +4373,d678fa7cd03ef739 +4374,edf25df9f4e826f6 +4375,1649eadee5131e1a +4376,d94afac2b18e5c31 +4377,d4baa4cfe6e767bb +4378,e01c0409a9222203 +4379,0e7da1b726342a27 +4380,7223c33aa0b6ef60 +4381,8c74574f764fa486 +4382,3be7a8e2b58015a7 +4383,fc015ef779ae6488 +4384,a719c41a8f8314c4 +4385,1732749bfff76a90 +4386,c97c0686f75979d2 +4387,bd88909cb7932f0d +4388,b1bd4857a1ca6f20 +4389,462fd86b58ed203c +4390,2716262119a7e174 +4391,006f6be2dcaacf5d +4392,383029f46eda73c5 +4393,9b32d1253db7c750 +4394,04f93875843c70fc +4395,98145befa0d90c9c +4396,198582a98301b394 +4397,bacb7a99f7bb5374 +4398,b975efa5fd1da2c2 +4399,82615262066de6ff +4400,076a8ed4908404b2 +4401,7f47a963790529c1 +4402,160b59b5d08c9f8b +4403,3f37be15b9d74a64 +4404,cd3a2e41fc7bedc1 +4405,cc2029143e960d19 +4406,4b4859366cea4160 +4407,c8514e8b78bf013f +4408,bf8e55adf382e8e5 +4409,ff397a56d1e99525 +4410,bc4c29b44a799186 +4411,11926f06e2760ec7 +4412,084ea138d1e6ad33 +4413,d8dcbd591a0aea71 +4414,1b2aef0c6830ca81 +4415,f884725bb9b627a1 +4416,69e345ae82b61b5b +4417,85898832b59fad9c +4418,ef835e57ab6675c7 +4419,99ac0494e54f174a +4420,5c52b2346510197b +4421,21fb310009d8605c +4422,ddd37da880157789 +4423,3a94c4fb442b7c41 +4424,376826fcfa133c10 +4425,71cddc4a792954f0 +4426,19bfdf218f7062a6 +4427,75228242a6bf06f9 +4428,f973bc724eef6db4 +4429,05784c48fbb9a38a +4430,b401639b6da61b01 +4431,05bbe114d6f99bf1 +4432,22d3f6b89b4e0ecf +4433,d04d8b829b13027a +4434,113e6214e113fe92 +4435,320876ca67eb6e33 +4436,e0eab61e43943875 +4437,49c5f1e17c5daba0 +4438,25952cb3d8a22a98 +4439,cb3ae23661b39e31 +4440,612e0e798ccbfbe5 +4441,459852b04eade418 +4442,05c7d96f00803287 +4443,7a7ed8c60ae16b09 +4444,7a00156d4d6e4970 +4445,22c93544c35a8aeb +4446,e5ad4f0e651b981a +4447,8b66c01768f31f55 +4448,3d96abcde20d304d +4449,50ccea621317312c +4450,59e9a0d75a24c997 +4451,339f98e442e813cb +4452,2367636350066eb7 +4453,50751d3ac7096e9e +4454,53456f1cb42a331d +4455,74253bc6e797a273 +4456,74db826df98f5e58 +4457,3013955ea4c5d491 +4458,0d1e787f13e4ea1f +4459,a3c5a748fc883cbd +4460,0d0aaa47e2142430 +4461,08c38b5ee70f37d4 +4462,e8b2b8880922e87d +4463,b365c783e9c9d72f +4464,29c6e950722c7f78 +4465,a86a3d60be829b68 +4466,fd59a9325f1a33ca +4467,5f24b171efd29ac9 +4468,37cf3e99a102fb38 +4469,fd59e03c5ca6b42e +4470,df1b959eb03ccdc2 +4471,f7f48d041819ac6d +4472,016508e853b6ac7b +4473,d8065ad2b8dce74a +4474,d8f7211797c7daef +4475,864a80220458adb3 +4476,21ebd231e3b723b6 +4477,261d43f0f89de5e8 +4478,a8cc90f2490964f3 +4479,058ed31ae128dafb +4480,70943352dd10d5d7 +4481,0d2407a1f29b43ba +4482,37be7409bd696e32 +4483,ee93df06e84b5561 +4484,c1fe7b3c37564647 +4485,d14dc0eba90cf594 +4486,6a5a3413a873e465 +4487,c31903c2c093afdf +4488,1f68898202f38b71 +4489,07c1a4a5d213e683 +4490,c30faa92fa3ebdae +4491,28e337cdd334462e +4492,639dc596c3b29755 +4493,316348f2afb70215 +4494,4ca650eb8e164c24 +4495,2bd2f88096c7208e +4496,6afcca5ad4704391 +4497,61d1f503f4f180c0 +4498,a5f20d0cca75c0f4 +4499,d884a4b16ded6458 +4500,c8f9a2e790f55a20 +4501,60183c3f5949fcba +4502,7484382588df7a6c +4503,8d3a5d3f55510f72 +4504,0b5374927333468b +4505,b11239b81bcd7621 +4506,c33a7b62fbee48e3 +4507,284833f0d8328658 +4508,efc31ddd011398cb +4509,3f6780108ba99b7e +4510,31d87d66227df0b8 +4511,db97a86913e51155 +4512,7fb652c02e2a23ca +4513,de9c9324522c430a +4514,670d2b28f62c3c60 +4515,7ef562049a93f886 +4516,a2490fc7a27808b0 +4517,a4214b7f0617381b +4518,43d87a0d444c2e99 +4519,0bfe6b58ef5fe16c +4520,702e5b2086d98129 +4521,5f850902ead92c33 +4522,6ff60b40d3b2e946 +4523,4d33d63af1c5878e +4524,32cecba4b8a6059a +4525,e96d220b58d659c4 +4526,ca4c0d56741ba185 +4527,b41434ea8913fb9a +4528,981779a62dd9660b +4529,24bb0cdcc79331d5 +4530,ba2e45c1bacb9c0c +4531,5146072842bf1b16 +4532,700a49a3a2959640 +4533,ddba3d547027ea19 +4534,1c4abe18d1def7d8 +4535,b01f6cc525b8d24f +4536,fa5508ecfe4f9a8a +4537,14b8ae9418eeaa49 +4538,12dbc8dda4ca4d4b +4539,20986da2cf6948d2 +4540,479ff063340ad532 +4541,479b5be0fd1f8545 +4542,69ba6aeb76ff8693 +4543,a8102e00ae0d64eb +4544,801e2a3df8ffd037 +4545,217b3ee9a55619a6 +4546,86671355ed9a7b27 +4547,059825aa0ad6cb22 +4548,f1362992c085b3b1 +4549,06bd35007fbda2e7 +4550,b11a010e3ef73f27 +4551,73e1bc1c76261f89 +4552,9b015c7bb76567b7 +4553,bae41eb10048afc3 +4554,f8dd9a25072cd140 +4555,ea0ca86cce801a62 +4556,c60f31b18acd032b +4557,f2e232a3d15fd2b0 +4558,c440aa69ce897f59 +4559,bd597ef09828e790 +4560,05215809ba1cf2ea +4561,e9dc98c4019dbf53 +4562,55a31ac14ca9e055 +4563,6e6433a7a18fe82a +4564,39fdf6280e861406 +4565,5582005f35c1b38e +4566,ff313b6286ab7186 +4567,f24feb560e4d18ee +4568,84145c91fa2adc04 +4569,4af2835ae1737760 +4570,d346a14bfb7a0484 +4571,0e1f4d541d24ffc7 +4572,8b635f67a956dcec +4573,a448cd75e7b93539 +4574,19832ddf5a13ad05 +4575,f76a4bdeb9360d21 +4576,43122cfeb16eee9f +4577,91c53ebe23602b8b +4578,0ce84f610c8b669a +4579,9a5c5cd649201f40 +4580,f9091d672fc2c064 +4581,e84a491eeb6b973c +4582,cf8121814b65ee1a +4583,73215fe32ec117b1 +4584,d6014c2f9f09efcb +4585,293defb5644c14a1 +4586,2aa9b69ade482b37 +4587,55b063038876c536 +4588,612442995cf8b6ba +4589,7db8401ae16b1b30 +4590,4525f3d57c6117d6 +4591,592ce53fa84a790e +4592,b69e99a0d76cf8c5 +4593,b61b4edd0d45efec +4594,870ad0b308221491 +4595,81eaf4cc0ff1750c +4596,b369f3759994fcb2 +4597,9873f4dcf89d4d61 +4598,bf0c0b18d49fff87 +4599,886bc85b12a4f0f6 +4600,d2e96a3fcbbec76b +4601,cd18a3d4d0919a82 +4602,a1c8ebb4cf56df97 +4603,185bfebe818cec41 +4604,f4b5b58fbaea66d2 +4605,bf55c8f7b0d67afc +4606,a705ffb0df68be2b +4607,de6498bcc03e0b43 +4608,5c3d8d2cc3b3954a +4609,31e15cdd67d92e10 +4610,c3d0ca39ea9a5d49 +4611,f1754b2f82ecac0b +4612,faa1c0a3d3c1a6bf +4613,f727ff7ee0d2232f +4614,2bfe6b68c3a7c69a +4615,6a05fdd31601c420 +4616,f5420184d6285be0 +4617,57d113437f77f91a +4618,6afeb8431865ebfa +4619,6b018dffdeb4f6a0 +4620,f81a384ab6ebaf38 +4621,9326cea4f8056d2b +4622,a5c3bf00ed681bf1 +4623,1b3acb06590a61ac +4624,4b20424bc54c238a +4625,405a03b1a0221c7d +4626,b9c1e91fcd75e438 +4627,f8afef6e2454e86b +4628,d76e584ca51f808f +4629,c15311abe7106e92 +4630,1345640fa9ce2326 +4631,1a74542622b91943 +4632,0b6f74416a140f12 +4633,02b7824b1b23b91c +4634,a2d9493bf80e2e90 +4635,d7fcb8e65f1e08e3 +4636,14b0c69aec8273ee +4637,5a9cadb0431993a5 +4638,10524a63641fbb2a +4639,def37a1b3d9e7be3 +4640,db23cd99a880b108 +4641,2daccb932335daea +4642,4f1c0a5be4eb7516 +4643,8a5752ab009f2b34 +4644,f256c5b39c206006 +4645,cc5e569a47342daf +4646,0501520e1b2e8f03 +4647,0b142d7a8cb93031 +4648,2ad4c1064ae70dc9 +4649,ef7d81561bcd803c +4650,d4ec8db7d03fa8ba +4651,a337c6bdffa0d928 +4652,c40a40e231177d5c +4653,abd0008b60f8e60a +4654,26128e20bb4f82ab +4655,7d81b2f43a441250 +4656,81b40791b858f0f1 +4657,103b182fae48b2d9 +4658,82d75e2640b76dbb +4659,1e78b634e917eba4 +4660,fc111c234631e8b7 +4661,0ae711d7c7c9eedb +4662,38da3e72f9b91f38 +4663,6f8d1598c5757a88 +4664,01bbacf46ec6906f +4665,a84ba889c03d8eb9 +4666,d0fd5d8271a4d822 +4667,eec279a2c8ffe336 +4668,ff026696697093f2 +4669,5d5539370d38a3dc +4670,ee75202b256ad37c +4671,b971ee7c8c1fbbee +4672,8bba228ea7ed8d50 +4673,39769d154620c612 +4674,7ca4fd9d87b87a27 +4675,873e523e1c945812 +4676,dfeb8fd163aeb6dd +4677,742dbbf6b038e22d +4678,ad177749296fac1f +4679,9650d11ce067892f +4680,643a16a7e41c97a7 +4681,ddc12e15d271e2b7 +4682,5e5e6913cc27ff07 +4683,dd69856d11adb1a1 +4684,18751904841da748 +4685,1697bb20dbf17102 +4686,98a3e8cb1566ac20 +4687,dbf8535546bc541b +4688,55be5dfdd9801daa +4689,9e68d59bea6f596b +4690,3bfc21f44860526e +4691,12d9d49553503b2e +4692,350642ca29c63e75 +4693,c7503f51e2d1c92e +4694,ebcc2f3cd66fa647 +4695,0fc82c58d24bae6b +4696,6e8f04c182182df9 +4697,5d06bf1c5902bdc1 +4698,6108c2fe20865ff9 +4699,6d7ac101f1882049 +4700,4ca560421ec3b435 +4701,fcd55fda1a7a099b +4702,cec592dd160158cf +4703,c2f34cd74c7ce52f +4704,2a351caed3dae544 +4705,f9f5d1760e6c2fcd +4706,d072089aea51b5af +4707,89fd480d4d998cff +4708,9583b0f811b9ca20 +4709,09537a43f54b947f +4710,31a03b4c5ed0b160 +4711,d862d38486c0f9dc +4712,f336467319b9f419 +4713,8d78bcc87d29cb48 +4714,d4ab1906f73180fc +4715,0f1e4edad363319e +4716,d4bcd7a3aaddd659 +4717,0644da2a188f00a5 +4718,2b16b202a41670c0 +4719,8248d49f52d36137 +4720,6a6e098e48a974ab +4721,146494a4ad50cf3d +4722,15d84282e6526379 +4723,3499ce4bea31924e +4724,a425d60087eaaa7a +4725,6970bd0d971dc060 +4726,1c92d41c5ea04412 +4727,df15709ab5b91ff9 +4728,45d6daee7a81a60b +4729,3d0c3399dd0b5c4d +4730,ade11dc1fa24076f +4731,d27676a353060bc7 +4732,f18d46297b7ce146 +4733,e2a3b74933e46ea1 +4734,ec2a89b7667e8222 +4735,f6a77d21152508d1 +4736,c63e7c3741e1468a +4737,00186e516d29bd95 +4738,2509512c0dd0bd5c +4739,5166f9e9a3718186 +4740,6af2f6b817c867da +4741,78875f88241f9da2 +4742,5a9ff36c475adbd2 +4743,d43c4209094818f8 +4744,682266376ea31d4c +4745,4c83e72157cbee36 +4746,7d8cec55d7592175 +4747,39c2419e06d0e0c8 +4748,a1729ce57317dc4a +4749,cad23d213d862c04 +4750,b2f5a52876831331 +4751,1a775add2122ccb2 +4752,a5b518fd3cbb0b5b +4753,5dece07fd9129472 +4754,c344b143fb978704 +4755,f6bf3c93cb4152ba +4756,a610400105e4162b +4757,265746c04c3e650b +4758,7b17f5f95f26bace +4759,f5947b4dc1a4243b +4760,c26d7e66e6e2fbe6 +4761,fa8556266867f9b0 +4762,7f2c6edc63416775 +4763,61b081198cc44ee2 +4764,802c1397019b70f7 +4765,70446d47eb92b873 +4766,44378e785230bc36 +4767,2b47a3b1f4b85a13 +4768,f8316582db45ed6e +4769,dd1d1782626bb54b +4770,552896935eebf8af +4771,5b5ed88649608109 +4772,ee39ec7eae9af0e6 +4773,6c999bbd34e84aa4 +4774,4394c94a1538a22e +4775,1a42c57904336fcf +4776,3832191b8dd41e7d +4777,6855cb67414c84fe +4778,5029d90b8c8944cc +4779,8edc726845c236f0 +4780,70f425aec7515bc5 +4781,32d64d24e09d56b3 +4782,359ed5482bc403b7 +4783,58ed2fee0e66db66 +4784,dac8e55658a6f347 +4785,fb41c0bbd739617f +4786,9ee868eefb3db1e1 +4787,a7fd05d7d67e8fff +4788,a00c225c0c26c10f +4789,628eba87217bce8a +4790,4b013543c407c8c1 +4791,b140f1bc8ba2b093 +4792,77a2ec9f6adebe9e +4793,606a48355f676908 +4794,fbba0030ae0be5e0 +4795,c8c63f85b99cfa6e +4796,2b7aaf01facd3bee +4797,ebba813c91fbcbcd +4798,b3b3adffd834cd45 +4799,5b33f70d0643e5bd +4800,151cc1223b1a63d3 +4801,cb944e0bf33a3c68 +4802,38b00ed80b661410 +4803,a8455119e6efc9d4 +4804,b6dd49ee61888ee3 +4805,d3afcd3fe624d474 +4806,a6b8c94f9b1c5fbb +4807,9f2539c838a18152 +4808,32ecd454bca769f6 +4809,2f73d5ac19f74ba7 +4810,aabbb555853e89d6 +4811,820477b870f34d84 +4812,9e617aa423363ba5 +4813,7e6dd7aba546cf7b +4814,61ebd447ff227264 +4815,b12324709a09d34a +4816,58a62158f9ccee37 +4817,97035be9e3917f76 +4818,c9529e605e401ec5 +4819,f2d9793aa9c65682 +4820,71200c6c0a3cd0b2 +4821,84440bdf8492adb7 +4822,17fdf972cdfe8d40 +4823,bfe4fda8e5c39386 +4824,353a8f3bc9cac3fe +4825,d2d73a494c0955a8 +4826,3dbb062c1ecc4ca4 +4827,789de29220726901 +4828,4181b0fe346f2bd4 +4829,8fb1108376919db5 +4830,0e3c378790ec93a2 +4831,9d7700b9031acdfa +4832,5dd081401b1799a8 +4833,17a8bc2a04ac0af5 +4834,80163ae7e708352d +4835,71e91c6f4ed1bd09 +4836,06dab2b16cdb98f8 +4837,c171cb1264860cbb +4838,a8a5b08d2e96298f +4839,b356f80eded40e50 +4840,c4bedabe4f28a9a4 +4841,8f7a926140a8a069 +4842,165ffd1562020b9d +4843,c9d18910180da8db +4844,510b26a0c0c65fac +4845,aa467336ce7f0596 +4846,31d9ff1503d2c5cb +4847,216e9bead598bcb6 +4848,6bdb248a8006f99c +4849,cc118dee351ed6ae +4850,024d3b17e41a6923 +4851,4a4a679ae6b4a5d6 +4852,c1f3cee47df1f917 +4853,6dc9b5555c276b84 +4854,84aa25fcd4eeeacc +4855,7b0b5d2574a6c6df +4856,4df94d4d53d3ba17 +4857,7a88fb691b5ede8a +4858,efa234cd78fb7703 +4859,bde6d0ce58316c51 +4860,518bc433181d223d +4861,e17da52ab8698335 +4862,32fe3795643a17ef +4863,234b9e188d6a4002 +4864,cae91fd682c37158 +4865,7d3d06b181b95ba7 +4866,03501e778c67a9f1 +4867,8d8d7f8adb1ae874 +4868,dbd3099abb708a01 +4869,af3e2d5d27751758 +4870,3133e1fac5c747f0 +4871,37164ba3c90bc5c9 +4872,74c756536b420ff6 +4873,ccbd5d35eb96e5d1 +4874,e041561a51dc5ca0 +4875,b50d15143bca4256 +4876,3d92113e513432ec +4877,87459df27b2ef5ab +4878,c4254c9d0411d3a6 +4879,4675569b16be983b +4880,089a94926504c057 +4881,bb1ae808d0784d8b +4882,03172547f9256ff4 +4883,3c4adf69a848bdef +4884,7ad90470f279029c +4885,e158ef419a947698 +4886,2d9affe974d5225d +4887,c4d28889bb8f961a +4888,8023d801d068cc2c +4889,7349f9266ec8ce67 +4890,8e3eb796e039ea4a +4891,81ee7c2a1d2bf0b2 +4892,f377fced60ca2c1a +4893,1381ab8cf0089bf7 +4894,c7ae1c166842e9ca +4895,fc950afce519d287 +4896,51ff8e661b0ed29c +4897,0764824c6301365f +4898,19144e599dcdf5bc +4899,659757b46071e4d7 +4900,c62fc55ce25f1d16 +4901,9de0d58cf378e684 +4902,1c72d5e7ef40bcf7 +4903,5fc34784485218bf +4904,3b4a5953eae35437 +4905,87dbd8a1ba7aa9e5 +4906,3739bb87537a5254 +4907,a2dc4979ab9d6ecf +4908,8d54e4e0270ea16a +4909,2e270558c3347b16 +4910,3e807962bff772db +4911,1aeb36654a5b8312 +4912,7499bd7e5f21c869 +4913,48ac29901b7c364a +4914,87f5f920dde76f61 +4915,f824c273d2a0fe5b +4916,a3c5d2f12f5ced72 +4917,a8597900c6a2f95b +4918,f76198f3810b8e7f +4919,0d0b5099cd0790ba +4920,e9548a3ecb9335ea +4921,5c3164ed8374763c +4922,1fd5a5a8903adbfb +4923,5bee4df939fcf57a +4924,521c360df1820ac8 +4925,5ca01b8d5cc9fed3 +4926,bec595b2761279be +4927,ca6b6434382d44d0 +4928,d6fe073d5159c598 +4929,063f344851349d00 +4930,1d7a7b013551ff0e +4931,5734eae0a943d8ec +4932,e969e5155d2f6cda +4933,3d5c3448f823cef4 +4934,89900e8c92c0441b +4935,a4061f6c1476be9a +4936,d20955912c73f9bb +4937,aba3a28a7e795e64 +4938,99360c735efc8bd1 +4939,2e15db021de42b40 +4940,9b979d48c496d28a +4941,8164b1bfc2c6c00a +4942,a870ff4fb23b6db4 +4943,80b7dae2de3bfb1b +4944,da0b190d570dedbb +4945,6f9475ffb12c9a0f +4946,d246a1831513460e +4947,d72280788be5fe22 +4948,048178bbc5482a55 +4949,bed3f82d79e92c54 +4950,238fcb21af76be43 +4951,1c2bbd5363a2916a +4952,992c5e4ab3b8faf4 +4953,6a9648d643f42d47 +4954,1e281dcc961bb533 +4955,5d4bfdfafc588ca6 +4956,63008a3ade22f995 +4957,a920d7bfc847e380 +4958,f0e696f13ff7a8c3 +4959,732614d75b14a6f0 +4960,5fc7195e50abfa20 +4961,96087609b1ae49c2 +4962,1dfddb80628d7c4f +4963,d26b5811e0215f57 +4964,2757cf9e994d0a4d +4965,5c8559c518d5214e +4966,b37d3b3c4598df65 +4967,828e295b0cb95352 +4968,4de0397d13b8ddba +4969,d2daf435b2ffa566 +4970,f85fe600d907ec42 +4971,b8eeeffe02e74cbb +4972,c5976034f7d6dc6d +4973,7832134349f2182d +4974,adb67fb363a276dc +4975,af4f90a86d92d5ab +4976,439c5f7e6fad8099 +4977,3a4e45bfa633ed72 +4978,3792e29a38489ed7 +4979,fc6576c254a72242 +4980,b19b1ad04d277a97 +4981,bf196ef78128e939 +4982,b618080bb0be1151 +4983,f1f8aabf83af471d +4984,d9ce4fc8b8425c3a +4985,5957d453a9a29690 +4986,7b4800f0020a637b +4987,d1b39139b804fa55 +4988,c38b72f95676e939 +4989,1ea588b351cc2aa0 +4990,a8e2b9833953aa89 +4991,4d02f3b9ae204998 +4992,d96c493e8ff5bec1 +4993,c4addd10eb8b224b +4994,685abca463c2e466 +4995,41aa571f450838f5 +4996,74d51af1c9aa5254 +4997,5405d09bb224a171 +4998,7b244b1e24297e46 +4999,78d6732c7c5982c7 +5000,69509210ac9f8394 +5001,f3f74e4f9a010722 +5002,6183decd53ad9384 +5003,432db3cd37f2d99f +5004,557165136bf4f61b +5005,4cf75869ef85350a +5006,e87aaf0c46b02861 +5007,dc599ca9a42c824f +5008,d74b1309ce5d8e1e +5009,a99c9820e57832cf +5010,dff3ffd478b95480 +5011,b9adfc861d795b39 +5012,e6658e7a5b172c37 +5013,61dad7d31fa3c73c +5014,7651c8cb02a188a3 +5015,11aacef6d8ecdc8a +5016,1d8f28a3f3d3d275 +5017,0d755468a50e3447 +5018,4cf0564d3276b9c8 +5019,49fb41fb980c0edd +5020,7a60d0919efdd1ac +5021,63b8ed04a6ffefad +5022,8234f28ec4485a00 +5023,1d2125500c627fea +5024,6d744a01503e1696 +5025,1996f8eea48850b3 +5026,fe571c1b6d704fb8 +5027,b1e0e2049afb3272 +5028,d9ba2b316b271bc2 +5029,091080f2e3495049 +5030,12e914a14fecd060 +5031,e48d11dc985d9f3c +5032,9e71f018c59a5534 +5033,3bcfdce930310d37 +5034,fb0045ea2b6657e7 +5035,19d7b7259c3c3652 +5036,d953bc672bf8bb83 +5037,58b1032f7ff3f192 +5038,6dccfcf95ec73976 +5039,82e827417b08cd5a +5040,d8c5cac48e2d5c86 +5041,9069c16d2ff8eef3 +5042,e73ad9aa218b2b69 +5043,99d16cde46eb1e30 +5044,02ab95599f330465 +5045,a54a9014f1e1b37e +5046,38c4e1d8bf02271b +5047,5a0eb44001cacb84 +5048,e8d9538ae2107022 +5049,6258e0a550956b2c +5050,ef5723e121c6f6a8 +5051,72e2211cd036e5b7 +5052,c01354bf848dce21 +5053,bdfad848fbf3024d +5054,f774c91a22250dee +5055,fa20ab0a47adef39 +5056,d4cb384e8139cf6b +5057,7fec8290bddf7b13 +5058,f9a3b02f830612ea +5059,76e0928d0aa4a2d6 +5060,8a9e3f12f3839b2e +5061,72e220e773aaf6cc +5062,b39c5beb7f12758a +5063,d084db559512a6fc +5064,0ba6e9cb61eff2ce +5065,b053110755ab2b5f +5066,f33c8967130bfb93 +5067,c808a793eca9b3ef +5068,cab07fd9ed873ca4 +5069,7f069cde0f865ee4 +5070,643c9cfb92f8b6d1 +5071,5c376c949417d0e9 +5072,50c3dca9e0ec7186 +5073,f8251e758f675722 +5074,2dd239a5f667dea5 +5075,4fac87a3f3970b13 +5076,9c80c6903d4278cf +5077,71abc7c9d5df54c1 +5078,036cd128d11c456f +5079,c28677d9d85221f1 +5080,9f12ff15d1e598f9 +5081,5dadeca499d31295 +5082,2ade478e278d0111 +5083,24fce8784c18b784 +5084,31c8a8089891a709 +5085,b226b6b6d4538793 +5086,8202e0f5313a2f33 +5087,bd79081b9facf84d +5088,e46a6af271c0f216 +5089,338fbaf8f2020e2a +5090,f7060cdbfe05d065 +5091,4c83fc1010bc4299 +5092,4259e2cf734c8fb5 +5093,0cc9fa374171b8e1 +5094,6ccd6514f4c5c8e9 +5095,5a7963d364fe2e24 +5096,b40a6d462b7027f0 +5097,4e990df7c0eb307e +5098,3d38b95dd3e7b90c +5099,a903285182a1e7eb +5100,e4a562e69a5e6823 +5101,6584ca2def2f99d5 +5102,3523404ad40f1d18 +5103,cb6e60078d47b212 +5104,6ab5de83b057755c +5105,9109150c862ea2b3 +5106,8999460f363fa888 +5107,a9e97ce355d5c817 +5108,f0c2dad271764ebe +5109,4bfcf09c94cb5c9d +5110,ee2f44506e3575af +5111,ceef2447ee70505c +5112,73210d1d0e87686b +5113,4c00d9c3543d06bf +5114,921dedadec88fba8 +5115,46e775f05d15e951 +5116,ecc2b73e9d77e360 +5117,691d69831a56f7b7 +5118,e5dbb6e06835deca +5119,505ed034ad445fe1 +5120,36d23c512e7da2e9 +5121,60425f3617d50fe6 +5122,11c61d38899e449f +5123,d63ea9913b72921f +5124,4d5c16c5d4292e4c +5125,a402c302aa3de7b5 +5126,1b161060b1f87634 +5127,4e3bbdc2d4ca5cae +5128,3e2a3f6b3ebd65c3 +5129,c217da363b96bd48 +5130,ac7cbe00a307beca +5131,f3ecc58f350f7259 +5132,fad3742046ebc554 +5133,837305428e6aa9bd +5134,824f010b1013f30e +5135,b516ad9490796430 +5136,1af7c398b6bffa95 +5137,5b96132dc73df535 +5138,ef03ebbe218f553e +5139,dc0c73a84ee32cf6 +5140,58a58a155f0a8ac6 +5141,f362bde5e4d0952c +5142,73478488d6706a87 +5143,4bde1f8553fe7f77 +5144,2555a3a4ebd9249f +5145,e8f0fa36a2f0c9be +5146,555c9f1c4004c7ce +5147,788eb31de7811b63 +5148,0fe09590ea835f8d +5149,acf878cd866be7cd +5150,3ab0e5a964997c40 +5151,6c3cc4efa341ac7f +5152,f593412a8a67d192 +5153,8c3a2b85e67e4831 +5154,d7f66b4578d18237 +5155,0bcb3ccf04d0d3c1 +5156,3ff138d3e7225a76 +5157,f30d68c2da820f67 +5158,2cec1c9a96aae81c +5159,59e6398dc6536994 +5160,f206501b4ebdc6d7 +5161,d4832bfeba62fc0f +5162,6b3498d26fc05078 +5163,2608f0bfd304c194 +5164,e92a53ed2db58c41 +5165,c76e32f0bd31e3b4 +5166,246917201b6ef2dd +5167,7604c52d24098ae9 +5168,f3603803d5e9ccbe +5169,5316bfead4823c06 +5170,c3e7d560055f74f1 +5171,9ec856d015ec6adb +5172,24400f5a58cd8130 +5173,ab29231961776486 +5174,6c809a2be0502899 +5175,92b4a56d77ba7618 +5176,f834133743d8cd4c +5177,51530c6bbd5d2944 +5178,327f9de35710a843 +5179,006efafd5a7eb1a2 +5180,e2560581cd2f49c7 +5181,7cf9096aac00f733 +5182,72ce3dacbb445f62 +5183,37ea476911e9d492 +5184,66d8538830832a72 +5185,eb5ee50754216029 +5186,f15189fe0e658e53 +5187,e356ea7b01f3284f +5188,e68033298e07dbc8 +5189,76b343b076c71743 +5190,46eb34964caf7368 +5191,7d2702b4babee0be +5192,6bb7e0c0c7c6a956 +5193,1f032d03251edb07 +5194,7430816c79343c73 +5195,665bf417d728e40b +5196,2bbcab92d647bd34 +5197,4586ac35d01638cc +5198,da702d6e7e46a6e5 +5199,7f8cc94ff7c4add8 +5200,2936fe22fe0e6cd2 +5201,715da5d8b0d8d1c6 +5202,f8fa8095cc29163f +5203,a07cdd56149d6f9d +5204,709143fe610170ee +5205,16c788e8f2399b46 +5206,fbd68c55e09407d0 +5207,22da1113d3f08b10 +5208,03456a38d75eadb2 +5209,cd9f9e0cac5fb2c2 +5210,ac0df00862fa4075 +5211,303b3bb19acbbd1f +5212,719b1fc362867206 +5213,2b9bdd3844158c68 +5214,2200cc5e9a39ad16 +5215,07d69e3f2879b1bd +5216,b9cf450a90ef6678 +5217,3c521850d30e12b7 +5218,107c2a592bd02cf6 +5219,f8d0c774a2b5c955 +5220,1e48aeb09874bd93 +5221,a0dfa285886abaf9 +5222,e96610a2b48fe662 +5223,31949b8bc43f3b84 +5224,5d757eae68ed701c +5225,81365168d9adfcb9 +5226,0a3737ed20fea22f +5227,3145914d0a7b02a8 +5228,104c67671a6a0e2e +5229,6c68a70ba599df8a +5230,d44966064d3294e9 +5231,bc061423af1a3fa5 +5232,b19b8ae87385e8e8 +5233,4665760da86ac856 +5234,19d73e0b20368c71 +5235,7b8f4207e4ed739f +5236,d6de9e4eae286943 +5237,f853c7313c0931cb +5238,a90064c66af4cb85 +5239,f2047210462a578e +5240,d486baf63792bf29 +5241,82f58e78bd9d0cbb +5242,0936291759690307 +5243,4de711f7bd1c0f1d +5244,fcd7a5b5e08b28e4 +5245,aad6ca33cf3b53c0 +5246,d31f6b5e2627c794 +5247,be63efe25d0d7816 +5248,00ee0dc70b1927ac +5249,247fdeef80c94b1a +5250,e269f622386bf464 +5251,26fcf7208a4bd462 +5252,06a23c1adcfb32a1 +5253,edffb0a84f15eb85 +5254,eb6bc488cc88bdfc +5255,3bbc0140b0bad26f +5256,361c0a1e416f23f1 +5257,4eaa041a502cc062 +5258,c2e238e8b549b9d0 +5259,443ef99ddd6db71b +5260,7612479df56f9dc5 +5261,9e9472dddf48d39a +5262,cbc5fe46c7a8f3d5 +5263,c7adb13471a3f24d +5264,74e7af5a4b6a27ee +5265,14b8aaf5982a5b08 +5266,ce928f94a50a6e83 +5267,b2821ef1e8a051d4 +5268,90b65fc82bf5cd70 +5269,0dd20e6fdf331539 +5270,d8b5e01e36ce463e +5271,8d3b17939776c08b +5272,62374d19118fe347 +5273,77a09fde69a63c16 +5274,a914d5f56b8a8da7 +5275,229d3952e322e71e +5276,51b50df59439836b +5277,474fd74ac444c59d +5278,a8714782168d6c66 +5279,9ee6f87ef9dc84a9 +5280,6310cc91a6be50f8 +5281,d9b02ac2d57e7951 +5282,09653c5d76464fc9 +5283,bc7b00522f100724 +5284,80f3d38cd4b4058b +5285,e742f5cfc6a5a32d +5286,832ff0e7f2af2f60 +5287,dc3b5428269a9fd7 +5288,b9ce539a90e3ca29 +5289,8e20132c503f199f +5290,ee6d5788d5957948 +5291,6acd53617eebf72c +5292,19dcff38134d0882 +5293,282addbd5e93f827 +5294,fd6d6f95ce038030 +5295,8be64220a1512439 +5296,d5fb60408845cfe5 +5297,bb15783cd982f4a1 +5298,38a9ff36dcaf6178 +5299,56a5d1044fd319fd +5300,9528c76cce341ee1 +5301,140284cb30f94031 +5302,1eb9825c32c2af66 +5303,e6414fdd4357d3dd +5304,5fd64e4481bdb28b +5305,3118dcc33e53ea7a +5306,47c598a175a6f864 +5307,6988ea2fa3ed89ae +5308,8cd4efc415ca76c0 +5309,6585699c70570bd2 +5310,a83518a92d846add +5311,e5e61008a2e3cee8 +5312,f03c3638bdb4ef5a +5313,058ca6c01a353ef1 +5314,dfbdfb57deb3650f +5315,6780b3dd6c9e9aab +5316,d2d46de771ff8448 +5317,7385bf3c420ca555 +5318,723b138bf586019f +5319,b066db02398c7663 +5320,0763abee73873835 +5321,b42581203420f51c +5322,1a41e9d96777dde6 +5323,ab909e7fae46de1d +5324,53bdf6be6a894a70 +5325,a57886ed43ec0244 +5326,f6b0aa96bca011ee +5327,fb75ac107d87710a +5328,22ab9a9c8e4d19c0 +5329,efaf70f982774dbf +5330,5abfa0aa1d2aab55 +5331,b14c0ba61c069d39 +5332,c4f76016e3d89a30 +5333,dcbc2acc8a2a3211 +5334,83f3903fb001f815 +5335,df33eb007dadf4c9 +5336,bbb381a4fa554929 +5337,ac9b58e271cafc14 +5338,ee0e1b887e79e480 +5339,1e4ec7fdce586367 +5340,c3f83e073f492e82 +5341,a9e70b0f7a668164 +5342,0a48ee3b78e1da8e +5343,4041599dd2f43acf +5344,5633bdd5f7523557 +5345,b23bd5e4f8c75f9e +5346,2e157cd5dfd39209 +5347,828741708d2150bf +5348,76a16d8ac835d1a3 +5349,981fd09165d54217 +5350,6bd7ddfa84906d72 +5351,5b2aad5f899dff4a +5352,d6c15180b49d16bf +5353,0e8009b53fc605b8 +5354,ed97e3a1f49e4b90 +5355,5984232beea0b6f7 +5356,11409a0562a0b8df +5357,3b6355fcee1b9192 +5358,00a9573e15042b09 +5359,d0dac28998ea8dfb +5360,c2fb006f6212d89f +5361,0a3ff0dec6d9f7f0 +5362,54e0a96a70be33db +5363,5b9a8fea5961e1ac +5364,fa13deefc590cae0 +5365,125dd1285dcdbe86 +5366,0176f4d1c34658cc +5367,8d65866e7f100b2c +5368,a187af89d6873f2e +5369,7dcc0a39cded6f7b +5370,40c075628dfcb031 +5371,57ff268fcdbb79ad +5372,9c57b52267fbcbd1 +5373,b9cd10594908db77 +5374,4959bdade5c14026 +5375,699e4a5101d75851 +5376,754c167df8884005 +5377,4ae32baabce6f553 +5378,a531c3ccbfea3dd6 +5379,7f3c41d622b61a00 +5380,684844b0959504c2 +5381,26da940033e0693e +5382,eb3e49b6530d221e +5383,e1f00eb92849cda0 +5384,1a31741f41908498 +5385,3551425fae412d8f +5386,2a4404901ef6f96a +5387,12a229198323c49a +5388,c6b3e1cc2668167e +5389,8fad175603ff925e +5390,a44afc2d968eb711 +5391,50ab018c10e8ef6f +5392,1a198edc47a98e16 +5393,c8076c12fe037dc3 +5394,7db8669d9fc35b3d +5395,4dd6a23de921e820 +5396,b741ad6426842d6d +5397,028d126dfd34a96e +5398,d34d0f09bbb749a8 +5399,30d50cc2da5626cd +5400,33a3c651be891cc5 +5401,f8e9875aabc83229 +5402,0ee49f1f1ab9176d +5403,71351fe1cbb514ba +5404,56488ffa6e464efa +5405,40a35eab181a20af +5406,9e54ca6fff30344a +5407,74c7e46a0c5cc98b +5408,70f2779b39f1a333 +5409,56ed24a8aadaebbc +5410,46f9f786c3b91755 +5411,8bfc932f5c41a720 +5412,9aa0aee947a58828 +5413,39198073dfea63b4 +5414,758968ac4c55030b +5415,86016cd7f2d5c018 +5416,030615f488c799ed +5417,7f217140fbc60f70 +5418,f3c266f52caa8769 +5419,3d5d2680f16e263d +5420,4504069c9b129f5f +5421,7d2260717ed24ea5 +5422,38e1a1f2b9fd8a1f +5423,7057a3baf87ede66 +5424,2903c3fba7e66c23 +5425,fa860cf5c29c3fdc +5426,3d14591e8e57a6d0 +5427,c004267089d1521e +5428,202d3dbd7833d5b6 +5429,1d3a0e0a648dd416 +5430,ad7c8684bd61d9aa +5431,5c23790719dbbcf9 +5432,49753c5bc37cd837 +5433,470628029556a83d +5434,7152655271464df5 +5435,8f3bd1ac7ea0e1a6 +5436,0892dae79405bf8f +5437,04f35a632cf3d0d7 +5438,9c65c9b965fdf2b4 +5439,09224dfa98bcec32 +5440,85f55675ebfbb5e8 +5441,5c432fa491784944 +5442,65c4b994f1390555 +5443,73cd9bfcf2c1f116 +5444,0c05d2cd3bad3c05 +5445,0c00300e8c19df6f +5446,1b4bf5ef0595791a +5447,bae8076b1cfc83b4 +5448,f13902469f4c57a3 +5449,161fcd3287be045f +5450,301c55b23df8a3f8 +5451,1e6b03af8f5c1485 +5452,dc6bb62a68f32d6c +5453,4bdce425a5943a60 +5454,07d05c049f16d084 +5455,5e1073870daac70c +5456,d54aaff8d4d61c7f +5457,69442b422903d814 +5458,d009739f87949b36 +5459,f72cf66b6338034c +5460,ddce11b1773a55e5 +5461,a3399042c1db5236 +5462,5c0f0c5e383b1f40 +5463,f2917d41a9db2e47 +5464,8bab31a04f31c9b4 +5465,d19752d3448079ad +5466,1aeeffc029a215c6 +5467,737bf9a31c368a99 +5468,138e7f46a8e8df0e +5469,df48fbded8753286 +5470,27a0f9e442acd7f8 +5471,b8c4426dd32dba95 +5472,b2a3a0bca693ff13 +5473,7cf7fbced79253bf +5474,7230dd239f1543a4 +5475,fc50f2a5d4fb3b0c +5476,f6bb1fee58ea3020 +5477,f42979e02c8bdb58 +5478,be16eca64531edf7 +5479,a17faeb159226f60 +5480,6e541d99ace67e15 +5481,baefc2a644117573 +5482,ac1ab6ffd283ac2b +5483,f6361ed14bdfa3e8 +5484,013dc5f9edd2a320 +5485,eb3202cb951b4960 +5486,be511a206f5aa4b6 +5487,a0744e9f0b965b82 +5488,68ba6e82f97614a7 +5489,ad2f0279098a6cad +5490,a8a97738469dd8d4 +5491,13f0a7d4e7e3a06c +5492,871b1d501c1f3912 +5493,257558e16341fb81 +5494,042e9e16933f415d +5495,944935c55b788916 +5496,dad7f8946f131dde +5497,381eea485812c41a +5498,eb4ea80c47eb8856 +5499,a944a47ffe0c461b +5500,e4b5ba1f28b439be +5501,8b3ce9329986ec45 +5502,2ea0c01fec1db5cc +5503,e284c810f5d9e96f +5504,f88effcc11776194 +5505,ad2e3750c6820c4b +5506,eda5d569e6aa6691 +5507,4aaf07a23d4ca8a2 +5508,0b08ff8aa53481e9 +5509,03c279d69947a834 +5510,83c961edbebc4010 +5511,4a3661f70f394fce +5512,04e664b667a1ad02 +5513,4119ef05e0bb6bdd +5514,7d85a303286d9690 +5515,faaf4b601b15218e +5516,97be930100231ebc +5517,f2b5d56002348359 +5518,3d78f8382b17939c +5519,6ce9ef1d3efe55dd +5520,7cc49141d5123e98 +5521,20b10ea38a20507b +5522,3d677e2e2059f867 +5523,72132224eb57e882 +5524,90a09fef51119535 +5525,b51a467ebcb6373f +5526,e1be4985a9247aaa +5527,6ca9863a73601e20 +5528,22475b0e683c6d5c +5529,6e2ba4e5805b2e7d +5530,f61a224b6fe59fef +5531,32789dae2d666563 +5532,9768cf96b62d6ae5 +5533,eaaa2f55d021ecb9 +5534,0d91e016b7f9293d +5535,35f1b32cbb4b2722 +5536,72203906baa314c3 +5537,5731e8fe811e4693 +5538,1034e7273809e842 +5539,4d66deb67843cf5c +5540,7657c12038d61889 +5541,c6a7d00f4f5592d0 +5542,0fc63c9292ed34fe +5543,e412cff597dd09ca +5544,7d233b1a9bdab6a3 +5545,99bff77de95e809d +5546,261a49974c27d7e7 +5547,5d295a7a09d12849 +5548,63fb5b09b330d464 +5549,015882efd70df97f +5550,1c65600ce89084ec +5551,2d3ba4a102df6b87 +5552,88963bfcdf6e2f59 +5553,76c14bdb48948198 +5554,daacc0787169c3a3 +5555,9de7e3a41acddb09 +5556,abce995be581ac59 +5557,e27e8d20731ce424 +5558,2a8a9e51bdb17413 +5559,e80fb78019346d02 +5560,6711aa11dd44fc76 +5561,af836a7f846bb6ec +5562,422489cbcda4ea5b +5563,debdaab5f6a622fe +5564,844f64a2a3fb204f +5565,decf9f1d5427acbf +5566,55cfab0dc65fb8e5 +5567,facc1320c162580d +5568,92c8e8920716381c +5569,be4f1dc9f30c27ae +5570,62dc9fe6b74b022a +5571,a512cf8d7d543d76 +5572,32f92867ed5608d3 +5573,b4c41083c2749320 +5574,0d80195808fec4b5 +5575,b655ff60136399e9 +5576,4f3e9f115c2745a3 +5577,e1b2601858cb1bb9 +5578,f9344caf7f058afe +5579,8642b2d0f04fe793 +5580,c4e326cab3516b71 +5581,c1d234cfab28d515 +5582,a4320b4931eb918f +5583,f7318f8d598bacb6 +5584,791a3eda54e92dc2 +5585,ceb535a9d009ce02 +5586,1dbe3d7214c95140 +5587,1fa5561e901e30d0 +5588,bf529f5b08fcf108 +5589,b9610597776b5cf2 +5590,1f14672efa8d19d2 +5591,144ca9a23e28f958 +5592,9a6300153f10294c +5593,09394a70c2069e2b +5594,10617e882e5a4c4a +5595,0b4b4cbd265a3caa +5596,ea01a002c74f8657 +5597,e8005ffffc0cd4ee +5598,cc04fae207c260f5 +5599,1265fe9360c20a0f +5600,2edfb4fb4430c2d3 +5601,fef0715310019a0c +5602,385b33972c4cf576 +5603,f8b4b082afdd0e9c +5604,b73043eaf392fe79 +5605,640f9f898d37daaa +5606,84dce0678ff8e33a +5607,ce1a91d280ba4e0e +5608,881dbea78c02c2e6 +5609,2d6c1cbbb762779e +5610,848ec7b3f939eaf1 +5611,d7538652b6792bbf +5612,9ff870a0c094ef1b +5613,6713663d8e73ea32 +5614,9f0fe05371f6c09c +5615,d5112a0dc9673646 +5616,18863fd945735e78 +5617,3984f8192410d1a0 +5618,24d3a8e776f26419 +5619,7c094490f2d00d1b +5620,44439282b63b4170 +5621,d2751753f450adf1 +5622,25d047a47e0bbd7e +5623,3eabfd28f74df246 +5624,87061f9cbecf09a9 +5625,f7949f4618d58bd8 +5626,c2c833ceca9ab5b7 +5627,fe77b2f2a3aa3fa1 +5628,e40e9769d6cfd452 +5629,453cc94a155ed194 +5630,8fc702a4c46b6daf +5631,f212a3e72c9e0906 +5632,51c38d469e477c55 +5633,6b8e795998db6cb3 +5634,7fbf805c082dbf31 +5635,0c47c8155b5d8f70 +5636,edf77be1ba93c5f3 +5637,3098edad829cd6bd +5638,e5b45fd298b2b611 +5639,dec9d87a58942242 +5640,be423405f9abc51c +5641,44a64baf134dbbd5 +5642,934fa2ec18ee32df +5643,afce6e94553837eb +5644,2a54cdbce66e63a0 +5645,4ba9ef77a674dbde +5646,c9e4e1c1d48a1644 +5647,7ce6005fc28bb28e +5648,4ad4400c8265857b +5649,fc464bbe676b1368 +5650,d80718cb71edc597 +5651,00dd092c52757548 +5652,7aa02366d0e02251 +5653,4d01db91586f3d65 +5654,8aeb2dc367188969 +5655,fca841cdd317bd6f +5656,93c5968d0cab5c28 +5657,1946942d4dfed1eb +5658,473b0ae645d0d1b1 +5659,b326651ffc5edec7 +5660,e5762b45941c0714 +5661,a3760182de176fd3 +5662,b44a0fed9dcfb73a +5663,cf09c7f6e6261515 +5664,3c887ebb8d5f20c6 +5665,c0ecfe87b7c3d236 +5666,f2c69bf915df5008 +5667,3f82bc3d74158732 +5668,06c8d61a41af280b +5669,6c61cb55ae5b2e8d +5670,3fd94453e8342c8b +5671,903630a156f6541a +5672,e32d525b9ed65ebf +5673,9ee38497cff91de3 +5674,847055b5f389dbae +5675,7d743d9b35ea41e6 +5676,599ef4731745ebe3 +5677,518cd1c438007036 +5678,10fb03db15166e32 +5679,6053c17a83173d76 +5680,66bb4e23335c0715 +5681,14b8f0d78ec773c8 +5682,9581f4c69acaa154 +5683,2b2e4a1052881871 +5684,858390c3f2fb2102 +5685,38e93e718228a651 +5686,165be49725d8635a +5687,f6bb61d7d2e54ffb +5688,5d19b5d6ff4484db +5689,f5672043c37412da +5690,29ec80414a6f55fb +5691,4861ed309b8add04 +5692,cd63921453770c73 +5693,ed20c1699d116c3a +5694,debf6cb1b01dcb2b +5695,5243533bac623486 +5696,31b3c6ba454b3a6b +5697,0734111d3fa8574c +5698,cbc32a8282700fc6 +5699,7362a92e1071dc15 +5700,edde5d324a4e1a31 +5701,f87565abf0a5a155 +5702,5ac0a25a3fd610e4 +5703,3f966a598f2b5b82 +5704,b582dde86de31a8e +5705,c1c58621f24895ac +5706,371e89f628dfc80a +5707,5804eb603a012917 +5708,0325346386c97a14 +5709,f407aa1ebe5d78c5 +5710,65926d603951ce1b +5711,e3da824cb957cc49 +5712,1ef009f2b23e3060 +5713,f0120a44281a2b52 +5714,8088f1e3bb0b02b3 +5715,cfe8eefbe3ca25ad +5716,296fcff8ac273ccb +5717,a0e7bdaa6285138a +5718,30a1e2b204bebcd1 +5719,b68fd279b593bcd9 +5720,9edac27cf59fc200 +5721,aafd8b8542170cbd +5722,e7bc7f5ee9ff2995 +5723,8aac13e6ac338509 +5724,9dfbb148bbd1c88b +5725,07656b13eec5cbdf +5726,a5d58d5cb33ff4b4 +5727,c79af9512abeb796 +5728,0de61a12bcddd368 +5729,8753d2e571b8c0ba +5730,b225eb5a4bfde699 +5731,3cb41b7189d85a46 +5732,40f3db2fd3169734 +5733,5c51b56de8f78a65 +5734,dff00665a814f1d0 +5735,4ba951a276ca8bd7 +5736,263415f755988153 +5737,ae86ced33aada6fa +5738,69f5d9a44ca82704 +5739,061f3aec2e7bbf95 +5740,b42f35a0c770ea70 +5741,fb057ba788714007 +5742,4a0bd8a2f3b797b6 +5743,e27774bd737272ba +5744,2a318f3109738f7d +5745,2edfe778b4efff57 +5746,35f6331bed525f91 +5747,027095bf72f1e152 +5748,70dafc9d04d1fc7d +5749,b8b8fd99ceb50115 +5750,8ebd7517dd956c5c +5751,4f065890547a13a9 +5752,7e3c617a788ada58 +5753,9292bba74edba97e +5754,b170378510ea5655 +5755,c74e34827fbdb019 +5756,62a8184f97c355d7 +5757,a62992bf302a1dc3 +5758,4a113398b2a6368f +5759,8b4ee97feefebd9c +5760,1b2353bcfebe3eac +5761,acbfa052e23c8c9f +5762,04497d1c670ec066 +5763,7330d411daddbf2b +5764,0107a4661f1c7e50 +5765,78aea5b3df7b3628 +5766,1f655c30f1d25cd3 +5767,b1a8b1d11a397ece +5768,96874c66f870dc66 +5769,e5ab9212267e42d8 +5770,f0358ddfd5ab9dee +5771,e8fbcc34ee29d5c9 +5772,0f80a00f3b1f2fad +5773,a7ae285c8e68a079 +5774,506bc3d30abdc345 +5775,a4dca05f7332f633 +5776,cb55d0380780334f +5777,cbecf72908f20d79 +5778,9e194a22c87f95cc +5779,a5be6e2d822c43bb +5780,96ae057f0c0a03fe +5781,e1c87d3708548283 +5782,35b3f6fa594ad5c7 +5783,c8ccd032fea3a8cb +5784,ebbeb99bc6e0e9ac +5785,a13ab00622a1f79f +5786,b11e8f8c440d64b7 +5787,1696bbd2623ff116 +5788,21889325230d6492 +5789,a98e2f163d0ac263 +5790,5cb2b4db692237ba +5791,a448ec622b5729cd +5792,c9e4794bbe193ea6 +5793,b93870eb1832c589 +5794,b71713ba55f6d369 +5795,fab633f9fa80163f +5796,5c8768d9c0839931 +5797,3bdf6cee5b2e2ebe +5798,164a2af7e5be35f4 +5799,aa98c7a9f8a19d72 +5800,411b011cdd132fcc +5801,d749112b3b2becee +5802,c2f6e26476a4b649 +5803,fc4693b5af966d14 +5804,52b20559704ec7a6 +5805,08d60d6867b65a7f +5806,ae9669cc0736e870 +5807,b6104cde7c68025f +5808,9ad0a13d41a58de9 +5809,67d65597ca92efb5 +5810,84b94c73001dfbff +5811,4a370f897f82bfca +5812,7930bf267a1cd303 +5813,90e05095194805ed +5814,1a1054ec2815ddab +5815,01ee089964199cbe +5816,a10ecf6b2724bc09 +5817,7ba9ca7667ae2c22 +5818,ce60ee0e57dd008d +5819,8d59f552419b0efa +5820,03536d543a718a05 +5821,1e0077a1dfe6609f +5822,7e67e58e900416a8 +5823,101927925afedb8b +5824,dcbd94e0ccd7d2ef +5825,b0b0cfae54c011d1 +5826,f890353a0778783c +5827,25bea92aa3743609 +5828,c0c5913068337b42 +5829,8737690e8ae5fff5 +5830,6db587d1269bc193 +5831,44d3ae5075c271ab +5832,bc07a3c2902f8666 +5833,ff3302b456d8c30b +5834,0d2dea06d8861c26 +5835,bc4b4ca8b4ecda32 +5836,dc74f8fac0420870 +5837,d1c0cbd5b1fa4d7c +5838,028bf94b92952044 +5839,3e696532cab99ec9 +5840,249d700ae40fbdc8 +5841,22b14407358255e3 +5842,9cf33079987ca844 +5843,a4d283abddb970d7 +5844,5fbdcc3d2d739c9d +5845,38548bd08be4862c +5846,e691f165cfeee2d7 +5847,46b44d963a1137ce +5848,8285327bf72ac48a +5849,8e5891a757f4d980 +5850,dbabec2f647bd680 +5851,ee7a7a6634911611 +5852,d6e48dd36d809fc3 +5853,932130c097d9637c +5854,fca168b7cdffd5d9 +5855,d9c5841b30a495fa +5856,de52de076ff0ce4f +5857,4ecf905d1cf1cc9c +5858,2b2ffd4a958a89e8 +5859,17df0cdc6ddab579 +5860,1c1963d89ec78799 +5861,6403a08796083dfa +5862,305a462c1429a596 +5863,eddb28c66693bf03 +5864,227d37f852e3adbc +5865,15226c4349396ed7 +5866,437461da2ec9397e +5867,2fead76b10204a0b +5868,ae781143f6daf982 +5869,accbef3b892c6253 +5870,142f9e6e62776c25 +5871,eea7e83d63df59c9 +5872,b6c6e8946eca9425 +5873,40fe7a75645e616d +5874,d09b3b82135503bb +5875,709ffdd1fddb8e00 +5876,e844c16a99841b4b +5877,a0417aef44f2196a +5878,9f8baf4c47e0aaa5 +5879,7e0fcf6fb9366194 +5880,2685b185419b9111 +5881,5ccd8c740fcef0e8 +5882,c37e568fdb0e065b +5883,dbb28ce52582970c +5884,988dd6e3dc6dc9b2 +5885,5132185a7d70343c +5886,d2dad6624d98cdde +5887,69495fdf185868d9 +5888,892deaa5419d6684 +5889,831dde9c92f4d981 +5890,2abb1d8453a597bc +5891,1ac5b0df01628264 +5892,01169b51e8e585ac +5893,563b976458f63b07 +5894,964f7072994d6020 +5895,e9f8aeafebb6e4fe +5896,2b7ed4d6fc48a0c1 +5897,62e19703896e978e +5898,fff85ecc1d891811 +5899,8d8ddbac103b80bb +5900,1e5ba375acf49c02 +5901,0aefbc4f8b8f7406 +5902,a0c1cef4f31ff3ab +5903,7718bf828a7a0b00 +5904,cb991f424637eb35 +5905,a4451164d7c05dce +5906,dd289917193bb988 +5907,dd863564c31d1d25 +5908,4c86660a57952e0e +5909,175699bf74b3bac8 +5910,e16d8a62a6fdb0ba +5911,9f0df1f2c2dea6eb +5912,30d692687859d4e8 +5913,9f04bf9dbd4f1aea +5914,bed6166f3592e253 +5915,6c570820f0d9f584 +5916,b81eea4394021edc +5917,7aa4e3a2afd27ce6 +5918,0123082d5ab477b3 +5919,4f7ea2dfac6e12c4 +5920,74b44a388137f7dd +5921,2d9bda29d20088c8 +5922,1eeb0f046cf49c0a +5923,ff9d7dac98deeb20 +5924,0e15f0f5b37ad7eb +5925,e9126d995c4f4904 +5926,56b2e2b59b64ad7b +5927,848cf37fb24d5528 +5928,17b2de46fa090a84 +5929,021b4cf4de4a6a06 +5930,5550ae6b04bec3dd +5931,e50b85102d9bd6c9 +5932,5d34d94b55351e56 +5933,07ac82941da63fb0 +5934,a7165558421926ff +5935,c082d41613263058 +5936,280c1a75905dc2d7 +5937,2dd1a0f9f6852ec3 +5938,2aa89cbeef016888 +5939,537a21be0ae70fc9 +5940,2c3aa60176e412e2 +5941,f107644ede05c8e5 +5942,d9b76bb27d0d5a45 +5943,9080859433d8f4b9 +5944,88b2e4ec80042967 +5945,eb4ad8104f5096d2 +5946,ab9af70bb4511331 +5947,e516e55e36d6b377 +5948,d1b43a5250597ce8 +5949,2bce4bfd83727e73 +5950,c16f6c5aef8b25ac +5951,67cd351a49ae6fc2 +5952,b94038852c6c7aff +5953,3e3d17dc3376acf9 +5954,39bec63f78e6e209 +5955,2aeb79eb1ea29a64 +5956,965f18270efeba6b +5957,805ca8e244c9e4fb +5958,8211a3ee2bee0166 +5959,0357e11031ef8a3d +5960,1710303a21fcfc21 +5961,545ed309b49932ae +5962,5bf86b3a88002c5d +5963,4a7f676bdf944a93 +5964,80127beee99a18fa +5965,a6b11b8e6b978c46 +5966,5a5adc2c9b94d41f +5967,e94a59a2bc542ad8 +5968,4998e4b28913adb0 +5969,376660ce4a90f647 +5970,f1feafb3fe0afbd7 +5971,315a1534bcf4634e +5972,03f3a87ac82a8c27 +5973,7315714a6897c731 +5974,ef2e13ca8a3799ca +5975,0827aa866e96eabe +5976,3fe2fa9dc83050dd +5977,f342ef6a6ca0b43c +5978,b49447f7c1983ea8 +5979,1c729f732df98a36 +5980,254bb342b92f78b2 +5981,155d78fc1c6ea071 +5982,97a63c616940e2e5 +5983,d209b39174344cd2 +5984,becf750f13306f13 +5985,bc7f21c8f27b798f +5986,f8b4e7df7188b21a +5987,fb4ff07c61f90d04 +5988,76e7cc8d26724ffe +5989,f13cf60c83eed0c8 +5990,b63e29b83f48f25f +5991,191903a946a9419b +5992,1470b95d3830a442 +5993,a46c54c951adfd17 +5994,5d9f970a0bd2a770 +5995,036a47dd9e26bd98 +5996,2e1cc2cd96f949d5 +5997,b926b546b7b7e7de +5998,abd38afc638c9379 +5999,816a495ea783f718 +6000,6e7f5089c9a9a161 +6001,41cdbf8997036746 +6002,4e797d0c2065f4a1 +6003,dc618c2d22ce1c01 +6004,8e16ba05a5ecff22 +6005,4480c520f160cffc +6006,b105e9467f19d6e4 +6007,9694d81e764706bf +6008,5f9f94529ad3fc76 +6009,79eb55fa12a3c7bb +6010,108cbd5d9eb3cafa +6011,b0c1c95b07d9399a +6012,421dee6069723c15 +6013,7fdd3195ab694d7a +6014,9ff83d7796cca65e +6015,62588cf8c1e788c5 +6016,eaba89b76edd3d9e +6017,b3ad83a85eba5d2c +6018,fe75db5a06db102d +6019,76d23da47e464b9f +6020,68496fa08c2a26c7 +6021,d7db311cb80625be +6022,46ec7595d523b176 +6023,f0f24f623fbcbffd +6024,2577898dc38e4b5c +6025,be72d56ac9ec942a +6026,a9f980e2fc9d80a4 +6027,c4c763a219371a12 +6028,8733a026a495b2d1 +6029,7b39c5a118cc11e4 +6030,992aca56251c18b7 +6031,0e85f8ca8c842f44 +6032,5cd9c29517fba1ef +6033,25fd372373cecf62 +6034,8e05c37dcb3bd1f3 +6035,40c076b6035d53fb +6036,37859ecbbff84664 +6037,c812e702182a2700 +6038,c35d419ba0b36adc +6039,df88ab3b7945abf8 +6040,73f97c54eebfb252 +6041,c25b5102d7dd7802 +6042,3cb87e47ab689eed +6043,0141479ad157686f +6044,041f97013a1868fd +6045,3f958213c7c80021 +6046,3b293d9045e05cc7 +6047,8ecf52683c53bdf8 +6048,c93fc15a720be766 +6049,74abb7e5eb64ec6b +6050,11f9f9e56960b177 +6051,dffcec109320f2c4 +6052,14e1a092649d398c +6053,0bfd0d0dde88dec1 +6054,822c72d4d12c000c +6055,48b379909b8a5e3a +6056,39544eaefba6a523 +6057,da2874790d9357b2 +6058,26b61bb52ff8fad6 +6059,2ce193cbff509a4f +6060,b31e561e685931d4 +6061,c6a55e0538ec44b1 +6062,1aecdfe2d48aedc4 +6063,4542a295c8c8caba +6064,e9e22a2237a9ec75 +6065,7114144e3417fb34 +6066,812a16aec75760f3 +6067,e3274d110961ba19 +6068,673c6e482cf57122 +6069,7ffdc119387e9ccc +6070,7fa58f186ff0d90b +6071,369af449fbfb99d8 +6072,ee29998bb2cf3c1e +6073,048e42dcbc8f582e +6074,09eb468d8c800d43 +6075,7b02c9050069121c +6076,2fd13b301f4073bb +6077,c642a5b0cf71d535 +6078,f66be874e7994968 +6079,bb025ed9a2fb1f34 +6080,6a84c69e152bf6fe +6081,f154869bc3c9295e +6082,0614758357fc1618 +6083,e5a2919a1d780bb9 +6084,d1d91fd8e7fb967c +6085,bc6a17b804115211 +6086,4068d3649afc52e0 +6087,05c40832ce080793 +6088,fb11600a5b01f977 +6089,fc6b166b74a37e44 +6090,b970cd3810c1a09f +6091,ff8c03e2ef211a13 +6092,6f38518bdea83d5e +6093,e59b40e6cd239862 +6094,b5d69fec405d9da0 +6095,c891b09634f4790e +6096,ad24eb0028e214de +6097,ae22fd2ee8089f68 +6098,4e8954cff256d91c +6099,4f3c4e67b05a124c +6100,80adfaf73f4fa324 +6101,281e0cca9a4807e2 +6102,6b2880a368c2c5ba +6103,2e18b7a098d20f11 +6104,ec6413454ee19a9f +6105,bc113a792962a66b +6106,12693add4f326099 +6107,d91d300624017899 +6108,8a2a4f362f04f3c5 +6109,799e6e4bbc1c4ccd +6110,38e031d02987b531 +6111,4751e95daa62d843 +6112,39a59331361aac6a +6113,552b5a16cd455e5a +6114,2edb5ba8d7f7b8e3 +6115,35d676a2f0d87573 +6116,180b4bdc57e4bfe7 +6117,85a9f72dc30eb3bc +6118,0374b28ab81caaea +6119,a18c48399ec94586 +6120,355640cccba34151 +6121,523af49b98e452a1 +6122,b358bba8fafb052f +6123,d6070ed70130ad04 +6124,ac1f2a557ed8147f +6125,16d57c2fa68fc96d +6126,2d66cf556f94f7fb +6127,b48baedde7cfaf91 +6128,d2656d9be33c700d +6129,acaf04c44b70ef52 +6130,71d3f5c6d604520a +6131,94c8993953c2226d +6132,f920c8710851ed97 +6133,644e0b150291f6eb +6134,755860d92acaab5a +6135,0c80bda0eeed4bad +6136,04c9c64001ce5b5d +6137,8ad4f82d1828cf32 +6138,3254f2ff689e8574 +6139,d6580badbfc0b236 +6140,d8b024d5ab423782 +6141,b01c3712be8a5098 +6142,00ad4aeb6ca01730 +6143,5658927f8d599ffb +6144,42ba3856db4d5646 +6145,a215c42b1b4dd790 +6146,c57dcd80acd182b1 +6147,c3dd6ef1b7704626 +6148,60a968db6cbadd7f +6149,9cb213e386a23cc1 +6150,df5db7b8b375b47f +6151,a11c610fa705534a +6152,58b5f17da6064f90 +6153,8b72194d00e1b765 +6154,2758a36eb8da1504 +6155,93c86fb080ea8c3f +6156,3cefeae7e1d00c11 +6157,c4cebd99b03a42d5 +6158,d8ca988e6e6dea5f +6159,7013bcc66ac5044f +6160,79c771610d8302ab +6161,004f5e4136725137 +6162,91a048bda44d5231 +6163,ba4c9d73cab28d83 +6164,43fed4eb184330b9 +6165,8c06d4047d8055fb +6166,9a692a1d84d3fed4 +6167,1d688631a251a8d6 +6168,49454a60a01823b5 +6169,250d1ce64ad3a400 +6170,cbfa897136717f8b +6171,36d3c30cec2c8e65 +6172,5a05bd03bf76e2e2 +6173,f553cc1fe49d025e +6174,75ff700add170be3 +6175,6cc3b56323c84aa1 +6176,3450108f63eeea9c +6177,9977bf9c0a6e8fe1 +6178,dbdd999cdd0ed1d2 +6179,cb30f0a5a9dd9d13 +6180,75d013541466cfda +6181,213d6fcf374acbc6 +6182,84cedb6932b4db20 +6183,7f4535608a199a4f +6184,cfea065acc137c62 +6185,a119bae8131caa1c +6186,9a0cad8a3989bc37 +6187,1c75928c3ac3045d +6188,dc68e4ca8a7c9376 +6189,8c864c3e457985de +6190,b21ddfe17e0d2cc7 +6191,5648eb5c809a1003 +6192,20303fe5fea11c14 +6193,bf2e0882197a9fae +6194,2b60421508111cb1 +6195,4d768691ef2160bb +6196,b4eb4360c47beb2c +6197,a8c150b112213753 +6198,21bdf37fc1cfc1ce +6199,616b616aba4652b2 +6200,645b10c87990145b +6201,287571e5f4e56aac +6202,d4269fac57892395 +6203,8d8ca308280c0846 +6204,edb01ffcc163ad5a +6205,92421c34e02dc300 +6206,90ef95761d857c2e +6207,3129e209e650161e +6208,dc86dea621ce9e0f +6209,4421df4ea388364a +6210,8c7e794b0e019050 +6211,c9681c82c5f21bf6 +6212,5b3e9ff0f4a4109a +6213,08fb34280eb42a48 +6214,93cda441881b73f2 +6215,a7ab5b5ee672045f +6216,a5f9bfa8dd923384 +6217,aea547402bfb1005 +6218,a9951af996259f8f +6219,c570927b1470d569 +6220,a7cf4199c25646ef +6221,3c55cd7649770f09 +6222,df0369dd31162a1c +6223,d9f6cd5152cd4cd9 +6224,7324e5609a14232b +6225,54872273254bfb15 +6226,b6ce95510413c278 +6227,70b01473c272e077 +6228,36ce3bf03750c502 +6229,8b8163d06c5699d5 +6230,05941af84dbbc906 +6231,c32d1ecab529bd1d +6232,9e15bee0610b85f6 +6233,1fa351caadac1785 +6234,45b4488abcc973c9 +6235,cdb005464df8006f +6236,f3ebee4eb6d11142 +6237,47d22bbcd28a524c +6238,c1dd94bffc30af94 +6239,2af53e0c0741fed4 +6240,01eacf3dbe4e49cb +6241,8f43a1b464e026c2 +6242,80774fd0aed2894c +6243,71321c9e1b5224d8 +6244,5715277910a0c441 +6245,86ff3725e7564e6d +6246,593305df10c51803 +6247,359f1ec87b8057c3 +6248,0cb9a9598c56be15 +6249,f0aa31f82d46e6a3 +6250,fa181b045d084b8d +6251,07bee7299191add0 +6252,2bb90189be04b7e9 +6253,95d784ebf097295e +6254,a6b4bccb486fb8ee +6255,609143dab7db4f2d +6256,4245652252d752e3 +6257,91d53ab69ac174df +6258,7e13220717cdd18e +6259,6d83d78065668f0d +6260,c955f2d2124d768f +6261,74728920ac02fc1a +6262,ecc9de07ba30b64c +6263,ac7a6401ee04f027 +6264,522243c4c6b9db16 +6265,7051e89b95353b73 +6266,0b72d1654140bfe9 +6267,59d502ca55b4aca0 +6268,c1df2c22c32ef63d +6269,0446b10263617f1e +6270,17bdafdbc0a3fd40 +6271,ca55b3d6ccd9a797 +6272,ffb5c7945ba155ee +6273,97a4456767fb495c +6274,d4754005551b3234 +6275,d8310df38a8d5875 +6276,d5700f74ea9c97de +6277,fc7c10b2874ae6d6 +6278,d27ac8860069abef +6279,9e2c5d9c7887f4bd +6280,fa2c222176c48a6c +6281,84f53aca279a716f +6282,c8a9def8d1a85e10 +6283,b0ba4eb109da96b1 +6284,fe1a4a90c87e3fa6 +6285,32ff7619b9ba6da2 +6286,e7d630fe1618b09e +6287,9683f8eef2d59373 +6288,773953f99d5a54c3 +6289,31e04d7ddf823b52 +6290,80a0b23a69a1aa47 +6291,fa996e307ed69bb0 +6292,2627ef3c4979c7c4 +6293,34b8c6d140b397dc +6294,43a845b8752e02ba +6295,f728fd2b098534ef +6296,32e54f0a52f3c816 +6297,923d48807b78a3de +6298,f02348c65ff8fbbb +6299,7e1f658fd491cdcf +6300,642d0f9025cc511c +6301,5add061c392b9c2c +6302,abbb939bf3c0322b +6303,0b3288ca638b6f15 +6304,06ad01f8c967fa3e +6305,1d7471852fb795a1 +6306,18892dfd68cd3f8a +6307,e9c196a656629d5f +6308,f4aff460b896cd1b +6309,aac8edd9c9088fb8 +6310,a903c433c1bf3007 +6311,d8776f0209508167 +6312,85c54195532f421f +6313,6457183ff38b5976 +6314,b38d6b3cfe04489c +6315,51596a5f1bac3d78 +6316,58c9626454bc4079 +6317,dc229dae6bb70870 +6318,549e217eceb4eb16 +6319,4535293178c9fddd +6320,57a8d5c387ebc860 +6321,7dd6c3fde15820f9 +6322,aa91f57077d4792e +6323,1d47a10931a1a510 +6324,b69388976bd4112e +6325,e83f506b42201afc +6326,00fa83365fdf1fe0 +6327,60ed0f23d763421f +6328,ee55da0455447887 +6329,9e8da74ff3920370 +6330,83644fc5cfd13be3 +6331,ae243289ccb699cc +6332,de60e4d56ea883b7 +6333,7002db53fbec1528 +6334,a364f34a2b56ea8d +6335,8c2cb410c30d3879 +6336,e12aeeefe4c1744f +6337,bb7f826e22ef2aa2 +6338,d6b8fc9f709cddfc +6339,abf1887a9bfec0e0 +6340,bd1298f98a1ffcc6 +6341,d74b171209c83097 +6342,e48e7fc834108228 +6343,0aa1eb5bc0caa631 +6344,99499a5045f47ace +6345,9a49ef998d32d4a5 +6346,10e19be441dc3838 +6347,a8917b368367415b +6348,4ed2bec1db6762a4 +6349,a0ad41f8f5ce3cb4 +6350,919b676d37f6765c +6351,7e5c8c7b16586c41 +6352,13f796b875cb2d4d +6353,2e073d5c0c7eeaab +6354,e40cbbb8beed0b65 +6355,f70fcc4756614f66 +6356,8e65b1bdc06a767c +6357,e603ad191bb8056d +6358,122ca8c9b1da49fc +6359,5b7bbec5d37f35e7 +6360,7ec3399289d4c484 +6361,5159dda451055f3a +6362,b4b879ded5c7051a +6363,d2cf670f5b0a200a +6364,438b1c20c5a67c0f +6365,5a3a0554ab5df86c +6366,c9a9b9382f75c12f +6367,9afc1ad86be246ff +6368,2ad5be81c14f501f +6369,b64566ec2ceaf908 +6370,80e489b4ba7ad2c4 +6371,a01f697d0e53886f +6372,818567e27513c770 +6373,35dc6e478fc4d0a9 +6374,b0345f60f314be4b +6375,f26a6b5391e2258c +6376,5830ef0a6701c168 +6377,165706db612ac8f1 +6378,714db982c1252a5b +6379,d75cce8525a32db9 +6380,3ba8bec5a211a850 +6381,53713e3e9991aaea +6382,c25150c063aef5d0 +6383,8efcc5bf82332ae7 +6384,ffb537117c3e3a02 +6385,0446b2ca5431b7bf +6386,e904c6a5552ecedc +6387,1020a269b1f67406 +6388,0107cba20bcafe89 +6389,74da5e4e7237e415 +6390,134667527f663c6f +6391,a5b44870ce3d7ac1 +6392,18fcb7969637a430 +6393,424eeab7aa1b2910 +6394,79d18c31600fc346 +6395,64d71a4d3706d4b1 +6396,976a0f2e53e079c0 +6397,41c0d9c8de0cb3bc +6398,ed090ba43c654e7a +6399,3c469fff6e5feacc +6400,a2ca23502d8b8f93 +6401,999ea3b270e0c54e +6402,9b3d419e989dc836 +6403,56e5d698c41e17f3 +6404,23e873db6e94ca6d +6405,0bc372f3885d3938 +6406,1fd087be7e31743b +6407,0bcf09101c5a7b8f +6408,f10bee7254f83bf8 +6409,62378c818915724a +6410,eb5d2a9759da0b40 +6411,384ed68e3dd3fb66 +6412,6f3e73614a0277c1 +6413,bd4a22d71579b0ff +6414,5b134c5818246cde +6415,846b00428a24ac81 +6416,081738475ab21b15 +6417,2abcba889e415f05 +6418,fb2b1bf398b773b1 +6419,3ddfc6e656e97424 +6420,edc6fdf27e3b432e +6421,9384b2fccebacd0e +6422,dfbd14ed22d02e2d +6423,6293ddac708f3dfd +6424,41fa0b45572abe5d +6425,f74b5bd7809c045e +6426,18f72b9eec115db6 +6427,5f9214c44d211a07 +6428,f78c35fcf0a2ed01 +6429,525cd46f6db463c0 +6430,f8e3c03fd02ce77a +6431,0280e02dd18948d0 +6432,39e40cd83c5656fd +6433,cdf47624f680ee14 +6434,904e622192ff3b73 +6435,a12b98bc1fc0abbf +6436,aed035f3c5e5bf52 +6437,539efcee8d5debfd +6438,b65c78beb50f7ad2 +6439,cae5f8282427f43e +6440,12f584b0a26c5c22 +6441,fce21e632629292b +6442,ea00a1d0ded92971 +6443,2fd3fd9a639fad0d +6444,4f3322a5fa8c305c +6445,48d3b9e5dda1ec50 +6446,948b7072bfa8a220 +6447,8a1b7b04966a5c9c +6448,c7c5bb3ef779162e +6449,1b83c29811f2dca6 +6450,f082b16edca44ae6 +6451,46e3f88a4541f3a2 +6452,0d91a548991d0222 +6453,f1c8ed453d0baf3c +6454,d5a29e587c75e405 +6455,35d9d6b8ed3e9a2e +6456,7103e8c199477b46 +6457,9f7d8cdf602ae238 +6458,0385053e9d1eba13 +6459,1985098ee3857d78 +6460,644382c88309d213 +6461,e010d33a62537915 +6462,ee426b2edb40779c +6463,75ab7b8983970e92 +6464,15582ec058424a23 +6465,3e724e6899209cbd +6466,225e111f11559cdc +6467,cc53fb5b08d8a7ee +6468,aa578879d76f94d4 +6469,ade721a136398ca6 +6470,a7e5298c1bb95401 +6471,81991b00313f7cd2 +6472,2fa62a146b7dcdaa +6473,78970aedc95dc1df +6474,820d82adc22a5c67 +6475,166efd995786acd9 +6476,207eedf5221eb6ed +6477,1536a1fda62f2066 +6478,4679d4b6ab093a3c +6479,2ee92214bddbf7d4 +6480,545bd1e0a027ec9e +6481,89eed0f84614ae83 +6482,aef94f6cd3015538 +6483,18b7d2cae35de8ee +6484,7495a3b9f681a900 +6485,932e9875ca64e60c +6486,3553682f536285ac +6487,2379c13a542c6e4c +6488,7d01527da6fd3e29 +6489,073d26bb33eea22f +6490,497a018782646930 +6491,80a8077c1217fae8 +6492,4370d954aa3a6f14 +6493,9becbac4d07703ba +6494,8883b9cfe24c3894 +6495,6903580a5bae3d52 +6496,c42ef7dd712fbd52 +6497,f649d1476d5fa617 +6498,dae20202f2b12903 +6499,e77dfd821b79379d +6500,7d9d725ba69e7757 +6501,00bafe28b35c7367 +6502,9d9449c5ff43d9e9 +6503,e972086c587994a3 +6504,51790ab9bbc39156 +6505,456e6c059fabdb12 +6506,ca7cc5770c2fb495 +6507,bc51a4f6402977ec +6508,531ad56885fa11c0 +6509,f5d580d318c6d7bc +6510,67cefe2ac726dfd3 +6511,607beb331e4cee5d +6512,7bbc545f85b53b46 +6513,4f813276b21b06a8 +6514,3a395743970177d2 +6515,e2e6ce395101ad8e +6516,571b6018fd535794 +6517,c952a30c43584514 +6518,bd063e2ea74c9fde +6519,ddef18d0637bb542 +6520,70e45a62c8562090 +6521,cd8555ad06b74233 +6522,eb6b40a379b7bf18 +6523,a3da84e69cc72bc2 +6524,9dad67f2119939f4 +6525,ccfc61373c1f9b2e +6526,e712d23d380df356 +6527,6397c745583a0bb0 +6528,c7a5b9bbc6c0183c +6529,c92f6415a5c87c5a +6530,6161951a50c052c7 +6531,c8065df37cb943ac +6532,a725b15f846d7272 +6533,b215b0368ee85283 +6534,eaea1bc177b24125 +6535,54855584a8576e96 +6536,15ff11d6db9d5051 +6537,c3182c04d9d871c5 +6538,413f89fd44011e7f +6539,ec672cb8517cc02f +6540,310318954d7d9575 +6541,c38951f7c1bbbafa +6542,0c2f4f113193d99a +6543,50295f4e2298faa2 +6544,2a1f2dd078a5c7f2 +6545,ff8d1518f402249a +6546,8561a6f80ae97a0e +6547,9ed053c1091d12c2 +6548,ccc2dd9556938a49 +6549,d6593121ade486a3 +6550,984a55ff1ccf39de +6551,3881861f1cabec00 +6552,55c6f50b7ba0d821 +6553,1482fb964c3767a8 +6554,26113f1273fb4fea +6555,bf741365b5505c65 +6556,b4dd918501c09130 +6557,424e16cb3b698c7c +6558,73ca9846659ad0df +6559,dddcb4253ceada67 +6560,a97e376cf53504fe +6561,acf38e38b2433f9d +6562,0b4b9f3ec53fdd8d +6563,cfa9d1ca53feda5d +6564,2bfd4a81a14d807a +6565,2f7831a4ff8837b2 +6566,f826437692c8577f +6567,1a729c67b85ea2c6 +6568,83f54d465603500c +6569,16748f588472f051 +6570,f00cb71ced893d32 +6571,f543c3cd9cae3e81 +6572,9f2bc4a5159d80e0 +6573,b5f1f80850a579b8 +6574,4745fae8c5031c85 +6575,3a58d390349dc6dc +6576,46da9f10bb5023a2 +6577,5c25502c24238a8c +6578,1103d9ab9a46d937 +6579,87c46d0820b48690 +6580,cacaa529c248aac5 +6581,58bef15859128ec4 +6582,2f4c4d52e1773ace +6583,6d60ea1579eba607 +6584,09439e54031515e0 +6585,3e1f5f3bcda991b2 +6586,6d6146f4847f2ea3 +6587,0e73ffd2b2cbd948 +6588,7ecbe9a8178c5649 +6589,923b5cef520b6dd7 +6590,c735eafd6ee679df +6591,09c23476a46ea831 +6592,45538b3b6f8a56c7 +6593,56d7d571d8226a8b +6594,8c55af10cd966303 +6595,47c91095601bfbe5 +6596,20c976247cf51e86 +6597,31fe0f34a3ff7e28 +6598,c444b33aed0b4336 +6599,ddd72b43ba002723 +6600,b4a4e7a52126d3f1 +6601,0fc2e0453fc4dfe0 +6602,81086c90beddf2b6 +6603,fb01ae5a2591f338 +6604,edcf7204e6ce334f +6605,885c814a6b9b9ba7 +6606,4f171d1d11681e65 +6607,221a53422af96f12 +6608,34bacf75158ca8d3 +6609,499a1cc6e67bf4a1 +6610,4e41c38f0c6d5160 +6611,7bc62fcf8b7f5bd3 +6612,8c2071f91b5efdc9 +6613,c5520aca5cbb9274 +6614,9fd6c8a0f2274217 +6615,3749d017c0d8e68d +6616,f3796eceecad33ac +6617,e0a232192119842c +6618,0430ab179f6ca967 +6619,878ba64405bd3d24 +6620,41f890b65ea8a24b +6621,fc6372ebcc47886b +6622,8490e9a172c2d575 +6623,b583999de156a6ea +6624,53eeb61af0a52771 +6625,3c788ae581a00cb0 +6626,66dc5e21ad9c448f +6627,00a48d64f4583db8 +6628,b952316f28c2fa5b +6629,ee2163d94e31f910 +6630,c411f9f85952127d +6631,4bf70340a8aca522 +6632,4c01ff8099d2b270 +6633,9172f92c166ad063 +6634,6b1cf482933b5cde +6635,8df307b0e0f97ba3 +6636,3178649fb61f315c +6637,787f8b1a7e0eeb72 +6638,70277ff3ee83263e +6639,1fed05da8a61558b +6640,61568148e5530742 +6641,632f77051969dd63 +6642,c389ca4d246faede +6643,ab74003eaff5a4f5 +6644,7f5af5835d77c071 +6645,37ca43f6afafb98d +6646,be31d5a971851ad7 +6647,510a4dc2b81bbcda +6648,50735b5e3fa2df2b +6649,b87b732229433c68 +6650,42fb1b71bce6e971 +6651,49c174e94396e3c6 +6652,baa4a6bfeb8e064d +6653,0703cfdcfeba096a +6654,c8de6e71f95631f5 +6655,111395903e5bf616 +6656,e6d7ee61b8777c45 +6657,781e89eb5e86f2a2 +6658,8088a6c650bdd2b2 +6659,617a6eca2ed19a67 +6660,de76c43bbc1a7525 +6661,5c070327517f2fa8 +6662,cc1f60289ff056c3 +6663,3d827707c2bcaf08 +6664,c2f8d575138a7e83 +6665,b8957d8fa7362c49 +6666,5863f09fb75b1f9c +6667,e30b412e114705ab +6668,fa61d53cba5cfd0a +6669,81bc04d40cc6a0aa +6670,1bd34b9797b8aeec +6671,1838de6ec24218dd +6672,46820f61c64f9aad +6673,025c2e8862f18524 +6674,69faba644effd787 +6675,eb7185d0494713e8 +6676,8b11809a6f1a0f95 +6677,783d1301d0f15188 +6678,d9974896099f80ea +6679,1252a91ddfa84aa2 +6680,30095e8444f47e19 +6681,32d38800a801d371 +6682,5a454a095dd71e9a +6683,e32426e75f671d2b +6684,d541cbfef6fc2fa7 +6685,1ba0da5271040c19 +6686,6f88ffa8c77a5833 +6687,c7b443411f7ca4aa +6688,632a1a0d183d0506 +6689,93c4ce02c07eabac +6690,c67cd731c81351a0 +6691,8347b7b8b0fdf5e9 +6692,91856649ab691137 +6693,0cf5a4a7b06b6712 +6694,baa42fec708c7fd4 +6695,44516c1770913153 +6696,ba992943550703f5 +6697,1a72638643ecadf5 +6698,d6340bca31932b12 +6699,6d9931136d993690 +6700,e74b50793b995b01 +6701,69af6f27d068edc6 +6702,01f0e0863480ca0a +6703,b213d5eea60ad604 +6704,d2008c295f216765 +6705,ce65e9eb00611e49 +6706,f76f7cfca6a88277 +6707,1a950b4bd09311af +6708,0c3f37bdd63eb63a +6709,2e3412932443b0b8 +6710,e8f812a22cb04c87 +6711,644c130220ac7e4f +6712,b2e08bf03466e9cd +6713,3f02166e2861a157 +6714,f49f871735d0df66 +6715,1674aa303c10f8d5 +6716,68cb417b159668f8 +6717,69dad18a41dbfb66 +6718,9ed5792f46be65f0 +6719,62ed3bbdabd89301 +6720,394c24663c7916a4 +6721,7cd00598beb7c8ca +6722,6c294ee81bbbed7d +6723,b614db8cd5c395b1 +6724,48346785567ba749 +6725,f7132bb442fb93da +6726,42432a346903204b +6727,9db2d73f1a722d17 +6728,df5dbbb8129a37e0 +6729,6efced8209ba7e6a +6730,3e1cebb6719a8a03 +6731,ea25593f4f40be8d +6732,28edd7935c2f69ea +6733,f09748e08d3c2deb +6734,228d5d8ee358d788 +6735,46d4796f1fada240 +6736,9b19bfd054cbacd6 +6737,8131caf4fe8e4860 +6738,79f5335a01717ff5 +6739,671f87e8c7c3167c +6740,d4bf2ff9f8e84e94 +6741,1f91508c2d6bece8 +6742,11420fef192486e0 +6743,39b2dc2b94f8e97a +6744,0e201307b8ea355b +6745,56e15ea497a70767 +6746,7a24bdc5dd13487b +6747,3e6e9db77df59c39 +6748,41859d8e00d835c1 +6749,08da3cf6fa82b13b +6750,3c4905f6d93d365c +6751,90b71b88a0afc5ef +6752,b3661f789ce17c88 +6753,73c542d327123dcd +6754,59bc835c54b7f9cc +6755,7be621226bb57737 +6756,f59e169496eae00c +6757,9f7c3af35c18fd04 +6758,a44b4b97fdc9a23f +6759,c71f58838ce68f3c +6760,271f9ce3b4d93adc +6761,d66e746104133fde +6762,e2b92efa38d97d67 +6763,1dd6246cecdbdeda +6764,95048fba3e3e083f +6765,d0fde8c95d1a8efa +6766,878e34815591406c +6767,a6f43d9815571d23 +6768,8d09f708f9bf5c65 +6769,ac233332cfe0c934 +6770,6692e9f5d16db8dc +6771,250bd4f58311b656 +6772,a686982345117ad5 +6773,9bbee30a856f69f3 +6774,d269d741cc81b311 +6775,3d99deab2aac743a +6776,5a22c73273cae9b7 +6777,7f8b075d42212d8e +6778,c8b31be7fcc4e7e3 +6779,cd881d035d317c26 +6780,5d862c1e461b22bc +6781,4cf39f7168c07c2d +6782,80abef1a5228135c +6783,062b96fb95d74fcf +6784,5ce172f65c94a61b +6785,848a062be4168048 +6786,8b4e5fb3384192d4 +6787,98d62aa557da6b84 +6788,92f3f65a012d333d +6789,a64f80c006e6aaf4 +6790,0b2422a411d189c2 +6791,8802dcdda55081e6 +6792,8ed7255a18b1a95f +6793,cb23c661fff1ac99 +6794,5ccb230bad232ec4 +6795,7fd7c86523757922 +6796,8fea2ce3e85f7aa6 +6797,8633c9237a29dc10 +6798,b153016c1fbb1a05 +6799,f1f99d8ea2f5cbba +6800,128c9dac87195714 +6801,c7dd63d7d120e1d6 +6802,e231a9a96bd956ab +6803,334d5ff80e68a306 +6804,5c0f00c35dee8207 +6805,8d5f1ae279bba730 +6806,00074b64b4dae507 +6807,8c13ab425cb02b07 +6808,e662c27619156496 +6809,f82b73b65e0b61d7 +6810,7c7cc0c069de8510 +6811,602d11e08c369f21 +6812,204a50a21c107010 +6813,8e85195dbd9c4dc8 +6814,79d601f03d625986 +6815,1a8df468bcd717ec +6816,28dd7785cc7a70bc +6817,c1e1bf0f0d0387c5 +6818,82c4d13a31b941ff +6819,5b9a610f2b93fd36 +6820,109e846ab0c7041a +6821,dd408f3af5296ffe +6822,4153113b9086d64f +6823,5ffb5a735ed7ef5c +6824,ad3a92a3297f24aa +6825,2c26acb52d8e4eab +6826,19328f6e17fa98d8 +6827,5e10baffc656e2e2 +6828,f86a2bc52083243a +6829,22198027db19acb6 +6830,6e0911204c3001e6 +6831,6226487a1b6a9d5e +6832,10f1cd68421d86f0 +6833,8ccabbc73be77255 +6834,52f314c936ca86cc +6835,4c8244415e6449fc +6836,4fa894a0ddf3ecc9 +6837,8721c547c3a1afa6 +6838,005b7ea9d7642a02 +6839,8220d3ab50522ff7 +6840,7da5cbc8b63199e6 +6841,42349675eb68110c +6842,4fe591cd4db528d8 +6843,30111623896faa6a +6844,54cd0cd38ff77815 +6845,bb20448342220dc9 +6846,3ca33ab7436e247e +6847,5ad0b143986da1c9 +6848,858a1fc81a77e8ca +6849,37e3cbe93159fe41 +6850,172ec76f8b935b73 +6851,ac44f1821d82c1e3 +6852,026db2bfed136d57 +6853,f152c8bda6f73990 +6854,d88193ffd20394c6 +6855,3a28e2a2d4a1cca6 +6856,3d17375c27eb5beb +6857,47d6a94b4c3aa501 +6858,f9de73580266db8d +6859,0deb7277861fefa7 +6860,e4682835ec9504b7 +6861,75a29f2312ca5ffe +6862,48918bfd541eafe3 +6863,0ced60ca05b9838c +6864,1adb335f77f459cb +6865,5e4dc32550cce0ab +6866,d77fc7bd2162aa80 +6867,462bceb6abfb30d1 +6868,0bb247a5ca004036 +6869,a139ee63d108d1ad +6870,231d86b07019f455 +6871,f28da2881def7fa2 +6872,18305d6603e7a613 +6873,a84c05b7d7648d5d +6874,05dd8b1b3d6bacbd +6875,ce9c5398aadc930a +6876,7d2d7ed60b33271e +6877,223596eab258a58a +6878,5edb828f9f48c608 +6879,85757ae7121ed336 +6880,d11776b8f92fe6b3 +6881,9b5733002423dd36 +6882,aff3cc7b096eae7f +6883,b01ba78d0e284d30 +6884,a543df5155df48e6 +6885,4cd82bde6e32007b +6886,900d6d49cff2a4ad +6887,54b81cf8680d5ebf +6888,ca48438b83cbb8ae +6889,3aaceb20e837b7a4 +6890,29036690f80b13c3 +6891,3d38405e28fdcc27 +6892,0c0d5748f70f8688 +6893,30b03d8cb8f5f887 +6894,838ca1ed1f18af43 +6895,0d938bb36772009c +6896,34237b76b5a26e3a +6897,bdf873d0b2280a84 +6898,553a868aa36748c1 +6899,0638ba4089afc782 +6900,54d580fd90c29008 +6901,555d26638b625cfa +6902,b6b1eac91b14d56a +6903,31618a943f379e6e +6904,24aeefc3e4018a12 +6905,59242d3bf5a40125 +6906,7ecba71c219498a5 +6907,02004911de3760d1 +6908,b5036fe22c73e58d +6909,8411acd8e4ada406 +6910,435aec8a7a1d0c80 +6911,1fb5a41715308a85 +6912,a08277bae697e17c +6913,748d2780aa07293e +6914,d68df56912a75e48 +6915,2e75df838fe38ada +6916,161506db1723e3bd +6917,ad15d18a259aace5 +6918,a41266bc77ddb453 +6919,cc1fa5542e2b0eb9 +6920,3f5d08351c1d0407 +6921,293c4294ba500386 +6922,5d1045c676117a03 +6923,dfb38dcb130bcdfc +6924,cfab4c6478e66317 +6925,6c6d2b3b61fedc5d +6926,ebdce6720ad3f56e +6927,0183d0813a1cb059 +6928,628f72f0ef8ab991 +6929,7e2d338a9793aa7e +6930,f88fb950a9defe54 +6931,e9bcb79a497fa430 +6932,5601c8b76e1a41f0 +6933,f51a8cb4064bbfe9 +6934,f1d7d21a2895ea02 +6935,e2470018bd84dbc8 +6936,443a5caffc2db630 +6937,346a0a9893328efe +6938,161b71ee4a138fa2 +6939,7d8df294392c843b +6940,40e4b70decc347ea +6941,23d8bd9b5c866fa4 +6942,e7c4b4a516e2af5e +6943,e54fe2769dfeef20 +6944,d9633b0296e447d8 +6945,50e62acd89501c43 +6946,1ca413b4af7ae0e0 +6947,2a896ae27adb6a8a +6948,9da4dbf9d4ce548e +6949,557ca3159be45535 +6950,66ccbfb984e482d5 +6951,3ec511eb994544f6 +6952,3acf3f45affd288c +6953,e2ab2269578aaabf +6954,eb8ec0c1e8e51524 +6955,7d1d4cd658169f1e +6956,48b1584387051250 +6957,8f3845dd00f65977 +6958,479e487f96fb98d6 +6959,bd480ee6a57552fe +6960,2cfa96a21bd21828 +6961,97269beeec4ef1bf +6962,cde3e9bd8df1b2c7 +6963,c628a4b51716bf54 +6964,6df3620218b9ed13 +6965,9dfeb3e16a270028 +6966,490b94f84ae711fb +6967,b01374c55c8d6a80 +6968,d143d61e37e5674c +6969,95ba6e40b3041f27 +6970,b859ce1af9c7d25d +6971,3711d01cef4fbab8 +6972,899f30df9fc967bf +6973,82a12008bf80c5c4 +6974,ca9aa89f957dc530 +6975,0bfc0e810c48f264 +6976,d8dd400054c12352 +6977,ffbc8940c21fe4f4 +6978,193ac00075d70dba +6979,6a066f25df2244ae +6980,36012845cbf5f8ba +6981,5bc26e20762bbbf1 +6982,d01c93b26aa6aa44 +6983,53474a04d593a39d +6984,f817553b818b47f2 +6985,88f4dd68c95cb5a9 +6986,85b4da110a1d7395 +6987,20cc602f3ee8cca0 +6988,f06b3b6d8b079e73 +6989,a4f75cb68fef36e2 +6990,5e8e929e63df7581 +6991,f51c544d0ae2b0e6 +6992,a981a4feacfb0aa2 +6993,57678628d839594f +6994,035c2188711252dd +6995,a79b0b98a2d04904 +6996,00780111df4f88f0 +6997,8ed9a2c58dab1c67 +6998,6758a802c99bd076 +6999,5afe02b7d1180ff3 +7000,958ca6f28a09c4ae +7001,41924ae132cebfe2 +7002,94b6d1ad4f9cb288 +7003,a82d8c2e1ad08e86 +7004,a74a015ee075f959 +7005,6fdca27314d88649 +7006,6e8f8c78eb854a30 +7007,32acd5df4c0487a6 +7008,570c39dec6c21080 +7009,8cd4210258f10b3f +7010,db940f21c1ff321e +7011,b88a88178a90c541 +7012,37252d782267cccd +7013,8d1f57cc6de6c05c +7014,3c2fa1346018c078 +7015,bfaeb9e77439ba81 +7016,658403d6cee74009 +7017,06ff5146559304af +7018,4496514b5b4ad442 +7019,4ad49178ff0c998e +7020,dcb422c5cb9e703b +7021,78b71b6a58ae82cf +7022,afa28084abbf06cd +7023,8e9aa9d48082d2f2 +7024,4f1e5f47e24f0ad0 +7025,a3a98078eca21536 +7026,c3d8ae61bf77189e +7027,11905e7121088b95 +7028,5b423cf70c64b316 +7029,2f42081da9a8674f +7030,da4c7d2a0a32e5fa +7031,a46846128d99516b +7032,2fc9fddbfb02c335 +7033,f9430e8dc8601406 +7034,025d38159e1365ca +7035,4f2a3c60752b4c8c +7036,857966f6b1dd630f +7037,0bda18de62119adf +7038,93ba9e2ef0727fd7 +7039,d13734c82e7039a1 +7040,6dd7728cc497e6ee +7041,971a37087add8c47 +7042,900005bf5757fbdf +7043,c7006253fb8d334f +7044,8e153bf61c621e2e +7045,8d5315197af8a66f +7046,e81a47a2271d371c +7047,093eb2132881699c +7048,c50a0128c9ff388c +7049,b08ef61ddda19131 +7050,1f6a5412c8d42e1c +7051,b8f9ff86ff1e73b5 +7052,54ffd8ac1cfec0a2 +7053,62a27c5431150b1d +7054,eae7873616f411d1 +7055,b2b0faaba9f6e4f8 +7056,c3b5679f2373796f +7057,d92a7705061f5e3a +7058,18d2160d407a128f +7059,f0292f956bbfe3b2 +7060,d524bde301a5782b +7061,1e1d4fe9a54cd2c3 +7062,a56a323198536fd8 +7063,65d249969621c565 +7064,f91b9c0cdd87d889 +7065,ab419abb77c7bcc7 +7066,8729a123dae75bea +7067,f2e75ef75e1cf632 +7068,c57eea7615edc403 +7069,991fc1f18ffcd9f3 +7070,5a34b8bae9719290 +7071,5f03699a2fe8d39a +7072,b29ad97fb5a4bcc6 +7073,ea3ae59cae3d8a32 +7074,0538f2c98f875b8f +7075,8dab04efdc0ee8b8 +7076,bea1ea2fec31f7ec +7077,4fb00ff770b8d7c5 +7078,93e3c45806263791 +7079,b1fcb2a3db87cf4b +7080,d324608947235090 +7081,23a666aad2963240 +7082,826c1fdae2af59d2 +7083,3d200fb08aed226e +7084,beb86e739de3c771 +7085,8c45809b7dbf72d2 +7086,5913e31962d4646f +7087,673b26977dba6397 +7088,21ca05c54ea75263 +7089,8bb1afe1543a2252 +7090,679662c591f83bb9 +7091,4f35c74c49b089e3 +7092,27396d8f254055d9 +7093,25eef2d1ab13b2d3 +7094,295c46b81e661107 +7095,a6b99d5f3a1e4094 +7096,22fd6c06d11853df +7097,1f2753d44a1848f5 +7098,28506e0363d3130b +7099,be97e1c2c2bebca9 +7100,7f83ac6e67914299 +7101,0a62fee3d1cfe327 +7102,6a15f905f507e3f4 +7103,19da2da1ee196269 +7104,4ba7cd415e409f09 +7105,60e096e015a342ac +7106,4c8ece4ae57b54ba +7107,336c3fa47e851292 +7108,effaf64cad8ef9d3 +7109,39d9b6850f9fad6e +7110,2e847b3fa533d534 +7111,def5bf7a1424a749 +7112,d6513332258ef64f +7113,91123be1e546e32b +7114,f08472bf3c4193d4 +7115,d84a4f6c04ece24a +7116,225842e2b3a5bff7 +7117,d4237bd823384916 +7118,fccf11bd29396044 +7119,18ff7ac12f194a37 +7120,1970db3426d0b398 +7121,217a34c010508573 +7122,06c69fd42dc7b2f2 +7123,4d4a11c66594a085 +7124,1f82415ef416f6af +7125,a89a342900c5bbfa +7126,dfe11bcfc307a382 +7127,587fb867700c59d7 +7128,d09e6f6aabd0b01b +7129,46a197936967b6a0 +7130,f8296b755060851d +7131,d27c0c8e3c5ccf44 +7132,8a8716d8b96d53b5 +7133,0d689ba0d6fde2c5 +7134,374927525b9d6548 +7135,c25b9a36875a3aa2 +7136,745ce3ab52156136 +7137,403b9ff720528038 +7138,f3100ef39c108db0 +7139,d781ac693389c08d +7140,2c6e0a61acd1999f +7141,a4f89d301d058d09 +7142,8e4c942e80683681 +7143,b7f38806fc6f171d +7144,cf5c3410644ff026 +7145,d90892ef5444a7be +7146,30f69f1f9de61732 +7147,cbe8ebff84b922bd +7148,99f07fcd19f16714 +7149,a4c8f07cc702d044 +7150,2f53af92baf96eb5 +7151,02a88dad793d68d8 +7152,286675c011e00ea5 +7153,86864d9f0b1d7b42 +7154,ab395b4b709b63b9 +7155,40f40963869b1c82 +7156,b8dcfc79290a9633 +7157,33c9d2f6d9ed0479 +7158,8ee0cdca837d2bb5 +7159,e4bf72b27c64c7d2 +7160,6cefc6686b5e8ca9 +7161,9763ea162537d3f0 +7162,cfb5f8a18caa9acd +7163,34ba2aa2fa1a629e +7164,4784d0853ebb0eca +7165,2c9c417985f337e7 +7166,b8392583fc84624d +7167,f5e64f216b4bb59f +7168,1603daf1a215a814 +7169,58e2c90688dc1a47 +7170,35965fd8a11c4176 +7171,ebc271a76bcd8b13 +7172,030567765ef14bc1 +7173,a4f1d6cdab700014 +7174,d9c4da3a19976944 +7175,055c45e1d8cafb2c +7176,d5b78d6c99eb7f36 +7177,a7d25584331fdad8 +7178,e5420a3e723db0d7 +7179,fd949df3137cdea8 +7180,f863c51f02322288 +7181,7d85f929bd849105 +7182,bbd79cf96af7d437 +7183,1236000286a98562 +7184,3d82d0e02ead460b +7185,ede46e6e3d560797 +7186,b6fd97a973133f2d +7187,7a03a0e22989f0d4 +7188,b12dd173f0c3d622 +7189,5933abc84756b10f +7190,4cbdf7fc2a7ac16d +7191,43a8121dd0faeb57 +7192,4e0f3a8c955183e0 +7193,aebae0d4dd1822fd +7194,ef0f0ab7e7955a1d +7195,7884cab1d3a99b82 +7196,4e6a16ee20bf1044 +7197,cec37dbf368301ed +7198,a8c26c19763bb51b +7199,c75274c49bac4195 +7200,eec0635dbb0e7baa +7201,a043bc914839db2d +7202,ad59761fe73ce81c +7203,2c7e124ceaeaa486 +7204,10c5f0190aa3a453 +7205,1a4091157086bea6 +7206,b5cc48f48954dcf4 +7207,c7209e04f2f2c0a4 +7208,efb2379fc8720368 +7209,5adeefe76b08f022 +7210,5f83209594725e7e +7211,48027ed85c742aac +7212,145ef43d5ddf98d2 +7213,535130bdf6ff3988 +7214,a0169512bfc76874 +7215,c112585fa28944dc +7216,d79e67b9ca57a977 +7217,d522e4184bd772ce +7218,817f0c46c68e7736 +7219,465fb35650d471a1 +7220,d1ba49ccce062c90 +7221,2972ae730c3aa877 +7222,898e698b30934049 +7223,4606dcd55acbbdb1 +7224,2cdec35f8872dbd1 +7225,f0a0f9217e972ce7 +7226,912446d3ced532d3 +7227,50722b50818575f3 +7228,0590636b6651bcf7 +7229,f93a564c1e9f9e7e +7230,d3c5f9f167d4d7fc +7231,afd0873a82535f00 +7232,1d43718c38b5b0d6 +7233,9e4454cf129cb3f6 +7234,7c6341cc04efe471 +7235,d73b4ccb7e680e70 +7236,7a70e556324c66c6 +7237,26af4fb8f95a6ef8 +7238,d249af5d3b123d94 +7239,08f6d0ef990282f6 +7240,96a323d28c8997c3 +7241,194bb940f57adddc +7242,a152e5866ef56a1a +7243,65e758ac2ec9af51 +7244,631000c004339322 +7245,bd08601b1f9a5a7d +7246,4c6f3e09343b7133 +7247,26a3075fa84ecf3c +7248,a0ccb6c1348bf8d1 +7249,083b1c9ed41a9e57 +7250,a6bc08d5c5dfca08 +7251,a45b18760c10ef34 +7252,a846cc6d6ff09bfb +7253,2aaabd0a5490e490 +7254,dc2b0072bd75620c +7255,c1ce089e3fee09da +7256,40d0f1566502b103 +7257,f3ed2992a19ddbec +7258,9fef0d93025b060d +7259,1774423929ac43bd +7260,8932a7f9ac84102f +7261,ae9d2bd66beb5015 +7262,a64898d895e03ea2 +7263,0523c9107b03ae91 +7264,2b86088962197204 +7265,398fe9b26153f778 +7266,65f66a7c5966397e +7267,bc691ab9abadd504 +7268,2c58228d02e27428 +7269,67104be7f4dba44b +7270,dd440ccbfdca5784 +7271,70b32a388033bf1c +7272,014f3210668dcb6e +7273,ede7fbc6adf25dce +7274,003bbe25e0c9baeb +7275,e448f50831399984 +7276,e2b7717ba6152e77 +7277,d39e2e7ffa32fb8b +7278,9f5bc48058f4745d +7279,74d75f884b03f67c +7280,87b4724657aee6b9 +7281,69c495d76351247a +7282,3094a4e617f4c5a8 +7283,c40423e8d9d5243e +7284,229df9157f36e490 +7285,fd16689c74bbc19c +7286,3230f732201da8f0 +7287,2630f267fd2bd0cd +7288,e4c186fea824d1fa +7289,2b39b3a0f70f933b +7290,24322165b936fbb2 +7291,c3fc627037f939c4 +7292,f0f7319dcfcdbdb0 +7293,0466747c9094b641 +7294,ae34b5fa63b97a9d +7295,d11911b754eb91d3 +7296,6ed9f84fe86ce927 +7297,561712e4812b4db9 +7298,50091b758ee734ac +7299,a233e15c585555f3 +7300,96bb3c29f7c8273b +7301,e6b04e0fafd2db68 +7302,84410e69f8b11a93 +7303,43bf04fd71f86348 +7304,d55b4e6d1b85c6ce +7305,31db1f121a7c645a +7306,4a7f8a2a4525b7ae +7307,8538e0fa4a672b1d +7308,0be4786f7369663b +7309,a92d63e612e805de +7310,42aeeccaf2723976 +7311,c88cea638341e0c8 +7312,9e5e2fd97f641837 +7313,d44694fea5b332fe +7314,baeb6ee78bdb2fe9 +7315,363ea504d35f83b2 +7316,1db2132775dcb6ec +7317,f000dbb39c22765d +7318,1842a8f4dcfc44cb +7319,894b5d55f167a80d +7320,220ce1d98389121b +7321,d839e9f438473c0c +7322,e878c100e3b05e1a +7323,d11aab1928f00b83 +7324,37d8d12ab8e2f353 +7325,a9c97e314f4a8c76 +7326,9a46e707abcbb907 +7327,7c5a4b6404cc0310 +7328,8c2bc562174ef19f +7329,e53a7155a2504f6d +7330,86e6813adb7a906a +7331,97b691bffd619b08 +7332,e8fe89bd237e9c86 +7333,ebd4822bec51ec14 +7334,b8dce062b0ec3ecc +7335,71f396b7cb7b9f96 +7336,26bfd4cbf5a54613 +7337,984970f200eb9118 +7338,9f89f627e93a55f8 +7339,756daee0288af96f +7340,52aab01ff8952487 +7341,3d0c8fd20425802c +7342,e9b2b01048d95354 +7343,b603e6a9618d876e +7344,108dde59ba4d928d +7345,8bf2ff09dd762542 +7346,9338ce882f1655da +7347,a6344d06aa28d758 +7348,9d6e6159c84f4277 +7349,512bfed21a48db0f +7350,9f92b472b2153786 +7351,31d92ba1e328801c +7352,d173841a3c479da7 +7353,4ca831f2dc008f5b +7354,ecaa0b315a26c63a +7355,be157bd192212abd +7356,ca664e0c93684297 +7357,81184a52060eaf62 +7358,4c849e09fce84fc8 +7359,1dbc1b1d93f99769 +7360,495a2c6d29ab5880 +7361,5255c43324b6c222 +7362,72f20179945a298d +7363,4c729351694a59f8 +7364,019aa32662b0ed3f +7365,40f969c6a5fbe6dc +7366,faab8149bdf7c582 +7367,66fa53e806d7d8ed +7368,5066b6c7858a4364 +7369,053ffa1c531d0ddb +7370,79ccb09974059ff2 +7371,f16c4e336e9355f3 +7372,84e2cd86674a2bdf +7373,5c1098cb7766dd7e +7374,6c05338b62b407c5 +7375,6450d8f53e9207bf +7376,69265d8d03587559 +7377,8b9893777fa4e304 +7378,70a06a0690a1183c +7379,19a4014cc9d6d7ce +7380,8369d7f16344740d +7381,b6007689217750e6 +7382,9d4a60c2203736f0 +7383,e4dce36c81cc8ba7 +7384,dbf1dc7ec567910a +7385,a59a0484ab7d43a8 +7386,e96615024fee130d +7387,2a9be34e08719e20 +7388,89e22d1fd44234dc +7389,48a16e61044aba56 +7390,51ff8734f8e31a9e +7391,3ebc906d2ac9e549 +7392,2c5b1029571002e6 +7393,a89f3acd263939c5 +7394,44e1e94f789c206f +7395,f887228c4ac55d4c +7396,8e5e82be428ad246 +7397,31ec9be908c86592 +7398,88f8ac6212cf60ec +7399,bb25d00ac1aae1c0 +7400,031862808537dba3 +7401,a99990180dbf2f0e +7402,09434ec24a222c27 +7403,0b4919a59aa363be +7404,933b608d98d17b62 +7405,a382fd28bd1081fd +7406,050943e74eda7f00 +7407,226ec9d2418639d8 +7408,85788e27c2d7dc48 +7409,cbc1f86cd9b0f4a0 +7410,f04576d365cb4768 +7411,029e514f9e5bf7ae +7412,ea1442ed1bf24a75 +7413,c8bf13ba06edbb5a +7414,12749e6246a38ea5 +7415,ede3db853ed9051b +7416,53f3e90c7ee068b3 +7417,5ac1375df97d0e01 +7418,6cd3941efc44f449 +7419,85c7a7343b32dbc5 +7420,ec65fadc2cefd2d4 +7421,55cc183812898ada +7422,3e955b273987f0ac +7423,f982a46fc4a18738 +7424,95306446cb4f79d0 +7425,095f8ff27b64c451 +7426,15eb6688d8ed744b +7427,fb33e77aa2e88279 +7428,5012ffd87f035df6 +7429,bcb10d9161c12690 +7430,bf00b58abdcd4be8 +7431,ee8dfe9c7df62aa0 +7432,3c8ae894d60cecdd +7433,a733b76cb24ef361 +7434,5f11337557511206 +7435,4f0ce0c230c5057a +7436,6b229c6c1de6b8fc +7437,035a12ab37759727 +7438,b1977226d51fe621 +7439,a9e34a2226aa2b61 +7440,0dab0c1652f1a222 +7441,422ade0c9fb31e7e +7442,26db18ddccc8d238 +7443,dec0f462be1ef246 +7444,3ff34b931ef0871b +7445,4044827eafe6b489 +7446,e4e332b0b7a0d045 +7447,1c7fa10aeb12f11e +7448,8c467bee60cf4a4f +7449,db7e0ae6e1e3f0c0 +7450,f3b3a6ff8873afb5 +7451,1d1c3ac17c960f2d +7452,908612c152f19632 +7453,bcf3988eb67ef7fb +7454,904d784118e15561 +7455,1f7d8d1c178e2161 +7456,535199c4bd990ba3 +7457,6396d916c366b22f +7458,a07ddf640c1a559b +7459,a869c0e27cc3897f +7460,075ad21bb87506a0 +7461,b151921ba6399250 +7462,82f2551ef56355d4 +7463,a235b271a3f5df6b +7464,fdc173e47b4f6d87 +7465,9419324873e27f70 +7466,b18a5cf4a732986e +7467,11f3ba9718eea7fd +7468,66990dd46bdc80f5 +7469,733435e090f29215 +7470,f31095d8a060a8c5 +7471,67dbac0cafb75ad4 +7472,6e8767cf7ace9924 +7473,1bbb645967214e11 +7474,62173fda12239440 +7475,aeb08ba0f641db44 +7476,4d52f94ec9c65237 +7477,d9012a8a469c4991 +7478,c0c599bd1d57e219 +7479,3c1b47672198f68f +7480,8677df9a8c0be92c +7481,cd9a5c738a1b7b52 +7482,af404342382a2d72 +7483,4ac5ed3e6dd4aed3 +7484,7167c0e0501ef35f +7485,27f7dabca8d75eb4 +7486,48b792ee5d0f01eb +7487,caf41229a38d4583 +7488,304a30cc5822cfe5 +7489,1bb29a9321d35e97 +7490,34be8a9de7b1ce72 +7491,3367f420a1f26554 +7492,90ae93d5685e8b29 +7493,4c8458808ce39b77 +7494,6dd0b91468a3b5f3 +7495,7ea9d964e831f101 +7496,683088171f93bfbe +7497,99563ce20707573b +7498,2993a649baacca38 +7499,6238ac3c45fa118f +7500,b7dd55cce48d5164 +7501,5e3ef7f5cff6f547 +7502,f4e83cc02073a774 +7503,b58842c4f24e8c8f +7504,4abe75a665abdf8d +7505,4b65ca14a1975d7b +7506,ce65fb420f45e2f5 +7507,81c70b25c5bb620e +7508,7d297ba75b18c318 +7509,754c844f60247d17 +7510,4067a2aea41bf1e8 +7511,e6494992de65d3cd +7512,73b87768623ed20b +7513,03c8b9889e2bb6e5 +7514,e5f419cade5d8f21 +7515,67e084f628dfd94d +7516,4c08c215e995e530 +7517,f1b3125b119a2b4b +7518,e06b812be8e87679 +7519,e6da0c8f1f1bf343 +7520,4072acca0fec6122 +7521,951a9dfd99210869 +7522,48f41f7adcf8ac88 +7523,2157d4665fc5ab49 +7524,944dcb71b8dee0d5 +7525,84423f7488f67698 +7526,40997f96f951c94b +7527,e6380e7a2557bace +7528,ef82493ce7f47765 +7529,93537fd371ed6594 +7530,bc7634df1dd82b9c +7531,91c4d6dbbd5346ff +7532,4a3041baa323a50f +7533,0fb1b8f5ac97182a +7534,6d6057865a4dbca2 +7535,83d930b004a23d9d +7536,94d6312177619d09 +7537,d3a8fc316f36f1fd +7538,daf93892a854cb6a +7539,718994342ee5e321 +7540,ca35dd781ba03c5b +7541,2325c517f3cdaad3 +7542,335ad0f50d0bc4e7 +7543,ae24bd76969f2544 +7544,622635dac3bb7552 +7545,6b13edf491989d71 +7546,6fab3569baf3d022 +7547,cd432378bcb1bc7e +7548,bf68e53407d4b31b +7549,c9572d1a9a92383b +7550,b9e34e453b1181b3 +7551,0ecc1134a60b7fa1 +7552,987a21447e41803c +7553,d88283e0b1a7bd3e +7554,2cd945306340cae1 +7555,058a735e2669a1fd +7556,10a08b83404ed776 +7557,b183b97c403e2dd4 +7558,dc40a62ecbd6898b +7559,7b7eaad1716642fa +7560,4d4fca2a26d05906 +7561,8bc16fe2cc588254 +7562,c5e6102e28932d93 +7563,b86599fa4f82db65 +7564,025d6c2367c568ad +7565,d6d237093ba8b095 +7566,02f5db7a28561eed +7567,da1b0843b9c9d397 +7568,71fc101d02d798c1 +7569,35687de9aa1dd605 +7570,2b55203886ede379 +7571,0b9112d248819a17 +7572,a58b2a034c455884 +7573,5abc7311f740a30c +7574,67537a4387cd83e3 +7575,c21215e31647e2e1 +7576,8e182404ed8e331e +7577,366fe8d75df9e6b0 +7578,abc193f879e43c79 +7579,157f1b1e0e32a1fa +7580,2a781ca9efeacdb8 +7581,d8ce9d98f16dd415 +7582,9de117ff406b9c05 +7583,81f42ae2268aa292 +7584,7661769ff8b7504a +7585,be61f8ef2997b7b5 +7586,cb027494cfb226b2 +7587,2e1840aae701dac2 +7588,73cc69a78d3e5b66 +7589,2094c265e0f31e52 +7590,a1eb50e8f8bc93dd +7591,d39f5aebd0949e2d +7592,4fb4b1aec76b0f8b +7593,a6acc4bd1edb68bc +7594,4e185b262a51c717 +7595,a908797c3d6be308 +7596,eda1418c2ca620d7 +7597,a2b9b9419d4d543c +7598,45e92a1c34affea6 +7599,623beff9172bc0d3 +7600,2109426385b061b8 +7601,58b9d035e0c02918 +7602,42510654af662271 +7603,444225288d6ca79f +7604,79946a614e5b4f68 +7605,b5e6dd00594193dc +7606,3a2122a1f8d6502c +7607,806e3bc231c326a0 +7608,3ab5c5178f2639a0 +7609,a495400f85a09467 +7610,d7f58170ef49ca38 +7611,f6c6f3764a61e01c +7612,78ffe2d9a9039365 +7613,a39da1ecc87d4c3b +7614,de207c1c651b2411 +7615,c1be3631a44300db +7616,de5c4906850e01a1 +7617,1a69235c0926cd10 +7618,b33764cbeee09f63 +7619,04154d454ac98724 +7620,4ff2d55daf9e5a0e +7621,9171e756452f746e +7622,19eb1d95897b4cd3 +7623,d1a68794a0841805 +7624,553c04bb56c2fb9b +7625,532ed3f16d2d46dc +7626,e5d4c75481e9094b +7627,af3500c16fb8b5ff +7628,a5f437ab9ce7dd7c +7629,5836c4598acc1481 +7630,eeafc9d171ba8766 +7631,3596ba1507b5f1a9 +7632,04f40def08e05912 +7633,20fbcaab5bc12974 +7634,04c604ca6ea2d981 +7635,cb3de7b8cba2c435 +7636,e067ee2878864a9a +7637,bc8d8d518fad4861 +7638,dfaa3a9e40da3134 +7639,795b0a6f2657158e +7640,19fbd6b009d24ce3 +7641,3ffc5fbff519dbe6 +7642,639ec15c06f051e5 +7643,6bff963f846c7fc1 +7644,e6ffa0aad75749e9 +7645,07fa39f76c4f8024 +7646,0e8359d37df584cc +7647,2ce2c4f31272971c +7648,f5f77a4d48d9294a +7649,0d4f0bb5d494b226 +7650,f71a9a24b68cb008 +7651,6f1d552e7bc3ddf5 +7652,6916407482c159f7 +7653,988ae08ef989eb49 +7654,ff202afbe0f3ed10 +7655,d0b221e00e3fde9c +7656,b0d8db271d35b685 +7657,13611b674790131f +7658,f0b775d829a0f4a5 +7659,f363fd1b0733de5b +7660,7c6513354ed1a521 +7661,4d79a37d92b59d1f +7662,2a4f06cc8883e716 +7663,471daaa937dc4d5a +7664,f9efcdb53b29497b +7665,006a2aecec981e4b +7666,ab722e4e3dfeff16 +7667,1eae238a4e2efe9b +7668,7748c196c44715c8 +7669,5558e66cc55e886b +7670,81dd1e14be9d88bf +7671,b1f4869ffacf37f0 +7672,12462f4627561721 +7673,821d90e94270c682 +7674,b0649a3ba5cb1ee8 +7675,2941fb09d84b71fc +7676,05c1bc13d8d12123 +7677,4cf0f3054d247665 +7678,99040593c2f7e8da +7679,3370fbb579735e24 +7680,adfccf6de6274f7c +7681,ea3c393f9309c772 +7682,c0e71988c38b582d +7683,e8ef254dab54255c +7684,c25bb1160f767945 +7685,accf2274ba6ff860 +7686,e4d0a85fd76fbc52 +7687,c813fc5e126d0a17 +7688,feba92dbe8990555 +7689,d14557dc3d11246b +7690,49569ba7bc3a63ea +7691,cd489e8ce1e98e75 +7692,8385320d6f9f561c +7693,b640d02466b3a587 +7694,dad06f57f650e837 +7695,df90fbd7194c666d +7696,f21e19c992c2750c +7697,f7227d6b60767583 +7698,542a8b1068bbd8d4 +7699,0f74f44dca276f13 +7700,231007ef79d22c97 +7701,92382d2a32c301a8 +7702,ad376b2338950045 +7703,814ddee1a9645bc1 +7704,1f6a086f1ce6e780 +7705,1628c3ff1d4b05b3 +7706,6eff6028f944c239 +7707,47ecac553034359a +7708,31ce6eec79f320dc +7709,8d009577802da069 +7710,0e1e03dc24a166bf +7711,078a5fd374085f68 +7712,21c29f2f2cca01fc +7713,744305e785937f6d +7714,46d05f850ab66b25 +7715,6c46ae36eafeeb05 +7716,900687d70da63bf8 +7717,5b6b480050448002 +7718,43989c087a73c062 +7719,f4b3fb60773d7f7e +7720,b819b37e4067400b +7721,7c8a91a68b2fda64 +7722,22d803de655cfc7a +7723,503bf73fb284a4dc +7724,ebe264e8a63a7553 +7725,f988e54f211cd811 +7726,84b00d830dd2880e +7727,0de1656df292426c +7728,d2ba39d57134c3d4 +7729,59675496dbb6a5cf +7730,58f2768dc46876c0 +7731,9e8a02938789f780 +7732,b0f8d6c1f44548ec +7733,99dab1b468a3516a +7734,41b759a6eeac0d6e +7735,2a0c3d6522a805e8 +7736,8b12d94a874b64c6 +7737,740741d122ff4380 +7738,3f8ddb214d90300b +7739,ea67557774b5e7b5 +7740,a084bffa098163d0 +7741,d0bda71e27477435 +7742,82ff4d643653c13b +7743,b1d3ef9d4f3b8a13 +7744,72974cb45205391b +7745,1401f18886fc6d95 +7746,11052448604969fa +7747,4ee8712e4ce6ad9a +7748,8bc0b2345496347c +7749,0dd27fbbd1abc25a +7750,6cd60978b179fbd8 +7751,42c1fcc71b47a530 +7752,f06687499d47f4ac +7753,01a354c4427c4f4a +7754,b7d7e1bc068e1382 +7755,ca950a912ea60ca5 +7756,6c6cbaff120d0829 +7757,abd9091c0c10833c +7758,5c1207fb87e3863c +7759,b7de055187ac2d57 +7760,af9bc6c7d6d1cb0f +7761,2a9b968ae677cf95 +7762,0a6948099a2a36be +7763,3451af38ca32b4a1 +7764,b361469e9d0b28cf +7765,1d0713e1ba778c88 +7766,ddde88a55417a966 +7767,e5cb1360df9729ce +7768,12a9c1e96b32eb80 +7769,c6a46cc1825411c5 +7770,c63fdbbc94f32cd0 +7771,6b976b90745614cf +7772,bb3c315b0f3dda17 +7773,f69bfbe2f57d3811 +7774,9a546ceac4f48737 +7775,43883bab5558edaa +7776,460758da8669344f +7777,8352d16357e9456c +7778,4d9a0ee471537b5d +7779,864d6902b8b97b75 +7780,00ba8788a1ee4e67 +7781,7a8826a9926fa1ba +7782,837d952305d38c77 +7783,e9a34b17c15dd029 +7784,940bc1b76692eb5d +7785,4f55f28682e55bcc +7786,b47250cb55254dbc +7787,60c6ed2453db33e3 +7788,7d2d0ba11a309745 +7789,73e76553d2d888cf +7790,e966f089395acf30 +7791,28f6891a12c6b272 +7792,dbeb845e2da7b6bb +7793,f4492e7b06e0382b +7794,cf37900db65a2305 +7795,7b5819a5b6ff2d00 +7796,45cabe122560323b +7797,bbffc46a270d455f +7798,23389261d72b05a6 +7799,358cfd5ef38ed536 +7800,1d014aa3cc87d06f +7801,b7b08aa4155f4a8a +7802,d14d1eea5b6fafd4 +7803,81086d6c6b21fd4c +7804,0a6819b65487d0d7 +7805,d9658feb31d39b3f +7806,6688766460043ad3 +7807,b3362f446ef70fde +7808,ac01835a8be2a37c +7809,5ca476f6adb800a5 +7810,b6598fe238e4d68d +7811,d6eff7b09ce2b5a1 +7812,b8e68d0456af154a +7813,b71e67c5159b6d77 +7814,80394739c9652831 +7815,a423ccee23b2c544 +7816,b8562b48e5f9ae48 +7817,87a885db44ad6a5b +7818,5cd5d3ade6bd4644 +7819,8e64e4d43d831b63 +7820,b29a4165454be091 +7821,39ea5ac942b3267f +7822,0baa97d15107d072 +7823,f5d1b1fe9547e282 +7824,37b4bc5763a0b77b +7825,15e74379a0eadbf8 +7826,3360aec50c411ead +7827,ff375b6c860c7bed +7828,2ae50644dc3e0ec4 +7829,da0b4c4e8dd1e006 +7830,445fcbea38c14143 +7831,635b2ad72c99b3c6 +7832,0550d0665635f178 +7833,c01cb5993405eec8 +7834,9b86978a9a4dc8f0 +7835,e5eeb9ec6899b67e +7836,a478bd63c99d9a1e +7837,0f515d65dc6d4ebd +7838,a6cfc322fa44c27f +7839,f87db2e55262f5b8 +7840,28ed8acdc28d8491 +7841,3b2ee1aaa798c0b7 +7842,631fd31f654ad586 +7843,16d06009d93b40c2 +7844,8d49bf8eaf061d2a +7845,657a998f63b37ef8 +7846,feb4b5fbdc6a6794 +7847,185aa607b1100247 +7848,944ca73cff121443 +7849,49531d6159f69ea8 +7850,32b669dffcd96251 +7851,66cf74f28099a453 +7852,60368a7c40554893 +7853,540d6a4eeefec419 +7854,c5948d1b257df6bc +7855,1ad85032196e8588 +7856,90ba28c521a27015 +7857,efd421ff87fa1a3c +7858,f99f26208946f21e +7859,516e8007423e9ec8 +7860,c7ace6fcc38089e8 +7861,5d65fe028a82c68c +7862,b4c88accdf1da4b8 +7863,8aac22c045799445 +7864,597db70d5d809e17 +7865,6d52b75c4cc1a326 +7866,1666e390cc922068 +7867,5bf2b1539ce8e7b9 +7868,c6485311ceb4eaec +7869,b5c5c2ddb71df152 +7870,597a20f566f4afdc +7871,7f5dd780b7b0c744 +7872,87f8714f6c6cf888 +7873,a3daf5296ed7fa62 +7874,857db4193337f8f3 +7875,128cf95477436244 +7876,7b2e5a8ed3d19b5d +7877,b56487471385fb2f +7878,594611eef1ffa486 +7879,4297f756ced8d316 +7880,b154baf29dfa6bea +7881,49a43d0d1b6069dd +7882,9ca9647927fd55fd +7883,54efcb2ce8bcfb51 +7884,3abc41e7b1048a50 +7885,aaac68a2197dff9a +7886,e8a5b3b4a6ba7fcc +7887,e167f5fdd25da402 +7888,87817b5e2347e845 +7889,7a6460bd4fd28d58 +7890,28e4227cdffe9e46 +7891,0aa628996a09e34c +7892,f45a1f6d1be053f1 +7893,4dd984100828953e +7894,4ef854545e877e82 +7895,291438d985c55a18 +7896,072b8ab3a6e86686 +7897,de660d9cc916b49c +7898,98e2de4a71ef2fa5 +7899,3f176ab7cb78623c +7900,aaa5381f649d685f +7901,2041692d6b22cda8 +7902,1fbc962fe19c85f7 +7903,5cad9b1082f6baaa +7904,311e1616366b2a73 +7905,a20615317456f548 +7906,c903c2d6c17309ca +7907,d80612c317febfa6 +7908,86fbe8ceb8cfdf16 +7909,a4bbba4b3d4b8e83 +7910,e40f1c924a4785df +7911,b723dafaec76d830 +7912,5509dce64e65a7ad +7913,bd893748eecc6bcd +7914,9f3eb0193ac2130d +7915,0c619095f106172f +7916,b8a2177248e56a9b +7917,b2630fe4cdc6d5af +7918,59119ed514cac763 +7919,b396fc357026093d +7920,8671e69043f6c527 +7921,2b7664b3d0a9f2fd +7922,946a81293c540215 +7923,2d88361cf3878085 +7924,a41dd359fe54e4ac +7925,ffe8a67170d23f46 +7926,c8a0d84376653b62 +7927,03b6953e2ff7ac07 +7928,ceea3a4cb7927425 +7929,77609dfc457eea1c +7930,5770d197592a1228 +7931,dc3cbc8672133bde +7932,0576f1e78f709d04 +7933,0a1387f670a562c0 +7934,312e6f0f2086687f +7935,d5410fa714500dbb +7936,ff48703a5c794ed3 +7937,884997785f70e59d +7938,d4c9912cbd0a5c3a +7939,79cf7792e938fa78 +7940,cf44b8015a89833a +7941,a47a0fc060c6f4c4 +7942,8f8c219924fc53f9 +7943,a010abc5756e8f36 +7944,06ee903539bf79e0 +7945,3c5c64673b7a1e32 +7946,df523d8f5af7cced +7947,a78c8a0db04ad46e +7948,a4874e7d929dd75e +7949,d26156dbe3b667e2 +7950,897e9b90a3ae03d4 +7951,0f826c025ec36607 +7952,c7c24805d76ccbe0 +7953,6f6de71fa0969c8f +7954,49e343c3c93bedba +7955,8c0948bfb2a337ad +7956,48f1d86d86bbc6b8 +7957,913badea454f5e6e +7958,5f6a1412165403db +7959,2e890980920d0341 +7960,83fec04bf8ea00eb +7961,73f27e358bbe52af +7962,2dac5c06939a9e25 +7963,71b876b23868d919 +7964,505fd1c1fab8ea2d +7965,2f4827c172c9bff1 +7966,baa673cc860bfa08 +7967,b2ad4a81924a5bd1 +7968,b69e96fb40b88c26 +7969,cd12e82cc614683a +7970,383a5f71a6d44bc2 +7971,9b4f91e030223661 +7972,dddb3d104ab4cb96 +7973,91bba3194b00492b +7974,5ceb48336c8466bf +7975,1b5c86c1038c009a +7976,d0ee01a47285536b +7977,63fd624ec159d4db +7978,288104a505ab67b0 +7979,59fbc98de6d27a87 +7980,2b6067edfcb258e3 +7981,4f1bf09b7218c6ae +7982,8904a1df2d904664 +7983,681024cd2768c3fe +7984,a0020099ad3ae254 +7985,895e56ce10bb84a7 +7986,3fa3f446163eaf84 +7987,13d6467c6e4d46fc +7988,ae53f10a077d76e9 +7989,9f40ac5efdcf9b27 +7990,e6583fecb7deb37b +7991,6b3906fac7808376 +7992,06c856bd425d5947 +7993,185a26df4708ccff +7994,1a3591171f0b8e53 +7995,1f9e6bc0a6507c91 +7996,0bbd2bfce2232ac1 +7997,21ceeb4636328705 +7998,add7b0c3dfd7ada4 +7999,cdd1ff8e02ad004a +8000,d34c5353625f1e88 +8001,b8074051bc0c9f03 +8002,b20d1f8e91279b38 +8003,656a57075fa44836 +8004,17f7d5eba4920d9a +8005,70af02be381a02a5 +8006,c978b4d4d499a3f3 +8007,06038e6f6e4ceed8 +8008,c2c9faca0548b6c5 +8009,95d55289a5270f08 +8010,44b17ed956674282 +8011,614c32e692ea924a +8012,c75ef7e12ee2b01e +8013,ee36f7d70f41e50d +8014,2984bd8905782597 +8015,0f2b4a10927e8a10 +8016,a53e7e4b69219def +8017,1cd2b92034a613fa +8018,92df7bd0134c7ae9 +8019,9c604a440ef57f60 +8020,701019b13d3b1a5e +8021,e8598c3d97ec45ff +8022,e251cbc600d36610 +8023,2390c98095c56f0c +8024,075c8664ef1d1bb4 +8025,4ca8086b03e59fe5 +8026,13f913cf89ce4202 +8027,311c81a8c4d3d011 +8028,2a9aa8672b9e94bb +8029,72c8dbc8f345457f +8030,a97a8f3330853154 +8031,7fe8d5aa62b72bb9 +8032,57267a48eacf8942 +8033,51897937925bdaee +8034,ecbe2e1483e14cf9 +8035,c611d783d21a5308 +8036,241c70043151ac59 +8037,29f00c14daf2de62 +8038,26646632ef53472b +8039,18e72e59108f6f2d +8040,1ae298e1150319b3 +8041,5c1a2b61bd216177 +8042,c3832311077a207c +8043,840a0b4fdcebd8c3 +8044,0883ad1b63db8733 +8045,14d0cb4f7bfd0e76 +8046,af94cd75f38aef4b +8047,201aaab70e6407ed +8048,1b41a2d8409a47c6 +8049,53bfca7be1bb8321 +8050,71443942bdf0b61e +8051,67345d6fa4f78796 +8052,552cb039975da6ad +8053,1d4b93d766ccc869 +8054,b6b6779bcb9d9315 +8055,9b0c0f05ce3c8ec9 +8056,8faf9a7c92f20b3e +8057,f26669418e4eecc8 +8058,c7194a2ba2f197f0 +8059,8ff983b64c95f962 +8060,960c68fc670fc365 +8061,78bee2f92b4fa15d +8062,e02ccc3c94532c12 +8063,d77b083e23f39b72 +8064,2f73d1c1b2f63d4b +8065,d0cb7cf0520ceaa3 +8066,9f110480c3428dd0 +8067,fb1fc59c17063507 +8068,8e2067f4291b268b +8069,2114dd7a16878d73 +8070,5ae3992e5b140d9d +8071,7ca25c421f360f08 +8072,efa42b4fbf4074fe +8073,ed84ba885d032bd8 +8074,0a0fd010e06bc1c9 +8075,31a8b9b17861a34f +8076,400b85a8dc260236 +8077,11c975395e3cee90 +8078,43ae881c07c450ac +8079,0de845110299e2eb +8080,f7311424a38f0ddc +8081,095f8c439fabe2a3 +8082,98eab5f16668a9b4 +8083,8466405c0a4ed93b +8084,08117d3dd01d72b6 +8085,9e5629fbb2b9cbbe +8086,2bde51a9ce9e49a3 +8087,94ff7d3531bd9747 +8088,4207c4c5b121f3e5 +8089,bec346b0248649b6 +8090,6996006833c2981e +8091,f88fd5b2ff61da1f +8092,71f5a0d54c08440e +8093,b356ddf868077d2e +8094,f9059ec23a4e742b +8095,ef9db52c081bccb0 +8096,83d843cd14fbbfe6 +8097,84f353d9b42e7e95 +8098,df0a29c5fc23b05e +8099,bb57e9308b1b3cd1 +8100,d04cf559e266425a +8101,2b0c55588b13aad7 +8102,9fdbd6c392b82a7a +8103,df8b5e8c7f9f1e31 +8104,8edad53a840d80ce +8105,2170d3871db6a359 +8106,8d837eab41fdddb0 +8107,5b1e465eb640d6b7 +8108,919fc75dda8198fe +8109,90d555401121aa0d +8110,0b971977b9894fb1 +8111,99a22f0d69f08303 +8112,60d4127f3d9e41d9 +8113,e593eb003175cebc +8114,ab0cf9b8e23ce712 +8115,b631ad3867ff27ac +8116,ff86fdb418e39f08 +8117,ebfc419333b8926a +8118,c71e27613d2bd0d2 +8119,1a3d68de4da122a7 +8120,a5be4bae4ab0d195 +8121,8875e81c90fd1dcd +8122,775c6b81738bf5a8 +8123,90982f22fb7a6dba +8124,6d9ed38137c20a9a +8125,42de090b404b232d +8126,357cb4ae03f4519e +8127,6ec17eb1e990c04c +8128,2405ad50730c3c07 +8129,bd2e98407e683bee +8130,88d3979c7f678bb0 +8131,b89f8aa7a60ae36b +8132,a6cd32605c258664 +8133,1aa2c9f345846f7b +8134,f01424a13fe48e88 +8135,46dec5d99ec9e438 +8136,40d3764335745fcb +8137,3ecc0ef17af454b1 +8138,7847fdb2cf04d5e9 +8139,1eac314294389205 +8140,0418de512a8b292a +8141,6b206ad2493949ed +8142,2e51b4459c0c67bb +8143,f7e9a42bc59354e3 +8144,e0323474b6931fea +8145,177a6092b22108b6 +8146,90db31cf094f1ddb +8147,3f3b075b99fee453 +8148,90a2cd25eecb4bcf +8149,45855bd61c7ea50b +8150,651b29f96c5a114d +8151,a0e12016dde09724 +8152,ab9808a213a1926c +8153,819b94e80a1e9789 +8154,10b78baf13323c2d +8155,ad4523043083ffeb +8156,55c9491270dbc2bb +8157,33678922e8de4f74 +8158,f6aa796e9a6313a0 +8159,f3a93434743c0bd5 +8160,95c1997d1dc631a3 +8161,e2b1936c429e72f2 +8162,3f9c9962394137a1 +8163,b01773fc79698a64 +8164,88c67939bce5ad25 +8165,1c2c060a462076fa +8166,e6f53d0c7003023c +8167,e1f167cd24449291 +8168,7bcde78591e51439 +8169,e2f46d390814a696 +8170,460da8ac2501ecf2 +8171,6b137c9241e78814 +8172,4e7dabf3c5adeb83 +8173,de4f3abd8edb232c +8174,50d79d1a2fa6f63c +8175,2e59452e5450bbea +8176,174aa9826e69c85b +8177,4c3d06204f33999b +8178,d89619181b0e0176 +8179,555495d9121a55f9 +8180,64995e33c0656e49 +8181,690467b2d3039701 +8182,849dc8c4e1b1ced3 +8183,782c3ecd9d5343e7 +8184,a08ef549d1b93b77 +8185,39773be9f414c518 +8186,dcf680fd21b25f41 +8187,3bab6ec3cc4909a7 +8188,3195d90fbd2ca3eb +8189,e285ce312b84d14a +8190,bd63da22ebdfcd59 +8191,dcae3acf062105bd +8192,6706d8180ada3f13 +8193,b39988ce509bc60e +8194,2c9cb23ffd3d4f60 +8195,95f4252c7fc76ecb +8196,d5696d5d5bb650b4 +8197,6bea20d3792ebdd2 +8198,97298ca05f0a274c +8199,b947d9946d6433c5 +8200,dc28ddd0d247a448 +8201,f1d6dc76e4d8ab7d +8202,bb4e094579028c43 +8203,5e3271351802474c +8204,783e01a12c505a95 +8205,db3a93369a92e40b +8206,b9ae8da868d04c08 +8207,873abb7330efb0eb +8208,c5f0c4e336e081e6 +8209,86c3964b5dbf985f +8210,d9ba2fb3b236ce85 +8211,31362ef032931495 +8212,767c61881bc7ade5 +8213,cbee02be48001692 +8214,84994a1a7d30e9fd +8215,b02c510f646d019a +8216,c9350f324c93a29c +8217,09e3484b4d64ea19 +8218,bcd1698806b3428a +8219,fe2d515c155c5e18 +8220,e5700e8b07ad1633 +8221,7644d9074a66bc69 +8222,fc1c33c3457cdc68 +8223,e9a72b3e02218b97 +8224,ef366b60ef953bc4 +8225,dd38b49d4b716f35 +8226,1d6ab718d5e37ba2 +8227,dc6778e2e122ac1d +8228,cf7c04e4fef96785 +8229,8e94312f9993fb42 +8230,11dde670bcfd39ec +8231,48847a610cba5f26 +8232,7e20c71d0858ef43 +8233,5a71248db07d8bc4 +8234,598754be7723ccff +8235,4bbc971609921ea0 +8236,df6bcd1781ac595f +8237,b0cc7d60087dc826 +8238,f61bf2da26220f04 +8239,f86dab9b5736fa46 +8240,e22f6fab1d76734d +8241,f6f1bbff103686a1 +8242,5e7f8ce877bae9e7 +8243,41081f5eedf726e8 +8244,c95c48c7896c6130 +8245,863abd4225140e7e +8246,051ea17de941373f +8247,af2a1e418741ac95 +8248,50c48c7fadc3c814 +8249,3e1d75f4f1d88172 +8250,fa120fb5ccc19c35 +8251,3dca04e6909b85d2 +8252,bd70845853220935 +8253,11e00b7e5cb6f16d +8254,1305b2993a4868e8 +8255,5baddb5d2013757f +8256,1425bc4b70872706 +8257,abe1bb50dfd5fc1a +8258,b09cefa9572f0909 +8259,ad3217f48efe646e +8260,0c02d76a2c2efffc +8261,5b6b71cb2a6ce9ae +8262,f2a9543b78946f4b +8263,e99dbe0e4396d2f7 +8264,0f7f9ef3535fe7b5 +8265,6068881b4201ea1e +8266,504bf2c3d4f42fbb +8267,39951c4019875555 +8268,e86a43c1d17187e5 +8269,09cbd04349a4a4e7 +8270,36e74750ab2c371e +8271,b19a272d3adb3a4e +8272,d598ec0ba659eb0b +8273,4987675945271528 +8274,797a0e8d21b9a08a +8275,ce089fba4260654c +8276,2db990cf22a0105b +8277,811e0711d439c3d7 +8278,fd5025fe0724d46b +8279,cb7c0d0d00b7d828 +8280,9c5786234316345e +8281,c268a5fa1b525176 +8282,834e8cfa02a4aac7 +8283,f9383c10946e5219 +8284,f216bde60a2908ce +8285,e76a596b9254ef03 +8286,9b99822bcf51a6c7 +8287,384dfeec8001a3f6 +8288,fc1382876d081631 +8289,b32e081ce91c25ee +8290,6c197d620c1ad10e +8291,de949eb49f6e30db +8292,4ca9f0d175556196 +8293,977e0ffcc3ddd825 +8294,4fe5762b1bd4688d +8295,9f802d93fef12b61 +8296,cbbb1fe58421f7e1 +8297,22a651c15a24d13a +8298,1e19796488899640 +8299,9b56a188fba7aa31 +8300,9de5fd5862f6b08d +8301,6ca4fc46c69839a2 +8302,0d28f9c30d300364 +8303,222f9347fb4b799d +8304,dfee4bc6f43cf6e9 +8305,d01efc813b55d27c +8306,054c6e0262fe57ff +8307,0e3fe21b9660b197 +8308,0e7d26c78e6ba128 +8309,e9ef28c7f74e1978 +8310,01add285e9de1c36 +8311,e7c972228d0ffe78 +8312,926394f82cfc3633 +8313,b8f8c749ea3e07cd +8314,3e701b3d5c1044b8 +8315,a51d1a96021a76bb +8316,4b1f9e06b833dabb +8317,403f9bb86ecf8f1a +8318,920cf8c353aed42c +8319,b6e62b8f9ffcc5e4 +8320,3ab191649fb259eb +8321,9f53f914420c3ab2 +8322,5f48753b734f54ea +8323,245989292d2b9317 +8324,208422ce11032ff5 +8325,c999cc40930cd881 +8326,4dc4ee8051acc8cb +8327,ca09ebbb935f36fc +8328,22cd3bd078e000ec +8329,c629176cc93cb487 +8330,b227a2502f1a9361 +8331,c6147bb26070178e +8332,92218770588bf416 +8333,c77e4edd37eb2a34 +8334,614b024662b5434d +8335,fc26f50f18305e6b +8336,b352e6c458d2650d +8337,7d595f567fe2a573 +8338,d6d520cae09032e2 +8339,c4f5c6e5aebad6f5 +8340,75a73b544c60c736 +8341,6569d6f7033c9510 +8342,e4e14ca480459ec7 +8343,55f7dd40deef2dc7 +8344,89579f04e0707cd6 +8345,33517b296efa0060 +8346,ecd3fee1c35674ad +8347,c243e2184d6345bc +8348,5d4dd53ac58b9afe +8349,c740b7e239a7d539 +8350,d0518dfa604e7d58 +8351,b599370058b3a2f0 +8352,0dc53b567d23e210 +8353,49dbbfb5f6637f8e +8354,9c29f71819eae421 +8355,f0481c110dafcdf8 +8356,30ebd83fd6a9d228 +8357,21af6220dc48af98 +8358,af6259fb8b58dda5 +8359,01a1810a8536d8cc +8360,42df8ac14a69da7a +8361,03f8e9751ab41715 +8362,56d211fb6e8b7d3d +8363,26a53cfa757deb2f +8364,60f1f7ea163acd9a +8365,48b916abfb6d2fdf +8366,1a6f23e6431e0174 +8367,562a2d5ce6b91adc +8368,5a2256fc7f8676ca +8369,41ea9a44c6afedf9 +8370,40e4d50d5a0f2fd0 +8371,2e9a9b4e7e867378 +8372,651639aa6a6fe1c1 +8373,794ece5fc7597322 +8374,7cd3f2885f9536e8 +8375,605c214045ceaa78 +8376,16fd11e9320d0211 +8377,eb5ca509d1239d81 +8378,c232cc8b71571c23 +8379,7cc0246cf40ccc0d +8380,62203cfa5192b73a +8381,feccddc5d8ba09cd +8382,1e54c4f1c6312961 +8383,0ba63a64604e98b8 +8384,3b6889af41657d50 +8385,b94f44a1a551b009 +8386,5e15e5cfa5f5d941 +8387,d889cd65ac2f07d8 +8388,db83ef77c1158eae +8389,76109c1771ffdffe +8390,6d94b0ffb0bf42b3 +8391,48db450e001f2b2a +8392,2a5816180685ecd6 +8393,1d50e0d5d9a6f215 +8394,e7ab965a2a6ee150 +8395,5fe4038b32552371 +8396,86f216d9c296f02b +8397,d8703e8c0820b88e +8398,4fd8b448152fbe53 +8399,6ac67730e084e5f9 +8400,04204e3be740eabc +8401,e5e89ab1927645ed +8402,3ac012a5b5d21d37 +8403,a3916992854e9293 +8404,5bcf659edba33971 +8405,101bf6b061199903 +8406,847d15c643ad0489 +8407,216e6c8d964413e3 +8408,b80c895caf710a7a +8409,58589858c72d756d +8410,5613b55f0abf5e68 +8411,f5d1a6a2dc909f3c +8412,62d5230d81da9b7b +8413,596ab84b99edf83e +8414,bd26617996567e23 +8415,454ac163d79b6465 +8416,211a192db14cb233 +8417,d86630339b838f7a +8418,3c2d383375d929ee +8419,fbfd93e50b645c8c +8420,fe188b0c308db379 +8421,685c7c6703d2db0c +8422,32389c31d01344f7 +8423,b9530ca99761df8e +8424,e58c891cba2fdf4e +8425,f40bdf2f7df0091f +8426,0ff0d2acbe2714e7 +8427,74c64801466dcd8e +8428,b6ef9f3e96852bf9 +8429,9c9f569dcae670fc +8430,fffcd0edda8eee5c +8431,72dbb70cc5a17442 +8432,3f34c06f63063106 +8433,03d2205c39fc320e +8434,505f52b985f9f4c7 +8435,a3432a471f41eb6c +8436,f55b178582c95aaa +8437,0325b32419757aa2 +8438,8e47198e58a454f2 +8439,0cb7ff693354ee0f +8440,8864374ae0180260 +8441,4e9b3ef89be6ee03 +8442,b58d8cc6ca650341 +8443,0e5414701e026bba +8444,9910ccac4cbf4006 +8445,9f20707022ec53c9 +8446,bb18f76ff3ba72a9 +8447,4a62f3b7db8479ed +8448,beff7655cf35b306 +8449,06085d25008ee556 +8450,6d415f5a469fff8a +8451,2298255a111f9ab0 +8452,19f2bbf2d46cd1ef +8453,114f6c0f3ef9ede7 +8454,44d6ce1f49b495aa +8455,bc53f3550372811f +8456,6144248fd3ac25e1 +8457,8c17d307d275fa82 +8458,3b35dfbf80572794 +8459,f7845434e37c1f1a +8460,2be1d72dfe8e8aaa +8461,65ddc64d17b7df50 +8462,59fac499a8299850 +8463,aecae333bfaaa782 +8464,07945eb5a6c0d1f0 +8465,0f82de9796fdc9d4 +8466,435a1b9812a95362 +8467,08ed77bf749aa2b4 +8468,6cedd923441dbdb8 +8469,ad446c438eab56f2 +8470,e445c69ef6df7ed4 +8471,1b8a680da80c32e6 +8472,dca81b39e7b0fabe +8473,896fa7f2d2f77bb9 +8474,ddb45a37ae9e6f1a +8475,7d9fc749ce47ab50 +8476,481a97b754c6dc9e +8477,43aa5eca735c48d8 +8478,9cda701f0dc65890 +8479,e87ebccfde350fd9 +8480,851312bc2101eb03 +8481,9c9321de89f91d68 +8482,50ecd40144027b3f +8483,881500264744e3ba +8484,1dd4bffbadbd502d +8485,ce85ac39dc1e3e38 +8486,fdc23212377b353c +8487,f46f5abccdd0c64f +8488,2ab7da5f37a6283e +8489,e6a51cb3980be36d +8490,fea17660959ee732 +8491,76318583ea944ab2 +8492,b6e769faa3520c14 +8493,1b2aaa74142033a5 +8494,3966d08e2060fdfe +8495,dc58c4d7b39ffd22 +8496,5223a97636e2c8c3 +8497,4b3c9b9c67b244e7 +8498,3e81e0f863f84ba9 +8499,63b1e6a15d121104 +8500,a7d13073ab69fd34 +8501,e33d12da4401eadc +8502,be5cdc3d75d3b143 +8503,d3edb4a4595f80fc +8504,cefa0a374a723ab9 +8505,18feec171fefa3ec +8506,674249e339f4661b +8507,7bc8737fb34db145 +8508,aab8721bf10ed818 +8509,51bee26640c6768a +8510,96fe8640f5015d60 +8511,81ff4e531442f1e3 +8512,e60264e87c2fa6cc +8513,8e10440590eac915 +8514,95bd2146ff27d216 +8515,e331e38b0db1e765 +8516,04718af20043d972 +8517,3530c71fe10f92e4 +8518,1f8155a1e802d511 +8519,2b7f6a310310933d +8520,8746b799f84c5631 +8521,fb446da7e9cf0a4a +8522,3b8b2a7e0ac2691e +8523,204fd6e880308b12 +8524,ea44533ce40e9e97 +8525,7b1916c9b32711e4 +8526,c36e526fc6b692d1 +8527,88b9520146ca2253 +8528,8c7d4f7f40f1ba72 +8529,06a125619251dc38 +8530,bd133ca222363d22 +8531,68bcced5d52e8d64 +8532,487b58c4f3174743 +8533,4438f06716cde824 +8534,8d92cbab6005fc23 +8535,66bd98636d26253f +8536,484c809def45605a +8537,d793313c2c54a2af +8538,252cddd8ecd868a8 +8539,4f06172099581968 +8540,83df5b10e26683be +8541,952105335de826e9 +8542,631343be8d772fc7 +8543,b9e653b9cf3abd9f +8544,77e61a7711646e02 +8545,1e510111091ee855 +8546,865b7acac72319ac +8547,c521e332cb9ea8db +8548,3c27fab126b3b8e9 +8549,44995dcd8095dd87 +8550,6dd4cbea814bd48d +8551,f063ef496bcea925 +8552,2f3e3516f90e13c3 +8553,fc5b69a94792557e +8554,6b287ed998d3a584 +8555,635a426c200c2532 +8556,4915b3bfe85fda0b +8557,60f63c9eeb69f6c6 +8558,671ab37a3b0e6d3b +8559,9e3c031676c1089e +8560,c026deb2a66d786f +8561,d1bfd59a2715fdb7 +8562,7607d2641cbe20e0 +8563,d73ab774214ef634 +8564,e6a3a23675fcc779 +8565,1cc00548862504b4 +8566,c354e8014273547b +8567,e682e9d57e1036b5 +8568,1b958ce7d5ed5eaf +8569,d4b7a876072a6e81 +8570,e7fab5140a387390 +8571,2b0cea12406e862c +8572,1119b338ed39de63 +8573,91a6b33bd7a18413 +8574,9fb8a341270c89b3 +8575,bd22e535c6fd86cd +8576,be8383fea07a557f +8577,4bf5f3d17dd99d1e +8578,b7d4f75d3401c67c +8579,15e1221392168edc +8580,eb9f80ff9c061661 +8581,c91043d1c15251e8 +8582,b60693fbb194f333 +8583,3c1ebbd46d0ccca5 +8584,f3595882cf8e9551 +8585,38326c16a731e311 +8586,16109fe7b22678af +8587,100c8ea290bd3591 +8588,dfdf586c213d277d +8589,23f053f36072fb5c +8590,a4a2ec3aa5a3bd70 +8591,66b4b93f77c8ee2d +8592,a21303de4b0b32f9 +8593,a781877504122a33 +8594,3d5902287e81f70e +8595,6f0e2210542d3524 +8596,c3821fa659c2db16 +8597,497cc60f4c704afd +8598,11ea0e6e201ca96a +8599,94a264741381be7f +8600,b69f903db401def7 +8601,48bc719ed8a4ac2d +8602,57132446a708fe7c +8603,4c1f90ca4305eb9f +8604,665b248736cd1a96 +8605,1cd05b186523b057 +8606,d8abf62fd2566d13 +8607,4687250c050eec25 +8608,04a8ffa6972bf431 +8609,a006cb9c01650f18 +8610,95e6ddbb68e203ff +8611,97533daf8463787b +8612,a7439aed391c5ae9 +8613,60bd3310d506de82 +8614,790c3f643259abe5 +8615,9e935ec0196d78ea +8616,22413e2837481a75 +8617,8d1b0d4857b3a799 +8618,d4835a05f4514d16 +8619,12acd8e6bc6e5319 +8620,d1a19f37e1b4a231 +8621,11f127000a5c34fe +8622,bbb137b2807f5a1e +8623,7dd0f9e1012f3ac8 +8624,dc70fc571c91a437 +8625,a74b54310db87b33 +8626,fbf9d5bb55c812d3 +8627,a6d9b6f45cb2828b +8628,093981a2297effa2 +8629,f4bdbc1188921f6b +8630,09a66954207f8b6d +8631,5a8133b22ee2f320 +8632,feced0121b247301 +8633,56279f0f582f5a97 +8634,0d13d360405718d8 +8635,8c703e0f34da3c7a +8636,1e2697e6b04cf0c0 +8637,7303c623a2c8d35e +8638,35377bd301f0dbfc +8639,110343b4b1f5c84b +8640,501d73d3aad746e8 +8641,6970623936ffef23 +8642,bd3c137a8b96ceda +8643,b46caa3c680681f7 +8644,37dca9d2cfcebe76 +8645,e2ea9eb1445286b3 +8646,d40fa7e07926818a +8647,198288a84683080d +8648,0e6fee22ad29bf45 +8649,dfb6ee112310ac66 +8650,53e85034eeff42df +8651,10d2ce8a7f6389bc +8652,b0f930c549c8f9fb +8653,d95c9d24521841e4 +8654,97aa2320cabd1b1d +8655,1984950d99a656ae +8656,67341887e8cc7ce4 +8657,519a8c1b9925a368 +8658,a53d51dae9bf177b +8659,9d4bf47b3aab7bd0 +8660,058af4c6e32e0a3b +8661,19f6cea31dfdbdd1 +8662,3191cbd55c713e16 +8663,688db09d9f124272 +8664,f016d075398c56af +8665,165e3ae53a91bc24 +8666,f50aafe628dc7d74 +8667,a0dd03687e7a7072 +8668,2d04c402f4c0ef1f +8669,8e011c31ea13a477 +8670,c07acb86b80c46e9 +8671,71b1406bdbbb9bde +8672,2e49fd20d3186abd +8673,b04d65786be54ceb +8674,d2b0f9181dba9ac7 +8675,4d81c9a15e020b04 +8676,73e0102930b45e4e +8677,6f134a233c8ecb48 +8678,caab505d87eea5ae +8679,3fa29660a35c6f54 +8680,33ecc05791709cc4 +8681,8ca86fd4860dde26 +8682,4ffe8ba7569bb4bf +8683,d6f32439878addd0 +8684,c6e80916eb0bca40 +8685,23c1b1e98933874c +8686,940b2606a4ff74d0 +8687,763b6cc70b199712 +8688,294f2e0b5e2e5589 +8689,591ffeb25613f61d +8690,b6bcb27b388daafa +8691,077e3df6fa1983c5 +8692,be6a6157fda0e8c9 +8693,2072d414ab865c7b +8694,b2b5c5bc1e8a5384 +8695,e71dd6c4e96be6c1 +8696,26e7a8e924316795 +8697,057d2206daa133fa +8698,8fdf368bedbe3411 +8699,89bfc9213f8edf8a +8700,9051d0dce499b856 +8701,9a021f23c8e41d5b +8702,82a0762656cc9e20 +8703,9d9aa5d04c0356c1 +8704,cebb3b15c87ef003 +8705,c8868a7a4087aae1 +8706,e297dce7898da364 +8707,ba2931f88beaca81 +8708,c4b62e11cfcadd3b +8709,97cab754a9c594db +8710,0f5c867c5b620264 +8711,2f42121a8f8f1919 +8712,43c408c2645144e0 +8713,a0ee0db59f64e396 +8714,9b28e57fffc1d647 +8715,ba85a8d0a6515f86 +8716,2780d934db63f41d +8717,ccd4e586deb8885f +8718,77924a682c710bf8 +8719,16bd72433f28f4d2 +8720,6c64dc2e749a65c0 +8721,578c3e83571afac7 +8722,ae927c94c01a59fa +8723,8d02ea6f474c2036 +8724,2aa862952347cb25 +8725,144f8e9eaf603918 +8726,b59928aeb64a834a +8727,0c1196a8a1ca7b4c +8728,c046e7b8dd23ffc4 +8729,8038e73311c613c2 +8730,c6787e571c166a53 +8731,a66b39e52e2e9e8d +8732,be18bdd38d199a5e +8733,e7fac3c6959bf7d0 +8734,4d92c65f0403716d +8735,4af9da8bab4053df +8736,ff8787203937b474 +8737,d33b529d80224174 +8738,6397a7d30df0083b +8739,028333c009cb9190 +8740,0b2594a1ed8999fe +8741,d9354fd9d0d64257 +8742,0e3257812d27a95f +8743,8b8c89f4ac5f4664 +8744,5a476926a0c9a6a4 +8745,81b2a68198df288c +8746,75c3055d30e6fa3f +8747,13634571b227df8d +8748,0c882877bcbc31da +8749,0497c2b6605ab8e3 +8750,feec1a7e84dd2c3c +8751,24ba0ac536fbc909 +8752,1b60f54cd7f8421a +8753,39efb376447bb259 +8754,2ad92dcad8672927 +8755,a27cbdd0409250a9 +8756,16db8df6ee214b48 +8757,fbd14bba286dd196 +8758,1515f6126c4f978b +8759,6060db6d67bd614a +8760,6810f10b7269fed2 +8761,376e8dd5a7152684 +8762,a5458a55d07e54af +8763,974b8ff7cceb496b +8764,90b303aa80c1566f +8765,e52900d7c01a7652 +8766,25dfe3b3a5d18fed +8767,c4ad31bda6562433 +8768,ba9287a989e9c844 +8769,a3774e473b12b49a +8770,b446a581d4e78e20 +8771,f80bc4488c906e18 +8772,7c0eefdba489660c +8773,c4b9a6f68cbd5efa +8774,e60caf951fcabf62 +8775,a292a15e66106e70 +8776,e622ce46087627f6 +8777,69b9a47fc82b7ed6 +8778,ffca4541bc9ee000 +8779,49424c7aa2ab7b2d +8780,353c7b7dfb600766 +8781,ec92bdccfffa54f7 +8782,90aa8bcfe0b659f2 +8783,59f6652773c9b1e6 +8784,d522b008fd69707a +8785,b45ba5e35820f2be +8786,91e4a4510b168b9e +8787,dc89a67973b19503 +8788,14588f91a3ad6bf2 +8789,4dffd19c15c281a8 +8790,840f9056d286a88f +8791,df0282ceea6b3a19 +8792,e2b7194599de4b73 +8793,5b1b4fc35e02dac4 +8794,1af80a6275ce7a10 +8795,eb7454f86582b11b +8796,67f8d1286650879f +8797,ba130a2dd659c091 +8798,29a8bf5c7faa60e8 +8799,bb244999afc5bc4d +8800,1a9a99d96fc6d4de +8801,b65588425e5e9b40 +8802,90be7df734912a8a +8803,89112742943176da +8804,759396728718d410 +8805,641cdb806ec2c5eb +8806,8032de939cd4d8d7 +8807,1366a1a2b5a8454d +8808,19f831a3c62662de +8809,5fdbd4e8dd368afd +8810,5531b0ace3521297 +8811,0adc5834ee396706 +8812,1b0ef3c8caa21f6c +8813,2f8d595bb5df4146 +8814,39001b88e7da808f +8815,207be5174aa1fe36 +8816,175458924a88983e +8817,62517d777dda9d4f +8818,4e5cfcbd78345b40 +8819,9f53f46364f83717 +8820,4bd4a5e4864a3a6b +8821,74bffa6f54e3a9c8 +8822,4153c0337976b574 +8823,3692c3039bd1464e +8824,eeef0e6063a5261f +8825,2653a7770e0793aa +8826,3c2d94a52e82e715 +8827,e249ae89e3288e52 +8828,6c68eb067b1d775d +8829,1f56e55331269dc7 +8830,585829944e2e301e +8831,1d0bbca7917153cd +8832,e4dd557efa30217f +8833,00387235bea63293 +8834,71fcef4094ab9715 +8835,8d5380f2880d901f +8836,0f458515ca2c56e3 +8837,075239544aa38c5b +8838,acb451a905d25260 +8839,3726359d7aa2f7c8 +8840,952b87cd42ae214c +8841,c95ab8ffe49f1d75 +8842,96f043ea22e67fc4 +8843,fc3287f316eed45a +8844,328dc4caa89274b1 +8845,e5684e12a9509b83 +8846,f73c2ba423d566a5 +8847,000199a035184bed +8848,84dc6c638c735ed7 +8849,e08071307d3c06b3 +8850,895677cef966a3f8 +8851,684b53e142aac343 +8852,9b5bf8e1485176c7 +8853,bdc8c7338a6b47bc +8854,51f0448263191f4f +8855,28fc158bbad4360e +8856,66900be01cf6b530 +8857,9afc5bbe1539b595 +8858,c026633c46ad1691 +8859,81405325b67b8239 +8860,06cff080d53ec993 +8861,73f80f3574ea9a59 +8862,7254f625fa40116b +8863,c402c887c7f9e252 +8864,4b69ebe7ffcda887 +8865,78a850e243568e49 +8866,115219a20a00d46f +8867,30653a63eb61b7b6 +8868,8b202efb698847e4 +8869,45e5f61af9f9d57c +8870,25da070fe2419cfb +8871,713b6f8c913ab055 +8872,53973d6601eadf51 +8873,2a0f5d9d3f4803eb +8874,ec6799e21cfecbf1 +8875,98caf02a0ccffd8e +8876,98eeb84f8487bf92 +8877,d901d13c88a9a6fa +8878,047f2a053ec5a957 +8879,fae4b8fd600ad517 +8880,fc9e8e659c857430 +8881,e0ae4cb00adb3e1b +8882,47499beba59562cb +8883,24171ec51e1522ba +8884,64191c31cb9da243 +8885,f3d75dc6df45dcbd +8886,93349034688afa5e +8887,82d796a236fcc4bc +8888,d340d97894726165 +8889,41fbd9cb3c7401dd +8890,946da027f20006c4 +8891,019c3e6a481a75de +8892,f1c94ae1b1a94343 +8893,b626764243ed0899 +8894,2aa9e0059940fcb0 +8895,dc291402d6ffb6f2 +8896,a513425edf29543b +8897,b2c2aa41f41800f3 +8898,e8c1a6ea28251c3e +8899,71b3e30caac1a1c3 +8900,7354f2004b48f472 +8901,b10d49fd47b0cf35 +8902,49da82e27c7522cd +8903,b5950dd1ec889064 +8904,1facf374a034b870 +8905,3744df9602a81757 +8906,bcd0474c6db2a9e4 +8907,4515019e94efaf5e +8908,332554b15161fa96 +8909,48fddbc703f68cae +8910,c424ab27fc6dd73f +8911,5c9b34d8d4678425 +8912,799e54185dc7b823 +8913,af3376828975c94f +8914,318b051e9e4ebeb3 +8915,f945df3442353d87 +8916,6a0432e1aab35b59 +8917,0460c5de60215e5b +8918,e366f5763c5819d0 +8919,e0b5cf442d2273c1 +8920,cd344919804a7042 +8921,6163e88866b91e4d +8922,ec061161b457e0bd +8923,d884757cc522f201 +8924,d847befa36bb67f2 +8925,0fcf77b731ba68c2 +8926,6202dd7acf5c98d7 +8927,a71cb447fce1bd18 +8928,b81597e9f1c57985 +8929,0d97be7b1e0e6241 +8930,bd735967db0e69b4 +8931,0c7c2ba1aa14bbf5 +8932,7d78654d3745cfa9 +8933,d9d0c0384232465a +8934,d36fa7cb11f998bd +8935,950bc6a3e88ff73e +8936,ea9950415ed8dd1b +8937,b53997bf2755ce3a +8938,a7a63f47b7839a02 +8939,84aef74318ae02b8 +8940,37796eb83f84521b +8941,fcb9d4176007b88e +8942,c5f77e7f7d701f2a +8943,80282d7898c3eff2 +8944,bde1c3bfb4fdb65d +8945,bbb1f6292cb6e2b8 +8946,bf884e5d6710c881 +8947,72ac029b6c8297a6 +8948,29b0b81a58af3cf8 +8949,171dab91bf4107c0 +8950,c05ab9c8526ab2e4 +8951,b522abb67d0bd1d9 +8952,61f3f7bbb6ba768e +8953,06dfbd9c827d214f +8954,337f19e859ecf576 +8955,036a1c88319ba29d +8956,35e509b5ba70ac90 +8957,ecd43960fb1b65ee +8958,04cb0a747b7f1ef4 +8959,781bde69f9de84d6 +8960,55666dad90a74085 +8961,c00437451e27da4b +8962,2cde26a5c397f32e +8963,401cf33837597660 +8964,5f10025c9090dd21 +8965,df037ddaaac49fe9 +8966,a2858ce2f176d108 +8967,9afed6f1b2da855c +8968,6001034a416a3f99 +8969,2b5bc6263a2d8c55 +8970,b6dbfbdec1835b7c +8971,0bb91c2eaf41605e +8972,91165666475536bd +8973,ef5b84e40ea8340f +8974,bf90c71e6fcd9690 +8975,5ae7d6b5bc35604d +8976,59546917e9f500b5 +8977,022d1b6a776697cd +8978,fbe52fbe7d1745ee +8979,9f3c6e37bf0e1c29 +8980,2f8806f1415467fd +8981,16e3f8620c4e2099 +8982,b9791add5aa43ce3 +8983,4eed8436c49aa96e +8984,40f2e97243926342 +8985,baf46fa2b0719321 +8986,7e9d87ea8c4994d8 +8987,cf690294da591a65 +8988,8a135b49b6c3a2d4 +8989,95d1d318c18d3237 +8990,b0477d890f358ea2 +8991,5c6b71629ab15040 +8992,effa72d4ee225243 +8993,f7345af480590f1f +8994,de84637c8847ae85 +8995,bef3872b55c22fe4 +8996,7c76f32286bd5077 +8997,3264cf8630780988 +8998,e4e5103f1525149d +8999,5fa98d0b20f13b66 +9000,396a66704ce89fb8 +9001,b491851ca82daabe +9002,db97bfa1666a97b0 +9003,6a6d5ad73eb6017a +9004,350c35859ea6e079 +9005,36c1c080866a0207 +9006,4423d7f2f9d7588a +9007,5d8eb3e6729293a6 +9008,3b93dc2d5af483f9 +9009,f6c3d013da0c3b65 +9010,c8011e90fc7a8e48 +9011,2713f92197f07cf7 +9012,64005278075acca5 +9013,8d6070e335d18884 +9014,e463ebfecad39c77 +9015,713bbe664f86ebd5 +9016,267d1a76e8aa7d67 +9017,fef30ed51ee76626 +9018,13bb9c6f1f0d46a3 +9019,2187775d4f54f659 +9020,a4a64b01b80505d6 +9021,d255ca8254ef4c60 +9022,e775f1b1f814665f +9023,2229384c6d850fd8 +9024,60044e320ce9cfa7 +9025,8a6abb7aac1c2386 +9026,ec5470909cd38527 +9027,f5ea5125a6caed4d +9028,3b9a9f999e900249 +9029,5571e063a43551d3 +9030,ebba26c12063ac43 +9031,9e0f6a5124459889 +9032,1c4425486f93af4a +9033,69aafb360087cb85 +9034,e1002f757672df6a +9035,4aad82d5bfd61b71 +9036,f008233a57dd8923 +9037,ae5ce3c102dc1861 +9038,7e9ce70c774cbab9 +9039,1c302aaf1622d1cf +9040,f47e9dfc2fd4f786 +9041,79d722b523e962c0 +9042,26b5b7f5670795e9 +9043,87bf1c2e3ce67c6e +9044,f6283ac89f9fa864 +9045,a454724e6688be5f +9046,e75725d8360cc8cf +9047,6b20dacccad6768a +9048,02a8c8325b79a934 +9049,bd5890cf31728fe5 +9050,8af0e78a1796a41a +9051,3327fc1a3c29fb74 +9052,ee444712a9fffb91 +9053,e74efbe928242ffe +9054,dea4adecd4d298e1 +9055,c0c7571564bff457 +9056,fa7c631542ab1d23 +9057,f0d7b4dac5b5423a +9058,689dcb6a5ab87f3c +9059,abbbf64f5161f745 +9060,4980fc518efcde99 +9061,90173375a3e22465 +9062,6fc6b83e5d9f9f5d +9063,897fbf81d41f1c4d +9064,fcc73396969c003d +9065,53e2b5cec6733a49 +9066,5d1567adb5535224 +9067,0292f06125d05b71 +9068,7e81b640c0b381ae +9069,c8e925b2a24177e6 +9070,a665ffa7410e55a2 +9071,57f1e65bfd90b7c6 +9072,5104934402b43bb0 +9073,69f059914499b9be +9074,8bce49f5c0963e5f +9075,41af36e3a5f02861 +9076,f589392c79719c48 +9077,834728d58057005f +9078,e5dd8b2d29ae4e93 +9079,d111907c81b7daab +9080,553ce693f2e6827b +9081,08243919e750744d +9082,2e6e02e70b87a708 +9083,295e736e72633329 +9084,066cfd3a5e91418c +9085,9f573c25a8599a64 +9086,a6b4b6f437adaf20 +9087,25740baf1ddd957d +9088,b97e986524393f01 +9089,d192eee331dc5a10 +9090,6945bf0fcd138eab +9091,0cb090b6471d123a +9092,70db500706780d4f +9093,76c3a5bf331d913c +9094,9ad3a4f7aa0b14d9 +9095,98419e1b0d2f3225 +9096,bac600b8abd29534 +9097,96518ef526c0e369 +9098,8190134f989503d3 +9099,4f00014aa5bb1967 +9100,a26ac0f6de6893a4 +9101,e015ce6048b12ff2 +9102,e9cbf3ef357282c9 +9103,b3ef2c42d37161b7 +9104,b881bebc09249306 +9105,4291a6227e7b9218 +9106,3b82b4ab909f0968 +9107,23700c2b0de49b92 +9108,cc201b50c7df56ad +9109,0c08d443b4ffe9e9 +9110,23ec8e7e22ea6eb2 +9111,07d26421abf74d69 +9112,dc92d882ea2c1f5d +9113,cca7328c58d2aa24 +9114,cb09665b2c3bdf04 +9115,a9922079b56b9501 +9116,be5f5c451b80664d +9117,d5fbb94e28965202 +9118,a955f1edbdcfda7c +9119,c4eb621caa72618c +9120,f5eff8a7283c8c9b +9121,103d08d9527be489 +9122,78a1e0135a11d19c +9123,a8f9c2a43d84300b +9124,68e60d0acc2e5327 +9125,05aeb20f7715abfd +9126,c084dcd46bc67ad9 +9127,e46f79b3b49454a3 +9128,db8eb32e472cb79e +9129,06f0d65c545e1f13 +9130,35238280a7156ae9 +9131,2a875f85f1ae5a03 +9132,a8de669795ef3fcd +9133,2c31d078741fc4a2 +9134,ceb7a2a7e1249469 +9135,98b77ae6b853828e +9136,377778ac8b2da202 +9137,887a044ee88f9479 +9138,6e927e90d039a435 +9139,826a7f6589d25135 +9140,c82e552c69a1c900 +9141,462daa7bc7353bde +9142,32c628911778ec60 +9143,670c5691164f0134 +9144,a58c3578242942e7 +9145,b5031194bd89c13d +9146,c2a1247bfe35bc7d +9147,f1f61a7f26ba0fbc +9148,1b7d7659ad53f445 +9149,c29b6526fdedac7b +9150,80fc579304e3514d +9151,428a986291794318 +9152,cc506188cddda1e5 +9153,44a09b73ca87ff6e +9154,350e88a4fbdba72d +9155,263bd0a5c0671405 +9156,d0ee9e88caf642f2 +9157,96a1ff7a88d36c9a +9158,5311e3872b88fed6 +9159,25813cccbf97bc23 +9160,121e350028ea3122 +9161,54152232922897a3 +9162,797970dab939e5ff +9163,6b41e8eac0dfa2a3 +9164,96f9e4fa560dfcab +9165,af79fb0d3610b952 +9166,9b3e78a8cbf3a591 +9167,a506263a7deb4565 +9168,6aaa815ef6f19076 +9169,52fa31285b15649b +9170,1c3c910b3232fa02 +9171,59eed1fcb81f645b +9172,65a262e87a915240 +9173,854fa42c2621b09c +9174,b3a3639fb2e10778 +9175,85eb514fcaab9141 +9176,643e7c0cd3be865f +9177,dde0d87c4b6954ff +9178,8358e602ae77baac +9179,70c2de7770f34745 +9180,97195f2a7f611e1a +9181,2df60872be511bd3 +9182,7755a4c530276767 +9183,23351f12aa183eb3 +9184,930d7e1f0631151a +9185,2cfa267da90dffc7 +9186,bd9ef332409be99b +9187,f78c26217a5fd423 +9188,032555f9c83379da +9189,b7cf9b9c26344103 +9190,d45fb8be136e0fb3 +9191,5b10c060c6640848 +9192,42ffae83e5d85019 +9193,5799d329054988d7 +9194,2f0563d324050985 +9195,10a24710d1861789 +9196,4311c4c95fe14e1f +9197,79fa47bbeefa6f7c +9198,5e073ac7859ed19a +9199,60139162854e6c2b +9200,3d5fd19382947b35 +9201,5c9cfabc61b99b33 +9202,361cde8db10d01a3 +9203,bc9252c4b1a38cbb +9204,4365bdf94098a355 +9205,0fcb72892ad8c99a +9206,4848e2a762ffb50d +9207,75a061a213e153a7 +9208,656c92574d0a6c58 +9209,075a29a288067e84 +9210,a337c8c388c2b365 +9211,e2ad57b02b6535a8 +9212,5bcdfc01051f640b +9213,8b3a2dcb9396966b +9214,d3fc7888c1eaefde +9215,263eb2da3e2392b8 +9216,b659f408c065a742 +9217,9c568a9069fe4189 +9218,c0909b6ee6e4cc3e +9219,ce2c938c048a8933 +9220,70440148698cdc35 +9221,29867f4374257636 +9222,47e771d671558ca3 +9223,d3beadef6ae29439 +9224,8755b62d82064afd +9225,d8daa8fc9b463bc3 +9226,2de06908c25f7e22 +9227,284ae58b2f56ec07 +9228,c695590dcc8fd701 +9229,9ac331e854d2c225 +9230,739f67782e116927 +9231,816e8d2eb56264d5 +9232,423205686fc9bbc3 +9233,d250fd0feb300fb2 +9234,12870cd5fab31066 +9235,a99dfb9c5b4981a0 +9236,8c05d2f239bc8c64 +9237,ec3b78eb8c2ba723 +9238,bfd7af62191c6ada +9239,4a44f448dcccd110 +9240,c2fc25096b0c02d5 +9241,bd78db7e95bb3d58 +9242,7a5bb029ff8801b8 +9243,560de72b9e475078 +9244,4cbd120058ea780f +9245,38112cf53a777e82 +9246,01d520732b4ec091 +9247,ec5069dbd0c88766 +9248,5d86c412f0648c8b +9249,9f5df715bc0a84ec +9250,7c3ba0441f8adf5f +9251,64d31f3ea89ece4a +9252,50a909d4fc00005b +9253,78eab1ba663a6e22 +9254,433a39c4acb9d0aa +9255,9574615b2bd0bc5a +9256,ef86b85f9288d3b9 +9257,43ffedd613b7faeb +9258,feeed6bc2bc63e19 +9259,49b8f00c2e749fa6 +9260,dcac210fdb17931c +9261,88fa2e9c0018f0a3 +9262,de7e459ca02beb2d +9263,7801c3a89c2a3396 +9264,0cc45b771d0dec32 +9265,02fa935a2d534741 +9266,1b5730713b3cf40b +9267,9cb34970e2d1b467 +9268,016ff426dc8882c6 +9269,dab3e87aa5bb2e57 +9270,cd0b536dc2503fee +9271,554881f5f43857d1 +9272,dc02e77a44277e2c +9273,5389f014f4bdd8ed +9274,f321959094cc3817 +9275,67fcd6aedf0a72af +9276,794d6f96ff583012 +9277,5f4e042ed622e272 +9278,e57fc5d36c4dbd25 +9279,63109b1027672662 +9280,c148f66b561aa41b +9281,5ccb95225ad9ea7f +9282,132bae3e3b6c4a48 +9283,2bd9240f14a0c7eb +9284,0bd8b3f6fb248fdd +9285,17b4f00bb7f54146 +9286,57ba4edf8b87caf7 +9287,ff5e674ee4f1e3d4 +9288,e6791536c36878d5 +9289,496c51131d82d77b +9290,0276cb129397f191 +9291,b6c0d5b9df0b064c +9292,00592f74df8a4bd6 +9293,4aaf596a18cbd3de +9294,0a294716f7d31a1c +9295,416ce21b5ae7761d +9296,8fa7dc7215543077 +9297,57bb3cbf6f798c18 +9298,ad895646c9ab845c +9299,3d95270c2875a8f0 +9300,d20a0ddef33bae5d +9301,4659aae5ff56ed02 +9302,fc9d3e6cdba180cc +9303,5b33bf446b974cdc +9304,690a4df67ea90823 +9305,ecf8056cfa0c7420 +9306,5bfb9c06e7045188 +9307,9376e62ea41dd8f8 +9308,ad11d1a7238cffb5 +9309,a2f9f413f0eaca7d +9310,37dac8e9f7cf492f +9311,f893d167bd058fbe +9312,fe86d16062bf131d +9313,c41a12eeeb8d3228 +9314,69cd7c3aec932ee4 +9315,53b2adac4ce6893f +9316,0dc87ac1c64c08ef +9317,badb62ffb500c5dd +9318,b64ffe1c864f6826 +9319,89b6e6e505bd3260 +9320,ff257a6aba1ece16 +9321,bb094f5a8906a070 +9322,96c5275fcb33522f +9323,c4909feb1ac874ce +9324,6637103799e995b6 +9325,e985585e82ae0eb7 +9326,5895ef20de143133 +9327,d13ee2403338dd4d +9328,16b95fd0f46d06d3 +9329,8bf5b9383d4d428f +9330,75a87168e14d1821 +9331,5414db781e8fbaf3 +9332,320545011bc49f55 +9333,b8e75fed148d8849 +9334,fae7ec47b36ef1b0 +9335,7ed72110558d94fb +9336,2d64f5b0eeb531a6 +9337,6d4a50d2204e06b6 +9338,77f1b4c065f5b36a +9339,238a80feb622ac60 +9340,ae0420c14704f942 +9341,d0cec432c4bd424b +9342,3ebfee1b3e8ccc73 +9343,b7f267e21c4ca738 +9344,c179767f4b8a01d4 +9345,61c9da5dee0ff120 +9346,623e99ef3374c9b4 +9347,00de01627c8ca9c6 +9348,e670d28de71c8a45 +9349,857e4d29edc8ff59 +9350,f4fe621eff3851c4 +9351,b20775ef7e904362 +9352,219e4cd730fb4110 +9353,240f4d55c76ab7fb +9354,42557f6cb7d3a1b7 +9355,d486b1c2be75434e +9356,4c86d49d717bfe3d +9357,5fe59366cc72b96a +9358,a7fbd478fa782ef3 +9359,ba5ccd19c2a6cda1 +9360,f18ae6dccd194320 +9361,58380e6728a65749 +9362,50deaad7dced3174 +9363,4280e89b11a63440 +9364,448008e8448e074c +9365,e5f8b9635c2a14ff +9366,1fb2f9728470d05e +9367,1b5ff58d7555a57d +9368,857faf714cdf224a +9369,b11883a78ae7e57d +9370,39674d47d7a8e42c +9371,8c1728456290829d +9372,b7044d6a24f0e787 +9373,1511af81f9193bc0 +9374,4904fbcebe6cc59e +9375,4392408e4d8b1006 +9376,8dbdafe0c8ecb0bd +9377,f6540b02dcf9a28c +9378,8665e3ca847b642a +9379,470789efd5fd454d +9380,9a77779519dc65d8 +9381,2b009eedc709b543 +9382,c36cfd276a7c5781 +9383,6dfcf2e33824fb71 +9384,0d084d9e702e7fa4 +9385,ba1b3899901303fa +9386,3f86168d22ab11fe +9387,735c5e76ca134f50 +9388,73d1a25f4fde385c +9389,9ee7e248b2e4af65 +9390,05ce3443b3a4ea75 +9391,d1bed24427454d8c +9392,12af7ad7cbaec07d +9393,84f1b6579b4f5349 +9394,0dea80850890c1c9 +9395,3f9e42adab5a6b5a +9396,6b9b65239bbc16ba +9397,fae988a94c35eb93 +9398,849dd9b74c38d7aa +9399,332c01df2f3c0e08 +9400,d402838883d3cad9 +9401,c44a0a5e5e6f3b89 +9402,db8400f7ab5ec673 +9403,f9015b6fe44a94e8 +9404,f9ddb2d0a08b5acf +9405,ad3f3a6f59f8d7a9 +9406,49f39fa348b5da30 +9407,f0c8e9d0537bc047 +9408,3801a8c958efe3bb +9409,dca5aced670e0f02 +9410,d1301cb74ba89897 +9411,a83f606ba01263ad +9412,82aa1ff23afce69a +9413,aaeec0347feff746 +9414,13666f6138b68f4a +9415,6e76cb89c48c4423 +9416,8363ff028e82e6e0 +9417,31b7f3f129a9ee13 +9418,4479dc0673a40505 +9419,4b76745e904c01d9 +9420,49cb633d570d829f +9421,f86e50ff18a6bd5b +9422,13240f307cabc9dc +9423,849d73c10fcee737 +9424,5182d63dfa4a0156 +9425,e3092b2a16ba98f3 +9426,58af33b90ab51256 +9427,6caec1bf8ebe05c8 +9428,1c662c1cfa74cb15 +9429,8f74da9bb316f35f +9430,08631f8ae1fceed1 +9431,05643448d3deeb2b +9432,a54712659d5738a6 +9433,57c3ad275c5ba16e +9434,747cd863a026ee03 +9435,6a3b6c87f1c928e4 +9436,f34b23041f30380f +9437,bcbe5502d9b45cc0 +9438,c13ee97d30261ab8 +9439,a446927f7d71ea24 +9440,dcbd1a75ddcf3cf2 +9441,fa77a3adf7f38c13 +9442,dfe2f30bba3f2625 +9443,203216981a129766 +9444,e7718277e1654f07 +9445,0290b28f9b417210 +9446,330f3b7fae16dbf7 +9447,d24afaf84c123d81 +9448,c102404f69019a2b +9449,b6e3f3267f916f49 +9450,9bdb5cf228275f54 +9451,a6c89031b90b3665 +9452,7292bc2ab6cd55d0 +9453,0367764fde55b45f +9454,49ffa227db32d800 +9455,b88af07143511338 +9456,3632f7af899829f3 +9457,a7cf5d977b9a9d81 +9458,3c008f0ed9fb7874 +9459,e75b34df3d30b565 +9460,deb7f823bedc8c33 +9461,09f0fc19636737ec +9462,2ee41a5295c0157b +9463,cd6da5026a1de944 +9464,ab408e107e7f057e +9465,b7ba181897ae26df +9466,92247a0958a1f14d +9467,6b94c0678aef507a +9468,7809a31821a1f68c +9469,29de34cbf082d5bf +9470,ce4f773d0d2d3829 +9471,198c5ae247340c6f +9472,706be029321994e0 +9473,52e065b9a709ea0b +9474,9b44afd0e0ef028a +9475,b36e3735192aa610 +9476,4701c6ae9f60691e +9477,07af1c64dbba1422 +9478,f647a1192511c9d9 +9479,bffbd3ef0d88d85d +9480,9fb257844b4d2772 +9481,10aca731c4d16e5d +9482,edd395b2417cd60a +9483,7b5ce182290ecdd4 +9484,e4327f63dca912e5 +9485,52ef85bb9d5de6d6 +9486,2da91ba9f648234d +9487,f692071a353e6279 +9488,9d206124acea6b1b +9489,1ef0b921f9f9306a +9490,06e07b37f3c1f522 +9491,749616b74ab45e74 +9492,e229e22ebc11ee3f +9493,1ba9afe6175c4602 +9494,fa792ad4170b81bc +9495,767f72c1bd640f9a +9496,871f9bb4579622db +9497,ba46cb248e0f3c24 +9498,ad9c8ce02d18d773 +9499,0f1b993280f057ed +9500,0b786910cd91a49e +9501,dee780cb6a1af714 +9502,c25307496a2029df +9503,45e2518f0d2a6032 +9504,4d4d5682d144647f +9505,6532412f3fcd9396 +9506,8fe774dd5ccdf2fa +9507,53b3e43231e6fc17 +9508,44a37a7e6b5d00b1 +9509,3a1301ca342da0d7 +9510,6d5873bc64275fcf +9511,b7896407663312de +9512,a8641a15dba48ff3 +9513,d4d29ddc9379621a +9514,9d4f9a67bf4c5108 +9515,ffb78c77861e51b7 +9516,98fda3961ff67d1c +9517,4334efc280cdf911 +9518,bdb9c9197f1022dd +9519,50d0b0f5ceda6e5d +9520,a2c00f64d9526a72 +9521,85478820fc4793f3 +9522,885f4174608a7be1 +9523,feff182abdd92d9f +9524,bb107353fd6a15d1 +9525,700968ce666937cd +9526,5ba8c24e76ce8068 +9527,da3019cad54eba67 +9528,0a2feed594e0918d +9529,fdefc2507d953519 +9530,f3ae0ce8778ec549 +9531,027c553a78c97568 +9532,436401a2502ec3e8 +9533,75f6df5223bd736b +9534,31fd1c8e6cacea44 +9535,7ef170ab834116ba +9536,a5512cee2ad4f12b +9537,68b0de42f759b6ba +9538,6629fa5154b144b0 +9539,bc968fe55c3ed25f +9540,580133ac9a11c54f +9541,ffd53858f4e6e447 +9542,7dad5720c766af25 +9543,a75c17b87aa727d4 +9544,52be71e59461368f +9545,c492c414afac2427 +9546,b414c31eac9872a5 +9547,91aad2f9d6f70fc9 +9548,82ba1bb2df17c7d4 +9549,cb30fb8f25143d10 +9550,de59f9bcaacd9ced +9551,a1afb99895b6893f +9552,fc3baed5495aaef9 +9553,4085c4f6c85b342d +9554,4bf4ff7cf7c50852 +9555,7a7b0dd6ca802f34 +9556,1e6b09ee652c3ac9 +9557,610386094abae795 +9558,2f28dc2dcfcb87eb +9559,525decb27c9bb7b1 +9560,f6ba18254a84270e +9561,8030bea601f1e513 +9562,35d8d3b2416921b5 +9563,b4adfbfc958e961a +9564,5fc8bd077a126d1b +9565,87c461ea003f337b +9566,2712c3ad5ee94cdc +9567,10242dbd55b35d89 +9568,0345ffb3a270d1d8 +9569,092dc73bf8e4b06b +9570,ccc87326b87d654c +9571,5b9d16a6c29f7f80 +9572,f462f9757df551f5 +9573,83a1d042f5c80220 +9574,63a535ae19c2f5ad +9575,7dc8b59bf93138a2 +9576,3c956ed98a54d6cc +9577,feeff214a90a8e9b +9578,a861ad7fb8b44a62 +9579,b8236952b398b22b +9580,4562780890bed8ed +9581,74a6342c7d2ca3a7 +9582,b5e83d3535dbf7c4 +9583,c0805158da110784 +9584,ef6a1d3a7ae8d3cb +9585,3bc42f5dffc4be51 +9586,f19bdc83eaca034e +9587,0a3e5c8e94718f59 +9588,1fd38434529fec0c +9589,064e93913b5cf80b +9590,241e77a0a351c675 +9591,77770c02af8282fb +9592,8d577bf351779197 +9593,7322d786914914cc +9594,f3bfd49ae6c853aa +9595,3cec88a57ea00b7d +9596,6a7829852ded9ff9 +9597,839ad024b85ff03b +9598,29a66acbedf89cb5 +9599,779c5b83cdfcc113 +9600,9f8697fa0d92ce1b +9601,706c9da9e5a6e308 +9602,10f61b5db8117e67 +9603,79fdf9bc13c7b4f6 +9604,1223b4bde6488267 +9605,b887033fd119ebc3 +9606,ffd2bad2cb67bc76 +9607,e87ec3ea11359e94 +9608,a70f2292a7cac4ae +9609,c17aa6cb1a4bfad4 +9610,bb92e754be624803 +9611,a4687ef86d3dd179 +9612,0e2027a0f292e5b4 +9613,f495eba74a8f2a2e +9614,71a493f84608e74a +9615,2293518c118b6940 +9616,a43365fcfa4ba482 +9617,ce23f7857f1b7062 +9618,a8b55cd47ef6793b +9619,782d6dcfcb300537 +9620,95dba7d4da27d8c0 +9621,10efdfbbd5a06221 +9622,d6a72487a3a5ac3b +9623,efcff55b671e5030 +9624,be7ca86d78ecc2eb +9625,35df28b55dfe8545 +9626,11c19d77e66d0a0b +9627,3d2d973e189a4342 +9628,c53ef6ef112d5476 +9629,0dbaeaff65b0d7e1 +9630,496e991a9e9d3252 +9631,5b7a8be1970af6ff +9632,3dadf30929b2dea3 +9633,0e1098fdde02e5bd +9634,39b55135690f506f +9635,f0225c0acd336b84 +9636,cba216fd7c055641 +9637,eecfb24f8501aa0a +9638,952c91f25111f6cc +9639,fff0788cee784739 +9640,b02cd9b6bd8cc9b7 +9641,068f11c0893590ff +9642,4cead936c729ba43 +9643,fcd33dca03925b5b +9644,f54adf9d0dfda1be +9645,b49d89d600c28367 +9646,beb49af0090c626d +9647,cfc1f739ad2c2142 +9648,bcd358c84020777e +9649,07a69d31b9b4df8b +9650,92a461f53a3aafe8 +9651,83fd26be30215bf0 +9652,b7b18b44794991d4 +9653,e048063d86acbe6e +9654,c654dd8ed9cbd1f2 +9655,b45c4b50615501d5 +9656,0b8f83aab44041bc +9657,01bee9cabf4c461a +9658,71cc18453734bb14 +9659,984b69b4bfdebf9b +9660,2dcfc04fe131c88a +9661,1dddec5b85744e6a +9662,9d95549c26dc5352 +9663,c7f8d97348feb160 +9664,01e75ef488920f34 +9665,f0190af7d545157f +9666,bc533f331410ca67 +9667,39e9dd4dc17f9f10 +9668,61ab9c2c8f0edc28 +9669,0b6f563fdc8493d4 +9670,9d1a0ea4398e6e9b +9671,e319a55bd40091d8 +9672,d7d7c735cfb1ecbd +9673,207857b3913ae1dc +9674,a5be8139efe2570b +9675,0999ea465d1898f7 +9676,7f3db2f39ff52935 +9677,0704d74f2a0e8079 +9678,366364e66cc6029d +9679,77029783be17e89f +9680,65c81c8e18b5d155 +9681,03ed7059ce29c8e0 +9682,b033747f9c6df2f6 +9683,1db4a4ca1c8b6626 +9684,54ff4900179c9218 +9685,d847821977d94671 +9686,4eac81fb33df6714 +9687,9ae0b0ffa9f71d3a +9688,1730eb29ac251552 +9689,26dae150e1df1c42 +9690,916c5a618b5f6464 +9691,216deb7019d11dda +9692,68c6c7f0837d48fd +9693,75864ad85874dfd0 +9694,32e56915839ab3c2 +9695,ffeb1a6bc80910c7 +9696,e99497ab93e3f0ab +9697,45d8ce13ccaab383 +9698,2e9073ccea1c849f +9699,a0676e78e32008ae +9700,d6ddea96eb0c0bf8 +9701,dce6357b0213e82f +9702,ead8885b9cfb8834 +9703,4300f89636002e5f +9704,af463648605572c8 +9705,aec0d33d2a5c4de8 +9706,f32576b7559650b0 +9707,6e2dd97e87392db8 +9708,17c930234061be25 +9709,a65b654b2198198f +9710,c8fff3b26b4e9f89 +9711,b752d4be1ab6849b +9712,31f567fbb981a536 +9713,b5aa3ee6a3e6aae8 +9714,5207128a27acd3d9 +9715,ab79fa96f0efd3ab +9716,fa3313b512ff2e4d +9717,7685a87ee7586309 +9718,c61d25e39dd4acef +9719,c6b3cf304f89aa23 +9720,cda331e5833a72a8 +9721,e321e8bc9a87b3d5 +9722,7bd10444b8f4952f +9723,01644eb9249a813d +9724,b585d8dd7bcf622d +9725,29fdb1560d4ab392 +9726,e0014214b003370e +9727,3f75c189921da731 +9728,53b95448e67e2696 +9729,a9cbfb60108d8757 +9730,90504a9363761e10 +9731,4c53926ec6d5dc7d +9732,b6272d121b137e90 +9733,0e797cf6639eadfc +9734,df1ce7bcf141e1f1 +9735,2adc49d3067a668f +9736,8e281c4ad1c68f0c +9737,80928296759faa1a +9738,eb83c3c66b482f04 +9739,d4161f74d76764ae +9740,235f855ea3f11695 +9741,bc95aa56d4f9e1c9 +9742,0cfc9ab640085727 +9743,980687211373ad4a +9744,7ef08946a829be74 +9745,3813411fa5b888f8 +9746,7877a4f7f3f4de7e +9747,49669f724e820aeb +9748,5dafb59fadaec7af +9749,690446142285baed +9750,217541e1c22083d8 +9751,0fc99b00c1bfee09 +9752,ae8e4c6a5b7b4ba7 +9753,08458864beb0360c +9754,d4ccf136f0f89c6b +9755,f75c23551057ef22 +9756,23cc69df40d0ebb1 +9757,03ddf67ea8ff59a2 +9758,e93fd3ecd6ddb38c +9759,54bf06a1739b9815 +9760,817949d458edb4ac +9761,e377fae1f6e0e287 +9762,981b038d120eaeef +9763,89e63bdcf4356bc5 +9764,c0e3af6cb3651f70 +9765,6b4e9426577c4124 +9766,342e80f6eae94aaa +9767,9bf39e9fd94856c0 +9768,dabe9a23e99ace63 +9769,09748c92e7dadf66 +9770,2afd5af047854e22 +9771,636c488e8b4d2006 +9772,ef95b57c868aa8e6 +9773,b9bd6d8baecb5d2e +9774,029357014339bf86 +9775,96f247e2472196a8 +9776,ce22b271dd7e0ff6 +9777,c30eaf4bcf9c8d40 +9778,fcb0d68f372b6799 +9779,86ea93bbef592e98 +9780,f11d9c083291a773 +9781,5976e794ea1300f5 +9782,0312b6cfc15c1464 +9783,097ac4607747fd61 +9784,beb7eb20f29f1d0e +9785,05c145f4270d5ee6 +9786,da38abdea7ae6068 +9787,08c4fb1cff95e4f1 +9788,1d2e669bf5603f96 +9789,d7d313c0086ac01f +9790,0c8efabb29cbe7a6 +9791,38641d67eb783c5e +9792,f91ab2fdaf123692 +9793,df92d8f25fea932a +9794,0a94f9e772d102dd +9795,ccf615bce1478298 +9796,12ae6c5e7f6b179c +9797,a87d7c37ec2d1f03 +9798,227a1ec1a71d4ada +9799,b6422f9ac2214ec9 +9800,0fa2d3a562b40cfc +9801,436dc0cf396cef17 +9802,b87f49cbb2522c60 +9803,4f1022cbddcf3b6f +9804,5e49965f9919ada1 +9805,f72f0f9529411745 +9806,2f0326954fe0101d +9807,596cbcfb53461f4d +9808,9401b249f8c62501 +9809,ca81f56a24fed7fb +9810,acff5bce093431cb +9811,c755b6bf1e246273 +9812,3c2f17eda39579c1 +9813,cf74f25543226c0e +9814,04f1271a20d6365f +9815,617a00b9ebdefd1d +9816,a4fbd35c5ce913f2 +9817,6d16138e11762735 +9818,b024a6c88e1dc12b +9819,577ddfb8599dbf36 +9820,1e9beed0b42f7b67 +9821,1f0f642fada471e8 +9822,5eb0ba084804d57c +9823,be641f4861531b09 +9824,e9a65d2cf743aa04 +9825,7ae985f3a36f35eb +9826,5c3054a05cf07670 +9827,fdb8085f40f65bb7 +9828,feb74324d570f50d +9829,3d17fa04aa570cbd +9830,476b59a6c2ef9387 +9831,7d9cd815fe1290de +9832,c3da02291d1135fb +9833,cd933dc032600788 +9834,386183a9d4364ddb +9835,b30f83ca2630e74b +9836,41913db74210e91b +9837,2f9648f2b424dddb +9838,11680251eda1b016 +9839,469c918732a1382e +9840,0aa889b15add9ae7 +9841,380a618526ce1d19 +9842,980b73f725a43898 +9843,afe3f8a543a37718 +9844,f5e1b4a1f19109ee +9845,b8626710830ceb9c +9846,e204915d69d33acf +9847,174ce50cbe1b086a +9848,3f73de7ab4776b52 +9849,7c7ba0bb82d172d2 +9850,777aabc0d2508fcb +9851,63897f07c0561b50 +9852,a2fcfb332c44091d +9853,6bd696c98a8d362f +9854,52cd17effd39f0ba +9855,c4a7a9e2ac97ff8b +9856,da8b65e247cdb75a +9857,bb92a1f3610caaa8 +9858,3114e54fcfad8b0d +9859,596b3f8299d413b1 +9860,bab6dfa2984380b7 +9861,16530143ce8275d4 +9862,250ac10dd9b3ead5 +9863,febe56f30883ebf5 +9864,b9ff472d10448618 +9865,7667b6bd7d85de80 +9866,c92708c5b70bda28 +9867,ef8fd3e6e0aaa442 +9868,bc9dd0697498ee9f +9869,e0a8fbd449ad11ba +9870,c5e9cf38a21dd71e +9871,960f1003096a1896 +9872,a0ddb84012deabf6 +9873,42e11bf83a2f359a +9874,5cf2ed29cf57c63c +9875,1aa3f43b48df7c8b +9876,0836713e1decfb46 +9877,f86328cdc6272d9a +9878,8a3c684f312c3c51 +9879,60cd017779502fb9 +9880,e99a74a4510d3363 +9881,2607c1a900ecb8f9 +9882,b38eb8181882559d +9883,61acebf20b872fd3 +9884,8f15d6c43e3af61d +9885,6ae8570f7c048473 +9886,b1ac312876a930d3 +9887,272457ed5939bd92 +9888,0c626d977ea59750 +9889,700351ea4b23bc04 +9890,520062046675271f +9891,fd0f7b95195c7a70 +9892,20e326e59674fa71 +9893,386f3f1192a4422e +9894,07f8a4c933946d9f +9895,a1ad8172ddc23444 +9896,2160c099438ed5d8 +9897,a45b88d5e0dd934e +9898,1c3c5e33076d7b42 +9899,002067253f2b52a8 +9900,f1de011c5cb164f4 +9901,c5743673a676204f +9902,734ce9486fa6fd83 +9903,2d40e3ae7abb976a +9904,1150237f96fdbc8f +9905,fc036fcebd633a63 +9906,738c162c2275af9d +9907,0b86e842efb02338 +9908,77b2f325eb292ae1 +9909,214838f6f7fd018c +9910,de4428b41d2bfd2b +9911,13cf4b62263d1eff +9912,8b032e5889926e87 +9913,5d8d3e4142cb3d87 +9914,d984c9b02b903982 +9915,7e0075a5ab3de891 +9916,b556fc00a950a721 +9917,60624274d82dc456 +9918,f3fe880a4b61b0d5 +9919,9c1695b597a4e9b4 +9920,7da306d7f399eed9 +9921,d539b301f5f64d26 +9922,e93f8e44a4ee0f3b +9923,cf2aaa1691afd45c +9924,eaa215d58b8864b1 +9925,b6d564196f5e11d9 +9926,ac3931990c9bb907 +9927,9bfadead6385d017 +9928,8447904e76500fe6 +9929,5d97637c970f2fd7 +9930,2302259a3fd83f41 +9931,03e476c388d6a933 +9932,3dd78b577d4d62f7 +9933,579e02f4cd5cede7 +9934,2d13892c2e5d7527 +9935,a986457025c2ff99 +9936,38532dfd3c3fceca +9937,2f7698fa7cce68cf +9938,30bf8819c0a87322 +9939,cb7358feec46d737 +9940,0390b92bb1905300 +9941,9fa5d1ce63e7905b +9942,ef0e6e7f5d21ce33 +9943,02aff78ec5493707 +9944,30e23774cd8626ee +9945,5f3b30bae47461a9 +9946,fad278dabf3eee18 +9947,f74384631aeb9558 +9948,3e007320aaf22239 +9949,63c8e782756f4478 +9950,ebf3057d39110f2a +9951,978ff84e3417e18b +9952,f65d086fe3c8025d +9953,76bc5595b8e26283 +9954,6d22af96447c5a0d +9955,959b1d53b1a5149a +9956,f9de6760b430a961 +9957,ca32259a8a426dbd +9958,1e8d895611ea0783 +9959,d42f8b8cf1ed5cf5 +9960,cff945e52393f393 +9961,1fce2b06d203a909 +9962,b0c5ee2247747511 +9963,bb5d11d79ef36b17 +9964,bcfa4162bb032ac6 +9965,1c353f2a1ccea9c3 +9966,6405e5a58fddb952 +9967,1c9815ff42ebb533 +9968,b8190d8ae2b9bbff +9969,bb26475e97506d10 +9970,314f919ff7c5b727 +9971,7289322ead732744 +9972,d1baeba48204ce1d +9973,e0424e887fb879a1 +9974,48287c741600d078 +9975,2f81c447bab1efc9 +9976,ccdccc00f9a07dfe +9977,659c01156047d276 +9978,c4bfed26022c8f3b +9979,5e421e795ee42e6d +9980,c044d18bdb31b932 +9981,1636f8ad25b649c4 +9982,903500123b659543 +9983,243cc49e7cde271e +9984,ffc3ad6ebb175f81 +9985,6cd92a32804685b9 +9986,a0e28bc69085fc31 +9987,84937a2b018d82e7 +9988,3d850c14b3a31161 +9989,4be24600b500b606 +9990,a06af1073aa7eb14 +9991,4363dbda56ed5298 +9992,acca547d90989f0e +9993,08b5273ca7fa5c05 +9994,ae4a69c7a5a9041c +9995,223c44c0c6319e53 +9996,f48ec2e4d3cb8f48 +9997,d3e1645482c945af +9998,6ee00eb6a6790ee0 +9999,07dec66810def4cc +10000,77c59f09385c77ba +10001,a9a20159fd68c636 +10002,7936f84ff703f316 +10003,852e60a07a927633 +10004,924d9d27697b3070 +10005,67a5cdfdd0f309ae +10006,03a9152c2cc29416 +10007,8f26123044e60afe +10008,2965bc15e61c1aae +10009,8032ff423e9580e3 +10010,cafe75f79cd526d6 +10011,782201e9ed992ff6 +10012,3062b09657e10d51 +10013,97e80dc0f6801481 +10014,358c7577c23d10bd +10015,8a523fdf42d657cd +10016,594bf6cdba5216ac +10017,a93ca4e3e92c7735 +10018,1725384fbfd10aae +10019,8783ed68db02f4cd +10020,40d94d1401c372a0 +10021,b98d2f09bfe55284 +10022,8c577e99158889f7 +10023,a1d260c56894a1fa +10024,fe097f876514dbd2 +10025,eb2aa367c08e61ba +10026,30f7653b9e67f418 +10027,829f80ac1cee158b +10028,7b10e74f174a4bdd +10029,f331ef17bfc72966 +10030,eeed8272ec8c7d4e +10031,cd68e693396856c3 +10032,b6b0eca2fb332260 +10033,77d09813c471e44b +10034,60921b4c2849debd +10035,9ebabb31388a7792 +10036,fdb2c0266405f9dc +10037,e56f9751b547a418 +10038,0db1257c2e8f729e +10039,38a706d33097a3ea +10040,1d4e9665a097ec4a +10041,737909a64197fb46 +10042,7e49b50bad9b46ec +10043,1917d7a16bf45245 +10044,95bd4aa9a65a3709 +10045,83c57fb85d4f53a7 +10046,ff922609583d1774 +10047,140d70d2aa1ddc39 +10048,85aeaecd79a195fc +10049,bb680c1b4ebafc41 +10050,493edf6df134a5e4 +10051,b0d561e435aeab35 +10052,b6b262156162baec +10053,b74cdf3516da6192 +10054,1c905048fb961d02 +10055,3cacd6c58a67b8b2 +10056,e12d4fae81b8324e +10057,de8fe7082920dff9 +10058,3af32642b1788378 +10059,2320e2ffe3621ae0 +10060,362ce2681b0e0cc3 +10061,0cc3df3c6c92252a +10062,d7ff1166ad4d93de +10063,fef74d0966bd2d59 +10064,2f6144901c3fc3fc +10065,00f4c653511f746d +10066,a814135893e57903 +10067,af46df5f1bfca71b +10068,6d46f446b9995f35 +10069,f9bb0fb994d0a284 +10070,591153ff10b3ba95 +10071,9e010cfab8099470 +10072,a77752c4fcb463cd +10073,0db28d21b647546c +10074,831405af928dcf29 +10075,564389cc5dd8b8b0 +10076,b11f56e75b6478c1 +10077,ef6dec89c3f1909c +10078,52e22ed6bde67303 +10079,71d999a56e486233 +10080,08069df4931517da +10081,f0f1f45d6bca3f6e +10082,9e0ffe242865d0c8 +10083,61b2f7ed5369ee6f +10084,f24eea17fd2c589d +10085,64b75615eb56c4e4 +10086,4aaa1787f93a5a0f +10087,5100b0c2b62a3822 +10088,599d12b7b1d4b18f +10089,9d59569ecd390a0c +10090,eec058b85452f766 +10091,c1b390f23d635f2c +10092,96ba7166d1ca55da +10093,853b0545a6de8e35 +10094,9dc4fdd15c958bd7 +10095,7ba06fcd66261aff +10096,e2948cce1a051aab +10097,c503b7e71e3e5fe6 +10098,430314836b8c48f5 +10099,04e78588e71e00f7 +10100,3e0d3463d4c53b12 +10101,834014c0c85557bf +10102,1f7dcb93e77d7568 +10103,c0f3f604ea8a91ae +10104,0bb7be947f8efba3 +10105,d46afa7edb17c007 +10106,4304392959aaac2e +10107,dde9c8bcdce07f89 +10108,aa92c781626c44d1 +10109,86c06c2ecfae273e +10110,f4b6b3cffab62391 +10111,f6fb2a894486526d +10112,6827e518644cc4b3 +10113,27001200dba953f5 +10114,cbbe38f40ce74082 +10115,098b420f75a88a61 +10116,7edde2f33eb9ac1a +10117,4f28a7148e428a60 +10118,3d574366eb051766 +10119,807fb557b0ae3aab +10120,f1c5b2d736b834d9 +10121,64d196cf71c1c484 +10122,d8a01fac383f4784 +10123,6cd6b401ade97915 +10124,ce4ae11e174d066b +10125,644cda7c7b3c5c24 +10126,6d5b04e812733eb6 +10127,7d8aacebc60cfcb1 +10128,e4727c7056251a78 +10129,5a00e14b59821fc9 +10130,dca783e08cc9e72f +10131,29e67baad7a8833b +10132,8d0ddf52940bd7eb +10133,eb7a0049c47c5cf8 +10134,f63fd85428f84fe5 +10135,fa3863a4d2960785 +10136,8e0cbf3469c8c8ad +10137,eabc72cf23b40bbc +10138,8227ed363a594fe2 +10139,920d3393cd19c1f8 +10140,08516edc4e535649 +10141,566c4cb538fe2df4 +10142,3f5594bf13f702a7 +10143,d945bad1118aca40 +10144,26f65961e060ba24 +10145,d694ba5e71ea60c7 +10146,0a642ca96bf7a434 +10147,3a9877b3f7194aa0 +10148,bf5fe6afb10d6a55 +10149,2e35876f108ad0df +10150,94222afef6e8477d +10151,294be3e461ac66da +10152,168eb9c616f95c5c +10153,abb61e3e1de6201f +10154,c5dc07609293a8dd +10155,6e9169dc671a5f6f +10156,aa51484a17b0f797 +10157,dcbaa4333dd2c56c +10158,9aaf3717bb9507c1 +10159,e47c0eb46ebc603e +10160,67dab81f9150e350 +10161,9dc59b5b7bfcd3bf +10162,557363c77f0dc34c +10163,af44df9a4b31497d +10164,0852c813a9a60861 +10165,d6123a9d31a9e28d +10166,d21452fe1d37ee92 +10167,ed1e1e5c4e0934c8 +10168,46386d3727230b32 +10169,1ec8bc58d541a598 +10170,4bcbe4405440b9dc +10171,cdf0fa9d9cf0e350 +10172,ac6e5b8afaf49e98 +10173,cccaed50ac4bf402 +10174,7c60120e3bc5f0df +10175,8104384316de63ca +10176,7cb6135de6fbcd43 +10177,184539ea7995f953 +10178,5bec485153dd4d0e +10179,57f4c48e78231e00 +10180,15d9afd72307c66c +10181,9b583b449d52a7de +10182,7ff009c425646204 +10183,721e5ce78e1b85ce +10184,526c916bb80c4ea1 +10185,6c608eb4e10f698c +10186,bb70e73018bc019b +10187,c8f481e5fc2db145 +10188,32721b87746c5350 +10189,c9a40d3ecc5f6bca +10190,1a209543446bb924 +10191,607ed9b6858ad7c6 +10192,653d275c4fd2c09d +10193,28ccd5e6d6f4c479 +10194,45c889fd9d6540fe +10195,fbcf1af0b53378d6 +10196,e6cfbac746509101 +10197,f209cfc38af5ca01 +10198,f118d9bbddb5bb09 +10199,b466548b81a5e2e5 +10200,2e1befd6088eec16 +10201,3715114de774752d +10202,6f0c6747b8979a3b +10203,5dfc6a804c489065 +10204,f0166a0fed3a3c3a +10205,b9f9fd793387b134 +10206,f08879b9abde758a +10207,cecdc10412c34604 +10208,e5876ca699261bc0 +10209,4a0419e33e08feca +10210,bb0f164fbfc68eaa +10211,5b164e4de0ddb86a +10212,5b858ee55c3f41cb +10213,327eee9e78e1c5a1 +10214,979bd5185d2b5a3f +10215,bc3059d52ca8c520 +10216,a22a490a2bfa2c3d +10217,609d724b0d55aeab +10218,4d2a7dbb8d7365ac +10219,2940026ade832be6 +10220,99e3fa7ba3b90f55 +10221,ff30c814f6bd784d +10222,428c614ac39e2f9e +10223,416a520542b50411 +10224,980200710e929169 +10225,fdfe24645a0b751a +10226,5fb04207dbf94802 +10227,0a86368583d078f6 +10228,bfdbd5a11c5e5e0d +10229,e425967e330cc790 +10230,ddd469aa8dc73b3e +10231,1ae19891242ee0cc +10232,ea47e41b4b49142d +10233,d85bafe6819a0e64 +10234,430e297691e6d7f6 +10235,889e338f28dcaaa0 +10236,d3801ec33eec9367 +10237,a26b9b6483012af6 +10238,97b705853c869852 +10239,3be29ef7c5dddef9 diff --git a/hashlib/test/fixures/xxh64.csv b/hashlib/test/fixures/xxh64.csv new file mode 100644 index 0000000..73fcafd --- /dev/null +++ b/hashlib/test/fixures/xxh64.csv @@ -0,0 +1,10240 @@ +0,ef46db3751d8e999 +1,928a358b25c275ad +2,26e83dc718588b17 +3,0c771dbbd5145121 +4,103460bb4a599cab +5,eaacab0428e1ad18 +6,66d1d7acae1c8af8 +7,42a95dc071e0e028 +8,430fc95c201839aa +9,d27386e042b7ac84 +10,800ebdde07280aaf +11,b8ff62fbe94ca143 +12,2a2dd28398456bdd +13,5729b68a733fd5e4 +14,4a6b2de5c1db7a2a +15,7719b4b1a55dd577 +16,cb2c6554aa9f44e4 +17,65bbbf822a1eb5f1 +18,6f4f91f80704368f +19,36c69061760d141e +20,e037cd6b61852ae6 +21,b54164f4075fb6d2 +22,05677bc225a35367 +23,98f132aaa3341334 +24,8f1fc2d8bcd7f4de +25,279a7d5e4e4b61ba +26,b0c069f2e1b6ac57 +27,e122dac943f6f90c +28,6bea3a21e79a478c +29,ad12c6a0584fc65b +30,497b2af41c98777e +31,6658cf35e1e7aca3 +32,40576ef99382d145 +33,2ef68659cda2f865 +34,518d02afe799b1c3 +35,31523a60eb1c2268 +36,6528a2780a481f30 +37,d86c34573fa0a770 +38,d7a11deeccc1b993 +39,4b66a24a7a22fc4e +40,d72d6861fff17c3d +41,08a7fbcfcb059ce4 +42,eb6e43be7cc42ebe +43,3ea7486ed93101e3 +44,28e5ff0199b4790e +45,cd8cbd8040c4f4d8 +46,bb6fe76eb20b233d +47,74f691c6e2962868 +48,e947f01fea21a375 +49,e78f8521af46e626 +50,5c126bd3ff818363 +51,5a81e34ea311fbfb +52,2e81b61abab3b472 +53,9c638a73d92d061b +54,649fd6df014b9c86 +55,fa732e3c8263f77b +56,be3bc1cbf8b537ab +57,787cc6f65a042966 +58,46bec461e3e686b3 +59,d8022ad4226be087 +60,4db99050868fb7d0 +61,ee5ac8c321c21510 +62,eab92df62e5e9a3a +63,7104fe47d5873922 +64,f73dd16820dae557 +65,4e7615640254796f +66,8187bc41e4ef681b +67,f98364b0f844653f +68,39c23fffc7978c62 +69,83dc3f0ed2903200 +70,cef79fa63e1b3abe +71,a993730c93122c9a +72,701f7b2daab32b48 +73,84ea4fa08a48c23d +74,2e9110b111b9d95f +75,f73e713f5ddf47b2 +76,f6573842b63a7eba +77,02dd0afd12947b35 +78,9e01baf4c2ecdb21 +79,c394caff2916c230 +80,257f3b2ec5a25fc5 +81,8dc27a24a440db6e +82,29fa8454694e6f86 +83,f1b1cc67d546bf0a +84,0bc278878552e23e +85,8da8b1455ec673fa +86,cc146befc333c50e +87,c41dd18e79fa4c0e +88,86e1072412fb445c +89,5fadc2ea4bf93ea8 +90,5d49c951411c8d80 +91,1ce7a67bec2bd292 +92,e1ff187b13e296b6 +93,50bb94a7a957a6c0 +94,497d0e2ba5f85ee9 +95,977ee3c20a042883 +96,c06f66c6c90408cf +97,5b2eb9f3889a424c +98,87304b7dca4dd098 +99,63873a6b0987f5f6 +100,b056d3562afa52c9 +101,8f8f8beedb6abe90 +102,808c155f0229f0bb +103,748ec1871d0dff14 +104,57c8cf0554efcd7c +105,b2c77962b8c6181f +106,6e7ae14dd04c90e6 +107,f1ec572b017167e9 +108,3e26e622d8c79bf3 +109,da9a491e582a04b8 +110,452c553c2a4c4d4c +111,e3014a118bf31eff +112,19e3cbdc4dd407b4 +113,9aefa13d15a22a5b +114,bd981de06b12b05b +115,5e48199cd22e8fc8 +116,a5673139bb2f29b7 +117,2a3a8321e6817c8b +118,d53007f03813884e +119,f00142f97c43e30e +120,aff48ab699435dca +121,1849a705a680a485 +122,acab75e3fa56ba4e +123,c097d2d2f06f31f3 +124,18530ad02a4ddeeb +125,31dcf1d598041bfa +126,6222179e86ce5fe9 +127,d742fe38018b6746 +128,cce57945b0ecbf63 +129,99896e4e25b42658 +130,43d18686b3fd778c +131,f7d80f8b4dcd4ef0 +132,f27a1a0758fcde46 +133,f5a81030e42785e5 +134,ea4d5f2fc0331df8 +135,afc330f400039127 +136,2aa6652f1b70d4c2 +137,9ce89623c3c7a87f +138,1a68f9e85a5cd929 +139,e9f91c8e1a16d59b +140,86e48ca7f5d0fd1c +141,822128ee1f45605a +142,86a5b7f183c7a677 +143,2a8bf0968f02cef8 +144,3b7496e1ec976c0e +145,5025c766e9bf9193 +146,114d36068807d087 +147,5a8facb7a83d6de4 +148,ab02018e6c0aa60d +149,80648c90b02dc0e2 +150,161a13a26a229887 +151,5efce62399d1b168 +152,a26d9bb2e6f491e4 +153,9ef5c1dcd9e9dbbd +154,3375467fea8b4948 +155,ff562e4a17a89b6a +156,b8295814a96a73e2 +157,4952504c03950369 +158,1429441dfda74e56 +159,a7b2e09780126428 +160,d8ad309371b2a978 +161,5af16853516f4e3d +162,08419d5404101272 +163,ffa33c37e17b0111 +164,75a99b1242f2d9d7 +165,dbe629368dd701a8 +166,2ae7637d4a75e459 +167,bce94a622c89809f +168,3b07413b68c0890d +169,9474076bbf2fca59 +170,69f1060f79f54d51 +171,6d9f36b9b3530ccc +172,3266c2ea1ace0cee +173,ba3da59d8feb2207 +174,b493645c97b5ff9f +175,e053b49b49cf7410 +176,8bca807a31ec2b71 +177,5c7ae437035e75a9 +178,7d22502faad7dbd0 +179,2f1c7f1a8229a15b +180,66fb8f91ad19b1dd +181,a7f3be298a78c4e9 +182,abe805d3e5a28cbc +183,cfca55a75c33f9bb +184,ba01e5c07c3ef090 +185,2ff7834b3eb3f65f +186,25cf0c6a2f660ba3 +187,44e5e7c1da0a195b +188,1c4437c0d13871c2 +189,a55c12a1a36b4e6c +190,71138ac5cb193d14 +191,76a092970a8397a2 +192,bd001fcc02cfb1c8 +193,a60ff3132f015a61 +194,e4b9911ad296bc4b +195,b3e70b53c97490f4 +196,53c886b2612f43a6 +197,d1b4f647dbedd353 +198,10d67c9e4ce2de53 +199,e1712b6c28a6a58d +200,b7aa1e3df6ddb308 +201,19d0edd9ab7c0725 +202,59c89195fdc8d8d4 +203,583dfd4a6c5fa66e +204,ba9d86f544e5d538 +205,38dadfb07d52d688 +206,9e98f527e9542c6f +207,f67d5ec13841809b +208,e6773aa51f54ab84 +209,748932404e6a4c2a +210,71c3d7988af6832c +211,de5bf0c7d4a94dda +212,383cd05021bedb82 +213,bab7483b9522d8f4 +214,66e32f77924a6a0f +215,907752a380485497 +216,9896a6b800145868 +217,3a11bcd569c695fa +218,fc2f23a92811ed50 +219,867d9033f8a0cfc3 +220,5a945aba3f712019 +221,646ced632e0c4560 +222,f52b78dc5eaec930 +223,2d95036b2b80d8e7 +224,228b0b7d33aeba2e +225,2dcf423a1c90e5ed +226,98604fc0f9a5bcb2 +227,4fd4cf6e8e3ae97c +228,29583a00a8f29396 +229,460eff94998f5643 +230,ab6422870146d383 +231,16b2f7f27b7f552c +232,b5100a3cb353a651 +233,c5ff79e4f32be092 +234,65175f4f2770adc3 +235,899edd97e1ab38d6 +236,65ebd8907bf39490 +237,8a08c07ff66c5f4a +238,059c940688347d20 +239,bb532ff3fc56a43e +240,10599315bada5b9b +241,4aa358f682d808f3 +242,99c752a0d2d1dad8 +243,60a0c8252aaaa8cd +244,2a110201aaf11cf6 +245,a6b5f7a7755cb459 +246,71f39a3afe4c705d +247,aeddfd120ef4428e +248,a72602f4b077faaf +249,102a5233a09523f2 +250,4229372dd2c1005c +251,363d1dda84482432 +252,52ade9574680a8b9 +253,e1034c678e628f09 +254,98dbfde76fe1784f +255,53a76382b9e584e1 +256,9e2d159d990d167a +257,86511bbdf3928b3a +258,742c57d0ce2153b4 +259,fea840ebd85166cc +260,55ed842c5f48db52 +261,9467d9862ef86835 +262,d0c0c5c7b54ae1db +263,46a2b566a6b6e695 +264,0b671d20a68a6861 +265,05ab82c22fbe1e6b +266,eb5d61db2cba2f0f +267,9c88a6851f17d51a +268,89685f478ca443ad +269,424e7b8728fad93d +270,3c5eddff65e8da47 +271,65e5fcb034ad055d +272,3f5928e838dbad16 +273,64ee877fe9d362e8 +274,11f3e57397d1e385 +275,c25daadbb5ef81eb +276,ab1f93a9f9917260 +277,fcf44ea2d83c29cb +278,031744e1a88480c8 +279,d3a08e6ea4affc29 +280,d2ba4cf4c0db6666 +281,8692c9da32ac2024 +282,5edbabe3696d3a48 +283,c22295187734c86c +284,e15e34c62538f2af +285,4c2565064b1ba1f8 +286,7a14f4f5e8869087 +287,40aa079af078eb98 +288,33a84584fca0c470 +289,b17892853d9f27e9 +290,8d000a69b9c60a93 +291,eab9d9bde6ce8f25 +292,e1af7c6713bfee2b +293,9928c0b375f2b895 +294,370cb5a232b64979 +295,f20d6abac898ccc9 +296,eb56b1d4dfe60e10 +297,d2deb1370275de0e +298,38b3b35e81ed9226 +299,8278c6f78c6ea8e1 +300,0aff60c3bb98f32f +301,aa2da71cb6e0bf91 +302,7d9ac13930be5623 +303,823d0aab7be799a2 +304,9c3dc71b3e0242e9 +305,b363c2dee1ce72df +306,4c6c019dd2a357ab +307,4782f125e6c5ba5e +308,121a22d9cb96f5de +309,1e58beebdbe8d0b1 +310,4309fe9d569d4e5a +311,380c72cc30318317 +312,a11291cde4f6a5d2 +313,fda1b57935521e41 +314,15755312ea2d5aaf +315,24e96078b1e1bd0f +316,6c56ca436175b4b8 +317,adbb82cf98e5d1e2 +318,61efa1f590be74e7 +319,348791bebaa6e2fa +320,730bda7594397c61 +321,20435efe2207f1eb +322,5485ebed1b1546a5 +323,f0837fb1f966c20e +324,e64b7e1bca04d7de +325,977a9740a81d6824 +326,83c5d0189449127a +327,90b2a5ce5734b2a9 +328,3ae1d1d673caa4eb +329,6e64020f6a8e8568 +330,0c36494fbf75d839 +331,b6d20d916eb178bd +332,a8ba2048de2c185a +333,101bf35b2ab51d9c +334,5b1ab40062ef8f9a +335,d3c97dc8093d5acc +336,e705299d0e760874 +337,c688fa410a6c2a78 +338,63a6c6069392234b +339,8c7ca4762d7e6f6b +340,d63bad8f14fb7cad +341,123a285962b9bfaa +342,72e7e0d1e9c25e28 +343,c38f226b34a2c56b +344,0f0bfc32c49f5e35 +345,3150f4460f198aa8 +346,4af7075acf27f79f +347,3deb30efe5287940 +348,4be03be03fbf4ac1 +349,329a5b3d345779e9 +350,916c7b0e226b9030 +351,c9b6fc2bc9ab818c +352,b7827afda02d84b9 +353,2507fc16bb3fa073 +354,833d3abe4688d027 +355,6c4d487f317d9209 +356,b17ddd6e927d0329 +357,5fd79026a5e40915 +358,d6446d138efb4659 +359,4edf0ef2050e5164 +360,5b62e7bf7ab6a21e +361,5694ed243fe699bf +362,64a1d0b285708183 +363,c0f5179dbd5b3665 +364,1d966b27da0a3434 +365,aa05f005bf9ec945 +366,e12b65cbe9ea6136 +367,dc125be89252fe7f +368,2710033a49dec83b +369,af60334667f945f6 +370,f5839dcb7affff68 +371,d5e79e4ca2be7f77 +372,8574a9cda518a29b +373,acf190748a41474d +374,17cb45200b3210a4 +375,6cb9e51062fe5bbe +376,ec6b9803f1b55820 +377,24496642597f1a33 +378,370e83d00fbac7bf +379,6b5e40588811f420 +380,7ecd1b1c9f2e75b0 +381,648dc2c1bd4bb217 +382,6aed3e1a312a4861 +383,92e88bf4fc264930 +384,52e1ec6084535519 +385,e623a0664fba644d +386,9230385813390879 +387,c43ce76ef54e9607 +388,71d3f53ae27ea4ac +389,1dcfbafc12d5e096 +390,c1a1ba0c5bbd9df6 +391,0ee5393d056915f1 +392,65916b07f73dc9f5 +393,8aa36e628762716c +394,6f97cf76c3ad4f6f +395,d138864cfc7b2958 +396,eaa668f7d4392b07 +397,879763a223fdccd3 +398,9a8b3144f38ef190 +399,3d82093688277cfc +400,034359fc845e11b4 +401,ff7a2a784d71bb23 +402,55c4e69a98969eac +403,f3761ded3438cc5b +404,dd71cf9a52cbd1bd +405,637ace324f107acb +406,60ba3875c81dcf72 +407,00e7343e9f1ef06c +408,03ec67810470af86 +409,1ba53fbf001042c8 +410,451ba23d58016ad8 +411,fe261a3aac15ee2c +412,7170af823eaf3566 +413,f63d76a710d31268 +414,cf78e7cd339deffb +415,28a41193f4dd3b59 +416,902dfc2622d65e09 +417,4001a203695a03e7 +418,41751f5394e99256 +419,1c466b006ae62d7f +420,c637eb9776e8c7ce +421,eeb0dad5af94fa78 +422,749e282e0261d9ba +423,5fdbec79ae640986 +424,ac4d879774e90e07 +425,e1302ac991547c04 +426,e8d506aa00ae6e51 +427,dd7ac441bc346535 +428,64ed54940679de5d +429,e6d6bbbde13bac38 +430,454432fdbdd24027 +431,e39d916bcc6b5126 +432,3a100c2737c18a11 +433,e7b281aa0a1ec7a5 +434,7c2b84489ead9eba +435,6f530f4b7f5455fe +436,64be8c66e72c03e3 +437,a678e82e1a3a134c +438,ba2c0186f3d1245b +439,573d66f2b5efedc0 +440,5b4ba654301e76f1 +441,cab7bf1ccaa55382 +442,e1fae910c88be495 +443,37ca8f188ed5d11b +444,e19fdb0e966de013 +445,b9246c8f6e9fc97d +446,084d099fd90a65f3 +447,57066d80ea5ac05c +448,2d6c00bbef2e6957 +449,146083421c90d084 +450,5ffef70738443151 +451,0793cdcaa7570cb6 +452,c0c0dacb9f60bd28 +453,4c2eee39eaae9a47 +454,691f00fb4b2dca8a +455,9526ef4e620c2fd5 +456,9e8fa6dfeda479e2 +457,71b667e12bbd1dbb +458,2fa953769febd45b +459,b148459954d1bd3c +460,32ba4c65c275503b +461,8fb77e6ce54fab72 +462,fe45396c81b4a9f7 +463,24b445e3e723166f +464,5010e523a9e58673 +465,0719ead04a044b9f +466,fd381bccb983719a +467,24b09a881009fe67 +468,2b612f52773bf707 +469,6b34d5a77d059655 +470,63ea014073306b84 +471,e4a504f18a86b5c9 +472,0807911ea7a04da1 +473,6411672548dda219 +474,def6421e39d9966c +475,3a337f9ffad328ea +476,ce6a25203227fb1a +477,f9f7053dd35786df +478,a6aa28e8754f518a +479,046842fd812ec7c1 +480,4885000f3583f1c9 +481,b6a8ce95fd65c4fe +482,a5b6866465a55bc7 +483,71c920daa1ab7d88 +484,87226961dddd09a0 +485,50c437882c322603 +486,e7fbf8b0c67493d8 +487,a9385abcbbe5d0a0 +488,096ac2c90789ddd1 +489,a910da4e48f0f403 +490,da7bb24ef29bf9c4 +491,2f5cbe17dd5f4b98 +492,e5ee294fb55c2be3 +493,e52c9505c132b6df +494,d6daf430e4d67ef5 +495,efe2ce91a96ea468 +496,0e58d0c8edbb4698 +497,62015efb292c66ca +498,6dc2769ec2715b80 +499,e961918cec58f1c1 +500,1a7ed2c8a64b79a0 +501,845dc95c0747b206 +502,b429a3bbd11a7904 +503,8f1e81e5cfd60dff +504,cc90cbb7b3bf730b +505,a7f0923c7a9310a3 +506,852db5f9fa6aba91 +507,f30dbd31b15235a9 +508,fd955bd889fe3b3d +509,75d47440eef35613 +510,96dc2d0fba317b29 +511,40adb0fa34b1a5d4 +512,b13bcb85d7c9951c +513,ca639c12d802d852 +514,a2832b92c23d40fc +515,79943457edf705e0 +516,efbe159ba3e62c5f +517,633d01a4b52725c5 +518,c3f07fa4f57404ce +519,3e297130cb3c13db +520,4260c2b227577fb3 +521,7ae976c0637eebcb +522,52ff92c308a394e2 +523,fadedc6356e9e7aa +524,99b828f1392987fe +525,d4c1ec0335fbd9f8 +526,9b3fccd3a2c60f60 +527,4654b81c2b8f59e8 +528,9339bd71f5e3cb06 +529,4c30d48d9433be4b +530,608eb75e40f245c3 +531,254692882f492235 +532,c533715f4f2e71d7 +533,11f11539e8bc6855 +534,6db2a122d4ca04e2 +535,9aa3fe41835616f2 +536,36f90f09d501cb30 +537,1c572c783ab6a1b7 +538,2341daa149f9c83a +539,860bb958542fb38c +540,d833293da27a129e +541,176bc96008581f37 +542,79f6260af45cfa9a +543,a1478a930b9ea09b +544,375acb09a67f5f88 +545,112ea3036cbea62a +546,ae9cecd071d81512 +547,219c3122e94e61db +548,fa3b523c5ae20de5 +549,0df17e81240bdc0c +550,d83512010c876d56 +551,e88b92cf1af49d2a +552,0ba671250076594f +553,cb6ee6d9ba2b357f +554,40bc53994a8cdb47 +555,3e4188adad8961ae +556,2533301a6093121e +557,46d14fc419425442 +558,1c8384050c9abc9a +559,1168cb0ef818dadf +560,95320d9b9d8fccbe +561,bd5adac121e0d2c4 +562,d9fa7bd8402937d6 +563,a88b9a246f6ff244 +564,0ab8d280281b8598 +565,3748210668e0fe6f +566,24a71081d0ca215b +567,0385702acaa25717 +568,2005c642d72b8d8b +569,f0edcda2203a79ba +570,5e8c0946c2269279 +571,05c24f2d375cb57c +572,25ff3f2bb8c39187 +573,ed191dc1216cf9ae +574,dd974b98d5922fcc +575,0446bb501cbb3369 +576,719181c98ed9b76a +577,b49992b3c61bf177 +578,1acbf5bbdb163edf +579,d9ae94fd5e554fff +580,dc00f413c703d4b2 +581,13422c7b30608189 +582,55438ea3324720ad +583,20744004ee5d0120 +584,e9112a98172e5e1f +585,d58efc8c6f8d3221 +586,0945a8ba770a8837 +587,d2ef53114ce672e7 +588,7fcd0160cf16937c +589,5eef307958da2e1c +590,68781d7f98f25fd6 +591,6b8f5b49521df7ba +592,9909280096e11956 +593,7d48bbc390461fa0 +594,0fc37e3e112d7c3a +595,27d6c627366e301d +596,3e6f1d04a9db2629 +597,0a95786c1469acfb +598,71a330339465a9e5 +599,558bbaed9cc2fb1a +600,0c790118d36042c7 +601,4bb78f47eacd412c +602,7426f7f5a2948bee +603,7f90e69b50f76b90 +604,3860a627dee2763a +605,eb716b5b325e7aa0 +606,7aa07bb35986ae58 +607,b607746de63e6fb0 +608,7a0150014de3fb4f +609,503c04a70a30d884 +610,83f989db591bad01 +611,8e58493e2c519243 +612,6944baeea95064b4 +613,a0fd2f6811b8a086 +614,ff845642b3b4cf53 +615,7667cebc77e06810 +616,a43f28f5f58c87cc +617,17b1a69b62a5b7f3 +618,a90fce0a26b31ada +619,9d396a9b6b25650e +620,d387a0b31b65e2e5 +621,a7a105db0faecea5 +622,47245da5081298d1 +623,009b3e8d8be8476f +624,8dc93fe7de75bae1 +625,cf1d07541f54e3e8 +626,eb61fea47bff2eb4 +627,d6a88eb597f38e97 +628,e7fc1cccdaa00045 +629,570d20914c3fdb74 +630,97c6d7ad5da4d509 +631,f6fe98625b6daaae +632,46d4a1eccda25732 +633,04e9d21448c54785 +634,5ca34214c011141e +635,a5ff7cb9e6921e57 +636,d6b0bb07b6bc3bb1 +637,b499f653c04799f0 +638,66599c3d965c34e3 +639,503ebf1818d4e54c +640,d1fcedf05fe2a6fb +641,2f360b89e6381aa6 +642,a3c270f40f7f2671 +643,ab70e47e5741af4b +644,4e594b53614c7c85 +645,227d9f7cb6f52805 +646,09ff7993d7ba8137 +647,1558ffeb162b1fe9 +648,fea7bd9abbe5f1e5 +649,e5eccfd11a367781 +650,b0260628e25b7114 +651,cdd0bedf944bb6e5 +652,4fab2092710be0de +653,f6b4f4622c0c79d4 +654,53fa3f1ad537b901 +655,436959aae66d3973 +656,04c31732232568a8 +657,0629a6013648fd44 +658,0dfa01ced60b6711 +659,3b17e918122b2fb4 +660,6715eebf31b2a7a5 +661,ae89a9db0536cccc +662,6aca7c9619d982f9 +663,20391f3bf6fb7f36 +664,a63305e911fe3dc1 +665,d0d59d6d551083b6 +666,7cbd4a0853f26d72 +667,3266435bbf105d24 +668,d411e8fda78677ba +669,b0f3af250f45173a +670,f287792c638516f8 +671,7965726396f5eeec +672,800eeacd77a8882c +673,996c74bf36e6aad3 +674,c154d5da9ff0c015 +675,658cca15fdfa7988 +676,faaedf520724161c +677,d3192e6fd99378e9 +678,d0daa82071e574b0 +679,7365ee72fdbb34c9 +680,118fbddfa1403226 +681,8b1cf5e1ea809d68 +682,641e2f8c73d2a075 +683,2295c0d87b24ec84 +684,cc2e6f1e806b2b55 +685,f1b888af721a6479 +686,6b574fb016e99f27 +687,4bf2c01530c51977 +688,cdc511a276fd116f +689,d9097602d93aff1c +690,7a712b8dea36e3a9 +691,4d0ac3dbbf703633 +692,04fae3e86b39e360 +693,f4a4f1e592de32e8 +694,e39dd98949bb4403 +695,be172aa8b6841204 +696,e8db761779a63fbf +697,2e1bd9c6deb6dc6c +698,d9140daec6dace78 +699,1251c20da9452b9b +700,b241e07b097c7ff9 +701,905ed04835511814 +702,f96aa93b0c33c464 +703,71a37682157fedcd +704,38505053683f6a7e +705,5bdda1e157444a9e +706,d8d513f3b8bb2770 +707,a5d1c964aacb854e +708,2511a84d09ab5c11 +709,93fe9f829328b500 +710,d5739d00d9d5ac1b +711,213ecf43f39125c5 +712,8fc4e1912de9a73a +713,af73664f9a8c71c6 +714,1c4f7fb1f49be15b +715,85ad183c22df3694 +716,29ce50b1129b2a0b +717,f7e330cf07709dbe +718,4320495f20ffadca +719,2dc4d3940dc6edc2 +720,2313d0a4254f2db3 +721,b2bea179bca28baa +722,906ef8d61fe98a54 +723,2242a8d345510507 +724,1b455be6b3534c9f +725,913f45eee908ec08 +726,08fbe6503965a42f +727,e868eab27eb2ec83 +728,e61a4ca8ed914f5a +729,8183ae5a3c3161df +730,5488245670a3011c +731,00c5af02ce8d2b99 +732,b59d8145fa64a4a6 +733,5e8980746f5eed5d +734,6a6c24096785e997 +735,16e29000f0290711 +736,36e7f660eaaa2130 +737,3b280da89e612f60 +738,6a0827053c1745c9 +739,7f6ad64d670cf3d2 +740,5612f604694ca611 +741,e35b4c1adff68c7e +742,38995e57e0778390 +743,9ff944af8b1e591c +744,413edcf07e735ca0 +745,58dc60f4b7457cc2 +746,778e09b48b166403 +747,edaed0432a05e133 +748,782b12f8ef699445 +749,0430e2fb3011b1ec +750,015a395434e080d4 +751,08e3f6389b668a45 +752,f10014517726a41c +753,9b3f15a1bbbc6a50 +754,64c00feda96d326a +755,06edef658cc92e05 +756,63f21fea1fb440b4 +757,29d598c631ac3f6d +758,7a84cdc144de9283 +759,57b39b025ff972d7 +760,ad4892bd439a3062 +761,86c097522e71b3e8 +762,d9b16b9423598f0b +763,76de48c02c7e88e8 +764,753493559f745388 +765,36556d3ac0652d48 +766,45c0dcb7bd5518f0 +767,2227507237a86146 +768,92178d9273322af1 +769,26a6eb0146c8541a +770,598d7d80de0fe665 +771,516d6dfd638481a3 +772,3417ec824977d704 +773,015be7a276b45649 +774,99911cc8347374f3 +775,3657eb08148d298c +776,df26670327645d06 +777,70b657d4828cd358 +778,4851c1a78a085fe0 +779,b111bfd2e3a050db +780,278fbe14a7e6f521 +781,9dbd5e868c8926e2 +782,3123bc01d41a7420 +783,abe97321ddaeb2d8 +784,93cbf91102ad8db3 +785,9fe3e5d7b9289522 +786,04dbac6a3c6b98db +787,f0f42dc64f56a8ec +788,e3a2ef68a4cbfc50 +789,b0f4e7ba107087af +790,1e05f53a90c1dfdb +791,bad2a059778b72b4 +792,59811d3c8d300c7a +793,17fe94b1660d8f52 +794,57ec19abbd9fac60 +795,a26998372a517e9e +796,ed20f50c582e034e +797,60b2639ccb381066 +798,0a4facf9da575a0f +799,47f971519f1d8041 +800,006868641aa97172 +801,dc3b410590a2ce25 +802,b5c441eb11ab87bf +803,b43f75bd71143adb +804,ae7403fbc857db4b +805,e6906512809e7da1 +806,4cf81c85ba10b83b +807,3c5bfd88c27c1553 +808,2daa199d1a5510b7 +809,c0c696fbde66aa6b +810,832509df5ef067f8 +811,a4804f8756336d09 +812,ad8a8cf6ba0871a2 +813,a8b4ba24ab940f0a +814,4136e0385d82fd15 +815,cccee29083caf9a7 +816,a628c84001073dfb +817,4b6b7fcae9fc3ffa +818,61525189235f572b +819,e6fc9914d44aabde +820,7700808ccf67402b +821,77f181dacccc524e +822,2035dcdb984c4f70 +823,bc246c55118d2ff5 +824,dca8eb6f3c004924 +825,b36f8ef41370f5e7 +826,fc893fc52241be84 +827,7a49d3e7db93f1b1 +828,a6c9d77c17af7c92 +829,f197c7eda9af21fa +830,897171e3ff067d53 +831,e137f0e1c0eda69f +832,69ea5e3298eade84 +833,2e7a152ff9706e38 +834,e0a5999ffd049133 +835,c5348417e5beccd2 +836,e9349fe473f13f00 +837,b44e0dc257eb1811 +838,5d156814c926be8a +839,4241c787807991ba +840,3d4a4f5444a71e7b +841,733d043d5f857815 +842,6bee9e55db6c0a08 +843,22a54664516ae551 +844,c3158c93f339b31f +845,585f4d61288e16c4 +846,8c98522d85188c38 +847,e1936919d7a02a58 +848,1cd428fde5f7715d +849,05127ce35ae18857 +850,369a0f0a8aa5d972 +851,5d3d85cb971d04c6 +852,f1a56405dedd8030 +853,84afcfb6a7b31eea +854,b14bf23bf4776b62 +855,4d1c56ef8f806c6d +856,924e25e1416de82d +857,937998f36ffc7e7f +858,01b4d80f2eabfbf9 +859,de334f8a910bc7b0 +860,1ddfd20f9d64ae93 +861,faece2fc76bdce37 +862,b483374b95f84ee5 +863,3db33653bcad32f5 +864,43d8ed8c62385192 +865,9a74a09edf436777 +866,f0d4449a6f210018 +867,1e4292ca5cd1d1af +868,209dcfc614503d8b +869,ba8790da4422519f +870,e9aa3095d4beb6ab +871,6e8113f077521f24 +872,e836020c4c24797a +873,55fbdc9cab035eba +874,dd3eeb56ac2d53c9 +875,f0010a27352c535d +876,fe1b9364138b22c7 +877,9aca50259fb0273e +878,79b4f28b1d04cc97 +879,a05fa727ec0532b9 +880,391c6f28b5c46a41 +881,8ee670866fa20259 +882,32dc5be8653abba3 +883,58b62c42b54f2d43 +884,6cf3d1da42152834 +885,e6b4662f3fbc397f +886,91e85bef96c07c20 +887,7fa260fc515b0a42 +888,0a7c5b0bebe61035 +889,566fba711e30c640 +890,948d25052b309c74 +891,7710a57c7beaf158 +892,ba60247df60d358a +893,67440d01609507b0 +894,018dbc26aa8603a1 +895,8a34c0fdea7163a2 +896,e7878fd85a54df68 +897,bb05adb558d75016 +898,2a99b56dafcf790e +899,81cac1b6564e9d11 +900,9d2ee63c33e96c0f +901,38e2dafb2ba400ab +902,e3522e6eff6877b5 +903,e296e9bec9bc9627 +904,763cd490a6b92dd5 +905,b8cc2feac18b83a2 +906,f0c6e30ecc0feac2 +907,3eb23a5bb21ba88c +908,43cb703923e5a84d +909,b302b911413732e5 +910,d644e024d0008bd0 +911,3829b3966f6f51ec +912,6fb1921be5435d61 +913,c63497b9db8cf201 +914,03c2dfa078c0d7e2 +915,e9790b8be5924be2 +916,40a87c1e09a5bf0a +917,564c88768407e929 +918,ef2aa38dcde18a9e +919,38341b76b359e9da +920,768b7fb2a86db4b0 +921,02c5ff8653573aac +922,b7cbef1b78106e78 +923,b15255b50d651206 +924,32eb8cc774b2eec0 +925,98f1d93d30d67dbc +926,e3245fa4d8071aad +927,230dbb696455908c +928,aa0587cc5514a57f +929,6f090d3a73826244 +930,87b7fb4f4b18b177 +931,4c3fcc0311b61236 +932,4b083cba70953d9d +933,d37c566667f8308d +934,513f8bd48e62c5ef +935,0be2de71a3059988 +936,290adb3e5cffea25 +937,20975cda8f782b96 +938,81dcf4324c979a75 +939,0633e9a322fbbca1 +940,918ba02cadfc630f +941,27f5f91a052181cf +942,0c99f6d34d44adb4 +943,5ecc46f0048ed38d +944,ed0ab819182c250c +945,fd4d2f929c52b9ed +946,ebb769e7ead157ce +947,ed95a1ead557619b +948,57c6d58aea6768da +949,5f9483b6e6b5b7d4 +950,134c362f4fe389be +951,ce36281046b66c80 +952,bbd9d73f42ae2c39 +953,05a13919478c6652 +954,2fb4c74c01007966 +955,b1fc94b3e6331ac4 +956,bb526ce5031fce51 +957,0dc3a76def4ff857 +958,9c2a7a7b41e35c6f +959,41a1cae39aff9e35 +960,3e945cde04292b0c +961,e4838d4db13908ab +962,5a000eeb089ad142 +963,3656b79b6abb3f25 +964,6b0800e7b52e9d58 +965,5a2401c43ff014f7 +966,14876d61a8d19bf1 +967,ea692314d6562034 +968,1604114e5848f59a +969,5f3aaf51475d1505 +970,b22fe4bfaa5f78cd +971,69daa335f996084e +972,279a62bf15bf8a72 +973,c5ceab02b62eeb79 +974,905cf8318dbac5e0 +975,f029f3fa1b718127 +976,505929dc36c00f68 +977,5330859e8b6170ba +978,f5e30b46f72507bf +979,dc380ec2807d985f +980,d13cff60964a0676 +981,74a3c2c8f12ac8bd +982,03e3f9c784d5b96d +983,6d42ab7877150a88 +984,aa56a8ef68d0601e +985,01c66f9f8bb304a7 +986,26c00500267708b2 +987,0d74c5cb2610f09c +988,f5baf117ae5a25cf +989,c1711498edf9383b +990,8cb62b8fe4c0f137 +991,133ff8390a265a4f +992,22bacb74ac427321 +993,493dcb8f16d8c21c +994,45a1ec1ba03c2ba6 +995,118949106e8b75ae +996,aa9d5784736dee18 +997,59c4219329ffaa1b +998,b41985d6e87ed7ba +999,d956e7176b3f723e +1000,69ad9e73a458d536 +1001,c54199122bb88482 +1002,465c4d6698381c65 +1003,89043be47cb6a8da +1004,cba8d3b7fd3b70df +1005,9a872c2488dd406f +1006,567f2092045f8532 +1007,f548a84d1a835798 +1008,2b5669052605d206 +1009,711445e46998c06b +1010,8745074093b0e40b +1011,a47de80b2902dbf2 +1012,d6f0d1f7e1baaf52 +1013,5b854909bacc399f +1014,47c7632298e2c026 +1015,6192c2c220ed3eaa +1016,80c759fda6ab2ab5 +1017,bf56267cca084fd7 +1018,29dfe3fa9c161e98 +1019,75d2f3b7727508b2 +1020,fcdfb595cc7347c1 +1021,004983e95ccd84a4 +1022,78b7f2daf8b868f2 +1023,5bf0a068c51763a2 +1024,eb2725d4dd982804 +1025,ec953d20675dba0e +1026,dcd2f653f4c2627a +1027,d1371c45ceccc056 +1028,64973ad169604797 +1029,f148f00cf0378e41 +1030,10d6c9998448c939 +1031,491180798dbecfc0 +1032,fec1b89011e12e5f +1033,1314ac860af3ef42 +1034,917438f549ee1207 +1035,c90985310e52af59 +1036,5ae8d2255d3b246f +1037,b3ad2115684fbd7b +1038,978d4cfe76be7cd8 +1039,a3f84524ff6d05b1 +1040,093ef4982ba5ce46 +1041,f1e61a296ecfee4e +1042,daa9c43fe9bb18bd +1043,cdfaf2b457caaf58 +1044,842ee1985d9a143f +1045,c24d1885ccb25513 +1046,b3b6a2665857fe98 +1047,bfa5d34eff4e8aaf +1048,421ee69350ad0e66 +1049,cba13ee26cb8baef +1050,5d21379a27176c42 +1051,e9563ebc86fc4ce6 +1052,c64e8cb8cc6dbaf1 +1053,38015596f50e96ba +1054,93158041aaf356c0 +1055,2abb6bcd6d04b03d +1056,7d3b30a2d4286075 +1057,4a70a7188ddb548b +1058,32595159743cbc62 +1059,c6135b4cba782404 +1060,756863714223e627 +1061,34f2f672e5b1cd22 +1062,b89f45455dba755a +1063,2f1baf27861b2092 +1064,da5a5bf56c7c8ec6 +1065,e5c4f0f00a297981 +1066,217c648709575596 +1067,eae82561cfd5b3dc +1068,6a6a901e1e675c44 +1069,42f1f8e1e2f547a7 +1070,3ec54081646a7a3b +1071,f98249dd41fd6f27 +1072,1eb4a1e131147508 +1073,cb95d7475051f119 +1074,ce12045ec15877dd +1075,7d28d03f60135c00 +1076,41c3429e134c2868 +1077,a4a1bd800e891be8 +1078,3efc6b427f20cb4b +1079,213a64befc03d892 +1080,7b2c111aebab4247 +1081,9c407350ea68d42d +1082,8f9161733c71b603 +1083,c9c3a4ec1d58c8b9 +1084,7c41e0102f040abd +1085,8edd6f9a1c66f889 +1086,e0e8bd1042114341 +1087,465622ab02ffe971 +1088,2d7fc1d626812d7e +1089,4b7a8d305813447c +1090,357e236ac0201d77 +1091,665b77dfb81eb54d +1092,46aea7a3f8f174de +1093,dbb1378b6b222fcb +1094,a2814bec1939b4ad +1095,2e639be996ddc934 +1096,8d243d55da9a99d0 +1097,b3ebaf5f798cacee +1098,209f7ec12d21e643 +1099,eabed7f42bc3f228 +1100,c25b2861b28ed09d +1101,91575db4e1ef9846 +1102,87a13bf63354fbf6 +1103,0f6887eb7a2b9e07 +1104,2afb19ddf2956f03 +1105,a925cd3f8ca4aabf +1106,298ada4f8bd1bb4e +1107,cb5d3959782ed36c +1108,2f56880f8b6f7bdd +1109,3b998fca528224f4 +1110,49d9c933e8ae5ece +1111,e54219a59cee6f98 +1112,409b5a98cfe9708e +1113,1e515620fd185314 +1114,694fd87eb202f05f +1115,d7ee2cfa105b630e +1116,916775e634f67ba7 +1117,adac30ff4216dcba +1118,aad82e76a38b690e +1119,22f487e10f4cc668 +1120,1bc34590ee432b2b +1121,93403ecde4c033e7 +1122,d0fbd82b98b076b1 +1123,3268081cdf51529f +1124,74d52fe48ce4b841 +1125,d1755bc9c1c3ae68 +1126,15245764a8d26d59 +1127,3cfe0f8e1baaca6c +1128,dd963995ab7b5d46 +1129,912655ae0d3fa04c +1130,de3347a4332b327a +1131,24f034ebe057f604 +1132,aafa307ba6369416 +1133,ab247467637cca71 +1134,4a23c8f07a79ada7 +1135,1188b8d9a5052227 +1136,59161e117ceffedf +1137,e136c4bca6f5b756 +1138,6c70bacf85fd4b1a +1139,85c9405dcde78454 +1140,ae83bc017029c250 +1141,e7e30d5741e7300f +1142,7acfde3f3c54cc71 +1143,281bd0069cff2872 +1144,15c2551ae39d1dad +1145,3eb48ce0d4fe759c +1146,99676fb3a8cbcbfc +1147,791f19ee00db53f6 +1148,6b20e5ce7c7dcb26 +1149,edec0f20639fd147 +1150,20aea11cf5689ced +1151,c6a9a7994047bce4 +1152,22694ad677b95f5c +1153,11e751325e612a98 +1154,d41c91901efbc0ba +1155,1129256953d64121 +1156,ecf0bb70e4be438c +1157,f7fb95db1954afb3 +1158,93f8d897897069c6 +1159,af1a8b87316e04ac +1160,b82e67f348ce8452 +1161,b78b207c3ba61c03 +1162,980db24b5a004d93 +1163,f081937046217589 +1164,0bcd2339b89af00e +1165,2598497bb39b4672 +1166,d558e4bdf7bfe654 +1167,ef2e99fcde0ba99f +1168,82b03a85bdbc4b3d +1169,e812ff149771f68a +1170,8eb93a18e744bbba +1171,b53269b4d0fe080b +1172,f1f2c5eb591e0b08 +1173,c76fcc2e2dea8b69 +1174,c70b0112cf8e0465 +1175,b14e0c2a9d121286 +1176,185e96bf1ef85019 +1177,8dae9cc81a81628c +1178,890be37c8969dd4e +1179,654a80cf05a694e8 +1180,c5ef250e57730d66 +1181,7673ef5eded1d722 +1182,37154ab9b7f16063 +1183,8d3b061f27aca563 +1184,813bda733ddaf6c0 +1185,056ef5b397ad6d00 +1186,3a3248bc5788dc33 +1187,82bf41aef70251f2 +1188,824819b2c1775148 +1189,045e862dab2ad111 +1190,b411e982f13df32d +1191,04f427cf6c7c53fe +1192,40870490a8221123 +1193,4b02afdc64fc5d6b +1194,2ebecbd38eaace08 +1195,389bebe721bf9d5e +1196,b8b501f2fdb582f7 +1197,75247c291336cc53 +1198,a80fe267170d1463 +1199,ed8ccd144a484ef7 +1200,7ff0b4dd8fa906dc +1201,1956183ed4e3d98d +1202,d01d8a69a1be6881 +1203,286f2561d0320683 +1204,5b2d2be6376e1e3d +1205,f08b112255a85c97 +1206,01d73ade906136b4 +1207,2bc8b80ca68cdf49 +1208,8b9cb3eb1ec20491 +1209,3fa11175072a323b +1210,e98cef2c61d09382 +1211,a555db79340adfe9 +1212,c2629bc9d9cebb21 +1213,5f85c741b85baf40 +1214,5b9b6c114b351c38 +1215,2419e6069c8ad62f +1216,3cced5939689f316 +1217,acda04e9351390f2 +1218,24c7b1b3c2e48297 +1219,4ca3a5fdeb37bab3 +1220,bb08f95b93732054 +1221,1f0e07059cb52389 +1222,21de9f96d4bbdab6 +1223,9be92b139bb80bd1 +1224,80968e364714d527 +1225,fade3bf15fb12506 +1226,7bf54d1ca2f31d40 +1227,22a573f676f07006 +1228,531cdd601d4018e8 +1229,0b5c1a30284bfd6d +1230,228cc2b235c5468b +1231,15cfe746422d2256 +1232,5931a365893bacfb +1233,6da3f3f312e821b2 +1234,c2c214b04969f8d5 +1235,30bf0ef780d0de4e +1236,a8fd5cec7a2fc0a6 +1237,b6be98b971ab2613 +1238,417297f0c0963578 +1239,0ea759a42a4beed3 +1240,c89f97195f1f8b74 +1241,ea28e5c01663ea50 +1242,c2ed8a94c30226b7 +1243,fceb3f168424b711 +1244,b71637f132be838a +1245,a9ba7674c36c2b0e +1246,5ce82cf1d141db5f +1247,1e8015668120599c +1248,3f7e24ec2e06f970 +1249,bbf13994f7fea1b8 +1250,a0d31ab600fe76e1 +1251,7eb7a474c810b31d +1252,a3a387c09c83d904 +1253,0e7d9b4639a2353a +1254,345ea601172957f4 +1255,219a9a2c5fa84fa8 +1256,7e26db3ddc95aace +1257,6455597a79907ad3 +1258,f801d12a2ef6596c +1259,e497c75dbc680c53 +1260,2bcf63dc57e62dbf +1261,cc505291e37f648c +1262,1b86a36fc3a044a0 +1263,8ac232c288b182e7 +1264,666aa425a9a4e2ab +1265,d03766c6670ec14b +1266,4d3425f717d7de9e +1267,9e176ee2949a6a83 +1268,551fb3d8a143ca1d +1269,a267c0f7f0e59c74 +1270,fef222391903ae93 +1271,be199c26638efcb8 +1272,b7e8078436492926 +1273,97c779b4edfd9133 +1274,2124536f869fdbd1 +1275,316718df0355d3cc +1276,b928bb7dbea90bed +1277,42a2366b2bbd3d6d +1278,2cf017f54533f090 +1279,1717b64369a5a662 +1280,adcb1d0404a38272 +1281,fa19888e18d3cf04 +1282,1eb06b2eecdb444c +1283,4455653af3812345 +1284,b8df1915c38a0d9d +1285,29faaa28c3e1132a +1286,e437b59e795d90b3 +1287,b9affd4e26f67a45 +1288,304645732cee77c3 +1289,e74faf1c45affe65 +1290,b415fc192744b59c +1291,2e53032a8ebc6852 +1292,f3412b0c2b3ff22b +1293,5b1d7c1640989d96 +1294,052aa4458342bfbd +1295,1719acc3d4d590e1 +1296,f197ca4c1db0c064 +1297,55f685b11efdaa1b +1298,d2b5fc5f7e5916a3 +1299,65c8db57d818dadf +1300,18cb062af9c77d16 +1301,0dcec29427bcdd25 +1302,9c4f7018e842a555 +1303,43c36dc8e19a0bbf +1304,3be941a9603a9596 +1305,378fc44b4c9355ed +1306,8325558a9602c503 +1307,11d246a2800b0c7d +1308,b10ca63bf3030a16 +1309,3f8bd787f6762fa9 +1310,eac31f8cd998a181 +1311,0d2cd95277b8f7ec +1312,8970aff340d785bb +1313,2d7478e9426c7ec7 +1314,0f73dfda02f29fcf +1315,cdb9c2ab16595dbf +1316,b5d830dc0c66dc44 +1317,6e52a484552fcb73 +1318,fab3e32716ae3505 +1319,437497b583f07fcd +1320,e5c5a90ab024aeed +1321,bb7b674f2208d197 +1322,3fd2a87cd1faa48a +1323,ec748ecef4404226 +1324,f9c5e1e73c1426ee +1325,a99f5469febc344f +1326,8f3e1a0151fa2fd0 +1327,7c58eb143884f150 +1328,d9253dde85cec9e4 +1329,8c8002d565eac149 +1330,7efb1e90ccdb8dcb +1331,3cf4fbec4f132eab +1332,f5fb4bbd0355c1e4 +1333,4630f3f79fed064b +1334,03c8031d262c786c +1335,cdf5b0025a17b852 +1336,9d08cdbeba67dc2d +1337,fed9e8c8f6bbd205 +1338,c9120e04aa8cc1cb +1339,dd110b069b724dff +1340,10c83070ac3bc7cd +1341,f54af268cd9b9599 +1342,2ec0b256f0187398 +1343,26fe86c4190b0090 +1344,b90ee96afcfd7c17 +1345,abfeb268f8157bd2 +1346,686399241f72d558 +1347,91cf4499ea908837 +1348,330498742ae0ca53 +1349,4f3791ad7a540f2a +1350,8be864733334413e +1351,1ac002bec0f02486 +1352,ac1da6d8a64f0f18 +1353,b2fe2e066fd4b5de +1354,403395d7c6d22c08 +1355,3697df3207473be5 +1356,e35a1cd0ad2ddd6b +1357,faf55465fe5c26cc +1358,4a1f79c6700a290d +1359,fdcdb8cb735d28bd +1360,2aaaaeb7a0280344 +1361,8e77aaebf0b14ddf +1362,7de4460fcf8e9cbd +1363,82dfab661f97d6f9 +1364,d89fc20c5e38fe3d +1365,410dfbb1b64b1d4d +1366,99a4991d68cfc587 +1367,72c4e2bd8d772702 +1368,7a6cbd9b64075d53 +1369,25f38645b4120c88 +1370,f84a02e6f5ca49b3 +1371,22be54b7b12edf32 +1372,0086f91ecc5a1b03 +1373,e1ba3bf223ce9bd7 +1374,e83e26ea7d1edc67 +1375,b4566d855eea62c9 +1376,bf3be64c1adceffe +1377,d5b8d8ad399f1ea5 +1378,281f2b251dde63d9 +1379,a7690d99300f95e4 +1380,730832a5d0888ccb +1381,ff7e28f1848f23eb +1382,d86b893b02bba37d +1383,dded580433f619e6 +1384,5a34a0ac6c3a6dd5 +1385,36d6a3f4818e6177 +1386,1e09ed7ac5daa68b +1387,776df19250a45625 +1388,c2e4477f7da5e101 +1389,413fc0ea56e5f76a +1390,24a8127fc2c8c041 +1391,296244259bc35cd3 +1392,b32ef8d1ff015dbf +1393,0d1ee4a7f1720b0f +1394,8072730c59f5a410 +1395,243335de87b05d75 +1396,a765b21d955b1404 +1397,d80444d5c8d9a35d +1398,d4f5e286d7edc630 +1399,3e2c5cb45267d46a +1400,0ab5e6c1730773c1 +1401,dccda5405f2ccc54 +1402,c44127e34d393b05 +1403,00ecbed8841098f7 +1404,e204852d99d495dd +1405,b320162f8e15450e +1406,77ac5a8e8dfc1191 +1407,9544832e98808980 +1408,d24be988cea832a5 +1409,b72ecdcb0fc8dbe1 +1410,cc57a47a64042e2e +1411,dd5c3c946d4aeb42 +1412,4562c0c5af8fb849 +1413,6863955eb04243c8 +1414,40d961a8c9403568 +1415,caed7dc64055efe8 +1416,f5e3e356686a8391 +1417,c167b68d787f81cc +1418,dd9e48292ee1b183 +1419,1e7096a8fc9c759e +1420,8d42225c923ab12e +1421,94c633973a0acb5e +1422,9e0a2ceea15d092a +1423,40698e11b213051c +1424,82d0c367325b5a6c +1425,0954df12b83be4ab +1426,0ee5975dc8d00dda +1427,0a7328c3ba3b65af +1428,fa55fc6c982cd8eb +1429,8a9c24ccf6f38793 +1430,fe0bde84841c58b2 +1431,81c88802ae3e5dae +1432,39bbf873296142cd +1433,1f6df701cafadc70 +1434,1442005a92dc4903 +1435,30ba156439d05067 +1436,f7be33650c90352f +1437,adf1e0481e8e9720 +1438,8dccad065318e759 +1439,beda12beed912cb0 +1440,3579b130df5eb3f9 +1441,b35656944c94e336 +1442,dd52e1a16497e7a1 +1443,d67498d1bc8276a8 +1444,7087d93df781ae0e +1445,5655f8ed056049d2 +1446,e998740f32231ef4 +1447,fe4ddb0c3387e152 +1448,271c40fe76866120 +1449,2afca3345de83de0 +1450,e51a1e571472a198 +1451,57a188791d122587 +1452,557f52a4d07c874d +1453,f3806f0752a3d67a +1454,c918eced92333764 +1455,1307a82a522c754d +1456,94de2bd8b789ebc9 +1457,d21b6bb68bf1e283 +1458,e3a6cae00b5fc2f2 +1459,beb23afc3c616f0e +1460,49e3ad41546c5573 +1461,006926cdfacd8a64 +1462,8615007e8e53e4e9 +1463,91a2d01e5bb2f723 +1464,b43d2c6cd62bf023 +1465,5448172447e599f1 +1466,86b1d6db721aee6a +1467,4ec5ad4de3dcf9d3 +1468,4bd42c311d7d0418 +1469,7efa3f573d12e27f +1470,6a399b76a854742e +1471,cf36292b77c3ad73 +1472,2543bb164f10330d +1473,1857b52734084975 +1474,8b0d6c6b6b16a621 +1475,7afbafe6109ae1f8 +1476,0be6e08a14984ae4 +1477,efbb075c57feec13 +1478,c443ef998f573402 +1479,933954c2aa6ef72e +1480,a23197f5a5b45e6d +1481,ba0ad6aaf54902d6 +1482,60f5157724f176d9 +1483,a10b903f253a9ff4 +1484,577ad56033637178 +1485,77f13b2cbdfc6984 +1486,a311b4278bc27e22 +1487,4ec246f086d9a286 +1488,1775d899101e0144 +1489,6f807c1099006c4e +1490,551a5da578a6ccf3 +1491,e4494efb9fdb2898 +1492,5cd67f3a910e64e0 +1493,383ca99e69b02521 +1494,b72462149df7fa4d +1495,a2ffd28515feae2c +1496,9a88fc4d0ed167b4 +1497,1ef6a03da71166a1 +1498,fce6f749f8faffea +1499,d7fe7154a056797f +1500,20365393c3e2e0a2 +1501,cff54527b0b282c1 +1502,6f734a2ef8b441cc +1503,ca8c69d89fc82a98 +1504,ea3c38abb33fa9af +1505,4fca864280fd60d6 +1506,5ef1895cbce3a46b +1507,2493c703761039fd +1508,87cdb88dbd1eab82 +1509,2ad489edacd228bb +1510,ae6fa38bd4a5eb0b +1511,50510f771930e7b0 +1512,ec7508c43104b91a +1513,0a7e48b175411db4 +1514,5ef32539746fd592 +1515,f979f3477d14fbe3 +1516,17642df456020458 +1517,cf945bb783f84f5a +1518,fa9b99b12ace9ba6 +1519,0ea0b549dcf1d8ec +1520,79c62fbd839d5af8 +1521,720e5791a3da48b9 +1522,e9f6cd0f815f314a +1523,13a0292750d45d15 +1524,40bcd0a5c6dec084 +1525,eeaa16412d20ffb0 +1526,ef4f3576502cfb15 +1527,f858064ac390e42e +1528,58cf7ef820f1317d +1529,160ad0605d11bb81 +1530,b5a08d2471d81ad2 +1531,14b5b1fd476192b4 +1532,b99aeb2ae78af144 +1533,32ccbf51651d5fb4 +1534,a88455764ff00f4b +1535,6ebb6fdd3b67f3ce +1536,c4bd9bbdfdf78bd1 +1537,052d1fea52213eaa +1538,0b8f7894dfca4bd2 +1539,f98bfec1d22560c7 +1540,a849d6729e7f2dee +1541,4ba6f4e7311b6e4e +1542,d1829cdc595f79bb +1543,66d0cf9b82e94f2e +1544,c070117c601cd4a2 +1545,2d3ecad80920049b +1546,626bdaf981118338 +1547,9663405a87013872 +1548,d9cb0ab638c77ee3 +1549,732c6be41ff2114b +1550,612b6fa7b42b7616 +1551,afe9cfaa54ef57bf +1552,924de42bb71f9161 +1553,5f1045813cf223a9 +1554,32aeb2598a30e473 +1555,fca027f60ee93591 +1556,7902559e6afd864a +1557,801a361b7dcb6fd7 +1558,c1f6afaca6185e7a +1559,938e9e96c8be5f0e +1560,105c170fc429d296 +1561,07a880b7e882c118 +1562,19412a2fcd9cfe74 +1563,8c51f51a5b23d38b +1564,8778ee8f86395c31 +1565,fa25b36590560bf0 +1566,6fb5c7ce70450e59 +1567,f8d78b92b81b9d51 +1568,9164721b41797bdf +1569,e972f6647c3e5266 +1570,8f6cffd5c4cf0ab0 +1571,8d3e19cd63f1b45e +1572,d6a2c516fc7b344c +1573,9a7ea4ea588a7692 +1574,d46e742299c83dc8 +1575,9554c1ec15c7455e +1576,1100b48093d381de +1577,b4549658b44c51e2 +1578,ff9c5cdbb3a4d8ae +1579,2557773232a970b0 +1580,c03bab3b1ede682e +1581,f85cc8cf714aa1d4 +1582,71310cf1249dbc18 +1583,07c4836324176a5d +1584,9a7cc6220d024efe +1585,f052d85d98201acf +1586,3a9174b315c90706 +1587,e5c9210b8513aace +1588,dac7f2e788d4d088 +1589,32d12b0d1bc6d513 +1590,096442d347e2c3de +1591,86edd8a9ec6ad96a +1592,a4a7287ae326fffe +1593,00f0ef103b19740c +1594,ad95f46b30aa1a7a +1595,4d6d4b43c630ff77 +1596,4805e0ef5870e88e +1597,637902f3798b3933 +1598,daf5423a810364ce +1599,075e9c97481c7f93 +1600,fe3aba795b24c839 +1601,4014202553dc7bce +1602,82a97fd20f7cae9b +1603,3a15193e8ec1cb89 +1604,aa3c457b089f3c83 +1605,c9d89b79ef4cd716 +1606,049300ce570eb892 +1607,aa86bd9001d89d58 +1608,4f58c6fd5f7f9cac +1609,8b5c9e0fb1896878 +1610,8e52e0500d73dd15 +1611,fdd546173b1c3f4d +1612,8b43f14844754c7c +1613,15306e3ef29d0846 +1614,2529d2ea82d1de08 +1615,f9c3f1d3a51dcf28 +1616,0407e5b89861a0c2 +1617,52e92aa491f36a22 +1618,92075cab5fb89c5e +1619,31e7788bdcd9a436 +1620,f41ca81d06f629c2 +1621,cbaa34b5b84505ee +1622,3a581ec4181569b9 +1623,665a777dc8e31db1 +1624,b8eaa8dbf02e9819 +1625,b7b001e449ad8792 +1626,752f96d58be41d7f +1627,e434b68916d73ccd +1628,db9518a19c912d1d +1629,694d4e1212f1cbaf +1630,3125339829998be0 +1631,4e9470e9d8737184 +1632,e4abab05aafd09a2 +1633,845684b8e068318b +1634,c4455dc0ec417830 +1635,1b90d6212feb9fb6 +1636,c66179971bc75b9c +1637,275e9d3242974107 +1638,f06bfa77fabfa0fb +1639,4a7e9d1e2c2a6bff +1640,d16686c16228693e +1641,2c96b5c0ecbd7d6e +1642,91d20c8ec7de92df +1643,0340723a26829eb7 +1644,6fcf5be09e73ee6a +1645,efb81e92238e53ec +1646,fe72dae20003da41 +1647,237c99ab32ec289d +1648,aae3da3f6cec4488 +1649,39ba30ab3b8e40ed +1650,c09ab7bbaad6a48c +1651,5fd58fa4c25b87ea +1652,eb4aa4040576d085 +1653,a5be4a18fd54d2a9 +1654,51ac65cc61e4265c +1655,078b586d11190df1 +1656,bbd227db7741e45b +1657,1501452c86bf290c +1658,d769a387c727946e +1659,9e6c71a3714084f0 +1660,a342776e93ab6530 +1661,3be00a44bfcedbaa +1662,8ce86761e072a5fe +1663,62377b80691d272e +1664,0489e50e3f8d0cc9 +1665,3ab716788766662c +1666,58dfb3baf5905925 +1667,f2b5ce2eec441595 +1668,8ebf87aefc3d768b +1669,ef25290f2ffd3755 +1670,be1fabde24cfef04 +1671,b453053dcf3cc3ea +1672,54e0e20786082c1c +1673,8a3fe395feefae6c +1674,345031f4716ce323 +1675,1a46f6aca7db46ef +1676,aa11808d9e91e6fa +1677,3c7bfc9a8f47b958 +1678,09f0f0dd703bb488 +1679,868be13d608b5e99 +1680,af908b71ab2cfb97 +1681,256141aec9d3dded +1682,8af28e37de8d4a44 +1683,5c4a1a77fd17085e +1684,94badd70afe8df2e +1685,9551ac0c15a8c370 +1686,330df6a28717128b +1687,0b159d90e6da91fe +1688,4fac344b07308352 +1689,3a68f399a973eec4 +1690,357a2e58f296cbce +1691,b08382a087d1bf76 +1692,b396713ab65c7c0b +1693,dbc66124eec61ee8 +1694,b0e708d2b45b121b +1695,67e36557033205c6 +1696,0e59282270437da2 +1697,e05728fccea150cd +1698,c205b5abeeba46ff +1699,6ebfa309a8111cf1 +1700,451c03c0884abab0 +1701,526ba1322c9e46ea +1702,01b66373d32a9ea5 +1703,fddfcf02df995b37 +1704,f09431473762a18b +1705,fd4c2a3bdfabb018 +1706,453fe8f262aa0bf1 +1707,b91ef71ffcb5495c +1708,26f86ee81af75239 +1709,caaf547dd2ed3a6b +1710,379075d9d31deba2 +1711,9c4e55abd7292535 +1712,23ab2a4b453ec526 +1713,69b7144ce0a3938e +1714,41e6bf91e7d53a4c +1715,3a3c1d4dad9b99bc +1716,7bf72165703c5567 +1717,2e01e1ab01b4e406 +1718,02fc0c686125c0a2 +1719,bc36a02337a1eaa4 +1720,7242ff577ccbc0f3 +1721,632d5ca92efb01e7 +1722,360dcc1403fdea7c +1723,fbac28440430603b +1724,6258d95a82711a1b +1725,50bc74a685f97150 +1726,445bcd288cf826ff +1727,7ef0a7f5ae57612d +1728,6442778b61f619c6 +1729,eab6576a47ee7783 +1730,c50ff22d8b8f1cce +1731,0cd2582503d3a475 +1732,0eafc045f2d5a55e +1733,bc469e346041c8cd +1734,9f476ca5a1d56c02 +1735,ed4b50c6ba9e6b8a +1736,c1281e315f9a5db0 +1737,63e7ee2a9773ee8d +1738,4b89ac7373ab175a +1739,754a7739e292691f +1740,36d04e1508edc813 +1741,d86c7114f3e49d76 +1742,3d748e9732ca8eed +1743,c365f13da6387461 +1744,f20bda14879d031d +1745,16338358d1542d05 +1746,95dadd5c507a7c78 +1747,69c4274f733ff6c4 +1748,09f0b96bb0b3a386 +1749,46abf65893c64bcb +1750,b4026e7347d4ec8c +1751,6c8068af4f468780 +1752,0a685a48740ab8c2 +1753,517bfe890784e73e +1754,8d9915155745aea5 +1755,6884b87b242ea7e0 +1756,892ccf234ab98bdb +1757,5a154c27e176a385 +1758,d731996145768c02 +1759,1e490b0cbf027604 +1760,27e03c781b277b5d +1761,c894410ae2d69c81 +1762,d79a37afdc36020e +1763,ba4bc887ec15612a +1764,058b7a899c5e70ca +1765,215535271db13281 +1766,fb86e2b9d0e793ad +1767,b570dd4fa6505a73 +1768,8bd6bfb328d8c03a +1769,030d3d24346bdb68 +1770,32994cf5ac0a640d +1771,b884b53205a45544 +1772,c5179157bd8813b7 +1773,5f4e75bbd141bea1 +1774,d6dfc75bdfe028a4 +1775,b537721dd3cb4cd4 +1776,c57ebee372992786 +1777,6f13bb359633bf12 +1778,e46da0ed36428fd5 +1779,4b3b83f6ee1b1faa +1780,6b6a823e8306ce4e +1781,2c05edbd7aa5f3db +1782,b327a8a002017857 +1783,8504cee56cda7ae3 +1784,fdb23487c67f2615 +1785,5196e6b7b7556352 +1786,a0b19525884bf2df +1787,731d85a6b91e4473 +1788,2493dc5737fa8000 +1789,b46b614dac586a8b +1790,be9f054a2684b4ea +1791,c518a2030ee91f21 +1792,745492e5e36a357f +1793,263a4aec62feb0ce +1794,498506ef09e28fc3 +1795,a9f6ae92cb2da44b +1796,8039345270ed801f +1797,19af793bc3157fa7 +1798,4bf5311937f6412f +1799,a1a99a7ef8872cb6 +1800,677f0f3b393d87db +1801,bf9a9a368abda086 +1802,add99ad30a08c412 +1803,be9f263ca116f21a +1804,4db7db5b447d11f7 +1805,52c18f5ccec5098e +1806,be46463b952a7139 +1807,a0cb3d182aee5ea3 +1808,6b3be0ed352cb953 +1809,08de0f0f9c8ec83f +1810,553d730692265ecf +1811,2910cd083a383f89 +1812,cfcb4118cb4c1161 +1813,2fd2fd698a7160c4 +1814,d2fad32963388036 +1815,99d1029da3873856 +1816,67991d74cea895fd +1817,9de4a7563c6e21dd +1818,1c2da7521e735927 +1819,f6c6527977c31878 +1820,c77b629099d444f2 +1821,793365f14cd29c76 +1822,4f3df26953a1900b +1823,7489bfef48778704 +1824,e0818ffbf22af865 +1825,8b178944a6fde039 +1826,1240231b58591b0f +1827,33b3f5157f4989fb +1828,6649769e14616c5b +1829,c97df3af4941dbd3 +1830,19a99cd2122835e2 +1831,93f45c412759c791 +1832,ca63d71461bedf26 +1833,a96254741f23f97f +1834,64b0a5d15459b568 +1835,ff5d43a04f1d5e32 +1836,63092393caf3d425 +1837,1c3eb3b5e5df49f8 +1838,924f81bea39611fa +1839,5910dcc876b6b6b2 +1840,20c9013fd03d5cda +1841,d1926bb617a8e4c7 +1842,6a1d4b71d96413ef +1843,1f0b7cc846a11b4a +1844,679e4090cd6d17b7 +1845,e10f898d0186216a +1846,ed077d4f9325ed37 +1847,24c1e07246bfd70c +1848,5d2487fc5264c47b +1849,4cf92ee4408e2557 +1850,5370c298cc89343a +1851,df6e2831f8d4afab +1852,170a3e17c9588144 +1853,37ca986d685626a4 +1854,267deb7f6e812a8b +1855,bc96a65d9f9315a5 +1856,206f80b69f5b71f1 +1857,7b29e859d2c12138 +1858,9f92ae977139b2be +1859,1cf3aa1306220a5b +1860,ac3ba0012e67e85c +1861,6ee47f057743874a +1862,0d2a6ae7a73ce85b +1863,7cee0f0565bc1825 +1864,60825f33cd15d632 +1865,7e454fe1cecd7a44 +1866,4eade431edda8fbe +1867,5145c2667c10ad86 +1868,3b64c5ef2556739c +1869,6cd693328e316b21 +1870,f51115b53fef7cbd +1871,455c53008f1f0aac +1872,8ee3bbc98f628804 +1873,d0903e3be08295c7 +1874,6d10b7f133a608e3 +1875,004e4b8fa08c216b +1876,f08b72c5832d7cf3 +1877,28100e997b726199 +1878,7f2c45951fac4da5 +1879,b4065300cfecfe92 +1880,5754610bd337b5e3 +1881,74831ac013e3f58a +1882,52818aac2b61e4cb +1883,2768540c627756b2 +1884,f344c4301ebe175d +1885,24ad2daf8d89d6ab +1886,71931f5dd34c1cc9 +1887,a87ba5945aa9efc0 +1888,d0cc1444af098227 +1889,dbcb6bf9e60d2927 +1890,0fc3c11b45847a5f +1891,a769c6f291b2d8ef +1892,c44205272c2090cf +1893,bd9e6c10ea61e723 +1894,02fa6bb324de173b +1895,545c313ccfd55ca4 +1896,cfa5d1785191575a +1897,cabb08fa780c5b0c +1898,a4e922676d3c077e +1899,69af2ac3d4cdbde7 +1900,9193b6fc394615ae +1901,769c9d408d61f35e +1902,86de8886e6d5d3eb +1903,a23d8eff0ed28b62 +1904,8307f6e6746a9859 +1905,e568e634ad7599d9 +1906,03145d8eaf55208d +1907,828980f224cf6774 +1908,5ae141dc142b2d63 +1909,79a82899d6b70975 +1910,68126c3ac949eec6 +1911,d65d58a5ef5337ad +1912,1b1ef79898d448eb +1913,2df0d5abf3daa39e +1914,fd368ca5e35a53ee +1915,93f09c883779f3c2 +1916,0fc9868b27f0922b +1917,9634b4656ac587b0 +1918,7344b92c16c1ea03 +1919,0472cb98a10b400e +1920,8c9fbc26b67603a3 +1921,d48eb5000ec2cd11 +1922,b40a23a72507d85b +1923,1625c618b103b6cc +1924,b585d3e0e779978a +1925,17f35616782c4981 +1926,e9073c573ce33bc8 +1927,024b866da9691d80 +1928,1e7edb9872356a06 +1929,621db4f39ae70e26 +1930,5cfe8309c4341b22 +1931,c23164a817b8416e +1932,1e6194cb467e3950 +1933,299eeb1e1c4d189f +1934,5f6701ed9cd8dc75 +1935,4ea55be49253442b +1936,8d097a8e67ef96ee +1937,9a553b033a168bd7 +1938,a4f95e51efc5efd0 +1939,a422013be415fb00 +1940,280efb4de1ad3985 +1941,bb40e9603bbedb9c +1942,b6e1b49018a717fe +1943,3e6e0596f14888ef +1944,7982ae4c20786552 +1945,f37977a8e41260bd +1946,fe126f5264a3783a +1947,c2d754671b33a80e +1948,a399de37bd0f5a2c +1949,cf6c23d67f338123 +1950,46a61e1918b4b884 +1951,322b77c4bc0380ea +1952,bd83c05f87828a8f +1953,b8897d9b56e32dd2 +1954,3d9c4bd298b38e47 +1955,5a04506f06d18683 +1956,66a3eae3060f06a5 +1957,4fc9c8925e47d406 +1958,c0f6c93e6edb4c05 +1959,c49e2dc3ed2f51ae +1960,a0795d9176fc874a +1961,73d77682d5a07f9e +1962,cceacfa21e862f63 +1963,508d64a7f1401aa7 +1964,23801ecac0d95a4f +1965,99521aefe7272a1b +1966,1921b6b32bd0964a +1967,35834a6dfdaf3d4b +1968,2fa1cedcebad6b4e +1969,2e22d427a41ce18d +1970,73d265f4d8cb40ee +1971,12cb2c307a56df0d +1972,dc759cad22db18bf +1973,753adbb24faee12b +1974,5a7496eddc6c79f8 +1975,6e929e0d01e2b7a3 +1976,67d44448f2ada783 +1977,9a82c2219fa985fc +1978,a6857e8ea527a38e +1979,a87795d0753d1b3a +1980,53b3254e0d322005 +1981,4a1b01ff6bbf90cb +1982,c5df8450c785dd8c +1983,793427dc44b829b3 +1984,e398926414795591 +1985,247563f3b55886b6 +1986,92f2f831976d1391 +1987,c1cc309a97192089 +1988,3c32970e1c277edd +1989,495c4ea9cd1acf5c +1990,bdf56d901faca585 +1991,ece2943efe12d1ae +1992,67b605dc44ca7580 +1993,5e3267bc35eafdf8 +1994,f8d29316458c5fe0 +1995,5ec02d36d7308923 +1996,1ca42aef21cb5cb0 +1997,a0aad63a67c14d74 +1998,b12e9d66ef9bc4be +1999,2009a9ab31fc4a11 +2000,ffce49a94589c4ef +2001,c2c1d7c37c8c1770 +2002,dd94c0fe90335f81 +2003,53ed0eb8617705bf +2004,c6eb7b1de4ee1c71 +2005,8780a442e731dfea +2006,f1efec0f46eda4bb +2007,287cb462fe3e3323 +2008,026641d0bb66ba14 +2009,4c0e0df39af36f25 +2010,3213e2334f116da3 +2011,5f795ef801e9e691 +2012,ccc7dcc3970991ac +2013,6f9f7b329d835cc1 +2014,7b2f8c44d23b4fd2 +2015,b9d8a866edf08568 +2016,d56dfb1e572002d8 +2017,6b234b3cd32081d1 +2018,5372fa0312ce6920 +2019,63f97aaa1041cc73 +2020,59185336d7faefa0 +2021,8e89ab85f6f84372 +2022,28a0a232dbc203c1 +2023,54cf9b886469fde6 +2024,8d8ce887f008e2c8 +2025,3b7c482258df0782 +2026,49c6294ae2cfd961 +2027,7ec1947aa78c7717 +2028,e950018446e362c7 +2029,b54997bb116bfd0f +2030,37dac7381057ad10 +2031,3911b6d2c1dd8462 +2032,83d638c677cf35b2 +2033,19260d9ba91aed8a +2034,600c25112f9a87b1 +2035,0b68d34e4d95a620 +2036,8ceeab50acded3c7 +2037,71e9c80a5169ba33 +2038,aa7be51b0aed37b0 +2039,81c2b199c93cadd1 +2040,239540dc51850c34 +2041,ed08b725726b12b4 +2042,1c2c4ded301ddad7 +2043,95bb5531177a5c8f +2044,64545be17221c1fa +2045,99b2b8cecc1c6cdf +2046,cab01827de31b307 +2047,7933e41316c6ba8b +2048,0d766ba50fa43669 +2049,a57caa3ab354c129 +2050,0ba5ee790c5248f3 +2051,7b10b1a3005ee9b6 +2052,bc781c1b9367fc92 +2053,6b089cf386e3d582 +2054,94e41b952a7e6228 +2055,da6ee8a5fad0d9c3 +2056,5251c0f140ec8242 +2057,3227847554a0872d +2058,bea60230035f0198 +2059,1ee4370692b794f1 +2060,8ffd492d2b0310cf +2061,78ed9770767094c0 +2062,968685d490639068 +2063,1d0eb9cc8e2212d9 +2064,47d50395c754d5b0 +2065,c67f19e469aa6e6e +2066,1946a5e8599d1c1c +2067,9b778472954d0f3e +2068,2baf2cf5f9a20192 +2069,f643b59d098c513e +2070,05858538a8c8cc31 +2071,77c83d79f1bcbeea +2072,389e296a6490493b +2073,778bd25b60b06b4a +2074,f54692f5d66fddea +2075,391c06f683637cd8 +2076,00f6724801e14315 +2077,b87283bc03058edd +2078,eb0d566aa2fffe76 +2079,456be3de19e3f1eb +2080,abb6e76a637b9e68 +2081,cbc2519d4e5d71da +2082,9b83f4cabd851807 +2083,13b5f283f97f60fd +2084,b5e1aaf4f00561c3 +2085,580ac26a51c579d9 +2086,9d3a8c401a19ac68 +2087,8123caf64fb3c567 +2088,73e0fc6cfbb9c68b +2089,18f0ceeafc5e9cb3 +2090,105891cd9506d53c +2091,84dacb470ac860da +2092,2c342b58c3049144 +2093,d7efd4a9b288ddd4 +2094,f28fb0fbd71aadf4 +2095,6baea16d910b2ef5 +2096,59f85f3e7de84784 +2097,6d837f6c9e485236 +2098,19463f0cdeff7edd +2099,f45e0b5036ae36c3 +2100,b1e86913a6a9e45b +2101,3f72a48e545a23dc +2102,d4464b0237277011 +2103,980f7c4e2fd73817 +2104,7320355173753fed +2105,4bccdda034f581ee +2106,879b8e45fef81ed3 +2107,7946e253790c213a +2108,6f365717267ddf49 +2109,04c9e54e1e5798cf +2110,bb6525ec73322313 +2111,2bea701f5be8efb6 +2112,319280b6cf12129d +2113,4c1ce89625e7e2ec +2114,3e4c6c9afe4990aa +2115,72f10ada08220a92 +2116,6772e2709d8f4bda +2117,d00c3ae55ecab468 +2118,b08698ffbbe24e44 +2119,56c0cc91861db56d +2120,ceb5db6fd7feaf86 +2121,e9821b6ec77749f7 +2122,9881ce2848e6b917 +2123,0d48be387e11cde8 +2124,9386ce5f6ed33ed8 +2125,8af4f6c14b040990 +2126,b1be3579f0148eb6 +2127,373edb0cf1f0e16b +2128,176f2a23f41004ee +2129,4fa933323987937d +2130,31fe3a06f8f9a9d8 +2131,84690dfb94da845c +2132,bbf2f7eebbc52910 +2133,f3263ea776f3333d +2134,2dd4442bc68c6137 +2135,a8c3a1537b811653 +2136,59086d5f7d9efc66 +2137,d57788446ce3aa90 +2138,f8aa6584b4bb001f +2139,b5e7b974e0b220c3 +2140,b98d44d92919b494 +2141,aa5116ef6f750d72 +2142,1af84b284836a9bc +2143,aa8d423057268524 +2144,e31696c84c63892f +2145,57ec157425eb47a6 +2146,f138b81707f93ee4 +2147,d7545fd8b67da1ee +2148,27beb01c60d6d8fc +2149,169484eedc6f7b8f +2150,33eb6240aa41f85b +2151,ef5bf1d3485d59c3 +2152,b8855c2e2f719315 +2153,d9a6d61cf9cbad96 +2154,b61300c1c2ca8c8a +2155,e73318a7a8806afa +2156,82dff3a428fb2a98 +2157,9006dc48f13fe1d8 +2158,0f160701dd2e4a13 +2159,d7a331a33ee18988 +2160,5f14381c043669d3 +2161,ca6e862b353aa4bf +2162,55f56dfa8c53734a +2163,b1e1819c5ae39fb9 +2164,e218ec2e68c64ca4 +2165,541ad101045d42b4 +2166,c3c25b1b99e95942 +2167,f7dcf488ac6b8115 +2168,92c7582c09a6b0ea +2169,d2c629c2fa2cdb5f +2170,faab09ba9f0d837e +2171,a7452cfbac2c4686 +2172,30363278c8ebf5c2 +2173,7543b809041a63ca +2174,726ec21d9f66da14 +2175,9e2edf44ed9bcb6a +2176,c38480c5234cd496 +2177,9512924db93592d9 +2178,89c9fb6556cbdcae +2179,a82702ba438f5d81 +2180,a90108983eae0ab1 +2181,494d727b8d22978a +2182,d5d2cb6e19dffcd4 +2183,4ad8f94623786136 +2184,951e985d7ab6b15f +2185,c33c4cd3b15af703 +2186,f645644e177fa0c6 +2187,98a58dc4a40ad40b +2188,8ce69606d818e0b0 +2189,bd6a1e4449525416 +2190,ed79986f92954720 +2191,b000e20401bd982d +2192,f54d4f006b2ea765 +2193,bebc85e0c6ebf6f2 +2194,8e61651331cda41b +2195,f15091903ced4b98 +2196,30ca7e132aa9baf8 +2197,f03a00eab6ff329b +2198,e45e8a19bcb3d895 +2199,ac6233166dbb8ac1 +2200,bea5116d80fec35c +2201,fd8528881e8ce6a6 +2202,3dc9da9b70f2f7d0 +2203,9d46f32c0f7a6799 +2204,66c649aa60ac7b7c +2205,b0b43c666ef21767 +2206,0d004b5dd60d91f7 +2207,1ad1b67def78b137 +2208,2650586de6a53271 +2209,94c2d06b76d98799 +2210,944050e53af8350a +2211,f54bb8e1784142f5 +2212,8968f369fc7b3d67 +2213,0870682f5a848163 +2214,a7c9239c10035902 +2215,9744e2c878e4a934 +2216,a0c0828f865b3477 +2217,5b00e6a0a0d52aff +2218,7cf40a210c431085 +2219,58de38d75bc7554f +2220,19d1fd85166cd0f2 +2221,8c455d8035c5826c +2222,632e1eedcd7bc8d9 +2223,ef4800cae192f02c +2224,49308a6a381f133f +2225,18405d9014b3d817 +2226,f83f74430313c307 +2227,b54878c71899373d +2228,e0d0cf7e05b951a9 +2229,ba3e345f61d199af +2230,d50bb19502a851e7 +2231,75761a9cbfecbef3 +2232,47af6d0ba7af3952 +2233,b61f5c854b595be6 +2234,5c3ca9a555279fe0 +2235,fac628d126f111db +2236,c3310d37372d5dca +2237,4cce4e58be4b992c +2238,623823f9b3979110 +2239,a240992c385ebc55 +2240,920086df5c31a8ed +2241,0725b89d9910d72f +2242,355480b929200e1d +2243,4aff27988cd108e6 +2244,2fd471ea1dc2a442 +2245,a5ca4d5077ff8250 +2246,316d51a0301e924a +2247,05dd1d387cc1cf30 +2248,0535d53840ed55c0 +2249,0d15519118996218 +2250,fcb207fc508b571b +2251,71376298f11d0d91 +2252,467711983b12d3ab +2253,ce3e78010593f036 +2254,6fbc999de05dfa40 +2255,845016d1acecac3a +2256,f32bce744b2acc1b +2257,f329255ff661013d +2258,283650a1c08797ec +2259,284139bd0934aeed +2260,36e9077991f4364b +2261,ad14def0be828c87 +2262,b054d1888cc405fd +2263,e962add395620caa +2264,29579c8a7d29d792 +2265,e3d47a0529fc259f +2266,29d0f6620bf4809c +2267,55396c89b4d03af7 +2268,f247396149b700ec +2269,21e8b60bbc30b7ff +2270,ebfcff9e1fd8fdbd +2271,855e8cb16f20fcf2 +2272,31365f40c1c471cd +2273,76afdeef70a38016 +2274,894db0d2f13f89fb +2275,d769ca291babe9b5 +2276,252fec944db5928a +2277,2097758e973d5f57 +2278,33a3746811d21ad4 +2279,939dcf6d674345a2 +2280,d9f89373bf469ab1 +2281,57b860157b747d7d +2282,1cd455426778bbbd +2283,3de7967861b6ceb9 +2284,11804e316bf67628 +2285,5b8bd892970abe48 +2286,5dab1b329e9ae1e3 +2287,4780ea5a59a908f2 +2288,953ac21d77afc95f +2289,4506234117925814 +2290,3522ed20ddb4017c +2291,f90f462b7ea839c2 +2292,e1fd1d8933d78c23 +2293,bf0d5c20e9244a46 +2294,babb0a51df08a196 +2295,5382b39a5f889467 +2296,80f3751a14036ee0 +2297,98dce92448795302 +2298,2de4c4ccf041d935 +2299,8489a1791f00724a +2300,c7b1dc84b68b80be +2301,369b5d9e7931462c +2302,8db0413489960769 +2303,981273567c5c05fa +2304,96ea14f61b6f2132 +2305,5b81243f601ff382 +2306,2b391f1657c26385 +2307,82909d21a8e18b1d +2308,22bc9cbbc240a371 +2309,0cccb25fee72ebcf +2310,870369be92fab00d +2311,14538f957b4513fa +2312,74606f0a74c89410 +2313,0f903c5865bf4fd3 +2314,f8d646ab52d139c8 +2315,84ca32df8513deac +2316,516a720f2082c66a +2317,deba991de726b389 +2318,4c49ea1dfde9dfaf +2319,fbaa04f83b9375bb +2320,768aa3eacf54a108 +2321,c68daa7795264fe4 +2322,f6152cdc84c2dddb +2323,19cbe55ae2a080d7 +2324,9f381fa1e97a8f7b +2325,9911ab309c7a9bfd +2326,fbb3eb9296ca4fb8 +2327,d82b97e3029d4d90 +2328,ab5bff890aaaaf19 +2329,881037729a274ec5 +2330,b209479467c999d1 +2331,635f9488a34b8764 +2332,2b2c179f546a1573 +2333,d4c41060c6145bd2 +2334,44e6faa2c267a854 +2335,93a0ba47f193eedf +2336,72cae1559c7e57e7 +2337,d8fd5d641c292a1e +2338,eb0946bfd5c4939b +2339,0ae35d9d3e27f9f7 +2340,c963ddb06e48be02 +2341,f504c92820a7b74f +2342,8845b30dfca37825 +2343,b0613c6caa54b9e5 +2344,3f4273e90243079d +2345,0857e4c44012cc66 +2346,f28ae338d2f40047 +2347,5a8399344190a04e +2348,70ba8a42679855f7 +2349,4fb6bad40d39a695 +2350,ec0a09adedd28e9d +2351,053a94fe42d13fd4 +2352,fd93541a2dc601c2 +2353,b72d756aec9e0e66 +2354,009b2e44bae051d2 +2355,6c2519f99942b772 +2356,3c74ab8a5fa32f55 +2357,9a71a181610e4914 +2358,95c0dac1da405654 +2359,ee883fc7725999c7 +2360,4289a1adeaa2937b +2361,c65d015308b5dbcc +2362,dd910bd6d2288450 +2363,f87acf92ef25584f +2364,f0dbbc405c0ed427 +2365,a6d09e84e9566fac +2366,c2140a05e757da34 +2367,1f80ae3eb6388bd8 +2368,3d27937903176d27 +2369,6bdf341b6946cdc5 +2370,1912d34ca6207f8a +2371,99a5eff3ce4b2e49 +2372,287afb3154dfdd40 +2373,3007d99cc6bc12db +2374,472a78257424f38c +2375,8c0e13d480f6e1f9 +2376,afab659c2408ee2b +2377,c93e80def59db737 +2378,f66163f43d1d5e6a +2379,3670229bee1a74e8 +2380,e1408e8a4ee2a702 +2381,5257669d6a8fa578 +2382,7eaa72c680067ef5 +2383,708014b92a854c78 +2384,a00dc1823469795f +2385,1b078bb77eb560a7 +2386,c77ad5ae30be15cd +2387,6c83b74048bb9251 +2388,70bf4a7417ebff1d +2389,8c76e01d7a4f3073 +2390,5dbef111ea652512 +2391,83b27d937cb27e4d +2392,32390d32e72e438b +2393,836122fb2cadfa35 +2394,448f2645e1322ef1 +2395,4bc142a75a251270 +2396,af334efc590d5306 +2397,3f21ee0628f363e8 +2398,3ec9f5dcd74ee8e5 +2399,b12861b2054a5339 +2400,6db3d8487a08d9c8 +2401,1622bb343ca0ffa6 +2402,1b58473b9adc9b3b +2403,0297d671804517c0 +2404,5f2b659b31f48c9e +2405,e81fa3bcca54914d +2406,c06999648b801792 +2407,e03824c0729a5624 +2408,451a0bf9440ad4e4 +2409,d908aee4c9139811 +2410,68137bbec5abf9c6 +2411,996c71e7a11182a9 +2412,ce1336238fb7dd59 +2413,598755707fd88593 +2414,7482f07617521998 +2415,0ad23892d9762bfe +2416,679f2ecea24ea2f8 +2417,2bbdac945605edb6 +2418,6e72e607f3054320 +2419,30d2c302726faedd +2420,412f4b69daa4f3ea +2421,dbeb0c1da7507edf +2422,2717dc6659d9d54c +2423,628c872288add50b +2424,1011a0e884880174 +2425,5c154b66b49f7ef6 +2426,959bcd1a5754dd1f +2427,680485c1c3925d59 +2428,019e76e5f9b7683e +2429,4a812263a08e14e8 +2430,34761aff94ffb9e2 +2431,cfeff97f9c3ac3ae +2432,dd1a8acaaf7a769f +2433,960ec264f6670e4f +2434,7766e870fdee98b0 +2435,62481776eb70bd40 +2436,97ae3dd7e831622f +2437,70bf41731d1b258d +2438,30fdc64ac1a8a86b +2439,ee712d9fea3e803b +2440,00c95d97164a795e +2441,cc62ba5ee3371261 +2442,78a430472e8c0c08 +2443,708d31de0110807b +2444,d1a5e83a90b1ccc7 +2445,fca415ee4e35378b +2446,902c33584adaed3e +2447,269f21f20c797a02 +2448,2e62111bb6bf30d9 +2449,d6ea951cac6a64c6 +2450,279065107f32a6c5 +2451,659a34aa8b848cec +2452,fed65dabeeb8a270 +2453,fa839b55a1e2b3df +2454,8f029e529bd0d758 +2455,27beb047ac882ae8 +2456,dd444e58866f346f +2457,84bf832b92c31f10 +2458,555f7b9898d93b39 +2459,22401bb868b5ba34 +2460,86178de73a1c05a4 +2461,4664e81b120e1089 +2462,637f94c344fdd2b7 +2463,3472fbe287c539c7 +2464,63f2ab4606b73d9c +2465,491da64c70356cb9 +2466,f5c31750212fd8f5 +2467,011e8b390822ed25 +2468,d8724d8b553f824a +2469,df70b34776bd8ecd +2470,8531e8f056c84fc7 +2471,c3ce2febd3018b02 +2472,e85b8bf8ade32489 +2473,cf2837902bf6cacc +2474,953a6762df3400ac +2475,c735fda9248cc465 +2476,e176d9bacfe14b26 +2477,9fbd512c51bd0f7d +2478,5006fe720a7c8b31 +2479,f589633c18a6aeb8 +2480,86318424e2ff8aad +2481,cc3db5844ba6cf72 +2482,bae6ef501c26f9f6 +2483,92446f1555975e35 +2484,3e8e01117c68a4fe +2485,9699113170b1e161 +2486,4a1dd0c3773f698f +2487,5b1e6d9a3bdee15f +2488,661ffb9f52a8f695 +2489,ea2d878ac0bd84f9 +2490,ec0d929dacc8f0b6 +2491,2ad009533d16ff3f +2492,33d1174db10d0545 +2493,54bba38673174e32 +2494,28aabcce6b01db5c +2495,6cece06276533e9d +2496,2ba486fbc0a0f867 +2497,a0f9563659630ad4 +2498,9d1debf9099d6667 +2499,e6a90cb37c2a28e1 +2500,13a2ab86272d1b9f +2501,d01603cb62a5f740 +2502,80ea45b7a9a3bded +2503,4c7e013b09036967 +2504,b5073324647a093f +2505,d64d4454f0ba00ec +2506,d6b2760db41c6d6c +2507,e58af038820679df +2508,9df332ffd15e6966 +2509,c63b12cc052d9989 +2510,7ebbcb81fa9daed5 +2511,8904bb47f1fe6c74 +2512,ae312c965fab999f +2513,32248a60568c14c5 +2514,7460abfb5446e2b7 +2515,3304e1709f814551 +2516,1d977638deb7a735 +2517,8ac995de879581a4 +2518,e4eccc1d34fb2558 +2519,702d91a528d49a90 +2520,9575f4353ca62a7e +2521,7f624f0ce3113115 +2522,5548efd169d81765 +2523,0b762e3dcdad5b1d +2524,4b54b92161efa6ef +2525,852dacb1178e062b +2526,94032c5f4e421849 +2527,1da4607a3db7da63 +2528,ca3fa58f5c5c9f1e +2529,8a4bafa7fb282f24 +2530,420c3abc2fced9a0 +2531,086cb46fc8aa0af3 +2532,b1fd07ec21a26473 +2533,661f9c41e0dc8371 +2534,b74773de6a3ae551 +2535,e5cdabc86f80c8f9 +2536,12d06d7065d20be7 +2537,e4f94b149d9278ea +2538,179a12b471a232eb +2539,57f0670beed1f73f +2540,e20ea7eec3fc3572 +2541,c83505ccaed7aec5 +2542,38dda04f5176b456 +2543,d2ba856a4548dcfc +2544,28342ae815bed1dc +2545,cd08d0140c92e09f +2546,40337bcb7ba37612 +2547,8288c45d2e03fdd3 +2548,fee4328c149e971e +2549,edbab25d1d02bcb1 +2550,cf0812a5679a5e7c +2551,69acc25e495455ce +2552,f9ad38beae523311 +2553,dbb5d3031f2b46ac +2554,d0822e78ebd3909b +2555,f6310592b0d77ad0 +2556,9b6f1752124b8f52 +2557,c3739d97c1eba820 +2558,c18e5992a4026aa0 +2559,8c0989d57537e430 +2560,a451a022595389e6 +2561,bb3aae5e6609a7b9 +2562,a59192da0fae3690 +2563,023e490964e74b3f +2564,18a538e5f968aedf +2565,f126d85266004dc1 +2566,e0a8ddfa793aaae7 +2567,8d5b36485083bb24 +2568,fbe351c427618868 +2569,2c9607599c451826 +2570,71e030c6e9bcb43b +2571,1b2584ceabf7f85f +2572,e71c96e14ca19dbb +2573,99944cd879b26563 +2574,a39fea6ec436530c +2575,9d8a993c7b9c04b2 +2576,a9c92933ea095e8a +2577,43aa2c671dc7a97d +2578,7eb12f86f50af43b +2579,6166699dc75ae738 +2580,adf93e8ea6cc49c8 +2581,cc7d70e96bc29d2f +2582,aad98c01f2da2ba0 +2583,8cb3cf3f11beaa38 +2584,165476d453cbc4bc +2585,e11f5f82f670f8ee +2586,d432ee4ff6c06022 +2587,dc6b89cb31d55515 +2588,43e76445191a36ce +2589,06856711fd869169 +2590,59e14987c1ee41b0 +2591,02cbb41c818af068 +2592,93329700ccbd01c6 +2593,0b6b67208b7b2054 +2594,68faaebdce7b5f57 +2595,f719c81710fc0fad +2596,ec183d968ba32b32 +2597,ffb07cd4a1cdfe63 +2598,73cab08a77a93ce2 +2599,52b6e6112b357ca7 +2600,96291163788c8f01 +2601,26a53118913f6f1d +2602,ace03d236ee42c40 +2603,2e9d35a8ca252dfa +2604,a655890022007bd9 +2605,8396d6360577aa6a +2606,1d440dcea926f525 +2607,3548d22b8bbf7627 +2608,79947f51eeee4c1a +2609,a616f64edeb58981 +2610,03ca29e86a46740a +2611,54a8ab48023ac470 +2612,2822d2b9dc3c4011 +2613,1600dddb3f4390b5 +2614,adaf4c65dca2c58c +2615,12c74534106b3071 +2616,b39d5ee5fdc18b40 +2617,a217213992f44f65 +2618,8de75ecce0fdd232 +2619,9f904b36e746cc1b +2620,33a85188c92fe387 +2621,aa3fa108cf72d970 +2622,2c5a84f2f0a283ab +2623,283bcc4e2472eefc +2624,e6ce9d406139473a +2625,d31deaf7404c9582 +2626,c953bdf70c5f6cf5 +2627,a3d0d07a3a5b7ed5 +2628,45546ceb255499f8 +2629,cb81165cb6500278 +2630,736744506a9d7177 +2631,b6960aa3ac84bb79 +2632,3e809d5dd0ab4495 +2633,ae1ed9baa289c1b7 +2634,605650acd925814c +2635,f71542b761a11600 +2636,7bcbc5016e801d7d +2637,8487db8c99dfed88 +2638,71d5328fdd2f755f +2639,1e9e95bec48004c2 +2640,ab4d81e65253787d +2641,c7cf620f58b5d93f +2642,8f1b3b1b44d64866 +2643,b77ba3ca3f0a6088 +2644,59b24b016be0ada5 +2645,90e11559f267d53b +2646,ff9a0770c74d277b +2647,0f264abf939a00b8 +2648,a84769283cdbee55 +2649,60f10134a65e51e0 +2650,432386b4bc64538a +2651,93b68e72fcd9f4e4 +2652,3b13c018b77b08c4 +2653,7836ba64ac6635d0 +2654,6f86b83eb2703a68 +2655,74fa30ad228b650c +2656,75f6a86926b97719 +2657,057060d91ef1a537 +2658,437b5ebc9b997168 +2659,0b4487c236ef404e +2660,7f4840e5c4449f5a +2661,2cc31774bd629834 +2662,f55b0c6078a0848b +2663,dd7bfd716045236c +2664,cb0262be85460707 +2665,c6424d220a3fbd12 +2666,e173d76c85c3e4ca +2667,a6c468de0e4b4a1d +2668,192408b0218f7db1 +2669,6366bc5d7e1017ea +2670,154355c6bd7caaba +2671,88cc0b40182a4a4d +2672,9b49ef5b4a39f586 +2673,a1050f39999fd4ba +2674,3b7bf2d3d2ea5a2d +2675,fc5a273395b93546 +2676,66dfbb13b48a8a06 +2677,904e865c44a53aaf +2678,9f3336ae7345bb69 +2679,9a389ea9b70797bf +2680,d2d47ad6f946a352 +2681,5c43b35222dff5da +2682,6850ddf3daf07939 +2683,6887e7005a508d36 +2684,f8318a0ac0e0c738 +2685,09485f41e6515c6d +2686,ac7d6016665c166e +2687,32e5d895f2449561 +2688,8061d57daf6c1482 +2689,d43706092755fc78 +2690,cb94949069c141a4 +2691,a1e10fb7770f497d +2692,543a1925f1c88cfe +2693,f8cf2c60bf039b18 +2694,8c85d0971bc5f674 +2695,85fd22fa5d7b11e9 +2696,9e632ac4820f70d0 +2697,09947dc25278cd5b +2698,33a05d2de0c82b98 +2699,a0ad6e297a17013a +2700,177fa747028f53a2 +2701,7fdeeb67122b020c +2702,890966083be86b18 +2703,253fa425500c8288 +2704,49eca5bcf229021a +2705,a2f1da2c05e48522 +2706,528daed27ff64e46 +2707,326694da79bb136a +2708,87a48fbb1f47fae0 +2709,b811ff650106fec9 +2710,b4fa9411a648608b +2711,56ccf6b5d9cbe3d3 +2712,394926827f7e7783 +2713,05663b0c5c0cc52b +2714,e070d5a2a2ba8c6c +2715,64eca523ba18d225 +2716,8b1521563c4343bb +2717,71e994fc0ab8f4a4 +2718,af807371cf76e54d +2719,67a04abf157e6fb8 +2720,6980c5443e1da7fc +2721,58bcd0f9d30287ed +2722,3d8c90f10064500c +2723,154e6406a365c80d +2724,1e508076108c20a0 +2725,d1141d97f0420c54 +2726,ad7342c87de4ead5 +2727,418afd6a333f2415 +2728,9cffd027aaa5c78b +2729,2c2e68bd9d308801 +2730,7e0dec1c84c82d80 +2731,e428d82e02bda773 +2732,d0a52fc7ac34c538 +2733,6058592db554a7be +2734,524a361b18c0b104 +2735,8cd706614ed00f03 +2736,5962f320396536b2 +2737,664d7d3f833c6f46 +2738,f21df5992aa6a04f +2739,008c0ef51bef520c +2740,176d462144d28dac +2741,091f239f1244b909 +2742,62688737059619e7 +2743,5f7c385c52d48f8a +2744,39ffbd9437c86b39 +2745,6e8b6cc530cddc16 +2746,b19f0913c2619d10 +2747,206002f492665f74 +2748,ecd2b334e0d0e6fd +2749,06cb87a424341fb1 +2750,87c9213f188e5d0c +2751,46901d44d89f3640 +2752,1dee024a6d1c0465 +2753,73b27f1ffac33666 +2754,ce74cfe5b9d46665 +2755,397d2e3f69a00125 +2756,74c831c7a66b8059 +2757,8bf8c21234f8e66c +2758,8be5ee02f3eaf000 +2759,e3b6deac53411aea +2760,2d9ce6ec147ce5fe +2761,b79bc933b6248843 +2762,7a7268c78e4479b3 +2763,dd4c204c09cd08ce +2764,ae727875be810988 +2765,6e90a540a6f3676d +2766,5f847fa9c05006ec +2767,447d1ef8910e0b82 +2768,c8b8c1f8c4f552e2 +2769,178de5db10916642 +2770,d6642726e2bee1ec +2771,f970e12e5a0710dd +2772,248a9730bfd22c45 +2773,23277019595a22ee +2774,5e917fbc43d0b5c5 +2775,27284f6b78e4a2ce +2776,7ecaa25e847fc527 +2777,fadb5aa3a2e86922 +2778,082b730c4e2f53bb +2779,b8f2b4ff84eb3fa2 +2780,d30463b05cb92110 +2781,ec4aaa96c5ab0677 +2782,bb52f60cb73caa3b +2783,11bbc05502ecd3d1 +2784,15f457beb21dc4ad +2785,0b0ca4fb24b37c2d +2786,f6e97054655e00a0 +2787,f1191841b158610f +2788,e35de94b66437fbd +2789,63741f780cc91c85 +2790,db954491a24b1e2a +2791,c8154f14e20e1c58 +2792,e9b6484fda427b2c +2793,e4970d54a6641440 +2794,4f1be2f9b5fae7e9 +2795,011c2ad8390cdcce +2796,c2fe4d577b4a7da5 +2797,e8ce9b0d80b4fa4f +2798,7619c1c6c35b724b +2799,f8563972a293f388 +2800,ee901577bf7fcce9 +2801,4f6c63c20cd4897a +2802,9897d16ef9f451d5 +2803,6da382217f9f58e2 +2804,52b606f1512bccd1 +2805,d4330bab6a3e12ba +2806,b9da59f28e8e48f2 +2807,4ce5629b8e2c70dd +2808,0f529bab043832a1 +2809,23f3185ba9713b68 +2810,8fc387a8a9b0c54b +2811,57c13d2656d72257 +2812,b94a820bc56e6148 +2813,ad2d3d69cf7aeb86 +2814,c519bd48bc1c6586 +2815,e3e1fd8bed0ab45c +2816,a582ce30c519a73d +2817,c76e85043ea42d00 +2818,8c6cd0060349dd63 +2819,255f9f0843837353 +2820,d8c92c3dc3158a0a +2821,7f38187621c91ec1 +2822,d13d5b430c192a22 +2823,f464765c58fd8460 +2824,3e297a4e5eaf3f5a +2825,31df558226ad5dcb +2826,0dc24e0b8c144029 +2827,9dc1d77c94c645ac +2828,83e13f045767156b +2829,b60cc56de5323f5e +2830,c68e477590453f2a +2831,7f3621732d4bb0e9 +2832,346a404564885325 +2833,1c0513ad4ffb54f3 +2834,f3be52115b82db83 +2835,b32ee9db83e91cba +2836,7326825d9dee5ca5 +2837,38ad1744f674fab8 +2838,78aafa2cf12f1950 +2839,a8603a8fc43c3a91 +2840,e757a60ed5b750d1 +2841,b9ee68888c437bcf +2842,444276107be95869 +2843,52f3107a07d3f479 +2844,8ea49603cb51f7fa +2845,cdc9aed76894631e +2846,a171b223eecb2bd7 +2847,c04d60628eef9e06 +2848,d234a5ae8caedfb6 +2849,728086fee5f4a8a1 +2850,86f327448441483f +2851,861e8e4b31dbbc86 +2852,14625953bb3b8798 +2853,61dfad655af6e233 +2854,312ff61cd05b75a8 +2855,92de2476c1ad83ca +2856,98360a495d5a5373 +2857,9cf670a6959c40dd +2858,27e43d7271a3f5e8 +2859,9c52bd78ad0cbd7b +2860,4fcde1b37a5f5169 +2861,99c40b5d47405ef6 +2862,6b0d35e7ac4e587a +2863,2d8c16d770886aae +2864,72477b3a80fa47a8 +2865,3be58e6bee3e2885 +2866,7b4254558e118a8c +2867,1b7de30ca6433bdc +2868,2c3ce4addb370eb1 +2869,222d296f1bcb46c9 +2870,29c58e8795167e22 +2871,1bd109475977c344 +2872,59bee339bba48263 +2873,de7af510fdbe1399 +2874,d01aabe169a2f550 +2875,d57e6a35653b07f1 +2876,030b91bd9df1ebca +2877,a1eb5d6cc5bd477e +2878,5af67a7d2d1e9859 +2879,af23472127ad1f30 +2880,a72f9b5c61e5fc88 +2881,e6f3a1326e5c5ddf +2882,6609449b0047772f +2883,bb030dc431cfc4ea +2884,d8e63bdd113947f1 +2885,ddda91c38ccc901e +2886,e9d59982cbac5acd +2887,19d03e007c912b3d +2888,563f6bd47296ee7e +2889,0a2b0b9c8ae18ab5 +2890,4157ede397175309 +2891,9b81680a314eafd3 +2892,5876be9639446c50 +2893,667d3957420436d9 +2894,b0117b5601aa880a +2895,8188c6963f2378b0 +2896,0f2e2ed20f97c391 +2897,e9283032b075b6a6 +2898,83e4b9dab2bc9642 +2899,79b3165d57aeb442 +2900,1d2fd4bab8f78eb4 +2901,cb01b1bc011df3cd +2902,2493027cecd05913 +2903,1d2ba5320f967ecf +2904,6fc7b293fd94d5a3 +2905,97eaf934581e856a +2906,e103173270b755dd +2907,56ae84bd739b95d3 +2908,7dfcc307976242d4 +2909,1c2af98e1a632360 +2910,0ac79957e168a51c +2911,9b4189e50cf45d73 +2912,18a753ae572e246d +2913,6f0be1e2e76403ac +2914,97ba6c98cb931b90 +2915,7a331fd1521f9965 +2916,6fd62616075d7018 +2917,4146344788d81eb0 +2918,77d0da03af0c1e61 +2919,79c07c5f03ceddbd +2920,8f05829b965a4184 +2921,880bfb6a67304627 +2922,a6ace92bfad04ddb +2923,9807e57850604530 +2924,50e08cf8be591cad +2925,101f197fac963de3 +2926,295531b62e6d7294 +2927,a9d09d61af943a82 +2928,8a507cd1f44ba8c4 +2929,5b08f3661267f8ac +2930,b85bf0371021ea02 +2931,e9e16a7d77ba60b0 +2932,4104445ba0b6073d +2933,ded6d302fd915a24 +2934,8ae3f635d6cea486 +2935,530124af4954cbfd +2936,35646d3a13035514 +2937,0eeda8ae3ad38bc9 +2938,3de333cb7432a4f7 +2939,05bc6523841531ef +2940,32ae7616d231e514 +2941,2ef18d3c3a72fcac +2942,ce780ba75f57027e +2943,9698a10c0af30b0a +2944,33462445bc2acd6d +2945,538b9cd22bec1021 +2946,66068271d17fff3f +2947,3b435cff3f993fc8 +2948,df90ff50797125e7 +2949,72a4baeb71dd687b +2950,e4a14e4ff7caa1fe +2951,10034cecd28e18a1 +2952,b3fe3b2f1d4cde45 +2953,d28cb93246568778 +2954,52885df8eec8dd8c +2955,770d02b61554506f +2956,347cce7b0c5f322c +2957,6b7d8fabc824a274 +2958,1c05aad2e730b55d +2959,9b9079d9d92f848b +2960,e077b36333093f60 +2961,38b14172fc8e074c +2962,6c6e437a5110871a +2963,0ea73814549a60f5 +2964,c748f0dc1a9d97c9 +2965,df4e771976688b60 +2966,5d6117891fc08faa +2967,1a9f9c872387caea +2968,25744692f8406014 +2969,a07c52bffaa3cdc9 +2970,aad6531ecadd8907 +2971,fee86a1098c88bca +2972,4aa780a6fda58653 +2973,00663709ad236839 +2974,59c62d3c1acfd5f4 +2975,5d88a138ab7a6138 +2976,0ca31aae0cb2e5aa +2977,6d4424546a49afea +2978,8dd3517db974afcb +2979,994c0764c06129fc +2980,4482d4eee18d1c3b +2981,c4ecf1c9c57f7a43 +2982,293396e082698e1d +2983,7a93f10a8bef9bd2 +2984,7222f27593917fd6 +2985,62e1b4004f451191 +2986,667029094ae0c91c +2987,c870bc77295b7320 +2988,08f4fc2dd4e39a96 +2989,12bded4a7fb7537a +2990,dee73ccdb960006d +2991,49118b552811afb5 +2992,f7e9dd1c68ddb0e2 +2993,02300b9eeefc8dff +2994,dec73c4b132585fc +2995,926705cb26abdb83 +2996,36afb60878bf262b +2997,6f6b673d4b987292 +2998,2591b6fcc56fcdc9 +2999,fcf241a89fd4902f +3000,90c7da591db7b882 +3001,b79c8c5955ca4468 +3002,eeadd5d6c5623010 +3003,da91c3acbd340b19 +3004,5791a603beb1765e +3005,253c7abd4b9c3eaa +3006,0d82f7776161a372 +3007,b44565530f422775 +3008,30ca3e6afe34be8d +3009,c8f1dfd76002eb40 +3010,beb0990b1635ab83 +3011,69c0907f65b42edd +3012,bae713af3e89ee91 +3013,e12f3b0fb3d63d77 +3014,25405b303695086f +3015,e62baac015f85eef +3016,feaa5ac66bb5ce9c +3017,97b04591394ae3f3 +3018,b5f869f8e9763b6d +3019,22f5be474b50478a +3020,03fa5252d8510e7a +3021,e127f6b6777c1c1a +3022,0e20836cf06d19cf +3023,9b56ba34ac503543 +3024,009ebd1415ed9515 +3025,ad46ddde610031c0 +3026,9bb2c7959442f111 +3027,fa146805447e3523 +3028,bfb676d454a4e348 +3029,d9998a4179de46b8 +3030,5b9f9a5514ace051 +3031,ac7a255e0cbe0fef +3032,5f40e05f9295295f +3033,f8bee8d93ee92fcb +3034,aaed9cd31b4bff18 +3035,205e211573b28eff +3036,d1eeee9312df9597 +3037,69d4de89c554820f +3038,b63cee67d3bbb640 +3039,060bdfc3cec710db +3040,011bc61a67a30dd5 +3041,8b24add0b58b9d30 +3042,47ba91d0a6b29042 +3043,6eae0908cad49fb4 +3044,825c2d37e205548c +3045,23deb833f7ea8826 +3046,d0fd94d65f95cc39 +3047,1ec1f9a055a7dbc8 +3048,2d59eb65a3261359 +3049,bff3b1f6e04df86a +3050,8fa383ebff2be044 +3051,f3e14fb1b38d81c1 +3052,1d48a1f5843ebed1 +3053,7e6b3379e38814e1 +3054,21c580a15cb8db7c +3055,a84725b9147763ba +3056,6cfe503b52347480 +3057,2a3ad9205a7b5e99 +3058,20dc22588f5f188d +3059,7e78732c6f6c8fd8 +3060,2801c04fbfb59314 +3061,5251fb7f25897808 +3062,d528aba391f6bd41 +3063,beebd32fed8e8c98 +3064,2039a0093dc52239 +3065,99d3f6e89effedfc +3066,a0b7889d22d5490e +3067,6ea1098deb6f6324 +3068,09609527e04f09ae +3069,2279106add217512 +3070,b10de63bc3b21f47 +3071,2eea7805f5f3aa89 +3072,841804b60fc56832 +3073,18c65c86ff1a8e39 +3074,9efad2cf060f0189 +3075,741c30905bf1c550 +3076,393c7269b437f9c3 +3077,baa84090c85f186d +3078,0650eeb0559c38ec +3079,e5b7c6ad87580a6d +3080,fd943afdd7e59c56 +3081,4a7c1d47e7aea15b +3082,6697a7b7bedd3be5 +3083,d4bcdac729f89624 +3084,4935805e04b33ffb +3085,86e312db9cef7e94 +3086,886ab1af35886294 +3087,f40416dca9551a31 +3088,4fd990bd1e49eabd +3089,04ddae862b7f033d +3090,425d435b20a74502 +3091,ef19836845d1d847 +3092,0b39b65becb3e186 +3093,459aa04650b3bb7e +3094,2c2f91556ba1a32d +3095,350d2f84f022cba1 +3096,a4693d2f4f1ce3c9 +3097,c020f92abfa0fd99 +3098,6b81fc26cb2afc09 +3099,471296312a8e9d23 +3100,f55c0d329659d84a +3101,9d4a50b8359d4521 +3102,0bc146e010aa7e11 +3103,47bf08b6e3d5f8db +3104,58332838f1f0afd2 +3105,9fb5aceed706cbd1 +3106,007c06b85b65db07 +3107,7c2e0a588e24765d +3108,2e98cdb294d8a2e7 +3109,81cc0b35d85e95d3 +3110,97022f374e96ed47 +3111,2ae9ee5d9e403bcf +3112,c2d16680715f42a7 +3113,f44f7f8de3424eef +3114,ee4cca79622d8e5e +3115,a7bed204863e0bc2 +3116,3f13150335ed837e +3117,c477cff50c0bb73c +3118,da44de7d9dc97616 +3119,5b84ac38a63c35c1 +3120,2784115ceb1f6c0a +3121,88933370758fe670 +3122,8f2162e80592c9c6 +3123,7772bc99a12dd423 +3124,cbdaa210cb2506e9 +3125,ee1a15ab510c4cba +3126,32f7759d213aa867 +3127,74d61f4b4ae57e06 +3128,b2fe47a51d2ff92c +3129,6e7ef95882023452 +3130,1fae0ca49980ccc5 +3131,f4acb676427196ed +3132,d6ef5eaf9d4904a4 +3133,f23f24a41d832adc +3134,2400f58e238fd6b5 +3135,f8c8f14af8c4aa8c +3136,f701c0a8590f423b +3137,b29b2b95162a711d +3138,17c707eff38e782a +3139,0a78adc2ec1b2285 +3140,5b670459ffd2f7c5 +3141,b59a43028631e571 +3142,79e2e143b3ecba1a +3143,dc2e85d11c805fb5 +3144,9d24ec49b2032ca4 +3145,3ae90650849100c2 +3146,9366c37cfaa101bc +3147,18559b3c4923dbd7 +3148,d126cf0e026306f4 +3149,07a7647746d7a89e +3150,5d8044d3b67317d6 +3151,5e96e112cc0284a5 +3152,ab77cc33d3c91f05 +3153,b820651cb27cf243 +3154,5b2d9be932f34609 +3155,d5ac714f01fefd63 +3156,7c0869901a735520 +3157,4e46c7d812d17955 +3158,307e317005f93e23 +3159,f1f59e05ae443035 +3160,c2b43bb0a7f0d6b4 +3161,0f66cf381f392473 +3162,3ee35504dffe5201 +3163,ff1d2b980f392ecf +3164,dc19a398d0b5fb9b +3165,cac9975f9bb3694c +3166,6a9b6ef3e7a4525d +3167,3a5f16ef8f5db631 +3168,588d5e70e0987f81 +3169,357637211548f59d +3170,3c89e240d715c480 +3171,3b90c77d835d53d1 +3172,5f1409e811c528e7 +3173,e5b941f24c430ffe +3174,dd725f8e690af9fc +3175,7103f1aa32981e5d +3176,b694fdf8cbea2d9e +3177,8601e6992b561f8e +3178,27cf6c64ef70c2e5 +3179,fde6f0836e4228eb +3180,13c321fe1b14840c +3181,41777a36032b2464 +3182,1686fcae94ba983a +3183,ba75f6edcf91bb30 +3184,e334c349ae130c53 +3185,3bcf9d5f60f442bf +3186,c837f68c18e3908d +3187,cbadedde931a529d +3188,719706e0fab15450 +3189,df81b3029088a4b2 +3190,ac3ec1924c917593 +3191,9798f3e5f07682bc +3192,0d6d09624c224ffc +3193,396628ccb12989cc +3194,dfc3ce0ac04dcfeb +3195,26c75b0008b76fad +3196,749a59521e0fae56 +3197,840c7873f13cfb17 +3198,3e491080de955edf +3199,f608823ede90e998 +3200,5c6c47c0d92a84c8 +3201,1f081e1b10766d81 +3202,d2216169bae246a8 +3203,1e942bdd2ada357c +3204,0b37f96608b0258e +3205,3568700ef3e26e77 +3206,09eb428da8bc0446 +3207,3c985f574277250e +3208,d03cb10542722462 +3209,0d9b289745b00b23 +3210,f6ae6365473721a2 +3211,a5eb5c5de81d7c02 +3212,2cff927516a73635 +3213,dda9e8a8ec6ee8b0 +3214,904459015f4e11db +3215,eb92a403da430509 +3216,2ede62148ae2af0b +3217,2e2f706885d1e5a6 +3218,a095400817d3cdc8 +3219,645fc2b3cb633ad9 +3220,2b00a8f1710cfd54 +3221,918f87d5c54a8add +3222,5ad2247ace965271 +3223,b5c0ffe0bd173eb4 +3224,cc2605819524aeb1 +3225,bae1014343d2005c +3226,8c3d8aa0301bc11c +3227,34047d876fb44948 +3228,84366cffcbcd29f1 +3229,ec6647a8ba058e31 +3230,4a4d59e5b2882e31 +3231,a8bb2b53cf92c661 +3232,b147271286f7e26c +3233,32470958cd5e23bd +3234,916af785b32cb40a +3235,1821ba0fde2a0867 +3236,a8f38cec7253fb92 +3237,04a4afd346d41ae0 +3238,9ee6c54ba14367a2 +3239,d408dd27ba9cc11e +3240,dea84d09b5946595 +3241,fc943b7fb5a1ceee +3242,3791fdf495a85e15 +3243,751afd4d193d3c99 +3244,69dfa28a7836f784 +3245,e5ac3cfd9b87623d +3246,03efd68fbe514b12 +3247,1c1186e04e9cf7e5 +3248,7e142897f8e933cb +3249,12ba95658a861dde +3250,16bf4c7d3af7eb82 +3251,5367a7fa19ba6d6c +3252,962dbd6d812b9df6 +3253,688fc0a4b6f252aa +3254,358a759bd8221162 +3255,e0f3f13ea5d26028 +3256,bc6525cae9cbd776 +3257,4090876525200ecb +3258,a17f5ca7b9daec02 +3259,220b2a922d6f6105 +3260,a03429d92322bf8f +3261,2246d6a71add356d +3262,4e852150a73099ef +3263,88a979f25165a743 +3264,4406f46259268e28 +3265,0f475ee3f76d217e +3266,31f24c98907fa63d +3267,d7a36516424a7834 +3268,ecd25c241aae7637 +3269,137cf65c2539e78f +3270,917a0b3e37fa8a69 +3271,d9599625324daa6d +3272,78ff24c6f1111ed9 +3273,d820875532a24cf3 +3274,8110dca3ea34106b +3275,15afd9dfb9f85260 +3276,f973e5efe4fb3d2f +3277,4c27f7376819548b +3278,216ee606a30d831a +3279,31e20a038793437c +3280,a7642801b89d88b4 +3281,22ee1b8f6891a7f6 +3282,498a044c6311063d +3283,e3e0d64bc177c9de +3284,3d1bfde453aad753 +3285,c5f7c8e81a43a1e5 +3286,0f8d2aeecc796046 +3287,e9040aeb1346b686 +3288,dbd71a15b9e9913c +3289,3577930a37e343dc +3290,714354ceeb7fc57b +3291,d2013a7b357ab892 +3292,df303c26a12fd440 +3293,53fee24ec2cb084f +3294,e79bc3d9352dbd03 +3295,6db9eaae553ec7e4 +3296,e41ff8503ba34899 +3297,4dcc385703283269 +3298,6ef03ce9655ea569 +3299,5fc94f83e9ab08ec +3300,558ecf36962ed742 +3301,4370435f6d516b1b +3302,a9df004fdc7e7fc7 +3303,1eb104d61189b1b0 +3304,8b6685e5b793b555 +3305,22d5fbc3945bf8e0 +3306,88c836712451148e +3307,6c5971fec70916ac +3308,dab42b82d96775b7 +3309,e651b262222b9a34 +3310,43a4d243fb8873d0 +3311,b1e844ece6bb21ed +3312,e4c2fbc81d459daf +3313,95ed40fe542524ab +3314,3df5499e1facf4f7 +3315,d1bf5197b61d27bc +3316,0ebc784d55beb797 +3317,e02de561f7789269 +3318,dddd4356f7d7ee3a +3319,4353e292516fb0e0 +3320,01afba00c5587e01 +3321,f1ef5bc87bc60699 +3322,69d615ffdad73935 +3323,5ba7ef9cea160b10 +3324,2d9d3db55327d21b +3325,e92531efc17ff9da +3326,a3d3494e90344112 +3327,51e27a0c548bb3e4 +3328,d095cfe48334bb13 +3329,a9afec5505e3a639 +3330,979efc544548c07c +3331,3409f79b87c6dc97 +3332,81f72d3cc2243d95 +3333,978914c923677384 +3334,3bf23f2872454b8b +3335,eff097a5684bd3ac +3336,7f2d6332cdde0a81 +3337,047cab08e44df5f6 +3338,ef6adc61e39faf20 +3339,3fe0d88c43ca0bc2 +3340,a9bdc288e4de90ce +3341,037545ef19cfb08f +3342,318bce3626d246ed +3343,c41ec30c3ec46c6e +3344,2ed571eee4e2ad72 +3345,561d3599bb6c042a +3346,7399064b3add02d8 +3347,0c0dfd68d049bc68 +3348,7baf665762bef028 +3349,55a737e70857cea1 +3350,f5de9c6c9b54f15d +3351,b2be4826f7e2b9ab +3352,3cbde76a7f99765b +3353,e9aa3ccf2fde9573 +3354,6541a39ed30974fb +3355,f978b13ebe04e519 +3356,8bea961dcb7b858c +3357,0c1c1cebeb80158e +3358,71cc6d86c25922c8 +3359,b3709c221a20ccc4 +3360,c1f1e999a0798614 +3361,fc1142d65f18cece +3362,437821c811866eef +3363,0ce865e44c10ff69 +3364,00b80910e5a4fa8b +3365,1a540e56652f34d3 +3366,1630dc0cd3de1018 +3367,a4e3b48f72d81a63 +3368,9aba8337741cd300 +3369,26cece4a8e583a35 +3370,49ca9c37c5e83881 +3371,77e6e997b3a27649 +3372,b65bc18ea4e83319 +3373,7b4683ccc86a7bed +3374,25bd3cc73692dc78 +3375,4dd7fb10b7f93d2c +3376,9c9557a6a2d3c945 +3377,aaafcf37b7b68720 +3378,8a258121f28b037e +3379,6d511b29a57b74b9 +3380,c7347d6b941652a1 +3381,897e04a75662136c +3382,bf0eb80f976c0e09 +3383,3858c5bcc8ccd100 +3384,11ed26ffaf13ad29 +3385,bb6f309096dd6165 +3386,919e7c1f09374c79 +3387,3226101e1cd55ff0 +3388,8fd3609ac2742d9d +3389,e9a6fbc9c37a33ca +3390,1672856247e881cb +3391,9dc3a2938a24dd37 +3392,5fecc5fe83768043 +3393,d1aea8ae3c62bf6f +3394,b9a1d293fab59470 +3395,20d479bfc2b46284 +3396,280266bfd8202ae8 +3397,134d50f648b1ec60 +3398,9666ebd97dad0512 +3399,fc35a46014d49ba5 +3400,3e82aa67f8d5f294 +3401,841e5ee5ec8bea63 +3402,790ca277344afa22 +3403,6068b0c3e94cdcc9 +3404,de6f46c2fbf805a5 +3405,aff841ab43f48cfb +3406,6f292776badc5c34 +3407,61927e04f66f1d69 +3408,1fd8800b1380c93b +3409,60f88b87393c6498 +3410,2d3d4341a237f753 +3411,7d787974ce3dc9d5 +3412,4b61ecacc9a16ffd +3413,499d060d9d8fabc9 +3414,df369de42c4aaef2 +3415,ac9b5c2677f2c3d2 +3416,dcba9a169e875cfb +3417,b28877197a9d4532 +3418,3cc140fa3e832bd8 +3419,ab9f36e3e6de34c4 +3420,c61b8762979f914d +3421,332e122eaef12ff6 +3422,e21e2aef1fef2089 +3423,c35e23731aabbd05 +3424,70e90097a2d827f1 +3425,a41ee0befba48dd4 +3426,f16a26e898f4a75c +3427,9fa912ff9a90e9a2 +3428,a8017cb9651844d1 +3429,c257e246a4ae72df +3430,932f665575f5a1d0 +3431,7a2a1948226dbbce +3432,89a40c20a96958ed +3433,65175631518eedec +3434,5f5807508c747880 +3435,2a86322dedede7f4 +3436,ed896340a4559003 +3437,f7e3da57d7a39686 +3438,66e9ad693b6d6bc8 +3439,fc3dd236e44874a6 +3440,cf622821b06fff4b +3441,f4150580fe36bca0 +3442,e2479fb6dc3bb212 +3443,9900f0fcf3fd41b5 +3444,aad469ec00db6666 +3445,b3fdd74a6b8a306c +3446,5aeb5a99aff1b5d1 +3447,059d9e48999270d7 +3448,48ef5ec453eb0443 +3449,55b26c046a9a5bee +3450,12cbfbf16c88597f +3451,edf92df7a0781f80 +3452,1d98add83ecf5698 +3453,3dd660eb583ea00f +3454,4bde1881b1fc22ac +3455,c88c608c3176e611 +3456,e436095f376de5e4 +3457,50ac150a3635ed65 +3458,34bbf42b0e3344f4 +3459,f36fb801e3e3171a +3460,15943f3b47cf3891 +3461,3a749fdeead7f2e5 +3462,23ee98f17fc5f48a +3463,61a28ae61b388464 +3464,806f0044bfca5803 +3465,038f504f9b48560c +3466,63a59b92e7de7fc9 +3467,03993990d3a247f6 +3468,e5edb3eff6df0c40 +3469,5e46b8a77cda559f +3470,877e94f826bcb270 +3471,b36100e82ea0fa4f +3472,6d0c9828e7ad99c7 +3473,44d5dd4511b8111d +3474,e8b4799949c3462d +3475,1b2611e891faad3e +3476,71eb58f6235ae208 +3477,78b3d1ef5c6bd906 +3478,62ddd83227c49ce5 +3479,4afcd00a92c8a5c1 +3480,437b46f4433c7c89 +3481,bddd28bc172cfa9c +3482,aad2ebf4d6d17add +3483,1df5171c8ddef1b3 +3484,6618b8e239c25433 +3485,c6feff07a84c1aa7 +3486,41130175843354b1 +3487,8d905d5f5fdf3a12 +3488,152de222a8c4e55b +3489,5b577e804a652600 +3490,3083ccd89aea016f +3491,a4f5a0358081e7b0 +3492,0f77edc5ae2954ee +3493,e55a58db9bfdfe51 +3494,15a3ba32eb1960c1 +3495,77b2d43329d8f615 +3496,afdbda171d1001cc +3497,8ffe403d9a12828f +3498,9a3904377d8ffaf2 +3499,c48df1e9427ad666 +3500,71a2772aea89560a +3501,93c953202591fc3a +3502,248a5cf7c2727162 +3503,f5b3f1cfdfbf0692 +3504,9568a662a6c0f542 +3505,e4a2502c39049707 +3506,ab6231d7cf305a0c +3507,6a973f4202382424 +3508,050f812b987f8475 +3509,ce1e6f44e242a67e +3510,9454e0fe9b5c1076 +3511,79ba4bb4224ea568 +3512,bb653b3026d7c21b +3513,3dca6b0d2a040477 +3514,0d83fe40ed6fa861 +3515,e996ea95c1214073 +3516,cee45ab609f22c8b +3517,a56f37044df8e4e1 +3518,b0058c165119edac +3519,30c4cd5483735395 +3520,92872de26276daac +3521,a0230e0f02fad9af +3522,2510531ecc241bf0 +3523,0b99265a109f843f +3524,f24cf45917bf960b +3525,718f4b3f0946b41f +3526,735f4b492be6ba68 +3527,086bea049c01f78a +3528,a92e54674ebb571d +3529,c630f00836c7249f +3530,ff32f340eb53deec +3531,fbb50c3252bbc247 +3532,7aaae2b63111288c +3533,a8515a4c81dbbb9d +3534,32aae5d36f84ecd2 +3535,1342952e7c01f6de +3536,22f8e96316fc89e0 +3537,4a8eda11aeb9b021 +3538,188bd1fcbe6187bb +3539,857b074d865af50a +3540,5870aa62c7a446dc +3541,569b113a77218911 +3542,cf5e1030e5cef6fe +3543,2454818ebff7c320 +3544,94605a5bb5036e37 +3545,ddbdaa02abb5a3f3 +3546,da496d42bf86ff96 +3547,9fc7fe9544ed8d5a +3548,d14836e850546ddc +3549,2abb2cea97869d29 +3550,c349022c00c5afa1 +3551,3cdcead21e6979b0 +3552,f7d8e7cebeced312 +3553,476aa95ac24a2bee +3554,90769be2e48395e3 +3555,64beb75cf95d8f0b +3556,f20019d791902626 +3557,5189fef07f39ee49 +3558,9e4a38b0c1bdb0ca +3559,60ca1818a27a2f56 +3560,a223ae038a46a09f +3561,459812cd4003c90f +3562,f6c1f1ca03f1530a +3563,c8a5aec6ba020a5c +3564,109fdd46f32ffef2 +3565,cee2e12dc13924dd +3566,b3f6e32e0bb726d3 +3567,bab2642d7343c0a0 +3568,1be879daf23760e5 +3569,8f385e4fa83e7459 +3570,a76592bd23c2f3d2 +3571,42103f3653f63d9e +3572,afae423834f44877 +3573,acf1e639bbf491b5 +3574,3a5e3b31ed835b7b +3575,6c470884cd4b43e0 +3576,72f6bbd86f7403a4 +3577,81fb85337925393f +3578,09b2549895973027 +3579,bddd9aaa48c9c356 +3580,7661297ea3dfc30d +3581,d2dd40930ed142c9 +3582,176b6767f74710ba +3583,eb576631562c9062 +3584,48de25984fb13f42 +3585,c18a15fbdc2a975f +3586,ee91623f20546182 +3587,2073554bcbea8f03 +3588,84df1a2fc912dc21 +3589,1de249aed486d437 +3590,f1fffe87cd2a1887 +3591,1caa6638cdc1dfd8 +3592,368bf2792ef66f79 +3593,cba930ce0d2cfdcf +3594,4c7655cc210c9495 +3595,bcd8f90345b48e71 +3596,04dbf84ab0a2722d +3597,9a8838255465df84 +3598,3780d01096b8ae52 +3599,46c5b29dc8dfa700 +3600,b2cd1b3e7900ea65 +3601,b83712311441dcdb +3602,538b5134ad3c0ff0 +3603,92c6638b2ba2187e +3604,de16533ae1ceeaca +3605,406421697a65e958 +3606,72164e79cac9cd1e +3607,1f816a1ef6b276c3 +3608,f9b9ede7250d1604 +3609,5496fe1133200561 +3610,b00bb9f75858ecbd +3611,f6bbb6c3beec31d8 +3612,d24490b468c0de5f +3613,683f30915d388e54 +3614,49de16639489a95a +3615,4f14a9ce514f41bb +3616,667d9ba85e9aed09 +3617,269545965dcacea1 +3618,6a9f13ce943d603b +3619,686cc97a1761afa8 +3620,f940cccecafedf58 +3621,56fcdc50624c1c31 +3622,8597a8eea8163034 +3623,c9df8f872933bd33 +3624,7177a7e04a708233 +3625,b5ebb32c781539c1 +3626,c39f3ca53a4f57d6 +3627,cbe874bdf22ff583 +3628,7acd5e7bc21606f2 +3629,a7a2a65703772557 +3630,d551789ed1f3321a +3631,f34d80647fde6906 +3632,5c49f979bb2c862b +3633,8f774c8b056d76a1 +3634,2a3f150c561540e7 +3635,c089de2710bf5f50 +3636,9421b1711de3debb +3637,be6f0c22deb130a1 +3638,90c674643cfb1420 +3639,44d5b729fdd1d4e1 +3640,1d7a6a75a407ccec +3641,c0bd6ba5bb3731a9 +3642,39cc4bce7117ab4c +3643,bb157329fa17ce6d +3644,c0074f210402b656 +3645,ec1e7621060e2f9c +3646,9b938c40e39c51ce +3647,06623868ecd5fd62 +3648,93eebb5e5938ba70 +3649,7aae33a73fcfd450 +3650,48f2b03e8cbcb4b5 +3651,ecd777ef5a490328 +3652,a738edeb43d6488d +3653,aa9778014b9a0476 +3654,0f04a6f6214db764 +3655,34c348fe6b98f49b +3656,e9530d736f311b69 +3657,424f55ad927ad9ac +3658,37eed059c6525a58 +3659,f0f703f02faff838 +3660,f1e56af3e09fece7 +3661,a465f66e549a8c25 +3662,edbe79d53c0a2a92 +3663,fa5b20575f591e80 +3664,0d75fead32de9e5f +3665,5b55b019facfca15 +3666,681aa991540f9799 +3667,fff3d41d308058d3 +3668,c4c552d75796061d +3669,ed934132ee5b0fb7 +3670,d926c0423f4f44ba +3671,e91aece4066f6498 +3672,5d8ac3baf3dcaa56 +3673,2e3e6120d51c4161 +3674,a9b1400b55686c8e +3675,eefebb0c3e4380b5 +3676,41898db8a1a3fcb5 +3677,c1003e6f0b28c706 +3678,99741aeb2787bf4f +3679,d11b78011893ac70 +3680,a4f5b1bb7fa7a5e3 +3681,9715964f72a9f986 +3682,319ebb34307363f6 +3683,58eacb917a5aac19 +3684,15ad8b5cc5529bb8 +3685,12fa4be0013d98f8 +3686,c583bcfca8378ef5 +3687,d58e44ecaf50341c +3688,fce717fc9333cc5c +3689,18daf8f1b8827ee8 +3690,0eab21c0c88dadbe +3691,362266b56ff6ebf2 +3692,dbbc3dbdb2b80f4f +3693,9d8748172e5374f9 +3694,3b0d3ebde8b3e559 +3695,236cbdeade6b6755 +3696,8dd9ac2b4ade0eed +3697,5471e861c3d3bbab +3698,62f2d56510c9d9c2 +3699,16b8544d5b0d7aac +3700,569a09155b9aea55 +3701,2c5ee7cd970f3c75 +3702,4141ce76f94dc08a +3703,352d206303cac970 +3704,921ff84f281ba377 +3705,21a015e0df43ab0e +3706,76a05b7a35ebeb3d +3707,d617f83a22e261db +3708,84030436d5616970 +3709,dbc7a0278919ebfa +3710,3e80e1badf6317a5 +3711,83aecd96bca455a0 +3712,1221fc13e7ca64e9 +3713,f8cd8626a1b63dfc +3714,2a5af79f1eb55982 +3715,a91c823c174cb952 +3716,56137a46edb065c3 +3717,4993376f99f08ada +3718,a6ec0b1d3e015b88 +3719,941c822a52beab22 +3720,05ffd6791a232bf8 +3721,58fc94cc19893281 +3722,231226fb59de6728 +3723,eb8f67b8a72d5e68 +3724,d058f64ac121c047 +3725,7f97c4e5c6b66065 +3726,e920cc2ff91cb8b1 +3727,91bdcf42676d60f1 +3728,23dfb262c2fa7608 +3729,9f2f8475d46deee1 +3730,8755cbf28f494a5c +3731,de9ed0fca66f5afe +3732,5884e304ef5dd191 +3733,f2c725937c39d784 +3734,d5f8df75ad316aa6 +3735,b3c0fedc197a13c5 +3736,08e55a6995124bd0 +3737,b08d873e658aff22 +3738,d7269ab46e2b812c +3739,ccad012b72b6a34c +3740,710114aa6d2263ea +3741,40fdd7e2c441b137 +3742,ef6cafacc5f50553 +3743,05a5c51fc8f18980 +3744,ff894dc7bf3dd4a0 +3745,a0fe262c2f5ab2fb +3746,50fdf78f1e8f62b3 +3747,dc33cd82b6c91675 +3748,f257786ec8ae9ca1 +3749,b366343408ecfc77 +3750,288c8d28a50a1ede +3751,0d17214d397711b3 +3752,299cb90be088e74f +3753,b72ca8465b5450e5 +3754,73af5ad2ca96701b +3755,857a854bf3683c65 +3756,2ece5fb9b73633df +3757,dbab59661ffc71b4 +3758,a45ae3b96dc845b9 +3759,1db67f334b837b47 +3760,029aa94c15a51980 +3761,c73f76471c61b75d +3762,a1c76be3b9b699e9 +3763,eb0e5b16d5e27f37 +3764,2118989cf52118c0 +3765,64bd7e3717cdbc21 +3766,2f708b21d9bb6efd +3767,2ca8079f535ceca3 +3768,86fde18b9b1bd912 +3769,41172b86b89bba02 +3770,e5155c4d4be13312 +3771,9f1dca20bb1c6920 +3772,78bb6a12fa2b88aa +3773,46ddfd87e11064c0 +3774,a96e6b9a36a2611b +3775,7798b106b703baf0 +3776,0d40d41b1c8040dd +3777,87000fb54f885e02 +3778,2d34a2c0c6ca4499 +3779,1f335ff9040f3889 +3780,e6086dd80d6aa835 +3781,63c01a84006ffc40 +3782,3da2e1a56529e4a8 +3783,e79a0726969775b9 +3784,30a8447be740986b +3785,48609e5ddb241ff3 +3786,d756e35e43d8435f +3787,0eb0bbfabeae8847 +3788,be520384afd970eb +3789,0f002e41bb381485 +3790,2a2b761b2e892d4d +3791,f342412419ade4e9 +3792,c88e6c284fd619a7 +3793,9ef8b5c35a5035d3 +3794,0e58e0d1a6cd0a25 +3795,7b5aaba723642c7d +3796,bedb380a2d0ec269 +3797,d632e6a54e5e5cc7 +3798,ba72b86ef4818c51 +3799,7d36b864573ccea4 +3800,23b2fb2017c66f64 +3801,1cf7177caeb659f9 +3802,85c08a55e33df011 +3803,813be75f720c7495 +3804,525e1ceaf0161835 +3805,acbaccc2e0b1b74e +3806,f434b9575ab85a04 +3807,206664d1d190237a +3808,e25881c48fb3531f +3809,09eaa39691310e96 +3810,8dc3d714075688c3 +3811,c52aa00e23216049 +3812,c3716417e3d4507d +3813,fc6a4152c1f4e9cc +3814,3d0849ddda129921 +3815,248023eff473ab3c +3816,19d3de76c066d241 +3817,c2f80b9f579ad9aa +3818,45aa3329823d91fb +3819,97c7a13853ed8674 +3820,824ad46664431bf7 +3821,f605315c64412667 +3822,ef737d62b9afb2aa +3823,80ba34349773064e +3824,d1289497193ebefe +3825,ffe8d2f1b5e350c9 +3826,98b322c315e7d1fc +3827,5ae568d7f4258d16 +3828,82fd714b3dc96953 +3829,6d49c2479aa800f0 +3830,852278cce7014a1b +3831,15fdb3d840ae9e43 +3832,c4d44a5a82e37503 +3833,107fbb3e8a587584 +3834,89a240989b7db256 +3835,c5f76a2a7e9f30c5 +3836,e1606c337757e3ad +3837,955ec72d4a9eb55d +3838,089beee187215886 +3839,7c39883175ec9b0e +3840,59a28e104a1e839d +3841,c172e0fddc7f2523 +3842,44f17741aa57ef63 +3843,09911a03ec66ec6b +3844,19fad3f9991d1899 +3845,2460f99c496aac54 +3846,36864389a25c6170 +3847,859932e85d710a11 +3848,8b3f76ff08426e51 +3849,bfb5ca48277c857f +3850,e2d5d5501c36079b +3851,87ca40d772d974ee +3852,843ae889066f1ea2 +3853,d8e1cab425d69ca3 +3854,3afe14bd82d88423 +3855,5f9cf1a85d245364 +3856,9df378b192cb5ecc +3857,838717b07f5b20cb +3858,1058e5bfa18a4bb0 +3859,b315ebeaa00f223c +3860,283c95ef0b660ac0 +3861,cbfa77759678841d +3862,b7e5103d14478e85 +3863,af8c03500ffe5cde +3864,aae545e835602da5 +3865,d75712caee5929fd +3866,bb6949b737303970 +3867,86d63df86922552a +3868,7fda75d8ac86727d +3869,a35ef38b71dccdf5 +3870,20485138b3d9c24f +3871,2a1f00fc841b414a +3872,bd57e7bb40218453 +3873,fed6eb7c516bd30f +3874,70aa52b4d4925bb2 +3875,7ed4af9fd55dae90 +3876,046456b1b53b704e +3877,b8c09fcd17b5f025 +3878,6de20e4cd4a7cb83 +3879,f4cd766645d9d8a4 +3880,2332defcdc37e457 +3881,7f43cd10f9a8af16 +3882,5b23707b28e8bdfb +3883,0610eca5f0de7550 +3884,d3b9dd68e51ecf9b +3885,a9e76003365cc248 +3886,f3ec575749ae545f +3887,f7459fa068c2a779 +3888,c7e86e1af2d7a769 +3889,497fe4a500f443f6 +3890,5916bde3e1b3fb75 +3891,21b949ae6a2329d6 +3892,133eb909e26741cc +3893,1f21ef09f5d776f7 +3894,5ec7290beb22bad0 +3895,228d4296c9f70747 +3896,99244070ada90f7d +3897,2f17c1b2dee4a88e +3898,9a548b189cdf9f43 +3899,ac6f25409acd2e85 +3900,5c40688667fb3732 +3901,ad9215bca9bbdcda +3902,c202e6856eb4300b +3903,a6786190d4c25088 +3904,952a631f552eae3a +3905,af8ad24f221d256f +3906,3904f4e8305b3e76 +3907,bd8423aa7ce61d63 +3908,d62a1bd23abb0767 +3909,cb16992f4652e6d1 +3910,86a3fcb595411931 +3911,94a1d3c2c48e2b35 +3912,ddbb950c24c89735 +3913,2880bacd0907bb48 +3914,70290eee5960e3ca +3915,855e0d88a6bdba53 +3916,d70d8dfdda6f11bb +3917,92edebfe496b71ae +3918,a771b9762ba9492b +3919,bf628ad472d0ba2f +3920,ce62e36781bd8b1b +3921,8831baafdae6efb1 +3922,56a2f085cc7d177d +3923,cf73e2b38203b913 +3924,99b0a141452f742a +3925,3195f933243952ef +3926,d4fed43d7c01ae4c +3927,ccf2e772767c6e57 +3928,8f1fe4ab4ed8a895 +3929,a793278796650c4f +3930,53e057c89564fdb0 +3931,f0b5543325dbecc7 +3932,3d7f46333ef1fb63 +3933,042a324f7451de29 +3934,98092ffb29d3aa4d +3935,fee978ef5c7d322b +3936,7f71164abd141db7 +3937,c565d0dec51d3080 +3938,6aeb3e75048a60d0 +3939,49b897dab6b6cbf6 +3940,7655f406fb7d08e7 +3941,ec8ec72dc40ea63e +3942,bae9e42bc48cd031 +3943,c16a377f2133afc5 +3944,28befdce3adc552e +3945,2203477acfe5fd2c +3946,54f1428d4d1b9ec1 +3947,4e398c718fb472ee +3948,f5047884184ea22e +3949,1a249ad0d6f1f37a +3950,4e056fe2b8ad6aa9 +3951,a235fc0112394107 +3952,930d883cc7c1ab57 +3953,7dc9fde874ae08a6 +3954,d31190b7c1bfea37 +3955,c424456349ad31a1 +3956,a97251c5e00bc0ab +3957,603e66addd1710f0 +3958,bd727e28df66fc51 +3959,aea81aab196df4fc +3960,33869a7f1e65da4a +3961,7bc7eff9a2082be7 +3962,285a25bd7553fce6 +3963,7ff6f29d9a4f0307 +3964,8eddf0ae2165f964 +3965,bcb20c5a08bf0e52 +3966,8428eeacf87e56a4 +3967,644b090810ad5841 +3968,a58f070095f70788 +3969,2ccf642d81cf1a92 +3970,0d70dad6752dd792 +3971,3f8355855622a54e +3972,9e22fa35a67eedc3 +3973,a157d2bfc8cf69da +3974,10065122e9ca78b3 +3975,71c7544e63d21db3 +3976,950d266ccf06b6bc +3977,841bda9c4b36e79a +3978,b4becd02fd55229f +3979,80383374ff759dfe +3980,16b069a4197d9ca9 +3981,081d8284d1461ac5 +3982,129f1787bb23ac33 +3983,8315c915352056eb +3984,0e90ebbf7c6d4896 +3985,e50afd966122f35d +3986,fd315bb718fa9682 +3987,e88f5384bee60e8d +3988,6e05ae72ab8521c0 +3989,b893888c9b9eb543 +3990,4fa0ccad4fc6e0e6 +3991,28651c49f7965db6 +3992,699c7ffe6aaa948f +3993,6d602f70b286e973 +3994,2edb297a91478583 +3995,f7cc646382a3b68b +3996,f9868d98c988b7cc +3997,f693c6696e186227 +3998,fd8c8cae5e63c1c9 +3999,8ad94aedc36187b0 +4000,b929e7849d9589e5 +4001,f1c990159951b322 +4002,f249ae286207f161 +4003,8425b6280ec305c0 +4004,07599d28a50ab3a7 +4005,9567cc8db8a42980 +4006,7e1e1fa4098ba2b3 +4007,486ccbc1fe2a624b +4008,2721fbcc7fd7cf09 +4009,6ba70ad031a94794 +4010,a66215cb3d6142bf +4011,7b8b566a0d938387 +4012,f2a5d02f1974e18c +4013,524d817560840151 +4014,27b29ee45c4812d3 +4015,996ab09d885e2edb +4016,bd73af0b16a8d9dd +4017,04dc085f1c6e83c0 +4018,7e05dcc1415e1c92 +4019,d80af2d882e02054 +4020,a1918efcfb301a56 +4021,0dd9e59c0929f906 +4022,1d01ad5d6dd3328b +4023,917c7ef5ff1fd531 +4024,11515e156f3875d9 +4025,a3d00fe95c0ed8b9 +4026,fccdcbe4382a3a45 +4027,a2addd6538d15f78 +4028,1b02126a3e6044a6 +4029,f22c74ec1acef52c +4030,0dee3b8370eb304c +4031,70dca68eddcaeab2 +4032,ca594e783af6cef9 +4033,13653b50e6642a55 +4034,17d5b0a5437cae64 +4035,9c0163746d5a921d +4036,5c4e47e2b7e05748 +4037,0a2458d46a7b4af2 +4038,03a15d4befbf1209 +4039,e59a0c84e668be40 +4040,afbef8ed98778e50 +4041,bbc54ddd1427a77e +4042,14c98898bab1662d +4043,f2d611696d367502 +4044,47bcf92c1845a421 +4045,7ce3b5cd955aaf62 +4046,e5c95979e4144bc1 +4047,2e7367a9a47fe83f +4048,85a85e174d8ec9e2 +4049,7d32f4f667ce95b3 +4050,bc4fad4dde7210e6 +4051,7b274b033cd0b4dd +4052,130212fe493c152f +4053,88c00e177254901c +4054,020ce5b98f9a39b2 +4055,2f514c9168e19f48 +4056,a296a171267be75f +4057,f43a26f949678402 +4058,f5e9666c543a5973 +4059,1960fb9d841dade8 +4060,aa52c65f4e02bb91 +4061,4ea3fe47848af330 +4062,088a9578f6446f9b +4063,0b3fb70e6c527089 +4064,86ac4f78af8b384d +4065,1059f8e1ce42bd15 +4066,de20f50be3aac8b7 +4067,dd011d92c41e0984 +4068,8b765bc21d61a1fd +4069,f6b66411347fa002 +4070,038abf2b5289bfef +4071,505c64dbb013898c +4072,f0746b4655f51304 +4073,2c79fbdf790b767b +4074,b607b1978f87f309 +4075,05c9fa82ceb5360a +4076,24d154b89b8a7d85 +4077,b951959b03a12e25 +4078,9026052512722877 +4079,a4e1f088ef24152a +4080,6f6e2338a4328c8a +4081,a8c642b9a42ec6be +4082,01ea091c231a8328 +4083,2d55d629ef7710cd +4084,45c6e0c8246dfde5 +4085,b9b778e119082fde +4086,8da1c19b1ad37e55 +4087,bd4ac7f563c68bb6 +4088,1ef77d77cc9bda4c +4089,e83fec18f2ceba65 +4090,7c4421968f259f25 +4091,d68a4cd91d6d2871 +4092,adccfa7a35edf44f +4093,293c940822786963 +4094,bb8147ae3e4f0f67 +4095,d4037a4b61dd1b34 +4096,49fce9fbc8fcd630 +4097,2d7fee35b4829c59 +4098,0bcbb2b081fb5035 +4099,683f743d9a30faac +4100,8cb60134b5cac243 +4101,78d106caaa7e7bf7 +4102,621181f6e06c8118 +4103,e0c8d9e302d52c2a +4104,beaed32ea3a2ea15 +4105,7d4be42dbffe4f26 +4106,15f72920eaed96f4 +4107,e7eb7a87233f4039 +4108,036e168165e4202d +4109,2be3faff8411f20b +4110,78a8e10cabcb518d +4111,8799009289058637 +4112,c3935c21fd1b862b +4113,bb797f7555dd9b34 +4114,007349bddce95378 +4115,047af3447b3e6211 +4116,5fd182a9770e73a5 +4117,c329a3103270e741 +4118,76a2eafa8f78ce87 +4119,970010ee106540d4 +4120,e631b15e5a47472d +4121,64a99c5273e65e09 +4122,4caae89bc7ad0f3f +4123,8f95a9a4f66ee673 +4124,21697b722f949188 +4125,4a947c7a2051bafd +4126,ef0e5bf9d5176623 +4127,63db026d9a45aedb +4128,ea2fe807caffafc1 +4129,3a02d195dca6c7e9 +4130,9529d17f1ea46421 +4131,725eff37d72549c1 +4132,944d100a5ae9d6c4 +4133,5542d3102fe108aa +4134,d387b9403b88b29c +4135,fbc7261a79abdd10 +4136,d766f088a7a21a9b +4137,3e9a6ca010c1feba +4138,9be88ed9da80001b +4139,e8334224984422cd +4140,8b12512955468589 +4141,fee02c32774f875f +4142,fb75bdc40ecf748d +4143,307b890433f82118 +4144,4dfd27408a31513d +4145,e98d63569149a956 +4146,03d40a84e41fef8e +4147,bf8f362a73f70751 +4148,bc77a2b6d98a15f0 +4149,2bee23c471e9a53b +4150,6119ca26545d68f0 +4151,85c0d26d44d2dc6e +4152,f6e7faea3073db73 +4153,db9e935999cac044 +4154,e580177ad4d3fb3d +4155,ab49d36a09b42850 +4156,6edb23db7e6e527c +4157,c9e5421815248df9 +4158,5387bd9bcbb8c86b +4159,5851f673b965cc38 +4160,557471e08a5ca1d2 +4161,fcb6086d2152817b +4162,7f63de41e0261158 +4163,3319a18f76f5b9bd +4164,13cc775e1ee4ee6c +4165,d651abd484e8c84d +4166,429fa59ea3e2cad5 +4167,fa651111fae4d343 +4168,48cd47f99e46d53b +4169,ebb722f19df72ed4 +4170,be7b3261f766d0ea +4171,7ebda6ac03200376 +4172,8d517dbe7dc5bb3f +4173,0138b6d3b3e9a9e4 +4174,37d3fd8a3a8331d7 +4175,1eea9839349596db +4176,887a166a23075ff0 +4177,5afe33ef885a97f0 +4178,1e6d51bf47417904 +4179,b225f566244fc438 +4180,fb180f875432d26e +4181,78a1b0d2edba7673 +4182,a4f40f7c3a81e4f4 +4183,8ad922ec81ee3ca3 +4184,2415dc6757843d55 +4185,dfb5c14385d861c8 +4186,d0582fc756a52fb4 +4187,78ef2924c25a22f2 +4188,3824ec177455e760 +4189,7ee3b5ffa56d2cda +4190,73da1be41207ba27 +4191,00579a59ec832647 +4192,a7667fe04b4c2487 +4193,39fb8f6821237537 +4194,928a516eb8024d38 +4195,9dbcb9ce9225b1b4 +4196,17caa37fc7e13e7d +4197,7e255f3996594e14 +4198,b3fb8edf2f65e3d7 +4199,9aa230f217f00509 +4200,2ce72ae81a9f703a +4201,57e45e4d3e59e888 +4202,94c2b42b51572d5c +4203,d0912d9a07ba9728 +4204,2c58495aca8cee65 +4205,a30cb09e84948c10 +4206,63a9da94164c045f +4207,f692c56ae3cd1f4d +4208,f1fe587777ce7b47 +4209,546da752eec30371 +4210,a94d6c5ddf5f1e96 +4211,c7304c87495ae8fa +4212,a9c7a51e0e394947 +4213,8d7b12f74e6dcfbe +4214,aa941ee9aae79a68 +4215,218815802cb498fc +4216,3c364702c6eb4bba +4217,f79ca35270d0aab5 +4218,af3b6b84508a461b +4219,90bdc4baee6a43d0 +4220,51c9f7bc58706b11 +4221,b65ddee453a31f86 +4222,467eecd604a26f41 +4223,77e35bc119d37cba +4224,d9cbc287df5a8d2d +4225,179927fc34d29ba7 +4226,fcbf789fbea4b1f2 +4227,3151f0fee8ab7688 +4228,ce1b341e4e9627ac +4229,5dc50ddaa77934cf +4230,74b1124cd8604a9b +4231,8a73ff382a0a1290 +4232,a0dd61d6bc40e401 +4233,48dba9ed4367a2e4 +4234,6acc236e4b200f81 +4235,8a32bdb87379160d +4236,5d48bc3a729ab87b +4237,3f9382f5c3d8cd2c +4238,774f52fedd1d4828 +4239,2a7c9961a7dd9f35 +4240,c2af61461d284850 +4241,e8ae50e7ccd7aaba +4242,f9d29609b770b1d0 +4243,66e9fa3d87c7c21d +4244,054df2f1de6f3c4f +4245,e5d5863daa093fe1 +4246,943827b5e2911106 +4247,c00e6c1166f236ac +4248,bccb4ed1c868e8a5 +4249,f85a67229b08bc1d +4250,1c2ef49642d50479 +4251,7edf9dd25441b0d5 +4252,155e5e281c629aa4 +4253,842feb790d8b4e84 +4254,abc3b574961d4acd +4255,72e40fe7dfbea8bd +4256,16f84c16485be077 +4257,8e5759fda24490fa +4258,e1f831b45b63f0a3 +4259,0a173e17c16bc89b +4260,f08f81e785423bb7 +4261,cb398bd2b950c06d +4262,678e5ffb1a2495c5 +4263,d3ab6bf9f540fad2 +4264,abe5ee0405c05a57 +4265,9e07b4b2988246db +4266,4b08878fb06494f7 +4267,887666fa64e8d515 +4268,db7ae13690ba4709 +4269,148a2259fef5554b +4270,fd6dd7266d10778e +4271,5bf05fefc773dacf +4272,4aea1a12a3b2038b +4273,fa636c84ec70934a +4274,f33c8d22cd5cc996 +4275,3903803598554b32 +4276,d7d3efd6765b2f33 +4277,1a3fc0afaae7cf7a +4278,e968f1436c0b9006 +4279,b5edfd10ce754494 +4280,3371b29a7158f765 +4281,1977e267edd6c113 +4282,e69ea260c5e04f66 +4283,d8173007427f1b9b +4284,96ccea01b7dc4491 +4285,de528ad5a96632dc +4286,774eb2a7e8d39c9a +4287,c827e1d3910b574d +4288,7fcda432bee82082 +4289,80bc9e4175ac599f +4290,e5f1933e1ccf703b +4291,10d3a1b2ca929d0d +4292,26e270730ce09a0a +4293,cd13dc95a704bf4e +4294,db389fad00acc6e7 +4295,cb3ab0d1c665445e +4296,395007c736cf3fee +4297,a1e3939a7627e34d +4298,d900184cde0a3948 +4299,beeaa93cf8735107 +4300,6c03e8fd6cc85b83 +4301,67e23aba6d135903 +4302,6d552f60628fa3d5 +4303,719da5535f95dc60 +4304,7b6a286fae3225a7 +4305,ebf94800438df6fd +4306,fe6a448105d27931 +4307,19b85ae6df0f3b94 +4308,262e50aac9ca9a54 +4309,5e6cf9b1f49b056f +4310,eb43705ff1da8363 +4311,456844d126eb6ffe +4312,7bb4b91abb13c748 +4313,6cb4e185cba43366 +4314,46b09107886579a0 +4315,295e3d044694ab0e +4316,c1930d35ca6bead2 +4317,f0f73571dd349065 +4318,761ba7dab2115456 +4319,9a11414c44319754 +4320,5e486faa73a7f739 +4321,a2a31b5ab2330c15 +4322,2623025822844497 +4323,906528b960424cb4 +4324,e190ffbd4f5d3d30 +4325,d62ad941068f1020 +4326,e0af2fc3d66b7315 +4327,0ca7df30d6cb6eba +4328,7c379d909812562c +4329,b08b1c6062b627ef +4330,17ed188a0a844b7c +4331,bfcc3ed068be12ee +4332,de9a59949706c1ce +4333,b856dab1964f34ff +4334,8ef6a93a60f6176c +4335,2ddfa23fdda3fce7 +4336,d09ac9e8dedd0f3a +4337,119d1daa3d669c5f +4338,5d21d3781ac099ca +4339,eaf4c565afa37a52 +4340,286b26955a7b159b +4341,242f5803105dbef1 +4342,c4a4bfb1cd597717 +4343,1b9e4612ca865fa4 +4344,865cb4ee7c4cccb8 +4345,56aab1315cd58a10 +4346,553af1febacd9e14 +4347,1ed525e0bbf4d733 +4348,60e6df12a3d7bf2c +4349,fcc28567514187f9 +4350,27333a16a97520fd +4351,29ae5aab0b9695e1 +4352,eefbe8034ac29041 +4353,0ee2ee6cad126f67 +4354,fb5eed25ee88d318 +4355,cab7ce39048723e2 +4356,61aa57d3b40d7b55 +4357,9156b1cf77b861aa +4358,9ad24e6bad15dd34 +4359,ea3dcf35ad79d26f +4360,e8b6321d4c391214 +4361,0a2324506d16df12 +4362,e7162c4aa75034df +4363,748a8dec406e0c3b +4364,1c5fafe3bad4e980 +4365,164e7e956511100b +4366,999ec77332442030 +4367,5a78e91cfe395ec3 +4368,cabfcedd992f458c +4369,e2e33e636dd3ab9a +4370,c8eeaffdc76de688 +4371,6c34db3b28a313f6 +4372,2898951641f28df3 +4373,bcf8a2dc271c09b1 +4374,30a926eedfa9499d +4375,b6f603a7c8b895e0 +4376,1e2e403e9dc5e078 +4377,baec24fcdffab2ca +4378,7f9aff03160c1b2a +4379,6fe94751c0395423 +4380,1a95c00277d28ab1 +4381,949c7c11dfdb6209 +4382,0d04c10f5274df5c +4383,bf4db6fb5486ca13 +4384,f33f5a09737b956e +4385,98235ba470855b18 +4386,35fd1167532d1182 +4387,1a2e83d40c71d6bd +4388,811678b2e23e53fa +4389,169a9e9353e08e46 +4390,97e17b823361afed +4391,5a97b8f25aadf6c3 +4392,73846fbd7220d1e7 +4393,31771dca6e6ed601 +4394,abdd857b1fc05445 +4395,06fb4f7a79623b6b +4396,35349fe9e1a67c5f +4397,69976cc1cef0fe1d +4398,4ce817bbee20af66 +4399,7bee53e925b6774a +4400,f7ef2e35b44fa8b1 +4401,5b1466fd6a28e04e +4402,27e9c68ee7075822 +4403,bc2ebcfd6a94d427 +4404,aa4a7f50a7c60ad6 +4405,28e5898e1c03e2c8 +4406,a75399cff2e3c8ac +4407,b0ff9ce210c13cf3 +4408,ba765be84cf63e13 +4409,a7b63197992b522d +4410,547c98a4baade34b +4411,8310ff52fb91973c +4412,ea0baaaa260d7b59 +4413,727d4c7a6e8fd9a5 +4414,1d6fd821bf4214f7 +4415,0cff8723599eaad2 +4416,4136d946c12ca134 +4417,ffd3add95a320611 +4418,7d6390a57c7012d0 +4419,3be1e8e7e16783ab +4420,3bc5d937a9d9241f +4421,db1fdfec5e64efd8 +4422,f5eed83fdd938003 +4423,a5ed934a2da92491 +4424,95a56ead8b6603d5 +4425,2400358b00e522d0 +4426,4ef26fac04411031 +4427,10b5c7828133fbed +4428,107a60ca2d3ac868 +4429,bb8e4245af97930f +4430,b31d5df8ceac644c +4431,91849b36b8a6607d +4432,a62c971d88d9f7a4 +4433,1b16a61c742dfcf9 +4434,387047580f410c4d +4435,9b01bacf7ef43ef4 +4436,87f6737b59db35bc +4437,9a6b1ff8882a07e6 +4438,b4b15350d4dad38e +4439,bbc601a6c9fc0e89 +4440,23c533df2b82860d +4441,100c1025f02c002f +4442,ecb4a26c9aa6ce75 +4443,7c41d331498d0393 +4444,f8790dd2d28c4a87 +4445,729319965a79a335 +4446,1bf18ba3800c6377 +4447,063bd72583182d5b +4448,a62934591e5f2507 +4449,8171af7f8f6a0f90 +4450,3d1424ced698e547 +4451,3ec7b406a76014c8 +4452,99b029c22448f277 +4453,40a61a0370289588 +4454,7982cdf2f6da1f90 +4455,0b911144699bf710 +4456,c9245e0774643a20 +4457,545395b9baf1c8a3 +4458,05a125a6e9ae3ec0 +4459,50395ff78fca5e71 +4460,dd4c864dce18176f +4461,3f4e1001842f0794 +4462,038f425c6056a52d +4463,46312377dddba038 +4464,d4411e1b271441ae +4465,e85069e3207a430c +4466,54fe712eed3f4435 +4467,ef6223de9a833514 +4468,58fe46728cd5c6b7 +4469,0a88f591c847a1bd +4470,bb48f32788cbc0ac +4471,5a865d7efc91be3c +4472,e1b2e9b3a9cc2a6f +4473,80df38ac21d2e13c +4474,afac4bdfb3ca55ae +4475,5014bc797201de31 +4476,77b233f54fbe1546 +4477,ac4eb8b9d63a2d60 +4478,0ee7947f56baf3f5 +4479,8feaec907c28913e +4480,c048ca22e2ba06b0 +4481,c21e877dd493fd09 +4482,c7133d48c3c2d94f +4483,f84bfd2ee986e046 +4484,bc524195bb60c6f4 +4485,59921f40aad70633 +4486,54adfe8cfe171f8b +4487,6960d7c90d3de79c +4488,66a31aba8c63e574 +4489,86d1a64406d1c6d2 +4490,c05efba4298453d9 +4491,ab6a407675ace771 +4492,e483d661a17b26e0 +4493,c89178bcf15d2fe2 +4494,5e9121f8571d2742 +4495,59ea7a7b48dcab80 +4496,abbd2fe8e565917b +4497,7731fec9b7cfc36f +4498,f763b79d949ed065 +4499,d581783a43e5c358 +4500,cfc7fdebe6cffd9e +4501,4e94ea4064c5cd39 +4502,101e9f71d5c2433a +4503,bcc2e39235c4907f +4504,6cb124eaf9100d71 +4505,f80e8e3560b179fe +4506,e6e28bd4f1c6c62f +4507,e6247927633e5277 +4508,e5a622547a68935e +4509,4a53060be4cdd507 +4510,608669e25cf8a7f1 +4511,f4a14daca7e41411 +4512,ea610f65b38fbfac +4513,9ba83b7a2b780d87 +4514,05946ddbb200a3cb +4515,5c05725e50e2171a +4516,3845124c811cab53 +4517,6e245d256d55ec31 +4518,9e9b5064f52cd59e +4519,dd49ac8bef27c503 +4520,31e0ea23f4fbc19e +4521,a7659c7280656276 +4522,8428dbab6689be90 +4523,187ca0ae5d65fb8b +4524,4e8e24b95c8f81a5 +4525,3e044b6bbebdad17 +4526,cb8cf3bbeaa45c41 +4527,d8c69c03b4fad4ee +4528,86818dceda69e982 +4529,4427025a9d2edd5b +4530,05146eaee912359b +4531,0379812ace3c8b2f +4532,c3aea49154b88ed4 +4533,196e7ab05b6f0846 +4534,2e330f0e6ed43ef9 +4535,c63a1c24ed900e7b +4536,779ecf6c85c993a8 +4537,cf4a3bdf660f27c2 +4538,1a2a2a3c7f05a30b +4539,51b56e1c003134d3 +4540,110c5c2e2bfbdb6c +4541,beb7a39414f8f4bf +4542,a7122d3d69e6c760 +4543,8ac89448160fb334 +4544,3b5994812c78fd8e +4545,1b54552fe5292551 +4546,7688f4bb7a767ca7 +4547,73c7ad853e800482 +4548,125a9a1bc79bc4a6 +4549,1d86628201f7413d +4550,d9a01909fec6a089 +4551,9aa5b306e78a53a2 +4552,f3a4a17d2bd489c7 +4553,ca71ec6a6d6dcd52 +4554,332012cd500b0210 +4555,b8d941fbcbb5ecd2 +4556,0f16cc4fc4c3348d +4557,de0a6197ee91941b +4558,e3bb17a35ed3946b +4559,e3526935c4d97aad +4560,2459839e69010e70 +4561,76f33f21b22b7303 +4562,69be0a6d5f5b3bc9 +4563,fa1d1e308229e8a0 +4564,9a096ca1777e39c0 +4565,04a8958d15abd5f0 +4566,52224293842a35fb +4567,d6db04f533db515f +4568,e7d82d5d71e30f88 +4569,0614432ead6e0f95 +4570,256191c716da2e80 +4571,747f4dac6dce1ed4 +4572,a92710d70f5f7596 +4573,152a9279a85e9d23 +4574,bda90fb9ea73fea0 +4575,82d33b3d47aac885 +4576,9e64431c283e4440 +4577,51a15949fb60a2ac +4578,a8197dafcac4846b +4579,7a04eec081a0eedf +4580,c7e92dfd92e0867b +4581,5901a109a8afeb16 +4582,48cfa8d7451a65c6 +4583,9578214b908894fa +4584,8ffd83b1b7763035 +4585,61faea8fc2ae1625 +4586,2223bdfe79f1d9f3 +4587,fe1303a7f284d6e2 +4588,682ab565fb0f03e8 +4589,5037d01e1053af09 +4590,49676d7b5cc58246 +4591,a50b8b85ad13ed3d +4592,2e5a3f671eb79c5f +4593,5873fcb3730a1db8 +4594,3063409a2359ee02 +4595,2fef5d0b9994d57c +4596,3ec6da5630355a08 +4597,136132b87b5106be +4598,1bbcda582c41ba99 +4599,d3811fbce46b5632 +4600,bdbdfe65ffc73d5a +4601,ec89017a3439fee2 +4602,d96d1a0d7d56c07a +4603,7e3e55ca344b2e27 +4604,356116b00df251dc +4605,880b6529a639a75c +4606,ee58f028bf17e859 +4607,dba1acb77b483de5 +4608,038d2185957ef3de +4609,299b60bc67909f8f +4610,e726912a4f485dc4 +4611,d83f299be8e88dfc +4612,4af9093b724aa896 +4613,681a059ad4536884 +4614,938f1247654f3c21 +4615,e45a7cae89621427 +4616,9bca25acda8cc401 +4617,20c969513d6429f6 +4618,140f380dfe0fa744 +4619,8cabd187f9333ee6 +4620,8522b602361cef92 +4621,30d6aea1233f78a2 +4622,6f053a54ce67b80d +4623,27c6cf7ee217361e +4624,c71d8c49a8828bc3 +4625,a28e591d9e9c5061 +4626,14c74ab7147722d3 +4627,08d41b2cb50d75d8 +4628,e147c188aa322eda +4629,adf32af5aff40ba9 +4630,bb3942bac8d55dd9 +4631,2dc934df4e2f443d +4632,0117d956f7eb058f +4633,b30a9a6b001dca8f +4634,a9c3f3ffb7fd17af +4635,e82e60764e5188e5 +4636,2f9336240b33d365 +4637,c851d662a861bd9d +4638,c3435ac8a2a4426f +4639,6347305148f231d7 +4640,2fe701deba6cb867 +4641,5e5837be783a73b0 +4642,4db8d2101ed5144d +4643,9b5da66c2d4585e9 +4644,e239bae4b7a19760 +4645,538f99c6772a301b +4646,6685baf69e424a00 +4647,a118132c88552cea +4648,c4cbf3cc2100c940 +4649,06511e1dd7365d5c +4650,f8b66ee83818e05d +4651,3eeff11c3b005d90 +4652,851b8db5406dc11e +4653,85b5faec93765a15 +4654,4cc4c6d58bf30346 +4655,a4f552b7413cc9af +4656,3f87b5e35688d29e +4657,a3d022d090d51e36 +4658,8a3a5b904e2abfef +4659,3dae8eb4e7d90e56 +4660,84c00942aa12ab88 +4661,98c95debe66ad1bc +4662,cfd8c6f975ae8602 +4663,dd55d27644baab4f +4664,38872b99b363f502 +4665,6d96a6a7eeff60b3 +4666,22d281424302a2b0 +4667,05ea895d79a02e5e +4668,feccb3927d2ce6c9 +4669,56261cc529e427c4 +4670,df50d582929ca46c +4671,ecf731f0c2f4e3c9 +4672,633f5bd8d7c33a69 +4673,a6dc04ba02cede17 +4674,77d075688048c20b +4675,cbb82a51d4000b4c +4676,175b7db6d6e81b77 +4677,e01f3fe4cbbef02e +4678,84889af50fd2e9bc +4679,b7e95a91f1cfa3aa +4680,88d0611a21be49cf +4681,9af8b351f3d97b6f +4682,601bdec673c89c5f +4683,a5a3e08b512de268 +4684,be181afcf985519c +4685,d7f601a106762463 +4686,50452d518e6232e8 +4687,2f72a4245fdc1f6c +4688,aa167277f1c47fa5 +4689,467a09108e9297ae +4690,a02cca51db733e03 +4691,4a5e9bd930ee0831 +4692,fd19d37faef969ba +4693,b1984059ef36f0f2 +4694,61d329f3d634e02a +4695,75c6ffbb49db64ce +4696,84f47329d3c05101 +4697,eba236f8a52683f1 +4698,9827ca8e421628de +4699,defb88ad98f4d14a +4700,cfdf726ec536fc46 +4701,7bdfdf2474c4f153 +4702,9096351ae6324c2d +4703,d68796ef4a6e25ac +4704,ac975eef1e464577 +4705,5907209c7e8ddf5c +4706,565db2d5c7bb40d3 +4707,e18420f31981ff49 +4708,5bdd0cec9fbbfa10 +4709,20c66e4809212915 +4710,d506382abab91983 +4711,3b8aca5ae42a718f +4712,3a092b9298684ebb +4713,d269df74b746becc +4714,cfe74201e0b17009 +4715,f4fdd646d01b0bc4 +4716,04559b5512238eb1 +4717,16b13ff71f2841c7 +4718,2239ec3dc0461d71 +4719,ef5907f78c820f5f +4720,0e22fac8d2c04179 +4721,8cbfc05422bab10e +4722,564b07d944756553 +4723,7f0bd5cf7bc96e7d +4724,9e9eb0def67cd256 +4725,1befa8c7deb24615 +4726,3accd24fc35ca59d +4727,747677872b05c6cc +4728,cc5d8aab6465fbf3 +4729,2a23ab828307b432 +4730,2d2513fcc823f6ef +4731,b3f2d0857ad25006 +4732,3053676d5cb3bca6 +4733,b4bdcfdac480c6c2 +4734,778fb84bd76d2380 +4735,ec0281fc4d1de3bc +4736,1c876b6470d26136 +4737,b773ee27d308828e +4738,8891986ae439fc7c +4739,174fa82943783c0a +4740,e1205f0c585f354f +4741,2127728c7766f2e1 +4742,560761f2e5f8095e +4743,043da8113f473517 +4744,ebd889c49348255d +4745,6f0baebabaf067d9 +4746,f04a84af53b108d1 +4747,3f5b86affbda681f +4748,37a8c31304529e30 +4749,2e524451916921df +4750,573cfacb6c2ea677 +4751,89b7a707342cd5d7 +4752,7fdbba4ff33f87b8 +4753,f3aa47d4568086d8 +4754,c1ba4e5e180a2583 +4755,6577fc98d42c4fb2 +4756,29ac566b0f9b71fb +4757,e79fb1fa8bd6bfa0 +4758,890404637bac069b +4759,e80587cbdafd22c0 +4760,ba54f067bc81ee49 +4761,9caac07ad481d70c +4762,82b909c8a08c9077 +4763,44063e7e80f1adb9 +4764,88bc49db2ae47893 +4765,5d9afd373bad0365 +4766,c836bc68a81614ac +4767,05a6cce173cfdb6f +4768,05c28584867bc802 +4769,33179457548a0942 +4770,278056a4608f0760 +4771,a0cc8014ee88b117 +4772,d576d148f0f9b418 +4773,239b2c01d97d892f +4774,4608127ab84e4fb0 +4775,8ebb844e0938dff0 +4776,328b6939db24972f +4777,cbe2a6d04079acd0 +4778,08de3b880507a8fb +4779,9712a50bcfe34caa +4780,d1c644c6d3933c3d +4781,219c309a04f0b6ff +4782,8e67a9572f3581b8 +4783,1445ebcdf9ef206b +4784,c8f4fe2ff2357c17 +4785,3b12192d002540b3 +4786,811c52cde463e224 +4787,03d2118e3eabcd7f +4788,0b77249cef1b5ce4 +4789,68f17d3cac2b7cc5 +4790,0833d2c564ff61f7 +4791,e8db2f13f34f6b6d +4792,2cbf1a1029129126 +4793,124f3d510befc017 +4794,2715045a21dd434b +4795,bd62f615792c4ff8 +4796,5759476449c9a4ec +4797,dd833e37319c6d21 +4798,6d5b17f5effc1dcd +4799,5d463a8db7e7551f +4800,f8a9b1b8912dcf1d +4801,bb841db1967101c8 +4802,495d38a95df02157 +4803,637d7ffc53965c61 +4804,404197ba007e57ae +4805,ed496d80d03307a7 +4806,465cb6d83c983683 +4807,9ebf7b0c2e35f660 +4808,266dfc717cbdab76 +4809,3078821cf721d984 +4810,43b44c4f7f32fdc1 +4811,90df52af896c6014 +4812,83143ac30f81f4d8 +4813,1cb4dfa4eab125fb +4814,3806d59707702562 +4815,c82cbe1160a5fb3f +4816,b485e90dbb20809f +4817,206cfc8eef5ffcb7 +4818,c3af15a5302476fe +4819,894958b50bf415b4 +4820,1c997faffeb32f84 +4821,116a629ce9d8265e +4822,057f095601dbac1d +4823,76f6a6b3c54baf28 +4824,fcc3018c6ce125d4 +4825,61d453f728484905 +4826,cfa710bbe6fb2e52 +4827,5bb78f7816d97366 +4828,b52788a6167c24a1 +4829,ae51bf59636e7f7a +4830,17afde9462e2f09b +4831,aaf2011fbe0af47e +4832,ece6768873384f1d +4833,c1d2929afc926ea7 +4834,150bd2c945efe137 +4835,c88f8f531b51d3da +4836,2287efac4c18feab +4837,8c336d30f2a0ba9a +4838,619517f38f50c5fb +4839,ea78eae34d5f4242 +4840,45e2256ca2fb5ebe +4841,88549e29ccdae2c5 +4842,21750f6fc9d636d5 +4843,97ac7447e82b420a +4844,24c9a2a2f93a2531 +4845,1f960470c58da614 +4846,cfecf393f10763c2 +4847,4678aef257c075c2 +4848,c5de6c45da63a8e4 +4849,f7e7a24d024d5fce +4850,5f1f5c266e4aca73 +4851,6d9527bd13fee7a6 +4852,0459743df902ad8c +4853,1a4e844c68a0dab2 +4854,d4217b37cbe2b3e4 +4855,92b0fa89fb746540 +4856,1b035af52b64b309 +4857,d1bd5c656c663d6b +4858,944a03d68adef847 +4859,f59fa9f2b307a3e4 +4860,e997a7b7da310620 +4861,08870a5c34c0c562 +4862,058f630701c14fee +4863,dd0131f691bad05f +4864,bac4a7bab548b198 +4865,8c4055119e123abe +4866,ceb0f63dccb4c0f0 +4867,d5f364f215ec044e +4868,9d9aeabdfaea71c2 +4869,c451daa109b58b01 +4870,72a6ed0c383375d9 +4871,9b4e5978733fceb4 +4872,e4f96b93976663ff +4873,fd8dfbb685c5ccc3 +4874,dfd71576ed178d09 +4875,722925f997d5e292 +4876,4a37d29d28a141f6 +4877,98739441eacabc58 +4878,464b3a1bc8cf6610 +4879,4fc1eb81baae7225 +4880,399eea48a664bc21 +4881,85d42c5bceb3b7d4 +4882,87397a2732ce3bf2 +4883,5da65397130c56a7 +4884,cf13c314de458084 +4885,3b57096b564e4af4 +4886,a225c5f61b662c10 +4887,3936384387cc9ef4 +4888,e09a738c91243a70 +4889,8ee7190c7edb71f9 +4890,7ba96e9051b34998 +4891,70bf09b472d640b1 +4892,c772ad33afc4e4b1 +4893,37cd85ef5cc9f7d7 +4894,42360ff4cb50ccb3 +4895,773f60a4fe4e5d1d +4896,164a206e4ab699db +4897,3e0be0a76312ef19 +4898,857351bdf5891fac +4899,60a19052eacf1133 +4900,2ed43b4090b8a732 +4901,90f274ec5acf2b29 +4902,c50ed2918a90726c +4903,0bc80b6a120e9fed +4904,a51f4c5f64bdaae8 +4905,d4f4d2982722a89d +4906,a6d98ed61e44a33b +4907,bac26c7d1abb35cf +4908,3c6a6f49d269bf63 +4909,cd7dfa7105c0ce81 +4910,0a8940555559441c +4911,4eac00123fe67c45 +4912,f013e8b191e865d3 +4913,5c70f4a53d300d65 +4914,0ce8f16c5e0d4e33 +4915,66495dcaced797a7 +4916,38f85c3a5689c24b +4917,7c1e7790272a5e10 +4918,3f4201e9b63ee6f5 +4919,a7732d22b2783778 +4920,ffed9737fd1e06e2 +4921,8f462ebf75b38e0c +4922,6cc7d4bccc23a61e +4923,2e83d153ad85d421 +4924,ce8dde8301835f08 +4925,7a571f85f790c53b +4926,4741c3d26f928a0a +4927,3c75e2f8cc253b57 +4928,e2a69145bf660b3d +4929,7cc6fa612a3919c9 +4930,96aa4d3bad827357 +4931,bf4b33abf97e635a +4932,c0bd217e40533c0d +4933,cae3accb4eda0ca7 +4934,e45468092f88f240 +4935,309ba23edd931917 +4936,6e77a4d8562a1edf +4937,c8116b6acb52dd14 +4938,a3b3816da7e9b124 +4939,d1e506deb023f93f +4940,cdba31f02cc71678 +4941,c2f91bf5097a91b3 +4942,2a6e537025f37b4a +4943,83a20b5d659ac532 +4944,556ed93e3673ff34 +4945,51ba120a2c5d82db +4946,cacf988e4be0c520 +4947,490090366044bf27 +4948,3bc510d510729787 +4949,7231d7aa42a0921d +4950,599b7833eba9caf4 +4951,9e52170671ca3c03 +4952,793eb8ba7f7d926c +4953,801252ef26d0a0fc +4954,1b91a38e239d0594 +4955,eb9e5668f4383557 +4956,264cf3f542571cfe +4957,49e568d387179784 +4958,45d765c2555e1c31 +4959,9a520e5ce7100b52 +4960,913cf67ad88d9615 +4961,5f1fff9cbb806ed2 +4962,f1f4b50fba9b5cbf +4963,0285aa7f896cff60 +4964,d2fc2bf8c8c8a178 +4965,e9a9edf1a1b72135 +4966,d03492e9f363b6e0 +4967,802b6d0c161cabd3 +4968,a9001e3cf6fdd6e2 +4969,95666fb40da6e1ef +4970,ac45a4720ee3b0e6 +4971,060cddde7586bbdb +4972,03a889bbcbe65c6b +4973,06e4857ab33bb6c9 +4974,108e15f5ec43e3a3 +4975,c00e5b8a5ce57184 +4976,1b86f38aff083b61 +4977,c083362b6e4d991b +4978,5c721fb59bf1e48f +4979,c0703f1ad870c4dd +4980,62d0bc4f910d2029 +4981,c0473070f8fe79a5 +4982,f1a4e5d304d4a77c +4983,3383dcdf12a555ca +4984,42b74ab375653f73 +4985,dc522dae38a8c0fb +4986,1dbc0ca9bd9af6ca +4987,2f3710f89d39953d +4988,55190b1b513626ca +4989,871b9de781d203f1 +4990,f5211699b060c5b7 +4991,27e3d43da5ff92e4 +4992,161aa24bfae0afc0 +4993,52969caf20097a35 +4994,ca3012d32264d922 +4995,b2c050a0bba3b464 +4996,0206717bb8f878ed +4997,ef1fe6831a92e678 +4998,5921b28b4df6e28b +4999,5f186b577be1b515 +5000,bdb35da0dd6fbbbc +5001,1bdd7ab832980822 +5002,531897fe53c399b2 +5003,120df8acdc52e5ec +5004,fbb09cf353b99ad8 +5005,a1f4a6d329573a87 +5006,6130c68b745d56c9 +5007,1a00f53939e857bc +5008,a539bdd52a0a52f9 +5009,fa97f200b2b57cb9 +5010,d123cf66b57d5dba +5011,44d94ce7631f601e +5012,3a71661f49db0d78 +5013,0abb5cbd6e7c6362 +5014,4d60f44297142874 +5015,9ca551eadaaa8518 +5016,81dc2c5e380944b8 +5017,e349c1c8d3b73805 +5018,3745f412cc0c3796 +5019,c04b03bf99348703 +5020,07a79b93b80ae6f5 +5021,48e39c7402ab2790 +5022,e085291b3c994d77 +5023,ce52026ceb68335d +5024,effb802c4001afd9 +5025,a90bc507dbaeb190 +5026,06e611d60f46a29e +5027,b563a0178ac22f5b +5028,40da86f336678803 +5029,de52cd790a52a2c0 +5030,13fc90f46ecfdfd0 +5031,4867f1e175eda3ae +5032,3e7e1568be8bab7c +5033,4c9c0be0dc217ea8 +5034,e8a143d93f9f6260 +5035,d4c1952f855cde72 +5036,efad04ebb3dbd34e +5037,d639766197a296a1 +5038,36449278adaa4d28 +5039,3516f7df3853baa3 +5040,a1e8958aff435115 +5041,84a9d9b75e272a84 +5042,3461e8c6fcc89b67 +5043,65399a0bbfa14a68 +5044,13c22bb1308c3984 +5045,2ca8ae56656ddd8c +5046,d35c0b37868cac61 +5047,2199b1d3ca1c8831 +5048,cb5abcc06faf7fa9 +5049,9e3304bbd92dd07b +5050,06aa729737d738a4 +5051,ab13900fb3e4abcb +5052,bbddf9930ec89966 +5053,9f6f0203e4a9f96b +5054,ea4b6c8fa06cf402 +5055,54437f553ce5e327 +5056,9672fd58195239e6 +5057,c67a073997247d5e +5058,a0b1b645b58fe41f +5059,b49a5ca2330e0395 +5060,d9850bf350fa7350 +5061,57635488296517fb +5062,0d42c6d4cadd671e +5063,f7ca045418238add +5064,9f675c10834ec3b2 +5065,1eebe195062275df +5066,07decbb69b69ad4e +5067,2104a57116309741 +5068,ca2434155fda2a85 +5069,fe21ee664a29291d +5070,bf62e0562fee1137 +5071,3d68b7fb66a72e87 +5072,5b18bd30dc7d2f82 +5073,7ce7064ddd8ff787 +5074,e8fa5f282f420710 +5075,af5f5e56466f045b +5076,b9c97d96d46a457b +5077,4a1d0de3b70a27a8 +5078,43e04189cfb29598 +5079,cc0e18d8c3a02593 +5080,e19e059d4138f867 +5081,96e9b01c6325d0d0 +5082,8760f0ab1de24bff +5083,30bc8b7120193a7a +5084,9f9b56b76bf964ca +5085,55aa8389bf117838 +5086,fb9796f12158236c +5087,937dbb8f13e5b591 +5088,1a5ddb7860fb1231 +5089,e1b6f6b6cb5f223b +5090,8e09fd11b3dca866 +5091,8d2e44f62a09d615 +5092,4a367867e2f38b5e +5093,e288c4932aaff1c7 +5094,c34eaa89b8dd794c +5095,a61e534a30e7d01d +5096,061184acb92d9e9d +5097,84e5c75648bd8396 +5098,f5e5b914ac415e30 +5099,30b5076e3d804aee +5100,971d039482dcad05 +5101,1ee5e290083c957d +5102,d007821bb16e696d +5103,ea4c6d0440f1c27d +5104,475af88e6069ecec +5105,4ca6b874eefb6a04 +5106,7674bb9d228a6194 +5107,a9f5cdf544bde705 +5108,89e2a8242dff4865 +5109,821315ff63064b38 +5110,6d6e0ef579f1621e +5111,701ebed6c3730c45 +5112,2ad5a4c894de0b44 +5113,9dd48437d17242f9 +5114,6dc03efe1b904fd2 +5115,77a8e149666db946 +5116,a690b4863ce2c79a +5117,4742d6348318b3eb +5118,e718b2261b3958fc +5119,55977c78a938f8a6 +5120,6702743b5975f3cc +5121,fd8e88ff16a3c3ff +5122,5ad77f3ae58b7414 +5123,2077dc4278e079f1 +5124,93df99d4ad50aefb +5125,29f2065d5048e180 +5126,31551b4ea309e24b +5127,65be291c4513a581 +5128,067f67d3538ff27e +5129,ab872d4aa6e0cd16 +5130,55864f1d05b44702 +5131,a17ec20d740b2b51 +5132,ee95663bb7170446 +5133,9f9496d6a7cd2e0f +5134,a2a7cb0c237784e2 +5135,f9746241aa34816b +5136,70b5616289ff0e8a +5137,2af833e1e040736c +5138,dc69b5209cf8dfa6 +5139,098611e4fe37f1d1 +5140,d39bc8a093f0dfdb +5141,979b89d94fe0adcf +5142,4419afcf7934abcd +5143,11fb99d4f025e1dc +5144,381fb4da0bbc84da +5145,d2b9c1268bde7d8b +5146,efac8b20cc953e6a +5147,0237105c0f6b332b +5148,b89375408a90cade +5149,f73f2a147b01eca7 +5150,766e7595af55ce11 +5151,a1ab2588d58d9492 +5152,6c912a27af5eb51c +5153,d24f7d632e76bb1b +5154,41d23ea531fdd6d3 +5155,f4064b5f03bfe436 +5156,fd46c0b779a1e14c +5157,28b942d1620a2c9e +5158,f49ddb47f59a70a6 +5159,61a8feac369accf6 +5160,2b452112ef08ead8 +5161,593bcba41c73032d +5162,bbc7fff9228fd829 +5163,bbfd6007df271099 +5164,f376621efced2197 +5165,f5593cf10fafbe66 +5166,e39379d0f433d2bf +5167,74aca913a47538d0 +5168,1285ae1cc70a9b27 +5169,9142f9c97b3573f4 +5170,568496b5104c76c2 +5171,52cfef46b473e3b8 +5172,dd3ddf8d59107e34 +5173,06266d8b27ae3652 +5174,4abbcdf9697ec0c8 +5175,b81dc3086f2e2b64 +5176,a22c6fa9a588cf77 +5177,d161e50a0cff5864 +5178,cbead0cc8d0a62fe +5179,6873508d34158ab0 +5180,e83fd6aab7035a10 +5181,7e038bce8741c594 +5182,f301c979ed80eaa6 +5183,bf3d24abe8732861 +5184,7e828a8ab578b4e0 +5185,47c82d4060806600 +5186,916d1686929f4f18 +5187,b1ab1a97b2935a4e +5188,814b2600597b7755 +5189,7379e61cee946ce7 +5190,de0ae38c42526a41 +5191,123499c5e71e8323 +5192,d60703a3d35b0de1 +5193,e02a48c69a6b0ef3 +5194,da560aa5c202ab15 +5195,e1ae39d9f50dd440 +5196,e4ae9a1f9ababeda +5197,c9ac879a0b4098cc +5198,9a84af0416cb7d65 +5199,839de83afce60235 +5200,4e96f2c4522d841e +5201,6c2cb25bcd697b62 +5202,1c2763d7661e19ed +5203,c5d1f456b9701c4c +5204,f0ebb4c503ca3724 +5205,96bcb21b76f4efc0 +5206,42f57611eb0d3939 +5207,c1e7babd1af421d8 +5208,ac009d9e4d334f4c +5209,27ae962044172c4b +5210,206400ffc2db7f45 +5211,3482ab2ec4b582fd +5212,94466378f91aef02 +5213,dafbcf489ce5eab5 +5214,3ef4350969143507 +5215,887a063140f9c9ba +5216,48bcfe8ffa80ba32 +5217,81c8f3c395b8155f +5218,f7cad406b2ab44e0 +5219,bd0ab95164fbd5dd +5220,994684bdd3e8f210 +5221,803cf2c7eb5e541d +5222,a33acf3dfef1acdd +5223,1fa1f91d43ce2c0b +5224,768f71f3235e6dbd +5225,c9f43867b6859e8b +5226,aea2761a381c1b3f +5227,7b868410a36a0f2e +5228,7cd6d7905660d71b +5229,52f1ec3ddcaf2c9d +5230,a41cad19bceb3fde +5231,b9067aeaf813f787 +5232,385b8a6ed0198c4a +5233,fce276243484a83f +5234,bc05841cd58148e9 +5235,ea4033e2d8f5f46e +5236,6172ffd08df48982 +5237,dbc87943b63f9bd5 +5238,919077c7e1eb4cdb +5239,93cfcb0bc73c2619 +5240,de4152c7a408e72a +5241,3640f18381d04a16 +5242,6fb8c6ca9805a750 +5243,b3a4e7ca24026e5c +5244,75310ea1222a17c8 +5245,2b25faa4316288d5 +5246,c666bb4119eba77a +5247,12b8f06c0fbb670f +5248,f8c0b457f48b5e58 +5249,c82a464a512f21ee +5250,406c7b92bc7ac048 +5251,5a84e53fbebdf457 +5252,390b9f8b3de3e7a5 +5253,e6686f82369dacc1 +5254,251f4cb72f3918a2 +5255,2eb4e212837f8a04 +5256,31b063d3b2380a2f +5257,ef637584f0951b48 +5258,169d972277eec83b +5259,f029ace7779176ab +5260,776e2e0757015a64 +5261,35b0ceb9efc427b5 +5262,de930edfc2e5c8c3 +5263,b5b8f0e6be1ec02e +5264,cb89a7dba45dc8a7 +5265,1831369b308c56d4 +5266,416091ef0bda506b +5267,1650490aca9788d3 +5268,62b2001d84f5efd4 +5269,f5da0113dc93081c +5270,33ce83585599d33a +5271,61919046f06e57f1 +5272,2283b2d810f88b91 +5273,b5acdba2aff3d3ad +5274,61a28b611476ada1 +5275,cb50112bf6a90fb4 +5276,e4965f3d3c334b3c +5277,bc49943dc16504bb +5278,4ff2cb4ca4d9ea78 +5279,c91e39ce82f60db2 +5280,cacc6362b182427c +5281,78b82b4dd10ed690 +5282,daa66bc7c2708d2f +5283,7777b644344dd769 +5284,5f9a4cbec6619ee7 +5285,249e801268f785d9 +5286,b409452c6809b61c +5287,96c1d52535429931 +5288,330237e804b8692e +5289,5358885de86659b7 +5290,6b24d47a861504c6 +5291,6a86a0fd0ae768bf +5292,f1b8dc8ae6bdd593 +5293,ea840d88beeb9764 +5294,80f6f3a7f131e123 +5295,b03ab725c302bc3e +5296,1b26ae80f900758d +5297,0b6cdf8fa690fcc6 +5298,c1673e66b8cac753 +5299,989e728716e3f232 +5300,606e8be8f35633b7 +5301,fa5df1abf612063d +5302,ce41a6701cf06f11 +5303,accf3a5918527b22 +5304,4fdb1a88f8b73cf6 +5305,b17d65badef7adb7 +5306,513194620b1049cc +5307,7e8950a6e6935437 +5308,91699e35c841da20 +5309,dd150ef743bab63c +5310,c2b96924153cee76 +5311,e5ccf31a43c25fe2 +5312,727ef092d28f4cef +5313,b8ef4b8f25bf7c04 +5314,6ceb6075f18e21fa +5315,149d4b39d7c73f4e +5316,524f2f767f15762d +5317,70925ce7f622f4fc +5318,22124a26a488302b +5319,da5e364987ea0bef +5320,73ad30c49923a270 +5321,9a96fb4c8ddf7e61 +5322,5113e34fe8cab1b5 +5323,e751a37bbb9fb80b +5324,231e46b36c0e0931 +5325,ce3fe564b8e3a096 +5326,d3ba93a2d6c9c9cd +5327,0390508320234bf4 +5328,dbb2ede337c65658 +5329,110fec9a2cf47175 +5330,860eef67e930c7af +5331,6b88ceba52d01329 +5332,4de1e2f329ec9821 +5333,dc1ed7783765c07f +5334,4c8efd01f59bf119 +5335,e26fd2b168802e97 +5336,e665b7e1a3ad33f0 +5337,54a4feff9f2c1d7a +5338,0dccbc99c0c29e76 +5339,9e7538eaac3cb0af +5340,4eb818ed60c5fa61 +5341,749f38977d5eb1f7 +5342,5fa10088cfc763c9 +5343,c73c82183546719a +5344,38902aec31c35c92 +5345,d951b5ad65bb753b +5346,362f59e80c6068d2 +5347,ce5c2107d3221052 +5348,5daa2377c8121fb2 +5349,da96158da242d5c3 +5350,bfd1be81d1be2eb2 +5351,eb0d0b529f25ef69 +5352,efc5240865f10a23 +5353,56317f20e5395068 +5354,79f8cce5fcf62d0c +5355,3630ac4197d8c7b8 +5356,db264c3615c8c46a +5357,1bf045096dcbce1e +5358,6ce23da49270dd82 +5359,6c98c26f87f4015b +5360,342d0bd4b3a5b131 +5361,49011a9ec9ae318e +5362,36dd64afebdcb8f0 +5363,baa4e36a058311b1 +5364,bd75f18890a5def2 +5365,b053067f9c9f457d +5366,72de31bfc752f282 +5367,e308fe90caa536cc +5368,13bd1b73f204696c +5369,9887ba3aef02c500 +5370,a93de9475770328b +5371,49dfadde0c5603da +5372,7b1b238b3e34e4e5 +5373,429b07ebd8b3e75b +5374,0af1429d5edddefb +5375,01f2abdbc250ce45 +5376,906926c19ebe350a +5377,bc6748fa785a9215 +5378,8cf0483bfb5a85d5 +5379,de7b1d4f0842e642 +5380,4ec776eceb4e6e7e +5381,0e0e1f5b84c73faa +5382,138d652880e88a48 +5383,52bd49730978e5be +5384,6dc00af184d17c60 +5385,44809cb8facce3b2 +5386,b1eb6dcb2ee9610e +5387,566690268b41128d +5388,163381aadedde076 +5389,284e41e1716e7eed +5390,6f08f8e8003c11d6 +5391,186641f1509edecb +5392,77cbf458244cc8ff +5393,7352e20de2a61ce9 +5394,ef62dfbb8632127d +5395,e570bec3fe1f6bab +5396,a00c1c8659397ca2 +5397,5213185f51efd69a +5398,28a261f3ecc07d4e +5399,42393866c116dbe9 +5400,7bd2cd3840ed3ba7 +5401,67fa6b0e3716cd60 +5402,53a63c8ed717a534 +5403,49a57379f4a983b8 +5404,0634d6241a210f77 +5405,2d06a95d62819ce0 +5406,c453392fdeadb166 +5407,8f883f247446903f +5408,57d0dc640a07d79e +5409,75c7d41c0c0c07c9 +5410,59f43443daf65ca3 +5411,4808d06729bc142b +5412,f71e70f8b12ae6f2 +5413,281f6c823384df8d +5414,8402ddc6d8d8c2de +5415,d2b700904ee9d6cf +5416,6a5cd59a996d4bfd +5417,d5a982894e6b5653 +5418,753d31a9286b9bfc +5419,1e070569822d812f +5420,c4747d8c20066a56 +5421,26b23b236bf3e750 +5422,0c7e3b6d9eb5f9e2 +5423,751dcb21df2c1c63 +5424,97119d59c36d4afe +5425,04fa38c420df769d +5426,d4af864ca6f98c8e +5427,1f80ce06836827c8 +5428,e6afe90017fd5ef6 +5429,5f2505cac55e9539 +5430,9b80b9a5d3d8a85b +5431,d0f13f1b6c1bc41a +5432,61df78b9f098578d +5433,14b8e2b0ef9873bc +5434,b7ee8dfee70c6145 +5435,779705937405a1fa +5436,77d5ea46c9faa6de +5437,726e25f9a2b08ded +5438,6355b9ad06640513 +5439,78ea2a082a61011d +5440,6286815c5f05efd3 +5441,dd02563e082b3f4f +5442,e2724a5051f8af44 +5443,5d1ac8918c32373a +5444,ce21224ec3d3ee4e +5445,58e328f7ee63d84c +5446,41e7ccbb1294bbcc +5447,4dcfd2474f9204ef +5448,ac9515d963d6d5c9 +5449,e920e08dee24f792 +5450,cb7818d7ba68371b +5451,f4b605648849d2aa +5452,43823b7e46ccd7ea +5453,dd2a2ad301598b55 +5454,df746b1b7e2c559a +5455,85841956ec53ae64 +5456,afdd8f15a1507012 +5457,8d651399b83800e3 +5458,4d15e7c145bdda1d +5459,a7286f2a99f9d326 +5460,1b30b8ff6fefe2ef +5461,060603a7be3c2c36 +5462,c8dfc8c80b4e8a75 +5463,6d398c43e72af2b4 +5464,7683ca3818a05412 +5465,989df5fbcce8de22 +5466,26514fdb464d9d44 +5467,39ed09554e20f3aa +5468,efbd269d9ac2a2a4 +5469,05bc3ad81d427d92 +5470,eb80249a365b8ba2 +5471,3877cea26f114300 +5472,d541ae6eaa401d7b +5473,cb653e147cd2e087 +5474,4554aaa90778071a +5475,41bd3d279a121559 +5476,9986b90d6c0b333a +5477,2c586dfd7723c59b +5478,7d6d48e1729a7738 +5479,16a9bfd2d3c15e81 +5480,43e12c9bc590ab64 +5481,e21eb7cf55c45c2f +5482,f749c08c147149e8 +5483,b09ae0f01de09e8c +5484,111da1856aadf31c +5485,582d95a0518a3375 +5486,d698269bef65d2c3 +5487,b9a00e3379b8b508 +5488,7d297f232c9aad46 +5489,e28790cc650df7e8 +5490,59ff9a5f74f41c92 +5491,e82402002c00ded9 +5492,41345f04b10b5ef0 +5493,0123a5ff632de046 +5494,05b23e349369c6ae +5495,d0cfb202a5b0404c +5496,1801b9425b63b9ae +5497,746dd553c9b3540c +5498,4266c6daf19f0afd +5499,38b08a5dac3b24e8 +5500,ffe2994c14d70bc4 +5501,f15a14d023eb28d0 +5502,f307c79ea133268c +5503,adf83fb1a54d75a0 +5504,bbd510c8ff0b2781 +5505,e3fcb1f8ea89626b +5506,76b9c8d6bed8607a +5507,26407af35bce6634 +5508,86721808d8b9b2cb +5509,bde5115cda82aec4 +5510,42d98e92585330a0 +5511,cb89f18869736cd0 +5512,4c43b5011824dd9b +5513,9ca43815b06eeb63 +5514,553fc7be99d69a27 +5515,dd8ebdc9fe21c331 +5516,b1f68e77ada24777 +5517,d003228c34949f4c +5518,f29c7fe3cd45574b +5519,3e839169dec77bd5 +5520,0a21ab7d8028dec4 +5521,59e9b5e5f95191f3 +5522,3a6053146294cf3e +5523,a7aee4b04a3f629f +5524,4d6beb8b40178fdc +5525,1d24bca40de65e2e +5526,18cfc45168bac1f0 +5527,0c3a8977c13d6fd7 +5528,86d0cfca342cfc83 +5529,3958497975305df6 +5530,1e4cb57596275e5a +5531,9029d75241034aa7 +5532,5046f0956287ba98 +5533,78a6c9b62ac9d73b +5534,851871b5f2defbc2 +5535,c8befaa4f318bd90 +5536,8dac5a628a169e99 +5537,93cc5e0b1f74bfb6 +5538,96398092bb4f2b47 +5539,a375926a44b73a23 +5540,27bc9d69c78a185f +5541,3bcf7a5cf2720bc0 +5542,a7cd5b7775585a14 +5543,474ff633559b2ae7 +5544,6e091c5c1ee2165a +5545,5e81e2fd8f19aee6 +5546,8cd40f8fcf17e4f1 +5547,c46b5f32ae6e3291 +5548,6967244b07864887 +5549,fab9e3bb26dc0363 +5550,b74df91751e0d893 +5551,8c0822d40c39bfe8 +5552,b7939823f09b70fb +5553,48b8026ad1f9aad4 +5554,220b25257d3f1fce +5555,3a7e0b1e52d3651f +5556,a708ec41508d3aab +5557,7e2f0d7c041ded06 +5558,b2e038e12a229630 +5559,98465ca671cb3908 +5560,fd24e69e53604151 +5561,aeb9c1a91e1cfb3b +5562,c52fb0cc49f38c03 +5563,5c1eea603231e47e +5564,b5ab4443d5030f81 +5565,7c5095803a52a36f +5566,93a1807891dd66cc +5567,011174da4c61f90b +5568,839f69ba52b69711 +5569,9e6ce90014a4c765 +5570,0184358b5b722c5d +5571,05280d65d90b817d +5572,8735a2da7c002c5d +5573,e41a4ca9852a82ab +5574,aed3141a156f6c71 +5575,fab95a93ebd2ac3b +5576,0d7d62ebe050dae9 +5577,096601998adc887c +5578,030df43a3324f97d +5579,3dfd97a62f1d3a61 +5580,325c2915cfd8b66f +5581,3e7c68ed265476c1 +5582,267e6f5604c8cf69 +5583,1fd6f6789b454aa2 +5584,6106e25a9afd0b7d +5585,186d38927b76a93c +5586,b372f5f9516fc9af +5587,15d7c6b199d937ab +5588,77eae4d3d6784a8a +5589,41eb811c05c88848 +5590,70438cabc686aa6c +5591,2ff10cb8d290a1fc +5592,410658bd63788c1f +5593,2c30b99c324bbb66 +5594,71528562dc9cbffa +5595,1a9fad8aa180251c +5596,9c950b750ab05011 +5597,5b0c7396a4229d79 +5598,e28ec061dbeddaec +5599,89e54cbe8e06fe89 +5600,66a1612b67941e64 +5601,bfa0c91529f31716 +5602,9c3649e107f0fc97 +5603,4fdf4391eab25cd3 +5604,a7fa6ddeafc7dbe5 +5605,11b1064b86eb8670 +5606,7fdf304c2e582f25 +5607,4ba75fc0cc771446 +5608,9dcfba9bb4464c2b +5609,2b9e947eae567aa9 +5610,3e990967a43602fb +5611,9187c1f250d7e6bf +5612,27928b197f20f300 +5613,a5ab26a404ffedda +5614,1b39e5fb538750f8 +5615,78bbc47efa54450e +5616,f34205a6ecd6ea2a +5617,50128588f5d69688 +5618,517ca1ff4ad13134 +5619,cf182f5433ca94bf +5620,8c737cc21a9b2d8e +5621,563e442734b3a919 +5622,952b2083720e8607 +5623,a81facec9c714209 +5624,24de2c6bceff231a +5625,9d2719be83739f00 +5626,c284553b77852cdb +5627,2492b04e9ae11067 +5628,79267e7441423128 +5629,dd3c54b5a90c9088 +5630,05abec51f302dad4 +5631,7ebbfa48075cf333 +5632,c292e21c919e0889 +5633,c6525090afec8314 +5634,0a1d25767c25c782 +5635,de093edab4e8fd40 +5636,6c61ba4aa96b7ede +5637,8302d8b2c6822b42 +5638,3d5a33d5cdcc02c5 +5639,f8b8de5f3da2ace5 +5640,7acf38606989c12c +5641,cd453e060c181f07 +5642,d9972641ebd971aa +5643,1df7406396bdd54e +5644,e12294fd1e015088 +5645,feee0a0cc5c89fda +5646,5e45dc507c55e277 +5647,77df9e18739ab59b +5648,af7e1a675c9780a0 +5649,530c1a7e102e7c2d +5650,d8ee7670770a39f9 +5651,b99de9bc7c5d2088 +5652,40d682dacaa9fbf1 +5653,181919423d0f762c +5654,175bb98d64740e4e +5655,f2c3f9305f6a1d5e +5656,48e283c96b753aff +5657,666b5481f4463de2 +5658,d7f0207de4a4b79e +5659,fb03d55f72023d83 +5660,5304ca8a474edaa8 +5661,da9733bb85e2964d +5662,6087127be6a4d1bc +5663,f111e0a4d8d1e569 +5664,1d2966bd41f599c0 +5665,54a096f031b30c97 +5666,3541c16880777e0f +5667,8b4b1e1c73cd687a +5668,f9c37f1ff65e6486 +5669,b3ab0a02da5fccdf +5670,b88572fc5dc91224 +5671,d85ea7639bf79011 +5672,7d5ba52fac140c9f +5673,2f53c83a79a92453 +5674,775213c2db15c2bc +5675,2d9ecaf629e352f5 +5676,b04f3712b42a44ff +5677,0dec222401cecdef +5678,278e009994e90578 +5679,7a19c1ee3f85dca7 +5680,d9ddc349418f3745 +5681,f2e3d6618e431853 +5682,c3c0fad46060f190 +5683,d74862945ad4d763 +5684,08073ad7b34cab4e +5685,e2f68ef75381cc18 +5686,5a26e770e3e93d2d +5687,de43bb46f0c20938 +5688,dd39d783abcc84c0 +5689,493f57dc01f417e8 +5690,1589f92eb016c428 +5691,b1882e2346df3e7a +5692,d01f5de572c55399 +5693,2d96ab85a94bcb75 +5694,315ff3d7d5296f8e +5695,224e6d651882ceb6 +5696,906d55979105cddf +5697,a4d5ae767d9d653b +5698,b80e6a2304e189af +5699,9652c66bb7a4ac78 +5700,7ef965c85bd9938b +5701,2d678d7dbc1ad17d +5702,8a8a23d2eec35b79 +5703,16b17ffbcf2a1c29 +5704,0cf7dfd695328127 +5705,4298836c333a4e52 +5706,f2dfa59630666317 +5707,9f97c04b6f0084dd +5708,14a2b056c62d118d +5709,6470f4a5a075ae03 +5710,d1e90211564eeecf +5711,9d090c3f853c2301 +5712,122368222aa034e9 +5713,4fa4157c84873059 +5714,685ae5169e2963f1 +5715,1ebf42a699742a54 +5716,f886bff8994e5f74 +5717,f27a24a505ec4409 +5718,a7b5c6dcdf28bb41 +5719,f80c3796accb0c33 +5720,3487919be34ee1d9 +5721,930c6e879065e6a3 +5722,38c39c79191f5085 +5723,8fa7b6cd758604b6 +5724,4ff55677e45ff917 +5725,8a64729cbe1c14b6 +5726,ff74d81a036e1512 +5727,c79170fd281d7b26 +5728,e5e7144aff2f28b2 +5729,c07e62e2bf61d7d3 +5730,b8193c1352872c3b +5731,f4f6590c0e8eb9d9 +5732,630204a5906eac0f +5733,bd572b7b67f83284 +5734,f4b3eb1c77932e8f +5735,63d9234ac12de2c6 +5736,37e0131a930bb43a +5737,a88b45ade9bfe768 +5738,51537e98b783e13b +5739,f009f7358a5fbc57 +5740,3387ce434ba532b1 +5741,5824dce21a82a189 +5742,252c22890ace03e0 +5743,7922ff75f7c42f18 +5744,40d5223ae025e858 +5745,fdbc2143f626667d +5746,b4fd5d1e679586ba +5747,6f208fba2a9ee240 +5748,364d6d752fe58776 +5749,d9d17e925d5c1dde +5750,8236f44af568fcaf +5751,ab58a69f58d36ea9 +5752,609ef7808b39f6b9 +5753,2f2e7321b2c5bf05 +5754,edb6f77af6044218 +5755,d1c8eea9cf0c01b6 +5756,19a978062de89470 +5757,377b3282f4caba53 +5758,910a9d8742120eeb +5759,7612788b687d0581 +5760,76191a88891bc70e +5761,24a5c26902fd826f +5762,65e4103737c4cec4 +5763,bb0f4909e9b5d878 +5764,dc4c798950f99e7f +5765,8941b4d8673211c2 +5766,621241088e00a392 +5767,e49f4f99cf7837a9 +5768,c22b7972ab58d77c +5769,a33b9a17fbdaf9c3 +5770,079b1f63cb49c1e4 +5771,dd58a47dfb1be470 +5772,db08890fd05abed5 +5773,64838662fc7a1328 +5774,197daf0f9aec7884 +5775,7d30a9e6efabd8c5 +5776,a0c88e2f74af66d0 +5777,93e3a083415f52c7 +5778,c54baed619f8a217 +5779,450fe8ac597dce79 +5780,5511ede3300c59f9 +5781,6e3e30a2dafccbc0 +5782,dfc5f61dc03c6555 +5783,f2b1d00027e55499 +5784,124766b72c867786 +5785,03031052112e9118 +5786,b6c6315648e2f2bd +5787,ea062f8ac17cd5b2 +5788,d2b08d780b5e3d05 +5789,59476519ea9786d4 +5790,f0c3a60967a47a75 +5791,7ec90b75d6b22e5d +5792,248a40f590088952 +5793,8ea6b7de93ad3fd7 +5794,5872d29764e4c6a5 +5795,25638ff0c7638ee6 +5796,da8271bd984942bd +5797,6253520f027c67f7 +5798,2fd9db5ecc93eec7 +5799,a143d8bcbeac7a11 +5800,f373b8d0a730ddda +5801,f0040204be0fbf10 +5802,99cd61a733ec951e +5803,7a470ac966e8bb27 +5804,55563c9d08d577ef +5805,2693188851198873 +5806,5a033a754025caa8 +5807,900daa7e5eac7823 +5808,43da2f54e124b7e8 +5809,741dbd55474dae37 +5810,290e44bb277d41ca +5811,18c67924b1e8c1a2 +5812,f2e8d104c9e6757f +5813,e92cbe72787ee253 +5814,e0752421a027a319 +5815,d48ecfabf99d133d +5816,3b8790aedcd1e6a5 +5817,c58f7c58d1f47576 +5818,64f9b9f8a2410639 +5819,ed78a4d58299304f +5820,4089b45b0ec6c2d3 +5821,80f75c67c494118c +5822,e936791e9b02806c +5823,a6eedafc5b130090 +5824,ed76e998762d1a21 +5825,109f6be937ba72dd +5826,80ecb1f54a09ac5e +5827,698b810c14df8808 +5828,44c1923e04225652 +5829,567b8ae861a38a78 +5830,fc14485ef99c74c7 +5831,8f2267356ce8ea37 +5832,509f7867e92ee054 +5833,0d770d266e0dcc0c +5834,9a05a841bb0160d5 +5835,1022419d51445507 +5836,1dccbe9e59249aa0 +5837,d839615a0c280a1a +5838,eeb7c101a88e4041 +5839,58e0da89cf49004b +5840,78197ae86eb7cb58 +5841,85b27cb2fc0b4756 +5842,029fb36d5e08469c +5843,7c2d97eea2e8f80f +5844,c8a83fb20de987a4 +5845,26ff92d34f69f7ab +5846,7625708a6ba29004 +5847,a98af9938c93e32b +5848,f016697a34c0dda3 +5849,3bd9a1cdebb46836 +5850,1b5615e1e720bce3 +5851,c8d8c420719674c6 +5852,c393641746caa11d +5853,256ef625da898428 +5854,ae11a95722fefb33 +5855,491edb3b231349ce +5856,c5d53477d868bd2e +5857,852cef1d6e6d9e90 +5858,1f90075510d214f7 +5859,48159fe3d230d9c1 +5860,b3a8e0c8c4b1561f +5861,7027f5279f93da6d +5862,32871a7a39df3d51 +5863,06c698700c1eae10 +5864,38e28048c34594cd +5865,1c7c3c3a00fd5ecd +5866,45f4a38b37dee1a4 +5867,227b9f2f11036261 +5868,4bdbb23af1f5a980 +5869,081c9d9bbbe8ff2c +5870,f618b8789fda2329 +5871,8b8662752a31e0eb +5872,ff6189ac6e3ca0bd +5873,287de020fdd65e07 +5874,5916b494aa25c767 +5875,4507876b60cb5f6b +5876,0846f6872d25deb4 +5877,d0db62d2b371150c +5878,c14fcd05908a2cc4 +5879,d41783087c087307 +5880,3609794f54eaf49a +5881,08a3e09f87f2d478 +5882,a60e353d9cd84c9f +5883,e7615cfd8a38ff40 +5884,29986e6c5fdda537 +5885,64aea65707113b61 +5886,202e1f63e7bc7e5e +5887,0d5c5c3c498e0132 +5888,8043e0d3bc461ee3 +5889,bbcd27bd30fbb384 +5890,c42123f11775ce05 +5891,654857d62d7088fb +5892,40748b8ef8dd9c6a +5893,62c5dcbbc5cfe5e5 +5894,27a8fdf76ccfde0e +5895,f511f6771ea6657a +5896,8fb3ac3f70df2c7f +5897,72b6aea5ad3b3131 +5898,95aaea69dc25456c +5899,0be1cc679bd89a34 +5900,8d5357727ec00b5b +5901,b776c33b214b4af9 +5902,8951be453c538dd1 +5903,1d415a52f3361c62 +5904,aeb0cf169284e93a +5905,c71f8059e41ab28f +5906,a2d5fd62f6234cbd +5907,699d31f7fd91567e +5908,809cc04b6e8a0031 +5909,49a2848bdbe3112f +5910,cc40e767b9dc9ff3 +5911,1a142ffdea73af09 +5912,3cf7029fa53759a8 +5913,a1d6f73998e77796 +5914,46d3082489473b19 +5915,4a32c86f2bcdfd20 +5916,d1ab4573ab224331 +5917,44d7fea8c9dfdde7 +5918,971673378bff8f80 +5919,b95b2b14737697c5 +5920,b6f5202ee0f54bd7 +5921,a384e982e5a71043 +5922,47c06314a076850d +5923,b44436364d03f384 +5924,6c968c2c68fa30c3 +5925,7c3d1e36937368f1 +5926,9b921cbc1989ceda +5927,fc35f75113a6a0ee +5928,9a5bb44864622a71 +5929,85693f1898983afc +5930,0fe935ab099c9eea +5931,a62d3545f458b1ad +5932,80ba15d130917941 +5933,f73ed27da5722902 +5934,bedb60d45c353721 +5935,a43de4ebc80003f6 +5936,0a581f7a82a7ba69 +5937,46cf7d9496aa1fc0 +5938,3e062df0e28a6ca9 +5939,9f66f57aed7cbe9a +5940,8572a42389953183 +5941,8f44ca1679b3c3f2 +5942,49598a8588798d22 +5943,d3078322c909ec2b +5944,0d0c6ba3db2bee6a +5945,a640b5f0fec66a95 +5946,e1aa0c44a58aaddd +5947,186e72d477563959 +5948,c24e975bd5e4d524 +5949,270dc2b0b2dec23a +5950,2e73b69a34e6215a +5951,a1299564628e1916 +5952,a798001dcdf81e59 +5953,6f56ecf568ae9ffc +5954,0a40c3a117882b9f +5955,3309d8dd76815c15 +5956,7ab6e941ec15d6fb +5957,0ca86e4959363a71 +5958,85a0d16b1e359785 +5959,5c9f76dcce75190b +5960,c016326ce7183eef +5961,0c0a22bebda076dd +5962,ef1f7851dc0fb6bb +5963,2215cc2421aa3866 +5964,34d3175f740857b1 +5965,deab20e7644589cd +5966,2198ed1c4c8664db +5967,df1321baa8799142 +5968,440f1e055f0a416d +5969,890841c15592cb4a +5970,c41af1726c35245a +5971,2c2895575d4d08e3 +5972,c6a68e8c2451168e +5973,0b499cec8dc2e37e +5974,3e718a9989b4b316 +5975,260a3a5efb43a908 +5976,e648ecba20035dab +5977,e94da559eb44323b +5978,87fb1c3dcb6ec571 +5979,7758dc87aa484df3 +5980,f5325486e81b88e5 +5981,740240f6b939073d +5982,69e74f646d581e8b +5983,7164d8752c242da1 +5984,68cf3917d6ed142a +5985,6e8fdb15d3b0bab3 +5986,a02a8e90345eff6b +5987,c5423c8d37498b84 +5988,d489900756e947d5 +5989,01d18d3f774265a0 +5990,6c9c6c24e1f49afe +5991,e3f8c0f5a40c3429 +5992,6104ba23a240eca2 +5993,33dcfede6ffc0336 +5994,47d9087ebb689601 +5995,b5345734905beea1 +5996,6227ec7e6ea948fc +5997,b647fed6ad837123 +5998,86c166c3fb33e0cf +5999,c45c17414ea02bb5 +6000,415afbfae7931004 +6001,de62fd8623eee30b +6002,e461a89d0fe899dd +6003,fc4354ff138e85d3 +6004,92dc1c0dafacc35a +6005,f09d94090b759d2b +6006,5ae7c2b1310798ec +6007,74c9ba3ab7d4fa18 +6008,ab5f96e44ae05677 +6009,8273511746669c37 +6010,e1769ed38c451dda +6011,ea365584f7dbed25 +6012,f91a26c712d1a39c +6013,a055b660dea468e3 +6014,89a8282ff77f9ddb +6015,1afebc136a50bfe1 +6016,58a7c1c8c806d34f +6017,8f1c2091c4820c24 +6018,9bf75330c2aead16 +6019,0f9cb2229ba0e59b +6020,a455d31de51dd45e +6021,65b2ee581a03d9eb +6022,06cac9b122d0dffe +6023,de01137f29ec3338 +6024,9252964f0d7cfd78 +6025,023dc58c470f80c0 +6026,c6be73585c52c1c9 +6027,5e64414e940a72b1 +6028,f02250f248b169ff +6029,cc6a280681150cfe +6030,9e4b3e56d9b4c1b0 +6031,1885df4954fc831a +6032,042faa992b75856e +6033,2a37d7fe5fcce041 +6034,f96a94188cd57d86 +6035,5338226a67f33e9c +6036,5904286967c3a291 +6037,5b045252d6b69895 +6038,dc7fb663c961ea90 +6039,984a6145442f5208 +6040,d9b6574bcd7ad7ea +6041,537a73ca120ea23b +6042,1b989b3d7ea25ac7 +6043,4c09b47bf7f9c807 +6044,e3b840b5a20ffabf +6045,89088c84d83847b5 +6046,9cf675d52c8ad9c0 +6047,86124313a1e1a558 +6048,a3cf2b09a66ccacc +6049,6968f9635ad3e147 +6050,6b45a6a5a9dd147b +6051,2a9d199942787d5b +6052,7ea0c415440290b2 +6053,c4f02698c1217713 +6054,44fa2d3d6369be12 +6055,9f3ddccf91d58a00 +6056,ecbb58cd2395a4fe +6057,d92577959e78f548 +6058,194d09f4fb83d128 +6059,3760922a563cc857 +6060,089af1533515ff63 +6061,6b820f8d94ac7a1e +6062,8ac8f02661360eb0 +6063,95041145d538fbfe +6064,8882e70dd9f93ae4 +6065,d60e433397fe1acf +6066,ef2aca08ab42fad2 +6067,4245585711664c1b +6068,6dec77b5149b56f7 +6069,09c1e8fef9213d12 +6070,efd31325886b3c06 +6071,b5342f127a2f85ab +6072,465560e00ce4a538 +6073,0e7bae6d760f339d +6074,173ba8ea09dcd929 +6075,1d1cd8e23e06daa5 +6076,fae1ae6a01ba26e8 +6077,ef7007a9909782a0 +6078,69e1afc730ccd938 +6079,2d9cbf39814e8126 +6080,bd7f573f2a3ed798 +6081,54932f6a57421fa3 +6082,f85fa1809fec79dc +6083,e61ece8ca2f31c87 +6084,922c483ba027845a +6085,36d20547f59bcbb9 +6086,af0862a91b56595a +6087,3583f1d6e942dcbb +6088,4efc8b88497d47a5 +6089,a0cdb84befb62bd1 +6090,bf64fb34a5c3ce36 +6091,f830ea527aafb0c0 +6092,ff1d928d7421c15c +6093,aee4000ba844ce5e +6094,63a52074edda4db6 +6095,1e6c011815d5b081 +6096,b7b9a7196b3bb4f0 +6097,91fc51a355218aec +6098,8c0030b612d0814a +6099,7d90b4e6a638fca7 +6100,35afab0f26a6a2f8 +6101,29390acb4d460b1c +6102,8f930d1e1b3eab33 +6103,3b7c956080a9f325 +6104,31cc11eb0ebc9652 +6105,31828c726fa7777b +6106,7b0dbbfbcca75770 +6107,e711c7026c167ab9 +6108,7e93c38290b3686c +6109,20b1b3819b9fda80 +6110,9215a65bb6d08d4b +6111,7621b95053a04afd +6112,5f85f5c7f60980a5 +6113,e5ffb5eaf99e4a77 +6114,5c6874c01f3175fc +6115,5f385a58b3fe5f20 +6116,32c170a4aef4a6f5 +6117,5eacbd44a401d1fa +6118,4d3590402c554e97 +6119,8c6834ca5c539044 +6120,cc4d597160bf170c +6121,d44e54bdbfe981dd +6122,02903c555a61db23 +6123,0851ec93963f601b +6124,d67851f1d2190faa +6125,b58ea477e9c749b4 +6126,5e00967fc7c56fb2 +6127,e7475c6d6354dcd4 +6128,f84d87e3a8c40e2c +6129,8b1c828eb9bb05ce +6130,7e031086fe08f83b +6131,cae679689ba6b14a +6132,539909ca896e95e2 +6133,7c28094c73832342 +6134,21a6df8386fd95b7 +6135,e1899ed28955553d +6136,4dc89669dcf0948f +6137,b85f22dd4ea9f658 +6138,220dde476c5dd99b +6139,dfa16a1ecc979a3a +6140,ebe80858b3bd3c0c +6141,88fdcdff7e4f5afc +6142,cc293a3ca8bc8a85 +6143,cf4bfc181acaf631 +6144,31f23947290e6404 +6145,0474bbf9e0981b4e +6146,5685883a81a31840 +6147,3c0ffb2c8f2db30c +6148,82a7bbeabe947a9a +6149,2198addd767dff81 +6150,25635b6f164d2008 +6151,723dbf2ba527bcfc +6152,c5e79420fce5c5a3 +6153,7c2534dc11253b53 +6154,b1a232f23061e6c0 +6155,d2c0b2ee25955bd7 +6156,c2a7d187776d8c69 +6157,b0b02d927299b8ba +6158,a4cac35af29d1fa5 +6159,1e4d8c3af4c3d96c +6160,2958d529905be205 +6161,bbf3142d338efa26 +6162,727f18aca5935111 +6163,5505677171ce7693 +6164,2597cd074a2d92fe +6165,66748c685655da2b +6166,bd70faf9536a3876 +6167,cb4d030cc82336e5 +6168,d7a065226a668dbb +6169,c7b9ca2ca951ce8c +6170,563a45653619cd6e +6171,6a95d4f5695fc316 +6172,6adcd41582b1d10a +6173,207bb0415f99f29b +6174,53a901cb36c32228 +6175,a53663c08a6c4e02 +6176,ac6875fdd5dea501 +6177,5a6daf407fa61878 +6178,8f49bcb95abe0516 +6179,2f2536a95e5b3cfa +6180,eac0f3b9f7d05238 +6181,9455f18de493e354 +6182,b8dd0dd8238eae78 +6183,32f8a05178f1f2df +6184,68b572d4ddb375bc +6185,43573823780140ea +6186,4c3d846481ff6d11 +6187,f83a7dfe4ed868b2 +6188,005ff93618446efe +6189,6a9368ba5edeaecc +6190,593c8d8f4b1460ff +6191,e0e26e679a84f8ef +6192,c43e3450bf2f2c26 +6193,5db52bb3157db1ff +6194,77cf733b9dcc13ee +6195,c4193dffdf9cadf8 +6196,9d857d35b2eda599 +6197,5a024da6b04d0204 +6198,d88980beb0077e5b +6199,9dfbb9dc47e93cd0 +6200,84305ee3b5701de3 +6201,c3f2eed2d806ce2c +6202,23330930752ad13c +6203,6f0d8c980c92e652 +6204,40ad9da33ccc76dd +6205,eebd9048cda85663 +6206,f5ef096adc4111b6 +6207,ea285d9ca912e370 +6208,78b6318e03bd6aa9 +6209,531fa66ef97b022b +6210,21c662c36fb7632d +6211,5d9ba9504b59c9b7 +6212,7551ff20490bf133 +6213,5f39b600fd8e6523 +6214,b81fcdf39564fb05 +6215,01275ff885e8e2fe +6216,fffeedf39c6f3732 +6217,c5e21a0605dec764 +6218,afed2a26ba9b8529 +6219,0d450744cc8cb525 +6220,9a0afd3cc54b2f15 +6221,9715acf60e651796 +6222,74dc276895faa299 +6223,0c7b57642a6096eb +6224,b68867b55e625ac4 +6225,2929198471d46cf9 +6226,af605871f9d8da5b +6227,8193f9b0e3681a3b +6228,270624604ba2b303 +6229,0f0ff28f2ac83269 +6230,3889888ca25f1da8 +6231,c8a658328a1edc5b +6232,6183eaa056cd29b5 +6233,125ef44e24b60e84 +6234,138bb82d4423ba74 +6235,1ba1a56dfd1e7e42 +6236,9949b5f54caa1e15 +6237,813f9e4ea44e8002 +6238,37894cbba901fd80 +6239,63d854638d7b9adc +6240,92571820b7d71ec2 +6241,c7a29c6d68f78f12 +6242,df1769d0fb89f532 +6243,d88ce6a0ae2cd794 +6244,85670a7def0dec1a +6245,fab65128aa6838c9 +6246,6a7c885b02b239d4 +6247,effd77ad8190b446 +6248,9d56a95b30e6b761 +6249,1363869f8b4336a2 +6250,58d283015888136d +6251,d028e0c304a4a812 +6252,6fdf83d547a59c50 +6253,6fb41b6e62685dc2 +6254,4729bc8acdf91d2a +6255,8718e9595f72a48d +6256,b65fb7540f3b45fc +6257,3473b24a6c518115 +6258,1afc1278170cae30 +6259,61a8a43d8718ed25 +6260,ec8a818e1d2f7c8d +6261,6603e67160da432d +6262,647e765b1db94654 +6263,ce839d3e833d0f9f +6264,97d691717da7b3ee +6265,be41365108754931 +6266,0bb1d764a5988fdc +6267,09cc23c2125b191f +6268,a99be02435e95edd +6269,1f026e56898b2585 +6270,7358f5800c33c748 +6271,10e9ac9f10da6dd0 +6272,28e518337daaf89e +6273,23d6abfdc1b63db5 +6274,01b79db51e016656 +6275,ec7ed3aa1f02cc26 +6276,ea225da97155e097 +6277,f468b4049ed0e5cd +6278,c6a1a0fe07986fad +6279,b3539f509d69b015 +6280,1c3d075ea4a77117 +6281,a3e58fdb86871aa5 +6282,e47a1de3c2e00f6c +6283,0fa16d69e5e6a6a0 +6284,e0e52b5f71e3e0bf +6285,54b9226d6e5e457f +6286,c3addb1d3e3a5e24 +6287,b88021c146353b23 +6288,1bab1e0bca23d11d +6289,c6a4f2f38bf84101 +6290,1093cff7a763232a +6291,79e90bf8512d6b8c +6292,5d2bca15445b2a82 +6293,766b71b506e0906a +6294,9cf73104c17c8195 +6295,6ff87587ed757540 +6296,bb0dc3d5355d3a9a +6297,e5c2588142133119 +6298,d3e51692c178dd3e +6299,23be033e01f8be8f +6300,2d75ddb36c9e214e +6301,6574d687098e75e2 +6302,0360e32f2382fec4 +6303,95de8d6180c53b44 +6304,c11e94f0f8319548 +6305,3eea21b27a3f3517 +6306,85c148d1f4118fe5 +6307,b8fe4244e0b20c4e +6308,c8039aebfb140531 +6309,c9958f0a04c98814 +6310,84afbb874b1f79cc +6311,17dbbed639f179dc +6312,4efeeaeaa1cb76a5 +6313,8c61ed2ea192a1d2 +6314,84b935a45e0d5ee1 +6315,77198e531aced8bc +6316,9ab4a54b428b3eed +6317,77ef14dc78113332 +6318,dcbd5285c00715d1 +6319,7cde31becf43760b +6320,0130b7f4f664ee5d +6321,9739a18ae184d3c8 +6322,9f9d1c51d8eeb47c +6323,8387c6eb3bbd6a36 +6324,21038b8e308e628a +6325,bbdacb4b8f7394ba +6326,0d514ef15ae67fc3 +6327,ef7da17f2f76d6b0 +6328,e62321ee225878ab +6329,f71001a95068dbe5 +6330,781f9f5cc0fbdd3d +6331,626171bff3e00aaf +6332,319451193e23f33e +6333,c991400b5a54b9d8 +6334,0e3813b5d6dadb18 +6335,331d47b79265b58e +6336,c463f724c627cd78 +6337,fe6a6217dc60907d +6338,130dd966376119f6 +6339,ec8456d6eae0f811 +6340,cf8376a528f511a1 +6341,3c15a4e61299d34f +6342,58946decd07838cf +6343,ebdf1b42cf15fdb6 +6344,b11ad92580c3299f +6345,0ed2cd0e83e03e4b +6346,a8e5545ae258f960 +6347,1da7b8e9893b78f4 +6348,32cbe8a4dc70029c +6349,d094aa2b172fb7db +6350,522301faec9e15e3 +6351,0d44eef14d2cbbac +6352,60ac0ac803772197 +6353,e01533ca963a8446 +6354,5296b9c9325a184b +6355,524ab60a9bb78af5 +6356,65725e6af60ac47d +6357,7c68442512c0344f +6358,7cb9233460a1c632 +6359,b76271e76a7f7d39 +6360,d3a0f4db12c34ad9 +6361,62e611d60f600549 +6362,4741856cfb7410b9 +6363,88fff86bd69385fa +6364,a1f2cb9242c306dc +6365,1e66dff68ca7be2d +6366,a65808f5031eed5c +6367,7711204481333bbd +6368,125315667def736a +6369,1fec29db3710ec46 +6370,73a50b3f6e74f0b7 +6371,2513b2cea3aed721 +6372,ff60f216231c875f +6373,77b36bf8a5b61c38 +6374,4b68938fd6a8bfdc +6375,078649175d830f75 +6376,19dc474f553916f0 +6377,6f58bef4a8c66a80 +6378,d237ffc5ece61bf6 +6379,531a1080f4847c29 +6380,f53d19e19eec2fdf +6381,e0b791bc39d446b4 +6382,46114d084f8da74f +6383,808bbe07455ae918 +6384,ba7110dc67a87342 +6385,02b1b914489b8fb8 +6386,153784d92bbd12f1 +6387,4980ddb61c6118a7 +6388,600b631b5eef431d +6389,b4e855409ec96027 +6390,b71529e9df00b8cc +6391,a6bfe8d7af624515 +6392,a7199160acfd8e76 +6393,65762c3ba3326223 +6394,dba3dad5716d534c +6395,95a868b3763b99de +6396,1adda617d389457b +6397,55b24fed96101962 +6398,aef8db432ee9385c +6399,c412f002157184c0 +6400,73d9b32d20bfafeb +6401,14c5c979a50838c3 +6402,e3eb17a5c6474d3e +6403,8a290cdf58863b80 +6404,6baeb265f2e19533 +6405,ba8a7daa62dcb551 +6406,699552c5e3b5ed99 +6407,65358f411da26c7c +6408,174a0c98e780e478 +6409,e30d921c52832e75 +6410,f561c9318e674fc7 +6411,828279e87966619e +6412,5fe39edc6862ffca +6413,e854105dd2f8b8b6 +6414,5ae86eadca6db916 +6415,8b501ec50da849cd +6416,6759e01ed047f556 +6417,ba8f7bb1283a8993 +6418,e66d0b60001978b2 +6419,bf1a7c0f847bd251 +6420,fce355a52776cc01 +6421,d200bd02e2ed8ece +6422,2404d428891f5dcc +6423,d27ffb2df8c5908f +6424,0de3b07f6201ffd5 +6425,7953d156b03f5976 +6426,5fb61d7088a9af38 +6427,65cc8c384cf6f4de +6428,64b79ce2d2106049 +6429,7608c53a826345ce +6430,6d4c8783e0c1f358 +6431,230ba0ac51e1e988 +6432,7830661bda66e641 +6433,d3a1a7bb4995103d +6434,b0a6b2fbe94c7f44 +6435,aa6bc42df95049ea +6436,df1ea8ee3745bad8 +6437,ac4c912d144da9b2 +6438,1b094052f771cca5 +6439,52221b603b9650a9 +6440,64c9610eafc1fdf2 +6441,76a8e8ac5e595523 +6442,4ed71af37ef779b0 +6443,7cf16e6ce83b00b9 +6444,60bd417cc86a3631 +6445,e4f31d8cac8dde20 +6446,e8de3a5faf5c104e +6447,e0f5866d6914e4df +6448,94370f24e8761c73 +6449,bae4daf72235ab84 +6450,1da40f7df6dfc110 +6451,b62433362868298f +6452,c567d4cce54870eb +6453,07f81a43f4af0f7d +6454,26c3c598c9399ebe +6455,4bd350c3d62655cd +6456,22c850b795b12cb0 +6457,7f261f9e53016d01 +6458,761756fb040b7127 +6459,e7340ce0b7ad3b8d +6460,f4e05397ec1a3539 +6461,799d0a5c67d7fd99 +6462,71edbaa1e6c8a048 +6463,007591c3b5a6ce10 +6464,312f9a0b15188dae +6465,4f881589d248d9fe +6466,68b3ec3e2dd7975b +6467,6a18c1424ac31607 +6468,9338c0ca90f889ed +6469,ae9f65d4318c8033 +6470,9aff100e1818839d +6471,e7a613d9d5806243 +6472,a305e52437dcf8d4 +6473,cdd047c33e6dd6fc +6474,2e082123f81e406c +6475,739e27b72c6f26d1 +6476,2da9ac12c9563284 +6477,3854689d37c4d4dd +6478,0ee65f240ab4c752 +6479,bb4da39535233eef +6480,8b677aefb7391eba +6481,8f200a90cccb924a +6482,ea24516638b01656 +6483,7b902a7824e9fd5c +6484,38138d53a56b8a2b +6485,1b070e9ac20e7633 +6486,0087626c97b77eb6 +6487,2eed8e9574ec20b7 +6488,80da8e2b9a29b333 +6489,71c7b528672d32f0 +6490,3c8d55a32e9a971d +6491,2d3470191d772bbd +6492,43459f0eda195836 +6493,3b1d40349fc32534 +6494,0c1a3e9e4f9e1f22 +6495,9501ba1d48e8edc5 +6496,104ab009b3b1a556 +6497,c913509c247310f3 +6498,f3c4ae4812538ab5 +6499,39974bf332d93554 +6500,5df2733eb1f7a715 +6501,bb201f1ebda4f651 +6502,0f4055bc07e4fd45 +6503,7cd2a706eb1bc979 +6504,181a6a143ba79b39 +6505,92f79d9615ad0c9e +6506,83ac6ec4621e1638 +6507,3087d5b8d17c5e64 +6508,256951c73d99c3e2 +6509,3b2bfaab3e8bf453 +6510,2905257f64847b2a +6511,347d7871727b9490 +6512,1bdbaf88037caae3 +6513,0d8085d840d6d37e +6514,bc8dd9d58b0b4b09 +6515,6c416025965c2390 +6516,f2a3079e6625f864 +6517,63c2156d592e3bb2 +6518,08a5c4f17e66e9fa +6519,d220ad7f9d07f4f5 +6520,681e39e791fb1986 +6521,89ef7f07b38dbab5 +6522,d50a478f813140d1 +6523,5aad7397fc1aca4f +6524,9dda7125b8a5434b +6525,7aae717bf45983d8 +6526,ab8d9f57d6d26f7b +6527,515d31e35f9103e2 +6528,b5d46e4d2081316d +6529,7c978722a8072f56 +6530,6cc1730ed3c95803 +6531,d663538a96af4350 +6532,eddf872e21f12a0d +6533,56e279b1c7b22e7a +6534,1a616cb06ca8d364 +6535,b8085c988cb424b5 +6536,9916d2203c974c62 +6537,0d3916f2626f8793 +6538,d13474e117d9ecb1 +6539,67a997dbc5528c96 +6540,14e63afc14db070a +6541,5d0bb29dd9543204 +6542,30d3a8ee647097b9 +6543,0e68036c7642b52d +6544,4442dcfaef9fa1dc +6545,406208c4bd4fd662 +6546,1a7a29d044561733 +6547,96e1ff0d7acf876b +6548,28db5952e2530f84 +6549,9c8d9a86064f63e5 +6550,3d382b170ae45701 +6551,9d23cf60b5a5a543 +6552,4eefb3a3e1868d26 +6553,c2106fdf6003adf4 +6554,2ec113d3dd45c3d1 +6555,7ee0605cfd961fca +6556,435c422a04cd0768 +6557,fda8e4ff4fbb9fc0 +6558,961344f79919a0a2 +6559,627109301f91e9b8 +6560,89813cd8c76716b6 +6561,ce27437b5a8161ce +6562,cf7a22103c7dbf48 +6563,81348bb4bd9eb5c8 +6564,10f9a1e754967ced +6565,fe7994628088402f +6566,810e1c5082b10284 +6567,492083fda78aef36 +6568,9e501e0ecc26a44a +6569,d9f0704b386b8a34 +6570,84501407a6bf46e8 +6571,a90563e1e5acc813 +6572,ffc7554aae2cda29 +6573,0d61c16ad57ee431 +6574,cea38fecf53c5f19 +6575,ad003db5d5aabdc8 +6576,334d252a70b86ad3 +6577,5be5227daaddd04b +6578,bfe3518d0ec76a1d +6579,119b93c60204b440 +6580,172ce6f983d63673 +6581,e951d7b56ef2f884 +6582,1fd6047228def728 +6583,2160eb21bac4fbdb +6584,2f1fc9c5952f13cb +6585,7a1c677374259ea9 +6586,ce857962ea41bcf2 +6587,c4c862c66776769d +6588,258aaa5e32ae9dac +6589,6d1df0ed96019b26 +6590,3eed6fed54d52b10 +6591,ff5d9f12178c7e54 +6592,916519df6ccd7f0d +6593,a1eb9c6faa949c32 +6594,519bccbcd596cddb +6595,e57821ae8bedd7b1 +6596,3da5266d452f351a +6597,8ecf76a41be0fde3 +6598,ac2af37c86de65a3 +6599,0f2d2e67a823d883 +6600,c2b951425998c6f2 +6601,ff9b9c4a5fb581a6 +6602,df55ff3a7f8d658d +6603,2223c43a65c64a5a +6604,dccdcfe94647a1f9 +6605,6b1e117b8d8bea7c +6606,dc0dd83d7e7e4ff9 +6607,1daa93da5d50ed2b +6608,692db6ac40b1370d +6609,42bf52d0c1111d66 +6610,0a4108f918379d90 +6611,ca8a0e9350f78783 +6612,3d8e52b358521358 +6613,3105b716308404d4 +6614,464bf78f7a3aa11d +6615,e7de40b44a7c56e0 +6616,8215a7d63e833159 +6617,8c025aac50d0dbe6 +6618,7e39f376e739cdac +6619,02a9af2648191812 +6620,0cd572068030aa6e +6621,47f659543f3b407b +6622,9bfc535236b1806f +6623,06c296d217a8a17b +6624,09c65a260188a8a3 +6625,f8abfd95dcb1cdf9 +6626,2ed4a4e955f3098e +6627,5aa9dd239d1c552b +6628,5fa000e97d62c5d4 +6629,3192ad3a38ecc842 +6630,48fd22b3fd0a8945 +6631,4bee62cb82382939 +6632,26675b4d798d8e4a +6633,c8b054b31bea957a +6634,77673e5f70f512b9 +6635,6ec0f558e450585d +6636,05df8b1282ae84f0 +6637,6204c973bdb47f7d +6638,cbf48e46055b6d57 +6639,634bb538bb1ad8aa +6640,14dfa3575654b1b7 +6641,50e009766e8d7545 +6642,aea4d3cc5af8be7b +6643,0a83fb24cbb30bb1 +6644,dba03019b877ec5c +6645,99581f3dfe4d7d84 +6646,fefe8dac087b606f +6647,ef3a8b361acd2615 +6648,84bc318af62d4e7c +6649,113c05715545827d +6650,dcb6642b069d5189 +6651,117f8058e0143740 +6652,2fd952260f38969b +6653,3e1da0088d286d56 +6654,ab281938d424da59 +6655,f9e980d50d9c1e8d +6656,b5f1543658c85afc +6657,7cf560dc5fefa3a2 +6658,e5a7fc2668c2cbe7 +6659,22a325d679c40892 +6660,0f885461e8356eb3 +6661,891628c2306a2d75 +6662,3298b1006ba665d9 +6663,7802c8424bf812f3 +6664,2732e7b802230bc5 +6665,6773f2a3366cdc8f +6666,9222b34d7837b449 +6667,b328116e7d11bb4d +6668,0a051a9658d413f2 +6669,e985c809124af73a +6670,a854d8600bde80d4 +6671,009acc2827f29ddb +6672,669d072a60c8cd14 +6673,669359f77d982577 +6674,17427c7a62671d8a +6675,d69249ec25002110 +6676,94e1148aeaf0f587 +6677,44c03f903ca820f5 +6678,ddb33e8a3700e089 +6679,f8f66e682081a195 +6680,d6734cba76d6ffa0 +6681,fab88c44df624134 +6682,9821c47bede063e5 +6683,480f0d441dc28953 +6684,07094d8cc0f1ae11 +6685,d0b10fc1b6a712d0 +6686,560ebabedfec0554 +6687,365065eea2b59f1c +6688,04e4139fc777217c +6689,6d1bcf4da8ff6e31 +6690,578811a0458a810e +6691,f98bed031b3f4a4b +6692,c69d26b136767201 +6693,56ee63f9adb42acd +6694,d41566bcf969a97a +6695,b34c3b9355c0aab1 +6696,0713aaa20b8b94ad +6697,b3f4c22ea49f4e0b +6698,2e5b0aef1c71533c +6699,075fa8e512b7195d +6700,2083175f17ef29fd +6701,11dae5c2a0fdf5a2 +6702,3c72fb0712012e99 +6703,e0d5ade3ae93e516 +6704,bab9b015361c8e14 +6705,26931cbfa5341329 +6706,4998c3c076e4aead +6707,e3ae90fbd3804948 +6708,425cba0656788947 +6709,48f3847791652b39 +6710,0b8a88b084c1d172 +6711,a151450e4d2ab101 +6712,81ce1932f8fb2a69 +6713,40a4a11535852ce4 +6714,38bd364dfdfedf02 +6715,867dfaefdff8e7fe +6716,57401a59ba478be3 +6717,b1cf36fb5dc1b137 +6718,e91154eef11f2afd +6719,eac3c7eb8410583c +6720,a8a377501f15aef9 +6721,26c720b6dc22c25a +6722,302134ca52b27aeb +6723,195deff137c6e726 +6724,32d4ffd46b3ece51 +6725,8367a5a72d1f76df +6726,842eda8d42df3305 +6727,95493696c4da947f +6728,e11b475cd51468ed +6729,37ab75460a37f9f8 +6730,ffe7f3830d75f144 +6731,8dd33596fa6aee2d +6732,5e2cd1896582c224 +6733,5ece391779d5f2f5 +6734,6a8027d9d616fa1a +6735,efdfa37665977257 +6736,ceae9e808d222893 +6737,eeb33e52bd563f61 +6738,32cf5447db9d2e5a +6739,e833e4c299d284db +6740,c762531ef480c369 +6741,c14a00c1e9e39c91 +6742,dd519bcea92dc74c +6743,f93d1a221dcfd39c +6744,64c21c7c143b82c3 +6745,814549d93da245b0 +6746,b8d160a1da3d7f57 +6747,f2067b2b97569b18 +6748,f449f0897b1074a6 +6749,c45b7c5ca80d0a6b +6750,4f99160d79d5059e +6751,7a7cbacb0daf1dc6 +6752,6d124796cda98eb4 +6753,eb38668786ed48a4 +6754,c3752d280d025bf5 +6755,00d415e10c844c0f +6756,68901b0495ac887b +6757,352a284f8f0d44ad +6758,bb55a09e8812e4c4 +6759,d299321a0803137a +6760,7d6d0d7eaabc605c +6761,4e8ab98e37532ef5 +6762,911b4898b811cc6f +6763,293ad6ae8426e4b1 +6764,401f373a06d3cec9 +6765,85575194fce636df +6766,e1c5c37b71596bbc +6767,42a5af661f7ecb4c +6768,a629e61ab0a4ce6d +6769,b5a892970c5a4d18 +6770,ab22511b10ef3205 +6771,4ae09ab6a51633f8 +6772,61cb32678707e3f5 +6773,38058b04b7befd16 +6774,54002c9b7271de35 +6775,c30ca573615cc940 +6776,fc543e0236a707b6 +6777,fcd4f7f8cf8c3914 +6778,081fd6fb78a05ad1 +6779,0f727d56a768ced4 +6780,95df43e294b7fc86 +6781,dbc895ef0bb164de +6782,e39004326d1adb58 +6783,58f49fe71d5f8255 +6784,8050b9a6f63209d2 +6785,1f8a5efcef347333 +6786,77bc1d13babaaed8 +6787,d0b04d7bc638974b +6788,34f07c90f70ff253 +6789,cd02c91cea7135b9 +6790,9241156d1dad3343 +6791,42cf8dfcc5928677 +6792,1f425f4a5a1f9829 +6793,86f53aef4f19d71a +6794,e091e37c710afda3 +6795,157e77648143f180 +6796,907acf549d9ff88c +6797,26a68c7a299a1407 +6798,c0df5eb23de471e6 +6799,1ef5ad876e9d2980 +6800,f4d5b5ef393e56f1 +6801,94511ca7fc2ef8bc +6802,71e8c74073dc64db +6803,29a4cf5a237b413d +6804,c70b8a69843d4176 +6805,6efdc6c1321f0eae +6806,05e9b302d8907e65 +6807,012c2e1df0c73a6e +6808,7688a7b12001f37e +6809,1136a5d57469d85b +6810,50fc508611a5fc1c +6811,38ae21f833d5f383 +6812,1dd81487c5916cb4 +6813,b2b0ac8778e55476 +6814,f0a6a13b1df73dcb +6815,c1c52a37a23fbb0f +6816,623ce7353e1d6329 +6817,040fb450c0f1b2b2 +6818,c750d82f4a81a3d7 +6819,36a7bd1f6369e57a +6820,6080d76024f9f2d9 +6821,c46ffc908c7d1b96 +6822,c220a7479de9da83 +6823,98d718d2f5b662e9 +6824,3774d1a84f49e4cf +6825,78407331c147d20a +6826,5a94d6f9d25b3164 +6827,468dce434922a76a +6828,b52bb33e4dd61b46 +6829,fd8a1ffd4dce3739 +6830,39d0a26c2d8fdfc2 +6831,bb6003484a5560cc +6832,792480f55e845ff0 +6833,fa824b1c3e53e0b7 +6834,1f59dfa0a773359b +6835,e02f4f21e03aa976 +6836,e73145e504a2f638 +6837,8451111467ec694e +6838,acd0e968f13bbae8 +6839,cea1fdf3843d3c81 +6840,f14e527321c05435 +6841,6a000ad8fc8b0646 +6842,a41ceac04e0d360e +6843,020149d082e34ad7 +6844,7649e335a58d3e7e +6845,32254b317097966a +6846,ee38b43af21443f0 +6847,3f6033f2a6b8ca4a +6848,dc06bcd41038a2aa +6849,b0b1ea77bdbc77bf +6850,bcb0745185b43c20 +6851,344f8319d89d1e11 +6852,4ae3e4185c0fa902 +6853,2456f81a7945d005 +6854,b57570c061d42bd2 +6855,11041e84af233d19 +6856,965c7ea06dd50662 +6857,3e99863df924b22b +6858,23bddc6ac341009c +6859,71930c1b4dd878b1 +6860,aa046ccd648811a6 +6861,a7e37098741d8e57 +6862,5526fcf3e6f5f0df +6863,afdb449f34aa6b83 +6864,886a3a0a1ec3a155 +6865,22f1e1b139bb88c1 +6866,08e19626950500fa +6867,57817a7fd8093437 +6868,7d4c4234bd6318f2 +6869,a5f0fb485e05a351 +6870,1cd898fa02fc9d1a +6871,cd34ddb34c226a7f +6872,f900e02f6cb965ea +6873,16ac4395b915e5cb +6874,a58566ed208d1e60 +6875,bcb3e95dc48d7841 +6876,3c53ba43b04fcf6b +6877,4c085c5d4a920c98 +6878,21d1e553ac3c00cc +6879,93ffb8a5ddcfb9d3 +6880,c4b179054fcdd1f2 +6881,6d2b08c9786ff1e2 +6882,7904dc9ba4d5443d +6883,ff7b72988d3d695d +6884,3620cdbdc3151394 +6885,605a6a75fc7c4b73 +6886,df3c68e62b6376ee +6887,10bfac8747d13607 +6888,d5ecfc4c336c784f +6889,4d9870112f2516aa +6890,7d69f780b603c887 +6891,6a21269633c36b2b +6892,cb2d87f83dee457b +6893,0feae8b2369a89b1 +6894,18e7112ceea06daf +6895,d235cf09cae56ecb +6896,fdeefa146a98c147 +6897,ee653663c2e62009 +6898,8736b2d12f901df6 +6899,aa0f7b4324974e24 +6900,cd4c096a8dd64176 +6901,eb35756b88ba47d3 +6902,30188054e0960f81 +6903,27a78a2bb0f73012 +6904,0a1967ca2a624c79 +6905,958f6d73dcd99518 +6906,a8ab60f84084acb4 +6907,fc1f78152cff316f +6908,38160b7e5fc55486 +6909,121632a45a26a531 +6910,ee62ec3c3b52598f +6911,52f22513f25acda4 +6912,5f0936ef0d4fef0a +6913,e2b43703ca005164 +6914,516d43f7c12dc296 +6915,e18b2635a82288d3 +6916,14dbd65e66e26f05 +6917,d9b1a5c8e9b18886 +6918,caf7c2c543604594 +6919,a760baea5645813d +6920,7e3b3be89a600ff7 +6921,9907dd113cf3c66e +6922,7345a6e5909a1983 +6923,1728e0d61e9f9455 +6924,b9af618ca4ea3d79 +6925,987d366a59659ee5 +6926,3038cd4bb5992114 +6927,8b5c1e98995f41ad +6928,be66752a0d2d7a85 +6929,f285673ad87d03b7 +6930,6a29fa923d13b998 +6931,37c55b250160f2e9 +6932,8de85690705fe589 +6933,b6f9963f681623fe +6934,8a454ff37d6a0f3b +6935,4da1d1142fb59bce +6936,29979c44e80ca00a +6937,57bf75c91d5ad134 +6938,b96d9d71ce8e5485 +6939,9b394366a1cb6c60 +6940,d763d7d5022acc3e +6941,d9413f2fae7b25ea +6942,62a55789fc8357c1 +6943,05daf874cfdb488f +6944,8ad92c30f8782ced +6945,8b1a4178df099ee6 +6946,6123599fc4d07755 +6947,df8a72e8d4bc46bc +6948,132373d9ed5a5bb7 +6949,a37f846fb17033f8 +6950,fb8945037826be25 +6951,22216496c2c61ce9 +6952,23ca4cd85d71b839 +6953,5df7fdc6a0f9b291 +6954,b03903dfc6bce66b +6955,26b781afd490ccbc +6956,aa24d0f1b7a5ba31 +6957,7088f5ac465b1d42 +6958,33653c3fd81d36fd +6959,5b040280b27a66b8 +6960,34fec69e56ea411d +6961,53566110c8abd8d4 +6962,d820728f424987ff +6963,a66a10f0a3a56046 +6964,814376bd5139eb38 +6965,9db2b9af04454473 +6966,4c87c8cd807dbde3 +6967,c01914bc72aecde0 +6968,b26e3855e501e156 +6969,8cdb95637e14d5ed +6970,c3131c78ec513880 +6971,889b8137de5b83ad +6972,793e57b29033a0f9 +6973,6023cecd4c8b73d6 +6974,b1434d378d46b3b4 +6975,3c25153be2447097 +6976,7f0e7222b1850014 +6977,af79308e688d25f1 +6978,6d0540e600829626 +6979,6920f514e8b871c4 +6980,724307e85510a5dc +6981,0607dc9ba557132d +6982,1ee4d71478c3e163 +6983,8df10d629c4a7ddf +6984,a93311bd038cc81d +6985,24f617445014d210 +6986,2e37b5be8e3a223e +6987,d04c9de19b9b8210 +6988,e90dbf2b6a68429a +6989,5a68e83cdbbdc354 +6990,cf48ca148c87f8d0 +6991,3819651a7499c25f +6992,331f3cb49c3edbe3 +6993,86b07fc8c823ef59 +6994,52e592166e4ce6e2 +6995,0dfa7f1a4d4300a4 +6996,51b25c10be8811f4 +6997,0c19cbd9a0a164cb +6998,092193797872ddc4 +6999,74e5343566c980bf +7000,db4bae097fb50990 +7001,d17620815d7735d8 +7002,470fe65d6da6128c +7003,25269a037f307da8 +7004,483e05c21d15bf2c +7005,e15950c532e251be +7006,3577b06df07915f9 +7007,7c55bba9c2c5373b +7008,092faa552095fd24 +7009,2edeaff52b788a23 +7010,d593a4d64bd804f3 +7011,767b7a017917d9b8 +7012,fd64017c2d301bc7 +7013,0e79aa4a112a385f +7014,a067f08b6eae532a +7015,47121f4110eb71cf +7016,aada1ce9cdce2525 +7017,252dd71ee6ff156f +7018,8f3b890afac84615 +7019,c7fccde202563884 +7020,e0572f21aec3c195 +7021,7669104787a6a00e +7022,4c20ed177964ac86 +7023,0732fcd8cfd4dbea +7024,1991161139b90573 +7025,d633b5eac0e33cb3 +7026,0c4950feb3cc990f +7027,44310465b6b37d97 +7028,83bd3359fc8872b5 +7029,ff7dcbdaf68e5119 +7030,14a1d5ff46539f1e +7031,d4409f0902cdc3ff +7032,c8f490d35bf2f17b +7033,7e819f050750a6c5 +7034,b25dfcf6e7eaf656 +7035,a470e2ea6199588e +7036,a12ade032ae0879c +7037,85b747756704f100 +7038,46730c1f24696c43 +7039,f3abe3c799f3d98b +7040,ad98f0e61285fd43 +7041,ac98b3813054dcfa +7042,dc38835748df4469 +7043,4cf20788a42f3074 +7044,4d7b7c778e175ad3 +7045,e9cc218617494028 +7046,e80aeecabda01e81 +7047,48a8fa292881d381 +7048,0629744009e42090 +7049,862ca7fabe702d15 +7050,95e5270fbec00b79 +7051,8a7e49b9657ee351 +7052,f72db914db7d899a +7053,168fc9465d8003c5 +7054,042f2e350b5e18db +7055,8c9f82a45c531191 +7056,9611e83f314beffa +7057,bee4a617b541bdd1 +7058,73d459b1307649c0 +7059,7a950f31aa18d5e6 +7060,6cdb2a065c452fa4 +7061,067ec98dec792cb0 +7062,5e92cfb96c805ab7 +7063,239a56eec3b75beb +7064,be4843248bbfdbc6 +7065,3998497a6ceb4eee +7066,8b849972dd68eed2 +7067,23635e2ab22f7af9 +7068,b78f348a60450a43 +7069,fe9b5d5587a4c04c +7070,ac38e5d752c5b887 +7071,abac0fcdbe126f78 +7072,1faa2420bf0f889b +7073,9021a8df08e46be2 +7074,30fd8c393b7e085d +7075,48105eebbfc7fb66 +7076,5c84f61e7f1b09f8 +7077,ab8a2bf54fb925a7 +7078,561580cd46f8c32f +7079,21124a2347f037e1 +7080,dcc05c6a28752c60 +7081,71f09023ad951515 +7082,93414c009abb5ecf +7083,fb8f50534683223c +7084,8830102a7341323a +7085,28aa56100a6de4eb +7086,400874dbd317def3 +7087,fe43515b190f6b01 +7088,450abd6565ae55db +7089,382c17f6634cf57f +7090,e0f20816ae589529 +7091,c965a995458b7902 +7092,caffb7e93556f9c3 +7093,0a4a57c1e1bee541 +7094,aa044bdbe86edef7 +7095,e2ff3659bff648e6 +7096,f5c6d23561346b75 +7097,e249b3836f0addc2 +7098,a14c1da7c656ce8b +7099,3617c05a05fd35a8 +7100,51a54e757a70e27f +7101,d3b07cad4132ba93 +7102,27e6152fffccefa3 +7103,0856a45ce6918e9a +7104,8900bcbdc17ac869 +7105,e6134db276bed0c1 +7106,f7d93a5c55f0e71e +7107,1bd77e0c01dc1d4e +7108,7c6cc13e1ff91d40 +7109,80d0274003ce778e +7110,d9ab7c454380371f +7111,22e987ed95f67b13 +7112,b534f032f4665014 +7113,a6c8c896cf47d6af +7114,cd12bddbc12e11d0 +7115,a08e9daeda186838 +7116,07d9a45f1c196821 +7117,ea268636db5f3034 +7118,44f9f495633cbb27 +7119,df9cd9c719bcd821 +7120,a36a1e1365ad1dfe +7121,24f885b7d48fdc46 +7122,70b878c89f023de8 +7123,4f3677cab5e487f2 +7124,a761cb3f8b035d88 +7125,787d493ed804973d +7126,0e47271c4bc3314a +7127,0e3562f104837b34 +7128,b485051762dbe29f +7129,beac7aed0710a5dc +7130,d232a5e66b943ed5 +7131,e2afa389e9b90077 +7132,130f997bf3e7dd5d +7133,5a212dbd72294365 +7134,4dd322e0fce40387 +7135,a3bd93a6b2dc01a1 +7136,13f8ca010561d9b7 +7137,7b759a2f0375cd29 +7138,eb88decae8ab64ef +7139,c8fcfc9712a6e42e +7140,fe71848ff5bb4670 +7141,f4f98b87aba0b758 +7142,de52902302514ac4 +7143,9e32d87b85beb737 +7144,0ed0f2f59fad1de6 +7145,f5727201e4f21bd2 +7146,ec88b074320c0dc8 +7147,ab94f06adba49bfd +7148,fc3dcd3ae402f4de +7149,b8f9ec3b5171ea2e +7150,8a04517ce049ce80 +7151,b23119a88a86639f +7152,a43a9829019e347e +7153,8ef6c6b6731b19ea +7154,8686593b0cebd823 +7155,fd11e0fcdf042f08 +7156,21373bfb248ffc54 +7157,65ea5ed1dd233fc1 +7158,a3a622bc5a101f30 +7159,d2fbd8f8ee4ee714 +7160,c49e95fca2c718bf +7161,d19584179b00d89f +7162,66a5bb7a95980720 +7163,f36d941bcdacfa51 +7164,b419daf00d06e32b +7165,f24df25d664e666e +7166,7208d0d216564c4a +7167,52d4bcde85a8aaca +7168,d927232251856bf4 +7169,4bbdb490288ce4ec +7170,28d1e101f9f4b4ff +7171,17e27b98876e7914 +7172,348dfc53b3cf7739 +7173,8342cc5ffac989fd +7174,6fedbc1d67728e33 +7175,5faf42e189aada8e +7176,6ea8787aa1542803 +7177,7f308b16141d4dfd +7178,e1fd0050f6dd0d99 +7179,f9bf8d950d4980a1 +7180,b0e5afa6820cc60b +7181,43df72128ccc26fe +7182,667fa00ff29c2645 +7183,ae9a396615eee181 +7184,af90233d823d5abb +7185,45d460e3e4b2c7d0 +7186,0fa9e7ec2a4cb515 +7187,dde27b54f4f4c426 +7188,778447d084990995 +7189,526fbc3939837114 +7190,48a6c2612d7aeb6e +7191,0955e5e26011b4e4 +7192,081d3ac80ad37813 +7193,89d45f0b8bf09cf5 +7194,d288bef708f75c79 +7195,0f4e64d5274af2e0 +7196,1a894e623abbfce3 +7197,acf491b6c99de789 +7198,f021d6018c1e37ce +7199,02a0040a2c67fe3c +7200,27e51d54a4222576 +7201,323072b43be10108 +7202,a9073800ea2119eb +7203,5de658dd6c94c038 +7204,0dd2af09212ccbfd +7205,9ffd3890666786e5 +7206,31c36d1b3639df46 +7207,65d1aeeff938236c +7208,1f98d53b09f8ce30 +7209,33a104ab6ff38312 +7210,d172dcc7db3a2589 +7211,33e2257a45f81eaf +7212,e860edc79f417ce4 +7213,7da496f645757996 +7214,ec1c68ff7b844ff0 +7215,293afa93dc957ae1 +7216,c3f7137227de19f1 +7217,593bb2c283ae431b +7218,59578f8699273638 +7219,f74801bc788cb0f5 +7220,c8040c8aa73e48d3 +7221,c7489b83abf73906 +7222,bb1572cb42d6fd2d +7223,5526d817c6902a26 +7224,a2b8a0861ce956d4 +7225,77555edede1f522e +7226,f984d021f2c0244d +7227,70abc162fc87d72c +7228,542654490b6d54ca +7229,6dc17fecbd25cf97 +7230,273987d47aba3d6e +7231,35f2518c828cef7b +7232,a9361c3c98484919 +7233,fe90ff30544b120d +7234,5c0597ff1f587f9a +7235,d0ef5353fba85ead +7236,b3b2006c57f644ce +7237,5ad548fed5573438 +7238,1ef34c701689aa2a +7239,c179f58c9008f13f +7240,e77d02162015673a +7241,7629984af916ad1e +7242,097f3d7517c16abd +7243,2709c08de6c316c3 +7244,f0250b0a72363423 +7245,f1be64a3c0907bfe +7246,cc5f124522c17c5c +7247,a82b2ad921eac195 +7248,fcdb1bc08bc7519b +7249,2f1522a44dc0ed2c +7250,0be0fb9b7db4fef8 +7251,8173c6f06795ede6 +7252,9de7182eb30ae4b2 +7253,f148125e5677c442 +7254,dd9864ae0c646292 +7255,68c6327b279402a1 +7256,81c419e760ef98b0 +7257,906dea1bec997201 +7258,3967cc13106a2f31 +7259,4d7c54387ef02c2e +7260,a1c3cfc06797934c +7261,fc1c3194c808bc32 +7262,300d0baef5ca3dff +7263,d0e2803f52306c4c +7264,708b9882b81be2c9 +7265,d557d410d336633a +7266,7640a0ebd4b4fda1 +7267,c0103f3e3b7ac6af +7268,f3a691e9149fda5e +7269,d9f353289eee8987 +7270,c92818276febfe1e +7271,9fa0a79adb26582a +7272,f8f380b7b6fc99ff +7273,6c28318c4d5148bc +7274,ae5bfbcd6b54263b +7275,1f6611266cdbc2ca +7276,d565311349c463d3 +7277,2c09343084e561cb +7278,7ceace882925ec9a +7279,71f4ccb7f527d281 +7280,2ff8d2d90025a8bf +7281,b01fb62a26d4f873 +7282,87cdbf8be6200518 +7283,63ec2725af2b0005 +7284,18dece8f350ee174 +7285,e10de4200a18a1ad +7286,b85114057fc654a9 +7287,4c1794e74225856c +7288,efe10bad301d6abd +7289,c0957d7a0f8f43c5 +7290,5129f590f825b273 +7291,3ad90acee0b3cc93 +7292,6053b57289543533 +7293,d4b6242abc7e06d3 +7294,5f535cefc307b037 +7295,0890789acdc1bea5 +7296,cd0f5dad1556e53e +7297,2d9aefc9990832c2 +7298,b4d9328d64ba127e +7299,10b1a22d59db226d +7300,479d8e8b213cabdc +7301,59f005685938cbd3 +7302,076c4cec73e10bef +7303,358ce8b126c6a1c2 +7304,ac6cee77baa90625 +7305,2a9075dff144d409 +7306,67aee7516f166c50 +7307,d227b03ac1c43109 +7308,b9fdfa8e4689442f +7309,a356c115bf868868 +7310,c5a7c13a13d17e31 +7311,6394c88301184003 +7312,b2d73260dad45041 +7313,b81f8fb0c6daf56c +7314,68758e2a571a5f55 +7315,fe7657343120bc3f +7316,73c7e867c6283ee4 +7317,c49cd765b5178bf9 +7318,72f767826a13db3a +7319,fc92a28aa72af46e +7320,8c55e7443a68332f +7321,5719c58c6a7a77c7 +7322,1b1af4c96ff64cee +7323,4ec48d0be959d553 +7324,7e9ca797410f68ef +7325,ecc0d1d0b35aab84 +7326,befb6e64147126de +7327,63cd57087171d7e7 +7328,d106b15eeebf4c2e +7329,bcac9ec8c92b4ba1 +7330,8c7c2f5e16fbcaf0 +7331,d195e84152d49508 +7332,ec43264f21e465a3 +7333,cc4d9e338d5b4ddf +7334,d872dfde7101d25a +7335,82a713943b0092c9 +7336,a7dfd4a729c663cc +7337,7f7071b9e9e607be +7338,431c0a62b942c0ab +7339,f391f92072740935 +7340,6bf62acdd1c3a0af +7341,b59513885269c4ad +7342,d6c76cc96a8a61fa +7343,586763fd07304076 +7344,fcc7c284aea89b77 +7345,9740ae8d391cc5ab +7346,d0a575e5537b2ad4 +7347,db85f004d56ed636 +7348,48de175805f0cb9c +7349,0d4bce75d5c8b60a +7350,a72b03849d231ee3 +7351,f4b34ba708613496 +7352,49efa1af4d3ec7e7 +7353,2ea6e3a375f9e913 +7354,81cccf07cf1dcd27 +7355,28a16d71cb377ff0 +7356,baf117259d8055bf +7357,69fb0fa738001e13 +7358,9c8035f1c95ad339 +7359,875365da309a268d +7360,2e986f9f9a7baf59 +7361,01bca24cf1db20e9 +7362,50913249b6ca9008 +7363,ff5d281ccfb00db1 +7364,824006e9ed582b8b +7365,22ae318eec4daf54 +7366,7bf391aa6c12d58d +7367,72f39d8c2c3ce3b5 +7368,bb04129ea34c2aed +7369,99b7c99828017daa +7370,42a85623697d0129 +7371,863857ad8c272dce +7372,c43133ae7e9e115b +7373,f128fb7705da7118 +7374,e4df8b23f490536b +7375,26c87eaac25d58f2 +7376,b67f4b9b4f83165b +7377,648ce147052a5018 +7378,6b80eccb213e90c2 +7379,d1cd3a57dbf3fd4d +7380,101d42723034290b +7381,ad96333855c67fc7 +7382,332a0299810765a4 +7383,f9eca80f2d98a73f +7384,009b8f7e11b528a9 +7385,9d17aa148bca3950 +7386,3ab235ccf53c9bbd +7387,2d7e2a18edf15b95 +7388,4dba60047a16271f +7389,da99d16084d3db52 +7390,33064a65a86882bc +7391,79c723b2878b8891 +7392,e070d81dc8315b04 +7393,2a39df25c7c447b1 +7394,05cfc41a07c3c5d3 +7395,c2efa07458705c57 +7396,aa7a0f169aabd274 +7397,59af977ba50b39de +7398,2221bc7f1b5e679e +7399,05f6af45bfa66544 +7400,b8e4c7c00bdbe88c +7401,98d39845df1afca2 +7402,23a3824300cc9a6f +7403,42d2af8a189a9042 +7404,377debde18d79867 +7405,41f5cbbb40698580 +7406,e3315f09112d464a +7407,f41015fdbed11c5e +7408,90e9ccf2a9df4a75 +7409,251bcdc1d10b3139 +7410,cf0b165ad5d3e515 +7411,3f1a95b7b572a189 +7412,40af058d898db852 +7413,11c6211f12ef5081 +7414,db55288748e6024a +7415,0223d72fce07d279 +7416,7e6430f6dae7f669 +7417,4829b22b6002d597 +7418,0807acc34c36c289 +7419,5339841f6b06b92b +7420,cac2f84098ec8f27 +7421,3281e7ef8a445367 +7422,e284e38ef6600bd0 +7423,6f079ccf30885da3 +7424,4c160e1fd8f15f29 +7425,15e6cca8e256f248 +7426,57cbb0f157b5cbcd +7427,8f1ae49de5c6c707 +7428,c61996ee1f47957f +7429,ac1167baaf38e14b +7430,635158d2a65d7c9f +7431,3af6d9c802462b33 +7432,5180fba4fa8c9270 +7433,f1ff60aa4051074b +7434,32a95bf65ac4c80e +7435,1a646d8ecd45725a +7436,a374349791b0475c +7437,5b945e2966508e48 +7438,a64c57cd775c2377 +7439,4aeec3a1ab71a3e5 +7440,fc3bfa18cb0ee866 +7441,73349b8d56bb727b +7442,da12f0097bdb6289 +7443,205f2aac5ce22a8d +7444,d22177dd5547dd73 +7445,1f2f0bd5167efaf9 +7446,6492606090bede0b +7447,54adb50ce38cf89e +7448,33564a7e2ebacb2e +7449,be44a042f604c9d7 +7450,d2ba9d8d0537eb40 +7451,dcbf1b34cff95e0a +7452,2faa7dde7d839f74 +7453,4ffff91abaccefcd +7454,b185970e9490dfdf +7455,73319e2444e89b51 +7456,378bfd1c8b19a236 +7457,e0f2cd3f570cc7aa +7458,1b9a78923ddc7caa +7459,7f0442507440372f +7460,c9163295531ab856 +7461,366b6934ade2a2ce +7462,4b9ae85ccaedf4a0 +7463,d5b13bc9bf224f02 +7464,59daa35ca36be12b +7465,23bff3d8837a6f07 +7466,cda02f2224984158 +7467,84bbe1fcfa35ee86 +7468,bb6917c6adbacd9d +7469,d6ec655a84491180 +7470,667640311fd01346 +7471,66baa1beec2bbcb3 +7472,15a38ec137fc0d1a +7473,d6c463215b90511a +7474,9c9015137e70b0a4 +7475,58871b3e5fdf84fd +7476,b9b88e4eb8266927 +7477,25db6e00d8fb66fe +7478,810cdde6c36ae198 +7479,392e362ff87302b5 +7480,f7543ce97f5879d8 +7481,6d5a12b611db27f4 +7482,8d9fb75a394d4550 +7483,ee2c0a78c676530f +7484,bda9ca71809d2020 +7485,3de09dc31d6812c2 +7486,16c5f29bf73b8919 +7487,93abd4cba2b9f0e3 +7488,a9f8fd6e492a818b +7489,7f9e77191e4558e5 +7490,508d86a10a8e4a93 +7491,4b32a0cd984cef58 +7492,0a47262836c4b134 +7493,50ec6f793e61d02d +7494,d75d2ed09ba7b883 +7495,c7833454c1f73325 +7496,bf7f512b0e090e0b +7497,1b0b7b1a1deb531d +7498,af0013d76f913ca1 +7499,1b55f33ac9d624c3 +7500,77136f4f48d82878 +7501,243930be438656e0 +7502,62edaff911a29e76 +7503,fe4ca0ee7ee4d383 +7504,0b9cbcf57c7c98de +7505,cd1d39ccc6fea25a +7506,137bd960b941780e +7507,ccb8650dc1e40b48 +7508,edb18ca744588b23 +7509,67f54452c15fa43d +7510,b1563297addb7a10 +7511,f1ce5c0eeafda572 +7512,bd6dee80a92906f3 +7513,a04fb3d422c52b6b +7514,41e7d83ef99981f0 +7515,082ce32c0e5f0d8c +7516,65bfbeff7e9878e5 +7517,36bba00bd14c9893 +7518,c913ad7054f07188 +7519,ab11d76ac0b435fc +7520,7fc1290c44b272af +7521,cd79d16367e5c4ec +7522,b0e6ba3b890e9a10 +7523,0cb5fcda040e166b +7524,526b1dc4130594ad +7525,73fc0b5c3aee29eb +7526,d08950f60fdabcee +7527,4ce7b893666a8f5a +7528,53b38662a9bf3d58 +7529,662fa121f3f7c4f9 +7530,4d31ecb51424724d +7531,c7f52b26094469b0 +7532,99a9c93bd37a9673 +7533,3050b519a8bbda66 +7534,e8683e4849d6c251 +7535,a8e046f5e43186de +7536,e6b0f27a2cc53d21 +7537,22edb81897829707 +7538,fabe02e2f7925614 +7539,4a5231fd403301b5 +7540,aa294568a74fcebb +7541,85ac718b0f2a3b92 +7542,010df7d02cf31465 +7543,15a528f3b2aa7608 +7544,525fa708f661a0c4 +7545,e2cebadcef397080 +7546,da86a4606008cd96 +7547,472f709d8d6f30a6 +7548,8a658b5fbadb1230 +7549,6a063d5826c44735 +7550,bc59ef88cc18e0fd +7551,060c753c22fd07e8 +7552,6803a57fb240b1ba +7553,1c378ecd29cb885d +7554,3a1227bde5e2035c +7555,61039794b9f90205 +7556,fce41e376c57a9b7 +7557,727d80fcc690f7f1 +7558,8d884c7fa23333f4 +7559,a7aeb25f7d62b4a0 +7560,07821bffcb17800e +7561,9fe99cf6dc705ec4 +7562,0034e6dc9eca7488 +7563,0b9b7873448ffa8a +7564,2e974564e855cb0c +7565,08507ca1e1d94090 +7566,65daaa215403c411 +7567,88ea892179eff7de +7568,e183538938e5b05d +7569,1c766841cda74501 +7570,1e634a53e17c96e2 +7571,cb871e17f38c7f07 +7572,85c61a0d767bfb3f +7573,d2c9bf179da35c9d +7574,bad2e388c32e9812 +7575,fab24ad376ac6296 +7576,1aeabe28975a575f +7577,50fbe1c8b89df20d +7578,b835624177f07ac1 +7579,51abeb526193b2e0 +7580,5376eb4891e04d06 +7581,8cfc815a62cadc7a +7582,188f38114dea42f8 +7583,d8b6de012a4e4b6e +7584,59948295537a2139 +7585,71140d3d905b2d12 +7586,93f0f28f54ed4828 +7587,c9bc4226df60879c +7588,a6e055f935984dd3 +7589,3a2f8e2a7b42be2f +7590,56430d64e62a40b9 +7591,5a6875591fb8a034 +7592,c7cf90ca51d23135 +7593,9dce74accd262350 +7594,7423cc49e5d38831 +7595,dbeaff5477b4e206 +7596,3597859700cd1cc3 +7597,15657ce6e8d13726 +7598,c9f3a533a59887c9 +7599,265dc88b2c522bdd +7600,c3536b7bcb72fc44 +7601,b396cbf03a59e36d +7602,823e575caada04e3 +7603,0ab11f29053a1a43 +7604,a568eed360a80010 +7605,fa94bd58e1765047 +7606,4113723a7f337bbb +7607,d9096a01577e54bf +7608,7a7ce1ce5bade54c +7609,dd8a2eed16d51644 +7610,caee5a51f0930bac +7611,934a8a46634392cb +7612,fa0ea737cd1e4b07 +7613,4d31fc39d1b2b96e +7614,31fcfca4a6f0a709 +7615,d8e5a308a473d173 +7616,e177bc2ec152f551 +7617,7cf7366298f9de95 +7618,fd9ed9718c329071 +7619,58f89aac2ab7ea5c +7620,ced79144ba018128 +7621,d595fc6f53b5cc5c +7622,8ac28fdd13476fec +7623,356d331b48e24823 +7624,920f5180cad9c6ec +7625,17a7c388af196eb9 +7626,28219a01908390ad +7627,019a6d0a5703c1dd +7628,a73b7f826788ef79 +7629,b736665ef23b16a5 +7630,9f6a6b51fb02e74c +7631,2508e0faef0878cc +7632,5e3e17f409d32d6f +7633,ceb9d5ef6e2af32b +7634,8304d5a0fb402a7e +7635,243d6988dae57e60 +7636,265c7893bffb0ed0 +7637,1fe7a64fbdb3fa11 +7638,b5392f4ae26cb72d +7639,a54d5c8cfce66156 +7640,025c63d7420ebaa3 +7641,3c2cd9beb0236e50 +7642,02a4179708cbe84c +7643,661a6c3fd207676b +7644,94e96f190187506b +7645,4db95824bad4ebe7 +7646,7cfe779e680095d5 +7647,e2db99032e125703 +7648,8640e75acd92085d +7649,79db72a4ac7487d7 +7650,2fb577ac67c56085 +7651,869eeef8b38b080a +7652,8a83d2338ff3b089 +7653,51ca65fbd8f73160 +7654,c30268c2d321cc96 +7655,cf586dc47cce7028 +7656,d01198fbe7123edb +7657,7d4e2cfca7c19382 +7658,3a013048a972bd91 +7659,74487468dacdf775 +7660,44f00e334296ba60 +7661,f684d4112b7ec0a4 +7662,33478c9c3fc04a2f +7663,6b144cdad65b16e8 +7664,bb6b31cdd27aa00a +7665,ec103f265a414596 +7666,b2819b68242149f3 +7667,ec1923783b1236b7 +7668,fefc4c59bcba05b9 +7669,ea923126bcbf8f26 +7670,305ab089715b98ad +7671,55b261e8c8b4e3e6 +7672,e9bebcbf674be2ee +7673,3ddf5aab930c247f +7674,6d85b6c73ded80f2 +7675,4913d0823c452d34 +7676,7d800a78bcdcbf28 +7677,9ac71313e7177325 +7678,611db462f7ab85fd +7679,e27310a82861b6c5 +7680,12d3e6060ab2ee26 +7681,9022bffe32ed348b +7682,b6bb1b7a7c2f23d7 +7683,953740c3e2569931 +7684,8c7ed86fb4d67dd2 +7685,e9e328a7bb9090aa +7686,9fd35d82aea5498e +7687,323690a7783ccd91 +7688,b4db21be5ddae965 +7689,2b6a52025f971173 +7690,419c0218c3941ae2 +7691,ebfd272413018f9f +7692,b6f7a9ecddc06e2c +7693,6bbebb34e93c9ef4 +7694,5abc38df08dcc89e +7695,2f389ec03b2cca0d +7696,a1a50bc7a3f8e0a8 +7697,a83abd8d181449ca +7698,bffbaf673eca6462 +7699,4ddc943798656505 +7700,a3dec9fb26da2d10 +7701,1ebff7def5c72fbc +7702,cc9cc19647013b9b +7703,9a19ed258d071ea4 +7704,2ae155ce6315f124 +7705,f914820e5b735228 +7706,d1d5e943d9b597de +7707,7658cb0760651772 +7708,9d033b07e0d0a147 +7709,33d38f18ddf50349 +7710,fc9ed9d031a88c22 +7711,839c9426bbfffca5 +7712,c01e107e05854e6d +7713,b9b38a2e7b958497 +7714,7ac77fe56e504ba9 +7715,ffef7df6aed41248 +7716,c724b147682536bc +7717,ebdfb132635fcc61 +7718,1b41e2652bbd1090 +7719,d36edaf567c89a93 +7720,b0cfa1f406ed7691 +7721,c657f2559bee10fb +7722,2490b68920b445d3 +7723,3d2df56718c8ad43 +7724,12802806d2b591e9 +7725,1dc34210f398df9b +7726,9b05525fbf16083a +7727,59b94b50ac3a6c4b +7728,7a1c74a8f0993cef +7729,1ee82d535ba04e25 +7730,7caf805baadc32ff +7731,a4dfc703932b2fda +7732,4c49d833bb6a53a6 +7733,033c341c78cd2cb4 +7734,6f9f3695a75817f7 +7735,fa134ea63d24d92b +7736,e93e43ffa2aaa4ae +7737,27a21ae56a28c76c +7738,1b86ecb2624357c2 +7739,556fded5dad717e0 +7740,8e11e469de1d6b00 +7741,a964ea922d4b6424 +7742,3bc80fc74a4de735 +7743,31e7b9fb49d174cd +7744,4fa4b58a2e8f4347 +7745,11a998300428b89e +7746,8f7ba0bac5e6bf55 +7747,d2f3eabfff3525e9 +7748,81f6af28e6781e33 +7749,b0eb36b72f6292e9 +7750,b283755031b9161e +7751,3cdaa3c774db92dd +7752,f14b6ac0fac01090 +7753,32e1059a68e1e0b2 +7754,d4871ff969730503 +7755,ff3df61cfb5f0720 +7756,b8549b27d62ee0b5 +7757,f3886e197a789122 +7758,0d1eef5fa9831944 +7759,095abc220189622d +7760,1397cf63b26aaac5 +7761,abd0bb9b98eb90ae +7762,7fbe32ef41b793fb +7763,800b535de493f425 +7764,0038996d9bf04541 +7765,8445226e11d5995f +7766,1f330b3efe692c4a +7767,a1d7abae8912ec51 +7768,c17f4da9a3516110 +7769,3551ccc8d4eae56d +7770,b152958bb0a6a156 +7771,94365b1070b2d5d3 +7772,6be087f55f172703 +7773,6a319e2297a2a35f +7774,3f0fc770c98a31ec +7775,42c1d28f9425a781 +7776,609e5a83c31c7dec +7777,e35a8145408635b5 +7778,4658e8adb7d6e82b +7779,2c987c6bdfaa6bd5 +7780,63c00e87daf6cad3 +7781,0357b18e4dcce36c +7782,eea863d37bd654c2 +7783,998508f0a1eea437 +7784,278dcba227dd69cc +7785,8492ca03e2369b88 +7786,bb4e2190f4b899da +7787,1e045cfa925e2a08 +7788,f681cd157663d0b6 +7789,e4189c7a591f580e +7790,f3bc39fd791875c7 +7791,4fa14c3d3ae1040e +7792,31fdbbc633bb405d +7793,22959148e1b738ef +7794,34007adff12f5c69 +7795,fcb32ed97de9eb6e +7796,95b7b1e6a940dedb +7797,2acec991c7f58692 +7798,887f3ea28c08c1b3 +7799,43e4a0b4503adbb9 +7800,4127fbe331e72416 +7801,0df1aef892caf3b2 +7802,a7e0752173b30894 +7803,130e54dd0eb5b8f1 +7804,de8fdb1ad2fddc69 +7805,271eedd454bd21fb +7806,2ec35d3005bc1fdd +7807,5aeda447ac85e2ad +7808,7ed30994519ead66 +7809,bfe55dbe64f32970 +7810,f3011e621c83ee9e +7811,9e5ba1462a758206 +7812,f81b2b1d426b8727 +7813,fd58fbf385d720a3 +7814,0c596c41fcfae56b +7815,7ad0ee39656d1d91 +7816,a43e80225a2c7f20 +7817,28b81c99a396d889 +7818,4406408d1a170ff4 +7819,2603389bb989c585 +7820,90abed2bbf0af6b9 +7821,58137f3b47c57774 +7822,dfc403fd5a982865 +7823,b87e3ebe8e785b79 +7824,2386b03c99af98d4 +7825,7c4d016eacf215d1 +7826,e0c986d5f61b7b4a +7827,8a1bee5daa2ead4b +7828,d0da80de0fa4811c +7829,1498300b9f9dc5ef +7830,443f8a4e8bb12cdc +7831,9e728faa592ea286 +7832,2e156264e6fd2735 +7833,15aa63560680e192 +7834,42f4914977f55001 +7835,c269f4f3d639a247 +7836,d64022aa8050c7f3 +7837,0067e43f09a7d1e5 +7838,0dd64a0ed791591f +7839,4652f77fad96b6fd +7840,1f139ab17fff41c5 +7841,633968df477907ac +7842,248e2334688c35ff +7843,f66c00537c6704b6 +7844,6bd2bc74ab1e1e1b +7845,f6fca5ea20823b43 +7846,5992e13c2aa77f22 +7847,68c8c1703385a9f3 +7848,0cc422a567b8c9f5 +7849,021e675e65221215 +7850,ca24f822e073a109 +7851,874e2e5ca4b3cea3 +7852,51ff19c8da79c706 +7853,65945b9e9acdfe36 +7854,6acdb8861e74aa37 +7855,07c295e897797bb4 +7856,041c2a9ad1f3179b +7857,1c05446f2179a13c +7858,0d1a720d871ea5fa +7859,eb66179bfc3adef6 +7860,e06badf36dac0402 +7861,1a3a96385c8cd26d +7862,90ef389f6c7f8028 +7863,6dd59b4c56b37cda +7864,18e458b4211ac18e +7865,c1cc1cc6e0a0e4f9 +7866,2db93ac96897f01a +7867,2fa85d302e9f81fd +7868,fd03c18e575ef490 +7869,c36a7f208876f510 +7870,0fc601c8afa25a55 +7871,17a7aae8b17990d2 +7872,ab0e15a29b65d9b7 +7873,cd2dde05573356f7 +7874,549154c51f0cb866 +7875,0dd6c720db659dbe +7876,263433a83d52fdca +7877,7d7516fb3802c00f +7878,07cf328c7802e492 +7879,75f18ced975e6b04 +7880,0f316bcb07cf5f86 +7881,2c8ce4c09f3eb8ba +7882,bbb3712a118db1e6 +7883,32296a9296a49b7b +7884,c3f8c6805c0dbde1 +7885,bce4077d2b0ed646 +7886,3057dd2dd3fb858f +7887,32f711fcfac71d58 +7888,872fa6af0f27e71b +7889,b9df5f54384df75f +7890,d1d265b43bc6d305 +7891,a15f737a872ea8b2 +7892,59a56ef2f877184a +7893,285d127f0ca20a94 +7894,0b288ff67aa8a61d +7895,a44da973cf7af322 +7896,7b4d43752b6f336a +7897,d0f7742f82feb1db +7898,487399d49b0381f6 +7899,acd2ef0ad4a82f2f +7900,5c1ea8e3e9dd1fc7 +7901,dd91970a391928c3 +7902,b253f4aa390e0367 +7903,4742a2eb91910ae6 +7904,4b2bf78c99199bc0 +7905,2d9a99f3f18819bf +7906,3a39e7c1d9378c6e +7907,7098c54b425a9d11 +7908,0381dfd77d7f4266 +7909,746bca7e06197b3b +7910,14a46b4a8147833d +7911,09ef69c14d1cb81f +7912,4938385fa1cf646a +7913,dcd9e0c678df988c +7914,dd25ed014e2d188a +7915,e4b9edee8025d2fc +7916,b39053d70e93a8ed +7917,ea6a7f155f21a5ee +7918,1b98f2dbb68ce624 +7919,03f9bb49b2fc8223 +7920,a930e89eda2e3bd3 +7921,d0a5b55515f3cf5d +7922,f9b90f39c86bdeee +7923,08b1fabaffc164d2 +7924,ff6791da73d0e213 +7925,35fef9cf516b6e6a +7926,d11d01fba232c043 +7927,7784df17ba064bdd +7928,f61b013f0e753dec +7929,e65c84279b6d41f1 +7930,65217b750a6e0346 +7931,4e36deb250e52440 +7932,aaf91e34cda8b706 +7933,2b40657ac8ad9fd9 +7934,0f0a016b1926cca9 +7935,f0133215dee86f85 +7936,dd78d4443705f35b +7937,62d94d58270153fe +7938,aa8f71157c3ca2d3 +7939,a3ecb3a7f83cfe9b +7940,9c867832b44afe52 +7941,9b8f5a51c21118ad +7942,1adeeea4ef4c95ca +7943,b09022a7a1da540f +7944,1d1697531797992b +7945,8c00877415038a45 +7946,f02b1b02830c513e +7947,a0633469463bab04 +7948,72400b18a8ce34be +7949,7633949ae7af510e +7950,aa20ff0b646d5430 +7951,3bf0735eaecd8c09 +7952,2d08e82a58a5c51a +7953,6b09ea74d5c933fe +7954,8affd564dc410989 +7955,3f56e894c4817553 +7956,82277c5adc0cf18c +7957,6c03aadeeea313ac +7958,b2984d4c479c292a +7959,d7a63147b901e58c +7960,b1556581d0a021e0 +7961,29d3f383345ef9e1 +7962,39c406e7b020ddf6 +7963,9d5d943d9b482724 +7964,17bbc142d7d3f7ab +7965,040fc9c133abe23f +7966,e45a3a937f4ce23f +7967,c6744c6d2f6b3347 +7968,8ca0978281d7fa8f +7969,9a9f19dfc1e07228 +7970,dbbde7b4a5c4a34b +7971,0c52944e3cc62961 +7972,443d2bed9153364a +7973,1d24a4d38e8cbfdc +7974,f4cc55b5172df08c +7975,6d0224109a9ee715 +7976,b2d2af3103961ed6 +7977,c591b6cebb472b5c +7978,fe1e55b5f7b22db6 +7979,9c5edf92c667954b +7980,cf863619552dc3b4 +7981,f3a4ea6da34c959f +7982,bf0d88d3ed96a0ce +7983,5ef6cc9bb4065446 +7984,7d027be401b7a04a +7985,42d125fe1725fd4d +7986,8647be1fd6be0b21 +7987,6617b5119fd639ff +7988,32737ea9d1130f49 +7989,a91781432a2e5181 +7990,23784ad9dd021ba8 +7991,0274940be2ee3c41 +7992,23dfe305b38d0bcd +7993,04656b513b47060a +7994,ddc74ac148f915a7 +7995,55df71ec91270481 +7996,230dde296d538672 +7997,c45c5e2a433788db +7998,50104b52a6b16cf8 +7999,c315b8c462e1cb61 +8000,93f804dce1d65638 +8001,43958fc31c0e45d8 +8002,5921d6cea8b1ad28 +8003,bd25f78bfd46651b +8004,8137bd23f0db88f7 +8005,69dd1e291290228d +8006,9f838c66bd56fc14 +8007,18554dcff4dae951 +8008,3a4e6a8390b0f7e8 +8009,8546d556e5b4df47 +8010,189d5e7e3c90e365 +8011,673aa83caa70414b +8012,2315540aa9af471d +8013,bc3984275655aa73 +8014,96f8bbef81a88fe4 +8015,2296144dc1b9cb5f +8016,fc4cfa7f6a47516a +8017,f9e443baffbccda8 +8018,278004ca97cdf0a4 +8019,9ffc28763fcca17f +8020,9277b21cd86d30dd +8021,dff1ad4af24e6a54 +8022,dac873b463cc5718 +8023,4bb27c922d15933b +8024,aa2758902a1de15b +8025,ff613f39591fed86 +8026,0e0c1a756bbb890b +8027,6df23076b29d39c6 +8028,2100e203babe40b7 +8029,e861d0c4a047a581 +8030,02aa639951603b20 +8031,0512970224c61930 +8032,9c138607fc66ad30 +8033,d329556b1df3d045 +8034,e0ff48b344d025ec +8035,2e2f434a212ce6c9 +8036,9a3662eb344256e4 +8037,58016cc04177d9d1 +8038,dfab5d640f627436 +8039,f1c7806a317db4f1 +8040,98c4242321fdb8c5 +8041,1ce0cfe1d35328d0 +8042,b11fa7253cef66c2 +8043,5c2869fde0416fa0 +8044,8a472a0ddc8fd4fd +8045,4429bf287470d8cb +8046,29517ef955c56bfd +8047,8d5e16807d0531e6 +8048,756c8d217e014c59 +8049,af403bed1582908e +8050,38878c8adeede552 +8051,f5cd0d5c24e96354 +8052,3621f8c36aa7df5a +8053,6574a49d0d34ef1f +8054,d8c79e10a92d91e3 +8055,d4b98b43a3a3d60e +8056,cd7128204b9b30a0 +8057,2424a84ed92367b3 +8058,fb013e2172a8ebfb +8059,1c3c7d84443c87bb +8060,d71b8d9314e2fbf7 +8061,ec19f78bebd4e2ea +8062,fb39c20b8fd06e27 +8063,a2dc63b7d31cc2ab +8064,0292b35f68bccbaf +8065,8c791d39581c04f4 +8066,c9b2704f50eb608a +8067,365981bd4627f400 +8068,4853586b032f3011 +8069,f3b53f8ce87851e5 +8070,64c668fef638944c +8071,11ac92b77bd103d7 +8072,6512efe528041fe9 +8073,97e7ba7498e23b33 +8074,00c5d088969789e5 +8075,acb364cce7196d8b +8076,ff6458e4c1e4c236 +8077,2308b5431e8ed481 +8078,0f6f4ce81b701c72 +8079,4a97b33ff881d2db +8080,300205ad6571d27c +8081,5053dda885e05669 +8082,cc0485cec44acf1d +8083,578fb02a07edf530 +8084,d273ab7b66a0be21 +8085,779d4a2b5717148d +8086,c37e463c9821d497 +8087,88cb5a40c2242a4f +8088,2f0da3626f0cf89a +8089,c5df6133289db165 +8090,7cca4f83e7bdf8bf +8091,88b1eb5caac862e8 +8092,4018a7c7157f486d +8093,88563fae56f5ad46 +8094,a8985fc1e8b21a71 +8095,79739e8018f12d63 +8096,da9fd461a246ec76 +8097,92972244ddbe3493 +8098,38d3ad38a61f0486 +8099,2bc26c2d8f453f7f +8100,aa27191fa7d0c5ab +8101,db0bda42e399c9f1 +8102,a9a6396c1eb70083 +8103,048de87c3f1e7af5 +8104,95adfaeaab7f88ec +8105,14f43a4d20137015 +8106,4a1a2a29d1e7ad7f +8107,96212f5332cbd226 +8108,dff66e4562e97d1c +8109,56bc2ee795511a3d +8110,0ae39c39ee66d912 +8111,8ad1970c328c2152 +8112,96ef37ecff569813 +8113,67c16a2733942b01 +8114,8e4d1e53edec3516 +8115,5a8f3cbe29111e99 +8116,a92c58f4d8bc8d2c +8117,cf20b8ca92a16eb2 +8118,b511806cf2d27188 +8119,36ebd69d12a18c3e +8120,b5a99bea52065e96 +8121,b7b7a4d8701daca2 +8122,c83da2fb25482d27 +8123,0171b73d2347056a +8124,56954165d9a090ac +8125,ad376e7afc92c647 +8126,b2fef6ab79cd0ad2 +8127,db60ff6937a4affb +8128,42e7e93c0f064eed +8129,9d433619cd52a089 +8130,50fa338aef9d20f1 +8131,829d0f0b5b8fb26a +8132,de22b2991d9f8aa4 +8133,e4b9de111f61c1ca +8134,9808b126ef3a650f +8135,bbe61bacc477c970 +8136,6e71210b4ea0ebc3 +8137,44266bd954cbd553 +8138,d12509805099dd52 +8139,1f129ff825e2ea12 +8140,dc555517438a3747 +8141,a812515efc02d8ec +8142,5693166dc22af846 +8143,5bb607630d28051d +8144,5cdd1c9d2e3630f8 +8145,379d25eb09dd45ca +8146,7e0960686a2c3618 +8147,895688948b832b50 +8148,8094da95ac96b1ee +8149,0f6c200174a70460 +8150,225dfff27fe72784 +8151,a704a91680051365 +8152,7653ea505cfbb311 +8153,bf19605c6f72b78c +8154,057a248faf43d43f +8155,6e316e86e48de245 +8156,297051a5899f47c7 +8157,308c218defbe26d8 +8158,c2a4fc08ccbd55ce +8159,1152120213fa0895 +8160,7b8244d0b9d83094 +8161,be409dd0d2da0892 +8162,0c8d40e7f7df08b6 +8163,5f50a307c4bc6a4d +8164,70476953e36dafa3 +8165,01b4638b9b4f02eb +8166,1a0a62eee89838fb +8167,e6171df498b2d1f4 +8168,9188fbb668700289 +8169,13c0904a18d16f58 +8170,d46880aaba2a0b75 +8171,300652b0824c69cd +8172,c8dac44078aca5e2 +8173,c07c66b410f7ea24 +8174,1672add9ee30da87 +8175,14b403eb6b697c00 +8176,c1ee33fd47d6f11a +8177,0187aa2b9d2b07b6 +8178,d611a2fb64888d38 +8179,a16974b9449a8f90 +8180,e3cf4d4add657f0f +8181,940cf18ba8fd4d75 +8182,536abc13e576a277 +8183,16c6136d325bde34 +8184,eab43bab01bdeed2 +8185,120a9f139232be83 +8186,95077320d1d133c6 +8187,6ca73459318ecf0c +8188,65ad6ff99a00d389 +8189,e617d2d8be4971a7 +8190,c417e2c75a3e1deb +8191,b6b6bb9084302d2d +8192,c8ea0129688558ca +8193,b304dee059f6111a +8194,ad1f815b84795766 +8195,ac665402549257a7 +8196,600783a2b296b193 +8197,932e35894041b9f1 +8198,062ab0567955ed19 +8199,d3ee2f69cc1aede4 +8200,65307a5e573dc638 +8201,d737536f8f28c4fa +8202,a5d2280a7fba4468 +8203,768758cfebea62a5 +8204,23c119f5e668e8b8 +8205,260c0701fd9cd213 +8206,576e14b344d8ba96 +8207,be94a39aee8c7f3e +8208,3bcf90e1a8bb80a9 +8209,31d0bb14d3a857f4 +8210,de69341f96314134 +8211,13bb47e16c63726a +8212,760a57b9a5598081 +8213,d66e306f586046fe +8214,2835cbad695fde38 +8215,9b7d804ac83e56c7 +8216,dd8532ccb620ba50 +8217,ea673212423212f0 +8218,6d94224e44bfee1e +8219,11cb88d9bf775ee6 +8220,096567757693ac26 +8221,0a542b48d80e0d38 +8222,e4f5594c905eb5da +8223,f15a9177be486db1 +8224,8be167134687442d +8225,b05205361abed2cf +8226,cb3952761c20cc61 +8227,7419738a9254a0c7 +8228,5fe5d971629e2980 +8229,a7733bcafcfdff07 +8230,66f1faf1f2fd372e +8231,6f12e9f4ca20fadb +8232,96bc702552e7607e +8233,2c92866aa566c966 +8234,c68a0e0f73449d93 +8235,55b59ac17fcc997a +8236,41e6f34bf84e9a23 +8237,179ab61e506e55af +8238,28536403ad0a4802 +8239,8afe3892550af1e3 +8240,fc06111d51ce21d7 +8241,24b586029f9c1845 +8242,ecc5d1075ea23dc7 +8243,7e4f7f0cd9173386 +8244,af2eb17fd6740a26 +8245,6abc370a1838cfc9 +8246,2a23a9e4f2eb0673 +8247,c30339e424cb658f +8248,8378357353da7f45 +8249,f0df2ffce2dfc4c7 +8250,0ea7e9166ad163b6 +8251,c69ca6ba2b4a3d49 +8252,d36498ca9bf6eefe +8253,e1edb717175219a6 +8254,578f0bd95139b71f +8255,1e6011b795ebc688 +8256,1ebb906c7c9d3d51 +8257,91bd3fe416aa79ad +8258,ad0f2ea3d52ba8bc +8259,d94f7085b406814a +8260,d11a25b40bef15a7 +8261,4dd9ea7feaa77b52 +8262,37cc7c323be96696 +8263,adcdf42d3508267c +8264,dff18a7ca9b8067d +8265,2cab68afdbdc4678 +8266,9746d3f1463f360b +8267,95deef2d3f7684a7 +8268,31b413cb618f96bd +8269,1dd680beacbf8f02 +8270,63007c51061ad3d7 +8271,33438eba8ea9ea89 +8272,fd866e13f2bb258f +8273,844996e2e5db021f +8274,e62d2cc772ea07a1 +8275,7bbc051fbe438e54 +8276,01afeb6a36f2cfca +8277,4341e4354bdbe932 +8278,5117939fd094e4d2 +8279,aa55eb4087a99b0e +8280,c2d77f1eb029280a +8281,8b988adfa3f4d628 +8282,3e4cee1660871941 +8283,5c820ebd85eb4990 +8284,a0a6d1e221c03f39 +8285,e89bd79be5325e5d +8286,9caed69a5dc022a0 +8287,3e157ceb3602fb6f +8288,55a7bbd59875a5ea +8289,7a0f6f3608026c17 +8290,e9df23175bd79d24 +8291,fb63ae8666a0e17a +8292,0b61511b9635b011 +8293,b1d6cf04447d925a +8294,82927a919d0aae50 +8295,8a84cf42c09b55d4 +8296,96953af4437d10f8 +8297,55c6ac93eb590167 +8298,e635d37151b3fd1e +8299,e619af48cef8a961 +8300,996458a0aa6a042a +8301,5b5354957c8eb1c7 +8302,218ec743ceb39ced +8303,133ab9b07c1df81e +8304,87f1ff301b6e4ba1 +8305,cc4d1571feb99aa8 +8306,79e490f6c3a14be0 +8307,aa6a28644d4c4083 +8308,554ecdcb5d8ee530 +8309,bbf1e11cb14549c6 +8310,031a094faa76d26f +8311,15a56b32a1279486 +8312,f7b68db6d7cbd293 +8313,f044eb5c508f70ad +8314,05c5f6b74ae868aa +8315,c4b4baaa9072f7d1 +8316,231571734fd6c5dd +8317,bd89605d1127c93c +8318,eb67a3e2c41f98a0 +8319,ebd674e51c948fd5 +8320,c34ac3b95a47cd89 +8321,5eaeb2e142d271eb +8322,3171756d8483f21e +8323,816332ac1f31deff +8324,453e6ff3bac1480e +8325,885cbab5198d853d +8326,22614f45a441d7a5 +8327,759a0ff93a41c12e +8328,e4373ad8c3c8d765 +8329,7aea8cdfdb28965d +8330,2fe1f1a40218a82e +8331,873ab9bcae790f5e +8332,92335dea5d66bb4d +8333,9afd16d3bfd08b74 +8334,54c2574703265ed6 +8335,c241e1c74e227047 +8336,14f9c3d99d69a354 +8337,8da49150cee5f231 +8338,c04e1a5f73378ffe +8339,4183f86ef6b1b1fe +8340,f1159c04c5c10d13 +8341,bc8af90c27d5e353 +8342,755fdbf01590e6d7 +8343,dc27dea6fd0c1b0c +8344,72fea0af95e96603 +8345,40746c3fe99ea362 +8346,f8b1bc3553e61935 +8347,dc5df07634f68f1a +8348,2b55b245c579176a +8349,e1af3fbe0cf43027 +8350,63b50cf1b2e238ab +8351,d6bc2b71bf45cb6c +8352,3b548fd022e8076c +8353,e4fdec9c2dba30fd +8354,0ef27c8d9ce9bdee +8355,622ea0b2618b2cb5 +8356,9b537386d18799fc +8357,061b8f64cd01e9d4 +8358,6fac6e1f8df6f480 +8359,292e66119b82f1d7 +8360,baf45ab377d2bfc8 +8361,0dff72e3e15312ab +8362,db5e3231baaea2e6 +8363,95e98694c288f7e2 +8364,3aa866d66de1f435 +8365,4139373e5cba420a +8366,9b662eec41226adb +8367,d2e3f22a6e14a874 +8368,3f91020b27c5e0ad +8369,413b84ac93210911 +8370,bf0b748a774ca5d2 +8371,569de77434291920 +8372,131f1efd68cd4178 +8373,4bf0203ef21bfa51 +8374,bc8dc982e90d767c +8375,4053449c16b258d6 +8376,f1fe446a5023bee8 +8377,d8cf4225b6c0d498 +8378,38d975b8cfeca587 +8379,a07157c0949cb9f5 +8380,3b7c0cc0b37081de +8381,dee4dd8f608a4f50 +8382,07d030ae4c9dbc1a +8383,4784b5d54dca4da1 +8384,3826145621e350a7 +8385,68ae299cc31b16a5 +8386,d5f0670540fba124 +8387,1395ec2fc8a69a12 +8388,f818772f41e0ea70 +8389,40cdde07de00e16c +8390,43ef81a55377025a +8391,9e7771d103e5a07f +8392,c9aba04b09861efb +8393,f156e7af01287715 +8394,decb60c2b6a239c1 +8395,87c573892c0376a0 +8396,62e8e9548c4862fb +8397,c54c668da19b1356 +8398,a6c507e11caebb45 +8399,e4a7f7e470d99269 +8400,0a560d708ef03df9 +8401,e2b0838c6f860648 +8402,39c70c59c3dfc160 +8403,ca246550b205f7c0 +8404,6ee946acf5ede1ec +8405,8a8dd6a398ee5cc4 +8406,8f6156df66533bf1 +8407,e13da0ac03d6c8e8 +8408,6f942a1d5aefd04c +8409,331d76da22d3c7ad +8410,3800b5bb0f153e50 +8411,e49e1e2ca9a51b2c +8412,aa9b2729d95be7e4 +8413,20bf4627fbd0b43b +8414,f8431e4a2ff7679e +8415,035f5c1ab205af10 +8416,0eb4bc75b3c8c021 +8417,9b1a84d14cc0ee2f +8418,ffeb1a18d03bce6f +8419,a4e6c73a09cda8fd +8420,3500cafc66c7b277 +8421,5021e3f070898bcc +8422,8f74dda9f576ee37 +8423,27cf10511fe04502 +8424,6fea1172ca008861 +8425,8fffb75790e7cc90 +8426,88aa64e29eb7175a +8427,871b4c03a22d3d51 +8428,a50ee5a1dbfa42c8 +8429,e4a135e9e0565ff2 +8430,0feb7798e6f5a528 +8431,707cb558e124c086 +8432,81150b19e64ee5fd +8433,461386ac230a5087 +8434,8019028d9d01ed60 +8435,0e011ad9241cff21 +8436,dbea7ff3ede8700d +8437,41fadce8aff24b32 +8438,683d5b3a4630c63e +8439,9501b34f1a2142ae +8440,6182ef96644f1971 +8441,1129f70b4336fa03 +8442,5cb5e3227cf349bf +8443,0ebaf519527b4f9f +8444,67c22f2d38d4ea09 +8445,e319f0342b6f40fa +8446,3672f47b06e2b54b +8447,52e491c58d49acca +8448,bfa3439fb3d98425 +8449,eecb64560cff1c11 +8450,e9cf93db55ce61c5 +8451,feb6e544aec4ed56 +8452,3ddf266ea7d570e4 +8453,805a082110666cd0 +8454,63c158dffc37c42d +8455,16872594199a1be4 +8456,30bac6f33ad1bb45 +8457,8ed572aa306600ab +8458,c164dc5c2a04338b +8459,d097dd48145b4bd5 +8460,8720bd02c0548e74 +8461,35023c589b4b31d3 +8462,2687d56be29b4a43 +8463,4f0ff85bd70d9fd8 +8464,b3cc1c0ceb53e1ff +8465,4f69bc7634ecdcd6 +8466,2218836651324879 +8467,e12654763c1c3276 +8468,c64cf6d2a3a6833d +8469,d94321fbbe9b7be6 +8470,8d8ee961195904b2 +8471,0d27e767e3fb9466 +8472,2bb09b9942a86162 +8473,19bf8f3fb64a9744 +8474,cfceb603c46b2fd8 +8475,27a5ee54c894c305 +8476,93f2a5f691ee7c26 +8477,67b9776cd9502c61 +8478,ca75b60dc9f2e9b9 +8479,1e485f5181910013 +8480,54a436cb70a6b22a +8481,104ac076aad4bd6f +8482,3c0599eb16b80392 +8483,bc77b608424fa36c +8484,cf3b28c4064f2df1 +8485,763d5b8c4becc470 +8486,e435d245a8beb3f3 +8487,c6c60e83b18f33ff +8488,f85d744f1f6dc1ad +8489,11d7ac1615783f7a +8490,68ef627871a13cd9 +8491,0180e672f556a4a4 +8492,af5b26a2705b38c5 +8493,bee336a047ae144c +8494,4b4836c3dea925cb +8495,09bf0dab7a0ae192 +8496,17490d5619a94486 +8497,1fdfa3a53e95afa4 +8498,8347900dc4482a1b +8499,fecb12e94164d5ea +8500,8364ec598fd9d79d +8501,4fad1907ede46531 +8502,91888e168581523c +8503,c2480a42f5e3172e +8504,5f6860f207525660 +8505,f9298d516449a561 +8506,99bd5d200faaa738 +8507,60395ab73f6aac92 +8508,bd56eef84e7127ba +8509,3a255dc823b7c220 +8510,b166e0e1cf58dc50 +8511,24e2fa1af71e2dfe +8512,6e02c3836fdc3cad +8513,f8d8efbaa4fdddf9 +8514,e8a88281563d2380 +8515,68fd5454dc379f46 +8516,974ce534e0de6ad9 +8517,8f41eb8d3d2146ba +8518,fcc992429b8a4e4e +8519,6e3d0210e1c13d51 +8520,3835ab97ee3c8bb8 +8521,13fafcc6dcb1492e +8522,ceddc2fa0c367b5f +8523,ae5f595c7d0ab05e +8524,f67faefa10c1d3b3 +8525,fae92ab05237c611 +8526,8ed5ca2a976c6004 +8527,8cdcc5d709837b45 +8528,91dea660ef7bf7b8 +8529,4cab6dd78bf821c2 +8530,2aff01a906d4b408 +8531,8439a672ccfb5af3 +8532,4d13fc7541ac8eba +8533,e2d45d200ed1a7ae +8534,22f7ee9627f36a82 +8535,f4845e9ea05874c1 +8536,8a8f1ac3a46514e4 +8537,826e0a5181a1d320 +8538,eadf9f5ab6392136 +8539,07e888adf88476c6 +8540,d8304b6652c422f9 +8541,6a9c6615498d6e1b +8542,dd5872d6d76ceffd +8543,0b102b9c8f5d04cc +8544,598724ac6fe15fb4 +8545,da15e553cc046e0f +8546,bc2bad5e57c64070 +8547,2cb673aaa2de40f3 +8548,76a420f52e00fefb +8549,ec60154399401755 +8550,9aba29a101ba3a7f +8551,aa1e10a63f1ee8d6 +8552,bb0bb6a005ed74de +8553,8c76ae40062e1c33 +8554,96a5cd8bb0b0c10f +8555,362fed371ba47aa8 +8556,7d5718522d011a01 +8557,57cdbbd05470a415 +8558,297277a2352806d6 +8559,c0a78e8e6beb3f3c +8560,18366fa067d9e79d +8561,af096ed39bd8f7a2 +8562,175c529f49b4f508 +8563,84d9496ec547bdb5 +8564,b565ad4f81f331be +8565,5915f4f3521097e4 +8566,16a0dde638c3075f +8567,6af52841dbdfdffb +8568,a4af52608254761b +8569,2f8cbd00acd931a4 +8570,6bc6bf905dd225bd +8571,5d139968ede90009 +8572,f3d908f912b3de88 +8573,db30c533445528b3 +8574,9c7f9604f0ac8615 +8575,fa2f0fec04a9880f +8576,b66bce816a86bdcf +8577,9927189009c257f7 +8578,eade37f75c1defc8 +8579,798713e267198178 +8580,b965f53f54255c05 +8581,6f1c8fc2fd17df48 +8582,5d8b5e4808accf7d +8583,e3499fd670371b61 +8584,49307fc5576d272b +8585,1b6ffc62e28278c9 +8586,b08a50e03beea34a +8587,aa5f76631d55b564 +8588,2a931a9ca435628e +8589,8318de932ca562d7 +8590,67aa2348a39287ca +8591,05f8a48886505e49 +8592,b7033d4d665177bc +8593,1695241b8eb190fe +8594,9f077aebb6944d64 +8595,2409263628252103 +8596,307d7ed94e3b162c +8597,a9fb5f7c26868f83 +8598,b8b9235594f9d4b2 +8599,262ba9fb6898978f +8600,172716250fbdfe32 +8601,dc84dd182ea542ac +8602,ca803575b26c90d0 +8603,50ad3094ab75a4e5 +8604,ddc5f09356934e35 +8605,4d1753aac45c9ad2 +8606,fc6211783d49323e +8607,abf2a1d294b1d78c +8608,e91d67373a3277ff +8609,b86e9e2ff1f5a142 +8610,6e9da693ea9a61fd +8611,720282e42036e345 +8612,aaa6984163b1c510 +8613,0214fe318b669ee2 +8614,86bea6e8418c76f1 +8615,9dcb9c4ab2467104 +8616,be9aca6469430354 +8617,d3e39ea226ece47f +8618,1d8ec2a8c0e5f10b +8619,711f25ea5616f565 +8620,c8dba0536e0847e7 +8621,90831d4c0b08c53a +8622,c2dd8400021920c2 +8623,c514895f9c14f03f +8624,4950c56e76ae257d +8625,6cb461c16644b39b +8626,bd54e758c48bf072 +8627,68f0b0968d6868c5 +8628,f294a92800d9650b +8629,bbc8f3800e26f4b5 +8630,a29a13d5a86b55cb +8631,67431d7eafac46b3 +8632,38351923ddcf5e4f +8633,1a197bfd6d6676aa +8634,17efac9a26a070a1 +8635,1ce425f4498d93d9 +8636,86a5c4469d5a0484 +8637,6a2b4a222a9cc5b7 +8638,a3d05ec2e252db1b +8639,558cd76535f9194a +8640,62d7178c1d3d7996 +8641,f95b9b822ba8aed8 +8642,ddef0055d8127b69 +8643,4ea23e42e963179d +8644,0d7c8f4fcda885f7 +8645,2f1278b470387e89 +8646,b97afa2f50a967d9 +8647,5935a1df86fcb63b +8648,61dee9b12198489f +8649,99011b3f5fa4d7db +8650,60b1083d726c698d +8651,6fe294de9465ed52 +8652,8ff93d59f1868e62 +8653,bacee019944424f4 +8654,ae88b4f497af56aa +8655,872a2541c2dd28ff +8656,54773d5a2f7ebf36 +8657,b94afe061fc14ac7 +8658,056f2fd6169e9df9 +8659,ca2b41a6ac3a802a +8660,f757a9c9d03e0fcb +8661,b93beddadd569aaf +8662,a4db83a507b2cf3b +8663,782dd93e4160e05d +8664,2542edc212dfb6a3 +8665,615e6f3c9366cf1a +8666,ad92d6775bb12ba8 +8667,ad371c57b9c1dd88 +8668,8a72b4fee6bd5b71 +8669,6abe816078de53b5 +8670,e97fda741a2da213 +8671,35182530798a3886 +8672,78717e4221ed2320 +8673,61e343bb25db3328 +8674,b166afff885aa818 +8675,1e5fdb70ecd915e5 +8676,6d39d875b96b8846 +8677,0b5cb40706fc3dd1 +8678,654a2a5705f32d56 +8679,451913cd563c8005 +8680,10435fb2e3f44e2c +8681,9c6f6a3e81e03448 +8682,44d339e8da0241be +8683,5bd13b19417bcc59 +8684,895000f8e53026c0 +8685,10f7bf436108e00d +8686,3dbc7f6ea1404e84 +8687,4dfe2ef2aa890756 +8688,8a060c9993af9984 +8689,4b43bbe9e0433331 +8690,193cd42797e79618 +8691,2b8da4efb6d521b0 +8692,a870850257a84cd0 +8693,f7188f3444d46bf7 +8694,e056e08ad1517af3 +8695,fed372521733d50f +8696,60a6d40c1bf74e86 +8697,334d5850677d1f73 +8698,62f7f1ae4fe298b1 +8699,bb5a3032eaa2e393 +8700,0006507b066c2680 +8701,bd9f328f9cfa4654 +8702,14d04274bcc0dc04 +8703,14b6917c55fe7475 +8704,266a73646faf22b0 +8705,bd92d40daee9ad9a +8706,63fd1176eb791d54 +8707,18f9007de8e2bf89 +8708,153ac1242fb4bcf7 +8709,fa7e1420b6941f6e +8710,6b28308695882697 +8711,5e0f99a650756aba +8712,40cef4a0ba80dbc1 +8713,1a3b32b468b897a3 +8714,d757d05d1d6c54b1 +8715,2e720d37df33e1d6 +8716,f2838d29877d8741 +8717,d836e940771db5bb +8718,0a87d78aabcf419f +8719,d3563d2a95da544d +8720,51b7adb994dc8439 +8721,059639812e016adf +8722,cfa6893646944e65 +8723,f6f2bf05c712eb36 +8724,b2b48396730203ca +8725,45b1e9724abeae6a +8726,3acc7025c0096445 +8727,1aa9f6c3e1880c67 +8728,364465ba03c1c671 +8729,afc11c4f8e8bba50 +8730,180519bf49256cfe +8731,761003afeaf82a20 +8732,bb7ca26565659aff +8733,e7591ca17fcb4d55 +8734,74c83828f5eb9c23 +8735,eae80dea7ec47378 +8736,824abba6768925db +8737,01c7e60e79cdc2bf +8738,d46c60ffc7e65b4a +8739,459d5b905593efd4 +8740,dbb848adf6371306 +8741,711e249afd808c5d +8742,65578b296316b3ef +8743,8e10bf939e9541f3 +8744,d0571def8ce4a020 +8745,2929a8f3565191e8 +8746,e25955a03d48b28e +8747,ad3ff4da3b27e53d +8748,064b05e0cc0ce2dd +8749,cc06959e30eb2360 +8750,05f616582eac96e5 +8751,b3e46b2a175d60b4 +8752,16c356c3463f529b +8753,a57be5704af8008a +8754,02c892ece8c8f96d +8755,f551998503f41469 +8756,579131b907d40ffb +8757,b7c415ac7878af06 +8758,459efe1c8b507c57 +8759,ecfc57f204a4028f +8760,a0ee2a9b3d5d579e +8761,d5c1e155807c5418 +8762,a61389835c2bc68d +8763,56247f203bb9a4cb +8764,b2b2d498baf849bf +8765,103d76374bf0bb02 +8766,abe5f0297af6765e +8767,d58d83a3ed01e2c4 +8768,4dd54c8bd5d1c20f +8769,af96204779e8bfdc +8770,790294e58406c6d7 +8771,62bf1c6c22d325d7 +8772,0d1816337dbbf145 +8773,bca123296cfdd701 +8774,8c4c9d12a5ab5d39 +8775,c95e3cfaec331d70 +8776,26aee140076bc302 +8777,9fccec47ec3534b5 +8778,e30a973db82516ae +8779,7fec408fcc8f691f +8780,3551744d46a41bee +8781,1620c22a2c8d2d98 +8782,40c9bb4b778960a0 +8783,31897e433cdc1401 +8784,d266e0bf7c9958a7 +8785,dbc2dd3b91485595 +8786,845a9a133efeb817 +8787,690f1e95bc0d9483 +8788,7240a313ab3b521b +8789,9021d7cae0f1ccdd +8790,6489587dccd6f82b +8791,f1623836da87dc08 +8792,9fc1254d3d7c87c9 +8793,53276c2ba31000d7 +8794,a5678d853fae9bca +8795,5c50b9c05f176736 +8796,c90ca1ac3a73cc03 +8797,15de67598a944503 +8798,6a3a932e55d019e4 +8799,33b971fde5389fd2 +8800,2a77f9a6ba0560b3 +8801,795cbf85c8a65152 +8802,0b8aa92b5745361f +8803,a7826981a9656acf +8804,45f46c3f254cc184 +8805,f031495f85031dfe +8806,0402e04afef104da +8807,97f774cbb3ac3ee0 +8808,839492915ecddb06 +8809,6d3b27bd5aa9e3d5 +8810,3d2192b6baad3d32 +8811,c77510f26814f15c +8812,58ef92bc093b47ce +8813,93cea69f399cb63b +8814,d9ac224c3c6e2abd +8815,aa6e8b3586bce028 +8816,3962d2716ee7f32e +8817,b50ecda0692be6d4 +8818,08a93eda7337e0c7 +8819,3c6a2b3a98ad5583 +8820,6df36475651a45e9 +8821,966d378dd4c33b2e +8822,148f8009e96e59c6 +8823,08f008f1689322f2 +8824,941e0c71d9c49a35 +8825,a33232196e2172ac +8826,86c0802723b183d2 +8827,a90c56253da8ab68 +8828,935e4fe940a5be6f +8829,e17b5c440cc5ef9d +8830,e083d1f56b5f561a +8831,527a2b17cfd90662 +8832,5475eda2768fe4c9 +8833,017eeca34e82d3b1 +8834,012fa65200fc418e +8835,930cec2542250343 +8836,c39f541366801a8e +8837,a1dffcb27c16a8fe +8838,d3314dc41ce7ade3 +8839,05c97be9da5866dd +8840,1f0e3f06d5382187 +8841,e1f61e489b18a640 +8842,d8f25bfe02850209 +8843,77d2017458988b62 +8844,5360ba5286e474a9 +8845,ab2fc5fe57e8c5d0 +8846,973432c389634802 +8847,9f8262a977e688ed +8848,e2c32fc4f2a119d6 +8849,5bf4e6d31f03a645 +8850,831eec8b9b9a5205 +8851,1201612fea67c959 +8852,cee9ef33323c7c85 +8853,e7b399cfbcc19343 +8854,736a4f3dff39a401 +8855,de8c78efe9f4b9bc +8856,d8d36140fe24806e +8857,4d052f2d610a930a +8858,69633ebdfdc7b45d +8859,b9d430cb24bee3af +8860,0bcb22eb914c37ce +8861,6f7e327c0cabf62f +8862,fd891fa835e6a328 +8863,c2bd99913c428ce6 +8864,1c95e6816e4c0d6f +8865,181693230c35dbe5 +8866,f2617dffb8405f16 +8867,fd4e22094a2d3df2 +8868,e5620c6daec894ab +8869,9a41011c503ae79b +8870,943a3f338d7925c7 +8871,00e5fa1ec5124fc7 +8872,21f19af76bdb2756 +8873,ddc9b45da0a2e9f7 +8874,cccf41fa295ffe89 +8875,5eaa5c6fe037b99b +8876,240d89d40ee71c16 +8877,21c414742298f7fd +8878,608b26777e637097 +8879,07f2132b30b7b88f +8880,1827a091c73722cf +8881,7a77b93c0e1fdab5 +8882,09a60edce9edcb43 +8883,f248fc117b957377 +8884,0355945c052bac3a +8885,daec3e7ca93dbebe +8886,9e66f479e1a62e79 +8887,98fe58cfbc2a3dd3 +8888,00e50646ac3552ef +8889,796e01938bad3d98 +8890,efc3e776f333efbc +8891,a7bbb29008440d4c +8892,d37e2328d7294b50 +8893,d7d0db34b8b0baf0 +8894,906e0bf5a003315d +8895,167c71162520f7d3 +8896,8fe4e338a18dfb0f +8897,594678c3304068d5 +8898,6de17c9c40127731 +8899,d15f69cda8b6906a +8900,5f1b88fc71e7e2b8 +8901,1536ffb9d3bf99df +8902,1964b41feaa61c39 +8903,588bd9d64fed8e3d +8904,987d3ea5868ee3d3 +8905,c38c5a4767e5f552 +8906,d2c2d4855e994af0 +8907,1b47c7c843affdb0 +8908,16911d363b7a41a5 +8909,01d721b14dffcc20 +8910,89e886a04eb6a3af +8911,5ad2ffa5dbe7fd87 +8912,27baef230149fa47 +8913,67125b94c2b11085 +8914,0661203683974fad +8915,fb39d585880402c5 +8916,cf40af1ce7eab2ea +8917,509554939cd19ff9 +8918,3c866bbc10200330 +8919,49dcf3313e183bf4 +8920,e1223499f7b9a818 +8921,0dcd896585cc209a +8922,ee4da49f900e8f23 +8923,ceb0df508dc01e75 +8924,09b15adf60d085fe +8925,9d79dc6e5b5fe6c1 +8926,97df26bca8eedc8a +8927,a45642f2d8172631 +8928,5ffabd7167b29809 +8929,aa3b34fbf26f2262 +8930,a26305459359e0bd +8931,aaf104b8c49aefb4 +8932,68738c3f18fddfd6 +8933,7610030805d00857 +8934,a74adc58a33b18a7 +8935,94193cd7d46acd0d +8936,9f2a685e385a3478 +8937,dd2e12a91bb35348 +8938,7dbcf4ff9548144c +8939,566db45f6337b1c1 +8940,c9323eea1244e0b8 +8941,cfac317e60633805 +8942,052c6988139ba3a1 +8943,efa5fb187f58acf3 +8944,766c8ec80aae3df2 +8945,9a558965981d1b51 +8946,0ef7d8ca04992842 +8947,c25d51c3e8649590 +8948,60554e849eaa75f4 +8949,caa7621c66a8151e +8950,24d2e45c52975fcc +8951,0870eb43aad155db +8952,0e3f339116619dd9 +8953,c24b4455e0cd2b79 +8954,284c6955c7285ee2 +8955,cbdcddc84acf1f4f +8956,58c38ebba824d10b +8957,713c375f5a8b6ea4 +8958,fcdd63d5c6788399 +8959,200e6e60afafe063 +8960,604e1a26da1a74c0 +8961,44b093e60a8ccf25 +8962,1ff3f140390ac2aa +8963,7c88ecd5bad78cb3 +8964,68a960bd82f38866 +8965,00ea02eaa7b3098b +8966,99a89f0eca11335a +8967,b182182d7cb2b862 +8968,436f0ced314ad166 +8969,5bb638352fd655f3 +8970,4d0a39f3527d622a +8971,50b42b1848a7669b +8972,f86e333c6b1dc15d +8973,8c4eca2a0378e906 +8974,3f71534009418590 +8975,cc6c76805ed2f88c +8976,321d928b166ab336 +8977,0c8a8780e02e53d6 +8978,4fa6f26885bed012 +8979,babdbb2af8bc7450 +8980,26df68eeae98987c +8981,02074871dc9f1f17 +8982,1e4bf0256926c459 +8983,ba5b98b6f1185678 +8984,632a9c481b4421ec +8985,cfddda149bd9a8b9 +8986,901cebdb09a77c31 +8987,29d201f9465975da +8988,80aa2cd5a2573f74 +8989,5de7d1da8660377b +8990,873a6e1c952799b6 +8991,cc6c6ac1c735e521 +8992,8eb757b6a21cb576 +8993,c93407b8c8add7aa +8994,f30d1202748030e1 +8995,e40226b1c47b76a9 +8996,de0b122add011742 +8997,794b848748c3f586 +8998,b356bda57d17b910 +8999,32b5f491ca57ecdf +9000,3b8aa76175e8b476 +9001,6fa8a1a3496a08e7 +9002,16c0cb684838a4af +9003,4d722adbfa03ce31 +9004,21198180949739f8 +9005,a0f1fd06071471b3 +9006,16c3a58e05c6406a +9007,4a1dba0e20e69f57 +9008,7e14a318166ed150 +9009,b2d2610d70eae3f0 +9010,0d437ba59fc37213 +9011,676939c378902d03 +9012,b9c90b895fa2384b +9013,a042ed5e868a47fd +9014,16ffd78800655631 +9015,226a23c8e827dc9b +9016,6edb29fd437bda98 +9017,f89528ee836f9acf +9018,28606b5dd7d9c957 +9019,29912d66ca8b4593 +9020,2eb46dcec83ef1c7 +9021,575d36495932dada +9022,c1b6a9a236524111 +9023,54ee7ce1c632a216 +9024,8894842734b305f9 +9025,6d6d7a45293d86f0 +9026,c037566774cb767e +9027,04c877f5f938648c +9028,1d4aaf6fb473e31a +9029,508290e9dfdc6ddc +9030,d375c78c44cc321e +9031,4296f7ef7941031d +9032,01f83281aa17734c +9033,56cf0db56ce97488 +9034,41afca5dae93affc +9035,6ce8c6bba73cd685 +9036,b99ba81f8f178e76 +9037,17923182fc68347d +9038,e8ca697fbddb028e +9039,cd4ad57e5f32c2a4 +9040,95d0d89187592a58 +9041,ae65bd54a8813020 +9042,34ef00887bfe4d37 +9043,9abc433c19c34488 +9044,65c34a184f3c9a44 +9045,b3078cd4f5cce01a +9046,ff516222b50d413d +9047,e27d76b1c31e0e90 +9048,277eabf68d4e35a8 +9049,2751373ecb6f9a17 +9050,b4955347cb5f5727 +9051,f22a8f77b7b145b1 +9052,505e7aba26e0ae4f +9053,e3bbf602576e7081 +9054,a33bc00d2a18e901 +9055,e4da6196df20c37e +9056,0de4aac88312b4fe +9057,8809347f11f2564a +9058,827756e67ef4d2d4 +9059,45f674562809f744 +9060,3fb02590631d4e28 +9061,ee021a6fa6cc7fb9 +9062,68b32a6a34992c48 +9063,161d143c69a4e76d +9064,4700361ff761cf51 +9065,e1f7815ac5ced026 +9066,bc63c6df7e1328a1 +9067,f9ee6b2e6cbb841b +9068,2c4b0e1e062d0447 +9069,929f66301ec875d8 +9070,4dbad662447fb920 +9071,0506e2bbe0293642 +9072,4794f073f5a78aee +9073,654b8ae72ae7b07f +9074,8a92d6f23358250a +9075,646df38f1fd6aa65 +9076,8417a1835fe5c1a2 +9077,236b9b9cc45140f4 +9078,6c5c700bfbc90873 +9079,b6db17ceb5f09770 +9080,6564133ba9bd4565 +9081,a243d104fb3ad132 +9082,410405045f8498d7 +9083,112a9e962ec66c69 +9084,f2e0ddc6a4f3e5f8 +9085,f405144db2666cb4 +9086,ff0ad15f03e5372d +9087,63aafd2a5506710c +9088,394f5eee7641cd03 +9089,9228b48bc0d7cbcf +9090,4b260f579d3cbca4 +9091,87e890ec88c1af04 +9092,38815b4532b8667f +9093,74b469afa5202fda +9094,1ed49422ba57f0fa +9095,a35245b4edea2fde +9096,7ac5d523fe746d90 +9097,d56548d1735df7c5 +9098,c52030be6efd39f2 +9099,7715fff5e464e355 +9100,56006dfbc364cf85 +9101,2ded5cf5899a724d +9102,664c330363eb52a8 +9103,76e81defa064adf3 +9104,168a4cc3c2f7ee7a +9105,505228870364103d +9106,3500a49ce93b7500 +9107,3383b7481e219d2e +9108,87b247f4db4bcf78 +9109,b4fc6a106914ce5a +9110,5ec7e01b1eab0e70 +9111,6cf1cda86cb9f7d1 +9112,f5b0281866f944c8 +9113,bfd1e84f90f435bc +9114,0d78ca34eb35f575 +9115,7a43b7c96d0aeaba +9116,0d7330188ebfae08 +9117,fb33f8b16b38af22 +9118,6a68404237e17a97 +9119,b344c6b547eb6d5e +9120,be8f1c4f619e423f +9121,e4b07869122bfd45 +9122,5032bb88494c9f2f +9123,127a529029fbfa89 +9124,d3ce0300e42cb820 +9125,5d97f18066951046 +9126,59c0969594cc2fa5 +9127,ac04a2aaeac6af08 +9128,299da4adc2641804 +9129,e470b18cfa1ec93b +9130,fccff91a02519d54 +9131,dd42f635b9ae3088 +9132,a2b9f4be5dab3272 +9133,61229d38acc1b166 +9134,709eacd6c0c0e68a +9135,7ad26dbde8ba5932 +9136,28cf6de1f82bb77a +9137,ab514f3826ed84c9 +9138,eeea30185aaadc09 +9139,786b57238690c6f7 +9140,7aa24e731f4af26b +9141,05fcbfc359b520e1 +9142,d52ad3dd0d57c66d +9143,c6ef9aa1b35d88a9 +9144,3d99dba84cb356ac +9145,4a1acd565e32dd10 +9146,9d372f8566456a68 +9147,a85f982a87c148c1 +9148,1c21dd237a7fbd1e +9149,584aea738d867bb1 +9150,43f48da809d1c91c +9151,880083d4ef0708a8 +9152,bf39929f106703ab +9153,14a906b81d6d92b0 +9154,8de7f25826894b85 +9155,be3b10a6a746d425 +9156,b1a64af1d85c9579 +9157,9ac6eefbe67344f1 +9158,67fd25886f7a51ae +9159,832079adbf896a32 +9160,5789dcfe067ddc90 +9161,f85800a554f5fd4d +9162,a9efd32be84316b9 +9163,5eff8323b96afca7 +9164,046140c2c4d1fa01 +9165,8fd35b57d77b3029 +9166,68389de95a15e450 +9167,d964662d23a684cf +9168,121a2b4e2b5e0473 +9169,6e2982b6adf09914 +9170,30ba19b9f18c4697 +9171,43af550c93f23144 +9172,affafce703d65aa1 +9173,913033f24887f5c7 +9174,9e165d33e9b42ca6 +9175,b6b067cbeb33e4a0 +9176,c790f5bf8c8d381f +9177,2913ad062fff052b +9178,a18cd6886ada72ff +9179,99360d8c70567a42 +9180,bc5cdc5045f5453f +9181,a6e22611153bf453 +9182,c405744f4d8c7862 +9183,b24ef7aa4e75a42a +9184,0797d289bfcb2ebd +9185,6078c5d57c4352b9 +9186,4428117c3d21201b +9187,5755a132f0265af8 +9188,e73ff2385539a3c0 +9189,fef79f409f489608 +9190,30b41d35aa15682f +9191,7068a3a17c39ec33 +9192,21339fc0ddba3d11 +9193,dec6fea98f5254ea +9194,0e01ab9f7e8fe3ea +9195,b6a0b892c31ffca5 +9196,51d02d596e065b59 +9197,ab5763a478f065cc +9198,553aa786c5c09441 +9199,60febf5c26d7119d +9200,a8517a2a221d3d5d +9201,6b06dfff979871df +9202,c5526f1151e5dfb3 +9203,f5c5a1f3c24820c1 +9204,dcd6b799732c6490 +9205,db4e4cea0ed330eb +9206,0bc97c37bb2a8c45 +9207,be8681e1ef8d73b9 +9208,a27dd1204f48a63b +9209,84b5905f6e11d395 +9210,c09abd3c5c6b5dfd +9211,e0fabeb8e692d2ed +9212,4e56c62d665eead8 +9213,0340568fbd549797 +9214,983d10317103c859 +9215,68d23039975caf1b +9216,d934ba4fed7dd773 +9217,1a4677b4b762c07a +9218,f96ad7ba03c47217 +9219,b45ce29b9005a24a +9220,8499c58d1f4564f3 +9221,8a86f4b0d6edcccd +9222,cce6ac1139f3a1c1 +9223,2bb6b5073bfe9bb1 +9224,1240a822579802a1 +9225,6353ed4779c05a35 +9226,c13ff8218da9ab24 +9227,214a693d3db560f4 +9228,823134c45924911d +9229,7cf4b5f370a35c0f +9230,c03113477393e815 +9231,fa2905b80eb92f41 +9232,329a6659da681eb1 +9233,cdb4ce2d55393bf5 +9234,d0796919ec138c6d +9235,b1e87e0b3552eaa3 +9236,340d61483a09c82c +9237,26e0639cea6ce749 +9238,53d355ffa73b8016 +9239,9747cb438b0fda69 +9240,e83b0ef7638fe451 +9241,d88b6ebd0b1b1f07 +9242,c1cc2e3300f47e83 +9243,6de99e4a2b642360 +9244,93d8cc1361e469a5 +9245,0df6e709daed3054 +9246,129fa798a1f7e23e +9247,00dc77354b9af96f +9248,f7b0998a65b7296c +9249,64d7bda084b62579 +9250,6fb23585c49c2ab1 +9251,6fe2513e7a4b2678 +9252,c5f29aeb3eafa088 +9253,e9057d5331338c7f +9254,091d3ba8f0c20415 +9255,6bd5a92e25ce4e49 +9256,5c40c9ce003f1244 +9257,c58f6bbcdee81c80 +9258,bbf9e130c95ef6b6 +9259,5455dbe459bf11ca +9260,6101af69d132a681 +9261,26d74e52793751d4 +9262,53c4ca98e6caa5a4 +9263,9638d1605ebada25 +9264,e98f1556637dfaaf +9265,5b49687607c65152 +9266,d857197e83d44bc8 +9267,dc8b014084f40712 +9268,5c4b53b814462b22 +9269,48f154235be60a1f +9270,a8847762c359ddfa +9271,a7e9057a0ca74f3f +9272,b4ef218d25b31b25 +9273,139f4df0ce535dc2 +9274,fd84a8a7cb139b16 +9275,30cdd8b233a257ce +9276,107e9af87a8757ef +9277,f0d3ea1d1cad00e6 +9278,1ce1f1ba3b77f41b +9279,5d506db941da83fc +9280,0378ce4c1b79731a +9281,e69467f0190885fe +9282,a3549242800056cb +9283,51e3d7a926d28571 +9284,2df4f682e2a57095 +9285,0f2910d293e4ad81 +9286,339c39906cf56ad7 +9287,61c5d16c13428a98 +9288,21465270b92010f5 +9289,2ab26123635442e5 +9290,c5cac4c4290fb23a +9291,d5703dcaafdf56ce +9292,c6103198e45809f1 +9293,cbece61093604c39 +9294,52680d7c16e46e4f +9295,3c1351b79963ef4c +9296,1f29c6ac2a23b9fb +9297,611a74e7d1088123 +9298,5285b4472755eb7f +9299,ad0d4a0a876b46ec +9300,75b9c943bbf694a6 +9301,a7e6424b0aa0530a +9302,494804d78cf5c149 +9303,3f0d1cbe95054104 +9304,40658120def6b8f8 +9305,1ae93090118b2fc9 +9306,758d62c32e7ce576 +9307,f42a93e70b567b27 +9308,5e1f761eb73ba5af +9309,83c3819d917d24fe +9310,0b45b902e0d04b12 +9311,64610976ca81da50 +9312,ba2276be95ab6347 +9313,464cb49b00149450 +9314,0f773fa3cd2d7018 +9315,983ca93e2dca2228 +9316,5f8953cf65ec6267 +9317,5ed3f86412058c37 +9318,5c6beba6e4b09a72 +9319,ddedbb1ce2204fbd +9320,219c5fc5875fe252 +9321,b8aedf9087096fd2 +9322,a4b3e524842a1ab5 +9323,1bc9c1fb0e383c16 +9324,269fb5c697a85489 +9325,1ee204da0e857cd8 +9326,03593ecd245ca953 +9327,9dda55e7505bbcb1 +9328,8fbef91888136017 +9329,2188c3fad90ea2f5 +9330,21daba32026257d7 +9331,053b99dae5f8bbe2 +9332,0b91d11c7e43176e +9333,bd6e6b51c7605763 +9334,14ae634c6025f455 +9335,b0f014eafa6e2029 +9336,892fab2bb61fbb8e +9337,f286b9e846e6537f +9338,9ad58501704230b2 +9339,c00038759d179b5a +9340,ed525a25af7a0609 +9341,dc400d7ac49b97bd +9342,56bb043a63d11030 +9343,09e6fa6e03c5b620 +9344,94842832d46faab2 +9345,108d3765779236b0 +9346,733d1ecd5eede0d1 +9347,b01a2dcce12aaa25 +9348,227a4fb833056e0c +9349,38d016227dc00031 +9350,59bc69def210f88f +9351,ced4ca1ef61df223 +9352,50df8516619b8300 +9353,23ed7149b613ff94 +9354,c6a542754bd96326 +9355,1336efeaff826a44 +9356,d0625b0cfd36846b +9357,997827e23c831b7c +9358,e0bb7385893a70d6 +9359,6cd97d0d3a3be196 +9360,3a68f8c124b22d2d +9361,3b0eb825fe728f8f +9362,95deac0b22e6fff4 +9363,825803dd67b895ed +9364,7ce1dcd1b6fefa04 +9365,d895e6b59eac3358 +9366,26afc9a865a110fe +9367,325472d15b8020d2 +9368,f576b5de439c9a28 +9369,e64cfaac125de37d +9370,261a9fe949217e40 +9371,9d076bbfac629d1e +9372,fb04bab0b629de0c +9373,691441e01fa118ef +9374,7203284e95c3289f +9375,4c1cde04a1c7d798 +9376,834495d43466057f +9377,0a00f40716d76025 +9378,6113596218681cbe +9379,a1ebb55f1516847e +9380,7d7a882491d26d60 +9381,48095e2c26471675 +9382,e03acea9905c483e +9383,0105f13112ee4054 +9384,5541d4e549967824 +9385,8459908664c7171f +9386,9e21cfe88b2784bb +9387,6daa0d407744ab7a +9388,0f8f754757c1846a +9389,65433dc201c8d6fc +9390,0b0fd774c55fa4be +9391,4f2e912dd9d9eef1 +9392,c112f59af70e3eb1 +9393,3901633120fbef56 +9394,d6bfa4b3b3ede7af +9395,3620299e58868cc5 +9396,786a10248993ba09 +9397,fcbe21e218ab1314 +9398,b1a262629f0200d6 +9399,4d0cdd5900870ca3 +9400,0230b26dc370629e +9401,db70f867e84621f3 +9402,7c2419ca29840508 +9403,9493185ce22267b7 +9404,c1bcc885caf11512 +9405,884e631adced37b8 +9406,f160f0e8912a2bec +9407,d7d36d9fd73bdf3d +9408,41229cb6e3e28883 +9409,88e205b548feefad +9410,13de8f3cd1c52099 +9411,7fdf0f43deff324f +9412,6fcd84ca5f40deff +9413,cef1a36c45df22c3 +9414,c611cf7fecbee28d +9415,9a64ec2e704f4b8f +9416,0b899e2b7d1822d3 +9417,0386fdac2f7454f0 +9418,95917ebf37712d81 +9419,2efbe1c5fc35af4d +9420,c0dca7e42da7234f +9421,9c0910fd54a49909 +9422,9b4789e757e7d1e5 +9423,53df44960fc9fa0e +9424,f4dfe6c47df39f4c +9425,4e6d0483c070d5e7 +9426,73c84af1ae1e13ca +9427,076c4f5e9fabbb08 +9428,981c3cf1c95234a6 +9429,fff20cf9f7520c93 +9430,938915f3a84c07c9 +9431,0051ab5250258de9 +9432,7bb92f254f43a3aa +9433,7d05a66295d627c8 +9434,46d3f3e8137d6cc5 +9435,b273fad862fb5a12 +9436,f0054937aeb3b5d5 +9437,3ab90c15054c9688 +9438,8c9459ca44f9ea84 +9439,df3c93db27aaf480 +9440,7a511d1053886144 +9441,bef8edfd4c58f36e +9442,db5c9c6548e80ba7 +9443,c82c0bb9199f7ae0 +9444,e4e9f9ede9761d96 +9445,b34dd46cd3c1e6ec +9446,28d5fe8d6a592c4c +9447,a9c2a1014d3ffc21 +9448,e10ff78d535f737e +9449,930545bae4f03111 +9450,07dc294f6a8096e6 +9451,58ad487a86f978c4 +9452,711e319a09f01032 +9453,90a9ee691992b6ec +9454,b44f69fe39b5097c +9455,de16bb5e8f5da4f6 +9456,6228f243f87babf0 +9457,2df70d1e6edaa59f +9458,7cf215357e974af9 +9459,ed9f308abef87678 +9460,4b5c3eca9911efbd +9461,901785d292915229 +9462,16b26cb24b1ea00b +9463,bf688a0ddfc49578 +9464,63e045dd9b3f8982 +9465,386e188b36b2298f +9466,06b64483f9e43ef2 +9467,86741c24d86a4a34 +9468,bd3d12720785cf34 +9469,1c77a4e6dc8d82ed +9470,b8a155810e815438 +9471,6e2a265f1194d1ff +9472,14b171fa867783fe +9473,1bfb6ab8c71ab2b6 +9474,8e3497046d104abb +9475,279b2fe32ffbc4b7 +9476,21565869d70c9e8d +9477,716dfdb031e69ac0 +9478,2c004f08f1a68998 +9479,afcba90295e551c6 +9480,680ba56380272897 +9481,c1e019e433657c40 +9482,02bd677b57f04005 +9483,a5abdbe15a3c98f7 +9484,4bb9ad73b0aac66d +9485,8488120816d9fcf4 +9486,b273da69b6f36758 +9487,819a3cf7436ae026 +9488,f2aba583025218a2 +9489,678df45d0a7ef4ee +9490,3df7da2beca57657 +9491,e170937879115cc8 +9492,e3b1a1efac76df28 +9493,72dafbcb11e3f715 +9494,97304883c74c9328 +9495,41b931a157a99647 +9496,b9d7fbc0ccfb5b0b +9497,8fd5a3e6cad60be9 +9498,0d090b6241d9ff18 +9499,20e97da6fdf9fe2f +9500,cd570e5e7ee8d71d +9501,24db2e29c1272a49 +9502,8a881e85ae0abd55 +9503,a78eb02d5981c42c +9504,346de044c1fee2d3 +9505,33c1b7948c7d9e60 +9506,5e290a6a91b32416 +9507,ef30e74a2b193b1e +9508,8fbd5ede56e039cc +9509,bf2f5d7b2b535e80 +9510,7f4f60ab6c808868 +9511,74c1a015f1091b49 +9512,965b50b8707cd6ef +9513,a7a3365e25d23c43 +9514,e0934f3d979d8044 +9515,60d11c6a73d66d2c +9516,ccc2b5245e42c212 +9517,7ddbb918249aa63b +9518,1013780d62a9cd85 +9519,f8d186b9dcd32f81 +9520,92813fbeacbd5d55 +9521,b76a10900170ada6 +9522,770c165f07059d88 +9523,7443ef0905271532 +9524,d8ae5ff5db82c3c3 +9525,e4b5a3c68885980f +9526,c6a7d753b51feea6 +9527,f3cd5a94949c608d +9528,b67fc13edb40449b +9529,23d4ff9e51aca960 +9530,92527ae6e8f95e84 +9531,e93094b9953803f5 +9532,aad8be9e93f7978e +9533,fee0229934292503 +9534,b825fd5cfd54dba5 +9535,6c4b08db288cd952 +9536,791543d3855ab6e3 +9537,52862cceef096710 +9538,483a083d332a1acf +9539,7eae71e8e83280ad +9540,1ecf2785787f03d8 +9541,cc31a026199df6c5 +9542,8bc05a519a654470 +9543,a915c6a03cf0afe1 +9544,e6ed847c4893b874 +9545,ff7a5bd60da939fc +9546,9db68a6cf935c76e +9547,c97d1d9776928891 +9548,fd2a5b7276dc806d +9549,b3c258000d08d463 +9550,ffe6c9935220958e +9551,455a8a207251c41b +9552,c6f73ba7d405c20d +9553,c9f4a605c2ef25ab +9554,f48d3ea4a3f88275 +9555,41090933d40c1067 +9556,128aa27576396816 +9557,f5ab2f0bf2d4c404 +9558,8f139beafd7e2e02 +9559,d203ce04f75a1027 +9560,8bdb4545d280bff1 +9561,1d89aabf37364a3a +9562,7e538e471ccae9f6 +9563,7fec3528ce7a42d2 +9564,3fd82bc0a0b8143e +9565,80d8e7ed3bc7949b +9566,fa844ccc070640d4 +9567,01e1f0245e03ada6 +9568,0c9f4e096ec313a7 +9569,534c7f4d308555a4 +9570,d1c70f5e1321c4f1 +9571,ba0646fe511b0517 +9572,a38cf3b9783c9240 +9573,211dc182a77d3811 +9574,557c92261ae1a2e1 +9575,fa1043c807e66534 +9576,05b10e5dc42dc8af +9577,77d3afa39a19a97d +9578,ebc15a18e145c319 +9579,1b4980e29b5d9b9a +9580,954d93abd45cfbe7 +9581,8fa3f4c1582912cc +9582,1e40b3f1e49e9166 +9583,634b43b0570caaaa +9584,6a7a1c7ecac1d9c8 +9585,4dc2cb708188ab57 +9586,d7caec4f0629c392 +9587,19119ca57037cb4b +9588,1e33ad88463adbcc +9589,8ee85aa509ed7471 +9590,34bfe750cacbfd73 +9591,ccf4d110451d4854 +9592,140c9ab4ace12a5b +9593,854073075d18dd38 +9594,fbf6a7715d8c1b6a +9595,beb257b0b970fdae +9596,4f585ffaf6355e3c +9597,7cd8e4c08c5e93e0 +9598,064cf1b25128df16 +9599,fe67dbc4bfb6691d +9600,5003d9273130157e +9601,b5d8e2ecd481a09d +9602,bd811a23cd6d768b +9603,53a3121c6ad98eb7 +9604,ca49bddab78970c0 +9605,5c9642350bee4964 +9606,0882c5421b6e8b69 +9607,5f44dced5c8fa8a2 +9608,d09149da7f6a34be +9609,cb306539a24f48e7 +9610,38cda17d45456983 +9611,2c210d9de2afd2c9 +9612,318877cb26629ec1 +9613,aa6cd67baa94364e +9614,e3c1f9538057a38a +9615,bcbe6081ac27780b +9616,fbcac26555f40139 +9617,0545c10ced529c78 +9618,dc03d321a6bc059d +9619,541d43115e98c982 +9620,d011d36a2663aae1 +9621,f7a587bf57e28a1d +9622,56e27f8eeaf9cabe +9623,9ac36631ea23e76a +9624,670b4eb79f464705 +9625,5b23d44c725aef1d +9626,6ac6e688e0a1ac33 +9627,2360af6c19f1c3ea +9628,15a45bb6116336b8 +9629,916d687a0b7e7ead +9630,4f5ae8c4bd31d9d8 +9631,4dd9573a3bbb5d7a +9632,2c2ac1df581338f8 +9633,40a2f7ecbef06d59 +9634,6cd7f81d75be8b4b +9635,37f12da84c3aaab7 +9636,553c0e8d6a5865d2 +9637,773c9a4a03f64c0d +9638,7baf4ef8fa8ab7fb +9639,013e9e1581765ad8 +9640,02a329cf045cbc37 +9641,d650da39c837e3e1 +9642,1b86243ef262e23a +9643,dee56f8da3d3ace3 +9644,132e6884966a62bb +9645,07154d0ce5154b85 +9646,9e427f1cfa99c1c6 +9647,d5303827fd0ed80f +9648,4ec1ae75dceeeffd +9649,7500ff1f1b64101c +9650,b0d721a3b66b38dc +9651,6c9eb7e14c96e8b1 +9652,e937db1593d61b55 +9653,706a644b9a9e29cf +9654,5ec045bba3160110 +9655,5f68c60aa2bdc484 +9656,f5cc6f3950eee02e +9657,9cdcc7488cac0870 +9658,3c86ec8828f650fa +9659,696323ea73329e90 +9660,0b51f626c4188cc3 +9661,4e6a802ae00a33a0 +9662,ce5179548bd6b0b8 +9663,d04647b1d3d4f3b0 +9664,e98ea98f11ee63e5 +9665,cb61d88599a5b5da +9666,53577c5065beb4a3 +9667,3c4e4eb148860759 +9668,0f90936ae6b63c1a +9669,ee6cda6196d1e755 +9670,5996e5cced432994 +9671,83aa3ec75dfb30c4 +9672,98d07ca919375018 +9673,259d152e9dbaa42c +9674,3820da4540ca6193 +9675,e25e55c69c896693 +9676,362e6f0073a3f8cc +9677,b0a05fa1d9cf732c +9678,edd38cf6fcc8c4a7 +9679,1986835fe86e6cd3 +9680,29bc530acb8ffa3a +9681,6b9de3216d12c73d +9682,125dfc198988af66 +9683,50a4ce46257b5afc +9684,92a7e8bce9f05270 +9685,6219b4c9459b85ea +9686,2ed314429ea24dc8 +9687,8788373d1f8c8a7a +9688,67b997949de01578 +9689,c4f20b23f83a3d06 +9690,57426cc7cdaa34c4 +9691,d42038c5234a23b2 +9692,37b162acd8038031 +9693,ab3f150a2e5cec06 +9694,343a2fdf7acc67c5 +9695,e8d95bab931f2b3b +9696,9bd1c6c93220c130 +9697,02bda8e83a07728b +9698,9c1c65bd54c2fa86 +9699,c2f56d3eefc2bc88 +9700,62678b51997d014b +9701,63bc177ecf783173 +9702,dd2604296ffb1c1f +9703,6415ce0f21932dc6 +9704,c3abe0abcda6e5a8 +9705,25ebd3cc1966668e +9706,c147e175a525b557 +9707,c51d7df0e15fda67 +9708,c81e3b98fe25f351 +9709,2a4bfaa02dd4c4d2 +9710,f1700a90ac982f76 +9711,04727bc8caa3f103 +9712,a040a104215c2ee7 +9713,54b93b845e07ea03 +9714,0e19e00f37a602c0 +9715,1092101a04aabcd4 +9716,04e7c8a2b5d29d66 +9717,cc9f6df1043d677e +9718,d3612a8b83d7e5cd +9719,4accfb91dbecd1b4 +9720,397d1e972a45392f +9721,8f01cf7105353410 +9722,a68299daa469eb92 +9723,090343e01ea5e527 +9724,6ac14337e2b12eb3 +9725,af6a08b306a85cbc +9726,6f6ee2819b82d9ad +9727,c475e5924959b39e +9728,c8d6be1c11ed54e1 +9729,9f686d8c4b3acbe3 +9730,9753b63143498b9d +9731,42a0ad7006f913c6 +9732,6a52963a64dace35 +9733,500f03f322f6eb87 +9734,0e29b219f597312a +9735,9bc689b3ee34c739 +9736,e0ffba7f0212a4d4 +9737,7a41dbbf9c83f542 +9738,cbc77f49e142435f +9739,1152b1bf19aac5d5 +9740,9c256ffe25d5b262 +9741,7cd9e3b6b1ecabfe +9742,b0cd907e4b5ac080 +9743,948816262e105185 +9744,6df755177b922cd5 +9745,d5eb41015f7c598b +9746,4df293d9979c7e46 +9747,837e7f54f6b4bac8 +9748,420b7496d975f8fd +9749,e8a876ad036ea861 +9750,a69569f370eb289b +9751,9a6bfa2c3ef01d44 +9752,e47c2de95859b228 +9753,bf337390f0dcd0ff +9754,f8799ff9f7848fc7 +9755,15c5be98d0a69f5f +9756,7030d963eca5db75 +9757,2b1f317f3b20abac +9758,d445b4d7a2882f62 +9759,b403bae84a772cd8 +9760,9ccaaf798e601f5b +9761,bfbc70f2a564d233 +9762,71c66a1a61d4e3b4 +9763,f40f384a312414dd +9764,dd15d7f550dd284d +9765,e4f7ea2c8bacb564 +9766,eddee00e13671a87 +9767,b974ad447102217f +9768,75337f8cfbfc946e +9769,16afeb4c3a01bad3 +9770,b12c30aff2ed5c9f +9771,140904f0cf9c9f52 +9772,a4d93be6b02b852c +9773,736d49a994a187e7 +9774,670b99a410ae3fc5 +9775,aa643f9fb0102432 +9776,3c035bdd06d1c52c +9777,07df1d5aebb04c6b +9778,62ee924fd1942da7 +9779,b1a7ad19fa1fbdb6 +9780,4d55c856d1d9861e +9781,54c4668bb68ad4db +9782,e60ff2f4712255c4 +9783,0d49fe126a191774 +9784,665f4b38779286b1 +9785,70a845dbfc8acd82 +9786,8593bd131c05b9cf +9787,31a64333832d17cf +9788,96ebd0421b6617c1 +9789,723ca14aae1ad292 +9790,93e3e03940676825 +9791,922871bb4b19742a +9792,c4259e4bcd3af817 +9793,c3bf8ed196edafe7 +9794,f1578d111eed4ee5 +9795,bc089dd4ee5d60f1 +9796,030050ae525c6acb +9797,0c374c7de8ca6068 +9798,82b7e5fe4067af8a +9799,947cb84328fc7973 +9800,0ebeba510e424409 +9801,a5cdb9761b44f383 +9802,174fb6ff98b5e727 +9803,cec3436530ccd11e +9804,4279c9051160f90f +9805,8034c52690dd1ee6 +9806,49a4c50ac4f2a23d +9807,a64db140c2f65a86 +9808,b43dc6f4dbba69ab +9809,b669beecf1ad5c8d +9810,cd0f4423e1f20aac +9811,e185e7a60b22680f +9812,26ecd1f6a44a06c6 +9813,ea4ba15b72c4fd6c +9814,3038a506a7d827aa +9815,8fc19907da82777d +9816,ac9bff27ab77393a +9817,7cf3b06b06061509 +9818,7aefe006a8258a59 +9819,c8cc032b1ac66578 +9820,11bc8188184364aa +9821,5385040d6cce1790 +9822,9cd9e2d31d45066f +9823,f0d244238a0f8439 +9824,e036ae4665cc9682 +9825,fa5e9c6a234b9494 +9826,82efc5c6c7b9234f +9827,088ed9337b36942b +9828,b237c7a8b5f5cd34 +9829,87dec4acdee34aba +9830,225e8483ca51d128 +9831,22acebf98eb2dca3 +9832,29d52682a2dd2af5 +9833,c2e9ba16afffe3e1 +9834,91a94690a9c70785 +9835,2aa6490803bce418 +9836,697b2299ae65b13a +9837,f630be7cfe5568bf +9838,8f8d26540c752d00 +9839,2bdd0b3efa9364af +9840,e67ef88ebe44fb62 +9841,050fe1698cce1c71 +9842,8a48cbab9d247c7f +9843,f833ba7c7e282017 +9844,0cace1cbce5ea013 +9845,6100cc22f0ce619a +9846,089f5fb02f7d7888 +9847,6ed1964a550f07de +9848,fabc4781140d44be +9849,720ba2ec897424bb +9850,3e4afaa1d85698a3 +9851,80773e799e3a0aa0 +9852,438326cbac55439e +9853,e94529fa438f7c67 +9854,6ffb2e875033343f +9855,309db598efdb800f +9856,2548c9f4ea32abb6 +9857,d5a48b57ae6858e2 +9858,76d55829e6be791c +9859,e7f682779e8504be +9860,f8659558790b897f +9861,fffbba76dcbf8866 +9862,66f27a3db5f47b91 +9863,8078b85cc5aa9f46 +9864,ff7aa3bca9f98adb +9865,acf1d30424c6c9b2 +9866,198883f7bbdfc92d +9867,8e1dfcbd06d35339 +9868,46f6135246fa63ca +9869,9736a3b2fd38fae5 +9870,e1ba11d77f445f5a +9871,15dc9e96d2b0705a +9872,ddc2c902479fa9f5 +9873,e799875c6b3c37bc +9874,32167b91f8d2c00f +9875,c99fc9f0b64f737b +9876,069efb254b2b0283 +9877,6d3f5770a7663624 +9878,8b525774c6e12d64 +9879,01a01b9c427bbe37 +9880,8f406e61b776a964 +9881,3a81a2e9fad5f7ae +9882,38d59af48daca70b +9883,9e62bf38ab0fbc57 +9884,147cce5fd7dd4082 +9885,84662fe2ac84ca26 +9886,a3235228558ff8cd +9887,558c84052a085a13 +9888,f7332d29c962f0dc +9889,1f52f47e9f0b4dc5 +9890,f17b04dc62afd45f +9891,fadf0779b74a4e9d +9892,9d631a0cc4f12179 +9893,44e3a14a42eb77d4 +9894,c67e532c15e63768 +9895,8b3835a9e67085e3 +9896,7d9a6b65c5117d5e +9897,6667743fee38f26d +9898,03b0eeffae5d9486 +9899,1b00906840515a5a +9900,2fb9e0b1576af8a5 +9901,bb1b2fcc092ee1b5 +9902,907a319a11a1bef3 +9903,051f42b2db8f347d +9904,41e11bd97da9b887 +9905,96dfe8f9c788fe12 +9906,b7f1febc81adecbf +9907,b2fef056e815ca67 +9908,0c1816e5a38a655a +9909,57845c56ff0e49c9 +9910,3d97c03a03108227 +9911,541373cce096375c +9912,ee5a79b5abe9d8f3 +9913,8b7d56b2aca6c801 +9914,fa9aa6bda025e982 +9915,25f58edaec123d2c +9916,df394db3f76752d4 +9917,171b398059ff104b +9918,4d4dec3d6994b9c7 +9919,5d857be50531aa22 +9920,66aa9453e4023fc0 +9921,33bfce5053d3b559 +9922,3ef628040edbab7c +9923,e2e16643cf024a78 +9924,83745570877f6a92 +9925,305cda54585c446d +9926,426b8ffbb4925947 +9927,8e7bdb1f2ce70c76 +9928,c765ae2dfef06083 +9929,37365a6e6587cee8 +9930,6169bbf4619c0db6 +9931,29447a59f187a853 +9932,f409c5979482877c +9933,5eccc6c5bb57b73c +9934,56be083c8a0aff34 +9935,86c6d5f56c78544b +9936,ef2e6485d54cdd60 +9937,a7d604d272d4ecd6 +9938,bc66c1ab1b7d191c +9939,d7f62199dfed5f8f +9940,39c4f8e25a7878d6 +9941,8bf3e94103bd76d7 +9942,f89f92d037c8a587 +9943,25f212d77b3af9f6 +9944,6576071aeb9d948d +9945,540666aace3c1423 +9946,9f5421b801b5b889 +9947,46fff62a07611bb4 +9948,b72e01535df4c25d +9949,569ac4f992ba7e0b +9950,595629cc8b3ff466 +9951,b8a9667b9c576ed8 +9952,7b809096a04fae2c +9953,f2f612ff954e384f +9954,3635a53566f6e2c5 +9955,4d2e4f88fd2bd7e8 +9956,b6f2e4017148e95a +9957,e3f267f576252be4 +9958,de206e30753ec143 +9959,456b3b3e32a8add8 +9960,698babeba972377a +9961,4898c5d206499276 +9962,beb17a03a340af25 +9963,92f213dffee40ca8 +9964,fe2c015b3538d3d6 +9965,3e7af3bd8f297e31 +9966,f69ee17e3482cd34 +9967,4592cd5849d7a8c0 +9968,dda83a3f56fc3734 +9969,218a613af8fb4eaa +9970,73b3b2495f10e336 +9971,a4705ed1b462f6a2 +9972,4a5e32e8fd03854f +9973,00a23d5d2aa1a5d1 +9974,99568ae31fc62f5c +9975,d1dc5872a124ff02 +9976,f5be4ea1775d1f65 +9977,3ac8a91db864fda4 +9978,2a3dd928e2c08f69 +9979,d208c9ebbce98c66 +9980,3e86f75b224d536d +9981,a132d343fecd9628 +9982,3fb47a15e2f3f478 +9983,e79f04fb51840d6d +9984,61e49e4392fc5236 +9985,6835ba0d5f37049b +9986,06d57e39ea7bd36c +9987,dca9dd07fcf9a0a9 +9988,4011f437ce15ad2e +9989,83be5cd3c4393527 +9990,bd701fd331fa0a9b +9991,6d8e4fa6bba4ee2f +9992,37b2e26e2469ff31 +9993,c5cda6682989c5f7 +9994,44a2508d77072998 +9995,a86703f93cfb1330 +9996,8cf008a5e3f0b913 +9997,2b2e483ddde94387 +9998,3ed4d004eaa6c289 +9999,0c3dd053f486cba6 +10000,48425f340df8cf3b +10001,6d9b2b928cd2147e +10002,269cb49e9c7c9cf1 +10003,cc69536ff45cea34 +10004,11f8dd0dbeca0e7f +10005,6160a647cf33db33 +10006,6a37fb5083505b0a +10007,90ee8032a71493fa +10008,b8140c3d6902343a +10009,2d00dbf5c9bbea0e +10010,4f244e0a0f383944 +10011,5a6bbf3c84a95374 +10012,8904fe6849739028 +10013,d0467cae445709b9 +10014,36b072876fa49aa4 +10015,195035bd7706f0d2 +10016,8714cf9607326afa +10017,507e0b3fb3c97487 +10018,5400209550f2b85b +10019,791e04b8ba85ded9 +10020,3e959bfa8db51b07 +10021,1eb070c6d8df0888 +10022,c56102c79f1b0058 +10023,4862796c1cfae0d3 +10024,e837793c74df475f +10025,61c29c69e172b74a +10026,0a27d965540e255c +10027,ed9a8844c1823df2 +10028,d40f63e9386e7f1f +10029,c5ead1e60aafa4c8 +10030,f21213a1c16d2536 +10031,f7c063ca4ca55553 +10032,17c32f9b631af265 +10033,ef4d166901998b61 +10034,16c81cf358b4ab5d +10035,f43a388d6636499f +10036,942080a44810544c +10037,8d1e5b22921eb2a2 +10038,3d8058a0e0207ec6 +10039,d49777db352c3eb4 +10040,25c4ae49c43237df +10041,b30a02b70bdbf8e1 +10042,c3423696b9fdea0f +10043,9487b55d339504dc +10044,365bcb8cbeb78923 +10045,94ee487a7e9a55ed +10046,e9324c2aed9620a4 +10047,1c1c3a056961635f +10048,e6ef6fd4a2124246 +10049,1ed0cd333468db8c +10050,12d371fa6250db61 +10051,eba9148c5e0ab5b9 +10052,116b30a45726754d +10053,307a6b675df0ebf8 +10054,af3c7880a0df16af +10055,22278578a4664dd8 +10056,bebee4d0f05a8a19 +10057,2f3ce203aa970f7b +10058,fd7e58e24c68aac1 +10059,1f88a38cdb31ed80 +10060,20aeb949f930f3d6 +10061,d7fcef0900d19cdf +10062,515091c0ce40709f +10063,1c1eb173116855a3 +10064,2c3ab8f3706b4638 +10065,7564a2aa4f98ff04 +10066,ae860bf6e96cbb7e +10067,d20c49e2decf7dba +10068,ecd72eabd0d26459 +10069,ecd88f279d567e99 +10070,2c8992a794d85a94 +10071,ca3a88fd06aa0990 +10072,7ec8e6d98bde15a6 +10073,efd655299477cc73 +10074,198c9a2768b778bc +10075,705b7e475391c9f7 +10076,4a537edeb0bab391 +10077,1891cd5e8a99f1f2 +10078,fe76bea7f87a2a04 +10079,0e76ccf1ade8d795 +10080,013efc87e1e2bc12 +10081,1ddf12a09b1dae07 +10082,19ef32578e0b21fb +10083,7817674bd536f16f +10084,e5a8f751c3f0d7b7 +10085,288efb85ebdf9592 +10086,9cb04cf08f8af50f +10087,6b9f751450d7bb9c +10088,582970bb3d002025 +10089,9f628af48558e765 +10090,4b990d033d418974 +10091,d3c6d7f893608106 +10092,3ce683c7c91034d2 +10093,14f6b8dcf4875692 +10094,e3833a6d037d266d +10095,45273477bda3682e +10096,239d9307e56ce722 +10097,4efb1c380aa3ecc0 +10098,7a2a60fc31ee5bc4 +10099,9a00e8a48b7bf62b +10100,fad92df73119d401 +10101,547bbe2b637d58e1 +10102,35f77138d9d45ded +10103,b463332fe8dcae33 +10104,76b9aad1dbfaa1d4 +10105,9f6a0b27f797ae7d +10106,9fa303a2da0a5e22 +10107,18c43233fb13093b +10108,f18e03921ab8892e +10109,178051810f2d3453 +10110,fc4e0b9a4ddebd1c +10111,cec6f68cd1454baa +10112,30761979db5d87fc +10113,5adfbc7c1fe19b72 +10114,bc90f295e5bc8983 +10115,2a03c6a07402cf2a +10116,6992f22b440a0ff1 +10117,12f735e55d1a7a93 +10118,bf3c686c0ce759a1 +10119,b48bdd6b7bc843af +10120,b437a627522c31b2 +10121,450429d0a2dd991e +10122,48f159eec6889760 +10123,cdd2231ee6667d04 +10124,6d6a0f026cb61ec1 +10125,de6097b7ccc0f87e +10126,a591165d9d46ae30 +10127,87778b76da4abea3 +10128,9c79578a6ff83254 +10129,738f2d6388f635bc +10130,de8a9804e4dfbaaf +10131,11f8534931598ca4 +10132,f66a01791c6ecf92 +10133,5fa0074ee813c1cb +10134,6abf8123d9bafcde +10135,c96f3728e4050396 +10136,a58c28ab372e6ba8 +10137,ab28cf4202423786 +10138,6d58dc18fffcec79 +10139,e9b927528c5cf504 +10140,210f88971ae1dbac +10141,e21c93c87310cd8e +10142,e08886731c2a43fe +10143,abc285ba0f257e7c +10144,646213dfb10405f4 +10145,e4f92ce513fc28c4 +10146,a4266d31658c97cd +10147,765b42edd4f67d8c +10148,cd5270a4530824d4 +10149,369cf82f34e68622 +10150,98a3a90124c127e1 +10151,d7ac35bc9d277b92 +10152,ec1a6ce47b2af25e +10153,93ba02e7d5fcd6e3 +10154,46453187fd4cb494 +10155,7906432d17c49d74 +10156,f624e90efcbe835d +10157,b7ee6cf74b1ca287 +10158,df3d8de8ee6bafa5 +10159,c1e2ad4765ed5f0e +10160,ad289bf8b18eb58d +10161,79aac565b68639f3 +10162,9b192231f7038955 +10163,67ccc03db3f43a94 +10164,08b2d9536366d532 +10165,3750f831493f403a +10166,28ecc1c1ef71b9b9 +10167,786f7650c819ff6a +10168,e2ec66571d0f5c62 +10169,33c9c4955b970012 +10170,62cdf149647ed8d8 +10171,cd2c585d2f090ded +10172,6e9e176cf67f7b5b +10173,83db942fe3f93106 +10174,067e62a576beaea7 +10175,8efe54f79b2aa291 +10176,d91595b88e0f25f1 +10177,c1969112e000207b +10178,ec6501479608a91e +10179,da84a89ea0d787f4 +10180,ae35c53fe8e8cdea +10181,d766572d7eb5a2f8 +10182,d7ca87ad8aca96ae +10183,06d4b3a969a82f2a +10184,79b6e6b86c60d531 +10185,419f5e8453fbcd4e +10186,bacb29bce626ed1c +10187,ffe369d41c370d1f +10188,23385a6bf1c2d370 +10189,907229e536df460d +10190,8a0a97d238da139b +10191,28c30f862ff52558 +10192,cebdb4e68f2ab5d0 +10193,84388fa38811c35d +10194,1327928b5e6484d9 +10195,0197fe76979c2ae4 +10196,61d6059dfeb233d3 +10197,20eb670f2b754864 +10198,14b4f261348814aa +10199,4f8c7468db9b9e4a +10200,7b648e88d2ba75f1 +10201,e85118616ea09de0 +10202,def2c0543a1487fa +10203,51216a647f4827d4 +10204,86a6ad3b89fe4142 +10205,933f48b295891e3f +10206,ea6ad9e68845b246 +10207,59a0bd8407e75989 +10208,7c9facaef7ef38db +10209,bdac0ffbad25dd21 +10210,6bcb97c4fc310e2f +10211,f23d53092a5c42d5 +10212,95a49f3f109d01f0 +10213,5a963d31d7e19c07 +10214,d97d939255a0b97a +10215,09dbe6f45acc2da7 +10216,d046d098a0acb937 +10217,71f8c6c5bbfe7afa +10218,a02b127257e5c88f +10219,c967c3d5f09f2805 +10220,32318d57104c7832 +10221,47013f3d0181fc66 +10222,e504ceb4e93a0107 +10223,4922c14ec98cf20e +10224,221206c401f7ed03 +10225,81df81a5f2886493 +10226,389a93ec7b366b84 +10227,284aed7356b8912e +10228,f93ce9c1328aba01 +10229,16bfe78df3dfb793 +10230,94180f065734b8c0 +10231,e0705996cfbd4ae0 +10232,04b67489efd8b6aa +10233,c7a63ceaec2cd5bf +10234,78f57bc00569bcdd +10235,1a80b501d6c53091 +10236,455dfa2fa48034c3 +10237,128ba8ebff1da97e +10238,278486c8a0d74a70 +10239,46c39956bffd67ff diff --git a/hashlib/test/hmac_test.dart b/hashlib/test/hmac_test.dart new file mode 100644 index 0000000..eb7c1f8 --- /dev/null +++ b/hashlib/test/hmac_test.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:hashlib/src/algorithms/hmac.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('HMAC test', () { + test("name", () { + final key = "key"; + expect(md5.hmac.byString(key).name, 'MD5/HMAC'); + expect(sha1.hmac.byString(key).name, 'SHA1/HMAC'); + expect(sha256.hmac.byString(key).name, 'SHA-256/HMAC'); + }); + test("with MD5", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = "80070713463e7749b90c2dc24911e275"; + final actual = md5.hmac.byString(key, utf8).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-1", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"; + final actual = sha1.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-224", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "88ff8b54675d39b8f72322e65ff945c52d96379988ada25639747e69"; + final actual = sha224.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-256", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"; + final actual = sha256.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-384", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = "d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6" + "fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237"; + final actual = sha384.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-512", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb" + "82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a"; + final actual = sha512.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-512/224", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "a1afb4f708cb63570639195121785ada3dc615989cc3c73f38e306a3"; + final actual = sha512t224.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA-512/256", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "7fb65e03577da9151a1016e9c2e514d4d48842857f13927f348588173dca6d89"; + final actual = sha512t256.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA3-224", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "ff6fa8447ce10fb1efdccfe62caf8b640fe46c4fb1007912bf85100f"; + final actual = sha3_224.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA3-256", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "8c6e0683409427f8931711b10ca92a506eb1fafa48fadd66d76126f47ac2c333"; + final actual = sha3_256.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA3-384", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = "aa739ad9fcdf9be4a04f06680ade7a1bd1e01a0af6" + "4accb04366234cf9f6934a0f8589772f857681fcde8acc256091a2"; + final actual = sha3_384.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + test("with SHA3-512", () { + final key = "key"; + final msg = "The quick brown fox jumps over the lazy dog"; + final expected = + "237a35049c40b3ef5ddd960b3dc893d8284953b9a4756611b1b61bffcf53edd979" + "f93547db714b06ef0a692062c609b70208ab8d4a280ceee40ed8100f293063"; + final actual = sha3_512.hmac.byString(key).string(msg).hex(); + expect(actual, expected); + }); + + test('sink test', () { + final key = "key".codeUnits; + final msg = "The quick brown fox jumps over the lazy dog".codeUnits; + final output = "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"; + final sink = HMACSink(sha1, Uint8List.fromList(key)); + expect(sink.closed, isFalse); + for (int i = 0; i < msg.length; i += 7) { + sink.add(msg.skip(i).take(7).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(() => sink.add(msg), throwsStateError); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + expect(sink.closed, isFalse); + sink.add(msg); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/keccak_test.dart b/hashlib/test/keccak_test.dart new file mode 100644 index 0000000..a73099e --- /dev/null +++ b/hashlib/test/keccak_test.dart @@ -0,0 +1,78 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/src/algorithms/keccak/keccak.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('Keccak test', () { + test('The state size assertion', () { + KeccakHash(stateSize: 0, paddingByte: 0); + KeccakHash(stateSize: 50, paddingByte: 0); + KeccakHash(stateSize: 99, paddingByte: 0); + expect( + () => KeccakHash(stateSize: -1, paddingByte: 0), + throwsA(isA()), + ); + expect( + () => KeccakHash(stateSize: 100, paddingByte: 0), + throwsA(isA()), + ); + expect( + () => KeccakHash(stateSize: 101, paddingByte: 0), + throwsA(isA()), + ); + expect( + () => KeccakHash(stateSize: 150, paddingByte: 0), + throwsA(isA()), + ); + }); + + test('Keccak-224 with empty string', () { + expect(keccak224sum(""), + "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd"); + }); + test('Keccak-256 with empty string', () { + expect(keccak256sum(""), + "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); + }); + test('Keccak-384 with empty string', () { + expect( + keccak384sum(""), + "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2" + "dd2b21362337441ac12b515911957ff"); + }); + test('Keccak-512 with empty string', () { + expect( + keccak512sum(""), + "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c0" + "0fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"); + }); + + test('Keccak-224 with "abc"', () { + final input = "abc"; + final output = "c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8"; + expect(keccak224sum(input), output); + }); + test('Keccak-256 with "abc"', () { + final input = "abc"; + final output = + "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45"; + expect(keccak256sum(input), output); + }); + test('Keccak-384 with "abc"', () { + final input = "abc"; + final output = "f7df1165f033337be098e7d288ad6a2f74409d7a60b49c3664221" + "8de161b1f99f8c681e4afaf31a34db29fb763e3c28e"; + expect(keccak384sum(input), output); + }); + test('Keccak-512 with "abc"', () { + final input = "abc"; + final output = + "18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5" + "d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96"; + expect(keccak512sum(input), output); + }); + }); +} diff --git a/hashlib/test/md2_test.dart b/hashlib/test/md2_test.dart new file mode 100644 index 0000000..5878f4f --- /dev/null +++ b/hashlib/test/md2_test.dart @@ -0,0 +1,88 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "8350e5a3e24c153df2275c9f80692773", + "a": "32ec01ec4a6dac72c0ab96fb34c0b5d1", + "abc": "da853b0d3f88d99b30283a69e6ded6bb", + "message digest": "ab4f496bfb2a530b219ff33031fe06b0", + "abcdefghijklmnopqrstuvwxyz": "4e8ddff3650292ab5a4108c3aa47940b", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "da33def2a42df13975352846c30338cd", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "d5976f79d83d3a0dc9806c3c66f3efd8", +}; + +void main() { + group('MD2 test', () { + test('with an empty string', () { + expect(md2sum(""), tests[""]); + }); + + test('with a single letter', () { + expect(md2sum("a"), tests["a"]); + }); + + test('with a few letters', () { + expect(md2sum("abc"), tests["abc"]); + }); + + test('with a short string', () { + expect(md2sum("message digest"), tests["message digest"]); + }); + + test('with special case', () { + var key = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + expect(md2sum(key), tests[key]); + }); + + test('with longest string', () { + var last = tests.entries.last; + expect(md2sum(last.key), last.value); + }); + + test('with all known cases', () { + tests.forEach((key, value) { + expect(md2sum(key), value); + }); + }); + + test('with stream', () async { + final last = tests.entries.last; + final input = last.key.codeUnits; + final stream = Stream.fromIterable([ + input.take(7).toList(), + input.skip(7).take(10).toList(), + input.skip(17).take(15).toList(), + input.skip(32).toList(), + ]); + final result = await md2.bind(stream).first; + expect(result.hex(), last.value, reason: "'${last.key}'"); + }); + + test('sink test', () { + final last = tests.entries.last; + final input = last.key.codeUnits; + final output = last.value; + final sink = md2.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 12) { + sink.add(input.skip(i).take(12).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/md4_test.dart b/hashlib/test/md4_test.dart new file mode 100644 index 0000000..b16574b --- /dev/null +++ b/hashlib/test/md4_test.dart @@ -0,0 +1,80 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "31d6cfe0d16ae931b73c59d7e0c089c0", + "a": "bde52cb31de33e46245e05fbdbd6fb24", + "abc": "a448017aaf21d8525fc10ae87aa6729d", + "message digest": "d9130a8164549fe818874806e1c7014b", + "abcdefghijklmnopqrstuvwxyz": "d79e1c308aa5bbcdeea8ed63df412da9", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "043f8582f241db351ce627e153e7f0e4", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "e33b4ddc9c38f2199c3e7b164fcc0536", + "123": "c58cda49f00748a3bc0fcfa511d516cb", + "test": "db346d691d7acc4dc2625db19f9e3f52", + 'message': "ffa70bbb57bda34ec842cac3d9a099aa", + "Hello World": "77a781b995cf1cfaf39d9e2f5910c2cf", + List.filled(128, "a").join(): "cb4a20a561558e29460190c91dced59f", + List.filled(511, "a").join(): "1c2912a2a50886af88bbf6b374593d6c", + List.filled(512, "a").join(): "71ad0ebe8db92f0deca36c233e1ac4cb", + List.filled(513, "a").join(): "e5f5b4253616aeb972b6f823a2519911", + // List.filled(1000000, "a").join(): "bbce80cc6bb65e5c6745e30d4eeca9a4", +}; + +void main() { + group('MD4 test', () { + test('with empty string', () { + expect(md4sum(""), tests[""]); + }); + + test('with single letter', () { + expect(md4sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(md4sum("abc"), tests["abc"]); + }); + + test('with longest string', () { + var last = tests.entries.last; + expect(md4sum(last.key), last.value); + }); + + test('with special case', () { + var key = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + expect(md4sum(key), tests[key]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(md4sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(md4sum(key), value); + }); + }); + + test('with stream', () async { + final last = tests.entries.last; + final input = last.key.codeUnits; + final stream = Stream.fromIterable([ + input.take(7).toList(), + input.skip(7).take(10).toList(), + input.skip(17).take(15).toList(), + input.skip(32).toList(), + ]); + final result = await md4.bind(stream).first; + expect(result.hex(), last.value, reason: "'${last.key}'"); + }); + }); +} diff --git a/hashlib/test/md5_test.dart b/hashlib/test/md5_test.dart new file mode 100644 index 0000000..de9ed35 --- /dev/null +++ b/hashlib/test/md5_test.dart @@ -0,0 +1,118 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('MD5 test', () { + test('with empty string', () { + expect(md5sum(""), equals("d41d8cd98f00b204e9800998ecf8427e")); + }); + + test('with single letter', () { + expect(md5sum("a"), equals("0cc175b9c0f1b6a831c399e269772661")); + }); + + test('with few letters', () { + expect(md5sum("abc"), equals("900150983cd24fb0d6963f7d28e17f72")); + }); + + test('"message digest"', () { + final input = "message digest"; + final output = "f96b697d7cb7938d525a2f31aaf161d0"; + expect(md5sum(input), equals(output)); + }); + test('"abcdefghijklmnopqrstuvwxyz"', () { + final input = "abcdefghijklmnopqrstuvwxyz"; + final output = "c3fcd3d76192e4007dfb496cca67e13b"; + expect(md5sum(input), equals(output)); + }); + test('with string A-Za-z0-9', () { + final input = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + final output = "d174ab98d277d9f5a5611c2c9f419d9f"; + expect(md5sum(input), equals(output)); + }); + + test('with a very long number string', () { + final input = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890"; + final output = "57edf4a22be3c955ac49da2e2107b67a"; + expect(md5sum(input), equals(output)); + }); + test('"123"', () { + final input = "123"; + final output = "202cb962ac59075b964b07152d234b70"; + expect(md5sum(input), equals(output)); + }); + test('"test"', () { + final input = "test"; + final output = "098f6bcd4621d373cade4e832627b4f6"; + expect(md5sum(input), equals(output)); + }); + test('"message"', () { + final input = 'message'; + final output = "78e731027d8fd50ed642340b7c9a63b3"; + expect(md5sum(input), equals(output)); + }); + test('"Hello World"', () { + final input = "Hello World"; + final output = "b10a8db164e0754105b7a99be72e3fe5"; + expect(md5sum(input), equals(output)); + }); + test('List.filled(512, "a").join()', () { + final input = List.filled(512, "a").join(); + final output = "56907396339ca2b099bd12245f936ddc"; + expect(md5sum(input), equals(output)); + }); + test('List.filled(128, "a").join()', () { + final input = List.filled(128, "a").join(); + final output = "e510683b3f5ffe4093d021808bc6ff70"; + expect(md5sum(input), equals(output)); + }); + test('List.filled(513, "a").join()', () { + final input = List.filled(513, "a").join(); + final output = "6649c3e827e44f7bf539768bddf76435"; + expect(md5sum(input), equals(output)); + }); + test('List.filled(511, "a").join()', () { + final input = List.filled(511, "a").join(); + final output = "3ba3485f242a5859f4417ccf004cd74c"; + expect(md5sum(input), equals(output)); + }); + test('List.filled(1000000, "a").join()', () { + final input = List.filled(1000000, "a").join(); + final output = "7707d6ae4e027c70eea2a935c2296f21"; + expect(md5sum(input), equals(output)); + }, skip: true); + + test('with stream', () async { + final input = List.filled(511, "a").join(); + final stream = Stream.fromIterable(input.codeUnits); + final output = "3ba3485f242a5859f4417ccf004cd74c"; + final actual = await md5.byteStream(stream); + expect(actual.hex(), output); + }); + + test('sink test', () { + final input = List.filled(511, "a".codeUnitAt(0)); + final output = "3ba3485f242a5859f4417ccf004cd74c"; + final sink = md5.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/pbkdf2_test.dart b/hashlib/test/pbkdf2_test.dart new file mode 100644 index 0000000..36aabfc --- /dev/null +++ b/hashlib/test/pbkdf2_test.dart @@ -0,0 +1,187 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('PBKDF2 test', () { + test("name", () { + final iv = "key".codeUnits; + expect(sha256.pbkdf2(iv).name, 'SHA-256/HMAC/PBKDF2'); + expect(sha256.hmac.pbkdf2(iv).name, 'SHA-256/HMAC/PBKDF2'); + expect(sha1.pbkdf2(iv).name, 'SHA1/HMAC/PBKDF2'); + expect(sha1.hmac.pbkdf2(iv).name, 'SHA1/HMAC/PBKDF2'); + expect(md5.pbkdf2(iv).name, 'MD5/HMAC/PBKDF2'); + expect(md5.hmac.pbkdf2(iv).name, 'MD5/HMAC/PBKDF2'); + }); + test('fromSecurity', () { + var pw = 'password'.codeUnits; + var out = PBKDF2.fromSecurity(PBKDF2Security.little).convert(pw); + expect(out.length, PBKDF2Security.little.dklen); + }); + + test("Default method: pbkdf2", () { + var hash = pbkdf2( + 'password'.codeUnits, + "some salt".codeUnits, + 50, + 32, + ); + var matcher = + '09d106dccc35eae63c48aa472394de511547ce296ab55685b7ba8b304bec68fe'; + expect(hash.hex(), matcher); + }); + + test("with MD5", () { + final pw = 'password'.codeUnits; + final iv = "some salt".codeUnits; + final result = + '592e779487b7c4dc20ca5cd276163bbb760a40960bb17187cd4895238361d201'; + final output = md5.pbkdf2(iv, iterations: 100, keyLength: 32).hex(pw); + expect(output, equals(result)); + }); + + test("with MD5 through HMAC", () { + final pw = 'password'.codeUnits; + final iv = "some salt".codeUnits; + final result = '592e779487b7c4dc20ca5cd276163bbb'; + final output = md5.pbkdf2(iv, iterations: 100, keyLength: 16).hex(pw); + expect(output, equals(result)); + }); + + test("with SHA-1", () { + final pw = 'password'.codeUnits; + final iv = "some salt".codeUnits; + final result = + 'a001e5ddf0b823ccc74edc957ab881e7924ef5c608956cd7d32606b8d7c8acb1'; + final output = sha1.pbkdf2(iv, iterations: 100, keyLength: 32).hex(pw); + expect(output, equals(result)); + }); + + test("with SHA-224", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '57f86bc67aad5fa335f8f0f8ecd7b550c7f2462502d3058897299f49111f8948'; + expect(output, equals(matcher)); + }); + + test("with SHA-256", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '09d106dccc35eae63c48aa472394de511547ce296ab55685b7ba8b304bec68fe'; + expect(output, equals(matcher)); + }); + + test("with SHA-384", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha384.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '6091b46523e28ffa34d777f81c9ef446cd2983601a6dbdd8cc63aa0fa461b624'; + expect(output, equals(matcher)); + }); + + test("with SHA-512", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha512.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '05f45e131d21985a38c25cb30c9edee0bfe697d19fb84a0d55e89e2a347c7905'; + expect(output, equals(matcher)); + }); + + test("with SHA-512/224", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha512t224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '7b03e2f53046cf52a0d8ace8f469bef3fdbe0a2b4b112b10586d33119a98aa94'; + expect(output, equals(matcher)); + }); + + test("with SHA-512/256", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha512t256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '73b02a03a67fe08ab8fee80f2d135f4afb954380406994b0f2670a0f5d0c7faa'; + expect(output, equals(matcher)); + }); + + test("with SHA3-224", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha3_224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '3543a75506759d603c2058847f39969f8d6c164ebc50c53eb44f290c7835521c'; + expect(output, equals(matcher)); + }); + + test("with SHA3-256", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha3_256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + 'c4aae4cbf79071757bf167a8cff387a615295bed94320d394e9ed15a4b53a9c1'; + expect(output, equals(matcher)); + }); + + test("with SHA3-384", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha3_384.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + 'e39eef6add54c1b1cddb35dcf44cce8163941b1e73a26bd6f422dbdf4a98b7c0'; + expect(output, equals(matcher)); + }); + + test("with SHA3-512", () { + var pw = 'password'.codeUnits; + var iv = "some salt".codeUnits; + var output = sha3_512.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw); + var matcher = + '349d16a5e9cb37d277c0d05235c63bf1d094367c27968262d9d9460d96bbed79'; + expect(output, equals(matcher)); + }); + + test("long password with SHA-256", () { + var hash = pbkdf2( + 'passwd'.codeUnits, + "salt".codeUnits, + 1, + 256, + ); + var matcher = + '55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc' + '49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783' + 'c294e850150390e1160c34d62e9665d659ae49d314510fc98274cc7968196810' + '4b8f89237e69b2d549111868658be62f59bd715cac44a1147ed5317c9bae6b2a' + 'd89a7e71d005442240f5d97bd6d58c2cec9417c63f4ebf19661303a083c430c5' + 'ac29e5732761e3659cdf6a7b0f13f630042fadef4ed2c2a59d805b39590beedf' + '906b7f15744f4f2403cd27c0b61d9c270f6395a47e72cd57ff14a63eb0d38a7e' + 'fac778f409b9d733e12ca7afb23690b212e5f55397bdc884c73193cb2feec7ef'; + expect(hash.hex(), matcher); + }); + + test("The iterations must be at least 1", () { + expect(() => pbkdf2([9], [5], 0), throwsStateError); + expect(() => pbkdf2([9], [5], -1), throwsStateError); + }); + + test("The iterations must be less than 2^31", () { + expect(() => pbkdf2([9], [5], 0x80000000), throwsStateError); + expect(() => pbkdf2([9], [5], 0x8FFFFFFF), throwsStateError); + expect(() => pbkdf2([9], [5], 0xFFFFFFFF), throwsStateError); + }); + + test("The keyLength must be at least 1", () { + expect(() => pbkdf2([9], [5], 10, 0), throwsStateError); + expect(() => pbkdf2([9], [5], 10, -1), throwsStateError); + }); + }); +} diff --git a/hashlib/test/poly1305_test.dart b/hashlib/test/poly1305_test.dart new file mode 100644 index 0000000..0aff801 --- /dev/null +++ b/hashlib/test/poly1305_test.dart @@ -0,0 +1,295 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +const cases = [ + // Raw Poly1305 + // onetimeauth.c from nacl-20110221 + [ + "eea6a7251c1e72916d11c2cb214d3c25" "2539121d8e234e652d651fa4c8cff880", + "8e993b9f48681273c29650ba32fc76ce48332ea7164d96a4476fb8c531a1186a" + "c0dfc17c98dce87b4da7f011ec48c97271d2c20f9b928fe2270d6fb863d51738" + "b48eeee314a7cc8ab932164548e526ae90224368517acfeabd6bb3732bc0e9da" + "99832b61ca01b6de56244a9e88d5f9b37973f622a43d14a6599b1f654cb45a74e355a5", + "f3ffc7703f9400e52a7dfb4b3d3305d9" + ], + // Specific test cases generated from test-poly1305aes from poly1305aes-20050218 that + // expose Java unsigned integer problems + [ + "01bcb20bfc8b6e03609ddd09f44b060f" "95cc0e44d0b79a8856afcae1bec4fe3c", + "66f75c0e0c7a40658629e3392f7f8e3349a02191ffd49f39879a8d9d1d0e23ea3caa4d240bd2ab8a8c4a6bb8d3288d9de4b793f05e97646dd4d98055de" + "fc3e0677d956b4c62664bac15962ab15d93ccbbc03aafdbde779162ed93b55361f0f8acaa41d50ef5175927fe79ea316186516eef15001cd04d3524a55" + "e4fa3c5ca479d3aaa8a897c21807f721b6270ffc68b6889d81a116799f6aaa35d8e04c7a7dd5e6da2519e8759f54e906696f5772fee093283bcef7b930" + "aed50323bcbc8c820c67422c1e16bdc022a9c0277c9d95fef0ea4ee11e2b27276da811523c5acb80154989f8a67ee9e3fa30b73b0c1c34bf46e3464d97" + "7cd7fcd0ac3b82721080bb0d9b982ee2c77feee983d7ba35da88ce86955002940652ab63bc56fb16f994da2b01d74356509d7d1b6d7956b0e5a557757b" + "d1ced2eef8650bc5b6d426108c1518abcbd0befb6a0d5fd57a3e2dbf31458eab63df66613653d4beae73f5c40eb438fbcfdcf4a4ba46320184b9ca0da4" + "dfae77de7ccc910356caea3243f33a3c81b064b3b7cedc7435c223f664227215715980e6e0bb570d459ba80d7512dbe458c8f0f3f52d659b6e8eef19ee" + "71aea2ced85c7a42ffca6522a62db49a2a46eff72bd7f7e0883acd087183f0627f3537a4d558754ed63358e8182bee196735b361dc9bd64d5e34e1074a" + "855655d2974cc6fa1653754cf40f561d8c7dc526aab2908ec2d2b977cde1a1fb1071e32f40e049ea20f30368ba1592b4fe57fb51595d23acbdace324cd" + "d78060a17187c662368854e915402d9b52fb21e984663e41c26a109437e162cfaf071b53f77e50000a5388ff183b82ce7a1af476c416d7d204157b3633" + "b2f4ec077b699b032816997e37bceded8d4a04976fd7d0c0b029f290794c3be504c5242287ea2f831f11ed5690d92775cd6e863d7731fd4da687ebfb13" + "df4c41dc0fb8", + "ae345d555eb04d6947bb95c0965237e2" + ], + [ + "cd07fd0ef8c0be0afcbdb30af4af0009" "76fb3635a2dc92a1f768163ab12f2187", + "f05204a74f0f88a7fa1a95b84ec3d8ffb36fcdc7723ea65dfe7cd464e86e0abf6b9d51" + "db3220cfd8496ad6e6d36ebee8d990f9ce0d3bb7f72b7ab5b3ab0a73240d11efe77" + "2c857021ae859db4933cdde4387b471d2ce700fef4b81087f8f47c307881fd83017a" + "fcd15b8d21edf9b704677f46df97b07e5b83f87c8abd90af9b1d0f9e2710e8ebd0d4" + "d1c6a055abea861f42368bed94d9373e909c1d3715b221c16bc524c55c31ec3eab20" + "4850bb2474a84f9917038eff9d921130951391b5c54f09b5e1de833ea2cd7d3b3067" + "40abb7096d1e173da83427da2adddd3631eda30b54dbf487f2b082e8646f07d6e0a8" + "7e97522ca38d4ace4954bf3db6dd3a93b06fa18eb56856627ed6cffcd7ae26374554" + "ca18ab8905f26331d323fe10e6e70624c7bc07a70f06ecd804b48f8f7e75e910165e" + "1beb554f1f0ec7949c9c8d429a206b4d5c0653102249b6098e6b45fac2a07ff0220b" + "0b8ae8f4c6bcc0c813a7cd141fa8b398b42575fc395747c5a0257ac41d6c1f434cfb" + "f5dfe8349f5347ef6b60e611f5d6c3cbc20ca2555274d1934325824cef4809da293e" + "a13f181929e2af025bbd1c9abdc3af93afd4c50a2854ade3887f4d2c8c225168052c" + "16e74d76d2dd3e9467a2c5b8e15c06ffbffa42b8536384139f07e195a8c9f70f514f3" + "1dca4eb2cf262c0dcbde53654b6250a29efe21d54e83c80e005a1cad36d5934ff01c3" + "2e4bc5fe06d03064ff4a268517df4a94c759289f323734318cfa5d859d4ce9c16e63" + "d02dff0896976f521607638535d2ee8dd3312e1ddc80a55d34fe829ab954c1ebd54d" + "929954770f1be9d32b4c05003c5c9e97943b6431e2afe820b1e967b19843e5985a13" + "1b1100517cdc363799104af91e2cf3f53cb8fd003653a6dd8a31a3f9d566a7124b0f" + "fe9695bcb87c482eb60106f88198f766a40bc0f4873c23653c5f9e7a8e446f770beb" + "8034cf01d21028ba15ccee21a8db918c4829d61c88bfa927bc5def831501796c5b40" + "1a60a6b1b433c9fb905c8cd40412fffee81ab", + "045be28cc52009f506bdbfabedacf0b4" + ], + // Test case from JIRA issue BJA-620 + [ + "ffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffff", + "c80cb43844f387946e5aa6085bdf67da" + ], +]; + +void main() { + group('Poly1305 test', () { + test('the RFC sample', () { + var r = fromHex("85d6be7857556d337f4452fe42d506a8"); + var s = fromHex("0103808afb0db2fd4abff6af4149f51b"); + var m = "Cryptographic Forum Research Group".codeUnits; + var actual = "a8061dc1305136c6c22b8baf0c0127a9"; + expect(poly1305.pair(r, s).convert(m).hex(), actual); + }); + + test("example from NACL", () { + var key = [ + 0xee, 0xa6, 0xa7, 0x25, 0x1c, 0x1e, 0x72, 0x91, // + 0x6d, 0x11, 0xc2, 0xcb, 0x21, 0x4d, 0x3c, 0x25, + 0x25, 0x39, 0x12, 0x1d, 0x8e, 0x23, 0x4e, 0x65, + 0x2d, 0x65, 0x1f, 0xa4, 0xc8, 0xcf, 0xf8, 0x80, + ]; + var msg = [ + 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73, // + 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce, + 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4, + 0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a, + 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b, + 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72, + 0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2, + 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38, + 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a, + 0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae, + 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea, + 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda, + 0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde, + 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3, + 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6, + 0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74, + 0xe3, 0x55, 0xa5 + ]; + var mac = [ + 0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5, // + 0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9 + ]; + var res = poly1305auth(msg, key); + expect(res.bytes, equals(mac)); + }); + + test("NACL example with wrap key", () { + var key = [ + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]; + var msg = [ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + ]; + var mac = [ + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]; + var res = poly1305auth(msg, key); + expect(res.bytes, equals(mac)); + }); + + test("example from poly1305-donna", () { + var key = List.generate(32, (i) => (i + 221) & 0xFF); + var msg = List.generate(73, (i) => (i + 121) & 0xFF); + var mac = [ + 0xdd, 0xb9, 0xda, 0x7d, 0xdd, 0x5e, 0x52, 0x79, // + 0x27, 0x30, 0xed, 0x5c, 0xda, 0x5f, 0x90, 0xa4 + ]; + var res = poly1305auth(msg, key); + expect(res.bytes, mac); + }); + + test('key = strings of zeros', () { + var m = "Cryptographic Forum Research Group".codeUnits; + var key = List.filled(32, 0); + var actual = List.filled(16, 0); + expect(poly1305auth(m, key).bytes, equals(actual)); + }); + + test('random key, empty message', () { + var m = []; + var key = fromHex( + 'c90e3dd155bcd5dfc5ac9a73eed584e6652bd6b403cdafd31bed3427442d29a9', + ); + var actual = "652bd6b403cdafd31bed3427442d29a9"; + expect(poly1305auth(m, key).hex(), actual); + }); + + test('random key, single message', () { + var m = "0".codeUnits; + var key = fromHex( + 'b90e3dd1e5bc6cdfc5ac9a73eed584e6652bd3b409acdafd31bed3427442dae1', + ); + var actual = "1aa7542dcbfafa4e04e7808ab84a989f"; + expect(poly1305auth(m, key).hex(), actual); + }); + + test("buffered update", () { + var key = [ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // + 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00 + ]; + var mac = [ + 0xc6, 0x9d, 0xc3, 0xb9, 0x75, 0xee, 0x5f, 0x6b, // + 0x28, 0x99, 0x57, 0x94, 0x41, 0x27, 0xd7, 0x5e, + ]; + + var sink = poly1305.by(key).createSink(); + for (int i = 0; i < 256; i++) { + var mac = poly1305 + .pair( + List.generate(16, (j) => i), + List.generate(16, (j) => 0xFF), + ) + .convert(List.generate(i, (j) => i)); + sink.add(mac.bytes); + } + expect(sink.digest().bytes, equals(mac)); + }); + + test("from bc-java test cases", () { + for (final x in cases) { + var mac = poly1305auth( + fromHex(x[1]), + fromHex(x[0]), + ); + expect(mac.hex(), x[2]); + } + }); + + test('pair with invalid key length', () { + var s = Uint8List(16); + expect(() => poly1305.pair([], s).convert([100]), throwsStateError); + expect(() => poly1305.pair([10], s).convert([100]), throwsStateError); + expect(() => poly1305.pair(Uint8List(32), s).convert([100]), + throwsStateError); + expect(() => poly1305.pair(Uint8List(20), s).convert([100]), + throwsStateError); + }); + + test('pair with invalid secret length', () { + var r = Uint8List(16); + expect(() => poly1305.pair(r, []).convert([100]), throwsStateError); + expect(() => poly1305.pair(r, [10]).convert([100]), throwsStateError); + expect(() => poly1305.pair(r, Uint8List(20)).convert([100]), + throwsStateError); + }); + + test('pair with secret = null and 16 bit key', () { + var r = fromHex("85d6be7857556d337f4452fe42d506a8"); + var m = "Cryptographic Forum Research Group".codeUnits; + var out1 = poly1305.pair(r).convert(m).hex(); + var out2 = poly1305auth(m, r).hex(); + expect(out1, equals(out2)); + }); + + test('pair with secret = null and 32 bit key', () { + var r = fromHex( + "85d6be7857556d337f4452fe42d506a8" + "0103808afb0db2fd4abff6af4149f51b", + ); + var m = "Cryptographic Forum Research Group".codeUnits; + var out1 = poly1305.pair(r).convert(m).hex(); + var out2 = poly1305auth(m, r).hex(); + expect(out1, equals(out2)); + }); + + test('sink test', () { + final key = fromHex(cases[2][0]); + final msg = fromHex(cases[2][1]); + final output = cases[2][2]; + + final sink = Poly1305Sink(key); + expect(sink.closed, isFalse); + for (int i = 0; i < msg.length; i += 7) { + sink.add(msg.skip(i).take(7).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(() => sink.add(msg), throwsStateError); + expect(sink.digest().hex(), equals(output)); + + sink.reset(); + expect(sink.closed, isFalse); + + sink.add(msg); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + + test("The key length must be either 16 or 32 bytes", () { + for (int i = 0; i < 64; ++i) { + final key = Uint8List(i); + if (i == 16 || i == 32) { + Poly1305Sink(key); + } else { + expect(() => Poly1305Sink(key), throwsA(isA())); + } + } + }); + }); +} diff --git a/hashlib/test/random/random_test.dart b/hashlib/test/random/random_test.dart new file mode 100644 index 0000000..9f5e718 --- /dev/null +++ b/hashlib/test/random/random_test.dart @@ -0,0 +1,429 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore_for_file: no_leading_underscores_for_local_identifiers + +import 'dart:isolate'; +import 'dart:typed_data'; + +import 'package:hashlib/random.dart'; +import 'package:hashlib/src/random/generators.dart'; +import 'package:test/test.dart'; + +const int _maxInt = 0xFFFFFFFF; + +@pragma('vm:entry-point') +void nextSeedIsolate(SendPort port) { + port.send($generateSeed()); +} + +var testRandom = HashlibRandom.custom(() => _maxInt); + +void runFunctionalText(HashlibRandom rand) { + rand.nextInt(); + rand.nextBetween(30, 50); + rand.nextBool(); + rand.nextByte(); + rand.nextBytes(10); + rand.nextDouble(); + rand.nextInt(); + rand.nextNumbers(10); + rand.nextString(10); + rand.nextWord(); +} + +void main() { + group('functional tests', () { + test("secure random", () { + runFunctionalText(HashlibRandom(RNG.secure)); + }); + test("system random", () { + runFunctionalText(HashlibRandom(RNG.system)); + }); + group("keccak random", () { + test('functions', () { + runFunctionalText(HashlibRandom(RNG.keccak)); + }); + test('with seed', () { + var rand = HashlibRandom(RNG.keccak, seed: 100); + expect(rand.nextInt(), 3662713900); + }); + }); + group("sha256 random", () { + test("functions", () { + runFunctionalText(HashlibRandom(RNG.sha256)); + }); + test('with seed', () { + var rand = HashlibRandom(RNG.sha256, seed: 100); + expect(rand.nextInt(), 3624764737); + }); + }); + group("sm3 random", () { + test("functions", () { + runFunctionalText(HashlibRandom(RNG.sm3)); + }); + test('with seed', () { + var rand = HashlibRandom(RNG.sm3, seed: 100); + expect(rand.nextInt(), 874203019); + }); + }); + group("md5 random", () { + test("functions", () { + runFunctionalText(HashlibRandom(RNG.md5)); + }); + test('with seed', () { + var rand = HashlibRandom(RNG.md5, seed: 100); + expect(rand.nextInt(), 368434865); + }); + }); + test("xxh64 random", () { + runFunctionalText(HashlibRandom(RNG.xxh64)); + }, tags: ['vm-only']); + }); + + test('seed generator uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask($generateSeed), + )); + expect(seeds.toSet().length, 1000); + }); + + test('seed generator uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn(nextSeedIsolate, receiver.sendPort), + )); + final seeds = await receiver.take(100).toList(); + expect(seeds.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + + test('random bytes length = 0', () { + expect(randomBytes(0), []); + }); + test('random bytes length = 1', () { + expect(randomBytes(1).length, 1); + }); + test('random bytes length = 100', () { + expect(randomBytes(100).length, 100); + }); + + test('random numbers length = 0', () { + expect(randomNumbers(0), []); + }); + test('random numbers length = 1', () { + expect(randomNumbers(1).length, 1); + }); + test('random numbers length = 100', () { + expect(randomNumbers(100).length, 100); + }); + test('random numbers value', () { + final result = randomNumbers(10); + expect(result, anyElement(greaterThan(255))); + }); + + test('fill random bytes', () { + var data = Uint8List(10); + fillRandom(data.buffer); + expect(data, anyElement(isNonZero)); + }); + + test('fill random numbers', () { + var data = Uint32List(10); + fillNumbers(data); + expect(data, anyElement(greaterThan(255))); + }); + + test('fill test random', () { + int i, c; + for (c = 0; c <= 100; ++c) { + for (i = 0; i + c <= 100; ++i) { + var data = Uint8List(100); + testRandom.fill(data.buffer, i, c); + int s = data.fold(0, (p, e) => p + (e > 0 ? 1 : 0)); + expect(s, c, reason: 'fill($i, $c) : $data'); + } + } + }); + + test('next between', () { + var rand = HashlibRandom.secure(); + expect(rand.nextBetween(0, 0), 0); + expect(rand.nextBetween(1, 1), 1); + expect(rand.nextBetween(5, 10), lessThanOrEqualTo(10)); + expect(rand.nextBetween(10, 5), greaterThanOrEqualTo(5)); + expect(rand.nextBetween(-5, -2), lessThan(0)); + expect(rand.nextBetween(-5, -15), lessThan(0)); + for (int i = 0; i < 100; ++i) { + expect(rand.nextBetween(0, 1), lessThanOrEqualTo(1)); + expect(rand.nextBetween(0, 3), lessThanOrEqualTo(3)); + expect(rand.nextBetween(0, 10), lessThanOrEqualTo(10)); + expect(rand.nextBetween(0, 50), lessThanOrEqualTo(50)); + expect(rand.nextBetween(0, 500), lessThanOrEqualTo(500)); + expect(rand.nextBetween(0, 85701), lessThanOrEqualTo(85701)); + expect(rand.nextBetween(1, _maxInt), greaterThanOrEqualTo(1)); + expect(rand.nextBetween(3, _maxInt), greaterThanOrEqualTo(3)); + expect(rand.nextBetween(10, _maxInt), greaterThanOrEqualTo(10)); + expect(rand.nextBetween(50, _maxInt), greaterThanOrEqualTo(50)); + expect(rand.nextBetween(500, _maxInt), greaterThanOrEqualTo(500)); + expect(rand.nextBetween(85701, _maxInt), greaterThanOrEqualTo(85701)); + } + }); + + test('random string throws StateError on empty whitelist', () { + expect( + () => randomString( + 50, + whitelist: [], + ), + throwsStateError); + expect( + () => randomString( + 50, + whitelist: [1, 2, 3], + blacklist: [1, 2, 3], + ), + throwsStateError); + expect( + () => randomString( + 50, + numeric: true, + blacklist: '0123456789'.codeUnits, + ), + throwsStateError); + }); + + group('HashlibRandom.nextString', () { + late HashlibRandom random; + final _lower = 'abcdefghijklmnopqrstuvwxyz'.codeUnits; + final _upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.codeUnits; + final _digits = '0123456789'.codeUnits; + final _controls = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 127 + ]; + final _punctuations = [ + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // + 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, + ]; + + setUp(() { + // Mock generator with predictable values + final items = [ + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, // + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 + ]; + int p = 0; + random = HashlibRandom.custom(() { + p %= items.length; + return items[p++]; + }); + }); + + test('should return a string of correct length', () { + final result = random.nextString(10); + expect(result.length, equals(10)); + }); + + test('should contain only ASCII characters by default', () { + final result = random.nextString(10); + for (int i = 0; i < result.length; i++) { + expect(result.codeUnitAt(i), inInclusiveRange(0, 127)); + } + }); + + test('should include only lowercase characters when lower is true', () { + final result = random.nextString( + 25, + lower: true, + upper: false, + numeric: false, + controls: false, + punctuations: false, + ); + expect(result.codeUnits, everyElement(isIn(_lower))); + }); + + test('should include uppercase characters when upper is true', () { + final result = random.nextString( + 25, + lower: false, + upper: true, + numeric: false, + controls: false, + punctuations: false, + ); + expect(result.codeUnits, everyElement(isIn(_upper))); + }); + + test('should include numeric characters when numeric is true', () { + final result = random.nextString( + 25, + lower: false, + upper: false, + numeric: true, + controls: false, + punctuations: false, + ); + expect(result.codeUnits, everyElement(isIn(_digits))); + }); + + test('should include control characters when controls is true', () { + final result = random.nextString( + 25, + lower: false, + upper: false, + numeric: false, + controls: true, + punctuations: false, + ); + expect(result.codeUnits, everyElement(isIn(_controls))); + }); + + test('should include punctuation characters when punctuations is true', () { + final result = random.nextString( + 25, + lower: false, + upper: false, + numeric: false, + controls: false, + punctuations: true, + ); + expect(result.codeUnits, everyElement(isIn(_punctuations))); + }); + + test('should include multiple (lower, numeric)', () { + final result = random.nextString( + 50, + lower: true, + upper: false, + numeric: true, + controls: false, + punctuations: false, + ); + final matcher = [..._lower, ..._digits]; + expect(result.codeUnits, everyElement(isIn(matcher))); + }); + + test('should include multiple (upper, numeric)', () { + final result = random.nextString( + 50, + lower: false, + upper: true, + numeric: true, + controls: false, + punctuations: false, + ); + final matcher = [..._upper, ..._digits]; + expect(result.codeUnits, everyElement(isIn(matcher))); + }); + + test('should include multiple (numeric, controls)', () { + final result = random.nextString( + 50, + lower: false, + upper: false, + numeric: true, + controls: true, + punctuations: false, + ); + final matcher = [..._controls, ..._digits]; + expect(result.codeUnits, everyElement(isIn(matcher))); + }); + + test('should include multiple (lower, punctuations)', () { + final result = random.nextString( + 50, + lower: true, + upper: false, + numeric: false, + controls: false, + punctuations: true, + ); + final matcher = [..._lower, ..._punctuations]; + expect(result.codeUnits, everyElement(isIn(matcher))); + }); + + test('should use whitelist if provided', () { + final whitelist = [65, 66, 67]; // A, B, C + final result = random.nextString(10, whitelist: whitelist); + expect(result.codeUnits, everyElement(isIn(whitelist))); + }); + + test('should remove characters in blacklist', () { + final blacklist = [65, 66, 67]; // A, B, C + final result = random.nextString(10, blacklist: blacklist, lower: true); + expect(result.codeUnits, isNot(anyOf(blacklist))); + }); + + test('should throw StateError if whitelist is empty', () { + expect(() => random.nextString(10, whitelist: []), + throwsA(isA())); + }); + + test('should return an empty string if length is 0', () { + final result = random.nextString(0); + expect(result, isEmpty); + }); + + test('should return deterministic output with the same seed', () { + int p = 0, q = 0; + final random1 = HashlibRandom.custom(() => p++); + final random2 = HashlibRandom.custom(() => q++); + + final result1 = random1.nextString(10); + final result2 = random2.nextString(10); + + expect(result1, equals(result2)); + }); + }); + + group('Test \$seedList', () { + test('Test with a normal length list', () { + int seed = 123456789; + var data = Uint8List(64); + $seedList(data, seed); + expect(data, isNot(equals(Uint8List(64)))); + }); + + test('Test with small list', () { + int seed = 123456789; + for (int i = 1; i < 8; ++i) { + var data = Uint8List(i); + $seedList(data, seed); + expect(data, isNot(equals(Uint8List(i)))); + } + }); + + test('Test with uneven list', () { + int seed = 123456789; + for (int i = 1; i < 4; ++i) { + var data = Uint8List(64 + i); + $seedList(data, seed); + expect(data.skip(64), isNot(equals(Uint8List(i)))); + } + }); + + test('Test with same seed', () { + int seed = 123456789; + var data1 = Uint8List(255); + var data2 = Uint8List(255); + $seedList(data1, seed); + $seedList(data2, seed); + expect(data1, equals(data2)); + }); + + test('Test with different seed', () { + int seed1 = 123456789; + int seed2 = 987654321; + var data1 = Uint8List(255); + var data2 = Uint8List(255); + $seedList(data1, seed1); + $seedList(data2, seed2); + expect(data1, isNot(equals(data2))); + }); + }); +} diff --git a/hashlib/test/random/uuid_test.dart b/hashlib/test/random/uuid_test.dart new file mode 100644 index 0000000..d5d2012 --- /dev/null +++ b/hashlib/test/random/uuid_test.dart @@ -0,0 +1,297 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:isolate'; +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/src/uuid.dart'; +import 'package:test/test.dart'; + +@pragma('vm:entry-point') +void runIsolate(dynamic inp) { + final port = inp[0] as SendPort; + switch (inp[1] as String) { + case 'v1': + return port.send(uuid.v1()); + case 'v3': + return port.send(uuid.v3()); + case 'v4': + return port.send(uuid.v4()); + case 'v5': + return port.send(uuid.v5()); + case 'v6': + return port.send(uuid.v6()); + case 'v7': + return port.send(uuid.v7()); + case 'v8': + return port.send(uuid.v8()); + } + throw ArgumentError('Undefined version'); +} + +void main() { + group('UUID v1', () { + test("known value", () { + final time = DateTime.parse('2022-02-22T14:22:22-0500').toUtc(); + final clockSeq = 0x33C8; + final node = 0x9F6BDECED846; + final out = 'c232ab00-9414-11ec-b3c8-9f6bdeced846'; + final res = uuid.v1(node: node, clockSeq: clockSeq, utc: time); + expect(res, equals(out)); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v1), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v1'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v3', () { + test("known value", () { + final namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; + final name = 'www.example.com'; + final out = '5df41881-3aed-3515-88a7-2f4a814cf09e'; + final res = uuid.v3(name: name, namespace: namespace); + expect(res, equals(out)); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v3), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v3'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v4', () { + test("known value", () { + final out = RegExp(r'........-....-4...-....-............'); + final res = uuid.v4(); + expect(res, matches(out)); + final part4 = fromHex(res.split('-')[3]).buffer.asUint8List(); + expect(part4[0] >>> 6, 2); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v4), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v4'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v5', () { + test("known value", () { + final namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; + final name = 'www.example.com'; + final out = '2ed6657d-e927-568b-95e1-2665a8aea6a2'; + final res = uuid.v5(name: name, namespace: namespace); + expect(res, equals(out)); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v5), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v5'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v6', () { + test("known value", () { + final time = DateTime.parse('2022-02-22T14:22:22-0500').toUtc(); + final clockSeq = 0x33C8; + final node = 0x9F6BDECED846; + final out = '1ec9414c-232a-6b00-b3c8-9f6bdeced846'; + final res = uuid.v6(node: node, clockSeq: clockSeq, utc: time); + expect(res, equals(out)); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v6), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v6'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v7', () { + test("known value", () { + final time = DateTime.parse('2022-02-22T14:22:22-0500').toUtc(); + final out = RegExp(r'017f22e2-79b0-7...-....-............'); + final res = uuid.v7(utc: time); + expect(res, matches(out)); + final part4 = fromHex(res.split('-')[3]).buffer.asUint8List(); + expect(part4[0] >>> 6, 2); + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v7), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v7'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('UUID v8', () { + test("known value 1", () { + final nonce = fromHex('2489E9AD2EE20E000EC932D5F69181C0'); + final out = '2489e9ad-2ee2-8e00-8ec9-32d5f69181c0'; + final res = uuid.v8(nonce: nonce); + expect(res, equals(out)); + }); + test("known value 2", () { + final nonce = fromHex('5c146b143c524afd938a375d0df1fbf6'); + final out = '5c146b14-3c52-8afd-938a-375d0df1fbf6'; + final res = uuid.v8(nonce: nonce); + expect(res, equals(out)); + }); + test("throws argument error on invalid nonce", () { + for (int i = 0; i < 20; ++i) { + final nonce = Uint8List(i); + if (i == 16) { + uuid.v8(nonce: nonce); + } else { + expect( + () => uuid.v8(nonce: nonce), + throwsArgumentError, + reason: 'length: $i', + ); + } + } + }); + test('uniqueness with futures', () async { + final seeds = await Future.wait(List.generate( + 1000, + (_) => Future.microtask(uuid.v8), + )); + expect(seeds.toSet().length, 1000); + }); + + test('uniqueness with isolates', () async { + final receiver = ReceivePort(); + await Future.wait(List.generate( + 100, + (_) => Isolate.spawn( + runIsolate, + [receiver.sendPort, 'v8'], + errorsAreFatal: true, + ), + )); + final items = await receiver.take(100).toList(); + expect(items.toSet().length, 100); + }, tags: ['vm-only'], timeout: Timeout(Duration(minutes: 5))); + }); + + group('NamespaceValue', () { + final matcher = matches('........-....-....-....-............'); + test('dns', () { + expect(Namespace.dns.value, matcher); + }); + test('url', () { + expect(Namespace.url.value, matcher); + }); + test('oid', () { + expect(Namespace.oid.value, matcher); + }); + test('x500', () { + expect(Namespace.x500.value, matcher); + }); + test('nil', () { + expect(Namespace.nil.value, matcher); + }); + test('max', () { + expect(Namespace.max.value, matcher); + }); + test('time', () { + expect(Namespace.time, matcher); + }); + }); +} diff --git a/hashlib/test/registry_test.dart b/hashlib/test/registry_test.dart new file mode 100644 index 0000000..c445e3d --- /dev/null +++ b/hashlib/test/registry_test.dart @@ -0,0 +1,89 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore_for_file: always_declare_return_types, deprecated_member_use_from_same_package + +import 'package:test/test.dart'; +import 'package:hashlib/hashlib.dart'; // Adjust the import path as needed + +// Mock or custom implementations for testing purposes +class CustomHashBase extends HashBase { + @override + String get name => 'custom-hash'; + + @override + createSink() { + throw UnimplementedError(); + } +} + +class CustomBlockHashBase extends BlockHashBase { + @override + String get name => 'custom-block-hash'; + + @override + createSink() { + throw UnimplementedError(); + } +} + +void main() { + group('HashRegistry', () { + test('lookup should return the correct HashBase algorithm by name', () { + expect(HashRegistry.lookup('SHA-256'), equals(sha256)); + expect(HashRegistry.lookup('sha256'), equals(sha256)); + expect(HashRegistry.lookup('SHA2'), equals(sha256)); + expect(HashRegistry.lookup('md5'), equals(md5)); + expect(HashRegistry.lookup('blake2b512'), equals(blake2b512)); + }); + + test('lookup should return null for an unknown algorithm name', () { + expect(HashRegistry.lookup('unknown-algo'), isNull); + }); + + test('register should add a new HashBase algorithm', () { + final customHash = CustomHashBase(); + HashRegistry.register(customHash); + expect(HashRegistry.lookup(customHash.name), equals(customHash)); + }); + + test('register should override an existing HashBase algorithm', () { + final customHash = CustomHashBase(); + HashRegistry.register(customHash, 'Sha-256'); + expect(HashRegistry.lookup('sha256'), equals(customHash)); + }); + + test('register should add BlockHashBase algorithm', () { + HashRegistry.register(md5, 'test-md5'); + expect(HashRegistry.lookup('test-md5'), equals(md5)); + expect(BlockHashRegistry.lookup('test-md5'), equals(md5)); + }); + }); + + group('BlockHashRegistry', () { + test('lookup should return the correct algorithm by name', () { + expect(BlockHashRegistry.lookup('blake2b512'), equals(blake2b512)); + expect(BlockHashRegistry.lookup('BLAKE2'), equals(blake2b512)); + expect(BlockHashRegistry.lookup('sha3_512'), equals(sha3_512)); + expect(BlockHashRegistry.lookup('sha3-384'), equals(sha3_384)); + expect(BlockHashRegistry.lookup('sha3 256'), equals(sha3_256)); + }); + + test('lookup should return null for an unknown algorithm', () { + expect(BlockHashRegistry.lookup('unknown-algo'), isNull); + }); + + test('register should add a new BlockHashBase algorithm', () { + final customBlockHash = CustomBlockHashBase(); + BlockHashRegistry.register(customBlockHash); + expect(BlockHashRegistry.lookup(customBlockHash.name), + equals(customBlockHash)); + }); + + test('register should override an existing BlockHashBase algorithm', () { + final customBlockHash = CustomBlockHashBase(); + BlockHashRegistry.register(customBlockHash, 'blake2b512'); + expect(BlockHashRegistry.lookup('blake2b512'), equals(customBlockHash)); + }); + }); +} diff --git a/hashlib/test/ripemd128_test.dart b/hashlib/test/ripemd128_test.dart new file mode 100644 index 0000000..27a0784 --- /dev/null +++ b/hashlib/test/ripemd128_test.dart @@ -0,0 +1,66 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('RIPEMD-128 test', () { + test('with defined cases', () { + var m = [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "1234567890123456789012345678901234567890123456789012345678901234" + "5678901234567890", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + ]; + var r = [ + "cdf26213a150dc3ecb610f18f6b38b46", + "86be7afa339d0fc7cfc785e72f578d33", + "c14a12199c66e4ba84636b0f69144c77", + "9e327b3d6e523062afc1132d7df9d1b8", + "fd2aa607f71dc8f510714922b371834e", + "a1aa0689d0fafa2ddc22e88b49133a06", + "d1e959eb179c911faea4624c60c5c702", + "3f45ef194732c2dbb2c4a2c769795fa3", + "7388178e5d59f3a68b4bf524f6c7a970", + "f49f55294493b91df0a2592440a5e2ca", + ]; + for (var i = 0; i < m.length; ++i) { + expect(ripemd128sum(m[i]), r[i]); + } + }); + test('with a millian "a"', () { + var m = List.filled(1000000, 'a'.codeUnitAt(0)); + var r = "4a7f5723f954eba1216c9d8f6320431f"; + expect(ripemd128.convert(m).hex(), r); + }, skip: true); + + test('sink test', () { + final input = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + .codeUnits; + final output = "3f45ef194732c2dbb2c4a2c769795fa3"; + final sink = ripemd128.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/ripemd160_test.dart b/hashlib/test/ripemd160_test.dart new file mode 100644 index 0000000..5155f2b --- /dev/null +++ b/hashlib/test/ripemd160_test.dart @@ -0,0 +1,84 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('RIPEMD-160 test', () { + test('with empty string', () { + var m = ""; + var r = "9c1185a5c5e9fc54612808977ee8f548b2258d31"; + expect(ripemd160sum(m), r); + }); + test('with long string 1', () { + var m = "The quick brown fox jumps over the lazy dog"; + var r = "37f332f68db77bd9d7edd4969571ad671cf9dd3b"; + expect(ripemd160sum(m), r); + }); + test('with long string 2', () { + var m = "The quick brown fox jumps over the lazy cog"; + var r = "132072df690933835eb8b6ad0b77e7b6f14acad7"; + expect(ripemd160sum(m), r); + }); + test('with defined cases', () { + var m = [ + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "1234567890123456789012345678901234567890123456789012345678901234" + "5678901234567890", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + ]; + var r = [ + "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", + "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", + "5d0689ef49d2fae572b881b123a85ffa21595f36", + "f71c27109c692c1b56bbdceb5b9d2865b3708dbc", + "12a053384a9c0c88e405a06c27dcf49ada62eb2b", + "b0e20b6e3116640286ed3a87a5713079b21f5189", + "9b752e45573d4b39f4dbd3323cab82bf63326bfb", + "1f931a136bf9f411832ab15bd11a8953111febef", + "53875380569546ee9738f5a59fdea9db521cb9ce", + ]; + for (var i = 0; i < m.length; ++i) { + expect(ripemd160sum(m[i]), r[i]); + } + }); + test('with a millian "a"', () { + var m = List.filled(1000000, 'a'.codeUnitAt(0)); + var r = '52783243c1697bdbe16d37f97f68f08325dc1528'; + expect(ripemd160.convert(m).hex(), r); + }, skip: true); + test('string: "Hello, world!"', () { + var m = "Hello, world!"; + var r = "58262d1fbdbe4530d8865d3518c6d6e41002610f"; + expect(ripemd160sum(m), r); + }); + + test('sink test', () { + final input = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + .codeUnits; + final output = "9b752e45573d4b39f4dbd3323cab82bf63326bfb"; + final sink = ripemd160.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/ripemd256_test.dart b/hashlib/test/ripemd256_test.dart new file mode 100644 index 0000000..3db185e --- /dev/null +++ b/hashlib/test/ripemd256_test.dart @@ -0,0 +1,68 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('RIPEMD-256 test', () { + test('with defined cases', () { + var m = [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "1234567890123456789012345678901234567890123456789012345678901234" + "5678901234567890", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + ]; + var r = [ + "02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d", + "f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925", + "afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65", + "87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e", + "649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133", + "3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f", + "5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8", + "06fdcc7a409548aaf91368c06a6275b553e3f099bf0ea4edfd6778df89a890dd", + "03d951c62461ff80f687d64d29f0a4af554b50fa4373782f0d8170fb579a04c2", + "ae09a84230167ebce8a512f37afe8cf46a572537ca026c74be1f94c8bda074e4", + ]; + for (var i = 0; i < m.length; ++i) { + expect(ripemd256sum(m[i]), r[i]); + } + }); + test('with a millian "a"', () { + var m = List.filled(1000000, 'a'.codeUnitAt(0)); + var r = "ac953744e10e31514c150d4d8d7b6773" + "42e33399788296e43ae4850ce4f97978"; + expect(ripemd256.convert(m).hex(), r); + }, skip: true); + + test('sink test', () { + final input = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + .codeUnits; + final output = + "06fdcc7a409548aaf91368c06a6275b553e3f099bf0ea4edfd6778df89a890dd"; + final sink = ripemd256.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/ripemd320_test.dart b/hashlib/test/ripemd320_test.dart new file mode 100644 index 0000000..bcceeff --- /dev/null +++ b/hashlib/test/ripemd320_test.dart @@ -0,0 +1,68 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('RIPEMD-320 test', () { + test('with defined cases', () { + var m = [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "1234567890123456789012345678901234567890123456789012345678901234" + "5678901234567890", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678901", + ]; + var r = [ + "22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8", + "ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d", + "de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d", + "3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197", + "cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009", + "d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac", + "ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4", + "557888af5f6d8ed62ab66945c6d2a0a47ecd5341e915eb8fea1d0524955f825dc717e4a008ab2d42", + "6904accd706958e5a3945d41229c6d043a80d3524a04e1fe9f9570b64ab1d91629b31c40a76d2ca6", + "44723549cc506a8e0782494e87d510837225c493185b4c4a630b807d5e40e73038aa5923f3c3309e", + ]; + for (var i = 0; i < m.length; ++i) { + expect(ripemd320sum(m[i]), r[i]); + } + }); + test('with a millian "a"', () { + var m = List.filled(1000000, 'a'.codeUnitAt(0)); + var r = "bdee37f4371e20646b8b0d862dda16292ae36f4" + "0965e8c8509e63d1dbddecc503e2b63eb9245bb66"; + expect(ripemd320.convert(m).hex(), r); + }, skip: true); + + test('sink test', () { + final input = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + .codeUnits; + final output = + "557888af5f6d8ed62ab66945c6d2a0a47ecd5341e915eb8fea1d0524955f825dc717e4a008ab2d42"; + final sink = ripemd320.createSink(); + expect(sink.closed, isFalse); + for (int i = 0; i < input.length; i += 48) { + sink.add(input.skip(i).take(48).toList()); + } + expect(sink.digest().hex(), equals(output)); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + sink.reset(); + sink.add(input); + sink.close(); + expect(sink.closed, isTrue); + expect(sink.digest().hex(), equals(output)); + }); + }); +} diff --git a/hashlib/test/scrypt_test.dart b/hashlib/test/scrypt_test.dart new file mode 100644 index 0000000..6c18dca --- /dev/null +++ b/hashlib/test/scrypt_test.dart @@ -0,0 +1,268 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('scrypt test', () { + test("with empty password and empty salt and r=1", () { + var hash = scrypt( + [], + [], + N: 16, + r: 1, + p: 1, + dklen: 64, + ); + var matcher = + '77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442' + 'fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906'; + expect(hash.hex(), matcher); + }); + + test("with empty password and empty salt and r=2", () { + var hash = scrypt( + [], + [], + N: 16, + r: 2, + p: 1, + dklen: 64, + ); + var matcher = + '5517696d05d1df94fb42f067d9fcdb14d9effe8ac37500957e1b6f1d383ea029' + '61accf2409bba1ae87c94c6fc69f9b32393eea0b877eb7803c2f151a888acdb6'; + expect(hash.hex(), matcher); + }); + + test("with empty password and empty salt and p=2", () { + var hash = scrypt( + [], + [], + N: 16, + r: 1, + p: 2, + dklen: 64, + ); + var matcher = + '7e0ce022d41610408361d487a4962d0b39f8172397d62e911108b5ad4adb3dc7' + 'faf817f593b6b83cc42b040d975d564ce1fdb2c432e7cbe8cdcaa5a0ad6bf647'; + expect(hash.hex(), matcher); + }); + + test("with empty password and 'salt'", () { + var hash = scrypt( + [], + "salt".codeUnits, + N: 16, + r: 1, + p: 1, + dklen: 64, + ); + var matcher = + 'eec80a460eeaab62fe1630b19497e7ba6a1ff85f50807b9cfe52a9f192e5b60c' + 'b73563d28e4cb148ba301a2271de3682b88c4677caa2e061d2d0e29990cd4e09'; + expect(hash.hex(), matcher); + }); + + test("with 'password' and empty salt", () { + var hash = scrypt( + "password".codeUnits, + [], + N: 16, + r: 1, + p: 1, + dklen: 64, + ); + var matcher = + 'd33c6ec1818daaf728f55afadfeaa558b38efa81305b3521a7f12f4be097e84d' + '184092d2a2e93bf71fd1efe052710f66b956ce45da43aa9099de7406d3a05e2a'; + expect(hash.hex(), matcher); + }); + + test("with empty 'passwd' and 'salt'", () { + var hash = scrypt( + "passwd".codeUnits, + "salt".codeUnits, + N: 16, + r: 1, + p: 1, + dklen: 64, + ); + var matcher = + 'd1635540c8e908f949eaf651eef261cd38e73e0c5c0fe1673e21d72442edb957' + '7bcaa47ea345a789ec687efd4c21224c7cc9fd892954c40df024bf44d6b8bf2a'; + expect(hash.hex(), matcher); + }); + + test("with a long key length", () { + var hash = scrypt( + "a test key".codeUnits, + "some salt".codeUnits, + N: 16, + r: 8, + p: 2, + dklen: 256, + ); + var matcher = '9ddb1ba07f1973893a3f2629c23449b4ab189eef07a3a8b521cd129' + 'ee43cb39067ce849085311849736159ec828d09b0f8f423051dddfb85835730eb' + '455af9a27a46f198d301e5f6ad678c0ec7c3559bf390887563e951d1070f1613f' + '8f68eeb565196bf8896a948e183af3e10127e098230e86870c3b6b62f43a7ac9f' + '9078619d93c4dadffb4d198bccd9676eb979102b48ccd6ab6f31ce6f4e1cf420e' + 'cfc6f4840fc30eebd6223dfeed1aa95637c6d594386317885e2b2817e6e88b502' + 'd7d9896b01877c97791d0e5ca6e7d9982b59a7655710f343713e2bc2259624792' + '795bdc9cef22b805c36d15102b1eda1d62f766b02579ef74fb4488faa91973a2a00'; + expect(hash.hex(), matcher); + }); + + test("with long r and p parameters", () { + var hash = scrypt( + "a test key".codeUnits, + "some salt".codeUnits, + N: 16, + r: 28, + p: 22, + dklen: 128, + ); + var matcher = '48a2b70cc60f0608775f6616167492381f1a6673c4422fe76f3197c8' + '45d35844fee961ef7cf5783bb2b5a84883423e766be1224f2435bdc738245a0d025' + '2a3626a73e1548f3807b4a8fe39b779deedf200deb593d078f2e98e989b90030ab3' + '9938bf52fa291683fd8ebaa1abbfedee33a2df7b3cf1b000e5b8634097990c7ce4'; + expect(hash.hex(), matcher); + }); + + test("with random N, r, p", () { + var hash = scrypt( + "a test key".codeUnits, + "some salt".codeUnits, + N: 128, + r: 81, + p: 49, + dklen: 120, + ); + var matcher = '183944033aa4a4fc92c783b6d40236220a1985ddbed2e6b29abb5d382' + 'aecfac52e992d3eb779f7573c66f563d4365e8dae680ecdb59a017af70ed30f398a' + 'f4fd0a0cb3bf9c9dc04e3f177936249ac87d619ed41b6b05d2d6dfe95d32153338b' + 'c03c4b68fd46e13c9c0e7f7946ee6856cf068f1702e2fbd98'; + expect(hash.hex(), matcher); + }); + + test("with security", () { + var hash = scrypt( + [], + [], + security: ScryptSecurity.test, + ); + var matcher = + '5517696d05d1df94fb42f067d9fcdb14d9effe8ac37500957e1b6f1d383ea029' + '61accf2409bba1ae87c94c6fc69f9b32393eea0b877eb7803c2f151a888acdb6'; + expect(hash.hex(), matcher); + }); + + test("with security overrides", () { + var hash = scrypt( + [], + [], + security: ScryptSecurity.test, + r: 1, + ); + var matcher = + '77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442' + 'fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906'; + expect(hash.hex(), matcher); + }); + }); + + group('Scrypt Factory Tests', () { + test("with security", () { + var hash = Scrypt.fromSecurity(ScryptSecurity.test, salt: []); + var matcher = + '5517696d05d1df94fb42f067d9fcdb14d9effe8ac37500957e1b6f1d383ea029' + '61accf2409bba1ae87c94c6fc69f9b32393eea0b877eb7803c2f151a888acdb6'; + expect(hash.convert([]).hex(), matcher); + }); + + test('throws if cost is less than 1', () { + expect( + () => Scrypt(cost: 0), + throwsA(isA().having( + (e) => e.message, 'message', 'The cost must be at least 1')), + ); + }); + + test('throws if cost is greater than 2^24', () { + expect( + () => Scrypt(cost: 0x1000000), + throwsA(isA().having( + (e) => e.message, 'message', 'The cost must be less than 2^24')), + ); + }); + + test('throws if cost is not a power of 2', () { + expect( + () => Scrypt(cost: 5), + throwsA(isA().having( + (e) => e.message, 'message', 'The cost must be a power of 2')), + ); + }); + + test('throws if derivedKeyLength is less than 1', () { + expect( + () => Scrypt(cost: 2, derivedKeyLength: 0), + throwsA(isA().having((e) => e.message, 'message', + 'The derivedKeyLength must be at least 1')), + ); + }); + + test('throws if blockSize is less than 1', () { + expect( + () => Scrypt(cost: 2, blockSize: 0), + throwsA(isA().having( + (e) => e.message, 'message', 'The blockSize must be at least 1')), + ); + }); + + test('throws if parallelism is less than 1', () { + expect( + () => Scrypt(cost: 2, parallelism: 0), + throwsA(isA().having( + (e) => e.message, 'message', 'The parallelism must be at least 1')), + ); + }); + + test('throws if blockSize * parallelism is too big', () { + expect( + () => Scrypt(cost: 2, blockSize: 0x2000000, parallelism: 1), + throwsA(isA().having((e) => e.message, 'message', + 'The blockSize * parallelism is too big')), + ); + }); + + test('uses provided salt if not null', () { + var salt = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + var scrypt = Scrypt(cost: 2, salt: salt); + expect(scrypt.salt, equals(salt)); + }); + + test('generates a random salt if salt is null', () { + var scrypt = Scrypt(cost: 2); + expect(scrypt.salt.length, 16); + }); + + test('creates an instance with valid parameters', () { + var salt = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + var scrypt = Scrypt( + cost: 2, + salt: salt, + blockSize: 8, + parallelism: 1, + derivedKeyLength: 64); + expect(scrypt.salt, equals(salt)); + expect(scrypt.cost, equals(2)); + expect(scrypt.blockSize, equals(8)); + expect(scrypt.parallelism, equals(1)); + expect(scrypt.derivedKeyLength, equals(64)); + }); + }); +} diff --git a/hashlib/test/sha1_test.dart b/hashlib/test/sha1_test.dart new file mode 100644 index 0000000..2704a13 --- /dev/null +++ b/hashlib/test/sha1_test.dart @@ -0,0 +1,76 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "a": "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", + "abc": "a9993e364706816aba3e25717850c26c9cd0d89d", + "123": "40bd001563085fc35165329ea1ff5c5ecbdbbeef", + "test": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + 'message': "6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d", + "Hello World": "0a4d55a8d778e5022fab701977c5d840bbc486d0", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "761c457bf73b14d27e9e9265c46f4b4dda11f940", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "50abf5706a150990a08b2c5ea40fa0e585554732", + "The quick brown fox jumps over the lazy dog": + "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12", + "The quick brown fox jumps over the lazy cog": + "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "84983e441c3bd26ebaae4aa1f95129e5e54670f1", + List.filled(512, "a").join(): "164557facb73929875168c1e92caf09bb6064564", + List.filled(128, "a").join(): "ad5b3fdbcb526778c2839d2f151ea753995e26a0", + List.filled(513, "a").join(): "87ecd7233dbe9d7543a9a199fc671a90e469873d", + List.filled(511, "a").join(): "b9370eafb7ac772c6c1dc6b88ac9ad466b880ea1", + List.filled(1000000, "a").join(): "34aa973cd4c4daa4f61eeb2bdbad27316534016f", +}; + +void main() { + group('SHA1 test', () { + test('with empty string', () { + expect(sha1sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha1sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha1sum("abc"), tests["abc"]); + }); + + test('with longest string', () { + var last = tests.entries.last; + expect(sha1sum(last.key), last.value); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha1sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha1sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha1.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha224_test.dart b/hashlib/test/sha224_test.dart new file mode 100644 index 0000000..ffa3cf0 --- /dev/null +++ b/hashlib/test/sha224_test.dart @@ -0,0 +1,72 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", + "a": "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5", + "abc": "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e", + "The quick brown fox jumps over the lazy dog": + "730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525", + "The quick brown fox jumps over the lazy cog": + "fee755f44a55f20fb3362cdc3c493615b3cb574ed95ce610ee5b1e9b", + List.filled(512, "a").join(): + "e926c6b764d4b216c99067c92f838ca1c5793c13c782d9ef7b668d71", + List.filled(128, "a").join(): + "39873a2441c56608137850f4c54dde157710b9a2b83c8bdc756dd643", + List.filled(513, "a").join(): + "e0afca6342847c80827fdc511f0004e53239d3c2f82f67ddd8185bef", + List.filled(511, "a").join(): + "6eb1c24577241c0871ec3ab020786f59cecb2edb6acef2d483051d6a", + List.filled(1000000, "a").join(): + "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67", +}; + +void main() { + group('SHA224 test', () { + test('with empty string', () { + expect(sha224sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha224sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha224sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha224sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha224sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha224.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha256_test.dart b/hashlib/test/sha256_test.dart new file mode 100644 index 0000000..82094c2 --- /dev/null +++ b/hashlib/test/sha256_test.dart @@ -0,0 +1,72 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "a": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb", + "abc": "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e", + "The quick brown fox jumps over the lazy dog": + "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592", + "The quick brown fox jumps over the lazy cog": + "e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be", + List.filled(512, "a").join(): + "471be6558b665e4f6dd49f1184814d1491b0315d466beea768c153cc5500c836", + List.filled(128, "a").join(): + "6836cf13bac400e9105071cd6af47084dfacad4e5e302c94bfed24e013afb73e", + List.filled(513, "a").join(): + "02425c0f5b0dabf3d2b9115f3f7723a02ad8bcfb1534a0d231614fd42b8188f6", + List.filled(511, "a").join(): + "058fc5084b6355a06099bfef3de8e360344046dc5a47026de47470b9aabb5bfd", + List.filled(1000000, "a").join(): + "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", +}; + +void main() { + group('SHA256 test', () { + test('with empty string', () { + expect(sha256sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha256sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha256sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha256sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha256sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha256.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha384_test.dart b/hashlib/test/sha384_test.dart new file mode 100644 index 0000000..88614f3 --- /dev/null +++ b/hashlib/test/sha384_test.dart @@ -0,0 +1,79 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c" + "0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", + "a": "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce" + "9cd697e85175033caa88e6d57bc35efae0b5afd3145f31", + "abc": "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a" + "8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe" + "8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b", + "The quick brown fox jumps over the lazy dog": + "ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c4940" + "11e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1", + "The quick brown fox jumps over the lazy cog": + "098cea620b0978caa5f0befba6ddcf22764bea977e1c70b348" + "3edfdf1de25f4b40d6cea3cadf00f809d422feb1f0161b", + List.filled(512, "a").join(): + "e685ba7acf4eedd1742f2a97c845e7825982d840623525e491" + "40680fdde0f2631e5fce9dfcfb42ba7b27c9eb35a62b87", + List.filled(128, "a").join(): + "edb12730a366098b3b2beac75a3bef1b0969b15c48e2163c23" + "d96994f8d1bef760c7e27f3c464d3829f56c0d53808b0b", + List.filled(513, "a").join(): + "c3f1d47c5dad5c3b8cc1242da14220af7f9036acf98369be3c" + "c102b069476a9b3e50b9a131756396c8c267dce06a35f0", + List.filled(511, "a").join(): + "db100a1eed3842c61d73064b62543cd4531dafa8bfecf6f27d" + "cfdebbaf60ea14563ea1b486e4f6b9a14fcb0dac05c5f2", + List.filled(1000000, "a").join(): + "9d0e1809716474cb086e834e310a4a1ced149e9c00f2485279" + "72cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985", +}; + +void main() { + group('SHA384 test', () { + test('with empty string', () { + expect(sha384sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha384sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha384sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha384sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha384sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha384.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha3_test.dart b/hashlib/test/sha3_test.dart new file mode 100644 index 0000000..c6bb8ab --- /dev/null +++ b/hashlib/test/sha3_test.dart @@ -0,0 +1,83 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('SHA3 test', () { + test('name', () { + expect(sha3_224.name, 'SHA3-224'); + expect(sha3_256.name, 'SHA3-256'); + expect(sha3_384.name, 'SHA3-384'); + expect(sha3_512.name, 'SHA3-512'); + }); + + test('SHA3-224 with empty string', () { + expect(sha3_224sum(""), + "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7"); + }); + + test('SHA3-384 with exact block size', () { + final input = + "e35780eb9799ad4c77535d4ddb683cf33ef367715327cf4c4a58ed9cbdcdd486" + "f669f80189d549a9364fa82a51a52654ec721bb3aab95dceb4a86a6afa93826d" + "b923517e928f33e3fba850d45660ef83b9876accafa2a9987a254b137c6e140a" + "21691e1069413848"; + final output = + "d1c0fa85c8d183beff99ad9d752b263e286b477f79f0710b0103170173978133" + "44b99daf3bb7b1bc5e8d722bac85943a"; + expect(sha3_384.convert(fromHex(input)).hex(), output); + final encoded = String.fromCharCodes(fromHex(input)); + expect(sha3_384sum(encoded), output); + }); + + test('SHA3-256 with short message', () { + final input = + "9f2fcc7c90de090d6b87cd7e9718c1ea6cb21118fc2d5de9f97e5db6ac1e9c10"; + final output = + "2f1a5f7159e34ea19cddc70ebf9b81f1a66db40615d7ead3cc1f1b954d82a3af"; + expect(sha3_256.convert(fromHex(input)).hex(), output); + }); + + test('SHA3-512 with multi block size', () { + final input = + "3a3a819c48efde2ad914fbf00e18ab6bc4f14513ab27d0c178a188b61431e7f5" + "623cb66b23346775d386b50e982c493adbbfc54b9a3cd383382336a1a0b2150a" + "15358f336d03ae18f666c7573d55c4fd181c29e6ccfde63ea35f0adf5885cfc0" + "a3d84a2b2e4dd24496db789e663170cef74798aa1bbcd4574ea0bba40489d764" + "b2f83aadc66b148b4a0cd95246c127d5871c4f11418690a5ddf01246a0c80a43" + "c70088b6183639dcfda4125bd113a8f49ee23ed306faac576c3fb0c1e256671d" + "817fc2534a52f5b439f72e424de376f4c565cca82307dd9ef76da5b7c4eb7e08" + "5172e328807c02d011ffbf33785378d79dc266f6a5be6bb0e4a92eceebaeb1"; + final output = + "6e8b8bd195bdd560689af2348bdc74ab7cd05ed8b9a57711e9be71e9726fda45" + "91fee12205edacaf82ffbbaf16dff9e702a708862080166c2ff6ba379bc7ffc2"; + expect(sha3_512.convert(fromHex(input)).hex(), output); + final encoded = String.fromCharCodes(fromHex(input)); + expect(sha3_512sum(encoded), output); + }); + + test('SHA3-256 with "a"', () { + final input = "a"; + final output = + "80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b"; + expect(sha3_256sum(input), output); + }); + + test('SHA3-256 with "abc"', () { + final input = "abc"; + final output = + "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532"; + expect(sha3_256sum(input), output); + }); + + test('SHA3-256 with long arbitrary string', () { + final input = "A quick brown fox jumps over the lazy dog"; + final output = + "2baa15b5a204f74ae708d588793657a70cda2288a06e7e12c918cc3aedc5cd8d"; + expect(sha3_256sum(input), output); + }); + }); +} diff --git a/hashlib/test/sha512_224_test.dart b/hashlib/test/sha512_224_test.dart new file mode 100644 index 0000000..a290861 --- /dev/null +++ b/hashlib/test/sha512_224_test.dart @@ -0,0 +1,77 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4", + "a": "d5cdb9ccc769a5121d4175f2bfdd13d6310e0d3d361ea75d82108327", + "abc": "4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "e5302d6d54bb242275d1e7622d68df6eb02dedd13f564c13dbda2174", + "The quick brown fox jumps over the lazy dog": + "944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37", + "The quick brown fox jumps over the lazy cog": + "2b9d6565a7e40f780ba8ab7c8dcf41e3ed3b77997f4c55aa987eede5", + List.filled(512, "a").join(): + "057bab73fa47ac3e597a34d02c1e285e2d5d8a2e90c9079f549b4af6", + List.filled(128, "a").join(): + "261b94bcba554264b3b738e9e09e7dc68ac8e0b4c8517fe9bb7c3617", + List.filled(513, "a").join(): + "502ec9656e1e0b96f9a2699c04cec265edc690b729c45037c6b37a00", + List.filled(511, "a").join(): + "bd0452a57045c857de05b1c1d94fb49624b00ceaf0ec4c0d4d656a89", + List.filled(1000000, "a").join(): + "37ab331d76f0d36de422bd0edeb22a28accd487b7a8453ae965dd287", + List.filled(112, "a").join(): + "79b41fef2a0439d2705724a67615f7bcbcd2bf5664a7774b80818eb6", +}; + +void main() { + group('SHA512224 test', () { + test('with empty string', () { + expect(sha512t224sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha512t224sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha512t224sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha512t224sum(key), value); + }); + + test('known cases', () { + tests.forEach((key, value) { + // print(toHex(crypto.sha512224.convert(toBytes(key)).bytes)); + expect(sha512t224sum(key), value); + }); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha512t224sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha512t224.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha512_256_test.dart b/hashlib/test/sha512_256_test.dart new file mode 100644 index 0000000..b120689 --- /dev/null +++ b/hashlib/test/sha512_256_test.dart @@ -0,0 +1,77 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a", + "a": "455e518824bc0601f9fb858ff5c37d417d67c2f8e0df2babe4808858aea830f8", + "abc": "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "bde8e1f9f19bb9fd3406c90ec6bc47bd36d8ada9f11880dbc8a22a7078b6a461", + "The quick brown fox jumps over the lazy dog": + "dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d", + "The quick brown fox jumps over the lazy cog": + "cc8d255a7f2f38fd50388fd1f65ea7910835c5c1e73da46fba01ea50d5dd76fb", + List.filled(512, "a").join(): + "092b65b92e80ccf4c66683684fb02da4567160534abede190e9b2edef6156839", + List.filled(128, "a").join(): + "b88f97e274f9c1d49f181c8cbd01a9c74930ad055a46ac4499a1d601f1c80bf2", + List.filled(513, "a").join(): + "a59cf33e5ad3e70d4962adbb833d021eafa48f85dd9788f84fca4cf762c5f1c7", + List.filled(511, "a").join(): + "7e627ccc0719192627fcf9f3987d3da9a61f261a09580371e1ea4622b8ccfcc8", + List.filled(1000000, "a").join(): + "9a59a052930187a97038cae692f30708aa6491923ef5194394dc68d56c74fb21", + List.filled(112, "a").join(): + "9216b5303edb66504570bee90e48ea5beaa5e9fe9f760bbd3e0460559fc005f6", +}; + +void main() { + group('SHA512256 test', () { + test('with empty string', () { + expect(sha512t256sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha512t256sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha512t256sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha512t256sum(key), value); + }); + + test('known cases', () { + tests.forEach((key, value) { + // print(toHex(crypto.sha512256.convert(toBytes(key)).bytes)); + expect(sha512t256sum(key), value); + }); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha512t256sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha512t256.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/sha512_test.dart b/hashlib/test/sha512_test.dart new file mode 100644 index 0000000..eb73529 --- /dev/null +++ b/hashlib/test/sha512_test.dart @@ -0,0 +1,82 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:math'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +final tests = { + "": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" + "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + "a": "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f53" + "02860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75", + "abc": "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": + "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c335" + "96fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445", + "The quick brown fox jumps over the lazy dog": + "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64" + "2e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6", + "The quick brown fox jumps over the lazy cog": + "3eeee1d0e11733ef152a6c29503b3ae20c4f1f3cda4cb26f1bc1a41f91c7fe4a" + "b3bd86494049e201c4bd5155f31ecb7a3c8606843c4cc8dfcab7da11c8ae5045", + List.filled(512, "a").join(): + "0210d27bcbe05c2156627c5f136ade1338ab98e06a4591a00b0bcaa61662a593" + "1d0b3bd41a67b5c140627923f5f6307669eb508d8db38b2a8cd41aebd783394b", + List.filled(128, "a").join(): + "b73d1929aa615934e61a871596b3f3b33359f42b8175602e89f7e06e5f658a24" + "3667807ed300314b95cacdd579f3e33abdfbe351909519a846d465c59582f321", + List.filled(513, "a").join(): + "ebfd31a4fae71ce18d1df9c4c8cfa9803d8390fc3ef3c122c3ddf4015af96abd" + "90ffc16f3f0ef66ffd28295603250407402e68a0cc0bcd5f38b9557717ea3d39", + List.filled(511, "a").join(): + "fe32a1f497ce532d041889133436c7086ea40410af5728a6b958aa4a169de44e" + "3884311461188be5f65e79b9a53d010d8347ac20118e4e05df787a17ba71204b", + List.filled(1000000, "a").join(): + "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb" + "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b", + List.filled(112, "a").join(): + "c01d080efd492776a1c43bd23dd99d0a2e626d481e16782e75d54c2503b5dc32" + "bd05f0f1ba33e568b88fd2d970929b719ecbb152f58f130a407c8830604b70ca", +}; + +void main() { + group('SHA512 test', () { + test('with empty string', () { + expect(sha512sum(""), tests[""]); + }); + + test('with single letter', () { + expect(sha512sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sha512sum("abc"), tests["abc"]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sha512sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sha512sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sha512.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/shake_test.dart b/hashlib/test/shake_test.dart new file mode 100644 index 0000000..3d8fe6f --- /dev/null +++ b/hashlib/test/shake_test.dart @@ -0,0 +1,145 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; +import 'dart:async'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +void main() { + group('SHAKE test', () { + test("Shake128 name", () { + expect(Shake128(8).name, 'SHAKE-128/64'); + expect(shake128.of(4).name, 'SHAKE-128/32'); + expect(shake128_128.name, 'SHAKE-128/128'); + expect(shake128_160.name, 'SHAKE-128/160'); + expect(shake128_224.name, 'SHAKE-128/224'); + expect(shake128_256.name, 'SHAKE-128/256'); + expect(shake128_384.name, 'SHAKE-128/384'); + expect(shake128_512.name, 'SHAKE-128/512'); + }); + + test("Shake256 name", () { + expect(Shake256(8).name, 'SHAKE-256/64'); + expect(shake256.of(4).name, 'SHAKE-256/32'); + expect(shake256_128.name, 'SHAKE-256/128'); + expect(shake256_160.name, 'SHAKE-256/160'); + expect(shake256_224.name, 'SHAKE-256/224'); + expect(shake256_256.name, 'SHAKE-256/256'); + expect(shake256_384.name, 'SHAKE-256/384'); + expect(shake256_512.name, 'SHAKE-256/512'); + }); + + test('SHAKE-128 with empty message', () { + expect( + shake128.of(512).convert([]).hex().substring((512 - 32) * 2), + "43e41b45a653f2a5c4492c1add544512dda2529833462b71a41a45be97290b6f", + ); + }); + + test('shake128sum', () { + expect( + shake128sum('a test message', 32), + "763cd3748d2c24843f8f1c9b1ae78514f10e1e9a964e81e1295609fc81c936e0", + ); + }); + + test('shake128sum with encoding', () { + expect( + shake128sum('a test message', 32, utf8, true), + "763CD3748D2C24843F8F1C9B1AE78514F10E1E9A964E81E1295609FC81C936E0", + ); + }); + + test('SHAKE-128 with some message', () { + var inp = 'a test message'.codeUnits; + expect( + shake128.of(128).convert(inp).hex(), + "763cd3748d2c24843f8f1c9b1ae78514f10e1e9a964e81e1295609fc81c936e0" + "55b4b59405ad0509a27e80273f8219ee4fb25e77f3ca75994fbe1c0753014575" + "6364ae785175d206393eb5808166fdee95f80256c0ec53ebd1ffba21f56f0603" + "c01b0d0842977a4570612a5f184e39d60a59d605b281810a9fb2c387e5beacfe", + ); + }); + + test('SHAKE-128 with 1600-bit message', () async { + final sc = StreamController>(); + final digest = shake128.of(512).bind(sc.stream); + final buf = List.filled(20, 0xA3); + for (int i = 0; i < 200; i += 20) { + sc.sink.add(buf); + } + sc.close(); + final out = await digest.first; + expect( + out.hex().substring((512 - 32) * 2), + "44c9fb359fd56ac0a9a75a743cff6862f17d7259ab075216c0699511643b6439", + ); + }); + + test('shake256sum', () { + expect( + shake256sum('a test message', 32), + "06cd8095b01a33a20e67c1c265af4079a8b861687d6e87e447861c4221dbe83d", + ); + }); + + test('shake256sum with encoding', () { + expect( + shake256sum('a test message', 32, utf8, true), + "06CD8095B01A33A20E67C1C265AF4079A8B861687D6E87E447861C4221DBE83D", + ); + }); + + test('SHAKE-256 with some message', () { + var inp = 'a test message'.codeUnits; + expect( + shake256.of(128).convert(inp).hex(), + "06cd8095b01a33a20e67c1c265af4079a8b861687d6e87e447861c4221dbe83d" + "e9c36540e3e4b9b7f75f84e1d8fc57451d2fca0b052691d4cb448e0fe2132419" + "3feb52911aeedb57093d07b3ba128508271de6554cc651415e5af3f1b4d09d53" + "7e87b0b7685031e09a848d60ff6a86c5f9f5a5b5a3070ce677b949264f6b4046", + ); + }); + + test('SHAKE-256 with empty message', () { + expect( + shake256.of(512).convert([]).hex().substring((512 - 32) * 2), + "ab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a", + ); + }); + + test('SHAKE-256 with 1600-bit message', () async { + final sc = StreamController>(); + final digest = shake256.of(512).bind(sc.stream); + final buf = List.filled(20, 0xA3); + for (int i = 0; i < 200; i += 20) { + sc.sink.add(buf); + } + sc.close(); + final out = await digest.first; + expect(out.hex().substring((512 - 32) * 2), + "6a1a9d7846436e4dca5728b6f760eef0ca92bf0be5615e96959d767197a0beeb"); + }); + + test('SHAKE-128 generator', () { + var original = shake128.of(1024).convert([]).bytes; + expect(shake128generator().take(1024), equals(original)); + }); + test('SHAKE-256 generator', () { + var original = shake256.of(1024).convert([]).bytes; + expect(shake256generator().take(1024), equals(original)); + }); + test('SHAKE-128 generator with seed', () { + var seed = '012345678910111213141516171819'.codeUnits; + var original = shake128.of(1024).convert(seed).bytes; + expect(shake128generator(seed).take(1024), equals(original)); + }); + test('SHAKE-256 generator with seed', () { + var seed = '012345678910111213141516171819'.codeUnits; + var original = shake256.of(1024).convert(seed).bytes; + expect(shake256generator(seed).take(1024), equals(original)); + }); + }); +} diff --git a/hashlib/test/sm3_test.dart b/hashlib/test/sm3_test.dart new file mode 100644 index 0000000..8c401cc --- /dev/null +++ b/hashlib/test/sm3_test.dart @@ -0,0 +1,93 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; +import 'package:pointycastle/digests/sm3.dart' as pc_sm3; + +final tests = { + "": "1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b", + "a": "623476ac18f65a2909e43c7fec61b49c7e764a91a18ccb82f1917a29c86c5e88", + "abc": "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", + "message digest": + "c522a942e89bd80d97dd666e7a5531b36188c9817149e9b258dfe51ece98ed77", + "abcdefghijklmnopqrstuvwxyz": + "b80fe97a4da24afc277564f66a359ef440462ad28dcc6d63adb24d5c20a61595", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789": + "2971d10c8842b70c979e55063480c50bacffd90e98e2e60d2512ab8abfdfcec5", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890": + "ad81805321f3e69d251235bf886a564844873b56dd7dde400f055b7dde39307a", + "123": "6e0f9e14344c5406a0cf5a3b4dfb665f87f4a771a31f7edbb5c72874a32b2957", + "test": "55e12e91650d2fec56ec74e1d3e4ddbfce2ef3a65890c2a19ecf88a307e76a23", + 'message': "1756ac517f85ffda751dcdebf3c89575272fc56904f9baad983ec44c36feac7b", + "Hello World": + "77015816143ee627f4fa410b6dad2bdb9fcbdf1e061a452a686b8711a484c5d7", + List.filled(512, "a").join(): + "d2219631eeb014040abf9716ebba9b35aaba4ecc2065088df0a2cbd0db1b9ce9", + List.filled(128, "a").join(): + "5fd947effbe82a5925faaee9123d43cea200cc257b28ed797505694b4bb020f6", + List.filled(513, "a").join(): + "97baef04b5211a439b17eb067ad904e52b12058d7510669ad29b63b9d4609479", + List.filled(511, "a").join(): + "5f4141700026fec7880a6d1d5f34dcc9253dea2df32928f71bc93860d675b38c", + List.filled(1000000, "a").join(): + "c8aaf89429554029e231941a2acc0ad61ff2a5acd8fadd25847a3a732b3b02c3", +}; + +void main() { + group('SM3 test', () { + test('with empty string', () { + expect(sm3sum(""), tests[""]); + }); + + test('with single letter -pc', () { + pc_sm3.SM3Digest().process(Uint8List.fromList("a".codeUnits)); + }); + + test('with single letter', () { + expect(sm3sum("a"), tests["a"]); + }); + + test('with few letters', () { + expect(sm3sum("abc"), tests["abc"]); + }); + + test('with longest string', () { + var last = tests.entries.last; + expect(sm3sum(last.key), last.value); + }); + + test('with special case', () { + var key = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + expect(sm3sum(key), tests[key]); + }); + + test('with string of length 511', () { + var key = tests.keys.firstWhere((x) => x.length == 511); + var value = tests[key]!; + expect(sm3sum(key), value); + }); + + test('with known cases', () { + tests.forEach((key, value) { + expect(sm3sum(key), value); + }); + }); + + test('with stream', () async { + for (final entry in tests.entries) { + final stream = Stream.fromIterable( + List.generate(1 + (entry.key.length >>> 3), (i) => i << 3)) + .map((e) => entry.key.substring(e, min(entry.key.length, e + 8))) + .map((s) => s.codeUnits); + final result = await sm3.bind(stream).first; + expect(result.hex(), entry.value); + } + }); + }); +} diff --git a/hashlib/test/totp_test.dart b/hashlib/test/totp_test.dart new file mode 100644 index 0000000..20d0f47 --- /dev/null +++ b/hashlib/test/totp_test.dart @@ -0,0 +1,112 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:test/test.dart'; +import 'package:hashlib/hashlib.dart'; + +void main() { + final secret = Uint8List.fromList([ + 0x1, + 0x2, + 0x3, + 0x4, + 0x5, + 0x6, + 0x7, + 0x8, + ]); + + group('TOTP', () { + test('algorithm name', () { + expect(TOTP(secret).name, 'SHA1/HMAC'); + expect(TOTP(secret, algo: md5).name, 'MD5/HMAC'); + }); + + test('secret, label and issuer values', () { + var totp = TOTP(secret, label: 'test label', issuer: 'test issuer'); + expect(totp.secret, equals(secret)); + expect(totp.label, equals('test label')); + expect(totp.issuer, equals('test issuer')); + + var totp2 = TOTP(secret); + expect(totp2.secret, equals(secret)); + expect(totp2.label, null); + expect(totp2.issuer, null); + }); + + test('should generate OTP of correct length', () { + expect(TOTP(secret).valueString().length, equals(6)); + }); + + test('number of digits must be at least 4', () { + for (int i = 0; i < 20; ++i) { + int cb() => TOTP(secret, digits: i).valueString().length; + if (i < 4 || i > 15) { + expect(cb, throwsA((e) => e is AssertionError), reason: 'digits: $i'); + } else { + expect(cb(), equals(i), reason: 'digits: $i'); + } + } + }); + + test('should generate different OTPs over time', () { + var totp = TOTP(secret); + int time = 30000 - totp.currentTime % 30000; + totp.adjustClock(time); + int otp1 = totp.value(); + totp.adjustClock(time + 30000); + int otp2 = totp.value(); + expect(otp1, isNot(equals(otp2))); + totp.adjustClock(time + 1); + int otp3 = totp.value(); + expect(otp1, equals(otp3)); + totp.adjustClock(time - 100); + int otp4 = totp.value(); + expect(otp1, isNot(equals(otp4))); + }); + + test('should adjust the clock correctly', () { + var totp1 = TOTP(secret); + var totp2 = TOTP(secret); + totp2.adjustClock(30030); + + int otp1 = totp1.value(); + int otp2 = totp2.value(); + + expect(otp1, isNot(equals(otp2))); + }); + + test('stream should emit OTPs periodically', () async { + int ms = 80; + var totp = TOTP(secret, period: Duration(milliseconds: ms)); + totp.adjustClock(ms - totp.currentTime % ms); + final otps = {}; + var subscription = totp.stream.listen((otp) { + otps.add(otp); + }); + await Future.delayed( + Duration(milliseconds: 4 * ms), + subscription.cancel, + ); + expect(otps.length, inInclusiveRange(2, 6)); + }); + + test('stream should emit OTP string periodically', () async { + int ms = 80; + var totp = TOTP(secret, period: Duration(milliseconds: ms)); + totp.adjustClock(ms - totp.currentTime % ms); + final otps = {}; + var subscription = totp.streamString.listen((otp) { + otps.add(otp); + }); + await Future.delayed( + Duration(milliseconds: 4 * ms), + subscription.cancel, + ); + expect(otps.length, inInclusiveRange(2, 6)); + }); + }); +} diff --git a/hashlib/test/xxh128_test.dart b/hashlib/test/xxh128_test.dart new file mode 100644 index 0000000..eef633f --- /dev/null +++ b/hashlib/test/xxh128_test.dart @@ -0,0 +1,128 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore: library_annotations +@Tags(['vm-only']) + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +const seed = 0x9e3779b185ebca8d; +final cases = fromHex( + '0052929bb732a3242d00af950eecb893e3dfef93aad6cd2a538b5c3f545a6fd559c0fffc8f85b9331dab74f7b6059327b07084b3677c9f76480072ed7b9817e8dd485e0c0ccbd0653fadb28f11b06ce88db0f186086159566c8e4e781363bdab9d327309ea712fd97a9d55f0ca8ad0e95e1a36b36b0fca51ef8ba2c462ed0096f33449eb0fd13b92a1a963dbaaed3dcff10942cdf9b321a2ebf2c8f4e42f48d14b10f4c2efecf84ab53874c3a4a6620ebffd633741e386981aeb4cba56036687ed004559c18544b6c368f941a9eaf987e09f12d0d51454485d444051e338069a4c3c0def6489f8a361eee3c51c9368c8e597d70998ff97a84ceaa479abcd2cc89f1bf2f1cee282503882ad8e9bb8b488818eb636d9a96548743cc9dbfcbbd82a229eb424e2b267abaa13e22a4dfc711c076291bdf8e2975d0c84fd6745671b099a4b20a2773095da28b1863f9ef2e1db10df90f86d912f0678b3485bdff6dbd87ca7aea589404c027320f09fdd637995b103c47e6f2fe022f6d488e9666e9d3519bd411b4f1acfd578b00049f01f8f8df614bcb5946dc45376a7a75391cf8db6166c397e362f06f2231e8e0fc886f476618ef66436fc8c27a1fa12cbfece583f8167886c7dc081e7f8c08e540ec9d9519d219035690a0baca171444b9f45fe9d981f1e1b776c5df1fb7e2c64fe6b571968cddde4d009361a609962d707e64d0986f78e9b2f42d983cba5caad2262757f5b40ef1aafec48756b22b5c405004d2a097d8b8d6ebb5cd4a6b2a10d24acaf16f37f6ebafd0d0791d263f1bb83de41481b7431e2f33f19a750f24e5bae206093d50c7ea5527798ecd52c0d52e75cae0484effbaecdb45cbac8ce982bd0a3a2e6256eb9cc066ab27f56578b4caa09214f4ac3904ba9d00736cf54119e27e39f503f58c294d47188a7814ed78f1e5d21ddc2016d5a1fd194b659885e377d176e8e1655107ccf70eae75029a542e03028a01e3dd559b168737022d33d2a634613aedb1e350598a1dd56f0e3dc62b1cc259122db36fc998c813776d677f3acf44c16a684ffda1082fc1f4f73e87cf5a96829b37fa47b1f2ca010aba85d82adf74eb7130c4d4ef53fa3938892ef424cfc95bfd276c2928f86903b7b845f7b57c9b95af823b3263d411ede092bbddc53138b199ba2f7f58c317390c5a1d3b943706c768efe8fd306f59d84d075dafdc074f24bb42a776fd4be4a472606f04d2c901cde7e083828801606663bfc74e59c926f26ad0e2505451f421ffeba7ef6133be520acebb0b22a31301a6cc0a6a2a5f241299e4819e225c4713a79ddbe1fcf634355761336bf3a3a70026000a7114e675d36640ff0df89c016c657d4701296c94f9bbaacc7572385e1a056f9511a2b18cfd6a773ee01defd63ea25c7ea5473c72a71b3f6a52b7a9819254d77951405cf9d42f6544e4c77ec3648cc47ac94810d108850f7a2d8c1ca827bd7c42d092627fbe6065ee7c61ad70aa64029c0e4211a91b19f4d007edaaae26da8f51308daec116b3396c89a7750e3426221cb8039e5f2f22820431816cf20c5c1650b93711c520b41981eba8507ce90fbdc9b9603c8cfbf4c0d8faa40a096cd43a7b3a48ab29a0a5e812d87b6990b0500e2732bbe8992d1dfe590a30f47d6966ae6558db19630ff3825f357f7bdcae02ec36a4df3ea5f14751d3fabda08062b5934e38fdb9dfbc5181663f17475debd527d867ffaf8a976f9cf383a7fb98ec2e70d4eb288de12a3b47907691cccae0f646d4c57aed99d835f109a33e23703aaa9bc92e9e11dfc6481b926ecd2e10d69f66bfe022fa623138786e4ff702ce1c6111b92815068efd923946d8b57cc99f339129a7cf872394360f16c5489a4d8ee7f9e1911b48b7275ab0076fed358991439a34cea606aff7ed88eab3fc54d0cb5c766083e6b39af5b11e34a100b2750cbc031dcb3047fc2310b0992a47e89d7a09870fed21b8c027d8c948034364907fb973d369c89ddef5590d2e5c907cb41e2f9e36bc43479180c119c397379192347bb3008406509d7e0ce8c874187ee9a6fedd150faceb93ebf7f2dcfc6f15acff65a930def663ab3a6856c54bf61aa380cfc9e97a9aea84d23a732b694759bdf8c602e6d28e9186e27e61d3538996b86de70972e75ce6add5e87f184f6e0f4dfd678a43378b3e62b45c51ebaebaf434ed79e3ac25ef4bb3685e2a0ddf30e311d396e70c7b7ab84a9c4941090badbdc3517a1e0390e7984d4d561536af2729d151b0995cc45a1b60cf02ce3dd789cb620558b83c1c78b8cefd33e2cc21962a3527950a2cefea375b4c86462839d153b551416a17dd0d523f6a29ea4a659fd8b7a9a8e0c8c54580e4765e0fc0512ae82d35b741692f692fd876b6f54aa6fda98f21f1643bb17123127687a44c392e4ea9a5eeb369f38b503db0bcf8ad22560011f91493c881a5f05059819fffe564c0a1c7a873a4994f81745e4bd9279a5ec0a01cffd871f0a0fd161dbb03a02953da066a21f82d83d3a7acfd9f37943aab6e27babe872f474a9953c259a38a29894ba1f46aef1888db89ca84c8ca08bf69c9c6a4450fc821a948056e97da613fb9d38a56dd42e744253f07600406f5362ba041389c5e3b5512d06d72037e0fbdc049441d11b44b495335760aab1ee556efbc876b25439226151d24dcd74bc89a065a4954889938415b7a2e406710f653b9abc5338fb94b16bcda96a7cc8890114dfd603ffa5ea071abb8d720c36f20564b6e4be4315f3528594e9051b46c559a4c13c027c36d95efffe96e11caa567a14e4166f3d902bcd7157005d0eed2efd793e7e008d6c4dac4058ebce9d350a7f6f07f7ecbec4b4c75da6ebae3c229d032ea8a68bce62dd9e045d9e16c8270a1c2c3b481c98f7616edd8872a172095fa012c96b2c8d56f00f6adf517c1b5d89e5f9255ea75b698a5659de7c4b375860d2a3409899661c6b506a9e3fd001c81b62298acf065f2b0080e5cba7cddfc6e6cb44f9c9610cd3588bfc6fd1a91bc9b20dad644703bcb6fc738cbec1d7602227b6da3dac9532f452e490dd6224aca11de17d69b8d16aa323d9cc8cabb41d935f2174dfa063c47b7893d65548ca72d73c1cf543e6d22aac8cf71c7aa8ba9a6bce4aa39085f508d6e6a537a1a61d58af074d', +); +final secret = cases.sublist(7, 7 + 136 + 11); + +String sum([Iterable? data]) { + return xxh128.convert(data?.toList() ?? []).hex(); +} + +String seedsum([Iterable? data]) { + return XXH128().withSeed(seed).convert(data?.toList() ?? []).hex(); +} + +String secretSum([Iterable? data]) { + return XXH128(secret: secret).convert(data?.toList() ?? []).hex(); +} + +void main() { + group('xxh3-128 test', () { + test("xxh128sum", () { + final input = String.fromCharCodes(cases.take(1)); + final output = "a6cd5e9392000f6ac44bdff4074eecdb"; + expect(xxh128sum(input), output); + }); + test("with secret", () { + expect(secretSum(cases.take(6)), '376bd91b6432f36d0b61c8aca7d4778f'); + }); + + test('The secret length must be at least 136', () { + for (int i = 0; i < 136; ++i) { + var instance = xxh3_128.withSecret(Uint8List(i)); + expect(() => instance.convert([2]), throwsArgumentError); + } + }); + + test("with input length = 0", () { + expect(sum(), "99aa06d3014798d86001c324468d497f"); + }); + test("with input length = 0 and a seed", () { + expect(seedsum(), "00feaa732a3ce25ea986dfc5d7605bfe"); + }); + test("with input length = 1", () { + expect(sum(cases.take(1)), "a6cd5e9392000f6ac44bdff4074eecdb"); + }); + test("with input length = 1 and a seed", () { + expect(seedsum(cases.take(1)), "20e49abcc53b3842032be332dd766ef8"); + }); + test("with input length = 6", () { + expect(sum(cases.take(6)), "082afe0b8162d12a3e7039bdda43cfc6"); + }); + test("with input length = 6 and a seed", () { + expect(seedsum(cases.take(6)), "014bd95a51ca5ddbc5b54d56038e4e40"); + }); + test("with input length = 12", () { + expect(sum(cases.take(12)), "6e3efd8fc7802b18061a192713f69ad9"); + }); + test("with input length = 12 and a seed", () { + expect(seedsum(cases.take(12)), "ff0d60acd02ed4015d92b5d7190b12d1"); + }); + test("with input length = 24", () { + expect(sum(cases.take(24)), "0ce966e4678d37611e7044d28b1b901d"); + }); + test("with input length = 24 and a seed", () { + expect(seedsum(cases.take(24)), "d7895ded1f62559dc6cbf92a70680b19"); + }); + test("with input length = 48", () { + expect(sum(cases.take(48)), "a002ac4e5478227ef942219aed80f67b"); + }); + test("with input length = 48 and a seed", () { + expect(seedsum(cases.take(48)), "bc689f4c0152fb443a94d91333ed395a"); + }); + test("with input length = 81", () { + expect(sum(cases.take(81)), "4952f58181ab00425e8bafb9f95fb803"); + }); + test("with input length = 81 and a seed", () { + expect(seedsum(cases.take(81)), "941e9469c46edd08dc50feb227515233"); + }); + test("with input length = 222", () { + expect(sum(cases.take(222)), "337e09641b948717f1aebd597cec6b3a"); + }); + test("with input length = 222 and a seed", () { + expect(seedsum(cases.take(222)), "4740af1ae0618b49c5871b3be4506a30"); + }); + test("with input length = 403", () { + expect(sum(cases.take(403)), "1b6de21e332dd73dcdeb804d65c6dea4"); + }); + test("with input length = 403 and a seed", () { + expect(seedsum(cases.take(403)), "bed311971e0be8f26259f6ecfd6443fd"); + }); + test("with input length = 512", () { + expect(sum(cases.take(512)), "18d2d110dcc9bca1617e49599013cb6b"); + }); + test("with input length = 512 and a seed", () { + expect(seedsum(cases.take(512)), "925d06b8ec5b80403ce457de14c27708"); + }); + test("with input length = 2048", () { + expect(sum(cases.take(2048)), "f736557fd47073a5dd59e2c3a5f038e0"); + }); + test("with input length = 2048 and a seed", () { + expect(seedsum(cases.take(2048)), "23cc3a2e75ebaaea66f81670669ababc"); + }); + test("with input length = 2240", () { + expect(sum(cases.take(2240)), "ccb134fbfa7ce49d6e73a90539cf2948"); + }); + test("with input length = 2240 and a seed", () { + expect(seedsum(cases.take(2240)), "e40842f585875ba9757ba8487d1b5247"); + }); + test("with input length = 2237", () { + expect(sum(cases.take(2237)), "0cdabf3f3c98b371f403cea1763cd9cc"); + }); + test("with input length = 2237 and a seed", () { + expect(seedsum(cases.take(2237)), "3eef572c60cbcdc0f7a5385336bef410"); + }); + }); +} diff --git a/hashlib/test/xxh32_test.dart b/hashlib/test/xxh32_test.dart new file mode 100644 index 0000000..5a72932 --- /dev/null +++ b/hashlib/test/xxh32_test.dart @@ -0,0 +1,66 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +const seed = 0x9E3779B1; +const data = [ + 158, 255, 31, 75, 94, 83, 47, 221, 181, 84, 77, 42, 149, 43, 87, 174, 93, // + 186, 116, 233, 211, 166, 76, 152, 48, 96, 192, 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]; + +void main() { + group('XXHash32 test', () { + test('xxh32code', () { + expect(xxh32code(String.fromCharCodes(data)), 0x1f1aa412); + }); + + test('with seed = 0 and an empty string', () { + expect(xxh32.convert([]).hex(), "02cc5d05"); + }); + test('with seed = 0 and a single letter', () { + expect(xxh32.convert([data[0]]).hex(), "b85cbee5"); + }); + test('with seed = 0 and 14 letters', () { + final input = String.fromCharCodes(data.take(14)); + expect(xxh32sum(input), "e5aa0ab4"); + }); + test('with seed = 0 and 101 letters', () { + expect(xxh32.convert(data).number(), 0x1f1aa412); + }); + + test('with a seed and an empty string', () { + final input = []; + expect(xxh32.withSeed(seed).convert(input).hex(), "36b78ae7"); + }); + + test('with a seed and a single letter', () { + final input = [data[0]]; + expect(xxh32.withSeed(seed).convert(input).hex(), "d5845d64"); + }); + + test('with a seed and 14 letters', () { + final input = data.take(14).toList(); + expect(xxh32.withSeed(seed).convert(input).hex(), "4481951d"); + }); + + test('with a seed and 101 letters', () { + expect(xxh32.withSeed(seed).convert(data).hex(), "498ec8e2"); + }); + + test('with 32-byte message', () { + final input = "string of 32-bytes long for test"; + expect(xxh32code(input), 0x90d90755); + }); + + test('with 64-byte message', () { + final input = + "string of 64-bytes for test. twice the size of 32-byte string."; + expect(xxh32code(input), 0x0b438557); + }); + }); +} diff --git a/hashlib/test/xxh3_test.dart b/hashlib/test/xxh3_test.dart new file mode 100644 index 0000000..018b4b8 --- /dev/null +++ b/hashlib/test/xxh3_test.dart @@ -0,0 +1,173 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore: library_annotations +@Tags(['vm-only']) + +import 'dart:typed_data'; + +import 'package:hashlib/codecs.dart'; +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +const seed = 0x9e3779b185ebca8d; +final cases = fromHex( + '0052929bb732a3242d00af950eecb893e3dfef93aad6cd2a538b5c3f545a6fd559c0fffc8f85b9331dab74f7b6059327b07084b3677c9f76480072ed7b9817e8dd485e0c0ccbd0653fadb28f11b06ce88db0f186086159566c8e4e781363bdab9d327309ea712fd97a9d55f0ca8ad0e95e1a36b36b0fca51ef8ba2c462ed0096f33449eb0fd13b92a1a963dbaaed3dcff10942cdf9b321a2ebf2c8f4e42f48d14b10f4c2efecf84ab53874c3a4a6620ebffd633741e386981aeb4cba56036687ed004559c18544b6c368f941a9eaf987e09f12d0d51454485d444051e338069a4c3c0def6489f8a361eee3c51c9368c8e597d70998ff97a84ceaa479abcd2cc89f1bf2f1cee282503882ad8e9bb8b488818eb636d9a96548743cc9dbfcbbd82a229eb424e2b267abaa13e22a4dfc711c076291bdf8e2975d0c84fd6745671b099a4b20a2773095da28b1863f9ef2e1db10df90f86d912f0678b3485bdff6dbd87ca7aea589404c027320f09fdd637995b103c47e6f2fe022f6d488e9666e9d3519bd411b4f1acfd578b00049f01f8f8df614bcb5946dc45376a7a75391cf8db6166c397e362f06f2231e8e0fc886f476618ef66436fc8c27a1fa12cbfece583f8167886c7dc081e7f8c08e540ec9d9519d219035690a0baca171444b9f45fe9d981f1e1b776c5df1fb7e2c64fe6b571968cddde4d009361a609962d707e64d0986f78e9b2f42d983cba5caad2262757f5b40ef1aafec48756b22b5c405004d2a097d8b8d6ebb5cd4a6b2a10d24acaf16f37f6ebafd0d0791d263f1bb83de41481b7431e2f33f19a750f24e5bae206093d50c7ea5527798ecd52c0d52e75cae0484effbaecdb45cbac8ce982bd0a3a2e6256eb9cc066ab27f56578b4caa09214f4ac3904ba9d00736cf54119e27e39f503f58c294d47188a7814ed78f1e5d21ddc2016d5a1fd194b659885e377d176e8e1655107ccf70eae75029a542e03028a01e3dd559b168737022d33d2a634613aedb1e350598a1dd56f0e3dc62b1cc259122db36fc998c813776d677f3acf44c16a684ffda1082fc1f4f73e87cf5a96829b37fa47b1f2ca010aba85d82adf74eb7130c4d4ef53fa3938892ef424cfc95bfd276c2928f86903b7b845f7b57c9b95af823b3263d411ede092bbddc53138b199ba2f7f58c317390c5a1d3b943706c768efe8fd306f59d84d075dafdc074f24bb42a776fd4be4a472606f04d2c901cde7e083828801606663bfc74e59c926f26ad0e2505451f421ffeba7ef6133be520acebb0b22a31301a6cc0a6a2a5f241299e4819e225c4713a79ddbe1fcf634355761336bf3a3a70026000a7114e675d36640ff0df89c016c657d4701296c94f9bbaacc7572385e1a056f9511a2b18cfd6a773ee01defd63ea25c7ea5473c72a71b3f6a52b7a9819254d77951405cf9d42f6544e4c77ec3648cc47ac94810d108850f7a2d8c1ca827bd7c42d092627fbe6065ee7c61ad70aa64029c0e4211a91b19f4d007edaaae26da8f51308daec116b3396c89a7750e3426221cb8039e5f2f22820431816cf20c5c1650b93711c520b41981eba8507ce90fbdc9b9603c8cfbf4c0d8faa40a096cd43a7b3a48ab29a0a5e812d87b6990b0500e2732bbe8992d1dfe590a30f47d6966ae6558db19630ff3825f357f7bdcae02ec36a4df3ea5f14751d3fabda08062b5934e38fdb9dfbc5181663f17475debd527d867ffaf8a976f9cf383a7fb98ec2e70d4eb288de12a3b47907691cccae0f646d4c57aed99d835f109a33e23703aaa9bc92e9e11dfc6481b926ecd2e10d69f66bfe022fa623138786e4ff702ce1c6111b92815068efd923946d8b57cc99f339129a7cf872394360f16c5489a4d8ee7f9e1911b48b7275ab0076fed358991439a34cea606aff7ed88eab3fc54d0cb5c766083e6b39af5b11e34a100b2750cbc031dcb3047fc2310b0992a47e89d7a09870fed21b8c027d8c948034364907fb973d369c89ddef5590d2e5c907cb41e2f9e36bc43479180c119c397379192347bb3008406509d7e0ce8c874187ee9a6fedd150faceb93ebf7f2dcfc6f15acff65a930def663ab3a6856c54bf61aa380cfc9e97a9aea84d23a732b694759bdf8c602e6d28e9186e27e61d3538996b86de70972e75ce6add5e87f184f6e0f4dfd678a43378b3e62b45c51ebaebaf434ed79e3ac25ef4bb3685e2a0ddf30e311d396e70c7b7ab84a9c4941090badbdc3517a1e0390e7984d4d561536af2729d151b0995cc45a1b60cf02ce3dd789cb620558b83c1c78b8cefd33e2cc21962a3527950a2cefea375b4c86462839d153b551416a17dd0d523f6a29ea4a659fd8b7a9a8e0c8c54580e4765e0fc0512ae82d35b741692f692fd876b6f54aa6fda98f21f1643bb17123127687a44c392e4ea9a5eeb369f38b503db0bcf8ad22560011f91493c881a5f05059819fffe564c0a1c7a873a4994f81745e4bd9279a5ec0a01cffd871f0a0fd161dbb03a02953da066a21f82d83d3a7acfd9f37943aab6e27babe872f474a9953c259a38a29894ba1f46aef1888db89ca84c8ca08bf69c9c6a4450fc821a948056e97da613fb9d38a56dd42e744253f07600406f5362ba041389c5e3b5512d06d72037e0fbdc049441d11b44b495335760aab1ee556efbc876b25439226151d24dcd74bc89a065a4954889938415b7a2e406710f653b9abc5338fb94b16bcda96a7cc8890114dfd603ffa5ea071abb8d720c36f20564b6e4be4315f3528594e9051b46c559a4c13c027c36d95efffe96e11caa567a14e4166f3d902bcd7157005d0eed2efd793e7e008d6c4dac4058ebce9d350a7f6f07f7ecbec4b4c75da6ebae3c229d032ea8a68bce62dd9e045d9e16c8270a1c2c3b481c98f7616edd8872a172095fa012c96b2c8d56f00f6adf517c1b5d89e5f9255ea75b698a5659de7c4b375860d2a3409899661c6b506a9e3fd001c81b62298acf065f2b0080e5cba7cddfc6e6cb44f9c9610cd3588bfc6fd1a91bc9b20dad644703bcb6fc738cbec1d7602227b6da3dac9532f452e490dd6224aca11de17d69b8d16aa323d9cc8cabb41d935f2174dfa063c47b7893d65548ca72d73c1cf543e6d22aac8cf71c7aa8ba9a6bce4aa39085f508d6e6a537a1a61d58af074d', +); +final secret = cases.sublist(7, 7 + 136 + 11); + +String sum([Iterable? data]) { + return xxh3.convert(data?.toList() ?? []).hex(); +} + +String seedSum(int seed, [Iterable? data]) { + return XXH3(seed: seed).convert(data?.toList() ?? []).hex(); +} + +String secretSum([Iterable? data]) { + return XXH3(secret: secret).convert(data?.toList() ?? []).hex(); +} + +void main() { + group('XXH3 test', () { + test("xxh3code", () { + var input = String.fromCharCodes(cases.take(12)); + final expected = 0xa713daf0dfbb77e7; + expect(xxh3code(input), expected); + }); + + test("xxh3sum", () { + var input = String.fromCharCodes(cases.take(12)); + final expected = 'a713daf0dfbb77e7'; + expect(xxh3sum(input), expected); + }); + + test('The secret length must be at least 136', () { + for (int i = 0; i < 136; ++i) { + expect(() => XXH3().withSecret(Uint8List(i)).convert([2]), + throwsArgumentError); + } + }); + + test("withSeed overrides the seed", () { + var instance = XXH3(seed: 0).withSeed(seed); + expect(instance.convert([]).hex(), "a8a6b918b2f0364a"); + }); + + test("with input length = 0", () { + expect(sum(), "2d06800538d394c2"); + }); + test("with input length = 0 and a seed", () { + expect(seedSum(seed), "a8a6b918b2f0364a"); + }); + test("with input length = 1", () { + expect(sum(cases.take(1)), "c44bdff4074eecdb"); + }); + test("with input length = 1 and a seed", () { + expect(seedSum(seed, cases.take(1)), "032be332dd766ef8"); + }); + test("with input length = 6", () { + expect(sum(cases.take(6)), "27b56a84cd2d7325"); + }); + test("with input length = 6 and a seed", () { + expect(seedSum(seed, cases.take(6)), "84589c116ab59ab9"); + }); + test("with input length = 12", () { + expect(sum(cases.take(12)), "a713daf0dfbb77e7"); + }); + test("with input length = 12 and a seed", () { + expect(seedSum(seed, cases.take(12)), "e7303e1b2336de0e"); + }); + test("with input length = 24", () { + expect(sum(cases.take(24)), "a3fe70bf9d3510eb"); + }); + test("with input length = 24 and a seed", () { + expect(seedSum(seed, cases.take(24)), "850e80fc35bdd690"); + }); + test("with input length = 48", () { + expect(sum(cases.take(48)), "397da259ecba1f11"); + }); + test("with input length = 48 and a seed", () { + expect(seedSum(seed, cases.take(48)), "adc2cbaa44acc616"); + }); + test("with input length = 80", () { + expect(sum(cases.take(80)), "bcdefbbb2c47c90a"); + }); + test("with input length = 80 and a seed", () { + expect(seedSum(seed, cases.take(80)), "c6dd0cb699532e73"); + }); + test("with input length = 195", () { + expect(sum(cases.take(195)), "cd94217ee362ec3a"); + }); + test("with input length = 195 and a seed", () { + expect(seedSum(seed, cases.take(195)), "ba68003d370cb3d9"); + }); + test("with input length = 403", () { + expect(sum(cases.take(403)), "cdeb804d65c6dea4"); + }); + test("with input length = 403 and a seed", () { + expect(seedSum(seed, cases.take(403)), "6259f6ecfd6443fd"); + }); + test("with input length = 512", () { + expect(sum(cases.take(512)), "617e49599013cb6b"); + }); + test("with input length = 512 and a seed", () { + expect(seedSum(seed, cases.take(512)), "3ce457de14c27708"); + }); + test("with input length = 2048", () { + expect(sum(cases.take(2048)), "dd59e2c3a5f038e0"); + }); + test("with input length = 2048 and a seed", () { + expect(seedSum(seed, cases.take(2048)), "66f81670669ababc"); + }); + test("with input length = 2240", () { + expect(sum(cases.take(2240)), "6e73a90539cf2948"); + }); + test("with input length = 2240 and a seed", () { + expect(seedSum(seed, cases.take(2240)), "757ba8487d1b5247"); + }); + test("with input length = 2243", () { + expect(sum(cases.take(2243)), "fdd97ddf7a83e7a9"); + }); + test("with input length = 2243 and a seed", () { + expect(seedSum(seed, cases.take(2243)), "a2115d49b6729aed"); + }); + + // test("with secret, length = 0", () { + // expect(secretSum(), "6775fd10343c92c3"); + // }); + // test("with secret, length = 1", () { + // expect(secretSum(cases.take(1)), "c3382c326e24e3cd"); + // }); + test("with secret, length = 6", () { + expect(secretSum(cases.take(6)), "82c90ab0519369ad"); + }); + test("with secret, length = 12", () { + expect(secretSum(cases.take(12)), "14631e773b78ec57"); + }); + test("with secret, length = 24", () { + expect(secretSum(cases.take(24)), "cdd5542e4a9d9fe8"); + }); + test("with secret, length = 48", () { + expect(secretSum(cases.take(48)), "33abd54d094b2534"); + }); + test("with secret, length = 80", () { + expect(secretSum(cases.take(80)), "e687ba1684965297"); + }); + test("with secret, length = 195", () { + expect(secretSum(cases.take(195)), "a057273f5eecfb20"); + }); + // test("with secret, length = 403", () { + // expect(secretSum(cases.take(403)), "f9c0ba5ba3af70b8"); + // }); + // test("with secret, length = 512", () { + // expect(secretSum(cases.take(512)), "7896e65dcfa09071"); + // }); + // test("with secret, length = 2048", () { + // expect(secretSum(cases.take(2048)), "d6545db87ecfd98c"); + // }); + // test("with secret, length = 2243", () { + // expect(secretSum(cases.take(2243)), "887810081c32460a"); + // }); + }); +} diff --git a/hashlib/test/xxh64_test.dart b/hashlib/test/xxh64_test.dart new file mode 100644 index 0000000..794bf97 --- /dev/null +++ b/hashlib/test/xxh64_test.dart @@ -0,0 +1,76 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore: library_annotations +@Tags(['vm-only']) + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +const seed = 0x9E3779B1; +const data = [ + 158, 255, 31, 75, 94, 83, 47, 221, 181, 84, 77, 42, 149, 43, 87, 174, 93, // + 186, 116, 233, 211, 166, 76, 152, 48, 96, 192, 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]; + +void main() { + group('XXHash64 test', () { + test('xxh64sum', () { + final input = String.fromCharCodes(data); + expect(xxh64sum(input), "0eab543384f878ad"); + }); + test('xxh64code', () { + final input = String.fromCharCodes(data); + final output = 0x0eab543384f878ad; + expect(xxh64code(input), output); + }); + + test('with seed = 0 and an empty string', () { + expect(xxh64.convert([]).hex(), "ef46db3751d8e999"); + }); + test('with seed = 0 and a single letter', () { + expect(xxh64.convert([data[0]]).hex(), "4fce394cc88952d8"); + }); + test('with seed = 0 and 14 letters', () { + expect(xxh64.convert(data.take(14).toList()).hex(), "cffa8db881bc3a3d"); + }); + test('with seed = 0 and 101 letters', () { + expect(xxh64.convert(data).hex(), "0eab543384f878ad"); + }); + + test('with a seed and an empty string', () { + final input = []; + expect(xxh64.withSeed(seed).convert(input).hex(), "ac75fda2929b17ef"); + }); + + test('with a seed and a single letter', () { + final input = [data[0]]; + expect(xxh64.withSeed(seed).hex(input), "739840cb819fa723"); + }); + + test('with a seed and 14 letters', () { + final input = data.take(14).toList(); + expect(xxh64.withSeed(seed).convert(input).hex(), "5b9611585efcc9cb"); + }); + + test('with a seed and 101 letters', () { + expect(xxh64.withSeed(seed).convert(data).hex(), "caa65939306f1e21"); + }); + + test('with 32-byte message', () { + final input = "string of 32-bytes long for test"; + final output = "eb3f9d9890ca89b3"; + expect(xxh64sum(input), output); + }); + + test('with 64-byte message', () { + final input = "string of 64-bytes for test. " + "twice the size of 32-byte string."; + final output = "0f6ebfbce5c11a1b"; + expect(xxh64sum(input), output); + }); + }); +} diff --git a/hashlib/test/xxh_test.dart b/hashlib/test/xxh_test.dart new file mode 100644 index 0000000..53e8fe4 --- /dev/null +++ b/hashlib/test/xxh_test.dart @@ -0,0 +1,71 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +// ignore: library_annotations +@Tags(['vm-only']) + +import 'dart:io'; + +import 'package:hashlib/hashlib.dart'; +import 'package:test/test.dart'; + +List readLines(String filename) { + final file = File(Directory('test/fixures/$filename').absolute.path); + final text = file.readAsStringSync(); + return text.split(RegExp(r'(\r)?\n')); +} + +void main() { + group('XXH test with fixures', () { + const int maxLength = 1500; + final text = readLines('long.txt').join('\n').codeUnits; + + test('for xxh32', () { + var actual = readLines('xxh32.csv'); + for (var line in actual) { + var parts = line.split(','); + if (parts.length != 2) continue; + int len = int.parse(parts[0]); + if (len > maxLength) break; + var out = xxh32.hex(text.take(len).toList()); + expect(out, equals(parts[1]), reason: 'length: $len'); + } + }); + + test('for xxh64', () { + var actual = readLines('xxh64.csv'); + for (var line in actual) { + var parts = line.split(','); + if (parts.length != 2) continue; + int len = int.parse(parts[0]); + if (len > maxLength) break; + var out = xxh64.hex(text.take(len).toList()); + expect(out, equals(parts[1]), reason: 'length: $len'); + } + }); + + test('for xxh3-64', () { + var actual = readLines('xxh3_64.csv'); + for (var line in actual) { + var parts = line.split(','); + if (parts.length != 2) continue; + int len = int.parse(parts[0]); + if (len > maxLength) break; + var out = xxh3.hex(text.take(len).toList()); + expect(out, equals(parts[1]), reason: 'length: $len'); + } + }); + + test('for xxh3-128', () { + var actual = readLines('xxh3_128.csv'); + for (var line in actual) { + var parts = line.split(','); + if (parts.length != 2) continue; + int len = int.parse(parts[0]); + if (len > maxLength) break; + var out = xxh128.hex(text.take(len).toList()); + expect(out, equals(parts[1]), reason: 'length: $len'); + } + }); + }); +} diff --git a/hashlib_codecs/LICENSE b/hashlib_codecs/LICENSE new file mode 100644 index 0000000..f8437f8 --- /dev/null +++ b/hashlib_codecs/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2023, Sudipto Chandra +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/hashlib_codecs/lib/hashlib_codecs.dart b/hashlib_codecs/lib/hashlib_codecs.dart new file mode 100644 index 0000000..f835ad6 --- /dev/null +++ b/hashlib_codecs/lib/hashlib_codecs.dart @@ -0,0 +1,7 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +/// Implementations of fast and error resilient codecs in pure Dart. +library; + +export 'src/codecs_base.dart'; diff --git a/hashlib_codecs/lib/src/base16.dart b/hashlib_codecs/lib/src/base16.dart new file mode 100644 index 0000000..8b5e013 --- /dev/null +++ b/hashlib_codecs/lib/src/base16.dart @@ -0,0 +1,53 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/base16.dart'; + +Base16Codec _codecFromParameters({ + bool upper = false, +}) { + if (upper) { + return Base16Codec.upper; + } else { + return Base16Codec.lower; + } +} + +/// Converts 8-bit integer sequence to 4-bit Base-16 character sequence. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers. +/// - If [upper] is true, the uppercase standard alphabet is used. +/// - [codec] is the [Base16Codec] to use. It is derived from the other +/// parameters if not provided. +String toHex( + List input, { + Base16Codec? codec, + bool upper = false, +}) { + codec ??= _codecFromParameters(upper: upper); + var out = codec.encoder.convert(input); + return String.fromCharCodes(out); +} + +/// Converts 4-bit Base-16 character sequence to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] should be a valid Base-16 (hexadecimal) string. +/// - [codec] is the [Base16Codec] to use. It is derived from the other +/// parameters if not provided. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters. +/// +/// This implementation can handle both uppercase and lowercase alphabets. If a +/// partial string is detected, the following bits are assumed to be zeros. +Uint8List fromHex( + String input, { + Base16Codec? codec, +}) { + codec ??= _codecFromParameters(); + return codec.decoder.convert(input.codeUnits); +} diff --git a/hashlib_codecs/lib/src/base2.dart b/hashlib_codecs/lib/src/base2.dart new file mode 100644 index 0000000..ef5c5f5 --- /dev/null +++ b/hashlib_codecs/lib/src/base2.dart @@ -0,0 +1,48 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/base2.dart'; + +/// Converts 8-bit integer sequence to 2-bit Base-2 character sequence. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers. +/// - [codec] is the [Base2Codec] to use. Default: [Base2Codec.standard]. +/// +/// **NOTE:**, This implementation is a bit-wise encoding of the input bytes. +/// To get the numeric representation of the [input] in binary: +/// ```dart +/// toBigInt(input).toRadixString(2) +/// ``` +String toBinary( + List input, { + Base2Codec codec = Base2Codec.standard, +}) { + var out = codec.encoder.convert(input); + return String.fromCharCodes(out); +} + +/// Converts 2-bit Base-2 character sequence to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] should be a valid binary/base-2 encoded string. +/// - [codec] is the [Base2Codec] to use. Default: [Base2Codec.standard]. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters. +/// +/// If a partial string is detected, the following bits are assumed to be zeros. +/// +/// **NOTE:**, This implementation is a bit-wise decoding of the input bytes. +/// To get the bytes from the numeric representation of the [input]: +/// ```dart +/// fromBigInt(BigInt.parse(input, radix: 2)); +/// ``` +Uint8List fromBinary( + String input, { + Base2Codec codec = Base2Codec.standard, +}) { + return codec.decoder.convert(input.codeUnits); +} diff --git a/hashlib_codecs/lib/src/base32.dart b/hashlib_codecs/lib/src/base32.dart new file mode 100644 index 0000000..1d4a9dd --- /dev/null +++ b/hashlib_codecs/lib/src/base32.dart @@ -0,0 +1,80 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/base32.dart'; + +Base32Codec _codecFromParameters({ + bool lower = false, + bool padding = false, +}) { + if (lower && padding) { + return Base32Codec.lowercase; + } else if (lower) { + return Base32Codec.lowercaseNoPadding; + } else if (padding) { + return Base32Codec.standard; + } else { + return Base32Codec.standardNoPadding; + } +} + +const _codecsWithPadding = { + Base32Codec.standard, + Base32Codec.lowercase, + Base32Codec.hex, + Base32Codec.hexLower, + Base32Codec.geohash, + Base32Codec.wordSafe, +}; + +/// Converts 8-bit integer sequence to 5-bit Base-32 character sequence. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers +/// - If [lower] is true, the [Base32Codec.lowercase] alphabet is used. +/// - If [padding] is true, the output will not have padding characters. +/// - [codec] is the [Base32Codec] to use. It is derived from the other +/// parameters if not provided. +String toBase32( + List input, { + Base32Codec? codec, + bool lower = false, + bool padding = true, +}) { + codec ??= _codecFromParameters( + lower: lower, + padding: padding, + ); + Iterable out = codec.encoder.convert(input); + if (!padding && _codecsWithPadding.contains(codec)) { + out = out.takeWhile((x) => x != codec!.encoder.padding); + } + return String.fromCharCodes(out); +} + +/// Converts 5-bit Base-32 character sequence to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] should be a valid base-32 encoded string. +/// - If [padding] is true, the output will not have padding characters. +/// - [codec] is the [Base32Codec] to use. It is derived from the other +/// parameters if not provided. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters, and the +/// length is not valid for a base-32 encoded string. +/// +/// This implementation can handle both uppercase and lowercase alphabets. Any +/// letters appearing after the first padding character is observed are ignored. +/// If a partial string is detected, the following bits are assumed to be zeros. +Uint8List fromBase32( + String input, { + Base32Codec? codec, + bool padding = true, +}) { + codec ??= _codecFromParameters(padding: padding); + var out = codec.decoder.convert(input.codeUnits); + return Uint8List.fromList(out); +} diff --git a/hashlib_codecs/lib/src/base64.dart b/hashlib_codecs/lib/src/base64.dart new file mode 100644 index 0000000..e4ff33c --- /dev/null +++ b/hashlib_codecs/lib/src/base64.dart @@ -0,0 +1,77 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/base64.dart'; + +Base64Codec _codecFromParameters({ + bool url = false, + bool padding = false, +}) { + if (url && padding) { + return Base64Codec.urlSafe; + } else if (url) { + return Base64Codec.urlSafeNoPadding; + } else if (padding) { + return Base64Codec.standard; + } else { + return Base64Codec.standardNoPadding; + } +} + +const _codecsWithPadding = { + Base64Codec.standard, + Base64Codec.urlSafe, +}; + +/// Converts 8-bit integer sequence to 6-bit Base-64 character sequence. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers +/// - If [url] is true, URL and Filename-safe alphabet is used. +/// - If [padding] is true, the output will have padding characters. +/// - [codec] is the [Base64Codec] to use. It is derived from the other +/// parameters if not provided. +String toBase64( + List input, { + Base64Codec? codec, + bool url = false, + bool padding = true, +}) { + codec ??= _codecFromParameters( + url: url, + padding: padding, + ); + Iterable out = codec.encoder.convert(input); + if (!padding && _codecsWithPadding.contains(codec)) { + out = out.takeWhile((x) => x != codec!.encoder.padding); + } + return String.fromCharCodes(out); +} + +/// Converts 6-bit Base-64 character sequence to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] should be a valid base-64 encoded string. +/// - If [padding] is true, the output will have padding characters. +/// - [codec] is the [Base64Codec] to use. It is derived from the other +/// parameters if not provided. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters, and the +/// length is not valid for a base-64 encoded string. +/// +/// This implementation can handle both the original and URL/filename-safe +/// alphabets. Any letters appearing after the first padding character is +/// observed are ignored. If a partial string is detected, the following bits +/// are assumed to be zeros. +Uint8List fromBase64( + String input, { + Base64Codec? codec, + bool padding = true, +}) { + codec ??= _codecFromParameters(padding: padding); + var out = codec.decoder.convert(input.codeUnits); + return Uint8List.fromList(out); +} diff --git a/hashlib_codecs/lib/src/base8.dart b/hashlib_codecs/lib/src/base8.dart new file mode 100644 index 0000000..3912924 --- /dev/null +++ b/hashlib_codecs/lib/src/base8.dart @@ -0,0 +1,48 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/base8.dart'; + +/// Converts 8-bit integer sequence to 3-bit Base-8 character sequence. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers. +/// - [codec] is the [Base8Codec] to use. Default: [Base8Codec.standard]. +/// +/// **NOTE:**, This implementation is a bit-wise encoding of the input bytes. +/// To get the numeric representation of the [input] in binary: +/// ```dart +/// toBigInt(input).toRadixString(8) +/// ``` +String toOctal( + List input, { + Base8Codec codec = Base8Codec.standard, +}) { + var out = codec.encoder.convert(input); + return String.fromCharCodes(out); +} + +/// Converts 3-bit Base-8 character sequence to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] should be a valid octal/base-8 encoded string. +/// - [codec] is the [Base8Codec] to use. Default: [Base8Codec.standard]. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters. +/// +/// If a partial string is detected, the following bits are assumed to be zeros. +/// +/// **NOTE:**, This implementation is a bit-wise decoding of the input bytes. +/// To get the bytes from the numeric representation of the [input]: +/// ```dart +/// fromBigInt(BigInt.parse(input, radix: 8)); +/// ``` +Uint8List fromOctal( + String input, { + Base8Codec codec = Base8Codec.standard, +}) { + return codec.decoder.convert(input.codeUnits); +} diff --git a/hashlib_codecs/lib/src/bigint.dart b/hashlib_codecs/lib/src/bigint.dart new file mode 100644 index 0000000..4f0e453 --- /dev/null +++ b/hashlib_codecs/lib/src/bigint.dart @@ -0,0 +1,59 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/bigint.dart'; + +BigIntCodec _codecFromParameters({ + bool msbFirst = false, +}) { + if (msbFirst) { + return BigIntCodec.msbFirst; + } else { + return BigIntCodec.lsbFirst; + } +} + +/// Converts 8-bit integer sequence to [BigInt]. +/// +/// Parameters: +/// - [input] is a sequence of 8-bit integers. +/// - If [msbFirst] is true, [input] bytes are read in big-endian order giving +/// the first byte the most significant value, otherwise the bytes are read as +/// little-endian order, giving the first byte the least significant value. +/// - [codec] is the [BigIntCodec] to use. It is derived from the other +/// parameters if not provided. +/// +/// Throws: +/// - [FormatException] when the [input] is empty. +BigInt toBigInt( + Iterable input, { + BigIntCodec? codec, + bool msbFirst = false, +}) { + codec ??= _codecFromParameters(msbFirst: msbFirst); + return codec.encoder.convert(input); +} + +/// Converts a [BigInt] to 8-bit integer sequence. +/// +/// Parameters: +/// - [input] is a non-negative [BigInt]. +/// - If [msbFirst] is true, [input] bytes are read in big-endian order giving +/// the first byte the most significant value, otherwise the bytes are read as +/// little-endian order, giving the first byte the least significant value. +/// - [codec] is the [BigIntCodec] to use. It is derived from the other +/// parameters if not provided. +/// +/// Raises: +/// - [FormatException] when the [input] is negative. +Uint8List fromBigInt( + BigInt input, { + BigIntCodec? codec, + bool msbFirst = false, +}) { + codec ??= _codecFromParameters(msbFirst: msbFirst); + var out = codec.decoder.convert(input); + return Uint8List.fromList(out as List); +} diff --git a/hashlib_codecs/lib/src/codecs/base16.dart b/hashlib_codecs/lib/src/codecs/base16.dart new file mode 100644 index 0000000..fc77b08 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/base16.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib_codecs/src/core/byte.dart'; +import 'package:hashlib_codecs/src/core/codec.dart'; + +const int _zero = 0x30; +const int _bigA = 0x41; +const int _smallA = 0x61; + +extension on List { + @pragma('vm:prefer-inline') + int dec(int p) { + int x = this[p] & 0xFF; + if (x >= _smallA) { + x -= _smallA - 10; + } else if (x >= _bigA) { + x -= _bigA - 10; + } else { + x -= _zero; + } + if (x < 0 || x > 15) { + throw FormatException('Invalid character at $p'); + } + return x; + } +} + +// ======================================================== +// Base-16 Encoder and Decoder +// ======================================================== + +class _Base16Encoder extends ByteEncoder { + final int startCode; + + const _Base16Encoder._(this.startCode) : super(bits: 4); + + static const upper = _Base16Encoder._(_bigA - 10); + static const lower = _Base16Encoder._(_smallA - 10); + + @override + Uint8List convert(List input) { + int i, p, x, a, b; + var out = Uint8List(input.length << 1); + for (i = p = 0; p < input.length; p++, i += 2) { + x = input[p]; + a = (x >>> 4) & 0xF; + b = x & 0xF; + a += a < 10 ? _zero : startCode; + b += b < 10 ? _zero : startCode; + out[i] = a; + out[i + 1] = b; + } + return out; + } +} + +class _Base16Decoder extends ByteDecoder { + const _Base16Decoder() : super(bits: 4); + + @override + Uint8List convert(List encoded) { + int p, n; + + n = encoded.length; + p = (n >>> 1) + (n & 1); + var out = Uint8List(p); + + for (p--; n >= 2; n -= 2, p--) { + out[p] = encoded.dec(n - 1) ^ // + (encoded.dec(n - 2) << 4); + } + + if (n == 1) { + out[p] = encoded.dec(0); + } + + return out; + } +} + +// ======================================================== +// Base-16 Codec +// ======================================================== + +class Base16Codec extends IterableCodec { + @override + final ByteEncoder encoder; + + @override + final ByteDecoder decoder; + + const Base16Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to 4-bit + /// Base-16 or Hexadecimal character sequence using the alphabet: + /// ``` + /// 0123456789ABCDEF + /// ``` + static const Base16Codec upper = Base16Codec._( + encoder: _Base16Encoder.upper, + decoder: _Base16Decoder(), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 4-bit + /// Base-16 or Hexadecimal character sequence using the alphabet: + /// ``` + /// 0123456789abcdef + /// ``` + static const Base16Codec lower = Base16Codec._( + encoder: _Base16Encoder.lower, + decoder: _Base16Decoder(), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/base2.dart b/hashlib_codecs/lib/src/codecs/base2.dart new file mode 100644 index 0000000..9934fd7 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/base2.dart @@ -0,0 +1,110 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib_codecs/src/core/byte.dart'; +import 'package:hashlib_codecs/src/core/codec.dart'; + +const int _zero = 0x30; + +extension on List { + @pragma('vm:prefer-inline') + int dec(int p) { + int x = this[p] - _zero; + if (x != 0 && x != 1) { + throw FormatException('Invalid character at $p'); + } + return x; + } +} + +// ======================================================== +// Base-2 Encoder & Decoder +// ======================================================== + +class _Base2Encoder extends ByteEncoder { + const _Base2Encoder() : super(bits: 2); + + @override + Uint8List convert(List input) { + int i, p, x, n; + n = input.length; + var out = Uint8List(n << 3); + + for (i = p = 0; i < n; i++, p += 8) { + x = input[i]; + out[p] = _zero + ((x >>> 7) & 1); + out[p + 1] = _zero + ((x >>> 6) & 1); + out[p + 2] = _zero + ((x >>> 5) & 1); + out[p + 3] = _zero + ((x >>> 4) & 1); + out[p + 4] = _zero + ((x >>> 3) & 1); + out[p + 5] = _zero + ((x >>> 2) & 1); + out[p + 6] = _zero + ((x >>> 1) & 1); + out[p + 7] = _zero + ((x) & 1); + } + + return out; + } +} + +class _Base2Decoder extends ByteDecoder { + const _Base2Decoder() : super(bits: 2); + + @override + Uint8List convert(List encoded) { + int i, p, n, x; + + n = encoded.length; + p = (n + ((8 - (n & 7)) & 7)) >>> 3; + var out = Uint8List(p); + + for (p--; n >= 8; n -= 8, p--) { + out[p] = encoded.dec(n - 1) ^ + (encoded.dec(n - 2) << 1) ^ + (encoded.dec(n - 3) << 2) ^ + (encoded.dec(n - 4) << 3) ^ + (encoded.dec(n - 5) << 4) ^ + (encoded.dec(n - 6) << 5) ^ + (encoded.dec(n - 7) << 6) ^ + (encoded.dec(n - 8) << 7); + } + + if (n > 0) { + x = 0; + for (i = n; i > 0; i--) { + x = (x << 1) ^ encoded.dec(n - i); + } + out[p] = x; + } + + return out; + } +} + +// ======================================================== +// Base-2 Codec +// ======================================================== + +class Base2Codec extends IterableCodec { + @override + final ByteEncoder encoder; + + @override + final ByteDecoder decoder; + + const Base2Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to 2-bit + /// Base-2 or Binary character sequence using the alphabet: + /// ``` + /// 01 + /// ``` + static const Base2Codec standard = Base2Codec._( + encoder: _Base2Encoder(), + decoder: _Base2Decoder(), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/base32.dart b/hashlib_codecs/lib/src/codecs/base32.dart new file mode 100644 index 0000000..7ba4914 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/base32.dart @@ -0,0 +1,383 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib_codecs/src/core/alphabet.dart'; +import 'package:hashlib_codecs/src/core/codec.dart'; + +// ======================================================== +// Base-32 Alphabets +// ======================================================== + +const int _padding = 0x3d; + +// ignore: constant_identifier_names +const int __ = -1; + +// RFC-4648 +const _base32EncodingRfc4648 = [ + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +]; + +// RFC-4648 Lowercase +const _base32EncodingRfc4648Lower = [ + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, // + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +]; + +// RFC-4648 and Lowercase Reversed +const _base32DecodingRfc4648 = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, __, 26, 27, 28, 29, 30, 31, __, + __, __, __, __, __, __, __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, + __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, __, __, __, __, __, __, +]; + +// Base32Hex Uppercase +const _base32EncodingHexUpper = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, +]; + +// Base32Hex Lowercase +const _base32EncodingHexLower = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, +]; + +// Base32Hex Uppercase + Lowercase Reversed +const _base32DecodingHex = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, + 09, __, __, __, __, __, __, __, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, __, __, __, __, __, __, __, __, + __, __, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, __, __, __, __, __, __, __, __, __, __, __, __, __, __, +]; + +// Crockford's Base32 +const _base32EncodingCrockford = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, +]; + +// Crockford's Base32 Reversed +const _base32DecodingCrockford = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, + 09, __, __, __, __, __, __, __, 10, 11, 12, 13, 14, 15, 16, 17, __, 18, 19, + __, 20, 21, __, 22, 23, 24, 25, 26, __, 27, 28, 29, 30, 31, __, __, __, __, +]; + +// GeoHash's Base32 +const _base32EncodingGeoHash = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // + 0x38, 0x39, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x6a, 0x6b, 0x6d, 0x6e, 0x70, 0x71, 0x72, + 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, +]; + +// GeoHash's Base32 Reversed +const _base32DecodingGeoHash = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, + 09, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, 10, 11, 12, 13, 14, 15, 16, __, 17, 18, __, 19, 20, __, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, __, __, __, __, __, __, __, __, __, __, +]; + +// Z Base32 +const _base32EncodingZ = [ + 0x79, 0x62, 0x6e, 0x64, 0x72, 0x66, 0x67, 0x38, // + 0x65, 0x6a, 0x6b, 0x6d, 0x63, 0x70, 0x71, 0x78, + 0x6f, 0x74, 0x31, 0x75, 0x77, 0x69, 0x73, 0x7a, + 0x61, 0x33, 0x34, 0x35, 0x68, 0x37, 0x36, 0x39, +]; + +// Z Base32 Reversed +const _base32DecodingZ = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, 18, __, 25, 26, 27, 30, 29, 07, + 31, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, 24, 01, 12, 03, 08, 05, 06, 28, 21, 09, 10, __, 11, 02, 16, 13, 14, + 04, 22, 17, 19, __, 20, 15, 00, 23, __, __, __, __, __, __, __, __, __, __, +]; + +// WordSafe Base32 +const _base32EncodingWordSafe = [ + 0x79, 0x62, 0x6e, 0x64, 0x72, 0x66, 0x67, 0x38, // + 0x65, 0x6a, 0x6b, 0x6d, 0x63, 0x70, 0x71, 0x78, + 0x6f, 0x74, 0x31, 0x75, 0x77, 0x69, 0x73, 0x7a, + 0x61, 0x33, 0x34, 0x35, 0x68, 0x37, 0x36, 0x39, +]; + +// WordSafe Base32 Reversed +const _base32DecodingWordSafe = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, 18, __, 25, 26, 27, 30, 29, 07, + 31, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, 24, 01, 12, 03, 08, 05, 06, 28, 21, 09, 10, __, 11, 02, 16, 13, 14, + 04, 22, 17, 19, __, 20, 15, 00, 23, __, __, __, __, __, __, __, __, __, __, +]; + +// ======================================================== +// Base-32 Codec +// ======================================================== + +class Base32Codec extends IterableCodec { + @override + final AlphabetEncoder encoder; + + @override + final AlphabetDecoder decoder; + + const Base32Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html): + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 + /// ``` + /// + /// It is padded with `=` + static const Base32Codec standard = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingRfc4648, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html): + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 + /// ``` + /// + /// This algorithm is a variant of the [standard] from the + /// [RFC-4648](https://datatracker.ietf.org/doc/html/rfc4648) + /// that does not append any padding characters to the output. + /// + /// It is not padded. + static const Base32Codec standardNoPadding = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + alphabet: _base32EncodingRfc4648, + ), + decoder: AlphabetDecoder( + bits: 5, + alphabet: _base32DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet: + /// ``` + /// abcdefghijklmnopqrstuvwxyz234567 + /// ``` + /// + /// This alphabet is a variant of the standard alphabet from + /// [RFC-4648](https://datatracker.ietf.org/doc/html/rfc4648) + /// using the lowercase characters. + /// + /// It is padded with `=` + static const Base32Codec lowercase = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingRfc4648Lower, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet: + /// ``` + /// abcdefghijklmnopqrstuvwxyz234567 + /// ``` + /// + /// This algorithm is a variant of the [lowercase] that does + /// not append any padding characters to the output. + /// + /// It is not padded. + static const Base32Codec lowercaseNoPadding = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + alphabet: _base32EncodingRfc4648Lower, + ), + decoder: AlphabetDecoder( + bits: 5, + alphabet: _base32DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet of + /// [base32hex](https://en.wikipedia.org/wiki/Base32#base32hex): + /// : + /// ``` + /// 0123456789ABCDEFGHIJKLMNOPQRSTUV + /// ``` + /// + /// It is padded with `=` + static const Base32Codec hex = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingHexUpper, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingHex, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet of lowercase + /// [base32hex](https://en.wikipedia.org/wiki/Base32#base32hex): + /// ``` + /// 0123456789abcdefghijklmnopqrstuv + /// ``` + /// + /// It is padded with `=` + static const Base32Codec hexLower = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingHexLower, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingHex, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet of + /// [Crockford's Base32](https://en.wikipedia.org/wiki/Base32#Crockford's_Base32): + /// ``` + /// 0123456789ABCDEFGHJKMNPQRSTVWXYZ + /// ``` + /// + /// This alphabet uses additional characters for a mod-37 checksum, and avoid + /// the character U to reduce the likelihood of accidental obscenity. + /// + /// It is not padded. + static const Base32Codec crockford = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + alphabet: _base32EncodingCrockford, + ), + decoder: AlphabetDecoder( + bits: 5, + alphabet: _base32DecodingCrockford, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet of + /// [Geohash's Base32](https://en.wikipedia.org/wiki/Base32#Geohash): + /// ``` + /// 0123456789bcdefghjkmnpqrstuvwxyz + /// ``` + /// + /// This is used by the Geohash algorithm to represent latitude and + /// longitude values in one (bit-interlaced) positive integer. + /// + /// It is padded with `=` + static const Base32Codec geohash = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingGeoHash, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingGeoHash, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the alphabet of + /// [z-base-32](https://en.wikipedia.org/wiki/Base32#z-base-32): + /// ``` + /// ybndrfg8ejkmcpqxot1uwisza345h769 + /// ``` + /// + /// The alphabet designed in a way so that the easier characters occur + /// more frequently, thus making it more human readable. + /// + /// It is not padded. + static const Base32Codec z = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + alphabet: _base32EncodingZ, + ), + decoder: AlphabetDecoder( + bits: 5, + alphabet: _base32DecodingZ, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 5-bit + /// Base-32 character sequence using the + /// [Word-safe alphabet](https://en.wikipedia.org/wiki/Base32#Word-safe_alphabet): + /// ``` + /// 23456789CFGHJMPQRVWXcfghjmpqrvwx + /// ``` + /// + /// That alphabet uses 8 numeric digits and 12 case-sensitive letter digits + /// chosen to avoid accidentally forming words. + /// + /// It is padded with `=` + static const Base32Codec wordSafe = Base32Codec._( + encoder: AlphabetEncoder( + bits: 5, + padding: _padding, + alphabet: _base32EncodingWordSafe, + ), + decoder: AlphabetDecoder( + bits: 5, + padding: _padding, + alphabet: _base32DecodingWordSafe, + ), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/base64.dart b/hashlib_codecs/lib/src/codecs/base64.dart new file mode 100644 index 0000000..5653f04 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/base64.dart @@ -0,0 +1,182 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib_codecs/src/core/alphabet.dart'; +import 'package:hashlib_codecs/src/core/codec.dart'; + +// ======================================================== +// Base-64 Alphabets +// ======================================================== + +const int _padding = 0x3d; + +// ignore: constant_identifier_names +const int __ = -1; + +const _base64EncodingRfc4648 = [ + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f, +]; +const _base64EncodingRfc4648UrlSafe = [ + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2d, 0x5f, +]; +const _base64DecodingRfc4648 = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, 62, __, 62, __, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, __, __, __, __, __, __, __, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, + 63, __, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, __, __, __, __, __, __, __, __, __, __, +]; + +const _base64EncodingBcrypt = [ + 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, + 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, +]; +const _base64DecodingBcrypt = [ + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, 00, 01, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, __, __, __, __, __, __, __, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, __, __, __, __, + __, __, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, __, __, __, __, __, __, __, __, __, __, +]; + +// ======================================================== +// Base-64 Codec +// ======================================================== + +class Base64Codec extends IterableCodec { + @override + final AlphabetEncoder encoder; + + @override + final AlphabetDecoder decoder; + + const Base64Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to 6-bit + /// Base-64 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html): + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ + /// ``` + /// + /// It is padded with `=` + static const Base64Codec standard = Base64Codec._( + encoder: AlphabetEncoder( + bits: 6, + padding: _padding, + alphabet: _base64EncodingRfc4648, + ), + decoder: AlphabetDecoder( + bits: 6, + padding: _padding, + alphabet: _base64DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 6-bit + /// Base-64 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html): + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ + /// ``` + /// + /// It is not padded. + static const Base64Codec standardNoPadding = Base64Codec._( + encoder: AlphabetEncoder( + bits: 6, + alphabet: _base64EncodingRfc4648, + ), + decoder: AlphabetDecoder( + bits: 6, + alphabet: _base64DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 6-bit + /// Base-64 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html) considering the + /// URL and filename safety: + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ + /// ``` + /// + /// It is padded with `=` + static const Base64Codec urlSafe = Base64Codec._( + encoder: AlphabetEncoder( + bits: 6, + padding: _padding, + alphabet: _base64EncodingRfc4648UrlSafe, + ), + decoder: AlphabetDecoder( + bits: 6, + padding: _padding, + alphabet: _base64DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 6-bit + /// Base-64 character sequence using the alphabet described in + /// [RFC-4648](https://www.ietf.org/rfc/rfc4648.html) considering the + /// URL and filename safety: + /// ``` + /// ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ + /// ``` + /// + /// It is not padded. + static const Base64Codec urlSafeNoPadding = Base64Codec._( + encoder: AlphabetEncoder( + bits: 6, + alphabet: _base64EncodingRfc4648UrlSafe, + ), + decoder: AlphabetDecoder( + bits: 6, + alphabet: _base64DecodingRfc4648, + ), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to 6-bit + /// Base-64 character sequence using the alphabet described in + /// [Bcrypt](https://en.wikipedia.org/wiki/Bcrypt#base64_encoding_alphabet): + /// ``` + /// ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /// ``` + /// + /// It is not padded. + static const Base64Codec bcrypt = Base64Codec._( + encoder: AlphabetEncoder( + bits: 6, + alphabet: _base64EncodingBcrypt, + ), + decoder: AlphabetDecoder( + bits: 6, + alphabet: _base64DecodingBcrypt, + ), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/base8.dart b/hashlib_codecs/lib/src/codecs/base8.dart new file mode 100644 index 0000000..8199f8c --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/base8.dart @@ -0,0 +1,149 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib_codecs/src/core/byte.dart'; +import 'package:hashlib_codecs/src/core/codec.dart'; + +const int _zero = 0x30; + +extension on List { + @pragma('vm:prefer-inline') + int enc(int n) => + (this[n - 1] & 0xFF) ^ + ((this[n - 2] & 0xFF) << 8) ^ + ((this[n - 3] & 0xFF) << 16); + + @pragma('vm:prefer-inline') + int dec(int p) { + int x = (this[p] & 0xFF) - _zero; + if (x < 0 || x > 7) { + throw FormatException('Invalid character at $p'); + } + return x; + } +} + +// ======================================================== +// Base-8 Encoder & Decoder +// ======================================================== + +class _Base8Encoder extends ByteEncoder { + const _Base8Encoder() : super(bits: 3); + + @override + Uint8List convert(List input) { + int p, x, n, nb; + n = input.length; + nb = n << 3; + p = nb ~/ 3; + if ((3 * p) != nb) p++; + var out = Uint8List(p); + + for (; n >= 3; n -= 3, p -= 8) { + x = input.enc(n); + out[p - 1] = _zero + ((x) & 7); + out[p - 2] = _zero + ((x >>> 3) & 7); + out[p - 3] = _zero + ((x >>> 6) & 7); + out[p - 4] = _zero + ((x >>> 9) & 7); + out[p - 5] = _zero + ((x >>> 12) & 7); + out[p - 6] = _zero + ((x >>> 15) & 7); + out[p - 7] = _zero + ((x >>> 18) & 7); + out[p - 8] = _zero + ((x >>> 21) & 7); + } + + if (n == 2) { + x = (input[1] & 0xFF) ^ ((input[0] & 0xFF) << 8); + out[p - 1] = _zero + ((x) & 7); + out[p - 2] = _zero + ((x >>> 3) & 7); + out[p - 3] = _zero + ((x >>> 6) & 7); + out[p - 4] = _zero + ((x >>> 9) & 7); + out[p - 5] = _zero + ((x >>> 12) & 7); + out[p - 6] = _zero + ((x >>> 15) & 7); + } else if (n == 1) { + x = input[0] & 0xFF; + out[p - 1] = _zero + ((x) & 7); + out[p - 2] = _zero + ((x >>> 3) & 7); + out[p - 3] = _zero + ((x >>> 6) & 7); + } + + return out; + } +} + +class _Base8Decoder extends ByteDecoder { + const _Base8Decoder() : super(bits: 3); + + @override + Uint8List convert(List encoded) { + int i, p, x, n, z; + + n = encoded.length; + p = 3 * (n >>> 3); + x = n & 7; + z = 0; + if (x > 0) { + for (i = 0; i < x; i++) { + z = (z << 3) ^ encoded.dec(i); + } + p++; + if (x > 3 || z > 0xFF) p++; + if (z > 0xFFFF) p++; + } + var out = Uint8List(p); + + for (; n >= 8; n -= 8, p -= 3) { + x = encoded.dec(n - 1) ^ + (encoded.dec(n - 2) << 3) ^ + (encoded.dec(n - 3) << 6) ^ + (encoded.dec(n - 4) << 9) ^ + (encoded.dec(n - 5) << 12) ^ + (encoded.dec(n - 6) << 15) ^ + (encoded.dec(n - 7) << 18) ^ + (encoded.dec(n - 8) << 21); + out[p - 1] = x; + out[p - 2] = x >>> 8; + out[p - 3] = x >>> 16; + } + + if (z > 0) { + out[p - 1] = z; + if (z > 0xFF) { + out[p - 2] = z >>> 8; + if (z > 0xFFFF) { + out[p - 3] = z >>> 16; + } + } + } + + return out; + } +} + +// ======================================================== +// Base-8 Codec +// ======================================================== + +class Base8Codec extends IterableCodec { + @override + final ByteEncoder encoder; + + @override + final ByteDecoder decoder; + + const Base8Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to 3-bit + /// Base-8 or Octal character sequence using the alphabet: + /// ``` + /// 012345678 + /// ``` + static const Base8Codec standard = Base8Codec._( + encoder: _Base8Encoder(), + decoder: _Base8Decoder(), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/bigint.dart b/hashlib_codecs/lib/src/codecs/bigint.dart new file mode 100644 index 0000000..bfaa306 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/bigint.dart @@ -0,0 +1,165 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert' show Codec, Converter; + +const int _zero = 0x30; +const int _smallA = 0x61; + +typedef BigIntEncoder = Converter, BigInt>; +typedef BigIntDecoder = Converter>; + +// ======================================================== +// LSB First Encoder and Decoder +// ======================================================== + +class _BigIntLSBFirstEncoder extends BigIntEncoder { + const _BigIntLSBFirstEncoder(); + + @override + BigInt convert(Iterable input) { + int a, b, i, j; + List out = []; + for (int x in input) { + a = (x >>> 4) & 0xF; + b = x & 0xF; + a += a < 10 ? _zero : _smallA - 10; + b += b < 10 ? _zero : _smallA - 10; + out.add(b); + out.add(a); + } + if (out.isEmpty) { + throw FormatException('Empty input'); + } + for (j = out.length - 1; j > 0; j--) { + if (out[j] != _zero) break; + } + var hex = out.take(j + 1); + for (i = 0; i < j; i++, j--) { + a = out[i]; + out[i] = out[j]; + out[j] = a; + } + return BigInt.parse(String.fromCharCodes(hex), radix: 16); + } +} + +class _BigIntLSBFirstDecoder extends BigIntDecoder { + const _BigIntLSBFirstDecoder(); + + @override + Iterable convert(BigInt input) { + if (input.isNegative) { + throw FormatException('Negative numbers are not supported'); + } + if (input == BigInt.zero) { + return [0]; + } + int i, a, b; + List out = []; + var bytes = input.toRadixString(16).codeUnits; + for (i = bytes.length - 2; i >= 0; i -= 2) { + a = bytes[i]; + b = bytes[i + 1]; + a -= a < _smallA ? _zero : _smallA - 10; + b -= b < _smallA ? _zero : _smallA - 10; + out.add((a << 4) | b); + } + if (i == -1) { + a = bytes[0]; + a -= a < _smallA ? _zero : _smallA - 10; + out.add(a); + } + return out; + } +} + +// ======================================================== +// MSB First Encoder and Decoder +// ======================================================== + +class _BigIntMSBFirstEncoder extends BigIntEncoder { + const _BigIntMSBFirstEncoder(); + + @override + BigInt convert(Iterable input) { + int a, b; + List out = []; + for (int x in input) { + a = (x >>> 4) & 0xF; + b = x & 0xF; + a += a < 10 ? _zero : _smallA - 10; + b += b < 10 ? _zero : _smallA - 10; + out.add(a); + out.add(b); + } + if (out.isEmpty) { + throw FormatException('Empty input'); + } + return BigInt.parse(String.fromCharCodes(out), radix: 16); + } +} + +class _BigIntMSBFirstDecoder extends BigIntDecoder { + const _BigIntMSBFirstDecoder(); + + @override + Iterable convert(BigInt input) { + if (input.isNegative) { + throw FormatException('Negative numbers are not supported'); + } + if (input == BigInt.zero) { + return [0]; + } + int i, a, b, n; + List out = []; + var bytes = input.toRadixString(16).codeUnits; + n = bytes.length; + i = 1; + if (n & 1 == 1) { + a = bytes[0]; + a -= a < _smallA ? _zero : _smallA - 10; + out.add(a); + i++; + } + for (; i < n; i += 2) { + a = bytes[i - 1]; + b = bytes[i]; + a -= a < _smallA ? _zero : _smallA - 10; + b -= b < _smallA ? _zero : _smallA - 10; + out.add((a << 4) | b); + } + return out; + } +} + +// ======================================================== +// BigInt Codec +// ======================================================== + +class BigIntCodec extends Codec, BigInt> { + @override + final BigIntEncoder encoder; + + @override + final BigIntDecoder decoder; + + const BigIntCodec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode 8-bit integer sequence to [BigInt] + /// number treating the input bytes in big-endian order. + static const BigIntCodec msbFirst = BigIntCodec._( + encoder: _BigIntMSBFirstEncoder(), + decoder: _BigIntMSBFirstDecoder(), + ); + + /// Codec instance to encode and decode 8-bit integer sequence to [BigInt] + /// number treating the input bytes in little-endian order. + static const BigIntCodec lsbFirst = BigIntCodec._( + encoder: _BigIntLSBFirstEncoder(), + decoder: _BigIntLSBFirstDecoder(), + ); +} diff --git a/hashlib_codecs/lib/src/codecs/crypt/crypt.dart b/hashlib_codecs/lib/src/codecs/crypt/crypt.dart new file mode 100644 index 0000000..4c906a9 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/crypt/crypt.dart @@ -0,0 +1,6 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'crypt_codec.dart'; +export 'crypt_data.dart'; +export 'crypt_builder.dart'; diff --git a/hashlib_codecs/lib/src/codecs/crypt/crypt_builder.dart b/hashlib_codecs/lib/src/codecs/crypt/crypt_builder.dart new file mode 100644 index 0000000..1dbf5f0 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/crypt/crypt_builder.dart @@ -0,0 +1,87 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'package:hashlib_codecs/src/base64.dart'; + +import 'crypt_data.dart'; + +/// Convenient builder for [CryptData]. +class CryptDataBuilder { + final String id; + String? _version; + String? _salt; + String? _hash; + final _params = {}; + + /// Creates a new builder for [CryptData]. + /// + /// Parameters: + /// - [id] : The identifier name, which must not exceed 32 characters in + /// length and must be a sequence of characters in `[a-z0-9-]`. + /// + /// Good identifiers should be should be explicit (human readable, not a + /// single digit), with a length of about 5 to 10 characters. + CryptDataBuilder(this.id); + + /// Set the algorithm version. + /// + /// The value for the version must be a sequence of characters in: `[0-9]`. + /// + /// It is recommended to use a default version. + CryptDataBuilder version(String v) { + _version = v; + return this; + } + + /// Set the salt. + CryptDataBuilder salt(String v) { + _salt = v; + return this; + } + + /// Set the output hash. + CryptDataBuilder hash(String v) { + _hash = v; + return this; + } + + /// Set the salt bytes using standard Base-64 codecs without padding. + CryptDataBuilder saltBytes(List v) { + _salt = toBase64(v, padding: false); + return this; + } + + /// Set the output hash bytes using standard Base-64 codecs without padding. + CryptDataBuilder hashBytes(List v) { + _hash = toBase64(v, padding: false); + return this; + } + + /// Set a parameter value. + /// + /// The parameter [name] must not exceed 32 characters in length and must be a + /// sequence of characters in: `[a-z0-9-]`. + /// + /// If [value] is not a [String], it will be converted to one with [toString]. + /// As a string, it must be a sequence of characters in `[a-zA-Z0-9/+.-]`. + CryptDataBuilder param(String name, dynamic value) { + _params[name] = value == null ? value : value.toString(); + return this; + } + + /// Creates the [CryptData] instance. + /// + /// This also validates the parameters, and throws [ArgumentError] if + /// something is wrong. + CryptData build() { + var data = CryptData( + id, + version: _version, + salt: _salt, + hash: _hash, + params: _params.isEmpty ? null : _params, + ); + data.validate(); + return data; + } +} diff --git a/hashlib_codecs/lib/src/codecs/crypt/crypt_codec.dart b/hashlib_codecs/lib/src/codecs/crypt/crypt_codec.dart new file mode 100644 index 0000000..2e604f7 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/crypt/crypt_codec.dart @@ -0,0 +1,135 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert'; + +import 'crypt_data.dart'; + +/// Provides encoding and decoding of [PHC string format][phc] data. +/// +/// **PHC string format** is a standardized way to represent password hashes +/// generated by the competing password hashing algorithms. This format is +/// designed to ensure consistency and interoperability between different +/// password hashing implementations. +/// +/// The string format specifiction: +/// ``` +/// $[$v=][$=(,=)*][$[$]] +/// ``` +/// +/// [phc]: https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md +class CryptFormat extends Codec { + const CryptFormat(); + + @override + final encoder = const CryptEncoder(); + + @override + final decoder = const CryptDecoder(); +} + +/// The encoder used by the [CryptFormat] codec +class CryptEncoder extends Converter { + const CryptEncoder(); + + @override + String convert(CryptData input) { + input.validate(); + String result = '\$${input.id}'; + if (input.version != null && input.version!.isNotEmpty) { + result += '\$v=${input.version!}'; + } + if (input.params != null && input.params!.isNotEmpty) { + result += '\$'; + result += input.params!.entries + .map((entry) => '${entry.key}=${entry.value}') + .join(','); + } + if (input.salt != null && input.salt!.isNotEmpty) { + result += '\$'; + result += input.salt!; + } + if (input.hash != null && input.hash!.isNotEmpty) { + result += '\$'; + result += input.hash!; + } + return result; + } +} + +/// The decoder used by the [CryptFormat] codec +class CryptDecoder extends Converter { + const CryptDecoder(); + + @override + CryptData convert(String input) { + if (input.isEmpty) { + throw FormatException('Empty string'); + } + + String id, val; + List pair; + Iterable parts; + String? version, salt, hash; + Map? params; + + parts = input.split(r'$'); + if (parts.first.isNotEmpty) { + throw FormatException(r'Does not start with "$"'); + } + + parts = parts.skip(1); + id = parts.first; + + parts = parts.skip(1); + if (parts.isNotEmpty) { + val = parts.first; + if (val.startsWith('v=')) { + version = val.substring(2); + parts = parts.skip(1); + } + } + + if (parts.isNotEmpty) { + val = parts.first; + if (val.contains('=') || val.contains(',')) { + params = {}; + for (final kv in parts.first.split(',')) { + pair = kv.split('='); + if (pair.length != 2) { + throw FormatException('Invalid parameter: "$kv"'); + } + if (params.containsKey(pair[0])) { + throw FormatException('Duplicate parameter key: "${pair[0]}"'); + } + params[pair[0]] = pair[1]; + } + parts = parts.skip(1); + } + } + + if (parts.isNotEmpty) { + salt = parts.first; + parts = parts.skip(1); + } + + if (parts.isNotEmpty) { + hash = parts.first; + parts = parts.skip(1); + } + + if (parts.isNotEmpty) { + throw FormatException('Extra characters at the end'); + } + + var data = CryptData( + id, + version: version, + salt: salt, + hash: hash, + params: params, + ); + data.validate(); + return data; + } +} diff --git a/hashlib_codecs/lib/src/codecs/crypt/crypt_data.dart b/hashlib_codecs/lib/src/codecs/crypt/crypt_data.dart new file mode 100644 index 0000000..db4156a --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/crypt/crypt_data.dart @@ -0,0 +1,134 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib_codecs/src/base64.dart'; + +import 'crypt_builder.dart'; + +/// The PHC string format data +class CryptData { + /// The symbolic name for the hash function. + final String id; + + /// (Optional) The algorithm version. + final String? version; + + /// (Optional) The salt. + final String? salt; + + /// (Optional) The output hash. + final String? hash; + + /// (Optional) The algorithm parameters. + final Map? params; + + /// Creates an instance of [CryptData]. + /// + /// Paramaters: + /// - [id] The identifier name, must not exceed 32 characters in length and + /// must be a sequence of characters in: `[a-z0-9-]`. + /// - [version] (Optional) The value for the version must be a sequence of + /// characters in: `[0-9]`. + /// - [params] (Optional) A map containing name, value pairs of algorithm + /// parameters. The names must not exceed 32 characters in length and must + /// be a sequence of characters in: `[a-z0-9-]`, the values must be a + /// sequence of characters in: `[a-zA-Z0-9/+.-]`. + /// - [salt] (Optional) The salt bytes. + /// - [hash] (Optional) The output hash bytes. + const CryptData( + this.id, { + this.salt, + this.hash, + this.version, + this.params, + }); + + /// Returns a [CryptDataBuilder] instance for [id]. + /// + /// Parameters: + /// - [id] : The identifier name, which must not exceed 32 characters in + /// length and must be a sequence of characters in `[a-z0-9-]`. + /// + /// Good identifiers should be should be explicit (human readable, not a + /// single digit), with a length of about 5 to 10 characters. + static CryptDataBuilder builder(String id) => CryptDataBuilder(id); + + /// Parse the [salt] using standard Base-64 codec + Uint8List? saltBytes() => + salt == null ? null : fromBase64(salt!, padding: false); + + /// Parse the [hash] using standard Base-64 codec + Uint8List? hashBytes() => + hash == null ? null : fromBase64(hash!, padding: false); + + /// Get the version as integer + int? versionInt() => version == null ? null : int.tryParse(version!); + + /// Check if the [key] parameter exists + bool hasParam(String key) => + params == null ? false : params!.containsKey(key); + + /// Get the value of a paramter by [key] + String? getParam(String key) => params?[key]; + + /// Get the value of a paramter by [key] as integer + int? getIntParam(String key) { + var val = getParam(key); + return val == null ? null : int.tryParse(val); + } + + /// Validate this PHC string. + /// Throws [ArgumentError] when any field is invalid. + void validate() { + final digitRe = RegExp(r'^[0-9]+$'); + final alnumRe = RegExp(r'^[a-z0-9-]{1,32}$'); + final base64Re = RegExp(r'^[a-zA-Z0-9/+.-]+$'); + + // id + if (!alnumRe.hasMatch(id)) { + throw ArgumentError.value( + id, 'id', 'must be [a-z0-9-] and under 32 characters'); + } + + // version (optional) + if (version != null && !digitRe.hasMatch(version!)) { + throw ArgumentError.value(version, 'version', 'must be decimal digits'); + } + + // params (optional) + if (params != null) { + for (final e in params!.entries) { + final k = e.key; + final v = e.value; + if (!alnumRe.hasMatch(k)) { + throw ArgumentError.value( + k, 'params.key', 'must be [a-z0-9-] and under 32 chars'); + } + if (k == 'v') { + throw ArgumentError.value( + k, 'params.key', 'reserved; use version field instead'); + } + if (v.isEmpty) { + throw ArgumentError.value(v, 'params[$k]', 'value is empty'); + } else if (!base64Re.hasMatch(v)) { + throw ArgumentError.value( + v, 'params[$k]', 'value has invalid characters'); + } + } + } + + // salt (optional) + if (salt != null && !base64Re.hasMatch(salt!)) { + throw ArgumentError.value( + salt, 'salt', 'expected base64 string without padding'); + } + + // hash (optional) + if (hash != null && !base64Re.hasMatch(hash!)) { + throw ArgumentError.value( + hash, 'hash', 'expected base64 string without padding'); + } + } +} diff --git a/hashlib_codecs/lib/src/codecs/utf8.dart b/hashlib_codecs/lib/src/codecs/utf8.dart new file mode 100644 index 0000000..df2e34c --- /dev/null +++ b/hashlib_codecs/lib/src/codecs/utf8.dart @@ -0,0 +1,219 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'package:hashlib_codecs/hashlib_codecs.dart'; + +/* + Char. number range | UTF-8 octet sequence + --------------------+------------------------------------ + 0000 0000-0000 007F | 0xxxxxxx + 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx +*/ + +const int _range1 = 0x0000007F; +const int _range2 = 0x000007FF; +const int _range3 = 0x0000FFFF; +const int _range4 = 0x0010FFFF; + +// ======================================================== +// UTF-8 Encoder and Decoder +// ======================================================== + +class _UTF8Encoder extends BitEncoder { + const _UTF8Encoder(); + + @override + int get source => 32; + + @override + int get target => 8; + + @override + Uint8List convert(List input) { + List out = []; + int len = input.length; + for (int x, y, p = 0; p < len; ++p) { + x = input[p]; + // check negative code + if (x < 0) { + throw FormatException('Negative code $x at $p'); + } + // UTF-16 surrogate pairs + if (x >= 0xD800 && x <= 0xDBFF) { + if (p + 1 >= len) { + throw FormatException('Unpaired high surrogate $x at $p'); + } + y = input[++p]; + if (y < 0xDC00 || y > 0xDFFF) { + throw FormatException('Invalid surrogate pair $x,$y at ${p - 1}'); + } + x = 0x10000 + (((x - 0xD800) << 10) | (y - 0xDC00)); + } else if (x >= 0xDC00 && x <= 0xDFFF) { + throw FormatException('Unpaired low surrogate $x at $p'); + } + // extract bytes + if (x <= _range1) { + out.add(x & 0x7F); + } else if (x <= _range2) { + out.add(0xC0 | ((x >>> 6) & 0x1F)); + out.add(0x80 | (x & 0x3F)); + } else if (x <= _range3) { + out.add(0xE0 | ((x >>> 12) & 0xF)); + out.add(0x80 | ((x >>> 6) & 0x3F)); + out.add(0x80 | (x & 0x3F)); + } else if (x <= _range4) { + out.add(0xF0 | ((x >>> 18) & 0x7)); + out.add(0x80 | ((x >>> 12) & 0x3F)); + out.add(0x80 | ((x >>> 6) & 0x3F)); + out.add(0x80 | (x & 0x3F)); + } else { + throw FormatException('Invalid code $x at $p'); + } + } + return Uint8List.fromList(out); + } +} + +class _UTF8Decoder extends BitDecoder { + const _UTF8Decoder(); + + @override + int get source => 8; + + @override + int get target => 32; + + @override + List convert(List encoded) { + List out = []; + int len = encoded.length; + for (int x, y, z, p = 0; p < len; ++p) { + x = encoded[p]; + + // Case: 1-byte + if (x <= 0x7F) { + out.add(x); + } + // Case: 2-bytes + else if ((x & 0xE0) == 0xC0) { + if (x < 0xC2) { + throw FormatException('Overlong 2-byte sequence at $p'); + } + if (p + 1 >= len) { + throw FormatException('Insufficient input'); + } + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } + + y = ((x & 0x1F) << 6) | z; + out.add(y); + } + // Case: 3-bytes + else if ((x & 0xF0) == 0xE0) { + if (p + 2 >= len) { + throw FormatException('Insufficient input'); + } + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } else if (x == 0xE0 && z < 0xA0) { + throw FormatException('Overlong 3-byte sequence at ${p - 1}'); + } + + y = (x & 0xF) << 12; + y |= (z & 0x3F) << 6; + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } + + y |= z & 0x3F; + if (y >= 0xD800 && y <= 0xDFFF) { + throw FormatException('Invalid surrogate $y at ${p - 2}'); + } + + out.add(y); + } + // Case: 4-byte + else if ((x & 0xF8) == 0xF0) { + if (x > 0xF4) { + throw FormatException('Invalid 4-byte lead $x at $p'); + } + if (p + 3 >= len) { + throw FormatException('Insufficient input'); + } + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } else if (x == 0xF0 && z < 0x90) { + throw FormatException('Overlong 4-byte sequence at ${p - 1}'); + } + + y = (x & 0x7) << 18; + y |= (z & 0x3F) << 12; + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } + + y |= (z & 0x3F) << 6; + + z = encoded[++p]; + if (((z & 0xC0) != 0x80)) { + throw FormatException('Invalid continuation byte $z at $p'); + } + + y |= z & 0x3F; + if (y > _range4) { + throw FormatException('Above U+10FFFF at ${p - 3}'); + } + + out.add(y); + } + // Case: 5 or more bytes + else { + throw FormatException('Invalid code $x at $p'); + } + } + return out; + } +} + +// ======================================================== +// UTF-8 Codec +// ======================================================== + +class UTF8Codec extends IterableCodec { + @override + final BitEncoder encoder; + + @override + final BitDecoder decoder; + + const UTF8Codec._({ + required this.encoder, + required this.decoder, + }); + + /// Codec instance to encode and decode UTF-8 character code units to 8-bit + /// UTF-8 octet sequence. + /// + /// This implementation is based on [RFC-3629][rfc] + /// + /// [rfc]: https://datatracker.ietf.org/doc/html/rfc3629 + static const UTF8Codec standard = UTF8Codec._( + encoder: _UTF8Encoder(), + decoder: _UTF8Decoder(), + ); +} diff --git a/hashlib_codecs/lib/src/codecs_base.dart b/hashlib_codecs/lib/src/codecs_base.dart new file mode 100644 index 0000000..1a421d1 --- /dev/null +++ b/hashlib_codecs/lib/src/codecs_base.dart @@ -0,0 +1,21 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +export 'base16.dart'; +export 'base2.dart'; +export 'base32.dart'; +export 'base64.dart'; +export 'base8.dart'; +export 'bigint.dart'; +export 'codecs/base16.dart'; +export 'codecs/base2.dart'; +export 'codecs/base32.dart'; +export 'codecs/base64.dart'; +export 'codecs/base8.dart'; +export 'codecs/bigint.dart'; +export 'codecs/utf8.dart'; +export 'core/codec.dart'; +export 'core/decoder.dart'; +export 'core/encoder.dart'; +export 'crypt.dart'; +export 'utf8.dart'; diff --git a/hashlib_codecs/lib/src/core/alphabet.dart b/hashlib_codecs/lib/src/core/alphabet.dart new file mode 100644 index 0000000..1d0fb7a --- /dev/null +++ b/hashlib_codecs/lib/src/core/alphabet.dart @@ -0,0 +1,100 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'byte.dart'; +import 'decoder.dart'; + +class AlphabetEncoder extends ByteEncoder { + final List alphabet; + + /// The padding character. + /// + /// The output array will be padded with this character to make the length + /// of the array to be divisible by [source]. + final int? padding; + + /// Creates a new [AlphabetEncoder] instance. + /// + /// Parameters: + /// - [bits] is bit-length of a single word in the output + /// - The [alphabet] contains mapping from input word to output word. + /// - The output array will be padded with the [padding] to make the length of + /// the array to be divisible by [source]. + const AlphabetEncoder({ + required int bits, + required this.alphabet, + this.padding, + }) : super(bits: bits); + + @override + int get target => bits; + + @override + Uint8List convert(List input) { + int i, n; + var encoded = super.convert(input) as Uint8List; + n = encoded.length; + for (i = 0; i < n; ++i) { + encoded[i] = alphabet[encoded[i]]; + } + if (padding == null) { + return encoded; + } + + n = encoded.length; + for (i = n * target; (i & 7) != 0; i += target) { + n++; + } + var out = Uint8List(n); + for (i = 0; i < encoded.length; ++i) { + out[i] = encoded[i]; + } + for (; i < n; ++i) { + out[i] = padding!; + } + return out; + } +} + +class AlphabetDecoder extends BitDecoder { + final int bits; + final List alphabet; + + @override + final int target = 8; + + /// The padding character. + /// + /// The conversion will stop immediately upon encountering this character. + final int? padding; + + /// Creates a new [AlphabetDecoder] instance. + /// + /// Parameters: + /// - [bits] is bit-length of a single word in the output + /// - The [alphabet] contains mapping from input word to output word. + /// - If [padding] is not null, conversion will stop immediately upon + /// encountering this character. + const AlphabetDecoder({ + required this.bits, + required this.alphabet, + this.padding, + }); + + @override + int get source => bits; + + @override + List convert(List encoded) { + int x; + return super.convert(encoded.map((y) { + if (y == padding) return -1; + if (y < 0 || y >= alphabet.length || (x = alphabet[y]) < 0) { + throw FormatException('Invalid character $y'); + } + return x; + }).toList()); + } +} diff --git a/hashlib_codecs/lib/src/core/byte.dart b/hashlib_codecs/lib/src/core/byte.dart new file mode 100644 index 0000000..8b4ffb0 --- /dev/null +++ b/hashlib_codecs/lib/src/core/byte.dart @@ -0,0 +1,49 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'decoder.dart'; +import 'encoder.dart'; + +abstract class ByteEncoder extends BitEncoder { + final int bits; + + /// Creates a new [ByteEncoder] instance. + /// + /// Parameters: + /// - [bits] is bit-length of a single word in the output + const ByteEncoder({ + required this.bits, + }); + + @override + final int source = 8; + + @override + int get target => bits; + + @override + Uint8List convert(List input); +} + +abstract class ByteDecoder extends BitDecoder { + final int bits; + + /// Creates a new [ByteDecoder] instance. + /// + /// Parameters: + /// - [bits] is bit-length of a single word in the output + const ByteDecoder({ + required this.bits, + }); + + @override + int get source => bits; + + @override + final int target = 8; + + @override + Uint8List convert(List encoded); +} diff --git a/hashlib_codecs/lib/src/core/codec.dart b/hashlib_codecs/lib/src/core/codec.dart new file mode 100644 index 0000000..3a142e4 --- /dev/null +++ b/hashlib_codecs/lib/src/core/codec.dart @@ -0,0 +1,58 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:convert' show Codec, Converter; +import 'dart:typed_data'; + +import 'decoder.dart'; +import 'encoder.dart'; + +/// Base class for encoding from and to 8-bit integer sequence +abstract class IterableCodec extends Codec, Iterable> { + /// Creates a new [IterableCodec] instance. + const IterableCodec(); + + @override + BitEncoder get encoder; + + @override + BitDecoder get decoder; + + /// Encodes an [input] string using this codec + @pragma('vm:prefer-inline') + Iterable encodeString(String input) => encode(input.codeUnits); + + /// Decodes an [encoded] string using this codec + @pragma('vm:prefer-inline') + Iterable decodeString(String encoded) => decode(encoded.codeUnits); + + /// Encodes an [input] buffer using this codec + @pragma('vm:prefer-inline') + Iterable encodeBuffer(ByteBuffer input) => encode(input.asUint8List()); + + /// Decodess an [encoded] buffer using this codec + @pragma('vm:prefer-inline') + Iterable decodeBuffer(ByteBuffer encoded) => + decode(encoded.asUint8List()); +} + +/// Base class for bit-wise encoder and decoder implementation +abstract class HashlibConverter + extends Converter, Iterable> { + /// Creates a new [HashlibConverter] instance. + const HashlibConverter(); + + /// The bit-length of the input array elements. + /// The value should be between 2 to 64. + int get source; + + /// The bit-length of the output array elements. + /// The value should be between 2 to 64. + int get target; + + /// Converts [input] array of numbers with bit-length of [source] to an array + /// of numbers with bit-length of [target]. The [input] array will be treated + /// as a sequence of bits to convert. + @override + Iterable convert(Iterable input); +} diff --git a/hashlib_codecs/lib/src/core/decoder.dart b/hashlib_codecs/lib/src/core/decoder.dart new file mode 100644 index 0000000..999c612 --- /dev/null +++ b/hashlib_codecs/lib/src/core/decoder.dart @@ -0,0 +1,63 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codec.dart'; + +abstract class BitDecoder extends HashlibConverter { + /// Creates a new [BitDecoder] instance. + const BitDecoder(); + + /// Converts [encoded] array of numbers with bit-length of [source] to an array + /// of numbers with bit-length of [target]. The [encoded] array will be treated + /// as a sequence of bits to convert. + /// + /// If the [encoded] array contains negative numbers or numbers having more than + /// the [source] bits, it will be treated as the end of the input sequence. + /// + /// After consuming all of input sequence, if there are some non-zero partial + /// word remains, it will throw [FormatException]. + @override + List convert(covariant List encoded) { + int x, p, s, t, l, n, sb, tb; + sb = source; + tb = target; + if (sb < 2 || sb > 64) { + throw ArgumentError('The source bit length should be between 2 to 64'); + } + if (tb < 2 || tb > 64) { + throw ArgumentError('The target bit length should be between 2 to 64'); + } + + l = encoded.length * sb; + var out = Uint8List(l ~/ tb); + + // generate words from the input bits + p = n = t = l = 0; + s = 1 << (sb - 1); + s = s ^ (s - 1); + for (x in encoded) { + if (x < 0 || x > s) break; + p = (p << sb) ^ x; + t = (t << sb) ^ s; + n += sb; + while (n >= tb) { + n -= tb; + out[l++] = p >>> n; + t >>>= tb; + p &= t; + } + } + + // p > 0 means that there is a non-zero partial word remaining + if (p > 0) { + throw FormatException('Invalid length'); + } + + if (l < out.length) { + return out.sublist(0, l); + } + return out; + } +} diff --git a/hashlib_codecs/lib/src/core/encoder.dart b/hashlib_codecs/lib/src/core/encoder.dart new file mode 100644 index 0000000..db57f0a --- /dev/null +++ b/hashlib_codecs/lib/src/core/encoder.dart @@ -0,0 +1,59 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codec.dart'; + +abstract class BitEncoder extends HashlibConverter { + /// Creates a new [BitEncoder] instance. + const BitEncoder(); + + /// Converts [input] array of numbers with bit-length of [source] to an array + /// of numbers with bit-length of [target]. The [input] array will be treated + /// as a sequence of bits to convert. + /// + /// After consuming all of input sequence, if there are some non-zero partial + /// word remains, 0 will be padded on the right to make the final word. + @override + List convert(covariant List input) { + int x, p, s, t, l, n, sb, tb; + sb = source; + tb = target; + if (sb < 2 || sb > 64) { + throw ArgumentError('The source bit length should be between 2 to 64'); + } + if (tb < 2 || tb > 64) { + throw ArgumentError('The target bit length should be between 2 to 64'); + } + + l = input.length * sb; + n = l ~/ tb; + if (n * tb < l) n++; + var out = Uint8List(n); + + // generate words from the input bits + p = n = l = t = 0; + s = 1 << (sb - 1); + s = s ^ (s - 1); + for (x in input) { + p = (p << sb) ^ (x & s); + t = (t << sb) ^ s; + n += sb; + while (n >= tb) { + n -= tb; + out[l++] = p >>> n; + t >>>= tb; + p &= t; + } + } + + // n > 0 means that there is a partial word remaining. + if (n > 0) { + // pad the word with 0 on the right to make the final word + out[l++] = p << (tb - n); + } + + return out; + } +} diff --git a/hashlib_codecs/lib/src/crypt.dart b/hashlib_codecs/lib/src/crypt.dart new file mode 100644 index 0000000..8666d03 --- /dev/null +++ b/hashlib_codecs/lib/src/crypt.dart @@ -0,0 +1,22 @@ +// Copyright (c) 2023, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'codecs/crypt/crypt.dart'; + +export 'codecs/crypt/crypt.dart'; + +/// An instance of [CryptFormat] for encoding and decoding hash algorithm output +/// with [PHC string format][phc] +/// +/// [phc]: https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md +const crypt = CryptFormat(); + +/// Encodes a hash algorithm output to string following PHC string format. +String toCrypt(CryptData input) { + return crypt.encoder.convert(input); +} + +/// Decodes a string to an hash algorithm config following PHC string format. +CryptData fromCrypt(String input) { + return crypt.decoder.convert(input); +} diff --git a/hashlib_codecs/lib/src/utf8.dart b/hashlib_codecs/lib/src/utf8.dart new file mode 100644 index 0000000..f2e4e23 --- /dev/null +++ b/hashlib_codecs/lib/src/utf8.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2024, Sudipto Chandra +// All rights reserved. Check LICENSE file for details. + +import 'dart:typed_data'; + +import 'codecs/utf8.dart'; + +/// Converts UTF-8 character code points to 8-bit UTF-8 octet sequence. +/// +/// Parameters: +/// - [input] is a sequence of UTF-8 character code points. +/// - [codec] is the [UTF8Codec] to use. +Uint8List toUtf8( + String input, { + UTF8Codec codec = UTF8Codec.standard, +}) { + var out = codec.encoder.convert(input.codeUnits); + return Uint8List.fromList(out); +} + +/// Converts 8-bit UTF-8 octet sequence to UTF-8 character code points. +/// +/// Parameters: +/// - [input] should be a valid UTF-8 octet sequence. +/// - [codec] is the [UTF8Codec] to use. +/// +/// Throws: +/// - [FormatException] if the [input] contains invalid characters. +/// +/// This implementation can handle both uppercase and lowercase alphabets. If a +/// partial string is detected, the following bits are assumed to be zeros. +String fromUtf8( + List input, { + UTF8Codec codec = UTF8Codec.standard, +}) { + var out = codec.decoder.convert(input); + return String.fromCharCodes(out); +} diff --git a/hashlib_codecs/pubspec.yaml b/hashlib_codecs/pubspec.yaml new file mode 100644 index 0000000..946c943 --- /dev/null +++ b/hashlib_codecs/pubspec.yaml @@ -0,0 +1,25 @@ +name: hashlib_codecs +description: Fast and error resilient codecs. Currently supporting Binary(Base2), Hexadecimal(Base16), Base32, Base64, BigInt. +homepage: https://github.com/bitanon/hashlib_codecs +version: 3.0.1 + +environment: + sdk: '>=2.19.0 <4.0.0' + +platforms: + android: + ios: + linux: + macos: + web: + windows: + +dev_dependencies: + lints: ^1.0.1 + test: ^1.21.4 + benchmark_harness: ^2.2.1 + base_codecs: ^1.0.1 + base32: ^2.1.3 + +funding: + - https://paypal.me/sd1pu diff --git a/hashlib_codecs/test/base16_test.dart b/hashlib_codecs/test/base16_test.dart new file mode 100644 index 0000000..75594a4 --- /dev/null +++ b/hashlib_codecs/test/base16_test.dart @@ -0,0 +1,173 @@ +import 'package:base_codecs/base_codecs.dart' as base_codecs; +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base16', () { + test('parameter overrides', () { + var a = toHex([12]); + expect(a, "0c"); + a = toHex( + [12], + codec: Base16Codec.upper, + ); + expect(a, "0C"); + a = toHex( + [12], + codec: Base16Codec.lower, + upper: true, + ); + expect(a, "0c"); + }); + + test('encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toHex(b); + expect(fromHex(r), equals(b), reason: 'length $i'); + } + }); + + test('encoding <-> decoding uppercase', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toHex(b, upper: true); + expect(fromHex(r), equals(b), reason: 'length $i'); + } + }); + + group("encoding", () { + test('[] => empty string', () { + expect(toHex([]), ""); + }); + test('[5] => 05', () { + expect(toHex([5]), "05"); + }); + test('[12] => 0c', () { + expect(toHex([12]), "0c"); + }); + test('[16] => 10', () { + expect(toHex([16]), "10"); + }); + test('[0,0,0] => 000000 ', () { + var inp = [0, 0, 0]; + var out = "000000"; + expect(toHex(inp), equals(out)); + }); + test('random', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hex = b.map((x) => x.toRadixString(16).padLeft(2, '0')).join(); + expect(toHex(b), hex, reason: 'length $i'); + } + }); + group('buffer', () { + var buf = [ + 244, 11, 21, 63, 222, 56, 63, 111, 57, 64, 22, 56, 32, // + 55, 115, 178, 138, 230, 251 + ]; + var lowerHex = "f40b153fde383f6f39401638203773b28ae6fb"; + var upperHex = "F40B153FDE383F6F39401638203773B28AE6FB"; + test("lower", () { + expect(toHex(buf), lowerHex); + }); + test("upper", () { + expect(toHex(buf, upper: true), upperHex); + }); + }); + }); + + group("decoding", () { + test('empty string => []', () { + expect(fromHex(""), []); + }); + test('5 => [5]', () { + expect(fromHex("5"), [5]); + }); + test('c => [12]', () { + expect(fromHex("c"), [12]); + }); + test('0c => [12]', () { + expect(fromHex("0c"), [12]); + }); + test('00c => [0, 12]', () { + expect(fromHex("00c"), [0, 12]); + }); + test('000c => [0, 12]', () { + expect(fromHex("000c"), [0, 12]); + }); + test('0000c => [0, 0, 12]', () { + expect(fromHex("0000c"), [0, 0, 12]); + }); + test('000000 => [0,0,0]', () { + var inp = [0, 0, 0]; + var out = "000000"; + expect(fromHex(out), equals(inp)); + }); + test('random', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hex = b.map((x) => x.toRadixString(16).padLeft(2, '0')).join(); + expect(fromHex(hex), equals(b), reason: 'length $i'); + } + }); + + group('buffer', () { + var buf = [ + 244, 11, 21, 63, 222, 56, 63, 111, 57, 64, 22, 56, 32, // + 55, 115, 178, 138, 230, 251 + ]; + var lowerHex = "f40b153fde383f6f39401638203773b28ae6fb"; + var upperHex = "F40B153FDE383F6F39401638203773B28AE6FB"; + test("lower", () { + expect(fromHex(lowerHex), equals(buf)); + }); + test("upper", () { + expect(fromHex(upperHex), equals(buf)); + }); + }); + group('with invalid chars', () { + test('Error', () { + expect(() => fromHex("Error"), throwsFormatException); + }); + test('-10', () { + expect(() => fromHex("-10"), throwsFormatException); + }); + test('something', () { + expect(() => fromHex("something"), throwsFormatException); + }); + }); + }); + + group('compare against package: base_codecs', () { + test('encoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hashlib = toHex(b, upper: true); + var base = base_codecs.base16.encode(b); + expect(base, hashlib, reason: 'length $i'); + } + }); + test('decoding (lowercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toHex(b); + var hashlib = fromHex(h); + var base = base_codecs.base16.decode(h); + expect(base, hashlib, reason: 'length $i'); + } + }); + test('decoding (uppercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toHex(b, upper: true); + var hashlib = fromHex(h); + var base = base_codecs.base16.decode(h); + expect(base, hashlib, reason: 'length $i'); + } + }); + }); + }); +} diff --git a/hashlib_codecs/test/base2_test.dart b/hashlib_codecs/test/base2_test.dart new file mode 100644 index 0000000..fd75d11 --- /dev/null +++ b/hashlib_codecs/test/base2_test.dart @@ -0,0 +1,87 @@ +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base2', () { + group("encoding", () { + test('[] => empty string', () { + expect(toBinary([]), ""); + }); + test('[1] => 00000001', () { + expect(toBinary([1]), "00000001"); + }); + test('[7] => 00000111', () { + expect(toBinary([7]), "00000111"); + }); + test('[10] => 00001010', () { + expect(toBinary([10]), "00001010"); + }); + test('[0,10] => 00001010', () { + expect(toBinary([0, 10]), "0000000000001010"); + }); + test('random', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = b.map((x) => x.toRadixString(2).padLeft(8, '0')).join(); + expect(toBinary(b), equals(r), reason: 'length $i'); + } + }); + }); + group("decoding", () { + test('empty string => []', () { + expect(fromBinary(""), []); + }); + test('1010 => [10]', () { + expect(fromBinary("1010"), [10]); + }); + test('01010 => [10]', () { + expect(fromBinary("01010"), [10]); + }); + test('0001010 => [10]', () { + expect(fromBinary("0001010"), [10]); + }); + test('00001010 => [10]', () { + expect(fromBinary("00001010"), [10]); + }); + test('000001010 => [0, 10]', () { + expect(fromBinary("000001010"), [0, 10]); + }); + test('0000000001010 => [0, 10]', () { + expect(fromBinary("0000000001010"), [0, 10]); + }); + test('100001010 => [1, 10]', () { + expect(fromBinary("100001010"), [1, 10]); + }); + test('10000001010 => [4, 10]', () { + expect(fromBinary("10000001010"), [4, 10]); + }); + test('random', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = b.map((x) => x.toRadixString(2).padLeft(8, '0')).join(); + expect(fromBinary(r), equals(b), reason: 'length $i'); + } + }); + }); + test('encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBinary(b); + expect(fromBinary(r), equals(b), reason: 'length $i'); + } + }); + group('decoding with invalid chars', () { + test('0158', () { + expect(() => fromBinary("0158"), throwsFormatException); + }); + test('-10', () { + expect(() => fromBinary("-10"), throwsFormatException); + }); + test('01a1', () { + expect(() => fromBinary("01a1"), throwsFormatException); + }); + }); + }); +} diff --git a/hashlib_codecs/test/base32_test.dart b/hashlib_codecs/test/base32_test.dart new file mode 100644 index 0000000..38da483 --- /dev/null +++ b/hashlib_codecs/test/base32_test.dart @@ -0,0 +1,457 @@ +import 'package:base32/base32.dart' as base32; +import 'package:base32/encodings.dart'; +import 'package:base_codecs/base_codecs.dart' as base_codecs; +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base32', () { + // source: https://github.com/daegalus/dart-base32 + test('parameter overrides', () { + var s = 'foobar'; + var r = 'MZXW6YTBOI======'; + var np = 'MZXW6YTBOI'; + var a = toBase32(s.codeUnits); + expect(a, equals(r)); + a = toBase32( + s.codeUnits, + codec: Base32Codec.standard, + padding: false, + ); + expect(a, equals(np)); + a = toBase32( + s.codeUnits, + codec: Base32Codec.standard, + lower: true, + ); + expect(a, equals(r)); + a = toBase32( + s.codeUnits, + codec: Base32Codec.standard, + padding: false, + lower: true, + ); + expect(a, equals(np)); + }); + + group('encoding <-> decoding', () { + test('standard', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b); + expect(r.toUpperCase(), equals(r), reason: 'length $i'); + var a = fromBase32(r); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('lowercase', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, lower: true); + expect(r.toLowerCase(), equals(r), reason: 'length $i'); + var a = fromBase32(r); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('standard no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, padding: false); + expect(r.toUpperCase(), equals(r), reason: 'length $i'); + expect(r, isNot(endsWith('=')), reason: 'length $i'); + var a = fromBase32(r); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('hex uppercase', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.hex); + var a = fromBase32(r, codec: Base32Codec.hex); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('hex lowercase', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.hexLower); + var a = fromBase32(r, codec: Base32Codec.hexLower); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('crockford', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.crockford); + expect(r, isNot(endsWith('=')), reason: 'length $i'); + var a = fromBase32(r, codec: Base32Codec.crockford); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('geohash', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.geohash); + expect(r.toLowerCase(), equals(r), reason: 'length $i'); + var a = fromBase32(r, codec: Base32Codec.geohash); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('geohash no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.geohash, padding: false); + expect(r, isNot(endsWith('=')), reason: 'length $i'); + var a = fromBase32(r, codec: Base32Codec.geohash); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('word-safe', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.wordSafe); + var a = fromBase32(r, codec: Base32Codec.wordSafe); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('word-safe no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.wordSafe, padding: false); + expect(r, isNot(endsWith('=')), reason: 'length $i'); + var a = fromBase32(r, codec: Base32Codec.wordSafe); + expect(a, equals(b), reason: 'length $i'); + } + }); + test('z-base-32', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase32(b, codec: Base32Codec.z); + expect(r, isNot(endsWith('=')), reason: 'length $i'); + var a = fromBase32(r, codec: Base32Codec.z); + expect(a, equals(b), reason: 'length $i'); + } + }); + }); + + group('encoding', () { + group('no padding', () { + test('"" -> ""', () { + var s = ''; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('')); + }); + test('f -> MY', () { + var s = 'f'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MY')); + }); + test('fo -> MZXQ', () { + var s = 'fo'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MZXQ')); + }); + test('foo -> MZXW6', () { + var s = 'foo'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MZXW6')); + }); + test('foob -> MZXW6YQ', () { + var s = 'foob'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MZXW6YQ')); + }); + test('fooba -> MZXW6YTB', () { + var s = 'fooba'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MZXW6YTB')); + }); + test('foobar -> MZXW6YTBOI', () { + var s = 'foobar'; + var a = toBase32(s.codeUnits, padding: false); + expect(a, equals('MZXW6YTBOI')); + }); + test('[0, 0, 0] => AAAAA', () { + var inp = [0, 0, 0]; + var out = "AAAAA"; + var act = toBase32(inp, padding: false); + expect(act, equals(out)); + }); + test('48656c6c6f21deadbeef -> JBSWY3DPEHPK3PXP', () { + var encoded = fromHex('48656c6c6f21deadbeef'); + var actual = toBase32(encoded, padding: false); + expect(actual, equals('JBSWY3DPEHPK3PXP')); + }); + test('48656c6c6f21deadbe -> JBSWY3DPEHPK3PQ', () { + var encoded = fromHex('48656c6c6f21deadbe'); + var actual = toBase32(encoded, padding: false); + expect(actual, equals('JBSWY3DPEHPK3PQ')); + }); + test('foobar --lower--> mzxw6ytboi', () { + var text = 'foobar'; + var actual = toBase32(text.codeUnits, padding: false, lower: true); + expect(actual, equals('mzxw6ytboi')); + }); + test('48656c6c6f21deadbeef --lower--> jbswy3dpehpk3pxp', () { + var text = fromHex('48656c6c6f21deadbeef'); + var actual = toBase32(text, padding: false, lower: true); + expect(actual, equals('jbswy3dpehpk3pxp')); + }); + }); + group('with padding', () { + test('f -> MY======', () { + var s = 'f'; + var r = 'MY======'; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('fo -> MZXQ====', () { + var s = 'fo'; + var r = 'MZXQ===='; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('foo -> MZXW6===', () { + var s = 'foo'; + var r = 'MZXW6==='; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('foob -> MZXW6YQ=', () { + var s = 'foob'; + var r = 'MZXW6YQ='; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('foobar -> MZXW6YTBOI======', () { + var s = 'foobar'; + var r = 'MZXW6YTBOI======'; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('48656c6c6f21deadbe -> JBSWY3DPEHPK3PQ=', () { + var s = String.fromCharCodes(fromHex('48656c6c6f21deadbe')); + var r = 'JBSWY3DPEHPK3PQ='; + expect(toBase32(s.codeUnits), equals(r)); + }); + test('[0, 0, 0] => AAAAA===', () { + var inp = [0, 0, 0]; + var out = "AAAAA==="; + expect(toBase32(inp), equals(out)); + }); + }); + }); + + group('decoding', () { + group('no padding', () { + test('"" -> ""', () { + var s = ''; + expect(fromBase32(''), equals(s.codeUnits)); + }); + test('MY -> f', () { + var s = 'f'; + expect(fromBase32('MY'), equals(s.codeUnits)); + }); + test('MZXQ -> fo', () { + var s = 'fo'; + expect(fromBase32('MZXQ'), equals(s.codeUnits)); + }); + test('MZXW6 -> foo', () { + var s = 'foo'; + expect(fromBase32('MZXW6'), equals(s.codeUnits)); + }); + test('MZXW6YQ -> foob', () { + var s = 'foob'; + expect(fromBase32('MZXW6YQ'), equals(s.codeUnits)); + }); + test('MZXW6YTB -> fooba', () { + var s = 'fooba'; + expect(fromBase32('MZXW6YTB'), equals(s.codeUnits)); + }); + test('MZXW6YTBOI -> foobar', () { + var s = 'foobar'; + expect(fromBase32('MZXW6YTBOI'), equals(s.codeUnits)); + }); + test('JBSWY3DPEHPK3PXP -> 48656c6c6f21deadbeef', () { + var decoded = fromBase32('JBSWY3DPEHPK3PXP'); + expect(toHex(decoded), equals('48656c6c6f21deadbeef')); + }); + test('JBSWY3DPEHPK3PQ -> 48656c6c6f21deadbe', () { + var decoded = fromBase32('JBSWY3DPEHPK3PQ'); + expect(toHex(decoded), equals('48656c6c6f21deadbe')); + }); + test('mzxw6ytboi -> foobar', () { + var s = 'foobar'; + expect(fromBase32('mzxw6ytboi'), equals(s.codeUnits)); + }); + test('jbswy3dpehpk3pxp -> 48656c6c6f21deadbeef', () { + var decoded = fromBase32('jbswy3dpehpk3pxp'); + expect(toHex(decoded), equals('48656c6c6f21deadbeef')); + }); + test('jbswy3dpehpk3pq -> 48656c6c6f21deadbe', () { + var decoded = fromBase32('jbswy3dpehpk3pq'); + expect(toHex(decoded), equals('48656c6c6f21deadbe')); + }); + }); + group('with padding', () { + test('MY====== -> f', () { + var s = 'MY======'; + var r = 'f'; + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('MZXQ==== -> fo', () { + var s = 'MZXQ===='; + var r = 'fo'; + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('MZXW6=== -> foo', () { + var s = 'MZXW6==='; + var r = 'foo'; + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('MZXW6YQ= -> foob', () { + var s = 'MZXW6YQ='; + var r = 'foob'; + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('MZXW6YTBOI====== -> foobar', () { + var s = 'MZXW6YTBOI======'; + var r = 'foobar'; + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('JBSWY3DPEHPK3PQ= -> 48656c6c6f21deadbe', () { + var s = 'JBSWY3DPEHPK3PQ='; + var r = String.fromCharCodes(fromHex('48656c6c6f21deadbe')); + expect(fromBase32(s), equals(r.codeUnits)); + }); + test('AAAA => [0, 0, 0]', () { + var inp = [0, 0, 0]; + var out = "AAAAA==="; + expect(fromBase32(out), equals(inp)); + }); + }); + group(' with invalid chars', () { + test('"Error!"', () { + expect(() => fromBase32("Error!"), throwsFormatException); + }); + test('"-10"', () { + expect(() => fromBase32("-10"), throwsFormatException); + }); + test('"s*mething"', () { + expect(() => fromBase32("s*mething"), throwsFormatException); + }); + }); + group('with invalid length', () { + test('"1"', () { + expect(() => fromBase32("1"), throwsFormatException); + }); + test('"12"', () { + expect(() => fromBase32("12"), throwsFormatException); + }); + test('"123"', () { + expect(() => fromBase32("123"), throwsFormatException); + }); + test('"1234"', () { + expect(() => fromBase32("1234"), throwsFormatException); + }); + test('"12345"', () { + expect(() => fromBase32("12345"), throwsFormatException); + }); + test('"123456"', () { + expect(() => fromBase32("123456"), throwsFormatException); + }); + test('"1234567"', () { + expect(() => fromBase32("1234567"), throwsFormatException); + }); + test('"123456789"', () { + expect(() => fromBase32("123456789"), throwsFormatException); + }); + test('"1234567890"', () { + expect(() => fromBase32("1234567890"), throwsFormatException); + }); + test('"12345678901"', () { + expect(() => fromBase32("12345678901"), throwsFormatException); + }); + test('"123456789012"', () { + expect(() => fromBase32("123456789012"), throwsFormatException); + }); + test('"1234567890123"', () { + expect(() => fromBase32("1234567890123"), throwsFormatException); + }); + test('"12345678901234"', () { + expect(() => fromBase32("12345678901234"), throwsFormatException); + }); + test('"123456789012345"', () { + expect(() => fromBase32("123456789012345"), throwsFormatException); + }); + }); + }); + + group('compare against package: base_codecs', () { + test('encoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hashlib = toBase32(b); + var other = base_codecs.base32RfcEncode(b); + expect(hashlib, other, reason: 'length $i'); + } + }); + test('decoding (uppercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toBase32(b); + var hashlib = fromBase32(h); + var other = base_codecs.base32RfcDecode(h); + expect(hashlib, other, reason: 'length $i'); + } + }); + test('decoding (lowercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toBase32(b, lower: true); + var hashlib = fromBase32(h); + var other = base_codecs.base32RfcDecode(h); + expect(hashlib, other, reason: 'length $i'); + } + }); + }); + + group('compare against package: base32', () { + test('encoding (uppercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hashlib = toBase32(b); + var other = base32.base32.encodeString(String.fromCharCodes(b)); + expect(hashlib, other, reason: 'length $i'); + } + }); + test('encoding (lowercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var hashlib = toBase32(b, lower: true); + var other = base32.base32.encodeString(String.fromCharCodes(b), + encoding: Encoding.nonStandardRFC4648Lower); + expect(hashlib, other, reason: 'length $i'); + } + }); + test('decoding (uppercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toBase32(b); + var hashlib = fromBase32(h); + var other = base32.base32.decode(h); + expect(hashlib, other, reason: 'length $i'); + } + }); + test('decoding (lowercase)', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var h = toBase32(b, lower: true); + var hashlib = fromBase32(h); + var other = base32.base32.decode( + h, + encoding: Encoding.nonStandardRFC4648Lower, + ); + expect(hashlib, other, reason: 'length $i'); + } + }); + }); + }); +} diff --git a/hashlib_codecs/test/base64_test.dart b/hashlib_codecs/test/base64_test.dart new file mode 100644 index 0000000..c5a5763 --- /dev/null +++ b/hashlib_codecs/test/base64_test.dart @@ -0,0 +1,173 @@ +import 'dart:convert' as cvt; + +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base64', () { + test('parameter overrides', () { + var inp = [0x3, 0xF1]; + var out = "A/E="; + var npo = "A/E"; + var act = toBase64(inp); + expect(act, equals(out)); + act = toBase64( + inp, + codec: Base64Codec.standard, + ); + expect(act, equals(out)); + act = toBase64( + inp, + codec: Base64Codec.standard, + padding: false, + ); + expect(act, equals(npo)); + act = toBase64( + inp, + codec: Base64Codec.standard, + url: true, + ); + expect(act, equals(out)); + act = toBase64( + inp, + codec: Base64Codec.standard, + padding: false, + url: true, + ); + expect(act, equals(npo)); + }); + test('encoding [0, 0, 0, 0] => AAAAAA==', () { + var inp = [0, 0, 0, 0]; + var out = "AAAAAA=="; + expect(toBase64(inp), equals(out)); + }); + test('decoding AAAAAA== => [0, 0, 0, 0]', () { + var inp = [0, 0, 0, 0]; + var out = "AAAAAA=="; + expect(fromBase64(out), equals(inp)); + }); + test('encoding no padding [0, 0, 0, 0] => AAAAAA', () { + var inp = [0, 0, 0, 0]; + var out = "AAAAAA"; + var act = toBase64(inp, padding: false); + expect(act, equals(out)); + }); + test('decoding no padding AAAAAA => [0, 0, 0, 0]', () { + var inp = [0, 0, 0, 0]; + var out = "AAAAAA"; + expect(fromBase64(out), equals(inp)); + }); + test('encoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = cvt.base64Encode(b).replaceAll('=', ''); + var a = toBase64(b, padding: false); + expect(a, r, reason: 'length $i'); + } + }); + test('decoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = cvt.base64Encode(b).replaceAll('=', ''); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = cvt.base64Encode(b); + expect(toBase64(b), r, reason: 'length $i'); + } + }); + test('decoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = cvt.base64Encode(b); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding <-> decoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase64(b, padding: false); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding <-> decoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase64(b); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('[bcrypt] encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase64(b, codec: Base64Codec.bcrypt); + var a = fromBase64(r, codec: Base64Codec.bcrypt); + expect(a, equals(b), reason: 'length $i'); + } + }); + group('decoding with invalid chars', () { + test('Hashlib!', () { + try { + fromBase64("Hashlib!"); + throw Exception('No error thrown'); + } on FormatException catch (err) { + expect(err.message, equals("Invalid character 33")); + } + }); + test('a.10', () { + try { + fromBase64("a.10"); + throw Exception('No error thrown'); + } on FormatException catch (err) { + expect(err.message, equals("Invalid character 46")); + } + }); + test('s*methings', () { + try { + fromBase64("s*methings"); + throw Exception('No error thrown'); + } on FormatException catch (err) { + expect(err.message, equals("Invalid character 42")); + } + }); + }); + test("decoding with PHC string format B64 (16 bytes)", () { + var inp = "gZiV/M1gPc22ElAH/Jh1Hw"; + var out = fromBase64(inp, padding: false); + var res = toBase64(out, padding: false); + expect(res, inp); + // String "CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno" + }); + test("decoding with PHC string format B64 (32 bytes)", () { + var inp = "CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"; + var out = fromBase64(inp, padding: false); + var res = toBase64(out, padding: false); + expect(res, inp); + }); + group('decoding with invalid length', () { + test('H', () { + expect(() => fromBase64("H"), throwsFormatException); + }); + test('Ha', () { + expect(() => fromBase64("Ha"), throwsFormatException); + }); + test('HaB', () { + expect(() => fromBase64("HaB"), throwsFormatException); + }); + test('Hashl', () { + expect(() => fromBase64("Hashl"), throwsFormatException); + }); + test('Hashli', () { + expect(() => fromBase64("Hashli"), throwsFormatException); + }); + test('Hashlib', () { + expect(() => fromBase64("Hashlib"), throwsFormatException); + }); + }); + }); +} diff --git a/hashlib_codecs/test/base64url_test.dart b/hashlib_codecs/test/base64url_test.dart new file mode 100644 index 0000000..1aee7a1 --- /dev/null +++ b/hashlib_codecs/test/base64url_test.dart @@ -0,0 +1,60 @@ +import 'dart:convert'; + +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base64url', () { + test('encoding', () { + var b = [0, 0, 0]; + var a = toBase64(b, url: true); + expect(a, equals("AAAA")); + }); + test('encoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var m = base64UrlEncode(b).replaceAll('=', ''); + var a = toBase64(b, padding: false, url: true); + expect(a, equals(m), reason: 'length $i'); + } + }); + test('decoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = base64UrlEncode(b).replaceAll('=', ''); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var m = base64UrlEncode(b); + var a = toBase64(b, url: true); + expect(a, equals(m), reason: 'length $i'); + } + }); + test('decoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = base64UrlEncode(b); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding <-> decoding no padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase64(b, padding: false, url: true); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + test('encoding <-> decoding with padding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toBase64(b, url: true); + expect(fromBase64(r), equals(b), reason: 'length $i'); + } + }); + }); +} diff --git a/hashlib_codecs/test/base8_test.dart b/hashlib_codecs/test/base8_test.dart new file mode 100644 index 0000000..35ceb88 --- /dev/null +++ b/hashlib_codecs/test/base8_test.dart @@ -0,0 +1,122 @@ +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test base8', () { + group('[] <=> empty string', () { + final input = []; + final output = ""; + test('encoding', () { + expect(toOctal(input), output); + }); + test('decoding', () { + expect(fromOctal(output), input); + }); + }); + group('[1] <=> 001', () { + final input = [1]; + final output = "001"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[0, 1] <=> 000001', () { + final input = [0, 1]; + final output = "000001"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[1, 0] <=> 000400', () { + final input = [1, 0]; + final output = "000400"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[7] <=> 007', () { + final input = [7]; + final output = "007"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[10] <=> 012', () { + final input = [10]; + final output = "012"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[0, 10] <=> 000012', () { + final input = [0, 10]; + final output = "000012"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + group('[1, 2, 3, 4, 5, 6, 7, 8] => 0004020060200501403410', () { + var input = [1, 2, 3, 4, 5, 6, 7, 8]; + final output = "0004020060200501403410"; + test('encoding', () { + expect(toOctal(input), equals(output)); + }); + test('decoding', () { + expect(fromOctal(output), equals(input)); + }); + }); + + test('encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomBytes(i); + var r = toOctal(b); + expect(fromOctal(r), equals(b), reason: 'length $i'); + } + }); + + group('decoding edge cases', () { + test('partial message', () { + expect(fromOctal("12"), equals([10])); + }); + test('long partial message', () { + final input = '4020060200501403410'; + final output = [1, 2, 3, 4, 5, 6, 7, 8]; + expect(fromOctal(input), equals(output)); + }); + test('200000', () { + var input = '200000'; + var output = [1, 0, 0]; + expect(fromOctal(input), equals(output)); + }); + test('182', () { + expect(() => fromOctal("182"), throwsFormatException); + }); + test('-10', () { + expect(() => fromOctal("-10"), throwsFormatException); + }); + test('01a1', () { + expect(() => fromOctal("01a1"), throwsFormatException); + }); + }); + }); +} diff --git a/hashlib_codecs/test/bigint_test.dart b/hashlib_codecs/test/bigint_test.dart new file mode 100644 index 0000000..1ae04a9 --- /dev/null +++ b/hashlib_codecs/test/bigint_test.dart @@ -0,0 +1,134 @@ +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('Test BigInt', () { + test('parameter overrides', () { + var i = [0, 0, 1]; + var o = BigInt.one << 16; + var a = toBigInt(i); + expect(a, equals(o)); + a = toBigInt( + i, + codec: BigIntCodec.lsbFirst, + ); + expect(a, equals(o)); + a = toBigInt( + i, + codec: BigIntCodec.lsbFirst, + msbFirst: true, + ); + expect(a, equals(o)); + }); + test('encoding empty list to raise error for LSB first', () { + expect(() => toBigInt([]), throwsFormatException); + }); + test('decoding negative to raise error for LSB first', () { + expect(() => fromBigInt(-BigInt.two), throwsFormatException); + }); + test('encoding empty list to raise error for LSB first', () { + expect(() { + toBigInt( + [], + codec: BigIntCodec.msbFirst, + ); + }, throwsFormatException); + }); + test('decoding negative to raise error for MSB first', () { + expect(() { + fromBigInt( + -BigInt.two, + codec: BigIntCodec.msbFirst, + ); + }, throwsFormatException); + }); + test('encoding [0] => 0', () { + var inp = [0]; + var out = BigInt.zero; + expect(toBigInt(inp), equals(out)); + }); + test('encoding [0] => 0 big endian', () { + var inp = [0]; + var out = BigInt.zero; + expect(toBigInt(inp, msbFirst: true), equals(out)); + }); + test('encoding [0, 0, 0] => 0', () { + var inp = [0, 0, 0]; + var out = BigInt.zero; + expect(toBigInt(inp), equals(out)); + }); + test('encoding [0, 0, 0] => 0 big endian', () { + var inp = [0, 0, 0]; + var out = BigInt.zero; + expect(toBigInt(inp, msbFirst: true), equals(out)); + }); + test('decoding 0 => [0]', () { + var inp = [0]; + var out = BigInt.zero; + expect(fromBigInt(out), equals(inp)); + }); + test('decoding 0 => [0] big endian', () { + var inp = [0]; + var out = BigInt.zero; + expect(fromBigInt(out, msbFirst: true), equals(inp)); + }); + test('little-endian encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var inp = [...randomBytes(i), 1]; + var out = toBigInt(inp); + var out2 = fromBigInt(out); + expect(out2, equals(inp), reason: 'length $i'); + } + }); + test('encoding 32-bit big endian in MSB first order', () { + var inp = [1, 2, 3, 4]; + var out = BigInt.from(0x01020304); + expect(toBigInt(inp, msbFirst: true), equals(out)); + }); + test('encoding 32-bit big endian in LSB first order', () { + var inp = [4, 3, 2, 1]; + var out = BigInt.from(0x01020304); + expect(toBigInt(inp, msbFirst: false), equals(out)); + }); + test('decoding 32-bit big endian in MSB first order', () { + var inp = [1, 2, 3, 4]; + var out = BigInt.from(0x01020304); + expect(fromBigInt(out, msbFirst: true), equals(inp)); + }); + test('decoding 32-bit big endian in LSB first order', () { + var inp = [4, 3, 2, 1]; + var out = BigInt.from(0x01020304); + expect(fromBigInt(out, msbFirst: false), equals(inp)); + }); + test('encoding 64-bit big endian in MSB first order', () { + var inp = [1, 2, 3, 4, 5, 6, 7, 8]; + var out = BigInt.from((0x01020304 << 32) | 0x05060708); + expect(toBigInt(inp, msbFirst: true), equals(out)); + }, tags: ['vm-only']); + test('encoding 64-bit big endian in LSB first order', () { + var inp = [8, 7, 6, 5, 4, 3, 2, 1]; + var out = BigInt.from((0x01020304 << 32) | 0x05060708); + expect(toBigInt(inp, msbFirst: false), equals(out)); + }, tags: ['vm-only']); + test('decoding 64-bit big endian in MSB first order', () { + var inp = [1, 2, 3, 4, 5, 6, 7, 8]; + var out = BigInt.from((0x01020304 << 32) | 0x05060708); + expect(fromBigInt(out, msbFirst: true), equals(inp)); + }, tags: ['vm-only']); + test('decoding 64-bit big endian in LSB first order', () { + var inp = [8, 7, 6, 5, 4, 3, 2, 1]; + var out = BigInt.from((0x01020304 << 32) | 0x05060708); + expect(fromBigInt(out, msbFirst: false), equals(inp)); + }, tags: ['vm-only']); + test('big-endian encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var inp = [1, ...randomBytes(i)]; + var out = toBigInt(inp, msbFirst: true); + var out2 = fromBigInt(out, msbFirst: true); + expect(out2, equals(inp), reason: 'length $i'); + } + }); + }); +} diff --git a/hashlib_codecs/test/core/alphabet_test.dart b/hashlib_codecs/test/core/alphabet_test.dart new file mode 100644 index 0000000..a0fdb20 --- /dev/null +++ b/hashlib_codecs/test/core/alphabet_test.dart @@ -0,0 +1,172 @@ +import 'package:test/test.dart'; +import 'package:hashlib_codecs/src/core/alphabet.dart'; + +final b64codes = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + .codeUnits; + +void main() { + group('AlphabetEncoder / AlphabetDecoder', () { + test('8-bit identity alphabet without padding', () { + // bits = 8 so encoder should behave like identity before alphabet map + final encodeAlphabet = List.generate(256, (i) => i); // identity + final enc = AlphabetEncoder(bits: 8, alphabet: encodeAlphabet); + final data = List.generate(256, (i) => i); // 0..255 + final out = enc.convert(data); + expect(out, data); + // Decode back + final decodeAlphabet = + List.generate(256, (i) => i); // inverse (identity) + final dec = AlphabetDecoder(bits: 8, alphabet: decodeAlphabet); + final back = dec.convert(out); + expect(back, data); + }); + + test('5-bit encoding with padding to full byte boundary', () { + final bits = 5; + final encodeAlphabet = List.generate(32, (i) => i); // identity + const pad = 255; + final enc = + AlphabetEncoder(bits: bits, alphabet: encodeAlphabet, padding: pad); + final input = [0xAB]; // single byte + final encoded = enc.convert(input); + // Expect length padded so that length * bits is multiple of 8. + expect((encoded.length * bits) % 8, 0); + // Without padding we would have ceil(8/5)=2 symbols; padding extends to 8 symbols (like base32 style) + expect(encoded.length, 8); + // First two symbols are from data, remaining are padding + for (int i = 2; i < encoded.length; i++) { + expect(encoded[i], pad); + } + + // Build decoder inverse alphabet (identity) with padding + final decodeAlphabet = List.generate(256, (i) => i < 32 ? i : -1); + final dec = + AlphabetDecoder(bits: bits, alphabet: decodeAlphabet, padding: pad); + final decoded = dec.convert(encoded); + expect(decoded, input); + }); + + test('Decoder stops at padding', () { + final bits = 5; + const pad = 200; + final encodeAlphabet = List.generate(32, (i) => i); + final enc = + AlphabetEncoder(bits: bits, alphabet: encodeAlphabet, padding: pad); + final input = [1, 2, 3]; + final encoded = enc.convert(input); + // Manually append extra data after padding that should be ignored + final withJunk = [ + ...encoded, + pad, // an explicit early padding (should stop here) + 10, 11, 12 + ]; + final decodeAlphabet = List.generate(256, (i) => i < 32 ? i : -1); + final dec = + AlphabetDecoder(bits: bits, alphabet: decodeAlphabet, padding: pad); + final decoded = dec.convert(withJunk); + expect(decoded, input); + }); + + test('Decoder throws on invalid character (out of range)', () { + final dec = AlphabetDecoder( + bits: 5, + alphabet: List.generate(32, (i) => i), + ); + expect(() => dec.convert([40]), throwsFormatException); + }); + + test('Decoder throws on invalid character (negative mapping)', () { + // alphabet[y] < 0 triggers FormatException + final badAlphabet = List.generate(32, (i) => i == 10 ? -1 : i); + final dec = AlphabetDecoder(bits: 5, alphabet: badAlphabet); + expect(() => dec.convert([10]), throwsFormatException); + }); + + test('Base64 encode/decode (no padding)', () { + final enc = AlphabetEncoder( + bits: 6, + alphabet: b64codes, + padding: '='.codeUnitAt(0), + ); + final input = 'Man'.codeUnits; // 3 bytes -> 4 chars, no padding + final encoded = enc.convert(input); + expect(String.fromCharCodes(encoded), 'TWFu'); + + final decodeAlphabet = List.filled(256, -1); + for (var i = 0; i < b64codes.length; i++) { + decodeAlphabet[b64codes[i]] = i; + } + final dec = AlphabetDecoder( + bits: 6, + alphabet: decodeAlphabet, + padding: '='.codeUnitAt(0), + ); + final decoded = dec.convert(encoded); + expect(decoded, input); + }); + + test('Base64 encode/decode (single padding)', () { + final pad = '='.codeUnitAt(0); + final enc = AlphabetEncoder(bits: 6, alphabet: b64codes, padding: pad); + final input = 'Ma'.codeUnits; // 2 bytes -> 3 data chars + 1 pad + final encoded = enc.convert(input); + expect(String.fromCharCodes(encoded), 'TWE='); + + final decodeAlphabet = List.filled(256, -1); + for (var i = 0; i < b64codes.length; i++) { + decodeAlphabet[b64codes[i]] = i; + } + final dec = + AlphabetDecoder(bits: 6, alphabet: decodeAlphabet, padding: pad); + final decoded = dec.convert(encoded); + expect(decoded, input); + }); + + test('Base64 encode/decode (double padding)', () { + final pad = '='.codeUnitAt(0); + final enc = AlphabetEncoder(bits: 6, alphabet: b64codes, padding: pad); + final input = 'M'.codeUnits; // 1 byte -> 2 data chars + 2 pads + final encoded = enc.convert(input); + expect(String.fromCharCodes(encoded), 'TQ=='); + + final decodeAlphabet = List.filled(256, -1); + for (var i = 0; i < b64codes.length; i++) { + decodeAlphabet[b64codes[i]] = i; + } + final dec = + AlphabetDecoder(bits: 6, alphabet: decodeAlphabet, padding: pad); + final decoded = dec.convert(encoded); + expect(decoded, input); + }); + + test('Base64 decoder ignores data after padding', () { + final pad = '='.codeUnitAt(0); + final enc = AlphabetEncoder(bits: 6, alphabet: b64codes, padding: pad); + final input = 'Ma'.codeUnits; + final encoded = enc.convert(input); // TWE= + final withJunk = [...encoded, 'A'.codeUnitAt(0), 'B'.codeUnitAt(0)]; + final decodeAlphabet = List.filled(256, -1); + for (var i = 0; i < b64codes.length; i++) { + decodeAlphabet[b64codes[i]] = i; + } + final dec = + AlphabetDecoder(bits: 6, alphabet: decodeAlphabet, padding: pad); + final decoded = dec.convert(withJunk); + expect(decoded, input); + }); + + test('Base64 decoder rejects invalid character', () { + final decodeAlphabet = List.filled(256, -1); + for (var i = 0; i < b64codes.length; i++) { + decodeAlphabet[b64codes[i]] = i; + } + final dec = AlphabetDecoder( + bits: 6, + alphabet: decodeAlphabet, + padding: '='.codeUnitAt(0), + ); + expect(() => dec.convert('?'.codeUnits), throwsFormatException); + }); + }); +} diff --git a/hashlib_codecs/test/core/byte_test.dart b/hashlib_codecs/test/core/byte_test.dart new file mode 100644 index 0000000..33a6606 --- /dev/null +++ b/hashlib_codecs/test/core/byte_test.dart @@ -0,0 +1,74 @@ +import 'package:test/test.dart'; +import 'dart:typed_data'; + +// Import the library under test +import 'package:hashlib_codecs/src/core/byte.dart'; + +// Dummy concrete implementations to enable testing the abstract classes +class PassthroughByteEncoder extends ByteEncoder { + const PassthroughByteEncoder({required super.bits}); + @override + Uint8List convert(List input) => Uint8List.fromList(input); +} + +class PassthroughByteDecoder extends ByteDecoder { + const PassthroughByteDecoder({required super.bits}); + @override + Uint8List convert(List encoded) => Uint8List.fromList(encoded); +} + +void main() { + group('ByteEncoder basics', () { + for (final b in [4, 5, 6, 7, 8, 12, 16]) { + test('properties with bits=$b', () { + final enc = PassthroughByteEncoder(bits: b); + expect(enc.bits, b); + expect(enc.source, 8); + expect(enc.target, b); + }); + } + + test('convert returns a Uint8List copy', () { + final enc = PassthroughByteEncoder(bits: 8); + final input = [1, 2, 255, 0]; + final out = enc.convert(input); + expect(out, equals(input)); + expect(out, isA()); + // Ensure it is a different instance (defensive copy semantics) + input[0] = 9; + expect(out[0], isNot(9)); + }); + }); + + group('ByteDecoder basics', () { + for (final b in [3, 5, 6, 8, 10]) { + test('properties with bits=$b', () { + final dec = PassthroughByteDecoder(bits: b); + expect(dec.bits, b); + expect(dec.source, b); + expect(dec.target, 8); + }); + } + + test('convert returns a Uint8List copy', () { + final dec = PassthroughByteDecoder(bits: 6); + final input = [10, 20, 30]; + final out = dec.convert(input); + expect(out, equals(input)); + expect(out, isA()); + input[1] = 99; + expect(out[1], isNot(99)); + }); + }); + + group('Symmetry (encoder->decoder passthrough)', () { + test('round trip with identical passthrough implementations', () { + final enc = PassthroughByteEncoder(bits: 8); + final dec = PassthroughByteDecoder(bits: 8); + final original = List.generate(32, (i) => (i * 7) & 0xFF); + final mid = enc.convert(original); + final again = dec.convert(mid); + expect(again, equals(original)); + }); + }); +} diff --git a/hashlib_codecs/test/core/codec_test.dart b/hashlib_codecs/test/core/codec_test.dart new file mode 100644 index 0000000..2bf860d --- /dev/null +++ b/hashlib_codecs/test/core/codec_test.dart @@ -0,0 +1,101 @@ +import 'dart:typed_data'; + +import 'package:hashlib_codecs/src/core/codec.dart'; +import 'package:hashlib_codecs/src/core/decoder.dart'; +import 'package:hashlib_codecs/src/core/encoder.dart'; +import 'package:test/test.dart'; + +class PlusOneCodec extends IterableCodec { + const PlusOneCodec(); + + @override + Iterable encode(Iterable input) => input.map((e) => (e + 1) & 0xFF); + + @override + Iterable decode(Iterable input) => input.map((e) => (e - 1) & 0xFF); + + // Not needed for these tests. + @override + BitEncoder get encoder => throw UnimplementedError(); + + @override + BitDecoder get decoder => throw UnimplementedError(); +} + +class IdentityConverter extends HashlibConverter { + @override + final int source; + + @override + final int target; + const IdentityConverter(this.source, this.target); + + @override + Iterable convert(Iterable input) => input; +} + +void main() { + group('IterableCodec convenience methods', () { + const codec = PlusOneCodec(); + + test('encodeString increments code units', () { + final out = codec.encodeString('ABC').toList(); + expect(out, [66, 67, 68]); + }); + + test('decodeString decrements code units', () { + final out = codec.decodeString('BCD').toList(); + expect(out, [66 - 1, 67 - 1, 68 - 1]); + expect(String.fromCharCodes(out), 'ABC'); + }); + + test('round trip with unicode', () { + final s = String.fromCharCodes([104, 233, 0xD8, 0x3D, 0xDE, 0x42]); + final enc = codec.encodeString(s).toList(); + final dec = codec.decode(enc).toList(); + expect(String.fromCharCodes(dec), s); + }); + + test('encodeBuffer works', () { + final bytes = Uint8List.fromList([0, 1, 254, 255]); + final out = codec.encodeBuffer(bytes.buffer).toList(); + expect(out, [1, 2, 255, 0]); // wrapped by & 0xFF + }); + + test('decodeBuffer works', () { + final bytes = Uint8List.fromList([1, 2, 0]); + final out = codec.decodeBuffer(bytes.buffer).toList(); + expect(out, [0, 1, 255]); + }); + + test('empty inputs', () { + expect(codec.encodeString('').toList(), isEmpty); + expect(codec.decode(const []).toList(), isEmpty); + }); + }); + + group('HashlibConverter base class', () { + test('identity converter preserves data', () { + const conv = IdentityConverter(8, 8); + final input = [0, 1, 127, 255]; + final out = conv.convert(input).toList(); + expect(out, input); + }); + + test('source/target properties exposed', () { + const conv = IdentityConverter(5, 7); + expect(conv.source, 5); + expect(conv.target, 7); + }); + + test('convert iterable laziness (multiple iterations consistent)', () { + const conv = IdentityConverter(8, 8); + final input = [10, 20, 30]; + final converted = conv.convert(input); + expect(converted.toList(), [10, 20, 30]); + + input[1] = 99; + expect(converted.toList(), [10, 99, 30]); + }); + }); +} diff --git a/hashlib_codecs/test/core/decoder_test.dart b/hashlib_codecs/test/core/decoder_test.dart new file mode 100644 index 0000000..41017d3 --- /dev/null +++ b/hashlib_codecs/test/core/decoder_test.dart @@ -0,0 +1,77 @@ +import 'package:test/test.dart'; +import 'package:hashlib_codecs/src/core/decoder.dart'; + +// Minimal concrete decoders for testing: +class Bits3to8Decoder extends BitDecoder { + const Bits3to8Decoder(); + @override + int get source => 3; + @override + int get target => 8; +} + +class BadSourceDecoder extends BitDecoder { + const BadSourceDecoder(); + @override + int get source => 1; // invalid (< 2) + @override + int get target => 8; +} + +class BadTargetDecoder extends BitDecoder { + const BadTargetDecoder(); + @override + int get source => 3; + @override + int get target => 65; // invalid (> 64) +} + +void main() { + group('BitDecoder (3→8)', () { + test('packs 8 x 3-bit symbols into 3 bytes', () { + // 8 valid symbols → 24 bits → 3 bytes + final dec = const Bits3to8Decoder(); + final out = dec.convert([0, 1, 2, 3, 4, 5, 6, 7]); + expect(out, equals([5, 57, 119])); // computed packing result + }); + + test('ignores data after first invalid symbol (no partial word)', () { + // 8 valid symbols complete 3 bytes; trailing invalid symbol is ignored. + final dec = const Bits3to8Decoder(); + final out = + dec.convert([0, 1, 2, 3, 4, 5, 6, 7, 9, 0, 0]); // 9 > 7 → terminates + expect(out, equals([5, 57, 119])); + }); + + test('throws FormatException on non-zero partial word (short input)', () { + // Only 1 symbol → partial word remains → must throw. + final dec = const Bits3to8Decoder(); + expect(() => dec.convert([1]), throwsA(isA())); + }); + + test('throws FormatException when invalid appears mid-group', () { + // 5 symbols (15 bits) then invalid → leaves partial word → throw. + final dec = const Bits3to8Decoder(); + expect(() => dec.convert([0, 1, 2, 3, 4, 9, 6, 7]), + throwsA(isA())); + }); + + test('negative symbol terminates (after full group is OK)', () { + final dec = const Bits3to8Decoder(); + final out = dec.convert([0, 1, 2, 3, 4, 5, 6, 7, -1, 0, 0]); + expect(out, equals([5, 57, 119])); + }); + }); + + group('BitDecoder argument checks', () { + test('rejects invalid source bit length', () { + final dec = const BadSourceDecoder(); + expect(() => dec.convert(const []), throwsA(isA())); + }); + + test('rejects invalid target bit length', () { + final dec = const BadTargetDecoder(); + expect(() => dec.convert(const []), throwsA(isA())); + }); + }); +} diff --git a/hashlib_codecs/test/core/encoder_test.dart b/hashlib_codecs/test/core/encoder_test.dart new file mode 100644 index 0000000..369616d --- /dev/null +++ b/hashlib_codecs/test/core/encoder_test.dart @@ -0,0 +1,82 @@ +import 'package:hashlib_codecs/src/core/encoder.dart'; +import 'package:test/test.dart'; + +class Bits3to8Encoder extends BitEncoder { + const Bits3to8Encoder(); + @override + int get source => 3; + @override + int get target => 8; +} + +class BadSourceEncoder extends BitEncoder { + const BadSourceEncoder(); + @override + int get source => 1; // invalid (<2) + @override + int get target => 8; +} + +class BadTargetEncoder extends BitEncoder { + const BadTargetEncoder(); + @override + int get source => 3; + @override + int get target => 65; // invalid (>64) +} + +void main() { + group('BitEncoder (3 → 8)', () { + test('packs 8×3-bit symbols into 3 bytes (exact fit)', () { + // 8 symbols × 3 bits = 24 bits → 3 bytes + final enc = const Bits3to8Encoder(); + final out = enc.convert([0, 1, 2, 3, 4, 5, 6, 7]); + expect(out, equals([5, 57, 119])); // known-good packing + }); + + test('pads partial word with zeros (single symbol)', () { + // 3 bits → pad 5 zeros on the right → 00100000 = 32 + final enc = const Bits3to8Encoder(); + expect(enc.convert([1]), equals([32])); + }); + + test('pads partial word with zeros (two symbols)', () { + // symbols: 7 (111), 1 (001) + // accumulate: (7<<3)|1 = 57; pad with 2 zeros: 57<<2 = 228 + final enc = const Bits3to8Encoder(); + expect(enc.convert([7, 1]), equals([228])); + }); + + test('multiple full and partial groups', () { + final enc = const Bits3to8Encoder(); + // 11 symbols → 33 bits → 5 bytes (last byte padded) + final out = enc.convert([0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7]); + // Compute expected manually: + // first 8 → [5,57,119] ; remaining 3 symbols: 7,7,7 → 9 bits: + // p=(7<<6)|(7<<3)|7 = (448)|(56)|7 = 511 ; n=9 → emit one byte (511>>>1=255), n=1 + // pad remaining 1 bit with 7 zeros: (p & (1)) << 7 = 1<<7 = 128 + expect(out, equals([5, 57, 119, 255, 128])); + }); + + test('BitEncoder accepts negative symbol by masking (surprising)', () { + final enc = const Bits3to8Encoder(); + final outNeg = enc.convert([-1]); // -1 & 0x7 == 7 + final outSeven = enc.convert([7]); + expect(outNeg, equals(outSeven), + reason: + 'Negative input got masked to 3-bit value; likely unintended'); + }); + }); + + group('BitEncoder argument checks', () { + test('rejects invalid source bit length', () { + final enc = const BadSourceEncoder(); + expect(() => enc.convert(const []), throwsA(isA())); + }); + + test('rejects invalid target bit length', () { + final enc = const BadTargetEncoder(); + expect(() => enc.convert(const []), throwsA(isA())); + }); + }); +} diff --git a/hashlib_codecs/test/crypt/crypt_builder_test.dart b/hashlib_codecs/test/crypt/crypt_builder_test.dart new file mode 100644 index 0000000..94eb22c --- /dev/null +++ b/hashlib_codecs/test/crypt/crypt_builder_test.dart @@ -0,0 +1,90 @@ +import 'package:hashlib_codecs/src/base64.dart'; +import 'package:hashlib_codecs/src/codecs/crypt/crypt_builder.dart'; +import 'package:test/test.dart'; + +void main() { + group('CryptDataBuilder', () { + test('should build with minimal id', () { + final builder = CryptDataBuilder('testid'); + final data = builder.build(); + expect(data.id, 'testid'); + expect(data.version, isNull); + expect(data.salt, isNull); + expect(data.hash, isNull); + expect(data.params, isNull); + }); + + test('should set version', () { + final builder = CryptDataBuilder('algo').version('1'); + final data = builder.build(); + expect(data.version, '1'); + }); + + test('should set salt', () { + final builder = CryptDataBuilder('algo').salt('mysalt'); + final data = builder.build(); + expect(data.salt, 'mysalt'); + }); + + test('should set hash', () { + final builder = CryptDataBuilder('algo').hash('myhash'); + final data = builder.build(); + expect(data.hash, 'myhash'); + }); + + test('should set saltBytes and hashBytes', () { + final saltBytes = [1, 2, 3, 4]; + final hashBytes = [5, 6, 7, 8]; + final builder = CryptDataBuilder('algo') + ..saltBytes(saltBytes) + ..hashBytes(hashBytes); + final data = builder.build(); + expect(data.salt, toBase64(saltBytes, padding: false)); + expect(data.hash, toBase64(hashBytes, padding: false)); + }); + + test('should set params', () { + final builder = CryptDataBuilder('algo') + ..param('rounds', 1000) + ..param('mode', 'fast'); + final data = builder.build(); + expect(data.params, isNotNull); + expect(data.params!['rounds'], '1000'); + expect(data.params!['mode'], 'fast'); + }); + + test('should throw ArgumentError for invalid id', () { + expect( + () => CryptDataBuilder('INVALID_ID!').build(), throwsArgumentError); + }); + + test('should throw ArgumentError for invalid version', () { + expect(() => CryptDataBuilder('algo').version('v1').build(), + throwsArgumentError); + }); + + test('should throw ArgumentError for invalid param name', () { + final builder = CryptDataBuilder('algo').param('invalid*name', 'value'); + expect(() => builder.build(), throwsArgumentError); + }); + + test('should throw ArgumentError for invalid param value', () { + final builder = CryptDataBuilder('algo').param('valid', 'bad value!'); + expect(() => builder.build(), throwsArgumentError); + }); + + test('should allow chaining', () { + final builder = CryptDataBuilder('algo') + .version('2') + .salt('salt') + .hash('hash') + .param('p', 'v'); + final data = builder.build(); + expect(data.id, 'algo'); + expect(data.version, '2'); + expect(data.salt, 'salt'); + expect(data.hash, 'hash'); + expect(data.params!['p'], 'v'); + }); + }); +} diff --git a/hashlib_codecs/test/crypt/crypt_test.dart b/hashlib_codecs/test/crypt/crypt_test.dart new file mode 100644 index 0000000..ff80f08 --- /dev/null +++ b/hashlib_codecs/test/crypt/crypt_test.dart @@ -0,0 +1,108 @@ +import 'package:test/test.dart'; +import 'package:hashlib_codecs/src/codecs/crypt/crypt_data.dart'; + +void main() { + group('CryptData', () { + test('constructor and fields', () { + final data = CryptData( + 'argon2id', + version: '19', + salt: 'c2FsdA', // "salt" in base64 + hash: 'aGFzaA', // "hash" in base64 + params: {'m': '65536', 't': '3', 'p': '4'}, + ); + expect(data.id, 'argon2id'); + expect(data.version, '19'); + expect(data.salt, 'c2FsdA'); + expect(data.hash, 'aGFzaA'); + expect(data.params, {'m': '65536', 't': '3', 'p': '4'}); + }); + + test('saltBytes and hashBytes', () { + final data = CryptData('id', salt: 'c2FsdA', hash: 'aGFzaA'); + expect(data.saltBytes(), isA>()); + expect(data.hashBytes(), isA>()); + expect(String.fromCharCodes(data.saltBytes()!), 'salt'); + expect(String.fromCharCodes(data.hashBytes()!), 'hash'); + }); + + test('versionInt', () { + final data = CryptData('id', version: '42'); + expect(data.versionInt(), 42); + + final invalid = CryptData('id', version: 'abc'); + expect(invalid.versionInt(), null); + + final none = CryptData('id'); + expect(none.versionInt(), null); + }); + + test('hasParam, getParam, getIntParam', () { + final data = CryptData('id', params: {'x': '123', 'y': 'abc'}); + expect(data.hasParam('x'), true); + expect(data.hasParam('z'), false); + expect(data.getParam('x'), '123'); + expect(data.getParam('y'), 'abc'); + expect(data.getParam('z'), null); + expect(data.getIntParam('x'), 123); + expect(data.getIntParam('y'), null); + expect(data.getIntParam('z'), null); + }); + + test('validate passes for valid data', () { + final data = CryptData( + 'argon2id', + version: '19', + salt: 'c2FsdA', + hash: 'aGFzaA', + params: {'m': '65536', 't': '3', 'p': '4'}, + ); + expect(() => data.validate(), returnsNormally); + }); + + test('validate fails for invalid id', () { + final data = CryptData('Argon2id!'); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for invalid version', () { + final data = CryptData('id', version: 'v19'); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for invalid param key', () { + final data = CryptData('id', params: {'bad_key!': '123'}); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for reserved param key "v"', () { + final data = CryptData('id', params: {'v': '123'}); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for empty param value', () { + final data = CryptData('id', params: {'x': ''}); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for invalid param value', () { + final data = CryptData('id', params: {'x': 'bad*value'}); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for invalid salt', () { + final data = CryptData('id', salt: 'bad*salt'); + expect(() => data.validate(), throwsArgumentError); + }); + + test('validate fails for invalid hash', () { + final data = CryptData('id', hash: 'bad*hash'); + expect(() => data.validate(), throwsArgumentError); + }); + + test('builder returns CryptDataBuilder', () { + final builder = CryptData.builder('argon2id'); + expect(builder.runtimeType.toString(), contains('CryptDataBuilder')); + }); + }); +} diff --git a/hashlib_codecs/test/crypt_test.dart b/hashlib_codecs/test/crypt_test.dart new file mode 100644 index 0000000..0c3d96e --- /dev/null +++ b/hashlib_codecs/test/crypt_test.dart @@ -0,0 +1,179 @@ +import 'package:hashlib_codecs/hashlib_codecs.dart'; +import 'package:test/test.dart'; + +void expectError(Function fun, String message) { + expect(fun, throwsA(isA().having((e) => '$e', 'message', message))); +} + +void main() { + group('Modular Crypt Format', () { + group('on valid string', () { + test('including all parts', () { + var v = + r"$argon2id$v=19$m=65536,t=2,p=1$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without version', () { + var v = + r"$argon2id$m=65536,t=2,p=1$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without params', () { + var v = + r"$argon2id$v=19$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without hash', () { + String v = r"$argon2id$v=19$m=65536,t=2,p=1$gZiV/M1gPc22ElAH/Jh1Hw"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without salt and hash', () { + String v = r"$argon2id$v=19$m=65536,t=2,p=1"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without version and params', () { + var v = + r"$argon2id$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without params, salt and hash', () { + var v = r"$argon2id$v=19"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without version, params and hash', () { + var v = r"$argon2id$gZiV/M1gPc22ElAH/Jh1Hw"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + test('without version, params, salt and hash', () { + var v = r"$argon2id"; + expect(toCrypt(fromCrypt(v)), equals(v)); + }); + }); + + group('Decoder failure cases', () { + test('throws on empty string', () { + expectError( + () => fromCrypt(''), + 'FormatException: Empty string', + ); + }); + test('throws on invalid start character', () { + expectError( + () => fromCrypt('s'), + r'FormatException: Does not start with "$"', + ); + }); + + test('empty string with a single dollar sign', () { + expectError( + () => fromCrypt(r'$'), + 'Invalid argument (id): must be [a-z0-9-] and under 32 characters: ""', + ); + }); + test('id is more than 32 characters', () { + var name = List.filled(50, 'a').join(); + expectError( + () => fromCrypt('\$$name'), + 'Invalid argument (id): must be [a-z0-9-] and under 32 characters: "$name"', + ); + }); + test('id contains invalid characters', () { + expectError( + () => fromCrypt(r"$v=19"), + 'Invalid argument (id): must be [a-z0-9-] and under 32 characters: "v=19"', + ); + }); + + test('empty version', () { + expectError( + () => fromCrypt(r"$argon2id$v=sd"), + 'Invalid argument (version): must be decimal digits: "sd"', + ); + }); + test('using reserved key in parameter', () { + expectError( + () => fromCrypt(r"$argon2id$v=3$v=42"), + 'Invalid argument (params.key): reserved; use version field instead: "v"', + ); + }); + test('using reserved key in parameter', () { + expectError( + () => fromCrypt(r"$argon2id$v=3$p=3,v=42"), + 'Invalid argument (params.key): reserved; use version field instead: "v"', + ); + }); + test('empty parameter name', () { + expectError( + () => fromCrypt(r"$argon2id$=1"), + 'Invalid argument (params.key): must be [a-z0-9-] and under 32 chars: ""', + ); + }); + test('empty parameter value', () { + expectError( + () => fromCrypt(r"$argon2id$sd=,3=2"), + 'Invalid argument (params[sd]): value is empty: ""', + ); + }); + test('parameter value with invalid character', () { + expectError( + () => fromCrypt(r"$argon2id$sd=o@o,3=2"), + 'Invalid argument (params[sd]): value has invalid characters: "o@o"', + ); + }); + test('parameter without equal sign', () { + expectError( + () => fromCrypt(r"$argon2id$k,f=3$salt$hash"), + 'FormatException: Invalid parameter: "k"', + ); + }); + test('duplicate parameter keys', () { + expectError( + () => fromCrypt(r"$argon2id$k=1,k=2$salt$hash"), + 'FormatException: Duplicate parameter key: "k"', + ); + }); + test('empty parameters fields', () { + expectError( + () => fromCrypt(r"$argon2id$,$salt"), + 'FormatException: Invalid parameter: ""', + ); + }); + test('invalid character in salt value', () { + expectError( + () => fromCrypt(r"$3$v=3$p=2$p&p"), + 'Invalid argument (salt): expected base64 string without padding: "p&p"', + ); + }); + test('equal sign with salt value', () { + expectError( + () => fromCrypt(r"$3$v=3$p=2$salt="), + 'Invalid argument (salt): expected base64 string without padding: "salt="', + ); + }); + test('invalid character in hash value', () { + expectError( + () => fromCrypt(r"$2$salt$er*er"), + 'Invalid argument (hash): expected base64 string without padding: "er*er"', + ); + }); + test('equal sign with hash value', () { + expectError( + () => fromCrypt(r"$2$salt$hash="), + 'Invalid argument (hash): expected base64 string without padding: "hash="', + ); + }); + test('extra characters at the end', () { + expectError( + () => fromCrypt(r"$argon2id$salt$hash$extra"), + 'FormatException: Extra characters at the end', + ); + }); + test('extra dollar sign at the end', () { + expectError( + () => fromCrypt(r"$argon2id$salt$hash$"), + 'FormatException: Extra characters at the end', + ); + }); + }); + }); +} diff --git a/hashlib_codecs/test/utf8_test.dart b/hashlib_codecs/test/utf8_test.dart new file mode 100644 index 0000000..b9b78fa --- /dev/null +++ b/hashlib_codecs/test/utf8_test.dart @@ -0,0 +1,249 @@ +import 'dart:convert'; + +import 'package:hashlib_codecs/src/codecs/utf8.dart'; +import 'package:hashlib_codecs/src/utf8.dart'; +import 'package:test/test.dart'; + +import './utils.dart'; + +void main() { + group('utf8 test', () { + test('ππππππππ', () { + var test = r"ππππππππ"; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('encoding <-> decoding', () { + for (int i = 0; i < 100; ++i) { + var b = randomNumbers(i, stop: 0x0010FFFF); + var test = String.fromCharCodes(b); + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual), reason: 'Encoding: #$i'); + var decoded = fromUtf8(mine); + expect(decoded, equals(test), reason: 'Decoding: #$i'); + } + }); + + test('ASCII characters', () { + var test = "Hello, World!"; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('2-byte UTF-8 characters', () { + var test = "éüçñ"; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('3-byte UTF-8 characters', () { + var test = "हिन्दी中文"; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('4-byte UTF-8 characters (emoji)', () { + var test = "😀💡🦄"; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('Maximum valid code point (0x10FFFF) encodes/decodes correctly', () { + var test = String.fromCharCodes([0x10FFFF]); + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('Boundary values for each UTF-8 range', () { + var codePoints = [0x7F, 0x80, 0x7FF, 0x800, 0xFFFF, 0x10000, 0x10FFFF]; + for (var cp in codePoints) { + var test = String.fromCharCodes([cp]); + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual), reason: 'Encoding: $cp'); + var decoded = fromUtf8(mine); + expect(decoded, equals(test), reason: 'Decoding: $cp'); + } + }); + + test('Empty string', () { + var test = ""; + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + test('Surrogate pairs are encoded/decoded correctly', () { + // Dart uses UTF-16, so surrogate pairs for emoji + var test = String.fromCharCodes([0xD83D, 0xDE00]); // 😀 + var actual = Utf8Encoder().convert(test); + var mine = toUtf8(test); + expect(mine, equals(actual)); + var decoded = fromUtf8(mine); + expect(decoded, equals(test)); + }); + + group("Encoder", () { + final encoder = UTF8Codec.standard.encoder; + + test('encoder source', () { + expect(encoder.source, 32); + }); + + test('encoder target', () { + expect(encoder.target, 8); + }); + + test('Negative code unit throws FormatException', () { + expect(() => encoder.convert([-1]), throwsFormatException); + }); + + test('encoder with unpaired low surrogate', () { + expect(() => encoder.convert([0xDC00]), throwsFormatException); + }); + + test('encoder with unpaired high surrogate', () { + expect(() => encoder.convert([0xD801]), throwsFormatException); + }); + + test('encoder with invalid surrogate pair with low value', () { + expect(() => encoder.convert([0xD805, 0xDB00]), throwsFormatException); + }); + + test('encoder with invalid surrogate pair with high value', () { + expect(() => encoder.convert([0xD805, 0xEFFF]), throwsFormatException); + }); + + test('encoder with value exceeding range', () { + expect(() => encoder.convert([0x110000]), throwsFormatException); + }); + + test('Empty input for decoder returns empty list', () { + expect(encoder.convert([]), isEmpty); + }); + }); + + group('Decoder', () { + final decoder = UTF8Codec.standard.decoder; + + test('decoder source', () { + expect(decoder.source, 8); + }); + + test('decoder target', () { + expect(decoder.target, 32); + }); + + test('Insufficient input for 2-byte sequence', () { + expect(() => decoder.convert([0xC2]), throwsFormatException); + }); + + test('Invalid continuation byte at 1 for 2-byte sequence', () { + expect(() => decoder.convert([0xC2, 0xC2]), throwsFormatException); + }); + + test('Insufficient input for 3-byte sequence', () { + expect(() => decoder.convert([0xE1, 0x80]), throwsFormatException); + }); + + test('Invalid continuation byte at 1 for 3-byte sequence', () { + expect( + () => decoder.convert([0xE1, 0x41, 0x80]), throwsFormatException); + }); + + test('Invalid continuation byte at 2 for 3-byte sequence', () { + expect( + () => decoder.convert([0xE1, 0x80, 0x41]), throwsFormatException); + }); + + test('Overlong 3-byte sequence', () { + expect( + () => decoder.convert([0xE0, 0x80, 0xAF]), throwsFormatException); + }); + + test('Invalid surrogate for 3-byte', () { + expect( + () => decoder.convert([0xED, 0xA1, 0x80]), throwsFormatException); + }); + + test('Insufficient input for 4-byte sequence', () { + expect( + () => decoder.convert([0xF0, 0x90, 0x80]), throwsFormatException); + }); + + test('Invalid 4-byte lead', () { + expect(() => decoder.convert([0xF5, 0x80, 0x80, 0x80]), + throwsFormatException); + }); + + test('Overlong 4-byte sequence', () { + expect(() => decoder.convert([0xF0, 0x8F, 0x80, 0x80]), + throwsFormatException); + }); + + test('Invalid continuation byte at 1 for 4-byte sequence', () { + expect(() => decoder.convert([0xF0, 0x41, 0x80, 0x80]), + throwsFormatException); + }); + + test('Invalid continuation byte at 2 for 4-byte sequence', () { + expect(() => decoder.convert([0xF0, 0x90, 0x41, 0x80]), + throwsFormatException); + }); + + test('Invalid continuation byte at 3 for 4-byte sequence', () { + expect(() => decoder.convert([0xF0, 0x90, 0x80, 0x41]), + throwsFormatException); + }); + + test('Above U+10FFFF', () { + expect(() => decoder.convert([0xF4, 0x90, 0x80, 0x80]), + throwsFormatException); + }); + + test('Invalid UTF-8 sequence throws FormatException', () { + // Invalid continuation byte (should start with 10xxxxxx) + var invalid = [0xC2, 0x41]; + expect(() => decoder.convert(invalid), throwsFormatException); + }); + + test('Overlong encoding is rejected', () { + // Overlong encoding for ASCII 'A' (should be 0x41, not 0xC1 0x81) + var overlong = [0xC1, 0x81]; + expect(() => decoder.convert(overlong), throwsFormatException); + }); + + test('Code points above Unicode range are rejected', () { + // 0x11FFFF is above valid Unicode range + var invalid = [0xF4, 0x90, 0x80, 0x80]; + expect(() => decoder.convert(invalid), throwsFormatException); + }); + + test('5 or more bytes', () { + expect(() => decoder.convert([0xF8]), throwsFormatException); + }); + }); + }); +} diff --git a/hashlib_codecs/test/utils.dart b/hashlib_codecs/test/utils.dart new file mode 100644 index 0000000..614cc43 --- /dev/null +++ b/hashlib_codecs/test/utils.dart @@ -0,0 +1,47 @@ +import 'dart:math'; +import 'dart:typed_data'; + +Random _generator() { + try { + return Random.secure(); + } catch (err) { + return Random(DateTime.now().millisecondsSinceEpoch); + } +} + +/// Generate a list of random numbers of size [length] +Uint8List randomNumbers( + int length, { + int start = 0, + int stop = 0xFFFFFFFF, +}) { + var random = _generator(); + var data = Uint8List(length); + for (int i = 0; i < data.length; i++) { + data[i] = random.nextInt(stop - start + 1) + start; + } + return data; +} + +/// Generate a list of random 8-bit numbers of size [length] +Uint8List randomBytes(int length) { + return randomNumbers(length, stop: 0xFF); +} + +/// Fill the [buffer] with random numbers +void fillRandom( + ByteBuffer buffer, [ + int offsetInBytes = 0, + int? lengthInBytes, +]) { + if (lengthInBytes == null) { + lengthInBytes = buffer.lengthInBytes; + } else { + lengthInBytes = min(lengthInBytes + offsetInBytes, buffer.lengthInBytes); + } + var random = _generator(); + var data = buffer.asUint8List(); + for (int i = offsetInBytes; i < lengthInBytes; i++) { + data[i] = random.nextInt(256); + } +} diff --git a/introduction_screen/LICENSE b/introduction_screen/LICENSE new file mode 100644 index 0000000..d195f29 --- /dev/null +++ b/introduction_screen/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Jean-Charles Moussé + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/introduction_screen/lib/introduction_screen.dart b/introduction_screen/lib/introduction_screen.dart new file mode 100644 index 0000000..8ad72e1 --- /dev/null +++ b/introduction_screen/lib/introduction_screen.dart @@ -0,0 +1,8 @@ +library introduction_screen; + +export '/src/introduction_screen.dart' + show IntroductionScreen, IntroductionScreenState; +export '/src/model/page_view_model.dart' show PageViewModel; +export '/src/model/page_decoration.dart' show PageDecoration; +export '/src/model/position.dart' show Position; +export 'package:dots_indicator/dots_indicator.dart' show DotsDecorator; diff --git a/introduction_screen/lib/src/helper.dart b/introduction_screen/lib/src/helper.dart new file mode 100644 index 0000000..0e6dc6a --- /dev/null +++ b/introduction_screen/lib/src/helper.dart @@ -0,0 +1,19 @@ +extension CustomList on List { + List asReversed(bool isReverse) { + return isReverse ? reversed.toList() : this; + } +} + +bool isBackgroundImageAssetPathValid(String assetPath) { + const validExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']; + + bool hasValidExtension = validExtensions.any((extension) { + return assetPath.toLowerCase().endsWith('.$extension'); + }); + + if (!hasValidExtension) { + return false; + } + + return true; +} diff --git a/introduction_screen/lib/src/introduction_screen.dart b/introduction_screen/lib/src/introduction_screen.dart new file mode 100644 index 0000000..fc6f8e0 --- /dev/null +++ b/introduction_screen/lib/src/introduction_screen.dart @@ -0,0 +1,737 @@ +library introduction_screen; + +import 'dart:async'; +import 'dart:math'; + +import 'package:collection/collection.dart'; +import 'package:dots_indicator/dots_indicator.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_keyboard_visibility_temp_fork/flutter_keyboard_visibility_temp_fork.dart'; + +import '/src/helper.dart'; +import '/src/model/page_view_model.dart'; +import '/src/model/position.dart'; +import '/src/ui/intro_button.dart'; +import '/src/ui/intro_page.dart'; + +bool kDefaultCanProgressFunction(int page) { + return true; +} + +typedef CanProgress = bool Function(int page); + +class IntroductionScreen extends StatefulWidget { + /// All pages of the onboarding + final List? pages; + + /// All pages of the onboarding, as a complete widget instead of a PageViewModel + final List? rawPages; + + /// Callback when Done button is pressed + final VoidCallback? onDone; + + /// Callback when Skip button is pressed + final VoidCallback? onSkip; + + /// Callback when page change + final ValueChanged? onChange; + + /// Done button child for the pre-made TextButton + final Widget? done; + + /// Override pre-made done button. + /// You can what you want (button, text, image, ...) + final Widget Function(BuildContext context, Function()? onPressed)? + overrideDone; + + /// Skip button child for the pre-made TextButton + final Widget? skip; + + /// Override pre-made skip button. + /// You can what you want (button, text, image, ...) + final Widget Function(BuildContext context, Function() onPressed)? + overrideSkip; + + /// Next button child for the pre-made TextButton + final Widget? next; + + /// Override pre-made next button. + /// You can what you want (button, text, image, ...) + final Widget Function(BuildContext context, Function()? onPressed)? + overrideNext; + + /// Back button child for the pre-made TextButton + final Widget? back; + + /// Override pre-made back button. + /// You can what you want (button, text, image, ...) + final Widget Function(BuildContext context, Function()? onPressed)? + overrideBack; + + /// Is the Skip button should be display + /// + /// @Default `false` + final bool showSkipButton; + + /// Is the Next button should be display + /// + /// @Default `true` + final bool showNextButton; + + /// If the 'Done' button should be rendered at all the end + /// + /// @Default `true` + final bool showDoneButton; + + /// Show the bottom part of the page, that's include skip, next, done buttons + /// as well as dotsDecorator. + /// + /// @Default `true` + final bool showBottomPart; + + /// If the bottom part of the page should be displayed when the keyboard is opened + /// + /// @Default `false` + final bool hideBottomOnKeyboard; + + /// If the Back button should be display + /// + /// @Default `false` + final bool showBackButton; + + /// If the Back button should be display for the first page + /// + /// @Default `false` + final bool showFirstBackButton; + + /// If a custom Widget should be used instead of the default progress indicator + /// + /// @Default `null` + final Widget? customProgress; + + /// If the progress indicator should be display + /// + /// @Default `true` + final bool isProgress; + + /// Enable or not onTap feature on progress indicator + /// + /// @Default `true` + final bool isProgressTap; + + /// If the user is allow to change page + /// + /// @Default `false` + final bool freeze; + + /// Global background color (only visible when a page has a transparent background color) + final Color? globalBackgroundColor; + + /// Dots decorator to custom dots color, size and spacing + final DotsDecorator dotsDecorator; + + /// Decorator to customize the appearance of the progress dots container. + /// This is useful when the background image is full screen. + final Decoration? dotsContainerDecorator; + + /// Animation duration in milliseconds + /// + /// @Default `350` + final int animationDuration; + + /// Auto scroll duration in milliseconds + /// + /// @Default `null` + /// + /// @Note `null` means no auto scroll + /// + /// Once the value of `autoScrollDuration` is set, auto scroll will be activated and it will scroll to the next page automatically after the specified duration. + final int? autoScrollDuration; + + /// Defines if the autoScroll should be infinite, returning to the first page after it reaches the last one. + /// + /// @Default `false` + /// + /// it can only be `true` if `autoScrollDuration` is not `null` + final bool infiniteAutoScroll; + + /// Index of the initial page + /// + /// @Default `0` + final int initialPage; + + /// Flex ratio of the skip or back button + /// + /// @Default `1` + final int skipOrBackFlex; + + /// Flex ratio of the progress indicator + /// + /// @Default `1` + final int dotsFlex; + + /// Flex ratio of the next/done button + /// + /// @Default `1` + final int nextFlex; + + /// Type of animation between pages + /// + /// @Default `Curves.easeIn` + final Curve curve; + + /// Base style for all buttons + final ButtonStyle? baseBtnStyle; + + /// Done button style + final ButtonStyle? doneStyle; + + /// Skip button style + final ButtonStyle? skipStyle; + + /// Next button style + final ButtonStyle? nextStyle; + + /// Back button style + final ButtonStyle? backStyle; + + /// Done button semantic label + final String? doneSemantic; + + /// Skip button semantic label + final String? skipSemantic; + + /// Next button semantic label + final String? nextSemantic; + + /// Back button semantic label + final String? backSemantic; + + /// Progress indicator semantic label + final String Function(int, int)? progressSemantic; + + /// Enable or disable content resizing for bottom inset (e.g. keyboard) + /// + /// @Default `true` + final bool resizeToAvoidBottomInset; + + /// Controls position + /// + /// @Default `Position(left: 0, right: 0, bottom: 0)` + final Position controlsPosition; + + /// Margin for controls + /// + /// @Default `EdgeInsets.zero` + final EdgeInsets controlsMargin; + + /// Margin for controls + /// + /// @Default `EdgeInsets.zero` + final EdgeInsets bodyPadding; + + /// Padding for controls + /// + /// @Default `EdgeInsets.all(16.0)` + final EdgeInsets controlsPadding; + + /// A header widget to be shown on every screen + final Widget? globalHeader; + + /// A footer widget to be shown on every screen + final Widget? globalFooter; + + /// ScrollController of vertical SingleChildScrollView for every single page + final List? scrollControllers; + + /// Scroll/Axis direction of pages, can he horizontal or vertical + /// + /// @Default `Axis.horizontal` + final Axis pagesAxis; + + /// PageView scroll physics (only when freeze is set to false) + /// + /// @Default `BouncingScrollPhysics()` + final ScrollPhysics scrollPhysics; + + /// If is right to left behaviour + /// + /// @Default `false` + final bool rtl; + + /// Corresponds to PageView's parameter of the same name. + /// More details can be found + /// [here](https://api.flutter.dev/flutter/widgets/PageView/PageView.html). + /// + /// @Default `false` + final bool allowImplicitScrolling; + + /// PageView's bool safe area list. + /// the list defines if the safe area will be active on left, right, top and bottom, respectively. + /// + /// @Default `[false,false,false,false]` + final List safeAreaList; + + /// A handler to check if the user is allowed to progress to the next page. + /// If returned value is true, the page will progress to the next page, otherwise the page will not progress. + /// In order to make it work properly with TextFormField, you should place setState in the onChanged callback of the TextFormField. + /// + /// @Default `true` + /// ```dart + /// canProgress: (int page) { + /// if (page == 0 && _textFieldController1.text.isEmpty) { + /// return false; + /// } else if (page == 1 && _textFieldController2.text.isEmpty) { + /// return false; + /// } else { + /// return true; + /// } + /// } + /// ``` + final CanProgress canProgress; + + IntroductionScreen( + {Key? key, + this.pages, + this.rawPages, + this.onDone, + this.onSkip, + this.onChange, + this.done, + this.overrideDone, + this.skip, + this.overrideSkip, + this.next, + this.overrideNext, + this.back, + this.overrideBack, + this.showSkipButton = false, + this.showNextButton = true, + this.showDoneButton = true, + this.showBottomPart = true, + this.showBackButton = false, + this.showFirstBackButton = false, + this.customProgress, + this.isProgress = true, + this.hideBottomOnKeyboard = false, + this.isProgressTap = true, + this.freeze = false, + this.globalBackgroundColor, + this.dotsDecorator = const DotsDecorator(), + this.dotsContainerDecorator, + this.animationDuration = 350, + this.autoScrollDuration, + this.infiniteAutoScroll = false, + this.initialPage = 0, + this.skipOrBackFlex = 1, + this.dotsFlex = 1, + this.nextFlex = 1, + this.curve = Curves.easeIn, + this.baseBtnStyle, + this.skipStyle, + this.nextStyle, + this.doneStyle, + this.backStyle, + this.skipSemantic, + this.nextSemantic, + this.doneSemantic, + this.backSemantic, + this.progressSemantic, + this.resizeToAvoidBottomInset = true, + this.controlsPosition = const Position(left: 0, right: 0, bottom: 0), + this.controlsMargin = EdgeInsets.zero, + this.controlsPadding = const EdgeInsets.all(16.0), + this.bodyPadding = EdgeInsets.zero, + this.globalHeader, + this.globalFooter, + this.scrollControllers, + this.pagesAxis = Axis.horizontal, + this.scrollPhysics = const BouncingScrollPhysics(), + this.rtl = false, + this.allowImplicitScrolling = false, + this.canProgress = kDefaultCanProgressFunction, + this.safeAreaList = const [false, false, false, false]}) + : assert( + pages != null || rawPages != null, + "You must set either 'pages' or 'rawPages' parameter", + ), + assert( + (pages?.length ?? rawPages?.length ?? 0) > 0, + "You must provide at least one page using 'pages' or 'rawPages' parameter !", + ), + assert( + !showDoneButton || done != null || overrideDone != null, + "You must set 'done' or 'overrideDone' parameter, or set 'showDoneButton' to false", + ), + assert( + done == null || onDone != null, + "If you set 'done' parameter, you must also set 'onDone' parameter", + ), + assert( + !showSkipButton || skip != null || overrideSkip != null, + "You must set 'skip' or 'overrideSkip' parameter, or set 'showSkipButton' to false", + ), + assert( + !showNextButton || next != null || overrideNext != null, + "You must set 'next' or 'overrideNext' parameter, or set 'showNextButton' to false", + ), + assert( + !showBackButton || back != null || overrideBack != null, + "You must set 'back' or 'overrideBack' parameter, or set 'showBackButton' to false", + ), + assert( + skipOrBackFlex >= 0 && dotsFlex >= 0 && nextFlex >= 0, + 'Flex parameters must be >= 0', + ), + assert( + initialPage >= 0, + 'Initial page parameter must by a positive number, >= 0.', + ), + assert( + hideBottomOnKeyboard == isProgress || !hideBottomOnKeyboard, + 'hideBottomOnKeyboard can only be true if isProgress = true', + ), + assert( + customProgress != null && isProgress || customProgress == null, + 'customProgress can only be used if isProgress = true', + ), + assert( + (infiniteAutoScroll && autoScrollDuration != null) || + !infiniteAutoScroll, + 'infiniteAutoScroll can only be true if autoScrollDuration != null', + ), + super(key: key); + + @override + IntroductionScreenState createState() => IntroductionScreenState(); +} + +class IntroductionScreenState extends State { + late PageController _pageController; + double _currentPage = 0.0; + bool _isSkipPressed = false; + bool _isScrolling = false; + late bool _showBottom; + StreamSubscription? keyboardSubscription; + + PageController get controller => _pageController; + + @override + void initState() { + super.initState(); + final int initialPage = min(widget.initialPage, getPagesLength() - 1); + _pageController = PageController(initialPage: initialPage); + _showBottom = widget.showBottomPart; + _currentPage = initialPage.toDouble(); + _autoScroll(widget.autoScrollDuration); + if (widget.hideBottomOnKeyboard) { + final keyboardVisibilityController = KeyboardVisibilityController(); + keyboardSubscription = keyboardVisibilityController.onChange.listen( + (bool visible) { + setState(() { + _showBottom = !visible; + }); + }, + ); + } + } + + @override + void dispose() { + _pageController.dispose(); + if (keyboardSubscription != null) { + keyboardSubscription!.cancel(); + } + widget.scrollControllers?.forEach((controller) { + controller?.dispose(); + }); + super.dispose(); + } + + int getPagesLength() { + return (widget.pages ?? widget.rawPages!).length; + } + + int getCurrentPage() => _currentPage.round(); + + Future _autoScroll(int? _durationInt) async { + if (_durationInt != null) { + final Duration _autoscrollDuration = Duration(milliseconds: _durationInt); + final _animationDuration = Duration( + milliseconds: widget.animationDuration, + ); + final int pagesLength = getPagesLength() - 1; + if (widget.infiniteAutoScroll) { + while (mounted) { + await _movePage( + _autoscrollDuration, + _animationDuration, + getCurrentPage() < pagesLength, + ); + } + } else { + while (mounted && getCurrentPage() < pagesLength) { + await _movePage( + _autoscrollDuration, + _animationDuration, + true, + ); + } + } + } + } + + Future _movePage( + Duration autoscrollDuration, + Duration animationDuration, + bool forward, + ) async { + await Future.delayed(autoscrollDuration); + if (mounted && !_isSkipPressed && !_isScrolling) { + if (forward) { + await _pageController.nextPage( + duration: animationDuration, + curve: widget.curve, + ); + } else { + await _pageController.animateToPage( + 0, + duration: animationDuration, + curve: widget.curve, + ); + } + } + } + + void next() { + animateScroll(getCurrentPage() + 1); + FocusScope.of(context).unfocus(); + } + + void previous() { + animateScroll(getCurrentPage() - 1); + FocusScope.of(context).unfocus(); + } + + Future _onSkip() async { + if (widget.onSkip != null) { + widget.onSkip!(); + } else { + await skipToEnd(); + } + } + + Future skipToEnd() async { + setState(() => _isSkipPressed = true); + await animateScroll(getPagesLength() - 1); + if (mounted) { + setState(() => _isSkipPressed = false); + } + } + + Future animateScroll(int page) async { + bool isValidToProgress = widget.canProgress(getCurrentPage()); + if (isValidToProgress) { + _isScrolling = true; + await _pageController.animateToPage( + max(min(page, getPagesLength() - 1), 0), + duration: Duration(milliseconds: widget.animationDuration), + curve: widget.curve, + ); + if (mounted) { + _isScrolling = false; + } + } + } + + bool _onScroll(ScrollNotification notification) { + final metrics = notification.metrics; + if (metrics is PageMetrics && metrics.page != null) { + if (mounted) { + setState(() => _currentPage = metrics.page!); + } + } + return false; + } + + @override + Widget build(BuildContext context) { + final isLastPage = (getCurrentPage() == getPagesLength() - 1); + + Widget? leftBtn; + // show skip button when skip is enabled and back is disabled, + // or show it on the first page when back is enabled. + if (widget.showSkipButton && + ((getCurrentPage() == 0 && widget.showBackButton) || + !widget.showBackButton)) { + leftBtn = Visibility( + visible: !isLastPage && !_isSkipPressed, + maintainState: true, + // Needs to be true to maintain animation + maintainAnimation: true, + // Needs to be true to maintain size + maintainSize: true, + child: widget.overrideSkip != null + ? widget.overrideSkip!(context, _onSkip) + : IntroButton( + child: widget.skip!, + style: widget.baseBtnStyle?.merge(widget.skipStyle) ?? + widget.skipStyle, + semanticLabel: widget.skipSemantic, + onPressed: _onSkip, + ), + ); + } else if ((widget.showFirstBackButton && getCurrentPage() == 0) || + (widget.showBackButton && + getCurrentPage() > 0 && + widget.canProgress(getCurrentPage()))) { + leftBtn = widget.overrideBack != null + ? widget.overrideBack!(context, !_isScrolling ? previous : null) + : IntroButton( + child: widget.back!, + style: widget.baseBtnStyle?.merge(widget.backStyle) ?? + widget.backStyle, + semanticLabel: widget.backSemantic, + onPressed: !_isScrolling ? previous : null, + ); + } + + Widget? rightBtn; + if (isLastPage && widget.showDoneButton) { + rightBtn = widget.overrideDone != null + ? widget.overrideDone!(context, !_isScrolling ? widget.onDone : null) + : IntroButton( + child: widget.done!, + style: widget.baseBtnStyle?.merge(widget.doneStyle) ?? + widget.doneStyle, + semanticLabel: widget.doneSemantic, + onPressed: !_isScrolling ? widget.onDone : null, + ); + } else if (!isLastPage && + widget.showNextButton && + widget.canProgress(getCurrentPage())) { + rightBtn = widget.overrideNext != null + ? widget.overrideNext!(context, !_isScrolling ? next : null) + : IntroButton( + child: widget.next!, + style: widget.baseBtnStyle?.merge(widget.nextStyle) ?? + widget.nextStyle, + semanticLabel: widget.nextSemantic, + onPressed: !_isScrolling ? next : null, + ); + } + + final pages = widget.pages + ?.mapIndexed((index, page) => IntroPage( + page: page, + scrollController: + widget.scrollControllers?.elementAtOrNull(index), + )) + .toList() ?? + widget.rawPages!; + + return SafeArea( + left: widget.safeAreaList[0], + right: widget.safeAreaList[1], + top: widget.safeAreaList[2], + bottom: widget.safeAreaList[3], + child: Scaffold( + backgroundColor: widget.globalBackgroundColor, + resizeToAvoidBottomInset: widget.resizeToAvoidBottomInset, + body: Stack( + children: [ + Positioned.fill( + top: widget.bodyPadding.top, + left: widget.bodyPadding.left, + right: widget.bodyPadding.right, + bottom: widget.bodyPadding.bottom, + child: NotificationListener( + onNotification: _onScroll, + child: PageView( + reverse: widget.rtl, + scrollDirection: widget.pagesAxis, + controller: _pageController, + onPageChanged: widget.onChange, + allowImplicitScrolling: widget.allowImplicitScrolling, + physics: widget.freeze + ? const NeverScrollableScrollPhysics() + : !widget.canProgress(getCurrentPage()) + ? const NeverScrollableScrollPhysics() + : widget.scrollPhysics, + children: pages + .map((page) => NotificationListener( + onNotification: (_) => true, + child: page, + )) + .toList(), + ), + ), + ), + if (widget.globalHeader != null) + Positioned( + top: 0, + left: 0, + right: 0, + child: widget.globalHeader!, + ), + if (_showBottom) + Positioned( + left: widget.controlsPosition.left, + top: widget.controlsPosition.top, + right: widget.controlsPosition.right, + bottom: widget.controlsPosition.bottom, + child: Column( + children: [ + Container( + padding: widget.controlsPadding, + margin: widget.controlsMargin, + decoration: widget.dotsContainerDecorator, + child: Row( + children: [ + Expanded( + flex: widget.skipOrBackFlex, + child: leftBtn ?? const SizedBox(), + ), + Expanded( + flex: widget.dotsFlex, + child: Center( + child: widget.isProgress + ? widget.customProgress ?? + Semantics( + label: widget.progressSemantic?.call( + getCurrentPage() + 1, + getPagesLength()) ?? + "Page ${getCurrentPage() + 1} of ${getPagesLength()}", + excludeSemantics: true, + child: DotsIndicator( + reversed: widget.rtl, + dotsCount: getPagesLength(), + position: _currentPage.toDouble(), + decorator: widget.dotsDecorator, + onTap: widget.isProgressTap && + !widget.freeze + ? (pos) => + animateScroll(pos.toInt()) + : null, + ), + ) + : const SizedBox(), + ), + ), + Expanded( + flex: widget.nextFlex, + child: rightBtn ?? const SizedBox(), + ), + ].asReversed(widget.rtl), + ), + ), + if (widget.globalFooter != null) widget.globalFooter! + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/introduction_screen/lib/src/model/page_decoration.dart b/introduction_screen/lib/src/model/page_decoration.dart new file mode 100644 index 0000000..3070a0b --- /dev/null +++ b/introduction_screen/lib/src/model/page_decoration.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; + +class PageDecoration { + /// Background page color + final Color? pageColor; + + /// TextStyle for title + /// + /// @Default style `fontSize: 20.0, fontWeight: FontWeight.bold` + final TextStyle titleTextStyle; + + /// TextStyle for title + /// + /// @Default style `fontSize: 18.0, fontWeight: FontWeight.normal` + final TextStyle bodyTextStyle; + + /// BoxDecoration for page + final BoxDecoration? boxDecoration; + + /// Flex ratio of the image + final int imageFlex; + + /// Flex ratio of the body + final int bodyFlex; + + /// Flex ratio of the footer + final int footerFlex; + + /// FlexFit of the footer + final FlexFit footerFit; + + /// Padding of image + /// + /// @Default `EdgeInsets.only(bottom: 24.0)` + final EdgeInsets imagePadding; + + /// Margin of content (title + description + footer) + /// + /// @Default `EdgeInsets.all(16.0)` + final EdgeInsets contentMargin; + + /// Margin for page + /// + /// @Default `EdgeInsets.only(bottom: 60.0)` + final EdgeInsets? pageMargin; + + /// Padding of title + /// + /// @Default `EdgeInsets.only(top: 16.0, bottom: 24.0)` + final EdgeInsets titlePadding; + + /// Padding of body + final EdgeInsets? bodyPadding; + + /// Padding of footer + /// + /// @Default `EdgeInsets.symmetric(vertical: 24.0)` + final EdgeInsets footerPadding; + + /// Body alignment + /// + /// @Default `Alignment.topCenter` + final Alignment bodyAlignment; + + /// Image alignment + /// + /// @Default `Alignment.bottomCenter` + final Alignment imageAlignment; + + /// Layout the page using the full screen with the image behind the text. + /// + /// @Default: `false` + final bool fullScreen; + + /// Safe area of the content. Change to avoid the overlap between the dots and the content + /// + /// @Default 60 + final double safeArea; + + const PageDecoration({ + this.pageColor, + this.titleTextStyle = const TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + this.bodyTextStyle = const TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.normal, + ), + this.boxDecoration, + this.imageFlex = 1, + this.bodyFlex = 1, + this.footerFlex = 1, + this.footerFit = FlexFit.loose, + this.imagePadding = const EdgeInsets.only(bottom: 24.0), + this.contentMargin = const EdgeInsets.all(16.0), + this.pageMargin = const EdgeInsets.only(bottom: 60.0), + this.titlePadding = const EdgeInsets.only(top: 16.0, bottom: 24.0), + this.bodyPadding, + this.footerPadding = const EdgeInsets.symmetric(vertical: 24.0), + this.bodyAlignment = Alignment.topCenter, + this.imageAlignment = Alignment.bottomCenter, + this.fullScreen = false, + this.safeArea = 60, + }) : assert(pageColor == null || boxDecoration == null, + 'Cannot provide both a Color and a BoxDecoration\n'); + + PageDecoration copyWith({ + Color? pageColor, + TextStyle? titleTextStyle, + TextStyle? bodyTextStyle, + BoxDecoration? boxDecoration, + int? imageFlex, + int? bodyFlex, + int? footerFlex, + FlexFit? footerFit, + EdgeInsets? imagePadding, + EdgeInsets? contentMargin, + EdgeInsets? pageMargin, + EdgeInsets? titlePadding, + EdgeInsets? descriptionPadding, + EdgeInsets? footerPadding, + Alignment? bodyAlignment, + Alignment? imageAlignment, + bool? fullScreen, + double? safeArea, + }) { + assert( + pageColor == null || boxDecoration == null, + 'Cannot provide both a Color and a BoxDecoration\n', + ); + + return PageDecoration( + pageColor: pageColor ?? this.pageColor, + titleTextStyle: titleTextStyle ?? this.titleTextStyle, + bodyTextStyle: bodyTextStyle ?? this.bodyTextStyle, + boxDecoration: boxDecoration ?? this.boxDecoration, + imageFlex: imageFlex ?? this.imageFlex, + bodyFlex: bodyFlex ?? this.bodyFlex, + footerFlex: footerFlex ?? this.footerFlex, + footerFit: footerFit ?? this.footerFit, + imagePadding: imagePadding ?? this.imagePadding, + contentMargin: contentMargin ?? this.contentMargin, + pageMargin: pageMargin ?? this.pageMargin, + titlePadding: titlePadding ?? this.titlePadding, + bodyPadding: descriptionPadding ?? this.bodyPadding, + footerPadding: footerPadding ?? this.footerPadding, + bodyAlignment: bodyAlignment ?? this.bodyAlignment, + imageAlignment: imageAlignment ?? this.imageAlignment, + fullScreen: fullScreen ?? this.fullScreen, + safeArea: safeArea ?? this.safeArea, + ); + } +} diff --git a/introduction_screen/lib/src/model/page_view_model.dart b/introduction_screen/lib/src/model/page_view_model.dart new file mode 100644 index 0000000..afb4a72 --- /dev/null +++ b/introduction_screen/lib/src/model/page_view_model.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:introduction_screen/src/helper.dart'; + +import '/src/model/page_decoration.dart'; + +class PageViewModel { + /// Title of page + final String? title; + + /// Title of page + final Widget? titleWidget; + + /// Text of page (description) + final String? body; + + /// Widget content of page (description) + final Widget? bodyWidget; + + /// Image of page + /// Tips: Wrap your image with an alignment widget like Align or Center + final Widget? image; + + /// Background image of a page. + /// Spans all over the screen. + /// + /// Tips: can be used alone or as a background image together with the "image" parameter. + final String? backgroundImage; + + /// Footer widget, you can add a button for example + final Widget? footer; + + /// Page decoration + /// Contain all page customizations, like page color, text styles + final PageDecoration decoration; + + /// If widget Order is reverse - body before image + final bool reverse; + + /// Wrap content in scrollView + final bool useScrollView; + + /// Keyboard dismiss behavious for scrollView + final ScrollViewKeyboardDismissBehavior scrollViewKeyboardDismissBehavior; + + /// Use Row instead of Column when in landscape to place image next to the content. + final bool useRowInLandscape; + + PageViewModel({ + this.title, + this.titleWidget, + this.body, + this.bodyWidget, + this.image, + this.backgroundImage, + this.footer, + this.reverse = false, + this.decoration = const PageDecoration(), + this.useScrollView = true, + this.scrollViewKeyboardDismissBehavior = + ScrollViewKeyboardDismissBehavior.manual, + this.useRowInLandscape = false, + }) : assert( + title != null || titleWidget != null, + "You must provide either title (String) or titleWidget (Widget).", + ), + assert( + (title == null) != (titleWidget == null), + "You can not provide both title and titleWidget.", + ), + assert( + body != null || bodyWidget != null, + "You must provide either body (String) or bodyWidget (Widget).", + ), + assert( + (body == null) != (bodyWidget == null), + "You can not provide both body and bodyWidget.", + ), + assert( + backgroundImage == null || + isBackgroundImageAssetPathValid(backgroundImage), + "You must provide a valid image asset path"); +} diff --git a/introduction_screen/lib/src/model/position.dart b/introduction_screen/lib/src/model/position.dart new file mode 100644 index 0000000..3ad14f7 --- /dev/null +++ b/introduction_screen/lib/src/model/position.dart @@ -0,0 +1,10 @@ +class Position { + final double? left; + final double? right; + final double? top; + final double? bottom; + + const Position({this.left, this.right, this.top, this.bottom}); + + const Position.fromLTRB(this.left, this.top, this.right, this.bottom); +} diff --git a/introduction_screen/lib/src/ui/footer_content.dart b/introduction_screen/lib/src/ui/footer_content.dart new file mode 100644 index 0000000..f530a89 --- /dev/null +++ b/introduction_screen/lib/src/ui/footer_content.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import '/introduction_screen.dart'; + +class FooterContent extends StatelessWidget { + final PageViewModel page; + final bool isFullScreen; + + const FooterContent({Key? key, required this.page, this.isFullScreen = false}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + margin: page.decoration.contentMargin, + decoration: isFullScreen + ? page.decoration.boxDecoration ?? + BoxDecoration( + color: page.decoration.pageColor, + borderRadius: BorderRadius.circular(8.0), + ) + : null, + child: Padding( + padding: page.decoration.footerPadding, + child: page.footer, + ), + ); + } +} diff --git a/introduction_screen/lib/src/ui/intro_button.dart b/introduction_screen/lib/src/ui/intro_button.dart new file mode 100644 index 0000000..759b82b --- /dev/null +++ b/introduction_screen/lib/src/ui/intro_button.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class IntroButton extends StatelessWidget { + final Widget child; + final VoidCallback? onPressed; + final ButtonStyle? style; + final String? semanticLabel; + + const IntroButton({ + Key? key, + required this.child, + this.onPressed, + this.style, + this.semanticLabel, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final defaultStyle = TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ); + + return MergeSemantics( + child: Semantics( + label: semanticLabel, + button: true, + child: TextButton( + onPressed: onPressed, + child: child, + style: style?.merge(defaultStyle) ?? defaultStyle, + ), + ), + ); + } +} diff --git a/introduction_screen/lib/src/ui/intro_content.dart b/introduction_screen/lib/src/ui/intro_content.dart new file mode 100644 index 0000000..6a9e6b4 --- /dev/null +++ b/introduction_screen/lib/src/ui/intro_content.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +import '/introduction_screen.dart'; + +class IntroContent extends StatelessWidget { + final PageViewModel page; + final bool isFullScreen; + + const IntroContent({Key? key, required this.page, this.isFullScreen = false}) + : super(key: key); + + Widget _buildWidget(Widget? widget, String? text, TextStyle style) { + return widget ?? Text(text!, style: style, textAlign: TextAlign.center); + } + + @override + Widget build(BuildContext context) { + return Container( + margin: page.decoration.contentMargin, + decoration: isFullScreen + ? page.decoration.boxDecoration ?? + BoxDecoration( + color: page.decoration.pageColor, + borderRadius: BorderRadius.circular(8.0), + ) + : null, + child: Column( + children: [ + Padding( + padding: page.decoration.titlePadding, + child: _buildWidget( + page.titleWidget, + page.title, + page.decoration.titleTextStyle, + ), + ), + Container( + padding: page.decoration.bodyPadding, + child: _buildWidget( + page.bodyWidget, + page.body, + page.decoration.bodyTextStyle, + ), + ), + ], + ), + ); + } +} diff --git a/introduction_screen/lib/src/ui/intro_page.dart b/introduction_screen/lib/src/ui/intro_page.dart new file mode 100644 index 0000000..6b226e1 --- /dev/null +++ b/introduction_screen/lib/src/ui/intro_page.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; + +import '/src/helper.dart'; +import '/src/model/page_view_model.dart'; +import '/src/ui/intro_content.dart'; + +class IntroPage extends StatefulWidget { + final PageViewModel page; + final ScrollController? scrollController; + + const IntroPage({ + Key? key, + required this.page, + this.scrollController, + }) : super(key: key); + + @override + _IntroPageState createState() => _IntroPageState(); +} + +class _IntroPageState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + + Widget _buildStack() { + final PageViewModel page = widget.page; + final content = IntroContent(page: page, isFullScreen: true); + + return Stack( + children: [ + if (page.backgroundImage != null) + Image.asset( + page.backgroundImage!, + fit: BoxFit.cover, + height: double.infinity, + width: double.infinity, + alignment: Alignment.center, + ), + if (page.image != null) page.image!, + Positioned.fill( + child: Column( + children: [ + ...[ + Spacer(flex: page.decoration.imageFlex), + Expanded( + flex: page.decoration.bodyFlex, + child: Align( + alignment: page.decoration.bodyAlignment, + child: page.useScrollView + ? SingleChildScrollView( + controller: widget.scrollController, + physics: const BouncingScrollPhysics(), + keyboardDismissBehavior: + page.scrollViewKeyboardDismissBehavior, + child: content, + ) + : content, + ), + ), + ].asReversed(page.reverse), + if (page.footer != null) + Flexible( + child: page.footer!, + flex: page.decoration.footerFlex, + fit: page.decoration.footerFit, + ), + SafeArea( + top: false, + child: SizedBox( + height: page.decoration.safeArea, + ), + ), + ], + ), + ), + ], + ); + } + + Widget _buildFlex(context) { + final orientation = MediaQuery.of(context).orientation; + final PageViewModel page = widget.page; + + return Container( + color: page.decoration.pageColor, + decoration: page.decoration.boxDecoration, + margin: page.decoration.pageMargin, + child: Flex( + direction: + page.useRowInLandscape && orientation == Orientation.landscape + ? Axis.horizontal + : Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...[ + if (page.image != null) + Expanded( + flex: page.decoration.imageFlex, + child: Align( + alignment: page.decoration.imageAlignment, + child: Padding( + padding: page.decoration.imagePadding, + child: page.image, + ), + ), + ), + Expanded( + flex: page.decoration.bodyFlex, + child: Align( + alignment: page.decoration.bodyAlignment, + child: page.useScrollView + ? SingleChildScrollView( + controller: widget.scrollController, + physics: const BouncingScrollPhysics(), + child: IntroContent(page: page), + ) + : IntroContent(page: page), + ), + ), + ].asReversed(page.reverse), + if (page.footer != null) + Flexible( + child: page.footer!, + flex: page.decoration.footerFlex, + fit: page.decoration.footerFit, + ), + SizedBox(height: page.decoration.safeArea) + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + if (widget.page.decoration.fullScreen || + widget.page.backgroundImage != null) { + return _buildStack(); + } + return _buildFlex(context); + } +} diff --git a/introduction_screen/lib/testable_widget.dart b/introduction_screen/lib/testable_widget.dart new file mode 100644 index 0000000..599d6d3 --- /dev/null +++ b/introduction_screen/lib/testable_widget.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +Widget testableWidget({required Widget child}) { + return MaterialApp( + home: Scaffold(body: child), + ); +} diff --git a/introduction_screen/pubspec.yaml b/introduction_screen/pubspec.yaml new file mode 100644 index 0000000..33e1187 --- /dev/null +++ b/introduction_screen/pubspec.yaml @@ -0,0 +1,20 @@ +name: introduction_screen +description: Introduction/Onboarding package for flutter app with some customizations possibilities +version: 4.0.0 +repository: https://github.com/pyozer/introduction_screen +issue_tracker: https://github.com/pyozer/introduction_screen/issues + +environment: + sdk: ">=2.17.0 <4.0.0" + +dependencies: + flutter: + sdk: flutter + + collection: ^1.18.0 + dots_indicator: ^4.0.1 + flutter_keyboard_visibility_temp_fork: ^0.1.5 + +dev_dependencies: + flutter_test: + sdk: flutter diff --git a/introduction_screen/test/src/helper_test.dart b/introduction_screen/test/src/helper_test.dart new file mode 100644 index 0000000..158fda1 --- /dev/null +++ b/introduction_screen/test/src/helper_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:introduction_screen/src/helper.dart'; + +void main() { + // Global variables + final originalList = [1, 2, 3, 4, 5]; + + group('CustomList', () { + test('asReversed() reverses list when isReverse is true', () { + expect(originalList.asReversed(true), [5, 4, 3, 2, 1]); + }); + + test('asReversed() returns original list when isReverse is false', () { + expect(originalList.asReversed(false), [1, 2, 3, 4, 5]); + }); + }); +} diff --git a/introduction_screen/test/src/introduction_screen_test.dart b/introduction_screen/test/src/introduction_screen_test.dart new file mode 100644 index 0000000..e614f9e --- /dev/null +++ b/introduction_screen/test/src/introduction_screen_test.dart @@ -0,0 +1,234 @@ +import 'package:dots_indicator/dots_indicator.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:introduction_screen/introduction_screen.dart'; + +void main() { + // Helper function to create the IntroductionScreen widget + Widget createIntroductionScreen({ + required List pages, + VoidCallback? onDone, + VoidCallback? onSkip, + bool showSkipButton = false, + bool showDoneButton = false, + bool showNextButton = true, + bool showBackButton = false, + int initialPage = 0, + int? autoScrollDuration, + }) { + return MaterialApp( + home: IntroductionScreen( + pages: pages, + done: showDoneButton ? Text("Done") : null, + onDone: onDone, + skip: showSkipButton ? Text("Skip") : null, + onSkip: onSkip, + next: showNextButton ? Text("Next") : null, + showSkipButton: showSkipButton, + showDoneButton: showDoneButton, + showBackButton: showBackButton, + back: showBackButton ? Text("Back") : null, + showNextButton: showNextButton, + autoScrollDuration: autoScrollDuration, + initialPage: initialPage, + ), + ); + } + + group('IntroductionScreen Widget Tests', () { + testWidgets('Initial page is rendered and buttons are displayed', + (tester) async { + // Act + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + ]; + + await tester.pumpWidget( + createIntroductionScreen(pages: pages, showSkipButton: true)); + + // Assert + expect(find.text('Page 1'), findsOneWidget); + expect(find.text('Skip'), findsOneWidget); + expect(find.text('Next'), findsOneWidget); + }); + + testWidgets('Next button advances the page', (tester) async { + // Arrange + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + ]; + await tester.pumpWidget(createIntroductionScreen(pages: pages)); + + // Act + await tester.tap(find.text('Next')); + await tester.pumpAndSettle(); + + // Assert + expect(find.text('Page 2'), findsOneWidget); + }); + + testWidgets('Back button goes back to the previous page', (tester) async { + // Arrange + await tester.pumpWidget(createIntroductionScreen( + pages: [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + ], + showBackButton: true, + initialPage: 1, + )); + + expect(find.text('Page 1'), findsNothing); + expect(find.text('Page 2'), findsOneWidget); + + // Act + await tester.tap(find.text('Back')); + await tester.pumpAndSettle(); + + // Assert + expect(find.text('Page 1'), findsOneWidget); + expect(find.text('Page 2'), findsNothing); + }); + + testWidgets('Skip button triggers onSkip callback', (tester) async { + // Arrange + var skipTapped = false; + + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + PageViewModel(title: 'Page 3', body: 'Introduction 3'), + ]; + + await tester.pumpWidget( + createIntroductionScreen( + pages: pages, + onSkip: () => skipTapped = true, + showSkipButton: true, + ), + ); + + // Act + await tester.tap(find.text('Skip')); + await tester.pumpAndSettle(); + + // Assert + expect(skipTapped, isTrue); + }); + + testWidgets('Skip to end navigates to the last page', + (WidgetTester tester) async { + // Arrange + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + PageViewModel(title: 'Page 3', body: 'Introduction 3'), + ]; + await tester.pumpWidget( + createIntroductionScreen( + pages: pages, + showSkipButton: true, + ), + ); + + // Initially, the first page should be visible + expect(find.text('Page 1'), findsOneWidget); + + // Tap the skip button to skip to the end + await tester.tap(find.text('Skip')); + await tester.pumpAndSettle(); + + // Verify that we are now on the last page + expect(find.text('Page 3'), findsOneWidget); + }); + + testWidgets('Done button triggers onDone callback', (tester) async { + // Arrange + var doneTapped = false; + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + ]; + + await tester.pumpWidget( + createIntroductionScreen( + pages: pages, + onDone: () => doneTapped = true, + showDoneButton: true, + ), + ); + + // Act + // Navigate to the last page + await tester.tap(find.text('Next')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Done')); + await tester.pumpAndSettle(); + + // Assert + expect(doneTapped, isTrue); + }); + + testWidgets('Progress indicator updates with page change', (tester) async { + // Arrange + final pages = [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + ]; + + await tester.pumpWidget(createIntroductionScreen(pages: pages)); + + // Assert initial page + expect(find.byType(DotsIndicator), findsOneWidget); + DotsIndicator indicator = tester.widget(find.byType(DotsIndicator)); + expect(indicator.position, 0.0); + + // Act - Move to the next page + await tester.tap(find.text('Next')); + await tester.pumpAndSettle(); + + // Assert updated indicator + indicator = tester.widget(find.byType(DotsIndicator)); + expect(indicator.position, 1.0); + }); + }); + + testWidgets('Auto-scroll advances one page at a time', + (WidgetTester tester) async { + // Arrange + const autoScrollDuration = 2000; + await tester.pumpWidget(createIntroductionScreen( + pages: [ + PageViewModel(title: 'Page 1', body: 'Introduction 1'), + PageViewModel(title: 'Page 2', body: 'Introduction 2'), + PageViewModel(title: 'Page 3', body: 'Introduction 3'), + ], + autoScrollDuration: autoScrollDuration, + )); + + // Should still be at page 1 after 100 ms + await tester.pump(Duration(milliseconds: 100)); + await tester.pumpAndSettle(); + expect(find.text('Page 1'), findsOneWidget); + expect(find.text('Page 2'), findsNothing); + expect(find.text('Page 3'), findsNothing); + + // Wait for first auto-scroll, should be on page 2 now + await tester.pump(Duration(milliseconds: autoScrollDuration + 100)); + await tester.pumpAndSettle(); + + expect(find.text('Page 1'), findsNothing); + expect(find.text('Page 2'), findsOneWidget); + expect(find.text('Page 3'), findsNothing); + + // Wait for second auto-scroll, should be on page 3 now + await tester.pump(Duration(milliseconds: autoScrollDuration)); + await tester.pumpAndSettle(); + + expect(find.text('Page 1'), findsNothing); + expect(find.text('Page 2'), findsNothing); + expect(find.text('Page 3'), findsOneWidget); + }); +} diff --git a/introduction_screen/test/src/model/page_decoration_test.dart b/introduction_screen/test/src/model/page_decoration_test.dart new file mode 100644 index 0000000..1b93ba0 --- /dev/null +++ b/introduction_screen/test/src/model/page_decoration_test.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:introduction_screen/src/model/page_decoration.dart'; + +void main() { + group('PageDecoration', () { + test('default constructor initializes with correct default values', () { + final decoration = PageDecoration(); + + expect(decoration.pageColor, isNull); + expect(decoration.titleTextStyle.fontSize, 20.0); + expect(decoration.titleTextStyle.fontWeight, FontWeight.bold); + expect(decoration.bodyTextStyle.fontSize, 18.0); + expect(decoration.bodyTextStyle.fontWeight, FontWeight.normal); + expect(decoration.imageFlex, 1); + expect(decoration.bodyFlex, 1); + expect(decoration.footerFlex, 1); + expect(decoration.footerFit, FlexFit.loose); + expect(decoration.imagePadding, EdgeInsets.only(bottom: 24.0)); + expect(decoration.contentMargin, EdgeInsets.all(16.0)); + expect(decoration.pageMargin, EdgeInsets.only(bottom: 60.0)); + expect(decoration.titlePadding, EdgeInsets.only(top: 16.0, bottom: 24.0)); + expect(decoration.footerPadding, EdgeInsets.symmetric(vertical: 24.0)); + expect(decoration.bodyAlignment, Alignment.topCenter); + expect(decoration.imageAlignment, Alignment.bottomCenter); + expect(decoration.fullScreen, isFalse); + expect(decoration.safeArea, 60); + }); + + test('cannot provide both pageColor and boxDecoration', () { + expect( + () => PageDecoration( + pageColor: Colors.white, boxDecoration: BoxDecoration()), + throwsA(isA()), + ); + }); + + test('copyWith returns a new instance with updated values', () { + final decoration = PageDecoration( + pageColor: Colors.white, + titleTextStyle: TextStyle(fontSize: 22.0), + ); + + final newDecoration = decoration.copyWith( + bodyTextStyle: TextStyle(fontSize: 20.0), + footerFlex: 2, + ); + + expect(newDecoration.pageColor, Colors.white); + expect(newDecoration.titleTextStyle.fontSize, 22.0); + expect(newDecoration.bodyTextStyle.fontSize, 20.0); + expect(newDecoration.footerFlex, 2); + expect(newDecoration.imageFlex, + decoration.imageFlex); // Should remain the same + }); + + test('copyWith does not modify original instance', () { + final decoration = PageDecoration(pageColor: Colors.white); + decoration.copyWith(titleTextStyle: TextStyle(fontSize: 22.0)); + + expect(decoration.titleTextStyle.fontSize, + 20.0); // Original should remain unchanged + }); + }); +} diff --git a/introduction_screen/test/src/model/position_test.dart b/introduction_screen/test/src/model/position_test.dart new file mode 100644 index 0000000..bc24b24 --- /dev/null +++ b/introduction_screen/test/src/model/position_test.dart @@ -0,0 +1,43 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:introduction_screen/src/model/position.dart'; + +void main() { + group('Position', () { + test('default constructor initializes with null values', () { + final position = Position(); + + expect(position.left, isNull); + expect(position.right, isNull); + expect(position.top, isNull); + expect(position.bottom, isNull); + }); + + test('constructor initializes with specified values', () { + final position = + Position(left: 10.0, top: 20.0, right: 30.0, bottom: 40.0); + + expect(position.left, 10.0); + expect(position.top, 20.0); + expect(position.right, 30.0); + expect(position.bottom, 40.0); + }); + + test('fromLTRB constructor initializes with specified values', () { + final position = Position.fromLTRB(10.0, 20.0, 30.0, 40.0); + + expect(position.left, 10.0); + expect(position.top, 20.0); + expect(position.right, 30.0); + expect(position.bottom, 40.0); + }); + + test('fromLTRB constructor with null values', () { + final position = Position.fromLTRB(null, null, null, null); + + expect(position.left, isNull); + expect(position.top, isNull); + expect(position.right, isNull); + expect(position.bottom, isNull); + }); + }); +} diff --git a/introduction_screen/test/widget/intro_ui_test.dart b/introduction_screen/test/widget/intro_ui_test.dart new file mode 100644 index 0000000..efef456 --- /dev/null +++ b/introduction_screen/test/widget/intro_ui_test.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:introduction_screen/introduction_screen.dart'; +import 'package:introduction_screen/src/ui/intro_page.dart'; +import 'package:introduction_screen/testable_widget.dart'; + +import 'package:introduction_screen/src/ui/intro_button.dart'; +import 'package:introduction_screen/src/ui/intro_content.dart'; + +void main() { + group("Intro UI widget tests", () { + final titleFinder = find.text('Test Title'); + final bodyFinder = find.text('Test Body'); + final footerFinder = find.text('Test Footer'); + + // Helper function to create the IntroPage widget + Widget createIntroPage( + {bool isFullScreen = false, + PageDecoration? pageDecoration, + bool useScrollView = true, + Widget? image}) { + return IntroPage( + page: PageViewModel( + title: 'Test Title', + body: 'Test Body', + image: image, + footer: const Text('Test Footer'), + decoration: pageDecoration ?? const PageDecoration(), + useScrollView: useScrollView, + ), + ); + } + + testWidgets('IntroButton has text', (tester) async { + await tester.pumpWidget(testableWidget( + child: IntroButton(child: const Text('Test Text')), + )); + + final textFinder = find.text('Test Text'); + expect(textFinder, findsOneWidget); + }); + + testWidgets('IntroContent is rendered', (tester) async { + await tester.pumpWidget(testableWidget( + child: IntroContent( + page: PageViewModel( + title: 'Test Title', + body: 'Test Body', + footer: const Text('Test Footer'), + ), + ), + )); + + expect(titleFinder, findsOneWidget); + expect(bodyFinder, findsOneWidget); + expect(footerFinder, findsNothing); + }); + + testWidgets('Intro Content renders full screen with decoration', + (WidgetTester tester) async { + await tester.pumpWidget(testableWidget( + child: IntroContent( + page: PageViewModel( + title: 'Test Title', + body: 'Test Body', + footer: const Text('Test Footer'), + ), + isFullScreen: true), + )); + + // Find the IntroContent widget + final introContentFinder = find.byType(IntroContent); + expect(introContentFinder, findsOneWidget); + + // Check if the container has a decoration when isFullScreen is true + final introContent = tester.widget(introContentFinder); + expect(introContent.isFullScreen, isTrue); + }); + + testWidgets('renders IntroPage with full screen stack', + (WidgetTester tester) async { + await tester.pumpWidget( + testableWidget( + child: createIntroPage( + pageDecoration: PageDecoration(fullScreen: true), + ), + ), + ); + + // Check that the IntroContent is rendered in a Stack + expect(find.byType(Stack), findsWidgets); + expect(find.byType(IntroContent), findsOneWidget); + expect(find.byType(SingleChildScrollView), + findsOneWidget); // No scroll view if useScrollView is false + }); + + testWidgets('renders IntroPage with Flex layout', + (WidgetTester tester) async { + await tester.pumpWidget( + testableWidget(child: createIntroPage(useScrollView: false))); + + // Check that the IntroContent is rendered in a Flex layout + expect(find.byType(Flex), findsOneWidget); + expect(find.byType(IntroContent), findsOneWidget); + expect(find.byType(SingleChildScrollView), + findsNothing); // No scroll view if useScrollView is false + }); + + testWidgets('renders IntroPage with image when provided', + (WidgetTester tester) async { + // Create a mock image widget + final mockImage = Container( + color: Colors.blue, + width: 100, + height: 100, + ); + + await tester.pumpWidget(testableWidget( + child: createIntroPage( + useScrollView: false, + image: mockImage, // Set the page image to the mock image + ), + )); + + // Check that the image is rendered + expect(find.byWidget(mockImage), findsOneWidget); + }); + + testWidgets('IntroButton custom styles override default styles', + (tester) async { + // Create a custom style with a different border radius + final customStyle = TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(20.0), // Different from default 8.0 + ), + backgroundColor: Colors.blue, // Additional property to verify + ); + + await tester.pumpWidget(testableWidget( + child: IntroButton( + child: const Text('Test Text'), + style: customStyle, + ), + )); + + // Find the TextButton + final button = tester.widget(find.byType(TextButton)); + + // Get the shape from the button's style + final shape = button.style?.shape?.resolve({}); + expect(shape, isA()); + final borderRadius = (shape as RoundedRectangleBorder).borderRadius; + expect(borderRadius, BorderRadius.circular(20.0)); + + // Verify the background color was also applied + final backgroundColor = button.style?.backgroundColor?.resolve({}); + expect(backgroundColor, Colors.blue); + }); + }); +} diff --git a/libsignal_protocol_dart/LICENSE b/libsignal_protocol_dart/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/libsignal_protocol_dart/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/libsignal_protocol_dart/lib/libsignal_protocol_dart.dart b/libsignal_protocol_dart/lib/libsignal_protocol_dart.dart new file mode 100644 index 0000000..c720691 --- /dev/null +++ b/libsignal_protocol_dart/lib/libsignal_protocol_dart.dart @@ -0,0 +1,52 @@ +export 'src/decryption_callback.dart'; +export 'src/duplicate_message_exception.dart'; +export 'src/ecc/curve.dart'; +export 'src/ecc/djb_ec_private_key.dart'; +export 'src/ecc/djb_ec_public_key.dart'; +export 'src/ecc/ec_key_pair.dart'; +export 'src/ecc/ec_private_key.dart'; +export 'src/ecc/ec_public_key.dart'; +export 'src/fingerprint/displayable_fingerprint.dart'; +export 'src/fingerprint/fingerprint.dart'; +export 'src/fingerprint/numeric_fingerprint_generator.dart'; +export 'src/fingerprint/scannable_fingerprint.dart'; +export 'src/groups/group_cipher.dart'; +export 'src/groups/group_session_builder.dart'; +export 'src/groups/sender_key_name.dart'; +export 'src/groups/state/in_memory_sender_key_store.dart'; +export 'src/groups/state/sender_key_record.dart'; +export 'src/groups/state/sender_key_store.dart'; +export 'src/identity_key.dart'; +export 'src/identity_key_pair.dart'; +export 'src/invalid_key_exception.dart'; +export 'src/invalid_key_id_exception.dart'; +export 'src/legacy_message_exception.dart'; +export 'src/no_session_exception.dart'; +export 'src/protocol/ciphertext_message.dart'; +export 'src/protocol/pre_key_signal_message.dart'; +export 'src/protocol/sender_key_distribution_message_wrapper.dart'; +export 'src/protocol/sender_key_message.dart'; +export 'src/protocol/signal_message.dart'; +export 'src/provisioning_cipher.dart'; +export 'src/session_builder.dart'; +export 'src/session_cipher.dart'; +export 'src/signal_protocol_address.dart'; +export 'src/state/identity_key_store.dart'; +export 'src/state/impl/in_memory_identity_key_store.dart'; +export 'src/state/impl/in_memory_pre_key_store.dart'; +export 'src/state/impl/in_memory_session_store.dart'; +export 'src/state/impl/in_memory_signal_protocol_store.dart'; +export 'src/state/impl/in_memory_signed_pre_key_store.dart'; +export 'src/state/pre_key_bundle.dart'; +export 'src/state/pre_key_record.dart'; +export 'src/state/pre_key_store.dart'; +export 'src/state/session_record.dart'; +export 'src/state/session_state.dart'; +export 'src/state/session_store.dart'; +export 'src/state/signal_protocol_store.dart'; +export 'src/state/signed_pre_key_record.dart'; +export 'src/state/signed_pre_key_store.dart'; +export 'src/untrusted_identity_exception.dart'; +export 'src/util/byte_util.dart'; +export 'src/util/key_helper.dart'; +export 'src/util/medium.dart'; diff --git a/libsignal_protocol_dart/lib/src/cbc.dart b/libsignal_protocol_dart/lib/src/cbc.dart new file mode 100644 index 0000000..c77e4b2 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/cbc.dart @@ -0,0 +1,40 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; + +Uint8List aesCbcEncrypt(Uint8List key, Uint8List iv, Uint8List plaintext) { + final paddedPlaintext = pad(plaintext, 16); + final cbc = CBCBlockCipher(AESEngine()) + ..init(true, ParametersWithIV(KeyParameter(key), iv)); // true=encrypt + + final cipherText = Uint8List(paddedPlaintext.length); // allocate space + var offset = 0; + while (offset < paddedPlaintext.length) { + offset += cbc.processBlock(paddedPlaintext, offset, cipherText, offset); + } + assert(offset == paddedPlaintext.length); + return cipherText; +} + +Uint8List aesCbcDecrypt(Uint8List key, Uint8List iv, Uint8List cipherText) { + final cbc = CBCBlockCipher(AESEngine()) + ..init(false, ParametersWithIV(KeyParameter(key), iv)); // false=decrypt + + final paddedPlainText = Uint8List(cipherText.length); // allocate space + var offset = 0; + while (offset < cipherText.length) { + offset += cbc.processBlock(cipherText, offset, paddedPlainText, offset); + } + assert(offset == cipherText.length); + return unpad(paddedPlainText); +} + +Uint8List pad(Uint8List bytes, int blockSize) { + final padLength = blockSize - (bytes.length % blockSize); + final padded = Uint8List(bytes.length + padLength)..setAll(0, bytes); + PKCS7Padding().addPadding(padded, bytes.length); + return padded; +} + +Uint8List unpad(Uint8List padded) => + padded.sublist(0, padded.length - PKCS7Padding().padCount(padded)); diff --git a/libsignal_protocol_dart/lib/src/decryption_callback.dart b/libsignal_protocol_dart/lib/src/decryption_callback.dart new file mode 100644 index 0000000..d56013f --- /dev/null +++ b/libsignal_protocol_dart/lib/src/decryption_callback.dart @@ -0,0 +1,3 @@ +import 'dart:typed_data'; + +typedef DecryptionCallback = void Function(Uint8List plaintext); diff --git a/libsignal_protocol_dart/lib/src/devices/device_consistency_code_generator.dart b/libsignal_protocol_dart/lib/src/devices/device_consistency_code_generator.dart new file mode 100644 index 0000000..29a6699 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/devices/device_consistency_code_generator.dart @@ -0,0 +1,41 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import '../util/byte_util.dart'; + +import 'device_consistency_commitment.dart'; +import 'device_consistency_signature.dart'; + +class DeviceConsistencyCodeGenerator { + static const int codeVersion = 0; + + static String generateFor(DeviceConsistencyCommitment commitment, + List signatures) { + final sortedSignatures = [...signatures] + ..sort(compareSignature); + + final output = AccumulatorSink(); + final input = sha512.startChunkedConversion(output) + ..add(ByteUtil.shortToByteArray(codeVersion)) + ..add(commitment.serialized); + + for (final signature in sortedSignatures) { + input.add(signature.vrfOutput); + } + input.close(); + final hash = output.events.single.bytes; + final digits = getEncodedChunk(Uint8List.fromList(hash), 0) + + getEncodedChunk(Uint8List.fromList(hash), 5); + return digits.substring(0, 6); + } + + static String getEncodedChunk(Uint8List hash, int offset) { + final chunk = ByteUtil.byteArray5ToLong(hash, offset).remainder(100000); + return chunk.toString().padLeft(5, '0'); + } +} + +int compareSignature( + DeviceConsistencySignature a, DeviceConsistencySignature b) => + ByteUtil.compare(a.vrfOutput, b.vrfOutput); diff --git a/libsignal_protocol_dart/lib/src/devices/device_consistency_commitment.dart b/libsignal_protocol_dart/lib/src/devices/device_consistency_commitment.dart new file mode 100644 index 0000000..1e0dc92 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/devices/device_consistency_commitment.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; + +import '../identity_key.dart'; +import '../util/byte_util.dart'; + +class DeviceConsistencyCommitment { + DeviceConsistencyCommitment(int generation, List identityKeys) { + final sortedIdentityKeys = [...identityKeys]..sort((a, b) => + ByteUtil.compare(a.publicKey.serialize(), b.publicKey.serialize())); + + final output = AccumulatorSink(); + final input = sha512.startChunkedConversion(output) + ..add(utf8.encode(version)) + ..add(ByteUtil.intToByteArray(generation)); + + for (final commitment in sortedIdentityKeys) { + input.add(commitment.publicKey.serialize()); + } + input.close(); + + _generation = generation; + _serialized = Uint8List.fromList(output.events.single.bytes); + } + + static const String version = 'DeviceConsistencyCommitment_V0'; + + late int _generation; + late Uint8List _serialized; + + Uint8List get serialized => _serialized; + + int get generation => _generation; +} diff --git a/libsignal_protocol_dart/lib/src/devices/device_consistency_signature.dart b/libsignal_protocol_dart/lib/src/devices/device_consistency_signature.dart new file mode 100644 index 0000000..965e4f2 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/devices/device_consistency_signature.dart @@ -0,0 +1,12 @@ +import 'dart:typed_data'; + +class DeviceConsistencySignature { + DeviceConsistencySignature(this._signature, this._vrfOutput); + + final Uint8List _signature; + final Uint8List _vrfOutput; + + Uint8List get vrfOutput => _vrfOutput; + + Uint8List get signature => _signature; +} diff --git a/libsignal_protocol_dart/lib/src/duplicate_message_exception.dart b/libsignal_protocol_dart/lib/src/duplicate_message_exception.dart new file mode 100644 index 0000000..662e7a6 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/duplicate_message_exception.dart @@ -0,0 +1,7 @@ +class DuplicateMessageException implements Exception { + DuplicateMessageException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'DuplicateMessageException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/ecc/curve.dart b/libsignal_protocol_dart/lib/src/ecc/curve.dart new file mode 100644 index 0000000..4deda5e --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/curve.dart @@ -0,0 +1,187 @@ +import 'dart:typed_data'; + +import 'package:x25519/x25519.dart' as x25519; + +import '../invalid_key_exception.dart'; +import '../util/key_helper.dart'; +import 'djb_ec_private_key.dart'; +import 'djb_ec_public_key.dart'; +import 'ec_key_pair.dart'; +import 'ec_private_key.dart'; +import 'ec_public_key.dart'; +import 'ed25519.dart'; + +typedef KeyPairGenerator = GeneratedKeyPair Function(); +typedef AgreementCalculator = Uint8List Function(Uint8List, Uint8List); + +class GeneratedKeyPair { + GeneratedKeyPair(this.private, this.public); + + final Uint8List private; + final Uint8List public; +} + +class Curve { + static const int djbType = 0x05; + + static KeyPairGenerator? keyPairGenerator; + static AgreementCalculator? agreementCalculator; + + static ECKeyPair generateKeyPair() { + final x25519.KeyPair keyPair; + final generator = keyPairGenerator; + if (generator != null) { + final kp = generator(); + keyPair = x25519.KeyPair(privateKey: kp.private, publicKey: kp.public); + } else { + keyPair = x25519.generateKeyPair(); + } + + return ECKeyPair(DjbECPublicKey(Uint8List.fromList(keyPair.publicKey)), + DjbECPrivateKey(Uint8List.fromList(keyPair.privateKey))); + } + + static ECKeyPair generateKeyPairFromPrivate(List private) { + if (private.length != 32) { + throw InvalidKeyException( + 'Invalid private key length: ${private.length}'); + } + final public = List.filled(32, 0); + + private[0] &= 248; + private[31] &= 127; + private[31] |= 64; + + x25519.ScalarBaseMult(public, private); + + return ECKeyPair(DjbECPublicKey(Uint8List.fromList(public)), + DjbECPrivateKey(Uint8List.fromList(private))); + } + + static ECPublicKey decodePointList(List bytes, int offset) => + decodePoint(Uint8List.fromList(bytes), offset); + + static ECPublicKey decodePoint(Uint8List bytes, int offset) { + if (bytes.length - offset < 1) { + throw InvalidKeyException('No key type identifier'); + } + + final type = bytes[offset] & 0xFF; + + switch (type) { + case Curve.djbType: + if (bytes.length - offset < 33) { + throw InvalidKeyException('Bad key length: ${bytes.length}'); + } + + final keyBytes = Uint8List(32); + arraycopy(bytes, offset + 1, keyBytes, 0, keyBytes.length); + return DjbECPublicKey(keyBytes); + default: + throw InvalidKeyException('Bad key type: $type'); + } + } + + static void arraycopy( + List src, int srcPos, List dest, int destPos, int length) { + dest.setRange(destPos, length + destPos, src, srcPos); + } + + static ECPrivateKey decodePrivatePoint(Uint8List bytes) => + DjbECPrivateKey(bytes); + + static Uint8List calculateAgreement( + ECPublicKey? publicKey, ECPrivateKey? privateKey) { + if (publicKey == null) { + throw Exception('publicKey value is null'); + } + + if (privateKey == null) { + throw Exception('privateKey value is null'); + } + if (publicKey.getType() != privateKey.getType()) { + throw Exception('Public and private keys must be of the same type!'); + } + + if (publicKey.getType() == djbType) { + final calculator = agreementCalculator; + if (calculator != null) { + return calculator( + (privateKey as DjbECPrivateKey).privateKey, + (publicKey as DjbECPublicKey).publicKey, + ); + } + + final secretKey = x25519.X25519( + List.from((privateKey as DjbECPrivateKey).privateKey), + List.from((publicKey as DjbECPublicKey).publicKey), + ); + return secretKey; + } else { + throw Exception('Unknown type: ${publicKey.getType()}'); + } + } + + static bool verifySignature( + ECPublicKey? signingKey, Uint8List? message, Uint8List? signature) { + if (signingKey == null || message == null || signature == null) { + throw InvalidKeyException('Values must not be null'); + } + + if (signingKey.getType() == djbType) { + if (signature.length != 64) { + return false; + } + + final publicKey = (signingKey as DjbECPublicKey).publicKey; + return verifySig(publicKey, message, signature); + } else { + throw InvalidKeyException( + 'Unknown Signing Key type${signingKey.getType()}'); + } + } + + static Uint8List calculateSignature( + ECPrivateKey? signingKey, Uint8List? message) { + if (signingKey == null || message == null) { + throw Exception('Values must not be null'); + } + + if (signingKey.getType() == djbType) { + final privateKey = signingKey.serialize(); + final random = generateRandomBytes(); + + return sign(privateKey, message, random); + } else { + throw Exception('Unknown Signing Key type${signingKey.getType()}'); + } + } + + static Uint8List calculateVrfSignature( + ECPrivateKey? signingKey, Uint8List? message) { + if (signingKey == null || message == null) { + throw Exception('Values must not be null'); + } + + if (signingKey.getType() == djbType) { + // TODO + } else { + throw Exception('Unknown Signing Key type${signingKey.getType()}'); + } + return Uint8List(0); + } + + static Uint8List verifyVrfSignature( + ECPublicKey? signingKey, Uint8List? message, Uint8List? signature) { + if (signingKey == null || message == null || signature == null) { + throw Exception('Values must not be null'); + } + + if (signingKey.getType() == djbType) { + // TODO + } else { + throw Exception('Unknown Signing Key type${signingKey.getType()}'); + } + return Uint8List(0); + } +} diff --git a/libsignal_protocol_dart/lib/src/ecc/djb_ec_private_key.dart b/libsignal_protocol_dart/lib/src/ecc/djb_ec_private_key.dart new file mode 100644 index 0000000..c5ae4f9 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/djb_ec_private_key.dart @@ -0,0 +1,18 @@ +import 'dart:typed_data'; + +import 'curve.dart'; +import 'ec_private_key.dart'; + +class DjbECPrivateKey extends ECPrivateKey { + DjbECPrivateKey(this._privateKey); + + final Uint8List _privateKey; + + @override + int getType() => Curve.djbType; + + @override + Uint8List serialize() => privateKey; + + Uint8List get privateKey => _privateKey; +} diff --git a/libsignal_protocol_dart/lib/src/ecc/djb_ec_public_key.dart b/libsignal_protocol_dart/lib/src/ecc/djb_ec_public_key.dart new file mode 100644 index 0000000..e86e3bd --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/djb_ec_public_key.dart @@ -0,0 +1,44 @@ +import 'dart:typed_data'; + +import 'package:meta/meta.dart'; + +import '../eq.dart'; + +import 'curve.dart'; +import 'ec_public_key.dart'; + +@immutable +class DjbECPublicKey extends ECPublicKey { + DjbECPublicKey(this._publicKey); + + final Uint8List _publicKey; + + @override + int getType() => Curve.djbType; + + @override + Uint8List serialize() => Uint8List.fromList([Curve.djbType] + _publicKey); + + Uint8List get publicKey => _publicKey; + + @override + int compareTo(ECPublicKey another) => decodeBigInt(publicKey) + .compareTo(decodeBigInt((another as DjbECPublicKey).publicKey)); + + @override + bool operator ==(Object other) { + if (other is! DjbECPublicKey) return false; + return eq(_publicKey, other._publicKey); + } + + @override + int get hashCode => _publicKey.hashCode; + + BigInt decodeBigInt(List bytes) { + var result = BigInt.from(0); + for (var i = 0; i < bytes.length; i++) { + result += BigInt.from(bytes[bytes.length - i - 1]) << (8 * i); + } + return result; + } +} diff --git a/libsignal_protocol_dart/lib/src/ecc/ec_key_pair.dart b/libsignal_protocol_dart/lib/src/ecc/ec_key_pair.dart new file mode 100644 index 0000000..56b1a71 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/ec_key_pair.dart @@ -0,0 +1,13 @@ +import 'ec_private_key.dart'; +import 'ec_public_key.dart'; + +class ECKeyPair { + ECKeyPair(this._publicKey, this._privateKey); + + final ECPublicKey _publicKey; + final ECPrivateKey _privateKey; + + ECPublicKey get publicKey => _publicKey; + + ECPrivateKey get privateKey => _privateKey; +} diff --git a/libsignal_protocol_dart/lib/src/ecc/ec_private_key.dart b/libsignal_protocol_dart/lib/src/ecc/ec_private_key.dart new file mode 100644 index 0000000..4fe18c5 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/ec_private_key.dart @@ -0,0 +1,6 @@ +import 'dart:typed_data'; + +abstract class ECPrivateKey { + Uint8List serialize(); + int getType(); +} diff --git a/libsignal_protocol_dart/lib/src/ecc/ec_public_key.dart b/libsignal_protocol_dart/lib/src/ecc/ec_public_key.dart new file mode 100644 index 0000000..21e5886 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/ec_public_key.dart @@ -0,0 +1,8 @@ +import 'dart:typed_data'; + +abstract class ECPublicKey implements Comparable { + static const int keySize = 33; + + Uint8List serialize(); + int getType(); +} diff --git a/libsignal_protocol_dart/lib/src/ecc/ed25519.dart b/libsignal_protocol_dart/lib/src/ecc/ed25519.dart new file mode 100644 index 0000000..3bb28e8 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ecc/ed25519.dart @@ -0,0 +1,117 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart' as cr; +import 'package:ed25519_edwards/ed25519_edwards.dart'; +// ignore: implementation_imports +import 'package:ed25519_edwards/src/edwards25519.dart'; + +import 'curve.dart'; + +Uint8List sign(Uint8List privateKey, Uint8List message, Uint8List random) { + final A = ExtendedGroupElement(); + final publicKey = Uint8List(32); + GeScalarMultBase(A, privateKey); + A.ToBytes(publicKey); + + // Calculate r + final diversifier = Uint8List.fromList([ + 0xFE, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF + ]); + + var output = AccumulatorSink(); + cr.sha512.startChunkedConversion(output) + ..add(diversifier) + ..add(privateKey) + ..add(message) + ..add(random) + ..close(); + final r = output.events.single.bytes; + + final rReduced = Uint8List(32); + ScReduce(rReduced, Uint8List.fromList(r)); + final R = ExtendedGroupElement(); + GeScalarMultBase(R, rReduced); + + final encodedR = Uint8List(32); + R.ToBytes(encodedR); + + output = AccumulatorSink(); + cr.sha512.startChunkedConversion(output) + ..add(encodedR) + ..add(publicKey) + ..add(message) + ..close(); + final hramDigest = output.events.single.bytes; + + final hramDigestReduced = Uint8List(32); + ScReduce(hramDigestReduced, Uint8List.fromList(hramDigest)); + + final s = Uint8List(32); + ScMulAdd(s, hramDigestReduced, privateKey, rReduced); + + final signature = Uint8List(64); + Curve.arraycopy(encodedR, 0, signature, 0, 32); + Curve.arraycopy(s, 0, signature, 32, 32); + signature[63] |= publicKey[31] & 0x80; + + return signature; +} + +// verify checks whether the message has a valid signature. +bool verifySig(Uint8List publicKey, Uint8List message, Uint8List signature) { + publicKey[31] &= 0x7F; + + final edY = FieldElement(); + final one = FieldElement(); + final montX = FieldElement(); + final montXMinusOne = FieldElement(); + final montXPlusOne = FieldElement(); + FeFromBytes(montX, publicKey); + FeOne(one); + FeSub(montXMinusOne, montX, one); + FeAdd(montXPlusOne, montX, one); + FeInvert(montXPlusOne, montXPlusOne); + FeMul(edY, montXMinusOne, montXPlusOne); + + // ignore: non_constant_identifier_names + final A_ed = Uint8List(32); + FeToBytes(A_ed, edY); + + A_ed[31] |= signature[63] & 0x80; + signature[63] &= 0x7F; + +// bool verify(PublicKey publicKey, Uint8List message, Uint8List sig) { + return verify(PublicKey(A_ed.toList()), message, signature); +} diff --git a/libsignal_protocol_dart/lib/src/entry.dart b/libsignal_protocol_dart/lib/src/entry.dart new file mode 100644 index 0000000..5085002 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/entry.dart @@ -0,0 +1,6 @@ +import 'dart:collection'; + +base class Entry extends LinkedListEntry> { + Entry(this.value); + T value; +} diff --git a/libsignal_protocol_dart/lib/src/eq.dart b/libsignal_protocol_dart/lib/src/eq.dart new file mode 100644 index 0000000..4c2dde6 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/eq.dart @@ -0,0 +1,4 @@ +import 'package:collection/collection.dart'; + +bool eq(List? list1, List? list2) => + ListEquality().equals(list1, list2); diff --git a/libsignal_protocol_dart/lib/src/fingerprint/displayable_fingerprint.dart b/libsignal_protocol_dart/lib/src/fingerprint/displayable_fingerprint.dart new file mode 100644 index 0000000..d92f44c --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/displayable_fingerprint.dart @@ -0,0 +1,35 @@ +import 'dart:typed_data'; + +import '../util/byte_util.dart'; + +class DisplayableFingerprint { + DisplayableFingerprint( + Uint8List localFingerprint, Uint8List remoteFingerprint) { + localFingerprintNumbers = _getDisplayStringFor(localFingerprint); + remoteFingerprintNumbers = _getDisplayStringFor(remoteFingerprint); + } + + late String localFingerprintNumbers; + late String remoteFingerprintNumbers; + + String getDisplayText() { + if (localFingerprintNumbers.compareTo(remoteFingerprintNumbers) <= 0) { + return localFingerprintNumbers + remoteFingerprintNumbers; + } else { + return remoteFingerprintNumbers + localFingerprintNumbers; + } + } + + String _getDisplayStringFor(Uint8List fingerprint) => + _getEncodedChunk(fingerprint, 0) + + _getEncodedChunk(fingerprint, 5) + + _getEncodedChunk(fingerprint, 10) + + _getEncodedChunk(fingerprint, 15) + + _getEncodedChunk(fingerprint, 20) + + _getEncodedChunk(fingerprint, 25); + + String _getEncodedChunk(Uint8List hash, int offset) { + final chunk = ByteUtil.byteArray5ToLong(hash, offset).remainder(100000); + return chunk.toString().padLeft(5, '0'); + } +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/fingerprint.dart b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint.dart new file mode 100644 index 0000000..5b3f433 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint.dart @@ -0,0 +1,12 @@ +import 'displayable_fingerprint.dart'; +import 'scannable_fingerprint.dart'; + +class Fingerprint { + Fingerprint(this._displayableFingerprint, this._scannableFingerprint); + + final DisplayableFingerprint _displayableFingerprint; + final ScannableFingerprint _scannableFingerprint; + + DisplayableFingerprint get displayableFingerprint => _displayableFingerprint; + ScannableFingerprint get scannableFingerprint => _scannableFingerprint; +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_generator.dart b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_generator.dart new file mode 100644 index 0000000..0f98086 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_generator.dart @@ -0,0 +1,20 @@ +import 'dart:typed_data'; + +import '../identity_key.dart'; +import 'fingerprint.dart'; + +abstract class FingerprintGenerator { + Fingerprint createFor( + int version, + Uint8List localStableIdentifier, + IdentityKey localIdentityKey, + Uint8List remoteStableIdentifier, + IdentityKey remoteIdentityKey); + + Fingerprint createListFor( + int version, + Uint8List localStableIdentifier, + List localIdentityKey, + Uint8List remoteStableIdentifier, + List remoteIdentityKey); +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_parsing_exception.dart b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_parsing_exception.dart new file mode 100644 index 0000000..61f5807 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_parsing_exception.dart @@ -0,0 +1,8 @@ +class FingerprintParsingException implements Exception { + FingerprintParsingException(this._message); + + final Exception _message; + + @override + String toString() => 'FingerprintParsingException - $_message'; +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_version_mismatch_exception.dart b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_version_mismatch_exception.dart new file mode 100644 index 0000000..a0aa351 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/fingerprint_version_mismatch_exception.dart @@ -0,0 +1,8 @@ +class FingerprintVersionMismatchException implements Exception { + FingerprintVersionMismatchException(this._theirVersion, this._ourVersion); + + // ignore: unused_field + final int _theirVersion; + // ignore: unused_field + final int _ourVersion; +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/numeric_fingerprint_generator.dart b/libsignal_protocol_dart/lib/src/fingerprint/numeric_fingerprint_generator.dart new file mode 100644 index 0000000..99becee --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/numeric_fingerprint_generator.dart @@ -0,0 +1,79 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; + +import '../identity_key.dart'; +import '../util/byte_util.dart'; +import '../util/identity_key_comparator.dart'; +import 'displayable_fingerprint.dart'; +import 'fingerprint.dart'; +import 'fingerprint_generator.dart'; +import 'scannable_fingerprint.dart'; + +class NumericFingerprintGenerator implements FingerprintGenerator { + NumericFingerprintGenerator(this._iterations); + + static const int fingerprintVersion = 0; + + final int _iterations; + + @override + Fingerprint createFor( + int version, + Uint8List localStableIdentifier, + IdentityKey localIdentityKey, + Uint8List remoteStableIdentifier, + IdentityKey remoteIdentityKey) => + createListFor(version, localStableIdentifier, [localIdentityKey], + remoteStableIdentifier, [remoteIdentityKey]); + + @override + Fingerprint createListFor( + int version, + Uint8List localStableIdentifier, + List localIdentityKey, + Uint8List remoteStableIdentifier, + List remoteIdentityKey) { + final localFingerprint = + _getFingerprint(_iterations, localStableIdentifier, localIdentityKey); + final remoteFingerprint = + _getFingerprint(_iterations, remoteStableIdentifier, remoteIdentityKey); + final displayableFingerprint = + DisplayableFingerprint(localFingerprint, remoteFingerprint); + final scannableFingerprint = + ScannableFingerprint(version, localFingerprint, remoteFingerprint); + return Fingerprint(displayableFingerprint, scannableFingerprint); + } + + Uint8List _getFingerprint(int iterations, Uint8List stableIdentifier, + List unsortedIdentityKeys) { + final publicKey = _getLogicalKeyBytes(unsortedIdentityKeys); + var hash = ByteUtil.combine([ + ByteUtil.shortToByteArray(fingerprintVersion), + publicKey, + stableIdentifier + ]); + for (var i = 0; i < iterations; i++) { + final output = AccumulatorSink(); + sha512.startChunkedConversion(output) + ..add(hash) + ..add(publicKey) + ..close(); + hash = Uint8List.fromList(output.events.single.bytes); + } + + return hash; + } + + Uint8List _getLogicalKeyBytes(List identityKeys) { + final sortedIdentityKeys = [...identityKeys]..sort(identityKeyComparator); + + final keys = []; + sortedIdentityKeys.forEach((IdentityKey key) { + final publicKeyBytes = key.publicKey.serialize(); + keys.addAll(publicKeyBytes.toList()); + }); + return Uint8List.fromList(keys); + } +} diff --git a/libsignal_protocol_dart/lib/src/fingerprint/scannable_fingerprint.dart b/libsignal_protocol_dart/lib/src/fingerprint/scannable_fingerprint.dart new file mode 100644 index 0000000..b84c99d --- /dev/null +++ b/libsignal_protocol_dart/lib/src/fingerprint/scannable_fingerprint.dart @@ -0,0 +1,49 @@ +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; +import 'package:protobuf/protobuf.dart'; + +import '../state/fingerprint_protocol.pb.dart'; +import '../util/byte_util.dart'; +import 'fingerprint_parsing_exception.dart'; +import 'fingerprint_version_mismatch_exception.dart'; + +class ScannableFingerprint { + ScannableFingerprint(int version, Uint8List localFingerprintData, + Uint8List remoteFingerprintData) { + final localFingerprint = LogicalFingerprint.create() + ..content = ByteUtil.trim(localFingerprintData, 32); + + final remoteFingerprint = LogicalFingerprint.create() + ..content = ByteUtil.trim(remoteFingerprintData, 32); + + _version = version; + _fingerprints = CombinedFingerprints.create() + ..version = version + ..localFingerprint = localFingerprint + ..remoteFingerprint = remoteFingerprint; + } + + late int _version; + late CombinedFingerprints _fingerprints; + + bool compareTo(Uint8List scannedFingerprintData) { + try { + final scanned = CombinedFingerprints.fromBuffer(scannedFingerprintData); + if (!scanned.hasRemoteFingerprint() || + !scanned.hasLocalFingerprint() || + !scanned.hasVersion() || + scanned.version != _version) { + throw FingerprintVersionMismatchException(scanned.version, _version); + } + return Digest(_fingerprints.localFingerprint.content) == + Digest(scanned.remoteFingerprint.content) && + Digest(_fingerprints.remoteFingerprint.content) == + Digest(scanned.localFingerprint.content); + } on InvalidProtocolBufferException catch (e) { + throw FingerprintParsingException(e); + } + } + + Uint8List get fingerprints => _fingerprints.writeToBuffer(); +} diff --git a/libsignal_protocol_dart/lib/src/groups/group_cipher.dart b/libsignal_protocol_dart/lib/src/groups/group_cipher.dart new file mode 100644 index 0000000..f2b7c38 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/group_cipher.dart @@ -0,0 +1,98 @@ +import 'dart:typed_data'; + +import '../cbc.dart'; +import '../decryption_callback.dart'; +import '../duplicate_message_exception.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_key_id_exception.dart'; +import '../invalid_message_exception.dart'; +import '../no_session_exception.dart'; +import '../protocol/sender_key_message.dart'; +import 'ratchet/sender_message_key.dart'; +import 'sender_key_name.dart'; +import 'state/sender_key_state.dart'; +import 'state/sender_key_store.dart'; + +class GroupCipher { + GroupCipher(this._senderKeyStore, this._senderKeyId); + + final SenderKeyStore _senderKeyStore; + final SenderKeyName _senderKeyId; + + Future encrypt(Uint8List paddedPlaintext) async { + try { + final record = await _senderKeyStore.loadSenderKey(_senderKeyId); + final senderKeyState = record.getSenderKeyState(); + final senderKey = senderKeyState.senderChainKey.senderMessageKey; + final ciphertext = + aesCbcEncrypt(senderKey.cipherKey, senderKey.iv, paddedPlaintext); + final senderKeyMessage = SenderKeyMessage(senderKeyState.keyId, + senderKey.iteration, ciphertext, senderKeyState.signingKeyPrivate); + final nextSenderChainKey = senderKeyState.senderChainKey.next; + senderKeyState.senderChainKey = nextSenderChainKey; + await _senderKeyStore.storeSenderKey(_senderKeyId, record); + return senderKeyMessage.serialize(); + } on InvalidKeyIdException catch (e) { + throw NoSessionException(e.detailMessage); + } + } + + Future decrypt(Uint8List senderKeyMessageBytes) async => + decryptWithCallback(senderKeyMessageBytes, () {}()); + + Future decryptWithCallback( + Uint8List senderKeyMessageBytes, DecryptionCallback? callback) async { + try { + final record = await _senderKeyStore.loadSenderKey(_senderKeyId); + if (record.isEmpty) { + throw NoSessionException( + 'No group sender key for: ${_senderKeyId.serialize()}'); + } + + final senderKeyMessage = + SenderKeyMessage.fromSerialized(senderKeyMessageBytes); + final senderKeyState = + record.getSenderKeyStateById(senderKeyMessage.keyId); + senderKeyMessage.verifySignature(senderKeyState.signingKeyPublic); + final senderKey = + getSenderKey(senderKeyState, senderKeyMessage.iteration); + final plaintext = aesCbcDecrypt( + senderKey.cipherKey, senderKey.iv, senderKeyMessage.ciphertext); + + if (callback != null) { + callback(plaintext); + } + + await _senderKeyStore.storeSenderKey(_senderKeyId, record); + return plaintext; + } on InvalidKeyIdException catch (e) { + throw InvalidMessageException(e.detailMessage); + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } + } + + SenderMessageKey getSenderKey(SenderKeyState senderKeyState, int iteration) { + var senderChainKey = senderKeyState.senderChainKey; + if (senderChainKey.iteration > iteration) { + if (senderKeyState.hasSenderMessageKey(iteration)) { + return senderKeyState.removeSenderMessageKey(iteration)!; + } else { + throw DuplicateMessageException('Received message with old counter: ' + '${senderChainKey.iteration} , $iteration'); + } + } + + if (iteration - senderChainKey.iteration > 2000) { + throw InvalidMessageException('Over 2000 messages into the future!'); + } + + while (senderChainKey.iteration < iteration) { + senderKeyState.addSenderMessageKey(senderChainKey.senderMessageKey); + senderChainKey = senderChainKey.next; + } + + senderKeyState.senderChainKey = senderChainKey.next; + return senderChainKey.senderMessageKey; + } +} diff --git a/libsignal_protocol_dart/lib/src/groups/group_session_builder.dart b/libsignal_protocol_dart/lib/src/groups/group_session_builder.dart new file mode 100644 index 0000000..14832cc --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/group_session_builder.dart @@ -0,0 +1,48 @@ +import '../invalid_key_exception.dart'; +import '../invalid_key_id_exception.dart'; +import '../protocol/sender_key_distribution_message_wrapper.dart'; +import '../util/key_helper.dart'; +import 'sender_key_name.dart'; +import 'state/sender_key_store.dart'; + +class GroupSessionBuilder { + GroupSessionBuilder(this._senderKeyStore); + + final SenderKeyStore _senderKeyStore; + + Future process( + SenderKeyName senderKeyName, + SenderKeyDistributionMessageWrapper + senderKeyDistributionMessageWrapper) async { + final senderKeyRecord = await _senderKeyStore.loadSenderKey(senderKeyName); + senderKeyRecord.addSenderKeyState( + senderKeyDistributionMessageWrapper.id, + senderKeyDistributionMessageWrapper.iteration, + senderKeyDistributionMessageWrapper.chainKey, + senderKeyDistributionMessageWrapper.signatureKey); + await _senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + + Future create( + SenderKeyName senderKeyName) async { + try { + final senderKeyRecord = + await _senderKeyStore.loadSenderKey(senderKeyName); + if (senderKeyRecord.isEmpty) { + senderKeyRecord.setSenderKeyState(generateSenderKeyId(), 0, + generateSenderKey(), generateSenderSigningKey()); + await _senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + final state = senderKeyRecord.getSenderKeyState(); + return SenderKeyDistributionMessageWrapper( + state.keyId, + state.senderChainKey.iteration, + state.senderChainKey.seed, + state.signingKeyPublic); + } on InvalidKeyIdException catch (e) { + throw AssertionError(e); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } +} diff --git a/libsignal_protocol_dart/lib/src/groups/ratchet/sender_chain_key.dart b/libsignal_protocol_dart/lib/src/groups/ratchet/sender_chain_key.dart new file mode 100644 index 0000000..0d8b377 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/ratchet/sender_chain_key.dart @@ -0,0 +1,31 @@ +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; + +import 'sender_message_key.dart'; + +class SenderChainKey { + SenderChainKey(this._iteration, this._chainKey); + + static final Uint8List _messageKeySeed = Uint8List.fromList([0x01]); + static final Uint8List _chainKeySeed = Uint8List.fromList([0x02]); + + final int _iteration; + final Uint8List _chainKey; + + int get iteration => _iteration; + + Uint8List get seed => _chainKey; + + SenderMessageKey get senderMessageKey => + SenderMessageKey(_iteration, getDerivative(_messageKeySeed, _chainKey)); + + SenderChainKey get next => + SenderChainKey(_iteration + 1, getDerivative(_chainKeySeed, _chainKey)); + + Uint8List getDerivative(Uint8List seed, Uint8List key) { + final hmacSha256 = Hmac(sha256, key); + final digest = hmacSha256.convert(seed); + return Uint8List.fromList(digest.bytes); + } +} diff --git a/libsignal_protocol_dart/lib/src/groups/ratchet/sender_message_key.dart b/libsignal_protocol_dart/lib/src/groups/ratchet/sender_message_key.dart new file mode 100644 index 0000000..52979f7 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/ratchet/sender_message_key.dart @@ -0,0 +1,24 @@ +import 'dart:typed_data'; + +import '../../kdf/hkdfv3.dart'; +import '../../util/byte_util.dart'; + +class SenderMessageKey { + SenderMessageKey(this._iteration, this._seed) { + final derivative = HKDFv3() + .deriveSecrets(seed, Uint8List.fromList('WhisperGroup'.codeUnits), 48); + final parts = ByteUtil.splitTwo(derivative, 16, 32); + _iv = parts[0]; + _cipherKey = parts[1]; + } + + final int _iteration; + final Uint8List _seed; + late Uint8List _iv; + late Uint8List _cipherKey; + + int get iteration => _iteration; + Uint8List get iv => _iv; + Uint8List get cipherKey => _cipherKey; + Uint8List get seed => _seed; +} diff --git a/libsignal_protocol_dart/lib/src/groups/sender_key_name.dart b/libsignal_protocol_dart/lib/src/groups/sender_key_name.dart new file mode 100644 index 0000000..2420385 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/sender_key_name.dart @@ -0,0 +1,28 @@ +import 'package:meta/meta.dart'; + +import '../signal_protocol_address.dart'; + +@immutable +class SenderKeyName { + const SenderKeyName(this._groupId, this._sender); + + final String _groupId; + final SignalProtocolAddress _sender; + + String get groupId => _groupId; + + SignalProtocolAddress get sender => _sender; + + String serialize() => + '$_groupId::${_sender.getName()}::${_sender.getDeviceId()}'; + + @override + bool operator ==(Object other) { + if (other is! SenderKeyName) return false; + + return _groupId == other.groupId && _sender == other.sender; + } + + @override + int get hashCode => _groupId.hashCode ^ _sender.hashCode; +} diff --git a/libsignal_protocol_dart/lib/src/groups/state/in_memory_sender_key_store.dart b/libsignal_protocol_dart/lib/src/groups/state/in_memory_sender_key_store.dart new file mode 100644 index 0000000..9884fbc --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/state/in_memory_sender_key_store.dart @@ -0,0 +1,29 @@ +import 'dart:collection'; + +import '../sender_key_name.dart'; +import 'sender_key_record.dart'; +import 'sender_key_store.dart'; + +class InMemorySenderKeyStore extends SenderKeyStore { + final _store = HashMap(); + + @override + Future loadSenderKey(SenderKeyName senderKeyName) async { + try { + final record = _store[senderKeyName]; + if (record == null) { + return SenderKeyRecord(); + } else { + return SenderKeyRecord.fromSerialized(record.serialize()); + } + } on Exception catch (e) { + throw AssertionError(e); + } + } + + @override + Future storeSenderKey( + SenderKeyName senderKeyName, SenderKeyRecord record) async { + _store[senderKeyName] = record; + } +} diff --git a/libsignal_protocol_dart/lib/src/groups/state/sender_key_record.dart b/libsignal_protocol_dart/lib/src/groups/state/sender_key_record.dart new file mode 100644 index 0000000..878bcc1 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/state/sender_key_record.dart @@ -0,0 +1,71 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import '../../ecc/ec_key_pair.dart'; +import '../../ecc/ec_public_key.dart'; +import '../../entry.dart'; +import '../../invalid_key_id_exception.dart'; +import '../../state/local_storage_protocol.pb.dart'; +import 'sender_key_state.dart'; + +class SenderKeyRecord { + SenderKeyRecord(); + + SenderKeyRecord.fromSerialized(Uint8List serialized) { + final senderKeyRecordStructure = + SenderKeyRecordStructure.fromBuffer(serialized); + for (final structure in senderKeyRecordStructure.senderKeyStates) { + _senderKeyStates + .add(Entry(SenderKeyState.fromSenderKeyStateStructure(structure))); + } + } + + static const int _maxStates = 5; + + final LinkedList> _senderKeyStates = + LinkedList>(); + + bool get isEmpty => _senderKeyStates.isEmpty; + + SenderKeyState getSenderKeyState() { + if (_senderKeyStates.isNotEmpty) { + return _senderKeyStates.first.value; + } else { + throw InvalidKeyIdException('No key state in record!'); + } + } + + SenderKeyState getSenderKeyStateById(int keyId) { + for (final state in _senderKeyStates) { + if (state.value.keyId == keyId) { + return state.value; + } + } + throw InvalidKeyIdException('No key for: $keyId'); + } + + void addSenderKeyState( + int id, int iteration, Uint8List chainKey, ECPublicKey signatureKey) { + _senderKeyStates.addFirst(Entry( + SenderKeyState.fromPublicKey(id, iteration, chainKey, signatureKey))); + if (_senderKeyStates.length > _maxStates) { + _senderKeyStates.remove(_senderKeyStates.last); + } + } + + void setSenderKeyState( + int id, int iteration, Uint8List chainKey, ECKeyPair signatureKey) { + _senderKeyStates + ..clear() + ..add(Entry( + SenderKeyState.fromKeyPair(id, iteration, chainKey, signatureKey))); + } + + Uint8List serialize() { + final recordStructure = SenderKeyRecordStructure.create(); + _senderKeyStates.forEach((entry) { + recordStructure.senderKeyStates.add(entry.value.structure); + }); + return recordStructure.writeToBuffer(); + } +} diff --git a/libsignal_protocol_dart/lib/src/groups/state/sender_key_state.dart b/libsignal_protocol_dart/lib/src/groups/state/sender_key_state.dart new file mode 100644 index 0000000..8b71842 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/state/sender_key_state.dart @@ -0,0 +1,107 @@ +import 'dart:typed_data'; + +import 'package:optional/optional.dart'; + +import '../../ecc/curve.dart'; +import '../../ecc/ec_key_pair.dart'; +import '../../ecc/ec_private_key.dart'; +import '../../ecc/ec_public_key.dart'; +import '../../state/local_storage_protocol.pb.dart'; +import '../ratchet/sender_chain_key.dart'; +import '../ratchet/sender_message_key.dart'; + +class SenderKeyState { + SenderKeyState.fromPublicKey(int id, int iteration, Uint8List chainKey, + ECPublicKey signatureKeyPublic) { + init(id, iteration, chainKey, signatureKeyPublic, const Optional.empty()); + } + + SenderKeyState.fromKeyPair( + int id, int iteration, Uint8List chainKey, ECKeyPair signatureKey) { + final signatureKeyPublic = signatureKey.publicKey; + final signatureKeyPrivate = Optional.of(signatureKey.privateKey); + init(id, iteration, chainKey, signatureKeyPublic, signatureKeyPrivate); + } + + SenderKeyState.fromSenderKeyStateStructure( + SenderKeyStateStructure senderKeyStateStructure) { + _senderKeyStateStructure = senderKeyStateStructure; + } + + static const int _maxMessageKeys = 2000; + + late SenderKeyStateStructure _senderKeyStateStructure; + + void init( + int id, int iteration, Uint8List chainKey, ECPublicKey signatureKeyPublic, + [Optional? signatureKeyPrivate]) { + final seed = Uint8List.fromList(chainKey); + final senderChainKeyStructure = + SenderKeyStateStructureSenderChainKey.create() + ..iteration = iteration + ..seed = seed; + final signingKeyStructure = SenderKeyStateStructureSenderSigningKey.create() + ..public = signatureKeyPublic.serialize(); + if (signatureKeyPrivate!.isPresent) { + signingKeyStructure.private = signatureKeyPrivate.value.serialize(); + } + _senderKeyStateStructure = SenderKeyStateStructure.create() + ..senderKeyId = id + ..senderChainKey = senderChainKeyStructure + ..senderSigningKey = signingKeyStructure; + } + + int get keyId => _senderKeyStateStructure.senderKeyId; + + SenderChainKey get senderChainKey => SenderChainKey( + _senderKeyStateStructure.senderChainKey.iteration, + Uint8List.fromList(_senderKeyStateStructure.senderChainKey.seed)); + + set senderChainKey(SenderChainKey senderChainKey) => { + _senderKeyStateStructure.senderChainKey = + SenderKeyStateStructureSenderChainKey.create() + ..iteration = senderChainKey.iteration + ..seed = List.from(senderChainKey.seed) + }; + + ECPublicKey get signingKeyPublic => Curve.decodePointList( + _senderKeyStateStructure.senderSigningKey.public, 0); + + ECPrivateKey get signingKeyPrivate => Curve.decodePrivatePoint( + Uint8List.fromList(_senderKeyStateStructure.senderSigningKey.private)); + + bool hasSenderMessageKey(int iteration) { + for (final senderMessageKey in _senderKeyStateStructure.senderMessageKeys) { + if (senderMessageKey.iteration == iteration) { + return true; + } + } + return false; + } + + void addSenderMessageKey(SenderMessageKey senderMessageKey) { + final senderMessageKeyStructure = + SenderKeyStateStructureSenderMessageKey.create() + ..iteration = senderMessageKey.iteration + ..seed = senderMessageKey.seed; + _senderKeyStateStructure.senderMessageKeys.add(senderMessageKeyStructure); + if (_senderKeyStateStructure.senderMessageKeys.length > _maxMessageKeys) { + _senderKeyStateStructure.senderMessageKeys.removeAt(0); + } + } + + SenderMessageKey? removeSenderMessageKey(int iteration) { + _senderKeyStateStructure.senderMessageKeys + .toList() + .addAll(_senderKeyStateStructure.senderMessageKeys); + final index = _senderKeyStateStructure.senderMessageKeys + .indexWhere((item) => item.iteration == iteration); + if (index == -1) return null; + final senderMessageKey = + _senderKeyStateStructure.senderMessageKeys.removeAt(index); + return SenderMessageKey( + senderMessageKey.iteration, Uint8List.fromList(senderMessageKey.seed)); + } + + SenderKeyStateStructure get structure => _senderKeyStateStructure; +} diff --git a/libsignal_protocol_dart/lib/src/groups/state/sender_key_store.dart b/libsignal_protocol_dart/lib/src/groups/state/sender_key_store.dart new file mode 100644 index 0000000..5e57359 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/groups/state/sender_key_store.dart @@ -0,0 +1,9 @@ +import '../sender_key_name.dart'; +import 'sender_key_record.dart'; + +abstract class SenderKeyStore { + Future storeSenderKey( + SenderKeyName senderKeyName, SenderKeyRecord record); + + Future loadSenderKey(SenderKeyName senderKeyName); +} diff --git a/libsignal_protocol_dart/lib/src/identity_key.dart b/libsignal_protocol_dart/lib/src/identity_key.dart new file mode 100644 index 0000000..f2516df --- /dev/null +++ b/libsignal_protocol_dart/lib/src/identity_key.dart @@ -0,0 +1,33 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:meta/meta.dart'; + +import 'ecc/curve.dart'; +import 'ecc/ec_public_key.dart'; + +@immutable +class IdentityKey { + const IdentityKey(this._publicKey); + + factory IdentityKey.fromBytes(Uint8List bytes, int offset) => + IdentityKey(Curve.decodePoint(bytes, offset)); + + final ECPublicKey _publicKey; + + ECPublicKey get publicKey => _publicKey; + + Uint8List serialize() => _publicKey.serialize(); + + String getFingerprint() => hex.encode(_publicKey.serialize()); + + @override + bool operator ==(Object other) { + if (other is! IdentityKey) return false; + + return _publicKey == other._publicKey; + } + + @override + int get hashCode => _publicKey.hashCode; +} diff --git a/libsignal_protocol_dart/lib/src/identity_key_pair.dart b/libsignal_protocol_dart/lib/src/identity_key_pair.dart new file mode 100644 index 0000000..6c9d4e0 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/identity_key_pair.dart @@ -0,0 +1,32 @@ +import 'dart:typed_data'; + +import 'ecc/curve.dart'; +import 'ecc/ec_private_key.dart'; +import 'identity_key.dart'; +import 'state/local_storage_protocol.pb.dart'; + +class IdentityKeyPair { + IdentityKeyPair(this._publicKey, this._privateKey); + + IdentityKeyPair.fromSerialized(Uint8List serialized) { + final structure = IdentityKeyPairStructure.fromBuffer(serialized); + _publicKey = + IdentityKey.fromBytes(Uint8List.fromList(structure.publicKey), 0); + _privateKey = + Curve.decodePrivatePoint(Uint8List.fromList(structure.privateKey)); + } + + late IdentityKey _publicKey; + late ECPrivateKey _privateKey; + + IdentityKey getPublicKey() => _publicKey; + + ECPrivateKey getPrivateKey() => _privateKey; + + Uint8List serialize() { + final i = IdentityKeyPairStructure.create() + ..publicKey = List.from(_publicKey.serialize()) + ..privateKey = List.from(_privateKey.serialize()); + return i.toBuilder().writeToBuffer(); + } +} diff --git a/libsignal_protocol_dart/lib/src/invalid_key_exception.dart b/libsignal_protocol_dart/lib/src/invalid_key_exception.dart new file mode 100644 index 0000000..e3bef90 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/invalid_key_exception.dart @@ -0,0 +1,7 @@ +class InvalidKeyException implements Exception { + InvalidKeyException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'InvalidKeyException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/invalid_key_id_exception.dart b/libsignal_protocol_dart/lib/src/invalid_key_id_exception.dart new file mode 100644 index 0000000..265adcb --- /dev/null +++ b/libsignal_protocol_dart/lib/src/invalid_key_id_exception.dart @@ -0,0 +1,7 @@ +class InvalidKeyIdException implements Exception { + InvalidKeyIdException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'InvalidKeyIdException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/invalid_mac_exception.dart b/libsignal_protocol_dart/lib/src/invalid_mac_exception.dart new file mode 100644 index 0000000..d49b853 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/invalid_mac_exception.dart @@ -0,0 +1,7 @@ +class InvalidMacException implements Exception { + InvalidMacException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'InvalidMacException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/invalid_message_exception.dart b/libsignal_protocol_dart/lib/src/invalid_message_exception.dart new file mode 100644 index 0000000..388b79d --- /dev/null +++ b/libsignal_protocol_dart/lib/src/invalid_message_exception.dart @@ -0,0 +1,7 @@ +class InvalidMessageException implements Exception { + InvalidMessageException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'InvalidMessageException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/kdf/derived_message_secrets.dart b/libsignal_protocol_dart/lib/src/kdf/derived_message_secrets.dart new file mode 100644 index 0000000..d54f4be --- /dev/null +++ b/libsignal_protocol_dart/lib/src/kdf/derived_message_secrets.dart @@ -0,0 +1,29 @@ +import 'dart:typed_data'; + +import '../util/byte_util.dart'; + +class DerivedMessageSecrets { + DerivedMessageSecrets(Uint8List okm) { + final keys = + ByteUtil.split(okm, _cipherKeyLength, _macKeyLength, _ivLength); + + _cipherKey = keys[0]; + _macKey = keys[1]; + _iv = keys[2]; + } + + static const int size = 80; + static const int _cipherKeyLength = 32; + static const int _macKeyLength = 32; + static const int _ivLength = 16; + + late Uint8List _cipherKey; + late Uint8List _macKey; + late Uint8List _iv; + + Uint8List getCipherKey() => _cipherKey; + + Uint8List getMacKey() => _macKey; + + Uint8List getIv() => _iv; +} diff --git a/libsignal_protocol_dart/lib/src/kdf/derived_root_secrets.dart b/libsignal_protocol_dart/lib/src/kdf/derived_root_secrets.dart new file mode 100644 index 0000000..9426186 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/kdf/derived_root_secrets.dart @@ -0,0 +1,20 @@ +import 'dart:typed_data'; + +import '../util/byte_util.dart'; + +class DerivedRootSecrets { + DerivedRootSecrets(Uint8List okm) { + final keys = ByteUtil.splitTwo(okm, 32, 32); + _rootKey = keys[0]; + _chainKey = keys[1]; + } + + static const int size = 64; + + late Uint8List _rootKey; + late Uint8List _chainKey; + + Uint8List getRootKey() => _rootKey; + + Uint8List getChainKey() => _chainKey; +} diff --git a/libsignal_protocol_dart/lib/src/kdf/hkdf.dart b/libsignal_protocol_dart/lib/src/kdf/hkdf.dart new file mode 100644 index 0000000..5645147 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/kdf/hkdf.dart @@ -0,0 +1,81 @@ +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; + +import '../invalid_key_exception.dart'; +import 'hkdfv2.dart'; +import 'hkdfv3.dart'; + +abstract class HKDF { + static const int hashOutputSize = 32; + + static HKDF createFor(int messageVersion) { + switch (messageVersion) { + case 2: + return HKDFv2(); + case 3: + return HKDFv3(); + default: + throw AssertionError('Unknown version: $messageVersion'); + } + } + + Uint8List deriveSecrets( + Uint8List inputKeyMaterial, Uint8List info, int outputLength) { + final salt = Uint8List(hashOutputSize); + return deriveSecrets4(inputKeyMaterial, salt, info, outputLength); + } + + Uint8List deriveSecrets4(Uint8List inputKeyMaterial, Uint8List salt, + Uint8List info, int outputLength) { + final prk = extract(salt, inputKeyMaterial); + return expand(prk, info, outputLength); + } + + Uint8List extract(Uint8List salt, Uint8List inputKeyMaterial) { + final hmacSha256 = Hmac(sha256, salt); + final digest = hmacSha256.convert(inputKeyMaterial); + return Uint8List.fromList(digest.bytes); + } + + Uint8List expand(Uint8List prk, Uint8List? info, int outputSize) { + try { + final iterations = + (outputSize.toDouble() / hashOutputSize.toDouble()).ceil(); + var mix = Uint8List(0); + final results = Uint8List(outputSize); + var remainingBytes = outputSize; + + for (var i = getIterationStartOffset(); + i < iterations + getIterationStartOffset(); + i++) { + final mac = Hmac(sha256, prk); + final output = AccumulatorSink(); + final input = mac.startChunkedConversion(output)..add(mix); + if (info != null) { + input.add(info); + } + input + ..add([i]) + ..close(); + final stepResult = Uint8List.fromList(output.events.single.bytes); + final stepSize = min(remainingBytes, stepResult.length); + + for (var j = 0; j < stepSize; j++) { + final offset = (i - getIterationStartOffset()) * hashOutputSize + j; + results[offset] = stepResult[j]; + } + + mix = stepResult; + remainingBytes -= stepSize; + } + return results.buffer.asUint8List(); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + int getIterationStartOffset(); +} diff --git a/libsignal_protocol_dart/lib/src/kdf/hkdfv2.dart b/libsignal_protocol_dart/lib/src/kdf/hkdfv2.dart new file mode 100644 index 0000000..3c7bc7b --- /dev/null +++ b/libsignal_protocol_dart/lib/src/kdf/hkdfv2.dart @@ -0,0 +1,6 @@ +import 'hkdf.dart'; + +class HKDFv2 extends HKDF { + @override + int getIterationStartOffset() => 0; +} diff --git a/libsignal_protocol_dart/lib/src/kdf/hkdfv3.dart b/libsignal_protocol_dart/lib/src/kdf/hkdfv3.dart new file mode 100644 index 0000000..1defb1e --- /dev/null +++ b/libsignal_protocol_dart/lib/src/kdf/hkdfv3.dart @@ -0,0 +1,6 @@ +import 'hkdf.dart'; + +class HKDFv3 extends HKDF { + @override + int getIterationStartOffset() => 1; +} diff --git a/libsignal_protocol_dart/lib/src/legacy_message_exception.dart b/libsignal_protocol_dart/lib/src/legacy_message_exception.dart new file mode 100644 index 0000000..e389d13 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/legacy_message_exception.dart @@ -0,0 +1,7 @@ +class LegacyMessageException implements Exception { + LegacyMessageException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'LegacyMessageException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/no_session_exception.dart b/libsignal_protocol_dart/lib/src/no_session_exception.dart new file mode 100644 index 0000000..ed9b257 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/no_session_exception.dart @@ -0,0 +1,7 @@ +class NoSessionException implements Exception { + NoSessionException(this.detailMessage); + final String detailMessage; + + @override + String toString() => 'NoSessionException - $detailMessage'; +} diff --git a/libsignal_protocol_dart/lib/src/protocol/ciphertext_message.dart b/libsignal_protocol_dart/lib/src/protocol/ciphertext_message.dart new file mode 100644 index 0000000..17bb26e --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/ciphertext_message.dart @@ -0,0 +1,16 @@ +import 'dart:typed_data'; + +abstract class CiphertextMessage { + static const int currentVersion = 3; + + static const int whisperType = 2; + static const int prekeyType = 3; + static const int senderKeyType = 4; + static const int senderKeyDistributionType = 5; + + // This should be the worst case (worse than V2). So not always accurate, but good enough for padding. + static const int encryptedMessageOverhead = 53; + + Uint8List serialize(); + int getType(); +} diff --git a/libsignal_protocol_dart/lib/src/protocol/device_consistency_message.dart b/libsignal_protocol_dart/lib/src/protocol/device_consistency_message.dart new file mode 100644 index 0000000..a87fe7d --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/device_consistency_message.dart @@ -0,0 +1,71 @@ +import 'dart:typed_data'; + +import 'package:protobuf/protobuf.dart'; + +import '../devices/device_consistency_commitment.dart'; +import '../devices/device_consistency_signature.dart'; +import '../ecc/curve.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_message_exception.dart'; +import '../state/whisper_text_protocol.pb.dart'; + +class DeviceConsistencyMessage { + DeviceConsistencyMessage( + DeviceConsistencyCommitment commitment, IdentityKeyPair identityKeyPair) { + try { + final signatureBytes = Curve.calculateVrfSignature( + identityKeyPair.getPrivateKey(), commitment.serialized); + final vrfOutputBytes = Curve.verifyVrfSignature( + identityKeyPair.getPublicKey().publicKey, + commitment.serialized, + signatureBytes); + + _generation = commitment.generation; + _signature = DeviceConsistencySignature(signatureBytes, vrfOutputBytes); + final d = DeviceConsistencyCodeMessage.create() + ..generation = commitment.generation + ..signature = _signature.signature.toList(); + _serialized = d.writeToBuffer(); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } +// } on VrfSignatureVerificationFailedException catch (e) { +// throw AssertionError(e); +// } + } + + DeviceConsistencyMessage.fromSerialized( + DeviceConsistencyCommitment commitment, + Uint8List serialized, + IdentityKey identityKey) { + try { + final message = DeviceConsistencyCodeMessage.fromBuffer(serialized); + final vrfOutputBytes = Curve.verifyVrfSignature(identityKey.publicKey, + commitment.serialized, Uint8List.fromList(message.signature)); + + _generation = message.generation; + _signature = DeviceConsistencySignature( + Uint8List.fromList(message.signature), vrfOutputBytes); + _serialized = serialized; + } on InvalidProtocolBufferException catch (e) { + throw InvalidMessageException(e.message); + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } +// } on VrfSignatureVerificationFailedException catch (e) { +// throw AssertionError(e); +// } + } + + late DeviceConsistencySignature _signature; + late int _generation; + late Uint8List _serialized; + + Uint8List get serialized => _serialized; + + DeviceConsistencySignature get signature => _signature; + + int get generation => _generation; +} diff --git a/libsignal_protocol_dart/lib/src/protocol/pre_key_signal_message.dart b/libsignal_protocol_dart/lib/src/protocol/pre_key_signal_message.dart new file mode 100644 index 0000000..058bb83 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/pre_key_signal_message.dart @@ -0,0 +1,101 @@ +import 'dart:typed_data'; + +import 'package:optional/optional.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_message_exception.dart'; +import '../legacy_message_exception.dart'; +import '../protocol/ciphertext_message.dart'; +import '../protocol/signal_message.dart'; +import '../state/whisper_text_protocol.pb.dart' as signal_protos; +import '../util/byte_util.dart'; + +class PreKeySignalMessage extends CiphertextMessage { + PreKeySignalMessage(Uint8List serialized) { + try { + _version = ByteUtil.highBitsToInt(serialized[0]); + + final preKeyWhisperMessage = + signal_protos.PreKeySignalMessage.fromBuffer(serialized.sublist(1)); + + if (!preKeyWhisperMessage.hasSignedPreKeyId() || + !preKeyWhisperMessage.hasBaseKey() || + !preKeyWhisperMessage.hasIdentityKey() || + !preKeyWhisperMessage.hasMessage()) { + throw InvalidMessageException('Incomplete message.'); + } + + this.serialized = serialized; + registrationId = preKeyWhisperMessage.registrationId; + preKeyId = preKeyWhisperMessage.hasPreKeyId() + ? Optional.of(preKeyWhisperMessage.preKeyId) + : const Optional.empty(); + signedPreKeyId = preKeyWhisperMessage.hasSignedPreKeyId() + ? preKeyWhisperMessage.signedPreKeyId + : -1; + baseKey = Curve.decodePoint( + Uint8List.fromList(preKeyWhisperMessage.baseKey), 0); + identityKey = IdentityKey(Curve.decodePoint( + Uint8List.fromList(preKeyWhisperMessage.identityKey), 0)); + message = SignalMessage.fromSerialized( + Uint8List.fromList(preKeyWhisperMessage.message)); + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } on LegacyMessageException catch (e) { + throw InvalidMessageException(e.detailMessage); + } + } + + PreKeySignalMessage.from(this._version, this.registrationId, this.preKeyId, + this.signedPreKeyId, this.baseKey, this.identityKey, this.message) { + final builder = signal_protos.PreKeySignalMessage.create() + ..signedPreKeyId = signedPreKeyId + ..baseKey = baseKey.serialize() + ..identityKey = identityKey.serialize() + ..message = message.serialize() + ..registrationId = registrationId; + + if (preKeyId.isPresent) { + builder.preKeyId = preKeyId.value; + } + + final versionBytes = [ + ByteUtil.intsToByteHighAndLow(_version, CiphertextMessage.currentVersion) + ]; + + final messageBytes = builder.toBuilder().writeToBuffer(); + serialized = Uint8List.fromList(versionBytes + messageBytes); + } + + late int _version; + late int registrationId; + late Optional preKeyId; + late int signedPreKeyId; + late ECPublicKey baseKey; + late IdentityKey identityKey; + late SignalMessage message; + late Uint8List serialized; + + int getMessageVersion() => _version; + + IdentityKey getIdentityKey() => identityKey; + + int getRegistrationId() => registrationId; + + Optional getPreKeyId() => preKeyId; + + int getSignedPreKeyId() => signedPreKeyId; + + ECPublicKey getBaseKey() => baseKey; + + SignalMessage getWhisperMessage() => message; + + @override + int getType() => CiphertextMessage.prekeyType; + + @override + Uint8List serialize() => serialized; +} diff --git a/libsignal_protocol_dart/lib/src/protocol/sender_key_distribution_message_wrapper.dart b/libsignal_protocol_dart/lib/src/protocol/sender_key_distribution_message_wrapper.dart new file mode 100644 index 0000000..14e4b1b --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/sender_key_distribution_message_wrapper.dart @@ -0,0 +1,87 @@ +import 'dart:typed_data'; + +import 'package:protobuf/protobuf.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_public_key.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_message_exception.dart'; +import '../legacy_message_exception.dart'; +import '../state/whisper_text_protocol.pb.dart'; +import '../util/byte_util.dart'; +import 'ciphertext_message.dart'; + +class SenderKeyDistributionMessageWrapper extends CiphertextMessage { + SenderKeyDistributionMessageWrapper( + int id, int iteration, Uint8List chainKey, ECPublicKey signatureKey) { + final version = Uint8List.fromList([ + ByteUtil.intsToByteHighAndLow( + CiphertextMessage.currentVersion, CiphertextMessage.currentVersion) + ]); + final protobuf = SenderKeyDistributionMessage.create() + ..id = id + ..iteration = iteration + ..chainKey = List.from(chainKey) + ..signingKey = List.from(signatureKey.serialize()); + _id = id; + _iteration = iteration; + _chainKey = chainKey; + _signatureKey = signatureKey; + _serialized = ByteUtil.combine([version, protobuf.writeToBuffer()]); + } + + SenderKeyDistributionMessageWrapper.fromSerialized(Uint8List serialized) { + try { + final messageParts = + ByteUtil.splitTwo(serialized, 1, serialized.length - 1); + final version = messageParts[0][0]; + final message = messageParts[1]; + + if (ByteUtil.highBitsToInt(version) < CiphertextMessage.currentVersion) { + throw LegacyMessageException( + 'Legacy message: ${ByteUtil.highBitsToInt(version)}'); + } + if (ByteUtil.highBitsToInt(version) > CiphertextMessage.currentVersion) { + throw InvalidMessageException( + 'Unknown version: ${ByteUtil.highBitsToInt(version)}'); + } + + final distributionMessages = + SenderKeyDistributionMessage.fromBuffer(message); + if (!distributionMessages.hasId() || + !distributionMessages.hasIteration() || + !distributionMessages.hasChainKey() || + !distributionMessages.hasSigningKey()) { + throw InvalidMessageException('Incomplete message.'); + } + + _serialized = serialized; + _id = distributionMessages.id; + _iteration = distributionMessages.iteration; + _chainKey = Uint8List.fromList(distributionMessages.chainKey); + _signatureKey = Curve.decodePoint( + Uint8List.fromList(distributionMessages.signingKey), 0); + } on InvalidProtocolBufferException catch (e) { + throw InvalidMessageException(e.message); + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } + } + + late int _id; + late int _iteration; + late Uint8List _chainKey; + late ECPublicKey _signatureKey; + late Uint8List _serialized; + + @override + int getType() => CiphertextMessage.senderKeyDistributionType; + + @override + Uint8List serialize() => _serialized; + + int get iteration => _iteration; + Uint8List get chainKey => _chainKey; + ECPublicKey get signatureKey => _signatureKey; + int get id => _id; +} diff --git a/libsignal_protocol_dart/lib/src/protocol/sender_key_message.dart b/libsignal_protocol_dart/lib/src/protocol/sender_key_message.dart new file mode 100644 index 0000000..39b99c6 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/sender_key_message.dart @@ -0,0 +1,108 @@ +import 'dart:typed_data'; + +import '../ecc/curve.dart'; +import '../ecc/ec_private_key.dart'; +import '../ecc/ec_public_key.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_key_id_exception.dart'; +import '../invalid_message_exception.dart'; +import '../legacy_message_exception.dart'; +import '../state/whisper_text_protocol.pb.dart' as protocol; +import '../util/byte_util.dart'; +import 'ciphertext_message.dart'; + +class SenderKeyMessage extends CiphertextMessage { + SenderKeyMessage(int keyId, int iteration, Uint8List ciphertext, + ECPrivateKey signatureKey) { + final version = Uint8List.fromList([ + ByteUtil.intsToByteHighAndLow( + CiphertextMessage.currentVersion, CiphertextMessage.currentVersion) + ]); + final message = protocol.SenderKeyMessage.create() + ..id = keyId + ..iteration = iteration + ..ciphertext = ciphertext; + final messageList = message.writeToBuffer(); + final signature = + _getSignature(signatureKey, ByteUtil.combine([version, messageList])); + _serialized = ByteUtil.combine([version, messageList, signature]); + _messageVersion = CiphertextMessage.currentVersion; + _keyId = keyId; + _iteration = iteration; + _ciphertext = ciphertext; + } + + SenderKeyMessage.fromSerialized(Uint8List serialized) { + final messageParts = ByteUtil.split(serialized, 1, + serialized.length - 1 - signatureLength, signatureLength); + final version = messageParts[0][0]; + final message = messageParts[1]; + // ignore: unused_local_variable + final signature = messageParts[2]; + + if (ByteUtil.highBitsToInt(version) < 3) { + throw LegacyMessageException( + 'Legacy message: ${ByteUtil.highBitsToInt(version)}'); + } + + if (ByteUtil.highBitsToInt(version) > CiphertextMessage.currentVersion) { + throw InvalidMessageException( + 'Unknown version: ${ByteUtil.highBitsToInt(version)}'); + } + + final senderKeyMessage = protocol.SenderKeyMessage.fromBuffer(message); + + if (!senderKeyMessage.hasId() || + !senderKeyMessage.hasIteration() || + !senderKeyMessage.hasCiphertext()) { + throw InvalidMessageException('Incomplete message.'); + } + + _serialized = serialized; + _messageVersion = ByteUtil.highBitsToInt(version); + _keyId = senderKeyMessage.id; + _iteration = senderKeyMessage.iteration; + _ciphertext = Uint8List.fromList(senderKeyMessage.ciphertext); + } + + static const int signatureLength = 64; + + // ignore: unused_field + late int _messageVersion; + late int _keyId; + late int _iteration; + late Uint8List _ciphertext; + late Uint8List _serialized; + + Uint8List _getSignature(ECPrivateKey signatureKey, Uint8List serialized) { + try { + return Curve.calculateSignature(signatureKey, serialized); + } on InvalidKeyIdException catch (e) { + throw AssertionError(e); + } + } + + int get keyId => _keyId; + + int get iteration => _iteration; + + Uint8List get ciphertext => _ciphertext; + + void verifySignature(ECPublicKey signatureKey) { + try { + final parts = ByteUtil.splitTwo( + _serialized, _serialized.length - signatureLength, signatureLength); + if (!Curve.verifySignature(signatureKey, parts[0], parts[1])) { + throw InvalidMessageException('Invalid signature!'); + } + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } + } + + @override + int getType() => CiphertextMessage.senderKeyType; + + @override + Uint8List serialize() => _serialized; +} diff --git a/libsignal_protocol_dart/lib/src/protocol/signal_message.dart b/libsignal_protocol_dart/lib/src/protocol/signal_message.dart new file mode 100644 index 0000000..dd526ea --- /dev/null +++ b/libsignal_protocol_dart/lib/src/protocol/signal_message.dart @@ -0,0 +1,141 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import 'package:protobuf/protobuf.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; +import '../invalid_key_exception.dart'; +import '../invalid_message_exception.dart'; +import '../legacy_message_exception.dart'; +import '../protocol/ciphertext_message.dart'; +import '../state/whisper_text_protocol.pb.dart' as signal_protos; +import '../util/byte_util.dart'; + +class SignalMessage extends CiphertextMessage { + SignalMessage( + int messageVersion, + Uint8List macKey, + ECPublicKey senderRatchetKey, + int counter, + int previousCounter, + Uint8List ciphertext, + IdentityKey senderIdentityKey, + IdentityKey? receiverIdentityKey) { + final version = Uint8List.fromList([ + ByteUtil.intsToByteHighAndLow( + messageVersion, CiphertextMessage.currentVersion) + ]); + + final m = signal_protos.SignalMessage.create() + ..ratchetKey = senderRatchetKey.serialize() + ..counter = counter + ..previousCounter = previousCounter + ..ciphertext = ciphertext; + final message = m.writeToBuffer(); + + final mac = _getMac(senderIdentityKey, receiverIdentityKey!, macKey, + ByteUtil.combine([version, message])); + + _serialized = ByteUtil.combine([version, message, mac]); + _senderRatchetKey = senderRatchetKey; + _counter = counter; + _previousCounter = previousCounter; + _ciphertext = ciphertext; + _messageVersion = messageVersion; + } + + SignalMessage.fromSerialized(Uint8List serialized) { + try { + final messageParts = ByteUtil.split( + serialized, 1, serialized.length - 1 - macLength, macLength); + final version = messageParts[0].first; + final message = messageParts[1]; + // ignore: unused_local_variable + final mac = messageParts[2]; + + if (ByteUtil.highBitsToInt(version) < CiphertextMessage.currentVersion) { + throw LegacyMessageException( + 'Legacy message: $ByteUtil.highBitsToInt(version)'); + } + + if (ByteUtil.highBitsToInt(version) > CiphertextMessage.currentVersion) { + throw InvalidMessageException( + 'Unknown version: $ByteUtil.highBitsToInt(version)'); + } + + final whisperMessage = signal_protos.SignalMessage.fromBuffer(message); + + if (!whisperMessage.hasCiphertext() || + !whisperMessage.hasCounter() || + !whisperMessage.hasRatchetKey()) { + throw InvalidMessageException('Incomplete message.'); + } + + _serialized = serialized; + _senderRatchetKey = + Curve.decodePoint(Uint8List.fromList(whisperMessage.ratchetKey), 0); + _messageVersion = ByteUtil.highBitsToInt(version); + _counter = whisperMessage.counter; + _previousCounter = whisperMessage.previousCounter; + _ciphertext = Uint8List.fromList(whisperMessage.ciphertext); + } on InvalidProtocolBufferException catch (e) { + throw InvalidMessageException(e.toString()); + } on InvalidKeyException catch (e) { + throw InvalidMessageException(e.detailMessage); + } + } + + static const int macLength = 8; + + late int _messageVersion; + late ECPublicKey _senderRatchetKey; + late int _counter; + // ignore: unused_field + late int _previousCounter; + late Uint8List _ciphertext; + late Uint8List _serialized; + + ECPublicKey getSenderRatchetKey() => _senderRatchetKey; + + int getMessageVersion() => _messageVersion; + + int getCounter() => _counter; + + Uint8List getBody() => _ciphertext; + + void verifyMac(IdentityKey senderIdentityKey, IdentityKey receiverIdentityKey, + Uint8List macKey) { + final parts = ByteUtil.splitTwo( + _serialized, _serialized.length - macLength, macLength); + final ourMac = + _getMac(senderIdentityKey, receiverIdentityKey, macKey, parts[0]); + final theirMac = parts[1]; + + if (Digest(ourMac) != Digest(theirMac)) { + throw InvalidMessageException('Bad Mac!'); + } + } + + Uint8List _getMac(IdentityKey senderIdentityKey, + IdentityKey receiverIdentityKey, Uint8List macKey, Uint8List serialized) { + final mac = Hmac(sha256, macKey); // HMAC-SHA256 + + final output = AccumulatorSink(); + mac.startChunkedConversion(output) + ..add(senderIdentityKey.publicKey.serialize()) + ..add(receiverIdentityKey.publicKey.serialize()) + ..add(serialized) + ..close(); + final fullMac = Uint8List.fromList(output.events.single.bytes); + return ByteUtil.trim(fullMac, macLength); + } + + @override + int getType() => CiphertextMessage.whisperType; + + @override + Uint8List serialize() => _serialized; +} diff --git a/libsignal_protocol_dart/lib/src/provisioning_cipher.dart b/libsignal_protocol_dart/lib/src/provisioning_cipher.dart new file mode 100644 index 0000000..cee0141 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/provisioning_cipher.dart @@ -0,0 +1,109 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; + +import 'cbc.dart'; +import 'ecc/curve.dart'; +import 'ecc/ec_public_key.dart'; +import 'eq.dart'; +import 'invalid_mac_exception.dart'; +import 'kdf/derived_root_secrets.dart'; +import 'kdf/hkdfv3.dart'; +import 'legacy_message_exception.dart'; +import 'util/byte_util.dart'; + +const String provision = 'Mixin Provisioning Message'; + +class ProvisionEnvelope { + ProvisionEnvelope(this.publicKey, this.body); + + ProvisionEnvelope.fromJson(Map json) + : publicKey = base64Decode(json['public_key'] as String), + body = base64Decode(json['body'] as String); + + final Uint8List publicKey; + final Uint8List body; + + Map toJson() => { + 'public_key': base64Encode(publicKey), + 'body': base64Encode(body), + }; +} + +Uint8List decrypt(String privateKey, String content) { + final ourPrivateKey = base64Decode(privateKey); + final envelopeDecode = base64Decode(content); + + final map = jsonDecode(String.fromCharCodes(envelopeDecode)); + final provisionEnvelope = + ProvisionEnvelope.fromJson(map as Map); + final publicKeyable = Curve.decodePoint(provisionEnvelope.publicKey, 0); + final message = provisionEnvelope.body; + if (message[0] != 1) { + throw LegacyMessageException('Invalid version'); + } + final iv = Uint8List.fromList(message.getRange(1, 16 + 1).toList()); + final mac = message.getRange(message.length - 32, message.length).toList(); + final ivAndCiphertext = + Uint8List.fromList(message.getRange(0, message.length - 32).toList()); + final cipherText = Uint8List.fromList( + message.getRange(16 + 1, message.length - 32).toList()); + final sharedSecret = Curve.calculateAgreement( + publicKeyable, Curve.decodePrivatePoint(ourPrivateKey)); + + final derivedSecretBytes = HKDFv3().deriveSecrets(sharedSecret, + Uint8List.fromList(utf8.encode(provision)), DerivedRootSecrets.size); + + final aesKey = + Uint8List.fromList(derivedSecretBytes.getRange(0, 32).toList()); + final macKey = Uint8List.fromList( + derivedSecretBytes.getRange(32, derivedSecretBytes.length).toList()); + + if (!verifyMAC(macKey, ivAndCiphertext, mac)) { + throw InvalidMacException("MAC doesn't match!"); + } + final plaintext = aesCbcDecrypt(aesKey, iv, cipherText); + return plaintext; +} + +bool verifyMAC(Uint8List key, Uint8List input, List mac) { + final hmacSha256 = Hmac(sha256, key); + final digest = hmacSha256.convert(input); + return eq(digest.bytes, mac); +} + +class ProvisioningCipher { + ProvisioningCipher(this._theirPublicKey); + + final ECPublicKey _theirPublicKey; + + Uint8List encrypt(Uint8List message) { + final ourKeyPair = Curve.generateKeyPair(); + final sharedSecret = + Curve.calculateAgreement(_theirPublicKey, ourKeyPair.privateKey); + final derivedSecret = HKDFv3().deriveSecrets( + sharedSecret, Uint8List.fromList(utf8.encode(provision)), 64); + final parts = ByteUtil.splitTwo(derivedSecret, 32, 32); + + final version = Uint8List.fromList([1]); + final ciphertext = getCiphertext(parts[0], message); + final mac = _getMac(parts[1], ByteUtil.combine([version, ciphertext])); + final body = ByteUtil.combine([version, ciphertext, mac]); + final envelope = ProvisionEnvelope(ourKeyPair.publicKey.serialize(), body); + final result = jsonEncode(envelope); + return Uint8List.fromList(utf8.encode(result)); + } + + Uint8List getCiphertext(Uint8List key, Uint8List message) { + final iv = Uint8List(16); + final m = aesCbcEncrypt(key, iv, message); + return Uint8List.fromList(iv + m); + } + + Uint8List _getMac(Uint8List key, Uint8List message) { + final hmacSha256 = Hmac(sha256, key); + final digest = hmacSha256.convert(message); + return Uint8List.fromList(digest.bytes); + } +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/alice_signal_protocol_parameters.dart b/libsignal_protocol_dart/lib/src/ratchet/alice_signal_protocol_parameters.dart new file mode 100644 index 0000000..2ef531b --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/alice_signal_protocol_parameters.dart @@ -0,0 +1,25 @@ +import 'package:optional/optional.dart'; + +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; + +class AliceSignalProtocolParameters { + AliceSignalProtocolParameters({ + required this.ourIdentityKey, + required this.ourBaseKey, + required this.theirIdentityKey, + required this.theirSignedPreKey, + required this.theirRatchetKey, + required this.theirOneTimePreKey, + }); + + final IdentityKeyPair ourIdentityKey; + final ECKeyPair ourBaseKey; + + final IdentityKey theirIdentityKey; + final ECPublicKey theirSignedPreKey; + final Optional theirOneTimePreKey; + final ECPublicKey theirRatchetKey; +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/bob_signal_protocol_parameters.dart b/libsignal_protocol_dart/lib/src/ratchet/bob_signal_protocol_parameters.dart new file mode 100644 index 0000000..2ccb165 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/bob_signal_protocol_parameters.dart @@ -0,0 +1,37 @@ +import 'package:optional/optional.dart'; + +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; + +class BobSignalProtocolParameters { + BobSignalProtocolParameters({ + required this.ourIdentityKey, + required this.ourSignedPreKey, + required this.ourRatchetKey, + required this.ourOneTimePreKey, + required this.theirIdentityKey, + required this.theirBaseKey, + }); + + final IdentityKeyPair ourIdentityKey; + final ECKeyPair ourSignedPreKey; + final Optional ourOneTimePreKey; + final ECKeyPair ourRatchetKey; + + final IdentityKey theirIdentityKey; + final ECPublicKey theirBaseKey; + + IdentityKeyPair getOurIdentityKey() => ourIdentityKey; + + ECKeyPair getOurSignedPreKey() => ourSignedPreKey; + + Optional getOurOneTimePreKey() => ourOneTimePreKey; + + IdentityKey getTheirIdentityKey() => theirIdentityKey; + + ECPublicKey getTheirBaseKey() => theirBaseKey; + + ECKeyPair getOurRatchetKey() => ourRatchetKey; +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/chain_key.dart b/libsignal_protocol_dart/lib/src/ratchet/chain_key.dart new file mode 100644 index 0000000..9fc1186 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/chain_key.dart @@ -0,0 +1,46 @@ +import 'dart:convert'; +import 'dart:core'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; +import '../kdf/derived_message_secrets.dart'; +import '../kdf/hkdf.dart'; +import '../ratchet/message_keys.dart'; + +class ChainKey { + ChainKey(this._kdf, this._key, this._index); + + static final Uint8List messageKeySeed = Uint8List.fromList([0x01]); + static final Uint8List chainKeySeed = Uint8List.fromList([0x02]); + + final HKDF _kdf; + final Uint8List _key; + final int _index; + + Uint8List get key => _key; + + int get index => _index; + + ChainKey getNextChainKey() { + final nextKey = _getBaseMaterial(chainKeySeed); + return ChainKey(_kdf, nextKey, _index + 1); + } + + MessageKeys getMessageKeys() { + final bytes = Uint8List.fromList(utf8.encode('WhisperMessageKeys')); + + final inputKeyMaterial = _getBaseMaterial(messageKeySeed); + final keyMaterialBytes = + _kdf.deriveSecrets(inputKeyMaterial, bytes, DerivedMessageSecrets.size); + final keyMaterial = DerivedMessageSecrets(keyMaterialBytes); + + return MessageKeys(keyMaterial.getCipherKey(), keyMaterial.getMacKey(), + keyMaterial.getIv(), _index); + } + + Uint8List _getBaseMaterial(Uint8List seed) { + final hmacSha256 = Hmac(sha256, _key); + final digest = hmacSha256.convert(seed); + return Uint8List.fromList(digest.bytes); + } +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/message_keys.dart b/libsignal_protocol_dart/lib/src/ratchet/message_keys.dart new file mode 100644 index 0000000..8c0d1e1 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/message_keys.dart @@ -0,0 +1,18 @@ +import 'dart:typed_data'; + +class MessageKeys { + MessageKeys(this.cipherKey, this.macKey, this.iv, this.counter); + + final Uint8List cipherKey; + final Uint8List macKey; + final Uint8List iv; + final int counter; + + Uint8List getCipherKey() => cipherKey; + + Uint8List getMacKey() => macKey; + + Uint8List getIv() => iv; + + int getCounter() => counter; +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/ratcheting_session.dart b/libsignal_protocol_dart/lib/src/ratchet/ratcheting_session.dart new file mode 100644 index 0000000..3b97872 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/ratcheting_session.dart @@ -0,0 +1,151 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:optional/optional.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../kdf/hkdf.dart'; +import '../kdf/hkdfv3.dart'; +import '../protocol/ciphertext_message.dart'; +import '../ratchet/alice_signal_protocol_parameters.dart'; +import '../ratchet/bob_signal_protocol_parameters.dart'; +import '../ratchet/chain_key.dart'; +import '../ratchet/root_key.dart'; +import '../ratchet/symmetric_signal_protocol_parameters.dart'; +import '../state/session_state.dart'; +import '../util/byte_util.dart'; + +class RatchetingSession { + static void initializeSession( + SessionState sessionState, SymmetricSignalProtocolParameters parameters) { + if (isAlice(parameters.ourBaseKey.publicKey, parameters.theirBaseKey)) { + final aliceParameters = AliceSignalProtocolParameters( + ourBaseKey: parameters.ourBaseKey, + ourIdentityKey: parameters.ourIdentityKey, + theirRatchetKey: parameters.theirRatchetKey, + theirIdentityKey: parameters.theirIdentityKey, + theirSignedPreKey: parameters.theirBaseKey, + theirOneTimePreKey: const Optional.empty(), + ); + RatchetingSession.initializeSessionAlice(sessionState, aliceParameters); + } else { + final bobParameters = BobSignalProtocolParameters( + ourIdentityKey: parameters.ourIdentityKey, + ourRatchetKey: parameters.ourRatchetKey, + ourSignedPreKey: parameters.ourBaseKey, + ourOneTimePreKey: const Optional.empty(), + theirBaseKey: parameters.theirBaseKey, + theirIdentityKey: parameters.theirIdentityKey, + ); + + RatchetingSession.initializeSessionBob(sessionState, bobParameters); + } + } + + static void initializeSessionAlice( + SessionState sessionState, AliceSignalProtocolParameters parameters) { + try { + sessionState + ..sessionVersion = CiphertextMessage.currentVersion + ..remoteIdentityKey = parameters.theirIdentityKey + ..localIdentityKey = parameters.ourIdentityKey.getPublicKey(); + + final sendingRatchetKey = Curve.generateKeyPair(); + final secrets = [ + ...getDiscontinuityBytes(), + ...Curve.calculateAgreement(parameters.theirSignedPreKey, + parameters.ourIdentityKey.getPrivateKey()), + ...Curve.calculateAgreement(parameters.theirIdentityKey.publicKey, + parameters.ourBaseKey.privateKey), + ...Curve.calculateAgreement( + parameters.theirSignedPreKey, parameters.ourBaseKey.privateKey) + ]; + + if (parameters.theirOneTimePreKey.isPresent) { + secrets.addAll(Curve.calculateAgreement( + parameters.theirOneTimePreKey.value, + parameters.ourBaseKey.privateKey)); + } + + final derivedKeys = calculateDerivedKeys(Uint8List.fromList(secrets)); + final sendingChain = derivedKeys + .getRootKey() + .createChain(parameters.theirRatchetKey, sendingRatchetKey); + + sessionState + ..addReceiverChain( + parameters.theirRatchetKey, derivedKeys.getChainKey()) + ..setSenderChain(sendingRatchetKey, sendingChain.$2) + ..rootKey = sendingChain.$1; + } on Exception catch (e) { + throw AssertionError(e); + } + } + + static void initializeSessionBob( + SessionState sessionState, BobSignalProtocolParameters parameters) { + try { + sessionState + ..sessionVersion = CiphertextMessage.currentVersion + ..remoteIdentityKey = parameters.theirIdentityKey + ..localIdentityKey = parameters.ourIdentityKey.getPublicKey(); + + final secrets = [ + ...getDiscontinuityBytes(), + ...Curve.calculateAgreement(parameters.theirIdentityKey.publicKey, + parameters.ourSignedPreKey.privateKey), + ...Curve.calculateAgreement( + parameters.theirBaseKey, parameters.ourIdentityKey.getPrivateKey()), + ...Curve.calculateAgreement( + parameters.theirBaseKey, parameters.ourSignedPreKey.privateKey) + ]; + if (parameters.ourOneTimePreKey.isPresent) { + secrets.addAll(Curve.calculateAgreement(parameters.theirBaseKey, + parameters.ourOneTimePreKey.value.privateKey)); + } + + final derivedKeys = calculateDerivedKeys(Uint8List.fromList(secrets)); + + sessionState + ..setSenderChain(parameters.ourRatchetKey, derivedKeys.getChainKey()) + ..rootKey = derivedKeys.getRootKey(); + } on Exception catch (e) { + throw AssertionError(e); + } + } + + static Uint8List getDiscontinuityBytes() { + final discontinuity = Uint8List(32); + final len = discontinuity.length; + for (var i = 0; i < len; i++) { + discontinuity[i] = 0xFF; + } + return discontinuity; + } + + static DerivedKeys calculateDerivedKeys(Uint8List masterSecret) { + final HKDF kdf = HKDFv3(); + final bytes = Uint8List.fromList(utf8.encode('WhisperText')); + final derivedSecretBytes = kdf.deriveSecrets(masterSecret, bytes, 64); + final derivedSecrets = ByteUtil.splitTwo(derivedSecretBytes, 32, 32); + + return DerivedKeys( + RootKey(kdf, derivedSecrets[0]), ChainKey(kdf, derivedSecrets[1], 0)); + } + + static bool isAlice(ECPublicKey ourKey, ECPublicKey theirKey) => + ourKey.compareTo(theirKey) < 0; +} + +class DerivedKeys { + DerivedKeys(this._rootKey, this._chainKey); + + final RootKey _rootKey; + final ChainKey _chainKey; + + RootKey getRootKey() => _rootKey; + + ChainKey getChainKey() => _chainKey; +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/root_key.dart b/libsignal_protocol_dart/lib/src/ratchet/root_key.dart new file mode 100644 index 0000000..9fcd1cd --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/root_key.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../kdf/derived_root_secrets.dart'; +import '../kdf/hkdf.dart'; +import '../ratchet/chain_key.dart'; + +class RootKey { + RootKey(this._kdf, this._key); + + final HKDF _kdf; + final Uint8List _key; + + Uint8List getKeyBytes() => _key; + + (RootKey, ChainKey) createChain( + ECPublicKey theirRatchetKey, ECKeyPair ourRatchetKey) { + final sharedSecret = + Curve.calculateAgreement(theirRatchetKey, ourRatchetKey.privateKey); + final bytes = Uint8List.fromList(utf8.encode('WhisperRatchet')); + final derivedSecretBytes = + _kdf.deriveSecrets4(sharedSecret, _key, bytes, DerivedRootSecrets.size); + final derivedSecrets = DerivedRootSecrets(derivedSecretBytes); + + final newRootKey = RootKey(_kdf, derivedSecrets.getRootKey()); + final newChainKey = ChainKey(_kdf, derivedSecrets.getChainKey(), 0); + + return (newRootKey, newChainKey); + } +} diff --git a/libsignal_protocol_dart/lib/src/ratchet/symmetric_signal_protocol_parameters.dart b/libsignal_protocol_dart/lib/src/ratchet/symmetric_signal_protocol_parameters.dart new file mode 100644 index 0000000..d90703b --- /dev/null +++ b/libsignal_protocol_dart/lib/src/ratchet/symmetric_signal_protocol_parameters.dart @@ -0,0 +1,23 @@ +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; + +class SymmetricSignalProtocolParameters { + SymmetricSignalProtocolParameters({ + required this.ourBaseKey, + required this.ourRatchetKey, + required this.ourIdentityKey, + required this.theirBaseKey, + required this.theirRatchetKey, + required this.theirIdentityKey, + }); + + final ECKeyPair ourBaseKey; + final ECKeyPair ourRatchetKey; + final IdentityKeyPair ourIdentityKey; + + final ECPublicKey theirBaseKey; + final ECPublicKey theirRatchetKey; + final IdentityKey theirIdentityKey; +} diff --git a/libsignal_protocol_dart/lib/src/session_builder.dart b/libsignal_protocol_dart/lib/src/session_builder.dart new file mode 100644 index 0000000..b0ad558 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/session_builder.dart @@ -0,0 +1,156 @@ +import 'package:optional/optional.dart'; + +import 'ecc/curve.dart'; +import 'ecc/ec_key_pair.dart'; +import 'invalid_key_exception.dart'; +import 'protocol/pre_key_signal_message.dart'; +import 'ratchet/alice_signal_protocol_parameters.dart'; +import 'ratchet/bob_signal_protocol_parameters.dart'; +import 'ratchet/ratcheting_session.dart'; +import 'signal_protocol_address.dart'; +import 'state/identity_key_store.dart'; +import 'state/pre_key_bundle.dart'; +import 'state/pre_key_store.dart'; +import 'state/session_record.dart'; +import 'state/session_store.dart'; +import 'state/signal_protocol_store.dart'; +import 'state/signed_pre_key_store.dart'; +import 'untrusted_identity_exception.dart'; +import 'util/log.dart' as $log; + +class SessionBuilder { + SessionBuilder(this._sessionStore, this._preKeyStore, this._signedPreKeyStore, + this._identityKeyStore, this._remoteAddress); + + SessionBuilder.fromSignalStore( + SignalProtocolStore store, SignalProtocolAddress remoteAddress) + : this(store, store, store, store, remoteAddress); + + static const String tag = 'SessionBuilder'; + + SessionStore _sessionStore; + PreKeyStore _preKeyStore; + SignedPreKeyStore _signedPreKeyStore; + IdentityKeyStore _identityKeyStore; + SignalProtocolAddress _remoteAddress; + + Future> process( + SessionRecord sessionRecord, PreKeySignalMessage message) async { + final theirIdentityKey = message.getIdentityKey(); + + if (!await _identityKeyStore.isTrustedIdentity( + _remoteAddress, theirIdentityKey, Direction.receiving)) { + throw UntrustedIdentityException( + _remoteAddress.getName(), theirIdentityKey); + } + + final unsignedPreKeyId = processV3(sessionRecord, message); + + await _identityKeyStore.saveIdentity(_remoteAddress, theirIdentityKey); + + return unsignedPreKeyId; + } + + Future> processV3( + SessionRecord sessionRecord, PreKeySignalMessage message) async { + if (sessionRecord.hasSessionState( + message.getMessageVersion(), message.getBaseKey().serialize())) { + $log.log( + "We've already setup a session for this V3 message, letting bundled message fall through..."); + return const Optional.empty(); + } + + final ourSignedPreKey = _signedPreKeyStore + .loadSignedPreKey(message.getSignedPreKeyId()) + .then((value) => value.getKeyPair()); + + late final Optional ourOneTimePreKey; + if (message.getPreKeyId().isPresent) { + ourOneTimePreKey = Optional.of(await _preKeyStore + .loadPreKey(message.getPreKeyId().value) + .then((value) => value.getKeyPair())); + } else { + ourOneTimePreKey = const Optional.empty(); + } + + if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState(); + + final parameters = BobSignalProtocolParameters( + theirBaseKey: message.getBaseKey(), + theirIdentityKey: message.getIdentityKey(), + ourIdentityKey: await _identityKeyStore.getIdentityKeyPair(), + ourSignedPreKey: await ourSignedPreKey, + ourRatchetKey: await ourSignedPreKey, + ourOneTimePreKey: ourOneTimePreKey, + ); + + RatchetingSession.initializeSessionBob( + sessionRecord.sessionState, parameters); + + sessionRecord.sessionState.localRegistrationId = + await _identityKeyStore.getLocalRegistrationId(); + sessionRecord.sessionState.remoteRegistrationId = + message.getRegistrationId(); + sessionRecord.sessionState.aliceBaseKey = message.getBaseKey().serialize(); + + if (message.getPreKeyId().isPresent) { + return message.getPreKeyId(); + } else { + return const Optional.empty(); + } + } + + Future processPreKeyBundle(PreKeyBundle preKey) async { + if (!await _identityKeyStore.isTrustedIdentity( + _remoteAddress, preKey.getIdentityKey(), Direction.sending)) { + throw UntrustedIdentityException( + _remoteAddress.getName(), preKey.getIdentityKey()); + } + + if (preKey.getSignedPreKey() != null && + !Curve.verifySignature( + preKey.getIdentityKey().publicKey, + preKey.getSignedPreKey()!.serialize(), + preKey.getSignedPreKeySignature())) { + throw InvalidKeyException('Invalid signature on device key!'); + } + + if (preKey.getSignedPreKey() == null) { + throw InvalidKeyException('No signed prekey!'); + } + + final sessionRecord = await _sessionStore.loadSession(_remoteAddress); + final ourBaseKey = Curve.generateKeyPair(); + final theirSignedPreKey = preKey.getSignedPreKey(); + final theirOneTimePreKey = Optional.ofNullable(preKey.getPreKey()); + final theirOneTimePreKeyId = theirOneTimePreKey.isPresent + ? Optional.ofNullable(preKey.getPreKeyId()) + : const Optional.empty(); + + final parameters = AliceSignalProtocolParameters( + ourBaseKey: ourBaseKey, + ourIdentityKey: await _identityKeyStore.getIdentityKeyPair(), + theirIdentityKey: preKey.getIdentityKey(), + theirSignedPreKey: theirSignedPreKey!, + theirRatchetKey: theirSignedPreKey, + theirOneTimePreKey: theirOneTimePreKey, + ); + + if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState(); + + RatchetingSession.initializeSessionAlice( + sessionRecord.sessionState, parameters); + + sessionRecord.sessionState.setUnacknowledgedPreKeyMessage( + theirOneTimePreKeyId, preKey.getSignedPreKeyId(), ourBaseKey.publicKey); + sessionRecord.sessionState.localRegistrationId = + await _identityKeyStore.getLocalRegistrationId(); + sessionRecord.sessionState.remoteRegistrationId = + preKey.getRegistrationId(); + sessionRecord.sessionState.aliceBaseKey = ourBaseKey.publicKey.serialize(); + + await _identityKeyStore.saveIdentity( + _remoteAddress, preKey.getIdentityKey()); + await _sessionStore.storeSession(_remoteAddress, sessionRecord); + } +} diff --git a/libsignal_protocol_dart/lib/src/session_cipher.dart b/libsignal_protocol_dart/lib/src/session_cipher.dart new file mode 100644 index 0000000..7a0fd37 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/session_cipher.dart @@ -0,0 +1,290 @@ +import 'dart:collection'; +import 'dart:core'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'cbc.dart'; +import 'decryption_callback.dart'; +import 'duplicate_message_exception.dart'; +import 'ecc/curve.dart'; +import 'ecc/ec_public_key.dart'; +import 'invalid_key_exception.dart'; +import 'invalid_message_exception.dart'; +import 'no_session_exception.dart'; +import 'protocol/ciphertext_message.dart'; +import 'protocol/pre_key_signal_message.dart'; +import 'protocol/signal_message.dart'; +import 'ratchet/chain_key.dart'; +import 'ratchet/message_keys.dart'; +import 'session_builder.dart'; +import 'signal_protocol_address.dart'; +import 'state/identity_key_store.dart'; +import 'state/pre_key_store.dart'; +import 'state/session_record.dart'; +import 'state/session_state.dart'; +import 'state/session_store.dart'; +import 'state/signal_protocol_store.dart'; +import 'state/signed_pre_key_store.dart'; +import 'untrusted_identity_exception.dart'; + +class SessionCipher { + SessionCipher( + this._sessionStore, + this._preKeyStore, + SignedPreKeyStore signedPreKeyStore, + this._identityKeyStore, + this._remoteAddress) { + _sessionBuilder = SessionBuilder(_sessionStore, _preKeyStore, + signedPreKeyStore, _identityKeyStore, _remoteAddress); + } + + SessionCipher.fromStore( + SignalProtocolStore store, SignalProtocolAddress remoteAddress) + : this(store, store, store, store, remoteAddress); + + static final Object sessionLock = Object(); + + SessionStore _sessionStore; + IdentityKeyStore _identityKeyStore; + late SessionBuilder _sessionBuilder; + PreKeyStore _preKeyStore; + SignalProtocolAddress _remoteAddress; + + Future encrypt(Uint8List paddedMessage) async { + final sessionRecord = await _sessionStore.loadSession(_remoteAddress); + final sessionState = sessionRecord.sessionState; + final chainKey = sessionState.getSenderChainKey(); + final messageKeys = chainKey.getMessageKeys(); + final senderEphemeral = sessionState.getSenderRatchetKey(); + final previousCounter = sessionState.previousCounter; + final sessionVersion = sessionState.getSessionVersion(); + + final ciphertextBody = getCiphertext(messageKeys, paddedMessage); + CiphertextMessage ciphertextMessage = SignalMessage( + sessionVersion, + messageKeys.getMacKey(), + senderEphemeral, + chainKey.index, + previousCounter, + ciphertextBody, + sessionState.getLocalIdentityKey(), + sessionState.getRemoteIdentityKey()); + if (sessionState.hasUnacknowledgedPreKeyMessage()) { + final items = sessionState.getUnacknowledgedPreKeyMessageItems(); + final localRegistrationId = sessionState.localRegistrationId; + + ciphertextMessage = PreKeySignalMessage.from( + sessionVersion, + localRegistrationId, + items.getPreKeyId(), + items.getSignedPreKeyId(), + items.getBaseKey(), + sessionState.getLocalIdentityKey(), + ciphertextMessage as SignalMessage); + } + + final nextChainKey = chainKey.getNextChainKey(); + sessionState.setSenderChainKey(nextChainKey); + + if (!await _identityKeyStore.isTrustedIdentity(_remoteAddress, + sessionState.getRemoteIdentityKey(), Direction.sending)) { + throw UntrustedIdentityException( + _remoteAddress.getName(), sessionState.getRemoteIdentityKey()); + } + + await _identityKeyStore.saveIdentity( + _remoteAddress, sessionState.getRemoteIdentityKey()); + await _sessionStore.storeSession(_remoteAddress, sessionRecord); + return ciphertextMessage; + } + + Future decrypt(PreKeySignalMessage ciphertext) async => + decryptWithCallback(ciphertext, () {}()); + + Future decryptWithCallback( + PreKeySignalMessage ciphertext, DecryptionCallback? callback) async { + final sessionRecord = await _sessionStore.loadSession(_remoteAddress); + final unsignedPreKeyId = + await _sessionBuilder.process(sessionRecord, ciphertext); + final plaintext = _decrypt(sessionRecord, ciphertext.getWhisperMessage()); + + if (callback != null) { + callback(plaintext); + } + + await _sessionStore.storeSession(_remoteAddress, sessionRecord); + + if (unsignedPreKeyId.isPresent) { + await _preKeyStore.removePreKey(unsignedPreKeyId.value); + } + + return plaintext; + } + + Future decryptFromSignal(SignalMessage cipherText) async => + decryptFromSignalWithCallback(cipherText, () {}()); + + Future decryptFromSignalWithCallback( + SignalMessage cipherText, DecryptionCallback? callback) async { + if (!await _sessionStore.containsSession(_remoteAddress)) { + throw NoSessionException('No session for: $_remoteAddress'); + } + + final sessionRecord = await _sessionStore.loadSession(_remoteAddress); + final plaintext = _decrypt(sessionRecord, cipherText); + + if (!await _identityKeyStore.isTrustedIdentity( + _remoteAddress, + sessionRecord.sessionState.getRemoteIdentityKey(), + Direction.receiving)) { + throw UntrustedIdentityException(_remoteAddress.getName(), + sessionRecord.sessionState.getRemoteIdentityKey()); + } + + await _identityKeyStore.saveIdentity( + _remoteAddress, sessionRecord.sessionState.getRemoteIdentityKey()); + + if (callback != null) { + callback(plaintext); + } + + await _sessionStore.storeSession(_remoteAddress, sessionRecord); + + return plaintext; + } + + Uint8List _decrypt(SessionRecord sessionRecord, SignalMessage cipherText) { + final previousStates = sessionRecord.previousSessionStates; + final exceptions = []; + + try { + final sessionState = + SessionState.fromSessionState(sessionRecord.sessionState); + final plaintext = _decryptFromState(sessionState, cipherText); + + sessionRecord.state = sessionState; + return plaintext; + } on InvalidMessageException catch (e) { + exceptions.add(e); + } + // ignore: deprecated_member_use + final pStates = HasNextIterator(previousStates.iterator); + while (pStates.hasNext) { + try { + final promotedState = SessionState.fromSessionState(pStates.next()); + final plaintext = _decryptFromState(promotedState, cipherText); + + previousStates.remove(promotedState); + sessionRecord.promoteState(promotedState); + + return plaintext; + } on InvalidMessageException catch (e) { + exceptions.add(e); + } + } + + throw InvalidMessageException('No valid sessions. $exceptions[0]'); + } + + Uint8List _decryptFromState( + SessionState sessionState, SignalMessage ciphertextMessage) { + if (!sessionState.hasSenderChain()) { + throw InvalidMessageException('Uninitialized session!'); + } + + if (ciphertextMessage.getMessageVersion() != + sessionState.getSessionVersion()) { + throw InvalidMessageException( + 'Message version $ciphertextMessage.getMessageVersion(), but session version $sessionState.getSessionVersion()'); + } + + final theirEphemeral = ciphertextMessage.getSenderRatchetKey(); + final counter = ciphertextMessage.getCounter(); + final chainKey = _getOrCreateChainKey(sessionState, theirEphemeral); + final messageKeys = _getOrCreateMessageKeys( + sessionState, theirEphemeral, chainKey!, counter); + + ciphertextMessage.verifyMac(sessionState.getRemoteIdentityKey()!, + sessionState.getLocalIdentityKey(), messageKeys!.getMacKey()); + + final plaintext = _getPlaintext(messageKeys, ciphertextMessage.getBody()); + + sessionState.clearUnacknowledgedPreKeyMessage(); + + return plaintext; + } + + Future getRemoteRegistrationId() async { + final record = await _sessionStore.loadSession(_remoteAddress); + return record.sessionState.remoteRegistrationId; + } + + Future getSessionVersion() async { + if (!await _sessionStore.containsSession(_remoteAddress)) { + // throw IllegalStateException("No session for ($_remoteAddress)!"); + } + + final record = await _sessionStore.loadSession(_remoteAddress); + return record.sessionState.getSessionVersion(); + } + + ChainKey? _getOrCreateChainKey( + SessionState sessionState, ECPublicKey theirEphemeral) { + try { + if (sessionState.hasReceiverChain(theirEphemeral)) { + return sessionState.getReceiverChainKey(theirEphemeral); + } else { + final rootKey = sessionState.getRootKey(); + final ourEphemeral = sessionState.getSenderRatchetKeyPair(); + final receiverChain = rootKey.createChain(theirEphemeral, ourEphemeral); + final ourNewEphemeral = Curve.generateKeyPair(); + final senderChain = + receiverChain.$1.createChain(theirEphemeral, ourNewEphemeral); + + sessionState + ..rootKey = senderChain.$1 + ..addReceiverChain(theirEphemeral, receiverChain.$2) + ..previousCounter = max(sessionState.getSenderChainKey().index - 1, 0) + ..setSenderChain(ourNewEphemeral, senderChain.$2); + + return receiverChain.$2; + } + } on InvalidKeyException { + rethrow; + } + } + + MessageKeys? _getOrCreateMessageKeys(SessionState sessionState, + ECPublicKey theirEphemeral, ChainKey chainKey, int counter) { + if (chainKey.index > counter) { + if (sessionState.hasMessageKeys(theirEphemeral, counter)) { + return sessionState.removeMessageKeys(theirEphemeral, counter); + } else { + throw DuplicateMessageException( + 'Received message with old counter: ${chainKey.index}, $counter'); + } + } + + if (counter - chainKey.index > 2000) { + throw InvalidMessageException('Over 2000 messages into the future!'); + } + + while (chainKey.index < counter) { + final messageKeys = chainKey.getMessageKeys(); + sessionState.setMessageKeys(theirEphemeral, messageKeys); + // ignore: parameter_assignments + chainKey = chainKey.getNextChainKey(); + } + + sessionState.setReceiverChainKey( + theirEphemeral, chainKey.getNextChainKey()); + return chainKey.getMessageKeys(); + } + + Uint8List getCiphertext(MessageKeys messageKeys, Uint8List plaintext) => + aesCbcEncrypt(messageKeys.getCipherKey(), messageKeys.getIv(), plaintext); + + Uint8List _getPlaintext(MessageKeys messageKeys, Uint8List cipherText) => + aesCbcDecrypt( + messageKeys.getCipherKey(), messageKeys.getIv(), cipherText); +} diff --git a/libsignal_protocol_dart/lib/src/signal_protocol_address.dart b/libsignal_protocol_dart/lib/src/signal_protocol_address.dart new file mode 100644 index 0000000..f0dd6e9 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/signal_protocol_address.dart @@ -0,0 +1,26 @@ +import 'package:meta/meta.dart'; + +@immutable +class SignalProtocolAddress { + const SignalProtocolAddress(this._name, this._deviceId); + + final String _name; + final int _deviceId; + + String getName() => _name; + + int getDeviceId() => _deviceId; + + @override + String toString() => '$_name:$_deviceId'; + + @override + bool operator ==(Object other) { + if (other is! SignalProtocolAddress) return false; + + return _name == other._name && _deviceId == other._deviceId; + } + + @override + int get hashCode => _name.hashCode ^ _deviceId; +} diff --git a/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pb.dart b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pb.dart new file mode 100644 index 0000000..65f7476 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pb.dart @@ -0,0 +1,225 @@ +import 'dart:core' as $core; +import 'dart:core'; + +import 'package:protobuf/protobuf.dart' as $pb; + +class LogicalFingerprint extends $pb.GeneratedMessage { + factory LogicalFingerprint({ + $core.List<$core.int>? content, + }) { + final _result = create(); + if (content != null) { + _result.content = content; + } + return _result; + } + + LogicalFingerprint._() : super(); + + factory LogicalFingerprint.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory LogicalFingerprint.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'LogicalFingerprint', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'content', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + LogicalFingerprint clone() => LogicalFingerprint()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + LogicalFingerprint copyWith(void Function(LogicalFingerprint) updates) => + super.copyWith((message) => updates(message as LogicalFingerprint)) + as LogicalFingerprint; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static LogicalFingerprint create() => LogicalFingerprint._(); + + @override + LogicalFingerprint createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static LogicalFingerprint getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static LogicalFingerprint? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get content => $_getN(0); + + @$pb.TagNumber(1) + set content($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasContent() => $_has(0); + + @$pb.TagNumber(1) + void clearContent() => clearField(1); +} + +class CombinedFingerprints extends $pb.GeneratedMessage { + factory CombinedFingerprints({ + $core.int? version, + LogicalFingerprint? localFingerprint, + LogicalFingerprint? remoteFingerprint, + }) { + final _result = create(); + if (version != null) { + _result.version = version; + } + if (localFingerprint != null) { + _result.localFingerprint = localFingerprint; + } + if (remoteFingerprint != null) { + _result.remoteFingerprint = remoteFingerprint; + } + return _result; + } + + CombinedFingerprints._() : super(); + + factory CombinedFingerprints.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory CombinedFingerprints.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'CombinedFingerprints', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'version', + $pb.PbFieldType.OU3) + ..aOM( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localFingerprint', + protoName: 'localFingerprint', + subBuilder: LogicalFingerprint.create) + ..aOM( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'remoteFingerprint', + protoName: 'remoteFingerprint', + subBuilder: LogicalFingerprint.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + CombinedFingerprints clone() => + CombinedFingerprints()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + CombinedFingerprints copyWith(void Function(CombinedFingerprints) updates) => + super.copyWith((message) => updates(message as CombinedFingerprints)) + as CombinedFingerprints; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CombinedFingerprints create() => CombinedFingerprints._(); + + @override + CombinedFingerprints createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static CombinedFingerprints getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CombinedFingerprints? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get version => $_getIZ(0); + + @$pb.TagNumber(1) + set version($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasVersion() => $_has(0); + + @$pb.TagNumber(1) + void clearVersion() => clearField(1); + + @$pb.TagNumber(2) + LogicalFingerprint get localFingerprint => $_getN(1); + + @$pb.TagNumber(2) + set localFingerprint(LogicalFingerprint v) { + setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasLocalFingerprint() => $_has(1); + + @$pb.TagNumber(2) + void clearLocalFingerprint() => clearField(2); + + @$pb.TagNumber(2) + LogicalFingerprint ensureLocalFingerprint() => $_ensure(1); + + @$pb.TagNumber(3) + LogicalFingerprint get remoteFingerprint => $_getN(2); + + @$pb.TagNumber(3) + set remoteFingerprint(LogicalFingerprint v) { + setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasRemoteFingerprint() => $_has(2); + + @$pb.TagNumber(3) + void clearRemoteFingerprint() => clearField(3); + + @$pb.TagNumber(3) + LogicalFingerprint ensureRemoteFingerprint() => $_ensure(2); +} diff --git a/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbenum.dart b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbenum.dart new file mode 100644 index 0000000..2427c36 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbenum.dart @@ -0,0 +1,5 @@ +// Generated code. Do not modify. +// source: FingerprintProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields diff --git a/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbjson.dart b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbjson.dart new file mode 100644 index 0000000..0b868c8 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbjson.dart @@ -0,0 +1,43 @@ +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use logicalFingerprintDescriptor instead') +const logicalFingerprint$json = { + '1': 'LogicalFingerprint', + '2': [ + {'1': 'content', '3': 1, '4': 1, '5': 12, '10': 'content'}, + ], +}; + +/// Descriptor for `LogicalFingerprint`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List logicalFingerprintDescriptor = + $convert.base64Decode( + 'ChJMb2dpY2FsRmluZ2VycHJpbnQSGAoHY29udGVudBgBIAEoDFIHY29udGVudA=='); +@$core.Deprecated('Use combinedFingerprintsDescriptor instead') +const sombinedFingerprints$json = { + '1': 'CombinedFingerprints', + '2': [ + {'1': 'version', '3': 1, '4': 1, '5': 13, '10': 'version'}, + { + '1': 'localFingerprint', + '3': 2, + '4': 1, + '5': 11, + '6': '.textsecure.LogicalFingerprint', + '10': 'localFingerprint' + }, + { + '1': 'remoteFingerprint', + '3': 3, + '4': 1, + '5': 11, + '6': '.textsecure.LogicalFingerprint', + '10': 'remoteFingerprint' + }, + ], +}; + +/// Descriptor for `CombinedFingerprints`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List combinedFingerprintsDescriptor = $convert.base64Decode( + 'ChRDb21iaW5lZEZpbmdlcnByaW50cxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEkoKEGxvY2FsRmluZ2VycHJpbnQYAiABKAsyHi50ZXh0c2VjdXJlLkxvZ2ljYWxGaW5nZXJwcmludFIQbG9jYWxGaW5nZXJwcmludBJMChFyZW1vdGVGaW5nZXJwcmludBgDIAEoCzIeLnRleHRzZWN1cmUuTG9naWNhbEZpbmdlcnByaW50UhFyZW1vdGVGaW5nZXJwcmludA=='); diff --git a/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbserver.dart b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbserver.dart new file mode 100644 index 0000000..a0f7ec9 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/fingerprint_protocol.pbserver.dart @@ -0,0 +1,7 @@ +// Generated code. Do not modify. +// source: FingerprintProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'fingerprint_protocol.pb.dart'; diff --git a/libsignal_protocol_dart/lib/src/state/identity_key_store.dart b/libsignal_protocol_dart/lib/src/state/identity_key_store.dart new file mode 100644 index 0000000..f542af6 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/identity_key_store.dart @@ -0,0 +1,20 @@ +import '../identity_key.dart'; +import '../identity_key_pair.dart'; +import '../signal_protocol_address.dart'; + +enum Direction { sending, receiving } + +abstract class IdentityKeyStore { + Future getIdentityKeyPair(); + Future getLocalRegistrationId(); + Future saveIdentity( + SignalProtocolAddress address, + IdentityKey? identityKey, + ); + Future isTrustedIdentity( + SignalProtocolAddress address, + IdentityKey? identityKey, + Direction direction, + ); + Future getIdentity(SignalProtocolAddress address); +} diff --git a/libsignal_protocol_dart/lib/src/state/impl/in_memory_identity_key_store.dart b/libsignal_protocol_dart/lib/src/state/impl/in_memory_identity_key_store.dart new file mode 100644 index 0000000..8dc8c50 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/impl/in_memory_identity_key_store.dart @@ -0,0 +1,51 @@ +import 'dart:collection'; + +import '../../eq.dart'; +import '../../identity_key.dart'; +import '../../identity_key_pair.dart'; +import '../../signal_protocol_address.dart'; +import '../identity_key_store.dart'; + +class InMemoryIdentityKeyStore extends IdentityKeyStore { + InMemoryIdentityKeyStore(this.identityKeyPair, this.localRegistrationId); + + final trustedKeys = HashMap(); + + final IdentityKeyPair identityKeyPair; + final int localRegistrationId; + + @override + Future getIdentity(SignalProtocolAddress address) async => + trustedKeys[address]!; + + @override + Future getIdentityKeyPair() async => identityKeyPair; + + @override + Future getLocalRegistrationId() async => localRegistrationId; + + @override + Future isTrustedIdentity(SignalProtocolAddress address, + IdentityKey? identityKey, Direction? direction) async { + final trusted = trustedKeys[address]; + if (identityKey == null) { + return false; + } + return trusted == null || eq(trusted.serialize(), identityKey.serialize()); + } + + @override + Future saveIdentity( + SignalProtocolAddress address, IdentityKey? identityKey) async { + final existing = trustedKeys[address]; + if (identityKey == null) { + return false; + } + if (identityKey != existing) { + trustedKeys[address] = identityKey; + return true; + } else { + return false; + } + } +} diff --git a/libsignal_protocol_dart/lib/src/state/impl/in_memory_pre_key_store.dart b/libsignal_protocol_dart/lib/src/state/impl/in_memory_pre_key_store.dart new file mode 100644 index 0000000..69c65b0 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/impl/in_memory_pre_key_store.dart @@ -0,0 +1,32 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import '../../invalid_key_id_exception.dart'; +import '../pre_key_record.dart'; +import '../pre_key_store.dart'; + +class InMemoryPreKeyStore extends PreKeyStore { + final store = HashMap(); + + @override + Future containsPreKey(int preKeyId) async => + store.containsKey(preKeyId); + + @override + Future loadPreKey(int preKeyId) async { + if (!store.containsKey(preKeyId)) { + throw InvalidKeyIdException('No such prekeyrecord! - $preKeyId'); + } + return PreKeyRecord.fromBuffer(store[preKeyId]!); + } + + @override + Future removePreKey(int preKeyId) async { + store.remove(preKeyId); + } + + @override + Future storePreKey(int preKeyId, PreKeyRecord record) async { + store[preKeyId] = record.serialize(); + } +} diff --git a/libsignal_protocol_dart/lib/src/state/impl/in_memory_session_store.dart b/libsignal_protocol_dart/lib/src/state/impl/in_memory_session_store.dart new file mode 100644 index 0000000..9d2c057 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/impl/in_memory_session_store.dart @@ -0,0 +1,63 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import '../../signal_protocol_address.dart'; +import '../session_record.dart'; +import '../session_store.dart'; + +class InMemorySessionStore extends SessionStore { + InMemorySessionStore(); + + HashMap sessions = + HashMap(); + + @override + Future containsSession(SignalProtocolAddress address) async => + sessions.containsKey(address); + + @override + Future deleteAllSessions(String name) async { + for (final k in sessions.keys.toList()) { + if (k.getName() == name) { + sessions.remove(k); + } + } + } + + @override + Future deleteSession(SignalProtocolAddress address) async { + sessions.remove(address); + } + + @override + Future> getSubDeviceSessions(String name) async { + final deviceIds = []; + + for (final key in sessions.keys) { + if (key.getName() == name && key.getDeviceId() != 1) { + deviceIds.add(key.getDeviceId()); + } + } + + return deviceIds; + } + + @override + Future loadSession(SignalProtocolAddress address) async { + try { + if (await containsSession(address)) { + return SessionRecord.fromSerialized(sessions[address]!); + } else { + return SessionRecord(); + } + } on Exception catch (e) { + throw AssertionError(e); + } + } + + @override + Future storeSession( + SignalProtocolAddress address, SessionRecord record) async { + sessions[address] = record.serialize(); + } +} diff --git a/libsignal_protocol_dart/lib/src/state/impl/in_memory_signal_protocol_store.dart b/libsignal_protocol_dart/lib/src/state/impl/in_memory_signal_protocol_store.dart new file mode 100644 index 0000000..cb37a6d --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/impl/in_memory_signal_protocol_store.dart @@ -0,0 +1,119 @@ +import 'dart:core'; + +import '../../identity_key.dart'; +import '../../identity_key_pair.dart'; +import '../../signal_protocol_address.dart'; +import '../identity_key_store.dart'; +import '../pre_key_record.dart'; +import '../session_record.dart'; +import '../signal_protocol_store.dart'; +import '../signed_pre_key_record.dart'; +import 'in_memory_identity_key_store.dart'; +import 'in_memory_pre_key_store.dart'; +import 'in_memory_session_store.dart'; +import 'in_memory_signed_pre_key_store.dart'; + +class InMemorySignalProtocolStore implements SignalProtocolStore { + InMemorySignalProtocolStore( + IdentityKeyPair identityKeyPair, int registrationId) { + _identityKeyStore = + InMemoryIdentityKeyStore(identityKeyPair, registrationId); + } + + final preKeyStore = InMemoryPreKeyStore(); + final sessionStore = InMemorySessionStore(); + final signedPreKeyStore = InMemorySignedPreKeyStore(); + + late IdentityKeyStore _identityKeyStore; + + @override + Future getIdentityKeyPair() async => + _identityKeyStore.getIdentityKeyPair(); + + @override + Future getLocalRegistrationId() async => + _identityKeyStore.getLocalRegistrationId(); + + @override + Future saveIdentity( + SignalProtocolAddress address, IdentityKey? identityKey) async => + _identityKeyStore.saveIdentity(address, identityKey); + + @override + Future isTrustedIdentity(SignalProtocolAddress address, + IdentityKey? identityKey, Direction direction) async => + _identityKeyStore.isTrustedIdentity(address, identityKey, direction); + + @override + Future getIdentity(SignalProtocolAddress address) async => + _identityKeyStore.getIdentity(address); + + @override + Future loadPreKey(int preKeyId) async => + preKeyStore.loadPreKey(preKeyId); + + @override + Future storePreKey(int preKeyId, PreKeyRecord record) async { + await preKeyStore.storePreKey(preKeyId, record); + } + + @override + Future containsPreKey(int preKeyId) async => + preKeyStore.containsPreKey(preKeyId); + + @override + Future removePreKey(int preKeyId) async { + await preKeyStore.removePreKey(preKeyId); + } + + @override + Future loadSession(SignalProtocolAddress address) async => + sessionStore.loadSession(address); + + @override + Future> getSubDeviceSessions(String name) async => + sessionStore.getSubDeviceSessions(name); + + @override + Future storeSession( + SignalProtocolAddress address, SessionRecord record) async { + await sessionStore.storeSession(address, record); + } + + @override + Future containsSession(SignalProtocolAddress address) async => + sessionStore.containsSession(address); + + @override + Future deleteSession(SignalProtocolAddress address) async { + await sessionStore.deleteSession(address); + } + + @override + Future deleteAllSessions(String name) async { + await sessionStore.deleteAllSessions(name); + } + + @override + Future loadSignedPreKey(int signedPreKeyId) async => + signedPreKeyStore.loadSignedPreKey(signedPreKeyId); + + @override + Future> loadSignedPreKeys() async => + signedPreKeyStore.loadSignedPreKeys(); + + @override + Future storeSignedPreKey( + int signedPreKeyId, SignedPreKeyRecord record) async { + await signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record); + } + + @override + Future containsSignedPreKey(int signedPreKeyId) async => + signedPreKeyStore.containsSignedPreKey(signedPreKeyId); + + @override + Future removeSignedPreKey(int signedPreKeyId) async { + await signedPreKeyStore.removeSignedPreKey(signedPreKeyId); + } +} diff --git a/libsignal_protocol_dart/lib/src/state/impl/in_memory_signed_pre_key_store.dart b/libsignal_protocol_dart/lib/src/state/impl/in_memory_signed_pre_key_store.dart new file mode 100644 index 0000000..8a6f0f8 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/impl/in_memory_signed_pre_key_store.dart @@ -0,0 +1,43 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import '../../invalid_key_id_exception.dart'; +import '../signed_pre_key_record.dart'; +import '../signed_pre_key_store.dart'; + +class InMemorySignedPreKeyStore extends SignedPreKeyStore { + final store = HashMap(); + + @override + Future loadSignedPreKey(int signedPreKeyId) async { + if (!store.containsKey(signedPreKeyId)) { + throw InvalidKeyIdException( + 'No such signedprekeyrecord! $signedPreKeyId'); + } + return SignedPreKeyRecord.fromSerialized(store[signedPreKeyId]!); + } + + @override + Future> loadSignedPreKeys() async { + final results = []; + for (final serialized in store.values) { + results.add(SignedPreKeyRecord.fromSerialized(serialized)); + } + return results; + } + + @override + Future storeSignedPreKey( + int signedPreKeyId, SignedPreKeyRecord record) async { + store[signedPreKeyId] = record.serialize(); + } + + @override + Future containsSignedPreKey(int signedPreKeyId) async => + store.containsKey(signedPreKeyId); + + @override + Future removeSignedPreKey(int signedPreKeyId) async { + store.remove(signedPreKeyId); + } +} diff --git a/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pb.dart b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pb.dart new file mode 100644 index 0000000..3328eee --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pb.dart @@ -0,0 +1,2301 @@ +import 'dart:core' as $core; +import 'dart:core'; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +class SessionStructureChainChainKey extends $pb.GeneratedMessage { + factory SessionStructureChainChainKey({ + $core.int? index, + $core.List<$core.int>? key, + }) { + final _result = create(); + if (index != null) { + _result.index = index; + } + if (key != null) { + _result.key = key; + } + return _result; + } + + SessionStructureChainChainKey._() : super(); + + factory SessionStructureChainChainKey.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructureChainChainKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure.Chain.ChainKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'index', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'key', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChainChainKey clone() => + SessionStructureChainChainKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChainChainKey copyWith( + void Function(SessionStructureChainChainKey) updates) => + super.copyWith( + (message) => updates(message as SessionStructureChainChainKey)) + as SessionStructureChainChainKey; // ignore: deprecated_member_use + + @override + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructureChainChainKey create() => + SessionStructureChainChainKey._(); + + @override + SessionStructureChainChainKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructureChainChainKey getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SessionStructureChainChainKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get index => $_getIZ(0); + + @$pb.TagNumber(1) + set index($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasIndex() => $_has(0); + + @$pb.TagNumber(1) + void clearIndex() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get key => $_getN(1); + + @$pb.TagNumber(2) + set key($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasKey() => $_has(1); + + @$pb.TagNumber(2) + void clearKey() => clearField(2); +} + +class SessionStructureChainMessageKey extends $pb.GeneratedMessage { + factory SessionStructureChainMessageKey({ + $core.int? index, + $core.List<$core.int>? cipherKey, + $core.List<$core.int>? macKey, + $core.List<$core.int>? iv, + }) { + final _result = create(); + if (index != null) { + _result.index = index; + } + if (cipherKey != null) { + _result.cipherKey = cipherKey; + } + if (macKey != null) { + _result.macKey = macKey; + } + if (iv != null) { + _result.iv = iv; + } + return _result; + } + + SessionStructureChainMessageKey._() : super(); + + factory SessionStructureChainMessageKey.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructureChainMessageKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure.Chain.MessageKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'index', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'cipherKey', + $pb.PbFieldType.OY, + protoName: 'cipherKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'macKey', + $pb.PbFieldType.OY, + protoName: 'macKey') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'iv', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChainMessageKey clone() => + SessionStructureChainMessageKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChainMessageKey copyWith( + void Function(SessionStructureChainMessageKey) updates) => + super.copyWith( + (message) => updates(message as SessionStructureChainMessageKey)) + as SessionStructureChainMessageKey; // ignore: deprecated_member_use + @override + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructureChainMessageKey create() => + SessionStructureChainMessageKey._(); + + @override + SessionStructureChainMessageKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructureChainMessageKey getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor( + create); + static SessionStructureChainMessageKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get index => $_getIZ(0); + + @$pb.TagNumber(1) + set index($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasIndex() => $_has(0); + + @$pb.TagNumber(1) + void clearIndex() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get cipherKey => $_getN(1); + + @$pb.TagNumber(2) + set cipherKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasCipherKey() => $_has(1); + + @$pb.TagNumber(2) + void clearCipherKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get macKey => $_getN(2); + + @$pb.TagNumber(3) + set macKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasMacKey() => $_has(2); + + @$pb.TagNumber(3) + void clearMacKey() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get iv => $_getN(3); + + @$pb.TagNumber(4) + set iv($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasIv() => $_has(3); + + @$pb.TagNumber(4) + void clearIv() => clearField(4); +} + +class SessionStructureChain extends $pb.GeneratedMessage { + factory SessionStructureChain({ + $core.List<$core.int>? senderRatchetKey, + $core.List<$core.int>? senderRatchetKeyPrivate, + SessionStructureChainChainKey? chainKey, + $core.Iterable? messageKeys, + }) { + final _result = create(); + if (senderRatchetKey != null) { + _result.senderRatchetKey = senderRatchetKey; + } + if (senderRatchetKeyPrivate != null) { + _result.senderRatchetKeyPrivate = senderRatchetKeyPrivate; + } + if (chainKey != null) { + _result.chainKey = chainKey; + } + if (messageKeys != null) { + _result.messageKeys.addAll(messageKeys); + } + return _result; + } + + SessionStructureChain._() : super(); + + factory SessionStructureChain.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructureChain.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure.Chain', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderRatchetKey', + $pb.PbFieldType.OY, + protoName: 'senderRatchetKey') + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderRatchetKeyPrivate', + $pb.PbFieldType.OY, + protoName: 'senderRatchetKeyPrivate') + ..aOM( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'chainKey', + protoName: 'chainKey', + subBuilder: SessionStructureChainChainKey.create) + ..pc( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'messageKeys', + $pb.PbFieldType.PM, + protoName: 'messageKeys', + subBuilder: SessionStructureChainMessageKey.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChain clone() => + SessionStructureChain()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructureChain copyWith( + void Function(SessionStructureChain) updates) => + super.copyWith((message) => updates(message as SessionStructureChain)) + as SessionStructureChain; // ignore: deprecated_member_use + @override + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructureChain create() => SessionStructureChain._(); + + @override + SessionStructureChain createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructureChain getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SessionStructureChain? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get senderRatchetKey => $_getN(0); + + @$pb.TagNumber(1) + set senderRatchetKey($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSenderRatchetKey() => $_has(0); + + @$pb.TagNumber(1) + void clearSenderRatchetKey() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get senderRatchetKeyPrivate => $_getN(1); + + @$pb.TagNumber(2) + set senderRatchetKeyPrivate($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSenderRatchetKeyPrivate() => $_has(1); + + @$pb.TagNumber(2) + void clearSenderRatchetKeyPrivate() => clearField(2); + + @$pb.TagNumber(3) + SessionStructureChainChainKey get chainKey => $_getN(2); + + @$pb.TagNumber(3) + set chainKey(SessionStructureChainChainKey v) { + setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasChainKey() => $_has(2); + + @$pb.TagNumber(3) + void clearChainKey() => clearField(3); + + @$pb.TagNumber(3) + SessionStructureChainChainKey ensureChainKey() => $_ensure(2); + + @$pb.TagNumber(4) + $core.List get messageKeys => $_getList(3); +} + +class SessionStructurePendingKeyExchange extends $pb.GeneratedMessage { + factory SessionStructurePendingKeyExchange({ + $core.int? sequence, + $core.List<$core.int>? localBaseKey, + $core.List<$core.int>? localBaseKeyPrivate, + $core.List<$core.int>? localRatchetKey, + $core.List<$core.int>? localRatchetKeyPrivate, + $core.List<$core.int>? localIdentityKey, + $core.List<$core.int>? localIdentityKeyPrivate, + }) { + final _result = create(); + if (sequence != null) { + _result.sequence = sequence; + } + if (localBaseKey != null) { + _result.localBaseKey = localBaseKey; + } + if (localBaseKeyPrivate != null) { + _result.localBaseKeyPrivate = localBaseKeyPrivate; + } + if (localRatchetKey != null) { + _result.localRatchetKey = localRatchetKey; + } + if (localRatchetKeyPrivate != null) { + _result.localRatchetKeyPrivate = localRatchetKeyPrivate; + } + if (localIdentityKey != null) { + _result.localIdentityKey = localIdentityKey; + } + if (localIdentityKeyPrivate != null) { + _result.localIdentityKeyPrivate = localIdentityKeyPrivate; + } + return _result; + } + + SessionStructurePendingKeyExchange._() : super(); + + factory SessionStructurePendingKeyExchange.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructurePendingKeyExchange.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure.PendingKeyExchange', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'sequence', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localBaseKey', + $pb.PbFieldType.OY, + protoName: 'localBaseKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localBaseKeyPrivate', + $pb.PbFieldType.OY, + protoName: 'localBaseKeyPrivate') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localRatchetKey', + $pb.PbFieldType.OY, + protoName: 'localRatchetKey') + ..a<$core.List<$core.int>>( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localRatchetKeyPrivate', + $pb.PbFieldType.OY, + protoName: 'localRatchetKeyPrivate') + ..a<$core.List<$core.int>>( + 7, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localIdentityKey', + $pb.PbFieldType.OY, + protoName: 'localIdentityKey') + ..a<$core.List<$core.int>>( + 8, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localIdentityKeyPrivate', + $pb.PbFieldType.OY, + protoName: 'localIdentityKeyPrivate') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructurePendingKeyExchange clone() => + SessionStructurePendingKeyExchange()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructurePendingKeyExchange copyWith( + void Function(SessionStructurePendingKeyExchange) updates) => + super.copyWith((message) => + updates(message as SessionStructurePendingKeyExchange)) + as SessionStructurePendingKeyExchange; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructurePendingKeyExchange create() => + SessionStructurePendingKeyExchange._(); + + @override + SessionStructurePendingKeyExchange createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructurePendingKeyExchange getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor( + create); + static SessionStructurePendingKeyExchange? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get sequence => $_getIZ(0); + + @$pb.TagNumber(1) + set sequence($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSequence() => $_has(0); + + @$pb.TagNumber(1) + void clearSequence() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get localBaseKey => $_getN(1); + + @$pb.TagNumber(2) + set localBaseKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasLocalBaseKey() => $_has(1); + + @$pb.TagNumber(2) + void clearLocalBaseKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get localBaseKeyPrivate => $_getN(2); + + @$pb.TagNumber(3) + set localBaseKeyPrivate($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasLocalBaseKeyPrivate() => $_has(2); + + @$pb.TagNumber(3) + void clearLocalBaseKeyPrivate() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get localRatchetKey => $_getN(3); + + @$pb.TagNumber(4) + set localRatchetKey($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasLocalRatchetKey() => $_has(3); + + @$pb.TagNumber(4) + void clearLocalRatchetKey() => clearField(4); + + @$pb.TagNumber(5) + $core.List<$core.int> get localRatchetKeyPrivate => $_getN(4); + + @$pb.TagNumber(5) + set localRatchetKeyPrivate($core.List<$core.int> v) { + $_setBytes(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasLocalRatchetKeyPrivate() => $_has(4); + + @$pb.TagNumber(5) + void clearLocalRatchetKeyPrivate() => clearField(5); + + @$pb.TagNumber(7) + $core.List<$core.int> get localIdentityKey => $_getN(5); + + @$pb.TagNumber(7) + set localIdentityKey($core.List<$core.int> v) { + $_setBytes(5, v); + } + + @$pb.TagNumber(7) + $core.bool hasLocalIdentityKey() => $_has(5); + + @$pb.TagNumber(7) + void clearLocalIdentityKey() => clearField(7); + + @$pb.TagNumber(8) + $core.List<$core.int> get localIdentityKeyPrivate => $_getN(6); + + @$pb.TagNumber(8) + set localIdentityKeyPrivate($core.List<$core.int> v) { + $_setBytes(6, v); + } + + @$pb.TagNumber(8) + $core.bool hasLocalIdentityKeyPrivate() => $_has(6); + + @$pb.TagNumber(8) + void clearLocalIdentityKeyPrivate() => clearField(8); +} + +class SessionStructurePendingPreKey extends $pb.GeneratedMessage { + factory SessionStructurePendingPreKey({ + $core.int? preKeyId, + $core.List<$core.int>? baseKey, + $core.int? signedPreKeyId, + }) { + final _result = create(); + if (preKeyId != null) { + _result.preKeyId = preKeyId; + } + if (baseKey != null) { + _result.baseKey = baseKey; + } + if (signedPreKeyId != null) { + _result.signedPreKeyId = signedPreKeyId; + } + return _result; + } + + SessionStructurePendingPreKey._() : super(); + + factory SessionStructurePendingPreKey.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructurePendingPreKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure.PendingPreKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'preKeyId', + $pb.PbFieldType.OU3, + protoName: 'preKeyId') + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'baseKey', + $pb.PbFieldType.OY, + protoName: 'baseKey') + ..a<$core.int>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'signedPreKeyId', + $pb.PbFieldType.O3, + protoName: 'signedPreKeyId') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructurePendingPreKey clone() => + SessionStructurePendingPreKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructurePendingPreKey copyWith( + void Function(SessionStructurePendingPreKey) updates) => + super.copyWith( + (message) => updates(message as SessionStructurePendingPreKey)) + as SessionStructurePendingPreKey; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructurePendingPreKey create() => + SessionStructurePendingPreKey._(); + + @override + SessionStructurePendingPreKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructurePendingPreKey getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SessionStructurePendingPreKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get preKeyId => $_getIZ(0); + + @$pb.TagNumber(1) + set preKeyId($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasPreKeyId() => $_has(0); + + @$pb.TagNumber(1) + void clearPreKeyId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get baseKey => $_getN(1); + + @$pb.TagNumber(2) + set baseKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasBaseKey() => $_has(1); + + @$pb.TagNumber(2) + void clearBaseKey() => clearField(2); + + @$pb.TagNumber(3) + $core.int get signedPreKeyId => $_getIZ(2); + + @$pb.TagNumber(3) + set signedPreKeyId($core.int v) { + $_setSignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasSignedPreKeyId() => $_has(2); + + @$pb.TagNumber(3) + void clearSignedPreKeyId() => clearField(3); +} + +class SessionStructure extends $pb.GeneratedMessage { + factory SessionStructure({ + $core.int? sessionVersion, + $core.List<$core.int>? localIdentityPublic, + $core.List<$core.int>? remoteIdentityPublic, + $core.List<$core.int>? rootKey, + $core.int? previousCounter, + SessionStructureChain? senderChain, + $core.Iterable? receiverChains, + SessionStructurePendingKeyExchange? pendingKeyExchange, + SessionStructurePendingPreKey? pendingPreKey, + $core.int? remoteRegistrationId, + $core.int? localRegistrationId, + $core.bool? needsRefresh, + $core.List<$core.int>? aliceBaseKey, + }) { + final _result = create(); + if (sessionVersion != null) { + _result.sessionVersion = sessionVersion; + } + if (localIdentityPublic != null) { + _result.localIdentityPublic = localIdentityPublic; + } + if (remoteIdentityPublic != null) { + _result.remoteIdentityPublic = remoteIdentityPublic; + } + if (rootKey != null) { + _result.rootKey = rootKey; + } + if (previousCounter != null) { + _result.previousCounter = previousCounter; + } + if (senderChain != null) { + _result.senderChain = senderChain; + } + if (receiverChains != null) { + _result.receiverChains.addAll(receiverChains); + } + if (pendingKeyExchange != null) { + _result.pendingKeyExchange = pendingKeyExchange; + } + if (pendingPreKey != null) { + _result.pendingPreKey = pendingPreKey; + } + if (remoteRegistrationId != null) { + _result.remoteRegistrationId = remoteRegistrationId; + } + if (localRegistrationId != null) { + _result.localRegistrationId = localRegistrationId; + } + if (needsRefresh != null) { + _result.needsRefresh = needsRefresh; + } + if (aliceBaseKey != null) { + _result.aliceBaseKey = aliceBaseKey; + } + return _result; + } + + SessionStructure._() : super(); + + factory SessionStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SessionStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SessionStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'sessionVersion', + $pb.PbFieldType.OU3, + protoName: 'sessionVersion') + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localIdentityPublic', + $pb.PbFieldType.OY, + protoName: 'localIdentityPublic') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'remoteIdentityPublic', + $pb.PbFieldType.OY, + protoName: 'remoteIdentityPublic') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'rootKey', + $pb.PbFieldType.OY, + protoName: 'rootKey') + ..a<$core.int>( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'previousCounter', + $pb.PbFieldType.OU3, + protoName: 'previousCounter') + ..aOM( + 6, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderChain', + protoName: 'senderChain', + subBuilder: SessionStructureChain.create) + ..pc( + 7, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'receiverChains', + $pb.PbFieldType.PM, + protoName: 'receiverChains', + subBuilder: SessionStructureChain.create) + ..aOM( + 8, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'pendingKeyExchange', + protoName: 'pendingKeyExchange', + subBuilder: SessionStructurePendingKeyExchange.create) + ..aOM( + 9, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'pendingPreKey', + protoName: 'pendingPreKey', + subBuilder: SessionStructurePendingPreKey.create) + ..a<$core.int>( + 10, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'remoteRegistrationId', + $pb.PbFieldType.OU3, + protoName: 'remoteRegistrationId') + ..a<$core.int>( + 11, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'localRegistrationId', + $pb.PbFieldType.OU3, + protoName: 'localRegistrationId') + ..aOB( + 12, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'needsRefresh', + protoName: 'needsRefresh') + ..a<$core.List<$core.int>>( + 13, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'aliceBaseKey', + $pb.PbFieldType.OY, + protoName: 'aliceBaseKey') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SessionStructure clone() => SessionStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SessionStructure copyWith(void Function(SessionStructure) updates) => + super.copyWith((message) => updates(message as SessionStructure)) + as SessionStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SessionStructure create() => SessionStructure._(); + + @override + SessionStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SessionStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SessionStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get sessionVersion => $_getIZ(0); + + @$pb.TagNumber(1) + set sessionVersion($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSessionVersion() => $_has(0); + + @$pb.TagNumber(1) + void clearSessionVersion() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get localIdentityPublic => $_getN(1); + + @$pb.TagNumber(2) + set localIdentityPublic($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasLocalIdentityPublic() => $_has(1); + + @$pb.TagNumber(2) + void clearLocalIdentityPublic() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get remoteIdentityPublic => $_getN(2); + + @$pb.TagNumber(3) + set remoteIdentityPublic($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasRemoteIdentityPublic() => $_has(2); + + @$pb.TagNumber(3) + void clearRemoteIdentityPublic() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get rootKey => $_getN(3); + + @$pb.TagNumber(4) + set rootKey($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasRootKey() => $_has(3); + + @$pb.TagNumber(4) + void clearRootKey() => clearField(4); + + @$pb.TagNumber(5) + $core.int get previousCounter => $_getIZ(4); + + @$pb.TagNumber(5) + set previousCounter($core.int v) { + $_setUnsignedInt32(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasPreviousCounter() => $_has(4); + + @$pb.TagNumber(5) + void clearPreviousCounter() => clearField(5); + + @$pb.TagNumber(6) + SessionStructureChain get senderChain => $_getN(5); + + @$pb.TagNumber(6) + set senderChain(SessionStructureChain v) { + setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasSenderChain() => $_has(5); + + @$pb.TagNumber(6) + void clearSenderChain() => clearField(6); + + @$pb.TagNumber(6) + SessionStructureChain ensureSenderChain() => $_ensure(5); + + @$pb.TagNumber(7) + $core.List get receiverChains => $_getList(6); + + @$pb.TagNumber(8) + SessionStructurePendingKeyExchange get pendingKeyExchange => $_getN(7); + + @$pb.TagNumber(8) + set pendingKeyExchange(SessionStructurePendingKeyExchange v) { + setField(8, v); + } + + @$pb.TagNumber(8) + $core.bool hasPendingKeyExchange() => $_has(7); + + @$pb.TagNumber(8) + void clearPendingKeyExchange() => clearField(8); + + @$pb.TagNumber(8) + SessionStructurePendingKeyExchange ensurePendingKeyExchange() => $_ensure(7); + + @$pb.TagNumber(9) + SessionStructurePendingPreKey get pendingPreKey => $_getN(8); + + @$pb.TagNumber(9) + set pendingPreKey(SessionStructurePendingPreKey v) { + setField(9, v); + } + + @$pb.TagNumber(9) + $core.bool hasPendingPreKey() => $_has(8); + + @$pb.TagNumber(9) + void clearPendingPreKey() => clearField(9); + + @$pb.TagNumber(9) + SessionStructurePendingPreKey ensurePendingPreKey() => $_ensure(8); + + @$pb.TagNumber(10) + $core.int get remoteRegistrationId => $_getIZ(9); + + @$pb.TagNumber(10) + set remoteRegistrationId($core.int v) { + $_setUnsignedInt32(9, v); + } + + @$pb.TagNumber(10) + $core.bool hasRemoteRegistrationId() => $_has(9); + + @$pb.TagNumber(10) + void clearRemoteRegistrationId() => clearField(10); + + @$pb.TagNumber(11) + $core.int get localRegistrationId => $_getIZ(10); + + @$pb.TagNumber(11) + set localRegistrationId($core.int v) { + $_setUnsignedInt32(10, v); + } + + @$pb.TagNumber(11) + $core.bool hasLocalRegistrationId() => $_has(10); + + @$pb.TagNumber(11) + void clearLocalRegistrationId() => clearField(11); + + @$pb.TagNumber(12) + $core.bool get needsRefresh => $_getBF(11); + + @$pb.TagNumber(12) + set needsRefresh($core.bool v) { + $_setBool(11, v); + } + + @$pb.TagNumber(12) + $core.bool hasNeedsRefresh() => $_has(11); + + @$pb.TagNumber(12) + void clearNeedsRefresh() => clearField(12); + + @$pb.TagNumber(13) + $core.List<$core.int> get aliceBaseKey => $_getN(12); + + @$pb.TagNumber(13) + set aliceBaseKey($core.List<$core.int> v) { + $_setBytes(12, v); + } + + @$pb.TagNumber(13) + $core.bool hasAliceBaseKey() => $_has(12); + + @$pb.TagNumber(13) + void clearAliceBaseKey() => clearField(13); +} + +class RecordStructure extends $pb.GeneratedMessage { + factory RecordStructure({ + SessionStructure? currentSession, + $core.Iterable? previousSessions, + }) { + final _result = create(); + if (currentSession != null) { + _result.currentSession = currentSession; + } + if (previousSessions != null) { + _result.previousSessions.addAll(previousSessions); + } + return _result; + } + + RecordStructure._() : super(); + + factory RecordStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory RecordStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'RecordStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..aOM( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'currentSession', + protoName: 'currentSession', + subBuilder: SessionStructure.create) + ..pc( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'previousSessions', + $pb.PbFieldType.PM, + protoName: 'previousSessions', + subBuilder: SessionStructure.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + RecordStructure clone() => RecordStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + RecordStructure copyWith(void Function(RecordStructure) updates) => + super.copyWith((message) => updates(message as RecordStructure)) + as RecordStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RecordStructure create() => RecordStructure._(); + + @override + RecordStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static RecordStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static RecordStructure? _defaultInstance; + + @$pb.TagNumber(1) + SessionStructure get currentSession => $_getN(0); + + @$pb.TagNumber(1) + set currentSession(SessionStructure v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasCurrentSession() => $_has(0); + + @$pb.TagNumber(1) + void clearCurrentSession() => clearField(1); + + @$pb.TagNumber(1) + SessionStructure ensureCurrentSession() => $_ensure(0); + + @$pb.TagNumber(2) + $core.List get previousSessions => $_getList(1); +} + +class PreKeyRecordStructure extends $pb.GeneratedMessage { + factory PreKeyRecordStructure({ + $core.int? id, + $core.List<$core.int>? publicKey, + $core.List<$core.int>? privateKey, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (publicKey != null) { + _result.publicKey = publicKey; + } + if (privateKey != null) { + _result.privateKey = privateKey; + } + return _result; + } + + PreKeyRecordStructure._() : super(); + + factory PreKeyRecordStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory PreKeyRecordStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'PreKeyRecordStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'id', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'publicKey', + $pb.PbFieldType.OY, + protoName: 'publicKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'privateKey', + $pb.PbFieldType.OY, + protoName: 'privateKey') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + PreKeyRecordStructure clone() => + PreKeyRecordStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + PreKeyRecordStructure copyWith( + void Function(PreKeyRecordStructure) updates) => + super.copyWith((message) => updates(message as PreKeyRecordStructure)) + as PreKeyRecordStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PreKeyRecordStructure create() => PreKeyRecordStructure._(); + + @override + PreKeyRecordStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static PreKeyRecordStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PreKeyRecordStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + + @$pb.TagNumber(1) + set id($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get publicKey => $_getN(1); + + @$pb.TagNumber(2) + set publicKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPublicKey() => $_has(1); + + @$pb.TagNumber(2) + void clearPublicKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get privateKey => $_getN(2); + + @$pb.TagNumber(3) + set privateKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPrivateKey() => $_has(2); + + @$pb.TagNumber(3) + void clearPrivateKey() => clearField(3); +} + +class SignedPreKeyRecordStructure extends $pb.GeneratedMessage { + factory SignedPreKeyRecordStructure({ + $core.int? id, + $core.List<$core.int>? publicKey, + $core.List<$core.int>? privateKey, + $core.List<$core.int>? signature, + $fixnum.Int64? timestamp, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (publicKey != null) { + _result.publicKey = publicKey; + } + if (privateKey != null) { + _result.privateKey = privateKey; + } + if (signature != null) { + _result.signature = signature; + } + if (timestamp != null) { + _result.timestamp = timestamp; + } + return _result; + } + + SignedPreKeyRecordStructure._() : super(); + + factory SignedPreKeyRecordStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SignedPreKeyRecordStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SignedPreKeyRecordStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'id', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'publicKey', + $pb.PbFieldType.OY, + protoName: 'publicKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'privateKey', + $pb.PbFieldType.OY, + protoName: 'privateKey') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'signature', + $pb.PbFieldType.OY) + ..a<$fixnum.Int64>( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'timestamp', + $pb.PbFieldType.OF6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SignedPreKeyRecordStructure clone() => + SignedPreKeyRecordStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SignedPreKeyRecordStructure copyWith( + void Function(SignedPreKeyRecordStructure) updates) => + super.copyWith( + (message) => updates(message as SignedPreKeyRecordStructure)) + as SignedPreKeyRecordStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SignedPreKeyRecordStructure create() => + SignedPreKeyRecordStructure._(); + + @override + SignedPreKeyRecordStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SignedPreKeyRecordStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SignedPreKeyRecordStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + + @$pb.TagNumber(1) + set id($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get publicKey => $_getN(1); + + @$pb.TagNumber(2) + set publicKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPublicKey() => $_has(1); + + @$pb.TagNumber(2) + void clearPublicKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get privateKey => $_getN(2); + + @$pb.TagNumber(3) + set privateKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPrivateKey() => $_has(2); + + @$pb.TagNumber(3) + void clearPrivateKey() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get signature => $_getN(3); + + @$pb.TagNumber(4) + set signature($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasSignature() => $_has(3); + + @$pb.TagNumber(4) + void clearSignature() => clearField(4); + + @$pb.TagNumber(5) + $fixnum.Int64 get timestamp => $_getI64(4); + + @$pb.TagNumber(5) + set timestamp($fixnum.Int64 v) { + $_setInt64(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasTimestamp() => $_has(4); + + @$pb.TagNumber(5) + void clearTimestamp() => clearField(5); +} + +class IdentityKeyPairStructure extends $pb.GeneratedMessage { + factory IdentityKeyPairStructure({ + $core.List<$core.int>? publicKey, + $core.List<$core.int>? privateKey, + }) { + final _result = create(); + if (publicKey != null) { + _result.publicKey = publicKey; + } + if (privateKey != null) { + _result.privateKey = privateKey; + } + return _result; + } + + IdentityKeyPairStructure._() : super(); + + factory IdentityKeyPairStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory IdentityKeyPairStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'IdentityKeyPairStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'publicKey', + $pb.PbFieldType.OY, + protoName: 'publicKey') + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'privateKey', + $pb.PbFieldType.OY, + protoName: 'privateKey') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + IdentityKeyPairStructure clone() => + IdentityKeyPairStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + IdentityKeyPairStructure copyWith( + void Function(IdentityKeyPairStructure) updates) => + super.copyWith((message) => updates(message as IdentityKeyPairStructure)) + as IdentityKeyPairStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IdentityKeyPairStructure create() => IdentityKeyPairStructure._(); + + @override + IdentityKeyPairStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static IdentityKeyPairStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static IdentityKeyPairStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get publicKey => $_getN(0); + + @$pb.TagNumber(1) + set publicKey($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasPublicKey() => $_has(0); + + @$pb.TagNumber(1) + void clearPublicKey() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get privateKey => $_getN(1); + + @$pb.TagNumber(2) + set privateKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPrivateKey() => $_has(1); + + @$pb.TagNumber(2) + void clearPrivateKey() => clearField(2); +} + +class SenderKeyStateStructureSenderChainKey extends $pb.GeneratedMessage { + factory SenderKeyStateStructureSenderChainKey({ + $core.int? iteration, + $core.List<$core.int>? seed, + }) { + final _result = create(); + if (iteration != null) { + _result.iteration = iteration; + } + if (seed != null) { + _result.seed = seed; + } + return _result; + } + + SenderKeyStateStructureSenderChainKey._() : super(); + + factory SenderKeyStateStructureSenderChainKey.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyStateStructureSenderChainKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyStateStructure.SenderChainKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'iteration', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'seed', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderChainKey clone() => + SenderKeyStateStructureSenderChainKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderChainKey copyWith( + void Function(SenderKeyStateStructureSenderChainKey) updates) => + super.copyWith((message) => + updates(message as SenderKeyStateStructureSenderChainKey)) + as SenderKeyStateStructureSenderChainKey; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderChainKey create() => + SenderKeyStateStructureSenderChainKey._(); + + @override + SenderKeyStateStructureSenderChainKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderChainKey getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + SenderKeyStateStructureSenderChainKey>(create); + static SenderKeyStateStructureSenderChainKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get iteration => $_getIZ(0); + + @$pb.TagNumber(1) + set iteration($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasIteration() => $_has(0); + + @$pb.TagNumber(1) + void clearIteration() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get seed => $_getN(1); + + @$pb.TagNumber(2) + set seed($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSeed() => $_has(1); + + @$pb.TagNumber(2) + void clearSeed() => clearField(2); +} + +class SenderKeyStateStructureSenderMessageKey extends $pb.GeneratedMessage { + factory SenderKeyStateStructureSenderMessageKey({ + $core.int? iteration, + $core.List<$core.int>? seed, + }) { + final _result = create(); + if (iteration != null) { + _result.iteration = iteration; + } + if (seed != null) { + _result.seed = seed; + } + return _result; + } + + SenderKeyStateStructureSenderMessageKey._() : super(); + + factory SenderKeyStateStructureSenderMessageKey.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyStateStructureSenderMessageKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyStateStructure.SenderMessageKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'iteration', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'seed', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderMessageKey clone() => + SenderKeyStateStructureSenderMessageKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderMessageKey copyWith( + void Function(SenderKeyStateStructureSenderMessageKey) updates) => + super.copyWith((message) => + updates(message as SenderKeyStateStructureSenderMessageKey)) + as SenderKeyStateStructureSenderMessageKey; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderMessageKey create() => + SenderKeyStateStructureSenderMessageKey._(); + + @override + SenderKeyStateStructureSenderMessageKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderMessageKey getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + SenderKeyStateStructureSenderMessageKey>(create); + static SenderKeyStateStructureSenderMessageKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get iteration => $_getIZ(0); + + @$pb.TagNumber(1) + set iteration($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasIteration() => $_has(0); + + @$pb.TagNumber(1) + void clearIteration() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get seed => $_getN(1); + + @$pb.TagNumber(2) + set seed($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSeed() => $_has(1); + + @$pb.TagNumber(2) + void clearSeed() => clearField(2); +} + +class SenderKeyStateStructureSenderSigningKey extends $pb.GeneratedMessage { + factory SenderKeyStateStructureSenderSigningKey({ + $core.List<$core.int>? public, + $core.List<$core.int>? private, + }) { + final _result = create(); + if (public != null) { + _result.public = public; + } + if (private != null) { + _result.private = private; + } + return _result; + } + + SenderKeyStateStructureSenderSigningKey._() : super(); + + factory SenderKeyStateStructureSenderSigningKey.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyStateStructureSenderSigningKey.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyStateStructure.SenderSigningKey', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'public', + $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'private', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderSigningKey clone() => + SenderKeyStateStructureSenderSigningKey()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructureSenderSigningKey copyWith( + void Function(SenderKeyStateStructureSenderSigningKey) updates) => + super.copyWith((message) => + updates(message as SenderKeyStateStructureSenderSigningKey)) + as SenderKeyStateStructureSenderSigningKey; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderSigningKey create() => + SenderKeyStateStructureSenderSigningKey._(); + + @override + SenderKeyStateStructureSenderSigningKey createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructureSenderSigningKey getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + SenderKeyStateStructureSenderSigningKey>(create); + static SenderKeyStateStructureSenderSigningKey? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get public => $_getN(0); + + @$pb.TagNumber(1) + set public($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasPublic() => $_has(0); + + @$pb.TagNumber(1) + void clearPublic() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get private => $_getN(1); + + @$pb.TagNumber(2) + set private($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPrivate() => $_has(1); + + @$pb.TagNumber(2) + void clearPrivate() => clearField(2); +} + +class SenderKeyStateStructure extends $pb.GeneratedMessage { + factory SenderKeyStateStructure({ + $core.int? senderKeyId, + SenderKeyStateStructureSenderChainKey? senderChainKey, + SenderKeyStateStructureSenderSigningKey? senderSigningKey, + $core.Iterable? senderMessageKeys, + }) { + final _result = create(); + if (senderKeyId != null) { + _result.senderKeyId = senderKeyId; + } + if (senderChainKey != null) { + _result.senderChainKey = senderChainKey; + } + if (senderSigningKey != null) { + _result.senderSigningKey = senderSigningKey; + } + if (senderMessageKeys != null) { + _result.senderMessageKeys.addAll(senderMessageKeys); + } + return _result; + } + + SenderKeyStateStructure._() : super(); + + factory SenderKeyStateStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyStateStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyStateStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderKeyId', + $pb.PbFieldType.OU3, + protoName: 'senderKeyId') + ..aOM( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderChainKey', + protoName: 'senderChainKey', + subBuilder: SenderKeyStateStructureSenderChainKey.create) + ..aOM( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderSigningKey', + protoName: 'senderSigningKey', + subBuilder: SenderKeyStateStructureSenderSigningKey.create) + ..pc( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderMessageKeys', + $pb.PbFieldType.PM, + protoName: 'senderMessageKeys', + subBuilder: SenderKeyStateStructureSenderMessageKey.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructure clone() => + SenderKeyStateStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyStateStructure copyWith( + void Function(SenderKeyStateStructure) updates) => + super.copyWith((message) => updates(message as SenderKeyStateStructure)) + as SenderKeyStateStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructure create() => SenderKeyStateStructure._(); + + @override + SenderKeyStateStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyStateStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SenderKeyStateStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get senderKeyId => $_getIZ(0); + + @$pb.TagNumber(1) + set senderKeyId($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSenderKeyId() => $_has(0); + + @$pb.TagNumber(1) + void clearSenderKeyId() => clearField(1); + + @$pb.TagNumber(2) + SenderKeyStateStructureSenderChainKey get senderChainKey => $_getN(1); + + @$pb.TagNumber(2) + set senderChainKey(SenderKeyStateStructureSenderChainKey v) { + setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasSenderChainKey() => $_has(1); + + @$pb.TagNumber(2) + void clearSenderChainKey() => clearField(2); + + @$pb.TagNumber(2) + SenderKeyStateStructureSenderChainKey ensureSenderChainKey() => $_ensure(1); + + @$pb.TagNumber(3) + SenderKeyStateStructureSenderSigningKey get senderSigningKey => $_getN(2); + + @$pb.TagNumber(3) + set senderSigningKey(SenderKeyStateStructureSenderSigningKey v) { + setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasSenderSigningKey() => $_has(2); + + @$pb.TagNumber(3) + void clearSenderSigningKey() => clearField(3); + + @$pb.TagNumber(3) + SenderKeyStateStructureSenderSigningKey ensureSenderSigningKey() => + $_ensure(2); + + @$pb.TagNumber(4) + $core.List get senderMessageKeys => + $_getList(3); +} + +class SenderKeyRecordStructure extends $pb.GeneratedMessage { + factory SenderKeyRecordStructure({ + $core.Iterable? senderKeyStates, + }) { + final _result = create(); + if (senderKeyStates != null) { + _result.senderKeyStates.addAll(senderKeyStates); + } + return _result; + } + + SenderKeyRecordStructure._() : super(); + + factory SenderKeyRecordStructure.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyRecordStructure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyRecordStructure', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..pc( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'senderKeyStates', + $pb.PbFieldType.PM, + protoName: 'senderKeyStates', + subBuilder: SenderKeyStateStructure.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyRecordStructure clone() => + SenderKeyRecordStructure()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyRecordStructure copyWith( + void Function(SenderKeyRecordStructure) updates) => + super.copyWith((message) => updates(message as SenderKeyRecordStructure)) + as SenderKeyRecordStructure; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyRecordStructure create() => SenderKeyRecordStructure._(); + + @override + SenderKeyRecordStructure createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyRecordStructure getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SenderKeyRecordStructure? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get senderKeyStates => $_getList(0); +} diff --git a/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbenum.dart b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbenum.dart new file mode 100644 index 0000000..8ad5fc0 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbenum.dart @@ -0,0 +1,5 @@ +// Generated code. Do not modify. +// source: LocalStorageProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields diff --git a/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbjson.dart b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbjson.dart new file mode 100644 index 0000000..1a900a4 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbjson.dart @@ -0,0 +1,348 @@ +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructure$json = { + '1': 'SessionStructure', + '2': [ + {'1': 'sessionVersion', '3': 1, '4': 1, '5': 13, '10': 'sessionVersion'}, + { + '1': 'localIdentityPublic', + '3': 2, + '4': 1, + '5': 12, + '10': 'localIdentityPublic' + }, + { + '1': 'remoteIdentityPublic', + '3': 3, + '4': 1, + '5': 12, + '10': 'remoteIdentityPublic' + }, + {'1': 'rootKey', '3': 4, '4': 1, '5': 12, '10': 'rootKey'}, + {'1': 'previousCounter', '3': 5, '4': 1, '5': 13, '10': 'previousCounter'}, + { + '1': 'senderChain', + '3': 6, + '4': 1, + '5': 11, + '6': '.textsecure.SessionStructure.Chain', + '10': 'senderChain' + }, + { + '1': 'receiverChains', + '3': 7, + '4': 3, + '5': 11, + '6': '.textsecure.SessionStructure.Chain', + '10': 'receiverChains' + }, + { + '1': 'pendingKeyExchange', + '3': 8, + '4': 1, + '5': 11, + '6': '.textsecure.SessionStructure.PendingKeyExchange', + '10': 'pendingKeyExchange' + }, + { + '1': 'pendingPreKey', + '3': 9, + '4': 1, + '5': 11, + '6': '.textsecure.SessionStructure.PendingPreKey', + '10': 'pendingPreKey' + }, + { + '1': 'remoteRegistrationId', + '3': 10, + '4': 1, + '5': 13, + '10': 'remoteRegistrationId' + }, + { + '1': 'localRegistrationId', + '3': 11, + '4': 1, + '5': 13, + '10': 'localRegistrationId' + }, + {'1': 'needsRefresh', '3': 12, '4': 1, '5': 8, '10': 'needsRefresh'}, + {'1': 'aliceBaseKey', '3': 13, '4': 1, '5': 12, '10': 'aliceBaseKey'}, + ], + '3': [ + sessionStructureChain$json, + sessionStructurePendingKeyExchange$json, + sessionStructurePendingPreKey$json + ], +}; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructureChain$json = { + '1': 'Chain', + '2': [ + { + '1': 'senderRatchetKey', + '3': 1, + '4': 1, + '5': 12, + '10': 'senderRatchetKey' + }, + { + '1': 'senderRatchetKeyPrivate', + '3': 2, + '4': 1, + '5': 12, + '10': 'senderRatchetKeyPrivate' + }, + { + '1': 'chainKey', + '3': 3, + '4': 1, + '5': 11, + '6': '.textsecure.SessionStructure.Chain.ChainKey', + '10': 'chainKey' + }, + { + '1': 'messageKeys', + '3': 4, + '4': 3, + '5': 11, + '6': '.textsecure.SessionStructure.Chain.MessageKey', + '10': 'messageKeys' + }, + ], + '3': [ + sessionStructureChainChainKey$json, + sessionStructureChainMessageKey$json + ], +}; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructureChainChainKey$json = { + '1': 'ChainKey', + '2': [ + {'1': 'index', '3': 1, '4': 1, '5': 13, '10': 'index'}, + {'1': 'key', '3': 2, '4': 1, '5': 12, '10': 'key'}, + ], +}; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructureChainMessageKey$json = { + '1': 'MessageKey', + '2': [ + {'1': 'index', '3': 1, '4': 1, '5': 13, '10': 'index'}, + {'1': 'cipherKey', '3': 2, '4': 1, '5': 12, '10': 'cipherKey'}, + {'1': 'macKey', '3': 3, '4': 1, '5': 12, '10': 'macKey'}, + {'1': 'iv', '3': 4, '4': 1, '5': 12, '10': 'iv'}, + ], +}; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructurePendingKeyExchange$json = { + '1': 'PendingKeyExchange', + '2': [ + {'1': 'sequence', '3': 1, '4': 1, '5': 13, '10': 'sequence'}, + {'1': 'localBaseKey', '3': 2, '4': 1, '5': 12, '10': 'localBaseKey'}, + { + '1': 'localBaseKeyPrivate', + '3': 3, + '4': 1, + '5': 12, + '10': 'localBaseKeyPrivate' + }, + {'1': 'localRatchetKey', '3': 4, '4': 1, '5': 12, '10': 'localRatchetKey'}, + { + '1': 'localRatchetKeyPrivate', + '3': 5, + '4': 1, + '5': 12, + '10': 'localRatchetKeyPrivate' + }, + { + '1': 'localIdentityKey', + '3': 7, + '4': 1, + '5': 12, + '10': 'localIdentityKey' + }, + { + '1': 'localIdentityKeyPrivate', + '3': 8, + '4': 1, + '5': 12, + '10': 'localIdentityKeyPrivate' + }, + ], +}; + +@$core.Deprecated('Use sessionStructureDescriptor instead') +const sessionStructurePendingPreKey$json = { + '1': 'PendingPreKey', + '2': [ + {'1': 'preKeyId', '3': 1, '4': 1, '5': 13, '10': 'preKeyId'}, + {'1': 'signedPreKeyId', '3': 3, '4': 1, '5': 5, '10': 'signedPreKeyId'}, + {'1': 'baseKey', '3': 2, '4': 1, '5': 12, '10': 'baseKey'}, + ], +}; + +/// Descriptor for `SessionStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sessionStructureDescriptor = $convert.base64Decode( + 'ChBTZXNzaW9uU3RydWN0dXJlEiYKDnNlc3Npb25WZXJzaW9uGAEgASgNUg5zZXNzaW9uVmVyc2lvbhIwChNsb2NhbElkZW50aXR5UHVibGljGAIgASgMUhNsb2NhbElkZW50aXR5UHVibGljEjIKFHJlbW90ZUlkZW50aXR5UHVibGljGAMgASgMUhRyZW1vdGVJZGVudGl0eVB1YmxpYxIYCgdyb290S2V5GAQgASgMUgdyb290S2V5EigKD3ByZXZpb3VzQ291bnRlchgFIAEoDVIPcHJldmlvdXNDb3VudGVyEkQKC3NlbmRlckNoYWluGAYgASgLMiIudGV4dHNlY3VyZS5TZXNzaW9uU3RydWN0dXJlLkNoYWluUgtzZW5kZXJDaGFpbhJKCg5yZWNlaXZlckNoYWlucxgHIAMoCzIiLnRleHRzZWN1cmUuU2Vzc2lvblN0cnVjdHVyZS5DaGFpblIOcmVjZWl2ZXJDaGFpbnMSXwoScGVuZGluZ0tleUV4Y2hhbmdlGAggASgLMi8udGV4dHNlY3VyZS5TZXNzaW9uU3RydWN0dXJlLlBlbmRpbmdLZXlFeGNoYW5nZVIScGVuZGluZ0tleUV4Y2hhbmdlElAKDXBlbmRpbmdQcmVLZXkYCSABKAsyKi50ZXh0c2VjdXJlLlNlc3Npb25TdHJ1Y3R1cmUuUGVuZGluZ1ByZUtleVINcGVuZGluZ1ByZUtleRIyChRyZW1vdGVSZWdpc3RyYXRpb25JZBgKIAEoDVIUcmVtb3RlUmVnaXN0cmF0aW9uSWQSMAoTbG9jYWxSZWdpc3RyYXRpb25JZBgLIAEoDVITbG9jYWxSZWdpc3RyYXRpb25JZBIiCgxuZWVkc1JlZnJlc2gYDCABKAhSDG5lZWRzUmVmcmVzaBIiCgxhbGljZUJhc2VLZXkYDSABKAxSDGFsaWNlQmFzZUtleRqlAwoFQ2hhaW4SKgoQc2VuZGVyUmF0Y2hldEtleRgBIAEoDFIQc2VuZGVyUmF0Y2hldEtleRI4ChdzZW5kZXJSYXRjaGV0S2V5UHJpdmF0ZRgCIAEoDFIXc2VuZGVyUmF0Y2hldEtleVByaXZhdGUSRwoIY2hhaW5LZXkYAyABKAsyKy50ZXh0c2VjdXJlLlNlc3Npb25TdHJ1Y3R1cmUuQ2hhaW4uQ2hhaW5LZXlSCGNoYWluS2V5Ek8KC21lc3NhZ2VLZXlzGAQgAygLMi0udGV4dHNlY3VyZS5TZXNzaW9uU3RydWN0dXJlLkNoYWluLk1lc3NhZ2VLZXlSC21lc3NhZ2VLZXlzGjIKCENoYWluS2V5EhQKBWluZGV4GAEgASgNUgVpbmRleBIQCgNrZXkYAiABKAxSA2tleRpoCgpNZXNzYWdlS2V5EhQKBWluZGV4GAEgASgNUgVpbmRleBIcCgljaXBoZXJLZXkYAiABKAxSCWNpcGhlcktleRIWCgZtYWNLZXkYAyABKAxSBm1hY0tleRIOCgJpdhgEIAEoDFICaXYazgIKElBlbmRpbmdLZXlFeGNoYW5nZRIaCghzZXF1ZW5jZRgBIAEoDVIIc2VxdWVuY2USIgoMbG9jYWxCYXNlS2V5GAIgASgMUgxsb2NhbEJhc2VLZXkSMAoTbG9jYWxCYXNlS2V5UHJpdmF0ZRgDIAEoDFITbG9jYWxCYXNlS2V5UHJpdmF0ZRIoCg9sb2NhbFJhdGNoZXRLZXkYBCABKAxSD2xvY2FsUmF0Y2hldEtleRI2ChZsb2NhbFJhdGNoZXRLZXlQcml2YXRlGAUgASgMUhZsb2NhbFJhdGNoZXRLZXlQcml2YXRlEioKEGxvY2FsSWRlbnRpdHlLZXkYByABKAxSEGxvY2FsSWRlbnRpdHlLZXkSOAoXbG9jYWxJZGVudGl0eUtleVByaXZhdGUYCCABKAxSF2xvY2FsSWRlbnRpdHlLZXlQcml2YXRlGm0KDVBlbmRpbmdQcmVLZXkSGgoIcHJlS2V5SWQYASABKA1SCHByZUtleUlkEiYKDnNpZ25lZFByZUtleUlkGAMgASgFUg5zaWduZWRQcmVLZXlJZBIYCgdiYXNlS2V5GAIgASgMUgdiYXNlS2V5'); +@$core.Deprecated('Use recordStructureDescriptor instead') +const recordStructure$json = { + '1': 'RecordStructure', + '2': [ + { + '1': 'currentSession', + '3': 1, + '4': 1, + '5': 11, + '6': '.textsecure.SessionStructure', + '10': 'currentSession' + }, + { + '1': 'previousSessions', + '3': 2, + '4': 3, + '5': 11, + '6': '.textsecure.SessionStructure', + '10': 'previousSessions' + }, + ], +}; + +/// Descriptor for `RecordStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List recordStructureDescriptor = $convert.base64Decode( + 'Cg9SZWNvcmRTdHJ1Y3R1cmUSRAoOY3VycmVudFNlc3Npb24YASABKAsyHC50ZXh0c2VjdXJlLlNlc3Npb25TdHJ1Y3R1cmVSDmN1cnJlbnRTZXNzaW9uEkgKEHByZXZpb3VzU2Vzc2lvbnMYAiADKAsyHC50ZXh0c2VjdXJlLlNlc3Npb25TdHJ1Y3R1cmVSEHByZXZpb3VzU2Vzc2lvbnM='); +@$core.Deprecated('Use preKeyRecordStructureDescriptor instead') +const preKeyRecordStructure$json = { + '1': 'PreKeyRecordStructure', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 13, '10': 'id'}, + {'1': 'publicKey', '3': 2, '4': 1, '5': 12, '10': 'publicKey'}, + {'1': 'privateKey', '3': 3, '4': 1, '5': 12, '10': 'privateKey'}, + ], +}; + +/// Descriptor for `PreKeyRecordStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List preKeyRecordStructureDescriptor = $convert.base64Decode( + 'ChVQcmVLZXlSZWNvcmRTdHJ1Y3R1cmUSDgoCaWQYASABKA1SAmlkEhwKCXB1YmxpY0tleRgCIAEoDFIJcHVibGljS2V5Eh4KCnByaXZhdGVLZXkYAyABKAxSCnByaXZhdGVLZXk='); +@$core.Deprecated('Use signedPreKeyRecordStructureDescriptor instead') +const signedPreKeyRecordStructure$json = { + '1': 'SignedPreKeyRecordStructure', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 13, '10': 'id'}, + {'1': 'publicKey', '3': 2, '4': 1, '5': 12, '10': 'publicKey'}, + {'1': 'privateKey', '3': 3, '4': 1, '5': 12, '10': 'privateKey'}, + {'1': 'signature', '3': 4, '4': 1, '5': 12, '10': 'signature'}, + {'1': 'timestamp', '3': 5, '4': 1, '5': 6, '10': 'timestamp'}, + ], +}; + +/// Descriptor for `SignedPreKeyRecordStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List signedPreKeyRecordStructureDescriptor = + $convert.base64Decode( + 'ChtTaWduZWRQcmVLZXlSZWNvcmRTdHJ1Y3R1cmUSDgoCaWQYASABKA1SAmlkEhwKCXB1YmxpY0tleRgCIAEoDFIJcHVibGljS2V5Eh4KCnByaXZhdGVLZXkYAyABKAxSCnByaXZhdGVLZXkSHAoJc2lnbmF0dXJlGAQgASgMUglzaWduYXR1cmUSHAoJdGltZXN0YW1wGAUgASgGUgl0aW1lc3RhbXA='); +@$core.Deprecated('Use identityKeyPairStructureDescriptor instead') +const identityKeyPairStructure$json = { + '1': 'IdentityKeyPairStructure', + '2': [ + {'1': 'publicKey', '3': 1, '4': 1, '5': 12, '10': 'publicKey'}, + {'1': 'privateKey', '3': 2, '4': 1, '5': 12, '10': 'privateKey'}, + ], +}; + +/// Descriptor for `IdentityKeyPairStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List identityKeyPairStructureDescriptor = + $convert.base64Decode( + 'ChhJZGVudGl0eUtleVBhaXJTdHJ1Y3R1cmUSHAoJcHVibGljS2V5GAEgASgMUglwdWJsaWNLZXkSHgoKcHJpdmF0ZUtleRgCIAEoDFIKcHJpdmF0ZUtleQ=='); +@$core.Deprecated('Use senderKeyStateStructureDescriptor instead') +const senderKeyStateStructure$json = { + '1': 'SenderKeyStateStructure', + '2': [ + {'1': 'senderKeyId', '3': 1, '4': 1, '5': 13, '10': 'senderKeyId'}, + { + '1': 'senderChainKey', + '3': 2, + '4': 1, + '5': 11, + '6': '.textsecure.SenderKeyStateStructure.SenderChainKey', + '10': 'senderChainKey' + }, + { + '1': 'senderSigningKey', + '3': 3, + '4': 1, + '5': 11, + '6': '.textsecure.SenderKeyStateStructure.SenderSigningKey', + '10': 'senderSigningKey' + }, + { + '1': 'senderMessageKeys', + '3': 4, + '4': 3, + '5': 11, + '6': '.textsecure.SenderKeyStateStructure.SenderMessageKey', + '10': 'senderMessageKeys' + }, + ], + '3': [ + senderKeyStateStructureSenderChainKey$json, + senderKeyStateStructureSenderMessageKey$json, + senderKeyStateStructureSenderSigningKey$json + ], +}; + +@$core.Deprecated('Use senderKeyStateStructureDescriptor instead') +const senderKeyStateStructureSenderChainKey$json = { + '1': 'SenderChainKey', + '2': [ + {'1': 'iteration', '3': 1, '4': 1, '5': 13, '10': 'iteration'}, + {'1': 'seed', '3': 2, '4': 1, '5': 12, '10': 'seed'}, + ], +}; + +@$core.Deprecated('Use senderKeyStateStructureDescriptor instead') +const senderKeyStateStructureSenderMessageKey$json = { + '1': 'SenderMessageKey', + '2': [ + {'1': 'iteration', '3': 1, '4': 1, '5': 13, '10': 'iteration'}, + {'1': 'seed', '3': 2, '4': 1, '5': 12, '10': 'seed'}, + ], +}; + +@$core.Deprecated('Use senderKeyStateStructureDescriptor instead') +const senderKeyStateStructureSenderSigningKey$json = { + '1': 'SenderSigningKey', + '2': [ + {'1': 'public', '3': 1, '4': 1, '5': 12, '10': 'public'}, + {'1': 'private', '3': 2, '4': 1, '5': 12, '10': 'private'}, + ], +}; + +/// Descriptor for `SenderKeyStateStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List senderKeyStateStructureDescriptor = + $convert.base64Decode( + 'ChdTZW5kZXJLZXlTdGF0ZVN0cnVjdHVyZRIgCgtzZW5kZXJLZXlJZBgBIAEoDVILc2VuZGVyS2V5SWQSWgoOc2VuZGVyQ2hhaW5LZXkYAiABKAsyMi50ZXh0c2VjdXJlLlNlbmRlcktleVN0YXRlU3RydWN0dXJlLlNlbmRlckNoYWluS2V5Ug5zZW5kZXJDaGFpbktleRJgChBzZW5kZXJTaWduaW5nS2V5GAMgASgLMjQudGV4dHNlY3VyZS5TZW5kZXJLZXlTdGF0ZVN0cnVjdHVyZS5TZW5kZXJTaWduaW5nS2V5UhBzZW5kZXJTaWduaW5nS2V5EmIKEXNlbmRlck1lc3NhZ2VLZXlzGAQgAygLMjQudGV4dHNlY3VyZS5TZW5kZXJLZXlTdGF0ZVN0cnVjdHVyZS5TZW5kZXJNZXNzYWdlS2V5UhFzZW5kZXJNZXNzYWdlS2V5cxpCCg5TZW5kZXJDaGFpbktleRIcCglpdGVyYXRpb24YASABKA1SCWl0ZXJhdGlvbhISCgRzZWVkGAIgASgMUgRzZWVkGkQKEFNlbmRlck1lc3NhZ2VLZXkSHAoJaXRlcmF0aW9uGAEgASgNUglpdGVyYXRpb24SEgoEc2VlZBgCIAEoDFIEc2VlZBpEChBTZW5kZXJTaWduaW5nS2V5EhYKBnB1YmxpYxgBIAEoDFIGcHVibGljEhgKB3ByaXZhdGUYAiABKAxSB3ByaXZhdGU='); +@$core.Deprecated('Use senderKeyRecordStructureDescriptor instead') +const senderKeyRecordStructure$json = { + '1': 'SenderKeyRecordStructure', + '2': [ + { + '1': 'senderKeyStates', + '3': 1, + '4': 3, + '5': 11, + '6': '.textsecure.SenderKeyStateStructure', + '10': 'senderKeyStates' + }, + ], +}; + +/// Descriptor for `SenderKeyRecordStructure`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List senderKeyRecordStructureDescriptor = + $convert.base64Decode( + 'ChhTZW5kZXJLZXlSZWNvcmRTdHJ1Y3R1cmUSTQoPc2VuZGVyS2V5U3RhdGVzGAEgAygLMiMudGV4dHNlY3VyZS5TZW5kZXJLZXlTdGF0ZVN0cnVjdHVyZVIPc2VuZGVyS2V5U3RhdGVz'); diff --git a/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbserver.dart b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbserver.dart new file mode 100644 index 0000000..b4dccdd --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/local_storage_protocol.pbserver.dart @@ -0,0 +1,7 @@ +// Generated code. Do not modify. +// source: LocalStorageProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'local_storage_protocol.pb.dart'; diff --git a/libsignal_protocol_dart/lib/src/state/pre_key_bundle.dart b/libsignal_protocol_dart/lib/src/state/pre_key_bundle.dart new file mode 100644 index 0000000..6b0fe5e --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/pre_key_bundle.dart @@ -0,0 +1,45 @@ +import 'dart:typed_data'; + +import '../ecc/ec_public_key.dart'; +import '../identity_key.dart'; + +class PreKeyBundle { + PreKeyBundle( + this._registrationId, + this._deviceId, + this._preKeyId, + this._preKeyPublic, + this._signedPreKeyId, + this._signedPreKeyPublic, + this._signedPreKeySignature, + this._identityKey); + + final int _registrationId; + + final int _deviceId; + + final int? _preKeyId; + final ECPublicKey? _preKeyPublic; + + final int _signedPreKeyId; + final ECPublicKey? _signedPreKeyPublic; + final Uint8List? _signedPreKeySignature; + + final IdentityKey _identityKey; + + int getDeviceId() => _deviceId; + + int? getPreKeyId() => _preKeyId; + + ECPublicKey? getPreKey() => _preKeyPublic; + + int getSignedPreKeyId() => _signedPreKeyId; + + ECPublicKey? getSignedPreKey() => _signedPreKeyPublic; + + Uint8List? getSignedPreKeySignature() => _signedPreKeySignature; + + IdentityKey getIdentityKey() => _identityKey; + + int getRegistrationId() => _registrationId; +} diff --git a/libsignal_protocol_dart/lib/src/state/pre_key_record.dart b/libsignal_protocol_dart/lib/src/state/pre_key_record.dart new file mode 100644 index 0000000..6635b7c --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/pre_key_record.dart @@ -0,0 +1,37 @@ +import 'dart:typed_data'; +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../invalid_key_exception.dart'; +import 'local_storage_protocol.pb.dart'; + +class PreKeyRecord { + PreKeyRecord(int id, ECKeyPair keyPair) { + _structure = PreKeyRecordStructure.create() + ..id = id + ..publicKey = keyPair.publicKey.serialize() + ..privateKey = keyPair.privateKey.serialize() + ..toBuilder(); + } + + PreKeyRecord.fromBuffer(Uint8List serialized) { + _structure = PreKeyRecordStructure.fromBuffer(serialized); + } + + late PreKeyRecordStructure _structure; + + int get id => _structure.id; + + ECKeyPair getKeyPair() { + try { + final publicKey = + Curve.decodePoint(Uint8List.fromList(_structure.publicKey), 0); + final privateKey = + Curve.decodePrivatePoint(Uint8List.fromList(_structure.privateKey)); + return ECKeyPair(publicKey, privateKey); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + Uint8List serialize() => _structure.writeToBuffer(); +} diff --git a/libsignal_protocol_dart/lib/src/state/pre_key_store.dart b/libsignal_protocol_dart/lib/src/state/pre_key_store.dart new file mode 100644 index 0000000..b88c78f --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/pre_key_store.dart @@ -0,0 +1,12 @@ +import 'pre_key_record.dart'; + +abstract mixin class PreKeyStore { + Future loadPreKey( + int preKeyId); // throws InvalidKeyIdException; + + Future storePreKey(int preKeyId, PreKeyRecord record); + + Future containsPreKey(int preKeyId); + + Future removePreKey(int preKeyId); +} diff --git a/libsignal_protocol_dart/lib/src/state/session_record.dart b/libsignal_protocol_dart/lib/src/state/session_record.dart new file mode 100644 index 0000000..6f0694c --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/session_record.dart @@ -0,0 +1,86 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import '../eq.dart'; +import 'local_storage_protocol.pb.dart'; +import 'session_state.dart'; + +class SessionRecord { + SessionRecord() { + _fresh = true; + } + + SessionRecord.fromSessionState(SessionState sessionState) { + _sessionState = sessionState; + _fresh = false; + } + + SessionRecord.fromSerialized(Uint8List serialized) { + final record = RecordStructure.fromBuffer(serialized); + _sessionState = SessionState.fromStructure(record.currentSession); + _fresh = false; + + for (final previousStructure in record.previousSessions) { + _previousStates.add(SessionState.fromStructure(previousStructure)); + } + } + + static const int archivedStatesMaxLength = 40; + var _sessionState = SessionState(); + final _previousStates = LinkedList(); + bool _fresh = false; + + bool hasSessionState(int version, Uint8List aliceBaseKey) { + if (_sessionState.getSessionVersion() == version && + eq(aliceBaseKey, _sessionState.aliceBaseKey)) { + return true; + } + + for (final state in _previousStates) { + if (state.getSessionVersion() == version && + eq(aliceBaseKey, _sessionState.aliceBaseKey)) { + return true; + } + } + return false; + } + + SessionState get sessionState => _sessionState; + + LinkedList get previousSessionStates => _previousStates; + + void removePreviousSessionStates() { + _previousStates.clear(); + } + + bool isFresh() => _fresh; + + void archiveCurrentState() { + promoteState(SessionState()); + } + + void promoteState(SessionState promotedState) { + _previousStates.addFirst(_sessionState); + _sessionState = promotedState; + + if (_previousStates.length > archivedStatesMaxLength) { + _previousStates.remove(_previousStates.last); + } + } + + set state(SessionState sessionState) { + _sessionState = sessionState; + } + + Uint8List serialize() { + final previousStructures = []; + for (final previousState in _previousStates) { + previousStructures.add(previousState.structure); + } + final record = RecordStructure.create() + ..currentSession = _sessionState.structure + ..previousSessions.addAll(previousStructures); + + return record.toBuilder().writeToBuffer(); + } +} diff --git a/libsignal_protocol_dart/lib/src/state/session_state.dart b/libsignal_protocol_dart/lib/src/state/session_state.dart new file mode 100644 index 0000000..f5f7a4a --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/session_state.dart @@ -0,0 +1,399 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import 'package:optional/optional.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../ecc/ec_public_key.dart'; +import '../entry.dart'; +import '../eq.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; +import '../invalid_key_exception.dart'; +import '../kdf/hkdf.dart'; +import '../ratchet/chain_key.dart'; +import '../ratchet/message_keys.dart'; +import '../ratchet/root_key.dart'; +import '../util/log.dart' as $log; +import 'local_storage_protocol.pb.dart'; + +base class SessionState extends LinkedListEntry { + SessionState() { + _sessionStructure = SessionStructure.create(); + } + + SessionState.fromStructure(SessionStructure sessionStructure) { + _sessionStructure = sessionStructure; + } + + SessionState.fromSessionState(SessionState copy) { + _sessionStructure = copy.structure; + } + + static const int maxMessageKeys = 2000; + + late SessionStructure _sessionStructure; + + SessionStructure get structure => _sessionStructure; + + Uint8List get aliceBaseKey => + Uint8List.fromList(_sessionStructure.aliceBaseKey); + + set aliceBaseKey(Uint8List aliceBaseKey) { + _sessionStructure.aliceBaseKey = aliceBaseKey; + } + + set sessionVersion(int version) => _sessionStructure.sessionVersion = version; + + int getSessionVersion() { + final sessionVersion = _sessionStructure.sessionVersion; + if (sessionVersion == 0) { + return 2; + } else { + return sessionVersion; + } + } + + set remoteIdentityKey(IdentityKey identityKey) => + _sessionStructure.remoteIdentityPublic = identityKey.serialize(); + + set localIdentityKey(IdentityKey identityKey) => + _sessionStructure.localIdentityPublic = identityKey.serialize(); + + IdentityKey? getRemoteIdentityKey() { + try { + if (!_sessionStructure.hasRemoteIdentityPublic()) { + return null; + } + return IdentityKey.fromBytes( + Uint8List.fromList(_sessionStructure.remoteIdentityPublic), 0); + } on InvalidKeyException catch (e) { + $log.log(e); + return null; + } + } + + IdentityKey getLocalIdentityKey() { + try { + return IdentityKey.fromBytes( + Uint8List.fromList(_sessionStructure.localIdentityPublic), 0); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + int get previousCounter => _sessionStructure.previousCounter; + + set previousCounter(int previousCounter) => + _sessionStructure.previousCounter = previousCounter; + + RootKey getRootKey() => RootKey(HKDF.createFor(getSessionVersion()), + Uint8List.fromList(_sessionStructure.rootKey)); + + set rootKey(RootKey rootKey) => + _sessionStructure.rootKey = rootKey.getKeyBytes(); + + ECPublicKey getSenderRatchetKey() { + try { + return Curve.decodePoint( + Uint8List.fromList(_sessionStructure.senderChain.senderRatchetKey), + 0); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + ECKeyPair getSenderRatchetKeyPair() { + final publicKey = getSenderRatchetKey(); + final privateKey = Curve.decodePrivatePoint(Uint8List.fromList( + _sessionStructure.senderChain.senderRatchetKeyPrivate)); + return ECKeyPair(publicKey, privateKey); + } + + bool hasReceiverChain(ECPublicKey senderEphemeral) => + _getReceiverChain(senderEphemeral) != null; + + bool hasSenderChain() => _sessionStructure.hasSenderChain(); + + (SessionStructureChain, int)? _getReceiverChain(ECPublicKey senderEphemeral) { + final receiverChains = _sessionStructure.receiverChains; + var index = 0; + + for (final receiverChain in receiverChains) { + try { + final chainSenderRatchetKey = Curve.decodePoint( + Uint8List.fromList(receiverChain.senderRatchetKey), 0); + + if (eq( + chainSenderRatchetKey.serialize(), senderEphemeral.serialize())) { + return (receiverChain, index); + } + } on InvalidKeyException catch (e) { + $log.log(e); + } + index++; + } + + return null; + } + + ChainKey? getReceiverChainKey(ECPublicKey senderEphemeral) { + final receiverChainAndIndex = _getReceiverChain(senderEphemeral); + final receiverChain = receiverChainAndIndex?.$1; + + if (receiverChain == null) { + return null; + } else { + return ChainKey( + HKDF.createFor(getSessionVersion()), + Uint8List.fromList(receiverChain.chainKey.key), + receiverChain.chainKey.index); + } + } + + void addReceiverChain(ECPublicKey senderRatchetKey, ChainKey chainKey) { + final chainKeyStructure = SessionStructureChainChainKey.create() + ..key = chainKey.key; + + final chain = SessionStructureChain.create() + ..chainKey = chainKeyStructure + ..senderRatchetKey = senderRatchetKey.serialize(); + + _sessionStructure.receiverChains.add(chain); + + if (_sessionStructure.receiverChains.length > 5) { + _sessionStructure.receiverChains.removeAt(0); + } + } + + void setSenderChain(ECKeyPair senderRatchetKeyPair, ChainKey chainKey) { + final chainKeyStructure = SessionStructureChainChainKey.create() + ..key = chainKey.key + ..index = chainKey.index; + + final senderChain = SessionStructureChain.create() + ..senderRatchetKey = senderRatchetKeyPair.publicKey.serialize() + ..senderRatchetKeyPrivate = senderRatchetKeyPair.privateKey.serialize() + ..chainKey = chainKeyStructure; + _sessionStructure.senderChain = senderChain; + } + + ChainKey getSenderChainKey() { + final chainKeyStructure = _sessionStructure.senderChain.chainKey; + return ChainKey(HKDF.createFor(getSessionVersion()), + Uint8List.fromList(chainKeyStructure.key), chainKeyStructure.index); + } + + void setSenderChainKey(ChainKey nextChainKey) { + final chainKey = SessionStructureChainChainKey.create() + ..key = nextChainKey.key + ..index = nextChainKey.index; + + _sessionStructure.senderChain.chainKey = chainKey; + } + + bool hasMessageKeys(ECPublicKey senderEphemeral, int counter) { + final chainAndIndex = _getReceiverChain(senderEphemeral); + if (chainAndIndex == null) { + return false; + } + final chain = chainAndIndex.$1; + + final messageKeyList = chain.messageKeys; + for (final messageKey in messageKeyList) { + if (messageKey.index == counter) { + return true; + } + } + return false; + } + + MessageKeys? removeMessageKeys(ECPublicKey senderEphemeral, int counter) { + final chainAndIndex = _getReceiverChain(senderEphemeral); + if (chainAndIndex == null) { + return null; + } + final chain = chainAndIndex.$1; + + final messageKeyList = LinkedList>(); + chain.messageKeys.forEach((element) { + messageKeyList.add(Entry(element)); + }); + final messageKeyIterator = messageKeyList.iterator; + MessageKeys? result; + while (messageKeyIterator.moveNext()) { + final entry = messageKeyIterator.current; + final messageKey = entry.value; + if (messageKey.index == counter) { + final cipherKey = Uint8List.fromList(messageKey.cipherKey); + final macKey = Uint8List.fromList(messageKey.macKey); + final iv = Uint8List.fromList(messageKey.iv); + final index = messageKey.index; + result = MessageKeys(cipherKey, macKey, iv, index); + + messageKeyList.remove(entry); + break; + } + } + + chain.messageKeys.clear(); + messageKeyList.forEach((entry) { + chain.messageKeys.add(entry.value); + }); + + _sessionStructure.receiverChains + .setAll(chainAndIndex.$2, [chain]); + return result; + } + + void setMessageKeys(ECPublicKey senderEphemeral, MessageKeys messageKeys) { + final chainAndIndex = _getReceiverChain(senderEphemeral); + if (chainAndIndex == null) { + return; + } + final chain = chainAndIndex.$1; + final messageKeyStructure = SessionStructureChainMessageKey.create() + ..cipherKey = Uint8List.fromList(messageKeys.getCipherKey()) + ..macKey = Uint8List.fromList(messageKeys.getMacKey()) + ..index = messageKeys.getCounter() + ..iv = Uint8List.fromList(messageKeys.getIv()); + + chain.messageKeys.add(messageKeyStructure); + + if (chain.messageKeys.length > maxMessageKeys) { + chain.messageKeys.removeAt(0); + } + + _sessionStructure.receiverChains + .setAll(chainAndIndex.$2, [chain]); + } + + void setReceiverChainKey(ECPublicKey senderEphemeral, ChainKey chainKey) { + final chainAndIndex = _getReceiverChain(senderEphemeral); + final chain = chainAndIndex!.$1; + + final chainKeyStructure = SessionStructureChainChainKey.create() + ..key = chainKey.key + ..index = chainKey.index; + + chain.chainKey = chainKeyStructure; + _sessionStructure.receiverChains + .setAll(chainAndIndex.$2, [chain]); + } + + void setPendingKeyExchange(int sequence, ECKeyPair ourBaseKey, + ECKeyPair ourRatchetKey, IdentityKeyPair ourIdentityKey) { + final structure = SessionStructurePendingKeyExchange.create() + ..sequence = sequence + ..localBaseKey = ourBaseKey.publicKey.serialize() + ..localBaseKeyPrivate = ourBaseKey.privateKey.serialize() + ..localRatchetKey = ourRatchetKey.publicKey.serialize() + ..localRatchetKeyPrivate = ourRatchetKey.privateKey.serialize() + ..localIdentityKey = ourIdentityKey.getPublicKey().serialize() + ..localIdentityKeyPrivate = ourIdentityKey.getPrivateKey().serialize(); + + _sessionStructure.pendingKeyExchange = structure; + } + + int getPendingKeyExchangeSequence() => + _sessionStructure.pendingKeyExchange.sequence; + + ECKeyPair getPendingKeyExchangeBaseKey() { + final publicKey = Curve.decodePoint( + Uint8List.fromList(_sessionStructure.pendingKeyExchange.localBaseKey), + 0); + + final privateKey = Curve.decodePrivatePoint(Uint8List.fromList( + _sessionStructure.pendingKeyExchange.localBaseKeyPrivate)); + + return ECKeyPair(publicKey, privateKey); + } + + ECKeyPair getPendingKeyExchangeRatchetKey() { + final publicKey = Curve.decodePointList( + _sessionStructure.pendingKeyExchange.localRatchetKey, 0); + + final privateKey = Curve.decodePrivatePoint(Uint8List.fromList( + _sessionStructure.pendingKeyExchange.localRatchetKeyPrivate)); + + return ECKeyPair(publicKey, privateKey); + } + + IdentityKeyPair getPendingKeyExchangeIdentityKey() { + final publicKey = IdentityKey.fromBytes( + Uint8List.fromList( + _sessionStructure.pendingKeyExchange.localIdentityKey), + 0); + final privateKey = Curve.decodePrivatePoint(Uint8List.fromList( + _sessionStructure.pendingKeyExchange.localIdentityKeyPrivate)); + return IdentityKeyPair(publicKey, privateKey); + } + + bool hasPendingKeyExchange() => _sessionStructure.hasPendingKeyExchange(); + + void setUnacknowledgedPreKeyMessage( + Optional preKeyId, int signedPreKeyId, ECPublicKey baseKey) { + final pending = SessionStructurePendingPreKey.create() + ..signedPreKeyId = signedPreKeyId + ..baseKey = baseKey.serialize(); + + if (preKeyId.isPresent) { + pending.preKeyId = preKeyId.value; + } + + _sessionStructure.pendingPreKey = pending; + } + + bool hasUnacknowledgedPreKeyMessage() => _sessionStructure.hasPendingPreKey(); + + UnacknowledgedPreKeyMessageItems getUnacknowledgedPreKeyMessageItems() { + try { + Optional preKeyId; + + if (_sessionStructure.pendingPreKey.hasPreKeyId()) { + preKeyId = Optional.of(_sessionStructure.pendingPreKey.preKeyId); + } else { + preKeyId = const Optional.empty(); + } + + return UnacknowledgedPreKeyMessageItems( + preKeyId, + _sessionStructure.pendingPreKey.signedPreKeyId, + Curve.decodePointList(_sessionStructure.pendingPreKey.baseKey, 0)); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + void clearUnacknowledgedPreKeyMessage() { + _sessionStructure.clearPendingPreKey(); + } + + set remoteRegistrationId(int registrationId) => + _sessionStructure..remoteRegistrationId = registrationId; + + int get remoteRegistrationId => _sessionStructure.remoteRegistrationId; + + set localRegistrationId(int registrationId) => + _sessionStructure.localRegistrationId = registrationId; + + int get localRegistrationId => _sessionStructure.localRegistrationId; + + Uint8List serialize() => _sessionStructure.writeToBuffer(); +} + +class UnacknowledgedPreKeyMessageItems { + UnacknowledgedPreKeyMessageItems( + this._preKeyId, this._signedPreKeyId, this._baseKey); + + final Optional _preKeyId; + final int _signedPreKeyId; + final ECPublicKey _baseKey; + + Optional getPreKeyId() => _preKeyId; + + int getSignedPreKeyId() => _signedPreKeyId; + + ECPublicKey getBaseKey() => _baseKey; +} diff --git a/libsignal_protocol_dart/lib/src/state/session_store.dart b/libsignal_protocol_dart/lib/src/state/session_store.dart new file mode 100644 index 0000000..dce4ee8 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/session_store.dart @@ -0,0 +1,18 @@ +import '../signal_protocol_address.dart'; + +import 'session_record.dart'; + +abstract mixin class SessionStore { + Future loadSession(SignalProtocolAddress address); + + Future> getSubDeviceSessions(String name); + + Future storeSession( + SignalProtocolAddress address, SessionRecord record); + + Future containsSession(SignalProtocolAddress address); + + Future deleteSession(SignalProtocolAddress address); + + Future deleteAllSessions(String name); +} diff --git a/libsignal_protocol_dart/lib/src/state/signal_protocol_store.dart b/libsignal_protocol_dart/lib/src/state/signal_protocol_store.dart new file mode 100644 index 0000000..ad8312d --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/signal_protocol_store.dart @@ -0,0 +1,7 @@ +import 'identity_key_store.dart'; +import 'pre_key_store.dart'; +import 'session_store.dart'; +import 'signed_pre_key_store.dart'; + +abstract class SignalProtocolStore extends IdentityKeyStore + with PreKeyStore, SessionStore, SignedPreKeyStore {} diff --git a/libsignal_protocol_dart/lib/src/state/signed_pre_key_record.dart b/libsignal_protocol_dart/lib/src/state/signed_pre_key_record.dart new file mode 100644 index 0000000..50e68cc --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/signed_pre_key_record.dart @@ -0,0 +1,45 @@ +import 'dart:typed_data'; + +import 'package:fixnum/fixnum.dart'; +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../invalid_key_exception.dart'; +import 'local_storage_protocol.pb.dart'; + +class SignedPreKeyRecord { + SignedPreKeyRecord( + int id, Int64 timestamp, ECKeyPair keyPair, Uint8List signature) { + _structure = SignedPreKeyRecordStructure.create() + ..id = id + ..timestamp = timestamp + ..publicKey = keyPair.publicKey.serialize() + ..privateKey = keyPair.privateKey.serialize() + ..signature = signature; + } + + SignedPreKeyRecord.fromSerialized(Uint8List serialized) { + _structure = SignedPreKeyRecordStructure.fromBuffer(serialized); + } + + late SignedPreKeyRecordStructure _structure; + + int get id => _structure.id; + + Int64 get timestamp => _structure.timestamp; + + ECKeyPair getKeyPair() { + try { + final publicKey = Curve.decodePointList(_structure.publicKey, 0); + final privateKey = + Curve.decodePrivatePoint(Uint8List.fromList(_structure.privateKey)); + + return ECKeyPair(publicKey, privateKey); + } on InvalidKeyException catch (e) { + throw AssertionError(e); + } + } + + Uint8List get signature => Uint8List.fromList(_structure.signature); + + Uint8List serialize() => _structure.writeToBuffer(); +} diff --git a/libsignal_protocol_dart/lib/src/state/signed_pre_key_store.dart b/libsignal_protocol_dart/lib/src/state/signed_pre_key_store.dart new file mode 100644 index 0000000..2374e9e --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/signed_pre_key_store.dart @@ -0,0 +1,15 @@ +import 'signed_pre_key_record.dart'; + +abstract mixin class SignedPreKeyStore { + Future loadSignedPreKey( + int signedPreKeyId, + ); //throws InvalidKeyIdException; + + Future> loadSignedPreKeys(); + + Future storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record); + + Future containsSignedPreKey(int signedPreKeyId); + + Future removeSignedPreKey(int signedPreKeyId); +} diff --git a/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pb.dart b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pb.dart new file mode 100644 index 0000000..4dfedc0 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pb.dart @@ -0,0 +1,956 @@ +import 'dart:core' as $core; +import 'dart:core'; + +import 'package:protobuf/protobuf.dart' as $pb; + +class SignalMessage extends $pb.GeneratedMessage { + factory SignalMessage({ + $core.List<$core.int>? ratchetKey, + $core.int? counter, + $core.int? previousCounter, + $core.List<$core.int>? ciphertext, + }) { + final _result = create(); + if (ratchetKey != null) { + _result.ratchetKey = ratchetKey; + } + if (counter != null) { + _result.counter = counter; + } + if (previousCounter != null) { + _result.previousCounter = previousCounter; + } + if (ciphertext != null) { + _result.ciphertext = ciphertext; + } + return _result; + } + + SignalMessage._() : super(); + + factory SignalMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SignalMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SignalMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'ratchetKey', + $pb.PbFieldType.OY, + protoName: 'ratchetKey') + ..a<$core.int>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'counter', + $pb.PbFieldType.OU3) + ..a<$core.int>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'previousCounter', + $pb.PbFieldType.OU3, + protoName: 'previousCounter') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'ciphertext', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SignalMessage clone() => SignalMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SignalMessage copyWith(void Function(SignalMessage) updates) => + super.copyWith((message) => updates(message as SignalMessage)) + as SignalMessage; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SignalMessage create() => SignalMessage._(); + + @override + SignalMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SignalMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SignalMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get ratchetKey => $_getN(0); + + @$pb.TagNumber(1) + set ratchetKey($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasRatchetKey() => $_has(0); + + @$pb.TagNumber(1) + void clearRatchetKey() => clearField(1); + + @$pb.TagNumber(2) + $core.int get counter => $_getIZ(1); + + @$pb.TagNumber(2) + set counter($core.int v) { + $_setUnsignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasCounter() => $_has(1); + + @$pb.TagNumber(2) + void clearCounter() => clearField(2); + + @$pb.TagNumber(3) + $core.int get previousCounter => $_getIZ(2); + + @$pb.TagNumber(3) + set previousCounter($core.int v) { + $_setUnsignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPreviousCounter() => $_has(2); + + @$pb.TagNumber(3) + void clearPreviousCounter() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get ciphertext => $_getN(3); + + @$pb.TagNumber(4) + set ciphertext($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasCiphertext() => $_has(3); + + @$pb.TagNumber(4) + void clearCiphertext() => clearField(4); +} + +class PreKeySignalMessage extends $pb.GeneratedMessage { + factory PreKeySignalMessage({ + $core.int? preKeyId, + $core.List<$core.int>? baseKey, + $core.List<$core.int>? identityKey, + $core.List<$core.int>? message, + $core.int? registrationId, + $core.int? signedPreKeyId, + }) { + final _result = create(); + if (preKeyId != null) { + _result.preKeyId = preKeyId; + } + if (baseKey != null) { + _result.baseKey = baseKey; + } + if (identityKey != null) { + _result.identityKey = identityKey; + } + if (message != null) { + _result.message = message; + } + if (registrationId != null) { + _result.registrationId = registrationId; + } + if (signedPreKeyId != null) { + _result.signedPreKeyId = signedPreKeyId; + } + return _result; + } + + PreKeySignalMessage._() : super(); + + factory PreKeySignalMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory PreKeySignalMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'PreKeySignalMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'preKeyId', + $pb.PbFieldType.OU3, + protoName: 'preKeyId') + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'baseKey', + $pb.PbFieldType.OY, + protoName: 'baseKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'identityKey', + $pb.PbFieldType.OY, + protoName: 'identityKey') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'message', + $pb.PbFieldType.OY) + ..a<$core.int>( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'registrationId', + $pb.PbFieldType.OU3, + protoName: 'registrationId') + ..a<$core.int>( + 6, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'signedPreKeyId', + $pb.PbFieldType.OU3, + protoName: 'signedPreKeyId') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + PreKeySignalMessage clone() => PreKeySignalMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + PreKeySignalMessage copyWith(void Function(PreKeySignalMessage) updates) => + super.copyWith((message) => updates(message as PreKeySignalMessage)) + as PreKeySignalMessage; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PreKeySignalMessage create() => PreKeySignalMessage._(); + + @override + PreKeySignalMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static PreKeySignalMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PreKeySignalMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get preKeyId => $_getIZ(0); + + @$pb.TagNumber(1) + set preKeyId($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasPreKeyId() => $_has(0); + + @$pb.TagNumber(1) + void clearPreKeyId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get baseKey => $_getN(1); + + @$pb.TagNumber(2) + set baseKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasBaseKey() => $_has(1); + + @$pb.TagNumber(2) + void clearBaseKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get identityKey => $_getN(2); + + @$pb.TagNumber(3) + set identityKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasIdentityKey() => $_has(2); + + @$pb.TagNumber(3) + void clearIdentityKey() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get message => $_getN(3); + + @$pb.TagNumber(4) + set message($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasMessage() => $_has(3); + + @$pb.TagNumber(4) + void clearMessage() => clearField(4); + + @$pb.TagNumber(5) + $core.int get registrationId => $_getIZ(4); + + @$pb.TagNumber(5) + set registrationId($core.int v) { + $_setUnsignedInt32(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasRegistrationId() => $_has(4); + + @$pb.TagNumber(5) + void clearRegistrationId() => clearField(5); + + @$pb.TagNumber(6) + $core.int get signedPreKeyId => $_getIZ(5); + + @$pb.TagNumber(6) + set signedPreKeyId($core.int v) { + $_setUnsignedInt32(5, v); + } + + @$pb.TagNumber(6) + $core.bool hasSignedPreKeyId() => $_has(5); + + @$pb.TagNumber(6) + void clearSignedPreKeyId() => clearField(6); +} + +class KeyExchangeMessage extends $pb.GeneratedMessage { + factory KeyExchangeMessage({ + $core.int? id, + $core.List<$core.int>? baseKey, + $core.List<$core.int>? ratchetKey, + $core.List<$core.int>? identityKey, + $core.List<$core.int>? baseKeySignature, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (baseKey != null) { + _result.baseKey = baseKey; + } + if (ratchetKey != null) { + _result.ratchetKey = ratchetKey; + } + if (identityKey != null) { + _result.identityKey = identityKey; + } + if (baseKeySignature != null) { + _result.baseKeySignature = baseKeySignature; + } + return _result; + } + + KeyExchangeMessage._() : super(); + + factory KeyExchangeMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory KeyExchangeMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'KeyExchangeMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'id', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'baseKey', + $pb.PbFieldType.OY, + protoName: 'baseKey') + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'ratchetKey', + $pb.PbFieldType.OY, + protoName: 'ratchetKey') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'identityKey', + $pb.PbFieldType.OY, + protoName: 'identityKey') + ..a<$core.List<$core.int>>( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'baseKeySignature', + $pb.PbFieldType.OY, + protoName: 'baseKeySignature') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + KeyExchangeMessage clone() => KeyExchangeMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + KeyExchangeMessage copyWith(void Function(KeyExchangeMessage) updates) => + super.copyWith((message) => updates(message as KeyExchangeMessage)) + as KeyExchangeMessage; // ignore: deprecated_member_use + + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KeyExchangeMessage create() => KeyExchangeMessage._(); + + @override + KeyExchangeMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static KeyExchangeMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KeyExchangeMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + + @$pb.TagNumber(1) + set id($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get baseKey => $_getN(1); + + @$pb.TagNumber(2) + set baseKey($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasBaseKey() => $_has(1); + + @$pb.TagNumber(2) + void clearBaseKey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get ratchetKey => $_getN(2); + + @$pb.TagNumber(3) + set ratchetKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasRatchetKey() => $_has(2); + + @$pb.TagNumber(3) + void clearRatchetKey() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get identityKey => $_getN(3); + + @$pb.TagNumber(4) + set identityKey($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasIdentityKey() => $_has(3); + + @$pb.TagNumber(4) + void clearIdentityKey() => clearField(4); + + @$pb.TagNumber(5) + $core.List<$core.int> get baseKeySignature => $_getN(4); + + @$pb.TagNumber(5) + set baseKeySignature($core.List<$core.int> v) { + $_setBytes(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasBaseKeySignature() => $_has(4); + + @$pb.TagNumber(5) + void clearBaseKeySignature() => clearField(5); +} + +class SenderKeyMessage extends $pb.GeneratedMessage { + factory SenderKeyMessage({ + $core.int? id, + $core.int? iteration, + $core.List<$core.int>? ciphertext, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (iteration != null) { + _result.iteration = iteration; + } + if (ciphertext != null) { + _result.ciphertext = ciphertext; + } + return _result; + } + + SenderKeyMessage._() : super(); + + factory SenderKeyMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'id', + $pb.PbFieldType.OU3) + ..a<$core.int>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'iteration', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'ciphertext', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyMessage clone() => SenderKeyMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyMessage copyWith(void Function(SenderKeyMessage) updates) => + super.copyWith((message) => updates(message as SenderKeyMessage)) + as SenderKeyMessage; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyMessage create() => SenderKeyMessage._(); + + @override + SenderKeyMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SenderKeyMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + + @$pb.TagNumber(1) + set id($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get iteration => $_getIZ(1); + + @$pb.TagNumber(2) + set iteration($core.int v) { + $_setUnsignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasIteration() => $_has(1); + + @$pb.TagNumber(2) + void clearIteration() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get ciphertext => $_getN(2); + + @$pb.TagNumber(3) + set ciphertext($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasCiphertext() => $_has(2); + + @$pb.TagNumber(3) + void clearCiphertext() => clearField(3); +} + +class SenderKeyDistributionMessage extends $pb.GeneratedMessage { + factory SenderKeyDistributionMessage({ + $core.int? id, + $core.int? iteration, + $core.List<$core.int>? chainKey, + $core.List<$core.int>? signingKey, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (iteration != null) { + _result.iteration = iteration; + } + if (chainKey != null) { + _result.chainKey = chainKey; + } + if (signingKey != null) { + _result.signingKey = signingKey; + } + return _result; + } + + SenderKeyDistributionMessage._() : super(); + + factory SenderKeyDistributionMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory SenderKeyDistributionMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'SenderKeyDistributionMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'id', + $pb.PbFieldType.OU3) + ..a<$core.int>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'iteration', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'chainKey', + $pb.PbFieldType.OY, + protoName: 'chainKey') + ..a<$core.List<$core.int>>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'signingKey', + $pb.PbFieldType.OY, + protoName: 'signingKey') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + SenderKeyDistributionMessage clone() => + SenderKeyDistributionMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + SenderKeyDistributionMessage copyWith( + void Function(SenderKeyDistributionMessage) updates) => + super.copyWith( + (message) => updates(message as SenderKeyDistributionMessage)) + as SenderKeyDistributionMessage; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SenderKeyDistributionMessage create() => + SenderKeyDistributionMessage._(); + + @override + SenderKeyDistributionMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static SenderKeyDistributionMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SenderKeyDistributionMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + + @$pb.TagNumber(1) + set id($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get iteration => $_getIZ(1); + + @$pb.TagNumber(2) + set iteration($core.int v) { + $_setUnsignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasIteration() => $_has(1); + + @$pb.TagNumber(2) + void clearIteration() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get chainKey => $_getN(2); + + @$pb.TagNumber(3) + set chainKey($core.List<$core.int> v) { + $_setBytes(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasChainKey() => $_has(2); + + @$pb.TagNumber(3) + void clearChainKey() => clearField(3); + + @$pb.TagNumber(4) + $core.List<$core.int> get signingKey => $_getN(3); + + @$pb.TagNumber(4) + set signingKey($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasSigningKey() => $_has(3); + + @$pb.TagNumber(4) + void clearSigningKey() => clearField(4); +} + +class DeviceConsistencyCodeMessage extends $pb.GeneratedMessage { + factory DeviceConsistencyCodeMessage({ + $core.int? generation, + $core.List<$core.int>? signature, + }) { + final _result = create(); + if (generation != null) { + _result.generation = generation; + } + if (signature != null) { + _result.signature = signature; + } + return _result; + } + + DeviceConsistencyCodeMessage._() : super(); + + factory DeviceConsistencyCodeMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + + factory DeviceConsistencyCodeMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'DeviceConsistencyCodeMessage', + package: const $pb.PackageName( + $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'textsecure'), + createEmptyInstance: create) + ..a<$core.int>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'generation', + $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') + ? '' + : 'signature', + $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + @override + DeviceConsistencyCodeMessage clone() => + DeviceConsistencyCodeMessage()..mergeFromMessage(this); + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + @override + DeviceConsistencyCodeMessage copyWith( + void Function(DeviceConsistencyCodeMessage) updates) => + super.copyWith( + (message) => updates(message as DeviceConsistencyCodeMessage)) + as DeviceConsistencyCodeMessage; // ignore: deprecated_member_use + @override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeviceConsistencyCodeMessage create() => + DeviceConsistencyCodeMessage._(); + + @override + DeviceConsistencyCodeMessage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => + $pb.PbList(); + + @$core.pragma('dart2js:noInline') + static DeviceConsistencyCodeMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeviceConsistencyCodeMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get generation => $_getIZ(0); + + @$pb.TagNumber(1) + set generation($core.int v) { + $_setUnsignedInt32(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasGeneration() => $_has(0); + + @$pb.TagNumber(1) + void clearGeneration() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get signature => $_getN(1); + + @$pb.TagNumber(2) + set signature($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSignature() => $_has(1); + + @$pb.TagNumber(2) + void clearSignature() => clearField(2); +} diff --git a/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbenum.dart b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbenum.dart new file mode 100644 index 0000000..74caa45 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbenum.dart @@ -0,0 +1,5 @@ +// Generated code. Do not modify. +// source: WhisperTextProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields diff --git a/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbjson.dart b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbjson.dart new file mode 100644 index 0000000..18ccbc3 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbjson.dart @@ -0,0 +1,96 @@ +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use signalMessageDescriptor instead') +const signalMessage$json = { + '1': 'SignalMessage', + '2': [ + {'1': 'ratchetKey', '3': 1, '4': 1, '5': 12, '10': 'ratchetKey'}, + {'1': 'counter', '3': 2, '4': 1, '5': 13, '10': 'counter'}, + {'1': 'previousCounter', '3': 3, '4': 1, '5': 13, '10': 'previousCounter'}, + {'1': 'ciphertext', '3': 4, '4': 1, '5': 12, '10': 'ciphertext'}, + ], +}; + +/// Descriptor for `SignalMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List signalMessageDescriptor = $convert.base64Decode( + 'Cg1TaWduYWxNZXNzYWdlEh4KCnJhdGNoZXRLZXkYASABKAxSCnJhdGNoZXRLZXkSGAoHY291bnRlchgCIAEoDVIHY291bnRlchIoCg9wcmV2aW91c0NvdW50ZXIYAyABKA1SD3ByZXZpb3VzQ291bnRlchIeCgpjaXBoZXJ0ZXh0GAQgASgMUgpjaXBoZXJ0ZXh0'); +@$core.Deprecated('Use preKeySignalMessageDescriptor instead') +const preKeySignalMessage$json = { + '1': 'PreKeySignalMessage', + '2': [ + {'1': 'registrationId', '3': 5, '4': 1, '5': 13, '10': 'registrationId'}, + {'1': 'preKeyId', '3': 1, '4': 1, '5': 13, '10': 'preKeyId'}, + {'1': 'signedPreKeyId', '3': 6, '4': 1, '5': 13, '10': 'signedPreKeyId'}, + {'1': 'baseKey', '3': 2, '4': 1, '5': 12, '10': 'baseKey'}, + {'1': 'identityKey', '3': 3, '4': 1, '5': 12, '10': 'identityKey'}, + {'1': 'message', '3': 4, '4': 1, '5': 12, '10': 'message'}, + ], +}; + +/// Descriptor for `PreKeySignalMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List preKeySignalMessageDescriptor = $convert.base64Decode( + 'ChNQcmVLZXlTaWduYWxNZXNzYWdlEiYKDnJlZ2lzdHJhdGlvbklkGAUgASgNUg5yZWdpc3RyYXRpb25JZBIaCghwcmVLZXlJZBgBIAEoDVIIcHJlS2V5SWQSJgoOc2lnbmVkUHJlS2V5SWQYBiABKA1SDnNpZ25lZFByZUtleUlkEhgKB2Jhc2VLZXkYAiABKAxSB2Jhc2VLZXkSIAoLaWRlbnRpdHlLZXkYAyABKAxSC2lkZW50aXR5S2V5EhgKB21lc3NhZ2UYBCABKAxSB21lc3NhZ2U='); +@$core.Deprecated('Use keyExchangeMessageDescriptor instead') +const keyExchangeMessage$json = { + '1': 'KeyExchangeMessage', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 13, '10': 'id'}, + {'1': 'baseKey', '3': 2, '4': 1, '5': 12, '10': 'baseKey'}, + {'1': 'ratchetKey', '3': 3, '4': 1, '5': 12, '10': 'ratchetKey'}, + {'1': 'identityKey', '3': 4, '4': 1, '5': 12, '10': 'identityKey'}, + { + '1': 'baseKeySignature', + '3': 5, + '4': 1, + '5': 12, + '10': 'baseKeySignature' + }, + ], +}; + +/// Descriptor for `KeyExchangeMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List keyExchangeMessageDescriptor = $convert.base64Decode( + 'ChJLZXlFeGNoYW5nZU1lc3NhZ2USDgoCaWQYASABKA1SAmlkEhgKB2Jhc2VLZXkYAiABKAxSB2Jhc2VLZXkSHgoKcmF0Y2hldEtleRgDIAEoDFIKcmF0Y2hldEtleRIgCgtpZGVudGl0eUtleRgEIAEoDFILaWRlbnRpdHlLZXkSKgoQYmFzZUtleVNpZ25hdHVyZRgFIAEoDFIQYmFzZUtleVNpZ25hdHVyZQ=='); +@$core.Deprecated('Use senderKeyMessageDescriptor instead') +const senderKeyMessage$json = { + '1': 'SenderKeyMessage', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 13, '10': 'id'}, + {'1': 'iteration', '3': 2, '4': 1, '5': 13, '10': 'iteration'}, + {'1': 'ciphertext', '3': 3, '4': 1, '5': 12, '10': 'ciphertext'}, + ], +}; + +/// Descriptor for `SenderKeyMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List senderKeyMessageDescriptor = $convert.base64Decode( + 'ChBTZW5kZXJLZXlNZXNzYWdlEg4KAmlkGAEgASgNUgJpZBIcCglpdGVyYXRpb24YAiABKA1SCWl0ZXJhdGlvbhIeCgpjaXBoZXJ0ZXh0GAMgASgMUgpjaXBoZXJ0ZXh0'); +@$core.Deprecated('Use senderKeyDistributionMessageDescriptor instead') +const senderKeyDistributionMessage$json = { + '1': 'SenderKeyDistributionMessage', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 13, '10': 'id'}, + {'1': 'iteration', '3': 2, '4': 1, '5': 13, '10': 'iteration'}, + {'1': 'chainKey', '3': 3, '4': 1, '5': 12, '10': 'chainKey'}, + {'1': 'signingKey', '3': 4, '4': 1, '5': 12, '10': 'signingKey'}, + ], +}; + +/// Descriptor for `SenderKeyDistributionMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List senderKeyDistributionMessageDescriptor = + $convert.base64Decode( + 'ChxTZW5kZXJLZXlEaXN0cmlidXRpb25NZXNzYWdlEg4KAmlkGAEgASgNUgJpZBIcCglpdGVyYXRpb24YAiABKA1SCWl0ZXJhdGlvbhIaCghjaGFpbktleRgDIAEoDFIIY2hhaW5LZXkSHgoKc2lnbmluZ0tleRgEIAEoDFIKc2lnbmluZ0tleQ=='); +@$core.Deprecated('Use deviceConsistencyCodeMessageDescriptor instead') +const deviceConsistencyCodeMessage$json = { + '1': 'DeviceConsistencyCodeMessage', + '2': [ + {'1': 'generation', '3': 1, '4': 1, '5': 13, '10': 'generation'}, + {'1': 'signature', '3': 2, '4': 1, '5': 12, '10': 'signature'}, + ], +}; + +/// Descriptor for `DeviceConsistencyCodeMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deviceConsistencyCodeMessageDescriptor = + $convert.base64Decode( + 'ChxEZXZpY2VDb25zaXN0ZW5jeUNvZGVNZXNzYWdlEh4KCmdlbmVyYXRpb24YASABKA1SCmdlbmVyYXRpb24SHAoJc2lnbmF0dXJlGAIgASgMUglzaWduYXR1cmU='); diff --git a/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbserver.dart b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbserver.dart new file mode 100644 index 0000000..1705a8b --- /dev/null +++ b/libsignal_protocol_dart/lib/src/state/whisper_text_protocol.pbserver.dart @@ -0,0 +1,7 @@ +// Generated code. Do not modify. +// source: WhisperTextProtocol.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'whisper_text_protocol.pb.dart'; diff --git a/libsignal_protocol_dart/lib/src/untrusted_identity_exception.dart b/libsignal_protocol_dart/lib/src/untrusted_identity_exception.dart new file mode 100644 index 0000000..702a6b1 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/untrusted_identity_exception.dart @@ -0,0 +1,8 @@ +import 'identity_key.dart'; + +class UntrustedIdentityException implements Exception { + UntrustedIdentityException(this.name, this.key); + + final String name; + final IdentityKey? key; +} diff --git a/libsignal_protocol_dart/lib/src/util/byte_util.dart b/libsignal_protocol_dart/lib/src/util/byte_util.dart new file mode 100644 index 0000000..8de40ac --- /dev/null +++ b/libsignal_protocol_dart/lib/src/util/byte_util.dart @@ -0,0 +1,87 @@ +import 'dart:typed_data'; + +import 'package:adaptive_number/adaptive_number.dart'; +import 'package:convert/convert.dart'; + +class ByteUtil { + static Uint8List combine(List elements) { + final results = []; + elements.forEach(results.addAll); + return Uint8List.fromList(results); + } + + static Uint8List shortToByteArray(int value) { + final bytes = Uint8List(2); + bytes[0] = value >> 8; + bytes[1] = value; + return bytes; + } + + static Uint8List intToByteArray(int value) { + final bytes = Uint8List(4); + bytes[0] = value >> 24; + bytes[1] = value >> 16; + bytes[2] = value >> 8; + bytes[3] = value; + return bytes; + } + + static Uint8List trim(Uint8List input, int length) => + input.sublist(0, length); + + static List splitTwo( + Uint8List input, int firstLength, int secondLength) { + final first = input.sublist(0, firstLength); + final second = input.sublist(firstLength, firstLength + secondLength); + return [first, second]; + } + + static List split( + Uint8List input, int firstLength, int secondLength, int thirdLength) { + if (firstLength < 0 || + secondLength < 0 || + thirdLength < 0 || + input.length < firstLength + secondLength + thirdLength) { + throw Exception('Input too small: ${hex.encode(input)}'); + } + final first = input.sublist(0, firstLength); + final second = input.sublist(firstLength, firstLength + secondLength); + final third = input.sublist( + firstLength + secondLength, firstLength + secondLength + thirdLength); + return [first, second, third]; + } + + static int intsToByteHighAndLow(int highValue, int lowValue) => + ((highValue << 4) | lowValue) & 0xFF; + + static int highBitsToInt(int value) => (value & 0xFF) >> 4; + + static int lowBitsToInt(int value) => value & 0xF; + + static int highBitsToMedium(int value) => value >> 12; + + static int lowBitsToMedium(int value) => value & 0xFFF; + + static int byteArray5ToLong(Uint8List bytes, int offset) { + final v1 = (Number(bytes[offset]) & Number(0xff)) << 32; + final v2 = (Number(bytes[offset + 1]) & Number(0xff)) << 24; + final v3 = (Number(bytes[offset + 2]) & Number(0xff)) << 16; + final v4 = (Number(bytes[offset + 3]) & Number(0xff)) << 8; + final v5 = Number(bytes[offset + 4]) & Number(0xff); + return (v1 | v2 | v3 | v4 | v5).intValue; + } + + static int compare(Uint8List left, Uint8List right) { + // ignore: parameter_assignments, avoid_multiple_declarations_per_line + for (var i = 0, j = 0; i < left.length && j < right.length; i++, j++) { + final a = left[i] & 0xff; + final b = right[j] & 0xff; + + if (a != b) { + return a - b; + } + } + + return left.length - right.length; + } +} diff --git a/libsignal_protocol_dart/lib/src/util/identity_key_comparator.dart b/libsignal_protocol_dart/lib/src/util/identity_key_comparator.dart new file mode 100644 index 0000000..dccd3af --- /dev/null +++ b/libsignal_protocol_dart/lib/src/util/identity_key_comparator.dart @@ -0,0 +1,5 @@ +import '../identity_key.dart'; +import 'byte_util.dart'; + +int identityKeyComparator(IdentityKey a, IdentityKey b) => + ByteUtil.compare(a.publicKey.serialize(), b.publicKey.serialize()); diff --git a/libsignal_protocol_dart/lib/src/util/key_helper.dart b/libsignal_protocol_dart/lib/src/util/key_helper.dart new file mode 100644 index 0000000..6ea8555 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/util/key_helper.dart @@ -0,0 +1,69 @@ +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:fixnum/fixnum.dart'; + +import '../ecc/curve.dart'; +import '../ecc/ec_key_pair.dart'; +import '../identity_key.dart'; +import '../identity_key_pair.dart'; +import '../state/pre_key_record.dart'; +import '../state/signed_pre_key_record.dart'; +import 'medium.dart'; + +IdentityKeyPair generateIdentityKeyPair() { + final keyPair = Curve.generateKeyPair(); + final publicKey = IdentityKey(keyPair.publicKey); + return IdentityKeyPair(publicKey, keyPair.privateKey); +} + +IdentityKeyPair generateIdentityKeyPairFromPrivate(List private) { + final keyPair = Curve.generateKeyPairFromPrivate(private); + final publicKey = IdentityKey(keyPair.publicKey); + return IdentityKeyPair(publicKey, keyPair.privateKey); +} + +int integerMax = 0x7fffffff; + +// ignore: avoid_positional_boolean_parameters +int generateRegistrationId(bool extendedRange) { + if (extendedRange) { + return _random.nextInt(integerMax - 1) + 1; + } else { + return _random.nextInt(16380) + 1; + } +} + +List generatePreKeys(int start, int count) { + final results = []; + // ignore: parameter_assignments + start--; + for (var i = 0; i < count; i++) { + results.add(PreKeyRecord( + ((start + i).remainder(maxValue - 1)) + 1, Curve.generateKeyPair())); + } + return results; +} + +SignedPreKeyRecord generateSignedPreKey( + IdentityKeyPair identityKeyPair, int signedPreKeyId) { + final keyPair = Curve.generateKeyPair(); + final signature = Curve.calculateSignature( + identityKeyPair.getPrivateKey(), keyPair.publicKey.serialize()); + + return SignedPreKeyRecord(signedPreKeyId, + Int64(DateTime.now().millisecondsSinceEpoch), keyPair, signature); +} + +ECKeyPair generateSenderSigningKey() => Curve.generateKeyPair(); + +Uint8List generateSenderKey() => generateRandomBytes(); + +int generateSenderKeyId() => _random.nextInt(integerMax); + +final Random _random = Random.secure(); + +Uint8List generateRandomBytes([int length = 32]) { + final values = List.generate(length, (i) => _random.nextInt(256)); + return Uint8List.fromList(values); +} diff --git a/libsignal_protocol_dart/lib/src/util/log.dart b/libsignal_protocol_dart/lib/src/util/log.dart new file mode 100644 index 0000000..1fb28a8 --- /dev/null +++ b/libsignal_protocol_dart/lib/src/util/log.dart @@ -0,0 +1,8 @@ +bool enabled = false; + +void log(Object? object) { + if (enabled) { + // ignore: avoid_print + print(object); + } +} diff --git a/libsignal_protocol_dart/lib/src/util/medium.dart b/libsignal_protocol_dart/lib/src/util/medium.dart new file mode 100644 index 0000000..95ce4df --- /dev/null +++ b/libsignal_protocol_dart/lib/src/util/medium.dart @@ -0,0 +1 @@ +const int maxValue = 0xFFFFFF; diff --git a/libsignal_protocol_dart/pubspec.yaml b/libsignal_protocol_dart/pubspec.yaml new file mode 100644 index 0000000..e039de7 --- /dev/null +++ b/libsignal_protocol_dart/pubspec.yaml @@ -0,0 +1,28 @@ +name: libsignal_protocol_dart +description: Signal Protocol libray for Dart native and Flutter, pure Dart implementation of the the Signal Protocol +version: 0.7.4 +repository: https://github.com/MixinNetwork/libsignal_protocol_dart +topics: + - crypto + +environment: + sdk: '>=3.4.0 <4.0.0' + + +dependencies: + adaptive_number: ^1.0.0 + collection: ^1.19.0 + convert: ^3.1.2 + crypto: ^3.0.6 + ed25519_edwards: ^0.3.1 + fixnum: ^1.1.1 + meta: ^1.16.0 + optional: ^6.1.0+1 + pointycastle: ^4.0.0 + protobuf: ^4.0.0 + x25519: ^0.1.1 + + +dev_dependencies: + test: ^1.25.8 + very_good_analysis: ^8.0.0 diff --git a/libsignal_protocol_dart/test/devices/device_consistency_test.dart b/libsignal_protocol_dart/test/devices/device_consistency_test.dart new file mode 100644 index 0000000..82622d9 --- /dev/null +++ b/libsignal_protocol_dart/test/devices/device_consistency_test.dart @@ -0,0 +1,86 @@ +import 'package:libsignal_protocol_dart/src/devices/device_consistency_code_generator.dart'; +import 'package:libsignal_protocol_dart/src/devices/device_consistency_commitment.dart'; +import 'package:libsignal_protocol_dart/src/devices/device_consistency_signature.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/protocol/device_consistency_message.dart'; +import 'package:libsignal_protocol_dart/src/util/key_helper.dart'; +import 'package:test/test.dart'; + +void main() { + String generateCode(DeviceConsistencyCommitment commitment, + List messages) { + final signatures = []; + for (final message in messages) { + signatures.add(message.signature); + } + return DeviceConsistencyCodeGenerator.generateFor(commitment, signatures); + } + + test('testDeviceConsistency', () { + final deviceOne = generateIdentityKeyPair(); + final deviceTwo = generateIdentityKeyPair(); + final deviceThree = generateIdentityKeyPair(); + + final keyList = [ + deviceOne.getPublicKey(), + deviceTwo.getPublicKey(), + deviceThree.getPublicKey() + ]..shuffle(); + final deviceOneCommitment = DeviceConsistencyCommitment(1, keyList); + + keyList.shuffle(); + final deviceTwoCommitment = DeviceConsistencyCommitment(1, keyList); + + keyList.shuffle(); + final deviceThreeCommitment = DeviceConsistencyCommitment(1, keyList); + + expect(deviceOneCommitment.serialized, deviceTwoCommitment.serialized); + expect(deviceTwoCommitment.serialized, deviceThreeCommitment.serialized); + + final deviceOneMessage = + DeviceConsistencyMessage(deviceOneCommitment, deviceOne); + final deviceTwoMessage = + DeviceConsistencyMessage(deviceOneCommitment, deviceTwo); + final deviceThreeMessage = + DeviceConsistencyMessage(deviceOneCommitment, deviceThree); + + final receivedDeviceOneMessage = DeviceConsistencyMessage.fromSerialized( + deviceOneCommitment, + deviceOneMessage.serialized, + deviceOne.getPublicKey()); + final receivedDeviceTwoMessage = DeviceConsistencyMessage.fromSerialized( + deviceOneCommitment, + deviceTwoMessage.serialized, + deviceTwo.getPublicKey()); + final receivedDeviceThreeMessage = DeviceConsistencyMessage.fromSerialized( + deviceOneCommitment, + deviceThreeMessage.serialized, + deviceThree.getPublicKey()); + + expect(deviceOneMessage.signature.vrfOutput, + receivedDeviceOneMessage.signature.vrfOutput); + expect(deviceTwoMessage.signature.vrfOutput, + receivedDeviceTwoMessage.signature.vrfOutput); + expect(deviceThreeMessage.signature.vrfOutput, + receivedDeviceThreeMessage.signature.vrfOutput); + + final codeOne = generateCode(deviceOneCommitment, [ + deviceOneMessage, + receivedDeviceTwoMessage, + receivedDeviceThreeMessage + ]); + final codeTwo = generateCode(deviceTwoCommitment, [ + deviceTwoMessage, + receivedDeviceThreeMessage, + receivedDeviceOneMessage + ]); + final codeThree = generateCode(deviceThreeCommitment, [ + deviceThreeMessage, + receivedDeviceTwoMessage, + receivedDeviceOneMessage + ]); + + expect(codeOne, codeTwo); + expect(codeTwo, codeThree); + }); +} diff --git a/libsignal_protocol_dart/test/ecc/curve25519_test.dart b/libsignal_protocol_dart/test/ecc/curve25519_test.dart new file mode 100644 index 0000000..30685d9 --- /dev/null +++ b/libsignal_protocol_dart/test/ecc/curve25519_test.dart @@ -0,0 +1,459 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/invalid_key_exception.dart'; +import 'package:test/test.dart'; + +void main() { + test('testAgreement', () { + final alicePublic = Uint8List.fromList([ + 0x05, + 0x1b, + 0xb7, + 0x59, + 0x66, + 0xf2, + 0xe9, + 0x3a, + 0x36, + 0x91, + 0xdf, + 0xff, + 0x94, + 0x2b, + 0xb2, + 0xa4, + 0x66, + 0xa1, + 0xc0, + 0x8b, + 0x8d, + 0x78, + 0xca, + 0x3f, + 0x4d, + 0x6d, + 0xf8, + 0xb8, + 0xbf, + 0xa2, + 0xe4, + 0xee, + 0x28 + ]); + + final alicePrivate = Uint8List.fromList([ + 0xc8, + 0x06, + 0x43, + 0x9d, + 0xc9, + 0xd2, + 0xc4, + 0x76, + 0xff, + 0xed, + 0x8f, + 0x25, + 0x80, + 0xc0, + 0x88, + 0x8d, + 0x58, + 0xab, + 0x40, + 0x6b, + 0xf7, + 0xae, + 0x36, + 0x98, + 0x87, + 0x90, + 0x21, + 0xb9, + 0x6b, + 0xb4, + 0xbf, + 0x59 + ]); + + final bobPublic = Uint8List.fromList([ + 0x05, + 0x65, + 0x36, + 0x14, + 0x99, + 0x3d, + 0x2b, + 0x15, + 0xee, + 0x9e, + 0x5f, + 0xd3, + 0xd8, + 0x6c, + 0xe7, + 0x19, + 0xef, + 0x4e, + 0xc1, + 0xda, + 0xae, + 0x18, + 0x86, + 0xa8, + 0x7b, + 0x3f, + 0x5f, + 0xa9, + 0x56, + 0x5a, + 0x27, + 0xa2, + 0x2f + ]); + + final bobPrivate = Uint8List.fromList([ + 0xb0, + 0x3b, + 0x34, + 0xc3, + 0x3a, + 0x1c, + 0x44, + 0xf2, + 0x25, + 0xb6, + 0x62, + 0xd2, + 0xbf, + 0x48, + 0x59, + 0xb8, + 0x13, + 0x54, + 0x11, + 0xfa, + 0x7b, + 0x03, + 0x86, + 0xd4, + 0x5f, + 0xb7, + 0x5d, + 0xc5, + 0xb9, + 0x1b, + 0x44, + 0x66 + ]); + + final shared = Uint8List.fromList([ + 0x32, + 0x5f, + 0x23, + 0x93, + 0x28, + 0x94, + 0x1c, + 0xed, + 0x6e, + 0x67, + 0x3b, + 0x86, + 0xba, + 0x41, + 0x01, + 0x74, + 0x48, + 0xe9, + 0x9b, + 0x64, + 0x9a, + 0x9c, + 0x38, + 0x06, + 0xc1, + 0xdd, + 0x7c, + 0xa4, + 0xc4, + 0x77, + 0xe6, + 0x29 + ]); + + final alicePublicKey = Curve.decodePoint(alicePublic, 0); + final alicePrivateKey = Curve.decodePrivatePoint(alicePrivate); + + final bobPublicKey = Curve.decodePoint(bobPublic, 0); + final bobPrivateKey = Curve.decodePrivatePoint(bobPrivate); + + final sharedOne = Curve.calculateAgreement(alicePublicKey, bobPrivateKey); + final sharedTwo = Curve.calculateAgreement(bobPublicKey, alicePrivateKey); + + expect(sharedOne, shared); + expect(sharedTwo, shared); + }); + + test('testRandomAgreements', () { + for (var i = 0; i < 50; i++) { + final alice = Curve.generateKeyPair(); + final bob = Curve.generateKeyPair(); + + final sharedAlice = + Curve.calculateAgreement(bob.publicKey, alice.privateKey); + final sharedBob = + Curve.calculateAgreement(alice.publicKey, bob.privateKey); + + expect(sharedAlice, sharedBob); + } + }); + + test('testSignature', () { + final aliceIdentityPrivate = Uint8List.fromList([ + 0xc0, + 0x97, + 0x24, + 0x84, + 0x12, + 0xe5, + 0x8b, + 0xf0, + 0x5d, + 0xf4, + 0x87, + 0x96, + 0x82, + 0x05, + 0x13, + 0x27, + 0x94, + 0x17, + 0x8e, + 0x36, + 0x76, + 0x37, + 0xf5, + 0x81, + 0x8f, + 0x81, + 0xe0, + 0xe6, + 0xce, + 0x73, + 0xe8, + 0x65 + ]); + + final aliceIdentityPublic = Uint8List.fromList([ + 0x05, + 0xab, + 0x7e, + 0x71, + 0x7d, + 0x4a, + 0x16, + 0x3b, + 0x7d, + 0x9a, + 0x1d, + 0x80, + 0x71, + 0xdf, + 0xe9, + 0xdc, + 0xf8, + 0xcd, + 0xcd, + 0x1c, + 0xea, + 0x33, + 0x39, + 0xb6, + 0x35, + 0x6b, + 0xe8, + 0x4d, + 0x88, + 0x7e, + 0x32, + 0x2c, + 0x64 + ]); + + final aliceEphemeralPublic = Uint8List.fromList([ + 0x05, + 0xed, + 0xce, + 0x9d, + 0x9c, + 0x41, + 0x5c, + 0xa7, + 0x8c, + 0xb7, + 0x25, + 0x2e, + 0x72, + 0xc2, + 0xc4, + 0xa5, + 0x54, + 0xd3, + 0xeb, + 0x29, + 0x48, + 0x5a, + 0x0e, + 0x1d, + 0x50, + 0x31, + 0x18, + 0xd1, + 0xa8, + 0x2d, + 0x99, + 0xfb, + 0x4a + ]); + + final aliceSignature = Uint8List.fromList([ + 0x5d, + 0xe8, + 0x8c, + 0xa9, + 0xa8, + 0x9b, + 0x4a, + 0x11, + 0x5d, + 0xa7, + 0x91, + 0x09, + 0xc6, + 0x7c, + 0x9c, + 0x74, + 0x64, + 0xa3, + 0xe4, + 0x18, + 0x02, + 0x74, + 0xf1, + 0xcb, + 0x8c, + 0x63, + 0xc2, + 0x98, + 0x4e, + 0x28, + 0x6d, + 0xfb, + 0xed, + 0xe8, + 0x2d, + 0xeb, + 0x9d, + 0xcd, + 0x9f, + 0xae, + 0x0b, + 0xfb, + 0xb8, + 0x21, + 0x56, + 0x9b, + 0x3d, + 0x90, + 0x01, + 0xbd, + 0x81, + 0x30, + 0xcd, + 0x11, + 0xd4, + 0x86, + 0xce, + 0xf0, + 0x47, + 0xbd, + 0x60, + 0xb8, + 0x6e, + 0x88 + ]); + + // ignore: unused_local_variable + final alicePrivateKey = Curve.decodePrivatePoint(aliceIdentityPrivate); + final alicePublicKey = Curve.decodePoint(aliceIdentityPublic, 0); + final aliceEphemeral = Curve.decodePoint(aliceEphemeralPublic, 0); + + if (!Curve.verifySignature( + alicePublicKey, aliceEphemeral.serialize(), aliceSignature)) { + throw AssertionError('Sig verification failed!'); + } + + for (var i = 0; i < aliceSignature.length; i++) { + final modifiedSignature = Uint8List(aliceSignature.length); + Curve.arraycopy( + aliceSignature, 0, modifiedSignature, 0, modifiedSignature.length); + + modifiedSignature[i] ^= 0x01; + + if (Curve.verifySignature( + alicePublicKey, aliceEphemeral.serialize(), modifiedSignature)) { + throw AssertionError('Sig verification succeeded!'); + } + } + }); + + test('testDecodeSize', () { + final keyPair = Curve.generateKeyPair(); + final serializedPublic = keyPair.publicKey.serialize(); + + final justRight = Curve.decodePoint(serializedPublic, 0); + + try { + // ignore: unused_local_variable + final tooSmall = Curve.decodePoint(serializedPublic, 1); + throw AssertionError("Shouldn't decode"); + } on InvalidKeyException { + // good + } + + try { + // ignore: unused_local_variable + final empty = Curve.decodePoint(Uint8List(0), 0); + throw AssertionError("Shouldn't parse"); + } on InvalidKeyException { + // good + } + + try { + final badKeyType = Uint8List(33); + Curve.arraycopy( + serializedPublic, 0, badKeyType, 0, serializedPublic.length); + badKeyType[0] = 0x01; + Curve.decodePoint(badKeyType, 0); + throw AssertionError('Should be bad key type'); + } on InvalidKeyException { + // good + } + + final extraSpace = Uint8List(serializedPublic.length + 1); + Curve.arraycopy( + serializedPublic, 0, extraSpace, 0, serializedPublic.length); + final extra = Curve.decodePoint(extraSpace, 0); + + final offsetSpace = Uint8List(serializedPublic.length + 1); + Curve.arraycopy( + serializedPublic, 0, offsetSpace, 1, serializedPublic.length); + final offset = Curve.decodePoint(offsetSpace, 1); + + expect(serializedPublic, justRight.serialize()); + expect(extra.serialize(), serializedPublic); + expect(offset.serialize(), serializedPublic); + }); +} diff --git a/libsignal_protocol_dart/test/fingerprint/numeric_fingerprint_generator_test.dart b/libsignal_protocol_dart/test/fingerprint/numeric_fingerprint_generator_test.dart new file mode 100644 index 0000000..5af9059 --- /dev/null +++ b/libsignal_protocol_dart/test/fingerprint/numeric_fingerprint_generator_test.dart @@ -0,0 +1,553 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/fingerprint/numeric_fingerprint_generator.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:test/test.dart'; + +Uint8List aliceIdentity = Uint8List.fromList([ + 0x05, + 0x06, + 0x86, + 0x3b, + 0xc6, + 0x6d, + 0x02, + 0xb4, + 0x0d, + 0x27, + 0xb8, + 0xd4, + 0x9c, + 0xa7, + 0xc0, + 0x9e, + 0x92, + 0x39, + 0x23, + 0x6f, + 0x9d, + 0x7d, + 0x25, + 0xd6, + 0xfc, + 0xca, + 0x5c, + 0xe1, + 0x3c, + 0x70, + 0x64, + 0xd8, + 0x68 +]); +Uint8List bobIdentity = Uint8List.fromList([ + 0x05, + 0xf7, + 0x81, + 0xb6, + 0xfb, + 0x32, + 0xfe, + 0xd9, + 0xba, + 0x1c, + 0xf2, + 0xde, + 0x97, + 0x8d, + 0x4d, + 0x5d, + 0xa2, + 0x8d, + 0xc3, + 0x40, + 0x46, + 0xae, + 0x81, + 0x44, + 0x02, + 0xb5, + 0xc0, + 0xdb, + 0xd9, + 0x6f, + 0xda, + 0x90, + 0x7b +]); + +int version1 = 1; +String displayableFingerprintV1 = + '300354477692869396892869876765458257569162576843440918079131'; +Uint8List aliceScannableFingerprintV1 = Uint8List.fromList([ + 0x08, + 0x01, + 0x12, + 0x22, + 0x0a, + 0x20, + 0x1e, + 0x30, + 0x1a, + 0x03, + 0x53, + 0xdc, + 0xe3, + 0xdb, + 0xe7, + 0x68, + 0x4c, + 0xb8, + 0x33, + 0x6e, + 0x85, + 0x13, + 0x6c, + 0xdc, + 0x0e, + 0xe9, + 0x62, + 0x19, + 0x49, + 0x4a, + 0xda, + 0x30, + 0x5d, + 0x62, + 0xa7, + 0xbd, + 0x61, + 0xdf, + 0x1a, + 0x22, + 0x0a, + 0x20, + 0xd6, + 0x2c, + 0xbf, + 0x73, + 0xa1, + 0x15, + 0x92, + 0x01, + 0x5b, + 0x6b, + 0x9f, + 0x16, + 0x82, + 0xac, + 0x30, + 0x6f, + 0xea, + 0x3a, + 0xaf, + 0x38, + 0x85, + 0xb8, + 0x4d, + 0x12, + 0xbc, + 0xa6, + 0x31, + 0xe9, + 0xd4, + 0xfb, + 0x3a, + 0x4d +]); +Uint8List bobScannableFingerprintV1 = Uint8List.fromList([ + 0x08, + 0x01, + 0x12, + 0x22, + 0x0a, + 0x20, + 0xd6, + 0x2c, + 0xbf, + 0x73, + 0xa1, + 0x15, + 0x92, + 0x01, + 0x5b, + 0x6b, + 0x9f, + 0x16, + 0x82, + 0xac, + 0x30, + 0x6f, + 0xea, + 0x3a, + 0xaf, + 0x38, + 0x85, + 0xb8, + 0x4d, + 0x12, + 0xbc, + 0xa6, + 0x31, + 0xe9, + 0xd4, + 0xfb, + 0x3a, + 0x4d, + 0x1a, + 0x22, + 0x0a, + 0x20, + 0x1e, + 0x30, + 0x1a, + 0x03, + 0x53, + 0xdc, + 0xe3, + 0xdb, + 0xe7, + 0x68, + 0x4c, + 0xb8, + 0x33, + 0x6e, + 0x85, + 0x13, + 0x6c, + 0xdc, + 0x0e, + 0xe9, + 0x62, + 0x19, + 0x49, + 0x4a, + 0xda, + 0x30, + 0x5d, + 0x62, + 0xa7, + 0xbd, + 0x61, + 0xdf +]); + +int version2 = 2; +String displayableFingerprintV2 = displayableFingerprintV1; +Uint8List aliceScannableFingerprintV2 = Uint8List.fromList([ + 0x08, + 0x02, + 0x12, + 0x22, + 0x0a, + 0x20, + 0x1e, + 0x30, + 0x1a, + 0x03, + 0x53, + 0xdc, + 0xe3, + 0xdb, + 0xe7, + 0x68, + 0x4c, + 0xb8, + 0x33, + 0x6e, + 0x85, + 0x13, + 0x6c, + 0xdc, + 0x0e, + 0xe9, + 0x62, + 0x19, + 0x49, + 0x4a, + 0xda, + 0x30, + 0x5d, + 0x62, + 0xa7, + 0xbd, + 0x61, + 0xdf, + 0x1a, + 0x22, + 0x0a, + 0x20, + 0xd6, + 0x2c, + 0xbf, + 0x73, + 0xa1, + 0x15, + 0x92, + 0x01, + 0x5b, + 0x6b, + 0x9f, + 0x16, + 0x82, + 0xac, + 0x30, + 0x6f, + 0xea, + 0x3a, + 0xaf, + 0x38, + 0x85, + 0xb8, + 0x4d, + 0x12, + 0xbc, + 0xa6, + 0x31, + 0xe9, + 0xd4, + 0xfb, + 0x3a, + 0x4d +]); +Uint8List bobScannableFingerprintV2 = Uint8List.fromList([ + 0x08, + 0x02, + 0x12, + 0x22, + 0x0a, + 0x20, + 0xd6, + 0x2c, + 0xbf, + 0x73, + 0xa1, + 0x15, + 0x92, + 0x01, + 0x5b, + 0x6b, + 0x9f, + 0x16, + 0x82, + 0xac, + 0x30, + 0x6f, + 0xea, + 0x3a, + 0xaf, + 0x38, + 0x85, + 0xb8, + 0x4d, + 0x12, + 0xbc, + 0xa6, + 0x31, + 0xe9, + 0xd4, + 0xfb, + 0x3a, + 0x4d, + 0x1a, + 0x22, + 0x0a, + 0x20, + 0x1e, + 0x30, + 0x1a, + 0x03, + 0x53, + 0xdc, + 0xe3, + 0xdb, + 0xe7, + 0x68, + 0x4c, + 0xb8, + 0x33, + 0x6e, + 0x85, + 0x13, + 0x6c, + 0xdc, + 0x0e, + 0xe9, + 0x62, + 0x19, + 0x49, + 0x4a, + 0xda, + 0x30, + 0x5d, + 0x62, + 0xa7, + 0xbd, + 0x61, + 0xdf +]); + +void main() { + test('testVectorsVersion1', () { + final aliceIdentityKey = IdentityKey.fromBytes(aliceIdentity, 0); + final bobIdentityKey = IdentityKey.fromBytes(bobIdentity, 0); + final aliceStableId = Uint8List.fromList(utf8.encode('+14152222222')); + final bobStableId = Uint8List.fromList(utf8.encode('+14153333333')); + + final generator = NumericFingerprintGenerator(5200); + + final aliceFingerprint = generator.createFor( + version1, aliceStableId, aliceIdentityKey, bobStableId, bobIdentityKey); + + final bobFingerprint = generator.createFor( + version1, bobStableId, bobIdentityKey, aliceStableId, aliceIdentityKey); + + expect(aliceFingerprint.displayableFingerprint.getDisplayText(), + displayableFingerprintV1); + expect(bobFingerprint.displayableFingerprint.getDisplayText(), + displayableFingerprintV1); + + expect(aliceFingerprint.scannableFingerprint.fingerprints, + aliceScannableFingerprintV1); + expect(bobFingerprint.scannableFingerprint.fingerprints, + bobScannableFingerprintV1); + }); + + test('testMatchingFingerprints', () { + final aliceKeyPair = Curve.generateKeyPair(); + final bobKeyPair = Curve.generateKeyPair(); + + final aliceIdentityKey = IdentityKey(aliceKeyPair.publicKey); + final bobIdentityKey = IdentityKey(bobKeyPair.publicKey); + + final generator = NumericFingerprintGenerator(1024); + final aliceFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+14152222222')), + aliceIdentityKey, + Uint8List.fromList(utf8.encode('+14153333333')), + bobIdentityKey); + + final bobFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+14153333333')), + bobIdentityKey, + Uint8List.fromList(utf8.encode('+14152222222')), + aliceIdentityKey); + + expect(aliceFingerprint.displayableFingerprint.getDisplayText(), + bobFingerprint.displayableFingerprint.getDisplayText()); + + expect( + aliceFingerprint.scannableFingerprint + .compareTo(bobFingerprint.scannableFingerprint.fingerprints), + true); + expect( + bobFingerprint.scannableFingerprint + .compareTo(aliceFingerprint.scannableFingerprint.fingerprints), + true); + + expect(aliceFingerprint.displayableFingerprint.getDisplayText().length, 60); + }); + + test('testMismatchingFingerprints', () { + final aliceKeyPair = Curve.generateKeyPair(); + final bobKeyPair = Curve.generateKeyPair(); + final mitmKeyPair = Curve.generateKeyPair(); + + final aliceIdentityKey = IdentityKey(aliceKeyPair.publicKey); + final bobIdentityKey = IdentityKey(bobKeyPair.publicKey); + final mitmIdentityKey = IdentityKey(mitmKeyPair.publicKey); + + final generator = NumericFingerprintGenerator(1024); + final aliceFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+14152222222')), + aliceIdentityKey, + Uint8List.fromList(utf8.encode('+14153333333')), + mitmIdentityKey); + + final bobFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+14153333333')), + bobIdentityKey, + Uint8List.fromList(utf8.encode('+14152222222')), + aliceIdentityKey); + + expect( + aliceFingerprint.displayableFingerprint.getDisplayText() == + bobFingerprint.displayableFingerprint.getDisplayText(), + false); + + expect( + aliceFingerprint.scannableFingerprint + .compareTo(bobFingerprint.scannableFingerprint.fingerprints), + false); + expect( + bobFingerprint.scannableFingerprint + .compareTo(aliceFingerprint.scannableFingerprint.fingerprints), + false); + }); + + test('testMismatchingIdentifiers', () { + final aliceKeyPair = Curve.generateKeyPair(); + final bobKeyPair = Curve.generateKeyPair(); + + final aliceIdentityKey = IdentityKey(aliceKeyPair.publicKey); + final bobIdentityKey = IdentityKey(bobKeyPair.publicKey); + + final generator = NumericFingerprintGenerator(1024); + final aliceFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+141512222222')), + aliceIdentityKey, + Uint8List.fromList(utf8.encode('+14153333333')), + bobIdentityKey); + final bobFingerprint = generator.createFor( + version1, + Uint8List.fromList(utf8.encode('+14153333333')), + bobIdentityKey, + Uint8List.fromList(utf8.encode('+14152222222')), + aliceIdentityKey); + + expect( + aliceFingerprint.displayableFingerprint.getDisplayText() == + bobFingerprint.displayableFingerprint.getDisplayText(), + false); + + expect( + aliceFingerprint.scannableFingerprint + .compareTo(bobFingerprint.scannableFingerprint.fingerprints), + false); + expect( + bobFingerprint.scannableFingerprint + .compareTo(aliceFingerprint.scannableFingerprint.fingerprints), + false); + }); + + test('testDifferentVersionsMakeSameFingerPrintsButDifferentScannable', () { + final aliceIdentityKey = IdentityKey.fromBytes(aliceIdentity, 0); + final bobIdentityKey = IdentityKey.fromBytes(bobIdentity, 0); + final aliceStableId = Uint8List.fromList(utf8.encode('+14152222222')); + final bobStableId = Uint8List.fromList(utf8.encode('+14153333333')); + + final generator = NumericFingerprintGenerator(5200); + + final aliceFingerprintV1 = generator.createFor( + version1, aliceStableId, aliceIdentityKey, bobStableId, bobIdentityKey); + + final aliceFingerprintV2 = generator.createFor( + version2, aliceStableId, aliceIdentityKey, bobStableId, bobIdentityKey); + + expect( + aliceFingerprintV1.displayableFingerprint.getDisplayText() == + aliceFingerprintV2.displayableFingerprint.getDisplayText(), + true); + + expect( + aliceFingerprintV1.scannableFingerprint.fingerprints == + aliceFingerprintV2.scannableFingerprint.fingerprints, + false); + }); +} diff --git a/libsignal_protocol_dart/test/groups/group_cipher_test.dart b/libsignal_protocol_dart/test/groups/group_cipher_test.dart new file mode 100644 index 0000000..6dbc299 --- /dev/null +++ b/libsignal_protocol_dart/test/groups/group_cipher_test.dart @@ -0,0 +1,322 @@ +import 'dart:convert'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/duplicate_message_exception.dart'; +import 'package:libsignal_protocol_dart/src/eq.dart'; +import 'package:libsignal_protocol_dart/src/groups/group_cipher.dart'; +import 'package:libsignal_protocol_dart/src/groups/group_session_builder.dart'; +import 'package:libsignal_protocol_dart/src/groups/sender_key_name.dart'; +import 'package:libsignal_protocol_dart/src/groups/state/in_memory_sender_key_store.dart'; +import 'package:libsignal_protocol_dart/src/invalid_message_exception.dart'; +import 'package:libsignal_protocol_dart/src/no_session_exception.dart'; +import 'package:libsignal_protocol_dart/src/protocol/sender_key_distribution_message_wrapper.dart'; +import 'package:libsignal_protocol_dart/src/signal_protocol_address.dart'; +import 'package:libsignal_protocol_dart/src/util/key_helper.dart'; +import 'package:test/test.dart'; + +void main() { + const senderAddress = SignalProtocolAddress('+14150001111', 1); + const groupSender = + SenderKeyName('nihilist history reading group', senderAddress); + + const integerMax = 0x7fffffff; + + int randomInt() { + final secureRandom = Random.secure(); + return secureRandom.nextInt(integerMax); + } + + test('testNoSession', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + // ignore: unused_local_variable + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + final aliceGroupCipher = GroupCipher(aliceStore, groupSender); + final bobGroupCipher = GroupCipher(bobStore, groupSender); + + final sentAliceDistributionMessage = + await aliceSessionBuilder.create(groupSender); + // ignore: unused_local_variable + final receivedAliceDistributionMessage = + SenderKeyDistributionMessageWrapper.fromSerialized( + sentAliceDistributionMessage.serialize()); + +// bobSessionBuilder.process(groupSender, receivedAliceDistributionMessage); + + final ciphertextFromAlice = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('smert ze smert'))); + try { + // ignore: unused_local_variable + final plaintextFromAlice = + await bobGroupCipher.decrypt(ciphertextFromAlice); + throw AssertionError('Should be no session!'); + } on NoSessionException { + // good + } + }); + + test('testBasicEncryptDecrypt', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + final aliceGroupCipher = GroupCipher(aliceStore, groupSender); + final bobGroupCipher = GroupCipher(bobStore, groupSender); + + final sentAliceDistributionMessage = + await aliceSessionBuilder.create(groupSender); + final receivedAliceDistributionMessage = + SenderKeyDistributionMessageWrapper.fromSerialized( + sentAliceDistributionMessage.serialize()); + await bobSessionBuilder.process( + groupSender, receivedAliceDistributionMessage); + + final ciphertextFromAlice = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('smert ze smert'))); + final plaintextFromAlice = + await bobGroupCipher.decrypt(ciphertextFromAlice); + + assert(utf8.decode(plaintextFromAlice) == 'smert ze smert'); + }); + + test('testLargeMessages', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + final aliceGroupCipher = GroupCipher(aliceStore, groupSender); + final bobGroupCipher = GroupCipher(bobStore, groupSender); + + final sentAliceDistributionMessage = + await aliceSessionBuilder.create(groupSender); + final receivedAliceDistributionMessage = + SenderKeyDistributionMessageWrapper.fromSerialized( + sentAliceDistributionMessage.serialize()); + await bobSessionBuilder.process( + groupSender, receivedAliceDistributionMessage); + + final plaintext = generateRandomBytes(1024 * 1024); + + final ciphertextFromAlice = await aliceGroupCipher.encrypt(plaintext); + final plaintextFromAlice = + await bobGroupCipher.decrypt(ciphertextFromAlice); + + assert(eq(plaintextFromAlice, plaintext)); + }); + + test('testBasicRatchet', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + const aliceName = groupSender; + + final aliceGroupCipher = GroupCipher(aliceStore, aliceName); + final bobGroupCipher = GroupCipher(bobStore, aliceName); + + final sentAliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + final receivedAliceDistributionMessage = + SenderKeyDistributionMessageWrapper.fromSerialized( + sentAliceDistributionMessage.serialize()); + + await bobSessionBuilder.process( + aliceName, receivedAliceDistributionMessage); + + final ciphertextFromAlice = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('smert ze smert'))); + final ciphertextFromAlice2 = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('smert ze smert2'))); + final ciphertextFromAlice3 = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('smert ze smert3'))); + + final plaintextFromAlice = + await bobGroupCipher.decrypt(ciphertextFromAlice); + + try { + await bobGroupCipher.decrypt(ciphertextFromAlice); + throw AssertionError('Should have ratcheted forward!'); + } on DuplicateMessageException { + // good + } + + final plaintextFromAlice2 = + await bobGroupCipher.decrypt(ciphertextFromAlice2); + final plaintextFromAlice3 = + await bobGroupCipher.decrypt(ciphertextFromAlice3); + + assert(utf8.decode(plaintextFromAlice) == 'smert ze smert'); + assert(utf8.decode(plaintextFromAlice2) == 'smert ze smert2'); + assert(utf8.decode(plaintextFromAlice3) == 'smert ze smert3'); + }); + + test('testLateJoin', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + + const aliceName = groupSender; + + final aliceGroupCipher = GroupCipher(aliceStore, aliceName); + + // ignore: unused_local_variable + final aliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + // Send off to some people. + + for (var i = 0; i < 100; i++) { + await aliceGroupCipher.encrypt(Uint8List.fromList( + utf8.encode('up the punks up the punks up the punks'))); + } + + // Now Bob Joins. + final bobSessionBuilder = GroupSessionBuilder(bobStore); + final bobGroupCipher = GroupCipher(bobStore, aliceName); + + final distributionMessageToBob = + await aliceSessionBuilder.create(aliceName); + await bobSessionBuilder.process( + aliceName, + SenderKeyDistributionMessageWrapper.fromSerialized( + distributionMessageToBob.serialize())); + + final ciphertext = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('welcome to the group'))); + final plaintext = await bobGroupCipher.decrypt(ciphertext); + + assert(utf8.decode(plaintext) == 'welcome to the group'); + }); + + test('testOutOfOrder', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + const aliceName = groupSender; + + final aliceGroupCipher = GroupCipher(aliceStore, aliceName); + final bobGroupCipher = GroupCipher(bobStore, aliceName); + + final sentAliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + // ignore: unused_local_variable + final receivedAliceDistributionMessage = + SenderKeyDistributionMessageWrapper.fromSerialized( + sentAliceDistributionMessage.serialize()); + + final aliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + + await bobSessionBuilder.process(aliceName, aliceDistributionMessage); + + final ciphertexts = []; + + for (var i = 0; i < 100; i++) { + ciphertexts.add(await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('up the punks')))); + } + + while (ciphertexts.isNotEmpty) { + final index = randomInt() % ciphertexts.length; + final ciphertext = ciphertexts.removeAt(index); + final plaintext = await bobGroupCipher.decrypt(ciphertext); + + assert(utf8.decode(plaintext) == 'up the punks'); + } + }); + + test('testEncryptNoSession', () async { + final aliceStore = InMemorySenderKeyStore(); + final aliceGroupCipher = GroupCipher( + aliceStore, + const SenderKeyName( + 'coolio groupio', SignalProtocolAddress('+10002223333', 1))); + try { + await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('up the punks'))); + throw AssertionError('Should have failed!'); + } on NoSessionException { + // good + } + }); + + test('testTooFarInFuture', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + const aliceName = groupSender; + + final aliceGroupCipher = GroupCipher(aliceStore, aliceName); + final bobGroupCipher = GroupCipher(bobStore, aliceName); + + final aliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + + await bobSessionBuilder.process(aliceName, aliceDistributionMessage); + + for (var i = 0; i < 2001; i++) { + await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('up the punks'))); + } + + final tooFarCiphertext = await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('notta gonna worka'))); + try { + await bobGroupCipher.decrypt(tooFarCiphertext); + throw AssertionError('Should have failed!'); + } on InvalidMessageException { + // good + } + }); + + test('testMessageKeyLimit', () async { + final aliceStore = InMemorySenderKeyStore(); + final bobStore = InMemorySenderKeyStore(); + + final aliceSessionBuilder = GroupSessionBuilder(aliceStore); + final bobSessionBuilder = GroupSessionBuilder(bobStore); + + const aliceName = groupSender; + + final aliceGroupCipher = GroupCipher(aliceStore, aliceName); + final bobGroupCipher = GroupCipher(bobStore, aliceName); + + final aliceDistributionMessage = + await aliceSessionBuilder.create(aliceName); + + await bobSessionBuilder.process(aliceName, aliceDistributionMessage); + + final inflight = []; + + for (var i = 0; i < 2010; i++) { + inflight.add(await aliceGroupCipher + .encrypt(Uint8List.fromList(utf8.encode('up the punks')))); + } + + await bobGroupCipher.decrypt(inflight[1000]); + await bobGroupCipher.decrypt(inflight[inflight.length - 1]); + + try { + await bobGroupCipher.decrypt(inflight[0]); + throw AssertionError('Should have failed!'); + } on DuplicateMessageException { + // good + } + }); +} diff --git a/libsignal_protocol_dart/test/kdf/hkdf_test.dart b/libsignal_protocol_dart/test/kdf/hkdf_test.dart new file mode 100644 index 0000000..fd85d6c --- /dev/null +++ b/libsignal_protocol_dart/test/kdf/hkdf_test.dart @@ -0,0 +1,555 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/kdf/hkdf.dart'; +import 'package:test/test.dart'; + +void main() { + test('testVectorV3', () { + final ikm = Uint8List.fromList([ + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b + ]); + + final salt = Uint8List.fromList([ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0a, + 0x0b, + 0x0c + ]); + + final info = Uint8List.fromList( + [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9]); + + final okm = Uint8List.fromList([ + 0x3c, + 0xb2, + 0x5f, + 0x25, + 0xfa, + 0xac, + 0xd5, + 0x7a, + 0x90, + 0x43, + 0x4f, + 0x64, + 0xd0, + 0x36, + 0x2f, + 0x2a, + 0x2d, + 0x2d, + 0x0a, + 0x90, + 0xcf, + 0x1a, + 0x5a, + 0x4c, + 0x5d, + 0xb0, + 0x2d, + 0x56, + 0xec, + 0xc4, + 0xc5, + 0xbf, + 0x34, + 0x00, + 0x72, + 0x08, + 0xd5, + 0xb8, + 0x87, + 0x18, + 0x58, + 0x65 + ]); + + final actualOutput = HKDF.createFor(3).deriveSecrets4(ikm, salt, info, 42); + expect(okm, actualOutput); + }); + + test('testVectorLong3', () { + final ikm = Uint8List.fromList([ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0a, + 0x0b, + 0x0c, + 0x0d, + 0x0e, + 0x0f, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x19, + 0x1a, + 0x1b, + 0x1c, + 0x1d, + 0x1e, + 0x1f, + 0x20, + 0x21, + 0x22, + 0x23, + 0x24, + 0x25, + 0x26, + 0x27, + 0x28, + 0x29, + 0x2a, + 0x2b, + 0x2c, + 0x2d, + 0x2e, + 0x2f, + 0x30, + 0x31, + 0x32, + 0x33, + 0x34, + 0x35, + 0x36, + 0x37, + 0x38, + 0x39, + 0x3a, + 0x3b, + 0x3c, + 0x3d, + 0x3e, + 0x3f, + 0x40, + 0x41, + 0x42, + 0x43, + 0x44, + 0x45, + 0x46, + 0x47, + 0x48, + 0x49, + 0x4a, + 0x4b, + 0x4c, + 0x4d, + 0x4e, + 0x4f + ]); + + final salt = Uint8List.fromList([ + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6a, + 0x6b, + 0x6c, + 0x6d, + 0x6e, + 0x6f, + 0x70, + 0x71, + 0x72, + 0x73, + 0x74, + 0x75, + 0x76, + 0x77, + 0x78, + 0x79, + 0x7a, + 0x7b, + 0x7c, + 0x7d, + 0x7e, + 0x7f, + 0x80, + 0x81, + 0x82, + 0x83, + 0x84, + 0x85, + 0x86, + 0x87, + 0x88, + 0x89, + 0x8a, + 0x8b, + 0x8c, + 0x8d, + 0x8e, + 0x8f, + 0x90, + 0x91, + 0x92, + 0x93, + 0x94, + 0x95, + 0x96, + 0x97, + 0x98, + 0x99, + 0x9a, + 0x9b, + 0x9c, + 0x9d, + 0x9e, + 0x9f, + 0xa0, + 0xa1, + 0xa2, + 0xa3, + 0xa4, + 0xa5, + 0xa6, + 0xa7, + 0xa8, + 0xa9, + 0xaa, + 0xab, + 0xac, + 0xad, + 0xae, + 0xaf + ]); + + final info = Uint8List.fromList([ + 0xb0, + 0xb1, + 0xb2, + 0xb3, + 0xb4, + 0xb5, + 0xb6, + 0xb7, + 0xb8, + 0xb9, + 0xba, + 0xbb, + 0xbc, + 0xbd, + 0xbe, + 0xbf, + 0xc0, + 0xc1, + 0xc2, + 0xc3, + 0xc4, + 0xc5, + 0xc6, + 0xc7, + 0xc8, + 0xc9, + 0xca, + 0xcb, + 0xcc, + 0xcd, + 0xce, + 0xcf, + 0xd0, + 0xd1, + 0xd2, + 0xd3, + 0xd4, + 0xd5, + 0xd6, + 0xd7, + 0xd8, + 0xd9, + 0xda, + 0xdb, + 0xdc, + 0xdd, + 0xde, + 0xdf, + 0xe0, + 0xe1, + 0xe2, + 0xe3, + 0xe4, + 0xe5, + 0xe6, + 0xe7, + 0xe8, + 0xe9, + 0xea, + 0xeb, + 0xec, + 0xed, + 0xee, + 0xef, + 0xf0, + 0xf1, + 0xf2, + 0xf3, + 0xf4, + 0xf5, + 0xf6, + 0xf7, + 0xf8, + 0xf9, + 0xfa, + 0xfb, + 0xfc, + 0xfd, + 0xfe, + 0xff + ]); + + final okm = Uint8List.fromList([ + 0xb1, + 0x1e, + 0x39, + 0x8d, + 0xc8, + 0x03, + 0x27, + 0xa1, + 0xc8, + 0xe7, + 0xf7, + 0x8c, + 0x59, + 0x6a, + 0x49, + 0x34, + 0x4f, + 0x01, + 0x2e, + 0xda, + 0x2d, + 0x4e, + 0xfa, + 0xd8, + 0xa0, + 0x50, + 0xcc, + 0x4c, + 0x19, + 0xaf, + 0xa9, + 0x7c, + 0x59, + 0x04, + 0x5a, + 0x99, + 0xca, + 0xc7, + 0x82, + 0x72, + 0x71, + 0xcb, + 0x41, + 0xc6, + 0x5e, + 0x59, + 0x0e, + 0x09, + 0xda, + 0x32, + 0x75, + 0x60, + 0x0c, + 0x2f, + 0x09, + 0xb8, + 0x36, + 0x77, + 0x93, + 0xa9, + 0xac, + 0xa3, + 0xdb, + 0x71, + 0xcc, + 0x30, + 0xc5, + 0x81, + 0x79, + 0xec, + 0x3e, + 0x87, + 0xc1, + 0x4c, + 0x01, + 0xd5, + 0xc1, + 0xf3, + 0x43, + 0x4f, + 0x1d, + 0x87 + ]); + + final actualOutput = HKDF.createFor(3).deriveSecrets4(ikm, salt, info, 82); + expect(okm, actualOutput); + }); + + test('testVectorV2', () { + final ikm = Uint8List.fromList([ + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b, + 0x0b + ]); + + final salt = Uint8List.fromList([ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0a, + 0x0b, + 0x0c + ]); + + final info = Uint8List.fromList( + [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9]); + + final okm = Uint8List.fromList([ + 0x6e, + 0xc2, + 0x55, + 0x6d, + 0x5d, + 0x7b, + 0x1d, + 0x81, + 0xde, + 0xe4, + 0x22, + 0x2a, + 0xd7, + 0x48, + 0x36, + 0x95, + 0xdd, + 0xc9, + 0x8f, + 0x4f, + 0x5f, + 0xab, + 0xc0, + 0xe0, + 0x20, + 0x5d, + 0xc2, + 0xef, + 0x87, + 0x52, + 0xd4, + 0x1e, + 0x04, + 0xe2, + 0xe2, + 0x11, + 0x01, + 0xc6, + 0x8f, + 0xf0, + 0x93, + 0x94, + 0xb8, + 0xad, + 0x0b, + 0xdc, + 0xb9, + 0x60, + 0x9c, + 0xd4, + 0xee, + 0x82, + 0xac, + 0x13, + 0x19, + 0x9b, + 0x4a, + 0xa9, + 0xfd, + 0xa8, + 0x99, + 0xda, + 0xeb, + 0xec + ]); + + final actualOutput = HKDF.createFor(2).deriveSecrets4(ikm, salt, info, 64); + expect(okm, actualOutput); + }); +} diff --git a/libsignal_protocol_dart/test/provisioning_cipher_test.dart b/libsignal_protocol_dart/test/provisioning_cipher_test.dart new file mode 100644 index 0000000..aa5c40a --- /dev/null +++ b/libsignal_protocol_dart/test/provisioning_cipher_test.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:libsignal_protocol_dart/src/cbc.dart'; +import 'package:test/test.dart'; + +void main() { + test('testDecrypt', () { + const privateKey = 'GHtZBYTNqbCofFo0keD3jTGoHF6bUAeiW9iV5ad/HHA='; + const content = + 'eyJwdWJsaWNfa2V5IjoiQmZFOWJFa3EzZ2FsUTFHTnVEMWlJaHBrSkE0RHRTVUxkYXhkS3JiZndMcDgiLCJib2R5IjoiQVd6YWZJSDEyZ2tTQmRjdVplSXRMM3lXVmhZdW1lemppZk9rbFdsV3lnQzVKSXpzMHVxYXFZNnhsdFJzVWJya2N0NGFLazVKSmxwYlBKSXNqTU5qYXZKR1hNSFpOSnQ2SXZ1S1pkUVwvN1RzbjRUUjhmWjNSUXo2aGM3RlpYZENLTUJMVzJHTjAzSDd3aUt1elArZVV4WktCQjFPb2pWaVlSU0Vyc3dUWGwxeWR5cnhcLzM1NVY5MzFCR0N1VlBLVXFuOUJFWCtidVFhYms3YWZYdEVCOUI2YTZGSnFCZXVGcHdcLzlDdWpwYVpXNzNIMmswTmxkNjdPMzB5QkZEM3RuNmtiaXZ3MzNjN0l2Uk9EYlwvQnFTS1NGSlJoMUE2eU1leTAyeHZkNkJpRkxja1FRQk9LXC9ROW5ZOExoM2VlS2FNNTQ3cVV3XC9qUEE0ZGE5TzI0RkJUXC9ON2NvR2dBOVkrN1pvZ0syQ3YzbDZCNG9CN0xyTCtrVlRWTHJ2MFA1aDF3YklrUm10YWRLQmxiTjVvK3RnVUZ5VnVNcWFXQVJ6QnBJNlVDajVaZ0JJVWJWM3N0enVwUXpYU0E5OVBWV3hXOTE2dz09In0='; + final plaintext = decrypt(privateKey, content); + final result = utf8.decode(plaintext, allowMalformed: true); + const r = + '{"session_id":"304745a1-45af-4045-bd16-ba4d42a03a4e","platform":"iOS","user_id":"f59b9309-70c2-4b69-8fd8-5773dbd10018","identity_key_public":"BTEcMFj5uvP+32z+avKFOjDOrMvmnoDmwMfPZcuxBT08","identity_key_private":"iG5ilNnI8dkqtslK84NWWmPUhzADyUm6odlwA96isEk=","provisioning_code":"7972"}'; + assert(result == r); + }); + + test('testEncrypt', () { + final privateKey = + base64.decode('v9FTNn2tg40ENCEaoCHstCo5J0wb9wKwgZQ6PYJjf0U='); + final iv = base64.decode('tNp4sPQGKjwzqN0L8tDLDg=='); + const encode = 'l0JO9zrPWzrPg2r53Sjf6g=='; + final ciphertext = aesCbcEncrypt( + privateKey, iv, Uint8List.fromList(utf8.encode('Hello Mixin'))); + assert(encode == base64.encode(ciphertext)); + }); +} diff --git a/libsignal_protocol_dart/test/ratchet/chain_key_test.dart b/libsignal_protocol_dart/test/ratchet/chain_key_test.dart new file mode 100644 index 0000000..75e2a21 --- /dev/null +++ b/libsignal_protocol_dart/test/ratchet/chain_key_test.dart @@ -0,0 +1,314 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/kdf/hkdf.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/chain_key.dart'; +import 'package:test/test.dart'; + +void main() { + test('testChainKeyDerivationV2', () { + final seed = Uint8List.fromList([ + 0x8a, + 0xb7, + 0x2d, + 0x6f, + 0x4c, + 0xc5, + 0xac, + 0x0d, + 0x38, + 0x7e, + 0xaf, + 0x46, + 0x33, + 0x78, + 0xdd, + 0xb2, + 0x8e, + 0xdd, + 0x07, + 0x38, + 0x5b, + 0x1c, + 0xb0, + 0x12, + 0x50, + 0xc7, + 0x15, + 0x98, + 0x2e, + 0x7a, + 0xd4, + 0x8f + ]); + + final messageKey = Uint8List.fromList([ + 0x02, + 0xa9, + 0xaa, + 0x6c, + 0x7d, + 0xbd, + 0x64, + 0xf9, + 0xd3, + 0xaa, + 0x92, + 0xf9, + 0x2a, + 0x27, + 0x7b, + 0xf5, + 0x46, + 0x09, + 0xda, + 0xdf, + 0x0b, + 0x00, + 0x82, + 0x8a, + 0xcf, + 0xc6, + 0x1e, + 0x3c, + 0x72, + 0x4b, + 0x84, + 0xa7 + ]); + + final macKey = Uint8List.fromList([ + 0xbf, + 0xbe, + 0x5e, + 0xfb, + 0x60, + 0x30, + 0x30, + 0x52, + 0x67, + 0x42, + 0xe3, + 0xee, + 0x89, + 0xc7, + 0x02, + 0x4e, + 0x88, + 0x4e, + 0x44, + 0x0f, + 0x1f, + 0xf3, + 0x76, + 0xbb, + 0x23, + 0x17, + 0xb2, + 0xd6, + 0x4d, + 0xeb, + 0x7c, + 0x83 + ]); + + final nextChainKey = Uint8List.fromList([ + 0x28, + 0xe8, + 0xf8, + 0xfe, + 0xe5, + 0x4b, + 0x80, + 0x1e, + 0xef, + 0x7c, + 0x5c, + 0xfb, + 0x2f, + 0x17, + 0xf3, + 0x2c, + 0x7b, + 0x33, + 0x44, + 0x85, + 0xbb, + 0xb7, + 0x0f, + 0xac, + 0x6e, + 0xc1, + 0x03, + 0x42, + 0xa2, + 0x46, + 0xd1, + 0x5d + ]); + + final chainKey = ChainKey(HKDF.createFor(2), seed, 0); + + expect(chainKey.key, seed); + expect(chainKey.getMessageKeys().getCipherKey(), messageKey); + expect(chainKey.getMessageKeys().getMacKey(), macKey); + expect(chainKey.getNextChainKey().key, nextChainKey); + expect(chainKey.index, 0); + expect(chainKey.getMessageKeys().getCounter(), 0); + expect(chainKey.getNextChainKey().index, 1); + expect(chainKey.getNextChainKey().getMessageKeys().getCounter(), 1); + }); + + test('testChainKeyDerivationV3()', () { + final seed = Uint8List.fromList([ + 0x8a, + 0xb7, + 0x2d, + 0x6f, + 0x4c, + 0xc5, + 0xac, + 0x0d, + 0x38, + 0x7e, + 0xaf, + 0x46, + 0x33, + 0x78, + 0xdd, + 0xb2, + 0x8e, + 0xdd, + 0x07, + 0x38, + 0x5b, + 0x1c, + 0xb0, + 0x12, + 0x50, + 0xc7, + 0x15, + 0x98, + 0x2e, + 0x7a, + 0xd4, + 0x8f + ]); + + final messageKey = Uint8List.fromList([ + /* 0x02*/ + 0xbf, + 0x51, + 0xe9, + 0xd7, + 0x5e, + 0x0e, + 0x31, + 0x03, + 0x10, + 0x51, + 0xf8, + 0x2a, + 0x24, + 0x91, + 0xff, + 0xc0, + 0x84, + 0xfa, + 0x29, + 0x8b, + 0x77, + 0x93, + 0xbd, + 0x9d, + 0xb6, + 0x20, + 0x05, + 0x6f, + 0xeb, + 0xf4, + 0x52, + 0x17 + ]); + + final macKey = Uint8List.fromList([ + 0xc6, + 0xc7, + 0x7d, + 0x6a, + 0x73, + 0xa3, + 0x54, + 0x33, + 0x7a, + 0x56, + 0x43, + 0x5e, + 0x34, + 0x60, + 0x7d, + 0xfe, + 0x48, + 0xe3, + 0xac, + 0xe1, + 0x4e, + 0x77, + 0x31, + 0x4d, + 0xc6, + 0xab, + 0xc1, + 0x72, + 0xe7, + 0xa7, + 0x03, + 0x0b + ]); + + final nextChainKey = Uint8List.fromList([ + 0x28, + 0xe8, + 0xf8, + 0xfe, + 0xe5, + 0x4b, + 0x80, + 0x1e, + 0xef, + 0x7c, + 0x5c, + 0xfb, + 0x2f, + 0x17, + 0xf3, + 0x2c, + 0x7b, + 0x33, + 0x44, + 0x85, + 0xbb, + 0xb7, + 0x0f, + 0xac, + 0x6e, + 0xc1, + 0x03, + 0x42, + 0xa2, + 0x46, + 0xd1, + 0x5d + ]); + + final chainKey = ChainKey(HKDF.createFor(3), seed, 0); + + expect(chainKey.key, seed); + expect(chainKey.getMessageKeys().getCipherKey(), messageKey); + expect(chainKey.getMessageKeys().getMacKey(), macKey); + expect(chainKey.getNextChainKey().key, nextChainKey); + expect(chainKey.index, 0); + expect(chainKey.getMessageKeys().getCounter(), 0); + expect(chainKey.getNextChainKey().index, 1); + expect(chainKey.getNextChainKey().getMessageKeys().getCounter(), 1); + }); +} diff --git a/libsignal_protocol_dart/test/ratchet/ratcheting_session_test.dart b/libsignal_protocol_dart/test/ratchet/ratcheting_session_test.dart new file mode 100644 index 0000000..edf031e --- /dev/null +++ b/libsignal_protocol_dart/test/ratchet/ratcheting_session_test.dart @@ -0,0 +1,418 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/ecc/ec_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/identity_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/bob_signal_protocol_parameters.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/ratcheting_session.dart'; +import 'package:libsignal_protocol_dart/src/state/session_state.dart'; +import 'package:optional/optional.dart'; +import 'package:test/test.dart'; + +void main() { + test('testRatchetingSessionAsBob', () { + final bobPublic = Uint8List.fromList([ + 0x05, + 0x2c, + 0xb4, + 0x97, + 0x76, + 0xb8, + 0x77, + 0x02, + 0x05, + 0x74, + 0x5a, + 0x3a, + 0x6e, + 0x24, + 0xf5, + 0x79, + 0xcd, + 0xb4, + 0xba, + 0x7a, + 0x89, + 0x04, + 0x10, + 0x05, + 0x92, + 0x8e, + 0xbb, + 0xad, + 0xc9, + 0xc0, + 0x5a, + 0xd4, + 0x58 + ]); + + final bobPrivate = Uint8List.fromList([ + 0xa1, + 0xca, + 0xb4, + 0x8f, + 0x7c, + 0x89, + 0x3f, + 0xaf, + 0xa9, + 0x88, + 0x0a, + 0x28, + 0xc3, + 0xb4, + 0x99, + 0x9d, + 0x28, + 0xd6, + 0x32, + 0x95, + 0x62, + 0xd2, + 0x7a, + 0x4e, + 0xa4, + 0xe2, + 0x2e, + 0x9f, + 0xf1, + 0xbd, + 0xd6, + 0x5a + ]); + + final bobIdentityPublic = Uint8List.fromList([ + 0x05, + 0xf1, + 0xf4, + 0x38, + 0x74, + 0xf6, + 0x96, + 0x69, + 0x56, + 0xc2, + 0xdd, + 0x47, + 0x3f, + 0x8f, + 0xa1, + 0x5a, + 0xde, + 0xb7, + 0x1d, + 0x1c, + 0xb9, + 0x91, + 0xb2, + 0x34, + 0x16, + 0x92, + 0x32, + 0x4c, + 0xef, + 0xb1, + 0xc5, + 0xe6, + 0x26 + ]); + + final bobIdentityPrivate = Uint8List.fromList([ + 0x48, + 0x75, + 0xcc, + 0x69, + 0xdd, + 0xf8, + 0xea, + 0x07, + 0x19, + 0xec, + 0x94, + 0x7d, + 0x61, + 0x08, + 0x11, + 0x35, + 0x86, + 0x8d, + 0x5f, + 0xd8, + 0x01, + 0xf0, + 0x2c, + 0x02, + 0x25, + 0xe5, + 0x16, + 0xdf, + 0x21, + 0x56, + 0x60, + 0x5e + ]); + + final aliceBasePublic = Uint8List.fromList([ + 0x05, + 0x47, + 0x2d, + 0x1f, + 0xb1, + 0xa9, + 0x86, + 0x2c, + 0x3a, + 0xf6, + 0xbe, + 0xac, + 0xa8, + 0x92, + 0x02, + 0x77, + 0xe2, + 0xb2, + 0x6f, + 0x4a, + 0x79, + 0x21, + 0x3e, + 0xc7, + 0xc9, + 0x06, + 0xae, + 0xb3, + 0x5e, + 0x03, + 0xcf, + 0x89, + 0x50 + ]); + + final aliceEphemeralPublic = Uint8List.fromList([ + 0x05, + 0x6c, + 0x3e, + 0x0d, + 0x1f, + 0x52, + 0x02, + 0x83, + 0xef, + 0xcc, + 0x55, + 0xfc, + 0xa5, + 0xe6, + 0x70, + 0x75, + 0xb9, + 0x04, + 0x00, + 0x7f, + 0x18, + 0x81, + 0xd1, + 0x51, + 0xaf, + 0x76, + 0xdf, + 0x18, + 0xc5, + 0x1d, + 0x29, + 0xd3, + 0x4b + ]); + + final aliceIdentityPublic = Uint8List.fromList([ + 0x05, + 0xb4, + 0xa8, + 0x45, + 0x56, + 0x60, + 0xad, + 0xa6, + 0x5b, + 0x40, + 0x10, + 0x07, + 0xf6, + 0x15, + 0xe6, + 0x54, + 0x04, + 0x17, + 0x46, + 0x43, + 0x2e, + 0x33, + 0x39, + 0xc6, + 0x87, + 0x51, + 0x49, + 0xbc, + 0xee, + 0xfc, + 0xb4, + 0x2b, + 0x4a + ]); + + final bobSignedPreKeyPublic = Uint8List.fromList([ + 0x05, + 0xac, + 0x24, + 0x8a, + 0x8f, + 0x26, + 0x3b, + 0xe6, + 0x86, + 0x35, + 0x76, + 0xeb, + 0x03, + 0x62, + 0xe2, + 0x8c, + 0x82, + 0x8f, + 0x01, + 0x07, + 0xa3, + 0x37, + 0x9d, + 0x34, + 0xba, + 0xb1, + 0x58, + 0x6b, + 0xf8, + 0xc7, + 0x70, + 0xcd, + 0x67 + ]); + + final bobSignedPreKeyPrivate = Uint8List.fromList([ + 0x58, + 0x39, + 0x00, + 0x13, + 0x1f, + 0xb7, + 0x27, + 0x99, + 0x8b, + 0x78, + 0x03, + 0xfe, + 0x6a, + 0xc2, + 0x2c, + 0xc5, + 0x91, + 0xf3, + 0x42, + 0xe4, + 0xe4, + 0x2a, + 0x8c, + 0x8d, + 0x5d, + 0x78, + 0x19, + 0x42, + 0x09, + 0xb8, + 0xd2, + 0x53 + ]); + + final senderChain = Uint8List.fromList([ + 0x97, + 0x97, + 0xca, + 0xca, + 0x53, + 0xc9, + 0x89, + 0xbb, + 0xe2, + 0x29, + 0xa4, + 0x0c, + 0xa7, + 0x72, + 0x70, + 0x10, + 0xeb, + 0x26, + 0x04, + 0xfc, + 0x14, + 0x94, + 0x5d, + 0x77, + 0x95, + 0x8a, + 0x0a, + 0xed, + 0xa0, + 0x88, + 0xb4, + 0x4d + ]); + + final bobIdentityKeyPublic = IdentityKey.fromBytes(bobIdentityPublic, 0); + final bobIdentityKeyPrivate = Curve.decodePrivatePoint(bobIdentityPrivate); + final bobIdentityKey = + IdentityKeyPair(bobIdentityKeyPublic, bobIdentityKeyPrivate); + final bobEphemeralPublicKey = Curve.decodePoint(bobPublic, 0); + final bobEphemeralPrivateKey = Curve.decodePrivatePoint(bobPrivate); + final bobEphemeralKey = + ECKeyPair(bobEphemeralPublicKey, bobEphemeralPrivateKey); + // ignore: unused_local_variable + final bobBaseKey = bobEphemeralKey; + final bobSignedPreKey = ECKeyPair( + Curve.decodePoint(bobSignedPreKeyPublic, 0), + Curve.decodePrivatePoint(bobSignedPreKeyPrivate)); + + final aliceBasePublicKey = Curve.decodePoint(aliceBasePublic, 0); + // ignore: unused_local_variable + final aliceEphemeralPublicKey = Curve.decodePoint(aliceEphemeralPublic, 0); + final aliceIdentityPublicKey = + IdentityKey.fromBytes(aliceIdentityPublic, 0); + + final parameters = BobSignalProtocolParameters( + ourIdentityKey: bobIdentityKey, + ourSignedPreKey: bobSignedPreKey, + ourRatchetKey: bobEphemeralKey, + ourOneTimePreKey: const Optional.empty(), + theirIdentityKey: aliceIdentityPublicKey, + theirBaseKey: aliceBasePublicKey, + ); + + final session = SessionState(); + + RatchetingSession.initializeSessionBob(session, parameters); + + expect( + 0, + session + .getLocalIdentityKey() + .publicKey + .compareTo(bobIdentityKey.getPublicKey().publicKey)); + expect( + 0, + session + .getRemoteIdentityKey() + ?.publicKey + .compareTo(aliceIdentityPublicKey.publicKey)); + expect(session.getSenderChainKey().key, senderChain); + }); +} diff --git a/libsignal_protocol_dart/test/ratchet/root_key_test.dart b/libsignal_protocol_dart/test/ratchet/root_key_test.dart new file mode 100644 index 0000000..f2e0279 --- /dev/null +++ b/libsignal_protocol_dart/test/ratchet/root_key_test.dart @@ -0,0 +1,243 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/ecc/ec_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/kdf/hkdf.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/root_key.dart'; +import 'package:test/test.dart'; + +void main() { + test('testRootKeyDerivationV2', () { + final rootKeySeed = Uint8List.fromList([ + 0x7b, + 0xa6, + 0xde, + 0xbc, + 0x2b, + 0xc1, + 0xbb, + 0xf9, + 0x1a, + 0xbb, + 0xc1, + 0x36, + 0x74, + 0x04, + 0x17, + 0x6c, + 0xa6, + 0x23, + 0x09, + 0x5b, + 0x7e, + 0xc6, + 0x6b, + 0x45, + 0xf6, + 0x02, + 0xd9, + 0x35, + 0x38, + 0x94, + 0x2d, + 0xcc + ]); + + final alicePublic = Uint8List.fromList([ + 0x05, + 0xee, + 0x4f, + 0xa6, + 0xcd, + 0xc0, + 0x30, + 0xdf, + 0x49, + 0xec, + 0xd0, + 0xba, + 0x6c, + 0xfc, + 0xff, + 0xb2, + 0x33, + 0xd3, + 0x65, + 0xa2, + 0x7f, + 0xad, + 0xbe, + 0xff, + 0x77, + 0xe9, + 0x63, + 0xfc, + 0xb1, + 0x62, + 0x22, + 0xe1, + 0x3a + ]); + + final alicePrivate = Uint8List.fromList([ + 0x21, + 0x68, + 0x22, + 0xec, + 0x67, + 0xeb, + 0x38, + 0x04, + 0x9e, + 0xba, + 0xe7, + 0xb9, + 0x39, + 0xba, + 0xea, + 0xeb, + 0xb1, + 0x51, + 0xbb, + 0xb3, + 0x2d, + 0xb8, + 0x0f, + 0xd3, + 0x89, + 0x24, + 0x5a, + 0xc3, + 0x7a, + 0x94, + 0x8e, + 0x50 + ]); + + final bobPublic = Uint8List.fromList([ + 0x05, + 0xab, + 0xb8, + 0xeb, + 0x29, + 0xcc, + 0x80, + 0xb4, + 0x71, + 0x09, + 0xa2, + 0x26, + 0x5a, + 0xbe, + 0x97, + 0x98, + 0x48, + 0x54, + 0x06, + 0xe3, + 0x2d, + 0xa2, + 0x68, + 0x93, + 0x4a, + 0x95, + 0x55, + 0xe8, + 0x47, + 0x57, + 0x70, + 0x8a, + 0x30 + ]); + + // ignore: unused_local_variable + final nextRoot = Uint8List.fromList([ + 0xb1, + 0x14, + 0xf5, + 0xde, + 0x28, + 0x01, + 0x19, + 0x85, + 0xe6, + 0xeb, + 0xa2, + 0x5d, + 0x50, + 0xe7, + 0xec, + 0x41, + 0xa9, + 0xb0, + 0x2f, + 0x56, + 0x93, + 0xc5, + 0xc7, + 0x88, + 0xa6, + 0x3a, + 0x06, + 0xd2, + 0x12, + 0xa2, + 0xf7, + 0x31 + ]); + + // ignore: unused_local_variable + final nextChain = Uint8List.fromList([ + 0x9d, + 0x7d, + 0x24, + 0x69, + 0xbc, + 0x9a, + 0xe5, + 0x3e, + 0xe9, + 0x80, + 0x5a, + 0xa3, + 0x26, + 0x4d, + 0x24, + 0x99, + 0xa3, + 0xac, + 0xe8, + 0x0f, + 0x4c, + 0xca, + 0xe2, + 0xda, + 0x13, + 0x43, + 0x0c, + 0x5c, + 0x55, + 0xb5, + 0xca, + 0x5f + ]); + + final alicePublicKey = Curve.decodePoint(alicePublic, 0); + final alicePrivateKey = Curve.decodePrivatePoint(alicePrivate); + final aliceKeyPair = ECKeyPair(alicePublicKey, alicePrivateKey); + + final bobPublicKey = Curve.decodePoint(bobPublic, 0); + final rootKey = RootKey(HKDF.createFor(2), rootKeySeed); + + final rootKeyChainKeyPair = rootKey.createChain(bobPublicKey, aliceKeyPair); + // ignore: unused_local_variable + final nextRootKey = rootKeyChainKeyPair.$1; + // ignore: unused_local_variable + final nextChainKey = rootKeyChainKeyPair.$2; + + expect(rootKey.getKeyBytes(), rootKeySeed); + // TODO +// expect(nextRootKey.getKeyBytes(), nextRoot); +// expect(nextChainKey.getKey(), nextChain); + }); +} diff --git a/libsignal_protocol_dart/test/session_builder_test.dart b/libsignal_protocol_dart/test/session_builder_test.dart new file mode 100644 index 0000000..b095dd1 --- /dev/null +++ b/libsignal_protocol_dart/test/session_builder_test.dart @@ -0,0 +1,347 @@ +import 'dart:collection'; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:fixnum/fixnum.dart'; +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/invalid_key_exception.dart'; +import 'package:libsignal_protocol_dart/src/protocol/ciphertext_message.dart'; +import 'package:libsignal_protocol_dart/src/protocol/pre_key_signal_message.dart'; +import 'package:libsignal_protocol_dart/src/protocol/signal_message.dart'; +import 'package:libsignal_protocol_dart/src/session_builder.dart'; +import 'package:libsignal_protocol_dart/src/session_cipher.dart'; +import 'package:libsignal_protocol_dart/src/signal_protocol_address.dart'; +import 'package:libsignal_protocol_dart/src/state/pre_key_bundle.dart'; +import 'package:libsignal_protocol_dart/src/state/pre_key_record.dart'; +import 'package:libsignal_protocol_dart/src/state/signal_protocol_store.dart'; +import 'package:libsignal_protocol_dart/src/state/signed_pre_key_record.dart'; +import 'package:libsignal_protocol_dart/src/untrusted_identity_exception.dart'; +import 'package:test/test.dart'; + +import 'test_in_memory_identity_key_store.dart'; +import 'test_in_memory_signal_protocol_store.dart'; + +void main() { + const aliceAddress = SignalProtocolAddress('+14151111111', 1); + const bobAddress = SignalProtocolAddress('+14152222222', 1); + + test('testBasicPreKeyV2', () async { + final aliceStore = TestInMemorySignalProtocolStore(); + final aliceSessionBuilder = + SessionBuilder.fromSignalStore(aliceStore, bobAddress); + + final bobStore = TestInMemorySignalProtocolStore(); + final bobPreKeyPair = Curve.generateKeyPair(); + final bobPreKey = PreKeyBundle( + await bobStore.getLocalRegistrationId(), + 1, + 31337, + bobPreKeyPair.publicKey, + 0, + null, + null, + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + try { + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + throw AssertionError('Should fail with missing unsigned prekey!'); + } on InvalidKeyException { + // Good! + return; + } + }); + + Future runInteraction( + SignalProtocolStore aliceStore, SignalProtocolStore bobStore) async { + final aliceSessionCipher = SessionCipher.fromStore(aliceStore, bobAddress); + final bobSessionCipher = SessionCipher.fromStore(bobStore, aliceAddress); + + const originalMessage = 'smert ze smert'; + final aliceMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(originalMessage))); + + assert(aliceMessage.getType() == CiphertextMessage.whisperType); + + var plaintext = await bobSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceMessage.serialize())); + assert(String.fromCharCodes(plaintext) == originalMessage); + + final bobMessage = await bobSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(originalMessage))); + + assert(bobMessage.getType() == CiphertextMessage.whisperType); + + plaintext = await aliceSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobMessage.serialize())); + assert(String.fromCharCodes(plaintext) == originalMessage); + + for (var i = 0; i < 10; i++) { + final loopingMessage = + '''What do we mean by saying that existence precedes essence? + We mean that man first of all exists, encounters himself, + surges up in the world--and defines himself aftward. $i'''; + final aliceLoopingMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(loopingMessage))); + + final loopingPlaintext = await bobSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceLoopingMessage.serialize())); + assert(String.fromCharCodes(loopingPlaintext) == loopingMessage); + } + + for (var i = 0; i < 10; i++) { + final loopingMessage = + '''What do we mean by saying that existence precedes essence? + We mean that man first of all exists, encounters himself, + surges up in the world--and defines himself aftward. $i'''; + final bobLoopingMessage = await bobSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(loopingMessage))); + + final loopingPlaintext = await aliceSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobLoopingMessage.serialize())); + assert(String.fromCharCodes(loopingPlaintext) == loopingMessage); + } + + final Set<(String, CiphertextMessage)> aliceOutOfOrderMessages = + HashSet<(String, CiphertextMessage)>(); + + for (var i = 0; i < 10; i++) { + final loopingMessage = + '''What do we mean by saying that existence precedes essence? + We mean that man first of all exists, encounters himself, + surges up in the world--and defines himself aftward. $i'''; + final aliceLoopingMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(loopingMessage))); + + aliceOutOfOrderMessages.add((loopingMessage, aliceLoopingMessage)); + } + + for (var i = 0; i < 10; i++) { + final loopingMessage = + '''What do we mean by saying that existence precedes essence? + We mean that man first of all exists, encounters himself, + surges up in the world--and defines himself aftward. $i'''; + final aliceLoopingMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(loopingMessage))); + + final loopingPlaintext = await bobSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceLoopingMessage.serialize())); + assert(String.fromCharCodes(loopingPlaintext) == loopingMessage); + } + + for (var i = 0; i < 10; i++) { + final loopingMessage = 'You can only desire based on what you know: $i'; + final bobLoopingMessage = await bobSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(loopingMessage))); + + final loopingPlaintext = await aliceSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobLoopingMessage.serialize())); + assert(String.fromCharCodes(loopingPlaintext) == loopingMessage); + } + + for (final aliceOutOfOrderMessage in aliceOutOfOrderMessages) { + final outOfOrderPlaintext = await bobSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceOutOfOrderMessage.$2.serialize())); + assert(String.fromCharCodes(outOfOrderPlaintext) == + (aliceOutOfOrderMessage.$1)); + } + } + + test('testBasicPreKeyV3', () async { + var aliceStore = TestInMemorySignalProtocolStore(); + var aliceSessionBuilder = + SessionBuilder.fromSignalStore(aliceStore, bobAddress); + + final bobStore = TestInMemorySignalProtocolStore(); + var bobPreKeyPair = Curve.generateKeyPair(); + var bobSignedPreKeyPair = Curve.generateKeyPair(); + var bobSignedPreKeySignature = Curve.calculateSignature( + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPrivateKey()), + bobSignedPreKeyPair.publicKey.serialize()); + + var bobPreKey = PreKeyBundle( + await bobStore.getLocalRegistrationId(), + 1, + 31337, + bobPreKeyPair.publicKey, + 22, + bobSignedPreKeyPair.publicKey, + bobSignedPreKeySignature, + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + + assert(await aliceStore.containsSession(bobAddress)); + assert(await aliceStore + .loadSession(bobAddress) + .then((value) => value.sessionState.getSessionVersion()) == + 3); + + const originalMessage = "L'homme est condamné à être libre"; + var aliceSessionCipher = SessionCipher.fromStore(aliceStore, bobAddress); + var outgoingMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(originalMessage))); + assert(outgoingMessage.getType() == CiphertextMessage.prekeyType); + + final incomingMessage = PreKeySignalMessage(outgoingMessage.serialize()); + await bobStore.storePreKey( + 31337, PreKeyRecord(bobPreKey.getPreKeyId()!, bobPreKeyPair)); + await bobStore.storeSignedPreKey( + 22, + SignedPreKeyRecord(22, Int64(DateTime.now().millisecondsSinceEpoch), + bobSignedPreKeyPair, bobSignedPreKeySignature)); + + final bobSessionCipher = SessionCipher.fromStore(bobStore, aliceAddress); + var plaintext = await bobSessionCipher.decryptWithCallback(incomingMessage, + (plaintext) async { + final result = utf8.decode(plaintext, allowMalformed: true); + assert(originalMessage == result); + assert(!await bobStore.containsSession(aliceAddress)); + }); + + assert(await bobStore.containsSession(aliceAddress)); + assert(await bobStore + .loadSession(aliceAddress) + .then((value) => value.sessionState.getSessionVersion()) == + 3); + assert(originalMessage == utf8.decode(plaintext, allowMalformed: true)); + + final bobOutgoingMessage = await bobSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(originalMessage))); + assert(bobOutgoingMessage.getType() == CiphertextMessage.whisperType); + + final alicePlaintext = await aliceSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobOutgoingMessage.serialize())); + assert( + utf8.decode(alicePlaintext, allowMalformed: true) == originalMessage); + + await runInteraction(aliceStore, bobStore); + + aliceStore = TestInMemorySignalProtocolStore(); + aliceSessionBuilder = + SessionBuilder.fromSignalStore(aliceStore, bobAddress); + aliceSessionCipher = SessionCipher.fromStore(aliceStore, bobAddress); + + bobPreKeyPair = Curve.generateKeyPair(); + bobSignedPreKeyPair = Curve.generateKeyPair(); + bobSignedPreKeySignature = Curve.calculateSignature( + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPrivateKey()), + bobSignedPreKeyPair.publicKey.serialize()); + bobPreKey = PreKeyBundle( + await bobStore.getLocalRegistrationId(), + 1, + 31338, + bobPreKeyPair.publicKey, + 23, + bobSignedPreKeyPair.publicKey, + bobSignedPreKeySignature, + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + + await bobStore.storePreKey( + 31338, PreKeyRecord(bobPreKey.getPreKeyId()!, bobPreKeyPair)); + await bobStore.storeSignedPreKey( + 23, + SignedPreKeyRecord(23, Int64(DateTime.now().millisecondsSinceEpoch), + bobSignedPreKeyPair, bobSignedPreKeySignature)); + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + + outgoingMessage = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(originalMessage))); + + try { + plaintext = await bobSessionCipher + .decrypt(PreKeySignalMessage(outgoingMessage.serialize())); + throw AssertionError("shouldn't be trusted!"); + } on UntrustedIdentityException { + await bobStore.saveIdentity(aliceAddress, + PreKeySignalMessage(outgoingMessage.serialize()).getIdentityKey()); + } + + plaintext = await bobSessionCipher + .decrypt(PreKeySignalMessage(outgoingMessage.serialize())); + assert(utf8.decode(plaintext, allowMalformed: true) == originalMessage); + + bobPreKey = PreKeyBundle( + await bobStore.getLocalRegistrationId(), + 1, + 31337, + Curve.generateKeyPair().publicKey, + 23, + bobSignedPreKeyPair.publicKey, + bobSignedPreKeySignature, + await aliceStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + + try { + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + throw AssertionError("shoulnd't be trusted!"); + } on UntrustedIdentityException { + // good + } + }); + + test('testBadSignedPreKeySignature', () async { + final aliceStore = TestInMemorySignalProtocolStore(); + final aliceSessionBuilder = + SessionBuilder.fromSignalStore(aliceStore, bobAddress); + + final bobIdentityKeyStore = TestInMemoryIdentityKeyStore(); + + final bobPreKeyPair = Curve.generateKeyPair(); + final bobSignedPreKeyPair = Curve.generateKeyPair(); + final bobSignedPreKeySignature = Curve.calculateSignature( + await bobIdentityKeyStore + .getIdentityKeyPair() + .then((value) => value.getPrivateKey()), + bobSignedPreKeyPair.publicKey.serialize()); + + for (var i = 0; i < bobSignedPreKeySignature.length * 8; i++) { + final modifiedSignature = Uint8List(bobSignedPreKeySignature.length); + Curve.arraycopy(bobSignedPreKeySignature, 0, modifiedSignature, 0, + modifiedSignature.length); + + modifiedSignature[i ~/ 8] ^= 0x01 << (i % 8); + + final bobPreKey = PreKeyBundle( + await bobIdentityKeyStore.getLocalRegistrationId(), + 1, + 31337, + bobPreKeyPair.publicKey, + 22, + bobSignedPreKeyPair.publicKey, + modifiedSignature, + await bobIdentityKeyStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + + try { + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + throw AssertionError('Accepted modified device key signature!'); + } on InvalidKeyException { + // good + } + } + + final bobPreKey = PreKeyBundle( + await bobIdentityKeyStore.getLocalRegistrationId(), + 1, + 31337, + bobPreKeyPair.publicKey, + 22, + bobSignedPreKeyPair.publicKey, + bobSignedPreKeySignature, + await bobIdentityKeyStore + .getIdentityKeyPair() + .then((value) => value.getPublicKey())); + + await aliceSessionBuilder.processPreKeyBundle(bobPreKey); + }); +} diff --git a/libsignal_protocol_dart/test/session_cipher_test.dart b/libsignal_protocol_dart/test/session_cipher_test.dart new file mode 100644 index 0000000..2ba7083 --- /dev/null +++ b/libsignal_protocol_dart/test/session_cipher_test.dart @@ -0,0 +1,256 @@ +import 'dart:convert'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/duplicate_message_exception.dart'; +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/ecc/ec_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/ecc/ec_public_key.dart'; +import 'package:libsignal_protocol_dart/src/eq.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/identity_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/protocol/ciphertext_message.dart'; +import 'package:libsignal_protocol_dart/src/protocol/signal_message.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/alice_signal_protocol_parameters.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/bob_signal_protocol_parameters.dart'; +import 'package:libsignal_protocol_dart/src/ratchet/ratcheting_session.dart'; +import 'package:libsignal_protocol_dart/src/session_cipher.dart'; +import 'package:libsignal_protocol_dart/src/signal_protocol_address.dart'; +import 'package:libsignal_protocol_dart/src/state/session_record.dart'; +import 'package:libsignal_protocol_dart/src/state/session_state.dart'; +import 'package:optional/optional.dart'; +import 'package:test/test.dart'; + +import 'test_in_memory_signal_protocol_store.dart'; + +Future main() async { + const integerMax = 0x7fffffff; + + int randomInt() { + final secureRandom = Random.secure(); + return secureRandom.nextInt(integerMax); + } + + Future runInteraction( + SessionRecord aliceSessionRecord, SessionRecord bobSessionRecord) async { + final aliceStore = TestInMemorySignalProtocolStore(); + final bobStore = TestInMemorySignalProtocolStore(); + + await aliceStore.storeSession( + const SignalProtocolAddress('+14159999999', 1), aliceSessionRecord); + await bobStore.storeSession( + const SignalProtocolAddress('+14158888888', 1), bobSessionRecord); + + final aliceCipher = SessionCipher.fromStore( + aliceStore, const SignalProtocolAddress('+14159999999', 1)); + final bobCipher = SessionCipher.fromStore( + bobStore, const SignalProtocolAddress('+14158888888', 1)); + + final alicePlaintext = + Uint8List.fromList(utf8.encode('This is a plaintext message.')); + final message = await aliceCipher.encrypt(alicePlaintext); + final bobPlaintext = await bobCipher + .decryptFromSignal(SignalMessage.fromSerialized(message.serialize())); + + assert(eq(alicePlaintext, bobPlaintext)); + + final bobReply = + Uint8List.fromList(utf8.encode('This is a message from Bob.')); + final reply = await bobCipher.encrypt(bobReply); + final receivedReply = await aliceCipher + .decryptFromSignal(SignalMessage.fromSerialized(reply.serialize())); + + assert(eq(bobReply, receivedReply)); + + final aliceCiphertextMessages = []; + final alicePlaintextMessages = []; + + for (var i = 0; i < 50; i++) { + alicePlaintextMessages + .add(Uint8List.fromList(utf8.encode('смерть за смерть $i'))); + aliceCiphertextMessages.add(await aliceCipher + .encrypt(Uint8List.fromList(utf8.encode('смерть за смерть $i')))); + } + + var seed = DateTime.now().microsecondsSinceEpoch; + + aliceCiphertextMessages.shuffle(Random(seed)); + alicePlaintextMessages.shuffle(Random(seed)); + + for (var i = 0; i < aliceCiphertextMessages.length / 2; i++) { + final receivedPlaintext = await bobCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceCiphertextMessages[i].serialize())); + assert(eq(receivedPlaintext, alicePlaintextMessages[i])); + } + + final bobCiphertextMessages = []; + final bobPlaintextMessages = []; + + for (var i = 0; i < 20; i++) { + bobPlaintextMessages + .add(Uint8List.fromList(utf8.encode('смерть за смерть $i'))); + bobCiphertextMessages.add(await bobCipher + .encrypt(Uint8List.fromList(utf8.encode('смерть за смерть $i')))); + } + + seed = DateTime.now().millisecondsSinceEpoch; + + bobCiphertextMessages.shuffle(Random(seed)); + bobPlaintextMessages.shuffle(Random(seed)); + + for (var i = 0; i < bobCiphertextMessages.length / 2; i++) { + final receivedPlaintext = await aliceCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobCiphertextMessages[i].serialize())); + assert(eq(receivedPlaintext, bobPlaintextMessages[i])); + } + + for (var i = aliceCiphertextMessages.length ~/ 2; + i < aliceCiphertextMessages.length; + i++) { + final receivedPlaintext = await bobCipher.decryptFromSignal( + SignalMessage.fromSerialized(aliceCiphertextMessages[i].serialize())); + assert(eq(receivedPlaintext, alicePlaintextMessages[i])); + } + + for (var i = bobCiphertextMessages.length ~/ 2; + i < bobCiphertextMessages.length; + i++) { + final receivedPlaintext = await aliceCipher.decryptFromSignal( + SignalMessage.fromSerialized(bobCiphertextMessages[i].serialize())); + assert(eq(receivedPlaintext, bobPlaintextMessages[i])); + } + } + + Future initializeSessionsV3( + SessionState aliceSessionState, SessionState bobSessionState) async { + final aliceIdentityKeyPair = Curve.generateKeyPair(); + final aliceIdentityKey = IdentityKeyPair( + IdentityKey(aliceIdentityKeyPair.publicKey), + aliceIdentityKeyPair.privateKey); + final aliceBaseKey = Curve.generateKeyPair(); + // ignore: unused_local_variable + final aliceEphemeralKey = Curve.generateKeyPair(); + + // ignore: unused_local_variable + final alicePreKey = aliceBaseKey; + + final bobIdentityKeyPair = Curve.generateKeyPair(); + final bobIdentityKey = IdentityKeyPair( + IdentityKey(bobIdentityKeyPair.publicKey), + bobIdentityKeyPair.privateKey); + final bobBaseKey = Curve.generateKeyPair(); + final bobEphemeralKey = bobBaseKey; + + // ignore: unused_local_variable + final bobPreKey = Curve.generateKeyPair(); + + final aliceParameters = AliceSignalProtocolParameters( + ourBaseKey: aliceBaseKey, + ourIdentityKey: aliceIdentityKey, + theirOneTimePreKey: const Optional.empty(), + theirRatchetKey: bobEphemeralKey.publicKey, + theirSignedPreKey: bobBaseKey.publicKey, + theirIdentityKey: bobIdentityKey.getPublicKey(), + ); + + final bobParameters = BobSignalProtocolParameters( + ourRatchetKey: bobEphemeralKey, + ourSignedPreKey: bobBaseKey, + ourOneTimePreKey: const Optional.empty(), + ourIdentityKey: bobIdentityKey, + theirIdentityKey: aliceIdentityKey.getPublicKey(), + theirBaseKey: aliceBaseKey.publicKey, + ); + + RatchetingSession.initializeSessionAlice( + aliceSessionState, aliceParameters); + RatchetingSession.initializeSessionBob(bobSessionState, bobParameters); + } + + test('testBasicSessionV3', () async { + final aliceSessionRecord = SessionRecord(); + final bobSessionRecord = SessionRecord(); + + await initializeSessionsV3( + aliceSessionRecord.sessionState, bobSessionRecord.sessionState); + await runInteraction(aliceSessionRecord, bobSessionRecord); + }); + + test('testMessageKeyLimits', () async { + final aliceSessionRecord = SessionRecord(); + final bobSessionRecord = SessionRecord(); + + await initializeSessionsV3( + aliceSessionRecord.sessionState, bobSessionRecord.sessionState); + + final aliceStore = TestInMemorySignalProtocolStore(); + final bobStore = TestInMemorySignalProtocolStore(); + + await aliceStore.storeSession( + const SignalProtocolAddress('+14159999999', 1), aliceSessionRecord); + await bobStore.storeSession( + const SignalProtocolAddress('+14158888888', 1), bobSessionRecord); + + final aliceCipher = SessionCipher.fromStore( + aliceStore, const SignalProtocolAddress('+14159999999', 1)); + final bobCipher = SessionCipher.fromStore( + bobStore, const SignalProtocolAddress('+14158888888', 1)); + + final inflight = []; + + for (var i = 0; i < 2010; i++) { + inflight.add(await aliceCipher.encrypt(Uint8List.fromList(utf8 + .encode("you've never been so hungry, you've never been so cold")))); + } + + await bobCipher.decryptFromSignal( + SignalMessage.fromSerialized(inflight[1000].serialize())); + await bobCipher.decryptFromSignal(SignalMessage.fromSerialized( + inflight[inflight.length - 1].serialize())); + + try { + await bobCipher.decryptFromSignal( + SignalMessage.fromSerialized(inflight[0].serialize())); + throw AssertionError('Should have failed!'); + } on DuplicateMessageException { + // good + } + }); + + test('testOutOfOrder', () async { + final aliceSessionRecord = SessionRecord(); + final bobSessionRecord = SessionRecord(); + + await initializeSessionsV3( + aliceSessionRecord.sessionState, bobSessionRecord.sessionState); + + final aliceStore = TestInMemorySignalProtocolStore(); + final bobStore = TestInMemorySignalProtocolStore(); + + await aliceStore.storeSession( + const SignalProtocolAddress('+14159999999', 1), aliceSessionRecord); + await bobStore.storeSession( + const SignalProtocolAddress('+14158888888', 1), bobSessionRecord); + + final aliceCipher = SessionCipher.fromStore( + aliceStore, const SignalProtocolAddress('+14159999999', 1)); + final bobCipher = SessionCipher.fromStore( + bobStore, const SignalProtocolAddress('+14158888888', 1)); + + final inflight = []; + + for (var i = 0; i < 2000; i++) { + inflight.add(await aliceCipher + .encrypt(Uint8List.fromList(utf8.encode('up the punks')))); + } + + while (inflight.isNotEmpty) { + final index = randomInt() % inflight.length; + final ciphertext = inflight.removeAt(index); + final plaintext = await bobCipher.decryptFromSignal( + SignalMessage.fromSerialized(ciphertext.serialize())); + + assert(utf8.decode(plaintext) == 'up the punks'); + } + }); +} diff --git a/libsignal_protocol_dart/test/state/impl/in_memory_identity_key_store_test.dart b/libsignal_protocol_dart/test/state/impl/in_memory_identity_key_store_test.dart new file mode 100644 index 0000000..f2faa1e --- /dev/null +++ b/libsignal_protocol_dart/test/state/impl/in_memory_identity_key_store_test.dart @@ -0,0 +1,42 @@ +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/identity_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/signal_protocol_address.dart'; +import 'package:libsignal_protocol_dart/src/state/impl/in_memory_identity_key_store.dart'; +import 'package:libsignal_protocol_dart/src/util/key_helper.dart'; +import 'package:test/test.dart'; + +void main() { + test('should implement interface successfully', () async { + final keyPair = Curve.generateKeyPair(); + final identityKey = IdentityKey(keyPair.publicKey); + final identityKeyPair = IdentityKeyPair(identityKey, keyPair.privateKey); + final registrationId = generateRegistrationId(false); + final store = InMemoryIdentityKeyStore(identityKeyPair, registrationId); + const address = SignalProtocolAddress('address-1', 123); + + // getIdentityKeyPair + expect(await store.getIdentityKeyPair(), identityKeyPair); + + // getLocalRegistrationId + expect(await store.getLocalRegistrationId(), registrationId); + + // getIdentity + // TODO + // expect(store.getIdentity(address), null); + + // saveIdentity & getIdentity + expect(await store.saveIdentity(address, identityKey), true); + expect( + await store.getIdentity(address).then((value) => value?.getFingerprint()), + identityKey.getFingerprint(), + ); + expect(await store.saveIdentity(address, identityKey), false); + + // isTrustedIdentity + expect(await store.isTrustedIdentity(address, identityKey, null), true); + // expect(store.isTrustedIdentity(null, identityKey, null), true); + final newIdentityKey = IdentityKey(Curve.generateKeyPair().publicKey); + expect(await store.isTrustedIdentity(address, newIdentityKey, null), false); + }); +} diff --git a/libsignal_protocol_dart/test/state/impl/in_memory_pre_key_store_test.dart b/libsignal_protocol_dart/test/state/impl/in_memory_pre_key_store_test.dart new file mode 100644 index 0000000..6640ae7 --- /dev/null +++ b/libsignal_protocol_dart/test/state/impl/in_memory_pre_key_store_test.dart @@ -0,0 +1,26 @@ +import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:test/test.dart'; + +void main() { + test('should implement interface successfully', () async { + final store = InMemoryPreKeyStore(); + final preKeys = generatePreKeys(1, 2); + + // storePreKey + await store.storePreKey(1, preKeys[0]); + await store.storePreKey(2, preKeys[1]); + + // containsPreKey + expect(await store.containsPreKey(1), true); + expect(await store.containsPreKey(2), true); + expect(await store.containsPreKey(3), false); + + // loadPreKey + expect(await store.loadPreKey(2).then((value) => value.serialize()), + preKeys[1].serialize()); + + // removePreKey & loadPreKey + await store.removePreKey(2); + expect(() => store.loadPreKey(2), throwsA(isA())); + }); +} diff --git a/libsignal_protocol_dart/test/state/impl/in_memory_session_store_test.dart b/libsignal_protocol_dart/test/state/impl/in_memory_session_store_test.dart new file mode 100644 index 0000000..07cc867 --- /dev/null +++ b/libsignal_protocol_dart/test/state/impl/in_memory_session_store_test.dart @@ -0,0 +1,48 @@ +import 'package:collection/collection.dart'; +import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:test/test.dart'; + +void main() { + test('should implement interface successfully', () async { + const address1 = SignalProtocolAddress('address-1', 123); + const address2a = SignalProtocolAddress('address-2', 123); + const address2b = SignalProtocolAddress('address-2', 456); + final store = InMemorySessionStore(); + + // containsSession & loadSession + expect(await store.containsSession(address1), false); + final sessionRecord1 = await store.loadSession(address1); + await store.storeSession(address1, sessionRecord1); + expect(await store.containsSession(address1), true); + + // loadSession & storeSession + final sessionRecord2 = await store.loadSession(address1); + await store.storeSession(address2a, sessionRecord2); + await store.storeSession(address2b, sessionRecord2); + + // getSubDeviceSessions + final subDeviceSessions1 = + await store.getSubDeviceSessions(address1.getName()); + expect(subDeviceSessions1.length, 1); + expect(subDeviceSessions1, [123]); + final subDeviceSessions2 = + await store.getSubDeviceSessions(address2a.getName()); + expect(subDeviceSessions2.length, 2); + expect( + const SetEquality().equals( + subDeviceSessions2.toSet(), + {123, 456}.toSet(), + ), + true); + + // deleteSession & containsSession + expect(await store.containsSession(address2a), true); + await store.deleteSession(address2a); + expect(await store.containsSession(address2a), false); + + // deleteAllSessions & containsSession + expect(await store.containsSession(address2b), true); + await store.deleteAllSessions(address2b.getName()); + expect(await store.containsSession(address2b), false); + }); +} diff --git a/libsignal_protocol_dart/test/state/impl/in_memory_signal_protocol_store_test.dart b/libsignal_protocol_dart/test/state/impl/in_memory_signal_protocol_store_test.dart new file mode 100644 index 0000000..70a7301 --- /dev/null +++ b/libsignal_protocol_dart/test/state/impl/in_memory_signal_protocol_store_test.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; +import 'dart:typed_data'; +import 'package:fixnum/fixnum.dart'; +import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:test/test.dart'; + +import '../../test_in_memory_signal_protocol_store.dart'; + +void main() { + test('should encrypt/decrypt message from Alice, to Bob and back again', + () async { + final aliceStore = TestInMemorySignalProtocolStore(); + final bobStore = TestInMemorySignalProtocolStore(); + const msgOrig = "L'homme est condamné à être libre"; + + const aliceAddress = SignalProtocolAddress('alice', 1); + const bobAddress = SignalProtocolAddress('bob', 1); + + // Bob creates his keys to store locally and to publish public to cloud + final bobPreKeyPair = Curve.generateKeyPair(); + final bobSignedPreKeyPair = Curve.generateKeyPair(); + final bobSignedPreKeySignature = Curve.calculateSignature( + await bobStore + .getIdentityKeyPair() + .then((value) => value.getPrivateKey()), + bobSignedPreKeyPair.publicKey.serialize(), + ); + + // + // Alice to encrypt and send to Bob... + // + + // Pretend that Alice has downloaded Bob's pre key bundle from the cloud + final bobPreKey = PreKeyBundle( + await bobStore.getLocalRegistrationId(), + 1, + 31337, + bobPreKeyPair.publicKey, + 22, + bobSignedPreKeyPair.publicKey, + bobSignedPreKeySignature, + await bobStore.getIdentityKeyPair().then((value) => value.getPublicKey()), + ); + + await SessionBuilder.fromSignalStore(aliceStore, bobAddress) + .processPreKeyBundle(bobPreKey); + + final aliceSessionCipher = SessionCipher.fromStore(aliceStore, bobAddress); + final msgAliceToBob = await aliceSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(msgOrig))); + + // Pretend that Alice has now sent the message to Bob + + // + // Bob to decrypt... + // + + await bobStore.storePreKey( + 31337, + PreKeyRecord(bobPreKey.getPreKeyId()!, bobPreKeyPair), + ); + await bobStore.storeSignedPreKey( + 22, + SignedPreKeyRecord( + 22, + Int64(DateTime.now().millisecondsSinceEpoch), + bobSignedPreKeyPair, + bobSignedPreKeySignature, + ), + ); + + final msgIn = PreKeySignalMessage(msgAliceToBob.serialize()); + expect( + msgIn.getType(), + CiphertextMessage.prekeyType, + ); + + final bobSessionCipher = SessionCipher.fromStore(bobStore, aliceAddress); + var msgDecrypted = await bobSessionCipher.decrypt(msgIn); + var msgDecoded = utf8.decode(msgDecrypted, allowMalformed: true); + expect(msgDecoded, msgOrig); + + // + // Bob to encrypt and send to Alice... + // + + final msgBobToAlice = await bobSessionCipher + .encrypt(Uint8List.fromList(utf8.encode(msgDecoded))); + expect( + msgBobToAlice.getType(), + CiphertextMessage.whisperType, + ); + + // + // Alice to decrypt... + // + + msgDecrypted = await aliceSessionCipher.decryptFromSignal( + SignalMessage.fromSerialized(msgBobToAlice.serialize()), + ); + msgDecoded = utf8.decode(msgDecrypted, allowMalformed: true); + expect(msgDecoded, msgOrig); + }); +} diff --git a/libsignal_protocol_dart/test/state/impl/in_memory_signed_pre_key_store_test.dart b/libsignal_protocol_dart/test/state/impl/in_memory_signed_pre_key_store_test.dart new file mode 100644 index 0000000..01e6594 --- /dev/null +++ b/libsignal_protocol_dart/test/state/impl/in_memory_signed_pre_key_store_test.dart @@ -0,0 +1,41 @@ +import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:test/test.dart'; + +void main() { + test('should implement interface successfully', () async { + final store = InMemorySignedPreKeyStore(); + final signedPreKeyRecord1 = _generateSignedPreKey(1); + final signedPreKeyRecord2 = _generateSignedPreKey(2); + + // storeSignedPreKey + await store.storeSignedPreKey(1, signedPreKeyRecord1); + await store.storeSignedPreKey(2, signedPreKeyRecord2); + + // containsSignedPreKey + expect(await store.containsSignedPreKey(1), true); + expect(await store.containsSignedPreKey(2), true); + expect(await store.containsSignedPreKey(3), false); + + // loadSignedPreKey + expect(await store.loadSignedPreKey(1).then((value) => value.id), 1); + expect(await store.loadSignedPreKey(2).then((value) => value.id), 2); + + // loadSignedPreKey + expect(() => store.loadSignedPreKey(10), + throwsA(isA())); + + // loadSignedPreKeys + final signedPreKeys = await store.loadSignedPreKeys(); + expect(signedPreKeys.length, 2); + expect(signedPreKeys[0].id, 1); + expect(signedPreKeys[1].id, 2); + + // removeSignedPreKey & containsSignedPreKey + await store.removeSignedPreKey(1); + expect(await store.containsSignedPreKey(1), false); + expect(await store.containsSignedPreKey(2), true); + }); +} + +SignedPreKeyRecord _generateSignedPreKey(int signedPreKeyId) => + generateSignedPreKey(generateIdentityKeyPair(), signedPreKeyId); diff --git a/libsignal_protocol_dart/test/test_in_memory_identity_key_store.dart b/libsignal_protocol_dart/test/test_in_memory_identity_key_store.dart new file mode 100644 index 0000000..f03062d --- /dev/null +++ b/libsignal_protocol_dart/test/test_in_memory_identity_key_store.dart @@ -0,0 +1,19 @@ +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/identity_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/state/impl/in_memory_identity_key_store.dart'; +import 'package:libsignal_protocol_dart/src/util/key_helper.dart'; + +class TestInMemoryIdentityKeyStore extends InMemoryIdentityKeyStore { + TestInMemoryIdentityKeyStore() + : super(_generateIdentityKeyPair(), _generateRegistrationId()); + + static IdentityKeyPair _generateIdentityKeyPair() { + final identityKeyPairKeys = Curve.generateKeyPair(); + + return IdentityKeyPair(IdentityKey(identityKeyPairKeys.publicKey), + identityKeyPairKeys.privateKey); + } + + static int _generateRegistrationId() => generateRegistrationId(false); +} diff --git a/libsignal_protocol_dart/test/test_in_memory_signal_protocol_store.dart b/libsignal_protocol_dart/test/test_in_memory_signal_protocol_store.dart new file mode 100644 index 0000000..f5c3cce --- /dev/null +++ b/libsignal_protocol_dart/test/test_in_memory_signal_protocol_store.dart @@ -0,0 +1,19 @@ +import 'package:libsignal_protocol_dart/src/ecc/curve.dart'; +import 'package:libsignal_protocol_dart/src/identity_key.dart'; +import 'package:libsignal_protocol_dart/src/identity_key_pair.dart'; +import 'package:libsignal_protocol_dart/src/state/impl/in_memory_signal_protocol_store.dart'; +import 'package:libsignal_protocol_dart/src/util/key_helper.dart'; + +class TestInMemorySignalProtocolStore extends InMemorySignalProtocolStore { + TestInMemorySignalProtocolStore() + : super(_generateIdentityKeyPair(), _generateRegistrationId()); + + static IdentityKeyPair _generateIdentityKeyPair() { + final identityKeyPairKeys = Curve.generateKeyPair(); + + return IdentityKeyPair(IdentityKey(identityKeyPairKeys.publicKey), + identityKeyPairKeys.privateKey); + } + + static int _generateRegistrationId() => generateRegistrationId(false); +} diff --git a/libsignal_protocol_dart/test/util/byte_util_test.dart b/libsignal_protocol_dart/test/util/byte_util_test.dart new file mode 100644 index 0000000..69f3a22 --- /dev/null +++ b/libsignal_protocol_dart/test/util/byte_util_test.dart @@ -0,0 +1,113 @@ +import 'dart:typed_data'; + +import 'package:libsignal_protocol_dart/src/util/byte_util.dart'; +import 'package:test/test.dart'; + +void main() { + test('ByteUtil.combime() combile multi Uintlist8 into 1', () { + final first = Uint8List.fromList([1]); + final second = Uint8List.fromList([2, 3]); + final third = Uint8List.fromList([4, 5]); + final other = Uint8List.fromList([1, 2, 3, 4, 5]); + expect(ByteUtil.combine([first, second, third]), other); + }); + + test('ByteUtil.shortToByteArray() convert short to UintList8', () { + const value1 = 100; + expect(ByteUtil.shortToByteArray(value1), Uint8List.fromList([0, 100])); + const value2 = 1024; + expect(ByteUtil.shortToByteArray(value2), Uint8List.fromList([4, 1024])); + }); + + test('ByteUtil.intToByteArray() convert int to UintList8', () { + const value1 = 100; + expect(ByteUtil.intToByteArray(value1), Uint8List.fromList([0, 0, 0, 100])); + const value2 = 1024; + expect(ByteUtil.intToByteArray(value2), Uint8List.fromList([0, 0, 4, 0])); + }); + + test('ByteUtil.trim() sublist Uint8List from 0 to specification length', () { + final input = Uint8List.fromList([1, 2, 3, 4, 5]); + expect(ByteUtil.trim(input, 3), Uint8List.fromList([1, 2, 3])); + expect(ByteUtil.trim(input, 0), Uint8List.fromList([])); + }); + + test('ByteUtil.split() splits the string to three length', () { + final input = Uint8List.fromList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + final first = Uint8List.fromList([1]); + final second = Uint8List.fromList([2, 3]); + final third = Uint8List.fromList([4, 5, 6, 7, 8, 9]); + expect(ByteUtil.split(input, 1, 2, 6), [first, second, third]); + }); + + test('ByteUtil.splitTwo() splits the string to two length', () { + final input = Uint8List.fromList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + final first = Uint8List.fromList([1]); + final second = Uint8List.fromList([2, 3, 4, 5, 6, 7]); + expect(ByteUtil.splitTwo(input, 1, 6), [first, second]); + }); + + test('String.trim() removes surrounding whitespace', () { + const string = ' foo '; + expect(string.trim(), equals('foo')); + }); + + test('ByteUtil.intsToByteHighAndLow()', () { + const highValue1 = 4; + const lowValue1 = 2; + expect(ByteUtil.intsToByteHighAndLow(highValue1, lowValue1), 66); + const highValue2 = 2; + const lowValue2 = 4; + expect(ByteUtil.intsToByteHighAndLow(highValue2, lowValue2), 36); + const highValue3 = 3; + const lowValue3 = 3; + expect(ByteUtil.intsToByteHighAndLow(highValue3, lowValue3), 51); + }); + + test('ByteUtil.highBitsToInt', () { + const int1 = 16; + expect(ByteUtil.highBitsToInt(int1), 1); + const int2 = 35; + expect(ByteUtil.highBitsToInt(int2), 2); + const int3 = 100; + expect(ByteUtil.highBitsToInt(int3), 6); + }); + + test('ByteUtil.lowBitsToInt', () { + const int1 = 16; + expect(ByteUtil.lowBitsToInt(int1), 0); + const int2 = 35; + expect(ByteUtil.lowBitsToInt(int2), 3); + const int3 = 100; + expect(ByteUtil.lowBitsToInt(int3), 4); + }); + + test('ByteUtil.highBitsToMedium', () { + const int1 = 16; + expect(ByteUtil.highBitsToMedium(int1), 0); + const int2 = 35; + expect(ByteUtil.highBitsToMedium(int2), 0); + const int3 = 100; + expect(ByteUtil.highBitsToMedium(int3), 0); + const int4 = 10000; + expect(ByteUtil.highBitsToMedium(int4), 2); + }); + + test('ByteUtil.lowBitsToMedium', () { + const int1 = 16; + expect(ByteUtil.lowBitsToMedium(int1), 16); + const int2 = 35; + expect(ByteUtil.lowBitsToMedium(int2), 35); + const int3 = 100; + expect(ByteUtil.lowBitsToMedium(int3), 100); + const int4 = 10000; + expect(ByteUtil.lowBitsToMedium(int4), 1808); + }); + + test('ByteUtil.byteArray5ToLong', () { + // ignore: unused_local_variable + final input = Uint8List.fromList( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + // TODO + }); +} diff --git a/lottie/LICENSE b/lottie/LICENSE new file mode 100644 index 0000000..8aa2645 --- /dev/null +++ b/lottie/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lottie/lib/lottie.dart b/lottie/lib/lottie.dart new file mode 100644 index 0000000..728031e --- /dev/null +++ b/lottie/lib/lottie.dart @@ -0,0 +1,19 @@ +export 'src/composition.dart' show LottieComposition, LottieDecoder; +export 'src/frame_rate.dart' show FrameRate; +export 'src/lottie.dart' show Lottie; +export 'src/lottie_builder.dart' show LottieBuilder; +export 'src/lottie_delegates.dart' show LottieDelegates; +export 'src/lottie_drawable.dart' show LottieDrawable, LottieFontStyle; +export 'src/lottie_image_asset.dart' show LottieImageAsset; +export 'src/model/marker.dart' show Marker; +export 'src/options.dart' show LottieOptions; +export 'src/providers/asset_provider.dart' show AssetLottie; +export 'src/providers/file_provider.dart' show FileLottie; +export 'src/providers/load_image.dart' show LottieImageProviderFactory; +export 'src/providers/lottie_provider.dart' show LottieCache, LottieProvider; +export 'src/providers/memory_provider.dart' show MemoryLottie; +export 'src/providers/network_provider.dart' show NetworkLottie; +export 'src/raw_lottie.dart' show RawLottie; +export 'src/render_cache.dart' show RenderCache; +export 'src/value/drop_shadow.dart' show DropShadow; +export 'src/value_delegate.dart' show ValueDelegate; diff --git a/lottie/lib/src/animation/content/base_stroke_content.dart b/lottie/lib/src/animation/content/base_stroke_content.dart new file mode 100644 index 0000000..789657d --- /dev/null +++ b/lottie/lib/src/animation/content/base_stroke_content.dart @@ -0,0 +1,424 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:flutter/foundation.dart'; +import 'package:vector_math/vector_math_64.dart'; +import '../../l.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/animatable/animatable_double_value.dart'; +import '../../model/animatable/animatable_integer_value.dart'; +import '../../model/content/drop_shadow_effect.dart'; +import '../../model/content/shape_trim_path.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/dash_path.dart'; +import '../../utils/misc.dart'; +import '../../utils/utils.dart'; +import '../../value/drop_shadow.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/drop_shadow_keyframe_animation.dart'; +import '../keyframe/value_callback_keyframe_animation.dart'; +import 'content.dart'; +import 'drawing_content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; +import 'trim_path_content.dart'; + +abstract class BaseStrokeContent + implements KeyPathElementContent, DrawingContent { + final Path _path = Path(); + final Path _trimPathPath = Path(); + final LottieDrawable lottieDrawable; + final BaseLayer layer; + final List<_PathGroup> _pathGroups = <_PathGroup>[]; + final List _dashPatternValues; + final Paint paint = Paint()..style = PaintingStyle.stroke; + + final BaseKeyframeAnimation _widthAnimation; + final BaseKeyframeAnimation _opacityAnimation; + final List> _dashPatternAnimations; + final BaseKeyframeAnimation? _dashPatternOffsetAnimation; + BaseKeyframeAnimation? _colorFilterAnimation; + BaseKeyframeAnimation? _blurAnimation; + double _blurMaskFilterRadius = 0; + DropShadowKeyframeAnimation? dropShadowAnimation; + + BaseStrokeContent( + this.lottieDrawable, + this.layer, { + required StrokeCap cap, + required StrokeJoin join, + required double miterLimit, + required AnimatableIntegerValue opacity, + required AnimatableDoubleValue width, + required List dashPattern, + AnimatableDoubleValue? dashOffset, + }) : _widthAnimation = width.createAnimation(), + _opacityAnimation = opacity.createAnimation(), + _dashPatternOffsetAnimation = dashOffset?.createAnimation(), + _dashPatternAnimations = dashPattern + .map((d) => d.createAnimation()) + .toList(), + _dashPatternValues = List.filled(dashPattern.length, 0.0) { + paint + ..strokeCap = cap + ..strokeJoin = join + ..strokeMiterLimit = miterLimit; + + layer.addAnimation(_opacityAnimation); + layer.addAnimation(_widthAnimation); + for (var i = 0; i < _dashPatternAnimations.length; i++) { + layer.addAnimation(_dashPatternAnimations[i]); + } + if (_dashPatternOffsetAnimation != null) { + layer.addAnimation(_dashPatternOffsetAnimation); + } + + _opacityAnimation.addUpdateListener(onUpdateListener); + _widthAnimation.addUpdateListener(onUpdateListener); + + for (var i = 0; i < dashPattern.length; i++) { + _dashPatternAnimations[i].addUpdateListener(onUpdateListener); + } + if (_dashPatternOffsetAnimation != null) { + _dashPatternOffsetAnimation.addUpdateListener(onUpdateListener); + } + var blurEffect = layer.blurEffect; + if (blurEffect != null) { + _blurAnimation = blurEffect.blurriness.createAnimation() + ..addUpdateListener(onUpdateListener); + layer.addAnimation(_blurAnimation); + } + var dropShadowEffect = layer.dropShadowEffect; + if (dropShadowEffect != null) { + dropShadowAnimation = DropShadowKeyframeAnimation( + onUpdateListener, + layer, + dropShadowEffect, + ); + } + } + + void onUpdateListener() { + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + TrimPathContent? trimPathContentBefore; + for (var i = contentsBefore.length - 1; i >= 0; i--) { + var content = contentsBefore[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.individually) { + trimPathContentBefore = content; + } + } + if (trimPathContentBefore != null) { + trimPathContentBefore.addListener(onUpdateListener); + } + + _PathGroup? currentPathGroup; + for (var i = contentsAfter.length - 1; i >= 0; i--) { + var content = contentsAfter[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.individually) { + if (currentPathGroup != null) { + _pathGroups.add(currentPathGroup); + } + currentPathGroup = _PathGroup(content); + content.addListener(onUpdateListener); + } else if (content is PathContent) { + currentPathGroup ??= _PathGroup(trimPathContentBefore); + currentPathGroup.paths.add(content); + } + } + if (currentPathGroup != null) { + _pathGroups.add(currentPathGroup); + } + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + L.beginSection('StrokeContent#draw'); + if (parentMatrix.hasZeroScaleAxis) { + L.endSection('StrokeContent#draw'); + return; + } + var alpha = ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255) + .round(); + paint.setAlpha(alpha.clamp(0, 255)); + paint.strokeWidth = _widthAnimation.value * parentMatrix.getScale(); + if (paint.strokeWidth <= 0) { + // Android draws a hairline stroke for 0, After Effects doesn't. + L.endSection('StrokeContent#draw'); + return; + } + + if (_colorFilterAnimation != null) { + paint.colorFilter = _colorFilterAnimation!.value; + } + + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + var blurRadius = blurAnimation.value; + if (blurRadius == 0) { + paint.maskFilter = null; + } else if (blurRadius != _blurMaskFilterRadius) { + var blur = layer.getBlurMaskFilter(blurRadius); + paint.maskFilter = blur; + } + _blurMaskFilterRadius = blurRadius; + } + + for (var i = 0; i < _pathGroups.length; i++) { + var pathGroup = _pathGroups[i]; + + if (pathGroup.trimPath != null) { + _applyTrimPath(canvas, pathGroup, parentMatrix); + } else { + L.beginSection('StrokeContent#buildPath'); + _path.reset(); + for (var j = pathGroup.paths.length - 1; j >= 0; j--) { + _path.addPath( + pathGroup.paths[j].getPath(), + Offset.zero, + matrix4: parentMatrix.storage, + ); + } + L.endSection('StrokeContent#buildPath'); + L.beginSection('StrokeContent#drawPath'); + var dropShadow = dropShadowAnimation; + if (dropShadow != null) { + dropShadow.draw(canvas, _path); + } + canvas.drawPath(_withDashPattern(_path, parentMatrix), paint); + L.endSection('StrokeContent#drawPath'); + } + } + L.endSection('StrokeContent#draw'); + } + + void _applyTrimPath( + Canvas canvas, + _PathGroup pathGroup, + Matrix4 parentMatrix, + ) { + L.beginSection('StrokeContent#applyTrimPath'); + var trimPath = pathGroup.trimPath; + if (trimPath == null) { + L.endSection('StrokeContent#applyTrimPath'); + return; + } + _path.reset(); + for (var j = pathGroup.paths.length - 1; j >= 0; j--) { + _path.addPath( + pathGroup.paths[j].getPath(), + Offset.zero, + matrix4: parentMatrix.storage, + ); + } + var animStartValue = trimPath.start.value / 100; + var animEndValue = trimPath.end.value / 100; + var animOffsetValue = trimPath.offset.value / 360; + + // If the start-end is ~100, consider it to be the full path. + if (animStartValue < 0.01 && animEndValue > 0.99) { + canvas.drawPath(_path, paint); + L.endSection('StrokeContent#applyTrimPath'); + return; + } + + var pathMetrics = _path.computeMetrics().toList(); + var totalLength = pathMetrics.fold(0.0, (a, b) => a + b.length); + + var offsetLength = totalLength * animOffsetValue; + var startLength = totalLength * animStartValue + offsetLength; + var endLength = min( + totalLength * animEndValue + offsetLength, + startLength + totalLength - 1, + ); + + var currentLength = 0.0; + for (var j = pathGroup.paths.length - 1; j >= 0; j--) { + _trimPathPath.set( + pathGroup.paths[j].getPath().transform(parentMatrix.storage), + ); + var pathMetrics = _trimPathPath.computeMetrics().toList(); + var length = pathMetrics.isNotEmpty ? pathMetrics.first.length : 0; + if (endLength > totalLength && + endLength - totalLength < currentLength + length && + currentLength < endLength - totalLength) { + // Draw the segment when the end is greater than the length which wraps around to the + // beginning. + double startValue; + if (startLength > totalLength) { + startValue = (startLength - totalLength) / length; + } else { + startValue = 0; + } + var endValue = min((endLength - totalLength) / length, 1).toDouble(); + Utils.applyTrimPathIfNeeded(_trimPathPath, startValue, endValue, 0.0); + canvas.drawPath(_withDashPattern(_trimPathPath, parentMatrix), paint); + } else if (currentLength + length < startLength || + currentLength > endLength) { + // Do nothing + } else if (currentLength + length <= endLength && + startLength < currentLength) { + canvas.drawPath(_withDashPattern(_trimPathPath, parentMatrix), paint); + } else { + double startValue; + if (startLength < currentLength) { + startValue = 0; + } else { + startValue = (startLength - currentLength) / length; + } + double endValue; + if (endLength > currentLength + length) { + endValue = 1.0; + } else { + endValue = (endLength - currentLength) / length; + } + Utils.applyTrimPathIfNeeded(_trimPathPath, startValue, endValue, 0); + canvas.drawPath(_withDashPattern(_trimPathPath, parentMatrix), paint); + } + currentLength += length; + } + L.endSection('StrokeContent#applyTrimPath'); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + L.beginSection('StrokeContent#getBounds'); + _path.reset(); + for (var i = 0; i < _pathGroups.length; i++) { + var pathGroup = _pathGroups[i]; + for (var j = 0; j < pathGroup.paths.length; j++) { + _path.addPath( + pathGroup.paths[j].getPath(), + Offset.zero, + matrix4: parentMatrix.storage, + ); + } + } + var bounds = _path.getBounds(); + + var width = _widthAnimation.value; + bounds = bounds.inflate(width / 2.0); + // Add padding to account for rounding errors. + bounds = bounds.inflate(1); + L.endSection('StrokeContent#getBounds'); + return bounds; + } + + Path _withDashPattern(Path path, Matrix4 parentMatrix) { + L.beginSection('StrokeContent#applyDashPattern'); + if (_dashPatternAnimations.isEmpty) { + L.endSection('StrokeContent#applyDashPattern'); + return path; + } + + var scale = parentMatrix.getScale(); + for (var i = 0; i < _dashPatternAnimations.length; i++) { + _dashPatternValues[i] = _dashPatternAnimations[i].value; + // If the value of the dash pattern or gap is too small, the number of individual sections + // approaches infinity as the value approaches 0. + // To mitigate this, we essentially put a minimum value on the dash pattern size of 1px + // and a minimum gap size of 0.01. + if (i % 2 == 0) { + if (_dashPatternValues[i] < 1.0) { + _dashPatternValues[i] = 1.0; + } + } else { + if (_dashPatternValues[i] < 0.1) { + _dashPatternValues[i] = 0.1; + } + } + _dashPatternValues[i] *= scale; + } + + var offset = _dashPatternOffsetAnimation == null + ? 0.0 + : _dashPatternOffsetAnimation.value * scale; + var newPath = dashPath(path, intervals: _dashPatternValues, phase: offset); + L.endSection('StrokeContent#applyDashPattern'); + + return newPath; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + @mustCallSuper + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.opacity) { + _opacityAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.strokeWidth) { + _widthAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.colorFilter) { + if (_colorFilterAnimation != null) { + layer.removeAnimation(_colorFilterAnimation); + } + + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = + ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + )..addUpdateListener(onUpdateListener); + layer.addAnimation(_colorFilterAnimation); + } + } else if (property == LottieProperty.blurRadius) { + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + blurAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else { + _blurAnimation = blurAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 0, + )..addUpdateListener(onUpdateListener); + layer.addAnimation(blurAnimation); + } + } else if (property == LottieProperty.dropShadow) { + var dropShadowAnimation = this.dropShadowAnimation; + if (dropShadowAnimation == null) { + var effect = DropShadowEffect.createEmpty(); + this.dropShadowAnimation = dropShadowAnimation = dropShadowAnimation = + DropShadowKeyframeAnimation(onUpdateListener, layer, effect); + } + + dropShadowAnimation.setCallback( + callback as LottieValueCallback?, + ); + } + } +} + +/// Data class to help drawing trim paths individually. +class _PathGroup { + final List paths = []; + final TrimPathContent? trimPath; + + _PathGroup(this.trimPath); +} diff --git a/lottie/lib/src/animation/content/compound_trim_path_content.dart b/lottie/lib/src/animation/content/compound_trim_path_content.dart new file mode 100644 index 0000000..4437084 --- /dev/null +++ b/lottie/lib/src/animation/content/compound_trim_path_content.dart @@ -0,0 +1,17 @@ +import 'dart:ui'; +import '../../utils/utils.dart'; +import 'trim_path_content.dart'; + +class CompoundTrimPathContent { + final List _contents = []; + + void addTrimPath(TrimPathContent trimPath) { + _contents.add(trimPath); + } + + void apply(Path path) { + for (var i = _contents.length - 1; i >= 0; i--) { + Utils.applyTrimPathContentIfNeeded(path, _contents[i]); + } + } +} diff --git a/lottie/lib/src/animation/content/content.dart b/lottie/lib/src/animation/content/content.dart new file mode 100644 index 0000000..8efbacf --- /dev/null +++ b/lottie/lib/src/animation/content/content.dart @@ -0,0 +1,5 @@ +abstract class Content { + String? get name; + + void setContents(List contentsBefore, List contentsAfter); +} diff --git a/lottie/lib/src/animation/content/content_group.dart b/lottie/lib/src/animation/content/content_group.dart new file mode 100644 index 0000000..53cd36a --- /dev/null +++ b/lottie/lib/src/animation/content/content_group.dart @@ -0,0 +1,271 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../model/animatable/animatable_transform.dart'; +import '../../model/content/content_model.dart'; +import '../../model/content/shape_group.dart'; +import '../../model/key_path.dart'; +import '../../model/key_path_element.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/transform_keyframe_animation.dart'; +import 'content.dart'; +import 'drawing_content.dart'; +import 'greedy_content.dart'; +import 'path_content.dart'; + +class ContentGroup implements DrawingContent, PathContent, KeyPathElement { + final Paint _offScreenPaint = Paint(); + + static List contentsFromModels( + LottieDrawable drawable, + BaseLayer layer, + List contentModels, + ) { + var contents = []; + for (var i = 0; i < contentModels.length; i++) { + var content = contentModels[i].toContent(drawable, layer); + if (content != null) { + contents.add(content); + } + } + return contents; + } + + static AnimatableTransform? findTransform(List contentModels) { + for (var i = 0; i < contentModels.length; i++) { + var contentModel = contentModels[i]; + if (contentModel is AnimatableTransform) { + return contentModel; + } + } + return null; + } + + final Matrix4 _matrix = Matrix4.identity(); + final Path _path = Path(); + + @override + final String? name; + final bool _hidden; + final List _contents; + final LottieDrawable _lottieDrawable; + List? _pathContents; + TransformKeyframeAnimation? _transformAnimation; + + ContentGroup( + LottieDrawable lottieDrawable, + BaseLayer layer, + ShapeGroup shapeGroup, + ) : this.copy( + lottieDrawable, + layer, + shapeGroup.name, + contentsFromModels(lottieDrawable, layer, shapeGroup.items), + findTransform(shapeGroup.items), + hidden: shapeGroup.hidden, + ); + + ContentGroup.copy( + this._lottieDrawable, + BaseLayer layer, + this.name, + this._contents, + AnimatableTransform? transform, { + required bool hidden, + }) : _hidden = hidden { + if (transform != null) { + _transformAnimation = transform.createAnimation() + ..addAnimationsToLayer(layer) + ..addListener(onValueChanged); + } + + var greedyContents = []; + for (var i = _contents.length - 1; i >= 0; i--) { + var content = _contents[i]; + if (content is GreedyContent) { + greedyContents.add(content as GreedyContent); + } + } + + for (var i = greedyContents.length - 1; i >= 0; i--) { + greedyContents[i].absorbContent(_contents); + } + } + + void onValueChanged() { + _lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + // Do nothing with contents after. + var myContentsBefore = []; + myContentsBefore.addAll(contentsBefore); + + for (var i = _contents.length - 1; i >= 0; i--) { + var content = _contents[i]; + content.setContents(myContentsBefore, _contents.sublist(0, i)); + myContentsBefore.add(content); + } + } + + List getPathList() { + if (_pathContents == null) { + var pathContents = _pathContents = []; + for (var i = 0; i < _contents.length; i++) { + var content = _contents[i]; + if (content is PathContent) { + pathContents.add(content); + } + } + } + return _pathContents!; + } + + Matrix4 getTransformationMatrix() { + if (_transformAnimation != null) { + return _transformAnimation!.getMatrix(); + } + _matrix.reset(); + return _matrix; + } + + @override + Path getPath() { + // TODO: cache this somehow. + _matrix.reset(); + if (_transformAnimation != null) { + _matrix.set(_transformAnimation!.getMatrix()); + } + _path.reset(); + if (_hidden) { + return _path; + } + for (var i = _contents.length - 1; i >= 0; i--) { + var content = _contents[i]; + if (content is PathContent) { + _path.addPath(content.getPath(), Offset.zero, matrix4: _matrix.storage); + } + } + return _path; + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + if (_hidden) { + return; + } + _matrix.set(parentMatrix); + int layerAlpha; + if (_transformAnimation != null) { + _matrix.preConcat(_transformAnimation!.getMatrix()); + var opacity = _transformAnimation?.opacity == null + ? 100 + : _transformAnimation!.opacity!.value; + layerAlpha = ((opacity / 100.0 * parentAlpha / 255.0) * 255).round(); + } else { + layerAlpha = parentAlpha; + } + + // Apply off-screen rendering only when needed in order to improve rendering performance. + var isRenderingWithOffScreen = + _lottieDrawable.isApplyingOpacityToLayersEnabled && + hasTwoOrMoreDrawableContent() && + layerAlpha != 255; + if (isRenderingWithOffScreen) { + var offScreenRect = getBounds(_matrix, applyParents: true); + _offScreenPaint.setAlpha(layerAlpha); + canvas.saveLayer(offScreenRect, _offScreenPaint); + } + + var childAlpha = isRenderingWithOffScreen ? 255 : layerAlpha; + for (var i = _contents.length - 1; i >= 0; i--) { + Object content = _contents[i]; + if (content is DrawingContent) { + content.draw(canvas, _matrix, parentAlpha: childAlpha); + } + } + + if (isRenderingWithOffScreen) { + canvas.restore(); + } + } + + bool hasTwoOrMoreDrawableContent() { + var drawableContentCount = 0; + for (var i = 0; i < _contents.length; i++) { + if (_contents[i] is DrawingContent) { + drawableContentCount += 1; + if (drawableContentCount >= 2) { + return true; + } + } + } + return false; + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + _matrix.set(parentMatrix); + if (_transformAnimation != null) { + _matrix.preConcat(_transformAnimation!.getMatrix()); + } + var bounds = Rect.zero; + for (var i = _contents.length - 1; i >= 0; i--) { + var content = _contents[i]; + if (content is DrawingContent) { + var contentBounds = content.getBounds( + _matrix, + applyParents: applyParents, + ); + bounds = bounds.expandToInclude(contentBounds); + } + } + return bounds; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + if (!keyPath.matches(name, depth) && name != '__container') { + return; + } + + if ('__container' != name && name != null) { + currentPartialKeyPath = currentPartialKeyPath.addKey(name!); + + if (keyPath.fullyResolvesTo(name, depth)) { + accumulator.add(currentPartialKeyPath.resolve(this)); + } + } + + if (keyPath.propagateToChildren(name, depth)) { + var newDepth = depth + keyPath.incrementDepthBy(name, depth); + for (var i = 0; i < _contents.length; i++) { + var content = _contents[i]; + if (content is KeyPathElement) { + var element = content as KeyPathElement; + element.resolveKeyPath( + keyPath, + newDepth, + accumulator, + currentPartialKeyPath, + ); + } + } + } + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (_transformAnimation != null) { + _transformAnimation!.applyValueCallback(property, callback); + } + } +} diff --git a/lottie/lib/src/animation/content/drawing_content.dart b/lottie/lib/src/animation/content/drawing_content.dart new file mode 100644 index 0000000..411ff6b --- /dev/null +++ b/lottie/lib/src/animation/content/drawing_content.dart @@ -0,0 +1,8 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import 'content.dart'; + +abstract class DrawingContent extends Content { + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}); + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}); +} diff --git a/lottie/lib/src/animation/content/ellipse_content.dart b/lottie/lib/src/animation/content/ellipse_content.dart new file mode 100644 index 0000000..5f784bb --- /dev/null +++ b/lottie/lib/src/animation/content/ellipse_content.dart @@ -0,0 +1,135 @@ +import 'dart:ui'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/circle_shape.dart'; +import '../../model/content/shape_trim_path.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/misc.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import 'compound_trim_path_content.dart'; +import 'content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; +import 'trim_path_content.dart'; + +class EllipseContent implements PathContent, KeyPathElementContent { + static const _ellipseControlPointPercentage = 0.55228; + + final Path _path = Path(); + + @override + final String? name; + final LottieDrawable lottieDrawable; + final BaseKeyframeAnimation _sizeAnimation; + final BaseKeyframeAnimation _positionAnimation; + final CircleShape _circleShape; + + final CompoundTrimPathContent _trimPaths = CompoundTrimPathContent(); + bool _isPathValid = false; + + EllipseContent(this.lottieDrawable, BaseLayer layer, this._circleShape) + : name = _circleShape.name, + _sizeAnimation = _circleShape.size.createAnimation(), + _positionAnimation = _circleShape.position.createAnimation() { + layer.addAnimation(_sizeAnimation); + layer.addAnimation(_positionAnimation); + + _sizeAnimation.addUpdateListener(invalidate); + _positionAnimation.addUpdateListener(invalidate); + } + + void invalidate() { + _isPathValid = false; + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < contentsBefore.length; i++) { + var content = contentsBefore[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.simultaneously) { + var trimPath = content; + _trimPaths.addTrimPath(trimPath); + trimPath.addListener(invalidate); + } + } + } + + @override + Path getPath() { + if (_isPathValid) { + return _path; + } + + _path.reset(); + + if (_circleShape.hidden) { + _isPathValid = true; + return _path; + } + + var size = _sizeAnimation.value; + var halfWidth = size.dx / 2.0; + var halfHeight = size.dy / 2.0; + // TODO: handle bounds + + var cpW = halfWidth * _ellipseControlPointPercentage; + var cpH = halfHeight * _ellipseControlPointPercentage; + + _path.reset(); + if (_circleShape.isReversed) { + _path.moveTo(0, -halfHeight); + _path.cubicTo(0 - cpW, -halfHeight, -halfWidth, 0 - cpH, -halfWidth, 0); + _path.cubicTo(-halfWidth, 0 + cpH, 0 - cpW, halfHeight, 0, halfHeight); + _path.cubicTo(0 + cpW, halfHeight, halfWidth, 0 + cpH, halfWidth, 0); + _path.cubicTo(halfWidth, 0 - cpH, 0 + cpW, -halfHeight, 0, -halfHeight); + } else { + _path.moveTo(0, -halfHeight); + _path.cubicTo(0 + cpW, -halfHeight, halfWidth, 0 - cpH, halfWidth, 0); + _path.cubicTo(halfWidth, 0 + cpH, 0 + cpW, halfHeight, 0, halfHeight); + _path.cubicTo(0 - cpW, halfHeight, -halfWidth, 0 + cpH, -halfWidth, 0); + _path.cubicTo(-halfWidth, 0 - cpH, 0 - cpW, -halfHeight, 0, -halfHeight); + } + + var position = _positionAnimation.value; + _path.offset(position); + + _path.close(); + + _trimPaths.apply(_path); + + _isPathValid = true; + return _path; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.ellipseSize) { + _sizeAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.position) { + _positionAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } + } +} diff --git a/lottie/lib/src/animation/content/fill_content.dart b/lottie/lib/src/animation/content/fill_content.dart new file mode 100644 index 0000000..27bd9c0 --- /dev/null +++ b/lottie/lib/src/animation/content/fill_content.dart @@ -0,0 +1,210 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../l.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/drop_shadow_effect.dart'; +import '../../model/content/shape_fill.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/misc.dart'; +import '../../value/drop_shadow.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/drop_shadow_keyframe_animation.dart'; +import '../keyframe/value_callback_keyframe_animation.dart'; +import 'content.dart'; +import 'drawing_content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; + +class FillContent implements DrawingContent, KeyPathElementContent { + final Path _path = Path(); + final BaseLayer layer; + @override + final String? name; + final bool _hidden; + final List _paths = []; + late final BaseKeyframeAnimation _colorAnimation; + late final BaseKeyframeAnimation _opacityAnimation; + BaseKeyframeAnimation? _colorFilterAnimation; + final LottieDrawable lottieDrawable; + BaseKeyframeAnimation? _blurAnimation; + double _blurMaskFilterRadius = 0; + DropShadowKeyframeAnimation? dropShadowAnimation; + + FillContent(this.lottieDrawable, this.layer, ShapeFill fill) + : name = fill.name, + _hidden = fill.hidden { + var blurEffect = layer.blurEffect; + if (blurEffect != null) { + _blurAnimation = blurEffect.blurriness.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_blurAnimation); + } + var dropShadowEffect = layer.dropShadowEffect; + if (dropShadowEffect != null) { + dropShadowAnimation = DropShadowKeyframeAnimation( + onValueChanged, + layer, + dropShadowEffect, + ); + } + + if (fill.color == null || fill.opacity == null) { + return; + } + + _path.fillType = fill.fillType; + + _colorAnimation = fill.color!.createAnimation(); + _colorAnimation.addUpdateListener(onValueChanged); + layer.addAnimation(_colorAnimation); + _opacityAnimation = fill.opacity!.createAnimation(); + _opacityAnimation.addUpdateListener(onValueChanged); + layer.addAnimation(_opacityAnimation); + } + + void onValueChanged() { + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < contentsAfter.length; i++) { + var content = contentsAfter[i]; + if (content is PathContent) { + _paths.add(content); + } + } + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + if (_hidden) { + return; + } + L.beginSection('FillContent#draw'); + + var paint = Paint()..color = _colorAnimation.value; + var alpha = ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255) + .round(); + paint.setAlpha(alpha.clamp(0, 255)); + if (lottieDrawable.antiAliasingSuggested) { + paint.isAntiAlias = true; + } + + if (_colorFilterAnimation != null) { + paint.colorFilter = _colorFilterAnimation!.value; + } + + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + var blurRadius = blurAnimation.value; + if (blurRadius == 0) { + paint.maskFilter = null; + } else if (blurRadius != _blurMaskFilterRadius) { + var blur = layer.getBlurMaskFilter(blurRadius); + paint.maskFilter = blur; + } + _blurMaskFilterRadius = blurRadius; + } + + _path.reset(); + for (var i = 0; i < _paths.length; i++) { + _path.addPath(_paths[i].getPath(), Offset.zero); + } + + canvas.save(); + canvas.transform(parentMatrix.storage); + var dropShadow = dropShadowAnimation; + if (dropShadow != null) { + dropShadow.draw(canvas, _path); + } + canvas.drawPath(_path, paint); + canvas.restore(); + + L.endSection('FillContent#draw'); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + _path.reset(); + for (var i = 0; i < _paths.length; i++) { + _path.addPath( + _paths[i].getPath(), + Offset.zero, + matrix4: parentMatrix.storage, + ); + } + var outBounds = _path.getBounds(); + // Add padding to account for rounding errors. + outBounds = outBounds.inflate(1); + return outBounds; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.color) { + _colorAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.opacity) { + _opacityAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.colorFilter) { + if (_colorFilterAnimation != null) { + layer.removeAnimation(_colorFilterAnimation); + } + + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + )..addUpdateListener(onValueChanged); + layer.addAnimation(_colorFilterAnimation); + } + } else if (property == LottieProperty.blurRadius) { + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + blurAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else { + var callbackBlur = callback as LottieValueCallback?; + _blurAnimation = blurAnimation = ValueCallbackKeyframeAnimation( + callbackBlur, + callbackBlur?.value ?? 0, + )..addUpdateListener(onValueChanged); + layer.addAnimation(blurAnimation); + } + } else if (property == LottieProperty.dropShadow) { + var dropShadowAnimation = this.dropShadowAnimation; + if (dropShadowAnimation == null) { + var effect = DropShadowEffect.createEmpty(); + this.dropShadowAnimation = dropShadowAnimation = dropShadowAnimation = + DropShadowKeyframeAnimation(onValueChanged, layer, effect); + } + + dropShadowAnimation.setCallback( + callback as LottieValueCallback?, + ); + } + } +} diff --git a/lottie/lib/src/animation/content/gradient_fill_content.dart b/lottie/lib/src/animation/content/gradient_fill_content.dart new file mode 100644 index 0000000..3d591ff --- /dev/null +++ b/lottie/lib/src/animation/content/gradient_fill_content.dart @@ -0,0 +1,329 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../l.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/drop_shadow_effect.dart'; +import '../../model/content/gradient_color.dart'; +import '../../model/content/gradient_fill.dart'; +import '../../model/content/gradient_type.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/misc.dart'; +import '../../value/drop_shadow.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/drop_shadow_keyframe_animation.dart'; +import '../keyframe/value_callback_keyframe_animation.dart'; +import 'content.dart'; +import 'drawing_content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; + +class GradientFillContent implements DrawingContent, KeyPathElementContent { + /// Cache the gradients such that it runs at 30fps. + static const _cacheStepsMs = 32; + final BaseLayer layer; + final GradientFill _fill; + final _linearGradientCache = {}; + final _radialGradientCache = {}; + final _path = Path(); + final _paint = Paint(); + final _paths = []; + final BaseKeyframeAnimation _colorAnimation; + final BaseKeyframeAnimation _opacityAnimation; + final BaseKeyframeAnimation _startPointAnimation; + final BaseKeyframeAnimation _endPointAnimation; + BaseKeyframeAnimation? _colorFilterAnimation; + ValueCallbackKeyframeAnimation, List>? + _colorCallbackAnimation; + final LottieDrawable lottieDrawable; + final int _cacheSteps; + BaseKeyframeAnimation? _blurAnimation; + double _blurMaskFilterRadius = 0; + DropShadowKeyframeAnimation? dropShadowAnimation; + + GradientFillContent(this.lottieDrawable, this.layer, this._fill) + : _cacheSteps = + (lottieDrawable.composition.duration.inMilliseconds / _cacheStepsMs) + .round(), + _colorAnimation = _fill.gradientColor.createAnimation(), + _opacityAnimation = _fill.opacity.createAnimation(), + _startPointAnimation = _fill.startPoint.createAnimation(), + _endPointAnimation = _fill.endPoint.createAnimation() { + _path.fillType = _fill.fillType; + _colorAnimation.addUpdateListener(invalidate); + layer.addAnimation(_colorAnimation); + + _opacityAnimation.addUpdateListener(invalidate); + layer.addAnimation(_opacityAnimation); + + _startPointAnimation.addUpdateListener(invalidate); + layer.addAnimation(_startPointAnimation); + + _endPointAnimation.addUpdateListener(invalidate); + layer.addAnimation(_endPointAnimation); + + var blurEffect = layer.blurEffect; + if (blurEffect != null) { + _blurAnimation = blurEffect.blurriness.createAnimation() + ..addUpdateListener(invalidate); + layer.addAnimation(_blurAnimation); + } + var dropShadowEffect = layer.dropShadowEffect; + if (dropShadowEffect != null) { + dropShadowAnimation = DropShadowKeyframeAnimation( + invalidate, + layer, + dropShadowEffect, + ); + } + } + + @override + String? get name => _fill.name; + + void invalidate() { + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < contentsAfter.length; i++) { + var content = contentsAfter[i]; + if (content is PathContent) { + _paths.add(content); + } + } + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + if (_fill.hidden) { + return; + } + L.beginSection('GradientFillContent#draw'); + _path.reset(); + for (var i = 0; i < _paths.length; i++) { + _path.addPath(_paths[i].getPath(), Offset.zero); + } + + Gradient gradient; + if (_fill.gradientType == GradientType.linear) { + gradient = _getLinearGradient(); + } else { + gradient = _getRadialGradient(); + } + + _paint.shader = gradient; + + if (_colorFilterAnimation != null) { + _paint.colorFilter = _colorFilterAnimation!.value; + } + + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + var blurRadius = blurAnimation.value; + if (blurRadius == 0) { + _paint.maskFilter = null; + } else if (blurRadius != _blurMaskFilterRadius) { + var blur = layer.getBlurMaskFilter(blurRadius); + _paint.maskFilter = blur; + } + _blurMaskFilterRadius = blurRadius; + } + + var alpha = ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255) + .round(); + _paint.setAlpha(alpha.clamp(0, 255)); + if (lottieDrawable.antiAliasingSuggested) { + _paint.isAntiAlias = true; + } + + canvas.save(); + canvas.transform(parentMatrix.storage); + var dropShadow = dropShadowAnimation; + if (dropShadow != null) { + dropShadow.draw(canvas, _path); + } + canvas.drawPath(_path, _paint); + canvas.restore(); + L.endSection('GradientFillContent#draw'); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + _path.reset(); + for (var i = 0; i < _paths.length; i++) { + _path.addPath( + _paths[i].getPath(), + Offset.zero, + matrix4: parentMatrix.storage, + ); + } + + var outBounds = _path.getBounds(); + // Add padding to account for rounding errors. + return outBounds.inflate(1); + } + + Gradient _getLinearGradient() { + var gradientHash = _getGradientHash(); + var gradient = _linearGradientCache[gradientHash]; + if (gradient != null && _colorCallbackAnimation == null) { + return gradient; + } + var startPoint = _startPointAnimation.value; + var endPoint = _endPointAnimation.value; + var gradientColor = _colorAnimation.value; + var colors = _applyDynamicColorsIfNeeded(gradientColor.colors); + var positions = gradientColor.positions; + gradient = Gradient.linear(startPoint, endPoint, colors, positions); + if (gradientHash != null) { + _linearGradientCache[gradientHash] = gradient; + } + return gradient; + } + + Gradient _getRadialGradient() { + var gradientHash = _getGradientHash(); + var gradient = _radialGradientCache[gradientHash]; + if (gradient != null) { + return gradient; + } + var startPoint = _startPointAnimation.value; + var endPoint = _endPointAnimation.value; + var gradientColor = _colorAnimation.value; + var colors = _applyDynamicColorsIfNeeded(gradientColor.colors); + var positions = gradientColor.positions; + var x0 = startPoint.dx; + var y0 = startPoint.dy; + var x1 = endPoint.dx; + var y1 = endPoint.dy; + var radius = hypot(x1 - x0, y1 - y0).toDouble(); + if (radius <= 0) { + radius = 0.001; + } + gradient = Gradient.radial(startPoint, radius, colors, positions); + if (gradientHash != null) { + _radialGradientCache[gradientHash] = gradient; + } + return gradient; + } + + int? _getGradientHash() { + // Don't cache gradient if ValueDelegate.gradient is used + if (_colorCallbackAnimation != null) return null; + + var startPointProgress = (_startPointAnimation.progress * _cacheSteps) + .round(); + var endPointProgress = (_endPointAnimation.progress * _cacheSteps).round(); + var colorProgress = (_colorAnimation.progress * _cacheSteps).round(); + var hash = 17; + if (startPointProgress != 0) { + hash = hash * 31 * startPointProgress; + } + if (endPointProgress != 0) { + hash = hash * 31 * endPointProgress; + } + if (colorProgress != 0) { + hash = hash * 31 * colorProgress; + } + return hash; + } + + List _applyDynamicColorsIfNeeded(List colors) { + if (_colorCallbackAnimation != null) { + var dynamicColors = _colorCallbackAnimation!.value; + if (colors.length == dynamicColors.length) { + for (var i = 0; i < colors.length; i++) { + colors[i] = dynamicColors[i]; + } + } else { + colors = List.filled(dynamicColors.length, const Color(0x00000000)); + for (var i = 0; i < dynamicColors.length; i++) { + colors[i] = dynamicColors[i]; + } + } + } + return colors; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.opacity) { + _opacityAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.colorFilter) { + if (_colorFilterAnimation != null) { + layer.removeAnimation(_colorFilterAnimation); + } + + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + )..addUpdateListener(invalidate); + layer.addAnimation(_colorFilterAnimation); + } + } else if (property == LottieProperty.gradientColor) { + if (_colorCallbackAnimation != null) { + layer.removeAnimation(_colorCallbackAnimation); + } + + if (callback == null) { + _colorCallbackAnimation = null; + } else { + _linearGradientCache.clear(); + _radialGradientCache.clear(); + _colorCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback>, + [], + )..addUpdateListener(invalidate); + layer.addAnimation(_colorCallbackAnimation); + } + } else if (property == LottieProperty.blurRadius) { + var blurAnimation = _blurAnimation; + if (blurAnimation != null) { + blurAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else { + _blurAnimation = blurAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 0, + )..addUpdateListener(invalidate); + layer.addAnimation(blurAnimation); + } + } else if (property == LottieProperty.dropShadow) { + var dropShadowAnimation = this.dropShadowAnimation; + if (dropShadowAnimation == null) { + var effect = DropShadowEffect.createEmpty(); + this.dropShadowAnimation = dropShadowAnimation = dropShadowAnimation = + DropShadowKeyframeAnimation(invalidate, layer, effect); + } + + dropShadowAnimation.setCallback( + callback as LottieValueCallback?, + ); + } + } +} diff --git a/lottie/lib/src/animation/content/gradient_stroke_content.dart b/lottie/lib/src/animation/content/gradient_stroke_content.dart new file mode 100644 index 0000000..3549421 --- /dev/null +++ b/lottie/lib/src/animation/content/gradient_stroke_content.dart @@ -0,0 +1,206 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/gradient_color.dart'; +import '../../model/content/gradient_stroke.dart'; +import '../../model/content/gradient_type.dart'; +import '../../model/content/shape_stroke.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/value_callback_keyframe_animation.dart'; +import 'base_stroke_content.dart'; + +class GradientStrokeContent extends BaseStrokeContent { + /// Cache the gradients such that it runs at 30fps. + static const _cacheStepsMs = 32; + + @override + final String? name; + final bool _hidden; + final _linearGradientCache = {}; + final _radialGradientCache = {}; + + final GradientType _type; + final int _cacheSteps; + final BaseKeyframeAnimation _colorAnimation; + final BaseKeyframeAnimation _startPointAnimation; + final BaseKeyframeAnimation _endPointAnimation; + ValueCallbackKeyframeAnimation, List>? + _colorCallbackAnimation; + + GradientStrokeContent( + LottieDrawable lottieDrawable, + BaseLayer layer, + GradientStroke stroke, + ) : name = stroke.name, + _type = stroke.gradientType, + _hidden = stroke.hidden, + _cacheSteps = + (lottieDrawable.composition.duration.inMilliseconds / _cacheStepsMs) + .round(), + _colorAnimation = stroke.gradientColor.createAnimation(), + _startPointAnimation = stroke.startPoint.createAnimation(), + _endPointAnimation = stroke.endPoint.createAnimation(), + super( + lottieDrawable, + layer, + cap: lineCapTypeToPaintCap(stroke.capType), + join: lineJoinTypeToPaintJoin(stroke.joinType), + miterLimit: stroke.miterLimit, + opacity: stroke.opacity, + width: stroke.width, + dashPattern: stroke.lineDashPattern, + dashOffset: stroke.dashOffset, + ) { + _colorAnimation.addUpdateListener(onUpdateListener); + layer.addAnimation(_colorAnimation); + + _startPointAnimation.addUpdateListener(onUpdateListener); + layer.addAnimation(_startPointAnimation); + + _endPointAnimation.addUpdateListener(onUpdateListener); + layer.addAnimation(_endPointAnimation); + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + if (_hidden) { + return; + } + + Gradient gradient; + if (_type == GradientType.linear) { + gradient = _getLinearGradient(parentMatrix); + } else { + gradient = _getRadialGradient(parentMatrix); + } + + paint.shader = gradient; + + super.draw(canvas, parentMatrix, parentAlpha: parentAlpha); + } + + Gradient _getLinearGradient(Matrix4 parentMatrix) { + var gradientHash = _getGradientHash(parentMatrix); + var gradient = _linearGradientCache[gradientHash]; + if (gradient != null) { + return gradient; + } + var startPoint = _startPointAnimation.value; + var endPoint = _endPointAnimation.value; + var gradientColor = _colorAnimation.value; + var colors = _applyDynamicColorsIfNeeded(gradientColor.colors); + var positions = gradientColor.positions; + + gradient = Gradient.linear( + startPoint, + endPoint, + colors, + positions, + TileMode.clamp, + parentMatrix.storage, + ); + if (gradientHash != null) { + _linearGradientCache[gradientHash] = gradient; + } + return gradient; + } + + Gradient _getRadialGradient(Matrix4 parentMatrix) { + var gradientHash = _getGradientHash(parentMatrix); + var gradient = _radialGradientCache[gradientHash]; + if (gradient != null) { + return gradient; + } + var startPoint = _startPointAnimation.value; + var endPoint = _endPointAnimation.value; + var gradientColor = _colorAnimation.value; + var colors = _applyDynamicColorsIfNeeded(gradientColor.colors); + var positions = gradientColor.positions; + var x0 = startPoint.dx; + var y0 = startPoint.dy; + var x1 = endPoint.dx; + var y1 = endPoint.dy; + var radius = hypot(x1 - x0, y1 - y0).toDouble(); + gradient = Gradient.radial( + startPoint, + radius, + colors, + positions, + TileMode.clamp, + parentMatrix.storage, + ); + if (gradientHash != null) { + _radialGradientCache[gradientHash] = gradient; + } + return gradient; + } + + //TODO(xha): cache the shader based on the input parameters and not the animation + // progress. + // At first, log when there is too many cache miss. + int? _getGradientHash(Matrix4 parentMatrix) { + // Don't cache gradient if ValueDelegate.gradient is used + if (_colorCallbackAnimation != null) return null; + + var startPointProgress = (_startPointAnimation.progress * _cacheSteps) + .round(); + var endPointProgress = (_endPointAnimation.progress * _cacheSteps).round(); + var colorProgress = (_colorAnimation.progress * _cacheSteps).round(); + var hash = 17; + if (startPointProgress != 0) { + hash = hash * 31 * startPointProgress; + } + if (endPointProgress != 0) { + hash = hash * 31 * endPointProgress; + } + if (colorProgress != 0) { + hash = hash * 31 * colorProgress; + } + hash *= 31 * parentMatrix.hashCode; + return hash; + } + + List _applyDynamicColorsIfNeeded(List colors) { + if (_colorCallbackAnimation != null) { + var dynamicColors = _colorCallbackAnimation!.value; + if (colors.length == dynamicColors.length) { + for (var i = 0; i < colors.length; i++) { + colors[i] = dynamicColors[i]; + } + } else { + colors = List.filled( + dynamicColors.length, + const Color(0x00000000), + ); + for (var i = 0; i < dynamicColors.length; i++) { + colors[i] = dynamicColors[i]; + } + } + } + return colors; + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + if (property == LottieProperty.gradientColor) { + if (_colorCallbackAnimation != null) { + layer.removeAnimation(_colorCallbackAnimation); + } + + if (callback == null) { + _colorCallbackAnimation = null; + } else { + _colorCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback>, + [], + )..addUpdateListener(onUpdateListener); + layer.addAnimation(_colorCallbackAnimation); + } + } + } +} diff --git a/lottie/lib/src/animation/content/greedy_content.dart b/lottie/lib/src/animation/content/greedy_content.dart new file mode 100644 index 0000000..4c4f229 --- /dev/null +++ b/lottie/lib/src/animation/content/greedy_content.dart @@ -0,0 +1,13 @@ +import 'content.dart'; + +/// Content that may want to absorb and take ownership of the content around it. +/// For example, merge paths will absorb the shapes above it and repeaters will absorb the content +/// above it. +abstract class GreedyContent { + /// An iterator of contents that can be used to take ownership of contents. If ownership is taken, + /// the content should be removed from the iterator. + /// + /// The contents should be iterated by calling hasPrevious() and previous() so that the list of + /// contents is traversed from bottom to top which is the correct order for handling AE logic. + void absorbContent(List contents); +} diff --git a/lottie/lib/src/animation/content/key_path_element_content.dart b/lottie/lib/src/animation/content/key_path_element_content.dart new file mode 100644 index 0000000..8a0c039 --- /dev/null +++ b/lottie/lib/src/animation/content/key_path_element_content.dart @@ -0,0 +1,4 @@ +import '../../model/key_path_element.dart'; +import 'content.dart'; + +abstract class KeyPathElementContent implements KeyPathElement, Content {} diff --git a/lottie/lib/src/animation/content/merge_paths_content.dart b/lottie/lib/src/animation/content/merge_paths_content.dart new file mode 100644 index 0000000..b73347f --- /dev/null +++ b/lottie/lib/src/animation/content/merge_paths_content.dart @@ -0,0 +1,107 @@ +import 'dart:ui'; +import '../../model/content/merge_paths.dart'; +import '../../utils.dart'; +import 'content.dart'; +import 'content_group.dart'; +import 'greedy_content.dart'; +import 'path_content.dart'; + +class MergePathsContent implements PathContent, GreedyContent { + final Path _firstPath = Path(); + final Path _remainderPath = Path(); + final Path _path = Path(); + + final List _pathContents = []; + final MergePaths _mergePaths; + + MergePathsContent(this._mergePaths); + + @override + void absorbContent(List contents) { + // Fast forward the iterator until after this content. + var index = contents.lastIndexOf(this) - 1; + + while (index >= 0) { + var content = contents[index]; + if (content is PathContent) { + _pathContents.add(content); + contents.removeAt(index); + } + --index; + } + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < _pathContents.length; i++) { + _pathContents[i].setContents(contentsBefore, contentsAfter); + } + } + + @override + Path getPath() { + _path.reset(); + + if (_mergePaths.hidden) { + return _path; + } + + switch (_mergePaths.mode) { + case MergePathsMode.merge: + _addPaths(); + case MergePathsMode.add: + _opFirstPathWithRest(PathOperation.union); + case MergePathsMode.substract: + _opFirstPathWithRest(PathOperation.reverseDifference); + case MergePathsMode.intersect: + _opFirstPathWithRest(PathOperation.intersect); + case MergePathsMode.excludeIntersections: + _opFirstPathWithRest(PathOperation.xor); + } + + return _path; + } + + @override + String get name => _mergePaths.name; + + void _addPaths() { + for (var i = 0; i < _pathContents.length; i++) { + _path.addPath(_pathContents[i].getPath(), Offset.zero); + } + } + + void _opFirstPathWithRest(PathOperation op) { + _remainderPath.reset(); + _firstPath.reset(); + + for (var i = _pathContents.length - 1; i >= 1; i--) { + var content = _pathContents[i]; + + if (content is ContentGroup) { + var pathList = content.getPathList(); + for (var j = pathList.length - 1; j >= 0; j--) { + var path = pathList[j].getPath(); + path = path.transform(content.getTransformationMatrix().storage); + _remainderPath.addPath(path, Offset.zero); + } + } else { + _remainderPath.addPath(content.getPath(), Offset.zero); + } + } + + var lastContent = _pathContents[0]; + if (lastContent is ContentGroup) { + var pathList = lastContent.getPathList(); + for (var j = 0; j < pathList.length; j++) { + var path = pathList[j].getPath(); + path = path.transform(lastContent.getTransformationMatrix().storage); + _firstPath.addPath(path, Offset.zero); + } + } else { + _firstPath.set(lastContent.getPath()); + } + + _path.set(Path.combine(op, _firstPath, _remainderPath)); + } +} diff --git a/lottie/lib/src/animation/content/modifier_content.dart b/lottie/lib/src/animation/content/modifier_content.dart new file mode 100644 index 0000000..78a7569 --- /dev/null +++ b/lottie/lib/src/animation/content/modifier_content.dart @@ -0,0 +1 @@ +abstract class ModifierContent {} diff --git a/lottie/lib/src/animation/content/path_content.dart b/lottie/lib/src/animation/content/path_content.dart new file mode 100644 index 0000000..5cd62a1 --- /dev/null +++ b/lottie/lib/src/animation/content/path_content.dart @@ -0,0 +1,6 @@ +import 'dart:ui'; +import 'content.dart'; + +abstract class PathContent extends Content { + Path getPath(); +} diff --git a/lottie/lib/src/animation/content/polystar_content.dart b/lottie/lib/src/animation/content/polystar_content.dart new file mode 100644 index 0000000..00338fa --- /dev/null +++ b/lottie/lib/src/animation/content/polystar_content.dart @@ -0,0 +1,348 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/polystar_shape.dart'; +import '../../model/content/shape_trim_path.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils/misc.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import 'compound_trim_path_content.dart'; +import 'content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; +import 'trim_path_content.dart'; + +class PolystarContent implements PathContent, KeyPathElementContent { + /// This was empirically derived by creating polystars, converting them to + /// curves, and calculating a scale factor. + /// It works best for polygons and stars with 3 points and needs more + /// work otherwise. + static const _polystarMagicNumber = .47829; + static const _polygonMagicNumber = .25; + final _path = Path(); + + final LottieDrawable lottieDrawable; + final PolystarShape _polystarShape; + final BaseKeyframeAnimation _pointsAnimation; + final BaseKeyframeAnimation _positionAnimation; + final BaseKeyframeAnimation _rotationAnimation; + final BaseKeyframeAnimation? _innerRadiusAnimation; + final BaseKeyframeAnimation _outerRadiusAnimation; + final BaseKeyframeAnimation? _innerRoundednessAnimation; + final BaseKeyframeAnimation _outerRoundednessAnimation; + + final _trimPaths = CompoundTrimPathContent(); + bool _isPathValid = false; + + PolystarContent(this.lottieDrawable, BaseLayer layer, this._polystarShape) + : _pointsAnimation = _polystarShape.points.createAnimation(), + _positionAnimation = _polystarShape.position.createAnimation(), + _rotationAnimation = _polystarShape.rotation.createAnimation(), + _outerRadiusAnimation = _polystarShape.outerRadius.createAnimation(), + _outerRoundednessAnimation = _polystarShape.outerRoundedness + .createAnimation(), + _innerRadiusAnimation = _polystarShape.type == PolystarShapeType.star + ? _polystarShape.innerRadius!.createAnimation() + : null, + _innerRoundednessAnimation = _polystarShape.type == PolystarShapeType.star + ? _polystarShape.innerRoundedness!.createAnimation() + : null { + layer.addAnimation(_pointsAnimation); + layer.addAnimation(_positionAnimation); + layer.addAnimation(_rotationAnimation); + layer.addAnimation(_outerRadiusAnimation); + layer.addAnimation(_outerRoundednessAnimation); + if (_polystarShape.type == PolystarShapeType.star) { + layer.addAnimation(_innerRadiusAnimation); + layer.addAnimation(_innerRoundednessAnimation); + } + + _pointsAnimation.addUpdateListener(invalidate); + _positionAnimation.addUpdateListener(invalidate); + _rotationAnimation.addUpdateListener(invalidate); + _outerRadiusAnimation.addUpdateListener(invalidate); + _outerRoundednessAnimation.addUpdateListener(invalidate); + if (_polystarShape.type == PolystarShapeType.star) { + _innerRadiusAnimation!.addUpdateListener(invalidate); + _innerRoundednessAnimation!.addUpdateListener(invalidate); + } + } + + void invalidate() { + _isPathValid = false; + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < contentsBefore.length; i++) { + var content = contentsBefore[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.simultaneously) { + var trimPath = content; + _trimPaths.addTrimPath(trimPath); + trimPath.addListener(invalidate); + } + } + } + + @override + Path getPath() { + if (_isPathValid) { + return _path; + } + + _path.reset(); + + if (_polystarShape.hidden) { + _isPathValid = true; + return _path; + } + + switch (_polystarShape.type) { + case PolystarShapeType.star: + _createStarPath(); + case PolystarShapeType.polygon: + _createPolygonPath(); + } + + _path.close(); + + _trimPaths.apply(_path); + + _isPathValid = true; + return _path; + } + + @override + String? get name => _polystarShape.name; + + void _createStarPath() { + var points = _pointsAnimation.value; + var currentAngle = _rotationAnimation.value; + // Start at +y instead of +x + currentAngle -= 90; + // convert to radians + currentAngle = radians(currentAngle); + // adjust current angle for partial points + var anglePerPoint = 2 * pi / points; + if (_polystarShape.isReversed) { + anglePerPoint *= -1; + } + var halfAnglePerPoint = anglePerPoint / 2.0; + var partialPointAmount = points - points.toInt(); + if (partialPointAmount != 0) { + currentAngle += halfAnglePerPoint * (1.0 - partialPointAmount); + } + + var outerRadius = _outerRadiusAnimation.value; + //noinspection ConstantConditions + var innerRadius = _innerRadiusAnimation!.value; + + var innerRoundedness = 0.0; + if (_innerRoundednessAnimation != null) { + innerRoundedness = _innerRoundednessAnimation.value / 100.0; + } + var outerRoundedness = _outerRoundednessAnimation.value / 100.0; + + double x; + double y; + double previousX; + double previousY; + var partialPointRadius = 0.0; + if (partialPointAmount != 0) { + partialPointRadius = + innerRadius + partialPointAmount * (outerRadius - innerRadius); + x = partialPointRadius * cos(currentAngle); + y = partialPointRadius * sin(currentAngle); + _path.moveTo(x, y); + currentAngle += anglePerPoint * partialPointAmount / 2.0; + } else { + x = outerRadius * cos(currentAngle); + y = outerRadius * sin(currentAngle); + _path.moveTo(x, y); + currentAngle += halfAnglePerPoint; + } + + // True means the line will go to outer radius. False means inner radius. + var longSegment = false; + var numPoints = (points.ceil() * 2).toDouble(); + for (var i = 0; i < numPoints; i++) { + var radius = longSegment ? outerRadius : innerRadius; + var dTheta = halfAnglePerPoint; + if (partialPointRadius != 0 && i == numPoints - 2) { + dTheta = anglePerPoint * partialPointAmount / 2.0; + } + if (partialPointRadius != 0 && i == numPoints - 1) { + radius = partialPointRadius; + } + previousX = x; + previousY = y; + x = radius * cos(currentAngle); + y = radius * sin(currentAngle); + + if (innerRoundedness == 0 && outerRoundedness == 0) { + _path.lineTo(x, y); + } else { + var cp1Theta = atan2(previousY, previousX) - pi / 2.0; + var cp1Dx = cos(cp1Theta); + var cp1Dy = sin(cp1Theta); + + var cp2Theta = atan2(y, x) - pi / 2.0; + var cp2Dx = cos(cp2Theta); + var cp2Dy = sin(cp2Theta); + + var cp1Roundedness = longSegment ? innerRoundedness : outerRoundedness; + var cp2Roundedness = longSegment ? outerRoundedness : innerRoundedness; + var cp1Radius = longSegment ? innerRadius : outerRadius; + var cp2Radius = longSegment ? outerRadius : innerRadius; + + var cp1x = cp1Radius * cp1Roundedness * _polystarMagicNumber * cp1Dx; + var cp1y = cp1Radius * cp1Roundedness * _polystarMagicNumber * cp1Dy; + var cp2x = cp2Radius * cp2Roundedness * _polystarMagicNumber * cp2Dx; + var cp2y = cp2Radius * cp2Roundedness * _polystarMagicNumber * cp2Dy; + if (partialPointAmount != 0) { + if (i == 0) { + cp1x *= partialPointAmount; + cp1y *= partialPointAmount; + } else if (i == numPoints - 1) { + cp2x *= partialPointAmount; + cp2y *= partialPointAmount; + } + } + + _path.cubicTo( + previousX - cp1x, + previousY - cp1y, + x + cp2x, + y + cp2y, + x, + y, + ); + } + + currentAngle += dTheta; + longSegment = !longSegment; + } + + var position = _positionAnimation.value; + _path.shift(position); + _path.close(); + } + + void _createPolygonPath() { + var points = _pointsAnimation.value.floor(); + var currentAngle = _rotationAnimation.value; + // Start at +y instead of +x + currentAngle -= 90; + // convert to radians + currentAngle = radians(currentAngle); + // adjust current angle for partial points + var anglePerPoint = 2 * pi / points; + + var roundedness = _outerRoundednessAnimation.value / 100.0; + var radius = _outerRadiusAnimation.value; + double x; + double y; + double previousX; + double previousY; + x = radius * cos(currentAngle); + y = radius * sin(currentAngle); + _path.moveTo(x, y); + currentAngle += anglePerPoint; + + var numPoints = points.toDouble(); + for (var i = 0; i < numPoints; i++) { + previousX = x; + previousY = y; + x = radius * cos(currentAngle); + y = radius * sin(currentAngle); + + if (roundedness != 0) { + var cp1Theta = atan2(previousY, previousX) - pi / 2.0; + var cp1Dx = cos(cp1Theta); + var cp1Dy = sin(cp1Theta); + + var cp2Theta = atan2(y, x) - pi / 2.0; + var cp2Dx = cos(cp2Theta); + var cp2Dy = sin(cp2Theta); + + var cp1x = radius * roundedness * _polygonMagicNumber * cp1Dx; + var cp1y = radius * roundedness * _polygonMagicNumber * cp1Dy; + var cp2x = radius * roundedness * _polygonMagicNumber * cp2Dx; + var cp2y = radius * roundedness * _polygonMagicNumber * cp2Dy; + _path.cubicTo( + previousX - cp1x, + previousY - cp1y, + x + cp2x, + y + cp2y, + x, + y, + ); + } else { + _path.lineTo(x, y); + } + + currentAngle += anglePerPoint; + } + + var position = _positionAnimation.value; + _path.shift(position); + _path.close(); + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.polystarPoints) { + _pointsAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.polystarRotation) { + _rotationAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.position) { + _positionAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.polystarInnerRadius && + _innerRadiusAnimation != null) { + _innerRadiusAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.polystarOuterRadius) { + _outerRadiusAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.polystarInnerRoundedness && + _innerRoundednessAnimation != null) { + _innerRoundednessAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.polystarOuterRoundedness) { + _outerRoundednessAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } + } +} diff --git a/lottie/lib/src/animation/content/rectangle_content.dart b/lottie/lib/src/animation/content/rectangle_content.dart new file mode 100644 index 0000000..26ae774 --- /dev/null +++ b/lottie/lib/src/animation/content/rectangle_content.dart @@ -0,0 +1,207 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/rectangle_shape.dart'; +import '../../model/content/shape_trim_path.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils/misc.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import 'compound_trim_path_content.dart'; +import 'content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; +import 'rounded_corners_content.dart'; +import 'trim_path_content.dart'; + +class RectangleContent implements KeyPathElementContent, PathContent { + final _path = Path(); + + @override + final String? name; + final bool _hidden; + final LottieDrawable lottieDrawable; + final BaseKeyframeAnimation _positionAnimation; + final BaseKeyframeAnimation _sizeAnimation; + final BaseKeyframeAnimation _cornerRadiusAnimation; + + final CompoundTrimPathContent _trimPaths = CompoundTrimPathContent(); + + /// This corner radius is from a layer item. The first one is from the roundedness on this specific rect. + BaseKeyframeAnimation? _roundedCornersAnimation; + bool _isPathValid = false; + + RectangleContent( + this.lottieDrawable, + BaseLayer layer, + RectangleShape rectShape, + ) : name = rectShape.name, + _hidden = rectShape.hidden, + _positionAnimation = rectShape.position.createAnimation(), + _sizeAnimation = rectShape.size.createAnimation(), + _cornerRadiusAnimation = rectShape.cornerRadius.createAnimation() { + layer.addAnimation(_positionAnimation); + layer.addAnimation(_sizeAnimation); + layer.addAnimation(_cornerRadiusAnimation); + + _positionAnimation.addUpdateListener(invalidate); + _sizeAnimation.addUpdateListener(invalidate); + _cornerRadiusAnimation.addUpdateListener(invalidate); + } + + void invalidate() { + _isPathValid = false; + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + for (var i = 0; i < contentsBefore.length; i++) { + var content = contentsBefore[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.simultaneously) { + var trimPath = content; + _trimPaths.addTrimPath(trimPath); + trimPath.addListener(invalidate); + } else if (content is RoundedCornersContent) { + _roundedCornersAnimation = content.roundedCorners; + } + } + } + + @override + Path getPath() { + if (_isPathValid) { + return _path; + } + + _path.reset(); + + if (_hidden) { + _isPathValid = true; + return _path; + } + + var size = _sizeAnimation.value; + var halfWidth = size.dx / 2.0; + var halfHeight = size.dy / 2.0; + var radius = _cornerRadiusAnimation.value; + var roundedCornersAnimation = _roundedCornersAnimation; + if (radius == 0 && roundedCornersAnimation != null) { + radius = min(roundedCornersAnimation.value, min(halfWidth, halfHeight)); + } + var maxRadius = min(halfWidth, halfHeight); + if (radius > maxRadius) { + radius = maxRadius; + } + + // Draw the rectangle top right to bottom left. + var position = _positionAnimation.value; + + _path.moveTo(position.dx + halfWidth, position.dy - halfHeight + radius); + + _path.lineTo(position.dx + halfWidth, position.dy + halfHeight - radius); + + if (radius > 0) { + _path.arcTo( + Rect.fromLTRB( + position.dx + halfWidth - 2 * radius, + position.dy + halfHeight - 2 * radius, + position.dx + halfWidth, + position.dy + halfHeight, + ), + 0, + radians(90), + false, + ); + } + + _path.lineTo(position.dx - halfWidth + radius, position.dy + halfHeight); + + if (radius > 0) { + _path.arcTo( + Rect.fromLTRB( + position.dx - halfWidth, + position.dy + halfHeight - 2 * radius, + position.dx - halfWidth + 2 * radius, + position.dy + halfHeight, + ), + radians(90), + radians(90), + false, + ); + } + + _path.lineTo(position.dx - halfWidth, position.dy - halfHeight + radius); + + if (radius > 0) { + _path.arcTo( + Rect.fromLTRB( + position.dx - halfWidth, + position.dy - halfHeight, + position.dx - halfWidth + 2 * radius, + position.dy - halfHeight + 2 * radius, + ), + radians(180), + radians(90), + false, + ); + } + + _path.lineTo(position.dx + halfWidth - radius, position.dy - halfHeight); + + if (radius > 0) { + _path.arcTo( + Rect.fromLTRB( + position.dx + halfWidth - 2 * radius, + position.dy - halfHeight, + position.dx + halfWidth, + position.dy - halfHeight + 2 * radius, + ), + radians(270), + radians(90), + false, + ); + } + _path.close(); + + _trimPaths.apply(_path); + + _isPathValid = true; + return _path; + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.rectangleSize) { + _sizeAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.position) { + _positionAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } else if (property == LottieProperty.cornerRadius) { + _cornerRadiusAnimation.setValueCallback( + callback as LottieValueCallback?, + ); + } + } +} diff --git a/lottie/lib/src/animation/content/repeater_content.dart b/lottie/lib/src/animation/content/repeater_content.dart new file mode 100644 index 0000000..aeac934 --- /dev/null +++ b/lottie/lib/src/animation/content/repeater_content.dart @@ -0,0 +1,163 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/repeater.dart'; +import '../../model/key_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/misc.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/transform_keyframe_animation.dart'; +import 'content.dart'; +import 'content_group.dart'; +import 'drawing_content.dart'; +import 'greedy_content.dart'; +import 'key_path_element_content.dart'; +import 'path_content.dart'; + +class RepeaterContent + implements + DrawingContent, + PathContent, + GreedyContent, + KeyPathElementContent { + final Matrix4 _matrix = Matrix4.identity(); + final _path = Path(); + + final LottieDrawable lottieDrawable; + final BaseLayer layer; + final Repeater _repeater; + final BaseKeyframeAnimation _copies; + final BaseKeyframeAnimation _offset; + final TransformKeyframeAnimation _transform; + ContentGroup? _contentGroup; + + RepeaterContent(this.lottieDrawable, this.layer, this._repeater) + : _copies = _repeater.copies.createAnimation(), + _offset = _repeater.offset.createAnimation(), + _transform = _repeater.transform.createAnimation() { + layer.addAnimation(_copies); + _copies.addUpdateListener(_invalidate); + + layer.addAnimation(_offset); + _offset.addUpdateListener(_invalidate); + + _transform.addAnimationsToLayer(layer); + _transform.addListener(_invalidate); + } + + @override + void absorbContent(List contents) { + // This check prevents a repeater from getting added twice. + // This can happen in the following situation: + // RECTANGLE + // REPEATER 1 + // FILL + // REPEATER 2 + // In this case, the expected structure would be: + // REPEATER 2 + // REPEATER 1 + // RECTANGLE + // FILL + // Without this check, REPEATER 1 will try and absorb contents once it is already inside of + // REPEATER 2. + if (_contentGroup != null) { + return; + } + // Fast forward the iterator until after this content. + var index = contents.lastIndexOf(this) - 1; + var newContents = []; + while (index >= 0) { + var content = contents[index]; + newContents.add(content); + contents.removeAt(index); + --index; + } + newContents = newContents.reversed.toList(); + + _contentGroup = ContentGroup.copy( + lottieDrawable, + layer, + 'Repeater', + newContents, + null, + hidden: _repeater.hidden, + ); + } + + @override + String? get name => _repeater.name; + + @override + void setContents(List contentsBefore, List contentsAfter) { + _contentGroup!.setContents(contentsBefore, contentsAfter); + } + + @override + Path getPath() { + var contentPath = _contentGroup!.getPath(); + _path.reset(); + var copies = _copies.value; + var offset = _offset.value; + for (var i = copies.toInt() - 1; i >= 0; i--) { + _matrix.set(_transform.getMatrixForRepeater(i + offset)); + _path.addPath(contentPath, Offset.zero, matrix4: _matrix.storage); + } + return _path; + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + var copies = _copies.value; + var offset = _offset.value; + var startOpacity = _transform.startOpacity!.value / 100.0; + var endOpacity = _transform.endOpacity!.value / 100.0; + for (var i = copies.toInt() - 1; i >= 0; i--) { + _matrix.set(parentMatrix); + _matrix.preConcat(_transform.getMatrixForRepeater(i + offset)); + var newAlpha = + parentAlpha * lerpDouble(startOpacity, endOpacity, i / copies)!; + _contentGroup!.draw(canvas, _matrix, parentAlpha: newAlpha.round()); + } + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + return _contentGroup!.getBounds(parentMatrix, applyParents: applyParents); + } + + void _invalidate() { + lottieDrawable.invalidateSelf(); + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + MiscUtils.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + this, + ); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + if (_transform.applyValueCallback(property, callback)) { + return; + } + + if (property == LottieProperty.repeaterCopies) { + _copies.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.repeaterOffset) { + _offset.setValueCallback(callback as LottieValueCallback?); + } + } +} diff --git a/lottie/lib/src/animation/content/rounded_corners_content.dart b/lottie/lib/src/animation/content/rounded_corners_content.dart new file mode 100644 index 0000000..4a3c167 --- /dev/null +++ b/lottie/lib/src/animation/content/rounded_corners_content.dart @@ -0,0 +1,253 @@ +import 'dart:math' as math; +import 'dart:ui'; +import '../../lottie_drawable.dart'; +import '../../model/content/rounded_corners.dart'; +import '../../model/content/shape_data.dart'; +import '../../model/cubic_curve_data.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../utils/misc.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import 'content.dart'; +import 'shape_modifier_content.dart'; + +class RoundedCornersContent implements ShapeModifierContent { + /// Copied from: + /// https://github.com/airbnb/lottie-web/blob/bb71072a26e03f1ca993da60915860f39aae890b/player/js/utils/common.js#L47 + static const _roundedCornerMagicNumber = 0.5519; + + final LottieDrawable lottieDrawable; + + @override + final String name; + final BaseKeyframeAnimation roundedCorners; + ShapeData? shapeData; + + RoundedCornersContent( + this.lottieDrawable, + BaseLayer layer, + RoundedCorners roundedCorners, + ) : name = roundedCorners.name, + roundedCorners = roundedCorners.cornerRadius.createAnimation() { + layer.addAnimation(this.roundedCorners); + this.roundedCorners.addUpdateListener(_onValueChanged); + } + + void _onValueChanged() { + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + // Do nothing. + } + + /// Rounded corner algorithm: + /// Iterate through each vertex. + /// If a vertex is a sharp corner, it rounds it. + /// If a vertex has control points, it is already rounded, so it does nothing. + ///

+ /// To round a vertex: + /// Split the vertex into two. + /// Move vertex 1 directly towards the previous vertex. + /// Set vertex 1's in control point to itself so it is not rounded on that side. + /// Extend vertex 1's out control point towards the original vertex. + ///

+ /// Repeat for vertex 2: + /// Move vertex 2 directly towards the next vertex. + /// Set vertex 2's out point to itself so it is not rounded on that side. + /// Extend vertex 2's in control point towards the original vertex. + ///

+ /// The distance that the vertices and control points are moved are relative to the + /// shape's vertex distances and the roundedness set in the animation. + @override + ShapeData modifyShape(ShapeData startingShapeData) { + var startingCurves = startingShapeData.curves; + if (startingCurves.length <= 2) { + return startingShapeData; + } + var roundedness = roundedCorners.value; + if (roundedness == 0) { + return startingShapeData; + } + + var modifiedShapeData = _getShapeData(startingShapeData); + modifiedShapeData.setInitialPoint( + startingShapeData.initialPoint.dx, + startingShapeData.initialPoint.dy, + ); + var modifiedCurves = modifiedShapeData.curves; + var modifiedCurvesIndex = 0; + var isClosed = startingShapeData.isClosed; + + // i represents which vertex we are currently on. Refer to the docs of CubicCurveData prior to working with + // this code. + // When i == 0 + // vertex=ShapeData.initialPoint + // inCp=if closed vertex else curves[size - 1].cp2 + // outCp=curves[0].cp1 + // When i == 1 + // vertex=curves[0].vertex + // inCp=curves[0].cp2 + // outCp=curves[1].cp1. + // When i == size - 1 + // vertex=curves[size - 1].vertex + // inCp=curves[size - 1].cp2 + // outCp=if closed vertex else curves[0].cp1 + for (var i = 0; i < startingCurves.length; i++) { + var startingCurve = startingCurves[i]; + var previousCurve = + startingCurves[floorMod(i - 1, startingCurves.length)]; + var previousPreviousCurve = + startingCurves[floorMod(i - 2, startingCurves.length)]; + var vertex = (i == 0 && !isClosed) + ? startingShapeData.initialPoint + : previousCurve.vertex; + var inPoint = (i == 0 && !isClosed) + ? vertex + : previousCurve.controlPoint2; + var outPoint = startingCurve.controlPoint1; + var previousVertex = previousPreviousCurve.vertex; + var nextVertex = startingCurve.vertex; + + // We can't round the corner of the end of a non-closed curve. + var isEndOfCurve = + !startingShapeData.isClosed && + (i == 0 || i == startingCurves.length - 1); + if (inPoint == vertex && outPoint == vertex && !isEndOfCurve) { + // This vertex is a point. Round its corners + var dxToPreviousVertex = vertex.dx - previousVertex.dx; + var dyToPreviousVertex = vertex.dy - previousVertex.dy; + var dxToNextVertex = nextVertex.dx - vertex.dx; + var dyToNextVertex = nextVertex.dy - vertex.dy; + + var dToPreviousVertex = hypot(dxToPreviousVertex, dyToPreviousVertex); + var dToNextVertex = hypot(dxToNextVertex, dyToNextVertex); + + double previousVertexPercent = math.min( + roundedness / dToPreviousVertex, + 0.5, + ); + double nextVertexPercent = math.min(roundedness / dToNextVertex, 0.5); + + // Split the vertex into two and move each vertex towards the previous/next vertex. + var newVertex1X = + vertex.dx + (previousVertex.dx - vertex.dx) * previousVertexPercent; + var newVertex1Y = + vertex.dy + (previousVertex.dy - vertex.dy) * previousVertexPercent; + var newVertex2X = + vertex.dx + (nextVertex.dx - vertex.dx) * nextVertexPercent; + var newVertex2Y = + vertex.dy + (nextVertex.dy - vertex.dy) * nextVertexPercent; + + // Extend the new vertex control point towards the original vertex. + var newVertex1OutPointX = + newVertex1X - (newVertex1X - vertex.dx) * _roundedCornerMagicNumber; + var newVertex1OutPointY = + newVertex1Y - (newVertex1Y - vertex.dy) * _roundedCornerMagicNumber; + var newVertex2InPointX = + newVertex2X - (newVertex2X - vertex.dx) * _roundedCornerMagicNumber; + var newVertex2InPointY = + newVertex2Y - (newVertex2Y - vertex.dy) * _roundedCornerMagicNumber; + + // Remap vertex/in/out point to CubicCurveData. + // Refer to the docs for CubicCurveData for more info on the difference. + var previousCurveData = + modifiedCurves[floorMod( + modifiedCurvesIndex - 1, + modifiedCurves.length, + )]; + var currentCurveData = modifiedCurves[modifiedCurvesIndex]; + previousCurveData.controlPoint2 = Offset(newVertex1X, newVertex1Y); + previousCurveData.vertex = Offset(newVertex1X, newVertex1Y); + if (i == 0) { + modifiedShapeData.setInitialPoint(newVertex1X, newVertex1Y); + } + currentCurveData.controlPoint1 = Offset( + newVertex1OutPointX, + newVertex1OutPointY, + ); + modifiedCurvesIndex++; + + previousCurveData = currentCurveData; + currentCurveData = modifiedCurves[modifiedCurvesIndex]; + previousCurveData.controlPoint2 = Offset( + newVertex2InPointX, + newVertex2InPointY, + ); + previousCurveData.vertex = Offset(newVertex2X, newVertex2Y); + currentCurveData.controlPoint1 = Offset(newVertex2X, newVertex2Y); + modifiedCurvesIndex++; + } else { + // This vertex is not a point. Don't modify it. Refer to the documentation above and for CubicCurveData for mapping a vertex + // oriented point to CubicCurveData (path segments). + var previousCurveData = + modifiedCurves[floorMod( + modifiedCurvesIndex - 1, + modifiedCurves.length, + )]; + var currentCurveData = modifiedCurves[modifiedCurvesIndex]; + previousCurveData.controlPoint2 = Offset( + previousCurve.controlPoint2.dx, + previousCurve.controlPoint2.dy, + ); + previousCurveData.vertex = Offset( + previousCurve.vertex.dx, + previousCurve.vertex.dy, + ); + currentCurveData.controlPoint1 = Offset( + startingCurve.controlPoint1.dx, + startingCurve.controlPoint1.dy, + ); + modifiedCurvesIndex++; + } + } + return modifiedShapeData; + } + + /// Returns a shape data with the correct number of vertices for the rounded corners shape. + /// This just returns the object. It does not update any values within the shape. + + ShapeData _getShapeData(ShapeData startingShapeData) { + var startingCurves = startingShapeData.curves; + var isClosed = startingShapeData.isClosed; + var vertices = 0; + for (var i = startingCurves.length - 1; i >= 0; i--) { + var startingCurve = startingCurves[i]; + var previousCurve = + startingCurves[floorMod(i - 1, startingCurves.length)]; + var vertex = (i == 0 && !isClosed) + ? startingShapeData.initialPoint + : previousCurve.vertex; + var inPoint = (i == 0 && !isClosed) + ? vertex + : previousCurve.controlPoint2; + var outPoint = startingCurve.controlPoint1; + + var isEndOfCurve = + !startingShapeData.isClosed && + (i == 0 || i == startingCurves.length - 1); + if (inPoint == vertex && outPoint == vertex && !isEndOfCurve) { + vertices += 2; + } else { + vertices += 1; + } + } + var shapeData = this.shapeData; + if (shapeData == null || shapeData.curves.length != vertices) { + var newCurves = []; + for (var i = 0; i < vertices; i++) { + newCurves.add(CubicCurveData()); + } + this.shapeData = shapeData = ShapeData( + newCurves, + initialPoint: Offset.zero, + closed: false, + ); + } + shapeData.isClosed = isClosed; + return shapeData; + } + + static int floorMod(int x, int y) => MiscUtils.floorModInt(x, y); +} diff --git a/lottie/lib/src/animation/content/shape_content.dart b/lottie/lib/src/animation/content/shape_content.dart new file mode 100644 index 0000000..c7dc24b --- /dev/null +++ b/lottie/lib/src/animation/content/shape_content.dart @@ -0,0 +1,79 @@ +import 'dart:ui'; +import '../../lottie_drawable.dart'; +import '../../model/content/shape_path.dart'; +import '../../model/content/shape_trim_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../keyframe/shape_keyframe_animation.dart'; +import 'compound_trim_path_content.dart'; +import 'content.dart'; +import 'path_content.dart'; +import 'shape_modifier_content.dart'; +import 'trim_path_content.dart'; + +class ShapeContent implements PathContent { + final _path = Path(); + + final ShapePath _shape; + + final LottieDrawable lottieDrawable; + final ShapeKeyframeAnimation _shapeAnimation; + + bool _isPathValid = false; + final _trimPaths = CompoundTrimPathContent(); + + ShapeContent(this.lottieDrawable, BaseLayer layer, this._shape) + : _shapeAnimation = _shape.shapePath.createAnimation() { + layer.addAnimation(_shapeAnimation); + _shapeAnimation.addUpdateListener(_invalidate); + } + + void _invalidate() { + _isPathValid = false; + lottieDrawable.invalidateSelf(); + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + List? shapeModifierContents; + for (var i = 0; i < contentsBefore.length; i++) { + var content = contentsBefore[i]; + if (content is TrimPathContent && + content.type == ShapeTrimPathType.simultaneously) { + // Trim path individually will be handled by the stroke where paths are combined. + var trimPath = content; + _trimPaths.addTrimPath(trimPath); + trimPath.addListener(_invalidate); + } else if (content is ShapeModifierContent) { + shapeModifierContents ??= []; + shapeModifierContents.add(content); + } + } + _shapeAnimation.setShapeModifiers(shapeModifierContents); + } + + @override + String? get name => _shape.name; + + @override + Path getPath() { + if (_isPathValid) { + return _path; + } + + _path.reset(); + + if (_shape.hidden) { + _isPathValid = true; + return _path; + } + + _path.set(_shapeAnimation.value); + _path.fillType = PathFillType.evenOdd; + + _trimPaths.apply(_path); + + _isPathValid = true; + return _path; + } +} diff --git a/lottie/lib/src/animation/content/shape_modifier_content.dart b/lottie/lib/src/animation/content/shape_modifier_content.dart new file mode 100644 index 0000000..12daabe --- /dev/null +++ b/lottie/lib/src/animation/content/shape_modifier_content.dart @@ -0,0 +1,6 @@ +import '../../model/content/shape_data.dart'; +import 'content.dart'; + +abstract class ShapeModifierContent extends Content { + ShapeData modifyShape(ShapeData shapeData); +} diff --git a/lottie/lib/src/animation/content/stroke_content.dart b/lottie/lib/src/animation/content/stroke_content.dart new file mode 100644 index 0000000..fd02906 --- /dev/null +++ b/lottie/lib/src/animation/content/stroke_content.dart @@ -0,0 +1,76 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../model/content/shape_stroke.dart'; +import '../../model/layer/base_layer.dart'; +import '../../value/lottie_value_callback.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import '../keyframe/value_callback_keyframe_animation.dart'; +import 'base_stroke_content.dart'; + +class StrokeContent extends BaseStrokeContent { + @override + final String? name; + final bool _hidden; + final BaseKeyframeAnimation _colorAnimation; + BaseKeyframeAnimation? _colorFilterAnimation; + + StrokeContent( + LottieDrawable lottieDrawable, + BaseLayer layer, + ShapeStroke stroke, + ) : name = stroke.name, + _hidden = stroke.hidden, + _colorAnimation = stroke.color.createAnimation(), + super( + lottieDrawable, + layer, + cap: lineCapTypeToPaintCap(stroke.capType), + join: lineJoinTypeToPaintJoin(stroke.joinType), + miterLimit: stroke.miterLimit, + opacity: stroke.opacity, + width: stroke.width, + dashPattern: stroke.lineDashPattern, + dashOffset: stroke.dashOffset, + ) { + _colorAnimation.addUpdateListener(onUpdateListener); + layer.addAnimation(_colorAnimation); + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + if (_hidden) { + return; + } + paint.color = _colorAnimation.value.withAlpha( + (paint.color.a * 255).toInt(), + ); + if (_colorFilterAnimation != null) { + paint.colorFilter = _colorFilterAnimation!.value; + } + super.draw(canvas, parentMatrix, parentAlpha: parentAlpha); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + if (property == LottieProperty.strokeColor) { + _colorAnimation.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.colorFilter) { + if (_colorFilterAnimation != null) { + layer.removeAnimation(_colorFilterAnimation); + } + + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + )..addUpdateListener(onUpdateListener); + layer.addAnimation(_colorAnimation); + } + } + } +} diff --git a/lottie/lib/src/animation/content/trim_path_content.dart b/lottie/lib/src/animation/content/trim_path_content.dart new file mode 100644 index 0000000..56737bb --- /dev/null +++ b/lottie/lib/src/animation/content/trim_path_content.dart @@ -0,0 +1,46 @@ +import '../../model/content/shape_trim_path.dart'; +import '../../model/layer/base_layer.dart'; +import '../keyframe/base_keyframe_animation.dart'; +import 'content.dart'; + +class TrimPathContent implements Content { + @override + final String? name; + final bool hidden; + final _listeners = []; + final ShapeTrimPathType? type; + final BaseKeyframeAnimation start; + final BaseKeyframeAnimation end; + final BaseKeyframeAnimation offset; + + TrimPathContent(BaseLayer layer, ShapeTrimPath trimPath) + : name = trimPath.name, + hidden = trimPath.hidden, + type = trimPath.type, + start = trimPath.start.createAnimation(), + end = trimPath.end.createAnimation(), + offset = trimPath.offset.createAnimation() { + layer.addAnimation(start); + layer.addAnimation(end); + layer.addAnimation(offset); + + start.addUpdateListener(_onValueChanged); + end.addUpdateListener(_onValueChanged); + offset.addUpdateListener(_onValueChanged); + } + + void _onValueChanged() { + for (var i = 0; i < _listeners.length; i++) { + _listeners[i](); + } + } + + @override + void setContents(List contentsBefore, List contentsAfter) { + // Do nothing. + } + + void addListener(void Function() listener) { + _listeners.add(listener); + } +} diff --git a/lottie/lib/src/animation/keyframe/base_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/base_keyframe_animation.dart new file mode 100644 index 0000000..c4defc1 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/base_keyframe_animation.dart @@ -0,0 +1,331 @@ +import 'package:flutter/foundation.dart'; +import '../../l.dart'; +import '../../value/keyframe.dart'; +import '../../value/lottie_value_callback.dart'; + +/// @param K Keyframe type +/// @param A Animation type +abstract class BaseKeyframeAnimation { + // This is not a Set because we don't want to create an iterator object on every setProgress. + final listeners = []; + bool _isDiscrete = false; + + final _KeyframesWrapper _keyframesWrapper; + double _progress = 0; + LottieValueCallback? valueCallback; + + A? _cachedGetValue; + + double _cachedStartDelayProgress = -1.0; + double _cachedEndProgress = -1.0; + + BaseKeyframeAnimation(List> keyframes) + : _keyframesWrapper = _wrap(keyframes); + + void setIsDiscrete() { + _isDiscrete = true; + } + + void addUpdateListener(void Function() listener) { + listeners.add(listener); + } + + void setProgress(double progress) { + if (_keyframesWrapper.isEmpty) { + return; + } + if (progress < getStartDelayProgress()) { + progress = getStartDelayProgress(); + } else if (progress > getEndProgress()) { + progress = getEndProgress(); + } + + if (progress == _progress) { + return; + } + _progress = progress; + if (_keyframesWrapper.isValueChanged(progress)) { + notifyListeners(); + } + } + + void notifyListeners() { + for (var listener in listeners) { + listener(); + } + } + + Keyframe getCurrentKeyframe() { + L.beginSection('BaseKeyframeAnimation#getCurrentKeyframe'); + final keyframe = _keyframesWrapper.getCurrentKeyframe(); + L.endSection('BaseKeyframeAnimation#getCurrentKeyframe'); + return keyframe; + } + + /// Returns the progress into the current keyframe between 0 and 1. This does not take into account + /// any interpolation that the keyframe may have. + double getLinearCurrentKeyframeProgress() { + if (_isDiscrete) { + return 0.0; + } + + var keyframe = getCurrentKeyframe(); + if (keyframe.isStatic) { + return 0.0; + } + var progressIntoFrame = _progress - keyframe.startProgress; + var keyframeProgress = keyframe.endProgress - keyframe.startProgress; + return (progressIntoFrame / keyframeProgress).clamp(0, 1); + } + + /// Takes the value of {@link #getLinearCurrentKeyframeProgress()} and interpolates it with + /// the current keyframe's interpolator. + double getInterpolatedCurrentKeyframeProgress() { + var keyframe = getCurrentKeyframe(); + if (keyframe.isStatic || keyframe.interpolator == null) { + return 0.0; + } + return keyframe.interpolator!.transform(getLinearCurrentKeyframeProgress()); + } + + double getStartDelayProgress() { + if (_cachedStartDelayProgress == -1) { + _cachedStartDelayProgress = _keyframesWrapper.getStartDelayProgress(); + } + return _cachedStartDelayProgress; + } + + double getEndProgress() { + if (_cachedEndProgress == -1) { + _cachedEndProgress = _keyframesWrapper.getEndProgress(); + } + return _cachedEndProgress; + } + + A get value { + A value; + + var linearProgress = getLinearCurrentKeyframeProgress(); + if (valueCallback == null && + _keyframesWrapper.isCachedValueEnabled(linearProgress)) { + return _cachedGetValue!; + } + + final keyframe = getCurrentKeyframe(); + if (keyframe.xInterpolator != null && keyframe.yInterpolator != null) { + var xProgress = keyframe.xInterpolator!.transform(linearProgress); + var yProgress = keyframe.yInterpolator!.transform(linearProgress); + value = getValueSplitDimension( + keyframe, + linearProgress, + xProgress, + yProgress, + ); + } else { + var progress = getInterpolatedCurrentKeyframeProgress(); + value = getValue(keyframe, progress); + } + + _cachedGetValue = value; + + return value; + } + + double get progress { + return _progress; + } + + @protected + set progress(double value) { + _progress = value; + } + + void setValueCallback(LottieValueCallback? valueCallback) { + if (this.valueCallback != null) { + this.valueCallback!.setAnimation(null); + } + this.valueCallback = valueCallback; + if (valueCallback != null) { + valueCallback.setAnimation(this); + } + } + + /// keyframeProgress will be [0, 1] unless the interpolator has overshoot in which case, this + /// should be able to handle values outside of that range. + A getValue(Keyframe keyframe, double keyframeProgress); + + A getValueSplitDimension( + Keyframe keyframe, + double linearKeyframeProgress, + double xKeyframeProgress, + double yKeyframeProgress, + ) { + throw Exception('This animation does not support split dimensions!'); + } + + static _KeyframesWrapper _wrap(List> keyframes) { + if (keyframes.isEmpty) { + return _EmptyKeyframeWrapper(); + } + if (keyframes.length == 1) { + return _SingleKeyframeWrapper(keyframes); + } + return _KeyframesWrapperImpl(keyframes); + } +} + +abstract class _KeyframesWrapper { + bool get isEmpty; + + bool isValueChanged(double progress); + + Keyframe getCurrentKeyframe(); + + double getStartDelayProgress(); + + double getEndProgress(); + + bool isCachedValueEnabled(double progress); +} + +class _EmptyKeyframeWrapper implements _KeyframesWrapper { + @override + bool get isEmpty { + return true; + } + + @override + bool isValueChanged(double progress) { + return false; + } + + @override + Keyframe getCurrentKeyframe() { + throw StateError('not implemented'); + } + + @override + double getStartDelayProgress() { + return 0; + } + + @override + double getEndProgress() { + return 1; + } + + @override + bool isCachedValueEnabled(double progress) { + throw StateError('not implemented'); + } +} + +class _SingleKeyframeWrapper implements _KeyframesWrapper { + final Keyframe keyframe; + double _cachedInterpolatedProgress = -1; + + _SingleKeyframeWrapper(List> keyframes) + : keyframe = keyframes.first; + + @override + bool get isEmpty { + return false; + } + + @override + bool isValueChanged(double progress) { + return !keyframe.isStatic; + } + + @override + Keyframe getCurrentKeyframe() { + return keyframe; + } + + @override + double getStartDelayProgress() { + return keyframe.startProgress; + } + + @override + double getEndProgress() { + return keyframe.endProgress; + } + + @override + bool isCachedValueEnabled(double progress) { + if (_cachedInterpolatedProgress == progress) { + return true; + } + _cachedInterpolatedProgress = progress; + return false; + } +} + +class _KeyframesWrapperImpl implements _KeyframesWrapper { + final List> keyframes; + Keyframe? _currentKeyframe; + Keyframe? _cachedCurrentKeyframe; + double _cachedInterpolatedProgress = -1; + + _KeyframesWrapperImpl(this.keyframes) { + _currentKeyframe = findKeyframe(0); + } + + @override + bool get isEmpty { + return false; + } + + @override + bool isValueChanged(double progress) { + if (_currentKeyframe!.containsProgress(progress)) { + return !_currentKeyframe!.isStatic; + } + _currentKeyframe = findKeyframe(progress); + return true; + } + + Keyframe findKeyframe(double progress) { + var keyframe = keyframes.last; + if (progress >= keyframe.startProgress) { + return keyframe; + } + for (var i = keyframes.length - 2; i >= 1; i--) { + keyframe = keyframes[i]; + if (_currentKeyframe == keyframe) { + continue; + } + if (keyframe.containsProgress(progress)) { + return keyframe; + } + } + return keyframes.first; + } + + @override + Keyframe getCurrentKeyframe() { + return _currentKeyframe!; + } + + @override + double getStartDelayProgress() { + return keyframes.first.startProgress; + } + + @override + double getEndProgress() { + return keyframes.last.endProgress; + } + + @override + bool isCachedValueEnabled(double progress) { + if (_cachedCurrentKeyframe == _currentKeyframe && + _cachedInterpolatedProgress == progress) { + return true; + } + _cachedCurrentKeyframe = _currentKeyframe; + _cachedInterpolatedProgress = progress; + return false; + } +} diff --git a/lottie/lib/src/animation/keyframe/color_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/color_keyframe_animation.dart new file mode 100644 index 0000000..d87c5c9 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/color_keyframe_animation.dart @@ -0,0 +1,38 @@ +import 'dart:ui'; +import '../../utils/gamma_evaluator.dart'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; + +class ColorKeyframeAnimation extends KeyframeAnimation { + ColorKeyframeAnimation(super.keyframes); + + @override + Color getValue(Keyframe keyframe, double keyframeProgress) { + if (keyframe.startValue == null || keyframe.endValue == null) { + throw Exception('Missing values for keyframe.'); + } + var startColor = keyframe.startValue; + var endColor = keyframe.endValue; + + if (valueCallback != null) { + var value = valueCallback!.getValueInternal( + keyframe.startFrame, + keyframe.endFrame, + startColor, + endColor, + keyframeProgress, + getLinearCurrentKeyframeProgress(), + progress, + ); + if (value != null) { + return value; + } + } + + return GammaEvaluator.evaluate( + keyframeProgress.clamp(0, 1).toDouble(), + startColor!, + endColor!, + ); + } +} diff --git a/lottie/lib/src/animation/keyframe/double_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/double_keyframe_animation.dart new file mode 100644 index 0000000..e689a46 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/double_keyframe_animation.dart @@ -0,0 +1,35 @@ +import 'dart:ui'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; + +class DoubleKeyframeAnimation extends KeyframeAnimation { + DoubleKeyframeAnimation(super.keyframes); + + @override + double getValue(Keyframe keyframe, double keyframeProgress) { + if (keyframe.startValue == null || keyframe.endValue == null) { + throw Exception('Missing values for keyframe.'); + } + + if (valueCallback != null) { + var value = valueCallback!.getValueInternal( + keyframe.startFrame, + keyframe.endFrame, + keyframe.startValue, + keyframe.endValue, + keyframeProgress, + getLinearCurrentKeyframeProgress(), + progress, + ); + if (value != null) { + return value; + } + } + + return lerpDouble( + keyframe.startValue, + keyframe.endValue, + keyframeProgress, + )!; + } +} diff --git a/lottie/lib/src/animation/keyframe/drop_shadow_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/drop_shadow_keyframe_animation.dart new file mode 100644 index 0000000..7655946 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/drop_shadow_keyframe_animation.dart @@ -0,0 +1,117 @@ +import 'dart:math' as math; +import 'dart:ui'; +import '../../lottie_property.dart'; +import '../../model/content/drop_shadow_effect.dart'; +import '../../model/layer/base_layer.dart'; +import '../../value/drop_shadow.dart'; +import '../../value/lottie_frame_info.dart'; +import '../../value/lottie_value_callback.dart'; +import 'base_keyframe_animation.dart'; +import 'color_keyframe_animation.dart'; + +class DropShadowKeyframeAnimation { + static const double _degToRad = math.pi / 180.0; + + final void Function() listener; + late final ColorKeyframeAnimation _color; + late final BaseKeyframeAnimation _opacity; + late final BaseKeyframeAnimation _direction; + late final BaseKeyframeAnimation _distance; + late final BaseKeyframeAnimation _radius; + + Paint? _paint; + + DropShadowKeyframeAnimation( + this.listener, + BaseLayer layer, + DropShadowEffect dropShadowEffect, + ) { + _color = dropShadowEffect.color.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_color); + _opacity = dropShadowEffect.opacity.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_opacity); + _direction = dropShadowEffect.direction.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_direction); + _distance = dropShadowEffect.distance.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_distance); + _radius = dropShadowEffect.radius.createAnimation() + ..addUpdateListener(onValueChanged); + layer.addAnimation(_radius); + } + + void onValueChanged() { + _paint = null; + listener(); + } + + void draw(Canvas canvas, Path path) { + var directionRad = _direction.value * _degToRad; + var distance = _distance.value; + var x = math.sin(directionRad) * distance; + var y = math.cos(directionRad + math.pi) * distance; + var baseColor = _color.value; + var opacity = _opacity.value.round(); + var color = baseColor.withAlpha(opacity); + var radius = _radius.value; + + var sigma = radius * 0.57735 + 0.5; + + var paint = _paint; + paint ??= _paint = Paint() + ..color = color + ..maskFilter = MaskFilter.blur(BlurStyle.normal, sigma); + + canvas.drawPath(path.shift(Offset(x, y)), paint); + } + + void setCallback(LottieValueCallback? callback) { + if (callback != null) { + _color.setValueCallback( + _createCallback(callback, (c) => c?.color ?? const Color(0xff000000)), + ); + _opacity.setValueCallback( + _createCallback(callback, (c) => c?.color.a ?? 1), + ); + _direction.setValueCallback( + _createCallback(callback, (c) => c?.direction ?? 0), + ); + _distance.setValueCallback( + _createCallback(callback, (c) => c?.distance ?? 0), + ); + _radius.setValueCallback( + _createCallback(callback, (c) => c?.radius ?? 0), + ); + } else { + _color.setValueCallback(null); + _opacity.setValueCallback(null); + _direction.setValueCallback(null); + _distance.setValueCallback(null); + _radius.setValueCallback(null); + } + } + + LottieValueCallback _createCallback( + LottieValueCallback callback, + T Function(DropShadow?) selector, + ) { + return LottieValueCallback(null) + ..callback = (info) { + onValueChanged(); + var frameInfo = LottieFrameInfo( + info.startFrame, + info.endFrame, + LottieProperty.dropShadow, + LottieProperty.dropShadow, + info.linearKeyframeProgress, + info.interpolatedKeyframeProgress, + info.overallProgress, + ); + var dropShadow = callback.getValue(frameInfo); + return selector(dropShadow); + }; + } +} diff --git a/lottie/lib/src/animation/keyframe/gradient_color_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/gradient_color_keyframe_animation.dart new file mode 100644 index 0000000..20df218 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/gradient_color_keyframe_animation.dart @@ -0,0 +1,41 @@ +import 'dart:math' as math; +import 'dart:ui'; +import '../../model/content/gradient_color.dart'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; + +class GradientColorKeyframeAnimation extends KeyframeAnimation { + late GradientColor _gradientColor; + + GradientColorKeyframeAnimation(List> keyframes) + : super(keyframes) { + // Not all keyframes that this GradientColor are used for will have the same length. + // AnimatableGradientColorValue.ensureInterpolatableKeyframes may add extra positions + // for some keyframes but not others to ensure that it is interpolatable. + // Ensure that there is enough space for the largest keyframe. + var size = 0; + for (var i = 0; i < keyframes.length; i++) { + var startValue = keyframes[i].startValue; + if (startValue != null) { + size = math.max(size, startValue.size); + } + } + _gradientColor = GradientColor( + List.filled(size, 0.0), + List.filled(size, const Color(0x00000000)), + ); + } + + @override + GradientColor getValue( + Keyframe keyframe, + double keyframeProgress, + ) { + _gradientColor.lerp( + keyframe.startValue!, + keyframe.endValue!, + keyframeProgress, + ); + return _gradientColor; + } +} diff --git a/lottie/lib/src/animation/keyframe/integer_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/integer_keyframe_animation.dart new file mode 100644 index 0000000..e615f41 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/integer_keyframe_animation.dart @@ -0,0 +1,33 @@ +import 'dart:ui'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; + +class IntegerKeyframeAnimation extends KeyframeAnimation { + IntegerKeyframeAnimation(super.keyframes); + + @override + int getValue(Keyframe keyframe, double keyframeProgress) { + if (keyframe.startValue == null) { + throw Exception('Missing values for keyframe.'); + } + + var endValue = keyframe.endValue ?? keyframe.startValue; + + if (valueCallback != null) { + var value = valueCallback!.getValueInternal( + keyframe.startFrame, + keyframe.endFrame, + keyframe.startValue, + endValue, + keyframeProgress, + getLinearCurrentKeyframeProgress(), + progress, + ); + if (value != null) { + return value; + } + } + + return lerpDouble(keyframe.startValue, endValue, keyframeProgress)!.round(); + } +} diff --git a/lottie/lib/src/animation/keyframe/keyframe_animation.dart b/lottie/lib/src/animation/keyframe/keyframe_animation.dart new file mode 100644 index 0000000..790d98e --- /dev/null +++ b/lottie/lib/src/animation/keyframe/keyframe_animation.dart @@ -0,0 +1,6 @@ +import 'base_keyframe_animation.dart'; + +abstract class KeyframeAnimation + extends BaseKeyframeAnimation { + KeyframeAnimation(super.keyframes); +} diff --git a/lottie/lib/src/animation/keyframe/mask_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/mask_keyframe_animation.dart new file mode 100644 index 0000000..c083802 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/mask_keyframe_animation.dart @@ -0,0 +1,17 @@ +import 'dart:ui'; +import '../../model/content/mask.dart'; +import '../../model/content/shape_data.dart'; +import 'base_keyframe_animation.dart'; + +class MaskKeyframeAnimation { + final maskAnimations = >[]; + final opacityAnimations = >[]; + final List masks; + + MaskKeyframeAnimation(this.masks) { + for (var mask in masks) { + maskAnimations.add(mask.maskPath.createAnimation()); + opacityAnimations.add(mask.opacity.createAnimation()); + } + } +} diff --git a/lottie/lib/src/animation/keyframe/path_keyframe.dart b/lottie/lib/src/animation/keyframe/path_keyframe.dart new file mode 100644 index 0000000..97c4761 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/path_keyframe.dart @@ -0,0 +1,40 @@ +import 'dart:ui'; +import '../../composition.dart'; +import '../../utils/utils.dart'; +import '../../value/keyframe.dart'; + +class PathKeyframe extends Keyframe { + Path? _path; + final Keyframe _pointKeyFrame; + + PathKeyframe(LottieComposition super.composition, Keyframe keyframe) + : _pointKeyFrame = keyframe, + super( + startValue: keyframe.startValue, + endValue: keyframe.endValue, + interpolator: keyframe.interpolator, + xInterpolator: keyframe.xInterpolator, + yInterpolator: keyframe.yInterpolator, + startFrame: keyframe.startFrame, + endFrame: keyframe.endFrame, + ); + + Path? _createPath() { + var equals = + endValue != null && startValue != null && startValue == endValue; + if (startValue != null && endValue != null && !equals) { + return Utils.createPath( + startValue!, + endValue!, + _pointKeyFrame.pathCp1, + _pointKeyFrame.pathCp2, + ); + } + return null; + } + + /// This will be null if the startValue and endValue are the same. + Path? getPath() { + return _path ??= _createPath(); + } +} diff --git a/lottie/lib/src/animation/keyframe/path_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/path_keyframe_animation.dart new file mode 100644 index 0000000..713c15f --- /dev/null +++ b/lottie/lib/src/animation/keyframe/path_keyframe_animation.dart @@ -0,0 +1,58 @@ +import 'dart:ui'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; +import 'path_keyframe.dart'; + +class PathKeyframeAnimation extends KeyframeAnimation { + PathKeyframe? _pathMeasureKeyframe; + late PathMetric _pathMeasure; + + PathKeyframeAnimation(super.keyframes); + + @override + Offset getValue(Keyframe keyframe, double keyframeProgress) { + var pathKeyframe = keyframe as PathKeyframe; + var path = pathKeyframe.getPath(); + if (path == null) { + return keyframe.startValue!; + } + + if (valueCallback != null) { + var value = valueCallback!.getValueInternal( + pathKeyframe.startFrame, + pathKeyframe.endFrame, + pathKeyframe.startValue, + pathKeyframe.endValue, + getLinearCurrentKeyframeProgress(), + keyframeProgress, + progress, + ); + if (value != null) { + return value; + } + } + + if (_pathMeasureKeyframe != pathKeyframe) { + _pathMeasure = path.computeMetrics().toList().first; + _pathMeasureKeyframe = pathKeyframe; + } + + var length = _pathMeasure.length; + + // allow bounce easings to calculate positions outside the path + // by using the tangent at the extremities + + if (keyframeProgress < 0) { + var tangent = _pathMeasure.getTangentForOffset(0)!; + return tangent.position + tangent.vector * (keyframeProgress * length); + } else if (keyframeProgress > 1) { + var tangent = _pathMeasure.getTangentForOffset(length)!; + return tangent.position + + tangent.vector * ((keyframeProgress - 1) * length); + } else { + return _pathMeasure + .getTangentForOffset(keyframeProgress * length)! + .position; + } + } +} diff --git a/lottie/lib/src/animation/keyframe/point_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/point_keyframe_animation.dart new file mode 100644 index 0000000..af5882c --- /dev/null +++ b/lottie/lib/src/animation/keyframe/point_keyframe_animation.dart @@ -0,0 +1,52 @@ +import 'dart:ui'; +import '../../value/keyframe.dart'; +import 'keyframe_animation.dart'; + +class PointKeyframeAnimation extends KeyframeAnimation { + PointKeyframeAnimation(super.keyframes); + + @override + Offset getValue(Keyframe keyframe, double keyframeProgress) { + return getValueSplitDimension( + keyframe, + keyframeProgress, + keyframeProgress, + keyframeProgress, + ); + } + + @override + Offset getValueSplitDimension( + Keyframe keyframe, + double linearKeyframeProgress, + double xKeyframeProgress, + double yKeyframeProgress, + ) { + if (keyframe.startValue == null || keyframe.endValue == null) { + throw Exception('Missing values for keyframe.'); + } + + var startPoint = keyframe.startValue!; + var endPoint = keyframe.endValue!; + + if (valueCallback != null) { + var value = valueCallback!.getValueInternal( + keyframe.startFrame, + keyframe.endFrame, + startPoint, + endPoint, + linearKeyframeProgress, + getLinearCurrentKeyframeProgress(), + progress, + ); + if (value != null) { + return value; + } + } + + return Offset( + startPoint.dx + xKeyframeProgress * (endPoint.dx - startPoint.dx), + startPoint.dy + yKeyframeProgress * (endPoint.dy - startPoint.dy), + ); + } +} diff --git a/lottie/lib/src/animation/keyframe/shape_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/shape_keyframe_animation.dart new file mode 100644 index 0000000..5ee13d6 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/shape_keyframe_animation.dart @@ -0,0 +1,39 @@ +import 'dart:ui'; +import '../../model/content/shape_data.dart'; +import '../../utils/misc.dart'; +import '../../value/keyframe.dart'; +import '../content/shape_modifier_content.dart'; +import 'base_keyframe_animation.dart'; + +class ShapeKeyframeAnimation extends BaseKeyframeAnimation { + final ShapeData _tempShapeData = ShapeData.empty(); + final Path _tempPath = Path(); + List? _shapeModifiers; + + ShapeKeyframeAnimation(super.keyframes); + + @override + Path getValue(Keyframe keyframe, double keyframeProgress) { + var startShapeData = keyframe.startValue!; + var endShapeData = keyframe.endValue ?? startShapeData; + + _tempShapeData.interpolateBetween( + startShapeData, + endShapeData, + keyframeProgress, + ); + var modifiedShapeData = _tempShapeData; + var shapeModifiers = _shapeModifiers; + if (shapeModifiers != null) { + for (var i = shapeModifiers.length - 1; i >= 0; i--) { + modifiedShapeData = shapeModifiers[i].modifyShape(modifiedShapeData); + } + } + MiscUtils.getPathFromData(modifiedShapeData, _tempPath); + return _tempPath; + } + + void setShapeModifiers(List? shapeModifiers) { + _shapeModifiers = shapeModifiers; + } +} diff --git a/lottie/lib/src/animation/keyframe/split_dimension_path_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/split_dimension_path_keyframe_animation.dart new file mode 100644 index 0000000..ae4ebc5 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/split_dimension_path_keyframe_animation.dart @@ -0,0 +1,36 @@ +import 'dart:ui'; +import '../../value/keyframe.dart'; +import 'base_keyframe_animation.dart'; + +class SplitDimensionPathKeyframeAnimation + extends BaseKeyframeAnimation { + late Offset _point; + final BaseKeyframeAnimation _xAnimation; + final BaseKeyframeAnimation _yAnimation; + + SplitDimensionPathKeyframeAnimation(this._xAnimation, this._yAnimation) + : super(>[]) { + // We need to call an initial setProgress so point gets set with the initial value. + setProgress(progress); + } + + @override + void setProgress(double progress) { + _xAnimation.setProgress(progress); + _yAnimation.setProgress(progress); + _point = Offset(_xAnimation.value, _yAnimation.value); + for (var i = 0; i < listeners.length; i++) { + listeners[i](); + } + } + + @override + Offset get value { + return _point; + } + + @override + Offset getValue(Keyframe keyframe, double keyframeProgress) { + return _point; + } +} diff --git a/lottie/lib/src/animation/keyframe/text_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/text_keyframe_animation.dart new file mode 100644 index 0000000..bcf6c45 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/text_keyframe_animation.dart @@ -0,0 +1,74 @@ +import '../../model/document_data.dart'; +import '../../value/keyframe.dart'; +import '../../value/lottie_frame_info.dart'; +import '../../value/lottie_value_callback.dart'; +import 'keyframe_animation.dart'; + +class TextKeyframeAnimation extends KeyframeAnimation { + TextKeyframeAnimation(super.keyframes); + + @override + DocumentData getValue( + Keyframe keyframe, + double keyframeProgress, + ) { + var valueCallback = this.valueCallback; + if (valueCallback != null) { + return valueCallback.getValueInternal( + keyframe.startFrame, + keyframe.endFrame ?? double.maxFinite, + keyframe.startValue, + keyframe.endValue ?? keyframe.startValue, + keyframeProgress, + getInterpolatedCurrentKeyframeProgress(), + progress, + )!; + } else if (keyframeProgress != 1.0 || keyframe.endValue == null) { + return keyframe.startValue!; + } else { + return keyframe.endValue!; + } + } + + void setStringValueCallback(LottieValueCallback valueCallback) { + super.setValueCallback(_DocumentDataValueCallback(valueCallback)); + } +} + +class _DocumentDataValueCallback extends LottieValueCallback { + final LottieValueCallback valueCallback; + + _DocumentDataValueCallback(this.valueCallback) : super(null); + + @override + DocumentData getValue(LottieFrameInfo frameInfo) { + var stringFrameInfo = LottieFrameInfo( + frameInfo.startFrame, + frameInfo.endFrame, + frameInfo.startValue!.text, + frameInfo.endValue!.text, + frameInfo.linearKeyframeProgress, + frameInfo.interpolatedKeyframeProgress, + frameInfo.overallProgress, + ); + var text = valueCallback.getValue(stringFrameInfo)!; + var baseDocumentData = frameInfo.interpolatedKeyframeProgress == 1 + ? frameInfo.endValue! + : frameInfo.startValue!; + return DocumentData( + text: text, + fontName: baseDocumentData.fontName, + size: baseDocumentData.size, + justification: baseDocumentData.justification, + tracking: baseDocumentData.tracking, + lineHeight: baseDocumentData.lineHeight, + baselineShift: baseDocumentData.baselineShift, + color: baseDocumentData.color, + strokeColor: baseDocumentData.strokeColor, + strokeWidth: baseDocumentData.strokeWidth, + strokeOverFill: baseDocumentData.strokeOverFill, + boxPosition: baseDocumentData.boxPosition, + boxSize: baseDocumentData.boxSize, + ); + } +} diff --git a/lottie/lib/src/animation/keyframe/transform_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/transform_keyframe_animation.dart new file mode 100644 index 0000000..8b4baac --- /dev/null +++ b/lottie/lib/src/animation/keyframe/transform_keyframe_animation.dart @@ -0,0 +1,344 @@ +import 'dart:math' hide Point, Rectangle; +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../lottie_property.dart'; +import '../../model/animatable/animatable_transform.dart'; +import '../../model/layer/base_layer.dart'; +import '../../utils.dart'; +import '../../value/keyframe.dart'; +import '../../value/lottie_value_callback.dart'; +import 'base_keyframe_animation.dart'; +import 'double_keyframe_animation.dart'; +import 'value_callback_keyframe_animation.dart'; + +class TransformKeyframeAnimation { + TransformKeyframeAnimation(AnimatableTransform animatableTransform) + : _skewMatrix1 = animatableTransform.skew == null + ? null + : Matrix4.identity(), + _skewMatrix2 = animatableTransform.skew == null + ? null + : Matrix4.identity(), + _skewMatrix3 = animatableTransform.skew == null + ? null + : Matrix4.identity(), + _anchorPoint = animatableTransform.anchorPoint?.createAnimation(), + _position = animatableTransform.position?.createAnimation(), + _scale = animatableTransform.scale?.createAnimation(), + _rotation = animatableTransform.rotation?.createAnimation(), + _autoOrient = animatableTransform.isAutoOrient, + _skew = animatableTransform.skew?.createAnimation(), + _skewAngle = animatableTransform.skewAngle?.createAnimation(), + _opacity = animatableTransform.opacity?.createAnimation(), + _startOpacity = animatableTransform.startOpacity?.createAnimation(), + _endOpacity = animatableTransform.endOpacity?.createAnimation(); + + final _matrix = Matrix4.identity(); + final Matrix4? _skewMatrix1; + final Matrix4? _skewMatrix2; + final Matrix4? _skewMatrix3; + + BaseKeyframeAnimation? _anchorPoint; + BaseKeyframeAnimation? _position; + BaseKeyframeAnimation? _scale; + BaseKeyframeAnimation? _rotation; + DoubleKeyframeAnimation? _skew; + DoubleKeyframeAnimation? _skewAngle; + + BaseKeyframeAnimation? _opacity; + BaseKeyframeAnimation? get opacity => _opacity; + + BaseKeyframeAnimation? _startOpacity; + BaseKeyframeAnimation? get startOpacity => _startOpacity; + + BaseKeyframeAnimation? _endOpacity; + BaseKeyframeAnimation? get endOpacity => _endOpacity; + + final bool _autoOrient; + + void addAnimationsToLayer(BaseLayer layer) { + layer.addAnimation(_opacity); + layer.addAnimation(_startOpacity); + layer.addAnimation(_endOpacity); + + layer.addAnimation(_anchorPoint); + layer.addAnimation(_position); + layer.addAnimation(_scale); + layer.addAnimation(_rotation); + layer.addAnimation(_skew); + layer.addAnimation(_skewAngle); + } + + void addListener(void Function() listener) { + _opacity?.addUpdateListener(listener); + _startOpacity?.addUpdateListener(listener); + _endOpacity?.addUpdateListener(listener); + _anchorPoint?.addUpdateListener(listener); + _position?.addUpdateListener(listener); + _scale?.addUpdateListener(listener); + _rotation?.addUpdateListener(listener); + _skew?.addUpdateListener(listener); + _skewAngle?.addUpdateListener(listener); + } + + void setProgress(double progress) { + _opacity?.setProgress(progress); + _startOpacity?.setProgress(progress); + _endOpacity?.setProgress(progress); + _anchorPoint?.setProgress(progress); + _position?.setProgress(progress); + _scale?.setProgress(progress); + _rotation?.setProgress(progress); + _skew?.setProgress(progress); + _skewAngle?.setProgress(progress); + } + + Matrix4 getMatrix() { + _matrix.reset(); + + if (_position != null) { + final position = _position!.value; + if (position.dx != 0 || position.dy != 0) { + _matrix.translateByDouble(position.dx, position.dy, 0, 1); + } + } + + // If autoOrient is true, the rotation should follow the derivative of the position rather + // than the rotation property. + if (_autoOrient) { + if (_position case var position?) { + var currentProgress = position.progress; + var startPosition = position.value; + // Store the start X and Y values because the pointF will be overwritten by the next getValue call. + var startX = startPosition.dx; + var startY = startPosition.dy; + // 1) Find the next position value. + // 2) Create a vector from the current position to the next position. + // 3) Find the angle of that vector to the X axis (0 degrees). + position.setProgress(currentProgress + 0.0001); + var nextPosition = position.value; + position.setProgress(currentProgress); + var rotationValue = degrees( + atan2(nextPosition.dy - startY, nextPosition.dx - startX), + ); + _matrix.rotateZ(rotationValue); + } + } else { + if (_rotation != null) { + final rotation = _rotation!.value; + if (rotation != 0) { + _matrix.rotateZ(rotation * pi / 180.0); + } + } + } + + if (_skew != null) { + final mCos = _skewAngle == null + ? 0.0 + : cos(radians(-_skewAngle!.value + 90)); + final mSin = _skewAngle == null + ? 1.0 + : sin(radians(-_skewAngle!.value + 90)); + final aTan = tan(radians(_skew!.value)); + + _skewMatrix1!.setValues( + mCos, + mSin, + 0, + 0, + -mSin, + mCos, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, // + ); + + _skewMatrix2!.setValues( + 1, + 0, + 0, + 0, + aTan, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, // + ); + + _skewMatrix3!.setValues( + mCos, + -mSin, + 0, + 0, + mSin, + mCos, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, // + ); + + _skewMatrix2.multiply(_skewMatrix1); + _skewMatrix3.multiply(_skewMatrix2); + _matrix.multiply(_skewMatrix3); + } + + if (_scale != null) { + final scale = _scale!.value; + if (scale.dx != 1 || scale.dy != 1) { + _matrix.scaleByDouble(scale.dx, scale.dy, scale.dx, 1); + } + } + + if (_anchorPoint != null) { + final anchorPoint = _anchorPoint!.value; + if (anchorPoint.dx != 0 || anchorPoint.dy != 0) { + _matrix.translateByDouble(-anchorPoint.dx, -anchorPoint.dy, 0, 1); + } + } + + return _matrix; + } + + /// TODO: see if we can use this for the main {@link #getMatrix()} method. + Matrix4 getMatrixForRepeater(double amount) { + final position = _position?.value; + final scale = _scale?.value; + + _matrix.setIdentity(); + + if (position != null) { + _matrix.translateByDouble( + position.dx * amount, + position.dy * amount, + 0, + 1, + ); + } + + if (scale != null) { + _matrix.scaleByDouble( + pow(scale.dx, amount).toDouble(), + pow(scale.dy, amount).toDouble(), + pow(scale.dx, amount).toDouble(), + 1, + ); + } + + if (_rotation != null) { + var rotation = _rotation!.value; + var anchorPoint = _anchorPoint?.value; + _matrix.rotate( + Vector3( + anchorPoint == null ? 0.0 : anchorPoint.dx, + anchorPoint == null ? 0.0 : anchorPoint.dy, + 1.0, + ), + radians(rotation * amount), + ); + } + + return _matrix; + } + + bool applyValueCallback(T property, LottieValueCallback? callback) { + if (property == LottieProperty.transformAnchorPoint) { + if (_anchorPoint == null) { + _anchorPoint = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + Offset.zero, + ); + } else { + _anchorPoint!.setValueCallback( + callback as LottieValueCallback?, + ); + } + } else if (property == LottieProperty.transformPosition) { + if (_position == null) { + _position = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + Offset.zero, + ); + } else { + _position!.setValueCallback(callback as LottieValueCallback?); + } + } else if (property == LottieProperty.transformScale) { + if (_scale == null) { + _scale = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + const Offset(1, 1), + ); + } else { + _scale!.setValueCallback(callback as LottieValueCallback?); + } + } else if (property == LottieProperty.transformRotation) { + if (_rotation == null) { + _rotation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 0.0, + ); + } else { + _rotation!.setValueCallback(callback as LottieValueCallback?); + } + } else if (property == LottieProperty.transformOpacity) { + if (_opacity == null) { + _opacity = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 100, + ); + } else { + _opacity!.setValueCallback(callback as LottieValueCallback?); + } + } else if (property == LottieProperty.transformStartOpacity) { + if (_startOpacity == null) { + _startOpacity = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 100, + ); + } else { + _startOpacity!.setValueCallback( + callback as LottieValueCallback?, + ); + } + } else if (property == LottieProperty.transformEndOpacity) { + if (_endOpacity == null) { + _endOpacity = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback?, + 100, + ); + } else { + _endOpacity!.setValueCallback(callback as LottieValueCallback?); + } + } else if (property == LottieProperty.transformSkew) { + _skew ??= DoubleKeyframeAnimation([Keyframe.nonAnimated(0.0)]); + _skew!.setValueCallback(callback as LottieValueCallback?); + } else if (property == LottieProperty.transformSkewAngle) { + _skewAngle ??= DoubleKeyframeAnimation([Keyframe.nonAnimated(0.0)]); + _skewAngle!.setValueCallback(callback as LottieValueCallback?); + } else { + return false; + } + + return true; + } +} diff --git a/lottie/lib/src/animation/keyframe/value_callback_keyframe_animation.dart b/lottie/lib/src/animation/keyframe/value_callback_keyframe_animation.dart new file mode 100644 index 0000000..87a7316 --- /dev/null +++ b/lottie/lib/src/animation/keyframe/value_callback_keyframe_animation.dart @@ -0,0 +1,53 @@ +import '../../value/keyframe.dart'; +import '../../value/lottie_value_callback.dart'; +import 'base_keyframe_animation.dart'; + +class ValueCallbackKeyframeAnimation + extends BaseKeyframeAnimation { + final A valueCallbackValue; + + ValueCallbackKeyframeAnimation( + LottieValueCallback? valueCallback, + this.valueCallbackValue, + ) : super([]) { + setValueCallback(valueCallback); + } + + @override + void setProgress(double progress) { + this.progress = progress; + } + + /// If this doesn't return 1, then {@link #setProgress(float)} will always clamp the progress + /// to 0. + @override + double getEndProgress() { + return 1.0; + } + + @override + void notifyListeners() { + if (valueCallback != null) { + super.notifyListeners(); + } + } + + @override + A get value { + return valueCallback!.getValueInternal( + 0.0, + 0.0, + valueCallbackValue, + valueCallbackValue, + progress, + progress, + progress, + ) ?? + valueCallbackValue; + } + + @override + A getValue(Keyframe keyframe, double keyframeProgress) { + return value; + } +} diff --git a/lottie/lib/src/composition.dart b/lottie/lib/src/composition.dart new file mode 100644 index 0000000..b5a2b7a --- /dev/null +++ b/lottie/lib/src/composition.dart @@ -0,0 +1,271 @@ +import 'dart:math'; +import 'dart:typed_data'; +import 'package:archive/archive.dart'; +import 'package:flutter/widgets.dart'; +import 'package:path/path.dart' as p; +import 'frame_rate.dart'; +import 'lottie_image_asset.dart'; +import 'model/font.dart'; +import 'model/font_character.dart'; +import 'model/layer/layer.dart'; +import 'model/marker.dart'; +import 'parser/lottie_composition_parser.dart'; +import 'parser/moshi/json_reader.dart'; +import 'performance_tracker.dart'; +import 'providers/load_image.dart'; +import 'utils.dart'; + +typedef WarningCallback = void Function(String); + +/// A function that knows how to transform a list of bytes to a `LottieComposition` +typedef LottieDecoder = Future Function(List bytes); + +class CompositionParameters { + MutableRectangle bounds = MutableRectangle(0, 0, 0, 0); + double startFrame = 0.0; + double endFrame = 0; + double frameRate = 0; + final layers = []; + final layerMap = {}; + final precomps = >{}; + final images = {}; + final characters = {}; + final fonts = {}; + final markers = []; + + static CompositionParameters forComposition(LottieComposition composition) => + composition._parameters; +} + +class LottieComposition { + static LottieComposition parseJsonBytes(List bytes) { + return LottieCompositionParser.parse( + LottieComposition._(), + JsonReader.fromBytes(bytes), + ); + } + + static Future fromByteData( + ByteData data, { + LottieDecoder? decoder, + }) { + return fromBytes(data.buffer.asUint8List(), decoder: decoder); + } + + static Future fromBytes( + List bytes, { + LottieDecoder? decoder, + }) async { + decoder ??= decodeZip; + + var compositionFuture = await decoder(bytes); + if (compositionFuture != null) { + return compositionFuture; + } + return parseJsonBytes(bytes); + } + + static Future decodeZip( + List bytes, { + LottieImageProviderFactory? imageProviderFactory, + ArchiveFile? Function(List)? filePicker, + }) async { + if (bytes[0] == 0x50 && bytes[1] == 0x4B) { + var archive = ZipDecoder().decodeBytes(bytes); + + ArchiveFile? jsonFile; + if (filePicker != null) { + jsonFile = filePicker(archive.files); + } + jsonFile ??= archive.files.firstWhere((e) => e.name.endsWith('.json')); + + var composition = parseJsonBytes(jsonFile.content); + + for (var image in composition.images.values) { + var imagePath = p.posix.join(image.dirName, image.fileName); + var found = archive.files.firstWhereOrNull( + (f) => f.name.toLowerCase() == imagePath.toLowerCase(), + ); + + ImageProvider? provider; + if (imageProviderFactory != null) { + provider = imageProviderFactory(image); + } + + if (provider != null) { + image.loadedImage = await loadImage(composition, image, provider); + } + + if (found != null) { + image.loadedImage ??= await loadImage( + composition, + image, + MemoryImage(found.content), + ); + } + } + + for (var font in archive.files.where((f) => f.name.endsWith('.ttf'))) { + var fileName = p.basenameWithoutExtension(font.name).toLowerCase(); + var existingFont = composition.fonts.values.firstWhereOrNull( + (f) => f.family.toLowerCase() == fileName, + ); + composition._fontsToLoad.add( + FontToLoad(font.content, family: existingFont?.family), + ); + } + return composition; + } + return null; + } + + static Future decodeGZip(List bytes) async { + if (bytes[0] == 31 && bytes[1] == 139) { + var decodedBytes = GZipDecoder().decodeBytes(bytes); + return LottieComposition.parseJsonBytes(decodedBytes); + } + return null; + } + + LottieComposition._(); + + final _performanceTracker = PerformanceTracker(); + // This is stored as a set to avoid duplicates. + final _warnings = {}; + + /// Map of font names to fonts */ + final _parameters = CompositionParameters(); + + /// Used to determine if an animation can be drawn with hardware acceleration. + bool hasDashPattern = false; + + /// Counts the number of mattes and masks. Before Android switched to SKIA + /// for drawing in Oreo (API 28), using hardware acceleration with mattes and masks + /// was only faster until you had ~4 masks after which it would actually become slower. + int _maskAndMatteCount = 0; + + final _fontsToLoad = []; + + WarningCallback? onWarning; + + void addWarning(String warning) { + var isNew = _warnings.add(warning); + if (isNew) { + onWarning?.call(warning); + } + } + + void incrementMatteOrMaskCount(int amount) { + _maskAndMatteCount += amount; + } + + /// Used to determine if an animation can be drawn with hardware acceleration. + int get maskAndMatteCount => _maskAndMatteCount; + + List get warnings => _warnings.toList(); + + bool get performanceTrackingEnabled => _performanceTracker.enabled; + set performanceTrackingEnabled(bool enabled) { + _performanceTracker.enabled = enabled; + } + + PerformanceTracker get performanceTracker => _performanceTracker; + + Layer? layerModelForId(int id) { + return _parameters.layerMap[id]; + } + + Rectangle get bounds => _parameters.bounds; + + Duration get duration { + return Duration(milliseconds: (seconds * 1000).round()); + } + + double get seconds => durationFrames / frameRate; + + double get startFrame => _parameters.startFrame; + + double get endFrame => _parameters.endFrame; + + double get frameRate => _parameters.frameRate; + + List get layers => _parameters.layers; + + List? getPrecomps(String? id) { + return _parameters.precomps[id]; + } + + Map get characters => _parameters.characters; + + Map get fonts => _parameters.fonts; + + List get markers => _parameters.markers; + + Marker? getMarker(String markerName) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i]; + if (marker.matchesName(markerName)) { + return marker; + } + } + return null; + } + + bool get hasImages { + return images.isNotEmpty; + } + + Map get images { + return _parameters.images; + } + + /// Number of frames in the animation + double get durationFrames => endFrame - startFrame; + + /// Returns a "rounded" progress value according to the frameRate + double roundProgress(double progress, {required FrameRate frameRate}) { + num? fps; + if (frameRate == FrameRate.max) { + return progress; + } else if (frameRate == FrameRate.composition) { + fps = this.frameRate; + } + fps ??= frameRate.framesPerSecond; + assert(!fps.isNaN && fps.isFinite && !fps.isNegative); + + var noOffsetDurationFrames = durationFrames + 0.01; + var totalFrameCount = (noOffsetDurationFrames / this.frameRate) * fps; + var frameIndex = (totalFrameCount * progress).toInt(); + var roundedProgress = frameIndex / totalFrameCount; + assert( + roundedProgress >= 0 && roundedProgress <= 1, + 'Progress is $roundedProgress', + ); + return roundedProgress; + } + + @override + String toString() { + final sb = StringBuffer('LottieComposition:\n'); + for (var layer in layers) { + sb.write(layer.toStringWithPrefix('\t')); + } + return sb.toString(); + } +} + +class FontToLoad { + final Uint8List bytes; + final String? family; + + FontToLoad(this.bytes, {this.family}); + + static List? getAndClear(LottieComposition composition) { + if (composition._fontsToLoad.isNotEmpty) { + var fonts = composition._fontsToLoad.toList(); + composition._fontsToLoad.clear(); + return fonts; + } + return null; + } +} diff --git a/lottie/lib/src/frame_rate.dart b/lottie/lib/src/frame_rate.dart new file mode 100644 index 0000000..f806486 --- /dev/null +++ b/lottie/lib/src/frame_rate.dart @@ -0,0 +1,28 @@ +import 'package:flutter/foundation.dart'; + +@immutable +class FrameRate { + static const max = FrameRate._special(0); + static const composition = FrameRate._special(-1); + + final double framesPerSecond; + + const FrameRate(this.framesPerSecond) : assert(framesPerSecond > 0); + const FrameRate._special(this.framesPerSecond); + + @override + int get hashCode => framesPerSecond.hashCode; + + @override + bool operator ==(other) => + other is FrameRate && other.framesPerSecond == framesPerSecond; + + @override + String toString() { + return 'FrameRate(${switch (framesPerSecond) { + 0 => 'max', + -1 => 'composition', + _ => framesPerSecond, + }})'; + } +} diff --git a/lottie/lib/src/l.dart b/lottie/lib/src/l.dart new file mode 100644 index 0000000..f2c8c2d --- /dev/null +++ b/lottie/lib/src/l.dart @@ -0,0 +1,59 @@ +import 'dart:developer'; + +class L { + static const int _maxDepth = 20; + static bool _traceEnabled = false; + static late List _sections; + static late List _startTimeNs; + static int _traceDepth = 0; + static int _depthPastMaxDepth = 0; + + static bool get traceEnabled => _traceEnabled; + static set traceEnabled(bool enabled) { + if (_traceEnabled == enabled) { + return; + } + _traceEnabled = enabled; + if (_traceEnabled) { + _sections = List.filled(_maxDepth, null); + _startTimeNs = List.filled(_maxDepth, 0); + } + } + + static void beginSection(String section) { + if (!_traceEnabled) { + return; + } + if (_traceDepth == _maxDepth) { + _depthPastMaxDepth++; + return; + } + _sections[_traceDepth] = section; + _startTimeNs[_traceDepth] = DateTime.now().microsecondsSinceEpoch; + Timeline.startSync('Lottie::$section'); + _traceDepth++; + } + + static double endSection(String section) { + if (_depthPastMaxDepth > 0) { + _depthPastMaxDepth--; + return 0; + } + if (!_traceEnabled) { + return 0; + } + _traceDepth--; + if (_traceDepth == -1) { + throw StateError("Can't end trace section. There are none."); + } + if (section != _sections[_traceDepth]) { + throw StateError( + 'Unbalanced trace call $section' + '. Expected ${_sections[_traceDepth]}.', + ); + } + Timeline.finishSync(); + return (DateTime.now().microsecondsSinceEpoch - _startTimeNs[_traceDepth]) / + 1000; + } +} diff --git a/lottie/lib/src/lottie.dart b/lottie/lib/src/lottie.dart new file mode 100644 index 0000000..4c8ed6d --- /dev/null +++ b/lottie/lib/src/lottie.dart @@ -0,0 +1,460 @@ +import 'dart:typed_data'; +import 'package:flutter/widgets.dart'; +import 'package:http/http.dart' as http; +import '../lottie.dart'; +import 'composition.dart'; +import 'l.dart'; +import 'lottie_builder.dart'; +import 'providers/lottie_provider.dart'; + +/// A widget to display a loaded [LottieComposition]. +/// The [controller] property allows to specify a custom AnimationController that +/// will drive the animation. If [controller] is null, the animation will play +/// automatically and the behavior could be adjusted with the properties [animate], +/// [repeat] and [reverse]. +class Lottie extends StatefulWidget { + /// The cache instance for recently loaded Lottie compositions. + static LottieCache get cache => sharedLottieCache; + + const Lottie({ + super.key, + required this.composition, + this.controller, + this.width, + this.height, + this.alignment, + this.fit, + bool? animate, + this.frameRate, + bool? repeat, + bool? reverse, + this.delegates, + this.options, + bool? addRepaintBoundary, + this.filterQuality, + this.renderCache, + }) : animate = animate ?? true, + reverse = reverse ?? false, + repeat = repeat ?? true, + addRepaintBoundary = addRepaintBoundary ?? true; + + /// Creates a widget that displays an [LottieComposition] obtained from an [AssetBundle]. + static LottieBuilder asset( + String name, { + Animation? controller, + bool? animate, + FrameRate? frameRate, + bool? repeat, + bool? reverse, + LottieDelegates? delegates, + LottieOptions? options, + void Function(LottieComposition)? onLoaded, + LottieImageProviderFactory? imageProviderFactory, + Key? key, + AssetBundle? bundle, + LottieFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry? alignment, + String? package, + bool? addRepaintBoundary, + FilterQuality? filterQuality, + WarningCallback? onWarning, + LottieDecoder? decoder, + RenderCache? renderCache, + bool? backgroundLoading, + }) => LottieBuilder.asset( + name, + controller: controller, + frameRate: frameRate, + animate: animate, + repeat: repeat, + reverse: reverse, + delegates: delegates, + options: options, + imageProviderFactory: imageProviderFactory, + onLoaded: onLoaded, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + width: width, + height: height, + fit: fit, + alignment: alignment, + package: package, + addRepaintBoundary: addRepaintBoundary, + filterQuality: filterQuality, + onWarning: onWarning, + decoder: decoder, + renderCache: renderCache, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from a [File]. + static LottieBuilder file( + Object file, { + Animation? controller, + FrameRate? frameRate, + bool? animate, + bool? repeat, + bool? reverse, + LottieDelegates? delegates, + LottieOptions? options, + LottieImageProviderFactory? imageProviderFactory, + void Function(LottieComposition)? onLoaded, + Key? key, + LottieFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry? alignment, + bool? addRepaintBoundary, + FilterQuality? filterQuality, + WarningCallback? onWarning, + LottieDecoder? decoder, + RenderCache? renderCache, + bool? backgroundLoading, + }) => LottieBuilder.file( + file, + controller: controller, + frameRate: frameRate, + animate: animate, + repeat: repeat, + reverse: reverse, + delegates: delegates, + options: options, + imageProviderFactory: imageProviderFactory, + onLoaded: onLoaded, + key: key, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + width: width, + height: height, + fit: fit, + alignment: alignment, + addRepaintBoundary: addRepaintBoundary, + filterQuality: filterQuality, + onWarning: onWarning, + decoder: decoder, + renderCache: renderCache, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from a [Uint8List]. + static LottieBuilder memory( + Uint8List bytes, { + Animation? controller, + FrameRate? frameRate, + bool? animate, + bool? repeat, + bool? reverse, + LottieDelegates? delegates, + LottieOptions? options, + LottieImageProviderFactory? imageProviderFactory, + void Function(LottieComposition)? onLoaded, + Key? key, + LottieFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry? alignment, + bool? addRepaintBoundary, + FilterQuality? filterQuality, + WarningCallback? onWarning, + LottieDecoder? decoder, + RenderCache? renderCache, + bool? backgroundLoading, + }) => LottieBuilder.memory( + bytes, + controller: controller, + frameRate: frameRate, + animate: animate, + repeat: repeat, + reverse: reverse, + delegates: delegates, + options: options, + imageProviderFactory: imageProviderFactory, + onLoaded: onLoaded, + key: key, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + width: width, + height: height, + fit: fit, + alignment: alignment, + addRepaintBoundary: addRepaintBoundary, + filterQuality: filterQuality, + onWarning: onWarning, + decoder: decoder, + renderCache: renderCache, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from the network. + static LottieBuilder network( + String url, { + http.Client? client, + Map? headers, + Animation? controller, + FrameRate? frameRate, + bool? animate, + bool? repeat, + bool? reverse, + LottieDelegates? delegates, + LottieOptions? options, + LottieImageProviderFactory? imageProviderFactory, + void Function(LottieComposition)? onLoaded, + Key? key, + LottieFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry? alignment, + bool? addRepaintBoundary, + FilterQuality? filterQuality, + WarningCallback? onWarning, + LottieDecoder? decoder, + RenderCache? renderCache, + bool? backgroundLoading, + }) => LottieBuilder.network( + url, + client: client, + headers: headers, + controller: controller, + frameRate: frameRate, + animate: animate, + repeat: repeat, + reverse: reverse, + delegates: delegates, + options: options, + imageProviderFactory: imageProviderFactory, + onLoaded: onLoaded, + key: key, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + width: width, + height: height, + fit: fit, + alignment: alignment, + addRepaintBoundary: addRepaintBoundary, + filterQuality: filterQuality, + onWarning: onWarning, + decoder: decoder, + renderCache: renderCache, + backgroundLoading: backgroundLoading, + ); + + /// The Lottie composition to animate. + /// It could be parsed asynchronously with `LottieComposition.fromBytes`. + final LottieComposition? composition; + + /// The animation controller to animate the Lottie animation. + /// If null, a controller is automatically created by this class and is configured + /// with the properties [animate], [reverse] + final Animation? controller; + + /// The number of frames per second to render. + /// Use `FrameRate.composition` to use the original frame rate of the Lottie composition (default) + /// Use `FrameRate.max` to advance the animation progression at every frame. + /// + /// The advantage of using a low frame rate is to preserve the device battery + /// by doing less rendering work. + final FrameRate? frameRate; + + /// If no controller is specified, this value indicate whether or not the + /// Lottie animation should be played automatically (default to true). + /// If there is an animation controller specified, this property has no effect. + /// + /// See [repeat] to control whether the animation should repeat. + final bool animate; + + /// Specify that the automatic animation should repeat in a loop (default to true). + /// The property has no effect if [animate] is false or [controller] is not null. + final bool repeat; + + /// Specify that the automatic animation should repeat in a loop in a "reverse" + /// mode (go from start to end and then continuously from end to start). + /// It default to false. + /// The property has no effect if [animate] is false, [repeat] is false or [controller] is not null. + final bool reverse; + + /// If non-null, requires the composition to have this width. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + final double? width; + + /// If non-null, require the composition to have this height. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + final double? height; + + /// How to inscribe the Lottie composition into the space allocated during layout. + final BoxFit? fit; + + /// How to align the composition within its bounds. + /// + /// The alignment aligns the given position in the image to the given position + /// in the layout bounds. For example, an [Alignment] alignment of (-1.0, + /// -1.0) aligns the image to the top-left corner of its layout bounds, while a + /// [Alignment] alignment of (1.0, 1.0) aligns the bottom right of the + /// image with the bottom right corner of its layout bounds. Similarly, an + /// alignment of (0.0, 1.0) aligns the bottom middle of the image with the + /// middle of the bottom edge of its layout bounds. + /// + /// Defaults to [Alignment.center]. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry? alignment; + + /// A group of callbacks to further customize the lottie animation. + /// - A [text] delegate to dynamically change some text displayed in the animation + /// - A value callback to change the properties of the animation at runtime. + /// - A text style factory to map between a font family specified in the animation + /// and the font family in your assets. + final LottieDelegates? delegates; + + /// Some options to enable/disable some feature of Lottie + /// - enableMergePaths: Enable merge path support + /// - enableApplyingOpacityToLayers: Enable layer-level opacity + final LottieOptions? options; + + /// Indicate to automatically add a `RepaintBoundary` widget around the animation. + /// This allows to optimize the app performance by isolating the animation in its + /// own `Layer`. + /// + /// This property is `true` by default. + final bool addRepaintBoundary; + + /// The quality of the image layer. See [FilterQuality] + /// [FilterQuality.high] is highest quality but slowest. + /// + /// Defaults to [FilterQuality.low] + final FilterQuality? filterQuality; + + /// {@template lottie.renderCache} + /// Opt-in to a special render mode where the frames of the animation are + /// lazily rendered and kept in a cache. + /// Subsequent runs of the animation will be cheaper to render. + /// + /// This is useful is the animation is complex and can consume lot of energy + /// from the battery. + /// This will trade an excessive CPU usage for an increase memory usage. + /// The main use-case is a short and small (size on the screen) animation that is + /// played repeatedly. + /// + /// There are 2 kinds of caches: + /// - [RenderCache.raster]: keep the frame rasterized in the cache (as [dart:ui.Image]). + /// Subsequent runs of the animation are very cheap for both the CPU and GPU but it takes + /// a lot of memory (rendered_width * rendered_height * frame_rate * duration_of_the_animation). + /// This should only be used for very short and very small animations. + /// - [RenderCache.drawingCommands]: keep the frame as a list of graphical operations ([dart:ui.Picture]). + /// Subsequent runs of the animation are cheaper for the CPU but not for the GPU. + /// Memory usage is a lot lower than RenderCache.raster. + /// + /// The render cache is managed internally and will release the memory once the + /// animation disappear. The cache is shared between all animations. + + /// Any change in the configuration of the animation (delegates, frame rate etc...) + /// will clear the cache entry. + /// For RenderCache.raster, any change in the size will invalidate the cache entry. The cache + /// use the final size visible on the screen (with all transforms applied). + /// + /// In order to not exceed the memory limit of a device, the raster cache is constrained + /// to maximum 50MB. After that, animations are not cached anymore. + /// {@endtemplate} + final RenderCache? renderCache; + + static bool get traceEnabled => L.traceEnabled; + static set traceEnabled(bool enabled) { + L.traceEnabled = enabled; + } + + @override + State createState() => _LottieState(); +} + +class _LottieState extends State with TickerProviderStateMixin { + late AnimationController _autoAnimation; + + @override + void initState() { + super.initState(); + + _autoAnimation = AnimationController( + vsync: this, + duration: widget.composition?.duration ?? const Duration(seconds: 1), + ); + _updateAutoAnimation(); + } + + @override + void didUpdateWidget(Lottie oldWidget) { + super.didUpdateWidget(oldWidget); + + _autoAnimation.duration = + widget.composition?.duration ?? const Duration(seconds: 1); + _updateAutoAnimation(); + } + + void _updateAutoAnimation() { + _autoAnimation.stop(); + + if (widget.animate && widget.controller == null) { + if (widget.repeat) { + _autoAnimation.repeat(reverse: widget.reverse); + } else { + _autoAnimation.forward(); + } + } + } + + @override + void dispose() { + _autoAnimation.dispose(); + super.dispose(); + } + + Animation get _progressAnimation => + widget.controller ?? _autoAnimation; + + @override + Widget build(BuildContext context) { + Widget child = AnimatedBuilder( + animation: _progressAnimation, + builder: (context, _) { + return RawLottie( + composition: widget.composition, + delegates: widget.delegates, + options: widget.options, + progress: _progressAnimation.value, + frameRate: widget.frameRate, + width: widget.width, + height: widget.height, + fit: widget.fit, + alignment: widget.alignment, + filterQuality: widget.filterQuality, + renderCache: widget.renderCache, + ); + }, + ); + + if (widget.addRepaintBoundary) { + child = RepaintBoundary(child: child); + } + + return child; + } +} diff --git a/lottie/lib/src/lottie_builder.dart b/lottie/lib/src/lottie_builder.dart new file mode 100644 index 0000000..8b5d813 --- /dev/null +++ b/lottie/lib/src/lottie_builder.dart @@ -0,0 +1,592 @@ +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:http/http.dart' as http; +import 'composition.dart'; +import 'frame_rate.dart'; +import 'lottie.dart'; +import 'lottie_delegates.dart'; +import 'options.dart'; +import 'providers/asset_provider.dart'; +import 'providers/file_provider.dart'; +import 'providers/load_image.dart'; +import 'providers/lottie_provider.dart'; +import 'providers/memory_provider.dart'; +import 'providers/network_provider.dart'; +import 'render_cache.dart'; + +typedef LottieFrameBuilder = + Widget Function( + BuildContext context, + Widget child, + LottieComposition? composition, + ); + +/// Signature used by [Lottie.errorBuilder] to create a replacement widget to +/// render instead of the image. +typedef LottieErrorWidgetBuilder = + Widget Function(BuildContext context, Object error, StackTrace? stackTrace); + +/// A widget that displays a Lottie animation. +/// +/// Several constructors are provided for the various ways that a Lottie file +/// can be provided: +/// +/// * [Lottie], for obtaining a composition from a [LottieProvider]. +/// * [Lottie.asset], for obtaining a Lottie file from an [AssetBundle] +/// using a key. +/// * [Lottie.network], for obtaining a lottie file from a URL. +/// * [Lottie.file], for obtaining a lottie file from a [File]. +/// * [Lottie.memory], for obtaining a lottie file from a [Uint8List]. +/// +class LottieBuilder extends StatefulWidget { + const LottieBuilder({ + super.key, + required this.lottie, + this.controller, + this.frameRate, + this.animate, + this.reverse, + this.repeat, + this.delegates, + this.options, + this.onLoaded, + this.frameBuilder, + this.errorBuilder, + this.width, + this.height, + this.fit, + this.alignment, + this.addRepaintBoundary, + this.filterQuality, + this.onWarning, + this.renderCache, + }); + + /// Creates a widget that displays an [LottieComposition] obtained from the network. + LottieBuilder.network( + String src, { + http.Client? client, + Map? headers, + this.controller, + this.frameRate, + this.animate, + this.reverse, + this.repeat, + this.delegates, + this.options, + LottieImageProviderFactory? imageProviderFactory, + this.onLoaded, + super.key, + this.frameBuilder, + this.errorBuilder, + this.width, + this.height, + this.fit, + this.alignment, + this.addRepaintBoundary, + this.filterQuality, + this.onWarning, + LottieDecoder? decoder, + this.renderCache, + bool? backgroundLoading, + }) : lottie = NetworkLottie( + src, + client: client, + headers: headers, + imageProviderFactory: imageProviderFactory, + decoder: decoder, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from a [File]. + /// + /// Either the [width] and [height] arguments should be specified, or the + /// widget should be placed in a context that sets tight layout constraints. + /// Otherwise, the image dimensions will change as the animation is loaded, which + /// will result in ugly layout changes. + /// + /// On Android, this may require the + /// `android.permission.READ_EXTERNAL_STORAGE` permission. + /// + LottieBuilder.file( + Object file, { + this.controller, + this.frameRate, + this.animate, + this.reverse, + this.repeat, + this.delegates, + this.options, + LottieImageProviderFactory? imageProviderFactory, + this.onLoaded, + super.key, + this.frameBuilder, + this.errorBuilder, + this.width, + this.height, + this.fit, + this.alignment, + this.addRepaintBoundary, + this.filterQuality, + this.onWarning, + LottieDecoder? decoder, + this.renderCache, + bool? backgroundLoading, + }) : lottie = FileLottie( + file, + imageProviderFactory: imageProviderFactory, + decoder: decoder, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from an [AssetBundle]. + LottieBuilder.asset( + String name, { + this.controller, + this.frameRate, + this.animate, + this.reverse, + this.repeat, + this.delegates, + this.options, + LottieImageProviderFactory? imageProviderFactory, + this.onLoaded, + super.key, + AssetBundle? bundle, + this.frameBuilder, + this.errorBuilder, + this.width, + this.height, + this.fit, + this.alignment, + String? package, + this.addRepaintBoundary, + this.filterQuality, + this.onWarning, + LottieDecoder? decoder, + this.renderCache, + bool? backgroundLoading, + }) : lottie = AssetLottie( + name, + bundle: bundle, + package: package, + imageProviderFactory: imageProviderFactory, + decoder: decoder, + backgroundLoading: backgroundLoading, + ); + + /// Creates a widget that displays an [LottieComposition] obtained from a [Uint8List]. + LottieBuilder.memory( + Uint8List bytes, { + this.controller, + this.frameRate, + this.animate, + this.reverse, + this.repeat, + this.delegates, + this.options, + LottieImageProviderFactory? imageProviderFactory, + this.onLoaded, + this.errorBuilder, + super.key, + this.frameBuilder, + this.width, + this.height, + this.fit, + this.alignment, + this.addRepaintBoundary, + this.filterQuality, + this.onWarning, + LottieDecoder? decoder, + this.renderCache, + bool? backgroundLoading, + }) : lottie = MemoryLottie( + bytes, + imageProviderFactory: imageProviderFactory, + decoder: decoder, + backgroundLoading: backgroundLoading, + ); + + /// The lottie animation to load. + /// Example of providers: [AssetLottie], [NetworkLottie], [FileLottie], [MemoryLottie] + final LottieProvider lottie; + + /// A callback called when the LottieComposition has been loaded. + /// You can use this callback to set the correct duration on the AnimationController + /// with `composition.duration` + final void Function(LottieComposition)? onLoaded; + + /// The animation controller of the Lottie animation. + /// The animated value will be mapped to the `progress` property of the + /// Lottie animation. + final Animation? controller; + + /// The number of frames per second to render. + /// Use `FrameRate.composition` to use the original frame rate of the Lottie composition (default) + /// Use `FrameRate.max` to advance the animation progression at every frame. + final FrameRate? frameRate; + + /// If no controller is specified, this value indicate whether or not the + /// Lottie animation should be played automatically (default to true). + /// If there is an animation controller specified, this property has no effect. + /// + /// See [repeat] to control whether the animation should repeat. + final bool? animate; + + /// Specify that the automatic animation should repeat in a loop (default to true). + /// The property has no effect if [animate] is false or [controller] is not null. + final bool? repeat; + + /// Specify that the automatic animation should repeat in a loop in a "reverse" + /// mode (go from start to end and then continuously from end to start). + /// It default to false. + /// The property has no effect if [animate] is false, [repeat] is false or [controller] is not null. + final bool? reverse; + + /// A group of options to further customize the lottie animation. + /// - A [text] delegate to dynamically change some text displayed in the animation + /// - A value callback to change the properties of the animation at runtime. + /// - A text style factory to map between a font family specified in the animation + /// and the font family in your assets. + final LottieDelegates? delegates; + + /// Some options to enable/disable some feature of Lottie + /// - enableMergePaths: Enable merge path support + /// - enableApplyingOpacityToLayers: Enable layer-level opacity + final LottieOptions? options; + + /// A builder function responsible for creating the widget that represents + /// this lottie animation. + /// + /// If this is null, this widget will display a lottie animation that is painted as + /// soon as it is available (and will appear to "pop" in + /// if it becomes available asynchronously). Callers might use this builder to + /// add effects to the animation (such as fading the animation in when it becomes + /// available) or to display a placeholder widget while the animation is loading. + /// + /// To have finer-grained control over the way that an animation's loading + /// progress is communicated to the user, see [loadingBuilder]. + /// + /// {@template lottie.chainedBuildersExample} + /// ```dart + /// Lottie( + /// ... + /// frameBuilder: (BuildContext context, Widget child) { + /// return Padding( + /// padding: EdgeInsets.all(8.0), + /// child: child, + /// ); + /// } + /// ) + /// ``` + /// + /// In this example, the widget hierarchy will contain the following: + /// + /// ```dart + /// Center( + /// Padding( + /// padding: EdgeInsets.all(8.0), + /// child: , + /// ), + /// ) + /// ``` + /// {@endtemplate} + /// + /// {@tool snippet --template=stateless_widget_material} + /// + /// The following sample demonstrates how to use this builder to implement an + /// animation that fades in once it's been loaded. + /// + /// This sample contains a limited subset of the functionality that the + /// [FadeInImage] widget provides out of the box. + /// + /// ```dart + /// @override + /// Widget build(BuildContext context) { + /// return DecoratedBox( + /// decoration: BoxDecoration( + /// color: Colors.white, + /// border: Border.all(), + /// borderRadius: BorderRadius.circular(20), + /// ), + /// child: Lottie.network( + /// 'https://example.com/animation.json', + /// frameBuilder: (BuildContext context, Widget child) { + /// if (wasSynchronouslyLoaded) { + /// return child; + /// } + /// return AnimatedOpacity( + /// child: child, + /// opacity: frame == null ? 0 : 1, + /// duration: const Duration(seconds: 1), + /// curve: Curves.easeOut, + /// ); + /// }, + /// ), + /// ); + /// } + /// ``` + /// {@end-tool} + /// + final LottieFrameBuilder? frameBuilder; + + /// If non-null, require the lottie animation to have this width. + /// + /// If null, the lottie animation will pick a size that best preserves its intrinsic + /// aspect ratio. + /// + /// It is strongly recommended that either both the [width] and the [height] + /// be specified, or that the widget be placed in a context that sets tight + /// layout constraints, so that the animation does not change size as it loads. + /// Consider using [fit] to adapt the animation's rendering to fit the given width + /// and height if the exact animation dimensions are not known in advance. + final double? width; + + /// If non-null, require the lottie animation to have this height. + /// + /// If null, the lottie animation will pick a size that best preserves its intrinsic + /// aspect ratio. + /// + /// It is strongly recommended that either both the [width] and the [height] + /// be specified, or that the widget be placed in a context that sets tight + /// layout constraints, so that the animation does not change size as it loads. + /// Consider using [fit] to adapt the animation's rendering to fit the given width + /// and height if the exact animation dimensions are not known in advance. + final double? height; + + /// How to inscribe the animation into the space allocated during layout. + /// + /// The default varies based on the other fields. See the discussion at + /// [paintImage]. + final BoxFit? fit; + + /// How to align the animation within its bounds. + /// + /// The alignment aligns the given position in the animation to the given position + /// in the layout bounds. For example, an [Alignment] alignment of (-1.0, + /// -1.0) aligns the animation to the top-left corner of its layout bounds, while an + /// [Alignment] alignment of (1.0, 1.0) aligns the bottom right of the + /// animation with the bottom right corner of its layout bounds. Similarly, an + /// alignment of (0.0, 1.0) aligns the bottom middle of the animation with the + /// middle of the bottom edge of its layout bounds. + /// + /// To display a subpart of an animation, consider using a [CustomPainter] and + /// [Canvas.drawImageRect]. + /// + /// If the [alignment] is [TextDirection]-dependent (i.e. if it is a + /// [AlignmentDirectional]), then an ambient [Directionality] widget + /// must be in scope. + /// + /// Defaults to [Alignment.center]. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry? alignment; + + /// Indicate to automatically add a `RepaintBoundary` widget around the animation. + /// This allows to optimize the app performance by isolating the animation in its + /// own `Layer`. + /// + /// This property is `true` by default. + final bool? addRepaintBoundary; + + /// The quality of the image layer. See [FilterQuality] + /// [FilterQuality.high] is highest quality but slowest. + /// + /// Defaults to [FilterQuality.low] + final FilterQuality? filterQuality; + + /// A callback called when there is a warning during the loading or painting + /// of the animation. + final WarningCallback? onWarning; + + /// A builder function that is called if an error occurs during loading. + /// + /// If this builder is not provided, any exceptions will be reported to + /// [FlutterError.onError]. If it is provided, the caller should either handle + /// the exception by providing a replacement widget, or rethrow the exception. + /// + /// The following sample uses [errorBuilder] to show a '😢' in place of the + /// image that fails to load, and prints the error to the console. + /// + /// ```dart + /// Widget build(BuildContext context) { + /// return DecoratedBox( + /// decoration: BoxDecoration( + /// color: Colors.white, + /// ), + /// child: Lottie.network( + /// 'https://example.does.not.exist/lottie.json', + /// errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { + /// // Appropriate logging or analytics, e.g. + /// // myAnalytics.recordError( + /// // 'An error occurred loading "https://example.does.not.exist/animation.json"', + /// // exception, + /// // stackTrace, + /// // ); + /// return const Text('😢'); + /// }, + /// ), + /// ); + /// } + /// ``` + final ImageErrorWidgetBuilder? errorBuilder; + + /// Opt-in to a special render mode where the frames of the animation are + /// lazily rendered and kept in a cache. + /// Subsequent runs of the animation will be cheaper to render. + /// + /// This is useful is the animation is complex and can consume lot of energy + /// from the battery. + /// This will trade an excessive CPU usage for an increase memory usage. + /// The main use-case is a short and small (size on the screen) animation that is + /// played repeatedly. + /// + /// There are 2 kinds of caches: + /// - [RenderCache.raster]: keep the frame rasterized in the cache (as [dart:ui.Image]). + /// Subsequent runs of the animation are very cheap for both the CPU and GPU but it takes + /// a lot of memory (rendered_width * rendered_height * frame_rate * duration_of_the_animation). + /// This should only be used for very short and very small animations. + /// - [RenderCache.drawingCommands]: keep the frame as a list of graphical operations ([dart:ui.Picture]). + /// Subsequent runs of the animation are cheaper for the CPU but not for the GPU. + /// Memory usage is a lot lower than RenderCache.raster. + /// + /// The render cache is managed internally and will release the memory once the + /// animation disappear. The cache is shared between all animations. + + /// Any change in the configuration of the animation (delegates, frame rate etc...) + /// will clear the cache entry. + /// For RenderCache.raster, any change in the size will invalidate the cache entry. The cache + /// use the final size visible on the screen (with all transforms applied). + /// + /// In order to not exceed the memory limit of a device, the raster cache is constrained + /// to maximum 50MB. After that, animations are not cached anymore. + final RenderCache? renderCache; + + @override + State createState() => _LottieBuilderState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('lottie', lottie)); + properties.add(DiagnosticsProperty('frameBuilder', frameBuilder)); + properties.add(DoubleProperty('width', width, defaultValue: null)); + properties.add(DoubleProperty('height', height, defaultValue: null)); + properties.add(EnumProperty('fit', fit, defaultValue: null)); + properties.add( + DiagnosticsProperty( + 'alignment', + alignment, + defaultValue: null, + ), + ); + } +} + +class _LottieBuilderState extends State { + Future? _loadingFuture; + + @override + void didUpdateWidget(LottieBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.lottie != widget.lottie) { + _load(); + } + } + + void _load() { + var provider = widget.lottie; + _loadingFuture = widget.lottie.load(context: context).then((composition) { + // LottieProvider.load() can return a Synchronous future and the onLoaded + // callback can call setState, so we wrap it in a microtask to avoid an + // "!_isDirty" error. + scheduleMicrotask(() { + if (mounted && widget.lottie == provider) { + var onWarning = widget.onWarning; + composition.onWarning = onWarning; + if (onWarning != null) { + for (var warning in composition.warnings) { + onWarning(warning); + } + } + + widget.onLoaded?.call(composition); + } + }); + + return composition; + }); + } + + @override + Widget build(BuildContext context) { + // We need to wait the first build instead of initState because AssetLottie + // provider may call DefaultAssetBundle.of + if (_loadingFuture == null) { + _load(); + } + return FutureBuilder( + future: _loadingFuture, + builder: (context, snapshot) { + if (snapshot.hasError) { + var errorBuilder = widget.errorBuilder; + if (errorBuilder != null) { + return errorBuilder(context, snapshot.error!, snapshot.stackTrace); + } else if (kDebugMode) { + return SizedBox( + width: widget.width, + height: widget.height, + child: ErrorWidget(snapshot.error!), + ); + } + } + + var composition = snapshot.data; + var animate = widget.animate; + animate ??= (composition?.durationFrames ?? 0) > 1.0; + + Widget result = Lottie( + composition: composition, + controller: widget.controller, + frameRate: widget.frameRate, + animate: animate, + reverse: widget.reverse, + repeat: widget.repeat, + delegates: widget.delegates, + options: widget.options, + width: widget.width, + height: widget.height, + fit: widget.fit, + alignment: widget.alignment, + addRepaintBoundary: widget.addRepaintBoundary, + filterQuality: widget.filterQuality, + renderCache: widget.renderCache, + ); + + if (widget.frameBuilder != null) { + result = widget.frameBuilder!(context, result, composition); + } + + return result; + }, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder description) { + super.debugFillProperties(description); + description.add( + DiagnosticsProperty>( + 'loadingFuture', + _loadingFuture, + ), + ); + } +} diff --git a/lottie/lib/src/lottie_delegates.dart b/lottie/lib/src/lottie_delegates.dart new file mode 100644 index 0000000..39efce8 --- /dev/null +++ b/lottie/lib/src/lottie_delegates.dart @@ -0,0 +1,95 @@ +import 'dart:ui' as ui; +import 'package:flutter/widgets.dart'; +import 'composition.dart'; +import 'lottie_drawable.dart'; +import 'lottie_image_asset.dart'; +import 'value_delegate.dart'; + +TextStyle defaultTextStyleDelegate(LottieFontStyle font) { + var style = font.style.toLowerCase(); + + var fontStyle = style.contains('italic') ? FontStyle.italic : null; + + FontWeight? fontWeight; + if (style.contains('semibold') || style.contains('semi bold')) { + fontWeight = FontWeight.w600; + } else if (style.contains('bold')) { + fontWeight = FontWeight.bold; + } + return TextStyle( + fontFamily: font.fontFamily, + fontStyle: fontStyle, + fontWeight: fontWeight, + ); +} + +@immutable +class LottieDelegates { + /// Specify a callback to dynamically changes the text displayed in the lottie + /// animation. + /// For instance, this is useful when you want to translate the text in the animation. + final String Function(String)? text; + + /// A callback to map between a font family specified in the json animation + /// with the font family in your assets. + /// This is useful either if: + /// - the name of the font in your asset doesn't match the one in the json file. + /// - you want to use an other font than the one declared in the json + /// + /// If the callback is null, the font family from the json is used as it. + /// + /// Given an object containing the font family and style specified in the json + /// return a configured `TextStyle` that will be used as the base style when + /// painting the text. + final TextStyle Function(LottieFontStyle)? textStyle; + + /// A list of value delegates to dynamically modify the animation + /// properties at runtime. + /// + /// Example: + /// ```dart + /// Lottie.asset( + /// 'lottiefile.json', + /// delegates: LottieDelegates( + /// value: [ + /// ValueDelegate.color(['lake', 'fill'], value: Colors.blue), + /// ValueDelegate.opacity(['**', 'fill'], callback: (frameInfo) => 0.5 * frameInfo.overallProgress), + /// ], + /// ), + /// ); + /// ``` + final List? values; + + /// A callback to dynamically change an image of the animation. + /// + /// Example: + /// ```dart + /// Lottie.asset( + // 'assets/data.json', + // delegates: LottieDelegates( + // image: (composition, image) { + // if (image.id == 'img_0' && _isMouseOver) { + // return myCustomImage; + // } + // + // // Use the default method: composition.images[image.id].loadedImage; + // return null; + // }, + // ) + // ) + /// ``` + final ui.Image? Function(LottieComposition, LottieImageAsset)? image; + + const LottieDelegates({this.text, this.textStyle, this.values, this.image}); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LottieDelegates && + text == other.text && + textStyle == other.textStyle && + values == other.values; + + @override + int get hashCode => Object.hash(text, textStyle, values); +} diff --git a/lottie/lib/src/lottie_drawable.dart b/lottie/lib/src/lottie_drawable.dart new file mode 100644 index 0000000..22150d3 --- /dev/null +++ b/lottie/lib/src/lottie_drawable.dart @@ -0,0 +1,274 @@ +import 'dart:ui' as ui; +import 'package:flutter/rendering.dart'; +import 'composition.dart'; +import 'frame_rate.dart'; +import 'lottie_delegates.dart'; +import 'model/key_path.dart'; +import 'model/layer/composition_layer.dart'; +import 'parser/layer_parser.dart'; +import 'render_cache.dart'; +import 'utils.dart'; +import 'value_delegate.dart'; + +class LottieDrawable { + final LottieComposition composition; + final _matrix = Matrix4.identity(); + late CompositionLayer _compositionLayer; + final Size size; + final FrameRate? frameRate; + LottieDelegates? _delegates; + bool _isDirty = true; + bool enableMergePaths = false; + FilterQuality? filterQuality; + + /// Gives a suggestion whether to paint with anti-aliasing, or not. Default is true. + bool antiAliasingSuggested = true; + + LottieDrawable(this.composition, {LottieDelegates? delegates, this.frameRate}) + : size = Size( + composition.bounds.width.toDouble(), + composition.bounds.height.toDouble(), + ) { + this.delegates = delegates; + _compositionLayer = CompositionLayer( + this, + LayerParser.parse(composition), + composition.layers, + composition, + ); + } + + CompositionLayer get compositionLayer => _compositionLayer; + + /// Sets whether to apply opacity to the each layer instead of shape. + /// + /// Opacity is normally applied directly to a shape. In cases where translucent + /// shapes overlap, applying opacity to a layer will be more accurate at the + /// expense of performance. + /// + /// The default value is false. + /// + /// Note: This process is very expensive. The performance impact will be reduced + /// when hardware acceleration is enabled. + bool isApplyingOpacityToLayersEnabled = false; + + void invalidateSelf() { + _isDirty = true; + } + + final _progressAliases = {}; + + double get progress => _progress ?? 0.0; + double? _progress; + bool setProgress(double value) { + var frameRate = this.frameRate ?? FrameRate.composition; + var roundedProgress = composition.roundProgress( + value, + frameRate: frameRate, + ); + if (roundedProgress != _progress) { + _isDirty = false; + var previousProgress = _progress; + _progress = roundedProgress; + _compositionLayer.setProgress(roundedProgress); + if (!_isDirty && frameRate != FrameRate.max && previousProgress != null) { + var alias = _progressAliases[previousProgress] ?? previousProgress; + _progressAliases[roundedProgress] = alias; + } + return _isDirty; + } else { + return false; + } + } + + int _delegatesHash = 0; + LottieDelegates? get delegates => _delegates; + set delegates(LottieDelegates? delegates) { + if (_delegates != delegates) { + _delegates = delegates; + _updateValueDelegates(delegates?.values); + _delegatesHash = _computeValueDelegateHash(delegates); + } + } + + List configHash() { + return [ + enableMergePaths, + filterQuality, + frameRate, + isApplyingOpacityToLayersEnabled, + ]; + } + + int delegatesHash() => _delegatesHash; + + int _computeValueDelegateHash(LottieDelegates? delegates) { + if (delegates == null) return 0; + + var valuesHash = []; + if (delegates.values case var values?) { + for (var value in values) { + valuesHash.add( + Object.hash( + value.value, + value.callbackHash, + value.property, + Object.hashAll(value.keyPath), + ), + ); + } + } + + return Object.hash( + delegates.image, + delegates.text, + delegates.textStyle, + Object.hashAll(valuesHash), + ); + } + + bool get useTextGlyphs { + return delegates?.text == null && composition.characters.isNotEmpty; + } + + ui.Image? getImageAsset(String? ref) { + var imageAsset = composition.images[ref]; + if (imageAsset != null) { + var imageDelegate = delegates?.image; + ui.Image? image; + if (imageDelegate != null) { + image = imageDelegate(composition, imageAsset); + } + + return image ?? imageAsset.loadedImage; + } else { + return null; + } + } + + TextStyle getTextStyle(String font, String style) { + return (_delegates?.textStyle ?? defaultTextStyleDelegate)( + LottieFontStyle(fontFamily: font, style: style), + ); + } + + List _valueDelegates = []; + void _updateValueDelegates(List? newDelegates) { + if (identical(_valueDelegates, newDelegates)) return; + + newDelegates ??= const []; + + var delegates = []; + + for (var newDelegate in newDelegates) { + var existingDelegate = _valueDelegates.firstWhereOrNull( + (f) => f.isSameProperty(newDelegate), + ); + if (existingDelegate != null) { + var resolved = internalResolved(existingDelegate); + resolved.updateDelegate(newDelegate); + delegates.add(existingDelegate); + } else { + var keyPaths = _resolveKeyPath(KeyPath(newDelegate.keyPath)); + var resolvedValueDelegate = internalResolve(newDelegate, keyPaths); + resolvedValueDelegate.addValueCallback(this); + delegates.add(newDelegate); + } + } + for (var oldDelegate in _valueDelegates) { + if (delegates.every((c) => !c.isSameProperty(oldDelegate))) { + var resolved = internalResolved(oldDelegate); + resolved.clear(); + } + } + _valueDelegates = delegates; + } + + /// Takes a {@link KeyPath}, potentially with wildcards or globstars and resolve it to a list of + /// zero or more actual {@link KeyPath Keypaths} that exist in the current animation. + ///

+ /// If you want to set value callbacks for any of these values, it is recommend to use the + /// returned {@link KeyPath} objects because they will be internally resolved to their content + /// and won't trigger a tree walk of the animation contents when applied. + List _resolveKeyPath(KeyPath keyPath) { + var keyPaths = []; + _compositionLayer.resolveKeyPath(keyPath, 0, keyPaths, KeyPath([])); + return keyPaths; + } + + void draw( + ui.Canvas canvas, + ui.Rect rect, { + BoxFit? fit, + Alignment? alignment, + RenderCacheContext? renderCache, + }) { + if (rect.isEmpty) { + return; + } + + fit ??= BoxFit.scaleDown; + alignment ??= Alignment.center; + var outputSize = rect.size; + var inputSize = size; + var fittedSizes = applyBoxFit(fit, inputSize, outputSize); + var sourceSize = fittedSizes.source; + var destinationSize = fittedSizes.destination; + var halfWidthDelta = (outputSize.width - destinationSize.width) / 2.0; + var halfHeightDelta = (outputSize.height - destinationSize.height) / 2.0; + var dx = halfWidthDelta + alignment.x * halfWidthDelta; + var dy = halfHeightDelta + alignment.y * halfHeightDelta; + var destinationPosition = rect.topLeft.translate(dx, dy); + var destinationRect = destinationPosition & destinationSize; + var sourceRect = alignment.inscribe(sourceSize, Offset.zero & inputSize); + + _matrix.setIdentity(); + + var cacheUsed = false; + if (renderCache != null) { + var progressForCache = _progressAliases[progress] ?? progress; + + cacheUsed = renderCache.cache.draw( + this, + progressForCache, + canvas, + destinationPosition: destinationPosition, + destinationRect: destinationRect, + sourceSize: sourceSize, + sourceRect: sourceRect, + renderBox: renderCache.renderBox, + devicePixelRatio: renderCache.devicePixelRatio, + ); + } + if (!cacheUsed) { + canvas.save(); + canvas.translate(destinationRect.left, destinationRect.top); + _matrix.scaleByDouble( + destinationSize.width / sourceRect.width, + destinationSize.height / sourceRect.height, + destinationSize.width / sourceRect.width, + 1, + ); + _compositionLayer.draw(canvas, _matrix, parentAlpha: 255); + canvas.restore(); + } + } +} + +class LottieFontStyle { + final String fontFamily, style; + + LottieFontStyle({required this.fontFamily, required this.style}); +} + +class RenderCacheContext { + final AnimationCache cache; + final RenderBox renderBox; + final double devicePixelRatio; + + RenderCacheContext({ + required this.cache, + required this.renderBox, + required this.devicePixelRatio, + }); +} diff --git a/lottie/lib/src/lottie_image_asset.dart b/lottie/lib/src/lottie_image_asset.dart new file mode 100644 index 0000000..1a045c9 --- /dev/null +++ b/lottie/lib/src/lottie_image_asset.dart @@ -0,0 +1,22 @@ +import 'dart:ui' as ui; + +class LottieImageAsset { + final int width; + final int height; + final String id; + final String fileName; + final String dirName; + ui.Image? loadedImage; + + LottieImageAsset({ + required this.width, + required this.height, + required this.id, + required this.fileName, + required this.dirName, + }); + + @override + String toString() => + 'LottieImageAsset(width: $width, height: $height, id: $id, fileName: $fileName, dirName: $dirName)'; +} diff --git a/lottie/lib/src/lottie_property.dart b/lottie/lib/src/lottie_property.dart new file mode 100644 index 0000000..a229b81 --- /dev/null +++ b/lottie/lib/src/lottie_property.dart @@ -0,0 +1,146 @@ +import 'dart:ui'; +import 'value/drop_shadow.dart'; + +/// Property values are the same type as the generic type of their corresponding +/// [LottieValueCallback]. With this, we can use generics to maintain type safety +/// of the callbacks. +/// +/// Supported properties: +/// Transform: +/// {TRANSFORM_ANCHOR_POINT} +/// {TRANSFORM_POSITION} +/// {TRANSFORM_OPACITY} +/// {TRANSFORM_SCALE} +/// {TRANSFORM_ROTATION} +/// {TRANSFORM_SKEW} +/// {TRANSFORM_SKEW_ANGLE} +/// +/// Fill: +/// {#COLOR} (non-gradient) +/// {#OPACITY} +/// {#COLOR_FILTER} +/// +/// Stroke: +/// {#COLOR} (non-gradient) +/// {#STROKE_WIDTH} +/// {#OPACITY} +/// {#COLOR_FILTER} +/// +/// Ellipse: +/// {#POSITION} +/// {#ELLIPSE_SIZE} +/// +/// Polystar: +/// {#POLYSTAR_POINTS} +/// {#POLYSTAR_ROTATION} +/// {#POSITION} +/// {#POLYSTAR_INNER_RADIUS} (star) +/// {#POLYSTAR_OUTER_RADIUS} +/// {#POLYSTAR_INNER_ROUNDEDNESS} (star) +/// {#POLYSTAR_OUTER_ROUNDEDNESS} +/// +/// Repeater: +/// All transform properties +/// {#REPEATER_COPIES} +/// {#REPEATER_OFFSET} +/// {#TRANSFORM_ROTATION} +/// {#TRANSFORM_START_OPACITY} +/// {#TRANSFORM_END_OPACITY} +/// +/// Layers: +/// All transform properties +/// {#TIME_REMAP} (composition layers only) +abstract class LottieProperty { + /// ColorInt **/ + static const Color color = Color(0x00000001); + static const Color strokeColor = Color(0x00000002); + + /// Opacity value are 0-100 to match after effects **/ + static const int transformOpacity = 3; + + /// [0,100] */ + static const int opacity = 4; + + /// In Px */ + static const Offset transformAnchorPoint = Offset(5, 5); + + /// In Px */ + static const Offset transformPosition = Offset(6, 6); + + /// In Px */ + static const Offset ellipseSize = Offset(7, 7); + + /// In Px */ + static const Offset rectangleSize = Offset(8, 8); + + /// In degrees */ + static const double cornerRadius = 9.0; + + /// In Px */ + static const Offset position = Offset(10, 10); + static const Offset transformScale = Offset(11, 11); + + /// In degrees */ + static const double transformRotation = 12.0; + + /// 0-85 */ + static const double transformSkew = 13.0; + + /// In degrees */ + static const double transformSkewAngle = 14.0; + + /// In Px */ + static const double strokeWidth = 15.0; + static const double textTracking = 16.0; + static const double repeaterCopies = 17.0; + static const double repeaterOffset = 18.0; + static const double polystarPoints = 19.0; + + /// In degrees */ + static const double polystarRotation = 20.0; + + /// In Px */ + static const double polystarInnerRadius = 21.0; + + /// In Px */ + static const double polystarOuterRadius = 22.0; + + /// [0,100] */ + static const double polystarInnerRoundedness = 23.0; + + /// [0,100] */ + static const double polystarOuterRoundedness = 24.0; + + /// [0,100] */ + static const double transformStartOpacity = 25.0; + + /// [0,100] */ + static const double transformEndOpacity = 26.0; + + /// The time value in seconds */ + static const double timeRemap = 27.0; + + /// In Dp + static const double textSize = 28.0; + + /// In Px + static const double blurRadius = 29.0; + + static const dropShadow = DropShadow( + color: Color(0x00000000), + direction: 0, + distance: 0, + radius: 0, + ); + + /// Set the color filter for an entire drawable content. Can be applied to fills, strokes, images, and solids. + static const ColorFilter colorFilter = ColorFilter.mode( + Color(0xFF000000), + BlendMode.dst, + ); + + static final List gradientColor = []; + + /// Replace the text for a text layer. + static const text = 'dynamic_text'; +} diff --git a/lottie/lib/src/model/animatable/animatable_color_value.dart b/lottie/lib/src/model/animatable/animatable_color_value.dart new file mode 100644 index 0000000..f03b966 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_color_value.dart @@ -0,0 +1,12 @@ +import 'dart:ui'; +import '../../animation/keyframe/color_keyframe_animation.dart'; +import 'base_animatable_value.dart'; + +class AnimatableColorValue extends BaseAnimatableValue { + AnimatableColorValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + ColorKeyframeAnimation createAnimation() { + return ColorKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_double_value.dart b/lottie/lib/src/model/animatable/animatable_double_value.dart new file mode 100644 index 0000000..4be230b --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_double_value.dart @@ -0,0 +1,13 @@ +import '../../animation/keyframe/double_keyframe_animation.dart'; +import 'base_animatable_value.dart'; + +class AnimatableDoubleValue extends BaseAnimatableValue { + AnimatableDoubleValue() : super.fromValue(0.0); + + AnimatableDoubleValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + DoubleKeyframeAnimation createAnimation() { + return DoubleKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_gradient_color_value.dart b/lottie/lib/src/model/animatable/animatable_gradient_color_value.dart new file mode 100644 index 0000000..eb135b1 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_gradient_color_value.dart @@ -0,0 +1,73 @@ +import '../../animation/keyframe/gradient_color_keyframe_animation.dart'; +import '../../value/keyframe.dart'; +import '../content/gradient_color.dart'; +import 'base_animatable_value.dart'; + +class AnimatableGradientColorValue + extends BaseAnimatableValue { + AnimatableGradientColorValue.fromKeyframes( + List> keyframes, + ) : super.fromKeyframes(_ensureInterpolatableKeyframes(keyframes)); + + static List> _ensureInterpolatableKeyframes( + List> keyframes, + ) { + for (var i = 0; i < keyframes.length; i++) { + keyframes[i] = _ensureInterpolatableKeyframe(keyframes[i]); + } + return keyframes; + } + + static Keyframe _ensureInterpolatableKeyframe( + Keyframe keyframe, + ) { + var startValue = keyframe.startValue; + var endValue = keyframe.endValue; + if (startValue == null || + endValue == null || + startValue.positions.length == endValue.positions.length) { + return keyframe; + } + var mergedPositions = _mergePositions( + startValue.positions, + endValue.positions, + ); + // The start/end has opacity stops which required adding extra positions in between the existing colors. + return keyframe.copyWith( + startValue.copyWithPositions(mergedPositions), + endValue.copyWithPositions(mergedPositions), + ); + } + + static List _mergePositions( + List startPositions, + List endPositions, + ) { + var mergedArray = List.filled( + startPositions.length + endPositions.length, + 0, + ); + mergedArray.setRange(0, startPositions.length, startPositions); + mergedArray.setRange( + startPositions.length, + startPositions.length + endPositions.length, + endPositions, + ); + mergedArray.sort(); + var uniqueValues = 0; + var lastValue = double.nan; + for (var i = 0; i < mergedArray.length; i++) { + if (mergedArray[i] != lastValue) { + mergedArray[uniqueValues] = mergedArray[i]; + uniqueValues++; + lastValue = mergedArray[i]; + } + } + return mergedArray.take(uniqueValues).toList(); + } + + @override + GradientColorKeyframeAnimation createAnimation() { + return GradientColorKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_integer_value.dart b/lottie/lib/src/model/animatable/animatable_integer_value.dart new file mode 100644 index 0000000..4daacb6 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_integer_value.dart @@ -0,0 +1,14 @@ +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/integer_keyframe_animation.dart'; +import 'base_animatable_value.dart'; + +class AnimatableIntegerValue extends BaseAnimatableValue { + AnimatableIntegerValue() : super.fromValue(100); + + AnimatableIntegerValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + BaseKeyframeAnimation createAnimation() { + return IntegerKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_path_value.dart b/lottie/lib/src/model/animatable/animatable_path_value.dart new file mode 100644 index 0000000..d5c14de --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_path_value.dart @@ -0,0 +1,29 @@ +import 'dart:ui'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/path_keyframe_animation.dart'; +import '../../animation/keyframe/point_keyframe_animation.dart'; +import '../../value/keyframe.dart'; +import 'animatable_value.dart'; + +class AnimatablePathValue implements AnimatableValue { + @override + final List> keyframes; + + /// Create a default static animatable path. + AnimatablePathValue() : keyframes = [Keyframe.nonAnimated(Offset.zero)]; + + AnimatablePathValue.fromKeyframes(this.keyframes); + + @override + bool get isStatic { + return keyframes.length == 1 && keyframes[0].isStatic; + } + + @override + BaseKeyframeAnimation createAnimation() { + if (keyframes.first.isStatic) { + return PointKeyframeAnimation(keyframes); + } + return PathKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_point_value.dart b/lottie/lib/src/model/animatable/animatable_point_value.dart new file mode 100644 index 0000000..cad64d8 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_point_value.dart @@ -0,0 +1,12 @@ +import 'dart:ui'; +import '../../animation/keyframe/point_keyframe_animation.dart'; +import 'base_animatable_value.dart'; + +class AnimatablePointValue extends BaseAnimatableValue { + AnimatablePointValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + PointKeyframeAnimation createAnimation() { + return PointKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_scale_value.dart b/lottie/lib/src/model/animatable/animatable_scale_value.dart new file mode 100644 index 0000000..811d2ea --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_scale_value.dart @@ -0,0 +1,17 @@ +import 'dart:ui'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/point_keyframe_animation.dart'; +import 'base_animatable_value.dart'; + +class AnimatableScaleValue extends BaseAnimatableValue { + AnimatableScaleValue.one() : this(const Offset(1, 1)); + + AnimatableScaleValue(super.value) : super.fromValue(); + + AnimatableScaleValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + BaseKeyframeAnimation createAnimation() { + return PointKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_shape_value.dart b/lottie/lib/src/model/animatable/animatable_shape_value.dart new file mode 100644 index 0000000..e6dd1fc --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_shape_value.dart @@ -0,0 +1,13 @@ +import 'dart:ui'; +import '../../animation/keyframe/shape_keyframe_animation.dart'; +import '../content/shape_data.dart'; +import 'base_animatable_value.dart'; + +class AnimatableShapeValue extends BaseAnimatableValue { + AnimatableShapeValue.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + ShapeKeyframeAnimation createAnimation() { + return ShapeKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_split_dimension_path_value.dart b/lottie/lib/src/model/animatable/animatable_split_dimension_path_value.dart new file mode 100644 index 0000000..ce57d9f --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_split_dimension_path_value.dart @@ -0,0 +1,36 @@ +import 'dart:ui'; +import '../../animation/keyframe/split_dimension_path_keyframe_animation.dart'; +import '../../value/keyframe.dart'; +import 'animatable_double_value.dart'; +import 'animatable_value.dart'; + +class AnimatableSplitDimensionPathValue + implements AnimatableValue { + final AnimatableDoubleValue _animatableXDimension; + final AnimatableDoubleValue _animatableYDimension; + + AnimatableSplitDimensionPathValue( + this._animatableXDimension, + this._animatableYDimension, + ); + + @override + List> get keyframes { + throw UnsupportedError( + 'Cannot call getKeyframes on AnimatableSplitDimensionPathValue.', + ); + } + + @override + bool get isStatic { + return _animatableXDimension.isStatic && _animatableYDimension.isStatic; + } + + @override + SplitDimensionPathKeyframeAnimation createAnimation() { + return SplitDimensionPathKeyframeAnimation( + _animatableXDimension.createAnimation(), + _animatableYDimension.createAnimation(), + ); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_text_frame.dart b/lottie/lib/src/model/animatable/animatable_text_frame.dart new file mode 100644 index 0000000..76cf3d3 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_text_frame.dart @@ -0,0 +1,13 @@ +import '../../animation/keyframe/text_keyframe_animation.dart'; +import '../document_data.dart'; +import 'base_animatable_value.dart'; + +class AnimatableTextFrame + extends BaseAnimatableValue { + AnimatableTextFrame.fromKeyframes(super.keyframes) : super.fromKeyframes(); + + @override + TextKeyframeAnimation createAnimation() { + return TextKeyframeAnimation(keyframes); + } +} diff --git a/lottie/lib/src/model/animatable/animatable_text_properties.dart b/lottie/lib/src/model/animatable/animatable_text_properties.dart new file mode 100644 index 0000000..7357241 --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_text_properties.dart @@ -0,0 +1,16 @@ +import 'animatable_color_value.dart'; +import 'animatable_double_value.dart'; + +class AnimatableTextProperties { + final AnimatableColorValue? color; + final AnimatableColorValue? stroke; + final AnimatableDoubleValue? strokeWidth; + final AnimatableDoubleValue? tracking; + + AnimatableTextProperties({ + this.color, + this.stroke, + this.strokeWidth, + this.tracking, + }); +} diff --git a/lottie/lib/src/model/animatable/animatable_transform.dart b/lottie/lib/src/model/animatable/animatable_transform.dart new file mode 100644 index 0000000..91d178b --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_transform.dart @@ -0,0 +1,57 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/modifier_content.dart'; +import '../../animation/keyframe/transform_keyframe_animation.dart'; +import '../../lottie_drawable.dart'; +import '../content/content_model.dart'; +import '../layer/base_layer.dart'; +import 'animatable_double_value.dart'; +import 'animatable_integer_value.dart'; +import 'animatable_path_value.dart'; +import 'animatable_scale_value.dart'; +import 'animatable_value.dart'; + +class AnimatableTransform implements ModifierContent, ContentModel { + final AnimatablePathValue? anchorPoint; + + final AnimatableValue? position; + + final AnimatableScaleValue? scale; + + final AnimatableDoubleValue? rotation; + + final AnimatableIntegerValue? opacity; + + final AnimatableDoubleValue? skew; + + final AnimatableDoubleValue? skewAngle; + + // Used for repeaters + + final AnimatableDoubleValue? startOpacity; + + final AnimatableDoubleValue? endOpacity; + + bool isAutoOrient = false; + + AnimatableTransform({ + this.anchorPoint, + this.position, + this.scale, + this.rotation, + this.opacity, + this.skew, + this.skewAngle, + this.startOpacity, + this.endOpacity, + }); + + TransformKeyframeAnimation createAnimation() { + return TransformKeyframeAnimation(this); + } + + @override + Content? toContent(LottieDrawable drawable, BaseLayer layer) { + return null; + } +} diff --git a/lottie/lib/src/model/animatable/animatable_value.dart b/lottie/lib/src/model/animatable/animatable_value.dart new file mode 100644 index 0000000..bc7e82d --- /dev/null +++ b/lottie/lib/src/model/animatable/animatable_value.dart @@ -0,0 +1,8 @@ +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../value/keyframe.dart'; + +abstract class AnimatableValue { + List> get keyframes; + bool get isStatic; + BaseKeyframeAnimation createAnimation(); +} diff --git a/lottie/lib/src/model/animatable/base_animatable_value.dart b/lottie/lib/src/model/animatable/base_animatable_value.dart new file mode 100644 index 0000000..54b400b --- /dev/null +++ b/lottie/lib/src/model/animatable/base_animatable_value.dart @@ -0,0 +1,31 @@ +import '../../value/keyframe.dart'; +import 'animatable_value.dart'; + +abstract class BaseAnimatableValue + implements AnimatableValue { + @override + final List> keyframes; + + /// Create a default static animatable path. + BaseAnimatableValue.fromValue(V value) + : this.fromKeyframes([Keyframe.nonAnimated(value)]); + + BaseAnimatableValue.fromKeyframes(this.keyframes); + + @override + bool get isStatic { + return keyframes.isEmpty || + (keyframes.length == 1 && keyframes.first.isStatic); + } + + @override + String toString() { + final sb = StringBuffer(); + if (keyframes.isNotEmpty) { + sb + ..write('values=') + ..write('$keyframes'); + } + return sb.toString(); + } +} diff --git a/lottie/lib/src/model/content/blur_effect.dart b/lottie/lib/src/model/content/blur_effect.dart new file mode 100644 index 0000000..773af12 --- /dev/null +++ b/lottie/lib/src/model/content/blur_effect.dart @@ -0,0 +1,7 @@ +import '../animatable/animatable_double_value.dart'; + +class BlurEffect { + final AnimatableDoubleValue blurriness; + + BlurEffect(this.blurriness); +} diff --git a/lottie/lib/src/model/content/circle_shape.dart b/lottie/lib/src/model/content/circle_shape.dart new file mode 100644 index 0000000..4ff727d --- /dev/null +++ b/lottie/lib/src/model/content/circle_shape.dart @@ -0,0 +1,29 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/ellipse_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_point_value.dart'; +import '../animatable/animatable_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class CircleShape implements ContentModel { + final String? name; + final AnimatableValue position; + final AnimatablePointValue size; + final bool isReversed; + final bool hidden; + + CircleShape({ + this.name, + required this.position, + required this.size, + required this.isReversed, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return EllipseContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/content_model.dart b/lottie/lib/src/model/content/content_model.dart new file mode 100644 index 0000000..6168d11 --- /dev/null +++ b/lottie/lib/src/model/content/content_model.dart @@ -0,0 +1,7 @@ +import '../../animation/content/content.dart'; +import '../../lottie_drawable.dart'; +import '../layer/base_layer.dart'; + +abstract class ContentModel { + Content? toContent(LottieDrawable drawable, BaseLayer layer); +} diff --git a/lottie/lib/src/model/content/drop_shadow_effect.dart b/lottie/lib/src/model/content/drop_shadow_effect.dart new file mode 100644 index 0000000..4d7c701 --- /dev/null +++ b/lottie/lib/src/model/content/drop_shadow_effect.dart @@ -0,0 +1,30 @@ +import 'package:flutter/painting.dart'; +import '../../value/keyframe.dart'; +import '../animatable/animatable_color_value.dart'; +import '../animatable/animatable_double_value.dart'; + +class DropShadowEffect { + final AnimatableColorValue color; + final AnimatableDoubleValue opacity; + final AnimatableDoubleValue direction; + final AnimatableDoubleValue distance; + final AnimatableDoubleValue radius; + + DropShadowEffect({ + required this.color, + required this.opacity, + required this.direction, + required this.distance, + required this.radius, + }); + + static DropShadowEffect createEmpty() => DropShadowEffect( + color: AnimatableColorValue.fromKeyframes([ + Keyframe.nonAnimated(const Color(0x00000000)), + ]), + direction: AnimatableDoubleValue(), + radius: AnimatableDoubleValue(), + distance: AnimatableDoubleValue(), + opacity: AnimatableDoubleValue(), + ); +} diff --git a/lottie/lib/src/model/content/gradient_color.dart b/lottie/lib/src/model/content/gradient_color.dart new file mode 100644 index 0000000..cf8a4c2 --- /dev/null +++ b/lottie/lib/src/model/content/gradient_color.dart @@ -0,0 +1,109 @@ +import 'dart:ui'; +import '../../utils.dart'; +import '../../utils/collection.dart'; +import '../../utils/gamma_evaluator.dart'; + +// ignore_for_file: avoid_equals_and_hash_code_on_mutable_classes + +class GradientColor { + final List positions; + final List colors; + + const GradientColor(this.positions, this.colors); + + int get size => colors.length; + + void lerp(GradientColor gc1, GradientColor gc2, double progress) { + // Fast return in case start and end is the same + // or if progress is at start/end or out of [0,1] bounds + if (gc1 == gc2) { + _copyFrom(gc1); + return; + } else if (progress <= 0) { + _copyFrom(gc1); + return; + } else if (progress >= 1) { + _copyFrom(gc2); + return; + } + + if (gc1.colors.length != gc2.colors.length) { + throw Exception( + 'Cannot interpolate between gradients. ' + 'Lengths vary (${gc1.colors.length} vs ${gc2.colors.length})', + ); + } + + for (var i = 0; i < gc1.colors.length; i++) { + positions[i] = lerpDouble(gc1.positions[i], gc2.positions[i], progress)!; + colors[i] = GammaEvaluator.evaluate( + progress, + gc1.colors[i], + gc2.colors[i], + ); + } + // Not all keyframes that this GradientColor are used for will have the same length. + // AnimatableGradientColorValue.ensureInterpolatableKeyframes may add extra positions + // for some keyframes but not others to ensure that it is interpolatable. + // If there are extra positions here, just duplicate the last value in the gradient. + for (var i = gc1.colors.length; i < positions.length; i++) { + positions[i] = positions[gc1.colors.length - 1]; + colors[i] = colors[gc1.colors.length - 1]; + } + } + + GradientColor copyWithPositions(List positions) { + var colors = List.filled(positions.length, const Color(0x00000000)); + for (var i = 0; i < positions.length; i++) { + colors[i] = _getColorForPosition(positions[i]); + } + return GradientColor(positions, colors); + } + + Color _getColorForPosition(double position) { + var existingIndex = binarySearch(positions, position); + if (existingIndex >= 0) { + return colors[existingIndex]; + } + // binarySearch returns -insertionPoint - 1 if it is not found. + var insertionPoint = -(existingIndex + 1); + if (insertionPoint == 0) { + return colors[0]; + } else if (insertionPoint == colors.length - 1) { + return colors[colors.length - 1]; + } + var startPosition = positions[insertionPoint - 1]; + var endPosition = positions[insertionPoint]; + var startColor = colors[insertionPoint - 1]; + var endColor = colors[insertionPoint]; + + var fraction = (position - startPosition) / (endPosition - startPosition); + return GammaEvaluator.evaluate(fraction, startColor, endColor); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) { + return true; + } + if (other is! GradientColor) { + return false; + } + return const ListEquality().equals(positions, other.positions) && + const ListEquality().equals(colors, other.colors); + } + + @override + int get hashCode { + var result = Object.hashAll(positions); + result = 31 * result + Object.hashAll(colors); + return result; + } + + void _copyFrom(GradientColor other) { + for (var i = 0; i < other.colors.length; i++) { + positions[i] = other.positions[i]; + colors[i] = other.colors[i]; + } + } +} diff --git a/lottie/lib/src/model/content/gradient_fill.dart b/lottie/lib/src/model/content/gradient_fill.dart new file mode 100644 index 0000000..80c1e75 --- /dev/null +++ b/lottie/lib/src/model/content/gradient_fill.dart @@ -0,0 +1,42 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/gradient_fill_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_gradient_color_value.dart'; +import '../animatable/animatable_integer_value.dart'; +import '../animatable/animatable_point_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; +import 'gradient_type.dart'; + +class GradientFill implements ContentModel { + final String? name; + final GradientType gradientType; + final PathFillType fillType; + final AnimatableGradientColorValue gradientColor; + final AnimatableIntegerValue opacity; + final AnimatablePointValue startPoint; + final AnimatablePointValue endPoint; + final AnimatableDoubleValue? highlightLength; + final AnimatableDoubleValue? highlightAngle; + final bool hidden; + + GradientFill({ + this.name, + required this.gradientType, + required this.fillType, + required this.gradientColor, + required this.opacity, + required this.startPoint, + required this.endPoint, + this.highlightLength, + this.highlightAngle, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return GradientFillContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/gradient_stroke.dart b/lottie/lib/src/model/content/gradient_stroke.dart new file mode 100644 index 0000000..42e4f7e --- /dev/null +++ b/lottie/lib/src/model/content/gradient_stroke.dart @@ -0,0 +1,48 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/gradient_stroke_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_gradient_color_value.dart'; +import '../animatable/animatable_integer_value.dart'; +import '../animatable/animatable_point_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; +import 'gradient_type.dart'; +import 'shape_stroke.dart'; + +class GradientStroke implements ContentModel { + final String? name; + final GradientType gradientType; + final AnimatableGradientColorValue gradientColor; + final AnimatableIntegerValue opacity; + final AnimatablePointValue startPoint; + final AnimatablePointValue endPoint; + final AnimatableDoubleValue width; + final LineCapType? capType; + final LineJoinType? joinType; + final double miterLimit; + final List lineDashPattern; + final AnimatableDoubleValue? dashOffset; + final bool hidden; + + GradientStroke({ + this.name, + required this.gradientType, + required this.gradientColor, + required this.opacity, + required this.startPoint, + required this.endPoint, + required this.width, + this.capType, + this.joinType, + required this.miterLimit, + required this.lineDashPattern, + this.dashOffset, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return GradientStrokeContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/gradient_type.dart b/lottie/lib/src/model/content/gradient_type.dart new file mode 100644 index 0000000..a2873d2 --- /dev/null +++ b/lottie/lib/src/model/content/gradient_type.dart @@ -0,0 +1 @@ +enum GradientType { linear, radial } diff --git a/lottie/lib/src/model/content/layer_blend.dart b/lottie/lib/src/model/content/layer_blend.dart new file mode 100644 index 0000000..e5d6b09 --- /dev/null +++ b/lottie/lib/src/model/content/layer_blend.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; + +final blendModes = [ + null, // Normal + BlendMode.multiply, + BlendMode.screen, + BlendMode.overlay, + BlendMode.darken, + BlendMode.lighten, + BlendMode.colorDodge, + BlendMode.colorBurn, + BlendMode.hardLight, + BlendMode.softLight, + BlendMode.difference, + BlendMode.exclusion, + BlendMode.hue, + BlendMode.saturation, + BlendMode.color, + BlendMode.luminosity, + BlendMode.plus, + null, // Hard mix +]; diff --git a/lottie/lib/src/model/content/mask.dart b/lottie/lib/src/model/content/mask.dart new file mode 100644 index 0000000..b9f9f20 --- /dev/null +++ b/lottie/lib/src/model/content/mask.dart @@ -0,0 +1,23 @@ +import '../animatable/animatable_integer_value.dart'; +import '../animatable/animatable_shape_value.dart'; + +enum MaskMode { + maskModeAdd, + maskModeSubstract, + maskModeIntersect, + maskModeNone, +} + +class Mask { + final MaskMode maskMode; + final AnimatableShapeValue maskPath; + final AnimatableIntegerValue opacity; + final bool isInverted; + + Mask({ + required this.maskMode, + required this.maskPath, + required this.opacity, + required this.isInverted, + }); +} diff --git a/lottie/lib/src/model/content/merge_paths.dart b/lottie/lib/src/model/content/merge_paths.dart new file mode 100644 index 0000000..b81f7a1 --- /dev/null +++ b/lottie/lib/src/model/content/merge_paths.dart @@ -0,0 +1,48 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/merge_paths_content.dart'; +import '../../lottie_drawable.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +enum MergePathsMode { merge, add, substract, intersect, excludeIntersections } + +class MergePaths implements ContentModel { + final String name; + final MergePathsMode mode; + final bool hidden; + + MergePaths({required this.name, required this.mode, required this.hidden}); + + @override + Content? toContent(LottieDrawable drawable, BaseLayer layer) { + if (!drawable.enableMergePaths) { + drawable.composition.addWarning( + 'Animation contains merge paths but they are disabled.', + ); + return null; + } + return MergePathsContent(this); + } + + @override + String toString() { + return 'MergePaths{mode=$mode}'; + } + + static MergePathsMode modeForId(int id) { + switch (id) { + case 1: + return MergePathsMode.merge; + case 2: + return MergePathsMode.add; + case 3: + return MergePathsMode.substract; + case 4: + return MergePathsMode.intersect; + case 5: + return MergePathsMode.excludeIntersections; + default: + return MergePathsMode.merge; + } + } +} diff --git a/lottie/lib/src/model/content/polystar_shape.dart b/lottie/lib/src/model/content/polystar_shape.dart new file mode 100644 index 0000000..b35b275 --- /dev/null +++ b/lottie/lib/src/model/content/polystar_shape.dart @@ -0,0 +1,60 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/polystar_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class PolystarShapeType { + static const star = PolystarShapeType(1); + static const polygon = PolystarShapeType(2); + static const List values = [star, polygon]; + + final int value; + + const PolystarShapeType(this.value); + + static PolystarShapeType? forValue(int value) { + for (var type in values) { + if (type.value == value) { + return type; + } + } + return null; + } +} + +class PolystarShape implements ContentModel { + final String? name; + final PolystarShapeType? type; + final AnimatableDoubleValue points; + final AnimatableValue position; + final AnimatableDoubleValue rotation; + final AnimatableDoubleValue? innerRadius; + final AnimatableDoubleValue outerRadius; + final AnimatableDoubleValue? innerRoundedness; + final AnimatableDoubleValue outerRoundedness; + final bool hidden; + final bool isReversed; + + PolystarShape({ + this.name, + this.type, + required this.points, + required this.position, + required this.rotation, + this.innerRadius, + required this.outerRadius, + this.innerRoundedness, + required this.outerRoundedness, + required this.hidden, + required this.isReversed, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return PolystarContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/rectangle_shape.dart b/lottie/lib/src/model/content/rectangle_shape.dart new file mode 100644 index 0000000..69b4478 --- /dev/null +++ b/lottie/lib/src/model/content/rectangle_shape.dart @@ -0,0 +1,34 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/rectangle_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class RectangleShape implements ContentModel { + final String? name; + final AnimatableValue position; + final AnimatableValue size; + final AnimatableDoubleValue cornerRadius; + final bool hidden; + + RectangleShape({ + this.name, + required this.position, + required this.size, + required this.cornerRadius, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return RectangleContent(drawable, layer, this); + } + + @override + String toString() { + return 'RectangleShape{position=$position, size=$size}'; + } +} diff --git a/lottie/lib/src/model/content/repeater.dart b/lottie/lib/src/model/content/repeater.dart new file mode 100644 index 0000000..fe5858f --- /dev/null +++ b/lottie/lib/src/model/content/repeater.dart @@ -0,0 +1,28 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/repeater_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_transform.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class Repeater implements ContentModel { + final String? name; + final AnimatableDoubleValue copies; + final AnimatableDoubleValue offset; + final AnimatableTransform transform; + final bool hidden; + + Repeater({ + this.name, + required this.copies, + required this.offset, + required this.transform, + required this.hidden, + }); + + @override + Content? toContent(LottieDrawable drawable, BaseLayer layer) { + return RepeaterContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/rounded_corners.dart b/lottie/lib/src/model/content/rounded_corners.dart new file mode 100644 index 0000000..f1d5a7b --- /dev/null +++ b/lottie/lib/src/model/content/rounded_corners.dart @@ -0,0 +1,18 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/rounded_corners_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class RoundedCorners implements ContentModel { + final String name; + final AnimatableValue cornerRadius; + + RoundedCorners(this.name, this.cornerRadius); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return RoundedCornersContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/shape_data.dart b/lottie/lib/src/model/content/shape_data.dart new file mode 100644 index 0000000..4826407 --- /dev/null +++ b/lottie/lib/src/model/content/shape_data.dart @@ -0,0 +1,93 @@ +import 'dart:math'; +import 'dart:ui'; +import '../cubic_curve_data.dart'; + +class ShapeData { + final List curves; + Offset _initialPoint; + bool isClosed; + + ShapeData(List curves, {Offset? initialPoint, bool? closed}) + : curves = curves.toList(), + _initialPoint = initialPoint ?? Offset.zero, + isClosed = closed ?? false; + + ShapeData.empty() : this([]); + + void setInitialPoint(double x, double y) { + _initialPoint = Offset(x, y); + } + + Offset get initialPoint { + return _initialPoint; + } + + void interpolateBetween( + ShapeData shapeData1, + ShapeData shapeData2, + double percentage, + ) { + isClosed = shapeData1.isClosed || shapeData2.isClosed; + + if (shapeData1.curves.length != shapeData2.curves.length) { + // TODO(xha): decide what to do? We don't have access to the LottieDrawble + // to emit the warning + //logger.warning('Curves must have the same number of control points. ' + // 'Shape 1: ${shapeData1.curves.length}' + // '\tShape 2: ${shapeData2.curves.length}'); + } + + var points = min(shapeData1.curves.length, shapeData2.curves.length); + if (curves.length < points) { + for (var i = curves.length; i < points; i++) { + curves.add(CubicCurveData()); + } + } else if (curves.length > points) { + for (var i = curves.length - 1; i >= points; i--) { + curves.removeAt(curves.length - 1); + } + } + + var initialPoint1 = shapeData1.initialPoint; + var initialPoint2 = shapeData2.initialPoint; + + setInitialPoint( + lerpDouble(initialPoint1.dx, initialPoint2.dx, percentage)!, + lerpDouble(initialPoint1.dy, initialPoint2.dy, percentage)!, + ); + + for (var i = curves.length - 1; i >= 0; i--) { + var curve1 = shapeData1.curves[i]; + var curve2 = shapeData2.curves[i]; + + var cp11 = curve1.controlPoint1; + var cp21 = curve1.controlPoint2; + var vertex1 = curve1.vertex; + + var cp12 = curve2.controlPoint1; + var cp22 = curve2.controlPoint2; + var vertex2 = curve2.vertex; + + curves[i].controlPoint1 = Offset( + lerpDouble(cp11.dx, cp12.dx, percentage)!, + lerpDouble(cp11.dy, cp12.dy, percentage)!, + ); + curves[i].controlPoint2 = Offset( + lerpDouble(cp21.dx, cp22.dx, percentage)!, + lerpDouble(cp21.dy, cp22.dy, percentage)!, + ); + curves[i].vertex = Offset( + lerpDouble(vertex1.dx, vertex2.dx, percentage)!, + lerpDouble(vertex1.dy, vertex2.dy, percentage)!, + ); + } + } + + @override + String toString() { + return 'ShapeData{' + 'numCurves=${curves.length}' + 'closed=$isClosed' + '}'; + } +} diff --git a/lottie/lib/src/model/content/shape_fill.dart b/lottie/lib/src/model/content/shape_fill.dart new file mode 100644 index 0000000..e505472 --- /dev/null +++ b/lottie/lib/src/model/content/shape_fill.dart @@ -0,0 +1,39 @@ +import 'dart:ui'; +import '../../animation/content/content.dart'; +import '../../animation/content/fill_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_color_value.dart'; +import '../animatable/animatable_integer_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class ShapeFill implements ContentModel { + final bool fillEnabled; + final PathFillType fillType; + final String? name; + final AnimatableColorValue? color; + final AnimatableIntegerValue? opacity; + final bool hidden; + + ShapeFill({ + required this.fillEnabled, + required this.fillType, + this.name, + this.color, + this.opacity, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return FillContent(drawable, layer, this); + } + + @override + String toString() { + return 'ShapeFill{' + 'color=' + ', fillEnabled=$fillEnabled' + '}'; + } +} diff --git a/lottie/lib/src/model/content/shape_group.dart b/lottie/lib/src/model/content/shape_group.dart new file mode 100644 index 0000000..2aeba40 --- /dev/null +++ b/lottie/lib/src/model/content/shape_group.dart @@ -0,0 +1,23 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/content_group.dart'; +import '../../lottie_drawable.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class ShapeGroup implements ContentModel { + final String? name; + final List items; + final bool hidden; + + ShapeGroup(this.name, this.items, {required this.hidden}); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return ContentGroup(drawable, layer, this); + } + + @override + String toString() { + return "ShapeGroup{name: '$name' Shapes: $items}"; + } +} diff --git a/lottie/lib/src/model/content/shape_path.dart b/lottie/lib/src/model/content/shape_path.dart new file mode 100644 index 0000000..5bee343 --- /dev/null +++ b/lottie/lib/src/model/content/shape_path.dart @@ -0,0 +1,30 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/shape_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_shape_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +class ShapePath implements ContentModel { + final String? name; + final int index; + final AnimatableShapeValue shapePath; + final bool hidden; + + ShapePath({ + this.name, + required this.index, + required this.shapePath, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return ShapeContent(drawable, layer, this); + } + + @override + String toString() { + return 'ShapePath{name=$name, index=$index}'; + } +} diff --git a/lottie/lib/src/model/content/shape_stroke.dart b/lottie/lib/src/model/content/shape_stroke.dart new file mode 100644 index 0000000..ae43365 --- /dev/null +++ b/lottie/lib/src/model/content/shape_stroke.dart @@ -0,0 +1,68 @@ +import 'dart:ui' as ui; +import '../../animation/content/content.dart'; +import '../../animation/content/stroke_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_color_value.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_integer_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +enum LineCapType { butt, round, unknown } + +ui.StrokeCap lineCapTypeToPaintCap(LineCapType? cap) { + switch (cap) { + case LineCapType.butt: + return ui.StrokeCap.butt; + case LineCapType.round: + return ui.StrokeCap.round; + case LineCapType.unknown: + case null: + return ui.StrokeCap.butt; + } +} + +enum LineJoinType { miter, round, bevel } + +ui.StrokeJoin lineJoinTypeToPaintJoin(LineJoinType? join) { + switch (join) { + case LineJoinType.bevel: + return ui.StrokeJoin.bevel; + case LineJoinType.round: + return ui.StrokeJoin.round; + case LineJoinType.miter: + case null: + return ui.StrokeJoin.miter; + } +} + +class ShapeStroke implements ContentModel { + final String? name; + final AnimatableDoubleValue? dashOffset; + final List lineDashPattern; + final AnimatableColorValue color; + final AnimatableIntegerValue opacity; + final AnimatableDoubleValue width; + final LineCapType? capType; + final LineJoinType? joinType; + final double miterLimit; + final bool hidden; + + ShapeStroke({ + this.name, + this.dashOffset, + required this.lineDashPattern, + required this.color, + required this.opacity, + required this.width, + this.capType, + this.joinType, + required this.miterLimit, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return StrokeContent(drawable, layer, this); + } +} diff --git a/lottie/lib/src/model/content/shape_trim_path.dart b/lottie/lib/src/model/content/shape_trim_path.dart new file mode 100644 index 0000000..0667f92 --- /dev/null +++ b/lottie/lib/src/model/content/shape_trim_path.dart @@ -0,0 +1,47 @@ +import '../../animation/content/content.dart'; +import '../../animation/content/trim_path_content.dart'; +import '../../lottie_drawable.dart'; +import '../animatable/animatable_double_value.dart'; +import '../layer/base_layer.dart'; +import 'content_model.dart'; + +enum ShapeTrimPathType { simultaneously, individually } + +class ShapeTrimPath implements ContentModel { + final String? name; + final ShapeTrimPathType type; + final AnimatableDoubleValue start; + final AnimatableDoubleValue end; + final AnimatableDoubleValue offset; + final bool hidden; + + ShapeTrimPath({ + this.name, + required this.type, + required this.start, + required this.end, + required this.offset, + required this.hidden, + }); + + @override + Content toContent(LottieDrawable drawable, BaseLayer layer) { + return TrimPathContent(layer, this); + } + + @override + String toString() { + return 'Trim Path: {start: $start, end: $end, offset: $offset}'; + } + + static ShapeTrimPathType typeForId(int id) { + switch (id) { + case 1: + return ShapeTrimPathType.simultaneously; + case 2: + return ShapeTrimPathType.individually; + default: + throw Exception('Unknown trim path type $id'); + } + } +} diff --git a/lottie/lib/src/model/cubic_curve_data.dart b/lottie/lib/src/model/cubic_curve_data.dart new file mode 100644 index 0000000..0b4d876 --- /dev/null +++ b/lottie/lib/src/model/cubic_curve_data.dart @@ -0,0 +1,48 @@ +import 'dart:ui'; + +/// One cubic path operation. CubicCurveData is structured such that it is easy to iterate through +/// it and build a path. However, it is modeled differently than most path operations. +/// +/// CubicCurveData +/// | - vertex +/// | / +/// | cp1 cp2 +/// | / +/// | | +/// | / +/// -------------------------- +/// +/// When incrementally building a path, it will already have a "current point" so that is +/// not captured in this data structure. +/// The control points here represent {@link android.graphics.Path#cubicTo(float, float, float, float, float, float)}. +/// +/// Most path operations are centered around a vertex and its in control point and out control point like this: +/// | outCp +/// | / +/// | | +/// | v +/// | / +/// | inCp +/// -------------------------- +class CubicCurveData { + Offset controlPoint1 = Offset.zero; + Offset controlPoint2 = Offset.zero; + Offset vertex = Offset.zero; + + void setFrom(CubicCurveData curveData) { + vertex = Offset(curveData.vertex.dx, curveData.vertex.dy); + controlPoint1 = Offset( + curveData.controlPoint1.dx, + curveData.controlPoint1.dy, + ); + controlPoint2 = Offset( + curveData.controlPoint2.dx, + curveData.controlPoint2.dy, + ); + } + + @override + String toString() { + return 'v=$vertex cp1$controlPoint1 cp2=$controlPoint2'; + } +} diff --git a/lottie/lib/src/model/document_data.dart b/lottie/lib/src/model/document_data.dart new file mode 100644 index 0000000..89a023a --- /dev/null +++ b/lottie/lib/src/model/document_data.dart @@ -0,0 +1,77 @@ +import 'dart:ui'; +import 'package:flutter/foundation.dart'; + +enum Justification { leftAlign, rightAlign, center } + +@immutable +class DocumentData { + final String text; + final String? fontName; + final double size; + final Justification justification; + final int tracking; + + /// Extra space in between lines. */ + final double lineHeight; + final double baselineShift; + final Color color; + final Color strokeColor; + final double strokeWidth; + final bool strokeOverFill; + final Offset? boxPosition; + final Offset? boxSize; + + const DocumentData({ + required this.text, + this.fontName, + required this.size, + required this.justification, + required this.tracking, + required this.lineHeight, + required this.baselineShift, + required this.color, + required this.strokeColor, + required this.strokeWidth, + required this.strokeOverFill, + required this.boxPosition, + required this.boxSize, + }); + + @override + int get hashCode { + return Object.hash( + text, + fontName, + size, + justification.index, + tracking, + lineHeight, + baselineShift, + color, + strokeColor, + strokeWidth, + strokeOverFill, + boxPosition, + boxSize, + ); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DocumentData && + runtimeType == other.runtimeType && + text == other.text && + fontName == other.fontName && + size == other.size && + justification == other.justification && + tracking == other.tracking && + lineHeight == other.lineHeight && + baselineShift == other.baselineShift && + color == other.color && + strokeColor == other.strokeColor && + strokeWidth == other.strokeWidth && + strokeOverFill == other.strokeOverFill && + boxPosition == other.boxPosition && + boxSize == other.boxSize; +} diff --git a/lottie/lib/src/model/font.dart b/lottie/lib/src/model/font.dart new file mode 100644 index 0000000..5a3c7fe --- /dev/null +++ b/lottie/lib/src/model/font.dart @@ -0,0 +1,13 @@ +class Font { + final String family; + final String name; + final String style; + final double ascent; + + Font({ + required this.family, + required this.name, + required this.style, + required this.ascent, + }); +} diff --git a/lottie/lib/src/model/font_character.dart b/lottie/lib/src/model/font_character.dart new file mode 100644 index 0000000..a7532d1 --- /dev/null +++ b/lottie/lib/src/model/font_character.dart @@ -0,0 +1,45 @@ +import 'package:flutter/foundation.dart'; +import 'content/shape_group.dart'; + +@immutable +class FontCharacter { + static int hashFor(String character, String fontFamily, String style) { + var result = character.hashCode; + result = 31 * result + fontFamily.hashCode; + result = 31 * result + style.hashCode; + return result; + } + + final List shapes; + final String character; + final double size; + final double width; + final String style; + final String fontFamily; + + const FontCharacter({ + required this.shapes, + required this.character, + required this.size, + required this.width, + required this.style, + required this.fontFamily, + }); + + @override + int get hashCode { + return hashFor(character, fontFamily, style); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FontCharacter && + runtimeType == other.runtimeType && + shapes == other.shapes && + character == other.character && + size == other.size && + width == other.width && + style == other.style && + fontFamily == other.fontFamily; +} diff --git a/lottie/lib/src/model/key_path.dart b/lottie/lib/src/model/key_path.dart new file mode 100644 index 0000000..f26c57d --- /dev/null +++ b/lottie/lib/src/model/key_path.dart @@ -0,0 +1,172 @@ +import 'key_path_element.dart'; + +/// Defines which content to target. +/// The keypath can contain wildcards ('*') with match exactly 1 item. +/// or globstars ('**') which match 0 or more items. +/// +/// For example, if your content were arranged like this: +/// Gabriel (Shape Layer) +/// Body (Shape Group) +/// Left Hand (Shape) +/// Fill (Fill) +/// Transform (Transform) +/// ... +/// Brandon (Shape Layer) +/// Body (Shape Group) +/// Left Hand (Shape) +/// Fill (Fill) +/// Transform (Transform) +/// ... +/// +/// +/// You could: +/// Match Gabriel left hand fill: +/// new KeyPath("Gabriel", "Body", "Left Hand", "Fill"); +/// Match Gabriel and Brandon's left hand fill: +/// new KeyPath("*", "Body", Left Hand", "Fill"); +/// Match anything with the name Fill: +/// new KeyPath("**", "Fill"); +/// +/// +/// NOTE: Content that are part of merge paths or repeaters cannot currently be resolved with +/// a {@link KeyPath}. This may be fixed in the future. +class KeyPath { + final List keys; + KeyPathElement? _resolvedElement; + + KeyPath(List keys) : keys = keys.toList(); + + /// Copy constructor. Copies keys as well. + KeyPath.copy(KeyPath keyPath) + : keys = keyPath.keys.toList(), + _resolvedElement = keyPath._resolvedElement; + + /// Returns a new KeyPath with the key added. + /// This is used during keypath resolution. Children normally don't know about all of their parent + /// elements so this is used to keep track of the fully qualified keypath. + /// This returns a key keypath because during resolution, the full keypath element tree is walked + /// and if this modified the original copy, it would remain after popping back up the element tree. + //@CheckResult + KeyPath addKey(String key) { + var newKeyPath = KeyPath.copy(this); + newKeyPath.keys.add(key); + return newKeyPath; + } + + /// Return a new KeyPath with the element resolved to the specified {@link KeyPathElement}. + KeyPath resolve(KeyPathElement element) { + var keyPath = KeyPath.copy(this); + keyPath._resolvedElement = element; + return keyPath; + } + + /// Returns a {@link KeyPathElement} that this has been resolved to. KeyPaths get resolved with + /// resolveKeyPath on LottieDrawable. + KeyPathElement? get resolvedElement { + return _resolvedElement; + } + + /// Returns whether they key matches at the specified depth. + bool matches(String? key, int depth) { + if (isContainer(key)) { + // This is an artificial layer we programatically create. + return true; + } + if (depth >= keys.length) { + return false; + } + if (keys[depth] == key || keys[depth] == '**' || keys[depth] == '*') { + return true; + } + return false; + } + + /// For a given key and depth, returns how much the depth should be incremented by when + /// resolving a keypath to children. + /// + /// This can be 0 or 2 when there is a globstar and the next key either matches or doesn't match + /// the current key. + int incrementDepthBy(String? key, int depth) { + if (isContainer(key)) { + // If it's a container then we added programatically and it isn't a part of the keypath. + return 0; + } + if (keys[depth] != '**') { + // If it's not a globstar then it is part of the keypath. + return 1; + } + if (depth == keys.length - 1) { + // The last key is a globstar. + return 0; + } + if (keys[depth + 1] == key) { + // We are a globstar and the next key is our current key so consume both. + return 2; + } + return 0; + } + + /// Returns whether the key at specified depth is fully specific enough to match the full set of + /// keys in this keypath. + bool fullyResolvesTo(String? key, int depth) { + if (depth >= keys.length) { + return false; + } + var isLastDepth = depth == keys.length - 1; + var keyAtDepth = keys[depth]; + var isGlobstar = keyAtDepth == '**'; + + if (!isGlobstar) { + var matches = keyAtDepth == key || keyAtDepth == '*'; + return (isLastDepth || + (depth == keys.length - 2 && endsWithGlobstar())) && + matches; + } + + var isGlobstarButNextKeyMatches = !isLastDepth && keys[depth + 1] == key; + if (isGlobstarButNextKeyMatches) { + return depth == keys.length - 2 || + (depth == keys.length - 3 && endsWithGlobstar()); + } + + if (isLastDepth) { + return true; + } + if (depth + 1 < keys.length - 1) { + // We are a globstar but there is more than 1 key after the globstar we we can't fully match. + return false; + } + // Return whether the next key (which we now know is the last one) is the same as the current + // key. + return keys[depth + 1] == key; + } + + /// Returns whether the keypath resolution should propagate to children. Some keypaths resolve + /// to content other than leaf contents (such as a layer or content group transform) so sometimes + /// this will return false. + bool propagateToChildren(String? key, int depth) { + if ('__container' == key) { + return true; + } + return depth < keys.length - 1 || keys[depth] == '**'; + } + + /// We artificially create some container groups (like a root ContentGroup for the entire animation + /// and for the contents of a ShapeLayer). + bool isContainer(String? key) { + return '__container' == key; + } + + bool endsWithGlobstar() { + return keys[keys.length - 1] == '**'; + } + + String keysToString() { + return keys.toString(); + } + + @override + String toString() { + return 'KeyPath{keys=$keys,resolved=${resolvedElement != null}}'; + } +} diff --git a/lottie/lib/src/model/key_path_element.dart b/lottie/lib/src/model/key_path_element.dart new file mode 100644 index 0000000..a8ebfd2 --- /dev/null +++ b/lottie/lib/src/model/key_path_element.dart @@ -0,0 +1,29 @@ +import '../value/lottie_value_callback.dart'; +import 'key_path.dart'; + +/// Any item that can be a part of a {@link KeyPath} should implement this. +abstract class KeyPathElement { + /// Called recursively during keypath resolution. + /// + /// The overridden method should just call: + /// MiscUtils.resolveKeyPath(keyPath, depth, accumulator, currentPartialKeyPath, this); + /// + /// @param keyPath The full keypath being resolved. + /// @param depth The current depth that this element should be checked at in the keypath. + /// @param accumulator A list of fully resolved keypaths. If this element fully matches the + /// keypath then it should add itself to this list. + /// @param currentPartialKeyPath A keypath that contains all parent element of this one. + /// This element should create a copy of this and append itself + /// with KeyPath#addKey when it adds itself to the accumulator + /// or propagates resolution to its children. + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ); + + /// The overridden method should handle appropriate properties and set value callbacks on their + /// animations. + void addValueCallback(T property, LottieValueCallback? callback); +} diff --git a/lottie/lib/src/model/layer/base_layer.dart b/lottie/lib/src/model/layer/base_layer.dart new file mode 100644 index 0000000..4553543 --- /dev/null +++ b/lottie/lib/src/model/layer/base_layer.dart @@ -0,0 +1,689 @@ +import 'dart:math'; +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart' hide Layer; +import '../../animation/content/content.dart'; +import '../../animation/content/drawing_content.dart'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/double_keyframe_animation.dart'; +import '../../animation/keyframe/mask_keyframe_animation.dart'; +import '../../animation/keyframe/transform_keyframe_animation.dart'; +import '../../composition.dart'; +import '../../l.dart'; +import '../../lottie_drawable.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import '../content/blur_effect.dart'; +import '../content/drop_shadow_effect.dart'; +import '../content/mask.dart'; +import '../content/shape_data.dart'; +import '../key_path.dart'; +import '../key_path_element.dart'; +import 'composition_layer.dart'; +import 'image_layer.dart'; +import 'layer.dart'; +import 'null_layer.dart'; +import 'shape_layer.dart'; +import 'solid_layer.dart'; +import 'text_layer.dart'; + +abstract class BaseLayer implements DrawingContent, KeyPathElement { + static BaseLayer? forModel( + CompositionLayer compositionLayer, + Layer layerModel, + LottieDrawable drawable, + LottieComposition composition, + ) { + switch (layerModel.layerType) { + case LayerType.shape: + return ShapeLayer(drawable, layerModel, compositionLayer); + case LayerType.preComp: + return CompositionLayer( + drawable, + layerModel, + composition.getPrecomps(layerModel.refId)!, + composition, + ); + case LayerType.solid: + return SolidLayer(drawable, layerModel); + case LayerType.image: + return ImageLayer(drawable, layerModel); + case LayerType.nullLayer: + return NullLayer(drawable, layerModel); + case LayerType.text: + return TextLayer(drawable, layerModel); + case LayerType.unknown: + // Do nothing + drawable.composition.addWarning( + 'Unknown layer type ${layerModel.layerType}', + ); + return null; + } + } + + final Matrix4 _matrix = Matrix4.identity(); + final Paint _contentPaint = ui.Paint(); + final Paint _dstInPaint = ui.Paint()..blendMode = ui.BlendMode.dstIn; + final Paint _dstOutPaint = ui.Paint()..blendMode = ui.BlendMode.dstOut; + final Paint _mattePaint = ui.Paint(); + final Paint _clearPaint = ui.Paint() + ..isAntiAlias = false + ..blendMode = ui.BlendMode.clear; + final String _drawTraceName; + final Matrix4 boundsMatrix = Matrix4.identity(); + final LottieDrawable lottieDrawable; + final Layer layerModel; + + MaskKeyframeAnimation? _mask; + DoubleKeyframeAnimation? _inOutAnimation; + BaseLayer? _matteLayer; + + /// This should only be used by {@link #buildParentLayerListIfNeeded()} + /// to construct the list of parent layers. + BaseLayer? _parentLayer; + List? _parentLayers; + + final List _animations = []; + final TransformKeyframeAnimation transform; + bool _visible = true; + + double blurMaskFilterRadius = 0; + MaskFilter? blurMaskFilter; + + BaseLayer(this.lottieDrawable, this.layerModel) + : _drawTraceName = '${layerModel.name}#draw', + transform = layerModel.transform.createAnimation() { + if (layerModel.matteType == MatteType.invert) { + _mattePaint.blendMode = BlendMode.dstOut; + } else { + _mattePaint.blendMode = BlendMode.dstIn; + } + + transform.addListener(invalidateSelf); + + if (layerModel.masks.isNotEmpty) { + var mask = _mask = MaskKeyframeAnimation(layerModel.masks); + for (var animation in mask.maskAnimations) { + // Don't call addAnimation() because progress gets set manually in setProgress to + // properly handle time scale. + animation.addUpdateListener(invalidateSelf); + } + for (var animation in mask.opacityAnimations) { + addAnimation(animation); + animation.addUpdateListener(invalidateSelf); + } + } + _setupInOutAnimations(); + } + + void setMatteLayer(BaseLayer? matteLayer) { + _matteLayer = matteLayer; + } + + bool hasMatteOnThisLayer() { + return _matteLayer != null; + } + + void setParentLayer(BaseLayer? parentLayer) { + _parentLayer = parentLayer; + } + + void _setupInOutAnimations() { + if (layerModel.inOutKeyframes.isNotEmpty) { + var inOutAnimation = _inOutAnimation = DoubleKeyframeAnimation( + layerModel.inOutKeyframes, + )..setIsDiscrete(); + inOutAnimation.addUpdateListener(() { + _setVisible(inOutAnimation.value == 1); + }); + _setVisible(inOutAnimation.value == 1); + addAnimation(inOutAnimation); + } else { + _setVisible(true); + } + } + + void invalidateSelf() { + lottieDrawable.invalidateSelf(); + } + + void addAnimation(BaseKeyframeAnimation? newAnimation) { + if (newAnimation == null) { + return; + } + _animations.add(newAnimation); + } + + void removeAnimation(BaseKeyframeAnimation? animation) { + _animations.remove(animation); + } + + @mustCallSuper + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + _buildParentLayerListIfNeeded(); + boundsMatrix.set(parentMatrix); + + if (applyParents) { + if (_parentLayers != null) { + for (var i = _parentLayers!.length - 1; i >= 0; i--) { + boundsMatrix.preConcat(_parentLayers![i].transform.getMatrix()); + } + } else if (_parentLayer != null) { + boundsMatrix.preConcat(_parentLayer!.transform.getMatrix()); + } + } + + boundsMatrix.preConcat(transform.getMatrix()); + + return Rect.zero; + } + + @override + void draw(Canvas canvas, Matrix4 parentMatrix, {required int parentAlpha}) { + L.beginSection(_drawTraceName); + if (!_visible || layerModel.isHidden) { + L.endSection(_drawTraceName); + return; + } + _buildParentLayerListIfNeeded(); + L.beginSection('Layer#parentMatrix'); + _matrix.reset(); + _matrix.set(parentMatrix); + for (var i = _parentLayers!.length - 1; i >= 0; i--) { + _matrix.preConcat(_parentLayers![i].transform.getMatrix()); + } + L.endSection('Layer#parentMatrix'); + var opacity = transform.opacity?.value ?? 100; + var alpha = ((parentAlpha / 255.0 * opacity / 100.0) * 255).toInt(); + var blendMode = this.blendMode; + if (!hasMatteOnThisLayer() && !hasMasksOnThisLayer() && blendMode == null) { + _matrix.preConcat(transform.getMatrix()); + L.beginSection('Layer#drawLayer'); + drawLayer(canvas, _matrix, parentAlpha: alpha); + L.endSection('Layer#drawLayer'); + _recordRenderTime(L.endSection(_drawTraceName)); + return; + } + + L.beginSection('Layer#computeBounds'); + var bounds = getBounds(_matrix, applyParents: false); + + // Uncomment this to draw matte outlines. + /*var paint = Paint() + ..color = Color(0xFF00FF00) + ..style = PaintingStyle.stroke + ..strokeWidth = 3; + canvas.drawRect(bounds, paint);*/ + + bounds = _intersectBoundsWithMatte(bounds, parentMatrix); + + _matrix.preConcat(transform.getMatrix()); + bounds = _intersectBoundsWithMask(bounds, _matrix); + + L.endSection('Layer#computeBounds'); + + if (!bounds.isEmpty) { + L.beginSection('Layer#saveLayer'); + _contentPaint.setAlpha(255); + _contentPaint.blendMode = blendMode ?? ui.BlendMode.srcOver; + canvas.saveLayer(bounds, _contentPaint); + L.endSection('Layer#saveLayer'); + + // Clear the off screen buffer. This is necessary for some phones. + _clearCanvas(canvas, bounds); + L.beginSection('Layer#drawLayer'); + drawLayer(canvas, _matrix, parentAlpha: alpha); + L.endSection('Layer#drawLayer'); + + if (hasMasksOnThisLayer()) { + _applyMasks(canvas, bounds, _matrix); + } + + if (hasMatteOnThisLayer()) { + L.beginSection('Layer#drawMatte'); + L.beginSection('Layer#saveLayer'); + canvas.saveLayer(bounds, _mattePaint); + L.endSection('Layer#saveLayer'); + _clearCanvas(canvas, bounds); + _matteLayer!.draw(canvas, parentMatrix, parentAlpha: alpha); + L.beginSection('Layer#restoreLayer'); + canvas.restore(); + L.endSection('Layer#restoreLayer'); + L.endSection('Layer#drawMatte'); + } + + L.beginSection('Layer#restoreLayer'); + canvas.restore(); + L.endSection('Layer#restoreLayer'); + } + + _recordRenderTime(L.endSection(_drawTraceName)); + } + + void _recordRenderTime(double ms) { + lottieDrawable.composition.performanceTracker.recordRenderTime( + layerModel.name, + ms, + ); + } + + void _clearCanvas(Canvas canvas, Rect bounds) { + L.beginSection('Layer#clearLayer'); + // If we don't pad the clear draw, some phones leave a 1px border of the graphics buffer. + canvas.drawRect(bounds.inflate(1), _clearPaint); + L.endSection('Layer#clearLayer'); + } + + Rect _intersectBoundsWithMask(Rect bounds, Matrix4 matrix) { + if (!hasMasksOnThisLayer()) { + return bounds; + } + var size = _mask!.masks.length; + var maskBoundsRect = Rect.zero; + for (var i = 0; i < size; i++) { + var mask = _mask!.masks[i]; + BaseKeyframeAnimation maskAnimation = + _mask!.maskAnimations[i]; + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + + switch (mask.maskMode) { + case MaskMode.maskModeNone: + // Mask mode none will just render the original content so it is the whole bounds. + return bounds; + case MaskMode.maskModeSubstract: + // If there is a subtract mask, the mask could potentially be the size of the entire + // canvas so we can't use the mask bounds. + return bounds; + case MaskMode.maskModeIntersect: + case MaskMode.maskModeAdd: + if (mask.isInverted) { + return bounds; + } + + var maskBounds = path.getBounds(); + // As we iterate through the masks, we want to calculate the union region of the masks. + // We initialize the rect with the first mask. If we don't call set() on the first call, + // the rect will always extend to (0,0). + if (i == 0) { + maskBoundsRect = maskBounds; + } else { + maskBoundsRect = Rect.fromLTRB( + min(maskBoundsRect.left, maskBounds.left), + min(maskBoundsRect.top, maskBounds.top), + max(maskBoundsRect.right, maskBounds.right), + max(maskBoundsRect.bottom, maskBounds.bottom), + ); + } + } + } + + var intersects = bounds.intersect(maskBoundsRect); + if (intersects.isEmpty) { + return Rect.zero; + } + return bounds; + } + + Rect _intersectBoundsWithMatte(Rect bounds, Matrix4 matrix) { + if (!hasMatteOnThisLayer()) { + return bounds; + } + + if (layerModel.matteType == MatteType.invert) { + // We can't trim the bounds if the mask is inverted since it extends all the way to the + // composition bounds. + return bounds; + } + var matteBounds = _matteLayer!.getBounds(matrix, applyParents: true); + var intersects = bounds.intersect(matteBounds); + if (intersects.isEmpty) { + return Rect.zero; + } + return bounds; + } + + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }); + + void _applyMasks(Canvas canvas, Rect bounds, Matrix4 matrix) { + L.beginSection('Layer#saveLayer'); + canvas.saveLayer(bounds, _dstInPaint); + //TODO(xha): check if needed + //canvas.drawColor(Color(0), BlendMode.dst); + + L.endSection('Layer#saveLayer'); + for (var i = 0; i < _mask!.masks.length; i++) { + var mask = _mask!.masks[i]; + var maskAnimation = _mask!.maskAnimations[i]; + var opacityAnimation = _mask!.opacityAnimations[i]; + switch (mask.maskMode) { + case MaskMode.maskModeNone: + // None mask should have no effect. If all masks are NONE, fill the + // mask canvas with a rectangle so it fully covers the original layer content. + // However, if there are other masks, they should be the only ones that have an effect so + // this should noop. + if (_areAllMasksNone()) { + _contentPaint.setAlpha(255); + canvas.drawRect(bounds, _contentPaint); + } + case MaskMode.maskModeAdd: + if (mask.isInverted) { + _applyInvertedAddMask( + canvas, + bounds, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } else { + _applyAddMask( + canvas, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } + case MaskMode.maskModeSubstract: + if (i == 0) { + _contentPaint.color = const ui.Color(0xFF000000); + canvas.drawRect(bounds, _contentPaint); + } + if (mask.isInverted) { + _applyInvertedSubtractMask( + canvas, + bounds, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } else { + _applySubtractMask( + canvas, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } + case MaskMode.maskModeIntersect: + if (mask.isInverted) { + _applyInvertedIntersectMask( + canvas, + bounds, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } else { + _applyIntersectMask( + canvas, + bounds, + matrix, + mask, + maskAnimation, + opacityAnimation, + ); + } + } + } + L.beginSection('Layer#restoreLayer'); + canvas.restore(); + L.endSection('Layer#restoreLayer'); + } + + bool _areAllMasksNone() { + if (_mask == null || _mask!.maskAnimations.isEmpty) { + return false; + } + for (var i = 0; i < _mask!.masks.length; i++) { + if (_mask!.masks[i].maskMode != MaskMode.maskModeNone) { + return false; + } + } + return true; + } + + void _applyAddMask( + Canvas canvas, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + _contentPaint.setAlpha((opacityAnimation.value * 2.55).round()); + canvas.drawPath(path, _contentPaint); + } + + void _applyInvertedAddMask( + Canvas canvas, + Rect bounds, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + canvas.saveLayer(bounds, _contentPaint); + canvas.drawRect(bounds, _contentPaint); + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + _contentPaint.setAlpha((opacityAnimation.value * 2.55).round()); + canvas.drawPath(path, _dstOutPaint); + canvas.restore(); + } + + void _applySubtractMask( + Canvas canvas, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + canvas.drawPath(path, _dstOutPaint); + } + + void _applyInvertedSubtractMask( + Canvas canvas, + Rect bounds, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + canvas.saveLayer(bounds, _dstOutPaint); + canvas.drawRect(bounds, _contentPaint); + _dstOutPaint.setAlpha((opacityAnimation.value * 2.55).round()); + + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + canvas.drawPath(path, _dstOutPaint); + canvas.restore(); + } + + void _applyIntersectMask( + Canvas canvas, + Rect bounds, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + canvas.saveLayer(bounds, _dstInPaint); + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + _contentPaint.setAlpha((opacityAnimation.value * 2.55).round()); + canvas.drawPath(path, _contentPaint); + canvas.restore(); + } + + void _applyInvertedIntersectMask( + Canvas canvas, + Rect bounds, + Matrix4 matrix, + Mask mask, + BaseKeyframeAnimation maskAnimation, + BaseKeyframeAnimation opacityAnimation, + ) { + canvas.saveLayer(bounds, _dstInPaint); + canvas.drawRect(bounds, _contentPaint); + _dstOutPaint.setAlpha((opacityAnimation.value * 2.55).round()); + var maskPath = maskAnimation.value; + var path = maskPath.transform(matrix.storage); + canvas.drawPath(path, _dstOutPaint); + canvas.restore(); + } + + bool hasMasksOnThisLayer() { + return _mask != null && _mask!.maskAnimations.isNotEmpty; + } + + void _setVisible(bool visible) { + if (visible != _visible) { + _visible = visible; + invalidateSelf(); + } + } + + @protected + void setProgress(double progress) { + // Time stretch should not be applied to the layer transform. + transform.setProgress(progress); + if (_mask != null) { + for (var i = 0; i < _mask!.maskAnimations.length; i++) { + _mask!.maskAnimations[i].setProgress(progress); + } + } + if (_inOutAnimation != null) { + _inOutAnimation!.setProgress(progress); + } + if (_matteLayer != null) { + _matteLayer!.setProgress(progress); + } + for (var i = 0; i < _animations.length; i++) { + _animations[i].setProgress(progress); + } + } + + void _buildParentLayerListIfNeeded() { + if (_parentLayers != null) { + return; + } + if (_parentLayer == null) { + _parentLayers = []; + return; + } + + _parentLayers = []; + var layer = _parentLayer; + while (layer != null) { + _parentLayers!.add(layer); + layer = layer._parentLayer; + } + } + + @override + String get name { + return layerModel.name; + } + + BlurEffect? get blurEffect { + return layerModel.blurEffect; + } + + BlendMode? get blendMode { + return layerModel.blendMode; + } + + MaskFilter? getBlurMaskFilter(double radius) { + if (blurMaskFilterRadius == radius) { + return blurMaskFilter; + } + var sigma = radius * 0.57735 + 0.5; + blurMaskFilter = MaskFilter.blur(BlurStyle.normal, sigma); + blurMaskFilterRadius = radius; + return blurMaskFilter; + } + + DropShadowEffect? get dropShadowEffect => layerModel.dropShadowEffect; + + @override + void setContents(List contentsBefore, List contentsAfter) { + // Do nothing + } + + @override + void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + if (keyPath.keys.isEmpty) return; + var matteLayer = _matteLayer; + if (matteLayer != null) { + var matteCurrentPartialKeyPath = currentPartialKeyPath.addKey( + matteLayer.name, + ); + if (keyPath.fullyResolvesTo(matteLayer.name, depth)) { + accumulator.add(matteCurrentPartialKeyPath.resolve(matteLayer)); + } + + if (keyPath.propagateToChildren(name, depth)) { + var newDepth = depth + keyPath.incrementDepthBy(matteLayer.name, depth); + matteLayer.resolveChildKeyPath( + keyPath, + newDepth, + accumulator, + matteCurrentPartialKeyPath, + ); + } + } + + if (!keyPath.matches(name, depth)) { + return; + } + + if (name != '__container') { + currentPartialKeyPath = currentPartialKeyPath.addKey(name); + + if (keyPath.fullyResolvesTo(name, depth)) { + accumulator.add(currentPartialKeyPath.resolve(this)); + } + } + + if (keyPath.propagateToChildren(name, depth)) { + var newDepth = depth + keyPath.incrementDepthBy(name, depth); + resolveChildKeyPath( + keyPath, + newDepth, + accumulator, + currentPartialKeyPath, + ); + } + } + + void resolveChildKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) {} + + @mustCallSuper + @override + void addValueCallback(T property, LottieValueCallback? callback) { + transform.applyValueCallback(property, callback); + } +} diff --git a/lottie/lib/src/model/layer/composition_layer.dart b/lottie/lib/src/model/layer/composition_layer.dart new file mode 100644 index 0000000..5d3424a --- /dev/null +++ b/lottie/lib/src/model/layer/composition_layer.dart @@ -0,0 +1,230 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/value_callback_keyframe_animation.dart'; +import '../../composition.dart'; +import '../../l.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import '../key_path.dart'; +import 'base_layer.dart'; +import 'layer.dart'; +import 'shape_layer.dart'; + +class CompositionLayer extends BaseLayer { + BaseKeyframeAnimation? _timeRemapping; + final List _layers = []; + final Paint _layerPaint = Paint(); + + bool? _hasMatte; + bool? _hasMasks; + + CompositionLayer( + LottieDrawable lottieDrawable, + Layer layerModel, + List layerModels, + LottieComposition composition, + ) : super(lottieDrawable, layerModel) { + var timeRemapping = layerModel.timeRemapping; + if (timeRemapping != null) { + _timeRemapping = timeRemapping.createAnimation(); + addAnimation(_timeRemapping); + _timeRemapping!.addUpdateListener(invalidateSelf); + } + + var layerMap = {}; + + BaseLayer? mattedLayer; + for (var i = layerModels.length - 1; i >= 0; i--) { + var lm = layerModels[i]; + var layer = BaseLayer.forModel(this, lm, lottieDrawable, composition); + if (layer == null) { + continue; + } + layerMap[layer.layerModel.id] = layer; + if (mattedLayer != null) { + mattedLayer.setMatteLayer(layer); + mattedLayer = null; + } else { + _layers.insert(0, layer); + switch (lm.matteType) { + case MatteType.add: + case MatteType.invert: + mattedLayer = layer; + case MatteType.luma: + case MatteType.lumaInverted: + case MatteType.none: + case MatteType.unknown: + break; + } + } + } + + for (var key in layerMap.keys) { + var layerView = layerMap[key]; + // This shouldn't happen but it appears as if sometimes on pre-lollipop devices when + // compiled with d8, layerView is null sometimes. + // https://github.com/airbnb/lottie-android/issues/524 + if (layerView == null) { + continue; + } + var parentLayer = layerMap[layerView.layerModel.parentId]; + if (parentLayer != null) { + layerView.setParentLayer(parentLayer); + } + } + } + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + L.beginSection('CompositionLayer#draw'); + var newClipRect = Rect.fromLTWH( + 0, + 0, + layerModel.preCompWidth.toDouble(), + layerModel.preCompHeight.toDouble(), + ); + newClipRect = parentMatrix.mapRect(newClipRect); + + // Apply off-screen rendering only when needed in order to improve rendering performance. + var isDrawingWithOffScreen = + lottieDrawable.isApplyingOpacityToLayersEnabled && + _layers.length > 1 && + parentAlpha != 255; + if (isDrawingWithOffScreen) { + _layerPaint.setAlpha(parentAlpha); + canvas.saveLayer(newClipRect, _layerPaint); + } else { + canvas.save(); + } + + var childAlpha = isDrawingWithOffScreen ? 255 : parentAlpha; + for (var i = _layers.length - 1; i >= 0; i--) { + if (!newClipRect.isEmpty) { + canvas.clipRect(newClipRect); + } + + var layer = _layers[i]; + layer.draw(canvas, parentMatrix, parentAlpha: childAlpha); + } + canvas.restore(); + L.endSection('CompositionLayer#draw'); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + var bounds = super.getBounds(parentMatrix, applyParents: applyParents); + for (var i = _layers.length - 1; i >= 0; i--) { + var layerBounds = _layers[i].getBounds(boundsMatrix, applyParents: true); + bounds = bounds.expandToInclude(layerBounds); + } + return bounds; + } + + @override + void setProgress(double progress) { + super.setProgress(progress); + if (_timeRemapping != null) { + // The duration has 0.01 frame offset to show end of animation properly. + // https://github.com/airbnb/lottie-android/pull/766 + // Ignore this offset for calculating time-remapping because time-remapping value is based on original duration. + var durationFrames = lottieDrawable.composition.durationFrames + 0.01; + var compositionDelayFrames = layerModel.composition.startFrame; + var remappedFrames = + _timeRemapping!.value * layerModel.composition.frameRate - + compositionDelayFrames; + progress = remappedFrames / durationFrames; + } + + if (_timeRemapping == null) { + progress -= layerModel.startProgress; + } + //Time stretch needs to be divided if is not "__container" + if (layerModel.timeStretch != 0 && layerModel.name != '__container') { + progress /= layerModel.timeStretch; + } + for (var i = _layers.length - 1; i >= 0; i--) { + _layers[i].setProgress(progress); + } + } + + bool? get hasMasks { + if (_hasMasks == null) { + for (var i = _layers.length - 1; i >= 0; i--) { + var layer = _layers[i]; + if (layer is ShapeLayer) { + if (layer.hasMasksOnThisLayer()) { + _hasMasks = true; + return true; + } + } else if (layer is CompositionLayer && layer.hasMasks!) { + _hasMasks = true; + return true; + } + } + _hasMasks = false; + } + return _hasMasks; + } + + bool get hasMatte { + if (_hasMatte == null) { + if (hasMatteOnThisLayer()) { + _hasMatte = true; + return true; + } + + for (var i = _layers.length - 1; i >= 0; i--) { + if (_layers[i].hasMatteOnThisLayer()) { + _hasMatte = true; + return true; + } + } + _hasMatte = false; + } + return _hasMatte!; + } + + @override + void resolveChildKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + for (var i = 0; i < _layers.length; i++) { + _layers[i].resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + ); + } + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + + if (property == LottieProperty.timeRemap) { + if (callback == null) { + if (_timeRemapping != null) { + _timeRemapping!.setValueCallback(null); + } + } else { + _timeRemapping = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + 1, + ); + _timeRemapping!.addUpdateListener(invalidateSelf); + addAnimation(_timeRemapping); + } + } + } +} diff --git a/lottie/lib/src/model/layer/image_layer.dart b/lottie/lib/src/model/layer/image_layer.dart new file mode 100644 index 0000000..3c089cc --- /dev/null +++ b/lottie/lib/src/model/layer/image_layer.dart @@ -0,0 +1,85 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/value_callback_keyframe_animation.dart'; +import '../../lottie_property.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import 'base_layer.dart'; + +class ImageLayer extends BaseLayer { + final Paint paint = Paint(); + BaseKeyframeAnimation? _colorFilterAnimation; + + ImageLayer(super.lottieDrawable, super.layerModel); + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + var bitmap = getBitmap(); + if (bitmap == null) { + return; + } + + paint.filterQuality = lottieDrawable.filterQuality ?? FilterQuality.low; + paint.setAlpha(parentAlpha); + if (_colorFilterAnimation != null) { + paint.colorFilter = _colorFilterAnimation!.value; + } + canvas.save(); + canvas.transform(parentMatrix.storage); + var src = Rect.fromLTWH( + 0, + 0, + bitmap.width.toDouble(), + bitmap.height.toDouble(), + ); + var dst = Rect.fromLTWH( + 0, + 0, + bitmap.width.toDouble(), + bitmap.height.toDouble(), + ); + canvas.drawImageRect(bitmap, src, dst, paint); + canvas.restore(); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + var superBounds = super.getBounds(parentMatrix, applyParents: applyParents); + var bitmap = getBitmap(); + if (bitmap != null) { + var bounds = Rect.fromLTWH( + 0, + 0, + bitmap.width.toDouble(), + bitmap.height.toDouble(), + ); + return boundsMatrix.mapRect(bounds); + } + return superBounds; + } + + Image? getBitmap() { + var refId = layerModel.refId; + return lottieDrawable.getImageAsset(refId); + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + if (property == LottieProperty.colorFilter) { + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + ); + } + } + } +} diff --git a/lottie/lib/src/model/layer/layer.dart b/lottie/lib/src/model/layer/layer.dart new file mode 100644 index 0000000..f4be7f0 --- /dev/null +++ b/lottie/lib/src/model/layer/layer.dart @@ -0,0 +1,129 @@ +import 'dart:ui'; +import '../../composition.dart'; +import '../../value/keyframe.dart'; +import '../animatable/animatable_double_value.dart'; +import '../animatable/animatable_text_frame.dart'; +import '../animatable/animatable_text_properties.dart'; +import '../animatable/animatable_transform.dart'; +import '../content/blur_effect.dart'; +import '../content/content_model.dart'; +import '../content/drop_shadow_effect.dart'; +import '../content/mask.dart'; + +enum LayerType { preComp, solid, image, nullLayer, shape, text, unknown } + +enum MatteType { none, add, invert, luma, lumaInverted, unknown } + +class Layer { + final List shapes; + final LottieComposition composition; + final String name; + final int id; + final LayerType layerType; + final int parentId; + final String? refId; + final List masks; + final AnimatableTransform transform; + final int solidWidth; + final int solidHeight; + final Color solidColor; + final double timeStretch; + final double startFrame; + final int preCompWidth; + final int preCompHeight; + final AnimatableTextFrame? text; + final AnimatableTextProperties? textProperties; + final List> inOutKeyframes; + final MatteType matteType; + final AnimatableDoubleValue? timeRemapping; + final bool isHidden; + final BlurEffect? blurEffect; + final DropShadowEffect? dropShadowEffect; + final BlendMode? blendMode; + + double get startProgress { + return startFrame / composition.durationFrames; + } + + Layer({ + required this.shapes, + required this.composition, + required this.name, + required this.id, + required this.layerType, + required this.parentId, + this.refId, + required this.masks, + required this.transform, + required this.solidWidth, + required this.solidHeight, + required this.solidColor, + required this.timeStretch, + required this.startFrame, + required this.preCompWidth, + required this.preCompHeight, + this.text, + this.textProperties, + required this.inOutKeyframes, + required this.matteType, + this.timeRemapping, + required this.isHidden, + this.blurEffect, + this.dropShadowEffect, + this.blendMode, + }); + + @override + String toString() { + return toStringWithPrefix(''); + } + + String toStringWithPrefix(String prefix) { + var sb = StringBuffer() + ..write(prefix) + ..write(name) + ..write('\n'); + var parent = composition.layerModelForId(parentId); + if (parent != null) { + sb + ..write('\t\tParents: ') + ..write(parent.name); + parent = composition.layerModelForId(parent.parentId); + while (parent != null) { + sb + ..write('->') + ..write(parent.name); + parent = composition.layerModelForId(parent.parentId); + } + sb + ..write(prefix) + ..write('\n'); + } + if (masks.isNotEmpty) { + sb + ..write(prefix) + ..write('\tMasks: ') + ..write(masks.length) + ..write('\n'); + } + if (solidWidth != 0 && solidHeight != 0) { + sb + ..write(prefix) + ..write('\tBackground: ') + ..write('${solidWidth}x$solidHeight $solidColor'); + } + if (shapes.isNotEmpty) { + sb + ..write(prefix) + ..write('\tShapes:\n'); + for (Object shape in shapes) { + sb + ..write(prefix) + ..write('\t\t') + ..write(shape) + ..write('\n'); + } + } + return sb.toString(); + } +} diff --git a/lottie/lib/src/model/layer/null_layer.dart b/lottie/lib/src/model/layer/null_layer.dart new file mode 100644 index 0000000..9b388a2 --- /dev/null +++ b/lottie/lib/src/model/layer/null_layer.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import 'base_layer.dart'; + +class NullLayer extends BaseLayer { + NullLayer(super.lottieDrawable, super.layerModel); + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + // Do nothing. + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + super.getBounds(parentMatrix, applyParents: applyParents); + return Rect.zero; + } +} diff --git a/lottie/lib/src/model/layer/shape_layer.dart b/lottie/lib/src/model/layer/shape_layer.dart new file mode 100644 index 0000000..fef4a4a --- /dev/null +++ b/lottie/lib/src/model/layer/shape_layer.dart @@ -0,0 +1,83 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../animation/content/content.dart'; +import '../../animation/content/content_group.dart'; +import '../../lottie_drawable.dart'; +import '../content/blur_effect.dart'; +import '../content/drop_shadow_effect.dart'; +import '../content/shape_group.dart'; +import '../key_path.dart'; +import 'base_layer.dart'; +import 'composition_layer.dart'; +import 'layer.dart'; + +class ShapeLayer extends BaseLayer { + late ContentGroup _contentGroup; + final CompositionLayer _compositionLayer; + + ShapeLayer( + LottieDrawable lottieDrawable, + Layer layerModel, + this._compositionLayer, + ) : super(lottieDrawable, layerModel) { + // Naming this __container allows it to be ignored in KeyPath matching. + var shapeGroup = ShapeGroup( + '__container', + layerModel.shapes, + hidden: false, + ); + _contentGroup = ContentGroup(lottieDrawable, this, shapeGroup) + ..setContents([], []); + } + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + _contentGroup.draw(canvas, parentMatrix, parentAlpha: parentAlpha); + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + var bounds = super.getBounds(parentMatrix, applyParents: applyParents); + bounds = bounds.expandToInclude( + _contentGroup.getBounds(boundsMatrix, applyParents: applyParents), + ); + return bounds; + } + + @override + BlurEffect? get blurEffect { + var layerBlur = super.blurEffect; + if (layerBlur != null) { + return layerBlur; + } + return _compositionLayer.blurEffect; + } + + @override + DropShadowEffect? get dropShadowEffect { + var layerDropShadow = super.dropShadowEffect; + if (layerDropShadow != null) { + return layerDropShadow; + } + return _compositionLayer.dropShadowEffect; + } + + @override + void resolveChildKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + ) { + _contentGroup.resolveKeyPath( + keyPath, + depth, + accumulator, + currentPartialKeyPath, + ); + } +} diff --git a/lottie/lib/src/model/layer/solid_layer.dart b/lottie/lib/src/model/layer/solid_layer.dart new file mode 100644 index 0000000..1b8b733 --- /dev/null +++ b/lottie/lib/src/model/layer/solid_layer.dart @@ -0,0 +1,101 @@ +import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/value_callback_keyframe_animation.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../utils.dart'; +import '../../value/lottie_value_callback.dart'; +import 'base_layer.dart'; +import 'layer.dart'; + +class SolidLayer extends BaseLayer { + final Paint paint = Paint()..style = PaintingStyle.fill; + final Path path = Path(); + BaseKeyframeAnimation? _colorFilterAnimation; + BaseKeyframeAnimation? _colorAnimation; + + SolidLayer(LottieDrawable lottieDrawable, Layer layerModel) + : super(lottieDrawable, layerModel) { + paint.color = layerModel.solidColor.withAlpha(0); + } + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + var backgroundAlpha = layerModel.solidColor.a; + if (backgroundAlpha == 0) { + return; + } + + paint.color = _colorAnimation?.value ?? layerModel.solidColor; + + var opacity = transform.opacity?.value ?? 100; + var alpha = + (parentAlpha / 255.0 * (backgroundAlpha * opacity / 100.0) * 255.0) + .round(); + paint.setAlpha(alpha); + + if (_colorFilterAnimation != null) { + paint.colorFilter = _colorFilterAnimation!.value; + } + if (alpha > 0) { + var points = List.filled(8, 0.0); + points[2] = points[4] = layerModel.solidWidth.toDouble(); + points[5] = points[7] = layerModel.solidHeight.toDouble(); + + // We can't map rect here because if there is rotation on the transform then we aren't + // actually drawing a rect. + parentMatrix.mapPoints(points); + path.reset(); + path.moveTo(points[0], points[1]); + path.lineTo(points[2], points[3]); + path.lineTo(points[4], points[5]); + path.lineTo(points[6], points[7]); + path.lineTo(points[0], points[1]); + path.close(); + canvas.drawPath(path, paint); + } + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + super.getBounds(parentMatrix, applyParents: applyParents); + var rect = Rect.fromLTWH( + 0, + 0, + layerModel.solidWidth.toDouble(), + layerModel.solidHeight.toDouble(), + ); + rect = boundsMatrix.mapRect(rect); + return rect; + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + if (property == LottieProperty.colorFilter) { + if (callback == null) { + _colorFilterAnimation = null; + } else { + _colorFilterAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + ); + } + } else if (property == LottieProperty.color) { + if (callback == null) { + _colorAnimation = null; + paint.color = layerModel.solidColor; + } else { + _colorAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + null, + ); + } + } + } +} diff --git a/lottie/lib/src/model/layer/text_layer.dart b/lottie/lib/src/model/layer/text_layer.dart new file mode 100644 index 0000000..87558d3 --- /dev/null +++ b/lottie/lib/src/model/layer/text_layer.dart @@ -0,0 +1,638 @@ +import 'package:flutter/widgets.dart'; +import '../../animation/content/content_group.dart'; +import '../../animation/keyframe/base_keyframe_animation.dart'; +import '../../animation/keyframe/text_keyframe_animation.dart'; +import '../../animation/keyframe/value_callback_keyframe_animation.dart'; +import '../../composition.dart'; +import '../../lottie_drawable.dart'; +import '../../lottie_property.dart'; +import '../../utils.dart'; +import '../../utils/characters.dart'; +import '../../value/lottie_value_callback.dart'; +import '../document_data.dart'; +import '../font.dart'; +import '../font_character.dart'; +import 'base_layer.dart'; +import 'layer.dart'; + +class TextLayer extends BaseLayer { + // TODO(xha): take from context. + final TextDirection _textDirection = TextDirection.ltr; + final _matrix = Matrix4.identity(); + final _fillPaint = Paint()..style = PaintingStyle.fill; + final _strokePaint = Paint()..style = PaintingStyle.stroke; + final _contentsForCharacter = >{}; + + /// If this is paragraph text, one line may wrap depending on the size of the document data box. + final _textSubLines = <_TextSubLine>[]; + final TextKeyframeAnimation _textAnimation; + final LottieComposition _composition; + + BaseKeyframeAnimation? _colorAnimation; + + BaseKeyframeAnimation? _colorCallbackAnimation; + + BaseKeyframeAnimation? _strokeColorAnimation; + + BaseKeyframeAnimation? _strokeColorCallbackAnimation; + + BaseKeyframeAnimation? _strokeWidthAnimation; + + BaseKeyframeAnimation? _strokeWidthCallbackAnimation; + + BaseKeyframeAnimation? _trackingAnimation; + + BaseKeyframeAnimation? _trackingCallbackAnimation; + + BaseKeyframeAnimation? _textSizeAnimation; + + BaseKeyframeAnimation? _textSizeCallbackAnimation; + + TextLayer(LottieDrawable lottieDrawable, Layer layerModel) + : _composition = layerModel.composition, + _textAnimation = layerModel.text!.createAnimation(), + super(lottieDrawable, layerModel) { + _textAnimation.addUpdateListener(invalidateSelf); + addAnimation(_textAnimation); + + var textProperties = layerModel.textProperties; + if (textProperties != null && textProperties.color != null) { + _colorAnimation = textProperties.color!.createAnimation() + ..addUpdateListener(invalidateSelf); + addAnimation(_colorAnimation); + } + + if (textProperties != null && textProperties.stroke != null) { + _strokeColorAnimation = textProperties.stroke!.createAnimation() + ..addUpdateListener(invalidateSelf); + addAnimation(_strokeColorAnimation); + } + + if (textProperties != null && textProperties.strokeWidth != null) { + _strokeWidthAnimation = textProperties.strokeWidth!.createAnimation() + ..addUpdateListener(invalidateSelf); + addAnimation(_strokeWidthAnimation); + } + + if (textProperties != null && textProperties.tracking != null) { + _trackingAnimation = textProperties.tracking!.createAnimation() + ..addUpdateListener(invalidateSelf); + addAnimation(_trackingAnimation); + } + } + + @override + Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) { + super.getBounds(parentMatrix, applyParents: applyParents); + // TODO: use the correct text bounds. + return Rect.fromLTWH( + 0, + 0, + _composition.bounds.width.toDouble(), + _composition.bounds.height.toDouble(), + ); + } + + @override + void drawLayer( + Canvas canvas, + Matrix4 parentMatrix, { + required int parentAlpha, + }) { + var documentData = _textAnimation.value; + var font = _composition.fonts[documentData.fontName]; + if (font == null) { + return; + } + canvas.save(); + canvas.transform(parentMatrix.storage); + + _configurePaint(documentData, parentAlpha); + + if (lottieDrawable.useTextGlyphs) { + _drawTextWithGlyphs(documentData, parentMatrix, font, canvas); + } else { + _drawTextWithFont(documentData, font, canvas); + } + + canvas.restore(); + } + + void _configurePaint(DocumentData documentData, int parentAlpha) { + Color fillPaintColor; + if (_colorCallbackAnimation != null) { + fillPaintColor = _colorCallbackAnimation!.value; + } else if (_colorAnimation != null) { + fillPaintColor = _colorAnimation!.value; + } else { + fillPaintColor = documentData.color; + } + _fillPaint.color = fillPaintColor.withValues(alpha: _fillPaint.color.a); + + Color strokePaintColor; + if (_strokeColorCallbackAnimation != null) { + strokePaintColor = _strokeColorCallbackAnimation!.value; + } else if (_strokeColorAnimation != null) { + strokePaintColor = _strokeColorAnimation!.value; + } else { + strokePaintColor = documentData.strokeColor; + } + _strokePaint.color = strokePaintColor.withValues( + alpha: _strokePaint.color.a, + ); + + var opacity = transform.opacity?.value ?? 100; + var alpha = opacity * 255 / 100 * parentAlpha ~/ 255; + _fillPaint.setAlpha(alpha); + _strokePaint.setAlpha(alpha); + + if (_strokeWidthCallbackAnimation != null) { + _strokePaint.strokeWidth = _strokeWidthCallbackAnimation!.value; + } else if (_strokeWidthAnimation != null) { + _strokePaint.strokeWidth = _strokeWidthAnimation!.value; + } else { + _strokePaint.strokeWidth = documentData.strokeWidth; + } + } + + void _drawTextWithGlyphs( + DocumentData documentData, + Matrix4 parentMatrix, + Font font, + Canvas canvas, + ) { + double textSize; + if (_textSizeCallbackAnimation != null) { + textSize = _textSizeCallbackAnimation!.value; + } else if (_textSizeAnimation != null) { + textSize = _textSizeAnimation!.value; + } else { + textSize = documentData.size; + } + var fontScale = textSize / 100.0; + var parentScale = parentMatrix.getScale(); + + var text = documentData.text; + + // Split full text in multiple lines + var textLines = _getTextLines(text); + var textLineCount = textLines.length; + // Add tracking + var tracking = documentData.tracking / 10; + if (_trackingCallbackAnimation != null) { + tracking += _trackingCallbackAnimation!.value; + } else if (_trackingAnimation != null) { + tracking += _trackingAnimation!.value; + } + var lineIndex = -1; + for (var i = 0; i < textLineCount; i++) { + var textLine = textLines[i]; + var boxWidth = documentData.boxSize?.dx ?? 0.0; + var lines = _splitGlyphTextIntoLines( + textLine, + boxWidth, + font, + fontScale, + tracking, + null, + ); + for (var j = 0; j < lines.length; j++) { + var line = lines[j]; + lineIndex++; + + canvas.save(); + + _offsetCanvas(canvas, documentData, lineIndex, line.width); + _drawGlyphTextLine( + line.text, + documentData, + font, + canvas, + parentScale, + fontScale, + tracking, + ); + + canvas.restore(); + } + } + } + + void _drawGlyphTextLine( + Characters text, + DocumentData documentData, + Font font, + Canvas canvas, + double parentScale, + double fontScale, + double tracking, + ) { + for (var c in text) { + var characterHash = FontCharacter.hashFor(c, font.family, font.style); + var character = _composition.characters[characterHash]; + if (character == null) { + // Something is wrong. Potentially, they didn't export the text as a glyph. + continue; + } + _drawCharacterAsGlyph(character, fontScale, documentData, canvas); + var tx = character.width * fontScale + tracking; + canvas.translate(tx, 0); + } + } + + void _drawTextWithFont(DocumentData documentData, Font font, Canvas canvas) { + var textStyle = lottieDrawable.getTextStyle(font.family, font.style); + var text = documentData.text; + var textDelegate = lottieDrawable.delegates?.text; + if (textDelegate != null) { + text = textDelegate(text); + } + double textSize; + if (_textSizeCallbackAnimation != null) { + textSize = _textSizeCallbackAnimation!.value; + } else if (_textSizeAnimation != null) { + textSize = _textSizeAnimation!.value; + } else { + textSize = documentData.size; + } + textStyle = textStyle.copyWith(fontSize: textSize); + + // Calculate tracking + var tracking = documentData.tracking / 10; + if (_trackingCallbackAnimation != null) { + tracking += _trackingCallbackAnimation!.value; + } else if (_trackingAnimation != null) { + tracking += _trackingAnimation!.value; + } + tracking = tracking * textSize / 100.0; + + // Split full text in multiple lines + var textLines = _getTextLines(text); + var textLineCount = textLines.length; + var lineIndex = -1; + for (var i = 0; i < textLineCount; i++) { + var textLine = textLines[i]; + var boxWidth = documentData.boxSize?.dx ?? 0.0; + var lines = _splitGlyphTextIntoLines( + textLine, + boxWidth, + font, + 0.0, + tracking, + textStyle, + ); + for (var j = 0; j < lines.length; j++) { + var line = lines[j]; + lineIndex++; + + canvas.save(); + + _offsetCanvas(canvas, documentData, lineIndex, line.width); + _drawFontTextLine(line.text, textStyle, documentData, canvas, tracking); + + canvas.restore(); + } + } + } + + void _offsetCanvas( + Canvas canvas, + DocumentData documentData, + int lineIndex, + double lineWidth, + ) { + var position = documentData.boxPosition; + var size = documentData.boxSize; + var lineStartY = position == null + ? 0 + : documentData.lineHeight + position.dy; + var lineOffset = lineIndex * documentData.lineHeight + lineStartY; + var lineStart = position?.dx ?? 0.0; + var boxWidth = size?.dx ?? 0.0; + switch (documentData.justification) { + case Justification.leftAlign: + canvas.translate(lineStart, lineOffset); + case Justification.rightAlign: + canvas.translate(lineStart + boxWidth - lineWidth, lineOffset); + case Justification.center: + canvas.translate( + lineStart + boxWidth / 2.0 - lineWidth / 2.0, + lineOffset, + ); + } + } + + List _getTextLines(String text) { + // Split full text by carriage return character + var formattedText = text + .replaceAll('\r\n', '\r') + .replaceAll('\u0003', '\r') + .replaceAll('\n', '\r'); + var textLinesArray = formattedText.split('\r'); + return textLinesArray.map((l) => l.characters).toList(); + } + + void _drawFontTextLine( + Characters text, + TextStyle textStyle, + DocumentData documentData, + Canvas canvas, + double tracking, + ) { + for (var char in text) { + var charString = char; + _drawCharacterFromFont(charString, textStyle, documentData, canvas); + var textPainter = TextPainter( + text: TextSpan(text: charString, style: textStyle), + textDirection: _textDirection, + ); + textPainter.layout(); + var charWidth = textPainter.width; + var tx = charWidth + tracking; + canvas.translate(tx, 0); + } + } + + List<_TextSubLine> _splitGlyphTextIntoLines( + Characters textLine, + double boxWidth, + Font font, + double fontScale, + double tracking, + TextStyle? textStyle, + ) { + var usingGlyphs = textStyle == null; + var lineCount = 0; + + var currentLineWidth = 0.0; + var currentLineStartIndex = 0; + + var currentWordStartIndex = 0; + var currentWordWidth = 0.0; + var nextCharacterStartsWord = false; + + // The measured size of a space. + var spaceWidth = 0.0; + + var textPainter = TextPainter( + text: TextSpan(text: '', style: textStyle), + textDirection: _textDirection, + ); + var i = 0; + for (var c in textLine) { + double currentCharWidth; + if (usingGlyphs) { + var characterHash = FontCharacter.hashFor(c, font.family, font.style); + var character = _composition.characters[characterHash]; + if (character == null) { + continue; + } + currentCharWidth = character.width * fontScale + tracking; + } else { + textPainter.text = TextSpan(text: c, style: textStyle); + textPainter.layout(); + currentCharWidth = textPainter.width + tracking; + } + + if (c == ' ') { + spaceWidth = currentCharWidth; + nextCharacterStartsWord = true; + } else if (nextCharacterStartsWord) { + nextCharacterStartsWord = false; + currentWordStartIndex = i; + currentWordWidth = currentCharWidth; + } else { + currentWordWidth += currentCharWidth; + } + currentLineWidth += currentCharWidth; + + if (boxWidth > 0 && currentLineWidth >= boxWidth) { + if (c == ' ') { + // Spaces at the end of a line don't do anything. Ignore it. + // The next non-space character will hit the conditions below. + continue; + } + var subLine = _ensureEnoughSubLines(++lineCount); + if (currentWordStartIndex == currentLineStartIndex) { + // Only word on line is wider than box, start wrapping mid-word. + var substr = textLine.getRange(currentLineStartIndex, i); + var trimmed = substr.trim(' '.characters); + var trimmedSpace = (trimmed.length - substr.length) * spaceWidth; + subLine.set( + trimmed, + currentLineWidth - currentCharWidth - trimmedSpace, + ); + currentLineStartIndex = i; + currentLineWidth = currentCharWidth; + currentWordStartIndex = currentLineStartIndex; + currentWordWidth = currentCharWidth; + } else { + var substr = textLine.getRange( + currentLineStartIndex, + currentWordStartIndex - 1, + ); + var trimmed = substr.trim(' '.characters); + var trimmedSpace = (substr.length - trimmed.length) * spaceWidth; + subLine.set( + trimmed, + currentLineWidth - currentWordWidth - trimmedSpace - spaceWidth, + ); + currentLineStartIndex = currentWordStartIndex; + currentLineWidth = currentWordWidth; + } + } + ++i; + } + if (currentLineWidth > 0) { + var line = _ensureEnoughSubLines(++lineCount); + line.set(textLine.getRange(currentLineStartIndex), currentLineWidth); + } + return _textSubLines.sublist(0, lineCount); + } + + /// Elements are reused and not deleted to save allocations. + _TextSubLine _ensureEnoughSubLines(int numLines) { + for (var i = _textSubLines.length; i < numLines; i++) { + _textSubLines.add(_TextSubLine()); + } + return _textSubLines[numLines - 1]; + } + + void _drawCharacterAsGlyph( + FontCharacter character, + double fontScale, + DocumentData documentData, + Canvas canvas, + ) { + var contentGroups = _getContentsForCharacter(character); + for (var j = 0; j < contentGroups.length; j++) { + var path = contentGroups[j].getPath(); + _matrix.reset(); + _matrix.translateByDouble(0.0, -documentData.baselineShift, 0, 1); + _matrix.scaleByDouble(fontScale, fontScale, fontScale, 1); + path = path.transform(_matrix.storage); + if (documentData.strokeOverFill) { + _drawGlyph(path, _fillPaint, canvas); + _drawGlyph(path, _strokePaint, canvas); + } else { + _drawGlyph(path, _strokePaint, canvas); + _drawGlyph(path, _fillPaint, canvas); + } + } + } + + void _drawGlyph(Path path, Paint paint, Canvas canvas) { + if (paint.color.a == 0) { + return; + } + if (paint.style == PaintingStyle.stroke && paint.strokeWidth == 0) { + return; + } + canvas.drawPath(path, paint); + } + + void _drawCharacterFromFont( + String character, + TextStyle textStyle, + DocumentData documentData, + Canvas canvas, + ) { + if (documentData.strokeOverFill) { + _drawCharacter(character, textStyle, _fillPaint, canvas); + _drawCharacter(character, textStyle, _strokePaint, canvas); + } else { + _drawCharacter(character, textStyle, _strokePaint, canvas); + _drawCharacter(character, textStyle, _fillPaint, canvas); + } + } + + void _drawCharacter( + String character, + TextStyle textStyle, + Paint paint, + Canvas canvas, + ) { + if (paint.color.a == 0) { + return; + } + if (paint.style == PaintingStyle.stroke && paint.strokeWidth == 0) { + return; + } + + textStyle = textStyle.copyWith(foreground: paint); + + var painter = TextPainter( + text: TextSpan(text: character, style: textStyle), + textDirection: _textDirection, + ); + painter.layout(); + painter.paint(canvas, Offset(0, -textStyle.fontSize!)); + } + + List _getContentsForCharacter(FontCharacter character) { + if (_contentsForCharacter.containsKey(character)) { + return _contentsForCharacter[character]!; + } + var shapes = character.shapes; + var size = shapes.length; + var contents = []; + for (var i = 0; i < size; i++) { + var sg = shapes[i]; + contents.add(ContentGroup(lottieDrawable, this, sg)); + } + _contentsForCharacter[character] = contents; + return contents; + } + + @override + void addValueCallback(T property, LottieValueCallback? callback) { + super.addValueCallback(property, callback); + if (property == LottieProperty.color) { + if (_colorCallbackAnimation != null) { + removeAnimation(_colorCallbackAnimation); + } + + if (callback == null) { + _colorCallbackAnimation = null; + } else { + _colorCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + const Color(0x00000000), + )..addUpdateListener(invalidateSelf); + addAnimation(_colorCallbackAnimation); + } + } else if (property == LottieProperty.strokeColor) { + if (_strokeColorCallbackAnimation != null) { + removeAnimation(_strokeColorCallbackAnimation); + } + + if (callback == null) { + _strokeColorCallbackAnimation = null; + } else { + _strokeColorCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + const Color(0x00000000), + )..addUpdateListener(invalidateSelf); + addAnimation(_strokeColorCallbackAnimation); + } + } else if (property == LottieProperty.strokeWidth) { + if (_strokeWidthCallbackAnimation != null) { + removeAnimation(_strokeWidthCallbackAnimation); + } + + if (callback == null) { + _strokeWidthCallbackAnimation = null; + } else { + _strokeWidthCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + 0, + )..addUpdateListener(invalidateSelf); + addAnimation(_strokeWidthCallbackAnimation); + } + } else if (property == LottieProperty.textTracking) { + if (_trackingCallbackAnimation != null) { + removeAnimation(_trackingCallbackAnimation); + } + + if (callback == null) { + _trackingCallbackAnimation = null; + } else { + _trackingCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + 0, + )..addUpdateListener(invalidateSelf); + addAnimation(_trackingCallbackAnimation); + } + } else if (property == LottieProperty.textSize) { + if (_textSizeCallbackAnimation != null) { + removeAnimation(_textSizeCallbackAnimation); + } + + if (callback == null) { + _textSizeCallbackAnimation = null; + } else { + _textSizeCallbackAnimation = ValueCallbackKeyframeAnimation( + callback as LottieValueCallback, + 10, + )..addUpdateListener(invalidateSelf); + addAnimation(_textSizeCallbackAnimation); + } + } else if (property == LottieProperty.text) { + if (callback != null) { + _textAnimation.setStringValueCallback( + callback as LottieValueCallback, + ); + } + } + } +} + +class _TextSubLine { + Characters text = Characters.empty; + double width = 0.0; + + void set(Characters text, double width) { + this.text = text; + this.width = width; + } +} diff --git a/lottie/lib/src/model/marker.dart b/lottie/lib/src/model/marker.dart new file mode 100644 index 0000000..63e11d5 --- /dev/null +++ b/lottie/lib/src/model/marker.dart @@ -0,0 +1,26 @@ +import '../../lottie.dart'; + +class Marker { + final LottieComposition _composition; + final String name; + final double startFrame; + final double durationFrames; + + Marker( + this._composition, + this.name, { + required this.startFrame, + required this.durationFrames, + }); + + bool matchesName(String name) { + return this.name.trim().toLowerCase() == name.toLowerCase(); + } + + double get start => + (startFrame - _composition.startFrame) / _composition.durationFrames; + + double get end => + (startFrame + durationFrames - _composition.startFrame) / + _composition.durationFrames; +} diff --git a/lottie/lib/src/options.dart b/lottie/lib/src/options.dart new file mode 100644 index 0000000..6e52c3d --- /dev/null +++ b/lottie/lib/src/options.dart @@ -0,0 +1,21 @@ +class LottieOptions { + /// Enable merge path support. + /// + /// Merge paths currently don't work if the the operand shape is entirely contained within the + /// first shape. If you need to cut out one shape from another shape, use an even-odd fill type + /// instead of using merge paths. + final bool enableMergePaths; + + /// Enable layer-level opacity. + /// + /// Add the ability to render opacity on the layer level rather than the shape level. + /// Opacity is normally applied directly to a shape. In cases where translucent shapes overlap, + /// applying opacity to a layer will be more accurate at the expense of performance. + /// Details: https://github.com/airbnb/lottie-android/issues/902 + final bool enableApplyingOpacityToLayers; + + LottieOptions({ + this.enableMergePaths = false, + this.enableApplyingOpacityToLayers = false, + }); +} diff --git a/lottie/lib/src/parser/animatable_path_value_parser.dart b/lottie/lib/src/parser/animatable_path_value_parser.dart new file mode 100644 index 0000000..10b8db0 --- /dev/null +++ b/lottie/lib/src/parser/animatable_path_value_parser.dart @@ -0,0 +1,85 @@ +import 'dart:ui'; +import '../composition.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_path_value.dart'; +import '../model/animatable/animatable_split_dimension_path_value.dart'; +import '../model/animatable/animatable_value.dart'; +import '../value/keyframe.dart'; +import 'animatable_value_parser.dart'; +import 'json_utils.dart'; +import 'keyframes_parser.dart'; +import 'moshi/json_reader.dart'; +import 'path_keyframe_parser.dart'; + +class AnimatablePathValueParser { + static final _names = JsonReaderOptions.of(['k', 'x', 'y']); + + AnimatablePathValueParser._(); + + static AnimatablePathValue parse( + JsonReader reader, + LottieComposition composition, + ) { + var keyframes = >[]; + if (reader.peek() == Token.beginArray) { + reader.beginArray(); + while (reader.hasNext()) { + keyframes.add(PathKeyframeParser.parse(reader, composition)); + } + reader.endArray(); + KeyframesParser.setEndFrames(keyframes); + } else { + keyframes.add( + Keyframe.nonAnimated(JsonUtils.jsonToPoint(reader)), + ); + } + return AnimatablePathValue.fromKeyframes(keyframes); + } + + /// Returns either an {@link AnimatablePathValue} or an {@link AnimatableSplitDimensionPathValue}. + static AnimatableValue parseSplitPath( + JsonReader reader, + LottieComposition composition, + ) { + AnimatablePathValue? pathAnimation; + AnimatableDoubleValue? xAnimation; + AnimatableDoubleValue? yAnimation; + + var hasExpressions = false; + + reader.beginObject(); + while (reader.peek() != Token.endObject) { + switch (reader.selectName(_names)) { + case 0: + pathAnimation = AnimatablePathValueParser.parse(reader, composition); + case 1: + if (reader.peek() == Token.string) { + hasExpressions = true; + reader.skipValue(); + } else { + xAnimation = AnimatableValueParser.parseFloat(reader, composition); + } + case 2: + if (reader.peek() == Token.string) { + hasExpressions = true; + reader.skipValue(); + } else { + yAnimation = AnimatableValueParser.parseFloat(reader, composition); + } + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + if (hasExpressions) { + composition.addWarning("Lottie doesn't support expressions."); + } + + if (pathAnimation != null) { + return pathAnimation; + } + return AnimatableSplitDimensionPathValue(xAnimation!, yAnimation!); + } +} diff --git a/lottie/lib/src/parser/animatable_text_properties_parser.dart b/lottie/lib/src/parser/animatable_text_properties_parser.dart new file mode 100644 index 0000000..781977a --- /dev/null +++ b/lottie/lib/src/parser/animatable_text_properties_parser.dart @@ -0,0 +1,73 @@ +import '../composition.dart'; +import '../model/animatable/animatable_color_value.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_text_properties.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class AnimatableTextPropertiesParser { + static final JsonReaderOptions _propertiesNames = JsonReaderOptions.of(['a']); + static final JsonReaderOptions _animatablePropertiesNames = + JsonReaderOptions.of(['fc', 'sc', 'sw', 't']); + + AnimatableTextPropertiesParser(); + + static AnimatableTextProperties parse( + JsonReader reader, + LottieComposition composition, + ) { + AnimatableTextProperties? anim; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_propertiesNames)) { + case 0: + anim = _parseAnimatableTextProperties(reader, composition); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + if (anim == null) { + // Not sure if this is possible. + return AnimatableTextProperties(); + } + return anim; + } + + static AnimatableTextProperties _parseAnimatableTextProperties( + JsonReader reader, + LottieComposition composition, + ) { + AnimatableColorValue? color; + AnimatableColorValue? stroke; + AnimatableDoubleValue? strokeWidth; + AnimatableDoubleValue? tracking; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_animatablePropertiesNames)) { + case 0: + color = AnimatableValueParser.parseColor(reader, composition); + case 1: + stroke = AnimatableValueParser.parseColor(reader, composition); + case 2: + strokeWidth = AnimatableValueParser.parseFloat(reader, composition); + case 3: + tracking = AnimatableValueParser.parseFloat(reader, composition); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + return AnimatableTextProperties( + color: color, + stroke: stroke, + strokeWidth: strokeWidth, + tracking: tracking, + ); + } +} diff --git a/lottie/lib/src/parser/animatable_transform_parser.dart b/lottie/lib/src/parser/animatable_transform_parser.dart new file mode 100644 index 0000000..07908dd --- /dev/null +++ b/lottie/lib/src/parser/animatable_transform_parser.dart @@ -0,0 +1,192 @@ +import 'dart:ui'; +import '../composition.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/animatable/animatable_path_value.dart'; +import '../model/animatable/animatable_scale_value.dart'; +import '../model/animatable/animatable_split_dimension_path_value.dart'; +import '../model/animatable/animatable_transform.dart'; +import '../model/animatable/animatable_value.dart'; +import '../value/keyframe.dart'; +import 'animatable_path_value_parser.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class AnimatableTransformParser { + AnimatableTransformParser._(); + + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'a', + 'p', + 's', + 'rz', + 'r', + 'o', + 'so', + 'eo', + 'sk', + 'sa', + ]); + static final JsonReaderOptions _animatableNames = JsonReaderOptions.of(['k']); + + static AnimatableTransform parse( + JsonReader reader, + LottieComposition composition, + ) { + AnimatablePathValue? anchorPoint; + AnimatableValue? position; + AnimatableScaleValue? scale; + AnimatableDoubleValue? rotation; + AnimatableIntegerValue? opacity; + AnimatableDoubleValue? startOpacity; + AnimatableDoubleValue? endOpacity; + AnimatableDoubleValue? skew; + AnimatableDoubleValue? skewAngle; + + var isObject = reader.peek() == Token.beginObject; + if (isObject) { + reader.beginObject(); + } + while (reader.hasNext()) { + var name = reader.selectName(_names); + switch (name) { + case 0: + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_animatableNames)) { + case 0: + anchorPoint = AnimatablePathValueParser.parse( + reader, + composition, + ); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + case 1: + position = AnimatablePathValueParser.parseSplitPath( + reader, + composition, + ); + case 2: + scale = AnimatableValueParser.parseScale(reader, composition); + case 3: + case 4: + if (name == 3) { + composition.addWarning("Lottie doesn't support 3D layers."); + } + + // Sometimes split path rotation gets exported like: + // "rz": { + // "a": 1, + // "k": [ + // {} + // ] + // }, + // which doesn't parse to a real keyframe. + rotation = AnimatableValueParser.parseFloat(reader, composition); + if (rotation.keyframes.isEmpty) { + rotation.keyframes.add( + Keyframe( + composition, + startValue: 0.0, + endValue: 0.0, + startFrame: 0.0, + endFrame: composition.endFrame, + ), + ); + } else if (rotation.keyframes.first.startValue == null) { + rotation.keyframes.first = Keyframe( + composition, + startValue: 0.0, + endValue: 0.0, + startFrame: 0.0, + endFrame: composition.endFrame, + ); + } + case 5: + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 6: + startOpacity = AnimatableValueParser.parseFloat(reader, composition); + case 7: + endOpacity = AnimatableValueParser.parseFloat(reader, composition); + case 8: + skew = AnimatableValueParser.parseFloat(reader, composition); + case 9: + skewAngle = AnimatableValueParser.parseFloat(reader, composition); + default: + reader.skipName(); + reader.skipValue(); + } + } + if (isObject) { + reader.endObject(); + } + + if (isAnchorPointIdentity(anchorPoint)) { + anchorPoint = null; + } + if (isPositionIdentity(position)) { + position = null; + } + if (isRotationIdentity(rotation)) { + rotation = null; + } + if (isScaleIdentity(scale)) { + scale = null; + } + if (isSkewIdentity(skew)) { + skew = null; + } + if (isSkewAngleIdentity(skewAngle)) { + skewAngle = null; + } + return AnimatableTransform( + anchorPoint: anchorPoint, + position: position, + scale: scale, + rotation: rotation, + opacity: opacity, + startOpacity: startOpacity, + endOpacity: endOpacity, + skew: skew, + skewAngle: skewAngle, + ); + } + + static bool isAnchorPointIdentity(AnimatablePathValue? anchorPoint) { + return anchorPoint == null || + (anchorPoint.isStatic && + anchorPoint.keyframes.first.startValue == Offset.zero); + } + + static bool isPositionIdentity(AnimatableValue? position) { + return position == null || + (position is! AnimatableSplitDimensionPathValue && + position.isStatic && + position.keyframes.first.startValue == Offset.zero); + } + + static bool isRotationIdentity(AnimatableDoubleValue? rotation) { + return rotation == null || + (rotation.isStatic && rotation.keyframes.first.startValue == 0.0); + } + + static bool isScaleIdentity(AnimatableScaleValue? scale) { + return scale == null || + (scale.isStatic && + scale.keyframes.first.startValue == const Offset(1.0, 1.0)); + } + + static bool isSkewIdentity(AnimatableDoubleValue? skew) { + return skew == null || + (skew.isStatic && skew.keyframes.first.startValue == 0.0); + } + + static bool isSkewAngleIdentity(AnimatableDoubleValue? skewAngle) { + return skewAngle == null || + (skewAngle.isStatic && skewAngle.keyframes.first.startValue == 0.0); + } +} diff --git a/lottie/lib/src/parser/animatable_value_parser.dart b/lottie/lib/src/parser/animatable_value_parser.dart new file mode 100644 index 0000000..17471df --- /dev/null +++ b/lottie/lib/src/parser/animatable_value_parser.dart @@ -0,0 +1,111 @@ +import '../composition.dart'; +import '../model/animatable/animatable_color_value.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_gradient_color_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/animatable/animatable_point_value.dart'; +import '../model/animatable/animatable_scale_value.dart'; +import '../model/animatable/animatable_shape_value.dart'; +import '../model/animatable/animatable_text_frame.dart'; +import '../value/keyframe.dart'; +import 'color_parser.dart'; +import 'document_data_parser.dart'; +import 'float_parser.dart'; +import 'gradient_color_parser.dart'; +import 'integer_parser.dart'; +import 'keyframes_parser.dart'; +import 'moshi/json_reader.dart'; +import 'offset_parser.dart'; +import 'scale_xy_parser.dart'; +import 'shape_data_parser.dart'; +import 'value_parser.dart'; + +class AnimatableValueParser { + AnimatableValueParser._(); + + static AnimatableDoubleValue parseFloat( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableDoubleValue.fromKeyframes( + parse(reader, composition, floatParser), + ); + } + + static AnimatableIntegerValue parseInteger( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableIntegerValue.fromKeyframes( + parse(reader, composition, integerParser), + ); + } + + static AnimatablePointValue parsePoint( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatablePointValue.fromKeyframes( + KeyframesParser.parse( + reader, + composition, + offsetParser, + multiDimensional: true, + ), + ); + } + + static AnimatableScaleValue parseScale( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableScaleValue.fromKeyframes( + parse(reader, composition, scaleXYParser), + ); + } + + static AnimatableShapeValue parseShapeData( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableShapeValue.fromKeyframes( + parse(reader, composition, shapeDataParser), + ); + } + + static AnimatableTextFrame parseDocumentData( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableTextFrame.fromKeyframes( + parse(reader, composition, documentDataParser), + ); + } + + static AnimatableColorValue parseColor( + JsonReader reader, + LottieComposition composition, + ) { + return AnimatableColorValue.fromKeyframes( + parse(reader, composition, colorParser), + ); + } + + static AnimatableGradientColorValue parseGradientColor( + JsonReader reader, + LottieComposition composition, + int points, + ) { + return AnimatableGradientColorValue.fromKeyframes( + parse(reader, composition, GradientColorParser(points).parse), + ); + } + + static List> parse( + JsonReader reader, + LottieComposition composition, + ValueParser valueParser, + ) { + return KeyframesParser.parse(reader, composition, valueParser); + } +} diff --git a/lottie/lib/src/parser/blur_effect_parser.dart b/lottie/lib/src/parser/blur_effect_parser.dart new file mode 100644 index 0000000..c3d466e --- /dev/null +++ b/lottie/lib/src/parser/blur_effect_parser.dart @@ -0,0 +1,63 @@ +import '../composition.dart'; +import '../model/content/blur_effect.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class BlurEffectParser { + static final JsonReaderOptions _blurEffectNames = JsonReaderOptions.of([ + 'ef', + ]); + static final JsonReaderOptions _innerBlurEffectNames = JsonReaderOptions.of([ + 'ty', + 'v', + ]); + + static BlurEffect? parse(JsonReader reader, LottieComposition composition) { + BlurEffect? blurEffect; + while (reader.hasNext()) { + switch (reader.selectName(_blurEffectNames)) { + case 0: + reader.beginArray(); + while (reader.hasNext()) { + var be = _maybeParseInnerEffect(reader, composition); + if (be != null) { + blurEffect = be; + } + } + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + return blurEffect; + } + + static BlurEffect? _maybeParseInnerEffect( + JsonReader reader, + LottieComposition composition, + ) { + BlurEffect? blurEffect; + var isCorrectType = false; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_innerBlurEffectNames)) { + case 0: + isCorrectType = reader.nextInt() == 0; + case 1: + if (isCorrectType) { + blurEffect = BlurEffect( + AnimatableValueParser.parseFloat(reader, composition), + ); + } else { + reader.skipValue(); + } + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + return blurEffect; + } +} diff --git a/lottie/lib/src/parser/circle_shape_parser.dart b/lottie/lib/src/parser/circle_shape_parser.dart new file mode 100644 index 0000000..4ba7617 --- /dev/null +++ b/lottie/lib/src/parser/circle_shape_parser.dart @@ -0,0 +1,62 @@ +import 'dart:ui'; +import '../../lottie.dart'; +import '../model/animatable/animatable_point_value.dart'; +import '../model/animatable/animatable_value.dart'; +import '../model/content/circle_shape.dart'; +import 'animatable_path_value_parser.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class CircleShapeParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'p', + 's', + 'hd', + 'd', + ]); + + CircleShapeParser._(); + + static CircleShape parse( + JsonReader reader, + LottieComposition composition, + int d, + ) { + String? name; + late AnimatableValue position; + late AnimatablePointValue size; + var reversed = d == 3; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + position = AnimatablePathValueParser.parseSplitPath( + reader, + composition, + ); + case 2: + size = AnimatableValueParser.parsePoint(reader, composition); + case 3: + hidden = reader.nextBoolean(); + case 4: + // "d" is 2 for normal and 3 for reversed. + reversed = reader.nextInt() == 3; + default: + reader.skipName(); + reader.skipValue(); + } + } + + return CircleShape( + name: name, + position: position, + size: size, + isReversed: reversed, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/color_parser.dart b/lottie/lib/src/parser/color_parser.dart new file mode 100644 index 0000000..5e1391c --- /dev/null +++ b/lottie/lib/src/parser/color_parser.dart @@ -0,0 +1,35 @@ +import 'dart:ui'; +import 'moshi/json_reader.dart'; + +Color colorParser(JsonReader reader) { + var isArray = reader.peek() == Token.beginArray; + if (isArray) { + reader.beginArray(); + } + var r = reader.nextDouble(); + var g = reader.nextDouble(); + var b = reader.nextDouble(); + var a = 1.0; + + // Sometimes, Lottie editors only export rgb instead of rgba. + // https://github.com/airbnb/lottie-android/issues/1601 + if (reader.peek() == Token.number) { + a = reader.nextDouble(); + } + + if (isArray) { + reader.endArray(); + } + + if (r <= 1 && g <= 1 && b <= 1) { + r *= 255; + g *= 255; + b *= 255; + // It appears as if sometimes, Telegram Lottie stickers are exported with rgb [0,1] and a [0,255]. + // This shouldn't happen but we can gracefully handle it when it does. + // https://github.com/airbnb/lottie-android/issues/1478 + if (a <= 1) a *= 255; + } + + return Color.fromARGB(a.round(), r.round(), g.round(), b.round()); +} diff --git a/lottie/lib/src/parser/content_model_parser.dart b/lottie/lib/src/parser/content_model_parser.dart new file mode 100644 index 0000000..c2aa673 --- /dev/null +++ b/lottie/lib/src/parser/content_model_parser.dart @@ -0,0 +1,91 @@ +import '../composition.dart'; +import '../model/content/content_model.dart'; +import 'animatable_transform_parser.dart'; +import 'circle_shape_parser.dart'; +import 'gradient_fill_parser.dart'; +import 'gradient_stroke_parser.dart'; +import 'merge_paths_parser.dart'; +import 'moshi/json_reader.dart'; +import 'polysar_shape_parser.dart'; +import 'rectangle_shape_parser.dart'; +import 'repeat_parser.dart'; +import 'rounded_corners_parser.dart'; +import 'shape_fill_parser.dart'; +import 'shape_group_parser.dart'; +import 'shape_path_parser.dart'; +import 'shape_stroke_parser.dart'; +import 'shape_trim_path_parser.dart'; + +class ContentModelParser { + static final JsonReaderOptions _names = JsonReaderOptions.of(['ty', 'd']); + + ContentModelParser._(); + + static ContentModel? parse(JsonReader reader, LottieComposition composition) { + String? type; + + reader.beginObject(); + // Unfortunately, for an ellipse, d is before "ty" which means that it will get parsed + // before we are in the ellipse parser. + // "d" is 2 for normal and 3 for reversed. + var d = 2; + typeLoop: + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + type = reader.nextString(); + break typeLoop; + case 1: + d = reader.nextInt(); + default: + reader.skipName(); + reader.skipValue(); + } + } + + if (type == null) { + return null; + } + + ContentModel? model; + switch (type) { + case 'gr': + model = ShapeGroupParser.parse(reader, composition); + case 'st': + model = ShapeStrokeParser.parse(reader, composition); + case 'gs': + model = GradientStrokeParser.parse(reader, composition); + case 'fl': + model = ShapeFillParser.parse(reader, composition); + case 'gf': + model = GradientFillParser.parse(reader, composition); + case 'tr': + model = AnimatableTransformParser.parse(reader, composition); + case 'sh': + model = ShapePathParser.parse(reader, composition); + case 'el': + model = CircleShapeParser.parse(reader, composition, d); + case 'rc': + model = RectangleShapeParser.parse(reader, composition); + case 'tm': + model = ShapeTrimPathParser.parse(reader, composition); + case 'sr': + model = PolystarShapeParser.parse(reader, composition, d: d); + case 'mm': + model = MergePathsParser.parse(reader); + case 'rp': + model = RepeaterParser.parse(reader, composition); + case 'rd': + model = RoundedCornersParser.parse(reader, composition); + default: + composition.addWarning('Unknown shape type $type'); + } + + while (reader.hasNext()) { + reader.skipValue(); + } + reader.endObject(); + + return model; + } +} diff --git a/lottie/lib/src/parser/document_data_parser.dart b/lottie/lib/src/parser/document_data_parser.dart new file mode 100644 index 0000000..ad067ec --- /dev/null +++ b/lottie/lib/src/parser/document_data_parser.dart @@ -0,0 +1,98 @@ +import 'dart:ui'; +import '../model/document_data.dart'; +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +final JsonReaderOptions _names = JsonReaderOptions.of([ + 't', // 0 + 'f', // 1 + 's', // 2 + 'j', // 3 + 'tr', // 4 + 'lh', // 5 + 'ls', // 6 + 'fc', // 7 + 'sc', // 8 + 'sw', // 9 + 'of', // 10 + 'ps', // 11 + 'sz', // 12 +]); + +DocumentData documentDataParser(JsonReader reader) { + String? text; + String? fontName; + var size = 0.0; + var justification = Justification.center; + var tracking = 0; + var lineHeight = 0.0; + var baselineShift = 0.0; + var fillColor = const Color(0x00000000); + var strokeColor = const Color(0x00000000); + var strokeWidth = 0.0; + var strokeOverFill = true; + Offset? boxPosition; + Offset? boxSize; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + text = reader.nextString(); + case 1: + fontName = reader.nextString(); + case 2: + size = reader.nextDouble(); + case 3: + var justificationInt = reader.nextInt(); + if (justificationInt > Justification.center.index || + justificationInt < 0) { + justification = Justification.center; + } else { + justification = Justification.values[justificationInt]; + } + case 4: + tracking = reader.nextInt(); + case 5: + lineHeight = reader.nextDouble(); + case 6: + baselineShift = reader.nextDouble(); + case 7: + fillColor = JsonUtils.jsonToColor(reader); + case 8: + strokeColor = JsonUtils.jsonToColor(reader); + case 9: + strokeWidth = reader.nextDouble(); + case 10: + strokeOverFill = reader.nextBoolean(); + case 11: + reader.beginArray(); + boxPosition = Offset(reader.nextDouble(), reader.nextDouble()); + reader.endArray(); + case 12: + reader.beginArray(); + boxSize = Offset(reader.nextDouble(), reader.nextDouble()); + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + return DocumentData( + text: text ?? '', + fontName: fontName, + size: size, + justification: justification, + tracking: tracking, + lineHeight: lineHeight, + baselineShift: baselineShift, + color: fillColor, + strokeColor: strokeColor, + strokeWidth: strokeWidth, + strokeOverFill: strokeOverFill, + boxPosition: boxPosition, + boxSize: boxSize, + ); +} diff --git a/lottie/lib/src/parser/drop_shadow_effect_parser.dart b/lottie/lib/src/parser/drop_shadow_effect_parser.dart new file mode 100644 index 0000000..b756079 --- /dev/null +++ b/lottie/lib/src/parser/drop_shadow_effect_parser.dart @@ -0,0 +1,95 @@ +import '../composition.dart'; +import '../model/animatable/animatable_color_value.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/content/drop_shadow_effect.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class DropShadowEffectParser { + static final JsonReaderOptions _dropShadowEffectNames = JsonReaderOptions.of([ + 'ef', + ]); + + static final JsonReaderOptions _innerEffectNames = JsonReaderOptions.of([ + 'nm', + 'v', + ]); + + AnimatableColorValue? _color; + AnimatableDoubleValue? _opacity; + AnimatableDoubleValue? _direction; + AnimatableDoubleValue? _distance; + AnimatableDoubleValue? _radius; + + DropShadowEffect? parse(JsonReader reader, LottieComposition composition) { + while (reader.hasNext()) { + switch (reader.selectName(_dropShadowEffectNames)) { + case 0: + reader.beginArray(); + while (reader.hasNext()) { + _maybeParseInnerEffect(reader, composition); + } + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + + var color = _color; + var opacity = _opacity; + var direction = _direction; + var distance = _distance; + var radius = _radius; + if (color != null && + opacity != null && + direction != null && + distance != null && + radius != null) { + return DropShadowEffect( + color: color, + opacity: opacity, + direction: direction, + distance: distance, + radius: radius, + ); + } + return null; + } + + void _maybeParseInnerEffect( + JsonReader reader, + LottieComposition composition, + ) { + var currentEffectName = ''; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_innerEffectNames)) { + case 0: + currentEffectName = reader.nextString(); + case 1: + switch (currentEffectName) { + case 'Shadow Color': + _color = AnimatableValueParser.parseColor(reader, composition); + case 'Opacity': + _opacity = AnimatableValueParser.parseFloat(reader, composition); + case 'Direction': + _direction = AnimatableValueParser.parseFloat( + reader, + composition, + ); + case 'Distance': + _distance = AnimatableValueParser.parseFloat(reader, composition); + case 'Softness': + _radius = AnimatableValueParser.parseFloat(reader, composition); + default: + reader.skipValue(); + } + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + } +} diff --git a/lottie/lib/src/parser/float_parser.dart b/lottie/lib/src/parser/float_parser.dart new file mode 100644 index 0000000..c80ecc6 --- /dev/null +++ b/lottie/lib/src/parser/float_parser.dart @@ -0,0 +1,6 @@ +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +double floatParser(JsonReader reader) { + return JsonUtils.valueFromObject(reader); +} diff --git a/lottie/lib/src/parser/font_character_parser.dart b/lottie/lib/src/parser/font_character_parser.dart new file mode 100644 index 0000000..7d55c74 --- /dev/null +++ b/lottie/lib/src/parser/font_character_parser.dart @@ -0,0 +1,76 @@ +import '../composition.dart'; +import '../model/content/shape_group.dart'; +import '../model/font_character.dart'; +import 'content_model_parser.dart'; +import 'moshi/json_reader.dart'; + +class FontCharacterParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'ch', + 'size', + 'w', + 'style', + 'fFamily', + 'data', + ]); + static final JsonReaderOptions _dataNames = JsonReaderOptions.of(['shapes']); + + FontCharacterParser._(); + + static FontCharacter parse(JsonReader reader, LottieComposition composition) { + String? character = ''; + var size = 0.0; + var width = 0.0; + String? style; + String? fontFamily; + var shapes = []; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + character = reader.nextString(); + case 1: + size = reader.nextDouble(); + case 2: + width = reader.nextDouble(); + case 3: + style = reader.nextString(); + case 4: + fontFamily = reader.nextString(); + case 5: + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_dataNames)) { + case 0: + reader.beginArray(); + while (reader.hasNext()) { + if (ContentModelParser.parse(reader, composition) + case var shape?) { + shapes.add(shape as ShapeGroup); + } + } + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + return FontCharacter( + shapes: shapes, + character: character!, + size: size, + width: width, + style: style ?? '', + fontFamily: fontFamily ?? '', + ); + } +} diff --git a/lottie/lib/src/parser/font_parser.dart b/lottie/lib/src/parser/font_parser.dart new file mode 100644 index 0000000..1a32c83 --- /dev/null +++ b/lottie/lib/src/parser/font_parser.dart @@ -0,0 +1,45 @@ +import '../model/font.dart'; +import 'moshi/json_reader.dart'; + +class FontParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'fFamily', + 'fName', + 'fStyle', + 'ascent', + ]); + + FontParser._(); + + static Font parse(JsonReader reader) { + String? family; + String? name; + String? style; + var ascent = 0.0; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + family = reader.nextString(); + case 1: + name = reader.nextString(); + case 2: + style = reader.nextString(); + case 3: + ascent = reader.nextDouble(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + return Font( + family: family ?? '', + name: name ?? '', + style: style ?? '', + ascent: ascent, + ); + } +} diff --git a/lottie/lib/src/parser/gradient_color_parser.dart b/lottie/lib/src/parser/gradient_color_parser.dart new file mode 100644 index 0000000..397c442 --- /dev/null +++ b/lottie/lib/src/parser/gradient_color_parser.dart @@ -0,0 +1,275 @@ +import 'dart:ui'; +import '../model/content/gradient_color.dart'; +import '../utils/collection.dart'; +import '../utils/gamma_evaluator.dart'; +import 'moshi/json_reader.dart'; + +class GradientColorParser { + /// The number of colors if it exists in the json or -1 if it doesn't (legacy bodymovin) + int _colorPoints; + + GradientColorParser(this._colorPoints); + + /// Both the color stops and opacity stops are in the same array. + /// There are {@link #colorPoints} colors sequentially as: + /// [ + /// ..., + /// position, + /// red, + /// green, + /// blue, + /// ... + /// ] + ///

+ /// The remainder of the array is the opacity stops sequentially as: + /// [ + /// ..., + /// position, + /// opacity, + /// ... + /// ] + GradientColor parse(JsonReader reader) { + var array = []; + // The array was started by Keyframe because it thought that this may be an array of keyframes + // but peek returned a number so it considered it a static array of numbers. + var isArray = reader.peek() == Token.beginArray; + if (isArray) { + reader.beginArray(); + } + while (reader.hasNext()) { + array.add(reader.nextDouble()); + } + if (array.length == 4 && array[0] == 1) { + // If a gradient color only contains one color at position 1, add a second stop with the same + // color at position 0. Android's LinearGradient shader requires at least two colors. + // https://github.com/airbnb/lottie-android/issues/1967 + array[0] = 0; + array.add(1); + array.add(array[1]); + array.add(array[2]); + array.add(array[3]); + _colorPoints = 2; + } + if (isArray) { + reader.endArray(); + } + if (_colorPoints == -1) { + _colorPoints = array.length ~/ 4; + } + + var positions = List.filled(_colorPoints, 0.0); + var colors = List.filled(_colorPoints, const Color(0x00000000)); + + var r = 0; + var g = 0; + for (var i = 0; i < _colorPoints * 4; i++) { + var colorIndex = i ~/ 4; + var value = array[i]; + switch (i % 4) { + case 0: + // position + positions[colorIndex] = value; + case 1: + r = (value * 255).round(); + case 2: + g = (value * 255).round(); + case 3: + var b = (value * 255).round(); + colors[colorIndex] = Color.fromARGB(255, r, g, b); + } + } + + var gradientColor = GradientColor(positions, colors); + gradientColor = _addOpacityStopsToGradientIfNeeded(gradientColor, array); + return gradientColor; + } + + /// This cheats a little bit. + /// Opacity stops can be at arbitrary intervals independent of color stops. + /// This uses the existing color stops and modifies the opacity at each existing color stop + /// based on what the opacity would be. + ///

+ /// This should be a good approximation is nearly all cases. However, if there are many more + /// opacity stops than color stops, information will be lost. + GradientColor _addOpacityStopsToGradientIfNeeded( + GradientColor gradientColor, + List array, + ) { + var startIndex = _colorPoints * 4; + if (array.length <= startIndex) { + return gradientColor; + } + + // When there are opacity stops, we create a merged list of color stops and opacity stops. + // For a given color stop, we linearly interpolate the opacity for the two opacity stops around it. + // For a given opacity stop, we linearly interpolate the color for the two color stops around it. + var colorStopPositions = gradientColor.positions; + var colorStopColors = gradientColor.colors; + + var opacityStops = (array.length - startIndex) ~/ 2; + var opacityStopPositions = List.filled(opacityStops, 0.0); + var opacityStopOpacities = List.filled(opacityStops, 0.0); + + for (var i = startIndex, j = 0; i < array.length; i++) { + if (i % 2 == 0) { + opacityStopPositions[j] = array[i]; + } else { + opacityStopOpacities[j] = array[i]; + j++; + } + } + + // Pre-SKIA (Oreo) devices render artifacts when there is two stops in the same position. + // As a result, we have to de-dupe the merge color and opacity stop positions. + var newPositions = mergeUniqueElements( + gradientColor.positions, + opacityStopPositions, + ); + var newColorPoints = newPositions.length; + var newColors = List.filled(newColorPoints, const Color(0xff000000)); + + for (var i = 0; i < newColorPoints; i++) { + var position = newPositions[i]; + var colorStopIndex = binarySearch(colorStopPositions, position); + var opacityIndex = binarySearch(opacityStopPositions, position); + if (colorStopIndex < 0 || opacityIndex > 0) { + // This is a stop derived from an opacity stop. + if (opacityIndex < 0) { + // The formula here is derived from the return value for binarySearch. When an item isn't found, it returns -insertionPoint - 1. + opacityIndex = -(opacityIndex + 1); + } + newColors[i] = _getColorInBetweenColorStops( + position, + opacityStopOpacities[opacityIndex], + colorStopPositions, + colorStopColors, + ); + } else { + // This os a step derived from a color stop. + newColors[i] = _getColorInBetweenOpacityStops( + position, + colorStopColors[colorStopIndex], + opacityStopPositions, + opacityStopOpacities, + ); + } + } + return GradientColor(newPositions, newColors); + } + + Color _getColorInBetweenColorStops( + double position, + double opacity, + List colorStopPositions, + List colorStopColors, + ) { + if (colorStopColors.length < 2 || position == colorStopPositions[0]) { + return colorStopColors[0]; + } + for (var i = 1; i < colorStopPositions.length; i++) { + var colorStopPosition = colorStopPositions[i]; + if (colorStopPosition < position && i != colorStopPositions.length - 1) { + continue; + } + if (i == colorStopPositions.length - 1 && position >= colorStopPosition) { + return colorStopColors[i].withValues(alpha: opacity); + } + // We found the position in which position is between i - 1 and i. + var distanceBetweenColors = + colorStopPositions[i] - colorStopPositions[i - 1]; + var distanceToLowerColor = position - colorStopPositions[i - 1]; + var percentage = distanceToLowerColor / distanceBetweenColors; + var upperColor = colorStopColors[i]; + var lowerColor = colorStopColors[i - 1]; + return GammaEvaluator.evaluate( + percentage, + lowerColor.withValues(alpha: 1), + upperColor.withValues(alpha: 1), + ).withValues(alpha: opacity); + } + throw Exception('Unreachable code.'); + } + + Color _getColorInBetweenOpacityStops( + double position, + Color color, + List opacityStopPositions, + List opacityStopOpacities, + ) { + if (opacityStopOpacities.length < 2 || + position <= opacityStopPositions[0]) { + return color.withValues(alpha: opacityStopOpacities[0]); + } + for (var i = 1; i < opacityStopPositions.length; i++) { + var opacityStopPosition = opacityStopPositions[i]; + if (opacityStopPosition < position && + i != opacityStopPositions.length - 1) { + continue; + } + final double opacity; + if (opacityStopPosition <= position) { + opacity = opacityStopOpacities[i]; + } else { + // We found the position in which position in between i - 1 and i. + var distanceBetweenOpacities = + opacityStopPositions[i] - opacityStopPositions[i - 1]; + var distanceToLowerOpacity = position - opacityStopPositions[i - 1]; + var percentage = distanceToLowerOpacity / distanceBetweenOpacities; + opacity = lerpDouble( + opacityStopOpacities[i - 1], + opacityStopOpacities[i], + percentage, + )!; + } + return color.withValues(alpha: opacity); + } + throw Exception('Unreachable code.'); + } + + /// Takes two sorted float arrays and merges their elements while removing duplicates. + static List mergeUniqueElements( + List arrayA, + List arrayB, + ) { + if (arrayA.isEmpty) { + return arrayB; + } else if (arrayB.isEmpty) { + return arrayA; + } + + var aIndex = 0; + var bIndex = 0; + var numDuplicates = 0; + // This will be the merged list but may be longer than what is needed if there are duplicates. + // If there are, the 0 elements at the end need to be truncated. + var mergedNotTruncated = List.filled( + arrayA.length + arrayB.length, + 0, + ); + for (var i = 0; i < mergedNotTruncated.length; i++) { + final a = aIndex < arrayA.length ? arrayA[aIndex] : double.nan; + final b = bIndex < arrayB.length ? arrayB[bIndex] : double.nan; + + if (b.isNaN || a < b) { + mergedNotTruncated[i] = a; + aIndex++; + } else if (a.isNaN || b < a) { + mergedNotTruncated[i] = b; + bIndex++; + } else { + mergedNotTruncated[i] = a; + aIndex++; + bIndex++; + numDuplicates++; + } + } + + if (numDuplicates == 0) { + return mergedNotTruncated; + } + + return mergedNotTruncated + .take(mergedNotTruncated.length - numDuplicates) + .toList(); + } +} diff --git a/lottie/lib/src/parser/gradient_fill_parser.dart b/lottie/lib/src/parser/gradient_fill_parser.dart new file mode 100644 index 0000000..85a2ff3 --- /dev/null +++ b/lottie/lib/src/parser/gradient_fill_parser.dart @@ -0,0 +1,101 @@ +import 'dart:ui'; +import '../../lottie.dart'; +import '../model/animatable/animatable_gradient_color_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/animatable/animatable_point_value.dart'; +import '../model/content/gradient_fill.dart'; +import '../model/content/gradient_type.dart'; +import '../value/keyframe.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class GradientFillParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'g', + 'o', + 't', + 's', + 'e', + 'r', + 'hd', + ]); + static final JsonReaderOptions _gradientNames = JsonReaderOptions.of([ + 'p', + 'k', + ]); + + GradientFillParser._(); + + static GradientFill parse(JsonReader reader, LottieComposition composition) { + String? name; + AnimatableGradientColorValue? color; + AnimatableIntegerValue? opacity; + GradientType? gradientType; + AnimatablePointValue? startPoint; + AnimatablePointValue? endPoint; + var fillType = PathFillType.nonZero; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + var points = -1; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_gradientNames)) { + case 0: + points = reader.nextInt(); + case 1: + color = AnimatableValueParser.parseGradientColor( + reader, + composition, + points, + ); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + case 2: + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 3: + gradientType = reader.nextInt() == 1 + ? GradientType.linear + : GradientType.radial; + case 4: + startPoint = AnimatableValueParser.parsePoint(reader, composition); + case 5: + endPoint = AnimatableValueParser.parsePoint(reader, composition); + case 6: + fillType = reader.nextInt() == 1 + ? PathFillType.nonZero + : PathFillType.evenOdd; + case 7: + hidden = reader.nextBoolean(); + default: + reader.skipName(); + reader.skipValue(); + } + } + + // Telegram sometimes omits opacity. + // https://github.com/airbnb/lottie-android/issues/1600 + opacity ??= AnimatableIntegerValue.fromKeyframes([ + Keyframe.nonAnimated(100), + ]); + return GradientFill( + name: name, + gradientType: gradientType ?? GradientType.linear, + fillType: fillType, + gradientColor: color!, + opacity: opacity, + startPoint: startPoint!, + endPoint: endPoint!, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/gradient_stroke_parser.dart b/lottie/lib/src/parser/gradient_stroke_parser.dart new file mode 100644 index 0000000..4298467 --- /dev/null +++ b/lottie/lib/src/parser/gradient_stroke_parser.dart @@ -0,0 +1,158 @@ +import '../../lottie.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_gradient_color_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/animatable/animatable_point_value.dart'; +import '../model/content/gradient_stroke.dart'; +import '../model/content/gradient_type.dart'; +import '../model/content/shape_stroke.dart'; +import '../value/keyframe.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class GradientStrokeParser { + GradientStrokeParser._(); + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'g', + 'o', + 't', + 's', + 'e', + 'w', + 'lc', + 'lj', + 'ml', + 'hd', + 'd', + ]); + static final JsonReaderOptions _gradientNames = JsonReaderOptions.of([ + 'p', + 'k', + ]); + static final JsonReaderOptions _dashPatternNames = JsonReaderOptions.of([ + 'n', + 'v', + ]); + + static GradientStroke parse( + JsonReader reader, + LottieComposition composition, + ) { + String? name; + AnimatableGradientColorValue? color; + AnimatableIntegerValue? opacity; + GradientType? gradientType; + AnimatablePointValue? startPoint; + AnimatablePointValue? endPoint; + AnimatableDoubleValue? width; + LineCapType? capType; + LineJoinType? joinType; + AnimatableDoubleValue? offset; + var miterLimit = 0.0; + var hidden = false; + + var lineDashPattern = []; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + var points = -1; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_gradientNames)) { + case 0: + points = reader.nextInt(); + case 1: + color = AnimatableValueParser.parseGradientColor( + reader, + composition, + points, + ); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + case 2: + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 3: + gradientType = reader.nextInt() == 1 + ? GradientType.linear + : GradientType.radial; + case 4: + startPoint = AnimatableValueParser.parsePoint(reader, composition); + case 5: + endPoint = AnimatableValueParser.parsePoint(reader, composition); + case 6: + width = AnimatableValueParser.parseFloat(reader, composition); + case 7: + capType = LineCapType.values[reader.nextInt() - 1]; + case 8: + joinType = LineJoinType.values[reader.nextInt() - 1]; + case 9: + miterLimit = reader.nextDouble(); + case 10: + hidden = reader.nextBoolean(); + case 11: + reader.beginArray(); + while (reader.hasNext()) { + String? n; + AnimatableDoubleValue? val; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_dashPatternNames)) { + case 0: + n = reader.nextString(); + case 1: + val = AnimatableValueParser.parseFloat(reader, composition); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + if (n == 'o') { + offset = val; + } else if (n == 'd' || n == 'g') { + composition.hasDashPattern = true; + lineDashPattern.add(val!); + } + } + reader.endArray(); + if (lineDashPattern.length == 1) { + // If there is only 1 value then it is assumed to be equal parts on and off. + lineDashPattern.add(lineDashPattern[0]); + } + default: + reader.skipName(); + reader.skipValue(); + } + } + + // Telegram sometimes omits opacity. + // https://github.com/airbnb/lottie-android/issues/1600 + opacity ??= AnimatableIntegerValue.fromKeyframes([ + Keyframe.nonAnimated(100), + ]); + return GradientStroke( + name: name, + gradientType: gradientType ?? GradientType.linear, + gradientColor: color!, + opacity: opacity, + startPoint: startPoint!, + endPoint: endPoint!, + width: width!, + capType: capType, + joinType: joinType, + miterLimit: miterLimit, + lineDashPattern: lineDashPattern, + dashOffset: offset, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/integer_parser.dart b/lottie/lib/src/parser/integer_parser.dart new file mode 100644 index 0000000..53d8731 --- /dev/null +++ b/lottie/lib/src/parser/integer_parser.dart @@ -0,0 +1,6 @@ +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +int integerParser(JsonReader reader) { + return JsonUtils.valueFromObject(reader).round(); +} diff --git a/lottie/lib/src/parser/json_utils.dart b/lottie/lib/src/parser/json_utils.dart new file mode 100644 index 0000000..cad22db --- /dev/null +++ b/lottie/lib/src/parser/json_utils.dart @@ -0,0 +1,117 @@ +import 'dart:ui'; +import 'moshi/json_reader.dart'; + +class JsonUtils { + static Color jsonToColor(JsonReader reader) { + reader.beginArray(); + var r = (reader.nextDouble() * 255).round(); + var g = (reader.nextDouble() * 255).round(); + var b = (reader.nextDouble() * 255).round(); + while (reader.hasNext()) { + reader.skipValue(); + } + reader.endArray(); + return Color.fromARGB(255, r, g, b); + } + + static List jsonToPoints(JsonReader reader) { + var points = []; + + reader.beginArray(); + while (reader.peek() == Token.beginArray) { + reader.beginArray(); + points.add(jsonToPoint(reader)); + reader.endArray(); + } + reader.endArray(); + return points; + } + + static Offset jsonToPoint(JsonReader reader) { + switch (reader.peek()) { + case Token.number: + return _jsonNumbersToPoint(reader); + case Token.beginArray: + return _jsonArrayToPoint(reader); + case Token.beginObject: + return _jsonObjectToPoint(reader); + case Token.nullToken: + return Offset.zero; + case Token.endArray: + case Token.endObject: + case Token.name: + case Token.string: + case Token.boolean: + case Token.endDocument: + throw Exception('Unknown point starts with ${reader.peek()}'); + } + } + + static Offset _jsonNumbersToPoint(JsonReader reader) { + var x = reader.nextDouble(); + var y = reader.nextDouble(); + while (reader.hasNext()) { + reader.skipValue(); + } + return Offset(x, y); + } + + static Offset _jsonArrayToPoint(JsonReader reader) { + double x; + double y; + reader.beginArray(); + x = reader.nextDouble(); + y = reader.nextDouble(); + while (reader.peek() != Token.endArray) { + reader.skipValue(); + } + reader.endArray(); + return Offset(x, y); + } + + static final JsonReaderOptions _pointNames = JsonReaderOptions.of(['x', 'y']); + + static Offset _jsonObjectToPoint(JsonReader reader) { + var x = 0.0; + var y = 0.0; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_pointNames)) { + case 0: + x = valueFromObject(reader); + case 1: + y = valueFromObject(reader); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + return Offset(x, y); + } + + static double valueFromObject(JsonReader reader) { + var token = reader.peek(); + switch (token) { + case Token.number: + return reader.nextDouble(); + case Token.beginArray: + reader.beginArray(); + var val = reader.nextDouble(); + while (reader.hasNext()) { + reader.skipValue(); + } + reader.endArray(); + return val; + case Token.endArray: + case Token.beginObject: + case Token.endObject: + case Token.name: + case Token.string: + case Token.boolean: + case Token.nullToken: + case Token.endDocument: + throw Exception('Unknown value for token of type $token'); + } + } +} diff --git a/lottie/lib/src/parser/keyframe_parser.dart b/lottie/lib/src/parser/keyframe_parser.dart new file mode 100644 index 0000000..c1d7cb7 --- /dev/null +++ b/lottie/lib/src/parser/keyframe_parser.dart @@ -0,0 +1,334 @@ +import 'dart:math'; +import 'package:flutter/widgets.dart'; +import '../composition.dart'; +import '../utils/path_interpolator.dart'; +import '../utils/utils.dart'; +import '../value/keyframe.dart'; +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; +import 'value_parser.dart'; + +class KeyframeParser { + /// Some animations get exported with insane cp values in the tens of thousands. + /// PathInterpolator fails to create the interpolator in those cases and hangs. + /// Clamping the cp helps prevent that. + static const _maxCpValue = 100.0; + static const _linearInterpolator = Curves.linear; + static final _pathInterpolatorCache = {}; + + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 't', + 's', + 'e', + 'o', + 'i', + 'h', + 'to', + 'ti', + ]); + + static final JsonReaderOptions _interpolatorNames = JsonReaderOptions.of([ + 'x', // 1 + 'y', // 2 + ]); + + /// @param multiDimensional When true, the keyframe interpolators can be independent for the X and Y axis. + static Keyframe parse( + JsonReader reader, + LottieComposition composition, + ValueParser valueParser, { + required bool animated, + bool multiDimensional = false, + }) { + if (animated && multiDimensional) { + return _parseMultiDimensionalKeyframe(composition, reader, valueParser); + } else if (animated) { + return _parseKeyframe(composition, reader, valueParser); + } else { + return _parseStaticValue(reader, valueParser); + } + } + + /// beginObject will already be called on the keyframe so it can be differentiated with + /// a non animated value. + static Keyframe _parseKeyframe( + LottieComposition composition, + JsonReader reader, + ValueParser valueParser, + ) { + Offset? cp1; + Offset? cp2; + var startFrame = 0.0; + T? startValue; + T? endValue; + var hold = false; + Curve interpolator; + + // Only used by PathKeyframe + Offset? pathCp1; + Offset? pathCp2; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + startFrame = reader.nextDouble(); + case 1: + startValue = valueParser(reader); + case 2: + endValue = valueParser(reader); + case 3: + cp1 = JsonUtils.jsonToPoint(reader); + case 4: + cp2 = JsonUtils.jsonToPoint(reader); + case 5: + hold = reader.nextInt() == 1; + case 6: + pathCp1 = JsonUtils.jsonToPoint(reader); + case 7: + pathCp2 = JsonUtils.jsonToPoint(reader); + default: + reader.skipValue(); + } + } + reader.endObject(); + + if (hold) { + endValue = startValue; + // TODO: create a HoldInterpolator so progress changes don't invalidate. + interpolator = _linearInterpolator; + } else if (cp1 != null && cp2 != null) { + interpolator = _interpolatorFor(cp1, cp2); + } else { + interpolator = _linearInterpolator; + } + + var keyframe = Keyframe( + composition, + startValue: startValue, + endValue: endValue, + interpolator: interpolator, + startFrame: startFrame, + ); + keyframe.pathCp1 = pathCp1; + keyframe.pathCp2 = pathCp2; + return keyframe; + } + + static Keyframe _parseMultiDimensionalKeyframe( + LottieComposition composition, + JsonReader reader, + ValueParser valueParser, + ) { + Offset? cp1; + Offset? cp2; + + Offset? xCp1; + Offset? xCp2; + Offset? yCp1; + Offset? yCp2; + + var startFrame = 0.0; + T? startValue; + T? endValue; + var hold = false; + Curve? interpolator; + Curve? xInterpolator; + Curve? yInterpolator; + + // Only used by PathKeyframe + Offset? pathCp1; + Offset? pathCp2; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: // t + startFrame = reader.nextDouble(); + case 1: // s + startValue = valueParser(reader); + case 2: // e + endValue = valueParser(reader); + case 3: // o + if (reader.peek() == Token.beginObject) { + reader.beginObject(); + var xCp1x = 0.0; + var xCp1y = 0.0; + var yCp1x = 0.0; + var yCp1y = 0.0; + while (reader.hasNext()) { + switch (reader.selectName(_interpolatorNames)) { + case 0: // x + if (reader.peek() == Token.number) { + xCp1x = reader.nextDouble(); + yCp1x = xCp1x; + } else { + reader.beginArray(); + xCp1x = reader.nextDouble(); + if (reader.peek() == Token.number) { + yCp1x = reader.nextDouble(); + } else { + yCp1x = xCp1x; + } + reader.endArray(); + } + case 1: // y + if (reader.peek() == Token.number) { + xCp1y = reader.nextDouble(); + yCp1y = xCp1y; + } else { + reader.beginArray(); + xCp1y = reader.nextDouble(); + if (reader.peek() == Token.number) { + yCp1y = reader.nextDouble(); + } else { + yCp1y = xCp1y; + } + reader.endArray(); + } + default: + reader.skipValue(); + } + } + xCp1 = Offset(xCp1x, xCp1y); + yCp1 = Offset(yCp1x, yCp1y); + reader.endObject(); + } else { + cp1 = JsonUtils.jsonToPoint(reader); + } + case 4: // i + if (reader.peek() == Token.beginObject) { + reader.beginObject(); + var xCp2x = 0.0; + var xCp2y = 0.0; + var yCp2x = 0.0; + var yCp2y = 0.0; + while (reader.hasNext()) { + switch (reader.selectName(_interpolatorNames)) { + case 0: // x + if (reader.peek() == Token.number) { + xCp2x = reader.nextDouble(); + yCp2x = xCp2x; + } else { + reader.beginArray(); + xCp2x = reader.nextDouble(); + if (reader.peek() == Token.number) { + yCp2x = reader.nextDouble(); + } else { + yCp2x = xCp2x; + } + reader.endArray(); + } + case 1: // y + if (reader.peek() == Token.number) { + xCp2y = reader.nextDouble(); + yCp2y = xCp2y; + } else { + reader.beginArray(); + xCp2y = reader.nextDouble(); + if (reader.peek() == Token.number) { + yCp2y = reader.nextDouble(); + } else { + yCp2y = xCp2y; + } + reader.endArray(); + } + default: + reader.skipValue(); + } + } + xCp2 = Offset(xCp2x, xCp2y); + yCp2 = Offset(yCp2x, yCp2y); + reader.endObject(); + } else { + cp2 = JsonUtils.jsonToPoint(reader); + } + case 5: // h + hold = reader.nextInt() == 1; + case 6: // to + pathCp1 = JsonUtils.jsonToPoint(reader); + case 7: // ti + pathCp2 = JsonUtils.jsonToPoint(reader); + default: + reader.skipValue(); + } + } + reader.endObject(); + + if (hold) { + endValue = startValue; + // TODO: create a HoldInterpolator so progress changes don't invalidate. + interpolator = _linearInterpolator; + } else if (cp1 != null && cp2 != null) { + interpolator = _interpolatorFor(cp1, cp2); + } else if (xCp1 != null && yCp1 != null && xCp2 != null && yCp2 != null) { + xInterpolator = _interpolatorFor(xCp1, xCp2); + yInterpolator = _interpolatorFor(yCp1, yCp2); + } else { + interpolator = _linearInterpolator; + } + + Keyframe keyframe; + if (xInterpolator != null && yInterpolator != null) { + keyframe = Keyframe( + composition, + startValue: startValue, + endValue: endValue, + xInterpolator: xInterpolator, + yInterpolator: yInterpolator, + startFrame: startFrame, + ); + } else { + keyframe = Keyframe( + composition, + startValue: startValue, + endValue: endValue, + interpolator: interpolator, + startFrame: startFrame, + ); + } + + keyframe.pathCp1 = pathCp1; + keyframe.pathCp2 = pathCp2; + return keyframe; + } + + static Curve _interpolatorFor(Offset cp1, Offset cp2) { + Curve interpolator; + cp1 = Offset(cp1.dx.clamp(-1, 1), cp1.dy.clamp(-_maxCpValue, _maxCpValue)); + cp2 = Offset(cp2.dx.clamp(-1, 1), cp2.dy.clamp(-_maxCpValue, _maxCpValue)); + var hash = Utils.hashFor(cp1.dx, cp1.dy, cp2.dx, cp2.dy); + + interpolator = _pathInterpolatorCache.putIfAbsent(hash, () { + try { + return PathInterpolator.cubic(cp1.dx, cp1.dy, cp2.dx, cp2.dy); + } catch (e) { + debugPrint('DEBUG: Path interpolator error $e'); + //TODO(xha): check the error message for Flutter + if ('$e'.contains('The Path cannot loop back on itself.')) { + // If a control point extends beyond the previous/next point then it will cause the value of the interpolator to no + // longer monotonously increase. This clips the control point bounds to prevent that from happening. + // NOTE: this will make the rendered animation behave slightly differently than the original. + return PathInterpolator.cubic( + min(cp1.dx, 1.0), + cp1.dy, + max(cp2.dx, 0.0), + cp2.dy, + ); + } else { + // We failed to create the interpolator. Fall back to linear. + return Curves.linear; + } + } + }); + return interpolator; + } + + static Keyframe _parseStaticValue( + JsonReader reader, + ValueParser valueParser, + ) { + var value = valueParser(reader); + return Keyframe.nonAnimated(value); + } +} diff --git a/lottie/lib/src/parser/keyframes_parser.dart b/lottie/lib/src/parser/keyframes_parser.dart new file mode 100644 index 0000000..07bd563 --- /dev/null +++ b/lottie/lib/src/parser/keyframes_parser.dart @@ -0,0 +1,99 @@ +import '../composition.dart'; +import '../value/keyframe.dart'; +import 'keyframe_parser.dart'; +import 'moshi/json_reader.dart'; +import 'value_parser.dart'; + +class KeyframesParser { + static final JsonReaderOptions _names = JsonReaderOptions.of(['k']); + + KeyframesParser._(); + + static List> parse( + JsonReader reader, + LottieComposition composition, + ValueParser valueParser, { + bool multiDimensional = false, + }) { + var keyframes = >[]; + + if (reader.peek() == Token.string) { + composition.addWarning("Lottie doesn't support expressions."); + return keyframes; + } + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + if (reader.peek() == Token.beginArray) { + reader.beginArray(); + + if (reader.peek() == Token.number) { + // For properties in which the static value is an array of numbers. + keyframes.add( + KeyframeParser.parse( + reader, + composition, + valueParser, + animated: false, + multiDimensional: multiDimensional, + ), + ); + } else { + while (reader.hasNext()) { + keyframes.add( + KeyframeParser.parse( + reader, + composition, + valueParser, + animated: true, + multiDimensional: multiDimensional, + ), + ); + } + } + reader.endArray(); + } else { + keyframes.add( + KeyframeParser.parse( + reader, + composition, + valueParser, + animated: false, + multiDimensional: multiDimensional, + ), + ); + } + default: + reader.skipValue(); + } + } + reader.endObject(); + + setEndFrames(keyframes); + return keyframes; + } + + /// The json doesn't include end frames. The data can be taken from the start frame of the next + /// keyframe though. + static void setEndFrames(List> keyframes) { + var size = keyframes.length; + for (var i = 0; i < size - 1; i++) { + // In the json, the keyframes only contain their starting frame. + var keyframe = keyframes[i]; + var nextKeyframe = keyframes[i + 1]; + keyframe.endFrame = nextKeyframe.startFrame; + if (keyframe.endValue == null && nextKeyframe.startValue != null) { + keyframe.endValue = nextKeyframe.startValue; + } + } + var lastKeyframe = keyframes[size - 1]; + if ((lastKeyframe.startValue == null || lastKeyframe.endValue == null) && + keyframes.length > 1) { + // The only purpose the last keyframe has is to provide the end frame of the previous + // keyframe. + keyframes.remove(lastKeyframe); + } + } +} diff --git a/lottie/lib/src/parser/layer_parser.dart b/lottie/lib/src/parser/layer_parser.dart new file mode 100644 index 0000000..c7bd41f --- /dev/null +++ b/lottie/lib/src/parser/layer_parser.dart @@ -0,0 +1,341 @@ +import 'dart:ui'; +import '../composition.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_text_frame.dart'; +import '../model/animatable/animatable_text_properties.dart'; +import '../model/animatable/animatable_transform.dart'; +import '../model/content/blur_effect.dart'; +import '../model/content/content_model.dart'; +import '../model/content/drop_shadow_effect.dart'; +import '../model/content/layer_blend.dart'; +import '../model/content/mask.dart'; +import '../model/layer/layer.dart'; +import '../utils/misc.dart'; +import '../value/keyframe.dart'; +import 'animatable_text_properties_parser.dart'; +import 'animatable_transform_parser.dart'; +import 'animatable_value_parser.dart'; +import 'blur_effect_parser.dart'; +import 'content_model_parser.dart'; +import 'drop_shadow_effect_parser.dart'; +import 'mask_parser.dart'; +import 'moshi/json_reader.dart'; + +class LayerParser { + LayerParser._(); + + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', // 0 + 'ind', // 1 + 'refId', // 2 + 'ty', // 3 + 'parent', // 4 + 'sw', // 5 + 'sh', // 6 + 'sc', // 7 + 'ks', // 8 + 'tt', // 9 + 'masksProperties', // 10 + 'shapes', // 11 + 't', // 12 + 'ef', // 13 + 'sr', // 14 + 'st', // 15 + 'w', // 16 + 'h', // 17 + 'ip', // 18 + 'op', // 19 + 'tm', // 20 + 'cl', // 21 + 'hd', // 22 + 'ao', // 23 + 'bm', // 24 + ]); + + static Layer parse(LottieComposition composition) { + var bounds = composition.bounds; + return Layer( + shapes: [], + composition: composition, + name: '__container', + id: -1, + layerType: LayerType.preComp, + parentId: -1, + masks: [], + transform: AnimatableTransform(), + solidWidth: 0, + solidHeight: 0, + solidColor: const Color(0x00000000), + timeStretch: 0, + startFrame: 0, + preCompWidth: bounds.width, + preCompHeight: bounds.height, + inOutKeyframes: >[], + matteType: MatteType.none, + isHidden: false, + ); + } + + static final JsonReaderOptions _textNames = JsonReaderOptions.of(['d', 'a']); + + static final JsonReaderOptions _effectsNames = JsonReaderOptions.of([ + 'ty', + 'nm', + ]); + + static Layer parseJson(JsonReader reader, LottieComposition composition) { + // This should always be set by After Effects. However, if somebody wants to minify + // and optimize their json, the name isn't critical for most cases so it can be removed. + var layerName = 'UNSET'; + var layerType = LayerType.unknown; + String? refId; + var layerId = 0; + var solidWidth = 0; + var solidHeight = 0; + var solidColor = const Color(0x00000000); + var preCompWidth = 0; + var preCompHeight = 0; + var parentId = -1; + var timeStretch = 1.0; + var startFrame = 0.0; + var inFrame = 0.0; + var outFrame = 0.0; + String? cl; + var hidden = false; + BlurEffect? blurEffect; + DropShadowEffect? dropShadowEffect; + var autoOrient = false; + + var matteType = MatteType.none; + BlendMode? blendMode; + AnimatableTransform? transform; + AnimatableTextFrame? text; + AnimatableTextProperties? textProperties; + AnimatableDoubleValue? timeRemapping; + + var masks = []; + var shapes = []; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + layerName = reader.nextString(); + case 1: + layerId = reader.nextInt(); + case 2: + refId = reader.nextString(); + case 3: + var layerTypeInt = reader.nextInt(); + if (layerTypeInt < LayerType.unknown.index) { + layerType = LayerType.values[layerTypeInt]; + } else { + layerType = LayerType.unknown; + } + case 4: + parentId = reader.nextInt(); + case 5: + solidWidth = reader.nextInt(); + case 6: + solidHeight = reader.nextInt(); + case 7: + solidColor = MiscUtils.parseColor( + reader.nextString(), + warningCallback: composition.addWarning, + ); + case 8: + transform = AnimatableTransformParser.parse(reader, composition); + case 9: + var matteTypeIndex = reader.nextInt(); + if (matteTypeIndex >= MatteType.values.length) { + composition.addWarning('Unsupported matte type: $matteTypeIndex'); + break; + } + matteType = MatteType.values[matteTypeIndex]; + if (matteType == MatteType.luma) { + composition.addWarning('Unsupported matte type: Luma'); + } else if (matteType == MatteType.lumaInverted) { + composition.addWarning('Unsupported matte type: Luma Inverted'); + } + composition.incrementMatteOrMaskCount(1); + case 10: + reader.beginArray(); + while (reader.hasNext()) { + masks.add(MaskParser.parse(reader, composition)); + } + composition.incrementMatteOrMaskCount(masks.length); + reader.endArray(); + case 11: + reader.beginArray(); + while (reader.hasNext()) { + var shape = ContentModelParser.parse(reader, composition); + if (shape != null) { + shapes.add(shape); + } + } + reader.endArray(); + case 12: + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_textNames)) { + case 0: + text = AnimatableValueParser.parseDocumentData( + reader, + composition, + ); + case 1: + reader.beginArray(); + if (reader.hasNext()) { + textProperties = AnimatableTextPropertiesParser.parse( + reader, + composition, + ); + } + while (reader.hasNext()) { + reader.skipValue(); + } + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + case 13: + reader.beginArray(); + var effectNames = []; + while (reader.hasNext()) { + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_effectsNames)) { + case 0: + var type = reader.nextInt(); + if (type == 29) { + blurEffect = BlurEffectParser.parse(reader, composition); + } else if (type == 25) { + dropShadowEffect = DropShadowEffectParser().parse( + reader, + composition, + ); + } + case 1: + var effectName = reader.nextString(); + effectNames.add(effectName); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + } + reader.endArray(); + composition.addWarning( + "Lottie doesn't support layer effects. If you are using them for " + ' fills, strokes, trim paths etc. then try adding them directly as contents ' + ' in your shape. Found: $effectNames', + ); + case 14: + timeStretch = reader.nextDouble(); + case 15: + startFrame = reader.nextDouble(); + case 16: + preCompWidth = reader.nextDouble().toInt(); + case 17: + preCompHeight = reader.nextDouble().toInt(); + case 18: + inFrame = reader.nextDouble(); + case 19: + outFrame = reader.nextDouble(); + case 20: + timeRemapping = AnimatableValueParser.parseFloat(reader, composition); + case 21: + cl = reader.nextString(); + case 22: + hidden = reader.nextBoolean(); + case 23: + autoOrient = reader.nextInt() == 1; + case 24: + var blendModeIndex = reader.nextInt(); + if (blendModeIndex >= blendModes.length) { + composition.addWarning('Unsupported Blend Mode: $blendModeIndex'); + break; + } + blendMode = blendModes[blendModeIndex]; + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + var inOutKeyframes = >[]; + // Before the in frame + if (inFrame > 0) { + var preKeyframe = Keyframe( + composition, + startValue: 0.0, + endValue: 0.0, + startFrame: 0.0, + endFrame: inFrame, + ); + inOutKeyframes.add(preKeyframe); + } + + outFrame = outFrame > 0 ? outFrame : composition.endFrame; + var visibleKeyframe = Keyframe( + composition, + startValue: 1.0, + endValue: 1.0, + startFrame: inFrame, + endFrame: outFrame, + ); + inOutKeyframes.add(visibleKeyframe); + + var outKeyframe = Keyframe( + composition, + startValue: 0.0, + endValue: 0.0, + startFrame: outFrame, + endFrame: double.maxFinite, + ); + inOutKeyframes.add(outKeyframe); + + if (layerName.endsWith('.ai') || 'ai' == cl) { + composition.addWarning( + 'Convert your Illustrator layers to shape layers.', + ); + } + if (autoOrient) { + transform ??= AnimatableTransform(); + transform.isAutoOrient = autoOrient; + } + + return Layer( + shapes: shapes, + composition: composition, + name: layerName, + id: layerId, + layerType: layerType, + parentId: parentId, + refId: refId, + masks: masks, + transform: transform!, + solidWidth: solidWidth, + solidHeight: solidHeight, + solidColor: solidColor, + timeStretch: timeStretch, + startFrame: startFrame, + preCompWidth: preCompWidth, + preCompHeight: preCompHeight, + text: text, + textProperties: textProperties, + inOutKeyframes: inOutKeyframes, + matteType: matteType, + timeRemapping: timeRemapping, + isHidden: hidden, + blurEffect: blurEffect, + dropShadowEffect: dropShadowEffect, + blendMode: blendMode, + ); + } +} diff --git a/lottie/lib/src/parser/lottie_composition_parser.dart b/lottie/lib/src/parser/lottie_composition_parser.dart new file mode 100644 index 0000000..348cd35 --- /dev/null +++ b/lottie/lib/src/parser/lottie_composition_parser.dart @@ -0,0 +1,271 @@ +import '../composition.dart'; +import '../lottie_image_asset.dart'; +import '../model/font.dart'; +import '../model/font_character.dart'; +import '../model/layer/layer.dart'; +import '../model/marker.dart'; +import '../utils/misc.dart'; +import 'font_character_parser.dart'; +import 'font_parser.dart'; +import 'layer_parser.dart'; +import 'moshi/json_reader.dart'; + +class LottieCompositionParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'w', // 0 + 'h', // 1 + 'ip', // 2 + 'op', // 3 + 'fr', // 4 + 'v', // 5 + 'layers', // 6 + 'assets', // 7 + 'fonts', // 8 + 'chars', // 9 + 'markers', // 10 + ]); + + static LottieComposition parse( + LottieComposition composition, + JsonReader reader, + ) { + var parameters = CompositionParameters.forComposition(composition); + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + parameters.bounds.width = reader.nextDouble().toInt(); + case 1: + parameters.bounds.height = reader.nextDouble().toInt(); + case 2: + parameters.startFrame = reader.nextDouble(); + case 3: + parameters.endFrame = reader.nextDouble() - 0.01; + case 4: + parameters.frameRate = reader.nextDouble(); + case 5: + var version = reader.nextString(); + var versions = version.split('.'); + var majorVersion = int.parse(versions[0]); + var minorVersion = int.parse(versions[1]); + var patchVersion = int.parse(versions[2]); + if (!MiscUtils.isAtLeastVersion( + majorVersion, + minorVersion, + patchVersion, + 4, + 4, + 0, + )) { + composition.addWarning('Lottie only supports bodymovin >= 4.4.0'); + } + case 6: + _parseLayers( + reader, + composition, + parameters.layers, + parameters.layerMap, + ); + case 7: + _parseAssets( + reader, + composition, + parameters.precomps, + parameters.images, + ); + case 8: + _parseFonts(reader, parameters.fonts); + case 9: + _parseChars(reader, composition, parameters.characters); + case 10: + _parseMarkers(reader, composition, parameters.markers); + default: + reader.skipName(); + reader.skipValue(); + } + } + assert( + parameters.startFrame != parameters.endFrame, + 'startFrame == endFrame (${parameters.startFrame})', + ); + assert( + parameters.frameRate > 0, + 'invalid framerate: ${parameters.frameRate}', + ); + + return composition; + } + + static void _parseLayers( + JsonReader reader, + LottieComposition composition, + List layers, + Map layerMap, + ) { + var imageCount = 0; + reader.beginArray(); + while (reader.hasNext()) { + var layer = LayerParser.parseJson(reader, composition); + if (layer.layerType == LayerType.image) { + imageCount++; + } + layers.add(layer); + layerMap[layer.id] = layer; + } + if (imageCount > 4) { + composition.addWarning( + 'You have $imageCount images. Lottie should primarily be ' + 'used with shapes. If you are using Adobe Illustrator, convert the Illustrator layers' + ' to shape layers.', + ); + } + reader.endArray(); + } + + static final JsonReaderOptions _assetsNames = JsonReaderOptions.of([ + 'id', // 0 + 'layers', // 1 + 'w', // 2 + 'h', // 3 + 'p', // 4 + 'u', // 5 + ]); + + static void _parseAssets( + JsonReader reader, + LottieComposition composition, + Map> precomps, + Map images, + ) { + reader.beginArray(); + while (reader.hasNext()) { + late String id; + // For precomps + var layers = []; + var layerMap = {}; + // For images + var width = 0; + var height = 0; + String? imageFileName; + String? relativeFolder; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_assetsNames)) { + case 0: + id = reader.nextString(); + case 1: + reader.beginArray(); + while (reader.hasNext()) { + var layer = LayerParser.parseJson(reader, composition); + layerMap[layer.id] = layer; + layers.add(layer); + } + reader.endArray(); + case 2: + width = reader.nextInt(); + case 3: + height = reader.nextInt(); + case 4: + imageFileName = reader.nextString(); + case 5: + relativeFolder = reader.nextString(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + if (imageFileName != null) { + var image = LottieImageAsset( + width: width, + height: height, + id: id, + fileName: imageFileName, + dirName: relativeFolder ?? '', + ); + images[image.id] = image; + } else { + precomps[id] = layers; + } + } + reader.endArray(); + } + + static final JsonReaderOptions _fontNames = JsonReaderOptions.of(['list']); + + static void _parseFonts(JsonReader reader, Map fonts) { + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_fontNames)) { + case 0: + reader.beginArray(); + while (reader.hasNext()) { + var font = FontParser.parse(reader); + fonts[font.name] = font; + } + reader.endArray(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + } + + static void _parseChars( + JsonReader reader, + LottieComposition composition, + Map characters, + ) { + reader.beginArray(); + while (reader.hasNext()) { + var character = FontCharacterParser.parse(reader, composition); + characters[character.hashCode] = character; + } + reader.endArray(); + } + + static final JsonReaderOptions _markerNames = JsonReaderOptions.of([ + 'cm', + 'tm', + 'dr', + ]); + + static void _parseMarkers( + JsonReader reader, + LottieComposition composition, + List markers, + ) { + reader.beginArray(); + while (reader.hasNext()) { + String? comment; + var frame = 0.0; + var durationFrames = 0.0; + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_markerNames)) { + case 0: + comment = reader.nextString(); + case 1: + frame = reader.nextDouble(); + case 2: + durationFrames = reader.nextDouble(); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + markers.add( + Marker( + composition, + comment ?? '', + startFrame: frame, + durationFrames: durationFrames, + ), + ); + } + reader.endArray(); + } +} diff --git a/lottie/lib/src/parser/mask_parser.dart b/lottie/lib/src/parser/mask_parser.dart new file mode 100644 index 0000000..0a0782a --- /dev/null +++ b/lottie/lib/src/parser/mask_parser.dart @@ -0,0 +1,60 @@ +import '../composition.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/animatable/animatable_shape_value.dart'; +import '../model/content/mask.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class MaskParser { + MaskParser._(); + + static Mask parse(JsonReader reader, LottieComposition composition) { + late MaskMode maskMode; + late AnimatableShapeValue maskPath; + late AnimatableIntegerValue opacity; + var inverted = false; + + reader.beginObject(); + while (reader.hasNext()) { + var mode = reader.nextName(); + switch (mode) { + case 'mode': + var modeName = reader.nextString(); + switch (modeName) { + case 'a': + maskMode = MaskMode.maskModeAdd; + case 's': + maskMode = MaskMode.maskModeSubstract; + case 'n': + maskMode = MaskMode.maskModeNone; + case 'i': + composition.addWarning( + 'Animation contains intersect masks. They are not supported but will be treated like add masks.', + ); + maskMode = MaskMode.maskModeIntersect; + default: + composition.addWarning( + 'Unknown mask mode $modeName. Defaulting to Add.', + ); + maskMode = MaskMode.maskModeAdd; + } + case 'pt': + maskPath = AnimatableValueParser.parseShapeData(reader, composition); + case 'o': + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 'inv': + inverted = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + reader.endObject(); + + return Mask( + maskMode: maskMode, + maskPath: maskPath, + opacity: opacity, + isInverted: inverted, + ); + } +} diff --git a/lottie/lib/src/parser/merge_paths_parser.dart b/lottie/lib/src/parser/merge_paths_parser.dart new file mode 100644 index 0000000..e7a6955 --- /dev/null +++ b/lottie/lib/src/parser/merge_paths_parser.dart @@ -0,0 +1,34 @@ +import '../model/content/merge_paths.dart'; +import 'moshi/json_reader.dart'; + +class MergePathsParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'mm', + 'hd', + ]); + + MergePathsParser._(); + + static MergePaths parse(JsonReader reader) { + String? name; + late MergePathsMode mode; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + mode = MergePaths.modeForId(reader.nextInt()); + case 2: + hidden = reader.nextBoolean(); + default: + reader.skipName(); + reader.skipValue(); + } + } + + return MergePaths(name: name ?? '', mode: mode, hidden: hidden); + } +} diff --git a/lottie/lib/src/parser/moshi/buffer.dart b/lottie/lib/src/parser/moshi/buffer.dart new file mode 100644 index 0000000..55e5c81 --- /dev/null +++ b/lottie/lib/src/parser/moshi/buffer.dart @@ -0,0 +1,216 @@ +import 'dart:convert'; +import 'dart:math'; + +class Buffer { + Buffer(this.buffer); + + final List buffer; + int _start = 0, _size = 0; + int get size => _size; + + static void _checkOffsetAndCount(int size, int offset, int byteCount) { + if ((offset | byteCount) < 0 || + offset > size || + size - offset < byteCount) { + throw Exception('size=$size offset=$offset byteCount=$byteCount'); + } + } + + /// Removes all bytes from this, decodes them as UTF-8, and returns the string. Returns the empty + /// string if this source is empty.

{@code
+  ///
+  ///   Buffer buffer = new Buffer()
+  ///       .writeUtf8("Uh uh uh!")
+  ///       .writeByte(' ')
+  ///       .writeUtf8("You didn't say the magic word!");
+  ///
+  ///   assertEquals("Uh uh uh! You didn't say the magic word!", buffer.readUtf8());
+  ///   assertEquals(0, buffer.size());
+  ///
+  ///   assertEquals("", buffer.readUtf8());
+  ///   assertEquals(0, buffer.size());
+  /// }
+ String readUtf8(int byteCount) { + if (_size < byteCount) throw Exception('size < $byteCount: $_size'); + + var string = utf8.decoder.convert(buffer, _start, _start + byteCount); + _start += byteCount; + _size -= byteCount; + return string; + } + + /// Removes a byte from this source and returns it. + int readByte() { + if (_size == 0) throw Exception('size == 0'); + + var byte = buffer[_start++]; + --_size; + return byte; + } + + /// Returns true when the buffer contains at least {@code byteCount} bytes, expanding it as + /// necessary. Returns false if the source is exhausted before the requested bytes can be read. + bool request(int byteCount) { + if (_start + byteCount > buffer.length) { + _size = buffer.length - _start; + return false; + } + _size = max(byteCount, _size); + return true; + } + + /// Returns the byte at {@code pos}. */ + int getByte(int pos) { + _checkOffsetAndCount(_size, pos, 1); + return buffer[_start + pos]; + } + + /// Reads and discards {@code byteCount} bytes from this source. Throws an + /// [Exception] if the source is exhausted before the + /// requested bytes can be skipped. + void skip(int byteCount) { + _start += byteCount; + if (_start >= buffer.length) { + _start = buffer.length - 1; + throw Exception('source is exhausted'); + } + + _size -= byteCount; + _size = max(0, _size); + } + + /// Finds the first string in {@code options} that is a prefix of this buffer, consumes it from + /// this buffer, and returns its index. If no byte string in {@code options} is a prefix of this + /// buffer this returns -1 and no bytes are consumed. + /// + ///

This can be used as an alternative to {@link #readByteString} or even {@link #readUtf8} if + /// the set of expected values is known in advance.

{@code
+  ///
+  ///   Options FIELDS = Options.of(
+  ///       ByteString.encodeUtf8("depth="),
+  ///       ByteString.encodeUtf8("height="),
+  ///       ByteString.encodeUtf8("width="));
+  ///
+  ///   Buffer buffer = new Buffer()
+  ///       .writeUtf8("width=640\n")
+  ///       .writeUtf8("height=480\n");
+  ///
+  ///   assertEquals(2, buffer.select(FIELDS));
+  ///   assertEquals(640, buffer.readDecimalLong());
+  ///   assertEquals('\n', buffer.readByte());
+  ///   assertEquals(1, buffer.select(FIELDS));
+  ///   assertEquals(480, buffer.readDecimalLong());
+  ///   assertEquals('\n', buffer.readByte());
+  /// }
+ int select(List> options) { + var index = _selectPrefix(options); + if (index == -1) return -1; + + var size = options[index].length; + skip(size); + return index; + } + + int _selectPrefix(List> options) { + for (var i = 0; i < options.length; i++) { + var option = options[i]; + if (_isPrefix(option, buffer, _start)) { + return i; + } + } + return -1; + } + + static bool _isPrefix(List search, List buffer, int start) { + for (var i = 0; i < search.length; i++) { + if (search[i] != buffer[start + i]) { + return false; + } + } + return true; + } + + /// Returns the first index in this buffer that is at or after {@code fromIndex} and that contains + /// any of the bytes in {@code targetBytes}. This expands the buffer as necessary until a target + /// byte is found. This reads an unbounded number of bytes into the buffer. Returns -1 if the + /// stream is exhausted before the requested byte is found.
{@code
+  ///
+  ///   ByteString ANY_VOWEL = ByteString.encodeUtf8("AEOIUaeoiu");
+  ///
+  ///   Buffer buffer = new Buffer();
+  ///   buffer.writeUtf8("Dr. Alan Grant");
+  ///
+  ///   assertEquals(4,  buffer.indexOfElement(ANY_VOWEL));    // 'A' in 'Alan'.
+  ///   assertEquals(11, buffer.indexOfElement(ANY_VOWEL, 9)); // 'a' in 'Grant'.
+  /// }
+ int indexOfElement(List targetBytes, int fromIndex) { + var i = fromIndex; + while (_start + i < buffer.length) { + _size = max(i + 1, _size); + + var bufferByte = buffer[_start + i]; + for (var targetByte in targetBytes) { + if (targetByte == bufferByte) { + return i; + } + } + ++i; + } + return -1; + } + + /// Returns the index of the first {@code b} in the buffer at or after {@code fromIndex}. This + /// expands the buffer as necessary until {@code b} is found. This reads an unbounded number of + /// bytes into the buffer. Returns -1 if the stream is exhausted before the requested byte is + /// found.
{@code
+  ///
+  ///   Buffer buffer = new Buffer();
+  ///   buffer.writeUtf8("Don't move! He can't see us if we don't move.");
+  ///
+  ///   byte m = 'm';
+  ///   assertEquals(6,  buffer.indexOf(m));
+  ///   assertEquals(40, buffer.indexOf(m, 12));
+  /// }
+ int indexOf(int b, int fromIndex) { + var i = fromIndex; + while (_start + i < buffer.length) { + _size = max(i + 1, _size); + + var bufferByte = buffer[_start + i]; + if (b == bufferByte) { + return i; + } + + ++i; + } + return -1; + } + + /// Returns the index of the first match for {@code bytes} in the buffer at or after {@code + /// fromIndex}. This expands the buffer as necessary until {@code bytes} is found. This reads an + /// unbounded number of bytes into the buffer. Returns -1 if the stream is exhausted before the + /// requested bytes are found.
{@code
+  ///
+  ///   ByteString MOVE = ByteString.encodeUtf8("move");
+  ///
+  ///   Buffer buffer = new Buffer();
+  ///   buffer.writeUtf8("Don't move! He can't see us if we don't move.");
+  ///
+  ///   assertEquals(6,  buffer.indexOf(MOVE));
+  ///   assertEquals(40, buffer.indexOf(MOVE, 12));
+  /// }
+ int indexOfBytes(List bytes, int fromIndex) { + var i = fromIndex; + while (_start + i < buffer.length) { + _size = max(i + 1, _size); + + if (_isPrefix(bytes, buffer, _start + i)) { + return i; + } + ++i; + } + return -1; + } + + void clear() {} +} diff --git a/lottie/lib/src/parser/moshi/charcode.dart b/lottie/lib/src/parser/moshi/charcode.dart new file mode 100644 index 0000000..a395850 --- /dev/null +++ b/lottie/lib/src/parser/moshi/charcode.dart @@ -0,0 +1,465 @@ +// Control characters. + +/// "Null character" control character. +const int $nul = 0x00; + +/// "Start of Header" control character. +const int $soh = 0x01; + +/// "Start of Text" control character. +const int $stx = 0x02; + +/// "End of Text" control character. +const int $etx = 0x03; + +/// "End of Transmission" control character. +const int $eot = 0x04; + +/// "Enquiry" control character. +const int $enq = 0x05; + +/// "Acknowledgment" control character. +const int $ack = 0x06; + +/// "Bell" control character. +const int $bel = 0x07; + +/// "Backspace" control character. +const int $bs = 0x08; + +/// "Horizontal Tab" control character. +const int $ht = 0x09; + +/// "Horizontal Tab" control character, common name. +const int $tab = 0x09; + +/// "Line feed" control character. +const int $lf = 0x0A; + +/// "Vertical Tab" control character. +const int $vt = 0x0B; + +/// "Form feed" control character. +const int $ff = 0x0C; + +/// "Carriage return" control character. +const int $cr = 0x0D; + +/// "Shift Out" control character. +const int $so = 0x0E; + +/// "Shift In" control character. +const int $si = 0x0F; + +/// "Data Link Escape" control character. +const int $dle = 0x10; + +/// "Device Control 1" control character (oft. XON). +const int $dc1 = 0x11; + +/// "Device Control 2" control character. +const int $dc2 = 0x12; + +/// "Device Control 3" control character (oft. XOFF). +const int $dc3 = 0x13; + +/// "Device Control 4" control character. +const int $dc4 = 0x14; + +/// "Negative Acknowledgment" control character. +const int $nak = 0x15; + +/// "Synchronous idle" control character. +const int $syn = 0x16; + +/// "End of Transmission Block" control character. +const int $etb = 0x17; + +/// "Cancel" control character. +const int $can = 0x18; + +/// "End of Medium" control character. +const int $em = 0x19; + +/// "Substitute" control character. +const int $sub = 0x1A; + +/// "Escape" control character. +const int $esc = 0x1B; + +/// "File Separator" control character. +const int $fs = 0x1C; + +/// "Group Separator" control character. +const int $gs = 0x1D; + +/// "Record Separator" control character. +const int $rs = 0x1E; + +/// "Unit Separator" control character. +const int $us = 0x1F; + +/// "Delete" control character. +const int $del = 0x7F; + +// Visible characters. + +/// Space character. +const int $space = 0x20; + +/// Character `!`. +const int $exclamation = 0x21; + +/// Character `"', short nam`. +const int $quot = 0x22; + +/// Character `"`. +const int $quote = 0x22; + +/// Character `"`. +const int $doubleQuote = 0x22; + +/// Character `"`. +const int $quotation = 0x22; + +/// Character `#`. +const int $hash = 0x23; + +/// Character `$`. +const int $$ = 0x24; + +/// Character `$`. +const int $dollar = 0x24; + +/// Character `%`. +const int $percent = 0x25; + +/// Character `&`, short name. +const int $amp = 0x26; + +/// Character `&`. +const int $ampersand = 0x26; + +/// Character `'`. +const int $apos = 0x27; + +/// Character `'`. +const int $apostrophe = 0x27; + +/// Character `'`. +const int $singleQuote = 0x27; + +/// Character `(`. +const int $lparen = 0x28; + +/// Character `(`. +const int $openParen = 0x28; + +/// Character `(`. +const int $openParenthesis = 0x28; + +/// Character `)`. +const int $rparen = 0x29; + +/// Character `)`. +const int $closeParen = 0x29; + +/// Character `)`. +const int $closeParenthesis = 0x29; + +/// Character `*`. +const int $asterisk = 0x2A; + +/// Character `+`. +const int $plus = 0x2B; + +/// Character `,`. +const int $comma = 0x2C; + +/// Character `-`. +const int $minus = 0x2D; + +/// Character `-`. +const int $dash = 0x2D; + +/// Character `.`. +const int $dot = 0x2E; + +/// Character `.`. +const int $fullstop = 0x2E; + +/// Character `/`. +const int $slash = 0x2F; + +/// Character `/`. +const int $solidus = 0x2F; + +/// Character `/`. +const int $division = 0x2F; + +/// Character `0`. +const int $0 = 0x30; + +/// Character `1`. +const int $1 = 0x31; + +/// Character `2`. +const int $2 = 0x32; + +/// Character `3`. +const int $3 = 0x33; + +/// Character `4`. +const int $4 = 0x34; + +/// Character `5`. +const int $5 = 0x35; + +/// Character `6`. +const int $6 = 0x36; + +/// Character `7`. +const int $7 = 0x37; + +/// Character `8`. +const int $8 = 0x38; + +/// Character `9`. +const int $9 = 0x39; + +/// Character `:`. +const int $colon = 0x3A; + +/// Character `;`. +const int $semicolon = 0x3B; + +/// Character `<`. +const int $lt = 0x3C; + +/// Character `<`. +const int $lessThan = 0x3C; + +/// Character `<`. +const int $langle = 0x3C; + +/// Character `<`. +const int $openAngle = 0x3C; + +/// Character `=`. +const int $equal = 0x3D; + +/// Character `>`. +const int $gt = 0x3E; + +/// Character `>`. +const int $greaterThan = 0x3E; + +/// Character `>`. +const int $rangle = 0x3E; + +/// Character `>`. +const int $closeAngle = 0x3E; + +/// Character `?`. +const int $question = 0x3F; + +/// Character `@`. +const int $at = 0x40; + +/// Character `A`. +const int $A = 0x41; + +/// Character `B`. +const int $B = 0x42; + +/// Character `C`. +const int $C = 0x43; + +/// Character `D`. +const int $D = 0x44; + +/// Character `E`. +const int $E = 0x45; + +/// Character `F`. +const int $F = 0x46; + +/// Character `G`. +const int $G = 0x47; + +/// Character `H`. +const int $H = 0x48; + +/// Character `I`. +const int $I = 0x49; + +/// Character `J`. +const int $J = 0x4A; + +/// Character `K`. +const int $K = 0x4B; + +/// Character `L`. +const int $L = 0x4C; + +/// Character `M`. +const int $M = 0x4D; + +/// Character `N`. +const int $N = 0x4E; + +/// Character `O`. +const int $O = 0x4F; + +/// Character `P`. +const int $P = 0x50; + +/// Character `Q`. +const int $Q = 0x51; + +/// Character `R`. +const int $R = 0x52; + +/// Character `S`. +const int $S = 0x53; + +/// Character `T`. +const int $T = 0x54; + +/// Character `U`. +const int $U = 0x55; + +/// Character `V`. +const int $V = 0x56; + +/// Character `W`. +const int $W = 0x57; + +/// Character `X`. +const int $X = 0x58; + +/// Character `Y`. +const int $Y = 0x59; + +/// Character `Z`. +const int $Z = 0x5A; + +/// Character `[`. +const int $lbracket = 0x5B; + +/// Character `[`. +const int $openBracket = 0x5B; + +/// Character `\`. +const int $backslash = 0x5C; + +/// Character `]`. +const int $rbracket = 0x5D; + +/// Character `]`. +const int $closeBracket = 0x5D; + +/// Character `^`. +const int $circumflex = 0x5E; + +/// Character `^`. +const int $caret = 0x5E; + +/// Character `^`. +const int $hat = 0x5E; + +/// Character `_`. +const int $underscore = 0x5F; + +/// Character `_`. +const int $underline = 0x5F; + +/// Character `` ` ``. +const int $backquote = 0x60; + +/// Character `` ` ``. +const int $grave = 0x60; + +/// Character `a`. +const int $a = 0x61; + +/// Character `b`. +const int $b = 0x62; + +/// Character `c`. +const int $c = 0x63; + +/// Character `d`. +const int $d = 0x64; + +/// Character `e`. +const int $e = 0x65; + +/// Character `f`. +const int $f = 0x66; + +/// Character `g`. +const int $g = 0x67; + +/// Character `h`. +const int $h = 0x68; + +/// Character `i`. +const int $i = 0x69; + +/// Character `j`. +const int $j = 0x6A; + +/// Character `k`. +const int $k = 0x6B; + +/// Character `l`. +const int $l = 0x6C; + +/// Character `m`. +const int $m = 0x6D; + +/// Character `n`. +const int $n = 0x6E; + +/// Character `o`. +const int $o = 0x6F; + +/// Character `p`. +const int $p = 0x70; + +/// Character `q`. +const int $q = 0x71; + +/// Character `r`. +const int $r = 0x72; + +/// Character `s`. +const int $s = 0x73; + +/// Character `t`. +const int $t = 0x74; + +/// Character `u`. +const int $u = 0x75; + +/// Character `v`. +const int $v = 0x76; + +/// Character `w`. +const int $w = 0x77; + +/// Character `x`. +const int $x = 0x78; + +/// Character `y`. +const int $y = 0x79; + +/// Character `z`. +const int $z = 0x7A; + +/// Character `{`. +const int $openBrace = 0x7B; + +/// Character `}`. +const int $closeBrace = 0x7D; diff --git a/lottie/lib/src/parser/moshi/json_reader.dart b/lottie/lib/src/parser/moshi/json_reader.dart new file mode 100644 index 0000000..ac31447 --- /dev/null +++ b/lottie/lib/src/parser/moshi/json_reader.dart @@ -0,0 +1,354 @@ +import 'dart:convert'; +import 'buffer.dart'; +import 'json_scope.dart'; +import 'json_utf8_reader.dart'; + +// ignore_for_file: unintended_html_in_doc_comment + +/// Reads a JSON (
RFC 7159) +/// encoded value as a stream of tokens. This stream includes both literal +/// values (strings, numbers, booleans, and nulls) as well as the begin and +/// end delimiters of objects and arrays. The tokens are traversed in +/// depth-first order, the same order that they appear in the JSON document. +/// Within JSON objects, name/value pairs are represented by a single token. +/// +///

Parsing JSON

+/// To create a recursive descent parser for your own JSON streams, first create +/// an entry point method that creates a {@code JsonReader}. +/// +///

Next, create handler methods for each structure in your JSON text. You'll +/// need a method for each object type and for each array type. +///

    +///
  • Within array handling methods, first call {@link +/// #beginArray} to consume the array's opening bracket. Then create a +/// while loop that accumulates values, terminating when {@link #hasNext} +/// is false. Finally, read the array's closing bracket by calling {@link +/// #endArray}. +///
  • Within object handling methods, first call {@link +/// #beginObject} to consume the object's opening brace. Then create a +/// while loop that assigns values to local variables based on their name. +/// This loop should terminate when {@link #hasNext} is false. Finally, +/// read the object's closing brace by calling {@link #endObject}. +///
+///

When a nested object or array is encountered, delegate to the +/// corresponding handler method. +/// +///

When an unknown name is encountered, strict parsers should fail with an +/// exception. Lenient parsers should call {@link #skipValue()} to recursively +/// skip the value's nested tokens, which may otherwise conflict. +/// +///

If a value may be null, you should first check using {@link #peek()}. +/// Null literals can be consumed using either {@link #nextNull()} or {@link +/// #skipValue()}. +/// +///

Example

+/// Suppose we'd like to parse a stream of messages such as the following:
 {@code
+/// [
+///   {
+///     "id": 912345678901,
+///     "text": "How do I read a JSON stream in Java?",
+///     "geo": null,
+///     "user": {
+///       "name": "json_newb",
+///       "followers_count": 41
+///      }
+///   },
+///   {
+///     "id": 912345678902,
+///     "text": "@json_newb just use JsonReader!",
+///     "geo": [50.454722, -104.606667],
+///     "user": {
+///       "name": "jesse",
+///       "followers_count": 2
+///     }
+///   }
+/// ]}
+/// This code implements the parser for the above structure:
   {@code
+///
+///   public List readJsonStream(BufferedSource source) throws IOException {
+///     JsonReader reader = JsonReader.of(source);
+///     try {
+///       return readMessagesArray(reader);
+///     } finally {
+///       reader.close();
+///     }
+///   }
+///
+///   public List readMessagesArray(JsonReader reader) throws IOException {
+///     List messages = new ArrayList();
+///
+///     reader.beginArray();
+///     while (reader.hasNext()) {
+///       messages.add(readMessage(reader));
+///     }
+///     reader.endArray();
+///     return messages;
+///   }
+///
+///   public Message readMessage(JsonReader reader) throws IOException {
+///     long id = -1;
+///     String text = null;
+///     User user = null;
+///     List geo = null;
+///
+///     reader.beginObject();
+///     while (reader.hasNext()) {
+///       String name = reader.nextName();
+///       if (name.equals("id")) {
+///         id = reader.nextLong();
+///       } else if (name.equals("text")) {
+///         text = reader.nextString();
+///       } else if (name.equals("geo") && reader.peek() != Token.NULL) {
+///         geo = readDoublesArray(reader);
+///       } else if (name.equals("user")) {
+///         user = readUser(reader);
+///       } else {
+///         reader.skipValue();
+///       }
+///     }
+///     reader.endObject();
+///     return new Message(id, text, user, geo);
+///   }
+///
+///   public List readDoublesArray(JsonReader reader) throws IOException {
+///     List doubles = new ArrayList();
+///
+///     reader.beginArray();
+///     while (reader.hasNext()) {
+///       doubles.add(reader.nextDouble());
+///     }
+///     reader.endArray();
+///     return doubles;
+///   }
+///
+///   public User readUser(JsonReader reader) throws IOException {
+///     String username = null;
+///     int followersCount = -1;
+///
+///     reader.beginObject();
+///     while (reader.hasNext()) {
+///       String name = reader.nextName();
+///       if (name.equals("name")) {
+///         username = reader.nextString();
+///       } else if (name.equals("followers_count")) {
+///         followersCount = reader.nextInt();
+///       } else {
+///         reader.skipValue();
+///       }
+///     }
+///     reader.endObject();
+///     return new User(username, followersCount);
+///   }}
+/// +///

Number Handling

+/// This reader permits numeric values to be read as strings and string values to +/// be read as numbers. For example, both elements of the JSON array {@code +/// [1, "1"]} may be read using either {@link #nextInt} or {@link #nextString}. +/// This behavior is intended to prevent lossy numeric conversions: double is +/// JavaScript's only numeric type and very large values like {@code +/// 9007199254740993} cannot be represented exactly on that platform. To minimize +/// precision loss, extremely large values should be written and read as strings +/// in JSON. +/// +///

Each {@code JsonReader} may be used to read a single JSON stream. Instances +/// of this class are not thread safe. +abstract class JsonReader { + // The nesting stack. Using a manual array rather than an ArrayList saves 20%. This stack will + // grow itself up to 256 levels of nesting including the top-level document. Deeper nesting is + // prone to trigger StackOverflowErrors. + int stackSize = 0; + List scopes = List.filled(32, 0); + List pathNames = List.filled(32, null); + List pathIndices = List.filled(32, 0); + + /// True to accept non-spec compliant JSON. + bool lenient = false; + + /// True to throw a {@link JsonDataException} on any attempt to call {@link #skipValue()}. + bool failOnUnknown = false; + + /// Returns a new instance that reads UTF-8 encoded JSON from {@code source}. + static JsonReader fromBytes(List source) { + return JsonUtf8Reader(Buffer(source)); + } + + static List _copyOf(List source, int newSize, T fill) { + var newList = List.filled(newSize, fill); + List.copyRange(newList, 0, source); + return newList; + } + + void pushScope(int newTop) { + if (stackSize == scopes.length) { + if (stackSize == 256) { + throw JsonDataException('Nesting too deep at ${getPath()}'); + } + scopes = _copyOf(scopes, scopes.length * 2, 0); + pathNames = _copyOf(pathNames, pathNames.length * 2, null); + pathIndices = _copyOf(pathIndices, pathIndices.length * 2, 0); + } + scopes[stackSize++] = newTop; + } + + /// Throws a new IO exception with the given message and a context snippet + /// with this reader's content. + JsonEncodingException syntaxError(String message) { + throw JsonEncodingException('$message at path ${getPath()}'); + } + + /// Consumes the next token from the JSON stream and asserts that it is the beginning of a new + /// array. + void beginArray(); + + /// Consumes the next token from the JSON stream and asserts that it is the + /// end of the current array. + void endArray(); + + /// Consumes the next token from the JSON stream and asserts that it is the beginning of a new + /// object. + void beginObject(); + + /// Consumes the next token from the JSON stream and asserts that it is the end of the current + /// object. + void endObject(); + + /// Returns true if the current array or object has another element. + bool hasNext(); + + /// Returns the type of the next token without consuming it. + Token peek(); + + /// Returns the next token, a {@linkplain Token#NAME property name}, and consumes it. + /// + /// @throws JsonDataException if the next token in the stream is not a property name. + String nextName(); + + /// If the next token is a {@linkplain Token#NAME property name} that's in {@code options}, this + /// consumes it and returns its index. Otherwise this returns -1 and no name is consumed. + int selectName(JsonReaderOptions options); + + /// Skips the next token, consuming it. This method is intended for use when the JSON token stream + /// contains unrecognized or unhandled names. + /// + ///

This throws a {@link JsonDataException} if this parser has been configured to {@linkplain + /// #failOnUnknown fail on unknown} names. + void skipName(); + + /// Returns the {@linkplain Token#STRING string} value of the next token, consuming it. If the next + /// token is a number, this method will return its string form. + /// + /// @throws JsonDataException if the next token is not a string or if this reader is closed. + String nextString(); + + /// Returns the {@linkplain Token#BOOLEAN boolean} value of the next token, consuming it. + /// + /// @throws JsonDataException if the next token is not a boolean or if this reader is closed. + bool nextBoolean(); + + /// Returns the {@linkplain Token#NUMBER double} value of the next token, consuming it. If the next + /// token is a string, this method will attempt to parse it as a double using {@link + /// Double#parseDouble(String)}. + /// + /// @throws JsonDataException if the next token is not a literal value, or if the next literal + /// value cannot be parsed as a double, or is non-finite. + double nextDouble(); + + /// Returns the {@linkplain Token#NUMBER int} value of the next token, consuming it. If the next + /// token is a string, this method will attempt to parse it as an int. If the next token's numeric + /// value cannot be exactly represented by a Java {@code int}, this method throws. + /// + /// @throws JsonDataException if the next token is not a literal value, if the next literal value + /// cannot be parsed as a number, or exactly represented as an int. + int nextInt(); + + /// Skips the next value recursively. If it is an object or array, all nested elements are skipped. + /// This method is intended for use when the JSON token stream contains unrecognized or unhandled + /// values. + /// + ///

This throws a {@link JsonDataException} if this parser has been configured to {@linkplain + /// #failOnUnknown fail on unknown} values. + void skipValue(); + + /// Returns a JsonPath to + /// the current location in the JSON value. + String getPath() { + return JsonScope.getPath(stackSize, scopes, pathNames, pathIndices); + } + + void close(); +} + +/// A set of strings to be chosen with {@link #selectName} or {@link #selectString}. This prepares +/// the encoded values of the strings so they can be read directly from the input source. +class JsonReaderOptions { + final List strings; + final List> doubleQuoteSuffix; + + JsonReaderOptions(this.strings, this.doubleQuoteSuffix); + + static JsonReaderOptions of(List strings) { + return JsonReaderOptions( + strings, + strings.map((s) => utf8.encode('$s"')).toList(), + ); + } +} + +/// A structure, name, or value type in a JSON-encoded string. +enum Token { + /// The opening of a JSON array. + /// and read using {@link JsonReader#beginArray}. + beginArray, + + /// The closing of a JSON array. + /// and read using {@link JsonReader#endArray}. + endArray, + + /// The opening of a JSON object. + /// and read using {@link JsonReader#beginObject}. + beginObject, + + /// The closing of a JSON object. + /// and read using {@link JsonReader#endObject}. + endObject, + + /// A JSON property name. Within objects, tokens alternate between names and + /// their values. + name, + + /// A JSON string. + string, + + /// A JSON number represented in this API by a Java {@code double}, {@code + /// long}, or {@code int}. + number, + + /// A JSON {@code true} or {@code false}. + boolean, + + /// A JSON {@code null}. + nullToken, + + /// The end of the JSON stream. This sentinel value is returned by {@link + /// JsonReader#peek()} to signal that the JSON-encoded value has no more + /// tokens. + endDocument, +} + +class JsonDataException implements Exception { + final String message; + + JsonDataException(this.message); + + @override + String toString() => message; +} + +class JsonEncodingException implements Exception { + final String message; + + JsonEncodingException(this.message); + + @override + String toString() => message; +} diff --git a/lottie/lib/src/parser/moshi/json_scope.dart b/lottie/lib/src/parser/moshi/json_scope.dart new file mode 100644 index 0000000..e6e9933 --- /dev/null +++ b/lottie/lib/src/parser/moshi/json_scope.dart @@ -0,0 +1,67 @@ +/// Lexical scoping elements within a JSON reader or writer. */ +class JsonScope { + JsonScope._(); + + /// An array with no elements requires no separators or newlines before it is closed. */ + static const int emptyArray = 1; + + /// A array with at least one value requires a comma and newline before the next element. */ + static const int nonEmptyArray = 2; + + /// An object with no name/value pairs requires no separators or newlines before it is closed. */ + static const int emptyObject = 3; + + /// An object whose most recent element is a key. The next element must be a value. */ + static const int danglingName = 4; + + /// An object with at least one name/value pair requires a separator before the next element. */ + static const int nonEmptyObject = 5; + + /// No object or array has been started. */ + static const int emptyDocument = 6; + + /// A document with at an array or object. */ + static const int nonEmptyDocument = 7; + + /// A document that's been closed and cannot be accessed. */ + static const int closed = 8; + + /// Renders the path in a JSON document to a string. The {@code pathNames} and {@code pathIndices} + /// parameters corresponds directly to stack: At indices where the stack contains an object + /// (EMPTY_OBJECT, DANGLING_NAME or NONEMPTY_OBJECT), pathNames contains the name at this scope. + /// Where it contains an array (EMPTY_ARRAY, NONEMPTY_ARRAY) pathIndices contains the current index + /// in that array. Otherwise the value is undefined, and we take advantage of that by incrementing + /// pathIndices when doing so isn't useful. + static String getPath( + int stackSize, + List stack, + List pathNames, + List pathIndices, + ) { + var result = StringBuffer()..write(r'$'); + for (var i = 0; i < stackSize; i++) { + switch (stack[i]) { + case emptyArray: + case nonEmptyArray: + result + ..write('[') + ..write(pathIndices[i]) + ..write(']'); + + case emptyObject: + case danglingName: + case nonEmptyObject: + result.write('.'); + if (pathNames[i] != null) { + result.write(pathNames[i]); + } + + case nonEmptyDocument: + case emptyDocument: + case closed: + break; + } + } + return result.toString(); + } +} diff --git a/lottie/lib/src/parser/moshi/json_utf8_reader.dart b/lottie/lib/src/parser/moshi/json_utf8_reader.dart new file mode 100644 index 0000000..2963283 --- /dev/null +++ b/lottie/lib/src/parser/moshi/json_utf8_reader.dart @@ -0,0 +1,1034 @@ +import 'dart:convert'; +import 'dart:core'; +import 'buffer.dart'; +import 'charcode.dart'; +import 'json_reader.dart'; +import 'json_scope.dart'; + +class JsonUtf8Reader extends JsonReader { + static const int longMinValue = -9007199254740991; + + static const minIncompleteInteger = longMinValue ~/ 10; + + static final List singleQuoteOrSlash = utf8.encode(r"'\"); + static final List doubleQuoteOrSlash = utf8.encode(r'"\'); + static final List unquotedStringTerminals = utf8.encode( + '{}[]:, \n\t\r\f/\\;#=', + ); + static final List lineFeedOrCarriageReturn = utf8.encode('\n\r'); + static final List closingBlockComment = utf8.encode('*/'); + + static const int peekedNone = 0; + static const int peekedBeginObject = 1; + static const int peekedEndObject = 2; + static const int peekedBeginArray = 3; + static const int peekedEndArray = 4; + static const int peekedTrue = 5; + static const int peekedFalse = 6; + static const int peekedNull = 7; + static const int peekedSingleQuote = 8; + static const int peekedDoubleQuote = 9; + static const int peekedUnquoted = 10; + + /// When this is returned, the string value is stored in peekedString. */ + static const int peekedBuffered = 11; + static const int peekedSingleQuotedName = 12; + static const int peekedDoubleQuotedName = 13; + static const int peekedUnquotedName = 14; + static const int peekedBufferedName = 15; + + /// When this is returned, the integer value is stored in peekedLong. */ + static const int peekedLong = 16; + static const int peekedNumber = 17; + static const int peekedEof = 18; + + // State machine when parsing numbers + static const int numberCharNone = 0; + static const int numberCharSign = 1; + static const int numberCharDigit = 2; + static const int numberCharDecimal = 3; + static const int numberCharFractionDigit = 4; + static const int numberCharExpE = 5; + static const int numberCharExpSign = 6; + static const int numberCharExpDigit = 7; + + /// The input JSON. */ + final Buffer buffer; + + int _peeked = peekedNone; + + /// A peeked value that was composed entirely of digits with an optional + /// leading dash. Positive values may not have a leading 0. + late int _peekedLong; + + /// The number of characters in a peeked number literal. + late int _peekedNumberLength; + + /// A peeked string that should be parsed on the next double, long or string. + /// This is populated before a numeric value is parsed and used if that parsing + /// fails. + String? _peekedString; + + JsonUtf8Reader(this.buffer) { + pushScope(JsonScope.emptyDocument); + } + + @override + void beginArray() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedBeginArray) { + pushScope(JsonScope.emptyArray); + pathIndices[stackSize - 1] = 0; + _peeked = peekedNone; + } else { + throw JsonDataException( + 'Expected BEGIN_ARRAY but was ${peek()} at path ${getPath()}', + ); + } + } + + @override + void endArray() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedEndArray) { + stackSize--; + pathIndices[stackSize - 1]++; + _peeked = peekedNone; + } else { + throw JsonDataException( + 'Expected END_ARRAY but was ${peek()} at path ${getPath()}', + ); + } + } + + @override + void beginObject() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedBeginObject) { + pushScope(JsonScope.emptyObject); + _peeked = peekedNone; + } else { + throw JsonDataException( + 'Expected BEGIN_OBJECT but was ${peek()} at path ${getPath()}', + ); + } + } + + @override + void endObject() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedEndObject) { + stackSize--; + pathNames[stackSize] = + null; // Free the last path name so that it can be garbage collected! + pathIndices[stackSize - 1]++; + _peeked = peekedNone; + } else { + throw JsonDataException( + 'Expected END_OBJECT but was ${peek()} at path ${getPath()}', + ); + } + } + + @override + bool hasNext() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + return p != peekedEndObject && p != peekedEndArray && p != peekedEof; + } + + @override + Token peek() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + + switch (p) { + case peekedBeginObject: + return Token.beginObject; + case peekedEndObject: + return Token.endObject; + case peekedBeginArray: + return Token.beginArray; + case peekedEndArray: + return Token.endArray; + case peekedSingleQuotedName: + case peekedDoubleQuotedName: + case peekedUnquotedName: + case peekedBufferedName: + return Token.name; + case peekedTrue: + case peekedFalse: + return Token.boolean; + case peekedNull: + return Token.nullToken; + case peekedSingleQuote: + case peekedDoubleQuote: + case peekedUnquoted: + case peekedBuffered: + return Token.string; + case peekedLong: + case peekedNumber: + return Token.number; + case peekedEof: + return Token.endDocument; + default: + throw AssertionError(); + } + } + + int _doPeek() { + var peekStack = scopes[stackSize - 1]; + if (peekStack == JsonScope.emptyArray) { + scopes[stackSize - 1] = JsonScope.nonEmptyArray; + } else if (peekStack == JsonScope.nonEmptyArray) { + // Look for a comma before the next element. + var c = _nextNonWhitespace(true); + buffer.readByte(); // consume ']' or ','. + switch (c) { + case $closeBracket: + return _peeked = peekedEndArray; + case $semicolon: + _checkLenient(); + case $comma: + break; + default: + throw syntaxError('Unterminated array'); + } + } else if (peekStack == JsonScope.emptyObject || + peekStack == JsonScope.nonEmptyObject) { + scopes[stackSize - 1] = JsonScope.danglingName; + // Look for a comma before the next element. + if (peekStack == JsonScope.nonEmptyObject) { + var c = _nextNonWhitespace(true); + buffer.readByte(); // Consume '}' or ','. + switch (c) { + case $closeBrace: + return _peeked = peekedEndObject; + case $semicolon: + _checkLenient(); // fall-through + case $comma: + break; + default: + throw syntaxError('Unterminated object'); + } + } + var c = _nextNonWhitespace(true); + switch (c) { + case $doubleQuote: + buffer.readByte(); // consume the '\"'. + return _peeked = peekedDoubleQuotedName; + case $singleQuote: + buffer.readByte(); // consume the '\''. + _checkLenient(); + return _peeked = peekedSingleQuotedName; + case $closeBrace: + if (peekStack != JsonScope.nonEmptyObject) { + buffer.readByte(); // consume the '}'. + return _peeked = peekedEndObject; + } + throw syntaxError('Expected name'); + + default: + _checkLenient(); + if (isLiteral(c)) { + return _peeked = peekedUnquotedName; + } else { + throw syntaxError('Expected name'); + } + } + } else if (peekStack == JsonScope.danglingName) { + scopes[stackSize - 1] = JsonScope.nonEmptyObject; + // Look for a colon before the value. + var c = _nextNonWhitespace(true); + buffer.readByte(); // Consume ':'. + switch (c) { + case $colon: + break; + case $equal: + _checkLenient(); + if (buffer.request(1) && buffer.getByte(0) == $greaterThan) { + buffer.readByte(); // Consume '>'. + } + default: + throw syntaxError("Expected ':'"); + } + } else if (peekStack == JsonScope.emptyDocument) { + scopes[stackSize - 1] = JsonScope.nonEmptyDocument; + } else if (peekStack == JsonScope.nonEmptyDocument) { + var c = _nextNonWhitespace(false); + if (c == -1) { + return _peeked = peekedEof; + } else { + _checkLenient(); + } + } else if (peekStack == JsonScope.closed) { + throw StateError('JsonReader is closed'); + } + + var c = _nextNonWhitespace(true); + switch (c) { + case $closeBracket: + // fall-through to handle ",]" + case $semicolon: + case $comma: + if (c == $closeBracket) { + if (peekStack == JsonScope.emptyArray) { + buffer.readByte(); // Consume ']'. + return _peeked = peekedEndArray; + } + } + // In lenient mode, a 0-length literal in an array means 'null'. + if (peekStack == JsonScope.emptyArray || + peekStack == JsonScope.nonEmptyArray) { + _checkLenient(); + return _peeked = peekedNull; + } else { + throw syntaxError('Unexpected value'); + } + case $singleQuote: + _checkLenient(); + buffer.readByte(); // Consume '\''. + return _peeked = peekedSingleQuote; + case $doubleQuote: + buffer.readByte(); // Consume '\"'. + return _peeked = peekedDoubleQuote; + case $openBracket: + buffer.readByte(); // Consume '['. + return _peeked = peekedBeginArray; + case $openBrace: + buffer.readByte(); // Consume '{'. + return _peeked = peekedBeginObject; + default: + } + + var result = peekKeyword(); + if (result != peekedNone) { + return result; + } + + result = peekNumber(); + if (result != peekedNone) { + return result; + } + + if (!isLiteral(buffer.getByte(0))) { + throw syntaxError('Expected value'); + } + + _checkLenient(); + return _peeked = peekedUnquoted; + } + + int peekKeyword() { + // Figure out which keyword we're matching against by its first character. + var c = buffer.getByte(0); + String keyword; + String keywordUpper; + int peeking; + if (c == $t || c == $T) { + keyword = 'true'; + keywordUpper = 'TRUE'; + peeking = peekedTrue; + } else if (c == $f || c == $F) { + keyword = 'false'; + keywordUpper = 'FALSE'; + peeking = peekedFalse; + } else if (c == $n || c == $N) { + keyword = 'null'; + keywordUpper = 'NULL'; + peeking = peekedNull; + } else { + return peekedNone; + } + + // Confirm that chars [1..length) match the keyword. + var length = keyword.length; + for (var i = 1; i < length; i++) { + if (!buffer.request(i + 1)) { + return peekedNone; + } + c = buffer.getByte(i); + if (c != keyword[i].codeUnitAt(0) && c != keywordUpper[i].codeUnitAt(0)) { + return peekedNone; + } + } + + if (buffer.request(length + 1) && isLiteral(buffer.getByte(length))) { + return peekedNone; // Don't match trues, falsey or nullsoft! + } + + // We've found the keyword followed either by EOF or by a non-literal character. + buffer.skip(length); + return _peeked = peeking; + } + + int peekNumber() { + var value = 0; // Negative to accommodate Long.MIN_VALUE more easily. + var negative = false; + var fitsInLong = true; + var last = numberCharNone; + + var i = 0; + + for (; true; i++) { + if (!buffer.request(i + 1)) { + break; + } + + var c = buffer.getByte(i); + if (c == $dash) { + if (last == numberCharNone) { + negative = true; + last = numberCharSign; + continue; + } else if (last == numberCharExpE) { + last = numberCharExpSign; + continue; + } + return peekedNone; + } else if (c == $plus) { + if (last == numberCharExpE) { + last = numberCharExpSign; + continue; + } + return peekedNone; + } else if (c == $e || c == $E) { + if (last == numberCharDigit || last == numberCharFractionDigit) { + last = numberCharExpE; + continue; + } + return peekedNone; + } else if (c == $dot) { + if (last == numberCharDigit) { + last = numberCharDecimal; + continue; + } + return peekedNone; + } else { + if (c < $0 || c > $9) { + if (!isLiteral(c)) { + break; + } + return peekedNone; + } + if (last == numberCharSign || last == numberCharNone) { + value = -(c - $0); + last = numberCharDigit; + } else if (last == numberCharDigit) { + if (value == 0) { + return peekedNone; // Leading '0' prefix is not allowed (since it could be octal). + } + var newValue = value * 10 - (c - $0); + fitsInLong &= + value > minIncompleteInteger || + (value == minIncompleteInteger && newValue < value); + value = newValue; + } else if (last == numberCharDecimal) { + last = numberCharFractionDigit; + } else if (last == numberCharExpE || last == numberCharExpSign) { + last = numberCharExpDigit; + } + } + } + + // We've read a complete number. Decide if it's a PEEKED_LONG or a PEEKED_NUMBER. + if (last == numberCharDigit && + fitsInLong && + (value != longMinValue || negative) && + (value != 0 || !negative)) { + _peekedLong = negative ? value : -value; + buffer.skip(i); + return _peeked = peekedLong; + } else if (last == numberCharDigit || + last == numberCharFractionDigit || + last == numberCharExpDigit) { + _peekedNumberLength = i; + return _peeked = peekedNumber; + } else { + return peekedNone; + } + } + + bool isLiteral(int c) { + switch (c) { + case $slash: + case $backslash: + case $semicolon: + case $hash: + case $equal: + _checkLenient(); // fall-through + return false; + case $openBrace: + case $closeBrace: + case $openBracket: + case $closeBracket: + case $colon: + case $comma: + case $space: + case $tab: + case $ff: + case $cr: + case $lf: + return false; + default: + return true; + } + } + + @override + String nextName() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + late String result; + if (p == peekedUnquotedName) { + result = nextUnquotedValue(); + } else if (p == peekedDoubleQuotedName) { + result = _nextQuotedValue(doubleQuoteOrSlash); + } else if (p == peekedSingleQuotedName) { + result = _nextQuotedValue(singleQuoteOrSlash); + } else if (p == peekedBufferedName) { + result = _peekedString!; + } else { + throw JsonDataException( + 'Expected a name but was ${peek()} at path ${getPath()}', + ); + } + _peeked = peekedNone; + pathNames[stackSize - 1] = result; + return result; + } + + @override + int selectName(JsonReaderOptions options) { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p < peekedSingleQuotedName || p > peekedBufferedName) { + return -1; + } + if (p == peekedBufferedName) { + return _findName(_peekedString, options); + } + + var result = buffer.select(options.doubleQuoteSuffix); + if (result != -1) { + _peeked = peekedNone; + pathNames[stackSize - 1] = options.strings[result]; + + return result; + } + + // The next name may be unnecessary escaped. Save the last recorded path name, so that we + // can restore the peek state in case we fail to find a match. + var lastPathName = pathNames[stackSize - 1]; + + var nextName = this.nextName(); + result = _findName(nextName, options); + + if (result == -1) { + _peeked = peekedBufferedName; + _peekedString = nextName; + // We can't push the path further, make it seem like nothing happened. + pathNames[stackSize - 1] = lastPathName; + } + + return result; + } + + @override + void skipName() { + if (failOnUnknown) { + throw JsonDataException( + 'Cannot skip unexpected ${peek()} at ${getPath()}', + ); + } + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedUnquotedName) { + skipUnquotedValue(); + } else if (p == peekedDoubleQuotedName) { + skipQuotedValue(doubleQuoteOrSlash); + } else if (p == peekedSingleQuotedName) { + skipQuotedValue(singleQuoteOrSlash); + } else if (p != peekedBufferedName) { + throw JsonDataException( + 'Expected a name but was ${peek()} at path ${getPath()}', + ); + } + _peeked = peekedNone; + pathNames[stackSize - 1] = 'null'; + } + + /// If {@code name} is in {@code options} this consumes it and returns its index. + /// Otherwise this returns -1 and no name is consumed. + int _findName(String? name, JsonReaderOptions options) { + for (var i = 0, size = options.strings.length; i < size; i++) { + if (name == options.strings[i]) { + _peeked = peekedNone; + pathNames[stackSize - 1] = name; + + return i; + } + } + return -1; + } + + @override + String nextString() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + String? result; + if (p == peekedUnquoted) { + result = nextUnquotedValue(); + } else if (p == peekedDoubleQuote) { + result = _nextQuotedValue(doubleQuoteOrSlash); + } else if (p == peekedSingleQuote) { + result = _nextQuotedValue(singleQuoteOrSlash); + } else if (p == peekedBuffered) { + result = _peekedString; + _peekedString = null; + } else if (p == peekedLong) { + result = _peekedLong.toString(); + } else if (p == peekedNumber) { + result = buffer.readUtf8(_peekedNumberLength); + } else { + throw JsonDataException( + 'Expected a string but was ${peek()} at path ${getPath()}', + ); + } + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return result!; + } + + @override + bool nextBoolean() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + if (p == peekedTrue) { + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return true; + } else if (p == peekedFalse) { + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return false; + } + throw JsonDataException( + 'Expected a boolean but was ${peek()} at path ${getPath()}', + ); + } + + @override + double nextDouble() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + + if (p == peekedLong) { + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return _peekedLong.toDouble(); + } + + if (p == peekedNumber) { + _peekedString = buffer.readUtf8(_peekedNumberLength); + } else if (p == peekedDoubleQuote) { + _peekedString = _nextQuotedValue(doubleQuoteOrSlash); + } else if (p == peekedSingleQuote) { + _peekedString = _nextQuotedValue(singleQuoteOrSlash); + } else if (p == peekedUnquoted) { + _peekedString = nextUnquotedValue(); + } else if (p != peekedBuffered) { + throw JsonDataException( + 'Expected a double but was ${peek()} at path ${getPath()}', + ); + } + + _peeked = peekedBuffered; + double result; + try { + result = double.parse(_peekedString!); + } on FormatException catch (_) { + throw JsonDataException( + 'Expected a double but was $_peekedString at path ${getPath()}', + ); + } + if (!lenient && (result.isNaN || result.isInfinite)) { + throw JsonEncodingException( + 'JSON forbids NaN and infinities: $result at path ${getPath()}', + ); + } + _peekedString = null; + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return result; + } + + /// Returns the string up to but not including {@code quote}, unescaping any character escape + /// sequences encountered along the way. The opening quote should have already been read. This + /// consumes the closing quote, but does not include it in the returned string. + /// + /// @throws IOException if any unicode escape sequences are malformed. + String _nextQuotedValue(List runTerminator) { + StringBuffer? builder; + while (true) { + var index = buffer.indexOfElement(runTerminator, 0); + if (index == -1) throw syntaxError('Unterminated string'); + + // If we've got an escape character, we're going to need a string builder. + if (buffer.getByte(index) == $backslash) { + builder ??= StringBuffer(); + builder.write(buffer.readUtf8(index)); + buffer.readByte(); // '\' + builder.writeCharCode(readEscapeCharacter()); + continue; + } + + // If it isn't the escape character, it's the quote. Return the string. + if (builder == null) { + var result = buffer.readUtf8(index); + buffer.readByte(); // Consume the quote character. + return result; + } else { + builder.write(buffer.readUtf8(index)); + buffer.readByte(); // Consume the quote character. + return builder.toString(); + } + } + } + + /// Returns an unquoted value as a string. */ + String nextUnquotedValue() { + var i = buffer.indexOfElement(unquotedStringTerminals, 0); + return i != -1 ? buffer.readUtf8(i) : buffer.readUtf8(buffer.size); + } + + void skipQuotedValue(List runTerminator) { + while (true) { + var index = buffer.indexOfElement(runTerminator, 0); + if (index == -1) throw syntaxError('Unterminated string'); + + if (buffer.getByte(index) == $backslash) { + buffer.skip(index + 1); + readEscapeCharacter(); + } else { + buffer.skip(index + 1); + return; + } + } + } + + void skipUnquotedValue() { + var i = buffer.indexOfElement(unquotedStringTerminals, 0); + buffer.skip(i != -1 ? i : buffer.size); + } + + @override + int nextInt() { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + + int result; + if (p == peekedLong) { + result = _peekedLong; + if (_peekedLong != result) { + // Make sure no precision was lost casting to 'int'. + throw JsonDataException( + 'Expected an int but was $_peekedLong at path ${getPath()}', + ); + } + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return result; + } + + if (p == peekedNumber) { + _peekedString = buffer.readUtf8(_peekedNumberLength); + } else if (p == peekedDoubleQuote || p == peekedSingleQuote) { + _peekedString = p == peekedDoubleQuote + ? _nextQuotedValue(doubleQuoteOrSlash) + : _nextQuotedValue(singleQuoteOrSlash); + try { + result = int.parse(_peekedString!); + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return result; + } on FormatException catch (_) { + // Fall back to parse as a double below. + } + } else if (p != peekedBuffered) { + throw JsonDataException( + 'Expected an int but was ${peek()} at path ${getPath()}', + ); + } + + _peeked = peekedBuffered; + double asDouble; + try { + asDouble = double.parse(_peekedString!); + } on FormatException catch (_) { + throw JsonDataException( + 'Expected an int but was $_peekedString at path ${getPath()}', + ); + } + result = asDouble.toInt(); + if (result != asDouble) { + // Make sure no precision was lost casting to 'int'. + throw JsonDataException( + 'Expected an int but was $_peekedString at path ${getPath()}', + ); + } + _peekedString = null; + _peeked = peekedNone; + pathIndices[stackSize - 1]++; + return result; + } + + @override + void close() { + _peeked = peekedNone; + scopes[0] = JsonScope.closed; + stackSize = 1; + buffer.clear(); + } + + @override + void skipValue() { + if (failOnUnknown) { + throw JsonDataException( + 'Cannot skip unexpected ${peek()} at ${getPath()}', + ); + } + var count = 0; + do { + var p = _peeked; + if (p == peekedNone) { + p = _doPeek(); + } + + if (p == peekedBeginArray) { + pushScope(JsonScope.emptyArray); + count++; + } else if (p == peekedBeginObject) { + pushScope(JsonScope.emptyObject); + count++; + } else if (p == peekedEndArray) { + count--; + if (count < 0) { + throw JsonDataException( + 'Expected a value but was ${peek()} at path ${getPath()}', + ); + } + stackSize--; + } else if (p == peekedEndObject) { + count--; + if (count < 0) { + throw JsonDataException( + 'Expected a value but was ${peek()} at path ${getPath()}', + ); + } + stackSize--; + } else if (p == peekedUnquotedName || p == peekedUnquoted) { + skipUnquotedValue(); + } else if (p == peekedDoubleQuote || p == peekedDoubleQuotedName) { + skipQuotedValue(doubleQuoteOrSlash); + } else if (p == peekedSingleQuote || p == peekedSingleQuotedName) { + skipQuotedValue(singleQuoteOrSlash); + } else if (p == peekedNumber) { + buffer.skip(_peekedNumberLength); + } else if (p == peekedEof) { + throw JsonDataException( + 'Expected a value but was ${peek()} at path ${getPath()}', + ); + } + _peeked = peekedNone; + } while (count != 0); + + pathIndices[stackSize - 1]++; + pathNames[stackSize - 1] = 'null'; + } + + /// Returns the next character in the stream that is neither whitespace nor a + /// part of a comment. When this returns, the returned character is always at + /// {buffer.getByte(0)}. + int _nextNonWhitespace(bool throwOnEof) { + // This code uses ugly local variables 'p' and 'l' representing the 'pos' + // and 'limit' fields respectively. Using locals rather than fields saves + // a few field reads for each whitespace character in a pretty-printed + // document, resulting in a 5% speedup. We need to flush 'p' to its field + // before any (potentially indirect) call to fillBuffer() and reread both + // 'p' and 'l' after any (potentially indirect) call to the same method. + var p = 0; + while (buffer.request(p + 1)) { + var c = buffer.getByte(p++); + if (c == $lf || c == $space || c == $cr || c == $tab) { + continue; + } + + buffer.skip(p - 1); + if (c == $slash) { + if (!buffer.request(2)) { + return c; + } + + _checkLenient(); + var peek = buffer.getByte(1); + switch (peek) { + case $asterisk: + // skip a /* c-style comment */ + buffer.readByte(); // '/' + buffer.readByte(); // '*' + if (!_skipToEndOfBlockComment()) { + throw syntaxError('Unterminated comment'); + } + p = 0; + continue; + + case $slash: + // skip a // end-of-line comment + buffer.readByte(); // '/' + buffer.readByte(); // '/' + _skipToEndOfLine(); + p = 0; + continue; + + default: + return c; + } + } else if (c == $hash) { + // Skip a # hash end-of-line comment. The JSON RFC doesn't specify this behaviour, but it's + // required to parse existing documents. + _checkLenient(); + _skipToEndOfLine(); + p = 0; + } else { + return c; + } + } + if (throwOnEof) { + throw StateError('End of input'); + } else { + return -1; + } + } + + void _checkLenient() { + if (!lenient) { + throw syntaxError( + 'Use JsonReader.setLenient(true) to accept malformed JSON', + ); + } + } + + /// Advances the position until after the next newline character. If the line + /// is terminated by "\r\n", the '\n' must be consumed as whitespace by the + /// caller. + void _skipToEndOfLine() { + var index = buffer.indexOfElement(lineFeedOrCarriageReturn, 0); + buffer.skip(index != -1 ? index + 1 : buffer.size); + } + + /// Skips through the next closing block comment. + bool _skipToEndOfBlockComment() { + var index = buffer.indexOfBytes(closingBlockComment, 0); + var found = index != -1; + buffer.skip(found ? index + closingBlockComment.length : buffer.size); + return found; + } + + @override + String toString() { + return 'JsonReader($buffer)'; + } + + /// Unescapes the character identified by the character or characters that immediately follow a + /// backslash. The backslash '\' should have already been read. This supports both unicode escapes + /// "u000A" and two-character escapes "\n". + /// + /// @throws IOException if any unicode escape sequences are malformed. + int readEscapeCharacter() { + if (!buffer.request(1)) { + throw syntaxError('Unterminated escape sequence'); + } + + var escaped = buffer.readByte(); + switch (escaped) { + case $u: + if (!buffer.request(4)) { + throw Exception('Unterminated escape sequence at path ${getPath()}'); + } + // Equivalent to Integer.parseInt(stringPool.get(buffer, pos, 4), 16); + var result = 0; + for (var i = 0, end = i + 4; i < end; i++) { + var c = buffer.getByte(i); + result <<= 4; + if (c >= $0 && c <= $9) { + result += c - $0; + } else if (c >= $a && c <= $f) { + result += c - $a + 10; + } else if (c >= $A && c <= $F) { + result += c - $A + 10; + } else { + throw syntaxError('\\u${buffer.readUtf8(4)}'); + } + } + buffer.skip(4); + return result; + + case $t: + return $tab; + + case $b: + return $bs; + + case $n: + return $lf; + + case $r: + return $cr; + + case $f: + return $ff; + + case $lf: + case $singleQuote: + case $doubleQuote: + case $backslash: + case $slash: + return escaped; + + default: + if (!lenient) throw syntaxError('Invalid escape sequence: \\$escaped'); + return escaped; + } + } +} diff --git a/lottie/lib/src/parser/offset_parser.dart b/lottie/lib/src/parser/offset_parser.dart new file mode 100644 index 0000000..bdc72c9 --- /dev/null +++ b/lottie/lib/src/parser/offset_parser.dart @@ -0,0 +1,23 @@ +import 'dart:ui'; +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +Offset offsetParser(JsonReader reader) { + var token = reader.peek(); + if (token == Token.beginArray) { + return JsonUtils.jsonToPoint(reader); + } else if (token == Token.beginObject) { + return JsonUtils.jsonToPoint(reader); + } else if (token == Token.number) { + // This is the case where the static value for a property is an array of numbers. + // We begin the array to see if we have an array of keyframes but it's just an array + // of static numbers instead. + var point = Offset(reader.nextDouble(), reader.nextDouble()); + while (reader.hasNext()) { + reader.skipValue(); + } + return point; + } else { + throw Exception('Cannot convert json to point. Next token is $token'); + } +} diff --git a/lottie/lib/src/parser/path_keyframe_parser.dart b/lottie/lib/src/parser/path_keyframe_parser.dart new file mode 100644 index 0000000..a9cba2c --- /dev/null +++ b/lottie/lib/src/parser/path_keyframe_parser.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; +import '../animation/keyframe/path_keyframe.dart'; +import '../composition.dart'; +import 'keyframe_parser.dart'; +import 'moshi/json_reader.dart'; +import 'path_parser.dart'; + +class PathKeyframeParser { + PathKeyframeParser._(); + + static PathKeyframe parse(JsonReader reader, LottieComposition composition) { + var animated = reader.peek() == Token.beginObject; + var keyframe = KeyframeParser.parse( + reader, + composition, + pathParser, + animated: animated, + ); + + return PathKeyframe(composition, keyframe); + } +} diff --git a/lottie/lib/src/parser/path_parser.dart b/lottie/lib/src/parser/path_parser.dart new file mode 100644 index 0000000..dbc6106 --- /dev/null +++ b/lottie/lib/src/parser/path_parser.dart @@ -0,0 +1,7 @@ +import 'dart:ui'; +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +Offset pathParser(JsonReader reader) { + return JsonUtils.jsonToPoint(reader); +} diff --git a/lottie/lib/src/parser/polysar_shape_parser.dart b/lottie/lib/src/parser/polysar_shape_parser.dart new file mode 100644 index 0000000..2c360e9 --- /dev/null +++ b/lottie/lib/src/parser/polysar_shape_parser.dart @@ -0,0 +1,98 @@ +import 'dart:ui'; +import '../composition.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_value.dart'; +import '../model/content/polystar_shape.dart'; +import 'animatable_path_value_parser.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class PolystarShapeParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'sy', + 'pt', + 'p', + 'r', + 'or', + 'os', + 'ir', + 'is', + 'hd', + 'd', + ]); + + PolystarShapeParser._(); + + static PolystarShape parse( + JsonReader reader, + LottieComposition composition, { + required int d, + }) { + String? name; + PolystarShapeType? type; + late AnimatableDoubleValue points; + late AnimatableValue position; + late AnimatableDoubleValue rotation; + late AnimatableDoubleValue outerRadius; + late AnimatableDoubleValue outerRoundedness; + AnimatableDoubleValue? innerRadius; + AnimatableDoubleValue? innerRoundedness; + var hidden = false; + var reversed = d == 3; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + type = PolystarShapeType.forValue(reader.nextInt()); + case 2: + points = AnimatableValueParser.parseFloat(reader, composition); + case 3: + position = AnimatablePathValueParser.parseSplitPath( + reader, + composition, + ); + case 4: + rotation = AnimatableValueParser.parseFloat(reader, composition); + case 5: + outerRadius = AnimatableValueParser.parseFloat(reader, composition); + case 6: + outerRoundedness = AnimatableValueParser.parseFloat( + reader, + composition, + ); + case 7: + innerRadius = AnimatableValueParser.parseFloat(reader, composition); + case 8: + innerRoundedness = AnimatableValueParser.parseFloat( + reader, + composition, + ); + case 9: + hidden = reader.nextBoolean(); + case 10: + // "d" is 2 for normal and 3 for reversed. + reversed = reader.nextInt() == 3; + default: + reader.skipName(); + reader.skipValue(); + } + } + + return PolystarShape( + name: name, + type: type, + points: points, + position: position, + rotation: rotation, + innerRadius: innerRadius, + outerRadius: outerRadius, + innerRoundedness: innerRoundedness, + outerRoundedness: outerRoundedness, + hidden: hidden, + isReversed: reversed, + ); + } +} diff --git a/lottie/lib/src/parser/rectangle_shape_parser.dart b/lottie/lib/src/parser/rectangle_shape_parser.dart new file mode 100644 index 0000000..e257aee --- /dev/null +++ b/lottie/lib/src/parser/rectangle_shape_parser.dart @@ -0,0 +1,59 @@ +import 'dart:ui'; +import '../../lottie.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_value.dart'; +import '../model/content/rectangle_shape.dart'; +import 'animatable_path_value_parser.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class RectangleShapeParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'p', + 's', + 'r', + 'hd', + ]); + + RectangleShapeParser._(); + + static RectangleShape parse( + JsonReader reader, + LottieComposition composition, + ) { + String? name; + AnimatableValue? position; + AnimatableValue? size; + AnimatableDoubleValue? roundedness; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + position = AnimatablePathValueParser.parseSplitPath( + reader, + composition, + ); + case 2: + size = AnimatableValueParser.parsePoint(reader, composition); + case 3: + roundedness = AnimatableValueParser.parseFloat(reader, composition); + case 4: + hidden = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + + return RectangleShape( + name: name, + position: position!, + size: size!, + cornerRadius: roundedness!, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/repeat_parser.dart b/lottie/lib/src/parser/repeat_parser.dart new file mode 100644 index 0000000..893c7cd --- /dev/null +++ b/lottie/lib/src/parser/repeat_parser.dart @@ -0,0 +1,52 @@ +import '../../lottie.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_transform.dart'; +import '../model/content/repeater.dart'; +import 'animatable_transform_parser.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class RepeaterParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'c', + 'o', + 'tr', + 'hd', + ]); + + RepeaterParser._(); + + static Repeater parse(JsonReader reader, LottieComposition composition) { + String? name; + AnimatableDoubleValue? copies; + AnimatableDoubleValue? offset; + AnimatableTransform? transform; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + copies = AnimatableValueParser.parseFloat(reader, composition); + case 2: + offset = AnimatableValueParser.parseFloat(reader, composition); + case 3: + transform = AnimatableTransformParser.parse(reader, composition); + case 4: + hidden = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + + return Repeater( + name: name, + copies: copies!, + offset: offset!, + transform: transform!, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/rounded_corners_parser.dart b/lottie/lib/src/parser/rounded_corners_parser.dart new file mode 100644 index 0000000..d5a8291 --- /dev/null +++ b/lottie/lib/src/parser/rounded_corners_parser.dart @@ -0,0 +1,37 @@ +import '../composition.dart'; +import '../model/animatable/animatable_value.dart'; +import '../model/content/rounded_corners.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class RoundedCornersParser { + static final _names = JsonReaderOptions.of([ + 'nm', // 0 + 'r', // 1 + 'hd', // 1 + ]); + + static RoundedCorners? parse( + JsonReader reader, + LottieComposition composition, + ) { + String? name; + AnimatableValue? cornerRadius; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: //nm + name = reader.nextString(); + case 1: // r + cornerRadius = AnimatableValueParser.parseFloat(reader, composition); + case 2: // hd + hidden = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + + return hidden ? null : RoundedCorners(name ?? '', cornerRadius!); + } +} diff --git a/lottie/lib/src/parser/scale_xy_parser.dart b/lottie/lib/src/parser/scale_xy_parser.dart new file mode 100644 index 0000000..2957bc0 --- /dev/null +++ b/lottie/lib/src/parser/scale_xy_parser.dart @@ -0,0 +1,18 @@ +import 'dart:ui'; +import 'moshi/json_reader.dart'; + +Offset scaleXYParser(JsonReader reader) { + var isArray = reader.peek() == Token.beginArray; + if (isArray) { + reader.beginArray(); + } + var sx = reader.nextDouble(); + var sy = reader.nextDouble(); + while (reader.hasNext()) { + reader.skipValue(); + } + if (isArray) { + reader.endArray(); + } + return Offset(sx / 100.0, sy / 100.0); +} diff --git a/lottie/lib/src/parser/shape_data_parser.dart b/lottie/lib/src/parser/shape_data_parser.dart new file mode 100644 index 0000000..4254a5c --- /dev/null +++ b/lottie/lib/src/parser/shape_data_parser.dart @@ -0,0 +1,93 @@ +import 'dart:ui'; +import '../model/content/shape_data.dart'; +import '../model/cubic_curve_data.dart'; +import 'json_utils.dart'; +import 'moshi/json_reader.dart'; + +final JsonReaderOptions _names = JsonReaderOptions.of(['c', 'v', 'i', 'o']); + +ShapeData shapeDataParser(JsonReader reader) { + // Sometimes the points data is in a array of length 1. Sometimes the data is at the top + // level. + if (reader.peek() == Token.beginArray) { + reader.beginArray(); + } + + var closed = false; + List? pointsArray; + List? inTangents; + List? outTangents; + reader.beginObject(); + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + closed = reader.nextBoolean(); + case 1: + pointsArray = JsonUtils.jsonToPoints(reader); + case 2: + inTangents = JsonUtils.jsonToPoints(reader); + case 3: + outTangents = JsonUtils.jsonToPoints(reader); + default: + reader.skipName(); + reader.skipValue(); + } + } + + reader.endObject(); + + if (reader.peek() == Token.endArray) { + reader.endArray(); + } + + if (pointsArray == null || inTangents == null || outTangents == null) { + throw Exception('Shape data was missing information.'); + } + + if (pointsArray.isEmpty) { + return ShapeData( + [], + initialPoint: Offset.zero, + closed: false, + ); + } + + var length = pointsArray.length; + var vertex = pointsArray[0]; + var initialPoint = vertex; + var curves = []; + + for (var i = 1; i < length; i++) { + vertex = pointsArray[i]; + var previousVertex = pointsArray[i - 1]; + var cp1 = outTangents[i - 1]; + var cp2 = inTangents[i]; + var shapeCp1 = previousVertex + cp1; + var shapeCp2 = vertex + cp2; + curves.add( + CubicCurveData() + ..controlPoint1 = shapeCp1 + ..controlPoint2 = shapeCp2 + ..vertex = vertex, + ); + } + + if (closed) { + vertex = pointsArray[0]; + var previousVertex = pointsArray[length - 1]; + var cp1 = outTangents[length - 1]; + var cp2 = inTangents[0]; + + var shapeCp1 = previousVertex + cp1; + var shapeCp2 = vertex + cp2; + + curves.add( + CubicCurveData() + ..controlPoint1 = shapeCp1 + ..controlPoint2 = shapeCp2 + ..vertex = vertex, + ); + } + return ShapeData(curves, initialPoint: initialPoint, closed: closed); +} diff --git a/lottie/lib/src/parser/shape_fill_parser.dart b/lottie/lib/src/parser/shape_fill_parser.dart new file mode 100644 index 0000000..74a10c2 --- /dev/null +++ b/lottie/lib/src/parser/shape_fill_parser.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import '../../lottie.dart'; +import '../model/animatable/animatable_color_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/content/shape_fill.dart'; +import '../value/keyframe.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class ShapeFillParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'c', + 'o', + 'fillEnabled', + 'r', + 'hd', + ]); + + ShapeFillParser._(); + + static ShapeFill parse(JsonReader reader, LottieComposition composition) { + AnimatableColorValue? color; + var fillEnabled = false; + AnimatableIntegerValue? opacity; + String? name; + var fillTypeInt = 1; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + color = AnimatableValueParser.parseColor(reader, composition); + case 2: + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 3: + fillEnabled = reader.nextBoolean(); + case 4: + fillTypeInt = reader.nextInt(); + case 5: + hidden = reader.nextBoolean(); + default: + reader.skipName(); + reader.skipValue(); + } + } + + var fillType = fillTypeInt == 1 + ? PathFillType.nonZero + : PathFillType.evenOdd; + // Telegram sometimes omits opacity. + // https://github.com/airbnb/lottie-android/issues/1600 + opacity ??= AnimatableIntegerValue.fromKeyframes([ + Keyframe.nonAnimated(100), + ]); + return ShapeFill( + name: name, + fillEnabled: fillEnabled, + fillType: fillType, + color: color, + opacity: opacity, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/shape_group_parser.dart b/lottie/lib/src/parser/shape_group_parser.dart new file mode 100644 index 0000000..c65c8e2 --- /dev/null +++ b/lottie/lib/src/parser/shape_group_parser.dart @@ -0,0 +1,42 @@ +import '../composition.dart'; +import '../model/content/content_model.dart'; +import '../model/content/shape_group.dart'; +import 'content_model_parser.dart'; +import 'moshi/json_reader.dart'; + +class ShapeGroupParser { + ShapeGroupParser._(); + + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'hd', + 'it', + ]); + static ShapeGroup parse(JsonReader reader, LottieComposition composition) { + String? name; + var hidden = false; + var items = []; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + hidden = reader.nextBoolean(); + case 2: + reader.beginArray(); + while (reader.hasNext()) { + var newItem = ContentModelParser.parse(reader, composition); + if (newItem != null) { + items.add(newItem); + } + } + reader.endArray(); + default: + reader.skipValue(); + } + } + + return ShapeGroup(name, items, hidden: hidden); + } +} diff --git a/lottie/lib/src/parser/shape_path_parser.dart b/lottie/lib/src/parser/shape_path_parser.dart new file mode 100644 index 0000000..14915bf --- /dev/null +++ b/lottie/lib/src/parser/shape_path_parser.dart @@ -0,0 +1,40 @@ +import '../../lottie.dart'; +import '../model/animatable/animatable_shape_value.dart'; +import '../model/content/shape_path.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class ShapePathParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'ind', + 'ks', + 'hd', + ]); + + ShapePathParser._(); + + static ShapePath parse(JsonReader reader, LottieComposition composition) { + String? name; + var ind = 0; + AnimatableShapeValue? shape; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + ind = reader.nextInt(); + case 2: + shape = AnimatableValueParser.parseShapeData(reader, composition); + case 3: + hidden = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + + return ShapePath(name: name, index: ind, shapePath: shape!, hidden: hidden); + } +} diff --git a/lottie/lib/src/parser/shape_stroke_parser.dart b/lottie/lib/src/parser/shape_stroke_parser.dart new file mode 100644 index 0000000..27938e0 --- /dev/null +++ b/lottie/lib/src/parser/shape_stroke_parser.dart @@ -0,0 +1,118 @@ +import '../composition.dart'; +import '../model/animatable/animatable_color_value.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/animatable/animatable_integer_value.dart'; +import '../model/content/shape_stroke.dart'; +import '../value/keyframe.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class ShapeStrokeParser { + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 'nm', + 'c', + 'w', + 'o', + 'lc', + 'lj', + 'ml', + 'hd', + 'd', + ]); + static final JsonReaderOptions _dashPatternNames = JsonReaderOptions.of([ + 'n', + 'v', + ]); + + ShapeStrokeParser._(); + + static ShapeStroke parse(JsonReader reader, LottieComposition composition) { + String? name; + AnimatableColorValue? color; + AnimatableDoubleValue? width; + AnimatableIntegerValue? opacity; + LineCapType? capType; + LineJoinType? joinType; + AnimatableDoubleValue? offset; + var miterLimit = 0.0; + var hidden = false; + + var lineDashPattern = []; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + name = reader.nextString(); + case 1: + color = AnimatableValueParser.parseColor(reader, composition); + case 2: + width = AnimatableValueParser.parseFloat(reader, composition); + case 3: + opacity = AnimatableValueParser.parseInteger(reader, composition); + case 4: + capType = LineCapType.values[reader.nextInt() - 1]; + case 5: + joinType = LineJoinType.values[reader.nextInt() - 1]; + case 6: + miterLimit = reader.nextDouble(); + case 7: + hidden = reader.nextBoolean(); + case 8: + reader.beginArray(); + while (reader.hasNext()) { + String? n; + AnimatableDoubleValue? val; + + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.selectName(_dashPatternNames)) { + case 0: + n = reader.nextString(); + case 1: + val = AnimatableValueParser.parseFloat(reader, composition); + default: + reader.skipName(); + reader.skipValue(); + } + } + reader.endObject(); + + switch (n) { + case 'o': + offset = val; + case 'd': + case 'g': + composition.hasDashPattern = true; + lineDashPattern.add(val!); + } + } + reader.endArray(); + + if (lineDashPattern.length == 1) { + // If there is only 1 value then it is assumed to be equal parts on and off. + lineDashPattern.add(lineDashPattern.first); + } + default: + reader.skipValue(); + } + } + + // Telegram sometimes omits opacity. + // https://github.com/airbnb/lottie-android/issues/1600 + opacity ??= AnimatableIntegerValue.fromKeyframes([ + Keyframe.nonAnimated(100), + ]); + return ShapeStroke( + name: name, + dashOffset: offset, + lineDashPattern: lineDashPattern, + color: color!, + opacity: opacity, + width: width!, + capType: capType, + joinType: joinType, + miterLimit: miterLimit, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/shape_trim_path_parser.dart b/lottie/lib/src/parser/shape_trim_path_parser.dart new file mode 100644 index 0000000..1cf4b92 --- /dev/null +++ b/lottie/lib/src/parser/shape_trim_path_parser.dart @@ -0,0 +1,53 @@ +import '../../lottie.dart'; +import '../model/animatable/animatable_double_value.dart'; +import '../model/content/shape_trim_path.dart'; +import 'animatable_value_parser.dart'; +import 'moshi/json_reader.dart'; + +class ShapeTrimPathParser { + ShapeTrimPathParser._(); + static final JsonReaderOptions _names = JsonReaderOptions.of([ + 's', + 'e', + 'o', + 'nm', + 'm', + 'hd', + ]); + static ShapeTrimPath parse(JsonReader reader, LottieComposition composition) { + String? name; + ShapeTrimPathType? type; + AnimatableDoubleValue? start; + AnimatableDoubleValue? end; + AnimatableDoubleValue? offset; + var hidden = false; + + while (reader.hasNext()) { + switch (reader.selectName(_names)) { + case 0: + start = AnimatableValueParser.parseFloat(reader, composition); + case 1: + end = AnimatableValueParser.parseFloat(reader, composition); + case 2: + offset = AnimatableValueParser.parseFloat(reader, composition); + case 3: + name = reader.nextString(); + case 4: + type = ShapeTrimPath.typeForId(reader.nextInt()); + case 5: + hidden = reader.nextBoolean(); + default: + reader.skipValue(); + } + } + + return ShapeTrimPath( + name: name, + type: type ?? ShapeTrimPathType.simultaneously, + start: start!, + end: end!, + offset: offset!, + hidden: hidden, + ); + } +} diff --git a/lottie/lib/src/parser/value_parser.dart b/lottie/lib/src/parser/value_parser.dart new file mode 100644 index 0000000..6761d0d --- /dev/null +++ b/lottie/lib/src/parser/value_parser.dart @@ -0,0 +1,3 @@ +import 'moshi/json_reader.dart'; + +typedef ValueParser = V Function(JsonReader reader); diff --git a/lottie/lib/src/performance_tracker.dart b/lottie/lib/src/performance_tracker.dart new file mode 100644 index 0000000..f8b1211 --- /dev/null +++ b/lottie/lib/src/performance_tracker.dart @@ -0,0 +1,67 @@ +import 'package:flutter/foundation.dart'; +import 'utils/mean_calculator.dart'; +import 'utils/pair.dart'; + +class PerformanceTracker { + final _frameListeners = {}; + final _layerRenderTimes = {}; + + bool enabled = false; + + void recordRenderTime(String layerName, double millis) { + if (!enabled) return; + + if (!_layerRenderTimes.containsKey(layerName)) { + _layerRenderTimes[layerName] = MeanCalculator(); + } + + final calculator = _layerRenderTimes[layerName]!; + + calculator.add(millis); + + if (layerName == '__container') { + for (var listener in _frameListeners) { + listener.onFrameRendered(millis); + } + } + } + + void addFrameListener(FrameListener listener) { + _frameListeners.add(listener); + } + + void removeFrameListener(FrameListener listener) { + _frameListeners.remove(listener); + } + + void clearRenderTimes() { + _layerRenderTimes.clear(); + } + + void logRenderTimes() { + if (!enabled) return; + + final sortedRenderTimes = getSortedRenderTimes(); + + debugPrint('[Lottie] Render Times:'); + for (var layer in sortedRenderTimes) { + debugPrint('[Lottie]\t\t${layer.first}: ${layer.second}ms'); + } + } + + List> getSortedRenderTimes() { + if (!enabled) return []; + + final sortedRenderTimes = _layerRenderTimes.entries + .map((e) => Pair(e.key, e.value.mean)) + .toList(); + + sortedRenderTimes.sort((p1, p2) => p1.second.compareTo(p2.second)); + + return sortedRenderTimes; + } +} + +abstract class FrameListener { + void onFrameRendered(double renderTimeMs); +} diff --git a/lottie/lib/src/providers/asset_provider.dart b/lottie/lib/src/providers/asset_provider.dart new file mode 100644 index 0000000..cd043da --- /dev/null +++ b/lottie/lib/src/providers/asset_provider.dart @@ -0,0 +1,103 @@ +import 'dart:async'; +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:path/path.dart' as p; +import '../composition.dart'; +import '../lottie_image_asset.dart'; +import 'load_fonts.dart'; +import 'load_image.dart'; +import 'lottie_provider.dart'; + +@immutable +class AssetLottie extends LottieProvider { + AssetLottie( + this.assetName, { + this.bundle, + this.package, + super.imageProviderFactory, + super.decoder, + super.backgroundLoading, + }); + + final String assetName; + String get keyName => + package == null ? assetName : 'packages/$package/$assetName'; + + final AssetBundle? bundle; + + final String? package; + + @override + Future load({BuildContext? context}) { + return sharedLottieCache.putIfAbsent(this, () async { + final finalContext = context; + final chosenBundle = + bundle ?? + (finalContext != null + ? DefaultAssetBundle.of(finalContext) + : rootBundle); + + var data = await chosenBundle.load(keyName); + + LottieComposition composition; + if (backgroundLoading) { + composition = await compute(parseJsonBytes, ( + data.buffer.asUint8List(), + decoder, + )); + } else { + composition = await LottieComposition.fromByteData( + data, + decoder: decoder, + ); + } + + for (var image in composition.images.values) { + image.loadedImage ??= await _loadImage(composition, image); + } + + await ensureLoadedFonts(composition); + + return composition; + }); + } + + Future _loadImage( + LottieComposition composition, + LottieImageAsset lottieImage, + ) { + var imageProvider = getImageProvider(lottieImage); + + if (imageProvider == null) { + var imageAssetPath = p.url.join( + p.dirname(assetName), + lottieImage.dirName, + lottieImage.fileName, + ); + imageProvider = AssetImage( + imageAssetPath, + bundle: bundle, + package: package, + ); + } + + return loadImage(composition, lottieImage, imageProvider); + } + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) return false; + return other is AssetLottie && + other.keyName == keyName && + other.bundle == bundle && + other.decoder == decoder; + } + + @override + int get hashCode => Object.hash(keyName, bundle); + + @override + String toString() => '$runtimeType(bundle: $bundle, name: "$keyName")'; +} diff --git a/lottie/lib/src/providers/file_provider.dart b/lottie/lib/src/providers/file_provider.dart new file mode 100644 index 0000000..addc778 --- /dev/null +++ b/lottie/lib/src/providers/file_provider.dart @@ -0,0 +1 @@ +export 'file_provider_no_io.dart' if (dart.library.io) 'file_provider_io.dart'; diff --git a/lottie/lib/src/providers/file_provider_io.dart b/lottie/lib/src/providers/file_provider_io.dart new file mode 100644 index 0000000..706213c --- /dev/null +++ b/lottie/lib/src/providers/file_provider_io.dart @@ -0,0 +1,83 @@ +import 'dart:io' as io; +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:path/path.dart' as p; +import '../composition.dart'; +import '../lottie_image_asset.dart'; +import 'load_fonts.dart'; +import 'load_image.dart'; +import 'lottie_provider.dart'; + +@immutable +class FileLottie extends LottieProvider { + FileLottie( + Object file, { + super.imageProviderFactory, + super.decoder, + super.backgroundLoading, + }) : file = file as io.File, + assert( + !kIsWeb, + 'Lottie.file is not supported on Flutter Web. ' + 'Consider using either Lottie.asset or Lottie.network instead.', + ); + + final io.File file; + + @override + Future load({BuildContext? context}) { + return sharedLottieCache.putIfAbsent(this, () async { + LottieComposition composition; + var args = (file, decoder); + if (backgroundLoading) { + composition = await compute(_loadFileAndParse, args); + } else { + composition = await _loadFileAndParse(args); + } + + for (var image in composition.images.values) { + image.loadedImage ??= await _loadImage(composition, image); + } + + await ensureLoadedFonts(composition); + + return composition; + }); + } + + Future _loadImage( + LottieComposition composition, + LottieImageAsset lottieImage, + ) { + var imageProvider = getImageProvider(lottieImage); + + var imagePath = p.url.join( + p.dirname(file.path), + lottieImage.dirName, + lottieImage.fileName, + ); + imageProvider ??= FileImage(io.File(imagePath)); + + return loadImage(composition, lottieImage, imageProvider); + } + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) return false; + return other is FileLottie && file.path == other.file.path; + } + + @override + int get hashCode => file.hashCode; + + @override + String toString() => '$runtimeType(file: ${file.path})'; +} + +Future _loadFileAndParse( + (io.File, LottieDecoder?) args, +) async { + var bytes = await args.$1.readAsBytes(); + return await LottieComposition.fromBytes(bytes, decoder: args.$2); +} diff --git a/lottie/lib/src/providers/file_provider_no_io.dart b/lottie/lib/src/providers/file_provider_no_io.dart new file mode 100644 index 0000000..0efae54 --- /dev/null +++ b/lottie/lib/src/providers/file_provider_no_io.dart @@ -0,0 +1,27 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import '../composition.dart'; +import 'lottie_provider.dart'; + +@immutable +class FileLottie extends LottieProvider { + FileLottie( + this.file, { + super.imageProviderFactory, + super.decoder, + super.backgroundLoading, + }) : assert( + !kIsWeb, + 'Lottie.file is not supported on Flutter Web. ' + 'Consider using either Lottie.asset or Lottie.network instead.', + ); + + final Object file; + + @override + Future load({BuildContext? context}) { + throw UnimplementedError( + 'FileLottie provider is not supported on Web platform', + ); + } +} diff --git a/lottie/lib/src/providers/load_fonts.dart b/lottie/lib/src/providers/load_fonts.dart new file mode 100644 index 0000000..9a717c8 --- /dev/null +++ b/lottie/lib/src/providers/load_fonts.dart @@ -0,0 +1,11 @@ +import 'dart:ui'; +import '../composition.dart'; + +Future ensureLoadedFonts(LottieComposition composition) async { + var fonts = FontToLoad.getAndClear(composition); + if (fonts != null) { + for (var font in fonts) { + await loadFontFromList(font.bytes, fontFamily: font.family); + } + } +} diff --git a/lottie/lib/src/providers/load_image.dart b/lottie/lib/src/providers/load_image.dart new file mode 100644 index 0000000..dbd6039 --- /dev/null +++ b/lottie/lib/src/providers/load_image.dart @@ -0,0 +1,40 @@ +import 'dart:async'; +import 'dart:ui' as ui; +import 'package:flutter/widgets.dart'; +import '../composition.dart'; +import '../lottie_image_asset.dart'; + +typedef LottieImageProviderFactory = ImageProvider? Function(LottieImageAsset); + +Future loadImage( + LottieComposition composition, + LottieImageAsset lottieImage, + ImageProvider provider, +) { + var completer = Completer(); + var imageStream = provider.resolve(ImageConfiguration.empty); + late ImageStreamListener listener; + listener = ImageStreamListener( + (image, synchronousLoaded) { + imageStream.removeListener(listener); + + completer.complete(image.image); + }, + onError: (dynamic e, _) { + imageStream.removeListener(listener); + + composition.addWarning('Failed to load image ${lottieImage.id}: $e'); + completer.complete(); + }, + ); + imageStream.addListener(listener); + + return completer.future; +} + +ImageProvider? fromDataUri(String filePath) { + if (filePath.startsWith('data:')) { + return MemoryImage(Uri.parse(filePath).data!.contentAsBytes()); + } + return null; +} diff --git a/lottie/lib/src/providers/lottie_provider.dart b/lottie/lib/src/providers/lottie_provider.dart new file mode 100644 index 0000000..451cdab --- /dev/null +++ b/lottie/lib/src/providers/lottie_provider.dart @@ -0,0 +1,138 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import '../../lottie.dart'; +import 'load_image.dart'; + +abstract class LottieProvider { + LottieProvider({ + this.imageProviderFactory, + this.decoder, + bool? backgroundLoading, + }) : backgroundLoading = backgroundLoading ?? false; + + final LottieImageProviderFactory? imageProviderFactory; + + final LottieDecoder? decoder; + + final bool backgroundLoading; + + ImageProvider? getImageProvider(LottieImageAsset lottieImage) { + var imageProvider = fromDataUri(lottieImage.fileName); + if (imageProvider == null && imageProviderFactory != null) { + imageProvider = imageProviderFactory!(lottieImage); + } + return imageProvider; + } + + Future load({BuildContext? context}); +} + +Future parseJsonBytes( + (Uint8List, LottieDecoder?) args, +) async { + return LottieComposition.fromBytes(args.$1, decoder: args.$2); +} + +class LottieCache { + final Map> _pending = + >{}; + final Map _cache = {}; + + /// Maximum number of entries to store in the cache. + /// + /// Once this many entries have been cached, the least-recently-used entry is + /// evicted when adding a new entry. + int get maximumSize => _maximumSize; + int _maximumSize = 1000; + + /// Changes the maximum cache size. + /// + /// If the new size is smaller than the current number of elements, the + /// extraneous elements are evicted immediately. Setting this to zero and then + /// returning it to its original value will therefore immediately clear the + /// cache. + set maximumSize(int value) { + assert(value >= 0); + if (value == maximumSize) { + return; + } + _maximumSize = value; + if (maximumSize == 0) { + clear(); + } else { + while (_cache.length > maximumSize) { + _cache.remove(_cache.keys.first); + } + } + } + + /// Evicts all entries from the cache. + /// + /// This is useful if, for instance, the root asset bundle has been updated + /// and therefore new images must be obtained. + void clear() { + _cache.clear(); + } + + /// Evicts a single entry from the cache, returning true if successful. + bool evict(Object key) { + return _cache.remove(key) != null; + } + + /// Returns the previously cached [LottieComposition] for the given key, if available; + /// if not, calls the given callback to obtain it first. In either case, the + /// key is moved to the "most recently used" position. + /// + /// The arguments must not be null. The `loader` cannot return null. + Future putIfAbsent( + Object key, + Future Function() loader, + ) { + var pendingResult = _pending[key]; + if (pendingResult != null) { + return pendingResult; + } + + var result = _cache[key]; + if (result != null) { + // Remove the provider from the list so that we can put it back in below + // and thus move it to the end of the list. + _cache.remove(key); + } else { + if (_cache.length == maximumSize && maximumSize > 0) { + _cache.remove(_cache.keys.first); + } + pendingResult = loader(); + _pending[key] = pendingResult; + pendingResult + .then((LottieComposition data) { + _pending.remove(key); + _add(key, data); + + result = data; // in case it was a synchronous future. + }) + .catchError((Object? e) { + _pending.remove(key); + }); + } + if (result != null) { + _add(key, result!); + return SynchronousFuture(result!); + } + assert(_cache.length <= maximumSize); + return pendingResult!; + } + + void _add(Object key, LottieComposition result) { + if (maximumSize > 0) { + assert(_cache.length < maximumSize); + _cache[key] = result; + } + assert(_cache.length <= maximumSize); + } + + /// The number of entries in the cache. + int get count => _cache.length; +} + +final sharedLottieCache = LottieCache(); diff --git a/lottie/lib/src/providers/memory_provider.dart b/lottie/lib/src/providers/memory_provider.dart new file mode 100644 index 0000000..eb23fac --- /dev/null +++ b/lottie/lib/src/providers/memory_provider.dart @@ -0,0 +1,70 @@ +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:path/path.dart' as p; +import '../composition.dart'; +import '../lottie_image_asset.dart'; +import 'load_fonts.dart'; +import 'load_image.dart'; +import 'lottie_provider.dart'; + +@immutable +class MemoryLottie extends LottieProvider { + MemoryLottie( + this.bytes, { + super.imageProviderFactory, + super.decoder, + super.backgroundLoading, + }); + + final Uint8List bytes; + + @override + Future load({BuildContext? context}) { + return sharedLottieCache.putIfAbsent(this, () async { + LottieComposition composition; + if (backgroundLoading) { + composition = await compute(parseJsonBytes, (bytes, decoder)); + } else { + composition = await LottieComposition.fromBytes( + bytes, + decoder: decoder, + ); + } + for (var image in composition.images.values) { + image.loadedImage ??= await _loadImage(composition, image); + } + + await ensureLoadedFonts(composition); + + return composition; + }); + } + + Future _loadImage( + LottieComposition composition, + LottieImageAsset lottieImage, + ) { + var imageProvider = getImageProvider(lottieImage); + + imageProvider ??= AssetImage( + p.join(lottieImage.dirName, lottieImage.fileName), + ); + + return loadImage(composition, lottieImage, imageProvider); + } + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) return false; + + //TODO(xha): compare bytes content + return other is MemoryLottie && other.bytes == bytes; + } + + @override + int get hashCode => bytes.hashCode; + + @override + String toString() => '$runtimeType(bytes: ${bytes.length})'; +} diff --git a/lottie/lib/src/providers/network_provider.dart b/lottie/lib/src/providers/network_provider.dart new file mode 100644 index 0000000..0d6321a --- /dev/null +++ b/lottie/lib/src/providers/network_provider.dart @@ -0,0 +1,92 @@ +import 'dart:async'; +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:http/http.dart' as http; +import 'package:path/path.dart' as p; +import '../composition.dart'; +import '../lottie_image_asset.dart'; +import 'load_fonts.dart'; +import 'load_image.dart'; +import 'lottie_provider.dart'; + +@immutable +class NetworkLottie extends LottieProvider { + NetworkLottie( + this.url, { + this.client, + this.headers, + super.imageProviderFactory, + super.decoder, + super.backgroundLoading, + }); + + final http.Client? client; + final String url; + final Map? headers; + + @override + Future load({BuildContext? context}) { + return sharedLottieCache.putIfAbsent(this, () async { + var resolved = Uri.base.resolve(url); + + var client = this.client ?? http.Client(); + try { + var bytes = await client.readBytes(resolved, headers: headers); + + LottieComposition composition; + if (backgroundLoading) { + composition = await compute(parseJsonBytes, (bytes, decoder)); + } else { + composition = await LottieComposition.fromBytes( + bytes, + decoder: decoder, + ); + } + + for (var image in composition.images.values) { + image.loadedImage ??= await _loadImage(resolved, composition, image); + } + + await ensureLoadedFonts(composition); + + return composition; + } finally { + if (this.client == null) { + client.close(); + } + } + }); + } + + Future _loadImage( + Uri jsonUri, + LottieComposition composition, + LottieImageAsset lottieImage, + ) { + var imageProvider = getImageProvider(lottieImage); + + if (imageProvider == null) { + var imageUrl = jsonUri.resolve( + p.url.join(lottieImage.dirName, lottieImage.fileName), + ); + imageProvider = NetworkImage(imageUrl.toString()); + } + + return loadImage(composition, lottieImage, imageProvider); + } + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) return false; + return other is NetworkLottie && + other.url == url && + other.decoder == decoder; + } + + @override + int get hashCode => url.hashCode; + + @override + String toString() => '$runtimeType(url: $url)'; +} diff --git a/lottie/lib/src/raw_lottie.dart b/lottie/lib/src/raw_lottie.dart new file mode 100644 index 0000000..3e96644 --- /dev/null +++ b/lottie/lib/src/raw_lottie.dart @@ -0,0 +1,144 @@ +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'composition.dart'; +import 'frame_rate.dart'; +import 'lottie_delegates.dart'; +import 'lottie_drawable.dart'; +import 'options.dart'; +import 'render_cache.dart'; +import 'render_lottie.dart'; + +/// A widget that displays a [LottieDrawable] directly. +/// +/// This widget is rarely used directly. Instead, consider using [Lottie]. +class RawLottie extends LeafRenderObjectWidget { + /// Creates a widget that displays a Lottie composition. + const RawLottie({ + super.key, + this.composition, + this.delegates, + this.options, + double? progress, + this.frameRate, + this.width, + this.height, + this.fit, + AlignmentGeometry? alignment, + this.filterQuality, + this.renderCache, + }) : progress = progress ?? 0.0, + alignment = alignment ?? Alignment.center; + + /// The Lottie composition to display. + final LottieComposition? composition; + + /// Allows to modify the Lottie animation at runtime + final LottieDelegates? delegates; + + final LottieOptions? options; + + /// The progress of the Lottie animation (between 0.0 and 1.0). + final double progress; + + /// The number of frames per second to render. + /// Use `FrameRate.composition` to use the original frame rate of the Lottie composition (default) + /// Use `FrameRate.max` to advance the animation progression at every frame. + final FrameRate? frameRate; + + /// If non-null, require the Lottie composition to have this width. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + final double? width; + + /// If non-null, require the Lottie composition to have this height. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + final double? height; + + /// How to inscribe the Lottie composition into the space allocated during layout. + final BoxFit? fit; + + /// How to align the composition within its bounds. + /// + /// The alignment aligns the given position in the image to the given position + /// in the layout bounds. For example, an [Alignment] alignment of (-1.0, + /// -1.0) aligns the image to the top-left corner of its layout bounds, while a + /// [Alignment] alignment of (1.0, 1.0) aligns the bottom right of the + /// image with the bottom right corner of its layout bounds. Similarly, an + /// alignment of (0.0, 1.0) aligns the bottom middle of the image with the + /// middle of the bottom edge of its layout bounds. + /// + /// Defaults to [Alignment.center]. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry alignment; + + /// {@macro lottie.renderCache} + final RenderCache? renderCache; + + final FilterQuality? filterQuality; + + @override + RenderLottie createRenderObject(BuildContext context) { + return RenderLottie( + composition: composition, + delegates: delegates, + enableMergePaths: options?.enableMergePaths, + enableApplyingOpacityToLayers: options?.enableApplyingOpacityToLayers, + progress: progress, + frameRate: frameRate, + width: width, + height: height, + fit: fit, + alignment: alignment, + filterQuality: filterQuality, + renderCache: renderCache, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + ); + } + + @override + void updateRenderObject(BuildContext context, RenderLottie renderObject) { + renderObject + ..setComposition( + composition, + progress: progress, + frameRate: frameRate, + delegates: delegates, + enableMergePaths: options?.enableMergePaths, + enableApplyingOpacityToLayers: options?.enableApplyingOpacityToLayers, + filterQuality: filterQuality, + ) + ..width = width + ..height = height + ..alignment = alignment + ..fit = fit + ..renderCache = renderCache + ..devicePixelRatio = MediaQuery.devicePixelRatioOf(context); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add( + DiagnosticsProperty('composition', composition), + ); + properties.add(DoubleProperty('width', width, defaultValue: null)); + properties.add(DoubleProperty('height', height, defaultValue: null)); + properties.add(EnumProperty('fit', fit, defaultValue: null)); + properties.add( + DiagnosticsProperty( + 'alignment', + alignment, + defaultValue: null, + ), + ); + } +} diff --git a/lottie/lib/src/render_cache.dart b/lottie/lib/src/render_cache.dart new file mode 100644 index 0000000..ad58895 --- /dev/null +++ b/lottie/lib/src/render_cache.dart @@ -0,0 +1,34 @@ +import 'dart:ui'; +import 'package:flutter/material.dart' show RenderBox; +import '../lottie.dart'; +import 'render_cache/store_drawing.dart'; +import 'render_cache/store_raster.dart'; + +abstract class RenderCache { + /// The frames stored in the cache are fully rasterized. This is the most efficient + /// to render but will use the most memory. + /// This should only be used for very short and very small animations (final size on the screen). + static const raster = RenderCacheRaster(maxMemory: 50000000); + + /// The frames are stored as [dart:ui.Picture] in the cache. + /// It will will spare the CPU work for each frame. The GPU work will be the same as without cache. + static const drawingCommands = RenderCacheDrawing(); + + AnimationCache acquire(Object user); + + void release(Object user); +} + +abstract class AnimationCache { + bool draw( + LottieDrawable drawable, + double progress, + Canvas canvas, { + required Offset destinationPosition, + required Rect destinationRect, + required Rect sourceRect, + required Size sourceSize, + required RenderBox renderBox, + required double devicePixelRatio, + }); +} diff --git a/lottie/lib/src/render_cache/key.dart b/lottie/lib/src/render_cache/key.dart new file mode 100644 index 0000000..79c773b --- /dev/null +++ b/lottie/lib/src/render_cache/key.dart @@ -0,0 +1,37 @@ +import 'dart:ui'; +import 'package:flutter/foundation.dart'; +import '../composition.dart'; +import '../utils.dart'; + +@immutable +class CacheKey { + final LottieComposition composition; + final Size size; + final List config; + final int delegates; + + CacheKey({ + required this.composition, + required this.size, + required this.config, + required this.delegates, + }) : assert( + size.width == size.width.toInt() && size.height == size.height.toInt(), + ); + + @override + int get hashCode => + Object.hash(composition, size, Object.hashAll(config), delegates); + + @override + bool operator ==(other) => + other is CacheKey && + other.composition == composition && + other.size == size && + const ListEquality().equals(other.config, config) && + other.delegates == delegates; + + @override + String toString() => + 'CacheKey(${composition.hashCode}, $size, $config, $delegates)'; +} diff --git a/lottie/lib/src/render_cache/store.dart b/lottie/lib/src/render_cache/store.dart new file mode 100644 index 0000000..8f06b7c --- /dev/null +++ b/lottie/lib/src/render_cache/store.dart @@ -0,0 +1,63 @@ +abstract class Store, TCacheKey> { + final entries = {}; + final handles = >{}; + + bool shouldRemove(TEntry entry) => entry.handles.isEmpty; + + TEntry createEntry(TCacheKey key); + + void _clearUnused() { + for (var entry in entries.entries.toList()) { + var key = entry.key; + var cache = entry.value; + + if (shouldRemove(cache)) { + cache.dispose(); + var found = entries.remove(key); + assert(found == cache); + } + } + } + + Handle acquire(Object user) { + var handle = handles[user] ??= Handle(this); + return handle; + } + + void release(Object user) { + var handle = handles.remove(user); + if (handle?._currentEntry case var currentEntry?) { + var removed = currentEntry.handles.remove(handle); + assert(removed); + _clearUnused(); + } + } +} + +class Handle, TCacheKey> { + final Store _cache; + TEntry? _currentEntry; + + Handle(this._cache); + + TEntry withKey(TCacheKey key) { + if (_currentEntry case var currentEntry? when currentEntry.key != key) { + _currentEntry = null; + currentEntry.handles.remove(this); + _cache._clearUnused(); + } + var entry = _cache.entries[key] ??= _cache.createEntry(key); + entry.handles.add(this); + _currentEntry = entry; + return entry; + } +} + +abstract base class CacheEntry { + final TCacheKey key; + final handles = {}; + + CacheEntry(this.key); + + void dispose(); +} diff --git a/lottie/lib/src/render_cache/store_drawing.dart b/lottie/lib/src/render_cache/store_drawing.dart new file mode 100644 index 0000000..ffebce9 --- /dev/null +++ b/lottie/lib/src/render_cache/store_drawing.dart @@ -0,0 +1,134 @@ +import 'dart:ui'; +import 'package:flutter/rendering.dart'; +import '../lottie_drawable.dart'; +import '../render_cache.dart'; +import 'key.dart'; +import 'store.dart'; + +final _stores = Expando(); + +class RenderCacheDrawing implements RenderCache { + const RenderCacheDrawing(); + + @override + AnimationCache acquire(Object user) { + var handle = store.acquire(user); + return DrawingAnimationCache(handle); + } + + @override + void release(Object user) { + store.release(user); + } + + DrawingStore get store => _stores[this] ??= DrawingStore(); +} + +class DrawingAnimationCache extends AnimationCache { + final Handle handle; + + DrawingAnimationCache(this.handle); + + @override + bool draw( + LottieDrawable drawable, + double progress, + Canvas canvas, { + required Offset destinationPosition, + required Rect destinationRect, + required Rect sourceRect, + required Size sourceSize, + required RenderBox renderBox, + required double devicePixelRatio, + }) { + var key = CacheKey( + composition: drawable.composition, + size: Size.zero, + config: drawable.configHash(), + delegates: drawable.delegatesHash(), + ); + var entry = handle.withKey(key); + + return entry.draw( + drawable, + progress, + canvas, + destinationPosition: destinationPosition, + destinationRect: destinationRect, + sourceRect: sourceRect, + sourceSize: sourceSize, + ); + } +} + +class DrawingStore extends Store { + @override + DrawingEntry createEntry(CacheKey key) { + return DrawingEntry(this, key); + } +} + +base class DrawingEntry extends CacheEntry { + final DrawingStore store; + final pictures = {}; + + DrawingEntry(this.store, super.key); + + Picture _record(void Function(Canvas) draw) { + var recorder = PictureRecorder(); + var canvas = Canvas(recorder); + draw(canvas); + return recorder.endRecording(); + } + + Picture? _pictureForProgress(double progress, void Function(Canvas) draw) { + var existing = pictures[progress]; + if (existing != null) { + return existing; + } + + var picture = _record(draw); + pictures[progress] = picture; + return picture; + } + + final _matrix = Matrix4.identity(); + + bool draw( + LottieDrawable drawable, + double progress, + Canvas canvas, { + required Offset destinationPosition, + required Rect destinationRect, + required Rect sourceRect, + required Size sourceSize, + }) { + var cachedImage = _pictureForProgress(progress, (cacheCanvas) { + drawable.compositionLayer.draw(cacheCanvas, _matrix, parentAlpha: 255); + }); + if (cachedImage != null) { + var destinationSize = destinationRect.size; + + canvas.save(); + canvas.translate(destinationRect.left, destinationRect.top); + canvas.scale( + destinationSize.width / sourceRect.width, + destinationSize.height / sourceRect.height, + ); + canvas.drawPicture(cachedImage); + canvas.restore(); + + return true; + } + + return false; + } + + @override + void dispose() { + for (var picture in pictures.values) { + picture.dispose(); + } + pictures.clear(); + } +} diff --git a/lottie/lib/src/render_cache/store_raster.dart b/lottie/lib/src/render_cache/store_raster.dart new file mode 100644 index 0000000..2ddf8a3 --- /dev/null +++ b/lottie/lib/src/render_cache/store_raster.dart @@ -0,0 +1,183 @@ +import 'dart:ui'; +import 'package:flutter/rendering.dart'; +import '../lottie_drawable.dart'; +import '../render_cache.dart'; +import 'key.dart'; +import 'store.dart'; + +final _stores = Expando(); + +class RenderCacheRaster implements RenderCache { + final int maxMemory; + + const RenderCacheRaster({required this.maxMemory}); + + @override + AnimationCache acquire(Object user) { + var handle = store.acquire(user); + return RasterAnimationCache(handle); + } + + @override + void release(Object user) { + store.release(user); + } + + RasterStore get store => _stores[this] ??= RasterStore(maxMemory); +} + +class RasterAnimationCache extends AnimationCache { + final Handle handle; + + RasterAnimationCache(this.handle); + + @override + bool draw( + LottieDrawable drawable, + double progress, + Canvas canvas, { + required Offset destinationPosition, + required Rect destinationRect, + required Rect sourceRect, + required Size sourceSize, + required RenderBox renderBox, + required double devicePixelRatio, + }) { + var rect = Rect.fromPoints( + renderBox.localToGlobal(destinationPosition), + renderBox.localToGlobal(destinationRect.bottomRight), + ); + var cacheImageSize = Size( + (rect.size.width * devicePixelRatio).roundToDouble(), + (rect.size.height * devicePixelRatio).roundToDouble(), + ); + + var key = CacheKey( + composition: drawable.composition, + size: cacheImageSize, + config: drawable.configHash(), + delegates: drawable.delegatesHash(), + ); + var entry = handle.withKey(key); + + return entry.draw( + drawable, + progress, + canvas, + destinationPosition: destinationPosition, + destinationRect: destinationRect, + sourceSize: sourceSize, + sourceRect: sourceRect, + ); + } +} + +class RasterStore extends Store { + final int maxMemory; + + RasterStore(this.maxMemory); + + int get totalMemory => entries.values.fold(0, (a, b) => a + b.currentMemory); + + int get imageCount => entries.values.expand((e) => e.images.values).length; + + void clear() { + for (var entry in entries.values) { + entry.clear(); + } + } + + @override + RasterEntry createEntry(CacheKey key) { + return RasterEntry(this, key); + } + + bool canUseMemory(int newMemory) { + return totalMemory + newMemory <= maxMemory; + } +} + +base class RasterEntry extends CacheEntry { + final RasterStore store; + final images = {}; + int currentMemory = 0; + + RasterEntry(this.store, super.key); + + Picture _record(void Function(Canvas) draw) { + var recorder = PictureRecorder(); + var canvas = Canvas(recorder); + draw(canvas); + return recorder.endRecording(); + } + + Image? imageForProgress(double progress, void Function(Canvas) draw) { + var existing = images[progress]; + if (existing != null) { + return existing; + } + + var size = key.size; + var newImageSize = size.width.round() * size.height.round(); + if (!store.canUseMemory(newImageSize)) { + return null; + } + + var picture = _record(draw); + var image = picture.toImageSync(size.width.round(), size.height.round()); + picture.dispose(); + images[progress] = image; + currentMemory += size.width.round() * size.height.round(); + return image; + } + + final _normalPaint = Paint(); + final _matrix = Matrix4.identity(); + + bool draw( + LottieDrawable drawable, + double progress, + Canvas canvas, { + required Offset destinationPosition, + required Rect destinationRect, + required Size sourceSize, + required Rect sourceRect, + }) { + var cacheImageSize = key.size; + + var cachedImage = imageForProgress(progress, (cacheCanvas) { + _matrix.setIdentity(); + _matrix.scaleByDouble( + cacheImageSize.width / sourceSize.width, + cacheImageSize.height / sourceSize.height, + cacheImageSize.width / sourceSize.width, + 1, + ); + drawable.compositionLayer.draw(cacheCanvas, _matrix, parentAlpha: 255); + }); + if (cachedImage != null) { + canvas.drawImageRect( + cachedImage, + Offset.zero & cacheImageSize, + destinationRect, + _normalPaint, + ); + return true; + } + + return false; + } + + void clear() { + for (var image in images.values) { + image.dispose(); + } + images.clear(); + currentMemory = 0; + } + + @override + void dispose() { + clear(); + } +} diff --git a/lottie/lib/src/render_lottie.dart b/lottie/lib/src/render_lottie.dart new file mode 100644 index 0000000..f23f655 --- /dev/null +++ b/lottie/lib/src/render_lottie.dart @@ -0,0 +1,310 @@ +import 'package:flutter/rendering.dart'; +import 'composition.dart'; +import 'frame_rate.dart'; +import 'lottie_delegates.dart'; +import 'lottie_drawable.dart'; +import 'render_cache.dart'; + +/// A Lottie animation in the render tree. +/// +/// The RenderLottie attempts to find a size for itself that fits in the given +/// constraints and preserves the composition's intrinsic aspect ratio. +class RenderLottie extends RenderBox { + RenderLottie({ + required LottieComposition? composition, + LottieDelegates? delegates, + bool? enableMergePaths, + bool? enableApplyingOpacityToLayers, + double progress = 0.0, + FrameRate? frameRate, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + FilterQuality? filterQuality, + RenderCache? renderCache, + required double devicePixelRatio, + }) : assert(progress >= 0.0 && progress <= 1.0), + assert( + renderCache == null || frameRate != FrameRate.max, + 'FrameRate.max cannot be used with a RenderCache ' + 'Use a specific frame rate. e.g. FrameRate(60)', + ), + _drawable = composition != null + ? (LottieDrawable(composition, frameRate: frameRate) + ..setProgress(progress) + ..delegates = delegates + ..enableMergePaths = enableMergePaths ?? false + ..isApplyingOpacityToLayersEnabled = + enableApplyingOpacityToLayers ?? false + ..filterQuality = filterQuality) + : null, + _width = width, + _height = height, + _fit = fit, + _alignment = alignment, + _renderCache = renderCache, + _devicePixelRatio = devicePixelRatio; + + /// The lottie composition to display. + LottieComposition? get composition => _drawable?.composition; + LottieDrawable? _drawable; + + void setComposition( + LottieComposition? composition, { + required double progress, + required FrameRate? frameRate, + required LottieDelegates? delegates, + bool? enableMergePaths, + bool? enableApplyingOpacityToLayers, + FilterQuality? filterQuality, + }) { + var drawable = _drawable; + enableMergePaths ??= false; + enableApplyingOpacityToLayers ??= false; + + var needsLayout = false; + var needsPaint = false; + if (composition == null) { + if (drawable != null) { + drawable = _drawable = null; + needsPaint = true; + needsLayout = true; + } + } else { + if (drawable == null || + drawable.composition != composition || + drawable.frameRate != frameRate) { + drawable = _drawable = LottieDrawable( + composition, + frameRate: frameRate, + ); + needsLayout = true; + needsPaint = true; + } + + needsPaint |= drawable.setProgress(progress); + + if (drawable.delegates != delegates) { + drawable.delegates = delegates; + needsPaint = true; + } + if (enableMergePaths != drawable.enableMergePaths) { + drawable.enableMergePaths = enableMergePaths; + needsPaint = true; + } + if (enableApplyingOpacityToLayers != + drawable.isApplyingOpacityToLayersEnabled) { + drawable.isApplyingOpacityToLayersEnabled = + enableApplyingOpacityToLayers; + needsPaint = true; + } + if (filterQuality != drawable.filterQuality) { + drawable.filterQuality = filterQuality; + needsPaint = true; + } + } + + if (needsPaint) { + markNeedsPaint(); + } + if (needsLayout && (_width == null || _height == null)) { + markNeedsLayout(); + } + } + + /// If non-null, requires the composition to have this width. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + double? get width => _width; + double? _width; + + set width(double? value) { + if (value == _width) { + return; + } + _width = value; + markNeedsLayout(); + } + + /// If non-null, require the composition to have this height. + /// + /// If null, the composition will pick a size that best preserves its intrinsic + /// aspect ratio. + double? get height => _height; + double? _height; + + set height(double? value) { + if (value == _height) { + return; + } + _height = value; + markNeedsLayout(); + } + + /// How to inscribe the composition into the space allocated during layout. + BoxFit? get fit => _fit; + BoxFit? _fit; + set fit(BoxFit? value) { + if (value == _fit) { + return; + } + _fit = value; + markNeedsPaint(); + } + + /// How to align the composition within its bounds. + AlignmentGeometry get alignment => _alignment; + AlignmentGeometry _alignment; + + set alignment(AlignmentGeometry value) { + if (value == _alignment) { + return; + } + _alignment = value; + markNeedsPaint(); + } + + RenderCache? get renderCache => _renderCache; + RenderCache? _renderCache; + set renderCache(RenderCache? value) { + if (value == _renderCache) { + return; + } + _renderCache?.release(this); + _renderCache = value; + markNeedsPaint(); + } + + double get devicePixelRatio => _devicePixelRatio; + double _devicePixelRatio; + set devicePixelRatio(double value) { + if (value == _devicePixelRatio) { + return; + } + _devicePixelRatio = value; + markNeedsPaint(); + } + + /// Find a size for the render composition within the given constraints. + /// + /// - The dimensions of the RenderLottie must fit within the constraints. + /// - The aspect ratio of the RenderLottie matches the intrinsic aspect + /// ratio of the Lottie animation. + /// - The RenderLottie's dimension are maximal subject to being smaller than + /// the intrinsic size of the composition. + Size _sizeForConstraints(BoxConstraints constraints) { + // Folds the given |width| and |height| into |constraints| so they can all + // be treated uniformly. + constraints = BoxConstraints.tightFor( + width: _width, + height: _height, + ).enforce(constraints); + + if (_drawable == null) { + return constraints.smallest; + } + + return constraints.constrainSizeAndAttemptToPreserveAspectRatio( + _drawable!.size, + ); + } + + @override + double computeMinIntrinsicWidth(double height) { + assert(height >= 0.0); + if (_width == null && _height == null) { + return 0.0; + } + return _sizeForConstraints( + BoxConstraints.tightForFinite(height: height), + ).width; + } + + @override + double computeMaxIntrinsicWidth(double height) { + assert(height >= 0.0); + return _sizeForConstraints( + BoxConstraints.tightForFinite(height: height), + ).width; + } + + @override + double computeMinIntrinsicHeight(double width) { + assert(width >= 0.0); + if (_width == null && _height == null) { + return 0.0; + } + return _sizeForConstraints( + BoxConstraints.tightForFinite(width: width), + ).height; + } + + @override + double computeMaxIntrinsicHeight(double width) { + assert(width >= 0.0); + return _sizeForConstraints( + BoxConstraints.tightForFinite(width: width), + ).height; + } + + @override + bool hitTestSelf(Offset position) => true; + + @override + Size computeDryLayout(BoxConstraints constraints) { + return _sizeForConstraints(constraints); + } + + @override + void performLayout() { + size = _sizeForConstraints(constraints); + } + + @override + void paint(PaintingContext context, Offset offset) { + if (_drawable == null) return; + + RenderCacheContext? cacheContext; + if (_renderCache case var renderCache?) { + cacheContext = RenderCacheContext( + cache: renderCache.acquire(this), + devicePixelRatio: _devicePixelRatio, + renderBox: this, + ); + } + + _drawable!.draw( + context.canvas, + offset & size, + fit: _fit, + alignment: _alignment.resolve(TextDirection.ltr), + renderCache: cacheContext, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add( + DiagnosticsProperty('composition', composition), + ); + properties.add(DoubleProperty('width', width, defaultValue: null)); + properties.add(DoubleProperty('height', height, defaultValue: null)); + properties.add(EnumProperty('fit', fit, defaultValue: null)); + properties.add( + DiagnosticsProperty( + 'alignment', + alignment, + defaultValue: null, + ), + ); + } + + @override + void dispose() { + _renderCache?.release(this); + super.dispose(); + } +} diff --git a/lottie/lib/src/utils.dart b/lottie/lib/src/utils.dart new file mode 100644 index 0000000..c4f0884 --- /dev/null +++ b/lottie/lib/src/utils.dart @@ -0,0 +1,104 @@ +import 'dart:math'; +import 'package:flutter/rendering.dart'; +import 'package:vector_math/vector_math_64.dart'; + +extension PaintExtension on Paint { + void setAlpha(int alpha) { + color = color.withAlpha(alpha); + } +} + +extension PathExtension on Path { + void set(Path path) { + reset(); + addPath(path, Offset.zero); + } + + void offset(Offset offset) { + set(shift(offset)); + } +} + +extension Matrix4Extension on Matrix4 { + void preConcat(Matrix4 matrix) { + multiply(matrix); + } + + void reset() { + setIdentity(); + } + + void set(Matrix4 matrix) { + matrix.copyInto(this); + } + + Rect mapRect(Rect rect) { + return MatrixUtils.transformRect(this, rect); + } + + /// Apply this matrix to the array of 2D points, and write the transformed points back into the + /// array + /// + /// @param pts The array [x0, y0, x1, y1, ...] of points to transform. + void mapPoints(List array) { + for (var i = 0; i < array.length; i += 2) { + final v = MatrixUtils.transformPoint( + this, + Offset(array[i], array[i + 1]), + ); + + array[i] = v.dx; + array[i + 1] = v.dy; + } + } + + double getScale() { + var p0 = Vector3(0, 0, 0)..applyMatrix4(this); + var p1 = Vector3(1 / sqrt(2), 1 / sqrt(2), 0)..applyMatrix4(this); + + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + + return hypot(dx, dy).toDouble(); + } + + bool get hasZeroScaleAxis { + var p0 = Vector3(0, 0, 0)..applyMatrix4(this); + // Random numbers. The only way these should map to the same thing as 0,0 is if the scale is 0. + var p1 = Vector3(37394.729378, 39575.2343807, 0)..applyMatrix4(this); + + return p0.x == p1.x || p0.y == p1.y; + } +} + +extension OffsetExtension on Offset { + bool get isZero => dx == 0 && dy == 0; +} + +num hypot(num x, num y) { + return sqrt(x * x + y * y); +} + +extension IterableExtension on Iterable { + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } +} + +class ListEquality { + const ListEquality(); + + bool equals(List? list1, List? list2) { + if (identical(list1, list2)) return true; + if (list1 == null || list2 == null) return false; + var length = list1.length; + if (length != list2.length) return false; + for (var i = 0; i < length; i++) { + if (list1[i] != list2[i]) return false; + } + return true; + } +} diff --git a/lottie/lib/src/utils/characters.dart b/lottie/lib/src/utils/characters.dart new file mode 100644 index 0000000..95fa02f --- /dev/null +++ b/lottie/lib/src/utils/characters.dart @@ -0,0 +1,27 @@ +import 'package:flutter/widgets.dart'; + +extension CharactersExtension on Characters { + Characters trimTrailing(Characters pattern) { + if (pattern.isEmpty) return this; + + var i = length; + while (i >= pattern.length && getRange(i - pattern.length, i) == pattern) { + i -= pattern.length; + } + return getRange(0, i); + } + + Characters trimLeading(Characters pattern) { + if (pattern.isEmpty) return this; + var i = 0; + while (i <= length - pattern.length && + getRange(i, i + pattern.length) == pattern) { + i += pattern.length; + } + return getRange(i); + } + + Characters trim(Characters pattern) { + return trimLeading(pattern).trimTrailing(pattern); + } +} diff --git a/lottie/lib/src/utils/collection.dart b/lottie/lib/src/utils/collection.dart new file mode 100644 index 0000000..f344d2b --- /dev/null +++ b/lottie/lib/src/utils/collection.dart @@ -0,0 +1,69 @@ +/// Returns a position of the [value] in [sortedList], if it is there. +/// +/// If the list isn't sorted according to the [compare] function, the result +/// is unpredictable. +/// +/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on +/// the objects. In this case, the objects must be [Comparable]. +/// +/// Returns -1 if [value] is not in the list. +int binarySearch( + List sortedList, + E value, { + int Function(E, E)? compare, +}) { + compare ??= defaultCompare; + return binarySearchBy(sortedList, identity, compare, value); +} + +/// Returns a position of the [value] in [sortedList], if it is there. +/// +/// If the list isn't sorted according to the [compare] function on the [keyOf] +/// property of the elements, the result is unpredictable. +/// +/// Returns -1 if [value] is not in the list by default. +/// +/// If [start] and [end] are supplied, only that range is searched, +/// and only that range need to be sorted. +int binarySearchBy( + List sortedList, + K Function(E element) keyOf, + int Function(K, K) compare, + E value, [ + int start = 0, + int? end, +]) { + end = RangeError.checkValidRange(start, end, sortedList.length); + var min = start; + var max = end; + var key = keyOf(value); + while (min < max) { + var mid = min + ((max - min) >> 1); + var element = sortedList[mid]; + var comp = compare(keyOf(element), key); + if (comp == 0) return mid; + if (comp < 0) { + min = mid + 1; + } else { + max = mid; + } + } + return -1; +} + +/// A [Comparator] that asserts that its first argument is comparable. +/// +/// The function behaves just like [List.sort]'s +/// default comparison function. It is entirely dynamic in its testing. +/// +/// Should be used when optimistically comparing object that are assumed +/// to be comparable. +/// If the elements are known to be comparable, use [compareComparable]. +int defaultCompare(Object? value1, Object? value2) => + (value1! as Comparable).compareTo(value2); + +/// A reusable identity function at any type. +T identity(T value) => value; + +/// A reusable typed comparable comparator. +int compareComparable>(T a, T b) => a.compareTo(b); diff --git a/lottie/lib/src/utils/dash_path.dart b/lottie/lib/src/utils/dash_path.dart new file mode 100644 index 0000000..4b59ed4 --- /dev/null +++ b/lottie/lib/src/utils/dash_path.dart @@ -0,0 +1,43 @@ +import 'dart:math'; +import 'dart:ui'; + +Path dashPath(Path source, {required List intervals, double? phase}) { + assert(intervals.length >= 2); + phase ??= 0; + + var dest = Path(); + for (final metric in source.computeMetrics()) { + for (var dash in _dashes(metric.length, intervals, phase)) { + dest.addPath(metric.extractPath(dash.left, dash.right), Offset.zero); + } + } + + return dest; +} + +Iterable _dashes( + double length, + List intervals, + double phase, +) sync* { + var intervalLength = intervals.fold(0, (a, b) => a + b); + + var distance = 0.0; + while (distance < length) { + var position = (distance + phase) % intervalLength; + var end = 0.0; + for (var i = 0; i < intervals.length; i++) { + end += intervals[i]; + if (end > position || i == intervals.length - 1) { + var offset = max(0.1, end - position); + + if (i.isEven) { + yield Rect.fromLTRB(distance, 0, min(length, distance + offset), 0); + } + + distance += offset; + break; + } + } + } +} diff --git a/lottie/lib/src/utils/gamma_evaluator.dart b/lottie/lib/src/utils/gamma_evaluator.dart new file mode 100644 index 0000000..45ce95f --- /dev/null +++ b/lottie/lib/src/utils/gamma_evaluator.dart @@ -0,0 +1,72 @@ +import 'dart:math'; +import 'dart:ui'; + +/// Use this instead of {@link android.animation.ArgbEvaluator} because it interpolates through the gamma color +/// space which looks better to us humans. +///

+/// Written by Romain Guy and Francois Blavoet. +/// https://androidstudygroup.slack.com/archives/animation/p1476461064000335 +class GammaEvaluator { + // Opto-electronic conversion function for the sRGB color space + // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value + static double _oecfSRgb(double linear) { + // IEC 61966-2-1:1999 + return linear <= 0.0031308 + ? linear * 12.92 + : ((pow(linear, 1.0 / 2.4) * 1.055) - 0.055); + } + + // Electro-optical conversion function for the sRGB color space + // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value + static double _eocfSRgb(double srgb) { + // IEC 61966-2-1:1999 + return srgb <= 0.04045 + ? srgb / 12.92 + : pow((srgb + 0.055) / 1.055, 2.4).toDouble(); + } + + static Color evaluate(double fraction, Color startColor, Color endColor) { + // Fast return in case start and end is the same + // or if fraction is at start/end or out of [0,1] bounds + if (startColor == endColor) { + return startColor; + } else if (fraction <= 0) { + return startColor; + } else if (fraction >= 1) { + return endColor; + } + + var startA = startColor.a; + var startR = startColor.r; + var startG = startColor.g; + var startB = startColor.b; + + var endA = endColor.a; + var endR = endColor.r; + var endG = endColor.g; + var endB = endColor.b; + + // convert from sRGB to linear + startR = _eocfSRgb(startR); + startG = _eocfSRgb(startG); + startB = _eocfSRgb(startB); + + endR = _eocfSRgb(endR); + endG = _eocfSRgb(endG); + endB = _eocfSRgb(endB); + + // compute the interpolated color in linear space + var a = startA + fraction * (endA - startA); + var r = startR + fraction * (endR - startR); + var g = startG + fraction * (endG - startG); + var b = startB + fraction * (endB - startB); + + // convert back to sRGB in the [0..255] range + a = a * 255.0; + r = _oecfSRgb(r) * 255.0; + g = _oecfSRgb(g) * 255.0; + b = _oecfSRgb(b) * 255.0; + + return Color.fromARGB(a.round(), r.round(), g.round(), b.round()); + } +} diff --git a/lottie/lib/src/utils/mean_calculator.dart b/lottie/lib/src/utils/mean_calculator.dart new file mode 100644 index 0000000..aac44bc --- /dev/null +++ b/lottie/lib/src/utils/mean_calculator.dart @@ -0,0 +1,11 @@ +class MeanCalculator { + double _sum = 0; + int _n = 0; + + double get mean => _n == 0 ? 0 : _sum / _n; + + void add(double number) { + _sum += number; + _n++; + } +} diff --git a/lottie/lib/src/utils/misc.dart b/lottie/lib/src/utils/misc.dart new file mode 100644 index 0000000..328b009 --- /dev/null +++ b/lottie/lib/src/utils/misc.dart @@ -0,0 +1,121 @@ +import 'dart:ui'; +import '../animation/content/key_path_element_content.dart'; +import '../model/content/shape_data.dart'; +import '../model/key_path.dart'; + +class MiscUtils { + static void getPathFromData(ShapeData shapeData, Path outPath) { + outPath.reset(); + var initialPoint = shapeData.initialPoint; + outPath.moveTo(initialPoint.dx, initialPoint.dy); + var currentPoint = initialPoint; + + for (var i = 0; i < shapeData.curves.length; i++) { + var curveData = shapeData.curves[i]; + var cp1 = curveData.controlPoint1; + var cp2 = curveData.controlPoint2; + var vertex = curveData.vertex; + + if (cp1 == currentPoint && cp2 == vertex) { + // On some phones like Samsung phones, zero valued control points can cause artifacting. + // https://github.com/airbnb/lottie-android/issues/275 + // + // This does its best to add a tiny value to the vertex without affecting the final + // animation as much as possible. + // outPath.rMoveTo(0.01f, 0.01f); + outPath.lineTo(vertex.dx, vertex.dy); + } else { + outPath.cubicTo(cp1.dx, cp1.dy, cp2.dx, cp2.dy, vertex.dx, vertex.dy); + } + currentPoint = vertex; + } + if (shapeData.isClosed) { + outPath.close(); + } + } + + static bool isAtLeastVersion( + int major, + int minor, + int patch, + int minMajor, + int minMinor, + int minPatch, + ) { + if (major < minMajor) { + return false; + } else if (major > minMajor) { + return true; + } + + if (minor < minMinor) { + return false; + } else if (minor > minMinor) { + return true; + } + + return patch >= minPatch; + } + + static Color parseColor( + String colorString, { + required void Function(String) warningCallback, + }) { + if (colorString.isNotEmpty && colorString[0] == '#') { + // Use a long to avoid rollovers on #ffXXXXXX + var color = int.parse(colorString.substring(1), radix: 16); + if (colorString.length == 7) { + // Set the alpha value + color |= 0x00000000ff000000; + } else if (colorString.length != 9) { + warningCallback('Unknown color colorString: $colorString'); + return const Color(0xffffffff); + } + return Color(color); + } + warningCallback( + 'Unknown colorString is empty or format incorrect: $colorString', + ); + return const Color(0xffffffff); + } + + static int floorMod(double x, double y) { + var xInt = x.toInt(); + var yInt = y.toInt(); + return xInt - yInt * _floorDiv(xInt, yInt); + } + + static int floorModInt(int x, int y) { + return x - y * _floorDiv(x, y); + } + + static int _floorDiv(int x, int y) { + var r = x ~/ y; + var sameSign = x.sign == y.sign; + + var mod = x % y; + if (!sameSign && mod != 0) { + r--; + } + return r; + } + + /// Helper method for any {@link KeyPathElementContent} that will check if the content + /// fully matches the keypath then will add itself as the final key, resolve it, and add + /// it to the accumulator list. + /// + /// Any {@link KeyPathElementContent} should call through to this as its implementation of + /// {KeyPathElementContent#resolveKeyPath(KeyPath, int, List, KeyPath)}. + static void resolveKeyPath( + KeyPath keyPath, + int depth, + List accumulator, + KeyPath currentPartialKeyPath, + KeyPathElementContent content, + ) { + if (keyPath.fullyResolvesTo(content.name, depth)) { + currentPartialKeyPath = currentPartialKeyPath.addKey(content.name!); + accumulator.add(currentPartialKeyPath.resolve(content)); + } + } +} diff --git a/lottie/lib/src/utils/pair.dart b/lottie/lib/src/utils/pair.dart new file mode 100644 index 0000000..a77529a --- /dev/null +++ b/lottie/lib/src/utils/pair.dart @@ -0,0 +1,6 @@ +class Pair { + final T first; + final U second; + + Pair(this.first, this.second); +} diff --git a/lottie/lib/src/utils/path_interpolator.dart b/lottie/lib/src/utils/path_interpolator.dart new file mode 100644 index 0000000..038afa6 --- /dev/null +++ b/lottie/lib/src/utils/path_interpolator.dart @@ -0,0 +1,88 @@ +import 'dart:ui'; +import 'package:flutter/animation.dart'; + +// ignore: must_be_immutable +class PathInterpolator extends Curve { + /// Governs the accuracy of the approximation of the {@link Path}. + static const double _precision = 0.002; + + late final List _mX; + late final List _mY; + bool _isInitialized = false; + + final double controlX1, controlY1, controlX2, controlY2; + + PathInterpolator.cubic( + this.controlX1, + this.controlY1, + this.controlX2, + this.controlY2, + ); + + void _ensureInitialized() { + if (_isInitialized) { + return; + } + _initialize(); + _isInitialized = true; + } + + void _initialize() { + final path = Path(); + path.moveTo(0.0, 0.0); + path.cubicTo(controlX1, controlY1, controlX2, controlY2, 1.0, 1.0); + + final pathMeasure = path.computeMetrics().toList().first; + + final pathLength = pathMeasure.length; + final numPoints = (pathLength / _precision).round() + 1; + + var mX = List.filled(numPoints, 0.0); + var mY = List.filled(numPoints, 0.0); + + for (var i = 0; i < numPoints; ++i) { + final distance = (i * pathLength) / (numPoints - 1); + var tangent = pathMeasure.getTangentForOffset(distance)!; + + mX[i] = tangent.position.dx; + mY[i] = tangent.position.dy; + } + _mX = mX; + _mY = mY; + } + + @override + double transform(double t) { + _ensureInitialized(); + if (t <= 0.0) { + return 0.0; + } else if (t >= 1.0) { + return 1.0; + } + + // Do a binary search for the correct x to interpolate between. + var startIndex = 0; + var endIndex = _mX.length - 1; + while (endIndex - startIndex > 1) { + var midIndex = ((startIndex + endIndex) / 2).round(); + if (t < _mX[midIndex]) { + endIndex = midIndex; + } else { + startIndex = midIndex; + } + } + + final xRange = _mX[endIndex] - _mX[startIndex]; + if (xRange == 0) { + return _mY[startIndex]; + } + + final tInRange = t - _mX[startIndex]; + final fraction = tInRange / xRange; + + final startY = _mY[startIndex]; + final endY = _mY[endIndex]; + + return startY + (fraction * (endY - startY)); + } +} diff --git a/lottie/lib/src/utils/utils.dart b/lottie/lib/src/utils/utils.dart new file mode 100644 index 0000000..f13a023 --- /dev/null +++ b/lottie/lib/src/utils/utils.dart @@ -0,0 +1,134 @@ +import 'dart:math'; +import 'dart:ui'; +import '../animation/content/trim_path_content.dart'; +import '../l.dart'; +import '../utils.dart'; +import 'misc.dart'; + +class Utils { + static Path createPath( + Offset startPoint, + Offset endPoint, + Offset? cp1, + Offset? cp2, + ) { + var path = Path(); + path.moveTo(startPoint.dx, startPoint.dy); + + if (cp1 != null && + cp2 != null && + (cp1.distance != 0 || cp2.distance != 0)) { + path.cubicTo( + startPoint.dx + cp1.dx, + startPoint.dy + cp1.dy, + endPoint.dx + cp2.dx, + endPoint.dy + cp2.dy, + endPoint.dx, + endPoint.dy, + ); + } else { + path.lineTo(endPoint.dx, endPoint.dy); + } + return path; + } + + static int hashFor(double a, double b, double c, double d) { + var result = 17; + if (a != 0) { + result = (31 * result * a).round(); + } + if (b != 0) { + result = (31 * result * b).round(); + } + if (c != 0) { + result = (31 * result * c).round(); + } + if (d != 0) { + result = (31 * result * d).round(); + } + return result; + } + + static void applyTrimPathContentIfNeeded( + Path path, + TrimPathContent? trimPath, + ) { + if (trimPath == null || trimPath.hidden) { + return; + } + var start = trimPath.start.value; + var end = trimPath.end.value; + var offset = trimPath.offset.value; + applyTrimPathIfNeeded(path, start / 100.0, end / 100.0, offset / 360.0); + } + + static void applyTrimPathIfNeeded( + Path path, + double startValue, + double endValue, + double offsetValue, + ) { + L.beginSection('applyTrimPathIfNeeded'); + var metrics = path.computeMetrics().toList(); + if (metrics.isEmpty) { + L.endSection('applyTrimPathIfNeeded'); + return; + } + + var pathMeasure = metrics.first; + + if (startValue == 1.0 && endValue == 0.0) { + L.endSection('applyTrimPathIfNeeded'); + return; + } + var length = pathMeasure.length; + if (length < 1.0 || (endValue - startValue - 1).abs() < .01) { + L.endSection('applyTrimPathIfNeeded'); + return; + } + var start = length * startValue; + var end = length * endValue; + var newStart = min(start, end); + var newEnd = max(start, end); + + var offset = offsetValue * length; + newStart += offset; + newEnd += offset; + + // If the trim path has rotated around the path, we need to shift it back. + if (newStart >= length && newEnd >= length) { + newStart = MiscUtils.floorMod(newStart, length).toDouble(); + newEnd = MiscUtils.floorMod(newEnd, length).toDouble(); + } + + if (newStart < 0) { + newStart = MiscUtils.floorMod(newStart, length).toDouble(); + } + if (newEnd < 0) { + newEnd = MiscUtils.floorMod(newEnd, length).toDouble(); + } + + // If the start and end are equals, return an empty path. + if (newStart == newEnd) { + path.reset(); + L.endSection('applyTrimPathIfNeeded'); + return; + } + + if (newStart >= newEnd) { + newStart -= length; + } + + var tempPath = pathMeasure.extractPath(newStart, newEnd); + + if (newEnd > length) { + var tempPath2 = pathMeasure.extractPath(0, newEnd % length); + tempPath.addPath(tempPath2, Offset.zero); + } else if (newStart < 0) { + var tempPath2 = pathMeasure.extractPath(length + newStart, length); + tempPath.addPath(tempPath2, Offset.zero); + } + path.set(tempPath); + L.endSection('applyTrimPathIfNeeded'); + } +} diff --git a/lottie/lib/src/value/drop_shadow.dart b/lottie/lib/src/value/drop_shadow.dart new file mode 100644 index 0000000..4a1c302 --- /dev/null +++ b/lottie/lib/src/value/drop_shadow.dart @@ -0,0 +1,48 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +@immutable +class DropShadow { + final Color color; + final double direction; + final double distance; + final double radius; + + const DropShadow({ + required this.color, + required this.direction, + required this.distance, + required this.radius, + }); + + DropShadow copyWith({ + Color? color, + double? direction, + double? distance, + double? radius, + }) { + return DropShadow( + color: color ?? this.color, + direction: direction ?? this.direction, + distance: distance ?? this.distance, + radius: radius ?? this.radius, + ); + } + + @override + bool operator ==(other) { + return other is DropShadow && + other.color == color && + other.direction == direction && + other.distance == distance && + other.radius == radius; + } + + @override + int get hashCode => Object.hash(color, direction, distance, radius); + + @override + String toString() => + 'DropShadow(color: $color, direction: $direction, ' + 'distance: $distance, radius: $radius)'; +} diff --git a/lottie/lib/src/value/keyframe.dart b/lottie/lib/src/value/keyframe.dart new file mode 100644 index 0000000..b219aef --- /dev/null +++ b/lottie/lib/src/value/keyframe.dart @@ -0,0 +1,103 @@ +import 'package:flutter/animation.dart'; +import '../composition.dart'; + +class Keyframe { + final LottieComposition? _composition; + final T? startValue; + T? endValue; + final Curve? interpolator; + final Curve? xInterpolator; + final Curve? yInterpolator; + final double startFrame; + double? endFrame; + + double _startProgress = double.minPositive; + double _endProgress = double.minPositive; + + // Used by PathKeyframe but it has to be parsed by KeyFrame because we use a JsonReader to + // deserialzie the data so we have to parse everything in order + Offset? pathCp1; + Offset? pathCp2; + + Keyframe( + this._composition, { + required this.startValue, + this.endValue, + this.interpolator, + this.xInterpolator, + this.yInterpolator, + double? startFrame, + this.endFrame, + }) : startFrame = startFrame ?? 0.0; + + /// Non-animated value. + Keyframe.nonAnimated(T value) + : _composition = null, + startValue = value, + endValue = value, + interpolator = null, + startFrame = double.minPositive, + endFrame = double.maxFinite, + xInterpolator = null, + yInterpolator = null; + + Keyframe._(this.startValue, this.endValue) + : _composition = null, + interpolator = null, + xInterpolator = null, + yInterpolator = null, + startFrame = double.minPositive, + endFrame = double.maxFinite; + + Keyframe copyWith(T startValue, T endValue) { + return Keyframe._(startValue, endValue); + } + + double get startProgress { + if (_composition == null) { + return 0.0; + } + if (_startProgress == double.minPositive) { + _startProgress = + (startFrame - _composition.startFrame) / _composition.durationFrames; + } + return _startProgress; + } + + double get endProgress { + if (_composition == null) { + return 1.0; + } + if (_endProgress == double.minPositive) { + if (endFrame == null) { + _endProgress = 1.0; + } else { + var durationFrames = endFrame! - startFrame; + var durationProgress = durationFrames / _composition.durationFrames; + _endProgress = startProgress + durationProgress; + } + } + return _endProgress; + } + + bool get isStatic { + return interpolator == null && + xInterpolator == null && + yInterpolator == null; + } + + bool containsProgress(double progress) { + return progress >= startProgress && progress < endProgress; + } + + @override + String toString() { + return 'Keyframe{' + 'startValue=$startValue' + ', endValue=$endValue' + ', startFrame=$startFrame' + ', endFrame=$endFrame' + ', interpolator=$interpolator' + '}'; + } +} diff --git a/lottie/lib/src/value/lottie_frame_info.dart b/lottie/lib/src/value/lottie_frame_info.dart new file mode 100644 index 0000000..fde77ac --- /dev/null +++ b/lottie/lib/src/value/lottie_frame_info.dart @@ -0,0 +1,20 @@ +/// Data class for use with {@link LottieValueCallback}. +class LottieFrameInfo { + final double startFrame; + final double? endFrame; + final T? startValue; + final T? endValue; + final double linearKeyframeProgress; + final double interpolatedKeyframeProgress; + final double overallProgress; + + LottieFrameInfo( + this.startFrame, + this.endFrame, + this.startValue, + this.endValue, + this.linearKeyframeProgress, + this.interpolatedKeyframeProgress, + this.overallProgress, + ); +} diff --git a/lottie/lib/src/value/lottie_relative_double_value_callback.dart b/lottie/lib/src/value/lottie_relative_double_value_callback.dart new file mode 100644 index 0000000..58d0f47 --- /dev/null +++ b/lottie/lib/src/value/lottie_relative_double_value_callback.dart @@ -0,0 +1,16 @@ +import 'dart:ui'; +import 'lottie_frame_info.dart'; + +double Function(LottieFrameInfo) relativeDoubleValueCallback( + double offset, +) { + return (LottieFrameInfo frameInfo) { + var originalValue = lerpDouble( + frameInfo.startValue, + frameInfo.endValue, + frameInfo.interpolatedKeyframeProgress, + )!; + + return originalValue + offset; + }; +} diff --git a/lottie/lib/src/value/lottie_relative_integer_value_callback.dart b/lottie/lib/src/value/lottie_relative_integer_value_callback.dart new file mode 100644 index 0000000..f1c7097 --- /dev/null +++ b/lottie/lib/src/value/lottie_relative_integer_value_callback.dart @@ -0,0 +1,14 @@ +import 'dart:ui'; +import 'lottie_frame_info.dart'; + +int Function(LottieFrameInfo) relativeIntegerValueCallback(int offset) { + return (LottieFrameInfo frameInfo) { + var originalValue = lerpDouble( + frameInfo.startValue, + frameInfo.endValue, + frameInfo.interpolatedKeyframeProgress, + )!; + + return (originalValue + offset).round(); + }; +} diff --git a/lottie/lib/src/value/lottie_relative_point_value_callback.dart b/lottie/lib/src/value/lottie_relative_point_value_callback.dart new file mode 100644 index 0000000..71b9b40 --- /dev/null +++ b/lottie/lib/src/value/lottie_relative_point_value_callback.dart @@ -0,0 +1,16 @@ +import 'dart:ui'; +import 'lottie_frame_info.dart'; + +Offset Function(LottieFrameInfo) relativeOffsetValueCallback( + Offset offset, +) { + return (LottieFrameInfo frameInfo) { + var point = Offset.lerp( + frameInfo.startValue, + frameInfo.endValue, + frameInfo.interpolatedKeyframeProgress, + )!; + + return point.translate(offset.dx, offset.dy); + }; +} diff --git a/lottie/lib/src/value/lottie_value_callback.dart b/lottie/lib/src/value/lottie_value_callback.dart new file mode 100644 index 0000000..842c3f2 --- /dev/null +++ b/lottie/lib/src/value/lottie_value_callback.dart @@ -0,0 +1,63 @@ +import '../animation/keyframe/base_keyframe_animation.dart'; +import 'lottie_frame_info.dart'; + +/// Allows you to set a callback on a resolved {@link com.airbnb.lottie.model.KeyPath} to modify +/// its animation values at runtime. +class LottieValueCallback { + LottieValueCallback(this._value); + + BaseKeyframeAnimation? _animation; + BaseKeyframeAnimation? get animation => _animation; + + /// This can be set with {@link #setValue(Object)} to use a value instead of deferring + /// to the callback. + ///*/ + T? _value; + T? get value => _value; + + T Function(LottieFrameInfo)? callback; + + /// Override this if you haven't set a static value in the constructor or with setValue. + /// + /// Return null to resort to the default value. + T? getValue(LottieFrameInfo frameInfo) { + if (callback != null) { + return callback!(frameInfo); + } + + return value; + } + + void setValue(T? value) { + _value = value; + if (_animation != null) { + _animation!.notifyListeners(); + } + } + + T? getValueInternal( + double startFrame, + double? endFrame, + T? startValue, + T? endValue, + double linearKeyframeProgress, + double interpolatedKeyframeProgress, + double overallProgress, + ) { + return getValue( + LottieFrameInfo( + startFrame, + endFrame, + startValue, + endValue, + linearKeyframeProgress, + interpolatedKeyframeProgress, + overallProgress, + ), + ); + } + + void setAnimation(BaseKeyframeAnimation? animation) { + _animation = animation; + } +} diff --git a/lottie/lib/src/value_delegate.dart b/lottie/lib/src/value_delegate.dart new file mode 100644 index 0000000..7bd6e53 --- /dev/null +++ b/lottie/lib/src/value_delegate.dart @@ -0,0 +1,471 @@ +import 'package:flutter/widgets.dart'; +import 'lottie_drawable.dart'; +import 'lottie_property.dart'; +import 'model/key_path.dart'; +import 'utils.dart'; +import 'value/drop_shadow.dart'; +import 'value/lottie_frame_info.dart'; +import 'value/lottie_relative_double_value_callback.dart'; +import 'value/lottie_relative_integer_value_callback.dart'; +import 'value/lottie_relative_point_value_callback.dart'; +import 'value/lottie_value_callback.dart'; + +class ValueDelegate { + final List keyPath; + final T property; + final T? value; + final T Function(LottieFrameInfo)? callback; + + ValueDelegate._(this.keyPath, this.property, this.value, this.callback) + : assert( + value == null || callback == null, + "Value and callback can't be both specified.", + ); + + int get callbackHash => callback.hashCode; + + static ValueDelegate _offset( + List keyPath, + Offset property, + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + ) { + if (relative != null) { + assert(callback == null); + callback = relativeOffsetValueCallback(relative); + } + return ValueDelegate._(keyPath, property, value, callback); + } + + static ValueDelegate _double( + List keyPath, + double property, + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + ) { + if (relative != null) { + assert(callback == null); + callback = relativeDoubleValueCallback(relative); + } + return ValueDelegate._(keyPath, property, value, callback); + } + + static ValueDelegate _int( + List keyPath, + int property, + int? value, + int Function(LottieFrameInfo)? callback, + int? relative, + ) { + if (relative != null) { + assert(callback == null); + callback = relativeIntegerValueCallback(relative); + } + return ValueDelegate._(keyPath, property, value, callback); + } + + static ValueDelegate color( + List keyPath, { + Color? value, + Color Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.color, value, callback); + + static ValueDelegate strokeColor( + List keyPath, { + Color? value, + Color Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.strokeColor, value, callback); + + /// Opacity value are 0-100 to match after effects + static ValueDelegate transformOpacity( + List keyPath, { + int? value, + int Function(LottieFrameInfo)? callback, + int? relative, + }) => + _int(keyPath, LottieProperty.transformOpacity, value, callback, relative); + + /// Opacity value are 0-100 to match after effects + static ValueDelegate opacity( + List keyPath, { + int? value, + int Function(LottieFrameInfo)? callback, + int? relative, + }) => _int(keyPath, LottieProperty.opacity, value, callback, relative); + + static ValueDelegate transformAnchorPoint( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) { + return _offset( + keyPath, + LottieProperty.transformAnchorPoint, + value, + callback, + relative, + ); + } + + static ValueDelegate transformPosition( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) => _offset( + keyPath, + LottieProperty.transformPosition, + value, + callback, + relative, + ); + + static ValueDelegate ellipseSize( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) => _offset(keyPath, LottieProperty.ellipseSize, value, callback, relative); + + static ValueDelegate rectangleSize( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) => + _offset(keyPath, LottieProperty.rectangleSize, value, callback, relative); + + static ValueDelegate cornerRadius( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => + _double(keyPath, LottieProperty.cornerRadius, value, callback, relative); + + static ValueDelegate position( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) => _offset(keyPath, LottieProperty.position, value, callback, relative); + + static ValueDelegate transformScale( + List keyPath, { + Offset? value, + Offset Function(LottieFrameInfo)? callback, + Offset? relative, + }) => _offset( + keyPath, + LottieProperty.transformScale, + value, + callback, + relative, + ); + + /// In degrees + static ValueDelegate transformRotation( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.transformRotation, + value, + callback, + relative, + ); + + static ValueDelegate transformSkew( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => + _double(keyPath, LottieProperty.transformSkew, value, callback, relative); + + static ValueDelegate transformSkewAngle( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.transformSkewAngle, + value, + callback, + relative, + ); + + static ValueDelegate strokeWidth( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double(keyPath, LottieProperty.strokeWidth, value, callback, relative); + + static ValueDelegate textTracking( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => + _double(keyPath, LottieProperty.textTracking, value, callback, relative); + + static ValueDelegate repeaterCopies( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.repeaterCopies, + value, + callback, + relative, + ); + + static ValueDelegate repeaterOffset( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.repeaterOffset, + value, + callback, + relative, + ); + + static ValueDelegate polystarPoints( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarPoints, + value, + callback, + relative, + ); + + /// In degrees + static ValueDelegate polystarRotation( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarRotation, + value, + callback, + relative, + ); + + static ValueDelegate polystarInnerRadius( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarInnerRadius, + value, + callback, + relative, + ); + + static ValueDelegate polystarOuterRadius( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarOuterRadius, + value, + callback, + relative, + ); + + static ValueDelegate polystarInnerRoundedness( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarInnerRoundedness, + value, + callback, + relative, + ); + + static ValueDelegate polystarOuterRoundedness( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.polystarOuterRoundedness, + value, + callback, + relative, + ); + + /// Opacity value are 0-100 to match after effects + static ValueDelegate transformStartOpacity( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.transformStartOpacity, + value, + callback, + relative, + ); + + /// Opacity value are 0-100 to match after effects + static ValueDelegate transformEndOpacity( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double( + keyPath, + LottieProperty.transformEndOpacity, + value, + callback, + relative, + ); + + /// The time value in seconds + static ValueDelegate timeRemap( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double(keyPath, LottieProperty.timeRemap, value, callback, relative); + + static ValueDelegate textSize( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + double? relative, + }) => _double(keyPath, LottieProperty.textSize, value, callback, relative); + + static ValueDelegate text( + List keyPath, { + String? value, + String Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.text, value, callback); + + static ValueDelegate colorFilter( + List keyPath, { + ColorFilter? value, + ColorFilter Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.colorFilter, value, callback); + + static ValueDelegate> gradientColor( + List keyPath, { + List? value, + List Function(LottieFrameInfo>)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.gradientColor, value, callback); + + static ValueDelegate blurRadius( + List keyPath, { + double? value, + double Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.blurRadius, value, callback); + + static ValueDelegate dropShadow( + List keyPath, { + DropShadow? value, + DropShadow Function(LottieFrameInfo)? callback, + }) => ValueDelegate._(keyPath, LottieProperty.dropShadow, value, callback); + + ResolvedValueDelegate? _resolved; + ResolvedValueDelegate _resolve(List resolvedPaths) { + _resolved = ResolvedValueDelegate(this, resolvedPaths); + return _resolved!; + } + + bool isSameProperty(ValueDelegate other) { + if (identical(this, other)) return true; + return other is ValueDelegate && + const ListEquality().equals(other.keyPath, keyPath) && + other.property == property; + } +} + +ResolvedValueDelegate internalResolved(ValueDelegate valueDelegate) { + return valueDelegate._resolved!; +} + +ResolvedValueDelegate internalResolve( + ValueDelegate delegate, + List resolvedPaths, +) { + return delegate._resolve(resolvedPaths); +} + +class ResolvedValueDelegate { + final ValueDelegate valueDelegate; + final List keyPaths; + final LottieValueCallback valueCallback; + + ResolvedValueDelegate(this.valueDelegate, this.keyPaths) + : valueCallback = LottieValueCallback(valueDelegate.value) + ..callback = valueDelegate.callback; + + T get property => valueDelegate.property; + + void updateDelegate(ValueDelegate delegate) { + valueCallback + ..setValue(delegate.value) + ..callback = delegate.callback; + } + + void clear() { + valueCallback + ..setValue(null) + ..callback = null; + } + + /// Add a property callback for the specified {@link KeyPath}. This {@link KeyPath} can resolve + /// to multiple contents. In that case, the callbacks's value will apply to all of them. + ///

+ /// Internally, this will check if the {@link KeyPath} has already been resolved with + /// {#resolveKeyPath(KeyPath)} and will resolve it if it hasn't. + void addValueCallback(LottieDrawable drawable) { + var invalidate = false; + if (valueDelegate.keyPath.isEmpty) { + drawable.compositionLayer.addValueCallback(property, valueCallback); + invalidate = true; + } else { + for (var keyPath in keyPaths) { + keyPath.resolvedElement!.addValueCallback(property, valueCallback); + invalidate = true; + } + } + if (invalidate) { + drawable.invalidateSelf(); + if (property == LottieProperty.timeRemap) { + // Time remapping values are read in setProgress. In order for the new value + // to apply, we have to re-set the progress with the current progress so that the + // time remapping can be reapplied. + drawable.setProgress(drawable.progress); + } + } + } +} diff --git a/lottie/pubspec.yaml b/lottie/pubspec.yaml new file mode 100644 index 0000000..e234f91 --- /dev/null +++ b/lottie/pubspec.yaml @@ -0,0 +1,29 @@ +name: lottie +description: Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player. +version: 3.3.2 +repository: https://github.com/xvrh/lottie-flutter + +funding: + - https://www.buymeacoffee.com/xvrh + - https://github.com/sponsors/xvrh + +environment: + sdk: '^3.9.0' + flutter: '>=3.35.0' + +dependencies: + archive: ^4.0.0 + flutter: + sdk: flutter + http: ^1.0.0 + path: ^1.8.0 + vector_math: ^2.1.0 + +dev_dependencies: + analyzer: + dart_style: + flutter_lints: + flutter_test: + sdk: flutter + pub_semver: + yaml: diff --git a/lottie/test/characters_test.dart b/lottie/test/characters_test.dart new file mode 100644 index 0000000..c8fade0 --- /dev/null +++ b/lottie/test/characters_test.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/src/utils/characters.dart'; + +void main() { + test('TrimTrailing characters', () { + expect( + 'ab c d '.characters.trimTrailing(' '.characters), + 'ab c d'.characters, + ); + expect(' '.characters.trimTrailing(' '.characters), ''.characters); + expect(' a '.characters.trimTrailing(' '.characters), ' a'.characters); + expect(' aa'.characters.trimTrailing('a'.characters), ' '.characters); + expect('aabcbc'.characters.trimTrailing('bc'.characters), 'aa'.characters); + expect('bcbc'.characters.trimTrailing('bc'.characters), ''.characters); + expect(''.characters.trimTrailing(' '.characters), ''.characters); + expect(''.characters.trimTrailing('bc'.characters), ''.characters); + expect(' '.characters.trimTrailing('bc'.characters), ' '.characters); + expect(' bc'.characters.trimTrailing('bc'.characters), ' '.characters); + }); + + test('TrimLeading characters', () { + expect(' ab '.characters.trimLeading(' '.characters), 'ab '.characters); + expect(' '.characters.trimLeading(' '.characters), ''.characters); + expect(' '.characters.trimLeading(' '.characters), ''.characters); + expect(' a'.characters.trimLeading(' '.characters), 'a'.characters); + expect('abc'.characters.trimLeading('ab'.characters), 'c'.characters); + expect('ababc'.characters.trimLeading('ab'.characters), 'c'.characters); + expect('abab'.characters.trimLeading('ab'.characters), ''.characters); + expect('ababcd'.characters.trimLeading('ab'.characters), 'cd'.characters); + expect(''.characters.trimLeading(''.characters), ''.characters); + }); + + test('Trim characters', () { + expect(' ab '.characters.trim(' '.characters), 'ab'.characters); + }); +} diff --git a/lottie/test/compositions_test.dart b/lottie/test/compositions_test.dart new file mode 100644 index 0000000..ca9c4ef --- /dev/null +++ b/lottie/test/compositions_test.dart @@ -0,0 +1,32 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/src/composition.dart'; +import 'package:lottie/src/lottie_drawable.dart'; +import 'package:path/path.dart' as p; + +void main() { + var assetsPath = 'example/assets'; + for (var file + in Directory(assetsPath) + .listSync(recursive: true) + .whereType() + .where((f) => f.path.endsWith('.json'))) { + test('Parse and draw ${p.relative(file.path, from: assetsPath)}', () async { + var composition = await LottieComposition.fromBytes( + file.readAsBytesSync(), + ); + expect(composition, isNotNull); + + var drawable = LottieDrawable(composition); + + var recorder = PictureRecorder(); + var canvas = Canvas(recorder); + for (var progress = 0; progress <= 100; progress += 20) { + drawable + ..setProgress(progress / 100) + ..draw(canvas, const Rect.fromLTWH(0, 0, 200, 200)); + } + }); + } +} diff --git a/lottie/test/data/loading_indicator.json b/lottie/test/data/loading_indicator.json new file mode 100644 index 0000000..f44b919 --- /dev/null +++ b/lottie/test/data/loading_indicator.json @@ -0,0 +1 @@ +{"v":"5.5.7","fr":29.9700012207031,"ip":35.0000014255792,"op":129.000005254278,"w":300,"h":300,"nm":"Box Icon_Test","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Kontur4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":3,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":45,"ix":4},"nm":"Rechteckpfad: 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.266666666667,0.839215746113,0.172549019608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Rechteck 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.801],"y":[0.742]},"o":{"x":[0.324],"y":[0]},"t":88,"s":[0]},{"t":127.000005172816,"s":[55]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.661]},"o":{"x":[0.175],"y":[0]},"t":90,"s":[-124]},{"i":{"x":[0.839],"y":[1]},"o":{"x":[0.167],"y":[0.125]},"t":103,"s":[-100]},{"t":123.000005009893,"s":[0]}],"ix":3},"m":1,"ix":2,"nm":"Pfade trimmen 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":55.0000022401959,"op":129.000005254278,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Kontur3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":3,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":45,"ix":4},"nm":"Rechteckpfad: 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.266666666667,0.839215746113,0.172549019608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Rechteck 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.801],"y":[0.742]},"o":{"x":[0.324],"y":[0]},"t":88,"s":[0]},{"t":127.000005172816,"s":[55]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.661]},"o":{"x":[0.175],"y":[0]},"t":90,"s":[-124]},{"i":{"x":[0.839],"y":[1]},"o":{"x":[0.167],"y":[0.125]},"t":103,"s":[-100]},{"t":123.000005009893,"s":[0]}],"ix":3},"m":1,"ix":2,"nm":"Pfade trimmen 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":55.0000022401959,"op":129.000005254278,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Kontur2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":3,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":45,"ix":4},"nm":"Rechteckpfad: 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.266666666667,0.839215746113,0.172549019608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Rechteck 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.531],"y":[1]},"o":{"x":[0.467],"y":[0]},"t":38,"s":[50]},{"t":89.0000036250443,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.607],"y":[0.813]},"o":{"x":[0.293],"y":[1.11]},"t":44,"s":[130]},{"t":90.0000036657751,"s":[237]}],"ix":3},"m":1,"ix":2,"nm":"Pfade trimmen 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":35.0000014255792,"op":93.0000037879676,"st":-3.00000012219251,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Kontur1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":3,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":45,"ix":4},"nm":"Rechteckpfad: 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.266666666667,0.839215746113,0.172549019608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Rechteck 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.531],"y":[1]},"o":{"x":[0.467],"y":[0]},"t":38,"s":[50]},{"t":89.0000036250443,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.614],"y":[0.854]},"o":{"x":[0.297],"y":[1.125]},"t":44,"s":[130]},{"t":90.0000036657751,"s":[237]}],"ix":3},"m":1,"ix":2,"nm":"Pfade trimmen 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":35.0000014255792,"op":93.0000037879676,"st":-3.00000012219251,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/lottie/test/data/static_lottie.json b/lottie/test/data/static_lottie.json new file mode 100644 index 0000000..cb8efcb --- /dev/null +++ b/lottie/test/data/static_lottie.json @@ -0,0 +1,689 @@ +{ + "v": "5.6.6", + "ip": 0, + "op": 1, + "fr": 60, + "w": 953, + "h": 272, + "layers": [ + { + "ind": 2345, + "nm": "surface13687", + "ao": 0, + "ip": 0, + "op": 60, + "st": 0, + "ty": 4, + "ks": { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [133.33, 133.33] }, + "sk": { "k": 0 }, + "sa": { "k": 0 } + }, + "shapes": [ + { + "ty": "gr", + "hd": false, + "nm": "surface13687", + "it": [ + { + "ty": "gr", + "hd": false, + "it": [ + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [20, -0.05], + [0.73, 0.64], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-20.01, 0.05], + [-1.14, 0.25], + [0, 0], + [0, 0] + ], + "v": [ + [79.56, 177.9], + [110.31, 147.43], + [163.43, 200.61], + [103.41, 200.64], + [100.84, 199.21], + [79.55, 177.9] + ], + "c": true + } + } + }, + { + "ty": "fl", + "o": { "k": 100 }, + "c": { "k": [0.03, 0.35, 0.61, 1] } + }, + { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [100, 100] }, + "sk": { "k": 0 }, + "sa": { "k": 0 }, + "hd": false + } + ] + }, + { + "ty": "gr", + "hd": false, + "it": [ + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [49.02, 147.35], + [79.55, 116.86], + [110.18, 147.3], + [110.31, 147.43], + [79.56, 177.9] + ], + "c": true + } + } + }, + { + "ty": "fl", + "o": { "k": 100 }, + "c": { "k": [0.12, 0.74, 0.99, 1] } + }, + { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [100, 100] }, + "sk": { "k": 0 }, + "sa": { "k": 0 }, + "hd": false + } + ] + }, + { + "ty": "gr", + "hd": false, + "it": [ + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [17.48, -0.07], + [0.15, -1.03], + [0, 0], + [-1.04, -0.16], + [0, 0], + [0, 0], + [13.93, -0.01], + [2.05, -0.36], + [0, 0], + [4.49, 0.1], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-17.47, 0], + [-1.34, 0.44], + [0, 0], + [0.44, 1.33], + [0, 0], + [0, 0], + [-13.93, -0.01], + [-2.07, -0.01], + [0, 0], + [-4.49, -0.18], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [249.55, 45.91], + [316.33, 45.93], + [316.32, 59.08], + [263.9, 59.1], + [263.05, 62.24], + [263.1, 97.61], + [266.25, 98.46], + [311.07, 98.44], + [311.07, 111.57], + [269.28, 111.57], + [263.07, 111.79], + [262.91, 161.71], + [249.44, 161.6], + [249.43, 48.03], + [249.55, 45.91] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [4.45, -0.12], + [0, 1.84], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [-4.46, -0.08], + [-0.34, -1.83], + [0, 0], + [0, 0] + ], + "v": [ + [332.52, 45.93], + [346.23, 45.93], + [346.24, 124.5], + [346.09, 161.5], + [332.71, 161.51], + [332.51, 155.98], + [332.52, 45.93] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-6.71, -0.54], + [0.07, -4.17], + [6.68, 0.1], + [0, 0], + [-4.17, -2.21], + [-4.51, 2.61], + [0, 0], + [5.33, 0.73], + [2.27, 7.45], + [0.03, 4.26], + [0, 0], + [0, 0], + [4.75, 0.17], + [-0.27, 4.24], + [-4.82, 0.37] + ], + "o": [ + [0, 0], + [0, 0], + [6.73, 0.16], + [-0.19, 4.17], + [-6.69, 0.02], + [0, 0], + [0.14, 4.29], + [4.76, 2.71], + [0, 0], + [-4.96, 2.25], + [-7.52, -1.15], + [-1.51, -4.08], + [0, 0], + [0, 0], + [-4.75, -0.25], + [0.03, -4.25], + [4.83, -0.08], + [0, 0] + ], + "v": [ + [466.71, 55.67], + [480.46, 55.68], + [480.49, 78.93], + [500.69, 79.16], + [500.59, 91.68], + [480.53, 91.64], + [480.48, 137.95], + [485.71, 149.63], + [500.83, 148.46], + [500.83, 161.93], + [484.87, 163.72], + [467.88, 150], + [466.69, 137.26], + [466.66, 92.16], + [466.32, 91.78], + [452.05, 91.65], + [452.16, 78.92], + [466.66, 78.77] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [-4.57, -0.16], + [0, 0], + [-0.41, -7.62], + [-6.51, 0.04], + [0, 0], + [6.55, 0.04], + [0, 0], + [-3.97, -2.02], + [-4.52, 2.71], + [0, 0], + [5.2, 0.6], + [3.18, 6.19], + [0.14, 3.58], + [0, 0], + [4.74, 0.02], + [0, 0], + [-4.67, -0.16], + [-0.29, 7.79] + ], + "o": [ + [4.57, 0.16], + [0, 0], + [0.17, 7.64], + [6.52, -0.12], + [0, 0], + [-6.55, 0.25], + [0, 0], + [-0.01, 4.1], + [4.87, 2.66], + [0, 0], + [-4.82, 2.18], + [-6.76, -0.9], + [-1.53, -3.24], + [0, 0], + [-4.75, -0.01], + [0, 0], + [4.67, 0.13], + [0.5, -7.77], + [0, 0] + ], + "v": [ + [524.82, 55.62], + [538.54, 55.73], + [538.86, 56.07], + [539.04, 78.99], + [558.58, 78.93], + [558.63, 91.57], + [538.94, 91.63], + [538.87, 138.74], + [544.01, 149.71], + [559.3, 148.29], + [559.29, 161.84], + [543.82, 163.83], + [527.28, 152.93], + [524.75, 142.52], + [524.75, 91.69], + [510.52, 91.69], + [510.55, 78.89], + [524.57, 79.01], + [524.82, 55.63] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [-9.7, -3.3], + [-3.15, -11.24], + [0.29, -6.48], + [0, 0], + [-4.83, -5.22], + [-9.97, 3.14], + [-3.59, 6.19], + [-3.96, -1.82], + [11.57, -2.22], + [8.71, 4.7], + [2.22, 12.3], + [-3.55, 8.97], + [-9.7, 4.25] + ], + "o": [ + [9.5, -3.94], + [11.11, 3.83], + [2.06, 6.23], + [0, 0], + [0.54, 6.95], + [6.86, 8], + [7, -2.06], + [3.98, 1.78], + [-5.41, 10.32], + [-9.5, 1.78], + [-11.31, -5.62], + [-1.61, -9.45], + [3.73, -9.85], + [0, 0] + ], + "v": [ + [591.59, 79.36], + [621.73, 78.65], + [644.59, 103.42], + [646.27, 122.75], + [580.98, 122.82], + [588.43, 142.08], + [617.08, 149.91], + [633.13, 136.27], + [644.93, 141.9], + [618.09, 162.64], + [589.48, 159.77], + [568.16, 130.41], + [570.61, 101.99], + [591.58, 79.36] + ], + "c": false + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [1.61, -8.46], + [0, 0], + [4.05, 4], + [9.3, -4.04] + ], + "o": [ + [-7.99, 3.69], + [0, 0], + [-0.8, -5.53], + [-7.09, -7.61], + [0, 0] + ], + "v": [ + [596.75, 91.22], + [582.01, 111.57], + [632.08, 111.41], + [625.27, 96.27], + [596.75, 91.23] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [-12.7, -5.32], + [0, 0], + [5.63, -1.66], + [2.18, -7.55], + [-0.06, -5.23], + [0.44, -6.76], + [-0.5, -5.85], + [4.66, -0.16], + [0.07, 17.64], + [0, 0], + [-4.38, -0.11], + [-0.73, -4.37] + ], + "o": [ + [5.23, -12.7], + [0, 0], + [-5.33, -2.1], + [-7.7, 2.29], + [-1.5, 5.1], + [-0.59, 6.77], + [0.36, 5.84], + [-4.66, 0.23], + [-0.27, -17.63], + [0, 0], + [4.37, 0.12], + [0.4, 4.38], + [0, 0] + ], + "v": [ + [675.99, 92.31], + [709.98, 78.26], + [709.98, 93.08], + [693.04, 91.34], + [677.46, 108.05], + [676.59, 123.7], + [676.44, 144], + [676.62, 161.54], + [662.63, 161.68], + [662.52, 108.76], + [662.62, 79.07], + [675.75, 79.16], + [675.99, 92.31] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [-4.63, -0.52], + [0, 0], + [-4.16, -4.66], + [-7.34, 2.35], + [0.39, 10.38], + [0, 0], + [0, 0], + [0, 0], + [4.43, 0.05], + [0, 0], + [4.12, -2.27], + [9.44, 2.72], + [3.05, 5.58], + [0.21, 6.99], + [0, 0] + ], + "o": [ + [4.65, 0.2], + [0, 0], + [-0.05, 6.01], + [5.36, 5.94], + [9.8, -3.51], + [0, 0], + [0, 0], + [0, 0], + [-4.44, -0.07], + [0, 0], + [-2.87, 3.61], + [-8.43, 5.32], + [-6.09, -1.84], + [-3.62, -6.14], + [0, 0], + [0, 0] + ], + "v": [ + [365.89, 78.91], + [379.86, 79.15], + [379.79, 128.31], + [384.75, 145.54], + [406.54, 150.22], + [422.78, 125.95], + [422.93, 78.91], + [436.93, 78.94], + [436.85, 161.48], + [423.55, 161.43], + [423.5, 149.68], + [413.49, 159.21], + [384.93, 162.51], + [370.48, 150.83], + [365.73, 130.45], + [365.9, 78.91] + ], + "c": true + } + } + }, + { "ty": "fl", "o": { "k": 54 }, "c": { "k": [0, 0, 0, 1] } }, + { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [100, 100] }, + "sk": { "k": 0 }, + "sa": { "k": 0 }, + "hd": false + } + ] + }, + { + "ty": "gr", + "hd": false, + "it": [ + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [102.21, 3.07], + [163.46, 3], + [60.7, 105.71], + [33.92, 132.34], + [3.45, 101.83] + ], + "c": true + } + } + }, + { + "ty": "sh", + "ks": { + "k": { + "i": [ + [0, 0], + [-1.11, 0.14], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0.8, -1.05], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [101.64, 94.78], + [105.01, 94.11], + [163.41, 94.12], + [110.18, 147.3], + [79.55, 116.86], + [101.64, 94.78] + ], + "c": true + } + } + }, + { + "ty": "fl", + "o": { "k": 100 }, + "c": { "k": [0.27, 0.82, 0.99, 1] } + }, + { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [100, 100] }, + "sk": { "k": 0 }, + "sa": { "k": 0 }, + "hd": false + } + ] + }, + { + "ty": "tr", + "o": { "k": 100 }, + "r": { "k": 0 }, + "p": { "k": [0, 0] }, + "a": { "k": [0, 0] }, + "s": { "k": [100, 100] }, + "sk": { "k": 0 }, + "sa": { "k": 0 }, + "hd": false + } + ] + } + ] + } + ], + "meta": { "g": "LF SVG to Lottie" } +} diff --git a/lottie/test/data/warningShimmer.json b/lottie/test/data/warningShimmer.json new file mode 100644 index 0000000..9991b2e --- /dev/null +++ b/lottie/test/data/warningShimmer.json @@ -0,0 +1,1850 @@ +{ + "v": "5.5.9", + "fr": 29.9700012207031, + "ip": 0, + "op": 38.0000015477717, + "w": 114, + "h": 114, + "nm": "Warning", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Layer 5 Outlines", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 26, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 32, + "s": [ + 100 + ] + }, + { + "t": 38.0000015477717, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 56.853, + 56.618, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 56.897, + 56.897, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 26, + "s": [ + 83, + 83, + 100 + ] + }, + { + "t": 38.0000015477717, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 28.397, + 0 + ], + [ + 0, + -28.397 + ], + [ + -28.397, + 0 + ], + [ + 0, + 28.397 + ] + ], + "o": [ + [ + -28.397, + 0 + ], + [ + 0, + 28.397 + ], + [ + 28.397, + 0 + ], + [ + 0, + -28.397 + ] + ], + "v": [ + [ + 0.001, + -51.497 + ], + [ + -51.498, + 0.001 + ], + [ + 0.001, + 51.497 + ], + [ + 51.498, + 0.001 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 31.234, + 0 + ], + [ + 0, + 31.233 + ], + [ + -31.236, + 0 + ], + [ + 0, + -31.237 + ] + ], + "o": [ + [ + -31.236, + 0 + ], + [ + 0, + -31.237 + ], + [ + 31.234, + 0 + ], + [ + 0, + 31.233 + ] + ], + "v": [ + [ + 0.001, + 56.647 + ], + [ + -56.647, + 0.001 + ], + [ + 0.001, + -56.647 + ], + [ + 56.647, + 0.001 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 0.419999994016, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 56.897, + 56.898 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 4.00000016292334, + "op": 320.000013033867, + "st": 4.00000016292334, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Layer 2 Outlines", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 20, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 26, + "s": [ + 100 + ] + }, + { + "t": 32.0000013033867, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 56.853, + 56.618, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 56.897, + 56.897, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 20, + "s": [ + 83, + 83, + 100 + ] + }, + { + "t": 32.0000013033867, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 28.397, + 0 + ], + [ + 0, + -28.397 + ], + [ + -28.397, + 0 + ], + [ + 0, + 28.397 + ] + ], + "o": [ + [ + -28.397, + 0 + ], + [ + 0, + 28.397 + ], + [ + 28.397, + 0 + ], + [ + 0, + -28.397 + ] + ], + "v": [ + [ + 0.001, + -51.497 + ], + [ + -51.498, + 0.001 + ], + [ + 0.001, + 51.497 + ], + [ + 51.498, + 0.001 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 31.234, + 0 + ], + [ + 0, + 31.233 + ], + [ + -31.236, + 0 + ], + [ + 0, + -31.237 + ] + ], + "o": [ + [ + -31.236, + 0 + ], + [ + 0, + -31.237 + ], + [ + 31.234, + 0 + ], + [ + 0, + 31.233 + ] + ], + "v": [ + [ + 0.001, + 56.647 + ], + [ + -56.647, + 0.001 + ], + [ + 0.001, + -56.647 + ], + [ + 56.647, + 0.001 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 0.419999994016, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 56.897, + 56.898 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 316.000012870944, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Layer 4 Outlines", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 0, + "s": [ + 57.387, + 65.377, + 0 + ], + "to": [ + 0, + -0.35, + 0 + ], + "ti": [ + 0, + 0.835, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 4, + "s": [ + 57.387, + 65.46, + 0 + ], + "to": [ + 0, + -1.455, + 0 + ], + "ti": [ + 0, + 0.609, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 11, + "s": [ + 57.387, + 56.377, + 0 + ], + "to": [ + 0, + -0.958, + 0 + ], + "ti": [ + 0, + 0.609, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 13, + "s": [ + 57.387, + 50.877, + 0 + ], + "to": [ + 0, + -0.958, + 0 + ], + "ti": [ + 0, + 0.609, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 15, + "s": [ + 57.387, + 56.377, + 0 + ], + "to": [ + 0, + -0.958, + 0 + ], + "ti": [ + 0, + -0.417, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 19, + "s": [ + 57.387, + 65.627, + 0 + ], + "to": [ + 0, + 0.417, + 0 + ], + "ti": [ + 0, + 0.958, + 0 + ] + }, + { + "t": 22.0000008960784, + "s": [ + 57.387, + 65.377, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 5.434, + 31.682, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 0, + "s": [ + 100, + 100, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 4, + "s": [ + 115, + 90, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 8, + "s": [ + 100, + 112, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 11, + "s": [ + 100, + 112, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 13, + "s": [ + 113.333, + 94.333, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 15, + "s": [ + 100, + 112, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 20, + "s": [ + 113, + 95, + 100 + ] + }, + { + "t": 22.0000008960784, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 2.878, + 0 + ], + [ + 0, + -2.487 + ], + [ + 0, + 0 + ], + [ + -2.951, + 0 + ], + [ + 0, + 2.426 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + -2.951, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 2.49 + ], + [ + 2.878, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -2.428 + ] + ], + "v": [ + [ + 0.001, + -15.433 + ], + [ + -5.184, + -11.406 + ], + [ + -5.184, + 11.409 + ], + [ + 0.001, + 15.433 + ], + [ + 5.184, + 11.409 + ], + [ + 5.184, + -11.406 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 5.433, + 15.682 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 316.000012870944, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Layer 3 Outlines", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 57.011, + 80.341, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 5.516, + 11.142, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 20, + "s": [ + 100, + 100, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 22, + "s": [ + 100, + 79, + 100 + ] + }, + { + "t": 24.00000097754, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 2.834, + 0 + ], + [ + 0, + -2.837 + ], + [ + -2.835, + 0 + ], + [ + 0, + 2.833 + ] + ], + "o": [ + [ + -2.835, + 0 + ], + [ + 0, + 2.833 + ], + [ + 2.834, + 0 + ], + [ + 0, + -2.837 + ] + ], + "v": [ + [ + 0.002, + -5.142 + ], + [ + -5.141, + 0.003 + ], + [ + 0.002, + 5.142 + ], + [ + 5.141, + 0.003 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 5.391, + 5.392 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 316.000012870944, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Layer 1 Outlines", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 56.854, + 56.618, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 41.449, + 41.449, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -22.753, + 0 + ], + [ + 0, + -22.753 + ], + [ + 22.754, + 0 + ], + [ + 0, + 22.754 + ] + ], + "o": [ + [ + 22.754, + 0 + ], + [ + 0, + 22.754 + ], + [ + -22.753, + 0 + ], + [ + 0, + -22.753 + ] + ], + "v": [ + [ + 0, + -41.199 + ], + [ + 41.199, + 0 + ], + [ + 0, + 41.199 + ], + [ + -41.199, + 0 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 0.419999994016, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 41.449, + 41.449 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 316.000012870944, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} \ No newline at end of file diff --git a/lottie/test/dotlottie.dart b/lottie/test/dotlottie.dart new file mode 100644 index 0000000..4d06ed9 --- /dev/null +++ b/lottie/test/dotlottie.dart @@ -0,0 +1,39 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:lottie/src/utils.dart'; +import 'package:path/path.dart' as p; + +void main() { + testWidgets('Dotlottie', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var provider = FileLottie( + File('example/assets/cat.lottie'), + decoder: customDecoder, + ); + await tester.runAsync(() => provider.load()); + + await tester.pumpWidget(LottieBuilder(lottie: provider)); + + await expectLater( + find.byType(Lottie), + matchesGoldenFile(p.join('goldens/dotlottie.png')), + ); + }); +} + +Future customDecoder(List bytes) { + return LottieComposition.decodeZip( + bytes, + filePicker: (files) { + return files.firstWhereOrNull( + (f) => f.name.startsWith('animations/') && f.name.endsWith('.json'), + ); + }, + ); +} diff --git a/lottie/test/dynamic_image_test.dart b/lottie/test/dynamic_image_test.dart new file mode 100644 index 0000000..6d66722 --- /dev/null +++ b/lottie/test/dynamic_image_test.dart @@ -0,0 +1,96 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:ui' as ui; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'utils.dart'; + +void main() { + testWidgets('Can specify ImageProvider with zip file ', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var callCount = 0; + ImageProvider imageProviderFactory(LottieImageAsset image) { + ++callCount; + return FileImage(File('example/assets/Images/WeAccept/img_0.png')); + } + + Future decoder(List bytes) { + return LottieComposition.decodeZip( + bytes, + imageProviderFactory: imageProviderFactory, + ); + } + + var composition = (await tester.runAsync( + () => FileLottie( + File('example/assets/spinning_carrousel.zip'), + imageProviderFactory: imageProviderFactory, + decoder: decoder, + ).load(), + ))!; + + await tester.pumpWidget(FilmStrip(composition, size: size)); + + expect(callCount, 2); + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile('goldens/dynamic_image/zip_with_provider.png'), + ); + }); + + testWidgets('Can specify image delegate', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var image = await tester.runAsync( + () async => loadImage( + FileImage(File('example/assets/Images/WeAccept/img_0.png')), + ), + ); + + var composition = (await tester.runAsync( + () async => + FileLottie(File('example/assets/spinning_carrousel.zip')).load(), + ))!; + + var delegates = LottieDelegates( + image: (composition, asset) { + return image; + }, + ); + await tester.pumpWidget( + FilmStrip(composition, size: size, delegates: delegates), + ); + + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile('goldens/dynamic_image/delegate.png'), + ); + }); +} + +Future loadImage(ImageProvider provider) { + var completer = Completer(); + var imageStream = provider.resolve(ImageConfiguration.empty); + late ImageStreamListener listener; + listener = ImageStreamListener( + (image, synchronousLoaded) { + imageStream.removeListener(listener); + + completer.complete(image.image); + }, + onError: (dynamic e, _) { + imageStream.removeListener(listener); + + completer.complete(); + }, + ); + imageStream.addListener(listener); + + return completer.future; +} diff --git a/lottie/test/dynamic_properties_test.dart b/lottie/test/dynamic_properties_test.dart new file mode 100644 index 0000000..ece7d18 --- /dev/null +++ b/lottie/test/dynamic_properties_test.dart @@ -0,0 +1,478 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'utils.dart'; + +void main() { + void testGolden( + String description, + ValueDelegate delegate, { + double? progress, + String? filePath, + }) { + filePath ??= 'Tests/Shapes.json'; + + var screenshotName = description + .toLowerCase() + .replaceAll(RegExp('[^a-z0-9 ]'), '') + .replaceAll(' ', '_'); + + testWidgets(description, (tester) async { + var composition = await LottieComposition.fromBytes( + File('example/assets/$filePath').readAsBytesSync(), + ); + + var animation = AnimationController( + vsync: tester, + duration: composition.duration, + ); + if (progress != null) { + animation.value = progress; + } + + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates(values: [delegate]), + addRepaintBoundary: false, + ), + ); + await tester.pump(); + await expectLater( + find.byType(Lottie), + matchesGoldenFile('goldens/dynamic/$screenshotName.png'), + ); + + if (progress == null || progress == 0) { + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: const LottieDelegates(values: []), + addRepaintBoundary: false, + ), + ); + await tester.pump(); + } + }); + } + + testGolden( + 'Fill color (Green)', + ValueDelegate.color([ + 'Shape Layer 1', + 'Rectangle', + 'Fill 1', + ], value: Colors.green), + ); + + testGolden( + 'Fill color (Yellow)', + ValueDelegate.color([ + 'Shape Layer 1', + 'Rectangle', + 'Fill 1', + ], value: Colors.yellow), + ); + + testGolden( + 'Fill opacity', + ValueDelegate.opacity(['Shape Layer 1', 'Rectangle', 'Fill 1'], value: 50), + ); + + testGolden( + 'Stroke color', + ValueDelegate.strokeColor([ + 'Shape Layer 1', + 'Rectangle', + 'Stroke 1', + ], value: Colors.green), + ); + + testGolden( + 'Stroke width', + ValueDelegate.strokeWidth([ + 'Shape Layer 1', + 'Rectangle', + 'Stroke 1', + ], value: 50), + ); + + testGolden( + 'Stroke opacity', + ValueDelegate.opacity([ + 'Shape Layer 1', + 'Rectangle', + 'Stroke 1', + ], value: 50), + ); + + testGolden( + 'Transform anchor point', + ValueDelegate.transformAnchorPoint([ + 'Shape Layer 1', + 'Rectangle', + ], value: const Offset(20, 20)), + ); + + testGolden( + 'Transform position', + ValueDelegate.transformPosition([ + 'Shape Layer 1', + 'Rectangle', + ], value: const Offset(20, 20)), + ); + + testGolden( + 'Transform position (relative)', + ValueDelegate.transformPosition([ + 'Shape Layer 1', + 'Rectangle', + ], relative: const Offset(20, 20)), + ); + + testGolden( + 'Transform opacity', + ValueDelegate.transformOpacity(['Shape Layer 1', 'Rectangle'], value: 50), + ); + + testGolden( + 'Transform rotation', + ValueDelegate.transformRotation(['Shape Layer 1', 'Rectangle'], value: 45), + ); + + testGolden( + 'Transform scale', + ValueDelegate.transformScale([ + 'Shape Layer 1', + 'Rectangle', + ], value: const Offset(0.5, 0.5)), + ); + + testGolden( + 'Rectangle corner roundedness', + ValueDelegate.cornerRadius([ + 'Shape Layer 1', + 'Rectangle', + 'Rectangle Path 1', + ], value: 7), + ); + + testGolden( + 'Rectangle position', + ValueDelegate.position([ + 'Shape Layer 1', + 'Rectangle', + 'Rectangle Path 1', + ], relative: const Offset(20, 20)), + ); + + testGolden( + 'Rectangle size', + ValueDelegate.rectangleSize([ + 'Shape Layer 1', + 'Rectangle', + 'Rectangle Path 1', + ], relative: const Offset(30, 40)), + ); + + testGolden( + 'Ellipse position', + ValueDelegate.position([ + 'Shape Layer 1', + 'Ellipse', + 'Ellipse Path 1', + ], relative: const Offset(20, 20)), + ); + + testGolden( + 'Ellipse size', + ValueDelegate.ellipseSize([ + 'Shape Layer 1', + 'Ellipse', + 'Ellipse Path 1', + ], relative: const Offset(40, 60)), + ); + + testGolden( + 'Star points', + ValueDelegate.polystarPoints([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 8), + ); + + testGolden( + 'Star rotation', + ValueDelegate.polystarRotation([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 10), + ); + + testGolden( + 'Star position', + ValueDelegate.position([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], relative: const Offset(20, 20)), + ); + + testGolden( + 'Star inner radius', + ValueDelegate.polystarInnerRadius([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 10), + ); + + testGolden( + 'Star inner roundedness', + ValueDelegate.polystarInnerRoundedness([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 100), + ); + + testGolden( + 'Star outer radius', + ValueDelegate.polystarOuterRadius([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 60), + ); + + testGolden( + 'Star outer roundedness', + ValueDelegate.polystarOuterRoundedness([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 100), + ); + + testGolden( + 'Polygon points', + ValueDelegate.polystarPoints([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 8), + ); + + testGolden( + 'Polygon rotation', + ValueDelegate.polystarRotation([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 10), + ); + + testGolden( + 'Polygon position', + ValueDelegate.position([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], relative: const Offset(20, 20)), + ); + + testGolden( + 'Polygon radius', + ValueDelegate.polystarOuterRadius([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], relative: 60), + ); + + testGolden( + 'Polygon roundedness', + ValueDelegate.polystarOuterRoundedness([ + 'Shape Layer 1', + 'Star', + 'Polystar Path 1', + ], value: 100), + ); + + testGolden( + 'Repeater transform position', + ValueDelegate.transformPosition([ + 'Shape Layer 1', + 'Repeater Shape', + 'Repeater 1', + ], relative: const Offset(100, 100)), + ); + + testGolden( + 'Repeater transform start opacity', + ValueDelegate.transformStartOpacity([ + 'Shape Layer 1', + 'Repeater Shape', + 'Repeater 1', + ], value: 25), + ); + + testGolden( + 'Repeater transform end opacity', + ValueDelegate.transformEndOpacity([ + 'Shape Layer 1', + 'Repeater Shape', + 'Repeater 1', + ], value: 25), + ); + + testGolden( + 'Repeater transform rotation', + ValueDelegate.transformRotation([ + 'Shape Layer 1', + 'Repeater Shape', + 'Repeater 1', + ], value: 45), + ); + + testGolden( + 'Repeater transform scale', + ValueDelegate.transformScale([ + 'Shape Layer 1', + 'Repeater Shape', + 'Repeater 1', + ], value: const Offset(2, 2)), + ); + + testGolden( + 'Time remapping', + ValueDelegate.timeRemap(['Circle 1'], value: 1), + progress: 0.1, + ); + + testGolden( + 'Color Filter', + ValueDelegate.colorFilter([ + '**', + ], value: const ColorFilter.mode(Colors.green, BlendMode.srcATop)), + ); + + testGolden('Null Color Filter', ValueDelegate.colorFilter(['**'])); + + testGolden( + 'Matte property', + ValueDelegate.rectangleSize([ + 'Shape Layer 1', + 'Rectangle 1', + 'Rectangle Path 1', + ], value: const Offset(50, 50)), + filePath: 'Tests/TrackMattes.json', + ); + + testGolden('Blur', ValueDelegate.blurRadius(['**'], value: 10)); + + testGolden( + 'Drop shadow', + ValueDelegate.dropShadow( + ['Shape Layer 1', '**'], + value: const DropShadow( + color: Colors.green, + direction: 150, + distance: 20, + radius: 10, + ), + ), + ); + + testGolden( + 'Solid Color', + ValueDelegate.color(['Cyan Solid 1', '**'], value: Colors.yellow), + filePath: 'Tests/SolidLayerTransform.json', + ); + + for (var progress in [0.0, 0.5, 1.0]) { + testGolden( + 'Opacity interpolation ($progress)', + ValueDelegate.transformOpacity( + ['Shape Layer 1', 'Rectangle'], + callback: (frameInfo) => lerpDouble( + 10, + 100, + Curves.linear.transform(frameInfo.overallProgress), + )!.round(), + ), + progress: progress, + ); + } + + testWidgets('warningShimmer', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var composition = await LottieComposition.fromBytes( + File('test/data/warningShimmer.json').readAsBytesSync(), + ); + + var delegates = >{ + '1': [ + for (var i in ['1', '2', '5']) + ValueDelegate.color(['Layer $i Outlines', '**'], value: Colors.red), + for (var i in ['3', '4']) + ValueDelegate.color([ + 'Layer $i Outlines', + '**', + ], value: Colors.greenAccent), + ], + '2': [ + for (var i in ['1', '2', '5']) + ValueDelegate.color([ + 'Layer $i Outlines', + 'Group 1', + '*', + ], value: Colors.red), + for (var i in ['3', '4']) + ValueDelegate.color([ + 'Layer $i Outlines', + 'Group 1', + '*', + ], value: Colors.greenAccent), + ], + '3': [ + for (var i in ['1', '2', '5']) + ValueDelegate.color([ + 'Layer $i Outlines', + 'Group 1', + 'Fill 1', + ], value: Colors.red), + for (var i in ['3', '4']) + ValueDelegate.color([ + 'Layer $i Outlines', + 'Group 1', + 'Fill 1', + ], value: Colors.greenAccent), + ], + }; + + for (var variant in delegates.entries) { + await tester.pumpWidget( + FilmStrip( + composition, + size: size, + delegates: LottieDelegates(values: variant.value), + ), + ); + + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile('goldens/warningShimmer_${variant.key}.png'), + ); + } + }); +} diff --git a/lottie/test/dynamic_test.dart b/lottie/test/dynamic_test.dart new file mode 100644 index 0000000..5fed2fe --- /dev/null +++ b/lottie/test/dynamic_test.dart @@ -0,0 +1,40 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'utils.dart'; + +void main() { + var root = 'example/assets'; + + testWidgets('Mirror animation', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var composition = (await tester.runAsync( + () => FileLottie(File('$root/Tests/MatteTimeStretchScan.json')).load(), + ))!; + await tester.pumpWidget( + FilmStrip( + composition, + size: size, + delegates: LottieDelegates( + values: [ + ValueDelegate.transformAnchorPoint( + [], + value: Offset(composition.bounds.width.toDouble(), 0), + ), + ValueDelegate.transformScale([], value: const Offset(-1, 1)), + ], + ), + ), + ); + + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile('goldens/mirror.png'), + ); + }); +} diff --git a/lottie/test/dynamic_text_properties_test.dart b/lottie/test/dynamic_text_properties_test.dart new file mode 100644 index 0000000..db4982f --- /dev/null +++ b/lottie/test/dynamic_text_properties_test.dart @@ -0,0 +1,61 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; + +void main() { + late LottieComposition composition; + + setUpAll(() async { + composition = await LottieComposition.fromBytes( + File('example/assets/Tests/Text.json').readAsBytesSync(), + ); + }); + + void testGolden(String description, ValueDelegate delegate) async { + var screenshotName = description + .toLowerCase() + .replaceAll(RegExp('[^a-z0-9 ]'), '') + .replaceAll(' ', '_'); + + testWidgets(description, (tester) async { + await tester.pumpWidget( + Lottie( + composition: composition, + delegates: LottieDelegates(values: [delegate]), + addRepaintBoundary: false, + ), + ); + await tester.pump(); + await expectLater( + find.byType(Lottie), + matchesGoldenFile('goldens/dynamic_text/$screenshotName.png'), + ); + }); + } + + testGolden( + 'Text Fill (Blue -> Green)', + ValueDelegate.color(['Text'], callback: (_) => Colors.green), + ); + + testGolden( + 'Text Stroke (Red -> Yellow)', + ValueDelegate.strokeColor(['Text'], callback: (_) => Colors.yellow), + ); + + testGolden( + 'Text Stroke Width', + ValueDelegate.strokeWidth(['Text'], callback: (_) => 200), + ); + + testGolden( + 'Text Tracking 1', + ValueDelegate.textTracking(['Text'], callback: (_) => 20), + ); + + testGolden( + 'Text Tracking 2', + ValueDelegate.textSize(['Text'], callback: (_) => 60), + ); +} diff --git a/lottie/test/dynamic_text_test.dart b/lottie/test/dynamic_text_test.dart new file mode 100644 index 0000000..78df34a --- /dev/null +++ b/lottie/test/dynamic_text_test.dart @@ -0,0 +1,103 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'utils.dart'; + +void main() { + late LottieComposition composition; + + setUpAll(() async { + composition = await LottieComposition.fromBytes( + File('example/assets/Tests/DynamicText.json').readAsBytesSync(), + ); + }); + + void testGolden(String description, LottieDelegates delegates) async { + var screenshotName = description + .toLowerCase() + .replaceAll(RegExp('[^a-z0-9 ]'), '') + .replaceAll(' ', '_'); + + var size = const Size(500, 400); + testWidgets(description, (tester) async { + await tester.pumpWidget( + MaterialApp( + home: FilmStrip(composition, delegates: delegates, size: size), + ), + ); + await tester.pump(); + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile('goldens/dynamic_text/$screenshotName.png'), + ); + }); + } + + testGolden( + 'Dynamic text delegate', + LottieDelegates( + text: (input) => '🔥c️🔥👮🏿‍🔥', + textStyle: (font) => const TextStyle( + fontFamily: 'Roboto', + fontFamilyFallback: ['Noto Emoji'], + ), + values: const [], + ), + ); + + testGolden( + 'Dynamic Text ValueDelegate', + LottieDelegates( + values: [ + ValueDelegate.text(['NAME'], value: 'Text with ValueDelegate'), + ], + ), + ); + + testGolden( + 'Dynamic Text ValueDelegate overallProgress', + LottieDelegates( + values: [ + ValueDelegate.text([ + 'NAME', + ], callback: (frame) => '${frame.overallProgress}'), + ], + ), + ); + + testGolden( + 'Dynamic Text ValueDelegate startValue', + LottieDelegates( + values: [ + ValueDelegate.text([ + 'NAME', + ], callback: (frame) => '${frame.startValue}!!'), + ], + ), + ); + + testGolden( + 'Dynamic Text ValueDelegate endValue', + LottieDelegates( + values: [ + ValueDelegate.text([ + 'NAME', + ], callback: (frame) => '${frame.endValue}!!'), + ], + ), + ); + + testGolden( + 'Dynamic Text Emoji', + LottieDelegates( + textStyle: (font) => const TextStyle( + fontFamily: 'Roboto', + fontFamilyFallback: ['Noto Emoji'], + ), + values: [ + ValueDelegate.text(['NAME'], value: '🔥💪💯'), + ], + ), + ); +} diff --git a/lottie/test/fireworks_test.dart b/lottie/test/fireworks_test.dart new file mode 100644 index 0000000..e744859 --- /dev/null +++ b/lottie/test/fireworks_test.dart @@ -0,0 +1,26 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path/path.dart' as p; +import 'utils.dart'; + +void main() { + testWidgets('Animations with stroke', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var composition = await LottieComposition.fromBytes( + File('example/assets/17297-fireworks.json').readAsBytesSync(), + ); + + await tester.pumpWidget(FilmStrip(composition, size: size)); + + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile(p.join('goldens/fireworks.png')), + ); + }); +} diff --git a/lottie/test/flutter_test_config.dart b/lottie/test/flutter_test_config.dart new file mode 100644 index 0000000..991fd95 --- /dev/null +++ b/lottie/test/flutter_test_config.dart @@ -0,0 +1,22 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/services.dart'; +import 'package:path/path.dart' as path; + +Future testExecutable(FutureOr Function() testMain) async { + await loadFonts(); + return testMain(); +} + +Future loadFonts() async { + for (var file in Directory( + 'example/assets/fonts', + ).listSync().whereType().where((f) => f.path.endsWith('.ttf'))) { + var fontLoader = FontLoader( + path.basenameWithoutExtension(file.path).replaceAll('-', ' '), + ); + var future = file.readAsBytes().then((value) => value.buffer.asByteData()); + fontLoader.addFont(future); + await fontLoader.load(); + } +} diff --git a/lottie/test/frame_rate_test.dart b/lottie/test/frame_rate_test.dart new file mode 100644 index 0000000..f353155 --- /dev/null +++ b/lottie/test/frame_rate_test.dart @@ -0,0 +1,17 @@ +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; + +void main() { + test('Frame rate round', () async { + var composition = await LottieComposition.fromBytes( + File('example/assets/LottieLogo1.json').readAsBytesSync(), + ); + expect(composition.roundProgress(0, frameRate: FrameRate.composition), 0); + expect( + composition.roundProgress(0.0001, frameRate: FrameRate.composition), + 0, + ); + expect(composition.roundProgress(0.0001, frameRate: FrameRate.max), 0.0001); + }); +} diff --git a/lottie/test/gamma_evaluator_test.dart b/lottie/test/gamma_evaluator_test.dart new file mode 100644 index 0000000..fd9d0e6 --- /dev/null +++ b/lottie/test/gamma_evaluator_test.dart @@ -0,0 +1,13 @@ +import 'dart:ui'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/src/utils/gamma_evaluator.dart'; + +void main() { + test('Evaluate for same color values', () { + for (var color = 0x000000; color <= 0xffffff; color++) { + var colorToTest = Color(0xff000000 | color); + var actual = GammaEvaluator.evaluate(0.3, colorToTest, colorToTest); + expect(actual, colorToTest); + } + }); +} diff --git a/lottie/test/golden/AndroidWave_0_0.png b/lottie/test/golden/AndroidWave_0_0.png new file mode 100644 index 0000000..9683bb9 Binary files /dev/null and b/lottie/test/golden/AndroidWave_0_0.png differ diff --git a/lottie/test/golden/HamburgerArrow_0_0.png b/lottie/test/golden/HamburgerArrow_0_0.png new file mode 100644 index 0000000..60ca047 Binary files /dev/null and b/lottie/test/golden/HamburgerArrow_0_0.png differ diff --git a/lottie/test/golden/HamburgerArrow_0_5.png b/lottie/test/golden/HamburgerArrow_0_5.png new file mode 100644 index 0000000..56d41dd Binary files /dev/null and b/lottie/test/golden/HamburgerArrow_0_5.png differ diff --git a/lottie/test/golden/HamburgerArrow_1_0.png b/lottie/test/golden/HamburgerArrow_1_0.png new file mode 100644 index 0000000..60ca047 Binary files /dev/null and b/lottie/test/golden/HamburgerArrow_1_0.png differ diff --git a/lottie/test/golden/Logo/LogoSmall_0_5.png b/lottie/test/golden/Logo/LogoSmall_0_5.png new file mode 100644 index 0000000..04a10aa Binary files /dev/null and b/lottie/test/golden/Logo/LogoSmall_0_5.png differ diff --git a/lottie/test/golden/Mobilo/A_0_5.png b/lottie/test/golden/Mobilo/A_0_5.png new file mode 100644 index 0000000..d3718b1 Binary files /dev/null and b/lottie/test/golden/Mobilo/A_0_5.png differ diff --git a/lottie/test/golden/Mobilo/B_0_5.png b/lottie/test/golden/Mobilo/B_0_5.png new file mode 100644 index 0000000..276acdc Binary files /dev/null and b/lottie/test/golden/Mobilo/B_0_5.png differ diff --git a/lottie/test/golden/lottiefiles/atm_link_1_0.png b/lottie/test/golden/lottiefiles/atm_link_1_0.png new file mode 100644 index 0000000..87dcf30 Binary files /dev/null and b/lottie/test/golden/lottiefiles/atm_link_1_0.png differ diff --git a/lottie/test/golden_test.dart b/lottie/test/golden_test.dart new file mode 100644 index 0000000..ad50680 --- /dev/null +++ b/lottie/test/golden_test.dart @@ -0,0 +1,37 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path/path.dart' as p; +import 'utils.dart'; + +void main() { + var root = 'example/assets'; + for (var asset + in Directory(root) + .listSync(recursive: true) + .whereType() + .where( + (f) => const ['.json', '.zip'].contains(p.extension(f.path)), + )) { + testWidgets('Goldens ${asset.path}', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + var composition = (await tester.runAsync( + () => FileLottie(asset).load(), + ))!; + + await tester.pumpWidget(FilmStrip(composition, size: size)); + + var folder = p.relative(asset.path, from: root); + var fileName = '${p.basenameWithoutExtension(asset.path)}.png' + .toLowerCase(); + await expectLater( + find.byType(FilmStrip), + matchesGoldenFile(p.join('goldens/all', p.dirname(folder), fileName)), + ); + }); + } +} diff --git a/lottie/test/goldens/all/14595-thumbs-up.png b/lottie/test/goldens/all/14595-thumbs-up.png new file mode 100644 index 0000000..133e2a0 Binary files /dev/null and b/lottie/test/goldens/all/14595-thumbs-up.png differ diff --git a/lottie/test/goldens/all/17297-fireworks.png b/lottie/test/goldens/all/17297-fireworks.png new file mode 100644 index 0000000..f1be459 Binary files /dev/null and b/lottie/test/goldens/all/17297-fireworks.png differ diff --git a/lottie/test/goldens/all/Logo/logosmall.png b/lottie/test/goldens/all/Logo/logosmall.png new file mode 100644 index 0000000..5e2d3a3 Binary files /dev/null and b/lottie/test/goldens/all/Logo/logosmall.png differ diff --git a/lottie/test/goldens/all/Mobilo/a.png b/lottie/test/goldens/all/Mobilo/a.png new file mode 100644 index 0000000..c5e8f34 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/a.png differ diff --git a/lottie/test/goldens/all/Mobilo/apostrophe.png b/lottie/test/goldens/all/Mobilo/apostrophe.png new file mode 100644 index 0000000..77a071b Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/apostrophe.png differ diff --git a/lottie/test/goldens/all/Mobilo/b.png b/lottie/test/goldens/all/Mobilo/b.png new file mode 100644 index 0000000..5eae13f Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/b.png differ diff --git a/lottie/test/goldens/all/Mobilo/blinkingcursor.png b/lottie/test/goldens/all/Mobilo/blinkingcursor.png new file mode 100644 index 0000000..2e799fc Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/blinkingcursor.png differ diff --git a/lottie/test/goldens/all/Mobilo/c.png b/lottie/test/goldens/all/Mobilo/c.png new file mode 100644 index 0000000..6cb7fa1 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/c.png differ diff --git a/lottie/test/goldens/all/Mobilo/colon.png b/lottie/test/goldens/all/Mobilo/colon.png new file mode 100644 index 0000000..2c4998f Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/colon.png differ diff --git a/lottie/test/goldens/all/Mobilo/comma.png b/lottie/test/goldens/all/Mobilo/comma.png new file mode 100644 index 0000000..a0bb2bd Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/comma.png differ diff --git a/lottie/test/goldens/all/Mobilo/d.png b/lottie/test/goldens/all/Mobilo/d.png new file mode 100644 index 0000000..61cc856 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/d.png differ diff --git a/lottie/test/goldens/all/Mobilo/e.png b/lottie/test/goldens/all/Mobilo/e.png new file mode 100644 index 0000000..5f1c81f Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/e.png differ diff --git a/lottie/test/goldens/all/Mobilo/f.png b/lottie/test/goldens/all/Mobilo/f.png new file mode 100644 index 0000000..80b044b Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/f.png differ diff --git a/lottie/test/goldens/all/Mobilo/g.png b/lottie/test/goldens/all/Mobilo/g.png new file mode 100644 index 0000000..652fa5c Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/g.png differ diff --git a/lottie/test/goldens/all/Mobilo/h.png b/lottie/test/goldens/all/Mobilo/h.png new file mode 100644 index 0000000..084d0d7 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/h.png differ diff --git a/lottie/test/goldens/all/Mobilo/i.png b/lottie/test/goldens/all/Mobilo/i.png new file mode 100644 index 0000000..3647331 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/i.png differ diff --git a/lottie/test/goldens/all/Mobilo/j.png b/lottie/test/goldens/all/Mobilo/j.png new file mode 100644 index 0000000..6b30c04 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/j.png differ diff --git a/lottie/test/goldens/all/Mobilo/k.png b/lottie/test/goldens/all/Mobilo/k.png new file mode 100644 index 0000000..b2a45f4 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/k.png differ diff --git a/lottie/test/goldens/all/Mobilo/l.png b/lottie/test/goldens/all/Mobilo/l.png new file mode 100644 index 0000000..23d16c9 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/l.png differ diff --git a/lottie/test/goldens/all/Mobilo/m.png b/lottie/test/goldens/all/Mobilo/m.png new file mode 100644 index 0000000..2c3b44e Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/m.png differ diff --git a/lottie/test/goldens/all/Mobilo/n.png b/lottie/test/goldens/all/Mobilo/n.png new file mode 100644 index 0000000..df71163 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/n.png differ diff --git a/lottie/test/goldens/all/Mobilo/o.png b/lottie/test/goldens/all/Mobilo/o.png new file mode 100644 index 0000000..76f1958 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/o.png differ diff --git a/lottie/test/goldens/all/Mobilo/p.png b/lottie/test/goldens/all/Mobilo/p.png new file mode 100644 index 0000000..caa8655 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/p.png differ diff --git a/lottie/test/goldens/all/Mobilo/q.png b/lottie/test/goldens/all/Mobilo/q.png new file mode 100644 index 0000000..bd359bb Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/q.png differ diff --git a/lottie/test/goldens/all/Mobilo/r.png b/lottie/test/goldens/all/Mobilo/r.png new file mode 100644 index 0000000..31bbcaf Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/r.png differ diff --git a/lottie/test/goldens/all/Mobilo/s.png b/lottie/test/goldens/all/Mobilo/s.png new file mode 100644 index 0000000..c8daf51 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/s.png differ diff --git a/lottie/test/goldens/all/Mobilo/t.png b/lottie/test/goldens/all/Mobilo/t.png new file mode 100644 index 0000000..74e4151 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/t.png differ diff --git a/lottie/test/goldens/all/Mobilo/u.png b/lottie/test/goldens/all/Mobilo/u.png new file mode 100644 index 0000000..924d729 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/u.png differ diff --git a/lottie/test/goldens/all/Mobilo/v.png b/lottie/test/goldens/all/Mobilo/v.png new file mode 100644 index 0000000..f73360b Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/v.png differ diff --git a/lottie/test/goldens/all/Mobilo/w.png b/lottie/test/goldens/all/Mobilo/w.png new file mode 100644 index 0000000..08b5e41 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/w.png differ diff --git a/lottie/test/goldens/all/Mobilo/x.png b/lottie/test/goldens/all/Mobilo/x.png new file mode 100644 index 0000000..5e6c6bf Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/x.png differ diff --git a/lottie/test/goldens/all/Mobilo/y.png b/lottie/test/goldens/all/Mobilo/y.png new file mode 100644 index 0000000..b32ebf8 Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/y.png differ diff --git a/lottie/test/goldens/all/Mobilo/z.png b/lottie/test/goldens/all/Mobilo/z.png new file mode 100644 index 0000000..c2da09c Binary files /dev/null and b/lottie/test/goldens/all/Mobilo/z.png differ diff --git a/lottie/test/goldens/all/Tests/ telegramalphacompat.png b/lottie/test/goldens/all/Tests/ telegramalphacompat.png new file mode 100644 index 0000000..616d81d Binary files /dev/null and b/lottie/test/goldens/all/Tests/ telegramalphacompat.png differ diff --git a/lottie/test/goldens/all/Tests/1669133489622.png b/lottie/test/goldens/all/Tests/1669133489622.png new file mode 100644 index 0000000..cf809d8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/1669133489622.png differ diff --git a/lottie/test/goldens/all/Tests/2frameanimation.png b/lottie/test/goldens/all/Tests/2frameanimation.png new file mode 100644 index 0000000..2baeaba Binary files /dev/null and b/lottie/test/goldens/all/Tests/2frameanimation.png differ diff --git a/lottie/test/goldens/all/Tests/2parentsmatte.png b/lottie/test/goldens/all/Tests/2parentsmatte.png new file mode 100644 index 0000000..bafb09b Binary files /dev/null and b/lottie/test/goldens/all/Tests/2parentsmatte.png differ diff --git a/lottie/test/goldens/all/Tests/adrock.png b/lottie/test/goldens/all/Tests/adrock.png new file mode 100644 index 0000000..3a4b1fe Binary files /dev/null and b/lottie/test/goldens/all/Tests/adrock.png differ diff --git a/lottie/test/goldens/all/Tests/adrock_converted.png b/lottie/test/goldens/all/Tests/adrock_converted.png new file mode 100644 index 0000000..3a4b1fe Binary files /dev/null and b/lottie/test/goldens/all/Tests/adrock_converted.png differ diff --git a/lottie/test/goldens/all/Tests/airbnb.png b/lottie/test/goldens/all/Tests/airbnb.png new file mode 100644 index 0000000..6bf9ac9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/airbnb.png differ diff --git a/lottie/test/goldens/all/Tests/airbnb400.png b/lottie/test/goldens/all/Tests/airbnb400.png new file mode 100644 index 0000000..2378fbd Binary files /dev/null and b/lottie/test/goldens/all/Tests/airbnb400.png differ diff --git a/lottie/test/goldens/all/Tests/airbnb800.png b/lottie/test/goldens/all/Tests/airbnb800.png new file mode 100644 index 0000000..405f7a3 Binary files /dev/null and b/lottie/test/goldens/all/Tests/airbnb800.png differ diff --git a/lottie/test/goldens/all/Tests/anim_jpg.png b/lottie/test/goldens/all/Tests/anim_jpg.png new file mode 100644 index 0000000..bdd4ac5 Binary files /dev/null and b/lottie/test/goldens/all/Tests/anim_jpg.png differ diff --git a/lottie/test/goldens/all/Tests/animatedshadow.png b/lottie/test/goldens/all/Tests/animatedshadow.png new file mode 100644 index 0000000..b069fcd Binary files /dev/null and b/lottie/test/goldens/all/Tests/animatedshadow.png differ diff --git a/lottie/test/goldens/all/Tests/august_view_pulse.png b/lottie/test/goldens/all/Tests/august_view_pulse.png new file mode 100644 index 0000000..40c1ffc Binary files /dev/null and b/lottie/test/goldens/all/Tests/august_view_pulse.png differ diff --git a/lottie/test/goldens/all/Tests/autoorient.png b/lottie/test/goldens/all/Tests/autoorient.png new file mode 100644 index 0000000..c4df3cc Binary files /dev/null and b/lottie/test/goldens/all/Tests/autoorient.png differ diff --git a/lottie/test/goldens/all/Tests/beyondbounds.png b/lottie/test/goldens/all/Tests/beyondbounds.png new file mode 100644 index 0000000..c03b99b Binary files /dev/null and b/lottie/test/goldens/all/Tests/beyondbounds.png differ diff --git a/lottie/test/goldens/all/Tests/bm.png b/lottie/test/goldens/all/Tests/bm.png new file mode 100644 index 0000000..b809fed Binary files /dev/null and b/lottie/test/goldens/all/Tests/bm.png differ diff --git a/lottie/test/goldens/all/Tests/bm_converted.png b/lottie/test/goldens/all/Tests/bm_converted.png new file mode 100644 index 0000000..b809fed Binary files /dev/null and b/lottie/test/goldens/all/Tests/bm_converted.png differ diff --git a/lottie/test/goldens/all/Tests/bounceeasings.png b/lottie/test/goldens/all/Tests/bounceeasings.png new file mode 100644 index 0000000..1841465 Binary files /dev/null and b/lottie/test/goldens/all/Tests/bounceeasings.png differ diff --git a/lottie/test/goldens/all/Tests/boxposition.png b/lottie/test/goldens/all/Tests/boxposition.png new file mode 100644 index 0000000..4a7d3a8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/boxposition.png differ diff --git a/lottie/test/goldens/all/Tests/catrim.png b/lottie/test/goldens/all/Tests/catrim.png new file mode 100644 index 0000000..2e19432 Binary files /dev/null and b/lottie/test/goldens/all/Tests/catrim.png differ diff --git a/lottie/test/goldens/all/Tests/catrim_converted.png b/lottie/test/goldens/all/Tests/catrim_converted.png new file mode 100644 index 0000000..2e19432 Binary files /dev/null and b/lottie/test/goldens/all/Tests/catrim_converted.png differ diff --git a/lottie/test/goldens/all/Tests/checkswitch.png b/lottie/test/goldens/all/Tests/checkswitch.png new file mode 100644 index 0000000..bf28118 Binary files /dev/null and b/lottie/test/goldens/all/Tests/checkswitch.png differ diff --git a/lottie/test/goldens/all/Tests/dalek.png b/lottie/test/goldens/all/Tests/dalek.png new file mode 100644 index 0000000..f4aa742 Binary files /dev/null and b/lottie/test/goldens/all/Tests/dalek.png differ diff --git a/lottie/test/goldens/all/Tests/dalek_converted.png b/lottie/test/goldens/all/Tests/dalek_converted.png new file mode 100644 index 0000000..f4aa742 Binary files /dev/null and b/lottie/test/goldens/all/Tests/dalek_converted.png differ diff --git a/lottie/test/goldens/all/Tests/defaultlinejoincap.png b/lottie/test/goldens/all/Tests/defaultlinejoincap.png new file mode 100644 index 0000000..de41d6b Binary files /dev/null and b/lottie/test/goldens/all/Tests/defaultlinejoincap.png differ diff --git a/lottie/test/goldens/all/Tests/differentpointscount.png b/lottie/test/goldens/all/Tests/differentpointscount.png new file mode 100644 index 0000000..e501852 Binary files /dev/null and b/lottie/test/goldens/all/Tests/differentpointscount.png differ diff --git a/lottie/test/goldens/all/Tests/dynamicgradient.png b/lottie/test/goldens/all/Tests/dynamicgradient.png new file mode 100644 index 0000000..307e816 Binary files /dev/null and b/lottie/test/goldens/all/Tests/dynamicgradient.png differ diff --git a/lottie/test/goldens/all/Tests/dynamictext.png b/lottie/test/goldens/all/Tests/dynamictext.png new file mode 100644 index 0000000..de0e149 Binary files /dev/null and b/lottie/test/goldens/all/Tests/dynamictext.png differ diff --git a/lottie/test/goldens/all/Tests/editedcolor.png b/lottie/test/goldens/all/Tests/editedcolor.png new file mode 100644 index 0000000..0bbcd7b Binary files /dev/null and b/lottie/test/goldens/all/Tests/editedcolor.png differ diff --git a/lottie/test/goldens/all/Tests/ellipsedirection.png b/lottie/test/goldens/all/Tests/ellipsedirection.png new file mode 100644 index 0000000..f26a6fc Binary files /dev/null and b/lottie/test/goldens/all/Tests/ellipsedirection.png differ diff --git a/lottie/test/goldens/all/Tests/embeddedfont.png b/lottie/test/goldens/all/Tests/embeddedfont.png new file mode 100644 index 0000000..de0e149 Binary files /dev/null and b/lottie/test/goldens/all/Tests/embeddedfont.png differ diff --git a/lottie/test/goldens/all/Tests/endframe.png b/lottie/test/goldens/all/Tests/endframe.png new file mode 100644 index 0000000..8d5f374 Binary files /dev/null and b/lottie/test/goldens/all/Tests/endframe.png differ diff --git a/lottie/test/goldens/all/Tests/exported_with_flow.png b/lottie/test/goldens/all/Tests/exported_with_flow.png new file mode 100644 index 0000000..49a1945 Binary files /dev/null and b/lottie/test/goldens/all/Tests/exported_with_flow.png differ diff --git a/lottie/test/goldens/all/Tests/fill.png b/lottie/test/goldens/all/Tests/fill.png new file mode 100644 index 0000000..d8599cf Binary files /dev/null and b/lottie/test/goldens/all/Tests/fill.png differ diff --git a/lottie/test/goldens/all/Tests/fillblur.png b/lottie/test/goldens/all/Tests/fillblur.png new file mode 100644 index 0000000..a98b5a6 Binary files /dev/null and b/lottie/test/goldens/all/Tests/fillblur.png differ diff --git a/lottie/test/goldens/all/Tests/font_text_justification_translate_scale_rotation_test.png b/lottie/test/goldens/all/Tests/font_text_justification_translate_scale_rotation_test.png new file mode 100644 index 0000000..055b7e3 Binary files /dev/null and b/lottie/test/goldens/all/Tests/font_text_justification_translate_scale_rotation_test.png differ diff --git a/lottie/test/goldens/all/Tests/frame.png b/lottie/test/goldens/all/Tests/frame.png new file mode 100644 index 0000000..e1e27df Binary files /dev/null and b/lottie/test/goldens/all/Tests/frame.png differ diff --git a/lottie/test/goldens/all/Tests/framerate.png b/lottie/test/goldens/all/Tests/framerate.png new file mode 100644 index 0000000..ed78982 Binary files /dev/null and b/lottie/test/goldens/all/Tests/framerate.png differ diff --git a/lottie/test/goldens/all/Tests/gradientcolorkeyframeanimation.png b/lottie/test/goldens/all/Tests/gradientcolorkeyframeanimation.png new file mode 100644 index 0000000..c459ca5 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientcolorkeyframeanimation.png differ diff --git a/lottie/test/goldens/all/Tests/gradientfill.png b/lottie/test/goldens/all/Tests/gradientfill.png new file mode 100644 index 0000000..abb2323 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientfill.png differ diff --git a/lottie/test/goldens/all/Tests/gradientfillblur.png b/lottie/test/goldens/all/Tests/gradientfillblur.png new file mode 100644 index 0000000..4844923 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientfillblur.png differ diff --git a/lottie/test/goldens/all/Tests/gradientonecolor.png b/lottie/test/goldens/all/Tests/gradientonecolor.png new file mode 100644 index 0000000..8184f1f Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientonecolor.png differ diff --git a/lottie/test/goldens/all/Tests/gradientopacityinterpolation.png b/lottie/test/goldens/all/Tests/gradientopacityinterpolation.png new file mode 100644 index 0000000..d6aa263 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientopacityinterpolation.png differ diff --git a/lottie/test/goldens/all/Tests/gradients.color_opacity.changes.multiple.stops.countfirst.png b/lottie/test/goldens/all/Tests/gradients.color_opacity.changes.multiple.stops.countfirst.png new file mode 100644 index 0000000..690e145 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradients.color_opacity.changes.multiple.stops.countfirst.png differ diff --git a/lottie/test/goldens/all/Tests/gradientstrokeblur.png b/lottie/test/goldens/all/Tests/gradientstrokeblur.png new file mode 100644 index 0000000..6224cba Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientstrokeblur.png differ diff --git a/lottie/test/goldens/all/Tests/gradientwithvaryingopacitystops.png b/lottie/test/goldens/all/Tests/gradientwithvaryingopacitystops.png new file mode 100644 index 0000000..3796d16 Binary files /dev/null and b/lottie/test/goldens/all/Tests/gradientwithvaryingopacitystops.png differ diff --git a/lottie/test/goldens/all/Tests/hd.png b/lottie/test/goldens/all/Tests/hd.png new file mode 100644 index 0000000..ef528bf Binary files /dev/null and b/lottie/test/goldens/all/Tests/hd.png differ diff --git a/lottie/test/goldens/all/Tests/heart.png b/lottie/test/goldens/all/Tests/heart.png new file mode 100644 index 0000000..9672355 Binary files /dev/null and b/lottie/test/goldens/all/Tests/heart.png differ diff --git a/lottie/test/goldens/all/Tests/interpolatebetweenopacitystops.png b/lottie/test/goldens/all/Tests/interpolatebetweenopacitystops.png new file mode 100644 index 0000000..f4d73d7 Binary files /dev/null and b/lottie/test/goldens/all/Tests/interpolatebetweenopacitystops.png differ diff --git a/lottie/test/goldens/all/Tests/interpolatorloopback.png b/lottie/test/goldens/all/Tests/interpolatorloopback.png new file mode 100644 index 0000000..4ed8394 Binary files /dev/null and b/lottie/test/goldens/all/Tests/interpolatorloopback.png differ diff --git a/lottie/test/goldens/all/Tests/issue_288.png b/lottie/test/goldens/all/Tests/issue_288.png new file mode 100644 index 0000000..e545de1 Binary files /dev/null and b/lottie/test/goldens/all/Tests/issue_288.png differ diff --git a/lottie/test/goldens/all/Tests/keyframetypes.png b/lottie/test/goldens/all/Tests/keyframetypes.png new file mode 100644 index 0000000..6f71bb6 Binary files /dev/null and b/lottie/test/goldens/all/Tests/keyframetypes.png differ diff --git a/lottie/test/goldens/all/Tests/kona_splash_animation.png b/lottie/test/goldens/all/Tests/kona_splash_animation.png new file mode 100644 index 0000000..01522d4 Binary files /dev/null and b/lottie/test/goldens/all/Tests/kona_splash_animation.png differ diff --git a/lottie/test/goldens/all/Tests/largecomposition.png b/lottie/test/goldens/all/Tests/largecomposition.png new file mode 100644 index 0000000..cd0fe25 Binary files /dev/null and b/lottie/test/goldens/all/Tests/largecomposition.png differ diff --git a/lottie/test/goldens/all/Tests/largesquare.png b/lottie/test/goldens/all/Tests/largesquare.png new file mode 100644 index 0000000..f2853a8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/largesquare.png differ diff --git a/lottie/test/goldens/all/Tests/laugh4.png b/lottie/test/goldens/all/Tests/laugh4.png new file mode 100644 index 0000000..6397a95 Binary files /dev/null and b/lottie/test/goldens/all/Tests/laugh4.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_0.png b/lottie/test/goldens/all/Tests/layerblend_0.png new file mode 100644 index 0000000..3ea02f9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_0.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_1.png b/lottie/test/goldens/all/Tests/layerblend_1.png new file mode 100644 index 0000000..52eee81 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_1.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_10.png b/lottie/test/goldens/all/Tests/layerblend_10.png new file mode 100644 index 0000000..9c381b2 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_10.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_11.png b/lottie/test/goldens/all/Tests/layerblend_11.png new file mode 100644 index 0000000..979f63c Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_11.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_12.png b/lottie/test/goldens/all/Tests/layerblend_12.png new file mode 100644 index 0000000..c0afafd Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_12.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_13.png b/lottie/test/goldens/all/Tests/layerblend_13.png new file mode 100644 index 0000000..b2d5e85 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_13.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_14.png b/lottie/test/goldens/all/Tests/layerblend_14.png new file mode 100644 index 0000000..ad0d5ee Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_14.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_15.png b/lottie/test/goldens/all/Tests/layerblend_15.png new file mode 100644 index 0000000..9c586f6 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_15.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_16.png b/lottie/test/goldens/all/Tests/layerblend_16.png new file mode 100644 index 0000000..4a1c5c1 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_16.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_17.png b/lottie/test/goldens/all/Tests/layerblend_17.png new file mode 100644 index 0000000..3ea02f9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_17.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_2.png b/lottie/test/goldens/all/Tests/layerblend_2.png new file mode 100644 index 0000000..42ca4e6 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_2.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_3.png b/lottie/test/goldens/all/Tests/layerblend_3.png new file mode 100644 index 0000000..97f84f5 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_3.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_4.png b/lottie/test/goldens/all/Tests/layerblend_4.png new file mode 100644 index 0000000..36882f9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_4.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_5.png b/lottie/test/goldens/all/Tests/layerblend_5.png new file mode 100644 index 0000000..7dcbb71 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_5.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_6.png b/lottie/test/goldens/all/Tests/layerblend_6.png new file mode 100644 index 0000000..e5f9773 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_6.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_7.png b/lottie/test/goldens/all/Tests/layerblend_7.png new file mode 100644 index 0000000..47d4afe Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_7.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_8.png b/lottie/test/goldens/all/Tests/layerblend_8.png new file mode 100644 index 0000000..f22aea9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_8.png differ diff --git a/lottie/test/goldens/all/Tests/layerblend_9.png b/lottie/test/goldens/all/Tests/layerblend_9.png new file mode 100644 index 0000000..ac0ae4d Binary files /dev/null and b/lottie/test/goldens/all/Tests/layerblend_9.png differ diff --git a/lottie/test/goldens/all/Tests/loopplayonce.png b/lottie/test/goldens/all/Tests/loopplayonce.png new file mode 100644 index 0000000..56243f8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/loopplayonce.png differ diff --git a/lottie/test/goldens/all/Tests/map.png b/lottie/test/goldens/all/Tests/map.png new file mode 100644 index 0000000..bfbbbd3 Binary files /dev/null and b/lottie/test/goldens/all/Tests/map.png differ diff --git a/lottie/test/goldens/all/Tests/marker.png b/lottie/test/goldens/all/Tests/marker.png new file mode 100644 index 0000000..7a21b9e Binary files /dev/null and b/lottie/test/goldens/all/Tests/marker.png differ diff --git a/lottie/test/goldens/all/Tests/maska.png b/lottie/test/goldens/all/Tests/maska.png new file mode 100644 index 0000000..bc9b162 Binary files /dev/null and b/lottie/test/goldens/all/Tests/maska.png differ diff --git a/lottie/test/goldens/all/Tests/maskinv.png b/lottie/test/goldens/all/Tests/maskinv.png new file mode 100644 index 0000000..2d4b03b Binary files /dev/null and b/lottie/test/goldens/all/Tests/maskinv.png differ diff --git a/lottie/test/goldens/all/Tests/masknone.png b/lottie/test/goldens/all/Tests/masknone.png new file mode 100644 index 0000000..8b37c50 Binary files /dev/null and b/lottie/test/goldens/all/Tests/masknone.png differ diff --git a/lottie/test/goldens/all/Tests/masks.png b/lottie/test/goldens/all/Tests/masks.png new file mode 100644 index 0000000..d12da08 Binary files /dev/null and b/lottie/test/goldens/all/Tests/masks.png differ diff --git a/lottie/test/goldens/all/Tests/mattetimestretchline.png b/lottie/test/goldens/all/Tests/mattetimestretchline.png new file mode 100644 index 0000000..2673952 Binary files /dev/null and b/lottie/test/goldens/all/Tests/mattetimestretchline.png differ diff --git a/lottie/test/goldens/all/Tests/mattetimestretchscan.png b/lottie/test/goldens/all/Tests/mattetimestretchscan.png new file mode 100644 index 0000000..b265c35 Binary files /dev/null and b/lottie/test/goldens/all/Tests/mattetimestretchscan.png differ diff --git a/lottie/test/goldens/all/Tests/missingendvalue.png b/lottie/test/goldens/all/Tests/missingendvalue.png new file mode 100644 index 0000000..4c060be Binary files /dev/null and b/lottie/test/goldens/all/Tests/missingendvalue.png differ diff --git a/lottie/test/goldens/all/Tests/miterlimit.png b/lottie/test/goldens/all/Tests/miterlimit.png new file mode 100644 index 0000000..ce7b64b Binary files /dev/null and b/lottie/test/goldens/all/Tests/miterlimit.png differ diff --git a/lottie/test/goldens/all/Tests/multiline.png b/lottie/test/goldens/all/Tests/multiline.png new file mode 100644 index 0000000..4429135 Binary files /dev/null and b/lottie/test/goldens/all/Tests/multiline.png differ diff --git a/lottie/test/goldens/all/Tests/nullendshape.png b/lottie/test/goldens/all/Tests/nullendshape.png new file mode 100644 index 0000000..2cd68bd Binary files /dev/null and b/lottie/test/goldens/all/Tests/nullendshape.png differ diff --git a/lottie/test/goldens/all/Tests/opacity_layers.png b/lottie/test/goldens/all/Tests/opacity_layers.png new file mode 100644 index 0000000..a584cd8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/opacity_layers.png differ diff --git a/lottie/test/goldens/all/Tests/opacitystops.png b/lottie/test/goldens/all/Tests/opacitystops.png new file mode 100644 index 0000000..9c7e525 Binary files /dev/null and b/lottie/test/goldens/all/Tests/opacitystops.png differ diff --git a/lottie/test/goldens/all/Tests/overlapshapewithopacity.png b/lottie/test/goldens/all/Tests/overlapshapewithopacity.png new file mode 100644 index 0000000..588e1ce Binary files /dev/null and b/lottie/test/goldens/all/Tests/overlapshapewithopacity.png differ diff --git a/lottie/test/goldens/all/Tests/parenting.png b/lottie/test/goldens/all/Tests/parenting.png new file mode 100644 index 0000000..c676031 Binary files /dev/null and b/lottie/test/goldens/all/Tests/parenting.png differ diff --git a/lottie/test/goldens/all/Tests/precompblur.png b/lottie/test/goldens/all/Tests/precompblur.png new file mode 100644 index 0000000..1e60d43 Binary files /dev/null and b/lottie/test/goldens/all/Tests/precompblur.png differ diff --git a/lottie/test/goldens/all/Tests/precompblurdecimapprecompsize.png b/lottie/test/goldens/all/Tests/precompblurdecimapprecompsize.png new file mode 100644 index 0000000..1e60d43 Binary files /dev/null and b/lottie/test/goldens/all/Tests/precompblurdecimapprecompsize.png differ diff --git a/lottie/test/goldens/all/Tests/precomps.png b/lottie/test/goldens/all/Tests/precomps.png new file mode 100644 index 0000000..ba34c5c Binary files /dev/null and b/lottie/test/goldens/all/Tests/precomps.png differ diff --git a/lottie/test/goldens/all/Tests/rect1.png b/lottie/test/goldens/all/Tests/rect1.png new file mode 100644 index 0000000..77a3e83 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect1.png differ diff --git a/lottie/test/goldens/all/Tests/rect2.png b/lottie/test/goldens/all/Tests/rect2.png new file mode 100644 index 0000000..7e51e65 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect2.png differ diff --git a/lottie/test/goldens/all/Tests/rect3.png b/lottie/test/goldens/all/Tests/rect3.png new file mode 100644 index 0000000..adcf177 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect3.png differ diff --git a/lottie/test/goldens/all/Tests/rect4.png b/lottie/test/goldens/all/Tests/rect4.png new file mode 100644 index 0000000..88aa901 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect4.png differ diff --git a/lottie/test/goldens/all/Tests/rect5.png b/lottie/test/goldens/all/Tests/rect5.png new file mode 100644 index 0000000..763afe8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect5.png differ diff --git a/lottie/test/goldens/all/Tests/rect6.png b/lottie/test/goldens/all/Tests/rect6.png new file mode 100644 index 0000000..bc3188e Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect6.png differ diff --git a/lottie/test/goldens/all/Tests/rect7.png b/lottie/test/goldens/all/Tests/rect7.png new file mode 100644 index 0000000..30a3a1a Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect7.png differ diff --git a/lottie/test/goldens/all/Tests/rect8.png b/lottie/test/goldens/all/Tests/rect8.png new file mode 100644 index 0000000..af822af Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect8.png differ diff --git a/lottie/test/goldens/all/Tests/rect9.png b/lottie/test/goldens/all/Tests/rect9.png new file mode 100644 index 0000000..7fc1f6f Binary files /dev/null and b/lottie/test/goldens/all/Tests/rect9.png differ diff --git a/lottie/test/goldens/all/Tests/remap.png b/lottie/test/goldens/all/Tests/remap.png new file mode 100644 index 0000000..55eebcc Binary files /dev/null and b/lottie/test/goldens/all/Tests/remap.png differ diff --git a/lottie/test/goldens/all/Tests/repeater.png b/lottie/test/goldens/all/Tests/repeater.png new file mode 100644 index 0000000..3432c01 Binary files /dev/null and b/lottie/test/goldens/all/Tests/repeater.png differ diff --git a/lottie/test/goldens/all/Tests/reversedstar.png b/lottie/test/goldens/all/Tests/reversedstar.png new file mode 100644 index 0000000..9fd1db3 Binary files /dev/null and b/lottie/test/goldens/all/Tests/reversedstar.png differ diff --git a/lottie/test/goldens/all/Tests/rgb.png b/lottie/test/goldens/all/Tests/rgb.png new file mode 100644 index 0000000..58df429 Binary files /dev/null and b/lottie/test/goldens/all/Tests/rgb.png differ diff --git a/lottie/test/goldens/all/Tests/rgbmarker.png b/lottie/test/goldens/all/Tests/rgbmarker.png new file mode 100644 index 0000000..6ff09aa Binary files /dev/null and b/lottie/test/goldens/all/Tests/rgbmarker.png differ diff --git a/lottie/test/goldens/all/Tests/roundedcorners.png b/lottie/test/goldens/all/Tests/roundedcorners.png new file mode 100644 index 0000000..2744988 Binary files /dev/null and b/lottie/test/goldens/all/Tests/roundedcorners.png differ diff --git a/lottie/test/goldens/all/Tests/roundednonclosed.png b/lottie/test/goldens/all/Tests/roundednonclosed.png new file mode 100644 index 0000000..e21f64a Binary files /dev/null and b/lottie/test/goldens/all/Tests/roundednonclosed.png differ diff --git a/lottie/test/goldens/all/Tests/roundedwithalreadyroundedcorners.png b/lottie/test/goldens/all/Tests/roundedwithalreadyroundedcorners.png new file mode 100644 index 0000000..0bf368f Binary files /dev/null and b/lottie/test/goldens/all/Tests/roundedwithalreadyroundedcorners.png differ diff --git a/lottie/test/goldens/all/Tests/scale0.png b/lottie/test/goldens/all/Tests/scale0.png new file mode 100644 index 0000000..fe75641 Binary files /dev/null and b/lottie/test/goldens/all/Tests/scale0.png differ diff --git a/lottie/test/goldens/all/Tests/shapes.png b/lottie/test/goldens/all/Tests/shapes.png new file mode 100644 index 0000000..70c57e2 Binary files /dev/null and b/lottie/test/goldens/all/Tests/shapes.png differ diff --git a/lottie/test/goldens/all/Tests/shapetypes.png b/lottie/test/goldens/all/Tests/shapetypes.png new file mode 100644 index 0000000..b34684d Binary files /dev/null and b/lottie/test/goldens/all/Tests/shapetypes.png differ diff --git a/lottie/test/goldens/all/Tests/skew.png b/lottie/test/goldens/all/Tests/skew.png new file mode 100644 index 0000000..1dc9625 Binary files /dev/null and b/lottie/test/goldens/all/Tests/skew.png differ diff --git a/lottie/test/goldens/all/Tests/solidlayertransform.png b/lottie/test/goldens/all/Tests/solidlayertransform.png new file mode 100644 index 0000000..188a916 Binary files /dev/null and b/lottie/test/goldens/all/Tests/solidlayertransform.png differ diff --git a/lottie/test/goldens/all/Tests/splitdimensions.png b/lottie/test/goldens/all/Tests/splitdimensions.png new file mode 100644 index 0000000..ba8cba5 Binary files /dev/null and b/lottie/test/goldens/all/Tests/splitdimensions.png differ diff --git a/lottie/test/goldens/all/Tests/splitpathtransform.png b/lottie/test/goldens/all/Tests/splitpathtransform.png new file mode 100644 index 0000000..b3a5b30 Binary files /dev/null and b/lottie/test/goldens/all/Tests/splitpathtransform.png differ diff --git a/lottie/test/goldens/all/Tests/squares.png b/lottie/test/goldens/all/Tests/squares.png new file mode 100644 index 0000000..0b3f48d Binary files /dev/null and b/lottie/test/goldens/all/Tests/squares.png differ diff --git a/lottie/test/goldens/all/Tests/starskew.png b/lottie/test/goldens/all/Tests/starskew.png new file mode 100644 index 0000000..4d01d5a Binary files /dev/null and b/lottie/test/goldens/all/Tests/starskew.png differ diff --git a/lottie/test/goldens/all/Tests/startendframe.png b/lottie/test/goldens/all/Tests/startendframe.png new file mode 100644 index 0000000..14de220 Binary files /dev/null and b/lottie/test/goldens/all/Tests/startendframe.png differ diff --git a/lottie/test/goldens/all/Tests/staticshadow.png b/lottie/test/goldens/all/Tests/staticshadow.png new file mode 100644 index 0000000..dd7a9b8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/staticshadow.png differ diff --git a/lottie/test/goldens/all/Tests/stroke.png b/lottie/test/goldens/all/Tests/stroke.png new file mode 100644 index 0000000..ac1da22 Binary files /dev/null and b/lottie/test/goldens/all/Tests/stroke.png differ diff --git a/lottie/test/goldens/all/Tests/strokeblur.png b/lottie/test/goldens/all/Tests/strokeblur.png new file mode 100644 index 0000000..02a8e87 Binary files /dev/null and b/lottie/test/goldens/all/Tests/strokeblur.png differ diff --git a/lottie/test/goldens/all/Tests/telegramalphacompat.png b/lottie/test/goldens/all/Tests/telegramalphacompat.png new file mode 100644 index 0000000..c30831a Binary files /dev/null and b/lottie/test/goldens/all/Tests/telegramalphacompat.png differ diff --git a/lottie/test/goldens/all/Tests/text.png b/lottie/test/goldens/all/Tests/text.png new file mode 100644 index 0000000..ec3382e Binary files /dev/null and b/lottie/test/goldens/all/Tests/text.png differ diff --git a/lottie/test/goldens/all/Tests/text_justification_translate_scale_rotation_text.png b/lottie/test/goldens/all/Tests/text_justification_translate_scale_rotation_text.png new file mode 100644 index 0000000..7ebb098 Binary files /dev/null and b/lottie/test/goldens/all/Tests/text_justification_translate_scale_rotation_text.png differ diff --git a/lottie/test/goldens/all/Tests/text_with_parent_alpha.png b/lottie/test/goldens/all/Tests/text_with_parent_alpha.png new file mode 100644 index 0000000..dc966e7 Binary files /dev/null and b/lottie/test/goldens/all/Tests/text_with_parent_alpha.png differ diff --git a/lottie/test/goldens/all/Tests/textbaseline.png b/lottie/test/goldens/all/Tests/textbaseline.png new file mode 100644 index 0000000..a4d17ba Binary files /dev/null and b/lottie/test/goldens/all/Tests/textbaseline.png differ diff --git a/lottie/test/goldens/all/Tests/textwithpscenter.png b/lottie/test/goldens/all/Tests/textwithpscenter.png new file mode 100644 index 0000000..ba48649 Binary files /dev/null and b/lottie/test/goldens/all/Tests/textwithpscenter.png differ diff --git a/lottie/test/goldens/all/Tests/textwithpsleft.png b/lottie/test/goldens/all/Tests/textwithpsleft.png new file mode 100644 index 0000000..1ed24a9 Binary files /dev/null and b/lottie/test/goldens/all/Tests/textwithpsleft.png differ diff --git a/lottie/test/goldens/all/Tests/tgswithoutopacity.png b/lottie/test/goldens/all/Tests/tgswithoutopacity.png new file mode 100644 index 0000000..b56f1ae Binary files /dev/null and b/lottie/test/goldens/all/Tests/tgswithoutopacity.png differ diff --git a/lottie/test/goldens/all/Tests/thumb.png b/lottie/test/goldens/all/Tests/thumb.png new file mode 100644 index 0000000..cc9ecd8 Binary files /dev/null and b/lottie/test/goldens/all/Tests/thumb.png differ diff --git a/lottie/test/goldens/all/Tests/timeremapandstartoffset.png b/lottie/test/goldens/all/Tests/timeremapandstartoffset.png new file mode 100644 index 0000000..c22297f Binary files /dev/null and b/lottie/test/goldens/all/Tests/timeremapandstartoffset.png differ diff --git a/lottie/test/goldens/all/Tests/timestretch.png b/lottie/test/goldens/all/Tests/timestretch.png new file mode 100644 index 0000000..3b2593d Binary files /dev/null and b/lottie/test/goldens/all/Tests/timestretch.png differ diff --git a/lottie/test/goldens/all/Tests/timestretchandstartoffset.png b/lottie/test/goldens/all/Tests/timestretchandstartoffset.png new file mode 100644 index 0000000..8ea04e4 Binary files /dev/null and b/lottie/test/goldens/all/Tests/timestretchandstartoffset.png differ diff --git a/lottie/test/goldens/all/Tests/timestretchmask.png b/lottie/test/goldens/all/Tests/timestretchmask.png new file mode 100644 index 0000000..1ea160b Binary files /dev/null and b/lottie/test/goldens/all/Tests/timestretchmask.png differ diff --git a/lottie/test/goldens/all/Tests/timestretchprecomp.png b/lottie/test/goldens/all/Tests/timestretchprecomp.png new file mode 100644 index 0000000..175a22b Binary files /dev/null and b/lottie/test/goldens/all/Tests/timestretchprecomp.png differ diff --git a/lottie/test/goldens/all/Tests/timestretchprecomp2.png b/lottie/test/goldens/all/Tests/timestretchprecomp2.png new file mode 100644 index 0000000..4ae626d Binary files /dev/null and b/lottie/test/goldens/all/Tests/timestretchprecomp2.png differ diff --git a/lottie/test/goldens/all/Tests/trackmattes.png b/lottie/test/goldens/all/Tests/trackmattes.png new file mode 100644 index 0000000..72780e7 Binary files /dev/null and b/lottie/test/goldens/all/Tests/trackmattes.png differ diff --git a/lottie/test/goldens/all/Tests/transformwithoutendvalues.png b/lottie/test/goldens/all/Tests/transformwithoutendvalues.png new file mode 100644 index 0000000..2614304 Binary files /dev/null and b/lottie/test/goldens/all/Tests/transformwithoutendvalues.png differ diff --git a/lottie/test/goldens/all/Tests/trimpaths.png b/lottie/test/goldens/all/Tests/trimpaths.png new file mode 100644 index 0000000..6c24972 Binary files /dev/null and b/lottie/test/goldens/all/Tests/trimpaths.png differ diff --git a/lottie/test/goldens/all/Tests/trimpathsinsideandoutsidegroup.png b/lottie/test/goldens/all/Tests/trimpathsinsideandoutsidegroup.png new file mode 100644 index 0000000..c67e9d2 Binary files /dev/null and b/lottie/test/goldens/all/Tests/trimpathsinsideandoutsidegroup.png differ diff --git a/lottie/test/goldens/all/Tests/trimpathwraparound.png b/lottie/test/goldens/all/Tests/trimpathwraparound.png new file mode 100644 index 0000000..7fa570a Binary files /dev/null and b/lottie/test/goldens/all/Tests/trimpathwraparound.png differ diff --git a/lottie/test/goldens/all/Tests/weaccept.png b/lottie/test/goldens/all/Tests/weaccept.png new file mode 100644 index 0000000..2ef4a3c Binary files /dev/null and b/lottie/test/goldens/all/Tests/weaccept.png differ diff --git a/lottie/test/goldens/all/Tests/weacceptinlineimage.png b/lottie/test/goldens/all/Tests/weacceptinlineimage.png new file mode 100644 index 0000000..2ef4a3c Binary files /dev/null and b/lottie/test/goldens/all/Tests/weacceptinlineimage.png differ diff --git a/lottie/test/goldens/all/Tests/wile.png b/lottie/test/goldens/all/Tests/wile.png new file mode 100644 index 0000000..d7b5882 Binary files /dev/null and b/lottie/test/goldens/all/Tests/wile.png differ diff --git a/lottie/test/goldens/all/Tests/zipinlineimage.png b/lottie/test/goldens/all/Tests/zipinlineimage.png new file mode 100644 index 0000000..2ef4a3c Binary files /dev/null and b/lottie/test/goldens/all/Tests/zipinlineimage.png differ diff --git a/lottie/test/goldens/all/androidwave.png b/lottie/test/goldens/all/androidwave.png new file mode 100644 index 0000000..c92a3d8 Binary files /dev/null and b/lottie/test/goldens/all/androidwave.png differ diff --git a/lottie/test/goldens/all/animation-1700642783167.png b/lottie/test/goldens/all/animation-1700642783167.png new file mode 100644 index 0000000..7984e70 Binary files /dev/null and b/lottie/test/goldens/all/animation-1700642783167.png differ diff --git a/lottie/test/goldens/all/battery_optimizations.png b/lottie/test/goldens/all/battery_optimizations.png new file mode 100644 index 0000000..ab21c2a Binary files /dev/null and b/lottie/test/goldens/all/battery_optimizations.png differ diff --git a/lottie/test/goldens/all/blub.png b/lottie/test/goldens/all/blub.png new file mode 100644 index 0000000..906ad2f Binary files /dev/null and b/lottie/test/goldens/all/blub.png differ diff --git a/lottie/test/goldens/all/bluetoothscanning.png b/lottie/test/goldens/all/bluetoothscanning.png new file mode 100644 index 0000000..d92fdcb Binary files /dev/null and b/lottie/test/goldens/all/bluetoothscanning.png differ diff --git a/lottie/test/goldens/all/camera_change.png b/lottie/test/goldens/all/camera_change.png new file mode 100644 index 0000000..c903e91 Binary files /dev/null and b/lottie/test/goldens/all/camera_change.png differ diff --git a/lottie/test/goldens/all/dynamicgradient.png b/lottie/test/goldens/all/dynamicgradient.png new file mode 100644 index 0000000..307e816 Binary files /dev/null and b/lottie/test/goldens/all/dynamicgradient.png differ diff --git a/lottie/test/goldens/all/envelope.png b/lottie/test/goldens/all/envelope.png new file mode 100644 index 0000000..348e81f Binary files /dev/null and b/lottie/test/goldens/all/envelope.png differ diff --git a/lottie/test/goldens/all/example_with_images/data.png b/lottie/test/goldens/all/example_with_images/data.png new file mode 100644 index 0000000..1fbb262 Binary files /dev/null and b/lottie/test/goldens/all/example_with_images/data.png differ diff --git a/lottie/test/goldens/all/gradientcolorinterpolation.png b/lottie/test/goldens/all/gradientcolorinterpolation.png new file mode 100644 index 0000000..8592b8f Binary files /dev/null and b/lottie/test/goldens/all/gradientcolorinterpolation.png differ diff --git a/lottie/test/goldens/all/hamburgerarrow.png b/lottie/test/goldens/all/hamburgerarrow.png new file mode 100644 index 0000000..7714862 Binary files /dev/null and b/lottie/test/goldens/all/hamburgerarrow.png differ diff --git a/lottie/test/goldens/all/issue270.png b/lottie/test/goldens/all/issue270.png new file mode 100644 index 0000000..bc3916b Binary files /dev/null and b/lottie/test/goldens/all/issue270.png differ diff --git a/lottie/test/goldens/all/lf20_w2afea.png b/lottie/test/goldens/all/lf20_w2afea.png new file mode 100644 index 0000000..4da6435 Binary files /dev/null and b/lottie/test/goldens/all/lf20_w2afea.png differ diff --git a/lottie/test/goldens/all/lottiefiles/100_percent.png b/lottie/test/goldens/all/lottiefiles/100_percent.png new file mode 100644 index 0000000..bc6e7db Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/100_percent.png differ diff --git a/lottie/test/goldens/all/lottiefiles/28861-connection-style-2.png b/lottie/test/goldens/all/lottiefiles/28861-connection-style-2.png new file mode 100644 index 0000000..2ced9a6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/28861-connection-style-2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/45668-arrow-with-light-passing-through.png b/lottie/test/goldens/all/lottiefiles/45668-arrow-with-light-passing-through.png new file mode 100644 index 0000000..af54325 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/45668-arrow-with-light-passing-through.png differ diff --git a/lottie/test/goldens/all/lottiefiles/a_mountain.png b/lottie/test/goldens/all/lottiefiles/a_mountain.png new file mode 100644 index 0000000..252b341 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/a_mountain.png differ diff --git a/lottie/test/goldens/all/lottiefiles/accept_arrows.png b/lottie/test/goldens/all/lottiefiles/accept_arrows.png new file mode 100644 index 0000000..f216d30 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/accept_arrows.png differ diff --git a/lottie/test/goldens/all/lottiefiles/airbnb.png b/lottie/test/goldens/all/lottiefiles/airbnb.png new file mode 100644 index 0000000..6bf9ac9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/airbnb.png differ diff --git a/lottie/test/goldens/all/lottiefiles/android_fingerprint.png b/lottie/test/goldens/all/lottiefiles/android_fingerprint.png new file mode 100644 index 0000000..59584f9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/android_fingerprint.png differ diff --git a/lottie/test/goldens/all/lottiefiles/angel.png b/lottie/test/goldens/all/lottiefiles/angel.png new file mode 100644 index 0000000..3ae8b0a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/angel.png differ diff --git a/lottie/test/goldens/all/lottiefiles/anima.png b/lottie/test/goldens/all/lottiefiles/anima.png new file mode 100644 index 0000000..c3c16e3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/anima.png differ diff --git a/lottie/test/goldens/all/lottiefiles/animated_graph.png b/lottie/test/goldens/all/lottiefiles/animated_graph.png new file mode 100644 index 0000000..5cf9818 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/animated_graph.png differ diff --git a/lottie/test/goldens/all/lottiefiles/animated_laptop_.png b/lottie/test/goldens/all/lottiefiles/animated_laptop_.png new file mode 100644 index 0000000..4a881e2 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/animated_laptop_.png differ diff --git a/lottie/test/goldens/all/lottiefiles/animated_logo.png b/lottie/test/goldens/all/lottiefiles/animated_logo.png new file mode 100644 index 0000000..20b1c08 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/animated_logo.png differ diff --git a/lottie/test/goldens/all/lottiefiles/atm_link.png b/lottie/test/goldens/all/lottiefiles/atm_link.png new file mode 100644 index 0000000..1e223cf Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/atm_link.png differ diff --git a/lottie/test/goldens/all/lottiefiles/autoconnect_loading.png b/lottie/test/goldens/all/lottiefiles/autoconnect_loading.png new file mode 100644 index 0000000..36ad377 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/autoconnect_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/ball_&_map.png b/lottie/test/goldens/all/lottiefiles/ball_&_map.png new file mode 100644 index 0000000..9fb73eb Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/ball_&_map.png differ diff --git a/lottie/test/goldens/all/lottiefiles/banner_animation.png b/lottie/test/goldens/all/lottiefiles/banner_animation.png new file mode 100644 index 0000000..98b94fb Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/banner_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bb8.png b/lottie/test/goldens/all/lottiefiles/bb8.png new file mode 100644 index 0000000..8140652 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bb8.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bell.png b/lottie/test/goldens/all/lottiefiles/bell.png new file mode 100644 index 0000000..27b8466 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bell.png differ diff --git a/lottie/test/goldens/all/lottiefiles/birds.png b/lottie/test/goldens/all/lottiefiles/birds.png new file mode 100644 index 0000000..a9fb21b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/birds.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bitcoin_to_the_moon.png b/lottie/test/goldens/all/lottiefiles/bitcoin_to_the_moon.png new file mode 100644 index 0000000..039c95e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bitcoin_to_the_moon.png differ diff --git a/lottie/test/goldens/all/lottiefiles/blood_transfusion_kawaii.png b/lottie/test/goldens/all/lottiefiles/blood_transfusion_kawaii.png new file mode 100644 index 0000000..5fca596 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/blood_transfusion_kawaii.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bomb.png b/lottie/test/goldens/all/lottiefiles/bomb.png new file mode 100644 index 0000000..6a54fb3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bomb.png differ diff --git a/lottie/test/goldens/all/lottiefiles/books.png b/lottie/test/goldens/all/lottiefiles/books.png new file mode 100644 index 0000000..8f6e217 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/books.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bootymovin.png b/lottie/test/goldens/all/lottiefiles/bootymovin.png new file mode 100644 index 0000000..52f5f04 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bootymovin.png differ diff --git a/lottie/test/goldens/all/lottiefiles/bounching_ball.png b/lottie/test/goldens/all/lottiefiles/bounching_ball.png new file mode 100644 index 0000000..2044e5c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/bounching_ball.png differ diff --git a/lottie/test/goldens/all/lottiefiles/brain__.png b/lottie/test/goldens/all/lottiefiles/brain__.png new file mode 100644 index 0000000..05d805b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/brain__.png differ diff --git a/lottie/test/goldens/all/lottiefiles/browser.png b/lottie/test/goldens/all/lottiefiles/browser.png new file mode 100644 index 0000000..e25130c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/browser.png differ diff --git a/lottie/test/goldens/all/lottiefiles/building_evolution_animation.png b/lottie/test/goldens/all/lottiefiles/building_evolution_animation.png new file mode 100644 index 0000000..2b5a973 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/building_evolution_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/camera.png b/lottie/test/goldens/all/lottiefiles/camera.png new file mode 100644 index 0000000..1928a82 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/camera.png differ diff --git a/lottie/test/goldens/all/lottiefiles/camptravel.png b/lottie/test/goldens/all/lottiefiles/camptravel.png new file mode 100644 index 0000000..6585968 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/camptravel.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cancel_button.png b/lottie/test/goldens/all/lottiefiles/cancel_button.png new file mode 100644 index 0000000..c85b8e4 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cancel_button.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cash.png b/lottie/test/goldens/all/lottiefiles/cash.png new file mode 100644 index 0000000..fe281fe Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cash.png differ diff --git a/lottie/test/goldens/all/lottiefiles/change_to_search_bar.png b/lottie/test/goldens/all/lottiefiles/change_to_search_bar.png new file mode 100644 index 0000000..7bb8d01 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/change_to_search_bar.png differ diff --git a/lottie/test/goldens/all/lottiefiles/check_pop.png b/lottie/test/goldens/all/lottiefiles/check_pop.png new file mode 100644 index 0000000..9f03c7f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/check_pop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/chinese.png b/lottie/test/goldens/all/lottiefiles/chinese.png new file mode 100644 index 0000000..3b7e3d5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/chinese.png differ diff --git a/lottie/test/goldens/all/lottiefiles/clock.png b/lottie/test/goldens/all/lottiefiles/clock.png new file mode 100644 index 0000000..5873721 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/clock.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cloud_disconnection.png b/lottie/test/goldens/all/lottiefiles/cloud_disconnection.png new file mode 100644 index 0000000..205d38c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cloud_disconnection.png differ diff --git a/lottie/test/goldens/all/lottiefiles/code_invite_success.png b/lottie/test/goldens/all/lottiefiles/code_invite_success.png new file mode 100644 index 0000000..068c3b9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/code_invite_success.png differ diff --git a/lottie/test/goldens/all/lottiefiles/coding_ape.png b/lottie/test/goldens/all/lottiefiles/coding_ape.png new file mode 100644 index 0000000..3317bd3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/coding_ape.png differ diff --git a/lottie/test/goldens/all/lottiefiles/coinfall.png b/lottie/test/goldens/all/lottiefiles/coinfall.png new file mode 100644 index 0000000..d65ad1d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/coinfall.png differ diff --git a/lottie/test/goldens/all/lottiefiles/colorline.png b/lottie/test/goldens/all/lottiefiles/colorline.png new file mode 100644 index 0000000..5a6648c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/colorline.png differ diff --git a/lottie/test/goldens/all/lottiefiles/confusion.png b/lottie/test/goldens/all/lottiefiles/confusion.png new file mode 100644 index 0000000..8299bcb Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/confusion.png differ diff --git a/lottie/test/goldens/all/lottiefiles/construction_site.png b/lottie/test/goldens/all/lottiefiles/construction_site.png new file mode 100644 index 0000000..afd701b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/construction_site.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cooking_app.png b/lottie/test/goldens/all/lottiefiles/cooking_app.png new file mode 100644 index 0000000..ff7b626 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cooking_app.png differ diff --git a/lottie/test/goldens/all/lottiefiles/countdown.png b/lottie/test/goldens/all/lottiefiles/countdown.png new file mode 100644 index 0000000..0e4764e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/countdown.png differ diff --git a/lottie/test/goldens/all/lottiefiles/credit_card.png b/lottie/test/goldens/all/lottiefiles/credit_card.png new file mode 100644 index 0000000..c344dc1 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/credit_card.png differ diff --git a/lottie/test/goldens/all/lottiefiles/credit_level.png b/lottie/test/goldens/all/lottiefiles/credit_level.png new file mode 100644 index 0000000..bc21a2b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/credit_level.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cube_loader.png b/lottie/test/goldens/all/lottiefiles/cube_loader.png new file mode 100644 index 0000000..abd0df8 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cube_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cubo_livre.png b/lottie/test/goldens/all/lottiefiles/cubo_livre.png new file mode 100644 index 0000000..1af68e4 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cubo_livre.png differ diff --git a/lottie/test/goldens/all/lottiefiles/curly_hair_character_loop.png b/lottie/test/goldens/all/lottiefiles/curly_hair_character_loop.png new file mode 100644 index 0000000..15a2e7d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/curly_hair_character_loop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/cycle_animation.png b/lottie/test/goldens/all/lottiefiles/cycle_animation.png new file mode 100644 index 0000000..f62814a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/cycle_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/day_night_cycle.png b/lottie/test/goldens/all/lottiefiles/day_night_cycle.png new file mode 100644 index 0000000..84ba384 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/day_night_cycle.png differ diff --git a/lottie/test/goldens/all/lottiefiles/day_of_the_dead.png b/lottie/test/goldens/all/lottiefiles/day_of_the_dead.png new file mode 100644 index 0000000..087149c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/day_of_the_dead.png differ diff --git a/lottie/test/goldens/all/lottiefiles/deadpool.png b/lottie/test/goldens/all/lottiefiles/deadpool.png new file mode 100644 index 0000000..9365699 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/deadpool.png differ diff --git a/lottie/test/goldens/all/lottiefiles/delivery_van.png b/lottie/test/goldens/all/lottiefiles/delivery_van.png new file mode 100644 index 0000000..5d1acd4 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/delivery_van.png differ diff --git a/lottie/test/goldens/all/lottiefiles/developer-animation.png b/lottie/test/goldens/all/lottiefiles/developer-animation.png new file mode 100644 index 0000000..2d0efd0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/developer-animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/dna_loader.png b/lottie/test/goldens/all/lottiefiles/dna_loader.png new file mode 100644 index 0000000..0e5c419 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/dna_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/dog.png b/lottie/test/goldens/all/lottiefiles/dog.png new file mode 100644 index 0000000..bef9012 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/dog.png differ diff --git a/lottie/test/goldens/all/lottiefiles/done.png b/lottie/test/goldens/all/lottiefiles/done.png new file mode 100644 index 0000000..1fc6021 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/done.png differ diff --git a/lottie/test/goldens/all/lottiefiles/download copy.png b/lottie/test/goldens/all/lottiefiles/download copy.png new file mode 100644 index 0000000..3ed0ee9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/download copy.png differ diff --git a/lottie/test/goldens/all/lottiefiles/download.png b/lottie/test/goldens/all/lottiefiles/download.png new file mode 100644 index 0000000..24eecae Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/download.png differ diff --git a/lottie/test/goldens/all/lottiefiles/downloader.png b/lottie/test/goldens/all/lottiefiles/downloader.png new file mode 100644 index 0000000..a83e233 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/downloader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/drop.png b/lottie/test/goldens/all/lottiefiles/drop.png new file mode 100644 index 0000000..d9f3cdc Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/drop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/drop_to_refresh.png b/lottie/test/goldens/all/lottiefiles/drop_to_refresh.png new file mode 100644 index 0000000..8e3c310 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/drop_to_refresh.png differ diff --git a/lottie/test/goldens/all/lottiefiles/edited-landscape.png b/lottie/test/goldens/all/lottiefiles/edited-landscape.png new file mode 100644 index 0000000..e6a7556 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/edited-landscape.png differ diff --git a/lottie/test/goldens/all/lottiefiles/elephant_trunk_swing.png b/lottie/test/goldens/all/lottiefiles/elephant_trunk_swing.png new file mode 100644 index 0000000..5694786 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/elephant_trunk_swing.png differ diff --git a/lottie/test/goldens/all/lottiefiles/emoji_shock.png b/lottie/test/goldens/all/lottiefiles/emoji_shock.png new file mode 100644 index 0000000..2d9b864 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/emoji_shock.png differ diff --git a/lottie/test/goldens/all/lottiefiles/emoji_tongue.png b/lottie/test/goldens/all/lottiefiles/emoji_tongue.png new file mode 100644 index 0000000..6ff1dbd Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/emoji_tongue.png differ diff --git a/lottie/test/goldens/all/lottiefiles/emoji_wink.png b/lottie/test/goldens/all/lottiefiles/emoji_wink.png new file mode 100644 index 0000000..68239bc Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/emoji_wink.png differ diff --git a/lottie/test/goldens/all/lottiefiles/empty_status.png b/lottie/test/goldens/all/lottiefiles/empty_status.png new file mode 100644 index 0000000..04db8de Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/empty_status.png differ diff --git a/lottie/test/goldens/all/lottiefiles/estimate.png b/lottie/test/goldens/all/lottiefiles/estimate.png new file mode 100644 index 0000000..fb36984 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/estimate.png differ diff --git a/lottie/test/goldens/all/lottiefiles/fab_animate.png b/lottie/test/goldens/all/lottiefiles/fab_animate.png new file mode 100644 index 0000000..9dbafd3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/fab_animate.png differ diff --git a/lottie/test/goldens/all/lottiefiles/fabulous_onboarding_animation.png b/lottie/test/goldens/all/lottiefiles/fabulous_onboarding_animation.png new file mode 100644 index 0000000..1efbd0e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/fabulous_onboarding_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/favourite_app_icon.png b/lottie/test/goldens/all/lottiefiles/favourite_app_icon.png new file mode 100644 index 0000000..072f9a5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/favourite_app_icon.png differ diff --git a/lottie/test/goldens/all/lottiefiles/file_error.png b/lottie/test/goldens/all/lottiefiles/file_error.png new file mode 100644 index 0000000..850ba0b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/file_error.png differ diff --git a/lottie/test/goldens/all/lottiefiles/finance_animation.png b/lottie/test/goldens/all/lottiefiles/finance_animation.png new file mode 100644 index 0000000..577acc5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/finance_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/fingerprint_scanner.png b/lottie/test/goldens/all/lottiefiles/fingerprint_scanner.png new file mode 100644 index 0000000..dddbc1f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/fingerprint_scanner.png differ diff --git a/lottie/test/goldens/all/lottiefiles/finish,done.png b/lottie/test/goldens/all/lottiefiles/finish,done.png new file mode 100644 index 0000000..35c7857 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/finish,done.png differ diff --git a/lottie/test/goldens/all/lottiefiles/fish.png b/lottie/test/goldens/all/lottiefiles/fish.png new file mode 100644 index 0000000..88e07ea Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/fish.png differ diff --git a/lottie/test/goldens/all/lottiefiles/flag_of_mexico.png b/lottie/test/goldens/all/lottiefiles/flag_of_mexico.png new file mode 100644 index 0000000..07841d3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/flag_of_mexico.png differ diff --git a/lottie/test/goldens/all/lottiefiles/flow.png b/lottie/test/goldens/all/lottiefiles/flow.png new file mode 100644 index 0000000..7691db1 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/flow.png differ diff --git a/lottie/test/goldens/all/lottiefiles/frog.png b/lottie/test/goldens/all/lottiefiles/frog.png new file mode 100644 index 0000000..de4d510 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/frog.png differ diff --git a/lottie/test/goldens/all/lottiefiles/funky_chicken.png b/lottie/test/goldens/all/lottiefiles/funky_chicken.png new file mode 100644 index 0000000..18bc49c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/funky_chicken.png differ diff --git a/lottie/test/goldens/all/lottiefiles/gaming_pad.png b/lottie/test/goldens/all/lottiefiles/gaming_pad.png new file mode 100644 index 0000000..212ef53 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/gaming_pad.png differ diff --git a/lottie/test/goldens/all/lottiefiles/gears.png b/lottie/test/goldens/all/lottiefiles/gears.png new file mode 100644 index 0000000..b5b85e1 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/gears.png differ diff --git a/lottie/test/goldens/all/lottiefiles/geometry.png b/lottie/test/goldens/all/lottiefiles/geometry.png new file mode 100644 index 0000000..aeb6c21 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/geometry.png differ diff --git a/lottie/test/goldens/all/lottiefiles/glow_loading.png b/lottie/test/goldens/all/lottiefiles/glow_loading.png new file mode 100644 index 0000000..bf59756 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/glow_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/gradient_animated_background.png b/lottie/test/goldens/all/lottiefiles/gradient_animated_background.png new file mode 100644 index 0000000..4f65fca Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/gradient_animated_background.png differ diff --git a/lottie/test/goldens/all/lottiefiles/happy birthday.png b/lottie/test/goldens/all/lottiefiles/happy birthday.png new file mode 100644 index 0000000..91868f8 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/happy birthday.png differ diff --git a/lottie/test/goldens/all/lottiefiles/hardware.png b/lottie/test/goldens/all/lottiefiles/hardware.png new file mode 100644 index 0000000..b6e6f02 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/hardware.png differ diff --git a/lottie/test/goldens/all/lottiefiles/hint_01.png b/lottie/test/goldens/all/lottiefiles/hint_01.png new file mode 100644 index 0000000..5430e68 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/hint_01.png differ diff --git a/lottie/test/goldens/all/lottiefiles/im_thirsty.png b/lottie/test/goldens/all/lottiefiles/im_thirsty.png new file mode 100644 index 0000000..4fd12b6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/im_thirsty.png differ diff --git a/lottie/test/goldens/all/lottiefiles/immiguide_.png b/lottie/test/goldens/all/lottiefiles/immiguide_.png new file mode 100644 index 0000000..4ced820 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/immiguide_.png differ diff --git a/lottie/test/goldens/all/lottiefiles/in-app_purchasing.png b/lottie/test/goldens/all/lottiefiles/in-app_purchasing.png new file mode 100644 index 0000000..a3f5380 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/in-app_purchasing.png differ diff --git a/lottie/test/goldens/all/lottiefiles/india.png b/lottie/test/goldens/all/lottiefiles/india.png new file mode 100644 index 0000000..226c653 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/india.png differ diff --git a/lottie/test/goldens/all/lottiefiles/infinite_rainbow.png b/lottie/test/goldens/all/lottiefiles/infinite_rainbow.png new file mode 100644 index 0000000..40ea749 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/infinite_rainbow.png differ diff --git a/lottie/test/goldens/all/lottiefiles/intelia_logo_animation.png b/lottie/test/goldens/all/lottiefiles/intelia_logo_animation.png new file mode 100644 index 0000000..61174ca Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/intelia_logo_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/iphone_x_loading.png b/lottie/test/goldens/all/lottiefiles/iphone_x_loading.png new file mode 100644 index 0000000..25afc05 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/iphone_x_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/jojo_the_bird.png b/lottie/test/goldens/all/lottiefiles/jojo_the_bird.png new file mode 100644 index 0000000..6cde270 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/jojo_the_bird.png differ diff --git a/lottie/test/goldens/all/lottiefiles/jolly_walker.png b/lottie/test/goldens/all/lottiefiles/jolly_walker.png new file mode 100644 index 0000000..d199b64 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/jolly_walker.png differ diff --git a/lottie/test/goldens/all/lottiefiles/judgement.png b/lottie/test/goldens/all/lottiefiles/judgement.png new file mode 100644 index 0000000..947dcae Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/judgement.png differ diff --git a/lottie/test/goldens/all/lottiefiles/kod.io_logo_reveal.png b/lottie/test/goldens/all/lottiefiles/kod.io_logo_reveal.png new file mode 100644 index 0000000..bc6015e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/kod.io_logo_reveal.png differ diff --git a/lottie/test/goldens/all/lottiefiles/la_calavera.png b/lottie/test/goldens/all/lottiefiles/la_calavera.png new file mode 100644 index 0000000..9ab71d2 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/la_calavera.png differ diff --git a/lottie/test/goldens/all/lottiefiles/landing_page.png b/lottie/test/goldens/all/lottiefiles/landing_page.png new file mode 100644 index 0000000..0f72ae3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/landing_page.png differ diff --git a/lottie/test/goldens/all/lottiefiles/lego_loader.png b/lottie/test/goldens/all/lottiefiles/lego_loader.png new file mode 100644 index 0000000..266785b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/lego_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/lf20_fteywrno.png b/lottie/test/goldens/all/lottiefiles/lf20_fteywrno.png new file mode 100644 index 0000000..cad4fac Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/lf20_fteywrno.png differ diff --git a/lottie/test/goldens/all/lottiefiles/light.png b/lottie/test/goldens/all/lottiefiles/light.png new file mode 100644 index 0000000..9496f86 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/light.png differ diff --git a/lottie/test/goldens/all/lottiefiles/lightsaber.png b/lottie/test/goldens/all/lottiefiles/lightsaber.png new file mode 100644 index 0000000..77f9a13 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/lightsaber.png differ diff --git a/lottie/test/goldens/all/lottiefiles/little_girl_jumping_-_loader.png b/lottie/test/goldens/all/lottiefiles/little_girl_jumping_-_loader.png new file mode 100644 index 0000000..42a5516 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/little_girl_jumping_-_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/loading.png b/lottie/test/goldens/all/lottiefiles/loading.png new file mode 100644 index 0000000..095e2a7 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/loading_copy.png b/lottie/test/goldens/all/lottiefiles/loading_copy.png new file mode 100644 index 0000000..77f7436 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/loading_copy.png differ diff --git a/lottie/test/goldens/all/lottiefiles/loading_disc.png b/lottie/test/goldens/all/lottiefiles/loading_disc.png new file mode 100644 index 0000000..b9fb3ba Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/loading_disc.png differ diff --git a/lottie/test/goldens/all/lottiefiles/loading_semicircle.png b/lottie/test/goldens/all/lottiefiles/loading_semicircle.png new file mode 100644 index 0000000..c3dc99c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/loading_semicircle.png differ diff --git a/lottie/test/goldens/all/lottiefiles/location.png b/lottie/test/goldens/all/lottiefiles/location.png new file mode 100644 index 0000000..059d49a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/location.png differ diff --git a/lottie/test/goldens/all/lottiefiles/location_marker.png b/lottie/test/goldens/all/lottiefiles/location_marker.png new file mode 100644 index 0000000..2371a8f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/location_marker.png differ diff --git a/lottie/test/goldens/all/lottiefiles/location_pin.png b/lottie/test/goldens/all/lottiefiles/location_pin.png new file mode 100644 index 0000000..d102c7f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/location_pin.png differ diff --git a/lottie/test/goldens/all/lottiefiles/lottie_logo_1.png b/lottie/test/goldens/all/lottiefiles/lottie_logo_1.png new file mode 100644 index 0000000..a55533b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/lottie_logo_1.png differ diff --git a/lottie/test/goldens/all/lottiefiles/lottiepreview_qr.png b/lottie/test/goldens/all/lottiefiles/lottiepreview_qr.png new file mode 100644 index 0000000..28840e9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/lottiepreview_qr.png differ diff --git a/lottie/test/goldens/all/lottiefiles/mailsent.png b/lottie/test/goldens/all/lottiefiles/mailsent.png new file mode 100644 index 0000000..5bd847b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/mailsent.png differ diff --git a/lottie/test/goldens/all/lottiefiles/man_and_pay_with_credit_card.png b/lottie/test/goldens/all/lottiefiles/man_and_pay_with_credit_card.png new file mode 100644 index 0000000..1958b36 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/man_and_pay_with_credit_card.png differ diff --git a/lottie/test/goldens/all/lottiefiles/map_animation.png b/lottie/test/goldens/all/lottiefiles/map_animation.png new file mode 100644 index 0000000..19b2f54 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/map_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/material loading.png b/lottie/test/goldens/all/lottiefiles/material loading.png new file mode 100644 index 0000000..626f81f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/material loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/material_loader.png b/lottie/test/goldens/all/lottiefiles/material_loader.png new file mode 100644 index 0000000..c2731a8 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/material_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/material_loading_2.png b/lottie/test/goldens/all/lottiefiles/material_loading_2.png new file mode 100644 index 0000000..ac5ba10 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/material_loading_2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/material_wave_loading.png b/lottie/test/goldens/all/lottiefiles/material_wave_loading.png new file mode 100644 index 0000000..faa6c22 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/material_wave_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/me_at_office.png b/lottie/test/goldens/all/lottiefiles/me_at_office.png new file mode 100644 index 0000000..753f5d3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/me_at_office.png differ diff --git a/lottie/test/goldens/all/lottiefiles/medal.png b/lottie/test/goldens/all/lottiefiles/medal.png new file mode 100644 index 0000000..d41c80b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/medal.png differ diff --git a/lottie/test/goldens/all/lottiefiles/menu_button_alt.png b/lottie/test/goldens/all/lottiefiles/menu_button_alt.png new file mode 100644 index 0000000..d056b22 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/menu_button_alt.png differ diff --git a/lottie/test/goldens/all/lottiefiles/menubutton2.png b/lottie/test/goldens/all/lottiefiles/menubutton2.png new file mode 100644 index 0000000..d056b22 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/menubutton2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/mindful.png b/lottie/test/goldens/all/lottiefiles/mindful.png new file mode 100644 index 0000000..25ceb2d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/mindful.png differ diff --git a/lottie/test/goldens/all/lottiefiles/mnemonics.png b/lottie/test/goldens/all/lottiefiles/mnemonics.png new file mode 100644 index 0000000..46820ea Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/mnemonics.png differ diff --git a/lottie/test/goldens/all/lottiefiles/money.png b/lottie/test/goldens/all/lottiefiles/money.png new file mode 100644 index 0000000..7f01330 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/money.png differ diff --git a/lottie/test/goldens/all/lottiefiles/motorcycle.png b/lottie/test/goldens/all/lottiefiles/motorcycle.png new file mode 100644 index 0000000..99a704a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/motorcycle.png differ diff --git a/lottie/test/goldens/all/lottiefiles/moving bus.png b/lottie/test/goldens/all/lottiefiles/moving bus.png new file mode 100644 index 0000000..f26c77f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/moving bus.png differ diff --git a/lottie/test/goldens/all/lottiefiles/moving_eye.png b/lottie/test/goldens/all/lottiefiles/moving_eye.png new file mode 100644 index 0000000..24525f7 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/moving_eye.png differ diff --git a/lottie/test/goldens/all/lottiefiles/no_internet_connection.png b/lottie/test/goldens/all/lottiefiles/no_internet_connection.png new file mode 100644 index 0000000..1caeee5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/no_internet_connection.png differ diff --git a/lottie/test/goldens/all/lottiefiles/notification_request.png b/lottie/test/goldens/all/lottiefiles/notification_request.png new file mode 100644 index 0000000..475ae52 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/notification_request.png differ diff --git a/lottie/test/goldens/all/lottiefiles/octopus.png b/lottie/test/goldens/all/lottiefiles/octopus.png new file mode 100644 index 0000000..9d121ff Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/octopus.png differ diff --git a/lottie/test/goldens/all/lottiefiles/ofrenda.png b/lottie/test/goldens/all/lottiefiles/ofrenda.png new file mode 100644 index 0000000..4a51f4c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/ofrenda.png differ diff --git a/lottie/test/goldens/all/lottiefiles/on_off_settings_switch.png b/lottie/test/goldens/all/lottiefiles/on_off_settings_switch.png new file mode 100644 index 0000000..53ef4de Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/on_off_settings_switch.png differ diff --git a/lottie/test/goldens/all/lottiefiles/pagado.png b/lottie/test/goldens/all/lottiefiles/pagado.png new file mode 100644 index 0000000..ceb0bc1 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/pagado.png differ diff --git a/lottie/test/goldens/all/lottiefiles/pagination.png b/lottie/test/goldens/all/lottiefiles/pagination.png new file mode 100644 index 0000000..2a81be9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/pagination.png differ diff --git a/lottie/test/goldens/all/lottiefiles/panel2d.png b/lottie/test/goldens/all/lottiefiles/panel2d.png new file mode 100644 index 0000000..4c807e0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/panel2d.png differ diff --git a/lottie/test/goldens/all/lottiefiles/passport.png b/lottie/test/goldens/all/lottiefiles/passport.png new file mode 100644 index 0000000..f9cae3c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/passport.png differ diff --git a/lottie/test/goldens/all/lottiefiles/patient_successfully_added.png b/lottie/test/goldens/all/lottiefiles/patient_successfully_added.png new file mode 100644 index 0000000..2e5884e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/patient_successfully_added.png differ diff --git a/lottie/test/goldens/all/lottiefiles/payme.png b/lottie/test/goldens/all/lottiefiles/payme.png new file mode 100644 index 0000000..ce00de5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/payme.png differ diff --git a/lottie/test/goldens/all/lottiefiles/peli-canon.png b/lottie/test/goldens/all/lottiefiles/peli-canon.png new file mode 100644 index 0000000..ef1cf85 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/peli-canon.png differ diff --git a/lottie/test/goldens/all/lottiefiles/pen_tool_loop.png b/lottie/test/goldens/all/lottiefiles/pen_tool_loop.png new file mode 100644 index 0000000..8433c62 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/pen_tool_loop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/pencil_write.png b/lottie/test/goldens/all/lottiefiles/pencil_write.png new file mode 100644 index 0000000..dbfd782 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/pencil_write.png differ diff --git a/lottie/test/goldens/all/lottiefiles/penguin.png b/lottie/test/goldens/all/lottiefiles/penguin.png new file mode 100644 index 0000000..9c228be Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/penguin.png differ diff --git a/lottie/test/goldens/all/lottiefiles/permission.png b/lottie/test/goldens/all/lottiefiles/permission.png new file mode 100644 index 0000000..b8a1f07 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/permission.png differ diff --git a/lottie/test/goldens/all/lottiefiles/personal_character.png b/lottie/test/goldens/all/lottiefiles/personal_character.png new file mode 100644 index 0000000..d57088b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/personal_character.png differ diff --git a/lottie/test/goldens/all/lottiefiles/ph_onboarding_.png b/lottie/test/goldens/all/lottiefiles/ph_onboarding_.png new file mode 100644 index 0000000..cbfdd6c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/ph_onboarding_.png differ diff --git a/lottie/test/goldens/all/lottiefiles/phonological.png b/lottie/test/goldens/all/lottiefiles/phonological.png new file mode 100644 index 0000000..a7b6bb6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/phonological.png differ diff --git a/lottie/test/goldens/all/lottiefiles/pink_drink_machine.png b/lottie/test/goldens/all/lottiefiles/pink_drink_machine.png new file mode 100644 index 0000000..73d1a5c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/pink_drink_machine.png differ diff --git a/lottie/test/goldens/all/lottiefiles/plane.png b/lottie/test/goldens/all/lottiefiles/plane.png new file mode 100644 index 0000000..2fc18ec Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/plane.png differ diff --git a/lottie/test/goldens/all/lottiefiles/plane_to_dollar.png b/lottie/test/goldens/all/lottiefiles/plane_to_dollar.png new file mode 100644 index 0000000..e4fe28b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/plane_to_dollar.png differ diff --git a/lottie/test/goldens/all/lottiefiles/play,_pause.png b/lottie/test/goldens/all/lottiefiles/play,_pause.png new file mode 100644 index 0000000..8c0a080 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/play,_pause.png differ diff --git a/lottie/test/goldens/all/lottiefiles/play_and_like_it.png b/lottie/test/goldens/all/lottiefiles/play_and_like_it.png new file mode 100644 index 0000000..6a56a3e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/play_and_like_it.png differ diff --git a/lottie/test/goldens/all/lottiefiles/play_button.png b/lottie/test/goldens/all/lottiefiles/play_button.png new file mode 100644 index 0000000..568a73e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/play_button.png differ diff --git a/lottie/test/goldens/all/lottiefiles/playing.png b/lottie/test/goldens/all/lottiefiles/playing.png new file mode 100644 index 0000000..d98f10d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/playing.png differ diff --git a/lottie/test/goldens/all/lottiefiles/point.png b/lottie/test/goldens/all/lottiefiles/point.png new file mode 100644 index 0000000..df835ad Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/point.png differ diff --git a/lottie/test/goldens/all/lottiefiles/poo_loader.png b/lottie/test/goldens/all/lottiefiles/poo_loader.png new file mode 100644 index 0000000..4be936e Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/poo_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard (1).png b/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard (1).png new file mode 100644 index 0000000..6b69c65 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard (1).png differ diff --git a/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard.png b/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard.png new file mode 100644 index 0000000..6b69c65 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/powerupp_app_onboard.png differ diff --git a/lottie/test/goldens/all/lottiefiles/preloader.png b/lottie/test/goldens/all/lottiefiles/preloader.png new file mode 100644 index 0000000..da6b2c5 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/preloader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/print.png b/lottie/test/goldens/all/lottiefiles/print.png new file mode 100644 index 0000000..e05bd69 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/print.png differ diff --git a/lottie/test/goldens/all/lottiefiles/progress_bar 2.png b/lottie/test/goldens/all/lottiefiles/progress_bar 2.png new file mode 100644 index 0000000..922d396 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/progress_bar 2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/progress_bar.png b/lottie/test/goldens/all/lottiefiles/progress_bar.png new file mode 100644 index 0000000..ebcdaf3 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/progress_bar.png differ diff --git a/lottie/test/goldens/all/lottiefiles/rating.png b/lottie/test/goldens/all/lottiefiles/rating.png new file mode 100644 index 0000000..fa3b3be Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/rating.png differ diff --git a/lottie/test/goldens/all/lottiefiles/red_pocket_pop_up.png b/lottie/test/goldens/all/lottiefiles/red_pocket_pop_up.png new file mode 100644 index 0000000..4b831b6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/red_pocket_pop_up.png differ diff --git a/lottie/test/goldens/all/lottiefiles/rejection.png b/lottie/test/goldens/all/lottiefiles/rejection.png new file mode 100644 index 0000000..aeb5919 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/rejection.png differ diff --git a/lottie/test/goldens/all/lottiefiles/retweet.png b/lottie/test/goldens/all/lottiefiles/retweet.png new file mode 100644 index 0000000..bdad478 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/retweet.png differ diff --git a/lottie/test/goldens/all/lottiefiles/rocket.png b/lottie/test/goldens/all/lottiefiles/rocket.png new file mode 100644 index 0000000..a730102 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/rocket.png differ diff --git a/lottie/test/goldens/all/lottiefiles/rocksauce_title_card.png b/lottie/test/goldens/all/lottiefiles/rocksauce_title_card.png new file mode 100644 index 0000000..41fb064 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/rocksauce_title_card.png differ diff --git a/lottie/test/goldens/all/lottiefiles/scan.png b/lottie/test/goldens/all/lottiefiles/scan.png new file mode 100644 index 0000000..6a55a01 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/scan.png differ diff --git a/lottie/test/goldens/all/lottiefiles/scan_qr_code_success.png b/lottie/test/goldens/all/lottiefiles/scan_qr_code_success.png new file mode 100644 index 0000000..22142c2 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/scan_qr_code_success.png differ diff --git a/lottie/test/goldens/all/lottiefiles/search_button.png b/lottie/test/goldens/all/lottiefiles/search_button.png new file mode 100644 index 0000000..0dfc4c9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/search_button.png differ diff --git a/lottie/test/goldens/all/lottiefiles/security_token_roundtable.png b/lottie/test/goldens/all/lottiefiles/security_token_roundtable.png new file mode 100644 index 0000000..86c4ea6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/security_token_roundtable.png differ diff --git a/lottie/test/goldens/all/lottiefiles/sensor_scan.png b/lottie/test/goldens/all/lottiefiles/sensor_scan.png new file mode 100644 index 0000000..e1fdfc9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/sensor_scan.png differ diff --git a/lottie/test/goldens/all/lottiefiles/servishero_loading.png b/lottie/test/goldens/all/lottiefiles/servishero_loading.png new file mode 100644 index 0000000..1c6387c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/servishero_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/simple_loader.png b/lottie/test/goldens/all/lottiefiles/simple_loader.png new file mode 100644 index 0000000..156f381 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/simple_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/sky.png b/lottie/test/goldens/all/lottiefiles/sky.png new file mode 100644 index 0000000..0677e28 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/sky.png differ diff --git a/lottie/test/goldens/all/lottiefiles/slack_app_loader.png b/lottie/test/goldens/all/lottiefiles/slack_app_loader.png new file mode 100644 index 0000000..a9394e6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/slack_app_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/snowcation.png b/lottie/test/goldens/all/lottiefiles/snowcation.png new file mode 100644 index 0000000..96ece32 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/snowcation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/socar_logo.png b/lottie/test/goldens/all/lottiefiles/socar_logo.png new file mode 100644 index 0000000..643ca2a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/socar_logo.png differ diff --git a/lottie/test/goldens/all/lottiefiles/soda_loader.png b/lottie/test/goldens/all/lottiefiles/soda_loader.png new file mode 100644 index 0000000..b6b38b9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/soda_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/spacehub.png b/lottie/test/goldens/all/lottiefiles/spacehub.png new file mode 100644 index 0000000..fb51e80 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/spacehub.png differ diff --git a/lottie/test/goldens/all/lottiefiles/spinner loading.png b/lottie/test/goldens/all/lottiefiles/spinner loading.png new file mode 100644 index 0000000..ccd08cf Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/spinner loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/splashy_loader.png b/lottie/test/goldens/all/lottiefiles/splashy_loader.png new file mode 100644 index 0000000..694943c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/splashy_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/square_drop_loader.png b/lottie/test/goldens/all/lottiefiles/square_drop_loader.png new file mode 100644 index 0000000..5a75b52 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/square_drop_loader.png differ diff --git a/lottie/test/goldens/all/lottiefiles/star 2.png b/lottie/test/goldens/all/lottiefiles/star 2.png new file mode 100644 index 0000000..5b2a443 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/star 2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/streetby_test_loading.png b/lottie/test/goldens/all/lottiefiles/streetby_test_loading.png new file mode 100644 index 0000000..b635bac Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/streetby_test_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/streetbymorning.png b/lottie/test/goldens/all/lottiefiles/streetbymorning.png new file mode 100644 index 0000000..cd3dd2f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/streetbymorning.png differ diff --git a/lottie/test/goldens/all/lottiefiles/submit button.png b/lottie/test/goldens/all/lottiefiles/submit button.png new file mode 100644 index 0000000..8e0fe36 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/submit button.png differ diff --git a/lottie/test/goldens/all/lottiefiles/summer.png b/lottie/test/goldens/all/lottiefiles/summer.png new file mode 100644 index 0000000..965d853 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/summer.png differ diff --git a/lottie/test/goldens/all/lottiefiles/sushi_and_wine.png b/lottie/test/goldens/all/lottiefiles/sushi_and_wine.png new file mode 100644 index 0000000..0a64264 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/sushi_and_wine.png differ diff --git a/lottie/test/goldens/all/lottiefiles/swiftkey-logo.png b/lottie/test/goldens/all/lottiefiles/swiftkey-logo.png new file mode 100644 index 0000000..3cc0b1c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/swiftkey-logo.png differ diff --git a/lottie/test/goldens/all/lottiefiles/swipe_menu.png b/lottie/test/goldens/all/lottiefiles/swipe_menu.png new file mode 100644 index 0000000..2efd467 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/swipe_menu.png differ diff --git a/lottie/test/goldens/all/lottiefiles/swipe_right_indicator.png b/lottie/test/goldens/all/lottiefiles/swipe_right_indicator.png new file mode 100644 index 0000000..741f38c Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/swipe_right_indicator.png differ diff --git a/lottie/test/goldens/all/lottiefiles/switch_loop.png b/lottie/test/goldens/all/lottiefiles/switch_loop.png new file mode 100644 index 0000000..e483eae Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/switch_loop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/the_final_frontier.png b/lottie/test/goldens/all/lottiefiles/the_final_frontier.png new file mode 100644 index 0000000..8521513 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/the_final_frontier.png differ diff --git a/lottie/test/goldens/all/lottiefiles/tigerobo_demo.png b/lottie/test/goldens/all/lottiefiles/tigerobo_demo.png new file mode 100644 index 0000000..3a4b1fe Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/tigerobo_demo.png differ diff --git a/lottie/test/goldens/all/lottiefiles/timer_(3_second_loop).png b/lottie/test/goldens/all/lottiefiles/timer_(3_second_loop).png new file mode 100644 index 0000000..15bc9bd Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/timer_(3_second_loop).png differ diff --git a/lottie/test/goldens/all/lottiefiles/toggle.png b/lottie/test/goldens/all/lottiefiles/toggle.png new file mode 100644 index 0000000..715d419 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/toggle.png differ diff --git a/lottie/test/goldens/all/lottiefiles/toggle_switch.png b/lottie/test/goldens/all/lottiefiles/toggle_switch.png new file mode 100644 index 0000000..b5ab8fb Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/toggle_switch.png differ diff --git a/lottie/test/goldens/all/lottiefiles/touch_id.png b/lottie/test/goldens/all/lottiefiles/touch_id.png new file mode 100644 index 0000000..a24e3ad Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/touch_id.png differ diff --git a/lottie/test/goldens/all/lottiefiles/tractor.png b/lottie/test/goldens/all/lottiefiles/tractor.png new file mode 100644 index 0000000..307e038 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/tractor.png differ diff --git a/lottie/test/goldens/all/lottiefiles/tractor_animation.png b/lottie/test/goldens/all/lottiefiles/tractor_animation.png new file mode 100644 index 0000000..8d71b8b Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/tractor_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/trail_loading.png b/lottie/test/goldens/all/lottiefiles/trail_loading.png new file mode 100644 index 0000000..f439428 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/trail_loading.png differ diff --git a/lottie/test/goldens/all/lottiefiles/trophy.png b/lottie/test/goldens/all/lottiefiles/trophy.png new file mode 100644 index 0000000..d1feda6 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/trophy.png differ diff --git a/lottie/test/goldens/all/lottiefiles/trophy_animation.png b/lottie/test/goldens/all/lottiefiles/trophy_animation.png new file mode 100644 index 0000000..f317fce Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/trophy_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/truecosmos.png b/lottie/test/goldens/all/lottiefiles/truecosmos.png new file mode 100644 index 0000000..167c8da Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/truecosmos.png differ diff --git a/lottie/test/goldens/all/lottiefiles/turbine.png b/lottie/test/goldens/all/lottiefiles/turbine.png new file mode 100644 index 0000000..d6925e0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/turbine.png differ diff --git a/lottie/test/goldens/all/lottiefiles/typing dot.png b/lottie/test/goldens/all/lottiefiles/typing dot.png new file mode 100644 index 0000000..08a3ab9 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/typing dot.png differ diff --git a/lottie/test/goldens/all/lottiefiles/uk.png b/lottie/test/goldens/all/lottiefiles/uk.png new file mode 100644 index 0000000..fdf22e0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/uk.png differ diff --git a/lottie/test/goldens/all/lottiefiles/updating_map.png b/lottie/test/goldens/all/lottiefiles/updating_map.png new file mode 100644 index 0000000..53f12fd Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/updating_map.png differ diff --git a/lottie/test/goldens/all/lottiefiles/us.png b/lottie/test/goldens/all/lottiefiles/us.png new file mode 100644 index 0000000..9d261e7 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/us.png differ diff --git a/lottie/test/goldens/all/lottiefiles/video_cam.png b/lottie/test/goldens/all/lottiefiles/video_cam.png new file mode 100644 index 0000000..0d0aa58 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/video_cam.png differ diff --git a/lottie/test/goldens/all/lottiefiles/vigilance_camera.png b/lottie/test/goldens/all/lottiefiles/vigilance_camera.png new file mode 100644 index 0000000..f42fad0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/vigilance_camera.png differ diff --git a/lottie/test/goldens/all/lottiefiles/volume_indicator.png b/lottie/test/goldens/all/lottiefiles/volume_indicator.png new file mode 100644 index 0000000..ecf1849 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/volume_indicator.png differ diff --git a/lottie/test/goldens/all/lottiefiles/volume_shake_indicator.png b/lottie/test/goldens/all/lottiefiles/volume_shake_indicator.png new file mode 100644 index 0000000..f421dd4 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/volume_shake_indicator.png differ diff --git a/lottie/test/goldens/all/lottiefiles/vr_animation.png b/lottie/test/goldens/all/lottiefiles/vr_animation.png new file mode 100644 index 0000000..0058701 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/vr_animation.png differ diff --git a/lottie/test/goldens/all/lottiefiles/vr_sickness.png b/lottie/test/goldens/all/lottiefiles/vr_sickness.png new file mode 100644 index 0000000..446c815 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/vr_sickness.png differ diff --git a/lottie/test/goldens/all/lottiefiles/walking.png b/lottie/test/goldens/all/lottiefiles/walking.png new file mode 100644 index 0000000..7dee164 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/walking.png differ diff --git a/lottie/test/goldens/all/lottiefiles/walking_arrow.png b/lottie/test/goldens/all/lottiefiles/walking_arrow.png new file mode 100644 index 0000000..c07e668 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/walking_arrow.png differ diff --git a/lottie/test/goldens/all/lottiefiles/wallet recharge.png b/lottie/test/goldens/all/lottiefiles/wallet recharge.png new file mode 100644 index 0000000..0751e7a Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/wallet recharge.png differ diff --git a/lottie/test/goldens/all/lottiefiles/washing_machine.png b/lottie/test/goldens/all/lottiefiles/washing_machine.png new file mode 100644 index 0000000..4f854fa Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/washing_machine.png differ diff --git a/lottie/test/goldens/all/lottiefiles/win_result_2.png b/lottie/test/goldens/all/lottiefiles/win_result_2.png new file mode 100644 index 0000000..3a12d41 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/win_result_2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/wolf_peek.png b/lottie/test/goldens/all/lottiefiles/wolf_peek.png new file mode 100644 index 0000000..4a2574f Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/wolf_peek.png differ diff --git a/lottie/test/goldens/all/lottiefiles/x_pop.png b/lottie/test/goldens/all/lottiefiles/x_pop.png new file mode 100644 index 0000000..176c1b0 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/x_pop.png differ diff --git a/lottie/test/goldens/all/lottiefiles/xamarin_logo_2.png b/lottie/test/goldens/all/lottiefiles/xamarin_logo_2.png new file mode 100644 index 0000000..eee2616 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/xamarin_logo_2.png differ diff --git a/lottie/test/goldens/all/lottiefiles/xuanwheel_logo.png b/lottie/test/goldens/all/lottiefiles/xuanwheel_logo.png new file mode 100644 index 0000000..c92efc8 Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/xuanwheel_logo.png differ diff --git a/lottie/test/goldens/all/lottiefiles/yoga_carpet.png b/lottie/test/goldens/all/lottiefiles/yoga_carpet.png new file mode 100644 index 0000000..f5fa42d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/yoga_carpet.png differ diff --git a/lottie/test/goldens/all/lottiefiles/youtube_icon_reveal.png b/lottie/test/goldens/all/lottiefiles/youtube_icon_reveal.png new file mode 100644 index 0000000..2a1221d Binary files /dev/null and b/lottie/test/goldens/all/lottiefiles/youtube_icon_reveal.png differ diff --git a/lottie/test/goldens/all/lottielogo1.png b/lottie/test/goldens/all/lottielogo1.png new file mode 100644 index 0000000..a55533b Binary files /dev/null and b/lottie/test/goldens/all/lottielogo1.png differ diff --git a/lottie/test/goldens/all/lottielogo2.png b/lottie/test/goldens/all/lottielogo2.png new file mode 100644 index 0000000..0dcc186 Binary files /dev/null and b/lottie/test/goldens/all/lottielogo2.png differ diff --git a/lottie/test/goldens/all/pass_loading.png b/lottie/test/goldens/all/pass_loading.png new file mode 100644 index 0000000..f2d0645 Binary files /dev/null and b/lottie/test/goldens/all/pass_loading.png differ diff --git a/lottie/test/goldens/all/playing.png b/lottie/test/goldens/all/playing.png new file mode 100644 index 0000000..245e1ea Binary files /dev/null and b/lottie/test/goldens/all/playing.png differ diff --git a/lottie/test/goldens/all/spinning_carrousel.png b/lottie/test/goldens/all/spinning_carrousel.png new file mode 100644 index 0000000..34b2387 Binary files /dev/null and b/lottie/test/goldens/all/spinning_carrousel.png differ diff --git a/lottie/test/goldens/all/sticker.png b/lottie/test/goldens/all/sticker.png new file mode 100644 index 0000000..8dd0a1f Binary files /dev/null and b/lottie/test/goldens/all/sticker.png differ diff --git a/lottie/test/goldens/all/tent.png b/lottie/test/goldens/all/tent.png new file mode 100644 index 0000000..64ec0e8 Binary files /dev/null and b/lottie/test/goldens/all/tent.png differ diff --git a/lottie/test/goldens/all/twitterheartbutton.png b/lottie/test/goldens/all/twitterheartbutton.png new file mode 100644 index 0000000..d971a18 Binary files /dev/null and b/lottie/test/goldens/all/twitterheartbutton.png differ diff --git a/lottie/test/goldens/all/vegan_font.png b/lottie/test/goldens/all/vegan_font.png new file mode 100644 index 0000000..749b1cc Binary files /dev/null and b/lottie/test/goldens/all/vegan_font.png differ diff --git a/lottie/test/goldens/all/weather/fog.png b/lottie/test/goldens/all/weather/fog.png new file mode 100644 index 0000000..a272819 Binary files /dev/null and b/lottie/test/goldens/all/weather/fog.png differ diff --git a/lottie/test/goldens/all/weather/hurricane.png b/lottie/test/goldens/all/weather/hurricane.png new file mode 100644 index 0000000..4d1f7be Binary files /dev/null and b/lottie/test/goldens/all/weather/hurricane.png differ diff --git a/lottie/test/goldens/all/weather/thunder-storm.png b/lottie/test/goldens/all/weather/thunder-storm.png new file mode 100644 index 0000000..31edb6f Binary files /dev/null and b/lottie/test/goldens/all/weather/thunder-storm.png differ diff --git a/lottie/test/goldens/all/weather/tornado.png b/lottie/test/goldens/all/weather/tornado.png new file mode 100644 index 0000000..c30be23 Binary files /dev/null and b/lottie/test/goldens/all/weather/tornado.png differ diff --git a/lottie/test/goldens/all/weather/windy.png b/lottie/test/goldens/all/weather/windy.png new file mode 100644 index 0000000..3b6e895 Binary files /dev/null and b/lottie/test/goldens/all/weather/windy.png differ diff --git a/lottie/test/goldens/dotlottie.png b/lottie/test/goldens/dotlottie.png new file mode 100644 index 0000000..31ccec6 Binary files /dev/null and b/lottie/test/goldens/dotlottie.png differ diff --git a/lottie/test/goldens/dynamic/blur.png b/lottie/test/goldens/dynamic/blur.png new file mode 100644 index 0000000..2e607c7 Binary files /dev/null and b/lottie/test/goldens/dynamic/blur.png differ diff --git a/lottie/test/goldens/dynamic/color_filter.png b/lottie/test/goldens/dynamic/color_filter.png new file mode 100644 index 0000000..126f2ea Binary files /dev/null and b/lottie/test/goldens/dynamic/color_filter.png differ diff --git a/lottie/test/goldens/dynamic/drop_shadow.png b/lottie/test/goldens/dynamic/drop_shadow.png new file mode 100644 index 0000000..5f93bef Binary files /dev/null and b/lottie/test/goldens/dynamic/drop_shadow.png differ diff --git a/lottie/test/goldens/dynamic/ellipse_position.png b/lottie/test/goldens/dynamic/ellipse_position.png new file mode 100644 index 0000000..38c38ee Binary files /dev/null and b/lottie/test/goldens/dynamic/ellipse_position.png differ diff --git a/lottie/test/goldens/dynamic/ellipse_size.png b/lottie/test/goldens/dynamic/ellipse_size.png new file mode 100644 index 0000000..3df9840 Binary files /dev/null and b/lottie/test/goldens/dynamic/ellipse_size.png differ diff --git a/lottie/test/goldens/dynamic/fill_color_green.png b/lottie/test/goldens/dynamic/fill_color_green.png new file mode 100644 index 0000000..003d3cc Binary files /dev/null and b/lottie/test/goldens/dynamic/fill_color_green.png differ diff --git a/lottie/test/goldens/dynamic/fill_color_yellow.png b/lottie/test/goldens/dynamic/fill_color_yellow.png new file mode 100644 index 0000000..fc0df9c Binary files /dev/null and b/lottie/test/goldens/dynamic/fill_color_yellow.png differ diff --git a/lottie/test/goldens/dynamic/fill_opacity.png b/lottie/test/goldens/dynamic/fill_opacity.png new file mode 100644 index 0000000..32aeba8 Binary files /dev/null and b/lottie/test/goldens/dynamic/fill_opacity.png differ diff --git a/lottie/test/goldens/dynamic/matte_property.png b/lottie/test/goldens/dynamic/matte_property.png new file mode 100644 index 0000000..d8de149 Binary files /dev/null and b/lottie/test/goldens/dynamic/matte_property.png differ diff --git a/lottie/test/goldens/dynamic/null_color_filter.png b/lottie/test/goldens/dynamic/null_color_filter.png new file mode 100644 index 0000000..ce9f91a Binary files /dev/null and b/lottie/test/goldens/dynamic/null_color_filter.png differ diff --git a/lottie/test/goldens/dynamic/opacity_interpolation_00.png b/lottie/test/goldens/dynamic/opacity_interpolation_00.png new file mode 100644 index 0000000..c54ee21 Binary files /dev/null and b/lottie/test/goldens/dynamic/opacity_interpolation_00.png differ diff --git a/lottie/test/goldens/dynamic/opacity_interpolation_05.png b/lottie/test/goldens/dynamic/opacity_interpolation_05.png new file mode 100644 index 0000000..51ce27e Binary files /dev/null and b/lottie/test/goldens/dynamic/opacity_interpolation_05.png differ diff --git a/lottie/test/goldens/dynamic/opacity_interpolation_10.png b/lottie/test/goldens/dynamic/opacity_interpolation_10.png new file mode 100644 index 0000000..d9c8555 Binary files /dev/null and b/lottie/test/goldens/dynamic/opacity_interpolation_10.png differ diff --git a/lottie/test/goldens/dynamic/polygon_points.png b/lottie/test/goldens/dynamic/polygon_points.png new file mode 100644 index 0000000..0dc4513 Binary files /dev/null and b/lottie/test/goldens/dynamic/polygon_points.png differ diff --git a/lottie/test/goldens/dynamic/polygon_position.png b/lottie/test/goldens/dynamic/polygon_position.png new file mode 100644 index 0000000..ce9f91a Binary files /dev/null and b/lottie/test/goldens/dynamic/polygon_position.png differ diff --git a/lottie/test/goldens/dynamic/polygon_radius.png b/lottie/test/goldens/dynamic/polygon_radius.png new file mode 100644 index 0000000..9bf31b0 Binary files /dev/null and b/lottie/test/goldens/dynamic/polygon_radius.png differ diff --git a/lottie/test/goldens/dynamic/polygon_rotation.png b/lottie/test/goldens/dynamic/polygon_rotation.png new file mode 100644 index 0000000..5b5393e Binary files /dev/null and b/lottie/test/goldens/dynamic/polygon_rotation.png differ diff --git a/lottie/test/goldens/dynamic/polygon_roundedness.png b/lottie/test/goldens/dynamic/polygon_roundedness.png new file mode 100644 index 0000000..d43d7c1 Binary files /dev/null and b/lottie/test/goldens/dynamic/polygon_roundedness.png differ diff --git a/lottie/test/goldens/dynamic/rectangle_corner_roundedness.png b/lottie/test/goldens/dynamic/rectangle_corner_roundedness.png new file mode 100644 index 0000000..5d843fb Binary files /dev/null and b/lottie/test/goldens/dynamic/rectangle_corner_roundedness.png differ diff --git a/lottie/test/goldens/dynamic/rectangle_position.png b/lottie/test/goldens/dynamic/rectangle_position.png new file mode 100644 index 0000000..cf745ae Binary files /dev/null and b/lottie/test/goldens/dynamic/rectangle_position.png differ diff --git a/lottie/test/goldens/dynamic/rectangle_size.png b/lottie/test/goldens/dynamic/rectangle_size.png new file mode 100644 index 0000000..1f7dadf Binary files /dev/null and b/lottie/test/goldens/dynamic/rectangle_size.png differ diff --git a/lottie/test/goldens/dynamic/repeater_transform_end_opacity.png b/lottie/test/goldens/dynamic/repeater_transform_end_opacity.png new file mode 100644 index 0000000..89ee29f Binary files /dev/null and b/lottie/test/goldens/dynamic/repeater_transform_end_opacity.png differ diff --git a/lottie/test/goldens/dynamic/repeater_transform_position.png b/lottie/test/goldens/dynamic/repeater_transform_position.png new file mode 100644 index 0000000..07dbcf3 Binary files /dev/null and b/lottie/test/goldens/dynamic/repeater_transform_position.png differ diff --git a/lottie/test/goldens/dynamic/repeater_transform_rotation.png b/lottie/test/goldens/dynamic/repeater_transform_rotation.png new file mode 100644 index 0000000..2495071 Binary files /dev/null and b/lottie/test/goldens/dynamic/repeater_transform_rotation.png differ diff --git a/lottie/test/goldens/dynamic/repeater_transform_scale.png b/lottie/test/goldens/dynamic/repeater_transform_scale.png new file mode 100644 index 0000000..7dde00a Binary files /dev/null and b/lottie/test/goldens/dynamic/repeater_transform_scale.png differ diff --git a/lottie/test/goldens/dynamic/repeater_transform_start_opacity.png b/lottie/test/goldens/dynamic/repeater_transform_start_opacity.png new file mode 100644 index 0000000..1e791dd Binary files /dev/null and b/lottie/test/goldens/dynamic/repeater_transform_start_opacity.png differ diff --git a/lottie/test/goldens/dynamic/solid_color.png b/lottie/test/goldens/dynamic/solid_color.png new file mode 100644 index 0000000..2ce55ec Binary files /dev/null and b/lottie/test/goldens/dynamic/solid_color.png differ diff --git a/lottie/test/goldens/dynamic/star_inner_radius.png b/lottie/test/goldens/dynamic/star_inner_radius.png new file mode 100644 index 0000000..1fec408 Binary files /dev/null and b/lottie/test/goldens/dynamic/star_inner_radius.png differ diff --git a/lottie/test/goldens/dynamic/star_inner_roundedness.png b/lottie/test/goldens/dynamic/star_inner_roundedness.png new file mode 100644 index 0000000..2b2d22c Binary files /dev/null and b/lottie/test/goldens/dynamic/star_inner_roundedness.png differ diff --git a/lottie/test/goldens/dynamic/star_outer_radius.png b/lottie/test/goldens/dynamic/star_outer_radius.png new file mode 100644 index 0000000..e09bccb Binary files /dev/null and b/lottie/test/goldens/dynamic/star_outer_radius.png differ diff --git a/lottie/test/goldens/dynamic/star_outer_roundedness.png b/lottie/test/goldens/dynamic/star_outer_roundedness.png new file mode 100644 index 0000000..d43d7c1 Binary files /dev/null and b/lottie/test/goldens/dynamic/star_outer_roundedness.png differ diff --git a/lottie/test/goldens/dynamic/star_points.png b/lottie/test/goldens/dynamic/star_points.png new file mode 100644 index 0000000..0dc4513 Binary files /dev/null and b/lottie/test/goldens/dynamic/star_points.png differ diff --git a/lottie/test/goldens/dynamic/star_position.png b/lottie/test/goldens/dynamic/star_position.png new file mode 100644 index 0000000..ce9f91a Binary files /dev/null and b/lottie/test/goldens/dynamic/star_position.png differ diff --git a/lottie/test/goldens/dynamic/star_rotation.png b/lottie/test/goldens/dynamic/star_rotation.png new file mode 100644 index 0000000..5b5393e Binary files /dev/null and b/lottie/test/goldens/dynamic/star_rotation.png differ diff --git a/lottie/test/goldens/dynamic/stroke_color.png b/lottie/test/goldens/dynamic/stroke_color.png new file mode 100644 index 0000000..6de030b Binary files /dev/null and b/lottie/test/goldens/dynamic/stroke_color.png differ diff --git a/lottie/test/goldens/dynamic/stroke_opacity.png b/lottie/test/goldens/dynamic/stroke_opacity.png new file mode 100644 index 0000000..54cae03 Binary files /dev/null and b/lottie/test/goldens/dynamic/stroke_opacity.png differ diff --git a/lottie/test/goldens/dynamic/stroke_width.png b/lottie/test/goldens/dynamic/stroke_width.png new file mode 100644 index 0000000..ed3498c Binary files /dev/null and b/lottie/test/goldens/dynamic/stroke_width.png differ diff --git a/lottie/test/goldens/dynamic/time_remapping.png b/lottie/test/goldens/dynamic/time_remapping.png new file mode 100644 index 0000000..22ace03 Binary files /dev/null and b/lottie/test/goldens/dynamic/time_remapping.png differ diff --git a/lottie/test/goldens/dynamic/transform_anchor_point.png b/lottie/test/goldens/dynamic/transform_anchor_point.png new file mode 100644 index 0000000..803a4cb Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_anchor_point.png differ diff --git a/lottie/test/goldens/dynamic/transform_opacity.png b/lottie/test/goldens/dynamic/transform_opacity.png new file mode 100644 index 0000000..7f15d6d Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_opacity.png differ diff --git a/lottie/test/goldens/dynamic/transform_position.png b/lottie/test/goldens/dynamic/transform_position.png new file mode 100644 index 0000000..6c9d5c0 Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_position.png differ diff --git a/lottie/test/goldens/dynamic/transform_position_relative.png b/lottie/test/goldens/dynamic/transform_position_relative.png new file mode 100644 index 0000000..cf745ae Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_position_relative.png differ diff --git a/lottie/test/goldens/dynamic/transform_rotation.png b/lottie/test/goldens/dynamic/transform_rotation.png new file mode 100644 index 0000000..b625c25 Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_rotation.png differ diff --git a/lottie/test/goldens/dynamic/transform_scale.png b/lottie/test/goldens/dynamic/transform_scale.png new file mode 100644 index 0000000..76436f1 Binary files /dev/null and b/lottie/test/goldens/dynamic/transform_scale.png differ diff --git a/lottie/test/goldens/dynamic_image/delegate.png b/lottie/test/goldens/dynamic_image/delegate.png new file mode 100644 index 0000000..78fb150 Binary files /dev/null and b/lottie/test/goldens/dynamic_image/delegate.png differ diff --git a/lottie/test/goldens/dynamic_image/zip_with_provider.png b/lottie/test/goldens/dynamic_image/zip_with_provider.png new file mode 100644 index 0000000..78fb150 Binary files /dev/null and b/lottie/test/goldens/dynamic_image/zip_with_provider.png differ diff --git a/lottie/test/goldens/dynamic_text.png b/lottie/test/goldens/dynamic_text.png new file mode 100644 index 0000000..69c6efe Binary files /dev/null and b/lottie/test/goldens/dynamic_text.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_delegate.png b/lottie/test/goldens/dynamic_text/dynamic_text_delegate.png new file mode 100644 index 0000000..31ccfe1 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_delegate.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_emoji.png b/lottie/test/goldens/dynamic_text/dynamic_text_emoji.png new file mode 100644 index 0000000..77cc567 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_emoji.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate.png b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate.png new file mode 100644 index 0000000..a034915 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_endvalue.png b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_endvalue.png new file mode 100644 index 0000000..fe8525f Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_endvalue.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_overallprogress.png b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_overallprogress.png new file mode 100644 index 0000000..b98aae7 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_overallprogress.png differ diff --git a/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_startvalue.png b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_startvalue.png new file mode 100644 index 0000000..fe8525f Binary files /dev/null and b/lottie/test/goldens/dynamic_text/dynamic_text_valuedelegate_startvalue.png differ diff --git a/lottie/test/goldens/dynamic_text/text_fill_blue__green.png b/lottie/test/goldens/dynamic_text/text_fill_blue__green.png new file mode 100644 index 0000000..c7d793a Binary files /dev/null and b/lottie/test/goldens/dynamic_text/text_fill_blue__green.png differ diff --git a/lottie/test/goldens/dynamic_text/text_stroke_red__yellow.png b/lottie/test/goldens/dynamic_text/text_stroke_red__yellow.png new file mode 100644 index 0000000..d4b6773 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/text_stroke_red__yellow.png differ diff --git a/lottie/test/goldens/dynamic_text/text_stroke_width.png b/lottie/test/goldens/dynamic_text/text_stroke_width.png new file mode 100644 index 0000000..4ed3799 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/text_stroke_width.png differ diff --git a/lottie/test/goldens/dynamic_text/text_tracking_1.png b/lottie/test/goldens/dynamic_text/text_tracking_1.png new file mode 100644 index 0000000..f25aaf4 Binary files /dev/null and b/lottie/test/goldens/dynamic_text/text_tracking_1.png differ diff --git a/lottie/test/goldens/dynamic_text/text_tracking_2.png b/lottie/test/goldens/dynamic_text/text_tracking_2.png new file mode 100644 index 0000000..55e202c Binary files /dev/null and b/lottie/test/goldens/dynamic_text/text_tracking_2.png differ diff --git a/lottie/test/goldens/enable_render_cache.png b/lottie/test/goldens/enable_render_cache.png new file mode 100644 index 0000000..e8220b7 Binary files /dev/null and b/lottie/test/goldens/enable_render_cache.png differ diff --git a/lottie/test/goldens/fireworks.png b/lottie/test/goldens/fireworks.png new file mode 100644 index 0000000..f1be459 Binary files /dev/null and b/lottie/test/goldens/fireworks.png differ diff --git a/lottie/test/goldens/gradients/blub_red_callback.png b/lottie/test/goldens/gradients/blub_red_callback.png new file mode 100644 index 0000000..99523b8 Binary files /dev/null and b/lottie/test/goldens/gradients/blub_red_callback.png differ diff --git a/lottie/test/goldens/gradients/blub_red_value.png b/lottie/test/goldens/gradients/blub_red_value.png new file mode 100644 index 0000000..99523b8 Binary files /dev/null and b/lottie/test/goldens/gradients/blub_red_value.png differ diff --git a/lottie/test/goldens/gradients/linear_gradient_fill.png b/lottie/test/goldens/gradients/linear_gradient_fill.png new file mode 100644 index 0000000..c523a56 Binary files /dev/null and b/lottie/test/goldens/gradients/linear_gradient_fill.png differ diff --git a/lottie/test/goldens/gradients/linear_gradient_stroke.png b/lottie/test/goldens/gradients/linear_gradient_stroke.png new file mode 100644 index 0000000..f39fbfd Binary files /dev/null and b/lottie/test/goldens/gradients/linear_gradient_stroke.png differ diff --git a/lottie/test/goldens/gradients/opacity_linear_gradient_fill.png b/lottie/test/goldens/gradients/opacity_linear_gradient_fill.png new file mode 100644 index 0000000..55016d4 Binary files /dev/null and b/lottie/test/goldens/gradients/opacity_linear_gradient_fill.png differ diff --git a/lottie/test/goldens/gradients/radial_gradient_fill.png b/lottie/test/goldens/gradients/radial_gradient_fill.png new file mode 100644 index 0000000..787a0b3 Binary files /dev/null and b/lottie/test/goldens/gradients/radial_gradient_fill.png differ diff --git a/lottie/test/goldens/gradients/radial_gradient_stroke.png b/lottie/test/goldens/gradients/radial_gradient_stroke.png new file mode 100644 index 0000000..7e1bc5a Binary files /dev/null and b/lottie/test/goldens/gradients/radial_gradient_stroke.png differ diff --git a/lottie/test/goldens/lightningbug_file.png b/lottie/test/goldens/lightningbug_file.png new file mode 100644 index 0000000..2e2e098 Binary files /dev/null and b/lottie/test/goldens/lightningbug_file.png differ diff --git a/lottie/test/goldens/mirror.png b/lottie/test/goldens/mirror.png new file mode 100644 index 0000000..7a3fdb1 Binary files /dev/null and b/lottie/test/goldens/mirror.png differ diff --git a/lottie/test/goldens/opacity_layers.png b/lottie/test/goldens/opacity_layers.png new file mode 100644 index 0000000..d30b198 Binary files /dev/null and b/lottie/test/goldens/opacity_layers.png differ diff --git a/lottie/test/goldens/warningShimmer_1.png b/lottie/test/goldens/warningShimmer_1.png new file mode 100644 index 0000000..a7d01e4 Binary files /dev/null and b/lottie/test/goldens/warningShimmer_1.png differ diff --git a/lottie/test/goldens/warningShimmer_2.png b/lottie/test/goldens/warningShimmer_2.png new file mode 100644 index 0000000..a7d01e4 Binary files /dev/null and b/lottie/test/goldens/warningShimmer_2.png differ diff --git a/lottie/test/goldens/warningShimmer_3.png b/lottie/test/goldens/warningShimmer_3.png new file mode 100644 index 0000000..a7d01e4 Binary files /dev/null and b/lottie/test/goldens/warningShimmer_3.png differ diff --git a/lottie/test/gradient_test.dart b/lottie/test/gradient_test.dart new file mode 100644 index 0000000..5d2beaf --- /dev/null +++ b/lottie/test/gradient_test.dart @@ -0,0 +1,166 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; + +void main() { + void testGradient(String name, ValueDelegate valueDelegate) { + testWidgets(name, (tester) async { + var composition = await LottieComposition.fromBytes( + File('example/assets/Tests/DynamicGradient.json').readAsBytesSync(), + ); + + var animation = AnimationController( + vsync: tester, + duration: composition.duration, + ); + + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates(values: [valueDelegate]), + ), + ); + + var screenshotName = name + .toLowerCase() + .replaceAll(RegExp('[^a-z0-9 ]'), '') + .replaceAll(' ', '_'); + + await expectLater( + find.byType(Lottie), + matchesGoldenFile('goldens/gradients/$screenshotName.png'), + ); + }); + } + + testGradient( + 'Linear Gradient Fill', + ValueDelegate.gradientColor( + ['Linear', 'Rectangle', 'Gradient Fill'], + value: const [Color(0xFFFFFF00), Color(0xFF00FF00)], + ), + ); + + testGradient( + 'Radial Gradient Fill', + ValueDelegate.gradientColor( + ['Radial', 'Rectangle', 'Gradient Fill'], + value: const [Color(0xFFFFFF00), Color(0xFF00FF00)], + ), + ); + + testGradient( + 'Linear Gradient Stroke', + ValueDelegate.gradientColor( + ['Linear', 'Rectangle', 'Gradient Stroke'], + value: const [Color(0xFFFFFF00), Color(0xFF00FF00)], + ), + ); + + testGradient( + 'Radial Gradient Stroke', + ValueDelegate.gradientColor( + ['Radial', 'Rectangle', 'Gradient Stroke'], + value: const [Color(0xFFFFFF00), Color(0xFF00FF00)], + ), + ); + + testGradient( + 'Opacity Linear Gradient Fill', + ValueDelegate.opacity(['Linear', 'Rectangle', 'Gradient Fill'], value: 50), + ); + + testWidgets('Can change gradient dynamically with value', (tester) async { + var composition = await LottieComposition.fromBytes( + File('example/assets/blub.json').readAsBytesSync(), + ); + + var animation = AnimationController( + vsync: tester, + duration: composition.duration, + ); + + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates( + values: [ + ValueDelegate.gradientColor( + const ['灯光', '灯光', 'Gradient Fill 2'], + value: [Colors.yellow, Colors.white], + ), + ], + ), + ), + ); + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates( + values: [ + ValueDelegate.gradientColor( + const ['灯光', '灯光', 'Gradient Fill 2'], + value: [Colors.red, Colors.white], + ), + ], + ), + ), + ); + + await expectLater( + find.byType(Lottie), + matchesGoldenFile('goldens/gradients/blub_red_value.png'), + ); + }); + + testWidgets('Can change gradient dynamically with callback', (tester) async { + var composition = await LottieComposition.fromBytes( + File('example/assets/blub.json').readAsBytesSync(), + ); + + var animation = AnimationController( + vsync: tester, + duration: composition.duration, + ); + + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates( + values: [ + ValueDelegate.gradientColor(const [ + '灯光', + '灯光', + 'Gradient Fill 2', + ], callback: (_) => [Colors.yellow, Colors.white]), + ], + ), + ), + ); + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animation, + delegates: LottieDelegates( + values: [ + ValueDelegate.gradientColor(const [ + '灯光', + '灯光', + 'Gradient Fill 2', + ], callback: (_) => [Colors.red, Colors.white]), + ], + ), + ), + ); + + await expectLater( + find.byType(Lottie), + matchesGoldenFile('goldens/gradients/blub_red_callback.png'), + ); + }); +} diff --git a/lottie/test/lottie_test.dart b/lottie/test/lottie_test.dart new file mode 100644 index 0000000..5dad105 --- /dev/null +++ b/lottie/test/lottie_test.dart @@ -0,0 +1,558 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; + +void main() { + tearDown(() { + Lottie.cache.clear(); + }); + + testWidgets('Should settle if no animation', (tester) async { + var data = File('example/assets/HamburgerArrow.json').readAsBytesSync(); + var composition = await LottieComposition.fromBytes(data); + + await tester.pumpWidget(Lottie(composition: composition, animate: false)); + + await tester.pumpAndSettle(); + }); + + testWidgets('onLoaded called with the correct composition', (tester) async { + late LottieComposition composition; + + var file = SynchronousFile(File('example/assets/HamburgerArrow.json')); + + await tester.pumpWidget( + LottieBuilder.file( + file, + onLoaded: (c) { + composition = c; + }, + ), + ); + + await tester.pump(); + + expect(composition.endFrame, 179.99); + }); + + testWidgets('onLoaded called when remplacing the widget animation', ( + tester, + ) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var androidData = Future.value( + bytesForFile('example/assets/AndroidWave.json'), + ); + + var mockAsset = FakeAssetBundle({ + 'hamburger.json': hamburgerData, + 'android.json': androidData, + }); + + var animation = AnimationController(vsync: tester); + + LottieComposition? composition; + await tester.pumpWidget( + Lottie.asset( + 'hamburger.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + }, + ), + ); + await tester.pump(); + expect(tester.takeException(), isNull); + //expect(find.byType(Lottie), findsOneWidget); + expect(composition, isNotNull); + expect(composition!.duration, const Duration(seconds: 6)); + + composition = null; + + await tester.pumpWidget( + Lottie.asset( + 'android.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + }, + ), + ); + + await tester.pump(); + expect(composition, isNotNull); + expect(composition!.duration, const Duration(seconds: 2, milliseconds: 50)); + }); + + testWidgets('onLoaded data race 1', (tester) async { + var hamburgerCompleter = Completer(); + var androidCompleter = Completer(); + + var hamburgerData = bytesForFile('example/assets/HamburgerArrow.json'); + var androidData = bytesForFile('example/assets/AndroidWave.json'); + + var mockAsset = FakeAssetBundle({ + 'hamburger.json': hamburgerCompleter.future, + 'android.json': androidCompleter.future, + }); + + var animation = AnimationController(vsync: tester); + + var onLoadedCount = 0; + + LottieComposition? composition; + await tester.pumpWidget( + Lottie.asset( + 'hamburger.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + ++onLoadedCount; + }, + ), + ); + await tester.pump(); + expect( + find.byWidgetPredicate((w) => w is RawLottie && w.composition == null), + findsOneWidget, + ); + expect(composition, isNull); + expect(onLoadedCount, 0); + + await tester.pumpWidget( + Lottie.asset( + 'android.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + ++onLoadedCount; + }, + ), + ); + + await tester.pump(); + expect(composition, isNull); + expect(onLoadedCount, 0); + + hamburgerCompleter.complete(hamburgerData); + + await tester.pump(); + expect(composition, isNull); + expect(onLoadedCount, 0); + + androidCompleter.complete(androidData); + + await tester.pump(); + expect(composition!.duration, const Duration(seconds: 2, milliseconds: 50)); + expect(onLoadedCount, 1); + }); + + testWidgets('onLoaded data race 2', (tester) async { + var hamburgerCompleter = Completer(); + var androidCompleter = Completer(); + + var hamburgerData = bytesForFile('example/assets/HamburgerArrow.json'); + var androidData = bytesForFile('example/assets/AndroidWave.json'); + + var mockAsset = FakeAssetBundle({ + 'hamburger.json': hamburgerCompleter.future, + 'android.json': androidCompleter.future, + }); + + var animation = AnimationController(vsync: tester); + + var onLoadedCount = 0; + + LottieComposition? composition; + await tester.pumpWidget( + Lottie.asset( + 'hamburger.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + ++onLoadedCount; + }, + ), + ); + await tester.pump(); + expect( + find.byWidgetPredicate((w) => w is RawLottie && w.composition == null), + findsOneWidget, + ); + expect(composition, isNull); + expect(onLoadedCount, 0); + + await tester.pumpWidget( + Lottie.asset( + 'android.json', + controller: animation, + bundle: mockAsset, + onLoaded: (c) { + composition = c; + ++onLoadedCount; + }, + ), + ); + + await tester.pump(); + expect(composition, isNull); + expect(onLoadedCount, 0); + + androidCompleter.complete(androidData); + + await tester.pump(); + expect(composition!.duration, const Duration(seconds: 2, milliseconds: 50)); + expect(onLoadedCount, 1); + + hamburgerCompleter.complete(hamburgerData); + + await tester.pump(); + expect(composition!.duration, const Duration(seconds: 2, milliseconds: 50)); + expect(onLoadedCount, 1); + }); + + testWidgets('Should auto animate', (tester) async { + var composition = await LottieComposition.fromBytes( + File('example/assets/HamburgerArrow.json').readAsBytesSync(), + ); + + await tester.pumpWidget(Lottie(composition: composition)); + + await tester.pump(); + + var lottie = tester.firstWidget( + find.byType(AnimatedBuilder), + ); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 6), + ); + expect((lottie.listenable as AnimationController).isAnimating, true); + + await tester.pumpWidget(Lottie(composition: composition, animate: false)); + + lottie = tester.firstWidget(find.byType(AnimatedBuilder)); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 6), + ); + expect((lottie.listenable as AnimationController).isAnimating, false); + + await tester.pumpWidget(Lottie(composition: composition)); + + lottie = tester.firstWidget(find.byType(AnimatedBuilder)); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 6), + ); + + var animationController = AnimationController( + vsync: tester, + duration: const Duration(seconds: 2), + ); + + await tester.pumpWidget( + Lottie(composition: composition, controller: animationController.view), + ); + + lottie = tester.firstWidget(find.byType(AnimatedBuilder)); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 2), + ); + + await tester.pumpWidget( + Lottie( + composition: composition, + controller: animationController.view, + animate: false, + ), + ); + + lottie = tester.firstWidget(find.byType(AnimatedBuilder)); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 2), + ); + + await tester.pumpWidget(Lottie(composition: composition, animate: false)); + + lottie = tester.firstWidget(find.byType(AnimatedBuilder)); + expect(lottie.listenable, isNotNull); + expect( + (lottie.listenable as AnimationController).duration, + const Duration(seconds: 6), + ); + expect((lottie.listenable as AnimationController).isAnimating, false); + }); + + testWidgets('errorBuilder called when error', (tester) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var mockAsset = FakeAssetBundle({'hamburger.json': hamburgerData}); + + var errorKey = UniqueKey(); + var loadedCall = 0; + await tester.pumpWidget( + LottieBuilder.asset( + 'error.json', + bundle: mockAsset, + errorBuilder: (c, e, stackTrace) => Container(key: errorKey), + onLoaded: (c) { + ++loadedCall; + }, + ), + ); + + await tester.pump(); + expect(find.byKey(errorKey), findsOneWidget); + expect(loadedCall, 0); + + await tester.pumpWidget( + LottieBuilder.asset( + 'hamburger.json', + bundle: mockAsset, + errorBuilder: (c, e, stackTrace) => Container(key: errorKey), + onLoaded: (c) { + ++loadedCall; + }, + ), + ); + await tester.pump(); + + expect(find.byType(Lottie), findsOneWidget); + expect(find.byKey(errorKey), findsNothing); + expect(loadedCall, 1); + }); + + testWidgets('Cache should be synchronous', (tester) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var mockAsset = FakeAssetBundle({'hamburger.json': hamburgerData}); + + var loadedCall = 0; + var lottieWidget = LottieBuilder.asset( + 'hamburger.json', + bundle: mockAsset, + onLoaded: (c) { + ++loadedCall; + }, + ); + + await tester.pumpWidget(lottieWidget); + expect(tester.widget(find.byType(Lottie)).composition, isNull); + await tester.pump(); + expect(tester.widget(find.byType(Lottie)).composition, isNotNull); + + await tester.pumpWidget(Column(children: [lottieWidget, lottieWidget])); + expect( + tester.widget(find.byType(Lottie).at(0)).composition, + isNotNull, + ); + expect( + tester.widget(find.byType(Lottie).at(1)).composition, + isNotNull, + ); + expect(loadedCall, 3); + }); + + testWidgets('Cache can be cleared', (tester) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var mockAsset = FakeAssetBundle({'hamburger.json': hamburgerData}); + + var loadedCall = 0; + var lottieWidget = LottieBuilder.asset( + 'hamburger.json', + bundle: mockAsset, + onLoaded: (c) { + ++loadedCall; + }, + ); + + await tester.pumpWidget(lottieWidget); + expect(tester.widget(find.byType(Lottie)).composition, isNull); + await tester.pump(); + expect(tester.widget(find.byType(Lottie)).composition, isNotNull); + + Lottie.cache.clear(); + + await tester.pumpWidget(Center(child: lottieWidget)); + expect(tester.widget(find.byType(Lottie)).composition, isNull); + await tester.pump(); + expect(tester.widget(find.byType(Lottie)).composition, isNotNull); + expect(loadedCall, 2); + }); + + testWidgets('onLoaded is ', (tester) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var mockAsset = FakeAssetBundle({'hamburger.json': hamburgerData}); + var provider = AssetLottie('hamburger.json', bundle: mockAsset); + + await tester.pumpWidget( + KeyedSubtree( + key: UniqueKey(), + child: _LottieWithSetStateInOnLoaded(provider), + ), + ); + var state1 = tester.state<__LottieWithSetStateInOnLoadedState>( + find.byType(_LottieWithSetStateInOnLoaded), + ); + expect(state1.loadedCount, 1); + await tester.pump(); + expect(state1.loadedCount, 1); + + await tester.pumpWidget( + KeyedSubtree( + key: UniqueKey(), + child: _LottieWithSetStateInOnLoaded(provider), + ), + ); + var state2 = tester.state<__LottieWithSetStateInOnLoadedState>( + find.byType(_LottieWithSetStateInOnLoaded), + ); + expect(state2.loadedCount, 1); + await tester.pump(); + expect(state2.loadedCount, 1); + expect(state1, isNot(state2)); + }); + + testWidgets( + 'if composition is static should create Lottie with [animate] false by default', + (tester) async { + await tester.pumpWidget( + LottieBuilder.memory( + File('test/data/static_lottie.json').readAsBytesSync(), + ), + ); + expect(tester.hasRunningAnimations, false); + }, + ); + + testWidgets( + 'if composition is static and [animate] is true, should have animations', + (tester) async { + await tester.pumpWidget( + LottieBuilder.memory( + File('test/data/static_lottie.json').readAsBytesSync(), + animate: true, + ), + ); + expect(tester.hasRunningAnimations, true); + }, + ); + + testWidgets('AssetLottie uses DefaultAssetBundle', (tester) async { + var hamburgerData = Future.value( + bytesForFile('example/assets/HamburgerArrow.json'), + ); + var mockAsset = FakeAssetBundle({ + 'hamburger.json': hamburgerData, + 'other.json': hamburgerData, + }); + await tester.pumpWidget( + DefaultAssetBundle( + bundle: mockAsset, + child: Lottie.asset('hamburger.json'), + ), + ); + await tester.pump(const Duration(milliseconds: 100)); + expect(find.byType(RawLottie), findsOneWidget); + expect( + find.byWidgetPredicate((w) => w is RawLottie && w.composition != null), + findsOneWidget, + ); + + await tester.pumpWidget( + DefaultAssetBundle(bundle: mockAsset, child: Lottie.asset('other.json')), + ); + await tester.pump(const Duration(milliseconds: 100)); + expect( + find.byWidgetPredicate((w) => w is RawLottie && w.composition != null), + findsOneWidget, + ); + }); + + testWidgets('expected an int', (tester) async { + var data = File( + 'example/assets/Tests/kona_splash_animation.json', + ).readAsBytesSync(); + var composition = await LottieComposition.fromBytes(data); + + await tester.pumpWidget(Lottie(composition: composition, animate: false)); + + await tester.pumpAndSettle(); + }); +} + +class SynchronousFile extends Fake implements File { + final File _real; + + SynchronousFile(this._real); + + @override + String get path => _real.path; + + @override + Future readAsBytes() => Future.value(_real.readAsBytesSync()); +} + +ByteData bytesForFile(String path) => + File(path).readAsBytesSync().buffer.asByteData(); + +class FakeAssetBundle extends Fake implements AssetBundle { + final Map> data; + + FakeAssetBundle(this.data); + + @override + Future load(String key) { + return data[key] ?? (Future.error('Asset $key not found')); + } +} + +class _LottieWithSetStateInOnLoaded extends StatefulWidget { + final LottieProvider lottie; + + const _LottieWithSetStateInOnLoaded(this.lottie); + + @override + State<_LottieWithSetStateInOnLoaded> createState() => + __LottieWithSetStateInOnLoadedState(); +} + +class __LottieWithSetStateInOnLoadedState + extends State<_LottieWithSetStateInOnLoaded> { + var loadedCount = 0; + + @override + Widget build(BuildContext context) { + return LottieBuilder( + lottie: widget.lottie, + onLoaded: (_) { + setState(() { + ++loadedCount; + }); + }, + ); + } +} diff --git a/lottie/test/opacity_layer_test.dart b/lottie/test/opacity_layer_test.dart new file mode 100644 index 0000000..345e120 --- /dev/null +++ b/lottie/test/opacity_layer_test.dart @@ -0,0 +1,41 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path/path.dart' as p; + +void main() { + testWidgets('Opacity layer option', (tester) async { + var size = const Size(500, 800); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var bytes = File( + 'example/assets/Tests/opacity_layers.json', + ).readAsBytesSync(); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Lottie.memory( + bytes, + options: LottieOptions(enableApplyingOpacityToLayers: true), + ), + Lottie.memory(bytes), + ], + ), + ), + ), + ); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 500)); + + await expectLater( + find.byType(Scaffold), + matchesGoldenFile(p.join('goldens/opacity_layers.png')), + ); + }); +} diff --git a/lottie/test/parser/moshi/buffer_test.dart b/lottie/test/parser/moshi/buffer_test.dart new file mode 100644 index 0000000..124c7ad --- /dev/null +++ b/lottie/test/parser/moshi/buffer_test.dart @@ -0,0 +1,25 @@ +import 'dart:typed_data'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/src/parser/moshi/buffer.dart'; + +void main() { + test('Read', () { + var buffer = Buffer(Uint8List.fromList(List.generate(10, (i) => i))); + + buffer.request(4); + expect(buffer.readByte(), 0); + expect(buffer.readByte(), 1); + expect(buffer.getByte(0), 2); + expect(buffer.getByte(1), 3); + }); + test('Skip', () { + var buffer = Buffer(Uint8List.fromList(List.generate(10, (i) => i))); + + buffer.skip(2); + buffer.request(1); + expect(buffer.readByte(), 2); + expect(buffer.size, 0); + buffer.skip(2); + expect(buffer.size, 0); + }); +} diff --git a/lottie/test/parser/moshi/json_reader_test.dart b/lottie/test/parser/moshi/json_reader_test.dart new file mode 100644 index 0000000..129eb24 --- /dev/null +++ b/lottie/test/parser/moshi/json_reader_test.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/src/parser/moshi/json_reader.dart'; + +void main() { + test('Read json', () { + var reader = JsonReader.fromBytes(utf8.encoder.convert(_simpleJson)); + var messages = readMessagesArray(reader); + expect(messages, hasLength(2)); + expect(messages.first.user!.name, 'json_newb'); + }); +} + +class Message { + final int id; + final String? text; + final List? geo; + final User? user; + + Message(this.id, this.text, this.user, this.geo); +} + +class User { + final String? name; + final int followerCount; + + User(this.name, this.followerCount); +} + +List readMessagesArray(JsonReader reader) { + var messages = []; + reader.beginArray(); + while (reader.hasNext()) { + messages.add(readMessage(reader)); + } + reader.endArray(); + return messages; +} + +Message readMessage(JsonReader reader) { + var id = -1; + String? text; + User? user; + List? geo; + reader.beginObject(); + while (reader.hasNext()) { + var name = reader.nextName(); + if (name == 'id') { + id = reader.nextInt(); + } else if (name == 'text') { + text = reader.nextString(); + } else if (name == 'geo' && reader.peek() != Token.nullToken) { + geo = readDoublesArray(reader); + } else if (name == 'user') { + user = readUser(reader); + } else { + reader.skipValue(); + } + } + reader.endObject(); + return Message(id, text, user, geo); +} + +List readDoublesArray(JsonReader reader) { + var doubles = []; + reader.beginArray(); + while (reader.hasNext()) { + doubles.add(reader.nextDouble()); + } + reader.endArray(); + return doubles; +} + +User readUser(JsonReader reader) { + String? username; + var followersCount = -1; + reader.beginObject(); + while (reader.hasNext()) { + var name = reader.nextName(); + if (name == 'name') { + username = reader.nextString(); + } else if (name == 'followers_count') { + followersCount = reader.nextInt(); + } else { + reader.skipValue(); + } + } + reader.endObject(); + return User(username, followersCount); +} + +const _simpleJson = ''' +[ + { + "id": 912345678901, + "text": "How do I read a JSON stream in Java?", + "geo": null, + "user": { + "name": "json_newb", + "followers_count": 41 + } + }, + { + "id": 912345678902, + "text": "@json_newb just use JsonReader!", + "geo": [50.454722, -104.606667], + "user": { + "name": "jesse", + "followers_count": 2 + } + } +] +'''; diff --git a/lottie/test/render_cache_store_test.dart b/lottie/test/render_cache_store_test.dart new file mode 100644 index 0000000..2d113b1 --- /dev/null +++ b/lottie/test/render_cache_store_test.dart @@ -0,0 +1,107 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:lottie/src/render_cache/key.dart'; +import 'package:lottie/src/render_cache/store_raster.dart'; + +void main() { + var animationBytes = File( + 'example/assets/AndroidWave.json', + ).readAsBytesSync(); + var key1 = CacheKey( + composition: LottieComposition.parseJsonBytes(animationBytes), + size: const Size(10, 10), + config: const [FrameRate.composition], + delegates: 0, + ); + var key2 = CacheKey( + composition: LottieComposition.parseJsonBytes(animationBytes), + size: const Size(20, 10), + config: const [FrameRate.composition], + delegates: 0, + ); + + test('RenderCache acquire/release logic', () async { + var cache = RasterStore(5000000); + + var user = Object(); + + var handle = cache.acquire(user); + var entry = handle.withKey(key1); + entry.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 1); + + cache.release(user); + expect(cache.imageCount, 0); + }); + + test('RenderCache change key', () async { + var cache = RasterStore(500000); + + var user = Object(); + + var handle = cache.acquire(user); + var entry = handle.withKey(key1); + entry.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 1); + + entry = handle.withKey(key2); + expect(cache.imageCount, 0); + + entry.imageForProgress(0, (p0) {}); + entry.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 1); + }); + + test('RenderCache acquire with same key', () async { + var cache = RasterStore(5000000); + + var user1 = Object(); + var user2 = Object(); + + var handle1 = cache.acquire(user1); + var entry1 = handle1.withKey(key1); + entry1.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 1); + + var handle2 = cache.acquire(user2); + var entry2 = handle2.withKey(key1); + expect(entry1, entry2); + + cache.release(user2); + expect(cache.imageCount, 1); + + entry1.imageForProgress(1, (p0) {}); + expect(cache.imageCount, 2); + }); + + test('RenderCache change key and release', () async { + var cache = RasterStore(50000000); + + var user1 = Object(); + var user2 = Object(); + + var handle1 = cache.acquire(user1); + var entry1 = handle1.withKey(key1); + entry1.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 1); + + var handle2 = cache.acquire(user2); + var entry2 = handle2.withKey(key1); + expect(entry1, entry2); + + entry2 = handle2.withKey(key2); + expect(entry1, isNot(equals(entry2))); + expect(cache.imageCount, 1); + + entry2.imageForProgress(0, (p0) {}); + expect(cache.imageCount, 2); + + cache.release(user2); + expect(cache.imageCount, 1); + + cache.release(user1); + expect(cache.imageCount, 0); + }); +} diff --git a/lottie/test/render_cache_test.dart b/lottie/test/render_cache_test.dart new file mode 100644 index 0000000..73b73de --- /dev/null +++ b/lottie/test/render_cache_test.dart @@ -0,0 +1,276 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; + +void main() { + testWidgets('Golden renderCache', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/a_mountain.json').readAsBytesSync(), + ); + + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + await tester.pumpWidget( + RawLottie( + progress: 0.5, + composition: composition, + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 1); + + await expectLater( + find.byType(RawLottie), + matchesGoldenFile('goldens/enable_render_cache.png'), + ); + }); + + testWidgets('Enable render cache', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/bell.json').readAsBytesSync(), + ); + + var widget = _boilerplate( + ListView( + children: [ + for (var i = 0; i < 2; i++) + Lottie( + composition: composition, + renderCache: RenderCache.raster, + height: 100, + ), + ], + ), + ); + + await tester.pumpWidget(widget); + expect(RenderCache.raster.store.imageCount, 1); + expect(RenderCache.raster.store.handles.length, 2); + expect(RenderCache.raster.store.entries.length, 1); + var image = + RenderCache.raster.store.entries.values.first.images.values.first; + await tester.pumpWidget(widget); + expect(RenderCache.raster.store.imageCount, 1); + var image2 = + RenderCache.raster.store.entries.values.first.images.values.first; + expect(image, image2); + await tester.pump(const Duration(milliseconds: 100)); + await tester.pumpWidget(widget); + expect(RenderCache.raster.store.imageCount, 2); + await tester.pumpWidget(Container()); + expect(RenderCache.raster.store.imageCount, 0); + await tester.pumpWidget(widget); + expect(RenderCache.raster.store.imageCount, 1); + }); + + testWidgets('Enable render cache', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/bell.json').readAsBytesSync(), + ); + + var widget = _boilerplate( + ListView( + children: [ + for (var i = 0; i < 2; i++) + RawLottie( + composition: composition, + renderCache: RenderCache.raster, + height: 100, + progress: 0, + ), + ], + ), + ); + + await tester.pumpWidget(widget); + }); + + testWidgets('Cache cleared when a property change', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/a_mountain.json').readAsBytesSync(), + ); + + await tester.pumpWidget( + RawLottie( + progress: 0.5, + composition: composition, + frameRate: const FrameRate(60), + renderCache: RenderCache.raster, + ), + ); + await tester.pumpWidget( + RawLottie( + progress: 0.6, + composition: composition, + frameRate: const FrameRate(60), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 2); + + await tester.pumpWidget( + RawLottie( + progress: 0.7, + composition: composition, + frameRate: const FrameRate(30), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 1); + }); + + testWidgets('Cache cleared when a delegate change', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/a_mountain.json').readAsBytesSync(), + ); + + String textCallback(String s) => s; + String textCallback2(String s) => s; + await tester.pumpWidget( + RawLottie( + progress: 0.5, + composition: composition, + delegates: LottieDelegates(text: textCallback), + renderCache: RenderCache.raster, + ), + ); + await tester.pumpWidget( + RawLottie( + progress: 0.6, + composition: composition, + delegates: LottieDelegates(text: textCallback), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 2); + + await tester.pumpWidget( + RawLottie( + progress: 0.7, + composition: composition, + delegates: LottieDelegates(text: textCallback2), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 1); + }); + + testWidgets('Cache cleared when a delegate value change', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/a_mountain.json').readAsBytesSync(), + ); + + await tester.pumpWidget( + RawLottie( + progress: 0.5, + composition: composition, + delegates: LottieDelegates( + values: [ + ValueDelegate.color(['*'], value: Colors.red), + ], + ), + renderCache: RenderCache.raster, + ), + ); + await tester.pumpWidget( + RawLottie( + progress: 0.6, + composition: composition, + delegates: LottieDelegates( + values: [ + ValueDelegate.color(['*'], value: Colors.red), + ], + ), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 2); + + await tester.pumpWidget( + RawLottie( + progress: 0.7, + composition: composition, + delegates: LottieDelegates( + values: [ + ValueDelegate.color(['*'], value: Colors.blue), + ], + ), + renderCache: RenderCache.raster, + ), + ); + expect(RenderCache.raster.store.imageCount, 1); + }); + + testWidgets('2 widgets with same animation share cache', (tester) async { + var composition = LottieComposition.parseJsonBytes( + File('example/assets/lottiefiles/a_mountain.json').readAsBytesSync(), + ); + + await tester.pumpWidget( + Column( + children: [ + RawLottie( + progress: 0.5, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + RawLottie( + progress: 0.5, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + ], + ), + ); + expect(RenderCache.raster.store.imageCount, 1); + + await tester.pumpWidget( + Column( + children: [ + RawLottie( + progress: 0.6, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + RawLottie( + progress: 0.5, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + ], + ), + ); + expect(RenderCache.raster.store.imageCount, 2); + + await tester.pumpWidget( + Column( + children: [ + RawLottie( + progress: 0.6, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + RawLottie( + progress: 0.6, + composition: composition, + renderCache: RenderCache.raster, + height: 50, + ), + ], + ), + ); + expect(RenderCache.raster.store.imageCount, 2); + }); +} + +Widget _boilerplate(Widget widget) { + return MaterialApp(home: Scaffold(body: widget)); +} diff --git a/lottie/test/screenshot_test.dart b/lottie/test/screenshot_test.dart new file mode 100644 index 0000000..6081536 --- /dev/null +++ b/lottie/test/screenshot_test.dart @@ -0,0 +1,53 @@ +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path/path.dart' as p; + +void main() { + //TODO(xha): download all screenshots from lottie-android as golden screenshots + // https://happo.io/api/a/27/p/27/reports/abe43ed3d2f25a3ea3c38b1740011cf84fea5e93-android28 + + const animationPath = 'example/assets'; + + var animations = <_Screenshot>[ + _Screenshot('AndroidWave.json'), + _Screenshot('HamburgerArrow.json'), + _Screenshot('HamburgerArrow.json', progress: 0.5), + _Screenshot('HamburgerArrow.json', progress: 1.0), + _Screenshot('Mobilo/A.json', progress: 0.5), + _Screenshot('Mobilo/B.json', progress: 0.5), + _Screenshot('Logo/LogoSmall.json', progress: 0.5), + _Screenshot('lottiefiles/atm_link.json', progress: 1.0), + ]; + for (var animation in animations) { + testWidgets('Screenshot ${animation.name} at ${animation.progress}', ( + WidgetTester tester, + ) async { + var composition = await LottieComposition.fromBytes( + File(p.join(animationPath, animation.name)).readAsBytesSync(), + ); + + var goldenName = animation.goldenName; + + await tester.pumpWidget( + RawLottie(composition: composition, progress: animation.progress), + ); + await expectLater( + find.byType(RawLottie), + matchesGoldenFile( + p.join('golden', p.dirname(animation.name), '$goldenName.png'), + ), + ); + }); + } +} + +class _Screenshot { + final String name; + final double progress; + + _Screenshot(this.name, {this.progress = 0.0}); + + String get goldenName => + '${p.basenameWithoutExtension(name)}_${progress.toStringAsFixed(1).replaceAll('.', '_')}'; +} diff --git a/lottie/test/telegram_sticker_test.dart b/lottie/test/telegram_sticker_test.dart new file mode 100644 index 0000000..63674f9 --- /dev/null +++ b/lottie/test/telegram_sticker_test.dart @@ -0,0 +1,27 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path/path.dart' as p; + +void main() { + testWidgets('Telegram sticker', (tester) async { + var size = const Size(500, 400); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1.0; + + var provider = FileLottie( + File('example/assets/LightningBug_file.tgs'), + decoder: LottieComposition.decodeGZip, + ); + await tester.runAsync(() => provider.load()); + + await tester.pumpWidget(LottieBuilder(lottie: provider)); + + await expectLater( + find.byType(Lottie), + matchesGoldenFile(p.join('goldens/lightningbug_file.png')), + ); + }); +} diff --git a/lottie/test/utils.dart b/lottie/test/utils.dart new file mode 100644 index 0000000..5e05663 --- /dev/null +++ b/lottie/test/utils.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + +class FilmStrip extends StatelessWidget { + final LottieComposition composition; + final LottieDelegates? delegates; + final Size size; + + const FilmStrip( + this.composition, { + super.key, + required this.size, + this.delegates, + }); + + @override + Widget build(BuildContext context) { + return CustomPaint(size: size, painter: _CustomerPainter(this)); + } +} + +class _CustomerPainter extends CustomPainter { + static const _columns = 5; + final FilmStrip parent; + + _CustomerPainter(this.parent); + + @override + void paint(Canvas canvas, Size size) { + var thumbSize = Size(size.width / _columns, size.width / _columns); + var drawable = LottieDrawable(parent.composition, frameRate: FrameRate.max); + if (parent.delegates != null) { + drawable.delegates = parent.delegates; + } + + var index = 0; + for (var progress = 0.0; progress <= 1; progress += 0.05) { + var x = index % _columns; + var y = index ~/ _columns; + + var rect = + Offset(x * thumbSize.width, y.toDouble() * thumbSize.height) & + thumbSize; + + drawable + ..setProgress(progress) + ..draw(canvas, rect); + + ++index; + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return true; + } +} diff --git a/mutex/LICENSE b/mutex/LICENSE new file mode 100644 index 0000000..eb40cc8 --- /dev/null +++ b/mutex/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2016, Hoylen Sue. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mutex/lib/mutex.dart b/mutex/lib/mutex.dart new file mode 100644 index 0000000..ba224d1 --- /dev/null +++ b/mutex/lib/mutex.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2016, Hoylen Sue. All rights reserved. Use of this source code +// is governed by a BSD-style license that can be found in the LICENSE file. + +/// Mutual exclusion. +/// +library mutex; + +import 'dart:async'; + +part 'src/mutex.dart'; +part 'src/read_write_mutex.dart'; diff --git a/mutex/lib/src/mutex.dart b/mutex/lib/src/mutex.dart new file mode 100644 index 0000000..4cd3770 --- /dev/null +++ b/mutex/lib/src/mutex.dart @@ -0,0 +1,84 @@ +part of mutex; + +/// Mutual exclusion. +/// +/// The [protect] method is a convenience method for acquiring a lock before +/// running critical code, and then releasing the lock afterwards. Using this +/// convenience method will ensure the lock is always released after use. +/// +/// Usage: +/// +/// m = Mutex(); +/// +/// await m.protect(() async { +/// // critical section +/// }); +/// +/// Alternatively, a lock can be explicitly acquired and managed. In this +/// situation, the program is responsible for releasing the lock after it +/// have been used. Failure to release the lock will prevent other code for +/// ever acquiring the lock. +/// +/// m = Mutex(); +/// +/// await m.acquire(); +/// try { +/// // critical section +/// } +/// finally { +/// m.release(); +/// } + +class Mutex { + // Implemented as a ReadWriteMutex that is used only with write locks. + final ReadWriteMutex _rwMutex = ReadWriteMutex(); + + /// Indicates if a lock has been acquired and not released. + bool get isLocked => (_rwMutex.isLocked); + + /// Acquire a lock + /// + /// Returns a future that will be completed when the lock has been acquired. + /// + /// Consider using the convenience method [protect], otherwise the caller + /// is responsible for making sure the lock is released after it is no longer + /// needed. Failure to release the lock means no other code can acquire the + /// lock. + + Future acquire() => _rwMutex.acquireWrite(); + + /// Release a lock. + /// + /// Release a lock that has been acquired. + + void release() => _rwMutex.release(); + + /// Convenience method for protecting a function with a lock. + /// + /// This method guarantees a lock is always acquired before invoking the + /// [criticalSection] function. It also guarantees the lock is always + /// released. + /// + /// A critical section should always contain asynchronous code, since purely + /// synchronous code does not need to be protected inside a critical section. + /// Therefore, the critical section is a function that returns a _Future_. + /// If the critical section does not need to return a value, it should be + /// defined as returning `Future`. + /// + /// Returns a _Future_ whose value is the value of the _Future_ returned by + /// the critical section. + /// + /// An exception is thrown if the critical section throws an exception, + /// or an exception is thrown while waiting for the _Future_ returned by + /// the critical section to complete. The lock is released, when those + /// exceptions occur. + + Future protect(Future Function() criticalSection) async { + await acquire(); + try { + return await criticalSection(); + } finally { + release(); + } + } +} diff --git a/mutex/lib/src/read_write_mutex.dart b/mutex/lib/src/read_write_mutex.dart new file mode 100644 index 0000000..56fac81 --- /dev/null +++ b/mutex/lib/src/read_write_mutex.dart @@ -0,0 +1,293 @@ +part of mutex; + +//################################################################ +/// Internal representation of a request for a lock. +/// +/// This is instantiated for each acquire and, if necessary, it is added +/// to the waiting queue. + +class _ReadWriteMutexRequest { + /// Internal constructor. + /// + /// The [isRead] indicates if this is a request for a read lock (true) or a + /// request for a write lock (false). + + _ReadWriteMutexRequest({required this.isRead}); + + /// Indicates if this is a read or write lock. + + final bool isRead; // true = read lock requested; false = write lock requested + + /// The job's completer. + /// + /// This [Completer] will complete when the job has acquired the lock. + + final Completer completer = Completer(); +} + +//################################################################ +/// Mutual exclusion that supports read and write locks. +/// +/// Multiple read locks can be simultaneously acquired, but at most only +/// one write lock can be acquired at any one time. +/// +/// **Protecting critical code** +/// +/// The [protectWrite] and [protectRead] are convenience methods for acquiring +/// locks and releasing them. Using them will ensure the locks are always +/// released after use. +/// +/// Create the mutex: +/// +/// m = ReadWriteMutex(); +/// +/// Code protected by a write lock: +/// +/// await m.protectWrite(() { +/// // critical write section +/// }); +/// +/// Other code can be protected by a read lock: +/// +/// await m.protectRead(() { +/// // critical read section +/// }); +/// +/// +/// **Explicitly managing locks** +/// +/// Alternatively, the locks can be explicitly acquired and managed. In this +/// situation, the program is responsible for releasing the locks after they +/// have been used. Failure to release the lock will prevent other code for +/// ever acquiring a lock. +/// +/// Create the mutex: +/// +/// m = ReadWriteMutex(); +/// +/// Some code can acquire a write lock: +/// +/// await m.acquireWrite(); +/// try { +/// // critical write section +/// assert(m.isWriteLocked); +/// } finally { +/// m.release(); +/// } +/// +/// Other code can acquire a read lock. +/// +/// await m.acquireRead(); +/// try { +/// // critical read section +/// assert(m.isReadLocked); +/// } finally { +/// m.release(); +/// } +/// +/// The current implementation lets locks be acquired in first-in-first-out +/// order. This ensures there will not be any lock starvation, which can +/// happen if some locks are prioritised over others. Submit a feature +/// request issue, if there is a need for another scheduling algorithm. + +class ReadWriteMutex { + //================================================================ + // Members + + /// List of requests waiting for a lock on this mutex. + + final _waiting = <_ReadWriteMutexRequest>[]; + + /// State of the mutex + + int _state = 0; // -1 = write lock, +ve = number of read locks; 0 = no lock + + //================================================================ + // Methods + + /// Indicates if a lock (read or write) has been acquired and not released. + bool get isLocked => (_state != 0); + + /// Indicates if a write lock has been acquired and not released. + bool get isWriteLocked => (_state == -1); + + /// Indicates if one or more read locks has been acquired and not released. + bool get isReadLocked => (0 < _state); + + /// Acquire a read lock + /// + /// Returns a future that will be completed when the lock has been acquired. + /// + /// A read lock can not be acquired when there is a write lock on the mutex. + /// But it can be acquired if there are other read locks. + /// + /// Consider using the convenience method [protectRead], otherwise the caller + /// is responsible for making sure the lock is released after it is no longer + /// needed. Failure to release the lock means no other code can acquire a + /// write lock. + + Future acquireRead() => _acquire(isRead: true); + + /// Acquire a write lock + /// + /// Returns a future that will be completed when the lock has been acquired. + /// + /// A write lock can only be acquired when there are no other locks (neither + /// read locks nor write locks) on the mutex. + /// + /// Consider using the convenience method [protectWrite], otherwise the caller + /// is responsible for making sure the lock is released after it is no longer + /// needed. Failure to release the lock means no other code can acquire the + /// lock (neither a read lock or a write lock). + + Future acquireWrite() => _acquire(isRead: false); + + /// Release a lock. + /// + /// Release the lock that was previously acquired. + /// + /// When the lock is released, locks waiting to be acquired can be acquired + /// depending on the type of lock waiting and if other locks have been + /// acquired. + /// + /// A [StateError] is thrown if the mutex does not currently have a lock on + /// it. + + void release() { + if (_state == -1) { + // Write lock released + _state = 0; + } else if (0 < _state) { + // Read lock released + _state--; + } else if (_state == 0) { + throw StateError('no lock to release'); + } else { + assert(false, 'invalid state'); + } + + // If there are jobs waiting and the next job can acquire the mutex, + // let it acquire it and remove it from the queue. + // + // This is a while loop, because there could be multiple jobs on the + // queue waiting for a read-only mutex. So they can all be allowed to run. + + while (_waiting.isNotEmpty) { + final nextJob = _waiting.first; + if (_jobAcquired(nextJob)) { + _waiting.removeAt(0); + } else { + // The next job cannot acquire the mutex. This only occurs when: the + // the currently running job has a write mutex (_state == -1); or the + // next job wants write mutex and there is a job currently running + // (regardless of what type of mutex it has acquired). + assert(_state < 0 || !nextJob.isRead, + 'unexpected: next job cannot be acquired'); + break; // no more can be removed from the queue + } + } + } + + /// Convenience method for protecting a function with a read lock. + /// + /// This method guarantees a read lock is always acquired before invoking the + /// [criticalSection] function. It also guarantees the lock is always + /// released. + /// + /// A critical section should always contain asynchronous code, since purely + /// synchronous code does not need to be protected inside a critical section. + /// Therefore, the critical section is a function that returns a _Future_. + /// If the critical section does not need to return a value, it should be + /// defined as returning `Future`. + /// + /// Returns a _Future_ whose value is the value of the _Future_ returned by + /// the critical section. + /// + /// An exception is thrown if the critical section throws an exception, + /// or an exception is thrown while waiting for the _Future_ returned by + /// the critical section to complete. The lock is released, when those + /// exceptions occur. + + Future protectRead(Future Function() criticalSection) async { + await acquireRead(); + try { + return await criticalSection(); + } finally { + release(); + } + } + + /// Convenience method for protecting a function with a write lock. + /// + /// This method guarantees a write lock is always acquired before invoking the + /// [criticalSection] function. It also guarantees the lock is always + /// released. + /// + /// A critical section should always contain asynchronous code, since purely + /// synchronous code does not need to be protected inside a critical section. + /// Therefore, the critical section is a function that returns a _Future_. + /// If the critical section does not need to return a value, it should be + /// defined as returning `Future`. + /// + /// Returns a _Future_ whose value is the value of the _Future_ returned by + /// the critical section. + /// + /// An exception is thrown if the critical section throws an exception, + /// or an exception is thrown while waiting for the _Future_ returned by + /// the critical section to complete. The lock is released, when those + /// exceptions occur. + + Future protectWrite(Future Function() criticalSection) async { + await acquireWrite(); + try { + return await criticalSection(); + } finally { + release(); + } + } + + /// Internal acquire method. + /// + /// Used to acquire a read lock (when [isRead] is true) or a write lock + /// (when [isRead] is false). + /// + /// Returns a Future that completes when the lock has been acquired. + + Future _acquire({required bool isRead}) { + final newJob = _ReadWriteMutexRequest(isRead: isRead); + + if (_waiting.isNotEmpty || !_jobAcquired(newJob)) { + // This new job cannot run yet. There are either other jobs already + // waiting, or there are no waiting jobs but this job cannot start + // because the mutex is currently acquired (namely, either this new job + // or the currently running job is read-write). + // + // Add the new job to the end of the queue. + + _waiting.add(newJob); + } + + return newJob.completer.future; + } + + /// Determine if the [job] can now acquire the lock. + /// + /// If it can acquire the lock, the job's completer is completed, the + /// state updated, and true is returned. If not, false is returned. + /// + /// A job for a read lock can only be acquired if there are no other locks + /// or there are read lock(s). A job for a write lock can only be acquired + /// if there are no other locks. + + bool _jobAcquired(_ReadWriteMutexRequest job) { + assert(-1 <= _state); + if (_state == 0 || (0 < _state && job.isRead)) { + // Can acquire + _state = (job.isRead) ? (_state + 1) : -1; + job.completer.complete(); + return true; + } else { + return false; + } + } +} diff --git a/mutex/pubspec.yaml b/mutex/pubspec.yaml new file mode 100644 index 0000000..a7f7a1f --- /dev/null +++ b/mutex/pubspec.yaml @@ -0,0 +1,12 @@ +name: mutex +description: Mutual exclusion with implementation of normal and read-write mutex +version: 3.1.0 +homepage: https://github.com/hoylen/dart-mutex + +environment: + sdk: '>=2.15.0 <4.0.0' + +dev_dependencies: + lints: ^2.1.1 + pana: ^0.21.37 + test: ^1.16.3 diff --git a/mutex/test/mutex_multiple_read_test.dart b/mutex/test/mutex_multiple_read_test.dart new file mode 100644 index 0000000..c0a560b --- /dev/null +++ b/mutex/test/mutex_multiple_read_test.dart @@ -0,0 +1,102 @@ +// Test contributed by "Cat-sushi" +// + +import 'dart:async'; +// import 'dart:io'; + +import 'package:mutex/mutex.dart'; +import 'package:test/test.dart'; + +//================================================================ +// For debug output +// +// Uncomment the "stdout.write" line in the [debugWrite] method to enable +// debug output. + +int numReadAcquired = 0; +int numReadReleased = 0; + +enum State { waitingToAcquire, acquired, released } + +const stateSymbol = { + State.waitingToAcquire: '?', + State.acquired: '+', + State.released: '-' +}; + +var _outputCount = 0; // to manage line breaks + +void debugOutput(String id, State state) { + debugWrite('$id${stateSymbol[state]} '); + + _outputCount++; + if (_outputCount % 10 == 0) { + debugWrite('\n'); + } +} + +void debugWrite(String str) { + // Uncomment to show what is happening + // stdout.write(str); +} + +//================================================================ + +Future mySleep([int ms = 1000]) async { + await Future.delayed(Duration(milliseconds: ms)); +} + +Future sharedLoop1(ReadWriteMutex mutex, String symbol) async { + while (true) { + debugOutput(symbol, State.waitingToAcquire); + + await mutex.protectRead(() async { + numReadAcquired++; + debugOutput(symbol, State.acquired); + + await mySleep(100); + }); + numReadReleased++; + + debugOutput(symbol, State.released); + } +} + +void main() { + group('exclusive lock tests', () { + test('test1', () async { + const numReadLoops = 5; + + final mutex = ReadWriteMutex(); + + assert(numReadLoops < 26, 'too many read loops for lowercase letters'); + debugWrite('Number of read loops: $numReadLoops\n'); + + for (var x = 0; x < numReadLoops; x++) { + final symbol = String.fromCharCode('a'.codeUnitAt(0) + x); + unawaited(sharedLoop1(mutex, symbol)); + await mySleep(10); + } + + await mySleep(1000); + + debugWrite('\nAbout to acquireWrite' + ' (reads: acquired=$numReadAcquired released=$numReadReleased' + ' outstanding=${numReadAcquired - numReadReleased})\n'); + _outputCount = 0; // reset line break + + const writeSymbol = 'W'; + + debugOutput(writeSymbol, State.waitingToAcquire); + await mutex.acquireWrite(); + debugOutput(writeSymbol, State.acquired); + mutex.release(); + debugOutput(writeSymbol, State.released); + + debugWrite('\nWrite mutex released\n'); + _outputCount = 0; // reset line break + + expect('a', 'a'); + }); + }); +} diff --git a/mutex/test/mutex_readwrite_test.dart b/mutex/test/mutex_readwrite_test.dart new file mode 100644 index 0000000..4b2752d --- /dev/null +++ b/mutex/test/mutex_readwrite_test.dart @@ -0,0 +1,485 @@ +import 'dart:async'; +import 'package:mutex/mutex.dart'; +import 'package:test/test.dart'; + +//################################################################ + +class RWTester { + int _operation = 0; + final _operationSequences = []; + + /// Execution sequence of the operations done. + /// + /// Each element corresponds to the position of the initial execution + /// order of the read/write operation future. + List get operationSequences => _operationSequences; + + ReadWriteMutex mutex = ReadWriteMutex(); + + /// Set to true to print out read/write to the balance during deposits + static final bool debugOutput = false; + + final DateTime _startTime = DateTime.now(); + + void _debugPrint(String message) { + if (debugOutput) { + final t = DateTime.now().difference(_startTime).inMilliseconds; + print('$t: $message'); + } + } + + void reset() { + _operationSequences.clear(); + _debugPrint('reset'); + } + + /// Waits [startDelay] and then invokes critical section with mutex. + /// + /// Writes to [_operationSequences]. If the readwrite locks are respected + /// then the final state of the list will be in ascending order. + Future writing(int startDelay, int sequence, int endDelay) async { + await Future.delayed(Duration(milliseconds: startDelay)); + + await mutex.protectWrite(() async { + final op = ++_operation; + _debugPrint('[$op] write start: <- $_operationSequences'); + final tmp = _operationSequences; + expect(mutex.isWriteLocked, isTrue); + expect(_operationSequences, orderedEquals(tmp)); + // Add the position of operation to the list of operations. + _operationSequences.add(sequence); // add position to list + expect(mutex.isWriteLocked, isTrue); + await Future.delayed(Duration(milliseconds: endDelay)); + _debugPrint('[$op] write finish: -> $_operationSequences'); + }); + } + + /// Waits [startDelay] and then invokes critical section with mutex. + /// + /// + Future reading(int startDelay, int sequence, int endDelay) async { + await Future.delayed(Duration(milliseconds: startDelay)); + + await mutex.protectRead(() async { + final op = ++_operation; + _debugPrint('[$op] read start: <- $_operationSequences'); + expect(mutex.isReadLocked, isTrue); + _operationSequences.add(sequence); // add position to list + await Future.delayed(Duration(milliseconds: endDelay)); + _debugPrint('[$op] read finish: <- $_operationSequences'); + }); + } +} + +//################################################################ + +//---------------------------------------------------------------- + +void main() { + final account = RWTester(); + + setUp(account.reset); + + test('multiple read locks', () async { + await Future.wait([ + account.reading(0, 1, 1000), + account.reading(0, 2, 900), + account.reading(0, 3, 800), + account.reading(0, 4, 700), + account.reading(0, 5, 600), + account.reading(0, 6, 500), + account.reading(0, 7, 400), + account.reading(0, 8, 300), + account.reading(0, 9, 200), + account.reading(0, 10, 100), + ]); + // The first future acquires the lock first and waits the longest to give it + // up. This should however not block any of the other read operations + // as such the reads should finish in ascending orders. + expect( + account.operationSequences, + orderedEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), + ); + }); + + test('multiple write locks', () async { + await Future.wait([ + account.writing(0, 1, 100), + account.writing(0, 2, 100), + account.writing(0, 3, 100), + ]); + // The first future writes first and holds the lock until 100 ms + // Even though the second future starts execution, the lock cannot be + // acquired until it is released by the first future. + // Therefore the sequence of operations will be in ascending order + // of the futures. + expect( + account.operationSequences, + orderedEquals([1, 2, 3]), + ); + }); + + test('acquireWrite() before acquireRead()', () async { + const lockTimeout = Duration(milliseconds: 100); + + final mutex = ReadWriteMutex(); + + await mutex.acquireWrite(); + expect(mutex.isReadLocked, equals(false)); + expect(mutex.isWriteLocked, equals(true)); + + // Since there is a write lock existing, a read lock cannot be acquired. + final readLock = mutex.acquireRead().timeout(lockTimeout); + expect( + () async => (await readLock), + throwsA(isA()), + ); + }); + + test('acquireRead() before acquireWrite()', () async { + const lockTimeout = Duration(milliseconds: 100); + + final mutex = ReadWriteMutex(); + + await mutex.acquireRead(); + expect(mutex.isReadLocked, equals(true)); + expect(mutex.isWriteLocked, equals(false)); + + // Since there is a read lock existing, a write lock cannot be acquired. + final writeLock = mutex.acquireWrite().timeout(lockTimeout); + expect( + () async => await writeLock, + throwsA(isA()), + ); + }); + + test('mixture of read write locks execution order', () async { + await Future.wait([ + account.reading(0, 1, 100), + account.reading(10, 2, 100), + account.reading(20, 3, 100), + account.writing(30, 4, 100), + account.writing(40, 5, 100), + account.writing(50, 6, 100), + ]); + + expect( + account.operationSequences, + orderedEquals([1, 2, 3, 4, 5, 6]), + ); + }); + + group('protectRead', () { + test('lock obtained and released on success', () async { + final m = ReadWriteMutex(); + + await m.protectRead(() async { + // critical section + expect(m.isLocked, isTrue); + }); + expect(m.isLocked, isFalse); + }); + + test('value returned from critical section', () async { + // These are the normal scenario of the critical section running + // successfully. It tests different return types from the + // critical section. + + final m = ReadWriteMutex(); + + // returns Future + await m.protectRead(() async {}); + + // returns Future + final number = await m.protectRead(() async => 42); + expect(number, equals(42)); + + // returns Future completes with value + final optionalNumber = await m.protectRead(() async => 1024); + expect(optionalNumber, equals(1024)); + + // returns Future completes with null + final optionalNumberNull = await m.protectRead(() async => null); + expect(optionalNumberNull, isNull); + + // returns Future + final word = await m.protectRead(() async => 'foobar'); + expect(word, equals('foobar')); + + // returns Future completes with value + final optionalWord = await m.protectRead(() async => 'baz'); + expect(optionalWord, equals('baz')); + + // returns Future completes with null + final optionalWordNull = await m.protectRead(() async => null); + expect(optionalWordNull, isNull); + + expect(m.isLocked, isFalse); + }); + + test('exception in synchronous code', () async { + // Tests what happens when an exception is raised in the **synchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. Even though the exception is synchronously + // raised by the critical section, it won't be thrown when _protect_ + // is invoked. The _protect_ method always successfully returns a + // _Future_. + + Future criticalSection() { + final c = Completer()..complete(42); + + // synchronous exception + throw const FormatException('synchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + try { + // ignore: unused_local_variable + final resultFuture = criticalSection(); + fail('critical section did not throw synchronous exception'); + } on FormatException { + // expected: invoking the criticalSection results in the exception + } + + final m = ReadWriteMutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protectRead(criticalSection); + expect(resultFuture, isA()); + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('synchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + + test('exception in asynchronous code', () async { + // Tests what happens when an exception is raised in the **asynchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. + + Future criticalSection() async { + final c = Completer()..complete(42); + + await Future.delayed(const Duration(seconds: 1), () {}); + + // asynchronous exception (since it must wait for the above line) + throw const FormatException('asynchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + final resultFuture = criticalSection(); + expect(resultFuture, isA()); + // invoking the criticalSection does not result in the exception + try { + await resultFuture; + fail('critical section did not throw asynchronous exception'); + } on FormatException { + // expected: exception happens on the await + } + + final m = ReadWriteMutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protectRead(criticalSection); + expect(resultFuture, isA()); + + // Even though the criticalSection throws the exception in synchronous + // code, protect causes it to become an asynchronous exception. + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('asynchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + }); + + group('protectWrite', () { + test('lock obtained and released on success', () async { + final m = ReadWriteMutex(); + + await m.protectWrite(() async { + // critical section + expect(m.isLocked, isTrue); + }); + expect(m.isLocked, isFalse); + }); + + test('value returned from critical section', () async { + // These are the normal scenario of the critical section running + // successfully. It tests different return types from the + // critical section. + + final m = ReadWriteMutex(); + + // returns Future + await m.protectWrite(() async {}); + + // returns Future + final number = await m.protectWrite(() async => 42); + expect(number, equals(42)); + + // returns Future completes with value + final optionalNumber = await m.protectWrite(() async => 1024); + expect(optionalNumber, equals(1024)); + + // returns Future completes with null + final optionalNumberNull = await m.protectWrite(() async => null); + expect(optionalNumberNull, isNull); + + // returns Future + final word = await m.protectWrite(() async => 'foobar'); + expect(word, equals('foobar')); + + // returns Future completes with value + final optionalWord = await m.protectWrite(() async => 'baz'); + expect(optionalWord, equals('baz')); + + // returns Future completes with null + final optionalWordNull = await m.protectWrite(() async => null); + expect(optionalWordNull, isNull); + + expect(m.isLocked, isFalse); + }); + + test('exception in synchronous code', () async { + // Tests what happens when an exception is raised in the **synchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. Even though the exception is synchronously + // raised by the critical section, it won't be thrown when _protect_ + // is invoked. The _protect_ method always successfully returns a + // _Future_. + + Future criticalSection() { + final c = Completer()..complete(42); + + // synchronous exception + throw const FormatException('synchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + try { + // ignore: unused_local_variable + final resultFuture = criticalSection(); + fail('critical section did not throw synchronous exception'); + } on FormatException { + // expected: invoking the criticalSection results in the exception + } + + final m = ReadWriteMutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protectWrite(criticalSection); + expect(resultFuture, isA()); + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('synchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + + test('exception in asynchronous code', () async { + // Tests what happens when an exception is raised in the **asynchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. + + Future criticalSection() async { + final c = Completer()..complete(42); + + await Future.delayed(const Duration(seconds: 1), () {}); + + // asynchronous exception (since it must wait for the above line) + throw const FormatException('asynchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + final resultFuture = criticalSection(); + expect(resultFuture, isA()); + // invoking the criticalSection does not result in the exception + try { + await resultFuture; + fail('critical section did not throw asynchronous exception'); + } on FormatException { + // expected: exception happens on the await + } + + final m = ReadWriteMutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protectWrite(criticalSection); + expect(resultFuture, isA()); + + // Even though the criticalSection throws the exception in synchronous + // code, protect causes it to become an asynchronous exception. + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('asynchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + }); +} diff --git a/mutex/test/mutex_test.dart b/mutex/test/mutex_test.dart new file mode 100644 index 0000000..101f9ff --- /dev/null +++ b/mutex/test/mutex_test.dart @@ -0,0 +1,340 @@ +import 'dart:async'; +import 'package:mutex/mutex.dart'; +import 'package:test/test.dart'; + +//################################################################ +/// Account simulating the classic "simultaneous update" concurrency problem. +/// +/// The deposit operation reads the balance, waits for a short time (where +/// problems can occur if the balance is changed) and then writes out the +/// new balance. +/// +class Account { + int get balance => _balance; + int _balance = 0; + + int _operation = 0; + + Mutex mutex = Mutex(); + + /// Set to true to print out read/write to the balance during deposits + static final bool debugOutput = false; + + /// Time used for calculating time offsets in debug messages. + final DateTime _startTime = DateTime.now(); + + void _debugPrint(String message) { + if (debugOutput) { + final t = DateTime.now().difference(_startTime).inMilliseconds; + print('$t: $message'); + } + } + + void reset([int startingBalance = 0]) { + _balance = startingBalance; + _debugPrint('reset: balance = $_balance'); + } + + /// Waits [startDelay] and then invokes critical section without mutex. + /// + Future depositUnsafe( + int amount, int startDelay, int dangerWindow) async { + await Future.delayed(Duration(milliseconds: startDelay)); + + await _depositCriticalSection(amount, dangerWindow); + } + + /// Waits [startDelay] and then invokes critical section with mutex. + /// + Future depositWithMutex( + int amount, int startDelay, int dangerWindow) async { + await Future.delayed(Duration(milliseconds: startDelay)); + + await mutex.acquire(); + try { + expect(mutex.isLocked, isTrue); + await _depositCriticalSection(amount, dangerWindow); + expect(mutex.isLocked, isTrue); + } finally { + mutex.release(); + } + } + + /// Critical section of adding [amount] to the balance. + /// + /// Reads the balance, then sleeps for [dangerWindow] milliseconds, before + /// saving the new balance. If not protected, another invocation of this + /// method while it is sleeping will read the balance before it is updated. + /// The one that saves its balance last will overwrite the earlier saved + /// balances (effectively those other deposits will be lost). + /// + Future _depositCriticalSection(int amount, int dangerWindow) async { + final op = ++_operation; + + _debugPrint('[$op] read balance: $_balance'); + + final tmp = _balance; + + await Future.delayed(Duration(milliseconds: dangerWindow)); + + _balance = tmp + amount; + + _debugPrint('[$op] write balance: $_balance (= $tmp + $amount)'); + } +} + +//################################################################ + +//---------------------------------------------------------------- + +void main() { + final correctBalance = 68; + + final account = Account(); + + test('without mutex', () async { + // First demonstrate that without mutex incorrect results are produced. + + // Without mutex produces incorrect result + // 000. a reads 0 + // 025. b reads 0 + // 050. a writes 42 + // 075. b writes 26 + account.reset(); + await Future.wait([ + account.depositUnsafe(42, 0, 50), + account.depositUnsafe(26, 25, 50) // result overwrites first deposit + ]); + expect(account.balance, equals(26)); // incorrect: first deposit lost + + // Without mutex produces incorrect result + // 000. b reads 0 + // 025. a reads 0 + // 050. b writes 26 + // 075. a writes 42 + account.reset(); + await Future.wait([ + account.depositUnsafe(42, 25, 50), // result overwrites second deposit + account.depositUnsafe(26, 0, 50) + ]); + expect(account.balance, equals(42)); // incorrect: second deposit lost + }); + + test('with mutex', () async { +// Test correct results are produced with mutex + + // With mutex produces correct result + // 000. a acquires lock + // 000. a reads 0 + // 025. b is blocked + // 050. a writes 42 + // 050. a releases lock + // 050. b acquires lock + // 050. b reads 42 + // 100. b writes 68 + account.reset(); + await Future.wait([ + account.depositWithMutex(42, 0, 50), + account.depositWithMutex(26, 25, 50) + ]); + expect(account.balance, equals(correctBalance)); + + // With mutex produces correct result + // 000. b acquires lock + // 000. b reads 0 + // 025. a is blocked + // 050. b writes 26 + // 050. b releases lock + // 050. a acquires lock + // 050. a reads 26 + // 100. a writes 68 + account.reset(); + await Future.wait([ + account.depositWithMutex(42, 25, 50), + account.depositWithMutex(26, 0, 50) + ]); + expect(account.balance, equals(correctBalance)); + }); + + test('multiple acquires are serialized', () async { + // Demonstrate that sections running in a mutex are effectively serialized + const delay = 200; // milliseconds + account.reset(); + await Future.wait([ + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + account.depositWithMutex(1, 0, delay), + ]); + expect(account.balance, equals(10)); + }); + + group('protect', () { + test('lock obtained and released on success', () async { + // This is the normal scenario of the critical section running + // successfully. The lock is acquired before running the critical + // section, and it is released after it runs (and will remain + // unlocked after the _protect_ method returns). + + final m = Mutex(); + + await m.protect(() async { + // critical section: returns Future + expect(m.isLocked, isTrue); + }); + + expect(m.isLocked, isFalse); + }); + + test('value returned from critical section', () async { + // These are the normal scenario of the critical section running + // successfully. It tests different return types from the + // critical section. + + final m = Mutex(); + + // returns Future + await m.protect(() async {}); + + // returns Future + final number = await m.protect(() async => 42); + expect(number, equals(42)); + + // returns Future completes with value + final optionalNumber = await m.protect(() async => 1024); + expect(optionalNumber, equals(1024)); + + // returns Future completes with null + final optionalNumberNull = await m.protect(() async => null); + expect(optionalNumberNull, isNull); + + // returns Future + final word = await m.protect(() async => 'foobar'); + expect(word, equals('foobar')); + + // returns Future completes with value + final optionalWord = await m.protect(() async => 'baz'); + expect(optionalWord, equals('baz')); + + // returns Future completes with null + final optionalWordNull = await m.protect(() async => null); + expect(optionalWordNull, isNull); + + expect(m.isLocked, isFalse); + }); + + test('exception in synchronous code', () async { + // Tests what happens when an exception is raised in the **synchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. Even though the exception is synchronously + // raised by the critical section, it won't be thrown when _protect_ + // is invoked. The _protect_ method always successfully returns a + // _Future_. + + Future criticalSection() { + final c = Completer()..complete(42); + + // synchronous exception + throw const FormatException('synchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + try { + // ignore: unused_local_variable + final resultFuture = criticalSection(); + fail('critical section did not throw synchronous exception'); + } on FormatException { + // expected: invoking the criticalSection results in the exception + } + + final m = Mutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protect(criticalSection); + expect(resultFuture, isA()); + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('synchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + + test('exception in asynchronous code', () async { + // Tests what happens when an exception is raised in the **asynchronous** + // part of the critical section. + // + // Locks are correctly managed: the lock is obtained before executing + // the critical section, and is released when the exception is thrown + // by the _protect_ method. + // + // The exception is raised when waiting for the Future returned by + // _protect_ to complete. + + Future criticalSection() async { + final c = Completer()..complete(42); + + await Future.delayed(const Duration(seconds: 1), () {}); + + // asynchronous exception (since it must wait for the above line) + throw const FormatException('asynchronous exception'); + // ignore: dead_code + return c.future; + } + + // Check the criticalSection behaves as expected for the test + + final resultFuture = criticalSection(); + expect(resultFuture, isA()); + // invoking the criticalSection does not result in the exception + try { + await resultFuture; + fail('critical section did not throw asynchronous exception'); + } on FormatException { + // expected: exception happens on the await + } + + final m = Mutex(); + + try { + // Invoke protect to get the Future (this should succeed) + final resultFuture = m.protect(criticalSection); + expect(resultFuture, isA()); + + // Even though the criticalSection throws the exception in synchronous + // code, protect causes it to become an asynchronous exception. + + // Wait for the Future (this should fail) + final result = await resultFuture; + expect(result, isNotNull); + fail('exception not thrown'); + } on FormatException catch (e) { + expect(m.isLocked, isFalse); + expect(e.message, equals('asynchronous exception')); + } + + expect(m.isLocked, isFalse); + }); + }); +} diff --git a/optional/LICENSE b/optional/LICENSE new file mode 100644 index 0000000..de74683 --- /dev/null +++ b/optional/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014, Juan Antonio Ramírez +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/optional/lib/optional.dart b/optional/lib/optional.dart new file mode 100644 index 0000000..321da3c --- /dev/null +++ b/optional/lib/optional.dart @@ -0,0 +1,10 @@ +/// An implementation of the Optional type. +library optional; + +export 'optional_internal.dart' + show + Optional, + OptionalExtension, + OptionalIterableExtension, + NoValuePresentError, + empty; diff --git a/optional/lib/optional_internal.dart b/optional/lib/optional_internal.dart new file mode 100644 index 0000000..03b1e8e --- /dev/null +++ b/optional/lib/optional_internal.dart @@ -0,0 +1,98 @@ +library optional_internal; + +import 'dart:async'; +import 'package:collection/collection.dart'; + +part 'src/absent.dart'; +part 'src/present.dart'; +part 'src/novaluepresent.dart'; +part 'src/extension.dart'; + +/// A constant, absent Optional. +const Optional empty = _Absent(); + +/// A container object which may contain a non-null value. +/// +/// Offers several methods which depend on the presence or absence of a contained value. +abstract class Optional implements Iterable { + /// Creates a new Optional with the given non-null value. + /// + /// Throws [ArgumentError] if value is null. + factory Optional.of(T value) { + if (value == null) { + throw ArgumentError('value must be non-null'); + } else { + return _Present(value); + } + } + + /// Creates a new Optional with the given value, if non-null. Otherwise, returns an empty Optional. + factory Optional.ofNullable(T? value) { + if (value == null) { + return empty.cast(); + } else { + return _Present(value); + } + } + + /// Creates an empty Optional. + const factory Optional.empty() = _Absent._internal; + + /// The value associated with this Optional, if any. + /// + /// Throws [NoValuePresentError] if no value is present. + T get value; + + /// Whether the Optional has a value. + bool get isPresent; + + /// Returns an Optional with this Optional's value, if there is a value present and it matches the predicate. Otherwise, returns an empty Optional. + Optional filter(bool Function(T) predicate); + + /// Returns an Optional provided by applying the mapper to this Optional's value, if present. Otherwise, returns an empty Optional. + Optional flatMap(Optional Function(T) mapper); + + /// Returns an Optional containing the result of applying the mapper to this Optional's value, if present. Otherwise, returns an empty Optional. + /// + /// If the mapper returns a null value, returns an empty Optional. + @override + Optional map(R Function(T) mapper); + + /// Returns this Optional's value, if present. Otherwise, returns other. + T orElse(T other); + + /// Returns this Optional's value, if present, as nullable. Otherwise, returns other. + T? orElseNullable(T? other); + + /// Returns this Optional's value, if present, as nullable. Otherwise, returns null. + T? get orElseNull; + + /// Returns this Optional's value, if present. Otherwise, returns the result of calling supply(). + T orElseGet(T Function() supply); + + /// Returns this Optional's value, if present, as nullable. Otherwise, returns the result of calling supply(). + T? orElseGetNullable(T? Function() supply); + + /// Returns this Optional's value, if present. Otherwise, returns the result of calling supply() asynchronously. + Future orElseGetAsync(Future Function() supply); + + /// Returns this Optional's value, if present, as nullable. Otherwise, returns the result of calling supply() asynchronously. + Future orElseGetNullableAsync(Future Function() supply); + + /// Returns this Optional's value, if present. Otherwise, throws the result of calling supplyError(). + T orElseThrow(Object Function() supplyError); + + /// Invokes consume() with this Optional's value, if present. Otherwise, if orElse is passed, invokes it, otherwise does nothing. + void ifPresent(void Function(T) consume, {void Function() orElse}); + + /// The hashCode of this Optional's value, if present. Otherwise, 0. + @override + int get hashCode; + + @override + bool operator ==(Object other); + + /// Returns a view of this Optional as an Optional with an [R] value + @override + Optional cast(); +} diff --git a/optional/lib/src/absent.dart b/optional/lib/src/absent.dart new file mode 100644 index 0000000..dce71e4 --- /dev/null +++ b/optional/lib/src/absent.dart @@ -0,0 +1,78 @@ +part of optional_internal; + +class _Absent extends Iterable implements Optional { + const _Absent(); + + const _Absent._internal(); + + @override + T get value => throw NoValuePresentError(); + + @override + int get length => 0; + + @override + bool get isPresent => false; + + @override + Optional filter(bool Function(T) predicate) => empty.cast(); + + @override + Optional flatMap(Optional Function(T) mapper) => empty.cast(); + + @override + Optional map(R Function(T) mapper) => empty.cast(); + + @override + bool contains(Object? val) => false; + + @override + T orElse(T other) => other; + + @override + T? orElseNullable(T? other) => other; + + @override + T? get orElseNull => null; + + @override + T orElseGet(T Function() supply) => supply(); + + @override + T? orElseGetNullable(T? Function() supply) => supply(); + + @override + Future orElseGetAsync(Future Function() supply) => supply(); + + @override + Future orElseGetNullableAsync(Future Function() supply) async => + supply(); + + @override + T orElseThrow(Object Function() supplyError) => throw supplyError(); + + @override + void ifPresent(void Function(T) consume, {void Function()? orElse}) => + orElse == null ? null : orElse(); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => other is _Absent; + + @override + String toString() => 'Optional[empty]'; + + @override + Optional cast() => _Absent(); + + @override + bool get isEmpty => true; + + @override + bool get isNotEmpty => false; + + @override + Iterator get iterator => UnmodifiableSetView.empty().iterator; +} diff --git a/optional/lib/src/extension.dart b/optional/lib/src/extension.dart new file mode 100644 index 0000000..5dce547 --- /dev/null +++ b/optional/lib/src/extension.dart @@ -0,0 +1,125 @@ +part of optional_internal; + +extension OptionalExtension on T { + /// Returns an Optional with `this` as its value + Optional get toOptional => Optional.of(this); +} + +/// Extensions that apply to all iterables. +extension OptionalIterableExtension on Iterable { + /// The first element satisfying [test], or `Optional.empty()` if there are none. + Optional firstWhereOptional(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return Optional.of(element); + } + return Optional.empty(); + } + + /// The first element whose value and index satisfies [test]. + /// + /// Returns `Optional.empty()` if there are no element and index satisfying [test]. + Optional firstWhereIndexedOptional( + bool Function(int index, T element) test) { + var index = 0; + for (var element in this) { + if (test(index++, element)) return Optional.of(element); + } + return Optional.empty(); + } + + /// The first element, or `Optional.empty()` if the iterable is empty. + Optional get firstOptional { + var iterator = this.iterator; + if (iterator.moveNext()) return Optional.of(iterator.current); + return Optional.empty(); + } + + /// The last element satisfying [test], or `Optional.empty()` if there are none. + Optional lastWhereOptional(bool Function(T element) test) { + T? result; + for (var element in this) { + if (test(element)) result = element; + } + return Optional.ofNullable(result); + } + + /// The last element whose index and value satisfies [test]. + /// + /// Returns `Optional.empty()` if no element and index satisfies [test]. + Optional lastWhereIndexedOptional( + bool Function(int index, T element) test) { + T? result; + var index = 0; + for (var element in this) { + if (test(index++, element)) result = element; + } + return Optional.ofNullable(result); + } + + /// The last element, or `Optional.empty()` if the iterable is empty. + Optional get lastOptional { + if (isEmpty) return Optional.empty(); + return Optional.of(last); + } + + /// The single element satisfying [test]. + /// + /// Returns `Optional.empty()` if there are either no elements + /// or more than one element satisfying [test]. + /// + /// **Notice**: This behavior differs from [Iterable.singleWhere] + /// which always throws if there are more than one match, + /// and only calls the `orElse` function on zero matchs. + Optional singleWhereOptional(bool Function(T element) test) { + T? result; + var found = false; + for (var element in this) { + if (test(element)) { + if (!found) { + result = element; + found = true; + } else { + return Optional.empty(); + } + } + } + return Optional.ofNullable(result); + } + + /// The single element satisfying [test]. + /// + /// Returns `Optional.empty()` if there are either none + /// or more than one element and index satisfying [test]. + Optional singleWhereIndexedOptional( + bool Function(int index, T element) test) { + T? result; + var found = false; + var index = 0; + for (var element in this) { + if (test(index++, element)) { + if (!found) { + result = element; + found = true; + } else { + return Optional.empty(); + } + } + } + return Optional.ofNullable(result); + } + + /// The single element of the iterable, or `Optional.empty()`. + /// + /// The value is `Optional.empty()` if the iterable is empty + /// or it contains more than one element. + Optional get singleOptional { + var iterator = this.iterator; + if (iterator.moveNext()) { + var result = iterator.current; + if (!iterator.moveNext()) { + return Optional.of(result); + } + } + return Optional.empty(); + } +} diff --git a/optional/lib/src/novaluepresent.dart b/optional/lib/src/novaluepresent.dart new file mode 100644 index 0000000..9030961 --- /dev/null +++ b/optional/lib/src/novaluepresent.dart @@ -0,0 +1,7 @@ +part of optional_internal; + +/// Error thrown when attempting to operate on an empty Optional's value. +class NoValuePresentError extends StateError { + /// Creates a new NoValuePresentError with a message reading "no value present" + NoValuePresentError() : super('no value present'); +} diff --git a/optional/lib/src/present.dart b/optional/lib/src/present.dart new file mode 100644 index 0000000..db39b2c --- /dev/null +++ b/optional/lib/src/present.dart @@ -0,0 +1,85 @@ +part of optional_internal; + +class _Present extends Iterable implements Optional { + const _Present(this._value); + + final T _value; + + @override + T get value => _value; + + @override + int get length => 1; + + @override + bool get isPresent => true; + + @override + Optional filter(bool Function(T) predicate) { + if (predicate(_value)) { + return this; + } else { + return empty.cast(); + } + } + + @override + Optional flatMap(Optional Function(T) mapper) => mapper(_value); + + @override + Optional map(R Function(T) mapper) => + Optional.ofNullable(mapper(_value)); + + @override + bool contains(Object? val) => _value == val; + + @override + T orElse(T other) => _value; + + @override + T? orElseNullable(T? other) => _value; + + @override + T? get orElseNull => _value; + + @override + T orElseGet(T Function() supply) => _value; + + @override + T? orElseGetNullable(T? Function() supply) => _value; + + @override + Future orElseGetAsync(Future Function() supply) async => _value; + + @override + Future orElseGetNullableAsync(Future Function() supply) async => + _value; + + @override + T orElseThrow(Object Function() supplyError) => _value; + + @override + void ifPresent(void Function(T) consume, {void Function()? orElse}) => + consume(_value); + + @override + int get hashCode => _value.hashCode; + + @override + bool operator ==(Object other) => other is _Present && other._value == _value; + + @override + String toString() => 'Optional[value: $_value]'; + + @override + Optional cast() => _Present(value as R); + + @override + bool get isEmpty => false; + + @override + bool get isNotEmpty => true; + + @override + Iterator get iterator => UnmodifiableSetView({_value}).iterator; +} diff --git a/optional/pubspec.yaml b/optional/pubspec.yaml new file mode 100644 index 0000000..605e5b1 --- /dev/null +++ b/optional/pubspec.yaml @@ -0,0 +1,15 @@ +name: optional +version: 6.1.0+1 +description: An implementation of the Optional type, which helps avoid dealing with null references +homepage: https://github.com/tonio-ramirez/optional.dart +repository: https://github.com/tonio-ramirez/optional.dart +environment: + sdk: '>=2.12.0 <3.0.0' +dependencies: + collection: ^1.15.0 +dev_dependencies: + mockito: '>=5.0.0 <6.0.0' + test: ^1.16.5 + pedantic: ^1.11.0 + build_runner: '>=1.10.0 <2.0.0' + coverage: ^1.0.3 diff --git a/optional/test/optional_test.dart b/optional/test/optional_test.dart new file mode 100644 index 0000000..67a324f --- /dev/null +++ b/optional/test/optional_test.dart @@ -0,0 +1,20 @@ +library optional_test; + +import 'package:optional/optional.dart'; +import 'package:test/test.dart'; +import 'package:mockito/mockito.dart'; +import 'dart:async'; + +part 'src/equality.dart'; +part 'src/methods.dart'; +part 'src/extension.dart'; +part 'src/iterable.dart'; +part 'src/async.dart'; + +void main() { + group('Methods', runMethodTests); + group('Equality', runEqualityTests); + group('Extension', runExtensionTests); + group('Iterable', runIterableTests); + group('Async', runAsyncTests); +} diff --git a/optional/test/src/async.dart b/optional/test/src/async.dart new file mode 100644 index 0000000..f5ff543 --- /dev/null +++ b/optional/test/src/async.dart @@ -0,0 +1,68 @@ +part of optional_test; + +void runAsyncTests() { + ChatRepository repository = ChatRepository(); + ChatViewLoader bloc = ChatViewLoader(repository, ChatViewFactory()); + + setUp(() { + repository = ChatRepository(); + bloc = ChatViewLoader(repository, ChatViewFactory()); + }); + + test('creates chat if chat from repo is empty', () async { + repository.returnEmpty = true; + + final view = await bloc.loadOrCreateChat('id'); + + expect(view.fromRepo, false); + }); + test('does not create chat if chat from repo is non-empty', () async { + repository.returnEmpty = false; + + final view = await bloc.loadOrCreateChat('id'); + + expect(view.fromRepo, true); + }); +} + +class ChatViewLoader { + final ChatRepository repository; + final ChatViewFactory chatViewFactory; + + ChatViewLoader(this.repository, this.chatViewFactory); + + Future _createChat(String id) async { + return Chat(false); + } + + Future loadOrCreateChat(String id) async { + final maybeChat = await repository.loadChat(id); + final chat = await maybeChat.orElseGetAsync(() => _createChat(id)); + return chatViewFactory.createView(chat); + } +} + +class ChatRepository { + bool returnEmpty = true; + Future> loadChat(String id) async { + return returnEmpty ? Optional.empty() : Optional.of(Chat(true)); + } +} + +class Chat { + final bool fromRepo; + + Chat(this.fromRepo); +} + +class ChatView { + final bool fromRepo; + + ChatView(this.fromRepo); +} + +class ChatViewFactory { + Future createView(Chat chat) async { + return ChatView(chat.fromRepo); + } +} diff --git a/optional/test/src/equality.dart b/optional/test/src/equality.dart new file mode 100644 index 0000000..0f04331 --- /dev/null +++ b/optional/test/src/equality.dart @@ -0,0 +1,29 @@ +part of optional_test; + +void runEqualityTests() { + group('==', () { + test('two empty dynamic Optionals are equal', () { + expect(const Optional.empty(), + equals(const Optional.empty())); + }); + test('two Optionals with same value are equal', () { + expect(Optional.of(1), equals(Optional.of(1))); + }); + test('two Optionals with different values are not equal', () { + expect(Optional.of(1), isNot(Optional.of(2))); + }); + test('two Optionals with equal values of different types are equal', () { + expect(Optional.of(1), equals(Optional.of(1.0))); + }); + test('an empty Optional is not equal to an Optional with value', () { + expect(Optional.of(1), isNot(const Optional.empty())); + }); + test('two empty Optionals of different types are equal', () { + expect( + const Optional.empty(), equals(const Optional.empty())); + }); + test('two empty Optionals of same type are equal', () { + expect(const Optional.empty(), equals(const Optional.empty())); + }); + }); +} diff --git a/optional/test/src/extension.dart b/optional/test/src/extension.dart new file mode 100644 index 0000000..ee35099 --- /dev/null +++ b/optional/test/src/extension.dart @@ -0,0 +1,107 @@ +part of optional_test; + +void runExtensionTests() { + group('val.toOptional', () { + test('val.toOptional is present', () { + expect(1.toOptional.isPresent, isTrue); + }); + test('val.toOptional == Optional.of(val)', () { + expect(1.toOptional, equals(Optional.of(1))); + }); + }); + group('iterable.firstWhereOptional', () { + test('iterable.firstWhereOptional is present', () { + expect( + [1, 2, 3].firstWhereOptional((v) => v == 3).isPresent, isTrue); + }); + test('iterable.firstWhereOptional is empty', () { + expect([1, 2, 3].firstWhereOptional((v) => v == 4).isEmpty, isTrue); + }); + }); + group('iterable.firstWhereIndexedOptional', () { + test('iterable.firstWhereIndexedOptional is present', () { + expect( + [1, 2, 3].firstWhereIndexedOptional((i, v) => i == 2).isPresent, + isTrue); + }); + test('iterable.firstWhereIndexedOptional is empty', () { + expect([1, 2, 3].firstWhereIndexedOptional((i, v) => i == 4).isEmpty, + isTrue); + }); + }); + group('iterable.firstOptional', () { + test('iterable.firstOptional is present', () { + expect([1, 2, 3].firstOptional.isPresent, isTrue); + }); + test('iterable.firstOptional is empty', () { + expect([].firstOptional.isEmpty, isTrue); + }); + }); + group('iterable.lastWhereOptional', () { + test('iterable.lastWhereOptional is present', () { + expect([1, 2, 3].lastWhereOptional((v) => v == 3).isPresent, isTrue); + }); + test('iterable.lastWhereOptional is empty', () { + expect([1, 2, 3].lastWhereOptional((v) => v == 4).isEmpty, isTrue); + }); + }); + group('iterable.lastWhereIndexedOptional', () { + test('iterable.lastWhereIndexedOptional is present', () { + expect( + [1, 2, 3].lastWhereIndexedOptional((i, v) => i == 2).isPresent, + isTrue); + }); + test('iterable.lastWhereIndexedOptional is empty', () { + expect([1, 2, 3].lastWhereIndexedOptional((i, v) => i == 4).isEmpty, + isTrue); + }); + }); + group('iterable.lastOptional', () { + test('iterable.lastOptional is present', () { + expect([1, 2, 3].lastOptional.isPresent, isTrue); + }); + test('iterable.lastOptional is empty', () { + expect([].lastOptional.isEmpty, isTrue); + }); + }); + group('iterable.singleWhereOptional', () { + test('iterable.singleWhereOptional is present', () { + expect( + [1, 2, 3].singleWhereOptional((v) => v == 2).isPresent, isTrue); + }); + test('iterable.singleWhereOptional is present', () { + expect( + [1, 2, 2, 3].singleWhereOptional((v) => v == 2).isEmpty, isTrue); + }); + test('iterable.singleWhereOptional is empty', () { + expect([1, 2, 3].singleWhereOptional((v) => v == 4).isEmpty, isTrue); + }); + }); + group('iterable.singleWhereIndexedOptional', () { + test('iterable.singleWhereIndexedOptional is present', () { + expect( + [1, 2, 3].singleWhereIndexedOptional((i, v) => i == 2).isPresent, + isTrue); + }); + test('iterable.singleWhereIndexedOptional is present', () { + expect( + [1, 2, 3] + .singleWhereIndexedOptional((i, v) => i == 2 || v == 2) + .isEmpty, + isTrue); + }); + test('iterable.singleWhereIndexedOptional is empty', () { + expect( + [1, 2, 3].singleWhereIndexedOptional((i, v) => i == 4).isEmpty, + isTrue); + }); + }); + group('iterable.singleOptional', () { + test('iterable.singleOptional is present', () { + expect([1].singleOptional.isPresent, isTrue); + }); + test('iterable.singleOptional is empty', () { + expect([1, 2, 3].singleOptional.isEmpty, isTrue); + }); + }); +} diff --git a/optional/test/src/iterable.dart b/optional/test/src/iterable.dart new file mode 100644 index 0000000..db6973a --- /dev/null +++ b/optional/test/src/iterable.dart @@ -0,0 +1,68 @@ +part of optional_test; + +final Matcher _throwsStateError = throwsA(const TypeMatcher()); + +void runIterableTests() { + group('empty', () { + test('iterates 0 times', () { + var count = 0; + for (var _ in empty) { + count++; + } + expect(count, equals(0)); + }); + test('.length == 0', () { + expect(empty.length, equals(0)); + }); + test('.isEmpty == true', () { + expect(empty.isEmpty, isTrue); + }); + test('.isNotEmpty == false', () { + expect(empty.isNotEmpty, isFalse); + }); + test('.first throws', () { + expect(() => empty.first, _throwsStateError); + }); + test('.last throws', () { + expect(() => empty.last, _throwsStateError); + }); + test('.single throws', () { + expect(() => empty.single, _throwsStateError); + }); + }); + + group('present', () { + const value = 'value'; + var optional = Optional.of(value); + test('iterates once', () { + var count = 0; + for (var _ in optional) { + count++; + } + expect(count, equals(1)); + }); + test('iterates over value', () { + for (var val in optional) { + expect(val, equals(value)); + } + }); + test('.length == 1', () { + expect(optional.length, equals(1)); + }); + test('.isEmpty == false', () { + expect(optional.isEmpty, isFalse); + }); + test('.isNotEmpty == false', () { + expect(optional.isNotEmpty, isTrue); + }); + test('.first returns value', () { + expect(optional.first, equals(value)); + }); + test('.last returns value', () { + expect(optional.last, equals(value)); + }); + test('.single returns value', () { + expect(optional.single, equals(value)); + }); + }); +} diff --git a/optional/test/src/methods.dart b/optional/test/src/methods.dart new file mode 100644 index 0000000..0086637 --- /dev/null +++ b/optional/test/src/methods.dart @@ -0,0 +1,286 @@ +part of optional_test; + +final Matcher _throwsNoSuchElementError = + throwsA(const TypeMatcher()); + +class Consumer { + void call(T? value) {} +} + +class Method { + void call() {} +} + +class MockConsumer extends Mock implements Consumer {} + +class MockMethod extends Mock implements Method {} + +void runMethodTests() { + group('constructor', () { + test('new Optional.of() returns normally', () { + expect(() => Optional.of(1), returnsNormally); + }); + test('new Optional.of(null) throws', () { + expect(() => Optional.of(null), throwsArgumentError); + }); + test('new Optional.ofNullable() never throws', () { + expect(() => Optional.ofNullable(null), returnsNormally); + expect(() => Optional.ofNullable(1), returnsNormally); + }); + test('new Optional.empty() does not throw', () { + expect(() => const Optional.empty(), returnsNormally); + }); + }); + group('isPresent', () { + test('when empty is false', () { + expect(const Optional.empty().isPresent, isFalse); + }); + test('when ofNullable(null) is false', () { + expect(Optional.ofNullable(null).isPresent, isFalse); + }); + test('when ofNullable() is true', () { + expect(Optional.ofNullable(1).isPresent, isTrue); + }); + test('when of(value) is true', () { + expect(Optional.of(1).isPresent, isTrue); + }); + }); + group('value', () { + test('when empty throws', () { + expect(() => const Optional.empty().value, + _throwsNoSuchElementError); + }); + test('when isPresent returns value', () { + expect(Optional.of(1).value, equals(1)); + }); + }); + group('filter', () { + test('returns empty when non-match', () { + expect(Optional.of(1).filter((n) => n != 1).isPresent, isFalse); + }); + test('returns Optional with same value when match', () { + expect(Optional.of(1).filter((n) => n == 1).isPresent, isTrue); + expect(Optional.of(1).filter((n) => n == 1).value, equals(1)); + }); + test('returns empty when called on empty Optional', () { + expect(Optional.empty().filter((n) => n == 1).isPresent, isFalse); + }); + }); + group('maps', () { + test('flat map when present returns result of map operation', () { + expect(Optional.of(1).flatMap((n) => Optional.of(n + 1)), + equals(Optional.of(2))); + }); + test('flat map when empty returns empty', () { + expect(const Optional.empty().flatMap((n) => Optional.of(n + 1)), + equals(const Optional.empty())); + }); + test('map when present returns new Optional of result of map operation', + () { + expect(Optional.of(1).map((n) => n + 1), equals(Optional.of(2))); + }); + test('map when empty returns empty', () { + expect(const Optional.empty().map((n) => n + 1), + equals(const Optional.empty())); + }); + test('map when generic type changes', () { + final o = Optional.ofNullable(null).map((i) => 'i=$i'); + expect(o, equals(const Optional.empty())); + }); + + test('map empty optional and then use orElse', () { + final o = const Optional.empty().map((i) => 'i=$i').orElse(''); + expect(o, equals('')); + }); + + test('map not empty optional and then use orElse', () { + final o = Optional.of(5).map((i) => 'i=$i').orElse(''); + expect(o, equals('i=5')); + }); + }); + + group('contains', () { + test('contains(val) returns false when empty', () { + expect(const Optional.empty().contains(3), isFalse); + }); + test('contains(val) returns false when other value present', () { + expect(Optional.of(1).contains(3), isFalse); + }); + test('contains(val) returns true when same value present', () { + expect(Optional.of(3).contains(3), isTrue); + }); + }); + + group('or', () { + test('orElse(val) returns val when empty', () { + expect(const Optional.empty().orElse(2), equals(2)); + }); + test('orElse(val) returns value when present', () { + expect(Optional.of(1).orElse(2), equals(1)); + }); + test('orElseNullable(val) returns val when empty', () { + expect(const Optional.empty().orElseNullable(2), equals(2)); + }); + test('orElseNullable(val) returns value when present', () { + expect(Optional.of(1).orElseNullable(2), equals(1)); + }); + test('orElseNullable(null) returns null when empty', () { + expect(const Optional.empty().orElseNullable(null), isNull); + }); + test('orElseNull returns null when empty', () { + expect(Optional.empty().orElseNull, isNull); + }); + test('orElseNull returns value when present', () { + expect(Optional.of(1).orElseNull, equals(1)); + }); + test('orElseGet(f) returns f() when empty', () { + expect(const Optional.empty().orElseGet(() => 2), equals(2)); + }); + test('orElseGet(f) returns value when present', () { + expect(Optional.of(1).orElseGet(() => 2), equals(1)); + }); + test('orElseGetNullable(f) returns f() when empty', () { + expect(const Optional.empty().orElseGetNullable(() => 2), equals(2)); + }); + test('orElseGetNullable(f) returns value when present', () { + expect(Optional.of(1).orElseGetNullable(() => 2), equals(1)); + }); + test('orElseGetNullable(f) returns null when empty and f() == null', () { + expect(const Optional.empty().orElseGetNullable(() => null), isNull); + }); + test('orElseThrow(f) throws f() when empty', () { + expect(() => const Optional.empty().orElseThrow(() => 'exception'), + throwsA('exception')); + }); + test('orElseThrow(f) returns value when present', () { + expect(Optional.of(1).orElseThrow(() => 'exception'), equals(1)); + }); + test('orElse(val) of ofNullable(null) returns value', () { + expect(Optional.ofNullable(null).orElse(1), equals(1)); + }); + test('orElseGetAsync(f) returns value when present', () async { + expect(await Optional.of(1).orElseGetAsync(() async => 2), equals(1)); + }); + test('orElseGetAsync(f) returns f() when empty', () async { + expect( + await Optional.empty().orElseGetAsync(() async => 2), equals(2)); + }); + test('orElseGetNullableAsync(f) returns value when present', () async { + expect(await Optional.of(1).orElseGetNullableAsync(() async => 2), + equals(1)); + }); + test('orElseGetNullableAsync(f) returns f() when empty', () { + expect(Optional.empty().orElseGetNullableAsync(() async => 2), + completion(equals(2))); + }); + test('orElseGetNullableAsync(f) returns null when empty and f() == null', + () { + expect(Optional.empty().orElseGetNullableAsync(() async => null), + completion(isNull)); + }); + }); + group('ifPresent', () { + final consumer = MockConsumer(); + final orElse = MockMethod(); + + void callConsumer(int i) => consumer.call(i); + void callOrElse() => orElse.call(); + + tearDown(() { + clearInteractions(consumer); + clearInteractions(orElse); + }); + + test('calls consumer when present', () { + expect(() => Optional.of(1).ifPresent(callConsumer), returnsNormally); + verify(consumer.call(1)).called(1); + }); + test('does not call orElse when present', () { + expect(() => Optional.of(1).ifPresent(callConsumer, orElse: callOrElse), + returnsNormally); + verifyNever(orElse.call()); + }); + test('does not call consumer when empty', () { + expect(() => const Optional.empty().ifPresent(callConsumer), + returnsNormally); + verifyNever(consumer.call(any)); + }); + test('calls orElse when empty', () { + expect( + () => const Optional.empty() + .ifPresent(callConsumer, orElse: callOrElse), + returnsNormally); + verify(orElse.call()).called(1); + }); + }); + + group('toSet', () { + test('returns empty set when empty', () { + expect(const Optional.empty().toSet().isEmpty, isTrue); + }); + test('returns set with value when present', () { + expect(Optional.of(1).toSet().contains(1), isTrue); + }); + test('returns set with one value when present', () { + expect(Optional.of(1).toSet().length, equals(1)); + }); + }); + + group('toList', () { + test('returns empty list when empty', () { + expect(const Optional.empty().toList().isEmpty, isTrue); + }); + test('returns list with value when present', () { + expect(Optional.of(1).toList().contains(1), isTrue); + }); + test('returns list with one value when present', () { + expect(Optional.of(1).toList().length, equals(1)); + }); + }); + + group('hashCode', () { + test('is 0 when empty', () { + expect(const Optional.empty().hashCode, equals(0)); + }); + test("is equal to value's hash code when present", () { + expect(Optional.of(1).hashCode, equals(1.hashCode)); + }); + }); + group('cast', () { + test('is not required to upcast', () { + expect(Optional.of(1), const TypeMatcher>()); + }); + test('is required to downcast', () { + expect(Optional.of(1), isNot(const TypeMatcher>())); + }); + test('casts internal value', () { + expect( + Optional.of(1).cast(), const TypeMatcher>()); + }); + test('casts empty value', () { + expect(const Optional.empty().cast(), + const TypeMatcher>()); + }); + test('preseves equality', () { + final num1 = Optional.of(1); + expect(num1, equals(num1.cast())); + }); + }); + group('cast.orElse', () { + test('cast empty Optional, then orElse, returns else', () { + expect( + const Optional.empty().cast().orElse('a'), equals('a')); + }); + test('cast present Optional, then orElse, returns value', () { + expect(Optional.of(1).cast().orElse(2), equals(1)); + }); + }); + group('toString', () { + test('of value returns "Optional[value: \$value]"', () { + expect(Optional.of('hello').toString(), equals('Optional[value: hello]')); + }); + test('of empty returns "Optional[empty]"', () { + expect(Optional.empty().toString(), equals('Optional[empty]')); + }); + }); +} diff --git a/photo_view/LICENSE b/photo_view/LICENSE new file mode 100644 index 0000000..f6e9c67 --- /dev/null +++ b/photo_view/LICENSE @@ -0,0 +1,7 @@ +Copyright 2024 Renan C. Araújo + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/photo_view/lib/photo_view.dart b/photo_view/lib/photo_view.dart new file mode 100644 index 0000000..269f8cf --- /dev/null +++ b/photo_view/lib/photo_view.dart @@ -0,0 +1,623 @@ +library photo_view; + +import 'package:flutter/material.dart'; + +import 'package:photo_view/src/controller/photo_view_controller.dart'; +import 'package:photo_view/src/controller/photo_view_scalestate_controller.dart'; +import 'package:photo_view/src/core/photo_view_core.dart'; +import 'package:photo_view/src/photo_view_computed_scale.dart'; +import 'package:photo_view/src/photo_view_scale_state.dart'; +import 'package:photo_view/src/photo_view_wrappers.dart'; +import 'package:photo_view/src/utils/photo_view_hero_attributes.dart'; + +export 'src/controller/photo_view_controller.dart'; +export 'src/controller/photo_view_scalestate_controller.dart'; +export 'src/core/photo_view_gesture_detector.dart' + show PhotoViewGestureDetectorScope; +export 'src/photo_view_computed_scale.dart'; +export 'src/photo_view_scale_state.dart'; +export 'src/utils/photo_view_hero_attributes.dart'; + +/// A [StatefulWidget] that contains all the photo view rendering elements. +/// +/// Sample code to use within an image: +/// +/// ``` +/// PhotoView( +/// imageProvider: imageProvider, +/// loadingBuilder: (context, progress) => Center( +/// child: Container( +/// width: 20.0, +/// height: 20.0, +/// child: CircularProgressIndicator( +/// value: _progress == null +/// ? null +/// : _progress.cumulativeBytesLoaded / +/// _progress.expectedTotalBytes, +/// ), +/// ), +/// ), +/// backgroundDecoration: BoxDecoration(color: Colors.black), +/// semanticLabel: 'Some label', +/// gaplessPlayback: false, +/// customSize: MediaQuery.of(context).size, +/// heroAttributes: const HeroAttributes( +/// tag: "someTag", +/// transitionOnUserGestures: true, +/// ), +/// scaleStateChangedCallback: this.onScaleStateChanged, +/// enableRotation: true, +/// controller: controller, +/// minScale: PhotoViewComputedScale.contained * 0.8, +/// maxScale: PhotoViewComputedScale.covered * 1.8, +/// initialScale: PhotoViewComputedScale.contained, +/// basePosition: Alignment.center, +/// scaleStateCycle: scaleStateCycle +/// ); +/// ``` +/// +/// You can customize to show an custom child instead of an image: +/// +/// ``` +/// PhotoView.customChild( +/// child: Container( +/// width: 220.0, +/// height: 250.0, +/// child: const Text( +/// "Hello there, this is a text", +/// ) +/// ), +/// childSize: const Size(220.0, 250.0), +/// backgroundDecoration: BoxDecoration(color: Colors.black), +/// semanticLabel: 'Some label', +/// gaplessPlayback: false, +/// customSize: MediaQuery.of(context).size, +/// heroAttributes: const HeroAttributes( +/// tag: "someTag", +/// transitionOnUserGestures: true, +/// ), +/// scaleStateChangedCallback: this.onScaleStateChanged, +/// enableRotation: true, +/// controller: controller, +/// minScale: PhotoViewComputedScale.contained * 0.8, +/// maxScale: PhotoViewComputedScale.covered * 1.8, +/// initialScale: PhotoViewComputedScale.contained, +/// basePosition: Alignment.center, +/// scaleStateCycle: scaleStateCycle +/// ); +/// ``` +/// The [maxScale], [minScale] and [initialScale] options may be [double] or a [PhotoViewComputedScale] constant +/// +/// Sample using [maxScale], [minScale] and [initialScale] +/// +/// ``` +/// PhotoView( +/// imageProvider: imageProvider, +/// minScale: PhotoViewComputedScale.contained * 0.8, +/// maxScale: PhotoViewComputedScale.covered * 1.8, +/// initialScale: PhotoViewComputedScale.contained * 1.1, +/// ); +/// ``` +/// +/// [customSize] is used to define the viewPort size in which the image will be +/// scaled to. This argument is rarely used. By default is the size that this widget assumes. +/// +/// The argument [gaplessPlayback] is used to continue showing the old image +/// (`true`), or briefly show nothing (`false`), when the [imageProvider] +/// changes.By default it's set to `false`. +/// +/// To use within an hero animation, specify [heroAttributes]. When +/// [heroAttributes] is specified, the image provider retrieval process should +/// be sync. +/// +/// Sample using hero animation: +/// ``` +/// // screen1 +/// ... +/// Hero( +/// tag: "someTag", +/// child: Image.asset( +/// "assets/large-image.jpg", +/// width: 150.0 +/// ), +/// ) +/// // screen2 +/// ... +/// child: PhotoView( +/// imageProvider: AssetImage("assets/large-image.jpg"), +/// heroAttributes: const HeroAttributes(tag: "someTag"), +/// ) +/// ``` +/// +/// **Note: If you don't want to the zoomed image do not overlaps the size of the container, use [ClipRect](https://docs.flutter.io/flutter/widgets/ClipRect-class.html)** +/// +/// ## Controllers +/// +/// Controllers, when specified to PhotoView widget, enables the author(you) to listen for state updates through a `Stream` and change those values externally. +/// +/// While [PhotoViewScaleStateController] is only responsible for the `scaleState`, [PhotoViewController] is responsible for all fields os [PhotoViewControllerValue]. +/// +/// To use them, pass a instance of those items on [controller] or [scaleStateController]; +/// +/// Since those follows the standard controller pattern found in widgets like [PageView] and [ScrollView], whoever instantiates it, should [dispose] it afterwards. +/// +/// Example of [controller] usage, only listening for state changes: +/// +/// ``` +/// class _ExampleWidgetState extends State { +/// +/// PhotoViewController controller; +/// double scaleCopy; +/// +/// @override +/// void initState() { +/// super.initState(); +/// controller = PhotoViewController() +/// ..outputStateStream.listen(listener); +/// } +/// +/// @override +/// void dispose() { +/// controller.dispose(); +/// super.dispose(); +/// } +/// +/// void listener(PhotoViewControllerValue value){ +/// setState((){ +/// scaleCopy = value.scale; +/// }) +/// } +/// +/// @override +/// Widget build(BuildContext context) { +/// return Stack( +/// children: [ +/// Positioned.fill( +/// child: PhotoView( +/// imageProvider: AssetImage("assets/pudim.png"), +/// controller: controller, +/// ); +/// ), +/// Text("Scale applied: $scaleCopy") +/// ], +/// ); +/// } +/// } +/// ``` +/// +/// An example of [scaleStateController] with state changes: +/// ``` +/// class _ExampleWidgetState extends State { +/// +/// PhotoViewScaleStateController scaleStateController; +/// +/// @override +/// void initState() { +/// super.initState(); +/// scaleStateController = PhotoViewScaleStateController(); +/// } +/// +/// @override +/// void dispose() { +/// scaleStateController.dispose(); +/// super.dispose(); +/// } +/// +/// void goBack(){ +/// scaleStateController.scaleState = PhotoViewScaleState.originalSize; +/// } +/// +/// @override +/// Widget build(BuildContext context) { +/// return Stack( +/// children: [ +/// Positioned.fill( +/// child: PhotoView( +/// imageProvider: AssetImage("assets/pudim.png"), +/// scaleStateController: scaleStateController, +/// ); +/// ), +/// FlatButton( +/// child: Text("Go to original size"), +/// onPressed: goBack, +/// ); +/// ], +/// ); +/// } +/// } +/// ``` +/// +class PhotoView extends StatefulWidget { + /// Creates a widget that displays a zoomable image. + /// + /// To show an image from the network or from an asset bundle, use their respective + /// image providers, ie: [AssetImage] or [NetworkImage] + /// + /// Internally, the image is rendered within an [Image] widget. + PhotoView({ + Key? key, + required this.imageProvider, + this.loadingBuilder, + this.backgroundDecoration, + this.wantKeepAlive = false, + this.semanticLabel, + this.gaplessPlayback = false, + this.heroAttributes, + this.scaleStateChangedCallback, + this.enableRotation = false, + this.controller, + this.scaleStateController, + this.maxScale, + this.minScale, + this.initialScale, + this.basePosition, + this.scaleStateCycle, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + this.customSize, + this.gestureDetectorBehavior, + this.tightMode, + this.filterQuality, + this.disableGestures, + this.errorBuilder, + this.enablePanAlways, + this.strictScale, + }) : child = null, + childSize = null, + super(key: key); + + /// Creates a widget that displays a zoomable child. + /// + /// It has been created to resemble [PhotoView] behavior within widgets that aren't an image, such as [Container], [Text] or a svg. + /// + /// Instead of a [imageProvider], this constructor will receive a [child] and a [childSize]. + /// + PhotoView.customChild({ + Key? key, + required this.child, + this.childSize, + this.backgroundDecoration, + this.wantKeepAlive = false, + this.heroAttributes, + this.scaleStateChangedCallback, + this.enableRotation = false, + this.controller, + this.scaleStateController, + this.maxScale, + this.minScale, + this.initialScale, + this.basePosition, + this.scaleStateCycle, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + this.customSize, + this.gestureDetectorBehavior, + this.tightMode, + this.filterQuality, + this.disableGestures, + this.enablePanAlways, + this.strictScale, + }) : errorBuilder = null, + imageProvider = null, + semanticLabel = null, + gaplessPlayback = false, + loadingBuilder = null, + super(key: key); + + /// Given a [imageProvider] it resolves into an zoomable image widget using. It + /// is required + final ImageProvider? imageProvider; + + /// While [imageProvider] is not resolved, [loadingBuilder] is called by [PhotoView] + /// into the screen, by default it is a centered [CircularProgressIndicator] + final LoadingBuilder? loadingBuilder; + + /// Show loadFailedChild when the image failed to load + final ImageErrorWidgetBuilder? errorBuilder; + + /// Changes the background behind image, defaults to `Colors.black`. + final BoxDecoration? backgroundDecoration; + + /// This is used to keep the state of an image in the gallery (e.g. scale state). + /// `false` -> resets the state (default) + /// `true` -> keeps the state + final bool wantKeepAlive; + + /// A Semantic description of the image. + /// + /// Used to provide a description of the image to TalkBack on Android, and VoiceOver on iOS. + final String? semanticLabel; + + /// This is used to continue showing the old image (`true`), or briefly show + /// nothing (`false`), when the `imageProvider` changes. By default it's set + /// to `false`. + final bool gaplessPlayback; + + /// Attributes that are going to be passed to [PhotoViewCore]'s + /// [Hero]. Leave this property undefined if you don't want a hero animation. + final PhotoViewHeroAttributes? heroAttributes; + + /// Defines the size of the scaling base of the image inside [PhotoView], + /// by default it is `MediaQuery.of(context).size`. + final Size? customSize; + + /// A [Function] to be called whenever the scaleState changes, this happens when the user double taps the content ou start to pinch-in. + final ValueChanged? scaleStateChangedCallback; + + /// A flag that enables the rotation gesture support + final bool enableRotation; + + /// The specified custom child to be shown instead of a image + final Widget? child; + + /// The size of the custom [child]. [PhotoView] uses this value to compute the relation between the child and the container's size to calculate the scale value. + final Size? childSize; + + /// Defines the maximum size in which the image will be allowed to assume, it + /// is proportional to the original image size. Can be either a double (absolute value) or a + /// [PhotoViewComputedScale], that can be multiplied by a double + final dynamic maxScale; + + /// Defines the minimum size in which the image will be allowed to assume, it + /// is proportional to the original image size. Can be either a double (absolute value) or a + /// [PhotoViewComputedScale], that can be multiplied by a double + final dynamic minScale; + + /// Defines the initial size in which the image will be assume in the mounting of the component, it + /// is proportional to the original image size. Can be either a double (absolute value) or a + /// [PhotoViewComputedScale], that can be multiplied by a double + final dynamic initialScale; + + /// A way to control PhotoView transformation factors externally and listen to its updates + final PhotoViewControllerBase? controller; + + /// A way to control PhotoViewScaleState value externally and listen to its updates + final PhotoViewScaleStateController? scaleStateController; + + /// The alignment of the scale origin in relation to the widget size. Default is [Alignment.center] + final Alignment? basePosition; + + /// Defines de next [PhotoViewScaleState] given the actual one. Default is [defaultScaleStateCycle] + final ScaleStateCycle? scaleStateCycle; + + /// A pointer that will trigger a tap has stopped contacting the screen at a + /// particular location. + final PhotoViewImageTapUpCallback? onTapUp; + + /// A pointer that might cause a tap has contacted the screen at a particular + /// location. + final PhotoViewImageTapDownCallback? onTapDown; + + /// A pointer that will trigger a scale has stopped contacting the screen at a + /// particular location. + final PhotoViewImageScaleEndCallback? onScaleEnd; + + /// [HitTestBehavior] to be passed to the internal gesture detector. + final HitTestBehavior? gestureDetectorBehavior; + + /// Enables tight mode, making background container assume the size of the image/child. + /// Useful when inside a [Dialog] + final bool? tightMode; + + /// Quality levels for image filters. + final FilterQuality? filterQuality; + + // Removes gesture detector if `true`. + // Useful when custom gesture detector is used in child widget. + final bool? disableGestures; + + /// Enable pan the widget even if it's smaller than the hole parent widget. + /// Useful when you want to drag a widget without restrictions. + final bool? enablePanAlways; + + /// Enable strictScale will restrict user scale gesture to the maxScale and minScale values. + final bool? strictScale; + + bool get _isCustomChild { + return child != null; + } + + @override + State createState() { + return _PhotoViewState(); + } +} + +class _PhotoViewState extends State + with AutomaticKeepAliveClientMixin { + // image retrieval + + // controller + late bool _controlledController; + late PhotoViewControllerBase _controller; + late bool _controlledScaleStateController; + late PhotoViewScaleStateController _scaleStateController; + + @override + void initState() { + super.initState(); + + if (widget.controller == null) { + _controlledController = true; + _controller = PhotoViewController(); + } else { + _controlledController = false; + _controller = widget.controller!; + } + + if (widget.scaleStateController == null) { + _controlledScaleStateController = true; + _scaleStateController = PhotoViewScaleStateController(); + } else { + _controlledScaleStateController = false; + _scaleStateController = widget.scaleStateController!; + } + + _scaleStateController.outputScaleStateStream.listen(scaleStateListener); + } + + @override + void didUpdateWidget(PhotoView oldWidget) { + if (widget.controller == null) { + if (!_controlledController) { + _controlledController = true; + _controller = PhotoViewController(); + } + } else { + _controlledController = false; + _controller = widget.controller!; + } + + if (widget.scaleStateController == null) { + if (!_controlledScaleStateController) { + _controlledScaleStateController = true; + _scaleStateController = PhotoViewScaleStateController(); + } + } else { + _controlledScaleStateController = false; + _scaleStateController = widget.scaleStateController!; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + if (_controlledController) { + _controller.dispose(); + } + if (_controlledScaleStateController) { + _scaleStateController.dispose(); + } + super.dispose(); + } + + void scaleStateListener(PhotoViewScaleState scaleState) { + if (widget.scaleStateChangedCallback != null) { + widget.scaleStateChangedCallback!(_scaleStateController.scaleState); + } + } + + @override + Widget build(BuildContext context) { + super.build(context); + return LayoutBuilder( + builder: ( + BuildContext context, + BoxConstraints constraints, + ) { + final computedOuterSize = widget.customSize ?? constraints.biggest; + final backgroundDecoration = widget.backgroundDecoration ?? + const BoxDecoration(color: Colors.black); + + return widget._isCustomChild + ? CustomChildWrapper( + child: widget.child, + childSize: widget.childSize, + backgroundDecoration: backgroundDecoration, + heroAttributes: widget.heroAttributes, + scaleStateChangedCallback: widget.scaleStateChangedCallback, + enableRotation: widget.enableRotation, + controller: _controller, + scaleStateController: _scaleStateController, + maxScale: widget.maxScale, + minScale: widget.minScale, + initialScale: widget.initialScale, + basePosition: widget.basePosition, + scaleStateCycle: widget.scaleStateCycle, + onTapUp: widget.onTapUp, + onTapDown: widget.onTapDown, + onScaleEnd: widget.onScaleEnd, + outerSize: computedOuterSize, + gestureDetectorBehavior: widget.gestureDetectorBehavior, + tightMode: widget.tightMode, + filterQuality: widget.filterQuality, + disableGestures: widget.disableGestures, + enablePanAlways: widget.enablePanAlways, + strictScale: widget.strictScale, + ) + : ImageWrapper( + imageProvider: widget.imageProvider!, + loadingBuilder: widget.loadingBuilder, + backgroundDecoration: backgroundDecoration, + semanticLabel: widget.semanticLabel, + gaplessPlayback: widget.gaplessPlayback, + heroAttributes: widget.heroAttributes, + scaleStateChangedCallback: widget.scaleStateChangedCallback, + enableRotation: widget.enableRotation, + controller: _controller, + scaleStateController: _scaleStateController, + maxScale: widget.maxScale, + minScale: widget.minScale, + initialScale: widget.initialScale, + basePosition: widget.basePosition, + scaleStateCycle: widget.scaleStateCycle, + onTapUp: widget.onTapUp, + onTapDown: widget.onTapDown, + onScaleEnd: widget.onScaleEnd, + outerSize: computedOuterSize, + gestureDetectorBehavior: widget.gestureDetectorBehavior, + tightMode: widget.tightMode, + filterQuality: widget.filterQuality, + disableGestures: widget.disableGestures, + errorBuilder: widget.errorBuilder, + enablePanAlways: widget.enablePanAlways, + strictScale: widget.strictScale, + ); + }, + ); + } + + @override + bool get wantKeepAlive => widget.wantKeepAlive; +} + +/// The default [ScaleStateCycle] +PhotoViewScaleState defaultScaleStateCycle(PhotoViewScaleState actual) { + switch (actual) { + case PhotoViewScaleState.initial: + return PhotoViewScaleState.covering; + case PhotoViewScaleState.covering: + return PhotoViewScaleState.originalSize; + case PhotoViewScaleState.originalSize: + return PhotoViewScaleState.initial; + case PhotoViewScaleState.zoomedIn: + case PhotoViewScaleState.zoomedOut: + return PhotoViewScaleState.initial; + } +} + +/// A type definition for a [Function] that receives the actual [PhotoViewScaleState] and returns the next one +/// It is used internally to walk in the "doubletap gesture cycle". +/// It is passed to [PhotoView.scaleStateCycle] +typedef ScaleStateCycle = PhotoViewScaleState Function( + PhotoViewScaleState actual, +); + +/// A type definition for a callback when the user taps up the photoview region +typedef PhotoViewImageTapUpCallback = Function( + BuildContext context, + TapUpDetails details, + PhotoViewControllerValue controllerValue, +); + +/// A type definition for a callback when the user taps down the photoview region +typedef PhotoViewImageTapDownCallback = Function( + BuildContext context, + TapDownDetails details, + PhotoViewControllerValue controllerValue, +); + +/// A type definition for a callback when a user finished scale +typedef PhotoViewImageScaleEndCallback = Function( + BuildContext context, + ScaleEndDetails details, + PhotoViewControllerValue controllerValue, +); + +/// A type definition for a callback to show a widget while the image is loading, a [ImageChunkEvent] is passed to inform progress +typedef LoadingBuilder = Widget Function( + BuildContext context, + ImageChunkEvent? event, +); diff --git a/photo_view/lib/photo_view_gallery.dart b/photo_view/lib/photo_view_gallery.dart new file mode 100644 index 0000000..2d16dbf --- /dev/null +++ b/photo_view/lib/photo_view_gallery.dart @@ -0,0 +1,432 @@ +library photo_view_gallery; + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:photo_view/photo_view.dart' + show + LoadingBuilder, + PhotoView, + PhotoViewImageTapDownCallback, + PhotoViewImageTapUpCallback, + PhotoViewImageScaleEndCallback, + ScaleStateCycle; + +import 'package:photo_view/src/controller/photo_view_controller.dart'; +import 'package:photo_view/src/controller/photo_view_scalestate_controller.dart'; +import 'package:photo_view/src/core/photo_view_gesture_detector.dart'; +import 'package:photo_view/src/photo_view_scale_state.dart'; +import 'package:photo_view/src/utils/photo_view_hero_attributes.dart'; + +/// A type definition for a [Function] that receives a index after a page change in [PhotoViewGallery] +typedef PhotoViewGalleryPageChangedCallback = void Function(int index); + +/// A type definition for a [Function] that defines a page in [PhotoViewGallery.build] +typedef PhotoViewGalleryBuilder = PhotoViewGalleryPageOptions Function( + BuildContext context, int index); + +/// A [StatefulWidget] that shows multiple [PhotoView] widgets in a [PageView] +/// +/// Some of [PhotoView] constructor options are passed direct to [PhotoViewGallery] constructor. Those options will affect the gallery in a whole. +/// +/// Some of the options may be defined to each image individually, such as `initialScale` or `PhotoViewHeroAttributes`. Those must be passed via each [PhotoViewGalleryPageOptions]. +/// +/// Example of usage as a list of options: +/// ``` +/// PhotoViewGallery( +/// pageOptions: [ +/// PhotoViewGalleryPageOptions( +/// imageProvider: AssetImage("assets/gallery1.jpg"), +/// heroAttributes: const PhotoViewHeroAttributes(tag: "tag1"), +/// ), +/// PhotoViewGalleryPageOptions( +/// imageProvider: AssetImage("assets/gallery2.jpg"), +/// heroAttributes: const PhotoViewHeroAttributes(tag: "tag2"), +/// maxScale: PhotoViewComputedScale.contained * 0.3 +/// ), +/// PhotoViewGalleryPageOptions( +/// imageProvider: AssetImage("assets/gallery3.jpg"), +/// minScale: PhotoViewComputedScale.contained * 0.8, +/// maxScale: PhotoViewComputedScale.covered * 1.1, +/// heroAttributes: const HeroAttributes(tag: "tag3"), +/// ), +/// ], +/// loadingBuilder: (context, progress) => Center( +/// child: Container( +/// width: 20.0, +/// height: 20.0, +/// child: CircularProgressIndicator( +/// value: _progress == null +/// ? null +/// : _progress.cumulativeBytesLoaded / +/// _progress.expectedTotalBytes, +/// ), +/// ), +/// ), +/// backgroundDecoration: widget.backgroundDecoration, +/// pageController: widget.pageController, +/// onPageChanged: onPageChanged, +/// ) +/// ``` +/// +/// Example of usage with builder pattern: +/// ``` +/// PhotoViewGallery.builder( +/// scrollPhysics: const BouncingScrollPhysics(), +/// builder: (BuildContext context, int index) { +/// return PhotoViewGalleryPageOptions( +/// imageProvider: AssetImage(widget.galleryItems[index].image), +/// initialScale: PhotoViewComputedScale.contained * 0.8, +/// minScale: PhotoViewComputedScale.contained * 0.8, +/// maxScale: PhotoViewComputedScale.covered * 1.1, +/// heroAttributes: HeroAttributes(tag: galleryItems[index].id), +/// ); +/// }, +/// itemCount: galleryItems.length, +/// loadingBuilder: (context, progress) => Center( +/// child: Container( +/// width: 20.0, +/// height: 20.0, +/// child: CircularProgressIndicator( +/// value: _progress == null +/// ? null +/// : _progress.cumulativeBytesLoaded / +/// _progress.expectedTotalBytes, +/// ), +/// ), +/// ), +/// backgroundDecoration: widget.backgroundDecoration, +/// pageController: widget.pageController, +/// onPageChanged: onPageChanged, +/// ) +/// ``` +class PhotoViewGallery extends StatefulWidget { + /// Construct a gallery with static items through a list of [PhotoViewGalleryPageOptions]. + const PhotoViewGallery({ + Key? key, + required this.pageOptions, + this.loadingBuilder, + this.backgroundDecoration, + this.wantKeepAlive = false, + this.gaplessPlayback = false, + this.reverse = false, + this.pageController, + this.onPageChanged, + this.scaleStateChangedCallback, + this.enableRotation = false, + this.scrollPhysics, + this.scrollDirection = Axis.horizontal, + this.customSize, + this.allowImplicitScrolling = false, + this.pageSnapping = true, + }) : itemCount = null, + builder = null, + super(key: key); + + /// Construct a gallery with dynamic items. + /// + /// The builder must return a [PhotoViewGalleryPageOptions]. + const PhotoViewGallery.builder({ + Key? key, + required this.itemCount, + required this.builder, + this.loadingBuilder, + this.backgroundDecoration, + this.wantKeepAlive = false, + this.gaplessPlayback = false, + this.reverse = false, + this.pageController, + this.onPageChanged, + this.scaleStateChangedCallback, + this.enableRotation = false, + this.scrollPhysics, + this.scrollDirection = Axis.horizontal, + this.customSize, + this.allowImplicitScrolling = false, + this.pageSnapping = true, + }) : pageOptions = null, + assert(itemCount != null), + assert(builder != null), + super(key: key); + + /// A list of options to describe the items in the gallery + final List? pageOptions; + + /// The count of items in the gallery, only used when constructed via [PhotoViewGallery.builder] + final int? itemCount; + + /// Called to build items for the gallery when using [PhotoViewGallery.builder] + final PhotoViewGalleryBuilder? builder; + + /// [ScrollPhysics] for the internal [PageView] + final ScrollPhysics? scrollPhysics; + + /// Mirror to [PhotoView.loadingBuilder] + final LoadingBuilder? loadingBuilder; + + /// Mirror to [PhotoView.backgroundDecoration] + final BoxDecoration? backgroundDecoration; + + /// Mirror to [PhotoView.wantKeepAlive] + final bool wantKeepAlive; + + /// Mirror to [PhotoView.gaplessPlayback] + final bool gaplessPlayback; + + /// Mirror to [PageView.reverse] + final bool reverse; + + /// An object that controls the [PageView] inside [PhotoViewGallery] + final PageController? pageController; + + /// An callback to be called on a page change + final PhotoViewGalleryPageChangedCallback? onPageChanged; + + /// Mirror to [PhotoView.scaleStateChangedCallback] + final ValueChanged? scaleStateChangedCallback; + + /// Mirror to [PhotoView.enableRotation] + final bool enableRotation; + + /// Mirror to [PhotoView.customSize] + final Size? customSize; + + /// The axis along which the [PageView] scrolls. Mirror to [PageView.scrollDirection] + final Axis scrollDirection; + + /// When user attempts to move it to the next element, focus will traverse to the next page in the page view. + final bool allowImplicitScrolling; + + final bool pageSnapping; + + bool get _isBuilder => builder != null; + + @override + State createState() { + return _PhotoViewGalleryState(); + } +} + +class _PhotoViewGalleryState extends State { + late final PageController _controller = + widget.pageController ?? PageController(); + + void scaleStateChangedCallback(PhotoViewScaleState scaleState) { + if (widget.scaleStateChangedCallback != null) { + widget.scaleStateChangedCallback!(scaleState); + } + } + + int get actualPage { + return _controller.hasClients ? _controller.page!.floor() : 0; + } + + int get itemCount { + if (widget._isBuilder) { + return widget.itemCount!; + } + return widget.pageOptions!.length; + } + + @override + Widget build(BuildContext context) { + // Enable corner hit test + return PhotoViewGestureDetectorScope( + axis: widget.scrollDirection, + child: PageView.builder( + reverse: widget.reverse, + controller: _controller, + onPageChanged: widget.onPageChanged, + itemCount: itemCount, + itemBuilder: _buildItem, + scrollDirection: widget.scrollDirection, + physics: widget.scrollPhysics, + allowImplicitScrolling: widget.allowImplicitScrolling, + pageSnapping: widget.pageSnapping, + ), + ); + } + + Widget _buildItem(BuildContext context, int index) { + final pageOption = _buildPageOption(context, index); + final isCustomChild = pageOption.child != null; + + final PhotoView photoView = isCustomChild + ? PhotoView.customChild( + key: ObjectKey(index), + child: pageOption.child, + childSize: pageOption.childSize, + backgroundDecoration: widget.backgroundDecoration, + wantKeepAlive: widget.wantKeepAlive, + controller: pageOption.controller, + scaleStateController: pageOption.scaleStateController, + customSize: widget.customSize, + heroAttributes: pageOption.heroAttributes, + scaleStateChangedCallback: scaleStateChangedCallback, + enableRotation: widget.enableRotation, + initialScale: pageOption.initialScale, + minScale: pageOption.minScale, + maxScale: pageOption.maxScale, + scaleStateCycle: pageOption.scaleStateCycle, + onTapUp: pageOption.onTapUp, + onTapDown: pageOption.onTapDown, + onScaleEnd: pageOption.onScaleEnd, + gestureDetectorBehavior: pageOption.gestureDetectorBehavior, + tightMode: pageOption.tightMode, + filterQuality: pageOption.filterQuality, + basePosition: pageOption.basePosition, + disableGestures: pageOption.disableGestures, + ) + : PhotoView( + key: ObjectKey(index), + imageProvider: pageOption.imageProvider, + loadingBuilder: widget.loadingBuilder, + backgroundDecoration: widget.backgroundDecoration, + wantKeepAlive: widget.wantKeepAlive, + controller: pageOption.controller, + scaleStateController: pageOption.scaleStateController, + customSize: widget.customSize, + semanticLabel: pageOption.semanticLabel, + gaplessPlayback: widget.gaplessPlayback, + heroAttributes: pageOption.heroAttributes, + scaleStateChangedCallback: scaleStateChangedCallback, + enableRotation: widget.enableRotation, + initialScale: pageOption.initialScale, + minScale: pageOption.minScale, + maxScale: pageOption.maxScale, + scaleStateCycle: pageOption.scaleStateCycle, + onTapUp: pageOption.onTapUp, + onTapDown: pageOption.onTapDown, + onScaleEnd: pageOption.onScaleEnd, + gestureDetectorBehavior: pageOption.gestureDetectorBehavior, + tightMode: pageOption.tightMode, + filterQuality: pageOption.filterQuality, + basePosition: pageOption.basePosition, + disableGestures: pageOption.disableGestures, + errorBuilder: pageOption.errorBuilder, + ); + + return ClipRect( + child: photoView, + ); + } + + PhotoViewGalleryPageOptions _buildPageOption( + BuildContext context, int index) { + if (widget._isBuilder) { + return widget.builder!(context, index); + } + return widget.pageOptions![index]; + } +} + +/// A helper class that wraps individual options of a page in [PhotoViewGallery] +/// +/// The [maxScale], [minScale] and [initialScale] options may be [double] or a [PhotoViewComputedScale] constant +/// +class PhotoViewGalleryPageOptions { + PhotoViewGalleryPageOptions({ + Key? key, + required this.imageProvider, + this.heroAttributes, + this.semanticLabel, + this.minScale, + this.maxScale, + this.initialScale, + this.controller, + this.scaleStateController, + this.basePosition, + this.scaleStateCycle, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + this.gestureDetectorBehavior, + this.tightMode, + this.filterQuality, + this.disableGestures, + this.errorBuilder, + }) : child = null, + childSize = null, + assert(imageProvider != null); + + PhotoViewGalleryPageOptions.customChild({ + required this.child, + this.semanticLabel, + this.childSize, + this.heroAttributes, + this.minScale, + this.maxScale, + this.initialScale, + this.controller, + this.scaleStateController, + this.basePosition, + this.scaleStateCycle, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + this.gestureDetectorBehavior, + this.tightMode, + this.filterQuality, + this.disableGestures, + }) : errorBuilder = null, + imageProvider = null; + + /// Mirror to [PhotoView.imageProvider] + final ImageProvider? imageProvider; + + /// Mirror to [PhotoView.heroAttributes] + final PhotoViewHeroAttributes? heroAttributes; + + /// Mirror to [PhotoView.semanticLabel] + final String? semanticLabel; + + /// Mirror to [PhotoView.minScale] + final dynamic minScale; + + /// Mirror to [PhotoView.maxScale] + final dynamic maxScale; + + /// Mirror to [PhotoView.initialScale] + final dynamic initialScale; + + /// Mirror to [PhotoView.controller] + final PhotoViewController? controller; + + /// Mirror to [PhotoView.scaleStateController] + final PhotoViewScaleStateController? scaleStateController; + + /// Mirror to [PhotoView.basePosition] + final Alignment? basePosition; + + /// Mirror to [PhotoView.child] + final Widget? child; + + /// Mirror to [PhotoView.childSize] + final Size? childSize; + + /// Mirror to [PhotoView.scaleStateCycle] + final ScaleStateCycle? scaleStateCycle; + + /// Mirror to [PhotoView.onTapUp] + final PhotoViewImageTapUpCallback? onTapUp; + + /// Mirror to [PhotoView.onTapDown] + final PhotoViewImageTapDownCallback? onTapDown; + + /// Mirror to [PhotoView.onScaleEnd] + final PhotoViewImageScaleEndCallback? onScaleEnd; + + /// Mirror to [PhotoView.gestureDetectorBehavior] + final HitTestBehavior? gestureDetectorBehavior; + + /// Mirror to [PhotoView.tightMode] + final bool? tightMode; + + /// Mirror to [PhotoView.disableGestures] + final bool? disableGestures; + + /// Quality levels for image filters. + final FilterQuality? filterQuality; + + /// Mirror to [PhotoView.errorBuilder] + final ImageErrorWidgetBuilder? errorBuilder; +} diff --git a/photo_view/lib/src/controller/photo_view_controller.dart b/photo_view/lib/src/controller/photo_view_controller.dart new file mode 100644 index 0000000..aed9f49 --- /dev/null +++ b/photo_view/lib/src/controller/photo_view_controller.dart @@ -0,0 +1,291 @@ +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:photo_view/src/utils/ignorable_change_notifier.dart'; + +/// The interface in which controllers will be implemented. +/// +/// It concerns storing the state ([PhotoViewControllerValue]) and streaming its updates. +/// [PhotoViewImageWrapper] will respond to user gestures setting thew fields in the instance of a controller. +/// +/// Any instance of a controller must be disposed after unmount. So if you instantiate a [PhotoViewController] or your custom implementation, do not forget to dispose it when not using it anymore. +/// +/// The controller exposes value fields like [scale] or [rotationFocus]. Usually those fields will be only getters and setters serving as hooks to the internal [PhotoViewControllerValue]. +/// +/// The default implementation used by [PhotoView] is [PhotoViewController]. +/// +/// This was created to allow customization (you can create your own controller class) +/// +/// Previously it controlled `scaleState` as well, but duw to some [concerns](https://github.com/renancaraujo/photo_view/issues/127) +/// [ScaleStateListener is responsible for tat value now +/// +/// As it is a controller, whoever instantiates it, should [dispose] it afterwards. +/// +abstract class PhotoViewControllerBase { + /// The output for state/value updates. Usually a broadcast [Stream] + Stream get outputStateStream; + + /// The state value before the last change or the initial state if the state has not been changed. + late T prevValue; + + /// The actual state value + late T value; + + /// Resets the state to the initial value; + void reset(); + + /// Closes streams and removes eventual listeners. + void dispose(); + + /// Add a listener that will ignore updates made internally + /// + /// Since it is made for internal use, it is not performatic to use more than one + /// listener. Prefer [outputStateStream] + void addIgnorableListener(VoidCallback callback); + + /// Remove a listener that will ignore updates made internally + /// + /// Since it is made for internal use, it is not performatic to use more than one + /// listener. Prefer [outputStateStream] + void removeIgnorableListener(VoidCallback callback); + + /// The position of the image in the screen given its offset after pan gestures. + late Offset position; + + /// The scale factor to transform the child (image or a customChild). + late double? scale; + + /// Nevermind this method :D, look away + void setScaleInvisibly(double? scale); + + /// The rotation factor to transform the child (image or a customChild). + late double rotation; + + /// The center of the rotation transformation. It is a coordinate referring to the absolute dimensions of the image. + Offset? rotationFocusPoint; + + /// Update multiple fields of the state with only one update streamed. + void updateMultiple({ + Offset? position, + double? scale, + double? rotation, + Offset? rotationFocusPoint, + }); +} + +/// The state value stored and streamed by [PhotoViewController]. +@immutable +class PhotoViewControllerValue { + const PhotoViewControllerValue({ + required this.position, + required this.scale, + required this.rotation, + required this.rotationFocusPoint, + }); + + final Offset position; + final double? scale; + final double rotation; + final Offset? rotationFocusPoint; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PhotoViewControllerValue && + runtimeType == other.runtimeType && + position == other.position && + scale == other.scale && + rotation == other.rotation && + rotationFocusPoint == other.rotationFocusPoint; + + @override + int get hashCode => + position.hashCode ^ + scale.hashCode ^ + rotation.hashCode ^ + rotationFocusPoint.hashCode; + + @override + String toString() { + return 'PhotoViewControllerValue{position: $position, scale: $scale, rotation: $rotation, rotationFocusPoint: $rotationFocusPoint}'; + } +} + +/// The default implementation of [PhotoViewControllerBase]. +/// +/// Containing a [ValueNotifier] it stores the state in the [value] field and streams +/// updates via [outputStateStream]. +/// +/// For details of fields and methods, check [PhotoViewControllerBase]. +/// +class PhotoViewController + implements PhotoViewControllerBase { + PhotoViewController({ + Offset initialPosition = Offset.zero, + double initialRotation = 0.0, + double? initialScale, + }) : _valueNotifier = IgnorableValueNotifier( + PhotoViewControllerValue( + position: initialPosition, + rotation: initialRotation, + scale: initialScale, + rotationFocusPoint: null, + ), + ), + super() { + initial = value; + prevValue = initial; + + _valueNotifier.addListener(_changeListener); + _outputCtrl = StreamController.broadcast(); + _outputCtrl.sink.add(initial); + } + + final IgnorableValueNotifier _valueNotifier; + + late PhotoViewControllerValue initial; + + late StreamController _outputCtrl; + + @override + Stream get outputStateStream => _outputCtrl.stream; + + @override + late PhotoViewControllerValue prevValue; + + @override + void reset() { + value = initial; + } + + void _changeListener() { + _outputCtrl.sink.add(value); + } + + @override + void addIgnorableListener(VoidCallback callback) { + _valueNotifier.addIgnorableListener(callback); + } + + @override + void removeIgnorableListener(VoidCallback callback) { + _valueNotifier.removeIgnorableListener(callback); + } + + @override + void dispose() { + _outputCtrl.close(); + _valueNotifier.dispose(); + } + + @override + set position(Offset position) { + if (value.position == position) { + return; + } + prevValue = value; + value = PhotoViewControllerValue( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ); + } + + @override + Offset get position => value.position; + + @override + set scale(double? scale) { + if (value.scale == scale) { + return; + } + prevValue = value; + value = PhotoViewControllerValue( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ); + } + + @override + double? get scale => value.scale; + + @override + void setScaleInvisibly(double? scale) { + if (value.scale == scale) { + return; + } + prevValue = value; + _valueNotifier.updateIgnoring( + PhotoViewControllerValue( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ), + ); + } + + @override + set rotation(double rotation) { + if (value.rotation == rotation) { + return; + } + prevValue = value; + value = PhotoViewControllerValue( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ); + } + + @override + double get rotation => value.rotation; + + @override + set rotationFocusPoint(Offset? rotationFocusPoint) { + if (value.rotationFocusPoint == rotationFocusPoint) { + return; + } + prevValue = value; + value = PhotoViewControllerValue( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ); + } + + @override + Offset? get rotationFocusPoint => value.rotationFocusPoint; + + @override + void updateMultiple({ + Offset? position, + double? scale, + double? rotation, + Offset? rotationFocusPoint, + }) { + prevValue = value; + value = PhotoViewControllerValue( + position: position ?? value.position, + scale: scale ?? value.scale, + rotation: rotation ?? value.rotation, + rotationFocusPoint: rotationFocusPoint ?? value.rotationFocusPoint, + ); + } + + @override + PhotoViewControllerValue get value => _valueNotifier.value; + + @override + set value(PhotoViewControllerValue newValue) { + if (_valueNotifier.value == newValue) { + return; + } + _valueNotifier.value = newValue; + } +} diff --git a/photo_view/lib/src/controller/photo_view_controller_delegate.dart b/photo_view/lib/src/controller/photo_view_controller_delegate.dart new file mode 100644 index 0000000..4605ba3 --- /dev/null +++ b/photo_view/lib/src/controller/photo_view_controller_delegate.dart @@ -0,0 +1,215 @@ +import 'package:flutter/widgets.dart'; +import 'package:photo_view/photo_view.dart' + show + PhotoViewControllerBase, + PhotoViewScaleState, + PhotoViewScaleStateController, + ScaleStateCycle; +import 'package:photo_view/src/core/photo_view_core.dart'; +import 'package:photo_view/src/photo_view_scale_state.dart'; +import 'package:photo_view/src/utils/photo_view_utils.dart'; + +/// A class to hold internal layout logic to sync both controller states +/// +/// It reacts to layout changes (eg: enter landscape or widget resize) and syncs the two controllers. +mixin PhotoViewControllerDelegate on State { + PhotoViewControllerBase get controller => widget.controller; + + PhotoViewScaleStateController get scaleStateController => + widget.scaleStateController; + + ScaleBoundaries get scaleBoundaries => widget.scaleBoundaries; + + ScaleStateCycle get scaleStateCycle => widget.scaleStateCycle; + + Alignment get basePosition => widget.basePosition; + Function(double prevScale, double nextScale)? _animateScale; + + /// Mark if scale need recalculation, useful for scale boundaries changes. + bool markNeedsScaleRecalc = true; + + void initDelegate() { + controller.addIgnorableListener(_blindScaleListener); + scaleStateController.addIgnorableListener(_blindScaleStateListener); + } + + void _blindScaleStateListener() { + if (!scaleStateController.hasChanged) { + return; + } + if (_animateScale == null || scaleStateController.isZooming) { + controller.setScaleInvisibly(scale); + return; + } + final double prevScale = controller.scale ?? + getScaleForScaleState( + scaleStateController.prevScaleState, + scaleBoundaries, + ); + + final double nextScale = getScaleForScaleState( + scaleStateController.scaleState, + scaleBoundaries, + ); + + _animateScale!(prevScale, nextScale); + } + + void addAnimateOnScaleStateUpdate( + void animateScale(double prevScale, double nextScale), + ) { + _animateScale = animateScale; + } + + void _blindScaleListener() { + if (!widget.enablePanAlways) { + controller.position = clampPosition(); + } + if (controller.scale == controller.prevValue.scale) { + return; + } + final PhotoViewScaleState newScaleState = + (scale > scaleBoundaries.initialScale) + ? PhotoViewScaleState.zoomedIn + : PhotoViewScaleState.zoomedOut; + + scaleStateController.setInvisibly(newScaleState); + } + + Offset get position => controller.position; + + double get scale { + // for figuring out initial scale + final needsRecalc = markNeedsScaleRecalc && + !scaleStateController.scaleState.isScaleStateZooming; + + final scaleExistsOnController = controller.scale != null; + if (needsRecalc || !scaleExistsOnController) { + final newScale = getScaleForScaleState( + scaleStateController.scaleState, + scaleBoundaries, + ); + markNeedsScaleRecalc = false; + scale = newScale; + return newScale; + } + return controller.scale!; + } + + set scale(double scale) => controller.setScaleInvisibly(scale); + + void updateMultiple({ + Offset? position, + double? scale, + double? rotation, + Offset? rotationFocusPoint, + }) { + controller.updateMultiple( + position: position, + scale: scale, + rotation: rotation, + rotationFocusPoint: rotationFocusPoint, + ); + } + + void updateScaleStateFromNewScale(double newScale) { + PhotoViewScaleState newScaleState = PhotoViewScaleState.initial; + if (scale != scaleBoundaries.initialScale) { + newScaleState = (newScale > scaleBoundaries.initialScale) + ? PhotoViewScaleState.zoomedIn + : PhotoViewScaleState.zoomedOut; + } + scaleStateController.setInvisibly(newScaleState); + } + + void nextScaleState() { + final PhotoViewScaleState scaleState = scaleStateController.scaleState; + if (scaleState == PhotoViewScaleState.zoomedIn || + scaleState == PhotoViewScaleState.zoomedOut) { + scaleStateController.scaleState = scaleStateCycle(scaleState); + return; + } + final double originalScale = getScaleForScaleState( + scaleState, + scaleBoundaries, + ); + + double prevScale = originalScale; + PhotoViewScaleState prevScaleState = scaleState; + double nextScale = originalScale; + PhotoViewScaleState nextScaleState = scaleState; + + do { + prevScale = nextScale; + prevScaleState = nextScaleState; + nextScaleState = scaleStateCycle(prevScaleState); + nextScale = getScaleForScaleState(nextScaleState, scaleBoundaries); + } while (prevScale == nextScale && scaleState != nextScaleState); + + if (originalScale == nextScale) { + return; + } + scaleStateController.scaleState = nextScaleState; + } + + CornersRange cornersX({double? scale}) { + final double _scale = scale ?? this.scale; + + final double computedWidth = scaleBoundaries.childSize.width * _scale; + final double screenWidth = scaleBoundaries.outerSize.width; + + final double positionX = basePosition.x; + final double widthDiff = computedWidth - screenWidth; + + final double minX = ((positionX - 1).abs() / 2) * widthDiff * -1; + final double maxX = ((positionX + 1).abs() / 2) * widthDiff; + return CornersRange(minX, maxX); + } + + CornersRange cornersY({double? scale}) { + final double _scale = scale ?? this.scale; + + final double computedHeight = scaleBoundaries.childSize.height * _scale; + final double screenHeight = scaleBoundaries.outerSize.height; + + final double positionY = basePosition.y; + final double heightDiff = computedHeight - screenHeight; + + final double minY = ((positionY - 1).abs() / 2) * heightDiff * -1; + final double maxY = ((positionY + 1).abs() / 2) * heightDiff; + return CornersRange(minY, maxY); + } + + Offset clampPosition({Offset? position, double? scale}) { + final double _scale = scale ?? this.scale; + final Offset _position = position ?? this.position; + + final double computedWidth = scaleBoundaries.childSize.width * _scale; + final double computedHeight = scaleBoundaries.childSize.height * _scale; + + final double screenWidth = scaleBoundaries.outerSize.width; + final double screenHeight = scaleBoundaries.outerSize.height; + + double finalX = 0.0; + if (screenWidth < computedWidth) { + final cornersX = this.cornersX(scale: _scale); + finalX = _position.dx.clamp(cornersX.min, cornersX.max); + } + + double finalY = 0.0; + if (screenHeight < computedHeight) { + final cornersY = this.cornersY(scale: _scale); + finalY = _position.dy.clamp(cornersY.min, cornersY.max); + } + + return Offset(finalX, finalY); + } + + @override + void dispose() { + _animateScale = null; + controller.removeIgnorableListener(_blindScaleListener); + scaleStateController.removeIgnorableListener(_blindScaleStateListener); + super.dispose(); + } +} diff --git a/photo_view/lib/src/controller/photo_view_scalestate_controller.dart b/photo_view/lib/src/controller/photo_view_scalestate_controller.dart new file mode 100644 index 0000000..ca2e2b9 --- /dev/null +++ b/photo_view/lib/src/controller/photo_view_scalestate_controller.dart @@ -0,0 +1,98 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:flutter/widgets.dart' show VoidCallback; +import 'package:photo_view/src/photo_view_scale_state.dart'; +import 'package:photo_view/src/utils/ignorable_change_notifier.dart'; + +typedef ScaleStateListener = void Function(double prevScale, double nextScale); + +/// A controller responsible only by [scaleState]. +/// +/// Scale state is a common value with represents the step in which the [PhotoView.scaleStateCycle] is. +/// This cycle is triggered by the "doubleTap" gesture. +/// +/// Any change in its [scaleState] should animate the scale of image/content. +/// +/// As it is a controller, whoever instantiates it, should [dispose] it afterwards. +/// +/// The updates should be done via [scaleState] setter and the updated listened via [outputScaleStateStream] +/// +class PhotoViewScaleStateController { + late final IgnorableValueNotifier _scaleStateNotifier = + IgnorableValueNotifier(PhotoViewScaleState.initial) + ..addListener(_scaleStateChangeListener); + final StreamController _outputScaleStateCtrl = + StreamController.broadcast() + ..sink.add(PhotoViewScaleState.initial); + + /// The output for state/value updates + Stream get outputScaleStateStream => + _outputScaleStateCtrl.stream; + + /// The state value before the last change or the initial state if the state has not been changed. + PhotoViewScaleState prevScaleState = PhotoViewScaleState.initial; + + /// The actual state value + PhotoViewScaleState get scaleState => _scaleStateNotifier.value; + + /// Updates scaleState and notify all listeners (and the stream) + set scaleState(PhotoViewScaleState newValue) { + if (_scaleStateNotifier.value == newValue) { + return; + } + + prevScaleState = _scaleStateNotifier.value; + _scaleStateNotifier.value = newValue; + } + + /// Checks if its actual value is different than previousValue + bool get hasChanged => prevScaleState != scaleState; + + /// Check if is `zoomedIn` & `zoomedOut` + bool get isZooming => + scaleState == PhotoViewScaleState.zoomedIn || + scaleState == PhotoViewScaleState.zoomedOut; + + /// Resets the state to the initial value; + void reset() { + prevScaleState = scaleState; + scaleState = PhotoViewScaleState.initial; + } + + /// Closes streams and removes eventual listeners + void dispose() { + _outputScaleStateCtrl.close(); + _scaleStateNotifier.dispose(); + } + + /// Nevermind this method :D, look away + /// Seriously: It is used to change scale state without trigging updates on the [] + void setInvisibly(PhotoViewScaleState newValue) { + if (_scaleStateNotifier.value == newValue) { + return; + } + prevScaleState = _scaleStateNotifier.value; + _scaleStateNotifier.updateIgnoring(newValue); + } + + void _scaleStateChangeListener() { + _outputScaleStateCtrl.sink.add(scaleState); + } + + /// Add a listener that will ignore updates made internally + /// + /// Since it is made for internal use, it is not performatic to use more than one + /// listener. Prefer [outputScaleStateStream] + void addIgnorableListener(VoidCallback callback) { + _scaleStateNotifier.addIgnorableListener(callback); + } + + /// Remove a listener that will ignore updates made internally + /// + /// Since it is made for internal use, it is not performatic to use more than one + /// listener. Prefer [outputScaleStateStream] + void removeIgnorableListener(VoidCallback callback) { + _scaleStateNotifier.removeIgnorableListener(callback); + } +} diff --git a/photo_view/lib/src/core/photo_view_core.dart b/photo_view/lib/src/core/photo_view_core.dart new file mode 100644 index 0000000..02fe1ff --- /dev/null +++ b/photo_view/lib/src/core/photo_view_core.dart @@ -0,0 +1,451 @@ +import 'package:flutter/widgets.dart'; +import 'package:photo_view/photo_view.dart' + show + PhotoViewScaleState, + PhotoViewHeroAttributes, + PhotoViewImageTapDownCallback, + PhotoViewImageTapUpCallback, + PhotoViewImageScaleEndCallback, + ScaleStateCycle; +import 'package:photo_view/src/controller/photo_view_controller.dart'; +import 'package:photo_view/src/controller/photo_view_controller_delegate.dart'; +import 'package:photo_view/src/controller/photo_view_scalestate_controller.dart'; +import 'package:photo_view/src/core/photo_view_gesture_detector.dart'; +import 'package:photo_view/src/core/photo_view_hit_corners.dart'; +import 'package:photo_view/src/utils/photo_view_utils.dart'; + +const _defaultDecoration = const BoxDecoration( + color: const Color.fromRGBO(0, 0, 0, 1.0), +); + +/// Internal widget in which controls all animations lifecycle, core responses +/// to user gestures, updates to the controller state and mounts the entire PhotoView Layout +class PhotoViewCore extends StatefulWidget { + const PhotoViewCore({ + Key? key, + required this.imageProvider, + required this.backgroundDecoration, + required this.semanticLabel, + required this.gaplessPlayback, + required this.heroAttributes, + required this.enableRotation, + required this.onTapUp, + required this.onTapDown, + required this.onScaleEnd, + required this.gestureDetectorBehavior, + required this.controller, + required this.scaleBoundaries, + required this.scaleStateCycle, + required this.scaleStateController, + required this.basePosition, + required this.tightMode, + required this.filterQuality, + required this.disableGestures, + required this.enablePanAlways, + required this.strictScale, + }) : customChild = null, + super(key: key); + + const PhotoViewCore.customChild({ + Key? key, + required this.customChild, + required this.backgroundDecoration, + this.heroAttributes, + required this.enableRotation, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + this.gestureDetectorBehavior, + required this.controller, + required this.scaleBoundaries, + required this.scaleStateCycle, + required this.scaleStateController, + required this.basePosition, + required this.tightMode, + required this.filterQuality, + required this.disableGestures, + required this.enablePanAlways, + required this.strictScale, + }) : imageProvider = null, + semanticLabel = null, + gaplessPlayback = false, + super(key: key); + + final Decoration? backgroundDecoration; + final ImageProvider? imageProvider; + final String? semanticLabel; + final bool? gaplessPlayback; + final PhotoViewHeroAttributes? heroAttributes; + final bool enableRotation; + final Widget? customChild; + + final PhotoViewControllerBase controller; + final PhotoViewScaleStateController scaleStateController; + final ScaleBoundaries scaleBoundaries; + final ScaleStateCycle scaleStateCycle; + final Alignment basePosition; + + final PhotoViewImageTapUpCallback? onTapUp; + final PhotoViewImageTapDownCallback? onTapDown; + final PhotoViewImageScaleEndCallback? onScaleEnd; + + final HitTestBehavior? gestureDetectorBehavior; + final bool tightMode; + final bool disableGestures; + final bool enablePanAlways; + final bool strictScale; + + final FilterQuality filterQuality; + + @override + State createState() { + return PhotoViewCoreState(); + } + + bool get hasCustomChild => customChild != null; +} + +class PhotoViewCoreState extends State + with + TickerProviderStateMixin, + PhotoViewControllerDelegate, + HitCornersDetector { + Offset? _normalizedPosition; + double? _scaleBefore; + double? _rotationBefore; + + late final AnimationController _scaleAnimationController; + Animation? _scaleAnimation; + + late final AnimationController _positionAnimationController; + Animation? _positionAnimation; + + late final AnimationController _rotationAnimationController = + AnimationController(vsync: this)..addListener(handleRotationAnimation); + Animation? _rotationAnimation; + + PhotoViewHeroAttributes? get heroAttributes => widget.heroAttributes; + + late ScaleBoundaries cachedScaleBoundaries = widget.scaleBoundaries; + + void handleScaleAnimation() { + scale = _scaleAnimation!.value; + } + + void handlePositionAnimate() { + controller.position = _positionAnimation!.value; + } + + void handleRotationAnimation() { + controller.rotation = _rotationAnimation!.value; + } + + void onScaleStart(ScaleStartDetails details) { + _rotationBefore = controller.rotation; + _scaleBefore = scale; + _normalizedPosition = details.focalPoint - controller.position; + _scaleAnimationController.stop(); + _positionAnimationController.stop(); + _rotationAnimationController.stop(); + } + + void onScaleUpdate(ScaleUpdateDetails details) { + final double newScale = _scaleBefore! * details.scale; + final Offset delta = details.focalPoint - _normalizedPosition!; + + if (widget.strictScale && + (newScale > widget.scaleBoundaries.maxScale || + newScale < widget.scaleBoundaries.minScale)) { + return; + } + + updateScaleStateFromNewScale(newScale); + + updateMultiple( + scale: newScale, + position: widget.enablePanAlways + ? delta + : clampPosition(position: delta * details.scale), + rotation: + widget.enableRotation ? _rotationBefore! + details.rotation : null, + rotationFocusPoint: widget.enableRotation ? details.focalPoint : null, + ); + } + + void onScaleEnd(ScaleEndDetails details) { + final double _scale = scale; + final Offset _position = controller.position; + final double maxScale = scaleBoundaries.maxScale; + final double minScale = scaleBoundaries.minScale; + + widget.onScaleEnd?.call(context, details, controller.value); + + //animate back to maxScale if gesture exceeded the maxScale specified + if (_scale > maxScale) { + final double scaleComebackRatio = maxScale / _scale; + animateScale(_scale, maxScale); + final Offset clampedPosition = clampPosition( + position: _position * scaleComebackRatio, + scale: maxScale, + ); + animatePosition(_position, clampedPosition); + return; + } + + //animate back to minScale if gesture fell smaller than the minScale specified + if (_scale < minScale) { + final double scaleComebackRatio = minScale / _scale; + animateScale(_scale, minScale); + animatePosition( + _position, + clampPosition( + position: _position * scaleComebackRatio, + scale: minScale, + ), + ); + return; + } + // get magnitude from gesture velocity + final double magnitude = details.velocity.pixelsPerSecond.distance; + + // animate velocity only if there is no scale change and a significant magnitude + if (_scaleBefore! / _scale == 1.0 && magnitude >= 400.0) { + final Offset direction = details.velocity.pixelsPerSecond / magnitude; + animatePosition( + _position, + clampPosition(position: _position + direction * 100.0), + ); + } + } + + void onDoubleTap() { + nextScaleState(); + } + + void animateScale(double from, double to) { + _scaleAnimation = Tween( + begin: from, + end: to, + ).animate(_scaleAnimationController); + _scaleAnimationController + ..value = 0.0 + ..fling(velocity: 0.4); + } + + void animatePosition(Offset from, Offset to) { + _positionAnimation = Tween(begin: from, end: to) + .animate(_positionAnimationController); + _positionAnimationController + ..value = 0.0 + ..fling(velocity: 0.4); + } + + void animateRotation(double from, double to) { + _rotationAnimation = Tween(begin: from, end: to) + .animate(_rotationAnimationController); + _rotationAnimationController + ..value = 0.0 + ..fling(velocity: 0.4); + } + + void onAnimationStatus(AnimationStatus status) { + if (status == AnimationStatus.completed) { + onAnimationStatusCompleted(); + } + } + + /// Check if scale is equal to initial after scale animation update + void onAnimationStatusCompleted() { + if (scaleStateController.scaleState != PhotoViewScaleState.initial && + scale == scaleBoundaries.initialScale) { + scaleStateController.setInvisibly(PhotoViewScaleState.initial); + } + } + + @override + void initState() { + super.initState(); + initDelegate(); + addAnimateOnScaleStateUpdate(animateOnScaleStateUpdate); + + cachedScaleBoundaries = widget.scaleBoundaries; + + _scaleAnimationController = AnimationController(vsync: this) + ..addListener(handleScaleAnimation) + ..addStatusListener(onAnimationStatus); + _positionAnimationController = AnimationController(vsync: this) + ..addListener(handlePositionAnimate); + } + + void animateOnScaleStateUpdate(double prevScale, double nextScale) { + animateScale(prevScale, nextScale); + animatePosition(controller.position, Offset.zero); + animateRotation(controller.rotation, 0.0); + } + + @override + void dispose() { + _scaleAnimationController.removeStatusListener(onAnimationStatus); + _scaleAnimationController.dispose(); + _positionAnimationController.dispose(); + _rotationAnimationController.dispose(); + super.dispose(); + } + + void onTapUp(TapUpDetails details) { + widget.onTapUp?.call(context, details, controller.value); + } + + void onTapDown(TapDownDetails details) { + widget.onTapDown?.call(context, details, controller.value); + } + + @override + Widget build(BuildContext context) { + // Check if we need a recalc on the scale + if (widget.scaleBoundaries != cachedScaleBoundaries) { + markNeedsScaleRecalc = true; + cachedScaleBoundaries = widget.scaleBoundaries; + } + + return StreamBuilder( + stream: controller.outputStateStream, + initialData: controller.prevValue, + builder: ( + BuildContext context, + AsyncSnapshot snapshot, + ) { + if (snapshot.hasData) { + final PhotoViewControllerValue value = snapshot.data!; + final useImageScale = widget.filterQuality != FilterQuality.none; + + final computedScale = useImageScale ? 1.0 : scale; + + final matrix = Matrix4.identity() + ..translate(value.position.dx, value.position.dy) + ..scale(computedScale) + ..rotateZ(value.rotation); + + final Widget customChildLayout = CustomSingleChildLayout( + delegate: _CenterWithOriginalSizeDelegate( + scaleBoundaries.childSize, + basePosition, + useImageScale, + ), + child: _buildHero(), + ); + + final child = Container( + constraints: widget.tightMode + ? BoxConstraints.tight(scaleBoundaries.childSize * scale) + : null, + child: Center( + child: Transform( + child: customChildLayout, + transform: matrix, + alignment: basePosition, + ), + ), + decoration: widget.backgroundDecoration ?? _defaultDecoration, + ); + + if (widget.disableGestures) { + return child; + } + + return PhotoViewGestureDetector( + child: child, + onDoubleTap: nextScaleState, + onScaleStart: onScaleStart, + onScaleUpdate: onScaleUpdate, + onScaleEnd: onScaleEnd, + hitDetector: this, + onTapUp: widget.onTapUp != null + ? (details) => widget.onTapUp!(context, details, value) + : null, + onTapDown: widget.onTapDown != null + ? (details) => widget.onTapDown!(context, details, value) + : null, + ); + } else { + return Container(); + } + }); + } + + Widget _buildHero() { + return heroAttributes != null + ? Hero( + tag: heroAttributes!.tag, + createRectTween: heroAttributes!.createRectTween, + flightShuttleBuilder: heroAttributes!.flightShuttleBuilder, + placeholderBuilder: heroAttributes!.placeholderBuilder, + transitionOnUserGestures: heroAttributes!.transitionOnUserGestures, + child: _buildChild(), + ) + : _buildChild(); + } + + Widget _buildChild() { + return widget.hasCustomChild + ? widget.customChild! + : Image( + image: widget.imageProvider!, + semanticLabel: widget.semanticLabel, + gaplessPlayback: widget.gaplessPlayback ?? false, + filterQuality: widget.filterQuality, + width: scaleBoundaries.childSize.width * scale, + fit: BoxFit.contain, + ); + } +} + +class _CenterWithOriginalSizeDelegate extends SingleChildLayoutDelegate { + const _CenterWithOriginalSizeDelegate( + this.subjectSize, + this.basePosition, + this.useImageScale, + ); + + final Size subjectSize; + final Alignment basePosition; + final bool useImageScale; + + @override + Offset getPositionForChild(Size size, Size childSize) { + final childWidth = useImageScale ? childSize.width : subjectSize.width; + final childHeight = useImageScale ? childSize.height : subjectSize.height; + + final halfWidth = (size.width - childWidth) / 2; + final halfHeight = (size.height - childHeight) / 2; + + final double offsetX = halfWidth * (basePosition.x + 1); + final double offsetY = halfHeight * (basePosition.y + 1); + return Offset(offsetX, offsetY); + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + return useImageScale + ? const BoxConstraints() + : BoxConstraints.tight(subjectSize); + } + + @override + bool shouldRelayout(_CenterWithOriginalSizeDelegate oldDelegate) { + return oldDelegate != this; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is _CenterWithOriginalSizeDelegate && + runtimeType == other.runtimeType && + subjectSize == other.subjectSize && + basePosition == other.basePosition && + useImageScale == other.useImageScale; + + @override + int get hashCode => + subjectSize.hashCode ^ basePosition.hashCode ^ useImageScale.hashCode; +} diff --git a/photo_view/lib/src/core/photo_view_gesture_detector.dart b/photo_view/lib/src/core/photo_view_gesture_detector.dart new file mode 100644 index 0000000..d6a71d3 --- /dev/null +++ b/photo_view/lib/src/core/photo_view_gesture_detector.dart @@ -0,0 +1,196 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +import 'photo_view_hit_corners.dart'; + +class PhotoViewGestureDetector extends StatelessWidget { + const PhotoViewGestureDetector({ + Key? key, + this.hitDetector, + this.onScaleStart, + this.onScaleUpdate, + this.onScaleEnd, + this.onDoubleTap, + this.child, + this.onTapUp, + this.onTapDown, + this.behavior, + }) : super(key: key); + + final GestureDoubleTapCallback? onDoubleTap; + final HitCornersDetector? hitDetector; + + final GestureScaleStartCallback? onScaleStart; + final GestureScaleUpdateCallback? onScaleUpdate; + final GestureScaleEndCallback? onScaleEnd; + + final GestureTapUpCallback? onTapUp; + final GestureTapDownCallback? onTapDown; + + final Widget? child; + + final HitTestBehavior? behavior; + + @override + Widget build(BuildContext context) { + final scope = PhotoViewGestureDetectorScope.of(context); + + final Axis? axis = scope?.axis; + + final Map gestures = + {}; + + if (onTapDown != null || onTapUp != null) { + gestures[TapGestureRecognizer] = + GestureRecognizerFactoryWithHandlers( + () => TapGestureRecognizer(debugOwner: this), + (TapGestureRecognizer instance) { + instance + ..onTapDown = onTapDown + ..onTapUp = onTapUp; + }, + ); + } + + gestures[DoubleTapGestureRecognizer] = + GestureRecognizerFactoryWithHandlers( + () => DoubleTapGestureRecognizer(debugOwner: this), + (DoubleTapGestureRecognizer instance) { + instance..onDoubleTap = onDoubleTap; + }, + ); + + gestures[PhotoViewGestureRecognizer] = + GestureRecognizerFactoryWithHandlers( + () => PhotoViewGestureRecognizer( + hitDetector: hitDetector, debugOwner: this, validateAxis: axis), + (PhotoViewGestureRecognizer instance) { + instance + ..dragStartBehavior = DragStartBehavior.start + ..onStart = onScaleStart + ..onUpdate = onScaleUpdate + ..onEnd = onScaleEnd; + }, + ); + + return RawGestureDetector( + behavior: behavior, + child: child, + gestures: gestures, + ); + } +} + +class PhotoViewGestureRecognizer extends ScaleGestureRecognizer { + PhotoViewGestureRecognizer({ + this.hitDetector, + Object? debugOwner, + this.validateAxis, + PointerDeviceKind? kind, + }) : super(debugOwner: debugOwner); + final HitCornersDetector? hitDetector; + final Axis? validateAxis; + + Map _pointerLocations = {}; + + Offset? _initialFocalPoint; + Offset? _currentFocalPoint; + + bool ready = true; + + @override + void addAllowedPointer(event) { + if (ready) { + ready = false; + _pointerLocations = {}; + } + super.addAllowedPointer(event); + } + + @override + void didStopTrackingLastPointer(int pointer) { + ready = true; + super.didStopTrackingLastPointer(pointer); + } + + @override + void handleEvent(PointerEvent event) { + if (validateAxis != null) { + _computeEvent(event); + _updateDistances(); + _decideIfWeAcceptEvent(event); + } + super.handleEvent(event); + } + + void _computeEvent(PointerEvent event) { + if (event is PointerMoveEvent) { + if (!event.synthesized) { + _pointerLocations[event.pointer] = event.position; + } + } else if (event is PointerDownEvent) { + _pointerLocations[event.pointer] = event.position; + } else if (event is PointerUpEvent || event is PointerCancelEvent) { + _pointerLocations.remove(event.pointer); + } + + _initialFocalPoint = _currentFocalPoint; + } + + void _updateDistances() { + final int count = _pointerLocations.keys.length; + Offset focalPoint = Offset.zero; + for (int pointer in _pointerLocations.keys) + focalPoint += _pointerLocations[pointer]!; + _currentFocalPoint = + count > 0 ? focalPoint / count.toDouble() : Offset.zero; + } + + void _decideIfWeAcceptEvent(PointerEvent event) { + if (!(event is PointerMoveEvent)) { + return; + } + final move = _initialFocalPoint! - _currentFocalPoint!; + final bool shouldMove = hitDetector!.shouldMove(move, validateAxis!); + if (shouldMove || _pointerLocations.keys.length > 1) { + acceptGesture(event.pointer); + } + } +} + +/// An [InheritedWidget] responsible to give a axis aware scope to [PhotoViewGestureRecognizer]. +/// +/// When using this, PhotoView will test if the content zoomed has hit edge every time user pinches, +/// if so, it will let parent gesture detectors win the gesture arena +/// +/// Useful when placing PhotoView inside a gesture sensitive context, +/// such as [PageView], [Dismissible], [BottomSheet]. +/// +/// Usage example: +/// ``` +/// PhotoViewGestureDetectorScope( +/// axis: Axis.vertical, +/// child: PhotoView( +/// imageProvider: AssetImage("assets/pudim.jpg"), +/// ), +/// ); +/// ``` +class PhotoViewGestureDetectorScope extends InheritedWidget { + PhotoViewGestureDetectorScope({ + this.axis, + required Widget child, + }) : super(child: child); + + static PhotoViewGestureDetectorScope? of(BuildContext context) { + final PhotoViewGestureDetectorScope? scope = context + .dependOnInheritedWidgetOfExactType(); + return scope; + } + + final Axis? axis; + + @override + bool updateShouldNotify(PhotoViewGestureDetectorScope oldWidget) { + return axis != oldWidget.axis; + } +} diff --git a/photo_view/lib/src/core/photo_view_hit_corners.dart b/photo_view/lib/src/core/photo_view_hit_corners.dart new file mode 100644 index 0000000..cfdd949 --- /dev/null +++ b/photo_view/lib/src/core/photo_view_hit_corners.dart @@ -0,0 +1,78 @@ +import 'package:flutter/widgets.dart'; + +import 'package:photo_view/src/controller/photo_view_controller_delegate.dart' + show PhotoViewControllerDelegate; + +mixin HitCornersDetector on PhotoViewControllerDelegate { + HitCorners _hitCornersX() { + final double childWidth = scaleBoundaries.childSize.width * scale; + final double screenWidth = scaleBoundaries.outerSize.width; + if (screenWidth >= childWidth) { + return const HitCorners(true, true); + } + final x = -position.dx; + final cornersX = this.cornersX(); + return HitCorners(x <= cornersX.min, x >= cornersX.max); + } + + HitCorners _hitCornersY() { + final double childHeight = scaleBoundaries.childSize.height * scale; + final double screenHeight = scaleBoundaries.outerSize.height; + if (screenHeight >= childHeight) { + return const HitCorners(true, true); + } + final y = -position.dy; + final cornersY = this.cornersY(); + return HitCorners(y <= cornersY.min, y >= cornersY.max); + } + + bool _shouldMoveAxis( + HitCorners hitCorners, double mainAxisMove, double crossAxisMove) { + if (mainAxisMove == 0) { + return false; + } + if (!hitCorners.hasHitAny) { + return true; + } + final axisBlocked = hitCorners.hasHitBoth || + (hitCorners.hasHitMax ? mainAxisMove > 0 : mainAxisMove < 0); + if (axisBlocked) { + return false; + } + return true; + } + + bool _shouldMoveX(Offset move) { + final hitCornersX = _hitCornersX(); + final mainAxisMove = move.dx; + final crossAxisMove = move.dy; + + return _shouldMoveAxis(hitCornersX, mainAxisMove, crossAxisMove); + } + + bool _shouldMoveY(Offset move) { + final hitCornersY = _hitCornersY(); + final mainAxisMove = move.dy; + final crossAxisMove = move.dx; + + return _shouldMoveAxis(hitCornersY, mainAxisMove, crossAxisMove); + } + + bool shouldMove(Offset move, Axis mainAxis) { + if (mainAxis == Axis.vertical) { + return _shouldMoveY(move); + } + return _shouldMoveX(move); + } +} + +class HitCorners { + const HitCorners(this.hasHitMin, this.hasHitMax); + + final bool hasHitMin; + final bool hasHitMax; + + bool get hasHitAny => hasHitMin || hasHitMax; + + bool get hasHitBoth => hasHitMin && hasHitMax; +} diff --git a/photo_view/lib/src/photo_view_computed_scale.dart b/photo_view/lib/src/photo_view_computed_scale.dart new file mode 100644 index 0000000..ee59ee8 --- /dev/null +++ b/photo_view/lib/src/photo_view_computed_scale.dart @@ -0,0 +1,36 @@ +/// A class that work as a enum. It overloads the operator `*` saving the double as a multiplier. +/// +/// ``` +/// PhotoViewComputedScale.contained * 2 +/// ``` +/// +class PhotoViewComputedScale { + const PhotoViewComputedScale._internal(this._value, [this.multiplier = 1.0]); + + final String _value; + final double multiplier; + + @override + String toString() => 'Enum.$_value'; + + static const contained = const PhotoViewComputedScale._internal('contained'); + static const covered = const PhotoViewComputedScale._internal('covered'); + + PhotoViewComputedScale operator *(double multiplier) { + return PhotoViewComputedScale._internal(_value, multiplier); + } + + PhotoViewComputedScale operator /(double divider) { + return PhotoViewComputedScale._internal(_value, 1 / divider); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PhotoViewComputedScale && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; +} diff --git a/photo_view/lib/src/photo_view_default_widgets.dart b/photo_view/lib/src/photo_view_default_widgets.dart new file mode 100644 index 0000000..9d59430 --- /dev/null +++ b/photo_view/lib/src/photo_view_default_widgets.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class PhotoViewDefaultError extends StatelessWidget { + const PhotoViewDefaultError({Key? key, required this.decoration}) + : super(key: key); + + final BoxDecoration decoration; + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: decoration, + child: Center( + child: Icon( + Icons.broken_image, + color: Colors.grey[400], + size: 40.0, + ), + ), + ); + } +} + +class PhotoViewDefaultLoading extends StatelessWidget { + const PhotoViewDefaultLoading({Key? key, this.event}) : super(key: key); + + final ImageChunkEvent? event; + + @override + Widget build(BuildContext context) { + final expectedBytes = event?.expectedTotalBytes; + final loadedBytes = event?.cumulativeBytesLoaded; + final value = loadedBytes != null && expectedBytes != null + ? loadedBytes / expectedBytes + : null; + + return Center( + child: Container( + width: 20.0, + height: 20.0, + child: CircularProgressIndicator(value: value), + ), + ); + } +} diff --git a/photo_view/lib/src/photo_view_scale_state.dart b/photo_view/lib/src/photo_view_scale_state.dart new file mode 100644 index 0000000..10978de --- /dev/null +++ b/photo_view/lib/src/photo_view_scale_state.dart @@ -0,0 +1,14 @@ +/// A way to represent the step of the "doubletap gesture cycle" in which PhotoView is. +enum PhotoViewScaleState { + initial, + covering, + originalSize, + zoomedIn, + zoomedOut, +} + +extension PhotoViewScaleStateIZoomingExtension on PhotoViewScaleState { + bool get isScaleStateZooming => + this == PhotoViewScaleState.zoomedIn || + this == PhotoViewScaleState.zoomedOut; +} diff --git a/photo_view/lib/src/photo_view_wrappers.dart b/photo_view/lib/src/photo_view_wrappers.dart new file mode 100644 index 0000000..7c1cb39 --- /dev/null +++ b/photo_view/lib/src/photo_view_wrappers.dart @@ -0,0 +1,318 @@ +import 'package:flutter/widgets.dart'; + +import '../photo_view.dart'; +import 'core/photo_view_core.dart'; +import 'photo_view_default_widgets.dart'; +import 'utils/photo_view_utils.dart'; + +class ImageWrapper extends StatefulWidget { + const ImageWrapper({ + Key? key, + required this.imageProvider, + required this.loadingBuilder, + required this.backgroundDecoration, + required this.semanticLabel, + required this.gaplessPlayback, + required this.heroAttributes, + required this.scaleStateChangedCallback, + required this.enableRotation, + required this.controller, + required this.scaleStateController, + required this.maxScale, + required this.minScale, + required this.initialScale, + required this.basePosition, + required this.scaleStateCycle, + required this.onTapUp, + required this.onTapDown, + required this.onScaleEnd, + required this.outerSize, + required this.gestureDetectorBehavior, + required this.tightMode, + required this.filterQuality, + required this.disableGestures, + required this.errorBuilder, + required this.enablePanAlways, + required this.strictScale, + }) : super(key: key); + + final ImageProvider imageProvider; + final LoadingBuilder? loadingBuilder; + final ImageErrorWidgetBuilder? errorBuilder; + final BoxDecoration backgroundDecoration; + final String? semanticLabel; + final bool gaplessPlayback; + final PhotoViewHeroAttributes? heroAttributes; + final ValueChanged? scaleStateChangedCallback; + final bool enableRotation; + final dynamic maxScale; + final dynamic minScale; + final dynamic initialScale; + final PhotoViewControllerBase controller; + final PhotoViewScaleStateController scaleStateController; + final Alignment? basePosition; + final ScaleStateCycle? scaleStateCycle; + final PhotoViewImageTapUpCallback? onTapUp; + final PhotoViewImageTapDownCallback? onTapDown; + final PhotoViewImageScaleEndCallback? onScaleEnd; + final Size outerSize; + final HitTestBehavior? gestureDetectorBehavior; + final bool? tightMode; + final FilterQuality? filterQuality; + final bool? disableGestures; + final bool? enablePanAlways; + final bool? strictScale; + + @override + _ImageWrapperState createState() => _ImageWrapperState(); +} + +class _ImageWrapperState extends State { + ImageStreamListener? _imageStreamListener; + ImageStream? _imageStream; + ImageChunkEvent? _loadingProgress; + ImageInfo? _imageInfo; + bool _loading = true; + Size? _imageSize; + Object? _lastException; + StackTrace? _lastStack; + + @override + void dispose() { + super.dispose(); + _stopImageStream(); + } + + @override + void didChangeDependencies() { + _resolveImage(); + super.didChangeDependencies(); + } + + @override + void didUpdateWidget(ImageWrapper oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.imageProvider != oldWidget.imageProvider) { + _resolveImage(); + } + } + + // retrieve image from the provider + void _resolveImage() { + final ImageStream newStream = widget.imageProvider.resolve( + const ImageConfiguration(), + ); + _updateSourceStream(newStream); + } + + ImageStreamListener _getOrCreateListener() { + void handleImageChunk(ImageChunkEvent event) { + setState(() { + _loadingProgress = event; + _lastException = null; + }); + } + + void handleImageFrame(ImageInfo info, bool synchronousCall) { + final setupCB = () { + _imageSize = Size( + info.image.width.toDouble(), + info.image.height.toDouble(), + ); + _loading = false; + _imageInfo = _imageInfo; + + _loadingProgress = null; + _lastException = null; + _lastStack = null; + }; + synchronousCall ? setupCB() : setState(setupCB); + } + + void handleError(dynamic error, StackTrace? stackTrace) { + setState(() { + _loading = false; + _lastException = error; + _lastStack = stackTrace; + }); + assert(() { + if (widget.errorBuilder == null) { + throw error; + } + return true; + }()); + } + + _imageStreamListener = ImageStreamListener( + handleImageFrame, + onChunk: handleImageChunk, + onError: handleError, + ); + + return _imageStreamListener!; + } + + void _updateSourceStream(ImageStream newStream) { + if (_imageStream?.key == newStream.key) { + return; + } + _imageStream?.removeListener(_imageStreamListener!); + _imageStream = newStream; + _imageStream!.addListener(_getOrCreateListener()); + } + + void _stopImageStream() { + _imageStream?.removeListener(_imageStreamListener!); + } + + @override + Widget build(BuildContext context) { + if (_loading) { + return _buildLoading(context); + } + + if (_lastException != null) { + return _buildError(context); + } + + final scaleBoundaries = ScaleBoundaries( + widget.minScale ?? 0.0, + widget.maxScale ?? double.infinity, + widget.initialScale ?? PhotoViewComputedScale.contained, + widget.outerSize, + _imageSize!, + ); + + return PhotoViewCore( + imageProvider: widget.imageProvider, + backgroundDecoration: widget.backgroundDecoration, + semanticLabel: widget.semanticLabel, + gaplessPlayback: widget.gaplessPlayback, + enableRotation: widget.enableRotation, + heroAttributes: widget.heroAttributes, + basePosition: widget.basePosition ?? Alignment.center, + controller: widget.controller, + scaleStateController: widget.scaleStateController, + scaleStateCycle: widget.scaleStateCycle ?? defaultScaleStateCycle, + strictScale: widget.strictScale ?? false, + scaleBoundaries: scaleBoundaries, + onTapUp: widget.onTapUp, + onTapDown: widget.onTapDown, + onScaleEnd: widget.onScaleEnd, + gestureDetectorBehavior: widget.gestureDetectorBehavior, + tightMode: widget.tightMode ?? false, + filterQuality: widget.filterQuality ?? FilterQuality.none, + disableGestures: widget.disableGestures ?? false, + enablePanAlways: widget.enablePanAlways ?? false, + ); + } + + Widget _buildLoading(BuildContext context) { + if (widget.loadingBuilder != null) { + return widget.loadingBuilder!(context, _loadingProgress); + } + + return PhotoViewDefaultLoading( + event: _loadingProgress, + ); + } + + Widget _buildError( + BuildContext context, + ) { + if (widget.errorBuilder != null) { + return widget.errorBuilder!(context, _lastException!, _lastStack); + } + return PhotoViewDefaultError( + decoration: widget.backgroundDecoration, + ); + } +} + +class CustomChildWrapper extends StatelessWidget { + const CustomChildWrapper({ + Key? key, + this.child, + required this.childSize, + required this.backgroundDecoration, + this.heroAttributes, + this.scaleStateChangedCallback, + required this.enableRotation, + required this.controller, + required this.scaleStateController, + required this.maxScale, + required this.minScale, + required this.initialScale, + required this.basePosition, + required this.scaleStateCycle, + this.onTapUp, + this.onTapDown, + this.onScaleEnd, + required this.outerSize, + this.gestureDetectorBehavior, + required this.tightMode, + required this.filterQuality, + required this.disableGestures, + required this.enablePanAlways, + required this.strictScale, + }) : super(key: key); + + final Widget? child; + final Size? childSize; + final Decoration backgroundDecoration; + final PhotoViewHeroAttributes? heroAttributes; + final ValueChanged? scaleStateChangedCallback; + final bool enableRotation; + + final PhotoViewControllerBase controller; + final PhotoViewScaleStateController scaleStateController; + + final dynamic maxScale; + final dynamic minScale; + final dynamic initialScale; + + final Alignment? basePosition; + final ScaleStateCycle? scaleStateCycle; + final PhotoViewImageTapUpCallback? onTapUp; + final PhotoViewImageTapDownCallback? onTapDown; + final PhotoViewImageScaleEndCallback? onScaleEnd; + final Size outerSize; + final HitTestBehavior? gestureDetectorBehavior; + final bool? tightMode; + final FilterQuality? filterQuality; + final bool? disableGestures; + final bool? enablePanAlways; + final bool? strictScale; + + @override + Widget build(BuildContext context) { + final scaleBoundaries = ScaleBoundaries( + minScale ?? 0.0, + maxScale ?? double.infinity, + initialScale ?? PhotoViewComputedScale.contained, + outerSize, + childSize ?? outerSize, + ); + + return PhotoViewCore.customChild( + customChild: child, + backgroundDecoration: backgroundDecoration, + enableRotation: enableRotation, + heroAttributes: heroAttributes, + controller: controller, + scaleStateController: scaleStateController, + scaleStateCycle: scaleStateCycle ?? defaultScaleStateCycle, + basePosition: basePosition ?? Alignment.center, + scaleBoundaries: scaleBoundaries, + strictScale: strictScale ?? false, + onTapUp: onTapUp, + onTapDown: onTapDown, + onScaleEnd: onScaleEnd, + gestureDetectorBehavior: gestureDetectorBehavior, + tightMode: tightMode ?? false, + filterQuality: filterQuality ?? FilterQuality.none, + disableGestures: disableGestures ?? false, + enablePanAlways: enablePanAlways ?? false, + ); + } +} diff --git a/photo_view/lib/src/utils/ignorable_change_notifier.dart b/photo_view/lib/src/utils/ignorable_change_notifier.dart new file mode 100644 index 0000000..95f6552 --- /dev/null +++ b/photo_view/lib/src/utils/ignorable_change_notifier.dart @@ -0,0 +1,109 @@ +import 'package:flutter/foundation.dart'; + +/// A [ChangeNotifier] that has a second collection of listeners: the ignorable ones +/// +/// Those listeners will be fired when [notifyListeners] fires and will be ignored +/// when [notifySomeListeners] fires. +/// +/// The common collection of listeners inherited from [ChangeNotifier] will be fired +/// every time. +class IgnorableChangeNotifier extends ChangeNotifier { + ObserverList? _ignorableListeners = + ObserverList(); + + bool _debugAssertNotDisposed() { + assert(() { + if (_ignorableListeners == null) { + AssertionError([ + 'A $runtimeType was used after being disposed.', + 'Once you have called dispose() on a $runtimeType, it can no longer be used.' + ]); + } + return true; + }()); + return true; + } + + @override + bool get hasListeners { + return super.hasListeners || (_ignorableListeners?.isNotEmpty ?? false); + } + + void addIgnorableListener(listener) { + assert(_debugAssertNotDisposed()); + _ignorableListeners!.add(listener); + } + + void removeIgnorableListener(listener) { + assert(_debugAssertNotDisposed()); + _ignorableListeners!.remove(listener); + } + + @override + void dispose() { + _ignorableListeners = null; + super.dispose(); + } + + @protected + @override + @visibleForTesting + void notifyListeners() { + super.notifyListeners(); + if (_ignorableListeners != null) { + final List localListeners = + List.from(_ignorableListeners!); + for (VoidCallback listener in localListeners) { + try { + if (_ignorableListeners!.contains(listener)) { + listener(); + } + } catch (exception, stack) { + FlutterError.reportError( + FlutterErrorDetails( + exception: exception, + stack: stack, + library: 'Photoview library', + ), + ); + } + } + } + } + + /// Ignores the ignoreables + @protected + void notifySomeListeners() { + super.notifyListeners(); + } +} + +/// Just like [ValueNotifier] except it extends [IgnorableChangeNotifier] which has +/// listeners that wont fire when [updateIgnoring] is called. +class IgnorableValueNotifier extends IgnorableChangeNotifier + implements ValueListenable { + IgnorableValueNotifier(this._value); + + @override + T get value => _value; + T _value; + + set value(T newValue) { + if (_value == newValue) { + return; + } + _value = newValue; + notifyListeners(); + } + + void updateIgnoring(T newValue) { + if (_value == newValue) { + return; + } + _value = newValue; + notifySomeListeners(); + } + + @override + String toString() => '${describeIdentity(this)}($value)'; +} diff --git a/photo_view/lib/src/utils/photo_view_hero_attributes.dart b/photo_view/lib/src/utils/photo_view_hero_attributes.dart new file mode 100644 index 0000000..1fbbb73 --- /dev/null +++ b/photo_view/lib/src/utils/photo_view_hero_attributes.dart @@ -0,0 +1,28 @@ +import 'package:flutter/widgets.dart'; + +/// Data class that holds the attributes that are going to be passed to +/// [PhotoViewImageWrapper]'s [Hero]. +class PhotoViewHeroAttributes { + const PhotoViewHeroAttributes({ + required this.tag, + this.createRectTween, + this.flightShuttleBuilder, + this.placeholderBuilder, + this.transitionOnUserGestures = false, + }); + + /// Mirror to [Hero.tag] + final Object tag; + + /// Mirror to [Hero.createRectTween] + final CreateRectTween? createRectTween; + + /// Mirror to [Hero.flightShuttleBuilder] + final HeroFlightShuttleBuilder? flightShuttleBuilder; + + /// Mirror to [Hero.placeholderBuilder] + final HeroPlaceholderBuilder? placeholderBuilder; + + /// Mirror to [Hero.transitionOnUserGestures] + final bool transitionOnUserGestures; +} diff --git a/photo_view/lib/src/utils/photo_view_utils.dart b/photo_view/lib/src/utils/photo_view_utils.dart new file mode 100644 index 0000000..7370608 --- /dev/null +++ b/photo_view/lib/src/utils/photo_view_utils.dart @@ -0,0 +1,139 @@ +import 'dart:math' as math; +import 'dart:ui' show Size; + +import "package:photo_view/src/photo_view_computed_scale.dart"; +import 'package:photo_view/src/photo_view_scale_state.dart'; + +/// Given a [PhotoViewScaleState], returns a scale value considering [scaleBoundaries]. +double getScaleForScaleState( + PhotoViewScaleState scaleState, + ScaleBoundaries scaleBoundaries, +) { + switch (scaleState) { + case PhotoViewScaleState.initial: + case PhotoViewScaleState.zoomedIn: + case PhotoViewScaleState.zoomedOut: + return _clampSize(scaleBoundaries.initialScale, scaleBoundaries); + case PhotoViewScaleState.covering: + return _clampSize( + _scaleForCovering( + scaleBoundaries.outerSize, scaleBoundaries.childSize), + scaleBoundaries); + case PhotoViewScaleState.originalSize: + return _clampSize(1.0, scaleBoundaries); + } +} + +/// Internal class to wraps custom scale boundaries (min, max and initial) +/// Also, stores values regarding the two sizes: the container and teh child. +class ScaleBoundaries { + const ScaleBoundaries( + this._minScale, + this._maxScale, + this._initialScale, + this.outerSize, + this.childSize, + ); + + final dynamic _minScale; + final dynamic _maxScale; + final dynamic _initialScale; + final Size outerSize; + final Size childSize; + + double get minScale { + assert(_minScale is double || _minScale is PhotoViewComputedScale); + if (_minScale == PhotoViewComputedScale.contained) { + return _scaleForContained(outerSize, childSize) * + (_minScale as PhotoViewComputedScale).multiplier; // ignore: avoid_as + } + if (_minScale == PhotoViewComputedScale.covered) { + return _scaleForCovering(outerSize, childSize) * + (_minScale as PhotoViewComputedScale).multiplier; // ignore: avoid_as + } + assert(_minScale >= 0.0); + return _minScale; + } + + double get maxScale { + assert(_maxScale is double || _maxScale is PhotoViewComputedScale); + if (_maxScale == PhotoViewComputedScale.contained) { + return (_scaleForContained(outerSize, childSize) * + (_maxScale as PhotoViewComputedScale) // ignore: avoid_as + .multiplier) + .clamp(minScale, double.infinity); + } + if (_maxScale == PhotoViewComputedScale.covered) { + return (_scaleForCovering(outerSize, childSize) * + (_maxScale as PhotoViewComputedScale) // ignore: avoid_as + .multiplier) + .clamp(minScale, double.infinity); + } + return _maxScale.clamp(minScale, double.infinity); + } + + double get initialScale { + assert(_initialScale is double || _initialScale is PhotoViewComputedScale); + if (_initialScale == PhotoViewComputedScale.contained) { + return _scaleForContained(outerSize, childSize) * + (_initialScale as PhotoViewComputedScale) // ignore: avoid_as + .multiplier; + } + if (_initialScale == PhotoViewComputedScale.covered) { + return _scaleForCovering(outerSize, childSize) * + (_initialScale as PhotoViewComputedScale) // ignore: avoid_as + .multiplier; + } + return _initialScale.clamp(minScale, maxScale); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ScaleBoundaries && + runtimeType == other.runtimeType && + _minScale == other._minScale && + _maxScale == other._maxScale && + _initialScale == other._initialScale && + outerSize == other.outerSize && + childSize == other.childSize; + + @override + int get hashCode => + _minScale.hashCode ^ + _maxScale.hashCode ^ + _initialScale.hashCode ^ + outerSize.hashCode ^ + childSize.hashCode; +} + +double _scaleForContained(Size size, Size childSize) { + final double imageWidth = childSize.width; + final double imageHeight = childSize.height; + + final double screenWidth = size.width; + final double screenHeight = size.height; + + return math.min(screenWidth / imageWidth, screenHeight / imageHeight); +} + +double _scaleForCovering(Size size, Size childSize) { + final double imageWidth = childSize.width; + final double imageHeight = childSize.height; + + final double screenWidth = size.width; + final double screenHeight = size.height; + + return math.max(screenWidth / imageWidth, screenHeight / imageHeight); +} + +double _clampSize(double size, ScaleBoundaries scaleBoundaries) { + return size.clamp(scaleBoundaries.minScale, scaleBoundaries.maxScale); +} + +/// Simple class to store a min and a max value +class CornersRange { + const CornersRange(this.min, this.max); + final double min; + final double max; +} diff --git a/photo_view/pubspec.yaml b/photo_view/pubspec.yaml new file mode 100644 index 0000000..2fffe93 --- /dev/null +++ b/photo_view/pubspec.yaml @@ -0,0 +1,19 @@ +name: photo_view +description: Photo View provides a gesture sensitive zoomable widget. Photo View is largely used to show interactive images and other stuff such as SVG. +version: 0.15.0 +homepage: https://github.com/renancaraujo/photo_view + +environment: + sdk: ">=2.12.0 <4.0.0" + flutter: ">=1.6.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + test: ^1.16.0-nullsafety.17 + flutter_test: + sdk: flutter + +flutter: diff --git a/photo_view/test/controller_test.dart b/photo_view/test/controller_test.dart new file mode 100644 index 0000000..3b663d0 --- /dev/null +++ b/photo_view/test/controller_test.dart @@ -0,0 +1,103 @@ +import 'dart:ui'; + +import 'package:photo_view/src/controller/photo_view_controller.dart'; +import 'package:test/test.dart'; + +void main() { + late PhotoViewController controller; + setUp(() { + controller = PhotoViewController(); + }); + + test('controller constructor', () { + const double initialRotation = 0.0; + const Offset initialPosition = Offset(40.0, 40.0); + controller = PhotoViewController( + initialRotation: initialRotation, + initialPosition: initialPosition, + ); + + const PhotoViewControllerValue testValue = const PhotoViewControllerValue( + position: initialPosition, + scale: null, + rotation: initialRotation, + rotationFocusPoint: null, + ); + + expect(controller.value, testValue); + }); + test('controller change values', () { + controller.scale = 0.1; + expect(controller.scale, 0.1); + + controller.position = Offset.zero; + expect(controller.position, Offset.zero); + + controller.rotation = 0.1; + expect(controller.rotation, 0.1); + + controller.rotationFocusPoint = Offset.zero; + expect(controller.rotationFocusPoint, Offset.zero); + + controller.updateMultiple(position: const Offset(1, 1)); + expect(controller.scale, 0.1); + expect(controller.position, const Offset(1, 1)); + expect(controller.rotation, 0.1); + expect(controller.rotationFocusPoint, Offset.zero); + + controller.setScaleInvisibly(2.0); + expect(controller.scale, 2.0); + }); + test('controller reset', () { + controller.updateMultiple(position: const Offset(1, 1), rotation: 40); + controller.reset(); + expect(controller.position, Offset.zero); + expect(controller.rotation, 0.0); + }); + test('controller stream mutation', () { + const PhotoViewControllerValue value1 = const PhotoViewControllerValue( + position: Offset.zero, + scale: null, + rotation: 1.0, + rotationFocusPoint: null, + ); + + const PhotoViewControllerValue value2 = const PhotoViewControllerValue( + position: Offset.zero, + scale: 3.0, + rotation: 1.0, + rotationFocusPoint: null, + ); + + const PhotoViewControllerValue value3 = const PhotoViewControllerValue( + position: const Offset(1, 1), + scale: 3.0, + rotation: 45.0, + rotationFocusPoint: null, + ); + + const PhotoViewControllerValue value4 = const PhotoViewControllerValue( + position: const Offset(1, 1), + scale: 5.0, + rotation: 45.0, + rotationFocusPoint: null, + ); + + expect( + controller.outputStateStream, + emitsInOrder([ + value1, + value2, + value3, + value4, + ]), + ); + + controller.rotation = 1.0; + controller.scale = 3.0; + + controller.updateMultiple(position: const Offset(1, 1), rotation: 45.0); + + controller.setScaleInvisibly(5.0); + }); +} diff --git a/photo_view/test/scale_state_controller_test.dart b/photo_view/test/scale_state_controller_test.dart new file mode 100644 index 0000000..cd17d81 --- /dev/null +++ b/photo_view/test/scale_state_controller_test.dart @@ -0,0 +1,66 @@ +import 'package:photo_view/photo_view.dart'; +import 'package:test/test.dart'; + +void main() { + late PhotoViewScaleStateController controller; + setUp(() { + controller = PhotoViewScaleStateController(); + }); + + test('controller constructor', () { + expect(controller.prevScaleState, PhotoViewScaleState.initial); + expect(controller.scaleState, PhotoViewScaleState.initial); + }); + + test('controller change values', () { + controller.scaleState = PhotoViewScaleState.covering; + expect(controller.prevScaleState, PhotoViewScaleState.initial); + expect(controller.scaleState, PhotoViewScaleState.covering); + controller.scaleState = PhotoViewScaleState.originalSize; + expect(controller.prevScaleState, PhotoViewScaleState.covering); + expect(controller.scaleState, PhotoViewScaleState.originalSize); + controller.setInvisibly(PhotoViewScaleState.zoomedOut); + expect(controller.prevScaleState, PhotoViewScaleState.originalSize); + expect(controller.scaleState, PhotoViewScaleState.zoomedOut); + }); + + test('controller reset', () { + controller.scaleState = PhotoViewScaleState.covering; + controller.reset(); + expect(controller.prevScaleState, PhotoViewScaleState.covering); + expect(controller.scaleState, PhotoViewScaleState.initial); + }); + + test('controller stream mutation', () { + const PhotoViewScaleState value1 = PhotoViewScaleState.covering; + const PhotoViewScaleState value2 = PhotoViewScaleState.originalSize; + const PhotoViewScaleState value3 = PhotoViewScaleState.initial; + const PhotoViewScaleState value4 = PhotoViewScaleState.zoomedOut; + + expect(controller.outputScaleStateStream, + emitsInOrder([value1, value2, value3, value4])); + controller.scaleState = PhotoViewScaleState.covering; + controller.scaleState = PhotoViewScaleState.originalSize; + controller.reset(); + controller.scaleState = PhotoViewScaleState.initial; + controller.setInvisibly(PhotoViewScaleState.zoomedOut); + }); + + test('controller invisible update', () { + int count = 0; + final void Function() callback = () { + count++; + }; + + controller.addIgnorableListener(callback); + + expect(count, 0); + + controller.scaleState = PhotoViewScaleState.zoomedOut; + expect(count, 1); + controller.setInvisibly(PhotoViewScaleState.zoomedOut); + expect(count, 1); + controller.reset(); + expect(count, 2); + }); +} diff --git a/pointycastle/LICENSE b/pointycastle/LICENSE new file mode 100644 index 0000000..5928ef3 --- /dev/null +++ b/pointycastle/LICENSE @@ -0,0 +1,20 @@ + +Copyright (c) 2000 - 2019 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/pointycastle/lib/adapters/stream_cipher_as_block_cipher.dart b/pointycastle/lib/adapters/stream_cipher_as_block_cipher.dart new file mode 100644 index 0000000..e1a671d --- /dev/null +++ b/pointycastle/lib/adapters/stream_cipher_as_block_cipher.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.adapters.stream_cipher_as_block_cipher; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; + +/// An adapter to convert an [StreamCipher] to a [BlockCipher] +class StreamCipherAsBlockCipher extends BaseBlockCipher { + final StreamCipher streamCipher; + @override + final int blockSize; + + /// Create a [BlockCipher] from [streamCipher] simulating the given [blockSize] + StreamCipherAsBlockCipher(this.blockSize, this.streamCipher); + + @override + String get algorithmName => streamCipher.algorithmName; + + @override + void reset() { + streamCipher.reset(); + } + + @override + void init(bool forEncryption, CipherParameters? params) { + streamCipher.init(forEncryption, params); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + streamCipher.processBytes(inp, inpOff, blockSize, out, outOff); + return blockSize; + } +} diff --git a/pointycastle/lib/api.dart b/pointycastle/lib/api.dart new file mode 100644 index 0000000..352a25e --- /dev/null +++ b/pointycastle/lib/api.dart @@ -0,0 +1,53 @@ +// See file LICENSE for more information. + +/// This is the API specification library for the Pointy Castle project. +/// +/// It declares all abstract types used by the Pointy Castle library. +/// In addition, it implements the factories mechanism that allows +/// users to instantiate algorithms by their standard name. +library; + +import 'dart:typed_data'; + +import 'src/registry/registry.dart'; +import 'src/utils.dart'; + +part 'src/api/aead_block_cipher.dart'; +part 'src/api/aead_cipher.dart'; +part 'src/api/aead_parameters.dart'; +part 'src/api/algorithm.dart'; +part 'src/api/asymmetric_block_cipher.dart'; +part 'src/api/asymmetric_key.dart'; +part 'src/api/asymmetric_key_pair.dart'; +part 'src/api/asymmetric_key_parameter.dart'; +part 'src/api/block_cipher.dart'; +part 'src/api/cipher_parameters.dart'; +part 'src/api/des_parameters.dart'; +part 'src/api/desede_parameters.dart'; +part 'src/api/digest.dart'; +part 'src/api/key_derivator.dart'; +part 'src/api/key_generator.dart'; +part 'src/api/key_generator_parameters.dart'; +part 'src/api/key_parameter.dart'; +part 'src/api/mac.dart'; +part 'src/api/padded_block_cipher.dart'; +part 'src/api/padded_block_cipher_parameters.dart'; +part 'src/api/padding.dart'; +part 'src/api/parameters_with_iv.dart'; +part 'src/api/parameters_with_random.dart'; +part 'src/api/parameters_with_salt.dart'; +part 'src/api/parameters_with_salt_configuration.dart'; +part 'src/api/pbe_parameters_generator.dart'; +part 'src/api/private_key.dart'; +part 'src/api/private_key_parameter.dart'; +part 'src/api/public_key.dart'; +part 'src/api/public_key_parameter.dart'; +part 'src/api/rc2_parameters.dart'; +part 'src/api/registry_factory_exception.dart'; +part 'src/api/secure_random.dart'; +part 'src/api/signature.dart'; +part 'src/api/signer.dart'; +part 'src/api/srp_client.dart'; +part 'src/api/srp_server.dart'; +part 'src/api/stream_cipher.dart'; +part 'src/api/xof.dart'; diff --git a/pointycastle/lib/asn1.dart b/pointycastle/lib/asn1.dart new file mode 100644 index 0000000..906a288 --- /dev/null +++ b/pointycastle/lib/asn1.dart @@ -0,0 +1,60 @@ +library asn1; + +export 'asn1/asn1_encoding_rule.dart'; +export 'asn1/asn1_object.dart'; +export 'asn1/asn1_parser.dart'; +export 'asn1/asn1_tags.dart'; +export 'asn1/asn1_utils.dart'; +export 'asn1/primitives/asn1_bit_string.dart'; +export 'asn1/primitives/asn1_boolean.dart'; +export 'asn1/primitives/asn1_enumerated.dart'; +export 'asn1/primitives/asn1_generalized_time.dart'; +export 'asn1/primitives/asn1_ia5_string.dart'; +export 'asn1/primitives/asn1_integer.dart'; +export 'asn1/primitives/asn1_null.dart'; +export 'asn1/primitives/asn1_object_identifier.dart'; +export 'asn1/primitives/asn1_octet_string.dart'; +export 'asn1/primitives/asn1_printable_string.dart'; +export 'asn1/primitives/asn1_sequence.dart'; +export 'asn1/primitives/asn1_set.dart'; +export 'asn1/primitives/asn1_teletext_string.dart'; +export 'asn1/primitives/asn1_bmp_string.dart'; +export 'asn1/primitives/asn1_utc_time.dart'; +export 'asn1/primitives/asn1_utf8_string.dart'; +export 'asn1/unsupported_asn1_encoding_rule_exception.dart'; +export 'asn1/unsupported_asn1_tag_exception.dart'; + +// X501 +export 'asn1/x501/asn1_attribute_type_and_value.dart'; +export 'asn1/x501/asn1_name.dart'; +export 'asn1/x501/asn1_rdn.dart'; + +// X509 +export 'asn1/x509/asn1_algorithm_identifier.dart'; + +// PKCS7 +export 'asn1/pkcs/pkcs1/asn1_digest_info.dart'; + +// PKCS7 +export 'asn1/pkcs/pkcs7/asn1_content_info.dart'; +export 'asn1/pkcs/pkcs7/asn1_encrypted_content_info.dart'; + +// PKCS8 +export 'asn1/pkcs/pkcs8/asn1_encrypted_data.dart'; +export 'asn1/pkcs/pkcs8/asn1_encrypted_private_key_info.dart'; +export 'asn1/pkcs/pkcs8/asn1_private_key_info.dart'; + +// PKCS10 +export 'asn1/pkcs/pkcs10/asn1_certification_request.dart'; +export 'asn1/pkcs/pkcs10/asn1_subject_public_key_info.dart'; +export 'asn1/pkcs/pkcs10/asn1_certification_request_info.dart'; + +// PKCS12 +export 'asn1/pkcs/pkcs12/asn1_authenticated_safe.dart'; +export 'asn1/pkcs/pkcs12/asn1_cert_bag.dart'; +export 'asn1/pkcs/pkcs12/asn1_key_bag.dart'; +export 'asn1/pkcs/pkcs12/asn1_mac_data.dart'; +export 'asn1/pkcs/pkcs12/asn1_pfx.dart'; +export 'asn1/pkcs/pkcs12/asn1_pkcs12_attribute.dart'; +export 'asn1/pkcs/pkcs12/asn1_safe_bag.dart'; +export 'asn1/pkcs/pkcs12/asn1_safe_contents.dart'; diff --git a/pointycastle/lib/asn1/asn1_encoding_rule.dart b/pointycastle/lib/asn1/asn1_encoding_rule.dart new file mode 100644 index 0000000..3b9010c --- /dev/null +++ b/pointycastle/lib/asn1/asn1_encoding_rule.dart @@ -0,0 +1,16 @@ +enum ASN1EncodingRule { + /// Normal DER encoding rules + ENCODING_DER, + + /// BER encoding where the length is described in a long form + ENCODING_BER_LONG_LENGTH_FORM, + + /// BER Constructed encoding with definite length + ENCODING_BER_CONSTRUCTED, + + /// BER encoding with padded bits to make the length of the value bytes a multiple of eight. Only used for ASN1BitString + ENCODING_BER_PADDED, + + /// BER Constructed encoding with indefinite length + ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH +} diff --git a/pointycastle/lib/asn1/asn1_object.dart b/pointycastle/lib/asn1/asn1_object.dart new file mode 100644 index 0000000..480ad33 --- /dev/null +++ b/pointycastle/lib/asn1/asn1_object.dart @@ -0,0 +1,142 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; + +/// +/// Base model for all ASN1Objects +/// +class ASN1Object { + /// + /// The BER tag representing this object. + /// + /// For a list of all supported BER tags take a look in the **Asn1Tags** class. + /// + int? tag; + + /// + /// The encoded bytes. + /// + Uint8List? encodedBytes; + + /// + /// The value bytes. + /// + Uint8List? valueBytes; + + /// + /// The index where the value bytes start. This is the position after the tag + length bytes. + /// + /// The default value for this field is 2. If the length byte is larger than **127**, the value of this field will increase depending on the length bytes. + /// + int valueStartPosition = 2; + + /// + /// Length of the encoded value bytes. + /// + int? valueByteLength; + + /// + /// Describes if this ASN1 Object is constructed. + /// + /// The object is marked as constructed if bit 6 of the [tag] field has value **1** + /// + bool? isConstructed; + + int dumpIndent = 2; + + ASN1Object({this.tag}) { + if (tag != null) { + isConstructed = ASN1Utils.isConstructed(tag!); + } + } + + /// + /// Creates a new ASN1Object from the given [encodedBytes]. + /// + /// The first byte will be used as the [tag].The field [valueStartPosition] and [valueByteLength] will be calculated on the given [encodedBytes]. + /// + ASN1Object.fromBytes(this.encodedBytes) { + tag = encodedBytes![0]; + isConstructed = ASN1Utils.isConstructed(tag!); + valueByteLength = ASN1Utils.decodeLength(encodedBytes!); + valueStartPosition = ASN1Utils.calculateValueStartPosition(encodedBytes!); + if (valueByteLength == -1) { + // Indefinite length, check the last to bytes + if (ASN1Utils.hasIndefiniteLengthEnding(encodedBytes!)) { + valueByteLength = encodedBytes!.length - 4; + } + } + valueBytes = Uint8List.view(encodedBytes!.buffer, + valueStartPosition + encodedBytes!.offsetInBytes, valueByteLength); + } + + /// + /// Encode the object to their byte representation. + /// + /// [encodingRule] defines if the [valueByteLength] should be encoded as indefinite length (0x80) or fixed length with short/long form. + /// The default is [ASN1EncodingRule.ENCODING_DER] which will automatically decode in definite length with short form. + /// + /// **Important note**: Subclasses need to override this method and may call this method. If this method is called by a subclass, the subclass has to set the [valueBytes] before calling super.encode(). + /// + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodedBytes == null) { + // Encode the length + Uint8List lengthAsBytes; + valueByteLength ??= valueBytes!.length; + // Check if we have indefinite length or fixed length (short or longform) + if (encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH) { + // Set length to 0x80 + lengthAsBytes = Uint8List.fromList([0x80]); + // Add 2 to the valueByteLength to handle the 0x00, 0x00 at the end + //valueByteLength = valueByteLength + 2; + } else { + lengthAsBytes = ASN1Utils.encodeLength(valueByteLength!, + longform: + encodingRule == ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM); + } + // Create the Uint8List with the calculated length + encodedBytes = Uint8List(1 + lengthAsBytes.length + valueByteLength!); + // Set the tag + encodedBytes![0] = tag!; + // Set the length bytes + encodedBytes!.setRange(1, 1 + lengthAsBytes.length, lengthAsBytes, 0); + // Set the value bytes + encodedBytes!.setRange( + 1 + lengthAsBytes.length, encodedBytes!.length, valueBytes!, 0); + } + return encodedBytes!; + } + + /// + /// The total length of this object, including its value bytes, the encoded tag and length bytes. + /// + int get totalEncodedByteLength => valueStartPosition + valueByteLength!; + + /// + /// Creates a readable dump from the current ASN1Object. + /// + /// **Important note**: Subclasses need to override this method. If the ASN1Object is constructed and has child elements, dump() has to be called for each child element. + /// + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (tag == 0xA0 || tag == 0xA3) { + sb.write('[$tag]'); + var parser = ASN1Parser(valueBytes); + if (parser.hasNext()) { + var next = parser.nextObject(); + var dump = next.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } else { + sb.write(' (0 elem)'); + } + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/asn1_parser.dart b/pointycastle/lib/asn1/asn1_parser.dart new file mode 100644 index 0000000..e131335 --- /dev/null +++ b/pointycastle/lib/asn1/asn1_parser.dart @@ -0,0 +1,163 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/primitives/asn1_bit_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_bmp_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_boolean.dart'; +import 'package:pointycastle/asn1/primitives/asn1_generalized_time.dart'; +import 'package:pointycastle/asn1/primitives/asn1_ia5_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_integer.dart'; +import 'package:pointycastle/asn1/primitives/asn1_null.dart'; +import 'package:pointycastle/asn1/primitives/asn1_object_identifier.dart'; +import 'package:pointycastle/asn1/primitives/asn1_octet_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_printable_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_sequence.dart'; +import 'package:pointycastle/asn1/primitives/asn1_set.dart'; +import 'package:pointycastle/asn1/primitives/asn1_teletext_string.dart'; +import 'package:pointycastle/asn1/primitives/asn1_utc_time.dart'; +import 'package:pointycastle/asn1/primitives/asn1_utf8_string.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_tag_exception.dart'; + +/// +/// The ASN1Parser to parse bytes into ASN1 Objects +/// +class ASN1Parser { + /// + /// The bytes to parse + /// + final Uint8List? bytes; + + /// + /// The current position in the byte array. + /// + /// The inital value is 0. + /// + int _position = 0; + + ASN1Parser(this.bytes); + + /// + /// Returns true if there is still an object to parse. Otherwise false. + /// + bool hasNext() { + return _position < bytes!.length; + } + + /// + /// Parses the next object in the [bytes]. + /// + ASN1Object nextObject() { + // Get the current tag in the list bytes + var tag = bytes![_position]; + + // Get the length of the value bytes for the current object + var length = ASN1Utils.decodeLength(bytes!.sublist(_position)); + + var valueStartPosition = + ASN1Utils.calculateValueStartPosition(bytes!.sublist(_position)); + + var isIndefiniteLength = false; + + if (length == -1) { + length = ASN1Utils.calculateIndefiniteLength(bytes!, _position) + 2; + isIndefiniteLength = true; + } else if (bytes!.length - _position > length + valueStartPosition) { + length = length + valueStartPosition; + } else { + length = bytes!.length - _position; + } + + // Create new view from the bytes + var offset = _position + bytes!.offsetInBytes; + var subBytes = Uint8List.view(bytes!.buffer, offset, length); + + // Parse the view and the tag to an ASN1Object + var isConstructed = ASN1Utils.isConstructed(tag); + var isPrimitive = (0xC0 & tag) == 0; + //var isApplication = (0x40 & tag) != 0; + + ASN1Object obj; + if (isConstructed) { + obj = _createConstructed(tag, subBytes); + } else if (isPrimitive) { + obj = _createPrimitive(tag, subBytes); + } else { + // create a vanilla object + obj = ASN1Object.fromBytes(subBytes); + } + + // Update the position + _position = + _position + obj.totalEncodedByteLength + (isIndefiniteLength ? 2 : 0); + return obj; + } + + /// + /// Creates a constructed ASN1Object depending on the given [tag] and [bytes] + /// + ASN1Object _createConstructed(int tag, Uint8List bytes) { + switch (tag) { + case ASN1Tags.SEQUENCE: // sequence + return ASN1Sequence.fromBytes(bytes); + case ASN1Tags.SET: + return ASN1Set.fromBytes(bytes); + case ASN1Tags.IA5_STRING_CONSTRUCTED: + return ASN1IA5String.fromBytes(bytes); + case ASN1Tags.BIT_STRING_CONSTRUCTED: + return ASN1BitString.fromBytes(bytes); + case ASN1Tags.OCTET_STRING_CONSTRUCTED: + return ASN1OctetString.fromBytes(bytes); + case ASN1Tags.PRINTABLE_STRING_CONSTRUCTED: + return ASN1PrintableString.fromBytes(bytes); + case ASN1Tags.T61_STRING_CONSTRUCTED: + return ASN1TeletextString.fromBytes(bytes); + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + return ASN1Object.fromBytes(bytes); + default: + throw UnsupportedASN1TagException(tag); + } + } + + /// + /// Creates a primitive ASN1Object depending on the given [tag] and [bytes] + /// + ASN1Object _createPrimitive(int tag, Uint8List bytes) { + switch (tag) { + case ASN1Tags.OCTET_STRING: + return ASN1OctetString.fromBytes(bytes); + case ASN1Tags.UTF8_STRING: + return ASN1UTF8String.fromBytes(bytes); + case ASN1Tags.IA5_STRING: + return ASN1IA5String.fromBytes(bytes); + case ASN1Tags.INTEGER: + case ASN1Tags.ENUMERATED: + return ASN1Integer.fromBytes(bytes); + case ASN1Tags.BOOLEAN: + return ASN1Boolean.fromBytes(bytes); + case ASN1Tags.OBJECT_IDENTIFIER: + return ASN1ObjectIdentifier.fromBytes(bytes); + case ASN1Tags.BIT_STRING: + return ASN1BitString.fromBytes(bytes); + case ASN1Tags.NULL: + return ASN1Null.fromBytes(bytes); + case ASN1Tags.PRINTABLE_STRING: + return ASN1PrintableString.fromBytes(bytes); + case ASN1Tags.UTC_TIME: + return ASN1UtcTime.fromBytes(bytes); + case ASN1Tags.T61_STRING: + return ASN1TeletextString.fromBytes(bytes); + case ASN1Tags.GENERALIZED_TIME: + return ASN1GeneralizedTime.fromBytes(bytes); + case ASN1Tags.BMP_STRING: + return ASN1BMPString.fromBytes(bytes); + default: + throw UnsupportedASN1TagException(tag); + } + } +} diff --git a/pointycastle/lib/asn1/asn1_tags.dart b/pointycastle/lib/asn1/asn1_tags.dart new file mode 100644 index 0000000..b61b78a --- /dev/null +++ b/pointycastle/lib/asn1/asn1_tags.dart @@ -0,0 +1,134 @@ +/// +/// Class holding all ASN1 BER tags, supported by this package +/// +class ASN1Tags { + static const List TAGS = [ + BOOLEAN, + INTEGER, + BIT_STRING, + BIT_STRING_CONSTRUCTED, + OCTET_STRING, + OCTET_STRING_CONSTRUCTED, + NULL, + OBJECT_IDENTIFIER, + EXTERNAL, + ENUMERATED, + UTF8_STRING, + UTF8_STRING_CONSTRUCTED, + SEQUENCE, + SEQUENCE_OF, + SET, + SET_OF, + T61_STRING, + T61_STRING_CONSTRUCTED, + PRINTABLE_STRING, + PRINTABLE_STRING_CONSTRUCTED, + IA5_STRING, + IA5_STRING_CONSTRUCTED, + UTC_TIME, + GENERALIZED_TIME, + BMP_STRING + ]; + + /// Decimal 1 + static const int BOOLEAN = 0x01; + + /// Decimal 2 + static const int INTEGER = 0x02; + + /// Decimal 3 + static const int BIT_STRING = 0x03; + + /// Decimal 35 + static const int BIT_STRING_CONSTRUCTED = 0x23; + + /// Decimal 4 + static const int OCTET_STRING = 0x04; + + /// Decimal 36 + static const int OCTET_STRING_CONSTRUCTED = 0x24; + + /// Decimal 5 + static const int NULL = 0x05; + + /// Decimal 6 + static const int OBJECT_IDENTIFIER = 0x06; + + /// Decimal 8 + static const int EXTERNAL = 0x08; + + /// Decimal 10 + static const int ENUMERATED = 0x0a; + + /// Decimal 12 + static const int UTF8_STRING = 0x0c; + + /// Decimal 44 + static const int UTF8_STRING_CONSTRUCTED = 0x2C; + + /// Decimal 48 + static const int SEQUENCE = 0x30; + + /// Decimal 48 + static const int SEQUENCE_OF = 0x30; + + /// Decimal 49 + static const int SET = 0x31; + + /// Decimal 49 + static const int SET_OF = 0x31; + + /// Decimal 18 + static const int NUMERIC_STRING = 0x12; + + /// Decimal 19 + static const int PRINTABLE_STRING = 0x13; + + /// Decimal 51 + static const int PRINTABLE_STRING_CONSTRUCTED = 0x33; + + /// Decimal 20 + static const int T61_STRING = 0x14; + + /// Decimal 52 + static const int T61_STRING_CONSTRUCTED = 0x34; + + /// Decimal 21 + static const int VIDEOTEX_STRING = 0x15; + + /// Decimal 22 + static const int IA5_STRING = 0x16; + + /// Decimal 54 + static const int IA5_STRING_CONSTRUCTED = 0x36; + + /// Decimal 23 + static const int UTC_TIME = 0x17; + + /// Decimal 24 + static const int GENERALIZED_TIME = 0x18; + + /// Decimal 25 + static const int GRAPHIC_STRING = 0x19; + + /// Decimal 26 + static const int VISIBLE_STRING = 0x1a; + + /// Decimal 27 + static const int GENERAL_STRING = 0x1b; + + /// Decimal 28 + static const int UNIVERSAL_STRING = 0x1c; + + /// Decimal 30 + static const int BMP_STRING = 0x1e; + + /// Decimal 32 + static const int CONSTRUCTED = 0x20; + + /// Decimal 64 + static const int APPLICATION = 0x40; + + /// Decimal 128 + static const int TAGGED = 0x80; +} diff --git a/pointycastle/lib/asn1/asn1_utils.dart b/pointycastle/lib/asn1/asn1_utils.dart new file mode 100644 index 0000000..1cd8663 --- /dev/null +++ b/pointycastle/lib/asn1/asn1_utils.dart @@ -0,0 +1,243 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; +import 'package:pointycastle/asn1/object_identifiers.dart'; +import 'package:pointycastle/ecc/api.dart'; + +/// +/// Utils class holding different methods to ease the handling of ANS1Objects and their byte representation. +/// +class ASN1Utils { + /// + /// Calculates the start position of the value bytes for the given [encodedBytes]. + /// + /// It will return 2 if the **length byte** is less than or equal 127 or the length calculate on the **length byte** value. + /// This will throw a [RangeError] if the given [encodedBytes] has length < 2. + /// + static int calculateValueStartPosition(Uint8List encodedBytes) { + // TODO tag length can be >1 + var length = encodedBytes[1]; + if (length <= 0x7F) { + return 2; + } else { + return 2 + (length & 0x7F); + } + } + + /// + /// Calculates the length of the **value bytes** for the given [encodedBytes]. + /// + /// Will return **-1** if the length byte equals **0x80**. Throws an [ArgumentError] if the length could not be calculated for the given [encodedBytes]. + /// + static int decodeLength(Uint8List encodedBytes) { + var valueStartPosition = 2; + var length = encodedBytes[1]; + if (length <= 0x7F) { + return length; + } + if (length == 0x80) { + return -1; + } + if (length > 127) { + var length = encodedBytes[1] & 0x7F; + + var numLengthBytes = length; + + length = 0; + for (var i = 0; i < numLengthBytes; i++) { + length <<= 8; + length |= encodedBytes[valueStartPosition++] & 0xFF; + } + return length; + } + throw ArgumentError('Could not calculate the length from the given bytes.'); + } + + /// + /// Encode the given [length] to byte representation. + /// + static Uint8List encodeLength(int length, {bool longform = false}) { + Uint8List e; + if (length <= 127 && longform == false) { + e = Uint8List(1); + e[0] = length; + } else { + var x = Uint32List(1); + x[0] = length; + var y = Uint8List.view(x.buffer); + // Skip null bytes + var num = 3; + while (y[num] == 0) { + --num; + } + e = Uint8List(num + 2); + e[0] = 0x80 + num + 1; + for (var i = 1; i < e.length; ++i) { + e[i] = y[num--]; + } + } + return e; + } + + /// + /// Checks if the given int [i] is constructed according to section 3.2. + /// + /// The Identifier octets (represented by the given [i]) is marked as constructed if bit 6 has the value **1**. + /// + /// Example with the IA5 String tag: + /// + /// 0x36 = 0 0 1 1 0 1 1 0 + /// + /// 0x16 = 0 0 0 1 0 1 1 0 + /// ``` + /// ASN1Utils.isConstructed(0x36); // true + /// ASN1Utils.isConstructed(0x16); // false + /// ``` + /// + /// + static bool isConstructed(int i) { + // Shift bits + var newNum = i >> (6 - 1); + // Check if bit is set to 1 + return (newNum & 1) == 1; + } + + static bool isASN1Tag(int i) { + return ASN1Tags.TAGS.contains(i); + } + + /// + /// Checks if the given [bytes] ends with 0x00, 0x00 + /// + static bool hasIndefiniteLengthEnding(Uint8List bytes) { + var last = bytes.elementAt(bytes.length - 1); + var lastMinus1 = bytes.elementAt(bytes.length - 2); + if (last == 0 && lastMinus1 == 0) { + return true; + } + return false; + } + + /// + /// Calculates the indefinite length of the ASN1 object. + /// Throws an [ArgumentError] if the end of content octets is not found. + /// + static int calculateIndefiniteLength(Uint8List bytes, int startPosition) { + var currentPosition = startPosition; + var indefiniteLengthObjects = 0; + while (currentPosition < bytes.length - 1) { + if (bytes[currentPosition] == 0x00 && + bytes[currentPosition + 1] == 0x00) { + indefiniteLengthObjects--; + if (indefiniteLengthObjects == 0) { + return currentPosition - startPosition; + } + currentPosition += 2; + } else { + final nextLength = + ASN1Utils.decodeLength(bytes.sublist(currentPosition)); + final valueStartPosition = ASN1Utils.calculateValueStartPosition( + bytes.sublist(currentPosition)); + if (nextLength == 0) { + throw ArgumentError('Invalid length of zero.'); + } + if (valueStartPosition <= 0) { + throw ArgumentError( + 'Invalid value start position: $valueStartPosition'); + } + + if (nextLength == -1) { + indefiniteLengthObjects++; + currentPosition += valueStartPosition; + } else { + currentPosition += valueStartPosition + nextLength; + } + } + } + + throw ArgumentError('End of content octets not found'); + } + + static Uint8List getBytesFromPEMString(String pem, + {bool checkHeader = true}) { + var lines = LineSplitter.split(pem) + .map((line) => line.trim()) + .where((line) => line.isNotEmpty) + .toList(); + String base64; + if (checkHeader) { + if (lines.length < 2 || + !lines.first.startsWith('-----BEGIN') || + !lines.last.startsWith('-----END')) { + throw ArgumentError('The given string does not have the correct ' + 'begin/end markers expected in a PEM file.'); + } + base64 = lines.sublist(1, lines.length - 1).join(''); + } else { + base64 = lines.join(''); + } + + return Uint8List.fromList(base64Decode(base64)); + } + + static ECPrivateKey ecPrivateKeyFromDerBytes(Uint8List bytes, + {bool pkcs8 = false}) { + var asn1Parser = ASN1Parser(bytes); + var topLevelSeq = asn1Parser.nextObject() as ASN1Sequence; + late String curveName; + Uint8List x; + if (pkcs8) { + // Parse the PKCS8 format + var innerSeq = topLevelSeq.elements!.elementAt(1) as ASN1Sequence; + var b2 = innerSeq.elements!.elementAt(1) as ASN1ObjectIdentifier; + var b2Data = b2.objectIdentifierAsString; + var b2Curvedata = ObjectIdentifiers.getIdentifierByIdentifier(b2Data); + if (b2Curvedata != null) { + curveName = b2Curvedata['readableName'] as String; + } + + var octetString = topLevelSeq.elements!.elementAt(2) as ASN1OctetString; + asn1Parser = ASN1Parser(octetString.valueBytes); + var octetStringSeq = asn1Parser.nextObject() as ASN1Sequence; + var octetStringKeyData = + octetStringSeq.elements!.elementAt(1) as ASN1OctetString; + + x = octetStringKeyData.valueBytes!; + } else { + // Parse the SEC1 format + var privateKeyAsOctetString = + topLevelSeq.elements!.elementAt(1) as ASN1OctetString; + var choice = topLevelSeq.elements!.elementAt(2); + var s = ASN1Sequence(); + var parser = ASN1Parser(choice.valueBytes); + while (parser.hasNext()) { + s.add(parser.nextObject()); + } + var curveNameOi = s.elements!.elementAt(0) as ASN1ObjectIdentifier; + var data = ObjectIdentifiers.getIdentifierByIdentifier( + curveNameOi.objectIdentifierAsString); + if (data != null) { + curveName = data['readableName'] as String; + } + + x = privateKeyAsOctetString.valueBytes!; + } + + return ECPrivateKey(osp2i(x), ECDomainParameters(curveName)); + } + + static BigInt osp2i(Iterable bytes, {Endian endian = Endian.big}) { + var result = BigInt.from(0); + if (endian == Endian.little) { + bytes = bytes.toList().reversed; + } + + for (var byte in bytes) { + result = result << 8; + result |= BigInt.from(byte); + } + + return result; + } +} diff --git a/pointycastle/lib/asn1/object_identifiers.dart b/pointycastle/lib/asn1/object_identifiers.dart new file mode 100644 index 0000000..bb0dff7 --- /dev/null +++ b/pointycastle/lib/asn1/object_identifiers.dart @@ -0,0 +1,34 @@ +import 'package:pointycastle/asn1/object_identifiers_database.dart'; + +/// +/// Class holding a list of object identifiers +/// +class ObjectIdentifiers { + /// + /// Returns the object identifier corresponding to the given [readableName]. + /// + /// Returns null if none object identifier can be found for the given [readableName]. + /// + static Map? getIdentifierByName(String readableName) { + for (var element in oi) { + if (element['readableName'] == readableName) { + return element; + } + } + return null; + } + + /// + /// Returns the object identifier corresponding to the given [identifier]. + /// + /// Returns null if none object identifier can be found for the given [identifier]. + /// + static Map? getIdentifierByIdentifier(String? identifier) { + for (var element in oi) { + if (element['identifierString'] == identifier) { + return element; + } + } + return null; + } +} diff --git a/pointycastle/lib/asn1/object_identifiers_database.dart b/pointycastle/lib/asn1/object_identifiers_database.dart new file mode 100644 index 0000000..a36cdb7 --- /dev/null +++ b/pointycastle/lib/asn1/object_identifiers_database.dart @@ -0,0 +1,803 @@ +/// +/// A list of object identifiers, holding the identifier and a readable name. +/// +const oi = [ + { + 'identifierString': '1.2.860.3.15.1.1.1.1.4', + 'readableName': + 'UZDST 1092:2009 I digital signature parameters, UNICON.UZ paramset B', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 1, 4] + }, + { + 'identifierString': '1.2.860.3.15.1.3.2.1.0', + 'readableName': 'UZDST 1106:2009 II test digest parameters', + 'identifier': [1, 2, 860, 3, 15, 1, 3, 2, 1, 0] + }, + { + 'identifierString': '1.2.860.3.15.1.1.2.1.1', + 'readableName': + 'UZDST 1092:2009 II signature parameters, UNICON.UZ paramset A', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 2, 1, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.1.2.1.2', + 'readableName': + 'UZDST 1092:2009 II signature parameters, UNICON.UZ paramset B', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 2, 1, 2] + }, + { + 'identifierString': '1.2.860.3.16.1.1', + 'readableName': 'Identifikatsionniy Nomer Nalogoplatelshika', + 'identifier': [1, 2, 860, 3, 16, 1, 1] + }, + { + 'identifierString': '1.2.860.3.16.1.2', + 'readableName': 'Personalniy Identifikatsionniy Nomer Fizicheskogo Litsa', + 'identifier': [1, 2, 860, 3, 16, 1, 2] + }, + { + 'identifierString': '1.2.860.3.15.1.1.1.1', + 'readableName': 'UZDST 1092:2009 I digital signature public key', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.1.2.1', + 'readableName': 'UZDST 1092:2009 II digital signature public key', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 2, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.1.1.2.2.2', + 'readableName': + 'UZDST 1092:2009 I/1106:2009 digital signature algorithm with message digest', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 2, 2, 2] + }, + { + 'identifierString': '1.2.860.3.15.1.1.2.2.2.2', + 'readableName': + 'UZDST 1092:2009 II/1106:2009 digital signature algorithm with message digest', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 2, 2, 2, 2] + }, + { + 'identifierString': '1.2.860.3.15.1.1.1.1.1', + 'readableName': + 'UZDST 1092:2009 I digital signature parameters, SICNT paramset A', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 1, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.1.1.1.2', + 'readableName': + 'UZDST 1092:2009 I digital signature parameters, SICNT paramset B', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 1, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.1.1.1.3', + 'readableName': + 'UZDST 1092:2009 I digital signature parameters, UNICON.UZ paramset A', + 'identifier': [1, 2, 860, 3, 15, 1, 1, 1, 1, 3] + }, + { + 'identifierString': '1.2.860.3.15.1.3.2.1.1', + 'readableName': 'UZDST 1106:2009 II default digest parameters', + 'identifier': [1, 2, 860, 3, 15, 1, 3, 2, 1, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.2.1', + 'readableName': 'UZDST 1105:2009 symmetric cipher', + 'identifier': [1, 2, 860, 3, 15, 1, 2, 1] + }, + { + 'identifierString': '1.2.860.3.15.1.3.2', + 'readableName': 'UZDST 1106:2009 II digest', + 'identifier': [1, 2, 860, 3, 15, 1, 3, 2] + }, + { + 'identifierString': '1.2.860.3.15.1.4.2', + 'readableName': 'UZDST 1106:2009 II digest based HMAC', + 'identifier': [1, 2, 860, 3, 15, 1, 4, 2] + }, + { + 'identifierString': '1.2.860.3.15.1.12.2.1', + 'readableName': 'PBE with UZDST 1106:2009 II and UZDST 1105:2009', + 'identifier': [1, 2, 860, 3, 15, 1, 12, 2, 1] + }, + { + 'identifierString': '1.2.840.113549.1.9.22.1', + 'readableName': 'x509Certificate', + 'identifier': [1, 2, 840, 113549, 1, 9, 22, 1] + }, + { + 'identifierString': '1.2.840.113549.1.9.22.2', + 'readableName': 'sdsiCertificate', + 'identifier': [1, 2, 840, 113549, 1, 9, 22, 2] + }, + { + 'identifierString': '1.2.840.113549.1.9.20', + 'readableName': 'friendlyName', + 'identifier': [1, 2, 840, 113549, 1, 9, 20] + }, + { + 'identifierString': '1.2.840.113549.1.9.21', + 'readableName': 'localKeyID', + 'identifier': [1, 2, 840, 113549, 1, 9, 21] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.1', + 'readableName': 'keyBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 1] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.2', + 'readableName': 'pkcs-8ShroudedKeyBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 2] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.3', + 'readableName': 'certBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 3] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.4', + 'readableName': 'crlBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 4] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.5', + 'readableName': 'secretBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 5] + }, + { + 'identifierString': '1.2.840.113549.1.12.10.1.6', + 'readableName': 'safeContentsBag', + 'identifier': [1, 2, 840, 113549, 1, 12, 10, 1, 6] + }, + { + 'identifierString': '1.2.840.113549.1.7.1', + 'readableName': 'data', + 'identifier': [1, 2, 840, 113549, 1, 7, 1] + }, + { + 'identifierString': '1.2.840.113549.1.7.6', + 'readableName': 'encryptedData', + 'identifier': [1, 2, 840, 113549, 1, 7, 6] + }, + { + 'identifierString': '1.2.840.113549.1.1.10', + 'readableName': 'rsaPSS', + 'identifier': [1, 2, 840, 113549, 1, 1, 10] + }, + { + 'identifierString': '2.16.840.1.101.3.4.2.1', + 'readableName': 'SHA-256', + 'identifier': [2, 16, 840, 1, 101, 3, 4, 2, 1] + }, + { + 'identifierString': '2.16.840.1.101.3.4.2.2', + 'readableName': 'SHA-384', + 'identifier': [2, 16, 840, 1, 101, 3, 4, 2, 2] + }, + { + 'identifierString': '2.16.840.1.101.3.4.2.3', + 'readableName': 'SHA-512', + 'identifier': [2, 16, 840, 1, 101, 3, 4, 2, 3] + }, + { + 'identifierString': '2.16.840.1.101.3.4.2.4', + 'readableName': 'SHA-224', + 'identifier': [2, 16, 840, 1, 101, 3, 4, 2, 4] + }, + { + 'identifierString': '2.5.4.3', + 'readableName': 'commonName', + 'identifier': [2, 5, 4, 3] + }, + { + 'identifierString': '2.5.4.6', + 'readableName': 'countryName', + 'identifier': [2, 5, 4, 6] + }, + { + 'identifierString': '2.5.4.10', + 'readableName': 'organizationName', + 'identifier': [2, 5, 4, 10] + }, + { + 'identifierString': '2.5.4.11', + 'readableName': 'organizationalUnitName', + 'identifier': [2, 5, 4, 11] + }, + { + 'identifierString': '1.3.6.1.4.1.311.60.2.1.3', + 'readableName': 'jurisdictionOfIncorporationC', + 'identifier': [1, 3, 6, 1, 4, 1, 311, 60, 2, 1, 3] + }, + { + 'identifierString': '1.3.6.1.4.1.311.60.2.1.2', + 'readableName': 'jurisdictionOfIncorporationSP', + 'identifier': [1, 3, 6, 1, 4, 1, 311, 60, 2, 1, 2] + }, + { + 'identifierString': '1.3.6.1.4.1.311.60.2.1.1', + 'readableName': 'jurisdictionOfIncorporationL', + 'identifier': [1, 3, 6, 1, 4, 1, 311, 60, 2, 1, 1] + }, + { + 'identifierString': '2.5.4.15', + 'readableName': 'businessCategory', + 'identifier': [2, 5, 4, 15] + }, + { + 'identifierString': '2.5.4.5', + 'readableName': 'serialNumber', + 'identifier': [2, 5, 4, 5] + }, + { + 'identifierString': '2.5.4.8', + 'readableName': 'stateOrProvinceName', + 'identifier': [2, 5, 4, 8] + }, + { + 'identifierString': '2.5.4.7', + 'readableName': 'localityName', + 'identifier': [2, 5, 4, 7] + }, + { + 'identifierString': '1.2.840.113549.1.1.1', + 'readableName': 'rsaEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 1] + }, + { + 'identifierString': '2.5.29.17', + 'readableName': 'subjectAltName', + 'identifier': [2, 5, 29, 17] + }, + { + 'identifierString': '2.5.29.32', + 'readableName': 'certificatePolicies', + 'identifier': [2, 5, 29, 32] + }, + { + 'identifierString': '2.16.840.1.113733.1.7.23.6', + 'readableName': 'VeriSign EV policy', + 'identifier': [2, 16, 840, 1, 113733, 1, 7, 23, 6] + }, + { + 'identifierString': '1.3.6.1.5.5.7.2.1', + 'readableName': 'cps', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 2, 1] + }, + { + 'identifierString': '1.3.6.1.5.5.7.2.2', + 'readableName': 'unotice', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 2, 2] + }, + { + 'identifierString': '2.5.29.31', + 'readableName': 'cRLDistributionPoints', + 'identifier': [2, 5, 29, 31] + }, + { + 'identifierString': '2.5.29.37', + 'readableName': 'extKeyUsage', + 'identifier': [2, 5, 29, 37] + }, + { + 'identifierString': '2.5.29.35', + 'readableName': 'authorityKeyIdentifier', + 'identifier': [2, 5, 29, 35] + }, + { + 'identifierString': '1.3.6.1.5.5.7.3.1', + 'readableName': 'serverAuth', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 3, 1] + }, + { + 'identifierString': '1.3.6.1.5.5.7.3.2', + 'readableName': 'clientAuth', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 3, 2] + }, + { + 'identifierString': '1.3.6.1.5.5.7.1.1', + 'readableName': 'authorityInfoAccess', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 1, 1] + }, + { + 'identifierString': '1.3.6.1.5.5.7.48.1', + 'readableName': 'ocsp', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 48, 1] + }, + { + 'identifierString': '1.3.6.1.5.5.7.48.2', + 'readableName': 'caIssuers', + 'identifier': [1, 3, 6, 1, 5, 5, 7, 48, 2] + }, + { + 'identifierString': '1.2.840.113549.1.1.11', + 'readableName': 'sha256WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 11] + }, + { + 'identifierString': '1.2.840.113549.1.1.4', + 'readableName': 'md5WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 4] + }, + { + 'identifierString': '1.3.6.1.4.1.11129.2.4.2', + 'readableName': '2', + 'identifier': [1, 3, 6, 1, 4, 1, 11129, 2, 4, 2] + }, + { + 'identifierString': '2.23.140.1.1', + 'readableName': 'ev-guidelines', + 'identifier': [2, 23, 140, 1, 1] + }, + { + 'identifierString': '1.2.840.113549.1.1.5', + 'readableName': 'sha1WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 5] + }, + { + 'identifierString': '1.2.840.10045.2.1', + 'readableName': 'ecPublicKey', + 'identifier': [1, 2, 840, 10045, 2, 1] + }, + { + 'identifierString': '1.2.840.10045.3.1.7', + 'readableName': 'prime256v1', + 'identifier': [1, 2, 840, 10045, 3, 1, 7] + }, + { + 'identifierString': '1.2.840.10045.3.1.6', + 'readableName': 'prime239v3', + 'identifier': [1, 2, 840, 10045, 3, 1, 6] + }, + { + 'identifierString': '1.2.840.10045.3.1.5', + 'readableName': 'prime239v2', + 'identifier': [1, 2, 840, 10045, 3, 1, 5] + }, + { + 'identifierString': '1.2.840.10045.3.1.4', + 'readableName': 'prime239v1', + 'identifier': [1, 2, 840, 10045, 3, 1, 4] + }, + { + 'identifierString': '1.2.840.10045.3.1.3', + 'readableName': 'prime192v3', + 'identifier': [1, 2, 840, 10045, 3, 1, 3] + }, + { + 'identifierString': '1.2.840.10045.3.1.2', + 'readableName': 'prime192v2', + 'identifier': [1, 2, 840, 10045, 3, 1, 2] + }, + { + 'identifierString': '1.2.840.10045.3.1.1', + 'readableName': 'prime192v1', + 'identifier': [1, 2, 840, 10045, 3, 1, 1] + }, + { + 'identifierString': '1.3.101.110', + 'readableName': 'curveX25519', + 'identifier': [1, 3, 101, 110] + }, + { + 'identifierString': '1.3.101.111', + 'readableName': 'curveX448', + 'identifier': [1, 3, 101, 111] + }, + { + 'identifierString': '1.3.101.112', + 'readableName': 'curveEd25519', + 'identifier': [1, 3, 101, 112] + }, + { + 'identifierString': '1.3.101.113', + 'readableName': 'curveEd448', + 'identifier': [1, 3, 101, 113] + }, + { + 'identifierString': '1.3.132.0.1', + 'readableName': 'ansit163k1', + 'identifier': [1, 3, 132, 0, 1] + }, + { + 'identifierString': '1.3.132.0.2', + 'readableName': 'ansit163r1', + 'identifier': [1, 3, 132, 0, 2] + }, + { + 'identifierString': '1.3.132.0.3', + 'readableName': 'ansit239k1', + 'identifier': [1, 3, 132, 0, 3] + }, + { + 'identifierString': '1.3.132.0.4', + 'readableName': 'sect113r1', + 'identifier': [1, 3, 132, 0, 4] + }, + { + 'identifierString': '1.3.132.0.5', + 'readableName': 'sect113r2', + 'identifier': [1, 3, 132, 0, 5] + }, + { + 'identifierString': '1.3.132.0.6', + 'readableName': 'secp112r1', + 'identifier': [1, 3, 132, 0, 6] + }, + { + 'identifierString': '1.3.132.0.7', + 'readableName': 'secp112r2', + 'identifier': [1, 3, 132, 0, 7] + }, + { + 'identifierString': '1.3.132.0.8', + 'readableName': 'ansip160r1', + 'identifier': [1, 3, 132, 0, 8] + }, + { + 'identifierString': '1.3.132.0.9', + 'readableName': 'ansip160k1', + 'identifier': [1, 3, 132, 0, 9] + }, + { + 'identifierString': '1.3.132.0.15', + 'readableName': 'ansit163r2', + 'identifier': [1, 3, 132, 0, 15] + }, + { + 'identifierString': '1.3.132.0.16', + 'readableName': 'ansit283k1', + 'identifier': [1, 3, 132, 0, 16] + }, + { + 'identifierString': '1.3.132.0.17', + 'readableName': 'ansit283r1', + 'identifier': [1, 3, 132, 0, 17] + }, + { + 'identifierString': '1.3.132.0.22', + 'readableName': 'sect131r1', + 'identifier': [1, 3, 132, 0, 22] + }, + { + 'identifierString': '1.3.132.0.23', + 'readableName': '23', + 'identifier': [1, 3, 132, 0, 23] + }, + { + 'identifierString': '1.3.132.0.24', + 'readableName': 'ansit193r1', + 'identifier': [1, 3, 132, 0, 24] + }, + { + 'identifierString': '1.3.132.0.25', + 'readableName': 'ansit193r2', + 'identifier': [1, 3, 132, 0, 25] + }, + { + 'identifierString': '1.3.132.0.26', + 'readableName': 'ansit233k1', + 'identifier': [1, 3, 132, 0, 26] + }, + { + 'identifierString': '1.3.132.0.27', + 'readableName': 'ansit233r1', + 'identifier': [1, 3, 132, 0, 27] + }, + { + 'identifierString': '1.3.132.0.28', + 'readableName': 'secp128r1', + 'identifier': [1, 3, 132, 0, 28] + }, + { + 'identifierString': '1.3.132.0.29', + 'readableName': 'secp128r2', + 'identifier': [1, 3, 132, 0, 29] + }, + { + 'identifierString': '1.3.132.0.30', + 'readableName': 'ansip160r2', + 'identifier': [1, 3, 132, 0, 30] + }, + { + 'identifierString': '1.3.132.0.31', + 'readableName': 'ansip192k1', + 'identifier': [1, 3, 132, 0, 31] + }, + { + 'identifierString': '1.3.132.0.32', + 'readableName': 'ansip224k1', + 'identifier': [1, 3, 132, 0, 32] + }, + { + 'identifierString': '1.3.132.0.33', + 'readableName': 'ansip224r1', + 'identifier': [1, 3, 132, 0, 33] + }, + { + 'identifierString': '1.3.132.0.36', + 'readableName': 'ansit409k1', + 'identifier': [1, 3, 132, 0, 36] + }, + { + 'identifierString': '1.3.132.0.37', + 'readableName': 'ansit409r1', + 'identifier': [1, 3, 132, 0, 37] + }, + { + 'identifierString': '1.3.132.0.38', + 'readableName': 'ansit571k1', + 'identifier': [1, 3, 132, 0, 38] + }, + { + 'identifierString': '1.3.132.0.39', + 'readableName': 'ansit571r1', + 'identifier': [1, 3, 132, 0, 39] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.1', + 'readableName': 'brainpoolP160r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 1] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.2', + 'readableName': 'brainpoolP160t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 2] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.3', + 'readableName': 'brainpoolP192r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 3] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.4', + 'readableName': 'brainpoolP192t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 4] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.5', + 'readableName': 'brainpoolP224r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 5] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.6', + 'readableName': 'brainpoolP224t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 6] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.7', + 'readableName': 'brainpoolP256r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 7] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.8', + 'readableName': 'brainpoolP256t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 8] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.9', + 'readableName': 'brainpoolP320r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 9] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.10', + 'readableName': 'brainpoolP320t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 10] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.11', + 'readableName': 'brainpoolP384r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 11] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.12', + 'readableName': 'brainpoolP384t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 12] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.13', + 'readableName': 'brainpoolP512r1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 13] + }, + { + 'identifierString': '1.3.36.3.3.2.8.1.1.14', + 'readableName': 'brainpoolP512t1', + 'identifier': [1, 3, 36, 3, 3, 2, 8, 1, 1, 14] + }, + { + 'identifierString': '1.2.840.10045.4.3.2', + 'readableName': 'ecdsaWithSHA256', + 'identifier': [1, 2, 840, 10045, 4, 3, 2] + }, + { + 'identifierString': '2.5.4.3', + 'readableName': 'CN', + 'identifier': [2, 5, 4, 3] + }, + { + 'identifierString': '2.5.4.4', + 'readableName': 'SN', + 'identifier': [2, 5, 4, 4] + }, + { + 'identifierString': '2.5.4.5', + 'readableName': 'SERIALNUMBER', + 'identifier': [2, 5, 4, 5] + }, + { + 'identifierString': '2.5.4.6', + 'readableName': 'C', + 'identifier': [2, 5, 4, 6] + }, + { + 'identifierString': '2.5.4.7', + 'readableName': 'L', + 'identifier': [2, 5, 4, 7] + }, + { + 'identifierString': '2.5.4.8', + 'readableName': 'ST', + 'identifier': [2, 5, 4, 8] + }, + { + 'identifierString': '2.5.4.8', + 'readableName': 'S', + 'identifier': [2, 5, 4, 8] + }, + { + 'identifierString': '2.5.4.9', + 'readableName': 'streetAddress', + 'identifier': [2, 5, 4, 9] + }, + { + 'identifierString': '2.5.4.9', + 'readableName': 'STREET', + 'identifier': [2, 5, 4, 9] + }, + { + 'identifierString': '2.5.4.10', + 'readableName': 'O', + 'identifier': [2, 5, 4, 10] + }, + { + 'identifierString': '2.5.4.11', + 'readableName': 'OU', + 'identifier': [2, 5, 4, 11] + }, + { + 'identifierString': '2.5.4.12', + 'readableName': 'title', + 'identifier': [2, 5, 4, 12] + }, + { + 'identifierString': '2.5.4.12', + 'readableName': 'T', + 'identifier': [2, 5, 4, 12] + }, + { + 'identifierString': '2.5.4.12', + 'readableName': 'TITLE', + 'identifier': [2, 5, 4, 12] + }, + { + 'identifierString': '2.5.4.42', + 'readableName': 'givenName', + 'identifier': [2, 5, 4, 42] + }, + { + 'identifierString': '2.5.4.42', + 'readableName': 'G', + 'identifier': [2, 5, 4, 42] + }, + { + 'identifierString': '2.5.4.42', + 'readableName': 'GN', + 'identifier': [2, 5, 4, 42] + }, + { + 'identifierString': '1.3.132.0.35', + 'readableName': 'secp521r1', + 'identifier': [1, 3, 132, 0, 35] + }, + { + 'identifierString': '1.3.132.0.34', + 'readableName': 'secp384r1', + 'identifier': [1, 3, 132, 0, 34] + }, + { + 'identifierString': '1.2.840.10045.3.1.7', + 'readableName': 'secp256r1', + 'identifier': [1, 2, 840, 10045, 3, 1, 7] + }, + { + 'identifierString': '1.3.132.0.10', + 'readableName': 'secp256k1', + 'identifier': [1, 3, 132, 0, 10] + }, + { + 'identifierString': '2.5.29.15', + 'readableName': 'keyUsage', + 'identifier': [2, 5, 29, 15] + }, + { + 'identifierString': '2.5.29.19', + 'readableName': 'basicConstraints', + 'identifier': [2, 5, 29, 19] + }, + { + 'identifierString': '2.5.29.14', + 'readableName': 'subjectKeyIdentifier', + 'identifier': [2, 5, 29, 14] + }, + { + 'identifierString': '1.3.14.3.2.26', + 'readableName': 'SHA1', + 'identifier': [1, 3, 14, 3, 2, 26] + }, + { + 'identifierString': '1.2.840.113549.1.1.13', + 'readableName': 'sha512WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 13] + }, + { + 'identifierString': '1.2.840.113549.1.1.12', + 'readableName': 'sha384WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 12] + }, + { + 'identifierString': '1.2.840.113549.1.1.14', + 'readableName': 'sha224WithRSAEncryption', + 'identifier': [1, 2, 840, 113549, 1, 1, 14] + }, + { + 'identifierString': '1.2.840.113549.1.9.14', + 'readableName': 'extensionRequest', + 'identifier': [1, 2, 840, 113549, 1, 9, 14] + }, + { + 'identifierString': '1.2.840.10045.4.1', + 'readableName': 'ecdsaWithSHA1', + 'identifier': [1, 2, 840, 10045, 4, 1] + }, + { + 'identifierString': '1.2.840.10045.4.3.1', + 'readableName': 'ecdsaWithSHA224', + 'identifier': [1, 2, 840, 10045, 4, 3, 1] + }, + { + 'identifierString': '1.2.840.10045.4.3.3', + 'readableName': 'ecdsaWithSHA384', + 'identifier': [1, 2, 840, 10045, 4, 3, 3] + }, + { + 'identifierString': '1.2.840.10045.4.3.4', + 'readableName': 'ecdsaWithSHA512', + 'identifier': [1, 2, 840, 10045, 4, 3, 4] + }, + { + 'identifierString': '0.9.2342.19200300.100.1.1', + 'readableName': 'UID', + 'identifier': [0, 9, 2342, 19200300, 100, 1, 1] + }, + { + 'identifierString': '1.2.840.113549.1.9.1', + 'readableName': 'emailAddress', + 'identifier': [1, 2, 840, 113549, 1, 9, 1] + }, + { + 'identifierString': '2.5.4.26', + 'readableName': 'registeredAddress', + 'identifier': [2, 5, 4, 26] + }, + { + 'identifierString': '2.16.840.1.114412.1.1', + 'readableName': 'digiCertOVCert (Digicert CA policy)', + 'identifier': [2, 16, 840, 1, 114412, 1, 1] + }, + { + 'identifierString': '2.23.140.1.2.2', + 'readableName': 'organization-validated', + 'identifier': [2, 23, 140, 1, 2, 2] + } +]; diff --git a/pointycastle/lib/asn1/pkcs/pkcs1/asn1_digest_info.dart b/pointycastle/lib/asn1/pkcs/pkcs1/asn1_digest_info.dart new file mode 100644 index 0000000..ae4d3a7 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs1/asn1_digest_info.dart @@ -0,0 +1,42 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// DigestInfo ::= SEQUENCE { +/// digestAlgorithm DigestAlgorithmIdentifier, +/// digest Digest +/// } +/// +/// Digest ::= OCTET STRING +///``` +/// +class ASN1DigestInfo extends ASN1Object { + late ASN1AlgorithmIdentifier digestAlgorithm; + late Uint8List digest; + + ASN1DigestInfo(this.digest, this.digestAlgorithm); + + ASN1DigestInfo.fromSequence(ASN1Sequence seq) { + if (seq.elements!.length != 2) { + throw ArgumentError('Sequence has not enough elements'); + } + digestAlgorithm = ASN1AlgorithmIdentifier.fromSequence( + seq.elements!.elementAt(0) as ASN1Sequence); + var o = seq.elements!.elementAt(1) as ASN1OctetString; + if (o.valueBytes != null) { + digest = o.valueBytes!; + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [ + digestAlgorithm, + ASN1OctetString(octets: digest), + ]); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request.dart b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request.dart new file mode 100644 index 0000000..afe1970 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request.dart @@ -0,0 +1,52 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// CertificationRequest ::= SEQUENCE { +/// certificationRequestInfo CertificationRequestInfo, +/// signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }}, +/// signature BIT STRING +/// } +///``` +/// +class ASN1CertificationRequest extends ASN1Object { + late ASN1Object certificationRequestInfo; + late ASN1AlgorithmIdentifier signatureAlgorithm; + late ASN1BitString signature; + + ASN1CertificationRequest( + this.certificationRequestInfo, + this.signatureAlgorithm, + this.signature, + ); + + ASN1CertificationRequest.fromSequence(ASN1Sequence seq) { + if (seq.elements == null || seq.elements!.length != 3) { + throw ArgumentError(''); + } + if (seq.elements!.elementAt(0) is! ASN1Sequence) { + throw ArgumentError('Element at index 0 has to be ASN1Sequence'); + } + if (seq.elements!.elementAt(1) is! ASN1Sequence) { + throw ArgumentError('Element at index 1 has to be ASN1Sequence'); + } + if (seq.elements!.elementAt(2) is! ASN1BitString) { + throw ArgumentError('Element at index 2 has to be ASN1BitString'); + } + certificationRequestInfo = seq.elements!.elementAt(0); + signatureAlgorithm = ASN1AlgorithmIdentifier.fromSequence( + seq.elements!.elementAt(1) as ASN1Sequence); + signature = seq.elements!.elementAt(2) as ASN1BitString; + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence( + elements: [certificationRequestInfo, signatureAlgorithm, signature]); + + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request_info.dart b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request_info.dart new file mode 100644 index 0000000..ff7e966 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_certification_request_info.dart @@ -0,0 +1,66 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// CertificationRequestInfo ::= SEQUENCE { +/// version INTEGER { v1(0) } (v1,...), +/// subject Name, +/// subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }}, +/// attributes [0] Attributes{{ CRIAttributes }} +/// } +///``` +/// +class ASN1CertificationRequestInfo extends ASN1Object { + /// The version. The default should be 0 + late ASN1Integer version; + + /// The distinguished name of the certificate subject + late ASN1Name subject; + + /// Information about the public key being certified. + late ASN1SubjectPublicKeyInfo subjectPKInfo; + + /// Collection of attributes providing additional information about the subject of the certificate. + ASN1Object? attributes; + + ASN1CertificationRequestInfo( + this.version, + this.subject, + this.subjectPKInfo, { + this.attributes, + }); + + ASN1CertificationRequestInfo.fromSequence(ASN1Sequence seq) { + if (seq.elements == null || seq.elements!.length != 3) { + throw ArgumentError(''); + } + if (seq.elements!.elementAt(0) is! ASN1Integer) { + throw ArgumentError('Element at index 0 has to be ASN1Integer'); + } + version = seq.elements!.elementAt(0) as ASN1Integer; + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence( + elements: [version, subject, subjectPKInfo, _getWrapper()]); + + return tmp.encode(encodingRule: encodingRule); + } + + ASN1Object _getWrapper() { + var wrapper = ASN1Object(tag: 0xA0); + if (attributes != null) { + var contentBytes = attributes!.encode(); + wrapper.valueBytes = contentBytes; + wrapper.valueByteLength = contentBytes.length; + } else { + wrapper.valueBytes = Uint8List(0); + wrapper.valueByteLength = 0; + } + return wrapper; + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs10/asn1_subject_public_key_info.dart b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_subject_public_key_info.dart new file mode 100644 index 0000000..4400022 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs10/asn1_subject_public_key_info.dart @@ -0,0 +1,48 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE { +/// algorithm AlgorithmIdentifier {{IOSet}}, +/// subjectPublicKey BIT STRING +/// } +///``` +/// +class ASN1SubjectPublicKeyInfo extends ASN1Object { + late ASN1AlgorithmIdentifier algorithm; + late ASN1BitString subjectPublicKey; + + ASN1SubjectPublicKeyInfo( + this.algorithm, + this.subjectPublicKey, + ); + + ASN1SubjectPublicKeyInfo.fromSequence(ASN1Sequence seq) { + if (seq.elements == null || seq.elements!.length != 2) { + throw ArgumentError(''); + } + if (seq.elements!.elementAt(0) is! ASN1Sequence) { + throw ArgumentError('Element at index 0 has to be ASN1Sequence'); + } + if (seq.elements!.elementAt(1) is! ASN1BitString) { + throw ArgumentError('Element at index 1 has to be ASN1BitString'); + } + algorithm = ASN1AlgorithmIdentifier.fromSequence( + seq.elements!.elementAt(0) as ASN1Sequence); + subjectPublicKey = seq.elements!.elementAt(1) as ASN1BitString; + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence( + elements: [ + algorithm, + subjectPublicKey, + ], + ); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_authenticated_safe.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_authenticated_safe.dart new file mode 100644 index 0000000..7874bc0 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_authenticated_safe.dart @@ -0,0 +1,31 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +/// Taken from [RFC 7292](https://www.rfc-editor.org/rfc/rfc7292#page-10). +///``` +/// AuthenticatedSafe ::= SEQUENCE OF ContentInfo +///``` +/// +class ASN1AuthenticatedSafe extends ASN1Object { + late List info; + + ASN1AuthenticatedSafe(this.info); + + ASN1AuthenticatedSafe.fromSequence(ASN1Sequence seq) { + info = []; + if (seq.elements != null) { + for (var element in seq.elements!) { + info.add(ASN1ContentInfo.fromSequence(element as ASN1Sequence)); + } + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: info); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_cert_bag.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_cert_bag.dart new file mode 100644 index 0000000..fef3c6b --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_cert_bag.dart @@ -0,0 +1,88 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// CertBag ::= SEQUENCE { +/// certId BAG-TYPE.&id ({CertTypes}), +/// certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId}) +/// } +///``` +/// +class ASN1CertBag extends ASN1Object { + /// + /// Possible objectIdentifier : + /// * 1.2.840.113549.1.9.22.1 (x509Certificate) + /// * 1.2.840.113549.1.9.22.2 (sdsiCertificate) + /// + late ASN1ObjectIdentifier certId; + + /// + /// Possible objects : + /// * x509Certificate => [ASN1OctetString] + /// * sdsiCertificate => [ASN1IA5String] + /// + late ASN1Object certValue; + + ASN1CertBag(this.certId, this.certValue); + + /// + /// Constructor to create the CertBag for a X509 Certificate. + /// + ASN1CertBag.forX509Certificate(ASN1OctetString this.certValue) { + certId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.9.22.1'); + } + + /// + /// Constructor to create the CertBag for a SDSI Certificate. + /// + ASN1CertBag.forSdsiCertificate(ASN1IA5String this.certValue) { + certId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.9.22.2'); + } + + /// + /// Creates a CertBag object from the given sequence consisting of two elements : + /// * ASN1ObjectIdentifier + /// * ASN1OctetString or ASN1IA5String + /// + ASN1CertBag.fromSequence(ASN1Sequence seq) { + certId = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + if (seq.elements!.length == 2) { + var el = seq.elements!.elementAt(1); + if (el.tag == 0xA0) { + certValue = ASN1Parser(el.valueBytes).nextObject(); + } else { + certValue = el; + } + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var wrapper = _getWrapper(); + var tmp = ASN1Sequence(elements: [ + certId, + wrapper, + ]); + return tmp.encode(encodingRule: encodingRule); + } + + ASN1Object _getWrapper() { + var wrapper = ASN1Object(tag: 0xA0); + var contentBytes = certValue.encode(); + wrapper.valueBytes = contentBytes; + wrapper.valueByteLength = contentBytes.length; + return wrapper; + } + + ASN1CertBag.fromX509Pem(String pem) { + var bytes = ASN1Utils.getBytesFromPEMString(pem); + certValue = ASN1OctetString(octets: bytes); + certId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.9.22.1'); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_key_bag.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_key_bag.dart new file mode 100644 index 0000000..c5a8601 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_key_bag.dart @@ -0,0 +1,19 @@ +import 'dart:typed_data'; +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// KeyBag ::= PrivateKeyInfo +///``` +/// +class ASN1KeyBag extends ASN1Object { + ASN1PrivateKeyInfo privateKeyInfo; + + ASN1KeyBag(this.privateKeyInfo); + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + return privateKeyInfo.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_mac_data.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_mac_data.dart new file mode 100644 index 0000000..f44c8f9 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_mac_data.dart @@ -0,0 +1,47 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// MacData ::= SEQUENCE { +/// mac DigestInfo, +/// macSalt OCTET STRING, +/// iterations INTEGER DEFAULT 1 +/// } +///``` +/// +class ASN1MacData extends ASN1Object { + late ASN1DigestInfo mac; + late Uint8List macSalt; + late BigInt iterationCount; + + ASN1MacData(this.mac, this.macSalt, this.iterationCount); + + ASN1MacData.fromSequence(ASN1Sequence seq) { + if (seq.elements!.length != 3) { + throw ArgumentError('Sequence has not enough elements'); + } + mac = + ASN1DigestInfo.fromSequence(seq.elements!.elementAt(0) as ASN1Sequence); + var o = seq.elements!.elementAt(1) as ASN1OctetString; + if (o.valueBytes != null) { + macSalt = o.valueBytes!; + } + var i = seq.elements!.elementAt(2) as ASN1Integer; + if (i.integer != null) { + iterationCount = i.integer!; + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [ + mac, + ASN1OctetString(octets: macSalt), + ASN1Integer(iterationCount), + ]); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pfx.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pfx.dart new file mode 100644 index 0000000..3710826 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pfx.dart @@ -0,0 +1,52 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// PFX ::= SEQUENCE { +/// version INTEGER {v3(3)}(v3,...), +/// authSafe ContentInfo, +/// macData MacData OPTIONAL +/// } +///``` +/// +class ASN1Pfx extends ASN1Object { + late ASN1Integer version; + late ASN1ContentInfo authSafe; + ASN1MacData? macData; + + ASN1Pfx(this.version, this.authSafe, {this.macData}); + + /// + /// Creates an instance of [PFX] from the given [sequence]. The sequence must have at least 2 elements. + /// + ASN1Pfx.fromSequence(ASN1Sequence seq) { + if (seq.elements == null || seq.elements!.isEmpty) { + throw ArgumentError('Empty sequence'); + } + if (seq.elements!.length == 1) { + throw ArgumentError('Sequence has not enough elements'); + } + version = seq.elements!.elementAt(0) as ASN1Integer; + if (version.integer!.toInt() != 3) { + throw ArgumentError('Wrong version for PFX PDU'); + } + authSafe = ASN1ContentInfo.fromSequence( + seq.elements!.elementAt(1) as ASN1Sequence); + if (seq.elements!.length == 3) { + macData = + ASN1MacData.fromSequence(seq.elements!.elementAt(2) as ASN1Sequence); + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [version, authSafe]); + if (macData != null) { + tmp.add(macData!); + } + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pkcs12_attribute.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pkcs12_attribute.dart new file mode 100644 index 0000000..c52381a --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_pkcs12_attribute.dart @@ -0,0 +1,58 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// PKCS12Attribute ::= SEQUENCE { +/// attrId ATTRIBUTE.&id ({PKCS12AttrSet}), +/// attrValues SET OF ATTRIBUTE.&Type ({PKCS12AttrSet}{@attrId}) +/// } +///``` +/// +class ASN1Pkcs12Attribute extends ASN1Object { + /// + /// Defines the type of the attribute. + /// + /// Possible objectIdentifier : + /// * 1.2.840.113549.1.9.20 (friendlyName) + /// * 1.2.840.113549.1.9.21 (localKeyID) + /// + /// See https://www.rfc-editor.org/rfc/rfc2985#section-5 for all possible attribute types. + /// + late ASN1ObjectIdentifier attrId; + + /// + /// ASN1Set containing the values, depending on the [attrId]. + /// + late ASN1Set attrValues; + + ASN1Pkcs12Attribute(this.attrId, this.attrValues); + + /// + /// Creates an instance of Attribute for friendlyName with the given [name]. + /// + ASN1Pkcs12Attribute.friendlyName(String name) { + attrId = ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.9.20'); + var bmpString = ASN1BMPString(stringValue: name); + attrValues = ASN1Set(elements: [bmpString]); + } + + /// + /// Creates an instance of Attribute for localKeyID with the given [octets]. + /// + ASN1Pkcs12Attribute.localKeyID(Uint8List octets) { + //attrId = ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.9.21'); + attrId = ASN1ObjectIdentifier.fromBytes(Uint8List.fromList( + [0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x15])); + var octetString = ASN1OctetString(octets: octets); + attrValues = ASN1Set(elements: [octetString]); + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [attrId, attrValues]); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_bag.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_bag.dart new file mode 100644 index 0000000..70816b4 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_bag.dart @@ -0,0 +1,93 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// SafeBag ::= SEQUENCE { +/// bagId BAG-TYPE.&id ({PKCS12BagSet}) +/// bagValue [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}), +/// bagAttributes SET OF PKCS12Attribute OPTIONAL +/// } +///``` +/// +class ASN1SafeBag extends ASN1Object { + /// + /// Describes the bag type. Possible objectIdentifier : + /// + /// * 1.2.840.113549.1.12.10.1.1 (keyBag) + /// * 1.2.840.113549.1.12.10.1.2 (pkcs-8ShroudedKeyBag) + /// * 1.2.840.113549.1.12.10.1.3 (certBag) + /// * 1.2.840.113549.1.12.10.1.4 (crlBag) + /// * 1.2.840.113549.1.12.10.1.5 (secretBag) + /// * 1.2.840.113549.1.12.10.1.6 (safeContentsBag) + /// + late ASN1ObjectIdentifier bagId; + late ASN1Object bagValue; + ASN1Set? bagAttributes; + + ASN1SafeBag(this.bagId, this.bagValue, {this.bagAttributes}); + + /// + /// Constructor to create the SafeBag for a pkcs-8ShroudedKeyBag. + /// + ASN1SafeBag.forPkcs8ShroudedKeyBag(this.bagValue, {this.bagAttributes}) { + bagId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.2'); + } + + /// + /// Constructor to create the SafeBag for a certBag. + /// + ASN1SafeBag.forCertBag(this.bagValue, {this.bagAttributes}) { + bagId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.3'); + } + + /// + /// Constructor to create the SafeBag for a [KeyBag] holding a [PrivateKeyInfo]. + /// + ASN1SafeBag.forKeyBag(this.bagValue, {this.bagAttributes}) { + bagId = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.1'); + } + + /// + /// Creates a SafeBag object from the given sequence consisting of up to three elements : + /// * [ASN1ObjectIdentifier] + /// * [EncryptedPrivateKeyInfo] or [CertBag] + /// * [ASN1Set] (OPTIONAL) + /// + ASN1SafeBag.fromSequence(ASN1Sequence seq) { + bagId = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + if (seq.elements!.length >= 2) { + var el = seq.elements!.elementAt(1); + if (el.tag == 0xA0) { + bagValue = ASN1Parser(el.valueBytes).nextObject(); + } else { + bagValue = el; + } + } + if (seq.elements!.length == 3) { + bagAttributes = seq.elements!.elementAt(2) as ASN1Set; + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [bagId, _getWrapper()]); + if (bagAttributes != null) { + tmp.add(bagAttributes!); + } + return tmp.encode(encodingRule: encodingRule); + } + + ASN1Object _getWrapper() { + var wrapper = ASN1Object(tag: 0xA0); + var contentBytes = bagValue.encode(); + wrapper.valueBytes = contentBytes; + wrapper.valueByteLength = contentBytes.length; + return wrapper; + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_contents.dart b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_contents.dart new file mode 100644 index 0000000..54aea59 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs12/asn1_safe_contents.dart @@ -0,0 +1,40 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// SafeContents ::= SEQUENCE OF SafeBag +///``` +/// +class ASN1SafeContents extends ASN1Object { + /// + /// The safebags to store. + /// + late List safeBags; + + ASN1SafeContents(this.safeBags); + + /// + /// Creates a SafeContents object from the given sequence consisting of [SafeBag] or [ASN1Sequence]. + /// + ASN1SafeContents.fromSequence(ASN1Sequence seq) { + safeBags = []; + if (seq.elements != null) { + for (var element in seq.elements!) { + if (element is ASN1SafeBag) { + safeBags.add(element); + } else if (element is ASN1Sequence) { + safeBags.add(ASN1SafeBag.fromSequence(element)); + } + } + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: safeBags); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs7/asn1_content_info.dart b/pointycastle/lib/asn1/pkcs/pkcs7/asn1_content_info.dart new file mode 100644 index 0000000..150fa49 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs7/asn1_content_info.dart @@ -0,0 +1,65 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +/// +/// ``` +/// ContentInfo ::= SEQUENCE { +/// contentType ContentType, +/// content +/// [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL } +/// ``` +/// +class ASN1ContentInfo extends ASN1Object { + late ASN1ObjectIdentifier contentType; + ASN1Object? content; + + ASN1ContentInfo(this.contentType, {this.content}); + + ASN1ContentInfo.fromSequence(ASN1Sequence seq) { + contentType = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + if (seq.elements!.length == 2) { + var el = seq.elements!.elementAt(1); + if (el.tag == 0xA0) { + content = ASN1Parser(el.valueBytes).nextObject(); + } else { + content = el; + } + } + } + + ASN1ContentInfo.forData(this.content) { + contentType = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.7.1'); + } + + ASN1ContentInfo.forEncryptedData(this.content) { + contentType = + ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.7.6'); + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var wrapper = _getWrapper(); + var tmp = ASN1Sequence(elements: [ + contentType, + wrapper, + ]); + return tmp.encode(encodingRule: encodingRule); + } + + ASN1Object _getWrapper() { + var wrapper = ASN1Object(tag: 0xA0); + if (content != null) { + var contentBytes = content!.encode(); + wrapper.valueBytes = contentBytes; + wrapper.valueByteLength = contentBytes.length; + } else { + wrapper.valueBytes = Uint8List(0); + wrapper.valueByteLength = 0; + } + return wrapper; + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs7/asn1_encrypted_content_info.dart b/pointycastle/lib/asn1/pkcs/pkcs7/asn1_encrypted_content_info.dart new file mode 100644 index 0000000..f3f444a --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs7/asn1_encrypted_content_info.dart @@ -0,0 +1,67 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; +import 'package:pointycastle/pointycastle.dart'; + +/// +///``` +/// EncryptedContentInfo ::= SEQUENCE { +/// contentType ContentType, +/// contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier, +/// encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL +/// } +///``` +/// +class ASN1EncryptedContentInfo extends ASN1Object { + late ASN1ObjectIdentifier contentType; + late ASN1AlgorithmIdentifier contentEncryptionAlgorithm; + Uint8List? encryptedContent; + + ASN1EncryptedContentInfo(this.contentType, this.contentEncryptionAlgorithm, + {this.encryptedContent}); + + ASN1EncryptedContentInfo.fromSequence(ASN1Sequence seq) { + contentType = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + if (seq.elements!.length >= 2) { + var el = seq.elements!.elementAt(1); + if (el is ASN1Sequence) { + contentEncryptionAlgorithm = ASN1AlgorithmIdentifier.fromSequence(el); + } + } + if (seq.elements!.length >= 3) { + var asn1Obj = seq.elements!.elementAt(2); + encryptedContent = asn1Obj.valueBytes; + } + } + + ASN1EncryptedContentInfo.forData( + this.contentEncryptionAlgorithm, this.encryptedContent) { + //contentType = + // ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.7.1'); + contentType = ASN1ObjectIdentifier.fromBytes( + Uint8List.fromList( + [0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01]), + ); + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var wrapper = _getWrapper(); + var tmp = ASN1Sequence(elements: [ + contentType, + contentEncryptionAlgorithm, + wrapper, + ]); + return tmp.encode(encodingRule: encodingRule); + } + + ASN1Object _getWrapper() { + var wrapper = ASN1Object(tag: 0x80); + if (encryptedContent != null) { + wrapper.valueBytes = encryptedContent; + wrapper.valueByteLength = encryptedContent!.length; + } + return wrapper; + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_data.dart b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_data.dart new file mode 100644 index 0000000..3b67c88 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_data.dart @@ -0,0 +1,38 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// EncryptedData ::= SEQUENCE { +/// version Version, +/// encryptedContentInfo EncryptedContentInfo +/// } +///``` +/// +class ASN1EncryptedData extends ASN1Object { + ASN1Integer version = ASN1Integer.fromtInt(0); + late ASN1EncryptedContentInfo encryptedContentInfo; + + ASN1EncryptedData(this.encryptedContentInfo); + + ASN1EncryptedData.fromSequence(ASN1Sequence seq) { + version = seq.elements!.elementAt(0) as ASN1Integer; + if (seq.elements!.length >= 2) { + var el = seq.elements!.elementAt(1); + if (el is ASN1Sequence) { + encryptedContentInfo = ASN1EncryptedContentInfo.fromSequence(el); + } + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [ + version, + encryptedContentInfo, + ]); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_private_key_info.dart b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_private_key_info.dart new file mode 100644 index 0000000..28393a4 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_encrypted_private_key_info.dart @@ -0,0 +1,3 @@ +import 'package:pointycastle/asn1.dart'; + +class ASN1EncryptedPrivateKeyInfo extends ASN1Object {} diff --git a/pointycastle/lib/asn1/pkcs/pkcs8/asn1_private_key_info.dart b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_private_key_info.dart new file mode 100644 index 0000000..d107201 --- /dev/null +++ b/pointycastle/lib/asn1/pkcs/pkcs8/asn1_private_key_info.dart @@ -0,0 +1,108 @@ +import 'dart:typed_data'; +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// PrivateKeyInfo ::= OneAsymmetricKey +/// +/// OneAsymmetricKey ::= SEQUENCE { +/// version Version, +/// privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, +/// privateKey PrivateKey, +/// attributes [0] Attributes OPTIONAL, +/// ..., +/// [[2: publicKey [1] PublicKey OPTIONAL ]], +/// ... +/// } +///``` +/// +class ASN1PrivateKeyInfo extends ASN1Object { + late ASN1Integer version; + late ASN1AlgorithmIdentifier privateKeyAlgorithm; + late ASN1OctetString privateKey; + ASN1Set? attributes; + ASN1BitString? publicKey; + + ASN1PrivateKeyInfo(this.version, this.privateKeyAlgorithm, this.privateKey); + + /// + /// Creates an instance of PrivateKeyInfo for the given [pem]. + /// The [pem] should represent a RSA private key in PKCS1. + /// + ASN1PrivateKeyInfo.fromPkcs1RsaPem(String pem) { + var bytes = ASN1Utils.getBytesFromPEMString(pem); + var asn1Parser = ASN1Parser(bytes); + var privateKeySeq = asn1Parser.nextObject(); + privateKey = ASN1OctetString(octets: privateKeySeq.encode()); + version = ASN1Integer.fromtInt(0); + privateKeyAlgorithm = + ASN1AlgorithmIdentifier.fromIdentifier('1.2.840.113549.1.1.1'); + } + + /// + /// Creates an instance of PrivateKeyInfo for the given [pem]. + /// The [pem] should represent a RSA private key in PKCS1. + /// + ASN1PrivateKeyInfo.fromEccPem(String pem) { + var bytes = ASN1Utils.getBytesFromPEMString(pem); + var private = ASN1Utils.ecPrivateKeyFromDerBytes(bytes); + var asn1Parser = ASN1Parser(bytes); + var privateKeySeq = asn1Parser.nextObject() as ASN1Sequence; + var seq = ASN1Sequence(elements: [ + privateKeySeq.elements!.elementAt(0), + privateKeySeq.elements!.elementAt(1), + privateKeySeq.elements!.elementAt(3), + ]); + + privateKey = ASN1OctetString(octets: seq.encode()); + + version = ASN1Integer.fromtInt(0); + var param = ASN1ObjectIdentifier.fromName(private.parameters!.domainName); + privateKeyAlgorithm = ASN1AlgorithmIdentifier.fromName( + 'ecPublicKey', + parameters: param, + ); + } + + /// + /// Creates an instance of PrivateKeyInfo for the given [pem]. + /// The [pem] should represent a RSA private key in PKCS8. + /// + ASN1PrivateKeyInfo.fromPkcs8RsaPem(String pem) { + var bytes = ASN1Utils.getBytesFromPEMString(pem); + var asn1Parser = ASN1Parser(bytes); + var privateKeySeq = asn1Parser.nextObject() as ASN1Sequence; + version = privateKeySeq.elements!.elementAt(0) as ASN1Integer; + privateKeyAlgorithm = ASN1AlgorithmIdentifier.fromSequence( + privateKeySeq.elements!.elementAt(1) as ASN1Sequence); + privateKey = privateKeySeq.elements!.elementAt(2) as ASN1OctetString; + } + + /// + /// Creates an instance of PrivateKeyInfo for the given [key]. + /// The [key] should represent a RSA private key in PKCS1 format as an [ASN1Sequence]. + /// + ASN1PrivateKeyInfo.fromPkcs1Rsa(ASN1Object key) { + privateKey = ASN1OctetString(octets: key.encode()); + version = ASN1Integer.fromtInt(0); + privateKeyAlgorithm = + ASN1AlgorithmIdentifier.fromIdentifier('1.2.840.113549.1.1.1'); + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [ + version, + privateKeyAlgorithm, + privateKey, + ]); + if (attributes != null) { + tmp.add(attributes!); + } + if (publicKey != null) { + tmp.add(publicKey!); + } + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_bit_string.dart b/pointycastle/lib/asn1/primitives/asn1_bit_string.dart new file mode 100644 index 0000000..f15e20e --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_bit_string.dart @@ -0,0 +1,166 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Bit String object +/// +class ASN1BitString extends ASN1Object { + /// + /// The decoded string value + /// + List? stringValues; + + /// + /// The unused bits + /// + int? unusedbits; + + /// + /// A list of elements. Only set if this ASN1IA5String is constructed, otherwhise null. + /// + /// + List? elements; + + /// + /// Create an [ASN1BitString] entity with the given [stringValues]. + /// + ASN1BitString( + {this.stringValues, this.elements, int tag = ASN1Tags.BIT_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1BitString] entity from the given [encodedBytes]. + /// + ASN1BitString.fromBytes(Uint8List super.bytes) : super.fromBytes() { + if (ASN1Utils.isConstructed(encodedBytes!.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + stringValues = []; + while (parser.hasNext()) { + var bitString = parser.nextObject() as ASN1BitString; + stringValues!.addAll(bitString.stringValues!); + elements!.add(bitString); + } + } else { + unusedbits = valueBytes![0]; + stringValues = valueBytes!.sublist(1); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// * [ASN1EncodingRule.ENCODING_BER_PADDED] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_BER_PADDED: + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + var b = []; + if (unusedbits != null) { + b.add(unusedbits!); + } else { + b.add(0); + } + b.addAll(stringValues!); + valueBytes = Uint8List.fromList(b); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements = []; + elements!.add(ASN1BitString(stringValues: stringValues)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('BIT STRING (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } + } else { + if (ASN1Utils.isASN1Tag(stringValues!.elementAt(0))) { + var sb2 = StringBuffer(); + for (var v in stringValues!) { + var s = v.toRadixString(2); + sb2.write(s); + } + var bits = sb2.toString(); + if (unusedbits != null) { + bits = bits.substring(0, bits.length - unusedbits!); + } + var parser = ASN1Parser(stringValues as Uint8List?); + var next = parser.nextObject(); + var dump = next.dump(spaces: spaces + dumpIndent); + sb.write('BIT STRING (${bits.length} bit)\n$dump'); + } else { + var sb2 = StringBuffer(); + for (var v in stringValues!) { + var s = v.toRadixString(2); + sb2.write(s); + } + var bits = sb2.toString(); + if (unusedbits != null) { + bits = bits.substring(0, bits.length - unusedbits!); + } + sb.write('BIT STRING (${bits.length} bit) '); + sb.write(bits); + } + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_bmp_string.dart b/pointycastle/lib/asn1/primitives/asn1_bmp_string.dart new file mode 100644 index 0000000..580d3c6 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_bmp_string.dart @@ -0,0 +1,143 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 IA5 String object +/// +class ASN1BMPString extends ASN1Object { + /// + /// The ascii decoded string value + /// + String? stringValue; + + /// + /// A list of elements. Only set if this ASN1BMPString is constructed, otherwhise null. + /// + List? elements; + + /// + /// Create an [ASN1BMPString] entity with the given [stringValue]. + /// + ASN1BMPString( + {this.stringValue, this.elements, int tag = ASN1Tags.BMP_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1BMPString] entity from the given [encodedBytes]. + /// + ASN1BMPString.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var sb = StringBuffer(); + while (parser.hasNext()) { + var bmpString = parser.nextObject() as ASN1BMPString; + sb.write(bmpString.stringValue); + elements!.add(bmpString); + } + stringValue = sb.toString(); + } else { + var utf16CodeUnits = []; + + for (var i = 0; i < valueBytes!.length; i += 2) { + // Combine High-Byte and Low-Byte to create a UTF-16 code unit + var highByte = valueBytes![i]; + var lowByte = valueBytes![i + 1]; + utf16CodeUnits.add((highByte << 8) | lowByte); + } + + // Decode UTF-16 code units into a Dart String + stringValue = String.fromCharCodes(utf16CodeUnits); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + // Kodierung in UTF-16-Big-Endian (UCS-2) + var l = []; + for (var codeUnit in stringValue!.codeUnits) { + l.add((codeUnit >> 8) & 0xFF); // High-Byte + l.add(codeUnit & 0xFF); // Low-Byte + } + valueBytes = Uint8List.fromList(l); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1BMPString(stringValue: stringValue)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('BMPString (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n $dump'); + } + } else { + sb.write('BMPString $stringValue'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_boolean.dart b/pointycastle/lib/asn1/primitives/asn1_boolean.dart new file mode 100644 index 0000000..6eb0056 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_boolean.dart @@ -0,0 +1,68 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Boolean object +/// +class ASN1Boolean extends ASN1Object { + bool? boolValue; + + /// + /// The byte to use for the TRUE value + /// + static const int BOOLEAN_TRUE_VALUE = 0xff; + + /// + /// The byte to use for the FALSE value + /// + static const int BOOLEAN_FALSE_VALUE = 0x00; + + /// + /// Creates an [ASN1Boolean] entity with the given [boolValue]. + /// + ASN1Boolean(this.boolValue, {int tag = ASN1Tags.BOOLEAN}) : super(tag: tag); + + /// + /// Creates an [ASN1Boolean] entity from the given [encodedBytes]. + /// + ASN1Boolean.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() { + boolValue = (valueBytes![0] == BOOLEAN_TRUE_VALUE); + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + valueByteLength = 1; + valueBytes = (boolValue == true) + ? Uint8List.fromList([BOOLEAN_TRUE_VALUE]) + : Uint8List.fromList([BOOLEAN_FALSE_VALUE]); + return super.encode(); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('BOOLEAN $boolValue'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_enumerated.dart b/pointycastle/lib/asn1/primitives/asn1_enumerated.dart new file mode 100644 index 0000000..d8fc673 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_enumerated.dart @@ -0,0 +1,18 @@ +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/primitives/asn1_integer.dart'; + +/// +/// An ASN1Enumerated object +/// +class ASN1Enumerated extends ASN1Integer { + /// + /// Create an [ASN1Enumerated] entity with the given integer [i]. + /// + ASN1Enumerated(int i, {int tag = ASN1Tags.ENUMERATED}) + : super(BigInt.from(i), tag: tag); + + /// + /// Creates an [ASN1Enumerated] entity from the given [encodedBytes]. + /// + ASN1Enumerated.fromBytes(super.encodedBytes) : super.fromBytes(); +} diff --git a/pointycastle/lib/asn1/primitives/asn1_generalized_time.dart b/pointycastle/lib/asn1/primitives/asn1_generalized_time.dart new file mode 100644 index 0000000..58f75be --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_generalized_time.dart @@ -0,0 +1,79 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +class ASN1GeneralizedTime extends ASN1Object { + // The decoded date value + DateTime? dateTimeValue; + + /// + /// Create an [ASN1GeneralizedTime] entity with the given BigInt [dateTimeValue]. + /// + ASN1GeneralizedTime(this.dateTimeValue, {int tag = ASN1Tags.GENERALIZED_TIME}) + : super(tag: tag); + + /// + /// Creates an [ASN1GeneralizedTime] entity from the given [encodedBytes]. + /// + ASN1GeneralizedTime.fromBytes(Uint8List super.bytes) : super.fromBytes() { + var octets = valueBytes!; + var stringValue = ascii.decode(octets); + var year = stringValue.substring(0, 4); + var month = stringValue.substring(4, 6); + var day = stringValue.substring(6, 8); + var hour = stringValue.substring(8, 10); + var minute = stringValue.substring(10, 12); + var second = stringValue.substring(12, 14); + if (stringValue.length > 14) { + var timeZone = stringValue.substring(14, stringValue.length); + dateTimeValue = + DateTime.parse('$year-$month-$day $hour:$minute:$second$timeZone'); + } else { + dateTimeValue = DateTime.parse('$year-$month-$day $hour:$minute:$second'); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + var utc = dateTimeValue!.toUtc(); + var year = utc.year.toString(); + var month = utc.month.toString(); + var day = utc.day.toString(); + var hour = utc.hour.toString(); + var minute = utc.minute.toString(); + var second = utc.second.toString(); + // Encode string to YYMMDDhhmm[ss]Z + var utcString = '$year$month$day$hour$minute${second}Z'; + valueBytes = ascii.encode(utcString); + valueByteLength = valueBytes!.length; + return super.encode(); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('GENERALIZEDTIME ${dateTimeValue!.toIso8601String()}'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_ia5_string.dart b/pointycastle/lib/asn1/primitives/asn1_ia5_string.dart new file mode 100644 index 0000000..7adcff6 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_ia5_string.dart @@ -0,0 +1,130 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 IA5 String object +/// +class ASN1IA5String extends ASN1Object { + /// + /// The ascii decoded string value + /// + String? stringValue; + + /// + /// A list of elements. Only set if this ASN1IA5String is constructed, otherwhise null. + /// + List? elements; + + /// + /// Create an [ASN1IA5String] entity with the given [stringValue]. + /// + ASN1IA5String( + {this.stringValue, this.elements, int tag = ASN1Tags.IA5_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1IA5String] entity from the given [encodedBytes]. + /// + ASN1IA5String.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var sb = StringBuffer(); + while (parser.hasNext()) { + var ia5String = parser.nextObject() as ASN1IA5String; + sb.write(ia5String.stringValue); + elements!.add(ia5String); + } + stringValue = sb.toString(); + } else { + stringValue = ascii.decode(valueBytes!); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + var octets = ascii.encode(stringValue!); + valueByteLength = octets.length; + valueBytes = Uint8List.fromList(octets); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1IA5String(stringValue: stringValue)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('IA5String (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n $dump'); + } + } else { + sb.write('IA5String $stringValue'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_integer.dart b/pointycastle/lib/asn1/primitives/asn1_integer.dart new file mode 100644 index 0000000..2e936eb --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_integer.dart @@ -0,0 +1,72 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; +import 'package:pointycastle/src/utils.dart'; + +class ASN1Integer extends ASN1Object { + /// + /// The integer value + /// + BigInt? integer; + + /// + /// Create an [ASN1Integer] entity with the given BigInt [integer]. + /// + ASN1Integer(this.integer, {int tag = ASN1Tags.INTEGER}) : super(tag: tag); + + /// + /// Create an [ASN1Integer] entity with the given int [i]. + /// + ASN1Integer.fromtInt(int i, {int tag = ASN1Tags.INTEGER}) : super(tag: tag) { + integer = BigInt.from(i); + } + + /// + /// Creates an [ASN1Integer] entity from the given [encodedBytes]. + /// + ASN1Integer.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() { + integer = decodeBigInt(valueBytes!); + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + if (integer!.bitLength == 0) { + if (integer == BigInt.from(-1)) { + valueBytes = Uint8List.fromList([0xff]); + } else { + valueBytes = Uint8List.fromList([0]); + } + } else { + valueBytes = encodeBigInt(integer); + } + valueByteLength = valueBytes!.length; + return super.encode(); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('INTEGER ${integer.toString().toUpperCase()}'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_null.dart b/pointycastle/lib/asn1/primitives/asn1_null.dart new file mode 100644 index 0000000..b626c40 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_null.dart @@ -0,0 +1,53 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Null object +/// +class ASN1Null extends ASN1Object { + /// + /// Creates an empty [ASN1Null] entity with only the [tag] set. + /// + ASN1Null({int tag = ASN1Tags.NULL}) : super(tag: tag); + + /// + /// Creates an [ASN1Null] entity from the given [encodedBytes]. + /// + ASN1Null.fromBytes(Uint8List super.encodedBytes) : super.fromBytes(); + + /// + /// Encode the [ASN1Null] to the byte representation. + /// + /// This basically returns **[0x05, 0x00]** or **[0x05, 0x81, 0x00]** depending on the [encodingRule] and will not call the *super.encode()* method. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + return Uint8List.fromList([tag!, 0x00]); + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + return Uint8List.fromList([tag!, 0x81, 0x00]); + default: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('NULL'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_object_identifier.dart b/pointycastle/lib/asn1/primitives/asn1_object_identifier.dart new file mode 100644 index 0000000..76b9ecd --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_object_identifier.dart @@ -0,0 +1,189 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/object_identifiers.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; +import 'package:pointycastle/asn1/unsupported_object_identifier_exception.dart'; + +class ASN1ObjectIdentifier extends ASN1Object { + /// + /// The object identifier integer values + /// + List? objectIdentifier; + + /// + /// The String representation of the [objectIdentifier] + /// + String? objectIdentifierAsString; + + /// + /// The readable representation of the [objectIdentifier] + /// + String? readableName; + + /// + /// Create an [ASN1ObjectIdentifier] entity with the given [objectIdentifier]. + /// + ASN1ObjectIdentifier(this.objectIdentifier, + {int tag = ASN1Tags.OBJECT_IDENTIFIER}) + : super(tag: tag) { + objectIdentifierAsString = objectIdentifier!.join('.'); + } + + /// + /// Creates an [ASN1ObjectIdentifier] entity from the given [encodedBytes]. + /// + ASN1ObjectIdentifier.fromBytes(Uint8List super.encodedBytes) + : super.fromBytes() { + var value = 0; + var first = true; + BigInt? bigValue; + var list = []; + var sb = StringBuffer(); + for (var element in valueBytes!) { + var b = element & 0xff; + if (value < 0x80000000000000) { + value = value * 128 + (b & 0x7f); + if ((b & 0x80) == 0) { + if (first) { + var truncated = value ~/ 40; + if (truncated < 2) { + list.add(truncated); + sb.write(truncated); + value -= truncated * 40; + } else { + list.add(2); + sb.write('2'); + value -= 80; + } + first = false; + } + list.add(value); + sb.write('.$value'); + value = 0; + } + } else { + bigValue ??= BigInt.from(value); + bigValue = bigValue << (7); + bigValue = bigValue | BigInt.from(b & 0x7f); + if ((b & 0x80) == 0) { + sb.write('.$bigValue'); + bigValue = null; + value = 0; + } + } + } + objectIdentifierAsString = sb.toString(); + objectIdentifier = Uint8List.fromList(list); + var identifier = + ObjectIdentifiers.getIdentifierByIdentifier(objectIdentifierAsString); + if (identifier != null) { + readableName = identifier['readableName'] as String?; + } + } + + /// + /// Creates an [ASN1ObjectIdentifier] entity from the given [name]. + /// + /// Example: + /// ``` + /// var oi = ASN1ObjectIdentifier.fromName('ecdsaWithSHA256'); + /// ``` + /// + /// Throws an [UnsupportedObjectIdentifierException] if the given [name] is not supported + /// + ASN1ObjectIdentifier.fromName(String name) { + tag = ASN1Tags.OBJECT_IDENTIFIER; + var identifier = ObjectIdentifiers.getIdentifierByName(name); + if (identifier == null) { + throw UnsupportedObjectIdentifierException(name); + } + objectIdentifierAsString = identifier['identifierString'] as String?; + readableName = identifier['readableName'] as String?; + objectIdentifier = identifier['identifier'] as List?; + } + + /// + /// Creates an [ASN1ObjectIdentifier] entity from the given [objectIdentifierAsString]. + /// + /// Example: + /// ``` + /// var oi = ASN1ObjectIdentifier.fromName('2.5.4.3'); + /// ``` + /// + /// Throws an [UnsupportedObjectIdentifierException] if the given [objectIdentifierAsString] is not supported + /// + ASN1ObjectIdentifier.fromIdentifierString(this.objectIdentifierAsString, + {int tag = ASN1Tags.OBJECT_IDENTIFIER}) + : super(tag: tag) { + var identifier = + ObjectIdentifiers.getIdentifierByIdentifier(objectIdentifierAsString); + if (identifier != null) { + objectIdentifierAsString = identifier['identifierString'] as String?; + readableName = identifier['readableName'] as String?; + objectIdentifier = identifier['identifier'] as List?; + } else { + var splittedInts = objectIdentifierAsString!.split('.'); + objectIdentifier = []; + for (var i in splittedInts) { + objectIdentifier!.add(int.parse(i)); + } + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + var oi = []; + oi.add(objectIdentifier![0] * 40 + objectIdentifier![1]); + + for (var ci = 2; ci < objectIdentifier!.length; ci++) { + var position = oi.length; + var v = objectIdentifier![ci]; + assert(v >= 0); + + var first = true; + do { + var remainder = v & 127; + v = v >> 7; + if (first) { + first = false; + } else { + remainder |= 0x80; + } + + oi.insert(position, remainder); + } while (v > 0); + } + + valueBytes = Uint8List.fromList(oi); + valueByteLength = oi.length; + + return super.encode(); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('OBJECT IDENTIFIER $objectIdentifierAsString $readableName'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_octet_string.dart b/pointycastle/lib/asn1/primitives/asn1_octet_string.dart new file mode 100644 index 0000000..d518655 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_octet_string.dart @@ -0,0 +1,133 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Octed String object +/// +class ASN1OctetString extends ASN1Object { + /// + /// The decoded string value + /// + Uint8List? octets; + + /// + /// A list of elements. Only set if this ASN1OctetString is constructed, otherwhise null. + /// + List? elements; + + /// + /// Create an [ASN1OctetString] entity with the given [octets]. + /// + ASN1OctetString({this.octets, this.elements, int tag = ASN1Tags.OCTET_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1OctetString] entity from the given [encodedBytes]. + /// + ASN1OctetString.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var bytes = []; + while (parser.hasNext()) { + var octetString = parser.nextObject() as ASN1OctetString; + bytes.addAll(octetString.octets!); + elements!.add(octetString); + } + octets = Uint8List.fromList(bytes); + } else { + octets = valueBytes; + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + valueByteLength = octets!.length; + valueBytes = octets; + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1OctetString(octets: octets)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('OCTET STRING (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n $dump'); + } + } else { + sb.write('OCTET STRING (${octets!.length} byte) '); + for (var o in octets!) { + var s = o.toRadixString(16).toUpperCase(); + if (s.length == 1) { + s = '0$s'; + } + sb.write(s); + } + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_printable_string.dart b/pointycastle/lib/asn1/primitives/asn1_printable_string.dart new file mode 100644 index 0000000..f12c897 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_printable_string.dart @@ -0,0 +1,130 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Printable String object +/// +class ASN1PrintableString extends ASN1Object { + /// + /// The ascii decoded string value + /// + String? stringValue; + + /// + /// A list of elements. Only set if this ASN1PrintableString is constructed, otherwhise null. + /// + List? elements; + + /// + /// Create an [ASN1PrintableString] entity with the given [stringValue]. + /// + ASN1PrintableString( + {this.stringValue, this.elements, int tag = ASN1Tags.PRINTABLE_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1PrintableString] entity from the given [encodedBytes]. + /// + ASN1PrintableString.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var sb = StringBuffer(); + while (parser.hasNext()) { + var printableString = parser.nextObject() as ASN1PrintableString; + sb.write(printableString.stringValue); + elements!.add(printableString); + } + stringValue = sb.toString(); + } else { + stringValue = ascii.decode(valueBytes!); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + var octets = ascii.encode(stringValue!); + valueByteLength = octets.length; + valueBytes = Uint8List.fromList(octets); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1PrintableString(stringValue: stringValue)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('PRINTABLE STRING (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } + } else { + sb.write('PRINTABLE STRING $stringValue'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_sequence.dart b/pointycastle/lib/asn1/primitives/asn1_sequence.dart new file mode 100644 index 0000000..325181a --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_sequence.dart @@ -0,0 +1,94 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +class ASN1Sequence extends ASN1Object { + /// + /// The decoded string value + /// + List? elements = []; + + /// + /// Create an [ASN1Sequence] entity with the given [elements]. + /// + ASN1Sequence({this.elements, int tag = ASN1Tags.SEQUENCE}) : super(tag: tag); + + /// + /// Creates an [ASN1Sequence] entity from the given [encodedBytes]. + /// + ASN1Sequence.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() { + elements = []; + var parser = ASN1Parser(valueBytes); + while (parser.hasNext()) { + elements!.add(parser.nextObject()); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + valueBytes = Uint8List(0); + valueByteLength = 0; + if (elements != null) { + valueByteLength = _childLength(); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + } + return super.encode(); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength() { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + return l; + } + + /// + /// Adds the given [obj] to the [elements] list. + /// + void add(ASN1Object obj) { + elements ??= []; + elements!.add(obj); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('SEQUENCE (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_set.dart b/pointycastle/lib/asn1/primitives/asn1_set.dart new file mode 100644 index 0000000..895c089 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_set.dart @@ -0,0 +1,94 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +class ASN1Set extends ASN1Object { + /// + /// The decoded string value + /// + List? elements; + + /// + /// Create an [ASN1Set] entity with the given [elements]. + /// + ASN1Set({this.elements, int tag = ASN1Tags.SET}) : super(tag: tag); + + /// + /// Creates an [ASN1Set] entity from the given [encodedBytes]. + /// + ASN1Set.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() { + elements = []; + var parser = ASN1Parser(valueBytes); + while (parser.hasNext()) { + elements!.add(parser.nextObject()); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + valueBytes = Uint8List(0); + valueByteLength = 0; + if (elements != null) { + valueByteLength = _childLength(); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + } + return super.encode(); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength() { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + return l; + } + + /// + /// Adds the given [obj] to the [elements] list. + /// + void add(ASN1Object obj) { + elements ??= []; + elements!.add(obj); + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('SET (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_teletext_string.dart b/pointycastle/lib/asn1/primitives/asn1_teletext_string.dart new file mode 100644 index 0000000..f4a6a34 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_teletext_string.dart @@ -0,0 +1,130 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Octed String object +/// +class ASN1TeletextString extends ASN1Object { + /// + /// The ascii decoded string value + /// + String? stringValue; + + /// + /// A list of elements. Only set if this ASN1TeletextString is constructed, otherwhise null. + /// + List? elements; + + /// + /// Create an [ASN1TeletextString] entity with the given [stringValue]. + /// + ASN1TeletextString( + {this.stringValue, this.elements, int tag = ASN1Tags.T61_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1TeletextString] entity from the given [encodedBytes]. + /// + ASN1TeletextString.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var sb = StringBuffer(); + while (parser.hasNext()) { + var printableString = parser.nextObject() as ASN1TeletextString; + sb.write(printableString.stringValue); + elements!.add(printableString); + } + stringValue = sb.toString(); + } else { + stringValue = ascii.decode(valueBytes!); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + var octets = ascii.encode(stringValue!); + valueByteLength = octets.length; + valueBytes = Uint8List.fromList(octets); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1TeletextString(stringValue: stringValue)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('T61STRING (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n $dump'); + } + } else { + sb.write('T61STRING $stringValue'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_utc_time.dart b/pointycastle/lib/asn1/primitives/asn1_utc_time.dart new file mode 100644 index 0000000..e160832 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_utc_time.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 Utc Time object +/// +/// **Note**: It is not recommended to use the UTC Time in the far future because this will not work anymore after the year 2075, +/// due to the fact that the UTC Time only uses 2 digits to represent the year.! +/// +/// Use the **GeneralizedTime** instead! +/// +class ASN1UtcTime extends ASN1Object { + /// + /// The decoded DateTime value + /// + DateTime? time; + + /// + /// Creates an [ASN1UtcTime] entity with the given [time]. + /// + ASN1UtcTime(this.time, {int tag = ASN1Tags.UTC_TIME}) : super(tag: tag); + + /// + /// Creates an [ASN1UtcTime] entity from the given [encodedBytes]. + /// + ASN1UtcTime.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() { + var stringValue = ascii.decode(valueBytes!); + var formatedStringValue = _format(stringValue); + time = DateTime.parse(formatedStringValue); + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + if (encodingRule != ASN1EncodingRule.ENCODING_DER) { + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + var utc = time!.toUtc(); + var year = utc.year.toString().substring(2).padLeft(2, '0'); + var month = utc.month.toString().padLeft(2, '0'); + var day = utc.day.toString().padLeft(2, '0'); + var hour = utc.hour.toString().padLeft(2, '0'); + var minute = utc.minute.toString().padLeft(2, '0'); + var second = utc.second.toString().padLeft(2, '0'); + // Encode string to YYMMDDhhmm[ss]Z + var utcString = '$year$month$day$hour$minute${second}Z'; + valueBytes = ascii.encode(utcString); + valueByteLength = valueBytes!.length; + return super.encode(); + } + + /// + /// Formats the given [stringValue]. + /// + /// This needs to be done, due to the fact that the UTC Time only uses 2 digits to represent the year. + /// To use the DateTime.parse() method we have to add the century. + /// + /// **Note**: It is not recommended to use the UTC Time in the future because this will not work anymore after the year 2075! Use the GeneralizedTime instead. + /// + String _format(String stringValue) { + var y2 = int.parse(stringValue.substring(0, 2)); + if (y2 > 75) { + stringValue = '19$stringValue'; + } else { + stringValue = '20$stringValue'; + } + return '${stringValue.substring(0, 8)}T${stringValue.substring(8)}'; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + sb.write('UTCTIME ${time!.toIso8601String()}'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/primitives/asn1_utf8_string.dart b/pointycastle/lib/asn1/primitives/asn1_utf8_string.dart new file mode 100644 index 0000000..8bb6b91 --- /dev/null +++ b/pointycastle/lib/asn1/primitives/asn1_utf8_string.dart @@ -0,0 +1,130 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_parser.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart'; + +/// +/// An ASN1 UTF8 String object +/// +class ASN1UTF8String extends ASN1Object { + /// + /// The decoded string value + /// + String? utf8StringValue; + + /// + /// A list of elements. Only set if this ASN1UTF8String is constructed, otherwhise null. + /// + List? elements; + + /// + /// Creates an empty [ASN1UTF8String] entity with only the [tag] set. + /// + ASN1UTF8String( + {this.utf8StringValue, this.elements, int tag = ASN1Tags.UTF8_STRING}) + : super(tag: tag); + + /// + /// Creates an [ASN1UTF8String] entity from the given [encodedBytes]. + /// + ASN1UTF8String.fromBytes(Uint8List encodedBytes) + : super.fromBytes(encodedBytes) { + if (ASN1Utils.isConstructed(encodedBytes.elementAt(0))) { + elements = []; + var parser = ASN1Parser(valueBytes); + var sb = StringBuffer(); + while (parser.hasNext()) { + var utf8String = parser.nextObject() as ASN1UTF8String; + sb.write(utf8String.utf8StringValue); + elements!.add(utf8String); + } + utf8StringValue = sb.toString(); + } else { + utf8StringValue = utf8.decode(valueBytes!); + } + } + + /// + /// Encodes this ASN1Object depending on the given [encodingRule] + /// + /// If no [ASN1EncodingRule] is given, ENCODING_DER will be used. + /// + /// Supported encoding rules are : + /// * [ASN1EncodingRule.ENCODING_DER] + /// * [ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED] + /// * [ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH] + /// + /// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported. + /// + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + switch (encodingRule) { + case ASN1EncodingRule.ENCODING_DER: + case ASN1EncodingRule.ENCODING_BER_LONG_LENGTH_FORM: + var octets = utf8.encode(utf8StringValue!); + valueByteLength = octets.length; + valueBytes = Uint8List.fromList(octets); + break; + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH: + case ASN1EncodingRule.ENCODING_BER_CONSTRUCTED: + valueByteLength = 0; + if (elements == null) { + elements!.add(ASN1UTF8String(utf8StringValue: utf8StringValue)); + } + valueByteLength = _childLength( + isIndefinite: encodingRule == + ASN1EncodingRule.ENCODING_BER_CONSTRUCTED_INDEFINITE_LENGTH); + valueBytes = Uint8List(valueByteLength!); + var i = 0; + for (var obj in elements!) { + var b = obj.encode(); + valueBytes!.setRange(i, i + b.length, b); + i += b.length; + } + break; + case ASN1EncodingRule.ENCODING_BER_PADDED: + throw UnsupportedAsn1EncodingRuleException(encodingRule); + } + + return super.encode(encodingRule: encodingRule); + } + + /// + /// Calculate encoded length of all children + /// + int _childLength({bool isIndefinite = false}) { + var l = 0; + for (var obj in elements!) { + l += obj.encode().length; + } + if (isIndefinite) { + return l + 2; + } + return l; + } + + @override + String dump({int spaces = 0}) { + var sb = StringBuffer(); + for (var i = 0; i < spaces; i++) { + sb.write(' '); + } + if (isConstructed!) { + sb.write('UTF8STRING (${elements!.length} elem)'); + for (var e in elements!) { + var dump = e.dump(spaces: spaces + dumpIndent); + sb.write('\n$dump'); + } + } else { + sb.write('UTF8STRING $utf8StringValue'); + } + return sb.toString(); + } +} diff --git a/pointycastle/lib/asn1/unsupported_asn1_encoding_rule_exception.dart b/pointycastle/lib/asn1/unsupported_asn1_encoding_rule_exception.dart new file mode 100644 index 0000000..2d4b81a --- /dev/null +++ b/pointycastle/lib/asn1/unsupported_asn1_encoding_rule_exception.dart @@ -0,0 +1,14 @@ +import 'package:pointycastle/asn1/asn1_encoding_rule.dart'; + +/// +/// Exception that indicates that the given [ASN1EncodingRule] is not supported +/// +class UnsupportedAsn1EncodingRuleException implements Exception { + ASN1EncodingRule rule; + + UnsupportedAsn1EncodingRuleException(this.rule); + + @override + String toString() => + 'UnsupportedAsn1EncodingRuleException: Encoding $rule is not supported by this ASN1Object.'; +} diff --git a/pointycastle/lib/asn1/unsupported_asn1_tag_exception.dart b/pointycastle/lib/asn1/unsupported_asn1_tag_exception.dart new file mode 100644 index 0000000..8c09fdb --- /dev/null +++ b/pointycastle/lib/asn1/unsupported_asn1_tag_exception.dart @@ -0,0 +1,12 @@ +/// +/// Exception that indicates that the given tag is not supported +/// +class UnsupportedASN1TagException implements Exception { + int tag; + + UnsupportedASN1TagException(this.tag); + + @override + String toString() => + 'UnsupportedASN1TagException: Tag $tag is not supported yet'; +} diff --git a/pointycastle/lib/asn1/unsupported_object_identifier_exception.dart b/pointycastle/lib/asn1/unsupported_object_identifier_exception.dart new file mode 100644 index 0000000..700e6ce --- /dev/null +++ b/pointycastle/lib/asn1/unsupported_object_identifier_exception.dart @@ -0,0 +1,12 @@ +/// +/// Exception that indicates that the given object identifier is not supported +/// +class UnsupportedObjectIdentifierException implements Exception { + String? oiString; + + UnsupportedObjectIdentifierException(this.oiString); + + @override + String toString() => + 'UnsupportedObjectIdentifierException: ObjectIdentifier $oiString is not supported yet'; +} diff --git a/pointycastle/lib/asn1/x501/asn1_attribute_type_and_value.dart b/pointycastle/lib/asn1/x501/asn1_attribute_type_and_value.dart new file mode 100644 index 0000000..7d7631c --- /dev/null +++ b/pointycastle/lib/asn1/x501/asn1_attribute_type_and_value.dart @@ -0,0 +1,59 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// AttributeTypeAndValue ::= SEQUENCE { +/// type AttributeType, +/// value AttributeValue +/// } +///``` +/// +class ASN1AttributeTypeAndValue extends ASN1Object { + late ASN1ObjectIdentifier type; + + /// + /// The value. Can be one of the following objects + /// * [ASN1TeletextString] + /// * [ASN1PrintableString] + /// * [ASN1UTF8String] + /// * [ASN1BMPString] + /// + late ASN1Object value; + + ASN1AttributeTypeAndValue(this.type, this.value); + + ASN1AttributeTypeAndValue.fromSequence(ASN1Sequence seq) { + if (seq.elements == null || seq.elements!.length != 2) { + throw ArgumentError(''); + } + if (seq.elements!.elementAt(0) is! ASN1ObjectIdentifier) { + throw ArgumentError('Element at index 0 has to be ASN1ObjectIdentifier'); + } + if (seq.elements!.elementAt(1) is ASN1TeletextString || + seq.elements!.elementAt(1) is ASN1TeletextString || + seq.elements!.elementAt(1) is ASN1UTF8String || + seq.elements!.elementAt(1) is ASN1BMPString) { + // VALID TYPES + } else { + throw ArgumentError( + 'Element at index 1 has to be ASN1TeletextString, ASN1TeletextString, ASN1UTF8String or ASN1BMPString'); + } + + type = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + value = seq.elements!.elementAt(1); + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence( + elements: [ + type, + value, + ], + ); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/x501/asn1_name.dart b/pointycastle/lib/asn1/x501/asn1_name.dart new file mode 100644 index 0000000..ec351b2 --- /dev/null +++ b/pointycastle/lib/asn1/x501/asn1_name.dart @@ -0,0 +1,26 @@ +import 'dart:typed_data'; +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// Name ::= CHOICE { -- only one possibility for now -- +/// rdnSequence RDNSequence +/// } +/// +/// RDNSequence ::= SEQUENCE OF RelativeDistinguishedName +///``` +/// +class ASN1Name extends ASN1Object { + late List rdnSequence; + + ASN1Name(this.rdnSequence); + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence( + elements: rdnSequence, + ); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/x501/asn1_rdn.dart b/pointycastle/lib/asn1/x501/asn1_rdn.dart new file mode 100644 index 0000000..75c8a84 --- /dev/null +++ b/pointycastle/lib/asn1/x501/asn1_rdn.dart @@ -0,0 +1,21 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue +///``` +/// +class ASN1RDN extends ASN1Object { + /// Values for the RDN. Elements should be of [AttributeTypeAndValue] + late ASN1Set values; + + ASN1RDN(this.values); + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + return values.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asn1/x509/asn1_algorithm_identifier.dart b/pointycastle/lib/asn1/x509/asn1_algorithm_identifier.dart new file mode 100644 index 0000000..025ac29 --- /dev/null +++ b/pointycastle/lib/asn1/x509/asn1_algorithm_identifier.dart @@ -0,0 +1,49 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; + +/// +///``` +/// AlgorithmIdentifier ::= SEQUENCE { +/// algorithm OBJECT IDENTIFIER, +/// parameters ANY DEFINED BY algorithm OPTIONAL +/// } +///``` +/// +class ASN1AlgorithmIdentifier extends ASN1Object { + late ASN1ObjectIdentifier algorithm; + ASN1Object? parameters; + + ASN1AlgorithmIdentifier(this.algorithm, {this.parameters}); + + /// + /// Creates a AlgorithmIdentifier instance from the given [identifier] like "1.3.14.3.2.26". + /// + ASN1AlgorithmIdentifier.fromIdentifier(String identifier, {this.parameters}) { + algorithm = ASN1ObjectIdentifier.fromIdentifierString(identifier); + } + + /// + /// Creates a AlgorithmIdentifier instance from the given [name] like "sha1". + /// + ASN1AlgorithmIdentifier.fromName(String name, {this.parameters}) { + algorithm = ASN1ObjectIdentifier.fromName(name); + } + + ASN1AlgorithmIdentifier.fromSequence(ASN1Sequence seq) { + algorithm = seq.elements!.elementAt(0) as ASN1ObjectIdentifier; + if (seq.elements!.length >= 2) { + parameters = seq.elements!.elementAt(1); + } + } + + @override + Uint8List encode( + {ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) { + var tmp = ASN1Sequence(elements: [ + algorithm, + parameters ?? ASN1Null(), + ]); + return tmp.encode(encodingRule: encodingRule); + } +} diff --git a/pointycastle/lib/asymmetric/api.dart b/pointycastle/lib/asymmetric/api.dart new file mode 100644 index 0000000..8805826 --- /dev/null +++ b/pointycastle/lib/asymmetric/api.dart @@ -0,0 +1,158 @@ +// See file LICENSE for more information. + +library api.asymmetric; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base class for asymmetric keys in RSA +abstract class RSAAsymmetricKey implements AsymmetricKey { + // The parameters of this key + final BigInt? modulus; + final BigInt? exponent; + + /// Create an asymmetric key for the given domain parameters + RSAAsymmetricKey(this.modulus, this.exponent); + + /// Get modulus [n] = p·q + BigInt? get n => modulus; +} + +/// Private keys in RSA +class RSAPrivateKey extends RSAAsymmetricKey implements PrivateKey { + // The secret prime factors of n + final BigInt? p; + final BigInt? q; + BigInt? _pubExp; + + /// Create an RSA private key for the given parameters. + /// + /// The optional public exponent parameter has been deprecated. It does not + /// have to be provided, because it can be calculated from the other values. + /// The optional parameter is retained for backward compatibility, but it + /// does not need to be provided. + + RSAPrivateKey(BigInt modulus, BigInt privateExponent, this.p, this.q, + [@Deprecated('Public exponent is calculated from the other values') + BigInt? publicExponent]) + : super(modulus, privateExponent) { + // Check RSA relationship between p, q and modulus hold true. + + if (p! * q! != modulus) { + throw ArgumentError.value('modulus inconsistent with RSA p and q'); + } + + // Calculate the correct RSA public exponent + + _pubExp = privateExponent.modInverse((p! - BigInt.one) * (q! - BigInt.one)); + + // If explicitly provided, the public exponent value must be correct. + if (publicExponent != null && publicExponent != _pubExp) { + throw ArgumentError( + 'public exponent inconsistent with RSA private exponent, p and q'); + } + } + + /// Get private exponent [d] = e^-1 + @Deprecated('Use privateExponent.') + BigInt? get d => exponent; + + /// Get the private exponent (d) + BigInt? get privateExponent => exponent; + + /// Get the public exponent (e) + BigInt? get publicExponent => _pubExp; + + /// Get the public exponent (e) + @Deprecated('Use publicExponent.') + BigInt? get pubExponent => publicExponent; + + @override + bool operator ==(Object other) { + if (other is RSAPrivateKey) { + return other.privateExponent == privateExponent && + other.modulus == modulus; + } + return false; + } + + @override + int get hashCode => modulus.hashCode + privateExponent.hashCode; +} + +/// Public keys in RSA +class RSAPublicKey extends RSAAsymmetricKey implements PublicKey { + /// Create an RSA public key for the given parameters. + RSAPublicKey(BigInt super.modulus, BigInt super.exponent); + + /// Get public exponent [e] + @Deprecated('Use get publicExponent') + BigInt? get e => exponent; + + /// Get the public exponent. + BigInt? get publicExponent => exponent; + + @override + bool operator ==(Object other) { + if (other is RSAPublicKey) { + return (other.modulus == modulus) && + (other.publicExponent == publicExponent); + } + return false; + } + + @override + int get hashCode => modulus.hashCode + publicExponent.hashCode; +} + +/// A [Signature] created with RSA. +class RSASignature implements Signature { + final Uint8List bytes; + + RSASignature(this.bytes); + + @override + String toString() => bytes.toString(); + @override + bool operator ==(Object other) { + if (other is! RSASignature) return false; + if (other.bytes.length != bytes.length) return false; + + for (var i = 0; i < bytes.length; i++) { + if (bytes[i] != other.bytes[i]) { + return false; + } + } + return true; + } + + @override + int get hashCode => bytes.hashCode; +} + +/// A [Signature] created with PSS. +class PSSSignature implements Signature { + final Uint8List bytes; + + PSSSignature(this.bytes); + + @override + String toString() => bytes.toString(); + + @override + bool operator ==(Object other) { + if (other is! PSSSignature) return false; + if (other.bytes.length != bytes.length) return false; + + for (var i = 0; i < bytes.length; i++) { + if (bytes[i] != other.bytes[i]) { + return false; + } + } + return true; + } + + @override + int get hashCode => bytes.hashCode; +} diff --git a/pointycastle/lib/asymmetric/ec_elgamal.dart b/pointycastle/lib/asymmetric/ec_elgamal.dart new file mode 100644 index 0000000..7d9f36c --- /dev/null +++ b/pointycastle/lib/asymmetric/ec_elgamal.dart @@ -0,0 +1,80 @@ +// See file LICENSE for more information. + +library impl.asymmetric.ecc.elgamal; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; + +BigInt _generateK(BigInt n, SecureRandom random) { + var nBitLength = n.bitLength; + BigInt k; + do { + k = random.nextBigInteger(nBitLength); + } while ((k == BigInt.zero) || (k.compareTo(n) >= 0)); + return k; +} + +SecureRandom _newSecureRandom() => FortunaRandom() + ..seed(KeyParameter(Platform.instance.platformEntropySource().getBytes(32))); + +/// The basic ElGamal encryptor using Elliptic Curve +class ECElGamalEncryptor implements ECEncryptor { + ECPublicKey? _key; + late SecureRandom _random; + + /// Process a single EC [point] using the basic ElGamal algorithm. + @override + ECPair encrypt(ECPoint point) { + if (_key == null) { + throw StateError('ECElGamalEncryptor is not initialised'); + } + var key = _key!; + var ec = key.parameters!; + var k = _generateK(ec.n, _random); + return ECPair( + (ec.G * k)!, + ((key.Q! * k)! + point)!, + ); + } + + @override + void init(CipherParameters params) { + AsymmetricKeyParameter akparams; + if (params is ParametersWithRandom) { + akparams = params.parameters as AsymmetricKeyParameter; + _random = params.random; + } else { + akparams = params as AsymmetricKeyParameter; + _random = _newSecureRandom(); + } + var k = akparams.key as ECAsymmetricKey; + if (k is! ECPublicKey) { + throw ArgumentError('ECPublicKey is required for encryption.'); + } + _key = k; + } +} + +/// The basic ElGamal decryptor using Elliptic Curve +class ECElGamalDecryptor implements ECDecryptor { + ECPrivateKey? _key; + + /// Decrypt an EC [pair] producing the original [ECPoint]. + @override + ECPoint decrypt(ECPair pair) { + if (_key == null) { + throw StateError('ECElGamalEncryptor is not initialised'); + } + return (pair.y - (pair.x * _key!.d)!)!; + } + + @override + void init(CipherParameters params) { + var akparams = params as AsymmetricKeyParameter; + var k = akparams.key as ECAsymmetricKey; + if (k is! ECPrivateKey) { + throw ArgumentError('ECPrivateKey is required for decryption.'); + } + _key = k; + } +} diff --git a/pointycastle/lib/asymmetric/oaep.dart b/pointycastle/lib/asymmetric/oaep.dart new file mode 100644 index 0000000..d8cfaf8 --- /dev/null +++ b/pointycastle/lib/asymmetric/oaep.dart @@ -0,0 +1,527 @@ +// See file LICENSE for more information. + +library impl.asymmetric_block_cipher.oeap; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/digests/sha1.dart'; +import 'package:pointycastle/digests/sha256.dart'; +import 'package:pointycastle/digests/sha512.dart'; +import 'package:pointycastle/random/fortuna_random.dart'; +import 'package:pointycastle/src/impl/base_asymmetric_block_cipher.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +typedef DigestFactory = Digest Function(); + +/// RSAES-OAEP v2.0 +/// +/// This implementation is based on the RSAES-OAEP (RSA Encryption Scheme - +/// Optimal Asymmetric Encryption Padding) as specified in section 7.1 of +/// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-7.1) +/// _PKCS #1: RSA Cryptography Specifications Version 2.0_. +/// +/// **Important:** this is **not** compatible with RSAES-OAEP v2.1 or later (as +/// specified in RFC 3447, RFC 8017, etc.) Those newer versions have an extra +/// 0x00 byte at the beginning of the encoded message (EM) that is passed +/// to the RSA encryption primitive. Therefore, this implementation is +/// incompatible with it, since this is an implementation of v2.0 which does +/// not have that 0x00 byte. A breaking change in the standard! +/// +/// Currently, this implementation has the following restrictions: +/// +/// - the hash function is hard-coded to be SHA-1 or SHA-256; +/// - the mask generation function is hard-coded to MGF1; and +/// - it cannot accept any _encoding parameters_ (that is, _P_ is always empty) + +class OAEPEncoding extends BaseAsymmetricBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + AsymmetricBlockCipher, + '/OAEP', + (_, final Match match) => () { + var underlyingCipher = AsymmetricBlockCipher(match.group(1)!); + return OAEPEncoding(underlyingCipher); + }); + + /// Hash function used by the EME-OAEP (Encoding Method for Encryption OAEP). + Digest hash; + + /// Hash function used by the MGF1 Mask Generation Function. + late Digest mgf1Hash; + + /// Default hash of the encoding parameters, + /// all zero octets + Uint8List defHash; + + /// The encoding params, or P, as specified in + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-7.1.1) + Uint8List? encodingParams; + + final AsymmetricBlockCipher _engine; + late SecureRandom _random; + late bool _forEncryption; + + OAEPEncoding._(DigestFactory digestFactory, this._engine, + [this.encodingParams]) + : hash = digestFactory(), + defHash = Uint8List(digestFactory().digestSize) { + digestFactory().doFinal(defHash, 0); + } + + factory OAEPEncoding(AsymmetricBlockCipher engine, + [Uint8List? encodingParams]) => + OAEPEncoding.withSHA1(engine, encodingParams); + + factory OAEPEncoding.withSHA1(AsymmetricBlockCipher engine, + [Uint8List? encodingParams]) => + OAEPEncoding._(() => SHA1Digest(), engine, encodingParams); + + factory OAEPEncoding.withSHA256(AsymmetricBlockCipher engine, + [Uint8List? encodingParams]) => + OAEPEncoding._(() => SHA256Digest(), engine, encodingParams); + + factory OAEPEncoding.withSHA512(AsymmetricBlockCipher engine, + [Uint8List? encodingParams]) => + OAEPEncoding._(() => SHA512Digest(), engine, encodingParams); + + factory OAEPEncoding.withCustomDigest( + DigestFactory digestFactory, AsymmetricBlockCipher engine, + [Uint8List? encodingParams]) => + OAEPEncoding._(digestFactory, engine, encodingParams); + + @override + String get algorithmName => '${_engine.algorithmName}/OAEP'; + + @override + void reset() {} + + Uint8List _seed() { + var seed = Platform.instance.platformEntropySource().getBytes(32); + return seed; + } + + // for compat cleaner translation from java source + Uint8List _arraycopy( + Uint8List src, int srcPos, Uint8List dest, int destPos, int length) { + dest.setRange( + destPos, destPos + length, src.sublist(srcPos, srcPos + length)); + return dest; + } + + @override + void init(bool forEncryption, CipherParameters params) { + AsymmetricKeyParameter akparams; + mgf1Hash = hash; + if (params is ParametersWithRandom) { + var paramswr = params; + _random = paramswr.random; + akparams = paramswr.parameters as AsymmetricKeyParameter; + } else { + _random = FortunaRandom(); + _random.seed(KeyParameter(_seed())); + akparams = params as AsymmetricKeyParameter; + } + _engine.init(forEncryption, akparams); + _forEncryption = forEncryption; + + // Check type of key provided is suitable + // Note: the _engine can't do this check, because the engine could be used + // for both encryption/decryption and signature/verification (which reverses + // the keys), so its `init` method accepts both types of keys. For example, + // [RSAEngine.init]. + + if (forEncryption) { + if (akparams.key is! PublicKey) { + throw ArgumentError.value( + 'OAEP encryption needs PublicKey: not ${akparams.key.runtimeType}'); + } + } else { + if (akparams.key is! PrivateKey) { + throw ArgumentError.value( + 'OAEP decryption needs PrivateKey: not ${akparams.key.runtimeType}'); + } + } + } + + @override + int get inputBlockSize { + var baseBlockSize = _engine.inputBlockSize; + if (_forEncryption) { + return baseBlockSize - 1 - 2 * defHash.length; + } else { + return baseBlockSize; + } + } + + @override + int get outputBlockSize { + var baseBlockSize = _engine.outputBlockSize; + if (_forEncryption) { + return baseBlockSize; + } else { + return baseBlockSize - 1 - (2 * defHash.length); + } + } + + @override + int processBlock( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (_forEncryption) { + return _encodeBlock(inp, inpOff, len, out, outOff); + } else { + return _decodeBlock(inp, inpOff, len, out, outOff); + } + } + + /// RSAES-OAEP encryption operation + /// + /// Implements the _RSA Encryption Scheme with Optimal Asymmetric Encryption + /// Padding_ (RSAES-OAEP) **encryption operation**. This encryption operation + /// combines the _Encoding Method for Encryption OAEP_ (EME-OAEP) + /// **encoding operation** with the _RSA Encryption Primitive_ (RSAEP). + /// + /// This method performs the EME-OAEP encoding operation, and then invokes its + /// [AsymmetricBlockCipher] engine to perform RSAEP to encrypt it. + /// + /// The RSAES-OAEP encryption operation is specified in section 7.1.1 of + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-7.1.1) and the + /// EME-OAEP encoding operation it uses is specified in section 9.1.1.1 of + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-9.1.1.1). + /// + /// The message to be encoded and encrypted is the octet string consisting of + /// [inpLen] bytes from [inp], starting at the [inpOff] offset. + /// + /// It returns the ciphertext. + + int _encodeBlock( + Uint8List inp, int inpOff, int inpLen, Uint8List out, int outOff) { + if (inpLen > inputBlockSize) { + throw ArgumentError('message too long'); + } + + // The numbered steps below correspond to the steps in RFC 2437. + // Names in _italics_ refers to names in the RFC 2437 and names in square + // brackets refers to variables in this code. + + // 3. Generate PS (padding string containing just zero octets) + // + // In this implementation, the length of PS is always zero. That is, there + // is no bytes in _PS_. + + // 4. Calculate _pHash_ = Hash(P) + // + // The result _pHash_ is stored into [pHash]. + // + // Note: If no encodingParams are set + // the [defHash] is used as is (which was initialized to be a hash of no + // bytes) + var pHash = + encodingParams != null ? hash.process(encodingParams!) : defHash; + + // 5. Calculate _DB_ = pHash || PS || 01 || M + // + // It is the concatenation of _pHash_, _PS_, 0x01 and the message. + // Note: RFC 2437 also includes 'other padding', but that is an error that + // does not appear in subsequent versions of PKCS #1 (e.g. RFC 3447). + // + // The result _DB_ is stored into [block] starting at offset _hLen_ to the + // end. + + var block = Uint8List(inputBlockSize + 1 + 2 * pHash.length); + + // M: copy the message into the end of the block. + // + // block.setRange(inpOff, block.length - inpLen, inp.sublist(inpLen)); + block = _arraycopy(inp, inpOff, block, block.length - inpLen, inpLen); + + // 01: add the sentinel byte + // + block[block.length - inpLen - 1] = 0x01; + + // PS: since a Uint8List is initialized with 0x00, PS is already zeroed + + // pHash: add the hash of the encoding params. + // + block = _arraycopy(pHash, 0, block, pHash.length, pHash.length); + + // 6. Generate a random octet string _seed_ of length _hLen_. + // + // The _seed_ is stored in [seed]. + + var seed = _random.nextBytes(pHash.length); + + // 7. Calculate _dbMask_ = MGF(seed, emLen - hLen) + // + // The _seed_ comes from [seed]. The result _dbMask_ is stored into [mask]. + + var mask = _maskGeneratorFunction1( + seed, 0, seed.length, block.length - pHash.length); + + // 8. Calculate _maskedDB_ = DB XOR dbMask + // + // The _DB_ comes from [block], starting at offset _hLen_ to the end. The + // _dbMask_ comes from [mask]. The result _maskedDB_ is stored into [block] + // starting at offset _hLen_ to the end (overwriting the _DB_). + + for (var i = pHash.length; i != block.length; i++) { + block[i] ^= mask[i - pHash.length]; + } + + // Temporally store the _seed_ in the first _hLen_ bytes of the [block] + // so it can be used later. + + block = _arraycopy(seed, 0, block, 0, pHash.length); + + // 9. Calculate _seedMask_ = MGF(maskedDB, hLen) + // + // The _maskedDB_ comes from [block], starting at offset _hLen_ to the end. + // The result _seedMask_ is stored into [mask] (replacing the _dbMask_ which + // is no longer needed). + + mask = _maskGeneratorFunction1( + block, pHash.length, block.length - pHash.length, pHash.length); + + // 10. Calculate _maskedSeed_ = seed XOR seedMask + // + // The _seed_ comes from [block], the first _hLen_ bytes (where it was + // temporally stored). The _seedMask_ comes from [mask]. The result + // _maskedSeed_ is stored into [block], the first _hLen_ bytes (overwriting + // the temporary _seed_). + + for (var i = 0; i != pHash.length; i++) { + block[i] ^= mask[i]; + } + + // 11. Calculate _EM_ = maskedSeed || maskedDB + // + // The [block] already contains the concatenated value, since they were both + // calculated in the first. + + // EME-OAEP-ENCODE completed. + + // Use the [_engine] to finish the RSAES-OAEP. That is, it will convert the + // _EM_ into an integer, apply the RSA Encryption Primitive (RSAEP) to the + // public key, and convert the resulting integer ciphertext representation + // into octets. The octets will be written into [out] starting at [outOff]. + // + // Returns the number of bytes in the output ciphertext. + + return _engine.processBlock(block, 0, block.length, out, outOff); + } + + /// RSAES-OAEP decryption operation + /// + /// Implements the _RSA Encryption Scheme with Optimal Asymmetric Encryption + /// Padding_ (RSAES-OAEP) **decryption operation**. This decryption operation + /// combines the _RSA Decryption Primitive_ (RSADP) with the _Encoding Method + /// for Encryption OAEP_ (EME-OAEP) **decoding operation**. + /// + /// This method invokes its [AsymmetricBlockCipher] engine to perform RSADP, + /// and then performs the EME-OAEP decoding operation on the decrypted data. + /// + /// The RSAES-OAEP decryption operation is specified in section 7.1.2 of + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-7.1.2) and the + /// EME-OAEP decoding operation it uses is specified in section 9.1.1.2 of + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-9.1.1.2). + /// + /// The ciphertext to be decrypted and decoded is the octet string consisting + /// of [inpLen] bytes from [inp], starting at the [inpOff] offset. + /// + /// It returns the message in [out] starting at offset [outOff]. + + int _decodeBlock( + Uint8List inp, int inpOff, int inpLen, Uint8List out, int outOff) { + // The numbered steps below correspond to the steps from section 7.1.2 of + // [RFC 2437](https://tools.ietf.org/html/rfc2437#section-7.1.2). + // + // Names in _italics_ refers to names in the RFC 2437 and names in square + // brackets refers to variables in this code. + + // 1. Length checking + + if (inpLen != _engine.inputBlockSize) { + throw ArgumentError.value(inpLen, 'inpLen', 'decryption error'); + } + + // 2, 3. RSA decryption + + var block = Uint8List(_engine.outputBlockSize); + + var decryptFailed = false; + try { + var len = _engine.processBlock(inp, inpOff, inpLen, block, 0); + + // 4. EM = I2OSP(m, k-1) + + if (len < block.length) { + // Decrypted bytes is shorter than expected. Add 0x00 bytes at the + // beginning of the block (i.e. ensure it is k-1 long). This is needed + // when there were 0x00 in the leading bytes of the block that was + // originally encrypted. + + // Note: do not use [_arrayCopy] or [SetRange], since the source and + // destination may overlap. Those methods will corrupt the data. + + // Copy [len] data bytes from beginning of block to its end. I.e. from + // block[block.length - 1] <- block[len - 1] through to + // block[block.len - len] <- block[0] + for (var x = 0; x < len; x++) { + block[block.length - 1 - x] = block[len - 1 - x]; + } + // Put 0x00 in those beginning bytes. Important: do this AFTER copying + block.fillRange(0, block.length - len, 0x00); + } + } on ArgumentError { + decryptFailed = true; + } + + // 5. EME-OAEP decoding + // + // In these 5.x numbered steps, the x refers to steps from section 9.1.1.2 + // of [RFC 2437](https://tools.ietf.org/html/rfc2437#section-9.1.1.2) + + // 5.2 Check length + + var wrongData = block.length < (2 * defHash.length) + 1; + + // 5.4 Calculate _seedMask_ = MGF(maskedDB, hLen) + // + // The _maskedDB_ comes from [block] starting at _hLen_ to the end. + // The result _seedMask_ is stored in [mask]. + + var mask = _maskGeneratorFunction1( + block, defHash.length, block.length - defHash.length, defHash.length); + + // 5.5 Calculate _seed_ = maskedSeed XOR seedMask + // + // THe _maskedSeed_ comes from the first _hLen_ bytes of [block] and the + // _seedMask_ comes from [mask]. + // The result _seed_ is stored in the first _hLen_ bytes of [block] + // (overwriting the maskedSeed_ that was previously there). + + for (var i = 0; i != defHash.length; i++) { + block[i] ^= mask[i]; + } + + // 5.6 Calculate _dbMask_ = MGF(seed, length of EM - hLen) + + mask = _maskGeneratorFunction1( + block, 0, defHash.length, block.length - defHash.length); + + // 5.7 Calculate _DB_ = maskedDB XOR dbMask + // + // The _maskedDB_ comes from [block], from _hLen_ to the end, and the + // _dbMask_ comes from [mask]. The result _DB_ is stored in [block] from + // _hLen_ to the end (overwriting the _maskedDB_ that was previously there). + + for (var i = defHash.length; i != block.length; i++) { + block[i] ^= mask[i - defHash.length]; + } + + // 5.8 pHash = Hash(P) + var pHash = + encodingParams != null ? hash.process(encodingParams!) : defHash; + + // 5.10 Check _pHash'_ to _pHash_ + // + // check the hash of the encoding params. + // long check to try to avoid this been a source of a timing attack. + // + // The _pHash'_ comes from the first _hLen_ bytes of [block] + + var pHashWrong = false; + + for (var i = 0; i != pHash.length; i++) { + pHashWrong |= pHash[i] != block[pHash.length + i]; + } + + // 5.9 Split _DB_ into pHash1 || PS || 0x01 || M + // + // Skip over the _PS_ (which are all 0x00 bytes). Finding the first non-zero + // byte from hash.digestLength * 2 to the end of [block]. Setting [start] + // to that first non-zero byte (or will be block.length if none found). + + var start = block.length; + for (var index = 2 * pHash.length; index != block.length; index++) { + if ((block[index] != 0) & (start == block.length)) { + start = index; + } + } + + // The data-start-is-wrong if the rest of the [block] contains all 0x00 + // bytes or that first non-zero byte is not 0x01. + + var dataStartWrong = (start > (block.length - 1)) | + (start < block.length && block[start] != 0x01); + start++; + + if (decryptFailed || pHashWrong || wrongData || dataStartWrong) { + block.fillRange(0, block.length, 0); + throw ArgumentError('decoding error'); + } + + // 5.11 Output M + // + // The _M_ are all the bytes from after the 0x01 byte (i.e. offset [start]) + // to the end of [block]. Copy those bytes into [out] starting at [outOff]. + + final mLen = block.length - start; + _arraycopy(block, start, out, outOff, mLen); + return mLen; + } + + // ignore: slash_for_doc_comments + /// int to octet string. + Uint8List _itoOSP(int i, Uint8List sp) { + sp[0] = i >> 24; + sp[1] = i >> 16; + sp[2] = i >> 8; + sp[3] = i >> 0; + return sp; + } + + /// Implementation of MGF1 (the Mask Generation Function from PKCS #1 v2.0). + /// + /// See section 10.2.1 of + /// [RFC 2437](https://tools.ietf.org/html/rfc2437#section-10.2.1). + /// + /// MGF1 is defined to take a hash function as an option. This implementation + /// uses [mgf1Hash] for that hash function. + /// + /// MGF1 hsa two inputs: a seed and an intended length. The seed is the + /// sequence of bytes in [Z], starting at [zOff] for [zLen] bytes. + /// The intended length is in [length]. + /// + /// Returns the calculated mask. A Uint8List that contains [length] bytes. + + Uint8List _maskGeneratorFunction1( + Uint8List Z, int zOff, int zLen, int length) { + var mask = Uint8List(length); + var hashBuf = Uint8List(mgf1Hash.digestSize); + var C = Uint8List(4); + var counter = 0; + mgf1Hash.reset(); + + while (counter < (length / hashBuf.length).floor()) { + _itoOSP(counter, C); + mgf1Hash.update(Z, zOff, zLen); + mgf1Hash.update(C, 0, C.length); + mgf1Hash.doFinal(hashBuf, 0); + mask = _arraycopy( + hashBuf, 0, mask, counter * hashBuf.length, hashBuf.length); + counter++; + } + + if ((counter * hashBuf.length) < length) { + _itoOSP(counter, C); + mgf1Hash.update(Z, zOff, zLen); + mgf1Hash.update(C, 0, C.length); + mgf1Hash.doFinal(hashBuf, 0); + mask = _arraycopy(hashBuf, 0, mask, counter * hashBuf.length, + mask.length - (counter * hashBuf.length)); + } + return mask; + } +} diff --git a/pointycastle/lib/asymmetric/pkcs1.dart b/pointycastle/lib/asymmetric/pkcs1.dart new file mode 100644 index 0000000..e0834c5 --- /dev/null +++ b/pointycastle/lib/asymmetric/pkcs1.dart @@ -0,0 +1,173 @@ +// See file LICENSE for more information. + +library impl.asymmetric_block_cipher.pkcs1; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/random/fortuna_random.dart'; +import 'package:pointycastle/src/impl/base_asymmetric_block_cipher.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class PKCS1Encoding extends BaseAsymmetricBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + AsymmetricBlockCipher, + '/PKCS1', + (_, final Match match) => () { + var underlyingCipher = AsymmetricBlockCipher(match.group(1)!); + return PKCS1Encoding(underlyingCipher); + }); + + static const _HEADER_LENGTH = 10; + + final AsymmetricBlockCipher _engine; + + late SecureRandom _random; + late bool _forEncryption; + late bool _forPrivateKey; + + PKCS1Encoding(this._engine); + + @override + String get algorithmName => '${_engine.algorithmName}/PKCS1'; + + @override + void reset() {} + + Uint8List _seed() { + return Platform.instance.platformEntropySource().getBytes(32); + } + + @override + void init(bool forEncryption, CipherParameters params) { + AsymmetricKeyParameter akparams; + + if (params is ParametersWithRandom) { + var paramswr = params; + + _random = paramswr.random; + akparams = paramswr.parameters as AsymmetricKeyParameter; + } else { + _random = FortunaRandom(); + _random.seed(KeyParameter(_seed())); + akparams = params as AsymmetricKeyParameter; + } + + _engine.init(forEncryption, akparams); + + _forPrivateKey = akparams.key is PrivateKey; + _forEncryption = forEncryption; + } + + @override + int get inputBlockSize { + var baseBlockSize = _engine.inputBlockSize; + + if (_forEncryption) { + return baseBlockSize - _HEADER_LENGTH; + } else { + return baseBlockSize; + } + } + + @override + int get outputBlockSize { + var baseBlockSize = _engine.outputBlockSize; + + if (_forEncryption) { + return baseBlockSize; + } else { + return baseBlockSize - _HEADER_LENGTH; + } + } + + @override + int processBlock( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (_forEncryption) { + return _encodeBlock(inp, inpOff, len, out, outOff); + } else { + return _decodeBlock(inp, inpOff, len, out, outOff); + } + } + + int _encodeBlock( + Uint8List inp, int inpOff, int inpLen, Uint8List out, int outOff) { + if (inpLen > inputBlockSize) { + throw ArgumentError('Input data too large'); + } + + var block = Uint8List(_engine.inputBlockSize); + var padLength = block.length - inpLen - 1; + + if (_forPrivateKey) { + block[0] = 0x01; // type code 1 + block.fillRange(1, padLength, 0xFF); + } else { + block[0] = 0x02; // type code 2 + block.setRange(1, padLength, _random.nextBytes(padLength - 1)); + + // a zero byte marks the end of the padding, so all + // the pad bytes must be non-zero. + for (var i = 1; i < padLength; i++) { + while (block[i] == 0) { + block[i] = _random.nextUint8(); + } + } + } + + block[padLength] = 0x00; // mark the end of the padding + block.setRange(padLength + 1, block.length, inp.sublist(inpOff)); + + return _engine.processBlock(block, 0, block.length, out, outOff); + } + + int _decodeBlock( + Uint8List inp, int inpOff, int inpLen, Uint8List out, int outOff) { + var block = Uint8List(_engine.inputBlockSize); + var len = _engine.processBlock(inp, inpOff, inpLen, block, 0); + block = block.sublist(0, len); + + if (block.length < outputBlockSize) { + throw ArgumentError('Block truncated'); + } + + var type = block[0]; + + if (_forPrivateKey && (type != 2)) { + throw ArgumentError('Unsupported block type for private key: $type'); + } + if (!_forPrivateKey && (type != 1)) { + throw ArgumentError('Unsupported block type for public key: $type'); + } + if (block.length != _engine.outputBlockSize) { + throw ArgumentError('Block size is incorrect: ${block.length}'); + } + + // find and extract the message block. + int start; + + for (start = 1; start < block.length; start++) { + var pad = block[start]; + + if (pad == 0) { + break; + } + if (type == 1 && (pad != 0xFF)) { + throw ArgumentError('Incorrect block padding'); + } + } + + start++; // data should start at the next byte + + if ((start > block.length) || (start < _HEADER_LENGTH)) { + throw ArgumentError('No data found in block, only padding'); + } + + var rlen = block.length - start; + out.setRange(outOff, outOff + rlen, block.sublist(start)); + return rlen; + } +} diff --git a/pointycastle/lib/asymmetric/rsa.dart b/pointycastle/lib/asymmetric/rsa.dart new file mode 100644 index 0000000..e01ece1 --- /dev/null +++ b/pointycastle/lib/asymmetric/rsa.dart @@ -0,0 +1,163 @@ +// See file LICENSE for more information. + +library impl.asymmetric_block_cipher.rsa; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/asymmetric/api.dart'; +import 'package:pointycastle/src/impl/base_asymmetric_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart' as utils; + +class RSAEngine extends BaseAsymmetricBlockCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(AsymmetricBlockCipher, 'RSA', () => RSAEngine()); + + late bool _forEncryption; + RSAAsymmetricKey? _key; + late BigInt _dP; + late BigInt _dQ; + late BigInt _qInv; + + @override + String get algorithmName => 'RSA'; + + @override + int get inputBlockSize { + if (_key == null) { + throw StateError( + 'Input block size cannot be calculated until init() called'); + } + + var bitSize = _key!.modulus!.bitLength; + if (_forEncryption) { + return ((bitSize + 7) ~/ 8) - 1; + } else { + return (bitSize + 7) ~/ 8; + } + } + + @override + int get outputBlockSize { + if (_key == null) { + throw StateError( + 'Output block size cannot be calculated until init() called'); + } + + var bitSize = _key!.modulus!.bitLength; + if (_forEncryption) { + return (bitSize + 7) ~/ 8; + } else { + return ((bitSize + 7) ~/ 8) - 1; + } + } + + @override + void reset() {} + + @override + void init(bool forEncryption, + covariant AsymmetricKeyParameter params) { + _forEncryption = forEncryption; + _key = params.key; + + if (_key is RSAPrivateKey) { + var privKey = _key as RSAPrivateKey; + var pSub1 = privKey.p! - BigInt.one; + var qSub1 = privKey.q! - BigInt.one; + _dP = privKey.privateExponent!.remainder(pSub1); + _dQ = privKey.privateExponent!.remainder(qSub1); + _qInv = privKey.q!.modInverse(privKey.p!); + } + } + + @override + Uint8List process(Uint8List data) { + // Expand the output block size by an extra byte to handle cases where + // the output is larger than expected. + var out = Uint8List(outputBlockSize + 1); + var len = processBlock(data, 0, data.length, out, 0); + return out.sublist(0, len); + } + + @override + int processBlock( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + var input = _convertInput(inp, inpOff, len); + var output = _processBigInteger(input); + return _convertOutput(output, out, outOff); + } + + BigInt _convertInput(Uint8List inp, int inpOff, int len) { + var inpLen = inp.length; + + if (inpLen < inpOff + len) { + throw ArgumentError.value(inpOff, 'inpOff', + 'Not enough data for RSA cipher (length=$len, available=$inpLen)'); + } + + if (inputBlockSize + 1 < len) { + throw ArgumentError.value(len, 'len', + 'Too large for maximum RSA cipher input block size ($inputBlockSize)'); + } + + var res = utils.decodeBigIntWithSign(1, inp.sublist(inpOff, inpOff + len)); + if (res >= _key!.modulus!) { + throw ArgumentError('Input block too large for RSA key size'); + } + + return res; + } + + int _convertOutput(BigInt result, Uint8List out, int outOff) { + final output = utils.encodeBigInt(result); + + if (_forEncryption) { + if ((output[0] == 0) && (output.length > outputBlockSize)) { + // have ended up with an extra zero byte, copy down. + var len = output.length - 1; + out.setRange(outOff, outOff + len, output.sublist(1)); + return len; + } + if (output.length < outputBlockSize) { + // have ended up with less bytes than normal, lengthen + var len = outputBlockSize; + out.setRange(outOff + len - output.length, outOff + len, output); + return len; + } + } else { + if (output[0] == 0) { + // have ended up with an extra zero byte, copy down. + var len = output.length - 1; + out.setRange(outOff, outOff + len, output.sublist(1)); + return len; + } + } + + out.setAll(outOff, output); + return output.length; + } + + BigInt _processBigInteger(BigInt input) { + if (_key is RSAPrivateKey) { + var privKey = _key as RSAPrivateKey; + BigInt mP, mQ, h, m; + + mP = input.remainder(privKey.p!).modPow(_dP, privKey.p!); + + mQ = input.remainder(privKey.q!).modPow(_dQ, privKey.q!); + + h = mP - mQ; + h = h * _qInv; + h = h % privKey.p!; + + m = h * privKey.q!; + m = m + mQ; + + return m; + } else { + return input.modPow(_key!.exponent!, _key!.modulus!); + } + } +} diff --git a/pointycastle/lib/block/aes.dart b/pointycastle/lib/block/aes.dart new file mode 100644 index 0000000..5a10634 --- /dev/null +++ b/pointycastle/lib/block/aes.dart @@ -0,0 +1,1551 @@ +// See file LICENSE for more information. + +library impl.block_cipher.aes; + +import 'dart:core'; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +class AESEngine extends BaseBlockCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(BlockCipher, 'AES', () => AESEngine()); + + int _ROUNDS = 0; + late List> _WorkingKey; + bool _forEncryption = false; + + List _s = List.empty(); + + static const _S = [ + 99, + 124, + 119, + 123, + 242, + 107, + 111, + 197, + 48, + 1, + 103, + 43, + 254, + 215, + 171, + 118, + 202, + 130, + 201, + 125, + 250, + 89, + 71, + 240, + 173, + 212, + 162, + 175, + 156, + 164, + 114, + 192, + 183, + 253, + 147, + 38, + 54, + 63, + 247, + 204, + 52, + 165, + 229, + 241, + 113, + 216, + 49, + 21, + 4, + 199, + 35, + 195, + 24, + 150, + 5, + 154, + 7, + 18, + 128, + 226, + 235, + 39, + 178, + 117, + 9, + 131, + 44, + 26, + 27, + 110, + 90, + 160, + 82, + 59, + 214, + 179, + 41, + 227, + 47, + 132, + 83, + 209, + 0, + 237, + 32, + 252, + 177, + 91, + 106, + 203, + 190, + 57, + 74, + 76, + 88, + 207, + 208, + 239, + 170, + 251, + 67, + 77, + 51, + 133, + 69, + 249, + 2, + 127, + 80, + 60, + 159, + 168, + 81, + 163, + 64, + 143, + 146, + 157, + 56, + 245, + 188, + 182, + 218, + 33, + 16, + 255, + 243, + 210, + 205, + 12, + 19, + 236, + 95, + 151, + 68, + 23, + 196, + 167, + 126, + 61, + 100, + 93, + 25, + 115, + 96, + 129, + 79, + 220, + 34, + 42, + 144, + 136, + 70, + 238, + 184, + 20, + 222, + 94, + 11, + 219, + 224, + 50, + 58, + 10, + 73, + 6, + 36, + 92, + 194, + 211, + 172, + 98, + 145, + 149, + 228, + 121, + 231, + 200, + 55, + 109, + 141, + 213, + 78, + 169, + 108, + 86, + 244, + 234, + 101, + 122, + 174, + 8, + 186, + 120, + 37, + 46, + 28, + 166, + 180, + 198, + 232, + 221, + 116, + 31, + 75, + 189, + 139, + 138, + 112, + 62, + 181, + 102, + 72, + 3, + 246, + 14, + 97, + 53, + 87, + 185, + 134, + 193, + 29, + 158, + 225, + 248, + 152, + 17, + 105, + 217, + 142, + 148, + 155, + 30, + 135, + 233, + 206, + 85, + 40, + 223, + 140, + 161, + 137, + 13, + 191, + 230, + 66, + 104, + 65, + 153, + 45, + 15, + 176, + 84, + 187, + 22, + ]; + + static const _Si = [ + 82, + 9, + 106, + 213, + 48, + 54, + 165, + 56, + 191, + 64, + 163, + 158, + 129, + 243, + 215, + 251, + 124, + 227, + 57, + 130, + 155, + 47, + 255, + 135, + 52, + 142, + 67, + 68, + 196, + 222, + 233, + 203, + 84, + 123, + 148, + 50, + 166, + 194, + 35, + 61, + 238, + 76, + 149, + 11, + 66, + 250, + 195, + 78, + 8, + 46, + 161, + 102, + 40, + 217, + 36, + 178, + 118, + 91, + 162, + 73, + 109, + 139, + 209, + 37, + 114, + 248, + 246, + 100, + 134, + 104, + 152, + 22, + 212, + 164, + 92, + 204, + 93, + 101, + 182, + 146, + 108, + 112, + 72, + 80, + 253, + 237, + 185, + 218, + 94, + 21, + 70, + 87, + 167, + 141, + 157, + 132, + 144, + 216, + 171, + 0, + 140, + 188, + 211, + 10, + 247, + 228, + 88, + 5, + 184, + 179, + 69, + 6, + 208, + 44, + 30, + 143, + 202, + 63, + 15, + 2, + 193, + 175, + 189, + 3, + 1, + 19, + 138, + 107, + 58, + 145, + 17, + 65, + 79, + 103, + 220, + 234, + 151, + 242, + 207, + 206, + 240, + 180, + 230, + 115, + 150, + 172, + 116, + 34, + 231, + 173, + 53, + 133, + 226, + 249, + 55, + 232, + 28, + 117, + 223, + 110, + 71, + 241, + 26, + 113, + 29, + 41, + 197, + 137, + 111, + 183, + 98, + 14, + 170, + 24, + 190, + 27, + 252, + 86, + 62, + 75, + 198, + 210, + 121, + 32, + 154, + 219, + 192, + 254, + 120, + 205, + 90, + 244, + 31, + 221, + 168, + 51, + 136, + 7, + 199, + 49, + 177, + 18, + 16, + 89, + 39, + 128, + 236, + 95, + 96, + 81, + 127, + 169, + 25, + 181, + 74, + 13, + 45, + 229, + 122, + 159, + 147, + 201, + 156, + 239, + 160, + 224, + 59, + 77, + 174, + 42, + 245, + 176, + 200, + 235, + 187, + 60, + 131, + 83, + 153, + 97, + 23, + 43, + 4, + 126, + 186, + 119, + 214, + 38, + 225, + 105, + 20, + 99, + 85, + 33, + 12, + 125, + ]; + + static const _rcon = [ + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91 + ]; + + static const _T0 = [ + 0xa56363c6, + 0x847c7cf8, + 0x997777ee, + 0x8d7b7bf6, + 0x0df2f2ff, + 0xbd6b6bd6, + 0xb16f6fde, + 0x54c5c591, + 0x50303060, + 0x03010102, + 0xa96767ce, + 0x7d2b2b56, + 0x19fefee7, + 0x62d7d7b5, + 0xe6abab4d, + 0x9a7676ec, + 0x45caca8f, + 0x9d82821f, + 0x40c9c989, + 0x877d7dfa, + 0x15fafaef, + 0xeb5959b2, + 0xc947478e, + 0x0bf0f0fb, + 0xecadad41, + 0x67d4d4b3, + 0xfda2a25f, + 0xeaafaf45, + 0xbf9c9c23, + 0xf7a4a453, + 0x967272e4, + 0x5bc0c09b, + 0xc2b7b775, + 0x1cfdfde1, + 0xae93933d, + 0x6a26264c, + 0x5a36366c, + 0x413f3f7e, + 0x02f7f7f5, + 0x4fcccc83, + 0x5c343468, + 0xf4a5a551, + 0x34e5e5d1, + 0x08f1f1f9, + 0x937171e2, + 0x73d8d8ab, + 0x53313162, + 0x3f15152a, + 0x0c040408, + 0x52c7c795, + 0x65232346, + 0x5ec3c39d, + 0x28181830, + 0xa1969637, + 0x0f05050a, + 0xb59a9a2f, + 0x0907070e, + 0x36121224, + 0x9b80801b, + 0x3de2e2df, + 0x26ebebcd, + 0x6927274e, + 0xcdb2b27f, + 0x9f7575ea, + 0x1b090912, + 0x9e83831d, + 0x742c2c58, + 0x2e1a1a34, + 0x2d1b1b36, + 0xb26e6edc, + 0xee5a5ab4, + 0xfba0a05b, + 0xf65252a4, + 0x4d3b3b76, + 0x61d6d6b7, + 0xceb3b37d, + 0x7b292952, + 0x3ee3e3dd, + 0x712f2f5e, + 0x97848413, + 0xf55353a6, + 0x68d1d1b9, + 0x00000000, + 0x2cededc1, + 0x60202040, + 0x1ffcfce3, + 0xc8b1b179, + 0xed5b5bb6, + 0xbe6a6ad4, + 0x46cbcb8d, + 0xd9bebe67, + 0x4b393972, + 0xde4a4a94, + 0xd44c4c98, + 0xe85858b0, + 0x4acfcf85, + 0x6bd0d0bb, + 0x2aefefc5, + 0xe5aaaa4f, + 0x16fbfbed, + 0xc5434386, + 0xd74d4d9a, + 0x55333366, + 0x94858511, + 0xcf45458a, + 0x10f9f9e9, + 0x06020204, + 0x817f7ffe, + 0xf05050a0, + 0x443c3c78, + 0xba9f9f25, + 0xe3a8a84b, + 0xf35151a2, + 0xfea3a35d, + 0xc0404080, + 0x8a8f8f05, + 0xad92923f, + 0xbc9d9d21, + 0x48383870, + 0x04f5f5f1, + 0xdfbcbc63, + 0xc1b6b677, + 0x75dadaaf, + 0x63212142, + 0x30101020, + 0x1affffe5, + 0x0ef3f3fd, + 0x6dd2d2bf, + 0x4ccdcd81, + 0x140c0c18, + 0x35131326, + 0x2fececc3, + 0xe15f5fbe, + 0xa2979735, + 0xcc444488, + 0x3917172e, + 0x57c4c493, + 0xf2a7a755, + 0x827e7efc, + 0x473d3d7a, + 0xac6464c8, + 0xe75d5dba, + 0x2b191932, + 0x957373e6, + 0xa06060c0, + 0x98818119, + 0xd14f4f9e, + 0x7fdcdca3, + 0x66222244, + 0x7e2a2a54, + 0xab90903b, + 0x8388880b, + 0xca46468c, + 0x29eeeec7, + 0xd3b8b86b, + 0x3c141428, + 0x79dedea7, + 0xe25e5ebc, + 0x1d0b0b16, + 0x76dbdbad, + 0x3be0e0db, + 0x56323264, + 0x4e3a3a74, + 0x1e0a0a14, + 0xdb494992, + 0x0a06060c, + 0x6c242448, + 0xe45c5cb8, + 0x5dc2c29f, + 0x6ed3d3bd, + 0xefacac43, + 0xa66262c4, + 0xa8919139, + 0xa4959531, + 0x37e4e4d3, + 0x8b7979f2, + 0x32e7e7d5, + 0x43c8c88b, + 0x5937376e, + 0xb76d6dda, + 0x8c8d8d01, + 0x64d5d5b1, + 0xd24e4e9c, + 0xe0a9a949, + 0xb46c6cd8, + 0xfa5656ac, + 0x07f4f4f3, + 0x25eaeacf, + 0xaf6565ca, + 0x8e7a7af4, + 0xe9aeae47, + 0x18080810, + 0xd5baba6f, + 0x887878f0, + 0x6f25254a, + 0x722e2e5c, + 0x241c1c38, + 0xf1a6a657, + 0xc7b4b473, + 0x51c6c697, + 0x23e8e8cb, + 0x7cdddda1, + 0x9c7474e8, + 0x211f1f3e, + 0xdd4b4b96, + 0xdcbdbd61, + 0x868b8b0d, + 0x858a8a0f, + 0x907070e0, + 0x423e3e7c, + 0xc4b5b571, + 0xaa6666cc, + 0xd8484890, + 0x05030306, + 0x01f6f6f7, + 0x120e0e1c, + 0xa36161c2, + 0x5f35356a, + 0xf95757ae, + 0xd0b9b969, + 0x91868617, + 0x58c1c199, + 0x271d1d3a, + 0xb99e9e27, + 0x38e1e1d9, + 0x13f8f8eb, + 0xb398982b, + 0x33111122, + 0xbb6969d2, + 0x70d9d9a9, + 0x898e8e07, + 0xa7949433, + 0xb69b9b2d, + 0x221e1e3c, + 0x92878715, + 0x20e9e9c9, + 0x49cece87, + 0xff5555aa, + 0x78282850, + 0x7adfdfa5, + 0x8f8c8c03, + 0xf8a1a159, + 0x80898909, + 0x170d0d1a, + 0xdabfbf65, + 0x31e6e6d7, + 0xc6424284, + 0xb86868d0, + 0xc3414182, + 0xb0999929, + 0x772d2d5a, + 0x110f0f1e, + 0xcbb0b07b, + 0xfc5454a8, + 0xd6bbbb6d, + 0x3a16162c + ]; + + static const _Tinv0 = [ + 0x50a7f451, + 0x5365417e, + 0xc3a4171a, + 0x965e273a, + 0xcb6bab3b, + 0xf1459d1f, + 0xab58faac, + 0x9303e34b, + 0x55fa3020, + 0xf66d76ad, + 0x9176cc88, + 0x254c02f5, + 0xfcd7e54f, + 0xd7cb2ac5, + 0x80443526, + 0x8fa362b5, + 0x495ab1de, + 0x671bba25, + 0x980eea45, + 0xe1c0fe5d, + 0x02752fc3, + 0x12f04c81, + 0xa397468d, + 0xc6f9d36b, + 0xe75f8f03, + 0x959c9215, + 0xeb7a6dbf, + 0xda595295, + 0x2d83bed4, + 0xd3217458, + 0x2969e049, + 0x44c8c98e, + 0x6a89c275, + 0x78798ef4, + 0x6b3e5899, + 0xdd71b927, + 0xb64fe1be, + 0x17ad88f0, + 0x66ac20c9, + 0xb43ace7d, + 0x184adf63, + 0x82311ae5, + 0x60335197, + 0x457f5362, + 0xe07764b1, + 0x84ae6bbb, + 0x1ca081fe, + 0x942b08f9, + 0x58684870, + 0x19fd458f, + 0x876cde94, + 0xb7f87b52, + 0x23d373ab, + 0xe2024b72, + 0x578f1fe3, + 0x2aab5566, + 0x0728ebb2, + 0x03c2b52f, + 0x9a7bc586, + 0xa50837d3, + 0xf2872830, + 0xb2a5bf23, + 0xba6a0302, + 0x5c8216ed, + 0x2b1ccf8a, + 0x92b479a7, + 0xf0f207f3, + 0xa1e2694e, + 0xcdf4da65, + 0xd5be0506, + 0x1f6234d1, + 0x8afea6c4, + 0x9d532e34, + 0xa055f3a2, + 0x32e18a05, + 0x75ebf6a4, + 0x39ec830b, + 0xaaef6040, + 0x069f715e, + 0x51106ebd, + 0xf98a213e, + 0x3d06dd96, + 0xae053edd, + 0x46bde64d, + 0xb58d5491, + 0x055dc471, + 0x6fd40604, + 0xff155060, + 0x24fb9819, + 0x97e9bdd6, + 0xcc434089, + 0x779ed967, + 0xbd42e8b0, + 0x888b8907, + 0x385b19e7, + 0xdbeec879, + 0x470a7ca1, + 0xe90f427c, + 0xc91e84f8, + 0x00000000, + 0x83868009, + 0x48ed2b32, + 0xac70111e, + 0x4e725a6c, + 0xfbff0efd, + 0x5638850f, + 0x1ed5ae3d, + 0x27392d36, + 0x64d90f0a, + 0x21a65c68, + 0xd1545b9b, + 0x3a2e3624, + 0xb1670a0c, + 0x0fe75793, + 0xd296eeb4, + 0x9e919b1b, + 0x4fc5c080, + 0xa220dc61, + 0x694b775a, + 0x161a121c, + 0x0aba93e2, + 0xe52aa0c0, + 0x43e0223c, + 0x1d171b12, + 0x0b0d090e, + 0xadc78bf2, + 0xb9a8b62d, + 0xc8a91e14, + 0x8519f157, + 0x4c0775af, + 0xbbdd99ee, + 0xfd607fa3, + 0x9f2601f7, + 0xbcf5725c, + 0xc53b6644, + 0x347efb5b, + 0x7629438b, + 0xdcc623cb, + 0x68fcedb6, + 0x63f1e4b8, + 0xcadc31d7, + 0x10856342, + 0x40229713, + 0x2011c684, + 0x7d244a85, + 0xf83dbbd2, + 0x1132f9ae, + 0x6da129c7, + 0x4b2f9e1d, + 0xf330b2dc, + 0xec52860d, + 0xd0e3c177, + 0x6c16b32b, + 0x99b970a9, + 0xfa489411, + 0x2264e947, + 0xc48cfca8, + 0x1a3ff0a0, + 0xd82c7d56, + 0xef903322, + 0xc74e4987, + 0xc1d138d9, + 0xfea2ca8c, + 0x360bd498, + 0xcf81f5a6, + 0x28de7aa5, + 0x268eb7da, + 0xa4bfad3f, + 0xe49d3a2c, + 0x0d927850, + 0x9bcc5f6a, + 0x62467e54, + 0xc2138df6, + 0xe8b8d890, + 0x5ef7392e, + 0xf5afc382, + 0xbe805d9f, + 0x7c93d069, + 0xa92dd56f, + 0xb31225cf, + 0x3b99acc8, + 0xa77d1810, + 0x6e639ce8, + 0x7bbb3bdb, + 0x097826cd, + 0xf418596e, + 0x01b79aec, + 0xa89a4f83, + 0x656e95e6, + 0x7ee6ffaa, + 0x08cfbc21, + 0xe6e815ef, + 0xd99be7ba, + 0xce366f4a, + 0xd4099fea, + 0xd67cb029, + 0xafb2a431, + 0x31233f2a, + 0x3094a5c6, + 0xc066a235, + 0x37bc4e74, + 0xa6ca82fc, + 0xb0d090e0, + 0x15d8a733, + 0x4a9804f1, + 0xf7daec41, + 0x0e50cd7f, + 0x2ff69117, + 0x8dd64d76, + 0x4db0ef43, + 0x544daacc, + 0xdf0496e4, + 0xe3b5d19e, + 0x1b886a4c, + 0xb81f2cc1, + 0x7f516546, + 0x04ea5e9d, + 0x5d358c01, + 0x737487fa, + 0x2e410bfb, + 0x5a1d67b3, + 0x52d2db92, + 0x335610e9, + 0x1347d66d, + 0x8c61d79a, + 0x7a0ca137, + 0x8e14f859, + 0x893c13eb, + 0xee27a9ce, + 0x35c961b7, + 0xede51ce1, + 0x3cb1477a, + 0x59dfd29c, + 0x3f73f255, + 0x79ce1418, + 0xbf37c773, + 0xeacdf753, + 0x5baafd5f, + 0x146f3ddf, + 0x86db4478, + 0x81f3afca, + 0x3ec468b9, + 0x2c342438, + 0x5f40a3c2, + 0x72c31d16, + 0x0c25e2bc, + 0x8b493c28, + 0x41950dff, + 0x7101a839, + 0xdeb30c08, + 0x9ce4b4d8, + 0x90c15664, + 0x6184cb7b, + 0x70b632d5, + 0x745c6c48, + 0x4257b8d0 + ]; + + int _shift(int r, int shift) => rotr32(r, shift); + + static const int _m1 = 0x80808080; + static const int _m2 = 0x7f7f7f7f; + static const int _m3 = 0x0000001b; + static const int _m4 = 0xC0C0C0C0; + static const int _m5 = 0x3f3f3f3f; + + int _fFmulX(int x) { + var lsr = shiftr32(x & _m1, 7); + return ((x & _m2) << 1) ^ lsr * _m3; + } + + int _fFmulX2(int x) { + var t0 = shiftl32(x & _m5, 2); // int t0 = (x & m5) << 2; + var t1 = x & _m4; + t1 ^= shiftr32(t1, 1); + return t0 ^ shiftr32(t1, 2) ^ shiftr32(t1, 5); + } + + /// + /// The following defines provide alternative definitions of FFmulX that might + /// give improved performance if a fast 32-bit multiply is not available. + /// private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } + /// private static final int m4 = 0x1b1b1b1b; + /// private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } + /// + int _invMcol(int x) { + int t0, t1; + t0 = x; + t1 = t0 ^ _shift(t0, 8); + t0 ^= _fFmulX(t1); + t1 ^= _fFmulX2(t0); + t0 ^= t1 ^ _shift(t1, 16); + return t0; + } + + int _subWord(int x) { + return _S[x & 255] & 255 | + ((_S[(x >> 8) & 255] & 255) << 8) | + ((_S[(x >> 16) & 255] & 255) << 16) | + _S[(x >> 24) & 255] << 24; + } + + static const _BLOCK_SIZE = 16; + + @override + String get algorithmName => 'AES'; + + @override + int get blockSize => _BLOCK_SIZE; + + @override + void reset() {} + + @override + void init(bool forEncryption, covariant KeyParameter params) { + _forEncryption = forEncryption; + + _WorkingKey = generateWorkingKey(forEncryption, params); + + if (_forEncryption) { + _s = List.from(_S); + } else { + _s = List.from(_Si); + } + } + + List> generateWorkingKey(bool forEncryption, KeyParameter params) { + var key = params.key; + var keyLen = key.length; + if (keyLen < 16 || keyLen > 32 || (keyLen & 7) != 0) { + throw ArgumentError('Key length not 128/192/256 bits.'); + } + + var KC = shiftr32(keyLen, 2); + _ROUNDS = KC + + 6; // This is not always true for the generalized Rijndael that allows larger block sizes + + var W = List.generate( + _ROUNDS + 1, + (int i) => + List.filled(4, 0, growable: false)); // 4 words in a block + + switch (KC) { + case 4: + var col0 = unpack32(key, 0, Endian.little); + W[0][0] = col0; + var col1 = unpack32(key, 4, Endian.little); + W[0][1] = col1; + var col2 = unpack32(key, 8, Endian.little); + W[0][2] = col2; + var col3 = unpack32(key, 12, Endian.little); + W[0][3] = col3; + + for (var i = 1; i <= 10; ++i) { + var colx = _subWord(_shift(col3, 8)) ^ _rcon[i - 1]; + col0 ^= colx; + W[i][0] = col0; + col1 ^= col0; + W[i][1] = col1; + col2 ^= col1; + W[i][2] = col2; + col3 ^= col2; + W[i][3] = col3; + } + break; + case 6: + var col0 = unpack32(key, 0, Endian.little); + W[0][0] = col0; + var col1 = unpack32(key, 4, Endian.little); + W[0][1] = col1; + var col2 = unpack32(key, 8, Endian.little); + W[0][2] = col2; + var col3 = unpack32(key, 12, Endian.little); + W[0][3] = col3; + + var col4 = unpack32(key, 16, Endian.little); + var col5 = unpack32(key, 20, Endian.little); + + int i = 1, rcon = 1, colx; + for (;;) { + W[i][0] = col4; + W[i][1] = col5; + colx = _subWord(_shift(col5, 8)) ^ rcon; + rcon <<= 1; + col0 ^= colx; + W[i][2] = col0; + col1 ^= col0; + W[i][3] = col1; + + col2 ^= col1; + W[i + 1][0] = col2; + col3 ^= col2; + W[i + 1][1] = col3; + col4 ^= col3; + W[i + 1][2] = col4; + col5 ^= col4; + W[i + 1][3] = col5; + + colx = _subWord(_shift(col5, 8)) ^ rcon; + rcon <<= 1; + col0 ^= colx; + W[i + 2][0] = col0; + col1 ^= col0; + W[i + 2][1] = col1; + col2 ^= col1; + W[i + 2][2] = col2; + col3 ^= col2; + W[i + 2][3] = col3; + + if ((i += 3) >= 13) { + break; + } + + col4 ^= col3; + col5 ^= col4; + } + + break; + + case 8: + { + var col0 = unpack32(key, 0, Endian.little); + W[0][0] = col0; + var col1 = unpack32(key, 4, Endian.little); + W[0][1] = col1; + var col2 = unpack32(key, 8, Endian.little); + W[0][2] = col2; + var col3 = unpack32(key, 12, Endian.little); + W[0][3] = col3; + + var col4 = unpack32(key, 16, Endian.little); + W[1][0] = col4; + var col5 = unpack32(key, 20, Endian.little); + W[1][1] = col5; + var col6 = unpack32(key, 24, Endian.little); + W[1][2] = col6; + var col7 = unpack32(key, 28, Endian.little); + W[1][3] = col7; + + int i = 2, rcon = 1, colx; + for (;;) { + colx = _subWord(_shift(col7, 8)) ^ rcon; + rcon <<= 1; + col0 ^= colx; + W[i][0] = col0; + col1 ^= col0; + W[i][1] = col1; + col2 ^= col1; + W[i][2] = col2; + col3 ^= col2; + W[i][3] = col3; + ++i; + + if (i >= 15) { + break; + } + + colx = _subWord(col3); + col4 ^= colx; + W[i][0] = col4; + col5 ^= col4; + W[i][1] = col5; + col6 ^= col5; + W[i][2] = col6; + col7 ^= col6; + W[i][3] = col7; + ++i; + } + + break; + } + default: + { + throw StateError('Should never get here'); + } + } + + if (!forEncryption) { + for (var j = 1; j < _ROUNDS; j++) { + for (var i = 0; i < 4; i++) { + W[j][i] = _invMcol(W[j][i]); + } + } + } + + return W; + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + (32 / 2)) > inp.lengthInBytes) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + (32 / 2)) > out.lengthInBytes) { + throw ArgumentError('Output buffer too short'); + } + + if (_forEncryption) { + _encryptBlock(inp, inpOff, out, outOff, _WorkingKey); + } else { + _decryptBlock(inp, inpOff, out, outOff, _WorkingKey); + } + + return _BLOCK_SIZE; + } + + void _encryptBlock( + input, int inOff, Uint8List out, int outOff, List> KW) { + var C0 = unpack32(input, inOff + 0, Endian.little); + var C1 = unpack32(input, inOff + 4, Endian.little); + var C2 = unpack32(input, inOff + 8, Endian.little); + var C3 = unpack32(input, inOff + 12, Endian.little); + + var t0 = C0 ^ KW[0][0]; + var t1 = C1 ^ KW[0][1]; + var t2 = C2 ^ KW[0][2]; + + int r = 1, r0, r1, r2, r3 = C3 ^ KW[0][3]; + + while (r < _ROUNDS - 1) { + r0 = _T0[t0 & 255] ^ + _shift(_T0[(t1 >> 8) & 255], 24) ^ + _shift(_T0[(t2 >> 16) & 255], 16) ^ + _shift(_T0[(r3 >> 24) & 255], 8) ^ + KW[r][0]; + r1 = _T0[t1 & 255] ^ + _shift(_T0[(t2 >> 8) & 255], 24) ^ + _shift(_T0[(r3 >> 16) & 255], 16) ^ + _shift(_T0[(t0 >> 24) & 255], 8) ^ + KW[r][1]; + r2 = _T0[t2 & 255] ^ + _shift(_T0[(r3 >> 8) & 255], 24) ^ + _shift(_T0[(t0 >> 16) & 255], 16) ^ + _shift(_T0[(t1 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _T0[r3 & 255] ^ + _shift(_T0[(t0 >> 8) & 255], 24) ^ + _shift(_T0[(t1 >> 16) & 255], 16) ^ + _shift(_T0[(t2 >> 24) & 255], 8) ^ + KW[r++][3]; + t0 = _T0[r0 & 255] ^ + _shift(_T0[(r1 >> 8) & 255], 24) ^ + _shift(_T0[(r2 >> 16) & 255], 16) ^ + _shift(_T0[(r3 >> 24) & 255], 8) ^ + KW[r][0]; + t1 = _T0[r1 & 255] ^ + _shift(_T0[(r2 >> 8) & 255], 24) ^ + _shift(_T0[(r3 >> 16) & 255], 16) ^ + _shift(_T0[(r0 >> 24) & 255], 8) ^ + KW[r][1]; + t2 = _T0[r2 & 255] ^ + _shift(_T0[(r3 >> 8) & 255], 24) ^ + _shift(_T0[(r0 >> 16) & 255], 16) ^ + _shift(_T0[(r1 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _T0[r3 & 255] ^ + _shift(_T0[(r0 >> 8) & 255], 24) ^ + _shift(_T0[(r1 >> 16) & 255], 16) ^ + _shift(_T0[(r2 >> 24) & 255], 8) ^ + KW[r++][3]; + } + + r0 = _T0[t0 & 255] ^ + _shift(_T0[(t1 >> 8) & 255], 24) ^ + _shift(_T0[(t2 >> 16) & 255], 16) ^ + _shift(_T0[(r3 >> 24) & 255], 8) ^ + KW[r][0]; + r1 = _T0[t1 & 255] ^ + _shift(_T0[(t2 >> 8) & 255], 24) ^ + _shift(_T0[(r3 >> 16) & 255], 16) ^ + _shift(_T0[(t0 >> 24) & 255], 8) ^ + KW[r][1]; + r2 = _T0[t2 & 255] ^ + _shift(_T0[(r3 >> 8) & 255], 24) ^ + _shift(_T0[(t0 >> 16) & 255], 16) ^ + _shift(_T0[(t1 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _T0[r3 & 255] ^ + _shift(_T0[(t0 >> 8) & 255], 24) ^ + _shift(_T0[(t1 >> 16) & 255], 16) ^ + _shift(_T0[(t2 >> 24) & 255], 8) ^ + KW[r++][3]; + + // the final round's table is a simple function of S so we don't use a whole other four tables for it + + C0 = (_S[r0 & 255] & 255) ^ + ((_S[(r1 >> 8) & 255] & 255) << 8) ^ + ((_s[(r2 >> 16) & 255] & 255) << 16) ^ + (_s[(r3 >> 24) & 255] << 24) ^ + KW[r][0]; + C1 = (_s[r1 & 255] & 255) ^ + ((_S[(r2 >> 8) & 255] & 255) << 8) ^ + ((_S[(r3 >> 16) & 255] & 255) << 16) ^ + (_s[(r0 >> 24) & 255] << 24) ^ + KW[r][1]; + C2 = (_s[r2 & 255] & 255) ^ + ((_S[(r3 >> 8) & 255] & 255) << 8) ^ + ((_S[(r0 >> 16) & 255] & 255) << 16) ^ + (_S[(r1 >> 24) & 255] << 24) ^ + KW[r][2]; + C3 = (_s[r3 & 255] & 255) ^ + ((_s[(r0 >> 8) & 255] & 255) << 8) ^ + ((_s[(r1 >> 16) & 255] & 255) << 16) ^ + (_S[(r2 >> 24) & 255] << 24) ^ + KW[r][3]; + + pack32(C0, out, outOff + 0, Endian.little); + pack32(C1, out, outOff + 4, Endian.little); + pack32(C2, out, outOff + 8, Endian.little); + pack32(C3, out, outOff + 12, Endian.little); + } + + void _decryptBlock( + input, int inOff, Uint8List out, int outOff, List> KW) { + var C0 = unpack32(input, inOff + 0, Endian.little); + var C1 = unpack32(input, inOff + 4, Endian.little); + var C2 = unpack32(input, inOff + 8, Endian.little); + var C3 = unpack32(input, inOff + 12, Endian.little); + + var t0 = C0 ^ KW[_ROUNDS][0]; + var t1 = C1 ^ KW[_ROUNDS][1]; + var t2 = C2 ^ KW[_ROUNDS][2]; + + int r = _ROUNDS - 1, r0, r1, r2, r3 = C3 ^ KW[_ROUNDS][3]; + while (r > 1) { + r0 = _Tinv0[t0 & 255] ^ + _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t2 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t1 >> 24) & 255], 8) ^ + KW[r][0]; + r1 = _Tinv0[t1 & 255] ^ + _shift(_Tinv0[(t0 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t2 >> 24) & 255], 8) ^ + KW[r][1]; + r2 = _Tinv0[t2 & 255] ^ + _shift(_Tinv0[(t1 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t0 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _Tinv0[r3 & 255] ^ + _shift(_Tinv0[(t2 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t1 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t0 >> 24) & 255], 8) ^ + KW[r--][3]; + t0 = _Tinv0[r0 & 255] ^ + _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r2 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r1 >> 24) & 255], 8) ^ + KW[r][0]; + t1 = _Tinv0[r1 & 255] ^ + _shift(_Tinv0[(r0 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r2 >> 24) & 255], 8) ^ + KW[r][1]; + t2 = _Tinv0[r2 & 255] ^ + _shift(_Tinv0[(r1 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r0 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _Tinv0[r3 & 255] ^ + _shift(_Tinv0[(r2 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r1 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r0 >> 24) & 255], 8) ^ + KW[r--][3]; + } + + r0 = _Tinv0[t0 & 255] ^ + _shift(_Tinv0[(r3 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t2 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t1 >> 24) & 255], 8) ^ + KW[r][0]; + r1 = _Tinv0[t1 & 255] ^ + _shift(_Tinv0[(t0 >> 8) & 255], 24) ^ + _shift(_Tinv0[(r3 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t2 >> 24) & 255], 8) ^ + KW[r][1]; + r2 = _Tinv0[t2 & 255] ^ + _shift(_Tinv0[(t1 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t0 >> 16) & 255], 16) ^ + _shift(_Tinv0[(r3 >> 24) & 255], 8) ^ + KW[r][2]; + r3 = _Tinv0[r3 & 255] ^ + _shift(_Tinv0[(t2 >> 8) & 255], 24) ^ + _shift(_Tinv0[(t1 >> 16) & 255], 16) ^ + _shift(_Tinv0[(t0 >> 24) & 255], 8) ^ + KW[r][3]; + + // the final round's table is a simple function of Si so we don't use a whole other four tables for it + + C0 = (_Si[r0 & 255] & 255) ^ + ((_s[(r3 >> 8) & 255] & 255) << 8) ^ + ((_s[(r2 >> 16) & 255] & 255) << 16) ^ + (_Si[(r1 >> 24) & 255] << 24) ^ + KW[0][0]; + C1 = (_s[r1 & 255] & 255) ^ + ((_s[(r0 >> 8) & 255] & 255) << 8) ^ + ((_Si[(r3 >> 16) & 255] & 255) << 16) ^ + (_s[(r2 >> 24) & 255] << 24) ^ + KW[0][1]; + C2 = (_s[r2 & 255] & 255) ^ + ((_Si[(r1 >> 8) & 255] & 255) << 8) ^ + ((_Si[(r0 >> 16) & 255] & 255) << 16) ^ + (_s[(r3 >> 24) & 255] << 24) ^ + KW[0][2]; + C3 = (_Si[r3 & 255] & 255) ^ + ((_s[(r2 >> 8) & 255] & 255) << 8) ^ + ((_s[(r1 >> 16) & 255] & 255) << 16) ^ + (_s[(r0 >> 24) & 255] << 24) ^ + KW[0][3]; + + pack32(C0, out, outOff + 0, Endian.little); + pack32(C1, out, outOff + 4, Endian.little); + pack32(C2, out, outOff + 8, Endian.little); + pack32(C3, out, outOff + 12, Endian.little); + } +} diff --git a/pointycastle/lib/block/aes_fast.dart b/pointycastle/lib/block/aes_fast.dart new file mode 100644 index 0000000..d514187 --- /dev/null +++ b/pointycastle/lib/block/aes_fast.dart @@ -0,0 +1,3000 @@ +// See file LICENSE for more information. + +library impl.block_cipher.aes_fast; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// An implementation of the AES (Rijndael), from FIPS-197. +/// +/// For further details see: [http://csrc.nist.gov/encryption/aes/] +/// +/// This implementation is based on optimizations from Dr. Brian Gladman's paper +/// and C code at [http://fp.gladman.plus.com/cryptography_technology/rijndael/] +/// deprecated: Unfortunately this class is has a few side channel issues. +/// In an environment where encryption/decryption may be closely observed it +/// should not be used. +@Deprecated('Has side-channel issues.') +class AESFastEngine extends BaseBlockCipher { + static const _BLOCK_SIZE = 16; + + late bool _forEncryption; + List>? _workingKey; + late int _rounds; + late int _c0, _c1, _c2, _c3; + + @override + String get algorithmName => 'AES_FAST_'; + + @override + int get blockSize => _BLOCK_SIZE; + + @override + void reset() { + _rounds = 0; + _c0 = _c1 = _c2 = _c3 = 0; + _forEncryption = false; + _workingKey = null; + } + + @override + void init(bool forEncryption, covariant KeyParameter params) { + var key = params.key; + + var kc = (key.lengthInBytes / 4).floor(); // key length in words + if (((kc != 4) && (kc != 6) && (kc != 8)) || + ((kc * 4) != key.lengthInBytes)) { + throw ArgumentError('Key length must be 128/192/256 bits'); + } + + _forEncryption = forEncryption; + _rounds = kc + + 6; // This is not always true for the generalized Rijndael that allows larger block sizes + _workingKey = List.generate( + _rounds + 1, + (int i) => + List.filled(4, 0, growable: false)); // 4 words in a block + + // Copy the key into the round key array. + var keyView = ByteData.view( + params.key.buffer, params.key.offsetInBytes, params.key.length); + for (var i = 0, t = 0; i < key.lengthInBytes; i += 4, t++) { + var value = unpack32(keyView, i, Endian.little); + _workingKey![t >> 2][t & 3] = value; + } + + // While not enough round key material calculated calculate values. + var k = (_rounds + 1) << 2; + for (var i = kc; i < k; i++) { + var temp = _workingKey![(i - 1) >> 2][(i - 1) & 3].toInt(); + if ((i % kc) == 0) { + temp = _subWord(_shift(temp, 8)) ^ _rcon[((i / kc) - 1).floor()]; + } else if ((kc > 6) && ((i % kc) == 4)) { + temp = _subWord(temp); + } + + var value = _workingKey![(i - kc) >> 2][(i - kc) & 3] ^ temp; + _workingKey![i >> 2][i & 3] = value; + } + + if (!forEncryption) { + for (var j = 1; j < _rounds; j++) { + for (var i = 0; i < 4; i++) { + var value = _invMcol(_workingKey![j][i].toInt()); + _workingKey![j][i] = value; + } + } + } + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if (_workingKey == null) { + throw StateError('AES engine not initialised'); + } + + if ((inpOff + (32 / 2)) > inp.lengthInBytes) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + (32 / 2)) > out.lengthInBytes) { + throw ArgumentError('Output buffer too short'); + } + + var inpView = ByteData.view(inp.buffer, inp.offsetInBytes, inp.length); + var outView = ByteData.view(out.buffer, out.offsetInBytes, out.length); + if (_forEncryption) { + _unpackBlock(inpView, inpOff); + _encryptBlock(_workingKey!); + _packBlock(outView, outOff); + } else { + _unpackBlock(inpView, inpOff); + _decryptBlock(_workingKey!); + _packBlock(outView, outOff); + } + + return _BLOCK_SIZE; + } + + void _encryptBlock(List> kw) { + int r, r0, r1, r2, r3; + + _c0 ^= kw[0][0]!.toInt(); + _c1 ^= kw[0][1]!.toInt(); + _c2 ^= kw[0][2]!.toInt(); + _c3 ^= kw[0][3]!.toInt(); + + r = 1; + while (r < _rounds - 1) { + r0 = _t0[_c0 & 255] ^ + _t1[(_c1 >> 8) & 255] ^ + _t2[(_c2 >> 16) & 255] ^ + _t3[(_c3 >> 24) & 255] ^ + kw[r][0]!.toInt(); + r1 = _t0[_c1 & 255] ^ + _t1[(_c2 >> 8) & 255] ^ + _t2[(_c3 >> 16) & 255] ^ + _t3[(_c0 >> 24) & 255] ^ + kw[r][1]!.toInt(); + r2 = _t0[_c2 & 255] ^ + _t1[(_c3 >> 8) & 255] ^ + _t2[(_c0 >> 16) & 255] ^ + _t3[(_c1 >> 24) & 255] ^ + kw[r][2]!.toInt(); + r3 = _t0[_c3 & 255] ^ + _t1[(_c0 >> 8) & 255] ^ + _t2[(_c1 >> 16) & 255] ^ + _t3[(_c2 >> 24) & 255] ^ + kw[r][3]!.toInt(); + r++; + _c0 = _t0[r0 & 255] ^ + _t1[(r1 >> 8) & 255] ^ + _t2[(r2 >> 16) & 255] ^ + _t3[(r3 >> 24) & 255] ^ + kw[r][0]!.toInt(); + _c1 = _t0[r1 & 255] ^ + _t1[(r2 >> 8) & 255] ^ + _t2[(r3 >> 16) & 255] ^ + _t3[(r0 >> 24) & 255] ^ + kw[r][1]!.toInt(); + _c2 = _t0[r2 & 255] ^ + _t1[(r3 >> 8) & 255] ^ + _t2[(r0 >> 16) & 255] ^ + _t3[(r1 >> 24) & 255] ^ + kw[r][2]!.toInt(); + _c3 = _t0[r3 & 255] ^ + _t1[(r0 >> 8) & 255] ^ + _t2[(r1 >> 16) & 255] ^ + _t3[(r2 >> 24) & 255] ^ + kw[r][3]!.toInt(); + r++; + } + + r0 = _t0[_c0 & 255] ^ + _t1[(_c1 >> 8) & 255] ^ + _t2[(_c2 >> 16) & 255] ^ + _t3[(_c3 >> 24) & 255] ^ + kw[r][0]!.toInt(); + r1 = _t0[_c1 & 255] ^ + _t1[(_c2 >> 8) & 255] ^ + _t2[(_c3 >> 16) & 255] ^ + _t3[(_c0 >> 24) & 255] ^ + kw[r][1]!.toInt(); + r2 = _t0[_c2 & 255] ^ + _t1[(_c3 >> 8) & 255] ^ + _t2[(_c0 >> 16) & 255] ^ + _t3[(_c1 >> 24) & 255] ^ + kw[r][2]!.toInt(); + r3 = _t0[_c3 & 255] ^ + _t1[(_c0 >> 8) & 255] ^ + _t2[(_c1 >> 16) & 255] ^ + _t3[(_c2 >> 24) & 255] ^ + kw[r][3]!.toInt(); + r++; + + // the final round's table is a simple function of S so we don't use a whole other four tables for it + _c0 = (_s[r0 & 255] & 255) ^ + ((_s[(r1 >> 8) & 255] & 255) << 8) ^ + ((_s[(r2 >> 16) & 255] & 255) << 16) ^ + (_s[(r3 >> 24) & 255] << 24) ^ + kw[r][0]!.toInt(); + _c1 = (_s[r1 & 255] & 255) ^ + ((_s[(r2 >> 8) & 255] & 255) << 8) ^ + ((_s[(r3 >> 16) & 255] & 255) << 16) ^ + (_s[(r0 >> 24) & 255] << 24) ^ + kw[r][1]!.toInt(); + _c2 = (_s[r2 & 255] & 255) ^ + ((_s[(r3 >> 8) & 255] & 255) << 8) ^ + ((_s[(r0 >> 16) & 255] & 255) << 16) ^ + (_s[(r1 >> 24) & 255] << 24) ^ + kw[r][2]!.toInt(); + _c3 = (_s[r3 & 255] & 255) ^ + ((_s[(r0 >> 8) & 255] & 255) << 8) ^ + ((_s[(r1 >> 16) & 255] & 255) << 16) ^ + (_s[(r2 >> 24) & 255] << 24) ^ + kw[r][3]!.toInt(); + } + + void _decryptBlock(List> kw) { + int r, r0, r1, r2, r3; + + _c0 ^= kw[_rounds][0]!.toInt(); + _c1 ^= kw[_rounds][1]!.toInt(); + _c2 ^= kw[_rounds][2]!.toInt(); + _c3 ^= kw[_rounds][3]!.toInt(); + + r = _rounds - 1; + while (r > 1) { + r0 = _tinv0[_c0 & 255] ^ + _tinv1[(_c3 >> 8) & 255] ^ + _tinv2[(_c2 >> 16) & 255] ^ + _tinv3[(_c1 >> 24) & 255] ^ + kw[r][0]!.toInt(); + r1 = _tinv0[_c1 & 255] ^ + _tinv1[(_c0 >> 8) & 255] ^ + _tinv2[(_c3 >> 16) & 255] ^ + _tinv3[(_c2 >> 24) & 255] ^ + kw[r][1]!.toInt(); + r2 = _tinv0[_c2 & 255] ^ + _tinv1[(_c1 >> 8) & 255] ^ + _tinv2[(_c0 >> 16) & 255] ^ + _tinv3[(_c3 >> 24) & 255] ^ + kw[r][2]!.toInt(); + r3 = _tinv0[_c3 & 255] ^ + _tinv1[(_c2 >> 8) & 255] ^ + _tinv2[(_c1 >> 16) & 255] ^ + _tinv3[(_c0 >> 24) & 255] ^ + kw[r][3]!.toInt(); + r--; + _c0 = _tinv0[r0 & 255] ^ + _tinv1[(r3 >> 8) & 255] ^ + _tinv2[(r2 >> 16) & 255] ^ + _tinv3[(r1 >> 24) & 255] ^ + kw[r][0]!.toInt(); + _c1 = _tinv0[r1 & 255] ^ + _tinv1[(r0 >> 8) & 255] ^ + _tinv2[(r3 >> 16) & 255] ^ + _tinv3[(r2 >> 24) & 255] ^ + kw[r][1]!.toInt(); + _c2 = _tinv0[r2 & 255] ^ + _tinv1[(r1 >> 8) & 255] ^ + _tinv2[(r0 >> 16) & 255] ^ + _tinv3[(r3 >> 24) & 255] ^ + kw[r][2]!.toInt(); + _c3 = _tinv0[r3 & 255] ^ + _tinv1[(r2 >> 8) & 255] ^ + _tinv2[(r1 >> 16) & 255] ^ + _tinv3[(r0 >> 24) & 255] ^ + kw[r][3]!.toInt(); + r--; + } + + r0 = _tinv0[_c0 & 255] ^ + _tinv1[(_c3 >> 8) & 255] ^ + _tinv2[(_c2 >> 16) & 255] ^ + _tinv3[(_c1 >> 24) & 255] ^ + kw[r][0]!.toInt(); + r1 = _tinv0[_c1 & 255] ^ + _tinv1[(_c0 >> 8) & 255] ^ + _tinv2[(_c3 >> 16) & 255] ^ + _tinv3[(_c2 >> 24) & 255] ^ + kw[r][1]!.toInt(); + r2 = _tinv0[_c2 & 255] ^ + _tinv1[(_c1 >> 8) & 255] ^ + _tinv2[(_c0 >> 16) & 255] ^ + _tinv3[(_c3 >> 24) & 255] ^ + kw[r][2]!.toInt(); + r3 = _tinv0[_c3 & 255] ^ + _tinv1[(_c2 >> 8) & 255] ^ + _tinv2[(_c1 >> 16) & 255] ^ + _tinv3[(_c0 >> 24) & 255] ^ + kw[r][3]!.toInt(); + + // the final round's table is a simple function of Si so we don't use a whole other four tables for it + _c0 = (_si[r0 & 255] & 255) ^ + ((_si[(r3 >> 8) & 255] & 255) << 8) ^ + ((_si[(r2 >> 16) & 255] & 255) << 16) ^ + (_si[(r1 >> 24) & 255] << 24) ^ + kw[0][0]!.toInt(); + _c1 = (_si[r1 & 255] & 255) ^ + ((_si[(r0 >> 8) & 255] & 255) << 8) ^ + ((_si[(r3 >> 16) & 255] & 255) << 16) ^ + (_si[(r2 >> 24) & 255] << 24) ^ + kw[0][1]!.toInt(); + _c2 = (_si[r2 & 255] & 255) ^ + ((_si[(r1 >> 8) & 255] & 255) << 8) ^ + ((_si[(r0 >> 16) & 255] & 255) << 16) ^ + (_si[(r3 >> 24) & 255] << 24) ^ + kw[0][2]!.toInt(); + _c3 = (_si[r3 & 255] & 255) ^ + ((_si[(r2 >> 8) & 255] & 255) << 8) ^ + ((_si[(r1 >> 16) & 255] & 255) << 16) ^ + (_si[(r0 >> 24) & 255] << 24) ^ + kw[0][3]!.toInt(); + } + + void _unpackBlock(ByteData view, int off) { + _c0 = unpack32(view, off, Endian.little); + _c1 = unpack32(view, off + 4, Endian.little); + _c2 = unpack32(view, off + 8, Endian.little); + _c3 = unpack32(view, off + 12, Endian.little); + } + + void _packBlock(ByteData view, int off) { + pack32(_c0, view, off, Endian.little); + pack32(_c1, view, off + 4, Endian.little); + pack32(_c2, view, off + 8, Endian.little); + pack32(_c3, view, off + 12, Endian.little); + } +} + +int _shift(int r, int shift) => rotr32(r, shift); + +/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ + +const int _m1 = 0x80808080; +const int _m2 = 0x7f7f7f7f; +const int _m3 = 0x0000001b; + +int _fFmulX(int x) { + var lsr = shiftr32(x & _m1, 7); + return ((x & _m2) << 1) ^ lsr * _m3; +} + +/// +/// The following defines provide alternative definitions of FFmulX that might +/// give improved performance if a fast 32-bit multiply is not available. +/// private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } +/// private static final int m4 = 0x1b1b1b1b; +/// private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } +/// +int _invMcol(int x) { + var f2 = _fFmulX(x); + var f4 = _fFmulX(f2); + var f8 = _fFmulX(f4); + var f9 = x ^ f8; + + return f2 ^ + f4 ^ + f8 ^ + _shift(f2 ^ f9, 8) ^ + _shift(f4 ^ f9, 16) ^ + _shift(f9, 24); +} + +int _subWord(int x) { + return _s[x & 255] & 255 | + ((_s[(x >> 8) & 255] & 255) << 8) | + ((_s[(x >> 16) & 255] & 255) << 16) | + _s[(x >> 24) & 255] << 24; +} + +// The S box +final _s = [ + 99, + 124, + 119, + 123, + 242, + 107, + 111, + 197, + 48, + 1, + 103, + 43, + 254, + 215, + 171, + 118, + 202, + 130, + 201, + 125, + 250, + 89, + 71, + 240, + 173, + 212, + 162, + 175, + 156, + 164, + 114, + 192, + 183, + 253, + 147, + 38, + 54, + 63, + 247, + 204, + 52, + 165, + 229, + 241, + 113, + 216, + 49, + 21, + 4, + 199, + 35, + 195, + 24, + 150, + 5, + 154, + 7, + 18, + 128, + 226, + 235, + 39, + 178, + 117, + 9, + 131, + 44, + 26, + 27, + 110, + 90, + 160, + 82, + 59, + 214, + 179, + 41, + 227, + 47, + 132, + 83, + 209, + 0, + 237, + 32, + 252, + 177, + 91, + 106, + 203, + 190, + 57, + 74, + 76, + 88, + 207, + 208, + 239, + 170, + 251, + 67, + 77, + 51, + 133, + 69, + 249, + 2, + 127, + 80, + 60, + 159, + 168, + 81, + 163, + 64, + 143, + 146, + 157, + 56, + 245, + 188, + 182, + 218, + 33, + 16, + 255, + 243, + 210, + 205, + 12, + 19, + 236, + 95, + 151, + 68, + 23, + 196, + 167, + 126, + 61, + 100, + 93, + 25, + 115, + 96, + 129, + 79, + 220, + 34, + 42, + 144, + 136, + 70, + 238, + 184, + 20, + 222, + 94, + 11, + 219, + 224, + 50, + 58, + 10, + 73, + 6, + 36, + 92, + 194, + 211, + 172, + 98, + 145, + 149, + 228, + 121, + 231, + 200, + 55, + 109, + 141, + 213, + 78, + 169, + 108, + 86, + 244, + 234, + 101, + 122, + 174, + 8, + 186, + 120, + 37, + 46, + 28, + 166, + 180, + 198, + 232, + 221, + 116, + 31, + 75, + 189, + 139, + 138, + 112, + 62, + 181, + 102, + 72, + 3, + 246, + 14, + 97, + 53, + 87, + 185, + 134, + 193, + 29, + 158, + 225, + 248, + 152, + 17, + 105, + 217, + 142, + 148, + 155, + 30, + 135, + 233, + 206, + 85, + 40, + 223, + 140, + 161, + 137, + 13, + 191, + 230, + 66, + 104, + 65, + 153, + 45, + 15, + 176, + 84, + 187, + 22 +]; + +// The inverse S-box +final _si = [ + 82, + 9, + 106, + 213, + 48, + 54, + 165, + 56, + 191, + 64, + 163, + 158, + 129, + 243, + 215, + 251, + 124, + 227, + 57, + 130, + 155, + 47, + 255, + 135, + 52, + 142, + 67, + 68, + 196, + 222, + 233, + 203, + 84, + 123, + 148, + 50, + 166, + 194, + 35, + 61, + 238, + 76, + 149, + 11, + 66, + 250, + 195, + 78, + 8, + 46, + 161, + 102, + 40, + 217, + 36, + 178, + 118, + 91, + 162, + 73, + 109, + 139, + 209, + 37, + 114, + 248, + 246, + 100, + 134, + 104, + 152, + 22, + 212, + 164, + 92, + 204, + 93, + 101, + 182, + 146, + 108, + 112, + 72, + 80, + 253, + 237, + 185, + 218, + 94, + 21, + 70, + 87, + 167, + 141, + 157, + 132, + 144, + 216, + 171, + 0, + 140, + 188, + 211, + 10, + 247, + 228, + 88, + 5, + 184, + 179, + 69, + 6, + 208, + 44, + 30, + 143, + 202, + 63, + 15, + 2, + 193, + 175, + 189, + 3, + 1, + 19, + 138, + 107, + 58, + 145, + 17, + 65, + 79, + 103, + 220, + 234, + 151, + 242, + 207, + 206, + 240, + 180, + 230, + 115, + 150, + 172, + 116, + 34, + 231, + 173, + 53, + 133, + 226, + 249, + 55, + 232, + 28, + 117, + 223, + 110, + 71, + 241, + 26, + 113, + 29, + 41, + 197, + 137, + 111, + 183, + 98, + 14, + 170, + 24, + 190, + 27, + 252, + 86, + 62, + 75, + 198, + 210, + 121, + 32, + 154, + 219, + 192, + 254, + 120, + 205, + 90, + 244, + 31, + 221, + 168, + 51, + 136, + 7, + 199, + 49, + 177, + 18, + 16, + 89, + 39, + 128, + 236, + 95, + 96, + 81, + 127, + 169, + 25, + 181, + 74, + 13, + 45, + 229, + 122, + 159, + 147, + 201, + 156, + 239, + 160, + 224, + 59, + 77, + 174, + 42, + 245, + 176, + 200, + 235, + 187, + 60, + 131, + 83, + 153, + 97, + 23, + 43, + 4, + 126, + 186, + 119, + 214, + 38, + 225, + 105, + 20, + 99, + 85, + 33, + 12, + 125, +]; + +// vector used in calculating key schedule (powers of x in GF(256)) +final _rcon = [ + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91 +]; + +// precomputation tables of calculations for rounds +final _t0 = [ + 0xa56363c6, + 0x847c7cf8, + 0x997777ee, + 0x8d7b7bf6, + 0x0df2f2ff, + 0xbd6b6bd6, + 0xb16f6fde, + 0x54c5c591, + 0x50303060, + 0x03010102, + 0xa96767ce, + 0x7d2b2b56, + 0x19fefee7, + 0x62d7d7b5, + 0xe6abab4d, + 0x9a7676ec, + 0x45caca8f, + 0x9d82821f, + 0x40c9c989, + 0x877d7dfa, + 0x15fafaef, + 0xeb5959b2, + 0xc947478e, + 0x0bf0f0fb, + 0xecadad41, + 0x67d4d4b3, + 0xfda2a25f, + 0xeaafaf45, + 0xbf9c9c23, + 0xf7a4a453, + 0x967272e4, + 0x5bc0c09b, + 0xc2b7b775, + 0x1cfdfde1, + 0xae93933d, + 0x6a26264c, + 0x5a36366c, + 0x413f3f7e, + 0x02f7f7f5, + 0x4fcccc83, + 0x5c343468, + 0xf4a5a551, + 0x34e5e5d1, + 0x08f1f1f9, + 0x937171e2, + 0x73d8d8ab, + 0x53313162, + 0x3f15152a, + 0x0c040408, + 0x52c7c795, + 0x65232346, + 0x5ec3c39d, + 0x28181830, + 0xa1969637, + 0x0f05050a, + 0xb59a9a2f, + 0x0907070e, + 0x36121224, + 0x9b80801b, + 0x3de2e2df, + 0x26ebebcd, + 0x6927274e, + 0xcdb2b27f, + 0x9f7575ea, + 0x1b090912, + 0x9e83831d, + 0x742c2c58, + 0x2e1a1a34, + 0x2d1b1b36, + 0xb26e6edc, + 0xee5a5ab4, + 0xfba0a05b, + 0xf65252a4, + 0x4d3b3b76, + 0x61d6d6b7, + 0xceb3b37d, + 0x7b292952, + 0x3ee3e3dd, + 0x712f2f5e, + 0x97848413, + 0xf55353a6, + 0x68d1d1b9, + 0x00000000, + 0x2cededc1, + 0x60202040, + 0x1ffcfce3, + 0xc8b1b179, + 0xed5b5bb6, + 0xbe6a6ad4, + 0x46cbcb8d, + 0xd9bebe67, + 0x4b393972, + 0xde4a4a94, + 0xd44c4c98, + 0xe85858b0, + 0x4acfcf85, + 0x6bd0d0bb, + 0x2aefefc5, + 0xe5aaaa4f, + 0x16fbfbed, + 0xc5434386, + 0xd74d4d9a, + 0x55333366, + 0x94858511, + 0xcf45458a, + 0x10f9f9e9, + 0x06020204, + 0x817f7ffe, + 0xf05050a0, + 0x443c3c78, + 0xba9f9f25, + 0xe3a8a84b, + 0xf35151a2, + 0xfea3a35d, + 0xc0404080, + 0x8a8f8f05, + 0xad92923f, + 0xbc9d9d21, + 0x48383870, + 0x04f5f5f1, + 0xdfbcbc63, + 0xc1b6b677, + 0x75dadaaf, + 0x63212142, + 0x30101020, + 0x1affffe5, + 0x0ef3f3fd, + 0x6dd2d2bf, + 0x4ccdcd81, + 0x140c0c18, + 0x35131326, + 0x2fececc3, + 0xe15f5fbe, + 0xa2979735, + 0xcc444488, + 0x3917172e, + 0x57c4c493, + 0xf2a7a755, + 0x827e7efc, + 0x473d3d7a, + 0xac6464c8, + 0xe75d5dba, + 0x2b191932, + 0x957373e6, + 0xa06060c0, + 0x98818119, + 0xd14f4f9e, + 0x7fdcdca3, + 0x66222244, + 0x7e2a2a54, + 0xab90903b, + 0x8388880b, + 0xca46468c, + 0x29eeeec7, + 0xd3b8b86b, + 0x3c141428, + 0x79dedea7, + 0xe25e5ebc, + 0x1d0b0b16, + 0x76dbdbad, + 0x3be0e0db, + 0x56323264, + 0x4e3a3a74, + 0x1e0a0a14, + 0xdb494992, + 0x0a06060c, + 0x6c242448, + 0xe45c5cb8, + 0x5dc2c29f, + 0x6ed3d3bd, + 0xefacac43, + 0xa66262c4, + 0xa8919139, + 0xa4959531, + 0x37e4e4d3, + 0x8b7979f2, + 0x32e7e7d5, + 0x43c8c88b, + 0x5937376e, + 0xb76d6dda, + 0x8c8d8d01, + 0x64d5d5b1, + 0xd24e4e9c, + 0xe0a9a949, + 0xb46c6cd8, + 0xfa5656ac, + 0x07f4f4f3, + 0x25eaeacf, + 0xaf6565ca, + 0x8e7a7af4, + 0xe9aeae47, + 0x18080810, + 0xd5baba6f, + 0x887878f0, + 0x6f25254a, + 0x722e2e5c, + 0x241c1c38, + 0xf1a6a657, + 0xc7b4b473, + 0x51c6c697, + 0x23e8e8cb, + 0x7cdddda1, + 0x9c7474e8, + 0x211f1f3e, + 0xdd4b4b96, + 0xdcbdbd61, + 0x868b8b0d, + 0x858a8a0f, + 0x907070e0, + 0x423e3e7c, + 0xc4b5b571, + 0xaa6666cc, + 0xd8484890, + 0x05030306, + 0x01f6f6f7, + 0x120e0e1c, + 0xa36161c2, + 0x5f35356a, + 0xf95757ae, + 0xd0b9b969, + 0x91868617, + 0x58c1c199, + 0x271d1d3a, + 0xb99e9e27, + 0x38e1e1d9, + 0x13f8f8eb, + 0xb398982b, + 0x33111122, + 0xbb6969d2, + 0x70d9d9a9, + 0x898e8e07, + 0xa7949433, + 0xb69b9b2d, + 0x221e1e3c, + 0x92878715, + 0x20e9e9c9, + 0x49cece87, + 0xff5555aa, + 0x78282850, + 0x7adfdfa5, + 0x8f8c8c03, + 0xf8a1a159, + 0x80898909, + 0x170d0d1a, + 0xdabfbf65, + 0x31e6e6d7, + 0xc6424284, + 0xb86868d0, + 0xc3414182, + 0xb0999929, + 0x772d2d5a, + 0x110f0f1e, + 0xcbb0b07b, + 0xfc5454a8, + 0xd6bbbb6d, + 0x3a16162c +]; + +final _t1 = [ + 0x6363c6a5, + 0x7c7cf884, + 0x7777ee99, + 0x7b7bf68d, + 0xf2f2ff0d, + 0x6b6bd6bd, + 0x6f6fdeb1, + 0xc5c59154, + 0x30306050, + 0x01010203, + 0x6767cea9, + 0x2b2b567d, + 0xfefee719, + 0xd7d7b562, + 0xabab4de6, + 0x7676ec9a, + 0xcaca8f45, + 0x82821f9d, + 0xc9c98940, + 0x7d7dfa87, + 0xfafaef15, + 0x5959b2eb, + 0x47478ec9, + 0xf0f0fb0b, + 0xadad41ec, + 0xd4d4b367, + 0xa2a25ffd, + 0xafaf45ea, + 0x9c9c23bf, + 0xa4a453f7, + 0x7272e496, + 0xc0c09b5b, + 0xb7b775c2, + 0xfdfde11c, + 0x93933dae, + 0x26264c6a, + 0x36366c5a, + 0x3f3f7e41, + 0xf7f7f502, + 0xcccc834f, + 0x3434685c, + 0xa5a551f4, + 0xe5e5d134, + 0xf1f1f908, + 0x7171e293, + 0xd8d8ab73, + 0x31316253, + 0x15152a3f, + 0x0404080c, + 0xc7c79552, + 0x23234665, + 0xc3c39d5e, + 0x18183028, + 0x969637a1, + 0x05050a0f, + 0x9a9a2fb5, + 0x07070e09, + 0x12122436, + 0x80801b9b, + 0xe2e2df3d, + 0xebebcd26, + 0x27274e69, + 0xb2b27fcd, + 0x7575ea9f, + 0x0909121b, + 0x83831d9e, + 0x2c2c5874, + 0x1a1a342e, + 0x1b1b362d, + 0x6e6edcb2, + 0x5a5ab4ee, + 0xa0a05bfb, + 0x5252a4f6, + 0x3b3b764d, + 0xd6d6b761, + 0xb3b37dce, + 0x2929527b, + 0xe3e3dd3e, + 0x2f2f5e71, + 0x84841397, + 0x5353a6f5, + 0xd1d1b968, + 0x00000000, + 0xededc12c, + 0x20204060, + 0xfcfce31f, + 0xb1b179c8, + 0x5b5bb6ed, + 0x6a6ad4be, + 0xcbcb8d46, + 0xbebe67d9, + 0x3939724b, + 0x4a4a94de, + 0x4c4c98d4, + 0x5858b0e8, + 0xcfcf854a, + 0xd0d0bb6b, + 0xefefc52a, + 0xaaaa4fe5, + 0xfbfbed16, + 0x434386c5, + 0x4d4d9ad7, + 0x33336655, + 0x85851194, + 0x45458acf, + 0xf9f9e910, + 0x02020406, + 0x7f7ffe81, + 0x5050a0f0, + 0x3c3c7844, + 0x9f9f25ba, + 0xa8a84be3, + 0x5151a2f3, + 0xa3a35dfe, + 0x404080c0, + 0x8f8f058a, + 0x92923fad, + 0x9d9d21bc, + 0x38387048, + 0xf5f5f104, + 0xbcbc63df, + 0xb6b677c1, + 0xdadaaf75, + 0x21214263, + 0x10102030, + 0xffffe51a, + 0xf3f3fd0e, + 0xd2d2bf6d, + 0xcdcd814c, + 0x0c0c1814, + 0x13132635, + 0xececc32f, + 0x5f5fbee1, + 0x979735a2, + 0x444488cc, + 0x17172e39, + 0xc4c49357, + 0xa7a755f2, + 0x7e7efc82, + 0x3d3d7a47, + 0x6464c8ac, + 0x5d5dbae7, + 0x1919322b, + 0x7373e695, + 0x6060c0a0, + 0x81811998, + 0x4f4f9ed1, + 0xdcdca37f, + 0x22224466, + 0x2a2a547e, + 0x90903bab, + 0x88880b83, + 0x46468cca, + 0xeeeec729, + 0xb8b86bd3, + 0x1414283c, + 0xdedea779, + 0x5e5ebce2, + 0x0b0b161d, + 0xdbdbad76, + 0xe0e0db3b, + 0x32326456, + 0x3a3a744e, + 0x0a0a141e, + 0x494992db, + 0x06060c0a, + 0x2424486c, + 0x5c5cb8e4, + 0xc2c29f5d, + 0xd3d3bd6e, + 0xacac43ef, + 0x6262c4a6, + 0x919139a8, + 0x959531a4, + 0xe4e4d337, + 0x7979f28b, + 0xe7e7d532, + 0xc8c88b43, + 0x37376e59, + 0x6d6ddab7, + 0x8d8d018c, + 0xd5d5b164, + 0x4e4e9cd2, + 0xa9a949e0, + 0x6c6cd8b4, + 0x5656acfa, + 0xf4f4f307, + 0xeaeacf25, + 0x6565caaf, + 0x7a7af48e, + 0xaeae47e9, + 0x08081018, + 0xbaba6fd5, + 0x7878f088, + 0x25254a6f, + 0x2e2e5c72, + 0x1c1c3824, + 0xa6a657f1, + 0xb4b473c7, + 0xc6c69751, + 0xe8e8cb23, + 0xdddda17c, + 0x7474e89c, + 0x1f1f3e21, + 0x4b4b96dd, + 0xbdbd61dc, + 0x8b8b0d86, + 0x8a8a0f85, + 0x7070e090, + 0x3e3e7c42, + 0xb5b571c4, + 0x6666ccaa, + 0x484890d8, + 0x03030605, + 0xf6f6f701, + 0x0e0e1c12, + 0x6161c2a3, + 0x35356a5f, + 0x5757aef9, + 0xb9b969d0, + 0x86861791, + 0xc1c19958, + 0x1d1d3a27, + 0x9e9e27b9, + 0xe1e1d938, + 0xf8f8eb13, + 0x98982bb3, + 0x11112233, + 0x6969d2bb, + 0xd9d9a970, + 0x8e8e0789, + 0x949433a7, + 0x9b9b2db6, + 0x1e1e3c22, + 0x87871592, + 0xe9e9c920, + 0xcece8749, + 0x5555aaff, + 0x28285078, + 0xdfdfa57a, + 0x8c8c038f, + 0xa1a159f8, + 0x89890980, + 0x0d0d1a17, + 0xbfbf65da, + 0xe6e6d731, + 0x424284c6, + 0x6868d0b8, + 0x414182c3, + 0x999929b0, + 0x2d2d5a77, + 0x0f0f1e11, + 0xb0b07bcb, + 0x5454a8fc, + 0xbbbb6dd6, + 0x16162c3a +]; + +final _t2 = [ + 0x63c6a563, + 0x7cf8847c, + 0x77ee9977, + 0x7bf68d7b, + 0xf2ff0df2, + 0x6bd6bd6b, + 0x6fdeb16f, + 0xc59154c5, + 0x30605030, + 0x01020301, + 0x67cea967, + 0x2b567d2b, + 0xfee719fe, + 0xd7b562d7, + 0xab4de6ab, + 0x76ec9a76, + 0xca8f45ca, + 0x821f9d82, + 0xc98940c9, + 0x7dfa877d, + 0xfaef15fa, + 0x59b2eb59, + 0x478ec947, + 0xf0fb0bf0, + 0xad41ecad, + 0xd4b367d4, + 0xa25ffda2, + 0xaf45eaaf, + 0x9c23bf9c, + 0xa453f7a4, + 0x72e49672, + 0xc09b5bc0, + 0xb775c2b7, + 0xfde11cfd, + 0x933dae93, + 0x264c6a26, + 0x366c5a36, + 0x3f7e413f, + 0xf7f502f7, + 0xcc834fcc, + 0x34685c34, + 0xa551f4a5, + 0xe5d134e5, + 0xf1f908f1, + 0x71e29371, + 0xd8ab73d8, + 0x31625331, + 0x152a3f15, + 0x04080c04, + 0xc79552c7, + 0x23466523, + 0xc39d5ec3, + 0x18302818, + 0x9637a196, + 0x050a0f05, + 0x9a2fb59a, + 0x070e0907, + 0x12243612, + 0x801b9b80, + 0xe2df3de2, + 0xebcd26eb, + 0x274e6927, + 0xb27fcdb2, + 0x75ea9f75, + 0x09121b09, + 0x831d9e83, + 0x2c58742c, + 0x1a342e1a, + 0x1b362d1b, + 0x6edcb26e, + 0x5ab4ee5a, + 0xa05bfba0, + 0x52a4f652, + 0x3b764d3b, + 0xd6b761d6, + 0xb37dceb3, + 0x29527b29, + 0xe3dd3ee3, + 0x2f5e712f, + 0x84139784, + 0x53a6f553, + 0xd1b968d1, + 0x00000000, + 0xedc12ced, + 0x20406020, + 0xfce31ffc, + 0xb179c8b1, + 0x5bb6ed5b, + 0x6ad4be6a, + 0xcb8d46cb, + 0xbe67d9be, + 0x39724b39, + 0x4a94de4a, + 0x4c98d44c, + 0x58b0e858, + 0xcf854acf, + 0xd0bb6bd0, + 0xefc52aef, + 0xaa4fe5aa, + 0xfbed16fb, + 0x4386c543, + 0x4d9ad74d, + 0x33665533, + 0x85119485, + 0x458acf45, + 0xf9e910f9, + 0x02040602, + 0x7ffe817f, + 0x50a0f050, + 0x3c78443c, + 0x9f25ba9f, + 0xa84be3a8, + 0x51a2f351, + 0xa35dfea3, + 0x4080c040, + 0x8f058a8f, + 0x923fad92, + 0x9d21bc9d, + 0x38704838, + 0xf5f104f5, + 0xbc63dfbc, + 0xb677c1b6, + 0xdaaf75da, + 0x21426321, + 0x10203010, + 0xffe51aff, + 0xf3fd0ef3, + 0xd2bf6dd2, + 0xcd814ccd, + 0x0c18140c, + 0x13263513, + 0xecc32fec, + 0x5fbee15f, + 0x9735a297, + 0x4488cc44, + 0x172e3917, + 0xc49357c4, + 0xa755f2a7, + 0x7efc827e, + 0x3d7a473d, + 0x64c8ac64, + 0x5dbae75d, + 0x19322b19, + 0x73e69573, + 0x60c0a060, + 0x81199881, + 0x4f9ed14f, + 0xdca37fdc, + 0x22446622, + 0x2a547e2a, + 0x903bab90, + 0x880b8388, + 0x468cca46, + 0xeec729ee, + 0xb86bd3b8, + 0x14283c14, + 0xdea779de, + 0x5ebce25e, + 0x0b161d0b, + 0xdbad76db, + 0xe0db3be0, + 0x32645632, + 0x3a744e3a, + 0x0a141e0a, + 0x4992db49, + 0x060c0a06, + 0x24486c24, + 0x5cb8e45c, + 0xc29f5dc2, + 0xd3bd6ed3, + 0xac43efac, + 0x62c4a662, + 0x9139a891, + 0x9531a495, + 0xe4d337e4, + 0x79f28b79, + 0xe7d532e7, + 0xc88b43c8, + 0x376e5937, + 0x6ddab76d, + 0x8d018c8d, + 0xd5b164d5, + 0x4e9cd24e, + 0xa949e0a9, + 0x6cd8b46c, + 0x56acfa56, + 0xf4f307f4, + 0xeacf25ea, + 0x65caaf65, + 0x7af48e7a, + 0xae47e9ae, + 0x08101808, + 0xba6fd5ba, + 0x78f08878, + 0x254a6f25, + 0x2e5c722e, + 0x1c38241c, + 0xa657f1a6, + 0xb473c7b4, + 0xc69751c6, + 0xe8cb23e8, + 0xdda17cdd, + 0x74e89c74, + 0x1f3e211f, + 0x4b96dd4b, + 0xbd61dcbd, + 0x8b0d868b, + 0x8a0f858a, + 0x70e09070, + 0x3e7c423e, + 0xb571c4b5, + 0x66ccaa66, + 0x4890d848, + 0x03060503, + 0xf6f701f6, + 0x0e1c120e, + 0x61c2a361, + 0x356a5f35, + 0x57aef957, + 0xb969d0b9, + 0x86179186, + 0xc19958c1, + 0x1d3a271d, + 0x9e27b99e, + 0xe1d938e1, + 0xf8eb13f8, + 0x982bb398, + 0x11223311, + 0x69d2bb69, + 0xd9a970d9, + 0x8e07898e, + 0x9433a794, + 0x9b2db69b, + 0x1e3c221e, + 0x87159287, + 0xe9c920e9, + 0xce8749ce, + 0x55aaff55, + 0x28507828, + 0xdfa57adf, + 0x8c038f8c, + 0xa159f8a1, + 0x89098089, + 0x0d1a170d, + 0xbf65dabf, + 0xe6d731e6, + 0x4284c642, + 0x68d0b868, + 0x4182c341, + 0x9929b099, + 0x2d5a772d, + 0x0f1e110f, + 0xb07bcbb0, + 0x54a8fc54, + 0xbb6dd6bb, + 0x162c3a16 +]; + +final _t3 = [ + 0xc6a56363, + 0xf8847c7c, + 0xee997777, + 0xf68d7b7b, + 0xff0df2f2, + 0xd6bd6b6b, + 0xdeb16f6f, + 0x9154c5c5, + 0x60503030, + 0x02030101, + 0xcea96767, + 0x567d2b2b, + 0xe719fefe, + 0xb562d7d7, + 0x4de6abab, + 0xec9a7676, + 0x8f45caca, + 0x1f9d8282, + 0x8940c9c9, + 0xfa877d7d, + 0xef15fafa, + 0xb2eb5959, + 0x8ec94747, + 0xfb0bf0f0, + 0x41ecadad, + 0xb367d4d4, + 0x5ffda2a2, + 0x45eaafaf, + 0x23bf9c9c, + 0x53f7a4a4, + 0xe4967272, + 0x9b5bc0c0, + 0x75c2b7b7, + 0xe11cfdfd, + 0x3dae9393, + 0x4c6a2626, + 0x6c5a3636, + 0x7e413f3f, + 0xf502f7f7, + 0x834fcccc, + 0x685c3434, + 0x51f4a5a5, + 0xd134e5e5, + 0xf908f1f1, + 0xe2937171, + 0xab73d8d8, + 0x62533131, + 0x2a3f1515, + 0x080c0404, + 0x9552c7c7, + 0x46652323, + 0x9d5ec3c3, + 0x30281818, + 0x37a19696, + 0x0a0f0505, + 0x2fb59a9a, + 0x0e090707, + 0x24361212, + 0x1b9b8080, + 0xdf3de2e2, + 0xcd26ebeb, + 0x4e692727, + 0x7fcdb2b2, + 0xea9f7575, + 0x121b0909, + 0x1d9e8383, + 0x58742c2c, + 0x342e1a1a, + 0x362d1b1b, + 0xdcb26e6e, + 0xb4ee5a5a, + 0x5bfba0a0, + 0xa4f65252, + 0x764d3b3b, + 0xb761d6d6, + 0x7dceb3b3, + 0x527b2929, + 0xdd3ee3e3, + 0x5e712f2f, + 0x13978484, + 0xa6f55353, + 0xb968d1d1, + 0x00000000, + 0xc12ceded, + 0x40602020, + 0xe31ffcfc, + 0x79c8b1b1, + 0xb6ed5b5b, + 0xd4be6a6a, + 0x8d46cbcb, + 0x67d9bebe, + 0x724b3939, + 0x94de4a4a, + 0x98d44c4c, + 0xb0e85858, + 0x854acfcf, + 0xbb6bd0d0, + 0xc52aefef, + 0x4fe5aaaa, + 0xed16fbfb, + 0x86c54343, + 0x9ad74d4d, + 0x66553333, + 0x11948585, + 0x8acf4545, + 0xe910f9f9, + 0x04060202, + 0xfe817f7f, + 0xa0f05050, + 0x78443c3c, + 0x25ba9f9f, + 0x4be3a8a8, + 0xa2f35151, + 0x5dfea3a3, + 0x80c04040, + 0x058a8f8f, + 0x3fad9292, + 0x21bc9d9d, + 0x70483838, + 0xf104f5f5, + 0x63dfbcbc, + 0x77c1b6b6, + 0xaf75dada, + 0x42632121, + 0x20301010, + 0xe51affff, + 0xfd0ef3f3, + 0xbf6dd2d2, + 0x814ccdcd, + 0x18140c0c, + 0x26351313, + 0xc32fecec, + 0xbee15f5f, + 0x35a29797, + 0x88cc4444, + 0x2e391717, + 0x9357c4c4, + 0x55f2a7a7, + 0xfc827e7e, + 0x7a473d3d, + 0xc8ac6464, + 0xbae75d5d, + 0x322b1919, + 0xe6957373, + 0xc0a06060, + 0x19988181, + 0x9ed14f4f, + 0xa37fdcdc, + 0x44662222, + 0x547e2a2a, + 0x3bab9090, + 0x0b838888, + 0x8cca4646, + 0xc729eeee, + 0x6bd3b8b8, + 0x283c1414, + 0xa779dede, + 0xbce25e5e, + 0x161d0b0b, + 0xad76dbdb, + 0xdb3be0e0, + 0x64563232, + 0x744e3a3a, + 0x141e0a0a, + 0x92db4949, + 0x0c0a0606, + 0x486c2424, + 0xb8e45c5c, + 0x9f5dc2c2, + 0xbd6ed3d3, + 0x43efacac, + 0xc4a66262, + 0x39a89191, + 0x31a49595, + 0xd337e4e4, + 0xf28b7979, + 0xd532e7e7, + 0x8b43c8c8, + 0x6e593737, + 0xdab76d6d, + 0x018c8d8d, + 0xb164d5d5, + 0x9cd24e4e, + 0x49e0a9a9, + 0xd8b46c6c, + 0xacfa5656, + 0xf307f4f4, + 0xcf25eaea, + 0xcaaf6565, + 0xf48e7a7a, + 0x47e9aeae, + 0x10180808, + 0x6fd5baba, + 0xf0887878, + 0x4a6f2525, + 0x5c722e2e, + 0x38241c1c, + 0x57f1a6a6, + 0x73c7b4b4, + 0x9751c6c6, + 0xcb23e8e8, + 0xa17cdddd, + 0xe89c7474, + 0x3e211f1f, + 0x96dd4b4b, + 0x61dcbdbd, + 0x0d868b8b, + 0x0f858a8a, + 0xe0907070, + 0x7c423e3e, + 0x71c4b5b5, + 0xccaa6666, + 0x90d84848, + 0x06050303, + 0xf701f6f6, + 0x1c120e0e, + 0xc2a36161, + 0x6a5f3535, + 0xaef95757, + 0x69d0b9b9, + 0x17918686, + 0x9958c1c1, + 0x3a271d1d, + 0x27b99e9e, + 0xd938e1e1, + 0xeb13f8f8, + 0x2bb39898, + 0x22331111, + 0xd2bb6969, + 0xa970d9d9, + 0x07898e8e, + 0x33a79494, + 0x2db69b9b, + 0x3c221e1e, + 0x15928787, + 0xc920e9e9, + 0x8749cece, + 0xaaff5555, + 0x50782828, + 0xa57adfdf, + 0x038f8c8c, + 0x59f8a1a1, + 0x09808989, + 0x1a170d0d, + 0x65dabfbf, + 0xd731e6e6, + 0x84c64242, + 0xd0b86868, + 0x82c34141, + 0x29b09999, + 0x5a772d2d, + 0x1e110f0f, + 0x7bcbb0b0, + 0xa8fc5454, + 0x6dd6bbbb, + 0x2c3a1616 +]; + +final _tinv0 = [ + 0x50a7f451, + 0x5365417e, + 0xc3a4171a, + 0x965e273a, + 0xcb6bab3b, + 0xf1459d1f, + 0xab58faac, + 0x9303e34b, + 0x55fa3020, + 0xf66d76ad, + 0x9176cc88, + 0x254c02f5, + 0xfcd7e54f, + 0xd7cb2ac5, + 0x80443526, + 0x8fa362b5, + 0x495ab1de, + 0x671bba25, + 0x980eea45, + 0xe1c0fe5d, + 0x02752fc3, + 0x12f04c81, + 0xa397468d, + 0xc6f9d36b, + 0xe75f8f03, + 0x959c9215, + 0xeb7a6dbf, + 0xda595295, + 0x2d83bed4, + 0xd3217458, + 0x2969e049, + 0x44c8c98e, + 0x6a89c275, + 0x78798ef4, + 0x6b3e5899, + 0xdd71b927, + 0xb64fe1be, + 0x17ad88f0, + 0x66ac20c9, + 0xb43ace7d, + 0x184adf63, + 0x82311ae5, + 0x60335197, + 0x457f5362, + 0xe07764b1, + 0x84ae6bbb, + 0x1ca081fe, + 0x942b08f9, + 0x58684870, + 0x19fd458f, + 0x876cde94, + 0xb7f87b52, + 0x23d373ab, + 0xe2024b72, + 0x578f1fe3, + 0x2aab5566, + 0x0728ebb2, + 0x03c2b52f, + 0x9a7bc586, + 0xa50837d3, + 0xf2872830, + 0xb2a5bf23, + 0xba6a0302, + 0x5c8216ed, + 0x2b1ccf8a, + 0x92b479a7, + 0xf0f207f3, + 0xa1e2694e, + 0xcdf4da65, + 0xd5be0506, + 0x1f6234d1, + 0x8afea6c4, + 0x9d532e34, + 0xa055f3a2, + 0x32e18a05, + 0x75ebf6a4, + 0x39ec830b, + 0xaaef6040, + 0x069f715e, + 0x51106ebd, + 0xf98a213e, + 0x3d06dd96, + 0xae053edd, + 0x46bde64d, + 0xb58d5491, + 0x055dc471, + 0x6fd40604, + 0xff155060, + 0x24fb9819, + 0x97e9bdd6, + 0xcc434089, + 0x779ed967, + 0xbd42e8b0, + 0x888b8907, + 0x385b19e7, + 0xdbeec879, + 0x470a7ca1, + 0xe90f427c, + 0xc91e84f8, + 0x00000000, + 0x83868009, + 0x48ed2b32, + 0xac70111e, + 0x4e725a6c, + 0xfbff0efd, + 0x5638850f, + 0x1ed5ae3d, + 0x27392d36, + 0x64d90f0a, + 0x21a65c68, + 0xd1545b9b, + 0x3a2e3624, + 0xb1670a0c, + 0x0fe75793, + 0xd296eeb4, + 0x9e919b1b, + 0x4fc5c080, + 0xa220dc61, + 0x694b775a, + 0x161a121c, + 0x0aba93e2, + 0xe52aa0c0, + 0x43e0223c, + 0x1d171b12, + 0x0b0d090e, + 0xadc78bf2, + 0xb9a8b62d, + 0xc8a91e14, + 0x8519f157, + 0x4c0775af, + 0xbbdd99ee, + 0xfd607fa3, + 0x9f2601f7, + 0xbcf5725c, + 0xc53b6644, + 0x347efb5b, + 0x7629438b, + 0xdcc623cb, + 0x68fcedb6, + 0x63f1e4b8, + 0xcadc31d7, + 0x10856342, + 0x40229713, + 0x2011c684, + 0x7d244a85, + 0xf83dbbd2, + 0x1132f9ae, + 0x6da129c7, + 0x4b2f9e1d, + 0xf330b2dc, + 0xec52860d, + 0xd0e3c177, + 0x6c16b32b, + 0x99b970a9, + 0xfa489411, + 0x2264e947, + 0xc48cfca8, + 0x1a3ff0a0, + 0xd82c7d56, + 0xef903322, + 0xc74e4987, + 0xc1d138d9, + 0xfea2ca8c, + 0x360bd498, + 0xcf81f5a6, + 0x28de7aa5, + 0x268eb7da, + 0xa4bfad3f, + 0xe49d3a2c, + 0x0d927850, + 0x9bcc5f6a, + 0x62467e54, + 0xc2138df6, + 0xe8b8d890, + 0x5ef7392e, + 0xf5afc382, + 0xbe805d9f, + 0x7c93d069, + 0xa92dd56f, + 0xb31225cf, + 0x3b99acc8, + 0xa77d1810, + 0x6e639ce8, + 0x7bbb3bdb, + 0x097826cd, + 0xf418596e, + 0x01b79aec, + 0xa89a4f83, + 0x656e95e6, + 0x7ee6ffaa, + 0x08cfbc21, + 0xe6e815ef, + 0xd99be7ba, + 0xce366f4a, + 0xd4099fea, + 0xd67cb029, + 0xafb2a431, + 0x31233f2a, + 0x3094a5c6, + 0xc066a235, + 0x37bc4e74, + 0xa6ca82fc, + 0xb0d090e0, + 0x15d8a733, + 0x4a9804f1, + 0xf7daec41, + 0x0e50cd7f, + 0x2ff69117, + 0x8dd64d76, + 0x4db0ef43, + 0x544daacc, + 0xdf0496e4, + 0xe3b5d19e, + 0x1b886a4c, + 0xb81f2cc1, + 0x7f516546, + 0x04ea5e9d, + 0x5d358c01, + 0x737487fa, + 0x2e410bfb, + 0x5a1d67b3, + 0x52d2db92, + 0x335610e9, + 0x1347d66d, + 0x8c61d79a, + 0x7a0ca137, + 0x8e14f859, + 0x893c13eb, + 0xee27a9ce, + 0x35c961b7, + 0xede51ce1, + 0x3cb1477a, + 0x59dfd29c, + 0x3f73f255, + 0x79ce1418, + 0xbf37c773, + 0xeacdf753, + 0x5baafd5f, + 0x146f3ddf, + 0x86db4478, + 0x81f3afca, + 0x3ec468b9, + 0x2c342438, + 0x5f40a3c2, + 0x72c31d16, + 0x0c25e2bc, + 0x8b493c28, + 0x41950dff, + 0x7101a839, + 0xdeb30c08, + 0x9ce4b4d8, + 0x90c15664, + 0x6184cb7b, + 0x70b632d5, + 0x745c6c48, + 0x4257b8d0 +]; + +final _tinv1 = [ + 0xa7f45150, + 0x65417e53, + 0xa4171ac3, + 0x5e273a96, + 0x6bab3bcb, + 0x459d1ff1, + 0x58faacab, + 0x03e34b93, + 0xfa302055, + 0x6d76adf6, + 0x76cc8891, + 0x4c02f525, + 0xd7e54ffc, + 0xcb2ac5d7, + 0x44352680, + 0xa362b58f, + 0x5ab1de49, + 0x1bba2567, + 0x0eea4598, + 0xc0fe5de1, + 0x752fc302, + 0xf04c8112, + 0x97468da3, + 0xf9d36bc6, + 0x5f8f03e7, + 0x9c921595, + 0x7a6dbfeb, + 0x595295da, + 0x83bed42d, + 0x217458d3, + 0x69e04929, + 0xc8c98e44, + 0x89c2756a, + 0x798ef478, + 0x3e58996b, + 0x71b927dd, + 0x4fe1beb6, + 0xad88f017, + 0xac20c966, + 0x3ace7db4, + 0x4adf6318, + 0x311ae582, + 0x33519760, + 0x7f536245, + 0x7764b1e0, + 0xae6bbb84, + 0xa081fe1c, + 0x2b08f994, + 0x68487058, + 0xfd458f19, + 0x6cde9487, + 0xf87b52b7, + 0xd373ab23, + 0x024b72e2, + 0x8f1fe357, + 0xab55662a, + 0x28ebb207, + 0xc2b52f03, + 0x7bc5869a, + 0x0837d3a5, + 0x872830f2, + 0xa5bf23b2, + 0x6a0302ba, + 0x8216ed5c, + 0x1ccf8a2b, + 0xb479a792, + 0xf207f3f0, + 0xe2694ea1, + 0xf4da65cd, + 0xbe0506d5, + 0x6234d11f, + 0xfea6c48a, + 0x532e349d, + 0x55f3a2a0, + 0xe18a0532, + 0xebf6a475, + 0xec830b39, + 0xef6040aa, + 0x9f715e06, + 0x106ebd51, + 0x8a213ef9, + 0x06dd963d, + 0x053eddae, + 0xbde64d46, + 0x8d5491b5, + 0x5dc47105, + 0xd406046f, + 0x155060ff, + 0xfb981924, + 0xe9bdd697, + 0x434089cc, + 0x9ed96777, + 0x42e8b0bd, + 0x8b890788, + 0x5b19e738, + 0xeec879db, + 0x0a7ca147, + 0x0f427ce9, + 0x1e84f8c9, + 0x00000000, + 0x86800983, + 0xed2b3248, + 0x70111eac, + 0x725a6c4e, + 0xff0efdfb, + 0x38850f56, + 0xd5ae3d1e, + 0x392d3627, + 0xd90f0a64, + 0xa65c6821, + 0x545b9bd1, + 0x2e36243a, + 0x670a0cb1, + 0xe757930f, + 0x96eeb4d2, + 0x919b1b9e, + 0xc5c0804f, + 0x20dc61a2, + 0x4b775a69, + 0x1a121c16, + 0xba93e20a, + 0x2aa0c0e5, + 0xe0223c43, + 0x171b121d, + 0x0d090e0b, + 0xc78bf2ad, + 0xa8b62db9, + 0xa91e14c8, + 0x19f15785, + 0x0775af4c, + 0xdd99eebb, + 0x607fa3fd, + 0x2601f79f, + 0xf5725cbc, + 0x3b6644c5, + 0x7efb5b34, + 0x29438b76, + 0xc623cbdc, + 0xfcedb668, + 0xf1e4b863, + 0xdc31d7ca, + 0x85634210, + 0x22971340, + 0x11c68420, + 0x244a857d, + 0x3dbbd2f8, + 0x32f9ae11, + 0xa129c76d, + 0x2f9e1d4b, + 0x30b2dcf3, + 0x52860dec, + 0xe3c177d0, + 0x16b32b6c, + 0xb970a999, + 0x489411fa, + 0x64e94722, + 0x8cfca8c4, + 0x3ff0a01a, + 0x2c7d56d8, + 0x903322ef, + 0x4e4987c7, + 0xd138d9c1, + 0xa2ca8cfe, + 0x0bd49836, + 0x81f5a6cf, + 0xde7aa528, + 0x8eb7da26, + 0xbfad3fa4, + 0x9d3a2ce4, + 0x9278500d, + 0xcc5f6a9b, + 0x467e5462, + 0x138df6c2, + 0xb8d890e8, + 0xf7392e5e, + 0xafc382f5, + 0x805d9fbe, + 0x93d0697c, + 0x2dd56fa9, + 0x1225cfb3, + 0x99acc83b, + 0x7d1810a7, + 0x639ce86e, + 0xbb3bdb7b, + 0x7826cd09, + 0x18596ef4, + 0xb79aec01, + 0x9a4f83a8, + 0x6e95e665, + 0xe6ffaa7e, + 0xcfbc2108, + 0xe815efe6, + 0x9be7bad9, + 0x366f4ace, + 0x099fead4, + 0x7cb029d6, + 0xb2a431af, + 0x233f2a31, + 0x94a5c630, + 0x66a235c0, + 0xbc4e7437, + 0xca82fca6, + 0xd090e0b0, + 0xd8a73315, + 0x9804f14a, + 0xdaec41f7, + 0x50cd7f0e, + 0xf691172f, + 0xd64d768d, + 0xb0ef434d, + 0x4daacc54, + 0x0496e4df, + 0xb5d19ee3, + 0x886a4c1b, + 0x1f2cc1b8, + 0x5165467f, + 0xea5e9d04, + 0x358c015d, + 0x7487fa73, + 0x410bfb2e, + 0x1d67b35a, + 0xd2db9252, + 0x5610e933, + 0x47d66d13, + 0x61d79a8c, + 0x0ca1377a, + 0x14f8598e, + 0x3c13eb89, + 0x27a9ceee, + 0xc961b735, + 0xe51ce1ed, + 0xb1477a3c, + 0xdfd29c59, + 0x73f2553f, + 0xce141879, + 0x37c773bf, + 0xcdf753ea, + 0xaafd5f5b, + 0x6f3ddf14, + 0xdb447886, + 0xf3afca81, + 0xc468b93e, + 0x3424382c, + 0x40a3c25f, + 0xc31d1672, + 0x25e2bc0c, + 0x493c288b, + 0x950dff41, + 0x01a83971, + 0xb30c08de, + 0xe4b4d89c, + 0xc1566490, + 0x84cb7b61, + 0xb632d570, + 0x5c6c4874, + 0x57b8d042 +]; + +final _tinv2 = [ + 0xf45150a7, + 0x417e5365, + 0x171ac3a4, + 0x273a965e, + 0xab3bcb6b, + 0x9d1ff145, + 0xfaacab58, + 0xe34b9303, + 0x302055fa, + 0x76adf66d, + 0xcc889176, + 0x02f5254c, + 0xe54ffcd7, + 0x2ac5d7cb, + 0x35268044, + 0x62b58fa3, + 0xb1de495a, + 0xba25671b, + 0xea45980e, + 0xfe5de1c0, + 0x2fc30275, + 0x4c8112f0, + 0x468da397, + 0xd36bc6f9, + 0x8f03e75f, + 0x9215959c, + 0x6dbfeb7a, + 0x5295da59, + 0xbed42d83, + 0x7458d321, + 0xe0492969, + 0xc98e44c8, + 0xc2756a89, + 0x8ef47879, + 0x58996b3e, + 0xb927dd71, + 0xe1beb64f, + 0x88f017ad, + 0x20c966ac, + 0xce7db43a, + 0xdf63184a, + 0x1ae58231, + 0x51976033, + 0x5362457f, + 0x64b1e077, + 0x6bbb84ae, + 0x81fe1ca0, + 0x08f9942b, + 0x48705868, + 0x458f19fd, + 0xde94876c, + 0x7b52b7f8, + 0x73ab23d3, + 0x4b72e202, + 0x1fe3578f, + 0x55662aab, + 0xebb20728, + 0xb52f03c2, + 0xc5869a7b, + 0x37d3a508, + 0x2830f287, + 0xbf23b2a5, + 0x0302ba6a, + 0x16ed5c82, + 0xcf8a2b1c, + 0x79a792b4, + 0x07f3f0f2, + 0x694ea1e2, + 0xda65cdf4, + 0x0506d5be, + 0x34d11f62, + 0xa6c48afe, + 0x2e349d53, + 0xf3a2a055, + 0x8a0532e1, + 0xf6a475eb, + 0x830b39ec, + 0x6040aaef, + 0x715e069f, + 0x6ebd5110, + 0x213ef98a, + 0xdd963d06, + 0x3eddae05, + 0xe64d46bd, + 0x5491b58d, + 0xc471055d, + 0x06046fd4, + 0x5060ff15, + 0x981924fb, + 0xbdd697e9, + 0x4089cc43, + 0xd967779e, + 0xe8b0bd42, + 0x8907888b, + 0x19e7385b, + 0xc879dbee, + 0x7ca1470a, + 0x427ce90f, + 0x84f8c91e, + 0x00000000, + 0x80098386, + 0x2b3248ed, + 0x111eac70, + 0x5a6c4e72, + 0x0efdfbff, + 0x850f5638, + 0xae3d1ed5, + 0x2d362739, + 0x0f0a64d9, + 0x5c6821a6, + 0x5b9bd154, + 0x36243a2e, + 0x0a0cb167, + 0x57930fe7, + 0xeeb4d296, + 0x9b1b9e91, + 0xc0804fc5, + 0xdc61a220, + 0x775a694b, + 0x121c161a, + 0x93e20aba, + 0xa0c0e52a, + 0x223c43e0, + 0x1b121d17, + 0x090e0b0d, + 0x8bf2adc7, + 0xb62db9a8, + 0x1e14c8a9, + 0xf1578519, + 0x75af4c07, + 0x99eebbdd, + 0x7fa3fd60, + 0x01f79f26, + 0x725cbcf5, + 0x6644c53b, + 0xfb5b347e, + 0x438b7629, + 0x23cbdcc6, + 0xedb668fc, + 0xe4b863f1, + 0x31d7cadc, + 0x63421085, + 0x97134022, + 0xc6842011, + 0x4a857d24, + 0xbbd2f83d, + 0xf9ae1132, + 0x29c76da1, + 0x9e1d4b2f, + 0xb2dcf330, + 0x860dec52, + 0xc177d0e3, + 0xb32b6c16, + 0x70a999b9, + 0x9411fa48, + 0xe9472264, + 0xfca8c48c, + 0xf0a01a3f, + 0x7d56d82c, + 0x3322ef90, + 0x4987c74e, + 0x38d9c1d1, + 0xca8cfea2, + 0xd498360b, + 0xf5a6cf81, + 0x7aa528de, + 0xb7da268e, + 0xad3fa4bf, + 0x3a2ce49d, + 0x78500d92, + 0x5f6a9bcc, + 0x7e546246, + 0x8df6c213, + 0xd890e8b8, + 0x392e5ef7, + 0xc382f5af, + 0x5d9fbe80, + 0xd0697c93, + 0xd56fa92d, + 0x25cfb312, + 0xacc83b99, + 0x1810a77d, + 0x9ce86e63, + 0x3bdb7bbb, + 0x26cd0978, + 0x596ef418, + 0x9aec01b7, + 0x4f83a89a, + 0x95e6656e, + 0xffaa7ee6, + 0xbc2108cf, + 0x15efe6e8, + 0xe7bad99b, + 0x6f4ace36, + 0x9fead409, + 0xb029d67c, + 0xa431afb2, + 0x3f2a3123, + 0xa5c63094, + 0xa235c066, + 0x4e7437bc, + 0x82fca6ca, + 0x90e0b0d0, + 0xa73315d8, + 0x04f14a98, + 0xec41f7da, + 0xcd7f0e50, + 0x91172ff6, + 0x4d768dd6, + 0xef434db0, + 0xaacc544d, + 0x96e4df04, + 0xd19ee3b5, + 0x6a4c1b88, + 0x2cc1b81f, + 0x65467f51, + 0x5e9d04ea, + 0x8c015d35, + 0x87fa7374, + 0x0bfb2e41, + 0x67b35a1d, + 0xdb9252d2, + 0x10e93356, + 0xd66d1347, + 0xd79a8c61, + 0xa1377a0c, + 0xf8598e14, + 0x13eb893c, + 0xa9ceee27, + 0x61b735c9, + 0x1ce1ede5, + 0x477a3cb1, + 0xd29c59df, + 0xf2553f73, + 0x141879ce, + 0xc773bf37, + 0xf753eacd, + 0xfd5f5baa, + 0x3ddf146f, + 0x447886db, + 0xafca81f3, + 0x68b93ec4, + 0x24382c34, + 0xa3c25f40, + 0x1d1672c3, + 0xe2bc0c25, + 0x3c288b49, + 0x0dff4195, + 0xa8397101, + 0x0c08deb3, + 0xb4d89ce4, + 0x566490c1, + 0xcb7b6184, + 0x32d570b6, + 0x6c48745c, + 0xb8d04257 +]; + +final _tinv3 = [ + 0x5150a7f4, + 0x7e536541, + 0x1ac3a417, + 0x3a965e27, + 0x3bcb6bab, + 0x1ff1459d, + 0xacab58fa, + 0x4b9303e3, + 0x2055fa30, + 0xadf66d76, + 0x889176cc, + 0xf5254c02, + 0x4ffcd7e5, + 0xc5d7cb2a, + 0x26804435, + 0xb58fa362, + 0xde495ab1, + 0x25671bba, + 0x45980eea, + 0x5de1c0fe, + 0xc302752f, + 0x8112f04c, + 0x8da39746, + 0x6bc6f9d3, + 0x03e75f8f, + 0x15959c92, + 0xbfeb7a6d, + 0x95da5952, + 0xd42d83be, + 0x58d32174, + 0x492969e0, + 0x8e44c8c9, + 0x756a89c2, + 0xf478798e, + 0x996b3e58, + 0x27dd71b9, + 0xbeb64fe1, + 0xf017ad88, + 0xc966ac20, + 0x7db43ace, + 0x63184adf, + 0xe582311a, + 0x97603351, + 0x62457f53, + 0xb1e07764, + 0xbb84ae6b, + 0xfe1ca081, + 0xf9942b08, + 0x70586848, + 0x8f19fd45, + 0x94876cde, + 0x52b7f87b, + 0xab23d373, + 0x72e2024b, + 0xe3578f1f, + 0x662aab55, + 0xb20728eb, + 0x2f03c2b5, + 0x869a7bc5, + 0xd3a50837, + 0x30f28728, + 0x23b2a5bf, + 0x02ba6a03, + 0xed5c8216, + 0x8a2b1ccf, + 0xa792b479, + 0xf3f0f207, + 0x4ea1e269, + 0x65cdf4da, + 0x06d5be05, + 0xd11f6234, + 0xc48afea6, + 0x349d532e, + 0xa2a055f3, + 0x0532e18a, + 0xa475ebf6, + 0x0b39ec83, + 0x40aaef60, + 0x5e069f71, + 0xbd51106e, + 0x3ef98a21, + 0x963d06dd, + 0xddae053e, + 0x4d46bde6, + 0x91b58d54, + 0x71055dc4, + 0x046fd406, + 0x60ff1550, + 0x1924fb98, + 0xd697e9bd, + 0x89cc4340, + 0x67779ed9, + 0xb0bd42e8, + 0x07888b89, + 0xe7385b19, + 0x79dbeec8, + 0xa1470a7c, + 0x7ce90f42, + 0xf8c91e84, + 0x00000000, + 0x09838680, + 0x3248ed2b, + 0x1eac7011, + 0x6c4e725a, + 0xfdfbff0e, + 0x0f563885, + 0x3d1ed5ae, + 0x3627392d, + 0x0a64d90f, + 0x6821a65c, + 0x9bd1545b, + 0x243a2e36, + 0x0cb1670a, + 0x930fe757, + 0xb4d296ee, + 0x1b9e919b, + 0x804fc5c0, + 0x61a220dc, + 0x5a694b77, + 0x1c161a12, + 0xe20aba93, + 0xc0e52aa0, + 0x3c43e022, + 0x121d171b, + 0x0e0b0d09, + 0xf2adc78b, + 0x2db9a8b6, + 0x14c8a91e, + 0x578519f1, + 0xaf4c0775, + 0xeebbdd99, + 0xa3fd607f, + 0xf79f2601, + 0x5cbcf572, + 0x44c53b66, + 0x5b347efb, + 0x8b762943, + 0xcbdcc623, + 0xb668fced, + 0xb863f1e4, + 0xd7cadc31, + 0x42108563, + 0x13402297, + 0x842011c6, + 0x857d244a, + 0xd2f83dbb, + 0xae1132f9, + 0xc76da129, + 0x1d4b2f9e, + 0xdcf330b2, + 0x0dec5286, + 0x77d0e3c1, + 0x2b6c16b3, + 0xa999b970, + 0x11fa4894, + 0x472264e9, + 0xa8c48cfc, + 0xa01a3ff0, + 0x56d82c7d, + 0x22ef9033, + 0x87c74e49, + 0xd9c1d138, + 0x8cfea2ca, + 0x98360bd4, + 0xa6cf81f5, + 0xa528de7a, + 0xda268eb7, + 0x3fa4bfad, + 0x2ce49d3a, + 0x500d9278, + 0x6a9bcc5f, + 0x5462467e, + 0xf6c2138d, + 0x90e8b8d8, + 0x2e5ef739, + 0x82f5afc3, + 0x9fbe805d, + 0x697c93d0, + 0x6fa92dd5, + 0xcfb31225, + 0xc83b99ac, + 0x10a77d18, + 0xe86e639c, + 0xdb7bbb3b, + 0xcd097826, + 0x6ef41859, + 0xec01b79a, + 0x83a89a4f, + 0xe6656e95, + 0xaa7ee6ff, + 0x2108cfbc, + 0xefe6e815, + 0xbad99be7, + 0x4ace366f, + 0xead4099f, + 0x29d67cb0, + 0x31afb2a4, + 0x2a31233f, + 0xc63094a5, + 0x35c066a2, + 0x7437bc4e, + 0xfca6ca82, + 0xe0b0d090, + 0x3315d8a7, + 0xf14a9804, + 0x41f7daec, + 0x7f0e50cd, + 0x172ff691, + 0x768dd64d, + 0x434db0ef, + 0xcc544daa, + 0xe4df0496, + 0x9ee3b5d1, + 0x4c1b886a, + 0xc1b81f2c, + 0x467f5165, + 0x9d04ea5e, + 0x015d358c, + 0xfa737487, + 0xfb2e410b, + 0xb35a1d67, + 0x9252d2db, + 0xe9335610, + 0x6d1347d6, + 0x9a8c61d7, + 0x377a0ca1, + 0x598e14f8, + 0xeb893c13, + 0xceee27a9, + 0xb735c961, + 0xe1ede51c, + 0x7a3cb147, + 0x9c59dfd2, + 0x553f73f2, + 0x1879ce14, + 0x73bf37c7, + 0x53eacdf7, + 0x5f5baafd, + 0xdf146f3d, + 0x7886db44, + 0xca81f3af, + 0xb93ec468, + 0x382c3424, + 0xc25f40a3, + 0x1672c31d, + 0xbc0c25e2, + 0x288b493c, + 0xff41950d, + 0x397101a8, + 0x08deb30c, + 0xd89ce4b4, + 0x6490c156, + 0x7b6184cb, + 0xd570b632, + 0x48745c6c, + 0xd04257b8 +]; diff --git a/pointycastle/lib/block/blowfish.dart b/pointycastle/lib/block/blowfish.dart new file mode 100644 index 0000000..0f1dc30 --- /dev/null +++ b/pointycastle/lib/block/blowfish.dart @@ -0,0 +1,466 @@ +// See file LICENSE for more information. + +library impl.block_cipher.blowfish; + +import 'dart:core'; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// A class that provides Blowfish key encryption operations, +/// such as encoding data and generating keys. +/// Author Nguyen Van Nguyen +class BlowfishEngine extends BaseBlockCipher { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + BlockCipher, + 'Blowfish', + () => BlowfishEngine(), + ); + + static const _kp = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, // 0 - 3 + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + ]; + + static const _sBox0 = [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, // 0 - 3 + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ]; + + static const _sBox1 = [ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, // 0 - 3 + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ]; + + static const _sBox2 = [ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, // 0 - 3 + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ]; + + static const _sBox3 = [ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, // 0 - 3 + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ]; + + static const _rounds = 16; + static const _sBoxSK = 256; + static const _pSZ = _rounds + 2; + + static const BLOCK_SIZE = 8; + + bool _forEncryption = false; + + late Uint8List _workingKey; + + /// the s-boxes + final _s0 = List.filled(_sBoxSK, 0); + final _s1 = List.filled(_sBoxSK, 0); + final _s2 = List.filled(_sBoxSK, 0); + final _s3 = List.filled(_sBoxSK, 0); + + /// the p-array + final _p = List.filled(_pSZ, 0); + + @override + String get algorithmName => 'Blowfish'; + + @override + int get blockSize => BLOCK_SIZE; + + @override + void reset() {} + + @override + void init(final bool forEncryption, final CipherParameters? params) { + if (params is KeyParameter) { + _forEncryption = forEncryption; + _workingKey = params.key; + _setKey(_workingKey); + } else { + throw ArgumentError( + 'Invalid parameter passed to $algorithmName init - ${params.runtimeType}', + ); + } + } + + @override + int processBlock( + final Uint8List input, + final int inOff, + final Uint8List output, + final int outOff, + ) { + if (_workingKey.isEmpty) { + throw StateError('$algorithmName not initialised'); + } + if ((inOff + BLOCK_SIZE) > input.lengthInBytes) { + throw ArgumentError('Input buffer too short for $algorithmName engine'); + } + if ((outOff + BLOCK_SIZE) > output.lengthInBytes) { + throw ArgumentError('Output buffer too short for $algorithmName engine'); + } + + if (_forEncryption) { + _encryptBlock(input, inOff, output, outOff); + } else { + _decryptBlock(input, inOff, output, outOff); + } + + return BLOCK_SIZE; + } + + int _f(final int x) { + return ((_s0[(x >> 24) & 0xff] + _s1[(x >> 16) & 0xff]) ^ + _s2[(x >> 8) & 0xff]) + + _s3[x & 0xff]; + } + + /// apply the encryption cycle to each value pair in the table. + void _processTable(int xl, int xr, final List table) { + final size = table.length; + for (var s = 0; s < size; s += 2) { + xl ^= _p[0]; + for (var i = 1; i < _rounds; i += 2) { + xr ^= _f(xl) ^ _p[i]; + xl ^= _f(xr) ^ _p[i + 1]; + } + xr ^= _p[_rounds + 1]; + table[s] = xr; + table[s + 1] = xl; + + /// end of cycle swap + xr = xl; + xl = table[s]; + } + } + + void _setKey(final Uint8List key) { + if (key.length < 4 || key.length > 56) { + throw ArgumentError('Key length must be in range 32 to 448 bits'); + } + _s0.setAll(0, _sBox0.sublist(0, _sBoxSK)); + _s1.setAll(0, _sBox1.sublist(0, _sBoxSK)); + _s2.setAll(0, _sBox2.sublist(0, _sBoxSK)); + _s3.setAll(0, _sBox3.sublist(0, _sBoxSK)); + + _p.setAll(0, _kp.sublist(0, _pSZ)); + + final keyLength = key.length; + var keyIndex = 0; + + for (var i = 0; i < _pSZ; i++) { + var data = 0x0000000; + for (var j = 0; j < 4; j++) { + data = (data << 8) | key[keyIndex++]; + if (keyIndex >= keyLength) { + keyIndex = 0; + } + } + _p[i] ^= data; + } + + _processTable(0, 0, _p); + _processTable(_p[_pSZ - 2], _p[_pSZ - 1], _s0); + _processTable(_s0[_sBoxSK - 2], _s0[_sBoxSK - 1], _s1); + _processTable(_s1[_sBoxSK - 2], _s1[_sBoxSK - 1], _s2); + _processTable(_s2[_sBoxSK - 2], _s2[_sBoxSK - 1], _s3); + } + + void _encryptBlock( + final Uint8List src, + final int srcIndex, + final Uint8List dst, + final int dstIndex, + ) { + var xl = src.sublist(srcIndex).buffer.asByteData().getInt32(0); + var xr = src.sublist(srcIndex + 4).buffer.asByteData().getInt32(0); + + xl ^= _p[0]; + + for (var i = 1; i < _rounds; i += 2) { + xr ^= _f(xl) ^ _p[i]; + xl ^= _f(xr) ^ _p[i + 1]; + } + xr ^= _p[_rounds + 1]; + + dst.setAll(dstIndex, _pack32(xr)); + dst.setAll(dstIndex + 4, _pack32(xl)); + } + + void _decryptBlock( + final Uint8List src, + final int srcIndex, + final Uint8List dst, + final int dstIndex, + ) { + var xl = src.sublist(srcIndex).buffer.asByteData().getInt32(0); + var xr = src.sublist(srcIndex + 4).buffer.asByteData().getInt32(0); + + xl ^= _p[_rounds + 1]; + + for (var i = _rounds; i > 0; i -= 2) { + xr ^= _f(xl) ^ _p[i]; + xl ^= _f(xr) ^ _p[i - 1]; + } + + xr ^= _p[0]; + dst.setAll(dstIndex, _pack32(xr)); + dst.setAll(dstIndex + 4, _pack32(xl)); + } + + static Uint8List _pack32(int x) => + Uint8List(4)..buffer.asByteData().setInt32(0, x); +} diff --git a/pointycastle/lib/block/camellia.dart b/pointycastle/lib/block/camellia.dart new file mode 100644 index 0000000..08e6a89 --- /dev/null +++ b/pointycastle/lib/block/camellia.dart @@ -0,0 +1,698 @@ +// See file LICENSE for more information. + +library impl.block_cipher.camellia; + +import 'dart:typed_data'; + +import 'dart:core'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Camellia - based on RFC 3713. +/// Author Nguyen Van Nguyen +class CamelliaEngine extends BaseBlockCipher { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + BlockCipher, + 'Camellia', + () => CamelliaEngine(), + ); + + static const BLOCK_SIZE = 16; + + static const _mask8 = 0xff; + + static const _mask32 = 0xffffffff; + + static const _sigma = [ + 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, // 0 - 3 + 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c, + 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd + ]; + + //// The first camellia sbox + static const _sbox1_1110 = [ + 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, + 0x27272700, // 0 - 5 + 0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500, + 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00, + 0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100, + 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500, + 0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00, + 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000, + 0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00, + 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700, + 0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600, + 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00, + 0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00, + 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100, + 0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200, + 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700, + 0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700, + 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00, + 0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600, + 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400, + 0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100, + 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00, + 0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00, + 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00, + 0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200, + 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700, + 0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00, + 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00, + 0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300, + 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00, + 0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600, + 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600, + 0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00, + 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00, + 0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600, + 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800, + 0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00, + 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200, + 0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500, + 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900, + 0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400, + 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900, + 0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400, + 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00 + ]; + + /// The second camellia sbox + static const _sbox2_0222 = [ + 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, + 0x004e4e4e, // 0 - 5 + 0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a, + 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf, + 0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242, + 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca, + 0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f, + 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060, + 0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434, + 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e, + 0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad, + 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a, + 0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a, + 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363, + 0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585, + 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f, + 0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf, + 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636, + 0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c, + 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888, + 0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323, + 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9, + 0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa, + 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6, + 0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5, + 0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef, + 0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5, + 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8, + 0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666, + 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe, + 0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c, + 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d, + 0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c, + 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc, + 0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d, + 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131, + 0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575, + 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545, + 0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa, + 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292, + 0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949, + 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393, + 0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9, + 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d + ]; + + /// The third camellia sbox + static const _sbox3_3033 = [ + 0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, + 0x93009393, // 0 - 5 + 0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a, + 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7, + 0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090, + 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2, + 0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7, + 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818, + 0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d, + 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3, + 0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b, + 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686, + 0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696, + 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8, + 0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161, + 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb, + 0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb, + 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d, + 0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b, + 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222, + 0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8, + 0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e, + 0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe, + 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad, + 0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969, + 0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb, + 0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d, + 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e, + 0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999, + 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf, + 0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313, + 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b, + 0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717, + 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737, + 0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b, + 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c, + 0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d, + 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151, + 0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa, + 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4, + 0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252, + 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4, + 0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a, + 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f + ]; + + /// The fourth camellia sbox + static const _sbox4_4404 = [ + 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, + 0x57570057, // 0 - 5 + 0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5, + 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af, + 0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b, + 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a, + 0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0, + 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb, + 0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004, + 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c, + 0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a, + 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0, + 0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064, + 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6, + 0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090, + 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8, + 0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063, + 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9, + 0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071, + 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9, + 0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1, + 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad, + 0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5, + 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093, + 0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd, + 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f, + 0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d, + 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066, + 0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099, + 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031, + 0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c, + 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2, + 0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050, + 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095, + 0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db, + 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002, + 0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2, + 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b, + 0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e, + 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a, + 0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa, + 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068, + 0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1, + 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e + ]; + + bool initialised = false; + + late bool _keyIs128; + + final _subkey = List.filled(24 * 4, 0); + + /// for whitening + final _kw = List.filled(4 * 2, 0); + + /// for FL and FL^(-1) + final _ke = List.filled(6 * 2, 0); + + /// for encryption and decryption + final _state = List.filled(4, 0); + + @override + String get algorithmName => 'Camellia'; + + @override + int get blockSize => BLOCK_SIZE; + + @override + void init(bool forEncryption, CipherParameters? params) { + if (params is! KeyParameter) { + throw Exception('Only simple KeyParameter expected.'); + } + + _setKey(forEncryption, params.key); + + initialised = true; + } + + @override + int processBlock( + Uint8List input, + int inOff, + Uint8List output, + int outOff, + ) { + if (!initialised) { + throw Exception('$algorithmName engine not initialised'); + } + + if ((inOff + BLOCK_SIZE) > input.length) { + throw Exception('Input buffer too short'); + } + if ((outOff + BLOCK_SIZE) > output.length) { + throw Exception('Output buffer too short'); + } + if (_keyIs128) { + return _processBlock128(input, inOff, output, outOff); + } else { + return _processBlock256(input, inOff, output, outOff); + } + } + + @override + void reset() {} + + static void _roldq( + int rot, + List ki, + int inOff, + List ko, + int outOff, + ) { + ko[outOff] = + _shiftLeft32(ki[inOff], rot) | _shiftRight32(ki[1 + inOff], 32 - rot); + ko[1 + outOff] = _shiftLeft32(ki[1 + inOff], rot) | + _shiftRight32(ki[2 + inOff], 32 - rot); + ko[2 + outOff] = _shiftLeft32(ki[2 + inOff], rot) | + _shiftRight32(ki[3 + inOff], 32 - rot); + ko[3 + outOff] = + _shiftLeft32(ki[3 + inOff], rot) | _shiftRight32(ki[inOff], 32 - rot); + ki[inOff] = ko[outOff]; + ki[1 + inOff] = ko[1 + outOff]; + ki[2 + inOff] = ko[2 + outOff]; + ki[3 + inOff] = ko[3 + outOff]; + } + + static void _decroldq( + int rot, + List ki, + int inOff, + List ko, + int outOff, + ) { + ko[2 + outOff] = + _shiftLeft32(ki[inOff], rot) | _shiftRight32(ki[1 + inOff], 32 - rot); + ko[3 + outOff] = _shiftLeft32(ki[1 + inOff], rot) | + _shiftRight32(ki[2 + inOff], 32 - rot); + ko[outOff] = _shiftLeft32(ki[2 + inOff], rot) | + _shiftRight32(ki[3 + inOff], 32 - rot); + ko[1 + outOff] = + _shiftLeft32(ki[3 + inOff], rot) | _shiftRight32(ki[inOff], 32 - rot); + ki[inOff] = ko[2 + outOff]; + ki[1 + inOff] = ko[3 + outOff]; + ki[2 + inOff] = ko[outOff]; + ki[3 + inOff] = ko[1 + outOff]; + } + + static void _roldqo32( + int rot, + List ki, + int inOff, + List ko, + int outOff, + ) { + ko[outOff] = _shiftLeft32(ki[1 + inOff], rot - 32) | + _shiftRight32(ki[2 + inOff], 64 - rot); + ko[1 + outOff] = _shiftLeft32(ki[2 + inOff], rot - 32) | + _shiftRight32(ki[3 + inOff], 64 - rot); + ko[2 + outOff] = _shiftLeft32(ki[3 + inOff], rot - 32) | + _shiftRight32(ki[inOff], 64 - rot); + ko[3 + outOff] = _shiftLeft32(ki[inOff], rot - 32) | + _shiftRight32(ki[1 + inOff], 64 - rot); + ki[inOff] = ko[outOff]; + ki[1 + inOff] = ko[1 + outOff]; + ki[2 + inOff] = ko[2 + outOff]; + ki[3 + inOff] = ko[3 + outOff]; + } + + static void _decroldqo32( + int rot, + List ki, + int inOff, + List ko, + int outOff, + ) { + ko[2 + outOff] = _shiftLeft32(ki[1 + inOff], rot - 32) | + _shiftRight32(ki[2 + inOff], 64 - rot); + ko[3 + outOff] = _shiftLeft32(ki[2 + inOff], rot - 32) | + _shiftRight32(ki[3 + inOff], 64 - rot); + ko[outOff] = _shiftLeft32(ki[3 + inOff], rot - 32) | + _shiftRight32(ki[inOff], 64 - rot); + ko[1 + outOff] = _shiftLeft32(ki[inOff], rot - 32) | + _shiftRight32(ki[1 + inOff], 64 - rot); + ki[inOff] = ko[2 + outOff]; + ki[1 + inOff] = ko[3 + outOff]; + ki[2 + inOff] = ko[outOff]; + ki[3 + inOff] = ko[1 + outOff]; + } + + static int _bytes2uint(Uint8List src, int offset) { + return _unpack32(src.sublist(offset, offset + 4)); + } + + static void _uint2bytes(int word, Uint8List dst, int offset) { + dst.setRange(offset, offset + 4, _pack32(word.toUnsigned(32))); + } + + static void _camelliaF2(List s, List skey, int keyoff) { + var t1 = s[0] ^ skey[keyoff]; + var u = _sbox4_4404[t1 & _mask8]; + u ^= _sbox3_3033[(t1 >> 8) & _mask8]; + u ^= _sbox2_0222[(t1 >> 16) & _mask8]; + u ^= _sbox1_1110[(t1 >> 24) & _mask8]; + + var t2 = s[1] ^ skey[1 + keyoff]; + var v = _sbox1_1110[t2 & _mask8]; + v ^= _sbox4_4404[(t2 >> 8) & _mask8]; + v ^= _sbox3_3033[(t2 >> 16) & _mask8]; + v ^= _sbox2_0222[(t2 >> 24) & _mask8]; + + s[2] ^= u ^ v; + s[3] ^= u ^ v ^ _rotateRight32(u, 8); + + t1 = s[2] ^ skey[2 + keyoff]; + u = _sbox4_4404[t1 & _mask8]; + u ^= _sbox3_3033[(t1 >> 8) & _mask8]; + u ^= _sbox2_0222[(t1 >> 16) & _mask8]; + u ^= _sbox1_1110[(t1 >> 24) & _mask8]; + t2 = s[3] ^ skey[3 + keyoff]; + v = _sbox1_1110[t2 & _mask8]; + v ^= _sbox4_4404[(t2 >> 8) & _mask8]; + v ^= _sbox3_3033[(t2 >> 16) & _mask8]; + v ^= _sbox2_0222[(t2 >> 24) & _mask8]; + + s[0] ^= u ^ v; + s[1] ^= u ^ v ^ _rotateRight32(u, 8); + } + + static void _camelliaFLs(List s, List fkey, int keyoff) { + s[1] ^= _rotateLeft32(s[0] & fkey[keyoff], 1); + s[0] ^= fkey[1 + keyoff] | s[1]; + + s[2] ^= fkey[3 + keyoff] | s[3]; + s[3] ^= _rotateLeft32(fkey[2 + keyoff] & s[2], 1); + } + + void _setKey(bool forEncryption, Uint8List key) { + final k = List.filled(8, 0); + final ka = List.filled(4, 0); + final kb = List.filled(4, 0); + final t = List.filled(4, 0); + + switch (key.length) { + case 16: + _keyIs128 = true; + k[0] = _bytes2uint(key, 0); + k[1] = _bytes2uint(key, 4); + k[2] = _bytes2uint(key, 8); + k[3] = _bytes2uint(key, 12); + break; + case 24: + k[0] = _bytes2uint(key, 0); + k[1] = _bytes2uint(key, 4); + k[2] = _bytes2uint(key, 8); + k[3] = _bytes2uint(key, 12); + k[4] = _bytes2uint(key, 16); + k[5] = _bytes2uint(key, 20); + k[6] = ~k[4]; + k[7] = ~k[5]; + _keyIs128 = false; + break; + case 32: + k[0] = _bytes2uint(key, 0); + k[1] = _bytes2uint(key, 4); + k[2] = _bytes2uint(key, 8); + k[3] = _bytes2uint(key, 12); + k[4] = _bytes2uint(key, 16); + k[5] = _bytes2uint(key, 20); + k[6] = _bytes2uint(key, 24); + k[7] = _bytes2uint(key, 28); + _keyIs128 = false; + break; + default: + throw Exception('Key size are only 16/24/32 bytes.'); + } + + for (var i = 0; i < 4; i++) { + ka[i] = k[i] ^ k[i + 4]; + } + /* compute KA */ + _camelliaF2(ka, _sigma, 0); + for (var i = 0; i < 4; i++) { + ka[i] ^= k[i]; + } + _camelliaF2(ka, _sigma, 4); + + if (_keyIs128) { + if (forEncryption) { + /* KL dependant keys */ + _kw[0] = k[0]; + _kw[1] = k[1]; + _kw[2] = k[2]; + _kw[3] = k[3]; + _roldq(15, k, 0, _subkey, 4); + _roldq(30, k, 0, _subkey, 12); + _roldq(15, k, 0, t, 0); + _subkey[18] = t[2]; + _subkey[19] = t[3]; + _roldq(17, k, 0, _ke, 4); + _roldq(17, k, 0, _subkey, 24); + _roldq(17, k, 0, _subkey, 32); + /* KA dependant keys */ + _subkey[0] = ka[0]; + _subkey[1] = ka[1]; + _subkey[2] = ka[2]; + _subkey[3] = ka[3]; + _roldq(15, ka, 0, _subkey, 8); + _roldq(15, ka, 0, _ke, 0); + _roldq(15, ka, 0, t, 0); + _subkey[16] = t[0]; + _subkey[17] = t[1]; + _roldq(15, ka, 0, _subkey, 20); + _roldqo32(34, ka, 0, _subkey, 28); + _roldq(17, ka, 0, _kw, 4); + } else { + // decryption + /* KL dependant keys */ + _kw[4] = k[0]; + _kw[5] = k[1]; + _kw[6] = k[2]; + _kw[7] = k[3]; + _decroldq(15, k, 0, _subkey, 28); + _decroldq(30, k, 0, _subkey, 20); + _decroldq(15, k, 0, t, 0); + _subkey[16] = t[0]; + _subkey[17] = t[1]; + _decroldq(17, k, 0, _ke, 0); + _decroldq(17, k, 0, _subkey, 8); + _decroldq(17, k, 0, _subkey, 0); + /* KA dependant keys */ + _subkey[34] = ka[0]; + _subkey[35] = ka[1]; + _subkey[32] = ka[2]; + _subkey[33] = ka[3]; + _decroldq(15, ka, 0, _subkey, 24); + _decroldq(15, ka, 0, _ke, 4); + _decroldq(15, ka, 0, t, 0); + _subkey[18] = t[2]; + _subkey[19] = t[3]; + _decroldq(15, ka, 0, _subkey, 12); + _decroldqo32(34, ka, 0, _subkey, 4); + _roldq(17, ka, 0, _kw, 0); + } + } else { + // 192bit or 256bit + /* compute KB */ + for (var i = 0; i < 4; i++) { + kb[i] = ka[i] ^ k[i + 4]; + } + _camelliaF2(kb, _sigma, 8); + + if (forEncryption) { + /* KL dependant keys */ + _kw[0] = k[0]; + _kw[1] = k[1]; + _kw[2] = k[2]; + _kw[3] = k[3]; + _roldqo32(45, k, 0, _subkey, 16); + _roldq(15, k, 0, _ke, 4); + _roldq(17, k, 0, _subkey, 32); + _roldqo32(34, k, 0, _subkey, 44); + /* KR dependant keys */ + _roldq(15, k, 4, _subkey, 4); + _roldq(15, k, 4, _ke, 0); + _roldq(30, k, 4, _subkey, 24); + _roldqo32(34, k, 4, _subkey, 36); + /* KA dependant keys */ + _roldq(15, ka, 0, _subkey, 8); + _roldq(30, ka, 0, _subkey, 20); + /* 32bit rotation */ + _ke[8] = ka[1]; + _ke[9] = ka[2]; + _ke[10] = ka[3]; + _ke[11] = ka[0]; + _roldqo32(49, ka, 0, _subkey, 40); + + /* KB dependant keys */ + _subkey[0] = kb[0]; + _subkey[1] = kb[1]; + _subkey[2] = kb[2]; + _subkey[3] = kb[3]; + _roldq(30, kb, 0, _subkey, 12); + _roldq(30, kb, 0, _subkey, 28); + _roldqo32(51, kb, 0, _kw, 4); + } else { + // decryption + /* KL dependant keys */ + _kw[4] = k[0]; + _kw[5] = k[1]; + _kw[6] = k[2]; + _kw[7] = k[3]; + _decroldqo32(45, k, 0, _subkey, 28); + _decroldq(15, k, 0, _ke, 4); + _decroldq(17, k, 0, _subkey, 12); + _decroldqo32(34, k, 0, _subkey, 0); + /* KR dependant keys */ + _decroldq(15, k, 4, _subkey, 40); + _decroldq(15, k, 4, _ke, 8); + _decroldq(30, k, 4, _subkey, 20); + _decroldqo32(34, k, 4, _subkey, 8); + /* KA dependant keys */ + _decroldq(15, ka, 0, _subkey, 36); + _decroldq(30, ka, 0, _subkey, 24); + /* 32bit rotation */ + _ke[2] = ka[1]; + _ke[3] = ka[2]; + _ke[0] = ka[3]; + _ke[1] = ka[0]; + _decroldqo32(49, ka, 0, _subkey, 4); + + /* KB dependant keys */ + _subkey[46] = kb[0]; + _subkey[47] = kb[1]; + _subkey[44] = kb[2]; + _subkey[45] = kb[3]; + _decroldq(30, kb, 0, _subkey, 32); + _decroldq(30, kb, 0, _subkey, 16); + _roldqo32(51, kb, 0, _kw, 0); + } + } + } + + int _processBlock128( + Uint8List input, + int inOff, + Uint8List output, + int outOff, + ) { + for (var i = 0; i < 4; i++) { + _state[i] = _bytes2uint(input, inOff + (i * 4)); + _state[i] ^= _kw[i]; + } + + _camelliaF2(_state, _subkey, 0); + _camelliaF2(_state, _subkey, 4); + _camelliaF2(_state, _subkey, 8); + _camelliaFLs(_state, _ke, 0); + _camelliaF2(_state, _subkey, 12); + _camelliaF2(_state, _subkey, 16); + _camelliaF2(_state, _subkey, 20); + _camelliaFLs(_state, _ke, 4); + _camelliaF2(_state, _subkey, 24); + _camelliaF2(_state, _subkey, 28); + _camelliaF2(_state, _subkey, 32); + + _state[2] ^= _kw[4]; + _state[3] ^= _kw[5]; + _state[0] ^= _kw[6]; + _state[1] ^= _kw[7]; + + _uint2bytes(_state[2], output, outOff); + _uint2bytes(_state[3], output, outOff + 4); + _uint2bytes(_state[0], output, outOff + 8); + _uint2bytes(_state[1], output, outOff + 12); + + return BLOCK_SIZE; + } + + int _processBlock256( + Uint8List input, + int inOff, + Uint8List output, + int outOff, + ) { + for (var i = 0; i < 4; i++) { + _state[i] = _bytes2uint(input, inOff + (i * 4)); + _state[i] ^= _kw[i]; + } + + _camelliaF2(_state, _subkey, 0); + _camelliaF2(_state, _subkey, 4); + _camelliaF2(_state, _subkey, 8); + _camelliaFLs(_state, _ke, 0); + _camelliaF2(_state, _subkey, 12); + _camelliaF2(_state, _subkey, 16); + _camelliaF2(_state, _subkey, 20); + _camelliaFLs(_state, _ke, 4); + _camelliaF2(_state, _subkey, 24); + _camelliaF2(_state, _subkey, 28); + _camelliaF2(_state, _subkey, 32); + _camelliaFLs(_state, _ke, 8); + _camelliaF2(_state, _subkey, 36); + _camelliaF2(_state, _subkey, 40); + _camelliaF2(_state, _subkey, 44); + + _state[2] ^= _kw[4]; + _state[3] ^= _kw[5]; + _state[0] ^= _kw[6]; + _state[1] ^= _kw[7]; + + _uint2bytes(_state[2], output, outOff); + _uint2bytes(_state[3], output, outOff + 4); + _uint2bytes(_state[0], output, outOff + 8); + _uint2bytes(_state[1], output, outOff + 12); + return BLOCK_SIZE; + } + + static int _unpack32(Uint8List x) => x.buffer.asByteData().getUint32(0); + static Uint8List _pack32(int x) => + Uint8List(4)..buffer.asByteData().setUint32(0, x); + + static int _shiftLeft32(int x, int n) { + return (x & _mask32) << n; + } + + static int _shiftRight32(int x, int n) { + return (x & _mask32) >> n; + } + + static int _rotateLeft32(int x, int n) { + x = x & _mask32; + return (x << n) | (x >> 32 - n); + } + + static int _rotateRight32(int x, int n) { + x = x & _mask32; + return (x >> n) | (x << 32 - n); + } +} diff --git a/pointycastle/lib/block/des_base.dart b/pointycastle/lib/block/des_base.dart new file mode 100644 index 0000000..9104aac --- /dev/null +++ b/pointycastle/lib/block/des_base.dart @@ -0,0 +1,860 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/src/ufixnum.dart'; + +class DesBase { + static final BLOCK_SIZE = 8; + + //static final List bytebit = [128, 64, 32, 16, 8, 4, 2, 1]; + static final List bytebit = [0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1]; + + static final List bigbyte = [ + 0x800000, + 0x400000, + 0x200000, + 0x100000, + 0x80000, + 0x40000, + 0x20000, + 0x10000, + 0x8000, + 0x4000, + 0x2000, + 0x1000, + 0x800, + 0x400, + 0x200, + 0x100, + 0x80, + 0x40, + 0x20, + 0x10, + 0x8, + 0x4, + 0x2, + 0x1 + ]; + + /* + * Use the key schedule specified in the Standard (ANSI X3.92-1981). + */ + + static final Uint8List pc1 = Uint8List.fromList([ + 56, + 48, + 40, + 32, + 24, + 16, + 8, + 0, + 57, + 49, + 41, + 33, + 25, + 17, + 9, + 1, + 58, + 50, + 42, + 34, + 26, + 18, + 10, + 2, + 59, + 51, + 43, + 35, + 62, + 54, + 46, + 38, + 30, + 22, + 14, + 6, + 61, + 53, + 45, + 37, + 29, + 21, + 13, + 5, + 60, + 52, + 44, + 36, + 28, + 20, + 12, + 4, + 27, + 19, + 11, + 3 + ]); + + static final Uint8List totrot = Uint8List.fromList( + [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]); + + static final Uint8List pc2 = Uint8List.fromList([ + 13, + 16, + 10, + 23, + 0, + 4, + 2, + 27, + 14, + 5, + 20, + 9, + 22, + 18, + 11, + 3, + 25, + 7, + 15, + 6, + 26, + 19, + 12, + 1, + 40, + 51, + 30, + 36, + 46, + 54, + 29, + 39, + 50, + 44, + 32, + 47, + 43, + 48, + 38, + 55, + 33, + 52, + 45, + 41, + 49, + 35, + 28, + 31 + ]); + + static final List SP1 = [ + 0x01010400, + 0x00000000, + 0x00010000, + 0x01010404, + 0x01010004, + 0x00010404, + 0x00000004, + 0x00010000, + 0x00000400, + 0x01010400, + 0x01010404, + 0x00000400, + 0x01000404, + 0x01010004, + 0x01000000, + 0x00000004, + 0x00000404, + 0x01000400, + 0x01000400, + 0x00010400, + 0x00010400, + 0x01010000, + 0x01010000, + 0x01000404, + 0x00010004, + 0x01000004, + 0x01000004, + 0x00010004, + 0x00000000, + 0x00000404, + 0x00010404, + 0x01000000, + 0x00010000, + 0x01010404, + 0x00000004, + 0x01010000, + 0x01010400, + 0x01000000, + 0x01000000, + 0x00000400, + 0x01010004, + 0x00010000, + 0x00010400, + 0x01000004, + 0x00000400, + 0x00000004, + 0x01000404, + 0x00010404, + 0x01010404, + 0x00010004, + 0x01010000, + 0x01000404, + 0x01000004, + 0x00000404, + 0x00010404, + 0x01010400, + 0x00000404, + 0x01000400, + 0x01000400, + 0x00000000, + 0x00010004, + 0x00010400, + 0x00000000, + 0x01010004 + ]; + + static final List SP2 = [ + 0x80108020, + 0x80008000, + 0x00008000, + 0x00108020, + 0x00100000, + 0x00000020, + 0x80100020, + 0x80008020, + 0x80000020, + 0x80108020, + 0x80108000, + 0x80000000, + 0x80008000, + 0x00100000, + 0x00000020, + 0x80100020, + 0x00108000, + 0x00100020, + 0x80008020, + 0x00000000, + 0x80000000, + 0x00008000, + 0x00108020, + 0x80100000, + 0x00100020, + 0x80000020, + 0x00000000, + 0x00108000, + 0x00008020, + 0x80108000, + 0x80100000, + 0x00008020, + 0x00000000, + 0x00108020, + 0x80100020, + 0x00100000, + 0x80008020, + 0x80100000, + 0x80108000, + 0x00008000, + 0x80100000, + 0x80008000, + 0x00000020, + 0x80108020, + 0x00108020, + 0x00000020, + 0x00008000, + 0x80000000, + 0x00008020, + 0x80108000, + 0x00100000, + 0x80000020, + 0x00100020, + 0x80008020, + 0x80000020, + 0x00100020, + 0x00108000, + 0x00000000, + 0x80008000, + 0x00008020, + 0x80000000, + 0x80100020, + 0x80108020, + 0x00108000 + ]; + + static final List SP3 = [ + 0x00000208, + 0x08020200, + 0x00000000, + 0x08020008, + 0x08000200, + 0x00000000, + 0x00020208, + 0x08000200, + 0x00020008, + 0x08000008, + 0x08000008, + 0x00020000, + 0x08020208, + 0x00020008, + 0x08020000, + 0x00000208, + 0x08000000, + 0x00000008, + 0x08020200, + 0x00000200, + 0x00020200, + 0x08020000, + 0x08020008, + 0x00020208, + 0x08000208, + 0x00020200, + 0x00020000, + 0x08000208, + 0x00000008, + 0x08020208, + 0x00000200, + 0x08000000, + 0x08020200, + 0x08000000, + 0x00020008, + 0x00000208, + 0x00020000, + 0x08020200, + 0x08000200, + 0x00000000, + 0x00000200, + 0x00020008, + 0x08020208, + 0x08000200, + 0x08000008, + 0x00000200, + 0x00000000, + 0x08020008, + 0x08000208, + 0x00020000, + 0x08000000, + 0x08020208, + 0x00000008, + 0x00020208, + 0x00020200, + 0x08000008, + 0x08020000, + 0x08000208, + 0x00000208, + 0x08020000, + 0x00020208, + 0x00000008, + 0x08020008, + 0x00020200 + ]; + + static final List SP4 = [ + 0x00802001, + 0x00002081, + 0x00002081, + 0x00000080, + 0x00802080, + 0x00800081, + 0x00800001, + 0x00002001, + 0x00000000, + 0x00802000, + 0x00802000, + 0x00802081, + 0x00000081, + 0x00000000, + 0x00800080, + 0x00800001, + 0x00000001, + 0x00002000, + 0x00800000, + 0x00802001, + 0x00000080, + 0x00800000, + 0x00002001, + 0x00002080, + 0x00800081, + 0x00000001, + 0x00002080, + 0x00800080, + 0x00002000, + 0x00802080, + 0x00802081, + 0x00000081, + 0x00800080, + 0x00800001, + 0x00802000, + 0x00802081, + 0x00000081, + 0x00000000, + 0x00000000, + 0x00802000, + 0x00002080, + 0x00800080, + 0x00800081, + 0x00000001, + 0x00802001, + 0x00002081, + 0x00002081, + 0x00000080, + 0x00802081, + 0x00000081, + 0x00000001, + 0x00002000, + 0x00800001, + 0x00002001, + 0x00802080, + 0x00800081, + 0x00002001, + 0x00002080, + 0x00800000, + 0x00802001, + 0x00000080, + 0x00800000, + 0x00002000, + 0x00802080 + ]; + + static final List SP5 = [ + 0x00000100, + 0x02080100, + 0x02080000, + 0x42000100, + 0x00080000, + 0x00000100, + 0x40000000, + 0x02080000, + 0x40080100, + 0x00080000, + 0x02000100, + 0x40080100, + 0x42000100, + 0x42080000, + 0x00080100, + 0x40000000, + 0x02000000, + 0x40080000, + 0x40080000, + 0x00000000, + 0x40000100, + 0x42080100, + 0x42080100, + 0x02000100, + 0x42080000, + 0x40000100, + 0x00000000, + 0x42000000, + 0x02080100, + 0x02000000, + 0x42000000, + 0x00080100, + 0x00080000, + 0x42000100, + 0x00000100, + 0x02000000, + 0x40000000, + 0x02080000, + 0x42000100, + 0x40080100, + 0x02000100, + 0x40000000, + 0x42080000, + 0x02080100, + 0x40080100, + 0x00000100, + 0x02000000, + 0x42080000, + 0x42080100, + 0x00080100, + 0x42000000, + 0x42080100, + 0x02080000, + 0x00000000, + 0x40080000, + 0x42000000, + 0x00080100, + 0x02000100, + 0x40000100, + 0x00080000, + 0x00000000, + 0x40080000, + 0x02080100, + 0x40000100 + ]; + + static final List SP6 = [ + 0x20000010, + 0x20400000, + 0x00004000, + 0x20404010, + 0x20400000, + 0x00000010, + 0x20404010, + 0x00400000, + 0x20004000, + 0x00404010, + 0x00400000, + 0x20000010, + 0x00400010, + 0x20004000, + 0x20000000, + 0x00004010, + 0x00000000, + 0x00400010, + 0x20004010, + 0x00004000, + 0x00404000, + 0x20004010, + 0x00000010, + 0x20400010, + 0x20400010, + 0x00000000, + 0x00404010, + 0x20404000, + 0x00004010, + 0x00404000, + 0x20404000, + 0x20000000, + 0x20004000, + 0x00000010, + 0x20400010, + 0x00404000, + 0x20404010, + 0x00400000, + 0x00004010, + 0x20000010, + 0x00400000, + 0x20004000, + 0x20000000, + 0x00004010, + 0x20000010, + 0x20404010, + 0x00404000, + 0x20400000, + 0x00404010, + 0x20404000, + 0x00000000, + 0x20400010, + 0x00000010, + 0x00004000, + 0x20400000, + 0x00404010, + 0x00004000, + 0x00400010, + 0x20004010, + 0x00000000, + 0x20404000, + 0x20000000, + 0x00400010, + 0x20004010 + ]; + + static final List SP7 = [ + 0x00200000, + 0x04200002, + 0x04000802, + 0x00000000, + 0x00000800, + 0x04000802, + 0x00200802, + 0x04200800, + 0x04200802, + 0x00200000, + 0x00000000, + 0x04000002, + 0x00000002, + 0x04000000, + 0x04200002, + 0x00000802, + 0x04000800, + 0x00200802, + 0x00200002, + 0x04000800, + 0x04000002, + 0x04200000, + 0x04200800, + 0x00200002, + 0x04200000, + 0x00000800, + 0x00000802, + 0x04200802, + 0x00200800, + 0x00000002, + 0x04000000, + 0x00200800, + 0x04000000, + 0x00200800, + 0x00200000, + 0x04000802, + 0x04000802, + 0x04200002, + 0x04200002, + 0x00000002, + 0x00200002, + 0x04000000, + 0x04000800, + 0x00200000, + 0x04200800, + 0x00000802, + 0x00200802, + 0x04200800, + 0x00000802, + 0x04000002, + 0x04200802, + 0x04200000, + 0x00200800, + 0x00000000, + 0x00000002, + 0x04200802, + 0x00000000, + 0x00200802, + 0x04200000, + 0x00000800, + 0x04000002, + 0x04000800, + 0x00000800, + 0x00200002 + ]; + + static final List SP8 = [ + 0x10001040, + 0x00001000, + 0x00040000, + 0x10041040, + 0x10000000, + 0x10001040, + 0x00000040, + 0x10000000, + 0x00040040, + 0x10040000, + 0x10041040, + 0x00041000, + 0x10041000, + 0x00041040, + 0x00001000, + 0x00000040, + 0x10040000, + 0x10000040, + 0x10001000, + 0x00001040, + 0x00041000, + 0x00040040, + 0x10040040, + 0x10041000, + 0x00001040, + 0x00000000, + 0x00000000, + 0x10040040, + 0x10000040, + 0x10001000, + 0x00041040, + 0x00040000, + 0x00041040, + 0x00040000, + 0x10041000, + 0x00001000, + 0x00000040, + 0x10040040, + 0x00001000, + 0x00041040, + 0x10001000, + 0x00000040, + 0x10000040, + 0x10040000, + 0x10040040, + 0x10000000, + 0x00040000, + 0x10001040, + 0x00000000, + 0x10041040, + 0x00040040, + 0x10000040, + 0x10040000, + 0x10001000, + 0x10001040, + 0x00000000, + 0x10041040, + 0x00041000, + 0x00041000, + 0x00001040, + 0x00001040, + 0x00040040, + 0x10000000, + 0x10041000 + ]; + + List generateWorkingKey(bool encrypting, Uint8List key) { + var newKey = List.generate(32, (index) => 0); + var pc1m = List.generate(56, (index) => false); + var pcr = List.generate(56, (index) => false); + + for (var j = 0; j < 56; j++) { + var l = pc1[j]; + + pc1m[j] = ((key[shiftr32(l, 3)] & bytebit[l & 07]) != 0); + } + + for (var i = 0; i < 16; i++) { + int l, m, n; + + if (encrypting) { + m = shiftl32(i, 1); + } else { + m = shiftl32(15 - i, 1); + } + + n = m + 1; + newKey[m] = newKey[n] = 0; + + for (var j = 0; j < 28; j++) { + l = j + totrot[i]; + if (l < 28) { + pcr[j] = pc1m[l]; + } else { + pcr[j] = pc1m[l - 28]; + } + } + + for (var j = 28; j < 56; j++) { + l = j + totrot[i]; + if (l < 56) { + pcr[j] = pc1m[l]; + } else { + pcr[j] = pc1m[l - 28]; + } + } + + for (var j = 0; j < 24; j++) { + if (pcr[pc2[j]]) { + newKey[m] |= bigbyte[j]; + } + + if (pcr[pc2[j + 24]]) { + newKey[n] |= bigbyte[j]; + } + } + } + + // + // store the processed key + // + for (var i = 0; i != 32; i += 2) { + int i1, i2; + + i1 = newKey[i]; + i2 = newKey[i + 1]; + + newKey[i] = (shiftl32(i1 & 0x00fc0000, 6)) | + (shiftl32(i1 & 0x00000fc0, 10)) | + (shiftr32(i2 & 0x00fc0000, 10)) | + (shiftr32(i2 & 0x00000fc0, 6)); + + newKey[i + 1] = (shiftl32(i1 & 0x0003f000, 12)) | + (shiftl32(i1 & 0x0000003f, 16)) | + (shiftr32(i2 & 0x0003f000, 4)) | + (i2 & 0x0000003f); + } + + return newKey; + } + + void desFunc( + List wKey, + Uint8List inp, + int inOff, + Uint8List out, + int outOff, + ) { + int work, right, left; + + left = _bigEndianToInt(inp, inOff); + right = _bigEndianToInt(inp, inOff + 4); + + work = ((shiftr32(left, 4)) ^ right) & 0x0f0f0f0f; + right ^= work; + left ^= shiftl32(work, 4); + work = ((shiftr32(left, 16)) ^ right) & 0x0000ffff; + right ^= work; + left ^= shiftl32(work, 16); + work = ((shiftr32(right, 2)) ^ left) & 0x33333333; + left ^= work; + right ^= shiftl32(work, 2); + work = ((shiftr32(right, 8)) ^ left) & 0x00ff00ff; + left ^= work; + right ^= shiftl32(work, 8); + right = (shiftl32(right, 1)) | (shiftr32(right, 31)); + work = (left ^ right) & 0xaaaaaaaa; + left ^= work; + right ^= work; + left = (shiftl32(left, 1)) | (shiftr32(left, 31)); + + for (var round = 0; round < 8; round++) { + int fval; + + work = (shiftl32(right, 28)) | (shiftr32(right, 4)); + work ^= wKey[round * 4 + 0]; + fval = SP7[work & 0x3f]; + fval |= SP5[(shiftr32(work, 8)) & 0x3f]; + fval |= SP3[(shiftr32(work, 16)) & 0x3f]; + fval |= SP1[(shiftr32(work, 24)) & 0x3f]; + work = right ^ wKey[round * 4 + 1]; + fval |= SP8[work & 0x3f]; + fval |= SP6[(shiftr32(work, 8)) & 0x3f]; + fval |= SP4[(shiftr32(work, 16)) & 0x3f]; + fval |= SP2[(shiftr32(work, 24)) & 0x3f]; + left ^= fval; + work = (shiftl32(left, 28)) | (shiftr32(left, 4)); + work ^= wKey[round * 4 + 2]; + fval = SP7[work & 0x3f]; + fval |= SP5[(shiftr32(work, 8)) & 0x3f]; + fval |= SP3[(shiftr32(work, 16)) & 0x3f]; + fval |= SP1[(shiftr32(work, 24)) & 0x3f]; + work = left ^ wKey[round * 4 + 3]; + fval |= SP8[work & 0x3f]; + fval |= SP6[(shiftr32(work, 8)) & 0x3f]; + fval |= SP4[(shiftr32(work, 16)) & 0x3f]; + fval |= SP2[(shiftr32(work, 24)) & 0x3f]; + right ^= fval; + } + right = (shiftl32(right, 31)) | (shiftr32(right, 1)); + work = (left ^ right) & 0xaaaaaaaa; + left ^= work; + right ^= work; + left = (shiftl32(left, 31)) | (shiftr32(left, 1)); + work = ((shiftr32(left, 8)) ^ right) & 0x00ff00ff; + right ^= work; + left ^= shiftl32(work, 8); + work = ((shiftr32(left, 2)) ^ right) & 0x33333333; + right ^= work; + left ^= shiftl32(work, 2); + work = ((shiftr32(right, 16)) ^ left) & 0x0000ffff; + left ^= work; + right ^= shiftl32(work, 16); + work = ((shiftr32(right, 4)) ^ left) & 0x0f0f0f0f; + left ^= work; + right ^= shiftl32(work, 4); + + _intToBigEndian(right, out, outOff); + _intToBigEndian(left, out, outOff + 4); + } + + void _intToBigEndian(int n, Uint8List bs, int off) { + bs[off] = shiftr32(n, 24); + bs[++off] = shiftr32(n, 16); + bs[++off] = shiftr32(n, 8); + bs[++off] = n; + } + + int _bigEndianToInt(Uint8List bs, int off) { + var n = shiftl32(bs[off], 24); + n |= shiftl32(bs[++off] & 0xff, 16); + n |= shiftl32(bs[++off] & 0xff, 8); + n |= bs[++off] & 0xff; + return n; + } +} diff --git a/pointycastle/lib/block/desede_engine.dart b/pointycastle/lib/block/desede_engine.dart new file mode 100644 index 0000000..ee85c40 --- /dev/null +++ b/pointycastle/lib/block/desede_engine.dart @@ -0,0 +1,108 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/des_base.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class DESedeEngine extends DesBase implements BaseBlockCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(BlockCipher, 'DESede', () => DESedeEngine()); + + static final BLOCK_SIZE = 8; + + List? workingKey1; + List? workingKey2; + List? workingKey3; + + bool forEncryption = false; + + @override + String get algorithmName => 'DESede'; + + @override + int get blockSize => BLOCK_SIZE; + + @override + void init(bool forEncryption, CipherParameters? params) { + if (params is KeyParameter) { + var keyMaster = params.key; + + if (keyMaster.length != 24 && keyMaster.length != 16) { + throw ArgumentError('key size must be 16 or 24 bytes.'); + } + + this.forEncryption = forEncryption; + + var key1 = Uint8List(8); + + _arrayCopy(keyMaster, 0, key1, 0, key1.length); + workingKey1 = generateWorkingKey(forEncryption, key1); + + var key2 = Uint8List(8); + _arrayCopy(keyMaster, 8, key2, 0, key2.length); + workingKey2 = generateWorkingKey(!forEncryption, key2); + + if (keyMaster.length == 24) { + var key3 = Uint8List(8); + _arrayCopy(keyMaster, 16, key3, 0, key3.length); + workingKey3 = generateWorkingKey(forEncryption, key3); + } else { + workingKey3 = workingKey1; + } + } + } + + @override + Uint8List process(Uint8List data) { + var out = Uint8List(blockSize); + var len = processBlock(data, 0, out, 0); + return out.sublist(0, len); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if (workingKey1 == null || workingKey2 == null || workingKey3 == null) { + throw ArgumentError('DESede engine not initialised'); + } + + if ((inpOff + BLOCK_SIZE) > inp.length) { + throw ArgumentError('input buffer too short'); + } + + if ((outOff + BLOCK_SIZE) > out.length) { + throw ArgumentError('output buffer too short'); + } + + var temp = Uint8List(BLOCK_SIZE); + + if (forEncryption) { + desFunc(workingKey1!, inp, inpOff, temp, 0); + desFunc(workingKey2!, temp, 0, temp, 0); + desFunc(workingKey3!, temp, 0, out, outOff); + } else { + desFunc(workingKey3!, inp, inpOff, temp, 0); + desFunc(workingKey2!, temp, 0, temp, 0); + desFunc(workingKey1!, temp, 0, out, outOff); + } + + return BLOCK_SIZE; + } + + @override + void reset() {} + + void _arrayCopy(Uint8List? sourceArr, int sourcePos, Uint8List? outArr, + int outPos, int len) { + for (var i = 0; i < len; i++) { + outArr![outPos + i] = sourceArr![sourcePos + i]; + } + } + + int bitsOfSecurity() { + if (workingKey1 != null && workingKey1 == workingKey3) { + return 80; + } + return 112; + } +} diff --git a/pointycastle/lib/block/modes/cbc.dart b/pointycastle/lib/block/modes/cbc.dart new file mode 100644 index 0000000..57b65d3 --- /dev/null +++ b/pointycastle/lib/block/modes/cbc.dart @@ -0,0 +1,113 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.cbc; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; + +/// Implementation of Cipher-Block-Chaining (CBC) mode on top of a [BlockCipher]. +class CBCBlockCipher extends BaseBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/CBC', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return CBCBlockCipher(underlying); + }); + + final BlockCipher _underlyingCipher; + + late Uint8List _iv; + Uint8List? _cbcV; + Uint8List? _cbcNextV; + + late bool _encrypting; + + CBCBlockCipher(this._underlyingCipher) { + _iv = Uint8List(blockSize); + _cbcV = Uint8List(blockSize); + _cbcNextV = Uint8List(blockSize); + } + + @override + String get algorithmName => '${_underlyingCipher.algorithmName}/CBC'; + @override + int get blockSize => _underlyingCipher.blockSize; + + @override + void reset() { + _cbcV!.setAll(0, _iv); + _cbcNextV!.fillRange(0, _cbcNextV!.length, 0); + + _underlyingCipher.reset(); + } + + @override + void init(bool forEncryption, covariant ParametersWithIV params) { + if (params.iv.length != blockSize) { + throw ArgumentError( + 'Initialization vector must be the same length as block size'); + } + + _encrypting = forEncryption; + _iv.setAll(0, params.iv); + + reset(); + + _underlyingCipher.init(forEncryption, params.parameters); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) => + _encrypting + ? _encryptBlock(inp, inpOff, out, outOff) + : _decryptBlock(inp, inpOff, out, outOff); + + int _encryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + // XOR the cbcV and the input, then encrypt the cbcV + for (var i = 0; i < blockSize; i++) { + _cbcV![i] ^= inp[inpOff + i]; + } + + var length = _underlyingCipher.processBlock(_cbcV!, 0, out, outOff); + + // copy ciphertext to cbcV + _cbcV!.setRange(0, blockSize, + Uint8List.view(out.buffer, out.offsetInBytes + outOff, blockSize)); + + return length; + } + + int _decryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + _cbcNextV!.setRange(0, blockSize, + Uint8List.view(inp.buffer, inp.offsetInBytes + inpOff, blockSize)); + + var length = _underlyingCipher.processBlock(inp, inpOff, out, outOff); + + // XOR the cbcV and the output + for (var i = 0; i < blockSize; i++) { + out[outOff + i] ^= _cbcV![i]; + } + + // swap the back up buffer into next position + Uint8List? tmp; + + tmp = _cbcV; + _cbcV = _cbcNextV; + _cbcNextV = tmp; + + return length; + } +} diff --git a/pointycastle/lib/block/modes/ccm.dart b/pointycastle/lib/block/modes/ccm.dart new file mode 100644 index 0000000..bcd74c1 --- /dev/null +++ b/pointycastle/lib/block/modes/ccm.dart @@ -0,0 +1,344 @@ +library impl.block_cipher.modes.ccm; + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/utils.dart'; + +import '../../src/impl/base_aead_block_cipher.dart'; +import '../../src/registry/registry.dart'; + +/// Implementation of the CCM block cipher mode. CCM is authenticated, meaning +/// that you can pass AEAD data (and that appending a MAC of the ciphertext is +/// unnecessary). +class CCMBlockCipher extends BaseAEADBlockCipher { + late Uint8List _macBlock; + @override + late Uint8List nonce; + + @override + Uint8List? aad; + + @override + late int macSize; + + late KeyParameter _keyParam; + + BytesBuilder associatedText = BytesBuilder(); + BytesBuilder data = BytesBuilder(); + + late bool _forEncryption; + + // ignore: non_constant_identifier_names + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/CCM', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return CCMBlockCipher(underlying); + }); + + CCMBlockCipher(super.underlyingCipher) { + _macBlock = Uint8List(blockSize); + if (blockSize != 16) { + throw ArgumentError('CCM requires a block size of 16'); + } + } + + @override + void reset() { + underlyingCipher.reset(); + associatedText.clear(); + data.clear(); + } + + @override + void init(bool forEncryption, covariant CipherParameters params) { + _forEncryption = forEncryption; + KeyParameter key; + + if (params is AEADParameters) { + nonce = params.nonce; + aad = params.associatedData; + macSize = _getMacSize(forEncryption, params.macSize); + key = params.parameters as KeyParameter; + } else if (params is ParametersWithIV) { + nonce = params.iv; + aad = null; + macSize = _getMacSize(forEncryption, 64); + key = params.parameters!; + } else { + throw ArgumentError('Invalid parameter class'); + } + + if (nonce.length < 7 || nonce.length > 13) { + throw ArgumentError('nonce must have length from 7 to 13 octets'); + } + + _keyParam = key; + + reset(); + } + + @override + String get algorithmName => '${underlyingCipher.algorithmName}/CCM'; + + @override + int processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + data.write(inp, inpOff, len); + return 0; + } + + @override + int doFinal(Uint8List out, int outOff) { + var len = _processPacket(data.toBytes(), 0, data.length, out, outOff); + + reset(); + + return len; + } + + @override + void processAADBytes(Uint8List inp, int inpOff, int len) { + associatedText.write(inp, inpOff, len); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) => + processBytes(inp, inpOff, inp.length, out, outOff); + + int _processPacket( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + var n = nonce.length; + var q = 15 - n; + if (q < 4) { + var limitLen = 1 << (8 * q); + if (len >= limitLen) { + throw StateError('CCM packet too large for choice of q.'); + } + } + + var iv = Uint8List(blockSize); + iv[0] = (q - 1) & 0x7; + arrayCopy(nonce, 0, iv, 1, nonce.length); + + BlockCipher ctrCipher = + SICBlockCipher(blockSize, SICStreamCipher(underlyingCipher)); + ctrCipher.init( + forEncryption, ParametersWithIV(_keyParam, iv)); + + int outputLen; + var inIndex = inpOff; + var outIndex = outOff; + + if (forEncryption) { + outputLen = len + macSize; + if (out.length < (outputLen + outOff)) { + throw ArgumentError('Output buffer too short.'); + } + + _calculateMac(inp, inpOff, len, _macBlock); + + var encMac = Uint8List(blockSize); + + ctrCipher.processBlock(_macBlock, 0, encMac, 0); // S0 + + while (inIndex < (inpOff + len - blockSize)) // S1... + { + ctrCipher.processBlock(inp, inIndex, out, outIndex); + outIndex += blockSize; + inIndex += blockSize; + } + + var block = Uint8List(blockSize); + + arrayCopy(inp, inIndex, block, 0, len + inpOff - inIndex); + + ctrCipher.processBlock(block, 0, block, 0); + + arrayCopy(block, 0, out, outIndex, len + inpOff - inIndex); + + arrayCopy(encMac, 0, out, outOff + len, macSize); + } else { + if (len < macSize) { + throw InvalidCipherTextException('data too short'); + } + outputLen = len - macSize; + if (out.length < (outputLen + outOff)) { + throw ArgumentError('Output buffer too short.'); + } + + arrayCopy(inp, inpOff + outputLen, _macBlock, 0, macSize); + + ctrCipher.processBlock(_macBlock, 0, _macBlock, 0); + + for (var i = macSize; i != _macBlock.length; i++) { + _macBlock[i] = 0; + } + + while (inIndex < (inpOff + outputLen - blockSize)) { + ctrCipher.processBlock(inp, inIndex, out, outIndex); + outIndex += blockSize; + inIndex += blockSize; + } + + var block = Uint8List(blockSize); + + arrayCopy(inp, inIndex, block, 0, outputLen - (inIndex - inpOff)); + + ctrCipher.processBlock(block, 0, block, 0); + + arrayCopy(block, 0, out, outIndex, outputLen - (inIndex - inpOff)); + + var calculatedMacBlock = Uint8List(blockSize); + + _calculateMac(out, outOff, outputLen, calculatedMacBlock); + + if (!(_macBlock.length == calculatedMacBlock.length)) { + throw StateError('mac check in CCM failed'); + } else { + for (var i = 0; i < _macBlock.length; i++) { + if (_macBlock[i] != calculatedMacBlock[i]) { + throw StateError('mac check in CCM failed'); + } + } + } + } + + return outputLen; + } + + int _calculateMac( + Uint8List data, int dataOff, int dataLen, Uint8List macBlock) { + Mac cMac = CBCBlockCipherMac(underlyingCipher, macSize * 8, null); + + cMac.init(ParametersWithIV(_keyParam, Uint8List(blockSize))); + + // + // build b0 + // + var b0 = Uint8List(16); + + if (_hasAssociatedText()) { + b0[0] |= 0x40; + } + + b0[0] |= (((cMac.macSize - 2) ~/ 2) & 0x7) << 3; + + b0[0] |= ((15 - nonce.length) - 1) & 0x7; + + arrayCopy(nonce, 0, b0, 1, nonce.length); + + var q = dataLen; + var count = 1; + while (q > 0) { + b0[b0.length - count] = q & 0xff; + q = cshiftr32(q, 8); + count++; + } + + cMac.update(b0, 0, b0.length); + + // + // process associated text + // + if (_hasAssociatedText()) { + int extra; + + var textLength = _getAssociatedTextLength(); + if (textLength < ((1 << 16) - (1 << 8))) { + cMac.updateByte(textLength >> 8); + cMac.updateByte(textLength); + + extra = 2; + } else { + cMac.updateByte(0xff); + cMac.updateByte(0xfe); + cMac.updateByte(textLength >> 24); + cMac.updateByte(textLength >> 16); + cMac.updateByte(textLength >> 8); + cMac.updateByte(textLength); + + extra = 6; + } + + if (aad != null) { + cMac.update(aad!, 0, aad!.length); + } + if (associatedText.length > 0) { + cMac.update(associatedText.toBytes(), 0, associatedText.length); + } + + extra = (extra + textLength) % 16; + if (extra != 0) { + for (var i = extra; i != 16; i++) { + cMac.updateByte(0x00); + } + } + } + + // + // add the text + // + cMac.update(data, dataOff, dataLen); + + return cMac.doFinal(macBlock, 0); + } + + int _getMacSize(bool forEncryption, int requestedMacBits) { + if (forEncryption && + (requestedMacBits < 32 || + requestedMacBits > 128 || + 0 != (requestedMacBits & 15))) { + throw ArgumentError( + 'tag length in octets must be one of {4,6,8,10,12,14,16}'); + } + + return cshiftr32(requestedMacBits, 3); + } + + @override + Uint8List get mac { + var out = Uint8List(macSize); + arrayCopy(_macBlock, 0, out, 0, out.length); + return out; + } + + @override + bool get forEncryption => _forEncryption; + + @override + void prepare(KeyParameter keyParam) { + // Unused artifact of class hierarchy. + } + + @override + int getOutputSize(int length) { + var totalData = length + data.length; + + if (forEncryption) { + return totalData + macSize; + } + + return totalData < macSize ? 0 : totalData - macSize; + } + + int _getAssociatedTextLength() { + return associatedText.length + ((aad == null) ? 0 : aad!.length); + } + + bool _hasAssociatedText() { + return _getAssociatedTextLength() > 0; + } + + @override + Uint8List get remainingInput => data.toBytes(); +} + +extension WriteLen on BytesBuilder { + void write(Uint8List b, int off, int len) { + add(b.sublist(off, off + len)); + } +} diff --git a/pointycastle/lib/block/modes/cfb.dart b/pointycastle/lib/block/modes/cfb.dart new file mode 100644 index 0000000..f4bfc55 --- /dev/null +++ b/pointycastle/lib/block/modes/cfb.dart @@ -0,0 +1,175 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.cfb; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; + +/// Implementation of Cipher Feedback Mode (CFB) on top of a [BlockCipher]. +class CFBBlockCipher extends BaseBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + BlockCipher, + r'^(.+)/CFB-([0-9]+)$', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + var blockSizeInBits = int.parse(match.group(2)!); + if ((blockSizeInBits % 8) != 0) { + throw RegistryFactoryException.invalid( + 'Bad CFB block size: $blockSizeInBits (must be a multiple of 8)'); + } + return CFBBlockCipher(underlying, blockSizeInBits ~/ 8); + }); + + @override + final int blockSize; + + final BlockCipher _underlyingCipher; + + late Uint8List _iv; + Uint8List? _cfbV; + Uint8List? _cfbOutV; + late bool _encrypting; + + CFBBlockCipher(this._underlyingCipher, this.blockSize) { + _iv = Uint8List(_underlyingCipher.blockSize); + _cfbV = Uint8List(_underlyingCipher.blockSize); + _cfbOutV = Uint8List(_underlyingCipher.blockSize); + } + + @override + String get algorithmName => + '${_underlyingCipher.algorithmName}/CFB-${blockSize * 8}'; + + @override + void reset() { + _cfbV!.setRange(0, _iv.length, _iv); + _underlyingCipher.reset(); + } + + /// Initialise the cipher and, possibly, the initialisation vector (IV). + /// If an IV isn't passed as part of the parameter, the IV will be all zeros. + /// An IV which is too short is handled in FIPS compliant fashion. + /// + /// @param encrypting if true the cipher is initialised for + /// encryption, if false for decryption. + /// @param params the key and other data required by the cipher. + /// @exception IllegalArgumentException if the params argument is + /// inappropriate. + @override + void init(bool encrypting, CipherParameters? params) { + _encrypting = encrypting; + + if (params is ParametersWithIV) { + var ivParam = params; + var iv = ivParam.iv; + + if (iv.length < _iv.length) { + // prepend the supplied IV with zeros (per FIPS PUB 81) + var offset = _iv.length - iv.length; + _iv.fillRange(0, offset, 0); + _iv.setRange(offset, _iv.length, iv); + } else { + _iv.setRange(0, _iv.length, iv); + } + + reset(); + + // if null it's an IV changed only. + if (ivParam.parameters != null) { + _underlyingCipher.init(true, ivParam.parameters); + } + } else { + reset(); + _underlyingCipher.init(true, params); + } + } + + /// Process one block of input from the array in and write it to + /// the out array. + /// + /// @param in the array containing the input data. + /// @param inOff offset into the in array the data starts at. + /// @param out the array the output data will be copied into. + /// @param outOff the offset into the out array the output will start at. + /// @exception DataLengthException if there isn't enough data in in, or + /// space in out. + /// @exception IllegalStateException if the cipher isn't initialised. + /// @return the number of bytes processed and produced. + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) => + _encrypting + ? _encryptBlock(inp, inpOff, out, outOff) + : _decryptBlock(inp, inpOff, out, outOff); + + /// Do the appropriate processing for CFB mode encryption. + /// + /// @param in the array containing the data to be encrypted. + /// @param inOff offset into the in array the data starts at. + /// @param out the array the encrypted data will be copied into. + /// @param outOff the offset into the out array the output will start at. + /// @exception DataLengthException if there isn't enough data in in, or + /// space in out. + /// @exception IllegalStateException if the cipher isn't initialised. + /// @return the number of bytes processed and produced. + int _encryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + blockSize) > out.length) { + throw ArgumentError('Output buffer too short'); + } + + _underlyingCipher.processBlock(_cfbV!, 0, _cfbOutV!, 0); + + // XOR the cfbV with the plaintext producing the ciphertext + for (var i = 0; i < blockSize; i++) { + out[outOff + i] = _cfbOutV![i] ^ inp[inpOff + i]; + } + + // change over the input block. + var offset = _cfbV!.length - blockSize; + _cfbV!.setRange(0, offset, _cfbV!.sublist(blockSize)); + _cfbV!.setRange(offset, _cfbV!.length, out.sublist(outOff)); + + return blockSize; + } + + /// Do the appropriate processing for CFB mode decryption. + /// + /// @param in the array containing the data to be decrypted. + /// @param inOff offset into the in array the data starts at. + /// @param out the array the encrypted data will be copied into. + /// @param outOff the offset into the out array the output will start at. + /// @exception DataLengthException if there isn't enough data in in, or + /// space in out. + /// @exception IllegalStateException if the cipher isn't initialised. + /// @return the number of bytes processed and produced. + int _decryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + blockSize) > out.length) { + throw ArgumentError('Output buffer too short'); + } + + _underlyingCipher.processBlock(_cfbV!, 0, _cfbOutV!, 0); + + // change over the input block. + var offset = _cfbV!.length - blockSize; + _cfbV!.setRange(0, offset, _cfbV!.sublist(blockSize)); + _cfbV!.setRange(offset, _cfbV!.length, inp.sublist(inpOff)); + + // XOR the cfbV with the ciphertext producing the plaintext + for (var i = 0; i < blockSize; i++) { + out[outOff + i] = _cfbOutV![i] ^ inp[inpOff + i]; + } + + return blockSize; + } +} diff --git a/pointycastle/lib/block/modes/ctr.dart b/pointycastle/lib/block/modes/ctr.dart new file mode 100644 index 0000000..769146a --- /dev/null +++ b/pointycastle/lib/block/modes/ctr.dart @@ -0,0 +1,22 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.ctr; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/adapters/stream_cipher_as_block_cipher.dart'; +import 'package:pointycastle/stream/ctr.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class CTRBlockCipher extends StreamCipherAsBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/CTR', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return CTRBlockCipher( + underlying.blockSize, CTRStreamCipher(underlying)); + }); + + CTRBlockCipher(super.blockSize, super.underlyingCipher); +} diff --git a/pointycastle/lib/block/modes/ecb.dart b/pointycastle/lib/block/modes/ecb.dart new file mode 100644 index 0000000..039585f --- /dev/null +++ b/pointycastle/lib/block/modes/ecb.dart @@ -0,0 +1,43 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.ecb; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; + +/// Implementation of Electronic Code Book (ECB) mode on top of a [BlockCipher]. +class ECBBlockCipher extends BaseBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/ECB', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return ECBBlockCipher(underlying); + }); + + final BlockCipher _underlyingCipher; + + ECBBlockCipher(this._underlyingCipher); + + @override + String get algorithmName => '${_underlyingCipher.algorithmName}/ECB'; + @override + int get blockSize => _underlyingCipher.blockSize; + @override + void reset() { + _underlyingCipher.reset(); + } + + @override + void init(bool forEncryption, CipherParameters? params) { + _underlyingCipher.init(forEncryption, params); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) => + _underlyingCipher.processBlock(inp, inpOff, out, outOff); +} diff --git a/pointycastle/lib/block/modes/gcm.dart b/pointycastle/lib/block/modes/gcm.dart new file mode 100644 index 0000000..b46b33a --- /dev/null +++ b/pointycastle/lib/block/modes/gcm.dart @@ -0,0 +1,226 @@ +library impl.block_cipher.modes.gcm; + +import 'dart:math' show min; +import 'dart:typed_data'; + +import 'package:pointycastle/src/ct.dart'; + +import '../../api.dart'; +import '../../src/impl/base_aead_block_cipher.dart'; +import '../../src/registry/registry.dart'; + +class GCMBlockCipher extends BaseAEADBlockCipher { + /// Intended for internal use. + // ignore: non_constant_identifier_names + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/GCM', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return GCMBlockCipher(underlying); + }); + + late Uint8List _h; + late Uint8List _counter; + late Uint8List _e; + late Uint8List _e0; + late Uint8List _x; + late int _processedBytes; + int _blocksRemaining = 0; + + GCMBlockCipher(super.cipher); + + @override + String get algorithmName => '${underlyingCipher.algorithmName}/GCM'; + + @override + void init(bool forEncryption, CipherParameters? params) { + var bs = underlyingCipher.blockSize; + _blocksRemaining = (2 ^ 36 - 64) ~/ bs; + super.init(forEncryption, params); + } + + @override + void reset() { + var bs = underlyingCipher.blockSize; + _blocksRemaining = (2 ^ 36 - 64) ~/ bs; + super.reset(); + } + + @override + void prepare(KeyParameter keyParam) { + if (macSize != 16) { + throw ArgumentError('macSize should be equal to 16 for GCM'); + } + + underlyingCipher.init(true, keyParam); + + _h = Uint8List(blockSize); + underlyingCipher.processBlock(_h, 0, _h, 0); + + _counter = _computeInitialCounter(nonce); + + _e0 = Uint8List(16); + _computeE(_counter, _e0); + + _e = Uint8List(16); + + _x = Uint8List(16); + + _processedBytes = 0; + } + + Uint8List _computeInitialCounter(Uint8List iv) { + var counter = Uint8List(16); + + if (iv.length == 12) { + counter.setAll(0, iv); + counter[15] = 1; + } else { + _gHASH(counter, iv); + var length = Uint8List.view((Uint32List(4)..[0] = iv.length * 8).buffer); + length = Uint8List.fromList(length.reversed.toList()); + + _gHASHBlock(counter, length); + } + return counter; + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + var length = + blockSize < inp.length - inpOff ? blockSize : inp.length - inpOff; + + var i = Uint8List(blockSize); + i.setAll(0, inp.skip(inpOff).take(length)); + + _processedBytes += length; + + _getNextCTRBlock(_e); + + var o = Uint8List.fromList(i); + _xor(o, _e); + if (length < blockSize) o.fillRange(length, blockSize, 0); + + out.setRange(outOff, outOff + length, o); + + var c = forEncryption ? o : i; + + _gHASHBlock(_x, c); + + return length; + } + + void _gHASH(Uint8List x, Uint8List y) { + var block = Uint8List(16); + for (var i = 0; i < y.length; i += 16) { + block.setAll(0, y.sublist(i, min(i + 16, y.length))); + block.fillRange(min(i + 16, y.length) - i, 16, 0); + _gHASHBlock(x, block); + } + } + + void _gHASHBlock(Uint8List x, Uint8List y) { + _xor(x, y); + _mult(x, _h); + } + + void _getNextCTRBlock(Uint8List out) { + // + // This is tested manually by forcing _blocksRemaining to 1 and trying to run + // the unit tests. Otherwise it takes 64GB of data to exhaust. + // + if (_blocksRemaining == 0) { + throw StateError('Attempt to process too many blocks'); + } + _blocksRemaining--; + + _counter[15]++; + for (var i = 15; i >= 12 && _counter[i] == 0; i--) { + _counter[i] = 0; + if (i > 12) _counter[i - 1]++; + } + _computeE(_counter, out); + } + + void _computeE(Uint8List inp, Uint8List out) { + underlyingCipher.processBlock(inp, 0, out, 0); + } + + final Uint8List r = Uint8List(16)..[0] = 0xe1; + + void _mult(Uint8List x, Uint8List y) { + var v = x; + var z = Uint8List(x.length); + + for (var i = 0; i < 128; i++) { + CT_xor(z, v, _bit(y, i)); + CT_xor(v, r, _shiftRight(v)); + } + + x.setAll(0, z); + } + + void _xor(Uint8List x, Uint8List? y) { + for (var i = 0; i < x.length; i++) { + x[i] ^= y![i]; + } + } + + bool _bit(Uint8List x, int n) { + var byte = n ~/ 8; + var mask = 1 << (7 - n % 8); + return x[byte] & mask == mask; + } + + bool _shiftRight(Uint8List x) { + var overflow = false; + for (var i = 0; i < x.length; i++) { + var nextOverflow = x[i] & 0x1 == 0x1; + x[i] >>= 1; + if (overflow) x[i] |= 0x80; + overflow = nextOverflow; + } + return overflow; + } + + @override + int doFinal(Uint8List out, int outOff) { + var result = remainingInput.isNotEmpty + ? processBlock(remainingInput, 0, out, outOff) + : 0; + + var len = Uint8List.view((Uint32List(4) + ..[2] = aad!.length * 8 + ..[0] = _processedBytes * 8) + .buffer); + len = Uint8List.fromList(len.reversed.toList()); + + _gHASHBlock(_x, len); + + _xor(_x, _e0); + + if (forEncryption) { + out.setAll(outOff + result, _x); + result += _x.length; + } + + validateMac(); + + return result; + } + + @override + Uint8List get mac => _x; + + @override + void processAADBytes(Uint8List inp, int inpOff, int len) { + var block = Uint8List(16); + for (var i = 0; i < len; i += 16) { + block.fillRange(0, 16, 0); + block.setAll( + 0, inp.sublist(inpOff + i, inpOff + min(i + 16, len) as int)); + _gHASHBlock(_x, block); + } + } +} diff --git a/pointycastle/lib/block/modes/gctr.dart b/pointycastle/lib/block/modes/gctr.dart new file mode 100644 index 0000000..8ebba7e --- /dev/null +++ b/pointycastle/lib/block/modes/gctr.dart @@ -0,0 +1,144 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.gctr; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of GOST 28147 OFB counter mode (GCTR) on top of a [BlockCipher]. +class GCTRBlockCipher extends BaseBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/GCTR', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return GCTRBlockCipher(underlying); + }); + + static const C1 = 16843012; //00000001000000010000000100000100 + static const C2 = 16843009; //00000001000000010000000100000001 + + final BlockCipher _underlyingCipher; + + late Uint8List _iv; + Uint8List? _ofbV; + Uint8List? _ofbOutV; + + bool _firstStep = true; + late int _n3; + late int _n4; + + GCTRBlockCipher(this._underlyingCipher) { + if (blockSize != 8) { + throw ArgumentError('GCTR can only be used with 64 bit block ciphers'); + } + + _iv = Uint8List(_underlyingCipher.blockSize); + _ofbV = Uint8List(_underlyingCipher.blockSize); + _ofbOutV = Uint8List(_underlyingCipher.blockSize); + } + + @override + int get blockSize => _underlyingCipher.blockSize; + @override + String get algorithmName => '${_underlyingCipher.algorithmName}/GCTR'; + @override + void reset() { + _ofbV!.setRange(0, _iv.length, _iv); + _underlyingCipher.reset(); + } + + /// Initialise the cipher and, possibly, the initialisation vector (IV). + /// If an IV isn't passed as part of the parameter, the IV will be all zeros. + /// An IV which is too short is handled in FIPS compliant fashion. + /// + /// @param encrypting if true the cipher is initialised for + /// encryption, if false for decryption. //ignored by this CTR mode + /// @param params the key and other data required by the cipher. + /// @exception IllegalArgumentException if the params argument is + /// inappropriate. + @override + void init(bool encrypting, CipherParameters? params) { + _firstStep = true; + _n3 = 0; + _n4 = 0; + + if (params is ParametersWithIV) { + var ivParam = params; + var iv = ivParam.iv; + + if (iv.length < _iv.length) { + // prepend the supplied IV with zeros (per FIPS PUB 81) + var offset = _iv.length - iv.length; + _iv.fillRange(0, offset, 0); + _iv.setRange(offset, _iv.length, iv); + } else { + _iv.setRange(0, _iv.length, iv); + } + + reset(); + + // if params is null we reuse the current working key. + if (ivParam.parameters != null) { + _underlyingCipher.init(true, ivParam.parameters); + } + } else { + // TODO: make this behave in a standard way (as the other modes of operation) + reset(); + + // if params is null we reuse the current working key. + if (params != null) { + _underlyingCipher.init(true, params); + } + } + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + blockSize) > out.length) { + throw ArgumentError('Output buffer too short'); + } + + if (_firstStep) { + _firstStep = false; + _underlyingCipher.processBlock(_ofbV!, 0, _ofbOutV!, 0); + _n3 = _bytesToint(_ofbOutV, 0); + _n4 = _bytesToint(_ofbOutV, 4); + } + _n3 += C2; + _n4 += C1; + _intTobytes(_n3, _ofbV, 0); + _intTobytes(_n4, _ofbV, 4); + + _underlyingCipher.processBlock(_ofbV!, 0, _ofbOutV!, 0); + + // XOR the ofbV with the plaintext producing the cipher text (and the next input block). + for (var i = 0; i < blockSize; i++) { + out[outOff + i] = _ofbOutV![i] ^ inp[inpOff + i]; + } + + // change over the input block. + var offset = _ofbV!.length - blockSize; + _ofbV!.setRange(0, offset, _ofbV!.sublist(blockSize)); + _ofbV!.setRange(offset, _ofbV!.length, _ofbOutV!); + + return blockSize; + } + + int _bytesToint(Uint8List? inp, int inpOff) { + return unpack32(inp, inpOff, Endian.little); + } + + void _intTobytes(int num, Uint8List? out, int outOff) { + pack32(num, out, outOff, Endian.little); + } +} diff --git a/pointycastle/lib/block/modes/ige.dart b/pointycastle/lib/block/modes/ige.dart new file mode 100644 index 0000000..84c3003 --- /dev/null +++ b/pointycastle/lib/block/modes/ige.dart @@ -0,0 +1,117 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.ige; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/utils.dart'; + +/// Implementation of IGE mode on top of a [BlockCipher]. +/// +/// This mode is not commonly used aside from as a critical building block in +/// the Telegram protocol. +class IGEBlockCipher extends BaseBlockCipher { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/IGE', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return IGEBlockCipher(underlying); + }); + + final BlockCipher _underlyingCipher; + + late Uint8List _x0, _y0, _xPrev, _yPrev; + + late bool _encrypting; + + /// Instantiates an IGEBlockCipher, using [_underlyingCipher] as the basis + /// for chaining encryption/decryption. + IGEBlockCipher(this._underlyingCipher) { + _x0 = Uint8List(blockSize); + _y0 = Uint8List(blockSize); + _xPrev = Uint8List(blockSize); + _yPrev = Uint8List(blockSize); + } + + @override + String get algorithmName => '${_underlyingCipher.algorithmName}/IGE'; + + @override + int get blockSize => _underlyingCipher.blockSize; + + @override + void reset() { + arrayCopy(_x0, 0, _xPrev, 0, blockSize); + arrayCopy(_y0, 0, _yPrev, 0, blockSize); + + _underlyingCipher.reset(); + } + + @override + void init(bool forEncryption, covariant ParametersWithIV params) { + if (params.iv.length != blockSize * 2) { + throw ArgumentError( + 'Initialization vector must be the same length as block size'); + } + + _encrypting = forEncryption; + arrayCopy(params.iv, 0, _x0, 0, blockSize); + arrayCopy(params.iv, blockSize, _y0, 0, blockSize); + + reset(); + + _underlyingCipher.init(forEncryption, params.parameters); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) => + _encrypting + ? _encryptBlock(inp, inpOff, out, outOff) + : _decryptBlock(inp, inpOff, out, outOff); + + int _encryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + for (var i = 0; i < blockSize; i++) { + _xPrev[i] ^= inp[inpOff + i]; + } + + var length = _underlyingCipher.processBlock(_xPrev, 0, out, outOff); + + for (var i = 0; i < blockSize; i++) { + out[outOff + i] ^= _yPrev[i]; + } + + arrayCopy(inp, inpOff, _yPrev, 0, blockSize); + arrayCopy(out, outOff, _xPrev, 0, blockSize); + + return length; + } + + int _decryptBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + for (var i = 0; i < blockSize; i++) { + _yPrev[i] ^= inp[inpOff + i]; + } + + var length = _underlyingCipher.processBlock(_yPrev, 0, out, outOff); + + for (var i = 0; i < blockSize; i++) { + out[outOff + i] ^= _xPrev[i]; + } + + arrayCopy(out, outOff, _yPrev, 0, blockSize); + arrayCopy(inp, inpOff, _xPrev, 0, blockSize); + + return length; + } +} diff --git a/pointycastle/lib/block/modes/ofb.dart b/pointycastle/lib/block/modes/ofb.dart new file mode 100644 index 0000000..44018f9 --- /dev/null +++ b/pointycastle/lib/block/modes/ofb.dart @@ -0,0 +1,104 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.ofb; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; + +/// Implementation of Output FeedBack mode (OFB) on top of a [BlockCipher]. +class OFBBlockCipher extends BaseBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + BlockCipher, + r'^(.+)/OFB-([0-9]+)$', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + var blockSizeInBits = int.parse(match.group(2)!); + if ((blockSizeInBits % 8) != 0) { + throw RegistryFactoryException.invalid( + 'Bad OFB block size: $blockSizeInBits (must be a multiple of 8)'); + } + return OFBBlockCipher(underlying, blockSizeInBits ~/ 8); + }); + + @override + final int blockSize; + + final BlockCipher _underlyingCipher; + + late Uint8List _iv; + Uint8List? _ofbV; + Uint8List? _ofbOutV; + + OFBBlockCipher(this._underlyingCipher, this.blockSize) { + _iv = Uint8List(_underlyingCipher.blockSize); + _ofbV = Uint8List(_underlyingCipher.blockSize); + _ofbOutV = Uint8List(_underlyingCipher.blockSize); + } + + @override + String get algorithmName => + '${_underlyingCipher.algorithmName}/OFB-${blockSize * 8}'; + + @override + void reset() { + _ofbV!.setRange(0, _iv.length, _iv); + _underlyingCipher.reset(); + } + + /// Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the + /// IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. + @override + void init(bool forEncryption, CipherParameters? params) { + if (params is ParametersWithIV) { + var ivParam = params; + var iv = ivParam.iv; + + if (iv.length < _iv.length) { + // prepend the supplied IV with zeros (per FIPS PUB 81) + var offset = _iv.length - iv.length; + _iv.fillRange(0, offset, 0); + _iv.setAll(offset, iv); + } else { + _iv.setRange(0, _iv.length, iv); + } + + reset(); + + // if null it's an IV changed only. + if (ivParam.parameters != null) { + _underlyingCipher.init(true, ivParam.parameters); + } + } else { + _underlyingCipher.init(true, params); + } + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if ((inpOff + blockSize) > inp.length) { + throw ArgumentError('Input buffer too short'); + } + + if ((outOff + blockSize) > out.length) { + throw ArgumentError('Output buffer too short'); + } + + _underlyingCipher.processBlock(_ofbV!, 0, _ofbOutV!, 0); + + // XOR the ofbV with the plaintext producing the cipher text (and the next input block). + for (var i = 0; i < blockSize; i++) { + out[outOff + i] = _ofbOutV![i] ^ inp[inpOff + i]; + } + + // change over the input block. + var offset = _ofbV!.length - blockSize; + _ofbV!.setRange(0, offset, _ofbV!.sublist(blockSize)); + _ofbV!.setRange(offset, _ofbV!.length, _ofbOutV!); + + return blockSize; + } +} diff --git a/pointycastle/lib/block/modes/sic.dart b/pointycastle/lib/block/modes/sic.dart new file mode 100644 index 0000000..035ae67 --- /dev/null +++ b/pointycastle/lib/block/modes/sic.dart @@ -0,0 +1,23 @@ +// See file LICENSE for more information. + +library impl.block_cipher.modes.sic; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/adapters/stream_cipher_as_block_cipher.dart'; +import 'package:pointycastle/stream/sic.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// See [SICStreamCipher]. +class SICBlockCipher extends StreamCipherAsBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + BlockCipher, + '/SIC', + (_, final Match match) => () { + var underlying = BlockCipher(match.group(1)!); + return SICBlockCipher( + underlying.blockSize, SICStreamCipher(underlying)); + }); + + SICBlockCipher(super.blockSize, super.underlyingCipher); +} diff --git a/pointycastle/lib/block/rc2_engine.dart b/pointycastle/lib/block/rc2_engine.dart new file mode 100644 index 0000000..4e7a919 --- /dev/null +++ b/pointycastle/lib/block/rc2_engine.dart @@ -0,0 +1,498 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class RC2Engine extends BaseBlockCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(BlockCipher, 'RC2', () => RC2Engine()); + + static Uint8List piTable = Uint8List.fromList([ + 0xd9, + 0x78, + 0xf9, + 0xc4, + 0x19, + 0xdd, + 0xb5, + 0xed, + 0x28, + 0xe9, + 0xfd, + 0x79, + 0x4a, + 0xa0, + 0xd8, + 0x9d, + 0xc6, + 0x7e, + 0x37, + 0x83, + 0x2b, + 0x76, + 0x53, + 0x8e, + 0x62, + 0x4c, + 0x64, + 0x88, + 0x44, + 0x8b, + 0xfb, + 0xa2, + 0x17, + 0x9a, + 0x59, + 0xf5, + 0x87, + 0xb3, + 0x4f, + 0x13, + 0x61, + 0x45, + 0x6d, + 0x8d, + 0x09, + 0x81, + 0x7d, + 0x32, + 0xbd, + 0x8f, + 0x40, + 0xeb, + 0x86, + 0xb7, + 0x7b, + 0x0b, + 0xf0, + 0x95, + 0x21, + 0x22, + 0x5c, + 0x6b, + 0x4e, + 0x82, + 0x54, + 0xd6, + 0x65, + 0x93, + 0xce, + 0x60, + 0xb2, + 0x1c, + 0x73, + 0x56, + 0xc0, + 0x14, + 0xa7, + 0x8c, + 0xf1, + 0xdc, + 0x12, + 0x75, + 0xca, + 0x1f, + 0x3b, + 0xbe, + 0xe4, + 0xd1, + 0x42, + 0x3d, + 0xd4, + 0x30, + 0xa3, + 0x3c, + 0xb6, + 0x26, + 0x6f, + 0xbf, + 0x0e, + 0xda, + 0x46, + 0x69, + 0x07, + 0x57, + 0x27, + 0xf2, + 0x1d, + 0x9b, + 0xbc, + 0x94, + 0x43, + 0x03, + 0xf8, + 0x11, + 0xc7, + 0xf6, + 0x90, + 0xef, + 0x3e, + 0xe7, + 0x06, + 0xc3, + 0xd5, + 0x2f, + 0xc8, + 0x66, + 0x1e, + 0xd7, + 0x08, + 0xe8, + 0xea, + 0xde, + 0x80, + 0x52, + 0xee, + 0xf7, + 0x84, + 0xaa, + 0x72, + 0xac, + 0x35, + 0x4d, + 0x6a, + 0x2a, + 0x96, + 0x1a, + 0xd2, + 0x71, + 0x5a, + 0x15, + 0x49, + 0x74, + 0x4b, + 0x9f, + 0xd0, + 0x5e, + 0x04, + 0x18, + 0xa4, + 0xec, + 0xc2, + 0xe0, + 0x41, + 0x6e, + 0x0f, + 0x51, + 0xcb, + 0xcc, + 0x24, + 0x91, + 0xaf, + 0x50, + 0xa1, + 0xf4, + 0x70, + 0x39, + 0x99, + 0x7c, + 0x3a, + 0x85, + 0x23, + 0xb8, + 0xb4, + 0x7a, + 0xfc, + 0x02, + 0x36, + 0x5b, + 0x25, + 0x55, + 0x97, + 0x31, + 0x2d, + 0x5d, + 0xfa, + 0x98, + 0xe3, + 0x8a, + 0x92, + 0xae, + 0x05, + 0xdf, + 0x29, + 0x10, + 0x67, + 0x6c, + 0xba, + 0xc9, + 0xd3, + 0x00, + 0xe6, + 0xcf, + 0xe1, + 0x9e, + 0xa8, + 0x2c, + 0x63, + 0x16, + 0x01, + 0x3f, + 0x58, + 0xe2, + 0x89, + 0xa9, + 0x0d, + 0x38, + 0x34, + 0x1b, + 0xab, + 0x33, + 0xff, + 0xb0, + 0xbb, + 0x48, + 0x0c, + 0x5f, + 0xb9, + 0xb1, + 0xcd, + 0x2e, + 0xc5, + 0xf3, + 0xdb, + 0x47, + 0xe5, + 0xa5, + 0x9c, + 0x77, + 0x0a, + 0xa6, + 0x20, + 0x68, + 0xfe, + 0x7f, + 0xc1, + 0xad + ]); + + static const BLOCK_SIZE = 8; + + @override + String get algorithmName => 'RC2'; + + @override + int get blockSize => BLOCK_SIZE; + + bool forEncryption = false; + List? workingKey; + + List generateWorkingKey(Uint8List key, int bits) { + int x; + var xKey = List.generate(128, (index) => 0); + + for (var i = 0; i != key.length; i++) { + xKey[i] = key[i] & 0xff; + } + + // Phase 1: Expand input key to 128 bytes + var len = key.length; + + if (len < 128) { + var index = 0; + + x = xKey[len - 1]; + + do { + x = piTable[(x + xKey[index++]) & 255] & 0xff; + xKey[len++] = x; + } while (len < 128); + } + + // Phase 2 - reduce effective key size to "bits" + len = (bits + 7) >> 3; + x = piTable[xKey[128 - len] & (255 >> (7 & -bits))] & 0xff; + xKey[128 - len] = x; + + for (var i = 128 - len - 1; i >= 0; i--) { + x = piTable[x ^ xKey[i + len]] & 0xff; + xKey[i] = x; + } + + // Phase 3 - copy to newKey in little-endian order + var newKey = List.generate(64, (index) => 0); + + for (var i = 0; i != newKey.length; i++) { + newKey[i] = xKey[2 * i] + (xKey[2 * i + 1] << 8); + } + + return newKey; + } + + @override + void init(bool forEncryption, CipherParameters? params) { + this.forEncryption = forEncryption; + + Uint8List key; + if (params != null) { + if (params is RC2Parameters) { + workingKey = generateWorkingKey(params.key, params.effectiveKeyBits); + key = params.key; + } else if (params is KeyParameter) { + key = params.key; + workingKey = generateWorkingKey(key, key.length * 8); + } + } + } + + @override + Uint8List process(Uint8List data) { + var out = Uint8List(blockSize); + var len = processBlock(data, 0, out, 0); + return out.sublist(0, len); + } + + @override + int processBlock(Uint8List input, int inputOff, Uint8List out, int outOff) { + if (workingKey == null) { + throw ArgumentError('RC2 engine not initialised'); + } + + if ((inputOff + BLOCK_SIZE) > input.length) { + throw ArgumentError('input buffer too short'); + } + + if ((outOff + BLOCK_SIZE) > out.length) { + throw ArgumentError('output buffer too short'); + } + + if (forEncryption) { + encryptBlock(input, inputOff, out, outOff); + } else { + decryptBlock(input, inputOff, out, outOff); + } + + return BLOCK_SIZE; + } + + @override + void reset() {} + + int rotateWordLeft(int x, int y) { + x &= 0xffff; + return (x << y) | (x >> (16 - y)); + } + + void encryptBlock(Uint8List input, int inOff, Uint8List out, int outOff) { + int x76, x54, x32, x10; + + x76 = ((input[inOff + 7] & 0xff) << 8) + (input[inOff + 6] & 0xff); + x54 = ((input[inOff + 5] & 0xff) << 8) + (input[inOff + 4] & 0xff); + x32 = ((input[inOff + 3] & 0xff) << 8) + (input[inOff + 2] & 0xff); + x10 = ((input[inOff + 1] & 0xff) << 8) + (input[inOff + 0] & 0xff); + + for (var i = 0; i <= 16; i += 4) { + x10 = + rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey![i], 1); + x32 = rotateWordLeft( + x32 + (x54 & ~x10) + (x76 & x10) + workingKey![i + 1], 2); + x54 = rotateWordLeft( + x54 + (x76 & ~x32) + (x10 & x32) + workingKey![i + 2], 3); + x76 = rotateWordLeft( + x76 + (x10 & ~x54) + (x32 & x54) + workingKey![i + 3], 5); + } + + x10 += workingKey![x76 & 63]; + x32 += workingKey![x10 & 63]; + x54 += workingKey![x32 & 63]; + x76 += workingKey![x54 & 63]; + + for (var i = 20; i <= 40; i += 4) { + x10 = + rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey![i], 1); + x32 = rotateWordLeft( + x32 + (x54 & ~x10) + (x76 & x10) + workingKey![i + 1], 2); + x54 = rotateWordLeft( + x54 + (x76 & ~x32) + (x10 & x32) + workingKey![i + 2], 3); + x76 = rotateWordLeft( + x76 + (x10 & ~x54) + (x32 & x54) + workingKey![i + 3], 5); + } + + x10 += workingKey![x76 & 63]; + x32 += workingKey![x10 & 63]; + x54 += workingKey![x32 & 63]; + x76 += workingKey![x54 & 63]; + + for (var i = 44; i < 64; i += 4) { + x10 = + rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey![i], 1); + x32 = rotateWordLeft( + x32 + (x54 & ~x10) + (x76 & x10) + workingKey![i + 1], 2); + x54 = rotateWordLeft( + x54 + (x76 & ~x32) + (x10 & x32) + workingKey![i + 2], 3); + x76 = rotateWordLeft( + x76 + (x10 & ~x54) + (x32 & x54) + workingKey![i + 3], 5); + } + + out[outOff + 0] = x10; + out[outOff + 1] = x10 >> 8; + out[outOff + 2] = x32; + out[outOff + 3] = x32 >> 8; + out[outOff + 4] = x54; + out[outOff + 5] = x54 >> 8; + out[outOff + 6] = x76; + out[outOff + 7] = x76 >> 8; + } + + void decryptBlock(Uint8List input, int inOff, Uint8List out, int outOff) { + int x76, x54, x32, x10; + + x76 = ((input[inOff + 7] & 0xff) << 8) + (input[inOff + 6] & 0xff); + x54 = ((input[inOff + 5] & 0xff) << 8) + (input[inOff + 4] & 0xff); + x32 = ((input[inOff + 3] & 0xff) << 8) + (input[inOff + 2] & 0xff); + x10 = ((input[inOff + 1] & 0xff) << 8) + (input[inOff + 0] & 0xff); + + for (var i = 60; i >= 44; i -= 4) { + x76 = rotateWordLeft(x76, 11) - + ((x10 & ~x54) + (x32 & x54) + workingKey![i + 3]); + x54 = rotateWordLeft(x54, 13) - + ((x76 & ~x32) + (x10 & x32) + workingKey![i + 2]); + x32 = rotateWordLeft(x32, 14) - + ((x54 & ~x10) + (x76 & x10) + workingKey![i + 1]); + x10 = rotateWordLeft(x10, 15) - + ((x32 & ~x76) + (x54 & x76) + workingKey![i]); + } + + x76 -= workingKey![x54 & 63]; + x54 -= workingKey![x32 & 63]; + x32 -= workingKey![x10 & 63]; + x10 -= workingKey![x76 & 63]; + + for (var i = 40; i >= 20; i -= 4) { + x76 = rotateWordLeft(x76, 11) - + ((x10 & ~x54) + (x32 & x54) + workingKey![i + 3]); + x54 = rotateWordLeft(x54, 13) - + ((x76 & ~x32) + (x10 & x32) + workingKey![i + 2]); + x32 = rotateWordLeft(x32, 14) - + ((x54 & ~x10) + (x76 & x10) + workingKey![i + 1]); + x10 = rotateWordLeft(x10, 15) - + ((x32 & ~x76) + (x54 & x76) + workingKey![i]); + } + + x76 -= workingKey![x54 & 63]; + x54 -= workingKey![x32 & 63]; + x32 -= workingKey![x10 & 63]; + x10 -= workingKey![x76 & 63]; + + for (var i = 16; i >= 0; i -= 4) { + x76 = rotateWordLeft(x76, 11) - + ((x10 & ~x54) + (x32 & x54) + workingKey![i + 3]); + x54 = rotateWordLeft(x54, 13) - + ((x76 & ~x32) + (x10 & x32) + workingKey![i + 2]); + x32 = rotateWordLeft(x32, 14) - + ((x54 & ~x10) + (x76 & x10) + workingKey![i + 1]); + x10 = rotateWordLeft(x10, 15) - + ((x32 & ~x76) + (x54 & x76) + workingKey![i]); + } + + out[outOff + 0] = x10; + out[outOff + 1] = x10 >> 8; + out[outOff + 2] = x32; + out[outOff + 3] = x32 >> 8; + out[outOff + 4] = x54; + out[outOff + 5] = x54 >> 8; + out[outOff + 6] = x76; + out[outOff + 7] = x76 >> 8; + } +} diff --git a/pointycastle/lib/block/twofish.dart b/pointycastle/lib/block/twofish.dart new file mode 100644 index 0000000..f78eb17 --- /dev/null +++ b/pointycastle/lib/block/twofish.dart @@ -0,0 +1,694 @@ +// See file LICENSE for more information. + +library impl.block_cipher.twofish; + +import 'dart:core'; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// A class that provides Twofish encryption operations. +/// Author Nguyen Van Nguyen +class TwofishEngine extends BaseBlockCipher { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + BlockCipher, + 'Twofish', + () => TwofishEngine(), + ); + + /// Q-Table 0 + static const _q0 = [ + 0xa9, 0x67, 0xb3, 0xe8, 0x04, 0xfd, 0xa3, 0x76, // 0 - 7 + 0x9a, 0x92, 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, + 0x0d, 0xc6, 0x35, 0x98, 0x18, 0xf7, 0xec, 0x6c, + 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 0x94, 0x48, + 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, + 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, + 0x63, 0x01, 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, + 0xa6, 0xeb, 0xa5, 0xbe, 0x16, 0x0c, 0xe3, 0x61, + 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 0x25, 0x0b, + 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, + 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, + 0xcc, 0x95, 0x03, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, + 0xfb, 0xc3, 0x8e, 0xb5, 0xe9, 0xcf, 0xbf, 0xba, + 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xad, 0x24, 0xcd, 0xf9, 0xd8, + 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x08, 0x86, 0xe7, + 0xa1, 0x1d, 0xaa, 0xed, 0x06, 0x70, 0xb2, 0xd2, + 0x41, 0x7b, 0xa0, 0x11, 0x31, 0xc2, 0x27, 0x90, + 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 0xb1, 0xab, + 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0x0a, 0xef, + 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, + 0x47, 0x87, 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, + 0x2a, 0xce, 0xcb, 0x2f, 0xfc, 0x97, 0x05, 0x7a, + 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0x0e, 0xa7, 0x5a, + 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x02, + 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, + 0x57, 0xc7, 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, + 0x7e, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 0xdb, 0xf8, + 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, + 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0x0f, 0x00, + 0x6f, 0x9d, 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0 + ]; + + /// Q-Table 1 + static const _q1 = [ + 0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, // 0 - 7 + 0x4a, 0xd3, 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, + 0xd6, 0x32, 0xd8, 0xfd, 0x37, 0x71, 0xf1, 0xe1, + 0x30, 0x0f, 0xf8, 0x1b, 0x87, 0xfa, 0x06, 0x3f, + 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x00, 0xbc, 0x9d, + 0x6d, 0xc1, 0xb1, 0x0e, 0x80, 0x5d, 0xd2, 0xd5, + 0xa0, 0x84, 0x07, 0x14, 0xb5, 0x90, 0x2c, 0xa3, + 0xb2, 0x73, 0x4c, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 0x62, 0x96, + 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, + 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, + 0xca, 0xe3, 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, + 0xa6, 0x83, 0x20, 0xff, 0x9f, 0x77, 0xc3, 0xcc, + 0x03, 0x6f, 0x08, 0xbf, 0x40, 0xe7, 0x2b, 0xe2, + 0x79, 0x0c, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, + 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, + 0x66, 0x94, 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, + 0x0b, 0x72, 0xa7, 0x1c, 0xef, 0xd1, 0x53, 0x3e, + 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 0x2a, 0x49, + 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, + 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x01, + 0x18, 0x23, 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, + 0x4f, 0xf2, 0x65, 0x8e, 0x78, 0x5c, 0x58, 0x19, + 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 0x05, 0x64, + 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, + 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, + 0x29, 0x2e, 0xac, 0x15, 0x59, 0xa8, 0x0a, 0x9e, + 0x6e, 0x47, 0xdf, 0x34, 0x35, 0x6a, 0xcf, 0xdc, + 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 0xed, 0xab, + 0x12, 0xa2, 0x0d, 0x52, 0xbb, 0x02, 0x2f, 0xa9, + 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x04, 0xf6, 0xc2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91 + ]; + + /// M-Table 0 + static const _m0 = [ + 0xbcbc3275, 0xecec21f3, 0x202043c6, 0xb3b3c9f4, 0xdada03db, 0x02028b7b, + 0xe2e22bfb, 0x9e9efac8, // 0 - 7 + 0xc9c9ec4a, 0xd4d409d3, 0x18186be6, 0x1e1e9f6b, 0x98980e45, 0xb2b2387d, + 0xa6a6d2e8, 0x2626b74b, + 0x3c3c57d6, 0x93938a32, 0x8282eed8, 0x525298fd, 0x7b7bd437, 0xbbbb3771, + 0x5b5b97f1, 0x474783e1, + 0x24243c30, 0x5151e20f, 0xbabac6f8, 0x4a4af31b, 0xbfbf4887, 0x0d0d70fa, + 0xb0b0b306, 0x7575de3f, + 0xd2d2fd5e, 0x7d7d20ba, 0x666631ae, 0x3a3aa35b, 0x59591c8a, 0x00000000, + 0xcdcd93bc, 0x1a1ae09d, + 0xaeae2c6d, 0x7f7fabc1, 0x2b2bc7b1, 0xbebeb90e, 0xe0e0a080, 0x8a8a105d, + 0x3b3b52d2, 0x6464bad5, + 0xd8d888a0, 0xe7e7a584, 0x5f5fe807, 0x1b1b1114, 0x2c2cc2b5, 0xfcfcb490, + 0x3131272c, 0x808065a3, + 0x73732ab2, 0x0c0c8173, 0x79795f4c, 0x6b6b4154, 0x4b4b0292, 0x53536974, + 0x94948f36, 0x83831f51, + 0x2a2a3638, 0xc4c49cb0, 0x2222c8bd, 0xd5d5f85a, 0xbdbdc3fc, 0x48487860, + 0xffffce62, 0x4c4c0796, + 0x4141776c, 0xc7c7e642, 0xebeb24f7, 0x1c1c1410, 0x5d5d637c, 0x36362228, + 0x6767c027, 0xe9e9af8c, + 0x4444f913, 0x1414ea95, 0xf5f5bb9c, 0xcfcf18c7, 0x3f3f2d24, 0xc0c0e346, + 0x7272db3b, 0x54546c70, + 0x29294cca, 0xf0f035e3, 0x0808fe85, 0xc6c617cb, 0xf3f34f11, 0x8c8ce4d0, + 0xa4a45993, 0xcaca96b8, + 0x68683ba6, 0xb8b84d83, 0x38382820, 0xe5e52eff, 0xadad569f, 0x0b0b8477, + 0xc8c81dc3, 0x9999ffcc, + 0x5858ed03, 0x19199a6f, 0x0e0e0a08, 0x95957ebf, 0x70705040, 0xf7f730e7, + 0x6e6ecf2b, 0x1f1f6ee2, + 0xb5b53d79, 0x09090f0c, 0x616134aa, 0x57571682, 0x9f9f0b41, 0x9d9d803a, + 0x111164ea, 0x2525cdb9, + 0xafafdde4, 0x4545089a, 0xdfdf8da4, 0xa3a35c97, 0xeaead57e, 0x353558da, + 0xededd07a, 0x4343fc17, + 0xf8f8cb66, 0xfbfbb194, 0x3737d3a1, 0xfafa401d, 0xc2c2683d, 0xb4b4ccf0, + 0x32325dde, 0x9c9c71b3, + 0x5656e70b, 0xe3e3da72, 0x878760a7, 0x15151b1c, 0xf9f93aef, 0x6363bfd1, + 0x3434a953, 0x9a9a853e, + 0xb1b1428f, 0x7c7cd133, 0x88889b26, 0x3d3da65f, 0xa1a1d7ec, 0xe4e4df76, + 0x8181942a, 0x91910149, + 0x0f0ffb81, 0xeeeeaa88, 0x161661ee, 0xd7d77321, 0x9797f5c4, 0xa5a5a81a, + 0xfefe3feb, 0x6d6db5d9, + 0x7878aec5, 0xc5c56d39, 0x1d1de599, 0x7676a4cd, 0x3e3edcad, 0xcbcb6731, + 0xb6b6478b, 0xefef5b01, + 0x12121e18, 0x6060c523, 0x6a6ab0dd, 0x4d4df61f, 0xcecee94e, 0xdede7c2d, + 0x55559df9, 0x7e7e5a48, + 0x2121b24f, 0x03037af2, 0xa0a02665, 0x5e5e198e, 0x5a5a6678, 0x65654b5c, + 0x62624e58, 0xfdfd4519, + 0x0606f48d, 0x404086e5, 0xf2f2be98, 0x3333ac57, 0x17179067, 0x05058e7f, + 0xe8e85e05, 0x4f4f7d64, + 0x89896aaf, 0x10109563, 0x74742fb6, 0x0a0a75fe, 0x5c5c92f5, 0x9b9b74b7, + 0x2d2d333c, 0x3030d6a5, + 0x2e2e49ce, 0x494989e9, 0x46467268, 0x77775544, 0xa8a8d8e0, 0x9696044d, + 0x2828bd43, 0xa9a92969, + 0xd9d97929, 0x8686912e, 0xd1d187ac, 0xf4f44a15, 0x8d8d1559, 0xd6d682a8, + 0xb9b9bc0a, 0x42420d9e, + 0xf6f6c16e, 0x2f2fb847, 0xdddd06df, 0x23233934, 0xcccc6235, 0xf1f1c46a, + 0xc1c112cf, 0x8585ebdc, + 0x8f8f9e22, 0x7171a1c9, 0x9090f0c0, 0xaaaa539b, 0x0101f189, 0x8b8be1d4, + 0x4e4e8ced, 0x8e8e6fab, + 0xababa212, 0x6f6f3ea2, 0xe6e6540d, 0xdbdbf252, 0x92927bbb, 0xb7b7b602, + 0x6969ca2f, 0x3939d9a9, + 0xd3d30cd7, 0xa7a72361, 0xa2a2ad1e, 0xc3c399b4, 0x6c6c4450, 0x07070504, + 0x04047ff6, 0x272746c2, + 0xacaca716, 0xd0d07625, 0x50501386, 0xdcdcf756, 0x84841a55, 0xe1e15109, + 0x7a7a25be, 0x1313ef91 + ]; + + /// M-Table 1 + static const _m1 = [ + 0xa9d93939, 0x67901717, 0xb3719c9c, 0xe8d2a6a6, 0x04050707, 0xfd985252, + 0xa3658080, 0x76dfe4e4, // 0 - 7 + 0x9a084545, 0x92024b4b, 0x80a0e0e0, 0x78665a5a, 0xe4ddafaf, 0xddb06a6a, + 0xd1bf6363, 0x38362a2a, + 0x0d54e6e6, 0xc6432020, 0x3562cccc, 0x98bef2f2, 0x181e1212, 0xf724ebeb, + 0xecd7a1a1, 0x6c774141, + 0x43bd2828, 0x7532bcbc, 0x37d47b7b, 0x269b8888, 0xfa700d0d, 0x13f94444, + 0x94b1fbfb, 0x485a7e7e, + 0xf27a0303, 0xd0e48c8c, 0x8b47b6b6, 0x303c2424, 0x84a5e7e7, 0x54416b6b, + 0xdf06dddd, 0x23c56060, + 0x1945fdfd, 0x5ba33a3a, 0x3d68c2c2, 0x59158d8d, 0xf321ecec, 0xae316666, + 0xa23e6f6f, 0x82165757, + 0x63951010, 0x015befef, 0x834db8b8, 0x2e918686, 0xd9b56d6d, 0x511f8383, + 0x9b53aaaa, 0x7c635d5d, + 0xa63b6868, 0xeb3ffefe, 0xa5d63030, 0xbe257a7a, 0x16a7acac, 0x0c0f0909, + 0xe335f0f0, 0x6123a7a7, + 0xc0f09090, 0x8cafe9e9, 0x3a809d9d, 0xf5925c5c, 0x73810c0c, 0x2c273131, + 0x2576d0d0, 0x0be75656, + 0xbb7b9292, 0x4ee9cece, 0x89f10101, 0x6b9f1e1e, 0x53a93434, 0x6ac4f1f1, + 0xb499c3c3, 0xf1975b5b, + 0xe1834747, 0xe66b1818, 0xbdc82222, 0x450e9898, 0xe26e1f1f, 0xf4c9b3b3, + 0xb62f7474, 0x66cbf8f8, + 0xccff9999, 0x95ea1414, 0x03ed5858, 0x56f7dcdc, 0xd4e18b8b, 0x1c1b1515, + 0x1eada2a2, 0xd70cd3d3, + 0xfb2be2e2, 0xc31dc8c8, 0x8e195e5e, 0xb5c22c2c, 0xe9894949, 0xcf12c1c1, + 0xbf7e9595, 0xba207d7d, + 0xea641111, 0x77840b0b, 0x396dc5c5, 0xaf6a8989, 0x33d17c7c, 0xc9a17171, + 0x62ceffff, 0x7137bbbb, + 0x81fb0f0f, 0x793db5b5, 0x0951e1e1, 0xaddc3e3e, 0x242d3f3f, 0xcda47676, + 0xf99d5555, 0xd8ee8282, + 0xe5864040, 0xc5ae7878, 0xb9cd2525, 0x4d049696, 0x44557777, 0x080a0e0e, + 0x86135050, 0xe730f7f7, + 0xa1d33737, 0x1d40fafa, 0xaa346161, 0xed8c4e4e, 0x06b3b0b0, 0x706c5454, + 0xb22a7373, 0xd2523b3b, + 0x410b9f9f, 0x7b8b0202, 0xa088d8d8, 0x114ff3f3, 0x3167cbcb, 0xc2462727, + 0x27c06767, 0x90b4fcfc, + 0x20283838, 0xf67f0404, 0x60784848, 0xff2ee5e5, 0x96074c4c, 0x5c4b6565, + 0xb1c72b2b, 0xab6f8e8e, + 0x9e0d4242, 0x9cbbf5f5, 0x52f2dbdb, 0x1bf34a4a, 0x5fa63d3d, 0x9359a4a4, + 0x0abcb9b9, 0xef3af9f9, + 0x91ef1313, 0x85fe0808, 0x49019191, 0xee611616, 0x2d7cdede, 0x4fb22121, + 0x8f42b1b1, 0x3bdb7272, + 0x47b82f2f, 0x8748bfbf, 0x6d2caeae, 0x46e3c0c0, 0xd6573c3c, 0x3e859a9a, + 0x6929a9a9, 0x647d4f4f, + 0x2a948181, 0xce492e2e, 0xcb17c6c6, 0x2fca6969, 0xfcc3bdbd, 0x975ca3a3, + 0x055ee8e8, 0x7ad0eded, + 0xac87d1d1, 0x7f8e0505, 0xd5ba6464, 0x1aa8a5a5, 0x4bb72626, 0x0eb9bebe, + 0xa7608787, 0x5af8d5d5, + 0x28223636, 0x14111b1b, 0x3fde7575, 0x2979d9d9, 0x88aaeeee, 0x3c332d2d, + 0x4c5f7979, 0x02b6b7b7, + 0xb896caca, 0xda583535, 0xb09cc4c4, 0x17fc4343, 0x551a8484, 0x1ff64d4d, + 0x8a1c5959, 0x7d38b2b2, + 0x57ac3333, 0xc718cfcf, 0x8df40606, 0x74695353, 0xb7749b9b, 0xc4f59797, + 0x9f56adad, 0x72dae3e3, + 0x7ed5eaea, 0x154af4f4, 0x229e8f8f, 0x12a2abab, 0x584e6262, 0x07e85f5f, + 0x99e51d1d, 0x34392323, + 0x6ec1f6f6, 0x50446c6c, 0xde5d3232, 0x68724646, 0x6526a0a0, 0xbc93cdcd, + 0xdb03dada, 0xf8c6baba, + 0xc8fa9e9e, 0xa882d6d6, 0x2bcf6e6e, 0x40507070, 0xdceb8585, 0xfe750a0a, + 0x328a9393, 0xa48ddfdf, + 0xca4c2929, 0x10141c1c, 0x2173d7d7, 0xf0ccb4b4, 0xd309d4d4, 0x5d108a8a, + 0x0fe25151, 0x00000000, + 0x6f9a1919, 0x9de01a1a, 0x368f9494, 0x42e6c7c7, 0x4aecc9c9, 0x5efdd2d2, + 0xc1ab7f7f, 0xe0d8a8a8 + ]; + + /// M-Table 2 + static const _m2 = [ + 0xbc75bc32, 0xecf3ec21, 0x20c62043, 0xb3f4b3c9, 0xdadbda03, 0x027b028b, + 0xe2fbe22b, 0x9ec89efa, // 0 - 7 + 0xc94ac9ec, 0xd4d3d409, 0x18e6186b, 0x1e6b1e9f, 0x9845980e, 0xb27db238, + 0xa6e8a6d2, 0x264b26b7, + 0x3cd63c57, 0x9332938a, 0x82d882ee, 0x52fd5298, 0x7b377bd4, 0xbb71bb37, + 0x5bf15b97, 0x47e14783, + 0x2430243c, 0x510f51e2, 0xbaf8bac6, 0x4a1b4af3, 0xbf87bf48, 0x0dfa0d70, + 0xb006b0b3, 0x753f75de, + 0xd25ed2fd, 0x7dba7d20, 0x66ae6631, 0x3a5b3aa3, 0x598a591c, 0x00000000, + 0xcdbccd93, 0x1a9d1ae0, + 0xae6dae2c, 0x7fc17fab, 0x2bb12bc7, 0xbe0ebeb9, 0xe080e0a0, 0x8a5d8a10, + 0x3bd23b52, 0x64d564ba, + 0xd8a0d888, 0xe784e7a5, 0x5f075fe8, 0x1b141b11, 0x2cb52cc2, 0xfc90fcb4, + 0x312c3127, 0x80a38065, + 0x73b2732a, 0x0c730c81, 0x794c795f, 0x6b546b41, 0x4b924b02, 0x53745369, + 0x9436948f, 0x8351831f, + 0x2a382a36, 0xc4b0c49c, 0x22bd22c8, 0xd55ad5f8, 0xbdfcbdc3, 0x48604878, + 0xff62ffce, 0x4c964c07, + 0x416c4177, 0xc742c7e6, 0xebf7eb24, 0x1c101c14, 0x5d7c5d63, 0x36283622, + 0x672767c0, 0xe98ce9af, + 0x441344f9, 0x149514ea, 0xf59cf5bb, 0xcfc7cf18, 0x3f243f2d, 0xc046c0e3, + 0x723b72db, 0x5470546c, + 0x29ca294c, 0xf0e3f035, 0x088508fe, 0xc6cbc617, 0xf311f34f, 0x8cd08ce4, + 0xa493a459, 0xcab8ca96, + 0x68a6683b, 0xb883b84d, 0x38203828, 0xe5ffe52e, 0xad9fad56, 0x0b770b84, + 0xc8c3c81d, 0x99cc99ff, + 0x580358ed, 0x196f199a, 0x0e080e0a, 0x95bf957e, 0x70407050, 0xf7e7f730, + 0x6e2b6ecf, 0x1fe21f6e, + 0xb579b53d, 0x090c090f, 0x61aa6134, 0x57825716, 0x9f419f0b, 0x9d3a9d80, + 0x11ea1164, 0x25b925cd, + 0xafe4afdd, 0x459a4508, 0xdfa4df8d, 0xa397a35c, 0xea7eead5, 0x35da3558, + 0xed7aedd0, 0x431743fc, + 0xf866f8cb, 0xfb94fbb1, 0x37a137d3, 0xfa1dfa40, 0xc23dc268, 0xb4f0b4cc, + 0x32de325d, 0x9cb39c71, + 0x560b56e7, 0xe372e3da, 0x87a78760, 0x151c151b, 0xf9eff93a, 0x63d163bf, + 0x345334a9, 0x9a3e9a85, + 0xb18fb142, 0x7c337cd1, 0x8826889b, 0x3d5f3da6, 0xa1eca1d7, 0xe476e4df, + 0x812a8194, 0x91499101, + 0x0f810ffb, 0xee88eeaa, 0x16ee1661, 0xd721d773, 0x97c497f5, 0xa51aa5a8, + 0xfeebfe3f, 0x6dd96db5, + 0x78c578ae, 0xc539c56d, 0x1d991de5, 0x76cd76a4, 0x3ead3edc, 0xcb31cb67, + 0xb68bb647, 0xef01ef5b, + 0x1218121e, 0x602360c5, 0x6add6ab0, 0x4d1f4df6, 0xce4ecee9, 0xde2dde7c, + 0x55f9559d, 0x7e487e5a, + 0x214f21b2, 0x03f2037a, 0xa065a026, 0x5e8e5e19, 0x5a785a66, 0x655c654b, + 0x6258624e, 0xfd19fd45, + 0x068d06f4, 0x40e54086, 0xf298f2be, 0x335733ac, 0x17671790, 0x057f058e, + 0xe805e85e, 0x4f644f7d, + 0x89af896a, 0x10631095, 0x74b6742f, 0x0afe0a75, 0x5cf55c92, 0x9bb79b74, + 0x2d3c2d33, 0x30a530d6, + 0x2ece2e49, 0x49e94989, 0x46684672, 0x77447755, 0xa8e0a8d8, 0x964d9604, + 0x284328bd, 0xa969a929, + 0xd929d979, 0x862e8691, 0xd1acd187, 0xf415f44a, 0x8d598d15, 0xd6a8d682, + 0xb90ab9bc, 0x429e420d, + 0xf66ef6c1, 0x2f472fb8, 0xdddfdd06, 0x23342339, 0xcc35cc62, 0xf16af1c4, + 0xc1cfc112, 0x85dc85eb, + 0x8f228f9e, 0x71c971a1, 0x90c090f0, 0xaa9baa53, 0x018901f1, 0x8bd48be1, + 0x4eed4e8c, 0x8eab8e6f, + 0xab12aba2, 0x6fa26f3e, 0xe60de654, 0xdb52dbf2, 0x92bb927b, 0xb702b7b6, + 0x692f69ca, 0x39a939d9, + 0xd3d7d30c, 0xa761a723, 0xa21ea2ad, 0xc3b4c399, 0x6c506c44, 0x07040705, + 0x04f6047f, 0x27c22746, + 0xac16aca7, 0xd025d076, 0x50865013, 0xdc56dcf7, 0x8455841a, 0xe109e151, + 0x7abe7a25, 0x139113ef + ]; + + /// M-Table 3 + static const _m3 = [ + 0xd939a9d9, 0x90176790, 0x719cb371, 0xd2a6e8d2, 0x05070405, 0x9852fd98, + 0x6580a365, 0xdfe476df, // 0 - 7 + 0x08459a08, 0x024b9202, 0xa0e080a0, 0x665a7866, 0xddafe4dd, 0xb06addb0, + 0xbf63d1bf, 0x362a3836, + 0x54e60d54, 0x4320c643, 0x62cc3562, 0xbef298be, 0x1e12181e, 0x24ebf724, + 0xd7a1ecd7, 0x77416c77, + 0xbd2843bd, 0x32bc7532, 0xd47b37d4, 0x9b88269b, 0x700dfa70, 0xf94413f9, + 0xb1fb94b1, 0x5a7e485a, + 0x7a03f27a, 0xe48cd0e4, 0x47b68b47, 0x3c24303c, 0xa5e784a5, 0x416b5441, + 0x06dddf06, 0xc56023c5, + 0x45fd1945, 0xa33a5ba3, 0x68c23d68, 0x158d5915, 0x21ecf321, 0x3166ae31, + 0x3e6fa23e, 0x16578216, + 0x95106395, 0x5bef015b, 0x4db8834d, 0x91862e91, 0xb56dd9b5, 0x1f83511f, + 0x53aa9b53, 0x635d7c63, + 0x3b68a63b, 0x3ffeeb3f, 0xd630a5d6, 0x257abe25, 0xa7ac16a7, 0x0f090c0f, + 0x35f0e335, 0x23a76123, + 0xf090c0f0, 0xafe98caf, 0x809d3a80, 0x925cf592, 0x810c7381, 0x27312c27, + 0x76d02576, 0xe7560be7, + 0x7b92bb7b, 0xe9ce4ee9, 0xf10189f1, 0x9f1e6b9f, 0xa93453a9, 0xc4f16ac4, + 0x99c3b499, 0x975bf197, + 0x8347e183, 0x6b18e66b, 0xc822bdc8, 0x0e98450e, 0x6e1fe26e, 0xc9b3f4c9, + 0x2f74b62f, 0xcbf866cb, + 0xff99ccff, 0xea1495ea, 0xed5803ed, 0xf7dc56f7, 0xe18bd4e1, 0x1b151c1b, + 0xada21ead, 0x0cd3d70c, + 0x2be2fb2b, 0x1dc8c31d, 0x195e8e19, 0xc22cb5c2, 0x8949e989, 0x12c1cf12, + 0x7e95bf7e, 0x207dba20, + 0x6411ea64, 0x840b7784, 0x6dc5396d, 0x6a89af6a, 0xd17c33d1, 0xa171c9a1, + 0xceff62ce, 0x37bb7137, + 0xfb0f81fb, 0x3db5793d, 0x51e10951, 0xdc3eaddc, 0x2d3f242d, 0xa476cda4, + 0x9d55f99d, 0xee82d8ee, + 0x8640e586, 0xae78c5ae, 0xcd25b9cd, 0x04964d04, 0x55774455, 0x0a0e080a, + 0x13508613, 0x30f7e730, + 0xd337a1d3, 0x40fa1d40, 0x3461aa34, 0x8c4eed8c, 0xb3b006b3, 0x6c54706c, + 0x2a73b22a, 0x523bd252, + 0x0b9f410b, 0x8b027b8b, 0x88d8a088, 0x4ff3114f, 0x67cb3167, 0x4627c246, + 0xc06727c0, 0xb4fc90b4, + 0x28382028, 0x7f04f67f, 0x78486078, 0x2ee5ff2e, 0x074c9607, 0x4b655c4b, + 0xc72bb1c7, 0x6f8eab6f, + 0x0d429e0d, 0xbbf59cbb, 0xf2db52f2, 0xf34a1bf3, 0xa63d5fa6, 0x59a49359, + 0xbcb90abc, 0x3af9ef3a, + 0xef1391ef, 0xfe0885fe, 0x01914901, 0x6116ee61, 0x7cde2d7c, 0xb2214fb2, + 0x42b18f42, 0xdb723bdb, + 0xb82f47b8, 0x48bf8748, 0x2cae6d2c, 0xe3c046e3, 0x573cd657, 0x859a3e85, + 0x29a96929, 0x7d4f647d, + 0x94812a94, 0x492ece49, 0x17c6cb17, 0xca692fca, 0xc3bdfcc3, 0x5ca3975c, + 0x5ee8055e, 0xd0ed7ad0, + 0x87d1ac87, 0x8e057f8e, 0xba64d5ba, 0xa8a51aa8, 0xb7264bb7, 0xb9be0eb9, + 0x6087a760, 0xf8d55af8, + 0x22362822, 0x111b1411, 0xde753fde, 0x79d92979, 0xaaee88aa, 0x332d3c33, + 0x5f794c5f, 0xb6b702b6, + 0x96cab896, 0x5835da58, 0x9cc4b09c, 0xfc4317fc, 0x1a84551a, 0xf64d1ff6, + 0x1c598a1c, 0x38b27d38, + 0xac3357ac, 0x18cfc718, 0xf4068df4, 0x69537469, 0x749bb774, 0xf597c4f5, + 0x56ad9f56, 0xdae372da, + 0xd5ea7ed5, 0x4af4154a, 0x9e8f229e, 0xa2ab12a2, 0x4e62584e, 0xe85f07e8, + 0xe51d99e5, 0x39233439, + 0xc1f66ec1, 0x446c5044, 0x5d32de5d, 0x72466872, 0x26a06526, 0x93cdbc93, + 0x03dadb03, 0xc6baf8c6, + 0xfa9ec8fa, 0x82d6a882, 0xcf6e2bcf, 0x50704050, 0xeb85dceb, 0x750afe75, + 0x8a93328a, 0x8ddfa48d, + 0x4c29ca4c, 0x141c1014, 0x73d72173, 0xccb4f0cc, 0x09d4d309, 0x108a5d10, + 0xe2510fe2, 0x00000000, + 0x9a196f9a, 0xe01a9de0, 0x8f94368f, 0xe6c742e6, 0xecc94aec, 0xfdd25efd, + 0xab7fc1ab, 0xd8a8e0d8 + ]; + + /// The Key Schedule List + final List _subKey = []; + + /// The Key depended S-Table 0 + final _sTable0 = List.filled(256, 0); + + /// The Key depended S-Table 1 + final _sTable1 = List.filled(256, 0); + + /// The Key depended S-Table 2 + final _sTable2 = List.filled(256, 0); + + /// The Key depended S-Table 3 + final _sTable3 = List.filled(256, 0); + + static const BLOCK_SIZE = 16; + + bool _forEncryption = false; + + Uint8List _workingKey = Uint8List(0); + + @override + String get algorithmName => 'Twofish'; + + @override + int get blockSize => BLOCK_SIZE; + + @override + void init(bool forEncryption, CipherParameters? params) { + if (params is KeyParameter) { + _forEncryption = forEncryption; + _workingKey = params.key; + final keyBits = _workingKey.length * 8; + if (!(keyBits == 128 || keyBits == 192 || keyBits == 256)) { + throw ArgumentError('Key length not 128/192/256 bits.'); + } + _setupKey(_workingKey); + } else { + throw ArgumentError( + 'Invalid parameter passed to $algorithmName init - ${params.runtimeType}', + ); + } + } + + @override + int processBlock( + Uint8List input, + int inOff, + Uint8List output, + int outOff, + ) { + if (_workingKey.isEmpty) { + throw StateError('$algorithmName not initialised'); + } + if ((inOff + BLOCK_SIZE) > input.lengthInBytes) { + throw ArgumentError('Input buffer too short for $algorithmName engine'); + } + if ((outOff + BLOCK_SIZE) > output.lengthInBytes) { + throw ArgumentError('Output buffer too short for $algorithmName engine'); + } + + if (_forEncryption) { + _encryptBlock(input, inOff, output, outOff); + } else { + _decryptBlock(input, inOff, output, outOff); + } + + return BLOCK_SIZE; + } + + @override + void reset() { + if (_workingKey.isNotEmpty) { + _setupKey(_workingKey); + } + } + + void _setupKey(final Uint8List key) { + switch (key.length) { + case 16: + final list1 = + _mdsrem(_unpack32Le(key.sublist(0)), _unpack32Le(key.sublist(4))); + final list2 = + _mdsrem(_unpack32Le(key.sublist(8)), _unpack32Le(key.sublist(12))); + + for (var i = 0, j = 1; i < 40; i += 2, j += 2) { + var a = _m0[_q0[_q0[i] ^ key[8]] ^ key[0]] ^ + _m1[_q0[_q1[i] ^ key[9]] ^ key[1]] ^ + _m2[_q1[_q0[i] ^ key[10]] ^ key[2]] ^ + _m3[_q1[_q1[i] ^ key[11]] ^ key[3]]; + var b = _m0[_q0[_q0[j] ^ key[12]] ^ key[4]] ^ + _m1[_q0[_q1[j] ^ key[13]] ^ key[5]] ^ + _m2[_q1[_q0[j] ^ key[14]] ^ key[6]] ^ + _m3[_q1[_q1[j] ^ key[15]] ^ key[7]]; + b = (b << 8) | (b >> 24 & 0xff); + a += b; + _subKey.add(a); + a += b; + _subKey.add(a << 9 | a >> 23 & 0x1ff); + } + + for (var i = 0; i < 256; ++i) { + _sTable0[i] = _m0[_q0[_q0[i] ^ list1[3]] ^ list2[3]]; + _sTable1[i] = _m1[_q0[_q1[i] ^ list1[2]] ^ list2[2]]; + _sTable2[i] = _m2[_q1[_q0[i] ^ list1[1]] ^ list2[1]]; + _sTable3[i] = _m3[_q1[_q1[i] ^ list1[0]] ^ list2[0]]; + } + break; + case 24: + final list1 = + _mdsrem(_unpack32Le(key.sublist(0)), _unpack32Le(key.sublist(4))); + final list2 = + _mdsrem(_unpack32Le(key.sublist(8)), _unpack32Le(key.sublist(12))); + final list3 = + _mdsrem(_unpack32Le(key.sublist(16)), _unpack32Le(key.sublist(20))); + + for (var i = 0, j = 1; i < 40; i += 2, j += 2) { + var a = _m0[_q0[_q0[_q1[i] ^ key[16]] ^ key[8]] ^ key[0]] ^ + _m1[_q0[_q1[_q1[i] ^ key[17]] ^ key[9]] ^ key[1]] ^ + _m2[_q1[_q0[_q0[i] ^ key[18]] ^ key[10]] ^ key[2]] ^ + _m3[_q1[_q1[_q0[i] ^ key[19]] ^ key[11]] ^ key[3]]; + var b = _m0[_q0[_q0[_q1[j] ^ key[20]] ^ key[12]] ^ key[4]] ^ + _m1[_q0[_q1[_q1[j] ^ key[21]] ^ key[13]] ^ key[5]] ^ + _m2[_q1[_q0[_q0[j] ^ key[22]] ^ key[14]] ^ key[6]] ^ + _m3[_q1[_q1[_q0[j] ^ key[23]] ^ key[15]] ^ key[7]]; + + b = (b << 8) | (b >> 24 & 0xff); + a += b; + _subKey.add(a); + a += b; + _subKey.add(a << 9 | a >> 23 & 0x1ff); + } + + for (var i = 0; i < 256; ++i) { + _sTable0[i] = _m0[_q0[_q0[_q1[i] ^ list1[3]] ^ list2[3]] ^ list3[3]]; + _sTable1[i] = _m1[_q0[_q1[_q1[i] ^ list1[2]] ^ list2[2]] ^ list3[2]]; + _sTable2[i] = _m2[_q1[_q0[_q0[i] ^ list1[1]] ^ list2[1]] ^ list3[1]]; + _sTable3[i] = _m3[_q1[_q1[_q0[i] ^ list1[0]] ^ list2[0]] ^ list3[0]]; + } + break; + case 32: + final list1 = + _mdsrem(_unpack32Le(key.sublist(0)), _unpack32Le(key.sublist(4))); + final list2 = + _mdsrem(_unpack32Le(key.sublist(8)), _unpack32Le(key.sublist(12))); + final list3 = + _mdsrem(_unpack32Le(key.sublist(16)), _unpack32Le(key.sublist(20))); + final list4 = + _mdsrem(_unpack32Le(key.sublist(24)), _unpack32Le(key.sublist(28))); + + for (var i = 0, j = 1; i < 40; i += 2, j += 2) { + var a = _m0[ + _q0[_q0[_q1[_q1[i] ^ key[24]] ^ key[16]] ^ key[8]] ^ key[0]] ^ + _m1[_q0[_q1[_q1[_q0[i] ^ key[25]] ^ key[17]] ^ key[9]] ^ key[1]] ^ + _m2[_q1[_q0[_q0[_q0[i] ^ key[26]] ^ key[18]] ^ key[10]] ^ + key[2]] ^ + _m3[_q1[_q1[_q0[_q1[i] ^ key[27]] ^ key[19]] ^ key[11]] ^ key[3]]; + var b = _m0[_q0[_q0[_q1[_q1[j] ^ key[28]] ^ key[20]] ^ key[12]] ^ + key[4]] ^ + _m1[_q0[_q1[_q1[_q0[j] ^ key[29]] ^ key[21]] ^ key[13]] ^ + key[5]] ^ + _m2[_q1[_q0[_q0[_q0[j] ^ key[30]] ^ key[22]] ^ key[14]] ^ + key[6]] ^ + _m3[_q1[_q1[_q0[_q1[j] ^ key[31]] ^ key[23]] ^ key[15]] ^ key[7]]; + b = (b << 8) | (b >> 24 & 0xff); + a = a + b; + _subKey.add(a); + a = a + b; + _subKey.add(a << 9 | a >> 23 & 0x1ff); + } + + for (var i = 0; i < 256; ++i) { + _sTable0[i] = _m0[ + _q0[_q0[_q1[_q1[i] ^ list1[3]] ^ list2[3]] ^ list3[3]] ^ + list4[3]]; + _sTable1[i] = _m1[ + _q0[_q1[_q1[_q0[i] ^ list1[2]] ^ list2[2]] ^ list3[2]] ^ + list4[2]]; + _sTable2[i] = _m2[ + _q1[_q0[_q0[_q0[i] ^ list1[1]] ^ list2[1]] ^ list3[1]] ^ + list4[1]]; + _sTable3[i] = _m3[ + _q1[_q1[_q0[_q1[i] ^ list1[0]] ^ list2[0]] ^ list3[0]] ^ + list4[0]]; + } + break; + default: + } + } + + /// Encrypt the given input starting at the given offset and place + /// the result in the provided buffer starting at the given offset. + /// The input will be an exact multiple of our blocksize. + void _encryptBlock( + final Uint8List input, + final int inOff, + final Uint8List output, + final int outOff, + ) { + var r0 = _unpack32Le(input.sublist(inOff)) ^ _subKey[0]; + var r1 = _unpack32Le(input.sublist(inOff + 4)) ^ _subKey[1]; + var r2 = _unpack32Le(input.sublist(inOff + 8)) ^ _subKey[2]; + var r3 = _unpack32Le(input.sublist(inOff + 12)) ^ _subKey[3]; + + var ki = 7; + while (ki < 39) { + var t0 = _sTable0[r0 & 0xff] ^ + _sTable1[(r0 >> 8) & 0xff] ^ + _sTable2[(r0 >> 16) & 0xff] ^ + _sTable3[(r0 >> 24) & 0xff]; + var t1 = _sTable0[(r1 >> 24) & 0xff] ^ + _sTable1[r1 & 0xff] ^ + _sTable2[(r1 >> 8) & 0xff] ^ + _sTable3[(r1 >> 16) & 0xff]; + + r2 ^= t0 + t1 + _subKey[++ki]; + r2 = (r2 >> 1 & 0x7fffffff) | (r2 << 31); + r3 = (((r3 >> 31) & 1) | (r3 << 1)) ^ (t0 + (t1 << 1) + _subKey[++ki]); + + t0 = _sTable0[r2 & 0xff] ^ + _sTable1[(r2 >> 8) & 0xff] ^ + _sTable2[(r2 >> 16) & 0xff] ^ + _sTable3[(r2 >> 24) & 0xff]; + t1 = _sTable0[(r3 >> 24) & 0xff] ^ + _sTable1[r3 & 0xff] ^ + _sTable2[(r3 >> 8) & 0xff] ^ + _sTable3[(r3 >> 16) & 0xff]; + + r0 ^= t0 + t1 + _subKey[++ki]; + r0 = (r0 >> 1 & 0x7fffffff) | (r0 << 31); + r1 = (((r1 >> 31) & 1) | (r1 << 1)) ^ (t0 + (t1 << 1) + _subKey[++ki]); + } + + output.setAll(outOff, _pack32Le(r2 ^ _subKey[4])); + output.setAll(outOff + 4, _pack32Le(r3 ^ _subKey[5])); + output.setAll(outOff + 8, _pack32Le(r0 ^ _subKey[6])); + output.setAll(outOff + 12, _pack32Le(r1 ^ _subKey[7])); + } + + /// Decrypt the given input starting at the given offset and place + /// the result in the provided buffer starting at the given offset. + /// The input will be an exact multiple of our blocksize. + void _decryptBlock( + final Uint8List input, + final int inOff, + final Uint8List output, + final int outOff, + ) { + var r0 = _subKey[4] ^ _unpack32Le(input.sublist(inOff)); + var r1 = _subKey[5] ^ _unpack32Le(input.sublist(inOff + 4)); + var r2 = _subKey[6] ^ _unpack32Le(input.sublist(inOff + 8)); + var r3 = _subKey[7] ^ _unpack32Le(input.sublist(inOff + 12)); + + var ki = 40; + while (ki > 8) { + var t0 = _sTable0[r0 & 0xff] ^ + _sTable1[r0 >> 8 & 0xff] ^ + _sTable2[r0 >> 16 & 0xff] ^ + _sTable3[r0 >> 24 & 0xff]; + var t1 = _sTable0[r1 >> 24 & 0xff] ^ + _sTable1[r1 & 0xff] ^ + _sTable2[r1 >> 8 & 0xff] ^ + _sTable3[r1 >> 16 & 0xff]; + + r3 ^= t0 + (t1 << 1) + _subKey[--ki]; + r3 = r3 >> 1 & 0x7fffffff | r3 << 31; + r2 = (r2 >> 31 & 0x1 | r2 << 1) ^ (t0 + t1 + _subKey[--ki]); + + t0 = _sTable0[r2 & 0xff] ^ + _sTable1[r2 >> 8 & 0xff] ^ + _sTable2[r2 >> 16 & 0xff] ^ + _sTable3[r2 >> 24 & 0xff]; + t1 = _sTable0[r3 >> 24 & 0xff] ^ + _sTable1[r3 & 0xff] ^ + _sTable2[r3 >> 8 & 0xff] ^ + _sTable3[r3 >> 16 & 0xff]; + + r1 ^= t0 + (t1 << 1) + _subKey[--ki]; + r1 = r1 >> 1 & 0x7fffffff | r1 << 31; + r0 = (r0 >> 31 & 0x1 | r0 << 1) ^ (t0 + t1 + _subKey[--ki]); + } + + output.setAll(outOff, _pack32Le(r2 ^ _subKey[0])); + output.setAll(outOff + 4, _pack32Le(r3 ^ _subKey[1])); + output.setAll(outOff + 8, _pack32Le(r0 ^ _subKey[2])); + output.setAll(outOff + 12, _pack32Le(r1 ^ _subKey[3])); + } + + List _mdsrem(final int x, final int y) { + var a = x; + var b = y; + + /// No gain by unrolling this loop. + for (var i = 0; i < 8; ++i) { + /// Get most significant coefficient. + final t = 0xff & (b >> 24); + + /// Shift the others up. + b = (b << 8) | (0xff & (a >> 24)); + a <<= 8; + + var u = t << 1; + + /// Subtract the modular polynomial on overflow. + if ((t & 0x80) > 0) { + u ^= 0x14d; + } + + /// Remove t * (a * x^2 + 1). + b ^= t ^ (u << 16); + + /// Form u = a*t + t/a = t*(a + 1/a). + u ^= 0x7fffffff & (t >> 1); + + /// Add the modular polynomial on underflow. + if ((t & 0x01) > 0) { + u ^= 0xa6; + } + + /// Remove t * (a + 1/a) * (x^3 + x). + b ^= (u << 24) | (u << 8); + } + return [0xff & b >> 24, 0xff & b >> 16, 0xff & b >> 8, 0xff & b]; + } + + static int _unpack32Le(Uint8List x) => + x.buffer.asByteData().getUint32(0, Endian.little); + static Uint8List _pack32Le(int x) => + Uint8List(4)..buffer.asByteData().setUint32(0, x, Endian.little); +} diff --git a/pointycastle/lib/digests/blake2b.dart b/pointycastle/lib/digests/blake2b.dart new file mode 100644 index 0000000..842bfd4 --- /dev/null +++ b/pointycastle/lib/digests/blake2b.dart @@ -0,0 +1,306 @@ +// This file has been migrated. + +library impl.digest.blake2b; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +class Blake2bDigest extends BaseDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'Blake2b', () => Blake2bDigest()); + + static const _rounds = 12; + static const _blockSize = 128; + + int _digestLength = 64; + int _keyLength = 0; + Uint8List? _salt; + Uint8List? _personalization; + + Uint8List? _key; + + Uint8List? _buffer; + // Position of last inserted byte: + int _bufferPos = 0; // a value from 0 up to 128 + final _internalState = + Register64List(16); // In the Blake2b paper it is called: v + Register64List? + _chainValue; // state vector, in the Blake2b paper it is called: h + + final _t0 = + Register64(); // holds last significant bits, counter (counts bytes) + final _t1 = Register64(); // counter: Length up to 2^128 are supported + final _f0 = Register64(); // finalization flag, for last block: ~0L + + Blake2bDigest( + {int digestSize = 64, + Uint8List? key, + Uint8List? salt, + Uint8List? personalization}) { + _buffer = Uint8List(_blockSize); + + if (digestSize < 1 || digestSize > 64) { + throw ArgumentError('Invalid digest length (required: 1 - 64)'); + } + _digestLength = digestSize; + if (salt != null) { + if (salt.length != 16) { + throw ArgumentError('salt length must be exactly 16 bytes'); + } + _salt = Uint8List.fromList(salt); + } + if (personalization != null) { + if (personalization.length != 16) { + throw ArgumentError('personalization length must be exactly 16 bytes'); + } + _personalization = Uint8List.fromList(personalization); + } + if (key != null) { + if (key.length > 64) throw ArgumentError('Keys > 64 are not supported'); + _key = Uint8List.fromList(key); + + _keyLength = key.length; + _buffer!.setAll(0, key); + _bufferPos = _blockSize; + } + init(); + } + + @override + String get algorithmName => 'Blake2b'; + @override + int get digestSize => _digestLength; + + void init() { + if (_chainValue == null) { + _chainValue = Register64List(8); + _chainValue![0] + ..set(_blake2bIV[0]) + ..xor(Register64(digestSize | (_keyLength << 8) | 0x1010000)); + _chainValue![1].set(_blake2bIV[1]); + _chainValue![2].set(_blake2bIV[2]); + + _chainValue![3].set(_blake2bIV[3]); + + _chainValue![4].set(_blake2bIV[4]); + _chainValue![5].set(_blake2bIV[5]); + if (_salt != null) { + _chainValue![4].xor(Register64()..unpack(_salt, 0, Endian.little)); + _chainValue![5].xor(Register64()..unpack(_salt, 8, Endian.little)); + } + + _chainValue![6].set(_blake2bIV[6]); + _chainValue![7].set(_blake2bIV[7]); + if (_personalization != null) { + _chainValue![6] + .xor(Register64()..unpack(_personalization, 0, Endian.little)); + _chainValue![7] + .xor(Register64()..unpack(_personalization, 8, Endian.little)); + } + } + } + + void _initializeInternalState() { + _internalState.setRange(0, _chainValue!.length, _chainValue!); + _internalState.setRange( + _chainValue!.length, _chainValue!.length + 4, _blake2bIV); + _internalState[12] + ..set(_t0) + ..xor(_blake2bIV[4]); + _internalState[13] + ..set(_t1) + ..xor(_blake2bIV[5]); + _internalState[14] + ..set(_f0) + ..xor(_blake2bIV[6]); + _internalState[15].set(_blake2bIV[7]); // ^ f1 with f1 = 0 + } + + @override + void updateByte(int inp) { + if (_bufferPos == _blockSize) { + // full buffer + _t0.sum(_blockSize); + // This requires hashing > 2^64 bytes which is impossible for the forseeable future. + // So _t1 is untested dead code, but I've left it in because it is in the source library. + if (_t0.lo32 == 0 && _t0.hi32 == 0) _t1.sum(1); + _compress(_buffer, 0); + _buffer!.fillRange(0, _buffer!.length, 0); // clear buffer + _buffer![0] = inp; + _bufferPos = 1; + } else { + _buffer![_bufferPos] = inp; + ++_bufferPos; + } + } + + @override + void update(Uint8List inp, int inpOff, int len) { + if (len == 0) return; + var remainingLength = 0; + if (_bufferPos != 0) { + remainingLength = _blockSize - _bufferPos; + if (remainingLength < len) { + _buffer! + .setRange(_bufferPos, _bufferPos + remainingLength, inp, inpOff); + _t0.sum(_blockSize); + if (_t0.lo32 == 0 && _t0.hi32 == 0) _t1.sum(1); + _compress(_buffer, 0); + _bufferPos = 0; + _buffer!.fillRange(0, _buffer!.length, 0); // clear buffer + } else { + _buffer!.setRange(_bufferPos, _bufferPos + len, inp, inpOff); + _bufferPos += len; + return; + } + } + + int msgPos; + var blockWiseLastPos = inpOff + len - _blockSize; + for (msgPos = inpOff + remainingLength; + msgPos < blockWiseLastPos; + msgPos += _blockSize) { + _t0.sum(_blockSize); + if (_t0.lo32 == 0 && _t0.hi32 == 0) _t1.sum(1); + _compress(inp, msgPos); + } + + _buffer!.setRange(0, inpOff + len - msgPos, inp, msgPos); + _bufferPos += inpOff + len - msgPos; + } + + @override + int doFinal(Uint8List out, int outOff) { + _f0.set(0xFFFFFFFF, 0xFFFFFFFF); + _t0.sum(_bufferPos); + if (_bufferPos > 0 && _t0.lo32 == 0 && _t0.hi32 == 0) _t1.sum(1); + _compress(_buffer, 0); + _buffer!.fillRange(0, _buffer!.length, 0); // clear buffer + _internalState.fillRange(0, _internalState.length, 0); + + final packedValue = Uint8List(8); + final packedValueData = packedValue.buffer.asByteData(); + for (var i = 0; i < _chainValue!.length && (i * 8 < _digestLength); ++i) { + _chainValue![i].pack(packedValueData, 0, Endian.little); + + final start = outOff + i * 8; + if (i * 8 < _digestLength - 8) { + out.setRange(start, start + 8, packedValue); + } else { + out.setRange(start, start + _digestLength - (i * 8), packedValue); + } + } + + _chainValue!.fillRange(0, _chainValue!.length, 0); + + reset(); + + return _digestLength; + } + + @override + void reset() { + _bufferPos = 0; + _f0.set(0); + _t0.set(0); + _t1.set(0); + _chainValue = null; + _buffer!.fillRange(0, _buffer!.length, 0); + if (_key != null) { + _buffer!.setAll(0, _key!); + _bufferPos = _blockSize; + } + init(); + } + + // This variable is faster as a class member. + final _m = Register64List(16); + void _compress(Uint8List? message, int messagePos) { + _initializeInternalState(); + + for (var j = 0; j < 16; ++j) { + _m[j].unpack(message, messagePos + j * 8, Endian.little); + } + + for (var round = 0; round < _rounds; ++round) { + G(_m[_blake2bSigma[round][0]], _m[_blake2bSigma[round][1]], 0, 4, 8, 12); + G(_m[_blake2bSigma[round][2]], _m[_blake2bSigma[round][3]], 1, 5, 9, 13); + G(_m[_blake2bSigma[round][4]], _m[_blake2bSigma[round][5]], 2, 6, 10, 14); + G(_m[_blake2bSigma[round][6]], _m[_blake2bSigma[round][7]], 3, 7, 11, 15); + G(_m[_blake2bSigma[round][8]], _m[_blake2bSigma[round][9]], 0, 5, 10, 15); + G(_m[_blake2bSigma[round][10]], _m[_blake2bSigma[round][11]], 1, 6, 11, + 12); + G(_m[_blake2bSigma[round][12]], _m[_blake2bSigma[round][13]], 2, 7, 8, + 13); + G(_m[_blake2bSigma[round][14]], _m[_blake2bSigma[round][15]], 3, 4, 9, + 14); + } + + for (var offset = 0; offset < _chainValue!.length; ++offset) { + _chainValue![offset] + ..xor(_internalState[offset]) + ..xor(_internalState[offset + 8]); + } + } + + void G(Register64 m1, Register64 m2, int posA, int posB, int posC, int posD) { + // This variable is faster as a local. The allocation is probably sunk. + final r = Register64(); + + _internalState[posA].sumReg(r + ..set(_internalState[posB]) + ..sumReg(m1)); + _internalState[posD] + ..xor(_internalState[posA]) + ..rotr(32); + _internalState[posC].sumReg(_internalState[posD]); + _internalState[posB] + ..xor(_internalState[posC]) + ..rotr(24); + _internalState[posA].sumReg(r + ..set(_internalState[posB]) + ..sumReg(m2)); + _internalState[posD] + ..xor(_internalState[posA]) + ..rotr(16); + _internalState[posC].sumReg(_internalState[posD]); + _internalState[posB] + ..xor(_internalState[posC]) + ..rotr(63); + } + + @override + int get byteLength => 128; +} + +// Produced from the square root of primes 2, 3, 5, 7, 11, 13, 17, 19. +// The same as SHA-512 IV. +final _blake2bIV = Register64List.from([ + [0x6a09e667, 0xf3bcc908], + [0xbb67ae85, 0x84caa73b], + [0x3c6ef372, 0xfe94f82b], + [0xa54ff53a, 0x5f1d36f1], + [0x510e527f, 0xade682d1], + [0x9b05688c, 0x2b3e6c1f], + [0x1f83d9ab, 0xfb41bd6b], + [0x5be0cd19, 0x137e2179], +]); + +final _blake2bSigma = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], + [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], + [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], + [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], + [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], + [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], + [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], + [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], + [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], +]; diff --git a/pointycastle/lib/digests/cshake.dart b/pointycastle/lib/digests/cshake.dart new file mode 100644 index 0000000..98aa4e4 --- /dev/null +++ b/pointycastle/lib/digests/cshake.dart @@ -0,0 +1,114 @@ +// This file has been migrated. + +library impl.digest.cshake; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/digests/shake.dart'; +import 'package:pointycastle/digests/xof_utils.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart'; + +/// +/// implementation of SHAKE based on following KeccakNISTInterface.c from http://keccak.noekeon.org/ +/// +/// Following the naming conventions used in the C source code to enable easy review of the implementation. +/// +class CSHAKEDigest extends SHAKEDigest implements Xof { + static final RegExp _cshakeREGEX = RegExp(r'^CSHAKE-([0-9]+)$'); + + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig( + Digest, + _cshakeREGEX, + (_, final Match match) => () { + var bitLength = int.parse(match.group(1)!); + return CSHAKEDigest(bitLength); + }); + + Uint8List? _diff; + final _padding = Uint8List(100); + + CSHAKEDigest([int bitLength = 256, Uint8List? N, Uint8List? S]) { + switch (bitLength) { + case 128: + case 256: + init(bitLength); + if ((N == null || N.isEmpty) && (S == null || S.isEmpty)) { + _diff = null; + } else { + _diff = concatUint8List([ + XofUtils.leftEncode(rate ~/ 8), + _encodeString(N), + _encodeString(S) + ]); + _diffPadAndAbsorb(); + } + + break; + default: + throw StateError( + 'invalid bitLength ($bitLength) for CSHAKE must only be 128 or 256'); + } + } + + @override + String get algorithmName => 'CSHAKE-$fixedOutputLength'; + @override + int doOutput(Uint8List out, int outOff, int outLen) { + if (_diff != null) { + if (!squeezing) { + absorbBits(0x00, 2); + } + + squeeze(out, outOff, outLen * 8); + + return outLen; + } else { + return super.doOutput(out, outOff, outLen); + } + } + + @override + void update(Uint8List inp, int inpOff, int len) { + absorbRange(inp, inpOff, len); + } + + @override + void reset() { + super.reset(); + + if (_diff != null) { + _diffPadAndAbsorb(); + } + } + + // bytepad in SP 800-185 + void _diffPadAndAbsorb() { + var blockSize = rate ~/ 8; + absorbRange(_diff!, 0, _diff!.length); + + var delta = _diff!.length % blockSize; + + // only add padding if needed + if (delta != 0) { + var required = blockSize - delta; + + while (required > _padding.length) { + absorbRange(_padding, 0, _padding.length); + required -= _padding.length; + } + + absorbRange(_padding, 0, required); + } + } + + Uint8List _encodeString(Uint8List? str) { + if (str == null || str.isEmpty) { + return XofUtils.leftEncode(0); + } + + return concatUint8List([XofUtils.leftEncode(str.length * 8), str]); + } +} diff --git a/pointycastle/lib/digests/keccak.dart b/pointycastle/lib/digests/keccak.dart new file mode 100644 index 0000000..eac176c --- /dev/null +++ b/pointycastle/lib/digests/keccak.dart @@ -0,0 +1,49 @@ +// See file LICENSE for more information. + +library impl.digest.keccak; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/keccak_engine.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of Keccak digest. +class KeccakDigest extends KeccakEngine { + static final RegExp _keccakREGEX = RegExp(r'^Keccak\/([0-9]+)$'); + + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig( + Digest, + _keccakREGEX, + (_, final Match match) => () { + var bitLength = int.parse(match.group(1)!); + return KeccakDigest(bitLength); + }); + + KeccakDigest([int bitLength = 288]) { + switch (bitLength) { + case 128: + case 224: + case 256: + case 288: + case 384: + case 512: + init(bitLength); + break; + default: + throw StateError( + 'invalid bitLength ($bitLength) for Keccak must only be 128,224,256,288,384,512'); + } + } + + @override + String get algorithmName => 'Keccak/$fixedOutputLength'; + + @override + int doFinal(Uint8List out, int outOff) { + squeeze(out, outOff, fixedOutputLength); + reset(); + return digestSize; + } +} diff --git a/pointycastle/lib/digests/md2.dart b/pointycastle/lib/digests/md2.dart new file mode 100644 index 0000000..5fd73f1 --- /dev/null +++ b/pointycastle/lib/digests/md2.dart @@ -0,0 +1,397 @@ +// See file LICENSE for more information. + +library impl.digest.md2; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of MD2 as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992 +class MD2Digest extends BaseDigest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'MD2', () => MD2Digest()); + + static const _DIGEST_LENGTH = 16; + + /* X buffer */ + final _x = Uint8List(48); + int _xOff = 0; + + /* M buffer */ + final _m = Uint8List(16); + int _mOff = 0; + + /* check sum */ + final _c = Uint8List(16); + // ignore: unused_field + int _cOff = 0; + + @override + String get algorithmName => 'MD2'; + + @override + int get digestSize => _DIGEST_LENGTH; + + @override + void reset() { + _xOff = 0; + _x.fillRange(0, _x.length, 0); + + _mOff = 0; + _m.fillRange(0, _m.length, 0); + + _cOff = 0; + _c.fillRange(0, _c.length, 0); + } + + @override + void updateByte(int inp) { + _m[_mOff++] = inp; + + if (_mOff == 16) { + _processCheckSum(_m); + _processBlock(_m); + _mOff = 0; + } + } + + @override + void update(Uint8List inp, int inpOff, int len) { + // fill the current word + while ((_mOff != 0) && (len > 0)) { + updateByte(inp[inpOff]); + inpOff++; + len--; + } + + // process whole words. + while (len > 16) { + _m.setRange(0, 16, inp.sublist(inpOff)); + _processCheckSum(_m); + _processBlock(_m); + len -= 16; + inpOff += 16; + } + + // load in the remainder. + while (len > 0) { + updateByte(inp[inpOff]); + inpOff++; + len--; + } + } + + @override + int doFinal(Uint8List? out, int? outOff) { + // add padding + var paddingByte = _m.length - _mOff; + for (var i = _mOff; i < _m.length; i++) { + _m[i] = paddingByte; + } + + //do final check sum + _processCheckSum(_m); + + // do final block process + _processBlock(_m); + + _processBlock(_c); + + out!.setRange(outOff!, outOff + 16, _x.sublist(_xOff)); + + reset(); + + return _DIGEST_LENGTH; + } + + void _processBlock(Uint8List m) { + for (var i = 0; i < 16; i++) { + _x[i + 16] = m[i]; + _x[i + 32] = m[i] ^ _x[i]; + } + + // encrypt block + var t = 0; + + for (var j = 0; j < 18; j++) { + for (var k = 0; k < 48; k++) { + t = _x[k] ^= _s[t]; + t = t & 0xff; + } + t = (t + j) % 256; + } + } + + void _processCheckSum(Uint8List m) { + var L = _c[15]; + for (var i = 0; i < 16; i++) { + _c[i] ^= _s[(m[i] ^ L) & 0xff]; + L = _c[i]; + } + } + + // 256-byte random permutation constructed from the digits of PI + static final _s = [ + 41, + 46, + 67, + 201, + 162, + 216, + 124, + 1, + 61, + 54, + 84, + 161, + 236, + 240, + 6, + 19, + 98, + 167, + 5, + 243, + 192, + 199, + 115, + 140, + 152, + 147, + 43, + 217, + 188, + 76, + 130, + 202, + 30, + 155, + 87, + 60, + 253, + 212, + 224, + 22, + 103, + 66, + 111, + 24, + 138, + 23, + 229, + 18, + 190, + 78, + 196, + 214, + 218, + 158, + 222, + 73, + 160, + 251, + 245, + 142, + 187, + 47, + 238, + 122, + 169, + 104, + 121, + 145, + 21, + 178, + 7, + 63, + 148, + 194, + 16, + 137, + 11, + 34, + 95, + 33, + 128, + 127, + 93, + 154, + 90, + 144, + 50, + 39, + 53, + 62, + 204, + 231, + 191, + 247, + 151, + 3, + 255, + 25, + 48, + 179, + 72, + 165, + 181, + 209, + 215, + 94, + 146, + 42, + 172, + 86, + 170, + 198, + 79, + 184, + 56, + 210, + 150, + 164, + 125, + 182, + 118, + 252, + 107, + 226, + 156, + 116, + 4, + 241, + 69, + 157, + 112, + 89, + 100, + 113, + 135, + 32, + 134, + 91, + 207, + 101, + 230, + 45, + 168, + 2, + 27, + 96, + 37, + 173, + 174, + 176, + 185, + 246, + 28, + 70, + 97, + 105, + 52, + 64, + 126, + 15, + 85, + 71, + 163, + 35, + 221, + 81, + 175, + 58, + 195, + 92, + 249, + 206, + 186, + 197, + 234, + 38, + 44, + 83, + 13, + 110, + 133, + 40, + 132, + 9, + 211, + 223, + 205, + 244, + 65, + 129, + 77, + 82, + 106, + 220, + 55, + 200, + 108, + 193, + 171, + 250, + 36, + 225, + 123, + 8, + 12, + 189, + 177, + 74, + 120, + 136, + 149, + 139, + 227, + 99, + 232, + 109, + 233, + 203, + 213, + 254, + 59, + 0, + 29, + 57, + 242, + 239, + 183, + 14, + 102, + 88, + 208, + 228, + 166, + 119, + 114, + 248, + 235, + 117, + 75, + 10, + 49, + 68, + 80, + 180, + 143, + 237, + 31, + 26, + 219, + 153, + 141, + 51, + 159, + 17, + 131, + 20 + ]; + + @override + int get byteLength => 16; +} diff --git a/pointycastle/lib/digests/md4.dart b/pointycastle/lib/digests/md4.dart new file mode 100644 index 0000000..18e80c0 --- /dev/null +++ b/pointycastle/lib/digests/md4.dart @@ -0,0 +1,128 @@ +// See file LICENSE for more information. + +library impl.digest.md4; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of MD4 digest +class MD4Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'MD4', () => MD4Digest()); + + static const _DIGEST_LENGTH = 16; + + MD4Digest() : super(Endian.little, 4, 16); + + @override + final algorithmName = 'MD4'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + } + + @override + void processBlock() { + var a = state[0]; + var b = state[1]; + var c = state[2]; + var d = state[3]; + + // Round 1 - F cycle, 16 times. + a = crotl32(a + _f(b, c, d) + buffer[0], _S11); + d = crotl32(d + _f(a, b, c) + buffer[1], _S12); + c = crotl32(c + _f(d, a, b) + buffer[2], _S13); + b = crotl32(b + _f(c, d, a) + buffer[3], _S14); + a = crotl32(a + _f(b, c, d) + buffer[4], _S11); + d = crotl32(d + _f(a, b, c) + buffer[5], _S12); + c = crotl32(c + _f(d, a, b) + buffer[6], _S13); + b = crotl32(b + _f(c, d, a) + buffer[7], _S14); + a = crotl32(a + _f(b, c, d) + buffer[8], _S11); + d = crotl32(d + _f(a, b, c) + buffer[9], _S12); + c = crotl32(c + _f(d, a, b) + buffer[10], _S13); + b = crotl32(b + _f(c, d, a) + buffer[11], _S14); + a = crotl32(a + _f(b, c, d) + buffer[12], _S11); + d = crotl32(d + _f(a, b, c) + buffer[13], _S12); + c = crotl32(c + _f(d, a, b) + buffer[14], _S13); + b = crotl32(b + _f(c, d, a) + buffer[15], _S14); + + // Round 2 - G cycle, 16 times. + a = crotl32(a + _g(b, c, d) + buffer[0] + 0x5a827999, _S21); + d = crotl32(d + _g(a, b, c) + buffer[4] + 0x5a827999, _S22); + c = crotl32(c + _g(d, a, b) + buffer[8] + 0x5a827999, _S23); + b = crotl32(b + _g(c, d, a) + buffer[12] + 0x5a827999, _S24); + a = crotl32(a + _g(b, c, d) + buffer[1] + 0x5a827999, _S21); + d = crotl32(d + _g(a, b, c) + buffer[5] + 0x5a827999, _S22); + c = crotl32(c + _g(d, a, b) + buffer[9] + 0x5a827999, _S23); + b = crotl32(b + _g(c, d, a) + buffer[13] + 0x5a827999, _S24); + a = crotl32(a + _g(b, c, d) + buffer[2] + 0x5a827999, _S21); + d = crotl32(d + _g(a, b, c) + buffer[6] + 0x5a827999, _S22); + c = crotl32(c + _g(d, a, b) + buffer[10] + 0x5a827999, _S23); + b = crotl32(b + _g(c, d, a) + buffer[14] + 0x5a827999, _S24); + a = crotl32(a + _g(b, c, d) + buffer[3] + 0x5a827999, _S21); + d = crotl32(d + _g(a, b, c) + buffer[7] + 0x5a827999, _S22); + c = crotl32(c + _g(d, a, b) + buffer[11] + 0x5a827999, _S23); + b = crotl32(b + _g(c, d, a) + buffer[15] + 0x5a827999, _S24); + + // Round 3 - H cycle, 16 times. + a = crotl32(a + _h(b, c, d) + buffer[0] + 0x6ed9eba1, _S31); + d = crotl32(d + _h(a, b, c) + buffer[8] + 0x6ed9eba1, _S32); + c = crotl32(c + _h(d, a, b) + buffer[4] + 0x6ed9eba1, _S33); + b = crotl32(b + _h(c, d, a) + buffer[12] + 0x6ed9eba1, _S34); + a = crotl32(a + _h(b, c, d) + buffer[2] + 0x6ed9eba1, _S31); + d = crotl32(d + _h(a, b, c) + buffer[10] + 0x6ed9eba1, _S32); + c = crotl32(c + _h(d, a, b) + buffer[6] + 0x6ed9eba1, _S33); + b = crotl32(b + _h(c, d, a) + buffer[14] + 0x6ed9eba1, _S34); + a = crotl32(a + _h(b, c, d) + buffer[1] + 0x6ed9eba1, _S31); + d = crotl32(d + _h(a, b, c) + buffer[9] + 0x6ed9eba1, _S32); + c = crotl32(c + _h(d, a, b) + buffer[5] + 0x6ed9eba1, _S33); + b = crotl32(b + _h(c, d, a) + buffer[13] + 0x6ed9eba1, _S34); + a = crotl32(a + _h(b, c, d) + buffer[3] + 0x6ed9eba1, _S31); + d = crotl32(d + _h(a, b, c) + buffer[11] + 0x6ed9eba1, _S32); + c = crotl32(c + _h(d, a, b) + buffer[7] + 0x6ed9eba1, _S33); + b = crotl32(b + _h(c, d, a) + buffer[15] + 0x6ed9eba1, _S34); + + state[0] = clip32(state[0] + a); + state[1] = clip32(state[1] + b); + state[2] = clip32(state[2] + c); + state[3] = clip32(state[3] + d); + } + + // round 1 left rotates + static const _S11 = 3; + static const _S12 = 7; + static const _S13 = 11; + static const _S14 = 19; + + // round 2 left rotates + static const _S21 = 3; + static const _S22 = 5; + static const _S23 = 9; + static const _S24 = 13; + + // round 3 left rotates + static const _S31 = 3; + static const _S32 = 9; + static const _S33 = 11; + static const _S34 = 15; + + // F, G and H are the basic MD4 functions. + int _f(int u, int v, int w) => (u & v) | (not32(u) & w); + + int _g(int u, int v, int w) => (u & v) | (u & w) | (v & w); + + int _h(int u, int v, int w) => u ^ v ^ w; + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/md5.dart b/pointycastle/lib/digests/md5.dart new file mode 100644 index 0000000..0a14c3f --- /dev/null +++ b/pointycastle/lib/digests/md5.dart @@ -0,0 +1,153 @@ +// See file LICENSE for more information. + +library impl.digest.md5; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of MD5 digest +class MD5Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'MD5', () => MD5Digest()); + + static const _DIGEST_LENGTH = 16; + + MD5Digest() : super(Endian.little, 4, 16); + + @override + final algorithmName = 'MD5'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + } + + @override + void processBlock() { + var a = state[0]; + var b = state[1]; + var c = state[2]; + var d = state[3]; + + // Round 1 - F cycle, 16 times. + a = sum32(crotl32(a + _f(b, c, d) + buffer[0] + 0xd76aa478, _S11), b); + d = sum32(crotl32(d + _f(a, b, c) + buffer[1] + 0xe8c7b756, _S12), a); + c = sum32(crotl32(c + _f(d, a, b) + buffer[2] + 0x242070db, _S13), d); + b = sum32(crotl32(b + _f(c, d, a) + buffer[3] + 0xc1bdceee, _S14), c); + a = sum32(crotl32(a + _f(b, c, d) + buffer[4] + 0xf57c0faf, _S11), b); + d = sum32(crotl32(d + _f(a, b, c) + buffer[5] + 0x4787c62a, _S12), a); + c = sum32(crotl32(c + _f(d, a, b) + buffer[6] + 0xa8304613, _S13), d); + b = sum32(crotl32(b + _f(c, d, a) + buffer[7] + 0xfd469501, _S14), c); + a = sum32(crotl32(a + _f(b, c, d) + buffer[8] + 0x698098d8, _S11), b); + d = sum32(crotl32(d + _f(a, b, c) + buffer[9] + 0x8b44f7af, _S12), a); + c = sum32(crotl32(c + _f(d, a, b) + buffer[10] + 0xffff5bb1, _S13), d); + b = sum32(crotl32(b + _f(c, d, a) + buffer[11] + 0x895cd7be, _S14), c); + a = sum32(crotl32(a + _f(b, c, d) + buffer[12] + 0x6b901122, _S11), b); + d = sum32(crotl32(d + _f(a, b, c) + buffer[13] + 0xfd987193, _S12), a); + c = sum32(crotl32(c + _f(d, a, b) + buffer[14] + 0xa679438e, _S13), d); + b = sum32(crotl32(b + _f(c, d, a) + buffer[15] + 0x49b40821, _S14), c); + + // Round 2 - G cycle, 16 time_S. + a = sum32(crotl32(a + _g(b, c, d) + buffer[1] + 0xf61e2562, _S21), b); + d = sum32(crotl32(d + _g(a, b, c) + buffer[6] + 0xc040b340, _S22), a); + c = sum32(crotl32(c + _g(d, a, b) + buffer[11] + 0x265e5a51, _S23), d); + b = sum32(crotl32(b + _g(c, d, a) + buffer[0] + 0xe9b6c7aa, _S24), c); + a = sum32(crotl32(a + _g(b, c, d) + buffer[5] + 0xd62f105d, _S21), b); + d = sum32(crotl32(d + _g(a, b, c) + buffer[10] + 0x02441453, _S22), a); + c = sum32(crotl32(c + _g(d, a, b) + buffer[15] + 0xd8a1e681, _S23), d); + b = sum32(crotl32(b + _g(c, d, a) + buffer[4] + 0xe7d3fbc8, _S24), c); + a = sum32(crotl32(a + _g(b, c, d) + buffer[9] + 0x21e1cde6, _S21), b); + d = sum32(crotl32(d + _g(a, b, c) + buffer[14] + 0xc33707d6, _S22), a); + c = sum32(crotl32(c + _g(d, a, b) + buffer[3] + 0xf4d50d87, _S23), d); + b = sum32(crotl32(b + _g(c, d, a) + buffer[8] + 0x455a14ed, _S24), c); + a = sum32(crotl32(a + _g(b, c, d) + buffer[13] + 0xa9e3e905, _S21), b); + d = sum32(crotl32(d + _g(a, b, c) + buffer[2] + 0xfcefa3f8, _S22), a); + c = sum32(crotl32(c + _g(d, a, b) + buffer[7] + 0x676f02d9, _S23), d); + b = sum32(crotl32(b + _g(c, d, a) + buffer[12] + 0x8d2a4c8a, _S24), c); + + // Round 3 - H cycle, 16 time_S. + a = sum32(crotl32(a + _h(b, c, d) + buffer[5] + 0xfffa3942, _S31), b); + d = sum32(crotl32(d + _h(a, b, c) + buffer[8] + 0x8771f681, _S32), a); + c = sum32(crotl32(c + _h(d, a, b) + buffer[11] + 0x6d9d6122, _S33), d); + b = sum32(crotl32(b + _h(c, d, a) + buffer[14] + 0xfde5380c, _S34), c); + a = sum32(crotl32(a + _h(b, c, d) + buffer[1] + 0xa4beea44, _S31), b); + d = sum32(crotl32(d + _h(a, b, c) + buffer[4] + 0x4bdecfa9, _S32), a); + c = sum32(crotl32(c + _h(d, a, b) + buffer[7] + 0xf6bb4b60, _S33), d); + b = sum32(crotl32(b + _h(c, d, a) + buffer[10] + 0xbebfbc70, _S34), c); + a = sum32(crotl32(a + _h(b, c, d) + buffer[13] + 0x289b7ec6, _S31), b); + d = sum32(crotl32(d + _h(a, b, c) + buffer[0] + 0xeaa127fa, _S32), a); + c = sum32(crotl32(c + _h(d, a, b) + buffer[3] + 0xd4ef3085, _S33), d); + b = sum32(crotl32(b + _h(c, d, a) + buffer[6] + 0x04881d05, _S34), c); + a = sum32(crotl32(a + _h(b, c, d) + buffer[9] + 0xd9d4d039, _S31), b); + d = sum32(crotl32(d + _h(a, b, c) + buffer[12] + 0xe6db99e5, _S32), a); + c = sum32(crotl32(c + _h(d, a, b) + buffer[15] + 0x1fa27cf8, _S33), d); + b = sum32(crotl32(b + _h(c, d, a) + buffer[2] + 0xc4ac5665, _S34), c); + + // Round 4 - K cycle, 16 time_S. + a = sum32(crotl32(a + _k(b, c, d) + buffer[0] + 0xf4292244, _S41), b); + d = sum32(crotl32(d + _k(a, b, c) + buffer[7] + 0x432aff97, _S42), a); + c = sum32(crotl32(c + _k(d, a, b) + buffer[14] + 0xab9423a7, _S43), d); + b = sum32(crotl32(b + _k(c, d, a) + buffer[5] + 0xfc93a039, _S44), c); + a = sum32(crotl32(a + _k(b, c, d) + buffer[12] + 0x655b59c3, _S41), b); + d = sum32(crotl32(d + _k(a, b, c) + buffer[3] + 0x8f0ccc92, _S42), a); + c = sum32(crotl32(c + _k(d, a, b) + buffer[10] + 0xffeff47d, _S43), d); + b = sum32(crotl32(b + _k(c, d, a) + buffer[1] + 0x85845dd1, _S44), c); + a = sum32(crotl32(a + _k(b, c, d) + buffer[8] + 0x6fa87e4f, _S41), b); + d = sum32(crotl32(d + _k(a, b, c) + buffer[15] + 0xfe2ce6e0, _S42), a); + c = sum32(crotl32(c + _k(d, a, b) + buffer[6] + 0xa3014314, _S43), d); + b = sum32(crotl32(b + _k(c, d, a) + buffer[13] + 0x4e0811a1, _S44), c); + a = sum32(crotl32(a + _k(b, c, d) + buffer[4] + 0xf7537e82, _S41), b); + d = sum32(crotl32(d + _k(a, b, c) + buffer[11] + 0xbd3af235, _S42), a); + c = sum32(crotl32(c + _k(d, a, b) + buffer[2] + 0x2ad7d2bb, _S43), d); + b = sum32(crotl32(b + _k(c, d, a) + buffer[9] + 0xeb86d391, _S44), c); + + state[0] = clip32(state[0] + a); + state[1] = clip32(state[1] + b); + state[2] = clip32(state[2] + c); + state[3] = clip32(state[3] + d); + } + + // round 1 left rotates + static const _S11 = 7; + static const _S12 = 12; + static const _S13 = 17; + static const _S14 = 22; + + // round 2 left rotates + static const _S21 = 5; + static const _S22 = 9; + static const _S23 = 14; + static const _S24 = 20; + + // round 3 left rotates + static const _S31 = 4; + static const _S32 = 11; + static const _S33 = 16; + static const _S34 = 23; + + // round 4 left rotates + static const _S41 = 6; + static const _S42 = 10; + static const _S43 = 15; + static const _S44 = 21; + + int _f(int u, int v, int w) => (u & v) | (not32(u) & w); + + int _g(int u, int v, int w) => (u & w) | (v & not32(w)); + + int _h(int u, int v, int w) => u ^ v ^ w; + + int _k(int u, int v, int w) => v ^ (u | not32(w)); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/ripemd128.dart b/pointycastle/lib/digests/ripemd128.dart new file mode 100644 index 0000000..2b98944 --- /dev/null +++ b/pointycastle/lib/digests/ripemd128.dart @@ -0,0 +1,232 @@ +// See file LICENSE for more information. + +library impl.digest.ripemd128; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of RIPEMD-128 digest +class RIPEMD128Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'RIPEMD-128', () => RIPEMD128Digest()); + + static const _DIGEST_LENGTH = 16; + + RIPEMD128Digest() : super(Endian.little, 4, 16); + + @override + final algorithmName = 'RIPEMD-128'; + + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + } + + @override + void processBlock() { + int? a, aa; + int? b, bb; + int? c, cc; + int? d, dd; + + a = aa = state[0]; + b = bb = state[1]; + c = cc = state[2]; + d = dd = state[3]; + + // Round 1 + a = _f1(a, b, c, d, buffer[0], 11); + d = _f1(d, a, b, c, buffer[1], 14); + c = _f1(c, d, a, b, buffer[2], 15); + b = _f1(b, c, d, a, buffer[3], 12); + a = _f1(a, b, c, d, buffer[4], 5); + d = _f1(d, a, b, c, buffer[5], 8); + c = _f1(c, d, a, b, buffer[6], 7); + b = _f1(b, c, d, a, buffer[7], 9); + a = _f1(a, b, c, d, buffer[8], 11); + d = _f1(d, a, b, c, buffer[9], 13); + c = _f1(c, d, a, b, buffer[10], 14); + b = _f1(b, c, d, a, buffer[11], 15); + a = _f1(a, b, c, d, buffer[12], 6); + d = _f1(d, a, b, c, buffer[13], 7); + c = _f1(c, d, a, b, buffer[14], 9); + b = _f1(b, c, d, a, buffer[15], 8); + + // Round 2 + a = _f2(a, b, c, d, buffer[7], 7); + d = _f2(d, a, b, c, buffer[4], 6); + c = _f2(c, d, a, b, buffer[13], 8); + b = _f2(b, c, d, a, buffer[1], 13); + a = _f2(a, b, c, d, buffer[10], 11); + d = _f2(d, a, b, c, buffer[6], 9); + c = _f2(c, d, a, b, buffer[15], 7); + b = _f2(b, c, d, a, buffer[3], 15); + a = _f2(a, b, c, d, buffer[12], 7); + d = _f2(d, a, b, c, buffer[0], 12); + c = _f2(c, d, a, b, buffer[9], 15); + b = _f2(b, c, d, a, buffer[5], 9); + a = _f2(a, b, c, d, buffer[2], 11); + d = _f2(d, a, b, c, buffer[14], 7); + c = _f2(c, d, a, b, buffer[11], 13); + b = _f2(b, c, d, a, buffer[8], 12); + + // Round 3 + a = _f3(a, b, c, d, buffer[3], 11); + d = _f3(d, a, b, c, buffer[10], 13); + c = _f3(c, d, a, b, buffer[14], 6); + b = _f3(b, c, d, a, buffer[4], 7); + a = _f3(a, b, c, d, buffer[9], 14); + d = _f3(d, a, b, c, buffer[15], 9); + c = _f3(c, d, a, b, buffer[8], 13); + b = _f3(b, c, d, a, buffer[1], 15); + a = _f3(a, b, c, d, buffer[2], 14); + d = _f3(d, a, b, c, buffer[7], 8); + c = _f3(c, d, a, b, buffer[0], 13); + b = _f3(b, c, d, a, buffer[6], 6); + a = _f3(a, b, c, d, buffer[13], 5); + d = _f3(d, a, b, c, buffer[11], 12); + c = _f3(c, d, a, b, buffer[5], 7); + b = _f3(b, c, d, a, buffer[12], 5); + + // Round 4 + a = _f4(a, b, c, d, buffer[1], 11); + d = _f4(d, a, b, c, buffer[9], 12); + c = _f4(c, d, a, b, buffer[11], 14); + b = _f4(b, c, d, a, buffer[10], 15); + a = _f4(a, b, c, d, buffer[0], 14); + d = _f4(d, a, b, c, buffer[8], 15); + c = _f4(c, d, a, b, buffer[12], 9); + b = _f4(b, c, d, a, buffer[4], 8); + a = _f4(a, b, c, d, buffer[13], 9); + d = _f4(d, a, b, c, buffer[3], 14); + c = _f4(c, d, a, b, buffer[7], 5); + b = _f4(b, c, d, a, buffer[15], 6); + a = _f4(a, b, c, d, buffer[14], 8); + d = _f4(d, a, b, c, buffer[5], 6); + c = _f4(c, d, a, b, buffer[6], 5); + b = _f4(b, c, d, a, buffer[2], 12); + + // Parallel round 1 + aa = _ff4(aa, bb, cc, dd, buffer[5], 8); + dd = _ff4(dd, aa, bb, cc, buffer[14], 9); + cc = _ff4(cc, dd, aa, bb, buffer[7], 9); + bb = _ff4(bb, cc, dd, aa, buffer[0], 11); + aa = _ff4(aa, bb, cc, dd, buffer[9], 13); + dd = _ff4(dd, aa, bb, cc, buffer[2], 15); + cc = _ff4(cc, dd, aa, bb, buffer[11], 15); + bb = _ff4(bb, cc, dd, aa, buffer[4], 5); + aa = _ff4(aa, bb, cc, dd, buffer[13], 7); + dd = _ff4(dd, aa, bb, cc, buffer[6], 7); + cc = _ff4(cc, dd, aa, bb, buffer[15], 8); + bb = _ff4(bb, cc, dd, aa, buffer[8], 11); + aa = _ff4(aa, bb, cc, dd, buffer[1], 14); + dd = _ff4(dd, aa, bb, cc, buffer[10], 14); + cc = _ff4(cc, dd, aa, bb, buffer[3], 12); + bb = _ff4(bb, cc, dd, aa, buffer[12], 6); + + // Parallel round 2 + aa = _ff3(aa, bb, cc, dd, buffer[6], 9); + dd = _ff3(dd, aa, bb, cc, buffer[11], 13); + cc = _ff3(cc, dd, aa, bb, buffer[3], 15); + bb = _ff3(bb, cc, dd, aa, buffer[7], 7); + aa = _ff3(aa, bb, cc, dd, buffer[0], 12); + dd = _ff3(dd, aa, bb, cc, buffer[13], 8); + cc = _ff3(cc, dd, aa, bb, buffer[5], 9); + bb = _ff3(bb, cc, dd, aa, buffer[10], 11); + aa = _ff3(aa, bb, cc, dd, buffer[14], 7); + dd = _ff3(dd, aa, bb, cc, buffer[15], 7); + cc = _ff3(cc, dd, aa, bb, buffer[8], 12); + bb = _ff3(bb, cc, dd, aa, buffer[12], 7); + aa = _ff3(aa, bb, cc, dd, buffer[4], 6); + dd = _ff3(dd, aa, bb, cc, buffer[9], 15); + cc = _ff3(cc, dd, aa, bb, buffer[1], 13); + bb = _ff3(bb, cc, dd, aa, buffer[2], 11); + + // Parallel round 3 + aa = _ff2(aa, bb, cc, dd, buffer[15], 9); + dd = _ff2(dd, aa, bb, cc, buffer[5], 7); + cc = _ff2(cc, dd, aa, bb, buffer[1], 15); + bb = _ff2(bb, cc, dd, aa, buffer[3], 11); + aa = _ff2(aa, bb, cc, dd, buffer[7], 8); + dd = _ff2(dd, aa, bb, cc, buffer[14], 6); + cc = _ff2(cc, dd, aa, bb, buffer[6], 6); + bb = _ff2(bb, cc, dd, aa, buffer[9], 14); + aa = _ff2(aa, bb, cc, dd, buffer[11], 12); + dd = _ff2(dd, aa, bb, cc, buffer[8], 13); + cc = _ff2(cc, dd, aa, bb, buffer[12], 5); + bb = _ff2(bb, cc, dd, aa, buffer[2], 14); + aa = _ff2(aa, bb, cc, dd, buffer[10], 13); + dd = _ff2(dd, aa, bb, cc, buffer[0], 13); + cc = _ff2(cc, dd, aa, bb, buffer[4], 7); + bb = _ff2(bb, cc, dd, aa, buffer[13], 5); + + // Parallel round 4 + aa = _ff1(aa, bb, cc, dd, buffer[8], 15); + dd = _ff1(dd, aa, bb, cc, buffer[6], 5); + cc = _ff1(cc, dd, aa, bb, buffer[4], 8); + bb = _ff1(bb, cc, dd, aa, buffer[1], 11); + aa = _ff1(aa, bb, cc, dd, buffer[3], 14); + dd = _ff1(dd, aa, bb, cc, buffer[11], 14); + cc = _ff1(cc, dd, aa, bb, buffer[15], 6); + bb = _ff1(bb, cc, dd, aa, buffer[0], 14); + aa = _ff1(aa, bb, cc, dd, buffer[5], 6); + dd = _ff1(dd, aa, bb, cc, buffer[12], 9); + cc = _ff1(cc, dd, aa, bb, buffer[2], 12); + bb = _ff1(bb, cc, dd, aa, buffer[13], 9); + aa = _ff1(aa, bb, cc, dd, buffer[9], 12); + dd = _ff1(dd, aa, bb, cc, buffer[7], 5); + cc = _ff1(cc, dd, aa, bb, buffer[10], 15); + bb = _ff1(bb, cc, dd, aa, buffer[14], 8); + + dd = clip32(dd + c + state[1]); + state[1] = clip32(state[2] + d + aa); + state[2] = clip32(state[3] + a + bb); + state[3] = clip32(state[0] + b + cc); + state[0] = dd; + } + + int _function1(int x, int y, int z) => x ^ y ^ z; + + int _function2(int x, int y, int z) => (x & y) | (~x & z); + + int _function3(int x, int y, int z) => (x | ~y) ^ z; + + int _function4(int x, int y, int z) => (x & z) | (y & ~z); + + int _f1(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function1(b, c, d) + x, s); + + int _f2(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function2(b, c, d) + x + 0x5a827999, s); + + int _f3(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function3(b, c, d) + x + 0x6ed9eba1, s); + + int _f4(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function4(b, c, d) + x + 0x8f1bbcdc, s); + + int _ff1(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function1(b, c, d) + x, s); + + int _ff2(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function2(b, c, d) + x + 0x6d703ef3, s); + + int _ff3(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function3(b, c, d) + x + 0x5c4dd124, s); + + int _ff4(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function4(b, c, d) + x + 0x50a28be6, s); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/ripemd160.dart b/pointycastle/lib/digests/ripemd160.dart new file mode 100644 index 0000000..1384caf --- /dev/null +++ b/pointycastle/lib/digests/ripemd160.dart @@ -0,0 +1,415 @@ +// See file LICENSE for more information. + +library impl.digest.ripemd160; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of RIPEMD-160 digest. +class RIPEMD160Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'RIPEMD-160', () => RIPEMD160Digest()); + + static const _DIGEST_LENGTH = 20; + + RIPEMD160Digest() : super(Endian.little, 5, 16); + + @override + final algorithmName = 'RIPEMD-160'; + + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + state[4] = 0xc3d2e1f0; + } + + @override + void processBlock() { + int? a, aa; + int? b, bb; + int? c, cc; + int? d, dd; + int? e, ee; + + a = aa = state[0]; + b = bb = state[1]; + c = cc = state[2]; + d = dd = state[3]; + e = ee = state[4]; + + // Rounds 1 - 16 + // left + a = sum32(crotl32(a + _f1(b, c, d) + buffer[0], 11), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[1], 14), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[2], 15), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[3], 12), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[4], 5), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[5], 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[6], 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[7], 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[8], 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[9], 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[10], 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[11], 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[12], 6), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[13], 7), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[14], 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[15], 8), e); + c = rotl32(c, 10); + + // right + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[5] + 0x50a28be6, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[14] + 0x50a28be6, 9), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[7] + 0x50a28be6, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[0] + 0x50a28be6, 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[9] + 0x50a28be6, 13), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[2] + 0x50a28be6, 15), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[11] + 0x50a28be6, 15), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[4] + 0x50a28be6, 5), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[13] + 0x50a28be6, 7), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[6] + 0x50a28be6, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[15] + 0x50a28be6, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[8] + 0x50a28be6, 11), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[1] + 0x50a28be6, 14), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[10] + 0x50a28be6, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[3] + 0x50a28be6, 12), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[12] + 0x50a28be6, 6), ee); + cc = rotl32(cc, 10); + + // Rounds 16-31 + // left + e = sum32(crotl32(e + _f2(a, b, c) + buffer[7] + 0x5a827999, 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[4] + 0x5a827999, 6), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[13] + 0x5a827999, 8), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[1] + 0x5a827999, 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[10] + 0x5a827999, 11), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[6] + 0x5a827999, 9), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[15] + 0x5a827999, 7), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[3] + 0x5a827999, 15), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[12] + 0x5a827999, 7), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[0] + 0x5a827999, 12), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[9] + 0x5a827999, 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[5] + 0x5a827999, 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[2] + 0x5a827999, 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[14] + 0x5a827999, 7), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[11] + 0x5a827999, 13), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[8] + 0x5a827999, 12), d); + b = rotl32(b, 10); + + // right + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[6] + 0x5c4dd124, 9), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[11] + 0x5c4dd124, 13), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[3] + 0x5c4dd124, 15), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[7] + 0x5c4dd124, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[0] + 0x5c4dd124, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[13] + 0x5c4dd124, 8), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[5] + 0x5c4dd124, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[10] + 0x5c4dd124, 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[14] + 0x5c4dd124, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[15] + 0x5c4dd124, 7), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[8] + 0x5c4dd124, 12), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[12] + 0x5c4dd124, 7), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[4] + 0x5c4dd124, 6), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[9] + 0x5c4dd124, 15), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[1] + 0x5c4dd124, 13), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[2] + 0x5c4dd124, 11), dd); + bb = rotl32(bb, 10); + + // Rounds 32-47 + // left + d = sum32(crotl32(d + _f3(e, a, b) + buffer[3] + 0x6ed9eba1, 11), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[10] + 0x6ed9eba1, 13), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[14] + 0x6ed9eba1, 6), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[4] + 0x6ed9eba1, 7), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[9] + 0x6ed9eba1, 14), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[15] + 0x6ed9eba1, 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[8] + 0x6ed9eba1, 13), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[1] + 0x6ed9eba1, 15), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[2] + 0x6ed9eba1, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[7] + 0x6ed9eba1, 8), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[0] + 0x6ed9eba1, 13), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[6] + 0x6ed9eba1, 6), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[13] + 0x6ed9eba1, 5), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[11] + 0x6ed9eba1, 12), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[5] + 0x6ed9eba1, 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[12] + 0x6ed9eba1, 5), c); + a = rotl32(a, 10); + + // right + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[15] + 0x6d703ef3, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[5] + 0x6d703ef3, 7), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[1] + 0x6d703ef3, 15), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[3] + 0x6d703ef3, 11), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[7] + 0x6d703ef3, 8), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[14] + 0x6d703ef3, 6), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[6] + 0x6d703ef3, 6), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[9] + 0x6d703ef3, 14), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[11] + 0x6d703ef3, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[8] + 0x6d703ef3, 13), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[12] + 0x6d703ef3, 5), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[2] + 0x6d703ef3, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[10] + 0x6d703ef3, 13), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[0] + 0x6d703ef3, 13), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[4] + 0x6d703ef3, 7), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[13] + 0x6d703ef3, 5), cc); + aa = rotl32(aa, 10); + + // Rounds 48-63 + // left + c = sum32(crotl32(c + _f4(d, e, a) + buffer[1] + 0x8f1bbcdc, 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[9] + 0x8f1bbcdc, 12), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[11] + 0x8f1bbcdc, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[10] + 0x8f1bbcdc, 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[0] + 0x8f1bbcdc, 14), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[8] + 0x8f1bbcdc, 15), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[12] + 0x8f1bbcdc, 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[4] + 0x8f1bbcdc, 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[13] + 0x8f1bbcdc, 9), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[3] + 0x8f1bbcdc, 14), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[7] + 0x8f1bbcdc, 5), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[15] + 0x8f1bbcdc, 6), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[14] + 0x8f1bbcdc, 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[5] + 0x8f1bbcdc, 6), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[6] + 0x8f1bbcdc, 5), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[2] + 0x8f1bbcdc, 12), b); + e = rotl32(e, 10); + + // right + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[8] + 0x7a6d76e9, 15), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[6] + 0x7a6d76e9, 5), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[4] + 0x7a6d76e9, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[1] + 0x7a6d76e9, 11), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[3] + 0x7a6d76e9, 14), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[11] + 0x7a6d76e9, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[15] + 0x7a6d76e9, 6), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[0] + 0x7a6d76e9, 14), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[5] + 0x7a6d76e9, 6), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[12] + 0x7a6d76e9, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[2] + 0x7a6d76e9, 12), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[13] + 0x7a6d76e9, 9), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[9] + 0x7a6d76e9, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[7] + 0x7a6d76e9, 5), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[10] + 0x7a6d76e9, 15), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[14] + 0x7a6d76e9, 8), bb); + ee = rotl32(ee, 10); + + // Rounds 64-79 + // left + b = sum32(crotl32(b + _f5(c, d, e) + buffer[4] + 0xa953fd4e, 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[0] + 0xa953fd4e, 15), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[5] + 0xa953fd4e, 5), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[9] + 0xa953fd4e, 11), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[7] + 0xa953fd4e, 6), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[12] + 0xa953fd4e, 8), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[2] + 0xa953fd4e, 13), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[10] + 0xa953fd4e, 12), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[14] + 0xa953fd4e, 5), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[1] + 0xa953fd4e, 12), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[3] + 0xa953fd4e, 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[8] + 0xa953fd4e, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[11] + 0xa953fd4e, 11), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[6] + 0xa953fd4e, 8), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[15] + 0xa953fd4e, 5), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[13] + 0xa953fd4e, 6), a); + d = rotl32(d, 10); + + // right + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[12], 8), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[15], 5), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[10], 12), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[4], 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[1], 12), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[5], 5), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[8], 14), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[7], 6), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[6], 8), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[2], 13), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[13], 6), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[14], 5), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[0], 15), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[3], 13), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[9], 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[11], 11), aa); + dd = rotl32(dd, 10); + + dd = clip32(dd + c + state[1]); + state[1] = clip32(state[2] + d + ee); + state[2] = clip32(state[3] + e + aa); + state[3] = clip32(state[4] + a + bb); + state[4] = clip32(state[0] + b + cc); + state[0] = dd; + } + + int _f1(int x, int y, int z) => x ^ y ^ z; + + int _f2(int x, int y, int z) => (x & y) | (~x & z); + + int _f3(int x, int y, int z) => (x | ~y) ^ z; + + int _f4(int x, int y, int z) => (x & z) | (y & ~z); + + int _f5(int x, int y, int z) => x ^ (y | ~z); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/ripemd256.dart b/pointycastle/lib/digests/ripemd256.dart new file mode 100644 index 0000000..8e4722e --- /dev/null +++ b/pointycastle/lib/digests/ripemd256.dart @@ -0,0 +1,256 @@ +// See file LICENSE for more information. + +library impl.digest.ripemd256; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of RIPEMD-256 digest. +class RIPEMD256Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'RIPEMD-256', () => RIPEMD256Digest()); + + static const _DIGEST_LENGTH = 32; + + RIPEMD256Digest() : super(Endian.little, 8, 16); + + @override + final algorithmName = 'RIPEMD-256'; + + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + state[4] = 0x76543210; + state[5] = 0xFEDCBA98; + state[6] = 0x89ABCDEF; + state[7] = 0x01234567; + } + + @override + void processBlock() { + int? a, aa; + int? b, bb; + int? c, cc; + int? d, dd; + int t; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + aa = state[4]; + bb = state[5]; + cc = state[6]; + dd = state[7]; + + // Round 1 + a = _f1(a, b, c, d, buffer[0], 11); + d = _f1(d, a, b, c, buffer[1], 14); + c = _f1(c, d, a, b, buffer[2], 15); + b = _f1(b, c, d, a, buffer[3], 12); + a = _f1(a, b, c, d, buffer[4], 5); + d = _f1(d, a, b, c, buffer[5], 8); + c = _f1(c, d, a, b, buffer[6], 7); + b = _f1(b, c, d, a, buffer[7], 9); + a = _f1(a, b, c, d, buffer[8], 11); + d = _f1(d, a, b, c, buffer[9], 13); + c = _f1(c, d, a, b, buffer[10], 14); + b = _f1(b, c, d, a, buffer[11], 15); + a = _f1(a, b, c, d, buffer[12], 6); + d = _f1(d, a, b, c, buffer[13], 7); + c = _f1(c, d, a, b, buffer[14], 9); + b = _f1(b, c, d, a, buffer[15], 8); + + aa = _ff4(aa, bb, cc, dd, buffer[5], 8); + dd = _ff4(dd, aa, bb, cc, buffer[14], 9); + cc = _ff4(cc, dd, aa, bb, buffer[7], 9); + bb = _ff4(bb, cc, dd, aa, buffer[0], 11); + aa = _ff4(aa, bb, cc, dd, buffer[9], 13); + dd = _ff4(dd, aa, bb, cc, buffer[2], 15); + cc = _ff4(cc, dd, aa, bb, buffer[11], 15); + bb = _ff4(bb, cc, dd, aa, buffer[4], 5); + aa = _ff4(aa, bb, cc, dd, buffer[13], 7); + dd = _ff4(dd, aa, bb, cc, buffer[6], 7); + cc = _ff4(cc, dd, aa, bb, buffer[15], 8); + bb = _ff4(bb, cc, dd, aa, buffer[8], 11); + aa = _ff4(aa, bb, cc, dd, buffer[1], 14); + dd = _ff4(dd, aa, bb, cc, buffer[10], 14); + cc = _ff4(cc, dd, aa, bb, buffer[3], 12); + bb = _ff4(bb, cc, dd, aa, buffer[12], 6); + + t = a; + a = aa; + aa = t; + + // Round 2 + a = _f2(a, b, c, d, buffer[7], 7); + d = _f2(d, a, b, c, buffer[4], 6); + c = _f2(c, d, a, b, buffer[13], 8); + b = _f2(b, c, d, a, buffer[1], 13); + a = _f2(a, b, c, d, buffer[10], 11); + d = _f2(d, a, b, c, buffer[6], 9); + c = _f2(c, d, a, b, buffer[15], 7); + b = _f2(b, c, d, a, buffer[3], 15); + a = _f2(a, b, c, d, buffer[12], 7); + d = _f2(d, a, b, c, buffer[0], 12); + c = _f2(c, d, a, b, buffer[9], 15); + b = _f2(b, c, d, a, buffer[5], 9); + a = _f2(a, b, c, d, buffer[2], 11); + d = _f2(d, a, b, c, buffer[14], 7); + c = _f2(c, d, a, b, buffer[11], 13); + b = _f2(b, c, d, a, buffer[8], 12); + + aa = _ff3(aa, bb, cc, dd, buffer[6], 9); + dd = _ff3(dd, aa, bb, cc, buffer[11], 13); + cc = _ff3(cc, dd, aa, bb, buffer[3], 15); + bb = _ff3(bb, cc, dd, aa, buffer[7], 7); + aa = _ff3(aa, bb, cc, dd, buffer[0], 12); + dd = _ff3(dd, aa, bb, cc, buffer[13], 8); + cc = _ff3(cc, dd, aa, bb, buffer[5], 9); + bb = _ff3(bb, cc, dd, aa, buffer[10], 11); + aa = _ff3(aa, bb, cc, dd, buffer[14], 7); + dd = _ff3(dd, aa, bb, cc, buffer[15], 7); + cc = _ff3(cc, dd, aa, bb, buffer[8], 12); + bb = _ff3(bb, cc, dd, aa, buffer[12], 7); + aa = _ff3(aa, bb, cc, dd, buffer[4], 6); + dd = _ff3(dd, aa, bb, cc, buffer[9], 15); + cc = _ff3(cc, dd, aa, bb, buffer[1], 13); + bb = _ff3(bb, cc, dd, aa, buffer[2], 11); + + t = b; + b = bb; + bb = t; + + // Round 3 + a = _f3(a, b, c, d, buffer[3], 11); + d = _f3(d, a, b, c, buffer[10], 13); + c = _f3(c, d, a, b, buffer[14], 6); + b = _f3(b, c, d, a, buffer[4], 7); + a = _f3(a, b, c, d, buffer[9], 14); + d = _f3(d, a, b, c, buffer[15], 9); + c = _f3(c, d, a, b, buffer[8], 13); + b = _f3(b, c, d, a, buffer[1], 15); + a = _f3(a, b, c, d, buffer[2], 14); + d = _f3(d, a, b, c, buffer[7], 8); + c = _f3(c, d, a, b, buffer[0], 13); + b = _f3(b, c, d, a, buffer[6], 6); + a = _f3(a, b, c, d, buffer[13], 5); + d = _f3(d, a, b, c, buffer[11], 12); + c = _f3(c, d, a, b, buffer[5], 7); + b = _f3(b, c, d, a, buffer[12], 5); + + aa = _ff2(aa, bb, cc, dd, buffer[15], 9); + dd = _ff2(dd, aa, bb, cc, buffer[5], 7); + cc = _ff2(cc, dd, aa, bb, buffer[1], 15); + bb = _ff2(bb, cc, dd, aa, buffer[3], 11); + aa = _ff2(aa, bb, cc, dd, buffer[7], 8); + dd = _ff2(dd, aa, bb, cc, buffer[14], 6); + cc = _ff2(cc, dd, aa, bb, buffer[6], 6); + bb = _ff2(bb, cc, dd, aa, buffer[9], 14); + aa = _ff2(aa, bb, cc, dd, buffer[11], 12); + dd = _ff2(dd, aa, bb, cc, buffer[8], 13); + cc = _ff2(cc, dd, aa, bb, buffer[12], 5); + bb = _ff2(bb, cc, dd, aa, buffer[2], 14); + aa = _ff2(aa, bb, cc, dd, buffer[10], 13); + dd = _ff2(dd, aa, bb, cc, buffer[0], 13); + cc = _ff2(cc, dd, aa, bb, buffer[4], 7); + bb = _ff2(bb, cc, dd, aa, buffer[13], 5); + + t = c; + c = cc; + cc = t; + + // Round 4 + a = _f4(a, b, c, d, buffer[1], 11); + d = _f4(d, a, b, c, buffer[9], 12); + c = _f4(c, d, a, b, buffer[11], 14); + b = _f4(b, c, d, a, buffer[10], 15); + a = _f4(a, b, c, d, buffer[0], 14); + d = _f4(d, a, b, c, buffer[8], 15); + c = _f4(c, d, a, b, buffer[12], 9); + b = _f4(b, c, d, a, buffer[4], 8); + a = _f4(a, b, c, d, buffer[13], 9); + d = _f4(d, a, b, c, buffer[3], 14); + c = _f4(c, d, a, b, buffer[7], 5); + b = _f4(b, c, d, a, buffer[15], 6); + a = _f4(a, b, c, d, buffer[14], 8); + d = _f4(d, a, b, c, buffer[5], 6); + c = _f4(c, d, a, b, buffer[6], 5); + b = _f4(b, c, d, a, buffer[2], 12); + + aa = _ff1(aa, bb, cc, dd, buffer[8], 15); + dd = _ff1(dd, aa, bb, cc, buffer[6], 5); + cc = _ff1(cc, dd, aa, bb, buffer[4], 8); + bb = _ff1(bb, cc, dd, aa, buffer[1], 11); + aa = _ff1(aa, bb, cc, dd, buffer[3], 14); + dd = _ff1(dd, aa, bb, cc, buffer[11], 14); + cc = _ff1(cc, dd, aa, bb, buffer[15], 6); + bb = _ff1(bb, cc, dd, aa, buffer[0], 14); + aa = _ff1(aa, bb, cc, dd, buffer[5], 6); + dd = _ff1(dd, aa, bb, cc, buffer[12], 9); + cc = _ff1(cc, dd, aa, bb, buffer[2], 12); + bb = _ff1(bb, cc, dd, aa, buffer[13], 9); + aa = _ff1(aa, bb, cc, dd, buffer[9], 12); + dd = _ff1(dd, aa, bb, cc, buffer[7], 5); + cc = _ff1(cc, dd, aa, bb, buffer[10], 15); + bb = _ff1(bb, cc, dd, aa, buffer[14], 8); + + t = d; + d = dd; + dd = t; + + state[0] = sum32(state[0], a); + state[1] = sum32(state[1], b); + state[2] = sum32(state[2], c); + state[3] = sum32(state[3], d); + state[4] = sum32(state[4], aa); + state[5] = sum32(state[5], bb); + state[6] = sum32(state[6], cc); + state[7] = sum32(state[7], dd); + } + + int _function1(int x, int y, int z) => x ^ y ^ z; + + int _function2(int x, int y, int z) => (x & y) | (~x & z); + + int _function3(int x, int y, int z) => (x | ~y) ^ z; + + int _function4(int x, int y, int z) => (x & z) | (y & ~z); + + int _f1(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function1(b, c, d) + x, s); + + int _f2(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function2(b, c, d) + x + 0x5a827999, s); + + int _f3(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function3(b, c, d) + x + 0x6ed9eba1, s); + + int _f4(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function4(b, c, d) + x + 0x8f1bbcdc, s); + + int _ff1(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function1(b, c, d) + x, s); + + int _ff2(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function2(b, c, d) + x + 0x6d703ef3, s); + + int _ff3(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function3(b, c, d) + x + 0x5c4dd124, s); + + int _ff4(int a, int b, int c, int d, int x, int s) => + crotl32(a + _function4(b, c, d) + x + 0x50a28be6, s); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/ripemd320.dart b/pointycastle/lib/digests/ripemd320.dart new file mode 100644 index 0000000..1cdb878 --- /dev/null +++ b/pointycastle/lib/digests/ripemd320.dart @@ -0,0 +1,456 @@ +// See file LICENSE for more information. + +library impl.digest.ripemd320; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of RIPEMD-320 digest. +class RIPEMD320Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'RIPEMD-320', () => RIPEMD320Digest()); + + static const _DIGEST_LENGTH = 40; + + RIPEMD320Digest() : super(Endian.little, 10, 16); + @override + final algorithmName = 'RIPEMD-320'; + + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + state[4] = 0xc3d2e1f0; + state[5] = 0x76543210; + state[6] = 0xFEDCBA98; + state[7] = 0x89ABCDEF; + state[8] = 0x01234567; + state[9] = 0x3C2D1E0F; + } + + @override + void processBlock() { + int? a, aa; + int? b, bb; + int? c, cc; + int? d, dd; + int? e, ee; + int t; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + aa = state[5]; + bb = state[6]; + cc = state[7]; + dd = state[8]; + ee = state[9]; + + // + // Rounds 1 - 16 + // + // left + a = sum32(crotl32(a + _f1(b, c, d) + buffer[0], 11), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[1], 14), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[2], 15), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[3], 12), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[4], 5), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[5], 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[6], 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[7], 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[8], 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[9], 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[10], 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f1(a, b, c) + buffer[11], 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f1(e, a, b) + buffer[12], 6), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f1(d, e, a) + buffer[13], 7), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f1(c, d, e) + buffer[14], 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f1(b, c, d) + buffer[15], 8), e); + c = rotl32(c, 10); + + // right + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[5] + 0x50a28be6, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[14] + 0x50a28be6, 9), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[7] + 0x50a28be6, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[0] + 0x50a28be6, 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[9] + 0x50a28be6, 13), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[2] + 0x50a28be6, 15), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[11] + 0x50a28be6, 15), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[4] + 0x50a28be6, 5), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[13] + 0x50a28be6, 7), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[6] + 0x50a28be6, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[15] + 0x50a28be6, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f5(aa, bb, cc) + buffer[8] + 0x50a28be6, 11), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f5(ee, aa, bb) + buffer[1] + 0x50a28be6, 14), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f5(dd, ee, aa) + buffer[10] + 0x50a28be6, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f5(cc, dd, ee) + buffer[3] + 0x50a28be6, 12), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f5(bb, cc, dd) + buffer[12] + 0x50a28be6, 6), ee); + cc = rotl32(cc, 10); + + t = a; + a = aa; + aa = t; + + // + // Rounds 16-31 + // + // left + e = sum32(crotl32(e + _f2(a, b, c) + buffer[7] + 0x5a827999, 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[4] + 0x5a827999, 6), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[13] + 0x5a827999, 8), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[1] + 0x5a827999, 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[10] + 0x5a827999, 11), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[6] + 0x5a827999, 9), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[15] + 0x5a827999, 7), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[3] + 0x5a827999, 15), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[12] + 0x5a827999, 7), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[0] + 0x5a827999, 12), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[9] + 0x5a827999, 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f2(e, a, b) + buffer[5] + 0x5a827999, 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f2(d, e, a) + buffer[2] + 0x5a827999, 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f2(c, d, e) + buffer[14] + 0x5a827999, 7), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f2(b, c, d) + buffer[11] + 0x5a827999, 13), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f2(a, b, c) + buffer[8] + 0x5a827999, 12), d); + b = rotl32(b, 10); + + // right + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[6] + 0x5c4dd124, 9), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[11] + 0x5c4dd124, 13), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[3] + 0x5c4dd124, 15), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[7] + 0x5c4dd124, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[0] + 0x5c4dd124, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[13] + 0x5c4dd124, 8), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[5] + 0x5c4dd124, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[10] + 0x5c4dd124, 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[14] + 0x5c4dd124, 7), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[15] + 0x5c4dd124, 7), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[8] + 0x5c4dd124, 12), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f4(ee, aa, bb) + buffer[12] + 0x5c4dd124, 7), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f4(dd, ee, aa) + buffer[4] + 0x5c4dd124, 6), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f4(cc, dd, ee) + buffer[9] + 0x5c4dd124, 15), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f4(bb, cc, dd) + buffer[1] + 0x5c4dd124, 13), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f4(aa, bb, cc) + buffer[2] + 0x5c4dd124, 11), dd); + bb = rotl32(bb, 10); + + t = b; + b = bb; + bb = t; + + // + // Rounds 32-47 + // + // left + d = sum32(crotl32(d + _f3(e, a, b) + buffer[3] + 0x6ed9eba1, 11), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[10] + 0x6ed9eba1, 13), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[14] + 0x6ed9eba1, 6), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[4] + 0x6ed9eba1, 7), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[9] + 0x6ed9eba1, 14), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[15] + 0x6ed9eba1, 9), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[8] + 0x6ed9eba1, 13), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[1] + 0x6ed9eba1, 15), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[2] + 0x6ed9eba1, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[7] + 0x6ed9eba1, 8), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[0] + 0x6ed9eba1, 13), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f3(d, e, a) + buffer[6] + 0x6ed9eba1, 6), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f3(c, d, e) + buffer[13] + 0x6ed9eba1, 5), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f3(b, c, d) + buffer[11] + 0x6ed9eba1, 12), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f3(a, b, c) + buffer[5] + 0x6ed9eba1, 7), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f3(e, a, b) + buffer[12] + 0x6ed9eba1, 5), c); + a = rotl32(a, 10); + + // right + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[15] + 0x6d703ef3, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[5] + 0x6d703ef3, 7), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[1] + 0x6d703ef3, 15), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[3] + 0x6d703ef3, 11), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[7] + 0x6d703ef3, 8), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[14] + 0x6d703ef3, 6), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[6] + 0x6d703ef3, 6), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[9] + 0x6d703ef3, 14), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[11] + 0x6d703ef3, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[8] + 0x6d703ef3, 13), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[12] + 0x6d703ef3, 5), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f3(dd, ee, aa) + buffer[2] + 0x6d703ef3, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f3(cc, dd, ee) + buffer[10] + 0x6d703ef3, 13), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f3(bb, cc, dd) + buffer[0] + 0x6d703ef3, 13), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f3(aa, bb, cc) + buffer[4] + 0x6d703ef3, 7), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f3(ee, aa, bb) + buffer[13] + 0x6d703ef3, 5), cc); + aa = rotl32(aa, 10); + + t = c; + c = cc; + cc = t; + + // + // Rounds 48-63 + // + // left + c = sum32(crotl32(c + _f4(d, e, a) + buffer[1] + 0x8f1bbcdc, 11), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[9] + 0x8f1bbcdc, 12), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[11] + 0x8f1bbcdc, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[10] + 0x8f1bbcdc, 15), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[0] + 0x8f1bbcdc, 14), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[8] + 0x8f1bbcdc, 15), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[12] + 0x8f1bbcdc, 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[4] + 0x8f1bbcdc, 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[13] + 0x8f1bbcdc, 9), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[3] + 0x8f1bbcdc, 14), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[7] + 0x8f1bbcdc, 5), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f4(c, d, e) + buffer[15] + 0x8f1bbcdc, 6), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f4(b, c, d) + buffer[14] + 0x8f1bbcdc, 8), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f4(a, b, c) + buffer[5] + 0x8f1bbcdc, 6), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f4(e, a, b) + buffer[6] + 0x8f1bbcdc, 5), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f4(d, e, a) + buffer[2] + 0x8f1bbcdc, 12), b); + e = rotl32(e, 10); + + // right + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[8] + 0x7a6d76e9, 15), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[6] + 0x7a6d76e9, 5), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[4] + 0x7a6d76e9, 8), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[1] + 0x7a6d76e9, 11), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[3] + 0x7a6d76e9, 14), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[11] + 0x7a6d76e9, 14), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[15] + 0x7a6d76e9, 6), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[0] + 0x7a6d76e9, 14), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[5] + 0x7a6d76e9, 6), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[12] + 0x7a6d76e9, 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[2] + 0x7a6d76e9, 12), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f2(cc, dd, ee) + buffer[13] + 0x7a6d76e9, 9), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f2(bb, cc, dd) + buffer[9] + 0x7a6d76e9, 12), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f2(aa, bb, cc) + buffer[7] + 0x7a6d76e9, 5), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f2(ee, aa, bb) + buffer[10] + 0x7a6d76e9, 15), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f2(dd, ee, aa) + buffer[14] + 0x7a6d76e9, 8), bb); + ee = rotl32(ee, 10); + + t = d; + d = dd; + dd = t; + + // + // Rounds 64-79 + // + // left + b = sum32(crotl32(b + _f5(c, d, e) + buffer[4] + 0xa953fd4e, 9), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[0] + 0xa953fd4e, 15), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[5] + 0xa953fd4e, 5), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[9] + 0xa953fd4e, 11), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[7] + 0xa953fd4e, 6), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[12] + 0xa953fd4e, 8), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[2] + 0xa953fd4e, 13), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[10] + 0xa953fd4e, 12), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[14] + 0xa953fd4e, 5), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[1] + 0xa953fd4e, 12), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[3] + 0xa953fd4e, 13), a); + d = rotl32(d, 10); + a = sum32(crotl32(a + _f5(b, c, d) + buffer[8] + 0xa953fd4e, 14), e); + c = rotl32(c, 10); + e = sum32(crotl32(e + _f5(a, b, c) + buffer[11] + 0xa953fd4e, 11), d); + b = rotl32(b, 10); + d = sum32(crotl32(d + _f5(e, a, b) + buffer[6] + 0xa953fd4e, 8), c); + a = rotl32(a, 10); + c = sum32(crotl32(c + _f5(d, e, a) + buffer[15] + 0xa953fd4e, 5), b); + e = rotl32(e, 10); + b = sum32(crotl32(b + _f5(c, d, e) + buffer[13] + 0xa953fd4e, 6), a); + d = rotl32(d, 10); + + // right + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[12], 8), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[15], 5), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[10], 12), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[4], 9), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[1], 12), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[5], 5), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[8], 14), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[7], 6), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[6], 8), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[2], 13), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[13], 6), aa); + dd = rotl32(dd, 10); + aa = sum32(crotl32(aa + _f1(bb, cc, dd) + buffer[14], 5), ee); + cc = rotl32(cc, 10); + ee = sum32(crotl32(ee + _f1(aa, bb, cc) + buffer[0], 15), dd); + bb = rotl32(bb, 10); + dd = sum32(crotl32(dd + _f1(ee, aa, bb) + buffer[3], 13), cc); + aa = rotl32(aa, 10); + cc = sum32(crotl32(cc + _f1(dd, ee, aa) + buffer[9], 11), bb); + ee = rotl32(ee, 10); + bb = sum32(crotl32(bb + _f1(cc, dd, ee) + buffer[11], 11), aa); + dd = rotl32(dd, 10); + + // do (e, ee) swap as part of assignment. + state[0] = sum32(state[0], a); + state[1] = sum32(state[1], b); + state[2] = sum32(state[2], c); + state[3] = sum32(state[3], d); + state[4] = sum32(state[4], ee); + state[5] = sum32(state[5], aa); + state[6] = sum32(state[6], bb); + state[7] = sum32(state[7], cc); + state[8] = sum32(state[8], dd); + state[9] = sum32(state[9], e); + } + + int _f1(int x, int y, int z) => x ^ y ^ z; + + int _f2(int x, int y, int z) => (x & y) | (~x & z); + + int _f3(int x, int y, int z) => (x | ~y) ^ z; + + int _f4(int x, int y, int z) => (x & z) | (y & ~z); + + int _f5(int x, int y, int z) => x ^ (y | ~z); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/sha1.dart b/pointycastle/lib/digests/sha1.dart new file mode 100644 index 0000000..7ad74ea --- /dev/null +++ b/pointycastle/lib/digests/sha1.dart @@ -0,0 +1,145 @@ +// See file LICENSE for more information. + +library impl.digest.sha1; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of SHA-1 digest +class SHA1Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SHA-1', () => SHA1Digest()); + + static const _DIGEST_LENGTH = 20; + + SHA1Digest() : super(Endian.big, 5, 80); + + @override + final algorithmName = 'SHA-1'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + state[4] = 0xc3d2e1f0; + } + + @override + void processBlock() { + // expand 16 word block into 80 word block. + for (var i = 16; i < 80; i++) { + var t = buffer[i - 3] ^ buffer[i - 8] ^ buffer[i - 14] ^ buffer[i - 16]; + buffer[i] = rotl32(t, 1); + } + + // set up working variables. + var A = state[0]; + var B = state[1]; + var C = state[2]; + var D = state[3]; + var E = state[4]; + + var idx = 0; + + // round 1 + for (var j = 0; j < 4; j++) { + E = clip32(E + rotl32(A, 5) + _f(B, C, D) + buffer[idx++] + _Y1); + B = rotl32(B, 30); + + D = clip32(D + rotl32(E, 5) + _f(A, B, C) + buffer[idx++] + _Y1); + A = rotl32(A, 30); + + C = clip32(C + rotl32(D, 5) + _f(E, A, B) + buffer[idx++] + _Y1); + E = rotl32(E, 30); + + B = clip32(B + rotl32(C, 5) + _f(D, E, A) + buffer[idx++] + _Y1); + D = rotl32(D, 30); + + A = clip32(A + rotl32(B, 5) + _f(C, D, E) + buffer[idx++] + _Y1); + C = rotl32(C, 30); + } + + // round 2 + for (var j = 0; j < 4; j++) { + E = clip32(E + rotl32(A, 5) + _h(B, C, D) + buffer[idx++] + _Y2); + B = rotl32(B, 30); + + D = clip32(D + rotl32(E, 5) + _h(A, B, C) + buffer[idx++] + _Y2); + A = rotl32(A, 30); + + C = clip32(C + rotl32(D, 5) + _h(E, A, B) + buffer[idx++] + _Y2); + E = rotl32(E, 30); + + B = clip32(B + rotl32(C, 5) + _h(D, E, A) + buffer[idx++] + _Y2); + D = rotl32(D, 30); + + A = clip32(A + rotl32(B, 5) + _h(C, D, E) + buffer[idx++] + _Y2); + C = rotl32(C, 30); + } + + // round 3 + for (var j = 0; j < 4; j++) { + E = clip32(E + rotl32(A, 5) + _g(B, C, D) + buffer[idx++] + _Y3); + B = rotl32(B, 30); + + D = clip32(D + rotl32(E, 5) + _g(A, B, C) + buffer[idx++] + _Y3); + A = rotl32(A, 30); + + C = clip32(C + rotl32(D, 5) + _g(E, A, B) + buffer[idx++] + _Y3); + E = rotl32(E, 30); + + B = clip32(B + rotl32(C, 5) + _g(D, E, A) + buffer[idx++] + _Y3); + D = rotl32(D, 30); + + A = clip32(A + rotl32(B, 5) + _g(C, D, E) + buffer[idx++] + _Y3); + C = rotl32(C, 30); + } + + // round 4 + for (var j = 0; j < 4; j++) { + E = clip32(E + rotl32(A, 5) + _h(B, C, D) + buffer[idx++] + _Y4); + B = rotl32(B, 30); + + D = clip32(D + rotl32(E, 5) + _h(A, B, C) + buffer[idx++] + _Y4); + A = rotl32(A, 30); + + C = clip32(C + rotl32(D, 5) + _h(E, A, B) + buffer[idx++] + _Y4); + E = rotl32(E, 30); + + B = clip32(B + rotl32(C, 5) + _h(D, E, A) + buffer[idx++] + _Y4); + D = rotl32(D, 30); + + A = clip32(A + rotl32(B, 5) + _h(C, D, E) + buffer[idx++] + _Y4); + C = rotl32(C, 30); + } + + state[0] = clip32(state[0] + A); + state[1] = clip32(state[1] + B); + state[2] = clip32(state[2] + C); + state[3] = clip32(state[3] + D); + state[4] = clip32(state[4] + E); + } + + // Additive constants + static const _Y1 = 0x5a827999; + static const _Y2 = 0x6ed9eba1; + static const _Y3 = 0x8f1bbcdc; + static const _Y4 = 0xca62c1d6; + + int _f(int u, int v, int w) => (u & v) | ((~u) & w); + + int _h(int u, int v, int w) => u ^ v ^ w; + + int _g(int u, int v, int w) => (u & v) | (u & w) | (v & w); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/sha224.dart b/pointycastle/lib/digests/sha224.dart new file mode 100644 index 0000000..9b7a4da --- /dev/null +++ b/pointycastle/lib/digests/sha224.dart @@ -0,0 +1,203 @@ +// See file LICENSE for more information. + +library impl.digest.sha224; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of SHA-224 digest. +class SHA224Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SHA-224', () => SHA224Digest()); + + static const _DIGEST_LENGTH = 28; + + SHA224Digest() : super(Endian.big, 8, 64, 7); + + @override + final algorithmName = 'SHA-224'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0xc1059ed8; + state[1] = 0x367cd507; + state[2] = 0x3070dd17; + state[3] = 0xf70e5939; + state[4] = 0xffc00b31; + state[5] = 0x68581511; + state[6] = 0x64f98fa7; + state[7] = 0xbefa4fa4; + } + + @override + void processBlock() { + // expand 16 word block into 64 word blocks. + for (var t = 16; t < 64; t++) { + buffer[t] = clip32(_theta1(buffer[t - 2]) + + buffer[t - 7] + + _theta0(buffer[t - 15]) + + buffer[t - 16]); + } + + // set up working variables. + var a = state[0]; + var b = state[1]; + var c = state[2]; + var d = state[3]; + var e = state[4]; + var f = state[5]; + var g = state[6]; + var h = state[7]; + + var t = 0; + + for (var i = 0; i < 8; i++) { + // t = 8 * i + h = clip32(h + _sum1(e) + _ch(e, f, g) + _k[t] + buffer[t]); + d = clip32(d + h); + h = clip32(h + _sum0(a) + _maj(a, b, c)); + ++t; + + // t = 8 * i + 1 + g = clip32(g + _sum1(d) + _ch(d, e, f) + _k[t] + buffer[t]); + c = clip32(c + g); + g = clip32(g + _sum0(h) + _maj(h, a, b)); + ++t; + + // t = 8 * i + 2 + f = clip32(f + _sum1(c) + _ch(c, d, e) + _k[t] + buffer[t]); + b = clip32(b + f); + f = clip32(f + _sum0(g) + _maj(g, h, a)); + ++t; + + // t = 8 * i + 3 + e = clip32(e + _sum1(b) + _ch(b, c, d) + _k[t] + buffer[t]); + a = clip32(a + e); + e = clip32(e + _sum0(f) + _maj(f, g, h)); + ++t; + + // t = 8 * i + 4 + d = clip32(d + _sum1(a) + _ch(a, b, c) + _k[t] + buffer[t]); + h = clip32(h + d); + d = clip32(d + _sum0(e) + _maj(e, f, g)); + ++t; + + // t = 8 * i + 5 + c = clip32(c + _sum1(h) + _ch(h, a, b) + _k[t] + buffer[t]); + g = clip32(g + c); + c = clip32(c + _sum0(d) + _maj(d, e, f)); + ++t; + + // t = 8 * i + 6 + b = clip32(b + _sum1(g) + _ch(g, h, a) + _k[t] + buffer[t]); + f = clip32(f + b); + b = clip32(b + _sum0(c) + _maj(c, d, e)); + ++t; + + // t = 8 * i + 7 + a = clip32(a + _sum1(f) + _ch(f, g, h) + _k[t] + buffer[t]); + e = clip32(e + a); + a = clip32(a + _sum0(b) + _maj(b, c, d)); + ++t; + } + + state[0] = clip32(state[0] + a); + state[1] = clip32(state[1] + b); + state[2] = clip32(state[2] + c); + state[3] = clip32(state[3] + d); + state[4] = clip32(state[4] + e); + state[5] = clip32(state[5] + f); + state[6] = clip32(state[6] + g); + state[7] = clip32(state[7] + h); + } + + int _ch(int x, int y, int z) => (x & y) ^ ((~x) & z); + + int _maj(int x, int y, int z) => (x & y) ^ (x & z) ^ (y & z); + + int _sum0(int x) => rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); + + int _sum1(int x) => rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); + + int _theta0(int x) => rotr32(x, 7) ^ rotr32(x, 18) ^ shiftr32(x, 3); + + int _theta1(int x) => rotr32(x, 17) ^ rotr32(x, 19) ^ shiftr32(x, 10); + + /// SHA-224 Constants (represent the first 32 bits of the fractional parts of the cube roots of the + /// first sixty-four prime numbers) + static final _k = [ + 0x428a2f98, + 0x71374491, + 0xb5c0fbcf, + 0xe9b5dba5, + 0x3956c25b, + 0x59f111f1, + 0x923f82a4, + 0xab1c5ed5, + 0xd807aa98, + 0x12835b01, + 0x243185be, + 0x550c7dc3, + 0x72be5d74, + 0x80deb1fe, + 0x9bdc06a7, + 0xc19bf174, + 0xe49b69c1, + 0xefbe4786, + 0x0fc19dc6, + 0x240ca1cc, + 0x2de92c6f, + 0x4a7484aa, + 0x5cb0a9dc, + 0x76f988da, + 0x983e5152, + 0xa831c66d, + 0xb00327c8, + 0xbf597fc7, + 0xc6e00bf3, + 0xd5a79147, + 0x06ca6351, + 0x14292967, + 0x27b70a85, + 0x2e1b2138, + 0x4d2c6dfc, + 0x53380d13, + 0x650a7354, + 0x766a0abb, + 0x81c2c92e, + 0x92722c85, + 0xa2bfe8a1, + 0xa81a664b, + 0xc24b8b70, + 0xc76c51a3, + 0xd192e819, + 0xd6990624, + 0xf40e3585, + 0x106aa070, + 0x19a4c116, + 0x1e376c08, + 0x2748774c, + 0x34b0bcb5, + 0x391c0cb3, + 0x4ed8aa4a, + 0x5b9cca4f, + 0x682e6ff3, + 0x748f82ee, + 0x78a5636f, + 0x84c87814, + 0x8cc70208, + 0x90befffa, + 0xa4506ceb, + 0xbef9a3f7, + 0xc67178f2 + ]; + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/sha256.dart b/pointycastle/lib/digests/sha256.dart new file mode 100644 index 0000000..c9aa1c3 --- /dev/null +++ b/pointycastle/lib/digests/sha256.dart @@ -0,0 +1,203 @@ +// See file LICENSE for more information. + +library impl.digest.sha256; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of SHA-256 digest. +class SHA256Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SHA-256', () => SHA256Digest()); + + static const _DIGEST_LENGTH = 32; + + SHA256Digest() : super(Endian.big, 8, 64); + + @override + final algorithmName = 'SHA-256'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x6a09e667; + state[1] = 0xbb67ae85; + state[2] = 0x3c6ef372; + state[3] = 0xa54ff53a; + state[4] = 0x510e527f; + state[5] = 0x9b05688c; + state[6] = 0x1f83d9ab; + state[7] = 0x5be0cd19; + } + + @override + void processBlock() { + // expand 16 word block into 64 word blocks. + for (var t = 16; t < 64; t++) { + buffer[t] = clip32(_theta1(buffer[t - 2]) + + buffer[t - 7] + + _theta0(buffer[t - 15]) + + buffer[t - 16]); + } + + // set up working variables. + var a = state[0]; + var b = state[1]; + var c = state[2]; + var d = state[3]; + var e = state[4]; + var f = state[5]; + var g = state[6]; + var h = state[7]; + + var t = 0; + + for (var i = 0; i < 8; i++) { + // t = 8 * i + h = clip32(h + _sum1(e) + _ch(e, f, g) + _k[t] + buffer[t]); + d = clip32(d + h); + h = clip32(h + _sum0(a) + _maj(a, b, c)); + ++t; + + // t = 8 * i + 1 + g = clip32(g + _sum1(d) + _ch(d, e, f) + _k[t] + buffer[t]); + c = clip32(c + g); + g = clip32(g + _sum0(h) + _maj(h, a, b)); + ++t; + + // t = 8 * i + 2 + f = clip32(f + _sum1(c) + _ch(c, d, e) + _k[t] + buffer[t]); + b = clip32(b + f); + f = clip32(f + _sum0(g) + _maj(g, h, a)); + ++t; + + // t = 8 * i + 3 + e = clip32(e + _sum1(b) + _ch(b, c, d) + _k[t] + buffer[t]); + a = clip32(a + e); + e = clip32(e + _sum0(f) + _maj(f, g, h)); + ++t; + + // t = 8 * i + 4 + d = clip32(d + _sum1(a) + _ch(a, b, c) + _k[t] + buffer[t]); + h = clip32(h + d); + d = clip32(d + _sum0(e) + _maj(e, f, g)); + ++t; + + // t = 8 * i + 5 + c = clip32(c + _sum1(h) + _ch(h, a, b) + _k[t] + buffer[t]); + g = clip32(g + c); + c = clip32(c + _sum0(d) + _maj(d, e, f)); + ++t; + + // t = 8 * i + 6 + b = clip32(b + _sum1(g) + _ch(g, h, a) + _k[t] + buffer[t]); + f = clip32(f + b); + b = clip32(b + _sum0(c) + _maj(c, d, e)); + ++t; + + // t = 8 * i + 7 + a = clip32(a + _sum1(f) + _ch(f, g, h) + _k[t] + buffer[t]); + e = clip32(e + a); + a = clip32(a + _sum0(b) + _maj(b, c, d)); + ++t; + } + + state[0] = clip32(state[0] + a); + state[1] = clip32(state[1] + b); + state[2] = clip32(state[2] + c); + state[3] = clip32(state[3] + d); + state[4] = clip32(state[4] + e); + state[5] = clip32(state[5] + f); + state[6] = clip32(state[6] + g); + state[7] = clip32(state[7] + h); + } + + int _ch(int x, int y, int z) => (x & y) ^ ((~x) & z); + + int _maj(int x, int y, int z) => (x & y) ^ (x & z) ^ (y & z); + + int _sum0(int x) => rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); + + int _sum1(int x) => rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); + + int _theta0(int x) => rotr32(x, 7) ^ rotr32(x, 18) ^ shiftr32(x, 3); + + int _theta1(int x) => rotr32(x, 17) ^ rotr32(x, 19) ^ shiftr32(x, 10); + + /// SHA-256 Constants (represent the first 32 bits of the fractional parts of the cube roots of the + /// first sixty-four prime numbers) + static final _k = [ + 0x428a2f98, + 0x71374491, + 0xb5c0fbcf, + 0xe9b5dba5, + 0x3956c25b, + 0x59f111f1, + 0x923f82a4, + 0xab1c5ed5, + 0xd807aa98, + 0x12835b01, + 0x243185be, + 0x550c7dc3, + 0x72be5d74, + 0x80deb1fe, + 0x9bdc06a7, + 0xc19bf174, + 0xe49b69c1, + 0xefbe4786, + 0x0fc19dc6, + 0x240ca1cc, + 0x2de92c6f, + 0x4a7484aa, + 0x5cb0a9dc, + 0x76f988da, + 0x983e5152, + 0xa831c66d, + 0xb00327c8, + 0xbf597fc7, + 0xc6e00bf3, + 0xd5a79147, + 0x06ca6351, + 0x14292967, + 0x27b70a85, + 0x2e1b2138, + 0x4d2c6dfc, + 0x53380d13, + 0x650a7354, + 0x766a0abb, + 0x81c2c92e, + 0x92722c85, + 0xa2bfe8a1, + 0xa81a664b, + 0xc24b8b70, + 0xc76c51a3, + 0xd192e819, + 0xd6990624, + 0xf40e3585, + 0x106aa070, + 0x19a4c116, + 0x1e376c08, + 0x2748774c, + 0x34b0bcb5, + 0x391c0cb3, + 0x4ed8aa4a, + 0x5b9cca4f, + 0x682e6ff3, + 0x748f82ee, + 0x78a5636f, + 0x84c87814, + 0x8cc70208, + 0x90befffa, + 0xa4506ceb, + 0xbef9a3f7, + 0xc67178f2 + ]; + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/sha3.dart b/pointycastle/lib/digests/sha3.dart new file mode 100644 index 0000000..2a8b06d --- /dev/null +++ b/pointycastle/lib/digests/sha3.dart @@ -0,0 +1,50 @@ +// This file has been migrated. + +library impl.digest.sha3; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/keccak_engine.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of SHA3 digest. +/// https://csrc.nist.gov/publications/detail/fips/202/final +class SHA3Digest extends KeccakEngine { + static final RegExp _sha3REGEX = RegExp(r'^SHA3-([0-9]+)$'); + + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig( + Digest, + _sha3REGEX, + (_, final Match match) => () { + var bitLength = int.parse(match.group(1)!); + return SHA3Digest(bitLength); + }); + + SHA3Digest([int? bitLength = 288]) { + switch (bitLength) { + case 224: + case 256: + case 384: + case 512: + init(bitLength!); + break; + default: + throw StateError( + 'invalid bitLength ($bitLength) for SHA-3 must only be 224,256,384,512'); + } + } + + @override + String get algorithmName => 'SHA3-$fixedOutputLength'; + + @override + int doFinal(Uint8List out, int outOff) { + // FIPS 202 SHA3 https://github.com/PointyCastle/pointycastle/issues/128 + absorbBits(0x02, 2); + squeeze(out, outOff, fixedOutputLength); + reset(); + return digestSize; + } +} diff --git a/pointycastle/lib/digests/sha384.dart b/pointycastle/lib/digests/sha384.dart new file mode 100644 index 0000000..b5cfaab --- /dev/null +++ b/pointycastle/lib/digests/sha384.dart @@ -0,0 +1,57 @@ +// See file LICENSE for more information. + +library impl.digest.sha384; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/long_sha2_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of SHA-384 digest. +class SHA384Digest extends LongSHA2FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SHA-384', () => SHA384Digest()); + + static const _DIGEST_LENGTH = 48; + + SHA384Digest() { + reset(); + } + + @override + final algorithmName = 'SHA-384'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void reset() { + super.reset(); + + h1.set(0xcbbb9d5d, 0xc1059ed8); + h2.set(0x629a292a, 0x367cd507); + h3.set(0x9159015a, 0x3070dd17); + h4.set(0x152fecd8, 0xf70e5939); + h5.set(0x67332667, 0xffc00b31); + h6.set(0x8eb44a87, 0x68581511); + h7.set(0xdb0c2e0d, 0x64f98fa7); + h8.set(0x47b5481d, 0xbefa4fa4); + } + + @override + int doFinal(Uint8List out, int outOff) { + finish(); + + var view = ByteData.view(out.buffer, out.offsetInBytes, out.length); + h1.pack(view, outOff, Endian.big); + h2.pack(view, outOff + 8, Endian.big); + h3.pack(view, outOff + 16, Endian.big); + h4.pack(view, outOff + 24, Endian.big); + h5.pack(view, outOff + 32, Endian.big); + h6.pack(view, outOff + 40, Endian.big); + + reset(); + + return _DIGEST_LENGTH; + } +} diff --git a/pointycastle/lib/digests/sha512.dart b/pointycastle/lib/digests/sha512.dart new file mode 100644 index 0000000..61bb16d --- /dev/null +++ b/pointycastle/lib/digests/sha512.dart @@ -0,0 +1,59 @@ +// See file LICENSE for more information. + +library impl.digest.sha512; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/long_sha2_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of SHA-512 digest. +class SHA512Digest extends LongSHA2FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SHA-512', () => SHA512Digest()); + + static const _DIGEST_LENGTH = 64; + + SHA512Digest() { + reset(); + } + + @override + final algorithmName = 'SHA-512'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void reset() { + super.reset(); + + h1.set(0x6a09e667, 0xf3bcc908); + h2.set(0xbb67ae85, 0x84caa73b); + h3.set(0x3c6ef372, 0xfe94f82b); + h4.set(0xa54ff53a, 0x5f1d36f1); + h5.set(0x510e527f, 0xade682d1); + h6.set(0x9b05688c, 0x2b3e6c1f); + h7.set(0x1f83d9ab, 0xfb41bd6b); + h8.set(0x5be0cd19, 0x137e2179); + } + + @override + int doFinal(Uint8List out, int outOff) { + finish(); + + var view = ByteData.view(out.buffer, out.offsetInBytes, out.length); + h1.pack(view, outOff, Endian.big); + h2.pack(view, outOff + 8, Endian.big); + h3.pack(view, outOff + 16, Endian.big); + h4.pack(view, outOff + 24, Endian.big); + h5.pack(view, outOff + 32, Endian.big); + h6.pack(view, outOff + 40, Endian.big); + h7.pack(view, outOff + 48, Endian.big); + h8.pack(view, outOff + 56, Endian.big); + + reset(); + + return _DIGEST_LENGTH; + } +} diff --git a/pointycastle/lib/digests/sha512t.dart b/pointycastle/lib/digests/sha512t.dart new file mode 100644 index 0000000..e4dc0e4 --- /dev/null +++ b/pointycastle/lib/digests/sha512t.dart @@ -0,0 +1,157 @@ +// See file LICENSE for more information. + +library impl.digest.sha512t; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/long_sha2_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of SHA-512/t digest (see FIPS 180-4). +class SHA512tDigest extends LongSHA2FamilyDigest implements Digest { + static final RegExp _nameRegex = RegExp(r'^SHA-512\/([0-9]+)$'); + + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig( + Digest, + _nameRegex, + (_, final Match match) => () { + var bitLength = int.parse(match.group(1)!); + if ((bitLength % 8) != 0) { + throw RegistryFactoryException( + 'Digest length for SHA-512/t is not a multiple of 8: $bitLength'); + } + return SHA512tDigest(bitLength ~/ 8); + }); + + static final Register64 _hMask = Register64(0xa5a5a5a5, 0xa5a5a5a5); + + @override + final int digestSize; + + final _h1t = Register64(); + final _h2t = Register64(); + final _h3t = Register64(); + final _h4t = Register64(); + final _h5t = Register64(); + final _h6t = Register64(); + final _h7t = Register64(); + final _h8t = Register64(); + + SHA512tDigest(this.digestSize) { + if (digestSize >= 64) { + throw ArgumentError('Digest size cannot be >= 64 bytes (512 bits)'); + } + if (digestSize == 48) { + throw ArgumentError( + 'Digest size cannot be 48 bytes (384 bits): use SHA-384 instead'); + } + + _generateIVs(digestSize * 8); + + reset(); + } + + @override + String get algorithmName => 'SHA-512/${digestSize * 8}'; + + @override + void reset() { + super.reset(); + + h1.set(_h1t); + h2.set(_h2t); + h3.set(_h3t); + h4.set(_h4t); + h5.set(_h5t); + h6.set(_h6t); + h7.set(_h7t); + h8.set(_h8t); + } + + @override + int doFinal(Uint8List out, int outOff) { + finish(); + + var tmp = Uint8List(64); + + var view = ByteData.view(tmp.buffer, tmp.offsetInBytes, tmp.length); + h1.pack(view, 0, Endian.big); + h2.pack(view, 8, Endian.big); + h3.pack(view, 16, Endian.big); + h4.pack(view, 24, Endian.big); + h5.pack(view, 32, Endian.big); + h6.pack(view, 40, Endian.big); + h7.pack(view, 48, Endian.big); + h8.pack(view, 56, Endian.big); + + out.setRange(outOff, outOff + digestSize, tmp); + + reset(); + + return digestSize; + } + + void _generateIVs(int bitLength) { + h1 + ..set(0x6a09e667, 0xf3bcc908) + ..xor(_hMask); + h2 + ..set(0xbb67ae85, 0x84caa73b) + ..xor(_hMask); + h3 + ..set(0x3c6ef372, 0xfe94f82b) + ..xor(_hMask); + h4 + ..set(0xa54ff53a, 0x5f1d36f1) + ..xor(_hMask); + h5 + ..set(0x510e527f, 0xade682d1) + ..xor(_hMask); + h6 + ..set(0x9b05688c, 0x2b3e6c1f) + ..xor(_hMask); + h7 + ..set(0x1f83d9ab, 0xfb41bd6b) + ..xor(_hMask); + h8 + ..set(0x5be0cd19, 0x137e2179) + ..xor(_hMask); + + updateByte(0x53); + updateByte(0x48); + updateByte(0x41); + updateByte(0x2D); + updateByte(0x35); + updateByte(0x31); + updateByte(0x32); + updateByte(0x2F); + + if (bitLength > 100) { + updateByte(bitLength ~/ 100 + 0x30); + bitLength = bitLength % 100; + updateByte(bitLength ~/ 10 + 0x30); + bitLength = bitLength % 10; + updateByte(bitLength + 0x30); + } else if (bitLength > 10) { + updateByte(bitLength ~/ 10 + 0x30); + bitLength = bitLength % 10; + updateByte(bitLength + 0x30); + } else { + updateByte(bitLength + 0x30); + } + + finish(); + + _h1t.set(h1); + _h2t.set(h2); + _h3t.set(h3); + _h4t.set(h4); + _h5t.set(h5); + _h6t.set(h6); + _h7t.set(h7); + _h8t.set(h8); + } +} diff --git a/pointycastle/lib/digests/shake.dart b/pointycastle/lib/digests/shake.dart new file mode 100644 index 0000000..53f9290 --- /dev/null +++ b/pointycastle/lib/digests/shake.dart @@ -0,0 +1,92 @@ +// This file has been migrated. + +library impl.digest.shake; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/keccak_engine.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// +/// implementation of SHAKE based on following KeccakNISTInterface.c from http://keccak.noekeon.org/ +/// +/// Following the naming conventions used in the C source code to enable easy review of the implementation. +/// +class SHAKEDigest extends KeccakEngine implements Xof { + static final RegExp _shakeREGEX = RegExp(r'^SHAKE-([0-9]+)$'); + + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig( + Digest, + _shakeREGEX, + (_, final Match match) => () { + var bitLength = int.parse(match.group(1)!); + return SHAKEDigest(bitLength); + }); + + SHAKEDigest([int bitLength = 256]) { + switch (bitLength) { + case 128: + case 256: + init(bitLength); + break; + default: + throw StateError( + 'invalid bitLength ($bitLength) for SHAKE must only be 128 or 256'); + } + } + + @override + String get algorithmName => 'SHAKE-$fixedOutputLength'; + + @override + int doFinal(Uint8List out, int outOff) { + return doFinalRange(out, digestSize, digestSize); + } + + @override + int doFinalRange(Uint8List out, int outOff, int outLen) { + var length = doOutput(out, outOff, outLen); + reset(); + return length; + } + + int doFinalPartial( + Uint8List out, int outOff, int outLen, int partialByte, int partialBits) { + if (partialBits < 0 || partialBits > 7) { + throw ArgumentError('partialBits must be in the range [0,7]'); + } + + var finalInput = + (partialByte & ((1 << partialBits) - 1)) | (0x0F << partialBits); + var finalBits = partialBits + 4; + + if (finalBits >= 8) { + absorb(finalInput); + finalBits -= 8; + finalInput >>= 8; + } + + if (finalBits > 0) { + absorbBits(finalInput, finalBits); + } + + squeeze(out, outOff, outLen * 8); + + reset(); + + return outLen; + } + + @override + int doOutput(Uint8List out, int outOff, int outLen) { + if (!squeezing) { + absorbBits(0x0F, 4); + } + + squeeze(out, outOff, outLen * 8); + + return outLen; + } +} diff --git a/pointycastle/lib/digests/sm3.dart b/pointycastle/lib/digests/sm3.dart new file mode 100644 index 0000000..6ea8639 --- /dev/null +++ b/pointycastle/lib/digests/sm3.dart @@ -0,0 +1,130 @@ +// See file LICENSE for more information. + +library impl.digest.sm3; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/md4_family_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of Chinese SM3 Hash Function (GM/T 0004-2012) as +/// described at [Reference 1][REF1] and at [Reference 2][REF2]. +/// +/// 这是一个依据 [参考文献1][REF1] 和 [参考文献2][REF2] 的 SM3 哈希函数的实现. +/// +/// [REF1]: http://www.sca.gov.cn/sca/xwdt/2010-12/17/content_1002389.shtml +/// [REF2]: https://tools.ietf.org/html/draft-shen-sm3-hash +class SM3Digest extends MD4FamilyDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'SM3', () => SM3Digest()); + + static const _DIGEST_LENGTH = 32; + + final List _W; + + SM3Digest() + : _W = List.filled(68, 0, growable: false), + super(Endian.big, 8, 16); + + @override + final algorithmName = 'SM3'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void resetState() { + state[0] = 0x7380166f; + state[1] = 0x4914b2b9; + state[2] = 0x172442d7; + state[3] = 0xda8a0600; + state[4] = 0xa96f30bc; + state[5] = 0x163138aa; + state[6] = 0xe38dee4d; + state[7] = 0xb0fb0e4e; + } + + @override + void processBlock() { + int i; + // [REF1] 5.3.2 消息扩展 + // [REF2] 3.3.2 Message Extension + _W.setAll(0, buffer); + for (i = 16; i < 68; ++i) { + _W[i] = _P1(_W[i - 16] ^ _W[i - 9] ^ rotl32(_W[i - 3], 15)) ^ + rotl32(_W[i - 13], 7) ^ + _W[i - 6]; + } + // [REF1] 5.3.3 压缩函数 + // [REF2] 3.3.3 Compression Function + var A = state[0]; + var B = state[1]; + var C = state[2]; + var D = state[3]; + var E = state[4]; + var F = state[5]; + var G = state[6]; + var H = state[7]; + int SS1, SS2, TT1, TT2, Tj; + for (i = 0; i < 16; ++i) { + Tj = 0x79cc4519; + SS1 = rotl32(clip32(rotl32(A, 12) + E + rotl32(Tj, i)), 7); + SS2 = SS1 ^ rotl32(A, 12); + TT1 = clip32(_FF1(A, B, C) + D + SS2 + (_W[i] ^ _W[i + 4])); + TT2 = clip32(_GG1(E, F, G) + H + SS1 + _W[i]); + D = C; + C = rotl32(B, 9); + B = A; + A = TT1; + H = G; + G = rotl32(F, 19); + F = E; + E = _P0(TT2); + } + for (i = 16; i < 64; ++i) { + Tj = 0x7a879d8a; + SS1 = rotl32(clip32(rotl32(A, 12) + E + rotl32(Tj, i)), 7); + SS2 = SS1 ^ rotl32(A, 12); + TT1 = clip32(_FF2(A, B, C) + D + SS2 + (_W[i] ^ _W[i + 4])); + TT2 = clip32(_GG2(E, F, G) + H + SS1 + _W[i]); + D = C; + C = rotl32(B, 9); + B = A; + A = TT1; + H = G; + G = rotl32(F, 19); + F = E; + E = _P0(TT2); + } + state[0] ^= A; + state[1] ^= B; + state[2] ^= C; + state[3] ^= D; + state[4] ^= E; + state[5] ^= F; + state[6] ^= G; + state[7] ^= H; + } + + /// FF1 Function + static int _FF1(int X, int Y, int Z) => X ^ Y ^ Z; + + /// FF2 Function + static int _FF2(int X, int Y, int Z) => (X & Y) | (X & Z) | (Y & Z); + + /// GG1 Function + static final _GG1 = _FF1; + + /// GG2 Function + static int _GG2(int X, int Y, int Z) => (X & Y) | ((~X) & Z); + + /// P0 Function + static int _P0(int X) => X ^ rotl32(X, 9) ^ rotl32(X, 17); + + /// P1 Function + static int _P1(int X) => X ^ rotl32(X, 15) ^ rotl32(X, 23); + + @override + int get byteLength => 64; +} diff --git a/pointycastle/lib/digests/tiger.dart b/pointycastle/lib/digests/tiger.dart new file mode 100644 index 0000000..8fe9444 --- /dev/null +++ b/pointycastle/lib/digests/tiger.dart @@ -0,0 +1,1321 @@ +// See file LICENSE for more information. + +library impl.digest.tiger; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of Tiger digest. +class TigerDigest extends BaseDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'Tiger', () => TigerDigest()); + + static const _DIGEST_LENGTH = 24; + static final _keyMask0 = Register64(0xA5A5A5A5, 0xA5A5A5A5); + static final _keyMask7 = Register64(0x01234567, 0x89ABCDEF); + + final _a = Register64(); + final _b = Register64(); + final _c = Register64(); + + final _byteCount = Register64(); + + final _wordBuffer = Uint8List(8); + int _wordBufferOffset = 0; + + final _buffer = Register64List(8); + int _bufferOffset = 0; + + TigerDigest() { + reset(); + } + + @override + final algorithmName = 'Tiger'; + @override + final digestSize = _DIGEST_LENGTH; + + @override + void reset() { + _a.set(0x01234567, 0x89ABCDEF); + _b.set(0xFEDCBA98, 0x76543210); + _c.set(0xF096A5B4, 0xC3B2E187); + + _bufferOffset = 0; + _buffer.fillRange(0, _buffer.length, 0); + + _wordBufferOffset = 0; + _wordBuffer.fillRange(0, _wordBuffer.length, 0); + + _byteCount.set(0); + } + + @override + int doFinal(Uint8List out, int outOff) { + _finish(); + + _a.pack(out, outOff, Endian.little); + _b.pack(out, outOff + 8, Endian.little); + _c.pack(out, outOff + 16, Endian.little); + + reset(); + + return _DIGEST_LENGTH; + } + + @override + void updateByte(int inp) { + _wordBuffer[_wordBufferOffset++] = inp; + + if (_wordBufferOffset == _wordBuffer.length) { + _processWord(_wordBuffer, 0); + } + + _byteCount.sum(1); + } + + @override + void update(Uint8List? inp, int inpOff, int? len) { + // fill the current word + while ((_wordBufferOffset != 0) && (len! > 0)) { + updateByte(inp![inpOff]); + + inpOff++; + len--; + } + + // process whole words. + while (len! > 8) { + _processWord(inp, inpOff); + + inpOff += 8; + len -= 8; + _byteCount.sum(8); + } + + // load in the remainder. + while (len! > 0) { + updateByte(inp![inpOff]); + + inpOff++; + len--; + } + } + + void _processWord(Uint8List? b, int off) { + _buffer[_bufferOffset++].unpack(b, off, Endian.little); + + if (_bufferOffset == _buffer.length) { + _processBlock(); + } + _wordBufferOffset = 0; + } + + void _processBlock() { + // save abc + final aa = Register64(_a); + final bb = Register64(_b); + final cc = Register64(_c); + + // rounds and schedule + _roundABC(_buffer[0], 5); + _roundBCA(_buffer[1], 5); + _roundCAB(_buffer[2], 5); + _roundABC(_buffer[3], 5); + _roundBCA(_buffer[4], 5); + _roundCAB(_buffer[5], 5); + _roundABC(_buffer[6], 5); + _roundBCA(_buffer[7], 5); + + _keySchedule(); + + _roundCAB(_buffer[0], 7); + _roundABC(_buffer[1], 7); + _roundBCA(_buffer[2], 7); + _roundCAB(_buffer[3], 7); + _roundABC(_buffer[4], 7); + _roundBCA(_buffer[5], 7); + _roundCAB(_buffer[6], 7); + _roundABC(_buffer[7], 7); + + _keySchedule(); + + _roundBCA(_buffer[0], 9); + _roundCAB(_buffer[1], 9); + _roundABC(_buffer[2], 9); + _roundBCA(_buffer[3], 9); + _roundCAB(_buffer[4], 9); + _roundABC(_buffer[5], 9); + _roundBCA(_buffer[6], 9); + _roundCAB(_buffer[7], 9); + + // feed forward + _a.xor(aa); + _b.sub(bb); + _c.sum(cc); + + // clear the x buffer + _bufferOffset = 0; + _buffer.fillRange(0, _buffer.length, 0); + } + + void _processLength(Register64 bitLength) { + _buffer[7].set(bitLength); + } + + void _finish() { + var bitLength = Register64(_byteCount)..shiftl(3); + + updateByte(0x01); + + while (_wordBufferOffset != 0) { + updateByte(0); + } + + _processLength(bitLength); + + _processBlock(); + } + + void _keySchedule() { + final r = Register64(); + + _buffer[0].sub(r + ..set(_buffer[7]) + ..xor(_keyMask0)); + _buffer[1].xor(_buffer[0]); + _buffer[2].sum(_buffer[1]); + _buffer[3].sub(r + ..set(_buffer[1]) + ..not() + ..shiftl(19) + ..xor(_buffer[2])); + _buffer[4].xor(_buffer[3]); + _buffer[5].sum(_buffer[4]); + _buffer[6].sub(r + ..set(_buffer[4]) + ..not() + ..shiftr(23) + ..xor(_buffer[5])); + _buffer[7].xor(_buffer[6]); + _buffer[0].sum(_buffer[7]); + _buffer[1].sub(r + ..set(_buffer[7]) + ..not() + ..shiftl(19) + ..xor(_buffer[0])); + _buffer[2].xor(_buffer[1]); + _buffer[3].sum(_buffer[2]); + _buffer[4].sub(r + ..set(_buffer[2]) + ..not() + ..shiftr(23) + ..xor(_buffer[3])); + _buffer[5].xor(_buffer[4]); + _buffer[6].sum(_buffer[5]); + _buffer[7].sub(r + ..set(_buffer[6]) + ..xor(_keyMask7)); + } + + void _roundABC(Register64 x, int mul) { + final r = Register64(); + final c = Uint8List(8); + + _c.xor(x); + _c.pack(c, 0, Endian.little); + _a.sub(r + ..set(_t1[c[0]]) + ..xor(_t2[c[2]]) + ..xor(_t3[c[4]]) + ..xor(_t4[c[6]])); + _b.sum(r + ..set(_t4[c[1]]) + ..xor(_t3[c[3]]) + ..xor(_t2[c[5]]) + ..xor(_t1[c[7]])); + _b.mul(mul); + } + + void _roundBCA(Register64 x, int mul) { + final r = Register64(); + final a = Uint8List(8); + + _a.xor(x); + _a.pack(a, 0, Endian.little); + _b.sub(r + ..set(_t1[a[0]]) + ..xor(_t2[a[2]]) + ..xor(_t3[a[4]]) + ..xor(_t4[a[6]])); + _c.sum(r + ..set(_t4[a[1]]) + ..xor(_t3[a[3]]) + ..xor(_t2[a[5]]) + ..xor(_t1[a[7]])); + _c.mul(mul); + } + + void _roundCAB(Register64 x, int mul) { + final r = Register64(); + final b = Uint8List(8); + + _b.xor(x); + _b.pack(b, 0, Endian.little); + _c.sub(r + ..set(_t1[b[0]]) + ..xor(_t2[b[2]]) + ..xor(_t3[b[4]]) + ..xor(_t4[b[6]])); + _a.sum(r + ..set(_t4[b[1]]) + ..xor(_t3[b[3]]) + ..xor(_t2[b[5]]) + ..xor(_t1[b[7]])); + _a.mul(mul); + } + + @override + int get byteLength => 64; +} + +// S-Boxes +final _t1 = [ + Register64(0x02aab17c, 0xf7e90c5e), + Register64(0xac424b03, 0xe243a8ec), + Register64(0x72cd5be3, 0x0dd5fcd3), + Register64(0x6d019b93, 0xf6f97f3a), + Register64(0xcd9978ff, 0xd21f9193), + Register64(0x7573a1c9, 0x708029e2), + Register64(0xb164326b, 0x922a83c3), + Register64(0x46883eee, 0x04915870), + Register64(0xeaace305, 0x7103ece6), + Register64(0xc54169b8, 0x08a3535c), + Register64(0x4ce75491, 0x8ddec47c), + Register64(0x0aa2f4df, 0xdc0df40c), + Register64(0x10b76f18, 0xa74dbefa), + Register64(0xc6ccb623, 0x5ad1ab6a), + Register64(0x13726121, 0x572fe2ff), + Register64(0x1a488c6f, 0x199d921e), + Register64(0x4bc9f9f4, 0xda0007ca), + Register64(0x26f5e6f6, 0xe85241c7), + Register64(0x859079db, 0xea5947b6), + Register64(0x4f1885c5, 0xc99e8c92), + Register64(0xd78e761e, 0xa96f864b), + Register64(0x8e36428c, 0x52b5c17d), + Register64(0x69cf6827, 0x373063c1), + Register64(0xb607c93d, 0x9bb4c56e), + Register64(0x7d820e76, 0x0e76b5ea), + Register64(0x645c9cc6, 0xf07fdc42), + Register64(0xbf38a078, 0x243342e0), + Register64(0x5f6b343c, 0x9d2e7d04), + Register64(0xf2c28aeb, 0x600b0ec6), + Register64(0x6c0ed85f, 0x7254bcac), + Register64(0x71592281, 0xa4db4fe5), + Register64(0x1967fa69, 0xce0fed9f), + Register64(0xfd5293f8, 0xb96545db), + Register64(0xc879e9d7, 0xf2a7600b), + Register64(0x86024892, 0x0193194e), + Register64(0xa4f9533b, 0x2d9cc0b3), + Register64(0x9053836c, 0x15957613), + Register64(0xdb6dcf8a, 0xfc357bf1), + Register64(0x18beea7a, 0x7a370f57), + Register64(0x037117ca, 0x50b99066), + Register64(0x6ab30a97, 0x74424a35), + Register64(0xf4e92f02, 0xe325249b), + Register64(0x7739db07, 0x061ccae1), + Register64(0xd8f3b49c, 0xeca42a05), + Register64(0xbd56be3f, 0x51382f73), + Register64(0x45faed58, 0x43b0bb28), + Register64(0x1c813d5c, 0x11bf1f83), + Register64(0x8af0e4b6, 0xd75fa169), + Register64(0x33ee18a4, 0x87ad9999), + Register64(0x3c26e8ea, 0xb1c94410), + Register64(0xb510102b, 0xc0a822f9), + Register64(0x141eef31, 0x0ce6123b), + Register64(0xfc65b900, 0x59ddb154), + Register64(0xe0158640, 0xc5e0e607), + Register64(0x884e0798, 0x26c3a3cf), + Register64(0x930d0d95, 0x23c535fd), + Register64(0x35638d75, 0x4e9a2b00), + Register64(0x4085fccf, 0x40469dd5), + Register64(0xc4b17ad2, 0x8be23a4c), + Register64(0xcab2f0fc, 0x6a3e6a2e), + Register64(0x2860971a, 0x6b943fcd), + Register64(0x3dde6ee2, 0x12e30446), + Register64(0x6222f32a, 0xe01765ae), + Register64(0x5d550bb5, 0x478308fe), + Register64(0xa9efa98d, 0xa0eda22a), + Register64(0xc351a716, 0x86c40da7), + Register64(0x1105586d, 0x9c867c84), + Register64(0xdcffee85, 0xfda22853), + Register64(0xccfbd026, 0x2c5eef76), + Register64(0xbaf294cb, 0x8990d201), + Register64(0xe69464f5, 0x2afad975), + Register64(0x94b013af, 0xdf133e14), + Register64(0x06a7d1a3, 0x2823c958), + Register64(0x6f95fe51, 0x30f61119), + Register64(0xd92ab34e, 0x462c06c0), + Register64(0xed7bde33, 0x887c71d2), + Register64(0x79746d6e, 0x6518393e), + Register64(0x5ba41938, 0x5d713329), + Register64(0x7c1ba6b9, 0x48a97564), + Register64(0x31987c19, 0x7bfdac67), + Register64(0xde6c23c4, 0x4b053d02), + Register64(0x581c49fe, 0xd002d64d), + Register64(0xdd474d63, 0x38261571), + Register64(0xaa4546c3, 0xe473d062), + Register64(0x928fce34, 0x9455f860), + Register64(0x48161bba, 0xcaab94d9), + Register64(0x63912430, 0x770e6f68), + Register64(0x6ec8a5e6, 0x02c6641c), + Register64(0x87282515, 0x337ddd2b), + Register64(0x2cda6b42, 0x034b701b), + Register64(0xb03d37c1, 0x81cb096d), + Register64(0xe1084382, 0x66c71c6f), + Register64(0x2b3180c7, 0xeb51b255), + Register64(0xdf92b82f, 0x96c08bbc), + Register64(0x5c68c8c0, 0xa632f3ba), + Register64(0x5504cc86, 0x1c3d0556), + Register64(0xabbfa4e5, 0x5fb26b8f), + Register64(0x41848b0a, 0xb3baceb4), + Register64(0xb334a273, 0xaa445d32), + Register64(0xbca696f0, 0xa85ad881), + Register64(0x24f6ec65, 0xb528d56c), + Register64(0x0ce1512e, 0x90f4524a), + Register64(0x4e9dd79d, 0x5506d35a), + Register64(0x258905fa, 0xc6ce9779), + Register64(0x2019295b, 0x3e109b33), + Register64(0xf8a9478b, 0x73a054cc), + Register64(0x2924f2f9, 0x34417eb0), + Register64(0x3993357d, 0x536d1bc4), + Register64(0x38a81ac2, 0x1db6ff8b), + Register64(0x47c4fbf1, 0x7d6016bf), + Register64(0x1e0faadd, 0x7667e3f5), + Register64(0x7abcff62, 0x938beb96), + Register64(0xa78dad94, 0x8fc179c9), + Register64(0x8f1f98b7, 0x2911e50d), + Register64(0x61e48eae, 0x27121a91), + Register64(0x4d62f7ad, 0x31859808), + Register64(0xeceba345, 0xef5ceaeb), + Register64(0xf5ceb25e, 0xbc9684ce), + Register64(0xf633e20c, 0xb7f76221), + Register64(0xa32cdf06, 0xab8293e4), + Register64(0x985a202c, 0xa5ee2ca4), + Register64(0xcf0b8447, 0xcc8a8fb1), + Register64(0x9f765244, 0x979859a3), + Register64(0xa8d516b1, 0xa1240017), + Register64(0x0bd7ba3e, 0xbb5dc726), + Register64(0xe54bca55, 0xb86adb39), + Register64(0x1d7a3afd, 0x6c478063), + Register64(0x519ec608, 0xe7669edd), + Register64(0x0e5715a2, 0xd149aa23), + Register64(0x177d4571, 0x848ff194), + Register64(0xeeb55f32, 0x41014c22), + Register64(0x0f5e5ca1, 0x3a6e2ec2), + Register64(0x8029927b, 0x75f5c361), + Register64(0xad139fab, 0xc3d6e436), + Register64(0x0d5df1a9, 0x4ccf402f), + Register64(0x3e8bd948, 0xbea5dfc8), + Register64(0xa5a0d357, 0xbd3ff77e), + Register64(0xa2d12e25, 0x1f74f645), + Register64(0x66fd9e52, 0x5e81a082), + Register64(0x2e0c90ce, 0x7f687a49), + Register64(0xc2e8bcbe, 0xba973bc5), + Register64(0x000001bc, 0xe509745f), + Register64(0x423777bb, 0xe6dab3d6), + Register64(0xd1661c7e, 0xaef06eb5), + Register64(0xa1781f35, 0x4daacfd8), + Register64(0x2d11284a, 0x2b16affc), + Register64(0xf1fc4f67, 0xfa891d1f), + Register64(0x73ecc25d, 0xcb920ada), + Register64(0xae610c22, 0xc2a12651), + Register64(0x96e0a810, 0xd356b78a), + Register64(0x5a9a381f, 0x2fe7870f), + Register64(0xd5ad62ed, 0xe94e5530), + Register64(0xd225e5e8, 0x368d1427), + Register64(0x65977b70, 0xc7af4631), + Register64(0x99f889b2, 0xde39d74f), + Register64(0x233f30bf, 0x54e1d143), + Register64(0x9a9675d3, 0xd9a63c97), + Register64(0x5470554f, 0xf334f9a8), + Register64(0x166acb74, 0x4a4f5688), + Register64(0x70c74caa, 0xb2e4aead), + Register64(0xf0d09164, 0x6f294d12), + Register64(0x57b82a89, 0x684031d1), + Register64(0xefd95a5a, 0x61be0b6b), + Register64(0x2fbd12e9, 0x69f2f29a), + Register64(0x9bd37013, 0xfeff9fe8), + Register64(0x3f9b0404, 0xd6085a06), + Register64(0x4940c1f3, 0x166cfe15), + Register64(0x09542c4d, 0xcdf3defb), + Register64(0xb4c52183, 0x85cd5ce3), + Register64(0xc935b7dc, 0x4462a641), + Register64(0x3417f8a6, 0x8ed3b63f), + Register64(0xb8095929, 0x5b215b40), + Register64(0xf99cdaef, 0x3b8c8572), + Register64(0x018c0614, 0xf8fcb95d), + Register64(0x1b14accd, 0x1a3acdf3), + Register64(0x84d471f2, 0x00bb732d), + Register64(0xc1a3110e, 0x95e8da16), + Register64(0x430a7220, 0xbf1a82b8), + Register64(0xb77e090d, 0x39df210e), + Register64(0x5ef4bd9f, 0x3cd05e9d), + Register64(0x9d4ff6da, 0x7e57a444), + Register64(0xda1d60e1, 0x83d4a5f8), + Register64(0xb287c384, 0x17998e47), + Register64(0xfe3edc12, 0x1bb31886), + Register64(0xc7fe3ccc, 0x980ccbef), + Register64(0xe46fb590, 0x189bfd03), + Register64(0x3732fd46, 0x9a4c57dc), + Register64(0x7ef700a0, 0x7cf1ad65), + Register64(0x59c64468, 0xa31d8859), + Register64(0x762fb0b4, 0xd45b61f6), + Register64(0x155baed0, 0x99047718), + Register64(0x68755e4c, 0x3d50baa6), + Register64(0xe9214e7f, 0x22d8b4df), + Register64(0x2addbf53, 0x2eac95f4), + Register64(0x32ae3909, 0xb4bd0109), + Register64(0x834df537, 0xb08e3450), + Register64(0xfa209da8, 0x4220728d), + Register64(0x9e691d9b, 0x9efe23f7), + Register64(0x0446d288, 0xc4ae8d7f), + Register64(0x7b4cc524, 0xe169785b), + Register64(0x21d87f01, 0x35ca1385), + Register64(0xcebb400f, 0x137b8aa5), + Register64(0x272e2b66, 0x580796be), + Register64(0x36122641, 0x25c2b0de), + Register64(0x057702bd, 0xad1efbb2), + Register64(0xd4babb8e, 0xacf84be9), + Register64(0x91583139, 0x641bc67b), + Register64(0x8bdc2de0, 0x8036e024), + Register64(0x603c8156, 0xf49f68ed), + Register64(0xf7d236f7, 0xdbef5111), + Register64(0x9727c459, 0x8ad21e80), + Register64(0xa08a0896, 0x670a5fd7), + Register64(0xcb4a8f43, 0x09eba9cb), + Register64(0x81af564b, 0x0f7036a1), + Register64(0xc0b99aa7, 0x78199abd), + Register64(0x959f1ec8, 0x3fc8e952), + Register64(0x8c505077, 0x794a81b9), + Register64(0x3acaaf8f, 0x056338f0), + Register64(0x07b43f50, 0x627a6778), + Register64(0x4a44ab49, 0xf5eccc77), + Register64(0x3bc3d6e4, 0xb679ee98), + Register64(0x9cc0d4d1, 0xcf14108c), + Register64(0x4406c00b, 0x206bc8a0), + Register64(0x82a18854, 0xc8d72d89), + Register64(0x67e366b3, 0x5c3c432c), + Register64(0xb923dd61, 0x102b37f2), + Register64(0x56ab2779, 0xd884271d), + Register64(0xbe83e1b0, 0xff1525af), + Register64(0xfb7c65d4, 0x217e49a9), + Register64(0x6bdbe0e7, 0x6d48e7d4), + Register64(0x08df8287, 0x45d9179e), + Register64(0x22ea6a9a, 0xdd53bd34), + Register64(0xe36e141c, 0x5622200a), + Register64(0x7f805d1b, 0x8cb750ee), + Register64(0xafe5c7a5, 0x9f58e837), + Register64(0xe27f996a, 0x4fb1c23c), + Register64(0xd3867dfb, 0x0775f0d0), + Register64(0xd0e673de, 0x6e88891a), + Register64(0x123aeb9e, 0xafb86c25), + Register64(0x30f1d5d5, 0xc145b895), + Register64(0xbb434a2d, 0xee7269e7), + Register64(0x78cb67ec, 0xf931fa38), + Register64(0xf33b0372, 0x323bbf9c), + Register64(0x52d66336, 0xfb279c74), + Register64(0x505f33ac, 0x0afb4eaa), + Register64(0xe8a5cd99, 0xa2cce187), + Register64(0x53497480, 0x1e2d30bb), + Register64(0x8d2d5711, 0xd5876d90), + Register64(0x1f1a4128, 0x91bc038e), + Register64(0xd6e2e71d, 0x82e56648), + Register64(0x74036c3a, 0x497732b7), + Register64(0x89b67ed9, 0x6361f5ab), + Register64(0xffed95d8, 0xf1ea02a2), + Register64(0xe72b3bd6, 0x1464d43d), + Register64(0xa6300f17, 0x0bdc4820), + Register64(0xebc18760, 0xed78a77a), +]; + +final _t2 = [ + Register64(0xe6a6be5a, 0x05a12138), + Register64(0xb5a122a5, 0xb4f87c98), + Register64(0x563c6089, 0x140b6990), + Register64(0x4c46cb2e, 0x391f5dd5), + Register64(0xd932addb, 0xc9b79434), + Register64(0x08ea70e4, 0x2015aff5), + Register64(0xd765a667, 0x3e478cf1), + Register64(0xc4fb757e, 0xab278d99), + Register64(0xdf11c686, 0x2d6e0692), + Register64(0xddeb84f1, 0x0d7f3b16), + Register64(0x6f2ef604, 0xa665ea04), + Register64(0x4a8e0f0f, 0xf0e0dfb3), + Register64(0xa5edeef8, 0x3dbcba51), + Register64(0xfc4f0a2a, 0x0ea4371e), + Register64(0xe83e1da8, 0x5cb38429), + Register64(0xdc8ff882, 0xba1b1ce2), + Register64(0xcd45505e, 0x8353e80d), + Register64(0x18d19a00, 0xd4db0717), + Register64(0x34a0cfed, 0xa5f38101), + Register64(0x0be77e51, 0x8887caf2), + Register64(0x1e341438, 0xb3c45136), + Register64(0xe05797f4, 0x9089ccf9), + Register64(0xffd23f9d, 0xf2591d14), + Register64(0x543dda22, 0x8595c5cd), + Register64(0x661f81fd, 0x99052a33), + Register64(0x8736e641, 0xdb0f7b76), + Register64(0x15227725, 0x418e5307), + Register64(0xe25f7f46, 0x162eb2fa), + Register64(0x48a8b212, 0x6c13d9fe), + Register64(0xafdc5417, 0x92e76eea), + Register64(0x03d912bf, 0xc6d1898f), + Register64(0x31b1aafa, 0x1b83f51b), + Register64(0xf1ac2796, 0xe42ab7d9), + Register64(0x40a3a7d7, 0xfcd2ebac), + Register64(0x1056136d, 0x0afbbcc5), + Register64(0x7889e1dd, 0x9a6d0c85), + Register64(0xd3352578, 0x2a7974aa), + Register64(0xa7e25d09, 0x078ac09b), + Register64(0xbd4138b3, 0xeac6edd0), + Register64(0x920abfbe, 0x71eb9e70), + Register64(0xa2a5d0f5, 0x4fc2625c), + Register64(0xc054e36b, 0x0b1290a3), + Register64(0xf6dd59ff, 0x62fe932b), + Register64(0x35373545, 0x11a8ac7d), + Register64(0xca845e91, 0x72fadcd4), + Register64(0x84f82b60, 0x329d20dc), + Register64(0x79c62ce1, 0xcd672f18), + Register64(0x8b09a2ad, 0xd124642c), + Register64(0xd0c1e96a, 0x19d9e726), + Register64(0x5a786a9b, 0x4ba9500c), + Register64(0x0e020336, 0x634c43f3), + Register64(0xc17b474a, 0xeb66d822), + Register64(0x6a731ae3, 0xec9baac2), + Register64(0x8226667a, 0xe0840258), + Register64(0x67d45676, 0x91caeca5), + Register64(0x1d94155c, 0x4875adb5), + Register64(0x6d00fd98, 0x5b813fdf), + Register64(0x51286efc, 0xb774cd06), + Register64(0x5e883447, 0x1fa744af), + Register64(0xf72ca0ae, 0xe761ae2e), + Register64(0xbe40e4cd, 0xaee8e09a), + Register64(0xe9970bbb, 0x5118f665), + Register64(0x726e4beb, 0x33df1964), + Register64(0x703b0007, 0x29199762), + Register64(0x4631d816, 0xf5ef30a7), + Register64(0xb880b5b5, 0x1504a6be), + Register64(0x641793c3, 0x7ed84b6c), + Register64(0x7b21ed77, 0xf6e97d96), + Register64(0x77630631, 0x2ef96b73), + Register64(0xae528948, 0xe86ff3f4), + Register64(0x53dbd7f2, 0x86a3f8f8), + Register64(0x16cadce7, 0x4cfc1063), + Register64(0x005c19bd, 0xfa52c6dd), + Register64(0x68868f5d, 0x64d46ad3), + Register64(0x3a9d512c, 0xcf1e186a), + Register64(0x367e62c2, 0x385660ae), + Register64(0xe359e7ea, 0x77dcb1d7), + Register64(0x526c0773, 0x749abe6e), + Register64(0x735ae5f9, 0xd09f734b), + Register64(0x493fc7cc, 0x8a558ba8), + Register64(0xb0b9c153, 0x3041ab45), + Register64(0x321958ba, 0x470a59bd), + Register64(0x852db00b, 0x5f46c393), + Register64(0x91209b2b, 0xd336b0e5), + Register64(0x6e604f7d, 0x659ef19f), + Register64(0xb99a8ae2, 0x782ccb24), + Register64(0xccf52ab6, 0xc814c4c7), + Register64(0x4727d9af, 0xbe11727b), + Register64(0x7e950d0c, 0x0121b34d), + Register64(0x756f4356, 0x70ad471f), + Register64(0xf5add442, 0x615a6849), + Register64(0x4e87e099, 0x80b9957a), + Register64(0x2acfa1df, 0x50aee355), + Register64(0xd898263a, 0xfd2fd556), + Register64(0xc8f4924d, 0xd80c8fd6), + Register64(0xcf99ca3d, 0x754a173a), + Register64(0xfe477bac, 0xaf91bf3c), + Register64(0xed5371f6, 0xd690c12d), + Register64(0x831a5c28, 0x5e687094), + Register64(0xc5d3c90a, 0x3708a0a4), + Register64(0x0f7f9037, 0x17d06580), + Register64(0x19f9bb13, 0xb8fdf27f), + Register64(0xb1bd6f1b, 0x4d502843), + Register64(0x1c761ba3, 0x8fff4012), + Register64(0x0d1530c4, 0xe2e21f3b), + Register64(0x8943ce69, 0xa7372c8a), + Register64(0xe5184e11, 0xfeb5ce66), + Register64(0x618bdb80, 0xbd736621), + Register64(0x7d29bad6, 0x8b574d0b), + Register64(0x81bb613e, 0x25e6fe5b), + Register64(0x071c9c10, 0xbc07913f), + Register64(0xc7beeb79, 0x09ac2d97), + Register64(0xc3e58d35, 0x3bc5d757), + Register64(0xeb017892, 0xf38f61e8), + Register64(0xd4effb9c, 0x9b1cc21a), + Register64(0x99727d26, 0xf494f7ab), + Register64(0xa3e063a2, 0x956b3e03), + Register64(0x9d4a8b9a, 0x4aa09c30), + Register64(0x3f6ab7d5, 0x00090fb4), + Register64(0x9cc0f2a0, 0x57268ac0), + Register64(0x3dee9d2d, 0xedbf42d1), + Register64(0x330f49c8, 0x7960a972), + Register64(0xc6b27202, 0x87421b41), + Register64(0x0ac59ec0, 0x7c00369c), + Register64(0xef4eac49, 0xcb353425), + Register64(0xf450244e, 0xef0129d8), + Register64(0x8acc46e5, 0xcaf4deb6), + Register64(0x2ffeab63, 0x989263f7), + Register64(0x8f7cb9fe, 0x5d7a4578), + Register64(0x5bd8f764, 0x4e634635), + Register64(0x427a7315, 0xbf2dc900), + Register64(0x17d0c4aa, 0x2125261c), + Register64(0x3992486c, 0x93518e50), + Register64(0xb4cbfee0, 0xa2d7d4c3), + Register64(0x7c75d620, 0x2c5ddd8d), + Register64(0xdbc295d8, 0xe35b6c61), + Register64(0x60b369d3, 0x02032b19), + Register64(0xce42685f, 0xdce44132), + Register64(0x06f3ddb9, 0xddf65610), + Register64(0x8ea4d21d, 0xb5e148f0), + Register64(0x20b0fce6, 0x2fcd496f), + Register64(0x2c1b9123, 0x58b0ee31), + Register64(0xb28317b8, 0x18f5a308), + Register64(0xa89c1e18, 0x9ca6d2cf), + Register64(0x0c6b1857, 0x6aaadbc8), + Register64(0xb65deaa9, 0x1299fae3), + Register64(0xfb2b794b, 0x7f1027e7), + Register64(0x04e4317f, 0x443b5beb), + Register64(0x4b852d32, 0x5939d0a6), + Register64(0xd5ae6bee, 0xfb207ffc), + Register64(0x309682b2, 0x81c7d374), + Register64(0xbae309a1, 0x94c3b475), + Register64(0x8cc3f97b, 0x13b49f05), + Register64(0x98a9422f, 0xf8293967), + Register64(0x244b16b0, 0x1076ff7c), + Register64(0xf8bf571c, 0x663d67ee), + Register64(0x1f0d6758, 0xeee30da1), + Register64(0xc9b611d9, 0x7adeb9b7), + Register64(0xb7afd588, 0x7b6c57a2), + Register64(0x6290ae84, 0x6b984fe1), + Register64(0x94df4cde, 0xacc1a5fd), + Register64(0x058a5bd1, 0xc5483aff), + Register64(0x63166cc1, 0x42ba3c37), + Register64(0x8db8526e, 0xb2f76f40), + Register64(0xe1088003, 0x6f0d6d4e), + Register64(0x9e0523c9, 0x971d311d), + Register64(0x45ec2824, 0xcc7cd691), + Register64(0x575b8359, 0xe62382c9), + Register64(0xfa9e400d, 0xc4889995), + Register64(0xd1823ecb, 0x45721568), + Register64(0xdafd983b, 0x8206082f), + Register64(0xaa7d2908, 0x2386a8cb), + Register64(0x269fcd44, 0x03b87588), + Register64(0x1b91f5f7, 0x28bdd1e0), + Register64(0xe4669f39, 0x040201f6), + Register64(0x7a1d7c21, 0x8cf04ade), + Register64(0x65623c29, 0xd79ce5ce), + Register64(0x23684490, 0x96c00bb1), + Register64(0xab9bf187, 0x9da503ba), + Register64(0xbc23ecb1, 0xa458058e), + Register64(0x9a58df01, 0xbb401ecc), + Register64(0xa070e868, 0xa85f143d), + Register64(0x4ff18830, 0x7df2239e), + Register64(0x14d565b4, 0x1a641183), + Register64(0xee133374, 0x52701602), + Register64(0x950e3dcf, 0x3f285e09), + Register64(0x59930254, 0xb9c80953), + Register64(0x3bf29940, 0x8930da6d), + Register64(0xa955943f, 0x53691387), + Register64(0xa15edeca, 0xa9cb8784), + Register64(0x29142127, 0x352be9a0), + Register64(0x76f0371f, 0xff4e7afb), + Register64(0x0239f450, 0x274f2228), + Register64(0xbb073af0, 0x1d5e868b), + Register64(0xbfc80571, 0xc10e96c1), + Register64(0xd2670885, 0x68222e23), + Register64(0x9671a3d4, 0x8e80b5b0), + Register64(0x55b5d38a, 0xe193bb81), + Register64(0x693ae2d0, 0xa18b04b8), + Register64(0x5c48b4ec, 0xadd5335f), + Register64(0xfd743b19, 0x4916a1ca), + Register64(0x25770181, 0x34be98c4), + Register64(0xe77987e8, 0x3c54a4ad), + Register64(0x28e11014, 0xda33e1b9), + Register64(0x270cc59e, 0x226aa213), + Register64(0x71495f75, 0x6d1a5f60), + Register64(0x9be853fb, 0x60afef77), + Register64(0xadc786a7, 0xf7443dbf), + Register64(0x09044561, 0x73b29a82), + Register64(0x58bc7a66, 0xc232bd5e), + Register64(0xf306558c, 0x673ac8b2), + Register64(0x41f639c6, 0xb6c9772a), + Register64(0x216defe9, 0x9fda35da), + Register64(0x11640cc7, 0x1c7be615), + Register64(0x93c43694, 0x565c5527), + Register64(0xea038e62, 0x46777839), + Register64(0xf9abf3ce, 0x5a3e2469), + Register64(0x741e768d, 0x0fd312d2), + Register64(0x0144b883, 0xced652c6), + Register64(0xc20b5a5b, 0xa33f8552), + Register64(0x1ae69633, 0xc3435a9d), + Register64(0x97a28ca4, 0x088cfdec), + Register64(0x8824a43c, 0x1e96f420), + Register64(0x37612fa6, 0x6eeea746), + Register64(0x6b4cb165, 0xf9cf0e5a), + Register64(0x43aa1c06, 0xa0abfb4a), + Register64(0x7f4dc26f, 0xf162796b), + Register64(0x6cbacc8e, 0x54ed9b0f), + Register64(0xa6b7ffef, 0xd2bb253e), + Register64(0x2e25bc95, 0xb0a29d4f), + Register64(0x86d6a58b, 0xdef1388c), + Register64(0xded74ac5, 0x76b6f054), + Register64(0x8030bdbc, 0x2b45805d), + Register64(0x3c81af70, 0xe94d9289), + Register64(0x3eff6dda, 0x9e3100db), + Register64(0xb38dc39f, 0xdfcc8847), + Register64(0x12388552, 0x8d17b87e), + Register64(0xf2da0ed2, 0x40b1b642), + Register64(0x44cefadc, 0xd54bf9a9), + Register64(0x1312200e, 0x433c7ee6), + Register64(0x9ffcc84f, 0x3a78c748), + Register64(0xf0cd1f72, 0x248576bb), + Register64(0xec697405, 0x3638cfe4), + Register64(0x2ba7b67c, 0x0cec4e4c), + Register64(0xac2f4df3, 0xe5ce32ed), + Register64(0xcb33d143, 0x26ea4c11), + Register64(0xa4e9044c, 0xc77e58bc), + Register64(0x5f513293, 0xd934fcef), + Register64(0x5dc96455, 0x06e55444), + Register64(0x50de418f, 0x317de40a), + Register64(0x388cb31a, 0x69dde259), + Register64(0x2db4a834, 0x55820a86), + Register64(0x9010a91e, 0x84711ae9), + Register64(0x4df7f0b7, 0xb1498371), + Register64(0xd62a2eab, 0xc0977179), + Register64(0x22fac097, 0xaa8d5c0e), +]; + +final _t3 = [ + Register64(0xf49fcc2f, 0xf1daf39b), + Register64(0x487fd5c6, 0x6ff29281), + Register64(0xe8a30667, 0xfcdca83f), + Register64(0x2c9b4be3, 0xd2fcce63), + Register64(0xda3ff74b, 0x93fbbbc2), + Register64(0x2fa165d2, 0xfe70ba66), + Register64(0xa103e279, 0x970e93d4), + Register64(0xbecdec77, 0xb0e45e71), + Register64(0xcfb41e72, 0x3985e497), + Register64(0xb70aaa02, 0x5ef75017), + Register64(0xd42309f0, 0x3840b8e0), + Register64(0x8efc1ad0, 0x35898579), + Register64(0x96c6920b, 0xe2b2abc5), + Register64(0x66af4163, 0x375a9172), + Register64(0x2174abdc, 0xca7127fb), + Register64(0xb33ccea6, 0x4a72ff41), + Register64(0xf04a4933, 0x083066a5), + Register64(0x8d970acd, 0xd7289af5), + Register64(0x8f96e8e0, 0x31c8c25e), + Register64(0xf3fec022, 0x76875d47), + Register64(0xec7bf310, 0x056190dd), + Register64(0xf5adb0ae, 0xbb0f1491), + Register64(0x9b50f885, 0x0fd58892), + Register64(0x49754883, 0x58b74de8), + Register64(0xa3354ff6, 0x91531c61), + Register64(0x0702bbe4, 0x81d2c6ee), + Register64(0x89fb2405, 0x7deded98), + Register64(0xac307513, 0x8596e902), + Register64(0x1d2d3580, 0x172772ed), + Register64(0xeb738fc2, 0x8e6bc30d), + Register64(0x5854ef8f, 0x63044326), + Register64(0x9e5c5232, 0x5add3bbe), + Register64(0x90aa53cf, 0x325c4623), + Register64(0xc1d24d51, 0x349dd067), + Register64(0x2051cfee, 0xa69ea624), + Register64(0x13220f0a, 0x862e7e4f), + Register64(0xce393994, 0x04e04864), + Register64(0xd9c42ca4, 0x7086fcb7), + Register64(0x685ad223, 0x8a03e7cc), + Register64(0x066484b2, 0xab2ff1db), + Register64(0xfe9d5d70, 0xefbf79ec), + Register64(0x5b13b9dd, 0x9c481854), + Register64(0x15f0d475, 0xed1509ad), + Register64(0x0bebcd06, 0x0ec79851), + Register64(0xd58c6791, 0x183ab7f8), + Register64(0xd1187c50, 0x52f3eee4), + Register64(0xc95d1192, 0xe54e82ff), + Register64(0x86eea14c, 0xb9ac6ca2), + Register64(0x3485beb1, 0x53677d5d), + Register64(0xdd191d78, 0x1f8c492a), + Register64(0xf60866ba, 0xa784ebf9), + Register64(0x518f643b, 0xa2d08c74), + Register64(0x8852e956, 0xe1087c22), + Register64(0xa768cb8d, 0xc410ae8d), + Register64(0x38047726, 0xbfec8e1a), + Register64(0xa67738b4, 0xcd3b45aa), + Register64(0xad16691c, 0xec0dde19), + Register64(0xc6d43193, 0x80462e07), + Register64(0xc5a5876d, 0x0ba61938), + Register64(0x16b9fa1f, 0xa58fd840), + Register64(0x188ab117, 0x3ca74f18), + Register64(0xabda2f98, 0xc99c021f), + Register64(0x3e0580ab, 0x134ae816), + Register64(0x5f3b05b7, 0x73645abb), + Register64(0x2501a2be, 0x5575f2f6), + Register64(0x1b2f7400, 0x4e7e8ba9), + Register64(0x1cd75803, 0x71e8d953), + Register64(0x7f6ed895, 0x62764e30), + Register64(0xb15926ff, 0x596f003d), + Register64(0x9f65293d, 0xa8c5d6b9), + Register64(0x6ecef04d, 0xd690f84c), + Register64(0x4782275f, 0xff33af88), + Register64(0xe4143308, 0x3f820801), + Register64(0xfd0dfe40, 0x9a1af9b5), + Register64(0x4325a334, 0x2cdb396b), + Register64(0x8ae77e62, 0xb301b252), + Register64(0xc36f9e9f, 0x6655615a), + Register64(0x85455a2d, 0x92d32c09), + Register64(0xf2c7dea9, 0x49477485), + Register64(0x63cfb4c1, 0x33a39eba), + Register64(0x83b040cc, 0x6ebc5462), + Register64(0x3b9454c8, 0xfdb326b0), + Register64(0x56f56a9e, 0x87ffd78c), + Register64(0x2dc2940d, 0x99f42bc6), + Register64(0x98f7df09, 0x6b096e2d), + Register64(0x19a6e01e, 0x3ad852bf), + Register64(0x42a99ccb, 0xdbd4b40b), + Register64(0xa59998af, 0x45e9c559), + Register64(0x366295e8, 0x07d93186), + Register64(0x6b48181b, 0xfaa1f773), + Register64(0x1fec57e2, 0x157a0a1d), + Register64(0x4667446a, 0xf6201ad5), + Register64(0xe615ebca, 0xcfb0f075), + Register64(0xb8f31f4f, 0x68290778), + Register64(0x22713ed6, 0xce22d11e), + Register64(0x3057c1a7, 0x2ec3c93b), + Register64(0xcb46acc3, 0x7c3f1f2f), + Register64(0xdbb893fd, 0x02aaf50e), + Register64(0x331fd92e, 0x600b9fcf), + Register64(0xa498f961, 0x48ea3ad6), + Register64(0xa8d8426e, 0x8b6a83ea), + Register64(0xa089b274, 0xb7735cdc), + Register64(0x87f6b373, 0x1e524a11), + Register64(0x118808e5, 0xcbc96749), + Register64(0x9906e4c7, 0xb19bd394), + Register64(0xafed7f7e, 0x9b24a20c), + Register64(0x6509eade, 0xeb3644a7), + Register64(0x6c1ef1d3, 0xe8ef0ede), + Register64(0xb9c97d43, 0xe9798fb4), + Register64(0xa2f2d784, 0x740c28a3), + Register64(0x7b849647, 0x6197566f), + Register64(0x7a5be3e6, 0xb65f069d), + Register64(0xf96330ed, 0x78be6f10), + Register64(0xeee60de7, 0x7a076a15), + Register64(0x2b4bee4a, 0xa08b9bd0), + Register64(0x6a56a63e, 0xc7b8894e), + Register64(0x02121359, 0xba34fef4), + Register64(0x4cbf99f8, 0x283703fc), + Register64(0x39807135, 0x0caf30c8), + Register64(0xd0a77a89, 0xf017687a), + Register64(0xf1c1a9eb, 0x9e423569), + Register64(0x8c797628, 0x2dee8199), + Register64(0x5d1737a5, 0xdd1f7abd), + Register64(0x4f53433c, 0x09a9fa80), + Register64(0xfa8b0c53, 0xdf7ca1d9), + Register64(0x3fd9dcbc, 0x886ccb77), + Register64(0xc040917c, 0xa91b4720), + Register64(0x7dd00142, 0xf9d1dcdf), + Register64(0x8476fc1d, 0x4f387b58), + Register64(0x23f8e7c5, 0xf3316503), + Register64(0x032a2244, 0xe7e37339), + Register64(0x5c87a5d7, 0x50f5a74b), + Register64(0x082b4cc4, 0x3698992e), + Register64(0xdf917bec, 0xb858f63c), + Register64(0x3270b8fc, 0x5bf86dda), + Register64(0x10ae72bb, 0x29b5dd76), + Register64(0x576ac94e, 0x7700362b), + Register64(0x1ad112da, 0xc61efb8f), + Register64(0x691bc30e, 0xc5faa427), + Register64(0xff246311, 0xcc327143), + Register64(0x3142368e, 0x30e53206), + Register64(0x71380e31, 0xe02ca396), + Register64(0x958d5c96, 0x0aad76f1), + Register64(0xf8d6f430, 0xc16da536), + Register64(0xc8ffd13f, 0x1be7e1d2), + Register64(0x7578ae66, 0x004ddbe1), + Register64(0x05833f01, 0x067be646), + Register64(0xbb34b5ad, 0x3bfe586d), + Register64(0x095f34c9, 0xa12b97f0), + Register64(0x247ab645, 0x25d60ca8), + Register64(0xdcdbc6f3, 0x017477d1), + Register64(0x4a2e14d4, 0xdecad24d), + Register64(0xbdb5e6d9, 0xbe0a1eeb), + Register64(0x2a7e70f7, 0x794301ab), + Register64(0xdef42d8a, 0x270540fd), + Register64(0x01078ec0, 0xa34c22c1), + Register64(0xe5de511a, 0xf4c16387), + Register64(0x7ebb3a52, 0xbd9a330a), + Register64(0x77697857, 0xaa7d6435), + Register64(0x004e8316, 0x03ae4c32), + Register64(0xe7a21020, 0xad78e312), + Register64(0x9d41a70c, 0x6ab420f2), + Register64(0x28e06c18, 0xea1141e6), + Register64(0xd2b28cbd, 0x984f6b28), + Register64(0x26b75f6c, 0x446e9d83), + Register64(0xba47568c, 0x4d418d7f), + Register64(0xd80badbf, 0xe6183d8e), + Register64(0x0e206d7f, 0x5f166044), + Register64(0xe258a439, 0x11cbca3e), + Register64(0x723a1746, 0xb21dc0bc), + Register64(0xc7caa854, 0xf5d7cdd3), + Register64(0x7cac3288, 0x3d261d9c), + Register64(0x7690c264, 0x23ba942c), + Register64(0x17e55524, 0x478042b8), + Register64(0xe0be4776, 0x56a2389f), + Register64(0x4d289b5e, 0x67ab2da0), + Register64(0x44862b9c, 0x8fbbfd31), + Register64(0xb47cc804, 0x9d141365), + Register64(0x822c1b36, 0x2b91c793), + Register64(0x4eb14655, 0xfb13dfd8), + Register64(0x1ecbba07, 0x14e2a97b), + Register64(0x6143459d, 0x5cde5f14), + Register64(0x53a8fbf1, 0xd5f0ac89), + Register64(0x97ea04d8, 0x1c5e5b00), + Register64(0x622181a8, 0xd4fdb3f3), + Register64(0xe9bcd341, 0x572a1208), + Register64(0x14112586, 0x43cce58a), + Register64(0x9144c5fe, 0xa4c6e0a4), + Register64(0x0d33d065, 0x65cf620f), + Register64(0x54a48d48, 0x9f219ca1), + Register64(0xc43e5eac, 0x6d63c821), + Register64(0xa9728b3a, 0x72770daf), + Register64(0xd7934e7b, 0x20df87ef), + Register64(0xe35503b6, 0x1a3e86e5), + Register64(0xcae321fb, 0xc819d504), + Register64(0x129a50b3, 0xac60bfa6), + Register64(0xcd5e68ea, 0x7e9fb6c3), + Register64(0xb01c9019, 0x9483b1c7), + Register64(0x3de93cd5, 0xc295376c), + Register64(0xaed52edf, 0x2ab9ad13), + Register64(0x2e60f512, 0xc0a07884), + Register64(0xbc3d86a3, 0xe36210c9), + Register64(0x35269d9b, 0x163951ce), + Register64(0x0c7d6e2a, 0xd0cdb5fa), + Register64(0x59e86297, 0xd87f5733), + Register64(0x298ef221, 0x898db0e7), + Register64(0x55000029, 0xd1a5aa7e), + Register64(0x8bc08ae1, 0xb5061b45), + Register64(0xc2c31c2b, 0x6c92703a), + Register64(0x94cc596b, 0xaf25ef42), + Register64(0x0a1d73db, 0x22540456), + Register64(0x04b6a0f9, 0xd9c4179a), + Register64(0xeffdafa2, 0xae3d3c60), + Register64(0xf7c8075b, 0xb49496c4), + Register64(0x9cc5c714, 0x1d1cd4e3), + Register64(0x78bd1638, 0x218e5534), + Register64(0xb2f11568, 0xf850246a), + Register64(0xedfabcfa, 0x9502bc29), + Register64(0x796ce5f2, 0xda23051b), + Register64(0xaae128b0, 0xdc93537c), + Register64(0x3a493da0, 0xee4b29ae), + Register64(0xb5df6b2c, 0x416895d7), + Register64(0xfcabbd25, 0x122d7f37), + Register64(0x70810b58, 0x105dc4b1), + Register64(0xe10fdd37, 0xf7882a90), + Register64(0x524dcab5, 0x518a3f5c), + Register64(0x3c9e8587, 0x8451255b), + Register64(0x40298281, 0x19bd34e2), + Register64(0x74a05b6f, 0x5d3ceccb), + Register64(0xb6100215, 0x42e13eca), + Register64(0x0ff979d1, 0x2f59e2ac), + Register64(0x6037da27, 0xe4f9cc50), + Register64(0x5e92975a, 0x0df1847d), + Register64(0xd66de190, 0xd3e623fe), + Register64(0x5032d6b8, 0x7b568048), + Register64(0x9a36b7ce, 0x8235216e), + Register64(0x80272a7a, 0x24f64b4a), + Register64(0x93efed8b, 0x8c6916f7), + Register64(0x37ddbff4, 0x4cce1555), + Register64(0x4b95db5d, 0x4b99bd25), + Register64(0x92d3fda1, 0x69812fc0), + Register64(0xfb1a4a9a, 0x90660bb6), + Register64(0x730c1969, 0x46a4b9b2), + Register64(0x81e289aa, 0x7f49da68), + Register64(0x64669a0f, 0x83b1a05f), + Register64(0x27b3ff7d, 0x9644f48b), + Register64(0xcc6b615c, 0x8db675b3), + Register64(0x674f20b9, 0xbcebbe95), + Register64(0x6f312382, 0x75655982), + Register64(0x5ae48871, 0x3e45cf05), + Register64(0xbf619f99, 0x54c21157), + Register64(0xeabac460, 0x40a8eae9), + Register64(0x454c6fe9, 0xf2c0c1cd), + Register64(0x419cf649, 0x6412691c), + Register64(0xd3dc3bef, 0x265b0f70), + Register64(0x6d0e60f5, 0xc3578a9e), +]; + +final _t4 = [ + Register64(0x5b0e6085, 0x26323c55), + Register64(0x1a46c1a9, 0xfa1b59f5), + Register64(0xa9e245a1, 0x7c4c8ffa), + Register64(0x65ca5159, 0xdb2955d7), + Register64(0x05db0a76, 0xce35afc2), + Register64(0x81eac77e, 0xa9113d45), + Register64(0x528ef88a, 0xb6ac0a0d), + Register64(0xa09ea253, 0x597be3ff), + Register64(0x430ddfb3, 0xac48cd56), + Register64(0xc4b3a67a, 0xf45ce46f), + Register64(0x4ececfd8, 0xfbe2d05e), + Register64(0x3ef56f10, 0xb39935f0), + Register64(0x0b22d682, 0x9cd619c6), + Register64(0x17fd460a, 0x74df2069), + Register64(0x6cf8cc8e, 0x8510ed40), + Register64(0xd6c824bf, 0x3a6ecaa7), + Register64(0x61243d58, 0x1a817049), + Register64(0x048bacb6, 0xbbc163a2), + Register64(0xd9a38ac2, 0x7d44cc32), + Register64(0x7fddff5b, 0xaaf410ab), + Register64(0xad6d495a, 0xa804824b), + Register64(0xe1a6a74f, 0x2d8c9f94), + Register64(0xd4f78512, 0x35dee8e3), + Register64(0xfd4b7f88, 0x6540d893), + Register64(0x247c2004, 0x2aa4bfda), + Register64(0x096ea1c5, 0x17d1327c), + Register64(0xd56966b4, 0x361a6685), + Register64(0x277da5c3, 0x1221057d), + Register64(0x94d59893, 0xa43acff7), + Register64(0x64f0c51c, 0xcdc02281), + Register64(0x3d33bcc4, 0xff6189db), + Register64(0xe005cb18, 0x4ce66af1), + Register64(0xff5ccd1d, 0x1db99bea), + Register64(0xb0b854a7, 0xfe42980f), + Register64(0x7bd46a6a, 0x718d4b9f), + Register64(0xd10fa8cc, 0x22a5fd8c), + Register64(0xd3148495, 0x2be4bd31), + Register64(0xc7fa975f, 0xcb243847), + Register64(0x4886ed1e, 0x5846c407), + Register64(0x28cddb79, 0x1eb70b04), + Register64(0xc2b00be2, 0xf573417f), + Register64(0x5c959045, 0x2180f877), + Register64(0x7a6bddff, 0xf370eb00), + Register64(0xce509e38, 0xd6d9d6a4), + Register64(0xebeb0f00, 0x647fa702), + Register64(0x1dcc06cf, 0x76606f06), + Register64(0xe4d9f28b, 0xa286ff0a), + Register64(0xd85a305d, 0xc918c262), + Register64(0x475b1d87, 0x32225f54), + Register64(0x2d4fb516, 0x68ccb5fe), + Register64(0xa679b9d9, 0xd72bba20), + Register64(0x53841c0d, 0x912d43a5), + Register64(0x3b7eaa48, 0xbf12a4e8), + Register64(0x781e0e47, 0xf22f1ddf), + Register64(0xeff20ce6, 0x0ab50973), + Register64(0x20d261d1, 0x9dffb742), + Register64(0x16a12b03, 0x062a2e39), + Register64(0x1960eb22, 0x39650495), + Register64(0x251c16fe, 0xd50eb8b8), + Register64(0x9ac0c330, 0xf826016e), + Register64(0xed152665, 0x953e7671), + Register64(0x02d63194, 0xa6369570), + Register64(0x5074f083, 0x94b1c987), + Register64(0x70ba598c, 0x90b25ce1), + Register64(0x794a1581, 0x0b9742f6), + Register64(0x0d5925e9, 0xfcaf8c6c), + Register64(0x3067716c, 0xd868744e), + Register64(0x910ab077, 0xe8d7731b), + Register64(0x6a61bbdb, 0x5ac42f61), + Register64(0x93513efb, 0xf0851567), + Register64(0xf494724b, 0x9e83e9d5), + Register64(0xe887e198, 0x5c09648d), + Register64(0x34b1d3c6, 0x75370cfd), + Register64(0xdc35e433, 0xbc0d255d), + Register64(0xd0aab842, 0x34131be0), + Register64(0x08042a50, 0xb48b7eaf), + Register64(0x9997c4ee, 0x44a3ab35), + Register64(0x829a7b49, 0x201799d0), + Register64(0x263b8307, 0xb7c54441), + Register64(0x752f95f4, 0xfd6a6ca6), + Register64(0x92721740, 0x2c08c6e5), + Register64(0x2a8ab754, 0xa795d9ee), + Register64(0xa442f755, 0x2f72943d), + Register64(0x2c31334e, 0x19781208), + Register64(0x4fa98d7c, 0xeaee6291), + Register64(0x55c3862f, 0x665db309), + Register64(0xbd061017, 0x5d53b1f3), + Register64(0x46fe6cb8, 0x40413f27), + Register64(0x3fe03792, 0xdf0cfa59), + Register64(0xcfe70037, 0x2eb85e8f), + Register64(0xa7be29e7, 0xadbce118), + Register64(0xe544ee5c, 0xde8431dd), + Register64(0x8a781b1b, 0x41f1873e), + Register64(0xa5c94c78, 0xa0d2f0e7), + Register64(0x39412e28, 0x77b60728), + Register64(0xa1265ef3, 0xafc9a62c), + Register64(0xbcc2770c, 0x6a2506c5), + Register64(0x3ab66dd5, 0xdce1ce12), + Register64(0xe65499d0, 0x4a675b37), + Register64(0x7d8f5234, 0x81bfd216), + Register64(0x0f6f64fc, 0xec15f389), + Register64(0x74efbe61, 0x8b5b13c8), + Register64(0xacdc82b7, 0x14273e1d), + Register64(0xdd40bfe0, 0x03199d17), + Register64(0x37e99257, 0xe7e061f8), + Register64(0xfa526269, 0x04775aaa), + Register64(0x8bbbf63a, 0x463d56f9), + Register64(0xf0013f15, 0x43a26e64), + Register64(0xa8307e9f, 0x879ec898), + Register64(0xcc4c27a4, 0x150177cc), + Register64(0x1b432f2c, 0xca1d3348), + Register64(0xde1d1f8f, 0x9f6fa013), + Register64(0x606602a0, 0x47a7ddd6), + Register64(0xd237ab64, 0xcc1cb2c7), + Register64(0x9b938e72, 0x25fcd1d3), + Register64(0xec4e0370, 0x8e0ff476), + Register64(0xfeb2fbda, 0x3d03c12d), + Register64(0xae0bced2, 0xee43889a), + Register64(0x22cb8923, 0xebfb4f43), + Register64(0x69360d01, 0x3cf7396d), + Register64(0x855e3602, 0xd2d4e022), + Register64(0x073805ba, 0xd01f784c), + Register64(0x33e17a13, 0x3852f546), + Register64(0xdf487405, 0x8ac7b638), + Register64(0xba92b29c, 0x678aa14a), + Register64(0x0ce89fc7, 0x6cfaadcd), + Register64(0x5f9d4e09, 0x08339e34), + Register64(0xf1afe929, 0x1f5923b9), + Register64(0x6e3480f6, 0x0f4a265f), + Register64(0xeebf3a2a, 0xb29b841c), + Register64(0xe21938a8, 0x8f91b4ad), + Register64(0x57dfeff8, 0x45c6d3c3), + Register64(0x2f006b0b, 0xf62caaf2), + Register64(0x62f479ef, 0x6f75ee78), + Register64(0x11a55ad4, 0x1c8916a9), + Register64(0xf229d290, 0x84fed453), + Register64(0x42f1c27b, 0x16b000e6), + Register64(0x2b1f7674, 0x9823c074), + Register64(0x4b76eca3, 0xc2745360), + Register64(0x8c98f463, 0xb91691bd), + Register64(0x14bcc93c, 0xf1ade66a), + Register64(0x8885213e, 0x6d458397), + Register64(0x8e177df0, 0x274d4711), + Register64(0xb49b73b5, 0x503f2951), + Register64(0x10168168, 0xc3f96b6b), + Register64(0x0e3d963b, 0x63cab0ae), + Register64(0x8dfc4b56, 0x55a1db14), + Register64(0xf789f135, 0x6e14de5c), + Register64(0x683e68af, 0x4e51dac1), + Register64(0xc9a84f9d, 0x8d4b0fd9), + Register64(0x3691e03f, 0x52a0f9d1), + Register64(0x5ed86e46, 0xe1878e80), + Register64(0x3c711a0e, 0x99d07150), + Register64(0x5a0865b2, 0x0c4e9310), + Register64(0x56fbfc1f, 0xe4f0682e), + Register64(0xea8d5de3, 0x105edf9b), + Register64(0x71abfdb1, 0x2379187a), + Register64(0x2eb99de1, 0xbee77b9c), + Register64(0x21ecc0ea, 0x33cf4523), + Register64(0x59a4d752, 0x1805c7a1), + Register64(0x3896f5eb, 0x56ae7c72), + Register64(0xaa638f3d, 0xb18f75dc), + Register64(0x9f39358d, 0xabe9808e), + Register64(0xb7defa91, 0xc00b72ac), + Register64(0x6b5541fd, 0x62492d92), + Register64(0x6dc6dee8, 0xf92e4d5b), + Register64(0x353f57ab, 0xc4beea7e), + Register64(0x735769d6, 0xda5690ce), + Register64(0x0a234aa6, 0x42391484), + Register64(0xf6f95080, 0x28f80d9d), + Register64(0xb8e319a2, 0x7ab3f215), + Register64(0x31ad9c11, 0x51341a4d), + Register64(0x773c22a5, 0x7bef5805), + Register64(0x45c7561a, 0x07968633), + Register64(0xf913da9e, 0x249dbe36), + Register64(0xda652d9b, 0x78a64c68), + Register64(0x4c27a97f, 0x3bc334ef), + Register64(0x76621220, 0xe66b17f4), + Register64(0x96774389, 0x9acd7d0b), + Register64(0xf3ee5bca, 0xe0ed6782), + Register64(0x409f7536, 0x00c879fc), + Register64(0x06d09a39, 0xb5926db6), + Register64(0x6f83aeb0, 0x317ac588), + Register64(0x01e6ca4a, 0x86381f21), + Register64(0x66ff3462, 0xd19f3025), + Register64(0x72207c24, 0xddfd3bfb), + Register64(0x4af6b6d3, 0xe2ece2eb), + Register64(0x9c994dbe, 0xc7ea08de), + Register64(0x49ace597, 0xb09a8bc4), + Register64(0xb38c4766, 0xcf0797ba), + Register64(0x131b9373, 0xc57c2a75), + Register64(0xb1822cce, 0x61931e58), + Register64(0x9d7555b9, 0x09ba1c0c), + Register64(0x127fafdd, 0x937d11d2), + Register64(0x29da3bad, 0xc66d92e4), + Register64(0xa2c1d571, 0x54c2ecbc), + Register64(0x58c5134d, 0x82f6fe24), + Register64(0x1c3ae351, 0x5b62274f), + Register64(0xe907c82e, 0x01cb8126), + Register64(0xf8ed0919, 0x13e37fcb), + Register64(0x3249d8f9, 0xc80046c9), + Register64(0x80cf9bed, 0xe388fb63), + Register64(0x1881539a, 0x116cf19e), + Register64(0x5103f3f7, 0x6bd52457), + Register64(0x15b7e6f5, 0xae47f7a8), + Register64(0xdbd7c6de, 0xd47e9ccf), + Register64(0x44e55c41, 0x0228bb1a), + Register64(0xb647d425, 0x5edb4e99), + Register64(0x5d11882b, 0xb8aafc30), + Register64(0xf5098bbb, 0x29d3212a), + Register64(0x8fb5ea14, 0xe90296b3), + Register64(0x677b9421, 0x57dd025a), + Register64(0xfb58e7c0, 0xa390acb5), + Register64(0x89d3674c, 0x83bd4a01), + Register64(0x9e2da4df, 0x4bf3b93b), + Register64(0xfcc41e32, 0x8cab4829), + Register64(0x03f38c96, 0xba582c52), + Register64(0xcad1bdbd, 0x7fd85db2), + Register64(0xbbb442c1, 0x6082ae83), + Register64(0xb95fe86b, 0xa5da9ab0), + Register64(0xb22e0467, 0x3771a93f), + Register64(0x845358c9, 0x493152d8), + Register64(0xbe2a4886, 0x97b4541e), + Register64(0x95a2dc2d, 0xd38e6966), + Register64(0xc02c11ac, 0x923c852b), + Register64(0x2388b199, 0x0df2a87b), + Register64(0x7c8008fa, 0x1b4f37be), + Register64(0x1f70d0c8, 0x4d54e503), + Register64(0x5490adec, 0x7ece57d4), + Register64(0x002b3c27, 0xd9063a3a), + Register64(0x7eaea384, 0x8030a2bf), + Register64(0xc602326d, 0xed2003c0), + Register64(0x83a7287d, 0x69a94086), + Register64(0xc57a5fcb, 0x30f57a8a), + Register64(0xb56844e4, 0x79ebe779), + Register64(0xa373b40f, 0x05dcbce9), + Register64(0xd71a786e, 0x88570ee2), + Register64(0x879cbacd, 0xbde8f6a0), + Register64(0x976ad1bc, 0xc164a32f), + Register64(0xab21e25e, 0x9666d78b), + Register64(0x901063aa, 0xe5e5c33c), + Register64(0x9818b344, 0x48698d90), + Register64(0xe36487ae, 0x3e1e8abb), + Register64(0xafbdf931, 0x893bdcb4), + Register64(0x6345a0dc, 0x5fbbd519), + Register64(0x8628fe26, 0x9b9465ca), + Register64(0x1e5d0160, 0x3f9c51ec), + Register64(0x4de44006, 0xa15049b7), + Register64(0xbf6c70e5, 0xf776cbb1), + Register64(0x411218f2, 0xef552bed), + Register64(0xcb0c0708, 0x705a36a3), + Register64(0xe74d1475, 0x4f986044), + Register64(0xcd56d943, 0x0ea8280e), + Register64(0xc12591d7, 0x535f5065), + Register64(0xc83223f1, 0x720aef96), + Register64(0xc3a0396f, 0x7363a51f), +]; diff --git a/pointycastle/lib/digests/whirlpool.dart b/pointycastle/lib/digests/whirlpool.dart new file mode 100644 index 0000000..8b5ddf8 --- /dev/null +++ b/pointycastle/lib/digests/whirlpool.dart @@ -0,0 +1,2297 @@ +// See file LICENSE for more information. + +library impl.digest.whirlpool; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of Whirlpool digest. +class WhirlpoolDigest extends BaseDigest implements Digest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'Whirlpool', () => WhirlpoolDigest()); + + static const _DIGEST_lENGTH_BYTES = 512 ~/ 8; + static const _BUFFER_SIZE = 64; + static const _ROUNDS = 10; + static final _r64Zero = Register64(0); + + static final _zerosList = Uint8List(_BUFFER_SIZE); + + final _buffer = Uint8List(_BUFFER_SIZE); + int _bufferPos = 0; + + final _bitCount = Register64List(4); + + final _hash = Register64List(8); + final _k = Register64List(8); + final _l = Register64List(8); + final _block = Register64List(8); + final _state = Register64List(8); + + WhirlpoolDigest() { + reset(); + } + + @override + final algorithmName = 'Whirlpool'; + @override + final digestSize = _DIGEST_lENGTH_BYTES; + + @override + void reset() { + _bufferPos = 0; + _buffer.fillRange(0, _buffer.length, 0); + + _bitCount.fillRange(0, _bitCount.length, 0); + + _hash.fillRange(0, _hash.length, 0); + _k.fillRange(0, _k.length, 0); + _l.fillRange(0, _l.length, 0); + _block.fillRange(0, _block.length, 0); + _state.fillRange(0, _state.length, 0); + } + + @override + void updateByte(int inp) { + _buffer[_bufferPos++] = inp; + + if (_bufferPos == _buffer.length) { + _processFilledBuffer(_buffer, 0); + } + + _increment(); + } + + @override + void update(Uint8List inp, int inpOff, int len) { + for (var i = 0; i < len; i++) { + _buffer[_bufferPos++] = inp[inpOff + i]; + + if (_bufferPos == _buffer.length) { + _processFilledBuffer(_buffer, 0); + } + } + + _increment(len * 8); + } + + @override + int doFinal(Uint8List out, int outOff) { + _finish(); + + for (var i = 0; i < 8; i++) { + _hash[i].pack(out, outOff + (i * 8), Endian.big); + } + + reset(); + + return digestSize; + } + + void _processFilledBuffer(Uint8List inp, int inpOff) { + for (var i = 0; i < _state.length; i++) { + _block[i].unpack(_buffer, i * 8, Endian.big); + } + + _processBlock(); + + _bufferPos = 0; + _buffer.fillRange(0, _buffer.length, 0); + } + + void _processBlock() { + // compute and apply K^0 + for (var i = 0; i < 8; i++) { + _k[i].set(_hash[i]); + _state[i] + ..set(_block[i]) + ..xor(_k[i]); + } + + // iterate over the rounds + for (var round = 1; round <= _ROUNDS; round++) { + for (var i = 0; i < 8; i++) { + _l[i].set(0); + _l[i].xor(_c0[clip8(_k[(i - 0) & 7].hi32 >> 24)]); + _l[i].xor(_c1[clip8(_k[(i - 1) & 7].hi32 >> 16)]); + _l[i].xor(_c2[clip8(_k[(i - 2) & 7].hi32 >> 8)]); + _l[i].xor(_c3[clip8(_k[(i - 3) & 7].hi32)]); + _l[i].xor(_c4[clip8(_k[(i - 4) & 7].lo32 >> 24)]); + _l[i].xor(_c5[clip8(_k[(i - 5) & 7].lo32 >> 16)]); + _l[i].xor(_c6[clip8(_k[(i - 6) & 7].lo32 >> 8)]); + _l[i].xor(_c7[clip8(_k[(i - 7) & 7].lo32)]); + } + + _k.setRange(0, _k.length, _l); + + _k[0].xor(_rc[round]); + + // apply the round transformation + for (var i = 0; i < 8; i++) { + _l[i].set(_k[i]); + _l[i].xor(_c0[clip8(_state[(i - 0) & 7].hi32 >> 24)]); + _l[i].xor(_c1[clip8(_state[(i - 1) & 7].hi32 >> 16)]); + _l[i].xor(_c2[clip8(_state[(i - 2) & 7].hi32 >> 8)]); + _l[i].xor(_c3[clip8(_state[(i - 3) & 7].hi32)]); + _l[i].xor(_c4[clip8(_state[(i - 4) & 7].lo32 >> 24)]); + _l[i].xor(_c5[clip8(_state[(i - 5) & 7].lo32 >> 16)]); + _l[i].xor(_c6[clip8(_state[(i - 6) & 7].lo32 >> 8)]); + _l[i].xor(_c7[clip8(_state[(i - 7) & 7].lo32)]); + } + + // save the current state + _state.setRange(0, _state.length, _l); + } + + // apply Miuaguchi-Preneel compression + final r = Register64(); + for (var i = 0; i < 8; i++) { + _hash[i].xor(r + ..set(_state[i]) + ..xor(_block[i])); + } + } + + void _increment([int bits = 8]) { + assert(bits <= 0xFFFFFFFF); + + var i = _bitCount.length - 1; + _bitCount[i].sum(bits); + + while (_bitCount[i] == _r64Zero) { + i--; + _bitCount[i].sum(1); + } + } + + void _finish() { + /* + * this makes a copy of the current bit length. at the expense of an + * object creation of 32 bytes rather than providing a _stopCounting + * boolean which was the alternative I could think of. + */ + final bitLength = _copyBitLength(); + + // Add padding + _buffer[_bufferPos++] |= 0x80; + + if (_bufferPos == _buffer.length) { + _processFilledBuffer(_buffer, 0); + } + + if (_bufferPos > 32) { + final padCount = _buffer.length - _bufferPos; + update(_zerosList, 0, padCount); + } else { + final padCount = 32 - _bufferPos; + update(_zerosList, 0, padCount); + } + + // Add the length information to the final 32 bytes of the 64 byte block + _buffer.setRange(32, 32 + bitLength.length, bitLength); + + // Process final block + _processFilledBuffer(_buffer, 0); + } + + Uint8List _copyBitLength() { + final rv = Uint8List(_bitCount.length * 8); + for (var i = 0; i < _bitCount.length; i++) { + _bitCount[i].pack(rv, i * 8, Endian.big); + } + return rv; + } + + @override + int get byteLength => 64; +} + +final _c0 = Register64List.from([ + [0x18186018, 0xc07830d8], + [0x23238c23, 0x05af4626], + [0xc6c63fc6, 0x7ef991b8], + [0xe8e887e8, 0x136fcdfb], + [0x87872687, 0x4ca113cb], + [0xb8b8dab8, 0xa9626d11], + [0x01010401, 0x08050209], + [0x4f4f214f, 0x426e9e0d], + [0x3636d836, 0xadee6c9b], + [0xa6a6a2a6, 0x590451ff], + [0xd2d26fd2, 0xdebdb90c], + [0xf5f5f3f5, 0xfb06f70e], + [0x7979f979, 0xef80f296], + [0x6f6fa16f, 0x5fcede30], + [0x91917e91, 0xfcef3f6d], + [0x52525552, 0xaa07a4f8], + [0x60609d60, 0x27fdc047], + [0xbcbccabc, 0x89766535], + [0x9b9b569b, 0xaccd2b37], + [0x8e8e028e, 0x048c018a], + [0xa3a3b6a3, 0x71155bd2], + [0x0c0c300c, 0x603c186c], + [0x7b7bf17b, 0xff8af684], + [0x3535d435, 0xb5e16a80], + [0x1d1d741d, 0xe8693af5], + [0xe0e0a7e0, 0x5347ddb3], + [0xd7d77bd7, 0xf6acb321], + [0xc2c22fc2, 0x5eed999c], + [0x2e2eb82e, 0x6d965c43], + [0x4b4b314b, 0x627a9629], + [0xfefedffe, 0xa321e15d], + [0x57574157, 0x8216aed5], + [0x15155415, 0xa8412abd], + [0x7777c177, 0x9fb6eee8], + [0x3737dc37, 0xa5eb6e92], + [0xe5e5b3e5, 0x7b56d79e], + [0x9f9f469f, 0x8cd92313], + [0xf0f0e7f0, 0xd317fd23], + [0x4a4a354a, 0x6a7f9420], + [0xdada4fda, 0x9e95a944], + [0x58587d58, 0xfa25b0a2], + [0xc9c903c9, 0x06ca8fcf], + [0x2929a429, 0x558d527c], + [0x0a0a280a, 0x5022145a], + [0xb1b1feb1, 0xe14f7f50], + [0xa0a0baa0, 0x691a5dc9], + [0x6b6bb16b, 0x7fdad614], + [0x85852e85, 0x5cab17d9], + [0xbdbdcebd, 0x8173673c], + [0x5d5d695d, 0xd234ba8f], + [0x10104010, 0x80502090], + [0xf4f4f7f4, 0xf303f507], + [0xcbcb0bcb, 0x16c08bdd], + [0x3e3ef83e, 0xedc67cd3], + [0x05051405, 0x28110a2d], + [0x67678167, 0x1fe6ce78], + [0xe4e4b7e4, 0x7353d597], + [0x27279c27, 0x25bb4e02], + [0x41411941, 0x32588273], + [0x8b8b168b, 0x2c9d0ba7], + [0xa7a7a6a7, 0x510153f6], + [0x7d7de97d, 0xcf94fab2], + [0x95956e95, 0xdcfb3749], + [0xd8d847d8, 0x8e9fad56], + [0xfbfbcbfb, 0x8b30eb70], + [0xeeee9fee, 0x2371c1cd], + [0x7c7ced7c, 0xc791f8bb], + [0x66668566, 0x17e3cc71], + [0xdddd53dd, 0xa68ea77b], + [0x17175c17, 0xb84b2eaf], + [0x47470147, 0x02468e45], + [0x9e9e429e, 0x84dc211a], + [0xcaca0fca, 0x1ec589d4], + [0x2d2db42d, 0x75995a58], + [0xbfbfc6bf, 0x9179632e], + [0x07071c07, 0x381b0e3f], + [0xadad8ead, 0x012347ac], + [0x5a5a755a, 0xea2fb4b0], + [0x83833683, 0x6cb51bef], + [0x3333cc33, 0x85ff66b6], + [0x63639163, 0x3ff2c65c], + [0x02020802, 0x100a0412], + [0xaaaa92aa, 0x39384993], + [0x7171d971, 0xafa8e2de], + [0xc8c807c8, 0x0ecf8dc6], + [0x19196419, 0xc87d32d1], + [0x49493949, 0x7270923b], + [0xd9d943d9, 0x869aaf5f], + [0xf2f2eff2, 0xc31df931], + [0xe3e3abe3, 0x4b48dba8], + [0x5b5b715b, 0xe22ab6b9], + [0x88881a88, 0x34920dbc], + [0x9a9a529a, 0xa4c8293e], + [0x26269826, 0x2dbe4c0b], + [0x3232c832, 0x8dfa64bf], + [0xb0b0fab0, 0xe94a7d59], + [0xe9e983e9, 0x1b6acff2], + [0x0f0f3c0f, 0x78331e77], + [0xd5d573d5, 0xe6a6b733], + [0x80803a80, 0x74ba1df4], + [0xbebec2be, 0x997c6127], + [0xcdcd13cd, 0x26de87eb], + [0x3434d034, 0xbde46889], + [0x48483d48, 0x7a759032], + [0xffffdbff, 0xab24e354], + [0x7a7af57a, 0xf78ff48d], + [0x90907a90, 0xf4ea3d64], + [0x5f5f615f, 0xc23ebe9d], + [0x20208020, 0x1da0403d], + [0x6868bd68, 0x67d5d00f], + [0x1a1a681a, 0xd07234ca], + [0xaeae82ae, 0x192c41b7], + [0xb4b4eab4, 0xc95e757d], + [0x54544d54, 0x9a19a8ce], + [0x93937693, 0xece53b7f], + [0x22228822, 0x0daa442f], + [0x64648d64, 0x07e9c863], + [0xf1f1e3f1, 0xdb12ff2a], + [0x7373d173, 0xbfa2e6cc], + [0x12124812, 0x905a2482], + [0x40401d40, 0x3a5d807a], + [0x08082008, 0x40281048], + [0xc3c32bc3, 0x56e89b95], + [0xecec97ec, 0x337bc5df], + [0xdbdb4bdb, 0x9690ab4d], + [0xa1a1bea1, 0x611f5fc0], + [0x8d8d0e8d, 0x1c830791], + [0x3d3df43d, 0xf5c97ac8], + [0x97976697, 0xccf1335b], + [0x00000000, 0x00000000], + [0xcfcf1bcf, 0x36d483f9], + [0x2b2bac2b, 0x4587566e], + [0x7676c576, 0x97b3ece1], + [0x82823282, 0x64b019e6], + [0xd6d67fd6, 0xfea9b128], + [0x1b1b6c1b, 0xd87736c3], + [0xb5b5eeb5, 0xc15b7774], + [0xafaf86af, 0x112943be], + [0x6a6ab56a, 0x77dfd41d], + [0x50505d50, 0xba0da0ea], + [0x45450945, 0x124c8a57], + [0xf3f3ebf3, 0xcb18fb38], + [0x3030c030, 0x9df060ad], + [0xefef9bef, 0x2b74c3c4], + [0x3f3ffc3f, 0xe5c37eda], + [0x55554955, 0x921caac7], + [0xa2a2b2a2, 0x791059db], + [0xeaea8fea, 0x0365c9e9], + [0x65658965, 0x0fecca6a], + [0xbabad2ba, 0xb9686903], + [0x2f2fbc2f, 0x65935e4a], + [0xc0c027c0, 0x4ee79d8e], + [0xdede5fde, 0xbe81a160], + [0x1c1c701c, 0xe06c38fc], + [0xfdfdd3fd, 0xbb2ee746], + [0x4d4d294d, 0x52649a1f], + [0x92927292, 0xe4e03976], + [0x7575c975, 0x8fbceafa], + [0x06061806, 0x301e0c36], + [0x8a8a128a, 0x249809ae], + [0xb2b2f2b2, 0xf940794b], + [0xe6e6bfe6, 0x6359d185], + [0x0e0e380e, 0x70361c7e], + [0x1f1f7c1f, 0xf8633ee7], + [0x62629562, 0x37f7c455], + [0xd4d477d4, 0xeea3b53a], + [0xa8a89aa8, 0x29324d81], + [0x96966296, 0xc4f43152], + [0xf9f9c3f9, 0x9b3aef62], + [0xc5c533c5, 0x66f697a3], + [0x25259425, 0x35b14a10], + [0x59597959, 0xf220b2ab], + [0x84842a84, 0x54ae15d0], + [0x7272d572, 0xb7a7e4c5], + [0x3939e439, 0xd5dd72ec], + [0x4c4c2d4c, 0x5a619816], + [0x5e5e655e, 0xca3bbc94], + [0x7878fd78, 0xe785f09f], + [0x3838e038, 0xddd870e5], + [0x8c8c0a8c, 0x14860598], + [0xd1d163d1, 0xc6b2bf17], + [0xa5a5aea5, 0x410b57e4], + [0xe2e2afe2, 0x434dd9a1], + [0x61619961, 0x2ff8c24e], + [0xb3b3f6b3, 0xf1457b42], + [0x21218421, 0x15a54234], + [0x9c9c4a9c, 0x94d62508], + [0x1e1e781e, 0xf0663cee], + [0x43431143, 0x22528661], + [0xc7c73bc7, 0x76fc93b1], + [0xfcfcd7fc, 0xb32be54f], + [0x04041004, 0x20140824], + [0x51515951, 0xb208a2e3], + [0x99995e99, 0xbcc72f25], + [0x6d6da96d, 0x4fc4da22], + [0x0d0d340d, 0x68391a65], + [0xfafacffa, 0x8335e979], + [0xdfdf5bdf, 0xb684a369], + [0x7e7ee57e, 0xd79bfca9], + [0x24249024, 0x3db44819], + [0x3b3bec3b, 0xc5d776fe], + [0xabab96ab, 0x313d4b9a], + [0xcece1fce, 0x3ed181f0], + [0x11114411, 0x88552299], + [0x8f8f068f, 0x0c890383], + [0x4e4e254e, 0x4a6b9c04], + [0xb7b7e6b7, 0xd1517366], + [0xebeb8beb, 0x0b60cbe0], + [0x3c3cf03c, 0xfdcc78c1], + [0x81813e81, 0x7cbf1ffd], + [0x94946a94, 0xd4fe3540], + [0xf7f7fbf7, 0xeb0cf31c], + [0xb9b9deb9, 0xa1676f18], + [0x13134c13, 0x985f268b], + [0x2c2cb02c, 0x7d9c5851], + [0xd3d36bd3, 0xd6b8bb05], + [0xe7e7bbe7, 0x6b5cd38c], + [0x6e6ea56e, 0x57cbdc39], + [0xc4c437c4, 0x6ef395aa], + [0x03030c03, 0x180f061b], + [0x56564556, 0x8a13acdc], + [0x44440d44, 0x1a49885e], + [0x7f7fe17f, 0xdf9efea0], + [0xa9a99ea9, 0x21374f88], + [0x2a2aa82a, 0x4d825467], + [0xbbbbd6bb, 0xb16d6b0a], + [0xc1c123c1, 0x46e29f87], + [0x53535153, 0xa202a6f1], + [0xdcdc57dc, 0xae8ba572], + [0x0b0b2c0b, 0x58271653], + [0x9d9d4e9d, 0x9cd32701], + [0x6c6cad6c, 0x47c1d82b], + [0x3131c431, 0x95f562a4], + [0x7474cd74, 0x87b9e8f3], + [0xf6f6fff6, 0xe309f115], + [0x46460546, 0x0a438c4c], + [0xacac8aac, 0x092645a5], + [0x89891e89, 0x3c970fb5], + [0x14145014, 0xa04428b4], + [0xe1e1a3e1, 0x5b42dfba], + [0x16165816, 0xb04e2ca6], + [0x3a3ae83a, 0xcdd274f7], + [0x6969b969, 0x6fd0d206], + [0x09092409, 0x482d1241], + [0x7070dd70, 0xa7ade0d7], + [0xb6b6e2b6, 0xd954716f], + [0xd0d067d0, 0xceb7bd1e], + [0xeded93ed, 0x3b7ec7d6], + [0xcccc17cc, 0x2edb85e2], + [0x42421542, 0x2a578468], + [0x98985a98, 0xb4c22d2c], + [0xa4a4aaa4, 0x490e55ed], + [0x2828a028, 0x5d885075], + [0x5c5c6d5c, 0xda31b886], + [0xf8f8c7f8, 0x933fed6b], + [0x86862286, 0x44a411c2] +]); + +final _c1 = Register64List.from([ + [0xd8181860, 0x18c07830], + [0x2623238c, 0x2305af46], + [0xb8c6c63f, 0xc67ef991], + [0xfbe8e887, 0xe8136fcd], + [0xcb878726, 0x874ca113], + [0x11b8b8da, 0xb8a9626d], + [0x09010104, 0x01080502], + [0x0d4f4f21, 0x4f426e9e], + [0x9b3636d8, 0x36adee6c], + [0xffa6a6a2, 0xa6590451], + [0x0cd2d26f, 0xd2debdb9], + [0x0ef5f5f3, 0xf5fb06f7], + [0x967979f9, 0x79ef80f2], + [0x306f6fa1, 0x6f5fcede], + [0x6d91917e, 0x91fcef3f], + [0xf8525255, 0x52aa07a4], + [0x4760609d, 0x6027fdc0], + [0x35bcbcca, 0xbc897665], + [0x379b9b56, 0x9baccd2b], + [0x8a8e8e02, 0x8e048c01], + [0xd2a3a3b6, 0xa371155b], + [0x6c0c0c30, 0x0c603c18], + [0x847b7bf1, 0x7bff8af6], + [0x803535d4, 0x35b5e16a], + [0xf51d1d74, 0x1de8693a], + [0xb3e0e0a7, 0xe05347dd], + [0x21d7d77b, 0xd7f6acb3], + [0x9cc2c22f, 0xc25eed99], + [0x432e2eb8, 0x2e6d965c], + [0x294b4b31, 0x4b627a96], + [0x5dfefedf, 0xfea321e1], + [0xd5575741, 0x578216ae], + [0xbd151554, 0x15a8412a], + [0xe87777c1, 0x779fb6ee], + [0x923737dc, 0x37a5eb6e], + [0x9ee5e5b3, 0xe57b56d7], + [0x139f9f46, 0x9f8cd923], + [0x23f0f0e7, 0xf0d317fd], + [0x204a4a35, 0x4a6a7f94], + [0x44dada4f, 0xda9e95a9], + [0xa258587d, 0x58fa25b0], + [0xcfc9c903, 0xc906ca8f], + [0x7c2929a4, 0x29558d52], + [0x5a0a0a28, 0x0a502214], + [0x50b1b1fe, 0xb1e14f7f], + [0xc9a0a0ba, 0xa0691a5d], + [0x146b6bb1, 0x6b7fdad6], + [0xd985852e, 0x855cab17], + [0x3cbdbdce, 0xbd817367], + [0x8f5d5d69, 0x5dd234ba], + [0x90101040, 0x10805020], + [0x07f4f4f7, 0xf4f303f5], + [0xddcbcb0b, 0xcb16c08b], + [0xd33e3ef8, 0x3eedc67c], + [0x2d050514, 0x0528110a], + [0x78676781, 0x671fe6ce], + [0x97e4e4b7, 0xe47353d5], + [0x0227279c, 0x2725bb4e], + [0x73414119, 0x41325882], + [0xa78b8b16, 0x8b2c9d0b], + [0xf6a7a7a6, 0xa7510153], + [0xb27d7de9, 0x7dcf94fa], + [0x4995956e, 0x95dcfb37], + [0x56d8d847, 0xd88e9fad], + [0x70fbfbcb, 0xfb8b30eb], + [0xcdeeee9f, 0xee2371c1], + [0xbb7c7ced, 0x7cc791f8], + [0x71666685, 0x6617e3cc], + [0x7bdddd53, 0xdda68ea7], + [0xaf17175c, 0x17b84b2e], + [0x45474701, 0x4702468e], + [0x1a9e9e42, 0x9e84dc21], + [0xd4caca0f, 0xca1ec589], + [0x582d2db4, 0x2d75995a], + [0x2ebfbfc6, 0xbf917963], + [0x3f07071c, 0x07381b0e], + [0xacadad8e, 0xad012347], + [0xb05a5a75, 0x5aea2fb4], + [0xef838336, 0x836cb51b], + [0xb63333cc, 0x3385ff66], + [0x5c636391, 0x633ff2c6], + [0x12020208, 0x02100a04], + [0x93aaaa92, 0xaa393849], + [0xde7171d9, 0x71afa8e2], + [0xc6c8c807, 0xc80ecf8d], + [0xd1191964, 0x19c87d32], + [0x3b494939, 0x49727092], + [0x5fd9d943, 0xd9869aaf], + [0x31f2f2ef, 0xf2c31df9], + [0xa8e3e3ab, 0xe34b48db], + [0xb95b5b71, 0x5be22ab6], + [0xbc88881a, 0x8834920d], + [0x3e9a9a52, 0x9aa4c829], + [0x0b262698, 0x262dbe4c], + [0xbf3232c8, 0x328dfa64], + [0x59b0b0fa, 0xb0e94a7d], + [0xf2e9e983, 0xe91b6acf], + [0x770f0f3c, 0x0f78331e], + [0x33d5d573, 0xd5e6a6b7], + [0xf480803a, 0x8074ba1d], + [0x27bebec2, 0xbe997c61], + [0xebcdcd13, 0xcd26de87], + [0x893434d0, 0x34bde468], + [0x3248483d, 0x487a7590], + [0x54ffffdb, 0xffab24e3], + [0x8d7a7af5, 0x7af78ff4], + [0x6490907a, 0x90f4ea3d], + [0x9d5f5f61, 0x5fc23ebe], + [0x3d202080, 0x201da040], + [0x0f6868bd, 0x6867d5d0], + [0xca1a1a68, 0x1ad07234], + [0xb7aeae82, 0xae192c41], + [0x7db4b4ea, 0xb4c95e75], + [0xce54544d, 0x549a19a8], + [0x7f939376, 0x93ece53b], + [0x2f222288, 0x220daa44], + [0x6364648d, 0x6407e9c8], + [0x2af1f1e3, 0xf1db12ff], + [0xcc7373d1, 0x73bfa2e6], + [0x82121248, 0x12905a24], + [0x7a40401d, 0x403a5d80], + [0x48080820, 0x08402810], + [0x95c3c32b, 0xc356e89b], + [0xdfecec97, 0xec337bc5], + [0x4ddbdb4b, 0xdb9690ab], + [0xc0a1a1be, 0xa1611f5f], + [0x918d8d0e, 0x8d1c8307], + [0xc83d3df4, 0x3df5c97a], + [0x5b979766, 0x97ccf133], + [0x00000000, 0x00000000], + [0xf9cfcf1b, 0xcf36d483], + [0x6e2b2bac, 0x2b458756], + [0xe17676c5, 0x7697b3ec], + [0xe6828232, 0x8264b019], + [0x28d6d67f, 0xd6fea9b1], + [0xc31b1b6c, 0x1bd87736], + [0x74b5b5ee, 0xb5c15b77], + [0xbeafaf86, 0xaf112943], + [0x1d6a6ab5, 0x6a77dfd4], + [0xea50505d, 0x50ba0da0], + [0x57454509, 0x45124c8a], + [0x38f3f3eb, 0xf3cb18fb], + [0xad3030c0, 0x309df060], + [0xc4efef9b, 0xef2b74c3], + [0xda3f3ffc, 0x3fe5c37e], + [0xc7555549, 0x55921caa], + [0xdba2a2b2, 0xa2791059], + [0xe9eaea8f, 0xea0365c9], + [0x6a656589, 0x650fecca], + [0x03babad2, 0xbab96869], + [0x4a2f2fbc, 0x2f65935e], + [0x8ec0c027, 0xc04ee79d], + [0x60dede5f, 0xdebe81a1], + [0xfc1c1c70, 0x1ce06c38], + [0x46fdfdd3, 0xfdbb2ee7], + [0x1f4d4d29, 0x4d52649a], + [0x76929272, 0x92e4e039], + [0xfa7575c9, 0x758fbcea], + [0x36060618, 0x06301e0c], + [0xae8a8a12, 0x8a249809], + [0x4bb2b2f2, 0xb2f94079], + [0x85e6e6bf, 0xe66359d1], + [0x7e0e0e38, 0x0e70361c], + [0xe71f1f7c, 0x1ff8633e], + [0x55626295, 0x6237f7c4], + [0x3ad4d477, 0xd4eea3b5], + [0x81a8a89a, 0xa829324d], + [0x52969662, 0x96c4f431], + [0x62f9f9c3, 0xf99b3aef], + [0xa3c5c533, 0xc566f697], + [0x10252594, 0x2535b14a], + [0xab595979, 0x59f220b2], + [0xd084842a, 0x8454ae15], + [0xc57272d5, 0x72b7a7e4], + [0xec3939e4, 0x39d5dd72], + [0x164c4c2d, 0x4c5a6198], + [0x945e5e65, 0x5eca3bbc], + [0x9f7878fd, 0x78e785f0], + [0xe53838e0, 0x38ddd870], + [0x988c8c0a, 0x8c148605], + [0x17d1d163, 0xd1c6b2bf], + [0xe4a5a5ae, 0xa5410b57], + [0xa1e2e2af, 0xe2434dd9], + [0x4e616199, 0x612ff8c2], + [0x42b3b3f6, 0xb3f1457b], + [0x34212184, 0x2115a542], + [0x089c9c4a, 0x9c94d625], + [0xee1e1e78, 0x1ef0663c], + [0x61434311, 0x43225286], + [0xb1c7c73b, 0xc776fc93], + [0x4ffcfcd7, 0xfcb32be5], + [0x24040410, 0x04201408], + [0xe3515159, 0x51b208a2], + [0x2599995e, 0x99bcc72f], + [0x226d6da9, 0x6d4fc4da], + [0x650d0d34, 0x0d68391a], + [0x79fafacf, 0xfa8335e9], + [0x69dfdf5b, 0xdfb684a3], + [0xa97e7ee5, 0x7ed79bfc], + [0x19242490, 0x243db448], + [0xfe3b3bec, 0x3bc5d776], + [0x9aabab96, 0xab313d4b], + [0xf0cece1f, 0xce3ed181], + [0x99111144, 0x11885522], + [0x838f8f06, 0x8f0c8903], + [0x044e4e25, 0x4e4a6b9c], + [0x66b7b7e6, 0xb7d15173], + [0xe0ebeb8b, 0xeb0b60cb], + [0xc13c3cf0, 0x3cfdcc78], + [0xfd81813e, 0x817cbf1f], + [0x4094946a, 0x94d4fe35], + [0x1cf7f7fb, 0xf7eb0cf3], + [0x18b9b9de, 0xb9a1676f], + [0x8b13134c, 0x13985f26], + [0x512c2cb0, 0x2c7d9c58], + [0x05d3d36b, 0xd3d6b8bb], + [0x8ce7e7bb, 0xe76b5cd3], + [0x396e6ea5, 0x6e57cbdc], + [0xaac4c437, 0xc46ef395], + [0x1b03030c, 0x03180f06], + [0xdc565645, 0x568a13ac], + [0x5e44440d, 0x441a4988], + [0xa07f7fe1, 0x7fdf9efe], + [0x88a9a99e, 0xa921374f], + [0x672a2aa8, 0x2a4d8254], + [0x0abbbbd6, 0xbbb16d6b], + [0x87c1c123, 0xc146e29f], + [0xf1535351, 0x53a202a6], + [0x72dcdc57, 0xdcae8ba5], + [0x530b0b2c, 0x0b582716], + [0x019d9d4e, 0x9d9cd327], + [0x2b6c6cad, 0x6c47c1d8], + [0xa43131c4, 0x3195f562], + [0xf37474cd, 0x7487b9e8], + [0x15f6f6ff, 0xf6e309f1], + [0x4c464605, 0x460a438c], + [0xa5acac8a, 0xac092645], + [0xb589891e, 0x893c970f], + [0xb4141450, 0x14a04428], + [0xbae1e1a3, 0xe15b42df], + [0xa6161658, 0x16b04e2c], + [0xf73a3ae8, 0x3acdd274], + [0x066969b9, 0x696fd0d2], + [0x41090924, 0x09482d12], + [0xd77070dd, 0x70a7ade0], + [0x6fb6b6e2, 0xb6d95471], + [0x1ed0d067, 0xd0ceb7bd], + [0xd6eded93, 0xed3b7ec7], + [0xe2cccc17, 0xcc2edb85], + [0x68424215, 0x422a5784], + [0x2c98985a, 0x98b4c22d], + [0xeda4a4aa, 0xa4490e55], + [0x752828a0, 0x285d8850], + [0x865c5c6d, 0x5cda31b8], + [0x6bf8f8c7, 0xf8933fed], + [0xc2868622, 0x8644a411] +]); + +final _c2 = Register64List.from([ + [0x30d81818, 0x6018c078], + [0x46262323, 0x8c2305af], + [0x91b8c6c6, 0x3fc67ef9], + [0xcdfbe8e8, 0x87e8136f], + [0x13cb8787, 0x26874ca1], + [0x6d11b8b8, 0xdab8a962], + [0x02090101, 0x04010805], + [0x9e0d4f4f, 0x214f426e], + [0x6c9b3636, 0xd836adee], + [0x51ffa6a6, 0xa2a65904], + [0xb90cd2d2, 0x6fd2debd], + [0xf70ef5f5, 0xf3f5fb06], + [0xf2967979, 0xf979ef80], + [0xde306f6f, 0xa16f5fce], + [0x3f6d9191, 0x7e91fcef], + [0xa4f85252, 0x5552aa07], + [0xc0476060, 0x9d6027fd], + [0x6535bcbc, 0xcabc8976], + [0x2b379b9b, 0x569baccd], + [0x018a8e8e, 0x028e048c], + [0x5bd2a3a3, 0xb6a37115], + [0x186c0c0c, 0x300c603c], + [0xf6847b7b, 0xf17bff8a], + [0x6a803535, 0xd435b5e1], + [0x3af51d1d, 0x741de869], + [0xddb3e0e0, 0xa7e05347], + [0xb321d7d7, 0x7bd7f6ac], + [0x999cc2c2, 0x2fc25eed], + [0x5c432e2e, 0xb82e6d96], + [0x96294b4b, 0x314b627a], + [0xe15dfefe, 0xdffea321], + [0xaed55757, 0x41578216], + [0x2abd1515, 0x5415a841], + [0xeee87777, 0xc1779fb6], + [0x6e923737, 0xdc37a5eb], + [0xd79ee5e5, 0xb3e57b56], + [0x23139f9f, 0x469f8cd9], + [0xfd23f0f0, 0xe7f0d317], + [0x94204a4a, 0x354a6a7f], + [0xa944dada, 0x4fda9e95], + [0xb0a25858, 0x7d58fa25], + [0x8fcfc9c9, 0x03c906ca], + [0x527c2929, 0xa429558d], + [0x145a0a0a, 0x280a5022], + [0x7f50b1b1, 0xfeb1e14f], + [0x5dc9a0a0, 0xbaa0691a], + [0xd6146b6b, 0xb16b7fda], + [0x17d98585, 0x2e855cab], + [0x673cbdbd, 0xcebd8173], + [0xba8f5d5d, 0x695dd234], + [0x20901010, 0x40108050], + [0xf507f4f4, 0xf7f4f303], + [0x8bddcbcb, 0x0bcb16c0], + [0x7cd33e3e, 0xf83eedc6], + [0x0a2d0505, 0x14052811], + [0xce786767, 0x81671fe6], + [0xd597e4e4, 0xb7e47353], + [0x4e022727, 0x9c2725bb], + [0x82734141, 0x19413258], + [0x0ba78b8b, 0x168b2c9d], + [0x53f6a7a7, 0xa6a75101], + [0xfab27d7d, 0xe97dcf94], + [0x37499595, 0x6e95dcfb], + [0xad56d8d8, 0x47d88e9f], + [0xeb70fbfb, 0xcbfb8b30], + [0xc1cdeeee, 0x9fee2371], + [0xf8bb7c7c, 0xed7cc791], + [0xcc716666, 0x856617e3], + [0xa77bdddd, 0x53dda68e], + [0x2eaf1717, 0x5c17b84b], + [0x8e454747, 0x01470246], + [0x211a9e9e, 0x429e84dc], + [0x89d4caca, 0x0fca1ec5], + [0x5a582d2d, 0xb42d7599], + [0x632ebfbf, 0xc6bf9179], + [0x0e3f0707, 0x1c07381b], + [0x47acadad, 0x8ead0123], + [0xb4b05a5a, 0x755aea2f], + [0x1bef8383, 0x36836cb5], + [0x66b63333, 0xcc3385ff], + [0xc65c6363, 0x91633ff2], + [0x04120202, 0x0802100a], + [0x4993aaaa, 0x92aa3938], + [0xe2de7171, 0xd971afa8], + [0x8dc6c8c8, 0x07c80ecf], + [0x32d11919, 0x6419c87d], + [0x923b4949, 0x39497270], + [0xaf5fd9d9, 0x43d9869a], + [0xf931f2f2, 0xeff2c31d], + [0xdba8e3e3, 0xabe34b48], + [0xb6b95b5b, 0x715be22a], + [0x0dbc8888, 0x1a883492], + [0x293e9a9a, 0x529aa4c8], + [0x4c0b2626, 0x98262dbe], + [0x64bf3232, 0xc8328dfa], + [0x7d59b0b0, 0xfab0e94a], + [0xcff2e9e9, 0x83e91b6a], + [0x1e770f0f, 0x3c0f7833], + [0xb733d5d5, 0x73d5e6a6], + [0x1df48080, 0x3a8074ba], + [0x6127bebe, 0xc2be997c], + [0x87ebcdcd, 0x13cd26de], + [0x68893434, 0xd034bde4], + [0x90324848, 0x3d487a75], + [0xe354ffff, 0xdbffab24], + [0xf48d7a7a, 0xf57af78f], + [0x3d649090, 0x7a90f4ea], + [0xbe9d5f5f, 0x615fc23e], + [0x403d2020, 0x80201da0], + [0xd00f6868, 0xbd6867d5], + [0x34ca1a1a, 0x681ad072], + [0x41b7aeae, 0x82ae192c], + [0x757db4b4, 0xeab4c95e], + [0xa8ce5454, 0x4d549a19], + [0x3b7f9393, 0x7693ece5], + [0x442f2222, 0x88220daa], + [0xc8636464, 0x8d6407e9], + [0xff2af1f1, 0xe3f1db12], + [0xe6cc7373, 0xd173bfa2], + [0x24821212, 0x4812905a], + [0x807a4040, 0x1d403a5d], + [0x10480808, 0x20084028], + [0x9b95c3c3, 0x2bc356e8], + [0xc5dfecec, 0x97ec337b], + [0xab4ddbdb, 0x4bdb9690], + [0x5fc0a1a1, 0xbea1611f], + [0x07918d8d, 0x0e8d1c83], + [0x7ac83d3d, 0xf43df5c9], + [0x335b9797, 0x6697ccf1], + [0x00000000, 0x00000000], + [0x83f9cfcf, 0x1bcf36d4], + [0x566e2b2b, 0xac2b4587], + [0xece17676, 0xc57697b3], + [0x19e68282, 0x328264b0], + [0xb128d6d6, 0x7fd6fea9], + [0x36c31b1b, 0x6c1bd877], + [0x7774b5b5, 0xeeb5c15b], + [0x43beafaf, 0x86af1129], + [0xd41d6a6a, 0xb56a77df], + [0xa0ea5050, 0x5d50ba0d], + [0x8a574545, 0x0945124c], + [0xfb38f3f3, 0xebf3cb18], + [0x60ad3030, 0xc0309df0], + [0xc3c4efef, 0x9bef2b74], + [0x7eda3f3f, 0xfc3fe5c3], + [0xaac75555, 0x4955921c], + [0x59dba2a2, 0xb2a27910], + [0xc9e9eaea, 0x8fea0365], + [0xca6a6565, 0x89650fec], + [0x6903baba, 0xd2bab968], + [0x5e4a2f2f, 0xbc2f6593], + [0x9d8ec0c0, 0x27c04ee7], + [0xa160dede, 0x5fdebe81], + [0x38fc1c1c, 0x701ce06c], + [0xe746fdfd, 0xd3fdbb2e], + [0x9a1f4d4d, 0x294d5264], + [0x39769292, 0x7292e4e0], + [0xeafa7575, 0xc9758fbc], + [0x0c360606, 0x1806301e], + [0x09ae8a8a, 0x128a2498], + [0x794bb2b2, 0xf2b2f940], + [0xd185e6e6, 0xbfe66359], + [0x1c7e0e0e, 0x380e7036], + [0x3ee71f1f, 0x7c1ff863], + [0xc4556262, 0x956237f7], + [0xb53ad4d4, 0x77d4eea3], + [0x4d81a8a8, 0x9aa82932], + [0x31529696, 0x6296c4f4], + [0xef62f9f9, 0xc3f99b3a], + [0x97a3c5c5, 0x33c566f6], + [0x4a102525, 0x942535b1], + [0xb2ab5959, 0x7959f220], + [0x15d08484, 0x2a8454ae], + [0xe4c57272, 0xd572b7a7], + [0x72ec3939, 0xe439d5dd], + [0x98164c4c, 0x2d4c5a61], + [0xbc945e5e, 0x655eca3b], + [0xf09f7878, 0xfd78e785], + [0x70e53838, 0xe038ddd8], + [0x05988c8c, 0x0a8c1486], + [0xbf17d1d1, 0x63d1c6b2], + [0x57e4a5a5, 0xaea5410b], + [0xd9a1e2e2, 0xafe2434d], + [0xc24e6161, 0x99612ff8], + [0x7b42b3b3, 0xf6b3f145], + [0x42342121, 0x842115a5], + [0x25089c9c, 0x4a9c94d6], + [0x3cee1e1e, 0x781ef066], + [0x86614343, 0x11432252], + [0x93b1c7c7, 0x3bc776fc], + [0xe54ffcfc, 0xd7fcb32b], + [0x08240404, 0x10042014], + [0xa2e35151, 0x5951b208], + [0x2f259999, 0x5e99bcc7], + [0xda226d6d, 0xa96d4fc4], + [0x1a650d0d, 0x340d6839], + [0xe979fafa, 0xcffa8335], + [0xa369dfdf, 0x5bdfb684], + [0xfca97e7e, 0xe57ed79b], + [0x48192424, 0x90243db4], + [0x76fe3b3b, 0xec3bc5d7], + [0x4b9aabab, 0x96ab313d], + [0x81f0cece, 0x1fce3ed1], + [0x22991111, 0x44118855], + [0x03838f8f, 0x068f0c89], + [0x9c044e4e, 0x254e4a6b], + [0x7366b7b7, 0xe6b7d151], + [0xcbe0ebeb, 0x8beb0b60], + [0x78c13c3c, 0xf03cfdcc], + [0x1ffd8181, 0x3e817cbf], + [0x35409494, 0x6a94d4fe], + [0xf31cf7f7, 0xfbf7eb0c], + [0x6f18b9b9, 0xdeb9a167], + [0x268b1313, 0x4c13985f], + [0x58512c2c, 0xb02c7d9c], + [0xbb05d3d3, 0x6bd3d6b8], + [0xd38ce7e7, 0xbbe76b5c], + [0xdc396e6e, 0xa56e57cb], + [0x95aac4c4, 0x37c46ef3], + [0x061b0303, 0x0c03180f], + [0xacdc5656, 0x45568a13], + [0x885e4444, 0x0d441a49], + [0xfea07f7f, 0xe17fdf9e], + [0x4f88a9a9, 0x9ea92137], + [0x54672a2a, 0xa82a4d82], + [0x6b0abbbb, 0xd6bbb16d], + [0x9f87c1c1, 0x23c146e2], + [0xa6f15353, 0x5153a202], + [0xa572dcdc, 0x57dcae8b], + [0x16530b0b, 0x2c0b5827], + [0x27019d9d, 0x4e9d9cd3], + [0xd82b6c6c, 0xad6c47c1], + [0x62a43131, 0xc43195f5], + [0xe8f37474, 0xcd7487b9], + [0xf115f6f6, 0xfff6e309], + [0x8c4c4646, 0x05460a43], + [0x45a5acac, 0x8aac0926], + [0x0fb58989, 0x1e893c97], + [0x28b41414, 0x5014a044], + [0xdfbae1e1, 0xa3e15b42], + [0x2ca61616, 0x5816b04e], + [0x74f73a3a, 0xe83acdd2], + [0xd2066969, 0xb9696fd0], + [0x12410909, 0x2409482d], + [0xe0d77070, 0xdd70a7ad], + [0x716fb6b6, 0xe2b6d954], + [0xbd1ed0d0, 0x67d0ceb7], + [0xc7d6eded, 0x93ed3b7e], + [0x85e2cccc, 0x17cc2edb], + [0x84684242, 0x15422a57], + [0x2d2c9898, 0x5a98b4c2], + [0x55eda4a4, 0xaaa4490e], + [0x50752828, 0xa0285d88], + [0xb8865c5c, 0x6d5cda31], + [0xed6bf8f8, 0xc7f8933f], + [0x11c28686, 0x228644a4] +]); + +final _c3 = Register64List.from([ + [0x7830d818, 0x186018c0], + [0xaf462623, 0x238c2305], + [0xf991b8c6, 0xc63fc67e], + [0x6fcdfbe8, 0xe887e813], + [0xa113cb87, 0x8726874c], + [0x626d11b8, 0xb8dab8a9], + [0x05020901, 0x01040108], + [0x6e9e0d4f, 0x4f214f42], + [0xee6c9b36, 0x36d836ad], + [0x0451ffa6, 0xa6a2a659], + [0xbdb90cd2, 0xd26fd2de], + [0x06f70ef5, 0xf5f3f5fb], + [0x80f29679, 0x79f979ef], + [0xcede306f, 0x6fa16f5f], + [0xef3f6d91, 0x917e91fc], + [0x07a4f852, 0x525552aa], + [0xfdc04760, 0x609d6027], + [0x766535bc, 0xbccabc89], + [0xcd2b379b, 0x9b569bac], + [0x8c018a8e, 0x8e028e04], + [0x155bd2a3, 0xa3b6a371], + [0x3c186c0c, 0x0c300c60], + [0x8af6847b, 0x7bf17bff], + [0xe16a8035, 0x35d435b5], + [0x693af51d, 0x1d741de8], + [0x47ddb3e0, 0xe0a7e053], + [0xacb321d7, 0xd77bd7f6], + [0xed999cc2, 0xc22fc25e], + [0x965c432e, 0x2eb82e6d], + [0x7a96294b, 0x4b314b62], + [0x21e15dfe, 0xfedffea3], + [0x16aed557, 0x57415782], + [0x412abd15, 0x155415a8], + [0xb6eee877, 0x77c1779f], + [0xeb6e9237, 0x37dc37a5], + [0x56d79ee5, 0xe5b3e57b], + [0xd923139f, 0x9f469f8c], + [0x17fd23f0, 0xf0e7f0d3], + [0x7f94204a, 0x4a354a6a], + [0x95a944da, 0xda4fda9e], + [0x25b0a258, 0x587d58fa], + [0xca8fcfc9, 0xc903c906], + [0x8d527c29, 0x29a42955], + [0x22145a0a, 0x0a280a50], + [0x4f7f50b1, 0xb1feb1e1], + [0x1a5dc9a0, 0xa0baa069], + [0xdad6146b, 0x6bb16b7f], + [0xab17d985, 0x852e855c], + [0x73673cbd, 0xbdcebd81], + [0x34ba8f5d, 0x5d695dd2], + [0x50209010, 0x10401080], + [0x03f507f4, 0xf4f7f4f3], + [0xc08bddcb, 0xcb0bcb16], + [0xc67cd33e, 0x3ef83eed], + [0x110a2d05, 0x05140528], + [0xe6ce7867, 0x6781671f], + [0x53d597e4, 0xe4b7e473], + [0xbb4e0227, 0x279c2725], + [0x58827341, 0x41194132], + [0x9d0ba78b, 0x8b168b2c], + [0x0153f6a7, 0xa7a6a751], + [0x94fab27d, 0x7de97dcf], + [0xfb374995, 0x956e95dc], + [0x9fad56d8, 0xd847d88e], + [0x30eb70fb, 0xfbcbfb8b], + [0x71c1cdee, 0xee9fee23], + [0x91f8bb7c, 0x7ced7cc7], + [0xe3cc7166, 0x66856617], + [0x8ea77bdd, 0xdd53dda6], + [0x4b2eaf17, 0x175c17b8], + [0x468e4547, 0x47014702], + [0xdc211a9e, 0x9e429e84], + [0xc589d4ca, 0xca0fca1e], + [0x995a582d, 0x2db42d75], + [0x79632ebf, 0xbfc6bf91], + [0x1b0e3f07, 0x071c0738], + [0x2347acad, 0xad8ead01], + [0x2fb4b05a, 0x5a755aea], + [0xb51bef83, 0x8336836c], + [0xff66b633, 0x33cc3385], + [0xf2c65c63, 0x6391633f], + [0x0a041202, 0x02080210], + [0x384993aa, 0xaa92aa39], + [0xa8e2de71, 0x71d971af], + [0xcf8dc6c8, 0xc807c80e], + [0x7d32d119, 0x196419c8], + [0x70923b49, 0x49394972], + [0x9aaf5fd9, 0xd943d986], + [0x1df931f2, 0xf2eff2c3], + [0x48dba8e3, 0xe3abe34b], + [0x2ab6b95b, 0x5b715be2], + [0x920dbc88, 0x881a8834], + [0xc8293e9a, 0x9a529aa4], + [0xbe4c0b26, 0x2698262d], + [0xfa64bf32, 0x32c8328d], + [0x4a7d59b0, 0xb0fab0e9], + [0x6acff2e9, 0xe983e91b], + [0x331e770f, 0x0f3c0f78], + [0xa6b733d5, 0xd573d5e6], + [0xba1df480, 0x803a8074], + [0x7c6127be, 0xbec2be99], + [0xde87ebcd, 0xcd13cd26], + [0xe4688934, 0x34d034bd], + [0x75903248, 0x483d487a], + [0x24e354ff, 0xffdbffab], + [0x8ff48d7a, 0x7af57af7], + [0xea3d6490, 0x907a90f4], + [0x3ebe9d5f, 0x5f615fc2], + [0xa0403d20, 0x2080201d], + [0xd5d00f68, 0x68bd6867], + [0x7234ca1a, 0x1a681ad0], + [0x2c41b7ae, 0xae82ae19], + [0x5e757db4, 0xb4eab4c9], + [0x19a8ce54, 0x544d549a], + [0xe53b7f93, 0x937693ec], + [0xaa442f22, 0x2288220d], + [0xe9c86364, 0x648d6407], + [0x12ff2af1, 0xf1e3f1db], + [0xa2e6cc73, 0x73d173bf], + [0x5a248212, 0x12481290], + [0x5d807a40, 0x401d403a], + [0x28104808, 0x08200840], + [0xe89b95c3, 0xc32bc356], + [0x7bc5dfec, 0xec97ec33], + [0x90ab4ddb, 0xdb4bdb96], + [0x1f5fc0a1, 0xa1bea161], + [0x8307918d, 0x8d0e8d1c], + [0xc97ac83d, 0x3df43df5], + [0xf1335b97, 0x976697cc], + [0x00000000, 0x00000000], + [0xd483f9cf, 0xcf1bcf36], + [0x87566e2b, 0x2bac2b45], + [0xb3ece176, 0x76c57697], + [0xb019e682, 0x82328264], + [0xa9b128d6, 0xd67fd6fe], + [0x7736c31b, 0x1b6c1bd8], + [0x5b7774b5, 0xb5eeb5c1], + [0x2943beaf, 0xaf86af11], + [0xdfd41d6a, 0x6ab56a77], + [0x0da0ea50, 0x505d50ba], + [0x4c8a5745, 0x45094512], + [0x18fb38f3, 0xf3ebf3cb], + [0xf060ad30, 0x30c0309d], + [0x74c3c4ef, 0xef9bef2b], + [0xc37eda3f, 0x3ffc3fe5], + [0x1caac755, 0x55495592], + [0x1059dba2, 0xa2b2a279], + [0x65c9e9ea, 0xea8fea03], + [0xecca6a65, 0x6589650f], + [0x686903ba, 0xbad2bab9], + [0x935e4a2f, 0x2fbc2f65], + [0xe79d8ec0, 0xc027c04e], + [0x81a160de, 0xde5fdebe], + [0x6c38fc1c, 0x1c701ce0], + [0x2ee746fd, 0xfdd3fdbb], + [0x649a1f4d, 0x4d294d52], + [0xe0397692, 0x927292e4], + [0xbceafa75, 0x75c9758f], + [0x1e0c3606, 0x06180630], + [0x9809ae8a, 0x8a128a24], + [0x40794bb2, 0xb2f2b2f9], + [0x59d185e6, 0xe6bfe663], + [0x361c7e0e, 0x0e380e70], + [0x633ee71f, 0x1f7c1ff8], + [0xf7c45562, 0x62956237], + [0xa3b53ad4, 0xd477d4ee], + [0x324d81a8, 0xa89aa829], + [0xf4315296, 0x966296c4], + [0x3aef62f9, 0xf9c3f99b], + [0xf697a3c5, 0xc533c566], + [0xb14a1025, 0x25942535], + [0x20b2ab59, 0x597959f2], + [0xae15d084, 0x842a8454], + [0xa7e4c572, 0x72d572b7], + [0xdd72ec39, 0x39e439d5], + [0x6198164c, 0x4c2d4c5a], + [0x3bbc945e, 0x5e655eca], + [0x85f09f78, 0x78fd78e7], + [0xd870e538, 0x38e038dd], + [0x8605988c, 0x8c0a8c14], + [0xb2bf17d1, 0xd163d1c6], + [0x0b57e4a5, 0xa5aea541], + [0x4dd9a1e2, 0xe2afe243], + [0xf8c24e61, 0x6199612f], + [0x457b42b3, 0xb3f6b3f1], + [0xa5423421, 0x21842115], + [0xd625089c, 0x9c4a9c94], + [0x663cee1e, 0x1e781ef0], + [0x52866143, 0x43114322], + [0xfc93b1c7, 0xc73bc776], + [0x2be54ffc, 0xfcd7fcb3], + [0x14082404, 0x04100420], + [0x08a2e351, 0x515951b2], + [0xc72f2599, 0x995e99bc], + [0xc4da226d, 0x6da96d4f], + [0x391a650d, 0x0d340d68], + [0x35e979fa, 0xfacffa83], + [0x84a369df, 0xdf5bdfb6], + [0x9bfca97e, 0x7ee57ed7], + [0xb4481924, 0x2490243d], + [0xd776fe3b, 0x3bec3bc5], + [0x3d4b9aab, 0xab96ab31], + [0xd181f0ce, 0xce1fce3e], + [0x55229911, 0x11441188], + [0x8903838f, 0x8f068f0c], + [0x6b9c044e, 0x4e254e4a], + [0x517366b7, 0xb7e6b7d1], + [0x60cbe0eb, 0xeb8beb0b], + [0xcc78c13c, 0x3cf03cfd], + [0xbf1ffd81, 0x813e817c], + [0xfe354094, 0x946a94d4], + [0x0cf31cf7, 0xf7fbf7eb], + [0x676f18b9, 0xb9deb9a1], + [0x5f268b13, 0x134c1398], + [0x9c58512c, 0x2cb02c7d], + [0xb8bb05d3, 0xd36bd3d6], + [0x5cd38ce7, 0xe7bbe76b], + [0xcbdc396e, 0x6ea56e57], + [0xf395aac4, 0xc437c46e], + [0x0f061b03, 0x030c0318], + [0x13acdc56, 0x5645568a], + [0x49885e44, 0x440d441a], + [0x9efea07f, 0x7fe17fdf], + [0x374f88a9, 0xa99ea921], + [0x8254672a, 0x2aa82a4d], + [0x6d6b0abb, 0xbbd6bbb1], + [0xe29f87c1, 0xc123c146], + [0x02a6f153, 0x535153a2], + [0x8ba572dc, 0xdc57dcae], + [0x2716530b, 0x0b2c0b58], + [0xd327019d, 0x9d4e9d9c], + [0xc1d82b6c, 0x6cad6c47], + [0xf562a431, 0x31c43195], + [0xb9e8f374, 0x74cd7487], + [0x09f115f6, 0xf6fff6e3], + [0x438c4c46, 0x4605460a], + [0x2645a5ac, 0xac8aac09], + [0x970fb589, 0x891e893c], + [0x4428b414, 0x145014a0], + [0x42dfbae1, 0xe1a3e15b], + [0x4e2ca616, 0x165816b0], + [0xd274f73a, 0x3ae83acd], + [0xd0d20669, 0x69b9696f], + [0x2d124109, 0x09240948], + [0xade0d770, 0x70dd70a7], + [0x54716fb6, 0xb6e2b6d9], + [0xb7bd1ed0, 0xd067d0ce], + [0x7ec7d6ed, 0xed93ed3b], + [0xdb85e2cc, 0xcc17cc2e], + [0x57846842, 0x4215422a], + [0xc22d2c98, 0x985a98b4], + [0x0e55eda4, 0xa4aaa449], + [0x88507528, 0x28a0285d], + [0x31b8865c, 0x5c6d5cda], + [0x3fed6bf8, 0xf8c7f893], + [0xa411c286, 0x86228644] +]); + +final _c4 = Register64List.from([ + [0xc07830d8, 0x18186018], + [0x05af4626, 0x23238c23], + [0x7ef991b8, 0xc6c63fc6], + [0x136fcdfb, 0xe8e887e8], + [0x4ca113cb, 0x87872687], + [0xa9626d11, 0xb8b8dab8], + [0x08050209, 0x01010401], + [0x426e9e0d, 0x4f4f214f], + [0xadee6c9b, 0x3636d836], + [0x590451ff, 0xa6a6a2a6], + [0xdebdb90c, 0xd2d26fd2], + [0xfb06f70e, 0xf5f5f3f5], + [0xef80f296, 0x7979f979], + [0x5fcede30, 0x6f6fa16f], + [0xfcef3f6d, 0x91917e91], + [0xaa07a4f8, 0x52525552], + [0x27fdc047, 0x60609d60], + [0x89766535, 0xbcbccabc], + [0xaccd2b37, 0x9b9b569b], + [0x048c018a, 0x8e8e028e], + [0x71155bd2, 0xa3a3b6a3], + [0x603c186c, 0x0c0c300c], + [0xff8af684, 0x7b7bf17b], + [0xb5e16a80, 0x3535d435], + [0xe8693af5, 0x1d1d741d], + [0x5347ddb3, 0xe0e0a7e0], + [0xf6acb321, 0xd7d77bd7], + [0x5eed999c, 0xc2c22fc2], + [0x6d965c43, 0x2e2eb82e], + [0x627a9629, 0x4b4b314b], + [0xa321e15d, 0xfefedffe], + [0x8216aed5, 0x57574157], + [0xa8412abd, 0x15155415], + [0x9fb6eee8, 0x7777c177], + [0xa5eb6e92, 0x3737dc37], + [0x7b56d79e, 0xe5e5b3e5], + [0x8cd92313, 0x9f9f469f], + [0xd317fd23, 0xf0f0e7f0], + [0x6a7f9420, 0x4a4a354a], + [0x9e95a944, 0xdada4fda], + [0xfa25b0a2, 0x58587d58], + [0x06ca8fcf, 0xc9c903c9], + [0x558d527c, 0x2929a429], + [0x5022145a, 0x0a0a280a], + [0xe14f7f50, 0xb1b1feb1], + [0x691a5dc9, 0xa0a0baa0], + [0x7fdad614, 0x6b6bb16b], + [0x5cab17d9, 0x85852e85], + [0x8173673c, 0xbdbdcebd], + [0xd234ba8f, 0x5d5d695d], + [0x80502090, 0x10104010], + [0xf303f507, 0xf4f4f7f4], + [0x16c08bdd, 0xcbcb0bcb], + [0xedc67cd3, 0x3e3ef83e], + [0x28110a2d, 0x05051405], + [0x1fe6ce78, 0x67678167], + [0x7353d597, 0xe4e4b7e4], + [0x25bb4e02, 0x27279c27], + [0x32588273, 0x41411941], + [0x2c9d0ba7, 0x8b8b168b], + [0x510153f6, 0xa7a7a6a7], + [0xcf94fab2, 0x7d7de97d], + [0xdcfb3749, 0x95956e95], + [0x8e9fad56, 0xd8d847d8], + [0x8b30eb70, 0xfbfbcbfb], + [0x2371c1cd, 0xeeee9fee], + [0xc791f8bb, 0x7c7ced7c], + [0x17e3cc71, 0x66668566], + [0xa68ea77b, 0xdddd53dd], + [0xb84b2eaf, 0x17175c17], + [0x02468e45, 0x47470147], + [0x84dc211a, 0x9e9e429e], + [0x1ec589d4, 0xcaca0fca], + [0x75995a58, 0x2d2db42d], + [0x9179632e, 0xbfbfc6bf], + [0x381b0e3f, 0x07071c07], + [0x012347ac, 0xadad8ead], + [0xea2fb4b0, 0x5a5a755a], + [0x6cb51bef, 0x83833683], + [0x85ff66b6, 0x3333cc33], + [0x3ff2c65c, 0x63639163], + [0x100a0412, 0x02020802], + [0x39384993, 0xaaaa92aa], + [0xafa8e2de, 0x7171d971], + [0x0ecf8dc6, 0xc8c807c8], + [0xc87d32d1, 0x19196419], + [0x7270923b, 0x49493949], + [0x869aaf5f, 0xd9d943d9], + [0xc31df931, 0xf2f2eff2], + [0x4b48dba8, 0xe3e3abe3], + [0xe22ab6b9, 0x5b5b715b], + [0x34920dbc, 0x88881a88], + [0xa4c8293e, 0x9a9a529a], + [0x2dbe4c0b, 0x26269826], + [0x8dfa64bf, 0x3232c832], + [0xe94a7d59, 0xb0b0fab0], + [0x1b6acff2, 0xe9e983e9], + [0x78331e77, 0x0f0f3c0f], + [0xe6a6b733, 0xd5d573d5], + [0x74ba1df4, 0x80803a80], + [0x997c6127, 0xbebec2be], + [0x26de87eb, 0xcdcd13cd], + [0xbde46889, 0x3434d034], + [0x7a759032, 0x48483d48], + [0xab24e354, 0xffffdbff], + [0xf78ff48d, 0x7a7af57a], + [0xf4ea3d64, 0x90907a90], + [0xc23ebe9d, 0x5f5f615f], + [0x1da0403d, 0x20208020], + [0x67d5d00f, 0x6868bd68], + [0xd07234ca, 0x1a1a681a], + [0x192c41b7, 0xaeae82ae], + [0xc95e757d, 0xb4b4eab4], + [0x9a19a8ce, 0x54544d54], + [0xece53b7f, 0x93937693], + [0x0daa442f, 0x22228822], + [0x07e9c863, 0x64648d64], + [0xdb12ff2a, 0xf1f1e3f1], + [0xbfa2e6cc, 0x7373d173], + [0x905a2482, 0x12124812], + [0x3a5d807a, 0x40401d40], + [0x40281048, 0x08082008], + [0x56e89b95, 0xc3c32bc3], + [0x337bc5df, 0xecec97ec], + [0x9690ab4d, 0xdbdb4bdb], + [0x611f5fc0, 0xa1a1bea1], + [0x1c830791, 0x8d8d0e8d], + [0xf5c97ac8, 0x3d3df43d], + [0xccf1335b, 0x97976697], + [0x00000000, 0x00000000], + [0x36d483f9, 0xcfcf1bcf], + [0x4587566e, 0x2b2bac2b], + [0x97b3ece1, 0x7676c576], + [0x64b019e6, 0x82823282], + [0xfea9b128, 0xd6d67fd6], + [0xd87736c3, 0x1b1b6c1b], + [0xc15b7774, 0xb5b5eeb5], + [0x112943be, 0xafaf86af], + [0x77dfd41d, 0x6a6ab56a], + [0xba0da0ea, 0x50505d50], + [0x124c8a57, 0x45450945], + [0xcb18fb38, 0xf3f3ebf3], + [0x9df060ad, 0x3030c030], + [0x2b74c3c4, 0xefef9bef], + [0xe5c37eda, 0x3f3ffc3f], + [0x921caac7, 0x55554955], + [0x791059db, 0xa2a2b2a2], + [0x0365c9e9, 0xeaea8fea], + [0x0fecca6a, 0x65658965], + [0xb9686903, 0xbabad2ba], + [0x65935e4a, 0x2f2fbc2f], + [0x4ee79d8e, 0xc0c027c0], + [0xbe81a160, 0xdede5fde], + [0xe06c38fc, 0x1c1c701c], + [0xbb2ee746, 0xfdfdd3fd], + [0x52649a1f, 0x4d4d294d], + [0xe4e03976, 0x92927292], + [0x8fbceafa, 0x7575c975], + [0x301e0c36, 0x06061806], + [0x249809ae, 0x8a8a128a], + [0xf940794b, 0xb2b2f2b2], + [0x6359d185, 0xe6e6bfe6], + [0x70361c7e, 0x0e0e380e], + [0xf8633ee7, 0x1f1f7c1f], + [0x37f7c455, 0x62629562], + [0xeea3b53a, 0xd4d477d4], + [0x29324d81, 0xa8a89aa8], + [0xc4f43152, 0x96966296], + [0x9b3aef62, 0xf9f9c3f9], + [0x66f697a3, 0xc5c533c5], + [0x35b14a10, 0x25259425], + [0xf220b2ab, 0x59597959], + [0x54ae15d0, 0x84842a84], + [0xb7a7e4c5, 0x7272d572], + [0xd5dd72ec, 0x3939e439], + [0x5a619816, 0x4c4c2d4c], + [0xca3bbc94, 0x5e5e655e], + [0xe785f09f, 0x7878fd78], + [0xddd870e5, 0x3838e038], + [0x14860598, 0x8c8c0a8c], + [0xc6b2bf17, 0xd1d163d1], + [0x410b57e4, 0xa5a5aea5], + [0x434dd9a1, 0xe2e2afe2], + [0x2ff8c24e, 0x61619961], + [0xf1457b42, 0xb3b3f6b3], + [0x15a54234, 0x21218421], + [0x94d62508, 0x9c9c4a9c], + [0xf0663cee, 0x1e1e781e], + [0x22528661, 0x43431143], + [0x76fc93b1, 0xc7c73bc7], + [0xb32be54f, 0xfcfcd7fc], + [0x20140824, 0x04041004], + [0xb208a2e3, 0x51515951], + [0xbcc72f25, 0x99995e99], + [0x4fc4da22, 0x6d6da96d], + [0x68391a65, 0x0d0d340d], + [0x8335e979, 0xfafacffa], + [0xb684a369, 0xdfdf5bdf], + [0xd79bfca9, 0x7e7ee57e], + [0x3db44819, 0x24249024], + [0xc5d776fe, 0x3b3bec3b], + [0x313d4b9a, 0xabab96ab], + [0x3ed181f0, 0xcece1fce], + [0x88552299, 0x11114411], + [0x0c890383, 0x8f8f068f], + [0x4a6b9c04, 0x4e4e254e], + [0xd1517366, 0xb7b7e6b7], + [0x0b60cbe0, 0xebeb8beb], + [0xfdcc78c1, 0x3c3cf03c], + [0x7cbf1ffd, 0x81813e81], + [0xd4fe3540, 0x94946a94], + [0xeb0cf31c, 0xf7f7fbf7], + [0xa1676f18, 0xb9b9deb9], + [0x985f268b, 0x13134c13], + [0x7d9c5851, 0x2c2cb02c], + [0xd6b8bb05, 0xd3d36bd3], + [0x6b5cd38c, 0xe7e7bbe7], + [0x57cbdc39, 0x6e6ea56e], + [0x6ef395aa, 0xc4c437c4], + [0x180f061b, 0x03030c03], + [0x8a13acdc, 0x56564556], + [0x1a49885e, 0x44440d44], + [0xdf9efea0, 0x7f7fe17f], + [0x21374f88, 0xa9a99ea9], + [0x4d825467, 0x2a2aa82a], + [0xb16d6b0a, 0xbbbbd6bb], + [0x46e29f87, 0xc1c123c1], + [0xa202a6f1, 0x53535153], + [0xae8ba572, 0xdcdc57dc], + [0x58271653, 0x0b0b2c0b], + [0x9cd32701, 0x9d9d4e9d], + [0x47c1d82b, 0x6c6cad6c], + [0x95f562a4, 0x3131c431], + [0x87b9e8f3, 0x7474cd74], + [0xe309f115, 0xf6f6fff6], + [0x0a438c4c, 0x46460546], + [0x092645a5, 0xacac8aac], + [0x3c970fb5, 0x89891e89], + [0xa04428b4, 0x14145014], + [0x5b42dfba, 0xe1e1a3e1], + [0xb04e2ca6, 0x16165816], + [0xcdd274f7, 0x3a3ae83a], + [0x6fd0d206, 0x6969b969], + [0x482d1241, 0x09092409], + [0xa7ade0d7, 0x7070dd70], + [0xd954716f, 0xb6b6e2b6], + [0xceb7bd1e, 0xd0d067d0], + [0x3b7ec7d6, 0xeded93ed], + [0x2edb85e2, 0xcccc17cc], + [0x2a578468, 0x42421542], + [0xb4c22d2c, 0x98985a98], + [0x490e55ed, 0xa4a4aaa4], + [0x5d885075, 0x2828a028], + [0xda31b886, 0x5c5c6d5c], + [0x933fed6b, 0xf8f8c7f8], + [0x44a411c2, 0x86862286] +]); + +final _c5 = Register64List.from([ + [0x18c07830, 0xd8181860], + [0x2305af46, 0x2623238c], + [0xc67ef991, 0xb8c6c63f], + [0xe8136fcd, 0xfbe8e887], + [0x874ca113, 0xcb878726], + [0xb8a9626d, 0x11b8b8da], + [0x01080502, 0x09010104], + [0x4f426e9e, 0x0d4f4f21], + [0x36adee6c, 0x9b3636d8], + [0xa6590451, 0xffa6a6a2], + [0xd2debdb9, 0x0cd2d26f], + [0xf5fb06f7, 0x0ef5f5f3], + [0x79ef80f2, 0x967979f9], + [0x6f5fcede, 0x306f6fa1], + [0x91fcef3f, 0x6d91917e], + [0x52aa07a4, 0xf8525255], + [0x6027fdc0, 0x4760609d], + [0xbc897665, 0x35bcbcca], + [0x9baccd2b, 0x379b9b56], + [0x8e048c01, 0x8a8e8e02], + [0xa371155b, 0xd2a3a3b6], + [0x0c603c18, 0x6c0c0c30], + [0x7bff8af6, 0x847b7bf1], + [0x35b5e16a, 0x803535d4], + [0x1de8693a, 0xf51d1d74], + [0xe05347dd, 0xb3e0e0a7], + [0xd7f6acb3, 0x21d7d77b], + [0xc25eed99, 0x9cc2c22f], + [0x2e6d965c, 0x432e2eb8], + [0x4b627a96, 0x294b4b31], + [0xfea321e1, 0x5dfefedf], + [0x578216ae, 0xd5575741], + [0x15a8412a, 0xbd151554], + [0x779fb6ee, 0xe87777c1], + [0x37a5eb6e, 0x923737dc], + [0xe57b56d7, 0x9ee5e5b3], + [0x9f8cd923, 0x139f9f46], + [0xf0d317fd, 0x23f0f0e7], + [0x4a6a7f94, 0x204a4a35], + [0xda9e95a9, 0x44dada4f], + [0x58fa25b0, 0xa258587d], + [0xc906ca8f, 0xcfc9c903], + [0x29558d52, 0x7c2929a4], + [0x0a502214, 0x5a0a0a28], + [0xb1e14f7f, 0x50b1b1fe], + [0xa0691a5d, 0xc9a0a0ba], + [0x6b7fdad6, 0x146b6bb1], + [0x855cab17, 0xd985852e], + [0xbd817367, 0x3cbdbdce], + [0x5dd234ba, 0x8f5d5d69], + [0x10805020, 0x90101040], + [0xf4f303f5, 0x07f4f4f7], + [0xcb16c08b, 0xddcbcb0b], + [0x3eedc67c, 0xd33e3ef8], + [0x0528110a, 0x2d050514], + [0x671fe6ce, 0x78676781], + [0xe47353d5, 0x97e4e4b7], + [0x2725bb4e, 0x0227279c], + [0x41325882, 0x73414119], + [0x8b2c9d0b, 0xa78b8b16], + [0xa7510153, 0xf6a7a7a6], + [0x7dcf94fa, 0xb27d7de9], + [0x95dcfb37, 0x4995956e], + [0xd88e9fad, 0x56d8d847], + [0xfb8b30eb, 0x70fbfbcb], + [0xee2371c1, 0xcdeeee9f], + [0x7cc791f8, 0xbb7c7ced], + [0x6617e3cc, 0x71666685], + [0xdda68ea7, 0x7bdddd53], + [0x17b84b2e, 0xaf17175c], + [0x4702468e, 0x45474701], + [0x9e84dc21, 0x1a9e9e42], + [0xca1ec589, 0xd4caca0f], + [0x2d75995a, 0x582d2db4], + [0xbf917963, 0x2ebfbfc6], + [0x07381b0e, 0x3f07071c], + [0xad012347, 0xacadad8e], + [0x5aea2fb4, 0xb05a5a75], + [0x836cb51b, 0xef838336], + [0x3385ff66, 0xb63333cc], + [0x633ff2c6, 0x5c636391], + [0x02100a04, 0x12020208], + [0xaa393849, 0x93aaaa92], + [0x71afa8e2, 0xde7171d9], + [0xc80ecf8d, 0xc6c8c807], + [0x19c87d32, 0xd1191964], + [0x49727092, 0x3b494939], + [0xd9869aaf, 0x5fd9d943], + [0xf2c31df9, 0x31f2f2ef], + [0xe34b48db, 0xa8e3e3ab], + [0x5be22ab6, 0xb95b5b71], + [0x8834920d, 0xbc88881a], + [0x9aa4c829, 0x3e9a9a52], + [0x262dbe4c, 0x0b262698], + [0x328dfa64, 0xbf3232c8], + [0xb0e94a7d, 0x59b0b0fa], + [0xe91b6acf, 0xf2e9e983], + [0x0f78331e, 0x770f0f3c], + [0xd5e6a6b7, 0x33d5d573], + [0x8074ba1d, 0xf480803a], + [0xbe997c61, 0x27bebec2], + [0xcd26de87, 0xebcdcd13], + [0x34bde468, 0x893434d0], + [0x487a7590, 0x3248483d], + [0xffab24e3, 0x54ffffdb], + [0x7af78ff4, 0x8d7a7af5], + [0x90f4ea3d, 0x6490907a], + [0x5fc23ebe, 0x9d5f5f61], + [0x201da040, 0x3d202080], + [0x6867d5d0, 0x0f6868bd], + [0x1ad07234, 0xca1a1a68], + [0xae192c41, 0xb7aeae82], + [0xb4c95e75, 0x7db4b4ea], + [0x549a19a8, 0xce54544d], + [0x93ece53b, 0x7f939376], + [0x220daa44, 0x2f222288], + [0x6407e9c8, 0x6364648d], + [0xf1db12ff, 0x2af1f1e3], + [0x73bfa2e6, 0xcc7373d1], + [0x12905a24, 0x82121248], + [0x403a5d80, 0x7a40401d], + [0x08402810, 0x48080820], + [0xc356e89b, 0x95c3c32b], + [0xec337bc5, 0xdfecec97], + [0xdb9690ab, 0x4ddbdb4b], + [0xa1611f5f, 0xc0a1a1be], + [0x8d1c8307, 0x918d8d0e], + [0x3df5c97a, 0xc83d3df4], + [0x97ccf133, 0x5b979766], + [0x00000000, 0x00000000], + [0xcf36d483, 0xf9cfcf1b], + [0x2b458756, 0x6e2b2bac], + [0x7697b3ec, 0xe17676c5], + [0x8264b019, 0xe6828232], + [0xd6fea9b1, 0x28d6d67f], + [0x1bd87736, 0xc31b1b6c], + [0xb5c15b77, 0x74b5b5ee], + [0xaf112943, 0xbeafaf86], + [0x6a77dfd4, 0x1d6a6ab5], + [0x50ba0da0, 0xea50505d], + [0x45124c8a, 0x57454509], + [0xf3cb18fb, 0x38f3f3eb], + [0x309df060, 0xad3030c0], + [0xef2b74c3, 0xc4efef9b], + [0x3fe5c37e, 0xda3f3ffc], + [0x55921caa, 0xc7555549], + [0xa2791059, 0xdba2a2b2], + [0xea0365c9, 0xe9eaea8f], + [0x650fecca, 0x6a656589], + [0xbab96869, 0x03babad2], + [0x2f65935e, 0x4a2f2fbc], + [0xc04ee79d, 0x8ec0c027], + [0xdebe81a1, 0x60dede5f], + [0x1ce06c38, 0xfc1c1c70], + [0xfdbb2ee7, 0x46fdfdd3], + [0x4d52649a, 0x1f4d4d29], + [0x92e4e039, 0x76929272], + [0x758fbcea, 0xfa7575c9], + [0x06301e0c, 0x36060618], + [0x8a249809, 0xae8a8a12], + [0xb2f94079, 0x4bb2b2f2], + [0xe66359d1, 0x85e6e6bf], + [0x0e70361c, 0x7e0e0e38], + [0x1ff8633e, 0xe71f1f7c], + [0x6237f7c4, 0x55626295], + [0xd4eea3b5, 0x3ad4d477], + [0xa829324d, 0x81a8a89a], + [0x96c4f431, 0x52969662], + [0xf99b3aef, 0x62f9f9c3], + [0xc566f697, 0xa3c5c533], + [0x2535b14a, 0x10252594], + [0x59f220b2, 0xab595979], + [0x8454ae15, 0xd084842a], + [0x72b7a7e4, 0xc57272d5], + [0x39d5dd72, 0xec3939e4], + [0x4c5a6198, 0x164c4c2d], + [0x5eca3bbc, 0x945e5e65], + [0x78e785f0, 0x9f7878fd], + [0x38ddd870, 0xe53838e0], + [0x8c148605, 0x988c8c0a], + [0xd1c6b2bf, 0x17d1d163], + [0xa5410b57, 0xe4a5a5ae], + [0xe2434dd9, 0xa1e2e2af], + [0x612ff8c2, 0x4e616199], + [0xb3f1457b, 0x42b3b3f6], + [0x2115a542, 0x34212184], + [0x9c94d625, 0x089c9c4a], + [0x1ef0663c, 0xee1e1e78], + [0x43225286, 0x61434311], + [0xc776fc93, 0xb1c7c73b], + [0xfcb32be5, 0x4ffcfcd7], + [0x04201408, 0x24040410], + [0x51b208a2, 0xe3515159], + [0x99bcc72f, 0x2599995e], + [0x6d4fc4da, 0x226d6da9], + [0x0d68391a, 0x650d0d34], + [0xfa8335e9, 0x79fafacf], + [0xdfb684a3, 0x69dfdf5b], + [0x7ed79bfc, 0xa97e7ee5], + [0x243db448, 0x19242490], + [0x3bc5d776, 0xfe3b3bec], + [0xab313d4b, 0x9aabab96], + [0xce3ed181, 0xf0cece1f], + [0x11885522, 0x99111144], + [0x8f0c8903, 0x838f8f06], + [0x4e4a6b9c, 0x044e4e25], + [0xb7d15173, 0x66b7b7e6], + [0xeb0b60cb, 0xe0ebeb8b], + [0x3cfdcc78, 0xc13c3cf0], + [0x817cbf1f, 0xfd81813e], + [0x94d4fe35, 0x4094946a], + [0xf7eb0cf3, 0x1cf7f7fb], + [0xb9a1676f, 0x18b9b9de], + [0x13985f26, 0x8b13134c], + [0x2c7d9c58, 0x512c2cb0], + [0xd3d6b8bb, 0x05d3d36b], + [0xe76b5cd3, 0x8ce7e7bb], + [0x6e57cbdc, 0x396e6ea5], + [0xc46ef395, 0xaac4c437], + [0x03180f06, 0x1b03030c], + [0x568a13ac, 0xdc565645], + [0x441a4988, 0x5e44440d], + [0x7fdf9efe, 0xa07f7fe1], + [0xa921374f, 0x88a9a99e], + [0x2a4d8254, 0x672a2aa8], + [0xbbb16d6b, 0x0abbbbd6], + [0xc146e29f, 0x87c1c123], + [0x53a202a6, 0xf1535351], + [0xdcae8ba5, 0x72dcdc57], + [0x0b582716, 0x530b0b2c], + [0x9d9cd327, 0x019d9d4e], + [0x6c47c1d8, 0x2b6c6cad], + [0x3195f562, 0xa43131c4], + [0x7487b9e8, 0xf37474cd], + [0xf6e309f1, 0x15f6f6ff], + [0x460a438c, 0x4c464605], + [0xac092645, 0xa5acac8a], + [0x893c970f, 0xb589891e], + [0x14a04428, 0xb4141450], + [0xe15b42df, 0xbae1e1a3], + [0x16b04e2c, 0xa6161658], + [0x3acdd274, 0xf73a3ae8], + [0x696fd0d2, 0x066969b9], + [0x09482d12, 0x41090924], + [0x70a7ade0, 0xd77070dd], + [0xb6d95471, 0x6fb6b6e2], + [0xd0ceb7bd, 0x1ed0d067], + [0xed3b7ec7, 0xd6eded93], + [0xcc2edb85, 0xe2cccc17], + [0x422a5784, 0x68424215], + [0x98b4c22d, 0x2c98985a], + [0xa4490e55, 0xeda4a4aa], + [0x285d8850, 0x752828a0], + [0x5cda31b8, 0x865c5c6d], + [0xf8933fed, 0x6bf8f8c7], + [0x8644a411, 0xc2868622] +]); + +final _c6 = Register64List.from([ + [0x6018c078, 0x30d81818], + [0x8c2305af, 0x46262323], + [0x3fc67ef9, 0x91b8c6c6], + [0x87e8136f, 0xcdfbe8e8], + [0x26874ca1, 0x13cb8787], + [0xdab8a962, 0x6d11b8b8], + [0x04010805, 0x02090101], + [0x214f426e, 0x9e0d4f4f], + [0xd836adee, 0x6c9b3636], + [0xa2a65904, 0x51ffa6a6], + [0x6fd2debd, 0xb90cd2d2], + [0xf3f5fb06, 0xf70ef5f5], + [0xf979ef80, 0xf2967979], + [0xa16f5fce, 0xde306f6f], + [0x7e91fcef, 0x3f6d9191], + [0x5552aa07, 0xa4f85252], + [0x9d6027fd, 0xc0476060], + [0xcabc8976, 0x6535bcbc], + [0x569baccd, 0x2b379b9b], + [0x028e048c, 0x018a8e8e], + [0xb6a37115, 0x5bd2a3a3], + [0x300c603c, 0x186c0c0c], + [0xf17bff8a, 0xf6847b7b], + [0xd435b5e1, 0x6a803535], + [0x741de869, 0x3af51d1d], + [0xa7e05347, 0xddb3e0e0], + [0x7bd7f6ac, 0xb321d7d7], + [0x2fc25eed, 0x999cc2c2], + [0xb82e6d96, 0x5c432e2e], + [0x314b627a, 0x96294b4b], + [0xdffea321, 0xe15dfefe], + [0x41578216, 0xaed55757], + [0x5415a841, 0x2abd1515], + [0xc1779fb6, 0xeee87777], + [0xdc37a5eb, 0x6e923737], + [0xb3e57b56, 0xd79ee5e5], + [0x469f8cd9, 0x23139f9f], + [0xe7f0d317, 0xfd23f0f0], + [0x354a6a7f, 0x94204a4a], + [0x4fda9e95, 0xa944dada], + [0x7d58fa25, 0xb0a25858], + [0x03c906ca, 0x8fcfc9c9], + [0xa429558d, 0x527c2929], + [0x280a5022, 0x145a0a0a], + [0xfeb1e14f, 0x7f50b1b1], + [0xbaa0691a, 0x5dc9a0a0], + [0xb16b7fda, 0xd6146b6b], + [0x2e855cab, 0x17d98585], + [0xcebd8173, 0x673cbdbd], + [0x695dd234, 0xba8f5d5d], + [0x40108050, 0x20901010], + [0xf7f4f303, 0xf507f4f4], + [0x0bcb16c0, 0x8bddcbcb], + [0xf83eedc6, 0x7cd33e3e], + [0x14052811, 0x0a2d0505], + [0x81671fe6, 0xce786767], + [0xb7e47353, 0xd597e4e4], + [0x9c2725bb, 0x4e022727], + [0x19413258, 0x82734141], + [0x168b2c9d, 0x0ba78b8b], + [0xa6a75101, 0x53f6a7a7], + [0xe97dcf94, 0xfab27d7d], + [0x6e95dcfb, 0x37499595], + [0x47d88e9f, 0xad56d8d8], + [0xcbfb8b30, 0xeb70fbfb], + [0x9fee2371, 0xc1cdeeee], + [0xed7cc791, 0xf8bb7c7c], + [0x856617e3, 0xcc716666], + [0x53dda68e, 0xa77bdddd], + [0x5c17b84b, 0x2eaf1717], + [0x01470246, 0x8e454747], + [0x429e84dc, 0x211a9e9e], + [0x0fca1ec5, 0x89d4caca], + [0xb42d7599, 0x5a582d2d], + [0xc6bf9179, 0x632ebfbf], + [0x1c07381b, 0x0e3f0707], + [0x8ead0123, 0x47acadad], + [0x755aea2f, 0xb4b05a5a], + [0x36836cb5, 0x1bef8383], + [0xcc3385ff, 0x66b63333], + [0x91633ff2, 0xc65c6363], + [0x0802100a, 0x04120202], + [0x92aa3938, 0x4993aaaa], + [0xd971afa8, 0xe2de7171], + [0x07c80ecf, 0x8dc6c8c8], + [0x6419c87d, 0x32d11919], + [0x39497270, 0x923b4949], + [0x43d9869a, 0xaf5fd9d9], + [0xeff2c31d, 0xf931f2f2], + [0xabe34b48, 0xdba8e3e3], + [0x715be22a, 0xb6b95b5b], + [0x1a883492, 0x0dbc8888], + [0x529aa4c8, 0x293e9a9a], + [0x98262dbe, 0x4c0b2626], + [0xc8328dfa, 0x64bf3232], + [0xfab0e94a, 0x7d59b0b0], + [0x83e91b6a, 0xcff2e9e9], + [0x3c0f7833, 0x1e770f0f], + [0x73d5e6a6, 0xb733d5d5], + [0x3a8074ba, 0x1df48080], + [0xc2be997c, 0x6127bebe], + [0x13cd26de, 0x87ebcdcd], + [0xd034bde4, 0x68893434], + [0x3d487a75, 0x90324848], + [0xdbffab24, 0xe354ffff], + [0xf57af78f, 0xf48d7a7a], + [0x7a90f4ea, 0x3d649090], + [0x615fc23e, 0xbe9d5f5f], + [0x80201da0, 0x403d2020], + [0xbd6867d5, 0xd00f6868], + [0x681ad072, 0x34ca1a1a], + [0x82ae192c, 0x41b7aeae], + [0xeab4c95e, 0x757db4b4], + [0x4d549a19, 0xa8ce5454], + [0x7693ece5, 0x3b7f9393], + [0x88220daa, 0x442f2222], + [0x8d6407e9, 0xc8636464], + [0xe3f1db12, 0xff2af1f1], + [0xd173bfa2, 0xe6cc7373], + [0x4812905a, 0x24821212], + [0x1d403a5d, 0x807a4040], + [0x20084028, 0x10480808], + [0x2bc356e8, 0x9b95c3c3], + [0x97ec337b, 0xc5dfecec], + [0x4bdb9690, 0xab4ddbdb], + [0xbea1611f, 0x5fc0a1a1], + [0x0e8d1c83, 0x07918d8d], + [0xf43df5c9, 0x7ac83d3d], + [0x6697ccf1, 0x335b9797], + [0x00000000, 0x00000000], + [0x1bcf36d4, 0x83f9cfcf], + [0xac2b4587, 0x566e2b2b], + [0xc57697b3, 0xece17676], + [0x328264b0, 0x19e68282], + [0x7fd6fea9, 0xb128d6d6], + [0x6c1bd877, 0x36c31b1b], + [0xeeb5c15b, 0x7774b5b5], + [0x86af1129, 0x43beafaf], + [0xb56a77df, 0xd41d6a6a], + [0x5d50ba0d, 0xa0ea5050], + [0x0945124c, 0x8a574545], + [0xebf3cb18, 0xfb38f3f3], + [0xc0309df0, 0x60ad3030], + [0x9bef2b74, 0xc3c4efef], + [0xfc3fe5c3, 0x7eda3f3f], + [0x4955921c, 0xaac75555], + [0xb2a27910, 0x59dba2a2], + [0x8fea0365, 0xc9e9eaea], + [0x89650fec, 0xca6a6565], + [0xd2bab968, 0x6903baba], + [0xbc2f6593, 0x5e4a2f2f], + [0x27c04ee7, 0x9d8ec0c0], + [0x5fdebe81, 0xa160dede], + [0x701ce06c, 0x38fc1c1c], + [0xd3fdbb2e, 0xe746fdfd], + [0x294d5264, 0x9a1f4d4d], + [0x7292e4e0, 0x39769292], + [0xc9758fbc, 0xeafa7575], + [0x1806301e, 0x0c360606], + [0x128a2498, 0x09ae8a8a], + [0xf2b2f940, 0x794bb2b2], + [0xbfe66359, 0xd185e6e6], + [0x380e7036, 0x1c7e0e0e], + [0x7c1ff863, 0x3ee71f1f], + [0x956237f7, 0xc4556262], + [0x77d4eea3, 0xb53ad4d4], + [0x9aa82932, 0x4d81a8a8], + [0x6296c4f4, 0x31529696], + [0xc3f99b3a, 0xef62f9f9], + [0x33c566f6, 0x97a3c5c5], + [0x942535b1, 0x4a102525], + [0x7959f220, 0xb2ab5959], + [0x2a8454ae, 0x15d08484], + [0xd572b7a7, 0xe4c57272], + [0xe439d5dd, 0x72ec3939], + [0x2d4c5a61, 0x98164c4c], + [0x655eca3b, 0xbc945e5e], + [0xfd78e785, 0xf09f7878], + [0xe038ddd8, 0x70e53838], + [0x0a8c1486, 0x05988c8c], + [0x63d1c6b2, 0xbf17d1d1], + [0xaea5410b, 0x57e4a5a5], + [0xafe2434d, 0xd9a1e2e2], + [0x99612ff8, 0xc24e6161], + [0xf6b3f145, 0x7b42b3b3], + [0x842115a5, 0x42342121], + [0x4a9c94d6, 0x25089c9c], + [0x781ef066, 0x3cee1e1e], + [0x11432252, 0x86614343], + [0x3bc776fc, 0x93b1c7c7], + [0xd7fcb32b, 0xe54ffcfc], + [0x10042014, 0x08240404], + [0x5951b208, 0xa2e35151], + [0x5e99bcc7, 0x2f259999], + [0xa96d4fc4, 0xda226d6d], + [0x340d6839, 0x1a650d0d], + [0xcffa8335, 0xe979fafa], + [0x5bdfb684, 0xa369dfdf], + [0xe57ed79b, 0xfca97e7e], + [0x90243db4, 0x48192424], + [0xec3bc5d7, 0x76fe3b3b], + [0x96ab313d, 0x4b9aabab], + [0x1fce3ed1, 0x81f0cece], + [0x44118855, 0x22991111], + [0x068f0c89, 0x03838f8f], + [0x254e4a6b, 0x9c044e4e], + [0xe6b7d151, 0x7366b7b7], + [0x8beb0b60, 0xcbe0ebeb], + [0xf03cfdcc, 0x78c13c3c], + [0x3e817cbf, 0x1ffd8181], + [0x6a94d4fe, 0x35409494], + [0xfbf7eb0c, 0xf31cf7f7], + [0xdeb9a167, 0x6f18b9b9], + [0x4c13985f, 0x268b1313], + [0xb02c7d9c, 0x58512c2c], + [0x6bd3d6b8, 0xbb05d3d3], + [0xbbe76b5c, 0xd38ce7e7], + [0xa56e57cb, 0xdc396e6e], + [0x37c46ef3, 0x95aac4c4], + [0x0c03180f, 0x061b0303], + [0x45568a13, 0xacdc5656], + [0x0d441a49, 0x885e4444], + [0xe17fdf9e, 0xfea07f7f], + [0x9ea92137, 0x4f88a9a9], + [0xa82a4d82, 0x54672a2a], + [0xd6bbb16d, 0x6b0abbbb], + [0x23c146e2, 0x9f87c1c1], + [0x5153a202, 0xa6f15353], + [0x57dcae8b, 0xa572dcdc], + [0x2c0b5827, 0x16530b0b], + [0x4e9d9cd3, 0x27019d9d], + [0xad6c47c1, 0xd82b6c6c], + [0xc43195f5, 0x62a43131], + [0xcd7487b9, 0xe8f37474], + [0xfff6e309, 0xf115f6f6], + [0x05460a43, 0x8c4c4646], + [0x8aac0926, 0x45a5acac], + [0x1e893c97, 0x0fb58989], + [0x5014a044, 0x28b41414], + [0xa3e15b42, 0xdfbae1e1], + [0x5816b04e, 0x2ca61616], + [0xe83acdd2, 0x74f73a3a], + [0xb9696fd0, 0xd2066969], + [0x2409482d, 0x12410909], + [0xdd70a7ad, 0xe0d77070], + [0xe2b6d954, 0x716fb6b6], + [0x67d0ceb7, 0xbd1ed0d0], + [0x93ed3b7e, 0xc7d6eded], + [0x17cc2edb, 0x85e2cccc], + [0x15422a57, 0x84684242], + [0x5a98b4c2, 0x2d2c9898], + [0xaaa4490e, 0x55eda4a4], + [0xa0285d88, 0x50752828], + [0x6d5cda31, 0xb8865c5c], + [0xc7f8933f, 0xed6bf8f8], + [0x228644a4, 0x11c28686] +]); + +final _c7 = Register64List.from([ + [0x186018c0, 0x7830d818], + [0x238c2305, 0xaf462623], + [0xc63fc67e, 0xf991b8c6], + [0xe887e813, 0x6fcdfbe8], + [0x8726874c, 0xa113cb87], + [0xb8dab8a9, 0x626d11b8], + [0x01040108, 0x05020901], + [0x4f214f42, 0x6e9e0d4f], + [0x36d836ad, 0xee6c9b36], + [0xa6a2a659, 0x0451ffa6], + [0xd26fd2de, 0xbdb90cd2], + [0xf5f3f5fb, 0x06f70ef5], + [0x79f979ef, 0x80f29679], + [0x6fa16f5f, 0xcede306f], + [0x917e91fc, 0xef3f6d91], + [0x525552aa, 0x07a4f852], + [0x609d6027, 0xfdc04760], + [0xbccabc89, 0x766535bc], + [0x9b569bac, 0xcd2b379b], + [0x8e028e04, 0x8c018a8e], + [0xa3b6a371, 0x155bd2a3], + [0x0c300c60, 0x3c186c0c], + [0x7bf17bff, 0x8af6847b], + [0x35d435b5, 0xe16a8035], + [0x1d741de8, 0x693af51d], + [0xe0a7e053, 0x47ddb3e0], + [0xd77bd7f6, 0xacb321d7], + [0xc22fc25e, 0xed999cc2], + [0x2eb82e6d, 0x965c432e], + [0x4b314b62, 0x7a96294b], + [0xfedffea3, 0x21e15dfe], + [0x57415782, 0x16aed557], + [0x155415a8, 0x412abd15], + [0x77c1779f, 0xb6eee877], + [0x37dc37a5, 0xeb6e9237], + [0xe5b3e57b, 0x56d79ee5], + [0x9f469f8c, 0xd923139f], + [0xf0e7f0d3, 0x17fd23f0], + [0x4a354a6a, 0x7f94204a], + [0xda4fda9e, 0x95a944da], + [0x587d58fa, 0x25b0a258], + [0xc903c906, 0xca8fcfc9], + [0x29a42955, 0x8d527c29], + [0x0a280a50, 0x22145a0a], + [0xb1feb1e1, 0x4f7f50b1], + [0xa0baa069, 0x1a5dc9a0], + [0x6bb16b7f, 0xdad6146b], + [0x852e855c, 0xab17d985], + [0xbdcebd81, 0x73673cbd], + [0x5d695dd2, 0x34ba8f5d], + [0x10401080, 0x50209010], + [0xf4f7f4f3, 0x03f507f4], + [0xcb0bcb16, 0xc08bddcb], + [0x3ef83eed, 0xc67cd33e], + [0x05140528, 0x110a2d05], + [0x6781671f, 0xe6ce7867], + [0xe4b7e473, 0x53d597e4], + [0x279c2725, 0xbb4e0227], + [0x41194132, 0x58827341], + [0x8b168b2c, 0x9d0ba78b], + [0xa7a6a751, 0x0153f6a7], + [0x7de97dcf, 0x94fab27d], + [0x956e95dc, 0xfb374995], + [0xd847d88e, 0x9fad56d8], + [0xfbcbfb8b, 0x30eb70fb], + [0xee9fee23, 0x71c1cdee], + [0x7ced7cc7, 0x91f8bb7c], + [0x66856617, 0xe3cc7166], + [0xdd53dda6, 0x8ea77bdd], + [0x175c17b8, 0x4b2eaf17], + [0x47014702, 0x468e4547], + [0x9e429e84, 0xdc211a9e], + [0xca0fca1e, 0xc589d4ca], + [0x2db42d75, 0x995a582d], + [0xbfc6bf91, 0x79632ebf], + [0x071c0738, 0x1b0e3f07], + [0xad8ead01, 0x2347acad], + [0x5a755aea, 0x2fb4b05a], + [0x8336836c, 0xb51bef83], + [0x33cc3385, 0xff66b633], + [0x6391633f, 0xf2c65c63], + [0x02080210, 0x0a041202], + [0xaa92aa39, 0x384993aa], + [0x71d971af, 0xa8e2de71], + [0xc807c80e, 0xcf8dc6c8], + [0x196419c8, 0x7d32d119], + [0x49394972, 0x70923b49], + [0xd943d986, 0x9aaf5fd9], + [0xf2eff2c3, 0x1df931f2], + [0xe3abe34b, 0x48dba8e3], + [0x5b715be2, 0x2ab6b95b], + [0x881a8834, 0x920dbc88], + [0x9a529aa4, 0xc8293e9a], + [0x2698262d, 0xbe4c0b26], + [0x32c8328d, 0xfa64bf32], + [0xb0fab0e9, 0x4a7d59b0], + [0xe983e91b, 0x6acff2e9], + [0x0f3c0f78, 0x331e770f], + [0xd573d5e6, 0xa6b733d5], + [0x803a8074, 0xba1df480], + [0xbec2be99, 0x7c6127be], + [0xcd13cd26, 0xde87ebcd], + [0x34d034bd, 0xe4688934], + [0x483d487a, 0x75903248], + [0xffdbffab, 0x24e354ff], + [0x7af57af7, 0x8ff48d7a], + [0x907a90f4, 0xea3d6490], + [0x5f615fc2, 0x3ebe9d5f], + [0x2080201d, 0xa0403d20], + [0x68bd6867, 0xd5d00f68], + [0x1a681ad0, 0x7234ca1a], + [0xae82ae19, 0x2c41b7ae], + [0xb4eab4c9, 0x5e757db4], + [0x544d549a, 0x19a8ce54], + [0x937693ec, 0xe53b7f93], + [0x2288220d, 0xaa442f22], + [0x648d6407, 0xe9c86364], + [0xf1e3f1db, 0x12ff2af1], + [0x73d173bf, 0xa2e6cc73], + [0x12481290, 0x5a248212], + [0x401d403a, 0x5d807a40], + [0x08200840, 0x28104808], + [0xc32bc356, 0xe89b95c3], + [0xec97ec33, 0x7bc5dfec], + [0xdb4bdb96, 0x90ab4ddb], + [0xa1bea161, 0x1f5fc0a1], + [0x8d0e8d1c, 0x8307918d], + [0x3df43df5, 0xc97ac83d], + [0x976697cc, 0xf1335b97], + [0x00000000, 0x00000000], + [0xcf1bcf36, 0xd483f9cf], + [0x2bac2b45, 0x87566e2b], + [0x76c57697, 0xb3ece176], + [0x82328264, 0xb019e682], + [0xd67fd6fe, 0xa9b128d6], + [0x1b6c1bd8, 0x7736c31b], + [0xb5eeb5c1, 0x5b7774b5], + [0xaf86af11, 0x2943beaf], + [0x6ab56a77, 0xdfd41d6a], + [0x505d50ba, 0x0da0ea50], + [0x45094512, 0x4c8a5745], + [0xf3ebf3cb, 0x18fb38f3], + [0x30c0309d, 0xf060ad30], + [0xef9bef2b, 0x74c3c4ef], + [0x3ffc3fe5, 0xc37eda3f], + [0x55495592, 0x1caac755], + [0xa2b2a279, 0x1059dba2], + [0xea8fea03, 0x65c9e9ea], + [0x6589650f, 0xecca6a65], + [0xbad2bab9, 0x686903ba], + [0x2fbc2f65, 0x935e4a2f], + [0xc027c04e, 0xe79d8ec0], + [0xde5fdebe, 0x81a160de], + [0x1c701ce0, 0x6c38fc1c], + [0xfdd3fdbb, 0x2ee746fd], + [0x4d294d52, 0x649a1f4d], + [0x927292e4, 0xe0397692], + [0x75c9758f, 0xbceafa75], + [0x06180630, 0x1e0c3606], + [0x8a128a24, 0x9809ae8a], + [0xb2f2b2f9, 0x40794bb2], + [0xe6bfe663, 0x59d185e6], + [0x0e380e70, 0x361c7e0e], + [0x1f7c1ff8, 0x633ee71f], + [0x62956237, 0xf7c45562], + [0xd477d4ee, 0xa3b53ad4], + [0xa89aa829, 0x324d81a8], + [0x966296c4, 0xf4315296], + [0xf9c3f99b, 0x3aef62f9], + [0xc533c566, 0xf697a3c5], + [0x25942535, 0xb14a1025], + [0x597959f2, 0x20b2ab59], + [0x842a8454, 0xae15d084], + [0x72d572b7, 0xa7e4c572], + [0x39e439d5, 0xdd72ec39], + [0x4c2d4c5a, 0x6198164c], + [0x5e655eca, 0x3bbc945e], + [0x78fd78e7, 0x85f09f78], + [0x38e038dd, 0xd870e538], + [0x8c0a8c14, 0x8605988c], + [0xd163d1c6, 0xb2bf17d1], + [0xa5aea541, 0x0b57e4a5], + [0xe2afe243, 0x4dd9a1e2], + [0x6199612f, 0xf8c24e61], + [0xb3f6b3f1, 0x457b42b3], + [0x21842115, 0xa5423421], + [0x9c4a9c94, 0xd625089c], + [0x1e781ef0, 0x663cee1e], + [0x43114322, 0x52866143], + [0xc73bc776, 0xfc93b1c7], + [0xfcd7fcb3, 0x2be54ffc], + [0x04100420, 0x14082404], + [0x515951b2, 0x08a2e351], + [0x995e99bc, 0xc72f2599], + [0x6da96d4f, 0xc4da226d], + [0x0d340d68, 0x391a650d], + [0xfacffa83, 0x35e979fa], + [0xdf5bdfb6, 0x84a369df], + [0x7ee57ed7, 0x9bfca97e], + [0x2490243d, 0xb4481924], + [0x3bec3bc5, 0xd776fe3b], + [0xab96ab31, 0x3d4b9aab], + [0xce1fce3e, 0xd181f0ce], + [0x11441188, 0x55229911], + [0x8f068f0c, 0x8903838f], + [0x4e254e4a, 0x6b9c044e], + [0xb7e6b7d1, 0x517366b7], + [0xeb8beb0b, 0x60cbe0eb], + [0x3cf03cfd, 0xcc78c13c], + [0x813e817c, 0xbf1ffd81], + [0x946a94d4, 0xfe354094], + [0xf7fbf7eb, 0x0cf31cf7], + [0xb9deb9a1, 0x676f18b9], + [0x134c1398, 0x5f268b13], + [0x2cb02c7d, 0x9c58512c], + [0xd36bd3d6, 0xb8bb05d3], + [0xe7bbe76b, 0x5cd38ce7], + [0x6ea56e57, 0xcbdc396e], + [0xc437c46e, 0xf395aac4], + [0x030c0318, 0x0f061b03], + [0x5645568a, 0x13acdc56], + [0x440d441a, 0x49885e44], + [0x7fe17fdf, 0x9efea07f], + [0xa99ea921, 0x374f88a9], + [0x2aa82a4d, 0x8254672a], + [0xbbd6bbb1, 0x6d6b0abb], + [0xc123c146, 0xe29f87c1], + [0x535153a2, 0x02a6f153], + [0xdc57dcae, 0x8ba572dc], + [0x0b2c0b58, 0x2716530b], + [0x9d4e9d9c, 0xd327019d], + [0x6cad6c47, 0xc1d82b6c], + [0x31c43195, 0xf562a431], + [0x74cd7487, 0xb9e8f374], + [0xf6fff6e3, 0x09f115f6], + [0x4605460a, 0x438c4c46], + [0xac8aac09, 0x2645a5ac], + [0x891e893c, 0x970fb589], + [0x145014a0, 0x4428b414], + [0xe1a3e15b, 0x42dfbae1], + [0x165816b0, 0x4e2ca616], + [0x3ae83acd, 0xd274f73a], + [0x69b9696f, 0xd0d20669], + [0x09240948, 0x2d124109], + [0x70dd70a7, 0xade0d770], + [0xb6e2b6d9, 0x54716fb6], + [0xd067d0ce, 0xb7bd1ed0], + [0xed93ed3b, 0x7ec7d6ed], + [0xcc17cc2e, 0xdb85e2cc], + [0x4215422a, 0x57846842], + [0x985a98b4, 0xc22d2c98], + [0xa4aaa449, 0x0e55eda4], + [0x28a0285d, 0x88507528], + [0x5c6d5cda, 0x31b8865c], + [0xf8c7f893, 0x3fed6bf8], + [0x86228644, 0xa411c286] +]); + +final _rc = Register64List.from([ + [0x00000000, 0x00000000], + [0x1823c6e8, 0x87b8014f], + [0x36a6d2f5, 0x796f9152], + [0x60bc9b8e, 0xa30c7b35], + [0x1de0d7c2, 0x2e4bfe57], + [0x157737e5, 0x9ff04ada], + [0x58c9290a, 0xb1a06b85], + [0xbd5d10f4, 0xcb3e0567], + [0xe427418b, 0xa77d95d8], + [0xfbee7c66, 0xdd17479e], + [0xca2dbf07, 0xad5a8333] +]); diff --git a/pointycastle/lib/digests/xof_utils.dart b/pointycastle/lib/digests/xof_utils.dart new file mode 100644 index 0000000..7939622 --- /dev/null +++ b/pointycastle/lib/digests/xof_utils.dart @@ -0,0 +1,37 @@ +library impl.digest.utils; + +import 'dart:typed_data'; + +class XofUtils { + static Uint8List leftEncode(int strLen) { + var n = 1; + var v = strLen; + while ((v >>= 8) != 0) { + n++; + } + var b = Uint8List(n + 1); + b[0] = n; + for (var i = 1; i <= n; i++) { + b[i] = strLen >> (8 * (n - i)); + } + return b; + } + + static Uint8List rightEncode(int strLen) { + var n = 1; + var v = strLen; + while ((v >>= 8) != 0) { + n++; + } + + var b = Uint8List(n + 1); + + b[n] = n; + + for (var i = 0; i < n; i++) { + b[i] = strLen >> (8 * (n - i - 1)); + } + + return b; + } +} diff --git a/pointycastle/lib/ecc/api.dart b/pointycastle/lib/ecc/api.dart new file mode 100644 index 0000000..425ce64 --- /dev/null +++ b/pointycastle/lib/ecc/api.dart @@ -0,0 +1,236 @@ +// See file LICENSE for more information. + +library api.ecc; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +export 'ecdh.dart'; + +/// Standard ECC curve description +abstract class ECDomainParameters { + /// Get this domain's standard name. + String get domainName; + + ECCurve get curve; + + List? get seed; + + ECPoint get G; + + BigInt get n; + + /// Create a curve description from its standard name + factory ECDomainParameters(String domainName) => + registry.create(domainName); +} + +/// Type for coordinates of an [ECPoint] +abstract class ECFieldElement { + BigInt? toBigInteger(); + + String get fieldName; + + int get fieldSize; + + int get byteLength; + + ECFieldElement operator +(ECFieldElement b); + + ECFieldElement operator -(ECFieldElement b); + + ECFieldElement operator *(ECFieldElement b); + + ECFieldElement operator /(ECFieldElement b); + + ECFieldElement operator -(); + + ECFieldElement invert(); + + ECFieldElement square(); + + ECFieldElement? sqrt(); +} + +/// An elliptic curve point +abstract class ECPoint { + ECCurve get curve; + + ECFieldElement? get x; + + ECFieldElement? get y; + + bool get isCompressed; + + bool get isInfinity; + + Uint8List getEncoded([bool compressed = true]); + + ECPoint? operator +(ECPoint? b); + + ECPoint? operator -(ECPoint b); + + ECPoint operator -(); + + ECPoint? twice(); + + /// Multiply this point by the given number [k]. + ECPoint? operator *(BigInt? k); +} + +/// An elliptic curve +abstract class ECCurve { + ECFieldElement? get a; + + ECFieldElement? get b; + + int get fieldSize; + + ECPoint? get infinity; + + /// Create an [ECFieldElement] on this curve from its big integer value. + ECFieldElement fromBigInteger(BigInt x); + + /// Create an [ECPoint] on its curve from its coordinates + ECPoint createPoint(BigInt x, BigInt y, [bool withCompression = false]); + + ECPoint decompressPoint(int yTilde, BigInt x1); + + /// Decode a point on this curve from its ASN.1 encoding. The different encodings are taken account of, including point + /// compression for Fp (X9.62 s 4.2.1 pg 17). + ECPoint? decodePoint(List encoded); +} + +/// Base class for asymmetric keys in ECC +abstract class ECAsymmetricKey implements AsymmetricKey { + /// The domain parameters of this key + final ECDomainParameters? parameters; + + /// Create an asymmetric key for the given domain parameters + ECAsymmetricKey(this.parameters); +} + +/// Private keys in ECC +class ECPrivateKey extends ECAsymmetricKey implements PrivateKey { + /// ECC's d private parameter + final BigInt? d; + + /// Create an ECC private key for the given d and domain parameters. + ECPrivateKey(this.d, ECDomainParameters? parameters) : super(parameters); + @override + bool operator ==(Object other) { + if (other is! ECPrivateKey) return false; + return (other.parameters == parameters) && (other.d == d); + } + + @override + int get hashCode { + return parameters.hashCode + d.hashCode; + } +} + +/// Public keys in ECC +class ECPublicKey extends ECAsymmetricKey implements PublicKey { + /// ECC's Q public parameter + final ECPoint? Q; + + /// Create an ECC public key for the given Q and domain parameters. + ECPublicKey(this.Q, ECDomainParameters? parameters) : super(parameters); + @override + bool operator ==(Object other) { + if (other is! ECPublicKey) return false; + return (other.parameters == parameters) && (other.Q == Q); + } + + @override + int get hashCode { + return parameters.hashCode + Q.hashCode; + } +} + +/// A [Signature] created with ECC. +class ECSignature implements Signature { + final BigInt r; + final BigInt s; + + ECSignature(this.r, this.s); + + /// Returns true if s is in lower-s form, false otherwise. + bool isNormalized(ECDomainParameters curveParams) { + return !(s.compareTo(curveParams.n >> 1) > 0); + } + + /// + /// 'normalize' this signature by converting its s to lower-s form if necessary + /// This is required to validate this signature with some libraries such as libsecp256k1 + /// which enforce lower-s form for all signatures to combat ecdsa signature malleability + /// + /// Returns this if the signature was already normalized, or a copy if it is changed. + /// + ECSignature normalize(ECDomainParameters curveParams) { + if (isNormalized(curveParams)) { + return this; + } + return ECSignature(r, curveParams.n - s); + } + + @override + String toString() => '(${r.toString()},${s.toString()})'; + @override + bool operator ==(Object other) { + if (other is! ECSignature) return false; + return (other.r == r) && (other.s == s); + } + + @override + int get hashCode { + return r.hashCode + s.hashCode; + } +} + +/// A pair of [ECPoint]s. +class ECPair { + final ECPoint x; + final ECPoint y; + + const ECPair(this.x, this.y); + + @override + bool operator ==(Object other) { + if (other is! ECPair) return false; + return (other.x == x) && (other.y == y); + } + + @override + int get hashCode => x.hashCode + y.hashCode * 37; +} + +/// The encryptor using Elliptic Curve +abstract class ECEncryptor { + ECPair encrypt(ECPoint point); + + /// Initialize the encryptor. + void init(CipherParameters params); +} + +/// The decryptor using Elliptic Curve +abstract class ECDecryptor { + ECPoint decrypt(ECPair pair); + + /// Initialize the decryptor. + void init(CipherParameters params); +} + +abstract class ECDHAgreement { + /// initialise the agreement engine. + void init(ECPrivateKey param); + + /// return the field size for the agreement algorithm in bytes. + int getFieldSize(); + + /// given a public key from a given party calculate the next + /// message in the agreement sequence. + BigInt calculateAgreement(ECPublicKey pubKey); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp160r1.dart b/pointycastle/lib/ecc/curves/brainpoolp160r1.dart new file mode 100644 index 0000000..16a2452 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp160r1.dart @@ -0,0 +1,33 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp160r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp160r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp160r1', () => ECCurve_brainpoolp160r1()); + + factory ECCurve_brainpoolp160r1() => constructFpStandardCurve( + 'brainpoolp160r1', ECCurve_brainpoolp160r1._make, + q: BigInt.parse('e95e4a5f737059dc60dfc7ad95b3d8139515620f', radix: 16), + a: BigInt.parse('340e7be2a280eb74e2be61bada745d97e8f7c300', radix: 16), + b: BigInt.parse('1e589a8595423412134faa2dbdec95c8d8675e58', radix: 16), + g: BigInt.parse( + '04bed5af16ea3f6a4f62938c4631eb5af7bdbcdbc31667cb477a1a8ec338f94741669c976316da6321', + radix: 16), + n: BigInt.parse('e95e4a5f737059dc60df5991d45029409e60fc09', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp160r1; + + static ECCurve_brainpoolp160r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp160r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp160r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp160t1.dart b/pointycastle/lib/ecc/curves/brainpoolp160t1.dart new file mode 100644 index 0000000..f4f363c --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp160t1.dart @@ -0,0 +1,33 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp160t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp160t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp160t1', () => ECCurve_brainpoolp160t1()); + + factory ECCurve_brainpoolp160t1() => constructFpStandardCurve( + 'brainpoolp160t1', ECCurve_brainpoolp160t1._make, + q: BigInt.parse('e95e4a5f737059dc60dfc7ad95b3d8139515620f', radix: 16), + a: BigInt.parse('e95e4a5f737059dc60dfc7ad95b3d8139515620c', radix: 16), + b: BigInt.parse('7a556b6dae535b7b51ed2c4d7daa7a0b5c55f380', radix: 16), + g: BigInt.parse( + '04b199b13b9b34efc1397e64baeb05acc265ff2378add6718b7c7c1961f0991b842443772152c9e0ad', + radix: 16), + n: BigInt.parse('e95e4a5f737059dc60df5991d45029409e60fc09', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp160t1; + + static ECCurve_brainpoolp160t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp160t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp160t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp192r1.dart b/pointycastle/lib/ecc/curves/brainpoolp192r1.dart new file mode 100644 index 0000000..2b1232e --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp192r1.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp192r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp192r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp192r1', () => ECCurve_brainpoolp192r1()); + + factory ECCurve_brainpoolp192r1() => constructFpStandardCurve( + 'brainpoolp192r1', ECCurve_brainpoolp192r1._make, + q: BigInt.parse('c302f41d932a36cda7a3463093d18db78fce476de1a86297', + radix: 16), + a: BigInt.parse('6a91174076b1e0e19c39c031fe8685c1cae040e5c69a28ef', + radix: 16), + b: BigInt.parse('469a28ef7c28cca3dc721d044f4496bcca7ef4146fbf25c9', + radix: 16), + g: BigInt.parse( + '04c0a0647eaab6a48753b033c56cb0f0900a2f5c4853375fd614b690866abd5bb88b5f4828c1490002e6773fa2fa299b8f', + radix: 16), + n: BigInt.parse('c302f41d932a36cda7a3462f9e9e916b5be8f1029ac4acc1', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp192r1; + + static ECCurve_brainpoolp192r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp192r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp192r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp192t1.dart b/pointycastle/lib/ecc/curves/brainpoolp192t1.dart new file mode 100644 index 0000000..3c98ef3 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp192t1.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp192t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp192t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp192t1', () => ECCurve_brainpoolp192t1()); + + factory ECCurve_brainpoolp192t1() => constructFpStandardCurve( + 'brainpoolp192t1', ECCurve_brainpoolp192t1._make, + q: BigInt.parse('c302f41d932a36cda7a3463093d18db78fce476de1a86297', + radix: 16), + a: BigInt.parse('c302f41d932a36cda7a3463093d18db78fce476de1a86294', + radix: 16), + b: BigInt.parse('13d56ffaec78681e68f9deb43b35bec2fb68542e27897b79', + radix: 16), + g: BigInt.parse( + '043ae9e58c82f63c30282e1fe7bbf43fa72c446af6f4618129097e2c5667c2223a902ab5ca449d0084b7e5b3de7ccc01c9', + radix: 16), + n: BigInt.parse('c302f41d932a36cda7a3462f9e9e916b5be8f1029ac4acc1', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp192t1; + + static ECCurve_brainpoolp192t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp192t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp192t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp224r1.dart b/pointycastle/lib/ecc/curves/brainpoolp224r1.dart new file mode 100644 index 0000000..b529e04 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp224r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp224r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp224r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp224r1', () => ECCurve_brainpoolp224r1()); + + factory ECCurve_brainpoolp224r1() => constructFpStandardCurve( + 'brainpoolp224r1', ECCurve_brainpoolp224r1._make, + q: BigInt.parse( + 'd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff', + radix: 16), + a: BigInt.parse( + '68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43', + radix: 16), + b: BigInt.parse( + '2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b', + radix: 16), + g: BigInt.parse( + '040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd', + radix: 16), + n: BigInt.parse( + 'd7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp224r1; + + static ECCurve_brainpoolp224r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp224r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp224r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp224t1.dart b/pointycastle/lib/ecc/curves/brainpoolp224t1.dart new file mode 100644 index 0000000..efc0fd8 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp224t1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp224t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp224t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp224t1', () => ECCurve_brainpoolp224t1()); + + factory ECCurve_brainpoolp224t1() => constructFpStandardCurve( + 'brainpoolp224t1', ECCurve_brainpoolp224t1._make, + q: BigInt.parse( + 'd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff', + radix: 16), + a: BigInt.parse( + 'd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc', + radix: 16), + b: BigInt.parse( + '4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d', + radix: 16), + g: BigInt.parse( + '046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c', + radix: 16), + n: BigInt.parse( + 'd7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp224t1; + + static ECCurve_brainpoolp224t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt? h, List? seed) => + ECCurve_brainpoolp224t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp224t1._super( + super.domainName, super.curve, super.G, super.n, super.h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp256r1.dart b/pointycastle/lib/ecc/curves/brainpoolp256r1.dart new file mode 100644 index 0000000..ed0f89b --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp256r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp256r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp256r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp256r1', () => ECCurve_brainpoolp256r1()); + + factory ECCurve_brainpoolp256r1() => constructFpStandardCurve( + 'brainpoolp256r1', ECCurve_brainpoolp256r1._make, + q: BigInt.parse( + 'a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377', + radix: 16), + a: BigInt.parse( + '7d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9', + radix: 16), + b: BigInt.parse( + '26dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b6', + radix: 16), + g: BigInt.parse( + '048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997', + radix: 16), + n: BigInt.parse( + 'a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp256r1; + + static ECCurve_brainpoolp256r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp256r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp256r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp256t1.dart b/pointycastle/lib/ecc/curves/brainpoolp256t1.dart new file mode 100644 index 0000000..690fe10 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp256t1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp256t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp256t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp256t1', () => ECCurve_brainpoolp256t1()); + + factory ECCurve_brainpoolp256t1() => constructFpStandardCurve( + 'brainpoolp256t1', ECCurve_brainpoolp256t1._make, + q: BigInt.parse( + 'a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377', + radix: 16), + a: BigInt.parse( + 'a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5374', + radix: 16), + b: BigInt.parse( + '662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04', + radix: 16), + g: BigInt.parse( + '04a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be', + radix: 16), + n: BigInt.parse( + 'a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp256t1; + + static ECCurve_brainpoolp256t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp256t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp256t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp320r1.dart b/pointycastle/lib/ecc/curves/brainpoolp320r1.dart new file mode 100644 index 0000000..9618df0 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp320r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp320r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp320r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp320r1', () => ECCurve_brainpoolp320r1()); + + factory ECCurve_brainpoolp320r1() => constructFpStandardCurve( + 'brainpoolp320r1', ECCurve_brainpoolp320r1._make, + q: BigInt.parse( + 'd35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27', + radix: 16), + a: BigInt.parse( + '3ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb4', + radix: 16), + b: BigInt.parse( + '520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a6', + radix: 16), + g: BigInt.parse( + '0443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1', + radix: 16), + n: BigInt.parse( + 'd35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp320r1; + + static ECCurve_brainpoolp320r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp320r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp320r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp320t1.dart b/pointycastle/lib/ecc/curves/brainpoolp320t1.dart new file mode 100644 index 0000000..289d43d --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp320t1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp320t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp320t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp320t1', () => ECCurve_brainpoolp320t1()); + + factory ECCurve_brainpoolp320t1() => constructFpStandardCurve( + 'brainpoolp320t1', ECCurve_brainpoolp320t1._make, + q: BigInt.parse( + 'd35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27', + radix: 16), + a: BigInt.parse( + 'd35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e24', + radix: 16), + b: BigInt.parse( + 'a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353', + radix: 16), + g: BigInt.parse( + '04925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3', + radix: 16), + n: BigInt.parse( + 'd35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp320t1; + + static ECCurve_brainpoolp320t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp320t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp320t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp384r1.dart b/pointycastle/lib/ecc/curves/brainpoolp384r1.dart new file mode 100644 index 0000000..ae2749a --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp384r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp384r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp384r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp384r1', () => ECCurve_brainpoolp384r1()); + + factory ECCurve_brainpoolp384r1() => constructFpStandardCurve( + 'brainpoolp384r1', ECCurve_brainpoolp384r1._make, + q: BigInt.parse( + '8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53', + radix: 16), + a: BigInt.parse( + '7bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826', + radix: 16), + b: BigInt.parse( + '4a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c11', + radix: 16), + g: BigInt.parse( + '041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315', + radix: 16), + n: BigInt.parse( + '8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp384r1; + + static ECCurve_brainpoolp384r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp384r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp384r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super.h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp384t1.dart b/pointycastle/lib/ecc/curves/brainpoolp384t1.dart new file mode 100644 index 0000000..a0479de --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp384t1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp384t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp384t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp384t1', () => ECCurve_brainpoolp384t1()); + + factory ECCurve_brainpoolp384t1() => constructFpStandardCurve( + 'brainpoolp384t1', ECCurve_brainpoolp384t1._make, + q: BigInt.parse( + '8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53', + radix: 16), + a: BigInt.parse( + '8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec50', + radix: 16), + b: BigInt.parse( + '7f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee', + radix: 16), + g: BigInt.parse( + '0418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e582928', + radix: 16), + n: BigInt.parse( + '8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp384t1; + + static ECCurve_brainpoolp384t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp384t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp384t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp512r1.dart b/pointycastle/lib/ecc/curves/brainpoolp512r1.dart new file mode 100644 index 0000000..b9ac142 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp512r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp512r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp512r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp512r1', () => ECCurve_brainpoolp512r1()); + + factory ECCurve_brainpoolp512r1() => constructFpStandardCurve( + 'brainpoolp512r1', ECCurve_brainpoolp512r1._make, + q: BigInt.parse( + 'aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3', + radix: 16), + a: BigInt.parse( + '7830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca', + radix: 16), + b: BigInt.parse( + '3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723', + radix: 16), + g: BigInt.parse( + '0481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892', + radix: 16), + n: BigInt.parse( + 'aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp512r1; + + static ECCurve_brainpoolp512r1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp512r1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp512r1._super(super.domainName, super.curve, super.G, + super.n, BigInt super.h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/brainpoolp512t1.dart b/pointycastle/lib/ecc/curves/brainpoolp512t1.dart new file mode 100644 index 0000000..461dc62 --- /dev/null +++ b/pointycastle/lib/ecc/curves/brainpoolp512t1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.brainpoolp512t1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_brainpoolp512t1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'brainpoolp512t1', () => ECCurve_brainpoolp512t1()); + + factory ECCurve_brainpoolp512t1() => constructFpStandardCurve( + 'brainpoolp512t1', ECCurve_brainpoolp512t1._make, + q: BigInt.parse( + 'aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3', + radix: 16), + a: BigInt.parse( + 'aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f0', + radix: 16), + b: BigInt.parse( + '7cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e', + radix: 16), + g: BigInt.parse( + '04640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332', + radix: 16), + n: BigInt.parse( + 'aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_brainpoolp512t1; + + static ECCurve_brainpoolp512t1 _make(String domainName, ECCurve curve, + ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_brainpoolp512t1._super(domainName, curve, G, n, h, seed); + + ECCurve_brainpoolp512t1._super(super.domainName, super.curve, super.G, + super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_a.dart b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_a.dart new file mode 100644 index 0000000..37d1113 --- /dev/null +++ b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_a.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.gostr3410_2001_cryptopro_a; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_gostr3410_2001_cryptopro_a extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, + 'GostR3410-2001-CryptoPro-A', + () => ECCurve_gostr3410_2001_cryptopro_a()); + + factory ECCurve_gostr3410_2001_cryptopro_a() => constructFpStandardCurve( + 'GostR3410-2001-CryptoPro-A', ECCurve_gostr3410_2001_cryptopro_a._make, + q: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd97', + radix: 16), + a: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd94', + radix: 16), + b: BigInt.parse('a6', radix: 16), + g: BigInt.parse( + '0400000000000000000000000000000000000000000000000000000000000000018d91e471e0989cda27df505a453f2b7635294f2ddf23e3b122acc99c9e9f1e14', + radix: 16), + n: BigInt.parse( + 'ffffffffffffffffffffffffffffffff6c611070995ad10045841b09b761b893', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_gostr3410_2001_cryptopro_a; + + static ECCurve_gostr3410_2001_cryptopro_a _make(String domainName, + ECCurve curve, ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_gostr3410_2001_cryptopro_a._super( + domainName, curve, G, n, h, seed); + + ECCurve_gostr3410_2001_cryptopro_a._super(super.domainName, super.curve, + super.G, super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_b.dart b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_b.dart new file mode 100644 index 0000000..74f2fb4 --- /dev/null +++ b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_b.dart @@ -0,0 +1,44 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.gostr3410_2001_cryptopro_b; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_gostr3410_2001_cryptopro_b extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, + 'GostR3410-2001-CryptoPro-B', + () => ECCurve_gostr3410_2001_cryptopro_b()); + + factory ECCurve_gostr3410_2001_cryptopro_b() => constructFpStandardCurve( + 'GostR3410-2001-CryptoPro-B', ECCurve_gostr3410_2001_cryptopro_b._make, + q: BigInt.parse( + '8000000000000000000000000000000000000000000000000000000000000c99', + radix: 16), + a: BigInt.parse( + '8000000000000000000000000000000000000000000000000000000000000c96', + radix: 16), + b: BigInt.parse( + '3e1af419a269a5f866a7d3c25c3df80ae979259373ff2b182f49d4ce7e1bbc8b', + radix: 16), + g: BigInt.parse( + '0400000000000000000000000000000000000000000000000000000000000000013fa8124359f96680b83d1c3eb2c070e5c545c9858d03ecfb744bf8d717717efc', + radix: 16), + n: BigInt.parse( + '800000000000000000000000000000015f700cfff1a624e5e497161bcc8a198f', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_gostr3410_2001_cryptopro_b; + + static ECCurve_gostr3410_2001_cryptopro_b _make(String domainName, + ECCurve curve, ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_gostr3410_2001_cryptopro_b._super( + domainName, curve, G, n, h, seed); + + ECCurve_gostr3410_2001_cryptopro_b._super(super.domainName, super.curve, + super.G, super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_c.dart b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_c.dart new file mode 100644 index 0000000..18e3b73 --- /dev/null +++ b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_c.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.gostr3410_2001_cryptopro_c; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_gostr3410_2001_cryptopro_c extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, + 'GostR3410-2001-CryptoPro-C', + () => ECCurve_gostr3410_2001_cryptopro_c()); + + factory ECCurve_gostr3410_2001_cryptopro_c() => constructFpStandardCurve( + 'GostR3410-2001-CryptoPro-C', ECCurve_gostr3410_2001_cryptopro_c._make, + q: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aacf846e86789051d37998f7b9022d759b', + radix: 16), + a: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aacf846e86789051d37998f7b9022d7598', + radix: 16), + b: BigInt.parse('805a', radix: 16), + g: BigInt.parse( + '04000000000000000000000000000000000000000000000000000000000000000041ece55743711a8c3cbf3783cd08c0ee4d4dc440d4641a8f366e550dfdb3bb67', + radix: 16), + n: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aa582ca3511eddfb74f02f3a6598980bb9', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_gostr3410_2001_cryptopro_c; + + static ECCurve_gostr3410_2001_cryptopro_c _make(String domainName, + ECCurve curve, ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_gostr3410_2001_cryptopro_c._super( + domainName, curve, G, n, h, seed); + + ECCurve_gostr3410_2001_cryptopro_c._super(super.domainName, super.curve, + super.G, super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xcha.dart b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xcha.dart new file mode 100644 index 0000000..0fc1c2f --- /dev/null +++ b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xcha.dart @@ -0,0 +1,43 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.gostr3410_2001_cryptopro_xcha; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_gostr3410_2001_cryptopro_xcha extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, + 'GostR3410-2001-CryptoPro-XchA', + () => ECCurve_gostr3410_2001_cryptopro_xcha()); + + factory ECCurve_gostr3410_2001_cryptopro_xcha() => constructFpStandardCurve( + 'GostR3410-2001-CryptoPro-XchA', + ECCurve_gostr3410_2001_cryptopro_xcha._make, + q: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd97', + radix: 16), + a: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd94', + radix: 16), + b: BigInt.parse('a6', radix: 16), + g: BigInt.parse( + '0400000000000000000000000000000000000000000000000000000000000000018d91e471e0989cda27df505a453f2b7635294f2ddf23e3b122acc99c9e9f1e14', + radix: 16), + n: BigInt.parse( + 'ffffffffffffffffffffffffffffffff6c611070995ad10045841b09b761b893', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_gostr3410_2001_cryptopro_xcha; + + static ECCurve_gostr3410_2001_cryptopro_xcha _make(String domainName, + ECCurve curve, ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_gostr3410_2001_cryptopro_xcha._super( + domainName, curve, G, n, h, seed); + + ECCurve_gostr3410_2001_cryptopro_xcha._super(super.domainName, super.curve, + super.G, super.n, BigInt super.h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xchb.dart b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xchb.dart new file mode 100644 index 0000000..545cb7a --- /dev/null +++ b/pointycastle/lib/ecc/curves/gostr3410_2001_cryptopro_xchb.dart @@ -0,0 +1,43 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.gostr3410_2001_cryptopro_xchb; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_gostr3410_2001_cryptopro_xchb extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, + 'GostR3410-2001-CryptoPro-XchB', + () => ECCurve_gostr3410_2001_cryptopro_xchb()); + + factory ECCurve_gostr3410_2001_cryptopro_xchb() => constructFpStandardCurve( + 'GostR3410-2001-CryptoPro-XchB', + ECCurve_gostr3410_2001_cryptopro_xchb._make, + q: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aacf846e86789051d37998f7b9022d759b', + radix: 16), + a: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aacf846e86789051d37998f7b9022d7598', + radix: 16), + b: BigInt.parse('805a', radix: 16), + g: BigInt.parse( + '04000000000000000000000000000000000000000000000000000000000000000041ece55743711a8c3cbf3783cd08c0ee4d4dc440d4641a8f366e550dfdb3bb67', + radix: 16), + n: BigInt.parse( + '9b9f605f5a858107ab1ec85e6b41c8aa582ca3511eddfb74f02f3a6598980bb9', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_gostr3410_2001_cryptopro_xchb; + + static ECCurve_gostr3410_2001_cryptopro_xchb _make(String domainName, + ECCurve curve, ECPoint G, BigInt n, BigInt h, List? seed) => + ECCurve_gostr3410_2001_cryptopro_xchb._super( + domainName, curve, G, n, h, seed); + + ECCurve_gostr3410_2001_cryptopro_xchb._super(super.domainName, super.curve, + super.G, super.n, BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime192v1.dart b/pointycastle/lib/ecc/curves/prime192v1.dart new file mode 100644 index 0000000..f175fd8 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime192v1.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime192v1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime192v1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime192v1', () => ECCurve_prime192v1()); + + factory ECCurve_prime192v1() => + constructFpStandardCurve('prime192v1', ECCurve_prime192v1._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffffffffffffff', + radix: 16), + a: BigInt.parse('fffffffffffffffffffffffffffffffefffffffffffffffc', + radix: 16), + b: BigInt.parse('64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1', + radix: 16), + g: BigInt.parse('03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012', + radix: 16), + n: BigInt.parse('ffffffffffffffffffffffff99def836146bc9b1b4d22831', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('3045ae6fc8422f64ed579528d38120eae12196d5', + radix: 16)) as ECCurve_prime192v1; + + static ECCurve_prime192v1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime192v1._super(domainName, curve, G, n, h, seed); + + ECCurve_prime192v1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime192v2.dart b/pointycastle/lib/ecc/curves/prime192v2.dart new file mode 100644 index 0000000..6fed7c3 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime192v2.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime192v2; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime192v2 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime192v2', () => ECCurve_prime192v2()); + + factory ECCurve_prime192v2() => + constructFpStandardCurve('prime192v2', ECCurve_prime192v2._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffffffffffffff', + radix: 16), + a: BigInt.parse('fffffffffffffffffffffffffffffffefffffffffffffffc', + radix: 16), + b: BigInt.parse('cc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953', + radix: 16), + g: BigInt.parse('03eea2bae7e1497842f2de7769cfe9c989c072ad696f48034a', + radix: 16), + n: BigInt.parse('fffffffffffffffffffffffe5fb1a724dc80418648d8dd31', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('31a92ee2029fd10d901b113e990710f0d21ac6b6', + radix: 16)) as ECCurve_prime192v2; + + static ECCurve_prime192v2 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime192v2._super(domainName, curve, G, n, h, seed); + + ECCurve_prime192v2._super(super.domainName, super.curve, super.G, super.n, + BigInt super.h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime192v3.dart b/pointycastle/lib/ecc/curves/prime192v3.dart new file mode 100644 index 0000000..3222932 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime192v3.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime192v3; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime192v3 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime192v3', () => ECCurve_prime192v3()); + + factory ECCurve_prime192v3() => + constructFpStandardCurve('prime192v3', ECCurve_prime192v3._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffffffffffffff', + radix: 16), + a: BigInt.parse('fffffffffffffffffffffffffffffffefffffffffffffffc', + radix: 16), + b: BigInt.parse('22123dc2395a05caa7423daeccc94760a7d462256bd56916', + radix: 16), + g: BigInt.parse('027d29778100c65a1da1783716588dce2b8b4aee8e228f1896', + radix: 16), + n: BigInt.parse('ffffffffffffffffffffffff7a62d031c83f4294f640ec13', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('c469684435deb378c4b65ca9591e2a5763059a2e', + radix: 16)) as ECCurve_prime192v3; + + static ECCurve_prime192v3 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime192v3._super(domainName, curve, G, n, h, seed); + + ECCurve_prime192v3._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime239v1.dart b/pointycastle/lib/ecc/curves/prime239v1.dart new file mode 100644 index 0000000..2c034e9 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime239v1.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime239v1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime239v1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime239v1', () => ECCurve_prime239v1()); + + factory ECCurve_prime239v1() => + constructFpStandardCurve('prime239v1', ECCurve_prime239v1._make, + q: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff', + radix: 16), + a: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc', + radix: 16), + b: BigInt.parse( + '6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a', + radix: 16), + g: BigInt.parse( + '020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf', + radix: 16), + n: BigInt.parse( + '7fffffffffffffffffffffff7fffff9e5e9a9f5d9071fbd1522688909d0b', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('e43bb460f0b80cc0c0b075798e948060f8321b7d', + radix: 16)) as ECCurve_prime239v1; + + static ECCurve_prime239v1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime239v1._super(domainName, curve, G, n, h, seed); + + ECCurve_prime239v1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime239v2.dart b/pointycastle/lib/ecc/curves/prime239v2.dart new file mode 100644 index 0000000..1d681b5 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime239v2.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime239v2; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime239v2 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime239v2', () => ECCurve_prime239v2()); + + factory ECCurve_prime239v2() => + constructFpStandardCurve('prime239v2', ECCurve_prime239v2._make, + q: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff', + radix: 16), + a: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc', + radix: 16), + b: BigInt.parse( + '617fab6832576cbbfed50d99f0249c3fee58b94ba0038c7ae84c8c832f2c', + radix: 16), + g: BigInt.parse( + '0238af09d98727705120c921bb5e9e26296a3cdcf2f35757a0eafd87b830e7', + radix: 16), + n: BigInt.parse( + '7fffffffffffffffffffffff800000cfa7e8594377d414c03821bc582063', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('e8b4011604095303ca3b8099982be09fcb9ae616', + radix: 16)) as ECCurve_prime239v2; + + static ECCurve_prime239v2 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime239v2._super(domainName, curve, G, n, h, seed); + + ECCurve_prime239v2._super(super.domainName, super.curve, super.G, super.n, + BigInt super.h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime239v3.dart b/pointycastle/lib/ecc/curves/prime239v3.dart new file mode 100644 index 0000000..4d01113 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime239v3.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime239v3; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime239v3 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime239v3', () => ECCurve_prime239v3()); + + factory ECCurve_prime239v3() => + constructFpStandardCurve('prime239v3', ECCurve_prime239v3._make, + q: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff', + radix: 16), + a: BigInt.parse( + '7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc', + radix: 16), + b: BigInt.parse( + '255705fa2a306654b1f4cb03d6a750a30c250102d4988717d9ba15ab6d3e', + radix: 16), + g: BigInt.parse( + '036768ae8e18bb92cfcf005c949aa2c6d94853d0e660bbf854b1c9505fe95a', + radix: 16), + n: BigInt.parse( + '7fffffffffffffffffffffff7fffff975deb41b3a6057c3c432146526551', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('7d7374168ffe3471b60a857686a19475d3bfa2ff', + radix: 16)) as ECCurve_prime239v3; + + static ECCurve_prime239v3 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime239v3._super(domainName, curve, G, n, h, seed); + + ECCurve_prime239v3._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/prime256v1.dart b/pointycastle/lib/ecc/curves/prime256v1.dart new file mode 100644 index 0000000..bc32d19 --- /dev/null +++ b/pointycastle/lib/ecc/curves/prime256v1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.prime256v1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_prime256v1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'prime256v1', () => ECCurve_prime256v1()); + + factory ECCurve_prime256v1() => constructFpStandardCurve( + 'prime256v1', ECCurve_prime256v1._make, + q: BigInt.parse('ffffffff00000001000000000000000000000000ffffffffffffffffffffffff', + radix: 16), + a: BigInt.parse( + 'ffffffff00000001000000000000000000000000fffffffffffffffffffffffc', + radix: 16), + b: BigInt.parse( + '5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b', + radix: 16), + g: BigInt.parse( + '036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296', + radix: 16), + n: BigInt.parse( + 'ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('c49d360886e704936a6678e1139d26b7819f7e90', + radix: 16)) as ECCurve_prime256v1; + + static ECCurve_prime256v1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_prime256v1._super(domainName, curve, G, n, h, seed); + + ECCurve_prime256v1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp112r1.dart b/pointycastle/lib/ecc/curves/secp112r1.dart new file mode 100644 index 0000000..91031ed --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp112r1.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp112r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp112r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp112r1', () => ECCurve_secp112r1()); + + factory ECCurve_secp112r1() => + constructFpStandardCurve('secp112r1', ECCurve_secp112r1._make, + q: BigInt.parse('db7c2abf62e35e668076bead208b', radix: 16), + a: BigInt.parse('db7c2abf62e35e668076bead2088', radix: 16), + b: BigInt.parse('659ef8ba043916eede8911702b22', radix: 16), + g: BigInt.parse( + '0409487239995a5ee76b55f9c2f098a89ce5af8724c0a23e0e0ff77500', + radix: 16), + n: BigInt.parse('db7c2abf62e35e7628dfac6561c5', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('00f50b028e4d696e676875615175290472783fb1', + radix: 16)) as ECCurve_secp112r1; + + static ECCurve_secp112r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp112r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp112r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp112r2.dart b/pointycastle/lib/ecc/curves/secp112r2.dart new file mode 100644 index 0000000..ae47526 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp112r2.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp112r2; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp112r2 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp112r2', () => ECCurve_secp112r2()); + + factory ECCurve_secp112r2() => + constructFpStandardCurve('secp112r2', ECCurve_secp112r2._make, + q: BigInt.parse('db7c2abf62e35e668076bead208b', radix: 16), + a: BigInt.parse('6127c24c05f38a0aaaf65c0ef02c', radix: 16), + b: BigInt.parse('51def1815db5ed74fcc34c85d709', radix: 16), + g: BigInt.parse( + '044ba30ab5e892b4e1649dd0928643adcd46f5882e3747def36e956e97', + radix: 16), + n: BigInt.parse('36df0aafd8b8d7597ca10520d04b', radix: 16), + h: BigInt.parse('4', radix: 16), + seed: BigInt.parse('002757a1114d696e6768756151755316c05e0bd4', + radix: 16)) as ECCurve_secp112r2; + + static ECCurve_secp112r2 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp112r2._super(domainName, curve, G, n, h, seed); + + ECCurve_secp112r2._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp128r1.dart b/pointycastle/lib/ecc/curves/secp128r1.dart new file mode 100644 index 0000000..132f496 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp128r1.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp128r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp128r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp128r1', () => ECCurve_secp128r1()); + + factory ECCurve_secp128r1() => constructFpStandardCurve( + 'secp128r1', ECCurve_secp128r1._make, + q: BigInt.parse('fffffffdffffffffffffffffffffffff', radix: 16), + a: BigInt.parse('fffffffdfffffffffffffffffffffffc', radix: 16), + b: BigInt.parse('e87579c11079f43dd824993c2cee5ed3', radix: 16), + g: BigInt.parse( + '04161ff7528b899b2d0c28607ca52c5b86cf5ac8395bafeb13c02da292dded7a83', + radix: 16), + n: BigInt.parse('fffffffe0000000075a30d1b9038a115', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('000e0d4d696e6768756151750cc03a4473d03679', + radix: 16)) as ECCurve_secp128r1; + + static ECCurve_secp128r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp128r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp128r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp128r2.dart b/pointycastle/lib/ecc/curves/secp128r2.dart new file mode 100644 index 0000000..88508f6 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp128r2.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp128r2; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp128r2 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp128r2', () => ECCurve_secp128r2()); + + factory ECCurve_secp128r2() => constructFpStandardCurve( + 'secp128r2', ECCurve_secp128r2._make, + q: BigInt.parse('fffffffdffffffffffffffffffffffff', radix: 16), + a: BigInt.parse('d6031998d1b3bbfebf59cc9bbff9aee1', radix: 16), + b: BigInt.parse('5eeefca380d02919dc2c6558bb6d8a5d', radix: 16), + g: BigInt.parse( + '047b6aa5d85e572983e6fb32a7cdebc14027b6916a894d3aee7106fe805fc34b44', + radix: 16), + n: BigInt.parse('3fffffff7fffffffbe0024720613b5a3', radix: 16), + h: BigInt.parse('4', radix: 16), + seed: BigInt.parse('004d696e67687561517512d8f03431fce63b88f4', + radix: 16)) as ECCurve_secp128r2; + + static ECCurve_secp128r2 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp128r2._super(domainName, curve, G, n, h, seed); + + ECCurve_secp128r2._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp160k1.dart b/pointycastle/lib/ecc/curves/secp160k1.dart new file mode 100644 index 0000000..889a3bc --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp160k1.dart @@ -0,0 +1,33 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp160k1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp160k1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp160k1', () => ECCurve_secp160k1()); + + factory ECCurve_secp160k1() => constructFpStandardCurve( + 'secp160k1', ECCurve_secp160k1._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffac73', radix: 16), + a: BigInt.parse('0', radix: 16), + b: BigInt.parse('7', radix: 16), + g: BigInt.parse( + '043b4c382ce37aa192a4019e763036f4f5dd4d7ebb938cf935318fdced6bc28286531733c3f03c4fee', + radix: 16), + n: BigInt.parse('100000000000000000001b8fa16dfab9aca16b6b3', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_secp160k1; + + static ECCurve_secp160k1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List? seed) => + ECCurve_secp160k1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp160k1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp160r1.dart b/pointycastle/lib/ecc/curves/secp160r1.dart new file mode 100644 index 0000000..6692d23 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp160r1.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp160r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp160r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp160r1', () => ECCurve_secp160r1()); + + factory ECCurve_secp160r1() => constructFpStandardCurve( + 'secp160r1', ECCurve_secp160r1._make, + q: BigInt.parse('ffffffffffffffffffffffffffffffff7fffffff', radix: 16), + a: BigInt.parse('ffffffffffffffffffffffffffffffff7ffffffc', radix: 16), + b: BigInt.parse('1c97befc54bd7a8b65acf89f81d4d4adc565fa45', radix: 16), + g: BigInt.parse( + '044a96b5688ef573284664698968c38bb913cbfc8223a628553168947d59dcc912042351377ac5fb32', + radix: 16), + n: BigInt.parse('100000000000000000001f4c8f927aed3ca752257', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('1053cde42c14d696e67687561517533bf3f83345', + radix: 16)) as ECCurve_secp160r1; + + static ECCurve_secp160r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp160r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp160r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp160r2.dart b/pointycastle/lib/ecc/curves/secp160r2.dart new file mode 100644 index 0000000..a43e3dc --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp160r2.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp160r2; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp160r2 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp160r2', () => ECCurve_secp160r2()); + + factory ECCurve_secp160r2() => constructFpStandardCurve( + 'secp160r2', ECCurve_secp160r2._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffac73', radix: 16), + a: BigInt.parse('fffffffffffffffffffffffffffffffeffffac70', radix: 16), + b: BigInt.parse('b4e134d3fb59eb8bab57274904664d5af50388ba', radix: 16), + g: BigInt.parse( + '0452dcb034293a117e1f4ff11b30f7199d3144ce6dfeaffef2e331f296e071fa0df9982cfea7d43f2e', + radix: 16), + n: BigInt.parse('100000000000000000000351ee786a818f3a1a16b', radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('b99b99b099b323e02709a4d696e6768756151751', + radix: 16)) as ECCurve_secp160r2; + + static ECCurve_secp160r2 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp160r2._super(domainName, curve, G, n, h, seed); + + ECCurve_secp160r2._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp192k1.dart b/pointycastle/lib/ecc/curves/secp192k1.dart new file mode 100644 index 0000000..34ebf1a --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp192k1.dart @@ -0,0 +1,35 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp192k1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp192k1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp192k1', () => ECCurve_secp192k1()); + + factory ECCurve_secp192k1() => constructFpStandardCurve( + 'secp192k1', ECCurve_secp192k1._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffffffffffeffffee37', + radix: 16), + a: BigInt.parse('0', radix: 16), + b: BigInt.parse('3', radix: 16), + g: BigInt.parse( + '04db4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d', + radix: 16), + n: BigInt.parse('fffffffffffffffffffffffe26f2fc170f69466a74defd8d', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_secp192k1; + + static ECCurve_secp192k1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List? seed) => + ECCurve_secp192k1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp192k1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp192r1.dart b/pointycastle/lib/ecc/curves/secp192r1.dart new file mode 100644 index 0000000..b1cdee2 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp192r1.dart @@ -0,0 +1,38 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp192r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp192r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp192r1', () => ECCurve_secp192r1()); + + factory ECCurve_secp192r1() => constructFpStandardCurve( + 'secp192r1', ECCurve_secp192r1._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffeffffffffffffffff', + radix: 16), + a: BigInt.parse('fffffffffffffffffffffffffffffffefffffffffffffffc', + radix: 16), + b: BigInt.parse('64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1', + radix: 16), + g: BigInt.parse( + '04188da80eb03090f67cbf20eb43a18800f4ff0afd82ff101207192b95ffc8da78631011ed6b24cdd573f977a11e794811', + radix: 16), + n: BigInt.parse('ffffffffffffffffffffffff99def836146bc9b1b4d22831', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('3045ae6fc8422f64ed579528d38120eae12196d5', + radix: 16)) as ECCurve_secp192r1; + + static ECCurve_secp192r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp192r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp192r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp224k1.dart b/pointycastle/lib/ecc/curves/secp224k1.dart new file mode 100644 index 0000000..32e87a5 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp224k1.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp224k1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp224k1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp224k1', () => ECCurve_secp224k1()); + + factory ECCurve_secp224k1() => constructFpStandardCurve( + 'secp224k1', ECCurve_secp224k1._make, + q: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffeffffe56d', + radix: 16), + a: BigInt.parse('0', radix: 16), + b: BigInt.parse('5', radix: 16), + g: BigInt.parse( + '04a1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45c7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5', + radix: 16), + n: BigInt.parse( + '10000000000000000000000000001dce8d2ec6184caf0a971769fb1f7', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_secp224k1; + + static ECCurve_secp224k1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List? seed) => + ECCurve_secp224k1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp224k1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp224r1.dart b/pointycastle/lib/ecc/curves/secp224r1.dart new file mode 100644 index 0000000..9323ece --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp224r1.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp224r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp224r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp224r1', () => ECCurve_secp224r1()); + + factory ECCurve_secp224r1() => constructFpStandardCurve( + 'secp224r1', ECCurve_secp224r1._make, + q: BigInt.parse( + 'ffffffffffffffffffffffffffffffff000000000000000000000001', + radix: 16), + a: BigInt.parse( + 'fffffffffffffffffffffffffffffffefffffffffffffffffffffffe', + radix: 16), + b: BigInt.parse( + 'b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4', + radix: 16), + g: BigInt.parse( + '04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34', + radix: 16), + n: BigInt.parse( + 'ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('bd71344799d5c7fcdc45b59fa3b9ab8f6a948bc5', + radix: 16)) as ECCurve_secp224r1; + + static ECCurve_secp224r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp224r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp224r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp256k1.dart b/pointycastle/lib/ecc/curves/secp256k1.dart new file mode 100644 index 0000000..39952bf --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp256k1.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp256k1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp256k1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp256k1', () => ECCurve_secp256k1()); + + factory ECCurve_secp256k1() => constructFpStandardCurve( + 'secp256k1', ECCurve_secp256k1._make, + q: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f', + radix: 16), + a: BigInt.parse('0', radix: 16), + b: BigInt.parse('7', radix: 16), + g: BigInt.parse( + '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', + radix: 16), + n: BigInt.parse( + 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: null) as ECCurve_secp256k1; + + static ECCurve_secp256k1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List? seed) => + ECCurve_secp256k1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp256k1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp256r1.dart b/pointycastle/lib/ecc/curves/secp256r1.dart new file mode 100644 index 0000000..d17eabf --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp256r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp256r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp256r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp256r1', () => ECCurve_secp256r1()); + + factory ECCurve_secp256r1() => constructFpStandardCurve( + 'secp256r1', ECCurve_secp256r1._make, + q: BigInt.parse('ffffffff00000001000000000000000000000000ffffffffffffffffffffffff', + radix: 16), + a: BigInt.parse( + 'ffffffff00000001000000000000000000000000fffffffffffffffffffffffc', + radix: 16), + b: BigInt.parse( + '5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b', + radix: 16), + g: BigInt.parse( + '046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5', + radix: 16), + n: BigInt.parse( + 'ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('c49d360886e704936a6678e1139d26b7819f7e90', + radix: 16)) as ECCurve_secp256r1; + + static ECCurve_secp256r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp256r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp256r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp384r1.dart b/pointycastle/lib/ecc/curves/secp384r1.dart new file mode 100644 index 0000000..c6c48c6 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp384r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp384r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp384r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp384r1', () => ECCurve_secp384r1()); + + factory ECCurve_secp384r1() => constructFpStandardCurve( + 'secp384r1', ECCurve_secp384r1._make, + q: BigInt.parse('fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff', + radix: 16), + a: BigInt.parse( + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc', + radix: 16), + b: BigInt.parse( + 'b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef', + radix: 16), + g: BigInt.parse( + '04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f', + radix: 16), + n: BigInt.parse( + 'ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('a335926aa319a27a1d00896a6773a4827acdac73', + radix: 16)) as ECCurve_secp384r1; + + static ECCurve_secp384r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp384r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp384r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/curves/secp521r1.dart b/pointycastle/lib/ecc/curves/secp521r1.dart new file mode 100644 index 0000000..be2da27 --- /dev/null +++ b/pointycastle/lib/ecc/curves/secp521r1.dart @@ -0,0 +1,41 @@ +// See file LICENSE for more information. + +library impl.ec_domain_parameters.secp521r1; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/ec_standard_curve_constructor.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// ignore: camel_case_types +class ECCurve_secp521r1 extends ECDomainParametersImpl { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + ECDomainParameters, 'secp521r1', () => ECCurve_secp521r1()); + + factory ECCurve_secp521r1() => constructFpStandardCurve( + 'secp521r1', ECCurve_secp521r1._make, + q: BigInt.parse('1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + radix: 16), + a: BigInt.parse( + '1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc', + radix: 16), + b: BigInt.parse( + '51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00', + radix: 16), + g: BigInt.parse( + '0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650', + radix: 16), + n: BigInt.parse( + '1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409', + radix: 16), + h: BigInt.parse('1', radix: 16), + seed: BigInt.parse('d09e8800291cb85396cc6717393284aaa0da64ba', + radix: 16)) as ECCurve_secp521r1; + + static ECCurve_secp521r1 _make(String domainName, ECCurve curve, ECPoint G, + BigInt n, BigInt h, List seed) => + ECCurve_secp521r1._super(domainName, curve, G, n, h, seed); + + ECCurve_secp521r1._super(super.domainName, super.curve, super.G, super.n, + BigInt super._h, List super.seed); +} diff --git a/pointycastle/lib/ecc/ecc_base.dart b/pointycastle/lib/ecc/ecc_base.dart new file mode 100644 index 0000000..c11d34d --- /dev/null +++ b/pointycastle/lib/ecc/ecc_base.dart @@ -0,0 +1,280 @@ +// See file LICENSE for more information. + +library impl.ecc.ecc_base; +//TODO I think this stuff might be moved to src/impl + +import 'dart:typed_data'; + +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/src/utils.dart' as utils; + +/// Implementation of [ECDomainParameters] +class ECDomainParametersImpl implements ECDomainParameters { + @override + final String domainName; + @override + final ECCurve curve; + @override + final List? seed; + @override + final ECPoint G; + @override + final BigInt n; + BigInt? _h; + + ECDomainParametersImpl(this.domainName, this.curve, this.G, this.n, + [this._h, this.seed]) { + _h ??= BigInt.one; + } + + BigInt? get h => _h; +} + +/// Base implementation for [ECFieldElement] +abstract class ECFieldElementBase implements ECFieldElement { + @override + BigInt? toBigInteger(); + + @override + String get fieldName; + + @override + int get fieldSize; + + @override + int get byteLength => (fieldSize + 7) ~/ 8; + + @override + ECFieldElementBase operator +(covariant ECFieldElementBase b); + + @override + ECFieldElementBase operator -(covariant ECFieldElementBase b); + + @override + ECFieldElementBase operator *(covariant ECFieldElementBase b); + + @override + ECFieldElementBase operator /(covariant ECFieldElementBase b); + + @override + ECFieldElementBase operator -(); + + @override + ECFieldElementBase invert(); + + @override + ECFieldElementBase square(); + + @override + ECFieldElementBase? sqrt(); + + @override + String toString() => toBigInteger().toString(); +} + +/// Base implementation for [ECPoint] +abstract class ECPointBase implements ECPoint { + @override + final ECCurveBase curve; + @override + final ECFieldElementBase? x; + @override + final ECFieldElementBase? y; + @override + final bool isCompressed; + final ECMultiplier _multiplier; + + PreCompInfo? _preCompInfo; + + ECPointBase(this.curve, this.x, this.y, this.isCompressed, + [this._multiplier = _fpNafMultiplier]); + + @override + bool get isInfinity => x == null && y == null; + + set preCompInfo(PreCompInfo preCompInfo) { + _preCompInfo = preCompInfo; + } + + @override + bool operator ==(Object other) { + if (other is ECPointBase) { + if (isInfinity) { + return other.isInfinity; + } + return x == other.x && y == other.y; + } + return false; + } + + @override + String toString() => '($x,$y)'; + + @override + int get hashCode { + if (isInfinity) { + return 0; + } + return x.hashCode ^ y.hashCode; + } + + @override + Uint8List getEncoded([bool compressed = true]); + + @override + ECPointBase? operator +(covariant ECPointBase? b); + + @override + ECPointBase? operator -(covariant ECPointBase b); + + @override + ECPointBase operator -(); + + @override + ECPointBase? twice(); + + /// Multiplies this ECPoint by the given number. + /// @param k The multiplicator. + /// @return k * this. + @override + ECPointBase? operator *(BigInt? k) { + if (k!.sign < 0) { + throw ArgumentError('The multiplicator cannot be negative'); + } + + if (isInfinity) { + return this; + } + + if (k.sign == 0) { + return curve.infinity; + } + + return _multiplier(this, k, _preCompInfo); + } +} + +/// Base implementation for [ECCurve] +abstract class ECCurveBase implements ECCurve { + ECFieldElementBase? _a; + ECFieldElementBase? _b; + + ECCurveBase(BigInt? a, BigInt? b) { + _a = fromBigInteger(a); + _b = fromBigInteger(b); + } + + @override + ECFieldElementBase? get a => _a; + + @override + ECFieldElementBase? get b => _b; + + @override + int get fieldSize; + + @override + ECPointBase? get infinity; + + @override + ECFieldElementBase fromBigInteger(BigInt? x); + + @override + ECPointBase createPoint(BigInt x, BigInt y, [bool withCompression = false]); + + @override + ECPointBase decompressPoint(int yTilde, BigInt x1); + + /// Decode a point on this curve from its ASN.1 encoding. The different + /// encodings are taken account of, including point compression for + /// Fp (X9.62 s 4.2.1 pg 17). + /// @return The decoded point. + @override + ECPointBase? decodePoint(List encoded) { + ECPointBase? p; + var expectedLength = (fieldSize + 7) ~/ 8; + + switch (encoded[0]) { + case 0x00: // infinity + if (encoded.length != 1) { + throw ArgumentError('Incorrect length for infinity encoding'); + } + + p = infinity; + break; + + case 0x02: // compressed + case 0x03: // compressed + if (encoded.length != (expectedLength + 1)) { + throw ArgumentError('Incorrect length for compressed encoding'); + } + + var yTilde = encoded[0] & 1; + var x1 = _fromArray(encoded, 1, expectedLength); + + p = decompressPoint(yTilde, x1); + break; + + case 0x04: // uncompressed + case 0x06: // hybrid + case 0x07: // hybrid + if (encoded.length != (2 * expectedLength + 1)) { + throw ArgumentError( + 'Incorrect length for uncompressed/hybrid encoding'); + } + + var x1 = _fromArray(encoded, 1, expectedLength); + var y1 = _fromArray(encoded, 1 + expectedLength, expectedLength); + + p = createPoint(x1, y1, false); + break; + + default: + throw ArgumentError( + 'Invalid point encoding 0x${encoded[0].toRadixString(16)}'); + } + + return p; + } + + BigInt _fromArray(List buf, int off, int length) { + return utils.decodeBigIntWithSign(1, buf.sublist(off, off + length)); + } +} + +/// Interface for classes storing precomputation data for multiplication algorithms. +abstract class PreCompInfo {} + +/// Interface for functions encapsulating a point multiplication algorithm for [ECPointBase]. Multiplies [p] by [k], i.e. [p] is +/// added [k] times to itself. +typedef ECMultiplier = ECPointBase? Function( + ECPointBase p, BigInt? k, PreCompInfo? preCompInfo); + +bool _testBit(BigInt i, int n) { + return i & (BigInt.one << n) != BigInt.zero; +} + +/// Function implementing the NAF (Non-Adjacent Form) multiplication algorithm. +ECPointBase? _fpNafMultiplier( + ECPointBase p, BigInt? k, PreCompInfo? preCompInfo) { + // TODO Probably should try to add this + // BigInt e = k.mod(n); // n == order of p + var e = k; + var h = e! * BigInt.from(3); + + var neg = -p; + ECPointBase? R = p; + + for (var i = h.bitLength - 2; i > 0; --i) { + R = R!.twice(); + + var hBit = _testBit(h, i); + var eBit = _testBit(e, i); + + if (hBit != eBit) { + R = R! + (hBit ? p : neg); + } + } + + return R; +} diff --git a/pointycastle/lib/ecc/ecc_fp.dart b/pointycastle/lib/ecc/ecc_fp.dart new file mode 100644 index 0000000..30c7fa5 --- /dev/null +++ b/pointycastle/lib/ecc/ecc_fp.dart @@ -0,0 +1,587 @@ +// See file LICENSE for more information. + +library impl.ecc.ecc_fp; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart' + hide ECCurveBase, ECFieldElementBase, ECPointBase; +import 'package:pointycastle/ecc/ecc_base.dart' as ecc; +import 'package:pointycastle/src/utils.dart' as utils; + +/// return index of lowest 1-bit in x, x < 2^31 */ +int _lbit(BigInt x) { + // Implementation borrowed from bignum.BigIntegerDartvm. + if (x == BigInt.zero) return -1; + var r = 0; + while ((x & BigInt.from(0xffffffff)) == BigInt.zero) { + x >>= 32; + r += 32; + } + if ((x & BigInt.from(0xffff)) == BigInt.zero) { + x >>= 16; + r += 16; + } + if ((x & BigInt.from(0xff)) == BigInt.zero) { + x >>= 8; + r += 8; + } + if ((x & BigInt.from(0xf)) == BigInt.zero) { + x >>= 4; + r += 4; + } + if ((x & BigInt.from(3)) == BigInt.zero) { + x >>= 2; + r += 2; + } + if ((x & BigInt.one) == BigInt.zero) ++r; + return r; +} + +bool _testBit(BigInt i, int n) { + return i & (BigInt.one << n) != BigInt.zero; +} + +class ECFieldElement extends ecc.ECFieldElementBase { + final BigInt? q; + final BigInt? x; + + ECFieldElement(this.q, this.x) { + if (x! >= q!) { + throw ArgumentError('Value x must be smaller than q'); + } + } + + @override + String get fieldName => 'Fp'; + @override + int get fieldSize => q!.bitLength; + + @override + BigInt? toBigInteger() => x; + + @override + ECFieldElement operator +(ECFieldElement b) => + ECFieldElement(q, (x! + b.toBigInteger()!) % q!); + @override + ECFieldElement operator -(ECFieldElement b) => + ECFieldElement(q, (x! - b.toBigInteger()!) % q!); + @override + ECFieldElement operator *(ECFieldElement b) => + ECFieldElement(q, (x! * b.toBigInteger()!) % q!); + @override + ECFieldElement operator /(ECFieldElement b) => + ECFieldElement(q, (x! * b.toBigInteger()!.modInverse(q!)) % q!); + + @override + ECFieldElement operator -() => ECFieldElement(q, -x! % q!); + + @override + ECFieldElement invert() => ECFieldElement(q, x!.modInverse(q!)); + @override + ECFieldElement square() => ECFieldElement(q, x!.modPow(BigInt.two, q!)); + + // D.1.4 91 + /// return a sqrt root - the routine verifies that the calculation + /// returns the right value - if none exists it returns null. + @override + ECFieldElement? sqrt() { + if (!_testBit(q!, 0)) { + throw UnimplementedError('Not implemented yet'); + } + + // p % 4 == 3 + if (_testBit(q!, 1)) { + // z = g^(u+1) + p, p = 4u + 3 + var z = ECFieldElement(q, x!.modPow((q! >> 2) + BigInt.one, q!)); + return z.square() == this ? z : null; + } + + // p % 4 == 1 + var qMinusOne = q! - BigInt.one; + + var legendreExponent = qMinusOne >> 1; + if (x!.modPow(legendreExponent, q!) != BigInt.one) { + return null; + } + + var u = qMinusOne >> 2; + var k = (u << 1) + BigInt.one; + + var Q = x!; + var fourQ = (Q >> 2) % q!; + + BigInt U, V; + var rand = SecureRandom(); + do { + BigInt? P; + do { + P = rand.nextBigInteger(q!.bitLength); + } while ((P >= q!) || + (((P * P) - fourQ).modPow(legendreExponent, q!) != qMinusOne)); + + var result = _lucasSequence(q!, P, Q, k); + U = result[0]; + V = result[1]; + + if (((V * V) % q!) == fourQ) { + // Integer division by 2, mod q + if (_testBit(V, 0)) { + V = V + q!; + } + + V = V >> 1; + + //assert V.multiply(V).mod(q).equals(x); + + return ECFieldElement(q, V); + } + } while ((U == BigInt.one) || (U == qMinusOne)); + + return null; + } + + List _lucasSequence(BigInt p, BigInt P, BigInt Q, BigInt k) { + var n = k.bitLength; + var s = _lbit(k); + + var uh = BigInt.one; + var vl = BigInt.two; + var vh = P; + var ql = BigInt.one; + var qh = BigInt.one; + + for (var j = n - 1; j >= (s + 1); j--) { + ql = (ql * qh) % p; + + if (_testBit(k, j)) { + qh = (ql * Q) % p; + uh = (uh * vh) % p; + vl = ((vh * vl) - (P * ql)) % p; + vh = ((vh * vh) - (qh << 1)) % p; + } else { + qh = ql; + uh = ((uh * vl) - ql) % p; + vh = ((vh * vl) - (P * ql)) % p; + vl = ((vl * vl) - (ql << 1)) % p; + } + } + + ql = (ql * qh) % p; + qh = (ql * Q) % p; + uh = ((uh * vl) - ql) % p; + vl = ((vh * vl) - (P * ql)) % p; + ql = (ql * qh) % p; + + for (var j = 1; j <= s; j++) { + uh = (uh * vl) % p; + vl = ((vl * vl) - (ql << 1)) % p; + ql = (ql * ql) % p; + } + + return [uh, vl]; + } + + @override + bool operator ==(Object other) { + if (other is ECFieldElement) { + return (q == other.q) && (x == other.x); + } + return false; + } + + @override + int get hashCode => q.hashCode ^ x.hashCode; +} + +/// Elliptic curve points over Fp +class ECPoint extends ecc.ECPointBase { + /// Create a point that encodes with or without point compression. + /// + /// @param curve the curve to use + /// @param x affine x co-ordinate + /// @param y affine y co-ordinate + /// @param withCompression if true encode with point compression + ECPoint(ECCurve curve, ECFieldElement? x, ECFieldElement? y, + [bool withCompression = false]) + : super(curve, x, y, withCompression, _wNafMultiplier) { + if ((x != null && y == null) || (x == null && y != null)) { + throw ArgumentError('Exactly one of the field elements is null'); + } + } + + /// return the field element encoded with point compression. (S 4.3.6) + @override + Uint8List getEncoded([bool compressed = true]) { + if (isInfinity) { + return Uint8List.fromList([1]); + } + + var qLength = x!.byteLength; + if (compressed) { + int pc; + + if (_testBit(y!.toBigInteger()!, 0)) { + pc = 0x03; + } else { + pc = 0x02; + } + + var X = _x9IntegerToBytes(x!.toBigInteger(), qLength); + var po = Uint8List(X.length + 1); + + po[0] = pc.toInt(); + po.setAll(1, X); + + return po; + } else { + var X = _x9IntegerToBytes(x!.toBigInteger(), qLength); + var Y = _x9IntegerToBytes(y!.toBigInteger(), qLength); + var po = Uint8List(X.length + Y.length + 1); + + po[0] = 0x04; + po.setAll(1, X); + po.setAll(X.length + 1, Y); + + return po; + } + } + + // B.3 pg 62 + @override + ECPoint? operator +(ECPoint? b) { + if (isInfinity) { + return b; + } + + if (b!.isInfinity) { + return this; + } + + // Check if b = this or b = -this + if (x == b.x) { + if (y == b.y) { + // this = b, i.e. this must be doubled + return twice(); + } + + // this = -b, i.e. the result is the point at infinity + return curve.infinity as ECPoint?; + } + + var gamma = (b.y! - y!) / (b.x! - x!); + + var x3 = (gamma.square() - x!) - b.x!; + var y3 = (gamma * (x! - x3)) - y!; + + return ECPoint(curve as ECCurve, x3 as ECFieldElement?, + y3 as ECFieldElement?, isCompressed); + } + + // B.3 pg 62 + @override + ECPoint? twice() { + if (isInfinity) { + // Twice identity element (point at infinity) is identity + return this; + } + + if (y!.toBigInteger() == BigInt.zero) { + // if y1 == 0, then (x1, y1) == (x1, -y1) + // and hence this = -this and thus 2(x1, y1) == infinity + return curve.infinity as ECPoint?; + } + + var two = curve.fromBigInteger(BigInt.two); + var three = curve.fromBigInteger(BigInt.from(3)); + var gamma = ((x!.square() * three) + curve.a!) / (y! * two); + + var x3 = gamma.square() - (x! * two); + var y3 = (gamma * (x! - x3)) - y!; + + return ECPoint(curve as ECCurve, x3 as ECFieldElement?, + y3 as ECFieldElement?, isCompressed); + } + + // D.3.2 pg 102 (see Note:) + @override + ECPoint? operator -(ECPoint b) { + if (b.isInfinity) { + return this; + } + + // Add -b + return this + (-b); + } + + @override + ECPoint operator -() { + return ECPoint(curve as ECCurve, x as ECFieldElement?, + -y! as ECFieldElement?, isCompressed); + } +} + +/// Elliptic curve over Fp +class ECCurve extends ecc.ECCurveBase { + final BigInt? q; + ECPoint? _infinity; + + ECCurve(this.q, BigInt? a, BigInt? b) : super(a, b) { + _infinity = ECPoint(this, null, null); + } + + @override + int get fieldSize => q!.bitLength; + @override + ECPoint? get infinity => _infinity; + + @override + ECFieldElement fromBigInteger(BigInt? x) => ECFieldElement(q, x); + @override + ECPoint createPoint(BigInt x, BigInt y, [bool withCompression = false]) => + ECPoint(this, fromBigInteger(x), fromBigInteger(y), withCompression); + + @override + ECPoint decompressPoint(int yTilde, BigInt x1) { + var x = fromBigInteger(x1); + var alpha = (x * ((x * x) + (a as ECFieldElement))) + (b as ECFieldElement); + var beta = alpha.sqrt(); + + // + // if we can't find a sqrt we haven't got a point on the + // curve - run! + // + if (beta == null) { + throw ArgumentError('Invalid point compression'); + } + + var betaValue = beta.toBigInteger()!; + var bit0 = _testBit(betaValue, 0) ? 1 : 0; + + if (bit0 != yTilde) { + // Use the other root + beta = fromBigInteger(q! - betaValue); + } + + return ECPoint(this, x, beta, true); + } + + @override + bool operator ==(Object other) { + if (other is ECCurve) { + return q == other.q && a == other.a && b == other.b; + } + return false; + } + + @override + int get hashCode => a.hashCode ^ b.hashCode ^ q.hashCode; +} + +/// Class holding precomputation data for the WNAF (Window Non-Adjacent Form) +/// algorithm. +class _WNafPreCompInfo implements PreCompInfo { + /// Array holding the precomputed [ECPoint]s used for the Window NAF multiplication. + List? preComp; + + /// Holds an [ECPoint] representing twice(this). Used for the Window NAF multiplication. + ECPoint? twiceP; +} + +/// Function implementing the WNAF (Window Non-Adjacent Form) multiplication algorithm. Multiplies [p]] by an integer [k] using +/// the Window NAF method. +ecc.ECPointBase? _wNafMultiplier( + ecc.ECPointBase p, BigInt? k, PreCompInfo? preCompInfo) { + // Ignore empty PreCompInfo or PreCompInfo of incorrect type + _WNafPreCompInfo wnafPreCompInfo; + if (preCompInfo is! _WNafPreCompInfo) { + wnafPreCompInfo = _WNafPreCompInfo(); + } else { + wnafPreCompInfo = preCompInfo; + } + + // floor(log2(k)) + var m = k!.bitLength; + + // width of the Window NAF + int width; + + // Required length of precomputation array + int reqPreCompLen; + + // Determine optimal width and corresponding length of precomputation + // array based on literature values + if (m < 13) { + width = 2; + reqPreCompLen = 1; + } else { + if (m < 41) { + width = 3; + reqPreCompLen = 2; + } else { + if (m < 121) { + width = 4; + reqPreCompLen = 4; + } else { + if (m < 337) { + width = 5; + reqPreCompLen = 8; + } else { + if (m < 897) { + width = 6; + reqPreCompLen = 16; + } else { + if (m < 2305) { + width = 7; + reqPreCompLen = 32; + } else { + width = 8; + reqPreCompLen = 127; + } + } + } + } + } + } + + // The length of the precomputation array + var preCompLen = 1; + + List? preComp = wnafPreCompInfo.preComp; + var twiceP = wnafPreCompInfo.twiceP; + + // Check if the precomputed ECPoints already exist + if (preComp == null) { + // Precomputation must be performed from scratch, create an empty + // precomputation array of desired length + preComp = List.filled(1, p as ECPoint); + } else { + // Take the already precomputed ECPoints to start with + preCompLen = preComp.length; + } + + twiceP ??= p.twice() as ECPoint?; + + if (preCompLen < reqPreCompLen) { + // Precomputation array must be made bigger, copy existing preComp + // array into the larger preComp array + var oldPreComp = preComp as List; + preComp = List.filled(reqPreCompLen, null, growable: false); + preComp.setAll(0, oldPreComp); + + for (var i = preCompLen; i < reqPreCompLen; i++) { + // Compute the ECPoints for the precomputation array. + // The values 1, 3, 5, ..., 2^(width-1)-1 times p are + // computed + preComp[i] = twiceP! + (preComp[i - 1]); + } + } + + // Compute the Window NAF of the desired width + var wnaf = _windowNaf(width, k); + var l = wnaf.length; + + // Apply the Window NAF to p using the precomputed ECPoint values. + var q = p.curve.infinity; + for (var i = l - 1; i >= 0; i--) { + q = q!.twice(); + + if (wnaf[i] != 0) { + if (wnaf[i]! > 0) { + q = q! + preComp[(wnaf[i]! - 1) ~/ 2]; + } else { + // wnaf[i] < 0 + q = q! - preComp[(-wnaf[i]! - 1) ~/ 2]!; + } + } + } + + // Set PreCompInfo in ECPoint, such that it is available for next + // multiplication. + wnafPreCompInfo.preComp = preComp.map((e) => e as ECPoint).toList(); + wnafPreCompInfo.twiceP = twiceP; + p.preCompInfo = wnafPreCompInfo; + return q; +} + +/// Computes the Window NAF (non-adjacent Form) of an integer. +/// @param width The width w of the Window NAF. The width is +/// defined as the minimal number w, such that for any +/// w consecutive digits in the resulting representation, at +/// most one is non-zero. +/// @param k The integer of which the Window NAF is computed. +/// @return The Window NAF of the given width, such that the following holds: +/// k = ∑i=0l-1 ki2i +/// , where the ki denote the elements of the +/// returned byte[]. +List _windowNaf(int width, BigInt k) { + // The window NAF is at most 1 element longer than the binary + // representation of the integer k. byte can be used instead of short or + // int unless the window width is larger than 8. For larger width use + // short or int. However, a width of more than 8 is not efficient for + // m = log2(q) smaller than 2305 Bits. Note: Values for m larger than + // 1000 Bits are currently not used in practice. + var wnaf = List.filled(k.bitLength + 1, null, growable: false); + + // 2^width as short and BigInt + var pow2wB = 1 << width; + var pow2wBI = BigInt.from(pow2wB); + + var i = 0; + + // The actual length of the WNAF + var length = 0; + + // while k >= 1 + while (k.sign > 0) { + // if k is odd + if (_testBit(k, 0)) { + // k mod 2^width + var remainder = k % pow2wBI; + + // if remainder > 2^(width - 1) - 1 + if (_testBit(remainder, width - 1)) { + wnaf[i] = remainder.toInt() - pow2wB; + } else { + wnaf[i] = remainder.toInt(); + } + + // convert to 'Java byte' + wnaf[i] = wnaf[i]! % 0x100; + if ((wnaf[i]! & 0x80) != 0) { + wnaf[i] = wnaf[i]! - 256; + } + + // wnaf[i] is now in [-2^(width-1), 2^(width-1)-1] + + k = k - BigInt.from(wnaf[i]!); + length = i; + } else { + wnaf[i] = 0; + } + + // k = k/2 + k = k >> 1; + i++; + } + + length++; + + // Reduce the WNAF array to its actual length + var wnafShort = List.filled(length, null, growable: false); + wnafShort.setAll(0, wnaf.sublist(0, length)); + return wnafShort; +} + +Uint8List _x9IntegerToBytes(BigInt? s, int qLength) { + var bytes = Uint8List.fromList(utils.encodeBigInt(s)); + + if (qLength < bytes.length) { + return bytes.sublist(bytes.length - qLength); + } else if (qLength > bytes.length) { + return Uint8List(qLength)..setAll(qLength - bytes.length, bytes); + } + + return bytes; +} diff --git a/pointycastle/lib/ecc/ecdh.dart b/pointycastle/lib/ecc/ecdh.dart new file mode 100644 index 0000000..cbd1c7e --- /dev/null +++ b/pointycastle/lib/ecc/ecdh.dart @@ -0,0 +1,70 @@ +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; + +/// P1363 7.2.1 ECSVDP-DH +/// +/// ECSVDP-DH is Elliptic Curve Secret Value Derivation Primitive, +/// Diffie-Hellman version. It is based on the work of [DH76], [Mil86], +/// and [Kob87]. This primitive derives a shared secret value from one +/// party's private key and another party's public key, where both have +/// the same set of EC domain parameters. If two parties correctly +/// execute this primitive, they will produce the same output. This +/// primitive can be invoked by a scheme to derive a shared secret key; +/// specifically, it may be used with the schemes ECKAS-DH1 and +/// DL/ECKAS-DH2. It assumes that the input keys are valid (see also +/// Section 7.2.2). +class ECDHBasicAgreement implements ECDHAgreement { + late ECPrivateKey key; + + @override + void init(ECPrivateKey key) { + this.key = key; + } + + @override + int getFieldSize() { + return (key.parameters!.curve.fieldSize + 7) ~/ 8; + } + + @override + BigInt calculateAgreement(ECPublicKey pubKey) { + var params = key.parameters; + if (pubKey.parameters?.curve != params?.curve) { + throw PlatformException('ECDH public key has wrong domain parameters'); + } + + var d = key.d!; + + // Always perform calculations on the exact curve specified by our private key's parameters + var Q = cleanPoint(params!.curve, pubKey.Q!); + if (Q == null || Q.isInfinity) { + throw PlatformException('Infinity is not a valid public key for ECDH'); + } + + var h = (params as ECDomainParametersImpl).h!; + + if (!(h.compareTo(BigInt.one) == 0)) { + d = (h.modInverse(params.n) * d) % params.n; + Q = Q * h; + } + + var P = (Q! * d)!; + + if (P.isInfinity) { + throw PlatformException( + 'Infinity is not a valid agreement value for ECDH'); + } + + return P.x!.toBigInteger()!; + } +} + +ECPoint? cleanPoint(ECCurve c, ECPoint p) { + var cp = p.curve; + if (c != cp) { + throw PlatformException('Point must be on the same curve'); + } + + return c.decodePoint(p.getEncoded(false)); +} diff --git a/pointycastle/lib/export.dart b/pointycastle/lib/export.dart new file mode 100644 index 0000000..9933d4a --- /dev/null +++ b/pointycastle/lib/export.dart @@ -0,0 +1,154 @@ +// See file LICENSE for more information. + +/// This library exports all implementation classes from the entire PointyCastle +/// project. +library export; + +export 'package:pointycastle/api.dart'; +export 'package:pointycastle/impl.dart'; + +// cipher implementations +export 'package:pointycastle/adapters/stream_cipher_as_block_cipher.dart'; + +// asymmetric +export 'package:pointycastle/asymmetric/pkcs1.dart'; +export 'package:pointycastle/asymmetric/rsa.dart'; +export 'package:pointycastle/asymmetric/oaep.dart'; + +// block +export 'package:pointycastle/block/aes_fast.dart'; +export 'package:pointycastle/block/aes.dart'; +export 'package:pointycastle/block/desede_engine.dart'; +export 'package:pointycastle/block/rc2_engine.dart'; +export 'package:pointycastle/block/blowfish.dart'; +export 'package:pointycastle/block/camellia.dart'; +export 'package:pointycastle/block/twofish.dart'; + +// block/modes +export 'package:pointycastle/block/modes/cbc.dart'; +export 'package:pointycastle/block/modes/cfb.dart'; +export 'package:pointycastle/block/modes/ctr.dart'; +export 'package:pointycastle/block/modes/ecb.dart'; +export 'package:pointycastle/block/modes/gctr.dart'; +export 'package:pointycastle/block/modes/ofb.dart'; +export 'package:pointycastle/block/modes/gcm.dart'; +export 'package:pointycastle/block/modes/ccm.dart'; +export 'package:pointycastle/block/modes/sic.dart'; +export 'package:pointycastle/block/modes/ige.dart'; + +// digests +export 'package:pointycastle/digests/blake2b.dart'; +export 'package:pointycastle/digests/keccak.dart'; +export 'package:pointycastle/digests/sha3.dart'; +export 'package:pointycastle/digests/shake.dart'; +export 'package:pointycastle/digests/cshake.dart'; +export 'package:pointycastle/digests/md2.dart'; +export 'package:pointycastle/digests/md4.dart'; +export 'package:pointycastle/digests/md5.dart'; +export 'package:pointycastle/digests/ripemd128.dart'; +export 'package:pointycastle/digests/ripemd160.dart'; +export 'package:pointycastle/digests/ripemd256.dart'; +export 'package:pointycastle/digests/ripemd320.dart'; +export 'package:pointycastle/digests/sha1.dart'; +export 'package:pointycastle/digests/sha224.dart'; +export 'package:pointycastle/digests/sha256.dart'; +export 'package:pointycastle/digests/sha384.dart'; +export 'package:pointycastle/digests/sha512.dart'; +export 'package:pointycastle/digests/sha512t.dart'; +export 'package:pointycastle/digests/tiger.dart'; +export 'package:pointycastle/digests/whirlpool.dart'; +export 'package:pointycastle/digests/sm3.dart'; + +// ecc +export 'package:pointycastle/ecc/api.dart'; +export 'package:pointycastle/ecc/ecc_base.dart'; +//TODO resolve naming overlap here: +//export 'package:pointycastle/ecc/ecc_fp.dart' as fp; + +// key_derivators +export 'package:pointycastle/key_derivators/api.dart'; +export 'package:pointycastle/key_derivators/hkdf.dart'; +export 'package:pointycastle/key_derivators/pbkdf2.dart'; +export 'package:pointycastle/key_derivators/scrypt.dart'; +export 'package:pointycastle/key_derivators/argon2.dart'; +export 'package:pointycastle/key_derivators/pkcs12_parameter_generator.dart'; +export 'package:pointycastle/key_derivators/pkcs5s1_parameter_generator.dart'; + +// key_generators +export 'package:pointycastle/key_generators/api.dart'; +export 'package:pointycastle/key_generators/ec_key_generator.dart'; +export 'package:pointycastle/key_generators/rsa_key_generator.dart'; + +// macs +export 'package:pointycastle/macs/hmac.dart'; +export 'package:pointycastle/macs/cmac.dart'; +export 'package:pointycastle/macs/poly1305.dart'; +export 'package:pointycastle/macs/cbc_block_cipher_mac.dart'; + +// paddings +export 'package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart'; +export 'package:pointycastle/paddings/pkcs7.dart'; +export 'package:pointycastle/paddings/iso7816d4.dart'; + +// random +export 'package:pointycastle/random/auto_seed_block_ctr_random.dart'; +export 'package:pointycastle/random/block_ctr_random.dart'; +export 'package:pointycastle/random/fortuna_random.dart'; + +// signers +export 'package:pointycastle/signers/ecdsa_signer.dart'; +export 'package:pointycastle/signers/rsa_signer.dart'; +export 'package:pointycastle/signers/pss_signer.dart'; + +// stream +export 'package:pointycastle/stream/ctr.dart'; +export 'package:pointycastle/stream/salsa20.dart'; +export 'package:pointycastle/stream/chacha20.dart'; +export 'package:pointycastle/stream/chacha7539.dart'; +export 'package:pointycastle/stream/chacha20poly1305.dart'; +export 'package:pointycastle/stream/sic.dart'; +export 'package:pointycastle/stream/eax.dart'; +export 'package:pointycastle/stream/rc4_engine.dart'; + +// ecc curves +export 'package:pointycastle/ecc/curves/brainpoolp160r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp160t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp192r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp192t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp224r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp224t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp256r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp256t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp320r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp320t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp384r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp384t1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp512r1.dart'; +export 'package:pointycastle/ecc/curves/brainpoolp512t1.dart'; +export 'package:pointycastle/ecc/curves/gostr3410_2001_cryptopro_a.dart'; +export 'package:pointycastle/ecc/curves/gostr3410_2001_cryptopro_b.dart'; +export 'package:pointycastle/ecc/curves/gostr3410_2001_cryptopro_c.dart'; +export 'package:pointycastle/ecc/curves/gostr3410_2001_cryptopro_xcha.dart'; +export 'package:pointycastle/ecc/curves/gostr3410_2001_cryptopro_xchb.dart'; +export 'package:pointycastle/ecc/curves/prime192v1.dart'; +export 'package:pointycastle/ecc/curves/prime192v2.dart'; +export 'package:pointycastle/ecc/curves/prime192v3.dart'; +export 'package:pointycastle/ecc/curves/prime239v1.dart'; +export 'package:pointycastle/ecc/curves/prime239v2.dart'; +export 'package:pointycastle/ecc/curves/prime239v3.dart'; +export 'package:pointycastle/ecc/curves/prime256v1.dart'; +export 'package:pointycastle/ecc/curves/secp112r1.dart'; +export 'package:pointycastle/ecc/curves/secp112r2.dart'; +export 'package:pointycastle/ecc/curves/secp128r1.dart'; +export 'package:pointycastle/ecc/curves/secp128r2.dart'; +export 'package:pointycastle/ecc/curves/secp160k1.dart'; +export 'package:pointycastle/ecc/curves/secp160r1.dart'; +export 'package:pointycastle/ecc/curves/secp160r2.dart'; +export 'package:pointycastle/ecc/curves/secp192k1.dart'; +export 'package:pointycastle/ecc/curves/secp192r1.dart'; +export 'package:pointycastle/ecc/curves/secp224k1.dart'; +export 'package:pointycastle/ecc/curves/secp224r1.dart'; +export 'package:pointycastle/ecc/curves/secp256k1.dart'; +export 'package:pointycastle/ecc/curves/secp256r1.dart'; +export 'package:pointycastle/ecc/curves/secp384r1.dart'; +export 'package:pointycastle/ecc/curves/secp521r1.dart'; diff --git a/pointycastle/lib/impl.dart b/pointycastle/lib/impl.dart new file mode 100644 index 0000000..e3cce50 --- /dev/null +++ b/pointycastle/lib/impl.dart @@ -0,0 +1,13 @@ +// See file LICENSE for more information. + +/// This library contains all out-of-the-box implementations of the interfaces provided in the API +/// which are compatible with client and server sides. +library impl; + +// cipher implementations + +// asymmetric +export 'package:pointycastle/asymmetric/api.dart'; +export 'package:pointycastle/ecc/api.dart'; +export 'package:pointycastle/key_derivators/api.dart'; +export 'package:pointycastle/key_generators/api.dart'; diff --git a/pointycastle/lib/key_derivators/api.dart b/pointycastle/lib/key_derivators/api.dart new file mode 100644 index 0000000..84e24c7 --- /dev/null +++ b/pointycastle/lib/key_derivators/api.dart @@ -0,0 +1,126 @@ +// See file LICENSE for more information. + +library api.key_derivators; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/ecc/api.dart'; + +/// [CipherParameters] used by PBKDF2. +class Pbkdf2Parameters extends CipherParameters { + final Uint8List salt; + final int iterationCount; + final int desiredKeyLength; + + Pbkdf2Parameters(this.salt, this.iterationCount, this.desiredKeyLength); +} + +/// [CipherParameters] for the scrypt password based key derivation function. +class ScryptParameters implements CipherParameters { + final int N; + final int r; + final int p; + final int desiredKeyLength; + final Uint8List salt; + + ScryptParameters(this.N, this.r, this.p, this.desiredKeyLength, this.salt); +} + +/// Generates [CipherParameters] for HKDF key derivation function. +class HkdfParameters extends CipherParameters { + final Uint8List ikm; // the input keying material or seed + final int desiredKeyLength; + final Uint8List? + salt; // the salt to use, may be null for a salt for hashLen zeros + final Uint8List? + info; // the info to use, may be null for an info field of zero bytes + final bool skipExtract; + + HkdfParameters._(this.ikm, this.desiredKeyLength, + [this.salt, this.info, this.skipExtract = false]); + + factory HkdfParameters(ikm, desiredKeyLength, + [salt, info, skipExtract = false]) { + if (ikm == null) { + throw ArgumentError('IKM (input keying material) should not be null'); + } + + if (salt == null || salt.length == 0) { + salt = null; + } + + return HkdfParameters._( + ikm, desiredKeyLength, salt, info ?? Uint8List(0), skipExtract); + } +} + +/// The Argon2 parameters. +class Argon2Parameters extends CipherParameters { + static const int ARGON2_d = 0x00; + static const int ARGON2_i = 0x01; + static const int ARGON2_id = 0x02; + + static const int ARGON2_VERSION_10 = 0x10; + static const int ARGON2_VERSION_13 = 0x13; + + static const int DEFAULT_ITERATIONS = 3; + static const int DEFAULT_MEMORY_COST = 12; + static const int DEFAULT_LANES = 1; + static const int DEFAULT_TYPE = ARGON2_i; + static const int DEFAULT_VERSION = ARGON2_VERSION_13; + + final int type; + final int desiredKeyLength; + + final Uint8List _salt; + final Uint8List? _secret; + final Uint8List? _additional; + + final int iterations; + final int memory; + final int lanes; + + final int version; + + Argon2Parameters( + this.type, + this._salt, { + required this.desiredKeyLength, + Uint8List? secret, + Uint8List? additional, + this.iterations = DEFAULT_ITERATIONS, + int? memoryPowerOf2, + int? memory, + this.lanes = DEFAULT_LANES, + this.version = DEFAULT_VERSION, + }) : memory = memoryPowerOf2 != null + ? 1 << memoryPowerOf2 + : (memory ?? (1 << DEFAULT_MEMORY_COST)), + _secret = secret, + _additional = additional; + + Uint8List get salt => _salt; + + Uint8List? get secret => _secret; + + Uint8List? get additional => _additional; + + void clear() { + _salt.clear(); + _secret?.clear(); + _additional?.clear(); + } + + @override + String toString() { + return 'Argon2Parameters{ type: $type, iterations: $iterations, memory: $memory, lanes: $lanes, version: $version }'; + } +} + +class ECDHKDFParameters extends CipherParameters { + final ECPrivateKey privateKey; + final ECPublicKey publicKey; + + ECDHKDFParameters(this.privateKey, this.publicKey); +} diff --git a/pointycastle/lib/key_derivators/argon2.dart b/pointycastle/lib/key_derivators/argon2.dart new file mode 100644 index 0000000..b34315b --- /dev/null +++ b/pointycastle/lib/key_derivators/argon2.dart @@ -0,0 +1,2 @@ +export 'argon2_register64_impl.dart' + if (dart.library.io) 'argon2_native_int_impl.dart'; diff --git a/pointycastle/lib/key_derivators/argon2_native_int_impl.dart b/pointycastle/lib/key_derivators/argon2_native_int_impl.dart new file mode 100644 index 0000000..045c434 --- /dev/null +++ b/pointycastle/lib/key_derivators/argon2_native_int_impl.dart @@ -0,0 +1,658 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/digests/blake2b.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart'; + +import 'api.dart'; + +/// Argon2 PBKDF, the winner of the 2015 Password Hashing Competition. +/// Read more: +/// - https://password-hashing.net/ +/// - https://www.ietf.org/archive/id/draft-irtf-cfrg-argon2-03.txt +/// +/// First ported to Dart by Graciliano M. Passos: +/// - https://pub.dev/packages/argon2 +/// - https://github.com/gmpassos/argon2 +/// +/// The linked project was adapted for the purposes of this project, since it +/// is a 1:1 port of BouncyCastle's Java implementation. +class Argon2BytesGenerator extends BaseKeyDerivator { + static const int ARGON2_BLOCK_SIZE = 1024; + static const int ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE ~/ 8; + + static const int ARGON2_ADDRESSES_IN_BLOCK = 128; + + static const int ARGON2_PREHASH_DIGEST_LENGTH = 64; + static const int ARGON2_PREHASH_SEED_LENGTH = 72; + + static const int ARGON2_SYNC_POINTS = 4; + + /// Minimum and maximum number of lanes (degree of parallelism). + static const int MIN_PARALLELISM = 1; + static const int MAX_PARALLELISM = 16777216; + + /// Minimum and maximum digest size in bytes. + static const int MIN_OUTLEN = 4; + + /// Minimum and maximum number of passes. + static const int MIN_ITERATIONS = 1; + + //static const int M32L = 0xFFFFFFFFFFFFFFFF; + + static const int M32L = (0xFFFFFFFF << 32) + 0xFFFFFFFF; + + static final Uint8List _ZERO_BYTES = Uint8List(4); + + late Argon2Parameters _parameters; + late List<_Block> _memory; + late int _segmentLength; + late int _laneLength; + + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyDerivator, 'argon2', () => Argon2BytesGenerator()); + + Argon2BytesGenerator() { + Platform.instance.assertFullWidthInteger(); + } + + Argon2Parameters get parameters => _parameters; + + @override + int get keySize => parameters.desiredKeyLength; + + @override + String get algorithmName => 'Argon2'; + + /// Initialise the Argon2BytesGenerator from the parameters. + /// - [param] parameters Argon2 configuration. + @override + void init(covariant Argon2Parameters parameters) { + _parameters = parameters; + + if (parameters.lanes < MIN_PARALLELISM) { + throw ArgumentError.value(parameters.lanes, 'parameters.lanes', + 'lanes must be greater than $MIN_PARALLELISM'); + } else if (parameters.lanes > MAX_PARALLELISM) { + throw ArgumentError.value(parameters.lanes, 'parameters.lanes', + 'lanes must be less than $MAX_PARALLELISM'); + } else if (parameters.memory < 2 * parameters.lanes) { + throw ArgumentError.value(parameters.memory, 'parameters.memory', + 'memory is less than: ${2 * parameters.lanes} expected ${2 * parameters.lanes}'); + } else if (parameters.iterations < MIN_ITERATIONS) { + throw ArgumentError.value(parameters.iterations, 'parameters.iterations', + 'iterations is less than: $MIN_ITERATIONS'); + } + + _doInit(parameters); + } + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + inp = inp.sublist(inpOff); + var outLen = parameters.desiredKeyLength; + + if (outLen < MIN_OUTLEN) { + throw ArgumentError.value( + outLen, 'outLen', 'output length less than $MIN_OUTLEN'); + } + + var tmpBlockBytes = Uint8List(ARGON2_BLOCK_SIZE); + + _initialize(tmpBlockBytes, inp, outLen); + _fillMemoryBlocks(); + _digest(tmpBlockBytes, out, outOff, outLen); + + _reset(); + + return outLen; + } + + /// Clear memory. + void _reset() { + for (var i = _memory.length - 1; i >= 0; --i) { + var b = _memory[i]; + b.clear(); + } + } + + void _doInit(Argon2Parameters parameters) { + /* 2. Align memory size */ + /* Minimum memoryBlocks = 8L blocks, where L is the number of lanes */ + var memoryBlocks = parameters.memory; + + if (memoryBlocks < 2 * ARGON2_SYNC_POINTS * parameters.lanes) { + memoryBlocks = 2 * ARGON2_SYNC_POINTS * parameters.lanes; + } + + _segmentLength = memoryBlocks ~/ (parameters.lanes * ARGON2_SYNC_POINTS); + _laneLength = _segmentLength * ARGON2_SYNC_POINTS; + + /* Ensure that all segments have equal length */ + memoryBlocks = _segmentLength * (parameters.lanes * ARGON2_SYNC_POINTS); + + _initMemory(memoryBlocks); + } + + void _initMemory(int memoryBlocks) { + _memory = List<_Block>.generate(memoryBlocks, (i) => _Block()); + } + + void _fillMemoryBlocks() { + var filler = _FillBlock(); + var position = _Position(); + for (var pass = 0; pass < _parameters.iterations; ++pass) { + position.pass = pass; + + for (var slice = 0; slice < ARGON2_SYNC_POINTS; ++slice) { + position.slice = slice; + + for (var lane = 0; lane < _parameters.lanes; ++lane) { + position.lane = lane; + + _fillSegment(filler, position); + } + } + } + } + + void _fillSegment(_FillBlock filler, _Position position) { + _Block? addressBlock; + _Block? inputBlock; + + var dataIndependentAddressing = _isDataIndependentAddressing(position); + var startingIndex = _getStartingIndex(position); + var currentOffset = position.lane * _laneLength + + position.slice * _segmentLength + + startingIndex; + var prevOffset = _getPrevOffset(currentOffset); + + if (dataIndependentAddressing) { + addressBlock = filler.addressBlock.clear(); + inputBlock = filler.inputBlock.clear(); + + _initAddressBlocks(filler, position, inputBlock, addressBlock); + } + + final withXor = _isWithXor(position); + + for (var index = startingIndex; index < _segmentLength; ++index) { + var pseudoRandom = _getPseudoRandom(filler, index, addressBlock, + inputBlock, prevOffset, dataIndependentAddressing); + var refLane = _getRefLane(position, pseudoRandom); + var refColumn = _getRefColumn( + position, index, pseudoRandom, refLane == position.lane); + + /* 2 Creating a new block */ + var prevBlock = _memory[prevOffset]; + var refBlock = _memory[(_laneLength * refLane + refColumn)]; + var currentBlock = _memory[currentOffset]; + + if (withXor) { + filler.fillBlockWithXor(prevBlock, refBlock, currentBlock); + } else { + filler.fillBlock2(prevBlock, refBlock, currentBlock); + } + + prevOffset = currentOffset; + currentOffset++; + } + } + + bool _isDataIndependentAddressing(_Position position) { + return (_parameters.type == Argon2Parameters.ARGON2_i) || + (_parameters.type == Argon2Parameters.ARGON2_id && + (position.pass == 0) && + (position.slice < ARGON2_SYNC_POINTS / 2)); + } + + void _initAddressBlocks(_FillBlock filler, _Position position, + _Block inputBlock, _Block addressBlock) { + inputBlock._v[0] = _intToLong(position.pass); + inputBlock._v[1] = _intToLong(position.lane); + inputBlock._v[2] = _intToLong(position.slice); + inputBlock._v[3] = _intToLong(_memory.length); + inputBlock._v[4] = _intToLong(_parameters.iterations); + inputBlock._v[5] = _intToLong(_parameters.type); + + if ((position.pass == 0) && (position.slice == 0)) { + /* Don't forget to generate the first block of addresses: */ + _nextAddresses(filler, inputBlock, addressBlock); + } + } + + bool _isWithXor(_Position position) { + return !(position.pass == 0 || + _parameters.version == Argon2Parameters.ARGON2_VERSION_10); + } + + int _getPrevOffset(int currentOffset) { + if (currentOffset % _laneLength == 0) { + /* Last block in this lane */ + return currentOffset + _laneLength - 1; + } else { + /* Previous block */ + return currentOffset - 1; + } + } + + static int _getStartingIndex(_Position position) { + if ((position.pass == 0) && (position.slice == 0)) { + return 2; /* we have already generated the first two blocks */ + } else { + return 0; + } + } + + void _nextAddresses( + _FillBlock filler, _Block inputBlock, _Block addressBlock) { + inputBlock._v[6]++; + filler.fillBlock(inputBlock, addressBlock); + filler.fillBlock(addressBlock, addressBlock); + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + int _getPseudoRandom(_FillBlock filler, int index, _Block? addressBlock, + _Block? inputBlock, int prevOffset, bool dataIndependentAddressing) { + if (dataIndependentAddressing) { + var addressIndex = index % ARGON2_ADDRESSES_IN_BLOCK; + if (addressIndex == 0) { + _nextAddresses(filler, inputBlock!, addressBlock!); + } + return addressBlock!._v[addressIndex]; + } else { + return _memory[prevOffset]._v[0]; + } + } + + int _getRefLane(_Position position, int pseudoRandom) { + var refLane = unsignedShiftRight64(pseudoRandom, 32) % _parameters.lanes; + + if ((position.pass == 0) && (position.slice == 0)) { + /* Can not reference other lanes yet */ + refLane = position.lane; + } + return refLane; + } + + int _getRefColumn( + _Position position, int index, int pseudoRandom, bool sameLane) { + int referenceAreaSize; + int startPosition; + + if (position.pass == 0) { + startPosition = 0; + + if (sameLane) { + /* The same lane => add current segment */ + referenceAreaSize = position.slice * _segmentLength + index - 1; + } else { + /* pass == 0 && !sameLane => position.slice > 0*/ + referenceAreaSize = + position.slice * _segmentLength + ((index == 0) ? (-1) : 0); + } + } else { + startPosition = ((position.slice + 1) * _segmentLength) % _laneLength; + + if (sameLane) { + referenceAreaSize = _laneLength - _segmentLength + index - 1; + } else { + referenceAreaSize = + _laneLength - _segmentLength + ((index == 0) ? (-1) : 0); + } + } + + var relativePosition = pseudoRandom & 0xFFFFFFFF; + relativePosition = + unsignedShiftRight64(relativePosition * relativePosition, 32); + relativePosition = referenceAreaSize - + 1 - + unsignedShiftRight64(referenceAreaSize * relativePosition, 32); + + return (startPosition + relativePosition) % _laneLength; + } + + void _digest(Uint8List tmpBlockBytes, Uint8List out, int outOff, int outLen) { + var finalBlock = _memory[_laneLength - 1]; + + /* XOR the last blocks */ + for (var i = 1; i < _parameters.lanes; i++) { + var lastBlockInLane = i * _laneLength + (_laneLength - 1); + finalBlock.xorWith(_memory[lastBlockInLane]); + } + + finalBlock.toBytes(tmpBlockBytes); + + _hash(tmpBlockBytes, out, outOff, outLen); + } + + /// H' - hash - variable length hash function + void _hash(Uint8List input, Uint8List out, int outOff, int outLen) { + var outLenBytes = Uint8List(4); + Pack.intToLittleEndianAtList(outLen, outLenBytes, 0); + + var blake2bLength = 64; + + if (outLen <= blake2bLength) { + var blake = Blake2bDigest(digestSize: outLen); + + blake.update(outLenBytes, 0, outLenBytes.length); + blake.update(input, 0, input.length); + blake.doFinal(out, outOff); + } else { + var digest = Blake2bDigest(digestSize: blake2bLength); + + var outBuffer = Uint8List(blake2bLength); + + /* V1 */ + digest.update(outLenBytes, 0, outLenBytes.length); + digest.update(input, 0, input.length); + digest.doFinal(outBuffer, 0); + + var halfLen = blake2bLength ~/ 2, outPos = outOff; + out.setFrom(outPos, outBuffer, 0, halfLen); + + outPos += halfLen; + + var r = ((outLen + 31) ~/ 32) - 2; + + for (var i = 2; i <= r; i++, outPos += halfLen) { + digest.reset(); + /* V2 to Vr */ + digest.update(outBuffer, 0, outBuffer.length); + digest.doFinal(outBuffer, 0); + + out.setFrom(outPos, outBuffer, 0, halfLen); + } + + var lastLength = outLen - 32 * r; + + /* Vr+1 */ + digest = Blake2bDigest(digestSize: lastLength); + digest.update(outBuffer, 0, outBuffer.length); + digest.doFinal(out, outPos); + } + } + + void _initialize( + Uint8List tmpBlockBytes, Uint8List password, int outputLength) { + /** + * H0 = H64(p, τ, m, t, v, y, |P|, P, |S|, S, |L|, K, |X|, X) + * -> 64 byte (ARGON2_PREHASH_DIGEST_LENGTH) + */ + + var blake = Blake2bDigest(digestSize: ARGON2_PREHASH_DIGEST_LENGTH); + + var values = Uint32List.fromList([ + _parameters.lanes, + outputLength, + _parameters.memory, + _parameters.iterations, + _parameters.version, + _parameters.type + ]); + + Pack.intListToLittleEndianAtList(values, tmpBlockBytes, 0); + blake.update(tmpBlockBytes, 0, values.length * 4); + + _addByteString(tmpBlockBytes, blake, password); + _addByteString(tmpBlockBytes, blake, _parameters.salt); + _addByteString(tmpBlockBytes, blake, _parameters.secret); + _addByteString(tmpBlockBytes, blake, _parameters.additional); + + var initialHashWithZeros = Uint8List(ARGON2_PREHASH_SEED_LENGTH); + blake.doFinal(initialHashWithZeros, 0); + + _fillFirstBlocks(tmpBlockBytes, initialHashWithZeros); + } + + static void _addByteString(Uint8List tmpBlockBytes, Digest digest, + [Uint8List? octets]) { + if (octets == null) { + digest.update(_ZERO_BYTES, 0, 4); + return; + } + + Pack.intToLittleEndianAtList(octets.length, tmpBlockBytes, 0); + digest.update(tmpBlockBytes, 0, 4); + digest.update(octets, 0, octets.length); + } + + /// (H0 || 0 || i) 72 byte -> 1024 byte + /// (H0 || 1 || i) 72 byte -> 1024 byte + void _fillFirstBlocks( + Uint8List tmpBlockBytes, Uint8List initialHashWithZeros) { + var initialHashWithOnes = Uint8List(ARGON2_PREHASH_SEED_LENGTH); + initialHashWithOnes.setFrom( + 0, initialHashWithZeros, 0, ARGON2_PREHASH_DIGEST_LENGTH); + + initialHashWithOnes[ARGON2_PREHASH_DIGEST_LENGTH] = 1; + + for (var i = 0; i < _parameters.lanes; i++) { + Pack.intToLittleEndianAtList( + i, initialHashWithZeros, ARGON2_PREHASH_DIGEST_LENGTH + 4); + Pack.intToLittleEndianAtList( + i, initialHashWithOnes, ARGON2_PREHASH_DIGEST_LENGTH + 4); + + _hash(initialHashWithZeros, tmpBlockBytes, 0, ARGON2_BLOCK_SIZE); + _memory[i * _laneLength + 0].fromBytes(tmpBlockBytes); + + _hash(initialHashWithOnes, tmpBlockBytes, 0, ARGON2_BLOCK_SIZE); + _memory[i * _laneLength + 1].fromBytes(tmpBlockBytes); + } + } + + static int _intToLong(int x) => x & M32L; +} + +class _FillBlock { + final _Block _r = _Block(); + final _Block _z = _Block(); + + _Block addressBlock = _Block(); + _Block inputBlock = _Block(); + + void _applyBlake() { + /* Apply Blake2 on columns of 64-bit words: (0,1,...,15) , then + (16,17,..31)... finally (112,113,...127) */ + for (var i = 0; i < 8; i++) { + var i16 = 16 * i; + _roundFunction( + _z, + i16, + i16 + 1, + i16 + 2, + i16 + 3, + i16 + 4, + i16 + 5, + i16 + 6, + i16 + 7, + i16 + 8, + i16 + 9, + i16 + 10, + i16 + 11, + i16 + 12, + i16 + 13, + i16 + 14, + i16 + 15); + } + + /* Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), then + (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) */ + for (var i = 0; i < 8; i++) { + var i2 = 2 * i; + _roundFunction( + _z, + i2, + i2 + 1, + i2 + 16, + i2 + 17, + i2 + 32, + i2 + 33, + i2 + 48, + i2 + 49, + i2 + 64, + i2 + 65, + i2 + 80, + i2 + 81, + i2 + 96, + i2 + 97, + i2 + 112, + i2 + 113); + } + } + + void fillBlock(_Block Y, _Block currentBlock) { + _z.copyBlock(Y); + _applyBlake(); + currentBlock.xor(Y, _z); + } + + void fillBlock2(_Block X, _Block Y, _Block currentBlock) { + _r.xor(X, Y); + _z.copyBlock(_r); + _applyBlake(); + currentBlock.xor(_r, _z); + } + + void fillBlockWithXor(_Block X, _Block Y, _Block currentBlock) { + _r.xor(X, Y); + _z.copyBlock(_r); + _applyBlake(); + currentBlock.xorWith2(_r, _z); + } + + static void _roundFunction( + _Block block, + int v0, + int v1, + int v2, + int v3, + int v4, + int v5, + int v6, + int v7, + int v8, + int v9, + int v10, + int v11, + int v12, + int v13, + int v14, + int v15) { + final v = block._v; + + _F(v, v0, v4, v8, v12); + _F(v, v1, v5, v9, v13); + _F(v, v2, v6, v10, v14); + _F(v, v3, v7, v11, v15); + + _F(v, v0, v5, v10, v15); + _F(v, v1, v6, v11, v12); + _F(v, v2, v7, v8, v13); + _F(v, v3, v4, v9, v14); + } + + static void _F(Uint64List v, int a, int b, int c, int d) { + _quarterRound(v, a, b, d, 32); + _quarterRound(v, c, d, b, 24); + _quarterRound(v, a, b, d, 16); + _quarterRound(v, c, d, b, 63); + } + + static void _quarterRound(Uint64List v, int x, int y, int z, int s) { + var a = v[x]; + var b = v[y]; + var c = v[z]; + + a += b + 2 * Longs.toInt32(a) * Longs.toInt32(b); + c = Longs.rotateRight(c ^ a, s); + + v[x] = a; + v[z] = c; + } +} + +class _Block { + static const int SIZE = Argon2BytesGenerator.ARGON2_QWORDS_IN_BLOCK; + + /// 128 * 8 Byte QWords. + final Uint64List _v = Uint64List(SIZE); + + _Block(); + + void fromBytes(Uint8List input) { + if (input.length < Argon2BytesGenerator.ARGON2_BLOCK_SIZE) { + throw ArgumentError.value( + input.length, 'input.length', 'input shorter than blocksize'); + } + + Pack.littleEndianToLongAtList(input, 0, _v); + } + + void toBytes(Uint8List output) { + if (output.length < Argon2BytesGenerator.ARGON2_BLOCK_SIZE) { + throw ArgumentError.value( + output.length, 'output.length', 'output shorter than blocksize'); + } + + Pack.longListToLittleEndianAtList(_v, output, 0); + } + + void copyBlock(_Block other) { + _v.setAll(0, other._v); + } + + void xor(_Block b1, _Block b2) { + var v0 = _v; + var v1 = b1._v; + var v2 = b2._v; + + for (var i = SIZE - 1; i >= 0; --i) { + v0[i] = v1[i] ^ v2[i]; + } + } + + void xorWith(_Block b1) { + var v0 = _v; + var v1 = b1._v; + for (var i = SIZE - 1; i >= 0; --i) { + v0[i] ^= v1[i]; + } + } + + void xorWith2(_Block b1, _Block b2) { + var v0 = _v; + var v1 = b1._v; + var v2 = b2._v; + for (var i = SIZE - 1; i >= 0; --i) { + v0[i] ^= v1[i] ^ v2[i]; + } + } + + _Block clear() { + _v.fillRange(0, _v.length, 0); + + return this; + } +} + +class _Position { + late int pass; + late int lane; + late int slice; + + _Position(); +} + +extension _SetFrom on List { + void setFrom(int startIndex, List from, int fromIndex, int length) { + for (var i = 0; i < length; ++i) { + this[startIndex + i] = from[fromIndex + i]; + } + } +} diff --git a/pointycastle/lib/key_derivators/argon2_register64_impl.dart b/pointycastle/lib/key_derivators/argon2_register64_impl.dart new file mode 100644 index 0000000..338e494 --- /dev/null +++ b/pointycastle/lib/key_derivators/argon2_register64_impl.dart @@ -0,0 +1,695 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/digests/blake2b.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/utils.dart'; + +import 'api.dart'; + +/// Argon2 PBKDF, the winner of the 2015 Password Hashing Competition. +/// Read more: +/// - https://password-hashing.net/ +/// - https://www.ietf.org/archive/id/draft-irtf-cfrg-argon2-03.txt +/// +/// First ported to Dart by Graciliano M. Passos: +/// - https://pub.dev/packages/argon2 +/// - https://github.com/gmpassos/argon2 +/// +/// The linked project was adapted for the purposes of this project, since it +/// is a 1:1 port of BouncyCastle's Java implementation. +/// This is an implementation using [Register64]. If platform is not web, +/// consider use native int impl for better performance. +class Argon2BytesGenerator extends BaseKeyDerivator { + static const int ARGON2_BLOCK_SIZE = 1024; + static const int ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE ~/ 8; + + static const int ARGON2_ADDRESSES_IN_BLOCK = 128; + + static const int ARGON2_PREHASH_DIGEST_LENGTH = 64; + static const int ARGON2_PREHASH_SEED_LENGTH = 72; + + static const int ARGON2_SYNC_POINTS = 4; + + /// Minimum and maximum number of lanes (degree of parallelism). + static const int MIN_PARALLELISM = 1; + static const int MAX_PARALLELISM = 16777216; + + /// Minimum and maximum digest size in bytes. + static const int MIN_OUTLEN = 4; + + /// Minimum and maximum number of passes. + static const int MIN_ITERATIONS = 1; + + static final Uint8List _ZERO_BYTES = Uint8List(4); + + late Argon2Parameters _parameters; + late List<_Block> _memory; + late int _segmentLength; + late int _laneLength; + + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyDerivator, 'argon2', () => Argon2BytesGenerator()); + + final _reg = Register64(); + + Argon2Parameters get parameters => _parameters; + + @override + int get keySize => parameters.desiredKeyLength; + + @override + String get algorithmName => 'Argon2'; + + /// Initialise the Argon2BytesGenerator from the parameters. + /// - [param] parameters Argon2 configuration. + @override + void init(covariant Argon2Parameters parameters) { + _parameters = parameters; + + if (parameters.lanes < MIN_PARALLELISM) { + throw ArgumentError.value(parameters.lanes, 'parameters.lanes', + 'lanes must be greater than $MIN_PARALLELISM'); + } else if (parameters.lanes > MAX_PARALLELISM) { + throw ArgumentError.value(parameters.lanes, 'parameters.lanes', + 'lanes must be less than $MAX_PARALLELISM'); + } else if (parameters.memory < 2 * parameters.lanes) { + throw ArgumentError.value(parameters.memory, 'parameters.memory', + 'memory is less than: ${2 * parameters.lanes} expected ${2 * parameters.lanes}'); + } else if (parameters.iterations < MIN_ITERATIONS) { + throw ArgumentError.value(parameters.iterations, 'parameters.iterations', + 'iterations is less than: $MIN_ITERATIONS'); + } + + _doInit(parameters); + } + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + inp = inp.sublist(inpOff); + var outLen = parameters.desiredKeyLength; + + if (outLen < MIN_OUTLEN) { + throw ArgumentError.value( + outLen, 'outLen', 'output length less than $MIN_OUTLEN'); + } + + var tmpBlockBytes = Uint8List(ARGON2_BLOCK_SIZE); + + _initialize(tmpBlockBytes, inp, outLen); + _fillMemoryBlocks(); + _digest(tmpBlockBytes, out, outOff, outLen); + + _reset(); + + return outLen; + } + + /// Clear memory. + void _reset() { + for (var i = _memory.length - 1; i >= 0; --i) { + var b = _memory[i]; + b.clear(); + } + } + + void _doInit(Argon2Parameters parameters) { + /* 2. Align memory size */ + /* Minimum memoryBlocks = 8L blocks, where L is the number of lanes */ + var memoryBlocks = parameters.memory; + + if (memoryBlocks < 2 * ARGON2_SYNC_POINTS * parameters.lanes) { + memoryBlocks = 2 * ARGON2_SYNC_POINTS * parameters.lanes; + } + + _segmentLength = memoryBlocks ~/ (parameters.lanes * ARGON2_SYNC_POINTS); + _laneLength = _segmentLength * ARGON2_SYNC_POINTS; + + /* Ensure that all segments have equal length */ + memoryBlocks = _segmentLength * (parameters.lanes * ARGON2_SYNC_POINTS); + + _initMemory(memoryBlocks); + } + + void _initMemory(int memoryBlocks) { + _memory = List<_Block>.generate(memoryBlocks, (i) => _Block()); + } + + void _fillMemoryBlocks() { + var filler = _FillBlock(); + var position = _Position(); + for (var pass = 0; pass < _parameters.iterations; ++pass) { + position.pass = pass; + + for (var slice = 0; slice < ARGON2_SYNC_POINTS; ++slice) { + position.slice = slice; + + for (var lane = 0; lane < _parameters.lanes; ++lane) { + position.lane = lane; + + _fillSegment(filler, position); + } + } + } + } + + void _fillSegment(_FillBlock filler, _Position position) { + _Block? addressBlock; + _Block? inputBlock; + + var dataIndependentAddressing = _isDataIndependentAddressing(position); + var startingIndex = _getStartingIndex(position); + var currentOffset = position.lane * _laneLength + + position.slice * _segmentLength + + startingIndex; + var prevOffset = _getPrevOffset(currentOffset); + + if (dataIndependentAddressing) { + addressBlock = filler.addressBlock.clear(); + inputBlock = filler.inputBlock.clear(); + + _initAddressBlocks(filler, position, inputBlock, addressBlock); + } + + final withXor = _isWithXor(position); + + for (var index = startingIndex; index < _segmentLength; ++index) { + var pseudoRandomReg = _getPseudoRandom(filler, index, addressBlock, + inputBlock, prevOffset, dataIndependentAddressing); + var refLane = _getRefLane(position, pseudoRandomReg); + var refColumn = _getRefColumn( + position, index, pseudoRandomReg, refLane == position.lane); + + /* 2 Creating a new block */ + var prevBlock = _memory[prevOffset]; + var refBlock = _memory[(_laneLength * refLane + refColumn)]; + var currentBlock = _memory[currentOffset]; + + if (withXor) { + filler.fillBlockWithXor(prevBlock, refBlock, currentBlock); + } else { + filler.fillBlock2(prevBlock, refBlock, currentBlock); + } + + prevOffset = currentOffset; + currentOffset++; + } + } + + bool _isDataIndependentAddressing(_Position position) { + return (_parameters.type == Argon2Parameters.ARGON2_i) || + (_parameters.type == Argon2Parameters.ARGON2_id && + (position.pass == 0) && + (position.slice < ARGON2_SYNC_POINTS / 2)); + } + + void _initAddressBlocks(_FillBlock filler, _Position position, + _Block inputBlock, _Block addressBlock) { + inputBlock._v[0].set(position.pass); + inputBlock._v[1].set(position.lane); + inputBlock._v[2].set(position.slice); + inputBlock._v[3].set(_memory.length); + inputBlock._v[4].set(_parameters.iterations); + inputBlock._v[5].set(_parameters.type); + + if ((position.pass == 0) && (position.slice == 0)) { + /* Don't forget to generate the first block of addresses: */ + _nextAddresses(filler, inputBlock, addressBlock); + } + } + + bool _isWithXor(_Position position) { + return !(position.pass == 0 || + _parameters.version == Argon2Parameters.ARGON2_VERSION_10); + } + + int _getPrevOffset(int currentOffset) { + if (currentOffset % _laneLength == 0) { + /* Last block in this lane */ + return currentOffset + _laneLength - 1; + } else { + /* Previous block */ + return currentOffset - 1; + } + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + static int _getStartingIndex(_Position position) { + if ((position.pass == 0) && (position.slice == 0)) { + return 2; /* we have already generated the first two blocks */ + } else { + return 0; + } + } + + static void _nextAddresses( + _FillBlock filler, _Block inputBlock, _Block addressBlock) { + inputBlock._v[6].sum(1); + filler.fillBlock(inputBlock, addressBlock); + filler.fillBlock(addressBlock, addressBlock); + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + Register64 _getPseudoRandom( + _FillBlock filler, + int index, + _Block? addressBlock, + _Block? inputBlock, + int prevOffset, + bool dataIndependentAddressing) { + if (dataIndependentAddressing) { + var addressIndex = index % ARGON2_ADDRESSES_IN_BLOCK; + if (addressIndex == 0) { + _nextAddresses(filler, inputBlock!, addressBlock!); + } + return addressBlock!._v[addressIndex]; + } else { + return _memory[prevOffset]._v[0]; + } + } + + int _getRefLane(_Position position, Register64 pseudoRandom) { + var refLane = pseudoRandom.hi32 % _parameters.lanes; + + if ((position.pass == 0) && (position.slice == 0)) { + /* Can not reference other lanes yet */ + refLane = position.lane; + } + return refLane; + } + + int _getRefColumn( + _Position position, int index, Register64 pseudoRandom, bool sameLane) { + int referenceAreaSize; + int startPosition; + + if (position.pass == 0) { + startPosition = 0; + + if (sameLane) { + /* The same lane => add current segment */ + referenceAreaSize = position.slice * _segmentLength + index - 1; + } else { + /* pass == 0 && !sameLane => position.slice > 0*/ + referenceAreaSize = + position.slice * _segmentLength + ((index == 0) ? (-1) : 0); + } + } else { + startPosition = ((position.slice + 1) * _segmentLength) % _laneLength; + + if (sameLane) { + referenceAreaSize = _laneLength - _segmentLength + index - 1; + } else { + referenceAreaSize = + _laneLength - _segmentLength + ((index == 0) ? (-1) : 0); + } + } + + var relativePosition = _reg..set(pseudoRandom.lo32); + relativePosition + ..mul(pseudoRandom.lo32) + ..shiftr(32); + relativePosition + ..mul(referenceAreaSize) + ..shiftr(32) + ..neg() + ..sum(referenceAreaSize - 1); + return (relativePosition + ..sum(startPosition) + ..mod(_laneLength)) + .lo32; + } + + void _digest(Uint8List tmpBlockBytes, Uint8List out, int outOff, int outLen) { + var finalBlock = _memory[_laneLength - 1]; + + /* XOR the last blocks */ + for (var i = 1; i < _parameters.lanes; i++) { + var lastBlockInLane = i * _laneLength + (_laneLength - 1); + finalBlock.xorWith(_memory[lastBlockInLane]); + } + + finalBlock.toBytes(tmpBlockBytes); + + _hash(tmpBlockBytes, out, outOff, outLen); + } + + /// H' - hash - variable length hash function + static void _hash(Uint8List input, Uint8List out, int outOff, int outLen) { + var outLenBytes = Uint8List(4); + Pack.intToLittleEndianAtList(outLen, outLenBytes, 0); + + var blake2bLength = 64; + + if (outLen <= blake2bLength) { + var blake = Blake2bDigest(digestSize: outLen); + + blake.update(outLenBytes, 0, outLenBytes.length); + blake.update(input, 0, input.length); + blake.doFinal(out, outOff); + } else { + var digest = Blake2bDigest(digestSize: blake2bLength); + + var outBuffer = Uint8List(blake2bLength); + + /* V1 */ + digest.update(outLenBytes, 0, outLenBytes.length); + digest.update(input, 0, input.length); + digest.doFinal(outBuffer, 0); + + var halfLen = blake2bLength ~/ 2, outPos = outOff; + out.setFrom(outPos, outBuffer, 0, halfLen); + + outPos += halfLen; + + var r = ((outLen + 31) ~/ 32) - 2; + + for (var i = 2; i <= r; i++, outPos += halfLen) { + digest.reset(); + /* V2 to Vr */ + digest.update(outBuffer, 0, outBuffer.length); + digest.doFinal(outBuffer, 0); + + out.setFrom(outPos, outBuffer, 0, halfLen); + } + + var lastLength = outLen - 32 * r; + + /* Vr+1 */ + digest = Blake2bDigest(digestSize: lastLength); + digest.update(outBuffer, 0, outBuffer.length); + digest.doFinal(out, outPos); + } + } + + void _initialize( + Uint8List tmpBlockBytes, Uint8List password, int outputLength) { + /** + * H0 = H64(p, τ, m, t, v, y, |P|, P, |S|, S, |L|, K, |X|, X) + * -> 64 byte (ARGON2_PREHASH_DIGEST_LENGTH) + */ + + var blake = Blake2bDigest(digestSize: ARGON2_PREHASH_DIGEST_LENGTH); + + var values = Uint32List.fromList([ + _parameters.lanes, + outputLength, + _parameters.memory, + _parameters.iterations, + _parameters.version, + _parameters.type + ]); + + Pack.intListToLittleEndianAtList(values, tmpBlockBytes, 0); + blake.update(tmpBlockBytes, 0, values.length * 4); + + _addByteString(tmpBlockBytes, blake, password); + _addByteString(tmpBlockBytes, blake, _parameters.salt); + _addByteString(tmpBlockBytes, blake, _parameters.secret); + _addByteString(tmpBlockBytes, blake, _parameters.additional); + + var initialHashWithZeros = Uint8List(ARGON2_PREHASH_SEED_LENGTH); + blake.doFinal(initialHashWithZeros, 0); + + _fillFirstBlocks(tmpBlockBytes, initialHashWithZeros); + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + static void _addByteString(Uint8List tmpBlockBytes, Digest digest, + [Uint8List? octets]) { + if (octets == null) { + digest.update(_ZERO_BYTES, 0, 4); + return; + } + + Pack.intToLittleEndianAtList(octets.length, tmpBlockBytes, 0); + digest.update(tmpBlockBytes, 0, 4); + digest.update(octets, 0, octets.length); + } + + /// (H0 || 0 || i) 72 byte -> 1024 byte + /// (H0 || 1 || i) 72 byte -> 1024 byte + void _fillFirstBlocks( + Uint8List tmpBlockBytes, Uint8List initialHashWithZeros) { + var initialHashWithOnes = Uint8List(ARGON2_PREHASH_SEED_LENGTH); + initialHashWithOnes.setFrom( + 0, initialHashWithZeros, 0, ARGON2_PREHASH_DIGEST_LENGTH); + + initialHashWithOnes[ARGON2_PREHASH_DIGEST_LENGTH] = 1; + + for (var i = 0; i < _parameters.lanes; i++) { + Pack.intToLittleEndianAtList( + i, initialHashWithZeros, ARGON2_PREHASH_DIGEST_LENGTH + 4); + Pack.intToLittleEndianAtList( + i, initialHashWithOnes, ARGON2_PREHASH_DIGEST_LENGTH + 4); + + _hash(initialHashWithZeros, tmpBlockBytes, 0, ARGON2_BLOCK_SIZE); + _memory[i * _laneLength + 0].fromBytes(tmpBlockBytes); + + _hash(initialHashWithOnes, tmpBlockBytes, 0, ARGON2_BLOCK_SIZE); + _memory[i * _laneLength + 1].fromBytes(tmpBlockBytes); + } + } +} + +class _FillBlock { + final _Block _r = _Block(); + final _Block _z = _Block(); + static final Register64 _reg = Register64(); + _Block addressBlock = _Block(); + _Block inputBlock = _Block(); + + void _applyBlake() { + /* Apply Blake2 on columns of 64-bit words: (0,1,...,15) , then + (16,17,..31)... finally (112,113,...127) */ + for (var i = 0; i < 8; i++) { + var i16 = 16 * i; + _roundFunction( + _z, + i16, + i16 + 1, + i16 + 2, + i16 + 3, + i16 + 4, + i16 + 5, + i16 + 6, + i16 + 7, + i16 + 8, + i16 + 9, + i16 + 10, + i16 + 11, + i16 + 12, + i16 + 13, + i16 + 14, + i16 + 15); + } + + /* Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), then + (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) */ + for (var i = 0; i < 8; i++) { + var i2 = 2 * i; + _roundFunction( + _z, + i2, + i2 + 1, + i2 + 16, + i2 + 17, + i2 + 32, + i2 + 33, + i2 + 48, + i2 + 49, + i2 + 64, + i2 + 65, + i2 + 80, + i2 + 81, + i2 + 96, + i2 + 97, + i2 + 112, + i2 + 113); + } + } + + void fillBlock(_Block Y, _Block currentBlock) { + _z.copyBlock(Y); + _applyBlake(); + currentBlock.xor(Y, _z); + } + + void fillBlock2(_Block X, _Block Y, _Block currentBlock) { + _r.xor(X, Y); + _z.copyBlock(_r); + _applyBlake(); + currentBlock.xor(_r, _z); + } + + void fillBlockWithXor(_Block X, _Block Y, _Block currentBlock) { + _r.xor(X, Y); + _z.copyBlock(_r); + _applyBlake(); + currentBlock.xorWith2(_r, _z); + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + static void _roundFunction( + _Block block, + int v0, + int v1, + int v2, + int v3, + int v4, + int v5, + int v6, + int v7, + int v8, + int v9, + int v10, + int v11, + int v12, + int v13, + int v14, + int v15) { + final v = block._v; + + _F(v, v0, v4, v8, v12); + _F(v, v1, v5, v9, v13); + _F(v, v2, v6, v10, v14); + _F(v, v3, v7, v11, v15); + + _F(v, v0, v5, v10, v15); + _F(v, v1, v6, v11, v12); + _F(v, v2, v7, v8, v13); + _F(v, v3, v4, v9, v14); + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + static void _F(List v, int a, int b, int c, int d) { + _quarterRound(v, a, b, d, 32); + _quarterRound(v, c, d, b, 24); + _quarterRound(v, a, b, d, 16); + _quarterRound(v, c, d, b, 63); + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + static void _quarterRound(List v, int x, int y, int z, int s) { + var a = v[x]; + var b = v[y]; + var c = v[z]; + _reg + ..set(2) + ..mul(a.lo32) + ..mul(b.lo32); + a + ..sumReg(b) + ..sumReg(_reg); + c + ..xor(a) + ..rotr(s); + } +} + +class _Block { + static const int SIZE = Argon2BytesGenerator.ARGON2_QWORDS_IN_BLOCK; + + /// 128 * 8 Byte QWords. + final List _v = + List.unmodifiable(List.generate(SIZE, (_) => Register64())); + + _Block(); + + void fromBytes(Uint8List input) { + if (input.length < Argon2BytesGenerator.ARGON2_BLOCK_SIZE) { + throw ArgumentError.value( + input.length, 'input.length', 'input shorter than blocksize'); + } + var data = ByteData.view(input.buffer, input.offsetInBytes); + var off = 0; + for (var i = 0; i < _v.length; ++i) { + _v[i].set( + data.getUint32(off + 4, Endian.little), + data.getUint32(off, Endian.little), + ); + off += 8; + } + } + + void toBytes(Uint8List output) { + if (output.length < Argon2BytesGenerator.ARGON2_BLOCK_SIZE) { + throw ArgumentError.value( + output.length, 'output.length', 'output shorter than blocksize'); + } + var data = ByteData.view(output.buffer, output.offsetInBytes); + var off = 0; + for (var i = 0; i < _v.length; ++i) { + data.setUint32(off, _v[i].lo32, Endian.little); + data.setUint32(off + 4, _v[i].hi32, Endian.little); + off += 8; + } + } + + void copyBlock(_Block other) { + for (var i = 0; i < _v.length; ++i) { + _v[i].set(other._v[i]); + } + } + + void xor(_Block b1, _Block b2) { + var v0 = _v; + var v1 = b1._v; + var v2 = b2._v; + + for (var i = SIZE - 1; i >= 0; --i) { + v0[i] + ..set(v1[i]) + ..xor(v2[i]); + } + } + + void xorWith(_Block b1) { + var v0 = _v; + var v1 = b1._v; + for (var i = SIZE - 1; i >= 0; --i) { + v0[i].xor(v1[i]); + } + } + + void xorWith2(_Block b1, _Block b2) { + var v0 = _v; + var v1 = b1._v; + var v2 = b2._v; + for (var i = SIZE - 1; i >= 0; --i) { + v0[i] + ..xor(v1[i]) + ..xor(v2[i]); + } + } + + _Block clear() { + for (var reg in _v) { + reg.set(0); + } + return this; + } +} + +class _Position { + late int pass; + late int lane; + late int slice; + + _Position(); +} + +extension _SetFrom on List { + void setFrom(int startIndex, List from, int fromIndex, int length) { + // Use [setRange] for a faster copy on [TypedData] + setRange(startIndex, startIndex + length, from, fromIndex); + } +} diff --git a/pointycastle/lib/key_derivators/concat_kdf.dart b/pointycastle/lib/key_derivators/concat_kdf.dart new file mode 100644 index 0000000..5aa8b9b --- /dev/null +++ b/pointycastle/lib/key_derivators/concat_kdf.dart @@ -0,0 +1,62 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/key_derivators/api.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class ConcatKDFDerivator extends BaseKeyDerivator { + /// Intended for internal use. + static final FactoryConfig factoryConfig = + DynamicFactoryConfig.suffix(KeyDerivator, '/ConcatKDF', (_, Match match) { + final digestName = match.group(1); + final digest = Digest(digestName!); + return () { + return ConcatKDFDerivator(digest); + }; + }); + + final Digest _digest; + late final HkdfParameters _parameters; + + ConcatKDFDerivator(this._digest); + + @override + String get algorithmName => '${_digest.algorithmName}/ConcatKDF'; + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + _digest.reset(); + + var reps = _getReps(_parameters.desiredKeyLength, _digest.digestSize * 8); + var output = Uint8List(reps * _digest.digestSize); + var counter = Uint8List(4); + for (var i = 1; i <= reps; i++) { + var counterInt = i.toUnsigned(32); + counter[0] = (counterInt >> 24) & 255; + counter[1] = (counterInt >> 16) & 255; + counter[2] = (counterInt >> 8) & 255; + counter[3] = counterInt & 255; + _digest.update(counter, 0, 4); + _digest.update(_parameters.ikm, 0, _parameters.ikm.length); + _digest.update(_parameters.salt ?? inp.sublist(inpOff), 0, + _parameters.salt?.length ?? inp.sublist(inpOff).length); + _digest.doFinal(output, (i - 1) * _digest.digestSize); + } + + out.setAll(outOff, output.getRange(0, keySize)); + return keySize; + } + + int _getReps(int keydatalen, int messagedigestlen) { + return (keydatalen / messagedigestlen).ceil(); + } + + @override + void init(covariant HkdfParameters params) { + _parameters = params; + } + + @override + int get keySize => (_parameters.desiredKeyLength / 8).ceil(); +} diff --git a/pointycastle/lib/key_derivators/ecdh_kdf.dart b/pointycastle/lib/key_derivators/ecdh_kdf.dart new file mode 100644 index 0000000..51f4898 --- /dev/null +++ b/pointycastle/lib/key_derivators/ecdh_kdf.dart @@ -0,0 +1,37 @@ +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/utils.dart'; + +import '../src/registry/registry.dart'; + +class ECDHKeyDerivator extends BaseKeyDerivator { + late ECDHKDFParameters parameters; + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyDerivator, 'ECDH', () => ECDHKeyDerivator()); + + @override + String get algorithmName => '/ECDH'; + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + var ecdh = ECDHBasicAgreement()..init(parameters.privateKey); + var ag = ecdh.calculateAgreement(parameters.publicKey); + var key = encodeBigIntAsUnsigned(ag); + // pad to keysize + var padlength = max((keySize / 8).ceil() - key.length, 0); + out.setAll(outOff, Uint8List.fromList(List.filled(padlength, 0))); + out.setAll(outOff + padlength, key); + return padlength + key.length; + } + + @override + void init(covariant ECDHKDFParameters params) { + parameters = params; + } + + @override + int get keySize => parameters.privateKey.parameters!.curve.fieldSize; +} diff --git a/pointycastle/lib/key_derivators/hkdf.dart b/pointycastle/lib/key_derivators/hkdf.dart new file mode 100644 index 0000000..5d22489 --- /dev/null +++ b/pointycastle/lib/key_derivators/hkdf.dart @@ -0,0 +1,185 @@ +// See file LICENSE for more information. + +library impl.key_derivator.hkdf; + +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart' show IterableExtension; +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// HMAC-based Extract-and-Expand Key Derivation Function (HKDF) implemented +/// according to IETF RFC 5869. +class HKDFKeyDerivator extends BaseKeyDerivator { + /// Intended for internal use. + static final FactoryConfig factoryConfig = + DynamicFactoryConfig.suffix(KeyDerivator, '/HKDF', (_, Match match) { + final digestName = match.group(1); + final digest = Digest(digestName!); + return () { + return HKDFKeyDerivator(digest); + }; + }); + + static final Map _digestBlockLength = { + 'GOST3411': 32, + 'MD2': 16, + 'MD4': 64, + 'MD5': 64, + 'RIPEMD-128': 64, + 'RIPEMD-160': 64, + 'SHA-1': 64, + 'SHA-224': 64, + 'SHA-256': 64, + 'SHA-384': 128, + 'SHA-512': 128, + 'SHA-512/224': 128, + 'SHA-512/256': 128, + 'SHA3-224': 1152 ~/ 8, + 'SHA3-256': 1088 ~/ 8, + 'SHA3-384': 832 ~/ 8, + 'SHA3-512': 576 ~/ 8, + 'Tiger': 64, + 'Whirlpool': 64, + }; + + late HkdfParameters _params; + + late HMac _hMac; + late int _hashLen; + + Uint8List? _info; + late Uint8List _currentT; + + late int _generatedBytes; + + HKDFKeyDerivator(Digest digest) { + ArgumentError.checkNotNull(digest); + + _hMac = HMac(digest, _getBlockLengthFromDigest(digest.algorithmName)); + _hashLen = _hMac.macSize; + } + + @override + String get algorithmName => '${_hMac.algorithmName}/HKDF'; + + @override + int get keySize => _params.desiredKeyLength; + + @override + void init(covariant HkdfParameters params) { + _params = params; + + if (_params.skipExtract) { + // use IKM directly as PRK + _hMac.init(KeyParameter(_params.ikm)); + } else { + _hMac.init(extract(_params.salt, _params.ikm)); + } + + _info = _params.info; + + _generatedBytes = 0; + _currentT = Uint8List(_hashLen); + } + + @override + int deriveKey(Uint8List? inp, int inpOff, Uint8List out, int outOff) { + // append input to the 'info' part for key derivation + if (inp != null) { + // TODO: find better way to concatenate Uint8Lists with null elements + _info = combineLists(_info!, inp); + } + + return _generate(out, outOff, keySize); + } + + Uint8List combineLists(Uint8List a, Uint8List b) { + var length = a.length + b.length; + var holder = Uint8List(length); + holder.setRange(0, a.length, a); + holder.setRange(a.length, length, b); + return holder; + } + + /// Performs the extract part of the key derivation function. + KeyParameter extract(Uint8List? salt, Uint8List ikm) { + if (salt == null || salt.isEmpty) { + if (_hashLen != _hMac.macSize) { + throw ArgumentError( + 'Hash length doesn\'t equal MAC size of: ${_hMac.algorithmName}'); + } + + _hMac.init(KeyParameter(Uint8List(_hashLen))); + } else { + _hMac.init(KeyParameter(salt)); + } + + _hMac.update(ikm, 0, ikm.length); + + var prk = Uint8List(_hashLen); + _hMac.doFinal(prk, 0); + return KeyParameter(prk); + } + + /// Performs the expand part of the key derivation function, using currentT + /// as input and output buffer. + void expandNext() { + var n = _generatedBytes ~/ _hashLen + 1; + if (n >= 256) { + throw ArgumentError( + 'HKDF cannot generate more than 255 blocks of HashLen size'); + } + + // special case for T(0): T(0) is empty, so no update + if (_generatedBytes != 0) { + _hMac.update(_currentT, 0, _hashLen); + } + + _hMac.update(_info!, 0, _info!.length); + _hMac.updateByte(n); + _hMac.doFinal(_currentT, 0); + } + + int _generate(Uint8List out, int outOff, int len) { + if (_generatedBytes + len > 255 * _hashLen) { + throw ArgumentError( + 'HKDF may only be used for 255 * HashLen bytes of output'); + } + + if (_generatedBytes % _hashLen == 0) { + expandNext(); + } + + // copy what is left in the currentT + var toGenerate = len; + var posInT = _generatedBytes % _hashLen; + var leftInT = _hashLen - _generatedBytes % _hashLen; + var toCopy = min(leftInT, toGenerate); + out.setRange(outOff, outOff + toCopy, _currentT.sublist(posInT)); + _generatedBytes += toCopy; + toGenerate -= toCopy; + outOff += toCopy; + + while (toGenerate > 0) { + expandNext(); + toCopy = min(_hashLen, toGenerate); + out.setRange(outOff, outOff + toCopy, _currentT.sublist(0)); + _generatedBytes += toCopy; + toGenerate -= toCopy; + outOff += toCopy; + } + + return len; + } + + static int _getBlockLengthFromDigest(String digestName) { + var blockLength = _digestBlockLength.entries + .firstWhereOrNull( + (map) => map.key.toLowerCase() == digestName.toLowerCase()) + ?.value; + return blockLength!; + } +} diff --git a/pointycastle/lib/key_derivators/pbkdf2.dart b/pointycastle/lib/key_derivators/pbkdf2.dart new file mode 100644 index 0000000..e5d6556 --- /dev/null +++ b/pointycastle/lib/key_derivators/pbkdf2.dart @@ -0,0 +1,102 @@ +// See file LICENSE for more information. + +library impl.key_derivator.pbkdf2; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/key_derivators/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; + +/// Generator for PBE derived keys and ivs as defined by PKCS 5 V2.0 Scheme 2. This generator uses a SHA-1 HMac as the +/// calculation function. The document this implementation is based on can be found at: +/// +/// * [http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/index.html] +/// +class PBKDF2KeyDerivator extends BaseKeyDerivator { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + KeyDerivator, + '/PBKDF2', + (_, final Match match) => () { + var mac = Mac(match.group(1)!); + return PBKDF2KeyDerivator(mac); + }); + + late Pbkdf2Parameters _params; + final Mac _mac; + late Uint8List _state; + + PBKDF2KeyDerivator(this._mac) { + _state = Uint8List(_mac.macSize); + } + + @override + String get algorithmName => '${_mac.algorithmName}/PBKDF2'; + + @override + int get keySize => _params.desiredKeyLength; + + void reset() { + _mac.reset(); + _state.fillRange(0, _state.length, 0); + } + + @override + void init(covariant Pbkdf2Parameters params) { + _params = params; + } + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + var dkLen = _params.desiredKeyLength; + var hLen = _mac.macSize; + var l = (dkLen + hLen - 1) ~/ hLen; + var iBuf = Uint8List(4); + var outBytes = Uint8List(l * hLen); + var outPos = 0; + + CipherParameters param = KeyParameter(inp.sublist(inpOff)); + _mac.init(param); + + for (var i = 1; i <= l; i++) { + // Increment the value in 'iBuf' + for (var pos = 3;; pos--) { + iBuf[pos]++; + if (iBuf[pos] != 0) break; + } + + _f(_params.salt, _params.iterationCount, iBuf, outBytes, outPos); + outPos += hLen; + } + + out.setRange(outOff, outOff + dkLen, outBytes); + + return keySize; + } + + void _f(Uint8List? S, int c, Uint8List iBuf, Uint8List out, int outOff) { + if (c <= 0) { + throw ArgumentError('Iteration count must be at least 1.'); + } + + if (S != null) { + _mac.update(S, 0, S.length); + } + + _mac.update(iBuf, 0, iBuf.length); + _mac.doFinal(_state, 0); + + out.setRange(outOff, outOff + _state.length, _state); + + for (var count = 1; count < c; count++) { + _mac.update(_state, 0, _state.length); + _mac.doFinal(_state, 0); + + for (var j = 0; j != _state.length; j++) { + out[outOff + j] ^= _state[j]; + } + } + } +} diff --git a/pointycastle/lib/key_derivators/pkcs12_parameter_generator.dart b/pointycastle/lib/key_derivators/pkcs12_parameter_generator.dart new file mode 100644 index 0000000..faf4cd1 --- /dev/null +++ b/pointycastle/lib/key_derivators/pkcs12_parameter_generator.dart @@ -0,0 +1,148 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class PKCS12ParametersGenerator implements PBEParametersGenerator { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + PBEParametersGenerator, + '/PKCS12', + (_, final Match match) => () { + var mac = Digest(match.group(1)!); + return PKCS12ParametersGenerator(mac); + }); + + static const int KEY_MATERIAL = 1; + + static const int IV_MATERIAL = 2; + + static const int MAC_MATERIAL = 3; + + Digest digest; + + late int u; + + late int v; + + late Uint8List salt; + + late Uint8List password; + late int iterationCount; + + PKCS12ParametersGenerator(this.digest) { + u = digest.digestSize; + v = digest.byteLength; + } + + @override + void init(Uint8List password, Uint8List salt, int iterationCount) { + this.password = password; + this.salt = salt; + this.iterationCount = iterationCount; + } + + /// + /// Generates a derived key with the given [keySize] in bytes. + /// + @override + KeyParameter generateDerivedParameters(int keySize) { + var dKey = _generateDerivedKey(KEY_MATERIAL, keySize); + + return KeyParameter(dKey); + } + + /// + /// Generates a derived key with the given [keySize] in bytes and a derived IV with the given [ivSize]. + /// + @override + ParametersWithIV generateDerivedParametersWithIV(int keySize, int ivSize) { + var dKey = _generateDerivedKey(KEY_MATERIAL, keySize); + + var iv = _generateDerivedKey(IV_MATERIAL, ivSize); + + return ParametersWithIV(KeyParameter(dKey), iv); + } + + /// + /// Generates a derived key with the given [keySize] in bytes used for mac generating. + /// + @override + KeyParameter generateDerivedMacParameters(int keySize) { + var dKey = _generateDerivedKey(MAC_MATERIAL, keySize); + + return KeyParameter(dKey); + } + + Uint8List _generateDerivedKey(int idByte, int n) { + var D = Uint8List(v); + var dKey = Uint8List(n); + for (var i = 0; i != D.length; i++) { + D[i] = idByte; + } + Uint8List S; + if (salt.isNotEmpty) { + S = Uint8List(v * (((salt.length + v) - 1) ~/ v)); + for (var i = 0; i != S.length; i++) { + S[i] = salt[i % salt.length]; + } + } else { + S = Uint8List(0); + } + Uint8List P; + if (password.isNotEmpty) { + P = Uint8List(v * (((password.length + v) - 1) ~/ v)); + for (var i = 0; i != P.length; i++) { + P[i] = password[i % password.length]; + } + } else { + P = Uint8List(0); + } + var I = Uint8List(S.length + P.length); + _arrayCopy(S, 0, I, 0, S.length); + _arrayCopy(P, 0, I, S.length, P.length); + var B = Uint8List(v); + var c = ((n + u) - 1) ~/ u; + var A = Uint8List(u); + for (var i = 1; i <= c; i++) { + digest.update(D, 0, D.length); + digest.update(I, 0, I.length); + digest.doFinal(A, 0); + for (var j = 1; j < iterationCount; j++) { + digest.update(A, 0, A.length); + digest.doFinal(A, 0); + } + for (var j = 0; j != B.length; j++) { + B[j] = A[j % A.length]; + } + for (var j = 0; j != (I.length ~/ v); j++) { + _adjust(I, j * v, B); + } + if (i == c) { + _arrayCopy(A, 0, dKey, (i - 1) * u, dKey.length - ((i - 1) * u)); + } else { + _arrayCopy(A, 0, dKey, (i - 1) * u, A.length); + } + } + return dKey; + } + + void _arrayCopy(Uint8List? sourceArr, int sourcePos, Uint8List? outArr, + int outPos, int len) { + for (var i = 0; i < len; i++) { + outArr![outPos + i] = sourceArr![sourcePos + i]; + } + } + + void _adjust(Uint8List a, int aOff, Uint8List b) { + var x = (b[b.length - 1] & 0xff) + (a[aOff + b.length - 1] & 0xff) + 1; + + a[aOff + b.length - 1] = x; + x >>>= 8; + + for (var i = b.length - 2; i >= 0; i--) { + x += (b[i] & 0xff) + (a[aOff + i] & 0xff); + a[aOff + i] = x; + x >>>= 8; + } + } +} diff --git a/pointycastle/lib/key_derivators/pkcs5s1_parameter_generator.dart b/pointycastle/lib/key_derivators/pkcs5s1_parameter_generator.dart new file mode 100644 index 0000000..1097743 --- /dev/null +++ b/pointycastle/lib/key_derivators/pkcs5s1_parameter_generator.dart @@ -0,0 +1,75 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class PKCS5S1ParameterGenerator implements PBEParametersGenerator { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + PBEParametersGenerator, + '/PKCS5S1', + (_, final Match match) => () { + var mac = Digest(match.group(1)!); + return PKCS5S1ParameterGenerator(mac); + }); + + Digest digest; + + PKCS5S1ParameterGenerator(this.digest); + + late Uint8List password; + late Uint8List salt; + late int iterationCount; + + @override + void init(Uint8List password, Uint8List salt, int iterationCount) { + this.password = password; + this.salt = salt; + this.iterationCount = iterationCount; + } + + Uint8List generateDerivedKey() { + var digestBytes = Uint8List(digest.digestSize); + + digest.update(password, 0, password.length); + digest.update(salt, 0, salt.length); + + digest.doFinal(digestBytes, 0); + for (var i = 1; i < iterationCount; i++) { + digest.update(digestBytes, 0, digestBytes.length); + digest.doFinal(digestBytes, 0); + } + + return digestBytes; + } + + @override + KeyParameter generateDerivedParameters(int keySize) { + if (keySize > digest.digestSize) { + throw ArgumentError("Can't generate a derived key $keySize bytes long."); + } + + var dKey = generateDerivedKey(); + + return KeyParameter(dKey); + } + + @override + ParametersWithIV generateDerivedParametersWithIV(int keySize, int ivSize) { + keySize = keySize; + ivSize = ivSize; + + if ((keySize + ivSize) > digest.digestSize) { + throw ArgumentError( + "Can't generate a derived key ${keySize + ivSize} bytes long."); + } + + var dKey = generateDerivedKey(); + + return ParametersWithIV(KeyParameter(dKey), dKey); + } + + @override + KeyParameter generateDerivedMacParameters(int keySize) { + return generateDerivedParameters(keySize); + } +} diff --git a/pointycastle/lib/key_derivators/scrypt.dart b/pointycastle/lib/key_derivators/scrypt.dart new file mode 100644 index 0000000..1101ea5 --- /dev/null +++ b/pointycastle/lib/key_derivators/scrypt.dart @@ -0,0 +1,207 @@ +// See file LICENSE for more information. + +library impl.key_derivator.scrypt; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/digests/sha256.dart'; +import 'package:pointycastle/key_derivators/api.dart'; +import 'package:pointycastle/key_derivators/pbkdf2.dart'; +import 'package:pointycastle/macs/hmac.dart'; +import 'package:pointycastle/src/impl/base_key_derivator.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// +/// Implementation of SCrypt password based key derivation function. See the next link for info on +/// how to choose N, r, and p: +/// * +/// +/// This implementation is based on Java implementation by Will Glozer, which can be found at: +/// * +/// +class Scrypt extends BaseKeyDerivator { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyDerivator, 'scrypt', () => Scrypt()); + + static const int _maxValue = 0x7fffffff; + + ScryptParameters? _params; + + @override + final String algorithmName = 'scrypt'; + + @override + int get keySize => _params!.desiredKeyLength; + + void reset() { + _params = null; + } + + @override + void init(covariant ScryptParameters params) { + _params = params; + + final N = _params!.N; + final r = _params!.r; + final p = _params!.p; + + if (N < 2 || (N & (N - 1)) != 0) { + throw ArgumentError('N must be a power of 2 greater than 1'); + } + + if (N > _maxValue ~/ 128 ~/ r) { + throw ArgumentError('Parameter N is too large'); + } + + if (r > _maxValue ~/ 128 ~/ p) { + throw ArgumentError('Parameter r is too large'); + } + } + + @override + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if (_params == null) { + throw StateError('Initialize first.'); + } + + _scryptJ(inp, inpOff, out, outOff, _params!.salt, _params!.N, _params!.r, + _params!.p, _params!.desiredKeyLength); + + return keySize; + } + + void _scryptJ(Uint8List pwd, int pwdOff, Uint8List dk, int dkOff, + Uint8List salt, int N, int r, int p, int dkLen) { + final b = Uint8List(128 * r * p); + final xy = Uint8List(256 * r); + final v = Uint8List(128 * r * N); + + final pbkdf2 = PBKDF2KeyDerivator(HMac(SHA256Digest(), 64)); + + pbkdf2.init(Pbkdf2Parameters(salt, 1, p * 128 * r)); + pbkdf2.deriveKey(pwd, pwdOff, b, 0); + + for (var i = 0; i < p; i++) { + _smix(b, i * 128 * r, r, N, v, xy); + } + + pbkdf2.init(Pbkdf2Parameters(b, 1, dkLen)); + pbkdf2.deriveKey(pwd, pwdOff, dk, dkOff); + } + + void _smix(Uint8List B, int bi, int r, int N, Uint8List V, Uint8List xy) { + const xi = 0; + final yi = 128 * r; + + _arraycopy(B, bi, xy, xi, 128 * r); + + for (var i = 0; i < N; i++) { + _arraycopy(xy, xi, V, i * (128 * r), 128 * r); + _blockmixSalsa8(xy, xi, yi, r); + } + + for (var i = 0; i < N; i++) { + var j = _integerify(xy, xi, r) & (N - 1); + _blockxor(V, j * (128 * r), xy, xi, 128 * r); + _blockmixSalsa8(xy, xi, yi, r); + } + + _arraycopy(xy, xi, B, bi, 128 * r); + } + + final _b32 = List.filled(16, 0); + final _x = List.filled(16, 0); + + void _blockmixSalsa8(Uint8List by, int bi, int yi, int r) { + final byByteData = by.buffer.asByteData(by.offsetInBytes, by.length); + + for (var i = 0; i < 16; ++i) { + _b32[i] = + byByteData.getUint32(bi + (2 * r - 1) * 64 + i * 4, Endian.little); + } + + for (var i = 0; i < 2 * r; i++) { + for (var j = 0; j < 16; ++j) { + _b32[j] ^= byByteData.getUint32(i * 64 + j * 4, Endian.little); + _x[j] = _b32[j]; + } + _salsa20_8(); + for (var j = 0; j < 16; ++j) { + byByteData.setUint32(yi + (i * 64) + j * 4, _b32[j], Endian.little); + } + } + + for (var i = 0; i < r; i++) { + _arraycopy(by, yi + (i * 2) * 64, by, bi + (i * 64), 64); + } + + for (var i = 0; i < r; i++) { + _arraycopy(by, yi + (i * 2 + 1) * 64, by, bi + (i + r) * 64, 64); + } + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + int _R(int sum, int n) => + ((sum << n) & 0xFFFFFFFF) | (sum & 0xFFFFFFFF) >> (32 - n); + + void _salsa20_8() { + for (var i = 8; i > 0; i -= 2) { + _x[4] ^= _R(_x[0] + _x[12], 7); + _x[8] ^= _R(_x[4] + _x[0], 9); + _x[12] ^= _R(_x[8] + _x[4], 13); + _x[0] ^= _R(_x[12] + _x[8], 18); + _x[9] ^= _R(_x[5] + _x[1], 7); + _x[13] ^= _R(_x[9] + _x[5], 9); + _x[1] ^= _R(_x[13] + _x[9], 13); + _x[5] ^= _R(_x[1] + _x[13], 18); + _x[14] ^= _R(_x[10] + _x[6], 7); + _x[2] ^= _R(_x[14] + _x[10], 9); + _x[6] ^= _R(_x[2] + _x[14], 13); + _x[10] ^= _R(_x[6] + _x[2], 18); + _x[3] ^= _R(_x[15] + _x[11], 7); + _x[7] ^= _R(_x[3] + _x[15], 9); + _x[11] ^= _R(_x[7] + _x[3], 13); + _x[15] ^= _R(_x[11] + _x[7], 18); + _x[1] ^= _R(_x[0] + _x[3], 7); + _x[2] ^= _R(_x[1] + _x[0], 9); + _x[3] ^= _R(_x[2] + _x[1], 13); + _x[0] ^= _R(_x[3] + _x[2], 18); + _x[6] ^= _R(_x[5] + _x[4], 7); + _x[7] ^= _R(_x[6] + _x[5], 9); + _x[4] ^= _R(_x[7] + _x[6], 13); + _x[5] ^= _R(_x[4] + _x[7], 18); + _x[11] ^= _R(_x[10] + _x[9], 7); + _x[8] ^= _R(_x[11] + _x[10], 9); + _x[9] ^= _R(_x[8] + _x[11], 13); + _x[10] ^= _R(_x[9] + _x[8], 18); + _x[12] ^= _R(_x[15] + _x[14], 7); + _x[13] ^= _R(_x[12] + _x[15], 9); + _x[14] ^= _R(_x[13] + _x[12], 13); + _x[15] ^= _R(_x[14] + _x[13], 18); + } + + for (var i = 0; i < 16; i++) { + _b32[i] = (_x[i] + _b32[i]) & 0xFFFFFFFF; + } + } + + void _blockxor(Uint8List s, int si, Uint8List d, int di, int len) { + for (var i = 0; i < len; i++) { + d[di + i] ^= s[si + i]; + } + } + + @pragma('vm:prefer-inline') + @pragma('dart2js:tryInline') + int _integerify(Uint8List b, int bi, int r) { + return b.buffer + .asByteData(b.offsetInBytes, b.length) + .getUint32(bi + (2 * r - 1) * 64, Endian.little); + } + + void _arraycopy( + List inp, int inpOff, List out, int outOff, int len) => + out.setRange(outOff, outOff + len, inp, inpOff); +} diff --git a/pointycastle/lib/key_generators/api.dart b/pointycastle/lib/key_generators/api.dart new file mode 100644 index 0000000..b5d7cc6 --- /dev/null +++ b/pointycastle/lib/key_generators/api.dart @@ -0,0 +1,27 @@ +// See file LICENSE for more information. + +library api.key_generators; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/ecc/api.dart'; + +/// Abstract [CipherParameters] to init an ECC key generator. +class ECKeyGeneratorParameters extends KeyGeneratorParameters { + final ECDomainParameters _domainParameters; + + ECKeyGeneratorParameters(ECDomainParameters domainParameters) + : _domainParameters = domainParameters, + super(domainParameters.n.bitLength); + + ECDomainParameters get domainParameters => _domainParameters; +} + +/// Abstract [CipherParameters] to init an RSA key generator. +class RSAKeyGeneratorParameters extends KeyGeneratorParameters { + final BigInt publicExponent; + final int certainty; + + RSAKeyGeneratorParameters( + this.publicExponent, int bitStrength, this.certainty) + : super(bitStrength); +} diff --git a/pointycastle/lib/key_generators/ec_key_generator.dart b/pointycastle/lib/key_generators/ec_key_generator.dart new file mode 100644 index 0000000..2689ab4 --- /dev/null +++ b/pointycastle/lib/key_generators/ec_key_generator.dart @@ -0,0 +1,50 @@ +// See file LICENSE for more information. + +library impl.key_generator.ec_key_generator; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/key_generators/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Abstract [CipherParameters] to init an ECC key generator. +class ECKeyGenerator implements KeyGenerator { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyGenerator, 'EC', () => ECKeyGenerator()); + + late ECDomainParameters _params; + late SecureRandom _random; + + @override + String get algorithmName => 'EC'; + + @override + void init(CipherParameters params) { + ECKeyGeneratorParameters ecparams; + + if (params is ParametersWithRandom) { + _random = params.random; + ecparams = params.parameters as ECKeyGeneratorParameters; + } else { + _random = SecureRandom(); + ecparams = params as ECKeyGeneratorParameters; + } + + _params = ecparams.domainParameters; + } + + @override + AsymmetricKeyPair generateKeyPair() { + var n = _params.n; + var nBitLength = n.bitLength; + BigInt? d; + + do { + d = _random.nextBigInteger(nBitLength); + } while (d == BigInt.zero || (d >= n)); + + var Q = _params.G * d; + + return AsymmetricKeyPair(ECPublicKey(Q, _params), ECPrivateKey(d, _params)); + } +} diff --git a/pointycastle/lib/key_generators/rsa_key_generator.dart b/pointycastle/lib/key_generators/rsa_key_generator.dart new file mode 100644 index 0000000..9b3af75 --- /dev/null +++ b/pointycastle/lib/key_generators/rsa_key_generator.dart @@ -0,0 +1,339 @@ +// See file LICENSE for more information. + +library impl.key_generator.rsa_key_generator; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/asymmetric/api.dart'; +import 'package:pointycastle/key_generators/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +bool _testBit(BigInt i, int n) { + return (i & (BigInt.one << n)) != BigInt.zero; +} + +class RSAKeyGenerator implements KeyGenerator { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(KeyGenerator, 'RSA', () => RSAKeyGenerator()); + + late SecureRandom _random; + late RSAKeyGeneratorParameters _params; + + @override + String get algorithmName => 'RSA'; + + @override + void init(CipherParameters params) { + if (params is ParametersWithRandom) { + _random = params.random; + _params = params.parameters as RSAKeyGeneratorParameters; + } else { + _random = SecureRandom(); + _params = params as RSAKeyGeneratorParameters; + } + + if (_params.bitStrength < 12) { + throw ArgumentError('key bit strength cannot be smaller than 12'); + } + + if (!_testBit(_params.publicExponent, 0)) { + throw ArgumentError('Public exponent cannot be even'); + } + } + + @override + AsymmetricKeyPair generateKeyPair() { + BigInt p, q, n, e; + + // p and q values should have a length of half the strength in bits + var strength = _params.bitStrength; + var pbitlength = (strength + 1) ~/ 2; + var qbitlength = strength - pbitlength; + var mindiffbits = strength ~/ 3; + + e = _params.publicExponent; + + // TODO Consider generating safe primes for p, q (see DHParametersHelper.generateSafePrimes) + // (then p-1 and q-1 will not consist of only small factors - see "Pollard's algorithm") + + // generate p, prime and (p-1) relatively prime to e + while (true) { + p = generateProbablePrime(pbitlength, 1, _random); + + if (p % e == BigInt.one) { + continue; + } + + if (!_isProbablePrime(p, _params.certainty)) { + continue; + } + + if (e.gcd(p - BigInt.one) == BigInt.one) { + break; + } + } + + // generate a modulus of the required length + while (true) { + // generate q, prime and (q-1) relatively prime to e, and not equal to p + while (true) { + q = generateProbablePrime(qbitlength, 1, _random); + + if ((q - p).abs().bitLength < mindiffbits) { + continue; + } + + if (q % e == BigInt.one) { + continue; + } + + if (!_isProbablePrime(q, _params.certainty)) { + continue; + } + + if (e.gcd(q - BigInt.one) == BigInt.one) { + break; + } + } + + // calculate the modulus + n = p * q; + + if (n.bitLength == _params.bitStrength) { + break; + } + + // if we get here our primes aren't big enough, make the largest of the two p and try again + p = (p.compareTo(q) > 0) ? p : q; + } + + // Swap p and q if necessary + if (p < q) { + var swap = p; + p = q; + q = swap; + } + + // calculate the private exponent + var pSub1 = p - BigInt.one; + var qSub1 = q - BigInt.one; + var phi = pSub1 * qSub1; + var d = e.modInverse(phi); + + // ignore: deprecated_member_use_from_same_package + return AsymmetricKeyPair(RSAPublicKey(n, e), RSAPrivateKey(n, d, p, q, e)); + } +} + +/// [List] of low primes +final List _lowprimes = [ + BigInt.from(2), + BigInt.from(3), + BigInt.from(5), + BigInt.from(7), + BigInt.from(11), + BigInt.from(13), + BigInt.from(17), + BigInt.from(19), + BigInt.from(23), + BigInt.from(29), + BigInt.from(31), + BigInt.from(37), + BigInt.from(41), + BigInt.from(43), + BigInt.from(47), + BigInt.from(53), + BigInt.from(59), + BigInt.from(61), + BigInt.from(67), + BigInt.from(71), + BigInt.from(73), + BigInt.from(79), + BigInt.from(83), + BigInt.from(89), + BigInt.from(97), + BigInt.from(101), + BigInt.from(103), + BigInt.from(107), + BigInt.from(109), + BigInt.from(113), + BigInt.from(127), + BigInt.from(131), + BigInt.from(137), + BigInt.from(139), + BigInt.from(149), + BigInt.from(151), + BigInt.from(157), + BigInt.from(163), + BigInt.from(167), + BigInt.from(173), + BigInt.from(179), + BigInt.from(181), + BigInt.from(191), + BigInt.from(193), + BigInt.from(197), + BigInt.from(199), + BigInt.from(211), + BigInt.from(223), + BigInt.from(227), + BigInt.from(229), + BigInt.from(233), + BigInt.from(239), + BigInt.from(241), + BigInt.from(251), + BigInt.from(257), + BigInt.from(263), + BigInt.from(269), + BigInt.from(271), + BigInt.from(277), + BigInt.from(281), + BigInt.from(283), + BigInt.from(293), + BigInt.from(307), + BigInt.from(311), + BigInt.from(313), + BigInt.from(317), + BigInt.from(331), + BigInt.from(337), + BigInt.from(347), + BigInt.from(349), + BigInt.from(353), + BigInt.from(359), + BigInt.from(367), + BigInt.from(373), + BigInt.from(379), + BigInt.from(383), + BigInt.from(389), + BigInt.from(397), + BigInt.from(401), + BigInt.from(409), + BigInt.from(419), + BigInt.from(421), + BigInt.from(431), + BigInt.from(433), + BigInt.from(439), + BigInt.from(443), + BigInt.from(449), + BigInt.from(457), + BigInt.from(461), + BigInt.from(463), + BigInt.from(467), + BigInt.from(479), + BigInt.from(487), + BigInt.from(491), + BigInt.from(499), + BigInt.from(503), + BigInt.from(509) +]; + +final BigInt _lplim = (BigInt.one << 26) ~/ _lowprimes.last; + +final BigInt _bigTwo = BigInt.from(2); + +/// return index of lowest 1-bit in x, x < 2^31 +int _lbit(BigInt x) { + // Implementation borrowed from bignum.BigIntegerDartvm. + if (x == BigInt.zero) return -1; + var r = 0; + while ((x & BigInt.from(0xffffffff)) == BigInt.zero) { + x >>= 32; + r += 32; + } + if ((x & BigInt.from(0xffff)) == BigInt.zero) { + x >>= 16; + r += 16; + } + if ((x & BigInt.from(0xff)) == BigInt.zero) { + x >>= 8; + r += 8; + } + if ((x & BigInt.from(0xf)) == BigInt.zero) { + x >>= 4; + r += 4; + } + if ((x & BigInt.from(3)) == BigInt.zero) { + x >>= 2; + r += 2; + } + if ((x & BigInt.one) == BigInt.zero) ++r; + return r; +} + +/// true if probably prime (HAC 4.24, Miller-Rabin) */ +bool _millerRabin(BigInt b, int t) { + // Implementation borrowed from bignum.BigIntegerDartvm. + var n1 = b - BigInt.one; + var k = _lbit(n1); + if (k <= 0) return false; + var r = n1 >> k; + t = (t + 1) >> 1; + if (t > _lowprimes.length) t = _lowprimes.length; + BigInt a; + for (var i = 0; i < t; ++i) { + a = _lowprimes[i]; + var y = a.modPow(r, b); + if (y.compareTo(BigInt.one) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPow(_bigTwo, b); + if (y.compareTo(BigInt.one) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; +} + +/// test primality with certainty >= 1-.5^t */ +bool _isProbablePrime(BigInt b, int t) { + // Implementation borrowed from bignum.BigIntegerDartvm. + int i; + var x = b.abs(); + if (b <= _lowprimes.last) { + for (i = 0; i < _lowprimes.length; ++i) { + if (b == _lowprimes[i]) return true; + } + return false; + } + if (x.isEven) return false; + i = 1; + while (i < _lowprimes.length) { + var m = _lowprimes[i], j = i + 1; + while (j < _lowprimes.length && m < _lplim) { + m *= _lowprimes[j++]; + } + m = x % m; + while (i < j) { + if (m % _lowprimes[i++] == BigInt.zero) { + return false; + } + } + } + return _millerRabin(x, t); +} + +BigInt generateProbablePrime(int bitLength, int certainty, SecureRandom rnd) { + if (bitLength < 2) { + return BigInt.one; + } + + var candidate = rnd.nextBigInteger(bitLength); + + // force MSB set + if (!_testBit(candidate, bitLength - 1)) { + candidate |= BigInt.one << (bitLength - 1); + } + + // force odd + if (candidate.isEven) { + candidate += BigInt.one; + } + + while (!_isProbablePrime(candidate, certainty)) { + candidate += _bigTwo; + if (candidate.bitLength > bitLength) { + candidate -= BigInt.one << (bitLength - 1); + } + } + + return candidate; +} diff --git a/pointycastle/lib/macs/cbc_block_cipher_mac.dart b/pointycastle/lib/macs/cbc_block_cipher_mac.dart new file mode 100644 index 0000000..63d3a19 --- /dev/null +++ b/pointycastle/lib/macs/cbc_block_cipher_mac.dart @@ -0,0 +1,214 @@ +// See file LICENSE for more information. + +library impl.mac.cbc_block_cipher_mac; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_mac.dart'; +import 'package:pointycastle/block/modes/cbc.dart'; + +/// standard CBC Block Cipher MAC - if no padding is specified the default of +/// pad of zeroes is used. +class CBCBlockCipherMac extends BaseMac { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + Mac, + r'^(.+)/CBC_CMAC(/(.+))?$', + (_, final Match match) => () { + var cipher = BlockCipher(match.group(1)!); + var padding = match.groupCount >= 3 && + match.group(3) != null && + match.group(3)!.isNotEmpty + ? Padding(match.group(3)!) + : null; + return CBCBlockCipherMac.fromCipherAndPadding(cipher, padding); + }, + ); + + late Uint8List _mac; + + late Uint8List _buf; + late int _bufOff; + final BlockCipher _cipher; + final Padding? _padding; + + final int _macSize; + + ParametersWithIV? _params; + + /// + /// create a standard MAC based on a CBC block cipher. This will produce an + /// authentication code half the length of the block size of the cipher. + /// + /// * [cipher] the cipher to be used as the basis of the MAC generation. + CBCBlockCipherMac.fromCipher(BlockCipher cipher) + : this(cipher, (cipher.blockSize * 8) ~/ 2, null); + + /// + /// create a standard MAC based on a CBC block cipher. This will produce an + /// authentication code half the length of the block size of the cipher. + /// + /// * [cipher] the cipher to be used as the basis of the MAC generation. + /// * [padding] the padding to be used to complete the last block. + CBCBlockCipherMac.fromCipherAndPadding(BlockCipher cipher, Padding? padding) + : this(cipher, (cipher.blockSize * 8) ~/ 2, padding); + + /// + /// create a standard MAC based on a block cipher with the size of the + /// MAC been given in bits. This class uses CBC mode as the basis for the + /// MAC generation. + /// + /// Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), + /// or 16 bits if being used as a data authenticator (FIPS Publication 113), + /// and in general should be less than the size of the block cipher as it + /// reduces the chance of an exhaustive attack (see Handbook of Applied + /// Cryptography). + /// + /// * [cipher] the cipher to be used as the basis of the MAC generation. + /// * [macSizeInBits] the size of the MAC in bits, must be a multiple of 8. + CBCBlockCipherMac.fromCipherAndMacSize(BlockCipher cipher, int macSizeInBits) + : this(cipher, macSizeInBits, null); + + /// + /// create a standard MAC based on a block cipher with the size of the + /// MAC been given in bits. This class uses CBC mode as the basis for the + /// MAC generation. + /// + /// Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), + /// or 16 bits if being used as a data authenticator (FIPS Publication 113), + /// and in general should be less than the size of the block cipher as it + /// reduces the chance of an exhaustive attack (see Handbook of Applied + /// Cryptography). + /// + /// * [cipher] the cipher to be used as the basis of the MAC generation. + /// * [macSizeInBits] the size of the MAC in bits, must be a multiple of 8. + /// * [padding] the padding to be used to complete the last block. + CBCBlockCipherMac(BlockCipher cipher, int macSizeInBits, Padding? padding) + : _cipher = CBCBlockCipher(cipher), + _macSize = macSizeInBits ~/ 8, + _padding = padding { + if ((macSizeInBits % 8) != 0) { + throw ArgumentError('MAC size must be multiple of 8'); + } + + _mac = Uint8List(cipher.blockSize); + + _buf = Uint8List(cipher.blockSize); + _bufOff = 0; + } + + @override + String get algorithmName { + var paddingName = _padding != null ? '/${_padding.algorithmName}' : ''; + return '${_cipher.algorithmName}_CMAC$paddingName'; + } + + @override + void init(CipherParameters params) { + if (params is ParametersWithIV) { + _params = params; + } else if (params is KeyParameter) { + final zeroIV = Uint8List(params.key.length); + _params = ParametersWithIV(params, zeroIV); + } + + reset(); + + _cipher.init(true, _params); + } + + @override + int get macSize => _macSize; + + @override + void updateByte(int inp) { + if (_bufOff == _buf.length) { + _cipher.processBlock(_buf, 0, _mac, 0); + _bufOff = 0; + } + + _buf[_bufOff++] = inp; + } + + @override + void update(Uint8List inp, int inOff, int len) { + if (len < 0) { + throw ArgumentError('Can\'t have a negative input length!'); + } + + var blockSize = _cipher.blockSize; + var gapLen = blockSize - _bufOff; + + if (len > gapLen) { + _buf.setRange(_bufOff, _bufOff + gapLen, inp.sublist(inOff)); + + _cipher.processBlock(_buf, 0, _mac, 0); + + _bufOff = 0; + len -= gapLen; + inOff += gapLen; + + while (len > blockSize) { + _cipher.processBlock(inp, inOff, _mac, 0); + + len -= blockSize; + inOff += blockSize; + } + } + + _buf.setRange(_bufOff, _bufOff + len, inp.sublist(inOff)); + + _bufOff += len; + } + + /// Reset the mac generator. + @override + void reset() { + // clean the buffer. + for (var i = 0; i < _buf.length; i++) { + _buf[i] = 0; + } + + _bufOff = 0; + + // reset the underlying cipher. + _cipher.reset(); + + _cipher.init(true, _params); + + if (_params != null) { + _cipher.init(true, _params); + } + } + + @override + int doFinal(Uint8List out, int outOff) { + var blockSize = _cipher.blockSize; + + if (_padding == null) { + // + // pad with zeroes + // + while (_bufOff < blockSize) { + _buf[_bufOff] = 0; + _bufOff++; + } + } else { + if (_bufOff == blockSize) { + _cipher.processBlock(_buf, 0, _mac, 0); + _bufOff = 0; + } + + _padding.addPadding(_buf, _bufOff); + } + + _cipher.processBlock(_buf, 0, _mac, 0); + + out.setRange(outOff, outOff + _macSize, _mac); + + reset(); + + return _macSize; + } +} diff --git a/pointycastle/lib/macs/cmac.dart b/pointycastle/lib/macs/cmac.dart new file mode 100644 index 0000000..c317080 --- /dev/null +++ b/pointycastle/lib/macs/cmac.dart @@ -0,0 +1,287 @@ +// See file LICENSE for more information. + +library impl.mac.cmac; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_mac.dart'; +import 'package:pointycastle/paddings/iso7816d4.dart'; +import 'package:pointycastle/block/modes/cbc.dart'; + +/// CMAC - as specified at www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html +///

+/// CMAC is analogous to OMAC1 - see also en.wikipedia.org/wiki/CMAC +///

+/// CMAC is a NIST recomendation - see +/// csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf +///

+/// CMAC/OMAC1 is a blockcipher-based message authentication code designed and +/// analyzed by Tetsu Iwata and Kaoru Kurosawa. +///

+/// CMAC/OMAC1 is a simple variant of the CBC MAC (Cipher Block Chaining Message +/// Authentication Code). OMAC stands for One-Key CBC MAC. +///

+/// It supports 128- or 64-bits block ciphers, with any key size, and returns +/// a MAC with dimension less or equal to the block size of the underlying +/// cipher. +///

+class CMac extends BaseMac { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + Mac, + '/CMAC', + (_, final Match match) => () { + var cipher = BlockCipher(match.group(1)!); + return CMac.fromCipher(cipher); + }, + ); + + late Uint8List _poly; + late Uint8List _zeros; + + late Uint8List _mac; + + late Uint8List _buf; + late int _bufOff; + final BlockCipher _cipher; + + final int _macSize; + + late Uint8List _lu, _lu2; + + ParametersWithIV? _params; + + /// + /// create a standard MAC based on a CBC block cipher (64 or 128 bit block). + /// This will produce an authentication code the length of the block size + /// of the cipher. + /// + /// @param cipher the cipher to be used as the basis of the MAC generation. + CMac.fromCipher(BlockCipher cipher) : this(cipher, cipher.blockSize * 8); + + /// + /// create a standard MAC based on a block cipher with the size of the + /// MAC been given in bits. + ///

+ /// Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), + /// or 16 bits if being used as a data authenticator (FIPS Publication 113), + /// and in general should be less than the size of the block cipher as it + /// reduces the chance of an exhaustive attack (see Handbook of Applied + /// Cryptography). + /// + /// @param cipher the cipher to be used as the basis of the MAC generation. + /// @param macSizeInBits the size of the MAC in bits, must be a multiple of 8 and <= 128. + CMac(BlockCipher cipher, int macSizeInBits) + : _macSize = macSizeInBits ~/ 8, + _cipher = CBCBlockCipher(cipher) { + if ((macSizeInBits % 8) != 0) { + throw ArgumentError('MAC size must be multiple of 8'); + } + + if (macSizeInBits > (_cipher.blockSize * 8)) { + throw ArgumentError( + 'MAC size must be less or equal to ${_cipher.blockSize * 8}'); + } + + _poly = lookupPoly(cipher.blockSize); + + _mac = Uint8List(cipher.blockSize); + + _buf = Uint8List(cipher.blockSize); + + _zeros = Uint8List(cipher.blockSize); + + _bufOff = 0; + } + + @override + String get algorithmName { + var blockCipherAlgorithmName = _cipher.algorithmName.split('/').first; + return '$blockCipherAlgorithmName/CMAC'; + } + + static int shiftLeft(Uint8List block, Uint8List output) { + var i = block.length; + var bit = 0; + while (--i >= 0) { + var b = block[i] & 0xff; + output[i] = (b << 1) | bit; + bit = (b >> 7) & 1; + } + return bit; + } + + Uint8List _doubleLu(Uint8List inp) { + var ret = Uint8List(inp.length); + var carry = shiftLeft(inp, ret); + + // NOTE: This construction is an attempt at a constant-time implementation. + var mask = (-carry) & 0xff; + ret[inp.length - 3] ^= _poly[1] & mask; + ret[inp.length - 2] ^= _poly[2] & mask; + ret[inp.length - 1] ^= _poly[3] & mask; + + return ret; + } + + static Uint8List lookupPoly(int blockSizeLength) { + int xor; + switch (blockSizeLength * 8) { + case 64: + xor = 0x1B; + break; + case 128: + xor = 0x87; + break; + case 160: + xor = 0x2D; + break; + case 192: + xor = 0x87; + break; + case 224: + xor = 0x309; + break; + case 256: + xor = 0x425; + break; + case 320: + xor = 0x1B; + break; + case 384: + xor = 0x100D; + break; + case 448: + xor = 0x851; + break; + case 512: + xor = 0x125; + break; + case 768: + xor = 0xA0011; + break; + case 1024: + xor = 0x80043; + break; + case 2048: + xor = 0x86001; + break; + default: + throw ArgumentError( + 'Unknown block size for CMAC: ${blockSizeLength * 8}'); + } + + final out = Uint8List(4); + out[3] = xor >> 0; + out[2] = xor >> 8; + out[1] = xor >> 16; + out[0] = xor >> 24; + return out; + } + + @override + void init(covariant KeyParameter keyParams) { + final zeroIV = Uint8List(keyParams.key.length); + _params = ParametersWithIV(keyParams, zeroIV); + + // Initialize before computing L, Lu, Lu2 + _cipher.init(true, _params!); + + //initializes the L, Lu, Lu2 numbers + var L = Uint8List(_zeros.length); + _cipher.processBlock(_zeros, 0, L, 0); + _lu = _doubleLu(L); + _lu2 = _doubleLu(_lu); + + // Reset _buf/_cipher state after computing L, Lu, Lu2 + reset(); + } + + @override + int get macSize => _macSize; + + @override + void updateByte(int inp) { + if (_bufOff == _buf.length) { + _cipher.processBlock(_buf, 0, _mac, 0); + _bufOff = 0; + } + + _buf[_bufOff++] = inp; + } + + @override + void update(Uint8List inp, int inOff, int len) { + if (len < 0) { + throw ArgumentError('Can\'t have a negative input length!'); + } + + var blockSize = _cipher.blockSize; + var gapLen = blockSize - _bufOff; + + if (len > gapLen) { + _buf.setRange(_bufOff, _bufOff + gapLen, inp.sublist(inOff)); + + _cipher.processBlock(_buf, 0, _mac, 0); + + _bufOff = 0; + len -= gapLen; + inOff += gapLen; + + while (len > blockSize) { + _cipher.processBlock(inp, inOff, _mac, 0); + + len -= blockSize; + inOff += blockSize; + } + } + + _buf.setRange(_bufOff, _bufOff + len, inp.sublist(inOff)); + + _bufOff += len; + } + + @override + int doFinal(Uint8List out, int outOff) { + var blockSize = _cipher.blockSize; + + Uint8List? lu; + if (_bufOff == blockSize) { + lu = _lu; + } else { + ISO7816d4Padding().addPadding(_buf, _bufOff); + lu = _lu2; + } + + for (var i = 0; i < _mac.length; i++) { + _buf[i] ^= lu[i]; + } + + _cipher.processBlock(_buf, 0, _mac, 0); + + out.setRange(outOff, outOff + _macSize, _mac); + + reset(); + + return _macSize; + } + + /// Reset the mac generator. + @override + void reset() { + // clean the buffer. + for (var i = 0; i < _buf.length; i++) { + _buf[i] = 0; + } + + _bufOff = 0; + + // reset the underlying cipher. + _cipher.reset(); + + if (_params != null) { + _cipher.init(true, _params!); + } + } +} diff --git a/pointycastle/lib/macs/hmac.dart b/pointycastle/lib/macs/hmac.dart new file mode 100644 index 0000000..426b8f0 --- /dev/null +++ b/pointycastle/lib/macs/hmac.dart @@ -0,0 +1,120 @@ +// See file LICENSE for more information. + +library impl.mac.hmac; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_mac.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// HMAC implementation based on RFC2104 +/// +/// H(K XOR opad, H(K XOR ipad, text)) +class HMac extends BaseMac { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + Mac, + '/HMAC', + (_, Match match) { + final digestName = match.group(1); + return () { + return HMac.withDigest(Digest(digestName!)); + }; + }, + ); + + //TODO reindent + + static final _ipad = 0x36; + static final _opad = 0x5C; + + final Digest _digest; + late int _digestSize; + late int _blockLength; + + late Uint8List _inputPad; + late Uint8List _outputBuf; + + HMac(this._digest, this._blockLength) { + _digestSize = _digest.digestSize; + _inputPad = Uint8List(_blockLength); + _outputBuf = Uint8List(_blockLength + _digestSize); + } + + HMac.withDigest(this._digest) { + _blockLength = _digest.byteLength; + + _digestSize = _digest.digestSize; + _inputPad = Uint8List(_blockLength); + _outputBuf = Uint8List(_blockLength + _digestSize); + } + + @override + String get algorithmName => '${_digest.algorithmName}/HMAC'; + + @override + int get macSize => _digestSize; + + @override + void reset() { + // reset the underlying digest. + _digest.reset(); + + // reinitialize the digest. + _digest.update(_inputPad, 0, _inputPad.length); + } + + @override + void init(covariant KeyParameter params) { + _digest.reset(); + + var key = params.key; + var keyLength = key.length; + + if (keyLength > _blockLength) { + _digest.update(key, 0, keyLength); + _digest.doFinal(_inputPad, 0); + + keyLength = _digestSize; + } else { + _inputPad.setRange(0, keyLength, key); + } + + _inputPad.fillRange(keyLength, _inputPad.length, 0); + + _outputBuf.setRange(0, _blockLength, _inputPad); + + _xorPad(_inputPad, _blockLength, _ipad); + _xorPad(_outputBuf, _blockLength, _opad); + + _digest.update(_inputPad, 0, _inputPad.length); + } + + @override + void updateByte(int inp) { + _digest.updateByte(inp); + } + + @override + void update(Uint8List inp, int inpOff, int len) { + _digest.update(inp, inpOff, len); + } + + @override + int doFinal(Uint8List out, int outOff) { + _digest.doFinal(_outputBuf, _blockLength); + _digest.update(_outputBuf, 0, _outputBuf.length); + + var len = _digest.doFinal(out, outOff); + _outputBuf.fillRange(_blockLength, _outputBuf.length, 0); + _digest.update(_inputPad, 0, _inputPad.length); + + return len; + } + + void _xorPad(Uint8List pad, int len, int n) { + for (var i = 0; i < len; i++) { + pad[i] ^= n; + } + } +} diff --git a/pointycastle/lib/macs/poly1305.dart b/pointycastle/lib/macs/poly1305.dart new file mode 100644 index 0000000..9ee4b51 --- /dev/null +++ b/pointycastle/lib/macs/poly1305.dart @@ -0,0 +1,323 @@ +// This file has been migrated. + +library impl.mac.poly1305; + +import 'dart:typed_data'; + +import 'package:pointycastle/src/platform_check/platform_check.dart'; + +import '../api.dart'; +import '../src/impl/base_mac.dart'; +import '../src/registry/registry.dart'; +import '../src/ufixnum.dart'; +import '../src/utils.dart'; + +class Poly1305 extends BaseMac { + static const R_MASK_LOW_2 = 0xFC; + static const R_MASK_HIGH_4 = 0x0F; + + Poly1305() { + Platform.instance.assertFullWidthInteger(); + cipher = null; + } + + Poly1305.withCipher(this.cipher) { + Platform.instance.assertFullWidthInteger(); + if (cipher!.blockSize != BLOCK_SIZE) { + throw ArgumentError('Poly1305 requires a 128 bit block cipher.'); + } + } + + // ignore: non_constant_identifier_names + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + Mac, + '/Poly1305', + (_, final Match match) => () { + var cipher = BlockCipher(match.group(1)!); + return Poly1305.withCipher(cipher); + }, + ); + + static void clamp(Uint8List key) { + key[3] &= R_MASK_HIGH_4; + key[7] &= R_MASK_HIGH_4; + key[11] &= R_MASK_HIGH_4; + key[15] &= R_MASK_HIGH_4; + + key[4] &= R_MASK_LOW_2; + key[8] &= R_MASK_LOW_2; + key[12] &= R_MASK_LOW_2; + } + + static bool checkKey(Uint8List key) { + var c1 = checkMask(key[3], R_MASK_HIGH_4); + var c2 = checkMask(key[7], R_MASK_HIGH_4); + var c3 = checkMask(key[11], R_MASK_HIGH_4); + var c4 = checkMask(key[15], R_MASK_HIGH_4); + + var c5 = checkMask(key[4], R_MASK_LOW_2); + var c6 = checkMask(key[8], R_MASK_LOW_2); + var c7 = checkMask(key[12], R_MASK_LOW_2); + + return !(c1 || c2 || c3 || c4 || c5 || c6 || c7); + } + + static bool checkMask(int b, int mask) { + if (b & not32(mask) != 0) { + return false; + } + return true; + } + + @override + String get algorithmName => + cipher == null ? 'Poly1305' : '${cipher!.algorithmName}/Poly1305'; + + @override + int get macSize => BLOCK_SIZE; + + static const BLOCK_SIZE = 16; + + BlockCipher? cipher; + + final Uint8List singleByte = Uint8List(1); + + late int r0, r1, r2, r3, r4; + + late int s1, s2, s3, s4; + + late int k0, k1, k2, k3; + + final Uint8List currentBlock = Uint8List(BLOCK_SIZE); + + int currentBlockOffset = 0; + + late int h0, h1, h2, h3, h4; + + @override + void init(CipherParameters params) { + Uint8List? nonce; + + if (cipher != null) { + if (params is! ParametersWithIV) { + throw ArgumentError( + 'Poly1305 requires an IV when used with a block cipher.'); + } + + nonce = params.iv; + params = params.parameters!; + } + + if (params is! KeyParameter) { + throw ArgumentError('Poly1305 requires a key.'); + } + + if (!checkKey(params.key)) clamp(params.key); + + setKey(params.key, nonce); + + reset(); + } + + void setKey(Uint8List key, Uint8List? nonce) { + if (key.length != 32) throw ArgumentError('Poly1305 key must be 256 bits.'); + if (cipher != null && (nonce == null || nonce.length != BLOCK_SIZE)) { + throw ArgumentError('Poly1305-AES requires a 128 bit IV.'); + } + + var keyByteData = ByteData.view(key.buffer, key.offsetInBytes, key.length); + var t0 = unpack32(keyByteData, 0, Endian.little); + var t1 = unpack32(keyByteData, 4, Endian.little); + var t2 = unpack32(keyByteData, 8, Endian.little); + var t3 = unpack32(keyByteData, 12, Endian.little); + + r0 = t0 & (0x03FFFFFF); + r1 = (cshiftr32(t0, 26) | shiftl32(t1, 6)) & 0x03FFFF03; + r2 = (cshiftr32(t1, 20) | shiftl32(t2, 12)) & 0x03FFC0FF; + r3 = (cshiftr32(t2, 14) | shiftl32(t3, 18)) & 0x03F03FFF; + r4 = (cshiftr32(t3, 8)) & 0x000FFFFF; + + s1 = r1 * 5; + s2 = r2 * 5; + s3 = r3 * 5; + s4 = r4 * 5; + + Uint8List kBytes; + int kOff; + if (cipher == null) { + kBytes = key; + kOff = BLOCK_SIZE; + } else { + kBytes = Uint8List(BLOCK_SIZE); + kOff = 0; + + cipher!.init(true, KeyParameter.offset(key, BLOCK_SIZE, BLOCK_SIZE)); + cipher!.processBlock(nonce!, 0, kBytes, 0); + } + + var kByteData = + ByteData.view(kBytes.buffer, kBytes.offsetInBytes, kBytes.length); + k0 = unpack32(kByteData, kOff, Endian.little); + k1 = unpack32(kByteData, kOff + 4, Endian.little); + k2 = unpack32(kByteData, kOff + 8, Endian.little); + k3 = unpack32(kByteData, kOff + 12, Endian.little); + } + + @override + void updateByte(final int inp) { + singleByte[0] = inp; + update(singleByte, 0, 1); + } + + @override + void update(final Uint8List inp, final int inOff, final int len) { + var copied = 0; + while (len > copied) { + if (currentBlockOffset == BLOCK_SIZE) { + processBlock(); + currentBlockOffset = 0; + } + + var toCopy = (len - copied) > (BLOCK_SIZE - currentBlockOffset) + ? (BLOCK_SIZE - currentBlockOffset) + : (len - copied); + arrayCopy(inp, copied + inOff, currentBlock, currentBlockOffset, toCopy); + copied += toCopy; + currentBlockOffset += toCopy; + } + } + + void processBlock() { + // TODO Calculation varied between web and native. + if (currentBlockOffset < BLOCK_SIZE) { + currentBlock[currentBlockOffset] = 1; + for (var i = currentBlockOffset + 1; i < BLOCK_SIZE; i++) { + currentBlock[i] = 0; + } + } + + final t0 = unpack32(currentBlock, 0, Endian.little); + final t1 = unpack32(currentBlock, 4, Endian.little); + final t2 = unpack32(currentBlock, 8, Endian.little); + final t3 = unpack32(currentBlock, 12, Endian.little); + + h0 += t0 & 0x3ffffff; + h1 += uRS((t1 << 32) | t0, 26) & 0x3ffffff; + h2 += uRS((t2 << 32) | t1, 20) & 0x3ffffff; + h3 += uRS((t3 << 32) | t2, 14) & 0x3ffffff; + h4 += uRS(t3, 8); + + if (currentBlockOffset == BLOCK_SIZE) { + h4 += shiftl32(1, 24); + } + + var tp0 = h0 * r0 + h1 * s4 + h2 * s3 + h3 * s2 + h4 * s1; + var tp1 = h0 * r1 + h1 * r0 + h2 * s4 + h3 * s3 + h4 * s2; + var tp2 = h0 * r2 + h1 * r1 + h2 * r0 + h3 * s4 + h4 * s3; + var tp3 = h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * s4; + var tp4 = h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0; + + h0 = (tp0 & 0xffffffff) & 0x3ffffff; + tp1 += uRS(tp0, 26); + h1 = (tp1 & 0xffffffff) & 0x3ffffff; + tp2 += uRS(tp1, 26); + h2 = (tp2 & 0xffffffff) & 0x3ffffff; + tp3 += uRS(tp2, 26); + h3 = (tp3 & 0xffffffff) & 0x3ffffff; + tp4 += uRS(tp3, 26); + h4 = (tp4 & 0xffffffff) & 0x3ffffff; + + h0 += (uRS(tp4, 26) & 0xffffffff) * 5; + h1 += cshiftr32(h0, 26); + h0 &= 0x3ffffff; + } + + @override + int doFinal(Uint8List out, final int outOff) { + if (outOff + BLOCK_SIZE > out.length) { + throw ArgumentError('Output buffer is too short.'); + } + + if (currentBlockOffset > 0) { + processBlock(); + } + + h1 += cshiftr32(h0, 26); + h0 &= 0x3ffffff; + h2 += cshiftr32(h1, 26); + h1 &= 0x3ffffff; + h3 += cshiftr32(h2, 26); + h2 &= 0x3ffffff; + h4 += cshiftr32(h3, 26); + h3 &= 0x3ffffff; + h0 += cshiftr32(h4, 26) * 5; + h4 &= 0x3ffffff; + h1 += cshiftr32(h0, 26); + h0 &= 0x3ffffff; + + int g0, g1, g2, g3, g4, b; + g0 = sum32(h0, 5); + b = cshiftr32(g0, 26); + g0 &= 0x3ffffff; + g1 = sum32(h1, b); + b = cshiftr32(g1, 26); + g1 &= 0x3ffffff; + g2 = sum32(h2, b); + b = cshiftr32(g2, 26); + g2 &= 0x3ffffff; + g3 = sum32(h3, b); + b = cshiftr32(g3, 26); + g3 &= 0x3ffffff; + g4 = sum32(h4, b) - shiftl32(1, 26); + + b = cshiftr32(g4, 31) - 1; + var nb = not32(b); + h0 = (h0 & nb) | (g0 & b); + h1 = (h1 & nb) | (g1 & b); + h2 = (h2 & nb) | (g2 & b); + h3 = (h3 & nb) | (g3 & b); + h4 = (h4 & nb) | (g4 & b); + + int f0, f1, f2, f3; + f0 = (h0 | shiftl32(h1, 26)) + k0; + f1 = (cshiftr32(h1, 6) | shiftl32(h2, 20)) + k1; + f2 = (cshiftr32(h2, 12) | shiftl32(h3, 14)) + k2; + f3 = (cshiftr32(h3, 18) | shiftl32(h4, 8)) + k3; + + var outByte = ByteData.view(out.buffer, out.offsetInBytes, out.length); + pack32(f0 & 0xffffffff, outByte, outOff, Endian.little); + f1 += uRS(f0, 32); + pack32(f1 & 0xffffffff, outByte, outOff + 4, Endian.little); + f2 += uRS(f1, 32); + pack32(f2 & 0xffffffff, outByte, outOff + 8, Endian.little); + f3 += uRS(f2, 32); + pack32(f3 & 0xffffffff, outByte, outOff + 12, Endian.little); + //End come back here chunk + + out = outByte.buffer.asUint8List(); + + reset(); + return BLOCK_SIZE; + } + + @override + void reset() { + currentBlockOffset = 0; + + h0 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + } +} + +int uRS(int x, int n) { + return x >= 0 ? x >> n : ~(~x >> n); +} + +/* +int uRS(int x, int n) { + return (x >= 0) ? x >> (64 - n) : ~(~x >> (64 - n)); +} +*/ diff --git a/pointycastle/lib/padded_block_cipher/padded_block_cipher_impl.dart b/pointycastle/lib/padded_block_cipher/padded_block_cipher_impl.dart new file mode 100644 index 0000000..ae859b4 --- /dev/null +++ b/pointycastle/lib/padded_block_cipher/padded_block_cipher_impl.dart @@ -0,0 +1,121 @@ +// See file LICENSE for more information. + +library impl.padded_block_cipher.padded_block_cipher_impl; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// The standard implementation of [PaddedBlockCipher]. +class PaddedBlockCipherImpl implements PaddedBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + PaddedBlockCipher, + r'^(.+)/([^/]+)$', + (_, final Match match) => () { + var padding = Padding(match.group(2)!); + var underlyingCipher = BlockCipher(match.group(1)!); + return PaddedBlockCipherImpl(padding, underlyingCipher); + }); + + @override + final Padding padding; + @override + final BlockCipher cipher; + + bool? _encrypting; + + PaddedBlockCipherImpl(this.padding, this.cipher); + + @override + String get algorithmName => + '${cipher.algorithmName}/${padding.algorithmName}'; + + @override + int get blockSize => cipher.blockSize; + + @override + void reset() { + _encrypting = null; + cipher.reset(); + } + + @override + void init(bool forEncryption, covariant PaddedBlockCipherParameters params) { + _encrypting = forEncryption; + cipher.init(forEncryption, params.underlyingCipherParameters); + padding.init(params.paddingCipherParameters); + } + + @override + Uint8List process(Uint8List data) { + var inputBlocks = (data.length + blockSize - 1) ~/ blockSize; + + int outputBlocks; + if (_encrypting ?? false) { + outputBlocks = (data.length + blockSize) ~/ blockSize; + } else { + if ((data.length % blockSize) != 0) { + throw ArgumentError( + 'Input data length must be a multiple of cipher\'s block size'); + } + outputBlocks = inputBlocks; + } + + var out = Uint8List(outputBlocks * blockSize); + + for (var i = 0; i < (inputBlocks - 1); i++) { + var offset = i * blockSize; + processBlock(data, offset, out, offset); + } + + var lastBlockOffset = (inputBlocks - 1) * blockSize; + var lastBlockSize = doFinal(data, lastBlockOffset, out, lastBlockOffset); + + return out.sublist(0, lastBlockOffset + lastBlockSize); + } + + @override + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) { + return cipher.processBlock(inp, inpOff, out, outOff); + } + + @override + int doFinal(Uint8List inp, int inpOff, Uint8List out, int outOff) { + if (_encrypting ?? false) { + var lastInputBlock = Uint8List(blockSize)..setAll(0, inp.sublist(inpOff)); + + var remainder = inp.length - inpOff; + + if (remainder < blockSize) { + // Padding goes embedded in last block of data + padding.addPadding(lastInputBlock, inp.length - inpOff); + + processBlock(lastInputBlock, 0, out, outOff); + + return blockSize; + } else { + // Padding goes alone in an additional block + processBlock(inp, inpOff, out, outOff); + + padding.addPadding(lastInputBlock, 0); + + processBlock(lastInputBlock, 0, out, outOff + blockSize); + + return 2 * blockSize; + } + } else { + // Decrypt last block and remove padding + processBlock(inp, inpOff, out, outOff); + + var padCount = padding.padCount(out.sublist(outOff)); + + var padOffsetInBlock = blockSize - padCount; + + out.fillRange(outOff + padOffsetInBlock, out.length, 0); + + return padOffsetInBlock; + } + } +} diff --git a/pointycastle/lib/paddings/iso7816d4.dart b/pointycastle/lib/paddings/iso7816d4.dart new file mode 100644 index 0000000..db4fca4 --- /dev/null +++ b/pointycastle/lib/paddings/iso7816d4.dart @@ -0,0 +1,57 @@ +// See file LICENSE for more information. + +library impl.padding.iso7816d4; + +import 'dart:typed_data' show Uint8List; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_padding.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// A padder that adds the padding according to the scheme referenced in +/// ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00 +class ISO7816d4Padding extends BasePadding { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Padding, 'ISO7816-4', () => ISO7816d4Padding()); + + @override + String get algorithmName => 'ISO7816-4'; + + @override + void init([CipherParameters? params]) { + // nothing to do. + } + + /// add the pad bytes to the passed in block, returning the + /// number of bytes added. + @override + int addPadding(Uint8List data, int offset) { + var added = data.length - offset; + + data[offset] = 0x80; + offset++; + + while (offset < data.length) { + data[offset] = 0; + offset++; + } + + return added; + } + + /// return the number of pad bytes present in the block. + @override + int padCount(Uint8List data) { + var count = data.length - 1; + + while (count > 0 && data[count] == 0) { + count--; + } + + if (data[count] != 0x80) { + throw ArgumentError('pad block corrupted'); + } + + return data.length - count; + } +} diff --git a/pointycastle/lib/paddings/pkcs7.dart b/pointycastle/lib/paddings/pkcs7.dart new file mode 100644 index 0000000..0fff9df --- /dev/null +++ b/pointycastle/lib/paddings/pkcs7.dart @@ -0,0 +1,53 @@ +// See file LICENSE for more information. + +library impl.padding.pkcs7; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_padding.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// A [Padding] that adds PKCS7/PKCS5 padding to a block. +class PKCS7Padding extends BasePadding { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Padding, 'PKCS7', () => PKCS7Padding()); + + @override + String get algorithmName => 'PKCS7'; + + @override + void init([CipherParameters? params]) { + // nothing to do. + } + + @override + int addPadding(Uint8List data, int offset) { + var code = data.length - offset; + + while (offset < data.length) { + data[offset] = code; + offset++; + } + + return code; + } + + @override + int padCount(Uint8List data) { + var count = clip8(data[data.length - 1]); + + if (count > data.length || count == 0) { + throw ArgumentError('Invalid or corrupted pad block'); + } + + for (var i = 1; i <= count; i++) { + if (data[data.length - i] != count) { + throw ArgumentError('Invalid or corrupted pad block'); + } + } + + return count; + } +} diff --git a/pointycastle/lib/pointycastle.dart b/pointycastle/lib/pointycastle.dart new file mode 100644 index 0000000..9fd5d74 --- /dev/null +++ b/pointycastle/lib/pointycastle.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +/// +/// This is the main entry point to the cipher library API. +/// +/// It includes the following libraries: +/// * **api.dart** = comprises the whole API specification +/// * **impl.dart** = defines algorithm implementations and all cipherParameters to be used with them +/// * **asn1.dart** = ASN1 library to encode and decode ASN1 objects +/// +library pointycastle; + +export 'package:pointycastle/api.dart'; +export 'package:pointycastle/impl.dart'; +export 'package:pointycastle/asn1.dart'; diff --git a/pointycastle/lib/random/auto_seed_block_ctr_random.dart b/pointycastle/lib/random/auto_seed_block_ctr_random.dart new file mode 100644 index 0000000..6d6f8fa --- /dev/null +++ b/pointycastle/lib/random/auto_seed_block_ctr_random.dart @@ -0,0 +1,105 @@ +// See file LICENSE for more information. + +library impl.secure_random.auto_seed_block_ctr_random; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/random/block_ctr_random.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of [SecureRandom] that uses a [BlockCipher] with CTR mode to generate random +/// values and automatically self reseeds itself after each request for data, in order to achieve +/// forward security. See section 4.1 of the paper: +/// Practical Random Number Generation in Software (by John Viega). +class AutoSeedBlockCtrRandom implements SecureRandom { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + SecureRandom, + r'^(.*)/CTR/AUTO-SEED-PRNG$', + (_, final Match match) => () { + var blockCipherName = match.group(1); + var blockCipher = BlockCipher(blockCipherName!); + return AutoSeedBlockCtrRandom(blockCipher); + }); + + late BlockCtrRandom _delegate; + final bool _reseedIV; + + var _inAutoReseed = false; + late int _autoReseedKeyLength; + + @override + String get algorithmName => + '${_delegate.cipher.algorithmName}/CTR/AUTO-SEED-PRNG'; + + AutoSeedBlockCtrRandom(BlockCipher cipher, [this._reseedIV = true]) { + _delegate = BlockCtrRandom(cipher); + } + + @override + void seed(CipherParameters params) { + if (params is ParametersWithIV) { + _autoReseedKeyLength = params.parameters!.key.length; + _delegate.seed(params); + } else if (params is KeyParameter) { + _autoReseedKeyLength = params.key.length; + _delegate.seed(params); + } else { + throw ArgumentError( + 'Only types ParametersWithIV or KeyParameter allowed for seeding'); + } + } + + @override + int nextUint8() => _autoReseedIfNeededAfter(() { + return _delegate.nextUint8(); + }); + + @override + int nextUint16() => _autoReseedIfNeededAfter(() { + return _delegate.nextUint16(); + }); + + @override + int nextUint32() => _autoReseedIfNeededAfter(() { + return _delegate.nextUint32(); + }); + + @override + BigInt nextBigInteger(int bitLength) => _autoReseedIfNeededAfter(() { + return _delegate.nextBigInteger(bitLength); + }); + + @override + Uint8List nextBytes(int count) => _autoReseedIfNeededAfter(() { + return _delegate.nextBytes(count); + }); + + dynamic _autoReseedIfNeededAfter(dynamic closure) { + if (_inAutoReseed) { + return closure(); + } else { + _inAutoReseed = true; + var ret = closure(); + _doAutoReseed(); + _inAutoReseed = false; + return ret; + } + } + + void _doAutoReseed() { + var newKey = nextBytes(_autoReseedKeyLength); + var keyParam = KeyParameter(newKey); + + CipherParameters params; + if (_reseedIV) { + params = + ParametersWithIV(keyParam, nextBytes(_delegate.cipher.blockSize)); + } else { + params = keyParam; + } + + _delegate.seed(params); + } +} diff --git a/pointycastle/lib/random/block_ctr_random.dart b/pointycastle/lib/random/block_ctr_random.dart new file mode 100644 index 0000000..d1585d9 --- /dev/null +++ b/pointycastle/lib/random/block_ctr_random.dart @@ -0,0 +1,69 @@ +// See file LICENSE for more information. + +library impl.secure_random.block_ctr_random; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/impl/secure_random_base.dart'; + +/// An implementation of [SecureRandom] that uses a [BlockCipher] with CTR mode to generate random +/// values. +class BlockCtrRandom extends SecureRandomBase implements SecureRandom { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + SecureRandom, + r'^(.*)/CTR/PRNG$', + (_, final Match match) => () { + var blockCipherName = match.group(1); + var blockCipher = BlockCipher(blockCipherName!); + return BlockCtrRandom(blockCipher); + }); + + final BlockCipher cipher; + + late Uint8List _input; + late Uint8List _output; + late int _used; + + BlockCtrRandom(this.cipher) { + _input = Uint8List(cipher.blockSize); + _output = Uint8List(cipher.blockSize); + _used = _output.length; + } + + @override + String get algorithmName => '${cipher.algorithmName}/CTR/PRNG'; + + @override + void seed(CipherParameters params) { + _used = _output.length; + if (params is ParametersWithIV) { + _input.setAll(0, params.iv); + cipher.init(true, params.parameters!); + } else { + cipher.init(true, params); + } + } + + @override + int nextUint8() { + if (_used == _output.length) { + cipher.processBlock(_input, 0, _output, 0); + _used = 0; + _incrementInput(); + } + + return clip8(_output[_used++]); + } + + void _incrementInput() { + var offset = _input.length; + do { + offset--; + _input[offset] += 1; + } while (_input[offset] == 0); + } +} diff --git a/pointycastle/lib/random/fortuna_random.dart b/pointycastle/lib/random/fortuna_random.dart new file mode 100644 index 0000000..e698002 --- /dev/null +++ b/pointycastle/lib/random/fortuna_random.dart @@ -0,0 +1,59 @@ +// See file LICENSE for more information. + +library impl.secure_random.fortuna_random; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/aes.dart'; +import 'package:pointycastle/random/auto_seed_block_ctr_random.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of [SecureRandom] as specified in the Fortuna algorithm. +class FortunaRandom implements SecureRandom { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(SecureRandom, 'Fortuna', () => FortunaRandom()); + + final AESEngine _aes; + late AutoSeedBlockCtrRandom _prng; + + @override + String get algorithmName => 'Fortuna'; + + FortunaRandom() : _aes = AESEngine() { + _prng = AutoSeedBlockCtrRandom(_aes, false); + } + + @override + void seed(covariant KeyParameter param) { + if (param.key.length != 32) { + throw ArgumentError('Fortuna PRNG can only be used with 256 bits keys'); + } + + final iv = Uint8List(16); + iv[15] = 1; + _prng.seed(ParametersWithIV(param, iv)); + } + + @override + int nextUint8() => _prng.nextUint8(); + + @override + int nextUint16() => _prng.nextUint16(); + + @override + int nextUint32() => _prng.nextUint32(); + + @override + BigInt nextBigInteger(int bitLength) => _prng.nextBigInteger(bitLength); + + @override + Uint8List nextBytes(int count) { + if (count > 1048576) { + throw ArgumentError( + 'Fortuna PRNG cannot generate more than 1MB of random data per invocation'); + } + + return _prng.nextBytes(count); + } +} diff --git a/pointycastle/lib/signers/ecdsa_signer.dart b/pointycastle/lib/signers/ecdsa_signer.dart new file mode 100644 index 0000000..3e4510f --- /dev/null +++ b/pointycastle/lib/signers/ecdsa_signer.dart @@ -0,0 +1,402 @@ +// See file LICENSE for more information. + +library impl.signer.ecdsa_signer; + +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/ecc/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart' as utils; + +bool _testBit(BigInt i, int n) { + return (i & (BigInt.one << n)) != BigInt.zero; +} + +class ECDSASigner implements Signer { + /// Intended for internal use. + // ignore: non_constant_identifier_names + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + Signer, r'^(.+)/(DET-)?ECDSA$', (_, final Match match) { + // ignore: omit_local_variable_types + final String? digestName = match.group(1); + // ignore: omit_local_variable_types + final bool withMac = match.group(2) != null; + return () { + var underlyingDigest = Digest(digestName!); + var mac = withMac ? Mac('$digestName/HMAC') : null; + return ECDSASigner(underlyingDigest, mac); + }; + }); + + ECPublicKey? _pbkey; + ECPrivateKey? _pvkey; + SecureRandom? _random; + final Digest? _digest; + final Mac? _kMac; + + /// If [_digest] is not null it is used to hash the message before signing and verifying, otherwise, the message needs to be + /// hashed by the user of this [ECDSASigner] object. + /// If [_kMac] is not null, RFC 6979 is used for k calculation with the given [Mac]. Keep in mind that, to comply with + /// RFC 69679, [_kMac] must be HMAC with the same digest used to hash the message. + ECDSASigner([this._digest, this._kMac]); + + @override + String get algorithmName => + '${_digest!.algorithmName}/${_kMac == null ? '' : 'DET-'}ECDSA'; + + @override + void reset() {} + + /// Init this [Signer]. The [params] argument can be: + /// -A [ParametersWithRandom] containing a [PrivateKeyParameter] or a raw [PrivateKeyParameter] for signing + /// -An [PublicKeyParameter] for verifying. + @override + void init(bool forSigning, CipherParameters params) { + _pbkey = _pvkey = null; + + if (forSigning) { + PrivateKeyParameter pvparams; + + if (params is ParametersWithRandom) { + _random = params.random; + pvparams = params.parameters as PrivateKeyParameter; + } else if (_kMac != null) { + _random = null; + pvparams = params as PrivateKeyParameter; + } else { + _random = SecureRandom(); + pvparams = params as PrivateKeyParameter; + } + + _pvkey = pvparams.key as ECPrivateKey; + } else { + PublicKeyParameter pbparams; + + pbparams = params as PublicKeyParameter; + + _pbkey = pbparams.key as ECPublicKey; + } + } + + @override + Signature generateSignature(Uint8List message) { + message = _hashMessageIfNeeded(message); + + var n = _pvkey!.parameters!.n; + var e = _calculateE(n, message); + BigInt r; + BigInt s; + + dynamic kCalculator; + if (_kMac != null) { + kCalculator = _RFC6979KCalculator(_kMac, n, _pvkey!.d!, message); + } else { + kCalculator = _RandomKCalculator(n, _random!); + } + + // 5.3.2 + do { + // generate s + BigInt? k; + + do { + // generate r + k = kCalculator.nextK() as BigInt?; + + var p = (_pvkey!.parameters!.G * k)!; + + // 5.3.3 + var x = p.x!.toBigInteger()!; + + r = x % n; + } while (r == BigInt.zero); + + var d = _pvkey!.d!; + + s = (k!.modInverse(n) * (e + (d * r))) % n; + } while (s == BigInt.zero); + + return ECSignature(r, s); + } + + @override + bool verifySignature(Uint8List message, covariant ECSignature signature) { + message = _hashMessageIfNeeded(message); + + var n = _pbkey!.parameters!.n; + var e = _calculateE(n, message); + + var r = signature.r; + var s = signature.s; + + // r in the range [1,n-1] + if (r.compareTo(BigInt.one) < 0 || r.compareTo(n) >= 0) { + return false; + } + + // s in the range [1,n-1] + if (s.compareTo(BigInt.one) < 0 || s.compareTo(n) >= 0) { + return false; + } + + var c = s.modInverse(n); + + var u1 = (e * c) % n; + var u2 = (r * c) % n; + + var G = _pbkey!.parameters!.G; + var Q = _pbkey!.Q!; + + var point = _sumOfTwoMultiplies(G, u1, Q, u2)!; + + // components must be bogus. + if (point.isInfinity) { + return false; + } + + var v = point.x!.toBigInteger()! % n; + + return v == r; + } + + Uint8List _hashMessageIfNeeded(Uint8List message) { + if (_digest != null) { + _digest.reset(); + return _digest.process(message); + } else { + return message; + } + } + + BigInt _calculateE(BigInt n, Uint8List message) { + var log2n = n.bitLength; + var messageBitLength = message.length * 8; + + if (log2n >= messageBitLength) { + return utils.decodeBigIntWithSign(1, message); + } else { + var trunc = utils.decodeBigIntWithSign(1, message); + + trunc = trunc >> (messageBitLength - log2n); + + return trunc; + } + } + + ECPoint? _sumOfTwoMultiplies(ECPoint P, BigInt a, ECPoint Q, BigInt b) { + var c = P.curve; + + if (c != Q.curve) { + throw ArgumentError('P and Q must be on same curve'); + } + + // Point multiplication for Koblitz curves (using WTNAF) beats Shamir's trick + // TODO: uncomment this when F2m available + /* + if( c is ECCurve.F2m ) { + ECCurve.F2m f2mCurve = (ECCurve.F2m)c; + if( f2mCurve.isKoblitz() ) { + return P.multiply(a).add(Q.multiply(b)); + } + } + */ + + return _implShamirsTrick(P, a, Q, b); + } + + ECPoint? _implShamirsTrick(ECPoint P, BigInt k, ECPoint Q, BigInt l) { + var m = max(k.bitLength, l.bitLength); + + var Z = P + Q; + var R = P.curve.infinity; + + for (var i = m - 1; i >= 0; --i) { + R = R!.twice(); + + if (_testBit(k, i)) { + if (_testBit(l, i)) { + R = R! + Z; + } else { + R = R! + P; + } + } else { + if (_testBit(l, i)) { + R = R! + Q; + } + } + } + + return R; + } +} + +class NormalizedECDSASigner implements Signer { + final ECDSASigner signer; + final bool enforceNormalized; + + /// Wraps ECDSASigner and enforces normalisation on verify if + /// [enforceNormalized] is true. + /// + /// Always generates normalized signatures. + NormalizedECDSASigner(this.signer, {this.enforceNormalized = false}); + + @override + String get algorithmName => signer.algorithmName; + + @override + Signature generateSignature(Uint8List message) { + return (signer.generateSignature(message) as ECSignature) + .normalize(signer._pvkey!.parameters!); + } + + @override + void init(bool forSigning, CipherParameters params) { + signer.init(forSigning, params); + } + + @override + void reset() { + signer.reset(); + } + + @override + bool verifySignature(Uint8List message, Signature signature) { + var isNormalized = + (signature as ECSignature).isNormalized(signer._pbkey!.parameters!); + var isVerified = signer.verifySignature(message, signature); + + // Constant time. + return (isNormalized | !enforceNormalized) & isVerified; + } +} + +class _RFC6979KCalculator { + final Mac _mac; + // ignore: non_constant_identifier_names + late Uint8List _K; + // ignore: non_constant_identifier_names + late Uint8List _V; + final BigInt _n; + + _RFC6979KCalculator(this._mac, this._n, BigInt d, Uint8List message) { + _V = Uint8List(_mac.macSize); + _K = Uint8List(_mac.macSize); + _init(d, message); + } + + void _init(BigInt d, Uint8List message) { + _V.fillRange(0, _V.length, 0x01); + _K.fillRange(0, _K.length, 0x00); + + var x = Uint8List((_n.bitLength + 7) ~/ 8); + var dVal = _asUnsignedByteArray(d); + + x.setRange(x.length - dVal.length, x.length, dVal); + + var m = Uint8List((_n.bitLength + 7) ~/ 8); + + var mInt = _bitsToInt(message); + + if (mInt > _n) { + mInt -= _n; + } + + var mVal = _asUnsignedByteArray(mInt); + + m.setRange(m.length - mVal.length, m.length, mVal); + + _mac.init(KeyParameter(_K)); + + _mac.update(_V, 0, _V.length); + _mac.updateByte(0x00); + _mac.update(x, 0, x.length); + _mac.update(m, 0, m.length); + _mac.doFinal(_K, 0); + + _mac.init(KeyParameter(_K)); + _mac.update(_V, 0, _V.length); + _mac.doFinal(_V, 0); + + _mac.update(_V, 0, _V.length); + _mac.updateByte(0x01); + _mac.update(x, 0, x.length); + _mac.update(m, 0, m.length); + _mac.doFinal(_K, 0); + + _mac.init(KeyParameter(_K)); + _mac.update(_V, 0, _V.length); + _mac.doFinal(_V, 0); + } + + BigInt nextK() { + var t = Uint8List((_n.bitLength + 7) ~/ 8); + + for (;;) { + var tOff = 0; + + while (tOff < t.length) { + _mac.update(_V, 0, _V.length); + _mac.doFinal(_V, 0); + + if ((t.length - tOff) < _V.length) { + t.setRange(tOff, t.length, _V); + tOff += t.length - tOff; + } else { + t.setRange(tOff, tOff + _V.length, _V); + tOff += _V.length; + } + } + + var k = _bitsToInt(t); + + // ignore: unrelated_type_equality_checks + if ((k == 0) || (k >= _n)) { + _mac.update(_V, 0, _V.length); + _mac.updateByte(0x00); + _mac.doFinal(_K, 0); + + _mac.init(KeyParameter(_K)); + _mac.update(_V, 0, _V.length); + _mac.doFinal(_V, 0); + } else { + return k; + } + } + } + + BigInt _bitsToInt(Uint8List t) { + var v = utils.decodeBigIntWithSign(1, t); + if ((t.length * 8) > _n.bitLength) { + v = v >> ((t.length * 8) - _n.bitLength); + } + + return v; + } + + Uint8List _asUnsignedByteArray(BigInt value) { + var bytes = utils.encodeBigInt(value); + + if (bytes[0] == 0) { + return Uint8List.fromList(bytes.sublist(1)); + } else { + return Uint8List.fromList(bytes); + } + } +} + +class _RandomKCalculator { + final BigInt _n; + final SecureRandom _random; + + _RandomKCalculator(this._n, this._random); + + BigInt nextK() { + BigInt k; + do { + k = _random.nextBigInteger(_n.bitLength); + } while (k == BigInt.zero || k >= _n); + return k; + } +} diff --git a/pointycastle/lib/signers/pss_signer.dart b/pointycastle/lib/signers/pss_signer.dart new file mode 100644 index 0000000..5f1cf62 --- /dev/null +++ b/pointycastle/lib/signers/pss_signer.dart @@ -0,0 +1,269 @@ +// See file LICENSE for more information. + +library impl.signer.pss_signer; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/asymmetric/api.dart'; +import 'package:pointycastle/asymmetric/rsa.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../src/utils.dart'; + +class PSSSigner implements Signer { + /// Intended for internal use. + static final FactoryConfig factoryConfig = + DynamicFactoryConfig.suffix(Signer, '/PSS', (_, Match match) { + final digestName = match.group(1); + return () => PSSSigner( + RSAEngine(), + Digest(digestName!), + Digest(digestName), + ); + }); + + static const int TRAILER_IMPLICIT = 0xBC; + + final Digest _contentDigest; + final Digest _mgfDigest; + final AsymmetricBlockCipher _cipher; + final int _hLen; + final int _mgfhLen; + final int _trailer; + + late bool _sSet; + late int _sLen; + late Uint8List _salt; + late SecureRandom _random; + + late int _emBits; + late Uint8List _block; + late Uint8List _mDash; + + late bool _forSigning; + + PSSSigner(this._cipher, this._contentDigest, this._mgfDigest, + {int trailer = TRAILER_IMPLICIT}) + : _hLen = _contentDigest.digestSize, + _mgfhLen = _mgfDigest.digestSize, + _trailer = trailer; + + @override + String get algorithmName => '${_mgfDigest.algorithmName}/PSS'; + + @override + void init(bool forSigning, CipherParameters params) { + _forSigning = forSigning; + + AsymmetricKeyParameter akparams; + if (params is ParametersWithSaltConfiguration) { + akparams = params.parameters as AsymmetricKeyParameter; + _random = params.random; + _sSet = false; + _sLen = params.saltLength; + _salt = Uint8List(_sLen); + } else if (params is ParametersWithSalt) { + akparams = params.parameters as AsymmetricKeyParameter; + _sSet = true; + _salt = params.salt; + _sLen = _salt.length; + } else { + throw ArgumentError( + 'Unsupported parameters type ${params.runtimeType}: should be ParametersWithSaltConfiguration or ParametersWithSalt'); + } + + var k = akparams.key as RSAAsymmetricKey; + + if (forSigning && (k is! RSAPrivateKey)) { + throw ArgumentError('Signing requires private key'); + } + + if (!forSigning && (k is! RSAPublicKey)) { + throw ArgumentError('Verification requires public key'); + } + + _emBits = k.modulus!.bitLength - 1; + + if (_emBits < (8 * _hLen + 8 * _sLen + 9)) { + throw ArgumentError('Key too small for specified hash and salt lengths'); + } + + _mDash = Uint8List(8 + _sLen + _contentDigest.digestSize); + + _cipher.init(forSigning, akparams); + + _block = Uint8List((_emBits + 7) ~/ 8); + + reset(); + } + + /// Clear possibly sensitive data. + void _clearBlock(Uint8List block) { + for (var i = 0; i != block.length; i++) { + block[i] = 0; + } + } + + @override + void reset() { + _contentDigest.reset(); + } + + @override + PSSSignature generateSignature(Uint8List message) { + if (!_forSigning) { + throw StateError('Signer was not initialised for signature generation'); + } + + _contentDigest.reset(); + _contentDigest.update(message, 0, message.length); + _contentDigest.doFinal(_mDash, _mDash.length - _hLen - _sLen); + + if (_sLen != 0) { + if (!_sSet) { + _salt = _random.nextBytes(_sLen); + } + + arrayCopy(_salt, 0, _mDash, _mDash.length - _sLen, _sLen); + } + + var h = Uint8List(_hLen); + + _contentDigest.update(_mDash, 0, _mDash.length); + + _contentDigest.doFinal(h, 0); + + _block[_block.length - _sLen - 1 - _hLen - 1] = 0x01; + arrayCopy(_salt, 0, _block, _block.length - _sLen - _hLen - 1, _sLen); + + var dbMask = + _maskGeneratorFunction1(h, 0, h.length, _block.length - _hLen - 1); + for (var i = 0; i != dbMask.length; i++) { + _block[i] ^= dbMask[i]; + } + + arrayCopy(h, 0, _block, _block.length - _hLen - 1, _hLen); + + var firstByteMask = 0xff >> ((_block.length * 8) - _emBits); + + _block[0] &= firstByteMask; + _block[_block.length - 1] = _trailer; + + var b = _cipher.process(_block); + + _clearBlock(_block); + + return PSSSignature(b); + } + + @override + bool verifySignature(Uint8List message, covariant PSSSignature signature) { + if (_forSigning) { + throw StateError('Signer was not initialised for signature verification'); + } + + _contentDigest.reset(); + _contentDigest.update(message, 0, message.length); + _contentDigest.doFinal(_mDash, _mDash.length - _hLen - _sLen); + + var b = _cipher.process(signature.bytes); + _block.fillRange(0, _block.length - b.length, 0); + arrayCopy(b, 0, _block, _block.length - b.length, b.length); + + var firstByteMask = 0xFF >> ((_block.length * 8) - _emBits); + + if (_block[0] != (_block[0] & firstByteMask) || + _block[_block.length - 1] != _trailer) { + _clearBlock(_block); + return false; + } + + var dbMask = _maskGeneratorFunction1( + _block, _block.length - _hLen - 1, _hLen, _block.length - _hLen - 1); + + for (var i = 0; i != dbMask.length; i++) { + _block[i] ^= dbMask[i]; + } + + _block[0] &= firstByteMask; + + for (var i = 0; i != _block.length - _hLen - _sLen - 2; i++) { + if (_block[i] != 0) { + _clearBlock(_block); + return false; + } + } + + if (_block[_block.length - _hLen - _sLen - 2] != 0x01) { + _clearBlock(_block); + return false; + } + + if (_sSet) { + arrayCopy(_salt, 0, _mDash, _mDash.length - _sLen, _sLen); + } else { + arrayCopy(_block, _block.length - _sLen - _hLen - 1, _mDash, + _mDash.length - _sLen, _sLen); + } + + _contentDigest.update(_mDash, 0, _mDash.length); + _contentDigest.doFinal(_mDash, _mDash.length - _hLen); + + for (var i = _block.length - _hLen - 1, j = _mDash.length - _hLen; + j != _mDash.length; + i++, j++) { + if ((_block[i] ^ _mDash[j]) != 0) { + _clearBlock(_mDash); + _clearBlock(_block); + return false; + } + } + + _clearBlock(_mDash); + _clearBlock(_block); + return true; + } + + /// Convert int to octet string. + void _intToOSP(int i, Uint8List sp) { + sp[0] = i >> 24; + sp[1] = i >> 16; + sp[2] = i >> 8; + sp[3] = i >> 0; + } + + Uint8List _maskGeneratorFunction1( + Uint8List Z, int zOff, int zLen, int length) { + var mask = Uint8List(length); + var hashBuf = Uint8List(_mgfhLen); + var C = Uint8List(4); + var counter = 0; + + _mgfDigest.reset(); + + while (counter < (length ~/ _mgfhLen)) { + _intToOSP(counter, C); + + _mgfDigest.update(Z, zOff, zLen); + _mgfDigest.update(C, 0, C.length); + _mgfDigest.doFinal(hashBuf, 0); + + arrayCopy(hashBuf, 0, mask, counter * _mgfhLen, _mgfhLen); + counter++; + } + + if ((counter * _mgfhLen) < length) { + _intToOSP(counter, C); + + _mgfDigest.update(Z, zOff, zLen); + _mgfDigest.update(C, 0, C.length); + _mgfDigest.doFinal(hashBuf, 0); + + arrayCopy(hashBuf, 0, mask, counter * _mgfhLen, + mask.length - (counter * _mgfhLen)); + } + + return mask; + } +} diff --git a/pointycastle/lib/signers/rsa_signer.dart b/pointycastle/lib/signers/rsa_signer.dart new file mode 100644 index 0000000..49f73f8 --- /dev/null +++ b/pointycastle/lib/signers/rsa_signer.dart @@ -0,0 +1,197 @@ +// See file LICENSE for more information. + +library impl.signer.rsa_signer; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/asymmetric/api.dart'; +import 'package:pointycastle/asymmetric/pkcs1.dart'; +import 'package:pointycastle/asymmetric/rsa.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +// TODO: implement full ASN1 encoding (for now I will do a little ad-hoc implementation of just what is needed here) +class RSASigner implements Signer { + /// Intended for internal use. + static final FactoryConfig factoryConfig = + DynamicFactoryConfig.suffix(Signer, '/RSA', (_, Match match) { + final digestName = match.group(1); + final digestIdentifierHex = _digestIdentifierHexes[digestName!]; + if (digestIdentifierHex == null) { + throw RegistryFactoryException( + 'RSA signing with digest $digestName is not supported'); + } + return () => RSASigner(Digest(digestName), digestIdentifierHex); + }); + + static final Map _digestIdentifierHexes = { + 'MD2': '06082a864886f70d0202', + 'MD4': '06082a864886f70d0204', + 'MD5': '06082a864886f70d0205', + 'RIPEMD-128': '06052b24030202', + 'RIPEMD-160': '06052b24030201', + 'RIPEMD-256': '06052b24030203', + 'SHA-1': '06052b0e03021a', + 'SHA-224': '0609608648016503040204', + 'SHA-256': '0609608648016503040201', + 'SHA-384': '0609608648016503040202', + 'SHA-512': '0609608648016503040203' + }; + + final AsymmetricBlockCipher _rsa = PKCS1Encoding(RSAEngine()); + final Digest _digest; + late Uint8List + _digestIdentifier; // DER encoded with trailing tag (06)+length byte + late bool _forSigning; + + RSASigner(this._digest, String digestIdentifierHex) { + _digestIdentifier = _hexStringToBytes(digestIdentifierHex); + } + + @override + String get algorithmName => '${_digest.algorithmName}/RSA'; + + @override + void reset() { + _digest.reset(); + _rsa.reset(); + } + + @override + void init(bool forSigning, CipherParameters params) { + _forSigning = forSigning; + + AsymmetricKeyParameter akparams; + if (params is ParametersWithRandom) { + akparams = params.parameters as AsymmetricKeyParameter; + } else { + akparams = params as AsymmetricKeyParameter; + } + var k = akparams.key as RSAAsymmetricKey; + + if (forSigning && (k is! RSAPrivateKey)) { + throw ArgumentError('Signing requires private key'); + } + + if (!forSigning && (k is! RSAPublicKey)) { + throw ArgumentError('Verification requires public key'); + } + + reset(); + + _rsa.init(forSigning, params); + } + + @override + RSASignature generateSignature(Uint8List message, {bool normalize = false}) { + if (!_forSigning) { + throw StateError('Signer was not initialised for signature generation'); + } + + var hash = Uint8List(_digest.digestSize); + _digest.reset(); + _digest.update(message, 0, message.length); + _digest.doFinal(hash, 0); + + var data = _derEncode(hash); + var out = Uint8List(_rsa.outputBlockSize); + var len = _rsa.processBlock(data, 0, data.length, out, 0); + return RSASignature(out.sublist(0, len)); + } + + @override + bool verifySignature(Uint8List message, covariant RSASignature signature) { + if (_forSigning) { + throw StateError('Signer was not initialised for signature verification'); + } + + var hash = Uint8List(_digest.digestSize); + _digest.reset(); + _digest.update(message, 0, message.length); + _digest.doFinal(hash, 0); + var sig = Uint8List(_rsa.outputBlockSize); + + try { + final len = + _rsa.processBlock(signature.bytes, 0, signature.bytes.length, sig, 0); + sig = sig.sublist(0, len); + } on ArgumentError { + // Signature was tampered with so the RSA 'decrypted' block is totally + // different to the original, causing [PKCS1Encoding._decodeBlock] to + // throw an exception because it does not recognise it. + return false; + } + + var expected = _derEncode(hash); + + if (sig.length == expected.length) { + for (var i = 0; i < sig.length; i++) { + if (sig[i] != expected[i]) { + return false; + } + } + return true; //return Arrays.constantTimeAreEqual(sig, expected); + } else if (sig.length == expected.length - 2) { + // NULL left out + var sigOffset = sig.length - hash.length - 2; + var expectedOffset = expected.length - hash.length - 2; + + expected[1] -= 2; // adjust lengths + expected[3] -= 2; + + var nonEqual = 0; + + for (var i = 0; i < hash.length; i++) { + nonEqual |= sig[sigOffset + i] ^ expected[expectedOffset + i]; + } + + for (var i = 0; i < sigOffset; i++) { + nonEqual |= sig[i] ^ expected[i]; // check header less NULL + } + + return nonEqual == 0; + } else { + return false; + } + } + + Uint8List _derEncode(Uint8List hash) { + var out = Uint8List(2 + 2 + _digestIdentifier.length + 2 + 2 + hash.length); + var i = 0; + + // header + out[i++] = 48; + out[i++] = out.length - 2; + + // algorithmIdentifier.header + out[i++] = 48; + out[i++] = _digestIdentifier.length + 2; + + // algorithmIdentifier.bytes + out.setAll(i, _digestIdentifier); + i += _digestIdentifier.length; + + // algorithmIdentifier.null + out[i++] = 5; + out[i++] = 0; + + // hash.header + out[i++] = 4; + out[i++] = hash.length; + + // hash.bytes + out.setAll(i, hash); + + return out; + } + + Uint8List _hexStringToBytes(String hex) { + var result = Uint8List(hex.length ~/ 2); + for (var i = 0; i < hex.length; i += 2) { + var num = hex.substring(i, i + 2); + var byte = int.parse(num, radix: 16); + result[i ~/ 2] = byte; + } + return result; + } +} diff --git a/pointycastle/lib/src/api/aead_block_cipher.dart b/pointycastle/lib/src/api/aead_block_cipher.dart new file mode 100644 index 0000000..d64b209 --- /dev/null +++ b/pointycastle/lib/src/api/aead_block_cipher.dart @@ -0,0 +1,26 @@ +part of '../../api.dart'; + +/// A block cipher mode that includes authenticated encryption +abstract class AEADBlockCipher extends BlockCipher { + factory AEADBlockCipher(String algorithmName) => + registry.create(algorithmName); + + /// Process [len] bytes from [inp] starting at offset [inpOff] and output the + /// result to [out] at offset [outOff]. + /// + /// Returns the number of bytes written to the output. + int processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff); + + /// Finish the operation either appending or verifying the MAC at the end of + /// the data. + /// + /// Returns the number of bytes written to the output. + int doFinal(Uint8List out, int outOff); +} + +class InvalidCipherTextException implements Exception { + final String message; + + InvalidCipherTextException(this.message); +} diff --git a/pointycastle/lib/src/api/aead_cipher.dart b/pointycastle/lib/src/api/aead_cipher.dart new file mode 100644 index 0000000..4e02413 --- /dev/null +++ b/pointycastle/lib/src/api/aead_cipher.dart @@ -0,0 +1,30 @@ +part of '../../api.dart'; + +abstract class AEADCipher extends Algorithm { + void init(bool forEncryption, CipherParameters params); + + factory AEADCipher(String algorithmName) => + registry.create(algorithmName); + + @override + String get algorithmName; + + void processAADByte(int inp); + + void processAADBytes(Uint8List inp, int inpOff, int len); + + int processByte(int inp, Uint8List out, int outOff); + + int processBytes( + Uint8List inp, int inOff, int len, Uint8List out, int outOff); + + int doFinal(Uint8List out, int outOff); + + Uint8List get mac; + + int getUpdateOutputSize(int len); + + int getOutputSize(int len); + + void reset(); +} diff --git a/pointycastle/lib/src/api/aead_parameters.dart b/pointycastle/lib/src/api/aead_parameters.dart new file mode 100644 index 0000000..270bb16 --- /dev/null +++ b/pointycastle/lib/src/api/aead_parameters.dart @@ -0,0 +1,17 @@ +part of '../../api.dart'; + +// ignore_for_file: omit_local_variable_types, prefer_single_quotes, non_constant_identifier_names, directives_ordering, prefer_typing_uninitialized_variables + +class AEADParameters + implements CipherParameters { + final UnderlyingCipherParameters parameters; + + final Uint8List associatedData; + + final Uint8List nonce; + + final int macSize; + + AEADParameters( + this.parameters, this.macSize, this.nonce, this.associatedData); +} diff --git a/pointycastle/lib/src/api/algorithm.dart b/pointycastle/lib/src/api/algorithm.dart new file mode 100644 index 0000000..19ddab8 --- /dev/null +++ b/pointycastle/lib/src/api/algorithm.dart @@ -0,0 +1,9 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// All algorithms defined by Pointy Castle inherit from this class. +abstract class Algorithm { + /// Get this algorithm's standard name. + String get algorithmName; +} diff --git a/pointycastle/lib/src/api/asymmetric_block_cipher.dart b/pointycastle/lib/src/api/asymmetric_block_cipher.dart new file mode 100644 index 0000000..cdae436 --- /dev/null +++ b/pointycastle/lib/src/api/asymmetric_block_cipher.dart @@ -0,0 +1,35 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// Asymmetric block cipher engines are expected to conform to this interface. +abstract class AsymmetricBlockCipher extends Algorithm { + /// Create the cipher specified by the standard [algorithmName]. + factory AsymmetricBlockCipher(String algorithmName) => + registry.create(algorithmName); + + /// Get this ciphers's maximum input block size. + int get inputBlockSize; + + /// Get this ciphers's maximum output block size. + int get outputBlockSize; + + /// Reset the cipher to its original state. + void reset(); + + /// Init the cipher with its initialization [params]. The type of [CipherParameters] depends on the algorithm being used (see + /// the documentation of each implementation to find out more). + /// + /// Use the argument [forEncryption] to tell the cipher if you want to encrypt or decrypt data. + void init(bool forEncryption, CipherParameters params); + + /// Process a whole block of [data] at once, returning the result in a byte array. + Uint8List process(Uint8List data); + + /// Process a block of [len] bytes given by [inp] and starting at offset [inpOff] and put the resulting cipher text in [out] + /// beginning at position [outOff]. + /// + /// This method returns the total bytes put in the output buffer. + int processBlock( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/asymmetric_key.dart b/pointycastle/lib/src/api/asymmetric_key.dart new file mode 100644 index 0000000..c3ff9bc --- /dev/null +++ b/pointycastle/lib/src/api/asymmetric_key.dart @@ -0,0 +1,6 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that asymmetric (public and private) keys conform to. +abstract class AsymmetricKey {} diff --git a/pointycastle/lib/src/api/asymmetric_key_pair.dart b/pointycastle/lib/src/api/asymmetric_key_pair.dart new file mode 100644 index 0000000..fa0ae74 --- /dev/null +++ b/pointycastle/lib/src/api/asymmetric_key_pair.dart @@ -0,0 +1,22 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// A pair of public and private asymmetric keys. +class AsymmetricKeyPair { + final B publicKey; + final V privateKey; + + AsymmetricKeyPair(this.publicKey, this.privateKey); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AsymmetricKeyPair && + runtimeType == other.runtimeType && + publicKey == other.publicKey && + privateKey == other.privateKey; + + @override + int get hashCode => publicKey.hashCode ^ privateKey.hashCode; +} diff --git a/pointycastle/lib/src/api/asymmetric_key_parameter.dart b/pointycastle/lib/src/api/asymmetric_key_parameter.dart new file mode 100644 index 0000000..9fa58d8 --- /dev/null +++ b/pointycastle/lib/src/api/asymmetric_key_parameter.dart @@ -0,0 +1,11 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// Abstract [CipherParameters] to hold an asymmetric (public or private) key +abstract class AsymmetricKeyParameter + implements CipherParameters { + final T key; + + AsymmetricKeyParameter(this.key); +} diff --git a/pointycastle/lib/src/api/block_cipher.dart b/pointycastle/lib/src/api/block_cipher.dart new file mode 100644 index 0000000..d08c22b --- /dev/null +++ b/pointycastle/lib/src/api/block_cipher.dart @@ -0,0 +1,39 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// Block cipher engines are expected to conform to this interface. +abstract class BlockCipher extends Algorithm { + /// Create the cipher specified by the standard [algorithmName]. + factory BlockCipher(String algorithmName) => + registry.create(algorithmName); + + /// Get this ciphers's block size. + int get blockSize; + + /// Reset the cipher to its original state. + void reset(); + + /// Init the cipher with its initialization [params]. The type of + /// [CipherParameters] depends on the algorithm being used (see the + /// documentation of each implementation to find out more). + /// + /// Use the argument [forEncryption] to tell the cipher if you want to encrypt + /// or decrypt data. + void init(bool forEncryption, CipherParameters? params); + + /// Process a whole block of [blockSize] bytes stored in [data] at once, returning the result in a + /// byte array. + /// + /// This call is equivalent to [processBlock] but it allocates the array under the hood. + Uint8List process(Uint8List data); + + /// Process a whole block of data given by [inp] and starting at offset + /// [inpOff]. + /// + /// The resulting cipher text is put in [out] beginning at position [outOff]. + /// + /// This method returns the total bytes processed (which is the same as the + /// block size of the algorithm). + int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/cipher_parameters.dart b/pointycastle/lib/src/api/cipher_parameters.dart new file mode 100644 index 0000000..84081b2 --- /dev/null +++ b/pointycastle/lib/src/api/cipher_parameters.dart @@ -0,0 +1,6 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// All cipher initialization parameters classes implement this. +abstract class CipherParameters {} diff --git a/pointycastle/lib/src/api/des_parameters.dart b/pointycastle/lib/src/api/des_parameters.dart new file mode 100644 index 0000000..32484f3 --- /dev/null +++ b/pointycastle/lib/src/api/des_parameters.dart @@ -0,0 +1,7 @@ +part of '../../api.dart'; + +class DESParameters extends KeyParameter { + final int DES_KEY_LENGTH = 8; + + DESParameters(super.key); +} diff --git a/pointycastle/lib/src/api/desede_parameters.dart b/pointycastle/lib/src/api/desede_parameters.dart new file mode 100644 index 0000000..086d017 --- /dev/null +++ b/pointycastle/lib/src/api/desede_parameters.dart @@ -0,0 +1,7 @@ +part of '../../api.dart'; + +class DESedeParameters extends DESParameters { + final int DES_EDE_KEY_LENGTH = 24; + + DESedeParameters(super.key); +} diff --git a/pointycastle/lib/src/api/digest.dart b/pointycastle/lib/src/api/digest.dart new file mode 100644 index 0000000..87e5212 --- /dev/null +++ b/pointycastle/lib/src/api/digest.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that a message digest conforms to. +abstract class Digest extends Algorithm { + /// Create the digest specified by the standard [algorithmName]. + factory Digest(String algorithmName) => + registry.create(algorithmName); + + /// Get this digest's output size in bytes + int get digestSize; + + /// Return the size in bytes of the internal buffer the digest applies + /// it's compression function to. + int get byteLength; + + /// Reset the digest to its original state. + void reset(); + + /// Process a whole block of [data] at once, returning the result in a new byte array. + Uint8List process(Uint8List data); + + /// Add one byte of data to the digested input. + void updateByte(int inp); + + /// Add [len] bytes of data contained in [inp], starting at position [inpOff] + /// ti the digested input. + void update(Uint8List inp, int inpOff, int len); + + /// Store the digest of previously given data in buffer [out] starting at + /// offset [outOff]. This method returns the size of the digest. + int doFinal(Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/key_derivator.dart b/pointycastle/lib/src/api/key_derivator.dart new file mode 100644 index 0000000..269bc51 --- /dev/null +++ b/pointycastle/lib/src/api/key_derivator.dart @@ -0,0 +1,25 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that a symmetric key derivator conforms to. +/// +/// A [KeyDerivator] is normally used to convert some master data (like a password, for instance) to a symmetric key. +abstract class KeyDerivator extends Algorithm { + /// Create the key derivator specified by the standard [algorithmName]. + factory KeyDerivator(String algorithmName) => + registry.create(algorithmName); + + /// Get this derivator key's output size. + int get keySize; + + /// Init the derivator with its initialization [params]. The type of [CipherParameters] depends on the algorithm being used + /// (see the documentation of each implementation to find out more). + void init(CipherParameters params); + + /// Process a whole block of [data] at once, returning the result in a byte array. + Uint8List process(Uint8List data); + + /// Derive key from given input and put it in [out] at offset [outOff]. + int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/key_generator.dart b/pointycastle/lib/src/api/key_generator.dart new file mode 100644 index 0000000..727aec0 --- /dev/null +++ b/pointycastle/lib/src/api/key_generator.dart @@ -0,0 +1,19 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that asymmetric key generators conform to. +/// +/// A [KeyGenerator] is used to create a pair of public and private keys. +abstract class KeyGenerator extends Algorithm { + /// Create the key generator specified by the standard [algorithmName]. + factory KeyGenerator(String algorithmName) => + registry.create(algorithmName); + + /// Init the generator with its initialization [params]. The type of [CipherParameters] depends on the algorithm being used + /// (see the documentation of each implementation to find out more). + void init(CipherParameters params); + + /// Generate a key pair. + AsymmetricKeyPair generateKeyPair(); +} diff --git a/pointycastle/lib/src/api/key_generator_parameters.dart b/pointycastle/lib/src/api/key_generator_parameters.dart new file mode 100644 index 0000000..cb4be12 --- /dev/null +++ b/pointycastle/lib/src/api/key_generator_parameters.dart @@ -0,0 +1,10 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// Abstract [CipherParameters] to init an asymmetric key generator. +abstract class KeyGeneratorParameters implements CipherParameters { + final int bitStrength; + + KeyGeneratorParameters(this.bitStrength); +} diff --git a/pointycastle/lib/src/api/key_parameter.dart b/pointycastle/lib/src/api/key_parameter.dart new file mode 100644 index 0000000..20835ac --- /dev/null +++ b/pointycastle/lib/src/api/key_parameter.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// [CipherParameters] consisting of just a key of arbitrary length. +class KeyParameter extends CipherParameters { + late Uint8List key; + + KeyParameter(this.key); + + KeyParameter.offset(Uint8List key, int keyOff, int keyLen) { + this.key = Uint8List(keyLen); + arrayCopy(key, keyOff, this.key, 0, keyLen); + } +} diff --git a/pointycastle/lib/src/api/mac.dart b/pointycastle/lib/src/api/mac.dart new file mode 100644 index 0000000..3d17086 --- /dev/null +++ b/pointycastle/lib/src/api/mac.dart @@ -0,0 +1,35 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that a MAC (message authentication code) conforms to. +abstract class Mac extends Algorithm { + /// Create the MAC specified by the standard [algorithmName]. + factory Mac(String algorithmName) => registry.create(algorithmName); + + /// Get this MAC's output size. + int get macSize; + + /// Reset the MAC to its original state. + void reset(); + + /// Init the MAC with its initialization [params]. The type of + /// [CipherParameters] depends on the algorithm being used (see + /// the documentation of each implementation to find out more). + void init(CipherParameters params); + + /// Process a whole block of [data] at once, returning the result in a new + /// byte array. + Uint8List process(Uint8List data); + + /// Add one byte of data to the MAC input. + void updateByte(int inp); + + /// Add [len] bytes of data contained in [inp], starting at position [inpOff] + /// to the MAC'ed input. + void update(Uint8List inp, int inpOff, int len); + + /// Store the MAC of previously given data in buffer [out] starting at + /// offset [outOff]. This method returns the size of the digest. + int doFinal(Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/padded_block_cipher.dart b/pointycastle/lib/src/api/padded_block_cipher.dart new file mode 100644 index 0000000..a33958d --- /dev/null +++ b/pointycastle/lib/src/api/padded_block_cipher.dart @@ -0,0 +1,48 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// All padded block ciphers conform to this interface. +/// +/// A padded block cipher is a wrapper around a [BlockCipher] that allows padding the last procesed +/// block (when encrypting) in the following way: +/// +/// *If it is smaller than the [blockSize] it will be padded to [blockSize] bytes. +/// *If it is equal to the [blockSize] a pad block will be added. +/// +/// When decrypting, a [PaddedBlockCipher] also removes the padding from the last cipher text block. +/// +/// It is advised to use method [process] as it is much easier than making the correct calls to +/// [processBlock] and [doFinal] which are different depending on whether you are encrypting or +/// decrypting and also depending on the data length being a multiple of the cipher's block size. +abstract class PaddedBlockCipher implements BlockCipher { + /// Create the padded block cipher specified by the standard [algorithmName]. + factory PaddedBlockCipher(String algorithmName) => + registry.create(algorithmName); + + /// Get the underlying [Padding] used by this cipher. + Padding get padding; + + /// Get the underlying [BlockCipher] used by this cipher. + BlockCipher get cipher; + + /// Process a whole block of [data] at once, returning the result in a byte array. + /// + /// This call does as many calls to [processBlock] as needed to process all the given data and a + /// final one to [doFinal] so that the padding can do its job. + @override + Uint8List process(Uint8List data); + + /// Process the last block of data given by [inp] and starting at offset [inpOff] and pad it as + /// explained in this interface's description. + /// + /// For encryption, the resulting cipher text is put in [out] beginning at position [outOff] and + /// the method returns the total bytes put in [out], including the padding. Note that, if [inp] + /// length is equal to the cipher's block size, [out] will need to be twice the cipher's block size + /// to allow place for the padding. + /// + /// For decryption, the resulting plain text is put in [out] beginning at position [outOff] and the + /// method returns the total bytes put in [out], excluding the padding. Note that the method may + /// return 0 if the last block was all padding. + int doFinal(Uint8List inp, int inpOff, Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/padded_block_cipher_parameters.dart b/pointycastle/lib/src/api/padded_block_cipher_parameters.dart new file mode 100644 index 0000000..a5cdf9f --- /dev/null +++ b/pointycastle/lib/src/api/padded_block_cipher_parameters.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// [CipherParameters] for [PaddedBlockCipher]s consisting of two underlying [CipherParameters], one for the [BlockCipher] (of +/// type [UnderlyingCipherParameters]) and the other for the [Padding] (of type [PaddingCipherParameters]). +class PaddedBlockCipherParameters< + UnderlyingCipherParameters extends CipherParameters?, + PaddingCipherParameters extends CipherParameters?> + implements CipherParameters { + final UnderlyingCipherParameters? underlyingCipherParameters; + final PaddingCipherParameters? paddingCipherParameters; + + PaddedBlockCipherParameters( + this.underlyingCipherParameters, this.paddingCipherParameters); +} diff --git a/pointycastle/lib/src/api/padding.dart b/pointycastle/lib/src/api/padding.dart new file mode 100644 index 0000000..d0a7713 --- /dev/null +++ b/pointycastle/lib/src/api/padding.dart @@ -0,0 +1,32 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that a padding conforms to. +abstract class Padding extends Algorithm { + /// Create the digest specified by the standard [algorithmName]. + factory Padding(String algorithmName) => + registry.create(algorithmName); + + /// Initialise the padder. Normally, paddings don't need any init params. + void init([CipherParameters? params]); + + /// Process a whole block of [data] at once, returning the result in a byte array. If [pad] is + /// true adds padding to the given block, otherwise, padding is removed. + /// + /// Note: this assumes that the last block of plain text is always passed to it inside [data]. The + /// reason for this is that some modes such as 'trailing bit compliment' base the padding on the + /// last byte of plain text. + Uint8List process(bool pad, Uint8List data); + + /// Add the pad bytes to the passed in block, returning the number of bytes added. + /// + /// Note: this assumes that the last block of plain text is always passed to it inside [data]. i.e. + /// if [offset] is zero, indicating the entire block is to be overwritten with padding the value of + /// [data] should be the same as the last block of plain text. The reason for this is that some + /// modes such as 'trailing bit compliment' base the padding on the last byte of plain text. + int addPadding(Uint8List data, int offset); + + /// Get the number of pad bytes present in the block. + int padCount(Uint8List data); +} diff --git a/pointycastle/lib/src/api/parameters_with_iv.dart b/pointycastle/lib/src/api/parameters_with_iv.dart new file mode 100644 index 0000000..3779edd --- /dev/null +++ b/pointycastle/lib/src/api/parameters_with_iv.dart @@ -0,0 +1,13 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// [CipherParameters] consisting of an underlying [CipherParameters] (of type [UnderlyingParameters]) and an initialization +/// vector of arbitrary length. +class ParametersWithIV + implements CipherParameters { + final Uint8List iv; + final UnderlyingParameters? parameters; + + ParametersWithIV(this.parameters, this.iv); +} diff --git a/pointycastle/lib/src/api/parameters_with_random.dart b/pointycastle/lib/src/api/parameters_with_random.dart new file mode 100644 index 0000000..79608e8 --- /dev/null +++ b/pointycastle/lib/src/api/parameters_with_random.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +//TODO consider mixin +/// [CipherParameters] consisting of an underlying [CipherParameters] (of type +/// [UnderlyingParameters]) and an acompanying [SecureRandom]. +class ParametersWithRandom + implements CipherParameters { + final UnderlyingParameters parameters; + final SecureRandom random; + + ParametersWithRandom(this.parameters, this.random); +} diff --git a/pointycastle/lib/src/api/parameters_with_salt.dart b/pointycastle/lib/src/api/parameters_with_salt.dart new file mode 100644 index 0000000..994e3b1 --- /dev/null +++ b/pointycastle/lib/src/api/parameters_with_salt.dart @@ -0,0 +1,13 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// [CipherParameters] consisting of an underlying [CipherParameters] (of type +/// [UnderlyingParameters]) and an acompanying salt of type [Uint8List]. +class ParametersWithSalt + implements CipherParameters { + final UnderlyingParameters parameters; + final Uint8List salt; + + ParametersWithSalt(this.parameters, this.salt); +} diff --git a/pointycastle/lib/src/api/parameters_with_salt_configuration.dart b/pointycastle/lib/src/api/parameters_with_salt_configuration.dart new file mode 100644 index 0000000..acc4550 --- /dev/null +++ b/pointycastle/lib/src/api/parameters_with_salt_configuration.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// [CipherParameters] consisting of an underlying [CipherParameters] (of type +/// [UnderlyingParameters]), an acompanying [SecureRandom], and salt length. +class ParametersWithSaltConfiguration< + UnderlyingParameters extends CipherParameters> implements CipherParameters { + final UnderlyingParameters parameters; + final SecureRandom random; + final int saltLength; + + ParametersWithSaltConfiguration( + this.parameters, this.random, this.saltLength); +} diff --git a/pointycastle/lib/src/api/pbe_parameters_generator.dart b/pointycastle/lib/src/api/pbe_parameters_generator.dart new file mode 100644 index 0000000..4a97c69 --- /dev/null +++ b/pointycastle/lib/src/api/pbe_parameters_generator.dart @@ -0,0 +1,23 @@ +part of '../../api.dart'; + +abstract class PBEParametersGenerator { + factory PBEParametersGenerator(String algorithmName) => + registry.create(algorithmName); + + void init(Uint8List password, Uint8List salt, int iterationCount); + + /// + /// Generates a derived key with the given [keySize] in bytes. + /// + KeyParameter generateDerivedParameters(int keySize); + + /// + /// Generates a derived key with the given [keySize] in bytes and a derived IV with the given [ivSize]. + /// + ParametersWithIV generateDerivedParametersWithIV(int keySize, int ivSize); + + /// + /// Generates a derived key with the given [keySize] in bytes used for mac generating. + /// + KeyParameter generateDerivedMacParameters(int keySize); +} diff --git a/pointycastle/lib/src/api/private_key.dart b/pointycastle/lib/src/api/private_key.dart new file mode 100644 index 0000000..a8f2a3b --- /dev/null +++ b/pointycastle/lib/src/api/private_key.dart @@ -0,0 +1,6 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that asymmetric private keys conform to. +abstract class PrivateKey implements AsymmetricKey {} diff --git a/pointycastle/lib/src/api/private_key_parameter.dart b/pointycastle/lib/src/api/private_key_parameter.dart new file mode 100644 index 0000000..8ee7bb7 --- /dev/null +++ b/pointycastle/lib/src/api/private_key_parameter.dart @@ -0,0 +1,9 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// A [CipherParameters] to hold an asymmetric private key +class PrivateKeyParameter + extends AsymmetricKeyParameter { + PrivateKeyParameter(PrivateKey key) : super(key as T); +} diff --git a/pointycastle/lib/src/api/public_key.dart b/pointycastle/lib/src/api/public_key.dart new file mode 100644 index 0000000..5ab25d7 --- /dev/null +++ b/pointycastle/lib/src/api/public_key.dart @@ -0,0 +1,6 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface that asymmetric public keys conform to. +abstract class PublicKey implements AsymmetricKey {} diff --git a/pointycastle/lib/src/api/public_key_parameter.dart b/pointycastle/lib/src/api/public_key_parameter.dart new file mode 100644 index 0000000..a93ef83 --- /dev/null +++ b/pointycastle/lib/src/api/public_key_parameter.dart @@ -0,0 +1,9 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// A [CipherParameters] to hold an asymmetric public key +class PublicKeyParameter + extends AsymmetricKeyParameter { + PublicKeyParameter(PublicKey key) : super(key as T); +} diff --git a/pointycastle/lib/src/api/rc2_parameters.dart b/pointycastle/lib/src/api/rc2_parameters.dart new file mode 100644 index 0000000..14a742d --- /dev/null +++ b/pointycastle/lib/src/api/rc2_parameters.dart @@ -0,0 +1,13 @@ +part of '../../api.dart'; + +class RC2Parameters extends KeyParameter { + late int effectiveKeyBits; + + RC2Parameters(Uint8List key, {int? bits}) : super(key) { + if (bits != null) { + effectiveKeyBits = bits; + } else { + effectiveKeyBits = (key.length > 128) ? 1024 : (key.length * 8); + } + } +} diff --git a/pointycastle/lib/src/api/registry_factory_exception.dart b/pointycastle/lib/src/api/registry_factory_exception.dart new file mode 100644 index 0000000..bacb5b6 --- /dev/null +++ b/pointycastle/lib/src/api/registry_factory_exception.dart @@ -0,0 +1,24 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// This kind of exception is thrown when a user tries to create an algorithm +/// or domain parameters that were not correctly registered. This can be +/// because the corresponding class was not imported, or because the algorithm +/// does not exist. +class RegistryFactoryException implements Exception { + final String message; + + RegistryFactoryException(this.message); + + RegistryFactoryException.unknown(String algorithm, [Type? type]) + : this( + 'No algorithm registered${type != null ? ' of type $type' : ''} with name: $algorithm'); + + RegistryFactoryException.invalid(String algorithm, [Type? type]) + : this( + 'Algorithm name $algorithm is invalid${type != null ? ' of type $type' : ''}'); + + @override + String toString() => 'RegistryFactoryException: $message'; +} diff --git a/pointycastle/lib/src/api/secure_random.dart b/pointycastle/lib/src/api/secure_random.dart new file mode 100644 index 0000000..649086c --- /dev/null +++ b/pointycastle/lib/src/api/secure_random.dart @@ -0,0 +1,34 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// A synchronous secure random number generator (RNG). +/// +/// Being synchronous, this RNG cannot return direct results from sources of randomness like +/// '/dev/random' or similar. For that, use an **EntropySource** which allows to be called +/// asynchronously. Usually an **EntropySource** should be seen like a random generation device while +/// a [SecureRandom] should be seen like a cryptographic PRNG. Thus, data from an **EntropySource** +/// should be seen as 'more random' than that returned from a [SecureRandom]. +abstract class SecureRandom extends Algorithm { + /// Create the secure random specified by the standard [algorithmName]. + factory SecureRandom([String algorithmName = '']) => + registry.create(algorithmName); + + /// Seed the RNG with some entropy (look at package cipher_entropy providing entropy sources). + void seed(CipherParameters params); + + /// Get one byte long random int. + int nextUint8(); + + /// Get two bytes long random int. + int nextUint16(); + + /// Get four bytes long random int. + int nextUint32(); + + /// Get a random BigInteger of [bitLength] bits. + BigInt nextBigInteger(int bitLength); + + /// Get a list of bytes of arbitrary length. + Uint8List nextBytes(int count); +} diff --git a/pointycastle/lib/src/api/signature.dart b/pointycastle/lib/src/api/signature.dart new file mode 100644 index 0000000..19527cc --- /dev/null +++ b/pointycastle/lib/src/api/signature.dart @@ -0,0 +1,6 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// An interface for signatures created by a [Signer] +abstract class Signature {} diff --git a/pointycastle/lib/src/api/signer.dart b/pointycastle/lib/src/api/signer.dart new file mode 100644 index 0000000..a07088b --- /dev/null +++ b/pointycastle/lib/src/api/signer.dart @@ -0,0 +1,25 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// An interface for DSAs (digital signature algorithms) +abstract class Signer extends Algorithm { + /// Create the signer specified by the standard [algorithmName]. + factory Signer(String algorithmName) => + registry.create(algorithmName); + + /// Reset the signer to its original state. + void reset(); + + /// Init the signer with its initialization [params]. The type of [CipherParameters] depends on the algorithm being used (see + /// the documentation of each implementation to find out more). + /// + /// Use the argument [forSigning] to tell the signer if you want to generate or verify signatures. + void init(bool forSigning, CipherParameters params); + + /// Sign the passed in [message] (usually the output of a hash function) + Signature generateSignature(Uint8List message); + + /// Verify the [message] against the [signature]. + bool verifySignature(Uint8List message, Signature signature); +} diff --git a/pointycastle/lib/src/api/srp_client.dart b/pointycastle/lib/src/api/srp_client.dart new file mode 100644 index 0000000..d9a11cc --- /dev/null +++ b/pointycastle/lib/src/api/srp_client.dart @@ -0,0 +1,35 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +abstract class SRPClient { + ///Computes the client evidence message M1 using the previously received values. + ///To be called after calculating the secret S. + ///returns M1: the client side generated evidence message + ///throws Exception + BigInt? calculateClientEvidenceMessage(); + + ///Generates the secret S given the server's credentials + ///@param serverB The server's credentials + ///@return Client's verification message for the server + ///@throws Exception If server's credentials are invalid + /// + BigInt? calculateSecret(BigInt serverB); + + /// Computes the final session key as a result of the SRP successful mutual authentication + /// To be called after verifying the server evidence message M2. + /// returns Key: the mutually authenticated symmetric session key + /// throws Exception + BigInt? calculateSessionKey(); + + /// Generates the client's credentials that are to be sent to the server. + /// @return The client's public value + BigInt? generateClientCredentials( + Uint8List salt, Uint8List identity, Uint8List password); + + /// Authenticates the server evidence message M2 received and saves it only if correct. + /// [serverM2] the server side generated evidence message + /// return A boolean indicating if the server message M2 was the expected one. + /// throws Exception + bool verifyServerEvidenceMessage(BigInt serverM2); +} diff --git a/pointycastle/lib/src/api/srp_server.dart b/pointycastle/lib/src/api/srp_server.dart new file mode 100644 index 0000000..3dc5e74 --- /dev/null +++ b/pointycastle/lib/src/api/srp_server.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// Implements the server side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe. +/// This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper +/// "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002" +abstract class SRPServer { + /// Processes the client's credentials. If valid the shared secret is generated and returned. + /// @param clientA The client's credentials + /// @return A shared secret BigInt + /// @throws CryptoException If client's credentials are invalid + BigInt? calculateSecret(BigInt clientA); + + /// Computes the final session key as a result of the SRP successful mutual authentication + /// To be called after calculating the server evidence message M2. + /// @return Key: the mutual authenticated symmetric session key + /// @throws CryptoException + BigInt? calculateSessionKey(); + + /// Generates the server's credentials that are to be sent to the client. + /// @return The server's public value + BigInt? generateServerCredentials(); + + /// Computes the server evidence message M2 using the previously verified values. + /// To be called after successfully verifying the client evidence message M1. + /// @return M2: the server side generated evidence message + /// @throws CryptoException + BigInt? calculateServerEvidenceMessage(); + + /// Authenticates the received client evidence message M1 and saves it only if correct. + /// To be called after calculating the secret S. + /// @param clientM1 the client side generated evidence message + /// @return A boolean indicating if the client message M1 was the expected one. + /// @throws CryptoException + bool verifyClientEvidenceMessage(BigInt clientM1); +} diff --git a/pointycastle/lib/src/api/stream_cipher.dart b/pointycastle/lib/src/api/stream_cipher.dart new file mode 100644 index 0000000..34e52f3 --- /dev/null +++ b/pointycastle/lib/src/api/stream_cipher.dart @@ -0,0 +1,32 @@ +// See file LICENSE for more information. + +part of '../../api.dart'; + +/// The interface stream ciphers conform to. +abstract class StreamCipher extends Algorithm { + /// Create the cipher specified by the standard [algorithmName]. + factory StreamCipher(String algorithmName) => + registry.create(algorithmName); + + /// Reset the cipher to its original state. + void reset(); + + /// Init the cipher with its initialization [params]. The type of + /// [CipherParameters] depends on the algorithm being used (see the + /// documentation of each implementation to find out more). + /// + /// Use the argument [forEncryption] to tell the cipher if you want to encrypt + /// or decrypt data. + void init(bool forEncryption, CipherParameters? params); + + /// Process a whole block of [data] at once, returning the result in a byte array. + Uint8List process(Uint8List data); + + /// Process one byte of data given by [inp] and return its encrypted value. + int returnByte(int inp); + + /// Process [len] bytes of data given by [inp] and starting at offset [inpOff]. + /// The resulting cipher text is put in [out] beginning at position [outOff]. + void processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff); +} diff --git a/pointycastle/lib/src/api/xof.dart b/pointycastle/lib/src/api/xof.dart new file mode 100644 index 0000000..64dd575 --- /dev/null +++ b/pointycastle/lib/src/api/xof.dart @@ -0,0 +1,11 @@ +part of '../../api.dart'; + +abstract class Xof extends Digest { + /// Create the Xof specified by the standard [algorithmName]. + factory Xof(String algorithmName) => registry.create(algorithmName); + + /// + int doFinalRange(Uint8List out, int outOff, int outLen); + + int doOutput(Uint8List out, int outOff, int outLen); +} diff --git a/pointycastle/lib/src/ct.dart b/pointycastle/lib/src/ct.dart new file mode 100644 index 0000000..bdf965b --- /dev/null +++ b/pointycastle/lib/src/ct.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +/// +/// Constant time XOR, use to replace if (condition) { xor(x,y);} +/// CT_xor, x <- x ^ y when b is true +/// asserts x length and y length are equal +/// +void CT_xor(Uint8List x, Uint8List y, bool b) { + assert(x.length == y.length, 'x length and y length must be same'); + var mask = b ? 0xFF : 0; // (-b) & 0xFF; + for (var i = 0; i < x.length; i++) { + x[i] = x[i] ^ (y[i] & mask); + } +} diff --git a/pointycastle/lib/src/ec_standard_curve_constructor.dart b/pointycastle/lib/src/ec_standard_curve_constructor.dart new file mode 100644 index 0000000..d18dacf --- /dev/null +++ b/pointycastle/lib/src/ec_standard_curve_constructor.dart @@ -0,0 +1,20 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/ecc/ecc_base.dart'; +import 'package:pointycastle/ecc/ecc_fp.dart' as fp; +import 'package:pointycastle/src/utils.dart' as utils; + +ECDomainParametersImpl constructFpStandardCurve( + String name, Function constructor, + {BigInt? q, + BigInt? a, + BigInt? b, + BigInt? g, + BigInt? n, + BigInt? h, + BigInt? seed}) { + var curve = fp.ECCurve(q, a, b); + var seedBytes = (seed == null) ? null : utils.encodeBigInt(seed); + return constructor( + name, curve, curve.decodePoint(utils.encodeBigInt(g)), n, h, seedBytes); +} diff --git a/pointycastle/lib/src/impl/base_aead_block_cipher.dart b/pointycastle/lib/src/impl/base_aead_block_cipher.dart new file mode 100644 index 0000000..bd022a1 --- /dev/null +++ b/pointycastle/lib/src/impl/base_aead_block_cipher.dart @@ -0,0 +1,223 @@ +import 'dart:math' show min; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/utils.dart'; + +abstract class BaseAEADBlockCipher implements AEADBlockCipher { + final BlockCipher _underlyingCipher; + + BaseAEADBlockCipher(this._underlyingCipher); + + // These fields are set by init and not modified by processing + late bool _forEncryption; + late int _macSize; + Uint8List? _lastKey; + late Uint8List _nonce; + late Uint8List _initialAssociatedText; + + // These fields are modified during processing + Uint8List? _bufBlock; + int? _bufOff; + Uint8List? _lastMacSizeBytes; + late int _lastMacSizeBytesOff; + + @override + int get blockSize => underlyingCipher.blockSize; + + /// The underlying cipher + BlockCipher get underlyingCipher => _underlyingCipher; + + /// True if initialized for encryption + bool get forEncryption => _forEncryption; + + /// The nonce or iv as set by the initialization + Uint8List get nonce => _nonce; + + /// The additional authenticated data as set by the initialization + Uint8List? get aad => _initialAssociatedText; + + /// Any remaining input yet to be processed + Uint8List get remainingInput => + Uint8List.view(_bufBlock!.buffer, _bufBlock!.offsetInBytes, _bufOff); + + /// The length in bytes of the authentication tag + int get macSize => _macSize; + + /// The value of the authentication tag associated with the last processed + /// data + Uint8List get mac; + + /// Prepare for a stream of data. This method is called during + /// initialization and reset. + void prepare(KeyParameter keyParam); + + /// Processes the additional authentication data + void processAADBytes(Uint8List inp, int inpOff, int len); + + /// When decrypting, validates the generated authentication tag with the one + /// in the input stream. When not equal throws [InvalidCipherTextException]. + /// This method should be called from the [doFinal] method. + void validateMac() { + if (forEncryption) { + return; + } + if (_lastMacSizeBytesOff != macSize) { + throw InvalidCipherTextException('Input data too short'); + } + if (!constantTimeAreEqual(mac, _lastMacSizeBytes!)) { + throw InvalidCipherTextException('Authentication tag check failed'); + } + } + + @override + void init(bool forEncryption, CipherParameters? params) { + _forEncryption = forEncryption; + + KeyParameter keyParam; + Uint8List? newNonce; + + if (params is AEADParameters) { + var param = params; + + newNonce = param.nonce; + _initialAssociatedText = param.associatedData; + + var macSizeBits = param.macSize; + if (macSizeBits < 32 || macSizeBits > 256 || macSizeBits % 8 != 0) { + throw ArgumentError('Invalid value for MAC size: $macSizeBits'); + } + + _macSize = macSizeBits ~/ 8; + keyParam = param.parameters as KeyParameter; + } else if (params is ParametersWithIV) { + var param = params; + + newNonce = param.iv; + _initialAssociatedText = Uint8List(0); + _macSize = 16; + keyParam = param.parameters as KeyParameter; + } else { + throw ArgumentError('invalid parameters passed to AEADBlockCipher'); + } + + var bufLength = forEncryption ? blockSize : (blockSize + _macSize); + _bufBlock = Uint8List(bufLength); + + if (newNonce.isEmpty) { + throw ArgumentError('IV must be at least 1 byte'); + } + + _nonce = newNonce; + _lastKey = keyParam.key; + _lastMacSizeBytes = Uint8List(macSize); + + reset(); + } + + @override + Uint8List process(Uint8List data) { + var out = Uint8List(getOutputSize(data.length)); + + var len = processBytes(data, 0, data.length, out, 0); + + len += doFinal(out, len); + + return Uint8List.view(out.buffer, 0, len); + } + + @override + int processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (len == 0) return 0; + + if (forEncryption) { + // all bytes are plain text bytes + return _processCipherBytes(inp, inpOff, len, out, outOff); + } + + // last macSize bytes are possibly mac bytes and not cipher text bytes + // -> keep them in buffer + var cipherLen = _lastMacSizeBytesOff + len - macSize; + + var resultLen = 0; + + if (cipherLen > 0 && _lastMacSizeBytesOff > 0) { + // at least part of the buffer are actually cipher text bytes + // process them and update the buffer + + var l = min(_lastMacSizeBytesOff, cipherLen); + resultLen += _processCipherBytes(_lastMacSizeBytes!, 0, + min(_lastMacSizeBytesOff, cipherLen), out, outOff); + outOff += resultLen; + cipherLen -= l; + _lastMacSizeBytes!.setRange(0, macSize - l, _lastMacSizeBytes!.skip(l)); + _lastMacSizeBytesOff -= l; + } + + if (cipherLen > 0) { + // part of the input are cipher text bytes + resultLen += _processCipherBytes(inp, inpOff, cipherLen, out, outOff); + } + + _lastMacSizeBytes!.setRange(_lastMacSizeBytesOff, + _lastMacSizeBytesOff + len - cipherLen, inp.skip(inpOff + cipherLen)); + _lastMacSizeBytesOff += len - cipherLen; + + return resultLen; + } + + int _processCipherBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (len == 0) return 0; + + var resultLen = 0; + + if (_bufOff != 0) { + // add to buffer until full + var end = blockSize < _bufOff! + len ? blockSize : _bufOff! + len; + _bufBlock!.setRange(_bufOff!, end, inp.skip(inpOff)); + len -= end - _bufOff!; + _bufOff = end; + + // if buffer full and has more data -> process buffer + if (_bufOff == blockSize && len > 0) { + processBlock(_bufBlock!, 0, out, outOff); + _bufOff = 0; + resultLen += blockSize; + } + } + + // process all full blocks + while (len > blockSize) { + processBlock(inp, inpOff, out, outOff + resultLen); + inpOff += blockSize; + len -= blockSize; + resultLen += blockSize; + } + + // keep last block in buffer + if (len > 0) { + _bufBlock!.setRange(0, len, inp.skip(inpOff)); + _bufOff = len; + } + + return resultLen; + } + + @override + void reset() { + _bufOff = 0; + _lastMacSizeBytesOff = 0; + + if (_lastKey == null) return; + + prepare(KeyParameter(_lastKey!)); + processAADBytes(_initialAssociatedText, 0, _initialAssociatedText.length); + } + + int getOutputSize(int length) => + (length + (forEncryption ? macSize : -macSize) + blockSize - 1) ~/ + blockSize * + blockSize; +} diff --git a/pointycastle/lib/src/impl/base_aead_cipher.dart b/pointycastle/lib/src/impl/base_aead_cipher.dart new file mode 100644 index 0000000..a7477fb --- /dev/null +++ b/pointycastle/lib/src/impl/base_aead_cipher.dart @@ -0,0 +1,11 @@ +import 'dart:typed_data'; + +import '../../api.dart'; + +abstract class BaseAEADCipher implements AEADCipher { + Uint8List process(Uint8List data) { + var out = Uint8List(data.length); + processBytes(data, 0, data.length, out, 0); + return out; + } +} diff --git a/pointycastle/lib/src/impl/base_asymmetric_block_cipher.dart b/pointycastle/lib/src/impl/base_asymmetric_block_cipher.dart new file mode 100644 index 0000000..46ebe98 --- /dev/null +++ b/pointycastle/lib/src/impl/base_asymmetric_block_cipher.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [AsymmetricBlockCipher] which provides shared methods. +abstract class BaseAsymmetricBlockCipher implements AsymmetricBlockCipher { + @override + Uint8List process(Uint8List data) { + var out = Uint8List(outputBlockSize); + var len = processBlock(data, 0, data.length, out, 0); + return out.sublist(0, len); + } +} diff --git a/pointycastle/lib/src/impl/base_block_cipher.dart b/pointycastle/lib/src/impl/base_block_cipher.dart new file mode 100644 index 0000000..bcf5075 --- /dev/null +++ b/pointycastle/lib/src/impl/base_block_cipher.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [BlockCipher] which provides shared methods. +abstract class BaseBlockCipher implements BlockCipher { + @override + Uint8List process(Uint8List data) { + var out = Uint8List(blockSize); + var len = processBlock(data, 0, out, 0); + return out.sublist(0, len); + } +} diff --git a/pointycastle/lib/src/impl/base_digest.dart b/pointycastle/lib/src/impl/base_digest.dart new file mode 100644 index 0000000..d332fc5 --- /dev/null +++ b/pointycastle/lib/src/impl/base_digest.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [Digest] which provides shared methods. +abstract class BaseDigest implements Digest { + @override + Uint8List process(Uint8List data) { + update(data, 0, data.length); + var out = Uint8List(digestSize); + var len = doFinal(out, 0); + return out.sublist(0, len); + } +} diff --git a/pointycastle/lib/src/impl/base_key_derivator.dart b/pointycastle/lib/src/impl/base_key_derivator.dart new file mode 100644 index 0000000..45a4f67 --- /dev/null +++ b/pointycastle/lib/src/impl/base_key_derivator.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [KeyDerivator] which provides shared methods. +abstract class BaseKeyDerivator implements KeyDerivator { + @override + Uint8List process(Uint8List data) { + var out = Uint8List(keySize); + var len = deriveKey(data, 0, out, 0); + return out.sublist(0, len); + } +} diff --git a/pointycastle/lib/src/impl/base_mac.dart b/pointycastle/lib/src/impl/base_mac.dart new file mode 100644 index 0000000..48f39d3 --- /dev/null +++ b/pointycastle/lib/src/impl/base_mac.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [Mac] which provides shared methods. +abstract class BaseMac implements Mac { + @override + Uint8List process(Uint8List data) { + update(data, 0, data.length); + var out = Uint8List(macSize); + var len = doFinal(out, 0); + return out.sublist(0, len); + } +} diff --git a/pointycastle/lib/src/impl/base_padding.dart b/pointycastle/lib/src/impl/base_padding.dart new file mode 100644 index 0000000..33c95fb --- /dev/null +++ b/pointycastle/lib/src/impl/base_padding.dart @@ -0,0 +1,19 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [Padding] which provides shared methods. +abstract class BasePadding implements Padding { + @override + Uint8List process(bool pad, Uint8List data) { + if (pad) { + throw StateError( + 'cannot add padding, use PaddedBlockCipher to add padding'); + } else { + var len = padCount(data); + return data.sublist(0, data.length - len); + } + } +} diff --git a/pointycastle/lib/src/impl/base_stream_cipher.dart b/pointycastle/lib/src/impl/base_stream_cipher.dart new file mode 100644 index 0000000..99d5540 --- /dev/null +++ b/pointycastle/lib/src/impl/base_stream_cipher.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; + +/// Base implementation of [StreamCipher] which provides shared methods. +abstract class BaseStreamCipher implements StreamCipher { + @override + Uint8List process(Uint8List data) { + var out = Uint8List(data.length); + processBytes(data, 0, data.length, out, 0); + return out; + } +} diff --git a/pointycastle/lib/src/impl/entropy.dart b/pointycastle/lib/src/impl/entropy.dart new file mode 100644 index 0000000..8956a3e --- /dev/null +++ b/pointycastle/lib/src/impl/entropy.dart @@ -0,0 +1,7 @@ +import 'dart:typed_data'; + +/// Defines an entropy source, this is not to be confused with a rng. +/// Entropy sources are used to supply seed material. +abstract class EntropySource { + Uint8List getBytes(int len); +} diff --git a/pointycastle/lib/src/impl/keccak_engine.dart b/pointycastle/lib/src/impl/keccak_engine.dart new file mode 100644 index 0000000..9f6a9a6 --- /dev/null +++ b/pointycastle/lib/src/impl/keccak_engine.dart @@ -0,0 +1,396 @@ +// See file LICENSE for more information. + +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/impl/base_digest.dart'; + +import '../ufixnum.dart'; + +// KeccakEngine +abstract class KeccakEngine extends BaseDigest { + static final _keccakRoundConstants = Register64List.from([ + [0x00000000, 0x00000001], + [0x00000000, 0x00008082], + [0x80000000, 0x0000808a], + [0x80000000, 0x80008000], + [0x00000000, 0x0000808b], + [0x00000000, 0x80000001], + [0x80000000, 0x80008081], + [0x80000000, 0x00008009], + [0x00000000, 0x0000008a], + [0x00000000, 0x00000088], + [0x00000000, 0x80008009], + [0x00000000, 0x8000000a], + [0x00000000, 0x8000808b], + [0x80000000, 0x0000008b], + [0x80000000, 0x00008089], + [0x80000000, 0x00008003], + [0x80000000, 0x00008002], + [0x80000000, 0x00000080], + [0x00000000, 0x0000800a], + [0x80000000, 0x8000000a], + [0x80000000, 0x80008081], + [0x80000000, 0x00008080], + [0x00000000, 0x80000001], + [0x80000000, 0x80008008] + ]); + + static final _keccakRhoOffsets = [ + 0x00000000, + 0x00000001, + 0x0000003e, + 0x0000001c, + 0x0000001b, + 0x00000024, + 0x0000002c, + 0x00000006, + 0x00000037, + 0x00000014, + 0x00000003, + 0x0000000a, + 0x0000002b, + 0x00000019, + 0x00000027, + 0x00000029, + 0x0000002d, + 0x0000000f, + 0x00000015, + 0x00000008, + 0x00000012, + 0x00000002, + 0x0000003d, + 0x00000038, + 0x0000000e + ]; + + final _state = Uint8List(200); + final _dataQueue = Uint8List(192); + + late int _rate; + late int fixedOutputLength; + late int _bitsInQueue; + late bool _squeezing; + + /// dataQueue intended for use by subclasses only. + Uint8List get dataQueue => _dataQueue; + + /// squeezing intended for use by subclasses only. + bool get squeezing => _squeezing; + + @override + int get byteLength => _rate ~/ 8; + + @override + int get digestSize => fixedOutputLength ~/ 8; + + int get rate => _rate; + + @override + void reset() { + init(fixedOutputLength); + } + + @override + void updateByte(int inp) { + absorb(inp); + } + + @override + void update(Uint8List inp, int inpOff, int len) { + _doUpdate(inp, inpOff, len); + } + + void absorb(int data) { + if ((_bitsInQueue % 8) != 0) { + throw StateError('attempt to absorb with odd length queue'); + } + if (_squeezing) { + throw StateError('attempt to absorb while squeezing'); + } + + _dataQueue[_bitsInQueue >> 3] = data; + if ((_bitsInQueue += 8) == _rate) { + _keccakAbsorb(_dataQueue, 0); + _bitsInQueue = 0; + } + } + + void absorbBits(int data, int bits) { + if (bits < 1 || bits > 7) { + throw StateError('"bits" must be in the range 1 to 7'); + } + if ((_bitsInQueue % 8) != 0) { + throw StateError('attempt to absorb with odd length queue'); + } + if (_squeezing) { + throw StateError('attempt to absorb while squeezing'); + } + var mask = (1 << bits) - 1; + _dataQueue[_bitsInQueue >> 3] = data & mask; + _bitsInQueue += bits; + } + + void absorbRange(Uint8List data, int off, int len) { + if ((_bitsInQueue % 8) != 0) { + throw StateError('attempt to absorb with odd length queue'); + } + if (squeezing) { + throw StateError('attempt to absorb while squeezing'); + } + + var bytesInQueue = _bitsInQueue >> 3; + var rateBytes = _rate >> 3; + + var available = rateBytes - bytesInQueue; + if (len < available) { + _dataQueue.setRange(bytesInQueue, bytesInQueue + len, data, off); + _bitsInQueue += len << 3; + return; + } + + var count = 0; + if (bytesInQueue > 0) { + _dataQueue.setRange( + bytesInQueue, bytesInQueue + available, data.sublist(off)); + count += available; + _keccakAbsorb(_dataQueue, 0); + } + + int remaining; + while ((remaining = len - count) >= rateBytes) { + _keccakAbsorb(data, off + count); + count += rateBytes; + } + + _dataQueue.setRange(0, remaining, data, off + count); + _bitsInQueue = remaining << 3; + } + + void _doUpdate(Uint8List data, int off, int len) { + absorbRange(data, off, len); + } + + void init(int bitlen) { + _initSponge(1600 - (bitlen << 1)); + } + + void _initSponge(int theRate) { + if ((theRate <= 0) || (theRate >= 1600) || ((theRate % 64) != 0)) { + throw StateError('invalid rate value'); + } + + _rate = theRate; + _state.fillRange(0, _state.length, 0); + _dataQueue.fillRange(0, _dataQueue.length, 0); + _bitsInQueue = 0; + _squeezing = false; + fixedOutputLength = (1600 - theRate) ~/ 2; + } + + void _keccakAbsorb(Uint8List? data, int off) { + var count = _rate >> 3; + for (var i = 0; i < count; ++i) { + _state[i] ^= data![off + i]; + } + _keccakPermutation(); + } + + void _keccakExtract() { + _keccakPermutation(); + + _dataQueue.setRange(0, _rate >> 3, _state); + _bitsInQueue = _rate; + } + + void squeeze(Uint8List? output, int? offset, int outputLength) { + if (!squeezing) { + _padAndSwitchToSqueezingPhase(); + } + + if ((outputLength % 8) != 0) { + throw StateError('outputLength not a multiple of 8'); + } + + var i = 0; + while (i < outputLength) { + if (_bitsInQueue == 0) { + _keccakExtract(); + } + + var partialBlock = min(_bitsInQueue, outputLength - i); + + output!.setRange( + offset! + (i ~/ 8), + offset + (i ~/ 8) + (partialBlock ~/ 8), + dataQueue.sublist((_rate - _bitsInQueue) ~/ 8)); + + //System.arraycopy(dataQueue, (rate - bitsInQueue) / 8, output, offset + (int)(i / 8), partialBlock / 8); + _bitsInQueue -= partialBlock; + i += partialBlock; + } + } + + void _padAndSwitchToSqueezingPhase() { + _dataQueue[_bitsInQueue >> 3] |= 1 << (_bitsInQueue & 7); + if (++_bitsInQueue == _rate) { + _keccakAbsorb(_dataQueue, 0); + } else { + var full = _bitsInQueue >> 6, partial = _bitsInQueue & 63; + for (var i = 0; i < full * 8; ++i) { + _state[i] ^= _dataQueue[i]; + } + + if (partial > 0) { + for (var k = 0; k != 8; k++) { + if (partial >= 8) { + _state[full * 8 + k] ^= dataQueue[full * 8 + k]; + } else { + _state[full * 8 + k] ^= + dataQueue[full * 8 + k] & ((1 << partial) - 1); + } + partial -= 8; + if (partial < 0) { + partial = 0; + } + } + } + } + + _state[((_rate - 1) >> 3)] ^= 1 << 7; + _bitsInQueue = 0; + _squeezing = true; + } + + void _fromBytesToWords(Register64List stateAsWords, Uint8List state) { + final r = Register64(); + + for (var i = 0; i < (1600 ~/ 64); i++) { + final index = i * (64 ~/ 8); + + stateAsWords[i].set(0); + + for (var j = 0; j < (64 ~/ 8); j++) { + r.set(state[index + j]); + r.shiftl(8 * j); + stateAsWords[i].or(r); + } + } + } + + void _fromWordsToBytes(Uint8List state, Register64List stateAsWords) { + final r = Register64(); + + for (var i = 0; i < (1600 ~/ 64); i++) { + final index = i * (64 ~/ 8); + + for (var j = 0; j < (64 ~/ 8); j++) { + r.set(stateAsWords[i]); + r.shiftr(8 * j); + state[index + j] = r.lo32; + } + } + } + + void _keccakPermutation() { + final longState = Register64List(_state.length ~/ 8); + + _fromBytesToWords(longState, _state); + _keccakPermutationOnWords(longState); + _fromWordsToBytes(_state, longState); + } + + void _keccakPermutationOnWords(Register64List state) { + for (var i = 0; i < 24; i++) { + theta(state); + rho(state); + pi(state); + chi(state); + _iota(state, i); + } + } + + void theta(Register64List A) { + final C = Register64List(5); + final r0 = Register64(); + final r1 = Register64(); + + for (var x = 0; x < 5; x++) { + C[x].set(0); + + for (var y = 0; y < 5; y++) { + C[x].xor(A[x + 5 * y]); + } + } + + for (var x = 0; x < 5; x++) { + r0.set(C[(x + 1) % 5]); + r0.shiftl(1); + + r1.set(C[(x + 1) % 5]); + r1.shiftr(63); + + r0.xor(r1); + r0.xor(C[(x + 4) % 5]); + + for (var y = 0; y < 5; y++) { + A[x + 5 * y].xor(r0); + } + } + } + + void rho(Register64List A) { + final r = Register64(); + + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + final index = x + 5 * y; + + if (_keccakRhoOffsets[index] != 0) { + r.set(A[index]); + r.shiftr(64 - _keccakRhoOffsets[index]); + + A[index].shiftl(_keccakRhoOffsets[index]); + A[index].xor(r); + } + } + } + } + + void pi(Register64List A) { + final tempA = Register64List(25); + + tempA.setRange(0, tempA.length, A); + + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + A[y + 5 * ((2 * x + 3 * y) % 5)].set(tempA[x + 5 * y]); + } + } + } + + void chi(Register64List A) { + final chiC = Register64List(5); + + for (var y = 0; y < 5; y++) { + for (var x = 0; x < 5; x++) { + chiC[x].set(A[((x + 1) % 5) + (5 * y)]); + chiC[x].not(); + chiC[x].and(A[((x + 2) % 5) + (5 * y)]); + chiC[x].xor(A[x + 5 * y]); + } + for (var x = 0; x < 5; x++) { + A[x + 5 * y].set(chiC[x]); + } + } + } + + void _iota(Register64List A, int indexRound) { + A[(((0) % 5) + 5 * ((0) % 5))].xor(_keccakRoundConstants[indexRound]); + } + + @override + int doFinal(Uint8List out, int outOff) { + throw UnimplementedError('Subclasses must implement this.'); + } +} diff --git a/pointycastle/lib/src/impl/long_sha2_family_digest.dart b/pointycastle/lib/src/impl/long_sha2_family_digest.dart new file mode 100644 index 0000000..4445104 --- /dev/null +++ b/pointycastle/lib/src/impl/long_sha2_family_digest.dart @@ -0,0 +1,443 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Base implementation of SHA-2 family algorithms SHA-384 and SHA-512. +abstract class LongSHA2FamilyDigest extends BaseDigest { + static const _BYTE_LENGTH = 128; + + static final _maxByteCount1 = Register64(0x1fffffff, 0xffffffff); + + final h1 = Register64(); + final h2 = Register64(); + final h3 = Register64(); + final h4 = Register64(); + final h5 = Register64(); + final h6 = Register64(); + final h7 = Register64(); + final h8 = Register64(); + + final _wordBuffer = Uint8List(8); + int _wordBufferOffset = 0; + + final _w = Register64List(80); + int _wOff = 0; + + final _byteCount1 = Register64(); // TODO: convert to list + final _byteCount2 = Register64(); + + LongSHA2FamilyDigest() { + reset(); + } + + @override + int get byteLength => _BYTE_LENGTH; + + @override + void reset() { + _byteCount1.set(0); + _byteCount2.set(0); + + _wordBufferOffset = 0; + _wordBuffer.fillRange(0, _wordBuffer.length, 0); + + _wOff = 0; + _w.fillRange(0, _w.length, 0); + } + + @override + void updateByte(int inp) { + _wordBuffer[_wordBufferOffset++] = inp; + + if (_wordBufferOffset == _wordBuffer.length) { + _processWord(_wordBuffer, 0); + _wordBufferOffset = 0; + } + + _byteCount1.sum(1); + } + + @override + void update(Uint8List inp, int inpOff, int len) { + // fill the current word + while ((_wordBufferOffset != 0) && (len > 0)) { + updateByte(inp[inpOff]); + + inpOff++; + len--; + } + + // process whole words. + while (len > _wordBuffer.length) { + _processWord(inp, inpOff); + + inpOff += _wordBuffer.length; + len -= _wordBuffer.length; + _byteCount1.sum(_wordBuffer.length); + } + + // load in the remainder. + while (len > 0) { + updateByte(inp[inpOff]); + + inpOff++; + len--; + } + } + + void finish() { + _adjustByteCounts(); + + var lowBitLength = Register64(_byteCount1)..shiftl(3); + var hiBitLength = _byteCount2; + + // add the pad bytes. + updateByte(128); + + while (_wordBufferOffset != 0) { + updateByte(0); + } + + _processLength(lowBitLength, hiBitLength); + + _processBlock(); + } + + void _processWord(Uint8List inp, int inpOff) { + _w[_wOff++].unpack(inp, inpOff, Endian.big); + + if (_wOff == 16) { + _processBlock(); + } + } + + /// Adjust the byte counts so that byteCount2 represents the upper long (less 3 bits) word of the + /// byte count. + void _adjustByteCounts() { + if (_byteCount1 > _maxByteCount1) { + _byteCount2.sum(Register64(_byteCount1)..shiftr(61)); + _byteCount1.and(_maxByteCount1); + } + } + + void _processLength(Register64 lowW, Register64 hiW) { + if (_wOff > 14) { + _processBlock(); + } + + _w[14].set(hiW); + _w[15].set(lowW); + } + + void _processBlock() { + _adjustByteCounts(); + + // expand 16 word block into 80 word blocks. + for (var t = 16; t < 80; t++) { + // _w[t] = _sigma1(_w[t - 2]) + _w[t - 7] + _sigma0(_w[t - 15]) + _w[t - 16]; + _w[t].set(_sigma1(_w[t - 2]) + ..sum(_w[t - 7]) + ..sum(_sigma0(_w[t - 15])) + ..sum(_w[t - 16])); + } + + var a = Register64(h1); + var b = Register64(h2); + var c = Register64(h3); + var d = Register64(h4); + var e = Register64(h5); + var f = Register64(h6); + var g = Register64(h7); + var h = Register64(h8); + + var t = 0; + for (var i = 0; i < 10; i++) { + // t = 8 * i + h + ..sum(_sum1(e)) + ..sum(_ch(e, f, g)) + ..sum(_k[t]) + ..sum(_w[t++]); + d.sum(h); + h + ..sum(_sum0(a)) + ..sum(_maj(a, b, c)); + + // t = 8 * i + 1 + g + ..sum(_sum1(d)) + ..sum(_ch(d, e, f)) + ..sum(_k[t]) + ..sum(_w[t++]); + c.sum(g); + g + ..sum(_sum0(h)) + ..sum(_maj(h, a, b)); + + // t = 8 * i + 2 + f + ..sum(_sum1(c)) + ..sum(_ch(c, d, e)) + ..sum(_k[t]) + ..sum(_w[t++]); + b.sum(f); + f + ..sum(_sum0(g)) + ..sum(_maj(g, h, a)); + + // t = 8 * i + 3 + e + ..sum(_sum1(b)) + ..sum(_ch(b, c, d)) + ..sum(_k[t]) + ..sum(_w[t++]); + a.sum(e); + e + ..sum(_sum0(f)) + ..sum(_maj(f, g, h)); + + // t = 8 * i + 4 + d + ..sum(_sum1(a)) + ..sum(_ch(a, b, c)) + ..sum(_k[t]) + ..sum(_w[t++]); + h.sum(d); + d + ..sum(_sum0(e)) + ..sum(_maj(e, f, g)); + + // t = 8 * i + 5 + c + ..sum(_sum1(h)) + ..sum(_ch(h, a, b)) + ..sum(_k[t]) + ..sum(_w[t++]); + g.sum(c); + c + ..sum(_sum0(d)) + ..sum(_maj(d, e, f)); + + // t = 8 * i + 6 + b + ..sum(_sum1(g)) + ..sum(_ch(g, h, a)) + ..sum(_k[t]) + ..sum(_w[t++]); + f.sum(b); + b + ..sum(_sum0(c)) + ..sum(_maj(c, d, e)); + + // t = 8 * i + 7 + a + ..sum(_sum1(f)) + ..sum(_ch(f, g, h)) + ..sum(_k[t]) + ..sum(_w[t++]); + e.sum(a); + a + ..sum(_sum0(b)) + ..sum(_maj(b, c, d)); + } + + h1.sum(a); + h2.sum(b); + h3.sum(c); + h4.sum(d); + h5.sum(e); + h6.sum(f); + h7.sum(g); + h8.sum(h); + + // reset the offset and clean out the word buffer. + _wOff = 0; + _w.fillRange(0, 16, 0); + } + + Register64 _ch(Register64 x, Register64 y, Register64 z) { + // r += ((x & y) ^ ((~x) & z)); + var r0 = Register64(x); + r0.and(y); + + var r1 = Register64(x); + r1.not(); + r1.and(z); + + r0.xor(r1); + return r0; + } + + Register64 _maj(Register64 x, Register64 y, Register64 z) { + // r += ((x & y) ^ (x & z) ^ (y & z)); + var r0 = Register64(x); + r0.and(y); + + var r1 = Register64(x); + r1.and(z); + + var r2 = Register64(y); + r2.and(z); + + r0.xor(r1); + r0.xor(r2); + + return r0; + } + + Register64 _sum0(Register64 x) { + // r += ((x << 36)|(x >> 28)) ^ ((x << 30)|(x >> 34)) ^ ((x << 25)|(x >> 39)); + var r0 = Register64(x); + r0.rotl(36); + + var r1 = Register64(x); + r1.rotl(30); + + var r2 = Register64(x); + r2.rotl(25); + + r0.xor(r1); + r0.xor(r2); + + return r0; + } + + Register64 _sum1(Register64 x) { + // r += ((x << 50)|(x >> 14)) ^ ((x << 46)|(x >> 18)) ^ ((x << 23)|(x >> 41)); + var r0 = Register64(x); + r0.rotl(50); + + var r1 = Register64(x); + r1.rotl(46); + + var r2 = Register64(x); + r2.rotl(23); + + r0.xor(r1); + r0.xor(r2); + + return r0; + } + + Register64 _sigma0(Register64 x) { + // r = (((x << 63)|(x >> 1)) ^ ((x << 56)|(x >> 8)) ^ (x >> 7)); + var r0 = Register64(x); + r0.rotl(63); + + var r1 = Register64(x); + r1.rotl(56); + + var r2 = Register64(x); + r2.shiftr(7); + + r0.xor(r1); + r0.xor(r2); + + return r0; + } + + Register64 _sigma1(Register64 x) { + // r = (((x << 45)|(x >> 19)) ^ ((x << 3)|(x >> 61)) ^ (x >> 6)); + var r0 = Register64(x); + r0.rotl(45); + + var r1 = Register64(x); + r1.rotl(3); + + var r2 = Register64(x); + r2.shiftr(6); + + r0.xor(r1); + r0.xor(r2); + + return r0; + } + + /// SHA-384 and SHA-512 constants: represent the first 64 bits of the fractional parts of the cube + /// roots of the first sixty-four prime numbers) + static final _k = [ + Register64(0x428a2f98, 0xd728ae22), + Register64(0x71374491, 0x23ef65cd), + Register64(0xb5c0fbcf, 0xec4d3b2f), + Register64(0xe9b5dba5, 0x8189dbbc), + Register64(0x3956c25b, 0xf348b538), + Register64(0x59f111f1, 0xb605d019), + Register64(0x923f82a4, 0xaf194f9b), + Register64(0xab1c5ed5, 0xda6d8118), + Register64(0xd807aa98, 0xa3030242), + Register64(0x12835b01, 0x45706fbe), + Register64(0x243185be, 0x4ee4b28c), + Register64(0x550c7dc3, 0xd5ffb4e2), + Register64(0x72be5d74, 0xf27b896f), + Register64(0x80deb1fe, 0x3b1696b1), + Register64(0x9bdc06a7, 0x25c71235), + Register64(0xc19bf174, 0xcf692694), + Register64(0xe49b69c1, 0x9ef14ad2), + Register64(0xefbe4786, 0x384f25e3), + Register64(0x0fc19dc6, 0x8b8cd5b5), + Register64(0x240ca1cc, 0x77ac9c65), + Register64(0x2de92c6f, 0x592b0275), + Register64(0x4a7484aa, 0x6ea6e483), + Register64(0x5cb0a9dc, 0xbd41fbd4), + Register64(0x76f988da, 0x831153b5), + Register64(0x983e5152, 0xee66dfab), + Register64(0xa831c66d, 0x2db43210), + Register64(0xb00327c8, 0x98fb213f), + Register64(0xbf597fc7, 0xbeef0ee4), + Register64(0xc6e00bf3, 0x3da88fc2), + Register64(0xd5a79147, 0x930aa725), + Register64(0x06ca6351, 0xe003826f), + Register64(0x14292967, 0x0a0e6e70), + Register64(0x27b70a85, 0x46d22ffc), + Register64(0x2e1b2138, 0x5c26c926), + Register64(0x4d2c6dfc, 0x5ac42aed), + Register64(0x53380d13, 0x9d95b3df), + Register64(0x650a7354, 0x8baf63de), + Register64(0x766a0abb, 0x3c77b2a8), + Register64(0x81c2c92e, 0x47edaee6), + Register64(0x92722c85, 0x1482353b), + Register64(0xa2bfe8a1, 0x4cf10364), + Register64(0xa81a664b, 0xbc423001), + Register64(0xc24b8b70, 0xd0f89791), + Register64(0xc76c51a3, 0x0654be30), + Register64(0xd192e819, 0xd6ef5218), + Register64(0xd6990624, 0x5565a910), + Register64(0xf40e3585, 0x5771202a), + Register64(0x106aa070, 0x32bbd1b8), + Register64(0x19a4c116, 0xb8d2d0c8), + Register64(0x1e376c08, 0x5141ab53), + Register64(0x2748774c, 0xdf8eeb99), + Register64(0x34b0bcb5, 0xe19b48a8), + Register64(0x391c0cb3, 0xc5c95a63), + Register64(0x4ed8aa4a, 0xe3418acb), + Register64(0x5b9cca4f, 0x7763e373), + Register64(0x682e6ff3, 0xd6b2b8a3), + Register64(0x748f82ee, 0x5defb2fc), + Register64(0x78a5636f, 0x43172f60), + Register64(0x84c87814, 0xa1f0ab72), + Register64(0x8cc70208, 0x1a6439ec), + Register64(0x90befffa, 0x23631e28), + Register64(0xa4506ceb, 0xde82bde9), + Register64(0xbef9a3f7, 0xb2c67915), + Register64(0xc67178f2, 0xe372532b), + Register64(0xca273ece, 0xea26619c), + Register64(0xd186b8c7, 0x21c0c207), + Register64(0xeada7dd6, 0xcde0eb1e), + Register64(0xf57d4f7f, 0xee6ed178), + Register64(0x06f067aa, 0x72176fba), + Register64(0x0a637dc5, 0xa2c898a6), + Register64(0x113f9804, 0xbef90dae), + Register64(0x1b710b35, 0x131c471b), + Register64(0x28db77f5, 0x23047d84), + Register64(0x32caab7b, 0x40c72493), + Register64(0x3c9ebe0a, 0x15c9bebc), + Register64(0x431d67c4, 0x9c100d4c), + Register64(0x4cc5d4be, 0xcb3e42b6), + Register64(0x597f299c, 0xfc657e2a), + Register64(0x5fcb6fab, 0x3ad6faec), + Register64(0x6c44198c, 0x4a475817) + ]; +} diff --git a/pointycastle/lib/src/impl/md4_family_digest.dart b/pointycastle/lib/src/impl/md4_family_digest.dart new file mode 100644 index 0000000..49e297f --- /dev/null +++ b/pointycastle/lib/src/impl/md4_family_digest.dart @@ -0,0 +1,190 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; + +/// Base implementation of MD4 family style digest +abstract class MD4FamilyDigest extends BaseDigest { + final _byteCount = Register64(0); + + final _wordBuffer = Uint8List(4); + late int _wordBufferOffset; + + final Endian _endian; + final int _packedStateSize; + + final List state; + + final List buffer; + late int bufferOffset; + + MD4FamilyDigest(this._endian, int stateSize, int bufferSize, + [int? packedStateSize]) + : _packedStateSize = + (packedStateSize == null) ? stateSize : packedStateSize, + state = List.filled(stateSize, 0, growable: false), + buffer = List.filled(bufferSize, 0, growable: false) { + reset(); + } + + /// Reset state of digest. + void resetState(); + + /// Process a whole block of data in extender digest. + void processBlock(); + + @override + void reset() { + _byteCount.set(0); + + _wordBufferOffset = 0; + _wordBuffer.fillRange(0, _wordBuffer.length, 0); + + bufferOffset = 0; + buffer.fillRange(0, buffer.length, 0); + + resetState(); + } + + @override + void updateByte(int inp) { + _wordBuffer[_wordBufferOffset++] = clip8(inp); + _processWordIfBufferFull(); + _byteCount.sum(1); + } + + @override + void update(Uint8List inp, int inpOff, int len) { + int nbytes; + + nbytes = _processUntilNextWord(inp, inpOff, len); + inpOff += nbytes; + len -= nbytes; + + nbytes = _processWholeWords(inp, inpOff, len); + inpOff += nbytes; + len -= nbytes; + + _processBytes(inp, inpOff, len); + } + + @override + int doFinal(Uint8List out, int outOff) { + var bitLength = Register64(_byteCount)..shiftl(3); + + _processPadding(); + _processLength(bitLength); + _doProcessBlock(); + + _packState(out, outOff); + + reset(); + + return digestSize; + } + + /// Process a word (4 bytes) of data stored in [inp], starting at [inpOff]. + void _processWord(Uint8List inp, int inpOff) { + buffer[bufferOffset++] = unpack32(inp, inpOff, _endian); + + if (bufferOffset == 16) { + _doProcessBlock(); + } + } + + /// Process a block of data and reset the [buffer]. + void _doProcessBlock() { + processBlock(); + + // reset the offset and clean out the word buffer. + bufferOffset = 0; + buffer.fillRange(0, 16, 0); + } + + /// Process [len] bytes from [inp] starting at [inpOff] + void _processBytes(Uint8List inp, int inpOff, int len) { + while (len > 0) { + updateByte(inp[inpOff]); + + inpOff++; + len--; + } + } + + /// Process data word by word until no more words can be extracted from [inp] and return the number of bytes processed. + int _processWholeWords(Uint8List inp, int inpOff, int len) { + var processed = 0; + while (len > _wordBuffer.length) { + _processWord(inp, inpOff); + + inpOff += _wordBuffer.length; + len -= _wordBuffer.length; + _byteCount.sum(_wordBuffer.length); + processed += 4; + } + return processed; + } + + /// Process bytes from [inp] until the word buffer [_wordBuffer] is full and reset and return the number of bytes processed. + int _processUntilNextWord(Uint8List inp, int inpOff, int len) { + var processed = 0; + + while ((_wordBufferOffset != 0) && (len > 0)) { + updateByte(inp[inpOff]); + + inpOff++; + len--; + processed++; + } + + return processed; + } + + // ignore: comment_references + /// Process a word in [_xBuff] if it is already full and then reset it + void _processWordIfBufferFull() { + if (_wordBufferOffset == _wordBuffer.length) { + _processWord(_wordBuffer, 0); + _wordBufferOffset = 0; + } + } + + /// Add final padding to the digest + void _processPadding() { + updateByte(128); + while (_wordBufferOffset != 0) { + updateByte(0); + } + } + + // ignore: comment_references + /// Called from [finish] so that extender can process the number of bits processed. + void _processLength(Register64 bitLength) { + if (bufferOffset > 14) { + _doProcessBlock(); + } + + switch (_endian) { + case Endian.little: + buffer[14] = bitLength.lo32; + buffer[15] = bitLength.hi32; + break; + + case Endian.big: + buffer[14] = bitLength.hi32; + buffer[15] = bitLength.lo32; + break; + + default: + throw StateError('Invalid endianness: $_endian'); + } + } + + void _packState(Uint8List out, int outOff) { + for (var i = 0; i < _packedStateSize; i++) { + pack32(state[i], out, outOff + i * 4, _endian); + } + } +} diff --git a/pointycastle/lib/src/impl/secure_random_base.dart b/pointycastle/lib/src/impl/secure_random_base.dart new file mode 100644 index 0000000..316e890 --- /dev/null +++ b/pointycastle/lib/src/impl/secure_random_base.dart @@ -0,0 +1,60 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/utils.dart' as utils; + +/// An utility base implementation of [SecureRandom] so that only [nextUint8] method needs to be +/// implemented. +abstract class SecureRandomBase implements SecureRandom { + @override + int nextUint16() { + var b0 = nextUint8(); + var b1 = nextUint8(); + return clip16((b1 << 8) | b0); + } + + @override + int nextUint32() { + var b0 = nextUint8(); + var b1 = nextUint8(); + var b2 = nextUint8(); + var b3 = nextUint8(); + return clip32((b3 << 24) | (b2 << 16) | (b1 << 8) | b0); + } + + @override + BigInt nextBigInteger(int bitLength) { + return utils.decodeBigIntWithSign(1, _randomBits(bitLength)); + } + + @override + Uint8List nextBytes(int count) { + var bytes = Uint8List(count); + for (var i = 0; i < count; i++) { + bytes[i] = nextUint8(); + } + return bytes; + } + + List _randomBits(int numBits) { + if (numBits < 0) { + throw ArgumentError('numBits must be non-negative'); + } + + var numBytes = (numBits + 7) ~/ 8; // avoid overflow + var randomBits = Uint8List(numBytes); + + // Generate random bytes and mask out any excess bits + if (numBytes > 0) { + for (var i = 0; i < numBytes; i++) { + randomBits[i] = nextUint8(); + } + var excessBits = 8 * numBytes - numBits; + randomBits[0] &= (1 << (8 - excessBits)) - 1; + } + return randomBits; + } +} diff --git a/pointycastle/lib/src/platform_check/abstract.dart b/pointycastle/lib/src/platform_check/abstract.dart new file mode 100644 index 0000000..a92fe9d --- /dev/null +++ b/pointycastle/lib/src/platform_check/abstract.dart @@ -0,0 +1,36 @@ +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/impl/entropy.dart'; + +import 'platform_check.dart'; + +class PlatformGeneric extends Platform { + static final PlatformGeneric instance = PlatformGeneric(); + + const PlatformGeneric(); + + @override + bool get isNative => false; + + @override + String get platform => 'generic'; + + @override + EntropySource platformEntropySource() { + return _GenericEntropySource(); + } +} + +Platform getPlatform() => PlatformGeneric.instance; + +// Uses the built in entropy source +class _GenericEntropySource implements EntropySource { + final _src = Random.secure(); + + @override + Uint8List getBytes(int len) { + return Uint8List.fromList( + List.generate(len, (i) => _src.nextInt(256))); + } +} diff --git a/pointycastle/lib/src/platform_check/native.dart b/pointycastle/lib/src/platform_check/native.dart new file mode 100644 index 0000000..6d18028 --- /dev/null +++ b/pointycastle/lib/src/platform_check/native.dart @@ -0,0 +1,45 @@ +import 'dart:io' as io; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/impl/entropy.dart'; + +import 'platform_check.dart'; + +class PlatformIO extends Platform { + static final PlatformIO instance = PlatformIO(); + + const PlatformIO(); + + @override + String get platform { + if (io.Platform.isAndroid) return 'Android'; + if (io.Platform.isIOS) return 'iOS'; + if (io.Platform.isWindows) return 'Windows'; + if (io.Platform.isLinux) return 'Linux'; + if (io.Platform.isFuchsia) return 'Fuchsia'; + if (io.Platform.isMacOS) return 'MacOS'; + + return 'native'; + } + + @override + bool get isNative => true; + + @override + EntropySource platformEntropySource() { + return _NativeRngProvider(); + } +} + +class _NativeRngProvider implements EntropySource { + final _src = Random.secure(); + + @override + Uint8List getBytes(int len) { + return Uint8List.fromList( + List.generate(len, (i) => _src.nextInt(256))); + } +} + +Platform getPlatform() => PlatformIO.instance; diff --git a/pointycastle/lib/src/platform_check/node_crypto.dart b/pointycastle/lib/src/platform_check/node_crypto.dart new file mode 100644 index 0000000..5f798a8 --- /dev/null +++ b/pointycastle/lib/src/platform_check/node_crypto.dart @@ -0,0 +1,17 @@ +/// Wrapper for needed NodeJS Crypto library function and require. +library nodecryto; + +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; + +@JS() +external JSObject require(String id); + +@JS() +@staticInterop +class NodeCrypto { + static JSAny randomFillSync(JSAny buf) { + final crypto = require('crypto'); + return crypto.callMethod('randomFillSync'.toJS, buf); + } +} diff --git a/pointycastle/lib/src/platform_check/platform_check.dart b/pointycastle/lib/src/platform_check/platform_check.dart new file mode 100644 index 0000000..07e9965 --- /dev/null +++ b/pointycastle/lib/src/platform_check/platform_check.dart @@ -0,0 +1,37 @@ +import 'package:pointycastle/src/impl/entropy.dart'; + +import 'abstract.dart' + if (dart.library.io) 'native.dart' + if (dart.library.js) 'web.dart'; + +abstract class Platform { + static Platform get instance => getPlatform(); + static const bool _fwInteger = 9007199254740992 + 1 != 9007199254740992; + + const Platform(); + + String get platform; + + bool get isNative; + + bool get fullWidthInteger => _fwInteger; + + void assertFullWidthInteger() { + if (!_fwInteger) { + throw PlatformException( + 'full width integer not supported on this platform'); + } + } + + /// Platform dependent entropy source. + EntropySource platformEntropySource(); +} + +class PlatformException implements Exception { + String cause; + + PlatformException(this.cause); + + @override + String toString() => cause; +} diff --git a/pointycastle/lib/src/platform_check/web.dart b/pointycastle/lib/src/platform_check/web.dart new file mode 100644 index 0000000..59ef673 --- /dev/null +++ b/pointycastle/lib/src/platform_check/web.dart @@ -0,0 +1,65 @@ +@JS() +import 'dart:js_interop'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/impl/entropy.dart'; + +import 'node_crypto.dart'; +import 'platform_check.dart'; + +class PlatformWeb extends Platform { + static final PlatformWeb instance = PlatformWeb(); + static bool useBuiltInRng = false; + + PlatformWeb() { + try { + Random.secure(); + useBuiltInRng = true; + } on UnsupportedError { + useBuiltInRng = false; + } + } + + @override + bool get isNative => false; + + @override + String get platform => 'web'; + + @override + EntropySource platformEntropySource() { + if (useBuiltInRng) { + return _JsBuiltInEntropySource(); + } else { + // + // Assume that if we cannot get a built in Secure RNG then we are + // probably on NodeJS. + // + return _JsNodeEntropySource(); + } + } +} + +// Uses the built in entropy source +class _JsBuiltInEntropySource implements EntropySource { + final _src = Random.secure(); + + @override + Uint8List getBytes(int len) { + return Uint8List.fromList( + List.generate(len, (i) => _src.nextInt(256))); + } +} + +/// +class _JsNodeEntropySource implements EntropySource { + @override + Uint8List getBytes(int len) { + var list = Uint8List(len); + NodeCrypto.randomFillSync(list.buffer.toJS); + return list; + } +} + +Platform getPlatform() => PlatformWeb.instance; diff --git a/pointycastle/lib/src/registration.dart b/pointycastle/lib/src/registration.dart new file mode 100644 index 0000000..827a889 --- /dev/null +++ b/pointycastle/lib/src/registration.dart @@ -0,0 +1,44 @@ +// See file LICENSE for more information. + +// +// +//TODO find out that these two methods are for! +//BlockCipher _cfbBlockCipherFactory(String algorithmName) { +// var parts = algorithmName.split("/"); +// +// if (parts.length != 2) return null; +// if (!parts[1].startsWith("CFB-")) return null; +// +// var blockSizeInBits = int.parse(parts[1].substring(4)); +// if ((blockSizeInBits % 8) != 0) { +// throw new ArgumentError("Bad CFB block size: $blockSizeInBits (must be a multiple of 8)"); +// } +// +// var underlyingCipher = _createOrNull(() => new BlockCipher(parts[0])); +// +// if (underlyingCipher != null) { +// return new CFBBlockCipher(underlyingCipher, blockSizeInBits ~/ 8); +// } +// +// return null; +//} +// +//BlockCipher _ofbBlockCipherFactory(String algorithmName) { +// var parts = algorithmName.split("/"); +// +// if (parts.length != 2) return null; +// if (!parts[1].startsWith("OFB-")) return null; +// +// var blockSizeInBits = int.parse(parts[1].substring(4)); +// if ((blockSizeInBits % 8) != 0) { +// throw new ArgumentError("Bad OFB block size: $blockSizeInBits (must be a multiple of 8)"); +// } +// +// var underlyingCipher = _createOrNull(() => new BlockCipher(parts[0])); +// +// if (underlyingCipher != null) { +// return new OFBBlockCipher(underlyingCipher, blockSizeInBits ~/ 8); +// } +// +// return null; +//} diff --git a/pointycastle/lib/src/registry/registration.dart b/pointycastle/lib/src/registry/registration.dart new file mode 100644 index 0000000..881be78 --- /dev/null +++ b/pointycastle/lib/src/registry/registration.dart @@ -0,0 +1,171 @@ +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/key_derivators/concat_kdf.dart'; +import 'package:pointycastle/key_derivators/ecdh_kdf.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +void registerFactories(FactoryRegistry registry) { + _registerAsymmetricCiphers(registry); + _registerBlockCiphers(registry); + _registerDigests(registry); + _registerECCurves(registry); + _registerKeyDerivators(registry); + _registerKeyGenerators(registry); + _registerPbeParameterGenerators(registry); + _registerMacs(registry); + _registerPaddedBlockCiphers(registry); + _registerPaddings(registry); + _registerRandoms(registry); + _registerSigners(registry); + _registerStreamCiphers(registry); +} + +void _registerAsymmetricCiphers(FactoryRegistry registry) { + registry.register(OAEPEncoding.factoryConfig); + registry.register(PKCS1Encoding.factoryConfig); + registry.register(RSAEngine.factoryConfig); +} + +void _registerBlockCiphers(FactoryRegistry registry) { + registry.register(AESEngine.factoryConfig); + registry.register(RC2Engine.factoryConfig); + registry.register(DESedeEngine.factoryConfig); + // modes + registry.register(CBCBlockCipher.factoryConfig); + registry.register(CFBBlockCipher.factoryConfig); + registry.register(CTRBlockCipher.factoryConfig); + registry.register(ECBBlockCipher.factoryConfig); + registry.register(GCTRBlockCipher.factoryConfig); + registry.register(OFBBlockCipher.factoryConfig); + registry.register(SICBlockCipher.factoryConfig); + registry.register(GCMBlockCipher.factoryConfig); + registry.register(CCMBlockCipher.factoryConfig); + registry.register(IGEBlockCipher.factoryConfig); +} + +void _registerDigests(FactoryRegistry registry) { + registry.register(Blake2bDigest.factoryConfig); + registry.register(MD2Digest.factoryConfig); + registry.register(MD4Digest.factoryConfig); + registry.register(MD5Digest.factoryConfig); + registry.register(RIPEMD128Digest.factoryConfig); + registry.register(RIPEMD160Digest.factoryConfig); + registry.register(RIPEMD256Digest.factoryConfig); + registry.register(RIPEMD320Digest.factoryConfig); + registry.register(SHA1Digest.factoryConfig); + registry.register(SHA3Digest.factoryConfig); + registry.register(KeccakDigest.factoryConfig); + registry.register(SHA224Digest.factoryConfig); + registry.register(SHA256Digest.factoryConfig); + registry.register(SHA384Digest.factoryConfig); + registry.register(SHA512Digest.factoryConfig); + registry.register(SHA512tDigest.factoryConfig); + registry.register(TigerDigest.factoryConfig); + registry.register(WhirlpoolDigest.factoryConfig); + registry.register(SHAKEDigest.factoryConfig); + registry.register(CSHAKEDigest.factoryConfig); + registry.register(SM3Digest.factoryConfig); +} + +void _registerECCurves(FactoryRegistry registry) { + registry.register(ECCurve_brainpoolp160r1.factoryConfig); + registry.register(ECCurve_brainpoolp160t1.factoryConfig); + registry.register(ECCurve_brainpoolp192r1.factoryConfig); + registry.register(ECCurve_brainpoolp192t1.factoryConfig); + registry.register(ECCurve_brainpoolp224r1.factoryConfig); + registry.register(ECCurve_brainpoolp224t1.factoryConfig); + registry.register(ECCurve_brainpoolp256r1.factoryConfig); + registry.register(ECCurve_brainpoolp256t1.factoryConfig); + registry.register(ECCurve_brainpoolp320r1.factoryConfig); + registry.register(ECCurve_brainpoolp320t1.factoryConfig); + registry.register(ECCurve_brainpoolp384r1.factoryConfig); + registry.register(ECCurve_brainpoolp384t1.factoryConfig); + registry.register(ECCurve_brainpoolp512r1.factoryConfig); + registry.register(ECCurve_brainpoolp512t1.factoryConfig); + registry.register(ECCurve_gostr3410_2001_cryptopro_a.factoryConfig); + registry.register(ECCurve_gostr3410_2001_cryptopro_b.factoryConfig); + registry.register(ECCurve_gostr3410_2001_cryptopro_c.factoryConfig); + registry.register(ECCurve_gostr3410_2001_cryptopro_xcha.factoryConfig); + registry.register(ECCurve_gostr3410_2001_cryptopro_xchb.factoryConfig); + registry.register(ECCurve_prime192v1.factoryConfig); + registry.register(ECCurve_prime192v2.factoryConfig); + registry.register(ECCurve_prime192v3.factoryConfig); + registry.register(ECCurve_prime239v1.factoryConfig); + registry.register(ECCurve_prime239v2.factoryConfig); + registry.register(ECCurve_prime239v3.factoryConfig); + registry.register(ECCurve_prime256v1.factoryConfig); + registry.register(ECCurve_secp112r1.factoryConfig); + registry.register(ECCurve_secp112r2.factoryConfig); + registry.register(ECCurve_secp128r1.factoryConfig); + registry.register(ECCurve_secp128r2.factoryConfig); + registry.register(ECCurve_secp160k1.factoryConfig); + registry.register(ECCurve_secp160r1.factoryConfig); + registry.register(ECCurve_secp160r2.factoryConfig); + registry.register(ECCurve_secp192k1.factoryConfig); + registry.register(ECCurve_secp192r1.factoryConfig); + registry.register(ECCurve_secp224k1.factoryConfig); + registry.register(ECCurve_secp224r1.factoryConfig); + registry.register(ECCurve_secp256k1.factoryConfig); + registry.register(ECCurve_secp256r1.factoryConfig); + registry.register(ECCurve_secp384r1.factoryConfig); + registry.register(ECCurve_secp521r1.factoryConfig); +} + +void _registerKeyDerivators(FactoryRegistry registry) { + registry.register(PBKDF2KeyDerivator.factoryConfig); + registry.register(Scrypt.factoryConfig); + registry.register(HKDFKeyDerivator.factoryConfig); + registry.register(Argon2BytesGenerator.factoryConfig); + registry.register(ConcatKDFDerivator.factoryConfig); + registry.register(ECDHKeyDerivator.factoryConfig); + registry.register(ECDHKeyDerivator.factoryConfig); + registry.register(ECDHKeyDerivator.factoryConfig); +} + +void _registerKeyGenerators(FactoryRegistry registry) { + registry.register(ECKeyGenerator.factoryConfig); + registry.register(RSAKeyGenerator.factoryConfig); +} + +void _registerPbeParameterGenerators(FactoryRegistry registry) { + registry.register(PKCS12ParametersGenerator.factoryConfig); + registry.register(PKCS5S1ParameterGenerator.factoryConfig); +} + +void _registerMacs(FactoryRegistry registry) { + registry.register(HMac.factoryConfig); + registry.register(CMac.factoryConfig); + registry.register(CBCBlockCipherMac.factoryConfig); + registry.register(Poly1305.factoryConfig); +} + +void _registerPaddedBlockCiphers(FactoryRegistry registry) { + registry.register(PaddedBlockCipherImpl.factoryConfig); +} + +void _registerPaddings(FactoryRegistry registry) { + registry.register(PKCS7Padding.factoryConfig); + registry.register(ISO7816d4Padding.factoryConfig); +} + +void _registerRandoms(FactoryRegistry registry) { + registry.register(AutoSeedBlockCtrRandom.factoryConfig); + registry.register(BlockCtrRandom.factoryConfig); + registry.register(FortunaRandom.factoryConfig); +} + +void _registerSigners(FactoryRegistry registry) { + registry.register(ECDSASigner.factoryConfig); + registry.register(PSSSigner.factoryConfig); + registry.register(RSASigner.factoryConfig); +} + +void _registerStreamCiphers(FactoryRegistry registry) { + registry.register(CTRStreamCipher.factoryConfig); + registry.register(Salsa20Engine.factoryConfig); + registry.register(ChaCha20Engine.factoryConfig); + registry.register(ChaCha7539Engine.factoryConfig); + registry.register(ChaCha20Poly1305.factoryConfig); + registry.register(SICStreamCipher.factoryConfig); + registry.register(EAX.factoryConfig); + registry.register(RC4Engine.factoryConfig); +} diff --git a/pointycastle/lib/src/registry/registry.dart b/pointycastle/lib/src/registry/registry.dart new file mode 100644 index 0000000..a168d0e --- /dev/null +++ b/pointycastle/lib/src/registry/registry.dart @@ -0,0 +1,165 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registration.dart'; + +final FactoryRegistry registry = _RegistryImpl(); + +abstract class FactoryRegistry { + T create(String registrableName); + + void register(FactoryConfig config); +} + +typedef /*Registrable*/ RegistrableConstructor = Function(); +typedef DynamicConstructorFactory = RegistrableConstructor Function( + String registrableName, Match match); + +abstract class FactoryConfig { + final Type type; + + FactoryConfig(this.type); +} + +class StaticFactoryConfig extends FactoryConfig { + final String algorithmName; + final RegistrableConstructor factory; + + StaticFactoryConfig(super.type, this.algorithmName, this.factory); +} + +// From the PatternCharacter rule here: +// http://ecma-international.org/ecma-262/5.1/#sec-15.10 +final _specialRegExpChars = RegExp(r'([\\\^\$\.\|\+\[\]\(\)\{\}])'); + +/// Escapes special regular expression characters in [str] so that it can be +/// used as a literal match inside of a [RegExp]. +/// +/// The special characters are: \ ^ $ . | + [ ] ( ) { } +/// as defined here: http://ecma-international.org/ecma-262/5.1/#sec-15.10 +String _escapeRegExp(String str) => str.splitMapJoin(_specialRegExpChars, + onMatch: (Match m) => '\\${m.group(0)}', onNonMatch: (s) => s); + +class DynamicFactoryConfig extends FactoryConfig { + final RegExp regExp; + final DynamicConstructorFactory factory; + + DynamicFactoryConfig(super.type, this.regExp, this.factory); + + DynamicFactoryConfig.regex( + Type type, String regexString, DynamicConstructorFactory factory) + : this(type, RegExp(regexString), factory); + + /// A dynamic registry that matches by prefix. + /// The part after the prefix will be in `match.group(1)`. + DynamicFactoryConfig.prefix( + Type type, String prefix, DynamicConstructorFactory factory) + : this.regex(type, '^${_escapeRegExp(prefix)}(.+)\$', factory); + + /// A dynamic registry that matches by suffix. + /// The part before the suffix will be in `match.group(1)`. + DynamicFactoryConfig.suffix( + Type type, String suffix, DynamicConstructorFactory factory) + : this.regex(type, '^(.+)${_escapeRegExp(suffix)}\$', factory); + + /// Invokes the factory when it matches. Else returns null. + RegistrableConstructor? tryFactory(String algorithmName) { + Match? match = regExp.firstMatch(algorithmName); + if (match == null) { + return null; + } + return factory(algorithmName, match); + } +} + +class _RegistryImpl implements FactoryRegistry { + static const int _CONSTRUCTOR_CACHE_SIZE = 25; + + final Map> _staticFactories; + final Map> _dynamicFactories; + + final Map _constructorCache = + {}; + + bool _initialized = false; + + _RegistryImpl() + : _staticFactories = >{}, + _dynamicFactories = >{}; + + @override + T create(String registrableName) { + var type = T; + var constructor = getConstructor(type, registrableName); + var result = constructor() as T; + return result; + } + + RegistrableConstructor getConstructor(Type type, String registrableName) { + var constructor = _constructorCache['$type.$registrableName']; + + if (constructor == null) { + constructor = _createConstructor(type, registrableName); + if (_constructorCache.length > _CONSTRUCTOR_CACHE_SIZE) { + _constructorCache.clear(); + } + _constructorCache['$type.$registrableName'] = constructor!; + } + return constructor; + } + + RegistrableConstructor? _createConstructor( + Type type, String registrableName) { + // Init lazily + _checkInit(); + + if (_staticFactories.containsKey(type) && + _staticFactories[type]!.containsKey(registrableName)) { + return _staticFactories[type]![registrableName]; + } + + if (_dynamicFactories.containsKey(type)) { + for (var factory in _dynamicFactories[type]!) { + var constructor = factory.tryFactory(registrableName); + if (constructor != null) { + return constructor; + } + } + } + + // No factory found + throw RegistryFactoryException.unknown(registrableName, type); + } + + void _checkInit() { + if (!_initialized) { + _initialize(); + } + } + + @override + void register(FactoryConfig config) { + if (config is StaticFactoryConfig) { + _addStaticFactoryConfig(config); + } else if (config is DynamicFactoryConfig) { + _addDynamicFactoryConfig(config); + } + } + + void _addStaticFactoryConfig(StaticFactoryConfig config) { + Map factories = _staticFactories.putIfAbsent( + config.type, () => {}); + factories[config.algorithmName] = config.factory; + } + + void _addDynamicFactoryConfig(DynamicFactoryConfig config) { + Set factories = _dynamicFactories.putIfAbsent( + config.type, () => {}); + factories.add(config); + } + + void _initialize() { + registerFactories(this); + _initialized = true; + } +} diff --git a/pointycastle/lib/src/ufixnum.dart b/pointycastle/lib/src/ufixnum.dart new file mode 100644 index 0000000..1b63b9c --- /dev/null +++ b/pointycastle/lib/src/ufixnum.dart @@ -0,0 +1,562 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +const _MASK_3 = 0x07; +const _MASK_5 = 0x1F; +const _MASK_6 = 0x3F; +const _MASK_8 = 0xFF; +const _MASK_16 = 0xFFFF; +const _MASK_32 = 0xFFFFFFFF; + +// ignore: non_constant_identifier_names +final _MASK32_HI_BITS = [ + 0xFFFFFFFF, + 0x7FFFFFFF, + 0x3FFFFFFF, + 0x1FFFFFFF, + 0x0FFFFFFF, + 0x07FFFFFF, + 0x03FFFFFF, + 0x01FFFFFF, + 0x00FFFFFF, + 0x007FFFFF, + 0x003FFFFF, + 0x001FFFFF, + 0x000FFFFF, + 0x0007FFFF, + 0x0003FFFF, + 0x0001FFFF, + 0x0000FFFF, + 0x00007FFF, + 0x00003FFF, + 0x00001FFF, + 0x00000FFF, + 0x000007FF, + 0x000003FF, + 0x000001FF, + 0x000000FF, + 0x0000007F, + 0x0000003F, + 0x0000001F, + 0x0000000F, + 0x00000007, + 0x00000003, + 0x00000001, + 0x00000000 +]; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// 8 bit operations +// +int clip8(int x) => x & _MASK_8; + +int csum8(int x, int y) => sum8(clip8(x), clip8(y)); +int sum8(int x, int y) { + assert((x >= 0) && (x <= _MASK_8)); + assert((y >= 0) && (y <= _MASK_8)); + return (x + y) & _MASK_8; +} + +int csub8(int x, int y) => sub8(clip8(x), clip8(y)); +int sub8(int x, int y) { + assert((x >= 0) && (x <= _MASK_8)); + assert((y >= 0) && (y <= _MASK_8)); + return (x - y) & _MASK_8; +} + +int cshiftl8(int x, int n) => shiftl8(clip8(x), n); +int shiftl8(int x, int n) { + assert((x >= 0) && (x <= _MASK_8)); + return (x << (n & _MASK_3)) & _MASK_8; +} + +int cshiftr8(int x, int n) => shiftr8(clip8(x), n); +int shiftr8(int x, int n) { + assert((x >= 0) && (x <= _MASK_8)); + return x >> (n & _MASK_3); +} + +int cneg8(int x) => neg8(clip8(x)); +int neg8(int x) { + assert((x >= 0) && (x <= _MASK_8)); + return -x & _MASK_8; +} + +int cnot8(int x) => not8(clip8(x)); +int not8(int x) { + assert((x >= 0) && (x <= _MASK_8)); + return ~x & _MASK_8; +} + +int crotl8(int x, int n) => rotl8(clip8(x), n); +int rotl8(int x, int n) { + assert(n >= 0); + assert((x >= 0) && (x <= _MASK_8)); + n &= _MASK_3; + return ((x << n) & _MASK_8) | (x >> (8 - n)); +} + +int crotr8(int x, int n) => rotr8(clip8(x), n); +int rotr8(int x, int n) { + assert(n >= 0); + assert((x >= 0) && (x <= _MASK_8)); + n &= _MASK_3; + return ((x >> n) & _MASK_8) | ((x << (8 - n)) & _MASK_8); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// 16 bit operations +// +int clip16(int x) => x & _MASK_16; + +/// Packs a 16 bit integer into a byte buffer. The [out] parameter can be an [Uint8List] or a +/// [ByteData] if you will run it several times against the same buffer and want faster execution. +void pack16(int x, dynamic out, int offset, Endian endian) { + assert((x >= 0) && (x <= _MASK_16)); + if (out is! ByteData) { + out = ByteData.view(out.buffer, out.offsetInBytes, out.length); + } + out.setUint16(offset, x, endian); +} + +/// Unpacks a 16 bit integer from a byte buffer. The [inp] parameter can be an [Uint8List] or a +/// [ByteData] if you will run it several times against the same buffer and want faster execution. +int unpack16(dynamic inp, int offset, Endian endian) { + if (inp is! ByteData) { + inp = ByteData.view( + inp.buffer as ByteBuffer, inp.offsetInBytes as int, inp.length as int?); + } + return inp.getUint16(offset, endian); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// 32 bit operations +// +int clip32(int x) => x & _MASK_32; + +int csum32(int x, int y) => sum32(clip32(x), clip32(y)); +int sum32(int x, int y) { + assert((x >= 0) && (x <= _MASK_32)); + assert((y >= 0) && (y <= _MASK_32)); + return (x + y) & _MASK_32; +} + +int csub32(int x, int y) => sub32(clip32(x), clip32(y)); +int sub32(int x, int y) { + assert((x >= 0) && (x <= _MASK_32)); + assert((y >= 0) && (y <= _MASK_32)); + return (x - y) & _MASK_32; +} + +int cshiftl32(int x, int n) => shiftl32(clip32(x), n); +int shiftl32(int x, int n) { + assert((x >= 0) && (x <= _MASK_32)); + n &= _MASK_5; + x &= _MASK32_HI_BITS[n]; + return (x << n) & _MASK_32; +} + +int cshiftr32(int x, int n) => shiftr32(clip32(x), n); +int shiftr32(int x, int n) { + assert((x >= 0) && (x <= _MASK_32)); + n &= _MASK_5; + return x >> n; +} + +int cneg32(int x) => neg32(clip32(x)); +int neg32(int x) { + assert((x >= 0) && (x <= _MASK_32)); + return -x & _MASK_32; +} + +int cnot32(int x) => not32(clip32(x)); +int not32(int x) { + assert((x >= 0) && (x <= _MASK_32)); + return ~x & _MASK_32; +} + +int crotl32(int x, int n) => rotl32(clip32(x), n); +int rotl32(int x, int n) { + assert(n >= 0); + assert((x >= 0) && (x <= _MASK_32)); + n &= _MASK_5; + return shiftl32(x, n) | (x >> (32 - n)); +} + +int crotr32(int x, int n) => rotr32(clip32(x), n); +int rotr32(int x, int n) { + assert(n >= 0); + assert((x >= 0) && (x <= _MASK_32)); + n &= _MASK_5; + return (x >> n) | shiftl32(x, 32 - n); +} + +/// Packs a 32 bit integer into a byte buffer. The [out] parameter can be an [Uint8List] or a +/// [ByteData] if you will run it several times against the same buffer and want faster execution. +void pack32(int x, dynamic out, int offset, Endian endian) { + assert((x >= 0) && (x <= _MASK_32)); + if (out is! ByteData) { + out = + ByteData.view(out.buffer as ByteBuffer, out.offsetInBytes, out.length); + } + out.setUint32(offset, x, endian); +} + +/// Unpacks a 32 bit integer from a byte buffer. The [inp] parameter can be an [Uint8List] or a +/// [ByteData] if you will run it several times against the same buffer and want faster execution. +int unpack32(dynamic inp, int offset, Endian endian) { + if (inp is! ByteData) { + inp = ByteData.view(inp.buffer, inp.offsetInBytes, inp.length); + } + return inp.getUint32(offset, endian); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// 64 bit operations +// +class Register64 { + late int _hi32; + late int _lo32; + + Register64([Object hiOrLo32OrY = 0, int? lo32]) { + set(hiOrLo32OrY, lo32); + } + + int get lo32 => _lo32; + int get hi32 => _hi32; + + @override + bool operator ==(Object other) => other is Register64 + ? (((_hi32 == other._hi32) && (_lo32 == other._lo32))) + : false; + bool operator <(Register64 y) => + (_hi32 < y._hi32) || ((_hi32 == y._hi32) && (_lo32 < y._lo32)); + bool operator <=(Register64 y) => (this < y) || (this == y); + bool operator >(Register64 y) => + (_hi32 > y._hi32) || ((_hi32 == y._hi32) && (_lo32 > y._lo32)); + bool operator >=(Register64 y) => (this > y) || (this == y); + + void set(dynamic hiOrLo32OrY, [int? lo32]) { + if (lo32 == null) { + if (hiOrLo32OrY is Register64) { + _hi32 = hiOrLo32OrY._hi32; + _lo32 = hiOrLo32OrY._lo32; + } else { + assert(hiOrLo32OrY as int <= _MASK_32); + _hi32 = 0; + _lo32 = hiOrLo32OrY as int; + } + } else { + assert(hiOrLo32OrY as int <= _MASK_32); + assert(lo32 <= _MASK_32); + _hi32 = hiOrLo32OrY as int; + _lo32 = lo32; + } + } + + void sum(dynamic y) { + if (y is int) { + y &= _MASK_32; + var slo32 = _lo32 + y; + _lo32 = slo32 & _MASK_32; + if (slo32 != _lo32) { + _hi32++; + _hi32 &= _MASK_32; + } + } else { + var slo32 = _lo32 + y._lo32 as int; + _lo32 = slo32 & _MASK_32; + var carry = ((slo32 != _lo32) ? 1 : 0); + _hi32 = ((_hi32 + y._hi32 + carry) as int) & _MASK_32; + } + } + + void sumReg(Register64 y) { + var slo32 = _lo32 + y._lo32; + _lo32 = slo32 & _MASK_32; + var carry = ((slo32 != _lo32) ? 1 : 0); + _hi32 = (_hi32 + y._hi32 + carry) & _MASK_32; + } + + void sub(dynamic y) { + // TODO: optimize sub() ??? + sum(Register64(y)..neg()); + } + + void mul(dynamic y) { + // Grab 16-bit chunks. + final a0 = _lo32 & _MASK_16; + final a1 = (_lo32 >> 16) & _MASK_16; + final a2 = _hi32 & _MASK_16; + final a3 = (_hi32 >> 16) & _MASK_16; + late int b0, b1, b2, b3; + if (y is int) { + // Assume it is a 32-bit integer. + y &= _MASK_32; + b0 = y & _MASK_16; + b1 = (y >> 16) & _MASK_16; + b2 = b3 = 0; + } else /* if (y is Register64) */ { + b0 = (y as Register64)._lo32 & _MASK_16; + b1 = (y._lo32 >> 16) & _MASK_16; + b2 = y._hi32 & _MASK_16; + b3 = (y._hi32 >> 16) & _MASK_16; + } + + // Compute partial products. + // Optimization: if b is small, avoid multiplying by parts that are 0. + var p0 = a0 * b0; // << 0 + var p1 = a1 * b0; // << 16 + var p2 = a2 * b0; // << 32 + var p3 = a3 * b0; // << 48 + + if (b1 != 0) { + p1 += a0 * b1; + p2 += a1 * b1; + p3 += a2 * b1; + } + if (b2 != 0) { + p2 += a0 * b2; + p3 += a1 * b2; + } + if (b3 != 0) { + p3 += a0 * b3; + } + + // Accumulate into 32-bit chunks: + // |................................|................................| + // |................................|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| p0 + // |................................|................................| + // |................................|................................| + // |................xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx................| p1 + // |................................|................................| + // |................................|................................| + // |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|................................| p2 + // |................................|................................| + // |................................|................................| + // |xxxxxxxxxxxxxxxx................|................................| p3 + var slo32 = p0 + ((p1 & _MASK_16) << 16); + _lo32 = slo32 & _MASK_32; + var carry = ((slo32 != _lo32) ? 1 : 0); + // p1 is a 33-bit integer, shiftr operation will ignore 33th-bit on js + var carry2 = ((p1 & _MASK_32) != p1) ? 0x10000 : 0; + var shi32 = + ((p1 & _MASK_32) >> 16) + p2 + ((p3 & _MASK_16) << 16) + carry + carry2; + _hi32 = shi32 & _MASK_32; + } + + void neg() { + not(); + sum(1); + } + + void not() { + _hi32 = ~_hi32 & _MASK_32; + _lo32 = ~_lo32 & _MASK_32; + } + + void and(Register64 y) { + _hi32 &= y._hi32; + _lo32 &= y._lo32; + } + + void or(Register64 y) { + _hi32 |= y._hi32; + _lo32 |= y._lo32; + } + + void xor(Register64 y) { + _hi32 ^= y._hi32; + _lo32 ^= y._lo32; + } + + void shiftl(int n) { + n &= _MASK_6; + if (n == 0) { + // do nothing + } else if (n >= 32) { + _hi32 = shiftl32(_lo32, n - 32); + _lo32 = 0; + } else { + _hi32 = shiftl32(_hi32, n); + _hi32 |= _lo32 >> (32 - n); + _lo32 = shiftl32(_lo32, n); + } + } + + void shiftr(int n) { + n &= _MASK_6; + if (n == 0) { + // do nothing + } else if (n >= 32) { + _lo32 = _hi32 >> (n - 32); + _hi32 = 0; + } else { + _lo32 = _lo32 >> n; + _lo32 |= shiftl32(_hi32, 32 - n); + _hi32 = _hi32 >> n; + } + } + + void rotl(int n) { + n &= _MASK_6; + if (n == 0) { + // do nothing + } else { + if (n >= 32) { + var swap = _hi32; + _hi32 = _lo32; + _lo32 = swap; + n -= 32; + } + if (n == 0) { + // do nothing + } else { + var hi32 = _hi32; + _hi32 = shiftl32(_hi32, n); + _hi32 |= _lo32 >> (32 - n); + _lo32 = shiftl32(_lo32, n); + _lo32 |= hi32 >> (32 - n); + } + } + } + + void rotr(int n) { + n &= _MASK_6; + if (n == 0) { + // do nothing + } else { + if (n >= 32) { + var swap = _hi32; + _hi32 = _lo32; + _lo32 = swap; + n -= 32; + } + if (n == 0) { + // do nothing + } else { + var hi32 = _hi32; + _hi32 = _hi32 >> n; + _hi32 |= shiftl32(_lo32, 32 - n); + _lo32 = _lo32 >> n; + _lo32 |= shiftl32(hi32, 32 - n); + } + } + } + + void mod(int n) { + if (_hi32 == 0) { + // hi32 is zero, so just caculate lo32. + _lo32 %= n; + } else { + // hi32 is not zero, use Horner's Method + const b = 0x10000; + final a0 = _lo32 & _MASK_16; + final a1 = (_lo32 >> 16) & _MASK_16; + final a2 = _hi32 & _MASK_16; + final a3 = (_hi32 >> 16) & _MASK_16; + _lo32 = ((((((a3 % n) * b + a2) % n) * b + a1) % n) * b + a0) % n; + // Assume that n is a 32-bit integer, so hi32 will always be zero + _hi32 = 0; + } + } + + /// Packs a 64 bit integer into a byte buffer. The [out] parameter can be an [Uint8List] or a + /// [ByteData] if you will run it several times against the same buffer and want faster execution. + void pack(dynamic out, int offset, Endian endian) { + switch (endian) { + case Endian.big: + pack32(hi32, out, offset, endian); + pack32(lo32, out, offset + 4, endian); + break; + + case Endian.little: + pack32(hi32, out, offset + 4, endian); + pack32(lo32, out, offset, endian); + break; + + default: + throw UnsupportedError('Invalid endianness: $endian'); + } + } + + /// Unpacks a 64 bit integer from a byte buffer. The [inp] parameter can be an [Uint8List] or a + /// [ByteData] if you will run it several times against the same buffer and want faster execution. + void unpack(dynamic inp, int offset, Endian endian) { + switch (endian) { + case Endian.big: + _hi32 = unpack32(inp, offset, endian); + _lo32 = unpack32(inp, offset + 4, endian); + break; + + case Endian.little: + _hi32 = unpack32(inp, offset + 4, endian); + _lo32 = unpack32(inp, offset, endian); + break; + + default: + throw UnsupportedError('Invalid endianness: $endian'); + } + } + + @override + String toString() { + var sb = StringBuffer(); + _padWrite(sb, _hi32); + _padWrite(sb, _lo32); + return sb.toString(); + } + + void _padWrite(StringBuffer sb, int value) { + var str = value.toRadixString(16); + for (var i = 8 - str.length; i > 0; i--) { + sb.write('0'); + } + sb.write(str); + } + + @override + int get hashCode => Object.hash(_hi32, _lo32); +} + +class Register64List { + final List _list; + + Register64List.from(List> values) + : _list = List.generate( + values.length, (i) => Register64(values[i][0], values[i][1])); + + Register64List(int length) + : _list = List.generate(length, (_) => Register64()); + + int get length => _list.length; + + Register64 operator [](int index) => _list[index]; + + void fillRange(int start, int end, dynamic hiOrLo32OrY, [int? lo32]) { + for (var i = start; i < end; i++) { + _list[i].set(hiOrLo32OrY, lo32); + } + } + + void setRange(int start, int end, Register64List list, [int skipCount = 0]) { + var length = end - start; + for (var i = 0; i < length; i++) { + _list[start + i].set(list[skipCount + i]); + } + } + + @override + String toString() { + var sb = StringBuffer('('); + for (var i = 0; i < _list.length; i++) { + if (i > 0) { + sb.write(', '); + } + sb.write(_list[i].toString()); + } + sb.write(')'); + return sb.toString(); + } +} diff --git a/pointycastle/lib/src/utils.dart b/pointycastle/lib/src/utils.dart new file mode 100644 index 0000000..0ba221d --- /dev/null +++ b/pointycastle/lib/src/utils.dart @@ -0,0 +1,336 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/src/platform_check/platform_check.dart'; + +void arrayCopy(Uint8List? sourceArr, int sourcePos, Uint8List? outArr, + int outPos, int len) { + for (var i = 0; i < len; i++) { + outArr![outPos + i] = sourceArr![sourcePos + i]; + } +} + +/// +///A constant time equals comparison - does not terminate early if +///test will fail. For best results always pass the expected value +///as the first parameter. +/// +/// @param expected first array +/// @param supplied second array +/// @return true if arrays equal, false otherwise. +/// +bool constantTimeAreEqual(Uint8List expected, Uint8List supplied) { + if (expected == supplied) { + return true; + } + + var len = + (expected.length < supplied.length) ? expected.length : supplied.length; + + var nonEqual = expected.length ^ supplied.length; + + for (var i = 0; i != len; i++) { + nonEqual |= expected[i] ^ supplied[i]; + } + for (var i = len; i < supplied.length; i++) { + nonEqual |= supplied[i] ^ ~supplied[i]; + } + + return nonEqual == 0; +} + +Uint8List concatUint8List(Iterable list) => + Uint8List.fromList(list.expand((element) => element).toList()); + +/// Decode a BigInt from bytes in big-endian encoding. +/// Twos compliment. +BigInt decodeBigInt(List bytes) { + var negative = bytes.isNotEmpty && bytes[0] & 0x80 == 0x80; + + BigInt result; + + if (bytes.length == 1) { + result = BigInt.from(bytes[0]); + } else { + result = BigInt.zero; + for (var i = 0; i < bytes.length; i++) { + var item = bytes[bytes.length - i - 1]; + result |= BigInt.from(item) << (8 * i); + } + } + return result != BigInt.zero + ? negative + ? result.toSigned(result.bitLength) + : result + : BigInt.zero; +} + +/// Decode a big integer with arbitrary sign. +/// When: +/// sign == 0: Zero regardless of magnitude +/// sign < 0: Negative +/// sign > 0: Positive +BigInt decodeBigIntWithSign(int sign, List magnitude) { + if (sign == 0) { + return BigInt.zero; + } + + BigInt result; + + if (magnitude.length == 1) { + result = BigInt.from(magnitude[0]); + } else { + result = BigInt.from(0); + for (var i = 0; i < magnitude.length; i++) { + var item = magnitude[magnitude.length - i - 1]; + result |= BigInt.from(item) << (8 * i); + } + } + + if (result != BigInt.zero) { + if (sign < 0) { + result = result.toSigned(result.bitLength); + } else { + result = result.toUnsigned(result.bitLength); + } + } + return result; +} + +var _byteMask = BigInt.from(0xff); +final negativeFlag = BigInt.from(0x80); + +/// Encode a BigInt into bytes using big-endian encoding. +/// It encodes the integer to a minimal twos-compliment integer as defined by +/// ASN.1 +Uint8List encodeBigInt(BigInt? number) { + if (number == BigInt.zero) { + return Uint8List.fromList([0]); + } + + int needsPaddingByte; + int rawSize; + + if (number! > BigInt.zero) { + rawSize = (number.bitLength + 7) >> 3; + needsPaddingByte = + ((number >> (rawSize - 1) * 8) & negativeFlag) == negativeFlag ? 1 : 0; + } else { + needsPaddingByte = 0; + rawSize = (number.bitLength + 8) >> 3; + } + + final size = rawSize + needsPaddingByte; + var result = Uint8List(size); + for (var i = 0; i < rawSize; i++) { + result[size - i - 1] = (number! & _byteMask).toInt(); + number = number >> 8; + } + return result; +} + +/// Encode as Big Endian unsigned byte array. +Uint8List encodeBigIntAsUnsigned(BigInt number) { + if (number == BigInt.zero) { + return Uint8List.fromList([0]); + } + var size = number.bitLength + (number.isNegative ? 8 : 7) >> 3; + var result = Uint8List(size); + for (var i = 0; i < size; i++) { + result[size - i - 1] = (number & _byteMask).toInt(); + number = number >> 8; + } + return result; +} + +bool constantTimeAreEqualOffset( + int len, Uint8List a, int aOff, Uint8List b, int bOff) { + if (len < 0) { + throw ArgumentError('"len" cannot be negative'); + } + if (aOff > (a.length - len)) { + throw ArgumentError('"aOff" value invalid for specified length'); + } + if (bOff > (b.length - len)) { + throw ArgumentError('"bOff" value invalid for specified length'); + } + + var d = 0; + for (var i = 0; i < len; ++i) { + d |= a[aOff + i] ^ b[bOff + i]; + } + return 0 == d; +} + +abstract class Pack { + static int littleEndianToLong(Uint8List bs, int off) { + var data = ByteData.view(bs.buffer); + return data.getInt64(off, Endian.little); + } + + static void littleEndianToLongAtList(Uint8List bs, int off, Uint64List ns) { + for (var i = 0; i < ns.length; ++i) { + ns[i] = littleEndianToLong(bs, off); + off += 8; + } + } + + static void littleEndianToInt32AtList(Uint8List bs, int off, Uint32List ns) { + for (var i = 0; i < ns.length; ++i) { + ns[i] = littleEndianToInt(bs, off); + off += 4; + } + } + + static void intToLittleEndian(int n, Uint8List bs, int off) { + var data = ByteData.view(bs.buffer); + data.setInt32(off, n, Endian.little); + } + + static Uint8List longToLittleEndianList(int n) { + var bs = Uint8List(8); + longToLittleEndianAtList(n, bs, 0); + return bs; + } + + static void longToLittleEndianAtList(int n, Uint8List bs, int off) { + var data = ByteData.view(bs.buffer); + data.setInt64(off, n, Endian.little); + } + + static Uint8List longListToLittleEndianList(Uint64List ns) { + var bs = Uint8List(8 * ns.length); + longListToLittleEndianAtList(ns, bs, 0); + return bs; + } + + static void longListToLittleEndianAtList( + Uint64List ns, Uint8List bs, int off) { + for (var i = 0; i < ns.length; ++i) { + longToLittleEndianAtList(ns[i], bs, off); + off += 8; + } + } + + static int littleEndianToInt(Uint8List bs, int off) { + var data = ByteData.view(bs.buffer); + return data.getInt32(off, Endian.little); + } + + static Uint8List intToLittleEndianList(int n) { + var bs = Uint8List(4); + intToLittleEndianAtList(n, bs, 0); + return bs; + } + + static void intToLittleEndianAtList(int n, Uint8List bs, int off) { + var data = ByteData.view(bs.buffer); + data.setInt32(off, n, Endian.little); + } + + static Uint8List intListToLittleEndian(Uint32List ns) { + var bs = Uint8List(4 * ns.length); + intListToLittleEndianAtList(ns, bs, 0); + return bs; + } + + static void intListToLittleEndianAtList( + Uint32List ns, Uint8List bs, int off) { + for (var i = 0; i < ns.length; ++i) { + intToLittleEndianAtList(ns[i], bs, off); + off += 4; + } + } +} + +abstract class Longs { + static const _MASK_32 = 0xFFFFFFFF; + + static const _MASK32_HI_BITS = [ + 0xFFFFFFFF, + 0x7FFFFFFF, + 0x3FFFFFFF, + 0x1FFFFFFF, + 0x0FFFFFFF, + 0x07FFFFFF, + 0x03FFFFFF, + 0x01FFFFFF, + 0x00FFFFFF, + 0x007FFFFF, + 0x003FFFFF, + 0x001FFFFF, + 0x000FFFFF, + 0x0007FFFF, + 0x0003FFFF, + 0x0001FFFF, + 0x0000FFFF, + 0x00007FFF, + 0x00003FFF, + 0x00001FFF, + 0x00000FFF, + 0x000007FF, + 0x000003FF, + 0x000001FF, + 0x000000FF, + 0x0000007F, + 0x0000003F, + 0x0000001F, + 0x0000000F, + 0x00000007, + 0x00000003, + 0x00000001, + 0x00000000 + ]; + + static int rotateRight(int n, int distance) { + if (distance == 0) { + // do nothing: + return n; + } + + var hi32 = (n >> 32) & 0xFFFFFFFF; + var lo32 = n & 0xFFFFFFFF; + + if (distance >= 32) { + var swap = hi32; + hi32 = lo32; + lo32 = swap; + distance -= 32; + + if (distance == 0) { + return (hi32 << 32) | lo32; + } + } + + final distance32 = 32 - distance; + final m = _MASK32_HI_BITS[distance32]; + + final hi32cp = hi32; + + hi32 = hi32 >> distance; + hi32 |= ((lo32 & m) << distance32) & _MASK_32; + + lo32 = lo32 >> distance; + lo32 |= ((hi32cp & m) << distance32) & _MASK_32; + + return (hi32 << 32) | lo32; + } + + static int toInt32(int n) => n & 0xFFFFFFFF; +} + +const mask64 = (0xFFFFFFFF << 32) + 0xFFFFFFFF; + +int unsignedShiftRight64(int n, int count) { + if (Platform.instance.isNative) { + return (n >> count) & ~(-1 << (64 - count)); + } else { + count &= 0x1f; + if (n >= 0) { + return n >> count; + } else { + return (n >> count) ^ (mask64 ^ ((1 << (64 - count)) - 1)); + } + } +} diff --git a/pointycastle/lib/srp/srp6_client.dart b/pointycastle/lib/srp/srp6_client.dart new file mode 100644 index 0000000..4ed9dc7 --- /dev/null +++ b/pointycastle/lib/srp/srp6_client.dart @@ -0,0 +1,104 @@ +library impl.srp_client; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/srp/srp6_standard_groups.dart'; +import 'package:pointycastle/srp/srp6_util.dart'; + +class SRP6Client implements SRPClient { + late BigInt N; + late BigInt g; + + BigInt? a; + BigInt? A; + + BigInt? B; + + BigInt? x; + BigInt? u; + BigInt? S; + + BigInt? M1; + BigInt? M2; + BigInt? Key; + + Digest digest; + SecureRandom random; + SRP6GroupParameters group; + + SRP6Client( + {required this.group, required this.digest, required this.random}) { + g = group.g; + N = group.N; + } + + @override + BigInt? calculateClientEvidenceMessage() { + // Verify pre-requirements + if (A == null || B == null || S == null) { + throw Exception( + 'Impossible to compute M1: some data are missing from the previous operations (A,B,S)'); + } + // compute the client evidence message 'M1' + M1 = SRP6Util.calculateM1(digest, N, A, B, S); + return M1; + } + + ///S = (B - kg^x) ^ (a + ux) + BigInt? calculateS() { + var k = SRP6Util.calculateK(digest, N, g); + var exp = (u! * x!) + a!; + var tmp = g.modPow(x!, N) * (k % N); + + return (B! - (tmp % N)).modPow(exp, N); + } + + @override + BigInt? calculateSecret(BigInt serverB) { + B = SRP6Util.validatePublicValue(N, serverB); + u = SRP6Util.calculateU(digest, N, A, B); + S = calculateS(); + return S; + } + + @override + BigInt? calculateSessionKey() { + // Verify pre-requirements (here we enforce a previous calculation of M1 and M2) + if (S == null || M1 == null || M2 == null) { + throw Exception( + 'Impossible to compute Key: some data are missing from the previous operations (S,M1,M2)'); + } + Key = SRP6Util.calculateKey(digest, N, S!); + return Key; + } + + @override + BigInt? generateClientCredentials( + Uint8List salt, Uint8List identity, Uint8List password) { + x = SRP6Util.calculateX(digest, N, salt, identity, password); + a = selectPrivateValue(); + A = g.modPow(a!, N); + return A; + } + + BigInt? selectPrivateValue() { + return SRP6Util.generatePrivateValue(digest, N, g, random); + } + + @override + bool verifyServerEvidenceMessage(BigInt serverM2) { + // Verify pre-requirements + if (A == null || M1 == null || S == null) { + throw Exception('Impossible to compute and verify M2: ' + 'some data are missing from the previous operations (A,M1,S)'); + } + // Compute the own server evidence message 'M2' + var computedM2 = SRP6Util.calculateM2(digest, N, A, M1, S); + if (computedM2.compareTo(serverM2) == 0) { + M2 = serverM2; + return true; + } + return false; + } +} diff --git a/pointycastle/lib/srp/srp6_server.dart b/pointycastle/lib/srp/srp6_server.dart new file mode 100644 index 0000000..6387751 --- /dev/null +++ b/pointycastle/lib/srp/srp6_server.dart @@ -0,0 +1,101 @@ +library impl.srp_server; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/srp/srp6_standard_groups.dart'; +import 'package:pointycastle/srp/srp6_util.dart'; + +class SRP6Server implements SRPServer { + late BigInt N; + late BigInt g; + + BigInt v; + SecureRandom random; + Digest digest; + + BigInt? A; + + BigInt? b; + BigInt? B; + + BigInt? u; + BigInt? S; + BigInt? M1; + BigInt? M2; + BigInt? Key; + + SRP6Server( + {required SRP6GroupParameters group, + required this.v, + required this.digest, + required this.random}) { + g = group.g; + N = group.N; + } + + @override + BigInt? calculateSecret(BigInt clientA) { + A = SRP6Util.validatePublicValue(N, clientA); + u = SRP6Util.calculateU(digest, N, A, B); + S = _calculateS(); + + return S; + } + + @override + BigInt? calculateServerEvidenceMessage() { + // Verify pre-requirements + if (A == null || M1 == null || S == null) { + throw Exception( + 'Impossible to compute M2: some data are missing from the previous operations (A,M1,S)'); + } + + // Compute the server evidence message 'M2' + M2 = SRP6Util.calculateM2(digest, N, A!, M1!, S!); + return M2; + } + + @override + BigInt? calculateSessionKey() { + // Verify pre-requirements + if (S == null || M1 == null || M2 == null) { + throw Exception( + 'Impossible to compute Key: some data are missing from the previous operations (S,M1,M2)'); + } + Key = SRP6Util.calculateKey(digest, N, S); + return Key; + } + + @override + BigInt? generateServerCredentials() { + var k = SRP6Util.calculateK(digest, N, g); + b = selectPrivateValue(); + B = (k * v + g.modPow(b!, N)) % N; + + return B; + } + + BigInt? selectPrivateValue() { + return SRP6Util.generatePrivateValue(digest, N, g, random); + } + + @override + bool verifyClientEvidenceMessage(BigInt clientM1) { + // Verify pre-requirements + if (A == null || B == null || S == null) { + throw Exception( + 'Impossible to compute and verify M1: some data are missing from the previous operations (A,B,S)'); + } + + // Compute the own client evidence message 'M1' + var computedM1 = SRP6Util.calculateM1(digest, N, A, B, S); + if (computedM1.compareTo(clientM1) == 0) { + M1 = clientM1; + return true; + } + return false; + } + + BigInt _calculateS() { + return ((v.modPow(u!, N) * A!) % N).modPow(b!, N); + } +} diff --git a/pointycastle/lib/srp/srp6_standard_groups.dart b/pointycastle/lib/srp/srp6_standard_groups.dart new file mode 100644 index 0000000..2ae92ae --- /dev/null +++ b/pointycastle/lib/srp/srp6_standard_groups.dart @@ -0,0 +1,176 @@ +library src.srp_standard_groups; + +class SRP6GroupParameters { + BigInt N, g; + + SRP6GroupParameters({required this.N, required this.g}); +} + +class SRP6StandardGroups { + static final String rfc5054_1024_N = + 'EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C' + '9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE4' + '8E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B29' + '7BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9A' + 'FD5138FE8376435B9FC61D2FC0EB06E3'; + + static final String rfc5054_1024_g = '02'; + + /* + * * RFC 5054 + * */ + static final SRP6GroupParameters rfc5054_1024 = + fromNG(rfc5054_1024_N, rfc5054_1024_g); + static final String rfc5054_1536_N = + '9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA961' + '4B19CC4D5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F843' + '80B655BB9A22E8DCDF028A7CEC67F0D08134B1C8B97989149B609E0B' + 'E3BAB63D47548381DBC5B1FC764E3F4B53DD9DA1158BFD3E2B9C8CF5' + '6EDF019539349627DB2FD53D24B7C48665772E437D6C7F8CE442734A' + 'F7CCB7AE837C264AE3A9BEB87F8A2FE9B8B5292E5A021FFF5E91479E' + '8CE7A28C2442C6F315180F93499A234DCF76E3FED135F9BB'; + static final String rfc5054_1536_g = '02'; + + static final SRP6GroupParameters rfc5054_1536 = + fromNG(rfc5054_1536_N, rfc5054_1536_g); + static final String rfc5054_2048_N = + 'AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC319294' + '3DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310D' + 'CD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FB' + 'D5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF74' + '7359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A' + '436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D' + '5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E73' + '03CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB6' + '94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F' + '9E4AFF73'; + static final String rfc5054_2048_g = '02'; + + static final SRP6GroupParameters rfc5054_2048 = + fromNG(rfc5054_2048_N, rfc5054_2048_g); + static final String rfc5054_3072_N = + 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08' + '8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B' + '302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9' + 'A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6' + '49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8' + 'FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D' + '670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C' + '180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D' + '04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D' + 'B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226' + '1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C' + 'BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC' + 'E0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF'; + static final String rfc5054_3072_g = '05'; + + static final SRP6GroupParameters rfc5054_3072 = + fromNG(rfc5054_3072_N, rfc5054_3072_g); + static final String rfc5054_4096_N = + 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08' + '8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B' + '302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9' + 'A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6' + '49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8' + 'FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D' + '670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C' + '180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D' + '04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D' + 'B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226' + '1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C' + 'BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC' + 'E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26' + '99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB' + '04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127' + 'D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199' + 'FFFFFFFFFFFFFFFF'; + static final String rfc5054_4096_g = '05'; + + static final SRP6GroupParameters rfc5054_4096 = + fromNG(rfc5054_4096_N, rfc5054_4096_g); + static final String rfc5054_6144_N = + 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08' + '8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B' + '302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9' + 'A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6' + '49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8' + 'FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D' + '670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C' + '180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D' + '04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D' + 'B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226' + '1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C' + 'BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC' + 'E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26' + '99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB' + '04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127' + 'D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492' + '36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406' + 'AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918' + 'DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151' + '2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03' + 'F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F' + 'BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' + 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B' + 'B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632' + '387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E' + '6DCC4024FFFFFFFFFFFFFFFF'; + static final String rfc5054_6144_g = '05'; + + static final SRP6GroupParameters rfc5054_6144 = + fromNG(rfc5054_6144_N, rfc5054_6144_g); + static final String rfc5054_8192_N = + 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08' + '8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B' + '302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9' + 'A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6' + '49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8' + 'FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D' + '670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C' + '180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D' + '04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D' + 'B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226' + '1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C' + 'BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC' + 'E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26' + '99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB' + '04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127' + 'D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492' + '36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406' + 'AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918' + 'DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151' + '2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03' + 'F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F' + 'BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' + 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B' + 'B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632' + '387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E' + '6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA' + '3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C' + '5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9' + '22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886' + '2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6' + '6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5' + '0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268' + '359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6' + 'FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71' + '60C980DD98EDD3DFFFFFFFFFFFFFFFFF'; + static final String rfc5054_8192_g = '13'; + + static final SRP6GroupParameters rfc5054_8192 = + fromNG(rfc5054_8192_N, rfc5054_8192_g); + static BigInt fromHex(String hex) { + return BigInt.parse(hex, radix: 16); + } + + static SRP6GroupParameters fromNG(String hexN, String hexG) { + return SRP6GroupParameters(N: fromHex(hexN), g: fromHex(hexG)); + } +} diff --git a/pointycastle/lib/srp/srp6_util.dart b/pointycastle/lib/srp/srp6_util.dart new file mode 100644 index 0000000..f5d53a9 --- /dev/null +++ b/pointycastle/lib/srp/srp6_util.dart @@ -0,0 +1,167 @@ +library src.srp_util; + +import 'dart:math' as math; +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +class SRP6Util { + static final _byteMask = BigInt.from(0xff); + + static BigInt calculateK(Digest digest, BigInt N, BigInt g) { + return hashPaddedPair(digest, N, N, g); + } + + static BigInt calculateU(Digest digest, BigInt N, BigInt? A, BigInt? B) { + return hashPaddedPair(digest, N, A, B); + } + + static BigInt calculateX(Digest digest, BigInt N, Uint8List salt, + Uint8List identity, Uint8List password) { + var output = Uint8List(digest.digestSize); + + digest.update(identity, 0, identity.length); + digest.updateByte(':'.codeUnitAt(0)); + digest.update(password, 0, password.length); + digest.doFinal(output, 0); + + digest.update(salt, 0, salt.length); + digest.update(output, 0, output.length); + digest.doFinal(output, 0); + + return decodeBigInt(output); + } + + /// Decode a BigInt from bytes in big-endian encoding. + static BigInt decodeBigInt(List bytes) { + var result = BigInt.from(0); + for (var i = 0; i < bytes.length; i++) { + result += BigInt.from(bytes[bytes.length - i - 1]) << (8 * i); + } + return result; + } + + /// Encode a BigInt into bytes using big-endian encoding. + static Uint8List encodeBigInt(BigInt number) { + // Not handling negative numbers. Decide how you want to do that. + var size = (number.bitLength + 7) >> 3; + var result = Uint8List(size); + for (var i = 0; i < size; i++) { + result[size - i - 1] = (number & _byteMask).toInt(); + number = number >> 8; + } + return result; + } + + static BigInt? generatePrivateValue( + Digest digest, BigInt N, BigInt g, SecureRandom random) { + var minBits = math.min(256, N.bitLength ~/ 2); + var min = BigInt.one << (minBits - 1); + var max = N - BigInt.one; + + BigInt result; + do { + result = random.nextBigInteger(minBits); + } while (result > max || result < min); + return result; + } + + static BigInt validatePublicValue(BigInt N, BigInt val) { + val = val % N; + + // Check that val % N != 0 + if (val == BigInt.zero) { + throw Exception('Invalid public value: 0'); + } + + return val; + } + + /// Computes the client evidence message (M1) according to the standard routine: + /// M1 = H( A | B | S ) + /// [digest] The Digest used as the hashing function H + /// [N] Modulus used to get the pad length + /// [A] The public client value + /// [B] The public server value + /// [S] The secret calculated by both sides + /// [M1] The calculated client evidence message + static BigInt calculateM1( + Digest digest, BigInt N, BigInt? A, BigInt? B, BigInt? S) { + return hashPaddedTriplet(digest, N, A, B, S); + } + + /// Computes the server evidence message (M2) according to the standard routine: + /// M2 = H( A | M1 | S ) + /// [digest] The Digest used as the hashing function H + /// [N] Modulus used to get the pad length + /// [A] The public client value + /// [M1] The client evidence message + /// [S] The secret calculated by both sides + /// @return M2 The calculated server evidence message + static BigInt calculateM2( + Digest digest, BigInt N, BigInt? A, BigInt? M1, BigInt? S) { + return hashPaddedTriplet(digest, N, A, M1, S); + } + + /// Computes the final Key according to the standard routine: Key = H(S) + /// [digest] The Digest used as the hashing function H + /// [N] Modulus used to get the pad length + /// [S] The secret calculated by both sides + /// @return the final Key value. + static BigInt calculateKey(Digest digest, BigInt N, BigInt? S) { + var padLength = (N.bitLength + 7) ~/ 8; + var S0 = getPadded(S!, padLength); + digest.update(S0, 0, S0.length); + + var output = Uint8List(digest.digestSize); + digest.doFinal(output, 0); + return decodeBigInt(output); + } + + static BigInt hashPaddedTriplet( + Digest digest, BigInt N, BigInt? n1, BigInt? n2, BigInt? n3) { + var padLength = (N.bitLength + 7) ~/ 8; + + var n1Bytes = getPadded(n1!, padLength); + var n2Bytes = getPadded(n2!, padLength); + var n3Bytes = getPadded(n3!, padLength); + + digest.update(n1Bytes, 0, n1Bytes.length); + digest.update(n2Bytes, 0, n2Bytes.length); + digest.update(n3Bytes, 0, n3Bytes.length); + + var output = Uint8List(digest.digestSize); + digest.doFinal(output, 0); + + return decodeBigInt(output); + } + + static Uint8List getPadded(BigInt n, int length) { + var bs = encodeBigInt(n); + if (bs.length < length) { + var tmp = Uint8List(length); + var start = length - bs.length; + for (var i = 0; start < length; i++, start++) { + tmp[start] = bs[i]; + } + bs = tmp; + } + return bs; + } + + static BigInt hashPaddedPair( + Digest digest, BigInt N, BigInt? n1, BigInt? n2) { + var padLength = (N.bitLength + 7) ~/ 8; + + var n1Bytes = getPadded(n1!, padLength); + var n2Bytes = getPadded(n2!, padLength); + + digest.update(n1Bytes, 0, n1Bytes.length); + digest.update(n2Bytes, 0, n2Bytes.length); + + var output = Uint8List(digest.digestSize); + digest.doFinal(output, 0); + + return decodeBigInt(output); + } +} diff --git a/pointycastle/lib/srp/srp6_verifier_generator.dart b/pointycastle/lib/srp/srp6_verifier_generator.dart new file mode 100644 index 0000000..d7fa558 --- /dev/null +++ b/pointycastle/lib/srp/srp6_verifier_generator.dart @@ -0,0 +1,32 @@ +library src.srp_verifier_generator; + +import 'dart:typed_data'; + +import 'package:pointycastle/srp/srp6_standard_groups.dart'; +import 'package:pointycastle/srp/srp6_util.dart'; +import 'package:pointycastle/pointycastle.dart'; + +/// Generates new SRP verifier for user +class SRP6VerifierGenerator { + late BigInt N; + late BigInt g; + Digest digest; + + SRP6VerifierGenerator( + {required SRP6GroupParameters group, required this.digest}) { + N = group.N; + g = group.g; + } + + /// Creates a new SRP verifier + /// [salt] The salt to use, generally should be large and random + /// [identity] The user's identifying information (eg. username) + /// [password] The user's password + /// returns A new verifier for use in future SRP authentication + BigInt generateVerifier( + Uint8List salt, Uint8List identity, Uint8List password) { + var x = SRP6Util.calculateX(digest, N, salt, identity, password); + + return g.modPow(x, N); + } +} diff --git a/pointycastle/lib/stream/chacha20.dart b/pointycastle/lib/stream/chacha20.dart new file mode 100644 index 0000000..57b4f79 --- /dev/null +++ b/pointycastle/lib/stream/chacha20.dart @@ -0,0 +1,314 @@ +library impl.stream_cipher.chacha20; + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; + +import '../api.dart'; +import '../src/impl/base_stream_cipher.dart'; +import '../src/registry/registry.dart'; +import '../src/ufixnum.dart'; + +// ignore_for_file: omit_local_variable_types, prefer_single_quotes +// ignore_for_file: non_constant_identifier_names, directives_ordering +// ignore_for_file: prefer_typing_uninitialized_variables, camel_case_types +// ignore_for_file: annotate_overrides + +/// Implementation of Daniel J. Bernstein's ChaCha20 stream cipher, Snuffle 2005. +class ChaCha20Engine extends BaseStreamCipher { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.prefix( + StreamCipher, + 'ChaCha20/', + (_, final Match match) => () { + var rounds = int.parse(match.group(1)!); + return ChaCha20Engine.fromRounds(rounds); + }); + + static const STATE_SIZE = 16; + + int rounds = 20; + + static final _sigma = Uint8List.fromList([ + 101, + 120, + 112, + 97, + 110, + 100, + 32, + 51, + 50, + 45, + 98, + 121, + 116, + 101, + 32, + 107 + ]); + static final _tau = Uint8List.fromList([ + 101, + 120, + 112, + 97, + 110, + 100, + 32, + 49, + 54, + 45, + 98, + 121, + 116, + 101, + 32, + 107 + ]); + + Uint8List? _workingKey; + late Uint8List _workingIV; + + final _state = List.filled(STATE_SIZE, 0, growable: false); + final _buffer = List.filled(STATE_SIZE, 0, growable: false); + + final _keyStream = Uint8List(STATE_SIZE * 4); + var _keyStreamOffset = 0; + + var _initialised = false; + + @override + String get algorithmName => 'ChaCha20/$rounds'; + + ChaCha20Engine() { + rounds = 20; + } + + ChaCha20Engine.fromRounds(this.rounds); + + @override + void reset() { + if (_workingKey != null) { + _setKey(_workingKey!, _workingIV); + } + } + + @override + void init( + bool forEncryption, covariant ParametersWithIV params) { + var uparams = params.parameters; + var iv = params.iv; + if (iv.length != 8) { + throw ArgumentError('ChaCha20 requires exactly 8 bytes of IV'); + } + + _workingIV = iv; + _workingKey = uparams!.key; + + _setKey(_workingKey!, _workingIV); + } + + @override + int returnByte(int inp) { + if (_keyStreamOffset == 0) { + generateKeyStream(_keyStream); + + if (++_state[12] == 0) { + ++_state[13]; + } + } + + var out = clip8(_keyStream[_keyStreamOffset] ^ inp); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + + return out; + } + + @override + void processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (!_initialised) { + throw StateError('ChaCha20 not initialized: please call init() first'); + } + + if ((inpOff + len) > inp.length) { + throw ArgumentError( + 'Input buffer too short or requested length too long'); + } + + if ((outOff + len) > out.length) { + throw ArgumentError( + 'Output buffer too short or requested length too long'); + } + + for (var i = 0; i < len; i++) { + if (_keyStreamOffset == 0) { + generateKeyStream(_keyStream); + + if (++_state[12] == 0) { + ++_state[13]; + } + } + + out[i + outOff] = clip8(_keyStream[_keyStreamOffset] ^ inp[i + inpOff]); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + } + } + + void _setKey(Uint8List keyBytes, Uint8List ivBytes) { + _workingKey = keyBytes; + _workingIV = ivBytes; + + _keyStreamOffset = 0; + var offset = 0; + Uint8List constants; + + // Key + _state[4] = unpack32(_workingKey, 0, Endian.little); + _state[5] = unpack32(_workingKey, 4, Endian.little); + _state[6] = unpack32(_workingKey, 8, Endian.little); + _state[7] = unpack32(_workingKey, 12, Endian.little); + + if (_workingKey!.length == 32) { + constants = _sigma; + offset = 16; + } else { + constants = _tau; + } + + _state[8] = unpack32(_workingKey, offset, Endian.little); + _state[9] = unpack32(_workingKey, offset + 4, Endian.little); + _state[10] = unpack32(_workingKey, offset + 8, Endian.little); + _state[11] = unpack32(_workingKey, offset + 12, Endian.little); + _state[0] = unpack32(constants, 0, Endian.little); + _state[1] = unpack32(constants, 4, Endian.little); + _state[2] = unpack32(constants, 8, Endian.little); + _state[3] = unpack32(constants, 12, Endian.little); + + // IV + _state[14] = unpack32(_workingIV, 0, Endian.little); + _state[15] = unpack32(_workingIV, 4, Endian.little); + _state[12] = _state[13] = 0; + + _initialised = true; + } + + void generateKeyStream(Uint8List output) { + _core(rounds, _state, _buffer); + var outOff = 0; + for (var x in _buffer) { + pack32(x, output, outOff, Endian.little); + outOff += 4; + } + } + + /// The ChaCha20 core function + void _core(int rounds, List input, List x) { + var x00 = input[0]; + var x01 = input[1]; + var x02 = input[2]; + var x03 = input[3]; + var x04 = input[4]; + var x05 = input[5]; + var x06 = input[6]; + var x07 = input[7]; + var x08 = input[8]; + var x09 = input[9]; + var x10 = input[10]; + var x11 = input[11]; + var x12 = input[12]; + var x13 = input[13]; + var x14 = input[14]; + var x15 = input[15]; + + for (var i = rounds; i > 0; i -= 2) { + x00 += x04; + x12 = crotl32(x12 ^ x00, 16); + x08 += x12; + x04 = crotl32(x04 ^ x08, 12); + x00 += x04; + x12 = crotl32(x12 ^ x00, 8); + x08 += x12; + x04 = crotl32(x04 ^ x08, 7); + x01 += x05; + x13 = crotl32(x13 ^ x01, 16); + x09 += x13; + x05 = crotl32(x05 ^ x09, 12); + x01 += x05; + x13 = crotl32(x13 ^ x01, 8); + x09 += x13; + x05 = crotl32(x05 ^ x09, 7); + x02 += x06; + x14 = crotl32(x14 ^ x02, 16); + x10 += x14; + x06 = crotl32(x06 ^ x10, 12); + x02 += x06; + x14 = crotl32(x14 ^ x02, 8); + x10 += x14; + x06 = crotl32(x06 ^ x10, 7); + x03 += x07; + x15 = crotl32(x15 ^ x03, 16); + x11 += x15; + x07 = crotl32(x07 ^ x11, 12); + x03 += x07; + x15 = crotl32(x15 ^ x03, 8); + x11 += x15; + x07 = crotl32(x07 ^ x11, 7); + x00 += x05; + x15 = crotl32(x15 ^ x00, 16); + x10 += x15; + x05 = crotl32(x05 ^ x10, 12); + x00 += x05; + x15 = crotl32(x15 ^ x00, 8); + x10 += x15; + x05 = crotl32(x05 ^ x10, 7); + x01 += x06; + x12 = crotl32(x12 ^ x01, 16); + x11 += x12; + x06 = crotl32(x06 ^ x11, 12); + x01 += x06; + x12 = crotl32(x12 ^ x01, 8); + x11 += x12; + x06 = crotl32(x06 ^ x11, 7); + x02 += x07; + x13 = crotl32(x13 ^ x02, 16); + x08 += x13; + x07 = crotl32(x07 ^ x08, 12); + x02 += x07; + x13 = crotl32(x13 ^ x02, 8); + x08 += x13; + x07 = crotl32(x07 ^ x08, 7); + x03 += x04; + x14 = crotl32(x14 ^ x03, 16); + x09 += x14; + x04 = crotl32(x04 ^ x09, 12); + x03 += x04; + x14 = crotl32(x14 ^ x03, 8); + x09 += x14; + x04 = crotl32(x04 ^ x09, 7); + } + var xup = [ + x00, + x01, + x02, + x03, + x04, + x05, + x06, + x07, + x08, + x09, + x10, + x11, + x12, + x13, + x14, + x15 + ]; + for (var i = 0; i < STATE_SIZE; ++i) { + x[i] = csum32(xup[i], input[i]); + } + } + + @override + dynamic noSuchMethod(Invocation invocation); +} diff --git a/pointycastle/lib/stream/chacha20poly1305.dart b/pointycastle/lib/stream/chacha20poly1305.dart new file mode 100644 index 0000000..b096ca0 --- /dev/null +++ b/pointycastle/lib/stream/chacha20poly1305.dart @@ -0,0 +1,503 @@ +library impl.stream_cipher.chacha20poly1305; + +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/registry/registry.dart'; +import '../export.dart'; +import '../src/impl/base_aead_cipher.dart'; +import '../src/ufixnum.dart'; + +import '../src/utils.dart' as utils; + +// ignore_for_file: non_constant_identifier_names + +class ChaCha20Poly1305 extends BaseAEADCipher { + static final FactoryConfig factoryConfig = StaticFactoryConfig( + AEADCipher, + 'ChaCha20-Poly1305', + () => ChaCha20Poly1305(ChaCha7539Engine(), Poly1305())); + static const BUF_SIZE = 64; + static const KEY_SIZE = 32; + static const NONCE_SIZE = 12; + static const MAC_SIZE = 16; + static final MAX = pow(2, 63) - 1; + static final MIN = -pow(2, 63); + static final Uint8List ZEROES = Uint8List(MAC_SIZE - 1); + + static final int AADLimit = (MAX - MIN).toInt(); + static const DATA_LIMIT = (1 << 32 - 1) * 64; + final ChaCha7539Engine chacha20; + final Poly1305 poly1305; + + final Uint8List _key = Uint8List(KEY_SIZE); + final Uint8List _nonce = Uint8List(NONCE_SIZE); + final Uint8List _buf = Uint8List(MAC_SIZE + BUF_SIZE); + final Uint8List _mac = Uint8List(MAC_SIZE); + + @override + String get algorithmName => 'ChaCha20-Poly1305'; + + @override + Uint8List get mac => _mac; + + Uint8List? _initialAAD; + late int _aadCount; + late int _dataCount; + int _state = State.UNINITIALIZED; + late int _bufPos; + + ChaCha20Poly1305(this.chacha20, this.poly1305); + + @override + void init(bool forEncryption, CipherParameters params) { + KeyParameter initKeyParam; + Uint8List? initNonce; + CipherParameters chacha20Params; + + if (params is AEADParameters) { + var aeadParams = params; + + var macSizeBits = aeadParams.macSize; + if ((MAC_SIZE * 8) != macSizeBits) { + throw ArgumentError('Invalid value for MAC size: $macSizeBits'); + } + + initKeyParam = aeadParams.parameters as KeyParameter; + initNonce = aeadParams.nonce; + chacha20Params = ParametersWithIV(initKeyParam, initNonce); + + _initialAAD = aeadParams.associatedData; + } else if (params is ParametersWithIV) { + var ivParams = params; + + initKeyParam = ivParams.parameters as KeyParameter; + initNonce = ivParams.iv; + chacha20Params = ivParams; + + _initialAAD = null; + } else { + throw ArgumentError('invalid parameters passed to ChaCha20Poly1305'); + } + + // Validate key + if (KEY_SIZE != initKeyParam.key.length) { + throw ArgumentError('Key must be 256 bits'); + } + + // Validate nonce + if (NONCE_SIZE != initNonce.length) { + throw ArgumentError('Nonce must be 96 bits'); + } + + utils.arrayCopy(initKeyParam.key, 0, _key, 0, KEY_SIZE); + + utils.arrayCopy(initNonce, 0, _nonce, 0, NONCE_SIZE); + + chacha20.init(true, chacha20Params as ParametersWithIV); + + _state = forEncryption ? State.ENC_INIT : State.DEC_INIT; + + resetBool(true, false); + } + + @override + // ignore: missing_return + int getOutputSize(int len) { + var total = max(0, len) + _bufPos; + + switch (_state) { + case State.DEC_INIT: + case State.DEC_AAD: + case State.DEC_DATA: + return max(0, total - MAC_SIZE); + case State.ENC_INIT: + case State.ENC_AAD: + case State.ENC_DATA: + return total + MAC_SIZE; + default: + throw StateError('state = $_state'); + } + } + + @override + int getUpdateOutputSize(int len) { + var total = max(0, len) + _bufPos; + + switch (_state) { + case State.DEC_INIT: + case State.DEC_AAD: + case State.DEC_DATA: + total = max(0, total - MAC_SIZE); + break; + case State.ENC_INIT: + case State.ENC_AAD: + case State.ENC_DATA: + break; + default: + throw StateError(''); + } + + return total - (total % BUF_SIZE); + } + + @override + void processAADByte(int inp) { + checkAAD(); + + _aadCount = incrementCount(_aadCount, 1, AADLimit); + poly1305.updateByte(inp); + } + + @override + void processAADBytes(Uint8List inp, int inOff, int len) { + if (inOff < 0) { + throw ArgumentError('\'inOff\' cannot be negative'); + } + if (len < 0) { + throw ArgumentError('\'len\' cannot be negative'); + } + if (inOff > (inp.length - len)) { + throw ArgumentError('Input buffer too short'); + } + + checkAAD(); + + if (len > 0) { + _aadCount = incrementCount(_aadCount, len, AADLimit); + poly1305.update(inp, inOff, len); + } + } + + @override + int processByte(int inp, Uint8List out, int outOff) { + checkData(); + + switch (_state) { + case State.DEC_DATA: + { + _buf[_bufPos] = inp; + if (++_bufPos == _buf.length) { + poly1305.update(_buf, 0, BUF_SIZE); + processData(_buf, 0, BUF_SIZE, out, outOff); + utils.arrayCopy(_buf, BUF_SIZE, _buf, 0, MAC_SIZE); + _bufPos = MAC_SIZE; + return BUF_SIZE; + } + + return 0; + } + case State.ENC_DATA: + { + _buf[_bufPos] = inp; + if (++_bufPos == BUF_SIZE) { + processData(_buf, 0, BUF_SIZE, out, outOff); + poly1305.update(out, outOff, BUF_SIZE); + _bufPos = 0; + return BUF_SIZE; + } + + return 0; + } + default: + throw StateError(''); + } + } + + @override + int processBytes( + Uint8List inp, int inOff, int len, Uint8List out, int outOff) { + if (inOff < 0) { + throw ArgumentError('\'inOff\' cannot be negative'); + } + if (len < 0) { + throw ArgumentError('\'len\' cannot be negative'); + } + if (inOff > (inp.length - len)) { + throw ArgumentError('Input buffer too short'); + } + if (outOff < 0) { + throw ArgumentError('\'outOff\' cannot be negative'); + } + + checkData(); + + var resultLen = 0; + + switch (_state) { + case State.DEC_DATA: + { + for (var i = 0; i < len; ++i) { + _buf[_bufPos] = inp[inOff + i]; + if (++_bufPos == _buf.length) { + poly1305.update(_buf, 0, BUF_SIZE); + processData(_buf, 0, BUF_SIZE, out, outOff + resultLen); + utils.arrayCopy(_buf, BUF_SIZE, _buf, 0, MAC_SIZE); + _bufPos = MAC_SIZE; + resultLen += BUF_SIZE; + } + } + break; + } + case State.ENC_DATA: + { + if (_bufPos != 0) { + while (len > 0) { + --len; + _buf[_bufPos] = inp[inOff++]; + if (++_bufPos == BUF_SIZE) { + processData(_buf, 0, BUF_SIZE, out, outOff); + poly1305.update(out, outOff, BUF_SIZE); + _bufPos = 0; + resultLen = BUF_SIZE; + break; + } + } + } + + while (len >= BUF_SIZE) { + processData(inp, inOff, BUF_SIZE, out, outOff + resultLen); + poly1305.update(out, outOff + resultLen, BUF_SIZE); + inOff += BUF_SIZE; + len -= BUF_SIZE; + resultLen += BUF_SIZE; + } + + if (len > 0) { + utils.arrayCopy(inp, inOff, _buf, 0, len); + _bufPos = len; + } + break; + } + default: + throw StateError(''); + } + + return resultLen; + } + + @override + int doFinal(Uint8List out, int outOff) { + if (outOff < 0) { + throw ArgumentError('\'outOff\' cannot be negative'); + } + + checkData(); + + for (var i = 0; i < _mac.length; i++) { + _mac[i] = 0x00; + } + + var resultLen = 0; + + switch (_state) { + case State.DEC_DATA: + { + if (_bufPos < MAC_SIZE) { + throw ArgumentError('data too short'); + } + + resultLen = _bufPos - MAC_SIZE; + + if (outOff > (out.length - resultLen)) { + throw ArgumentError('Output buffer too short'); + } + + if (resultLen > 0) { + poly1305.update(_buf, 0, resultLen); + processData(_buf, 0, resultLen, out, outOff); + } + + finishData(State.DEC_FINAL); + + if (!utils.constantTimeAreEqualOffset( + MAC_SIZE, _mac, 0, _buf, resultLen)) { + throw ArgumentError('mac check in ChaCha20Poly1305 failed'); + } + + break; + } + case State.ENC_DATA: + { + resultLen = _bufPos + MAC_SIZE; + + // ignore: invariant_booleans + if (outOff > (out.length - resultLen)) { + throw ArgumentError('Output buffer too short'); + } + + if (_bufPos > 0) { + processData(_buf, 0, _bufPos, out, outOff); + poly1305.update(out, outOff, _bufPos); + } + + finishData(State.ENC_FINAL); + + utils.arrayCopy(_mac, 0, out, outOff + _bufPos, MAC_SIZE); + break; + } + default: + throw StateError(''); + } + + resetBool(false, true); + + return resultLen; + } + + @override + void reset() { + resetBool(true, true); + } + + void resetBool(bool clearMac, bool resetCipher) { + for (var i = 0; i < _buf.length; i++) { + _buf[i] = 0; + } + + if (clearMac) { + for (var i = 0; i < _mac.length; i++) { + _mac[i] = 0x00; + } + } + + _aadCount = 0; + _dataCount = 0; + _bufPos = 0; + + switch (_state) { + case State.DEC_INIT: + case State.ENC_INIT: + break; + case State.DEC_AAD: + case State.DEC_DATA: + case State.DEC_FINAL: + _state = State.DEC_INIT; + break; + case State.ENC_AAD: + case State.ENC_DATA: + case State.ENC_FINAL: + _state = State.ENC_FINAL; + return; + default: + throw StateError(''); + } + + if (resetCipher) { + chacha20.reset(); + } + + initMAC(); + + if (_initialAAD != null) { + processAADBytes(_initialAAD!, 0, _initialAAD!.length); + } + } + + void checkAAD() { + switch (_state) { + case State.DEC_INIT: + _state = State.DEC_AAD; + break; + case State.ENC_INIT: + _state = State.ENC_AAD; + break; + case State.DEC_AAD: + case State.ENC_AAD: + break; + case State.ENC_FINAL: + throw StateError('ChaCha20Poly1305 cannot be reused for encryption'); + default: + throw StateError(''); + } + } + + void checkData() { + switch (_state) { + case State.DEC_INIT: + case State.DEC_AAD: + finishAAD(State.DEC_DATA); + break; + case State.ENC_INIT: + case State.ENC_AAD: + finishAAD(State.ENC_DATA); + break; + case State.DEC_DATA: + case State.ENC_DATA: + break; + case State.ENC_FINAL: + throw StateError('ChaCha20Poly1305 cannot be reused for encryption'); + default: + throw StateError(''); + } + } + + void finishAAD(int nextState) { + padMAC(_aadCount); + + _state = nextState; + } + + void finishData(int nextState) { + padMAC(_dataCount); + + var lengths = Uint8List(16); + pack32(_aadCount, lengths, 0, Endian.little); + pack32(_dataCount, lengths, 8, Endian.little); + poly1305.update(lengths, 0, 16); + + poly1305.doFinal(_mac, 0); + + _state = nextState; + } + + int incrementCount(int count, int increment, int limit) { + if (count + MIN > (limit - increment) + MIN) { + throw StateError('Limit exceeded'); + } + + return count + increment; + } + + void initMAC() { + var firstBlock = Uint8List(64); + try { + chacha20.processBytes(firstBlock, 0, 64, firstBlock, 0); + poly1305.init(KeyParameter.offset(firstBlock, 0, 32)); + } finally { + for (var i = 0; i < firstBlock.length; i++) { + firstBlock[i] = 0; + } + } + } + + void padMAC(int count) { + var partial = (count & 4294967295) & (MAC_SIZE - 1); + if (0 != partial) { + poly1305.update(ZEROES, 0, MAC_SIZE - partial); + } + } + + void processData( + Uint8List inp, int inOff, int inLen, Uint8List out, int outOff) { + if (outOff > (out.length - inLen)) { + throw ArgumentError('Output buffer too short'); + } + + chacha20.processBytes(inp, inOff, inLen, out, outOff); + + _dataCount = incrementCount(_dataCount, inLen, DATA_LIMIT); + } +} + +class State { + static const UNINITIALIZED = 0; + static const ENC_INIT = 1; + static const ENC_AAD = 2; + static const ENC_DATA = 3; + static const ENC_FINAL = 4; + static const DEC_INIT = 5; + static const DEC_AAD = 6; + static const DEC_DATA = 7; + static const DEC_FINAL = 8; +} diff --git a/pointycastle/lib/stream/chacha7539.dart b/pointycastle/lib/stream/chacha7539.dart new file mode 100644 index 0000000..8c074d4 --- /dev/null +++ b/pointycastle/lib/stream/chacha7539.dart @@ -0,0 +1,315 @@ +library impl.stream_cipher.chacha7539; + +import 'dart:typed_data'; + +import '../export.dart'; +import '../api.dart'; +import '../src/impl/base_stream_cipher.dart'; +import '../src/registry/registry.dart'; +import '../src/ufixnum.dart'; + +// ignore_for_file: omit_local_variable_types, prefer_single_quotes +// ignore_for_file: non_constant_identifier_names, directives_ordering +// ignore_for_file: prefer_typing_uninitialized_variables, camel_case_types +// ignore_for_file: annotate_overrides + +/// RFC version of Daniel J. Bernstein's ChaCha20. This uses a 12 byte IV, among +/// other changes. +class ChaCha7539Engine extends BaseStreamCipher { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.prefix( + StreamCipher, + 'ChaCha7539/', + (_, final Match match) => () { + var rounds = int.parse(match.group(1)!); + return ChaCha7539Engine.fromRounds(rounds); + }); + + ChaCha7539Engine() { + rounds = 20; + } + + ChaCha7539Engine.fromRounds(this.rounds); + + int rounds = 20; + + static const STATE_SIZE = 16; + + static final _sigma = Uint8List.fromList([ + 101, + 120, + 112, + 97, + 110, + 100, + 32, + 51, + 50, + 45, + 98, + 121, + 116, + 101, + 32, + 107 + ]); + static final _tau = Uint8List.fromList([ + 101, + 120, + 112, + 97, + 110, + 100, + 32, + 49, + 54, + 45, + 98, + 121, + 116, + 101, + 32, + 107 + ]); + + Uint8List? _workingKey; + late Uint8List _workingIV; + + final _state = List.filled(STATE_SIZE, 0, growable: false); + final _buffer = List.filled(STATE_SIZE, 0, growable: false); + + final _keyStream = Uint8List(STATE_SIZE * 4); + var _keyStreamOffset = 0; + + var _initialised = false; + + @override + String get algorithmName => 'ChaCha7539/$rounds'; + + @override + void reset() { + _state[12] = 0; + if (_workingKey != null) { + _setKey(_workingKey!, _workingIV); + } + } + + @override + void init( + bool forEncryption, covariant ParametersWithIV params) { + var uparams = params.parameters; + var iv = params.iv; + if (iv.length != 12) { + throw ArgumentError('ChaCha20-7539 requires exactly 12 bytes of IV'); + } + + _workingIV = iv; + _workingKey = uparams!.key; + + _setKey(_workingKey!, _workingIV); + } + + @override + int returnByte(int inp) { + if (_keyStreamOffset == 0) { + generateKeyStream(_keyStream); + + if (++_state[12] == 0) { + ++_state[13]; + } + } + + var out = clip8(_keyStream[_keyStreamOffset] ^ inp); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + + return out; + } + + @override + void processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if (!_initialised) { + throw StateError('ChaCha20 not initialized: please call init() first'); + } + + if ((inpOff + len) > inp.length) { + throw ArgumentError( + 'Input buffer too short or requested length too long'); + } + + if ((outOff + len) > out.length) { + throw ArgumentError( + 'Output buffer too short or requested length too long'); + } + + for (var i = 0; i < len; i++) { + if (_keyStreamOffset == 0) { + generateKeyStream(_keyStream); + + if (++_state[12] == 0) throw StateError('Illegal increase of counter'); + } + + out[i + outOff] = clip8(_keyStream[_keyStreamOffset] ^ inp[i + inpOff]); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + } + } + + void _setKey(Uint8List keyBytes, Uint8List ivBytes) { + _workingKey = keyBytes; + _workingIV = ivBytes; + + _keyStreamOffset = 0; + Uint8List constants; + + if (_workingKey!.length == 32) { + constants = _sigma; + } else { + constants = _tau; + } + + //Key + _state[4] = unpack32(_workingKey, 0, Endian.little); + _state[5] = unpack32(_workingKey, 4, Endian.little); + _state[6] = unpack32(_workingKey, 8, Endian.little); + _state[7] = unpack32(_workingKey, 12, Endian.little); + _state[8] = unpack32(_workingKey, 16, Endian.little); + _state[9] = unpack32(_workingKey, 20, Endian.little); + _state[10] = unpack32(_workingKey, 24, Endian.little); + _state[11] = unpack32(_workingKey, 28, Endian.little); + + _state[0] = unpack32(constants, 0, Endian.little); + _state[1] = unpack32(constants, 4, Endian.little); + _state[2] = unpack32(constants, 8, Endian.little); + _state[3] = unpack32(constants, 12, Endian.little); + + _state[12] = 0; + + // IV + var off = 0; + for (var i = 0; i < 3; ++i) { + _state[13 + i] = unpack32(_workingIV, off, Endian.little); + off += 4; + } + + _initialised = true; + } + + void generateKeyStream(Uint8List output) { + _core(rounds, _state, _buffer); + var outOff = 0; + for (var x in _buffer) { + pack32(x, output, outOff, Endian.little); + outOff += 4; + } + } + + /// The ChaCha20 core function + void _core(int rounds, List input, List x) { + var x00 = input[0]; + var x01 = input[1]; + var x02 = input[2]; + var x03 = input[3]; + var x04 = input[4]; + var x05 = input[5]; + var x06 = input[6]; + var x07 = input[7]; + var x08 = input[8]; + var x09 = input[9]; + var x10 = input[10]; + var x11 = input[11]; + var x12 = input[12]; + var x13 = input[13]; + var x14 = input[14]; + var x15 = input[15]; + + for (var i = rounds; i > 0; i -= 2) { + x00 += x04; + x12 = crotl32(x12 ^ x00, 16); + x08 += x12; + x04 = crotl32(x04 ^ x08, 12); + x00 += x04; + x12 = crotl32(x12 ^ x00, 8); + x08 += x12; + x04 = crotl32(x04 ^ x08, 7); + x01 += x05; + x13 = crotl32(x13 ^ x01, 16); + x09 += x13; + x05 = crotl32(x05 ^ x09, 12); + x01 += x05; + x13 = crotl32(x13 ^ x01, 8); + x09 += x13; + x05 = crotl32(x05 ^ x09, 7); + x02 += x06; + x14 = crotl32(x14 ^ x02, 16); + x10 += x14; + x06 = crotl32(x06 ^ x10, 12); + x02 += x06; + x14 = crotl32(x14 ^ x02, 8); + x10 += x14; + x06 = crotl32(x06 ^ x10, 7); + x03 += x07; + x15 = crotl32(x15 ^ x03, 16); + x11 += x15; + x07 = crotl32(x07 ^ x11, 12); + x03 += x07; + x15 = crotl32(x15 ^ x03, 8); + x11 += x15; + x07 = crotl32(x07 ^ x11, 7); + x00 += x05; + x15 = crotl32(x15 ^ x00, 16); + x10 += x15; + x05 = crotl32(x05 ^ x10, 12); + x00 += x05; + x15 = crotl32(x15 ^ x00, 8); + x10 += x15; + x05 = crotl32(x05 ^ x10, 7); + x01 += x06; + x12 = crotl32(x12 ^ x01, 16); + x11 += x12; + x06 = crotl32(x06 ^ x11, 12); + x01 += x06; + x12 = crotl32(x12 ^ x01, 8); + x11 += x12; + x06 = crotl32(x06 ^ x11, 7); + x02 += x07; + x13 = crotl32(x13 ^ x02, 16); + x08 += x13; + x07 = crotl32(x07 ^ x08, 12); + x02 += x07; + x13 = crotl32(x13 ^ x02, 8); + x08 += x13; + x07 = crotl32(x07 ^ x08, 7); + x03 += x04; + x14 = crotl32(x14 ^ x03, 16); + x09 += x14; + x04 = crotl32(x04 ^ x09, 12); + x03 += x04; + x14 = crotl32(x14 ^ x03, 8); + x09 += x14; + x04 = crotl32(x04 ^ x09, 7); + } + var xup = [ + x00, + x01, + x02, + x03, + x04, + x05, + x06, + x07, + x08, + x09, + x10, + x11, + x12, + x13, + x14, + x15 + ]; + for (var i = 0; i < STATE_SIZE; ++i) { + x[i] = csum32(xup[i], input[i]); + } + } + + @override + dynamic noSuchMethod(Invocation invocation); +} diff --git a/pointycastle/lib/stream/ctr.dart b/pointycastle/lib/stream/ctr.dart new file mode 100644 index 0000000..76adefe --- /dev/null +++ b/pointycastle/lib/stream/ctr.dart @@ -0,0 +1,23 @@ +// See file LICENSE for more information. + +library impl.stream_cipher.ctr; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/stream/sic.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Just an alias to be able to create SIC as CTR +class CTRStreamCipher extends SICStreamCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + StreamCipher, + '/CTR', + (_, final Match match) => () { + var digestName = match.group(1); + return CTRStreamCipher(BlockCipher(digestName!)); + }); + + CTRStreamCipher(super.underlyingCipher); + @override + String get algorithmName => '${underlyingCipher.algorithmName}/CTR'; +} diff --git a/pointycastle/lib/stream/eax.dart b/pointycastle/lib/stream/eax.dart new file mode 100644 index 0000000..30eb17e --- /dev/null +++ b/pointycastle/lib/stream/eax.dart @@ -0,0 +1,311 @@ +// See file LICENSE for more information. + +library impl.stream_cipher.eax; + +import 'dart:core'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/macs/cmac.dart'; +import 'package:pointycastle/src/impl/base_aead_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:pointycastle/stream/ctr.dart'; + +/// EAX mode based on CTR and CMAC/OMAC1. +/// +/// Encrypts plaintext and outputs the ciphertext with the concatenated mac. +/// Decrypts and verifies ciphertext with the concatenated mac and returns the plaintext. +/// Ported from BouncyCastle's Java impl: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/modes/EAXBlockCipher.java +class EAX extends BaseAEADCipher { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + AEADCipher, + '/EAX', + (_, final Match match) => () { + var digestName = match.group(1); + return EAX(BlockCipher(digestName!)); + }); + + static const _nonceTAG = 0x0; + static const _aadTAG = 0x1; + static const _cipherTAG = 0x2; + + final CTRStreamCipher _ctr; + final CMac _cMac; + late bool _forEncryption; + late KeyParameter _keyParam; + late CipherParameters _initParams; + late Uint8List _nonceMac; + late Uint8List _aadMac; + late Uint8List _cipherMac; + late Uint8List _bufBlock; + late int _bufOff; + late bool _bufFull; + late bool _aadFinished; + + int get _blockSize => underlyingCipher.blockSize; + + /// The cipher used in CTR and CMAC + final BlockCipher underlyingCipher; + + int _macSize; + + /// The byte size that the [mac] calculated by [doFinal] must be. + int get macSize => _macSize; + + /// The MAC (also known as Tag), calculated and cached by [doFinal]. + /// + /// Will not be cleared on [reset] or [init]. + @override + late Uint8List mac; + + @override + String get algorithmName => '${underlyingCipher.algorithmName}/EAX'; + + EAX(this.underlyingCipher) + : _ctr = CTRStreamCipher(underlyingCipher), + _cMac = CMac(underlyingCipher, underlyingCipher.blockSize * 8), + _macSize = underlyingCipher.blockSize ~/ 2; + + /// Initializes this for addition of AAD and en/decryption of data. + @override + void init(bool forEncryption, CipherParameters params) { + _forEncryption = forEncryption; + _initParams = params; + Uint8List initNonce; + Uint8List? initAAD; + + if (params is AEADParameters) { + _macSize = params.macSize ~/ 8; + _keyParam = params.parameters as KeyParameter; + initNonce = params.nonce; + initAAD = params.associatedData; + } else if (params is ParametersWithIV) { + _keyParam = params.parameters as KeyParameter; + initNonce = params.iv; + } else { + throw ArgumentError( + '${params.runtimeType} is not ParametersWithIV or AEADParameters', + 'params'); + } + + _nonceMac = Uint8List(_blockSize); + _cMac + ..init(_keyParam) + ..update( + Uint8List(_blockSize)..[_blockSize - 1] = _nonceTAG, 0, _blockSize) + ..update(initNonce, 0, initNonce.length) + ..doFinal(_nonceMac, 0); + + _aadFinished = false; + _aadMac = Uint8List(_blockSize); + _cMac + ..init(_keyParam) + ..update( + Uint8List(_blockSize)..[_blockSize - 1] = _aadTAG, 0, _blockSize); + if (initAAD != null) processAADBytes(initAAD, 0, initAAD.length); + + _cipherMac = Uint8List(_blockSize); + _ctr.init(_forEncryption, ParametersWithIV(_keyParam, _nonceMac)); + + _bufBlock = Uint8List(_macSize); + _bufOff = 0; + _bufFull = false; + } + + /// Calculates, caches and if used as decrypter also verifies this [mac], + /// calls [reset] and returns the number of bytes written. + @override + int doFinal(Uint8List out, int outOff) { + _cMac.doFinal(_cipherMac, 0); + _calculateMac(); + + if (_forEncryption) { + if (out.length < outOff + _macSize) { + throw ArgumentError( + 'actual length: ${out.length}, ' + 'min: ${outOff + _macSize}', + 'out'); + } + out.setAll(outOff, mac); + + reset(); + return _macSize; + } else { + if (!_bufFull) { + throw StateError('Did not process enough data ' + 'for MAC to be collected from input.'); + } + if (!_verifyMac(_inMac, 0)) { + throw StateError('MAC does not match.'); + } + + reset(); + return 0; + } + } + + /// Initializes this with the parameters last given to [init]. + @override + void reset() { + init(_forEncryption, _initParams); + } + + /// Processes further AAD. + /// + /// Must not be used when en-/decryption of data had begun. + @override + void processAADByte(int inp) { + if (_aadFinished) { + throw StateError('Must not be used when en-/decryption ' + 'of data had begun.'); + } + _cMac.updateByte(inp); + } + + /// Processes further AAD. + /// + /// Must not be used after en-/decryption of data has begun. + @override + void processAADBytes(Uint8List inp, int inpOff, int len) { + if (_aadFinished) { + throw StateError('Must not be used when en-/decryption ' + 'of data had begun.'); + } + _cMac.update(inp, inpOff, len); + } + + /// Processes the input and returns the amount of bytes written. + @override + int processByte(int inp, Uint8List out, int outOff) { + _ensureAadMacFinished(); + + var r = out[outOff] = _ctr.returnByte(inp); + + if (_forEncryption) { + _cMac.updateByte(r); + return 1; + } + return _bufByte(inp); + } + + /// Processes the input and returns the amount of bytes written. + @override + int processBytes( + Uint8List inp, int inOff, int len, Uint8List out, int outOff) { + _ensureAadMacFinished(); + + if (_forEncryption) { + _ctr.processBytes(inp, inOff, len, out, outOff); + _cMac.update(out, outOff, len); + return len; + } else { + return _buf(inp, inOff, len, out, outOff); + } + } + + /// Returns the amount of bytes being outputted + /// by the next [processBytes] and [doFinal] for [len] bytes input. + @override + int getOutputSize(int len) { + if (_forEncryption) { + return len + _macSize; + } else if (_bufFull) { + return len; + } else { + return max(0, len + _bufOff - _macSize); + } + } + + /// Returns the amount of bytes being outputted + /// by the next [processBytes] for [len] bytes input. + @override + int getUpdateOutputSize(int len) { + if (_forEncryption) { + return len; + } else if (_bufFull) { + return len; + } else { + return max(0, len + _bufOff - _macSize); + } + } + + /// Returns true if provided [match] is equal to this [mac]. + bool _verifyMac(Uint8List match, int off) { + return constantTimeAreEqualOffset(_macSize, mac, 0, match, off); + } + + void _ensureAadMacFinished() { + if (!_aadFinished) { + _cMac + ..doFinal(_aadMac, 0) + ..init(_keyParam) + ..update(Uint8List(_blockSize)..[_blockSize - 1] = _cipherTAG, 0, + _blockSize); + _aadFinished = true; + } + } + + Uint8List get _inMac { + var inMac = Uint8List(_macSize); + for (var i = 0; i < _macSize; i++) { + inMac[i] = _bufBlock[_bufOff + i]; + } + return inMac; + } + + int _buf(Uint8List inp, int inOff, int len, Uint8List out, int outOff) { + var macLen = min(_macSize, len); + var macOff = inOff + len - macLen; + var processed = len - macLen; + + _cMac.update(inp, inOff, processed); + _ctr.processBytes(inp, inOff, processed, out, outOff); + + for (var i = 0; i < macLen; i++) { + if (_bufFull) { + _cMac.updateByte(_bufBlock[_bufOff]); + out[outOff + processed + i] = _ctr.returnByte(_bufBlock[_bufOff]); + processed++; + } + + _bufBlock[_bufOff] = inp[macOff + i]; + + if (_bufOff == _macSize - 1) { + _bufOff = 0; + _bufFull = true; + } else { + _bufOff++; + } + } + return processed; + } + + int _bufByte(int inp) { + var r = 1; + if (_bufFull) { + _cMac.updateByte(_bufBlock[_bufOff]); + _ctr.returnByte(_bufBlock[_bufOff]); + } else { + r = 0; + } + + _bufBlock[_bufOff] = inp; + + if (_bufOff == 15) { + _bufOff = 0; + _bufFull = true; + } else { + _bufOff++; + } + return r; + } + + void _calculateMac() { + mac = Uint8List(_macSize); + for (var i = 0; i < _macSize; i++) { + mac[i] = _nonceMac[i] ^ _aadMac[i] ^ _cipherMac[i]; + } + } +} diff --git a/pointycastle/lib/stream/rc4_engine.dart b/pointycastle/lib/stream/rc4_engine.dart new file mode 100644 index 0000000..dd72c43 --- /dev/null +++ b/pointycastle/lib/stream/rc4_engine.dart @@ -0,0 +1,114 @@ +library impl.stream_cipher.rc4_engine; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_stream_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +class RC4Engine extends BaseStreamCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(StreamCipher, 'RC4', () => RC4Engine()); + + static int STATE_LENGTH = 256; + + Uint8List? _engineState; + int _x = 0; + int _y = 0; + late Uint8List _workingKey; + + @override + String get algorithmName => 'RC4'; + + @override + void init(bool forEncryption, CipherParameters? params) { + if (params != null) { + if (params is KeyParameter) { + _workingKey = params.key; + setKey(params.key); + } else { + throw ArgumentError('Parameters of invalid type'); + } + } else { + throw ArgumentError('Missing parameter'); + } + } + + @override + Uint8List process(Uint8List data) { + var out = Uint8List(data.length); + processBytes(data, 0, data.length, out, 0); + return out; + } + + @override + void processBytes( + Uint8List inp, int inpOff, int len, Uint8List out, int outOff) { + if ((inpOff + len) > inp.length) { + throw ArgumentError('input buffer too short'); + } + + if ((outOff + len) > out.length) { + throw ArgumentError('output buffer too short'); + } + + for (var i = 0; i < len; i++) { + _x = (_x + 1) & 0xff; + _y = (_engineState![_x] + _y) & 0xff; + + // swap + var tmp = _engineState![_x]; + _engineState![_x] = _engineState![_y]; + _engineState![_y] = tmp; + + // xor + out[i + outOff] = inp[i + inpOff] ^ + _engineState![(_engineState![_x] + _engineState![_y]) & 0xff]; + } + } + + @override + void reset() { + setKey(_workingKey); + } + + @override + int returnByte(int inp) { + _x = (_x + 1) & 0xff; + _y = (_engineState![_x] + _y) & 0xff; + + // swap + var tmp = _engineState![_x]; + _engineState![_x] = _engineState![_y]; + _engineState![_y] = tmp; + + // xor + return inp ^ _engineState![(_engineState![_x] + _engineState![_y]) & 0xff]; + } + + void setKey(Uint8List keyBytes) { + _workingKey = keyBytes; + + _x = 0; + _y = 0; + + _engineState ??= Uint8List(STATE_LENGTH); + + // reset the state of the engine + for (var i = 0; i < STATE_LENGTH; i++) { + _engineState![i] = i; + } + + var i1 = 0; + var i2 = 0; + + for (var i = 0; i < STATE_LENGTH; i++) { + i2 = ((keyBytes[i1] & 0xff) + _engineState![i] + i2) & 0xff; + // do the byte-swap inline + var tmp = _engineState![i]; + _engineState![i] = _engineState![i2]; + _engineState![i2] = tmp; + i1 = (i1 + 1) % keyBytes.length; + } + } +} diff --git a/pointycastle/lib/stream/salsa20.dart b/pointycastle/lib/stream/salsa20.dart new file mode 100644 index 0000000..d81aa1c --- /dev/null +++ b/pointycastle/lib/stream/salsa20.dart @@ -0,0 +1,195 @@ +// See file LICENSE for more information. + +library impl.stream_cipher.salsa20; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_stream_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// Implementation of Daniel J. Bernstein's Salsa20 stream cipher, Snuffle 2005. +class Salsa20Engine extends BaseStreamCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(StreamCipher, 'Salsa20', () => Salsa20Engine()); + + static const _STATE_SIZE = 16; + + static final _sigma = Uint8List.fromList('expand 32-byte k'.codeUnits); + static final _tau = Uint8List.fromList('expand 16-byte k'.codeUnits); + + Uint8List? _workingKey; + late Uint8List _workingIV; + + final _state = List.filled(_STATE_SIZE, 0, growable: false); + final _buffer = List.filled(_STATE_SIZE, 0, growable: false); + + final _keyStream = Uint8List(_STATE_SIZE * 4); + var _keyStreamOffset = 0; + + var _initialised = false; + + @override + final String algorithmName = 'Salsa20'; + + @override + void reset() { + if (_workingKey != null) { + _setKey(_workingKey!, _workingIV); + } + } + + @override + void init( + bool forEncryption, covariant ParametersWithIV params) { + var uparams = params.parameters; + var iv = params.iv; + if (iv.length != 8) { + throw ArgumentError('Salsa20 requires exactly 8 bytes of IV'); + } + + _workingIV = iv; + _workingKey = uparams!.key; + + _setKey(_workingKey!, _workingIV); + } + + @override + int returnByte(int inp) { + if (_keyStreamOffset == 0) { + _generateKeyStream(_keyStream); + + if (++_state[8] == 0) { + ++_state[9]; + } + } + + var out = clip8(_keyStream[_keyStreamOffset] ^ inp); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + + return out; + } + + @override + void processBytes( + Uint8List? inp, int inpOff, int len, Uint8List? out, int outOff) { + if (!_initialised) { + throw StateError('Salsa20 not initialized: please call init() first'); + } + + if ((inpOff + len) > inp!.length) { + throw ArgumentError( + 'Input buffer too short or requested length too long'); + } + + if ((outOff + len) > out!.length) { + throw ArgumentError( + 'Output buffer too short or requested length too long'); + } + + for (var i = 0; i < len; i++) { + if (_keyStreamOffset == 0) { + _generateKeyStream(_keyStream); + + if (++_state[8] == 0) { + ++_state[9]; + } + } + + out[i + outOff] = clip8(_keyStream[_keyStreamOffset] ^ inp[i + inpOff]); + _keyStreamOffset = (_keyStreamOffset + 1) & 63; + } + } + + void _setKey(Uint8List keyBytes, Uint8List ivBytes) { + _workingKey = keyBytes; + _workingIV = ivBytes; + + _keyStreamOffset = 0; + var offset = 0; + Uint8List constants; + + // Key + _state[1] = unpack32(_workingKey, 0, Endian.little); + _state[2] = unpack32(_workingKey, 4, Endian.little); + _state[3] = unpack32(_workingKey, 8, Endian.little); + _state[4] = unpack32(_workingKey, 12, Endian.little); + + if (_workingKey!.length == 32) { + constants = _sigma; + offset = 16; + } else { + constants = _tau; + } + + _state[11] = unpack32(_workingKey, offset, Endian.little); + _state[12] = unpack32(_workingKey, offset + 4, Endian.little); + _state[13] = unpack32(_workingKey, offset + 8, Endian.little); + _state[14] = unpack32(_workingKey, offset + 12, Endian.little); + _state[0] = unpack32(constants, 0, Endian.little); + _state[5] = unpack32(constants, 4, Endian.little); + _state[10] = unpack32(constants, 8, Endian.little); + _state[15] = unpack32(constants, 12, Endian.little); + + // IV + _state[6] = unpack32(_workingIV, 0, Endian.little); + _state[7] = unpack32(_workingIV, 4, Endian.little); + _state[8] = _state[9] = 0; + + _initialised = true; + } + + void _generateKeyStream(Uint8List output) { + _salsa20Core(20, _state, _buffer); + var outOff = 0; + for (var x in _buffer) { + pack32(x, output, outOff, Endian.little); + outOff += 4; + } + } + + /// The Salsa20 core function + void _salsa20Core(int rounds, List input, List x) { + x.setAll(0, input); + + for (var i = rounds; i > 0; i -= 2) { + x[4] ^= crotl32(x[0] + x[12], 7); + x[8] ^= crotl32(x[4] + x[0], 9); + x[12] ^= crotl32(x[8] + x[4], 13); + x[0] ^= crotl32(x[12] + x[8], 18); + x[9] ^= crotl32(x[5] + x[1], 7); + x[13] ^= crotl32(x[9] + x[5], 9); + x[1] ^= crotl32(x[13] + x[9], 13); + x[5] ^= crotl32(x[1] + x[13], 18); + x[14] ^= crotl32(x[10] + x[6], 7); + x[2] ^= crotl32(x[14] + x[10], 9); + x[6] ^= crotl32(x[2] + x[14], 13); + x[10] ^= crotl32(x[6] + x[2], 18); + x[3] ^= crotl32(x[15] + x[11], 7); + x[7] ^= crotl32(x[3] + x[15], 9); + x[11] ^= crotl32(x[7] + x[3], 13); + x[15] ^= crotl32(x[11] + x[7], 18); + x[1] ^= crotl32(x[0] + x[3], 7); + x[2] ^= crotl32(x[1] + x[0], 9); + x[3] ^= crotl32(x[2] + x[1], 13); + x[0] ^= crotl32(x[3] + x[2], 18); + x[6] ^= crotl32(x[5] + x[4], 7); + x[7] ^= crotl32(x[6] + x[5], 9); + x[4] ^= crotl32(x[7] + x[6], 13); + x[5] ^= crotl32(x[4] + x[7], 18); + x[11] ^= crotl32(x[10] + x[9], 7); + x[8] ^= crotl32(x[11] + x[10], 9); + x[9] ^= crotl32(x[8] + x[11], 13); + x[10] ^= crotl32(x[9] + x[8], 18); + x[12] ^= crotl32(x[15] + x[14], 7); + x[13] ^= crotl32(x[12] + x[15], 9); + x[14] ^= crotl32(x[13] + x[12], 13); + x[15] ^= crotl32(x[14] + x[13], 18); + } + + for (var i = 0; i < _STATE_SIZE; ++i) { + x[i] = sum32(x[i], input[i]); + } + } +} diff --git a/pointycastle/lib/stream/sic.dart b/pointycastle/lib/stream/sic.dart new file mode 100644 index 0000000..b89c9bb --- /dev/null +++ b/pointycastle/lib/stream/sic.dart @@ -0,0 +1,99 @@ +// See file LICENSE for more information. + +library impl.stream_cipher.sic; + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_stream_cipher.dart'; +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// Implementation of SIC mode of operation as a [StreamCipher]. This implementation uses the IV as the initial nonce value and +/// keeps incrementing it by 1 for every block. The counter may overflow and rotate, and that would cause a two-time-pad +/// error, but this is so unlikely to happen for usual block sizes that we don't check for that event. It is the responsibility +/// of the caller to make sure the counter does not overflow. +class SICStreamCipher extends BaseStreamCipher { + /// Intended for internal use. + // ignore: non_constant_identifier_names + static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix( + StreamCipher, + '/SIC', + (_, final Match match) => () { + var digestName = match.group(1); + return SICStreamCipher(BlockCipher(digestName!)); + }); + + final BlockCipher underlyingCipher; + + late Uint8List _iv; + late Uint8List _counter; + late Uint8List _counterOut; + late int _consumed; + + SICStreamCipher(this.underlyingCipher) { + _iv = Uint8List(underlyingCipher.blockSize); + _counter = Uint8List(underlyingCipher.blockSize); + _counterOut = Uint8List(underlyingCipher.blockSize); + } + + @override + String get algorithmName => '${underlyingCipher.algorithmName}/SIC'; + + @override + void reset() { + underlyingCipher.reset(); + _counter.setAll(0, _iv); + _counterOut.fillRange(0, _counterOut.length, 0); + _consumed = _counterOut.length; + } + + @override + void init(bool forEncryption, covariant ParametersWithIV params) { + _iv.setAll(0, params.iv); + reset(); + underlyingCipher.init(true, params.parameters); + } + + @override + void processBytes( + Uint8List? inp, int inpOff, int len, Uint8List? out, int outOff) { + for (var i = 0; i < len; i++) { + out![outOff + i] = returnByte(inp![inpOff + i]); + } + } + + @override + int returnByte(int inp) { + _feedCounterIfNeeded(); + return clip8(inp) ^ _counterOut[_consumed++]; + } + + /// Calls [_feedCounter] if all [_counterOut] bytes have been consumed + void _feedCounterIfNeeded() { + if (_consumed >= _counterOut.length) { + _feedCounter(); + } + } + + // ignore: slash_for_doc_comments + /// Fills [_counterOut] with a value got from encrypting [_counter] with + /// the _underlyingCipher, resets [_consumed] to 0 and increments the + /// [_counter]. + void _feedCounter() { + underlyingCipher.processBlock(_counter, 0, _counterOut, 0); + _incrementCounter(); + _consumed = 0; + } + + /// Increments [_counter] by 1 + void _incrementCounter() { + int i; + for (i = _counter.lengthInBytes - 1; i >= 0; i--) { + var val = _counter[i]; + val++; + _counter[i] = val; + if (_counter[i] != 0) break; + } + } +} diff --git a/pointycastle/pubspec.yaml b/pointycastle/pubspec.yaml new file mode 100644 index 0000000..c4571de --- /dev/null +++ b/pointycastle/pubspec.yaml @@ -0,0 +1,21 @@ +name: pointycastle +version: 4.0.0 +description: A Dart library implementing cryptographic algorithms and primitives, modeled on the BouncyCastle library. +homepage: https://github.com/bcgit/pc-dart +topics: + - crypto + - rsa + - ecc + - asn1 + +environment: + sdk: ^3.2.0 + +dependencies: + collection: ^1.15.0 + convert: ^3.0.0 + +dev_dependencies: + benchmark_harness: ^2.0.0 + lints: ^3.0.0 + test: ^1.16.0 diff --git a/pointycastle/test/adapters/stream_cipher_as_block_cipher_test.dart b/pointycastle/test/adapters/stream_cipher_as_block_cipher_test.dart new file mode 100644 index 0000000..a629bd7 --- /dev/null +++ b/pointycastle/test/adapters/stream_cipher_as_block_cipher_test.dart @@ -0,0 +1,22 @@ +// See file LICENSE for more information. + +import 'package:test/test.dart'; +import 'package:pointycastle/adapters/stream_cipher_as_block_cipher.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/helpers.dart'; +import '../test/src/null_stream_cipher.dart'; + +void main() { + var cbc = StreamCipherAsBlockCipher(16, NullStreamCipher()); + group('StreamCipherAsBlockCipher:', () { + runBlockCipherTests(cbc, null, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + formatBytesAsHexString(createUint8ListFromString( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........')), + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + formatBytesAsHexString(createUint8ListFromString( + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...')), + ]); + }); +} diff --git a/pointycastle/test/asn1/asn1_all_test-disabled.dart b/pointycastle/test/asn1/asn1_all_test-disabled.dart new file mode 100644 index 0000000..161b0e0 --- /dev/null +++ b/pointycastle/test/asn1/asn1_all_test-disabled.dart @@ -0,0 +1,40 @@ +/// +/// Collection of ASN1 related tests. +/// Invoker for <-->/all_tests_web.dart +/// +library; + +import 'asn1_object_test.dart' as object_test; +import 'asn1_utils_test.dart' as utils_test; +import 'primitives/asn1_bit_string_test.dart' as p_bitstring_test; +import 'primitives/asn1_boolean_test.dart' as p_boolean_test; +import 'primitives/asn1_enumerated_test.dart' as p_enumerated_test; +import 'primitives/asn1_ia5_string_test.dart' as p_ia5string_test; +import 'primitives/asn1_integer_test.dart' as p_integer_test; +import 'primitives/asn1_null_test.dart' as p_null_test; +import 'primitives/asn1_object_identifier_test.dart' as p_oid_test; +import 'primitives/asn1_octet_string_test.dart' as p_octet_string_test; +import 'primitives/asn1_printable_string_test.dart' as p_printable_string_test; +import 'primitives/asn1_sequence_test.dart' as p_sequence_test; +import 'primitives/asn1_set_test.dart' as p_set_test; +import 'primitives/asn1_utc_time_test.dart' as p_utc_time_test; +import 'primitives/asn1_utf8_string_test.dart' as p_utf8_string_test; + +void main() { + object_test.main(); + utils_test.main(); + + p_bitstring_test.main(); + p_boolean_test.main(); + p_enumerated_test.main(); + p_ia5string_test.main(); + p_integer_test.main(); + p_null_test.main(); + p_oid_test.main(); + p_octet_string_test.main(); + p_printable_string_test.main(); + p_sequence_test.main(); + p_set_test.main(); + p_utc_time_test.main(); + p_utf8_string_test.main(); +} diff --git a/pointycastle/test/asn1/asn1_dump_test.dart b/pointycastle/test/asn1/asn1_dump_test.dart new file mode 100644 index 0000000..c87d339 --- /dev/null +++ b/pointycastle/test/asn1/asn1_dump_test.dart @@ -0,0 +1,153 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; +import 'package:test/test.dart'; + +void main() { + /// + /// Helper method + /// + List chunk(String s, int chunkSize) { + var chunked = []; + for (var i = 0; i < s.length; i += chunkSize) { + var end = (i + chunkSize < s.length) ? i + chunkSize : s.length; + chunked.add(s.substring(i, end)); + } + return chunked; + } + + var dump1 = '''SEQUENCE (4 elem) + SEQUENCE (3 elem) + OBJECT IDENTIFIER 2.5.29.15 keyUsage + BOOLEAN true + OCTET STRING (4 byte) 03020186 + SEQUENCE (3 elem) + OBJECT IDENTIFIER 2.5.29.19 basicConstraints + BOOLEAN true + OCTET STRING (5 byte) 30030101FF + SEQUENCE (2 elem) + OBJECT IDENTIFIER 2.5.29.14 subjectKeyIdentifier + OCTET STRING (22 byte) 041403DE503556D14CBB66F0A3E21B1BC397B23DD155 + SEQUENCE (2 elem) + OBJECT IDENTIFIER 2.5.29.35 authorityKeyIdentifier + OCTET STRING (24 byte) 3016801403DE503556D14CBB66F0A3E21B1BC397B23DD155'''; + + test('Test asn1 dump', () { + var outer = ASN1Sequence.fromBytes(Uint8List.fromList([ + 0x30, + 0x61, + 0x30, + 0x0E, + 0x06, + 0x03, + 0x55, + 0x1D, + 0x0F, + 0x01, + 0x01, + 0xFF, + 0x04, + 0x04, + 0x03, + 0x02, + 0x01, + 0x86, + 0x30, + 0x0F, + 0x06, + 0x03, + 0x55, + 0x1D, + 0x13, + 0x01, + 0x01, + 0xFF, + 0x04, + 0x05, + 0x30, + 0x03, + 0x01, + 0x01, + 0xFF, + 0x30, + 0x1D, + 0x06, + 0x03, + 0x55, + 0x1D, + 0x0E, + 0x04, + 0x16, + 0x04, + 0x14, + 0x03, + 0xDE, + 0x50, + 0x35, + 0x56, + 0xD1, + 0x4C, + 0xBB, + 0x66, + 0xF0, + 0xA3, + 0xE2, + 0x1B, + 0x1B, + 0xC3, + 0x97, + 0xB2, + 0x3D, + 0xD1, + 0x55, + 0x30, + 0x1F, + 0x06, + 0x03, + 0x55, + 0x1D, + 0x23, + 0x04, + 0x18, + 0x30, + 0x16, + 0x80, + 0x14, + 0x03, + 0xDE, + 0x50, + 0x35, + 0x56, + 0xD1, + 0x4C, + 0xBB, + 0x66, + 0xF0, + 0xA3, + 0xE2, + 0x1B, + 0x1B, + 0xC3, + 0x97, + 0xB2, + 0x3D, + 0xD1, + 0x55 + ])); + var chunks = chunk(base64.encode(outer.encode()), 64); + var pem = chunks.join('\r\n'); + + var lines = LineSplitter.split(pem) + .map((line) => line.trim()) + .where((line) => line.isNotEmpty) + .toList(); + + var base64String = lines.join(''); + var bytes = Uint8List.fromList(base64Decode(base64String)); + var asn1Parser = ASN1Parser(bytes); + var topLevelSeq = asn1Parser.nextObject(); + var dump = topLevelSeq.dump(); + expect(dump, dump1); + }); +} diff --git a/pointycastle/test/asn1/asn1_object_test.dart b/pointycastle/test/asn1/asn1_object_test.dart new file mode 100644 index 0000000..43b1567 --- /dev/null +++ b/pointycastle/test/asn1/asn1_object_test.dart @@ -0,0 +1,101 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_object.dart'; +import 'package:pointycastle/asn1/asn1_tags.dart'; +import 'package:test/test.dart'; + +void main() { + test('Test named constructor fromBytes', () { + var bytes = Uint8List.fromList([ + 0x0C, + 0x0E, + 0x6A, + 0x75, + 0x6E, + 0x6B, + 0x64, + 0x72, + 0x61, + 0x67, + 0x6F, + 0x6E, + 0x73, + 0x2E, + 0x64, + 0x65 + ]); + var valueBytes = Uint8List.fromList([ + 0x6A, + 0x75, + 0x6E, + 0x6B, + 0x64, + 0x72, + 0x61, + 0x67, + 0x6F, + 0x6E, + 0x73, + 0x2E, + 0x64, + 0x65 + ]); + var asn1Object = ASN1Object.fromBytes(bytes); + expect(asn1Object.tag, 12); + expect(asn1Object.encodedBytes, bytes); + expect(asn1Object.valueByteLength, 14); + expect(asn1Object.valueStartPosition, 2); + expect(asn1Object.valueBytes, valueBytes); + }); + + test('Test encode', () { + var asn1Object = ASN1Object(tag: ASN1Tags.UTF8_STRING); + asn1Object.valueBytes = Uint8List.fromList([ + 0x6A, + 0x75, + 0x6E, + 0x6B, + 0x64, + 0x72, + 0x61, + 0x67, + 0x6F, + 0x6E, + 0x73, + 0x2E, + 0x64, + 0x65 + ]); + + var bytes = Uint8List.fromList([ + 0x0C, + 0x0E, + 0x6A, + 0x75, + 0x6E, + 0x6B, + 0x64, + 0x72, + 0x61, + 0x67, + 0x6F, + 0x6E, + 0x73, + 0x2E, + 0x64, + 0x65 + ]); + + expect(asn1Object.encode(), bytes); + }); + + test('Test dump', () { + var bytes = Uint8List.fromList([ + 0xA0, + 0x00, + ]); + + var asn1Object = ASN1Object.fromBytes(bytes); + expect('[160] (0 elem)', asn1Object.dump()); + }); +} diff --git a/pointycastle/test/asn1/asn1_parser_test.dart b/pointycastle/test/asn1/asn1_parser_test.dart new file mode 100644 index 0000000..5834325 --- /dev/null +++ b/pointycastle/test/asn1/asn1_parser_test.dart @@ -0,0 +1,336 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/asn1.dart'; +import 'package:test/test.dart'; + +void main() { + /// + /// Test simple structur + /// + /// ``` + /// SEQUENCE (2 elem) + /// OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1) + /// NULL + /// ``` + /// + test('Test nextObject 1', () { + var bytes = Uint8List.fromList([ + 0x30, + 0x0D, + 0x06, + 0x09, + 0x2A, + 0x86, + 0x48, + 0x86, + 0xF7, + 0x0D, + 0x01, + 0x01, + 0x0B, + 0x05, + 0x00 + ]); + var parser = ASN1Parser(bytes); + var sequence = parser.nextObject() as ASN1Sequence; + expect(sequence.encodedBytes!.length, sequence.totalEncodedByteLength); + expect(sequence.elements!.length, 2); + expect(sequence.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(sequence.elements!.elementAt(1) is ASN1Null, true); + }); + + /// + /// Test simple structur + /// + /// ``` + /// SEQUENCE (4 elem) + /// SET (1 elem) + /// SEQUENCE (2 elem) + /// OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component) + /// PrintableString US + /// SET (1 elem) + /// SEQUENCE (2 elem) + /// OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component) + /// PrintableString DigiCert Inc + /// SET (1 elem) + /// SEQUENCE (2 elem) + /// OBJECT IDENTIFIER 2.5.4.11 organizationalUnitName (X.520 DN component) + /// PrintableString www.digicert.com + /// SET (1 elem) + /// SEQUENCE (2 elem) + /// OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component) + /// PrintableString Thawte RSA CA 2018 + /// ``` + /// + test('Test nextObject 2', () { + var bytes = Uint8List.fromList([ + 0x30, + 0x5C, + 0x31, + 0x0B, + 0x30, + 0x09, + 0x06, + 0x03, + 0x55, + 0x04, + 0x06, + 0x13, + 0x02, + 0x55, + 0x53, + 0x31, + 0x15, + 0x30, + 0x13, + 0x06, + 0x03, + 0x55, + 0x04, + 0x0A, + 0x13, + 0x0C, + 0x44, + 0x69, + 0x67, + 0x69, + 0x43, + 0x65, + 0x72, + 0x74, + 0x20, + 0x49, + 0x6E, + 0x63, + 0x31, + 0x19, + 0x30, + 0x17, + 0x06, + 0x03, + 0x55, + 0x04, + 0x0B, + 0x13, + 0x10, + 0x77, + 0x77, + 0x77, + 0x2E, + 0x64, + 0x69, + 0x67, + 0x69, + 0x63, + 0x65, + 0x72, + 0x74, + 0x2E, + 0x63, + 0x6F, + 0x6D, + 0x31, + 0x1B, + 0x30, + 0x19, + 0x06, + 0x03, + 0x55, + 0x04, + 0x03, + 0x13, + 0x12, + 0x54, + 0x68, + 0x61, + 0x77, + 0x74, + 0x65, + 0x20, + 0x52, + 0x53, + 0x41, + 0x20, + 0x43, + 0x41, + 0x20, + 0x32, + 0x30, + 0x31, + 0x38 + ]); + + var parser = ASN1Parser(bytes); + var sequence = parser.nextObject() as ASN1Sequence; + + expect(sequence.encodedBytes!.length, sequence.totalEncodedByteLength); + expect(sequence.elements!.length, 4); + expect(sequence.elements!.elementAt(0) is ASN1Set, true); + expect(sequence.elements!.elementAt(1) is ASN1Set, true); + expect(sequence.elements!.elementAt(2) is ASN1Set, true); + expect(sequence.elements!.elementAt(3) is ASN1Set, true); + + var set1 = sequence.elements!.elementAt(0) as ASN1Set; + expect(set1.elements!.length, 1); + expect(set1.elements!.elementAt(0) is ASN1Sequence, true); + + var seq1 = set1.elements!.elementAt(0) as ASN1Sequence; + expect(seq1.encodedBytes!.length, seq1.totalEncodedByteLength); + expect(seq1.elements!.length, 2); + expect(seq1.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(seq1.elements!.elementAt(1) is ASN1PrintableString, true); + var oi1 = seq1.elements!.elementAt(0) as ASN1ObjectIdentifier; + var string1 = seq1.elements!.elementAt(1) as ASN1PrintableString; + expect(oi1.objectIdentifierAsString, '2.5.4.6'); + expect(string1.stringValue, 'US'); + + var set2 = sequence.elements!.elementAt(1) as ASN1Set; + expect(set2.elements!.length, 1); + expect(set2.elements!.elementAt(0) is ASN1Sequence, true); + + var seq2 = set2.elements!.elementAt(0) as ASN1Sequence; + expect(seq2.encodedBytes!.length, seq2.totalEncodedByteLength); + expect(seq2.elements!.length, 2); + expect(seq2.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(seq2.elements!.elementAt(1) is ASN1PrintableString, true); + var oi2 = seq2.elements!.elementAt(0) as ASN1ObjectIdentifier; + var string2 = seq2.elements!.elementAt(1) as ASN1PrintableString; + expect(oi2.objectIdentifierAsString, '2.5.4.10'); + expect(string2.stringValue, 'DigiCert Inc'); + + var set3 = sequence.elements!.elementAt(2) as ASN1Set; + expect(set3.elements!.length, 1); + expect(set3.elements!.elementAt(0) is ASN1Sequence, true); + + var seq3 = set3.elements!.elementAt(0) as ASN1Sequence; + expect(seq3.encodedBytes!.length, seq3.totalEncodedByteLength); + expect(seq3.elements!.length, 2); + expect(seq3.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(seq3.elements!.elementAt(1) is ASN1PrintableString, true); + var oi3 = seq3.elements!.elementAt(0) as ASN1ObjectIdentifier; + var string3 = seq3.elements!.elementAt(1) as ASN1PrintableString; + expect(oi3.objectIdentifierAsString, '2.5.4.11'); + expect(string3.stringValue, 'www.digicert.com'); + + var set4 = sequence.elements!.elementAt(3) as ASN1Set; + expect(set4.elements!.length, 1); + expect(set4.elements!.elementAt(0) is ASN1Sequence, true); + + var seq4 = set4.elements!.elementAt(0) as ASN1Sequence; + expect(seq4.encodedBytes!.length, seq4.totalEncodedByteLength); + expect(seq4.elements!.length, 2); + expect(seq4.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(seq4.elements!.elementAt(1) is ASN1PrintableString, true); + var oi4 = seq4.elements!.elementAt(0) as ASN1ObjectIdentifier; + var string4 = seq4.elements!.elementAt(1) as ASN1PrintableString; + expect(oi4.objectIdentifierAsString, '2.5.4.3'); + expect(string4.stringValue, 'Thawte RSA CA 2018'); + }); + + test('Test parse X509', () { + var pem = '''-----BEGIN CERTIFICATE----- +MIIGuDCCBaCgAwIBAgIQJWoxbMUUPa7apOL527blFzANBgkqhkiG9w0BAQsFADCB +sDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8w +HQYDVQQLExZGT1IgVEVTVCBQVVJQT1NFUyBPTkxZMR8wHQYDVQQLExZTeW1hbnRl +YyBUcnVzdCBOZXR3b3JrMUAwPgYDVQQDEzdTeW1hbnRlYyBDbGFzcyAzIEV4dGVu +ZGVkIFZhbGlkYXRpb24gU0hBMjU2IFNTTCBURVNUIENBMB4XDTE2MTExODAwMDAw +MFoXDTE2MTEyNTIzNTk1OVowge8xEzARBgsrBgEEAYI3PAIBAxMCREUxFzAVBgsr +BgEEAYI3PAIBAhMGQmF5ZXJuMRswGQYLKwYBBAGCNzwCAQETClJlZ2Vuc2J1cmcx +HTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRAwDgYDVQQFEwczNDY2NTY1 +MQswCQYDVQQGEwJERTENMAsGA1UECAwESGllcjETMBEGA1UEBwwKVGVzdGhhdXNl +bjESMBAGA1UECgwJVGVzdGZpcm1hMRQwEgYDVQQLDAtFbnR3aWNrbHVuZzEWMBQG +A1UEAwwNZXBoZW5vZHJvbS5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALHYKBMxalQNBwqQVS/NE/Y5eTBORjxqY7jC/vZ881G4uMM+AFvt5iFKabjN +wLT9itYFuJ/k5o7kVn93f0eirxrP0e3wPkzwELJIR6AdZo1EsTzGPW0p41PGOjGv +/GPZwFWEfb7C0Wz4v3b3LtBrWYNJ12RswQAtKdNey/1nxZT2UwGdwESBK0Rvh3qt +33Wqkf1t8X627XTD91dkB/brq6oO3m2ZDyhbqDfMiWqUWl2CVnO0A+eFZ5uFFVdm +NPFuhNqgCmZ6TfFkQJQEKuBadHDTj47qjU27lTJjksCHVDs9PzJzkH49zStjk9D4 +UkPw7y37xJ/gUK27VhkIC6QBTuECAwEAAaOCAoswggKHMCsGA1UdEQQkMCKCDWVw +aGVub2Ryb20uZGWCEXd3dy5lcGhlbm9kcm9tLmRlMAkGA1UdEwQCMAAwDgYDVR0P +AQH/BAQDAgWgMG8GA1UdIARoMGYwWwYLYIZIAYb4RQEHFwYwTDAjBggrBgEFBQcC +ARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGQwXaHR0cHM6 +Ly9kLnN5bWNiLmNvbS9ycGEwBwYFZ4EMAQEwKwYDVR0fBCQwIjAgoB6gHIYaaHR0 +cDovL3NoLnN5bWNiLmNvbS9zaC5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG +AQUFBwMCMB8GA1UdIwQYMBaAFERiHdf3UpjAQwNcU+bmv+ZDJ+tjMFcGCCsGAQUF +BwEBBEswSTAfBggrBgEFBQcwAYYTaHR0cDovL3NoLnN5bWNkLmNvbTAmBggrBgEF +BQcwAoYaaHR0cDovL3NoLnN5bWNiLmNvbS9zaC5jcnQwggEEBgorBgEEAdZ5AgQC +BIH1BIHyAPAAdgAR0wud4RKWE7VpXG+auxQlNw9ew3QWYeKO2GKv4jEwuQAAAVh3 +IQXYAAAEAwBHMEUCIAWDOM8fYWHm95CEg8eDf85KvCVzPbTKm2ZcS/7Dx5w7AiEA +k/4u83CLUFizih+iJevMVXPHI99yeb6NT0lQnIZ8MFMAdgCRLn+OXTXy73s/VluY +uYC5VyaVUxTiFkYL1+xTql7swQAAAVh3IQXYAAAEAwBHMEUCIHQR9Geg7t98Gk2t +BSPlHIHDFG+XP5UUKa2eUahE973oAiEA6i8/T8IlppNUXcrMbcjjLLPsaSqd158U +BC44Pr90Nw4wDQYJKoZIhvcNAQELBQADggEBACJqJMVEKtBfmB0mvhFtd5GV7818 +G/THYsf1AtMuCt80Rtzm+EXAyBupIhRERa+/J40pAE/ZyhmS5lSOjTzViR1RsIUg +bo190CLpEvKHA7ckBssJRySMFQ6RSPavsOkpHvduCqVS2PSb9W1APFzDJPeC9gaM +/EKIy7iLp2fiBZrYkTCaxYEy0SZGaFkXeHC20/d5PXhnylEXEIPR2aogIlbgzaNg +RVTxIJddHhpHfW5c2lX+ERf3Ni0fcJqcCZBPyGHUDSYqNrDwRLQ6dyVxz1Jl0oAc ++IHuDDDKJ0ewjoXgV+KRXqa7URuonqA5stUl/susZzd4BlT2k/XnuS8+iQc= +-----END CERTIFICATE-----'''; + + var lines = LineSplitter.split(pem) + .map((line) => line.trim()) + .where((line) => line.isNotEmpty) + .toList(); + var base64 = lines.sublist(1, lines.length - 1).join(''); + var bytes = Uint8List.fromList(base64Decode(base64)); + var asn1Parser = ASN1Parser(bytes); + var topLevelSeq = asn1Parser.nextObject() as ASN1Sequence; + + expect(topLevelSeq.elements!.length, 3); + expect(topLevelSeq.totalEncodedByteLength, 1724); + expect(topLevelSeq.valueByteLength, 1720); + expect(topLevelSeq.elements!.elementAt(0) is ASN1Sequence, true); + expect(topLevelSeq.elements!.elementAt(1) is ASN1Sequence, true); + expect(topLevelSeq.elements!.elementAt(2) is ASN1BitString, true); + + var e1 = topLevelSeq.elements!.elementAt(0) as ASN1Sequence; + var e2 = topLevelSeq.elements!.elementAt(1) as ASN1Sequence; + var e3 = topLevelSeq.elements!.elementAt(2) as ASN1BitString; + + expect(e1.elements!.length, 8); + expect(e1.totalEncodedByteLength, 1444); + expect(e1.encodedBytes!.length, 1444); + expect(e1.valueByteLength, 1440); + expect(e1.elements!.elementAt(1) is ASN1Integer, true); + expect(e1.elements!.elementAt(2) is ASN1Sequence, true); + expect(e1.elements!.elementAt(3) is ASN1Sequence, true); + expect(e1.elements!.elementAt(4) is ASN1Sequence, true); + expect(e1.elements!.elementAt(5) is ASN1Sequence, true); + expect(e1.elements!.elementAt(6) is ASN1Sequence, true); + + var asn1Object = e1.elements!.elementAt(0); + + var integer1 = + ASN1Parser(asn1Object.valueBytes).nextObject() as ASN1Integer; + + expect(integer1.totalEncodedByteLength, 3); + expect(integer1.valueByteLength, 1); + expect(integer1.integer.toString(), '2'); + + var integer2 = e1.elements!.elementAt(1) as ASN1Integer; + expect(integer2.totalEncodedByteLength, 18); + expect(integer2.valueByteLength, 16); + expect( + integer2.integer.toString(), '49732821766751726239505489314635506967'); + + var seq1 = e1.elements!.elementAt(2) as ASN1Sequence; + expect(seq1.encodedBytes!.length, seq1.totalEncodedByteLength); + + var seq2 = e1.elements!.elementAt(3) as ASN1Sequence; + expect(seq2.encodedBytes!.length, seq2.totalEncodedByteLength); + + expect(e2.elements!.length, 2); + expect(e2.totalEncodedByteLength, 15); + expect(e2.encodedBytes!.length, 15); + expect(e2.valueByteLength, 13); + expect(e2.elements!.elementAt(0) is ASN1ObjectIdentifier, true); + expect(e2.elements!.elementAt(1) is ASN1Null, true); + + expect(e3.elements, null); + expect(e3.isConstructed, false); + expect(e3.encodedBytes!.length, 261); + expect(e3.valueByteLength, 257); + expect(e3.stringValues!.length, 256); + }); +} diff --git a/pointycastle/test/asn1/asn1_utils_test.dart b/pointycastle/test/asn1/asn1_utils_test.dart new file mode 100644 index 0000000..420b0ab --- /dev/null +++ b/pointycastle/test/asn1/asn1_utils_test.dart @@ -0,0 +1,155 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/asn1/asn1_utils.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + test('data offset regression PR #111', () { + /* + both vectors are OCTET STRINGS generate using bc-java + + byte[] z = new byte[127]; + for (int t=0; t FortunaRandom() + ..seed(KeyParameter(Platform.instance.platformEntropySource().getBytes(32))); + +void main() { + var n = BigInt.parse( + '6277101735386680763835789423176059013767194773182842284081'); + var q = BigInt.parse( + '6277101735386680763835789423207666416083908700390324961279'); + var a = BigInt.parse( + 'fffffffffffffffffffffffffffffffefffffffffffffffc', + radix: 16, + ); + var b = BigInt.parse( + '64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1', + radix: 16, + ); + var curve = fp.ECCurve(q, a, b); + var params = ECDomainParametersImpl( + 'test_elgamal', + curve, + curve.decodePoint( + createUint8ListFromHexString( + '03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012', + ), + )!, // G + n, + ); + var pubKey = ECPublicKey( + curve.decodePoint( + createUint8ListFromHexString( + '0262b12d60690cdcf330babab6e69763b471f994dd702d16a5'), + ), // Q + params, + ); + var priKey = ECPrivateKey( + BigInt.parse( + '651056770906015076056810763456358567190100156695615665659'), // d + params, + ); + var secureRandom = _newSecureRandom(); + var pRandom = ParametersWithRandom( + PublicKeyParameter(pubKey), + secureRandom, + ); + + test('ECElgamal encrypt and decrypt test: first', () { + var value = BigInt.from(123); + var data = (priKey.parameters!.G * value)!; + var encryptor = ECElGamalEncryptor(); + encryptor.init(pRandom); + var pair = encryptor.encrypt(data); + var decryptor = ECElGamalDecryptor(); + decryptor.init(PrivateKeyParameter(priKey)); + var result = decryptor.decrypt(pair); + expect(data, equals(result)); + }); + + test('ECElgamal encrypt and decrypt test: second', () { + var value = + _newSecureRandom().nextBigInteger(pubKey.parameters!.n.bitLength - 1); + var data = (priKey.parameters!.G * value)!; + var encryptor = ECElGamalEncryptor(); + encryptor.init(pRandom); + var pair = encryptor.encrypt(data); + var decryptor = ECElGamalDecryptor(); + decryptor.init(PrivateKeyParameter(priKey)); + var result = decryptor.decrypt(pair); + expect(data, equals(result)); + }); +} diff --git a/pointycastle/test/asymmetric/oaep_test.dart b/pointycastle/test/asymmetric/oaep_test.dart new file mode 100644 index 0000000..5cecced --- /dev/null +++ b/pointycastle/test/asymmetric/oaep_test.dart @@ -0,0 +1,1005 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/impl/secure_random_base.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; +import '../test/src/null_asymmetric_block_cipher.dart'; + +//================================================================ + +void main() { + internalStateTesting(); + rsaesOaepFromBCSHA256(); + rsaesOaepFromBC(); + rsaOaepStandardTests(); +} + +//================================================================ +/// Tests for RSA-OAEP with a known-correct test vector. +/// +/// Test RSA-OAEP using the test vector from 'RSAES-OAEP Encryption Scheme: +/// Algorithm specification and supporting documentation', published by +/// RSA Laboratories in 2000. +/// +/// A copy was found here: +/// https://www.inf.pucrs.br/~calazans/graduate/TPVLSI_I/RSA-oaep_spec.pdf + +void rsaOaepStandardTests() { + // RSA key information + + // n, the modulus: + final n = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + 'bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 36 8d 07 ee d4 10 43 a4' + '40 d6 b6 f0 74 54 f5 1f b8 df ba af 03 5c 02 ab 61 ea 48 ce eb 6f cd 48' + '76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f af b8 e0 a3 df c7 37 72' + '3e e6 b4 b7 d9 3a 25 84 ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e' + 'e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f e2 53 72 98 ca 2a 8f 59' + '46 f8 e5 fd 09 1d bd cb')); + + // e, the public exponent + final e = decodeBigIntWithSign(1, createUint8ListFromHexString('11')); + + // p, the first prime factor of n + final p = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + 'ee cf ae 81 b1 b9 b3 c9 08 81 0b 10 a1 b5 60 01 99 eb 9f 44 ae f4 fd a4' + '93 b8 1a 9e 3d 84 f6 32 12 4e f0 23 6e 5d 1e 3b 7e 28 fa e7 aa 04 0a 2d' + '5b 25 21 76 45 9d 1f 39 75 41 ba 2a 58 fb 65 99')); + + // q, the second prime factor of n: + final q = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + 'c9 7f b1 f0 27 f4 53 f6 34 12 33 ea aa d1 d9 35 3f 6c 42 d0 88 66 b1 d0' + '5a 0f 20 35 02 8b 9d 86 98 40 b4 16 66 b4 2e 92 ea 0d a3 b4 32 04 b5 cf' + 'ce 33 52 52 4d 04 16 a5 a4 41 e7 00 af 46 15 03')); + + // dP , p’s exponent: + final dP = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + '54 49 4c a6 3e ba 03 37 e4 e2 40 23 fc d6 9a 5a eb 07 dd dc 01 83 a4 d0' + 'ac 9b 54 b0 51 f2 b1 3e d9 49 09 75 ea b7 74 14 ff 59 c1 f7 69 2e 9a 2e' + '20 2b 38 fc 91 0a 47 41 74 ad c9 3c 1f 67 c9 81')); + + // dQ, q’s exponent: + final dQ = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + '47 1e 02 90 ff 0a f0 75 03 51 b7 f8 78 86 4c a9 61 ad bd 3a 8a 7e 99 1c' + '5c 05 56 a9 4c 31 46 a7 f9 80 3f 8f 6f 8a e3 42 e9 31 fd 8a e4 7a 22 0d' + '1b 99 a4 95 84 98 07 fe 39 f9 24 5a 98 36 da 3d')); + + // qInv, the CRT coefficient: + final qInv = decodeBigIntWithSign( + 1, + createUint8ListFromHexString( + 'b0 6c 4f da bb 63 01 19 8d 26 5b db ae 94 23 b3 80 f2 71 f7 34 53 88 50' + '93 07 7f cd 39 e2 11 9f c9 86 32 15 4f 58 83 b1 67 a9 67 bf 40 2b 4e 9e' + '2e 0f 96 56 e6 98 ea 36 66 ed fb 25 79 80 39 f7')); + + //---------------- + // Encryption + + // M, the message to be encrypted: + final message = createUint8ListFromHexString( + 'd4 36 e9 95 69 fd 32 a7 c8 a0 5b bc 90 d3 2c 49'); + + // P , encoding parameters: NULL + // ignore: unused_local_variable + final dynamic params = null; + + // pHash = Hash(P ): + // ignore: unused_local_variable + final pHash = createUint8ListFromHexString( + 'da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 af d8 07 09'); + + // DB = pHash∥PS∥01∥M: + // ignore: unused_local_variable + final db = createUint8ListFromHexString( + 'da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 af d8 07 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 d4 36 e9 95 69' + 'fd 32 a7 c8 a0 5b bc 90 d3 2c 49'); + + // seed, a random octet string: + // ignore: unused_local_variable + final seed = createUint8ListFromHexString( + 'aa fd 12 f6 59 ca e6 34 89 b4 79 e5 07 6d de c2 f0 6c b5 8f'); + + // dbMask = M GF (seed , 107): + // ignore: unused_local_variable + final dbMask = createUint8ListFromHexString( + '06 e1 de b2 36 9a a5 a5 c7 07 d8 2c 8e 4e 93 24 8a c7 83 de e0 b2 c0 46' + '26 f5 af f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db 4c dc fe 4f f4' + '77 28 b4 a1 b7 c1 36 2b aa d2 9a b4 8d 28 69 d5 02 41 21 43 58 11 59 1b' + 'e3 92 f9 82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4e af f4 9c 8c 3b' + '7c fc 95 1a 51 ec d1 dd e6 12 64'); + + // maskedDB = DB ⊕ dbMask: + // ignore: unused_local_variable + final maskedDB = createUint8ListFromHexString( + 'dc d8 7d 5c 68 f1 ee a8 f5 52 67 c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46' + '26 f5 af f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db 4c dc fe 4f f4' + '77 28 b4 a1 b7 c1 36 2b aa d2 9a b4 8d 28 69 d5 02 41 21 43 58 11 59 1b' + 'e3 92 f9 82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f 7b c2 75 19 52' + '81 ce 32 d2 f1 b7 6d 4d 35 3e 2d'); + + // seedMask = M GF (maskedDB, 20): + // ignore: unused_local_variable + final seedMask = createUint8ListFromHexString( + '41 87 0b 5a b0 29 e6 57 d9 57 50 b5 4c 28 3c 08 72 5d be a9'); + + // maskedSeed = seed ⊕ seedMask: + // ignore: unused_local_variable + final maskedSeed = createUint8ListFromHexString( + 'eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 ca 82 31 0b 26'); + + // EM = maskedSeed∥maskedDB: + final em = createUint8ListFromHexString( + 'eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 ca 82 31 0b 26 dc d8 7d 5c' + '68 f1 ee a8 f5 52 67 c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46 26 f5 af f9' + '3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db 4c dc fe 4f f4 77 28 b4 a1' + 'b7 c1 36 2b aa d2 9a b4 8d 28 69 d5 02 41 21 43 58 11 59 1b e3 92 f9 82' + 'fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f 7b c2 75 19 52 81 ce 32 d2' + 'f1 b7 6d 4d 35 3e 2d'); + + // C, the RSA encryption of EM: + final ciphertext = createUint8ListFromHexString( + '12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 39 a3 3d 1e 99 6f c8 2a' + '94 cc d3 00 74 c9 5d f7 63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6' + '53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb 6d 84 b1 c3 1d 65 4a 19' + '70 e5 78 3b d6 eb 96 a0 24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48' + 'da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d 51 a7 4d df 85 d8 b5 0d' + 'e9 68 38 d6 06 3e 09 55'); + + //---------------- + // Decryption + + // c mod p (c is the integer value of C): + // ignore: unused_local_variable + final cModP = createUint8ListFromHexString( + 'de 63 d4 72 35 66 fa a7 59 bf e4 08 82 1d d5 25 72 ec 92 85 4d df 87 a2' + 'b6 64 d4 4d aa 37 ca 34 6a 05 20 3d 82 ff 2d e8 e3 6c ec 1d 34 f9 8e b6' + '05 e2 a7 d2 6d e7 af 36 9c e4 ec ae 14 e3 56 33'); + + // c mod q: + // ignore: unused_local_variable + final cModQ = createUint8ListFromHexString( + 'a2 d9 24 de d9 c3 6d 62 3e d9 a6 5b 5d 86 2c fb ec 8b 19 9c 64 27 9c 54' + '14 e6 41 19 6e f1 c9 3c 50 7a 9b 52 13 88 1a ad 05 b4 cc fa 02 8a c1 ec' + '61 42 09 74 bf 16 25 83 6b 0b 7d 05 fb b7 53 36'); + + // m1 =cdP modp=(cmodp)dP modp: + // ignore: unused_local_variable + final m1 = createUint8ListFromHexString( + '89 6c a2 6c d7 e4 87 1c 7f c9 68 a8 ed ea 11 e2 71 82 4f 0e 03 65 52 17' + '94 f1 e9 e9 43 b4 a4 4b 57 c9 e3 95 a1 46 74 78 f5 26 49 6b 4b b9 1f 1c' + 'ba ea 90 0f fc 60 2c f0 c6 63 6e ba 84 fc 9f f7'); + + //m2 =cdQ modq=(cmodq)dQ modq: + // ignore: unused_local_variable + final m2 = createUint8ListFromHexString( + '4e bb 22 75 85 f0 c1 31 2d ca 19 e0 b5 41 db 14 99 fb f1 4e 27 0e 69 8e' + '23 9a 8c 27 a9 6c da 9a 74 09 74 de 93 7b 5c 9c 93 ea d9 46 2c 65 75 02' + '1a 23 d4 64 99 dc 9f 6b 35 89 75 59 60 8f 19 be'); + + // h=(m1 −m2)qInvmodp: + // ignore: unused_local_variable + final h = createUint8ListFromHexString( + '01 2b 2b 24 15 0e 76 e1 59 bd 8d db 42 76 e0 7b fa c1 88 e0 8d 60 47 cf' + '0e fb 8a e2 ae bd f2 51 c4 0e bc 23 dc fd 4a 34 42 43 94 ad a9 2c fc be' + '1b 2e ff bb 60 fd fb 03 35 9a 95 36 8d 98 09 25'); + + //---------------------------------------------------------------- + // Create Pointy Castle [RSAPublicKey] and [RSAPrivateKey] objects. + + // Derive the private exponent (d) from values provided in the test vector. + + final phi = (p - BigInt.one) * (q - BigInt.one); + + final privateExponent = e.modInverse(phi); + + // Instantiate the RSA key pair objects + + final publicKey = RSAPublicKey(n, e); + // ignore: deprecated_member_use_from_same_package + final privateKey = RSAPrivateKey(n, privateExponent, p, q, e); + + //---------------- + + test('RSA key pair is valid', () { + // Some correctness checks for the RSA public-key values. + // + // This test should never fail, since the values are known to be correct. + + expect(p * q, equals(n)); // modulus = p * q + + // dP = (1/e) mod (p-1) + expect(e.modInverse(p - BigInt.one), equals(dP)); + + // dQ = (1/e) mod (q-1) + expect(e.modInverse(q - BigInt.one), equals(dQ)); + + // qInv = (1/q) mod p where p > q + expect(q.modInverse(p), equals(qInv)); + + expect((e * privateExponent) % phi, equals(BigInt.one)); + }); + + //---------------------------------------------------------------- + + test('EME-OAEP encoding operation', () { + // This test is actually redundant. + // + // If the following 'encryption' test passes, then the encoding operation + // would have also worked. But since we can make replace the [RSAEngine] + // with the [NullAsymmetricBlockCipher] that does nothing, we can use it to + // examine the EME-OAEP encoded message (called 'EM' in RFC 2437), before it + // normally gets encrypted. + // + // If there is a bug in the underlying asymmetric encryption (i.e. in the + // [RSAEngine], this test will succeed when the encryption test will fail. + // If there is a bug in the EME-OAEP encoding operation, then this test and + // the following encryption test will both fail. It is impossible for this + // test to fail and the encryption test to pass. + + // Can't instantiate using AsymmetricBlockCipher('Null/OAEP'), because the + // default [NullAsymmetricBlockCipher] has block lengths of 70 instead of + // 127 (which is necessary for this to work properly). So must use its + // constructor and pass in 127 for the two block lengths. + + final encryptor = OAEPEncoding(NullAsymmetricBlockCipher(127, 127)); + + encryptor.init( + true, + ParametersWithRandom(PublicKeyParameter(publicKey), + _OAEPTestEntropySource()..seed(KeyParameter(seed)))); + + // Pretend to encrypt the test [message] value + + final output = Uint8List(encryptor.outputBlockSize); + + final size = encryptor.processBlock(message, 0, message.length, output, 0); + expect(size, equals(encryptor.outputBlockSize)); + + // The output should be the unencrypted EM (since Null cipher does nothing) + + expect(output, equals(em)); + }); + + //---------------------------------------------------------------- + + test('encryption', () { + // Create the OAEPEncoding and initialize it with the publicKey and a + // special SecureRandom implementation that always returns the fixed [seed] + // value, so the produced ciphertext is deterministic and can match the + // expected value. DO NOT DO THIS IN PRODUCTION. This is insecure and is + // done only for testing purposes. + + registry.register(_OAEPTestEntropySource.factoryConfig); // register 'Fixed' + + final encryptor = AsymmetricBlockCipher('RSA/OAEP'); // using registry + + encryptor.init( + true, // true = for encryption + ParametersWithRandom(PublicKeyParameter(publicKey), + SecureRandom('_oaep_rand')..seed(KeyParameter(seed)))); + + // Encrypt the test [message] value + + final output = Uint8List(encryptor.outputBlockSize); + + final size = encryptor.processBlock(message, 0, message.length, output, 0); + expect(size, equals(encryptor.outputBlockSize)); + + // The ciphertext should be the expected test [ciphertext] value + + expect(output, equals(ciphertext)); + }); + + //---------------------------------------------------------------- + + test('decryption', () { + final decryptor = OAEPEncoding(RSAEngine()); // without using the registry + + decryptor.init(false, PrivateKeyParameter(privateKey)); + + // Decrypt the test [ciphertext] value + + final outBuf = Uint8List(decryptor.outputBlockSize); + + final outputSize = + decryptor.processBlock(ciphertext, 0, ciphertext.length, outBuf, 0); + final decrypted = outBuf.sublist(0, outputSize); + + // The decrypted message should be the expected test [message] value + + expect(decrypted, equals(message)); + }); + + //---------------------------------------------------------------- + + test('encryption with encoding parameters', () { + final params = Uint8List.fromList('TestLabel'.codeUnits); + final encryptor = + OAEPEncoding(RSAEngine(), params); // without using the registry + + encryptor.init( + true, // true = for encryption + ParametersWithRandom(PublicKeyParameter(publicKey), + SecureRandom('_oaep_rand')..seed(KeyParameter(seed)))); + + // Encrypt the test [message] value + + final output = Uint8List(encryptor.outputBlockSize); + + final size = encryptor.processBlock(message, 0, message.length, output, 0); + expect(size, equals(encryptor.outputBlockSize)); + + // The ciphertext should be the [expectedCipherText] value + final expectedCipherText = createUint8ListFromHexString( + '04 cc a5 6a f9 f7 93 67 3e 98 9e d1 d6 08 4a 5c a7 46 f3 9b d7 37 40' + '40 1d 88 0d 70 24 57 e9 41 42 a2 5a 04 92 0f 83 60 04 14 ef 43 a8 0e' + '60 ad 72 c7 e4 66 ae 18 68 5f 05 a5 5b 0d b8 db 19 67 d7 18 b9 5d e7' + '09 db d0 20 6c 2a 43 31 15 ae d5 cf b3 9b 68 bb 13 d2 22 4a 51 e1 b0' + '6f 93 4c 91 f3 f7 48 6b 5f 57 28 f6 b3 b2 2d e6 9a 6d b9 12 4a a9 31' + '03 12 86 20 f0 50 d7 0c e4 33 58 ee 7c'); + + expect(output, equals(expectedCipherText)); + }); + + test('decryption with encoding parameters', () { + final params = Uint8List.fromList('TestLabel'.codeUnits); + final decryptor = + OAEPEncoding(RSAEngine(), params); // without using the registry + + decryptor.init(false, PrivateKeyParameter(privateKey)); + + final cipherTextEncodingParams = createUint8ListFromHexString( + '04 cc a5 6a f9 f7 93 67 3e 98 9e d1 d6 08 4a 5c a7 46 f3 9b d7 37 40' + '40 1d 88 0d 70 24 57 e9 41 42 a2 5a 04 92 0f 83 60 04 14 ef 43 a8 0e' + '60 ad 72 c7 e4 66 ae 18 68 5f 05 a5 5b 0d b8 db 19 67 d7 18 b9 5d e7' + '09 db d0 20 6c 2a 43 31 15 ae d5 cf b3 9b 68 bb 13 d2 22 4a 51 e1 b0' + '6f 93 4c 91 f3 f7 48 6b 5f 57 28 f6 b3 b2 2d e6 9a 6d b9 12 4a a9 31' + '03 12 86 20 f0 50 d7 0c e4 33 58 ee 7c'); + + // Decrypt the test [cipherTextEncodingParams] value + + final outBuf = Uint8List(decryptor.outputBlockSize); + + final outputSize = decryptor.processBlock(cipherTextEncodingParams, 0, + cipherTextEncodingParams.length, outBuf, 0); + final decrypted = outBuf.sublist(0, outputSize); + + // The decrypted message should be the expected test [message] value + + expect(decrypted, equals(message)); + }); + + //---------------------------------------------------------------- + + test('tampered ciphertext detected', () { + final decryptor = OAEPEncoding(RSAEngine()); // without using the registry + + decryptor.init(false, PrivateKeyParameter(privateKey)); + + // Try tampering with every bit in the ciphertext (128 bytes = 1024 bits) + + for (var bitPos = 0; bitPos < ciphertext.length * 8; bitPos++) { + // Create a copy of the ciphertext that has been tampered with + + final tamperedCiphertext = Uint8List.fromList(ciphertext); + tamperedCiphertext[bitPos ~/ 8] ^= 0x01 << (bitPos % 8); // flip a bit + + // Try to decrypt it: expecting it to always fail + + try { + final outBuf = Uint8List(decryptor.outputBlockSize); + + // ignore: unused_local_variable + final outputSize0 = decryptor.processBlock( + tamperedCiphertext, 0, tamperedCiphertext.length, outBuf, 0); + fail('tampered with ciphertext still decrypted'); + + // final decrypted = outBuf.sublist(0, outputSize); + // expect(decrypted, equals(message)); + } on ArgumentError catch (e) { + expect(e.message, equals('decoding error')); + } + } + }); + + test('EME-OAEP encoding operation', () { + // This test is actually redundant. + // + // If the following 'encryption' test passes, then the encoding operation + // would have also worked. But since we can make replace the [RSAEngine] + // with the [NullAsymmetricBlockCipher] that does nothing, we can use it to + // examine the EME-OAEP encoded message (called 'EM' in RFC 2437), before it + // normally gets encrypted. + // + // If there is a bug in the underlying asymmetric encryption (i.e. in the + // [RSAEngine], this test will succeed when the encryption test will fail. + // If there is a bug in the EME-OAEP encoding operation, then this test and + // the following encryption test will both fail. It is impossible for this + // test to fail and the encryption test to pass. + + // Can't instantiate using AsymmetricBlockCipher('Null/OAEP'), because the + // default [NullAsymmetricBlockCipher] has block lengths of 70 instead of + // 127 (which is necessary for this to work properly). So must use its + // constructor and pass in 127 for the two block lengths. + + final encryptor = OAEPEncoding(NullAsymmetricBlockCipher(127, 127)); + + encryptor.init( + true, + ParametersWithRandom(PublicKeyParameter(publicKey), + _OAEPTestEntropySource()..seed(KeyParameter(seed)))); + + // Pretend to encrypt the test [message] value + + final output = Uint8List(encryptor.outputBlockSize); + + final size = encryptor.processBlock(message, 0, message.length, output, 0); + expect(size, equals(encryptor.outputBlockSize)); + + // The output should be the unencrypted EM (since Null cipher does nothing) + + expect(output, equals(em)); + }); + + //---------------------------------------------------------------- + /// Test decryption when EME-OAEP encoded message has leading 0x00 bytes. + /// + /// This is a regression test, since Pointy Castle v1.0.2 had a bug which + /// caused decryption to fail in these situation. The leading null byte is not + /// needed to represent the same integer value. But a correct implementation + /// of the I2OSP (integer to octet string primitive) will produce the + /// correct number of null bytes. + + test('I2OSP when EM starts with 0x00 bytes', () { + // This test could be done with any key pair, but since we already have a + // key pair from the above tests, use it. + + final keySizeInBytes = publicKey.modulus!.bitLength ~/ 8; + + final numNulls = List.filled(keySizeInBytes, 0); // tracks test cases + + // The EME-OAEP encoded message (EM) is determined by: + // + // - length of the block (determined by public key used) + // - the message + // - random bytes used as the seed + // - other factors that are constant in OAEPEncoding (i.e. hash algorithm, + // parameters and mask generating function) + // + // Below are a carefully chosen test message and seeds for a + // FixedSecureRandom known to produce _EM_ that start with 1, 2 and 3 0x00 + // bytes. + + final testMsg = Uint8List.fromList('Hello world!'.codeUnits); + + for (final x in [822, 197378, 522502]) { + // Change above to the following, to use the code to find test cases + // const numCasesToTry = 1000; + // for (var x = 0; x < numCasesToTry; x++) { + + // Create a testSeed from x + + final numbers = []; + var n = x; + while (0 < n) { + numbers.add(n & 0xFF); + n = n >> 8; + } + final testFixedRndSeed = Uint8List.fromList(numbers.reversed.toList()); + // print('FixedSecureRandom seed: $testFixedRndSeed (from x = $x)'); + + Uint8List processTestCaseWith(AsymmetricBlockCipher blockCipher) { + final rnd = _OAEPTestEntropySource() + ..seed(KeyParameter(testFixedRndSeed)); + + final enc = OAEPEncoding(blockCipher); + + enc.init( + true, + ParametersWithRandom( + PublicKeyParameter(publicKey), rnd)); + + final buf = Uint8List(enc.outputBlockSize); + final len = enc.processBlock(testMsg, 0, testMsg.length, buf, 0); + return buf.sublist(0, len); + } + + // Use null block cipher to obtain the EM (encryption does nothing) + + final testEM = processTestCaseWith( + NullAsymmetricBlockCipher(keySizeInBytes - 1, keySizeInBytes)); + + // Determine how many 0x00 are at the start of the EM + + var numNullBytesAtStart = 0; + while (testEM[numNullBytesAtStart] == 0x00) { + numNullBytesAtStart++; + } + + numNulls[numNullBytesAtStart]++; // record it for later test case checking + + // if (0 < numNullBytesAtStart) { + // print('x=$x produced ${numNullBytesAtStart} null bytes'); + // } + + // Use RSA block cipher to obtain the ciphertext (i.e. encrypted EM). + // Exactly the same as when finding the EM, except the underlying cipher + // is now RSA instead of a null cipher. + + final cipher = processTestCaseWith(RSAEngine()); + + // Decrypt the cipher (if the I2OSP does not correctly reproduce the + // 0x00 byte, the decryption operation will fail). + + final dec = OAEPEncoding(RSAEngine()); + + dec.init(false, PrivateKeyParameter(privateKey)); + + final decBuf = Uint8List(dec.outputBlockSize); + final decSize = dec.processBlock(cipher, 0, cipher.length, decBuf, 0); + final decrypted = decBuf.sublist(0, decSize); + + expect(decrypted, equals(testMsg)); + } + + // Check above has included test cases with the desired number of 0x00 bytes + + const maxNumNullsTested = 3; // looking for cases with 1, 2 and 3 0x00 bytes + + for (var n = 1; n <= maxNumNullsTested; n++) { + // print('Number of test cases starting with $n 0x00: ${numNulls[n]}'); + expect(numNulls[n], greaterThan(0), + reason: 'no test case with EM starting with $n 0x00'); + } + }); +} + +class Vector { + BigInt? pubExp; + BigInt? pubMod; + late BigInt privExp; + BigInt? privMod; + BigInt? privP; + BigInt? privQ; + BigInt? privDP; + BigInt? privDQ; + BigInt? privQInv; + Uint8List? pt; + Uint8List? ct; + Uint8List? seed; + + bool success = false; + + Vector( + String pubExp, + String pubMod, + String privExp, + String privMod, + String privP, + String privQ, + String pt, + String ct, + String seed, + this.success) { + this.pubExp = BigInt.parse(pubExp, radix: 10); + this.pubMod = BigInt.parse(pubMod, radix: 10); + + this.privExp = BigInt.parse(privExp, radix: 10); + this.privMod = BigInt.parse(privMod, radix: 10); + this.privP = BigInt.parse(privP, radix: 10); + this.privQ = BigInt.parse(privQ, radix: 10); + this.pt = createUint8ListFromHexString(pt); + this.ct = createUint8ListFromHexString(ct); + this.seed = createUint8ListFromHexString(seed); + } + + RSAPublicKey getPublicKey() { + return RSAPublicKey(pubMod!, pubExp!); + } + + RSAPrivateKey getPrivateKey() { + return RSAPrivateKey(privMod!, privExp, privP, privQ); + } +} + +/// +/// Check for controlled failure if the payload decrypts correctly. +/// +void internalStateTesting() { + var e = BigInt.parse('17'); + var n = BigInt.parse( + '18904793323418458651049426928801905285353796206385193666381737473597835434592217089788859459502722864449929528026460733832101275463481053011104851889194611340892902106814930153201137075011689812853583062022802401066404443801928558344390307491359578381828323202923825005967997182480368891209321353708191936440581584590352341102052628938464842924718115348382042288768422683607812317488624471145713271448836553349942090507534654252362527087639524130879656765282272133914712413710755311513452265197601040534855780870663561450317819530420407368857024352282644119023990887913427980404345159582897596808724346289832894083203'); + var privE = BigInt.parse( + '617803703379688191210765585908558996253392032888405021777180963189471746228503826463688217630807936746729723138119631824578473054362125915395583395071719324865781114601795103045788793301035614799136701373294196113281190973919233932823212663116326090909422326892935457711372456943802904941481089990463788772559031057214358422944212239732312586528170369790496999028037134004691319620578080624784410538321964157477137634793679842220183389194487973889415513666720489302892692475014393096306934540126165897827044583270894711764757806980961253390129735543605935602739263581935639888398241224738439056849378642168461974233'); + var p = BigInt.parse( + '143420423826270698175633028465402741568026051978003404422758284490094742892554157033700862464778324477416298502402311074511535147590579816829854156588557905481381920228165031361037666213139917088009390138780140545235925176923381310162839263972799741951878755589786868244570696343039584097757121751323287364159'); + var q = BigInt.parse( + '131813815766702661784101374190675035388075980814830714087728098574163194206381046993609446511406125653725380380445740005913380230697612313033687890492067255764814103747149851405422402056600446973338826483794042725080305459879611704956215180675502747628290666716410531574788281762861777571376238088154670307517'); + + // We need to examine behavior when the encoding is invalid but the + // RSA decryption is ok. + + var pubKey = PublicKeyParameter(RSAPublicKey(n, e)); + var privKey = + PrivateKeyParameter(RSAPrivateKey(n, privE, p, q)); + + test('cause invalid hash', () { + var msg = Uint8List(190 + 32 + 1); + var rsa = RSAEngine(); + rsa.init(true, pubKey); + var out = Uint8List(rsa.outputBlockSize); + rsa.processBlock(msg, 0, msg.length, out, 0); + var oaep = OAEPEncoding.withSHA256(RSAEngine()); + oaep.init(false, privKey); + + var oaepOut = Uint8List(oaep.outputBlockSize); + expect(() { + oaep.processBlock(out, 0, out.length, oaepOut, 0); + }, throwsA(TypeMatcher())); + }); + + test('wrong data length', () { + var msg = Uint8List(190 + 31 + 1); + var rsa = _RSABroken(); + rsa.init(true, pubKey); + var out = Uint8List(rsa.outputBlockSize); + rsa.processBlock(msg, 0, msg.length, out, 0); + + var oaep = OAEPEncoding.withSHA256(rsa); + oaep.init(false, privKey); + + var oaepOut = Uint8List(oaep.outputBlockSize); + + expect(() { + // + // Create a circumstance where block len is less than 2x hash size +1 + // + rsa.wrongSizeDelta = -191; + oaep.processBlock(out, 0, out.length, oaepOut, 0); + }, throwsA(TypeMatcher())); + }); +} + +/// +/// Test RSAESOAEP using sha256, vectors generated from BC Java api. +/// +void rsaesOaepFromBCSHA256() { + var e = BigInt.parse('17'); + var n = BigInt.parse( + '18904793323418458651049426928801905285353796206385193666381737473597835434592217089788859459502722864449929528026460733832101275463481053011104851889194611340892902106814930153201137075011689812853583062022802401066404443801928558344390307491359578381828323202923825005967997182480368891209321353708191936440581584590352341102052628938464842924718115348382042288768422683607812317488624471145713271448836553349942090507534654252362527087639524130879656765282272133914712413710755311513452265197601040534855780870663561450317819530420407368857024352282644119023990887913427980404345159582897596808724346289832894083203'); + var privE = BigInt.parse( + '617803703379688191210765585908558996253392032888405021777180963189471746228503826463688217630807936746729723138119631824578473054362125915395583395071719324865781114601795103045788793301035614799136701373294196113281190973919233932823212663116326090909422326892935457711372456943802904941481089990463788772559031057214358422944212239732312586528170369790496999028037134004691319620578080624784410538321964157477137634793679842220183389194487973889415513666720489302892692475014393096306934540126165897827044583270894711764757806980961253390129735543605935602739263581935639888398241224738439056849378642168461974233'); + var p = BigInt.parse( + '143420423826270698175633028465402741568026051978003404422758284490094742892554157033700862464778324477416298502402311074511535147590579816829854156588557905481381920228165031361037666213139917088009390138780140545235925176923381310162839263972799741951878755589786868244570696343039584097757121751323287364159'); + var q = BigInt.parse( + '131813815766702661784101374190675035388075980814830714087728098574163194206381046993609446511406125653725380380445740005913380230697612313033687890492067255764814103747149851405422402056600446973338826483794042725080305459879611704956215180675502747628290666716410531574788281762861777571376238088154670307517'); + + var pubKey = PublicKeyParameter(RSAPublicKey(n, e)); + var privKey = + PrivateKeyParameter(RSAPrivateKey(n, privE, p, q)); + + // [,,, ..., ,, + var vectors = [ + '2f9821a62f95013a4bb947e8b1dc298592107868782cdf06b33666d2dbc2231f7196e070bed93f41924778508963de2fe996a0d0ee4dcfee1a224d2236118ca508b700be1791c8c6dbcf6101e7e34849374bb46d6f22e4e435e3c9ffbfd1caefff9b92b12f0729701409e6b63eb39af1b75357051adfd8199d5c185e07a325f031619b8152fb7a55052370033f2b97d9cca7bb9daeaf02b36651c27b4e6094ea773c30b691e7d4da0506b5be8dab1dd4484bc647d82dceeb8fddb5b8cc75b165017ad2a5ae24de16b33e34207621e7222f00def60cdb69f4b45cd820d63e3c9ec39d4e731d70cd1c6c3fa63c4d8959c9a93cf813e1301f8e0ad93466b889810c047190c1036369572a753f5c1818d6e4dcd6f5a2c99b95d714aa6d7cae29813d598bd5858a840d0f8e68c86c6367fe79bffa25f5a4b24975b74905807d0fbca482dcf02619358d84852a9defa82768467ca1eb861495619b969f3cafba94979ac9388f7bfde908b7a2edef2bc0278c190673f66b86dbd00ec7a425941ab02f7264e7de772b8c94a40cce37a9787584feff81ecd737248d29942f4a7f915d8f8e39a81858022a26a0afc915edf151903a9544c7c06543376f3e59a8c704798b57dc4d0361ec90106423c5a7306525709e2744d6245e9d34a7055a4b3742a66e063fd0817fd05283fa80713855485063b6a0581402d981818b1c9ca6c97b30dffe', + '76c5ae60011feb4334f08b83553b2fcbd898ea3fe0beb6f08fd8a7107106da932d8f8503ab9e0774d5d173a64b2b0284475fd3cab01fd565d0fed7e428c36e64bd178bdee00b2735cf5b4f332e38e64d776a81f2d781b7bd56ccbe304910ba82d5f7d9574120c332114be41ae7b609205774ea5ce45b5b569b77151a318342744e8fd88a71c96f9e57f1e47002e29fd8d518f0379c386dd77e6e1e4f27fdbba49bbee3188d0625e3face8c7a2baefa092daeee6ed6ea592c3dde8add802d', + '04da21f24d7c757dcc0e23e879812779d20c7b2e35d1fdbd83187b070c49a75639f4b6723cec912527798fd511191bf2fc2f6b059b603efda1fa77b749a77fcb83ab2d7ab4de32f80d51e23ccacbebad129fb259d587308eb233829f53c4ef05bad21e92b4eebe71f52d3720f373c922ff203c9fbcdcf56aa24bd661c458ab05cbd7ec6955becc6404c8916faf520548133833ac96b4cbf7bce1146d164a61078992f45a7b779110147f894c6fcbd46ddc187999375a6cea4460953f71cd94b0f71fb5641a5dffbab88276cf7f16b38c92231d39f59ef250cfd4a807cb51fb0095b00f841d2d5f68908a0cf4932a7b3babebd44626edfbcea8b19f3bc79cda9c', + '3288c7e74819bddb788af2e8b4247ffbecdb9f07a0fcb6a3b40902708ab7f35272e7f0106543bd2c9a765179bd8e94bfc5f1cc03cf94b87650f9dfe8cd0db5eaf769c3ae722761aa789a04a3b1af4bd948172e025bb4a31b1892aa8e97f3dbb4eaeeaa1d0aa7b7d9cd0dca8a35adb00b17b49e63d72e2e5bdb6c345b0d2731d8daf5c62b2acf20b4722494f3834a30152ac1ce6c50b86ccd2f36574232a1d97e3fbc0cc011487f543075ad17355a06d160a46a53fcbe4a6e631b3e717686b22676a2aca0f585fe389115841a2e9fcaa848dc8fdb39dbc25472c5543f3fe8bd7b4266ec5ed3f14ebb35be0fd026f9e6df0c00ece61d37ec6500817f2cef718a09200a183f99268810706ac7558be669ba53a1eb6b8ce66e338399a140df050ac54f82b1dd681688ef075f08233b75a2d78edaf6f4c3c206aee8f505269c19f5344a37e1cf00620695dfbed7a68f2caded620ec2245462d09c8a2aea29a8e0c37666d2e385def15a1f5b81ac97524d3e026557a07974da85ca0d2b5d6a453b300ecfae8e59a24483c6669949e19f9ae55f8013641fdeed43ee23a7adc5031597b3183c44a6de617d2ac5bb0abc5e48a1d52df8156cfa3aec5d9b03f702f7f542abbba1c5d51d0bcd628356d87887f81a76656357f111a20c47ea9221ee88135e10a2f023c39df9a114987e8de08b18a49d554250fb377e08a7be5c30f30f42afaa', + '13443416b03e96b50121ea97cd9f30f35bd6fed05653f1d1669554af558f972238ff71a4623e3ea14cb1285862f7609c66a6105d1e1caedc50dfaa72ef09d4227ddebf321de041f2c724c265d6dbfcc95f250613596067dbf31cff256d23532296c331a09e06491019aae5624e6c27a845ecc2d5937d27f7a80ac1d7f985354290fef8dcf2d3ee4a48e88b9af24364130c8e0fdbe03d3406bef677d7f6de34f99bdcd5533ebb5107561cb6d36bc09e7ceeb830075cbd6901422a93dd7c6f', + '8511545e2a2e924fba41b3283bdec21bef0859740312f1d145eb4ed86fc33fafbbb067b05db9f52bb8beb0c8558c61ac2a25b36eb2e15c66e33b992ab0f8a987cca147161adfff81f2cdcd90841f6936e3020d4745c058af5511a5aebe51ab3b6824fb3951d24b811cb651cbd106eb27c10658e2b1d7ef9a5e1b2d6b68054d2b08737f2fb1523c5827a8e3590a513c7d2c679d6f389c979e61fba082691a6ba9cacc805ed907e03b7a0b1ec04181adce0be1e51385711f38085e96e2add695efa64287145f3388529c5dbee50878f60cfe591ba6a11d1fb0c72e6ff6d56d7d8eaf55705f25431174382c02799ac69306f720cbe895c9d912036813e4949f5450', + '2640c4b62783aae4c77311ea5703ff845cdd8ac9199028bc7838b19bd5d61d7377d562b762ca9c6386db4cedba762082a138de422a10eff9df919346f43ee2daaabfdc2af65a44a4657a49b494e163f11c85860b50c4637138095485a332f8565fd753adc7b31a20b0b977693afd4d9b54d4a190c4e7e8a83bdd14b8711537891d3f1cc85698b1b7b7a2451cb3b95ff416ab01fde545a7d38238cba1255caa54cd4b8bc7dabc46b801ec84e6aadbf188ddc11105094da5fbbc1d0a59c1d239e9cd09c4a6e5cffd84625291106afd92480b985e05e9e9690a0b1deb442492f1ccdcf8f56303657756dde7ec491db111df56c94a2384c79710a53c571d9ddc77dbba9735647d8895d465599719e2e8b1162b454e7c56a0e1b59535c12004d502e4e210402df90a807c14489775f2ca9fd4e6cf00939603839e63ab92547f409aebf808441f66312eeaab943e0c3212248e27aa5eb1454f0eb5cfe374074d3208b5ade22c612c85f36c56569f31c07c211c6354f012282b8a89618c97bba2fddd4b1ffa37e039aaa9e91ef7261930ba41e361ba823f84e91136cbba02a7821bb452bc6d6bf239bc98c3d8b438affd46f4638ca830aa0408367873d589b210529584d8403c96c7c4196b77e6558821324322a04bbdf5860d0cb32da76b95872a4fae29f37e0df925a9e0ff15076c9558644dce14bbf045b8f3ffdcab801d84c23694', + 'e1d8fe8a9925adaa7409f9de4efb7d76ee3966a799790bb9e50d5685393292820234fea010c488fd83bd51bcd4404f4ab45fdb0f07a3fde4de48ea42db1bbc86d775d817aa50deb6e2ce1bc4aaea3b1d973ff8551309e7fa81c0e05872e0a276fd0adc840980a235587c0b65c213751391be3dd5ef1c2d42204eb0c14ba2ade38c7c4408cefe4753873df1c0bd2c0dd6c4e24e4aa0f6bfa64d39ba654497b48f094d7e96af097dfe6c1952ae924c9947507811df0aba84e925b26c1c440c', + '59f65cff132486a62ae6c715fce55ade7858c117e521789c6b20a6fab4d6d5fe396b15f7b70e003ff74947dbeffdbc5fa11a9c3332be50cd7f88548148dc6b1d775984ca1a1155b1d993211f32172bbb9a99ca33a7a33a30e62a53d98f25a24b09dd01123bcb0c1c636e01a00b00a63d91c5803db03684ac8cf868d3f64483203cc5f73b375d269363b50670b5d93c3bfa7f2c97d0bec7a501241bb71f6f108ba2f74e3974e8b3034501e4b6c336848f6dfce0475ebe1c68dabaa8b27a404c88d4613cb8693b94f648992248b8530d641169aba74318781da3afd7f53c6aad573ab107abc796574ebafbf18d13ae317d7e137b9c2e01700c5cb0eda7e4968cc8', + '3b2ec09b0d3e81a0281b69fff90c3ff7c5c12c0ded8cf434bf5cb384ccb051de82bf60bfa13055bc6eb5a627d07fa629118230f8dcfa05f7587f1c1738c920cd8f07dee2b9adc7173262aabf6aa48d98443a8fd9a9bf874385b101e5d7601ca333881436ab60281d454d05a55de92fa2da2fa5094b87d98c214405e2ebd6e057a1942f0f4e9d8e09ffbc39d6454ae4f8a400531c121de2d66ff4b903ff53a30de8a1b1e3f3455b30728c40c49703865f463ef89011b6aeddf56bfde69ca479f69a4c16819d47faa23aa306aaaec948ba62f081f14faa08f74b071959bc8234af97f8016ed5d28cc39981e2265bc298d589592b49b118581aececea8746654b9b97b83f9c825c725757ea7e9221a9aa5fed4ab29bbe02614fb9dfd982901e12330560fd83264754621c4935c74357ae21118c75afafb46c14e2ac85213c3a88922f3f724c89a574c439fca4540ee706b48f7bc28c61b0b4d2343e9b72cb88f5a48fea1d702cd4369c7e65c7b039af3b9b6291b6f926697ca5f4171d09663ec4996ef72ea306dacfff04cd04cbcb9c2fb697d04f29b5111738b8e52fce3fb44d34b0894df597e1dbc00a3c4020e49850d3021167317d6aca0e745cade7c2ddb5ed8f008f27c36f11ea671dd2655a30fd227e1cfca320912ab3ec04d87f2110552beb82bf164423b7e275dbef98fd965b67ef19405a3772872143b3a64f5285edaf', + 'b427d6b159c62b6a8555950a4931865a8b5638a007c031d0445e4ebbdcb0cf28a91c06fb29eb569508b0d15d6561e5884d5842e954242caf9c71481a66c4ae0277e810f9e081a60af0006bedc5f487e42f2ae23a769e409973a10599af2a66e9691fbd4a345383c9d2276de89c4bb6bdfd170a30b1d521ea0a77bd2cfa46817f605d6a028da60b6c29f00cf538877222371e25c5d7dc23ff094f50d97bd87c8948808d2c832864c14af04ae4eb20d873157df77b867333be406569e38df5', + '5c143074d7d2a13608d44c44ef2fe0a15d62762bcb1b7be97b2ce24d4be918d2fbd0673b69a419806c7d1f316c2811d0fc094b9de0db603f92c727f93388777384608d36217d186f9ba14b496aed4887a4328ead82a10f9cb361467182dc8da56c329f9ba57f350cae2e846ca2e579b0e64c1cf34e19d96048c4251dce29d9aa6150ae79b72fa45a5ecf4f75b3da18a79abc71d4f472aeae8aa733a361cb369dfe4d3bd80c257fb34b5f26437f0e5f75bc51cc7fb2270b97659b54f67ecf9c109ace6260ade8b047de850a8378f304b927b79684da2c43d0525f8f451e0c9496f01a1b2925fb609a55ce89bbbb93ff5585e3e1e1a8a99a0b95f22f9bf7dca424', + '6659c12b8dd99bb2a98fb94c3cce5c62fabf163d5aedb6eafe6267a7a88c77ba0e9834cf3d04f3aaf02fbd9303fa3ac2141120c3c14d452d18d475d3123790d02f332cc01fa6fc591f9c5d3149fe7f2afaa1d67ccd3825adc2a3ec9e85758a5f46be08fd95eed316684677dea66893a3adc8df37c105455c675052e575cd4bdfbd3218ed26d2d74ac81bc26a7552601d5ff5ba9ac581b9cf9a0e71c6d2e5597cc31be91c8b1876abb2cc4ce3f195660e2999cfd562adb982b8585d6a1786c75340bd4e978dfd2bf4df10d7d24b75780536ad3aa3de8e34c81c47c0f808b5830bed9462f85bf7d40f183c3f14d997b6173f38eb0b5652e67fda827caf076e3e7321b18fa11d5818da28f395b49827ef874fb752a9f0f51e1427649ece6da0080e317b4cbfd2be5d8e2af98f170b9aca96f0cd4ac4241a02f51bfcdd9fcf2408af7e30324aff4dea25eca07b4b5abafb374644e257569be41deedf6138924fab6a2b1b174c7f8a77aa543856219f4f8ec574ced4adb80f5519af7ef30d5e49ae5052e0c6ee2c3eb66f67b8070797a9a59f8fa4200d209b3cca44d85288c128db10d7b2760e0e5bad775b61973a728cb773868b2922186fec251e82953b4548144e5a597a8f75339fbc9d21c9b08ffde1ae9319ad138285a730f4e4c244806ed3130bb9bb39400fc10ce552736158772550a44cd2254ee2d1f9442420b60ec65829', + 'ee6c40b3ed5280f9c9ffb81a948d506e822bc929298fd9d7c7e55ae566bd05ddbe05f3216f2b6044b5dc7273c5d19d4a390264e7d9cb271f0d22afff33918a476d8d70e122d88410ad9ba1825c1c0578c651c9c79610637d0b2858b923b39a77c0f16d0280ee2177c998413090cb791548221b57cd3fc6c2a693c3f943175e36f0ba1b272a213f1b428e91cc6394c2b44b3532ed85e2612735e6bf7d97487744bfe2590d91ea7631985d4a26985baa87a5aa2a45fb19c704d9c40bf0a623', + '62a626deefa95cb117af6a9ffd4accb19b81457406c4b4e3942af94bd5327679e05d79fbaea91e92ad8efa00a6427b4a6e14459c72e70e2f7aa6539d181492945ea8c77142efeb8ae343d5028bd894c1a1a78904cfdcfd4bc4ee4ce4376ee64b96fd554524570b6098128eec7b9d482e7cb9002e77c24eb27d2ad085b6ec13d7c35ef206aac4a22e7146ccbe6a28bfa13a7db7b00963bfb7101036a2847b46dd4c7b0586fb93a9e0e942c4a8f707b6aab318dcd3c8e07b7348a1a51dac0d36440edc766534ac1916d42f9970f40c7a4069d3103906a96134d39a33d29334a086a49fac6ebab607c81aaa36f16866301bc4cd37d762824dfa853ef71c7b244794', + '2705ae613f3448f33dc59af7e24bab5524ae1aa2d6c353af1b30793be0962c5edb6d1ac07ef2c08a1f075aed1ae7691ded2ceea15cfc86735c526cb526dff2ffcb01b822676fba02fd2ebce9a52c9f9c80e0b361e04c38d15e25db560cc80d9405ac7ca79020471720eac93bf4f5370a34cb3cc4fdb226d7c531e1f6d5e3a1a49f140e4b187a6d15ca6fa78a5e04690ab4652db56276914fc473dcbc05a968fa009fd9bfd07a6392b8f3d1910a11df1c2ed27e4bf2befb11a510392ed2f2e1399d4ecfecefea698911cfe67dd76d48084e5761543fdf1f6bcb0633d6e0acd74def71aefc0cb42b83bc32c749163e04fc69fb8e267f893fe7b6d87d38e85648bc9d0b9dc7519c0ed867f0edff518f38b55a39d28e0551c4a35b682afe668e124768c37a19cea829cea112cd97e8d5a45cf94b2535a75d5c9e8dfb60297aa3e803a6dd43631297b0a21fd665aa2436df4790b7c08f0ba2610be86de70cd4e45a58461eb69f19778f45b4cb766cd5d470fcaa924ee022ff35edb5660fa9ad88cc58619c03ed55b33fbc58022d40dab92604ee426a7b7ade691abbfccb99491caf20dee368fcae50666f3c71c6acad2574c7982261874cfc6d39d2f21ba3ec4771581278583181e94dfc5b02f88f201d7db9acd8ec82cd080342ffc99350025c5fb3354b8a81a2e1014c5ca7fdbf9ac75285815c540ebe4a401a716348abb2f40956', + '9f457291dd633b548bcab77d7d0c20397813fca45077c0ce5b28cca215744260c08055264aaa27848d4b78b1a8ae57ce13a420974f17db2a550bbd8850231a0bab253241872112556fcdfb2acabf461514727aee1ea745368e9ced9beea69329e8cc6129895cf65d5f454172e8538df22c5580edf477ab15f34a0a187905de9d4d6dab8121dc146794001ebed67e2e5f9b5e94e927b19f9e8cdcab127bceb56f04ab5f658538a12cf6ce0e8eded51ae731723023ecfa21a2014bd33dedd7', + '66265a93b5feaa3c1fb487774c817e902176f49b3f2135363aa5b3f1f34fbb2bf4628a2cfa5a93dd5f8591cd99c16452bc015638366d57167ccdc9754c5de3afc6473b8afc0639e9bc3d1966e042f634a8a94263ecc7c16006f34d66b98e985efc108fa65607cded9b3af08d5482d8bcfbd542cfb49433128a880945c4efb43252b4fec612557f51fa28aded5596c40a884a7067054b3e5f9ef4123ef962415a16a37545f8b537037c47d516d1451454bb2e70faea6ac7897f364b333f7fe79158964cee5a9cd0ea11a698feb125bf5b43adf47aeeff90f9cea9718a4ba6c560948065df249ef7f8626e4d4e6262d87113420e7ca281158e0460fdc27e6c02a4', + 'f5b2e7b72a63feac67e53b6c7b5d2e661e802dd1133a9e6d4a09f405c21346d5eb27fa09d9a9757e19a9099389fa3b4e1a96d30b36870b88528bb45b6c3b41a4f521efea4317a5b2c7218a6aaecf5db94addd451b80749f4cef99a2525cb06f9977b47170614fb5714455e0fec8e7ea4d99c597f6dc2fd8a7b155190d899e2f23e1bdb2cee9d00bb0171a3592b59b0b73c8ed221b3c5271cfdb21670ec2ac9815121cd6510ddc1e92eac92e824721a66a5e9faf2a1d09271035f082d15b4efcc1649dab4b3ce97e1411a1b70876e6d1a9c91668333e163ed831ce29e279bc4da0d31d4677be204951bde36eeeec8de9b50b57246a3b986d5d39309d97c9e029941a368e393f00b9b9ef3583b5c39b40006b11808ba562a186dfded9ddfd19141c7e215cd2dd035af91378ba8ac7070a64c48923b24787f694e6aa140dfb8c677dad74a09fb58bafb4c4f8b71bcd357202010f8b97df0fd2959c3c669047c3ad5d0e3d82f504e58e88d8d2145bc3705bda82880f917fb9ae55f049c1b4a8e12dba87669b2018227752bced5c0b1e18989287230782eada1e2345c27fb3046801e38fa80443469f0691634613048fb6f6adec33459c63adc0007b037362c927913bd094ae7339bffcf2b6b969755aceb0379e1a055e39e68641f6a73db4ccc22eb9683c91db337a951156ea5103ab8f49bc9452b5dd054e05d894d5cc4523ce3af', + 'b0acc52d34c9a8e9b3786e7d010176bf928e18c1c9b160e10c88706888b10af384744338453b2ee13ac86cd9e6c9f3b9bff4e3aecedd90a52b25f4b590a41d73472ae9ea3c8ac714be605fa83c6fd689e59ad83f4d7f4521bfed6417c992d8a1b29b856253b5a8e28068e3695bc4614b10187ea3a62a6296f0ef159b8e3c6b4b057f50d327ba953df22a2c3a9b13d992198df9a812ed6fae9c28a40116527eb276be5624105ee8b14e5ca20dd4775b83e5f5ecd5de8840681a0777bee843', + '0a1498c58efde5d6f5770a7d0be1f974e3f97410375277cf67d2608bb4231bc071bdcfac6be78bdaffdb0b1184d936758e0f4a896a9e907608bda6fe3ac7a87a740a2042b2544e922f2bf150de6267fc1873629ca7fa868698432a1bb7d797659ec7bdf04da8c213cb3720db9650723a9bc0e1c3a4ac813f99d6fd76e60e4faea0c1ac12d7e3aa75c0aa1ffbf3df61ab26c337edca3dbb5bfa8b1f9e9339c71fda6aa74ac45789280d59d7db490ea7643b42c09ca4cf6f46e473dfaf0b516b4ed43047a5ad013b1327aeffdf8deda8c5efc6d00e1dc7eb4f336b2cbf6b1a32aa2213305d9170bef89fcbfd46033ecfa3b6f44785f6713e60478e8248fcf67c7e', + '6b11e74a286527991aabf37b3e2828c67b9a981d0a5f0f428347ceda31a6b2da2da662cbe5b32df796466783b188baa715c547b505af000928de5e5dcf43e26a5222113a8d17500adf1ba299bf1e92f7e5a2eb4fcf855b61f0cb45c074c9fcc6c9df52a996dd4aea157263c0339a036bfffe215e21bb71772b9e1d529b63b16516fed883a7027f7b75c7b8b91b135c0d60e8acf4b21ab4722cba4875602d4d2182b0ba3357f5c08bb31ac3a0024b2c99b910ae8d17fd13fc6421fc194e7914371515b7b31d41997f14a63153b28137d28e1357a46875e6e6dd92ad0d0e8901066501fbd6ba82aafbc10e771cb33d8700373febef670ed92cccb3e02cb243df82d5518eea7da76991e15226ca8429ba19dd2b1cb1ca62fc94a2821e9d67f25dd8eb6daba52c3b7d36e19b6ad8c22f6456802820c99d3fdbda27c829827988a44a61988da3522fa9601c47ca472c0c2a57451adff8bd5a429f2d3cb2139ac29fca204634adf6cbe6114191b11c69351f79cf65e3c0990130d6fe69930b799c2f708e0f6382c242331368c0642750a2502b1aa7bcb5da916e4deaa089e4f81cd8714ef5cd4741e221f8fe5a1da8c5efd8c36c21748a8b650763b93b31f3fb31713ffedbdb64ed3b010d7baf1d44232994ed4b2be9ca53cd8609c14f5e131b9c2b801f7206faa0c61167a52dc6eec43fd72f7c4eca2e2e7749eca152e2fce94d3558', + 'adbc2a0558e72944ef977ba4b7a62e30ac142044444686d24ac15474d3a05dbe7c104a48d13ebe7cac64a27e99a9fa5bde11e8b02371bf210316e641ae783e5beab0b2fbd87e03a29358acaa030902f26bcdf35dc5a81ae0dfa230337f072bec7374115f3f97caa46adbbbfcc4a8dc05aa9001887b212f0f317785d8ea7c25f78bf4253f1576b1d3f4d415e0cd8ddabbfa8f58a2c177cc58ca7af21dd5793b84c9153d2dc6e92f38fb6356a49300cdc361e162d5d05e60ab0d2f21377541', + '6bf5f7b436736c50bccc9722952aeb76d378c1bda90f37b0f9d6f0b7a68dfc0508e1d899197c90874c4aedaba43a169a79fd44c8a3283d2b7b823cce147cffa71a0a9d588363546a14b2f67cbac5daae7bdbd8318fb38f30dc1b26f14610976ead834ccb76c04b64284ba3693fccb8cf8dd75b6692c68d279df0e4b8799dc5f9996ab9aeff0c1d42d5d4402404e002e2ece9d9b2660ffb5dc551cf21107c9d3ef5c025e275072e48be69c7e42123e9e8be880ba05a6063613cf94ab4568296956fca4f3b834371d9474eb368bf0febe503aa7e92fc65116bd73a97fd6a1998a910717c704ca3ea9abf4be9145623a6055aab7e8020ae70ebf3cb113ee661f948', + '90ffb0561074d2eeee95376ccb9408ec526fa6f9bdf82fd629d12c9d5db65aa4e4ed93309b14d5b0e26b89d8c5704a2869a8b7f8c0b4b75a31dd712991db74c11dd1ac5d0135953c1775db08cf8f49b1e1ff89f32358b1a9b3c6a9c9cdf8d4ec500ad90aaf00d482f1b1777e94da8cb86eaf06c0f1c0973794a29ba202b6651faca1b265b1aacbf0f39e7216c9dcee441c36dc790be58844355e2b04f5b9295836484473009cf5b0693bc9cdc6592ff9f9e483450d814558e535291433c46619c25110ae793feb5b0b62a5c95b93c8f16beb73028d62bbaf60c210440aaa4191a83f25b8ce410defe3cc18372df3cd501280fd971152fbca4d9621db1c58d6ea364acd9c2daa5969ccab4ac701f6913dcf74c6820e05cc8175d33357a3a04c8b485fc81edf009f94a960892935143d13cacbe95298eb0d9efd7ab4e47e250d3804c2464e20e420e5f9af3fbfb2dd320c735a831cb45ce41b86e78537045f422fd66d13a782df8f0b6180fe4b8d81cdde0674550e6547cd6ba1f773e2b9397b3d30a4abd344f09188346957be60783f9900908cc832cfaebab9c19539444da09db5f95bc00ce875972403ef926af086739fd96ff99693eefafd229b3f0fb87a34ad8d6e980d22b15a6c4553e5560e5c4918cdf8e63d2eafbc46dc545b59cb887085cda7991b3de5dfe200cbc5d67ea6447ce9bf8a450cd0c8bbd3b9110ccadad4', + 'e62e3bf7d1db5524d4a1b9512c2ccadf00e719044dfd4428863950cb1554da30abd850295ec6ebf01785f3f92121b5986fb7485c1dc49176eedf2254902c7d0c26ec91183ea1c82694d485c2a0f230958c4933a1544c160a9e26d83af872744acf8676f14cece62920a9a9f1b0d9513f03c0b9f9aed423c1baf596239d9b6a9dae368030dff337cb3d68c86daef0b0913962eb5159e664d9f48030556f29aa16502a71576013a83b9b5073140405bcd935c4516eea7d348c150fdae45362', + '64325fc7cdc5531a3df823c994b32cba4e1488c86b75a580a773c0a19485e5c05b72bd0c511b872b8e1564c34d479914ed1cd222c981f761db75acf29dfa09db89123fa36714c6fa9b6bcfe26a73b82cbe8057af52248a8bcb33223b07b7bfe3791c720e4fd12eab46d95d17c70c1ef9b75b7df9f4d6162ecd51f8e16b23f644c5aac68fb1a447758e75695d1a0d1d1ad5960441b0122595b7eb9d3dc905dcb6bb914ab11b4e19f2c0f570db34ca02b1aa9ac62f07cced81a0574d75a3336c6056e8593366153757ee643a30c820a983f57b498691cd18a63f8f65a370bfc1a3d2da737ae783ab1799116c6cf0f2a31fe64eed920d56b37545fae99e4dba1af5', + '170792e80d2a35edd05e1f669cff5bc1bff3dd33097626ef040d3fb04c9efd8d435438051d7a275344a43ec89c609f384b86d2f94bfe2ee169f9495733c49295b854b91217da893a9f7cf5da93a0de87c6aa5846719801c36637282d53a511c9baa3018e76b8cca6d4dcf4dc0f0905ded410939bd1915f0f64b8854f2aa8274727d577339b3979188b6de61bda2f21c10fff54c20c3af037d380082fc654e8ebf27264dbfe44349523f69bf80717defc764a33f1bd5fb5d96a2aac93193c04cb40091c5d4726c83a17a4302dcdc6410b9115e4b0da5a8d5309663b15c52cce4ded2b96e765bd1c5858ba11d565994d8ac93fa409aaf076aceac052e02b9a17d0be64ca8d65023ed6221f030daae8444ed755b24a19dba8c50bb5ff979672306bee8021f45fb42663fa5975bdc9110600df93f841f73c63ee3f8bed9447a88455c81bf5ad1a3c589c7e2e39c57fdc637704a9abb693dc9233d620c3db64d1538ee4b461719f55dcd4348353baaa88252ecef04c67e85d793cca2c18890a036bb3bfc0dda51c9948c86f5c7c363ad915f092dc3e9108c1ba91b349b568706a59278d0a4b75b7278804ff38648516cd2ef534f7d4185797bec5cb8fa8692c1ed16227754a17c294722e5fbe40436397c63a399b5a85b4a3d1b685a11d5848305cf6730fe052a210c352c820740ea19475c5fe745db763f57e36f3738981fb11ad63', + 'c27cd9c9e1d01bd6c83d410b8884470cc11cd10e1639f9b551d0085f68ebe2883f2714f4c6ca1819e781806983ff02d31a00a3fe31144a6eebcb3874c819e1c86f66ea04f5949f35548f0d649cb8e7bc4a5eac5f58d1bdfd21b79c4bdf374cf458dacc5573ba679fab90b387225a451152b49895a80ed074f7391c803040e7288ecdb63a7bd759d9d03a872a1a6fcb3f1452d7a2940837a9ef97c1b8401a4e71734e6a4a2671dd55720c6e01a1971cf853d2cbbb60c4e57244309f7801fa', + '24620e2e838350a030023f2dc42bcc20d43713bbbee7d6da1ea5559b55902a89d9dc7361e06cf544a77600d904876410724d04918e66f7f736de2983e350fd0f77c77216287f5fbac9ba99935af099e1a03309be8ee1cd676ea7be4e3f64c73fce2e8501176c0f5d1e7cb7262cafc62d84534bf7d6f3747ba86ffbe657cd7f8bfd29bd21ce79d0b8095d86227740ec9db7dd687a1b1c8430df2646adad2df2c5c724b23c807bf2cc689f1a26274ad960667eac5ac91d13d76bd8ea246c90b04de59449edbcb5a52291e6fd54622200698895fe7ee28f9a907176a42934dd742550e55486526ce2739a2d6bb0db36d4800e0d974006e929ae95fb056db616830a' + ]; + + test('OAEP sha256', () { + for (var t = 0; t < vectors.length;) { + final vectorSeed = createUint8ListFromHexString(vectors[t++]); + final vectorMsg = createUint8ListFromHexString(vectors[t++]); + final vectorCipherText = createUint8ListFromHexString(vectors[t++]); + + // Verify successful decryption + var rsaesOaep = OAEPEncoding.withSHA256(RSAEngine()); + rsaesOaep.init(false, privKey); + var pt = Uint8List(vectorMsg.length); + var size = rsaesOaep.processBlock( + vectorCipherText, 0, vectorCipherText.length, pt, 0); + expect(pt, equals(vectorMsg, size)); + + // + // Verify unsuccessful decryption after vandalising cipher text. + // + // Flip bit + var copyOfCipherText = Uint8List.fromList(vectorCipherText); + copyOfCipherText[0] ^= 1; + expect(() { + rsaesOaep.processBlock( + copyOfCipherText, 0, copyOfCipherText.length, pt, 0); + }, throwsA(TypeMatcher())); + + // One byte too long + copyOfCipherText = Uint8List(vectorCipherText.length + 1); + copyOfCipherText.setRange(0, vectorCipherText.length, vectorCipherText); + expect(() { + rsaesOaep.processBlock( + copyOfCipherText, 0, copyOfCipherText.length, pt, 0); + }, throwsA(TypeMatcher())); + + // Leading zero added + copyOfCipherText = Uint8List(vectorCipherText.length + 1); + copyOfCipherText.setRange( + 1, vectorCipherText.length + 1, vectorCipherText); + expect(() { + rsaesOaep.processBlock( + copyOfCipherText, 0, copyOfCipherText.length, pt, 0); + }, throwsA(TypeMatcher())); + + // truncated + copyOfCipherText = Uint8List(vectorCipherText.length - 1); + copyOfCipherText.setRange(0, copyOfCipherText.length, vectorCipherText); + expect(() { + rsaesOaep.processBlock( + copyOfCipherText, 0, copyOfCipherText.length, pt, 0); + }, throwsA(TypeMatcher())); + + // + // Verify encryption operation, can we reproduce the vector's cipher text? + // + + //--- + // Do not use in the real world, only for testing! + // This only returns the seed value. + var fixedEntropySource = _OAEPTestEntropySource(); + fixedEntropySource.seed(KeyParameter(vectorSeed)); + //-- + + // Does it match vector? + rsaesOaep.init(true, ParametersWithRandom(pubKey, fixedEntropySource)); + final ct = Uint8List(rsaesOaep.outputBlockSize); + size = rsaesOaep.processBlock(vectorMsg, 0, vectorMsg.length, ct, 0); + expect(ct, equals(vectorCipherText, size)); + } + + // + // Message too long. + // + var rsaesOaep = OAEPEncoding.withSHA256(RSAEngine()); + rsaesOaep.init(true, pubKey); + final ct = Uint8List(rsaesOaep.outputBlockSize); + var msg = Uint8List(rsaesOaep.inputBlockSize + 1); + expect(() { + rsaesOaep.processBlock(msg, 0, msg.length, ct, 0); + }, throwsA(TypeMatcher())); + }); +} + +void rsaesOaepFromBC() { + var vectors = [ + Vector( + '65537', + '18329217279129047599928806658090795218965128603117317816991794458216724011503245770495015436599417624674453700179115901853297370103589780033452305875387523631943137116091358449115603692042654878721127101284026952253675215007943515373405972137692442962135092549484760763266587118899791409102037013921404939390181223751472627827705346551953516256888392767851186631216835634474071675505958586396771252034180754174943415153548216160756132208337030301019869021256167058990556822778603285874688909024436599331568169985447428984275783284744039529640106023038139189061819173687874637953173824018096822256369541752055251546359', + '871474755355999089390392626250986738823799391600371733795358828322982620807240395820108764521473142171377965573006471919295582727967190359403655722839121773000515971950816682598291363724383365153959321415399361936348199794997512762310343915361546184140454222564269260697601133138406549441719140872775650260752864939310738163191807920999918084807656911787448990430355564553967601350369480153793796995880979379659219366469559690644199335318891335629688926962152206313343604012636149694175054409987470880735437923545376913490821847333390299732957408602797271633303370756312629740218231012737703014343181534686846307393', + '18329217279129047599928806658090795218965128603117317816991794458216724011503245770495015436599417624674453700179115901853297370103589780033452305875387523631943137116091358449115603692042654878721127101284026952253675215007943515373405972137692442962135092549484760763266587118899791409102037013921404939390181223751472627827705346551953516256888392767851186631216835634474071675505958586396771252034180754174943415153548216160756132208337030301019869021256167058990556822778603285874688909024436599331568169985447428984275783284744039529640106023038139189061819173687874637953173824018096822256369541752055251546359', + '139938602947854926673274376453107989073071827438226512797650594061983297161783711276901852736597785930143401375196002497817729904598157413814575098620989414422686350708665981330220682164718216656819685880412277133946504812497734067927436542166773583464532860288061057630436091686749633450714718228505170499039', + '130980422078095429561752625252772990524110726095230822580220780407796115924674034028988759464767902261255001063231695869052365128259353804033624087488011680139885948265015821069772931331044159596841425313188756863343401896929103897656562392424149690632009352791193293004161928133083118699425976206871054587881', + '737847bf7c49b797e0a17056e2d8c0a6c2dc8a4c3a255f3e011cf1ddc744025333734a36be34dd4ea4fb187b93580f6844dab0fc89465ed520b56c9cf7f5a448', + '1c10adaaf46a8a7b0e56b9093beda5d88b5e08cf35ef2f4051c3cfee435ec41cc18f70abef80d96c20e53b01f879abd5e5ce5a6029a244254dd999ef0f1d84567035eaeb88a3770c6890efffaa4a00d8e6832af98e22af0e07dcffd23951016e71db04434db2601384e480cfdfdf13124cffa42479c7f5a8ccda04a05ed864d2a588a3f88ee5733640e7719514ac26c430717d247610ed8848eef197b8bc31e2cc248d8d78459fab384abb5ae525189f0be0f0d5ad50014d9577cad7363c0be0da1271dd69ad75409bf7a9f9f5db08327a87e4d021f04533a397e884dc731627e25b862d09cfa5abd00771c711159ed6c6b64ba63855e54d018ba6bd177f12f6', + 'd791eea439318769a5fb4e593c537a211c509c4f2512b4403f0e1e0b68a31924525ac75469bd0ffd90dc58f7f24a6dd4bdf42b451dc5601629a76259d4a772ee26005ca45ba401cfc58dac895f4d145cc909234e2b0cf970679fc27db3bd2f8fb0a427fa86d7e8707eef1d749ff96b3837404764265cbf8f667d2f0458bdecc148855fc417de77a7031585091b2dc5e28cf0b2c0466d6ddd21471c4b2728298d1334109f1ca266d1a325bc24a96d3066220f13144c0deefea4db897670e6a98e873af91039564946bf1fcd84c0c77ecb0d1144bac6dd0188040b194cf03eed651d10b177f47aed560c2716c5a2d6a66ac3a0abf115e49ac387158bda372004feb93c38d55fe848eb8c118baa2aba44347de5a5f4b0e98a21f94feaa3e4042526607837f7f6b39206fb6327535ed2d15c5e241534975fc8ee9ab2179a530c8618b36463df692f61e06e9f01729f3f4d8e91be814bc05b5061f55658c6f39dbf72e85936a79f41dd27376579df4533144c514f35e407e72c600cb07430d839ee1776968f25e8b48e7a76e27fde1b17b8f4c366d0f3b8e5e7223532ab10bbc40ef708f2f9d94f0752ab6a299c4bd3aaada46a520c40610eb0dddb8b2c23f9c24d83fa131876d27fe1de046ea23dd31f1b5491dce981b15e4702e01f6c5902fc237209c56994426b07309764649eb1a286f0c8f93033b290cd237a099688a02760f09c7f079af95dce1564e99ff99169820a38adecae449a0b27b8f88779443c251cc301a7208dffed0c5e11d0749927390bf0200f1199b8062a212c4a5b913469b400585e4a32572594abc43528a5f580cf3900045e4b5aabe6bafd7ed293e2f3684a09c58629f17c7844215f4e1dfc1baadfc4f3dfa66cd6fe96b3765352d4621b2b37f75d83da97d1b6f1fa97b683b0c5e33e22b370bbc3d49e44d694ae5eedaee5b54057828d8b377276115a8bbb0718d86941a9fa0075613bb02476b2725caa2f951af799f0b27cfc99efe18b1b52dbff6f2de28deb346ec115ec7d83a49ee3ae8ac6203da2ec82a28190947925055500f98a258d0c300e9536abc13eb1dbf6afad1c09037b2d0893a35207348ea0c5cf6b8de71f7b5243c6c5840da61544cc14aa6c94bfa085710057c685bd9705f451410b69ae93c665ee2267d44661271ef5709d9cd3f63e82f5babff5a388f9e04741fffd3bddd774269abe4738777d201ce7475e1c0b81ab8a9627e97b9ca9d22492580f1a732423e948963613bfbbe41e167657220f123df82e6802cd2820c0eb294ad0a893d13ed66cc32ad5da596de7656c432b00a0cc41299ac5b4df92ac216550f51d077d3955506aa27860f29d51487fa3f91430054c2ba2b89520d9c33095ca02a727b3278fa5cb4187e17baf53983bf9e55c86bb5c432bd4f0b1072d2c2f9adda99a266e9a988392d3877ea4', + true), + Vector( + '65537', + '19569948865068536220796258723086637852008297300026106349963994132199477810199047175899658629239003270723655738566573526731538394167442667834888430144306066982129214011881836514687558246034685766252347057089991537170837477708330723082763394365944677788766871193438382040109729808702973595504627972224944777527374865550366057217706136258645711267799610223058431864733347367267901540839952258620469468571043208682852319667438096213018666218650237356899215935657286247127436286944431950409154631150939504050756036262766929390373805529061561721863375350515301920898024498859456381733320558487139634893131924469609086155977', + '2682331479434432362441942613253681068177175222726238717291592051680956700788340800148201146707915477212764065880478025348241855901362522307915285195824729895840841008365222194368214349673742673097689404871677395677576641483200448643845352712829234698064385190241521984082208148666045685109467887109626969503204467048981076846824468472108268455623568524243811843709827875184517129418949264059283188441904126749091302309131019673249568789886447460474056002292397200076608255581488013318454785670653593214955554015114552210995629053705858542326148168308882683141875279870689522709904562759304842005687816887434236438205', + '19569948865068536220796258723086637852008297300026106349963994132199477810199047175899658629239003270723655738566573526731538394167442667834888430144306066982129214011881836514687558246034685766252347057089991537170837477708330723082763394365944677788766871193438382040109729808702973595504627972224944777527374865550366057217706136258645711267799610223058431864733347367267901540839952258620469468571043208682852319667438096213018666218650237356899215935657286247127436286944431950409154631150939504050756036262766929390373805529061561721863375350515301920898024498859456381733320558487139634893131924469609086155977', + '145835548171723582860236439983550505455458319012470930607600001888971140083509449385071620383937906218977079837244074075213020960325842524264393644936862389772991896271099001511991775592998084484547129514354779854138169376007322466721134239392894573044786118173646871095974390695636022494704640684100152620549', + '134191897040251275842789384044745185132072042826768949353713249326752714554591714787345489954150944972550569831193756481324390655581570283683976700869116039434467184801636650007449650971637165464898935582726540090128314754515834948172908500679141710373727071021688918409017946527796904483060335428738729149173', + '8f16739968fac7fa464ec3877251c8de49757cb248bd59cd9f75c3fee3b74ce6b9ab32be1e5dc1177937fafa4a4d9e171b141efb929e962f0b070eb68ccfc46d', + '555878e6f80def184ebcb1e75af080febc0c2e5a2335880371ad8f399944058462672ed6d1c5ae1df76c2ea87c15b64392aa4e104cfa3c50ad481ee87f1ad183e40852dcbfd3b9edc68ad0c7e9f761b86ffd3ce1afa7ab992bfb5a2bf110e91eae8cd137cd494564f841fd542b0d0859f83d54f894476524ee7d432a8cd394fe78025221045908036423354eb14e8608ffc08960877e1cbee573b867ede2f767ce9156d18453b6eb2a71a8db05c6e0fe2809aed3785d86c01f671d87f1dbacd220053a175bd983f7a75d275fe47d68f232c2263f5ac52d09b59710ef5036078ff678117346b505ee3b8657826bca741cbab45ef7459dff495590ccf1c0220338', + '61ec0b784fc5e0be21617a983c692fe14cd37e2201bb746c0d8ca9d41ca9baac0fd000174647417310ef56e16f2e2ca05839e0ba406ec175714f228ef990c739cd3af8585565203451020369326d3509eb950f0f68df0525e7a62e71d5b0599542f4c47bf4ba9a79d5fc819e897d2392824fc27109022d90baf6e07061ed21f22650c6bce9a8a465adcc0ef040cb602ad71f53941dbc36d9499468283591be66ec06c8a8587fa1e40068ea0cfdb30cce72eb575f296f3cc6acd4e0fb7537fe2680139bd11931acc5456e8166ecd33df25713ff228516b3b3d8e71c3ba0f725012b1386a7898424864eef8334bb6211c52cb8f6cb674a56f495d7e0890eabebd5cd1cf3d2a37d12ae26985c520139a3bac61a8345231a35d6914bcf4f82f52147b81cd7373ae91a3d30de04eb74e7a0fbe335fa4104fc83ed638c89d24c38c79aea676e23fef0f41b21d16b775428aa1fbd17ae95810de60ad476dac580e61baf997e69639136ed64b00a83a9823b8eed2552df46c32f2baeb00d969c9c9e3905d01ec4f44544443f94b360c088049149aea4bed3ea067a841b254be03cac97c6042d76273f44ea104ec4ad9abd5bb1a7f79e7fdc8a1215e20b2b4116d153f7be73b12c449844db55dfed0420130f411ca37cb9466b6c367efcb096b236e743cdd03a49c2497ca7c41881465272a2431eb836bcdeb9fc695ea8918a550510650a594a9528fcdb4eba17c7cf27fef18a2def9d97eb10b6644d4d80ea2390fb90b1b2b0120b21ee4b3600e392f843a269658bd62a9a3633dcf324af6d4193db925df3db4f05c8c37bca1835ff778ef0eb6fd6102cbe0decbd4a6383a8fb0bcd22f5f46afdeee4698684642bc9b3d4abd56df8beadff796ace4a1c22fe91a1a54213ec6e3a16e10e07b8eae6054d51216b159046741a9ad513ed9f803f3744d419b2232cdf47c4d098a023b8fcfe22a7189822fb05656b303d59052570087ae2d4a881cfcdcf606d31ccf9bea6d90e8def705ca1184f727868c3e9df25c0e92bb4d82bc17502d7a7d3f7eda05576b8b62839cdaeedf0cc8414dd39965d1938207fb67a4db98f9e0d07d476535273dc762d8b688000fc69c93e19df8f356637188c0e4e037d747fc86689bfdcdea0a1bd96791438ec8d1839df88c0c91b317309e5ed551da0cdc149f0d44b1fdda38d0ca4c2a45d2a486717f4d0a202c19801fb88bfc3639cf5ad943afee6473ab43dd6c7b63d81704861f14a2455b66854cb9765d5f35a488efb0daec7779e3a558f04792ecab446fdce65a26b07c324581eb33fc02303fab6f57de244a6b3461ea215c284936be8a6010a909bb48a33526553c983db969479a58bc89991bf29f0f234a0f266d5e3ada6eea2753f9ac11da6456558f078e23f44712c6f7ba254b4bcc5b1bff2b910048064967031b11924768ec6e3', + true), + Vector( + '65537', + '25038673729224910830580845003347508937183878430568252243060597923803411041332607392164911183519327652692450873138929631978784266430522568470440784639525241788766657600645728222394583470757090752138061009477637438276248151511155162669718467468969624965875279908416587064343777130044791689157602777585816549468054593978537853426172535223238597429205435261183451278722801708117303065362678921575924256921065606924997047752902527599978846787772561984540047895607090694150885414144427290157212302653880114246899270943264626275367221662673432429915006601395866677114630755313736395334714474264115548734012399991539649701577', + '3665330669541655679705891050107041272351615632288084135020867774409707107096521082267758924987236975571329181442186950223483857303017011631037296147755394485725317322370492319355448604186579175173177332036499750880613328403194300042153463650768685468000762418502092438600303825951252273797332066580159719264783444433878126847045099946979594428364397610142426110395907309438977364343811577257119310923578509600802934471264322715095052241970187830259542463962252933510334746936487458581694276279360082463055558123500983154145931168559475784322023134231491373519253341861719350553980757285805374865832745904859709420973', + '25038673729224910830580845003347508937183878430568252243060597923803411041332607392164911183519327652692450873138929631978784266430522568470440784639525241788766657600645728222394583470757090752138061009477637438276248151511155162669718467468969624965875279908416587064343777130044791689157602777585816549468054593978537853426172535223238597429205435261183451278722801708117303065362678921575924256921065606924997047752902527599978846787772561984540047895607090694150885414144427290157212302653880114246899270943264626275367221662673432429915006601395866677114630755313736395334714474264115548734012399991539649701577', + '158583983905122960678499673913480078252467523039334679557106796515538961502086148476206838376197850276185195302545375580630295818784775624880828695801409778458680887001891232052530710022670791150445348537084374277944129929052319716841620177999129668752076023437539741074161532918847704356315936511958042206421', + '157889044736099932616410509564681645236482925020553863320318772062766368147198184049572451248600417630406962137054228993505221845131088005864338734847330895786869459001654903908616676980872205245637285247625574944835533063249009575393914877011929175520203590185877323732215545619943872773049618568385174784037', + '6b857a09b8d1f3e9111bc397dec0c2a6f7fbfcfe8c3c57463401da788dea9395b00d9ec7d4afda75ef3d32756fef370b56c15c90423d5fe07976c6f95f94517e', + '84f754144c94f2698a72b0725bb7ea141405c0b945b740795c552c5622c2886718483b15d00db96f921dbb3684144a408977396309783607cd4539ef3f0c2682e01e526043786d521ad8f34af4a6526bbd17e0fcf03b7b5357fabe3d0b90cfca14e0bb7e6001d34b78d7d2a9c64a4c192a86270950e333fde8138a19ad8448b8871e82778dbe421ba387342c57e4e5fa5137da0f6af163f0ee78f02c1301f4a9b8810afd73434c58940b27e566b164369989c6f882a0b37647469ecc6054fa01a07b0b0d50c39fbab878994c9fff176749688297e64a338f6d2611c50a0cd71114625572871c7e03c286219e03b412296a30376df0a4c9fedfed6c72765a768c', + '4de17fe9b8d931f8cb1dd7a0ae53bb9f9be9e39cd4c7961c47c9bfbaea71070ca358013c2ad32b7dcab98106a7d7641796988477ba68310c75a7b60b9d3eb528d2586fc4dc58e0b7da191822a2b223a50c0d5a6c4a293f8c51a1087b7d338cf39fc3dd5ab6207dbe0e130686e0c6528d8192879698d5e50e4c0c6aa0b509dfffc69ca1fae12e25c47f9b5c84d90f868c2b425460bd9252e2fb786b0183168ba400967e82c76120a749890026aeb60cc0d09b965001a35244f6b66dc57f285d2dfbfdadb8c15bbb8af8eff76b552a2d3c1dabb4d8837da847b7cd44a31f958eb1bc2a06b4c5eea1053efbb1497b59f3433f63443407696d49447175778976d391d2b40018f72333e5934d3fe63306a0f43de404b38172d0b53e2613384e4dc9c2744de0a25ae1352ebbbb8273ecd7e427eed17caa4ce1735468ab425efc159e74b7b05ce77f6f4051a0ebfac8c08420d7c56f280065b61a302412bfb62717438dabb2f66533c58929783a20a8f700522b67f1191717d2f2f79235a13c4f9d795b1110a41e055b42bb9c12cdc44d0ec483cba6128c90a816293ffe345fdce3d573c5f6e2a09a03c014f5a6fe254780e3497868affe89ef789b2ab273e86aebb95508fbf0d3b3248f4cc40557f3483c3a8c870c6dd16565e368c0f7d965889f0020612e30c4786be30edbee4cbcaded196e70e97c44b57ff1768c8aedc7a6cc3b5f081279008bbc03433a5ab197fb063e1262de1d98e478c4f318f85b821369b299c3427661942272e34a7c43599b6011d3ef668b008981e1e3e0ac0e456e967c37e63e5d75faea0217df8792e084311e6f7584f2ca607aa0f68a2692af55a511c542e91956367b99eba3b0eb936c072081b26473d1d093d8280e288dd4cc866e9f648064e18f4af162960a80d1f5a2f6df4f40afca4a4dbdaa28859c175dd2bdac2996b84dac4d363e205017071835b198411d30a8c7d4344c95b1788c213604dd5a187dd3617a4225242623333908b183741d459db5e7f95a24dd4acbf6dd0178fb9484f72d6be29418bc98ead119583979fda6f8dcdb24b81f27f382778168e1960dda3957af056d212808ccfac962e423ac71f4c67176f10acccab770e7bd53839ac717a5b20eb83c7a18917ab7dacf54c461134d1d0552d43d3b918046184ca61ee111117bff36bfe9f2a286a950b1996ecd5b409fb928b3e3015783b939399c48681b96026d68c783167cd448deda74b2e6bd45ae89f245558228ba5d93c911766965647f894a9666cef9208e7b057c7904152ad57aded1b16fb7e15d3222f2d4a66fb86378f517a7ab84224fb2f864ff3973d7fde599d872049983e21ff0e83f7ce6abb1fa6e7a7bfcd695f94164b2f134df2823b5d82c0502f151eebec4170df8bdf2314b4cbc1afde6cb53af6bdc745f9ebf39af1b4f594aebdd5e1b92', + true), + Vector( + '65537', + '22377459671281353965131212059619673838961415245047239906044065787317026019550162295776162977886441782909112037021910251864823212318259140264845928628765361552813744914531741082140103654983928466248301346776937933372471886774127215995131177331827369160858191425381482384322222165889127695048650274770382571650257015391038914125990875590647465590777650206166252700879824083695711659488360010479679975024220544900609370342937871163039034870042207608160414978548690820812868418116997353059705020786146152181252384973149600694580587289841168513121028225279691504647227615589306270627773759154255872151170005378619199091701', + '1262771250199193239695170705750588252967316429462491082872856500040463881022747458933891884783784524937823764578838153802490072827988317663907043568281990500195619548275669170816143123993695905986010138799154608888646440080322359599881323132115875509442423711840586922469823343913771147311375816743117113811116699549417259752263685394147635043038343176888699851180964135666452256843221772370051198785714917638978243596905106549255085426156569956141467273641576421455741689780300838706642238502449715624921233898996244561234414979573934875148833292288206616437008596934610483929022522521437542157563397155603177616001', + '22377459671281353965131212059619673838961415245047239906044065787317026019550162295776162977886441782909112037021910251864823212318259140264845928628765361552813744914531741082140103654983928466248301346776937933372471886774127215995131177331827369160858191425381482384322222165889127695048650274770382571650257015391038914125990875590647465590777650206166252700879824083695711659488360010479679975024220544900609370342937871163039034870042207608160414978548690820812868418116997353059705020786146152181252384973149600694580587289841168513121028225279691504647227615589306270627773759154255872151170005378619199091701', + '161415270007637405144210641021968266700579757366388996182532782565558011969294280148293042545882924750842202000212300412293303030249902732910614619556999585866339137201983073623280447180438077315476057185901523399059913766495765545278516852563644772868210228512955960778702649275181240366728565282943558397199', + '138632854687307828358405998228135430179230620065196869564105040538143028810027679083228793427974907652084069830959896483528730332601255875346239443179888178294234709610895287462518258202999132870518279955448859176417653528971222289983904592090066387603120179060089069243599717364698650532060935008092275431099', + '22f29db0d2fc5e53b3a2455c4e7377282b6b75cc46693226dc221053e4ecd7b87205a311a32376018c603a4a6fb95ab7af6c98753c7b4afcc40f677be7e424f9', + '1624d9f7887d92f45ec101be790fae4686d2ac4299750bed54049e2e14a2f7af205992034a5ac87b83b3667f6f5d66565cf9a0a4796bc110f43738229a90a349653042021aa0b7c5b6517015a344f9456f7d7a9dd16fc530115cd9a8e0c69576e6cf171afc13ece7011f48ae30ca1ee30332899da832f31bcdef5350ff57013117284295d6c37ca8586ee645ec91fa9993f4182185634d586c573c10ed844d68ef08fcdef3092bd25268a3dba84867b3b741ac2c3069758b00a0dd255a9d7365f7106baa92aad6ead884e741ac7f60371a3be07be64b3a9c1a71bd00835fd74fd235a7ac595f06557f7312220e972bc5c57f214fec1d19dcfa6d5bb1458be78f', + '721765d7af8d84b76f0a0bcfc3e71afc00482f207a716f8fa56c8d464a2eacbe2d5f6b714e2794728bcaf4c3a4d167294e5e285e41feccc422eb8acb47002f2168f79897ab73b27775acec2456e16eecff5b2faee07d234772ea7b2550dd984714f8b081f3ecdae76f2e8a781c302294dba27d7460f47240d3825f212e72616b2b0fffcf773b7ce6a4b837fa49ad185231ad8aea42c1c9e684553c7662ee71a554960863edc2956fa40851c81c232c462c89114a76a2914a03fb4a7de90e1e5458d34436a2ad5ae9efb831da45637f7f1c3dc545fe240ddd306ebd519477ac0e3fb32406fc1578e6fd67638409f042eac6909030c0a8d3a2a4ba6269612240e825b63a7936190bc7c28d597c0bc3ce17eb8279cd476b40b503663eb2bf888cb7cb18473fc88de4904602430e99b5aecfd9c77449ecce585d54b0e6d47704db5c187abde4d0efcb2d297d9aaaebe3efb66cef5185f35c77743fd7bb2015d0c6d42700012408a5e39fe2c5de38f5ef1fe20acd1e4e1d64b34b164be5451394375a4ec4485e698bb3627460338836c643e8efe6bc0d38980c99067fb99af72686adfb01710fe85a3b19c155e690df5c0acce6b4fb2228dff33cfb28ac1bb67717772268bcded83a154c346613f56b00f79fcd316c725a9aadf6c5661e3bf79e081cbfabdbc6446fbefe98e4720512a899a7be005d61db9bb19de60d401e481b23a1318a2dc5f8b7c34b5024eb32dd896d9d0e0ff302135404206e1e5d45d3445223cf741c8a97219fdc763d567d41d0136785c504487e75867d79ee4fed259a538f68d6d3095d256927adc2fa63e0d0c0f9d0a06274e56a4e839e38a28411a37c6b802f294ba590f908181e4d55d01fb1f237adcc6e15df966a41fcebdeaaf4f8d8da3369f8a46de274822dd9bb2095e4a68127891af32f859ea816d23318e5fc78fea64ebb9a58a430959e1750628d635e716844bc347c395b4e5ae682fda5a6b16a64dfae6505a0b932c80f8b71180f4941cd05f2f2d4a638bfcb5fb58ecc541a6b1d25565b9080ddde9eacaa09513ad1ea6bd0b30358c808267872fe833a593b2df02c2c9fb40cedb02925b4c7a5520195191d0f6fa9bb1332b4a2911829c42bae2c1c4d6e96a1aea5e1edb9d10f9aea531bcd0af8ecb3a4ff1c274633e8821a8214c618a2afabdb61bc86efb2da8f336b6e2d91f30903fdbce6625ed085453184cf77eeff18974ac4a59108e90dd0d054bd4fe693b3ac3d9d9013b9b59d04a0650c8d407f11e04f37ea7c88d0774d85918cb4f51882f0a856fb37739d1b77223cb1abe1ee885f6639484e8138cf7f514763517678e32c2682a1e55689cf62b13a04668570c84b873da40623055d24dd5bc966cf9ea72da0f842d5bf1af9d9e89dd99efc9e13f59b09630e9a7b7d1929f772909ac65376d7c5b05c5ba9381786', + true), + Vector( + '65537', + '28129352641375505356643068228346369122206917631697076074298991273249921505841487091111395134070533228704363412069841318981887522521613403060792331221119699315498137437494324929541463415308054771131442224145674318467905336902113620606216275734330708713091074269233326157611969167125583165714182090755000968260263262808380264919647596164122323609066994227500545139162817632525993939029178799478814656536161486030018209772692582538821476284795147327230179223321312624221875707979790780532244002925093395034132071532163845740812517078441495177989450682828244940088606499127171436418486648629540337581412637828729379670081', + '8150975347300632230271910328370412481732005878888922642003372045938212526613710737503256928049292175102769632069095649299258968162209123561133051040704848403969778583193249272540048537290501764364735242040960497808333556623580400569485179125269806732318477286263873543130294344695338314364331217396018217003221961418850427372329749618577006564097725812273814140419322297150605329783619583710578755949281619424610467926798189197173091819249382872478178196923092566803612074409770564278503744096429932617307495064326949516699102063461358588482765167601676896403199319865135667032339046014866550373640280291160478443011', + '28129352641375505356643068228346369122206917631697076074298991273249921505841487091111395134070533228704363412069841318981887522521613403060792331221119699315498137437494324929541463415308054771131442224145674318467905336902113620606216275734330708713091074269233326157611969167125583165714182090755000968260263262808380264919647596164122323609066994227500545139162817632525993939029178799478814656536161486030018209772692582538821476284795147327230179223321312624221875707979790780532244002925093395034132071532163845740812517078441495177989450682828244940088606499127171436418486648629540337581412637828729379670081', + '171645616681325885303748314087282148555768773376435124068142909342311681227647514859071069302286718395907305442273370696624376561592751710375261245064410308453876613043310549717568962964667800781916581384935637356410687193120724153999378511319378206822617062393591960233790639613811871649808580747802635630603', + '163880401872422686676603662010435515892987042339851711171074744859824460585603496639427116964631225219182585617453627712493673349060229517299752790834311149100016444632742389729906346305823109118044125305291698525477154287886945805412626565068220159475069038323774773291228008769483811402378231039391014294627', + 'dd314783a81450b22ea382a12f8eb58bc2749e1953980c1eb668c3660ef4803ef16318f4839eba14f90a52163d223493e9ab4df5092044791213086296f20de0', + 'b3067e0a86fcdee4a959d0ac478d92c48da6fb6adcf028a716a8b0779ced7ebc26ab606cfac0e2010e21d2561f80123a26c713fc0af02fd5bef897590522f123c50344c4c729bef033907684249cda420a5054c203d3982355bb2abeb239aae85e684f1dfa05bac89957cb8d264af5f35d01907f66c295f8e8cc043d60915449826a6bec9738159ae781b251dc3efe2bb3dc9c69709cf3fcc0e6021ef2499bb6678a4ce0b2b593ee8d271dfb95ce1c3abcba0622ffc1e773a00f5306d50f9ddbb97d6309f56d81d207b74cd7bb01f10a0a3829c961799edc793cdfbf10680ecc59fd6ce14c9bd7438cda912506fe6447e17192d0fc740fd1f515d96d00ae168c', + '679bf46b85267e19df2a6eb588cb9cec57940d12b3a3df4829ede4d6ae178fb804a67c52db1ed27a78fc5e432260938419e69f3af642932f81ca5f083cdb8eb0c77b6b09074df266913173212ce89ecfe3d6bbdb0ffd81bc3eab7c939ab5e676943ac3beb3de8c4884aef400e9098bc613773f332decedbc022d90ad301bf207319f5e1b8f6103d13791f22e45d173a8553d9bf154bc1ce72e3abb4c997ae66fc9482c51ba6a4031b650e22b37fad0e91dd7bc1ad3396cc8975cd41b6a46056870c83b729f6671070a7bbb7ca795aab0edf4c9b7c6aaa3247360635ba1f26fd784d6a8b643e258cb65215cf69a9dcc3fc7a157e8536d948304f532db5da1e00e54d4b76980495ea0c82d4ab05e098a54a76764a7e79248390e1221a0c3761a3a7b2502541ad4153ddab94a75d62be88c7ca155a578f74e5dab96f2d91fe65b2c5246d0bc20f2c6c33aa5c40fbbb39f03bbb85e2c4f863d430467504ec82400217122bdd0bfb6a0ebaca5fa86322d4dc4d1ca5849f68fcfea34eb94c17b0e92f1c02786c11f4632842496ebafa5136f036d5c8eb6865651efd57a0c57835cde94a8f38bd8b87c74c8b23cff900920dc5c6ff59bbe9f6f563427f3d38af3364cd928521585396a4108f3d0e269ada2ce5cc429594b94ba2f63903c07bf66336c06c666cc82eac9ef959cac5c33133a77f3dd0458aa679bc43f3bbfd55d8421bc37392e9fce65af95dd708ee3459e9a6a3df01d61599d78c96d1e2257367331063c66e9d4ad6ebe7b5ad8b483474ecf2dbe714a815fe3eebe3e6ce8bb857a2050dc7b4fdcbb61770c435546fa4c98dcc33e0b2f9a5e69c007d54845663221dac19cb69d3f1c3c0d215118e728a1cbc6a23d96aed6005aec299584c74fb1854d2036dafcf398555d5bb51e6f36120d4911e81f6da3b7bc84fb93bc18f8a2081c66a434bd9f68b4fd91b5aa0c5fd79794c0d3a41d5081492a22446dad2d2ae9dd4868a4f84002e4be30f79e6bf9fc65a49b0dadf78a744a69115d535a010619cfec25bc6ad3b619f4f4060abb21d8800c5f87bf23fdde9d9c4d2b5c66c28d061d17ff6b2e911221454b9d4055fafe81b912d72045c6c7b51933ba8afab7ca94aaff1a5650763f63f5b10c9a06b077b43f09d5864baf96a0ce6887aa9f0343bb3b2a5460887faddadaf3057d3ea76dd6d9883097d6c77ef4382a4186b0cdaf2f02d9d5a055cec3757e094ea5982080aeda69c90eba26804a07964d17d3fee699a706811a2a8a32dacb8e77918554031b5976a0a0154e2d9fa8b16523ba7a3cf0197c2d861e532b2a9daaade7a7e363ba755d72162b7a2a2314721428964ebb9366246bc4eae7f94b45876a80e354d93ee2c16650b691fc5b7d2b42a113a85781ccf8e4c7f5681e6daa2597dafce12f8f1e07d02f703f02add87c791614556574a36814', + true), + Vector( + '65537', + '22153633830724302419135060306139611845587049196237992027439716728092941178232388452789357258811867968464947963726567991153260493994105321900660034926373398334373484478989203978510010719939481845444433163631308560641169805529369541163926996464195389014257999150361968445200323802465060080420230444766321058144923888053545658583813043413292534440889236461046409180217617316533807323188580624769631086433791797307635085373516378383440539868144746072790796451064353518909092022708037537867380767711914415255801335970995736063101534804398810277527110322364738289940676319709948398491924216241801677057085849033425266531737', + '2728978365193190624646836653096775163356652677760331406480679053213990963112705052534065944734204519476228436297969837093232313434795024594797840066908437087876908263796629649953593089299348907846004386592932357654855180833182652196606926367243044386159445952527060538385306988384816792983239588467645844218286384286582969604447996746451848547821594474254308223321900329955642842531285697337256305951380433128854676213840066603478772892051034297418220474000805527549410180077344896549253517272403338708124881856282697738009220065476445426852532910798779657493214841346351242529514255953308907664519427151581739013873', + '22153633830724302419135060306139611845587049196237992027439716728092941178232388452789357258811867968464947963726567991153260493994105321900660034926373398334373484478989203978510010719939481845444433163631308560641169805529369541163926996464195389014257999150361968445200323802465060080420230444766321058144923888053545658583813043413292534440889236461046409180217617316533807323188580624769631086433791797307635085373516378383440539868144746072790796451064353518909092022708037537867380767711914415255801335970995736063101534804398810277527110322364738289940676319709948398491924216241801677057085849033425266531737', + '152406091741333016211432270545267093450294091567620771671272133830593839419349963908600605874648928704766886351283891672489917019252771953369807037122410736836134335651122325363541262632859699413128899770287274371047239707548161977913686636535454630956013180484057499348941443242116936197134491886550401594857', + '145359241074982349614974893189035773100153231542165597448117182479884231345556959984137514931133956816447337828278912971885720592783139591292425170902129592136508669888352544993002281391635332528976639069461371915058366577085402011511300979316053353107716968156345787224515538513410109709113274343349287201841', + '3309899a146dc2a6669562c49afa1b64f1ac89265a615fb1635486120cda9150fa01b901b60508aaaaccdb6f7b7d287482646463c33c3d683cbc6efd06a7ae3c', + '0db7eec4f1c26ccbbf0658b17d2a127bacc30214c00b2a4790a809927c408579a0b9dadb0118af51c04f8844f0f7521ce304e5cc3f6e40a2cf0c5fff4d2cf0aa8074872ee650f311b576982c620dfee0dafd68d4b63f135c632ad673e5d9c27cc7ec9e211db6532cbdb93a96e5a23d82867e67a5f80e716b34b8bfac47abc966ec37b72e7aab56c39ece8f9b12e30237c7bf20d1c51f9e92262d697be81ea8606eca0b0b224b23721428362c9115d150c448a6472885542823bdd789b88d54a01f02e22b05f7a5f580683de7fbe0ace600c916248a7074717cdf02189537addb87cec953f8f49adfcea31940a3e45becd3424c12e2ae0c4f86044f0d0df4f9f3', + '03734451015420b9f771d99b8ef6dc65169452591e4b87272c562cb0e82c0a134f64c1750cc71a9836c8522eece98c9cbbcef07cac96ef4cc50f5dcb57b54d3c59a66f2b850fb05742821a3e26cffc8717ef925b443c8529837f2aeb8e58880e7b6c213792162b65302eca2d513a98164b94aee367868b8ccf9be41167b0e48562f2c50bb4e58c465480be56e415b065d18f2868d3ab12e30d180915f14f6226fb181b8949309a83f002abfdf3ed313025367887dff59605543b4be27847f0b50ca901e67331658250bdae800e4e841eb3120cd3fa30e16775fa25a6094d7c7d8304648c42f101eb8159c8fae5d14b9226a4b045577580f815722b51717b4f4553ba42fe499855c3df0084adb044a26d9679a459a67e109fd5a5b2e49009b8012d7a75af260aa9b331afcac3ca31f88815bcc36371720fd2d82c1f1dffa7823c125c9d186b8de3132da8ddd70cb4a15310db8458e4732b6a20622a6bce46738080f45a38619907ac3ced05c1936c6de450906adf435b8f74ad246c6a4ff6c8a2fa7802aadf88c19d816a3d0972a216acba2e5a86f37c9e1b270574ff43876599d72177e0745311c5de486cc3a1350c1360214c5f3d7ede4b73e5444f9abc9cb4dc1cfb5d31faea04cfa717be4c8315f0c54905c1c85b1d8fe1194715c67b9268c03980fa087bb7a20965e43c4c05808170ad39c2cdd3e03449417f2ff79332fc732b9e639b4a493947c3ad04dedc9d2aaec69e2f95e79d38f5dce10d9fa5f0c1ea7f1d78455eccb393714ff4697f1eb00c1d801dda020c6f25c2504376f6e5fa498db24fcc771911cfe9b9f8f92ce64ad8de485652d6ccfbd75aa71f9c6d21abf61903f3c6b107a809bd2139986d1ee9a2387b247fb68176505c74b128e975a60d12ac491565167d348d4529e29cd59b74a20211da69c7d782fad16f239640fea04eda9291ccf69249444cdc7f5a98852b3da9637e1659e98cfdd15028bde8fe9735dc53b6d16a3432dcc9a0a575d04364fba302436de4851ccc42df865a960f13caeb97cd21f527fe34b07aad028ba8127dbfca898f2c8cfca2645b7467c32aa344cc31995ed263d6b30ba672e1c2708b71eba9ee6e4ed279d15c98a0f23854af36180f1f634cd0c3964dfecd953ef23e27fc885227a40c8f34d22ea24921f7a6af56114642409889f0b3fff40eb89ba51d3e321db166ab7b7c90ffd4f44612d70643d2e741c35cc2d050cfc2cc77c4f25ff207cb7a32e98e0b87ef908fb2bd2bde8c1e9ae5faaacd0e2fc8fbf79ed3adef6acf6522c0cb1dc5177f3373dcaacab593d041f4bdc7107489f3b720c4309bed64ae47e5170372a1da272f8297840ed1b76a64c945789381250ab9f136381bd36c67e60fa9c0a1c2f6afa2685e073d9511b19cdaa7c586074a13b664309dc664e46985dc26632ef17564b71a751e', + true), + Vector( + '65537', + '24403652649370286954984240122355375245189755729088482283397439989278196714295886611538338760984491677115300254313346094874828806114535832521859289662277764964070777902833688155056671348777246555882757172619125701428050997098337387202066871320020622040458916470076875100543290181367350416120292471622438347165415471757648264353314441413666981900764459548059587126019453525002474958500114119204641841758705564228938689237024878215881250397803463369870434506624445065594388823091883952386092397245666260405517703636171714114072186275165517507559211010401040333495420756143981786353678848070447887008266619091991873631141', + '532162074431892018898075761312678713557397928572085074653811673782397903757345468234584042961312703920493033911379862483630375374368277175049819913683277626598200933692741104377651316209965525570181953389212491781275620042270052950611272979245063972353133127342785773152864739382549385544190753502625285226098418451538484339407465070732594405901267324964376553606462203399518534757046892336384271462291108545994325413187333020743631212659612020373956885483381073843357045784791746477157081775885125772849055855491648701469627051419688167387721661363286260811295702337862195942646817248688878022429537860909129416977', + '24403652649370286954984240122355375245189755729088482283397439989278196714295886611538338760984491677115300254313346094874828806114535832521859289662277764964070777902833688155056671348777246555882757172619125701428050997098337387202066871320020622040458916470076875100543290181367350416120292471622438347165415471757648264353314441413666981900764459548059587126019453525002474958500114119204641841758705564228938689237024878215881250397803463369870434506624445065594388823091883952386092397245666260405517703636171714114072186275165517507559211010401040333495420756143981786353678848070447887008266619091991873631141', + '166576510922917628427477482510426202519382465586246493638665528402986008341102747520024135667473333393885416609069418603312761782895012646726139548833871648530692800492231049253940792216644635223794350240772036779945494250235076603784246748586224469212735046630433479651089394742816026597511737428403439469779', + '146501163424313431981199398548171346299905477781974843101800194784242699998268140842223464610903695703924650853824341133627313935928947438984350252925477649840121955507961897323064671959920824059526230723519102900149819125865594444096455500783244320547259369168154149520191289174167147026933174393215453133479', + '34b32202116efa8b7be15f53e83f4487ffc001cf2b375c3fce60c436ddfe7759dd1c35514022e394e16906646d22b4e9908f1e1bb557e68af6496dbb85b89705', + '3adcf002962505a951005d20f5a628f6d551b39025cde85edcb906be2992c9599eb342ff6b2f30c86a6d324fe2d2c5a92cab19ad9cfea7c409d3bf9b97161d23aefd55624dd1c5468e671962ce3287177fb5bc48b6f439e377d8a8da7b3ed65f12ca0e4cd4d493821d2cae73d52adb10ea24dfe6e766cd842ddb7a4964c1dd0c75dcd931cf5402fbbf4d8331364ab63d7038980da64561e629e542d9cd2ca99e4065f26fad61d2df7c1b3078b8fb3ae33b4cf07678be089f00ac0489232163bff93c2b11877e459c52d2972f3f869a3c8ef26ef5c9773bf3aa69faaeb5a132555e3f5168e12aa91de578bded5df48db8e634aef76ffc1cb83ee669250e9b9047', + 'd9b3e116e8715d4842c6acc90d592c4b2649c09145767aacf64450a8587609abd4df1ecb3d98b70a56b1d665bccb7ad43c120b4195b54adab605fd5c433d82a3826505492814a86a9c2abb4aa1e2581174ba5db2013694215a0681bcc8945f00f20a2c53ff1925a49af39d2c0c4eb8ae53a8cf79330e6b4bfdf9650f5ff4ad25ab94b67e0052e7d9068acb91a644add2fab9e49c3d5e1c58a644401ad36db62809c7b04dff2112e006844ae599d60ff3a5462d4191d53cdaf4c4a5b361ca70f80d8fd260ad3c1806bbfcfb361ae8d0d1fb911c18bd5d185e0714153c50e2540de818638838ca032976ce8f9962cc853fcbb33b97ff11bf49fbe74e9dc5424cd537fa0880d3ea3670fb32bae08e6ced0e98e2d4bce77212d11c5f1eba9e558237795013353cc58de505cba70c9c0ad3f97b6621d98875e5de4675556658a9876c2644a8d027323bc1b7a4cd74f8bc02f8d15564c786f5dffde220db32ca6511e59c86cd9d8675c78882376c031e5f53bf2f58957aa336a77c5c6cfce5a3495f73450e870a56826d0b9ee4e4d5c00164a2843f321df6aecbd5c6aba9535c01e7d477adb08d95e61972733afef4f5ed25c12340cd9d513dc0c42fc6a9931afc66cf67e839c2cb4f0a7fc709b7a32e7971cdd58f9fda041fef4683cc459dde9fe80419758479e1c97b66279065c0258b6b2283986c87cfe9074d176fcc618375d9cfa49f5449bf519f3b0ad49f797f8a67c308a24beb0caee1fd32d5bb9c02bac04f0569ef1dbb4e9adecc94d8cbe8b0b53f10cb815aa4aa877ee59cb980132088cafc342b6297d5cff2074dd521efb571ca1bf776bdb225e5505ad824584c69f352ce4ffd515561975c6eb6fa35fc4d2f78cd7799be5ef34341d8a40bc0b98b90cd7fd2108a3b4361304dbc4f662a285da9d6a474bb2c752b83b08b9e30af773c9c0a65ea0f91a598d70e7dcbc772b769d6744b5387402731fb7bc382025d76c45a2b51128c0b7bbf04db16e561c6572cb8d7d5208c6b4d08942b87960e19852b78c23548c5efdbd58364fe0757880aa726908f478388a8f83d5363e487c231a8457b228ae5b5e0f4e013ba3b3edf01419d7768a12c496fd9b54fa702d67c1a1dc07c2dac34687db2f1e00d87dd7e386ac69e812723421389c40da51ef775ad5f58a48be9d43eba95a1a6efbb56f589a308168beb9cf59dca17d1a7c40e538f024cafafcf13588d21df63ae54f82413702a4905983def3cb6c439eb4059a4627c45f4bf3edd7f175c08a64c602817eacd9aad6f1aa981afff1aa3b83cb8a8288301434bec1d0442bc5cd696a43acebd17e368659b4abe7f7676e66cb80ef49517301130ef269f2f26d3861ef799f0452ab768cabcc6d107e710841bec8571ca07a6133fff1daa39ee0176160e278c4dbbe2910d4790323ab35b0df7a2d8b40a5518', + true), + Vector( + '65537', + '25437088660618094737433615487460079456183535130995456484169502781350359544104665849424754258537968823702804617013708901891252522315408666745405637387514877349462004783611594150432154124783261025572863162532786224626191448531528813801177089548452282937325722171912012346828341593605210072429786422101625643084279257594758279515360495040782099857497189181390645401928008172126235595011054890199261109331431236946448560096249284348990983366611913272036536215064646634070462670886151507777135986556691374641484226554144815492482577786880422565269286219283308551049861189219835294012380190713104206601565970428643048328961', + '1145924600784425025600790490336407503950993623765979305184278194175180455590195087566437958296954379283460645914083253153847962935197103127990838821168178645445345727194330997295205637090652606190416424326133299503888912105291448645293425685991890384731685340194897924115781859422311399939602078712984108955873472189294212548747632173620896311801622475344754765185733843294738856258059523553640264849516788155207430448545257263514657447699896103424961881348880086895777093047718832530931972764427968862782820147860298642940085199486269085721045658762515982401042295216171915569517384911293266156427124283054721553033', + '25437088660618094737433615487460079456183535130995456484169502781350359544104665849424754258537968823702804617013708901891252522315408666745405637387514877349462004783611594150432154124783261025572863162532786224626191448531528813801177089548452282937325722171912012346828341593605210072429786422101625643084279257594758279515360495040782099857497189181390645401928008172126235595011054890199261109331431236946448560096249284348990983366611913272036536215064646634070462670886151507777135986556691374641484226554144815492482577786880422565269286219283308551049861189219835294012380190713104206601565970428643048328961', + '176006989661994358766060024825787048341495969605625195995532581818774782759591236023620171097316716284455389659328944557809323089139183403828730484907670351481332753119435209042417818705719373095812820447314434953408209467006921031763453985650495227981324794053926944883704253242152445097016821693188688304271', + '144523173252765373613277394159577412006617149371663937819266374751540062155119325786898885178030742946294291793677376344846439728120307794585760337269307181217857953578818612926667531398487312695855092588905847223004606865215725801592754961474904523916284362385032170196464565390127081890078059405229022529391', + 'b523ed0bb03f38a80c5ae883b6a4cee30e653c4b616b312f8c0d37efd2adbd6cf7b4f7869926fc8011c9dc75154022988e119945ea1efcd2643731efe030dc24', + '3827cd34cf9b56951e52515760c93ff4398047ea4dbc9bdb07f07f414279498068c54ece69728add1c2367165505478894d93945524e31801ddfb1d18126ac64b0a21d758af2ae374552e1240aac67fa7241a346c8c6a4ec09404919b8376271a0cab808c29bb4f6bea63f9289fbe793494360797660c2718cb4ff26c641c0c140ad38b8869951c7d79b2d77bb809792d197b94a0a4317f18092a6e29a53ba090112c8db00dc3d03eef51c6091f48a33272b87e6755badebcc162ab0f10aa380ab07bb939bf8fa9335aadd1bf414f157444497f9538e05bfb97f0ae9eea81dc5f406b82c371782fed5aba377039c33c58e0d4c11af2ca25159941bc7371e976d', + '56dafe804bb9e62e494730f76e925adda434ccef0d75da2fe854ae27965bea76f57b7bb44c6c1f26a6036917e60cb36796866064854d965ee31071e2de96c97dadbf2404892c6ac0b9dc616c45beeff53784d31c65bd5d7b1e09f530ecb1664cf66579525984d6c77ab8f78cabda2315daed322fb79c8c01ca2bdc399565ab3cf69d4b7942739a5bc23ed235f3fd275e4053685ced87f5187a0cd3c2bc713b06cebe2e58cbc3290c0f395a98181101f126bb8998aa5e23941ea714c82cb5e1f2a24c70ca728ba28d2fa26a00b0028e7017518b10ebe5456b20ca74f26570e126484ad959f6547df304ea51f20c223a988b60107e88e207094bc3f822273d180af71c599255e612e594f64570f74ed0c8080fa10321f9b500b94e950f36700ca3684d0d8dbcd62fd6bb5fe16c4b5ade542ef3c6943951c11aee87689bf379b549cb2df0e24f03cf440612ea596e1ba7546d34130d663c94446028decb7a23072707d5d7026e7ef876eede887ed8a3a04a0ecf065f74dee989d8a70f9117a92b9ed15553a1f08f3e6700315a078c962431625727e0f4145e19b497edce67b9203266fe842e1577f6c737bbdbdc4e21f79439c2b5b79dd7ee25678f40d47d8296000c7de33e5cd8bf6f82032e6665f691d96b1bcecb7705a85bab8dc09fde9b05c4b3b4acb03868bb7be611ccbd4e702b911f7a17e61684f51e5a0bcee232c33ddd7ba03982d517c5b8964b71e8460ada57ebd2591bbf553d49a880339a882f00f2b81d480dc3cc0f5b507c26104a03a62453863a2780d03b91c2332eb68bfa3a3de52730f672dcbb84b9d7033a74792f3713715005256f15a927fe8dfcd6f1a2164418cdf2f217d9e3a9991e01658ef2139eaebca743516ff7fd5518693cac7214c3079af8da958944709de86fcb1320ca77478f7bc3d957ae42f143a464fd17ddc1aa335f4e4bb17d6a1afdc3020265da8981b0d5755e8502152fc9c5e14cc0795eea997673b469df901a030693cf1a5d82d80ac910e9dbec0759f846512671175f84c6f689dc47a4ead2510cae820c570bad14d0520b6ca0c9d5497ea9b952f0ae6a477d23a3ba89fe5c4c2c7428ef3042be6ea4b43f41aa11380c542e8315a371d25675eef12022a934ccea86d16b8f7d6a4e803a6a4bd979b21ee8ef2d29562f740a035a76df483b33c7efd46c5e3d0277d9575707eda5d39bd986618c0a31e544eae7e4269f1b1c2b6a0a991eacd176785a7637634dd021348b3d10d2e0035166d4bb8b51d72e4438eddc59102708ca121e930934149072034475f6b8214d97c34fa0ff188ac50f206b7dabc763ed64d8ee4e6187a0437bcc0f6f4b3956f8d691063874208cf663254a4ac310c0a0165005fc98e106ddaa255ada092c88e0ed3c29f253753cf315789466055ad18deb7921387ab2dd4c47b27f51569a299e', + true), + Vector( + '65537', + '23658251522583925900718741979050794674251803924998997021682209681264940044908292496194981304861842930677076371499230472828807490161501087128196670370793623326467147049337260761819787418143886724324893161193789108053343665478230198531979010923873522545815808119111181976101120608281602943417963008114389614618578904417735537637729593085440099555585319591748940070535005184336494181205787620269807526416530811679279201002952927740931726856120510347220483278642060623286767202239646348666232888334302158044968241201147110380771969014926435886287788992344002905242385801758426435716767719929022228938915368182458157960843', + '3009760472245349683342882818107878001687205932903232336974158463425949274828309026763899120028161426896564143115718358594537169068183092206407674126317833200854781856414688063256976633028284107665269950279280661128747925765975621103504508957959557108591166824741588411519341640165827922253799633491824822800552814589677969741253495771924708369978113475087556860377401252816984294834713005677637192372237846370495254641824801741056216278594303334589468026883698059566723344237904403713305882854473697804438397752310544011957812835892209662075303097763895915619975699566227238069452916258942930328876639365178207104473', + '23658251522583925900718741979050794674251803924998997021682209681264940044908292496194981304861842930677076371499230472828807490161501087128196670370793623326467147049337260761819787418143886724324893161193789108053343665478230198531979010923873522545815808119111181976101120608281602943417963008114389614618578904417735537637729593085440099555585319591748940070535005184336494181205787620269807526416530811679279201002952927740931726856120510347220483278642060623286767202239646348666232888334302158044968241201147110380771969014926435886287788992344002905242385801758426435716767719929022228938915368182458157960843', + '165590013140540647679878899493586781766816521021707211030299226928354057254308720369878209847888859898233724631502229118806735761559743227567693583847231815630984309079724281063902229464971010008597095518823091793269320318276491211501580861194554544041104616248113938228731470012174045166017739040609317694323', + '142872453923320476402895306830517278375549809340340630592712445460110171257915331312785847123442343075420588400083738297854976551803962605231204558017986861050163965265524357718201406139658856221141247812078006843972911985901189697463372854609424778354342963924485270938382783906372282727789585474600365423241', + '65c44a86df668a5f20dab63d01d07a20fa27f4c4ab838fb64457dec754f64e1c0b9b847a46d17af6cae81cef822ec73be025273d7992a83e1a79341bbd9d8395', + '433d05bfb12d8c913da5207ff3af0fc29c248fae24febe0a928b6d12fedb074f44fb191b6907ed05bfc24b0ab7e3e4250eaa2105db04f762b9dab82bc16ca3c9a3e9793c6dfe3a31be8ab28f2043b4dab2e070f18fb7ec2d6a2dced66b7e273944388995ac09353b855e8d37344ac5965f4c8ba90b17b5cb270473525aa989ffa2f7173bbaccbbfda131e8f6fd0acae342797e7d570269689fd85732383a4eaaa534e951c836dd7cb6bf2a2427a9b5b403778b1db16c3e5e13d458a15379608d68d91c053ecf6d861fc7e083a907db614a934cb71f97d9f866e194e35d273555b24875d0bffb177d248bded9f1b0a190ac963be22c0bf80805808340bc5bf253', + '54b5e2340613f23fff9ec8120c331416cc221da97472df2b4caeb0d3ee111c1d2b4c95075d669ed043cb3379cedab73a4d793329adefec66353929b6057716954873be42184479b9944ea52b2f28eafc8b7242042fa951265bb04250e65dca7c4fffa73aa5319734d4b4cb0dc69461de8f16da93e9e46c9d351bba142982d6405607d85abb9cf4516fbe4c7f556aa97a7110b250644639952496b18664707257a7e4c90706849cd2796c48969edf91e2c202a49fcfae610bd16ba7f5f166c61fbcce54e1365e14e1aef3d560dd62c66543368526f3776411bc517cfe1e14dd2f777ac6a88d909cc3f76978409e3e703ef529c1b988a8b1b9528dabd0979d0ea7cf0e7aa65450cd682dd8a6dfd1cc017ef66ee65840f4f3bed3e7d19531fc36e20875828e80b02046e724c2dc1f2945e31b3ccaa81d4062f0930607145fdd97cef74b807b088ffe9caf9021ddb50925d4a3c08588d9305a5570568f92fab762a80e3a9083c1b93a977199db26195fdc1be12afd507ca7ad7c008d5551a91ffa2081ec182cc1cf816792e9920c75b8e46837dba4e0719d4bca7c81aa85283593c8290155f22df7348d403ea3b3b22bda47c0fa0a338a52ed3eea172f0d723ef904107a228593dfa355bde6d6f33c0fcde92b741c3c5a6b7bd5bf0940131fb63739b9b659d889733cf56ed60005dccc0e431b827d3d7cb028d44a231047d8a8f100d9d724dda26622ed81ad900a90310000d4c273bc8e584092db92b6b78d1fbe9a69fabc47c5d530edf68eb303be4165b1826af3330657d72d8af4787782a48d09733817fb6f6c31f6703a42d0b1e463368424fed9b48f1da40beea3917d21cdc193945fc947f33bd82650d07b35e1bf49469991479a9d85c643352e2811f3dddeabc066d9c9cb1809d03330afc9fb1b4ddab186e3576644ffeb3a6a8853303685a7d84a752c673fb0184c39682cee2e4d45295a62e70350c44657591f13e15cb6dc073f6359f798c05426d15db2bb38341966ec887b91bcd39c623d1411c35815439014040d80b8672d1bda60d401cff9ab7fd7ba23b15b31cde2c3b28a8001e8ec7e574b0b040ad3b19cca85b0331be7567b54eca040e765ef0535819932bfc47a1b4588db44b00fe60403d1dcb919c2d33a1bf7d8e160d6010c142fe5bc4f8f0bb158eb65984697d1a978d7691d748b65331c547f689bbb5eeef9a6c3e00c5cc68047421d9b8d834956bab23e70c244cdd030c5ac923a502081bb0fc953877a8912a10e39394d62497e5acb80cd91c930eb848712e7e99ef472ecb62601e81f152de086eb00d119675a86831f0385397ba00849b028fce1dc0116edaef527af73e456625b4cd0e0690d4a910802e1901b47cdec199d96e15029979add7a503567dd7a967022b118158feb35734ec8146b16ffad012ef1394911d28292e7d2c6', + true), + Vector( + '65537', + '22863777756836055143600959840749450920440384456704349962957955148144126897132094433370209548824375989844046076857133821371508636666850758882851578033383651783618422036072419632732686157582055405562109922709901326246966123012779940638801924989478425633471958572537119027807706692988780579411816688566224513817250774335575958505773698753128001893291209436871060294845040743647053132079832745308356830002298113861195640612128927309500368668049733940067477120484141937395209454551385139891613730504379058183817440947369052529753197836772372884439231897004397488834752501181030419040390355982635808334470641448749691416183', + '2255607597034095465629369758310047376689615113673527544524538184694536711375368975677176096524467140124459159099742110900369090595686765972764650163645604782138103783728675849297849800141092500795914089831406183146158040013109063677009534248126596593271174270270820194306891185490928190734807830689914469598600353406030453644843169521306845973935112914753357995065221191706901453116661352835469169409508970115248018229509809404657743355036733922945836679716996092794994744403038571209570423722421262617433701221885865122225656585415125141317614483711216050572551407767136716392847862790147219388705010554043573130093', + '22863777756836055143600959840749450920440384456704349962957955148144126897132094433370209548824375989844046076857133821371508636666850758882851578033383651783618422036072419632732686157582055405562109922709901326246966123012779940638801924989478425633471958572537119027807706692988780579411816688566224513817250774335575958505773698753128001893291209436871060294845040743647053132079832745308356830002298113861195640612128927309500368668049733940067477120484141937395209454551385139891613730504379058183817440947369052529753197836772372884439231897004397488834752501181030419040390355982635808334470641448749691416183', + '165753605475658965896905380941512780373501918722623039928392212300384638200828754218945657927975147434007515408820867595182498678712848089093708745610029028514780605885496621852402727633970979135328953451658504203008039089814570880017893747801344491417093420169338769217963611664808574246257897284558430343541', + '137938343429842417908376247774337756675267630407222666317251541029569965860036381348765753221799669784544962152131139297790992522931746092548078408342093276445880775981341485116526468109550869527376048089827949530781527838543749512497666287942212179789741424088818092906786749935663701944131037153077866559163', + '65e8ffb8dde91e1bd267f02e337dcb32caaad90360d2173008ee7766b5622a0a1c9cc3d8c58896baef60c0ad14454da97710797a52ac328af787cead7e90bc05', + '95b6e1df81ec646c7a75ac46ac2ecf2fedfe43f5d868896faf81aca40f662e04d12fc28e74d13afa7d1dcf28a54762fdcf22e9da8c3f94be6b747dc561900dc52d195c53160f4581e717b490b886d4a8da7bd4d7fa4044669ad6ce4ecc8905c8554c9e998cb5be39f011ad2f1360560a815d8c3d91a15bb2bced97334a60f36bea2e9dc0926f22b1daeddb4049abc9a45f45a6de7c6e3ab037a6c86dacba041d48d290902e137fd651641b61332b6603dd15ba6b0ba57a1f0d273778545622476dcff6c89163cc8188fbf4298b0b5a098292b38bb4288ada64082e2d16b76b2ffd8f6dc389348540ddc6d75f44a713f6c43a92403b994c97aea9314e9feee9ca', + '6583b7ab7db45485e3245754ebb36bc4ed4124644ae27b6139e4808c9033aa22a37d69f88a11c2d3b066cfecdb64a4579fb3f2b95e0c72db6331336d2276c135e28bec8d6ea4c137600a6944f9ce46f18802b790d50263d66d2601e713ce42959db2842a02c325d778f9fce37fa0a16da23224c6ae64bea279229ba8d10988cf27c81f6f3df102afd43202bcd7458cc0e15337a3d430d4bd501a24cb44afc89b4b43b02918e36fdce1dc7f6358f11e90db4d2d3c461ae30366e6a1b157ae17b32bff4c0ea92c04462d7f956d7e9e040f2f57ed5bf9a723eaa42b5b84f5e86e9b13326b834f01d19e6e373d6125b46daa3d3375d9863e2388e2bb3f75db864c8e278f29bcca51d7ccbc17be552d449ebbdb663eca1bb42ef45ca2d0b523c950531bf79e4fb378b7d772a43e5a538e59c830d812702f9a0aac85078c99ebbaae2124bc0b56e72bcf7a186be0e06f5e84f624d07418c1b4341bce6bbf2a3f2321477fc81d062d7769f7b5c4551539ca27c8224c55c4d352df91c1715e21270f44adddfbbe3cf1135bad4cc3c6b9c94674a6d4e56d684d8bf130c6bb0b3fc6ec10c037a424a6b946960aec49446c468243fa0180c2649dfc5b4105df4363cf9eee9d2b73a5a1fa87fad38722838eb98266d26002472100905182de92a12731c54439501f72e38e0a53e02c7e3ad2162c1390dffd3321481d51f523ade9a89885264c528479ac1888ec3780baf4887150e52c1cd6b622d2738b8dd6b2ffcb97c079650cea01dda064b64133ff9ee70c89239fac290885fe8655320cee527c0121e59142df87d7604289d5aa147e7adad69551f7850571b8f1d253f1cfad8499c2c482485d8cc620d4efc31c2085ce0ac1bd3c001b4f6aa282ec6de9aa98d7b681355e052412e40ac31b307f0509819e92b9b6ebbbe3899dcc0d9761e054b9972289b98837b4c41163556e368a38c1d5b6544ba7497595153d155006fef4ae7533051509cf2224634487a96d697dc26fd3f66574e28ca493cae4359b0a2f9d89c0ea23ff861a52a7ce95c04773dbeed5ed06bbb20cd8227d8b386eccd4ea5759e8f9189c625331de9fd7c29ceedeed5b4c67be81ed12819e18631216537a74674a624d946a861c62e247cccb3c423cea7ea1b6f62aab411ca6284c652378408cef75d619462619f4e22b25d8bdfb0351bd62e3dbcc7e25b77f346ceef928591f0bd143ce5ee63c49b8e38d9f3b0f64098f93745c210bd6f921545bd7b2dc79c565dd652a3bacd86ce3aa611ec3bcea8263627022c5dce13516594334d9f393b1247fc4d65551a7a5aca08dff460ea54399550456b7cc2b7534349e5c752ec9a48e74b3e7ad7f8c9fc42af855cba400eb82c5b8b52d4bc170ea7744b4c338867a85e9c2c58257feff8ff990f19f55de30aa5f13496e3148b44a0f795fa6fafd7bd5bf0d', + true), + ]; + + test('RSAESOAEP decryption vectors from BC', () { + for (var v in vectors) { + var rsaesOaep = OAEPEncoding(RSAEngine()); + rsaesOaep.init( + false, PrivateKeyParameter(v.getPrivateKey())); + final output = Uint8List(v.pt!.length); + final size = rsaesOaep.processBlock(v.ct!, 0, v.ct!.length, output, 0); + expect(output, equals(v.pt, size)); + } + }); + + test('RSAESOAEP encryption vectors from BC', () { + for (var v in vectors) { + var rng = _OAEPTestEntropySource(); + rng.seed(KeyParameter(v.seed!)); + + var rsaesOaep = OAEPEncoding(RSAEngine()); + rsaesOaep.init( + true, + ParametersWithRandom( + PublicKeyParameter(v.getPublicKey()), rng)); + final output = Uint8List(v.ct!.length); + final size = rsaesOaep.processBlock(v.pt!, 0, v.pt!.length, output, 0); + expect(output, equals(v.ct, size)); + } + }); +} + +// ---- + +/// +/// For testing only. +/// Reads through the seed and then resets to the beginning of +/// the seed when exhausted. +/// +class _OAEPTestEntropySource extends SecureRandomBase { + var _next = 0; + Uint8List? _values; + + static final FactoryConfig factoryConfig = StaticFactoryConfig( + SecureRandom, '_oaep_rand', () => _OAEPTestEntropySource()); + + @override + String get algorithmName => '_oaep_rand'; + + @override + BigInt nextBigInteger(int bitLength) { + throw UnimplementedError(); + } + + @override + int nextUint8() { + if (_values != null && _values!.isNotEmpty) { + if (_next >= _values!.length) { + _next = 0; + } + return _values![_next++]; + } else { + return 0; + } + } + + @override + void seed(covariant KeyParameter params) { + _values = params.key; + _next = 0; + } +} + +/// Broke RSA Engine that allows us to modify the output len; +class _RSABroken extends RSAEngine { + int wrongSizeDelta = 0; + + @override + int get outputBlockSize { + return super.outputBlockSize + wrongSizeDelta; + } +} diff --git a/pointycastle/test/asymmetric/pkcs1_test.dart b/pointycastle/test/asymmetric/pkcs1_test.dart new file mode 100644 index 0000000..33792c7 --- /dev/null +++ b/pointycastle/test/asymmetric/pkcs1_test.dart @@ -0,0 +1,30 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/asymmetric_block_cipher.dart'; +import '../test/src/null_asymmetric_block_cipher.dart'; +import '../test/src/null_secure_random.dart'; + +void main() { + ParametersWithRandom> pubpar() => + ParametersWithRandom( + PublicKeyParameter(NullPublicKey()), NullSecureRandom()); + ParametersWithRandom> privpar() => + ParametersWithRandom( + PrivateKeyParameter(NullPrivateKey()), NullSecureRandom()); + + registry.register(NullAsymmetricBlockCipher.factoryConfig); + registry.register(NullSecureRandom.factoryConfig); + + runAsymmetricBlockCipherTests( + AsymmetricBlockCipher('Null/PKCS1'), pubpar, privpar, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '020a010203040506070809004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e2e2e', + '01ffffffffffffffffffff004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e2e2e', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme', + '02080102030405060700456e20756e206c75676172206465204c61204d616e6368612c206465206375796f206e6f6d627265206e6f2071756965726f2061636f726461726d65', + '01ffffffffffffffff00456e20756e206c75676172206465204c61204d616e6368612c206465206375796f206e6f6d627265206e6f2071756965726f2061636f726461726d65', + ]); +} diff --git a/pointycastle/test/asymmetric/rsa_test.dart b/pointycastle/test/asymmetric/rsa_test.dart new file mode 100644 index 0000000..1c55eef --- /dev/null +++ b/pointycastle/test/asymmetric/rsa_test.dart @@ -0,0 +1,62 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/runners/asymmetric_block_cipher.dart'; + +void main() { + var modulus = BigInt.parse( + '20620915813302906913761247666337410938401372343750709187749515126790853245302593205328533062154315527282056175455193812046134139935830222032257750866653461677566720508752544506266533943725970345491747964654489405936145559121373664620352701801574863309087932865304205561439525871868738640172656811470047745445089832193075388387376667722031640892525639171016297098395245887609359882693921643396724693523583076582208970794545581164952427577506035951122669158313095779596666008591745562008787129160302313244329988240795948461701615228062848622019620094307696506764461083870202605984497833670577046553861732258592935325691'); + var publicExponent = BigInt.parse('65537'); + var privateExponent = BigInt.parse( + '11998058528661160053642124235359844880039079149364512302169225182946866898849176558365314596732660324493329967536772364327680348872134489319530228055102152992797567579226269544119435926913937183793755182388650533700918602627770886358900914370472445911502526145837923104029967812779021649252540542517598618021899291933220000807916271555680217608559770825469218984818060775562259820009637370696396889812317991880425127772801187664191059506258517954313903362361211485802288635947903604738301101038823790599295749578655834195416886345569976295245464597506584866355976650830539380175531900288933412328525689718517239330305'); + var p = BigInt.parse( + '144173682842817587002196172066264549138375068078359231382946906898412792452632726597279520229873489736777248181678202636100459215718497240474064366927544074501134727745837254834206456400508719134610847814227274992298238973375146473350157304285346424982280927848339601514720098577525635486320547905945936448443'); + var q = BigInt.parse( + '143028293421514654659358549214971921584534096938352096320458818956414890934365483375293202045679474764569937266017713262196941957149321696805368542065644090886347646782188634885321277533175667840285448510687854061424867903968633218073060468434469761149335255007464091258725753837522484082998329871306803923137'); + // dP = 68805717049526308324575273108573116001662526577152473869179706227957595091947965115631041308417430436199124027318143092441125820376694663934988040410650411495368889020042904305193636218299757516719158446153874604179501966374024692112438317379995729651506791282977824993147390378095874103264534184571632120755 + // dQ = 50784570363590735217102910420562378736776300956031757348933834583758403833600634727605365085416808486374756857656471727593921591511126781583852266259785128933660523683133642580243620064955640182544858428730432641246268155779942551300183363603309753909166293605500547836955434209670082619152099365325073276033 + // Qinv = 55230685559710427662641419127391743688498562899704993951405017803347590263833235040975158906547337992492501961820323076137293399600978620698955537627140829092176376250413837145798422716237647195575076578845234764700372691872271724982949541941613766324969755382993478116416238708238612702107474463263158193372 + + var pubk = RSAPublicKey(modulus, publicExponent); + var privk = RSAPrivateKey(modulus, privateExponent, p, q); + + test('RSA public exponent in private key', () { + // RSAPrivateKey constructor will calculate the correct public exponent. + // The `publicExponent` getter will retrieve that correct value. + expect(privk.publicExponent, equals(publicExponent)); + + // Wrong public exponent provided to the constructor raises an exception. + // ignore: deprecated_member_use_from_same_package + expect( + () => RSAPrivateKey( + modulus, + privateExponent, + p, + q, + // ignore: deprecated_member_use_from_same_package + BigInt.zero, + ), + throwsA(predicate((dynamic e) => + e is ArgumentError && + e.message == + 'public exponent inconsistent with RSA private exponent, p and q'))); + }); + + // Test using the RSA key pair to perform block cipher encryption/decryption. + + PublicKeyParameter pubpar() => + PublicKeyParameter(pubk); + PrivateKeyParameter privpar() => + PrivateKeyParameter(privk); + + runAsymmetricBlockCipherTests(AsymmetricBlockCipher('RSA'), pubpar, privpar, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '3440ad17295687b43a3c81d7955351991c5f2f71a6a0b89571d8363c1dc825e219ea9aa0b668208e2d1c506f23ebc80536aed8577a146213b3cc9989bd3a758d1d1ca8a05cea9261d7df1642e930bc3976cb0b4df9e9423cbbe790fd51a32204230370092fc481efa2d364248febd940d999a4914856be080702845155711e2a7a4a0fecf5c4086792c1b1c4504a094713b7d7488c260265f45bbc80b601daf1de94ac57fd28bb5e154154fb65b339cb88ec583aeb2621ef9f4c9f1f18111401e4c9d73f90194b6791ed06d254da971bc29954c83d0752b2af4777f0c960a06bbb8d68b1f7d0efde31e634b679be598fbbec9f605f7484f773350c3832675b61', + '0fe986b1829134af1ac8568f71f23f82a77263aabdc274ef3e2aa10e217f935f5fb4b139bcb01b13f7f687d0b1d84d26dd5e0106dd47e071e0b820902ea89946323c96342443054c5a5abccd2ad02cccf4740bf970e144598c57f9575394eb24fbbf985eecfb357053cd53534cd4f183675e55f891de2b531881aba5c814914874bb9cacdfccff650d0b57ca7c7ce6ff9b88d7848eff97da013c100bd926803e86d4cacf19065a2415edd0bcba629a8edc99f4944ba244cfe491349eb43f23ae4363417aa73a7525f90dd80b787fe63d9b92c057ce5addd2a63635acb3ea6099afc0668a16682f31c997029b3e9aa2ef453b3f614dfb3c0e9e78ab45362499eb', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '6cf9c2b31c3a26dd7a3af82f49583f071f3a3693266dcf19128af9e14d875bc5fb0d224d953e6a1d9c9e38cd1782a147be51496d7476e31ec679290b4e37bc99508029d65ffcbe0d034febbf4b3e31895a054f99728c9c83de1fbdbc06f141077721dff132fda3eb36086301931665b503fd2a41294160815f9aa7af5da451f6f98572c69cc3fd29e66bee29cdbc05f562295a53c6a4fc439c18106cbb2ceef95d868e2da16de9f843c65df26aff4c9bc6b7d59ed1a8d18a16d6c0abce4a5cfe792c921a99725bd5723fc4cfb37e732ed4f00525b79d192370e0584b2a8c5073a088dfde91c9e115f995611eeac6e7dfa63b38a8f964c96f0b57231b98ead441', + '7d7a3f179d37875f0f14b97cd9c0f266cc0087dbb674488981c1669ec57da4b4025967c6f8557789bf79009ce5f7c15483a887964fc19fd444657538d477368b3681b40de94cc70d3f2dd3d075c7b37b29afb8300b7ce1219c8a9acede902b70f23697d047b13cb37ba95b909a3e30c162591afd5857543555bb73164d5711ad135f997bb0df8c21cb8bf2cfff3f67b145483d3c3e2fee78e600e5c14cdf73cd2ecb63afaee65006644f7b6dab026624c11f142a8ec393c9e409a56da9ddfcbe6d35f8f01533d5a30db3a55c8510bb457c8e3a85e17133c2231be209eb8fa0c93fb87ba7ca2edd30bb4485bf1cb923522414d3d6b0e6d25c251e45e08505a966', + ]); +} diff --git a/pointycastle/test/block/aes_fast_test.dart b/pointycastle/test/block/aes_fast_test.dart new file mode 100644 index 0000000..a52ad80 --- /dev/null +++ b/pointycastle/test/block/aes_fast_test.dart @@ -0,0 +1,73 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/block_cipher.dart'; + +/* + These tests are no longer part of the test suit. + See aes_test.dart + */ + +void main() { + final key = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = KeyParameter(key); + + runBlockCipherTests(BlockCipher('AES'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '75020e0812adb36f32b1503e0de7a59691e0db8fd1c9efb920695a626cb633d6db0112c007d19d5ea66fe7ab36c766232b3bcb98fd35f06d27d5a2d475d92728', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '29523a5e73c0ffb7f9aaabc737a09e73219bad5e98768b71e2c985b2d8ce217730b0720e1a215f7843c8c7e07d44c91212fb1d5b90a791dd147f3746cbc0e28b', + ]); + + final keyViewBuffer = Uint8List.fromList([ + 0, + 0, + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF, + 0, + 0 + ]); + final keyView = Uint8List.view(keyViewBuffer.buffer, 2, 16); + final paramsView = KeyParameter(keyView); + + runBlockCipherTests(BlockCipher('AES'), paramsView, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '75020e0812adb36f32b1503e0de7a59691e0db8fd1c9efb920695a626cb633d6db0112c007d19d5ea66fe7ab36c766232b3bcb98fd35f06d27d5a2d475d92728', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '29523a5e73c0ffb7f9aaabc737a09e73219bad5e98768b71e2c985b2d8ce217730b0720e1a215f7843c8c7e07d44c91212fb1d5b90a791dd147f3746cbc0e28b', + ]); +} diff --git a/pointycastle/test/block/aes_test.dart b/pointycastle/test/block/aes_test.dart new file mode 100644 index 0000000..1c9e6f6 --- /dev/null +++ b/pointycastle/test/block/aes_test.dart @@ -0,0 +1,229 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/block/aes.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('AES Engine', () { + blockCipherTest(0, AESEngine(), kp('80000000000000000000000000000000'), + '00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8'); + + blockCipherTest(1, AESEngine(), kp('00000000000000000000000000000080'), + '00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7'); + + blockCipherMCTTest( + 2, + 10000, + AESEngine(), + kp('00000000000000000000000000000000'), + '00000000000000000000000000000000', + 'C34C052CC0DA8D73451AFE5F03BE297F'); + + blockCipherMCTTest( + 3, + 10000, + AESEngine(), + kp('5F060D3716B345C253F6749ABAC10917'), + '355F697E8B868B65B25A04E18D782AFA', + 'ACC863637868E3E068D2FD6E3508454A'); + + blockCipherTest( + 4, + AESEngine(), + kp('000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + '6CD02513E8D4DC986B4AFE087A60BD0C'); + + blockCipherMCTTest( + 5, + 10000, + AESEngine(), + kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'), + 'F3F6752AE8D7831138F041560631B114', + '77BA00ED5412DFF27C8ED91F3C376172'); + + blockCipherTest( + 6, + AESEngine(), + kp('0000000000000000000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + 'DDC6BF790C15760D8D9AEB6F9A75FD4E'); + + blockCipherMCTTest( + 7, + 10000, + AESEngine(), + kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'), + 'C737317FE0846F132B23C8C2A672CE22', + 'E58B82BFBA53C0040DC610C642121168'); + + blockCipherTest(8, AESEngine(), kp('80000000000000000000000000000000'), + '00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8'); + + blockCipherTest(9, AESEngine(), kp('00000000000000000000000000000080'), + '00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7'); + + blockCipherMCTTest( + 10, + 10000, + AESEngine(), + kp('00000000000000000000000000000000'), + '00000000000000000000000000000000', + 'C34C052CC0DA8D73451AFE5F03BE297F'); + + blockCipherMCTTest( + 11, + 10000, + AESEngine(), + kp('5F060D3716B345C253F6749ABAC10917'), + '355F697E8B868B65B25A04E18D782AFA', + 'ACC863637868E3E068D2FD6E3508454A'); + + blockCipherTest( + 12, + AESEngine(), + kp('000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + '6CD02513E8D4DC986B4AFE087A60BD0C'); + + blockCipherMCTTest( + 13, + 10000, + AESEngine(), + kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'), + 'F3F6752AE8D7831138F041560631B114', + '77BA00ED5412DFF27C8ED91F3C376172'); + + blockCipherTest( + 14, + AESEngine(), + kp('0000000000000000000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + 'DDC6BF790C15760D8D9AEB6F9A75FD4E'); + + blockCipherMCTTest( + 15, + 10000, + AESEngine(), + kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'), + 'C737317FE0846F132B23C8C2A672CE22', + 'E58B82BFBA53C0040DC610C642121168'); + + blockCipherTest(16, AESEngine(), kp('80000000000000000000000000000000'), + '00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8'); + + blockCipherTest(17, AESEngine(), kp('00000000000000000000000000000080'), + '00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7'); + + blockCipherMCTTest( + 18, + 10000, + AESEngine(), + kp('00000000000000000000000000000000'), + '00000000000000000000000000000000', + 'C34C052CC0DA8D73451AFE5F03BE297F'); + + blockCipherMCTTest( + 19, + 10000, + AESEngine(), + kp('5F060D3716B345C253F6749ABAC10917'), + '355F697E8B868B65B25A04E18D782AFA', + 'ACC863637868E3E068D2FD6E3508454A'); + + blockCipherTest( + 20, + AESEngine(), + kp('000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + '6CD02513E8D4DC986B4AFE087A60BD0C'); + + blockCipherMCTTest( + 21, + 10000, + AESEngine(), + kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'), + 'F3F6752AE8D7831138F041560631B114', + '77BA00ED5412DFF27C8ED91F3C376172'); + + blockCipherTest( + 22, + AESEngine(), + kp('0000000000000000000000000000000000000000000000000000000000000000'), + '80000000000000000000000000000000', + 'DDC6BF790C15760D8D9AEB6F9A75FD4E'); + + blockCipherMCTTest( + 23, + 10000, + AESEngine(), + kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'), + 'C737317FE0846F132B23C8C2A672CE22', + 'E58B82BFBA53C0040DC610C642121168'); + }); +} + +KeyParameter kp(String src) { + return KeyParameter(createUint8ListFromHexString(src)); +} + +void blockCipherTest(int id, BlockCipher cipher, CipherParameters parameters, + String input, String output) { + test('AES BlockCipher Test: $id ', () { + var input0 = createUint8ListFromHexString(input); + var output0 = createUint8ListFromHexString(output); + + cipher.init(true, parameters); + var out = Uint8List(input0.length); + var p = 0; + while (p < input0.length) { + p += cipher.processBlock(input0, p, out, p); + } + + expect(output0, equals(out), reason: '$id did not match output'); + + cipher.init(false, parameters); + out = Uint8List(output0.length); + p = 0; + while (p < output0.length) { + p += cipher.processBlock(output0, p, out, p); + } + + expect(input0, equals(out), reason: '$id did not match input'); + }); +} + +void blockCipherMCTTest(int id, int iterations, BlockCipher cipher, + CipherParameters parameters, String input, String output) { + test('AES BlockCipher MCT Test: $id ', () { + var input0 = createUint8ListFromHexString(input); + var output0 = createUint8ListFromHexString(output); + + cipher.init(true, parameters); + var out = Uint8List(input0.length); + out.setRange(0, out.length, input0); + + for (var i = 0; i != iterations; i++) { + var p = 0; + while (p < out.length) { + p += cipher.processBlock(out, p, out, p); + } + } + + expect(output0, equals(out), reason: '$id did not match output'); + + cipher.init(false, parameters); + + for (var i = 0; i != iterations; i++) { + var p = 0; + while (p < out.length) { + p += cipher.processBlock(out, p, out, p); + } + } + + expect(input0, equals(out), reason: '$id did not match input'); + }); +} diff --git a/pointycastle/test/block/blowfish_test.dart b/pointycastle/test/block/blowfish_test.dart new file mode 100644 index 0000000..df1e47c --- /dev/null +++ b/pointycastle/test/block/blowfish_test.dart @@ -0,0 +1,29 @@ +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/blowfish.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('Blowfish Engine', () { + blockCipherTest(0, BlowfishEngine(), _kp('0000000000000000'), '0000000000000000', '4ef997456198dd78'); + + blockCipherTest(1, BlowfishEngine(), _kp('ffffffffffffffff'), 'ffffffffffffffff', '51866fd5b85ecb8a'); + + blockCipherTest(2, BlowfishEngine(), _kp('3000000000000000'), '1000000000000001', '7d856f9a613063f2'); + + blockCipherTest(3, BlowfishEngine(), _kp('1111111111111111'), '1111111111111111', '2466dd878b963c9d'); + + blockCipherTest(4, BlowfishEngine(), _kp('0123456789abcdef'), '1111111111111111', '61f9c3802281b096'); + + blockCipherTest(5, BlowfishEngine(), _kp('fedcba9876543210'), '0123456789abcdef', '0aceab0fc6a0a28d'); + + blockCipherTest(6, BlowfishEngine(), _kp('7ca110454a1a6e57'), '01a1d6d039776742', '59c68245eb05282b'); + + blockCipherTest(7, BlowfishEngine(), _kp('0131d9619dc1376e'), '5cd54ca83def57da', 'b1b8cc0b250f09a0'); + }); +} + +KeyParameter _kp(String key) { + return KeyParameter(createUint8ListFromHexString(key)); +} diff --git a/pointycastle/test/block/camellia_test.dart b/pointycastle/test/block/camellia_test.dart new file mode 100644 index 0000000..55176e3 --- /dev/null +++ b/pointycastle/test/block/camellia_test.dart @@ -0,0 +1,40 @@ +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/camellia.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('Camellia Engine', () { + blockCipherTest(0, CamelliaEngine(), _kp('00000000000000000000000000000000'), '80000000000000000000000000000000', + '07923a39eb0a817d1c4d87bdb82d1f1c'); + + blockCipherTest(1, CamelliaEngine(), _kp('80000000000000000000000000000000'), '00000000000000000000000000000000', + '6c227f749319a3aa7da235a9bba05a2c'); + + blockCipherTest(2, CamelliaEngine(), _kp('0123456789abcdeffedcba9876543210'), '0123456789abcdeffedcba9876543210', + '67673138549669730857065648eabe43'); + + blockCipherTest(3, CamelliaEngine(), _kp('0123456789abcdeffedcba98765432100011223344556677'), + '0123456789abcdeffedcba9876543210', 'b4993401b3e996f84ee5cee7d79b09b9'); + + blockCipherTest(4, CamelliaEngine(), _kp('000000000000000000000000000000000000000000000000'), + '00040000000000000000000000000000', '9bca6c88b928c1b0f57f99866583a9bc'); + + blockCipherTest(5, CamelliaEngine(), _kp('949494949494949494949494949494949494949494949494'), + '636eb22d84b006381235641bcf0308d2', '94949494949494949494949494949494'); + + blockCipherTest(6, CamelliaEngine(), _kp('0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff'), + '0123456789abcdeffedcba9876543210', '9acc237dff16d76c20ef7c919e3a7509'); + + blockCipherTest(7, CamelliaEngine(), _kp('4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a'), + '057764fe3a500edbd988c5c3b56cba9a', '4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a'); + + blockCipherTest(8, CamelliaEngine(), _kp('0303030303030303030303030303030303030303030303030303030303030303'), + '7968b08aba92193f2295121ef8d75c8a', '03030303030303030303030303030303'); + }); +} + +KeyParameter _kp(String key) { + return KeyParameter(createUint8ListFromHexString(key)); +} diff --git a/pointycastle/test/block/desede_engine_test.dart b/pointycastle/test/block/desede_engine_test.dart new file mode 100644 index 0000000..af249ff --- /dev/null +++ b/pointycastle/test/block/desede_engine_test.dart @@ -0,0 +1,45 @@ +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/desede_engine.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('DESede Engine', () { + blockCipherTest( + 0, + DESedeEngine(), + DESedeParameters( + createUint8ListFromHexString('0123456789ABCDEF0123456789ABCDEF'), + ), + '4e6f77206973207468652074696d6520666f7220616c6c20', + '3fa40e8a984d48156a271787ab8883f9893d51ec4b563b53'); + blockCipherTest( + 1, + DESedeEngine(), + DESedeParameters( + createUint8ListFromHexString('0123456789abcdeffedcba9876543210'), + ), + '4e6f77206973207468652074696d6520666f7220616c6c20', + 'd80a0d8b2bae5e4e6a0094171abcfc2775d2235a706e232c'); + + blockCipherTest( + 2, + DESedeEngine(), + DESedeParameters( + createUint8ListFromHexString( + '0123456789abcdef0123456789abcdef0123456789abcdef'), + ), + '4e6f77206973207468652074696d6520666f7220616c6c20', + '3fa40e8a984d48156a271787ab8883f9893d51ec4b563b53'); + blockCipherTest( + 3, + DESedeEngine(), + DESedeParameters( + createUint8ListFromHexString( + '0123456789abcdeffedcba98765432100123456789abcdef'), + ), + '4e6f77206973207468652074696d6520666f7220616c6c20', + 'd80a0d8b2bae5e4e6a0094171abcfc2775d2235a706e232c'); + }); +} diff --git a/pointycastle/test/block/rc2_engine_test.dart b/pointycastle/test/block/rc2_engine_test.dart new file mode 100644 index 0000000..7f59bbc --- /dev/null +++ b/pointycastle/test/block/rc2_engine_test.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; + +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('RC2 Engine', () { + blockCipherTest( + 0, + RC2Engine(), + RC2Parameters(createUint8ListFromHexString('0000000000000000'), + bits: 63), + '0000000000000000', + 'EBB773F993278EFF'); + blockCipherTest( + 1, + RC2Engine(), + RC2Parameters(createUint8ListFromHexString('ffffffffffffffff'), + bits: 64), + 'ffffffffffffffff', + '278b27e42e2f0d49'); + + blockCipherTest( + 2, + RC2Engine(), + RC2Parameters(createUint8ListFromHexString('3000000000000000'), + bits: 64), + '1000000000000001', + '30649edf9be7d2c2'); + + blockCipherTest( + 3, + RC2Engine(), + RC2Parameters(createUint8ListFromHexString('88'), bits: 64), + '0000000000000000', + '61a8a244adacccf0'); + blockCipherTest( + 4, + RC2Engine(), + RC2Parameters(createUint8ListFromHexString('88bca90e90875a'), bits: 64), + '0000000000000000', + '6ccf4308974c267f'); + blockCipherTest( + 5, + RC2Engine(), + RC2Parameters( + createUint8ListFromHexString('88bca90e90875a7f0f79c384627bafb2'), + bits: 64), + '0000000000000000', + '1a807d272bbe5db1'); + blockCipherTest( + 6, + RC2Engine(), + RC2Parameters( + createUint8ListFromHexString('88bca90e90875a7f0f79c384627bafb2'), + bits: 128), + '0000000000000000', + '2269552ab0f85ca6'); + blockCipherTest( + 7, + RC2Engine(), + RC2Parameters( + createUint8ListFromHexString( + '88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e'), + bits: 129), + '0000000000000000', + '5b78d3a43dfff1f1'); + }); + + test('test openssl rc2-40-cbc', () { + // CMD = openssl enc -e -rc2-40-cbc -a -p -nosalt -iv c7d90059b29e97f7 -v + // Password = test + // Input = helloworld + var engine = CBCBlockCipher(RC2Engine()); + engine.reset(); + + var params = ParametersWithIV( + RC2Parameters( + createUint8ListFromHexString('098F6BCD46'), + bits: 40, + ), + createUint8ListFromHexString('C7D90059B29E97F7'), + ); + var input = createUint8ListFromHexString('68656c6c6f776f726c64'); + var output = '3MN/S1ipU7V7lOHQGmGW6g=='; + + engine.init(true, params); + + var padded = addPKCS7Padding(input, 8); + final cipherText = Uint8List(padded.length); + + var offset = 0; + while (offset < padded.length) { + offset += engine.processBlock(padded, offset, cipherText, offset); + } + + var out = base64.decode(output); + expect(cipherText, out); + }); +} diff --git a/pointycastle/test/block/twofish_test.dart b/pointycastle/test/block/twofish_test.dart new file mode 100644 index 0000000..daebcdf --- /dev/null +++ b/pointycastle/test/block/twofish_test.dart @@ -0,0 +1,36 @@ +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/modes/cbc.dart'; +import 'package:pointycastle/block/twofish.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('Twofish Engine', () { + final input = '000102030405060708090a0b0c0d0e0f'; + + blockCipherTest(0, TwofishEngine(), _kp('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'), input, + '8ef0272c42db838bcf7b07af0ec30f38'); + + blockCipherTest(1, TwofishEngine(), _kp('000102030405060708090a0b0c0d0e0f1011121314151617'), input, + '95accc625366547617f8be4373d10cd7'); + + blockCipherTest( + 2, TwofishEngine(), _kp('000102030405060708090a0b0c0d0e0f'), input, '9fb63337151be9c71306d159ea7afaa4'); + + blockCipherTest( + 3, + CBCBlockCipher(TwofishEngine()), + _kpWithIV('0123456789abcdef1234567890abcdef', '1234567890abcdef0123456789abcdef'), + input, + 'd6bfdbb2090562e960273783127e2658'); + }); +} + +KeyParameter _kp(String key) { + return KeyParameter(createUint8ListFromHexString(key)); +} + +ParametersWithIV _kpWithIV(String key, String iv) { + return ParametersWithIV(_kp(key), createUint8ListFromHexString(iv)); +} diff --git a/pointycastle/test/digests/blake2b_test.dart b/pointycastle/test/digests/blake2b_test.dart new file mode 100644 index 0000000..e0c1498 --- /dev/null +++ b/pointycastle/test/digests/blake2b_test.dart @@ -0,0 +1,73 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/digests/blake2b.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/runners/digest.dart'; +import '../test/src/helpers.dart'; + +void main() { + group('PR108 regression test', () { + test('vectors from: https://blake2.net/blake2b-test.txt', () { + var vec = [ + [ + '', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + '10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568', + ], + [ + '00', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + '961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd', + ], + [ + '0001', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + 'da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965' + ], + [ + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + 'f1aa2b044f8f0c638a3f362e677b5d891d6fd2ab0765f6ee1e4987de057ead357883d9b405b9d609eea1b869d97fb16d9b51017c553f3b93c0a1e0f1296fedcd' + ], + [ + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + 'c230f0802679cb33822ef8b3b21bf7a9a28942092901d7dac3760300831026cf354c9232df3e084d9903130c601f63c1f4a4a4b8106e468cd443bbe5a734f45f' + ], + [ + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + '142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461' + ] + ]; + + for (var set in vec) { + var input = createUint8ListFromHexString(set[0]); + var key = createUint8ListFromHexString(set[1]); + var dig = Blake2bDigest(key: key); + dig.update(input, 0, input.length); + var res = Uint8List(64); + dig.doFinal(res, 0); + var expected = createUint8ListFromHexString(set[2]); + expect(res, equals(expected)); + } + }); + }); + + runDigestTests(Digest('Blake2b'), [ + '', + '786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + 'b26dc06e2a96f3a2d16313b8633e79c438317ba399ed143aa0a695c2c14df01bf7870ad2ee09b3ef7f0d36bba5c98541cbce3c6e802790b402534f757d2085d3', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'c782dabd3cabf2e74f2b6e9854fc6f274583cb77003e20625ec19efad78993480c237594841cef9933ac7a675a526426460d87bc0ef4538ed08d0e2744a22900', + 'Lorem ipsum dolor sit amet, ex has ignota maluisset persecuti. Cum ad integre splendide adipiscing. An sit ipsum possim, dicunt ', + 'ee370c9780381c360feeedc04fff3caa17687cde31e8a541d0a0053c3b92c0195d0f64e27126cba2e79f1b007f3ec9ab66f5fd9bca416654a05cfd94cb8da2be', + 'Lorem ipsum dolor sit amet, ex has ignota maluisset persecuti. Cum ad integre splendide adipiscing. An sit ipsum possim, dicunt eirmod habemus mea at, in sea alii dolorem deterruisset. An habeo fabellas facilisis eum, aperiri imperdiet definitiones eum no. Aeque delicata eos et. Fierent platonem cum id.', + '79ca22680c4a9b72299eb22d173222b309d9f2b90f9f16bc170a143482d62b23029b6712758bf6135659adeeeaf8ad472b746674b5e10b7a4cb6b803b88c19db', + ]); +} diff --git a/pointycastle/test/digests/cshake_test.dart b/pointycastle/test/digests/cshake_test.dart new file mode 100644 index 0000000..c459785 --- /dev/null +++ b/pointycastle/test/digests/cshake_test.dart @@ -0,0 +1,240 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/digests/cshake.dart'; +import 'package:pointycastle/digests/shake.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + performTest(); + performZeroPadTest(); + performDoFinalTest(); + testCSHAKESizeEnforcement(); + + var empty = Uint8List(0); + + group('misc cshake', () { + test('cshake / shake equality', () { + checkSHAKE(128, CSHAKEDigest(128, Uint8List(0), empty), + createUint8ListFromHexString('eeaabeef')); + checkSHAKE(256, CSHAKEDigest(256, empty, null), + createUint8ListFromHexString('eeaabeef')); + checkSHAKE(128, CSHAKEDigest(128, null, empty), + createUint8ListFromHexString('eeaabeef')); + checkSHAKE(128, CSHAKEDigest(128, null, null), + createUint8ListFromHexString('eeaabeef')); + checkSHAKE(256, CSHAKEDigest(256, null, null), + createUint8ListFromHexString('eeaabeef')); + }); + }); +} + +String formatBytesAsHexString(Uint8List bytes) { + var result = StringBuffer(); + for (var i = 0; i < bytes.lengthInBytes; i++) { + var part = bytes[i]; + result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}'); + } + return result.toString(); +} + +void checkSHAKE(int bitSize, CSHAKEDigest cshake, Uint8List msg) { + var ref = SHAKEDigest(bitSize); + + ref.update(msg, 0, msg.length); + cshake.update(msg, 0, msg.length); + + var res1 = Uint8List(32); + var res2 = Uint8List(32); + + ref.doFinalRange(res1, 0, res1.length); + cshake.doFinalRange(res2, 0, res2.length); + + expect(res1, equals(res2)); +} + +void performDoFinalTest() { + group('CSHAKE doFinalTest', () { + test('doOutput no change on update until doFinal', () { + var cshake = CSHAKEDigest( + 128, Uint8List(0), Uint8List.fromList('Email Signature'.codeUnits)); + cshake.update(createUint8ListFromHexString('00010203'), 0, 4); + var res = Uint8List(32); + cshake.doOutput(res, 0, res.length); + expect( + res, + equals(createUint8ListFromHexString( + 'c1c36925b6409a04f1b504fcbca9d82b4017277cb5ed2b2065fc1d3814d5aaf5'))); + + cshake.doOutput(res, 0, res.length); + + expect( + res, + isNot(createUint8ListFromHexString( + 'c1c36925b6409a04f1b504fcbca9d82b4017277cb5ed2b2065fc1d3814d5aaf5'))); + + cshake.doFinalRange(res, 0, res.length); + + cshake.update(createUint8ListFromHexString('00010203'), 0, 4); + + cshake.doFinalRange(res, 0, res.length); + + expect( + res, + equals(createUint8ListFromHexString( + 'c1c36925b6409a04f1b504fcbca9d82b4017277cb5ed2b2065fc1d3814d5aaf5'))); + + cshake.update(createUint8ListFromHexString('00010203'), 0, 4); + + cshake.doOutput(res, 0, res.length); + + expect( + res, + equals(createUint8ListFromHexString( + 'c1c36925b6409a04f1b504fcbca9d82b4017277cb5ed2b2065fc1d3814d5aaf5'))); + + cshake.doFinalRange(res, 0, res.length); + + expect( + res, + equals(createUint8ListFromHexString( + '9cbce830079c452abdeb875366a49ebfe75b89ef17396e34898e904830b0e136'))); + }); + }); +} + +void performZeroPadTest() { + group('CSHAKE checkZeroPadZ', () { + test('256 no function name (N)', () { + var buf = Uint8List(20); + var cshake1 = CSHAKEDigest(256, Uint8List(0), Uint8List(265)); + cshake1.doOutput(buf, 0, buf.length); + expect( + buf, + equals(createUint8ListFromHexString( + '6e393540387004f087c4180db008acf6825190cf'))); + }); + + test('128 no function name (N)', () { + var buf = Uint8List(20); + var cshake1 = CSHAKEDigest(128, Uint8List(0), Uint8List(329)); + cshake1.doOutput(buf, 0, buf.length); + expect( + buf, + equals(createUint8ListFromHexString( + '309bd7c285fcf8b839c9686b2cc00bd578947bee'))); + }); + + test('128 with function name (N)', () { + var buf = Uint8List(20); + var cshake1 = CSHAKEDigest(128, Uint8List(29), Uint8List(300)); + cshake1.doOutput(buf, 0, buf.length); + expect( + buf, + equals(createUint8ListFromHexString( + 'ff6aafd83b8d22fc3e2e9b9948b581967ed9c5e7'))); + }); + }); +} + +void performTest() { + group('CSHAKE 128', () { + test('test 1', () { + var cshake = CSHAKEDigest( + 128, Uint8List(0), Uint8List.fromList('Email Signature'.codeUnits)); + cshake.update(createUint8ListFromHexString('00010203'), 0, 4); + var res = Uint8List(32); + cshake.doOutput(res, 0, res.length); + + expect( + createUint8ListFromHexString( + 'c1c36925b6409a04f1b504fcbca9d82b4017277cb5ed2b2065fc1d3814d5aaf5'), + equals(res)); + }); + + test('test 2', () { + var cshake = CSHAKEDigest( + 128, Uint8List(0), Uint8List.fromList('Email Signature'.codeUnits)); + cshake.update( + createUint8ListFromHexString('''000102030405060708090A0B0C0D0E0F + 101112131415161718191A1B1C1D1E1F + 202122232425262728292A2B2C2D2E2F + 303132333435363738393A3B3C3D3E3F + 404142434445464748494A4B4C4D4E4F + 505152535455565758595A5B5C5D5E5F + 606162636465666768696A6B6C6D6E6F + 707172737475767778797A7B7C7D7E7F + 808182838485868788898A8B8C8D8E8F + 909192939495969798999A9B9C9D9E9F + A0A1A2A3A4A5A6A7A8A9AAABACADAEAF + B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF + C0C1C2C3C4C5C6C7'''), 0, 1600 ~/ 8); + var res = Uint8List(32); + cshake.doOutput(res, 0, res.length); + + expect( + createUint8ListFromHexString( + 'C5221D50E4F822D96A2E8881A961420F294B7B24FE3D2094BAED2C6524CC166B'), + equals(res)); + }); + }); + + group('CSHAKE 256', () { + test('test 1', () { + var cshake = CSHAKEDigest( + 256, Uint8List(0), Uint8List.fromList('Email Signature'.codeUnits)); + cshake.update(createUint8ListFromHexString('00010203'), 0, 4); + var res = Uint8List(64); + cshake.doOutput(res, 0, res.length); + expect(createUint8ListFromHexString('''D008828E2B80AC9D2218FFEE1D070C48 + B8E4C87BFF32C9699D5B6896EEE0EDD1 + 64020E2BE0560858D9C00C037E34A969 + 37C561A74C412BB4C746469527281C8C'''), equals(res)); + }); + + test('test 2', () { + var cshake = CSHAKEDigest( + 256, Uint8List(0), Uint8List.fromList('Email Signature'.codeUnits)); + cshake.update( + createUint8ListFromHexString('''000102030405060708090A0B0C0D0E0F + 101112131415161718191A1B1C1D1E1F + 202122232425262728292A2B2C2D2E2F + 303132333435363738393A3B3C3D3E3F + 404142434445464748494A4B4C4D4E4F + 505152535455565758595A5B5C5D5E5F + 606162636465666768696A6B6C6D6E6F + 707172737475767778797A7B7C7D7E7F + 808182838485868788898A8B8C8D8E8F + 909192939495969798999A9B9C9D9E9F + A0A1A2A3A4A5A6A7A8A9AAABACADAEAF + B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF + C0C1C2C3C4C5C6C7'''), 0, 1600 ~/ 8); + var res = Uint8List(64); + cshake.doOutput(res, 0, res.length); + + expect(createUint8ListFromHexString('''07DC27B11E51FBAC75BC7B3C1D983E8B + 4B85FB1DEFAF218912AC864302730917 + 27F42B17ED1DF63E8EC118F04B23633C + 1DFB1574C8FB55CB45DA8E25AFB092BB'''), equals(res)); + }); + }); +} + +void testCSHAKESizeEnforcement() { + group('CSHAKE Tests', () { + test('enforcement of valid CSHAKE sizes', () { + CSHAKEDigest(128); + CSHAKEDigest(256); + + var bitLen = 123; + try { + CSHAKEDigest(bitLen); + fail('Invalid CSHAKE bitlen accepted'); + } on StateError catch (se) { + expect(se.message, + 'invalid bitLength ($bitLen) for CSHAKE must only be 128 or 256'); + } + }); + }); +} diff --git a/pointycastle/test/digests/keccak_test.dart b/pointycastle/test/digests/keccak_test.dart new file mode 100644 index 0000000..d385eb4 --- /dev/null +++ b/pointycastle/test/digests/keccak_test.dart @@ -0,0 +1,356 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + testRegressions(); + testKeccakSizeEnforcement(); + testKeccakAgainstVectors(); +} + +void testRegressions() { + group('Keccak Regressions', () { + test('single byte update regression', () { + var expected = createUint8ListFromHexString( + '4d3894ba300d1853982045f7d93cb8e32ea5150d0d4eb8a44d783c1362a73a9bdd4c5ba3'); + var dig = KeccakDigest(288); + + for (var t = 0; t < 255; t++) { + dig.updateByte(t); + } + + var res = Uint8List(dig.digestSize); + dig.doFinal(res, 0); + expect(res, equals(expected)); + }); + + test('_padAndSwitchToSqueezingPhase', () { + // + // Exercise keccak with inputs ranging in length from zero bytes to 1024 + // Keccak Digest output is passed to SHA256 as a summation step to avoid need + // to include a vector file with 1024 entries in it. + // Summation digest calculated using BC Java Api + // + + var iut = KeccakDigest(288); + var summationDigest = SHA256Digest(); + var iutRes = Uint8List(iut.digestSize); + + for (var t = 0; t < 1024; t++) { + for (var i = 0; i < t; i++) { + iut.updateByte(i); + } + iut.doFinal(iutRes, 0); + summationDigest.update(iutRes, 0, iutRes.length); + } + + var sum = Uint8List(summationDigest.digestSize); + summationDigest.doFinal(sum, 0); + + expect( + sum, + equals(createUint8ListFromHexString( + '51e16cafd44b120fde44105f299b8343c22899851da30bb33a481d4b81c2ef3e'))); + }); + }); +} + +void testKeccakSizeEnforcement() { + group('Keccak Tests', () { + test('enforcement of valid Keccak sizes', () { + KeccakDigest(128); + KeccakDigest(224); + KeccakDigest(256); + KeccakDigest(288); + KeccakDigest(384); + KeccakDigest(512); + + var bitLen = 123; + try { + KeccakDigest(bitLen); + fail('Invalid keccak bitlen accepted'); + } on StateError catch (se) { + expect(se.message, + 'invalid bitLength ($bitLen) for Keccak must only be 128,224,256,288,384,512'); + } + }); + }); +} + +var _messages = [ + '', + '54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67', + '54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f672e' +]; + +var _digests288 = [ + // the default settings + '6753e3380c09e385d0339eb6b050a68f66cfd60a73476e6fd6adeb72f5edd7c6f04a5d01', + // message[0] + '0bbe6afae0d7e89054085c1cc47b1689772c89a41796891e197d1ca1b76f288154933ded', + // message[1] + '82558a209b960ddeb531e6dcb281885b2400ca160472462486e79f071e88a3330a8a303d', + // message[2] + '94049e1ad7ef5d5b0df2b880489e7ab09ec937c3bfc1b04470e503e1ac7b1133c18f86da', + // 64k a-test + 'a9cb5a75b5b81b7528301e72553ed6770214fa963956e790528afe420de33c074e6f4220', + // random alphabet test + 'eadaf5ba2ad6a2f6f338fce0e1efdad2a61bb38f6be6068b01093977acf99e97a5d5827c' + // extremely long data test +]; + +var _digests224 = [ + 'f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd', + '310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe', + 'c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab', + 'f621e11c142fbf35fa8c22841c3a812ba1e0151be4f38d80b9f1ff53', + '68b5fc8c87193155bba68a2485377e809ee4f81a85ef023b9e64add0', + 'c42e4aee858e1a8ad2976896b9d23dd187f64436ee15969afdbc68c5' +]; + +var _digests256 = [ + 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + '4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15', + '578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d', + '0047a916daa1f92130d870b542e22d3108444f5a7e4429f05762fb647e6ed9ed', + 'db368762253ede6d4f1db87e0b799b96e554eae005747a2ea687456ca8bcbd03', + '5f313c39963dcf792b5470d4ade9f3a356a3e4021748690a958372e2b06f82a4' +]; + +var _digests384 = [ + '2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff', + '283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3', + '9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b', + 'c704cfe7a1a53208ca9526cd24251e0acdc252ecd978eee05acd16425cfb404ea81f5a9e2e5e97784d63ee6a0618a398', + 'd4fe8586fd8f858dd2e4dee0bafc19b4c12b4e2a856054abc4b14927354931675cdcaf942267f204ea706c19f7beefc4', + '9b7168b4494a80a86408e6b9dc4e5a1837c85dd8ff452ed410f2832959c08c8c0d040a892eb9a755776372d4a8732315' +]; + +var _digests512 = [ + '0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e', + 'd135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609', + 'ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760', + '34341ead153aa1d1fdcf6cf624c2b4f6894b6fd16dc38bd4ec971ac0385ad54fafcb2e0ed86a1e509456f4246fdcb02c3172824cd649d9ad54c51f7fb49ea67c', + 'dc44d4f4d36b07ab5fc04016cbe53548e5a7778671c58a43cb379fd00c06719b8073141fc22191ffc3db5f8b8983ae8341fa37f18c1c969664393aa5ceade64e', + '3e122edaf37398231cfaca4c7c216c9d66d5b899ec1d7ac617c40c7261906a45fc01617a021e5da3bd8d4182695b5cb785a28237cbb167590e34718e56d8aab8' +]; + +void exerciseDigest(KeccakDigest digest, List expected) { + test(digest.algorithmName, () { + var hash = Uint8List(digest.digestSize); + + for (var i = 0; i != _messages.length; i++) { + if (_messages.isNotEmpty) { + var data = createUint8ListFromHexString(_messages[i]); + digest.update(data, 0, data.length); + } + + digest.doFinal(hash, 0); + + expect(hash, createUint8ListFromHexString(expected[i]), + reason: + 'Keccak mismatch on + ${digest.algorithmName} at index + $i'); + } + + var k64 = Uint8List(1024 * 64); + + for (var i = 0; i != k64.length; i++) { + k64[i] = 97; //'a'; + } + + digest.update(k64, 0, k64.length); + digest.doFinal(hash, 0); + + expect(hash, createUint8ListFromHexString(expected[_messages.length]), + reason: 'Keccak mismatch on ${digest.algorithmName} 64k a'); + + for (var i = 0; i != k64.length; i++) { + digest.update(Uint8List.fromList([97]), 0, 1); //byte)'a'); + } + + digest.doFinal(hash, 0); + + expect(hash, createUint8ListFromHexString(expected[_messages.length]), + reason: 'Keccak mismatch on ${digest.algorithmName} 64k a single'); + + for (var i = 0; i != k64.length; i++) { + k64[i] = 97 + (i % 26); + } + + digest.update(k64, 0, k64.length); + + digest.doFinal(hash, 0); + + expect(hash, createUint8ListFromHexString(expected[_messages.length + 1]), + reason: 'Keccak mismatch on ${digest.algorithmName} 64k alpha'); + + for (var i = 0; i != 64; i++) { + digest.update(Uint8List.fromList([k64[i * 1024]]), 0, 1); + digest.update(k64, i * 1024 + 1, 1023); + } + + digest.doFinal(hash, 0); + expect(hash, createUint8ListFromHexString(expected[_messages.length + 1]), + reason: 'Keccak mismatch on ${digest.algorithmName} 64k chunked alpha'); + + testDigestDoFinal(digest); + }); +} + +void testDigestDoFinal(KeccakDigest digest) { + var hash = Uint8List(digest.digestSize); + digest.doFinal(hash, 0); + + for (var i = 0; i <= digest.digestSize; ++i) { + var cmp = List.filled(2 * digest.digestSize, 0, growable: false); + cmp.setRange(i, i + hash.length, hash); + var buf = Uint8List(2 * digest.digestSize); + digest.doFinal(buf, i); + + expect(cmp, buf, + reason: 'Keccak offset doFinal on ${digest.algorithmName}'); + } +} + +var _truncKey = KeyParameter( + createUint8ListFromHexString('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c')); +var _truncData = + createUint8ListFromHexString('546573742057697468205472756e636174696f6e'); + +var _trunc224 = + createUint8ListFromHexString('f52bbcfd654264e7133085c5e69b72c3'); +var _trunc256 = + createUint8ListFromHexString('745e7e687f8335280d54202ef13cecc6'); +var _trunc384 = + createUint8ListFromHexString('fa9aea2bc1e181e47cbb8c3df243814d'); +var _trunc512 = + createUint8ListFromHexString('04c929fead434bba190dacfa554ce3f5'); + +// test vectors from http://www.di-mgt.com.au/hmac_sha3_testvectors.html +var _macKeys = [ + createUint8ListFromHexString('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'), + createUint8ListFromHexString('4a656665'), + createUint8ListFromHexString('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), + createUint8ListFromHexString( + '0102030405060708090a0b0c0d0e0f10111213141516171819'), + createUint8ListFromHexString( + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), + createUint8ListFromHexString( + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), + createUint8ListFromHexString( + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') +]; + +var _macData = [ + '4869205468657265', + '7768617420646f2079612077616e7420666f72206e6f7468696e673f', + 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', + 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a65204b6579202d2048617368204b6579204669727374', + '5468697320697320612074657374207573696e672061206c6172676572207468616e20626c6f636b2d73697a65206b657920616e642061206c6172676572207468616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565647320746f20626520686173686564206265666f7265206265696e6720757365642062792074686520484d414320616c676f726974686d2e', + '5468697320697320612074657374207573696e672061206c6172676572207468616e20626c6f636b2d73697a65206b657920616e642061206c6172676572207468616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565647320746f20626520686173686564206265666f7265206265696e6720757365\n642062792074686520484d414320616c676f726974686d2e' +]; + +var _mac224 = [ + 'b73d595a2ba9af815e9f2b4e53e78581ebd34a80b3bbaac4e702c4cc', + 'e824fec96c074f22f99235bb942da1982664ab692ca8501053cbd414', + '770df38c99d6e2bacd68056dcfe07d4c89ae20b2686a6185e1faa449', + '305a8f2dfb94bad28861a03cbc4d590febe775c58cb4961c28428a0b', + 'e7a52dfa45f95a217c100066b239aa8ad519be9b35d667268b1b57ff', + 'ba13009405a929f398b348885caa5419191bb948ada32194afc84104', + '92649468be236c3c72c189909c063b13f994be05749dc91310db639e' +]; + +var _mac256 = [ + '9663d10c73ee294054dc9faf95647cb99731d12210ff7075fb3d3395abfb9821', + 'aa9aed448c7abc8b5e326ffa6a01cdedf7b4b831881468c044ba8dd4566369a1', + '95f43e50f8df80a21977d51a8db3ba572dcd71db24687e6f86f47c1139b26260', + '6331ba9b4af5804a68725b3663eb74814494b63c6093e35fb320a85d507936fd', + 'b4d0cdee7ec2ba81a88b86918958312300a15622377929a054a9ce3ae1fac2b6', + '1fdc8cb4e27d07c10d897dec39c217792a6e64fa9c63a77ce42ad106ef284e02', + 'fdaa10a0299aecff9bb411cf2d7748a4022e4a26be3fb5b11b33d8c2b7ef5484' +]; + +var _mac384 = [ + '892dfdf5d51e4679bf320cd16d4c9dc6f749744608e003add7fba894acff87361efa4e5799be06b6461f43b60ae97048', + '5af5c9a77a23a6a93d80649e562ab77f4f3552e3c5caffd93bdf8b3cfc6920e3023fc26775d9df1f3c94613146ad2c9d', + '4243c29f2201992ff96441e3b91ff81d8c601d706fbc83252684a4bc51101ca9b2c06ddd03677303c502ac5331752a3c', + 'b730724d3d4090cda1be799f63acbbe389fef7792fc18676fa5453aab398664650ed029c3498bbe8056f06c658e1e693', + 'd62482ef601d7847439b55236e9679388ffcd53c62cd126f39be6ea63de762e26cd5974cb9a8de401b786b5555040f6f', + '4860ea191ac34994cf88957afe5a836ef36e4cc1a66d75bf77defb7576122d75f60660e4cf731c6effac06402787e2b9', + 'fe9357e3cfa538eb0373a2ce8f1e26ad6590afdaf266f1300522e8896d27e73f654d0631c8fa598d4bb82af6b744f4f5' +]; + +var _mac512 = [ + '8852c63be8cfc21541a4ee5e5a9a852fc2f7a9adec2ff3a13718ab4ed81aaea0b87b7eb397323548e261a64e7fc75198f6663a11b22cd957f7c8ec858a1c7755', + 'c2962e5bbe1238007852f79d814dbbecd4682e6f097d37a363587c03bfa2eb0859d8d9c701e04cececfd3dd7bfd438f20b8b648e01bf8c11d26824b96cebbdcb', + 'eb0ed9580e0ec11fc66cbb646b1be904eaff6da4556d9334f65ee4b2c85739157bae9027c51505e49d1bb81cfa55e6822db55262d5a252c088a29a5e95b84a66', + 'b46193bb59f4f696bf702597616da91e2a4558a593f4b015e69141ba81e1e50ea580834c2b87f87baa25a3a03bfc9bb389847f2dc820beae69d30c4bb75369cb', + 'd05888a6ebf8460423ea7bc85ea4ffda847b32df32291d2ce115fd187707325c7ce4f71880d91008084ce24a38795d20e6a28328a0f0712dc38253370da3ebb5', + '2c6b9748d35c4c8db0b4407dd2ed2381f133bdbd1dfaa69e30051eb6badfcca64299b88ae05fdbd3dd3dd7fe627e42e39e48b0fe8c7f1e85f2dbd52c2d753572', + '6adc502f14e27812402fc81a807b28bf8a53c87bea7a1df6256bf66f5de1a4cb741407ad15ab8abc136846057f881969fbb159c321c904bfb557b77afb7778c8' +]; + +void exerciseKeccakMac(Digest digest, List keys, List data, + List expected, Uint8List truncExpected) { + test(digest.algorithmName, () { + var mac = HMac.withDigest(digest); + + for (var i = 0; i != keys.length; i++) { + mac.init(KeyParameter(keys[i])); + + var mData = createUint8ListFromHexString(data[i]); + + mac.update(mData, 0, mData.length); + + var macV = Uint8List(mac.macSize); + + mac.doFinal(macV, 0); + + expect(createUint8ListFromHexString(expected[i]), macV, + reason: 'Keccak HMAC mismatch on ${digest.algorithmName}'); + } + + mac = Mac('${digest.algorithmName}/HMAC') as HMac; + + mac.init(_truncKey); + + mac.update(_truncData, 0, _truncData.length); + + var macV = Uint8List(mac.macSize); + + mac.doFinal(macV, 0); + + for (var i = 0; i != truncExpected.length; i++) { + expect(macV[i], truncExpected[i], + reason: 'mismatch on truncated HMAC for ${digest.algorithmName}'); + } + }); +} + +void testKeccakAgainstVectors() { + group('Keccak Digest', () { + exerciseDigest(KeccakDigest(), _digests288); + exerciseDigest(KeccakDigest(224), _digests224); + exerciseDigest(KeccakDigest(288), _digests288); + exerciseDigest(KeccakDigest(256), _digests256); + exerciseDigest(KeccakDigest(384), _digests384); + exerciseDigest(KeccakDigest(512), _digests512); + }); + + group('Keccak Hmac', () { + exerciseKeccakMac( + KeccakDigest(224), _macKeys, _macData, _mac224, _trunc224); + exerciseKeccakMac( + KeccakDigest(256), _macKeys, _macData, _mac256, _trunc256); + exerciseKeccakMac( + KeccakDigest(384), _macKeys, _macData, _mac384, _trunc384); + exerciseKeccakMac( + KeccakDigest(512), _macKeys, _macData, _mac512, _trunc512); + }); +} diff --git a/pointycastle/test/digests/md2_test.dart b/pointycastle/test/digests/md2_test.dart new file mode 100644 index 0000000..a2719aa --- /dev/null +++ b/pointycastle/test/digests/md2_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('MD2'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '70bdf19ce16c171706e9ef02219f35a8', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '2b6aa7a2fe344c9bd4844c73c306a26a', + ]); +} diff --git a/pointycastle/test/digests/md4_test.dart b/pointycastle/test/digests/md4_test.dart new file mode 100644 index 0000000..9b1f7d4 --- /dev/null +++ b/pointycastle/test/digests/md4_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('MD4'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '1d6839cb198b77f5d9a027a5ed1989d7', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '95cdeefe499f74582d2894436cfbb989', + ]); +} diff --git a/pointycastle/test/digests/md5_test.dart b/pointycastle/test/digests/md5_test.dart new file mode 100644 index 0000000..13b97d5 --- /dev/null +++ b/pointycastle/test/digests/md5_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('MD5'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + 'b4dbd72756e62ad118c9759446956d15', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'dc4381c2a676fdcd92fad9ba4b97116d', + ]); +} diff --git a/pointycastle/test/digests/ripemd128_test.dart b/pointycastle/test/digests/ripemd128_test.dart new file mode 100644 index 0000000..9c3079e --- /dev/null +++ b/pointycastle/test/digests/ripemd128_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('RIPEMD-128'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '3e67e64143573d714263ed98b8d85c1d', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '6a022533ba64455b63cdadbdc57dcc3d', + ]); +} diff --git a/pointycastle/test/digests/ripemd160_test.dart b/pointycastle/test/digests/ripemd160_test.dart new file mode 100644 index 0000000..81660ee --- /dev/null +++ b/pointycastle/test/digests/ripemd160_test.dart @@ -0,0 +1,20 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +/// NOTE: abc and empty string test vectors were taken from +/// [http://homes.esat.kuleuven.be/~bosselae/ripemd160.html]. +void main() { + runDigestTests(Digest('RIPEMD-160'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '7cc186f1d641709ec2bd363b10d3d66f122b365e', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '48573da6caf89431a195e70f305f0df3b4f7ace6', + 'abc', + '8eb208f7e05d987a9b044a8e98c6b087f15a0bfc', + '', + '9c1185a5c5e9fc54612808977ee8f548b2258d31', + ]); +} diff --git a/pointycastle/test/digests/ripemd256_test.dart b/pointycastle/test/digests/ripemd256_test.dart new file mode 100644 index 0000000..cfe504a --- /dev/null +++ b/pointycastle/test/digests/ripemd256_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('RIPEMD-256'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '5bca9a62d8c446acea2716a6634bed99ae9c240ebadf584b277397028bbe74de', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'b12cc8c54ad8e14e9cbaa8bdd1d78139880fc824a2af19c67699d64fb4322cc2', + ]); +} diff --git a/pointycastle/test/digests/ripemd320_test.dart b/pointycastle/test/digests/ripemd320_test.dart new file mode 100644 index 0000000..7001674 --- /dev/null +++ b/pointycastle/test/digests/ripemd320_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('RIPEMD-320'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '64a765d4c54e5a7fab2f09d833eea3aed68b327c949f3b9b167be59e049bb2b23bb3c1613308a25b', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '45b72f4944bad47751ce6a80bfe68c7eb98e9e67edd91f3dad3f6dd470e04f61711766d3d24b9ebe', + ]); +} diff --git a/pointycastle/test/digests/sha1_test.dart b/pointycastle/test/digests/sha1_test.dart new file mode 100644 index 0000000..5963e6b --- /dev/null +++ b/pointycastle/test/digests/sha1_test.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-1'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '04e7635f310b9fbfa496ace02fa3ff9e7737f58c', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'cc8c8c2319221ae0b2a5dd5b26748a937c5855e4', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + 'b777fc3b3d773d11cdb187b7ec7db99ce802e1b6', + ]); +} diff --git a/pointycastle/test/digests/sha224_test.dart b/pointycastle/test/digests/sha224_test.dart new file mode 100644 index 0000000..85d78cf --- /dev/null +++ b/pointycastle/test/digests/sha224_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-224'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '10cffc69eddba6e8eafae57155284bd074778e0903e251ea9c8f9f62', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'f62bf1175f02176cfb00c370aea1c7203ba45a91cf776535380ab1a5', + ]); +} diff --git a/pointycastle/test/digests/sha256_test.dart b/pointycastle/test/digests/sha256_test.dart new file mode 100644 index 0000000..64c79f5 --- /dev/null +++ b/pointycastle/test/digests/sha256_test.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-256'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '5bd6045a7697c48316411ff00be02595cf3d8596d99ba12482d18c90d61633cb', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '2ab2e44465bec2b6bcfc8d13bfe07aa7e25e064685c60c2715d1831172376073', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + 'e43f7439c928c57b4d48263dcee29d046a53301af129d7b681227380ba01595b', + ]); +} diff --git a/pointycastle/test/digests/sha384_test.dart b/pointycastle/test/digests/sha384_test.dart new file mode 100644 index 0000000..e09c722 --- /dev/null +++ b/pointycastle/test/digests/sha384_test.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-384'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '3b6ae66bd9a8c2e447051836d5b74326037a9f0f875c904f6dec446aa3cd18b9ae4618cc63abc35a1d68a7acf45835a1', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '198d957423fab1fc8489ba431629ff0d6350e8f8fccd68dd7fa02b344234491d99a43ec454521d19e304ad95c9507079', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '052413522e7af6c106f26b1d725664ab4c5ea40e111dfe1a537429888a95978fc76f5f0e8996158e9fae81e2b876935e', + ]); +} diff --git a/pointycastle/test/digests/sha3_test.dart b/pointycastle/test/digests/sha3_test.dart new file mode 100644 index 0000000..52b3b51 --- /dev/null +++ b/pointycastle/test/digests/sha3_test.dart @@ -0,0 +1,182 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/digests/sha3.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +class _Sha3Vector { + _Sha3Vector(this.algo, this.bits, String msg, String digest) { + this.msg = createUint8ListFromHexString(msg); + this.digest = createUint8ListFromHexString(digest); + } + + String algo; + int bits; + Uint8List? msg; + Uint8List? digest; +} + +void main() { + testSHA3SizeEnforcement(); + testSHA3AgainstVectors(); +} + +void testSHA3AgainstVectors() { + var algoToSize = { + 'SHA3-224': 224, + 'SHA3-256': 256, + 'SHA3-384': 384, + 'SHA3-512': 512 + }; + + // + // Test vectors for FIPS 202 - SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions + // + var vectors = [ + _Sha3Vector('SHA3-224', 0, '', + '6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7'), + _Sha3Vector('SHA3-224', 5, '13', + 'ffbad5da96bad71789330206dc6768ecaeb1b32dca6b3301489674ab'), + _Sha3Vector('SHA3-224', 30, '53587b19', + 'd666a514cc9dba25ac1ba69ed3930460deaac9851b5f0baab007df3b'), + _Sha3Vector( + 'SHA3-224', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + '9376816aba503f72f96ce7eb65ac095deee3be4bf9bbc2a1cb7e11e0'), + _Sha3Vector( + 'SHA3-224', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + '22d2f7bb0b173fd8c19686f9173166e3ee62738047d7eadd69efb228'), + _Sha3Vector( + 'SHA3-224', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + '4e907bb1057861f200a599e9d4f85b02d88453bf5b8ace9ac589134c'), + _Sha3Vector('SHA3-256', 0, '', + 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a'), + _Sha3Vector('SHA3-256', 5, '13', + '7b0047cf5a456882363cbf0fb05322cf65f4b7059a46365e830132e3b5d957af'), + _Sha3Vector('SHA3-256', 30, '53587b19', + 'c8242fef409e5ae9d1f1c857ae4dc624b92b19809f62aa8c07411c54a078b1d0'), + _Sha3Vector( + 'SHA3-256', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + '79f38adec5c20307a98ef76e8324afbfd46cfd81b22e3973c65fa1bd9de31787'), + _Sha3Vector( + 'SHA3-256', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + '81ee769bed0950862b1ddded2e84aaa6ab7bfdd3ceaa471be31163d40336363c'), + _Sha3Vector( + 'SHA3-256', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + '52860aa301214c610d922a6b6cab981ccd06012e54ef689d744021e738b9ed20'), + _Sha3Vector('SHA3-384', 0, '', + '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004'), + _Sha3Vector('SHA3-384', 5, '13', + '737c9b491885e9bf7428e792741a7bf8dca9653471c3e148473f2c236b6a0a6455eb1dce9f779b4b6b237fef171b1c64'), + _Sha3Vector('SHA3-384', 30, '53587b19', + '955b4dd1be03261bd76f807a7efd432435c417362811b8a50c564e7ee9585e1ac7626dde2fdc030f876196ea267f08c3'), + _Sha3Vector( + 'SHA3-384', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + '1881de2ca7e41ef95dc4732b8f5f002b189cc1e42b74168ed1732649ce1dbcdd76197a31fd55ee989f2d7050dd473e8f'), + _Sha3Vector( + 'SHA3-384', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + 'a31fdbd8d576551c21fb1191b54bda65b6c5fe97f0f4a69103424b43f7fdb835979fdbeae8b3fe16cb82e587381eb624'), + _Sha3Vector( + 'SHA3-384', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + '3485d3b280bd384cf4a777844e94678173055d1cbc40c7c2c3833d9ef12345172d6fcd31923bb8795ac81847d3d8855c'), + _Sha3Vector('SHA3-512', 0, '', + 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'), + _Sha3Vector('SHA3-512', 5, '13', + 'a13e01494114c09800622a70288c432121ce70039d753cadd2e006e4d961cb27544c1481e5814bdceb53be6733d5e099795e5e81918addb058e22a9f24883f37'), + _Sha3Vector('SHA3-512', 30, '53587b19', + '9834c05a11e1c5d3da9c740e1c106d9e590a0e530b6f6aaa7830525d075ca5db1bd8a6aa981a28613ac334934a01823cd45f45e49b6d7e6917f2f16778067bab'), + _Sha3Vector( + 'SHA3-512', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + 'e76dfad22084a8b1467fcf2ffa58361bec7628edf5f3fdc0e4805dc48caeeca81b7c13c30adf52a3659584739a2df46be589c51ca1a4a8416df6545a1ce8ba00'), + _Sha3Vector( + 'SHA3-512', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + 'fc4a167ccb31a937d698fde82b04348c9539b28f0c9d3b4505709c03812350e4990e9622974f6e575c47861c0d2e638ccfc2023c365bb60a93f528550698786b'), + _Sha3Vector( + 'SHA3-512', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + 'cf9a30ac1f1f6ac0916f9fef1919c595debe2ee80c85421210fdf05f1c6af73aa9cac881d0f91db6d034a2bbadc1cf7fbcb2ecfa9d191d3a5016fb3fad8709c9') + ]; + + group('SHA-3', () { + for (var vector in vectors) { + test(vector.algo, () { + var partialBits = vector.bits % 8; + var bitLen = algoToSize[vector.algo]; + var digest = SHA3Digest(bitLen); + Uint8List out; + + if (partialBits == 0) { + digest.update(vector.msg!, 0, vector.msg!.length); + out = Uint8List(digest.digestSize); + digest.doFinal(out, 0); + expect(vector.digest, out); + + // + // Vandalise message, if zero len message skip. + // + if (vector.msg!.isNotEmpty) { + var vandalized = Uint8List.fromList(vector.msg!); + vandalized[0] ^= 1; + + digest.update(vandalized, 0, vector.msg!.length); + out = Uint8List(digest.digestSize); + digest.doFinal(out, 0); + expect(vector.digest, isNot(out), + reason: 'vandalized must not be equal'); + } + } else { + // + // When this is added implement the test here. + // + + Skip('No support for partials: ${vector.algo}'); + } + }); + } + }); +} + +void testSHA3SizeEnforcement() { + group('SHA-3 Tests', () { + test('enforcement of valid SHA-3 sizes', () { + SHA3Digest(224); + SHA3Digest(256); + SHA3Digest(384); + SHA3Digest(512); + + var bitLen = 123; + try { + SHA3Digest(bitLen); + fail('Invalid sha3 bitlen accepted'); + } on StateError catch (se) { + expect(se.message, + 'invalid bitLength ($bitLen) for SHA-3 must only be 224,256,384,512'); + } + }); + }); +} diff --git a/pointycastle/test/digests/sha512_test.dart b/pointycastle/test/digests/sha512_test.dart new file mode 100644 index 0000000..aa162bf --- /dev/null +++ b/pointycastle/test/digests/sha512_test.dart @@ -0,0 +1,16 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-512'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '7a61cb16b6c459d0894ba7ce01a50a43036da9f77e9a27c2e17d563c7eca877fa9e1d91968f5c61552a62f72deb07c5f6c00f8f43d0c3dccd46dfcc248b29b0e', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'f221fdceac5a63b712f303b444cf8aeacdc5a58835c340469772075430ddc43d983891458e543b0abd8c4acb71d69a808e292a86eaef1c1b1ddc83a567d8a346', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '04e576a2c557a86d7ee178d4fe8adde77ab9c9b0ce8f3a5c51818f6e52b0a79fc79131ba7fda51a26c9ed6533a6954fc46ad31f90dce9c7c9671c47426296d7e', + ]); +} diff --git a/pointycastle/test/digests/sha512t_test.dart b/pointycastle/test/digests/sha512t_test.dart new file mode 100644 index 0000000..d2a4570 --- /dev/null +++ b/pointycastle/test/digests/sha512t_test.dart @@ -0,0 +1,32 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('SHA-512/224'), [ + '', + '6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4', + 'abc', + '4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa', + 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', + '23fec5bb94d60b23308192640b0c453335d664734fe40e7268674af9', + ]); + + runDigestTests(Digest('SHA-512/256'), [ + '', + 'c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a', + 'abc', + '53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23', + 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', + '3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a', + ]); + + runDigestTests(Digest('SHA-512/488'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '77c5a401110133e531d1acf33ea6010d8d8149f9804310b6d32a69033aee079e88603166478069b1d4622030a508930a062199150f66462e26063266e5', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '149a6a1e7f9741b56186b01c9195e1c5a003197ff559604653ea176c6d6e75c7cd117d3105cf10bc8d1f24e46c98c5a8b2fa2e53c16e95ada867b20ea1', + ]); +} diff --git a/pointycastle/test/digests/shake_test.dart b/pointycastle/test/digests/shake_test.dart new file mode 100644 index 0000000..2d0ac2c --- /dev/null +++ b/pointycastle/test/digests/shake_test.dart @@ -0,0 +1,130 @@ +// This file has been migrated. + +import 'dart:typed_data'; + +import 'package:pointycastle/digests/shake.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + testAgainstCAVPVectors(); + testSHAKESizeEnforcement(); +} + +class _SHAKEVector { + _SHAKEVector(this.label, this.algo, this.bits, String msg, String digest) { + this.msg = createUint8ListFromHexString(msg); + this.digest = createUint8ListFromHexString(digest); + } + + String label; + String algo; + int bits; + Uint8List? msg; + Uint8List? digest; +} + +void testAgainstCAVPVectors() { + var vectors = [ + _SHAKEVector('1', 'SHAKE-128', 0, '', + '7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef263cb1eea988004b93103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc873c23dc62b8d260169afa2f75ab916a58d974918835d25e6a435085b2badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea17cda7cfad765f5623474d368ccca8af0007cd9f5e4c849f167a580b14aabdefaee7eef47cb0fca9767be1fda69419dfb927e9df07348b196691abaeb580b32def58538b8d23f87732ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c922a96188d032675c8ac850933c7aff1533b94c834adbb69c6115bad4692d8619f90b0cdf8a7b9c264029ac185b70b83f2801f2f4b3f70c593ea3aeeb613a7f1b1de33fd75081f592305f2e4526edc09631b10958f464d889f31ba010250fda7f1368ec2967fc84ef2ae9aff268e0b1700affc6820b523a3d917135f2dff2ee06bfe72b3124721d4a26c04e53a75e30e73a7a9c4a95d91c55d495e9f51dd0b5e9d83c6d5e8ce803aa62b8d654db53d09b8dcff273cdfeb573fad8bcd45578bec2e770d01efde86e721a3f7c6cce275dabe6e2143f1af18da7efddc4c7b70b5e345db93cc936bea323491ccb38a388f546a9ff00dd4e1300b9b2153d2041d205b443e41b45a653f2a5c4492c1add544512dda2529833462b71a41a45be97290b6f'), + _SHAKEVector('2', 'SHAKE-128', 5, '13', + '2e0abfba83e6720bfbc225ff6b7ab9ffce58ba027ee3d898764fef287ddeccca3e6e5998411e7ddb32f67538f500b18c8c97c452c370ea2cf0afca3e05de7e4de27fa441a9cb34fd17c978b42d5b7e7f9ab18ffeffc3c5ac2f3a455eebfdc76ceaeb0a2cca22eef6e637f4cabe5c51ded2e3fad8b95270a321845664f107d16496bb7abfbe7504b6ede2e89e4b996fb58efdc4181f9163381cbe7bc006a7a205989c526cd1bd68983693b4bdc53728b241c1cff42bb611502c35205cabb288755655d620c67994f06451187f6fd17e046682ba1286063ff88fe2508d1fcaf9035a1231ad4150a9c9b24c9b2d66b2ad1bde0bd0bbcb8be05b835229ef7919737323424401e1d837b66eb4e630ff1de70cb317c2bacb08001d3477b7a70a576d20869033589d85a01ddb2b6646c043b59fc011311da666fa5ad1d6387fa9bc4015a38a51d1da1ea61d648dc8e39a88b9d622bde207fdabc6f2827a880c330bbf6df733774b653e57305d78dce112f10a2c71f4cdad92ed113e1cea63b91925ed28191e6dbbb5aa5a2afda51fc05a3af5258b87665243550f28948ae2b8beb6bc9c770b35f067eaa641efe65b1a44909d1b149f97eea601391c609ec81d1930f57c18a4e0fab491d1cadfd50483449edc0f07ffb24d2c6f9a9a3bff39ae3d57f560654d7d75c908abe62564753eac39d7503da6d37c2e32e1af3b8aec8ae3069cd9'), + _SHAKEVector('3', 'SHAKE-128', 30, '53587b19', + '6d5d39c55f3cca567feaf422dc64ba17401d07756d78b0fa3d546d66afc27671e0010685fc69a7ec3c5367b8fa5fda39d57ce53f153fa4031d277206770aec6b2ddf16aefab669110d6e4a296a14fb1486b0846b690543e4057f7f42aa8c0e6a5a56b60b688d55a196df6f3976e30688cbb6afd48525d76490357f3fd897bafc8736d907b9bac816591fc24e79360be3a7ffa62982c45abb0e584c07ec93a19530509d9f816215d7277bb999437c821450f0759281cd8e16a3483e3cc752091b7aae92909d2f501ef7dce989759891b3377ceab493ffe496010a0c7e51959994f56f565e633af6093ac6e1e0f0048871ec4778f48ef8bd5bcb80ea7df9ff4711c81e24c0221c2ad9744fba7935eaeca114224fd108efc5ac74c66252089275b4277673708c4af92f8813b193599fd64bd7484f2e5ec369e3646499768e581dd053aa4814d8bf1acff5fd774519a749be66754741ebc5362212a9fea8a814e9e010bc2720b3b7d94fab74bc7f923e1072b8a5dddda83ba0157d8cba55c192df6965cb7dba46a3340df8c3fa89c7c4db539d38dc406f1d2cf54e5905580b4404bfd7b3719561c5a59d5dfdb1bf93df13825225edcce0fa7d87efcd239feb49fc9e2de9d828feeb1f2cf579b95dd050ab2ca47105a8d30f3fd2a1154c15f87fb37b2c7156bd7f3cf2b745c912a40bc1b559b656e3e903cc5733e86ba15dfef70678'), + _SHAKEVector( + '4', + 'SHAKE-128', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + '131ab8d2b594946b9c81333f9bb6e0ce75c3b93104fa3469d3917457385da037cf232ef7164a6d1eb448c8908186ad852d3f85a5cf28da1ab6fe3438171978467f1c05d58c7ef38c284c41f6c2221a76f12ab1c04082660250802294fb87180213fdef5b0ecb7df50ca1f8555be14d32e10f6edcde892c09424b29f597afc270c904556bfcb47a7d40778d390923642b3cbd0579e60908d5a000c1d08b98ef933f806445bf87f8b009ba9e94f7266122ed7ac24e5e266c42a82fa1bbefb7b8db0066e16a85e0493f07df4809aec084a593748ac3dde5a6d7aae1e8b6e5352b2d71efbb47d4caeed5e6d633805d2d323e6fd81b4684b93a2677d45e7421c2c6aea259b855a698fd7d13477a1fe53e5a4a6197dbec5ce95f505b520bcd9570c4a8265a7e01f89c0c002c59bfec6cd4a5c109258953ee5ee70cd577ee217af21fa70178f0946c9bf6ca8751793479f6b537737e40b6ed28511d8a2d7e73eb75f8daac912ff906e0ab955b083bac45a8e5e9b744c8506f37e9b4e749a184b30f43eb188d855f1b70d71ff3e50c537ac1b0f8974f0fe1a6ad295ba42f6aec74d123a7abedde6e2c0711cab36be5acb1a5a11a4b1db08ba6982efccd716929a7741cfc63aa4435e0b69a9063e880795c3dc5ef3272e11c497a91acf699fefee206227a44c9fb359fd56ac0a9a75a743cff6862f17d7259ab075216c0699511643b6439'), + _SHAKEVector( + '5', + 'SHAKE-128', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + '4ac38ebd1678b4a452792c5673f9777d36b55451aaae2424924942d318a2f6f51bbc837dcc7022c5403b69d29ac99a745f06d06f2a41b0cc243cd270fa44d43065af00d2ad358bd5a5d06d331bc230cd8dda4655628f9102711adafb7636c160b2d25ec6235a2fe0f37394d87fc5ffd7dbf1993e558aebea6c61e907188c61f5fcde278e264f958ffd7b3382dc10139b625e1241ab5bbc2a1fbcac31a335cfc7b20e427712246cbb55232259a7ef1602bd56f6567d66942d4a7149f4222210b074ea54154b38e8fdfa0dcf4fa3ecd2154e8318a6578b535dbcfc217a3cab52532965846f89781457025563e2dc15cc3af902ba2ad280ffbbbfa4c52b60fa41bac21f4ab23536268119fc98cd982da5cd5da21e1b5692d47105de9f1e0132c6fe315d67fa464997c2ab5533c79f98e6e64ff80802a7fe96ca04a81f885527370a2206b10b3936dd81b8246353f4cd90511089268d744f210ac689d49d2875054a727b604d13d269b37190d427c7d15cccdcd7870e0b8adbeb977111a9bcf7781a161356a5941c799907ef9d3b1a441f09515f2831c4fafde3dc7c1e9b5aa57d3e83cd6734da3d8b9ef3fc448805ea29c99cba6b352bcabe2fd970ae9580d2bf25152b960e6b806d87d7d0608b247f61089e298692c27f19c52d03ebe395a36806ad540bec2d046c18e355faf8313d2ef8995ee6aae42568f314933e3a21e5be40'), + _SHAKEVector( + '6', + 'SHAKE-128', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + '89846dc776ac0f014572ea79f560773451002938248e6882569ac32aeab191fcacde68eb07557539c4845fb444108e6e0545e731fcca2d4f67a3bfd41cff3eaf35eefb53441177965bb516950cf5dcb2aafcbbc6300e8eefd9bcd0e5f32d1a4e872e0f1dbd8f8e00cbb878698c5883e3ca184b9490389e46002c08a0b16b05a36b2cb5a1cae08e11ad972fd24af70101ce4746c84f1671877f0df6c415d1670ff40b8ddedd89cc3e656db9058049d609b6784cc9d05e60cc6ac9c8194993ba29158fd4db8cf225e9574f18a77f66ec1052bf17993bda206a17737d785bd4c18cee4c76aa5735a5223f3c55e79daec13d4bf60f1562e0ad0fa3b558eccfa8ab3eef61474d576e8caf4c11e4de5ccb36d7df7d892c1fca2017be8bbda5a47195448cc67a078e628a2ef763ffe1dc9d9d6ff78e68961c33ffd9000c11dee7f7408d8da5c605b0b4d56bb55e9364c77bfad9c8191ed6e1fe7b7a937c6d07095fe5ea91a700b4bdfc17b428d036922aa8ab5e2cd585846fb81fc693b8d59bf85c74bc700cd2bc3e6aab437d93d8a30f1cf692efef43602028e0ce5742eb3f4f4d5b029158dd6896acb5e3a7f684d9aa8914e70974b223a6fec38d76c7473e86e4b9b32c621e2015c55e947dd016c675c82368ce26fb456a5b65881af513bfdc88687c6381676abbd2d9104ed23a9e89310246b026cedd57595b1ab6fe88a784be0c06'), + _SHAKEVector('7', 'SHAKE-256', 0, '', + '46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a'), + _SHAKEVector('8', 'SHAKE-256', 5, '13', + '48a5c11abaeeff092f3646ef0d6b3d3ff76c2f55f9c732ac6470c03764008212e21b1467778b181989f88858211b45df8799cf961f800dfac99e644039e2979a4016f5456ff421c5b385da2b855da7e31c8c2e8e4ba41eb4095cb999d9759cb40358da8562a2e61349e05a2e13f1b74ec9e69f5b426dc74138ffcdc571c32b39b9f55563e1a99dc422c306026d6a0f9de85162b386794ca0688b764b3d32200cc459749732a0f3a341c0efc96a22c63bad7d96cc9ba4768c6fcfa1f200107cf9fae5c0d754958c5a756b376a3be69f88074f200e9e95a8ca5bcf969998db1dc37d0d3d916f6caab3f03782c9c44a2e14e80786bece4587b9ef82cbf454e0e34bd175ae57d36af4e726b221332ced36c8ce2e06203c656ae8da037d08e7160b480c1a8516bf06dd97bf4aa4c0249310dc0b065dc639576355384d165c6a509b12f7bbd1e15b22bce02fa048ddfaacf7415f49b6324c1d067b5264e1125f7f75427f312bd9346eb4e400b1f7cb31288c9e3f735eca9ced0db888e2e2f402243bd64618a23e10f9c229397440542d0ab1b2e10dacc5c95e597f2c7ea38438105f97803dbb03fcc0fd416b0905a41d184deb238905775891f93501fb4176a3bd6c464461d36ee8b008aabd9e26a34055e80c8c813eeba07f728ab32b15605ad161a0669f6fce5c5509fbb6afd24aeacc5fa4a51523e6b173246ed4bfa521d74fc6bb'), + _SHAKEVector('9', 'SHAKE-256', 30, '53587b19', + '465d081dff875e396200e4481a3e9dcd88d079aa6d66226cb6ba454107cb81a7841ab02960de279ccbe34b42c36585ad86964db0db52b6e7b4369ece8f7248589ba78ab1828ffc335cb12397119bfd2b87eb7898aeb956b6f23ddf0bd4004386a8e526554ef4e483facee30dd32e204fff8c36bbd602a576d139089c75a8050266fcbf721e4443de4645832922eb8aae39d1f572845364817b0033543899940023f2e965a60a80eb221eb19dc57b121291564c6f693583b3ac7c6f272f4f67a19a7678d4234b0bf4a2ebc08aa235b9788db787161f6617022865c0ef9aa533802d136cdbc7aeba532acf1be183b0295ab0e33a2ef69be356daaf309687153e2f99a1243609d603126a8c823e8843e459bfc72b30691cdcc3ddb27cf028afd51e4437ee3b71c0c1ec87a93436f0c247b7e8c50ce96825c97029997a74c318afacaa18a0180bc7f2f0f1c5e7ef1a2d183ac7ee7e4915c3b68c30978ab6c428193441df4705b722ce25a08a1fadca0eef1fafe83adf13021d520de5c827ff9a97b75546193a9b923f0590385dc4bff7c49d4915b5a365db4c84ddcb185de8f9eeb334965a42f1381c8badc22ba1f8ee4c0e4daaf7a88e7f42ddb8148f3bf8d3b8d74f098155a37cb4cb27876b85da602e5c789c10e03be73407bab8c49213f8c74e1266ce9b11286e674ca9c10c9c9955049a66e9051d9a2b1fc9afe26798e9cec6'), + _SHAKEVector( + '10', + 'SHAKE-256', + 1600, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3', + 'cd8a920ed141aa0407a22d59288652e9d9f1a7ee0c1e7c1ca699424da84a904d2d700caae7396ece96604440577da4f3aa22aeb8857f961c4cd8e06f0ae6610b1048a7f64e1074cd629e85ad7566048efc4fb500b486a3309a8f26724c0ed628001a1099422468de726f1061d99eb9e93604d5aa7467d4b1bd6484582a384317d7f47d750b8f5499512bb85a226c4243556e696f6bd072c5aa2d9b69730244b56853d16970ad817e213e470618178001c9fb56c54fefa5fee67d2da524bb3b0b61ef0e9114a92cdbb6cccb98615cfe76e3510dd88d1cc28ff99287512f24bfafa1a76877b6f37198e3a641c68a7c42d45fa7acc10dae5f3cefb7b735f12d4e589f7a456e78c0f5e4c4471fffa5e4fa0514ae974d8c2648513b5db494cea847156d277ad0e141c24c7839064cd08851bc2e7ca109fd4e251c35bb0a04fb05b364ff8c4d8b59bc303e25328c09a882e952518e1a8ae0ff265d61c465896973d7490499dc639fb8502b39456791b1b6ec5bcc5d9ac36a6df622a070d43fed781f5f149f7b62675e7d1a4d6dec48c1c7164586eae06a51208c0b791244d307726505c3ad4b26b6822377257aa152037560a739714a3ca79bd605547c9b78dd1f596f2d4f1791bc689a0e9b799a37339c04275733740143ef5d2b58b96a363d4e08076a1a9d7846436e4dca5728b6f760eef0ca92bf0be5615e96959d767197a0beeb'), + _SHAKEVector( + '11', + 'SHAKE-256', + 1605, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a303', + '98d093b067475760124ffb9204a5b327c6bb05c54ff234f0b43fac7240415166a8c705ea0d739f0808b06576d996662c1f376694d98f515719b66407720dcf781c51cd56ef8b610c668ddc1ac1c2c429ea4d6f274aa7a773bf8b0cab306f1eee2a171b91334ea0facd2aac1f51d4d5eb0e63a4e6754ecafeec246b7aaf58d0e0a974c7ff4058bdbdedb33ed04b0fa45d70c7c84f3da13e4f7d1beddb534d37e5abdfb29f2b44c4fb0d6ccab831d90ba46a00530662f907dedd479e9b5428e5e2db8040b0e2b1f174ce347f32a06a5ac22b19aafe927b8878d0c8103a4d2f19e32336c64cfadc1b9acb3978a8298571dcd89c36a65692816d0c61ce0ed17942367017bd40f59dfbae34635827920afe7a27bf567009a138403f06b6e4de94da077db49773c235466119426f79888d3a81b407dfeba87e01cd48f90e01b6f90243c40125de47e8c8f3e6ea3388cbfeeb36541ef23d2c8348458ea28caa5066f4983776f0cb2fdc66049cf88ac8eae51212aace867bea4c3caee44f147a9bf99d04874e8722d03d3f5ff6ef3bebe7642fe4916c5f10ff3fd61387d5d91bcd32f9e8e4593dcaad23eccc05d2fc9be2c1cd630ea123dca9cb6938d60cddedc11e1e9bc9d268a5456ba9ccff18597c5ff9735708413b9d84b9f4721937cc6595712797532b48d6f1a2d1723b07d5460bc13916d96e88180713ac33d2c232e35e764e04'), + _SHAKEVector( + '12', + 'SHAKE-256', + 1630, + 'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a323', + '8a8325079b0fc3265d52f59855cafe655df438aa639f6fec991f2494330ce32fa37f7db90f6966d8e4a46e50c5ede57b9b8f082a96627f730475029a619229d84f432ed69fd059234d4d7dd358e8393f6a36a45ccf041f90fc0a4e5802d73063d36531336a0090ecfe1a4d4d29aa824ba42b4937b4bb98f4f33a0e3bd8b511e69528d59537110d7521fb78aca018df76160f54a3421b84149264ed032f6dce467a731a8e34048e3a46e98039df3c328debfbe5d1bc8be7ff4ef8917b01f0b7893672492d6ee5c71df2d0531f8b684764ba0a2b57ec6a4f60ba4f36fe2db0e65ad7aa5f14f3ef9f34a0ab5bc33d488733ba36bf4b2b4fce028eff8c6ce03b192cf075cc9f00d29c0e06c35c4489d27f07fa49a91ca92471e34dab7787ae24a6e0f309ef0ba53f7c8b2992520a07bedd509a0b6dbea570a5960ed624826dd8ecd1915c87327e74491c405a7411c12c0d4497512689bd7f5adbedb02c6d2e68474e8bf31b884040818f4bca03a45217eac7083ad3a33cb8477a04c9e3266a133477de45e71830a40eb0d075afccfcd9dc548d0d529460ea7ac2adac722e7678ef597dd3b495bd7d1a8ff39448bbab1dc6a88481801cf5a8010e873c31e479a5e3db3d4e67d1d948e67cc66fd75a4a19c120662ef55977bddbac0721c80d69902693c83d5ef7bc27efa393af4c439fc39958e0e75537358802ef0853b7470b0f19ac') + ]; + + group('SHAKE', () { + for (var vector in vectors) { + late SHAKEDigest dig; + switch (vector.algo) { + case 'SHAKE-128': + dig = SHAKEDigest(128); + break; + case 'SHAKE-256': + dig = SHAKEDigest(256); + break; + default: + fail('Unknown: ${vector.algo}'); + } + + test('${vector.algo}, label = ${vector.label} ', () { + var result = Uint8List(vector.digest!.length); + + var partialBits = vector.bits % 8; + + if (partialBits == 0) { + dig.update(vector.msg!, 0, vector.msg!.length); + dig.doFinalRange(result, 0, result.length); + } else { + dig.update(vector.msg!, 0, vector.msg!.length - 1); + dig.doFinalPartial(result, 0, result.length, + vector.msg![vector.msg!.length - 1], partialBits); + } + + expect(vector.digest, equals(result)); + }); + } + }); +} + +void testSHAKESizeEnforcement() { + group('SHAKE Tests', () { + test('enforcement of valid SHAKE sizes', () { + SHAKEDigest(128); + SHAKEDigest(256); + + var bitLen = 123; + try { + SHAKEDigest(bitLen); + fail('Invalid SHAKE bitlen accepted'); + } on StateError catch (se) { + expect(se.message, + 'invalid bitLength ($bitLen) for SHAKE must only be 128 or 256'); + } + }); + }); +} diff --git a/pointycastle/test/digests/sm3_test.dart b/pointycastle/test/digests/sm3_test.dart new file mode 100644 index 0000000..fa533e4 --- /dev/null +++ b/pointycastle/test/digests/sm3_test.dart @@ -0,0 +1,54 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/runners/digest.dart'; +import '../test/src/helpers.dart'; + +void main() { + runDigestTests(Digest('SM3'), [ + // Example 1, From GB/T 32905-2016 + 'abc', + '66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0', + // Example 2, From GB/T 32905-2016 + 'abcd' * 16, + 'debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732', + ]); + + group('optional SM3 tests', () { + test('64K Digest', () { + var dig = Digest('SM3'); + + for (var i = 0; i < 65536; i++) { + dig.updateByte(i); + } + + var out = Uint8List(dig.digestSize); + dig.doFinal(out, 0); + + expect( + createUint8ListFromHexString( + '97049bdc8f0736bc7300eafa9980aeb9cf00f24f7ec3a8f1f8884954d7655c1d'), + equals(out)); + }); + + test("10^6 'a' Test", () { + var dig = Digest('SM3'); + + for (var i = 0; i < 1000000; i++) { + dig.updateByte(97); + } + + var out = Uint8List(dig.digestSize); + dig.doFinal(out, 0); + + expect( + createUint8ListFromHexString( + 'c8aaf89429554029e231941a2acc0ad61ff2a5acd8fadd25847a3a732b3b02c3'), + equals(out)); + }); + }); +} diff --git a/pointycastle/test/digests/tiger_test.dart b/pointycastle/test/digests/tiger_test.dart new file mode 100644 index 0000000..076efdd --- /dev/null +++ b/pointycastle/test/digests/tiger_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('Tiger'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + 'c9a8c5f0ce21cd25d1158c7b9b9ef043437ef0e2bce65cca', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '8edc9820300d6453f6784523bbf32d9e44ce20fbec7b07f8', + ]); +} diff --git a/pointycastle/test/digests/whirlpool_test.dart b/pointycastle/test/digests/whirlpool_test.dart new file mode 100644 index 0000000..b06e7ff --- /dev/null +++ b/pointycastle/test/digests/whirlpool_test.dart @@ -0,0 +1,14 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/digest.dart'; + +void main() { + runDigestTests(Digest('Whirlpool'), [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '3238fa7959052ebcd091894cb303743f910068300b3ee13391a15b3c1648ddc38b84df1864b90ff8e00d6b900b9aab503db1bff57c1e23e365665396db378db1', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'dda630ae2b2ab1a0b29f587ec612230749833b5954ca164b99d72634cbad854efffc2d3ae06f5edeba0297df46431eeab573059e108257b01f6fc1350e7e6665', + ]); +} diff --git a/pointycastle/test/ecc/curves_test.dart b/pointycastle/test/ecc/curves_test.dart new file mode 100644 index 0000000..6ceac2b --- /dev/null +++ b/pointycastle/test/ecc/curves_test.dart @@ -0,0 +1,54 @@ +import 'package:test/test.dart'; +import 'package:pointycastle/export.dart'; + +void main() { + group('ECCurve tests', () { + test('ECCurve constructors', () { + ECCurve_brainpoolp160r1(); + ECCurve_brainpoolp160t1(); + ECCurve_brainpoolp192r1(); + ECCurve_brainpoolp192t1(); + ECCurve_brainpoolp224r1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + ECCurve_brainpoolp224t1(); + + ECCurve_gostr3410_2001_cryptopro_a(); + ECCurve_gostr3410_2001_cryptopro_b(); + ECCurve_gostr3410_2001_cryptopro_c(); + ECCurve_gostr3410_2001_cryptopro_xcha(); + ECCurve_gostr3410_2001_cryptopro_xchb(); + + ECCurve_prime192v1(); + ECCurve_prime192v2(); + ECCurve_prime192v3(); + ECCurve_prime239v1(); + ECCurve_prime239v2(); + ECCurve_prime239v3(); + ECCurve_prime256v1(); + + ECCurve_secp112r1(); + ECCurve_secp112r2(); + ECCurve_secp128r1(); + ECCurve_secp128r2(); + ECCurve_secp160k1(); + ECCurve_secp160r1(); + ECCurve_secp160r2(); + ECCurve_secp192k1(); + ECCurve_secp192r1(); + ECCurve_secp224k1(); + ECCurve_secp224r1(); + ECCurve_secp256k1(); + ECCurve_secp256r1(); + ECCurve_secp384r1(); + ECCurve_secp521r1(); + }); + }); +} diff --git a/pointycastle/test/ecc/ecdh_test.dart b/pointycastle/test/ecc/ecdh_test.dart new file mode 100644 index 0000000..8eaff46 --- /dev/null +++ b/pointycastle/test/ecc/ecdh_test.dart @@ -0,0 +1,338 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +class ECDHTestvector { + final int index; + late final ECPrivateKey privateKey; + late final ECPublicKey publicKey; + late final BigInt Z; + + ECDHTestvector(this.index, String a, String bx, String by, String z, + ECDomainParameters ecDomainParameters) { + final curve = ecDomainParameters.curve; + privateKey = ECPrivateKey(BigInt.parse(a, radix: 16), ecDomainParameters); + publicKey = ECPublicKey( + curve.createPoint( + BigInt.parse(bx, radix: 16), BigInt.parse(by, radix: 16)), + ecDomainParameters); + Z = BigInt.parse(z, radix: 16); + } +} + +class P256Testvector extends ECDHTestvector { + P256Testvector(int index, String a, String bx, String by, String z) + : super(index, a, bx, by, z, ECDomainParameters('secp256r1')); +} + +class BrainpoolP256r1TestVector extends ECDHTestvector { + BrainpoolP256r1TestVector(int index, String a, String bx, String by, String z) + : super(index, a, bx, by, z, ECDomainParameters('brainpoolp256r1')); +} + +// From http://csrc.nist.gov/groups/STM/cavp/documents/components/ecccdhtestvectors.zip +final testVectors = [ + P256Testvector( + 1, + '07d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534', + '700C48F77F56584C5CC632CA65640DB91B6BACCE3A4DF6B42CE7CC838833D287', + 'DB71E509E3FD9B060DDB20BA5C51DCC5948D46FBF640DFE0441782CAB85FA4AC', + '46FC62106420FF012E54A434FBDD2D25CCC5852060561E68040DD7778997BD7B'), + P256Testvector( + 2, + '38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5', + '809F04289C64348C01515EB03D5CE7AC1A8CB9498F5CAA50197E58D43A86A7AE', + 'B29D84E811197F25EBA8F5194092CB6FF440E26D4421011372461F579271CDA3', + '057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67'), + P256Testvector( + 3, + '1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8', + 'A2339C12D4A03C33546DE533268B4AD667DEBF458B464D77443636440EE7FEC3', + 'EF48A3AB26E20220BCDA2C1851076839DAE88EAE962869A497BF73CB66FAF536', + '2D457B78B4614132477618A5B077965EC90730A8C81A1C75D6D4EC68005D67EC'), + P256Testvector( + 4, + '207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d', + 'DF3989B9FA55495719B3CF46DCCD28B5153F7808191DD518EFF0C3CFF2B705ED', + '422294FF46003429D739A33206C8752552C8BA54A270DEFC06E221E0FEAF6AC4', + '96441259534B80F6AEE3D287A6BB17B5094DD4277D9E294F8FE73E48BF2A0024'), + P256Testvector( + 5, + '59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf', + '41192D2813E79561E6A1D6F53C8BC1A433A199C835E141B05A74A97B0FAEB922', + '1AF98CC45E98A7E041B01CF35F462B7562281351C8EBF3FFA02E33A0722A1328', + '19D44C8D63E8E8DD12C22A87B8CD4ECE27ACDDE04DBF47F7F27537A6999A8E62'), + P256Testvector( + 6, + 'f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef', + '33E82092A0F1FB38F5649D5867FBA28B503172B7035574BF8E5B7100A3052792', + 'F2CF6B601E0A05945E335550BF648D782F46186C772C0F20D3CD0D6B8CA14B2F', + '664E45D5BBA4AC931CD65D52017E4BE9B19A515F669BEA4703542A2C525CD3D3'), + P256Testvector( + 7, + '3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190', + '6A9E0C3F916E4E315C91147BE571686D90464E8BF981D34A90B6353BCA6EEBA7', + '40F9BEAD39C2F2BCC2602F75B8A73EC7BDFFCBCEAD159D0174C6C4D3C5357F05', + 'CA342DAA50DC09D61BE7C196C85E60A80C5CB04931746820BE548CDDE055679D'), + P256Testvector( + 8, + 'd8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8', + 'A9C0ACADE55C2A73EAD1A86FB0A9713223C82475791CD0E210B046412CE224BB', + 'F6DE0AFA20E93E078467C053D241903EDAD734C6B403BA758C2B5FF04C9D4229', + '35AA9B52536A461BFDE4E85FC756BE928C7DE97923F0416C7A3AC8F88B3D4489'), + P256Testvector( + 9, + '0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d', + '94E94F16A98255FFF2B9AC0C9598AAC35487B3232D3231BD93B7DB7DF36F9EB9', + 'D8049A43579CFA90B8093A94416CBEFBF93386F15B3F6E190B6E3455FEDFE69A', + '605C16178A9BC875DCBFF54D63FE00DF699C03E8A888E9E94DFBAB90B25F39B4'), + P256Testvector( + 10, + '2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08', + 'E099BF2A4D557460B5544430BBF6DA11004D127CB5D67F64AB07C94FCDF5274F', + 'D9C50DBE70D714EDB5E221F4E020610EEB6270517E688CA64FB0E98C7EF8C1C5', + 'F96E40A1B72840854BB62BC13C40CC2795E373D4E715980B261476835A092E0B'), + P256Testvector( + 11, + '77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848', + 'F75A5FE56BDA34F3C1396296626EF012DC07E4825838778A645C8248CFF01658', + '33BBDF1B1772D8059DF568B061F3F1122F28A8D819167C97BE448E3DC3FB0C3C', + '8388FA79C4BABDCA02A8E8A34F9E43554976E420A4AD273C81B26E4228E9D3A3'), + P256Testvector( + 12, + '42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e', + '2DB4540D50230756158ABF61D9835712B6486C74312183CCEFCAEF2797B7674D', + '62F57F314E3F3495DC4E099012F5E0BA71770F9660A1EADA54104CDFDE77243E', + '72877CEA33CCC4715038D4BCBDFE0E43F42A9E2C0C3B017FC2370F4B9ACBDA4A'), + P256Testvector( + 13, + 'ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b', + 'CD94FC9497E8990750309E9A8534FD114B0A6E54DA89C4796101897041D14ECB', + 'C3DEF4B5FE04FAEE0A11932229FFF563637BFDEE0E79C6DEEAF449F85401C5C4', + 'E4E7408D85FF0E0E9C838003F28CDBD5247CDCE31F32F62494B70E5F1BC36307'), + P256Testvector( + 14, + '43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604', + '15B9E467AF4D290C417402E040426FE4CF236BAE72BAA392ED89780DFCCDB471', + 'CDF4E9170FB904302B8FD93A820BA8CC7ED4EFD3A6F2D6B05B80B2FF2AEE4E77', + 'ED56BCF695B734142C24ECB1FC1BB64D08F175EB243A31F37B3D9BB4407F3B96'), + P256Testvector( + 15, + 'b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903', + '49C503BA6C4FA605182E186B5E81113F075BC11DCFD51C932FB21E951EEE2FA1', + '8AF706FF0922D87B3F0C5E4E31D8B259AEB260A9269643ED520A13BB25DA5924', + 'BC5C7055089FC9D6C89F83C1EA1ADA879D9934B2EA28FCF4E4A7E984B28AD2CF'), + P256Testvector( + 16, + '4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8', + '19B38DE39FDD2F70F7091631A4F75D1993740BA9429162C2A45312401636B29C', + '09AED7232B28E060941741B6828BCDFA2BC49CC844F3773611504F82A390A5AE', + '9A4E8E657F6B0E097F47954A63C75D74FCBA71A30D83651E3E5A91AA7CCD8343'), + P256Testvector( + 17, + '4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147', + '2C91C61F33ADFE9311C942FDBFF6BA47020FEFF416B7BB63CEC13FAF9B099954', + '6CAB31B06419E5221FCA014FB84EC870622A1B12BAB5AE43682AA7EA73EA08D0', + '3CA1FC7AD858FB1A6ABA232542F3E2A749FFC7203A2374A3F3D3267F1FC97B78'), + P256Testvector( + 18, + '1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e', + 'A28A2EDF58025668F724AAF83A50956B7AC1CFBBFF79B08C3BF87DFD2828D767', + 'DFA7BFFFD4C766B86ABEAF5C99B6E50CB9CCC9D9D00B7FFC7804B0491B67BC03', + '1AAABE7EE6E4A6FA732291202433A237DF1B49BC53866BFBE00DB96A0F58224F'), + P256Testvector( + 19, + 'dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3', + 'A2EF857A081F9D6EB206A81C4CF78A802BDF598AE380C8886ECD85FDC1ED7644', + '563C4C20419F07BC17D0539FADE1855E34839515B892C0F5D26561F97FA04D1A', + '430E6A4FBA4449D700D2733E557F66A3BF3D50517C1271B1DDAE1161B7AC798C'), + P256Testvector( + 20, + '5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76', + 'CCD8A2D86BC92F2E01BCE4D6922CF7FE1626AED044685E95E2EEBD464505F01F', + 'E9DDD583A9635A667777D5B8A8F31B0F79EBA12C75023410B54B8567DDDC0F38', + '1CE9E6740529499F98D1F1D71329147A33DF1D05E4765B539B11CF615D6974D3'), + P256Testvector( + 21, + 'b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d', + 'C188FFC8947F7301FB7B53E36746097C2134BF9CC981BA74B4E9C4361F595E4E', + 'BF7D2F2056E72421EF393F0C0F2B0E00130E3CAC4ABBCC00286168E85EC55051', + '4690E3743C07D643F1BC183636AB2A9CB936A60A802113C49BB1B3F2D0661660'), + P256Testvector( + 22, + 'fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535', + '317E1020FF53FCCEF18BF47BB7F2DD7707FB7B7A7578E04F35B3BEED222A0EB6', + '09420CE5A19D77C6FE1EE587E6A49FBAF8F280E8DF033D75403302E5A27DB2AE', + '30C2261BD0004E61FEDA2C16AA5E21FFA8D7E7F7DBF6EC379A43B48E4B36AEB0'), + P256Testvector( + 23, + '334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce', + '45FB02B2CEB9D7C79D9C2FA93E9C7967C2FA4DF5789F9640B24264B1E524FCB1', + '5C6E8ECF1F7D3023893B7B1CA1E4D178972EE2A230757DDC564FFE37F5C5A321', + '2ADAE4A138A239DCD93C243A3803C3E4CF96E37FE14E6A9B717BE9599959B11C'), + P256Testvector( + 24, + '2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d', + 'A19EF7BFF98ADA781842FBFC51A47AFF39B5935A1C7D9625C8D323D511C92DE6', + 'E9C184DF75C955E02E02E400FFE45F78F339E1AFE6D056FB3245F4700CE606EF', + '2E277EC30F5EA07D6CE513149B9479B96E07F4B6913B1B5C11305C1444A1BC0B'), + P256Testvector( + 25, + '85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0', + '356C5A444C049A52FEE0ADEB7E5D82AE5AA83030BFFF31BBF8CE2096CF161C4B', + '57D128DE8B2A57A094D1A001E572173F96E8866AE352BF29CDDAF92FC85B2F92', + '1E51373BD2C6044C129C436E742A55BE2A668A85AE08441B6756445DF5493857'), +]; + +void main() { + test('Test ECDH with brainpool keys', () { + AsymmetricKeyPair generateKeyPair(int seed) { + var rnd = SecureRandom('Fortuna') + ..seed(KeyParameter(Uint8List.fromList(List.filled(32, seed)))); + + var domainParams = ECDomainParameters('brainpoolp256r1'); + var ecParams = ECKeyGeneratorParameters(domainParams); + var params = + ParametersWithRandom(ecParams, rnd); + var keygen = KeyGenerator('EC')..init(params); + var pcecKeyPair = keygen.generateKeyPair(); + return pcecKeyPair; + } + + for (var i = 0; i < 100; i++) { + var key1 = generateKeyPair(i); + var key2 = generateKeyPair(i + 1); + var ecdsa1 = ECDHBasicAgreement()..init(key1.privateKey as ECPrivateKey); + var ecdsa2 = ECDHBasicAgreement()..init(key2.privateKey as ECPrivateKey); + var ag1 = ecdsa1.calculateAgreement(key2.publicKey as ECPublicKey); + var ag2 = ecdsa2.calculateAgreement(key1.publicKey as ECPublicKey); + expect(ag1, ag2); + } + }); + + test('Test ECDH with jose4j derived testvector for brainpool', () { + var z = BigInt.parse( + '65138509659007270841390460885129724324131841274570317669830341947633356483036') + .toRadixString(16); + var bx = BigInt.parse( + '9081435728752638263367097265083294633999566778486547389501321800986797192058') + .toRadixString(16); + var by = BigInt.parse( + '42724727959342265773907894856035815102192701310430313271362424512013052339065') + .toRadixString(16); + var a = BigInt.parse( + '11389698291027219705720854063086701177373480468419126898830387062538016871056') + .toRadixString(16); + + var ecdhtestvector = BrainpoolP256r1TestVector(1, a, bx, by, z); + var ecdh = ECDHBasicAgreement()..init(ecdhtestvector.privateKey); + var ag = ecdh.calculateAgreement(ecdhtestvector.publicKey); + expect(ag, ecdhtestvector.Z); + }); + + test('Test ECDHKDF with brainpool', () { + var z = BigInt.parse( + '65138509659007270841390460885129724324131841274570317669830341947633356483036') + .toRadixString(16); + var bx = BigInt.parse( + '9081435728752638263367097265083294633999566778486547389501321800986797192058') + .toRadixString(16); + var by = BigInt.parse( + '42724727959342265773907894856035815102192701310430313271362424512013052339065') + .toRadixString(16); + var a = BigInt.parse( + '11389698291027219705720854063086701177373480468419126898830387062538016871056') + .toRadixString(16); + + var ecdhtestvector = BrainpoolP256r1TestVector(1, a, bx, by, z); + var kdev = KeyDerivator('ECDH'); + kdev.init( + ECDHKDFParameters(ecdhtestvector.privateKey, ecdhtestvector.publicKey)); + var agl = kdev.process(Uint8List(0)); + var ag = decodeBigIntWithSign(1, agl); + expect(ag, ecdhtestvector.Z); + }); + + test('Test ECDHKDF with brainpool 2', () { + var z = BigInt.parse( + '52654472886054093008464270686039556607329397624865361587872468137410856915') + .toRadixString(16); + var bx = BigInt.parse( + '11770914954953311947851650675015300970186573673422305697535672144940842288675') + .toRadixString(16); + var by = BigInt.parse( + '28588645609587273162900079046576065116292583182825622980943756235967543473722') + .toRadixString(16); + var a = BigInt.parse( + '11389698291027219705720854063086701177373480468419126898830387062538016871056') + .toRadixString(16); + + var ecdhtestvector = BrainpoolP256r1TestVector(1, a, bx, by, z); + var kdev = KeyDerivator('ECDH'); + kdev.init( + ECDHKDFParameters(ecdhtestvector.privateKey, ecdhtestvector.publicKey)); + var agl = kdev.process(Uint8List(0)); + var ag = decodeBigIntWithSign(1, agl); + expect(ag, ecdhtestvector.Z); + }); + + test('Test ECDH with bouncycastle derived testvector for brainpool', () { + var z = BigInt.parse( + '62035452719449902544084895701129591677592844515050058000761959332847413670618') + .toRadixString(16); + var bx = BigInt.parse( + '53535355328855043322505278710464138773506437230442680203030305357393812004243') + .toRadixString(16); + var by = BigInt.parse( + '71732587040522161341399014632224799350721466455975116137925664616486205295601') + .toRadixString(16); + var a = BigInt.parse( + '11389698291027219705720854063086701177373480468419126898830387062538016871056') + .toRadixString(16); + + var ecdhtestvector = BrainpoolP256r1TestVector(1, a, bx, by, z); + var ecdh = ECDHBasicAgreement()..init(ecdhtestvector.privateKey); + var ag = ecdh.calculateAgreement(ecdhtestvector.publicKey); + expect(ag, ecdhtestvector.Z); + }); + + test('Test ECDH with brainpool from Test vector of RFC 6932', () { + var ecdhtestvector1 = BrainpoolP256r1TestVector( + 1, + '041EB8B1E2BC681BCE8E39963B2E9FC415B05283313DD1A8BCC055F11AE49699', + '8E07E219BA588916C5B06AA30A2F464C2F2ACFC1610A3BE2FB240B635341F0DB', + '148EA1D7D1E7E54B9555B6C9AC90629C18B63BEE5D7AA6949EBBF47B24FDE40D', + '05E940915549E9F6A4A75693716E37466ABA79B4BF2919877A16DD2CC2E23708'); + var ecdhtestvector2 = BrainpoolP256r1TestVector( + 2, + '06F5240EACDB9837BC96D48274C8AA834B6C87BA9CC3EEDD81F99A16B8D804D3', + '78028496B5ECAAB3C8B6C12E45DB1E02C9E4D26B4113BC4F015F60C5CCC0D206', + 'A2AE1762A3831C1D20F03F8D1E3C0C39AFE6F09B4D44BBE80CD100987B05F92B', + '05E940915549E9F6A4A75693716E37466ABA79B4BF2919877A16DD2CC2E23708'); + var ecdh = ECDHBasicAgreement()..init(ecdhtestvector1.privateKey); + var ag = ecdh.calculateAgreement(ecdhtestvector1.publicKey); + expect(ag, ecdhtestvector1.Z); + var ecdh2 = ECDHBasicAgreement()..init(ecdhtestvector2.privateKey); + var ag2 = ecdh2.calculateAgreement(ecdhtestvector2.publicKey); + expect(ag2, ecdhtestvector2.Z); + }); + + test('Test ECDH with test vectors for P256', () { + for (var v in testVectors) { + var ecdh = ECDHBasicAgreement()..init(v.privateKey); + var ag = ecdh.calculateAgreement(v.publicKey); + expect(ag, v.Z); + } + }); + + test('Test ECDHKDF with test vectors for P256', () { + for (var v in testVectors) { + var ecdhparams = ECDHKDFParameters(v.privateKey, v.publicKey); + var kdf = KeyDerivator('ECDH')..init(ecdhparams); + var ag = decodeBigIntWithSign(1, kdf.process(Uint8List(0))); + expect(ag, v.Z); + } + }); +} diff --git a/pointycastle/test/impl_test.dart b/pointycastle/test/impl_test.dart new file mode 100644 index 0000000..4902085 --- /dev/null +++ b/pointycastle/test/impl_test.dart @@ -0,0 +1,168 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:test/test.dart'; +import 'test/runners/registry.dart'; + +void main() { + group('impl:', () { + test('AsymmetricBlockCipher returns valid implementations', () { + testAsymmetricBlockCipher('RSA'); + testAsymmetricBlockCipher('RSA/PKCS1'); + testAsymmetricBlockCipher('RSA/OAEP'); + }); + + test('BlockCipher returns valid implementations', () { + testBlockCipher('AES'); + }); + + test('Digest returns valid implementations', () { + testDigest('Blake2b'); + testDigest('MD2'); + testDigest('MD4'); + testDigest('MD5'); + testDigest('RIPEMD-128'); + testDigest('RIPEMD-160'); + testDigest('RIPEMD-256'); + testDigest('RIPEMD-320'); + testDigest('SHA-1'); + testDigest('SHA-224'); + testDigest('SHA-256'); + testDigest('SHA3-224'); + testDigest('SHA3-256'); + testDigest('SHA3-384'); + testDigest('SHA3-512'); + testDigest('Keccak/128'); + testDigest('Keccak/224'); + testDigest('Keccak/256'); + testDigest('Keccak/288'); + testDigest('Keccak/384'); + testDigest('Keccak/512'); + testDigest('SHAKE-128'); + testDigest('SHAKE-256'); + testDigest('CSHAKE-128'); + testDigest('CSHAKE-256'); + testDigest('SHA-384'); + testDigest('SHA-512'); + testDigest('SHA-512/448'); + testDigest('Tiger'); + testDigest('Whirlpool'); + }); + + test('ECDomainParameters returns valid implementations', () { + testECDomainParameters('prime192v1'); + }); + + test('KeyDerivator returns valid implementations', () { + testKeyDerivator('SHA-1/HMAC/PBKDF2'); + testKeyDerivator('scrypt'); + }); + + test('KeyGenerator returns valid implementations', () { + testKeyGenerator('EC'); + testKeyGenerator('RSA'); + }); + + if (Platform.instance.fullWidthInteger) { + test( + 'Mac returns valid implementations on platforms with full width integer', + () { + testMac('SHA-1/HMAC'); + testMac('SHA-256/HMAC'); + testMac('SHA3-256/HMAC'); + testMac('RIPEMD-160/HMAC'); + testMac('AES/Poly1305'); + testMac('AES/CMAC'); + testMac('AES/CBC_CMAC'); + testMac('AES/CBC_CMAC/PKCS7'); + testMac('SHAKE-128/HMAC'); + testMac('CSHAKE-128/HMAC'); + testMac('SHA3-256/HMAC'); + }); + } else { + test( + 'Mac returns valid implementations on platforms without full width integer', + () { + testMac('SHA-1/HMAC'); + testMac('SHA-256/HMAC'); + testMac('SHA3-256/HMAC'); + testMac('RIPEMD-160/HMAC'); + // testMac('AES/Poly1305'); + testMac('AES/CMAC'); + testMac('AES/CBC_CMAC'); + testMac('AES/CBC_CMAC/PKCS7'); + testMac('SHAKE-128/HMAC'); + testMac('CSHAKE-128/HMAC'); + testMac('SHA3-256/HMAC'); + }); + } + + test('BlockCipher returns valid implementations for modes of operation', + () { + testBlockCipher('AES/CBC'); + testBlockCipher('AES/CFB-64'); + testBlockCipher('AES/CTR'); + testBlockCipher('AES/ECB'); + testBlockCipher('AES/OFB-64/GCTR'); + testBlockCipher('AES/OFB-64'); + testBlockCipher('AES/SIC'); + testBlockCipher('AES/GCM'); + }); + + test('PaddedBlockCipher returns valid implementations', () { + testPaddedBlockCipher('AES/SIC/PKCS7'); + }); + + test('Padding returns valid implementations', () { + testPadding('PKCS7'); + testPadding('ISO7816-4'); + }); + + test('SecureRandom returns valid implementations', () { + testSecureRandom('AES/CTR/AUTO-SEED-PRNG'); + testSecureRandom('AES/CTR/PRNG'); + testSecureRandom('Fortuna'); + }); + + test('Signer returns valid implementations', () { + testSigner('SHA-1/ECDSA'); + testSigner('MD2/RSA'); + testSigner('MD4/RSA'); + testSigner('MD5/RSA'); + testSigner('RIPEMD-128/RSA'); + testSigner('RIPEMD-160/RSA'); + testSigner('RIPEMD-256/RSA'); + testSigner('SHA-1/RSA'); + testSigner('SHA-224/RSA'); + testSigner('SHA-256/RSA'); + testSigner('SHA-384/RSA'); + testSigner('SHA-512/RSA'); + }); + + if (Platform.instance.fullWidthInteger) { + test( + 'StreamCipher returns valid implementations full width integer platforms', + () { + testStreamCipher('Salsa20'); + testStreamCipher('AES/SIC'); + testStreamCipher('AES/CTR'); + testStreamCipher('ChaCha20/20'); + testStreamCipher('ChaCha7539/20'); + testAEADCipher('ChaCha20-Poly1305'); + testAEADCipher('AES/EAX'); + }); + } else { + test( + 'StreamCipher returns valid implementations on platforms without full width integer', + () { + testStreamCipher('Salsa20'); + testStreamCipher('AES/SIC'); + testStreamCipher('AES/CTR'); + testStreamCipher('ChaCha20/20'); + testStreamCipher('ChaCha7539/20'); + //testAEADCipher('ChaCha20-Poly1305'); + testAEADCipher('AES/EAX'); + }); + } + }); +} diff --git a/pointycastle/test/key_derivators/argon2_nonvm_test.dart b/pointycastle/test/key_derivators/argon2_nonvm_test.dart new file mode 100644 index 0000000..65c1c51 --- /dev/null +++ b/pointycastle/test/key_derivators/argon2_nonvm_test.dart @@ -0,0 +1,66 @@ +@OnPlatform({ + 'vm': Skip(), +}) +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/key_derivators/argon2.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +const int DEFAULT_OUTPUTLEN = 32; + +/// First ported to Dart by Graciliano M. Passos: +/// - https://pub.dev/packages/argon2 +/// - https://github.com/gmpassos/argon2 +/// +/// The linked project was adapted for the purposes of this project, since it +/// is a 1:1 port of BouncyCastle's Java implementation. +void main() { + final timeout = Timeout.parse('15m'); + + group('Argon2BytesGenerator - non dart vm', () { + // + // This is more of a sanity test on js platforms. + // The full battery of tests, has been observed to run some JS platforms + // out of memory and it is very very slow. + // + test('Argon2 Test 1', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_10, + 2, + 16, + 'password', + 'somesalt', + 'f6c4db4a54e2a370627aff3db6176b94a2a209a62c8e36152711802f7b30c694', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + }); +} + +void _hashTest(int version, int iterations, int memoryPowerOf2, String password, + String salt, String passwordRef, int outputLength) { + var parameters = Argon2Parameters( + Argon2Parameters.ARGON2_i, + latin1.encode(salt), + desiredKeyLength: outputLength, + version: version, + iterations: iterations, + memoryPowerOf2: memoryPowerOf2, + ); + + var gen = Argon2BytesGenerator(); + gen.init(parameters); + + var passwordBytes = Uint8List.fromList(utf8.encode(password)); + + var result = gen.process(passwordBytes); + + expect(result, createUint8ListFromHexString(passwordRef)); + + // Should be able to re-use generator after successful use + result = gen.process(passwordBytes); + expect(result, createUint8ListFromHexString(passwordRef)); +} diff --git a/pointycastle/test/key_derivators/argon2_vm_test.dart b/pointycastle/test/key_derivators/argon2_vm_test.dart new file mode 100644 index 0000000..cfdadca --- /dev/null +++ b/pointycastle/test/key_derivators/argon2_vm_test.dart @@ -0,0 +1,142 @@ +@OnPlatform({ + 'chrome': Skip('Excessive time / resource consumption on this platform'), + 'node': Skip('Excessive time / resource consumption on this platform') +}) +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pointycastle/key_derivators/argon2.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +const int DEFAULT_OUTPUTLEN = 32; + +/// First ported to Dart by Graciliano M. Passos: +/// - https://pub.dev/packages/argon2 +/// - https://github.com/gmpassos/argon2 +/// +/// The linked project was adapted for the purposes of this project, since it +/// is a 1:1 port of BouncyCastle's Java implementation. +void main() { + final timeout = Timeout.parse('15m'); + + group('Argon2BytesGenerator -- non-js platforms', () { + /* Multiple test cases for various input values */ + test('Argon2 Test 1', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_10, + 2, + 16, + 'password', + 'somesalt', + 'f6c4db4a54e2a370627aff3db6176b94a2a209a62c8e36152711802f7b30c694', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + // A memory-cosing test, will fail on Web platform. + test('Argon2 Test 2', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_10, + 2, + 20, + 'password', + 'somesalt', + '9690ec55d28d3ed32562f2e73ea62b02b018757643a2ae6e79528459de8106e9', + DEFAULT_OUTPUTLEN); + }, timeout: timeout, onPlatform: { + 'chrome': Skip('Due to high memory occupation, Chrome will die.'), + }); + test('Argon2 Test 3', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_10, + 2, + 16, + 'password', + 'diffsalt', + '79a103b90fe8aef8570cb31fc8b22259778916f8336b7bdac3892569d4f1c497', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + + test('Argon2 Test 4', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_10, + 2, + 16, + 'password', + 'diffsalt', + '1a097a5d1c80e579583f6e19c7e4763ccb7c522ca85b7d58143738e12ca39f8e6e42734c950ff2463675b97c37ba' + '39feba4a9cd9cc5b4c798f2aaf70eb4bd044c8d148decb569870dbd923430b82a083f284beae777812cce18cdac68ee8ccef' + 'c6ec9789f30a6b5a034591f51af830f4', + 112); + }, timeout: timeout); + test('Argon2 Test 5', () { + /* Multiple test cases for various input values */ + _hashTest( + Argon2Parameters.ARGON2_VERSION_13, + 2, + 16, + 'password', + 'somesalt', + 'c1628832147d9720c5bd1cfd61367078729f6dfb6f8fea9ff98158e0d7816ed0', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + test('Argon2 Test 6', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_13, + 2, + 20, + 'password', + 'somesalt', + 'd1587aca0922c3b5d6a83edab31bee3c4ebaef342ed6127a55d19b2351ad1f41', + DEFAULT_OUTPUTLEN); + }, timeout: timeout, onPlatform: { + 'chrome': Skip('Due to high memory occupation, Chrome will die.'), + }); + test('Argon2 Test 7', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_13, + 2, + 18, + 'password', + 'somesalt', + '296dbae80b807cdceaad44ae741b506f14db0959267b183b118f9b24229bc7cb', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + test('Argon2 Test 8', () { + _hashTest( + Argon2Parameters.ARGON2_VERSION_13, + 2, + 8, + 'password', + 'somesalt', + '89e9029f4637b295beb027056a7336c414fadd43f6b208645281cb214a56452f', + DEFAULT_OUTPUTLEN); + }, timeout: timeout); + }); +} + +void _hashTest(int version, int iterations, int memoryPowerOf2, String password, + String salt, String passwordRef, int outputLength) { + var parameters = Argon2Parameters( + Argon2Parameters.ARGON2_i, + latin1.encode(salt), + desiredKeyLength: outputLength, + version: version, + iterations: iterations, + memoryPowerOf2: memoryPowerOf2, + ); + + var gen = Argon2BytesGenerator(); + gen.init(parameters); + + var passwordBytes = Uint8List.fromList(utf8.encode(password)); + + var result = gen.process(passwordBytes); + + expect(result, createUint8ListFromHexString(passwordRef)); + + // Should be able to re-use generator after successful use + result = gen.process(passwordBytes); + expect(result, createUint8ListFromHexString(passwordRef)); +} diff --git a/pointycastle/test/key_derivators/concatkdf_nonvm_test.dart b/pointycastle/test/key_derivators/concatkdf_nonvm_test.dart new file mode 100644 index 0000000..c8c4e9f --- /dev/null +++ b/pointycastle/test/key_derivators/concatkdf_nonvm_test.dart @@ -0,0 +1,8415 @@ +@OnPlatform({ + 'vm': Skip(), +}) +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +dynamic loadJson(String path) { + var file = File(path); + return jsonDecode(file.readAsStringSync()); +} + +Uint8List nullSafeBytes(dynamic src) { + if (src == null) { + return Uint8List(0); + } + return createUint8ListFromHexString(src.toString()); +} + +void main() { + var acvpToDart = {}; + acvpToDart['SHA2-224'] = 'SHA-224'; + acvpToDart['SHA2-256'] = 'SHA-256'; + acvpToDart['SHA2-384'] = 'SHA-384'; + acvpToDart['SHA2-512'] = 'SHA-512'; + acvpToDart['SHA2-512/224'] = 'SHA-512/224'; + acvpToDart['SHA2-512/256'] = 'SHA-512/256'; + acvpToDart['SHA3-224'] = 'SHA3-224'; + acvpToDart['SHA3-256'] = 'SHA3-256'; + acvpToDart['SHA3-384'] = 'SHA3-384'; + acvpToDart['SHA3-512'] = 'SHA3-512'; + + group('KDA OneStep Concat Sp800-56Cr2', () { + test('run vectors', () { + // + // These vectors were generated by NIST's ACVP system. + // The correct answers were generated by the Bouncy Castle FIPS (Java) Lib + // and verified by submission to ACVP. + // "req" files contain the request. + // "rsp" files contain the response. + // There are two types of tests, AFT where the IUT is responsible for + // calculating the DKM and VAL where the IUT is responsible to calculating + // a DKM that may or may not match the supplied DKM in the request. + // + + var req = loadReq(); + var rsp = loadRsp(); + + // + // Form a maps of known correct results. + // + + var validDKMAFT = {}; + var validVALResult = {}; + + rsp[1]['testGroups'].forEach((group) { + group['tests'].forEach((test) { + if (test['dkm'] != null) { + validDKMAFT['${group['tgId']}:${test['tcId']}'] = + createUint8ListFromHexString(test['dkm']); + } else { + validVALResult['${group['tgId']}:${test['tcId']}'] = + test['testPassed']; + } + }); + }); + + var groups = req[1]['testGroups']; + groups.forEach((group) { + var kdfConfig = group['kdfConfiguration']; + group['tests'].forEach((test) { + var kdfParams = test['kdfParameter']; + var t = kdfParams['t']; + var fpU = test['fixedInfoPartyU']; + var fpV = test['fixedInfoPartyV']; + var l = kdfParams['l']; + var algId = nullSafeBytes(kdfParams['algorithmId']); + + var otherInfo = BytesBuilder(); + otherInfo.add(algId); + otherInfo.add(nullSafeBytes(fpU['partyId'])); + otherInfo.add(nullSafeBytes(fpU['ephemeralData'])); + otherInfo.add(nullSafeBytes(fpV['partyId'])); + otherInfo.add(nullSafeBytes(fpV['ephemeralData'])); + otherInfo.add(createUint8ListFromHexString(t)); + + var Z = createUint8ListFromHexString(kdfParams['z']); + + var c = kdfParams['salt'] != null + ? HkdfParameters( + Z, l, createUint8ListFromHexString(kdfParams['salt'])) + : HkdfParameters(Z, l); + + var concatKdf = + KeyDerivator(acvpToDart[kdfConfig['auxFunction']] + '/ConcatKDF') + ..init(c); + var key = concatKdf.process(otherInfo.toBytes()); + + if (group['testType'] == 'AFT') { + // + // AFT test, IUT must generate a DKM that must match what NIST + // is expecting. + // + var knownDKM = validDKMAFT['${group['tgId']}:${test['tcId']}']; + expect(key, equals(knownDKM)); + } else { + // VAL test + // DKM is supplied in request, the IUT must generate a DKM that may + // or may not equal the supplied DKM in the request. + // + + var dkm = createUint8ListFromHexString(test['dkm']); + var tp = constantTimeAreEqual(dkm, key); + expect( + validVALResult['${group['tgId']}:${test['tcId']}'], equals(tp)); + } + }); + }); + }); + }); + + group('RFC7518', () { + test('Test concatKDF from RFC 7518 Appendix C', () { + var kdf = KeyDerivator('SHA-256/ConcatKDF'); + var Z = Uint8List.fromList([ + 158, + 86, + 217, + 29, + 129, + 113, + 53, + 211, + 114, + 131, + 66, + 131, + 191, + 132, + 38, + 156, + 251, + 49, + 110, + 163, + 218, + 128, + 106, + 72, + 246, + 218, + 167, + 121, + 140, + 254, + 144, + 196 + ]); + var otherData = Uint8List.fromList([ + 0, + 0, + 0, + 7, + 65, + 49, + 50, + 56, + 71, + 67, + 77, + 0, + 0, + 0, + 5, + 65, + 108, + 105, + 99, + 101, + 0, + 0, + 0, + 3, + 66, + 111, + 98, + 0, + 0, + 0, + 128 + ]); + var params = HkdfParameters(Z, 128); + kdf.init(params); + + var key = kdf.process(otherData); + expect( + key, + Uint8List.fromList([ + 86, + 170, + 141, + 234, + 248, + 35, + 109, + 32, + 92, + 34, + 40, + 205, + 113, + 167, + 16, + 26 + ])); + }); + + test('Test concatKdf A1 derived from jose4j', () { + var z = base64Url.decode('Sq8rGLm4rEtzScmnSsY5r1n-AqBl_iBU8FxN80Uc0S0='); + var alg = 'A256CBC-HS512'; + var otherInfo = computerOtherInfo(alg, 512); + var c = HkdfParameters(z, 512); + var concatKdf = KeyDerivator('SHA-256/ConcatKDF')..init(c); + var key = concatKdf.process(otherInfo); + var keyencoded = base64UrlEncode(key); + expect( + 'pgs50IOZ6BxfqvTSie4t9OjWxGr4whiHo1v9Dti93CRiJE2PP60FojLatVVrcjg3BxpuFjnlQxL97GOwAfcwLA==', + keyencoded); + }); + + test('Test concatKdf A2 derived from jose4j', () { + var z = base64Url.decode('LfkHot2nGTVlmfxbgxQfMg=='); + var alg = 'A128CBC-HS256'; + var otherInfo = computerOtherInfo(alg, 256); + var c = HkdfParameters(z, 256); + var concatKdf = KeyDerivator('SHA-256/ConcatKDF')..init(c); + var key = concatKdf.process(otherInfo); + var keyencoded = base64UrlEncode(key); + expect('vphyobtvExGXF7TaOvAkx6CCjHQNYamP2ET8xkhTu-0=', keyencoded); + }); + }); +} + +// Helpers for ECDH-ES +Uint8List computerOtherInfo(String encryptionAlgorithmName, int keybitLength) { + var l = encryptionAlgorithmName.codeUnits.length.toUnsigned(32); + var ll = _convertToBigEndian(l); + var a = Uint8List.fromList(encryptionAlgorithmName.codeUnits); +// add apu, apv, fixed to empty for now + var zero = _convertToBigEndian(0); + var k = _convertToBigEndian(keybitLength); + return Uint8List.fromList([...ll, ...a, ...zero, ...zero, ...k]); +} + +Uint8List _convertToBigEndian(int l) { + var ll = Uint8List(4); + ll[0] = (l >> 24) & 255; + ll[1] = (l >> 16) & 255; + ll[2] = (l >> 8) & 255; + ll[3] = l & 255; + return ll; +} + +List loadRsp() { + const s = '''[ +{ + "acvVersion": "1.0" + }, + { + "vsId": 0, + "testGroups": [ + { + "tgId": 1, + "tests": [ + { + "tcId": 25, + "dkm": "9137653d95d9caa7d01af08040e04d1e8d26e6f700897fb76bbb72f5fcce4acad435603c4253bf63e0721254375955932f883ff341aa4a788473bbc18d99e21bb83416cd99005681ec354368e633fcbc5723e5c63cc5efa123f92bd362a33fde33952d9a2999f43e91ce5d5101fc46983ca0b90b291c88aa1491f91f6c2ebb6c" + } + ] + }, + { + "tgId": 2, + "tests": [ + { + "tcId": 50, + "dkm": "f4ce431a1ffa060eece3a59cf3d74fe3ad62e38796f8ee9464256beb2f333f4e8dd1aeda2e505eeb05d34164552bb257d173061be32d7768ed6a1fa7034da1f6c862afed78394bd00787c6820575746797d834a6da2f951a1fc7c7f96dee5730595ab0ee0016e110a3df7d7bafc1d64d84b81babf72947787b5ccde233227904" + } + ] + }, + { + "tgId": 3, + "tests": [ + { + "tcId": 75, + "dkm": "a2acfd74c44ce339376740ccaffe0f7b28c58971fe672588f653174080f88cd561351d93c9c445f9ed707ad89caea7e40a8d769ce84b02ca3ac5b910df4fef26c2b7eee0fa7dd4cf9ca8a49bcee8d1e94ab306cd9d23ce8822c4a79bc0caf8cdcb260ccbf303fdbd4901a53ebb95d827690533205cf09c0e1d2c180c61944525" + } + ] + }, + { + "tgId": 4, + "tests": [ + { + "tcId": 100, + "dkm": "95dfaa545a8a3805f7459f424ec44583bdce3cdc7bf5e8800d8bfc79ffedf68f7755fbfcb39aa94314cd14ae9228d37a7e096763069aa8a95f5b0e567709f7d1198bb7f18ed63df2ebcaf6f008db3f2c1eeaf58805d1d1ae17f1ad4e8eb3da79f1a8b0b61e3fd4dffb9cb1f6a98fb6ef313efc9a7b98bccd035b49bab43c0e3e" + } + ] + }, + { + "tgId": 5, + "tests": [ + { + "tcId": 125, + "dkm": "ed387660282dbe24d9e08e90779cb476df6a0d21d35274a85799f9680630b5a1dba8653c84424da45ce9c70f2f461647d8a74d925982d19685462362a03eb59bd9ad1cd031d105463e343e1d04fa7a316755917b36487029c39357938000916f5b66580f71322368089796fc607bcb68bd921ce08f5fbca40f410e091b45267d" + } + ] + }, + { + "tgId": 6, + "tests": [ + { + "tcId": 150, + "dkm": "fa2ceaccec5cac603892b46175aac276294e8f0ea4b38595e3672cbed5e71f2433f7cf474a671f9da098384181aa82d2f28906e2ecc126414fe6f609cad5ec19f53accd4195c7f1ee52eb456b358676b82cfd3496028fa851a0ea6a762cc8d813b6eb16e718a83469c3de525402789d82f3844d233d210aa271152b331eb7725" + } + ] + }, + { + "tgId": 7, + "tests": [ + { + "tcId": 175, + "dkm": "04e8e7a39ef05656da8e604178e71782c0c9fece3d6b68084fb0b44375d13e6fbb43eed014dc73a6eb15a2ad9e4943f81777ffc15fa781970eb76689e43134d687a6005f532b2d766fc8b68a8dcd054a05e4df5f9474dce98929715eddbc744c8401a811cd64b1c9aa2b38069870466ab59e26c2a96536d7571377013ec9873d" + } + ] + }, + { + "tgId": 8, + "tests": [ + { + "tcId": 200, + "dkm": "dfe7c0a0e452cf05082b3a8480fe20b4a4d5efccea33a4e39235ea6b0b3196c3bb4a9a7d7306cf52461493f0a41df92ad82807e56467c3782262ab127afab248d6d75bc1b81b49385c89c7ab94907493b89b1e94b316a913d1d79ce8ee0fc6c552be5217ff03b8f2cf090f25deaed8e658c88883ec2d7a23f3359d0f5c3fc06f" + } + ] + }, + { + "tgId": 9, + "tests": [ + { + "tcId": 225, + "dkm": "e347d40766e1a0616c5d56ac66fc72fa88cc3d4d6bdc806489cf70a030b1af2837bcbbda535636af9de0dd5030b26f2f4fcc550f63e56530b8004e7117c57f47d87130b13c4ab792cd8462feb3838738fa3babbf04ca79a018118136fc600d19a9b5ba4bf76f91aabc8a0ddae7ad87121267a314f520d0eb2e432838e6d0cfb9" + } + ] + }, + { + "tgId": 10, + "tests": [ + { + "tcId": 250, + "dkm": "c6c8174c0e3d283052ec4316fb8d935066d66d104a765d40a9c439a176722fdb46d9c6ac2d3ba4f17985a33ec599860a75639da117b4e51c8ca0ded8c3316ed3fb89507ff1c1a2dc68d2f075fc74ad8d2e0efe5fc743741cc30d935366138c23846150d7223dd300f4b428b65996851b88b55d9a6cf8410e793a957c1adf66e3" + } + ] + }, + { + "tgId": 11, + "tests": [ + { + "tcId": 275, + "dkm": "3bab5d42bc1fd28c1263ce43e3e3c35357ece6258a30ea56272748f2a878cde45aeddafd355cc10c15ec2ba8ddfb54fe9ec57aca358e1745398f447268a646e2fb2a50d2571a69b1cceface030338211f5fb2953ad88f1e967a159c7ca40b54a8aa0a3bd350ee38d63b52e5797619db57b0ad8c8f1283813779b2ce5004f5347" + } + ] + }, + { + "tgId": 12, + "tests": [ + { + "tcId": 300, + "dkm": "ba80aec54c3f75e115e972055999d8ff272acdb27e0b41dfb81ca254e98a870fb1417a460c181e06661278ebd3752bb837e6295f515974c828d8fd4e5f45a2cdd783608c41ac8b79bf4cd1773d6d1e33312c138669525cc832cc96871f355fd3b4ac11345112c9f4f19345e4c4f8b1533726cd5e644c25dce7351ce40f77becb" + } + ] + }, + { + "tgId": 13, + "tests": [ + { + "tcId": 325, + "dkm": "62f417ef046e28c23f8e6bba5461ea13ed9e507f402ba994fc646e7228962a647e8c0e984b83519d0c1a714fb1ba9bb8f68788d83d5010cb1ccac37ede5e158a1b98f6b04f596986a3166f56918164db68e42e030422891589d4bf639447918d7665e7191194ba8df557050e7d84eb8efddffce44e098794cfcdd19d00f826eb" + } + ] + }, + { + "tgId": 14, + "tests": [ + { + "tcId": 350, + "dkm": "2b8213d8a86e08e16a3adbcff7a48b92eb9954b03f2bb347c8f6e7c2220dff727d37e28d47042b4876158d5a06bf019e087f343bac2964dea2514a88087b75a4dab60bb859b7cd5177a57a91e0ca1d1d78c03bcf34b2c752c6fa681807f313bcccd6ad7f48b04f01e7d5478aa9c1941a29e44963e9e0ccd6cdc1c2982ff1ffeb" + } + ] + }, + { + "tgId": 15, + "tests": [ + { + "tcId": 375, + "dkm": "17ac14969f9beb83b360d681bb53f1052b06855f68793f2d71c1a919e293794531fc6b679cf7fcda0eeeb04aa9e0154a55e2188368f0b22dab8ae31856057dffef909c41e718d89ffdefd4bd4c27c1a7523344e443be343f86148dfb87e12dd0d151a63a0e8170cebc6a2ac996e3a44ae80d789902e213f1598c024d71c98040" + } + ] + }, + { + "tgId": 16, + "tests": [ + { + "tcId": 400, + "dkm": "3cc06ae47c6155058fe0caac408ecb433f4fbdf1c7c31f2d2b7473bfaf4df42c1bdd99d8430506adb93686a6bea534862ff3dd4c41291d18247d05a5d11c44bc42efe970573f534c8c35f7728788fb62ca4caad286be4c02a2ad971ee5ca2cf747c2113c4d65b8582c7972aced722a3b93e77875c54e457e8f8b1d9532621340" + } + ] + }, + { + "tgId": 17, + "tests": [ + { + "tcId": 425, + "dkm": "0335ddc7efeeda8be6f03c7c814a2e62c57ac9c37597b249122c036c7e978035d69fbe28bb125c6e8bb2d0706b67548049c9ad6288ab01bb40ab8321f9937f21c284a8222e77eeb3a24a791fc1320df5cc667a5b5d14fe455ddaba0e84e44a83693975a9b31fa8bd1fdd43a3e767f54f0dd49579c01fe012e6955f1d2d5139c9" + } + ] + }, + { + "tgId": 18, + "tests": [ + { + "tcId": 450, + "dkm": "e02036341776cf246c802735c5f603478c2dd931665c90f7c06b627fcb8ddc78d359ddbd129c969b6b29c57291b2577ddf495502c819a9b000527cc50a9d51d2cd20d485c6ac6849663a5ab1b873d61cd8754e7244733510794ccdc182336b397e74ec8116e841fbd3b6f82a4c84d59f7f8a556ef5383d5450d3c04112235a83" + } + ] + }, + { + "tgId": 19, + "tests": [ + { + "tcId": 475, + "dkm": "2a9f1fcfed88ad552436bc7778eb3fea8b27a9bd2263ce01a0141dbd2b64f3c3a5450ace7b5e0c82aeb37cd8d1f4a035f0206f7d368513871ce4f910b5dd9cd263d20e074b10506c62534575de40f8121184d8fe6843bdcef0db8fa51650ee585991e376dd944e5ea0279fa8f5ce31833aec0952d8490a3a9858d6a0f1d6876c" + } + ] + }, + { + "tgId": 20, + "tests": [ + { + "tcId": 500, + "dkm": "63f8c59a9f6b4a7ea4de6c6a4a28fb29c11880d7befa28e245f91c34474905ac7e0289a80536db89ea275de43f3bc28d562665209eca2be8b94ce838d619114c907b6db5f2d20eba6c1fc440050a2b9d91cf9955ffba18e37e4b3338f3aa7e1a5367701cfbccd049a445e1042c38e16df1fe7c52cb1a7c64e416a4943524c225" + } + ] + }, + { + "tgId": 21, + "tests": [ + { + "tcId": 525, + "dkm": "0ee806f76a89b9eba69984b75f1834bd5ad79bfca488ea1ead8244d77ccd39a4e5334a0f2f631129da0eb8cf4f7c0dcf6edc49c39eda654318b097b305313e02f034eb7e4e4f9e31e67ee54239c9fa66d63e976a75d298fcbeda21830a6c9cbfa1f94e83c84b9c6cb56e3bebf005000d11424fc3c150bddf39a6d19ec6ed16e1" + } + ] + }, + { + "tgId": 22, + "tests": [ + { + "tcId": 550, + "dkm": "f300c6531b0fed8c822961434d4f549788f5135c729537c588d9bcd8bcd70e60a57135d7eed619fcc4338f1984c1d3e0b0c24c741a66e2fb867070b6a053ca935da3f0d36c80c491404afc4f6c0c3aa0526608a460397865450e5573ca6cf873cafd62c3b4a7cf8a22376162e671d57de7d148a8e37c8ac2ac3afd73c080492a" + } + ] + }, + { + "tgId": 23, + "tests": [ + { + "tcId": 575, + "dkm": "71a4b415aa8a2be8643ec6ca4bde62a3c00d6d743c43218ee32199a59b74ccd3de4b0d7c57655981e6fd8b07e33c06f5f18d28aa48f57393239cc352169907966ab148fb5b5103df531a7721a849b0353fe3cc186e85cf6adfb8fe27161d828a9a009d59b273c2731500d4a007835513f0b1a67a3618ea486f13511ad1c45d24" + } + ] + }, + { + "tgId": 24, + "tests": [ + { + "tcId": 600, + "dkm": "87d2bd290912d59ba6119dfb3d478f2d183f4361506b184315d89739d724bb49469f59c3c8092c3289b37c063e279c9dd825f536b279146ef2f10dc88d27feb23c0aacaac26e647283fb68782e20fa326e144cb320d80ef15f5dcb020fde849e882dc723d4c2bc9da49379c7ff01620ec5288aeb2e8a043cc9751849e27c6259" + } + ] + }, + { + "tgId": 25, + "tests": [ + { + "tcId": 625, + "dkm": "9186fdfa4f4b031790c3fb15af63115c22711c9f11dbe4baa8e21961118c6fe6688fd7b81b16ab261396b0009dc45bc19c63c973da426ad3507d48942f955544064d0c2b58dae2c6b796a8f4a5b1763a33427d0e34bb26d917ddaa8e8cd2bac0b193f59ae8f452357f519c121efb9432119cbd352d06757d94e1b91e577c6017" + } + ] + }, + { + "tgId": 26, + "tests": [ + { + "tcId": 650, + "dkm": "1ff445965e290243491a617f4aeaeaee5166c5a369a45a5ef62409dfbf9be1cae0fd3d8d94d8b3645215ff19045ca9659980211c71bc1e32e1737d6dd1b64aef503f97d90923ca6be15c69fb2bdc1b9a035c816dcfe59b3efd14b7a18c7e936de95f1e60e66977edeffd28876a946e6476455b3e66b3b88bcdb95492164c5367" + } + ] + }, + { + "tgId": 27, + "tests": [ + { + "tcId": 675, + "dkm": "0c09b573e68ee5bd381ddab48ca1a60d8481e16ab640be391fcfdc5c2b8d8767fbfccb7444fccfb43099d5b84bcbb403befd336b4396e4d055330876605808c6966d8b99b71bf55119782f9120caf6e8cb1b6f41ea3ce2ad4c8de590bc0f823e42dee55b192587e3e020406cb503bd0770a212ea836f285a7eae73136dff43b8" + } + ] + }, + { + "tgId": 28, + "tests": [ + { + "tcId": 700, + "dkm": "541cc65dd7cefb36122eefb5618ceaf6fc51fd9ed0c11e24f6b4e83fdfbed914d3e57f89df81f218cf5fb7c6668b38fcb11e8dd7ee36fe689e80ebea7a6bb330d5f85e1bdca792a51e528335c31840be3bbbf3f8f1c8989ecd41a8deb6e958edb563d0906a13ec86a828d3b9f925b4dc2483f27ec8a2d4dba2b829e528c0a349" + } + ] + }, + { + "tgId": 29, + "tests": [ + { + "tcId": 725, + "dkm": "8c01dd57accda7fa9ed80cbce396c35c36c5627c8512d492dc54e627df1be4ecb098222d8a075065c94f33dd6fb8bb361b411a6eaf957c7c716269a030770d445670364804171fc1567454c5489891a8eb13c4a053776a479fa9fa92edc079239e9a1a48e765b43396a23396d8559d587be8e8e92372d19cf334f7ee2c370265" + } + ] + }, + { + "tgId": 30, + "tests": [ + { + "tcId": 750, + "dkm": "9ea4fbd00a4356ac0dbec482dd23ca448ce6889a12ba5686cb5ef4fdf685a95efa398b49367ac8900d19966ae7d6e0328ef693d81921b7f19897b98eb57a8c70a24438b2eaecad322bb0fb896dfe96a9f866cef2fb4da85c566993e51c641f84f553df657a1e24b57f49155d7499dd33152d4c8f851c7ccb3fb9993a3d35d530" + } + ] + }, + { + "tgId": 31, + "tests": [ + { + "tcId": 775, + "dkm": "566920e87090b5ea618cfda52467afc79f36ab37bb8cfc6d3c0e58ba2d69d9748a10d3504035de3106b07717ec74d6d4ee04f56e867215bba57ed0a0199bcdabf1852e113c2cc58fec4e6a27e3211ce4563ce043ac9ae7065606983ece68f043e79185a8f93d0cd3d2cd7679fe711f1acfbcb6880ec3039c359b2b5d7d814c2d" + } + ] + }, + { + "tgId": 32, + "tests": [ + { + "tcId": 800, + "dkm": "cb90d0991a181ff33617e3a3680ea700bd07929a45a8cfb37af2c2f38f75139412e85ed901d12ede5f19de6c11d6f0b0cceb1dea883547315831eaf98b3ffd3b411dc415ed76c862ad47ad2a6e858a879a8e636113c54018cbc3bba0fc5b1dedda80ad67342ee651b30e651ee9aa96edba23a1ddf35be837b3d2519318a4503b" + } + ] + }, + { + "tgId": 33, + "tests": [ + { + "tcId": 825, + "dkm": "c7920653889fe62b42ec7bb94040937b71d63a50f5b1ff5caf0fa99103a57e7e3b2ce5a5162be5499563921ce963238d55dce028ea7cfa2ec22092ea30cb00a9db4e6d1f07bb694224fdd2d40e3579058fec113a69e02e2b3f2f2f6ab1086486a6ac506a9f13b96d509641292b8a1cc66de91372e6de725048e62439dd1adb0c" + } + ] + }, + { + "tgId": 34, + "tests": [ + { + "tcId": 850, + "dkm": "2123067d141ef353cd8d065a0565d1009a96a4fb19c031f3b0a99dbad919692f888781e86955b8cd0612fca80678deb13ad08fd697c90790407d3b2e3b711eaf88b0ba61dcdfa37af6cb8b45dffcf56cd240a9c5a63449cf38ae733b60c29435e9c65f5f11ee4c07c4981e5801520330d9e5c98e214867c4fd13a1b7069f651f" + } + ] + }, + { + "tgId": 35, + "tests": [ + { + "tcId": 875, + "dkm": "e18ed9c1eed285b7f4395a5d44ce81c6b2b9defc5609cb7f8f240c124701c218c0ffe3c1ae0cd2a6e9fcec16f2c97295eafe88311bc0c93fe7821c69708d3e1d8d616d2503b0c08099c38b299cf883b2efc3b788ce0065a5367494a24fe3cbb2ee15bd3275164f16600243fc1924efc618eeee34352b8a8d41a4be21e7d60ddd" + } + ] + }, + { + "tgId": 36, + "tests": [ + { + "tcId": 900, + "dkm": "661b0fbd5f47676cc598f0efbf97d73c0e8d0c4dec0e2b76d751733342efe1d790029135a0d209291c13375b29fbab5ee19e8188bb90c8170c2112c31a069e1689421a9d739a574545f36ff273564177275743048a300bd15311eb9fb37a2e7171db9d8ecfded7a08d025fae024dd955a36b7367831ee6660072c32a84870bc5" + } + ] + }, + { + "tgId": 37, + "tests": [ + { + "tcId": 925, + "dkm": "7332e53866a0e37c20246f399daff2b97b30eff5edf8f05eeb7e881306307ca4b334c3e44e4066225659de381945ad3a1f403c661dce2aa890fa5ec610f5a8e90d9ba7c27f948f78b4c0829e0f04e53f3d79df426cebe7c0430d91ec6548aff3418f39c9ba9f7b6a9bae1cab40779161f130f48c31bed5ed099f7dc13737fc0d" + } + ] + }, + { + "tgId": 38, + "tests": [ + { + "tcId": 950, + "dkm": "34f8307669b70e712278eba56e27f96347debe868326aaebe803b3123bb6b76de8c47cafd6030b7dadcf66e36385e3aa45c520b91d09fc2d41458f7fc6d6f9062b28e601bee87987d8abd3bc97b69ca49b26c0de37e0f4711959cea45c3b0ccfafcc5376a11ed3b5ca11345ed3d42740e7b41a89a5d8ea5a1124975e5280860b" + } + ] + }, + { + "tgId": 39, + "tests": [ + { + "tcId": 975, + "dkm": "4d9503f60791c4eb9a6ec6610f16eee8498c01057879f81f8d7232629ee4afaaa86c3a9329f79268364a2719e9bdd7dcac727ff6e18e9cfda6e15dbaa6ece87ecea3e4c2fea324744594361085f2b4aa8b503cc5d57f46950f5201c4174fa894f0522e4df7f232990d8716023a7e0aa58873c99bad6432f37aa96efafa5354fa" + } + ] + }, + { + "tgId": 40, + "tests": [ + { + "tcId": 1000, + "dkm": "b7699fa915d73e302ab4b1e39134c6c426876b892acf56b0bcdc5594629b1f541107a6ad5a88b47fe688490a2e56cb6430c3f67a7213715eb8039a184c2b38705afbceb5d53abc0aea0c80a8dc6ca6c9a90d87ca8d0060c578fde56a299afa0c0454d2555a6411987f8de21a7f23a16d3e85142c501019de5e954e974a0eb651" + } + ] + }, + { + "tgId": 41, + "tests": [ + { + "tcId": 1025, + "dkm": "c478723a5f7d73ce7f38da44e1bfcb4e23f081484f80f662785fa002a89784fae12daa592c8cf69521778a6265f8320571c91a7441b9c4e233657d8a459642de811d9efb740db778f63ac01b2645792d9527279ba230e1ecf7251a49e5dc9b41f75ef27f1a6169792ccdd937db936b93a03992e56d42a4f9bc9c0df32987794b" + } + ] + }, + { + "tgId": 42, + "tests": [ + { + "tcId": 1050, + "dkm": "c88fb63db45eb1f2248161059fc09303ce0a14b04f9181853a210cbc88c6b475f9d5e9dfb2c6d886e264e4185dbec6e4882e0df462f09839eaa0fd0efe60ffd6a2e74e69549c30e9c6e48f1f1cc2c7a986f7972493b5b5b3ceb440ffcb346e2bfd87884609e51f591f3644aeb4faa926220d8e43deef31e9f5d90c6f12216631" + } + ] + }, + { + "tgId": 43, + "tests": [ + { + "tcId": 1075, + "dkm": "07708a4be85fed5151cb2e383e688a2d4c3700c151a713d1cdd2fa52f64614b117cf1a01bd8673fce4070b11a442f4308594682a61cd6363a1e0debac36fd6226ba38dfdeb4ebe9a852248e6379bf99240563a716a277abc2f3baab939260c5698264e817a0d0396b9ab550c8d5e66ab212b26f4cfb87eeea130440c17bc8b05" + } + ] + }, + { + "tgId": 44, + "tests": [ + { + "tcId": 1100, + "dkm": "967f7a99447c74ff59cb367440b8a3a7ddc44b84bc067ec15d496c6da4b0b4dde924d5f4b1ddb68df825fbe991ebf02b883bcf33030c2dbed88d03fe8cada94bca5e3b4c6bdeb1da8973b8607f4aa739fc70a9b991745b93d96d00277c21218fbcf99c4a1f3ef1da2903500ea3c79fb3d8b1f8295c05175b6e82d6f34f0fce74" + } + ] + }, + { + "tgId": 45, + "tests": [ + { + "tcId": 1125, + "dkm": "1e784caf8a04d725ec6c7398e472998e44124cb505f609ccb7129d83a526ec3175f1c29bc15b92929a9e7ca97478106dfe78a81de8d02b70b00d02b7cf0301a5ad09e2d2afd95e808a27b717982ff536bf1ba5648b6ad5b0f32159e1ce6080d304a4434db546d02402159d597b986336d4019d011b6cb0984875caad1e5350d0" + } + ] + }, + { + "tgId": 46, + "tests": [ + { + "tcId": 1150, + "dkm": "f85fb4edb106140e64acab6c560897c66967105c0b421a325769b428267b9c4be36868e40511a87eafa40797a035e24d5116fd352a8a8e8c65359d4e01eee9dc7cfc9f89db623e59d1f95b6017a469b4559afb3d2ba2c6e189fef3a7979c8513c4b9d3404678c6f4941b0a93d4892e6b73be88d372f43909607c4046c6fc96fb" + } + ] + }, + { + "tgId": 47, + "tests": [ + { + "tcId": 1175, + "dkm": "fb225de8af4ae22b5d0f6394d71300f9022a6f34e81d431798dc5a7530b3fe718540d3dbc9d140be97c4cd7eb6e3e749a314304d7378b6e617b45783298d209846ede31e5ca31f119b6223380b01da28b358d4fe8dc160276f4632c99b46e1c06a2931448e7c591d1162820c54aa36537a8b721bcedcc46402eacf958f1fd8be" + } + ] + }, + { + "tgId": 48, + "tests": [ + { + "tcId": 1200, + "dkm": "5e422eb4e6595513ab805aca1dc09092803fb89f9c63efaad491587da8ed4dff331ca683b2dc11d98f6e76f0ae0eae87aa1e4b616111cbf964c41b362af9f0d4afa46098322d3d1566ce368c1618c90780c4bb0a75e1cb207934528ad98defeccdd0573c90b1034a0658b33b8c6fd8ca5b8013dad5e7f39962375f289329e113" + } + ] + }, + { + "tgId": 49, + "tests": [ + { + "tcId": 1225, + "dkm": "a60e976ab54b219f069a1a55ff5186c8196c2899fda1dcaf566883d84f605c4cdafbd4d8d03827577464ac108443571c4e1a76bfa316b5934d4f915a3742887a2e9a2417ed3522b5f9bce8e34220f2620a36fe775ca199bd2b4fb6f1e7074e928889ccf9774f3f7b5550c668555b173a0f9b71926cd4b35985ed7ea095720b43" + } + ] + }, + { + "tgId": 50, + "tests": [ + { + "tcId": 1250, + "dkm": "89caa3d7595dc94dfb869f9279b3250278e220a7a43ad5740582d7cd978be18d87c09a3e2e496b95e283e1802adc0926ac6a3ece09857f35ed886215abf0e37a9f4552757862182fbd3d112948d5fc09257cc90baabb6f2d55341057745218ceee69e893e62465204ffb40fdb1d58c410afd1d5cdab0b330a5fae3d694223b64" + } + ] + }, + { + "tgId": 51, + "tests": [ + { + "tcId": 1275, + "dkm": "00e3dfde6ce9e5074f079c2863cbe6c080b74cd5d3298e84f8390c741232e8f3c45005286588914b708164e469bae3c29d866ab98fa32870117c027f05d275fe51c9b2abd70f1c20aeb95ad351428f2ec1b67013ffb0f81968d8629c29a6c0a6065dbe99d75a061dba4f3ecbd516582f1547b55b99e92a105d23da0a741aa12b" + } + ] + }, + { + "tgId": 52, + "tests": [ + { + "tcId": 1300, + "dkm": "2496ed85c0772fa181ac6cbd3eee4fb9184054b337e41c5932703a5e55f57e890f05d1924a02986cc7ac0201a34fb0e8800c2daa786dc2c74eb3166ab8251d41eb5aa2f0b9e17900778d382aa3b7a042453571ba11e3bc6b76a39747a567b5690706c355cb69ca17a378cdcdd6bf0605212f0e948545d9ec2f308c9e81718729" + } + ] + }, + { + "tgId": 53, + "tests": [ + { + "tcId": 1325, + "dkm": "3ab408711b074a9933bf678a866e787fca99b451928dea1199c381ea9c091e497b9a1ddcb4e4748616f01849d73412d4c55c3ad04008e8e3902fdb8393acefcaed9ae180a1f49f60e962ed10c4cd72a1350d22a561c14d954faf5d4a8e62d054da4a8f651a61b0c372d5905dc3d1dbfc73cc098ddb1c32574ad421fdcb72aec0" + } + ] + }, + { + "tgId": 54, + "tests": [ + { + "tcId": 1350, + "dkm": "5c2174f9363bfae0b8ce0f9605641d24a37b0e6f8829cb15a2615b4322266ff6f61df3e1e2b55824355fa4005d0d12fbce809f8de3a6157036167809c2610f5a8d921c09d6975318cb7fb183b6a9ac6b225a2345201e6d1501993da350432cbae3f74126766423c28e8898b4604db8e9339f7f19ee4d8e623c1ceedc3c7bd10d" + } + ] + }, + { + "tgId": 55, + "tests": [ + { + "tcId": 1375, + "dkm": "efc54ef9c7d08734fccf81a37572c3fe1fe5730dfe023129473d7eec5115231cbf2b2f1abff8a692ace95ea2ab6e3bcff215e81ec4a64919fd5fcd615b75add0af03ee070bf51d45a79215dcc5c8e6fddf959cf7f7ae3bcabc7ddd1508e52900a6c90fd7d743ffa1b7a169462061eacda43a07a4a03cf2975c6c83a4884094b8" + } + ] + }, + { + "tgId": 56, + "tests": [ + { + "tcId": 1400, + "dkm": "7c6630c5360f67bc73a467d57d48544e74629146e1375127549d4de3ca4f3d61b72b5d271a6d65349fe78a08a3395e0ee170519f41b8a39e59e004b10db4ed0cb6054240e13f7ce48a75a90a373f1e7fac59cd44259704922f86ed14433a22c882c1ce863832e885a85a7067f7a4a54318b1a2f23fc37654de0685312fafc65d" + } + ] + }, + { + "tgId": 57, + "tests": [ + { + "tcId": 1425, + "dkm": "72ad08e016f28353d9378b4765a088f832686bea5625c4243e438ae3b44032f7c3e8acb3c553736f019a3bd9deed9edf4c350b5ae5cf29746d32739942afa6e3cf02d94b09a0e4bd79cebc08af8738adddf1d4bfd93c3a51a77b600fac148593e52f08e487aa459afe5022c42d2ed0fcbf58d0ae88666237e67c6146adb4dbc9" + } + ] + }, + { + "tgId": 58, + "tests": [ + { + "tcId": 1450, + "dkm": "de37c4e4b8974cd08dc6b2cddf168188739c043ce707ff1b04a21b1cc6c459cd5ae1213104f403584452e98bbd43269f19677476ba6a0808d919f5ea4672f1617062c8065d266dce1d01f495f496c741df7350068d5293c08512e3c2f1a83a1bbdbf1bab5d744a8eb970de4416d00fd4c4df6608204840d314aa81269f7e49c0" + } + ] + }, + { + "tgId": 59, + "tests": [ + { + "tcId": 1475, + "dkm": "562da6b9159a0511a1d18cb736efcc5d9494454021e861b28415e9f4a0647197270a8ddecbf06f6420c02dd304fed6d680ba73d5870ebfe1554ace5fc57b9c6312d77a8ead539e2dcea9d4cd581dfd39495adb63a02890e3e0e78075647abcfa74a9326274e9ab007513cb9bc956bbe28cebcdba15c016edc2391243fcbeb2b3" + } + ] + }, + { + "tgId": 60, + "tests": [ + { + "tcId": 1500, + "dkm": "0b325f1668ebc03d7fe72d3c6fa21d422f882eb6343a8ffa291d01f411f92b75156a3497c0341ee278cef5579f4c0b5dc5dd03dda9833182bc1d3847bb2bfde55394fd0b9f886e22694766b4964bd2fe2111eee42ebf3d8c225585587590a35e949947e38ce5de692746817867a5782367d2ee2e67ff01dc76532bfcd7749c34" + } + ] + }, + { + "tgId": 61, + "tests": [ + { + "tcId": 1525, + "dkm": "a2012b9b08d71cf7dcde6e8f064df05876cbf126a5357ac1bf19dad96426b885cc90184b3f3e643f5154e1eeb573da392d12c8924f34361352c08f344fcf09f05611f544bab8d65da46b19517dc679a1cb0681445715650f15b93e0f1db1c16143b714ec49812f0a9de7c60c66be22f0425989bd6a5b1294be14151ca149321c" + } + ] + }, + { + "tgId": 62, + "tests": [ + { + "tcId": 1550, + "dkm": "5c04e4722be239a8c9c03d910f82e3fc56374fd2fb67586e6f6034453c41cccbdf7e7b684a873d720db6b9fff1c20ff2b23712d05920e442fbebe30c349d90b53be8f1a193df68c5c64a4ce4f54b3492c9b15700fdd119bf3f329fdc432bf44049f7171de76e6248f2bb736a674e67599b5606366cf613c45e6a9bbb999c2a1d" + } + ] + }, + { + "tgId": 63, + "tests": [ + { + "tcId": 1575, + "dkm": "2bf97d7b13e2b263552fc293db90945b418855dbf50db46bfba9ff7000049007fa4a1f8471903925feca438530edcdbfff6ca97bd952abf445bda5f142984f34481922a73ecbcf215ccd42350ffee6aacd33021f51692456a0c58e75b5dd6f25db59ed01ba97b142a3c3bd37d017e419339b6b6afd67559212275f8147695906" + } + ] + }, + { + "tgId": 64, + "tests": [ + { + "tcId": 1600, + "dkm": "0871059850154529b6dfffef92c1c8b0d125ca2d484edafb7c98d3e0fd86984214e6411596280e0f639c3096de4d2a5e81e30cfdd0b0e8515ef9fe89e158d31f0939ce6cbfe995ead943069dcf185204cb9ddb368bff9f464b378a165bbf121ceda11e0b8c5272e5ef76ee749781560c8d26c0d0daa5a0e155ff8cc2591a98bf" + } + ] + }, + { + "tgId": 65, + "tests": [ + { + "tcId": 1625, + "dkm": "ab95cba19e3efd837543c323fa02c2d6539c53e5d574049f498361a0eabe3b2d7027cbd73027983c79e5164d780bd10bccdb5dca87d0807abeafe8fc851530b99126ce0822320ec112b8ed2c85cd23cf97b141e220ae77375d840245c7955370d656152b07e0112511e5b9a00b1b75eed364205230bab2b89de9dc17053b12aa" + } + ] + }, + { + "tgId": 66, + "tests": [ + { + "tcId": 1650, + "dkm": "0e6d2542649ee5d43df1d9f19b0a9318c590f5f0117844f02abb6feedd680f1e31cc7017fc454bd13f80b168895582198c227a9fb1da06b2a46aa19677de95942c79a8e9ce3c75765c9e059e711e740f8a6068197e1c93d21d958692b44fa068f41d27e4195f588b1b1c96919daea97446457af25b557a5ce519db6fba19f2f2" + } + ] + }, + { + "tgId": 67, + "tests": [ + { + "tcId": 1675, + "dkm": "78bbe7a7bf2172ae321b1489f634206151c75b0e298e499cc4a6184e696e3a120a28d00282ad4ed1f0d93d7366a4dd55191f0ba500ff1755f64bb15a64304919ed7a5fb69bbf11eb15c969eb821cb758bb1901da35946e35b3504fc4bf3294ed6422ea66500b763dcf544f5127b6a84eb98ded44009564a1732289660b0be676" + } + ] + }, + { + "tgId": 68, + "tests": [ + { + "tcId": 1700, + "dkm": "bf50016d3b54a47fdaed24d057d85e90bb5a9895bf69cea90c27acbe8c0871ed918bca2ded891c29beed974fd167ab0c4ac80315b7ea2569bfc11b70e0cb83064ab198011d299318e0a98b550aa9d957fb462e6b4b9e46a063e6e13dbbefcbaf134de84091222f962674300f3af3a69daa15c96691a1f5d2db20903026b3ece4" + } + ] + }, + { + "tgId": 69, + "tests": [ + { + "tcId": 1725, + "dkm": "08c6d81e59d4117236a4eb26ee407b9f1b68cfd25b24b421afbbb6b4bb8fec27867eb8f9c488402df1a560355b49510d46401c96994da0cbfd3981e47ad45ee198d609abaa6b24628e44a7bdad49145f5a75132c26416cc2f082ffa65bfc96561f545c9558f19cb8bb5d286a838fde86a0c292fba6847739f60ce910ba643293" + } + ] + }, + { + "tgId": 70, + "tests": [ + { + "tcId": 1750, + "dkm": "edda571e922dda840c861653e6848f4c1a49b7730adc61eebba26919c1258eb70077bd0534735ba89ad7933e4e56ab54e1d0efc0dd78aff863fb31d4e80f59eb7f5454a501f202d0251da48631a8c5de9ec4208a6e2c7d8fd87ed237eabb669ec8ed132dcfdd27016c4852363582df679fe7c19981e20e3fd06062f97f462259" + } + ] + }, + { + "tgId": 71, + "tests": [ + { + "tcId": 1775, + "dkm": "2bd956cde4c4ac9ad0eb36d9a026a342933925a50be4e6cf0a76f500a4e79ea7aa8654e0845795d10dad99c1748b7acea4c782b859c7e2d5f50f726d4c4d3342224cb0b935f6e6b1b2bc5d15bc8238c752eb273042119eb9a4eb46d639c524b5c018d1251a7a36372c44b0cd8258d896de644b9d2d0775bf0f8d88d7a9cbe01f" + } + ] + }, + { + "tgId": 72, + "tests": [ + { + "tcId": 1800, + "dkm": "478a0f059c88f68ac3968bb6a5e8049095f2086a0dab21b2c2ce1a0b7a9e59b1eaa8630cab63c75fb43b613e766937600ed34b5b6e53836bef86168b2539001a811753e5e9752c11b8dea604c3e4fe9b9434ec742500d7007da5dbef221bf6a61c6b55c664dce04ba0a493402b002fd03eeb79f0daea4fd3a555dd911200a269" + } + ] + }, + { + "tgId": 73, + "tests": [ + { + "tcId": 1825, + "dkm": "9448fe0041d44fd41e2d6212a126450cd310163bf1ae84bfb3c2b8ee29d06360bff61679af01b2b35d432d43a31ab1b250b0db172042c1894dc8e7d32c0904e251edf95743dfc29cfa12b8fa3a7e9ce7a76c58c2bfe34cdcc41bb93ac3f7a007f77e7270adb315c84154f19e7fe3ccf2b8d531671f6203ae5f2e97c3c07475c7" + } + ] + }, + { + "tgId": 74, + "tests": [ + { + "tcId": 1850, + "dkm": "1d5ffa19037fcae0953a25a52ddbc2ec293b77e1e07ca6b8b133f7444b9b57c4cfdfa4623657f80dcedf6e062ab57ee15a622b72825d1434dd46e4817f42619d40fc0537c7e1285745f2244f3b46426aaa11442edae4368ecbb627c932365d1b4a1f856c3f98e7d0594117f6de88db1bb0d97b1fe57da274d7da4f31c7d841c8" + } + ] + }, + { + "tgId": 75, + "tests": [ + { + "tcId": 1875, + "dkm": "5b0abb087a6ea747c31a3807926e35c2ea4de25dd3cdf7c73ac43193719ef028f0837fd724a200a2ddb75dfa5f490036070c781d03f10688475c2c8072490cd510f0c17e187802b97b6a1395d03353cceae3087adb94755f355effd43507ec3e6b5edf314c814f4d0765635ed54ba59d722091b1ccb80414c3b8315a57ae1f54" + } + ] + }, + { + "tgId": 76, + "tests": [ + { + "tcId": 1900, + "dkm": "26841d9524240169325fbc032599ef19a9fba96d959c85959f59273d7c618ae99c11de9f8d8a3377ff7c1a2a44ae5faff7d0dfa743cdf5b3237a4e9b1ef3d99e250dae16cc8d4fb4d44c4f1498d5082adce9ea48df3e879f8a83b01e04741a926ff64f1c7e388f418516c29b650de3840aa6dec42f3eaeb53a19985a24d6d6a8" + } + ] + }, + { + "tgId": 77, + "tests": [ + { + "tcId": 1925, + "dkm": "a19cfb4ce1f8e0a593318d88c955bec11f7d733c41b71a751534610a2d51852dc0f3875a9aab8217b4ae37b413e10f90beab6ffaf6cf871eab36aaef0011ca0cd2d297bf8605d04a52b16a983237ed65b626c67ea85d92ec0dfc50d7951136faaeb641e2434d5211fcd0da51659925b7791100ab36e70aa8896b8ac97c94b6c4" + } + ] + }, + { + "tgId": 78, + "tests": [ + { + "tcId": 1950, + "dkm": "f543fd32fb63479abaeeb5839a41e7bf1333600e868a6d0e9afcb4ceb9c5455527164e5a8d450837b7efb0d414fcac9dceb413a828957d4bd265739e3c5aab685a3f1a5554bcd396bd323ae17c3b01ee1f1742de298ea2acf0eb57512325db43891d0665d3b07082e9833ed04607446bec53758e11546cd4554d0e29f61b82a5" + } + ] + }, + { + "tgId": 79, + "tests": [ + { + "tcId": 1975, + "dkm": "540beb9bb6713e77e74a78631ee094b8bc669c0947dd391e55c7f0c32caaced7ea33966cd8d9367e6675a5d2d25e0193f324a964387878ef9c0462a6aa38791708a364e6b25be19ab832dd107da0919ae7c81e7d27babad01c6bf763cef525c7b2900aac4be0d8e6ccfa617e5d980eacb5e2f20c0c5d3249e13d2de4ad4bbd47" + } + ] + }, + { + "tgId": 80, + "tests": [ + { + "tcId": 2000, + "dkm": "605bfb2485c97f7568a7dd3d33f67f2f5f3f7e61086e344a516e56bbba2c172815de08c8b506c59743f976a5a58ddaf06c7be96d844591a29c1b401e76ccf77bf58f32c32fd88f6bce854916d59e7f3400cb6c1f31ad3c4eed24d37166f197c9f8bed47d3300e68d235d204322c83964c28e2e02142a80037d5e72338c20bbb0" + } + ] + }, + { + "tgId": 81, + "tests": [ + { + "tcId": 2025, + "dkm": "a18eeb9351235a51ba685499f1ef253079be2539b475886b9f3026cff1c882f4655949d3398cdac61339e4d6ebb04d378d52699c625b0255ec156ddf9e46ea4069c5cfc3d2b9fc8823ab54b0f37c85f5bf084e363ddab0221c24da639dfe317243b7f70995efd7391f6f57d0334d63cae6afb47a05e4136cf043a9b6f5f01bfe" + } + ] + }, + { + "tgId": 82, + "tests": [ + { + "tcId": 2050, + "dkm": "69bbf9af84a58d24b5085cc382d3c245778dc095aa5cb24500f3ea130dab2c2234936fc94854a15c3f07e13f04aa95df76675dcdf9f01dc083328476bd9900e17718ee81949964c1a1a82ea54b1deab1d7ec4538544b5aa9c4c717e624a9d133b6ab78a3b063c51ad5f355c2a1fcc0c3f2b3e0246bf7c7216fdedf771b386f44" + } + ] + }, + { + "tgId": 83, + "tests": [ + { + "tcId": 2075, + "dkm": "02ba3ab94ef29b15932329ef506d9ce5b2744187f4eed90ad230c7610fe93794051afb7ba316cce02d6feaf543ea3b1ce700ab78c4cb5824d6284a1859d94df55292381796dd48e98ce10530afef3b79d8ad0b216527ff0dc8a21bfa8c9b999282673b64a9e6297eca05415453c230c28b8c2d722f3fb7a22c0defdaa6fc27d4" + } + ] + }, + { + "tgId": 84, + "tests": [ + { + "tcId": 2100, + "dkm": "6b68050acbf4e41b13b533aba1ebffd6dc8b23d2a7125f0ac3e14e45431b2487d2ee92305e0d2f5b11063b66b617faeff40c7ea94708d8b5352ca0c20fde1f458502a351c683d6fe15b8145e6aecbafb8f68da125f2621c47818a4e75dabe38d473c75386bdf4368c6604770a92072d73b494b0c1c3aec86dc1b6e2e4ebce05e" + } + ] + }, + { + "tgId": 85, + "tests": [ + { + "tcId": 2125, + "dkm": "900b7cb1b499e29167a67f7670f0ae146500103c2d00127c9e0f83b06fdeefbccf742e4d1b05579da7fc6881c1995de49f6d4325ec785073dd6ceabda7331c0dbda00c22ec690c8abbb4abc1e3b1f4bfb0f0f04a9a00d1bfa0873be37c7b8fd35fa243c84374c52ee0718db1600c9833f7d1422a0109d361dda42de1d1213984" + } + ] + }, + { + "tgId": 86, + "tests": [ + { + "tcId": 2150, + "dkm": "4c25a9f5ee0f6a67b3379a82a2916b3807ccf88255c12f92e125c19419323b7f3a07c761015c199769655d1974757543b983376717a58f6c4c82da67fcb4b6fc9370ad9bac872758ff4471bb259ed66958f4248ef9900ae7230da8257e64d1ea5ab355c401c89592c20a49f244f41e9b07dabcbbda5e67cc1a00d9fa5bca4ae3" + } + ] + }, + { + "tgId": 87, + "tests": [ + { + "tcId": 2175, + "dkm": "cafe0abc703c6777ff27b72d4bef3ca08393ae8a1ffd0dd7be09719ad280983204a34ec85174f3b721b2460e13c08c97e9070e64b2540923b25e4f4c628293cc1829668985eaa1c20f53bfd10c4c3c889c6111bc6483896841a6964482a0d86cd2b18531a06832c467a4f986200250ceaa01898397312edda7120546144b7b2b" + } + ] + }, + { + "tgId": 88, + "tests": [ + { + "tcId": 2200, + "dkm": "dc5ca3b28acbef9da5f3136e96c090932d28c456479fa341d698b763fd584c1e2f76d1f429a7c7df108ee90e6cf123fe79cfe3b6c45c3020e0dd3df67457bb9c58089c1e284dbf192c493366c9642fc57d3a1abbbaf69a6b2377dd3b0750d77eda70ee41ed3208e70118ffc30e35de35c20e2aaaefa29fa69b6cebed78ede209" + } + ] + }, + { + "tgId": 89, + "tests": [ + { + "tcId": 2225, + "dkm": "ba40ded011458b658756c1fd4ca1f15d6c4352614f4686dcc6fe7da328ec91b8c8d7c13bcbb5f26d85391a0650e37826a3cb2514aec00083e0bad1e0d504285819d8807d1c0cd70095bb4dbeb1bfd264404cd8629ea6f2ecfe61c195c031f978e9a5b6be6e69b60831bc568a9345676ac97f829890488f8df68a8cb485a32db4" + } + ] + }, + { + "tgId": 90, + "tests": [ + { + "tcId": 2250, + "dkm": "7b675d81309adb9682e723441491fce51ecef9bab0c479b7b08bd75b1487370c459c7b6ccea320b761a1f69cb59117746741548ab7746355d502945c117c9607fff29832522590f5f9ef163b3a99b9851d6864c9686da35866b35ede144204e040fbb10c6bb6e2fdbeda55f71072a88dea3b3e456abaeb9efc6a616678ebe37c" + } + ] + }, + { + "tgId": 91, + "tests": [ + { + "tcId": 2275, + "dkm": "db7776275330fcb3fc6c015573518622895da2312c193f44d78dca9ddda4a37d4876f699fff8c45a5182efcfa069e117bea8ac13ba7e0a675e11f54fc9455de43cabb2a7dcfcc0e892eda7a1e4eea51c276eac237c1996d2766fcd70086193ffc5c9d67f186670f58ee7ffe68a35fb57cae10b7db527f8a600118163dde4832a" + } + ] + }, + { + "tgId": 92, + "tests": [ + { + "tcId": 2300, + "dkm": "2a0069dc87f48518a20e46c5716ab5e3ceca1efb22180100609e031be3b34766b376f77a4994f8855e55b0f063ee52bc190c6984f2e5cade9241e35ed6edc1d1ac20a3b3ec0689ce048d96f04e6d577903be76bdcb8379c1e809e8fca71053c5619455c7ba4c62fc1ce802b494b4e589a76c2fbb0bde6531faf98160e06f831e" + } + ] + }, + { + "tgId": 93, + "tests": [ + { + "tcId": 2325, + "dkm": "c78d4afd3e6bf21d4804d951f8f8d5226a9f464ae4c714e74f400580ecc3efa02f02d9042d0702b19170cddd146b23fcdaafc9f078720fab6ea8af2845ac100684eb4f7630e9809c92d7cd51e11537a1c620b621672d9aa7cd4639aedc59276a4ed890a7ca71a733c02005a25a0dc791690cfce1cf30209fe2f8838d390b9d18" + } + ] + }, + { + "tgId": 94, + "tests": [ + { + "tcId": 2350, + "dkm": "9a5b1083d142380c31d169093968bbd98999f9e95b248e61e683be3df44ab180462c7b21f7aa429c3c5847eca0987793ea36f5289dc627f6ba244abf35eea7a7e3c2283870c92b3cf486f7f522c498967d52b694beb163bd3d9ce252d9c88ae780c30ca66b3b6e5a03b19e491d86e72fb79b1d1b9f458cc646014cc20cae4854" + } + ] + }, + { + "tgId": 95, + "tests": [ + { + "tcId": 2375, + "dkm": "3632525ac0c26067965f50542258ba404fb2b927d11294b00276a948bb3f29b2300a4724a29d84b53613ad943b7197c51443a0347ba423a206f007f3c059baefd562fe719b72ceb9b01d975f5f41e405180140acb62b7ac900e2ee38a6cdbe8a42928438e0a1f843eb46002cdb4a4461d630c10d9fe25d16ec9459ab3ea34af0" + } + ] + }, + { + "tgId": 96, + "tests": [ + { + "tcId": 2400, + "dkm": "a600748871960afb73f99760ef8925ca7fcf313b3a2c66fe638f156284a5e513d4a4bf1207a8bd7357ba653c08b53920370f7c39f84e7c7a2b2f575b2405d782a764a1ad799ea640da37d56f384b18c52a5dbee2ba76167720ef3ca415d990b8f41b2339183eba448b96ebfc7c2f1033f7049e1d2962dff1ecaf888d6c3bef71" + } + ] + }, + { + "tgId": 97, + "tests": [ + { + "tcId": 2425, + "dkm": "b87f2a5c669c251e3e08ead64f9704125aa9a26a32a7b25623497a083fc3d525cf5b6097a98a14843bd0c882c28ddde46db1bea4afac2862fb6e88c06a6daac1c07562b3bad30642e6d70a94e6ace51cdf9f01ecd366873912b76380794d04b9e77443c674d37086f5c0832038f1946a1259dc9718831e6a39dfea2b014e32f9" + } + ] + }, + { + "tgId": 98, + "tests": [ + { + "tcId": 2450, + "dkm": "48499776ae8d761b185d4ba87da4eddc2fa85e650f5f123e977cc7c6f71f35b3c8a8b32fbd03b8e2cf3d81cd23e6e20272981198a8a8498380cb87d023ecec20a877932af5fc0ecb9df623fae201196b9aac658950c3a1dcf429e9e872e019c39fafec2b49461edb37538db923806371eb558242d7c7cecdba46bad3ef3175f0" + } + ] + }, + { + "tgId": 99, + "tests": [ + { + "tcId": 2475, + "dkm": "93177f04543f431cdb6b5f5bf4edded1f8b3419099986d5475d741916d6ee8592d15b5702e82fdadbb10be34dbafe3bb4683e08c00a9ec48338a99e14e49ff8cadc9dffcae9d79af1f39a6fdd5b3ae799d9af7a40fa3c8f7d7fd26ac6a1b95c18e70b096391b5a77776dc1f2f575ce353d2d259a498b08fc3b63d8bbb31f521d" + } + ] + }, + { + "tgId": 100, + "tests": [ + { + "tcId": 2500, + "dkm": "1030ce110aa845fd32bdbdc421cb03b3ba39a3d174fb6047039e161194c6e965a4e5233326f3c9195d1f7f26dcdaf00d5d14a94ea6afcb7819afae4946ce782eaef99c9f766795e1ff43d2ccfb6713ebecfc01e8ff89ab240a8f1f0ccad8f6bd3569b3ec2e4d3f0d8e46bfdc9ad2731176bc3410d99da9dd042636f3ffad9bb2" + } + ] + }, + { + "tgId": 101, + "tests": [ + { + "tcId": 2515, + "testPassed": true + } + ] + }, + { + "tgId": 102, + "tests": [ + { + "tcId": 2530, + "testPassed": true + } + ] + }, + { + "tgId": 103, + "tests": [ + { + "tcId": 2545, + "testPassed": true + } + ] + }, + { + "tgId": 104, + "tests": [ + { + "tcId": 2560, + "testPassed": true + } + ] + }, + { + "tgId": 105, + "tests": [ + { + "tcId": 2575, + "testPassed": true + } + ] + }, + { + "tgId": 106, + "tests": [ + { + "tcId": 2590, + "testPassed": true + } + ] + }, + { + "tgId": 107, + "tests": [ + { + "tcId": 2605, + "testPassed": true + } + ] + }, + { + "tgId": 108, + "tests": [ + { + "tcId": 2620, + "testPassed": true + } + ] + }, + { + "tgId": 109, + "tests": [ + { + "tcId": 2635, + "testPassed": true + } + ] + }, + { + "tgId": 110, + "tests": [ + { + "tcId": 2650, + "testPassed": true + } + ] + }, + { + "tgId": 111, + "tests": [ + { + "tcId": 2665, + "testPassed": false + } + ] + }, + { + "tgId": 112, + "tests": [ + { + "tcId": 2680, + "testPassed": true + } + ] + }, + { + "tgId": 113, + "tests": [ + { + "tcId": 2695, + "testPassed": true + } + ] + }, + { + "tgId": 114, + "tests": [ + { + "tcId": 2710, + "testPassed": true + } + ] + }, + { + "tgId": 115, + "tests": [ + { + "tcId": 2725, + "testPassed": false + } + ] + }, + { + "tgId": 116, + "tests": [ + { + "tcId": 2740, + "testPassed": true + } + ] + }, + { + "tgId": 117, + "tests": [ + { + "tcId": 2755, + "testPassed": false + } + ] + }, + { + "tgId": 118, + "tests": [ + { + "tcId": 2770, + "testPassed": true + } + ] + }, + { + "tgId": 119, + "tests": [ + { + "tcId": 2785, + "testPassed": true + } + ] + }, + { + "tgId": 120, + "tests": [ + { + "tcId": 2800, + "testPassed": true + } + ] + }, + { + "tgId": 121, + "tests": [ + { + "tcId": 2815, + "testPassed": true + } + ] + }, + { + "tgId": 122, + "tests": [ + { + "tcId": 2830, + "testPassed": true + } + ] + }, + { + "tgId": 123, + "tests": [ + { + "tcId": 2845, + "testPassed": true + } + ] + }, + { + "tgId": 124, + "tests": [ + { + "tcId": 2860, + "testPassed": true + } + ] + }, + { + "tgId": 125, + "tests": [ + { + "tcId": 2875, + "testPassed": true + } + ] + }, + { + "tgId": 126, + "tests": [ + { + "tcId": 2890, + "testPassed": true + } + ] + }, + { + "tgId": 127, + "tests": [ + { + "tcId": 2905, + "testPassed": true + } + ] + }, + { + "tgId": 128, + "tests": [ + { + "tcId": 2920, + "testPassed": true + } + ] + }, + { + "tgId": 129, + "tests": [ + { + "tcId": 2935, + "testPassed": true + } + ] + }, + { + "tgId": 130, + "tests": [ + { + "tcId": 2950, + "testPassed": true + } + ] + }, + { + "tgId": 131, + "tests": [ + { + "tcId": 2965, + "testPassed": true + } + ] + }, + { + "tgId": 132, + "tests": [ + { + "tcId": 2980, + "testPassed": true + } + ] + }, + { + "tgId": 133, + "tests": [ + { + "tcId": 2995, + "testPassed": true + } + ] + }, + { + "tgId": 134, + "tests": [ + { + "tcId": 3010, + "testPassed": true + } + ] + }, + { + "tgId": 135, + "tests": [ + { + "tcId": 3025, + "testPassed": true + } + ] + }, + { + "tgId": 136, + "tests": [ + { + "tcId": 3040, + "testPassed": true + } + ] + }, + { + "tgId": 137, + "tests": [ + { + "tcId": 3055, + "testPassed": true + } + ] + }, + { + "tgId": 138, + "tests": [ + { + "tcId": 3070, + "testPassed": true + } + ] + }, + { + "tgId": 139, + "tests": [ + { + "tcId": 3085, + "testPassed": true + } + ] + }, + { + "tgId": 140, + "tests": [ + { + "tcId": 3100, + "testPassed": true + } + ] + }, + { + "tgId": 141, + "tests": [ + { + "tcId": 3115, + "testPassed": false + } + ] + }, + { + "tgId": 142, + "tests": [ + { + "tcId": 3130, + "testPassed": true + } + ] + }, + { + "tgId": 143, + "tests": [ + { + "tcId": 3145, + "testPassed": false + } + ] + }, + { + "tgId": 144, + "tests": [ + { + "tcId": 3160, + "testPassed": true + } + ] + }, + { + "tgId": 145, + "tests": [ + { + "tcId": 3175, + "testPassed": true + } + ] + }, + { + "tgId": 146, + "tests": [ + { + "tcId": 3190, + "testPassed": true + } + ] + }, + { + "tgId": 147, + "tests": [ + { + "tcId": 3205, + "testPassed": true + } + ] + }, + { + "tgId": 148, + "tests": [ + { + "tcId": 3220, + "testPassed": true + } + ] + }, + { + "tgId": 149, + "tests": [ + { + "tcId": 3235, + "testPassed": false + } + ] + }, + { + "tgId": 150, + "tests": [ + { + "tcId": 3250, + "testPassed": true + } + ] + }, + { + "tgId": 151, + "tests": [ + { + "tcId": 3265, + "testPassed": true + } + ] + }, + { + "tgId": 152, + "tests": [ + { + "tcId": 3280, + "testPassed": true + } + ] + }, + { + "tgId": 153, + "tests": [ + { + "tcId": 3295, + "testPassed": false + } + ] + }, + { + "tgId": 154, + "tests": [ + { + "tcId": 3310, + "testPassed": true + } + ] + }, + { + "tgId": 155, + "tests": [ + { + "tcId": 3325, + "testPassed": true + } + ] + }, + { + "tgId": 156, + "tests": [ + { + "tcId": 3340, + "testPassed": true + } + ] + }, + { + "tgId": 157, + "tests": [ + { + "tcId": 3355, + "testPassed": true + } + ] + }, + { + "tgId": 158, + "tests": [ + { + "tcId": 3370, + "testPassed": false + } + ] + }, + { + "tgId": 159, + "tests": [ + { + "tcId": 3385, + "testPassed": true + } + ] + }, + { + "tgId": 160, + "tests": [ + { + "tcId": 3400, + "testPassed": false + } + ] + }, + { + "tgId": 161, + "tests": [ + { + "tcId": 3415, + "testPassed": false + } + ] + }, + { + "tgId": 162, + "tests": [ + { + "tcId": 3430, + "testPassed": false + } + ] + }, + { + "tgId": 163, + "tests": [ + { + "tcId": 3445, + "testPassed": true + } + ] + }, + { + "tgId": 164, + "tests": [ + { + "tcId": 3460, + "testPassed": true + } + ] + }, + { + "tgId": 165, + "tests": [ + { + "tcId": 3475, + "testPassed": true + } + ] + }, + { + "tgId": 166, + "tests": [ + { + "tcId": 3490, + "testPassed": true + } + ] + }, + { + "tgId": 167, + "tests": [ + { + "tcId": 3505, + "testPassed": false + } + ] + }, + { + "tgId": 168, + "tests": [ + { + "tcId": 3520, + "testPassed": true + } + ] + }, + { + "tgId": 169, + "tests": [ + { + "tcId": 3535, + "testPassed": true + } + ] + }, + { + "tgId": 170, + "tests": [ + { + "tcId": 3550, + "testPassed": true + } + ] + }, + { + "tgId": 171, + "tests": [ + { + "tcId": 3565, + "testPassed": true + } + ] + }, + { + "tgId": 172, + "tests": [ + { + "tcId": 3580, + "testPassed": false + } + ] + }, + { + "tgId": 173, + "tests": [ + { + "tcId": 3595, + "testPassed": true + } + ] + }, + { + "tgId": 174, + "tests": [ + { + "tcId": 3610, + "testPassed": true + } + ] + }, + { + "tgId": 175, + "tests": [ + { + "tcId": 3625, + "testPassed": true + } + ] + }, + { + "tgId": 176, + "tests": [ + { + "tcId": 3640, + "testPassed": false + } + ] + }, + { + "tgId": 177, + "tests": [ + { + "tcId": 3655, + "testPassed": true + } + ] + }, + { + "tgId": 178, + "tests": [ + { + "tcId": 3670, + "testPassed": true + } + ] + }, + { + "tgId": 179, + "tests": [ + { + "tcId": 3685, + "testPassed": true + } + ] + }, + { + "tgId": 180, + "tests": [ + { + "tcId": 3700, + "testPassed": true + } + ] + }, + { + "tgId": 181, + "tests": [ + { + "tcId": 3715, + "testPassed": false + } + ] + }, + { + "tgId": 182, + "tests": [ + { + "tcId": 3730, + "testPassed": true + } + ] + }, + { + "tgId": 183, + "tests": [ + { + "tcId": 3745, + "testPassed": true + } + ] + }, + { + "tgId": 184, + "tests": [ + { + "tcId": 3760, + "testPassed": true + } + ] + }, + { + "tgId": 185, + "tests": [ + { + "tcId": 3775, + "testPassed": true + } + ] + }, + { + "tgId": 186, + "tests": [ + { + "tcId": 3790, + "testPassed": true + } + ] + }, + { + "tgId": 187, + "tests": [ + { + "tcId": 3805, + "testPassed": true + } + ] + }, + { + "tgId": 188, + "tests": [ + { + "tcId": 3820, + "testPassed": true + } + ] + }, + { + "tgId": 189, + "tests": [ + { + "tcId": 3835, + "testPassed": true + } + ] + }, + { + "tgId": 190, + "tests": [ + { + "tcId": 3850, + "testPassed": false + } + ] + }, + { + "tgId": 191, + "tests": [ + { + "tcId": 3865, + "testPassed": false + } + ] + }, + { + "tgId": 192, + "tests": [ + { + "tcId": 3880, + "testPassed": true + } + ] + }, + { + "tgId": 193, + "tests": [ + { + "tcId": 3895, + "testPassed": true + } + ] + }, + { + "tgId": 194, + "tests": [ + { + "tcId": 3910, + "testPassed": true + } + ] + }, + { + "tgId": 195, + "tests": [ + { + "tcId": 3925, + "testPassed": true + } + ] + }, + { + "tgId": 196, + "tests": [ + { + "tcId": 3940, + "testPassed": true + } + ] + }, + { + "tgId": 197, + "tests": [ + { + "tcId": 3955, + "testPassed": true + } + ] + }, + { + "tgId": 198, + "tests": [ + { + "tcId": 3970, + "testPassed": true + } + ] + }, + { + "tgId": 199, + "tests": [ + { + "tcId": 3985, + "testPassed": true + } + ] + }, + { + "tgId": 200, + "tests": [ + { + "tcId": 4000, + "testPassed": true + } + ] + } + ] + } + ]'''; + return jsonDecode(s); +} + +dynamic loadReq() { + const s = '''[ + { + "acvVersion": "1.0" + }, + { + "vsId": 0, + "algorithm": "KDA", + "mode": "OneStep", + "revision": "Sp800-56Cr2", + "isSample": false, + "testGroups": [ + { + "tgId": 1, + "testType": "AFT", + "tests": [ + { + "tcId": 25, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B64F3834145B4AF4D7546B8ED02A8DB", + "z": "1BF8EA239681318628AB5BCBC77BB0B9DC4AAC1DA962081FBCC3A784457467EB", + "l": 1024, + "algorithmId": "10FB2871079C920E7C2C684B317FFB6F" + }, + "fixedInfoPartyU": { + "partyId": "032FCBE3B0CD45E5348BB5B4091B112D", + "ephemeralData": "01BA44FB8D85E24725042841910C7C471034992C2553BF4BBB90BF9D77D38768" + }, + "fixedInfoPartyV": { + "partyId": "ACB80E38F5684D8B5290A32463BB2C7E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 2, + "testType": "AFT", + "tests": [ + { + "tcId": 50, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF35CD3A9C48EFD79843696642474249", + "z": "30787B306339F9C5C790012C4D4884B6CCCBF241BEF54B117216CE4010", + "l": 1024, + "algorithmId": "01E7F3FE3CBC5FDF2487786753C9A6A2" + }, + "fixedInfoPartyU": { + "partyId": "76248351F6378ED024BD2CCC2A12E9EB", + "ephemeralData": "9AC99D7C23C68900A1E058D2C5D39541B394474A28A4CC0E4E006A21CC" + }, + "fixedInfoPartyV": { + "partyId": "76E2A38545DA9D2F0D5A64EBC2D44176", + "ephemeralData": "9A7E3595C53ADDC8D27208B20A0371D1DDA397CBD695CBB18B23A24C1D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 3, + "testType": "AFT", + "tests": [ + { + "tcId": 75, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACA10B0C5446BC50BC7E34251DA891F0", + "z": "AAF0683D11AB7037AE0372A62FE249208E93B944A73561A01B7CEC08B03EAF", + "l": 1024, + "algorithmId": "D1B5418A91EA96FEB644AFFA6267EE6C" + }, + "fixedInfoPartyU": { + "partyId": "033A8CEFBC077573E5AD904BE23EF4F2" + }, + "fixedInfoPartyV": { + "partyId": "7037DE6B40987890AB39FBDB290B262E", + "ephemeralData": "9708A41517BB3704F91780E4420E54A835ABBE476A30BCFD9B8F42B07A4FB4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 4, + "testType": "AFT", + "tests": [ + { + "tcId": 100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A1FC7EB91CE33D3F437629109AFA169", + "z": "5F11BC320E8512B849ADACB62220CFE44649F0E2F4B679996863D7B713103F97FD4E", + "l": 1024, + "algorithmId": "7CDAE02EB69930841EA053468C3EE40E" + }, + "fixedInfoPartyU": { + "partyId": "DD51DF3DBDC829A6D8E9556B9B493067" + }, + "fixedInfoPartyV": { + "partyId": "68DD365451A55AC692EA472B194FE2A5", + "ephemeralData": "E655EBF3518644FAA5085EE83B45C1D98DC6A7C0D90BEFE48D7C48E58FDAAEA7B28C" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 5, + "testType": "AFT", + "tests": [ + { + "tcId": 125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B30C52A303301C81A0085F15FA0589AC", + "z": "1205B653C6CD1BA4C8B76B17D27464F8A16C08B7B7995A976E3C11CCE9", + "l": 1024, + "algorithmId": "CA1287958031C15B4822432238F4CF2D" + }, + "fixedInfoPartyU": { + "partyId": "565D436C2E145BD576C8977EB409A41E", + "ephemeralData": "8856BBFCFE9C6123B8FF12998654E01A7543B144EB54E78C31BBB789FF" + }, + "fixedInfoPartyV": { + "partyId": "165293602217EC574E2D542B76BD615B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 6, + "testType": "AFT", + "tests": [ + { + "tcId": 150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD8395D0D5D3EA36EA039CC1372CDA54", + "z": "32842C04A238C17541028C9127AF587CD929E0E06CEF7C0066D551817FCBF4217CE55773", + "l": 1024, + "algorithmId": "A9941C8AF8E987370897482B397794C4" + }, + "fixedInfoPartyU": { + "partyId": "EFF566FBBAEA9CC66FB5AD0E60881837" + }, + "fixedInfoPartyV": { + "partyId": "F7D4623319C0098AF294EBBDA81A40AA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 7, + "testType": "AFT", + "tests": [ + { + "tcId": 175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3360CC690ED0A9D23EF80F4F5C8B412", + "z": "3B7EC31D6DE1634ADD5F277DC591E5CA147FF4B8FBA65E8ADAABEA94CF60360DED80A15434", + "l": 1024, + "algorithmId": "7E18DCD3F8C0A4ED2ADACB69C4A0B512" + }, + "fixedInfoPartyU": { + "partyId": "170E9447AB124944955F25687E059097", + "ephemeralData": "10598EB6C955B596B4143481FB86A4AC00EF27646BE0C6BD3D09318582D6E670BB106E6A8E" + }, + "fixedInfoPartyV": { + "partyId": "E630DBCB4C8B068C2EA0E5A71E1FDB2B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 8, + "testType": "AFT", + "tests": [ + { + "tcId": 200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DE332785972E61F396FEBCB88F357A5", + "z": "895AD23570BBCA0EEF43F285186F4FFDAA84DF8A27C0B1BE80335CDB", + "l": 1024, + "algorithmId": "B499261334E732C56117D0707A0BA55C" + }, + "fixedInfoPartyU": { + "partyId": "ECFDCC96F3F518F3B7599A4E92E9BE5D", + "ephemeralData": "FC6C24B8F6635BF1F5CCC93656EB4AC2A0103EF4EE86D35A76D03BC4" + }, + "fixedInfoPartyV": { + "partyId": "5B5AA463EB02128A977109CECD42584F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 9, + "testType": "AFT", + "tests": [ + { + "tcId": 225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6C9BE91BD9063CACD0225A512EA57D8", + "z": "9AC9BA8EC148DED62B541386286DE87064AA52710C4954B1FDA5C00BF233", + "l": 1024, + "algorithmId": "922612EF30918C84E7575A1E598E4B04" + }, + "fixedInfoPartyU": { + "partyId": "B0B398C996A5DBEC6507FCFCEAC3C656" + }, + "fixedInfoPartyV": { + "partyId": "8AF76EE3782C1C0752B537694FA8F366" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 10, + "testType": "AFT", + "tests": [ + { + "tcId": 250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C248C79B545BD08D8CD635B55907B062", + "z": "19A24F3901CF12E1D0549B126112D402DD5C463C2EE20E673682397D8C", + "l": 1024, + "algorithmId": "DE8A449FA3183E8AF6767473DCC6D704" + }, + "fixedInfoPartyU": { + "partyId": "EF792A24A2FAA8080B221755F5C35B22", + "ephemeralData": "B2A06A5907B2EB886682E10CC96B18FC806A6AAAF2F32B88F348FB8AAE" + }, + "fixedInfoPartyV": { + "partyId": "B86C630297D32FD0A7C48A87DF99B7AB" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 11, + "testType": "AFT", + "tests": [ + { + "tcId": 275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CE49A7F635E5EFD4AF99F9A3292F057", + "z": "62037F5E4203852D744D5FC3CEC4B49E9536F28B4A0D206C2FBC283AC5B360907AA5", + "l": 1024, + "algorithmId": "4D2F37ECF8CEE71ADEA561E42BBF47FF" + }, + "fixedInfoPartyU": { + "partyId": "6BD3B23DD9336B766AB6919ACEA77252" + }, + "fixedInfoPartyV": { + "partyId": "1DECD07924B4973E1330B6D7A730FCE9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 12, + "testType": "AFT", + "tests": [ + { + "tcId": 300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E24A0B8CD8189D45D4B38F0D2D4AA50", + "z": "69D9B9665F56083A5731A3F8A4FA132187FBB5317B330929728CFB091BACEA", + "l": 1024, + "algorithmId": "F8BA86FFC5F01EF122A73BF034B45472" + }, + "fixedInfoPartyU": { + "partyId": "A81ABCBCC8AA37C3FDB16A52DB72F951", + "ephemeralData": "7D9B69F8C0E0FD62B7341F423729CA30700C2CA401E154B8DA2CFBBEBA5F01" + }, + "fixedInfoPartyV": { + "partyId": "9658AF89FD2398CD55AB1F596486AEED", + "ephemeralData": "B22E37FCAA69D41F1116A7A6F61364B94EE16B1BC158A8CCB965E292F2983A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 13, + "testType": "AFT", + "tests": [ + { + "tcId": 325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B52C20D0CD7BC4D5A3F62CABAB35B718", + "z": "628E98E6BD0F8D683F0DE441F6B7BF1674F666569D5F7053079FE22FA6", + "l": 1024, + "algorithmId": "A4DE1EF74297AC65D93DDE536D89B33C" + }, + "fixedInfoPartyU": { + "partyId": "C6540DD647C49C3F3CC79BE27F44096F", + "ephemeralData": "C61FA5B67BF77A9177224D2DFDE1BB21E1D2A23D751F3B8ED7C405BE2F" + }, + "fixedInfoPartyV": { + "partyId": "255E6C60087A989E89D9B7BD49385B69", + "ephemeralData": "19D3955E58E269238969E20C591CE921490E449D88A407DFD865097B5E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 14, + "testType": "AFT", + "tests": [ + { + "tcId": 350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56CB32FB279349AA5BB5B62A2304F691", + "z": "BEE5A31229A11D0DE1256973148ACC02371954F009BFF372C7E4E9DE74", + "l": 1024, + "algorithmId": "DCB4394441443C4B52D4522F4E6EDE58" + }, + "fixedInfoPartyU": { + "partyId": "62391A44021E15CF5065CCED711957AC", + "ephemeralData": "234B5E443A663649A83A995C010DCFB4BB48C06774A5C88713087DA724" + }, + "fixedInfoPartyV": { + "partyId": "A56579CB51CF99B568FBEE8E3EE4F39D", + "ephemeralData": "E9CAC24BA5D3C52C09DC73D6827D29CECD1771DAF228A0BE43F44F6114" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 15, + "testType": "AFT", + "tests": [ + { + "tcId": 375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41ADA75D49B7C3ADE7F6FB686EB99CDC", + "z": "BEA360227913C644862225838BA3C0E91AD2EA93BE65E0EEF6BC8161BAA94707", + "l": 1024, + "algorithmId": "37D4D53B5447326601AAD93DC1AD3B82" + }, + "fixedInfoPartyU": { + "partyId": "C25338968880C3DF5AD6192BF44C0684", + "ephemeralData": "730CEF99A5BFAB48EAD0EFDD9E8D39A63C8DD3436D9A762224E1BD22049C609C" + }, + "fixedInfoPartyV": { + "partyId": "F09CED3BA309CF6B4862BA0700868851", + "ephemeralData": "0F5BAE2DE60E3244D7EC358C4CBA1C2769338A3CFD76BCB28FAD1324C6FEF04B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 16, + "testType": "AFT", + "tests": [ + { + "tcId": 400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8B5AAA7F3EA4AAEB464DB6EAE679902", + "z": "A1FB15E9A1382EEC6752DCB8C851DE39C5FCF5392820E21B58369F94", + "l": 1024, + "algorithmId": "91C1FBFE4D1251ADE3654FECA9CA4D7C" + }, + "fixedInfoPartyU": { + "partyId": "79743E781F7668C45FB92A9B033B7164", + "ephemeralData": "665003F1250F2AF9B9C7C47EE7056F956765FB4E57CA3A22F9D07A9E" + }, + "fixedInfoPartyV": { + "partyId": "2F4DAB703641A82B9A4AC2BFB9AEEE33", + "ephemeralData": "82D6BC6A24D3A7AB4D5F2464EA1F07AB6B74E5BFAD79F93770F82FF8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 17, + "testType": "AFT", + "tests": [ + { + "tcId": 425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96F88CA5C403E3CFA6F679C8630DB0DE", + "z": "1FA927837881B569C2CE1E139124C1F5DC35168677BE24063D57F75C1A36A2AC5AF3824D64", + "l": 1024, + "algorithmId": "7A88A2F78B19710D5B2EC5B2EEB9879D" + }, + "fixedInfoPartyU": { + "partyId": "761F4D44BEC9699F816C48D60E312095" + }, + "fixedInfoPartyV": { + "partyId": "7ADFB9DF76A6B074D38D47625E8B6EBA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 18, + "testType": "AFT", + "tests": [ + { + "tcId": 450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B52D689A12D31B54F76B276C68E0C35D", + "z": "9D70197C78EEA1A335FAB361680D9A605641139CA641FABF1B60D4F6677554FB3C8F23", + "l": 1024, + "algorithmId": "6FCBEBCBC12647E4120174BE8AF11E89" + }, + "fixedInfoPartyU": { + "partyId": "FF377513FCAB0C0C93EA5BE81ACFAE3B" + }, + "fixedInfoPartyV": { + "partyId": "89A59EE7E554C43F5A48DB27161BCD12", + "ephemeralData": "0B6F72066D24AE9597A8C086D31487554B6A1FEF6A2D22FE07555B79AF046E2644ED6A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 19, + "testType": "AFT", + "tests": [ + { + "tcId": 475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "264F333988614DA3D3FA2A284FF647DF", + "z": "DBC80A3EBF01743DA64716D31C20E96A21C091B707564D03990E3B3599D5", + "l": 1024, + "algorithmId": "0078ADD8F2F8CF0019642A57E292FB9E" + }, + "fixedInfoPartyU": { + "partyId": "687320F9A84346F13D773E1CD27FCDE0" + }, + "fixedInfoPartyV": { + "partyId": "84F95A4F3AC15B2FDE395F1D6777E282" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 20, + "testType": "AFT", + "tests": [ + { + "tcId": 500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED70DCCFAF34388B676FF04E2E48B00E", + "z": "198CF883131037C064193C171A3C189FF669FFBDEFFCCE06F4E1AD0E82BB65E0", + "l": 1024, + "algorithmId": "3BE412B4E1341AF55CA8B84C9C9F3055" + }, + "fixedInfoPartyU": { + "partyId": "8CAA7FF3802854CF612C62564E0046AA" + }, + "fixedInfoPartyV": { + "partyId": "410D71CE9CD7C1564CA4D5559FB6103E", + "ephemeralData": "1AE200C454A000015C705579D5E84444838D41719814C34BDBEC3D9F1BFE7644" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 21, + "testType": "AFT", + "tests": [ + { + "tcId": 525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04843A194E339B2C2D4F58DC1F8282B6", + "z": "442CF3FBC215F476789F9D6A094C0476861E127D0903983C63157E23A1F4", + "l": 1024, + "algorithmId": "AD5C7E50F0AA4F37BB92608F27F0654D" + }, + "fixedInfoPartyU": { + "partyId": "3DDBD31CE9455298DE5AAEFBA6CBFDA1" + }, + "fixedInfoPartyV": { + "partyId": "6C486852682F2A7B64E7CF10012E25A6", + "ephemeralData": "46762B848041E42D9142FDCE54B4D819A35CB55718706DAAC78A78467F67" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 22, + "testType": "AFT", + "tests": [ + { + "tcId": 550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CC1DE8490813BB843DC8DF67D58C853", + "z": "B333DDEBD8D52213E3475A929913C51E0AB18E4C508F672064B6EC86A7", + "l": 1024, + "algorithmId": "9F0CB116987B8552C45A356E952FB562" + }, + "fixedInfoPartyU": { + "partyId": "FEAA2CC961333A55C590F1EEC47340C9", + "ephemeralData": "E52657434D352C1CED1B0B87DB334378DD166493A97A84F2F76E759938" + }, + "fixedInfoPartyV": { + "partyId": "2C5D4549EE4ED245BE43B3ADD777E61A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 23, + "testType": "AFT", + "tests": [ + { + "tcId": 575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D55DBDDB933643C97D399E8324F5E727", + "z": "7F4FC66C04F5277C310E1E9352DAF4FA4CDA2800E70FB516F0B2E955", + "l": 1024, + "algorithmId": "8C81CFCD706057A2D71B29C31843A5A3" + }, + "fixedInfoPartyU": { + "partyId": "5A230ED77175911CE41B8BF9E4FC88F2", + "ephemeralData": "A80135F6D96F52F52B78F48F665083ADF42E582CAFBCFFE469D582ED" + }, + "fixedInfoPartyV": { + "partyId": "32CD353F880E1679447F419A036E599C", + "ephemeralData": "E679EC0C036C592AEAD21214FDAE73FC129ACD2EAB19470B250E6FEF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 24, + "testType": "AFT", + "tests": [ + { + "tcId": 600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "698D83A36220441BDE2E0355D524160B", + "z": "99519647059E35FC9F669E71FB530736552F02A9538F7F383492C8BE23", + "l": 1024, + "algorithmId": "6D26BD20F7A5B458050AB995B22633A1" + }, + "fixedInfoPartyU": { + "partyId": "00AB829496D33893F561D33B26D562A8", + "ephemeralData": "CFCB38675EA5631A082D46AAF62EA2ED8D2A8826CA27E53167CC3DE488" + }, + "fixedInfoPartyV": { + "partyId": "D9AC70FFEF3041CC13B1BE069D8A7A0A", + "ephemeralData": "3E1569291AF02E868CFEACC0571AF9FF6D97816EF7D264D79E68314B06" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 25, + "testType": "AFT", + "tests": [ + { + "tcId": 625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F8186F82C6373C04CEC6278340BBD3F", + "z": "3B9A9F26F4A47AD17445D50F60BFFF300EEF439328721655C540DD7F54BB9A59", + "l": 1024, + "algorithmId": "53F6F276C09302C293CB896864C6BED6" + }, + "fixedInfoPartyU": { + "partyId": "7CB9C4EF61DE457C62D3A237DC672381" + }, + "fixedInfoPartyV": { + "partyId": "7CB69F4C3805824754836021C7F9FC54", + "ephemeralData": "28A63029CE1FEF87E3C36073A1A2D16F27C10D84E4F7C9E35D2B8DD712DC6FA6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 26, + "testType": "AFT", + "tests": [ + { + "tcId": 650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE1627DFA04640538BF88FB8C4C1E7F2", + "z": "3B82C274D19EC314E5A046508D000EB54AC605B7E082B043AC58E5D887", + "l": 1024, + "algorithmId": "1FDDF93C4806BFAF81B682C215FFC92E" + }, + "fixedInfoPartyU": { + "partyId": "8A01E33F36AF73841463C138A987A116", + "ephemeralData": "6997DD08ECAAF4121D7D15CA462E803887461573E876E08F1345319D40" + }, + "fixedInfoPartyV": { + "partyId": "4E4D5032A61203F55024339F14C230A6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 27, + "testType": "AFT", + "tests": [ + { + "tcId": 675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26C278F33C2281C5ADE6EB32A69BB5F6", + "z": "A939B88E60B8CCA64ED158A38A57A58D33B948B0C1072ECDA9A2439C9D928811", + "l": 1024, + "algorithmId": "509E4445BD6C68212DF5B1E17E798C39" + }, + "fixedInfoPartyU": { + "partyId": "7CFC24E304D8F112B3B301B1BCAB45A5" + }, + "fixedInfoPartyV": { + "partyId": "F4151B418AD0F744B6B98237204DAFEF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 28, + "testType": "AFT", + "tests": [ + { + "tcId": 700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65F0175B9F3C1DE20374ECD0F749A3F2", + "z": "D0A212FF1B6FAEFF25D8548FBD40E91C77201C50A7D87B2D41E4EF24F63867806999", + "l": 1024, + "algorithmId": "D086CB716536922A5ABBABCBE2294C40" + }, + "fixedInfoPartyU": { + "partyId": "1FCC3B2AF9BF8E135A7EFB971F4A07CC", + "ephemeralData": "9B4FE1C4FADE9500AAE66A20E001D148DA08D91A42C97F76F7138F2CDADB2507FBE3" + }, + "fixedInfoPartyV": { + "partyId": "20A44C4ADA0804848F1E2DF0AB9A171B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 29, + "testType": "AFT", + "tests": [ + { + "tcId": 725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2812955D422835863B534EDF02100D7", + "z": "7CD9DFE200D1A121ED1F2D0BF2F147A85E83830F6AFEF2A53A0DF7DD7E", + "l": 1024, + "algorithmId": "4DE7170B5EF9F08E5DE49F5C3846B606" + }, + "fixedInfoPartyU": { + "partyId": "B1DE86230E3213DA1F2DDF576E65070F" + }, + "fixedInfoPartyV": { + "partyId": "18C5580C263B5DB462FC4AE1313CB005", + "ephemeralData": "F9F281A20B68BD2E4A9D2EDCCE1FC39ACA10FAF818D119C806151E075A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 30, + "testType": "AFT", + "tests": [ + { + "tcId": 750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "372753ECB01BDC455719E978A1EAB9C6", + "z": "5C45ED71C0FA7F89A36CF79A8E7DD6BB20D7460E336D0513EDADE77549EAE6", + "l": 1024, + "algorithmId": "D2A72E1D0A37FC0749F5084E06529872" + }, + "fixedInfoPartyU": { + "partyId": "110BB60A9BD6CB18EA31E53224FFD5B3", + "ephemeralData": "D398D020CE7692A4D6EDB346387F11C0267CECECF5BF46793F8CC56FDA5FBC" + }, + "fixedInfoPartyV": { + "partyId": "2BFE3C25EBAAC048EEED6B8DB453E974", + "ephemeralData": "68B1020886EF90235499C7990280ECAEA91EBD4EDC3589CEBACAD236F9DBB0" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 31, + "testType": "AFT", + "tests": [ + { + "tcId": 775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB5B8FD561776B7DF0D6031624F2A88A", + "z": "BF3345DB956EF97681F5A9848F35CDFAF57ECEF84ACEB1F862684DB3CBEDB250CB", + "l": 1024, + "algorithmId": "9D8EDB5E57501BC31B3C0DDA766757F8" + }, + "fixedInfoPartyU": { + "partyId": "9D84A507511DC28A5BD7D2A1280E8BA4", + "ephemeralData": "D174D079A38BC205D9F6285456BF6CA60F7EB286D2DEBA546CBDA6461B26C2DA6B" + }, + "fixedInfoPartyV": { + "partyId": "6B3BB77D1C7D346B67458899716B6F9C", + "ephemeralData": "20864D5CD9AA1FEA58271D760C4716350D4583F3191B84164CCBB117A2DD18FFF8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 32, + "testType": "AFT", + "tests": [ + { + "tcId": 800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3DE425B2C570DA56962DF66B0BDCBAB5", + "z": "4DCA2CB91BB7D5EB2E4682B23D23EF0E71A6189FAAB7D890BA340DD423F3", + "l": 1024, + "algorithmId": "261455D9681A850502133A0710B1E4CC" + }, + "fixedInfoPartyU": { + "partyId": "1457C154032AFBF20681B674DCA1DF4F" + }, + "fixedInfoPartyV": { + "partyId": "0E63001956FE38C5F7627374A280CCE5", + "ephemeralData": "D8B0837EAFE53F6CDAAB4A60D42AA37E29DA4258B74B1C6E58FCCA77C05A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 33, + "testType": "AFT", + "tests": [ + { + "tcId": 825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F19D6BB7CC939B14A8CA0470B0B9388", + "z": "EB8BF02B2530484784ACA70B0EECF130481170CEE06FD24240FD44DA966315", + "l": 1024, + "algorithmId": "B9AB52077157F116A607BA65D77BD4E8" + }, + "fixedInfoPartyU": { + "partyId": "D9BDBFD838C8528B74D0BCA45CC8D83F" + }, + "fixedInfoPartyV": { + "partyId": "475215D813924EDE68E70EC8CE8A99F0", + "ephemeralData": "3CB3603D6DC5F3E0C9761D01573A84578A88AC74DFB883782174A4B5A8F6A1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 34, + "testType": "AFT", + "tests": [ + { + "tcId": 850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7AA75BDB6185F64651A71E759EADAA90", + "z": "196DD729508211A13489E75CDC91AC979828C5AAF28AB3D6AAF412F53D5C", + "l": 1024, + "algorithmId": "5E362C734378BD04137AF2CD6FA22A2F" + }, + "fixedInfoPartyU": { + "partyId": "E2748314F9D4E56A243635E6FE15A838" + }, + "fixedInfoPartyV": { + "partyId": "46FE81A38FE49C27F0C0FFFFCFD85EAE", + "ephemeralData": "C6945199BF0E55A9394995797B27A09C1D20901276716D7662B12AB001B9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 35, + "testType": "AFT", + "tests": [ + { + "tcId": 875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAF7BDC127FF791BA3D15346F6238BEC", + "z": "D8A4B01FAB13F9C9B24409B2FBC1375EA1823D40499BEC1B982D3FA7ED", + "l": 1024, + "algorithmId": "81FB4C818DB440D9ABECD71ECCC27C67" + }, + "fixedInfoPartyU": { + "partyId": "1606AD889ED1E9CD0DD9A0E9481CE9C4", + "ephemeralData": "A538C92EB45DBDB839215784C2486A78822BAD2418B3B30F2B3D42BD01" + }, + "fixedInfoPartyV": { + "partyId": "2C7CD19468D9989A61F21D5CFDF31B29" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 36, + "testType": "AFT", + "tests": [ + { + "tcId": 900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C0AD2175C169D72295E38A2FFB8F6DFF", + "z": "87CB8FBF8B3B415BB98D3520BFF0237F431B530DA9F695A32E92635EF9C2", + "l": 1024, + "algorithmId": "B31CB8A77926CAE806483566E2211ECB" + }, + "fixedInfoPartyU": { + "partyId": "907C8504F9C9D120B95AAEB6651DC691" + }, + "fixedInfoPartyV": { + "partyId": "CA146E07281D9E08337701B5D04557DE", + "ephemeralData": "18903C0FAE31A5C5DCB78637E010AAC4D5B5936B4F9F37C9D18CB5364717" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 37, + "testType": "AFT", + "tests": [ + { + "tcId": 925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "199EF8434387A2C4003E243372A6FECE", + "z": "F1C87DFC33CCB99F235A14F3C203B2241607F5D63972FCA5D688B6C7B92488", + "l": 1024, + "algorithmId": "0F32F625C9043A91340B049EF7CCF7C3" + }, + "fixedInfoPartyU": { + "partyId": "0A67EAC076002746596B3C0140EA9C99", + "ephemeralData": "B463E413CB7CAA47E715C60A3AA0813428DA55E90D19012E05AA353F91628B" + }, + "fixedInfoPartyV": { + "partyId": "F0705D220012E5F163B1371A7075C251", + "ephemeralData": "E9C515B425483CD0FD0D69DF26BC659E49F1DEB9944A7A76F6FF2D4A3E41D8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 38, + "testType": "AFT", + "tests": [ + { + "tcId": 950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18874CD15BB00B6D2E614B624E61E117", + "z": "38657E1BB2398689DE65E0901A6B9C2DE153F10C7EB305D2C81C60E5703C69", + "l": 1024, + "algorithmId": "F0A861C34DD3CE240AC12E262068E8D5" + }, + "fixedInfoPartyU": { + "partyId": "3C55CDAE498E19FA8FC2F087E3BA47D7", + "ephemeralData": "BC301C52771FDBD93C597036C5A67BA054AC69265EE75D0438F63266BF8229" + }, + "fixedInfoPartyV": { + "partyId": "9169630929DE8250A5D2A5FBF199FD31", + "ephemeralData": "75332F91B37400A8FA58BAD0292D2A2CE8E57F128AE645D0A906902633A839" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 39, + "testType": "AFT", + "tests": [ + { + "tcId": 975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "702723DAA37450CA2ED6DE48833ABBD1", + "z": "A2E4ABD5D3DFDD08073B1A48BD7B74B042E3FA1DA9C300C4031582E4", + "l": 1024, + "algorithmId": "CE0A5194AF94D435D74F64F3AFD9ABB1" + }, + "fixedInfoPartyU": { + "partyId": "4E6691F8D109073B11CB24AD12FDABEF" + }, + "fixedInfoPartyV": { + "partyId": "1B192D42A3076820E7BF5AB7D5567D93" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 40, + "testType": "AFT", + "tests": [ + { + "tcId": 1000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80BC818495495F65CF35ADE4BEAD66F1", + "z": "0C5B308497B15F158514B454A7E62B423014776BBA6B49254D4D4C82", + "l": 1024, + "algorithmId": "C91AABF131E8281B8A9B376CC100B945" + }, + "fixedInfoPartyU": { + "partyId": "6D53F2FBA8A4CC5DA5AE676C990506EE", + "ephemeralData": "0F8749417CDAC47A7164CC5EEDF4C9B59A236A366DD040A2783A8D05" + }, + "fixedInfoPartyV": { + "partyId": "FD352C34C54C9420A27EFE440B228A6C", + "ephemeralData": "80CACD524AB7561747AC00C0B95836BEB3411FFBEF269CBAAF03A70A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 41, + "testType": "AFT", + "tests": [ + { + "tcId": 1025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC25E399DE34F70CC805946BE55402D3", + "z": "6696E0329372063398359E7DDD64F50916D0E5BFF5CA87D66F2504F5E6AA", + "l": 1024, + "algorithmId": "BEAFEB724D9391E18144CBD73E5C779A" + }, + "fixedInfoPartyU": { + "partyId": "1FD4761ACD2B6399AAF58CA2C66CFEE8" + }, + "fixedInfoPartyV": { + "partyId": "F0F63D9192EFB311978666BB7A3FEDF5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 42, + "testType": "AFT", + "tests": [ + { + "tcId": 1050, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D9759FC4631970D7AE51B2A03827C7E", + "z": "67B0584D624E75E0996474D48C31A6B20DE611DCD47EF75694DDE5CE5A72BD0B58", + "l": 1024, + "algorithmId": "0FCFE4825AC5FF0A549493E5835B7F80" + }, + "fixedInfoPartyU": { + "partyId": "8531A66724D36FA596B0B55C27770278" + }, + "fixedInfoPartyV": { + "partyId": "47FE467A975879D9589784C066B34939", + "ephemeralData": "DDD5282AFE573B83CEDF7DB701FC0E1417C84439323FA065E79BF5FDB0BF9ADA5B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 43, + "testType": "AFT", + "tests": [ + { + "tcId": 1075, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBCB260D63A0333CCF9823E8D5AB6FB7", + "z": "31C21CA05E6040C2F643A9D72B5ED8FB525C15F2FB49E1A3FCA264691A1DDABF8642", + "l": 1024, + "algorithmId": "D1BB490BF40D8E43AEC20074FEC6DBCC" + }, + "fixedInfoPartyU": { + "partyId": "8A414085B680EC3246059CB3E18A84B2", + "ephemeralData": "56D5FF81708D28EBF818D25E9E7A8B6D49171E865B44042957279615AF177CF32BBB" + }, + "fixedInfoPartyV": { + "partyId": "97FA90EE42DC448C4A74D49AB4CFF1E5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 44, + "testType": "AFT", + "tests": [ + { + "tcId": 1100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD163C4CC64F97A4E36AEA2221A2C1C2", + "z": "C25410C348C12CE4D3173CB4A473DBB7BD8B768DE0479FD244E3E1AFCBAE3F", + "l": 1024, + "algorithmId": "EA1B5047A6C5CAC60E1A5F5BECA496CF" + }, + "fixedInfoPartyU": { + "partyId": "6DDC0ADA82CF7CDE096B849967C8B48A" + }, + "fixedInfoPartyV": { + "partyId": "4BC2809B2083E6DA27C06197D8EA98D9", + "ephemeralData": "FC43E8E89EBF3F0752F2E96978EA2F544FDAF9956C37C5696F322423AED956" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 45, + "testType": "AFT", + "tests": [ + { + "tcId": 1125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58F7A142F088AFEAB6F317DE2A88C3F4", + "z": "B98BAC79605D2E04AEA11182528228B657B3A9DAB085A9DFD547A8A8", + "l": 1024, + "algorithmId": "F1E1477F3D4116589FC5536875626C77" + }, + "fixedInfoPartyU": { + "partyId": "3450D73E4B110BFFD695E81FB75DD4CB" + }, + "fixedInfoPartyV": { + "partyId": "1D335CE74B795448FF306E352DC1009C", + "ephemeralData": "1B93D7B82D66968BCAACDDFC28DD2D7056007652AB93CE38FB4C05E5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 46, + "testType": "AFT", + "tests": [ + { + "tcId": 1150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "61C16483B4A89187F73C739379E83538", + "z": "49DD1585964978D5559293948B936C04818A114CE8FFD4B49DEE4E31", + "l": 1024, + "algorithmId": "32C838DCE9F7477A291CD1DA650DC20A" + }, + "fixedInfoPartyU": { + "partyId": "812D0035647D2B4A8DB8958516A56728" + }, + "fixedInfoPartyV": { + "partyId": "F69E175705B88C6BD1EF1F1DFD1BF2BA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 47, + "testType": "AFT", + "tests": [ + { + "tcId": 1175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F18C91E822055F815D4C20C4137C54B7", + "z": "5633CB249C4C2BDA03852C8FD56927FC1363DB26C26C8C309031344E55", + "l": 1024, + "algorithmId": "13B22DF0DD0DD58504385B924D81E86C" + }, + "fixedInfoPartyU": { + "partyId": "459D500FC7868381F9A1871C48F31C15" + }, + "fixedInfoPartyV": { + "partyId": "59656B95E8227AED0765584D9C378549" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 48, + "testType": "AFT", + "tests": [ + { + "tcId": 1200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FCF2F497B489FF55161F6DAECEF6EA7", + "z": "B9495AC6F29027947507ECFB30CE99FDE464CB45E1DDC54AEF33789FD675", + "l": 1024, + "algorithmId": "65E4FEDCE85BD422463592FABB43F21E" + }, + "fixedInfoPartyU": { + "partyId": "96B1F90F2A23B8326C5F05720B04F3FD", + "ephemeralData": "66DDC843FD6139F77258C651E3237BEF2940E877420048E23318ADAFA110" + }, + "fixedInfoPartyV": { + "partyId": "83E7C372C221BFE40C9AB8B505F9769A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 49, + "testType": "AFT", + "tests": [ + { + "tcId": 1225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3166302DDABFE44158E94EA4D4C9272", + "z": "3B12E3403344D8D0BC48DF469DCDFC8516179DF8ADEDD783BA733936", + "l": 1024, + "algorithmId": "B3AEA9CA2E136F6D6A05423A57F9CFC7" + }, + "fixedInfoPartyU": { + "partyId": "4C559EA49B30F43591F8505909682796" + }, + "fixedInfoPartyV": { + "partyId": "C49F7940F55DF35A1B22960D30488F78", + "ephemeralData": "9A5CFEEE4691890ACA54C8B6F7833117ACAE52673C0435BD0E35D016" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 50, + "testType": "AFT", + "tests": [ + { + "tcId": 1250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EF617F525664F2D9E920A03AA598FFF", + "z": "1A553FE22FFDF814F855B6BF9F6B6005C0EA314823BDA0E92EFA23FBDA", + "l": 1024, + "algorithmId": "D99BD3D49E0C17015EA880A46C80C108" + }, + "fixedInfoPartyU": { + "partyId": "D9BA879CEF15AAA1AFD8C3CD20EA6883", + "ephemeralData": "66A014FDBB8741F2CA47DFA0A34BAA4CCB2502C646A1613586FBEE27DD" + }, + "fixedInfoPartyV": { + "partyId": "D5FD877F8833FC1E66170487243E8C5C", + "ephemeralData": "BEACA384E492474301C439E93AC020883F66E6EBDD91DAE7F8A46B5ED6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 51, + "testType": "AFT", + "tests": [ + { + "tcId": 1275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB7595015F9A6C3E58A47A599B24158D", + "z": "9AA0FE8F0DC13B60D757B509BB7878BF3AFC93F0899AB0DEB6ADB9B094A234C6106A606A", + "l": 1024, + "algorithmId": "2F775DFA0AA905A3C39AFA44960DAD36" + }, + "fixedInfoPartyU": { + "partyId": "6D6E10D28E79EDCDA0EB9072596966F3" + }, + "fixedInfoPartyV": { + "partyId": "0FE0269FF77433CBDC1006AEE7F1EB3A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 52, + "testType": "AFT", + "tests": [ + { + "tcId": 1300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B770DEDD7CED74FE08737D18A3EBFC46", + "z": "18FCF197E48C1C49B534BCA3F83FC7378EF8128A81B7B9AFC8354DD02727", + "l": 1024, + "algorithmId": "1DFAA548E366FD7DE695EA6595ECFF9A" + }, + "fixedInfoPartyU": { + "partyId": "60F296EB314C7DE8ACD420BBAF8D9E09", + "ephemeralData": "C90370260F93F217D24985EC779FBDBE3150C1B4DE7283B33BE53D263C70" + }, + "fixedInfoPartyV": { + "partyId": "EA2042492CD96223DAD6B526D42C2AB2", + "ephemeralData": "881DAC8954C4E6090A7C94892BA97F4315D5AA33249DC6DA061F4C748E4B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 53, + "testType": "AFT", + "tests": [ + { + "tcId": 1325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BA5DF3F64078DF777A5E6794EB1A64E", + "z": "950E8A334E5E8E83B59D310E34BDFF3B96C4A24AF020B7254555B3944252B4", + "l": 1024, + "algorithmId": "E4F6843B0AB66BD1D57391C145D53369" + }, + "fixedInfoPartyU": { + "partyId": "D45AF559968B60F9316242E9557AC6F1" + }, + "fixedInfoPartyV": { + "partyId": "A89B11075405BE9C170A96AB8165CCF6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 54, + "testType": "AFT", + "tests": [ + { + "tcId": 1350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73B511DCC8FF9758CCFCB48EE965719D", + "z": "F473ECC707AA0BB27CF3E88A8A7A7CC6E078C37A53ECA12EC04041C69C59", + "l": 1024, + "algorithmId": "ED7C9820DC07665472BC728420D4A6C0" + }, + "fixedInfoPartyU": { + "partyId": "38393AFDC343DCAC3BD1838394B14396" + }, + "fixedInfoPartyV": { + "partyId": "2D41F93996BBE9DD80CC86514D82D178" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 55, + "testType": "AFT", + "tests": [ + { + "tcId": 1375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06310EEE9508180A1269EC3313D805D3", + "z": "42A1B8067F21633F39A336F70468FA6557D60988203E4D683AFF65D5183B87C0", + "l": 1024, + "algorithmId": "E6B5AA99AEFE1151904E0E972C75A925" + }, + "fixedInfoPartyU": { + "partyId": "018949ADE5AB9E056E109D6E12EEF7E0" + }, + "fixedInfoPartyV": { + "partyId": "ACAF34804371D801E38A0F2CA5F42FB0", + "ephemeralData": "FB6A842B9EC46C2E64E8B49CAD89553D20D9F68BBD8B59FFFAE9C8E9C41B903F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 56, + "testType": "AFT", + "tests": [ + { + "tcId": 1400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBC9E618CAA8331F1CDE1CBE0D33739A", + "z": "0B500740608A0B6B4BB1FA2D502171771A590D00D2A4FAD01FDE8712", + "l": 1024, + "algorithmId": "74F0C8A8AA50603BEE54E53E6F231E7D" + }, + "fixedInfoPartyU": { + "partyId": "B10C60CFA0A4D0EA2098549654D68A3C", + "ephemeralData": "565C6600D922830436769699AAC8DF7EFC07907E351D9D5811ADA5C4" + }, + "fixedInfoPartyV": { + "partyId": "C4181FB9EDE4F9A2627C9DD8FE0A7C11", + "ephemeralData": "B19F086662E12308850223C740F111D48240BE7A96CA36F5DBF16B23" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 57, + "testType": "AFT", + "tests": [ + { + "tcId": 1425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C03C9B61EEF3A45620A3712C69F15FDB", + "z": "92153B46D4DB6DE3C93380C702135C7F2433D05BCC62A3E5E7AF7DB028E4C3B0178EAA", + "l": 1024, + "algorithmId": "D11A8A303DD678E135CA608820532339" + }, + "fixedInfoPartyU": { + "partyId": "1E98D7F47DBE897DEB4137F60E6973A2", + "ephemeralData": "D0A6BDD50BD5B5C23D85281B482D2567E82ACF8DA9A0DBA243441B90304F8C9663BD76" + }, + "fixedInfoPartyV": { + "partyId": "25F015E9A149FDF2DB7D392316FCB17E", + "ephemeralData": "255EB0C5AD54E3DF1D5552A72EC514D2DB2AD035E46E3945DA6E12066D48754808B6AF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 58, + "testType": "AFT", + "tests": [ + { + "tcId": 1450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B287B3B30B667FB25C8CF857A8938650", + "z": "D55D21037349E2D04B24260F3AD3A8397C93AE9F79D9AF54261F25C12DD5F22E", + "l": 1024, + "algorithmId": "0966CF2579AA5E89112D69F3FC3F5C44" + }, + "fixedInfoPartyU": { + "partyId": "04BC121FA8536D662B4838FA334BF8D7" + }, + "fixedInfoPartyV": { + "partyId": "513222ABDBDE5C8ACE07A24DDF0AD1E9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 59, + "testType": "AFT", + "tests": [ + { + "tcId": 1475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3C48764CA3E0253D5CF60408480C792", + "z": "118A415A7B30FDC01519C00CE757A170FF559976B606B178C4A40897", + "l": 1024, + "algorithmId": "766B541BB2F1D414494FBF14DE172ADB" + }, + "fixedInfoPartyU": { + "partyId": "A60DCAC1E1FEA6B0121B0D108CE48581" + }, + "fixedInfoPartyV": { + "partyId": "26366A29D89922AF6DA3BE56ABB164D0" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 60, + "testType": "AFT", + "tests": [ + { + "tcId": 1500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "944741A6AB0D5BC9B5D41CD1AFBBBAEF", + "z": "89045D91F289C6368227160378BFFA23B1700904C8FB4F3BF1FC522B1EEAF1FE4A0166CFF4", + "l": 1024, + "algorithmId": "1142EFD451253ACB6CE29083DFB84CDC" + }, + "fixedInfoPartyU": { + "partyId": "38A1E3120B8EC4D8C9A591D1C8F1C741", + "ephemeralData": "2E8DAD1B512452701B883EA0F65492DFA8173D86724BDD6009C965E767CAE74788A6D5D0E3" + }, + "fixedInfoPartyV": { + "partyId": "635C9FC0B064CE0040A969FE097FB8E3" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 61, + "testType": "AFT", + "tests": [ + { + "tcId": 1525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72F4846E9E74674D4EE96D5AF02C1A20", + "z": "01A461EBD7F2B5C65F816B5306E44D639AB525548BB846E9539D2531DD62C72724A5", + "l": 1024, + "algorithmId": "787AF86CD07398E55976661D13AD6BD9" + }, + "fixedInfoPartyU": { + "partyId": "4E13C195A383065307E94316B3D1472B", + "ephemeralData": "EEA3A104CADEE84DB3DC641F8301540C60B7A18868C5337B170345BBD09E8DA620D4" + }, + "fixedInfoPartyV": { + "partyId": "01FA9E8DD46D2C126D16768C73FD4016" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 62, + "testType": "AFT", + "tests": [ + { + "tcId": 1550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B6F3E65557D25CDBC3716C55E531EF7", + "z": "388D5D1097BF56F79CCBCBFA71BF968D4FCB038FC8613D31D96F27182AF4", + "l": 1024, + "algorithmId": "6EB6386FBAB0D2DC268E0A83DD53F76D" + }, + "fixedInfoPartyU": { + "partyId": "3387FDFC16ED1EFE8F2044C664639DC1", + "ephemeralData": "9FB5DEDC723075488966A0F20629B0D3C9D867C133577FA443F496E7987D" + }, + "fixedInfoPartyV": { + "partyId": "275E106FE5BF59CDA2A5C592A58BCEFA", + "ephemeralData": "1981E09839860B0E3632DBF239B7C9C6678165724FF48B9395F6D3651955" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 63, + "testType": "AFT", + "tests": [ + { + "tcId": 1575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7164CE362CE52F73DDE6D61AD1CB4D1D", + "z": "FB2DA545B278A5E5C1351E447EEA3210388A809BC77C8D55D246CF3EB840AE5AB1019F", + "l": 1024, + "algorithmId": "24DFE87B9A9F0A14E8A58B143513041A" + }, + "fixedInfoPartyU": { + "partyId": "AC4967F64F9004D4028D94DC76853679" + }, + "fixedInfoPartyV": { + "partyId": "60B08D945698D37E783B6D82B53F5496", + "ephemeralData": "1974EFE07740ABF4C15DFE49C9F645ED51AF05CB5C7ECBE68D3FAAE7A47B5C13FB654E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 64, + "testType": "AFT", + "tests": [ + { + "tcId": 1600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79ABE90EF95E096D6E57D27E7DEECE25", + "z": "D46F5A36FFC8A84FB3091BCA1E198D562488D81395CBA45B7C1BCBC0", + "l": 1024, + "algorithmId": "921BD6549FCFC9212FB817DEDCC88DD1" + }, + "fixedInfoPartyU": { + "partyId": "A66A590381379FBB89DE551E3720BEB9" + }, + "fixedInfoPartyV": { + "partyId": "3501451C03182AF8E0F32F3FEFE01832" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 65, + "testType": "AFT", + "tests": [ + { + "tcId": 1625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6709956AC5D5273A0AA1BF7482ADABF9", + "z": "F55439702EF70965784EF6E71CD6EA668B3F6F3D548BC1852D98E54014", + "l": 1024, + "algorithmId": "C50AD8F21DDFE7562969CA7C747BD0B6" + }, + "fixedInfoPartyU": { + "partyId": "4F372E21E9749771F2B20977DDC0BFA4" + }, + "fixedInfoPartyV": { + "partyId": "6C4BBD69ED36AEEFBB9E82A8FE3DD47F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 66, + "testType": "AFT", + "tests": [ + { + "tcId": 1650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C58FDEE1D8646B8BC5A9C272400C7D0", + "z": "33689C10D387308D99DA20A90DEF7783F354942A4BE221D092B8A039", + "l": 1024, + "algorithmId": "D7406AC191D137205D7FA37A21596A70" + }, + "fixedInfoPartyU": { + "partyId": "92F9B5E4AE06ADB2215835DF226E621C" + }, + "fixedInfoPartyV": { + "partyId": "B93382E419080EBE22CE737957413967" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 67, + "testType": "AFT", + "tests": [ + { + "tcId": 1675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10C7AC32F8CCE6DA5E48A6CC2F7A82B4", + "z": "F2E50366EF9DD218C5C8226F218973CF98CE028D475711E8EDDB5034258CECA82FA165", + "l": 1024, + "algorithmId": "DC89570258F6CA1222959FFE9F276B15" + }, + "fixedInfoPartyU": { + "partyId": "F53F9E824D5FB9F1DE465D27EFE12860" + }, + "fixedInfoPartyV": { + "partyId": "2BE587EBB2610CC72485BF80DB9DF813", + "ephemeralData": "B71D217A32052CE4505FCB5B68E016480B528BA89379427BC3B630AA2D7171DE2165E7" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 68, + "testType": "AFT", + "tests": [ + { + "tcId": 1700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3912B055B8F9F547FEFEA70AC39304A", + "z": "C351C7850D8C955E42B9267297DD262D628A819CC65FB46E2AD5C3CE02", + "l": 1024, + "algorithmId": "9C4C36A8439D3E976FD952F01C04FC76" + }, + "fixedInfoPartyU": { + "partyId": "68D4E6D97CDB727772D941B9AC6B697D", + "ephemeralData": "3D4A00206B4DEBA8DD1532489C62A6A5C83739A3A1D70493C3B178271D" + }, + "fixedInfoPartyV": { + "partyId": "A09E18D567D6B912D8A067A723C07869" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 69, + "testType": "AFT", + "tests": [ + { + "tcId": 1725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7030B4C3AE1A35BD20AC583826C4B516", + "z": "CAE27ECF56DC8B61A734884C0F15B9668D4653D7D8D09EB1BA36E33119FEA030D9A2", + "l": 1024, + "algorithmId": "73D8F5F04B3B12339205F6C11FC8E0E0" + }, + "fixedInfoPartyU": { + "partyId": "C65EE5500EA67EEFE184FC7538C417A8", + "ephemeralData": "EF152D7C5726E2CE1F343569180E8EC02F06BB33EBDF07A5B7566BA88C935B764E35" + }, + "fixedInfoPartyV": { + "partyId": "5273930FD9DF441ECD1C8B156E6C2F99", + "ephemeralData": "0ED36E3B0F5A5624F94072351A974E0351F0F2773BFE44C6BD742740E51D59389EB5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 70, + "testType": "AFT", + "tests": [ + { + "tcId": 1750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4E42D3535E9ED49EE8167A4A9751D0E", + "z": "522B06D4D0692DE20B8E8C92C01771AB01D71938A08220CC36AE2BB8C2FD70C2E382A7AB", + "l": 1024, + "algorithmId": "9796FAFAD6FBB9FE9E62CCF8D77B1327" + }, + "fixedInfoPartyU": { + "partyId": "1BFD496A29224AB979F0B21F9ED4B378" + }, + "fixedInfoPartyV": { + "partyId": "F5C562DDC28BE0F2E23650C2903948E3" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 71, + "testType": "AFT", + "tests": [ + { + "tcId": 1775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28DABEDDB6D7FC199A45B59CD427C15F", + "z": "D38B54D741BBB6ACEEB0E2A5EED94B4286130E31FB7B6ED5635567F548", + "l": 1024, + "algorithmId": "A7EFD5314D9490E03B45AB876D718670" + }, + "fixedInfoPartyU": { + "partyId": "A76AD8AB528A44996E3C046CB5215E8E", + "ephemeralData": "5E5861546B0F3E1A5DECD36CA7E3818B14AC3F9B3A2ADC38C7FEB0D613" + }, + "fixedInfoPartyV": { + "partyId": "FC68328B4526C7D5DA7DC30F134BD443", + "ephemeralData": "A6ADA5D20903C80598F3C7F6CB83D77293A198F9D3BB976C046E09B885" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 72, + "testType": "AFT", + "tests": [ + { + "tcId": 1800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "602934F189E92677F3FF61BFB0C7DCEB", + "z": "638509672D4B23712D91330BC5AA726F0A42BBAD19F099AB9D211B2E33B86F592E6AB5", + "l": 1024, + "algorithmId": "BD33520618E5339B1ED40C97A584336D" + }, + "fixedInfoPartyU": { + "partyId": "CD3B0D865954C39E9499A9324DDA239B" + }, + "fixedInfoPartyV": { + "partyId": "14A136F4D00AC18BDE2522A50AEDBA29", + "ephemeralData": "8FF845B28DAAC38EE8A76FB401F658974F3D7E7DE764A738DF482616D9C5D7F4E1897D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 73, + "testType": "AFT", + "tests": [ + { + "tcId": 1825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E6A3564FD1FAB991D4AD2D622D309155", + "z": "E522D884BFC7D9DEADF955D9571F208FAB3165CB13EDF23DD7577898", + "l": 1024, + "algorithmId": "E712E4E60354D356AD7E029EB3AC32EC" + }, + "fixedInfoPartyU": { + "partyId": "FC621DA462AA3B8D6E6B6D30FF5DAC08", + "ephemeralData": "AB9ECAB1B4217B32071F0A08D0645297B0BE08F65CFAF8A299714501" + }, + "fixedInfoPartyV": { + "partyId": "6539A262B3654BB09383C3CA77C00897" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 74, + "testType": "AFT", + "tests": [ + { + "tcId": 1850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7ABADE02604628984BEF1FB63625F5DF", + "z": "D0571AA50A0D98D24960028D09217574628AFCF49602B860D74DB613", + "l": 1024, + "algorithmId": "F57DD6F0603F56650E71F2F9EF659529" + }, + "fixedInfoPartyU": { + "partyId": "B9418EF22695A688394CC49C860C11AC", + "ephemeralData": "6DE680E828AFC503F0E3EA3161463143A97BA8707DFFD23D0622D68D" + }, + "fixedInfoPartyV": { + "partyId": "1B2B080D3F6ECA34431775545643573A", + "ephemeralData": "7B672C0219CD542465194391EBBC1EFA26C791C95EA4C0C44F754590" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 75, + "testType": "AFT", + "tests": [ + { + "tcId": 1875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B3FCACE73092B37953FC50549B2F736", + "z": "E5989A05B0087A24088448DB369111D60BA3E7790AB2D4093F18AD8FB85E5786", + "l": 1024, + "algorithmId": "FEF4B12A63E59FAF660E0EDB3F0F64CD" + }, + "fixedInfoPartyU": { + "partyId": "4F1B3512304073DE886F3B52D3DCD95F", + "ephemeralData": "5FEFF65307685709A19AB8D00AA0AACD3C6E3A67A5149355D33E300938BD9CFE" + }, + "fixedInfoPartyV": { + "partyId": "3877E25AA7FDFF9EA956ACDAFE0629B8", + "ephemeralData": "E02746F2BBD06BF654216170333EEDB5A45F7F36C7B12F1B0145B7457B8A44F4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 76, + "testType": "AFT", + "tests": [ + { + "tcId": 1900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DE6CD9E68085D8038EACDE0820B30AC", + "z": "B53FBB0037A51841B96246FCE070AB792DC1331D3094A0A6EAFA764E2F", + "l": 1024, + "algorithmId": "A3D2327A2FD802CD3048BD9C3B392273" + }, + "fixedInfoPartyU": { + "partyId": "9AC352778F05B8D7BC2C008A1B0091E0", + "ephemeralData": "D3404308B37F79A2A5328C4FDE61EBEAC2D136ED948386A28798B1060B" + }, + "fixedInfoPartyV": { + "partyId": "F512F59879EF581C8DB4F40D0A54EE41", + "ephemeralData": "B89CF7C1D336F5B5C6E1FF53AF455E7FE4318C6984673702982D19CE14" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 77, + "testType": "AFT", + "tests": [ + { + "tcId": 1925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C38ED3AF1AF570E5E40A9B7BBF1937CA", + "z": "C567F01F29186B66939F5E470899219FEB83D49CF129099381C3E73C96F10ED6BE", + "l": 1024, + "algorithmId": "94A77E1A26D8543AA03A1E88514A9E3B" + }, + "fixedInfoPartyU": { + "partyId": "9B49F2E191E83E554F8EFDB56F446815", + "ephemeralData": "7D2273B20D7609B24992A235149034DC64A2A2619ACED0305E6F7777BBF4B10F2E" + }, + "fixedInfoPartyV": { + "partyId": "46DCBB81BECD5700CCF05AD0B5E1F1B8", + "ephemeralData": "2F2CF6C8D4D4DE13C3438293ECC06FE251AEBCAC61016E08AA1E6DF85D0B15167D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 78, + "testType": "AFT", + "tests": [ + { + "tcId": 1950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE2C4922DDD68F02A3E854AC2E2812FF", + "z": "39953E05F845979496BFBD685196E5A43219E370189DB2331B06DB28C6351B8706E97E45", + "l": 1024, + "algorithmId": "96341CB7DA2D314168746B25C26150A5" + }, + "fixedInfoPartyU": { + "partyId": "3E6CBDF25070CC4DD00662DCE40E2D32", + "ephemeralData": "F40BC8062AD7A46F4D9B04C5DF415535D442E6641CF4150E9591319F5BC99E98E85F4AFA" + }, + "fixedInfoPartyV": { + "partyId": "D78D337BB73F3B74313D88448F9A5035", + "ephemeralData": "CE9C00FF163BD1E4C48A6B1018AD90B34B13E7000A458F675AFAEC7C0294228008A4FA69" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 79, + "testType": "AFT", + "tests": [ + { + "tcId": 1975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70ADA9B91E5BD66E154A8449C4325C04", + "z": "824EC8DB62ABD49F796C6E6D16CE8B1F266142A18D340A9970DF75B7E622EB", + "l": 1024, + "algorithmId": "A20FAB0037B933C13C6C23B1D1C11E24" + }, + "fixedInfoPartyU": { + "partyId": "D3A8F714B999EB242C57C5DE4C498517", + "ephemeralData": "A764B2D581F1A1345A4815F81C75B1BCD0957DCAE346A97F014093EB923BAF" + }, + "fixedInfoPartyV": { + "partyId": "A762737E35CC48458497BB8D2B55D72B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 80, + "testType": "AFT", + "tests": [ + { + "tcId": 2000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0BB2BD38342661553FF36596D99BE939", + "z": "B82D413FF4F5D68BBB643939009E71E13B10F7F84DF8F124FFE7C979", + "l": 1024, + "algorithmId": "1D190A9275BC37A16BB4171983803359" + }, + "fixedInfoPartyU": { + "partyId": "9FE04EF047F91923C8FBB084E3327FF0" + }, + "fixedInfoPartyV": { + "partyId": "C3E2C0F3D4A380F759FEFB26C2E45DB8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 81, + "testType": "AFT", + "tests": [ + { + "tcId": 2025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB36965F88A93B379B988AF5BD674B30", + "z": "EEC4403676C4B0EF92C5BB55EA582D911E2487C72A8BEC0EA982A6946EA8", + "l": 1024, + "algorithmId": "5B13F0C95FA92FF562776D7C6D125C3A" + }, + "fixedInfoPartyU": { + "partyId": "10C2CA327B3D87D96C5B5AB6BDF95F03", + "ephemeralData": "60497ECD10EBD13667668E67269C28CD720BE2E47F15267A4075307CA919" + }, + "fixedInfoPartyV": { + "partyId": "8A77DBA0977E1E8EBE47971DFFB3ED24", + "ephemeralData": "C6CE0F4997DDE036540C2FF75AB5DCFC736445AA73B110825BA496536F15" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 82, + "testType": "AFT", + "tests": [ + { + "tcId": 2050, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B65588E72D3F0BFF14326211CEFBE68", + "z": "2A2A0CDFCC493EEFDD3D5906528952105AFE82CC644A2EF69B7296A8", + "l": 1024, + "algorithmId": "10579B393993971D74BB961BE9FE23F3" + }, + "fixedInfoPartyU": { + "partyId": "9F508B74391ABC29A3904832C5E549C3" + }, + "fixedInfoPartyV": { + "partyId": "04E9BBA54D6A5B881A356B81666CE0E8", + "ephemeralData": "26ECA9AAB0DE42C4BE2CF7A4A9EE6468033F4A29E5C1C828399C82A1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 83, + "testType": "AFT", + "tests": [ + { + "tcId": 2075, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2531D1FC4472807710B21258A5EA19B3", + "z": "FA810353F91882E1E94BA80152758C0B310D94FC2059B8B7BA7DB250", + "l": 1024, + "algorithmId": "2BF3CE87CF5917E0340EC87BF914050B" + }, + "fixedInfoPartyU": { + "partyId": "C4A9CAC0FA733851D47E34E60E37CA55" + }, + "fixedInfoPartyV": { + "partyId": "36B3668499CD44478654431F0AEB0480" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 84, + "testType": "AFT", + "tests": [ + { + "tcId": 2100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1D0F953F61B846992C4F8B0AFE151CF", + "z": "FFE4ACD4DB2058CB24E2B9486F75208AD1ED35F622A55ACE6C367CEF30CB61F983", + "l": 1024, + "algorithmId": "EE6F70C38C3AD0DD00CAF7A4C15DE9DB" + }, + "fixedInfoPartyU": { + "partyId": "4E72701E9EE143ABD4DFBEA30EC90948" + }, + "fixedInfoPartyV": { + "partyId": "7622975B5C9765A67E403A825AD8C924", + "ephemeralData": "28BFAB4F784758FC8F89CFC6A40BE3AFADD1E55A0644D705C4A040CC2DDE6BEDD9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 85, + "testType": "AFT", + "tests": [ + { + "tcId": 2125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C9EE69063C5D1A48581E4B8BCD4D002", + "z": "F591D059A521AC18978EF6E0CA6E764AACEF622F2E52AFD33816E5B4CA", + "l": 1024, + "algorithmId": "075716DA411339117A2CBA6275DE2606" + }, + "fixedInfoPartyU": { + "partyId": "82898D81202FCE41312577A69B2BEAC9" + }, + "fixedInfoPartyV": { + "partyId": "1E02DF70C308B2D510F0AF99565A5AD8", + "ephemeralData": "6D1CC5D18B3A3B309E377680139F238B156DC612883D51D20654364465" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 86, + "testType": "AFT", + "tests": [ + { + "tcId": 2150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA738A239782A26139792D9A50385D80", + "z": "C474835EEFBD48064A4F0741BBCD256BABBF76B0176DE66DD8F953088929", + "l": 1024, + "algorithmId": "CFBBEF3A109E2036E45CF726C0283775" + }, + "fixedInfoPartyU": { + "partyId": "037D83E252F0A8D667E6B1E7E4ADACC1", + "ephemeralData": "68FD1799E5653FBAC4DBC90355A971E9790A95C083DE6A6C4867CA5D37B6" + }, + "fixedInfoPartyV": { + "partyId": "D1252D0879416359F9174BA875B9CB82", + "ephemeralData": "BC6187A0FCAF5A9DD195DCF500766C54AF82651E7DF19E3A792D38E0062E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 87, + "testType": "AFT", + "tests": [ + { + "tcId": 2175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8B2A33B9BD0ED50A8148B18A326DA15", + "z": "FA6DDFFEF2CA0D2791EC80D3C8F09BF7B2795870984552343052072F", + "l": 1024, + "algorithmId": "0DAA61B384B642CE8E0F58E7BE88137E" + }, + "fixedInfoPartyU": { + "partyId": "C0338E94C3D97A0EAB54FD8F2B527488", + "ephemeralData": "A759B94546FA224E05FC104BE45531603D229021B7BAC708FCB5B162" + }, + "fixedInfoPartyV": { + "partyId": "6C6E7397AC7FFDB82E9CE00ADA99FC29" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 88, + "testType": "AFT", + "tests": [ + { + "tcId": 2200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD97D427BCD9782517D1AFBB3C265012", + "z": "3C19D2EF67CE642DEA3A53B71C9879B163B71DC5CDD1271F4D192EEB3BD793F9427A5198", + "l": 1024, + "algorithmId": "66AD928DB280873CF5200662606A88CC" + }, + "fixedInfoPartyU": { + "partyId": "0AF60BA7FEF783958D51EA797E6D6A18" + }, + "fixedInfoPartyV": { + "partyId": "0D4C5DB260860EEC59A68B5EB91FFC33", + "ephemeralData": "9B5612F0AB25E32DCBDB8C25C7DFBA82FAD6BC4AC36D21433C5B33860A27C6EA39AF5AB4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 89, + "testType": "AFT", + "tests": [ + { + "tcId": 2225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9085B609446004DFB8EDEE0F9779C1C4", + "z": "984110B3AD8D87EA2D03E891ABB605E2FDC8EB5D9BF9B29D84063CD7A745AD5975", + "l": 1024, + "algorithmId": "8CE4C6D75F811EF719F80D9266A21BF1" + }, + "fixedInfoPartyU": { + "partyId": "19811CF43B71127384ECE59F197EEAF1", + "ephemeralData": "7305CD39C7767F373118FD5EAF6C73A960718DD158AF50BD17AA70E3E4CEB02646" + }, + "fixedInfoPartyV": { + "partyId": "E4411AD59C27876E0D060CC990E96C15", + "ephemeralData": "923D1C5C7CD6D7405E6C9D96E1A464433B4AF0DEE2FA64AC9D9728E8E8AD0E7293" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 90, + "testType": "AFT", + "tests": [ + { + "tcId": 2250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D6841FAC4B5021565F62EDB48E12953", + "z": "D2829213E0DC9AE9899647D4B9717600C67D7553D9A0D074EA43E8D86AA85182", + "l": 1024, + "algorithmId": "6DBF058A26840B147C56C9E3F1FFE0B7" + }, + "fixedInfoPartyU": { + "partyId": "A0111D8D0BD4F7E66A95545C38A477A3", + "ephemeralData": "88CCFC8A73DDD207E0AB6944D1DB36CD4EE2D6620C3D811FBB3A38AFD084C3EF" + }, + "fixedInfoPartyV": { + "partyId": "20845D58D33D7D693EF302FDCE245B3B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 91, + "testType": "AFT", + "tests": [ + { + "tcId": 2275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6AD3F7C7FACAC74ED1F8C6B2AB1B29B", + "z": "57081F5B63FB602CB206F22152D4830E0CD1BDBE2D79F95DB155CC2072D1B7D8", + "l": 1024, + "algorithmId": "E40DAD9C9B2F8C96849F070F6F4D4B3F" + }, + "fixedInfoPartyU": { + "partyId": "B62FF11272CC005DCFC39BDCE5C258DF" + }, + "fixedInfoPartyV": { + "partyId": "F13D55F1D1C0451EB0E5B55B6AF9719F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 92, + "testType": "AFT", + "tests": [ + { + "tcId": 2300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1FACF930126A20AE098539E13DFB7A2", + "z": "DE6E9EE909E41584AB8B95C00BE77678AA427372AC69D3FCFF29525C90A8D9", + "l": 1024, + "algorithmId": "257B5387CD9EDB90726FC58C13C4ADD8" + }, + "fixedInfoPartyU": { + "partyId": "6D25A6343FE3B878D21EC2DFF4CCE0C1" + }, + "fixedInfoPartyV": { + "partyId": "655D15206E470BFC4E3C39C3AB8BAEF8", + "ephemeralData": "A25863D7B6E2A590A7FD32E3F0F14176EFDD774BB208921557B5CA4EA692EA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 93, + "testType": "AFT", + "tests": [ + { + "tcId": 2325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C0D213219136A669A6ACDC141375CEC", + "z": "1031E25BD3A8800A6ADCA84077A2FAE87871F3984ACDCE32F3E1AEAA15368D6D893F7C01CD", + "l": 1024, + "algorithmId": "79338C33AFE8E1C9B3237E460FDAE170" + }, + "fixedInfoPartyU": { + "partyId": "2D99CE469C34A6891F162B00CF7EEFF4" + }, + "fixedInfoPartyV": { + "partyId": "9C50970D062A0BCCB1C449C8DA07E514", + "ephemeralData": "B8F07888FFE40E7B19EC1F341EBAA62C352AFC47377AE63B24407499ED83E3BC77A174A955" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 94, + "testType": "AFT", + "tests": [ + { + "tcId": 2350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54361AB20200EBDDBDE5B88F90421D8B", + "z": "858645BE49AC8B85896AD20ACF64EFA4F8B0AAEF798DDE8753A6E9E9", + "l": 1024, + "algorithmId": "D8DBED30D911DDFF6B7598706302A301" + }, + "fixedInfoPartyU": { + "partyId": "E5A1C98FAC51884746EFBCA6E4B97397" + }, + "fixedInfoPartyV": { + "partyId": "5742945C3D5ECFADAFE0F73186EE18ED", + "ephemeralData": "91EDF935D97B66FF982CD041C7EABBF9BD8181871DFFE851CBF17CE1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 95, + "testType": "AFT", + "tests": [ + { + "tcId": 2375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1A78A21F81E8DD3603A175918739D02", + "z": "D043A097EAABA72CA4B78333A77156498103BB009BBA63248AA5C5D3", + "l": 1024, + "algorithmId": "A4982F572C42200F6BDFD75E1700D102" + }, + "fixedInfoPartyU": { + "partyId": "9D18D7E29F7F0D89925980788549E6B9" + }, + "fixedInfoPartyV": { + "partyId": "1F84F3BB192C9402D29EC5761C7D16B9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 96, + "testType": "AFT", + "tests": [ + { + "tcId": 2400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8F9D39161052D0E8BC396DCCBF1F4FB", + "z": "D0D8AEB559A020F7B44193B7DFCDF0866D68FC8BB00C50971DF0C00E24853697", + "l": 1024, + "algorithmId": "67B2709D941C31A46A0FBB87AFABBA4B" + }, + "fixedInfoPartyU": { + "partyId": "12FF128A8B34D4043A588EEB66FD3338", + "ephemeralData": "20E429B55EE3DA9398F88101FF58783B78E9679620EE2CD0F504311906A1DA98" + }, + "fixedInfoPartyV": { + "partyId": "6C6D196A611B71F9011ECA37D31D948E", + "ephemeralData": "6D792D9666900556597140154A0292CD48A63FA54E3E7309E216C313A79A4E13" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 97, + "testType": "AFT", + "tests": [ + { + "tcId": 2425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6398EA948FC81CE59B69F1FB3BFBC1CC", + "z": "05DCB706B3813C2B705431ADF2775BBAC0E040AC1998B0F873584B87BE92BA0A3FA3F728BA", + "l": 1024, + "algorithmId": "1835FD0471694C6BD1BA397017495C68" + }, + "fixedInfoPartyU": { + "partyId": "A9E875306CEC2811A5737D6906C2D892", + "ephemeralData": "0FB764FBD754B540E74585E1D2E73D57D97ED48792D3416CA4CA4A922266D891B080CC00A2" + }, + "fixedInfoPartyV": { + "partyId": "13ED9D98ABBC6DDA29EA47A0EA46E185", + "ephemeralData": "F4191DAC40C8A24E9AC974F7BD521039938DA60DC38A08A8F3F5DCE17E920CCFAEE5C24ADE" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 98, + "testType": "AFT", + "tests": [ + { + "tcId": 2450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4C29BA754E159377ABB3943DB525D57", + "z": "38C0631383D107B49BC4081562B024DCDA94BDD9A198A5A0946D9FB548705E", + "l": 1024, + "algorithmId": "1AD908DA8BCF3FB0E014446DBB4CC2EE" + }, + "fixedInfoPartyU": { + "partyId": "BDE297AB35B2C8E97A23C0692C1A7C14", + "ephemeralData": "1DF08E554D7936001B7168A35C8C5FE53C81EACDAE93D59AACAC39F72F057E" + }, + "fixedInfoPartyV": { + "partyId": "FEAD742C94916ED0DB41905E95DF1424", + "ephemeralData": "8CEEDCD7348CB11E55DEEB0AB88A76E50C565FC0C12FE90D3A1A860A4B5076" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 99, + "testType": "AFT", + "tests": [ + { + "tcId": 2475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0656F2F9EB06A382D3669BCC91D6E0E", + "z": "9CC7837C4D800B67CF59795A7646263C61630323D943F753392F95D7", + "l": 1024, + "algorithmId": "03F1F96B76F45279CAEF7F0700B0B2B7" + }, + "fixedInfoPartyU": { + "partyId": "B8A5432B17AFB7C9D69E43EC099B51CE", + "ephemeralData": "CAA3AC6F87F8745A68D20AA630D0BDE114CC489516B5433A2311F0D4" + }, + "fixedInfoPartyV": { + "partyId": "FA56F2E50D9478B692A748C76524A442" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 100, + "testType": "AFT", + "tests": [ + { + "tcId": 2500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C2700E7812F506590EC7CFCC504C35C", + "z": "E689216F75AB7DEE0CBE14B40B7BEFF3753E8D3151049C79ADC74E58D2DA", + "l": 1024, + "algorithmId": "1D2BF28E5487493D0968B872D50597F9" + }, + "fixedInfoPartyU": { + "partyId": "5E4AABC16849AF56DC9ABB7A7B223D22", + "ephemeralData": "4B56CA05B49E5537FAC36BF42E1D12573D52A2DBE4CE4E124BDC053F5DF0" + }, + "fixedInfoPartyV": { + "partyId": "39BFD7AC2C0FF145E04AC47F234D3242", + "ephemeralData": "4E965C02E83CC893BE2F54A8A183F848462767EA25F58EF2567CA355F271" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 101, + "testType": "VAL", + "tests": [ + { + "tcId": 2515, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39DB35C9E22033C247F8B0C4C570A136", + "z": "81DD5B3C2396ED4A3EF740FB480759788558E5CB930901FAE012B91021B2A6AD", + "l": 1024, + "algorithmId": "09137F029333FFB7A73E5C56583543EE" + }, + "fixedInfoPartyU": { + "partyId": "DD7C65A7C3CA908F7CF8F1CD5CE6F923" + }, + "fixedInfoPartyV": { + "partyId": "249FA4EE2322D674AF6D3D932E70699B", + "ephemeralData": "2BEBA059D51A58AC78BB8F536DF1A048B971E49634766BB98A6187B7FCFFD16F" + }, + "dkm": "E2AA52685052C2DC8DCD73EA68DE1AC62B53903F9744D18B7457DBE189935F7BA9D30E12FEF9C7E3D5E6E7D488B0DBC6700774D4EEA6F554E1675D7C409CB0D64B2E4F1F76556BFE54014820ABDC20B5B4F0170F587C7C1C9DF8605BEC75C3EDBAE32FAAA55C44C27605FA47382CC6429CAC6542F0AB49EFC3DAFFA849A1DC8A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 102, + "testType": "VAL", + "tests": [ + { + "tcId": 2530, + "kdfParameter": { + "kdfType": "oneStep", + "t": "166605C3DA2C55073B064B6C533204C9", + "z": "829C8D4C2EB8117483E4AB109F932AF33E60B5DE959D38D67AE5F6FC", + "l": 1024, + "algorithmId": "87ECA0B77AC98DFECAF2BBD7A4C95279" + }, + "fixedInfoPartyU": { + "partyId": "B6759D6791B071BBC17EB327F806178E", + "ephemeralData": "FB9EE4D2AB401767AFC6061A9B482EB73EEAA2E22117CA8CC1DD48C7" + }, + "fixedInfoPartyV": { + "partyId": "1044D7EF4C02C0BF458442019BD61C53", + "ephemeralData": "045ADC03AA743D4FCCC6CE1C2CA8EE3108B08307AF964CF568420382" + }, + "dkm": "53DFF0DF21431CE0638816DBDF5D42AEF785E2D09D9882BBDBB07B6CD73810D7432BF360DAD870C26617ABDE2BEA5021EE40EC63D31BB4F4D85505C1C9694D553F894C57AB1EDADC4B1A1F0F7868A754244408B5495CD9FDBEF0928BA930619B1A62EC9948CA91E7A8C8E43E7D84B239855FBBF4E744659A8EB4B4E9FFFB3912" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 103, + "testType": "VAL", + "tests": [ + { + "tcId": 2545, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A1643892A02F606F5887555FC4B2D36E", + "z": "0D783930645F16C8CB08E72B6E31972D4D89C1A240829567A1EF329D6B", + "l": 1024, + "algorithmId": "64BD3562ADE6D11CAC623CD9A988EBB5" + }, + "fixedInfoPartyU": { + "partyId": "94BD832F3D06C2CE03C441456DE319C2" + }, + "fixedInfoPartyV": { + "partyId": "1C2E718BD286A3D65B516731FEC9420B", + "ephemeralData": "313D9E6E1192B2900EAFF62465CA59449BCAE068A02DD2EC081BDD887E" + }, + "dkm": "BE0F75D0D5F5CD6709396CDAB47E7E9E317B3CF01A46609CFDA59DB21C171E88B839DB6F4F929F0DFAF63FD9F4A88F18BDAA08E9C3175A59625C5A0C626971A6EEE77C6279E22AF3E03A6E69B1AE04B666CE2188B66500D534F9D9A6B69D75892C00D17C34328762A25E2F8069A4584AD6625036C137DB484EB1F191F6CBCB9F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 104, + "testType": "VAL", + "tests": [ + { + "tcId": 2560, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADCE03A2D220BC909D1F972E3858A6C1", + "z": "FFB07A520B5C96B07D214D55C5C398FCA28A2BBEA55982C8A541E23CBD92B0", + "l": 1024, + "algorithmId": "0C2FE0F490AF5FCDA2829B0F9CF9B648" + }, + "fixedInfoPartyU": { + "partyId": "7161F2D4B58F017F2AF22362DF0191CA" + }, + "fixedInfoPartyV": { + "partyId": "D14D523686A60C148F5F783EDE39241A" + }, + "dkm": "DCECA260AC298E2E2FEF93E87CF30CD00B60120BF87058006E4AD7E201E06AB91581717EE23646E52F71AD3E7530218001C78257671FDEB119CE485F136A970A014191259D6D81C5428FFF0E1B6462CEA2D06E09F7E22F4C72A50503B320C24EA347AE42C29F01E7E8C19A2BABED9D3FFEC336F5F0BB92D855F0AE15F75219FF" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 105, + "testType": "VAL", + "tests": [ + { + "tcId": 2575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "116C4F0FEB291467A6EBEF9841F9720F", + "z": "926828A8D1979527DA649B1FC98215B2F50192D7DE8B9035BDB0E7845B3B2A36EE8D9372", + "l": 1024, + "algorithmId": "91A86126DB391520A68050EFCB420BB8" + }, + "fixedInfoPartyU": { + "partyId": "7D144A89D7712E3EB1BD9D37E55BB9D4", + "ephemeralData": "C931831A80DC518D2AF18AD05714BE1C361E09F8270C14DE4FEF3460C69ACFC3115D5F76" + }, + "fixedInfoPartyV": { + "partyId": "4190AF64196061CD69D61EC1E910810B", + "ephemeralData": "53D38B9BC1DDC5D72A6F8AABE8FD7534F9771C43E25A356E570F396FDE3940054AB83046" + }, + "dkm": "0DC8B455EF46A062C2917660162193157BA9AD2634DF31672F82F8328DC25CD089FD875C9F12AF292EE4F32E73B4D08ABD65BBB5038BC5EF00CDF7CF56516CDEF21B0A7270793D5DC87C8F7225DCEC744E716AC42573C97C0852A9EC783DB6DF9EF73BB56739422FEE61B07BFFDF46C532218ADAA00C4F642077046CC332199A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 106, + "testType": "VAL", + "tests": [ + { + "tcId": 2590, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B2394DE88F71EE90340ADEA9A684876", + "z": "606AC95233B6B9AED91D3C5ED991EECE775A09496F298028A4881109CEACDF80EAB803691A", + "l": 1024, + "algorithmId": "847C63D4E47E564A9737D03C2561193E" + }, + "fixedInfoPartyU": { + "partyId": "8A9418CD9EC05EB79CE1CBBC69F59AC3", + "ephemeralData": "EE7E9F692C24950B7F7BFF22F50D03BBF014AFABC9165E52555A5020D2C1448CDE717B4BB3" + }, + "fixedInfoPartyV": { + "partyId": "E46C0488610C614190ABE9A8B00EE4EE" + }, + "dkm": "16A50BD7C85F9ACBB17F3FF15AE2406DC0DF483C205738F0156A2C0B404238AEEEF1DEFE81729F0AC80320977F768134A42738605C7BF90DDABCAA833A1288C3018999107CA235015160133041E3B6E3C631D1EB6F4C19A30161092989BED7565894618259BCEE4BD4BFFEDC1C187F8BBC92B7E495697DC4A711480C5B5E933C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 107, + "testType": "VAL", + "tests": [ + { + "tcId": 2605, + "kdfParameter": { + "kdfType": "oneStep", + "t": "533393B6C64D9C2125BF926D120CC99B", + "z": "26488E69F53240D232A68D2F34C000B5DEC00411DCDD24DAA225D8F21681F4", + "l": 1024, + "algorithmId": "DBBF7EEF3820108DDC0EDC051658FF65" + }, + "fixedInfoPartyU": { + "partyId": "21ADB68FEE31267602CC676D43CDDDF9", + "ephemeralData": "1BA2B85C09BDBD344D707C3634E2B7DB4C3930A5B2434E4EC5035FF5C598BE" + }, + "fixedInfoPartyV": { + "partyId": "465D19231FF508DA9A3082F6AA931192", + "ephemeralData": "1A2951872E59478659568E9C942027AB9569FAA137914B4DE4EB79D4D812E5" + }, + "dkm": "7BCAC28D67A9E7A00632320019A3E1FFD9CA211BE7832811E24FB05C688F0CCC460309AC5E9E8700587835264DF06292C07E7FBC9FDFA7FBCAC074FE181B85BA233049058EECD03ED1163232ABAF07AFD9629F9F76AF0B0C00AEF6183654D35B5038584B062E95A27A394BDBD62056727054EF1CC40B941F16882F9A33F6D185" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 108, + "testType": "VAL", + "tests": [ + { + "tcId": 2620, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B069F7456E9BD3F4463E30CCE1BBAE7", + "z": "6727D4E9F51F94E157F7E5E65629EA36C4DF79C064EEE2034877DB9C", + "l": 1024, + "algorithmId": "020D44C3F4BAFB5EF1B8EC2467194CD8" + }, + "fixedInfoPartyU": { + "partyId": "930DB6CC04FEC4CCE7583FF4BE7D6103" + }, + "fixedInfoPartyV": { + "partyId": "BB2F5F82BC079AAEA88E709293550E9E" + }, + "dkm": "673BCC1DEDF893C961524F4DDCBB34C53B72CE949432C62AD1C164C399DD6336B28BF55F2DBD60F012134F574453015A474FD373F025796B23F1AF29D24EE1FD403FA0F2E453796ED33A0E3AC02DBDC00BC6B7927A6BCA31F2C0BE86DA366161D1D23E05E5DBCCDEA199667ECF4424C1E591138A38A7ADA3CE4833B115CD2230" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 109, + "testType": "VAL", + "tests": [ + { + "tcId": 2635, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BE5532F5B2C1953040AECEFC09B8CCE", + "z": "1245BC1A917B4486E022019CC0E25BC9560A2B7C0BACABFCB3EC7D61A0B8E9", + "l": 1024, + "algorithmId": "0462E2FE8FE3534142A1E933E4804F72" + }, + "fixedInfoPartyU": { + "partyId": "D98EE043149FD8E287014146A5886DED" + }, + "fixedInfoPartyV": { + "partyId": "663F985A011C1AD7C75948934C0063C3", + "ephemeralData": "408786E4276EDD2F255AC645595749A2B6A69D0E62C3DD5B59870F65A20E1E" + }, + "dkm": "056093F299A0B3694E140C7F7838B8F029763425903BC0F681780DDBA188A4AB12D55C3C206B5FD70FA64C393B43515D08741881B4E6855E80B16B303192B64F7AFA3587777B710C41B5AEEE1898E763B58054C0AB40176CCF50A063350BBCF077A1C44AD6283540F288F8FE2537B6D119EE587C06E44C19DE5D03859135AD16" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 110, + "testType": "VAL", + "tests": [ + { + "tcId": 2650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E94463C0EC4536600D50F5BBA5555D2", + "z": "06086CAF4162175E1C125EE877845260C9395FD9AA71EF466638C3B1", + "l": 1024, + "algorithmId": "0CBBC54035F0C80BDE371A5A6F6C8450" + }, + "fixedInfoPartyU": { + "partyId": "FCE1ABE4E3C6558D7C847233C4A22956", + "ephemeralData": "9793EA08CEED9574BCAF536BE6D9B7F7609A207834DE254CCF149F0B" + }, + "fixedInfoPartyV": { + "partyId": "52BB90C4030A37F4CCA36B6635B3382E", + "ephemeralData": "4834F20D138BFA646D4005469161C746B275613F315778FCEC9E961B" + }, + "dkm": "89CBFD9D180B0B53DA618D9BBDC788D8ECBA7084BEE8C0152C41C25319BDF5A88F70D48A8586F218BB8A2CEB6480D00A8FEB3BAA0E004BAA4881D70FE44B164901902D1DACE37F717AAAFC294FA4EB5D00FF5B1DBB431244F1CB82CB8DF5617EB8784D99271B086CFAFEADB6A4DB2CB211EF6FADF93468ECA9A99BA5777B6574" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 111, + "testType": "VAL", + "tests": [ + { + "tcId": 2665, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38F78BE1FAFF31C41DF881DA3A471215", + "z": "BB4F6100EB86820D79BC48C4870BA9007B97D38C5E293D634457F87F78DF99B6", + "l": 1024, + "algorithmId": "618C8312CE06FF857E9FECCF45564184" + }, + "fixedInfoPartyU": { + "partyId": "CC303D5B4A918C5353C60CC7CE89CD08", + "ephemeralData": "080BA83527754346967CA1796E1FB12BF403CD21406237B7C48C375FF1847195" + }, + "fixedInfoPartyV": { + "partyId": "BE311264D50F0AFC95A808173357B4B5", + "ephemeralData": "123432A6916F71890922DCD0766D8B592C0F8E65C21CAAEDF5F36F5D108C2F55" + }, + "dkm": "9FB546BFD739BA5094D7B8D9CDE76AB7CD612A8FC99ECEA9B5C7C3BFF7EB2AC9A60B56650B784DB067C4D76830EE6EB7D4AE29D88B0746AE9ECFFE2EDA58508FE1FF179D386A7B65DD2C98276E2C3C379CCC66CFACFAD6FB58035A474E5438D47D82A77836BC5B007A788A667496A8AFBFCA77AA4A0519E8FC4D67CE35F37DBC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 112, + "testType": "VAL", + "tests": [ + { + "tcId": 2680, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88A07441146042EE9AC27C19A2DDB2D8", + "z": "E5B224E59C1966985FB684E5D586DC3F6379217D8EB423F725D4CB9B5E", + "l": 1024, + "algorithmId": "485005F1F8C9128A7D4445F413805E95" + }, + "fixedInfoPartyU": { + "partyId": "5A9B13298EE0227B39569A4172153C30", + "ephemeralData": "27A3C25A4C86A522070B415DCF71D33F38B234C628E9F05C3ED965AF37" + }, + "fixedInfoPartyV": { + "partyId": "22D3188824DFF20B4C75AD53BECB8436", + "ephemeralData": "E6616BC3255E91E4F36841F2C14D9AE48DDF0915414F59B6591D0DE343" + }, + "dkm": "67AE2AC9CDC305DB1BF2005231F4447B6E4A95CEF9738E9D40F4F7C0CF915F671CA970BB542225520A8B0B65777F6CA3D942F7AD808823ED240242B3D39074C25DCAAD894ADFEC433C58C206FCA2926F43639823542F9BC579184C7F303D4D5D388F7B2F5AC41111C644C90AEB101B51F5848BE47C0EDBE40BDFBF344B4990CE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 113, + "testType": "VAL", + "tests": [ + { + "tcId": 2695, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5283A78310219C23F73F7A2D725B8120", + "z": "7650CADC38066F17CA635F87460058681EBDD5824308FB1C1356F5BFDF52DA", + "l": 1024, + "algorithmId": "871F1BFE108E8D2EF960EB785CFDAE92" + }, + "fixedInfoPartyU": { + "partyId": "21BC3724763F6EC9925F3CAC353C0986", + "ephemeralData": "DFA5EC20187D6DF82B72889979BC92AB51361EEE50C88777F3FC6082B7B87D" + }, + "fixedInfoPartyV": { + "partyId": "ABA40F7424BD480C26F398115ED2E5B2", + "ephemeralData": "E9B74DCA506C969E1340D74B089DE8E28BD3E3E315BE8D0ADD87437A92CAED" + }, + "dkm": "68C1A2F3D10A830111DC0BD94F6C167FB8A34ABCAAA7271BA48091046C22CF56F6AE73B7AF515AA85CE9FA59C718C2A7B4C8EFA02261706C44F3F7AD6435B7506FC80FD0AE816EA6F72385DD91A7B3527D08C7C6FC1D80603DBD08E4E0A139D2CECD630A1EC126F633652DD9565A9791AD24ABB6F10A8F8197225DAB0089E18F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 114, + "testType": "VAL", + "tests": [ + { + "tcId": 2710, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDC33E97D0687DD38DFD44D94DCAD625", + "z": "FF4A5F63EAEDDFE575CC383E3EBCB87F70F3828916BB446AFCCCEB1F978942584DB38452", + "l": 1024, + "algorithmId": "68969B839C4C262985AF4EF2A0C53B82" + }, + "fixedInfoPartyU": { + "partyId": "154652C18E220077EE2E334DE31048E8" + }, + "fixedInfoPartyV": { + "partyId": "FA0B99E2FD3FB114751F0F75C7996D52" + }, + "dkm": "9527EBCC25F67DAFCE56F11DB2195B2159E266A005B054CC9E62D58F1C02F4F139B06F6469EAB9D460B9EC54FD5175D300B7CAA8CBB81AF8E2551A5F3043BBA72EEFBCABC893016FA0A09B904DBC75FD6B95D98A77DA6A456B62B6019DED0D2F39E22E8A32A0EBFC4F1AF595E62A5B413B6AA4126B1A6BA5C3FE55B0774C3F7D" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 115, + "testType": "VAL", + "tests": [ + { + "tcId": 2725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50AF0E1D1FEF0323109E444532F0C4CF", + "z": "9F6B5E447D788EB5AC9EF5ADB867189BEF60B10337356380DE31A21A", + "l": 1024, + "algorithmId": "F546BC09DD9A9787631DA11650270427" + }, + "fixedInfoPartyU": { + "partyId": "8135B98A115E08BE6EC949E77846FEB1" + }, + "fixedInfoPartyV": { + "partyId": "9180D71C53C9A1617936E7CC56FADA0B", + "ephemeralData": "00A885FF1017E5BB333B5AA3C514F5C384882E643E5FEBAA8D7DFE84" + }, + "dkm": "BC9CBE11938FC082CC0633573D89A8F26257DCCE22F84648B389E76E4305D099F5BEDE194BA8DF1F2D2D8868B191788F90A982CA5C659849C68550C369F88B47C090D177CD162CBAEA5129B457614BC72E0B6B764BE779D39854A474C8E0760395B312FB3BFC97FCCB6759CE0089EE42B1164554529AAAEE4C066577E19B9996" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 116, + "testType": "VAL", + "tests": [ + { + "tcId": 2740, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1F71AE1EC5A93A5E9BAB630367B03A3", + "z": "A1F4C1FE4AF66FE337B8409CCECA0EB1B81B095765890C2EE45AF9B49D7828703A9B3E54", + "l": 1024, + "algorithmId": "9A861EE04893F665D75B3DCA5D2A5784" + }, + "fixedInfoPartyU": { + "partyId": "D794F40A98BBD65B3682DE8A7B294C83", + "ephemeralData": "A1C04B1EDAEF2C1F85C672938BD32EA0DF0BE2E7186CE5100344BA416F2F9DCD74451F3E" + }, + "fixedInfoPartyV": { + "partyId": "1122804EF14B323D23490BFAAEB62CAE", + "ephemeralData": "EC2751DD0A9F36D526604DAFE594E55C2BBB6ACA24C4E469CA1450AAD75AE0BA4C105EF7" + }, + "dkm": "D06B3DA559709451E0382FEB960882D6EDAFCE76811F00D28103B901169C5A9A95FD9FEEA3B0E9B1C2AF40ACF6A513E3B185D00A32F3DCE016970CE3C796694C93416D50165F92F553F2BF243113AE9C1820EA2B717F2C8288E380E8B9C0C36BD1D9AE6088B17921BFB678CCAAFDF768DA95DA2A5E59EE1415D241F8A24E0682" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 117, + "testType": "VAL", + "tests": [ + { + "tcId": 2755, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CBEE452F43A3F47AF5F44D157DCFA2C", + "z": "B8FBBACB541EB261CE06DEAA21335426DB444D9670D7EE435DAEEA5B9ACB1FDB12", + "l": 1024, + "algorithmId": "61C5D493E6876F3B8342D0B1103CF8DE" + }, + "fixedInfoPartyU": { + "partyId": "CD3E96CE7C6024568608FDF44FAF885A", + "ephemeralData": "A489F6C91DEC406B5594628934C280BFDF713FE4F0025BD738EB96F86BE146F276" + }, + "fixedInfoPartyV": { + "partyId": "213F6684AD25BB63198FEFCE103ED7DE", + "ephemeralData": "CB0004D1E63CCED0A9F0D01060000C115DD1E16ECDA9B8008BB290EC820ABED6EE" + }, + "dkm": "DD49A03760A311F701A5AB8CF7F106037CC7376F51E72CB1187DDA27310E7939056326A138584BCB905E94EE2A40C5AEB825095D5EE3EA09EE0053114607890468BB63CC5FA35B8EAF0166A43BD216E7462B7B1B7FC3B25910F5A39FFED23BF370CACF2B76D66C4EC41E1159E8636F46490D3424EA6D45FF22831B72E11B4D80" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 118, + "testType": "VAL", + "tests": [ + { + "tcId": 2770, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68BA4D8E5C798CF9495FCCD8EBE9EC58", + "z": "A8D84E3FD489587EA010928601E5813AC5A09001375D25032D547856057AA7", + "l": 1024, + "algorithmId": "F51E1642CC296BBC3734C7CBCED2B74A" + }, + "fixedInfoPartyU": { + "partyId": "B95D947AC6E6BE047CC810C724C0B16F", + "ephemeralData": "E9254AABC7FD69B929FD7BD050C8B54DB4EE80EFFE87D997D6344BA8DA3EC7" + }, + "fixedInfoPartyV": { + "partyId": "848CCA89ED8DEA7D23FFFD10787BCFFA" + }, + "dkm": "C038E33F0A954E42752DC0ACC5B846996D867F9632ECB3E521C7F23AE479F88DF75A98DBD26F32EE635EF3CFF7A20A7C5CBD0E1985AF09C0EE582F1F9C8C31F8F5FF3C716C0D8575C12200D6A4E281A0D7FA5677271D8290E5F9C66BEE684A8016B2C60B515CB2C68005F7B63DD982A2D99A04D7EFDA4EF106193F649565BCCE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 119, + "testType": "VAL", + "tests": [ + { + "tcId": 2785, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8EAA6BFD0356BD35DCA384EC0EADBB88", + "z": "1B72B61EC1CA35E29099688C8F097E1BBF93666439FF6EEEBBC9A2F080", + "l": 1024, + "algorithmId": "44313BA0942621F505BF7230EBFB654E" + }, + "fixedInfoPartyU": { + "partyId": "1D87D5AE4D9A886799AF1497768907BC", + "ephemeralData": "4CCE042870CE07281CDC5C7DE3FB389D08D7BA9EFE100371744C3F1A1D" + }, + "fixedInfoPartyV": { + "partyId": "F4759966869647CE339C01B2ACAD0DE1", + "ephemeralData": "56C63615C89B9C562A0C901CC3346D4CDC7012F5F2402A57CA5161EB5E" + }, + "dkm": "1C59F72B17BD9AC33AB2368EE0CA2FE57EEFDAE45F3434F3A0C18871FB59C23EDE11EA5DD0C2FA4212721654EC0BB07511267E50AD073AEF239E20941182FEFDAC8F0EC195FDCBABBE231EB1B474F9BA17356FF5016DAED4916595A95CE34F6B0C30E521CF678F3BC421898E2AE36297D6188EC30055700BE076C2405601DF37" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 120, + "testType": "VAL", + "tests": [ + { + "tcId": 2800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CB7B3299FE117EB62C13F33C614A0B6", + "z": "8EB459563AB414823048481E52DAE676B89A902546C0FAC116DEE64D1D45DF92", + "l": 1024, + "algorithmId": "A1036A4BBC3A1241DDF937519F77436F" + }, + "fixedInfoPartyU": { + "partyId": "5B3C7B7F3804FEC2D053E6256B290D5B" + }, + "fixedInfoPartyV": { + "partyId": "4667C0A432399B14974A0D64D8422929", + "ephemeralData": "9C3E1D9E1A4B11D4DEFFF6B572302DBD59D806B10F4320900A938F922F6618EB" + }, + "dkm": "76874697755613B19F43DF1F2807820812094A47BE3CB0DE17C4DFCEBE49F954E9108D0A2645D5B11726AD2957A53A517AD5A60AFB366DF084F8D08C69DA13C4CA7EA85426AAA6301B4982FD01979FDD10F638835AEB47C3C9909B24B9B0C2A574E4627A18538D0F94DB920826A5E0ED7218EA3AB9DBBA6DCD2107DC5BB4F2D6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 121, + "testType": "VAL", + "tests": [ + { + "tcId": 2815, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF148C66A338F4C15F90940CE845B5AF", + "z": "01DFA3C0777BB348C9DC865420DFDD2F827D38548331D32CBD23B889", + "l": 1024, + "algorithmId": "11369535EECC4F019E21FBF6A103510C" + }, + "fixedInfoPartyU": { + "partyId": "D494C283DCE579717D650C3B74387EC2", + "ephemeralData": "A0DBAF617822470800D5C02FF388FCAB3DD6774BB0DF4E1815E3300E" + }, + "fixedInfoPartyV": { + "partyId": "94EFC4582FAAEBFC72B260A61F8545FF" + }, + "dkm": "3250942FD689ED8F3ECE7628B2E3D24389432D92C9723DAD791CF78A8D243145B88D8671DABDDA9081C1C0FAC50817533199BCACAF0AEF985C733ED15568E4D9AE3522CDCF9FF67D6CBA8510BBC8BD8B0746E0339581A6F86FC6B622284E94582689D6435864C1EC0A2AA070DC75991EDD7458E1FE222511DF8A84C23857CE84" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 122, + "testType": "VAL", + "tests": [ + { + "tcId": 2830, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C713FFE51020F10DC6623E2A3ED98A42", + "z": "10B50315F57CE251D21116B4D6DEF83E724D1493B5E8756160AB57BF02759CA1D15F1A5AE5", + "l": 1024, + "algorithmId": "1F862B10E8DD087CC862F203247B381D" + }, + "fixedInfoPartyU": { + "partyId": "EB525B387BAC66B7E76B3B63EDA04E26" + }, + "fixedInfoPartyV": { + "partyId": "BF5D4BB6DADDB1A38A8B1C893B61A654", + "ephemeralData": "770ECB60BB4F1B010C8D89C06315319CD4545DC02E918FF69996694D1EF78D030F5F73448F" + }, + "dkm": "592E9425F616E5E71EB157ED783900C12AC0705039E8E9564A6D2FD4381D2BF70FDDE040032FACFDE0D6A4FBFC8EDAC8DAE7A3AABE951CDB70512598204A711F5F1F3C73838151B73BEFA7407459B61E28F0885DD2F3D9F5BCC58A7C539BE069EA4D1DA78BB2E5A5CBC34A94B690D84C6F93773CD1CFCA87258D3194BDFF4D22" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 123, + "testType": "VAL", + "tests": [ + { + "tcId": 2845, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34035723D9B1E130617C8D5D75F9B25F", + "z": "2BEEA5B32D90F2FB83CE729879A86B8A95554678636B092847369299", + "l": 1024, + "algorithmId": "963AF49D190821D76C77E30D1F062FBB" + }, + "fixedInfoPartyU": { + "partyId": "16FC9646566EF3BE0B80D41E80489E31" + }, + "fixedInfoPartyV": { + "partyId": "1B83940801A7387F88B1403838C5D7E7" + }, + "dkm": "D03F58BE814DA3CE63D818B1CC1E6F7605465FF858499E6F443EEB0C8790C896348F01959327886F6B35C4AA2D07946C6BBE3314242719F022A37561F446D3846CA7D966A9C1B3D3728CC17AFB680059683E54F3C207DE6C1D56029A6F196E16BDF25674BD0AA5AB0D30E643D36779F4C612640C68E752D3F439F673738BB137" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 124, + "testType": "VAL", + "tests": [ + { + "tcId": 2860, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29E57C9103F369FC16DC7BFEC2E64458", + "z": "09DAAA817595EF568A9990A05FCEB125C4FF2CFFA8A829DDD8947BD1D0", + "l": 1024, + "algorithmId": "093BE9108CE8E3C25490FC44A6985210" + }, + "fixedInfoPartyU": { + "partyId": "4EFF1A3E1B7A30A66E3EBBBEFE45C38C" + }, + "fixedInfoPartyV": { + "partyId": "4E33571EE5E17A9F4BECF0A324B7D652", + "ephemeralData": "885C411EB259D2E8E423D32F9946F03B4B7D1570B86073690601E73C1B" + }, + "dkm": "0DF62BA90B74CACB29E43A0048F5E96F9B057A0EFB0470F2FC9D0E86ECE8C2BA9C9935995261E80C21ADA934F1E4769D34C01D75E9AA4014AC33916323C6EE188F3AD1AA18A8B0ADBD3FC5CEE493410D18907BA9BD3B3BBCAF973C281A3D0DF99D024DCD3BF1A64973B3A14F61C46A02DAC6DA8B020E043A08A735A3B7AF2EDE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 125, + "testType": "VAL", + "tests": [ + { + "tcId": 2875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07CAA02C520D058BB23154CD8CD48AF8", + "z": "9090194944E7F0C9C97A6261C9D8DECF51B12198B18822A68AE034AAF7", + "l": 1024, + "algorithmId": "47B851EC1EFA1453A0979E95A4FC763C" + }, + "fixedInfoPartyU": { + "partyId": "3235DB4C6752BCD81D4126F34AB37344" + }, + "fixedInfoPartyV": { + "partyId": "928D419C4CB92E3E4F3DCB893426BC61" + }, + "dkm": "0A40095112F5CD6A626EF2A64DA38EDCCA0255FF0F6DC3E00D2161854DEF667BB170E8C9D8FE43CAB5E9AE151C457F4AB4BD2A5696810ED653A9F8CED9AC727EB71A702676A4EEDE4F0CFD7B2455AA19B1C59A9131AEA32FA464B9684C9894742D50C5369692733391A5A1FA6A381EE2C183B634EBC9D79C2BF3E1CEE2196318" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 126, + "testType": "VAL", + "tests": [ + { + "tcId": 2890, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32C334BE6B08DFAE6D4DB909A8396408", + "z": "BA40CE1FD6AD157B43071D6D9132DAA2C6BEAEC04D8A5158BFECB71E3015FCCDC1B6ECA4", + "l": 1024, + "algorithmId": "70184FA7E501E20A6B818323B68BBB4B" + }, + "fixedInfoPartyU": { + "partyId": "10AABB555C148DCC528A094E0CA25699" + }, + "fixedInfoPartyV": { + "partyId": "108AA0160908B5D1F4B05324B9CA90FC", + "ephemeralData": "4007864C8AEDB64881537D17F1027400763E22609C6BC0EEAA08DFC4E0509977B20B6AB4" + }, + "dkm": "6724A6161E8028AC119C2C89AC20CEC824823D55378CBF9840E0A908B6B5160BAD82038931AB4B894AFC444B1FEB3E75597A0FF535A181AF91EAB3E5B1B70399F0CD7C1B01F56E32DEC1D8522121BB5B831CF8D1C0B5BA3817B672225D8E83BAAE308BB96F9468B500521EF63E4BF661BFC2EA4A9EA5B6ED0DCD8DC4553A73F5" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 127, + "testType": "VAL", + "tests": [ + { + "tcId": 2905, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE4D53B32E0B5224E5CD95750C2D3297", + "z": "B1B1201C32A9C2C7BEB875AC0F1886CCA370B51E23DB401CEAE0CCF4", + "l": 1024, + "algorithmId": "24FE97A28BF4A8EB8320DE04D505EAC7" + }, + "fixedInfoPartyU": { + "partyId": "C0ED0A56560713B7D697065A98D0F2D3" + }, + "fixedInfoPartyV": { + "partyId": "8FFCCEAE2231268F9B3D81FB3A9D182A", + "ephemeralData": "65E0CBFC9270D7771307F20DE8D4BC68616D995842EFC548D8E52C50" + }, + "dkm": "89CB1C5AA51A4CA436A600BF5274CAAE435D73FFF10F9EB4488C2C78910E3E592C82EC3DA8B8E63E450ECEF815F6FBE460C2E253DD3DB391DEE3333C548502EC358E2A9FA8BC1FD134045462D1E319621F25228D529045CA156D9EE79748308D4874792B5E070B398FEF7134545267F3D8C338B336A6D17AF07306734535008F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 128, + "testType": "VAL", + "tests": [ + { + "tcId": 2920, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC689DFA378BD2207EF2DD2FA985D96E", + "z": "24FE7704CFE297513D149BFDEF5024F25C42BE218C4A7BCFF866045AC3EB23B2", + "l": 1024, + "algorithmId": "B28B8FA0E0723EC2F9AE90A10315431A" + }, + "fixedInfoPartyU": { + "partyId": "625C6592B3DA8D736A57C8A37C2DB6D6", + "ephemeralData": "3AECAA60C16F7BE5CC2AB8C5906BB6257D57F49621C372AE0F16BF784DD6442F" + }, + "fixedInfoPartyV": { + "partyId": "99DD489456F46D17F75DD72832D4407F" + }, + "dkm": "C8E8077DEB63437377C742270D5F09E56933283AADEDFEEBE066D9ABC4147F10F7B3F4EA70150F139F48DA862DDC20E3A68B8BEBF4F19A42B82988420A34FFF83A4998F42C9D660B8D6725C03C5ECF61F1E008961AFE6DCDD5C4DAFDCBA09752A7311CFBF35854DEFE74D6237531FF2F4A8E419F08CF4E9D6F8618280B1AF087" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 129, + "testType": "VAL", + "tests": [ + { + "tcId": 2935, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA611FE247EFAF58212461AD50B8C5AC", + "z": "57A4C18188770D03401339E90BC4F2705A57F60FB312EFEC38183B427AA58E", + "l": 1024, + "algorithmId": "A168251710EBED153AEBB131E0983264" + }, + "fixedInfoPartyU": { + "partyId": "2A14AD9B60CB8C946526AA7182F18CF6" + }, + "fixedInfoPartyV": { + "partyId": "4B2AB68FC43477657AC078131E547F55", + "ephemeralData": "D604A1F2330C073013E3394F422C884CF955A5B26D5C775FCCC5E8D50583BD" + }, + "dkm": "0B00F5A0547D2429EE5BF5718F6AB1007C0172CC8C5EC0FCC1285481748AC368D118077EBAF05A9779C9BF1039CC55735EC0AC492975A4F9D6F9D227B3C3CF7B9C5B1E02B97FA1B0679D2AE1779E5C3D6CA9F06B0093E6548BB1786781D27F7EEAAE05F8944B7F7279AD8ECD1A7C9844217500E11A403B024B071EB8D2425596" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 130, + "testType": "VAL", + "tests": [ + { + "tcId": 2950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B25507E1B9AA4F33C158E59FA51FBC4", + "z": "E41FA8BA768A1A965437612E79F914FBBBD8B6F1185B08FAB34A347FB6", + "l": 1024, + "algorithmId": "E6652731FAE04B8095527EC49BF78B19" + }, + "fixedInfoPartyU": { + "partyId": "D768E1F6F2CA331AF3B2445526301737" + }, + "fixedInfoPartyV": { + "partyId": "E951F8D4A9651F36EDEF50A2A090F880", + "ephemeralData": "4A4D241E3941C694438EAF3A3AB2B1B55E4496FB5F0561B666B186DAE1" + }, + "dkm": "F504A9B756B551661A13212D3905287B7DDBCEDC27A181A20FA7F40B6E955C4333CAA677D76AA10CCC460F3204DCCC8DC502D31EF91042795AFD9EC96A6649DAABEC477984557A358CF37B9E8D51FF55225BC51DCF28313679CF22A8280466E99BDC832BB702ED259009016DD981FFE29432CFD3D3C80FE2BB24F106DA3E4F8B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 131, + "testType": "VAL", + "tests": [ + { + "tcId": 2965, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F18AEF7BB4E7EABD54348AE27EF0BFE5", + "z": "869ADB348A5895FC5ED956F18B4AB8A81D3F61960DCBDD095A61AE64DBDFC999F4EE", + "l": 1024, + "algorithmId": "15C881C3B27725CBB03F407FBAB30DE1" + }, + "fixedInfoPartyU": { + "partyId": "8653B0885680871D415A0A35FFE7CFC3", + "ephemeralData": "14D2414CD682D5696D095D9EE73F7AC74945422D26D756CFDE81F0430263A7D2465E" + }, + "fixedInfoPartyV": { + "partyId": "14526146EB8B2BB40FA3CC60DEC895D6" + }, + "dkm": "255930B364513D5E9A19B96FCD9323320ABBBDE6A1C8F8C8853675611775B2E4D429035D2D89C769CF550F32A0A088FE88BB44E5616CC2E31FF0A6F0722D88CDB7E09BE2D9D50C468CA63CBA0F0B1B5486AF5A37276CAC76117CF67982683707ACCDACA3CF3C9F70C18CE530432C8C6E071F7B3CF9BB8FCDFC5E886DDA691D74" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 132, + "testType": "VAL", + "tests": [ + { + "tcId": 2980, + "kdfParameter": { + "kdfType": "oneStep", + "t": "444165877B9831CD8078E61929730F34", + "z": "BB46F6EDD223777790D3BE824989C1FD7D6ED56E76D847A765B6C8D4", + "l": 1024, + "algorithmId": "4788A26110D3F1CD2917EAED137666B8" + }, + "fixedInfoPartyU": { + "partyId": "43BBFD36EDA023EB993C8FB067A29B51" + }, + "fixedInfoPartyV": { + "partyId": "01B177E4A55DCDB092C8F94FA70B83FB", + "ephemeralData": "DFC200D5D9A202143A73F259DFBB7A5AE51E5F5EF0846DCC0633D224" + }, + "dkm": "28A4954F4900CFD121E451823E48F4206CF0A44A5BBEA5146F89E88D6CF661717D5D67F8EF823647E5C95513F24647373F5245B67B234CF1FAE61A03C24C702578E747704AB48BD37790C861386A30068B7507E016D026792C1B35702324DC0790BC88BE96628CC8C4D586245F0D251CDD38702FD59BF7F74641B5CEA67C5FC4" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 133, + "testType": "VAL", + "tests": [ + { + "tcId": 2995, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DC3793D50763CD3D7084848579D822B", + "z": "A062392B77BB184763BAEC7FA4977ED88EB764C0EB5628354097F2112926BCDCAEA8382B", + "l": 1024, + "algorithmId": "BF6B4BD98E87EEF0F969BDA08DC387ED" + }, + "fixedInfoPartyU": { + "partyId": "D9908BE5AAA1C7B05646745C6EE2BDA3", + "ephemeralData": "C4F6B6E187BB7D0F4AB8F44137643248810248B5C5FC142037F8E2C202F02E03A1AC7535" + }, + "fixedInfoPartyV": { + "partyId": "432FE4A5B2901E4E92996CF28F9FFFB6" + }, + "dkm": "0051D5297DE1FF44CB0230BF71EB8CCA50549E9DA8B5BCCF0FFFC6ED6BAAB3954A731FDDE6292983F881386BB79D17EB52B614FE8B9906433707EA71174734A53FAD014CA45EF8F40F2D47AAAACC585F049487DC64BB71A407636D3891EBE7FA33E5B7CFED3B9F0F24927E6886CDF44A92C071572C9CB299F7565A3B7E86E886" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 134, + "testType": "VAL", + "tests": [ + { + "tcId": 3010, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0EBC216F6CA8D692C1EDD7E72A90101", + "z": "1283FC3BA9E7FE73C76E779C50C7AA658C3237D943FB99E061F39FB385", + "l": 1024, + "algorithmId": "140012E2A8389445EFA3DC116568C7C5" + }, + "fixedInfoPartyU": { + "partyId": "A6A42EAD6821B30C732E2258A883D8AD", + "ephemeralData": "0656E943537B423489B40096E915E42549B7B412187C4A79A503E304A0" + }, + "fixedInfoPartyV": { + "partyId": "7A10402B385E080F9FF89BBD4159451A" + }, + "dkm": "D54502A65E0ED463A2A5E58EED875305A960F51744595B6931F72D5A2A55997AAA55CFAE93CFBECA6CB41F41B3491DD93A916AB103F931C51ED944A8D2D9BE468E13E59DE1B76DD304266AC5D512F1EB9C73BF4B29688115BAF7483FB8270C1DD58EB1E81067566C13720E6D11C6483546D46E33F87DB6CA6E2C59228CEFEC97" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 135, + "testType": "VAL", + "tests": [ + { + "tcId": 3025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BC7F89FE72562010427DCE47933F2D9", + "z": "14C6112A93D1188F401BEC5EEED524DA2FDC49233DE292D3D5CA96D99C6D01", + "l": 1024, + "algorithmId": "2A78C9B58B9E39CEB4AD368C95D63F6C" + }, + "fixedInfoPartyU": { + "partyId": "BB049E02E65F1D0E949F2C47893271D6", + "ephemeralData": "F03D358C41DF4085AEE85216B167CDCCC2AB37C4C10D2DE57F680ACAC34A32" + }, + "fixedInfoPartyV": { + "partyId": "D7D0DD1F1AA3B308CB4903C6F76E1614" + }, + "dkm": "043F6B2751F8942598A5CA7818AAC314F8E6090C287CA212A7C63060583D057626C9BD499B8132BCC3C9F4BCF078DE772D8CF4F3231180394F400CE8C81F0CFA60DFC482B4BEF43BCA0D9C0A7663DEDF5311111F77BC5CEE4E2E7D2C170DD56BAD3744A475D560DBA822B23EECF2E58A21912779EF774526BA1E49E94214BA46" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 136, + "testType": "VAL", + "tests": [ + { + "tcId": 3040, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8062526B03C3DDFCC88A1B7EA7D5577", + "z": "95A2733E1FF0DE532AC202A272978DC5B04DB10BD4AEC578D397C31B5394", + "l": 1024, + "algorithmId": "66AA4EA3DEAD19245546DEB11EEB7980" + }, + "fixedInfoPartyU": { + "partyId": "D696E33CB8DCA3CEE732504AE413FE2F" + }, + "fixedInfoPartyV": { + "partyId": "22059478D23DFF69050483B318AE782E" + }, + "dkm": "B1649D8FF218798A1AD55B889C9A24A7BF77AE2EB2E61BE1B35FA0C8FA18970EC5488D52CF4DD48E1E658FE1E881B4A84CA63E46CBA61A8D1DBD4EE0B2B2CC50A5A50C1BF537A12F70BDA3A4382989FF6FC2E81145441C3735373A891132E221179DFFF56C52D5E2EAD3D7676ED517948D05E502B3A9420390B16A1E5C2F21AC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 137, + "testType": "VAL", + "tests": [ + { + "tcId": 3055, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FED2C21E70EECFCDD074A0D38E7AFD00", + "z": "63BA50DF007D2BFA02D885A6A74196BA0FD212665E941E795B9AFE23A7260687", + "l": 1024, + "algorithmId": "C3DD974608EBFA25D9C0CDD04AFB6FA3" + }, + "fixedInfoPartyU": { + "partyId": "BB69160BB5151E6202A036703F80EC27", + "ephemeralData": "C1E4F6226F87443FF5849E929179363163287C9980F8AC232D02582B8088B6DE" + }, + "fixedInfoPartyV": { + "partyId": "A2C882A8894D117D94FCE232990003C2", + "ephemeralData": "7BBD4DFA518014E53A4E318E7C96BE36C72C0A93D0E74192323F6A29EFDFDA51" + }, + "dkm": "1B303CE00B48BC227D9931B771839DA773EBB386304EDA33C5AD17168C442CAE15ED8BC416BB23017B62F4B52EB35866583F7BC94B5EF7689326C115165FE62939DE82251F7BEDC9D07AB67B26B1DAA1AE80FAC0D150F41D8CDF893E20D8FBDDDA628966DC6128E00DC3D5AB65AA5F4EA3B86BE0589E1FFFE40C9D5C93B3B339" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 138, + "testType": "VAL", + "tests": [ + { + "tcId": 3070, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73331E44DBB8397756558496727017FE", + "z": "D6FD9B18F5CBE079416B9A4F27F6B6EAF4F89864E6DCA6E4B512608B", + "l": 1024, + "algorithmId": "E599FE54D7FBD66295DC9A1075F16D7A" + }, + "fixedInfoPartyU": { + "partyId": "FE0E893A5701E3ECF34C88A2445100E2", + "ephemeralData": "996C3B02696152B446630406A9499D1C94AAFAF2B2A98B9042C16C60" + }, + "fixedInfoPartyV": { + "partyId": "8EB091A87451933C2FB76ACDD2EF0614" + }, + "dkm": "BE0F5656E19A3FC33D786ADB02EC641B3419A630A98F6C8E453684061D7AA6E980396035D8C720E6EF2A806759952548524818EAE89AC042A2500120AFAF71806C6F70F8AAF91CE7A6C1DFCCEC3B76F46CF8842679579C5D550EDF6A98E40503873D6BF767DCC239B8820A9A18EB27880664FB26E408CCDF34497CE6181ED05A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 139, + "testType": "VAL", + "tests": [ + { + "tcId": 3085, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F021EC60579F485C2DB2E6E38E6F7BBF", + "z": "7B7E9E8E154A6BCB3A1CEE884F84BE81231ADEF85CAB138D2CA1332024AF6BD8FE25434F", + "l": 1024, + "algorithmId": "E8C038BFCE8EB001AAC36B82781B3B35" + }, + "fixedInfoPartyU": { + "partyId": "825F439D48A08544AF6D4ACC540FC112", + "ephemeralData": "2E9043C80C889DD34E030AD5503656C6CE36492F94EF9E8CE9B458754FEA75D6BE906FFE" + }, + "fixedInfoPartyV": { + "partyId": "F96EB4B0E7B8C6B9F25705254C3CBCED" + }, + "dkm": "9D6C9130F156CAD45EF4E52E7BD4DB1A1327871189CCE4E82FBB0C4FF4D509457340C035C6607A2C5D0135A75D0E8937F4DFBD86D3F4EDC247965D95E07334240B21C41C0B61F3ADA44B875DB88EA8CC8FCF358ABF82371252B1D227F65527CCF43F976786A9078A2F417CAFE6B005C4D5E8C13A499DACDBF6A913B25DE2A330" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 140, + "testType": "VAL", + "tests": [ + { + "tcId": 3100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF1D26F172834F445AB15690380241F9", + "z": "D4F5C4B1066962885118E87995CD5E8BD0823D494E4A1C031C032ADBDC47E34301", + "l": 1024, + "algorithmId": "DF613DE1B7ACF11BB52489B9A7E2026E" + }, + "fixedInfoPartyU": { + "partyId": "11FB0C66398C1CFF171D031A5A9DB5CC" + }, + "fixedInfoPartyV": { + "partyId": "273F6AFCC07854F5CA5B884A4FC766A2" + }, + "dkm": "F9289EFDF288ECA49BB05F162C6601814AC355F8462D01C4F03DB1B4ECBC3904B766FDB73CCD982A5A0986EC3015B93C07A9CD6736128A50A80871E8F1C7F9D1FE7CC13996DE26D594D8A46198C139C0603E0C067500A65F030005C99A59DB85EF273C0A71A02FCB275EE9DFB5BC0B230CE88823AF0402431B962B210515C032" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 141, + "testType": "VAL", + "tests": [ + { + "tcId": 3115, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E4D501F6FAF2686894CD1DEF55E562A", + "z": "B09C25EAEFE23BF7058632894B4F0E7467EC4A402D8D3BCDFC985FF1B1", + "l": 1024, + "algorithmId": "B08E29395C228E490E8B2DA9DF99AF69" + }, + "fixedInfoPartyU": { + "partyId": "3315536E3698C86E2868CEE340F9EF1B" + }, + "fixedInfoPartyV": { + "partyId": "9D39D7BD69A0B62DB103B2BAF7D50173", + "ephemeralData": "BEC817B68EF53C6087AD569CC5641A84A366B3A4468FE8B7326FA5D985" + }, + "dkm": "205892BEBF372563EF53086FD2AE5B1DF1B144AEC32CDA5119FDE796C6AEF9F3E87335CE8D78BEA72A68CD840BAB05E8B4FB5D3B7D863CC86AF056B470CCFD70651007CC3C809C72AE4D2782762F692BB5299F57A8D8D1D442D380C717395E64241EFADFEA5CEA25057FF864006F19732E0F75AB4D8696CD82497A45808E031B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 142, + "testType": "VAL", + "tests": [ + { + "tcId": 3130, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E33D63B3371108389BDBD241D6DF478D", + "z": "47CE5D3976D5F2DF08DC0D76D7857FC225AE331273AC16F9B6D1CA1E56D6", + "l": 1024, + "algorithmId": "883A0540399EE1BFC67EDF667212B1C4" + }, + "fixedInfoPartyU": { + "partyId": "A7C0CE2AC84DD7B670E7EA62BAA45B13", + "ephemeralData": "DD13BF9F201597D8C3F38EB66064489C7C5BF42B77CE072FEDDCB2924612" + }, + "fixedInfoPartyV": { + "partyId": "7BBB7294B3746E37953C1627882E3210", + "ephemeralData": "2E401A4828CF0C8555D2C5F966F0F3704DBB9DFA6E4FF918096EC67FB05A" + }, + "dkm": "BB7052131BE4642798ADF3E33616C6E5AA6308E90E5F9479F81E11EE1BFC9FFC85616C64F8D55CCB901C930398323FB2A904ED0106C303B33CBD0A3F337E44DF75A66F0E53607E20207BEF5E83CD2E3D48FC55C2ACFF024E61E9FEAA21D9E86F10B2AD42086B4BD9120A759B9AE6BE72313741042E5CF76DC7FC90B802D30D66" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 143, + "testType": "VAL", + "tests": [ + { + "tcId": 3145, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E040576B85565499C1CCD331B04B9A1", + "z": "8524E2F7FCA823E353D1A6805611B133E997BD235E776C1B789620B2F4795064", + "l": 1024, + "algorithmId": "8D836E941782B9CB2C195827DA3F3A34" + }, + "fixedInfoPartyU": { + "partyId": "9D63F07E49D857D481E2C41D456BF3B5", + "ephemeralData": "3E2DE98F46129A354D51D8524045768933E2A9238E07A0E9758D24954E46A260" + }, + "fixedInfoPartyV": { + "partyId": "AEB0F2DA2433CFDECF1F7770BEA2F3F3", + "ephemeralData": "E943722CA58361765711C32407309BC97300E54712FB19F851877A5D1E7AF516" + }, + "dkm": "F7B4E8F99C3B232C8F99CC7583189B8BE402D8316449F7F1ECCCC336CEB6AF4B25ED228FB4824ED79F39CE997226F20A7B610617A3441B624F3C18C1509EACBB40C42A0D0DDCDCFE839DF8D12AE442A2673FF90428A8085DFC2D9119D67235B9F470DD0DA5D2445ADB0F8F0E8D874D596AF801D6FDFCCF2D5568D06DECCE45F6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 144, + "testType": "VAL", + "tests": [ + { + "tcId": 3160, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5981E059CE159A4FA01C91C633E5AE12", + "z": "3441D37745C9B9DE8C96829B8364A44570F8EC1A4951857F039BBE63", + "l": 1024, + "algorithmId": "5986F09BDEBF4A6E46F63ECE907494D7" + }, + "fixedInfoPartyU": { + "partyId": "D9189C5D8DDA8355DC7B65C98DED2828" + }, + "fixedInfoPartyV": { + "partyId": "44AB8C55F5AA7BF44AD7339236AB5BAC" + }, + "dkm": "07F9D7ECBE9005607318895C2BD7CBA9BDD8FFFA185A86194FFFAB9C9E75A1CBC89DDD0517AE8381BFB127A01D9FD2705BEA6EAA8196C0B9623EC6D65D69A065AA704C6F83B055AB4730CF5F8668EE90A90456FA73FCDFBCD21017D302589027D431440D469288623E92F17E0DEF9DC3C791FDA3A3AC13BA212AE4BE792878A0" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 145, + "testType": "VAL", + "tests": [ + { + "tcId": 3175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1655BCDBF5E6C54F59ED06A7AA6EF21", + "z": "EFB6DE8BF110942B3B4B7C410C66FB1D8D0208EE49862E0AC62E1A7FF3", + "l": 1024, + "algorithmId": "A25A6E6078752F6E37EC4E22328190E0" + }, + "fixedInfoPartyU": { + "partyId": "C77C3020C016DC2B53E085A4C9136A2C" + }, + "fixedInfoPartyV": { + "partyId": "782B3A3D0AEBC7951ADE8BB3F7703668" + }, + "dkm": "0657F08BEC97685DA6A1EF569604EBCB44C713346118CC96FE967B2FFA2C6C89FC9591C62EEA9E258F98AADAB44511866DE4811DCB74F14B97DAA1647EAE7AC465AF473EE19BE606E360ABDFFA78F1185502F61A272975B01C07C56F6DC71E52B8940D0119EE8956A3C7C947AD8DC1A3EAEDC676BF3695C81F1419802DDC674A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 146, + "testType": "VAL", + "tests": [ + { + "tcId": 3190, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02C4AF83B0C2D22EB3648643F1CD2626", + "z": "9BB67E2921EBF197A597F8E01473FC5D0626707DBC24407A12C81E93", + "l": 1024, + "algorithmId": "C4191BEBF59A1F16DFF87C6DE4318EA7" + }, + "fixedInfoPartyU": { + "partyId": "D2731001E54A0753CC61975B665B47BA", + "ephemeralData": "AED8C0A69AC5ABC01535028989FBE8A733A26B1E188BD0AE5E32555E" + }, + "fixedInfoPartyV": { + "partyId": "2C3C4ED0770C3C8428CBC1197D86A3B1", + "ephemeralData": "F54C05D31DE51A25E47B66DDF7EDB8978FB29FBC3E0E785B4E1EAB99" + }, + "dkm": "0D366D6274D1D1C64D233C520347677658D3C2237D9B418C1E677097A1519B7BE619EBA16189B1AE691FA4CE5394C632E425E25F392AD3FA01343714D3695B75F4059B35CFE187B0FA46E59123092D872CA7BDE30F85CCB4EC29731D22B7C0A2375531F58F5754B5B35339F96EF5C4490874F5A0411C6C2A7B1D1CFF4186F900" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 147, + "testType": "VAL", + "tests": [ + { + "tcId": 3205, + "kdfParameter": { + "kdfType": "oneStep", + "t": "386E56FD10F2964B030C67C4E39AD561", + "z": "8E0BE09D7DF711D829C24488BFB9718E326C14F9218547FB7EB88B76964421", + "l": 1024, + "algorithmId": "4D0BDF9F91A7E5D78B1BD234C9FB1E40" + }, + "fixedInfoPartyU": { + "partyId": "EE13463E9C9F56A8C295495B706E7681", + "ephemeralData": "91EA25A53216F6DC45D7FBA582A0F73B1BE03A9365BD1A5EF4E597449E6364" + }, + "fixedInfoPartyV": { + "partyId": "6D2F2F8B40117A91E94A6C7C399E09FE", + "ephemeralData": "ACB996EA2AF1B6ADCE9EA79C8A672C2F394EB3804DC11E8DE34990A5466083" + }, + "dkm": "EAFD2708D03A4A10BA625AC5A48F4A11639F65C4A4FFFB1BC42EE9D2E9D0AF79AC02CF54117FB044998EC65A9D652E236A970A278623F8EF04B86B4B7EEFAF0550B75583925052B65AC136379DA80BEC5DC919F8F09F5A2491397DA8B999079E6EF7790329ACFD88C22FA5EB9AE736CE021079C13D72C73674DAEE43583AD3DF" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 148, + "testType": "VAL", + "tests": [ + { + "tcId": 3220, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E53935B0DEB8AB0A1D456A3973B6288D", + "z": "49132C9177B53411952EC7359C71FF70C770A479ED0D06473066963A5B", + "l": 1024, + "algorithmId": "DCB93A437A01B33C2DA901BE36AFBD1F" + }, + "fixedInfoPartyU": { + "partyId": "C5BF86A82246AB52A4091F1B79077DCB" + }, + "fixedInfoPartyV": { + "partyId": "F21B9FEFE00549500B6D7B4246AB9A56" + }, + "dkm": "63106FA03DD7AC6DC80D76D96B6F5CA344B27E144E890D6756C4B68EBF04F1EBB4A2387A07801589ECBCEFEF99780D6C74C1842F682B6162F71F6898F8C065B2398379AF69CD11C4436F81EBE9F5E2056DF3CD55F53E04D5BC6676F4A1F31DF0C1000ACC1662E550C5D4C954BA21F246C1CD4B6590B56A4D554D5308CD206CC9" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 149, + "testType": "VAL", + "tests": [ + { + "tcId": 3235, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3C427CFA769A5B93D59514D1CF0B9F2", + "z": "F64C3F502682157FC57EF9129E335D50C136EF52EB63BA83994CACC5F2", + "l": 1024, + "algorithmId": "8487BFE10C4D3DE6EC2866DC3E8B8C6A" + }, + "fixedInfoPartyU": { + "partyId": "E56BA7083AFA75B9CE32AA6979BF1C81" + }, + "fixedInfoPartyV": { + "partyId": "4772C19BD8E66A19533D070237B88B3A" + }, + "dkm": "77ED00D97FE9EEEB205B6384FC51633C63DB1D307AB054C1BD6862F11F7B688D6D476573C0437951974D2AD6DAFEE2B4CCEAD20D9462D2B14EB8B201F44F8775585ACB68E7191B964C8E54EE67C27198E2E990E1273F6261FF9A2D2B3E87E4C9ED95A1126EA6701A3B251FB5968B4A47D6F380E976B092889361FF8478BF848C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 150, + "testType": "VAL", + "tests": [ + { + "tcId": 3250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F2D6B5A7D20CBA5616918B3BC167E18", + "z": "188CDBEDB588C93ECA076C1F1375BE972003A0383AE6650AD4C24574AD4615095625A0FD", + "l": 1024, + "algorithmId": "2A390BB889FA1B20E3465F95ACCD892C" + }, + "fixedInfoPartyU": { + "partyId": "BA44E6E43F5694566E4868370221E3E5" + }, + "fixedInfoPartyV": { + "partyId": "D92EE60DBCAA6F7C0E9C36112A3F870D" + }, + "dkm": "5618A0E2E29A8A74A9A9D0800ADCA20DD86D8E15E616A462EB870DC679843B394AEFEB1A719A41256936FB762DB59A64398B100EFD6BAB3A42190E5479AFC110FD26A19426E69144AA6C7FB014AC86FF5C189C8C885A9C3D8A70574D18442E9DBD8260109094F29B266D40D02B09440760B5D1AF72F11D67C410E57610B72FD6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 151, + "testType": "VAL", + "tests": [ + { + "tcId": 3265, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46722E6D2112951C51EA0F232DF84C57", + "z": "528B46C764A0DA75B853CDBF3BA734619B9A157B3836BBC8BD52E9972E3DFB", + "l": 1024, + "algorithmId": "26456356FA1AFFA1BFAD595C81F1C584" + }, + "fixedInfoPartyU": { + "partyId": "3C6ED7ED72308E053CAE3519FFD38C72", + "ephemeralData": "9ECAE19D30366B852B819B41EFC6E42F81F6ED49BDB884A778B3F2C5EDB1F9" + }, + "fixedInfoPartyV": { + "partyId": "17F2F17C94575BD87F8C9E95CEE2636B" + }, + "dkm": "19A6D88305BEE44956658BF4F6243C594A2713114AAB9606DD4563ED0599AC4D240FBA59661A0573401D8D2EFC2947D7D0ACEFCA9E41E66747AF54DB0FEE3A1E55807847BDE6A49966ABB24F38947712D68BEBACC19FFC597A45F8D6D33C6561F96277CD8ABFCB8E69D47C8C62B59D073153A61A8BE6EDF7330DD4F72442C63F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 152, + "testType": "VAL", + "tests": [ + { + "tcId": 3280, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11B5074E383E9A5331C0C87F1009A86D", + "z": "9815FC059EF2287DD6D2E66CD0DEC6A4E4031CD9AF3FB30EEFCA7886D37F14C1D6D7B18C", + "l": 1024, + "algorithmId": "BEC5B14AA10DBAA64160BC7026172D98" + }, + "fixedInfoPartyU": { + "partyId": "325E8E5B9F22D1FD0789352958FCEED9" + }, + "fixedInfoPartyV": { + "partyId": "9E12EA2B865E55A841DA6907D3C66CD0" + }, + "dkm": "702DF52318657C6C621E72A5C94A09BE35CF390279568809BA583222D3333F0D0245CA68A58769711E2752FCD090ED3D3ED92E8A02E7A289DB5EFE921694164B2D981F262DC145332C524DD013C09282A33A87F8E8FB32EC6D6B5BA96D47921EAF118BEAEF43EC2CBC836D20CB33909A79098959AC036A5C902B0AB3FE297D0B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 153, + "testType": "VAL", + "tests": [ + { + "tcId": 3295, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1D40B439149101A9CC2ECA073DFF78F", + "z": "1C795715A7374BC16E91A80B24D526694BEFCACDCBD9A5CF7B65D1BED412", + "l": 1024, + "algorithmId": "777800EA01FB0A6F19E7E81CD8C63DC7" + }, + "fixedInfoPartyU": { + "partyId": "AD8218777FE0729E89C35B59293663D5" + }, + "fixedInfoPartyV": { + "partyId": "C00C5FAE74634D833CAE72CAE929C0CD", + "ephemeralData": "EF145F0ED6ED87F10B6D754AF01DCC5729AD164526DA1E5CF4F366DE06B2" + }, + "dkm": "6DD1856468E15FA7B6BA0DC07100447A8DD2BCC67948AE253225EE8708E71E755B1F52AEB9C2EAD55BFAA2C39D9E7FE8527025C95D39F170DAD2C5B02B954338B79A45515FA1B2A5C9F71B45772B00D8662E7010E1345BEDCAB54487D842E8FA892877618880948A5718C12525BE55B2F915126E7BF77CF5E0C18631A4A957AC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 154, + "testType": "VAL", + "tests": [ + { + "tcId": 3310, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9440E35D2D194138DA0D1FF618BBB283", + "z": "0C8311AC2B2B299ADE350EDF5B75FFCB53E2F3F39989F6581D0FC0FAFAE99B5F", + "l": 1024, + "algorithmId": "7A3CDEC918DB17F0E03EC66C6304A8FD" + }, + "fixedInfoPartyU": { + "partyId": "44E77495FFC09EA3C37F41F52DB947D6" + }, + "fixedInfoPartyV": { + "partyId": "734670E394D0600A6550B5E56D5D61C6" + }, + "dkm": "3E916A993BB4A02C912C355B642CE81CD4272A18AA19704EEF22E3BF1A7740C30AB9BB6A96B93BD1E199729F4A7FE2CE3F33BBD5B7885757854520D5C32D988939677006B47D0C290C6A500AB8E8F543143385BA14EDD13B9A2338C39A6ED6F6F11C4E688AC8DFAE79CD6B79BC8E80A18B0BD56EAD0390634A6805F156F7E047" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 155, + "testType": "VAL", + "tests": [ + { + "tcId": 3325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "297D756F312344F38B2A4C2854D2A71A", + "z": "D15BE9B692394540C7C54FA1F5DB39E1CBA775052F062FAF4A8335AD", + "l": 1024, + "algorithmId": "DD8103C0FC7938145265E0154F75E1DE" + }, + "fixedInfoPartyU": { + "partyId": "B34EA3A1EA2D36808B4E4FBA9EE233BC" + }, + "fixedInfoPartyV": { + "partyId": "D4C593F0FB68E9B6B020902D68BAAA5E", + "ephemeralData": "E66604EEC2A28E68A13E58EE86F69C26DA216A7550EA91100892D172" + }, + "dkm": "67DBC687499A414547D52B8E4C0832AA73B555CF64DA0A4F6AAF42A89863536BE32427BDD8BFECD23978672C02D3D3D23D93C68831BB1567F88F9DEF5EA9ADDD565E4040D9434E236EB4B8F5805C65316608132299219C8AF0BD645531A3197E1C88E6ABA9AF63D916C3F188B8E7DE1AAD83CF119B4E88F3F74C8484C233AC11" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 156, + "testType": "VAL", + "tests": [ + { + "tcId": 3340, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD9E6A0C9F05C3A896A640A5E328C0F8", + "z": "99F232DCD8768B96BCFDAA6D13B67110475557DEC1C01FAB0A2909E7A2A414E9", + "l": 1024, + "algorithmId": "87312049CD973F04FFD2E19B1E223DFD" + }, + "fixedInfoPartyU": { + "partyId": "51B7E58085371D97EEA08E7C35E4EAA1", + "ephemeralData": "D4B13C77724F7BC7D182CB2073F41F262D782E50935B0BE7173E408AB49B8FBD" + }, + "fixedInfoPartyV": { + "partyId": "EF465B4482941EA5A917E457A31E6A24", + "ephemeralData": "346C8CFF3601CD4A0842D5D40FE66F875AAB9FCBF10FEDCA0DF14DDEC3C55957" + }, + "dkm": "6A618DB64E8ED791A07DA052D812D4D21116A4BEEA7B685A7052CAFB821AFFE6480B51A6EC6755B9359B049AA4930BD02CCFA5555DAABD95E1F14E700BE7220C90AC3C1978885F7371D5BB6C12EAB5EC87A66FB6F335EEBB3F0D4C1E3DFF3E898939D07765705BE512595B66904CD5A296DA5E65FF24846F91423E80919FEA79" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 157, + "testType": "VAL", + "tests": [ + { + "tcId": 3355, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C99F908766DCCEDFD32839515C6591E2", + "z": "037086E7B6772F29F092DDD36243EE2C04C39C36C5413DB623544CEA9FA33938", + "l": 1024, + "algorithmId": "17996A7F15A88C94F8ECC3845602512A" + }, + "fixedInfoPartyU": { + "partyId": "429C62F814A5413D952CF9C746DDDFEC" + }, + "fixedInfoPartyV": { + "partyId": "CC303C9DD5BB76B2A75AF63D4D9839D8" + }, + "dkm": "047A624F01E14D0254B1572FE612AF8FBFC69BA05BB4FD3276B715521E305EE798030174D00A9E5632474CD787FF561D54CAB44BED6F957768F9A0184AE8290C9A30CE76F390C96975767456654EFDC450E034CEEA0AEA65B6E086555AF900F3674352E502305C8D9759A58B3B4FAF750DB67C2781C8EB3799E6C29C63BB06A7" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 158, + "testType": "VAL", + "tests": [ + { + "tcId": 3370, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D2BA5056322E9D298DC8F73A8B60F38", + "z": "0EBC647640D468D5B8AB6E740BBF30E4723E23CD7872B32079F72B87DA2F3F8A8D", + "l": 1024, + "algorithmId": "1E6A55702644F2A5760F5F7510027857" + }, + "fixedInfoPartyU": { + "partyId": "0B664462435A1815CF842A2CCB76ADF7", + "ephemeralData": "7FD7263984BF826405E869F9FD67BE5DB24BA7E464B57589A1C1DFDED35637713D" + }, + "fixedInfoPartyV": { + "partyId": "B334B1190FA18B0A97CF2371C8FF6EE3", + "ephemeralData": "0C4DB3EBD8C76EF3CFEF3A4182A77580359D63673C1F5C6F504F08435BA4A7E6AF" + }, + "dkm": "C8FE6062A530DA5D7F9226CFB596EA887B9EC6E96C4B0A735D29260922FCE792743BAAEE12EB05E7943E344F656A3133657BEDEEEF3E2C8485D1AB2362E2878B8150651D1C283AFC19078FBEDE3A517837188691596A38C48FD5F2763F13BE6E3DC60E050B781ED85AAA59CD9E7B7D9AAD26D09C7DFCDD540E031E805FAD35D2" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 159, + "testType": "VAL", + "tests": [ + { + "tcId": 3385, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEC045F6732B0489B6C20BA4BF04207B", + "z": "D516685D2020E3403CE319598A811527ADD6CADD7E43B0D0C4D85F6108F6031E0820B9", + "l": 1024, + "algorithmId": "F841A8D78F1528A217940E45C599DB65" + }, + "fixedInfoPartyU": { + "partyId": "A84D864505F247CB60A21785F4239FB6", + "ephemeralData": "C5007896BAF6DD2712BE21720F28E2A63DC76D9A6866B73E7EC7BA2004AE9538E99997" + }, + "fixedInfoPartyV": { + "partyId": "D86B89E11421244FCBD31EF1209D2DCE", + "ephemeralData": "85FB1D729D31AAFF4EBF5C0E874BA6CF6D99A1B6C6E80DC343DD9CD71676896F3D0110" + }, + "dkm": "4CDE61E47C4DBAD15CBDD6EBD69A068F56CA455C3864583F4863AACD08F0AEA06CDD06BE0C7A33F64C3794D90C43E83BEE068BD430954ADFB958E36F88BF4C0A9E7E0001B1C570942C160AA92D5D9E8AB1B9F97BACBEBBBD274E5ECCBA5B7A7C25591E856CF043A6B523111927690CA4B2F98E8B68B5E7E1CA3B2602F6FD14E6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 160, + "testType": "VAL", + "tests": [ + { + "tcId": 3400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA0376B1FC95056EDD4006B7A0BEEA5F", + "z": "89F997C64C599A614DBB3EF22671FE3E1F1399D62006C71EF9FE3CE5CE25", + "l": 1024, + "algorithmId": "0E50AD7E37CC005E2D817241396E862D" + }, + "fixedInfoPartyU": { + "partyId": "300C9D2B633D5C71B779C7B422FDE87B", + "ephemeralData": "F2A3437C1655220ED97912129EEF7E6F370B530D1F64A2819C29EFF92EE0" + }, + "fixedInfoPartyV": { + "partyId": "636CA750807B4B5195E30DEA50151AF9" + }, + "dkm": "4F4B71F7A1774835CC850E759C6EC9877DAF96E95DC935DD35487647282E60651EAFEA13D13AA02570D14261E09E9F0F9FA5BE96E40189F2F16B19B172ED8A11156F600D7FD20A2FE2F0D623396A289B45A69D8973947F48F9A594DF5FC4C43985E378CFB29DF1F029D3F773A96B44943D95C3061A43892694D02995E44E80A8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 161, + "testType": "VAL", + "tests": [ + { + "tcId": 3415, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5461BC79B64B9462A32CE2456153385", + "z": "911D8FB0C8468900844739E8CA7BF3A815E0965E2CA62504A80959F334E93CB3A02457", + "l": 1024, + "algorithmId": "76A2F2D4E279A5C72A23B148EF491C4C" + }, + "fixedInfoPartyU": { + "partyId": "2A20E8841A4175032BE4131248D01F79" + }, + "fixedInfoPartyV": { + "partyId": "8B91ACBDA2E48FCA0FE754FD68DC49CC" + }, + "dkm": "C681813A879349D3B5ACBAD98B018D23C4889EC1E99D0200C33E5816EA8169DC04223A266B9148C1D00106AFC1DF83EE721ED52E2E85762B24A7B2F70623807507F32FFF80960C7862DBDE3891D315B32357295F6818AB3A88F29CEE3E17F2744343F34DB7912227C9747C1AE5412F5E4C8ADEFF11BC2136FFAEB66E719000FD" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 162, + "testType": "VAL", + "tests": [ + { + "tcId": 3430, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBD41677591D9915C2D67CBC19BAB921", + "z": "8199A2B7A4F2892939E905E37677988833E3F5488374C759030BEDD2", + "l": 1024, + "algorithmId": "C551E01BCCBE326136347E571DDF9EE2" + }, + "fixedInfoPartyU": { + "partyId": "22E06761B955CAB3B70AF25E4BBFDB61", + "ephemeralData": "9E0C7924C14ECA9DDA5DF2995F52BEC6E585CE2EB08282F0BD4A81AD" + }, + "fixedInfoPartyV": { + "partyId": "23309A3C597000BD9A1AD35B5C9544AB" + }, + "dkm": "D2E3F6436A6C561C32B0B057C18D45AFA5E52F9CE749E0304449E11E69EC2B65CF9441EB9EA2687424DFCB7ED6ADCB0DDBD7DF8513BB11690201AB69D120EE784743932E8468118A15C53A7C66ED7AAA5EF0C924C11A351AF50F087129A5FC0CD47B28687D48D898657E1B56A68CB6DF9B30C6BF55690BBDB5124B4123344162" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 163, + "testType": "VAL", + "tests": [ + { + "tcId": 3445, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DB8824644B279B9E4E7AA2AC1BB1D7A", + "z": "326C45448E5A60E81CCDC10159D3C53ED8B63954389987984A73FA8F86D904F5ADABC01AA0", + "l": 1024, + "algorithmId": "C7ADF286E5A146DDA72CCF467BE6407D" + }, + "fixedInfoPartyU": { + "partyId": "49F20B19F2209973AF9B3AE118851901", + "ephemeralData": "17E4BF8C116DDC03DAA168E5242A04F69DB43A36661A5206E5A02F9EBC3733AB52EC556184" + }, + "fixedInfoPartyV": { + "partyId": "B8D5B3D7CD938D0E6B9B25E0516EAE46" + }, + "dkm": "DAB0ED590B68FAA2229FDB6AD34EB1B56F59B92714EE8621D1BDC3520B6AE092FAE56CA3FAE382B68AEAC4EF71607636878CB467236B8E7B9E61A6B054B73E6A94C052E9F245F7525F7C76D1322D90A2796D0FE8D53299D30A67947C4E078BE293A889F9704349B7090F30137B1C3B60046CABC213C534A63950C57E5EE65E75" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 164, + "testType": "VAL", + "tests": [ + { + "tcId": 3460, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17B1F1AEC6B3E59A5461496A430BE143", + "z": "E02F38D721B54C6F8EA026F6BDE706167EC700F45D8AB2EFF58BE46036", + "l": 1024, + "algorithmId": "B7A76088C249E3E7A2749414D22B82FE" + }, + "fixedInfoPartyU": { + "partyId": "4875E6812F53C11C7C278C3131F5F3AD", + "ephemeralData": "71D234A16BDF894C960A00AFA982B71E6A2F14C68910CBB808CCDF84D6" + }, + "fixedInfoPartyV": { + "partyId": "12C5A8202A3AA51450B301886DD6880C", + "ephemeralData": "DFC50A9432031DE2C23E3E7C9FF8836761FFFA89033D7537D8AC9BA3B2" + }, + "dkm": "D16684314C9A10E589FD362B8072D1AA802033EA9E4007EF9C4DB2CEE7EE86B8A072778D2BC1C67BFB81C510296E201F9E8E8E8D2A435223B049BC7516F59A6022B62B75223AEB0891C01D5084E43F2A26A8BB9B8F28F79FC4EEE0EFC76E52B06BAC13FD6A1767EB2EBC01143140C5A872CC7B4B2BB5D4AC424521986E1CBCE9" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 165, + "testType": "VAL", + "tests": [ + { + "tcId": 3475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F0042E03E4725692AE562C51E47B4B4", + "z": "78EE2E62F3842CEAE8EF08518CADC02D3D1CBC2CBEFB67D58AAD84FFC66F6CBB1156D539", + "l": 1024, + "algorithmId": "CC52F04D27AD6335646A320D593236EF" + }, + "fixedInfoPartyU": { + "partyId": "2411892A01545AB5401F814448114099" + }, + "fixedInfoPartyV": { + "partyId": "79A627B900D3DB877CB2C0C9277851C2", + "ephemeralData": "2465A687AD33FC404BA5BDCC5F7FD05075DDA0CD5F1B61BDEEB3F6D76CA1ACF8D3AAEC24" + }, + "dkm": "62B26C5EB3B06617F78961A4D505A4C9C0A58F9F124810B8EC71A5EC52388D287AEF83918435EB53218CE972EFDE6ED8814637A721B755E0210612E8EE278A97CAA0C7C0E0B81FA6771A8805C1EB8093D15D5731266E7442BD115EC640EDA75D365E3AEC9BB15F383A5709DBB87602629B6A7E43D90D04F5F0E892F9F9CAC37F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 166, + "testType": "VAL", + "tests": [ + { + "tcId": 3490, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F7AF005164088243271D3049222B07B", + "z": "9849DED7D1178D1C66FCC0F0CC1F446B93E0833685CEBBB9911D38C950F24229F54A8E", + "l": 1024, + "algorithmId": "C2216466269858C8D72ECDA48A2E32C4" + }, + "fixedInfoPartyU": { + "partyId": "9309035677B842E65959608980F76E1B" + }, + "fixedInfoPartyV": { + "partyId": "71DABA4C213C348C4669057E6E0A0E5C" + }, + "dkm": "2F125CA24C9DD5ECDCC2418744550A26898E2F5049E200B8EC1D22BD2B0F556EE3C72B9CCEFDD60EF6EEFF920C05688AD05BACD342EF5325B040E45BACEB33683DCADC4FEDCA5B039C3B71B3F9EB1ACCAC3A49AEA3272C50137F6A93C37946E37209F371A74908624E82F127243E9F8C90DABAA9ADE37DF177DD10D9E7C62945" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 167, + "testType": "VAL", + "tests": [ + { + "tcId": 3505, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BD51326DCC15054EB36596BF372FAD9", + "z": "7DB6897D3C99CC8F26C94B08FBD771D684F7EAF9737258BD13253AE7", + "l": 1024, + "algorithmId": "5EEA66910B3ADD04E5B32B30F499F4B6" + }, + "fixedInfoPartyU": { + "partyId": "87E121801AADB32A8D68AF08F1BED76A" + }, + "fixedInfoPartyV": { + "partyId": "1E0379DF81EAF87E73813D9D4F79E471" + }, + "dkm": "5FC92F348EB30C3AD4822DD1D55CBD6B09B2661BB20774940F1A94F9FEE1722F3E1C03684637C4F573095ED2ADB8D88535540BAA70017AEF07F5C53CCC03A384F421E54C13841605AA2F4D57033BE856CBCE5F6BCB3876F667A686B772E62082A11CF6266DD672DEED78543F3949FE77F78380938EE7D566284D024A248F720E" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 168, + "testType": "VAL", + "tests": [ + { + "tcId": 3520, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28DA07047B5A8722213CFBF61765F1CC", + "z": "75A3DFBC038C3E8C41B49F55E6CC9D45647798571C33FD1A05766A01A0B97D8A7D", + "l": 1024, + "algorithmId": "A8D2375764814FABE4375D1461AE7DB0" + }, + "fixedInfoPartyU": { + "partyId": "EFCB0509FEDC11EE86CB0718B9CCE659" + }, + "fixedInfoPartyV": { + "partyId": "593A4973DEC21377C8EA28410E6ABE16" + }, + "dkm": "D7C53B301C90CE0CC3221256E72DCDC0C4275CD46575EAF70919720E85B76F4A31271344F008D0301179FFC43D2520406AE5822D46F1359219F9E670170F1F6148E2E3506F95FC7D1104DF41878BCDC597EAC79071CFDF14B5903FE0EE94AA98DA02142A3F5CDA967FCC569A15CBDAFE400F83F321E7F64018C58350527E2760" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 169, + "testType": "VAL", + "tests": [ + { + "tcId": 3535, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BD0161F1E50B718674E2BE796386185", + "z": "BB33BDBCFD6E98D3C1D979805A08F406928F1B9B5B34DEC0C72C5C421FE97E", + "l": 1024, + "algorithmId": "BAFD6552C88E8CC8DB510E7315D5E6FF" + }, + "fixedInfoPartyU": { + "partyId": "4BB2CFB2B8789A585DBB46684953BCB2", + "ephemeralData": "030E2100E501AA39C02945C8DEA979AB020A2FEEA94B28A4C250BB17294A25" + }, + "fixedInfoPartyV": { + "partyId": "296F11FA3FA4916BF6A30A72977423E5", + "ephemeralData": "28C5E9A03673B2D5A08F73BACBC3471A83C16AB96CEF8AFB4383D426380C75" + }, + "dkm": "D0FE06A5BD47FC7746E8FA8286DFE3814E6E6BBA65A43B4FAC234B4AC713B67F18622FCC5A144B84CC371A6132CE3F898532FA4CDD40CE745992E6B246A16BF2BA80DC8F5B07AA082BB5F0E4846D6EB0B2F82A84DC9DC39A3853B72E4F4DB758D1E158120B640410EF9AC4A87D6AEBE1386F279BB4CE755FF9B4A4E76C33E3D3" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 170, + "testType": "VAL", + "tests": [ + { + "tcId": 3550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F429D2D15D8AB086FD642A271AAA102D", + "z": "EE72666666D2CC44D124EA93D503CAA6BD4E82E159EF4781FB0D5B8974", + "l": 1024, + "algorithmId": "85EEC87D55872DE2EEF97922EC63CAFD" + }, + "fixedInfoPartyU": { + "partyId": "A845C1BAC9AB8AE16CF3E092030F1C9B", + "ephemeralData": "5B3E08F496D7C52B4A72C5BD00D41B95A688BD2F2304E73E8886E5DF40" + }, + "fixedInfoPartyV": { + "partyId": "36B06EFF27DD12678D8625502A878316" + }, + "dkm": "F3D41E2C9739EB02BF0B97F10092C82157FE1C09C89A82F2C639EA158E2F8CEE35E35785003CAB9B49726F8D811629D14A13E608DB07F052278AC0168B902EF71FF99DE3AFEB8087A6BAD585032A2FF2F313136CED15A7E806CCBEFA7000808E2DC854F6F2EB74FA4F6E885222848DF1AF2274664C93BA435C6FD87E18F7A2E3" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 171, + "testType": "VAL", + "tests": [ + { + "tcId": 3565, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07AC4524E0D6752B4221C44414BCBDAC", + "z": "40A1C6F1E3BC67FB1347220688C76CB9156C47C13469D900AE3420424E79C1584D98", + "l": 1024, + "algorithmId": "4BB4A7779B474E0B16C493DC265568E7" + }, + "fixedInfoPartyU": { + "partyId": "8FB3F6D947C495E09B7A5ED1F34E2903", + "ephemeralData": "6F2DB3053AFF5E70A72BF15B4479F89731283739BD5063DB526679364710403F8B0F" + }, + "fixedInfoPartyV": { + "partyId": "108AD78F379F0B6B7918E2F200613BE1" + }, + "dkm": "3DDCA55CD5AFD3CCBED72883166EAA7D5C64B6B8D680405334A9C1B4A944D7BCC8AFABDB9E97B82D08A3A92E5B888749808557488E88A43CDAB11A7C9DF3A031AA40A12D7285CD13059B641E5239321767D78746E546C8384361AD01AE69F401AE4F4729C38333EE599D6A0E2E7692BB91873EF39A9088C8641FC5AFB6C76C88" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 172, + "testType": "VAL", + "tests": [ + { + "tcId": 3580, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B787C2DBDDFC50687685105B731FD11", + "z": "CECB44B15086D493CF3BD7E55523F525BE9FF9CE11C4856E94C240BA", + "l": 1024, + "algorithmId": "B5CA305C28B70CB759B4A0036E58A4B9" + }, + "fixedInfoPartyU": { + "partyId": "1680B60335B2542409A96B943A2CF6C0" + }, + "fixedInfoPartyV": { + "partyId": "733239A4E7DB9F4F88DB6FECAA989665" + }, + "dkm": "F9E0D7E79D1D232FF2BE92BEB7ABFE7412A6B9A7F43FC0E26B401427D5AFEF9422E1E64C23E842233C7DF547ABBA12158D92DC5DFB6F0DC4EA7125B1B12457B4B0D2A7FF8886B3186764C47C9AEE08889A5C7E9EBCFBBDD803DECA7C69CF18BD053DC48EB6FA91DA5E87D7480B80FE40C37D8BBEF48BE1DDF1DF3FB743BE4405" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 173, + "testType": "VAL", + "tests": [ + { + "tcId": 3595, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A31AC7A971572CA08117AF08B677C0A9", + "z": "46CAC7AD6F7BF4EF6F9C968D0FB3D3277A55B9BBCEF4B56B68F451CB909FDC", + "l": 1024, + "algorithmId": "B818D8F012637A4CF03C1FD910FC0C9E" + }, + "fixedInfoPartyU": { + "partyId": "C75BE114000C58B5664C475136BF6084", + "ephemeralData": "0E5A9B8A345A4D86DF281FFA5B49AEEAA3BA85D6D7A02F3F0C8CB7F69E30B1" + }, + "fixedInfoPartyV": { + "partyId": "308F75A621F6B2D4CD502B97FB24B498", + "ephemeralData": "1038072847867C5DBF0CBF61223F92D4A482575CA81850882BCD0097661669" + }, + "dkm": "83065768F93E740DC13D6CCCE3399630350C1A538A8FB4B5CFD2279F2D8F982BF21759AEEAA3E34136A6AE511272E10796C828339D239670556095C5B6C63EB7F48D634DD54B08539833277489905A42C6FD35B0772CF1F6AFAF1557F4A2831B53B531337FB7EAF0FCB6C471EC8ABE5B3C4E3C7B30C6EC61947CC4D12958D87B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 174, + "testType": "VAL", + "tests": [ + { + "tcId": 3610, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B74C67FA485BEA479558E3F967346736", + "z": "E140526D452088316E506D15754F186CB34875EA464B0949F2AA7FF22E", + "l": 1024, + "algorithmId": "DD13D9207D519B008C523C2A99039E03" + }, + "fixedInfoPartyU": { + "partyId": "6D0E21E85DEDEB695A2D4E9A4E999209", + "ephemeralData": "F280290CF5EA1D19FADC583D6AC9F684645F6AFD48FCF9E5D30BD1DAE1" + }, + "fixedInfoPartyV": { + "partyId": "C35151529FAC36D56E788C36B2791086", + "ephemeralData": "3CAC07945A7EF72EACF0ECC20A78BBC716E6BDC71591B5E37D94F66605" + }, + "dkm": "460979DFAA1FF8629D0E8DDD499FF21F9A62C52B27348330FB3186A5D83A94E1354A4D01274AEEA4AFE1C1BD2ED022A38CD74DD0C2E2BDFD6DA284C5618E4FA9AE484CD8F64C72AAC16E79AC8DFDBD9CEFEA6422E6433B7EBDCDB7695161E2E605910CA916EDDF23294470B08D400A9020F4811CDF2B593C7B237FE19F24CBD1" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 175, + "testType": "VAL", + "tests": [ + { + "tcId": 3625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C25F3BED5357E872DE353656D7C0CB", + "z": "A6FA9A0DDEA8472D09618326CED4D0C2BCB079087FE9DB6B33B5867FA6770E1C", + "l": 1024, + "algorithmId": "F4ACAA237F9A4F063688613590B90B3F" + }, + "fixedInfoPartyU": { + "partyId": "6F695F4C5BEBA40A457506331463758D" + }, + "fixedInfoPartyV": { + "partyId": "E0D025D6DE38796DAC99FEF38B6B2A96", + "ephemeralData": "1B7E34663D8DC568C976991B8F6F773738DDCEBD069781C38F5BBC899B1693F2" + }, + "dkm": "0D2E39FFBD9CAE4BE4291F4BFE0812ABC6284AF83A74132ED6A6FCDF6EBC3F3145369F29B839B612BD51006B1BBA4C7DC13130ABF66238C1D922685915F5F6D3B15BD58F82EF1B1E5EA319D5B60BEBA4C9668D7A8DD5351C1AD03208EFA5D0C8340532FA24B0551519E422FC8200CECD5C1CBB75DB3AB79C59FD1B172E14A8AB" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 176, + "testType": "VAL", + "tests": [ + { + "tcId": 3640, + "kdfParameter": { + "kdfType": "oneStep", + "t": "782EC1AA43ACADA0C5FB849A36E5CDB0", + "z": "1C79E22563DF38154B28CCD63677E699DBFCF2DA5F30D9063779F59B8C410FE3508E", + "l": 1024, + "algorithmId": "9B92BACC0FE6066C1885216E80748FE1" + }, + "fixedInfoPartyU": { + "partyId": "F004685EF6E166CFC4BCD891126C11B9", + "ephemeralData": "7684BC77519E7B459A4FE2E6AC654F977FF82CF8C624AB4FF859EBF10FEC648F026C" + }, + "fixedInfoPartyV": { + "partyId": "CAE9A0AA196DE038267B02CC0A49A801", + "ephemeralData": "EBD492A5EF357406743ED495B2EEE34FC4AE269281084D75CA5215AD1BBF66A06CE8" + }, + "dkm": "ADA8E7CC7C0CB9F57D32C4F162A53DDBA7CC222CC44C5B3515E6CE03DB6CD107EB2D2AF1470C9105264BDD9371A9E78104723BE5344FF42B0EB0CD92A8FC40F571B3BA97A949A8411DF4977DEBB99BA4A50FAE87011058942D2372806FFAB7FAB67587B8B4AB46F3D6F7F608E6DC7DB9FE64258D34DDC79C6CA988BF3CC2E11E" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 177, + "testType": "VAL", + "tests": [ + { + "tcId": 3655, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99791E41E422A6AD3AA06E3D128FEE10", + "z": "CD3BAB48E0A96DC81285CE1887BE94B355FC9DEC785EA9AC3D05906F32371D", + "l": 1024, + "algorithmId": "B72AC6E2CF80D7E80E20CEEF8DE30D36" + }, + "fixedInfoPartyU": { + "partyId": "9CB4F6DF69E2B10B26BA94AAB1E65EC9" + }, + "fixedInfoPartyV": { + "partyId": "6D01F424E6026A2597CB6096824F6F50" + }, + "dkm": "D33E0D69403A08C3488F2D5BDA6E061B3717A46E3B6C2A1785BB524295B9EFDD6AAF56D586F3EF81C2799A993A6D8080D7887406E1B7A049F7ADB5B76C4A79823F875D189F0A3AE21CB90B9994FD663A28E0E51B30EEEF2A4225EE04D4A3A08A481FF3D66ACC138A702FF4221C3A55051734F67F133807E1C283E6D16E05C805" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 178, + "testType": "VAL", + "tests": [ + { + "tcId": 3670, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AA777ADD73C8500A0AE0ED5B038C643", + "z": "5BD7BBCAB5FCDFAEA9BC9514469E987E6676C28DB5287C1DDC90FFAEC3B0B7E4B2", + "l": 1024, + "algorithmId": "15CF75AE8098024E68A2F281E04E58CB" + }, + "fixedInfoPartyU": { + "partyId": "C273EA8592B7D4A8C794521EBDC9CEFE" + }, + "fixedInfoPartyV": { + "partyId": "A46212DA02CF1406FA4F9D5308DE2E71", + "ephemeralData": "ED55C1CEC5C53D18C37A30AA53F88C58EF3A6BC3242ADD409ED7042C47B8F9BFB7" + }, + "dkm": "E7D0C7721080A6D652B39476B84402A8EB1EA33AE97C984EFC88579CCD108F544F70EEBCB2028BF32A453E58211EEA1A0A1D6F2DFFE2C8990F11CD0756445A0B9BAAF43F570DD00B17DF359AB171807CD8CBC536B211CBAB9F8FCAA0EFADA38381A7850B5E2184DD1B41AE3346D8EF1249001FFACAED6523D714AC5A608F9AA0" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 179, + "testType": "VAL", + "tests": [ + { + "tcId": 3685, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7474F2674336984745EE12B65BF12AE2", + "z": "9D76C94500063FA745FE18D67C47D8B59147A59CB982DFA1D3DC494A9D", + "l": 1024, + "algorithmId": "E4BFCDC5E4A78BB3AFA3D30E108BEF18" + }, + "fixedInfoPartyU": { + "partyId": "6C1AA26E4B4111E2837A463217C1475F", + "ephemeralData": "B3D7C49AC35D6E5E30E35459E569D88DDB430BF62F76D991C6EEC092B4" + }, + "fixedInfoPartyV": { + "partyId": "6F5003A0E8B699AEB5369159992404D6" + }, + "dkm": "7DC3EC9C9C65B87B22D30A0F6FDD292D0C8CA479DEC1494EF40A3A3F132FDEB9046137609CCDDDC4FB30E2914F317FA0D85AE948E1E8D3185B1A6BAB03EBD8A7577A14E8525000174580AB72DEF7C99AF3EAE51088FDBBD065B34D19ED37C13924AC18D268F49457E7203403FF33B812EF400DB247A50DF697D3FEA3A6C08644" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 180, + "testType": "VAL", + "tests": [ + { + "tcId": 3700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22BEC59EAA228D8129710329ECAD0274", + "z": "E786023B82DCE74201E3E27EAC7CDD8BAAD1F5010FB35F98145C82A4401B7AAB", + "l": 1024, + "algorithmId": "8F49F3CC4BEA13AD24AD5E0F5D10B404" + }, + "fixedInfoPartyU": { + "partyId": "8C27624FC95399A6F1EB09D8519FC855" + }, + "fixedInfoPartyV": { + "partyId": "D995D8D9A6BCFD1996C9A31149C01E77", + "ephemeralData": "BDC1CC4B2E0BBEBBD624439DC5E4C3C650BFE0B11A8EE5058AF182D27F5539BA" + }, + "dkm": "00A9EFCAE0C83B59E1253181AC9710E83CEE4E2F4E05B89F27C7B575443C84EF74BE45232B7841123C29B255CC5853A113152715DE196675287E4BC92F4043D407B7E604EFECD8174DDE353557CF36CB1B25CE98B6B28BE0454EBD26C2FEFA77369902E3ACCB9269B03F46A6C73F562A04B742C3EFE1E85F365F86D398CCD0C8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 181, + "testType": "VAL", + "tests": [ + { + "tcId": 3715, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FCB9797D8EC97CCB19CC619A9F84BFB", + "z": "55C3416AA5DD350C40206E9B1B5939283EDCD817F891415036A0368CAB0869E7", + "l": 1024, + "algorithmId": "2C937D9015B7ACEEF9A5227A8DCE7D58" + }, + "fixedInfoPartyU": { + "partyId": "40CF05C7C41BECC1AF6495BB172D28E1", + "ephemeralData": "4CDCCBDAC2FDC32632FD29C65EB9B5A7F2C1D6A78AAB1C2FD90AA646C2014407" + }, + "fixedInfoPartyV": { + "partyId": "161924B8798C3E23819A9461882E2981", + "ephemeralData": "AA0179849C883B381A129138A77E095E3F64FF47A9839CCF47DEF2E115501FD2" + }, + "dkm": "94AAE867CAC9FEF68720A6CC1B7949E4F6536749893180098C80574BFD80B75EB7FF22BF1CFC726D0433A94401507D63A9683DE81C7A43AFE9616D128028CC1EE09C619D4FFCB1313F83C5AA31F1E9452D8022CA7F21FCE382D58E9641D9B0A1D157AA4FDB447DC855A7C3F07EBAA32370A77986E0E1EA3D1E247AB51EB5E72F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 182, + "testType": "VAL", + "tests": [ + { + "tcId": 3730, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBFD517FD87C8D11BFC09F88CFC6808C", + "z": "96669ADF2E4E02350DC17E9F4C5449D169292DF73A3A9CA4054EDD84A1E774B1E6FD118F", + "l": 1024, + "algorithmId": "DADEE4A7F585DC7FCEDBB29AD33E5FEC" + }, + "fixedInfoPartyU": { + "partyId": "52E14253741BBA51AA4B24981729F8E6" + }, + "fixedInfoPartyV": { + "partyId": "350A26208E826CD9B33247B0BC451A93" + }, + "dkm": "F890B3CC0FD0E08E23DBF5EDB45370F89EB5680D75FD6D09622BA78E8B4128FF969473DBDAC776B298C21C19FCF52092A86EEC90DC514BD65738CBE83338C565668661E84B78B040BA8D2D26E34C81335500C583093AC2F272B142BEC4D54FFD31140181E18778F0081B689A01E5CFFD2EFF1963E49EB643BBA9A915D878190C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 183, + "testType": "VAL", + "tests": [ + { + "tcId": 3745, + "kdfParameter": { + "kdfType": "oneStep", + "t": "700439933566057D4540F532EFD8C872", + "z": "913A4F6BCD9486F6C0FF2F8ADDDE7DA30E27077D4A4B990B2B1F23C299844E", + "l": 1024, + "algorithmId": "8E02E4DBF8AC6EA12470B6714ADAC6EC" + }, + "fixedInfoPartyU": { + "partyId": "3DC2AAE656CD9D536B404B56AA3C6967", + "ephemeralData": "4BDAA962EC89723C57B87CCB13E2BA5FBBC0518E3BA2C44E41795CB5B8C3F7" + }, + "fixedInfoPartyV": { + "partyId": "02DD04A9915CFBF00BDC818C737756C3", + "ephemeralData": "38AE2620CF23D7DEDE2E4CDA377856EAA5DE8CD3427B6B3FD972AEC72BF611" + }, + "dkm": "0034FE91B63E72760EBC260E5ADEF552C904585C1AFA8082CC986CBFE4B96CBC3C9943FBFE83C7846D0A98C6C90ABC8D4AA27A47A69B5A5136E2FA9FEC839A4BA9886A0FB24825F5353856C67421C3886B153C556F3325ABA136D479879FD157AD79DAB2E5604A50D0F7741DE79A9CFA51BA4CDCB884710E226E09B2DE6BDE84" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 184, + "testType": "VAL", + "tests": [ + { + "tcId": 3760, + "kdfParameter": { + "kdfType": "oneStep", + "t": "78851DAC0DFDA9180445518E0E907536", + "z": "89DEA1CEA2F97B2F4E660A4D129E74FD052B358D3A98AB3560E24C22BDB7", + "l": 1024, + "algorithmId": "069DFFFD77AA75239E97DC4BE7A73FCD" + }, + "fixedInfoPartyU": { + "partyId": "0FC45475E43FD62451DD3FC032F006F2" + }, + "fixedInfoPartyV": { + "partyId": "CC94913F52A68E69127BCF996F88AC13" + }, + "dkm": "2C0E652881DE7C35277B9E8FFD7659103EECBAE6651849C5990DDA7F11045B515339B9296199BD9C147BB9C64ADCCEBB28E2C6BE097326BA9CC2AF1E94950BC2D95724494DF5CBCB13C10B3C636BA4DA02588DBCB822C4338CE9B209B8DAA3EC48FFF5D58C8921B03EC6DB17BA08D44B5FBC24407FC44B08C178D358F55B7932" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 185, + "testType": "VAL", + "tests": [ + { + "tcId": 3775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D009CB83E8C8FCF5A82156B677ED2545", + "z": "1529721BF6921804436CCE992107B995FD292A51059296E581A59E810B5A8E1AFB6156", + "l": 1024, + "algorithmId": "42436C636CFA7BE67A7AE0013814EFF0" + }, + "fixedInfoPartyU": { + "partyId": "BD76F763123BD510D96B1AEAB4287101" + }, + "fixedInfoPartyV": { + "partyId": "6C7365AE0B690617224C613F4F1674CD" + }, + "dkm": "813594E758C9264550DC1DBC48923AEA25526E57634F8EE91346E213EC41640B0972DFD85C46E4A4F11F7D8F00D12E0A378E48646B75BE8670476BF3FF855315BB321DD41593E0364632ECEC0CBFA398E7D0AEDF29C029A8F8BEF493368C92DFDBC104319FDF74B057B65075E120D0597230BAADCA52F01529EF19EC0BB2ED08" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 186, + "testType": "VAL", + "tests": [ + { + "tcId": 3790, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45F4EC70590A52929D8908F9EEC1B627", + "z": "3070D83BC6983CF98ECF0880A7452AC08077E0E15D98DDE9C86F9493", + "l": 1024, + "algorithmId": "3DE1DAF9BEA648F6644A61820275C4CE" + }, + "fixedInfoPartyU": { + "partyId": "190D641D4A53196B642A60530AF4F056" + }, + "fixedInfoPartyV": { + "partyId": "6C118DA9FC574B661D68D9620D67DC08", + "ephemeralData": "D215EDED8C17F42309FB32357F2E957084B4673CE1005F2C6DECF006" + }, + "dkm": "1F64BC9E8D78F440F1914BC280E2837D63106EEE1A0C372D14A1074327DD1285DAE1D56B6552AFBCACA76FCDF00B24442C9041BF0F79AFF0EFEF290EF6A59A20363BD817BF1D2D0E92055587E11378583DFF1AD8488A5A4D72E56DC239D9185E5557A4A63393DD7BD001FD9BC312DDF6BE22D20369848062D655154975C1F716" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 187, + "testType": "VAL", + "tests": [ + { + "tcId": 3805, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06E5550923CEB21F2112D20454AD9B0E", + "z": "511D08D33412256C435C9BE79D1B14E9AA14A3D50094AD2D6AF805DABE407956018999", + "l": 1024, + "algorithmId": "8F72CEF8EA23EE283E35F41F627EAEBA" + }, + "fixedInfoPartyU": { + "partyId": "7FF9B18A74E5680C4ED2DDCE161CCC6F", + "ephemeralData": "293F922CBBB9E8B57F90CD420CDCFE860891438F2497C3F2B452FD1CBB1AEB7DF1FBAA" + }, + "fixedInfoPartyV": { + "partyId": "47E4C0D0495B1D8BD1F961B284D42B0D" + }, + "dkm": "57D193D7C39F65A6C1197B8F2FC9BE9700F92BEF349CC671AAF02C10320A2807EA64B5C5F757FF37858B2C5562F5B200B6F11F3B96A001C23EB6E6F35CF4EB352CA406E550A27DA2B53371557E9C5C9E2CC7D0C0B0F3E65B2B64EECC12E5232E0218B81612688C174B3A724CCA76DEF38DF0F56E0F993EF65E18D92EC2EBBE47" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 188, + "testType": "VAL", + "tests": [ + { + "tcId": 3820, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C72AB1CAC751A2C5E2D3948D6C2C4147", + "z": "F0613CB6001CCD3034C72BF2D1EFB732A221C4D3CA31CDBBF733B579791E99", + "l": 1024, + "algorithmId": "34CF2B1A14E070A7BB288D59C5FFA1C5" + }, + "fixedInfoPartyU": { + "partyId": "1E00C95C9E7149147F56B1FC7A1945F5", + "ephemeralData": "67D728BAA8BD706180A5A7AB8DD4406C7F403398AB48E9D29B37E0DB0F1F00" + }, + "fixedInfoPartyV": { + "partyId": "E1E7AB6813A87D0E1515511CB65CFECD", + "ephemeralData": "B61792FF2D7EBF2B1B6289D699DDE112A9E08F226BAE9E5AFB7372F41C32F2" + }, + "dkm": "0DB50405B96F518D261A4F20F6DD63AA7BCF514DF52F5DD49D3F8A9BA6BFD110A6A119119711226F1229DF1F2E230C0CAF0D5BE945E9F425C5D23225F29E48BDA4C2DC24337B5804A798422CC45A67DE5F5A7E4DB444EA9D0C0DA3E3C21D2E45C92D3625279C86706899C2F2924304E75B30C40EB3189D423338450181894C7D" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 189, + "testType": "VAL", + "tests": [ + { + "tcId": 3835, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC72410D3971C49245B2B738D5B8B5B3", + "z": "47197E4FC0401C2F05C796A3B6C6A15B1645023F406C0CE163A53A35", + "l": 1024, + "algorithmId": "F77300E8EC7CFA588B03550BABC40178" + }, + "fixedInfoPartyU": { + "partyId": "35967849A7160F5BADB7A087167DCAE3" + }, + "fixedInfoPartyV": { + "partyId": "F36214E4FA18AC6C797795BBFDF1E99B" + }, + "dkm": "4CB3CA48B831C50A4891A74C63EF62AFAABDB62F64C01C6AC61EB43A14992B5D57605A46C5D557BFD75E3B045CAD9BA158C8E069B6BC6A5DB1196C94A5EAE585FD599639A5D820277DA5AE2E5426349FA9E7C39E1EADD6538F4A8A115B3B5A09C6751A407C0487BF8FA5137AE7743DB47DE814519699EF441E706353A1E2710C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 190, + "testType": "VAL", + "tests": [ + { + "tcId": 3850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "566E36CFE642EE9FA46395EBF9DAC415", + "z": "4C3F9CF66010B9711EC1C4B94E1CB69B0509666CB583081847F058E3FA", + "l": 1024, + "algorithmId": "31BB7A74370C38DFA3321CBC0E8E0230" + }, + "fixedInfoPartyU": { + "partyId": "D6E72D2DA82989EAA5BEF9B6C9A8D34B", + "ephemeralData": "1030D3D0B3A053380F163080D34E7CBE31390EFE62B4DD732BE98F53B5" + }, + "fixedInfoPartyV": { + "partyId": "AFFA5415CB601FEF3D1C3315C4BF13C6", + "ephemeralData": "4ACF60E310608B1C754FEA9BA4AD9F5B36EFFF7D7ABFB6AC5A5AACCAB8" + }, + "dkm": "4C613E3B9220EEC810CF42646AB6A8DECD0DA822E6B1B85DCF7BCAEAB6607F43415B9ABF72E7F9324662583C8E93AEFF7B56E7C3FDD495A4E849DEEDEFD593C5C3CBC6C85BD59CAE34979E19C9A055D48FD6763EC46C687D994030B5D4E0B4B32FC7D71E1082E52C3A609399F9175CBAD8CCCDB733126E6544DFA55B6CFE1420" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 191, + "testType": "VAL", + "tests": [ + { + "tcId": 3865, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1193301BC9B8BF64F7B035D9207F4B05", + "z": "6047A47DF548671DBCD65DB424CD2F1C7B2CE94226CE83A033F8C163C084D394C90C17FC47", + "l": 1024, + "algorithmId": "FB21F2BA4D63E4FBA9FEACD01103FE53" + }, + "fixedInfoPartyU": { + "partyId": "1588683EA0FE284D80C6D91188EEAC3E", + "ephemeralData": "27E4CA97B505CDB570AEE4009C043B78522BE6227613577D12E9851179B2694294D1E42986" + }, + "fixedInfoPartyV": { + "partyId": "A246C88CA6AA3B9741C897D5856AAA31", + "ephemeralData": "F5BD31CC6287EDE40739C505C372E17DA67C7744EB73B27A338043C441BB5E9334DFEE0D66" + }, + "dkm": "CE86605119858C75DAB626DB33B67D314BBA980E6EB2A3A9792F15748B724C5FAAA711AA644C992157EF9BFE28B5FC7F9E229B0D99F2D56DB85865AC285898FCAB50592FEBE94205EBA82AED942D8F08083A8191529CA4A7EF66BB7C8C1038C8E869495EBCA3D6CEB830BD2BA78118F153D93A1EEE9A14C0DD7CA7E0EC9F3A85" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 192, + "testType": "VAL", + "tests": [ + { + "tcId": 3880, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7D7126448157582E14A889CFC18B8E0", + "z": "446F15A80011FAE396EE9592832E271A7FBDE67B1AA2E0FD0CC881078036", + "l": 1024, + "algorithmId": "BB6518E6CC445726C48D848B2BE15C82" + }, + "fixedInfoPartyU": { + "partyId": "640C825938BBD3F2E31066966C801460" + }, + "fixedInfoPartyV": { + "partyId": "70E763C86F0D9CA0E9417FE019ED5A03" + }, + "dkm": "1B71D2DF0C953A7242347AA31E79DF228CC2268301B2FA4CF178EB3DC964EDD239433C1A19F29EAF03EE3A17C425D63C957ECDB4B86A0F2752EA10ED013D082B5B9383F9E2B7A7C77BA76CE8419FBF445966A8E0B69D7E9B120F8B0236874373E640D79DE3671FC3A44311F836D7D4BDF2A36CE622462B657268CB63E55A2A6C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 193, + "testType": "VAL", + "tests": [ + { + "tcId": 3895, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A942437D5F6BC4072D8E758C801076EA", + "z": "339A3AD0688CBE810019E75FE50DCA1FCB21831B4D5780CB92E1A2CF0A8F49490DCDAA", + "l": 1024, + "algorithmId": "D96EBA4ADE437C13E5EC2946084776D5" + }, + "fixedInfoPartyU": { + "partyId": "DC4F77B0ADC2E3ABDD406C5A9024AC7C", + "ephemeralData": "580CAF6E0A506C247B3A2F89B370915E6ED123E591C1791510888F2F61ADE79DDF2277" + }, + "fixedInfoPartyV": { + "partyId": "8CC7312132C82FE3CB60C3FF9496BA17", + "ephemeralData": "8D64C3A4F35907665AD0A5309B6F3C8D2B7A696C65A27E3EC33D31AD6E556E07CA7EE1" + }, + "dkm": "0E1B9F9F136736A25B6D02CB85C5F262A75E9EC4889B224A350E217A1D0DD415BC2549DEF77ACF1E3350026DC0F53900AAAECE0986C542A7F959F0A125A6F2D50BF6806164D1AB94606C0B15B0594A9727EF8DE9D86D195C60613BAB9D5046CB3760FC64327009C90934D60088A5E93AB9E2C2EBE40569BFBD852DE89670E210" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 194, + "testType": "VAL", + "tests": [ + { + "tcId": 3910, + "kdfParameter": { + "kdfType": "oneStep", + "t": "957EC33CF5010DD5194A9BB8272C1CE3", + "z": "8E05473DAF5FC6D65BE06BE5B1884AF654F43B9809A08FE0B5FE644E9AD54AEC0158973E", + "l": 1024, + "algorithmId": "4493CC2543DCBC739BBBD769B6852F4D" + }, + "fixedInfoPartyU": { + "partyId": "005CF86D4539949C53D8924698579173", + "ephemeralData": "A713E05F6ADEEE9A3251153471630D5BE40795128A99784F0588C37969811CA60FF39F2A" + }, + "fixedInfoPartyV": { + "partyId": "625BBB9F1C4D4E50CECD2ED674CC7F11" + }, + "dkm": "D32E6ECB1F76C5C5B7372427EA6C0AE197290C25C741A5A1ED14B9C527FDAA1D9C1D94D4F4F8F18E1444A3550581D295D9076AC71E1CF35BD174330B1DC155B7A1580004F7F5B9AE1C4F586E97015813B6CF496655C4A9E627A65715D351BFAA4640A8CF449E858C6B2162205FD8072C0832F0886F30DE34A54EC1F988BA3199" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 195, + "testType": "VAL", + "tests": [ + { + "tcId": 3925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "335EDDEED65EABF81032004DFC8622B6", + "z": "048A138FC632B88C222C4E5F6AE626158AFDB8233DD4D8B4B038AD975FC4A20705C3", + "l": 1024, + "algorithmId": "C6A6C0088037E9F17D9C916384325F4F" + }, + "fixedInfoPartyU": { + "partyId": "A687BA3B594C9DC4D98A560204B903BD" + }, + "fixedInfoPartyV": { + "partyId": "4EA021727ADFD3A175B8A5594D38C763" + }, + "dkm": "C8F9121B1CCC0CB04286AF964BF27FEE0A470234AE3FB0F63274DD2E03F812F4C1AA69B71C849266FB1C4D9582BBF9D900732B28136583E7EC2C17EE7D720EF7BAEE8C204010A2404E49E8C1D7D864C8527F0E2642ECAB70D9713495171234D92F2B9272940101E6297E69E8DBA4F390ABAC84A2808DD02BBEF698148A118208" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 196, + "testType": "VAL", + "tests": [ + { + "tcId": 3940, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDBF1092B78EBD356A75225CF64FE3B9", + "z": "3192885EB425C54E5469BF5228DB5656FB70BCF0BCF0E02E7BF2CF400C9D", + "l": 1024, + "algorithmId": "6A1FF9E7B06843038CE92146941E9AE7" + }, + "fixedInfoPartyU": { + "partyId": "B8319F056EB43D774FB9DA136B84F2F9", + "ephemeralData": "4EFB0A14B18B9D7BE80538FEC2BE4DA61D3EAA7ABE489300BE69DC38673A" + }, + "fixedInfoPartyV": { + "partyId": "A53E1CCAD883348F555A2023BA6C94AE", + "ephemeralData": "1D2CB4C93369F385F9833DE610FA97F5A9B8519BEB52F48033DD47200D20" + }, + "dkm": "08DBAC4D4CF8FE41D523B3F5884A4B019206E06CCB75CDC3BF7BB86CA8060D705F8B52640D61A54D09258EF1F3EB4919297251E8D6D149F827544C162738810CFD8C122FB1A5C6772C7AC3CBE7ACA52A4808814398A8C768C85F399D3ECE823B77C71EE2CCA63D8B2123A237BB064A2E7D6CE79189AC36128D95DAB40A1176D7" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 197, + "testType": "VAL", + "tests": [ + { + "tcId": 3955, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8781F24DB60C936E401CB53C25C5D9F6", + "z": "A37B29319C4AD6872DE71EC4F237DE04A9AE58FB5CE2FA9B6DB70C2D4DE297", + "l": 1024, + "algorithmId": "84CEFE3FD28A763AF03235C50A8BF33D" + }, + "fixedInfoPartyU": { + "partyId": "E72159592B2A6B3E78A1B05C3A03F548", + "ephemeralData": "2ED4BBF459B3BF3C544C745505143F7E723B1BC156C6B4B068BCFF15D808EA" + }, + "fixedInfoPartyV": { + "partyId": "22B64BE9A8899B39488EA32047DD63B5" + }, + "dkm": "0AA611FE5F97E6EECC33ED0CB15D9CA1CD47EED1B5CC96DB37F95CA9396DB24B001FBE657BFD9698EE28A082202B0C12A73F5E52557736026367B9B59319295B5F6AA1F386A3FB63259294CD097D31343429DB5C8491450EDC1AFD65D2B484E90B862414CC6292E0DE313C2E84C398378AC6145910113AD80F90C1884E413784" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 198, + "testType": "VAL", + "tests": [ + { + "tcId": 3970, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E948CC601D346363E64364D43673B3C1", + "z": "0929ECD91286E546E070ED5230800C78154B661324C2431A0FA97C51D2", + "l": 1024, + "algorithmId": "5248EC6D792304020D6B3E8C4FBF55EB" + }, + "fixedInfoPartyU": { + "partyId": "FEC111B170A6439F701BA739BC36AC4D", + "ephemeralData": "00460F910FF0D1DB8E3066D6B8192E3697F56B8B09D8DE0EEDB456EAD0" + }, + "fixedInfoPartyV": { + "partyId": "AF1B30E4579E6054D201081A8824342F", + "ephemeralData": "D8C87663462C2D7C6C4756D9D797FF5CA46519F468CE5A3AF856780D08" + }, + "dkm": "0813348AB9C87A66E9921FD29C987D46207FA0F1240523B54FFFCD1A6A853F28CB78B241424A48CE6557E4434ABCBE1CB9077A19EFFD7EA143E026076E8838A30B1AD8628B285123DA80A653D5EE6B91E5538161FCDA7E39D03F8D79336897F7A87882B3778D5E2D58BD3477319B058D0C2DD1F5A5D8EE920CB395DB4B12BCA1" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 199, + "testType": "VAL", + "tests": [ + { + "tcId": 3985, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D4417AFA6FE1E61819A284818E8C6FD", + "z": "12BEDE46D6CFAA75455BD6F22672F15869AE3E5EB89ED3814E49F87A", + "l": 1024, + "algorithmId": "0C81E2C097AC212AB02BEA312060E1FF" + }, + "fixedInfoPartyU": { + "partyId": "0AB930282A8A3298C71D7EDC130084EC" + }, + "fixedInfoPartyV": { + "partyId": "14A2087229CFB8FFBBD9B4D7AC6F2831", + "ephemeralData": "4DC6DD5727CF14664FB5145CC5F1441C314BBF8DABD4D98C9B3EDACC" + }, + "dkm": "0A6783846D645831BA6E88DFF013749FC7ABFC9273D4F272C7F69D2FA7EA770E1C914D7BED90FDC9BE1A671C86552BED2131C2294CD6E476E4EE938A5B7E091001AC86356811E4326386341C0D7ACB42AAD93DC068CE196F7C1F1204ECA84B795183E770E3A2E4A24C54B988E3EBCDB040E2DEF0D0921F3A0BDE0B3F46B714A8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 200, + "testType": "VAL", + "tests": [ + { + "tcId": 4000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A0BD531FEB81FAAD0C8A32683EA4658", + "z": "43EB8D8D8C7813C427E9DAE923E21E5D797C0D0E570EAD28E8ACCEB3AB36E856EC42B8", + "l": 1024, + "algorithmId": "466D70C5FC559963BE76CBE3D1B9A28C" + }, + "fixedInfoPartyU": { + "partyId": "F1A9C89B23A0BA7AB4369A215E168482", + "ephemeralData": "30D78669FC8CC53A2EA82DE7C2571EF689D4CBC29A5A1F569FE70EFF7B021FD54BAE5C" + }, + "fixedInfoPartyV": { + "partyId": "D061065F5A5E96B3125E9B82636D9FDF", + "ephemeralData": "4808BC6434CE4ECF510F44BF5B07715D22BA2A48D036EB823941D377A763EC0496FA20" + }, + "dkm": "8F4164B2E12593CDBAF1E0F3D6D1EA94012B33E0C34F232E2B670E8EAC99BB5CAC16172023E59C077174B6839F71A27FE5C3533D27FBD65F2A704B922456B925B96AC908A36074B2BA0A81E54E5D10135D3992BC975F7DD2C673D835FC3E8A5B2AA6FCC1A0B8A3C75F5735BCE5FE6FF38DD8A732EB331DBE3C05569C1D1F96DD" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + } + ] + } +] +'''; + return jsonDecode(s); +} diff --git a/pointycastle/test/key_derivators/concatkdf_test.dart b/pointycastle/test/key_derivators/concatkdf_test.dart new file mode 100644 index 0000000..0caeccb --- /dev/null +++ b/pointycastle/test/key_derivators/concatkdf_test.dart @@ -0,0 +1,269 @@ +@OnPlatform({ + 'chrome': Skip('Skip due to potential absence of file loading'), + 'node': Skip('Skip due to potential absence of file loading') +}) +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +dynamic loadJson(String path) { + var file = File(path); + return jsonDecode(file.readAsStringSync()); +} + +Uint8List nullSafeBytes(dynamic src) { + if (src == null) { + return Uint8List(0); + } + return createUint8ListFromHexString(src.toString()); +} + +void main() { + var acvpToDart = {}; + acvpToDart['SHA2-224'] = 'SHA-224'; + acvpToDart['SHA2-256'] = 'SHA-256'; + acvpToDart['SHA2-384'] = 'SHA-384'; + acvpToDart['SHA2-512'] = 'SHA-512'; + acvpToDart['SHA2-512/224'] = 'SHA-512/224'; + acvpToDart['SHA2-512/256'] = 'SHA-512/256'; + acvpToDart['SHA3-224'] = 'SHA3-224'; + acvpToDart['SHA3-256'] = 'SHA3-256'; + acvpToDart['SHA3-384'] = 'SHA3-384'; + acvpToDart['SHA3-512'] = 'SHA3-512'; + + group('KDA OneStep Concat Sp800-56Cr2', () { + test('run vectors', () { + // + // These vectors were generated by NIST's ACVP system. + // The correct answers were generated by the Bouncy Castle FIPS (Java) Lib + // and verified by submission to ACVP. + // "req" files contain the request. + // "rsp" files contain the response. + // There are two types of tests, AFT where the IUT is responsible for + // calculating the DKM and VAL where the IUT is responsible to calculating + // a DKM that may or may not match the supplied DKM in the request. + // + + var req = loadJson('test/test_resources/kdf-56c/KDA.req.json'); + var rsp = loadJson('test/test_resources/kdf-56c/KDA.rsp.json'); + + // + // Form a maps of known correct results. + // + + var validDKMAFT = {}; + var validVALResult = {}; + + rsp[1]['testGroups'].forEach((group) { + group['tests'].forEach((test) { + if (test['dkm'] != null) { + validDKMAFT['${group['tgId']}:${test['tcId']}'] = + createUint8ListFromHexString(test['dkm']); + } else { + validVALResult['${group['tgId']}:${test['tcId']}'] = + test['testPassed']; + } + }); + }); + + var groups = req[1]['testGroups']; + groups.forEach((group) { + var kdfConfig = group['kdfConfiguration']; + group['tests'].forEach((test) { + var kdfParams = test['kdfParameter']; + var t = kdfParams['t']; + var fpU = test['fixedInfoPartyU']; + var fpV = test['fixedInfoPartyV']; + var l = kdfParams['l']; + var algId = nullSafeBytes(kdfParams['algorithmId']); + + var otherInfo = BytesBuilder(); + otherInfo.add(algId); + otherInfo.add(nullSafeBytes(fpU['partyId'])); + otherInfo.add(nullSafeBytes(fpU['ephemeralData'])); + otherInfo.add(nullSafeBytes(fpV['partyId'])); + otherInfo.add(nullSafeBytes(fpV['ephemeralData'])); + otherInfo.add(createUint8ListFromHexString(t)); + + var Z = createUint8ListFromHexString(kdfParams['z']); + + var c = kdfParams['salt'] != null + ? HkdfParameters( + Z, l, createUint8ListFromHexString(kdfParams['salt'])) + : HkdfParameters(Z, l); + + var concatKdf = + KeyDerivator(acvpToDart[kdfConfig['auxFunction']] + '/ConcatKDF') + ..init(c); + var key = concatKdf.process(otherInfo.toBytes()); + + if (group['testType'] == 'AFT') { + // + // AFT test, IUT must generate a DKM that must match what NIST + // is expecting. + // + var knownDKM = validDKMAFT['${group['tgId']}:${test['tcId']}']; + expect(key, equals(knownDKM)); + } else { + // VAL test + // DKM is supplied in request, the IUT must generate a DKM that may + // or may not equal the supplied DKM in the request. + // + + var dkm = createUint8ListFromHexString(test['dkm']); + var tp = constantTimeAreEqual(dkm, key); + expect( + validVALResult['${group['tgId']}:${test['tcId']}'], equals(tp)); + } + }); + }); + }); + }); + + group('RFC7518', () { + test('Test concatKDF from RFC 7518 Appendix C', () { + var kdf = KeyDerivator('SHA-256/ConcatKDF'); + var Z = Uint8List.fromList([ + 158, + 86, + 217, + 29, + 129, + 113, + 53, + 211, + 114, + 131, + 66, + 131, + 191, + 132, + 38, + 156, + 251, + 49, + 110, + 163, + 218, + 128, + 106, + 72, + 246, + 218, + 167, + 121, + 140, + 254, + 144, + 196 + ]); + var otherData = Uint8List.fromList([ + 0, + 0, + 0, + 7, + 65, + 49, + 50, + 56, + 71, + 67, + 77, + 0, + 0, + 0, + 5, + 65, + 108, + 105, + 99, + 101, + 0, + 0, + 0, + 3, + 66, + 111, + 98, + 0, + 0, + 0, + 128 + ]); + var params = HkdfParameters(Z, 128); + kdf.init(params); + + var key = kdf.process(otherData); + expect( + key, + Uint8List.fromList([ + 86, + 170, + 141, + 234, + 248, + 35, + 109, + 32, + 92, + 34, + 40, + 205, + 113, + 167, + 16, + 26 + ])); + }); + + test('Test concatKdf A1 derived from jose4j', () { + var z = base64Url.decode('Sq8rGLm4rEtzScmnSsY5r1n-AqBl_iBU8FxN80Uc0S0='); + var alg = 'A256CBC-HS512'; + var otherInfo = computerOtherInfo(alg, 512); + var c = HkdfParameters(z, 512); + var concatKdf = KeyDerivator('SHA-256/ConcatKDF')..init(c); + var key = concatKdf.process(otherInfo); + var keyencoded = base64UrlEncode(key); + expect( + 'pgs50IOZ6BxfqvTSie4t9OjWxGr4whiHo1v9Dti93CRiJE2PP60FojLatVVrcjg3BxpuFjnlQxL97GOwAfcwLA==', + keyencoded); + }); + + test('Test concatKdf A2 derived from jose4j', () { + var z = base64Url.decode('LfkHot2nGTVlmfxbgxQfMg=='); + var alg = 'A128CBC-HS256'; + var otherInfo = computerOtherInfo(alg, 256); + var c = HkdfParameters(z, 256); + var concatKdf = KeyDerivator('SHA-256/ConcatKDF')..init(c); + var key = concatKdf.process(otherInfo); + var keyencoded = base64UrlEncode(key); + expect('vphyobtvExGXF7TaOvAkx6CCjHQNYamP2ET8xkhTu-0=', keyencoded); + }); + }); +} + +// Helpers for ECDH-ES +Uint8List computerOtherInfo(String encryptionAlgorithmName, int keybitLength) { + var l = encryptionAlgorithmName.codeUnits.length.toUnsigned(32); + var ll = _convertToBigEndian(l); + var a = Uint8List.fromList(encryptionAlgorithmName.codeUnits); +//TODO: add apu, apv, fixed to empty for now + var zero = _convertToBigEndian(0); + var k = _convertToBigEndian(keybitLength); + return Uint8List.fromList([...ll, ...a, ...zero, ...zero, ...k]); +} + +Uint8List _convertToBigEndian(int l) { + var ll = Uint8List(4); + ll[0] = (l >> 24) & 255; + ll[1] = (l >> 16) & 255; + ll[2] = (l >> 8) & 255; + ll[3] = l & 255; + return ll; +} diff --git a/pointycastle/test/key_derivators/hkdf_test.dart b/pointycastle/test/key_derivators/hkdf_test.dart new file mode 100644 index 0000000..2473406 --- /dev/null +++ b/pointycastle/test/key_derivators/hkdf_test.dart @@ -0,0 +1,247 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:test/test.dart'; + +import '../test/runners/key_derivators.dart'; +import '../test/src/helpers.dart'; + +void main() { + group('HKDF tests', () { + group('derivator tests', () { + var ikm = createUint8ListFromString('initial key material'); + var salt = createUint8ListFromString('salt'); + var params = HkdfParameters(ikm, 32, salt); + var hkdf = KeyDerivator('SHA-256/HKDF'); + + runKeyDerivatorTests(hkdf, [ + params, + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '013133aa211d145cbd3f1377259d555c46a9d8a4b04371b9f79b3c9f37c20f9d', + params, + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + 'df6d2879dddf56f373e8d052147dbdafe2c7bdfb26ee425a9d5b39587dbe7e0e', + ]); + }); + + // HKDF tests - vectors from RFC 5869 + group('Test vectors - RFC 5869', () { + test('Test Case 1 - Basic test case with SHA-256', () { + var ikm = createUint8ListFromHexString( + '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'); + var salt = createUint8ListFromHexString('000102030405060708090a0b0c'); + var info = createUint8ListFromHexString('f0f1f2f3f4f5f6f7f8f9'); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, salt, info); + + var hkdf = HKDFKeyDerivator(SHA256Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = + '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865'; + expect(actual, equals(expected)); + }); + + test('Test Case 2 - Test with SHA-256 and longer inputs/outputs', () { + var ikm = + createUint8ListFromHexString('000102030405060708090a0b0c0d0e0f' + '101112131415161718191a1b1c1d1e1f' + '202122232425262728292a2b2c2d2e2f' + '303132333435363738393a3b3c3d3e3f' + '404142434445464748494a4b4c4d4e4f'); + var salt = + createUint8ListFromHexString('606162636465666768696a6b6c6d6e6f' + '707172737475767778797a7b7c7d7e7f' + '808182838485868788898a8b8c8d8e8f' + '909192939495969798999a9b9c9d9e9f' + 'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf'); + var info = + createUint8ListFromHexString('b0b1b2b3b4b5b6b7b8b9babbbcbdbebf' + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf' + 'd0d1d2d3d4d5d6d7d8d9dadbdcdddedf' + 'e0e1e2e3e4e5e6e7e8e9eaebecedeeef' + 'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); + var l = 82; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, salt, info); + + var hkdf = HKDFKeyDerivator(SHA256Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = 'b11e398dc80327a1c8e7f78c596a4934' + '4f012eda2d4efad8a050cc4c19afa97c' + '59045a99cac7827271cb41c65e590e09' + 'da3275600c2f09b8367793a9aca3db71' + 'cc30c58179ec3e87c14c01d5c1f3434f' + '1d87'; + expect(actual, equals(expected)); + }); + + // setting salt to an empty byte array means that the salt is set to + // HashLen zero valued bytes + // setting info to null generates an empty byte array as info + // structure + test('Test Case 3 - Test with SHA-256 and zero-length salt/info', () { + var ikm = createUint8ListFromHexString( + '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'); + var salt = Uint8List(0); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, salt, null); + + var hkdf = HKDFKeyDerivator(SHA256Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = '8da4e775a563c18f715f802a063c5a31' + 'b8a11f5c5ee1879ec3454e5f3c738d2d' + '9d201395faa4b61a96c8'; + expect(actual, equals(expected)); + }); + + test('Test Case 4 - Basic test case with SHA-1', () { + var ikm = createUint8ListFromHexString('0b0b0b0b0b0b0b0b0b0b0b'); + var salt = createUint8ListFromHexString('000102030405060708090a0b0c'); + var info = createUint8ListFromHexString('f0f1f2f3f4f5f6f7f8f9'); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, salt, info); + + var hkdf = HKDFKeyDerivator(SHA1Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = '085a01ea1b10f36933068b56efa5ad81' + 'a4f14b822f5b091568a9cdd4f155fda2' + 'c22e422478d305f3f896'; + expect(actual, equals(expected)); + }); + + test('Test Case 5 - Test with SHA-1 and longer inputs/outputs', () { + var ikm = createUint8ListFromHexString( + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f'); + var salt = createUint8ListFromHexString( + '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf'); + var info = createUint8ListFromHexString( + 'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); + var l = 82; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, salt, info); + + var hkdf = HKDFKeyDerivator(SHA1Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = + '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4'; + expect(actual, equals(expected)); + }); + + // setting salt to null should generate a salt of HashLen zero valued bytes + test('Test Case 6 - Test with SHA-1 and zero-length salt/info', () { + var ikm = createUint8ListFromHexString( + '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'); + var info = Uint8List(0); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, null, info); + + var hkdf = HKDFKeyDerivator(SHA1Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = + '0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918'; + expect(actual, equals(expected)); + }); + + // this test is identical to test 6 in all ways bar the IKM value + test('Test Case 7 - Test with SHA-1, salt not provided, zero-length info', + () { + var ikm = createUint8ListFromHexString( + '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c'); + var info = Uint8List(0); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, null, info); + + var hkdf = HKDFKeyDerivator(SHA1Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = + '2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48'; + expect(actual, equals(expected)); + }); + + // this test is identical to test 7 in all ways bar the IKM value + // which is set to the PRK value + test( + 'Additional Test Case - Test with SHA-1, skipping extract zero-length info', + () { + var ikm = createUint8ListFromHexString( + '2adccada18779e7c2077ad2eb19d3f3e731385dd'); + var info = Uint8List(0); + var l = 42; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, null, info, true); + + var hkdf = HKDFKeyDerivator(SHA1Digest()); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var actual = formatBytesAsHexString(okm); + var expected = + '2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48'; + expect(actual, equals(expected)); + }); + + // this test is identical to test 7 in all ways bar the IKM value + test('Additional Test Case - Test with SHA-1, maximum output', () { + var hash = SHA1Digest(); + var ikm = createUint8ListFromHexString( + '2adccada18779e7c2077ad2eb19d3f3e731385dd'); + var info = Uint8List(0); + var l = 255 * hash.digestSize; + var okm = Uint8List(l); + + var params = HkdfParameters(ikm, l, null, info, true); + + var hkdf = HKDFKeyDerivator(hash); + hkdf.init(params); + hkdf.deriveKey(null, 0, okm, 0); + + var zeros = 0; + for (var i = 0; i < hash.digestSize; i++) { + if (okm[i] == 0) { + zeros++; + } + } + + if (zeros == hash.digestSize) { + fail('HKDF failed generator test A.102'); + } + }); + }); + }); +} diff --git a/pointycastle/test/key_derivators/pbkdf2_test.dart b/pointycastle/test/key_derivators/pbkdf2_test.dart new file mode 100644 index 0000000..2eb4105 --- /dev/null +++ b/pointycastle/test/key_derivators/pbkdf2_test.dart @@ -0,0 +1,21 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/key_derivators.dart'; +import '../test/src/helpers.dart'; + +void main() { + var salt = createUint8ListFromString('salt'); + var pkcs = KeyDerivator('SHA-1/HMAC/PBKDF2'); + var params = Pbkdf2Parameters(salt, 100, 16); + + runKeyDerivatorTests(pkcs, [ + params, + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + '12aaf52b2fc239db41778c59d0e3c927', + params, + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + '5b78b99ac2cc6b6626558f53c7490f4a', + ]); +} diff --git a/pointycastle/test/key_derivators/pkcs12_parameter_generator_test.dart b/pointycastle/test/key_derivators/pkcs12_parameter_generator_test.dart new file mode 100644 index 0000000..88f0804 --- /dev/null +++ b/pointycastle/test/key_derivators/pkcs12_parameter_generator_test.dart @@ -0,0 +1,97 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/key_derivators/pkcs12_parameter_generator.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + Uint8List formatPkcs12Password(Uint8List password) { + if (password.isNotEmpty) { + // +1 for extra 2 pad bytes. + var bytes = Uint8List((password.length + 1) * 2); + + for (var i = 0; i != password.length; i++) { + bytes[i * 2] = password[i] >>> 8; + bytes[i * 2 + 1] = password[i]; + } + + return bytes; + } else { + return Uint8List(0); + } + } + + test('test generateDerivedParameters()', () { + var password1 = Uint8List.fromList('smeg'.codeUnits); + var salt1 = createUint8ListFromHexString('0A58CF64530D823F'); + var itCount1 = 1; + var result1 = createUint8ListFromHexString( + '8AAAE6297B6CB04642AB5B077851284EB7128F1A2A7FBCA3'); + + var generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + var bytes = generator.generateDerivedParameters(24); + expect(bytes.key, result1); + + password1 = Uint8List.fromList('queeg'.codeUnits); + salt1 = createUint8ListFromHexString('1682C0FC5B3F7EC5'); + itCount1 = 1000; + result1 = createUint8ListFromHexString( + '483DD6E919D7DE2E8E648BA8F862F3FBFBDC2BCB2C02957F'); + + generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + bytes = generator.generateDerivedParameters(24); + expect(bytes.key, result1); + }); + + test('test generateDerivedMacParameters()', () { + var password1 = Uint8List.fromList('smeg'.codeUnits); + var salt1 = createUint8ListFromHexString('3D83C0E4546AC140'); + var itCount1 = 1; + var result1 = createUint8ListFromHexString( + '8D967D88F6CAA9D714800AB3D48051D63F73A312'); + + var generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + var bytes = generator.generateDerivedMacParameters(20); + expect(bytes.key, result1); + + password1 = Uint8List.fromList('queeg'.codeUnits); + salt1 = createUint8ListFromHexString('263216FCC2FAB31C'); + itCount1 = 1000; + result1 = createUint8ListFromHexString( + '5EC4C7A80DF652294C3925B6489A7AB857C83476'); + + generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + bytes = generator.generateDerivedMacParameters(20); + expect(bytes.key, result1); + }); + + test('test generateDerivedParametersWithIV()', () { + var password1 = Uint8List.fromList('smeg'.codeUnits); + var salt1 = createUint8ListFromHexString('0A58CF64530D823F'); + var itCount1 = 1; + var result1 = createUint8ListFromHexString('79993DFE048D3B76'); + + var generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + var bytes = generator.generateDerivedParametersWithIV(8, 8); + expect(bytes.parameters is KeyParameter, true); + expect(bytes.iv, result1); + + password1 = Uint8List.fromList('queeg'.codeUnits); + salt1 = createUint8ListFromHexString('05DEC959ACFF72F7'); + itCount1 = 1000; + result1 = createUint8ListFromHexString('11DEDAD7758D4860'); + + generator = PKCS12ParametersGenerator(Digest('SHA-1')); + generator.init(formatPkcs12Password(password1), salt1, itCount1); + bytes = generator.generateDerivedParametersWithIV(8, 8); + expect(bytes.parameters is KeyParameter, true); + expect(bytes.iv, result1); + }); +} diff --git a/pointycastle/test/key_derivators/scrypt_nonvm_test.dart b/pointycastle/test/key_derivators/scrypt_nonvm_test.dart new file mode 100644 index 0000000..a849905 --- /dev/null +++ b/pointycastle/test/key_derivators/scrypt_nonvm_test.dart @@ -0,0 +1,29 @@ +// See file LICENSE for more information. + +@OnPlatform({ + 'vm': Skip(), +}) +library test.key_derivators.scrypt_test; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/runners/key_derivators.dart'; +import '../test/src/helpers.dart'; + +/// NOTE: the expected results for these tests are taken from the Java library found at +/// [https://github.com/wg/scrypt]. See also +/// [http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00#page-10] (which at the time of writing +/// this test had typos because it interchanged N and r parameters). +void main() { + // + // This is a sanity test for the js platform + // + + var scrypt = KeyDerivator('scrypt'); + runKeyDerivatorTests(scrypt, [ + ScryptParameters(1024, 8, 16, 64, createUint8ListFromString('NaCl')), + 'password', + 'fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640' + ]); +} diff --git a/pointycastle/test/key_derivators/scrypt_vm_test.dart b/pointycastle/test/key_derivators/scrypt_vm_test.dart new file mode 100644 index 0000000..dccb081 --- /dev/null +++ b/pointycastle/test/key_derivators/scrypt_vm_test.dart @@ -0,0 +1,36 @@ +// See file LICENSE for more information. + +@OnPlatform({ + 'chrome': Skip('Excessive time / resource consumption on this platform'), + 'node': Skip('Excessive time / resource consumption on this platform') +}) +library test.key_derivators.scrypt_test; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/runners/key_derivators.dart'; +import '../test/src/helpers.dart'; + +/// NOTE: the expected results for these tests are taken from the Java library found at +/// [https://github.com/wg/scrypt]. See also +/// [http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00#page-10] (which at the time of writing +/// this test had typos because it interchanged N and r parameters). +void main() { + group('scrypt - vm ', () { + var scrypt = KeyDerivator('scrypt'); + runKeyDerivatorTests(scrypt, [ + ScryptParameters(1024, 8, 16, 64, createUint8ListFromString('NaCl')), + 'password', + 'fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640', + ScryptParameters( + 16384, 8, 1, 64, createUint8ListFromString('SodiumChloride')), + 'pleaseletmein', + '7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887', + ScryptParameters( + 1048576, 8, 1, 64, createUint8ListFromString('SodiumChloride')), + 'pleaseletmein', + '2101cb9b6a511aaeaddbbe09cf70f881ec568d574a2ffd4dabe5ee9820adaa478e56fd8f4ba5d09ffa1c6d927c40f4c337304049e8a952fbcbf45c6fa77a41a4', + ]); + }); +} diff --git a/pointycastle/test/key_generators/ec_key_generator_test.dart b/pointycastle/test/key_generators/ec_key_generator_test.dart new file mode 100644 index 0000000..821e8f2 --- /dev/null +++ b/pointycastle/test/key_generators/ec_key_generator_test.dart @@ -0,0 +1,42 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import '../test/runners/key_generators.dart'; +import '../test/src/null_secure_random.dart'; + +void main() { + var rnd = NullSecureRandom(); + + var domainParams = ECDomainParameters('prime192v1'); + var ecParams = ECKeyGeneratorParameters(domainParams); + var params = ParametersWithRandom(ecParams, rnd); + + var keyGenerator = KeyGenerator('EC'); + keyGenerator.init(params); + + runKeyGeneratorTests(keyGenerator, [ + _keyPair( + domainParams, + '4165461920577864743570110591887661239883413257826890841803', + '433060747015770533144900903117711353276551186421527917903', + '96533667595335344311200144916688449305687896108635671'), + _keyPair( + domainParams, + '952128485350936803657958938747669190775028076767588715981', + '2074616205026821401743282701487442392635099812302414322181', + '590882579351047642528856087035049998200115612080958942767'), + _keyPair( + domainParams, + '24186169899158470982826728287136856913767539338281496876', + '2847521372076459404463997303980674024509607281070145578802', + '1181668625034499949713400973925183307950925536265809249863'), + ]); +} + +AsymmetricKeyPair _keyPair( + ECDomainParameters domainParams, String qX, String qY, String d) => + AsymmetricKeyPair( + ECPublicKey( + domainParams.curve.createPoint(BigInt.parse(qX), BigInt.parse(qY)), + domainParams), + ECPrivateKey(BigInt.parse(d), domainParams)); diff --git a/pointycastle/test/key_generators/rsa_key_generator_test.dart b/pointycastle/test/key_generators/rsa_key_generator_test.dart new file mode 100644 index 0000000..19e510a --- /dev/null +++ b/pointycastle/test/key_generators/rsa_key_generator_test.dart @@ -0,0 +1,254 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:test/test.dart'; + +import '../test/runners/key_generators.dart'; +import '../test/src/fixed_secure_random.dart'; +import '../test/src/helpers.dart'; + +final sourceOfRandomValues = createUint8ListFromHexString( + '4b 58 b6 5e a6 45 1e c4 fc ec 9a 67 ed cf 78 c7 d3 04 16 1b 7e cc 6a cb' + '1d 1a 5d 45 9a 59 c2 78 8c 9b 5f 09 40 f2 e3 53 38 55 0c 10 3e 81 be d3' + '12 79 a9 cb d4 a3 bb bb 75 7c aa 0c 70 6f 13 85 bf 75 24 7b e7 99 b1 9b' + 'e6 9b ef f9 d2 4f cb 52 78 1e 94 c7 e8 84 84 91 65 ba 88 59 9c 55 cc 12' + '7e f9 18 6d dc 2a ad b5 ed ba f4 4e ea 33 d2 a4 02 6d 45 0f 7f 5e 3e db' + 'a6 11 1a 88 21 17 28 e4 75 d2 c3 87 ab fe dc fa 9f 7b 87 be 3b fd 1f 74' + '04 82 d6 64 6c 83 62 d7 a2 2b 49 83 c8 c1 c4 19 fe 7c 6f 0c 2b be 39 eb' + 'b6 2e f5 67 0e 9c f8 06 76 2e 5a 9c a1 5c 24 e8 c0 1b 04 4f a4 ef 21 07' + 'ea 86 fb c9 b7 65 82 10 35 9c 9f 80 1f 72 66 bd 5d 92 c3 f0 da 45 c8 74' + '26 64 96 f0 53 73 70 1a 2d e3 bb c0 d1 4e 1a 67 cd f4 10 de ce 0e 2c 89' + '7a 5a f2 47 12 64 42 36 81 66 cc 06 b8 43 b7 96 71 31 13 27 2e 6a 9b e4' + 'c4 ac b0 87 1c be 70 f4 a5 ba 08 22 d7 c6 28 0a 89 c0 e8 73 1d eb e8 9c' + 'e4 6f 13 59 72 b3 75 62 84 3a b9 59 9c c6 1d 2d 92 89 29 fa 73 0d c7 f4' + 'a0 ff 75 36 58 da d8 8b a0 be 7f 7b 7e fe 19 2b 7c 19 4a 29 8b 0e bf c6' + 'bb d4 a5 b4 4d 1d 90 a9 e7 85 2f c4 f3 fe 4b 96 af 9d a6 36 c9 f3 70 7c' + '21 7d 63 ad 6b 17 fa cc 67 d5 38 22 40 32 bf 72 2d 60 1f 21 6e ec d3 da' + '86 50 f1 bf 7c de 2c 91 fb c1 1e 7b a2 29 b1 d8 d0 0f 63 c6 76 fb 52 62' + '0c 3c b0 4b 19 4f 41 2d 89 40 11 c1 a0 79 70 98 f9 75 e6 76 63 fa 42 4e' + '5b 09 8f 08 6c 77 7a 1b ad 33 1c 1a 01 92 fe 2c 1f 3d 3e 63 d2 6c c0 98' + 'b6 f9 e5 89 c9 cc 91 a0 9e f3 00 1c b7 2f 46 fe ad 94 b0 de a3 99 54 54' + 'db 49 ec 05 8d 54 5f b7 91 64 60 74 b5 23 a1 74 a8 f7 e0 eb de 3d b3 31' + '98 77 d2 e3 f4 6e 90 57 c6 bc cb ab ec 5d 74 55 15 78 d3 ff 89 df 1c 50' + 'ad ce a5 56 e5 93 11 c2 60 20 30 db cb a2 29 f9 dd 33 db 82 e9 3f d0 08' + '23 67 d7 4c e6 5b 6c 99 7a d7 dc 71 25 51 38 a4 50 1d 27 0e 73 52 89 b6' + '4a 7b 58 d5 9c d2 fe 2d 76 39 9e 6d ee 72 65 ea bb 05 43 ac af de f2 a1' + 'd4 3e 05 e9 cd 48 05 cc 67 a3 43 80 4c 0e aa 07 2a 88 72 73 dc d7 b6 c9' + '2d 2a a0 0c 71 3d dd f0 a8 b3 59 1a 12 e1 7f f3 6e 55 7f 10 b0 4c ce a9' + 'fa bc f4 36 b9 61 12 84 93 40 97 e4 17 de 91 98 97 21 73 e7 13 ed 34 1e' + '8d 14 c6 07 94 51 a2 f5 17 ed 62 ed 03 1b e9 fd 5d 4b cd c9 17 c9 bb 48' + '7c 26 55 57 d9 56 67 70 27 65 c7 63 f7 81 e6 64 05 1e ca 69 96 ac 27 fe' + '74 93 a8 85 1e e1 1a 22 39 40 58 28 13 93 2e 6c de 60 cf 88 a8 fd 83 6b' + 'e3 b3 3c 1f 9a 92 02 a2 21 24 9e 11 fb b8 44 21 5f ea 2d 8d d9 ad 72 8c' + 'c7 e0 80 36 f4 45 d1 90 bb c1 59 bc 57 d0 d1 f6 25 85 a5 4a 6e e0 de fe' + '9f 1f 9a 5a 48 d0 34 6d da 29 b9 b9 b1 f8 b4 ac e3 6f a7 33 1f b8 ea b8' + '84 9d d4 11 9a 09 bf c1 83 64 c5 69 81 37 19 92 61 7f ab 07 f6 4f 5d b5' + '2a d6 f4 40 8d cb 13 aa 75 1c 2b 5c ac 81 f4 8e f7 45 90 22 08 f1 11 ef' + '51 38 12 f8 96 30 a7 fc 11 49 bd 9a 22 a9 22 92 5e 0e 50 b9 56 19 82 5a' + '57 a6 bc 59 63 0a 24 1c d6 0f 6d bb ce a6 e0 76 ba 09 bd 79 9b 06 64 04' + 'fb c5 42 e1 45 9a d7 82 ee 2d 67 2c 23 38 56 3c 65 e5 33 ac f0 8c 94 90' + '85 2e c5 2c e3 3e 7c fb 4a 7d b0 e4 5f bb 40 ac 98 59 0b 3e f8 4f df 51' + '31 10 d2 94 0e 6e 45 d9 f2 4f 2d 86 97 0c e3 cc 05 44 d8 56 86 ed f7 d8' + 'fc a2 75 d2 b7 21 e8 d8 11 98 7c e0 e0 a2 10 33 9d 7c a3 21 e9 d9 9b 5e' + 'f2 b0 17 24 ee 8b ce 22 52 9f 62 60 b1 a3 d4 96'); + +final testPublicExponent = BigInt.parse('65537'); +const testBitLength = 2048; +const testCertainty = 12; + +// This key pair is generated by the above inputs to the RSA key generator. + +final referenceKeyPair = _keyPair( + '24649663692047164444790643172109370056158709234977203368650147515375245495213442567159484352023028564722607846088040100966055452012530635310929880142309672672370384513414361688667706499439717428347689592753696423610988570895714214920908622106527744596538403468957028226105712420419053355165486523922578029360613666994642331140679324765028868432884033287641095549662040120859273059357594690379309402039994712237709233598606723986537440109010028591440539106473660495784943265016397899779881916920074735104005566018575893835392960697074083820748729243932835684709199184189144330411532000389215869317902155568589589990937', + '65537', + '4063958011391574405693927086602098714570316817735457564402777727140844524097551717932743769528797833923246071333464657993778005691371187490037648274068938358865404346665886110838985133992189859366415704864484029740707257099473459148578934981171434157279055334880764911165787611618289996529640995025458223709324848295784182981653521435775135990468151575617415377402359600649196585978093468870169020045627061059125356549455475504958158218546129405411183104108490830376537830617352916950230417099192711318868054030047466626509446719907850666657436082569747996909170379147599626458818599142452671385912424304169295269813', + '172622988945032241272460594823465727338165469761128582817141296878210996104803340949368540074325243384642718754688224642044903791277270607713426667425998282894170126560269953218957312807290242694167112152302773291330789947866948729188625784460892934126377883318018638038433339229978409110366812585246469634979', + '142794791369857893518216846152178512365742893193381905408671045383524196038880042688222484665321416966726996826180091369625084659347039997384427839884481875048370565094771341455209579084576003589416828973425288956690619644847967193297411322186095969144940769802524422661706293551748267739368517289465924234003', + '65537'); + +void main() { + _generationTests(); + _equalityTests(); +} + +void _generationTests() { + group('rsa', () { + // Test RSA key generation + + group('key generation', () { + // Test RSA key generation using known source of "randomness" as input + + group('fixed', () { + // Create an RSA key generator using fixed input instead of randomness + + var rnd = FixedSecureRandom()..seed(KeyParameter(sourceOfRandomValues)); + + var keyGenerator = KeyGenerator('RSA') + ..init(ParametersWithRandom( + RSAKeyGeneratorParameters( + testPublicExponent, testBitLength, testCertainty), + rnd)); + + // Use generator to generate an RSA key pair: must produce the reference + + runKeyGeneratorTests(keyGenerator, [referenceKeyPair]); + + // Test the reference key pair + + _exponentTests(referenceKeyPair, testPublicExponent); + }); + + // Test RSA key generation using real source of randomness as input + + group('random', () { + // Create an RSA key generator using a random number generator + + final rnd = SecureRandom('Fortuna') + ..seed(KeyParameter( + Platform.instance.platformEntropySource().getBytes(32))); + + var keyGenerator = KeyGenerator('RSA') + ..init(ParametersWithRandom( + RSAKeyGeneratorParameters(testPublicExponent, 2048, 12), rnd)); + + // Use generator to generate an RSA key pair + + final kp = keyGenerator.generateKeyPair(); + + // Test the generated key pair + + _exponentTests(kp, testPublicExponent); + + /* + // Print out the generated key pair + + final rsaPublicKey = kp.publicKey as RSAPublicKey; + final rsaPrivateKey = kp.privateKey as RSAPrivateKey; + + print(''' +Generated key pair: + final pairX = _keyPair( + '${rsaPublicKey.modulus}', + '${rsaPublicKey.publicExponent}', + '${rsaPrivateKey.privateExponent}', + '${rsaPrivateKey.p}', + '${rsaPrivateKey.q}', + '${rsaPrivateKey.publicExponent}'); +'''); + */ + }); + }); + }); +} + +void _equalityTests() { + // RSA key pair equality + + try { + group('key equality', () { + // Sanity test on equality. + + // Key pair [pairA] (and [sameAsPairA]) happens to be the same as the + // [referenceKeyPair], but it does not have to be. Any valid RSA key pair + // can be used. + + final pairA = _keyPair( + '24649663692047164444790643172109370056158709234977203368650147515375245495213442567159484352023028564722607846088040100966055452012530635310929880142309672672370384513414361688667706499439717428347689592753696423610988570895714214920908622106527744596538403468957028226105712420419053355165486523922578029360613666994642331140679324765028868432884033287641095549662040120859273059357594690379309402039994712237709233598606723986537440109010028591440539106473660495784943265016397899779881916920074735104005566018575893835392960697074083820748729243932835684709199184189144330411532000389215869317902155568589589990937', + '65537', + '4063958011391574405693927086602098714570316817735457564402777727140844524097551717932743769528797833923246071333464657993778005691371187490037648274068938358865404346665886110838985133992189859366415704864484029740707257099473459148578934981171434157279055334880764911165787611618289996529640995025458223709324848295784182981653521435775135990468151575617415377402359600649196585978093468870169020045627061059125356549455475504958158218546129405411183104108490830376537830617352916950230417099192711318868054030047466626509446719907850666657436082569747996909170379147599626458818599142452671385912424304169295269813', + '172622988945032241272460594823465727338165469761128582817141296878210996104803340949368540074325243384642718754688224642044903791277270607713426667425998282894170126560269953218957312807290242694167112152302773291330789947866948729188625784460892934126377883318018638038433339229978409110366812585246469634979', + '142794791369857893518216846152178512365742893193381905408671045383524196038880042688222484665321416966726996826180091369625084659347039997384427839884481875048370565094771341455209579084576003589416828973425288956690619644847967193297411322186095969144940769802524422661706293551748267739368517289465924234003', + '65537'); + + final sameAsPairA = _keyPair( + '24649663692047164444790643172109370056158709234977203368650147515375245495213442567159484352023028564722607846088040100966055452012530635310929880142309672672370384513414361688667706499439717428347689592753696423610988570895714214920908622106527744596538403468957028226105712420419053355165486523922578029360613666994642331140679324765028868432884033287641095549662040120859273059357594690379309402039994712237709233598606723986537440109010028591440539106473660495784943265016397899779881916920074735104005566018575893835392960697074083820748729243932835684709199184189144330411532000389215869317902155568589589990937', + '65537', + '4063958011391574405693927086602098714570316817735457564402777727140844524097551717932743769528797833923246071333464657993778005691371187490037648274068938358865404346665886110838985133992189859366415704864484029740707257099473459148578934981171434157279055334880764911165787611618289996529640995025458223709324848295784182981653521435775135990468151575617415377402359600649196585978093468870169020045627061059125356549455475504958158218546129405411183104108490830376537830617352916950230417099192711318868054030047466626509446719907850666657436082569747996909170379147599626458818599142452671385912424304169295269813', + '172622988945032241272460594823465727338165469761128582817141296878210996104803340949368540074325243384642718754688224642044903791277270607713426667425998282894170126560269953218957312807290242694167112152302773291330789947866948729188625784460892934126377883318018638038433339229978409110366812585246469634979', + '142794791369857893518216846152178512365742893193381905408671045383524196038880042688222484665321416966726996826180091369625084659347039997384427839884481875048370565094771341455209579084576003589416828973425288956690619644847967193297411322186095969144940769802524422661706293551748267739368517289465924234003', + '65537'); + + // Key pair [pairB] must be different from [pairA]. + // + // It was generated by printing out a key pair generated by the "random" + // group above. + + final pairB = _keyPair( + '19998306328585176190366931006323279258949313181307546699816669664375919241027356951914691360578319992250399010485771130476451229840594808138101564594115773724013936584602754417070271298701696987528901888461008771284744893172122544667786764873333740745216326896528158046782247261766024669089482595105385979285059846497020559321736554684511163018198870867271603237630108207641918406339674840622347874621413157836620812448858932150510388151580106080194334580652193920929549719757990360242174059537218746801801687237676141171281586377264431453186972752634533558851854441192719423281312383801525771522400348684409782418181', + '65537', + '5152378081971416146212759663118064151355099456282373712962211686268632930783327313320407763909927721274211320201599791539052428641201814782670017214270485974792488506202870261565703814312192404815989569047471399410148733100558297857936425605173264148236533250650440951217148252360030616866440539212268524043264892574989944062193837186483983080645021774570356621207103577684271762737582372544866638275814427195654002085651202903221585300777616512377961344289572012376442469516292259733948327009762622317928932215997440536302741442884945463361977614033283418571310135110745254346728636868451102639703532527885300433473', + '150184998420649548947932258643999611296181460297402912020172689683902675064609729677452625884062529296436525999147465242344088271241652573042354631277387610106715634254964478486873326919509893206720029965989460935701771076087649853048346640100380870168307353480373347027618122894629925347915349774079985870901', + '133157815619988896034254188342686110116619401642991448852461596092802908382975330105515629389879493501891343915668062426766653101714665922211828772548885021209869316495667526636332920521836009126612102599502833008592976927333093662184588393203427464940108987342022609619311395970699227062951068719034627195281', + '65537'); + + test('equal', () { + expect(pairA, equals(pairA)); // objects identical check + expect(pairB, equals(pairB)); + + expect(sameAsPairA, equals(pairA)); // members check + expect(pairA, equals(sameAsPairA)); + }); + + test('not equal', () { + expect(pairA, isNot(equals(pairB))); + expect(pairB, isNot(equals(pairA))); + + // Mix up the public key and private key values + + final badPair1 = AsymmetricKeyPair(pairB.publicKey, pairA.privateKey); + expect(pairA, isNot(equals(badPair1))); + expect(pairB, isNot(equals(badPair1))); + expect(badPair1, isNot(equals(pairA))); + expect(badPair1, isNot(equals(pairB))); + + final badPair2 = AsymmetricKeyPair(pairA.publicKey, pairB.privateKey); + expect(pairA, isNot(equals(badPair2))); + expect(pairB, isNot(equals(badPair2))); + expect(badPair2, isNot(equals(pairA))); + expect(badPair2, isNot(equals(pairB))); + }); + }); + } catch (e, s) { + print(s); + } +} + +void _exponentTests(AsymmetricKeyPair pair, BigInt expectedPublicExponent) { + test('exponents', () { + final rsaPublicKey = pair.publicKey as RSAPublicKey; + final rsaPrivateKey = pair.privateKey as RSAPrivateKey; + + // Values are expected + + expect(rsaPublicKey.publicExponent, equals(expectedPublicExponent)); + expect(rsaPrivateKey.publicExponent, equals(expectedPublicExponent)); + expect(rsaPublicKey.publicExponent, equals(rsaPrivateKey.publicExponent)); + + expect(rsaPrivateKey.privateExponent, isNot(expectedPublicExponent), + reason: 'private exponent cannot be the same as the public exponent'); + + // Deprecated getters still return correct values + + // ignore: deprecated_member_use_from_same_package + expect(rsaPublicKey.e, equals(rsaPublicKey.publicExponent)); + // ignore: deprecated_member_use_from_same_package + expect(rsaPrivateKey.d, equals(rsaPrivateKey.privateExponent)); + // ignore: deprecated_member_use_from_same_package + expect(rsaPrivateKey.pubExponent, equals(expectedPublicExponent)); + }); +} + +AsymmetricKeyPair _keyPair(String n, String e, String d, String p, String q, + String pubExpInPrivateKey) => + AsymmetricKeyPair( + RSAPublicKey(BigInt.parse(n), BigInt.parse(e)), + RSAPrivateKey( + BigInt.parse(n), + BigInt.parse(d), + BigInt.parse(p), + BigInt.parse(q), + // ignore: deprecated_member_use_from_same_package + BigInt.parse(pubExpInPrivateKey), + ), + ); diff --git a/pointycastle/test/macs/cbc_block_cipher_mac_test.dart b/pointycastle/test/macs/cbc_block_cipher_mac_test.dart new file mode 100644 index 0000000..49b226e --- /dev/null +++ b/pointycastle/test/macs/cbc_block_cipher_mac_test.dart @@ -0,0 +1,31 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/mac.dart'; +import '../test/src/helpers.dart'; + +void main() { + final mac = Mac('AES/CBC_CMAC/PKCS7'); + + // Test vectors from BouncyCastle CBCBlockCipherMac (was DES/CBC_CMAC/PKCS7). + // Note: Key and expected outputs adapted from DES engine to AES + final key = createUint8ListFromHexString('0123456789abcdef0123456789abcdef'); + final keyParam = KeyParameter(key); + + final input1 = createUint8ListFromHexString( + '37363534333231204e6f77206973207468652074696d6520666f7220'); + final input2 = createUint8ListFromHexString('3736353433323120'); + + final output5WithAes = '0376f977de2166d1'; + final output6WithAes = 'f338ed02ba54413f'; + + mac.init(keyParam); + + runMacTests(mac, [ + PlainTextDigestPair(input2, output5WithAes), + PlainTextDigestPair(input1, output6WithAes), + // same input again: + PlainTextDigestPair(input1, output6WithAes) + ]); +} diff --git a/pointycastle/test/macs/cmac_test.dart b/pointycastle/test/macs/cmac_test.dart new file mode 100644 index 0000000..44abad1 --- /dev/null +++ b/pointycastle/test/macs/cmac_test.dart @@ -0,0 +1,53 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/mac.dart'; + +void main() { + final mac = Mac('AES/CMAC'); + + // Test vectors from AES-CMAC RFC, section 4. + // https://tools.ietf.org/html/rfc4493 + final key = Uint8List.fromList([ + 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, // + 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c, // + ]); + final keyParam = KeyParameter(key); + + mac.init(keyParam); + + runMacTests(mac, [ + PlainTextDigestPair( + Uint8List.fromList([]), 'bb1d6929e95937287fa37d129b756746'), + PlainTextDigestPair( + Uint8List.fromList([ + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, // + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, // + ]), + '070a16b46b4d4144f79bdd9dd04a287c'), + PlainTextDigestPair( + Uint8List.fromList([ + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, // + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, // + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, // + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, // + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, // + ]), + 'dfa66747de9ae63030ca32611497c827'), + PlainTextDigestPair( + Uint8List.fromList([ + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, // + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, // + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, // + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, // + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, // + 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, // + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, // + 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10, // + ]), + '51f0bebf7e3b9d92fc49741779363cfe'), + ]); +} diff --git a/pointycastle/test/macs/hmac_test.dart b/pointycastle/test/macs/hmac_test.dart new file mode 100644 index 0000000..2fd75ce --- /dev/null +++ b/pointycastle/test/macs/hmac_test.dart @@ -0,0 +1,222 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/mac.dart'; +import '../test/src/helpers.dart'; + +void main() { + final mac = Mac('SHA-1/HMAC'); + final key = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final keyParam = KeyParameter(key); + + mac.init(keyParam); + + runMacTests(mac, [ + PlainTextDigestPair( + createUint8ListFromString( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'), + 'a646990cca06cb7550a91bdd9ae481c6472f06bc'), + PlainTextDigestPair( + createUint8ListFromString( + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...'), + '1d710be3529ecee6ddd2f1ad4c3c12d6f467243f'), + ]); + + testWithRfc4231(); +} + +/// Testing HMAC with using the test vectors from +/// [RFC 4231](https://tools.ietf.org/html/rfc4231) _Identifiers and Test +/// Vectors for HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512_. +void testWithRfc4231() { + // THe RFC has seven test cases, with data that is replicated here. + + Rfc4231TestVector.runAll([ + // First set of tests + + Rfc4231TestVector( + 'Test Case 1', + '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b' + '0b0b0b0b', + '4869205468657265', + // Hi There + + '896fb1128abbdf196832107cd49df33f' + '47b4b1169912ba4f53684b22', + 'b0344c61d8db38535ca8afceaf0bf12b' + '881dc200c9833da726e9376c2e32cff7', + 'afd03944d84895626b0825f4ab46907f' + '15f9dadbe4101ec682aa034c7cebc59c' + 'faea9ea9076ede7f4af152e8b2fa9cb6', + '87aa7cdea5ef619d4ff0b4241a1d6cb0' + '2379f4e2ce4ec2787ad0b30545e17cde' + 'daa833b7d6b8a702038b274eaea3f4e4' + 'be9d914eeb61f1702e696c203a126854'), + + // Test with a key shorter than the length of the HMAC output. + + Rfc4231TestVector( + 'Test Case 2', + '4a656665', + '7768617420646f2079612077616e7420' + '666f72206e6f7468696e673f', + 'a30e01098bc6dbbf45690f3a7e9e6d0f' + '8bbea2a39e6148008fd05e44', + '5bdcc146bf60754e6a042426089575c7' + '5a003f089d2739839dec58b964ec3843', + 'af45d2e376484031617f78d2b58a6b1b' + '9c7ef464f5a01b47e42ec3736322445e' + '8e2240ca5e69e2c78b3239ecfab21649', + '164b7a7bfcf819e2e395fbe73b56e0a3' + '87bd64222e831fd610270cd7ea250554' + '9758bf75c05a994a6d034f65f8f0e6fd' + 'caeab1a34d4a6b4b636e070a38bce737'), + + // Test with a combined length of key and data that is larger than 64 + // bytes (= block-size of SHA-224 and SHA-256). + + Rfc4231TestVector( + 'Test Case 3', + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaa', + 'dddddddddddddddddddddddddddddddd' + 'dddddddddddddddddddddddddddddddd' + 'dddddddddddddddddddddddddddddddd' + 'dddd', + '7fb3cb3588c6c1f6ffa9694d7d6ad264' + '9365b0c1f65d69d1ec8333ea', + '773ea91e36800e46854db8ebd09181a7' + '2959098b3ef8c122d9635514ced565fe', + '88062608d3e6ad8a0aa2ace014c8a86f' + '0aa635d947ac9febe83ef4e55966144b' + '2a5ab39dc13814b94e3ab6e101a34f27', + 'fa73b0089d56a284efb0f0756c890be9' + 'b1b5dbdd8ee81a3655f83e33b2279d39' + 'bf3e848279a722c806b485a47e67c807' + 'b946a337bee8942674278859e13292fb'), + + // Test with a combined length of key and data that is larger than 64 + // bytes (= block-size of SHA-224 and SHA-256). + + Rfc4231TestVector( + 'Test Case 4', + '0102030405060708090a0b0c0d0e0f10' + '111213141516171819', + 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + 'cdcd', + '6c11506874013cac6a2abc1bb382627c' + 'ec6a90d86efc012de7afec5a', + '82558a389a443c0ea4cc819899f2083a' + '85f0faa3e578f8077a2e3ff46729665b', + '3e8a69b7783c25851933ab6290af6ca7' + '7a9981480850009cc5577c6e1f573b4e' + '6801dd23c4a7d679ccf8a386c674cffb', + 'b0ba465637458c6990e5a8c5f61d4af7' + 'e576d97ff94b872de76f8050361ee3db' + 'a91ca5c11aa25eb4d679275cc5788063' + 'a5f19741120c4f2de2adebeb10a298dd'), + + // Test with a truncation of output to 128 bits. + + Rfc4231TestVector( + 'Test Case 5', + '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c' + '0c0c0c0c', + '546573742057697468205472756e6361' + '74696f6e', + '0e2aea68a90c8d37c988bcdb9fca6fa8', + 'a3b6167473100ee06e0c796c2955552b', + '3abf34c3503b2a23a46efc619baef897', + '415fad6271580a531d4179bc891d87a6', + truncate128: true), + + // Test with a key larger than 128 bytes (= block-size of SHA-384 and + // SHA-512). + + Rfc4231TestVector( + 'Test Case 6', + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaa', + '54657374205573696e67204c61726765' + '72205468616e20426c6f636b2d53697a' + '65204b6579202d2048617368204b6579' + '204669727374', + '95e9a0db962095adaebe9b2d6f0dbce2' + 'd499f112f2d2b7273fa6870e', + '60e431591ee0b67f0d8a26aacbf5b77f' + '8e0bc6213728c5140546040f0ee37f54', + '4ece084485813e9088d2c63a041bc5b4' + '4f9ef1012a2b588f3cd11f05033ac4c6' + '0c2ef6ab4030fe8296248df163f44952', + '80b24263c7c1a3ebb71493c1dd7be8b4' + '9b46d1f41b4aeec1121b013783f8f352' + '6b56d037e05f2598bd0fd2215d6a1e52' + '95e64f73f63f0aec8b915a985d786598'), + + // Test with a key and data that is larger than 128 bytes (= block-size + // of SHA-384 and SHA-512). + + Rfc4231TestVector( + 'Test Case 7', + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaa', + '54686973206973206120746573742075' + '73696e672061206c6172676572207468' + '616e20626c6f636b2d73697a65206b65' + '7920616e642061206c61726765722074' + '68616e20626c6f636b2d73697a652064' + '6174612e20546865206b6579206e6565' + '647320746f2062652068617368656420' + '6265666f7265206265696e6720757365' + '642062792074686520484d414320616c' + '676f726974686d2e', + '3a854166ac5d9f023f54d517d0b39dbd' + '946770db9c2b95c9f6f565d1', + '9b09ffa71b942fcb27635fbcd5b0e944' + 'bfdc63644f0713938a7f51535c3a35e2', + '6617178e941f020d351e2f254e8fd32c' + '602420feb0b8fb9adccebb82461e99c5' + 'a678cc31e799176d3860e6110c46523e', + 'e37b6a775dc87dbaa4dfa9f96e5e3ffd' + 'debd71f8867289865df5a32d20cdc944' + 'b6022cac3c4982b10d5eeb55c3e4de15' + '134676fb6de0446065c97440fa8c6a58') + ]); +} diff --git a/pointycastle/test/macs/poly1305_test.dart b/pointycastle/test/macs/poly1305_test.dart new file mode 100644 index 0000000..8ed8ca4 --- /dev/null +++ b/pointycastle/test/macs/poly1305_test.dart @@ -0,0 +1,80 @@ +@TestOn('vm') +// See file LICENSE for more information. + +library test.macs.poly1305_test; + +import 'package:pointycastle/export.dart'; +import 'package:test/test.dart'; + +import '../test/runners/mac.dart'; +import '../test/src/helpers.dart'; + +void main() { + var mac = Poly1305.withCipher(AESEngine()); + + // Test vectors from BouncyCastle Poly1305 class + final key = createUint8ListFromHexString( + '0000000000000000000000000000000000000000000000000000000000000000'); + final iv = createUint8ListFromHexString('00000000000000000000000000000000'); + final params = ParametersWithIV(KeyParameter(key), iv); + + final input1 = createUint8ListFromHexString(''); + + final output1 = '66e94bd4ef8a2c3b884cfa59ca342b2e'; + + mac.init(params); + + runMacTests(mac, [ + PlainTextDigestPair(input1, output1), + // same input again: + PlainTextDigestPair(input1, output1) + ]); + + mac = Poly1305.withCipher(AESEngine()); + final key2 = createUint8ListFromHexString( + 'f795bd0a50e29e0710d3130a20e98d0cf795bd4a52e29ed713d313fa20e98dbc'); + final iv2 = createUint8ListFromHexString('917cf69ebd68b2ec9b9fe9a3eadda692'); + final params2 = ParametersWithIV(KeyParameter(key2), iv2); + + var input2 = createUint8ListFromHexString('66f7'); + var output2 = '5ca585c75e8f8f025e710cabc9a1508b'; + mac.init(params2); + + runMacTests(mac, [ + PlainTextDigestPair(input2, output2), + // same input again: + PlainTextDigestPair(input2, output2) + ]); + + mac = Poly1305.withCipher(AESEngine()); + final key3 = createUint8ListFromHexString( + '3ef49901c8e11c000430d90ad45e7603e69dae0aab9f91c03a325dcc9436fa90'); + final iv3 = createUint8ListFromHexString('166450152e2394835606a9d1dd2cdc8b'); + final params3 = ParametersWithIV(KeyParameter(key3), iv3); + + var input3 = createUint8ListFromHexString('66f75c0e0c7a406586'); + var output3 = '2924f51b9c2eff5df09db61dd03a9ca1'; + mac.init(params3); + + runMacTests(mac, [ + PlainTextDigestPair(input3, output3), + // same input again: + PlainTextDigestPair(input3, output3) + ]); + + mac = Poly1305(); + final key4 = createUint8ListFromHexString( + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); + final params4 = KeyParameter(key4); + + var input4 = createUint8ListFromHexString( + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); + var output4 = 'c80cb43844f387946e5aa6085bdf67da'; + mac.init(params4); + + runMacTests(mac, [ + PlainTextDigestPair(input4, output4), + // same input again: + PlainTextDigestPair(input4, output4) + ]); +} diff --git a/pointycastle/test/macs/poly1305_web_test.dart b/pointycastle/test/macs/poly1305_web_test.dart new file mode 100644 index 0000000..494efae --- /dev/null +++ b/pointycastle/test/macs/poly1305_web_test.dart @@ -0,0 +1,22 @@ +@TestOn('js') +// See file LICENSE for more information. + +library test.macs.poly1305_test; + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:test/test.dart'; + +void main() { + group('Poly1305 - js', () { + test('must emit PlatformException', () { + expect(() { + Poly1305.withCipher(AESEngine()); + }, throwsA(TypeMatcher())); + + expect(() { + Poly1305(); + }, throwsA(TypeMatcher())); + }); + }); +} diff --git a/pointycastle/test/modes/cbc_test.dart b/pointycastle/test/modes/cbc_test.dart new file mode 100644 index 0000000..bbd6e05 --- /dev/null +++ b/pointycastle/test/modes/cbc_test.dart @@ -0,0 +1,40 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + runBlockCipherTests(BlockCipher('Null/CBC'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4c7e505629750f07fbecc79ba8b282903e5e233f5d556e6a9e98ebbbcbddece35b3d575a29201c4afffc82cba2ae8f8a355a773f4549686ad1d2ace58c80a1a4', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '457f02462a750a02eff8d89ba8b8ceb3245f4f2744166263c3d8bcfe88dbbbca4b7f214829741006e3b6d3def9aed2af391001294a1b626282c4bebbd980fc81', + ]); +} diff --git a/pointycastle/test/modes/ccm_test.dart b/pointycastle/test/modes/ccm_test.dart new file mode 100644 index 0000000..ab44ce0 --- /dev/null +++ b/pointycastle/test/modes/ccm_test.dart @@ -0,0 +1,71 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/block/aes.dart'; +import 'package:pointycastle/block/modes/ccm.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + var paramList = [ + { + 'name': 'Test Case 1', + 'key': createUint8ListFromHexString('404142434445464748494a4b4c4d4e4f'), + 'iv': createUint8ListFromHexString('10111213141516'), + 'aad': createUint8ListFromHexString('0001020304050607'), + 'input': '20212223', + 'output': '7162015b4dac255d', + 'mac': createUint8ListFromHexString('6084341b'), + 'tl': 32, + }, + { + 'name': 'Test Case 2', + 'key': createUint8ListFromHexString('404142434445464748494a4b4c4d4e4f'), + 'iv': createUint8ListFromHexString('1011121314151617'), + 'aad': createUint8ListFromHexString('000102030405060708090a0b0c0d0e0f'), + 'input': '202122232425262728292a2b2c2d2e2f', + 'output': 'd2a1f0e051ea5f62081a7792073d593d1fc64fbfaccd', + 'mac': createUint8ListFromHexString('7f479ffca464'), + 'tl': 48 + }, + { + 'name': 'Test Case 3', + 'key': createUint8ListFromHexString('404142434445464748494a4b4c4d4e4f'), + 'iv': createUint8ListFromHexString('101112131415161718191a1b'), + 'aad': createUint8ListFromHexString( + '000102030405060708090a0b0c0d0e0f10111213'), + 'input': '202122232425262728292a2b2c2d2e2f3031323334353637', + 'output': + 'e3b201a9f5b71a7a9b1ceaeccd97e70b6176aad9a4428aa5484392fbc1b09951', + 'mac': createUint8ListFromHexString('67c99240c7d51048'), + 'tl': 64 + }, + ]; + + group('AES-CCM', () { + for (var map in paramList) { + test(map['name'], () { + var encrypter = CCMBlockCipher(AESEngine()); + var params = AEADParameters(KeyParameter(map['key'] as Uint8List), + map['tl'] as int, map['iv'] as Uint8List, map['aad'] as Uint8List); + + encrypter.init(true, params); + var result = encrypter + .process(createUint8ListFromHexString(map['input'] as String)); + + expect( + result, + orderedEquals( + createUint8ListFromHexString(map['output'] as String))); + expect(encrypter.mac, orderedEquals(map['mac'] as Uint8List)); + + var decrypter = CCMBlockCipher(AESEngine())..init(false, params); + var decrypted = formatBytesAsHexString(decrypter.process(result)); + expect(decrypted, map['input']); + }); + } + }); +} diff --git a/pointycastle/test/modes/cfb_test.dart b/pointycastle/test/modes/cfb_test.dart new file mode 100644 index 0000000..7d19c0d --- /dev/null +++ b/pointycastle/test/modes/cfb_test.dart @@ -0,0 +1,40 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + runBlockCipherTests(BlockCipher('Null/CFB-128'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4c7e505629750f07fbecc79ba8b282903e5e233f5d556e6a9e98ebbbcbddece35b3d575a29201c4afffc82cba2ae8f8a355a773f4549686ad1d2ace58c80a1a4', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '457f02462a750a02eff8d89ba8b8ceb3245f4f2744166263c3d8bcfe88dbbbca4b7f214829741006e3b6d3def9aed2af391001294a1b626282c4bebbd980fc81', + ]); +} diff --git a/pointycastle/test/modes/ecb_test.dart b/pointycastle/test/modes/ecb_test.dart new file mode 100644 index 0000000..30bb619 --- /dev/null +++ b/pointycastle/test/modes/ecb_test.dart @@ -0,0 +1,40 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + runBlockCipherTests(BlockCipher('Null/ECB'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c6974202e2e2e2e2e2e2e2e', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '456e20756e206c75676172206465204c61204d616e6368612c206465206375796f206e6f6d627265206e6f2071756965726f2061636f726461726d65202e2e2e', + ]); +} diff --git a/pointycastle/test/modes/gcm_test.dart b/pointycastle/test/modes/gcm_test.dart new file mode 100644 index 0000000..e431dd1 --- /dev/null +++ b/pointycastle/test/modes/gcm_test.dart @@ -0,0 +1,297 @@ +// See file LICENSE for more information. +@TestOn('vm') +library test.modes.gcm_test; + +import 'dart:typed_data'; + +import 'package:pointycastle/block/aes.dart'; +import 'package:pointycastle/block/modes/gcm.dart'; +import 'package:pointycastle/digests/sha256.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('counter regression', () { + test('4096 byte message', () { + final aesKey = createUint8ListFromHexString( + 'fecfc5c627a1bcd0e83c495023351e653b58b964d79a75791f691d9620903343'); + final iv = + createUint8ListFromHexString('72ac336d49b1b8cf01fe0aec3206f524'); + final msg = + Uint8List.fromList(List.generate(4096, (index) => index % 256)); + + final aesCipher = GCMBlockCipher(AESEngine()) + ..init( + true, + AEADParameters( + KeyParameter(aesKey), 128, iv, Uint8List.fromList([]))); + final encrypted = aesCipher.process(msg); + + // + // Rather than 8kb of cipher text as a hex string. Use a message digest + // (SHA256) of the expected cipher text result. + // + + final expectedSHA256 = createUint8ListFromHexString( + '1679DCC9C8AD4B75BE69BBCABE46D4F32472F48C24595D5280EC5B44E77B3105'); + + var dig = SHA256Digest(); + dig.update(encrypted, 0, encrypted.length); + var calculatedSHA256 = Uint8List(dig.digestSize); + dig.doFinal(calculatedSHA256, 0); + + expect(calculatedSHA256, equals(expectedSHA256), + reason: 'digest of cipher text'); + + aesCipher.init( + false, + AEADParameters( + KeyParameter(aesKey), 128, iv, Uint8List.fromList([]))); + + var decrypted = aesCipher.process(encrypted); + + expect(msg, equals(decrypted), reason: 'decrypted match message'); + }); + }); + + var paramList = [ + { + 'name': 'Test Case 1', + 'key': createUint8ListFromHexString('00000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '', + 'output': '', + 'mac': createUint8ListFromHexString('58e2fccefa7e3061367f1d57a4e7455a') + }, + { + 'name': 'Test Case 2', + 'key': createUint8ListFromHexString('00000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '00000000000000000000000000000000', + 'output': '0388dace60b6a392f328c2b971b2fe78', + 'mac': createUint8ListFromHexString('ab6e47d42cec13bdf53a67b21257bddf') + }, + { + 'name': 'Test Case 3', + 'key': createUint8ListFromHexString('feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString(''), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + 'output': + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985', + 'mac': createUint8ListFromHexString('4d5c2af327cd64a62cf35abd2ba6fab4') + }, + { + 'name': 'Test Case 4', + 'key': createUint8ListFromHexString('feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091', + 'mac': createUint8ListFromHexString('5bc94fbc3221a5db94fae95ae7121a47') + }, + { + 'name': 'Test Case 5', + 'key': createUint8ListFromHexString('feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbad'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598', + 'mac': createUint8ListFromHexString('3612d2e79e3b0785561be14aaca2fccb') + }, + { + 'name': 'Test Case 6', + 'key': createUint8ListFromHexString('feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString( + '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5', + 'mac': createUint8ListFromHexString('619cc5aefffe0bfa462af43c1699d050') + }, + { + 'name': 'Test Case 7', + 'key': createUint8ListFromHexString( + '000000000000000000000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '', + 'output': '', + 'mac': createUint8ListFromHexString('cd33b28ac773f74ba00ed1f312572435') + }, + { + 'name': 'Test Case 8', + 'key': createUint8ListFromHexString( + '000000000000000000000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '00000000000000000000000000000000', + 'output': '98e7247c07f0fe411c267e4384b0f600', + 'mac': createUint8ListFromHexString('2ff58d80033927ab8ef4d4587514f0fb') + }, + { + 'name': 'Test Case 9', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString(''), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + 'output': + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256', + 'mac': createUint8ListFromHexString('9924a7c8587336bfb118024db8674a14') + }, + { + 'name': 'Test Case 10', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710', + 'mac': createUint8ListFromHexString('2519498e80f1478f37ba55bd6d27618c') + }, + { + 'name': 'Test Case 11', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c'), + 'iv': createUint8ListFromHexString('cafebabefacedbad'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7', + 'mac': createUint8ListFromHexString('65dcc57fcf623a24094fcca40d3533f8') + }, + { + 'name': 'Test Case 12', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c'), + 'iv': createUint8ListFromHexString( + '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + 'd27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b', + 'mac': createUint8ListFromHexString('dcf566ff291c25bbb8568fc3d376a6d9') + }, + { + 'name': 'Test Case 13', + 'key': createUint8ListFromHexString( + '0000000000000000000000000000000000000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '', + 'output': '', + 'mac': createUint8ListFromHexString('530f8afbc74536b9a963b4f1c4cb738b') + }, + { + 'name': 'Test Case 14', + 'key': createUint8ListFromHexString( + '0000000000000000000000000000000000000000000000000000000000000000'), + 'iv': createUint8ListFromHexString('000000000000000000000000'), + 'aad': createUint8ListFromHexString(''), + 'input': '00000000000000000000000000000000', + 'output': 'cea7403d4d606b6e074ec5d3baf39d18', + 'mac': createUint8ListFromHexString('d0d1c8a799996bf0265b98b5d48ab919') + }, + { + 'name': 'Test Case 15', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString(''), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + 'output': + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad', + 'mac': createUint8ListFromHexString('b094dac5d93471bdec1a502270e3cc6c') + }, + { + 'name': 'Test Case 16', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbaddecaf888'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662', + 'mac': createUint8ListFromHexString('76fc6ece0f4e1768cddf8853bb2d551b') + }, + { + 'name': 'Test Case 17', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString('cafebabefacedbad'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + 'c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f', + 'mac': createUint8ListFromHexString('3a337dbf46a792c45e454913fe2ea8f2') + }, + { + 'name': 'Test Case 18', + 'key': createUint8ListFromHexString( + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308'), + 'iv': createUint8ListFromHexString( + '9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b'), + 'aad': createUint8ListFromHexString( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2'), + 'input': + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'output': + '5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f', + 'mac': createUint8ListFromHexString('a44a8266ee1c8eb0c8b5d4cf5ae9f19a') + }, + ]; + + group('AES-GCM', () { + for (var map in paramList) { + test(map['name'], () { + var encrypter = GCMBlockCipher(AESEngine()); + var params = AEADParameters(KeyParameter(map['key'] as Uint8List), + 16 * 8, map['iv'] as Uint8List, map['aad'] as Uint8List); + encrypter.init(true, params); + var result = encrypter + .process(createUint8ListFromHexString(map['input'] as String)); + var pos = 0; + for (var elem + in createUint8ListFromHexString(map['output'] as String)) { + expect(elem, result[pos++]); + } + pos = 0; + for (var elem in map['mac'] as Uint8List) { + expect(elem, encrypter.mac[pos++]); + } + + var decrypter = GCMBlockCipher(AESEngine())..init(false, params); + var decrypted = formatBytesAsHexString(decrypter.process(result)); + expect(decrypted, map['input']); + }); + } + }); +} diff --git a/pointycastle/test/modes/gctr_test.dart b/pointycastle/test/modes/gctr_test.dart new file mode 100644 index 0000000..c663abb --- /dev/null +++ b/pointycastle/test/modes/gctr_test.dart @@ -0,0 +1,40 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + runBlockCipherTests(BlockCipher('Null-8/GCTR'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4d7d515125760e0871664915283804167134565f2478081761610a17373604086075535d2c2f195c6773414935280f14697f095f0c35195e263704154a734051', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '447c034126760b0d6572561528324835623468573e3b011b28354252743a1f026a36495735381919267947192d2e05187577095b03331f1a696b475e44734051', + ]); +} diff --git a/pointycastle/test/modes/ige_test.dart b/pointycastle/test/modes/ige_test.dart new file mode 100644 index 0000000..b35051d --- /dev/null +++ b/pointycastle/test/modes/ige_test.dart @@ -0,0 +1,36 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/helpers.dart'; + +void main() { + final key1 = createUint8ListFromHexString( + '000102030405060708090A0B0C0D0E0F'.toLowerCase()); + final iv1 = createUint8ListFromHexString( + '000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F' + .toLowerCase()); + final params1 = ParametersWithIV(KeyParameter(key1), iv1); + + final data1 = String.fromCharCodes(createUint8ListFromHexString( + '0000000000000000000000000000000000000000000000000000000000000000')); + final ct1 = '1A8519A6557BE652E9DA8E43DA4EF4453CF456B4CA488AA383C79C98B34797CB' + .toLowerCase(); + + runBlockCipherTests(BlockCipher('AES/IGE'), params1, [data1, ct1]); + + final key2 = createUint8ListFromHexString( + '5468697320697320616E20696D706C65'.toLowerCase()); + final iv2 = createUint8ListFromHexString( + '6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353' + .toLowerCase()); + final params2 = ParametersWithIV(KeyParameter(key2), iv2); + + final data2 = String.fromCharCodes(createUint8ListFromHexString( + '99706487A1CDE613BC6DE0B6F24B1C7AA448C8B9C3403E3467A8CAD89340F53B')); + final ct2 = '4C2E204C6574277320686F70652042656E20676F74206974207269676874210A' + .toLowerCase(); + + runBlockCipherTests(BlockCipher('AES/IGE'), params2, [data2, ct2]); +} diff --git a/pointycastle/test/modes/ofb_test.dart b/pointycastle/test/modes/ofb_test.dart new file mode 100644 index 0000000..7bb6c70 --- /dev/null +++ b/pointycastle/test/modes/ofb_test.dart @@ -0,0 +1,40 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + runBlockCipherTests(BlockCipher('Null/OFB-128'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4c7e505629750f07fbecc79ba8b282907231515a3075071aeded869bafb2808c6572565630201457e9fdc3cba5ae8d966e760256283c1257a6b78495e2f3c0d1', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '457f02462a750a02eff8d89ba8b8ceb361316f522a360e16a4b9cedeecbe9b866f314c5c29371412a8f7c59bbda8879a727e0252273a1413e9ebc7deecf3c0d1', + ]); +} diff --git a/pointycastle/test/modes/sic_test.dart b/pointycastle/test/modes/sic_test.dart new file mode 100644 index 0000000..f322a84 --- /dev/null +++ b/pointycastle/test/modes/sic_test.dart @@ -0,0 +1,55 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:test/test.dart'; + +import '../test/runners/block_cipher.dart'; +import '../test/src/null_block_cipher.dart'; +import '../test/runners/stream_cipher.dart'; + +void main() { + final iv = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final params = ParametersWithIV(null, iv); + + registry.register(NullBlockCipher.factoryConfig); + + group('SIC as stream cipher:', () { + runStreamCipherTests(StreamCipher('Null/SIC'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit', + '4c7e505629750f07fbecc79ba8b282907231515a3075071aeded869bafb281736572565630201457e9fdc3cba5ae8c686e760256283c12', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme', + '457f02462a750a02eff8d89ba8b8ceb361316f522a360e16a4b9cedeecbe9a796f314c5c29371412a8f7c59bbda88664727e0252273a1413e9ebc7de', + ]); + }); + + // This should never fail as long as stream_cipher_adapters and SICStreamCipher tests work, but I add it here to double check. + // In the end, this is a crypto library, thus we as developers have paranoia mode turned on by default. + group('SIC as block cipher:', () { + runBlockCipherTests(BlockCipher('Null/SIC'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '4c7e505629750f07fbecc79ba8b282907231515a3075071aeded869bafb281736572565630201457e9fdc3cba5ae8c686e760256283c1257a6b78495e2f3c12c', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '457f02462a750a02eff8d89ba8b8ceb361316f522a360e16a4b9cedeecbe9a796f314c5c29371412a8f7c59bbda88664727e0252273a1413e9ebc7deecf3c12c', + ]); + }); +} diff --git a/pointycastle/test/paddings/iso7816d4_test.dart b/pointycastle/test/paddings/iso7816d4_test.dart new file mode 100644 index 0000000..15d25ff --- /dev/null +++ b/pointycastle/test/paddings/iso7816d4_test.dart @@ -0,0 +1,13 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/padding.dart'; +import '../test/src/helpers.dart'; + +void main() { + runPaddingTest(Padding('ISO7816-4'), null, + createUint8ListFromHexString('ffffff'), 8, 'ffffff8000000000'); + runPaddingTest(Padding('ISO7816-4'), null, + createUint8ListFromHexString('00000000'), 8, '0000000080000000'); +} diff --git a/pointycastle/test/paddings/padded_block_cipher_test.dart b/pointycastle/test/paddings/padded_block_cipher_test.dart new file mode 100644 index 0000000..ffa7e1f --- /dev/null +++ b/pointycastle/test/paddings/padded_block_cipher_test.dart @@ -0,0 +1,112 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; +import '../test/src/null_block_cipher.dart'; + +void main() { + registry.register(NullBlockCipher.factoryConfig); + + group('PaddedBlockCipher:', () { + var params = PaddedBlockCipherParameters(null, null); + var pbc = PaddedBlockCipher('Null/PKCS7'); + + group('partial blocks:', () { + var sequence = createUint8ListFromSequentialNumbers(24); + var paddedSequenceHex = + '000102030405060708090a0b0c0d0e0f10111213141516170808080808080808'; + + test('cipher', () { + pbc.init(true, params); + + var out = pbc.process(sequence); + + expect(formatBytesAsHexString(out), paddedSequenceHex); + }); + + test('decipher', () { + pbc.init(false, params); + + var out = pbc.process(createUint8ListFromHexString(paddedSequenceHex)); + + expect(formatBytesAsHexString(out), formatBytesAsHexString(sequence)); + }); + }); + + group('whole blocks:', () { + var sequence = createUint8ListFromSequentialNumbers(16); + var paddedSequenceHex = + '000102030405060708090a0b0c0d0e0f10101010101010101010101010101010'; + + test('cipher', () { + pbc.init(true, params); + + var out = pbc.process(sequence); + + expect(formatBytesAsHexString(out), paddedSequenceHex); + }); + + test('decipher', () { + pbc.init(false, params); + + var out = pbc.process(createUint8ListFromHexString(paddedSequenceHex)); + + expect(formatBytesAsHexString(out), formatBytesAsHexString(sequence)); + }); + }); + }); + + group('BasePadding:', () { + var params = PaddedBlockCipherParameters(null, null); + var pbc = PaddedBlockCipher('Null/PKCS7'); + + var pkcs = PKCS7Padding(); + + group('partial blocks:', () { + var sequence = createUint8ListFromSequentialNumbers(24); + var paddedSequenceHex = + '000102030405060708090a0b0c0d0e0f10111213141516170808080808080808'; + + test('cipher', () { + pbc.init(true, params); + + var out = pbc.process(sequence); + + expect(formatBytesAsHexString(out), paddedSequenceHex); + }); + + test('decipher', () { + var out = pkcs.process( + false, createUint8ListFromHexString(paddedSequenceHex)); + + expect(formatBytesAsHexString(out), formatBytesAsHexString(sequence)); + }); + }); + + group('whole blocks:', () { + var sequence = createUint8ListFromSequentialNumbers(16); + var paddedSequenceHex = + '000102030405060708090a0b0c0d0e0f10101010101010101010101010101010'; + + test('cipher', () { + pbc.init(true, params); + + var out = pbc.process(sequence); + + expect(formatBytesAsHexString(out), paddedSequenceHex); + }); + + test('decipher', () { + pbc.init(false, params); + + var out = pkcs.process( + false, createUint8ListFromHexString(paddedSequenceHex)); + + expect(formatBytesAsHexString(out), formatBytesAsHexString(sequence)); + }); + }); + }); +} diff --git a/pointycastle/test/paddings/pkcs7_test.dart b/pointycastle/test/paddings/pkcs7_test.dart new file mode 100644 index 0000000..1df9b87 --- /dev/null +++ b/pointycastle/test/paddings/pkcs7_test.dart @@ -0,0 +1,15 @@ +// See file LICENSE for more information. + +import 'dart:typed_data' show Uint8List; + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/padding.dart'; +import '../test/src/helpers.dart'; + +void main() { + runPaddingTest(Padding('PKCS7'), null, createUint8ListFromString('123456789'), + 16, '31323334353637383907070707070707'); + runPaddingTest(Padding('PKCS7'), null, Uint8List.fromList([]), 16, + '10101010101010101010101010101010'); +} diff --git a/pointycastle/test/platform/platform_native_test.dart b/pointycastle/test/platform/platform_native_test.dart new file mode 100644 index 0000000..282d231 --- /dev/null +++ b/pointycastle/test/platform/platform_native_test.dart @@ -0,0 +1,15 @@ +@TestOn('vm') +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:test/test.dart'; + +void main() { + test('is native', () { + expect(Platform.instance.platform, isNot(equals('web'))); + expect(Platform.instance.isNative, equals(true)); + expect(Platform.instance.fullWidthInteger, equals(true)); + }); + + test('width assertion', () { + expect(() => {Platform.instance.assertFullWidthInteger()}, returnsNormally); + }); +} diff --git a/pointycastle/test/platform/platform_web_test.dart b/pointycastle/test/platform/platform_web_test.dart new file mode 100644 index 0000000..33a044e --- /dev/null +++ b/pointycastle/test/platform/platform_web_test.dart @@ -0,0 +1,16 @@ +@TestOn('browser') +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:test/test.dart'; + +void main() { + test('is not native', () { + expect(Platform.instance.platform, equals('web')); + expect(Platform.instance.isNative, equals(false)); + expect(Platform.instance.fullWidthInteger, equals(false)); + }); + + test('width assertion', () { + expect(() => {Platform.instance.assertFullWidthInteger()}, + throwsA(TypeMatcher())); + }); +} diff --git a/pointycastle/test/random/auto_seed_block_ctr_random_test.dart b/pointycastle/test/random/auto_seed_block_ctr_random_test.dart new file mode 100644 index 0000000..a1c4eb4 --- /dev/null +++ b/pointycastle/test/random/auto_seed_block_ctr_random_test.dart @@ -0,0 +1,65 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import 'package:test/test.dart'; + +void main() { + group('AutoSeedBlockCtrRandom:', () { + final rnd = SecureRandom('AES/CTR/AUTO-SEED-PRNG'); + + test(rnd.algorithmName, () { + final key = Uint8List(16); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + rnd.seed(params); + + final firstExpected = [ + 102, + 233, + 75, + 212, + 239, + 138, + 44, + 59, + 136, + 76, + 250, + 89, + 202, + 52, + 43, + 46, + 88 + ]; + var firstBytes = rnd.nextBytes(17); + expect(firstBytes, firstExpected); + + final lastExpected = [ + 156, + 238, + 41, + 193, + 135, + 66, + 23, + 87, + 208, + 14, + 88, + 227, + 93, + 31, + 171, + 110, + 221 + ]; + var lastBytes = rnd.nextBytes(17); + expect(lastBytes, lastExpected); + }); + }); +} diff --git a/pointycastle/test/random/block_ctr_random_test.dart b/pointycastle/test/random/block_ctr_random_test.dart new file mode 100644 index 0000000..71a16b0 --- /dev/null +++ b/pointycastle/test/random/block_ctr_random_test.dart @@ -0,0 +1,4138 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import 'package:test/test.dart'; + +void main() { + group('BlockCtrRandom:', () { + final rnd = SecureRandom('AES/CTR/PRNG'); + + test(rnd.algorithmName, () { + final key = Uint8List(16); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + rnd.seed(params); + var bytes = rnd.nextBytes(16 * 257); + + final expected = [ + 102, + 233, + 75, + 212, + 239, + 138, + 44, + 59, + 136, + 76, + 250, + 89, + 202, + 52, + 43, + 46, + 88, + 226, + 252, + 206, + 250, + 126, + 48, + 97, + 54, + 127, + 29, + 87, + 164, + 231, + 69, + 90, + 3, + 136, + 218, + 206, + 96, + 182, + 163, + 146, + 243, + 40, + 194, + 185, + 113, + 178, + 254, + 120, + 247, + 149, + 170, + 171, + 73, + 75, + 89, + 35, + 247, + 253, + 137, + 255, + 148, + 139, + 193, + 224, + 32, + 2, + 17, + 33, + 78, + 115, + 148, + 218, + 32, + 137, + 182, + 172, + 208, + 147, + 171, + 224, + 201, + 77, + 162, + 25, + 17, + 142, + 41, + 125, + 123, + 126, + 188, + 188, + 201, + 195, + 136, + 242, + 138, + 222, + 125, + 133, + 168, + 238, + 53, + 97, + 111, + 113, + 36, + 169, + 213, + 39, + 2, + 145, + 149, + 184, + 77, + 27, + 150, + 198, + 144, + 255, + 47, + 45, + 227, + 11, + 242, + 236, + 137, + 224, + 2, + 83, + 120, + 110, + 18, + 101, + 4, + 240, + 218, + 185, + 12, + 72, + 163, + 3, + 33, + 222, + 51, + 69, + 230, + 176, + 70, + 30, + 124, + 158, + 108, + 107, + 122, + 254, + 221, + 232, + 63, + 64, + 222, + 179, + 250, + 103, + 148, + 248, + 253, + 143, + 85, + 168, + 141, + 203, + 218, + 157, + 104, + 242, + 19, + 124, + 201, + 200, + 52, + 32, + 7, + 126, + 124, + 242, + 138, + 178, + 105, + 107, + 13, + 240, + 93, + 17, + 69, + 43, + 88, + 172, + 80, + 170, + 46, + 179, + 161, + 149, + 182, + 27, + 135, + 229, + 198, + 90, + 109, + 213, + 215, + 247, + 168, + 64, + 101, + 213, + 161, + 127, + 244, + 98, + 115, + 8, + 96, + 2, + 73, + 109, + 182, + 63, + 164, + 185, + 27, + 238, + 56, + 127, + 163, + 3, + 12, + 149, + 167, + 63, + 141, + 4, + 55, + 224, + 145, + 95, + 188, + 229, + 215, + 166, + 45, + 141, + 171, + 10, + 88, + 178, + 67, + 27, + 192, + 190, + 222, + 2, + 85, + 15, + 64, + 35, + 137, + 105, + 236, + 120, + 4, + 16, + 190, + 252, + 205, + 230, + 148, + 75, + 105, + 221, + 0, + 125, + 235, + 227, + 154, + 157, + 188, + 94, + 36, + 245, + 25, + 164, + 189, + 244, + 120, + 177, + 217, + 236, + 11, + 103, + 18, + 95, + 40, + 176, + 110, + 250, + 165, + 93, + 121, + 65, + 42, + 214, + 40, + 212, + 80, + 137, + 195, + 195, + 4, + 249, + 77, + 179, + 162, + 29, + 246, + 205, + 175, + 109, + 46, + 46, + 59, + 53, + 84, + 65, + 239, + 246, + 74, + 217, + 5, + 39, + 231, + 82, + 164, + 178, + 235, + 180, + 208, + 161, + 7, + 12, + 226, + 226, + 152, + 46, + 39, + 47, + 219, + 124, + 244, + 181, + 132, + 176, + 149, + 160, + 249, + 87, + 253, + 184, + 40, + 104, + 148, + 55, + 227, + 125, + 196, + 139, + 42, + 211, + 121, + 198, + 243, + 198, + 233, + 87, + 238, + 119, + 175, + 184, + 140, + 101, + 148, + 155, + 161, + 46, + 236, + 69, + 194, + 40, + 101, + 228, + 144, + 122, + 228, + 42, + 238, + 129, + 56, + 152, + 172, + 223, + 145, + 226, + 228, + 194, + 29, + 130, + 142, + 10, + 118, + 222, + 43, + 182, + 187, + 111, + 134, + 158, + 94, + 239, + 31, + 97, + 141, + 237, + 210, + 117, + 98, + 129, + 43, + 154, + 20, + 232, + 153, + 106, + 92, + 53, + 45, + 243, + 129, + 126, + 96, + 214, + 236, + 32, + 17, + 154, + 82, + 200, + 10, + 97, + 236, + 25, + 86, + 34, + 98, + 114, + 64, + 33, + 45, + 236, + 202, + 81, + 95, + 234, + 182, + 62, + 39, + 52, + 88, + 121, + 72, + 168, + 54, + 167, + 222, + 32, + 92, + 254, + 192, + 194, + 136, + 53, + 28, + 52, + 139, + 17, + 121, + 65, + 221, + 10, + 99, + 217, + 148, + 112, + 62, + 99, + 217, + 74, + 68, + 104, + 4, + 33, + 58, + 180, + 251, + 29, + 43, + 123, + 163, + 118, + 89, + 10, + 44, + 36, + 29, + 31, + 80, + 141, + 198, + 167, + 244, + 24, + 161, + 69, + 3, + 222, + 184, + 155, + 23, + 170, + 219, + 40, + 6, + 247, + 63, + 192, + 110, + 93, + 20, + 230, + 117, + 245, + 236, + 136, + 0, + 35, + 212, + 247, + 50, + 150, + 18, + 220, + 228, + 160, + 229, + 188, + 121, + 43, + 91, + 90, + 85, + 249, + 194, + 243, + 14, + 7, + 173, + 32, + 153, + 233, + 172, + 41, + 0, + 7, + 170, + 94, + 18, + 80, + 107, + 237, + 130, + 113, + 64, + 210, + 97, + 20, + 76, + 222, + 102, + 237, + 181, + 179, + 39, + 211, + 246, + 148, + 88, + 196, + 146, + 164, + 235, + 53, + 30, + 113, + 64, + 67, + 2, + 75, + 146, + 205, + 182, + 137, + 201, + 139, + 129, + 110, + 72, + 164, + 23, + 148, + 164, + 211, + 156, + 250, + 107, + 71, + 165, + 52, + 6, + 37, + 24, + 160, + 185, + 132, + 237, + 109, + 150, + 127, + 167, + 69, + 209, + 97, + 120, + 169, + 158, + 56, + 3, + 145, + 24, + 196, + 164, + 242, + 60, + 31, + 32, + 81, + 198, + 30, + 16, + 191, + 46, + 244, + 133, + 33, + 215, + 208, + 210, + 116, + 202, + 4, + 188, + 84, + 224, + 127, + 73, + 215, + 47, + 32, + 181, + 250, + 7, + 39, + 63, + 100, + 194, + 248, + 196, + 50, + 227, + 191, + 188, + 224, + 158, + 228, + 154, + 112, + 146, + 106, + 13, + 226, + 188, + 30, + 76, + 172, + 22, + 110, + 95, + 231, + 135, + 39, + 183, + 158, + 134, + 15, + 126, + 69, + 175, + 95, + 93, + 238, + 49, + 165, + 90, + 32, + 65, + 167, + 24, + 146, + 139, + 126, + 34, + 89, + 11, + 143, + 159, + 237, + 177, + 23, + 106, + 2, + 147, + 166, + 228, + 119, + 1, + 134, + 148, + 34, + 177, + 253, + 0, + 124, + 190, + 57, + 166, + 60, + 165, + 234, + 30, + 14, + 167, + 44, + 183, + 231, + 71, + 94, + 43, + 147, + 92, + 119, + 63, + 249, + 18, + 118, + 146, + 99, + 67, + 15, + 245, + 167, + 27, + 134, + 21, + 73, + 205, + 232, + 32, + 88, + 3, + 230, + 145, + 26, + 155, + 170, + 176, + 255, + 121, + 92, + 119, + 193, + 172, + 201, + 31, + 29, + 219, + 30, + 105, + 156, + 134, + 253, + 184, + 223, + 236, + 27, + 60, + 39, + 212, + 16, + 218, + 122, + 218, + 155, + 6, + 244, + 234, + 149, + 65, + 78, + 255, + 160, + 21, + 92, + 2, + 216, + 218, + 163, + 57, + 94, + 49, + 210, + 227, + 95, + 106, + 4, + 189, + 21, + 4, + 116, + 250, + 130, + 61, + 37, + 229, + 13, + 172, + 226, + 112, + 195, + 210, + 187, + 206, + 202, + 50, + 253, + 129, + 94, + 222, + 149, + 137, + 119, + 78, + 223, + 42, + 189, + 31, + 128, + 21, + 166, + 205, + 221, + 103, + 131, + 49, + 155, + 87, + 54, + 178, + 53, + 93, + 247, + 144, + 208, + 131, + 55, + 160, + 124, + 102, + 199, + 64, + 130, + 230, + 237, + 223, + 9, + 170, + 223, + 84, + 128, + 111, + 98, + 28, + 53, + 148, + 146, + 170, + 70, + 37, + 79, + 129, + 231, + 93, + 210, + 235, + 166, + 208, + 75, + 230, + 25, + 228, + 68, + 89, + 99, + 103, + 187, + 8, + 205, + 196, + 51, + 219, + 187, + 146, + 168, + 177, + 28, + 81, + 193, + 49, + 102, + 31, + 122, + 131, + 82, + 115, + 26, + 90, + 191, + 85, + 235, + 89, + 7, + 155, + 61, + 11, + 133, + 142, + 188, + 241, + 235, + 154, + 175, + 212, + 119, + 163, + 199, + 165, + 73, + 141, + 233, + 73, + 105, + 39, + 141, + 190, + 9, + 56, + 245, + 157, + 163, + 217, + 112, + 141, + 36, + 115, + 25, + 240, + 55, + 150, + 238, + 91, + 202, + 104, + 222, + 182, + 182, + 146, + 55, + 124, + 133, + 246, + 81, + 93, + 42, + 51, + 225, + 94, + 7, + 10, + 222, + 83, + 61, + 46, + 9, + 14, + 208, + 245, + 190, + 19, + 188, + 9, + 131, + 38, + 90, + 253, + 71, + 6, + 202, + 231, + 37, + 218, + 19, + 236, + 170, + 33, + 180, + 233, + 43, + 185, + 160, + 184, + 146, + 152, + 12, + 28, + 87, + 30, + 175, + 116, + 0, + 45, + 132, + 252, + 128, + 22, + 228, + 255, + 25, + 125, + 155, + 53, + 125, + 198, + 176, + 208, + 208, + 95, + 145, + 74, + 3, + 167, + 81, + 156, + 169, + 206, + 90, + 200, + 225, + 181, + 221, + 157, + 218, + 209, + 77, + 62, + 253, + 38, + 158, + 57, + 250, + 78, + 104, + 77, + 209, + 247, + 212, + 141, + 194, + 248, + 28, + 243, + 5, + 86, + 33, + 138, + 179, + 198, + 18, + 206, + 219, + 41, + 115, + 46, + 95, + 204, + 57, + 248, + 215, + 68, + 138, + 140, + 212, + 142, + 248, + 115, + 246, + 241, + 60, + 57, + 81, + 63, + 205, + 0, + 254, + 221, + 107, + 185, + 123, + 118, + 66, + 197, + 20, + 246, + 95, + 0, + 31, + 45, + 122, + 96, + 64, + 145, + 84, + 219, + 145, + 78, + 44, + 117, + 80, + 197, + 145, + 118, + 219, + 33, + 47, + 175, + 229, + 160, + 134, + 63, + 220, + 130, + 141, + 29, + 249, + 219, + 31, + 139, + 175, + 174, + 28, + 41, + 16, + 134, + 5, + 75, + 70, + 98, + 43, + 159, + 72, + 152, + 131, + 115, + 78, + 50, + 90, + 141, + 209, + 115, + 24, + 62, + 14, + 143, + 56, + 12, + 150, + 137, + 196, + 223, + 49, + 148, + 245, + 71, + 98, + 20, + 136, + 63, + 140, + 207, + 90, + 118, + 174, + 54, + 51, + 0, + 178, + 243, + 243, + 231, + 151, + 223, + 150, + 166, + 120, + 215, + 84, + 187, + 176, + 63, + 111, + 148, + 16, + 247, + 158, + 202, + 112, + 18, + 12, + 99, + 237, + 14, + 60, + 237, + 150, + 159, + 209, + 224, + 55, + 137, + 6, + 180, + 129, + 137, + 36, + 193, + 75, + 36, + 195, + 246, + 33, + 0, + 145, + 71, + 115, + 26, + 79, + 190, + 9, + 246, + 19, + 203, + 74, + 132, + 212, + 251, + 161, + 74, + 190, + 245, + 101, + 106, + 23, + 85, + 145, + 29, + 93, + 228, + 78, + 251, + 87, + 121, + 183, + 214, + 246, + 220, + 117, + 154, + 9, + 79, + 95, + 224, + 116, + 211, + 223, + 218, + 201, + 83, + 154, + 200, + 60, + 24, + 96, + 78, + 80, + 167, + 13, + 96, + 198, + 205, + 36, + 23, + 8, + 18, + 206, + 128, + 163, + 49, + 47, + 62, + 104, + 16, + 32, + 94, + 91, + 212, + 130, + 74, + 14, + 89, + 163, + 59, + 241, + 235, + 78, + 70, + 234, + 89, + 225, + 50, + 85, + 118, + 197, + 203, + 151, + 84, + 42, + 210, + 221, + 88, + 251, + 125, + 204, + 140, + 227, + 91, + 193, + 40, + 232, + 24, + 147, + 60, + 12, + 59, + 198, + 242, + 137, + 171, + 153, + 206, + 70, + 55, + 47, + 131, + 210, + 148, + 121, + 183, + 152, + 229, + 3, + 44, + 90, + 185, + 243, + 176, + 170, + 250, + 82, + 201, + 14, + 216, + 195, + 23, + 232, + 82, + 48, + 112, + 80, + 248, + 30, + 157, + 102, + 20, + 218, + 114, + 233, + 127, + 17, + 51, + 220, + 8, + 219, + 255, + 157, + 80, + 102, + 53, + 62, + 74, + 182, + 226, + 20, + 183, + 86, + 247, + 250, + 22, + 156, + 29, + 250, + 13, + 239, + 133, + 118, + 66, + 212, + 66, + 76, + 136, + 40, + 121, + 58, + 194, + 26, + 17, + 143, + 70, + 77, + 151, + 234, + 199, + 236, + 222, + 103, + 12, + 131, + 199, + 46, + 126, + 103, + 48, + 115, + 54, + 66, + 246, + 37, + 171, + 40, + 194, + 207, + 129, + 96, + 209, + 5, + 119, + 28, + 73, + 63, + 196, + 89, + 216, + 139, + 4, + 65, + 163, + 145, + 77, + 24, + 128, + 87, + 158, + 131, + 79, + 92, + 227, + 212, + 228, + 208, + 27, + 250, + 152, + 161, + 141, + 240, + 77, + 80, + 101, + 57, + 17, + 5, + 191, + 226, + 66, + 64, + 228, + 254, + 96, + 159, + 244, + 253, + 197, + 87, + 253, + 39, + 28, + 144, + 48, + 1, + 42, + 39, + 116, + 22, + 239, + 7, + 98, + 154, + 189, + 196, + 221, + 74, + 200, + 11, + 137, + 74, + 39, + 105, + 173, + 167, + 127, + 6, + 26, + 199, + 122, + 91, + 124, + 182, + 145, + 102, + 87, + 2, + 84, + 242, + 40, + 200, + 178, + 4, + 232, + 181, + 169, + 174, + 242, + 252, + 60, + 247, + 214, + 32, + 140, + 60, + 32, + 242, + 175, + 22, + 23, + 125, + 208, + 65, + 235, + 105, + 179, + 56, + 143, + 24, + 87, + 10, + 22, + 227, + 149, + 144, + 233, + 176, + 247, + 6, + 78, + 18, + 182, + 61, + 253, + 84, + 112, + 119, + 119, + 118, + 149, + 159, + 22, + 181, + 121, + 212, + 52, + 214, + 227, + 108, + 206, + 114, + 53, + 132, + 192, + 238, + 225, + 250, + 34, + 242, + 89, + 140, + 21, + 227, + 92, + 84, + 221, + 138, + 150, + 42, + 235, + 106, + 172, + 18, + 186, + 131, + 167, + 59, + 18, + 192, + 48, + 208, + 95, + 17, + 218, + 103, + 24, + 245, + 182, + 216, + 146, + 93, + 237, + 37, + 15, + 55, + 17, + 9, + 237, + 200, + 20, + 121, + 38, + 230, + 135, + 193, + 182, + 43, + 168, + 62, + 226, + 120, + 33, + 61, + 234, + 219, + 62, + 173, + 80, + 193, + 249, + 128, + 190, + 25, + 198, + 191, + 167, + 230, + 200, + 6, + 3, + 31, + 104, + 173, + 44, + 50, + 136, + 24, + 166, + 55, + 134, + 230, + 64, + 124, + 126, + 34, + 160, + 249, + 91, + 221, + 7, + 101, + 88, + 167, + 43, + 218, + 250, + 160, + 66, + 236, + 239, + 149, + 221, + 170, + 128, + 7, + 166, + 91, + 100, + 124, + 61, + 207, + 8, + 86, + 174, + 202, + 163, + 121, + 153, + 230, + 96, + 62, + 115, + 50, + 136, + 113, + 88, + 109, + 249, + 232, + 9, + 235, + 241, + 44, + 166, + 161, + 7, + 162, + 10, + 124, + 5, + 102, + 153, + 22, + 171, + 137, + 234, + 141, + 222, + 167, + 7, + 55, + 90, + 129, + 101, + 156, + 251, + 29, + 83, + 94, + 94, + 70, + 182, + 182, + 166, + 158, + 144, + 229, + 3, + 87, + 159, + 12, + 17, + 4, + 114, + 168, + 69, + 247, + 126, + 108, + 232, + 171, + 30, + 39, + 44, + 45, + 149, + 9, + 227, + 92, + 23, + 48, + 163, + 189, + 225, + 188, + 24, + 238, + 142, + 12, + 111, + 13, + 100, + 63, + 76, + 58, + 6, + 193, + 120, + 231, + 193, + 215, + 117, + 240, + 239, + 150, + 145, + 239, + 115, + 156, + 216, + 176, + 10, + 83, + 30, + 104, + 131, + 99, + 64, + 126, + 236, + 17, + 209, + 255, + 87, + 76, + 78, + 106, + 79, + 158, + 57, + 242, + 65, + 32, + 28, + 227, + 18, + 153, + 48, + 203, + 147, + 73, + 14, + 203, + 6, + 208, + 16, + 17, + 228, + 128, + 121, + 142, + 213, + 72, + 2, + 227, + 92, + 195, + 22, + 129, + 58, + 20, + 25, + 158, + 196, + 175, + 60, + 194, + 58, + 122, + 231, + 169, + 208, + 94, + 92, + 14, + 79, + 190, + 73, + 29, + 216, + 3, + 86, + 249, + 230, + 239, + 14, + 84, + 9, + 164, + 239, + 96, + 38, + 31, + 191, + 14, + 227, + 1, + 33, + 219, + 2, + 193, + 254, + 233, + 65, + 209, + 3, + 25, + 249, + 104, + 94, + 36, + 163, + 104, + 210, + 202, + 63, + 13, + 3, + 224, + 223, + 208, + 60, + 7, + 254, + 98, + 199, + 198, + 93, + 115, + 226, + 33, + 223, + 106, + 48, + 121, + 220, + 221, + 59, + 120, + 181, + 98, + 214, + 114, + 228, + 36, + 97, + 7, + 251, + 211, + 42, + 151, + 52, + 155, + 242, + 237, + 153, + 232, + 114, + 108, + 177, + 115, + 67, + 73, + 229, + 197, + 73, + 154, + 255, + 73, + 184, + 223, + 74, + 151, + 203, + 224, + 56, + 51, + 230, + 97, + 151, + 98, + 13, + 173, + 224, + 141, + 210, + 165, + 29, + 58, + 100, + 136, + 189, + 33, + 4, + 182, + 197, + 165, + 28, + 9, + 177, + 62, + 56, + 218, + 199, + 209, + 45, + 165, + 133, + 41, + 82, + 47, + 48, + 196, + 210, + 28, + 158, + 35, + 24, + 53, + 120, + 39, + 239, + 237, + 231, + 60, + 203, + 254, + 241, + 158, + 198, + 171, + 14, + 77, + 147, + 193, + 193, + 168, + 133, + 184, + 55, + 171, + 131, + 163, + 253, + 4, + 3, + 167, + 230, + 1, + 97, + 151, + 116, + 218, + 197, + 38, + 223, + 127, + 111, + 1, + 25, + 98, + 124, + 255, + 185, + 223, + 94, + 0, + 102, + 60, + 147, + 109, + 22, + 1, + 233, + 254, + 76, + 228, + 206, + 188, + 168, + 105, + 224, + 16, + 17, + 218, + 127, + 133, + 63, + 197, + 8, + 61, + 106, + 213, + 9, + 37, + 213, + 43, + 218, + 216, + 125, + 165, + 231, + 155, + 77, + 181, + 41, + 112, + 7, + 59, + 59, + 242, + 192, + 251, + 13, + 124, + 52, + 219, + 42, + 243, + 195, + 9, + 98, + 212, + 99, + 161, + 165, + 23, + 127, + 17, + 31, + 44, + 209, + 169, + 111, + 220, + 193, + 99, + 158, + 133, + 25, + 171, + 59, + 42, + 22, + 121, + 142, + 68, + 44, + 216, + 227, + 252, + 198, + 222, + 243, + 104, + 39, + 76, + 105, + 102, + 37, + 67, + 136, + 115, + 69, + 78, + 127, + 198, + 199, + 55, + 211, + 153, + 170, + 53, + 93, + 127, + 244, + 117, + 192, + 81, + 40, + 154, + 234, + 60, + 15, + 149, + 221, + 74, + 74, + 92, + 157, + 25, + 10, + 158, + 112, + 210, + 99, + 9, + 203, + 238, + 195, + 31, + 128, + 49, + 117, + 132, + 46, + 75, + 90, + 188, + 143, + 128, + 6, + 2, + 192, + 123, + 79, + 249, + 90, + 28, + 12, + 14, + 195, + 142, + 226, + 108, + 163, + 84, + 174, + 36, + 47, + 149, + 201, + 139, + 83, + 83, + 190, + 155, + 124, + 235, + 161, + 166, + 28, + 6, + 217, + 160, + 63, + 89, + 171, + 42, + 181, + 66, + 80, + 0, + 146, + 17, + 94, + 112, + 206, + 19, + 93, + 160, + 37, + 126, + 92, + 241, + 40, + 244, + 110, + 52, + 88, + 154, + 58, + 198, + 78, + 9, + 254, + 141, + 111, + 250, + 245, + 221, + 75, + 251, + 124, + 7, + 212, + 183, + 68, + 44, + 206, + 248, + 196, + 18, + 238, + 78, + 249, + 147, + 128, + 98, + 45, + 142, + 84, + 90, + 169, + 97, + 183, + 19, + 93, + 25, + 90, + 123, + 148, + 255, + 97, + 177, + 163, + 101, + 100, + 226, + 212, + 161, + 22, + 21, + 106, + 188, + 138, + 46, + 104, + 189, + 232, + 3, + 112, + 203, + 55, + 254, + 204, + 190, + 138, + 81, + 219, + 155, + 137, + 209, + 255, + 186, + 127, + 5, + 81, + 120, + 97, + 224, + 94, + 25, + 173, + 87, + 0, + 163, + 179, + 110, + 114, + 92, + 165, + 112, + 244, + 170, + 38, + 170, + 102, + 236, + 123, + 207, + 161, + 69, + 185, + 190, + 86, + 243, + 247, + 148, + 161, + 18, + 5, + 203, + 65, + 43, + 192, + 117, + 26, + 191, + 172, + 222, + 51, + 199, + 254, + 39, + 198, + 11, + 77, + 125, + 196, + 122, + 200, + 199, + 78, + 232, + 176, + 183, + 240, + 180, + 144, + 152, + 6, + 136, + 16, + 106, + 104, + 77, + 246, + 197, + 25, + 132, + 143, + 223, + 21, + 191, + 178, + 32, + 210, + 37, + 223, + 222, + 5, + 189, + 229, + 234, + 34, + 48, + 124, + 242, + 186, + 30, + 31, + 18, + 84, + 108, + 102, + 136, + 91, + 233, + 178, + 219, + 73, + 108, + 15, + 60, + 75, + 214, + 95, + 84, + 62, + 34, + 155, + 9, + 202, + 131, + 229, + 124, + 149, + 187, + 196, + 223, + 185, + 156, + 42, + 197, + 195, + 92, + 50, + 71, + 137, + 80, + 239, + 220, + 109, + 57, + 36, + 247, + 122, + 235, + 175, + 125, + 224, + 89, + 38, + 6, + 17, + 15, + 13, + 89, + 88, + 90, + 145, + 109, + 221, + 47, + 241, + 107, + 71, + 12, + 153, + 209, + 162, + 0, + 222, + 28, + 33, + 142, + 145, + 131, + 205, + 254, + 129, + 43, + 186, + 26, + 62, + 184, + 66, + 27, + 186, + 71, + 92, + 25, + 50, + 49, + 179, + 34, + 126, + 219, + 197, + 70, + 97, + 44, + 246, + 246, + 38, + 71, + 174, + 22, + 116, + 51, + 56, + 39, + 41, + 11, + 43, + 82, + 244, + 214, + 175, + 60, + 194, + 69, + 167, + 101, + 47, + 67, + 207, + 25, + 110, + 63, + 91, + 132, + 25, + 139, + 164, + 35, + 206, + 197, + 119, + 190, + 201, + 231, + 233, + 25, + 176, + 200, + 3, + 80, + 182, + 212, + 8, + 114, + 76, + 205, + 156, + 139, + 127, + 125, + 125, + 220, + 199, + 230, + 10, + 208, + 132, + 140, + 64, + 4, + 52, + 78, + 55, + 142, + 169, + 231, + 81, + 247, + 249, + 125, + 59, + 112, + 202, + 122, + 89, + 102, + 237, + 181, + 45, + 238, + 34, + 125, + 71, + 105, + 83, + 56, + 129, + 152, + 181, + 85, + 110, + 185, + 76, + 248, + 190, + 17, + 238, + 98, + 218, + 85, + 207, + 172, + 103, + 42, + 47, + 141, + 209, + 128, + 186, + 75, + 30, + 144, + 206, + 156, + 2, + 22, + 79, + 250, + 51, + 120, + 153, + 191, + 54, + 249, + 64, + 196, + 251, + 119, + 82, + 80, + 209, + 154, + 13, + 55, + 13, + 158, + 102, + 195, + 6, + 60, + 211, + 99, + 200, + 185, + 224, + 153, + 13, + 152, + 150, + 140, + 84, + 43, + 132, + 31, + 45, + 170, + 234, + 26, + 139, + 58, + 77, + 107, + 221, + 127, + 51, + 181, + 72, + 79, + 243, + 45, + 239, + 178, + 13, + 210, + 91, + 228, + 133, + 95, + 24, + 167, + 42, + 144, + 130, + 131, + 252, + 152, + 253, + 20, + 23, + 9, + 96, + 147, + 194, + 65, + 144, + 93, + 202, + 127, + 178, + 81, + 70, + 147, + 193, + 151, + 93, + 197, + 229, + 83, + 128, + 52, + 94, + 245, + 158, + 199, + 203, + 21, + 253, + 202, + 235, + 70, + 118, + 40, + 97, + 1, + 65, + 159, + 84, + 110, + 240, + 103, + 103, + 58, + 219, + 35, + 213, + 2, + 158, + 218, + 168, + 4, + 24, + 250, + 151, + 110, + 56, + 67, + 80, + 199, + 199, + 160, + 92, + 25, + 210, + 160, + 168, + 4, + 133, + 133, + 177, + 53, + 60, + 221, + 189, + 205, + 195, + 173, + 105, + 44, + 45, + 7, + 108, + 10, + 161, + 25, + 123, + 165, + 58, + 191, + 39, + 69, + 3, + 104, + 243, + 202, + 86, + 3, + 208, + 86, + 208, + 2, + 99, + 6, + 218, + 94, + 189, + 49, + 204, + 202, + 254, + 37, + 239, + 203, + 134, + 186, + 165, + 236, + 17, + 243, + 163, + 129, + 226, + 103, + 13, + 37, + 218, + 78, + 158, + 228, + 189, + 28, + 85, + 12, + 157, + 188, + 13, + 143, + 141, + 63, + 215, + 218, + 94, + 135, + 191, + 206, + 107, + 82, + 48, + 230, + 46, + 157, + 107, + 186, + 4, + 201, + 208, + 43, + 25, + 5, + 171, + 217, + 117, + 249, + 224, + 78, + 76, + 54, + 30, + 207, + 115, + 181, + 251, + 7, + 18, + 221, + 55, + 195, + 252, + 173, + 132, + 47, + 6, + 53, + 121, + 134, + 17, + 36, + 111, + 213, + 11, + 46, + 139, + 202, + 5, + 100, + 175, + 144, + 172, + 11, + 62, + 23, + 227, + 99, + 32, + 210, + 106, + 199, + 252, + 182, + 162, + 168, + 205, + 212, + 145, + 130, + 223, + 72, + 56, + 16, + 21, + 27, + 180, + 117, + 161, + 167, + 105, + 134, + 89, + 48, + 1, + 75, + 134, + 217, + 168, + 198, + 216, + 221, + 255, + 116, + 164, + 22, + 122, + 236, + 135, + 118, + 74, + 167, + 149, + 136, + 165, + 19, + 88, + 53, + 197, + 39, + 217, + 194, + 55, + 250, + 186, + 121, + 188, + 48, + 254, + 171, + 11, + 98, + 221, + 175, + 156, + 98, + 153, + 19, + 225, + 215, + 188, + 153, + 18, + 223, + 232, + 11, + 21, + 155, + 184, + 146, + 85, + 248, + 70, + 33, + 49, + 42, + 236, + 241, + 96, + 174, + 113, + 199, + 89, + 43, + 212, + 36, + 201, + 43, + 173, + 0, + 45, + 111, + 138, + 52, + 122, + 175, + 235, + 152, + 100, + 217, + 129, + 186, + 206, + 150, + 135, + 179, + 153, + 190, + 218, + 21, + 241, + 129, + 27, + 0, + 172, + 179, + 82, + 146, + 56, + 18, + 159, + 189, + 73, + 24, + 59, + 151, + 202, + 148, + 203, + 14, + 210, + 74, + 227, + 112, + 177, + 200, + 7, + 4, + 136, + 12, + 49, + 251, + 161, + 14, + 236, + 9, + 187, + 27, + 68, + 171, + 136, + 57, + 136, + 238, + 4, + 168, + 222, + 158, + 162, + 88, + 146, + 125, + 137, + 123, + 113, + 87, + 195, + 238, + 128, + 210, + 130, + 106, + 246, + 140, + 175, + 49, + 13, + 67, + 245, + 46, + 249, + 122, + 142, + 229, + 19, + 231, + 73, + 155, + 35, + 237, + 38, + 237, + 94, + 90, + 243, + 166, + 198, + 189, + 37, + 192, + 32, + 45, + 177, + 67, + 240, + 101, + 74, + 105, + 179, + 200, + 12, + 85, + 97, + 15, + 12, + 234, + 89, + 81, + 77, + 169, + 231, + 103, + 108, + 225, + 35, + 151, + 242, + 167, + 156, + 167, + 254, + 219, + 50, + 75, + 37, + 224, + 250, + 121, + 184, + 235, + 115, + 133, + 215, + 177, + 21, + 105, + 211, + 167, + 220, + 82, + 208, + 249, + 15, + 171, + 240, + 51, + 112, + 89, + 66, + 240, + 248, + 33, + 236, + 112, + 196, + 175, + 160, + 142, + 108, + 241, + 220, + 255, + 80, + 72, + 187, + 3, + 18, + 81, + 136, + 199, + 115, + 99, + 44, + 5, + 108, + 194, + 48, + 198, + 112, + 251, + 246, + 51, + 105, + 60, + 138, + 114, + 98, + 215, + 251, + 203, + 206, + 29, + 78, + 60, + 244, + 199, + 246, + 48, + 239, + 34, + 9, + 132, + 233, + 150, + 211, + 150, + 98, + 86, + 86, + 171, + 174, + 169, + 164, + 70, + 157, + 47, + 120, + 176, + 94, + 46, + 21, + 70, + 171, + 38, + 126, + 41, + 239, + 232, + 197, + 95, + 239, + 112, + 255, + 190, + 111, + 209, + 42, + 93, + 139, + 183, + 160, + 204, + 202, + 37, + 39, + 135, + 172, + 202, + 99, + 40, + 113, + 74, + 137, + 29, + 48, + 18, + 212, + 221, + 133, + 154, + 20, + 108, + 12, + 14, + 148, + 133, + 132, + 156, + 242, + 73, + 143, + 64, + 6, + 216, + 249, + 68, + 120, + 111, + 40, + 78, + 22, + 193, + 200, + 182, + 49, + 220, + 8, + 210, + 220, + 60, + 58, + 209, + 64, + 7, + 110, + 47, + 133, + 70, + 127, + 54, + 226, + 132, + 9, + 184, + 150, + 82, + 67, + 57, + 30, + 230, + 167, + 56, + 131, + 8, + 237, + 3, + 242, + 197, + 109, + 216, + 185, + 127, + 190, + 9, + 55, + 114, + 13, + 95, + 211, + 183, + 120, + 11, + 219, + 147, + 2, + 122, + 22, + 254, + 190, + 25, + 155, + 38, + 103, + 214, + 45, + 248, + 95, + 94, + 70, + 214, + 139, + 30, + 64, + 255, + 9, + 28, + 235, + 134, + 1, + 255, + 71, + 81, + 229, + 235, + 240, + 30, + 227, + 125, + 208, + 176, + 197, + 73, + 233, + 27, + 35, + 64, + 34, + 35, + 59, + 141, + 169, + 254, + 75, + 246, + 221, + 29, + 234, + 119, + 247, + 222, + 85, + 248, + 39, + 108, + 208, + 183, + 108, + 221, + 182, + 10, + 94, + 123, + 61, + 208, + 110, + 37, + 63, + 249, + 143, + 252, + 107, + 130, + 203, + 23, + 71, + 185, + 97, + 52, + 166, + 225, + 174, + 0, + 147, + 225, + 174, + 227, + 189, + 240, + 239, + 153, + 13, + 162, + 9, + 152, + 23, + 234, + 89, + 208, + 172, + 0, + 248, + 80, + 223, + 150, + 112, + 202, + 96, + 218, + 141, + 195, + 168, + 233, + 10, + 194, + 18, + 245, + 84, + 162, + 46, + 99, + 191, + 73, + 250, + 143, + 103, + 97, + 97, + 168, + 211, + 51, + 38, + 73, + 117, + 109, + 231, + 235, + 28, + 243, + 126, + 22, + 8, + 98, + 143, + 225, + 118, + 211, + 130, + 204, + 72, + 77, + 103, + 41, + 20, + 160, + 209, + 179, + 156, + 28, + 1, + 111, + 191, + 171, + 116, + 100, + 160, + 167, + 5, + 115, + 190, + 77, + 215, + 241, + 52, + 187, + 39, + 161, + 173, + 92, + 83, + 217, + 1, + 22, + 185, + 236, + 171, + 4, + 183, + 210, + 224, + 201, + 233, + 178, + 80, + 12, + 120, + 237, + 211, + 43, + 172, + 9, + 231, + 13, + 120, + 53, + 15, + 175, + 245, + 0, + 232, + 67, + 45, + 53, + 4, + 87, + 135, + 21, + 40, + 93, + 14, + 182, + 163, + 55, + 202, + 94, + 231, + 142, + 90, + 144, + 246, + 151, + 117, + 21, + 30, + 13, + 43, + 131, + 148, + 231, + 122, + 39, + 41, + 220, + 31, + 88, + 42, + 188, + 26, + 137, + 36, + 105, + 170, + 215, + 149, + 16, + 65, + 151, + 158, + 156, + 195, + 162, + 41, + 244, + 21, + 250, + 37, + 104, + 10, + 207, + 252, + 181, + 17, + 106, + 21, + 194, + 89, + 202, + 146, + 109, + 140, + 193, + 207, + 30, + 247, + 49, + 81, + 154, + 56, + 246, + 83, + 142, + 63, + 220, + 202, + 44, + 225, + 28, + 129, + 202, + 134, + 189, + 213, + 173, + 244, + 138, + 168, + 246, + 82, + 249, + 166, + 17, + 137, + 218, + 105, + 7, + 165, + 49, + 57, + 93, + 49, + 70, + 40, + 159, + 188, + 194, + 206, + 128, + 155, + 143, + 144, + 6, + 242, + 83, + 76, + 156, + 234, + 251, + 186, + 19, + 223, + 243, + 192, + 104, + 2, + 151, + 41, + 143, + 3, + 7, + 180, + 165, + 45, + 156, + 241, + 78, + 162, + 222, + 12, + 54, + 248, + 49, + 123, + 137, + 49, + 102, + 98, + 121, + 88, + 128, + 14, + 196, + 179, + 188, + 106, + 35, + 32, + 47, + 26, + 255, + 254, + 3, + 72, + 171, + 59, + 174, + 33, + 167, + 53, + 25, + 75, + 54, + 101, + 91, + 22, + 206, + 173, + 69, + 63, + 30, + 113, + 154, + 142, + 77, + 206, + 63, + 167, + 220, + 4, + 137, + 162, + 100, + 50, + 123, + 102, + 103, + 138, + 111, + 37, + 133, + 90, + 210, + 59, + 119, + 80, + 194, + 189, + 59, + 249, + 211, + 2, + 15, + 254, + 163, + 19, + 23, + 130, + 250, + 241, + 215, + 118, + 33, + 184, + 41, + 104, + 47, + 115, + 108, + 155, + 202, + 17, + 86, + 177, + 41, + 141, + 159, + 163, + 210, + 208, + 4, + 163, + 110, + 201, + 159, + 107, + 83, + 203, + 135, + 157, + 5, + 86, + 241, + 201, + 30, + 89, + 61, + 177, + 247, + 212, + 19, + 103, + 170, + 96, + 51, + 115, + 3, + 4, + 2, + 181, + 30, + 94, + 32, + 89, + 176, + 31, + 203, + 121, + 145, + 144, + 228, + 220, + 44, + 98, + 110, + 247, + 63, + 171, + 241, + 114, + 114, + 16, + 13, + 236, + 135, + 79, + 102, + 148, + 203, + 104, + 224, + 120, + 138, + 253, + 46, + 30, + 59, + 93, + 213, + 102, + 94, + 250, + 252, + 82, + 14, + 211, + 175, + 202, + 172, + 148, + 211, + 26, + 39, + 254, + 45, + 168, + 112, + 22, + 221, + 212, + 127, + 48, + 250, + 16, + 53, + 116, + 74, + 153, + 196, + 248, + 197, + 93, + 87, + 16, + 154, + 21, + 9, + 108, + 215, + 144, + 88, + 74, + 81, + 152, + 108, + 24, + 3, + 108, + 95, + 152, + 20, + 72, + 138, + 163, + 222, + 137, + 185, + 150, + 18, + 194, + 127, + 53, + 207, + 32, + 191, + 150, + 159, + 200, + 3, + 247, + 13, + 222, + 249, + 59, + 166, + 37, + 136, + 36, + 42, + 14, + 103, + 208, + 214, + 69, + 224, + 251, + 86, + 204, + 9, + 182, + 128, + 177, + 208, + 124, + 90, + 82, + 20, + 158, + 41, + 240, + 124 + ]; + expect(bytes, expected); + }); + }); +} diff --git a/pointycastle/test/random/fixed_rng_test.dart b/pointycastle/test/random/fixed_rng_test.dart new file mode 100644 index 0000000..767a795 --- /dev/null +++ b/pointycastle/test/random/fixed_rng_test.dart @@ -0,0 +1,33 @@ +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:test/test.dart'; + +import '../test/src/fixed_secure_random.dart'; + +void main() { + group('FixedSecureRandom:', () { + test('No seed', () { + final rng = FixedSecureRandom(); + try { + rng.nextUint8(); + fail('expected StateError from uninitialized FixedSecureRandom'); + } on StateError catch (e) { + expect(e.message, 'fixed secure random has no values'); + } + }); + + test('Seed Exhaustion', () { + final rng = FixedSecureRandom(); + rng.seed(KeyParameter(Uint8List.fromList([1, 2]))); + try { + expect(rng.nextUint8(), 1); + expect(rng.nextUint8(), 2); + rng.nextUint8(); + fail('expected StateError from running out of entropy'); + } on StateError catch (e) { + expect(e.message, 'fixed secure random unexpectedly exhausted'); + } + }); + }); +} diff --git a/pointycastle/test/random/fortuna_random_test.dart b/pointycastle/test/random/fortuna_random_test.dart new file mode 100644 index 0000000..59edd89 --- /dev/null +++ b/pointycastle/test/random/fortuna_random_test.dart @@ -0,0 +1,64 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import 'package:test/test.dart'; + +void main() { + group('Fortuna:', () { + final rnd = SecureRandom('Fortuna'); + + test(rnd.algorithmName, () { + final key = Uint8List(32); + final keyParam = KeyParameter(key); + + rnd.seed(keyParam); + + final firstExpected = [ + 83, + 15, + 138, + 251, + 199, + 69, + 54, + 185, + 169, + 99, + 180, + 241, + 196, + 203, + 115, + 139, + 206 + ]; + var firstBytes = rnd.nextBytes(17); + expect(firstBytes, firstExpected); + + final lastExpected = [ + 227, + 7, + 53, + 32, + 144, + 169, + 73, + 217, + 239, + 226, + 233, + 123, + 220, + 80, + 210, + 0, + 229 + ]; + var lastBytes = rnd.nextBytes(17); + expect(lastBytes, lastExpected); + }); + }); +} diff --git a/pointycastle/test/signers/ecdsa_signer_test.dart b/pointycastle/test/signers/ecdsa_signer_test.dart new file mode 100644 index 0000000..3a4a336 --- /dev/null +++ b/pointycastle/test/signers/ecdsa_signer_test.dart @@ -0,0 +1,71 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/signers/ecdsa_signer.dart'; + +import '../test/runners/signer.dart'; +import '../test/src/null_secure_random.dart'; + +void main() { + var eccDomain = ECDomainParameters('prime192v1'); + + // ignore_for_file: non_constant_identifier_names + var Qx = BigInt.parse( + '1498602238651628509310686451034731914387602356706565103527'); + var Qy = BigInt.parse( + '6264116558863692852155702059476882343593676720209154057133'); + var Q = eccDomain.curve.createPoint(Qx, Qy); + PublicKeyParameter verifyParams() => + PublicKeyParameter(ECPublicKey(Q, eccDomain)); + + var d = BigInt.parse( + '3062713166230336928689662410859599564103408831862304472446'); + var privParams = PrivateKeyParameter(ECPrivateKey(d, eccDomain)); + ParametersWithRandom> signParams() => + ParametersWithRandom(privParams, NullSecureRandom()); + + runSignerTests(Signer('SHA-1/ECDSA'), signParams, verifyParams, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + _newSignature('4165461920577864743570110591887661239883413257826890841803', + '4192466672819485121438972302615731758021595554374647962056'), + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + _newSignature('4165461920577864743570110591887661239883413257826890841803', + '4124624969901653266585887193504647035526068719224431686679'), + ]); + + runSignerTests(Signer('SHA-1/DET-ECDSA'), signParams, verifyParams, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + _newSignature('6052012072724008730564193612572794050491696411960275629627', + '2161019278549597185578307509265728228343111084484752661213'), + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + _newSignature('4087581495017442027693712553398765118791696551913571321320', + '4593990646726045634082084213208629584972116888758459298644'), + ]); + + runSignerTests( + NormalizedECDSASigner(Signer('SHA-1/DET-ECDSA') as ECDSASigner), + signParams, + verifyParams, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + _newSignature('6052012072724008730564193612572794050491696411960275629627', + '2161019278549597185578307509265728228343111084484752661213'), + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + _newSignature('4087581495017442027693712553398765118791696551913571321320', + '1683111088660635129753705209967429428795077884424382985437'), + ]); + + runSignerTestsFail( + NormalizedECDSASigner(Signer('SHA-1/DET-ECDSA') as ECDSASigner, + enforceNormalized: true), + signParams, + verifyParams, + [ + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + _newSignature( + '4087581495017442027693712553398765118791696551913571321320', + '4593990646726045634082084213208629584972116888758459298644'), + ]); +} + +ECSignature _newSignature(String r, String s) => + ECSignature(BigInt.parse(r), BigInt.parse(s)); diff --git a/pointycastle/test/signers/ecdsa_vec.dart b/pointycastle/test/signers/ecdsa_vec.dart new file mode 100644 index 0000000..3c1547e --- /dev/null +++ b/pointycastle/test/signers/ecdsa_vec.dart @@ -0,0 +1,4147 @@ +import 'dart:convert'; + +/// ECDSA Test vectors for signature generation and verification. +/// Adapted from a passing submission to ACVP. + +dynamic sigVerVec = jsonDecode(''' +[ + { + + }, + { + "testGroups": [ + { + "tgId": 1, + "hashAlg": "SHA2-224", + "curve": "P-192", + "tests": [ + { + "tcId": 1, + "qx": "3FCBF35462311E8295F34526E813E8C8880F2406F2918EF5", + "qy": "CC49D0A3A971AEB8D97086FEA4F5B822D6274B1BA159760C", + "r": "A013D16FD7461F25889140A10BF99D41614C4532859646D7", + "s": "D2516534735A60016C652F1BC066E50037E2DBC22335C51B", + "message": "FB18292F029A386377E370B45597C1424E74F0C0D9E24673920BDF794C444E9D3D1A4EE3C12271A3E6C8A0CD620DAD5A7D3CAC48B73A2F49FCEB51733D1F2C17B1D3C203F23E7EFABCA7FA092B435FE47E1D98795CFF70FF1D4022401D2E4BE0D1CB10C1F22C7716B5084727394D891E2B6FA18900FDE3C194B42F6955340204", + "testPassed": false + }, + { + "tcId": 2, + "qx": "7CCCA806119D2C567545A84A6308754EB2F5B34E8A2B4659", + "qy": "CA11C2BA80E2EA7440C94B574D9EA7193B7FA88B90A77B83", + "r": "91C695F66A421F85C343B73AE13AEA3E2E46770784300AB8", + "s": "39FD630515409142C94D17C5A73FC8296378F6FD9B3263AA", + "message": "27DEE158CC2FA093C25F6B02628A36001463A0E43B4275F2E31D98DB292E62E37E18761BBA4838CD173567B11D3E0FD13C530EC20D665F9DF99BA104FCB7C929108940725C73542226AE4A9ADF6F8E84229593F258736CBF8AD28E0F6B5E7B61D04720ABC23267D04667357A25EA7087AB0C6378199971313403A4C3439B8A5B", + "testPassed": true + }, + { + "tcId": 3, + "qx": "3A7E0B8BD695841359204BAEA9857A11E725686F9092077E", + "qy": "3BA660DD83B66DE8DCF2AE8B0FE6118632BD9F2053D75388", + "r": "44F310D446E6C9B08FA42CA79F65B7C2495495B646C679DD", + "s": "9AC38A0828C05E9D5BDDF701537238027BED2D6C7BB0CE96", + "message": "8C270E168607248D02B0CF7A3ED44EEEAF574C1241DEEF4593935737EA3CACCB31C7A6727A0F2E2FF44A87B3A9C34743FDBBCFEB37A682339A8925B43618D88963793E85174CAA7E4284B9C31189CEB8478E50C2C61045704CBEBF258E71B3AD0E993C787C8ED14E7E95FC7C17CFF159AEB325EAC6E622A0F1BA14E99A28143E", + "testPassed": false + }, + { + "tcId": 4, + "qx": "7E103166C7241CD7A4EC6816CB02C5F7FD992293D5C9D98E", + "qy": "07C014105250CDF28CB0CE3E7DDD8F533736EED4386E8D25", + "r": "531AFFFB0A1F91F743165A002CF221A0A10A69E842A02F50", + "s": "498F41375B424E94E509CD18A91E495ECA0E9E56384FA718", + "message": "EF45B1EF1CEB2C3FEB3D4D66611F3BAFB5024DCAE095D08A1FF4A71BE8B544A33185DBDF250CA91C20E96F19804A73D74D900C78212A7DCA24D6FCC5084C295A56CDB0D4F6883FC27B6EF45D60F4601BBAB06711109A71E159D16865CE258B1447CF0DE1662D87B5A21D13920CD69C8C3BCBEB9361712A63AE16027E3EE2DF8E", + "testPassed": false + }, + { + "tcId": 5, + "qx": "3CB3672E556786EAFB8F2B0DC520F726A949E5EF8486C2F9", + "qy": "8B56292731305A792BC57702D7805CB704B7B41CC20F3D45", + "r": "4BCC268D4F111DCE11981F6DF9855766C5529BE1400FB368", + "s": "C3F3DA7B4842FED235DBA8B1CDE6AF9FCADE532C391E645D", + "message": "F7277845979601A8EB89632EA74B8ACB71EDB38D0828CDD97C60B50315737BE09DE220455712B53A0DE485D021CCD20C22E6F69B34ECF7176CD0574DD10F8C705A84FB7A57ADB16889E77AFF3F3AA9D4AD8613A2E3D664985C77F3097B3E2287E3C40BCBA180933688DA729885538F60D9D38CF4977034664F9CFAEBE43A42FB", + "testPassed": false + }, + { + "tcId": 6, + "qx": "85502E8955DC7305D5A3CD6C4E7FCFF06C5878C63E964087", + "qy": "3DF4B456A7D2E0A66881DBA6B90BC6B68BAD7AACD97092E6", + "r": "39F6AD182AB6D9266ABDA1D2762FCCE7117595E2CE05FD79", + "s": "F563F96EA307A20C91FA4EA549A0FA43BB639BD458A8B797", + "message": "9D3841E701E9D32DAA4F5D269F816507D0658769BA8F5DAF1987484FCD0F097AE12F2ED679075E2C52AEAEE7F36134EFC9EA6AD4166D60CC0FBBEE601526DC59365087D3702FF23B399ED71B5B6C6B08E75E75AA6940CB69029F056B4298CA2AC90A535E691B4D3F94D414E2D6636B142631F8E050A6638AAFF0EFBE6E860F4E", + "testPassed": false + }, + { + "tcId": 7, + "qx": "2371B084CF29CEB716143BD35DAB571711B362CE56298A8D", + "qy": "F06704031A3E9F8ED5BB6A2D07238B9B939C566ACC82EF27", + "r": "E13FCAA85AD1623745FA0F7AE8250B4B15C155C477FC4D7A", + "s": "4FA48CE0512AE186F378F674D3363E9C4B32D6F36E66DB6C", + "message": "F58E74D3F20868463E264607D429E8C9E1BC541599136BBF24C604E52CB1AA3823978B1F27A710A52085B52213F022BFBFD77806CC4D9D80AE9B7B02AE89CCF4485AF8F7E9A8A159C220633794195B9FC9B26EF8A5F2931B8F74C7C801D3C683BC493B6F90EB722ED01DF95F692CF576647CD6740C893D84C988E25CD67177BC", + "testPassed": true + }, + { + "tcId": 8, + "qx": "3ECE35B7E12E22FBE16199503BDEB20A2618D9E0CF04128D", + "qy": "4ACC6C2897C6EE83DB6250DF701706E57559A019B6FBEDF9", + "r": "C8791C7341B400DBF03E406BF81B946A290ACD804F445073", + "s": "D369EF00F4E773B0B209BC3574A1502EBFDFC9E1625E8806", + "message": "DC7F0D3A1277F984F4CDC7C41E215F9687177199DC1F81BE4CA9C924430835147A90BF144668F2F0623327639C12FE0F87285B7ACB68A09B9453A304675CB71C3063D61C30E6BFE2923C017DBB1511EFAE3180FA24667750ADF0FB054A842D64B0E379AE02AC4008237FE143B94D8C8F58ED8895C067FFAA11D8C971EFE26274", + "testPassed": false + }, + { + "tcId": 9, + "qx": "BD6CB3B73D331CD1A64065A5352375D0B86FE4B09C4EE1E2", + "qy": "B6E2AE4602F89EF09D5723E81666A0B87F1740C6BE7C30D7", + "r": "0DD93BE947D38AC9D2E13B88BA8DAB07E8969779604E3EA7", + "s": "36EEE24E2507871E910D4F26B1361BD48FF7F2A78D9D90CF", + "message": "00F165D27ACC006CAAC188052EBBF66D418299B5417805B440EE02F1E44A3A09521E23D01BBC05359EF8230A2E9737DE19AF60B013191F23C1808F7F019E65CECCB69D669A101DA132ACCF609BC735D06D038F491807C0F085BDE0385E38E16D59BFD16367A5E2A9F979B7D409A4E0A2B9EDB8E20BBE8D9D1A050B7CB9161BEA", + "testPassed": false + }, + { + "tcId": 10, + "qx": "85DDD9FB43B71E8B48488539B75D0CE4241BB2F532F0023B", + "qy": "2C3DF1492373603ECB4E41DF83253C348366CDEF1DD89914", + "r": "9E817E22D74AD359D02F477E4905CF661FC13F356823C0DE", + "s": "BA483C7AAA80BA2246C486737AD9BC5C3C986BEE667A160A", + "message": "87B6405EBE092EAFC0B8F8ADC3928DA9D47943A0F555102813E8D9C5B8BEF90B9D8BCE3A6721BD4A13472F70D3D66ABD6CE13A06FD59B456F0A87F7B5441F6EF28CC842D50F98A0F8040F9A9AC01D093642D07AEAE21D721B91F34F1313D8B0DF1DB71A36ACEEB7490E928D47B6D752499B1B9E04EE7CA996FEEFC3B6D1AF9A8", + "testPassed": false + }, + { + "tcId": 11, + "qx": "C71AA0D094EF8D9959469C1F930F6058691A6D03F2EA188B", + "qy": "3ECAF37F737AB68995DF5CE9149042746A315242805ECA9E", + "r": "195A2E87F4BDE6147CFEF4A21A847343FCC8D7C83D6AAF38", + "s": "B679951447DA088F4766E14441634C40D28F34D82F1F076A", + "message": "D576281CD3D37B977625CCBAA46C84E73215D8155CA41EF9F050F348397B672469CC2E3C0C78F7C049242974ADABC7740D6FE7209DB5C904B23495CA93C5BBA09979666CE09257193575CA25A9D12E851A870DF51B019ED0380FCE64922C36144AD345DC31E2FB1B6403213B860113819927F7CAD90573DF56984EDCADBC1C57", + "testPassed": false + }, + { + "tcId": 12, + "qx": "00681E47AA6775C359EC40836AB15DEAFF3156023F33AA20", + "qy": "6A66607C8419D65134A4B270320632B007A0BEBD75BFF116", + "r": "DD4EC22716412256FD0F0B3AEE35F544DEAE9E46A805EEFB", + "s": "9E2EE66E2CCC4321FE79BD23564AC5F688F04C60265BE868", + "message": "69CB9BDDBE588069C4A7D81F2E2AB89532CFE5858AB53D5E454CA651AC1EF2CCE006155F2A35A4831BA58D3A80BE4E2976B1EB5B17D2B77F2AC61263DB9C0F52E259DD7C542F471E2BFC584134682457AF82EEBC71D525BE83698E7253D08074E7C2A3A416FEAC646D5C313D903AE8B93865335C10F61485FDF37B0093B57B5D", + "testPassed": true + }, + { + "tcId": 13, + "qx": "E8B1184A9E73829BEFE546E6E5889D7A0C8CE55414B02166", + "qy": "FC80FA253A63A0A566E72CADCC46E88B7774C7E799390BCC", + "r": "3B675740949CC0319EE91D43F7D435AB5759426C9D040822", + "s": "531BCA28B3CBBC972E190FEECB0E0AE1AD18DFB5D44EA6EF", + "message": "DCB4DA684E5CECB7DABC0B8E4C308656D7B092EACA8586535F42859436DD98F5D68A62349D4A3A79FF14B081E45AD69CFD991DDA98BC0A3FE878B288D5EBCC8B3EF0E823CD84EFF48B2BA6D4C56FCC12CB5B7F0368D7E5BFAD30B88D3FC5A4A5E975F1B06DA1F87D9C86B27E7CB86FA105F24E7A91B60030A155C5C5018B7B3D", + "testPassed": false + }, + { + "tcId": 14, + "qx": "387C17F4EABD91D4DAB0C18E50964C02794C430C14AC383D", + "qy": "3331F0541A0793D0068784745E0CE83D181859202E67EE58", + "r": "E51CD6E8652CE8989BF3DFF8A0575B038CA76AB5CD17C8E4", + "s": "B05142E4656E0B7EAB913104FF3AA647DFA496A97ABD8DE7", + "message": "F9427C69A9E654660070E7030E6F82EBB753768AF39220D9EF8A8C7C6A6AE3751AA84ACE31AFD7AD079AE17F8C811C68B5E0EE3F909DAC4410AE1980935B00E1EF73852AD738CBA69207289FD63087090A20D86B4CD3E89FD32206FC5669B42F3AB8AF138A27888E4B3B12793D7F6616AA70EA488B3A9A9F870F5160C616E1A5", + "testPassed": false + }, + { + "tcId": 15, + "qx": "226C8DDFB354BD2725C4D4C24357B004126C121FAC072483", + "qy": "44201CA5CDEDC5A5398674A7A63BCD83F858B3F5E38FF2FD", + "r": "1E210753783A90467A5ABF098350D14392466711CF260864", + "s": "2B7E4FBBD83863B462881C7C472CDB8FEC52990241DE4CD5", + "message": "E294412EDEF130465018F55B396EE04E54DED45D35CE8AD348B158747BB932CCB81D22C5BCF4F65C7E88EE837BAAB1EB3DDE2CBAB79C060459FE23D44EAECE3F9C7006EB5A1D2C80998BF93BD3E3D16B86A7224AF8CF3DBE097CE3E97590E878C4C1674D16389260282489F45B0F813DE898653626930003BE1C23ED7D55A523", + "testPassed": false + } + ] + }, + { + "tgId": 2, + "hashAlg": "SHA2-256", + "curve": "P-192", + "tests": [ + { + "tcId": 16, + "qx": "ADE76B5890525E8486A86713719BDD0F9333745D93EFC115", + "qy": "93DDB3832AEDE80EE60C72C84AE3EAA5C112084E92CF9270", + "r": "8951F821DBC1502D659974D0584BA239FEBC00C77F07B877", + "s": "B6B7053AE90DA4A641CFA62781BB787B124F7B0A43BF2585", + "message": "6D33D2D93F657B10FD3B4DB3BAC0253B36F12929869FFCAE522E95E4DA0C751EFB334FF95044FBE460333A10275F13F05FA0B84FE188F9BC2D231D3A49DC44384B7412CDB085DBEE410BB27F5C29D16F69DFC01F44C1930E01FF7F2B333CEF12B39739F8CE7DCF20BFFD107496FABCAC4E507739EEF7CF856DE14A7FA59AEB52", + "testPassed": false + }, + { + "tcId": 17, + "qx": "89C2B7B25CED68E9CBF832A07DB27E822F7725893DEA067B", + "qy": "05A0A70EBD5C2C83C9B6B6A4EA1907A9C5AD8B6522DE5F9A", + "r": "594C124D2E77CD35C5D7329FE2BC1B31652D0E56DA79FE3A", + "s": "B5D906E24745A2D0805082950DFCE24B314E885B87F14634", + "message": "911C8290026826F813A3373E190DE9612F19D9767B4452E4785D91E9A2B4373E0CE149AA71C369B02D6B3232E83898CE72EA19E2FBF664DBC7F3546B18536445D61F76B2DB5C4C48FCD56CDF1F19D8CCC9A93D07FA0D5E83932507BD0C66859A4B524CC0046178B0F113F05A7AF700CEB160D29EEEB09723E07B13530C3E5BEC", + "testPassed": false + }, + { + "tcId": 18, + "qx": "49786B8B40AE2E77C05F262A9A813398C294AD10D7772DA8", + "qy": "6F94DE1701AB5213887555EA0D97590278A09BAF122B4974", + "r": "49BDA4E1577C283B93CE857F21342761E10F32FF8B16B7E7", + "s": "415902E73BB16EFC158237A53A17884B585DA5C599B25012", + "message": "F782C2979FFC84C3EB2BE84AF2A12E65E17D349A7134F37D44ED7103333D73C838DAAC7EFA7696238A3F85690F2824ECF44D6DA145F484A401BC0D351F0E027194F873168D23B34E1E7A8EF5D8F43A5123911236AE08C0ABF13AA1ADC5B59D19345D5D4A7A477D07841BA906A075DEA26AD3EBBD2837CFF242ED5E0B2A376AC8", + "testPassed": false + }, + { + "tcId": 19, + "qx": "CF213B20A9A49835BB7AA066BC973A67559AD5584038829C", + "qy": "A2E5F0F85514FF5E783967BE7C38D140464F22CA01A8B8D2", + "r": "1074EF908DA9BC92CCEF109605245BFE1605C001B3CC9130", + "s": "767E1CF9EA41FCCE91891A86A14E23DEED2F9E55243BA52B", + "message": "C21117F71EE9A4F7B9CA4E534A51E9E27B730F9D24A636C0DABFEE8BCC16D6B7BA6CCE0357C5C9F427D6AD848A74C3F76D10996E59AF0E90146FBDE7DDCCCD674FD9C80E4856F314E1694D33374A2F98A7CB579A7E2590827B165A4ADAAA5D7509E4CFBA0C6AC2C5AB1793EA328AA76EBA98923A41D74C1F93D5790B1C9E2C74", + "testPassed": false + }, + { + "tcId": 20, + "qx": "FF0BB9CA152D9897D8B0821ED7E104B45B4CFE1518F710DC", + "qy": "69A4A9591CCCEB2093AB72C8D764D96AFFA8ECE1E272BD97", + "r": "4C5E6F2D47EDAEEB63B0B379173A2AEFC1CC5D3E0FD9E016", + "s": "80A79DF27812912FA189B1C3B4B0072114266BAE214B2070", + "message": "2DF25EC61FD136D2BFA508839E06706584FE0CC29D2EB7F4B4E5E279208CF367284C8E30DCFB8AAC937FFD3A8D0CE7DCC50F0E0F701D30BB233AC2AA7ECA52BCDF959086E33674920E7DDFCDE9DA2E769061437348D3FDB8D37166518E9829734DE614BC83773D098256E26DD5032C8A8B5142A73EA0A3F45213FD213FF7E9F1", + "testPassed": false + }, + { + "tcId": 21, + "qx": "E128FDA20A30CA83A9676D77AA5148F7F4B0B35EE4C6A1DF", + "qy": "6B852B18C48E8BE682A75E19B272B9A49728000A89707E8B", + "r": "5E8E1FE1443A4BEA2BB89804947E017852044A72339A4876", + "s": "BAC4BD37D4665190C439520FF264AFDAD25CB7FC77F10F1B", + "message": "3FE9F81CF8EB449AAB68DAB633FCC13EDFB0E5BB555DA1888E164A3D6C85D2FB42B1F48D0422C2BA84735633E890524EFC2336EDADA0553476FC3FBBA5C90E019BC346864BBE61169D935CAB911785CDD1F0067A876EBF89373F4B6539604EE11EE74B6D5D243E039EBE5B6C298D74C262781BF4AA2CE9E630A4AB89C100D4F9", + "testPassed": false + }, + { + "tcId": 22, + "qx": "18FC654565FE22378F935F25FC29B90CED3EE07BA9EAF378", + "qy": "51DC41C55D099073C7ABC367DB6145616BFE832E345F0BB4", + "r": "DA9D780C29E1261039CB978EF31C5B6E5E808C9E389C378C", + "s": "AE3A0DD4D01E71314D6039A937C0C073FA3450F9C3FA5694", + "message": "D6025733FFFFB37E6CEF09B64E12C7C60FA6BE0D1C3D8C98BAB8EAF44EFC6F73EEDD4F5085F8DDDD6D675A24BB146857E11EB8B38F9B402552DD2BDCDD20E5C714C4CBB66AA9E4C75A4EA85C62DF75E694C71534C38338B993B9FA6AC0372B15C4BD0431FBFD1FF7537C36C854D4DF4D47EC130936AA8418F5C6B389A1374490", + "testPassed": false + }, + { + "tcId": 23, + "qx": "939FFA17538EC5114A5D00C25E7002C507096749C0B89132", + "qy": "15BEDA8491C516D2A589B319F3E5A3D0F7CF07C1416BD2A6", + "r": "134D1F2D8CCBD2161A44F940943A309AFC1EE630D678F44F", + "s": "8BC894214181A2AB14ED93E0B43F80317306DC0B758ED8B0", + "message": "6DD65F315EFB257C63F2EAD030FA7DA3B5BE71276F5ECF2E63CADBBEA9940C0CB78F3619A846E58E6C830B95FEB0FBE2BAC975C0EC7500A3F00777438A91006E87E8812CDD386D2B7F5E9C6F02BF35DB0E664FA90294F538BC1352157264EC09F20D55348B0A490A737854E1AEBCB7421DEAA7779AF37CDC1D0C362642E1A4D3", + "testPassed": false + }, + { + "tcId": 24, + "qx": "19BA2D8F73B061815C779E2231F332E15DBE0EF98BF22A72", + "qy": "B70EA176C838DDD78DC31E44D1794D78A324352F83CD7AFA", + "r": "484B90D538279546C9A0CEE3A036056F56758358032ECE26", + "s": "4A57DCC8628C02A0CEB0F790AB7BB29470F0618EF953E7BB", + "message": "C6F0EC41D721906EDD45CB920B061F913AA8A4FE1C94C2EC94680B6E3721C2EF040C9189354E1DB12218588448F3304401B9172265602B577A218FF5D3B38735CA14863C4A214A51CB095E48EB3C0D245DDE21BE578C038A48DBAA7F9FE9BA816043C156188E2323786EAF68EB743324A12FDE8D34E7798B6A9ECA6D44C2BF7A", + "testPassed": false + }, + { + "tcId": 25, + "qx": "203FC8AD6998CFF4770D21A7F6D38EA4AE365EFC489471AB", + "qy": "C1A8DE815FFDA98E7D8042AE5B641693BA62D90710ABC9AB", + "r": "EAC0A9B06B7816A9C07AFEE8956DC35B09699156F8FBCDDF", + "s": "B42AA0B68AC1F6C2BC89461F5507D40258C11C55E4649E05", + "message": "B610DB1F4C3858E24AA578FE5C5FDCA64BE8B425C05BBA2EC3F0E8D8A0B9D95375F46879E5F50433D6512CD8294DB97D2437BA08EA2D491F89C115516B2E33767DA24C16DC00DD05F19F53097A43EFD9425307D43056F6C10A4579C3FBF5D2295BA71B1926FBD12B0CEA5FE1EF5364038411473D588E1D99BC7212AD2CEAF050", + "testPassed": false + }, + { + "tcId": 26, + "qx": "63358016CC65096B53FE6F840407934F4921B7F02D4A5059", + "qy": "A7D6EA6A315CF0A234BBA6D00D2BF25E8B98B61D4C01ABC8", + "r": "872EED1946A1971445D922A284EC7458DFB28CCBDAABAFB9", + "s": "5E5D2F3A3355664F5542918A2194DAEC8FF9AA2BA5CF9ACD", + "message": "406B22145088653B766720A3494C0B3957757EC7FAB7C7785DEC47206139E2101F256052CC9ACCFEF472E4D8D39032401C5F1DE1BF5ABCA0BEEEAF1D865AAD5A3FF3337C8C289875573D21B65885670C09CE7A0F93220353A2ED7B650F233C16293C5E3B9D3B0E976EB104C3AD5E8D3953BF40C370D6979E2ED1B79BBF07265B", + "testPassed": true + }, + { + "tcId": 27, + "qx": "A128F6CE92F5CB68D6CB5D3577022B0A11DC85BC9B2621B2", + "qy": "A2B968F761396BFD6C9A397A300FC2A1D990546D6D1E8A4F", + "r": "DEC8F2C02140168951225DC3B8163267DC412A248196FF79", + "s": "827559130C8DB98B62473AB2517BDF7F6EC93486695B469B", + "message": "F9802C2CC1CA05079789204400B445C61CE69389A6BBCE5FF36E44E61414F959363568D01A4C219A1E056805B773EEB6D59A10BD9D4FDE62504678E264230DFF8FD8B8EF6B1B602CA330D9851D1EA66C51A80A21148931EE24D4EB7B78C5CAF78B86245DE0405FDFBC2447CF3E03363BC1F1A72F1B9886B435982FCAFA1C51EA", + "testPassed": true + }, + { + "tcId": 28, + "qx": "E00FED33143C461F1FA31DB447C5E9745512721375C0B7E2", + "qy": "F53A44BEC5235534BAD1D404A41720B71BFC1D2E46759E02", + "r": "B159F247EF51BA6AFEFC23F6C11FD2DC628BB9E97775E463", + "s": "0A39390B8333183F64260112B44B9E72974BF1752BC4F5F3", + "message": "5268BF52D22A0CA2B9595486C2D19240009A8845ED0EAAB33275DAC1669597639ABFF7B085B81DBB4BA22289F5B327C82B40D5E33FEA414A18450BEFE55845DBE2493AEA99BD80D57DC7302E58C2F83D64C019AB7079ACD4A9916D068E9A837CD17A4BEDF18C8844EB465DECBFEADB864B998969D416562E362B7622026C1CDA", + "testPassed": false + }, + { + "tcId": 29, + "qx": "D1257B2AB29810AA2BA7B4A80382EAEE3D5BC16C492D0A2D", + "qy": "E3D5B1E7BAFAFC352EC32BD134E79FF7082C097A6FD77334", + "r": "0F077C2799BC6734E58E419E67725330D4534F3C99138AAD", + "s": "DA9F51C3AEA7A32C1726DDB7AE29790A80AFBA4C30A6469E", + "message": "853081E1E69DD54B67EAD35820BA5F39850556983A244078CD7DEA4F0CB6DECE54D60CAAD7651BB48B3898B66035ACF5354D0AFE93AD1292DA594602516184FFA1348ECDB095878F04EA464DB61BD2147F3BB090B67F02E3A4BD3F5FF5209ED2864ED133492C31E6DEC17E9690B6501AB83C22EF330A4E7267D7FAE17B655082", + "testPassed": false + }, + { + "tcId": 30, + "qx": "1E39E5F7A339436F66A8CA660F6923BBD373B7BD2F12680E", + "qy": "0E9E1EBECB982EF2E58A906DC058ED3B248B5A454E256462", + "r": "D22D7AF67D29C8801CC9420FFEC6464253E090F4E17C0C6D", + "s": "7785E96798CAA07A9E476332B6B9EBE45D84FC9903DAF6A1", + "message": "120560DCB09E07E15E9D1FB538F56446983ED4F12B3C9B29FE2CB902AC29168593115F3D3E51EE1E86A1AFBB5E4627C441933FB654035D71429E2D9FBC8D820D597DFB5FB9A6DAD7F428F588AEDEC72CCB768F2E376F038F7018E31829E2477B295E992672F23BD1C276255793CD8A25B756820308AB6BF2A46E52F4779C4E1A", + "testPassed": true + } + ] + }, + { + "tgId": 3, + "hashAlg": "SHA2-384", + "curve": "P-192", + "tests": [ + { + "tcId": 31, + "qx": "B396C36A42C38F65F55C0B0FFCC9B9EE0E8AFA5EE32F4B79", + "qy": "744D460F8994075D77D7AA4C298D3E004DDC39442A39F6E2", + "r": "F1EDEEE6D6AFBC16C6BEF453A1AA5C1A103A0CA78E4521BD", + "s": "08FF16CAB9E45BFCE4C9CD80534AF5B2701BE4FA5937DFD8", + "message": "68B20446845E06BCB46738F6C39BC70A6D81056CDCBB315C2FCFFBF19796ACF4A58AF51C23727FFF89ED84E58F514E8C4BD04EC19E0D4F5ECF28B8045D8FAA394CC848112712DBBC42A4792B1A0184E7D3598041D0F8BCED9C1D2FFF2EC2A402199FE6143821E5CC121FBA5BFAEB7BFF27E7C60292C3D833DC80330DDFEEDBFC", + "testPassed": false + }, + { + "tcId": 32, + "qx": "E2BB3996311F13C2FF9AD409DF8CEE82B954469064477C04", + "qy": "0EEEA64E226A81F9AB256818780B7C8122A4F71F74CEB242", + "r": "E77F445D960884936C7D63A1BD91D4A301DC04BDA1E28D3C", + "s": "9AC23BFD3FAEE767B43DD19AD79D88DF014B2E9D6E62F98F", + "message": "BEEDB68EDCE6243B77D4FC5667EA15C182A8AAA64893E12A7AD58CE987AFA09645E353D55419C4493343C6F8F9C649060D90109064ABAD12C30BA8A130577F3ECCF61DB1F1235293380E51F5A5A5352377BC4006ED6C8D629445F8A7ADFD5884396C9D2FE9C1C34E97FEFCF10D4157BCB3559E88DCB8AA6A250672B571E99234", + "testPassed": false + }, + { + "tcId": 33, + "qx": "77846B98F93CB12076AD852C6643F8AD9732EA8D6BD869F5", + "qy": "735C6B766F717321C106555870FE26C2FBD0531AA1335BF9", + "r": "92F2D84D9D47E0C93C33C61ABADEB19FE42EF522C099FDC7", + "s": "B392FBC4A1F6AE313A1AB4DDEABB62C65BD80022687759F8", + "message": "39E87C1C215CBDE3DEFEB2855B23B1FF692127CE2DBA5C63DEC401D3E18A6220E28C60423A51DA5F3460166D5AF24AFFC75D8AF6D55DE99A2AB66EFCBBF243F46B0D77A622785CF318FD2C1754871A4CC1BDC6257FCE2E593283BA9645F35C61776BF4753F0BBC8D8309C403B71C1EE54DB3EF1853BB5F6082B7B2DE05E0FDDC", + "testPassed": false + }, + { + "tcId": 34, + "qx": "01E49DCFB828C7D30837ACEE44A6097A8533A9EBEA05A41B", + "qy": "7B4D22B9AFBF042A371280EA13134FD08263FB4CAE1F7183", + "r": "605E957BC6530B594AD3B9D6E601CFD06CD7182C448E2548", + "s": "F01F541D4E60CD0E2E7A28C1E4394EF990D010108A5F6184", + "message": "EF80239F5E0B91ED51BACEA9159667F5391489002C776D42F4724DA6DE0476C085A43AEC3CE46F2EBC241DD7F7C574B94B14B95C380982296C6083CE3A4E126E91C56F8A4FB209F371C109AFA1D9A3784087F4F0720886F42F8A9F46D8E1F0C6D4BEB09A3EB54140042C64BEFEB2B40BA75BAF2A14E62D4260AD4091F30E20D6", + "testPassed": false + }, + { + "tcId": 35, + "qx": "A618610ECB392D41D6A8C7123619B252989E59E738547EFD", + "qy": "657C25DAA278B9AC5F5131986A96C0C0CF779DFBFB610C33", + "r": "EFD5F43462754F853346B4FA5F0539947A71CE668C77EAC1", + "s": "AADC99AA048220319B8ABCE11F4401AD09398FF268C09333", + "message": "D57B8A054E918CAABA1FEC7F71713638562DFF0A95192C86AD28529414E854197586E1A8FE095DDE5DFFC6801F80B37634EA90132EAECEB724880FAB6FE9A980A00BFF24E86B22E7402EB864D1500FBDD4C17DBE69F42474ABCA1421F09D0C156398D12E3D8738B2A9FA085222798138AA00497BFF0D1871393CAC201ECBE148", + "testPassed": false + }, + { + "tcId": 36, + "qx": "58354F5162D509AA181CBC8B986983A80B77332115740BC8", + "qy": "CC1C85456034EBF7B4FD7119DDD04012FF37691C7E9F28E6", + "r": "29B8DC72446F37CC5A5E2BE9A8FA1915A74C7BBCDB697DEE", + "s": "287E3579EE62C2726372D091C35BC694660811BC1485341B", + "message": "25184B59BB1ED2E2DB0DD76EF16AAFFB53F9BC21E73897C4C7D1EA29D46FBE9A9E9AEAD5B7DF4030B86562EBD051A44659D1D3B2011C1B10ED0239FB4E8A473DF9A7C096B009CD26ABBD3E034985C600CD39B41CADB8415E309BDE8406EBEEF768AB71965272800DEE806A437B4BABCB863FE73C81B0E96A3D12083017BBA615", + "testPassed": false + }, + { + "tcId": 37, + "qx": "F0AD04EAEB0001BDDAEF56B9E89D3B2D6333D717720DD94E", + "qy": "5CAB78150BFA341EB0A4B4145E7841A9E39DD6B1CA52019E", + "r": "A028E446BF30E7C2C41A885688354F12B3CC67DE81BA8351", + "s": "EA0D9AC658011D6A9B93723983A3A1A62055387E6562CF09", + "message": "E95896F4B99C03961B37D7C727EAD4266637C1C418881028AB702C2AF6D720A56CF6B3371045C3CA1B88EADD1E94C346D8C4001052F4DB9C8FA63A7D661E1F0515F65CEB31ACEB664713B8F3259FCEE5ED924916DD359BC8E1E4E3FBAC0BDDD47C0F7DEC7AB1D921DBDD46EDBDBD8173A2E68843F39B1492E2D69C0ACDC6438D", + "testPassed": false + }, + { + "tcId": 38, + "qx": "0BDE1D233C2DB1BCADEC4D9F407D32DC6E552A1B1B6B7BF7", + "qy": "9CAE6A9A40E50607DBAF8D7E4BEF0BE289D81B8E0812ACE4", + "r": "B4D9D62161D0D43337BFB19EB196ED8DADCD65AE97B51DA7", + "s": "F43F331CC17E4DF43A4A0D8DEF22D4DC63B717DCC607FDCE", + "message": "82D92CF2626F1FC9349DCA6696897EE777CA9BCCAC6091D77F0B9B0A7B27A5113BEDAC92BD16095D41499D2906AD3329A787DCB265E08A2E6CE9086BCD6013D2C7D014CAB3266F547C00AD378EFDC18777696B8FF96CE250B85FB92C6A865EEE812C27C735AB931217D61F4731428E251673F22B4F94FFEF9849754639862A9C", + "testPassed": true + }, + { + "tcId": 39, + "qx": "6CA7B6CC06FEB62707BD904C6B568616F982D520E0C82ACA", + "qy": "BBDCFAF106A879BBB6AA3BA01A3F4741E543A0FA541506EF", + "r": "7DA317F1812C1D51A499AE23427BD53A4B9C74425EBF22F5", + "s": "272B7CBCCC7B43662B5D28B40B1C6AAF0BB616AE03875AF1", + "message": "63080318AE030D12119BA797CF45BC8AF3D89D91F4D9E8606ADDFEE98635531BEEDFBBA25905CB1789241CE48D7FEE3EC56142AACF144D1FAB5D1D791B97362D803517BE8482EC35826CA641F993BD88571981BC63D451059E4025463B4D842F6615784B084658471EA57E2119EB60D0A458C79FC79D43F9811F05DCCA0BDB01", + "testPassed": false + }, + { + "tcId": 40, + "qx": "0614EB9CA874401030B4B720817A688D8637B5DAA7D77DA9", + "qy": "8BF0C4AB603640E96758E2F44011BC857384C3E989128022", + "r": "46019001DB25AA7CCDA7AC6F6FC6F2758EA2F7249B0DE83D", + "s": "3C26ADC8B1CFDE625B88256628AFB6E7726E0E22016230BD", + "message": "8DE19E1BC02642A98CE1F626A27447ADCE81DABC0205B5E819176487334348820B1F580EC225748F1F6281108B7A14D9E5760AAD0FDE22E5EF604034B6610C0EF181A1B74E2D24D82FE99A25EBA5495A4C1AE93F513903ADD6A63BE7FDA379BA886DB5D4D560F4CFB65BE7128BF98C2B473ED82F1C947BA655761742FCDB3317", + "testPassed": false + }, + { + "tcId": 41, + "qx": "1904D5F496EAC7CC99870D65BD126942E8B471D05FE11818", + "qy": "30A927752C9411F83B0E8E415AE3A776F638FAC843873FB5", + "r": "C2FE52648CA571E43D1041E7AD3886C87804E290D8A57071", + "s": "2A7577AC38429A238F7A9F7D0B4FAC0EBD0A521EFACC399F", + "message": "24F89E885CB4C0017871221C90CFDCD0C108CD50E75E3C5DDD67E987236A1AF1678A8790B7316B218F5390257ABB78DD70885AE65294B2AB8956B9C7D54F5408979DD808AC4D591CEF20E4990AC5B3972FBFD67873B18E3F9333DD104D5A4173ED9AEB2E52A79C4601CE97E0D445DF6666072216C342A382CB2BAF49935BEA87", + "testPassed": false + }, + { + "tcId": 42, + "qx": "38DEA4A9B31655435BB41937588513422BAF78FF41CD4608", + "qy": "35F9CDB1FCA338FA311EC283933673196F24C223C87E2BF7", + "r": "5544F5F01C84369ECD67DD5F7F8DA3DE705C7D6A4B46DD9C", + "s": "9A07D4DBD16D8FA44075394D0240F232DE48F8DCF0E2D5AF", + "message": "8B0C21250AE5E9D92B962B79A8AFADF86A3E230BA73E5228DF31BE0B92FCFB7A72B02313395AABE22A8525CB60073706E00DC25AB1BAB0AE205B7FB5C7135F51618C80DFB58D062D98D5C657ED72835EE6861EF14D5D07F38FD9A1408744B7F0DD123DE3661E8DFFFF10B7B9AE3F87C19B07F97F043C649F70E6FD428C053D50", + "testPassed": true + }, + { + "tcId": 43, + "qx": "D2E8D21D497C6FDBA5D1DC1E455686178517B673E5885E61", + "qy": "00A928EC62570EF6B2CD5F3EB9EEF72D5CAA98BD74E09C98", + "r": "71AD89426B00D9CA7761E5512D24084AF1145F3695D77566", + "s": "961545797135728EDE593CCB1BFE5957CB59D3A596E1F6DF", + "message": "128849A526B21FE691BCD564E8054C8BE65845AA036E2871739AE097819F57C9EED016A2CF8A6E49F3E30807D4B2882977DBC31E9976BD292B193094FC12C999C3AA17702EC366A976DE21C198548AA42FDCA94A381B73054045663634E52814A4A05B5F57B7052025FB390C7CFE6F914F647A25276D391F0A6F2834E48CA5B0", + "testPassed": true + }, + { + "tcId": 44, + "qx": "2E841CD6CF1D2F8A0705A1D9A7F5AD4092E55D67791F255F", + "qy": "6E74E1ECA38D042688C28D0F25600B7C1B5BF5A97D336BD0", + "r": "5694589718EBEC4D98D01A459F69BDC7916F271D5066771B", + "s": "264313FF3893EDAD144C5264FF99A3CA2E9B8F7E7F71D6CF", + "message": "3BE69A353D43B7F622AD54E33F9E9FE3455E7E76BAFDCB08C0FDDA9710E6A92E181B6DFD288EF8D87A598EDD26E1901B19E41FCA1B944CA9E3C3C4361B314FB08B7AC4CFB9B8C76428990A06A6AFCB8533F6C9609735A9DDEB27B5F0F32071845F358DF266C311E244B6FFC47137D199B4B7568CB6AFE6186C2B93CB9A0C1B27", + "testPassed": false + }, + { + "tcId": 45, + "qx": "2F65C3B2817120C7707A4091880273758A9F2F7DF17F5DF8", + "qy": "3608747583ABFA9710B20AF315D479AF3835098153A347BB", + "r": "96BBECEBEB0CFFFD031980C39E1B18B64351C1E4F9789282", + "s": "44AEB1C703F22306D56E4EED265AE6828EFA1B98E18E050C", + "message": "C4D3E4545C43D9AB2B533A92408803FAAAFB62C63DE6277A979ECD6A6F7A2696AED10B3785023D51D60382E3D8F8EBDAF874CC04BA5242CF0B6A579995AFAFAD37128A2B62FC6E77FF1D187FB632E5EF3862191E285DA839FC6E34F4793D6FEE833815BDE7233D1293F561628B3E3D3F5ED0D7049D32E54DCF714EA00E016C61", + "testPassed": false + } + ] + }, + { + "tgId": 4, + "hashAlg": "SHA2-512", + "curve": "P-192", + "tests": [ + { + "tcId": 46, + "qx": "7602C41E7A4338D81AE1C5E6A4A64EFF116A833DBE26158E", + "qy": "89F92B4E7FC0CE7119D03975541BA8147A0D4DFABDA4C4AF", + "r": "6086832577045B3FB4CF38B504453644BB15A2CA066C79A7", + "s": "000BF9826167522211D281AB0CF2F9C034AC8F5139F2EB20", + "message": "6053613F26A9BBC97F609B30305A4B26D7B351BEABAB5EB755A771E063D4110E7653535479DDD3009D6225D8D8FF0E3DF850015A1623A8B4A8DB1CFAA9592BA43874303E984476D80D67E2545F069272A11B398E794982A691EB98F0B6E1677FB784DF6B71B05831DF7AA499C93A9F40CBD3DB11D8E32917DFA1EEF1755553B2", + "testPassed": false + }, + { + "tcId": 47, + "qx": "91196E1B3D1CFF246F674867F8DA9008FC3397C250DA392B", + "qy": "30E8448A09FC14BE6A09209E3A9D9F4BB0064B964F7419CF", + "r": "4BA067BBE8786EF59A4A569261B6E6A0252505FF354DCAD2", + "s": "8362517890CCD4027465BDAD5A517B6469E278EDC2CD84ED", + "message": "4901F81F859E4EC9D885D3600B14C48902E39240BB65EEA1D9875C2ACC9724F73F65751E106143C63C8186948EC46FA0867F9C2D8A0BA2BF1F0981C8658B4B5F1A61247AB44B099E101C4C5D240DAA5B50C1B517F63E5964DF2A691A0053E388DFABA2391FBF613B97936BE37082EA8923811C48132B0BBC9A443A1687A1317B", + "testPassed": false + }, + { + "tcId": 48, + "qx": "93CC1651A05989E81A4028086E8D3FE711B8B288F2884077", + "qy": "DE6F52C9A0EB835DCEC4FEC3756A73563258773305316F9D", + "r": "D840561FBAF929DC0F106FBA2DE0228154562458B1E6EE6F", + "s": "604CB78FCD647E77603D830061C1CB8176A70AB4C615D2B5", + "message": "54DC42D6FAA56B1231C2F5FC996D6D9356F0B59A826CA2717256E53494095892724D94F25BC268245825F0E2CBC457B6B6597DA8E16993E9CF9D9862CAC33722A5C0C0F12423EDD39897041655720F0AB8B0F8CC2BFD52333FB816489500BC5C3C4654DACE1067AE26A8A5349DD3A1E6E62E6387207468F99A8F028BD2137C3E", + "testPassed": false + }, + { + "tcId": 49, + "qx": "D4AF085EC181107ACA48DDA9E21186E3548E9E5FB110C2C9", + "qy": "849BE8986F2E6E87DC3AB49606F2D7B2D6A4272FCF76B329", + "r": "47D3397BEF9EB4745E817280896CA30B9689DA9889CCA75E", + "s": "74CF71C81674046A59A0C803E7D3EF61057CB9D94065232F", + "message": "994BD94950D05EC4C13C31B5BD98C208803D997EC12A634D03C369D933E6FE3532E46B42DAC3BACC6228EEB4E60F83DF9D8637D3E47AEF058DB40C0A9CC1EDAFF017C541785F8EB8117DF8B030F10110CE069A2095EF4DF725E3A2687BCB4A5BD91EA5E81F52E638A6CCC3317214E9301D88D6E71CC6CD9600E4935E983585D4", + "testPassed": false + }, + { + "tcId": 50, + "qx": "F7FFD9C65945E265397270B3531E7CCBF54E5EB138AF0684", + "qy": "8D1C6D7B38E14A2A78DF63F41AFE47B2929510DD2E4509C3", + "r": "44367302171D5FBE90E8F56A1159D2B1746136F0A927D525", + "s": "FCB98E8E5F6C65E22D9AE4157C1A2022DCCD7B4984EA2875", + "message": "3E0295B4C7F35ED1D84BF7FF540C3FC628CA58564C9B98251EECDF5C7F9DED0D4F7C97AF57472B60988B86EB62E12AB6C8B89C39A928B9D6B1ECFCF254F75D5E375AE17FC3077EC403027E057149121ADE3353DCFC246731FB5AB7D60C2F621791F73575FC09EA1B95985E1159B53169C30922B60FEE566DCFDD89AD23145D62", + "testPassed": false + }, + { + "tcId": 51, + "qx": "66E0FED1ED9281E154851AADAB035FC86B09C72A0D8D58E4", + "qy": "D6639BE3371904BA87247A99B3419637CBEC5361204D9B30", + "r": "04E127AEBE46D2C48681DB9E5E531CF1E4A8BD5BF0E8EE4D", + "s": "5011E1560C3BE0BDE33697FE779812E88ECAF926ED23174E", + "message": "03C3F2E10480E6DCE055AB90F96041BE7B015D4F11A401D2BEB5ED34DDCD3A1470A917417E3BAE809CE3004F88D262C4B9BB00676DFDFD1A04711DB30083C0E0A533635B24FB797C68CA4C0FBE0643DB68EDB89DAEE048D3053B3CF8B7174BE9F3BE56CCADCBB27258AE47B6D00356416AD4CA4B6DB39FFB001027D66DD22AAF", + "testPassed": false + }, + { + "tcId": 52, + "qx": "E84F157AD8BAE48ED3338DCFD0BD92AC6384C411C7C38AF5", + "qy": "4EF27F17767DD72C76B89297516533DF479EC5DFDE7BA4EB", + "r": "6168433EA750E01A41BA9DE108ECDFE14E241008A7AB9E23", + "s": "FC156A062D15F6F34E4DE48636E0EA9BDDDE24447BB3DBA4", + "message": "AB54257609B7A8B827EA6BCCEB721EA9E5AA47B6029FE59C19E349F95260D2494E0A87B7A656FDEA51B89702121256D774A9009F3841BF320CCCCD07A1F971BFED7DDF424A9353E64A80F7C2D2F269E6EAEBF3C31FC0C72D4CD14AFA3C486A487A69F57BF941C3676D1F5FFF6E0B0457C6094F0C42EC29E2F8D9830DFBC005AA", + "testPassed": true + }, + { + "tcId": 53, + "qx": "1243D7EE70AED19C83DF5FEBA812965C3B1CEF498C3CDA3D", + "qy": "7520631187DE1437126CBD1F9343AF548F7FFB527031738D", + "r": "C6881A1BB5B296A8513A9B98C9F97D45082976FB81CCCE4B", + "s": "2C183BE8344602487456C16DACEB973A4EC2655228F2E028", + "message": "D1B902E84ABB5330D6BE0C70107499A5F03562C93598D508EDF85166A72F821FF542FF5DD850E3ED6F4AE49724C735B71FC6FF9DA84B3ED117DB392EA8C37BBB553037452CB86BEFD30A14746AECE42726FA2A22EAD7502D882C164440B6F884BF4F8309EE5BB149E9EA75F879C7FD2D1F79E4A0483A0AD93926A1DE0154DA48", + "testPassed": true + }, + { + "tcId": 54, + "qx": "D197900E6C1EB2A68DDF6CD888C648D9C081778540FE8424", + "qy": "D666D275618207FA81570187A828D03BDC795442793658D6", + "r": "36FC6D782006CDD92AFCA92259A639D4CF16DFF38A91E010", + "s": "C65009196090E18ABB37B63211E188F7BF547A1F254CBE4A", + "message": "9DF2BF4219949959C33F14FE1F8A273DCAE16AF3C4CB98F6C7FE02EA4B7E849D58602ACD6F4C80DF769224AF574BD15A0D94329945FF0EC8BF2E8E9A7310ECE8EF6C49F1E434D1FD7BB0F3D3945725569976FA3767730AA2510F014149FC906A66B9077CA16BD107CC990C4FA260D8C170D896047A52A1F6E8EB5CB63B9E9788", + "testPassed": false + }, + { + "tcId": 55, + "qx": "2ACEB9B86EEBE23700ED5C0F6C4CD109307E99FCC85C1742", + "qy": "ABB473438011F7828F33B07114E2D03FCFB13BBB032A05EE", + "r": "FED00917B4E77AA7C0626071A0F36D4EF7B1210C79903292", + "s": "FA7B40FB23ECD7CA83C25D2B5042078A4D98E9C1AA24E0EA", + "message": "5A5E9D640B0526CC7F70CB114EA81FEA5482A58780F950D06579031790AE22527EF62DF1C35AC212BE7DBE44D8DE86494736E5FDDD705F885061BECD18E44A3DB4A3F0D5F16720398083F7DF81A13123461BFCDAECD7F66ECC1F58E4944295B55C40E50A02CD644410D2D4D4DE2BA7A945520FAD9AA77D9AAEF2A356AB310C55", + "testPassed": false + }, + { + "tcId": 56, + "qx": "23EBC2B5AA110DCED0EF10CEED7B1CF0B2CE85540F7FF8D5", + "qy": "98A7E3312DF9B528989637794213DEDDBD6BA19866B44369", + "r": "A255D8136B590175A381428448A49856291BA67DBB6CC670", + "s": "178284E3DE92886B6796039D00A449B8557C2B10758B7EA1", + "message": "8D77B7E5927380CF8CF12FCB8A3457F2520B841753EDD75B0DC7AE667B9690DBE04BED72002C63B3287CF95CC5C3493CE5AE20B6559A1C7BEAB711F626A84C864DF58FD4703CA073C2DAB17068C1131FBED50FC71CDDD1701F5EAFA09F258EDAED621DD9E30712F5763D94270A3CDA9958B11CB58239E86BCE73DC833116B056", + "testPassed": false + }, + { + "tcId": 57, + "qx": "FC7DB901CE219726C21317240D4F2C3B77D0F531369EB8E0", + "qy": "8B44584CF9B32904A665A690DF2AA774452EFA7C9B8CD2B9", + "r": "EBD21D1C972B9792D27A840B7A00602C5DD4B32A2672437A", + "s": "97795E00E0FB5583ADB7B686B72F6B19957A513094323681", + "message": "F5B80FCBB7B583B89B8D58985F6174AA62EDDE615C7ABB230AF8EDE86EEB09459451D29E67E2AA19F428477DA769334C3BF534BD5BBEC2C75776AD61CE77E0E30BFF0192AEAFA096AB391F1E421299B85ABB604ECE144595E4814E077855531446898F40218D089B4403D2A053A648A57D26B7218C276D9A402220B74BE4997D", + "testPassed": true + }, + { + "tcId": 58, + "qx": "FEDCC1637F8D955BF4A5CB7F6EDD00BD4E80BBF53A1FB949", + "qy": "FE3DD5B263729627F44B9287D7895F4F633F2DE4D8FB4087", + "r": "23828F62CD4881FED8A5707B2CF0E44BBCCEFBD44B7463B4", + "s": "BF5A2BAE31C06A7154C5A3BBE10075F215AF87D94C078D69", + "message": "63A5F974F6DE8662722BE2834E0704DD26082865E0B402A052045FF103EBDA0981E28BF928D834EF40730993489970F1E79D0CC4F82AEBEE9E214C2BCEC6D67BBE2A1CBEF8EC7A32CD218FCCA2A0C29E2F2DB8DA6698349EA184E5A20B0210CF40AC340A37A01E9F77725D2DC88C7284C4572DDE961627F235545F178CF2A52A", + "testPassed": false + }, + { + "tcId": 59, + "qx": "E8E0CC0FFEA5BEFC3CCF35C0A9CC1D77A6B446B4576D15BE", + "qy": "DD9A68F05CFE690513B52CF315ED06CF1D7E03DA3E7FEFC4", + "r": "367FA8ABB0C01CF355D0F37C740782743980FA98BB00DED3", + "s": "A0AA785D9D05B3ECF8B81D4D4E68FA6A7FD7FAB90C30A86E", + "message": "3872DF841FAB8E9D9441E55DDABE22C36ADA1B2F5014740C65628A016376B75ADA8C3A16D6EBE1534F33964BEA11FC266B4E97595D07A87388B56F01FEDED02B8CD06FD6E48E1201337836F987FCC2D56388DF33A2442A49621FA4E8EC15CC862C1E48ACE75FAF4B82399E88500B922D9E5C17CB64FD4AD57C563594D9943BD2", + "testPassed": false + }, + { + "tcId": 60, + "qx": "13AFB3BD271746317BEEE971973CF61F21F14D53F30FD31A", + "qy": "EBCCD7B9F08A9FDEA9D1A08742DCA6AF9382D598138E01DB", + "r": "8A475D8C4AAE3D49DDEF90C9AE8F0373BD5924F1A999A947", + "s": "834CB78C2569053512177D164F8C25ABA3810BB7D8D8A28B", + "message": "0A4C19A15FF59C3B7A7C90E458E1A876CC9D0DFD1AD3FB673BA0C21A1426EFE5F51772AAF9CAC1E81C0EB12179BD80C071F6481E02C0417CF7126C20DEB8492B9E09A2D8A1196D14BC0FBD5C4FF27AA7C1A0D35E518DEE97F013C466DF7DF7DA6A0014F365426044559AACF158328FBB794C9ED693B42CB2FD071B025DC2AE68", + "testPassed": false + } + ] + }, + { + "tgId": 5, + "hashAlg": "SHA2-224", + "curve": "P-224", + "tests": [ + { + "tcId": 61, + "qx": "AB7EB1F2BB7D0DA52E9DDCEE12B109D78B73C6282F07D5ED343FBE93", + "qy": "DE37ECFFB7525A3B3B3AF209121120E228009ECB04925F371DA8BC66", + "r": "9B840BFEE34768635B4836FBEE72EB2BBED933AC807F91E6E0D56E26", + "s": "3AB99AAA5EFCCB49190E9B7B20737044BA97D99626CE3008BA748F7E", + "message": "E8583AA05A0FD80AB805714A598F861F7AEDE09559FC5322B1DBFD99C55EA70E431ADD03EFEA331B5686D0DFB9EA8DB2D77B69DCF3AE9DC55C298A8E2B2F9088E42B35E7425E9AE3C9D344F7C2AF4C3C6928C955E68C3A78021F618ACDFDEE9B7D928E0526F7DAA1D14F692D279FE4BEB4588B19CA0D1A73305BDE1CFF6B3333", + "testPassed": false + }, + { + "tcId": 62, + "qx": "D00FB4A7D4952349233ADE1FFA19704335337AE6E6058289CD59F354", + "qy": "7A3BF0F99356534E9407795D5E3D255A04C02E02211BC776196E18C1", + "r": "03EB0C0B9A6F32A3BE3880766212BF738CF8CEB47A6110814AB8BE3B", + "s": "783A687B54B6AC084E06EB5D812D63697B2DBC719A9A8CA1D0BA68B6", + "message": "8CED057D6829C4851C1801C79D6DA73276CC9DFC9B7D908256DB366098048F2516FE60F1C48A514F4DE2835A5612CFD75F1338FE3335B4EDDFCA08BA791167A07357D96D450646AFCAD032506A6F4C5E96B07100A4027DEF6BA5F80A391C1F7F33EECAA2706587D113DC00B0242093D7D441D799919B8E3DFA49D3CCD8598BCA", + "testPassed": false + }, + { + "tcId": 63, + "qx": "8A878BC1A0850A3C88C2F3A426F097A880E139CFD6C4163E2A69F2D2", + "qy": "D7983695B7521FD493DA9CDE3352B45D073A9BE8E26C660A2E6EF671", + "r": "FE3B32AB6070DFC280AC4CBDEA64130B4462C70BCACC0F23982488EC", + "s": "73097E9FB3D528EEC5ED83C38DDA894C94DAB6BB32B06DDA4F03319D", + "message": "2A9637D5F832324A98FB44B5AF2A9CBF05D4636C2DAC24D524F9404B39AB8021FE34B38A030A73164131502D0289BF65BDBB713B786AFADD203ADF6C49747BE928473E6F8F5A7A7710DCD728894510046689BFB594A9683CA442E47E8284F31959DA72128E26EE7D7006E4E1A79E2005B962F13C8ED5C39B59CC967ED7EB7EF5", + "testPassed": false + }, + { + "tcId": 64, + "qx": "DF3F0A710F84937936AB9617B72F5E226F340D2B8E9E95CB4009E3B7", + "qy": "1E3DFE30F600B87F0A3F0CB50FEB97E9E5B964D9CCC4F187721D2316", + "r": "A5876C850A5465B112E6D3C7384BEFC968B2BF03BA441015B6DCC3CF", + "s": "DC66A912B15A97CACC02765F67B8470CEA7724EFF8406686CD5519C9", + "message": "39D00852AA4D647AC030F451315D7BC754CE17916B18A04789E56712EE8F89F00526A077A2D12F75652F20F889407CE03A23F399FDF00DDA48AB23D9C3C9A9E0297D92AD3EB6EA4768148278F2E8F2ADBE2ADB9770B26E98D3DF2D8C18978AE7A813E17BED3B0A16BA644B6B88E1B975373C714DB051F30AF980E849CCA5ABB4", + "testPassed": false + }, + { + "tcId": 65, + "qx": "96BA0E6C9AB696B0714FCC99A8800DB75B4C2A902C4041D954ECFBD3", + "qy": "C7CC203B5510B1BC626A08A5DCF3C920FF82C8D8D8E0CAD3B7868D23", + "r": "E3FED8EFECAAD65D6E08E55421F50EDD76C896580FFDB7069C12EA32", + "s": "949B65DD96CA7C3D6D3A75AAC08181FA213155E859057DC807E72421", + "message": "2D8EC67EEB1F6503A47A9D8C72CACD6628EF3F658BA53D46A931DD3A5578C28FA089B0AA71B5B201D6F395798C0D9287CE5EEAB1C32571DD3837339E213BF63AF4299905529CC412A1038BFD83767EDDD0FF764CB3B6B93A8E024736C7540561F018EF0AEA638644AA9D687C6000E07F6EFBF3269DE753E4348468D9E06FB00A", + "testPassed": false + }, + { + "tcId": 66, + "qx": "F3B535441A28489AE54CB54FC412678A5FCE400FD16058B77CA6EE96", + "qy": "BB2C9860785875AD3E46F24F72F3708AA2232D3AD29E146FB54CE81C", + "r": "47E067DB5EE0E4F26B80A4328606ADD3EAA1609AE978D193C5540E1B", + "s": "785DEBC6EFCFCB73639C998CDE00AAC29C54BCA90A668886C88C299C", + "message": "A754B6417AE81BA4F52BF54AFAB23AE225B67A39672C0CCC429AF3C16CA614579E6C0981E974820A149B41500DEE1BCABA44C98496EE93B1D69FB6FCF23040377B0338157DF427EE3A1027FBDEE26CF896E5F1ACDE8F5AD68286751062BC1A3C961F327AE6B1B0ABF0A713F0C515384BB018B80D6CD657AE7D1FC72DA018954E", + "testPassed": false + }, + { + "tcId": 67, + "qx": "44384C85EF3A95933C5BA84D5C0AC71CE3BCBBB4922D3649BBF1AB0C", + "qy": "AC0BD6C16B3DF2A7648BDFA07546430DD1A788AA52F6AAEE516BD996", + "r": "102545628F117825D214A3646A79405FE1895FDABFF742499DE6B30B", + "s": "2C100D1F4D0B90D403D2B9B7F6667FC6F20CD471DEEB529D27C997C9", + "message": "C41650962F2F270FFB7710094E823965B3268789C733F7F0F31CFB6FBDE65F86FB9DEB2FF2717242325A070272D805D8EEFD1E26384FEFAF464308A1725A69037982E1535B2862D14DBFD8B6E23D34FBBE6DCA27EAD908DCF146585543BF020A11EA3FA6D3C346B82409FF412BE0F59E984B6074657BEDB929B517A1E187DA4C", + "testPassed": false + }, + { + "tcId": 68, + "qx": "9F456003B1448EDF23D241169C688CC13C8709D5EEE0D8B8528F0408", + "qy": "3B036E7368212C74ED6134CDC083968A14F2C97CC4D1E223B8316E6F", + "r": "5BE8C656FCA6D27C25DA0125FF8F00329A14FAA2B31F56EB15114CFF", + "s": "0509A0F27CCFBAF735F6F87ADA91251124FDB669F346587562E03996", + "message": "61C4B685ABDF5280FA390AE6E914A6FF2D98BDF7B063FAD1EA654932181A9700C6F3989887B57111FC7CFCBADA880DBB6F70AAC86E1E87FA5D3E3A1DF04EFCF7F4E46EF6D01570D7612C16385D57102482398114118BE534EA68AEF78DD23D12B45A12EAAC90F5F085BB53535372630B35C7F02D61B05106CF1B86C605F593B4", + "testPassed": true + }, + { + "tcId": 69, + "qx": "747B728BA973550644D16A3254E5E897F779DA5FCB77CCA4DB6B8196", + "qy": "37F98A941B5D4631F7A0F28008BE0601BD80F2A89C2AB0182753B121", + "r": "B1CE18144099BF4849D94FB6EADEBF822D87FD15CEA0B02600F7169C", + "s": "E11E8874E1D7F5873A8F89BD078528FC3689BCA0493FCB7FD2056148", + "message": "D584915F614723C318661133C8DBAE26694F68803732286885DB6AA8848029BB1399E7C87921E1DD9EAC1536ADE2B96BFEE893304FAB95BD4C0B814224C26F2D9CBE158246AC0FFC7FB72CCDEF7574061D8E6AF4AEC579291B2E75891D6094CA7905AC21E9D7FA69DC41F5C9D5B0EBC2959EA2B88CE93248E0FE594016EB3D75", + "testPassed": false + }, + { + "tcId": 70, + "qx": "9E507F3C2B650F37C9F2FB4768D8003E4591B0E7C775F19F3E68BBAD", + "qy": "849BF4C3DC69CB36A921D8D3CC9B2147B7FF0F530B35DB4FA6AC519B", + "r": "A32EEA5FF47D857EC548FA1D33B4684778DF33434D55611D777E20E1", + "s": "5BAD3D852B02E230F0E756FBBDFD050459B090ACCC138E7FC8417B42", + "message": "427856808ED7E510CBE51806D27E031CE6017B9B1D42401A8152F462074E3201714B2EA7055E97D839C3277BB6F4701BBDCACF88DAB6B7711F5CDE26B01ED3F260CFFA439AC0E6B5895552D5B460766078A581DB4193D06B8FC968EC14212E8B98DBDB2D55E9C03EA5111CAA22473B8748F247DFA96CCE3CFC4F2C5BFF8CC7A6", + "testPassed": false + }, + { + "tcId": 71, + "qx": "3D8053891E3331492D6FE12641A0C56D914144DE10A56D92AD18CA70", + "qy": "5256CD67076E5D63C3F34495376069277A6C5ABE69CAAD03A346703E", + "r": "15693947FBBB0A7F0555B1A5F5851B34862031425AA982ED45C320C3", + "s": "6616EAA17A62F8F40498C51A5502BBF355714F9D75DB671099FBD977", + "message": "761BE74086B20C163FF64D25DDCBA8B90608466094296179B7D48EE8CECA2A9CF7E9F396D5233D32BF6D039A6F27ECBB4DC341DE0A398A69B2BD64C4E5CB844391BC4DC986F67C48E750991E9313371B9974B3530EBC5945B37A8D526B2583598C97AEA743852F01174F9A647E3DE43F10CFE9692511DA3F63904FB6F8949782", + "testPassed": true + }, + { + "tcId": 72, + "qx": "9E4949597BFC5AA7841D2A9AD855EC29511F9A2F14EC344D6C1D4755", + "qy": "108E24F22107D3DD5D32185D8361FD7B08399BD6C330D1238CD2C937", + "r": "73C85FC78B3213ED971D12FC8109BC114BFD6C290CDBA9F3EA22F3D3", + "s": "CAB199C22D1666146457E3DC4DF293E28E96D63DF9D83424CF7368A4", + "message": "2F081AA79775AFAACA8471920EADD38E50EBC033F37E2DFE99B35A1F74E9C085FE9ED2EF71A7C2888BF58C59FC5D032BF4C258B6E67ADD02F78B4E59FE3A9F56DD6DF011D8C750A8A2A7ADD080248AE80D585A133F9EF3EEB0ABB6C150642F39C60C7E864611844ED59755D9688EADAE4D9FBE2D7465635CF436235D162640F7", + "testPassed": false + }, + { + "tcId": 73, + "qx": "3406A7769383C71DAD96EB486C648016B74796823CAB56F1BD0B4A50", + "qy": "E5EF60C58302E8B862B5D12F1BC38C49B34434B543FAFD621F48CF78", + "r": "94826F78AB5BFC25519E2C9F625BA18A700BC923660718011AF32797", + "s": "FE1CE7042AA8453CD8B9145073E21FD355302D16CD67E52CB70107F3", + "message": "AA12394F0E98B388D7E44E366043D0499C4339E0C2FDF6A4DDEB162E1614E8F778B55411769CEBE0B53E452634C7DFBF3B7EEA9D07BE96FF24B0ECF97968C61D0B83FD3F030BC886E0419E58FD1A54C9E48F97DD32F37B75F5581D3E23CC22549642418991C44FD25B1C9082348B5741EE0FC69BBC5D604C0D8E0452DE24A371", + "testPassed": true + }, + { + "tcId": 74, + "qx": "97B36F50F3B95E8503108BEC1B4397753324EF41F9DCABD51133F621", + "qy": "E223580C154798B19602071E0A3C410299B648CFA906CFF0D35FAA82", + "r": "9DF6A4ED1DACD81A018285B06B58F138A6E3B90A75155C52D8A48CB2", + "s": "486A47E7BAC02F782AAC23A1DEB6DAFCC0ECD7AFD1DCFB1DDEA1240D", + "message": "8C2F5D49BA33A22690147611586D4C832141C01E4BFC5753724A3F72C7CAA0910F945D67E5F0F4760C4C471E4889F9C62CA80924F73D5DE997433AAFAAAE72D832BF9B5234792B2B66B75CA8E5EF96ACFAE9203AA2D351AAE691E1101B5A2E68F52D0DDF35F4B04DE2ACF748E8437B7853550AD81667053F9FD146E5C60DD75D", + "testPassed": false + }, + { + "tcId": 75, + "qx": "CAE9F4763B6DA6A06BF2C020D9D38D3329C8260CA5BF4DC7906E09C4", + "qy": "8BA7B4AFCEE5C061D4336CB5F836E4BF96B64BC96858BD4EB3F8B071", + "r": "7ADAF3B87AE4724164FA2DB763721EC97B81549446FD923D2C1ECD2C", + "s": "A31F33B9D8C4122187AA70A2135A9B746BB9B779402ECA924A470A53", + "message": "5D3C05BF0D0DA2043DD47722BCD233B004111353ABE6F4FFD4C31AFAB82D87F1A0640A42C0991335A511EED9AE65378CEB6098E8EB8596687EC658204247162CAE2588F45E1F119CF9FED8424E73C52CE45C42CF59351728596961D2360D337E533D4C73921CE92E2FF11D03ADEFD2E0988E2D75C66A69FA991A11484D418E16", + "testPassed": false + } + ] + }, + { + "tgId": 6, + "hashAlg": "SHA2-256", + "curve": "P-224", + "tests": [ + { + "tcId": 76, + "qx": "A1058279903367883DA3B9DBC16A2B8D3E3466CF9DCA176785CE248A", + "qy": "10146601EEA52106E5F2A55543456A616914243B3BF695F664530432", + "r": "C49B312E0161AE9D7DC22E5C34D995748C55D10554398FF279DF79FE", + "s": "8E839CA76CF92A638AF27A7AB196D8B3FD9AE955BDA6B4D710FC1232", + "message": "CBD7272E49D1B083719811A2EC2BD636E19394C4C021096CD64A3236A739749E7C53F291E67AAC05F2365802412CED319ABE33153CE561BD690EA9F5D6A2BAC99A53CFD95C70F515A8D1AA22DE727A7F4008D961030FF24B2C4E02DB9054D69C583774BCAC2D3A731F37242F308E0C6BEA3949AC3F12010F107B0696E4144DCD", + "testPassed": false + }, + { + "tcId": 77, + "qx": "A067E8DCB8AAD4112BA3E37A4D829FBD031A3F553300FFE9F0AC6347", + "qy": "CEF94FC5D6E01FDDACBFED0841DF1C41B3F2284FCC38A8ADA0A97230", + "r": "03936F3E03D00F25C49387E5E98F756A2D2D457AB237A1375C9C7294", + "s": "F84B6A4F18648DAE73507FD3E1AFB1A193E84829476A9C61347D503C", + "message": "E173B620317426864073430946DBC88B388A8001826699B62B7F5B3488F536F2D247B6D5D2D7F6852557A91069948B1346AA8D81B0D928984888F827FA4CDDEA84AC9DD2EF0E35C60C31DAAAFEE23F24A6558166DFBB9E701AA5E3079D02B70001A7F2A8B83269C7116D3C4F49423E2C90952AB14DDF927754550458D6473349", + "testPassed": false + }, + { + "tcId": 78, + "qx": "9DDCA04EC5DBC0387DE3559117D5564B85431E2ED6684A01BBAB1C69", + "qy": "CFFDC18455AA0CD8CCFA3EE100847ACB3B142BD87BE5CC6D0B4AF0DB", + "r": "AB2FFA065EA5489D8B59D4E41EF2F177158BCEB84E7193DE9C827BBF", + "s": "718A0726522EA452327EEA17ACE84F683ED994454755F05EB840D3F9", + "message": "057D67743DBA394516669D7409698F67A7BC7B39BE3B8725DB82F81AF5428882224B06EE429BF961AC429510EC7A25979F36E4583B1F010B6CAA0F361BE687AC768AEF2E002E9E8B15B758BF47F3CFEBB914007CEEFE0D1179061DE1270E190501DC03BC66DEAB9FB3D25748317B11898B374534EB89887A46550CACCE515E6C", + "testPassed": false + }, + { + "tcId": 79, + "qx": "D651EB10187955FB02321A9545304FF2FCCA12AD9D9F1246A6626187", + "qy": "C059FCA73B8E205B9952188543D8CF51A93002AB30C58C031D5CE140", + "r": "D4E7391CE1DD8751CE7A88B1D2115BF2490372BD34C9B621C318C0B3", + "s": "7B42A2E1E645716E459B8824E17D51A97CB4354C7207FD68759C32B1", + "message": "1FA6A44D12EC236D15A7B57F7537BF0D29466828438F41029F6FC4D47DB77B63358BA6FB3E18D8C5906C47203FDFDC26A98618895F4DF8C6A1E265EAB2B3D95DC7F55E525E699341D0C8753C56E3E4045A76875615435894DD0464D159A88D05A89D0424E4369D31DD2DCCB8E1D6CB06B4BE9340B981FACC194288FB9B706E9C", + "testPassed": false + }, + { + "tcId": 80, + "qx": "3A2CAC935504EC0FE36DC595BDCA503E97F6C8332E828C5D656D1F61", + "qy": "30D173D9C24F3966DBBDED17A0409B2FD3D3D3208BECDEE793C58900", + "r": "E819FBAC1831CAC1FDCA2A7F76538ADB14A82BB84795BBCC4B53EC78", + "s": "5E0C2DD38C0A2BDF3B2FF066803F9387217113B39AD5549267E5796F", + "message": "A58FC9DA6143F5A50B1D810E5FC617DA4C44E05CEF8D1FE110F60AE215947E3526C30ABFF1EB0A01999FC07B4106CF6CB9C5AE69D39E46AF4EBAC66C458F45CB99C3152F33D19FFBADB3FB363D6E9BD6634F715B6017F93BF23D9091E7B8B595D5FDE9DDDD33BC2B200F80CCDA39EDDE4BAD25FA241BC982A0F262EFFCC00A2E", + "testPassed": false + }, + { + "tcId": 81, + "qx": "B15A75E2F9B62EE4367949AF66830BD0FA834CF7AC8B31A5F0D02D19", + "qy": "E427AB82AC8E2646E964B342CDD2AAF2D7C94A7B55E7F41105D2D7A7", + "r": "8F6C1C1F671A1BFBD9559E5E863B760790F0C60DFF967F242EEF677A", + "s": "45D09CDFF55412E09E04BD3CDBE51B5A9608627ABD804558080AA5C3", + "message": "063DFDD5F9BCA77A0ED585951F8F77B9D94514C5B466E88DC52FEEB049C094392CA6D498511A6AEBBA6ADDD1290B1036A1731F41411EB6DBD54EEF64A761E5ECA6AEA02FC6192CF88656E36A41BEDCB59396112EAC3BE8CDD59BB17E13F1419ED51F9005C0A4CDB3A2CC7C2AEB8C7687CC0356E9FFBA0B36B460D493CCCFC502", + "testPassed": false + }, + { + "tcId": 82, + "qx": "8B02CC48D2C592E1A31C26756AD69CD0E8261B6B97DE0309789ECF9A", + "qy": "D20C63EC86610CCE909533415D40996AE98FC667CF3006FA7E7C6F31", + "r": "CF8AFA9287137C0BA1BE02259F933113D41D2643EAFBF606948B1EAF", + "s": "7901CB52F89D4B8161523D0AA95E02E87A7EDBA511F5F162E616509D", + "message": "AA15A2FFADD3720C370933F7B33FAB3182AC58B7C15FA036CBBAB026A4453D4AE824B66F91879A324537F9DB5388FE07BF3C6A3690F0B0618533874806B84330E58680B1476A6EECE3E8A771C0256A5203B7DFE77523D068D6FDDA00747D1BEDA9BA01BDDB02BE9E23DF5A6159865E5F34FBC621A6ECEAE7435BB3050992CC3D", + "testPassed": false + }, + { + "tcId": 83, + "qx": "093C55045DA381AB2FBBCD9EEC9AE58B77290F6079F64BEE2A044056", + "qy": "AE596A437771AB9A3E807A30C7B5F980B1AA60F487A2AE46751D0489", + "r": "F3A2261A9CA38504228ABBCF868AE1A315DBF4293DAFDD8A4A5B9E90", + "s": "813002F52790DB5FB44CFFEE82A1D2087F0D77A0F143240A829ABD6D", + "message": "5E0DE79F72F3732C85CB9AB2588603F3EAA9F88510A3DFF531DB0CEA70391B79BB082F397B8A1C224F0F6F53214E3C056D12DA45B70BD08E46632A8E15C33CF51EBB01958B7005C5EEAF91E03126585B6A22ADAC2E3A35BC9DBAAA81500BD2E0F0A1797AAAA6281ABE097FEDC86D49F0E47A99E8A42D979836AB3BB48BC4CF6E", + "testPassed": true + }, + { + "tcId": 84, + "qx": "FCC3EBCF6C77FB3898B09E9832096292C1DECFE05BB35E7FCCE90B20", + "qy": "CB5CA8F9972B9E8B5D211BD18F815FA71AF4FF47FC4CEE261F63C328", + "r": "517C1994D49EE92FC4C4C05F57DB6CBED1B9B75890B54E03C5ECF33E", + "s": "9E7806BA2E2A394A4FC665F02A6B3D42E7BABA4134B81E5658AB2B3F", + "message": "090AFAC80D4D72FA39C1CDECBE7D2CEA1BB5FF34960880E6B892DCA6A14F424B671F5F0D40AFE875C94EFE3F213FD2BCC634C5AC62B80268173A77F6C23C493801EE2B9039F31EE16262ED9970972030889FE3EA87433A92AF98005E904AD7B7E76FD7416F5B5BA91F4DEF9D4BB200179807419AF431A8D8309AEB949C3E2E52", + "testPassed": false + }, + { + "tcId": 85, + "qx": "E038679749084BA0CED87D1017656F047F4EEAE907045F0811F123B3", + "qy": "234750C4162A518E5B58D5E7AE622FF7F6017EA0CC62405EDE04B71C", + "r": "20E9398AC4BA479A9B419EB4A513BF1F4E8D5C3366C361A27B8B9617", + "s": "88BE5B11FD75C4C1C5374007D573C5BB70269E4D2AD016731A823457", + "message": "D628CA68616C4F7152A7C3E1C73902796FCA9FFBC5D13401F3705C7DC99E884C6814054CE87FCCFA7927DD2EA539EABEC57A62BA79484DDB75B3E82D66C99830D5691BB2F7C8F3D285184412ADA9B4DB9EC34662CF5EB584C6FC15DC515112BE3A8BD85A1489820CDC32192FCC13D78A903A7F7987D3BBADC4303B79D5D0049E", + "testPassed": true + }, + { + "tcId": 86, + "qx": "E1F2C2660B6CF6412F9D139B3C313354EEA81A21DDF7EF1F314B0E95", + "qy": "2523B78E7DA589737C836E10713B83288EB9DC047C557E4479E48622", + "r": "F41AD8781D9ADADAEF1CF4EA43B7057D7BAA41F08DF8FB54703012FF", + "s": "947B21F7D089B0433FDAE682CBA7909B12AD8DA90D163587E7C83E21", + "message": "4AB06EBE1F27CE2DFE1FE3B9C513A2D38BDA281560AED27E4C40D510321E6C42E24A83ECF649D357055BFD62F2C4438FB7F001F89F3CF9CE9D6508F37FD488FC82D57D09A259C48CD3C8515A7D70E4543355E4BB1BEE1860532646BAD6A62057B67BD2D61976E49BAB1DE6B89C4DF5E31FDE999F2C3F7854AC968087F56FA9BA", + "testPassed": false + }, + { + "tcId": 87, + "qx": "8C1AA7ACF45E10BBF32A0802FC8B807CBA0F6687E47AFCF00C13FA4C", + "qy": "CD5024A1675572FC6B9D3CAD21A41D2B6699BFB4EB0A13805A76BD71", + "r": "CF37F406B12B414970177C8DD16DEAF7415A282614B9C055B1BB7633", + "s": "C75E289DD368731E6D34A518E2D83E4F1795D1C470E63AEF8F01E5E4", + "message": "2AC292CCE4865151EC2D51F31A6F1F20E5F7634392CC48544F0B6C9557E7E865C0B20C0C8C51CA1F835FDE2A6B040BCF0B6CCA72593B3A36CF1E1EAEA5D5B0CA57BCF7253E2B8DB069BC7ECD0317736EBA126A08B13F22B8D84A38190233DC012CE142DF72C5E276757CB27BF31280073720E282D7DDAB9A9C6AEB20A1022C1C", + "testPassed": true + }, + { + "tcId": 88, + "qx": "4E12B8413F076B93D59156786237005E9C3F98150B3D9D27C8130371", + "qy": "D510D8C337E600D57E31A9B505A67AAC4B0769464790289526F2451C", + "r": "9F68084E8AA576C394959883ECEDF4CD5B1A98B7D2B088E355C680B7", + "s": "B4B62FA9CF54FE6D16C1B5F32BDC3140339E876AA02B0ACD0FD8F78F", + "message": "7FB9F8F9F44C4C27197CE8EDECB90FC05D820B6F598AC58CC2FF9A8D0A1899E2D8ACCD3FE251B4C88046F5BED536F129E95124E7E95FB64DF8DB4AA914CC6E0F3BBE23DDE3F8118169F5CF0FD7BD670CA8AF5A7927D4A1FC8AB037F4D21EBD5056CC7C3D429AD843CB4BBB8A5C40FE30CF1DC7D21DC4DCB7FC6678BB3CDCCD24", + "testPassed": false + }, + { + "tcId": 89, + "qx": "09D91FD5622B287E832A84036267795E2D6E4BEE34D30F37B4F5A6E7", + "qy": "E2589F6B958CEC9A641A2426055EFAB7F21C0F8C53640A748769A586", + "r": "D4DCAE87F5ADD0D7C90B8CCEB49A2CA12CE3DD2CD9B4BD793F528FF8", + "s": "B3067D418E3BB768CEE48C968AFE47E2AE55C319176FB7A7BC37FC70", + "message": "CE53E70F046549254FE567B9213A83366CD4CA3CEF52A6FB162AE6B70015E4888BD2DA314CFCCD3B8D29822D60660BF99CC083B0739E93A885340BD2A1D74FD113C71F2D3320F6F0853DDA82FB2B2F22FC878E4FE7F74FABFF0E5243EC527968AC7E598F8808802B106BA8C24993B7D777F7241A3FFB506D57A735B34B065B2D", + "testPassed": false + }, + { + "tcId": 90, + "qx": "511973642E84BFFEFC14AA7CB71D20D96983B71D48C40B79F7D3D711", + "qy": "457270FF5F28F245FF044998790DD5DE765219A26E5ECE3DA5CB15B9", + "r": "2307679F56DF64216D59B615B5E221B1CF322A8526351A26593948E8", + "s": "1DF8AEBAD047F009C3A2429D12F2F03B18185E57D781EE76161A1A52", + "message": "7DE5012344F27069DDCD84112BAC4A50BB5F424E4294EE2AF06F5F6A04DD12BE7230BCC1BCFD30FB6E7D5A57A7928A9E27D10BC71C599D3AA6BD2074EDDEE738242BA3B64A7121C7275EA7DFCE95E811E44D49EB1537E915E60733DEC45859155D28ED8FA36EEC70BD21FF066F8441DA9BE5CC47F4456112BB472436E2DFE827", + "testPassed": false + } + ] + }, + { + "tgId": 7, + "hashAlg": "SHA2-384", + "curve": "P-224", + "tests": [ + { + "tcId": 91, + "qx": "9B9C5189F039648C361FD3780F93038F387CB74CF9ACEE3BFFA568E4", + "qy": "D06029D38B0BB959E3D34D623BE8F9870AEA8E6D85E37BA05D703107", + "r": "186F590A349021975E647284FFA537D6112175E2E37870747ADA00E3", + "s": "51BC00ADC81E64CC20FCB4E38E7DF3ADCF36CC46793B4F1FC590C22D", + "message": "00AC8FFF475D457D2D1272A261624780DC0E450993682B468426C8B62D8544511D06FB11BB7C4E10DC6E79042AAD3EA7581C76B9A670B8FBBD4A7C966E21ECA6169C4F9F0AA09C53C8EC7A4C64E99100BC37D8192C5AED6CA605B158D017FD56BBDEEDBBAEFADF3035A31493DD5F016FA24CAD6B78A7850457FD9AE9D0D2F7DD", + "testPassed": false + }, + { + "tcId": 92, + "qx": "1DA8ACBDC8A96FDDA345299454D8B250A6BB75A8A8A0460B7DF04BDD", + "qy": "69855EE4CBFD006276594E197C67D912904E1CEDC7967B89AE72196F", + "r": "068CBAB9A4CF8D9F5B10E4BA348030225976DC948ADFBA902D5F2696", + "s": "440B82F87500AE8D946DF44921565259A0C1F51D5EF97089981312E6", + "message": "E57FD78740F4DB78D3891AADFE10634C4E02AE4ED79F13C4405F2BF739534CC8A2FBE8F57A5BCA5887000D0B9A52FA165F6E3F2389D9A9CD7452E20B4C6279E195B5FFF827C3BB8E263728816C8816226A7859B235E17DA2F40FB836E9F090AF827A93B175658EB9207505077B9EDD2D88CCFCDC12FB5C2866755EB57DDC032C", + "testPassed": false + }, + { + "tcId": 93, + "qx": "8A9A99AA69444B390028918C6CFFD6B14C695CE56AE3028392017F72", + "qy": "B91EF25301F97902AA3CF198668CE0A342CD480D4A25A4A0B08DDD7D", + "r": "9A5924F8679DA61BB472B3546DD909F3CECC59B0706421BE7CDDA4AF", + "s": "1EFC2E609BBA1E83D43E0BFEBDEBE5884AE4688D37C8EB8DFAB276A2", + "message": "82F7BB7DCBB602F51281DCADCF5D03CD8B697EFDB2FA7AA695BB561CC5507DE0306F1B627AD2FB013C4A81AA1D54D95B807BDBF3DEFDF79E5A3650C7B83E40932CF901A8B88349675D5CFAAA98D4DCE6820E5B05E4A9DA3217D4E6C439585E36F5197FFA3A5C69DB81C09DB8300F7240FA8A20167535ADABF43C05225FCB27FA", + "testPassed": true + }, + { + "tcId": 94, + "qx": "0FCB185AD91F77C0B8A2C2494A590812B125E148949ACAF90199BA15", + "qy": "CA43635F21DAA3803FD440269B80D61991A0742760B344014BC92C7E", + "r": "A31F3CAD82DE13F5AA3D23E20154528A55A01A37241B1158FA197A31", + "s": "9B1A7DC109FB83B27E90B2836B25453ED99AFC263F92F558265C75B4", + "message": "7D013B6421220E3A5EED03E7D9F261B93163575614CA3D7FA936CA58BF5D48BBCC88DFF5A077197215A4F5943B0D4A68CA59C0DCDD03AE5CF6DCDB3B9424DE54813EF4235A2B13F13F3459C327345C85715F7C9EB2CAFAC1AB3A21B46959A66F671DC89792BBC747F772A7D7C45997179045953B9345714AD587DE22730A64E7", + "testPassed": false + }, + { + "tcId": 95, + "qx": "48755A072BED0F0D98EE78118C9FC1DC5A8A1E60D840DCA45D6BB942", + "qy": "8CF60BBF97D9543C81B3CA6CE26610DF6F8E876F10FE25653663AFEC", + "r": "04B1BC0D641A8600F2D0D41F3E30FE2D2A1C2A70CFD6B6689326B3CF", + "s": "EAD4E500B1E5C5C3591735B3DA0B3FC3DB31FF1162942F9AD1C9B39D", + "message": "F78EACEAFBFC47F4FFE312D9069FE14BD7B8CBF2494F188CB38A42AB97E867D2852A9783E3E5BD039EAFA1EAB0ED05781A3392818F9E898E128FD0B9FFE5A3A0CDC3C60B17FC7E69395A90D2DD2A1C834342903B8935954C35AF7F614FF75E2E817F14CD7048BAAB6E1CB625EABF3D91F11FB05D142520E2913754D2A7ED86F0", + "testPassed": false + }, + { + "tcId": 96, + "qx": "54B83ECCA29C4FA4A55D1E8094E59FAF4D0F426D8A9797659AF4290C", + "qy": "ABCD05A2B373190CED3AD94B575362AF29F75A09AD84A8DAB80ADCCD", + "r": "B66DD495FF39E9C0B2C2E125E68E45A3E9A9C22F96F9724D8F06C26A", + "s": "9F9C5823C1A21F99C21772A2310F20C9F2BCFCE3F4B1386E5E18B34D", + "message": "3A0E5B4508F7755D321F5C6D18D964B5C8DBDD45C447794371983CECBDD814E5054708A69C40395CB1A634A98BEC0D82896DCC05EB2D0A42B4F8864254260466C9E75A265BEE2395E0C872CF892D3BF8DA9113C23FDDCC606D6394C0D61A252476BDD7C7E4E7139C300BE2B88D78A649B85D5C7A4B7A24A0AE3E0D6F8B53A1C3", + "testPassed": true + }, + { + "tcId": 97, + "qx": "2694EA381A99110E02FCA4C85E59F4DDEF8C38D91E796419D21DF9C1", + "qy": "22737BDB1F89B8BFA9355A8E58BE433D175460FE9BB7A73FA8E186FC", + "r": "754DD14112EB06FEA6019B5763BD5DD1E079DCCE47A13CC35C3F4628", + "s": "494704B4CEA4E6F552833B684B6C5F461C56773AE0A31CBD3DB63093", + "message": "C8114DAB0C5517F693CFD26A39F3CF3E164B1F07684BD7EAB37963A39FEECDD9FD2077A146453E91009AC677D0393DDDF7A2010CB264C340B394F04BE717905A46A2A377D1C6E01857D16B2C8B8B7EA4C44ABB2F48137CA1974968275E96636BC652024EDD0228B2D24A202E055B8A1BBB4FE14A8357AC49F18179F979B26277", + "testPassed": false + }, + { + "tcId": 98, + "qx": "3610CC1D96791E21812F66D4FA6975A520813C0C2D5D948BCBD74FC8", + "qy": "2206BA1A13B3E8A962AC6A32D6D368431EB1F74DCA27FA8D91B2039E", + "r": "4D2ED49ABCC6866BA85BE340EDB4E9595D60EA49388FF0B316C46AE2", + "s": "F783689DA8213073D36942FE1C332FA61D9171197755BD707F4D24DE", + "message": "D8273EFD415505383EA0360995E433C16840DB787F3EE704BAE703C084FB3EC5AFEC8D3F1A550FCA33C4B65314DAD37AC9FA051B5902CA66665853511F38FDF4F34BE3695EFDBB6E5C347B4AA54E5D0D3923F881EF32109356EC3CD6C46BFEAE0E5BA272E70D9DC27CF44E69952153A32E17BD1EE60C4F95BDCB76FBBF3863AA", + "testPassed": false + }, + { + "tcId": 99, + "qx": "B57169061556DF2D56DCEC8CE21C80E10512373331A50AEEBD834E60", + "qy": "FE3024CCB300D3C675488B8BEA0092C11DA64D197D1A062C8851E6A4", + "r": "6D88B24A1AB6C9ACEFBF7434D1F6AEA4ADF086E3E66FA27F06A4C041", + "s": "3CA89F945EF8D2744D27B5C89F134FD67C4D2CF975D328469774EFC5", + "message": "52463F8C92ABFE3AB49D0B6C82875BDF61BED0E90A7008FB573FA4CCA8E105E2A9903BA1C3B5C8967C3812436B27A9C91BE6DC3B2BEADF8EE703425A417B73C7E076932C5176C53DF9FCD3EAFEEFFE999AE5471CA8E6593DBC8D1889F3C1925022113269C043AE6202842184289C1BFF8C351CD3CB96D813E0546FFFD9C8C21A", + "testPassed": false + }, + { + "tcId": 100, + "qx": "6F8CF7A4ACE6536DBCE03C328DC96CFF39687CB8E215039B897814A9", + "qy": "D1145EFDB326A2A07015923498BFDF6D8BEBDAD814B95226BA07B09D", + "r": "1581138B8EB18F3425866F71E9BA9BEEB28D122A92A3A978AE4407F6", + "s": "1390C248691C21F3BC0705AC6F10A6AA2B4D484ECBCF03F8C849A95B", + "message": "513CD875D2FC8EE36C3D207CDA46B1E68DC76FFB08322103FA713D29130585074DA498061D6A1892E2744BFDACA05175405E6B2013F697E942F5E0EB8E7158B73BCC1D2CBCF144F9E782F29F1B63F9DB5CCC9A6BBDC0D36BD154F762640014D4146661A57CAE42DBC928E1E762683D395744EBA3456C1E9C7299DBFECC0E22C8", + "testPassed": false + }, + { + "tcId": 101, + "qx": "C9086961488965C81084C3FBC62B4B8FABA45D5DFFE41CCD84D3759D", + "qy": "2F537421CE68F597CD6B8B843C503A1C7DAEAB679A86F72948CC79CE", + "r": "B0B9CCEED7B5541A4B10D69B96D3FF22969A91F0E4FE015B6D534E1A", + "s": "96E67D90996A16487C2D0B65ADF92B9A015F2AAFADD1997F5EAFF756", + "message": "346B8A5BB17E99ABBAA4CC4DB51470912AEEAA8AB4EC0BC353B0D5111D890835A0EF3FE8EA1CE712F4AD749BF455FEA80939A938AF970E7354757798918D592E40C1A3B3BC79CBD4275A22C35F5F38CB49679F76B848F644A3FC61B6F00E6D1771D4FA2D20470FA8B06280A6DCB26FB52B68A6FEA4CA033AEEC4FACC217C36A7", + "testPassed": false + }, + { + "tcId": 102, + "qx": "81EC834764717E91B1BC86278531D77B17DB88F1ABE87488E3CAB039", + "qy": "A67302CE156009567431E0BE441D9A57E2AD05F973F703B49F5067F0", + "r": "C20A0F54EE97A8627284CEEA21A3351A16E997A96B4FB4AF5EFB3A86", + "s": "D6CD1669EFFEC97CD141B6C4C6077B598E64A13B0DFB586BA1389248", + "message": "3E5DDC160A377E8A052AF877BF82410551AAC988588F99F565092595582BC305B8A930273165D72AED12B6FA49429234361769EFF69F596F840D7BE2616B9DBC2542B952B6771CBA99BF27B1FE1D03E0EB8601F6E8E84772FBE79E4D1F70EA14C4B5184C237EBB370D52D73E115456225B9B534B8061713D8FDDD072AE2A0C71", + "testPassed": true + }, + { + "tcId": 103, + "qx": "E9D4F5C95010AD3B60B9D90C2484BAE35BD54CDFB3F80CD5D0F0978A", + "qy": "9A37B2EC0ED55CB2AB9ACD3138A4A09E94D88D0D68E93348CF7AB691", + "r": "61B9CC51E05A5B493FBBC860BCD566C41BEB5F421038CC7F93A3E076", + "s": "0311A969CE97EA6281C20718709B633229EA254E809ED7024B2953F5", + "message": "FCF194E8140120F7D708091D0E4BCD1ED74355D273C382D305ABB92C7CF66273ED3F4031BED7B45DE19031D88A4C12415731AA49D144C03C2352BFC95E018708E0936A208D2550828D27163400A526C475182D04FF42075760CD560E594285F8C4317DB010875A8535AA8CD99C200A7A61190BE3F94C3A5E447AA7E7AA862C19", + "testPassed": false + }, + { + "tcId": 104, + "qx": "91F973CF5543745D493CE6A5114FAB8E49FF1F2E2ACF9AB518A51B3F", + "qy": "37A33EAD402F1D7A019A53082F41182EE401ECBA1FBF43B4882B13AB", + "r": "81E88E5B4CDBE1F5F9137566C2A9E983BE026E7FD41EB672FEB78500", + "s": "EBC6D13AED86EBB8C1AAF5FA73C38D58194DF709F9ADDA096B65C0AA", + "message": "B518F62342D8CCB85801624532365F46C73BFC7B5FFD3D730DBF9B9AF75652F79F7FF95B8803259D64912EE696C2D64078D4751A494F99AE747E276875314A87E8F9070876D71B3C5646CBF9ACB2F1342810CC42DD3BF0A6877033A3407CE3308BDB9888F6FE51441752553AF6211EA72167E45961D6628081FE07C71C328FAC", + "testPassed": false + }, + { + "tcId": 105, + "qx": "6F78F3CC1E06F894DD99F8C664002CF210767840EB9F38F1E56EB236", + "qy": "0226846FF0D1AF1C6FD56F739A03BD72B3CD5BCE1B65459957F20214", + "r": "6FEADBA46DA77C9A4FAB4078929DEF705CAFB0E215F338DC1E8B4781", + "s": "3245FBA1E3121715D07310A41DC48F7D840A7E63CF7252284E7F9631", + "message": "E9C1A05CB27E05324B7BFB6E862F4A3A58C27488D8C42CD2E9585705BDAE884884023EB903B419636062029B7FCA9890D3E8DE06A54E39287AA410CCE165944E167B391EBF1D2336C919D611ECA777FA24396A52FD9FC3BD21FED727EBE37C3774EF42F6C4BCC93E3ADBA6680C5A2751CCFBAF5E9C093E5972FDDB895C5E1270", + "testPassed": false + } + ] + }, + { + "tgId": 8, + "hashAlg": "SHA2-512", + "curve": "P-224", + "tests": [ + { + "tcId": 106, + "qx": "D47EE6FE230AA77C6372F80EC47A24A92E29BC8C92AEC877567DA6D2", + "qy": "DE98F4D3738CE2D1AE9D8AA141FA0B4D4E27837ED6CBABE744467F46", + "r": "427AC54EB4567950B75E958F059C372923E195A09C27F4A6A70FCD55", + "s": "0B97CD2C7B695919277D41420A5AD4F5CBA9FB801735DE84AFCA2A67", + "message": "98F14178CF0A544283AB18452CEEC259B5CDE9C9335E7E99C9EF63E55C7CD47DC8A2F1EC290C1ADDB50869EE4B531C15C14804131A8FE389DE6B85EAE70A4AEC996498490383A2BAE1045917E85D044FD94BEFA7696EE160EBF570CCC6FCE10F1F514B50A2F660B0EF6D82FCF0CF7F4F374CE6C9196A3DE5B43A3F6434922764", + "testPassed": false + }, + { + "tcId": 107, + "qx": "8040DDEEF02681570DF678E65C757E574E83E4237E6D1DE890CE29F8", + "qy": "045EFF7710AFD481190A1D1B426A1BAE98F765C5721598B94BD26F0A", + "r": "D94EB4364F069B18E56C3FE074368A87AF2F7D55178E4000E18BB699", + "s": "D76C7FF926ABA6672CEBE5088E39E8D5DF490CB13D86531034A6F9B0", + "message": "F29E25D556F3BDD6C294DE5C833EB263259241979A207ADE30F04F447107D4B01DD67A435630796FF59BA5056949C989118EE22D63BC6F6CE27B05CF63B371689A47A64CC7C4F208C0A453098D5D5935C0B2F7E36F6FF7C32242074838391449A53363C27F893C0971529D5B8092AEEAC33E0877FC169BFD0A25D603CD645A5D", + "testPassed": false + }, + { + "tcId": 108, + "qx": "1ECA8700C014CEFF63B8FFB9FAC0ECD8CC50C21347ECD91B38B8BDE2", + "qy": "1AF46F7668A730DE269923F4C610431DC6C2B1D16052EAA2009C5193", + "r": "41C880BE7A71690991CC08BF01F7B50920E80C86CED54A253EF0B67C", + "s": "E2024B5B534B577EDC139B7F8160767C0C7577866B564AFCDBD9CEF4", + "message": "FD390554405E7C3ED281575A26D64FCB594D782CE2E74EC90959ABA0BD8DB865ACFE156120B070D3C83533CE2B7B973A7D8D00668FB96F139A2604B0314574064F82D6BD11CD5859B407E652FBE9EF0E0ADCE5319408E883BC262E790924DAAE872EB81B8AA11662BE946F783C2C39C99F0ED50CF3FB35079E615F273017ED23", + "testPassed": false + }, + { + "tcId": 109, + "qx": "3D2221D132C7594529B4ADD6809891DEE07B6FB4BB9FE80B6485FDBD", + "qy": "1279149355A05D48460D09894203732C68783378A37BA0C0D26D75BB", + "r": "8F8EA4F41E97A9A6677E9290BA42D08C9882EF63383C9C0A9DACDA6F", + "s": "E94129323D191482AF6CC7BE0F7BAA5F8298F7CEF6F2F23D1A30D31E", + "message": "6A4F934A241A15FF233F2F9707450B1AF631B26C3DFFABA50B44A0F25BD6ED33CEA82392CB03BAFC7057EBA0A1C285814CABAB49D4BB0E8EE25E4DDE1685570FE0D0598CC658C5A17B86274B8E8E045923B778B3E6CD032735EAEB91A5358297A3792EA51BA839C45E9117D8E34378CDF0F314991DFA890F767535FF1D243392", + "testPassed": false + }, + { + "tcId": 110, + "qx": "FFD0A17E15A8D0CAE22CD22C9A010FB09BDA8B4C85B32B5EC043FE1C", + "qy": "C16F263B727FB8A785B9C99DB4FF1311580C30CC0EE6C9C20D6C3A78", + "r": "7917AA755E302FE6EDD8D1F8680DE28D583999961091B142B1D95D2C", + "s": "E7D50D9374A33CA123BC468FCD8C9418E2294344B58CEB9E3C085C03", + "message": "F11D3470AA9BF9E6597708D7FBB67DC10E64B317C86FBAA58B2F598D95E1A53CF8746007A675BF401ADECA73D49D97419B15B6B0D948425125DAE56ADC14C523EADD7493F819D7C4148D600BC0DF7F709935A15A0590196C0858207D3AD4CE7AE98B53540D31773D70BC40F3B54BAA45581F3EAA8EAEAF3D3182C56F56488055", + "testPassed": false + }, + { + "tcId": 111, + "qx": "FD8E78C30F88E785B1E953BBF65320398E041F45D4161BFAB29CC537", + "qy": "B1004CE3EE7BEA7CDE94C8E3077A2691ADCB423AF72EACC072FB422C", + "r": "693FBDC269ED12080A5EC47FA1DC32D185984B577ADE9AEBE3FDCBB8", + "s": "64BB947E72A1EE68DD3A1DA2C28A76E444630A6DF529223316FE320F", + "message": "F971205B9F911647C6FB6D87137B005882DCCCA5739654FE06168DBEE5D53828C11E911CE051641891F9941A54222E2DFF95F3761311CE8A8D01AC03A9A8405B15C1AA41A900EE7653DFB64121E1FFB31A366626304EE96B603B1CCEC8B7F8483AB5FC53D6486466BB24C5FD7D2EC5A9CF75BBA1F07B101214808A0E66A99A18", + "testPassed": false + }, + { + "tcId": 112, + "qx": "39F952EDBF8B98828039159013D5EBABB50825E1BA10922BC00914D1", + "qy": "B8F1BAC67C5E56FD327BED7C4109A6835BD468037133C9C476663B6E", + "r": "7254BF0046FB89D0AE7C43A3923FF39581BF1E46542D441C854CE9C1", + "s": "DA35CB76B9BA2D48922214A627ADEA8692EB2C72359EB4E1E6EDF16D", + "message": "7D256E15786BC979A678FE40C1D2DAD5DE59153E619D4A78724863B4EBDCE686285699449B00464072910C095E535C9CDBFDDE1A8C8E0817690A16BEAC3C0BB2825D931D6FB5D3BC73A2CD6AB5B48288070FF1F68F68E4BC7409FA6FBDB9E240FBC1BEE0DC63ACCCF36D82704A7C216479D4778F7D0774403E6F801C82C72AF6", + "testPassed": true + }, + { + "tcId": 113, + "qx": "846AECE1E107B09FD8663B8B207E0C59DB8C089544E64F8AD81B6CD2", + "qy": "10371BCF16E8B89023F096D69C72B5964E5150F2F674E13517D057B4", + "r": "A7886E46A8F719B51E1037905D3173BB1C0A17355C26AF75BF124F62", + "s": "FC267CF48D5BB26325CAE0AEA770DC359100C2936264F3D6EAD77EC0", + "message": "E180944137190E94E36A54C08A09938AD9A2DAFF8765C651F9E70891D23177170E4802060B8B85B8AC49D2FB36C4074F1C1E039E01E72AE4879FCCBDD2BADEB5668B849259B0A8DD41DBE7B2494EF1C6A4DA4CB0E6DDA392DA5CB6B369C69393FC1C49278BAC2A68CEEA7CA47A05403E523683654EDAD2AFB30F3F831876C8BE", + "testPassed": false + }, + { + "tcId": 114, + "qx": "F9A8A5F071B59AB06F213F8FFB819760DE0106EC112490172C2EF924", + "qy": "84DF4EF61F6546932EA6CF584212D9E2A601C48F9BC8BE1193FDF1FD", + "r": "FE68C59CB6DE4162EB6A563DC9CC0B1E4BB6F3020F4C1E53152E20E6", + "s": "378333ED0CE7A5F6243DB90126FD48F64B0DE0B6B75BF7725F93F7B2", + "message": "08172D5FD5E6D188F135BE0D21A987081955B66AF746F4F1829721BF51FA394F4A7A6D23E8391BB90746CE7CED50E5B70A51989425FC78763A1699F0A0D8CFBFB1AB5D0660925AB1EADB6670BC2F071B88C19720BAEBFAA780CEB542EB05956DB78AABF46C6E79A271528020A4F944F05984F63546864A5DA0C975DA35CB036A", + "testPassed": false + }, + { + "tcId": 115, + "qx": "901D0144AB60E8B8F9F1D9CCEF797BB9E8BDC67CC05D84ACF54DFB51", + "qy": "4373BFFE69FAD34539B24AECCA329BBC803760F5C9D301D2315CFAAE", + "r": "663BB4ED75F952C8DCB4E9D186CF717A4C70F769C5699EA9E0603B7B", + "s": "06901CD0425469CF0ED22BA3A0A06EFB2F1C9580634708B57ECE8270", + "message": "9261D9DB22948D4D68078929D95BF40C1928A503CDAC72263040EECDA1063FB0C90C5F00D39F80C13B49E4ADE464A70EF5CA48085D4083F161AC7AA256C8974CB46E8D806AE9D762310344519ED4D2ABE245963953F31F568CC9E9AA01B1C47F9B8381B71089538B039BFC7C9710BB4B577C531B4833CF35269E0ABE75DBFD2D", + "testPassed": false + }, + { + "tcId": 116, + "qx": "51F51BE5BEEDF22B6B6299C6155D11CF73A4FA2BB2C0087B0F38A11D", + "qy": "45B9A93DC05156D90EF7B1D1E0971AA2C9BD13F006CF13A9CF79CC07", + "r": "4A7EB25A95C680A2A456D6DC394E80F12438DC0DF9039799A6BC3BB5", + "s": "F0872121C1010F2D5A43F6B314DA6781B4A7EA844F51D6C724DC58CE", + "message": "91C949C3C21DA322D3778F71F994FD668672F7DEFC2DD50720650A60FDDA9F1CFCF8637650EC7F2E1849D1102D1DA2A73F67AB02D7B9BEF43F99B0424BBB6CA487BC8E9C3C3CCE3275CF97BA2214A0D1A8561B697F27D98B94A0B31E1FF4FDAF03F325CEEE4BFE5AD12B2AB1445294F3B7CF37486B6F98AD8A7DE73A979F5E9F", + "testPassed": true + }, + { + "tcId": 117, + "qx": "EEB39CF10789D20C49990A6317DC5FE61C2166B5558FE8CFDEB1A325", + "qy": "6C8699D38EA50631FAE61545C1F30B851018FAFBA822D9B6F144DA3F", + "r": "FE66C30A1D4ACEDA45D9E67BC5F92067ACEF8F3F4B5F1CCDB082178A", + "s": "7D4198B7175A2DF7A516345450FB3787110AD4B4E23E4FB578EE5F24", + "message": "7FED048326B63E026B39154C7BE1678C1EB7860DD81017565A1EDE1772EB50E37516E53E7A23E9F2723E6031642DCB22B5CAE1F34EA972642C7FA610A8B141CC6B7A7A47041D5600ABD4B74B7443D6012E87C9B3B8BB5DEF5DE95CD12395C6298AD5753B2EFAAA7E7D99AFAC99D04D8851C9A56FDBCBA2E0B6A841AE9BD39A5A", + "testPassed": false + }, + { + "tcId": 118, + "qx": "1108BC58F8D529320038E19F5F99E0E292FAC279E748F74E04952295", + "qy": "A5158989D08844814FDE0EBEB330402B4E0F06A998FC9FA7A226E2F9", + "r": "1E9F5CA8DD39AD99BF47C81FD4BE65C941C302218DEC1F06471676D6", + "s": "9A9B23E6AC2132D6B80AAD02D974BACBFA1EF808139163168BEA979C", + "message": "C624CF78F56687A1DE2BD859765F232A65BA1CB291B1C31D224B27C54037D4034679E4AF10F74FF2474699DEC13747CDF9E57C5A22A321ABD3E0704559CFE778099A90BD2D1D0FE2143F55B35C97FE9290809428AFDE9ED73712CC20D964329CF9F675BFCAD74E8E0D2C38C07A58BDA00149A98B6CE16E7F5A5A957BAB1D0F4D", + "testPassed": false + }, + { + "tcId": 119, + "qx": "8AACE3DD8ED12CCF51425A4E8486FF6CCD697E6FF3D9596D01759FBA", + "qy": "D52A86A2966A5A072756F8AA306120377EA019E09665508073052D56", + "r": "5AE1AFA4D29005FF474655B9E82541017F47E0A507C8F40B6B97FD5C", + "s": "F5625790E57A030203678525D0F974B8F7D4EAC5E8EA3CDEF568D377", + "message": "4177D2E23A9235B4C0236F41B4E4DBB24CDDDBBB5A1BC0A9FE99F56500C5FE5723A6C3923C2F5E387667254250BE0B882A52243046778D05090E1199CBAB1CE666C000BF6D0505710D2233E720CAB81032C0111DAB64172365319741A06C5BA94F460D08CE3E483B6FD0945E9BF236A14FB10526556B2C73C8CEFDB6417441A2", + "testPassed": false + }, + { + "tcId": 120, + "qx": "5B513A60202FA9033AED290D6186813713BAD5C14EA10697A4307201", + "qy": "81AB3BCB394F3FC73B7BEDACD49A676D50C55966131FD60145728ADC", + "r": "2C1F6B642F0B3E43BB6F8321C8FD64791F6C0FDA1C5A9AF62461EA60", + "s": "777C22609570A830FD6DC48378111F5D7B0E598B6672B020883070ED", + "message": "27C3C7B7A0AD847F2150510A32C90ECB6615AA4FDC283DEE6E7325322180FD836AE4088811393BC3451DDDA202472F68A7E96F5F95B16B2F4BD8F1DB71C99DFEF254516132B5B4D6743F01485788C75F4E96FBBE7FF0D7BC453A3EC510B0034666352BC9A77EFEA3A7EF4F6C6DB16A899E018B741003341E1EF9DF31585CC5C4", + "testPassed": true + } + ] + }, + { + "tgId": 9, + "hashAlg": "SHA2-224", + "curve": "P-256", + "tests": [ + { + "tcId": 121, + "qx": "5A05F52211B83C5B2F81ED60CAD262C085F585D478F86C2F4C62C343EA75C47E", + "qy": "630DB5DF9906C553D159D2431F66A819F350039C96FE8A3764ECD6163273D908", + "r": "1B73C64ECD220088BE0E1310A2B5C13ECC18762F45875B27CC5BA42D19B5B228", + "s": "FA487DEE9237F7216D351F2C902F6614E5D56A06F0DB4CD215C70FE5EB2E279B", + "message": "D4F62B730290DDDE520B33CE7305F9D2CDD9F16C6B371409099A90111BBBF976702B984CC31211F7B5E47B83B1048D34E5ED9148DA10506D42EF86138793C2CD8EE5D3003ADFC05E21CB7DBCA456F98FAE17A5DD88885B432BD22B847132C232A020DAAA943B4C8BCB1AD036547C406E74F74649C662ED6890673B866B8B78F1", + "testPassed": true + }, + { + "tcId": 122, + "qx": "8E605C3539527C279D1946C56D20019A5E24C59EE6BFE8796962EF42C06664DD", + "qy": "9DBA002B43725802E3F776B76784327D3E2BA6F5ABA18EE3BDECAB3438F883D4", + "r": "79F0E0B28033C17F26422D00E00CACBF3571B2D73A57E053AAD9C1DD687E9232", + "s": "02613AAFC0BAFFB4520DF6593603B13705369B9ACF0912B8C49D470423B14DEC", + "message": "159553830634F08635752A952667251E6230D73F513C2CB5E6DD5A988242B596EAB486898108923064B3A3C0AFDA340A0F04C9A69DA93A9C1ED48B99645439D935D9705A7235232BD674E88CD84B897277BEEDBB1BEA6F5A0FF9BEA43368A54D3F7C0B394DABC9FCBFE4910C034A95DC78BF0209A279554112BD053C31E21067", + "testPassed": false + }, + { + "tcId": 123, + "qx": "E035EA60C4A6314C4751F22DE40F5261FE6B78D52D63D8655EF9288058214DD5", + "qy": "308702FB7F85F34FA330418396562FC39F8D7D341E725C32F1DEEEAE296EEEEF", + "r": "BD52EE1E8E06D7EF2B0CEBA40589EAD9B315073687D7F28450CC8E83CE1F5A85", + "s": "24228736DC57E7D9CA004852972ADBD34664FDADFA3CBA89475FFA5E79DF1CD4", + "message": "D31995658AB68A0D25DCDB5BCA6B25BD8D351E02DE452233D9143988A6744CBFD1344DDCB94697C85E6E3BBE95204039DE50A5AB99C0BE21F54EAB227FE87B619B707C0AA4040D32E0B7C39D6618818536B97122D6E8304E3FF1E1C778777F210BA2D616A577F250727C93C90EFD13D715249AFF0A860472872282965580AE73", + "testPassed": true + }, + { + "tcId": 124, + "qx": "078F30044970BDD6AA506A15D0455A0C41BEA7DCB35211CD4731306B2438BCD2", + "qy": "DA0A21A2A239296A3F2D5AAF55444E25C99BF50E45FA654517802B5808FD7234", + "r": "3F022FB98961F5C8396EA20AB29A53F603443F0D1AE0FE95FD51931A04E3CD83", + "s": "59510E99CF86CC1DF1E28055FD28EF8EE56FA56B67BCF65B70ADC16EC1E58F72", + "message": "1218E6D618FB5D7E9E6EFD03A9222BF4267C36E8AFF559E297D6DC39E24B3AF1712C93767147E1B0BC2684D6E90B171AA96268BDB89B22A68F571DF9AC1AA52345E70FC03DD5578E39EF83D19BE83AB5D08854876F80D880ECD04CC8D61AA040F820BF24C1E7A3FDEAD83D901B0E76DB20F3144C5B9E44050BD0A8E0D3416677", + "testPassed": false + }, + { + "tcId": 125, + "qx": "90FC261B1A7E1ECFBB90B329243AC937E9960BADA4E024C2E257EEAF52A5769F", + "qy": "F647F399EBCD91C21011B21D69BEE5C95C43790DF2E1344648C069B201A871D1", + "r": "FF67D0AC35C6F085AC11EBB92ED7250316A133ECFC83BDA6C7446D3C269B8489", + "s": "8FCA7439C4F829648E3DE5E8D1F4243EDF5EE8DDEBBF7148C1022B88647DC97A", + "message": "6FF26BFF61774458F16B05727EC7D150F63E73A75D7D7D9F602AC2E418523F6F6A40D0E7E500162F0B1E3B15EF227F6A0A832EEA93BF193FDA500077A650772D81F594FD31DCD42529076776BC58F060A269348F7FC064FE3E02C3BA2540367295F86DE08221D43E13AEABF8BE57419E0A25B8DDC20D25EED5171F061AE7D3D4", + "testPassed": false + }, + { + "tcId": 126, + "qx": "3C9DEBBDF74BB441A889E8773F5D5B07F084D6D24A8F92D0ACE2613CA43C9548", + "qy": "6E56156B194E69DECB8B39764ABAC5F05B756B91205A8D64DFB04F9688CF44D5", + "r": "3CC62C5551F21D5B9D1F4A9853BCBB6AAC75F35128A36F3C1066E18AE235078D", + "s": "B6ADA893A51BBE080D3F17071B344AF27E80E4A4A0D2BA776DA9CE4A167AD85D", + "message": "BC3F70460E4CB3E3F34F0C0B7359B67AE112258C0D312C00D8E326167746F806AF3C64119FD63B48C96A73FA3F36A501E34186EF04479D2051101D4A957D4E67494B42195B9ABB670229D4AB527D10F52EBB93C6AD4252F255BFAC5B3E3D729E15C5784F2BD4BD77083331563AF3E0FD6B5B88071B642CC29B6EED1911C49B34", + "testPassed": false + }, + { + "tcId": 127, + "qx": "0065F0ACFC523A29DD6F5F272364AD0C6FF626DFE0970976FB3E76CDB01EF7EE", + "qy": "C369BB555273A2D45B0C0205EED987844DB4D52EA86C5C00AE4B4E6FF7C312FA", + "r": "502F182CCFFE155CB7A989A9B2FB4E9AFAE04101207C14067E2806304556BC1C", + "s": "12B4A291AF251107FACB170F8367C80155A281295D486C46DBE1AE6F0D0202AE", + "message": "8DCEA7B3CF9239FB160123D071458AC36E2F414C85680F7DF9161E671719ABFD61294499FF2318D60EEE6124EA245DF236BFA75F5A7867D268A6D6E76947E977250DF5CE37C183158E9CC5EC3B7723D0FE87AF0090D10B57F77C5B8339A673D3DB9C9B0EF45B7AE5C0383065CF5E4FC329108EDC1BC513C11BEA29B2A7444EBF", + "testPassed": false + }, + { + "tcId": 128, + "qx": "22451087415D5490F31EBE0B006BC764F8D914F34BC79D9B5CAAC0E1DCDE445F", + "qy": "6DC270A7CF90EDBCA24A12D91E8F2760F33B74C8DE60BFB93063D3F13E203F75", + "r": "F60770CE364782774EE4FCEDC87D5FAC2E1659C48CF4161A08E38B7A01E59C5C", + "s": "A84C703485DD6D5CFEFF00EA40844F2942EE19FA4D86604C4410591C990BC973", + "message": "AD3D25A4D8BDE2210D9AB7F02096C3D4489F0F2C496B0B0D3CAD2DBFAD1A76E4B53971B9FDA354683440BE8832F90629C5B54888D196491FF622482C261662CB23E9EA26BF88899027E1C2928A022F84D954D60FE699CE9F60314187347C4AF7D3488A627EE07D9BC52E219F35A95038A97CA8700E3514AE4C68073D234FBF49", + "testPassed": false + }, + { + "tcId": 129, + "qx": "8E1BE989500873926D356E32F7E9EF9862FA12F09CE71752C0844FE3210C4077", + "qy": "27E55A4F3D5698DA931B6F5724E0326D8B04D9D8DA9D9E10E571C648EDBCCE5B", + "r": "E256C55EB1F081396BFA8D17A4EC561BB0F96DFB9E52AF87EECB63CD213133AC", + "s": "5B4A4E415F8DCEB6DACE203435B3D31BB6DF49D6689AA43119DBB24ACE4E4426", + "message": "5E78670F14D54B9E5903012BFD0526EDB239F5DB031F2F97161EA2D4044329A239A0C948B0199447D87A80C10D927C54340454976C8E4627C11828A81D2319D9C40FBE795A5BF107D162694947F0AF3FC6BFF81D1DEEB1F71A23A3A22065A942C4C7B2BDD242132C2172851E85604A65BA490DC665DDA177CC90BC6D87137956", + "testPassed": false + }, + { + "tcId": 130, + "qx": "F1B63EEC656D437F5781145784D84EB2775DCD7DC235F0B6BD2EAD5FC344F6A3", + "qy": "C49E05A8AB8034A858700877F04B9116897E690DBB0D3BB2175047076F68711C", + "r": "C2E165C02EC36D50A5DA52DC783F2B4D272F14341C6A72659E2617BCE823840D", + "s": "DCFDCB18000420E2ECEF56383AD393AE2C5C8B7DE9C2B6C8FE76D0D5F4713651", + "message": "59A0356F60F6CE33A152EDCB75C50F888804FC1716A9BF22E246FB14EA73A364B8F6479FF8DF8A7629431F9BA65AFD65ECAAC533057C56A03F2E4FEB6DF777C0EE9325722AFC334D3702936C49FF503232690B613491F8DD68719B2C2DC279BDB0699AF68C2FCEF80CF9C5FD59BE11DB5A7DADE7B4272A888AB1A2F9F43F47FD", + "testPassed": false + }, + { + "tcId": 131, + "qx": "2023A1A336F3125D4435E8D759CCDD1F67001460311DB4BFE4C34C11D9A1847B", + "qy": "384B73B963C0E9304E89ADADB0394CE8702997D928709F3080CA2B4C6C136CD4", + "r": "8146FD48A8E7817F310E1827775F77AB94C8635A5809E020DD61018C3EFC903C", + "s": "0673D0A78BA9588E2BD27E918FD572966B22086A3383BF5E4BD87F1A5389AD28", + "message": "B8F8811D1372E95B6914945F09CFA655711308AD518D4833064458C2A421BD3FAECF1967F25E4C5553BC41ACA37BE561972BE824E31BFCD260747B60C73D18AAC037DBEF313D805937EBC84D5FA9A782A42000BCCC7E7789BF4AA573B884401C0AA1554AFE8A8297E8B5A25AA5BB1C06E733E4085A224C1681D979B3D5690EDA", + "testPassed": false + }, + { + "tcId": 132, + "qx": "8F2BE72DF526E12DB13CA1B99288FD1EB9902E23BAD1ED8C39554C6F35A2F573", + "qy": "37735DD83478EBE6F195F57E44F2AB7A5466B9167B135569FFC5928D0ED8F9CD", + "r": "7C8179849619D5CFA9EE50D2A5D3C1841796152B4447BC20160514734C7A964F", + "s": "A1A50D186F598A709337A6864F704C027C6A59F0BE54C38E98948C5E19F866C0", + "message": "8D4789510625489DCC081850829FC68AD1605EDFE186DDEB38BA8D582D5DF18A2CB5EA1EBC9333A830F5924DBCD53F65B35E8AF6618071786645E439CD79925F56D426C1057AE95C57C06052FE44311CF45BD2BFBC485F5377EF99A5EF8A6891479192EDF233C1851E473FC0D4E868FFEBD3C4360AD9F0E9C118F5C60007A396", + "testPassed": false + }, + { + "tcId": 133, + "qx": "372C62255287122AF0F261B28EDBFD2467DE1D944EDFBD1B7C4FA406FE4007E6", + "qy": "06689ECC1F51D45581D75D724C46BDB6C24484F396FD5B1A520AF8DE772F2A90", + "r": "29D875C03F419FC4F0E660C493BA8281515FB6029D1BBC06BD92627D1BF778DA", + "s": "F608464E0708C148104839CBD8294BA3C8A9CF880B79B18BC9D3A15E1EC4E771", + "message": "8998C534BC1162C0B5CD7C0082CC37D3DEC85CF0506D80A7F0A570420F84374BA3CD2D33F478B91C48CDA3985E77305C8223AC197ED126B6CCB9AC752EAA8D5865DA77B229B9F68AE2DBC176234C619D1B9FED9DDC9D261A7F56EDEB039BF70A44C6E4BF144BFB6FC088B6A5ECA50CB9A4AF1126B5D21F499A8CFD2429B61398", + "testPassed": true + }, + { + "tcId": 134, + "qx": "968A82480AC8E674AE9CC2812A32FB3A98AE5BD4C6D4949489D71807CA003B17", + "qy": "59F99FC8D4A2A69210479A6F06164EA4370FF3D52772F3B40313B09E23DCFACF", + "r": "10BAA86D9B96007BC88482A8C1529E738D4C86389BD2BC0EF606F7FFFC74271C", + "s": "8EDC4E0CB0BEBB3B56AC0139B5E332917F31DFD01D7C7442809C6B6AF1FFDE5B", + "message": "F81C8174E7A374C22E37E94B3AFA7B03903ADD96D5E1B2C68607B9FE771552883AD921C680A7D22AFB0AB669081F0078A65A9AB75419F21AE3011CB9CD6FCCE4A1F26A3B72215D2BF231AFC7FB95C7A2C1876E44FAF37AA51593E8DDD2C45CABD1B2FFCFC1C2FF149E95ABCEBE08ADCBDEEF7E2A1B9E96A0C12CFE7235FBC09D", + "testPassed": false + }, + { + "tcId": 135, + "qx": "34D3265B0FAE2AA75DC82A4F6F190E1BA9F4505EAF4EFEEE652C9383197C6CF9", + "qy": "44F4C19A66D87E35AA0B348F21FCF6BE55688E41450B84DA0FD1DB21BF39A527", + "r": "ED2B46AFF80DB1FEFBE5C834F9BB79B849F4F3D1AA11FD2189BCFE8AFA964958", + "s": "1BBAE4B41FDE1025AB4FD626C54FBC1108304F0E0EB5881C52FE62FB4A4966B7", + "message": "2C7D1FDBC5E708FF012284713ADFFBC8CC8BA1DFD7334D86C9AA1F197A64ED9C7D12A440734D30CE4B86FB569692DA73935034AD9407ECD1BE9229F6B65486FD791B0414538E18013935E6C4050B19F2A0D56E016267B78126F8CF8B4E6A04324B0062B0857A49015196154B8913CA8D1E7760BA87D1FEDBCB898E9D9069974E", + "testPassed": false + } + ] + }, + { + "tgId": 10, + "hashAlg": "SHA2-256", + "curve": "P-256", + "tests": [ + { + "tcId": 136, + "qx": "C16451890D40652602B25F1CF86AA39959DC9749466E7FD9DD18E9273C84F327", + "qy": "66836E8B299352403030EF08DA4B8960264B2F73CFD4F9C7B5AC0E714C22FAB5", + "r": "19FCF281A77BA5E089C5B518E691634B82AF76B4AAEEF2862F0075E8DDDCE5C4", + "s": "70FBAB467B0DAE999D8642AB8FBE37399B17BF0DF25B117DA341AFA6ABD75D02", + "message": "5A5A51B6B72AC4E9B4E0139504453A0786ADAEE2C0B0CE06AFF4AF704DAD2AAF944E8CC9826C3F9B4AC0E628E06CCBD06C569231A81114E724D322F6C50EA99B09F301CF16A65D18DF57F3D597F2DAD2EA757FF64834A3961DA270E0851EF23E957E1ABA3EB545EB4DDA654CA7328A94B3A814B84C3F1924AE40845B92AAF344", + "testPassed": false + }, + { + "tcId": 137, + "qx": "B17B38F09D48F011B63D36AF46C5DDE8611594CB63DEEC8B7D4C6D868A5DD3FA", + "qy": "11879D54F1638B83856CDD92039E33E876B3D90D9350BEBCA9379767BF87BC35", + "r": "0CACF6610B8BA196B582EBFE1CD30584157FDBF5B74D3EB9438AC8B640436D90", + "s": "DBD023ECDA1300B5B2D86F661C1F46D9820099189B7854AF2A39F4748E718F50", + "message": "968C5AF2C55CFE847FEC9574131D02EC6EDBA5292BBF8FA14F76F367F8C66590E242905BE31A29D566D782C10622AADAF9F5B4235677E627E73E0CEE32645C02AD9C97BEF8FBE222FFFCA012E777E05C6425CB55C8132C79008957C63D28D207EA6939E77F0F00C44B7D3783F0E7B03F044A16046B466CE78316CDF9C02D9F36", + "testPassed": false + }, + { + "tcId": 138, + "qx": "8E2B1C21628D6F02EE5E7D7273563E3486564C3737972DD5D794A01170E33ADB", + "qy": "05D0B559221AF413DD3419EFDB5281A06B811D1E3CB394629C96687D7879A98F", + "r": "443C68C736E66DD4CE022A7E08C99689F2AD23C556275B44292DB425E1B5CD9B", + "s": "6D5038BF060A6CF9B9FB73C268B8A650679E576075F5F8089B7A58F236376215", + "message": "4AC14B84922FB9362B98917EADFC4F05E6F7E2AA13C3A1C7900A6F7E6A1967DD6F871BBEB4BC10505CAF8D7A02F995BC3C5D67C0D606D46680FF41A27F16E5B913947842B88C634EB7B8B1E82921C6D1ADEF954FD37A72E7CAD44B170BC8080E97B79BC9CB42ABD1AC3B3A48EE9F3ACB164D6B88247C71AF5D4384645D108AF2", + "testPassed": false + }, + { + "tcId": 139, + "qx": "F392E3E0E003DFDAF1FA0FF21C056756562B03E1D9E4B54D0DCDC757E252CD7B", + "qy": "666E6FA4CBEFAB9CADB275E38BB87F96F27FBECB0DC4EBA6861569EA01B79CF9", + "r": "0A3D02502473DF54F98735DC7BE323D47F27E8F447FF1F925129E32C1A656910", + "s": "0404F2277582123E7E59E65BFC76890B15B5D8152D3D24197A427E64FF43F8B7", + "message": "7061A905D013565D3C3BDBD2D116D87636404E7B63E13CF63EAF5B28255E82EF9C1765BBE948AFE7428C053E3A95AA4057D134431A7121D51C934E7FFB98EA427A16687C5630476B8469EC85B6598A8D2F56C00FA1FD050593BBEB31B333502F11BC97C523D99618E1D5412076B59108C501B34CC7FBFE11DB8B55ED482940C5", + "testPassed": false + }, + { + "tcId": 140, + "qx": "11C2589EF30FA4CD276A75CF971C7514CC3BD6BBFF2D3564804C511CBB5A1DC5", + "qy": "D356BC142FA9A9EE2B3AAA624275946856927AC4372ACB1B0DF67858FC60E568", + "r": "7D2E8FDD863EF9F9A482FEAD0D644BE078034C0E977EBD57BBF75819C947D350", + "s": "3B0D8B8EA2F6EDD035629B500D0FA71B975B976B40490A7788DC6C81AFC3B7D0", + "message": "605EAE43A0BA90A3D820671DAF5688E9263E0C63C7FFB4A34CBE7B686DC1417F3DB2615DC8259B07D55FB1775DC56D08FF3E18D3D773BEC1BC76683BC166028A98C5E21D5E88273F12E4D686C1701AB5FA3CCF704BD94420CFBFE5F065ADEBACE573E8777B6744CEAF64AC1C938E81A266CEE9AC12E8FD803C5D85A357D7A3BF", + "testPassed": true + }, + { + "tcId": 141, + "qx": "15BBE488714AF3B1A308102BA0B7DE3135E253E83A28D7295465A7DAFAD1451F", + "qy": "3F1334AA651807C88B310774DAE6232B16F6A74373A8BF55C25AA1551214C68B", + "r": "6366F183EF524EF5C1A78DB6211EFFAF3073BEC094F915AC92FB66EE257FD10C", + "s": "1E0DEFDF88127E25078C174217F030C63E5A07D5DCACCFCB7A3B1A3C1AFE820E", + "message": "2C4A18E7B12344F17A063A36EBB27F429D1022F64D837DDE59506025A14219C7F9CABAF01FEFB1ADAB078E474048BE9E4DCE06D3E7FEE3E63A37D662D0EFF9094D7B7FAA50CD11A4E40AF4316AB8162FB331159A4C674279750ABD309395B79F38F8FF577871CF6368523A2A7759F1F86869F8888F31014DD2F71C20307AF71E", + "testPassed": false + }, + { + "tcId": 142, + "qx": "81556BE3A8B02B76C1C445DB1584B27C8A19CD3F5DFDEB1AD04FD90B55D8394D", + "qy": "401E6A397C461A723F76843464F61ABF0A24F01ABCAC7B408F12B9AA7B287530", + "r": "FC6295B6056534966B4995AB95A20F372A942B7A37E111CA0726CE15799072A8", + "s": "DDF098600C2BF3180273D21093D11840EA2A015E541C0ADAD44EFE92F3C1F83C", + "message": "E0D8D4E9D681E65A594A51CCB8F60ABDC20C82B215973A7FBF83B9379E196C85D482264607E520F6941739B6488D7B5377054852AF0BE9061EDCCFF6787B7192009A5A344A82C20A5F31BEFE9D595B8E7A32B20FAC6D1F2EB670C8CAF07F285316D70FA31CF5852A15F4C0CF399F77E6A6BF75A0CE876A103E762AD0ACD8FE1F", + "testPassed": false + }, + { + "tcId": 143, + "qx": "C45B30CD5BE8B85153995FF90CCE30570D1DABF41C5EAE4F30EA02F170246E90", + "qy": "0A089E77F925E043DA0B43FEEA57F554D136E403050D5B7D06ED01ABE56AED4B", + "r": "7CEA702ABE124DBFA7DC4784DE413F2CF396601656DB246362170FA04984A3C8", + "s": "3C0352F267139A6EAE4A16FEB6B5E82A5BAEE2BB448A02882A5BA3B8172091EF", + "message": "46D49BDAC2651B0A56A76CF736B55BC925FA97CA8A8679A68579E7DDE49352BD45F9E1D17A13C4761ACC1881207A047C3DAE95D58FDFAE27A516ED86DB36D76F298D723B329977BBCF26A939AE1FBC7300C313BB037B4AB834136AF1CE949DC406C7A1DCEE043F51699851D997E33B1007BB1A78FADD36CA69614072EBE15421", + "testPassed": false + }, + { + "tcId": 144, + "qx": "3BB4707FAEAF1CED01BD2339A3A81F1FA9AEEA6F8808BA302E4EEB2D2825F4FD", + "qy": "3AFF770175C7A4E6068AE9EB41B87BB406D3652D00C2D1110A092EFA531D2341", + "r": "1568A9881A58C2C15D3516291CF8D38D53608274F0AEB48E1BD43E7585F782EC", + "s": "FBE853E2DC09F9804EB7C3A18F12BEEFD57A89FBFFC71B1FA19569602FD5DA76", + "message": "7458DC7B7A3C7B1A7AFC3A70854446E35C8E8523E53381F05973DE7C2BB4DCC2F6BCF5CDE8580647303AD7740D0CDD71D8911A005258C86A26C5D38083AB545270487C62B51F74778FD77BAE9EA8B52DF461287F074D0A731FABED5DCF961EACE8751CC339D1D30011224E5DCCE8151322A316A2573DC88D0BB53489208599DE", + "testPassed": false + }, + { + "tcId": 145, + "qx": "15D6B87FBBD176CB0248285C6290261116C1A6C52BD8FBF131721BDE87A8A841", + "qy": "35CC72BD3D7C9439B9B9D9EA4CD9F0680D2E8010ACE9B06C625C39266B21EE85", + "r": "C28634027518F54ABC6983627C08AEEECCE5A7F0084C09F3F5C6AE458AC668D8", + "s": "9E38F628EE79113DCF9D2E1B7D537B67996DF1B384C4E9B0EAF9C31EEB6393BA", + "message": "C216A61971254BD369CF9366E77952F323178DBD63724C7A78AA4721D79907E6F46A791605DC368D2BF92BD28460DFE1079920717B9CDB3B2DABF6A8B277CD94A117C6C75A5A8D448908593FAE7A266E52F998A42EA9FEBB31D3709221BF958538D94CABCE31DBA03E4E1A79570D0F9E3D176748FC066EEDC295F935FACB92A3", + "testPassed": false + }, + { + "tcId": 146, + "qx": "A13198347B08C84B6B598C55686B64A765816256EB7F7AA5B68B484A3A12ED46", + "qy": "344864040B407A10A1972CC78337CE6D28257976C9BDBAA577D87E7B60FB54EF", + "r": "9185DA43F309323C80E3AFA6C9C7103A1185F337E82E2B2FBD2675214303B1C8", + "s": "961795A690D9548AE1146ACEFA64EF2ED5BF5F24BC73BE0281251DEDD7778192", + "message": "22922F71E5BD315B844C991F045C176FB8EFB1196E5489401E417AE34EC354D80CB081B1C97A559BC10A24D4B1A422117D2106E595F201A444F9EB3B59F366A9214AC4266D9490BFD5470B70F8CD390A7DD3D6B56C7523D1D7EF465A392BE2CD7B1DA2EBAE9FE553D7735BB9C3D8938A5324663CC0E2C6C33672C552E8683231", + "testPassed": false + }, + { + "tcId": 147, + "qx": "E86648D4F4DA47DED3A549E72992AA34837D636035A86FC16168DA43175CA40A", + "qy": "70EA5CC0A8665D298D0E49789201AA2FBEABF11DDD9D5D113E1F8F770F2084D7", + "r": "F6E2F6274B5B3C2403EBB3DE5328A78A1505AF4AC3619275D5D1AB87932847E9", + "s": "18F86EB01767046159292F6E099C60FAAB3158BFDC4273D19D245C15C758CAD2", + "message": "8612E400003C73E0031643D429A934687EA288D06E9B8C0F29A23743DBCDCB3A332E76DB5B1DE5CA474BA3D5F42E062A101D56FB09779DFCEE401EE606BB2BA7EB380330D44485D49D91470C977A4F47883EFF0775B772375E4A20E1F2825C8F573B5044768F680F24CBB37CAFFC470E211069634B83E33C7D7ABF3D53AA9F50", + "testPassed": true + }, + { + "tcId": 148, + "qx": "9C2E6A90C59B4ECCF9F7F2913899C52B7E1D383DB2327C66C83CB6FA52A4A26D", + "qy": "9BA15D5802FE066D362DC4F9474FAFFB214C976BF8F0C2864D9C8000FF05AA2A", + "r": "DC944D5066EACB1E008E8D64C5952BFD93AAB680EB2667D1A5B525A73A682F07", + "s": "90B8D0EDD8AD61DD25B240B95BAC974713C6F6DBBAFAC48B5C5E32A552584BD9", + "message": "A8545E2379B030B5953F306F70BBECFA1899D55C51A5F5A8E1E83CED21E7196E5573C2A3219AC1526223F854A7ADED6C0EB7A633F11F436AF880BD3A0293D88D93D81D5D27FAB2BECDC77C950FEE289F233F80F975AD4772D1EA9ED3588E19DEB80842D04C10AB8FB11CE038921454965416C81C719095D6A86A6DD38963DAAE", + "testPassed": false + }, + { + "tcId": 149, + "qx": "CE57D62DCED56896F1DCDC39FD9655FC196ABE550FB681FFA3D7D207959A23A6", + "qy": "B0E52C27A3827B9F99483791D4644624768B6FA14F742F69CA800838A1AFA08D", + "r": "0F2FD503F5CF8BDA692AECACF17770CF6AF19BC034D292BAED6D326A23FF0733", + "s": "689830FB721E2EF6CF95DEE68C57D26096C1B031281E9D9C9E7BC7C2321CD2D8", + "message": "0F32D075FB733B4FFF484565873DA67E4103BEA7EBE38A62240BCA730857B47DE3724B2C2E34DBAFEC0F8234AB8A8C20BD77C78B698A1E5B5EFFAAD722275E817DF1F0135E63F5088E2731093EE961CEE2ED9A67D9316ED486A98F243D6AD71D18C01E0D596F0E58DEA0BCD85EA505EE24E741FA4477419BFE49836CBCD4A94B", + "testPassed": true + }, + { + "tcId": 150, + "qx": "B1AAAFDB011AD2C580F0BEBE04F682E4E077F07C7A79300433076352C022269B", + "qy": "B3C5D161A9BCBF4BC5C9EF8DF0BC58E0FC554D8CD787051AAAA2F5ADBE82F769", + "r": "D5DF8E7643056CAE0129138EC3382C2B8EB234D3275D79D793D099B7E99052F4", + "s": "092C7FA0ED47CBCD92AE7B23E115494C7346FC0FD07BC1B1A5459595600CD355", + "message": "BBAF613189D1212D0FB142EAD2F0E732D7805D3471E662375E727A2FC41C9D575B82FACB627C3E646C74D0A1433C648B2609B3B822E390B67BC3AEC8358EA2E0528627377C0E3C8A387F17019CDEFB0D3AAFBD66FCF0DE82BA77DA9F0777E384756D7F3E499F3BE470AFA900664A2D5562B63F1913174ED2C571D7B8F2AD3AE1", + "testPassed": false + } + ] + }, + { + "tgId": 11, + "hashAlg": "SHA2-384", + "curve": "P-256", + "tests": [ + { + "tcId": 151, + "qx": "1C4A13BD77FD0C9E50C1F65012986930F881B8272856E2752999798DC186628E", + "qy": "B0B8B467F6607DA90498E6ED193ACCAB432E0E1E7A41E359355C12C4A80DFCA6", + "r": "5A4F229286A3F5CFDB4EC8FB0A8580B33E101AC246D45D2A3B377A011ACE0CAB", + "s": "CA38508B032810AAC22F690BEC05790644F05E011B365246114DFE61C44CBEDC", + "message": "59943FA62FAC9B2D06E4140BB32C945D8A6BE2E403671BE464D4FC9B4F8620968C5CDDB6AF7107F2E38509A4C01E24257F34C6A2193B6B364BEF17369F7EB20F88D52AD8511392510DFB1F6E9D67D47C0B9B1A0296A96BB7352ECA42C314EE02F3A70C959B2FC199365D4B84F2A0641632DA4B8D81A6B7946AC60813ACC9AE59", + "testPassed": false + }, + { + "tcId": 152, + "qx": "015B17B77755C29EB4ACB700365E425F0F37EFBA44B69DBE9B40D65B54A6DE26", + "qy": "3C8DA470B2F6E0148BD01C49DFC49E068522D4A2B5A1580C408DEB5F7D306DB7", + "r": "537E6CA94ACE48AE2E17F5F98F3CB254DF67550850ADAE18676AC393108D3F94", + "s": "FFCAD35AC286DD53ABFEF78B21BD59B2CA8B23F7D84FE03A91DA6FE8EF7C2DEC", + "message": "7139B22DC4F6AC37364BE6E666BAEE75916C67A867901B958015F5B8F308F01EC71F2AEB62AA4030FB45B9352C6BCA871E3DF9EEF4F9949B2415D70427A87DEF81125231420DB38A5A5BA2FB2C3FAA57191D6170F772301A516DF815349A8C9D41E575D6C3E4A57FAEF1602514E5091D2B0C9FB446BED5F6E91515E78D627BBB", + "testPassed": false + }, + { + "tcId": 153, + "qx": "3AF5809EA7FF2D4EEC67252E9C752A17DFCC3FD01C43E6A08E7486C658BB0722", + "qy": "0C762AFF3710ED114E2C20BEF72A31CBADF3648F533F917E2AB67296D1713E0D", + "r": "70AA629553FDE829444935FADFABB5AD9C1005178508330960152490210F7A18", + "s": "3C8FEF6A652BBA9F2A34FA681257C0541AF7009A6B0A8173F37CB1D9DE8B5EA6", + "message": "5BD7B9F9751BDDCA08EAB79224A6B7A1209B983818AD1EE6015B8A0B0AB18BAC918F85C2FE8B6D7FCCE4920A7788F97C8825E1FA860BBBE19AB784E39AAAAE9AF42E1B1E233FC701961E43D48EB89E863E24B5B84B80DBACADA902C58C039E10B821C3150F37A13DDE2C7A61B8698A9D7D11E738BA66BBB8442B55C47DA62E10", + "testPassed": false + }, + { + "tcId": 154, + "qx": "6DB786629015361953904BF0A099940BB7093F9CC7934B587EE739D82D96CE1F", + "qy": "8C2D5FB68A3A8C4FFF2780068F01EF08402FCC0F948128E97E8E907D27ED779B", + "r": "43C8D8445BEB6DF44AC6B1EA321443988B06F04E055D54D0835EAC3180E47D59", + "s": "CEF24A0E668924A3225C2A7DAFEC374A2551CE5DE3801BC0DF513C3742474CF3", + "message": "AC844CD8B9A3F7993A20EE22EDAB8CE3FCB8BEFBB8D328929AECB2EB75BBFC33D80B252DE926E218788A509ADEEA9FF57117A52B2069D6D2B135FE9BBB70248BBBCD0D8DA0FDFAA1E4DF658EA5DAC899886E5B9947B800E699C62BE4C8C6F7DE18F674A7842864CDB0ECE3214F6F98DC1AC662B34E3D82307491B504CBAB8EC8", + "testPassed": false + }, + { + "tcId": 155, + "qx": "ABA9A5A5A3ED6CED47CFB6539BD6015ACCF1A30E641C77819B85B10CB06FDA34", + "qy": "6F40A0D9AC3E89AB9D943B5EE7D6FDFE1E1AAA5652374741AF57B738FD0B1055", + "r": "3EFE6A9F61035F6A0B62CB0906B722884C131BE26B66F620951A4FC6D7D0A4CB", + "s": "A6B9C2F375B48563825E1FC4D96DEE2A77CE0813760FD00942F702AE35AAED70", + "message": "FEE78BA5C184F97D22271007FAED233EC20F33ADD8D15221EE5F36FE1363335E683390EC578958A5CA2315D246C1E3CFB77904D3CB9F8A8ED3E22F192AC4A037FA57C8DEBDDBB7C6E3FF4D625F26031E7860C2B39A2DB531124DC70E503BA4178575F94ADF5C307A2C9F0081D19CDC9BF18054CEDB26ACF3A1A83AED55E465E4", + "testPassed": true + }, + { + "tcId": 156, + "qx": "FFA55202BAB5E1F44A7F6442C7EE995EB0B12BF6B7F71EAF91475B725AE1D979", + "qy": "5F218CE1AE8BFFDDA2714BDF8DDE933616F6E8F7AE04313F91E1FAE9396FF23A", + "r": "51BE2E4931DC36B6DDBD00FAD90C435297CE09164850ED5839F570534E9150BF", + "s": "D795D642FE97F447BAA3598E7C3E2854115DF1D307EC8BC708D8E120AB39B07A", + "message": "441BB21B982FF8A1CD3333A6DD72711F6364199544258CCF0F5A480BD77FF4E6E4A7E7EA8070C2786648564F02F13849FE649956A503FF2C05338B5AA85EEA2382369816BB6F83FCBBBE99445191029AB5F06AC2A3771C7CBEA359046C7D36008CA7E1058BED3969263CCDC180BDCF5F37F8D8DE5E77CB633B2403F5D9AA3889", + "testPassed": false + }, + { + "tcId": 157, + "qx": "9BBC3D424BA4C84E807CF7770F220DE9AF55276D01C00F1A20EA3EDE92D3F393", + "qy": "C418DDF447788A67182F2933887345B9A0B43AB6121FB44CAD08F5CC4A663533", + "r": "4C564234552FF0A9666A9183EC91BFB4E9DB4FDD8EB2FC014636B607814F947E", + "s": "0383E50FFB1087842716C3A73B2464659EEA4A14558B992DFDCFE798DC4839DC", + "message": "C8DE1AE8D2879D1BA3F63B4BCDA6A268C049F340A2B30ACA4A93C8FCDF894FCBD846F1181698E746F2F265890E6AFBA135F7E81E3C7269BAF63180BACD900E087F4AB6C947D85FA8672FB20C6D01FBCB4D968DEE92CE168F1039F076414F76A5FFD28B0A364937C3E57AED53017AF4E7A7C20944350DDB0A55ED137F9B452355", + "testPassed": false + }, + { + "tcId": 158, + "qx": "75AB6820442A8DE6493AB1682D189C6F757E6B034469302B4161E5ABD44E4C71", + "qy": "56CDC9D5830D6E1F7642C1CB619846BA6E1F1E254BA16A36987B66FACACA997E", + "r": "4FA69ED9850DA5ADE4E9C122F7E66F06F585C987F6890F6D1DDEFBFBC8E494B4", + "s": "9B223F9C99248499314A627EDCC470B23658906113F3521B6684FD8644AD8367", + "message": "68DEEE3E9DABAE6EABC3DD0A59D7651C3B1CB0B71DF7C75D009105B9D24DEEF5A3BEB834317ED7790E28590C8888AFA7D90D9AC22759A720121FBC7525BC9605D06593097E3F2AD6DFD710C418D97CBD072B766953BE5A36C836735B54B6501FED72E60445B6D25077ED81818F7057867A112C75DB8378B66AD8C05190A1C360", + "testPassed": true + }, + { + "tcId": 159, + "qx": "99339509B867C2DB166450410C5013C9D818432AC9D818074F0361FF8B74CF9F", + "qy": "AD0CE0E93D217AADC73BBAFCD8B786ED5AB43AA715E3767B44B853BC9CB1619D", + "r": "54E2362182F07FCF44CD7A0D492BBCACE04765BCDB190AC309C8370FBF3DF319", + "s": "697993E8B4A94CF8BEE6C8E6B2792E0FF5FD1D97B9802068DBB2CD11334DAEC4", + "message": "65BA5EBAFED4C2053CFF4FAE8A4310DE5CACEA6FDE0149B63EF34A658012E05A7FBF5C63B9BDBDB3189B89741808A1D7271129F5AAB16AC11D1877BB88DBA0C67467B72B1A38EF85A1942149C366CEB6AFD24121D854C137EB779BA9435F473AE44CDBE6BE50AA6932014A6BE85639B9C1BA1BCF1585124F4E767CC5A12287EC", + "testPassed": false + }, + { + "tcId": 160, + "qx": "B607FD09B1118F68EA69AE177BBC3BECC3DFD546409AA7D68DBB7FB4E5E8DF21", + "qy": "905267903A10CFBE268AAF443BB6DFE4C535DDCC3845F105F20AF9D0F4ED5B7E", + "r": "B25C49DFD00A074FD89AB1974C82C61D4033E47EA03697B21340A119DF064C75", + "s": "C0DD472EF0C294210055FBF0DE8B4F6585C5D1418767D3205F28D02FC1222333", + "message": "5DB9517F1BBEF2C763703E1FBA730BE05D944D6B84FB76D5BC1900D4AE4B964CE4F57B2D2FD159BC9E234E2F4CCC17DFAA657DE2EE8CB3D8E68051747A91EAB2A08BEBD252B645DB763BF838D35C560D8E7B6598FE37D7CFC8CDE375ADCFF8975C228CA2D9A65A10FE7B19C55C7BA6CAF6FE44732846D52D2EC579ADC643578F", + "testPassed": false + }, + { + "tcId": 161, + "qx": "613D41E5BADA551D591DDEB1BA11ACA6ED2BF4744CBF486BB39629C53111A5B8", + "qy": "1D350A6FEDD605157EFCE688229021388855FABEB9FF41AECB39DE3E61405A42", + "r": "2B56F7FFD0106862C5E3DE0564BB7B34AF1A8C7AE95B8E5346615171EFDF4954", + "s": "353B62C2B0678F5AEAA9035FBB5E9E8AFA129791D736E0A21A0F16D116EC34AF", + "message": "885FEA6D1218AABBFCB32D6397FBE2C61566EDDBBCF9DFDE8FE0DD09E61E1CFF7EEDA8C84B378F8CBAB4D39EDAA6B026C71C0563460658312835A5A2A5656FCF5107094821A9E31AC933E1152A07133583836F56EE6E068835CA722E5259C09CC9FEA5EEDC33A93672F4D24D8E8EFB9A64F8FB650139CEF7F6E67CCBE0560E9C", + "testPassed": false + }, + { + "tcId": 162, + "qx": "C4C06B13409D0A51DD8440E64226C2A8E4BF11106D21A56A21987A871FBB9856", + "qy": "1E6DD12230B87998B7B72CC3EDC41DEAE8C160B46CBBD6C303D4202453AEA4FD", + "r": "3CF0317A20CE4A2CFB6D2435F107D1915CEB7E4698CC362D40510ABED243496D", + "s": "5A7F31A688EE0CF646FFD706FB6BA96E66D0F0B391102624520D740277682265", + "message": "51C6D16F10C4B996473DA6EF3FD6D52EB78D7089C66C108B303C2068B68CCC93BDA4A42E01D16446B98B096E1AAD955324B7F0341D017DF5F5D341750A722250ACC09DD529F9E5A8C28E8B4361055F71B12BDAD9DD79535A79CD28E77926D544CF6A74791F477EFE90CDAD715BF6C31DBABA9CDFB6F2BB2139BC1CA8F876766F", + "testPassed": false + }, + { + "tcId": 163, + "qx": "1368965EAC6DDFED2370ECA2F219E26166FA6DFE89F29CE29EBE2AE4E33E4F11", + "qy": "81051C19F05C94D55577519CC2C379B2263074B321214EE4FD84DB8343954E7E", + "r": "51A71C5568F29369A580836CB9C6261CE8CF997B26E4DB997B80A0C3304D112A", + "s": "EB4C1BB3815FF8963B50C1AD7577082BF8636E063CD398A0317EB7EE251AD7A2", + "message": "2B106A137475279C8DDC67F58757597FF0B917CC03247D4BD57B989E3CE4F648AAC32017F96C6ADBF52C22DDBC6509BCD3AB2A347E1E994C27637FDF511CC8B0B9235A90132D2B1BEE95EB9D71A5AE555AEABB0494B06C0554334524875871E0CA93836BBA64A68EB0BFE4EA24ED806C870738C2FD93433D8E14F4B9BCDBDAD2", + "testPassed": true + }, + { + "tcId": 164, + "qx": "5121C402A02499867F6F2EE579E2B279881B7D1F74D4CBFF2E12C41289A3F0D5", + "qy": "96FC97C794AB4E2D3F20B1FC030E9E9411BFF8C4AC5A6064B35E412603813B73", + "r": "68F4894E53A265A1C7BDEA955B3E49C65D5C959A537A8407CB6D0E4C80A0C6FB", + "s": "0E4193A16204D93E65AF17EFCAB7F43C573B24A3803C62F7CA1FF0F0549D4E91", + "message": "6CE0CD7D96E32E072B1C5E0C829E4BFBFFAC2B31FDB62BA49D5FD69BE274C746C6C412F4469D97E64735A173E043BE653AED273627A3B47ED5141B2DCA763DCD903F50410485E827E252D5B23500B9B98DA1121F4158861705177A2FC47A391CE7D7749AFD4B074C0D698EADBAB9964F43E0A7039225A404D94D8C0BD2F59071", + "testPassed": false + }, + { + "tcId": 165, + "qx": "5F0394307DC044BF7BB0F19BA68C7B74F1A57A3AAAB8FF704212DFD5D02F066A", + "qy": "94539E4587A4B8925D13982D99CA09E3D17AC7412D231931101EE83DD59700E4", + "r": "76E5C70491E6DF04842AB66C6F450DF025F96DFA8F9C85932008B2347BD70F35", + "s": "FD373DD8C47A1362C46D0C833E6B6156F4BD1C833A29E2FD694088BE0FD7D61E", + "message": "6F6E23E2775C00D2AEF44AA4A04DEFD9341A0C99719CC17ED77F56BD673E4D5CBA0D64E973C571B8D90C576A58D68F755C2AAE8D7AB7C4D35896A7E914D9DF055EA27A2FC24B03E2A78651356F19157E686A964744ACFF353D273477A7183E2A41C7836E55F7E0F371F23979EC01FB8C0D4F01520321CCE211D026A33E75D4E0", + "testPassed": false + } + ] + }, + { + "tgId": 12, + "hashAlg": "SHA2-512", + "curve": "P-256", + "tests": [ + { + "tcId": 166, + "qx": "4E7CE6671676AF689AA4DC611794D57C5E3380EE0AADBAC87BB2326F1069BED8", + "qy": "A0EEF5C876017DDF1B3ABF798A7662A6C98B1E3469FFDC24C71AC21A77840585", + "r": "2808565EC2D4276E48FDCA9F4491D6974F3412D8085F0F66CAC29A48B232D577", + "s": "A5461BCF4E2F03E35A22F33202454C50FC0F3CB6F7F3F6DDC2C9274888A13087", + "message": "BCACA1F279A2B2CED8FE5495D5693C1A8790A7ED54D81C34DA086F96335431157B88AF546314D9A7A2D62C46899702AB74873A0372CCA66C010507524A55A50444DD2CD814B0A2C1941ABAFA441D3AE25BB9EBD85876F3A860C30505D56DC15CD17064C3795E645F6093796674062F070BDDC00BB27675A9A1A536781002550D", + "testPassed": false + }, + { + "tcId": 167, + "qx": "765C13F26C25265F5A16364232270AD19AC17EAA3CC7EBB6D84BDD0459CE912E", + "qy": "FB4A03C2B11E68450BEDF50B539D02DC306B23AF8DC758D59F773B305285EFE9", + "r": "01E215F3CDCB79E63FD56033FBD4FB427618FA011ED23A12A55A159DE27CF903", + "s": "CA70C6CB6AB1A2076F513A5E97EB0B432C5ECA4FDF551FAE5A98476440CDBCD3", + "message": "B3261892BB606ECC69E3AF262A798D5B9D2CE70EBB6D56F7E18A86E693D0FF29B8344B63F38AFD77FEA435D8FFD30BDC851C70B475E1D1FE890B1DB9D76D709EBCAEF9365513780EE15DEF8D6CE003FF445D53046FBBD7B16AA1776B99DFD4EE31A2B902D2503AD920DF704D923BA00076B798AB5BA14175B0CB8690ED98EE51", + "testPassed": false + }, + { + "tcId": 168, + "qx": "B63E82AC710D2B0C93EC761287ED783A0C7137C846F5E5D3A036D15BBA1EA7D8", + "qy": "889FBB0B8C6CC487E26D7DE502CFC6F353BE2540325D5126070254659B998D25", + "r": "038BB84CB522170DE9616BA6700C670C7693AC9D5F286F8CD433586A98B530E3", + "s": "000D13960FC54B3036A66E137C593628883A5045E6E28E7FEECB4DF6931ED17B", + "message": "0E347B054861AD8476CE74424F0030E62E309294E68F3CFF2477C34E4E58C21ED5F39E1CDC4BEEB45448BC9D7541AC2188A6BFB973DF37AC505851371501CD326CE984FB22B88DEEEA05741D3C8C5875AFD9501C8B2F0759EFC1D56A39D9B9C866F82ACDB75BFAD9C34AE87B39276E25C28B10CECA342B96B63B571D915038D3", + "testPassed": false + }, + { + "tcId": 169, + "qx": "A4F12B5643D032ED51EC181D8821409EFBF33A025E6EA023E0EB39492AB74FD9", + "qy": "10E048EF61EDFF663E7D7F7EF2999B6CB01CECE85594D1CC731DAC9026EA0472", + "r": "3FA4A7BA51637293CBC1B30DA05C5C32479E063A795FB1EB949DF7C0A779482B", + "s": "CA189AB1F47DD4BDF5809B51D2B6C55DBC65F7D3BCEA032D663B3F1A39A03821", + "message": "8C83F75CFF41B49635F6B0FD6F1848C2B8D66631DECA9A01B66A1308582B740E24B16A5DE7885B4019F2BC4FC7FF6BFE44DC1CC7C9852EF6E1DEE45B82CE88F24578FCDB168D9FD49D2FB70CC07BE09AC595D6E11DB986218C80EB865CF970D1FF7DCBA79931931BBE398150A6BB76CC654054F29F8770101F960CAAA95D0D1E", + "testPassed": false + }, + { + "tcId": 170, + "qx": "880B65D5C81E882D5A068F2D199CE6E3843C2D4B4A88679556549D391F783091", + "qy": "5C669FDC291018645D3FBDFF4CD04B5C669F6D4C727722A4E4C9AACE62451E17", + "r": "94CE1D5DE2D8520003A30B5A58FE5ECDD77EE0D0AB1195D35FEAC4A27B042529", + "s": "AAC6A116F62700AE30193D6E1BE37701F82B08FD70727D763EA41BE3FEE85B64", + "message": "1914D88ECB9B74351BB1AD94E4202726721EE864F53C74DDADBFC838E39D249E3036026456DDBD5027D32A07698A31200C1DED5763038D1C782E6B89EB9C0946B8171E1641334460764B678359ED0B1948B4D4EDE3DDB54E4D44979A3D339C8F5784F475A37AD5E00BD1351952DB6110C9A9BC872B61CAAD8DC29117144F31AB", + "testPassed": true + }, + { + "tcId": 171, + "qx": "03A3F7E18D1602387DA5C9E65158FE3FE312A9EF99DADE71C155894FD1D471AF", + "qy": "B67F1B8536BBC6B5F0A2C761166981E9ED647A08723F016AAA8B3E5D150E57FE", + "r": "8C2B6B7812BB07F436E17E5BEA641C7156293642EAAA05DC6E959DAD22A38C98", + "s": "0A6360A5B26E80781E1C03AE186F681A89ACF467861DF89B362975625EA478B6", + "message": "38D7595EC43240B1343F26CA154A53981DB2344E5EE11726A7622FDF20056653BF22B959BFAC57A7594017E0DC659B9ED77BDFBBFAFD8EF230180B1CDA9AF24C1F0230B1E82A14FC6D2F4BEDD3473FB27E097912518555EFD3A284D3A9C5D7A52DEA281B181AA7508E304150EC6294B4ECB4E1B13F2036481D48CC8F7BA22CAE", + "testPassed": false + }, + { + "tcId": 172, + "qx": "DAFB2800BA347D5139C0A42ABEA2A1D91ACEA394D652FE8C8195DF2FA043AF66", + "qy": "25D271479639EAE182C84D99E60FEAFC1FA8FF386F40FDDCA6F53CC36ED10B71", + "r": "3AF2DADABE20F045E4EB3CEFC1BE326FD5477E357902F51AAD8DA5E53D1697AD", + "s": "627B52E2856C2052FC18F2C9F0106B6D75E293E05938505502380A9D8B4ED64C", + "message": "4863F1117FD17D10B7AD926487B05DC94B91855580B6EA93470542F1467A4673CB7D58CCEB1D5769824F236E674CEA31569B633007A34EA02FDC2FD63B0060DA1BF9B172E1B364AFC18DF9CF571A7077DC7DF1A755626C7CEF3A7F50CD19F67B1E7A88D7C4C6AF4842B89274203EDAAF2DFCF0317B7F55A4D1753890FCA76854", + "testPassed": false + }, + { + "tcId": 173, + "qx": "0F25AA42FF2FA9C148CC306AF2737D58AB365D941098DA9B18330C94B354DB72", + "qy": "B8B7EC9C8BC071217D12EB826121A1464B43141D9A6BA7F0E47229E1AEFD3D12", + "r": "17F9DF8B4FD739A43205BDA33B5964856516729FBA42D1FEA55C6F96EA795F74", + "s": "0A77FBEFC794B1370FF10AFBBE7BC127E5600444C2B32C112DD15C91787C3686", + "message": "0F0F4FBFFD2CEE80FD9924814AA264B5FD20FA001523E0ECD31ED1580055B82ACCB68CA360098F6614B6FE11B362771CE14A2F45AD72D89BB3B0C88D920237FCABD8E4C2BE45FF2D65A872EEBF939C9CAB645B38516303B0794BE96036F40E86A4BEA450FF22803C8281A8B02251E69C10FE81A189DCBA5028E3E43F8182AE0E", + "testPassed": false + }, + { + "tcId": 174, + "qx": "65FD032A4CD4BD687FDABED813C08DAE9E837A89E181BE31C73851A000F9D56F", + "qy": "D2980718A9E743A513A2773DDF91E50E2A83532049A78B699B729C5CC1C878C5", + "r": "2B1BFE122725BC65AFE0C04FF79E4A872B56CA57008E850240B81E796966C777", + "s": "ABFBC0A932F72E99B7E223109440D6500687A0214C45AB4427E915593905EAC3", + "message": "F5144C3354DFE7815C126E2D49F0434A25108118055595D709D7EE4762AE40E4AF33058EDADD8E6A65C3C1239B58200D8EDEDE77081E4FFBA22610E3494C451D360A8669FDD22903878937545037FE19BA3894A7CB76EE359D026003E015F49C18115A9A72DB452285AAEDF654ECFD022AF0F83EE95D2E91A4F84442F4AFAD75", + "testPassed": false + }, + { + "tcId": 175, + "qx": "D28819BC56C958989CF0D4DFC49A5AB060C893FE23DC968C38B515A1A88AC6DB", + "qy": "49790A70A6A4AACE26A61482E06D588E012758B24153B81B0E5F9773F853ECE3", + "r": "A137BE7481D8B32026B9A62317AE9EECD390FA98C5525F76899BE929838C94FA", + "s": "6E73335963BE3A679B9269FCA968BED24C08260928253A66C4422FE486C4E4CC", + "message": "9CFA1949501354B7A95C5C5D976C414599B6661F8ABE055992F371E718E94C5B168B0D6642FD4F074622347FA1CCA9FA76165959651E2DAA605B469F1B9ADADEDBFD294066B75CF210CB3DB86866B5D8938D82F2C8285940CC741D9FF060D384DA9DE557A53C87F9092182BE5EF91E7EFB3600EF1FB47BC154CF7DEEB1651493", + "testPassed": false + }, + { + "tcId": 176, + "qx": "C28D2606A066FCE086953F64581AB8120628CF525928B637F0DC2E4D1F0EA676", + "qy": "2CAFE450F81BC52D89B81982011846EC2428A9C1411DF6B8A6B3E34B61AC5B4C", + "r": "6B272B34DC0731C821575FDE731CE8B7C11E8BBF58AD54AF170E7064375273B5", + "s": "9CD39F2BFBA0CB86F0D0F28212178878EAE6DD6E58BA80CA4A7C7BB773106397", + "message": "E1964A7F2777EA1B2180390BC3549EBD5014DD788987E189F255AA6ED99B68051DE96A595BE15FF15196074EE46E48C9B7D4716D8B26964BF0A66187683CB229CE1E7A0C1D5691C282699F1FD2D22F53DD13AA8BC4372397F687B0EDA4E15AF1B6DA2114C126DC626036A5AFBD8DD2A0930569C32D6803EF323C32F9B8F2F827", + "testPassed": false + }, + { + "tcId": 177, + "qx": "60C0BABB43EEA9D78C13B538412C936AB957514DDEACB232C28C89719DB734F4", + "qy": "D6EC3A199A1EAA0083DDFDE51117855DBB3C71E3AB0AB9E6769F3AF3057375A8", + "r": "3159E3BB33A149A68A04BFF82369469EA01FE8702738A3C6AE380A34A0570798", + "s": "50DD9F63A99A5742EBDCC122CED798139D4F201E0465D155071657FCBACA1861", + "message": "6416640F6F84F6B1953D317649A55D0B3D15BDAD7FBE2CC1385D149A1F81AEEE9749ABCC907FF059924C062107996FCFE244B891CD80700FE3F48E5FDD89FD9B5E3810B9743F50F6A68B2DEFCE0FB6C6BDF2241D1C0C26A802200CE17597E4C03CD430BD602CC10662D59DF4287230F0D503F6C249396F8FF670E53646B3CB44", + "testPassed": false + }, + { + "tcId": 178, + "qx": "422D39FDA3CF555154122B1EB5AEB72ABFFF5DDFB25E5A269D40AC1DEBC74AEF", + "qy": "9A1A40900DFC4B7CDD10913700CD6F77EADEABFB1330DBBF04260888B35E9D30", + "r": "F779C681D3B375D98AC02E05C04765217E3C2A3D5D5425923C4D9B415EE34BFB", + "s": "00332F375A68F77DF454B8D592664FEFF41CBD5AAD7F725F27F9EBF7A29360EA", + "message": "C90D604EEF80F2FFBA8E4AA137B23CAD7C30F96EE5EA5389997589E6E6726E8B7AC111345C539873A85296B6A2ACEE09C86092DD079391DA41BCA288F49B525145EC4D26BB040D0F0D010276C594463CFD7D8138C3B378C7E7CD386A63A674ABC95B4BE8E8EC86499956917F5B78A77A27062E69461BAC90D53513424DA7659E", + "testPassed": false + }, + { + "tcId": 179, + "qx": "6145ED256A20F1F2DF661660142B2E7174A28CD752AAE40F1C3A7FC5AC632512", + "qy": "B7581CBD68368CDBB8027D184E57746638EE69E759B47A97C73B3373D3B25F59", + "r": "03AD12D11AA883823C1AB96BCF7554C813DFA3B0C48CD07B66A8EA131F6A0A3B", + "s": "F61084C6EDD94469857D9F67E5415EF85B7F5C965E3C1AA803A8B6DD72C73B45", + "message": "CCAE038E145FA799E6F411387125DF219A4AD99E43C080682846E32BB34BF1A5CF38BDFC0993A746B1E169025BEA8F61C3CE862E497AE989AA0D22BBA5597B4FF76D220087A3EF217923192C4A2B754A0189852F9AE813F239449FF9B42069CB0EB32ED13591EA48FD20175C6D22CE4A07D6DB0F258902253F579271EBED4291", + "testPassed": true + }, + { + "tcId": 180, + "qx": "2FF1E723C4B4BB9252D94530CE7B0CC9C3CC2C4725EAFA8F79521BD40E9CD421", + "qy": "4E3B9B54EA028F5DD65112DF9B84F198E4720CE845E5D8CBEE6D21431535FB8E", + "r": "B194278D5D8D6E84E317ADA6962108F9B4948B145F901BD26781DDF597326EC7", + "s": "42270E66EE0BBD82F8050B899E9E512E55D8088B3A3D536714A4769F948B151A", + "message": "3A534F2EC3269823A60C1F68B728223153C54F8F6EA4A63AED2C3E5365792AB28AAE892718A067300039AB4190955A5525BD0878E7AA55C47B68CF2A57985C524EAFFE127E47EF5C3E373AC46822A3BD5796ECC2CC786189C0076F07FCA5673AFD14633353B1EC1280D4F1493416CBEA70CCCFBED35A67B2E251C36A596F302F", + "testPassed": true + } + ] + }, + { + "tgId": 13, + "hashAlg": "SHA2-224", + "curve": "P-384", + "tests": [ + { + "tcId": 181, + "qx": "68EF9D8ECE2272266B2EB7DCAA647587714F11108425971E252E09602029AF7659DCC69AC57E1CAC976A087BAF257299", + "qy": "F373AF93717A948440E9BB621215CF4C3B464568463AFB1970C42D23F1128C86D8C90C941A73488368D87AFCA10AE746", + "r": "D75807BAB1C2F9E4AD69D3E92F6966FA810C685245FCFC3B20554E8DD40F290572DA6CA92DB7D1A16823F342A3120A4F", + "s": "7B430E3E99FA48D4A0C50E25002FE21FE8BB273735485F8F4D2CADCBC96647087F00F728D4DD991838D4D37A3073848B", + "message": "5132080C69C136403A5BAD7B44C13D23C91CC692EF8535CAED3D18F7BF2E06E6477605628BA255E3E3AA15A3A3D934906C0B08B3F8E3E8569493AFBFA41AEA4FFE50557851A92ED1D0BE76D8DCCA5E9CFCBD11A97E04369DEE560CB97325A25A82F16D0176304D7EB486B82E81D7ADA14D22E447746C406B51CCA99F27E25888", + "testPassed": false + }, + { + "tcId": 182, + "qx": "E535C0EEB975A8A54B9B51A219001EF15D480DC941210C8865A252E965A4BA9A292234FFF9283C4FE93E27D319F1FD7C", + "qy": "20382F7829487D2F3259D58CF11980711BB0BC8C65D11F0391CE3FDB40EB0C55B31C4FB75C043B8BA7609A8A7D2143F3", + "r": "F2B6387E736557609BB9BD4BE4A1233C0567ECFE01B53716D5D06BD766A22AAF057A16E6BEBBCC13E357CA23E7B0EAE6", + "s": "2AA080387D2FA62ADAF70D1A8F674605C8BDCD08247C35A7F988C79502D6815972B1E24176753AB4E4BF0B5B874A8160", + "message": "6BC47E17AE69DE7F96775C30C3BCA2CD7E9F5F7D4BC935EAAA32BAD0D6C8D1003F1F7F3C46EFFA7074254EB7D47EE50860CA811C37D2C4EB00C407A8D953A4E42F30AFA9C40298FFBB97500FB436AFB2DB93237BAC0031EEC8433EDFEEB507C53502EE8331C19C83462D1D69C18D2F3FA4F65EE018DAE61DB4E06A6086DE2DD8", + "testPassed": false + }, + { + "tcId": 183, + "qx": "73C429D879898E75B86AD3DEC620AFD402BEA9B9326DCD2F485D9E306405F19C876DCED7A11C063C06E1B5254A1E3325", + "qy": "FFC190DC29701EF6B601277D2E5842F4E94638669D358092A6BF93973A26D81F5B2753ED6653722049D4F6D8F7D49540", + "r": "6EDB314F1D5E4C05B4C735BC4F93C09A20E6DD9D5361FB1EB3B725D5E6AD9058A5C11AF4B09FCDCED4E1404DF353F3C0", + "s": "B34F5579C4D8125CA388992727B8CEA6505C5DFE6666D22735A6600192A6C42B9706E9EF002808AC281A0840E3D7421B", + "message": "76DEAC5E7FAFC9E6FDE2E75D9B3377BC3D8BAD33EB7BB2D6C9883257C2CE60E68E9288B193112F4EE6E5D99B4D25F5B923F1FF0CDB5F81FF8F3F70AEFDB0CBD67D358390ED9BAE3D9789936C7A42163A372F088EA5DD1B1122764C414FC7D77A5253DD63602CE92B7FA4EAF771A475DC80C076D42B1D2A5A99E3BDD6C72DE282", + "testPassed": false + }, + { + "tcId": 184, + "qx": "22F070AF99D49FEB76E21E62CFD063F8D22B07CE65094EE514BCE6E292B39778216B248C4A3A52841ADBA9B19EB405A8", + "qy": "1EDDC23DF4AEA89B99CAA1D9F31DC42B2EF34812BE0C7D0B2A1384A7CA7E895FD39B2922341928A296F4889E31C4A51A", + "r": "6955C93BE886C580800EDEE8106B88CD9C8A6E2E1F33E90D40D99A90AE6186FCCFD2B8D2B2846D5639AD78735D650821", + "s": "7D12100CAA8ECECB3CD507931A1DB456F29265A5427BBE85F16838E50AE53869EAA7FBED9EDEE4BDF2F83F815D53816D", + "message": "6EBF01AC37E6F3AB816B1D0DB70E59F689C29185D809C3304E5BD7068B85605B07D222870F543AD575DA17ECE436BE0330C57EEFC9CF409146100172BB698599570143751189BC08B25A54199A0A414FCD9370111EB85C4B473410CB5DEC2FCAF3B2F725868C96A0D69DA8261A88C557DC5E5FEB34794B4F27CA01A82992A55A", + "testPassed": false + }, + { + "tcId": 185, + "qx": "32EF471AF53FB56586F8885F614E8AA2167912B0F83B098389BCD909D0338077B048F906930051833D365D1BE414B663", + "qy": "07470D6979AEDDDEA6BB3151C14842E87D5078500A24F99E7FEB10A8F11AAAB3BBDC5EAAC0207FED1F695B1C7D641764", + "r": "26BD8A786850A265CCEFA6DB12EFAC39827FB8C7611A00EA91D1907684D207B2DE844F46CB431C3CACA4F73708EC38EC", + "s": "E624F681DD0791AAB68E15F71328644337E7E02FAB34F2296151F79905A21C95568835B81246150DEE7EDCD4416BA925", + "message": "E8CEC31A0688BC06329829FC81E6664E185C71C49183CFD8B55B2163613124B493AEF63FE3234A8BC515C30DFF41AE990CAF4252E9AE08DF0EA63E5113821BF5A6283E307F72FD5AAE5A739A63DD7EF3AC35E57C27CBDDD1DE76B2E17EF9E639AF26EB7E355BCEF12B691DC680E756C087BD4AF9BBCB1C91A7738B4E6429C4CB", + "testPassed": false + }, + { + "tcId": 186, + "qx": "BC62F419585034EE6B1017A9731B79B75C4AE14F05D55EE10A60C71ED9385751E228DB0F7532E060B53CD7EE447B8ECC", + "qy": "C60261A6C2E7BB703180ED9C2AD73100818FB619AD181CE2618E89BCBF7B859CF0903E70EF2133F28C01AF087597D366", + "r": "B8D20A6DC4A7E1BA0F7A72045E148398CF83D77BC37A0EDFFFD145A74C048C223BAAE9E733A2D00A762485F929618DB4", + "s": "0C66131FCA058EE26334334D3368507D6765478F8915F8FFB54F8A8B5298E5F41D213290086754F94C23E87A9955FD41", + "message": "F88EC2E8F7F7BBFA1A3796D131FD39B3B160248DCDBE030DA5E2021A3A3025836C97A9D53E68059960DDFD096A5E70C63F962805815B6FA1630051FD901BD718400030A1C37949DA66A6E83C5F670DF6E09336124866849C396C4E87436C3F48195C707855505976A8706C05F8A80DB287946ACF64F174B17886F11CEFF14AD2", + "testPassed": false + }, + { + "tcId": 187, + "qx": "2E63254CEC8FEB88B8E6D153085A10205681C2B7D274882119A2235EC1DCDA84534868A6B85BBD213A8C95E25AD96A53", + "qy": "50A1E1B80C39DF28149E8A24B39EFE7AB8EE7348E1468F3D44F0B88A4CBBF4F3EA8FFF0F7D3F017D3F34943B073D7FEA", + "r": "3EE07038B5FBC1438417394D7CA6BE5BFF585A463447B8496D10EBCFAD0F4893EC0F65FB2A08C6E5788F48E9A23CCB10", + "s": "06D083DBE5A794DEFE7301E5B275DC62B9ED185BB9B5AD52D559FD74CDBBDD0BC14139ABA2958821C0576DAE4CAC3E3B", + "message": "06BF78DF6390B734227C7E9D6793E8E2C9314C6060CA219626A8D954614A23E6E8811770619392D8B12AB6D6B0A2FAC987982F1C0EA72B1E2FD973F669685FD8522F40625C6F7BF94E5B078BE95170999E42BDC023751629E374DFDC8CE134B9B69F28213C980B4459539224D00F930FB600D79D2115787B507CFB68B4D54CE1", + "testPassed": false + }, + { + "tcId": 188, + "qx": "6E32CF9D4FF2B059BAAA64064E1007C2BE2813721DF0903B5D8E73A370D68657168B892376B40F15BEF520EF1C25238F", + "qy": "DD924BDB93572F3BB54A2D437DE7F358D87AEC7BE6B62E6D088CB472FAAEFAC3E8CDC4896133E34B223E0B2796A98C43", + "r": "019AEDB001ED95E81AA4400986406D60B149619CD91B0C2FFD9D09B6F478A97779DEE43DE4D51D7BEAB82C92BAEA50C1", + "s": "4D4472AD0AE3DDD389D30A3B440F30665FF344C2713B6CC78D50532A738844EE15A65E3F2AD1B23DC44F8923018B60DD", + "message": "88B02E706C50AA9A457C34D2AFA161EA50582FD6A48204299C1BE2AEB42FFC24BCF1111CEE80E9EC91D053344EB5692E1CDE93D865D08799CC1CF1553C3B6B98B0838818D07EC8E33195A62B1CD1468D701EEA20C8ACA74409E19BB7641A8137FC6F059543DA4D06FE5B850D14917B68D45670BD736808B618CBF21D85C73FB7", + "testPassed": true + }, + { + "tcId": 189, + "qx": "65FA19ED006FFE73DFBB405EF4360D5C878D7F5CA5BB80CDF55EC7EC1CAEB0CB7115D67E2DEC144D7E8DFFDDC98D447D", + "qy": "C657EF4B20CBB4704DF0FBF9AC49DE1655BE506374DB11D76D4A25565012C607DEFBF9B88758D09835D403E0A13B1CDB", + "r": "C68565B09DE37D89FBDAE05DFC536F846305B383BD8D38BCC66B47C0489A6FC31B152BB066412D27DC2A644EA3EE8F32", + "s": "63808848CC270F4AFE4656B6EF665B061573BEBF66434C806B1FD1F607BC5D96054B57F4FC69F65380BFEE422CD9334B", + "message": "00F25F0CA20355FAC147932FB32149BD1E324149105E184E3827FC281C0505C8174D7D5D48953A48139FFB256E8021AE32140D25F944417E4FA8A2DD4B6899BC6D02B0D4CF7BD22C573B8D52DC68F6DB044890B6C172CBC8224DD91BC19283A1F2D78E655C25F6C3CBCF97C50C63CC28C3646FCF0A8B94FB670DF9C63F9DFBEF", + "testPassed": false + }, + { + "tcId": 190, + "qx": "0273B1332EEA0CE83CFD6FFDB9D0D51F3E46FD8EF99099A51A642672A0693CA0BAF88D8717B6E876DFBDD881DD98A9D6", + "qy": "7A23C4BAE4AD1B3E89F8CE0949F75EFC3343D1C46250751BE37DC3E9C023E24D4BAA3E3A1602E11099ED223837E15D20", + "r": "7D394F76ED6FC9548AD4F4DC6F52FD101092410402F56693C72201919507E7C982AF04D6C385E73562248B5A1651F5A5", + "s": "80711ACC3F011BCE52521704D536B80EA4F412BE3FE5958CEA16E0C89F027D006EE4ABAA779FD7ABD1D290565A8A18B5", + "message": "1D8A28F438FDFAE9A8013AC28F32783E0D1B2C8D2B7CEA7202833D9756805649F9710E1B878C4030BD49AE1CC5456719060B27D304AC102BA5B080782EB733571E0008F74B7F4935EE313A3BA8902282FB6B4F89D8754902685A9AD1C12E62F78556ADE8C86385559400484EAE7885408141A790AEB8AECBE8D05AD0D5DE3537", + "testPassed": false + }, + { + "tcId": 191, + "qx": "91C75918A5C3BA907E29AD15859CD4BF429A01C7FAF7EF84EB8FCC41C392CE914CE5043DDBE62EF804B6C1558F60B2C9", + "qy": "45BC4C58EDEBD4B4553EF4A60995B20C36665A90F58FA194DB199A5BF85B3FB1734A33DF5C55E7E3E5740D19AF38466F", + "r": "9C79FDB13905B31B3F91D5AEFC1F8D3AF7078D1706FB645A899852D1BE4F774CB2CAC0AD81F1780DB30CE7F3DAABAD91", + "s": "CFCE1BE4123151ADE3F7A5A23C144871B5AB71092E49929BF121340CC057C557215BE0B13FAAA798413A40905652B176", + "message": "65828D5D19B9B040856D02E05F0D1CE81243D41F2008E2C3280E8667F9DF2F20805C9153E4F57F76888E1DA52EB4A54D3A1E5FB08EA027F6D67152993039CFA2133095045B570772F462C048FFB9347BA7B6A0C88242511661ECAAEB6774D948D71C5E632F4C04DBE7E1F2DFB689E3815DBA0D0A82A6BF7193C5515F32EF53E6", + "testPassed": false + }, + { + "tcId": 192, + "qx": "E01613764359E70AD51E8920A9FF68D282283D084EFC631DE98DD3837B53903788DA145F7DBDAD766DA34AE88307222A", + "qy": "D8307D76CADA3AF9562E4FAE187D9CEC519235357F6AA0EBBC9CA84EA79D2D0620BF25BA491FB1DD309AB6DF2C9320DB", + "r": "4C415196337644A0B3148432D07D0C0DC60AB09643E15E1ADCF1247520D6806C62FC100626DFA380716A34981D1402D1", + "s": "DB4D865AA2961A45D97A9FEDC4A28B9123D98259D8E39C88E07A0C03F52E9617CC58FC035E5A69B40324547A6F4CDBEE", + "message": "0772B5A8657B34902DCB4072A09C4D8FE2FC96174C5A5CFC248DE31B56BD8177010E6ADE7104A0C45D667FE931707E885EDE5835C03D78715026AC054092F6ACB571E31E24AB6D3B325655C5CCAD23D19223AE4D6A37E9E52C8E89DE40D21BB32B4B97554211AB0C2BC26CA923A500DA05ECD85B4521F84DC62630D0B898FE9E", + "testPassed": false + }, + { + "tcId": 193, + "qx": "D882E4EF82DD63AEC8630BB89A4832DC4C233280BB4F2CA760762A6D4D9554DB997DD9D334C1C0A988FA0C6D0BFD0DB3", + "qy": "DD10A5E6C53855869A0D013BB1BFEAC2F74FA5F8332715015BF476A79956D1CA84FB26ACF6FD340DE4BCE5305C1772CF", + "r": "D4234E8353627F3AC0E628D30507BE6DD12C850A9ADAC0DD563736CEBD65B5B2D7D80CE7DBDF1C18A625466BD297A5E5", + "s": "1430C265EE71F8C33DA135AE55998355C00E6122AF912165C344A69A4ADA117C822F7B1D2434D9760B17CB47CF053964", + "message": "CCAC08278CBA6236698A41EB4A9AEE15A936025647AD48EAC0CB0393C49348085156F4C12F88B6DBB737FBA40E70D63CCBCFF675124D46C06D38AF4396196E642F505B20D6BAE5A0AC15A48D6EB622700E99AC32F87859AD76CA7B142863F05BC56A5A31E0E4D57802EFED6BFABD8BE94CD8A6877533CE8A823C04AC32E88F9A", + "testPassed": true + }, + { + "tcId": 194, + "qx": "70E63ED5F8C13678B6AED2E740493606C7D31DABCD34677FB419C1C64798A7CF588E5BEC7CBDD81161C2FF0A8320D949", + "qy": "0B2476DDB50D90196F8A4AEC3BC0EE3DB365F3B25E4171E2AEEDAAAD74EF837AF396F652D93F4DA2BCED3AD880F87C35", + "r": "768D17058CBA2665DE87E62F4DB2C0F1DA6B16BBF5F2C52E987AAEAA3666CB3448A09392432580C0130DCFE6FF1FD56C", + "s": "87E32DB4FE1BEA0E56126BDAB6C4DF38D8BF3E4A47CB222461E25FF8B591AEB29E02B26B3F3344020388214647CF8818", + "message": "2FE7D720E88A2D9B472CB792313FFEA77913FC6752B5822372354B32FCBFDCA9A52199799F7AE2AEC8245370D30A582BAD1013E8E7000DC960769ACA38F5BF9B9D8A9C896AACB78DFCE468607FE29A0DFF8327BC5B793441AB04255607DE923185D3536D1758AFD5CD6E621B42B8CD86CDA2A9CB27446EF1F8B4E21A8184FB5F", + "testPassed": false + }, + { + "tcId": 195, + "qx": "43259B620C50C1590D03DF2D04D9B1B74E8CF3D53CB30D066A0B273A336F97BBA5D770347F57BFB64F7EBC59919ECB53", + "qy": "6D73526716BC974FE9C2973075431553666FEB1A9FC41B00CCD575AAD6BF0742B84B367ED79658F7CDEF5F3560F290B8", + "r": "4BF1A102D106FF5FA25D528E354425F487BD34D52F325A0162E168ED80F32A821E3B47AB05CF358130E83749A1470114", + "s": "D174BB861EBE1497BBE78FA9AB9592453C3A2928501D32B48D7219F842C010CB2CE322855BE6824CD7C0856D2A9A5CEB", + "message": "F3F1EA4963219F68A7F57CE5DFC60CAC9DA13F0DA3E69BE49D823DBED7387F890D9F359DFD709CC2173DD790215DEB26068130906FA242298FE8B9FFE4B7A57E859E43CAEC132DCE31AFB0E5102BCD568221757DB60528506A22B12A3ECD72C723E7BBEFB46D477BFEE69597F3AC4C4013F7CD567EC966418DF738348E2BB5C6", + "testPassed": true + } + ] + }, + { + "tgId": 14, + "hashAlg": "SHA2-256", + "curve": "P-384", + "tests": [ + { + "tcId": 196, + "qx": "FCE69C44201B9E921CD37BF70533CE3AB533361AC3FA7F41401DCF848B440EDF086B21B9CEDCCBA22D893C24E2C26A31", + "qy": "DF891C4D39075B013F555D3BB81D6E34FED6B8BE18A28866954C2A834FAD6755D7FA3577FEF028BC2AD8B7D3032CA639", + "r": "8815D121429DD226F293F1A3C7B60FF9E00D5FF84A551FCED722242621F24CD44B9CF655AE2708AE467C7ED1C04FD928", + "s": "EA529132FB0693696D3ACEE7023CE88B00A0B2D153425F2134A6CAD7C6BB1E8A3C6E056227AAD5E48A294E43B1D6DE39", + "message": "E41D4FC3846C374B9E0B0304845FAE485589B9155EA7C34EE033F326538C829E69B8F2A8C0D63E389DF5E6B5FFA0E2B3256B53C9D38EB5D6C61099C2A4D44084C103A46712D4B3A8528DA3137D8A5E79F698FA941143A10D1F047D747E90C54109643F5E19D94B20FF650D749BD5DB4384185369164AE80061BD405EF5B20D5F", + "testPassed": true + }, + { + "tcId": 197, + "qx": "202094D68DABBF0466B36287D6479DCB6B409ED7AC37DC9312F6510689FF334E2AA47BA9BA90A1E7E52FB0929C20360C", + "qy": "EBC95E9E464E50CF45AA2F782E6792E8F2558BFF3410E237DBC2FE4B977C066D01D06975D1629195414284B95658689B", + "r": "4559C28F2B1A6700BAC07F30EB11D26FAD98C3DC5F5A6A819E633C5F3732BA7E1334FA7673C160092864DAEDD04BC5E4", + "s": "F74307AC7AAA5A1A9706BBC8C8C4246B59D8495774F7C90D07A71509D5620A957F24E2DE7E972DBD8CE3DB197C68A9A1", + "message": "E8167B031CCE922912CE6358DA237FAAB2E924E3F36EF15B2BAFC80BF6C7570FF81C104260E8813F2423B7AD00B80C7968956CA2B4A791F959DBEB9D0EB64DC97C6310E79DE83F1E8CD98B84674A37174DD6C24391D3730903AE2AA0060D18AFA81EF837CF5A502BD8FD7527B194A7847BF2AB2666F5E8749BE041EE14181C02", + "testPassed": false + }, + { + "tcId": 198, + "qx": "6C955C5DDD56963AEC4A00F9EAF1BAB9FE7CFB0EA4F38CD4FF6B51265141049B0753C72B58720F151CFC80EA5613F763", + "qy": "988F8FC231E54FF2D326F5AB56C8301D10DF8C897CC68238A02BBFF752B6E708E715B1D570EBDC35DC278732C99DE522", + "r": "14ADC1E61EA44C8607C0CD511008A63E2B8C2104CDF87D2C647E89BD5F997A16FAE6896244BE3AFFEA5446111CFAF0AC", + "s": "C2DF7D354BD9DB62D0A3385EC649CC23F42FF89E3B2D353CE786063EBDC74989E7D6748057B89BC41B1A2E5629305468", + "message": "3AB27D3BEE54880FBFA20402F4FF2AAAD69FB39631EE1C61D2DE7228B02284942691563C15EA1D57AC4288198D75F0A7A11F6870790F9F91EF92260CAB345147BC9277E4A7CCC93F102DA5D17F0CF3F8EA1E5D016940279E76FE09DF2A2E8452130725806DDBC6FF21D2B0A0AD168FF871503A3087654FE113E5BF6ECBEB12C1", + "testPassed": false + }, + { + "tcId": 199, + "qx": "760E44381AEBB328F5DD2814B10CC122668E256722FEB051553BB3FC166F4AD399EF173D4380760B4A50DEEA58B0815B", + "qy": "3892F0708F892E0B0E0FC20AE6A4676AF09C3C8B3EAFFA95FF45C08F1AB926CBDDA3F17873CF65DD7C79E36C18390A39", + "r": "74AA7CFDDD39145B7AB1C53234CEBEB6C988387B849581791CF1A67682FE2E89B172E5BF9F4D23F4228F15D75E2587FC", + "s": "6FFD40FBDBDA740BDC44D4B8676E5280E075E2B9B7E70F7C8F5EAF4E1A9BDB4C915D565D71EDAC1F4A24C6E7E3E986A5", + "message": "453E0192EB8EC27AC3937218D4A694FEFAA8889C41515D388417E0DFEEAF68C7ED5F85573074A219E3CBAD9BFF3E6F826E163AED5F97BFCB9631078DA7A646712F7157432802153596E734001CF36A8CA488853520983945A2AE5945AA380118CCCA8F6ACB140AF34B5B8599DD627AEF77B1C6A9BE123BBEDC225833F561911B", + "testPassed": false + }, + { + "tcId": 200, + "qx": "E24192DF8124AC9932EC52F6C0416BCA50BF18CA84BF382EA064793A8781CCE1EC42F5160261FE68CE466B461B088061", + "qy": "1015DC5B704F1FB6FFCBE217B546A35032DFD535F5D458A9DB31B6460EF1465CD6B9026482CAF708471113DE008DDAC2", + "r": "C676783D0FEFB54B1E25E23CBD5DD9D515C182462EE2F489F1AF9D728C18347B94E92032E22FB6C35B3E964E1E1DC1E0", + "s": "659E370D3710EB282719C291ECB5F15AC526C4353B287CECF0D8B3C64AA21431F4185AD161D4CABDF7484B32755E8ECF", + "message": "DA3BD53BB4F148208B0B604A714AA6CC61F94F71ACCC41461E51A5584F3EFFBE8FD82665A451BF0D3D252F585758571F0E69A0FCDD303300A1798D73FF8545BB64B8A2C869B43502F52DA2E0CDE3C0ACC4A5DD95F9647632A0901ADA53B43BE005FD3C17041CC4ECFE9A605362D491BC54E1283A664AB9A1CFA6E42EA1339C55", + "testPassed": false + }, + { + "tcId": 201, + "qx": "9F30503016F048B582972E5ABB2350D363B71E1D95882CB66EAB2B5D4225BFFDDF2FA65C3ECAFB47E8424542D2A74F2B", + "qy": "155FA19382A7FC3F4DD3BF95549580AF00F4E4AF67783C16E11F3AF5DC592B25A5B7182B0C5E08B652C34F8F413CEB1C", + "r": "D0114D1CD606090670A3440A2B6E04F9C63A9CDD47D7ACC4839C3AF22E8249EDD11D31FD56381228907622A1EAAE8358", + "s": "E0E7AE4184DE1B58751D724613A6E1B15DDB544CD16302461861EB473433C501BBC9FCDAF8CB0070D8C1F23A61FB6050", + "message": "CC9C85D6F4C321E3C34AF8B4C6DFEB5562418181C6CD2E435FB38CF7D75A43C757EAA0D059824E87A865FBF9A43479B19E93FEDDE066EC6D6CDE58424ACA48BE439CE9409189E9611E61E7B23B9B22B8F5D7C220198663402A325942E36CE890173694C6ED6F8960B4176443A7169FC6213CAF335B60F5D862D6AF1AEA9D7882", + "testPassed": false + }, + { + "tcId": 202, + "qx": "517CBCFC9B3E6E7D445D67A68DE2513B91FBCD11281EE66AF468EE0E8B25BCF9B0E1B19477C09E7DDDB41C4CC1336F52", + "qy": "49219F5E91D03429CB7ABE0FF25F0AE33B3814616951DA043537074778F51A737757F261658B79C1217874D9261F9B4A", + "r": "0132658FFEF39CB8502CD88EAAC3C11C5FB932299D485EF4285D71102212C268ADFDF44B2648419030E99B33F57E997F", + "s": "ED289AD33EF5B14949902879880B8E615A94816A52E13615AAEEA73DE5F95AA46B445E1509074D223B0CB434EBE4C9DE", + "message": "F9A4400DD8C8963851E2D6C8C24A830007844D989BBD589C7A01DBC4837477A4D69FD9010049930D13B95D5BCF505B1731DA94BD74E87AD2A541576CD5AAF2AF3DA5181D62B4DB9B41C1801590FEDDD26DB06F7523B54AEFBD3BB5DBE5D5CE94CEED59AC22C8C8A150B772BED8380E5B1C3C41A33FC09C97523BE62A552B53B4", + "testPassed": false + }, + { + "tcId": 203, + "qx": "6093331FA725E85570B975F19E44C6508B0F612756EA3B5968E3C1A1F8A778656C29EE3C9528F2A0EF8EF48E74EDB8DA", + "qy": "FA64E5F59EFBE2EC97D201CEAFEAB96D9C159B8DECE7E83E1659871E95E63E48165750705AA4689A827C701DDF520286", + "r": "0BBEE117A843C4545881E116915645578425CEC9732BCC8BFB9A63F1B3F3F39E6A609B5DF3563C2C9741448028BEE3C2", + "s": "4EB60CBEB202B1D8189A6F68E51E06B6EC6DB6EB316FE88FB77A06CEC210AE9DF2AAC008929066029A87D8C34611A29C", + "message": "A1AB98A7B8168FF499FE1F1961FCCD30163BF82C6C61590C64F36769E08F27CF05F7A33D90E4C79E9812DFAEC122B10D9C609A9CC9968845E9298C7FB4270779ACE13B120A6A91B1D7C2C3F5A64235F0731C90E709D3B0400AADA821969F605B0786F1F712252A2D48A47079D793F2914B221F15830E009DD84E383498D95547", + "testPassed": false + }, + { + "tcId": 204, + "qx": "4AF9270DDA91753D8C66ABB78CA0FF6A003A3868FBE70596665183AE681FF8033B3ED120212F59BA05578B18FAC95753", + "qy": "BCF07CDF1D0388746C6B96A211FAD577C7D298338135EFFC40BF148AAC2F2F903C0818CE61F638430DDB0FF3F6F1FB65", + "r": "B6B9BE4D4FF23E40EBA1F08939719FFEE03EEC9974FF3222A5EE5F26F2E39F13F5EBC3C8CBE6F13C9317870AF24957E1", + "s": "B24E21301523EB8BB8E69437B5E93E0CFF77F189A71F9BDBE9186F43B01322DA5D4221278D6BF28AD1385CF266F3CDC8", + "message": "7DEACB95BE7B6D4FB2A47B44DA28CECCFE1ACB763046EA8DB44BC9FDC80240655A4D5A278F72CE8D189AEF7740E0ACCD45CAF65867CABBD8125B078C0986EAA21CBC2587F51496F4733340EC1EFDE8BCD8D284B2A55D227FD4503C266741C059870E74299D849FCA7C9BB6894A90284E816FCEC9E071B091E5C30B95DF139029", + "testPassed": false + }, + { + "tcId": 205, + "qx": "96C40171B73D841046D5674D42D9A28EEE1D429EF9C928E85012A8BEDB4405E3977BD02D399583539ED32256C81F3AD2", + "qy": "81D8BF4613078E6921484A4791E15DAD0B728DA7D423774A76085E70C57D2524AFD781B22638DFA9F5FA9C6139B77D85", + "r": "63B67233D9E45D3A9EF442D1121E54CCB79A973FC9FF45390ED3FB38FFA77F1BE30A9C3BF92BE5A317AF23B9F67A127B", + "s": "B0DD807D424B9ED372FF9304A9D4220544B871C229890756A6FE3278D2EC338BBB61F43AB6793AF4790CB2D95E458799", + "message": "AC4608CB33777D82788F67A840626585022E3ADADDF50EC0FF770239A4225A4ECC8D66A3B17CBF6DF455F8CAA2358B9BA26BD7C458FA8F13EABA47F3E471D8715A09DDCCFE08F1D9F292D46D08F87A476BE7AB7C93B458A95964ABA255B2FFC8C301C31D7DF6834DE86B78B0A3E978965C9DA5E43A9B721E265AC38155D9456B", + "testPassed": false + }, + { + "tcId": 206, + "qx": "13D854FCCD5FA740BF0B91A1BA8B1E715033A6E7E03C7F68E8AF266C7A6DFC107C523838447AF9FCFE9DF902503D4CCD", + "qy": "7C5400F76A2879C1B6412B246A9BD89380BBE4905DF5A2A6C0E8A9CE660AF1C92473CECF14E5A2FE36EBE896885E54F9", + "r": "811451E671E2E80288A38CEC71BD0985873773F13B7E349ED35A2B9C1141BFD26DF51CC6A0DBD664A296675ABAD92F93", + "s": "C4936D28134445F82BADB7A23CEE97C04A486633969F7EE05EFAFA2E356FEC9E3A256BF075101010059551E1CFD81791", + "message": "20F482B99E06B1F62FA048435C84456AC5160A42C4072D32E08985E651FD9273AD7A4AC5521BD792000E01E9FDFC1B2C59DD4CF69D71456BB9D4D57599B1053089454078B09E47120DA8B40A72E707B5FE1E97572E1CB9EDF2FB64992DE53BB41973D004B11A4AF1357A13575E38671D6E035AD4661FA45A4AF292FB907C8C21", + "testPassed": false + }, + { + "tcId": 207, + "qx": "89243EE91B53DF679E3C3B1AE81BC5D3BD9836DB4E5AE110D5CEC42EB373862803348032C79D13379AA6911F537DCCE7", + "qy": "BF45FBDE2EDD79EF7FEFCCB50AD978966AF8D0B151CF086564C6AF52D3AFB11FFC730560B3C52B5475766A189B548E1F", + "r": "1BD7B7A9D6FAAACE990489F7FF71348283C9846222497E655ADD082A14538BD7EE46719A4F13A66B3AC4552D16CFE3A8", + "s": "35BC57D30689200FF4614A48EFDB9A448657F2A41687420F10A207819A3295EABA14279551292048E8C2A2D8728BD812", + "message": "3F0B23C53E98CAB18AFF15A2F4C1326E86E496E7D1310BD4595792B2F91492B4A5FCBB89AACD09A34392F783A7E9CE198349E05BBC5435FB94CD92483B0E448282BC8CC3DBB5B8673F533B072C9FA2EC9FCEC03D96157032BF963E633448F67F9A232349D66EE8448777702D87F592D331C790318EDEA5A6066331C3F93FDEAF", + "testPassed": false + }, + { + "tcId": 208, + "qx": "C2AD924CE190C6A6AA80E68D8B7FB3AEF4D912D3297B3A25358D6C21263D9664A0B413229CE2AB6D60F4243788D2D1EF", + "qy": "C455679B4683CCB88722776977115E55FFB0C2AC92BE4FBCA0541714D873A983E5B8019A7D6D75719198E603B146FFCF", + "r": "6C7224C7B8868C6A678552DBFE93DE6C6B891780A61F5887994F39EB4786585CA8571443290D53A4F3056E2C34BF7FA9", + "s": "55972BB46670E6B14717E7BD57F3175B7999E60E8EEEA9BFF3CE1DCE643CC1A2438DF48DE111BC3E03000321CD63EB2C", + "message": "5E7FE89C0A27CC082F2847C2774883B8DD7640C685E1E1BE2C9931BBE7695963EBE57C53172329A572F577A2D5F935B9E86FA553DFFF35DBD300C033CC3EFDA7CA1CBCAC016C2882CA1FC6BABCB4BFECCDFEFAE5102480A7927EBF3FA5F3C539B0335794E502B8E355B57760A6C85A924065279278AEDB22B1A1AFB94F7D3742", + "testPassed": false + }, + { + "tcId": 209, + "qx": "1A2BE89A3D167B1E67DEF718C97BF090D95988E72D45A23635D094BFE6F2E59E0292485CF30439BEB9D5D1904EF83552", + "qy": "34987886D78721C0394020CDFB5700DD0B36AA7F848E0386974E8A60A08F5F49E6C1C2BAF0C565E7F15BE97F6CDEE92E", + "r": "0F29299D4BEFF9DF8A0BF969153C3A712B053A476B96B4BD04C5FC4D6F0358D07075D268A02DBE98ABB9BEEBFE3BC354", + "s": "52C7F0210EB7619AE08C475381B56A5C98F647CDFDA8C3E60F77EFB63614772EDEC7A332BCC818F22FD3476FEBA412F4", + "message": "4B7B44AADE986690BED5913EDC2F361784651F90BEE39B5249C62C72A76DB0B82F91E8018DB584EA2EC458580B2158C0CE9511F8457EF0347CD26063829554172D9D5F34EF05AD965E650EAE171825A92AAE07FC85DE568EC6D8073B4BE24F3D72707031CA836FD69296D69B0DB60C830DAB46D1D2C7879DCE2AB85EDC3F2C34", + "testPassed": true + }, + { + "tcId": 210, + "qx": "8DD086A1332A3032C63D6EEBA670940649349DC6513B2FEE9B11BD18E4386D48CA96B4C0C49AF5C4762A6A691ECAAD9A", + "qy": "C09395102CA5AD42ED74C66E4290C5B28FEF29C59D5F7A70E6F73C1752A63DDB7D076CFFF49B9FF4C2F557369D51709A", + "r": "CE31224314E96445C704F8E246EB1AB5D7F3CE05265F7BCBC7A3FDF2D893BE4A914031A703E506E5942CF419536D5276", + "s": "040192779E27122FB98E64A23CE02880DCAEB06EF6173E2D3D6E927283B0E0F094871AAEEB83A346AC1130F27FF90EA3", + "message": "C7E9C5DE30356479904E4F2185A68D81D621524F1A194A85C215EF3E682D6A9648F53CEDDF5AC4802A16029387B3EDAC38A4518AAB27FF03D6A438F5B58E8F93E2D6D47353C62627ABFD77191D212AFA0AA5CCF8C14C6C1D6890B40681707EA12F20B5B1AEF851059D12D6184467948BAAB965342FBFB49787836BA5CCC43982", + "testPassed": true + } + ] + }, + { + "tgId": 15, + "hashAlg": "SHA2-384", + "curve": "P-384", + "tests": [ + { + "tcId": 211, + "qx": "57E7E2F8843E49BE1B8AD51CE84648FC72290CE6F7EFBF8D5F6E1FACC35AF26AC1B9069BD79CEC6112F957CE3FAD821E", + "qy": "04ED2D350635D2710AF4B3F7BE8D81AC652F12F36769523EB7A0343A09DE9E71D6AD2E34545DDD91820387966F42F749", + "r": "9C41BCF15669FF529B24C530670333983F44693211FB9B87BD6DF3B203D1EC2A1539FE8C39493B798BFD2D937B05A613", + "s": "533A598B7CD6469F016BAA31DCA88822DDB7BF2DDD9DEF9D761633F768BC4FD28F757DA54DE0C38B89CC7811524129B8", + "message": "FEE412BC2D4A22C7C08C85EE71710A5E7C0690BD571E53C5E9737C6F4DCCE92C3575C7D5EA77CD9AC0D98EA7750CCDD9C71E2160E32377C5BAFC33FBE4E2A04F34FBFA3F4BD27C9E6674E1CFE40DC11D6F6051ED1B1E2730B412A76715340EA1A873B537293C39190C3D7E0B542BD861644930F38448C2EA32247B84EB89DCE5", + "testPassed": false + }, + { + "tcId": 212, + "qx": "2B665D74F25D13ACE8B55528D7DB6F64C1CF23EA5BC2B73B226F7E58E001BED7FAB8B77FBD936EEC4BCC954DFD0C8D9C", + "qy": "1A39A0D3C41B49FC4FC8A4855601C80A924095F20642C7AD42CE3B6D626D2C20E612DF6A309CC7954374D07EE2C44D0C", + "r": "D0E404312E828F1D90C1D142313C7C72D59507B6C4C2844182A1DAEE2E0AF85DA3A78323FA1322179099462C540E28D1", + "s": "756632C8E0C6E14DAECB4F356D0421E065A1E24FCA6BE2C3AD61BDA841B8948C4ECD3B6A767809765144888BF4F55F1A", + "message": "5C847ED155738778A9A9982E31D75633559DB867868A8F5C26C3B636624729A7AEF3BF30F66C0AF58DBBC903BC409FB6B037E223A5C7551BB5753E5F69153473AD556ED08E066B38C15E2EDBA544D164221F4B96BAD6FC1DC44D3662A4CB54BC976F488EA5C2D5FBCE9DFAA2E41969EBD8E22BBDD1CCE2F5E31393630139D5BB", + "testPassed": false + }, + { + "tcId": 213, + "qx": "89D009EE7960B1A2A7EDD3C4AF3EF31E0F1505F67AD7885C84E927F0AE69AF1E9623B7415F07D015BA7E0F3D8BEB3747", + "qy": "0D3EF1366E85EC1F7949B83827C55740EA66D8BB9359B0FB734F8E66F2F7A5B9036136C3B1CC4EBFA93F6BDB18161435", + "r": "222C90C157A69F51EAEE53DC72C7C8091AF3AAABB4509AFCD1ED802EC6E4346110B859190A4D03FE2E1C98736B117235", + "s": "007C63E96DE6B9DF27737B3091AEBE5A91557EEEDFB7A460E5D4348D8379DB2519CF2C227F3605B136A79650FAE45F47", + "message": "E11AF2058D17B7F53D85D72082E1467DE0DBD50DE52F391217707CF5A3CE0B8DAEA66BFCE741765BC4038D22FBE66E35438C1DDEE56F894D16D94703737BF9CBA7D207F1178A09FEBABB7D6F7C50EC5F74EF719D99B360B5988286F140301641730A72E745E324B429B792452522D09DCA883489BD6CD61ABA4DD43B3E33B64C", + "testPassed": false + }, + { + "tcId": 214, + "qx": "99F4A7574618ADD4B6B9DBFE5906F0EA1BFD322B42B111DD252D8AC122DD55D030EA7786A2AA3C63E8C438BBAF6249D3", + "qy": "AC7A6C25D8CC0420FE39C830058C65B745BC4ED77EB2C717ED9A323C9F384BF0066573871331F33FE40DDEAB3E45934B", + "r": "A0F879880228FC0059BA78ED7783A8A7256DD9E0983F56DF1969C365D90E4C66FC00D15B505D3B6C660E0A5533F1E7E2", + "s": "D7BE5E5CD64645C5E25FA9A15D6E01E6F7E759C584F8BAE1443B50458485DF638A54C57147EFB52A761C5E3B356A92D9", + "message": "80421DA282D865AB10478264EB71F6EEF51757831C2D5C6C2252D15DD4D354CA9F9F67FAFEEE0DCDCCCB4A9A5DD68A5B1E154BADBE07B4E73C1B9090A532765BE1E03B76CD140340C5168AD0159988B3E276904A2F36AADA15340F022ED3E3579C5F33E5896DD2AE607AE369E1CA1C4B1EBF63898912BB14C6C4E3A0C364BBA8", + "testPassed": true + }, + { + "tcId": 215, + "qx": "CA75A571FDE1FD4A3E401AA48F6818F291E8D592A7F70461FFE60B30923EA13C62B00787ACBF4BFB36292701AC61CC3B", + "qy": "57C0784FC77DE08592DCA633101E12E13890180D51ABB99C73F675FBE30167CDFE0D755A7F9D7F6B69AE1F354525BDDE", + "r": "F437BDB3D59E20109325A2B0DFAE313C30FB3612D3532FDE4F09A7EE4541B117287A8A8B2868CD091620D22A1BF81C38", + "s": "C41EA1BF2600AAD1269E39B154968C1237A619D70B899E00C1BB136D89B9F15FF40978BF6EE78C4E515F5DEB9A129064", + "message": "6F2139E8EA92887E216F96798D712DF752A4D806DACB5E0C465E73A0C91DC64C4BA34C0D4636C4763D53D814967D3DD6867EA6A5D647A9BB2F7F1EAE09C6D2FA832CF6CB47B375F849AF4E84878E8C650D7C669B174A79426E93C1BB2E0E268CD85FA222E34B52EC19BDEF508A184EF03B4DBD2F52AA59264FDA169AA08FB539", + "testPassed": false + }, + { + "tcId": 216, + "qx": "ED470D7E8C5E1DBC9C71C83369025F2379660E289C456150521DF76D9BAE8ECDAF6D6CF7F8038DB36C56366B0204615C", + "qy": "F5EA8A52016884A012AFBCDAE038940BB0C467DD7CF4F8EF8E14A9431FA1C21E5F847BB3F502A00D737C1173A59AA290", + "r": "E371430FFFBBDFA1534A116BA27255F463C362D9FD32FC5B771D0C1C57EC5DF7585D9FA9B0BDF9891C242B13626229E9", + "s": "4543AF6B86150533475554BE4C0AFF5FE438FDCB8A0671C0AB01722CA8722349916077201B040840EB1F18F52D990A5A", + "message": "C18D5857444B8EC2F92C1475E96CDB398C809AF547BC70525FF1D09AABA9CB905543A936591B270A2CB52E59003189422C466368A053AC6BC3B2736B56BB77278514A673AF077FEFE83B49F4273304D25D275623D151A5FCB7593ED90B0F4676A9568D0503E669826934B9455064C4018B7E7B9C31217E121AAA5A198AE924A2", + "testPassed": true + }, + { + "tcId": 217, + "qx": "3F5D9FA31B8E45558303BCD7E630D81CD5D49ED34FC84BE641EA0FB649B59D7CA38F10A4C0B479AE2C7D80398B597A6B", + "qy": "1C06B713E4198FE31F1C8E3B3730D025AF9070B92C6AEF3E3F4E07FC72192D926AD8916B282B588937C0F48FE59C20A1", + "r": "E6896599FB4F2FC02BE36C747A5D456FB50522072892BE69B5546D942830F061D55A266A9048AF3F44CDA8696CB57361", + "s": "91F2E7B68F9BFBA7DAAD0E3C69262C724E355E0F6EF0C20EA8456B8B23E0D59FBE9DAD7947B6DE2C684ED5402EE1008A", + "message": "65645B9CA6786273930F7758DDD0F504BA2DC79D93B6E003F276AD3C1007A991D02B31FEF3DC63FBD054ED02509AD3196F0772282FAA6496634F78097432C88111C8F2B0EA650C2D56F747F84D43526A7F226ED888BA5AC3DC1C63FF09B9F3184D3A46A305533CDEE0FBE3896D41B2C64E82C3674A15BC586BF7042643EC2839", + "testPassed": false + }, + { + "tcId": 218, + "qx": "242655FFC8D4333510CC635947388C5762A0E1FD7FF105A6F195B48E153E01ABB1DFEC5E28A1E3E1372270D25DCDB950", + "qy": "C0611C6811438E39116AFDD89AFC9736CA39977DCBD6471D84FB9D67A70E8AC20849C40F5114B706EFF66E904A3C9D79", + "r": "CE3FFA7100E504101B84B9F2F484F755996C93FEFE7151D1C9F17DDF57E999250B46B49F8A46F6AB9E10DEE619D3183D", + "s": "6F8A4FF4969C7178463C4EB83A53021068EBBCCF037364F4B39B0313D6A3E6C3C118E21BCC1F3C230A65B82C26667F97", + "message": "9E16AD0F5B388FF05C5A15D887AE395CE0EDB9FF67ABFF0D2450CE4629E958392E0F60DCE7E3C9480EEBC452B0627652741B0375A327C9FFF395F325819DDB21ADC53AFD01AD78E3635D2630AAF2A217754FE3050A06FF690C618960C72CA6341C6F44537AECA258210E7BA390D6607DF5BA5227D1F890F219B5EAA3059AF2DE", + "testPassed": true + }, + { + "tcId": 219, + "qx": "009BA7B507D35AFA8963151442D136788664F6B34581A4A0658D7AC6E5CCD8D56D86B2BD047D7D9F80EDA65AA70572CA", + "qy": "B9FCD00A2FE2444FDEAC49C08EC6E6BF3FC9E2D00CF1C8F3D671C2E978E266D0AA9F84F55E0AA5CB03937CFFF5B3C554", + "r": "107A6DB2734AA881734436386E9213D5D251CA240EF1CF6151522B76E5593FFC1EA830E2CDD890CBB7FC439EB2EF1F91", + "s": "9D1BC9371572DD3214D863ECBAB6DEDED110E838E0731F52351EC7D416AB2788A8984EB11EAE34E3A60BA62BF6ADD4F4", + "message": "1D14218DF872E4FA12358EC76231AA656E2F78168EC21628C6EE49E5220DCBA96C3BAAB0C4C205E42F53DF2D7476EF2F838F31C8A88E48C8C5E650FD57144DF263033E52612EF59FF721A4D68ADB0F16ECA0F970002EACAB8D0CDFB962FC05D4296A09838DDCD07DFF31F75539D6D4A4A0B3FA5DE8775C6C86CC2E31ACF4D1EE", + "testPassed": false + }, + { + "tcId": 220, + "qx": "8FD8214CADCBD5C1788960EE1F49904AA85CB9404BA721D6F223E05A2B3267DCE31AF78854ECA347184C1EA47F591EA0", + "qy": "05A19155F6ED16385ED3156E89759DA97F1217CE7B380C82EACF34911134A1C53F5DDC75A0B36386D45C5CD4A09EB3A9", + "r": "EF22DE268D5E1AD343A8811DAB0EABCA112A19C003CF3843D59F1D962D89C6381E970DF3B04090CA9D92DA931A83AB95", + "s": "0B7355372D4DC313838E07233C2A19798F6EB911A0DB702DE4DA6DB1934A7D6B1F8978BE505FADF23402A1EED0A16CDF", + "message": "758B4B26505CCE60D3A6C61CE889753203B3E216F6EA8655ECE75239DE466FBC8D7C4256604397A49175D04DA38B8B753BB721A87B90F5B7E1AC6AE70060D5A4F36AA874FEB0E9245B5EA6ECA1670156CF5399B3EA632635F041064A68F302386172B5A5E25BC8D46B0B0CA2C6E6F9E8F6D3DB03983716A9108ACFC785553067", + "testPassed": false + }, + { + "tcId": 221, + "qx": "E310CEAD8A969C34FE46B546A4922DE89BD021FEC994BD3C2C2B8ECBDC285E5D308F71E3941AFAD086BC8C34A1B7BFF8", + "qy": "A2F1B58AB799EAD71D9158CB085399C28C3F051DE01EA701C9EDB5F7A17460187AB320D29A14B452AA84FF111003C15A", + "r": "2AA1064D3F0648534F9EDC3C61D01D32E7FE4692DF761F039E31E4AD21ABFABAD6B1AFEC1A0874294F62C472996E47A3", + "s": "153E4DC7B37EDBA1EE510957A363DCA5DBF7A16105FB6B6368589B219657CEFDD6BE98C6797CB224A3E51DE2CDBB62AE", + "message": "BD4B365203C8CABC3CB8679808AF93A006BB9173EEF7C862F5ABC595C60626156902611ED5679A33087ECA8B6D1619094EB4318E4210CF1E6A0CBA9DFBD33B0644D4AE22B8E2553749D383BD16336EB048C168010C6AEA182419012A9FE4078B3CE0BEDCC662CAB6B63DF92C28F4386B365A81035E77E603B0758482990B7542", + "testPassed": false + }, + { + "tcId": 222, + "qx": "24071BE4830F45A000B41C3B306583B66D3E29A441C7B4C4499BC606707E6CAAEBB296DF850333DC34DFF0D0B2073E44", + "qy": "64E8ACBD8F07B57523DF46EFCEA0719C4A077F693BB544EACED7E65A8D1EB3F9018D5FEA6ACD637D104B945F76F61760", + "r": "518302D156ACB3C31A327DC46D772F0B4ADF9ED6790709E1060508F189A3A8F448E2393ADE369DA933BACBD953F64F67", + "s": "E1C96A6CB91AF23751AB848C98FECCB07148DF85D5E7D632C8DC052919CD9970E09C54D93F8770D6A2E12BBE736668D4", + "message": "24A5A921F5D59F756E5B0463FFE69F254B0E9DCA57D15B1818463F6A25384CE9C82143C8637F46A6E0E621B839868C5AAA0A61529DBC6A686E0CA03C7B7F5B8F133EE98B404A30AD603B87C239C925B882BAEA81C75F28B2AD8413932CA6E168A85A815E3F0F14948B29B1C56F17EC81A0CCE35CE703EA949D299B55DFBBD711", + "testPassed": false + }, + { + "tcId": 223, + "qx": "EA29126F3049AD01B68EA72198EC18B050E360BC82261D519BDD32A01EDFAD8D20A7FF1D1DFAED28A973984CF9867B49", + "qy": "CE17BD602892C2E177C4EBF28EACB91C100F0BDDD45F506A88DDFF3F46FD6907E8F19A10C27B33D70C24D7D8498B1763", + "r": "937551CF0C743BCB70B1C6E14F50C09D727075EC50B43442535C4A7471DFE777B34F76A0D2766AF52671F893EA7229BB", + "s": "1AC29A2F88842E13D1EAA1BF6236D4BD06E5EB3CD8B30FE45E5669FCDBAFD8C2388D606A26B41DE2D21235A4AE7F8963", + "message": "8B458F2BB8131D7409701923270C28377D51CD820EF6C4717F8D33590B82F0E29A9A9E7816BD2831C5E62F9C4027AB81EDFFC778C744622ABEA5E9E144E25A390D594BD28E153644C995C771218217686E783C65BBFE3CE66D2D8E4D02F2C68C57501F589019F929658276032AD0574CF3EBD40A6FB2892DB2DCEC883F9CC740", + "testPassed": false + }, + { + "tcId": 224, + "qx": "086F39F6227FB0200FB8DA2EE5CC755ED40EBA087F00B82DF1E83CF280F883E71037A0B39D6EC38E0DBB8BA7B967EA9F", + "qy": "2058BAFF4C3F071EF422C3A10BEDA8285ECECF2C4075C9AACFA4C51AC287C3DA3F8752FE6FC97DDDD798D1F72A0FB3CB", + "r": "6817ABC0D41CA736A17EFE879FF8686DDE084C5DEAD7283FA0628DBA4DD5A0A39BB4CD03A759555BC92CA8378E2514E6", + "s": "8523CA5CA4497FAF28D31616AA18E75026A9247174B98819F1E5382890BED920D711C3788EF4D93AC0593C97B3143243", + "message": "B80E9AE432330C154765024A181D68B9F123AAEBDB8CCF6928DEBBBF91EDBD76DD1C55F81C4262EEDBD99D9091FA4382E807F73610BE420D06B6279422E8EEE5F593445C9F50C1E85ABAAA1D9AD5205073DDA780D3B3092278F548DE2BBCA985F73765B24AB6609088CAEA19E1BA024E945250CB6DE61C5B458F1200E049B245", + "testPassed": false + }, + { + "tcId": 225, + "qx": "8F8D143FE6D34271A49EEDD30D2B0CFE73D3FFE24436C91C5E417A5AE3AA21756459D772E851F37DDED92F9BB04A5567", + "qy": "B2E1AB6F174FD36CFA422D1183D20AB6B1871EC955552E3255A4AA1F265BCC4653F32B5250DC3EF28BA28A78106E999F", + "r": "FCA9856828A815557ACE02A14D31A58ADF848B32D229E34D5B3F463963056DE3F93D66C9AC1A5CF4B340862752B1ACBE", + "s": "D431D5F95992E50503631506F30CF3C65C8A16FAE3B43D1F927843F94DFFB04048A3EBA18E87633D8DEEB912917590ED", + "message": "7BF3A423A923BEF03065187901BDC286E13DD0AE72DA039CC095038FB26A3E70A456E1092073232AC731852FD61D482E80A4AA0829C5455DFDC496CD4E8622B594EF9649EC422A8B45F974B837006157625215D420D35F3BA0CD4C4BFE69243BE9BD303775AB809579CADB8800E62A490F953672C20B72C5260BF56CD8A45621", + "testPassed": false + } + ] + }, + { + "tgId": 16, + "hashAlg": "SHA2-512", + "curve": "P-384", + "tests": [ + { + "tcId": 226, + "qx": "1F8B257AC5A33628909AEF16B0024F7D3A5F5EB637C0A701751727E8F189F1AB38C01E3A328A608DDA9F4352A4439611", + "qy": "755103D019FC47CF998F5F0FBC451F186285136CAA5E86F525DD36DDA14B03A70B090CF51D186BC5AE6C508C56104378", + "r": "BAFBB1158AF3A48BDDC4CD3D62BFF6EFBB40C76A813A19F7A85A2DA41B5CD017214702E2502928FED6349A5452EA56DF", + "s": "496FDC957DE241056ABDF73381276833BABFF853791E693E862DECE145C61DD75DB281F8E9F54AF68BC5FA6B135ED3E4", + "message": "9D6E93BC53FAD15A381F58BF63E1C7F8A5B073D0ED052A149F2805C9280DE53075193BAA0F6E3ED5C913225E076D5108DC57F7B27DA085D819A22B91CF9B6E5A7D5F2CB5E9A3509C63F17072DD43B6CBB9D46497686390A1CF244E5F0AA2C6398600A1BE380BDC41EE5F160E4254FD6802353496D5F55A1F1E64C1C6E53EFB79", + "testPassed": false + }, + { + "tcId": 227, + "qx": "9E26582B6BD57CB8365B01B8F35C30DF334A2E01BE1B3AD7AC07824A7C8D35E56516C9085C5E3DDD6FFA8D233ABB5512", + "qy": "A67DECC5E9C2F131509B60FB1A14A3120E8280915BDBEF812B0D1D0C3804BF2BF7D2DCAD6C4E45DDAF7F2F2B1C909F62", + "r": "08AB172BC97525DF727B809AB1DE070051F216F2C98C2A976EB6FB3C2D1E811E8D5C77606A0741A1CD807E37EEE12B14", + "s": "1FA203553578D27ACEC57433F00127D5BDEA259AFA47D7377599266A01BE0A7C044167768F63D292C567EA084AF0F7BC", + "message": "2C28B7B890453E78A2EE4313A7084359D85A86D2526DF8E2937167B519E6BBE5C9526BCE3C8C54BACA05A8F64EBAE665E42C0EA1C18CE297F6F444E4FF097D4BE491CD8D6D2886E7FB485E3405EFD6D85667BF9632A07796E0D9F6C27350022839ADE524923CCCA3C340413822C271EDB6B8340232B7F9CAB65FC93ACB4A273D", + "testPassed": false + }, + { + "tcId": 228, + "qx": "1FD5439EE9D69D721AFBDF1B77A6B410E1B18ED28F87BA07C9F6787655B7704ACF7A7AD33E4C99649BEFB903369A0726", + "qy": "BDF92D9FF714F176F7F34E4D29F7FBC959A16CB2AF08BE0257E8DF72624935C4A8207E2B0AEA3E04FE428FF16BE51952", + "r": "681B721C0119A017EAD0334AF7745B63B4D0BFEF5C1301FF41DA8DAD540A71F3AA642EFBC4204E0DCB91DBDF15949911", + "s": "AB32DF10153E0849C19EABDFAE1876EF73416F9F66A5986FF04D854780BB7C39D1FB40591690A7F75E192AC6DEF2225A", + "message": "4A7E4DBC3C4F6E4AE751A8E87A1689C3883AA3F13DB578366CF319085DDFB72509216409272D271A8E7C567A1770CF03BE92281EBBB4ABAE8874EA6469FDC73ECCBF584A194755B1585FA5E96400AA57578205241D83E5626B7D517DDE80793465BA7BC2C72785C4B646A1A116172CD9F1C8E4E2322DF8478220719F0B0CF7FA", + "testPassed": false + }, + { + "tcId": 229, + "qx": "5C2CD21EE4B9805082862D9CE0FC4CEBBDA291F6E98852B8FEAB29E77E95E45D26484F1EB7521683A5769DDDEAB699DC", + "qy": "C5713107F1A3171FBE6BC8832EE9CDA66DEBD66508BADA9C0E73CE699D6C03C899E1D88FB43B075A59E108F08D57B857", + "r": "2232DFCC6E89534DBB69213FA000BD5B295336C5EBAC62534C47B32F6AAF3DD7BC433B196C741F984B4D28D525F04E0A", + "s": "9720CE40D46C4837AC24B445CF6B8D0EE4B9E1036D2564C82909F0702A6B82D6B76D4D9CD2AA3952B2D238C55F5DF5FC", + "message": "6FB685FF2B5AE729F40E9EC8B42EEE661413E879FE9D8EB9735F2E48B7DC868F5BEC6F3F34174E2DE5EB11B8972D45BC10314103A98B82DEF6B9177A88CD1406C635F6FAEAFF9755179105817C85738BDAB715CCE34CC551E6593FCC6D66BFEA6C8D3D0AB81F7326FD24506EDC6938368685E048B881940340AE1A5D26957A67", + "testPassed": false + }, + { + "tcId": 230, + "qx": "1965FF90DE54ADE6B0DD7A09E3934FE33E48E81B2AD8866F9F30C7A6C5F47EA43DE4C566D4AFC95C61A378310740FA06", + "qy": "5E90D30E041004BAF669AA499235494AFEAC1CBF597739A4CDF6D340CB690640BDFDE0C2F85DFF0B992FD0EFFE49BD8D", + "r": "C6E11D51A23CDDC86F85AA84F267F69480528B3CC5EA3FCD94E402F988A80EF4E8C0526BF3549A13289935E7B2811C08", + "s": "A3713DECE313E8C63BF87D1AE77AB94A15FE7B342FAB75832AF4265CB7493FE3D317CF2AD93056013E4EEEAAC30BE7AC", + "message": "6E3993FA813886D6BE569CD503117E155BADE493B9399B0BD4BFCB866E1D92D9963B86B79AF1A2B53203DFB82AD3868909E3F01147E1A0F4F12EEB23EDB9D99E0EC6A8899A87F84CBF2C755A2E8C3AC0E3B94047BBA09F3FC5213E923D61E1A75D0D4464936942492BACB2E721651630C12985CF6137AB532A3CF3DDD023F871", + "testPassed": false + }, + { + "tcId": 231, + "qx": "44E05E5B8E7855E29AD6BB9400242CF7DBA0DE3189EFC0954A0E568EB275AE1BC9BDC9240F376F1ED8B51AE98A853AC1", + "qy": "06F861CDC53B324581D856284515EBC39DA07EADF43B43E46BF190BB71125DD0088C9ED5C53BE4796DABB34C79D0CAEA", + "r": "D3605616E7FDBEDF12812FCBB7F75B7C983795E962561C10397A4F4EA90CB5A588605CACF0D7F2C582D9A762C613F96B", + "s": "9561E118F52F93ED17C7F85C9C60E34D95B9D9CA20AA10428CA29E8337F6C75562FC243779DEE4317FE20797C87C15FF", + "message": "2485A367ADD933FABD4F50107BFA309CE1C417F981AF57AD646A600455747330DA1F19ACDA4B306E5FC625A422A464706BDECCF6A3363B3E327DB3DE4892C0E2F472B4DF6A9B7BADBBBA2FBCEE892A1748A897165667A38FFF844855F9EC288F83132D4DBCAC1802F4235E46C63AC37AD2ACCA712144F622BF718C839E6FD01A", + "testPassed": false + }, + { + "tcId": 232, + "qx": "09ED4A0B8ACFA87E429C664979063C3F1244070DD6495F2039D11025A1C227D29A5DB813D3A845C06423A2894FF0519C", + "qy": "45818157D2C076C03952F62FECE60D53E7E92F6222AD0B65D12BD566EE88AF8AF50141B8F4F938159C636BC4BE6FF1B6", + "r": "F857418B4CE51E6416EB3EDBDCC15E55B33EFAB7D101258E298CBFC75D207354AF1AC221A422E45777E7B1CCC1A4FC10", + "s": "860DE1E003DC2724A524FF1DD60189AD59AB09EE576AA04CB1918A780CD707308E7724EB727555C944C0A0AB2DA34815", + "message": "D69ABD57F20D12BE54D5FC524DB6DD4E814CC45308A4509003C1E63495CC6AB3743A97C150662879E0B4005FAC3B26B5E993FD90AFC3026E5C0DBE1A86F3725535A88E736CC7E17EDC74170B13AC9EC2DC6D2807219F5C02AE048831E505EDF8BF130C4AFD0323129A1F300BC6B172E43FA32074EC326941F38C768FD97C9D0D", + "testPassed": false + }, + { + "tcId": 233, + "qx": "A3B566D14D34BD6E6D6AC4D181F10570970B38F43345D12F1871826190A83B071D5AFD140AF5AB7A8C33EEAF86D7C1AD", + "qy": "3C09119F017F07204EB8EF8BBDAE155857DF590B626724410A121BC884CA6E052781AE845D0E741E9877E8297E5A1BBE", + "r": "B782E7802C97D97EE454BDBAD598E6A98118F41B194DCFEE6B83C8B4B754A699C6B19653E4E32F4727CE06C83A6304D6", + "s": "FD0DC0DF39CB4C006F099BED1F056FD29DC86D2359CE97F0541346DFFF9F05D367A9DE2A3962ECBFB5CFB16F84B522B4", + "message": "44A5CB963B0AF9F949ED7504CDA19AE4371F4FECC76DFDFB0BCCC9DFAC32316B61DE380E2D3681D8FDE1EE478924FDEAC1A6BA50622B387DB3F9CCBCE3F7DB3834FF28CB8B5B8BF16FB218FFEAB1F4D889ADD7886A666B8AAAC46AB928F08B16E1D9F87EFD8797982E24B6CDB6E2411EB2F5AD6E0EBC112D7E265323F4BA1625", + "testPassed": false + }, + { + "tcId": 234, + "qx": "C46E0B830E9D9AD405390AA5D699486E052E1666DF9FECA3E708715C0E0C5C53243EF450355425D47DC2FA0B5148BC67", + "qy": "F1779DA3E902622346A00B05AB3AB6A8EB3F62A228777658501B503018BD6ABB8E236AA35E575AF0CE62A852274E2143", + "r": "33ECA512DC682C719443EF2FDD41543C25776F27D72DB202B949D9022EE2B15062024D3419D23D1C41EA79EC7617DED3", + "s": "C6B45A04EE88B08FFECF0542DCAD465EA6CE793A8D1BB16E09E85810A5466909BDA1C431DB9540A8009D85862BE15F8D", + "message": "5387D81CD00760BDF64BCBC8854ED605157D7E732405444DCF5984C5994E9DC425379DBC94F56DA8AD5E6A4090BE272D00B54799E869B0F0446D113DAF0D1C618B5C86AC7CD7BA5D1666DDD5F588BBE19733D3B5B02920ABE419934E52840E8A3460C94B9FBF60D36AF8C20815950AD8BC63C1BD9850C155A7256BDCAA2455D9", + "testPassed": false + }, + { + "tcId": 235, + "qx": "66A628E58B4920D9112B656E32C956BD8444EB73F6A6DDDD07B7C212D74A2E5EC6337996D786460D5E33E2ADECD237C6", + "qy": "A1EBF5B3CB46B3CE4CB86A13DF8D241E0B74D87A03BB53A9BCB0E7486F1E9404A3630D83782D84D32A520125C280CC23", + "r": "46E7A5725CBBC284D387B0194D0E34381DF4FF6C58454D2DD91A75FB9A0C64DE05CE512AB4060B81BB6AC163DCF3645F", + "s": "1C2F4C045E30E61ACF5E83B6E43FDACCC9B095DA3406006F81A6B58F08A7581A7BA42912E0685FC2F189B890B4B0DA6F", + "message": "8A567E6C6AA936D940025AC00FBCE9EBD346BF702F7CCF905E227190BFD5141DFF3ADC294EB08360DF127191BADE3F9772E0AA71233B2C6780CC1CED0A16EBB293159E4E535CCC7DB8E2AC5BE44F5C7B107CA6AB87A8329E8930861A2E3B438B6E55E017594F13198C311A56DAB59706E74A294EA25908742CF79E677558AFD2", + "testPassed": true + }, + { + "tcId": 236, + "qx": "365A20051A704F6F482F375EAC0D4214C5B0AC378D20D6D13FB433D8777DF6E6DC33E1DEC35717E6B8072382F1F70E13", + "qy": "9CA7E49D8B0904936698C6D867095C190968F062F5478DCCFD1F4A8E9EC6462CE9CE4081F43FDDC1EB6A2C5179802C51", + "r": "351EFF432870B71B9C9406D489F5EFB179CF82CBA53276FD3DF080691355EF5A1E4D46D691B9A75D325D66737A707BA4", + "s": "91AFF83783DED0A0F91E602271F13340496FB2E4B5BDDA39E0E2C0B1C63C749415B6FB06DF13AE5667FB18FC8ACC3BCF", + "message": "F76BB0B8313D79B694D1A7369C53AD263F3CDA91E89460F9CF98A38CF77EE56485DD92121E22D0F6CDF22FB27BBB2D1A180BBF974B8D148A7DCEDA013347A8C38422F2C96EC532FFD3261EFD1EDEC8AA9AD7D3A0426A8678A600D75122A31CECEF4D904366C7F1EBAC0201D205BB8A551FFCA550339811146658915FB1DE02D4", + "testPassed": false + }, + { + "tcId": 237, + "qx": "90726525D658702F21442BC2F8CF2E872B8C0CDF77F0E2553F887A99CF72A31809B7BBE372990FA633F4B30D133C3701", + "qy": "AE0EF93F84CC9C48DC8B3BA899732E4F747A9B2C6737804B48C4715F3346B497DC7021F84036F57AF164371768F329C2", + "r": "A67618AF9729CD6EA0A62C4841175F89C0A0BAD1C16F85910ADF2EF70E7468076764E86D7CF7CC122F0FFCEFEAC255B0", + "s": "50C6B016290DF8B85C1E0C694417C8A288C82F93862FB8692FF2DDE60F4109C9891A6751A66AF18CA4553E7EDE80F01E", + "message": "96AC09D944B9A4AE8D1E8AD25C19C07343AD486EEE1D9F6255BB7FF17A3C3A0AC432AC9A7FDFCFBDA3F625947D995849D48083B352F6C5434689B8147648A4B2B3086BB56394F3C7609A64B460E5EC0ED0F6391FEEED122FE70F2E73A7305808AB857A69A728400D9F72A16526AD5275FC5F45CF5050372D7113DEA3A2933A01", + "testPassed": true + }, + { + "tcId": 238, + "qx": "1111CBB7A0387B8276AF06CBCBCFEAF6217DE319556E4B88DADCFB9A3BB29C5C4DED2886E23BD5217ABEFE65E5452BEC", + "qy": "91E7B8392955F9DE4C923DC06B0C1E326715FFEA2528EA6059CA33EBF3DC07854436FF837BDA92F09418B36CFA37D2DE", + "r": "F9B7C9E984660CEEF9211B0A004EE7668940D7F206D9C1B507760DB8E51378628BCD3B61CD83BB9E973FDBD108E7BB6D", + "s": "45233FC776117304B660D08485CD8B6C2DD6B5A38A779ECEB6186E0CB2727DC73BB381A56D313A556A3446466FCA8DA8", + "message": "05853A34E8BAAEF405D4366D6162FF73B750B43559B12021245C8606EFB6D04118869FB165C65258B14C383748CF479FCAEB3491757A2FA437A0FA3B1360413E0C7E3DA802C95FEBE229AF895657C11F97996630F4DCBF552FA17BC4B1348261D58F8F0AEFDF39301C286D34D05F46B265AC7096C116CD9B882D883BFA7B1450", + "testPassed": true + }, + { + "tcId": 239, + "qx": "1148ECD956DB6F70172364D0F7B50C7C25EA5AEE670FA75089BD6B940B39F6ACAA09272DC1EACF6B80ECA56439E1426D", + "qy": "D8B17D28144C67DB1531FF23104F65CE4C8C23DA90937AA93DD52A856DEFF10C1387DC24B52870F0F82CC987D7ABDC56", + "r": "F3CE4D2B42E8D324BBA1632E369B982587435C3B626A44D6D340DD560C4B2A024C8810AC3A4CFD180B81BBE72B29FB4E", + "s": "44E745AE1A805B4CBA84D978EC54CB158CE384AB35BBC96B56239F13DC26B3C93EAD4D4DE7A0B8F81258C1FF0B78FF69", + "message": "E0EB67239142789A92C3654DE46072F9E57D443C9E5C55A47E071151FDD630D8CC10647B0668A76CCFE2B686B6A4AF72C105AC3F24759E44666D8B39AF487C48491CF193D234FE92BD68B13DA1BC120A40C0997A1E7AF4BEA336AF05FA65D4811F5742C8AEEF325B7FCABA1833427B1673869E83C99C9F8CE4A08204907E5C77", + "testPassed": false + }, + { + "tcId": 240, + "qx": "EBC5F9F33091A0A12171CEEC7225BF0B0D202217B82F5C2040AB6DB2AD2CA7B3078BBA3A2751F40307C15B08D50F57A2", + "qy": "0897EAFA79D24A10882D65A2F4D07C8B86A5773896B7D0C361200D0CDC0FF91FB31A0C01C904F6E5D2748BA8B3C6208F", + "r": "887492951ABD5B9CE9FFC20D6895FE3E6B682338986F35B98921890CA202D662652FF48B648FCE07A951E9F07E72CB23", + "s": "B5934E2A1866092623DDF3C060B35DA377F57E678763F2B1A43A8CC8347214BDAFAF73FA1A6CE4D23A7C9AB4A8FED84B", + "message": "AF6BC519211E99A4EEB6E763854DDCB9423A9E009FFAC69E37C606B8F6D4EF8E2F487F4FCD2B6ABB8976E1E265055C069D893287C3B41C2FBB93458BD9221ACF994C68E2547A4274C161B5BC2981317C52E0DB11A388DA982BD4C9109F2C1D3F320B649682AFE7799BD6109E4D480484A4E5B8F7624DDAFEE3EA923CF3DE4AD2", + "testPassed": false + } + ] + }, + { + "tgId": 17, + "hashAlg": "SHA2-224", + "curve": "P-521", + "tests": [ + { + "tcId": 241, + "qx": "01DC32DBA77557B6904DA09F580DDC6E8AE9D83E26C91BA7F216A210235F3EFE60AA3F43F813FD1412386F1F5C56B789A50CE7013B4C634B07435D5DDFE25050203F", + "qy": "00D838CB059C2CEE4B2FE36653D068ADCA78FBB961A868F131E982C0A7AD385042CA917113BEF9C633EDAEFF30C2C1E77B94BAA9F9355082B16E510375C760E08D31", + "r": "006AA96C7221E52C6F5D4CEF6F76B6CED14D0C2149DDA9EA02D7BA445B4E90B73173105A175879EED16A4C97D85F27CC9A42E3C96223467CAB1E27669A86B7416EC9", + "s": "00B2F57218A31E229078AACB1F981C05976B75B5C8AF9C56698D559E4FF840951B8FD131165CBCC400527B547E5F0396700414F146973D1465BD1EA57A9F658F2BBE", + "message": "C874898EF55AE1FC9CAE5D3E41A6F9AA15C70B04711A11DCF49D1ACA24576680ED1A62A06EB42730602D632C825522AE293877D50A235F2A15F7431C8B4129FFDBDF93645523E38C9D1527D04526D438B9A50B4E564160807EB7C45141C44687FDA853568DDC543586CE176AA4DDE2D94984E0D1C927A82E362040A959695BB4", + "testPassed": false + }, + { + "tcId": 242, + "qx": "0146144A1DE61217FF416351B3B7A3AEF96B3ABBA709703F7CCC94150325A6631DE76289BD49D91B297F67FEB9868156996FCB2A96E49F3FECB75799D3B7997D96C0", + "qy": "01FB0CC7D6CF57CD354CB53AC51EB352019C62AB7326224AACD360C58E53D94A479D9991DDD11615CCF58AB88B3830BDE823252337CB2B1C69F90358AE37762623F8", + "r": "01B387449E28FC8B82107BFA91CC43C60A49E07262CEA2E8B67777CA547D25FA7232640240697E2359BE50762D7F3348BC810BEB98918A94FE7C68A92FE961C0B16F", + "s": "007914F7FF7FB76D0FDE7D4FAE2850492B49DEE9BBFD22343985BAEC9274319839068955A77372B7514339672D075A0202680D83ED1AD6FEE84C2A82F0B4EE6607F7", + "message": "8CE27CF566985250C841A4A864B22D5B7F77F16EEB124D29F0B22843E6B161A0ABB3DFAD61CE2110BD7B59E3F53161461BBC7DF3AA07A86C90DEC488A810CB21259ADAC5F94917FD6B9B76937EDE07B53BD154B1D3873B8679D9F679CC8CAC330ED7C2FCE79C18706D517AE58D2145875790155544D9F9E797C16211B9854EE5", + "testPassed": false + }, + { + "tcId": 243, + "qx": "013B6C739E120A08A8B401F52466C12E7FBC13A16BB5370E090C27070ECE4C460B93F7176D40B09B041A110E25DDDDAEEACFA5E8AED5E314D2B7F1798BB5C0B02149", + "qy": "015DF3B87F3F6E224388FCE88F0463C6C0D84C638EB8527AFB5C086EA58889203FE6A2DDDDFDE0DE8C81C8A46E4A52B1C45F43FAA870F11621381597ED39D02ACBD6", + "r": "00CE83FB8FDD4E43E0CEF75DA29787B47A3A335EE089FB0E319F6B9BCF753AB8E78DF4237C6F592A6D86B96627EE40005501D2DA98CBCD91BD342BBF3778A7E6D3E5", + "s": "001D3773042D07BB78D525F323DAE32873B61E2C33F9E5391E47FE26BDF1EEFDFCAC4326F6F264A52F4615FAAE8C1B7422ED4544E623EF664F8C06F1802D1D2D40A2", + "message": "A39B0821878E7BFF2DCC36625852D7A2FE038B796296D99EA0A249B9B573B8833DBE9E7FD488983F21774E26DDBAC6F7FA3ACE4A2E3102421ADDAA1FCD9D767CF2141C1F4AD2DCCC4EB9AA65D8F37B4BC116572BEFAA975ADDE851B155E6F8CCDC27195905880E5165BEF5C68BDF2A6B8E0006C66953A30C6D22A75823428B43", + "testPassed": false + }, + { + "tcId": 244, + "qx": "00F59F753007ABBBD8DFA4898F0B38610ACCA78723ED00E27246CE36EDC037C63475E8DBB3D6F218A5107AEF463044410243E8F062C9A9BABB5709271C644B212EE0", + "qy": "01E73550C9AFD2F5BABA28C1F06479AC8A24C730418A7DA69CBD27E5B250572044F9EBE6467B38D0782C072170FC2478789462F82793AC7FE8933D6334F4923F4718", + "r": "00C6D9F30345D37AE2B9F086AEBB2EA3C3B12EE7D8964F6A1CE02EAD7DD3E91ED0148A7DA21DC24ED2B314305B8213209256BDF9DCCA1FD024CDB66A318E36995EB5", + "s": "00030F19C3A7D66D9208FD9CCDEB941B1A3B97BBB43EBD33ED3819CBFB2D683CF1B0E087D27487BD121A7C1CCB1B72DD4EF69E2563F98512B471C40F7814CCCDDEA9", + "message": "ECC4F82EBC421B166B3AFD8CAB5176F61BF6760CF54046C61F6AAC7EAD4F97894FF3365D8171D86665E6A09A43D15E0FCB1D0B69DF635823227A9F94A880FD0CD5405E0A614213266056704E636840BFFF54FFAA5B6CC9ADFD97A0959739BCD635040383905E64CBC866D6A91156BBC20F37CD65573210D8C4EE68C50DDB8D37", + "testPassed": true + }, + { + "tcId": 245, + "qx": "008DB382DDE8CD538486106B841C7E1BBED0AE3EB937609C92CDA98FC4A59642AF368AFFAB403643C4CCAECC717E73B2522DBCFBB598846E8526E44F97EE9218BDDF", + "qy": "010D6FC2C3A98497D3FB97066F9266E5D9E2492A8AFD6ECD2253B883432F283E3C63490952CCC5418B32EEE129220EEC718DAE8210BA2E5522CADEDF470E2DAA66C4", + "r": "01DEABD83377577C578E87FA29B4CB195366B36082E48526543E436A19141A141DC735ACBB2DB18613E96EE2F44E960A0728CC0F68AC90B795A806E4ECCEB82EDB61", + "s": "007E0025235C25BDB2783211623BC29931FA4BD7E5F4E9031E59E619059AA7D9B2AA8EF94904FEC6605A257E3F9D11E62CFFE7AB945AF6367BD47861E79DD7293921", + "message": "195DADA573C25846D6D7F3C82756D3298068DF9C09744E637F94D71A6CB23A54FECC0691B7530972A173377BCB838409569FACF346F6F41FEE64F87D35FAB90D53BF4BAB602AC82D5C2692FE933CC778110C1526C08E13497867BB808065993471CBB893FB96166CC56D815A3F6C86AAE479E2CE2F2AD90C52474177978E9ADD", + "testPassed": false + }, + { + "tcId": 246, + "qx": "00AA687CCC4D9F2AE7A2BDA94793BCCE9241CF16F1253D5477887789665D6D0A1CE4E69EDCE143E10EF922396352B11471F84953CBF4C9AC995626287BE7B20EAFB7", + "qy": "00249B464ACBC8C2FA9A41C7397588B5E17A27BDD9E58B044A7AC463D65F45E68D5DD175E2493563CD016B262A4D4CCA8B3CC41DB9C853992D66659A18C6DE28BC89", + "r": "0096D15C21C573318F4D78ED32B4E4657898357E5E1352C84AAF14108B0E8B7FD89CF029C6AA7F780CC0B8041F4FDFF1E95F8719CFFF70713C9D36C98E73B93EE597", + "s": "004028CBB487909DF9B5215EB03314D06A234D0B6C6D1BF79F2AD0F37D9D702A3566DFB5589906887C15C4B18C4535E10FFBDAAFA1D8AB3654547EB36332C5A200C5", + "message": "D8E7FDE2250382A2137995C9CF4AEE6602490AB715D5D9BAA6416BDDDF9F4AF8F588546C3B2B31FC84AD56187A026BB12966BBB1EFC0A62C54390E56000650699110CB3BFC17CDBDFAF978BC012EF3B4976BE42F09DC08C1C3508409E92CF6FC6958466EB7031D0D96C48DF8826A7CD943F882F603B9C2D87E833E1924638288", + "testPassed": true + }, + { + "tcId": 247, + "qx": "01AF34AA9D98034B92447A0820A02A10953B08002BA096902CB8854547622E6DF48A03190A5C527B5BF8A42D9C46AB1FE715A278F47B7D3251A0871B7813A83A9C18", + "qy": "0185417E1BBF92DB01297F012FBD09D8EA7E950A60D9692705EBC78BFF3BB2FFABE95B2958017C1DED2561EC81DB212372F60387B2471C4B1C804DC5BF1DDF484192", + "r": "00FA2303DE81F9F76703ECDAF68E2932F2599740E5EF832D405FB1419026EDEDA97CE6425325B2E2B5E5D78C5D123BF6BFB82D26EC1ECC0519181BA10943A9BB0AFB", + "s": "01835AA35028C9120BB9C7C13324DDC7C4DAF0651D203F22B3AAC5E871D6402E602F395E27560B674F7E3D730A000C27CDDC0274454F9029E717047F98854A8E6C61", + "message": "B204DFDC82BD0F6DB7B0A3F5C4997B26CE7296CE620354F1983803EA1816EF1A3FC37780D8EE1A128EE08CB5D331ABCE6F09F2A56CC5FC2985B8CA9DD09D4D446676277067EA30C01703945F2CDAA962D5D387655A56916633DE6B08AF3216223FB8907D9481A1F76E4DFBFD2C3007F1C179CFE6BF8CFDF6F3BBF108E29E0E13", + "testPassed": false + }, + { + "tcId": 248, + "qx": "015514FD79D64A3233E5776DE1ECD2E6F479E19E812BB7B40784E92E0997C9F9D3012C0782C6C4772758ED1BEFB5D9EB31FE101A9604862FF8CF9491824105B3A319", + "qy": "005EA32734786B4AFE90BF062C1E7D7D98BC5FFAC05A2A8D2EFA4EFC96CE6EDF0D9F8844A5F875871C76E2035D715E02D583DF9B0E50C3A2059689C83DBC8C9F7976", + "r": "002F00A5F65902AEB136316A35BFD7903A15DFDF00300C997F63194F685620C773256AFA5C9F070B233C8367A6E094EF1D786F3BCB9B247B766776AE29EE62213A18", + "s": "00E544DA1AD05755901CA16E52D5A7D8578F27C588899BF608CBDBDFE0A7F8E69D022C4798ECD80F201E51477E552E6863D8EB2E9D4E86E01836CDABA9FBC3625229", + "message": "0F2E4D3F89098A034097ECCFC210B8B22EFA938A3C8E1220B7A669AE830C896AA763DDC60EBEF5D214FAAD888E1A7CF43F9802920989BFECF55CFD7EDB9EFEEE1F7BEA3F05F74B318D9D13FB7B077DB425454D82FAA9E691A2E2BD5AEF826F28F6288F0BCFA13A8C1AFD3BEF1B62CEB3B6ED014BC6F416AF87BAE03F83652EC8", + "testPassed": false + }, + { + "tcId": 249, + "qx": "0021D4768F220187D7E15FF96FF6BF8F4AFAC78AED4FE2E634A8A40BE0564FB1C14434DDE0C5456273211D3984EC2B1CD97247E6CBDE94085B0A28FBB993491C474E", + "qy": "0059B2DCF5029866112CA42108146D3FF5C5BFB85E0C924E9F18E48ECC9E14AB881FEAE0F75EAA430CA9B38A49681E5072FDE32986543C0D56BE27432C0AEBFB3CBD", + "r": "00419D2EC844D7129D6EFC1689CBE1DF9DAF4CFF6834469E578683678A2830269B1384573E4A843D18F05072C45D4F8BF0A3063E0601C8D2E365C4BECB3EC6221E25", + "s": "00F2A400E3D837363954B0FA113C4EB41B054E205FB521BF1BDD00CE30F5F1B68B650285539CD147CE3BB39F703FBD36F584B4CB02A9A1608BC3603AA90896002205", + "message": "19F1BC919CB5CE42AA63FEC7B6C7CFE4B2A77F4BA352504D8AF4B13A14B3E54BDEF19568A1DCCF42B05025ED848AEBA4999492E0596EA2AE595E6E6BF87E93D0518252A16B68794487D8B94500A9ACF85FAAB9A78336CE309301D01B21561B6A96269630824B4E523C1617279F35AF2A798FC213E929F6E8B3D4ECBABBB65A9E", + "testPassed": false + }, + { + "tcId": 250, + "qx": "00788B46E6040EDDB86350220B66B5EB84FBA19C62643ED753E99E8557FC43FED5600BF4068666F2F06E84B4A3B5EE90966D8DFDCD137CA42F3096AB08A7BE20E614", + "qy": "005CC12F3FE4A8F841752A77EBC8409B3CD50257D533ABC3CB52483E09034FFFE82FD5DA1D9991ED34BA4D1F44AC2819E709456E2A6D8AE71D1FFC2F6EA61E60BDB5", + "r": "010C2AB754E53E129B130E8F1B089D2A5ED6A8B4A0D0630CE1A843102D859E65251E42C1130DD44D008E383B399AA7A8480069CBC7DC25A6A1AFD41CCBC9FBA0B2AF", + "s": "007DD61F6BCF943649D3D734247E90EDA818303F132E53D4C5A1B9576F7B10F22DA472C469F6666D90E15B258E8865225B19303D4CCBDF74BD315A0D22B703E78DAD", + "message": "97C9C05439E6EBEFDD3DBAD8D3C4476D9F0D822E22F6AF75FE9DBB51A59639BFC7D03A38BBE7A0889159F2B59020C3606477900139F66BD2027B3CDA6E7D49D0F24BF89724ABE42F0EBC248EC9B1F13A782ACEEE672C0AC0675FE4A017AF44B5E7BC66825B3B8A3265F72D43B6D331E61C548AB332318D59CD53D3AFDD4A273C", + "testPassed": true + }, + { + "tcId": 251, + "qx": "0079B143883F02B5F2FCAFABFF796AB547C9E36F7C98FC09BBE68E13F9E484763294F96E4FEF76E9DDC94EDB09B91FC88E49FF129AFBC811B9ECCA2B09F861BAD158", + "qy": "019FEDBB48D56AE97DDA459530612654111C5FB07F387718B04DAB0B0A4F5A17417F4212D61D5943F60E7AB420DA9888B5274557ACD0F30F6DF47425E94FA10244DE", + "r": "01C60A45E378D4AE3EBCE02B9117F07CC06B8BBBC1E3D25F70B981AFB0B911C58FE8D6DB4CAD29061B66A80A2B9BDBA8100F6DED2BFE407596A54D68948E5B6CF5EC", + "s": "017C3930CD986B1A18C09AEC32B889882D48804DEEA4BCD334EEE858CD22C475B9CEC07C322D7005054548E4375BB30CD40FAF41E7D3D0C2520259A7D965F9282765", + "message": "A626775AAFA2A583AEAC80B6149129D43064BD70BD828F49180F92E7A0C49558E002926D4EB4A7CEB0FB7D213F06C303E404692564EFBB3994C50F5771557E2BCEC0BCD7940DD89A8A216079BB230E2766043C1EF063199DDA277B264E31F0117438454E2D290821235A897D8D966010EC5D886167F364130EEA019C2FFBF413", + "testPassed": false + }, + { + "tcId": 252, + "qx": "01261051BCE0A4641B513FAAFF32740220E14E54AC00E9AB97CBBAC345816C53506EFECBD2734000420754E648C8F6886552793C14C60431E2EB7BE3E7B4246A87C6", + "qy": "0060665CB4A7C81A33B694DC7CE30FF0208D6633EFCB5BD40D11E29EF7AD14A357FB81C06456F92055E6406F8E04E0BA44B85D32A2908154896269D34F3D228D7142", + "r": "00D072793452145C4EA93AE61BDFD59A3F9468C657588B0A0CEF5BD3FB0E145E9AE3880DECE9574D75710F286EB42A5C38B3D21657E5A09C7CAA094A14E5A8D24B4B", + "s": "01DBE5CCBD6F1161F03741C354694E01FA6EC544070178632B7E9D3EB948B2973269FC4B6F22E4756D52B9C3B5E433A8D8E138FDEDDC8B0994BC8817E307D4D0A0D3", + "message": "9074C461CC8617726DD040B4B670E32FE22ECB39E49EE24B2614897B9F824AA17A91328BA5B0695EA84431B43C448393EF9A1C0A87948FC2FF6A1136E4BFB79E857DF83A04D2C9FE3953CE7361E2B5384A6E3B5721CF1E73CB365E6EAFA3B176B89297F17DCD022BF13DDAA6085BF95ED8C0DA96366F311C6E760806FEBA3C14", + "testPassed": false + }, + { + "tcId": 253, + "qx": "008BB8B9F1DA4F8383C3BC69221E5DB1A37D44C407390843B617B687878FFEF46043C900F00CA65D04E84EBC0F6C36355BCB5395D12E82718D968B8CEF75EBC91209", + "qy": "01D6215AE0CCDFFBF38641AC208A4D5C516CD89C1C5A93E7D404E797E1D527F78B3A016EC174B6A2E7989ED5ECAE7A7E0ADAD0430BC674C0F737D83072E78B2E324E", + "r": "00BB007C99D395D21F20F4EF6644D0BA6C31B8172E5CCA91E0664743AE69697955DFA086BC54729ABA533F39D73972902B069E37FFB9ED5CC5D54F6E41D16CB60830", + "s": "0007D5A05B3E5352F45793F61A6D8003B2A210E9FB715BFD88446616205FB8B5D0ED1E5F692C8699396C3E1F421B57F30BECDC9A319D622D81A2792A8500AE65921B", + "message": "2729BDE745E11E60E8C45E3A1EA36B45FDCFD279B79A63FA613E1224011EA4A5003DD2B046F617C27772BE983C08A9672DC21A1DF92453FADA03DE5CA495D3A65C9B43C70B990718EDCC9E0B943DFD3F9BB7B9D4C500404305DD4A4D0F048F157D52D63948441EE797DF1E396858D72451ED6133AA50F933D48B0B29809FF70B", + "testPassed": false + }, + { + "tcId": 254, + "qx": "010741697F09DF7B46423EA8EF3888E9EF7E64D246D61D21BE2F0B2B485DA5F4CA4D8D7F9BD3B7C2060174BB1FA6C1C4CF13D1E039FB41235472123CE99EFE526F72", + "qy": "00A15AE3990BB003268620DAA60F125B63917EC992BB13909E535FA045CD56BDB570AE27F66C14E7D1C2BF12B130B30984FE6E51B69F9CD577935615802385AF483D", + "r": "01B99522E3AB1B70707CC13022FBA253BB4E86AEE6B26865AEEA9E83058B5A471796F48CD9D253B41A2E25C9AD48FF7622912E85D787D5F1FED42019BC257D6B80C7", + "s": "01FAF44468E44C7FCA7E9B7B303682E5695F7D775F3C68F3487602C65C8077B205BBDBE86B36781504D99F5E1952901C773F12B6F8B4A428CB466A690C3442861985", + "message": "2201C3787EC5130BF29A80D675679EF20D22CB98A64D882F8E4287DDBA79D8B0798B32B22776854F64B8F604B101930F1DD6AD47ADB1EF55B4EBEE041578C3E89F32D80876BCC8BB6A794995A23C1A7C469C557E6277E35194A96EF031F0C9AE4E9940CC7ED9AB735410BF900283FE23DB1FF4DE261182E0FE56E2222F1DCB2A", + "testPassed": false + }, + { + "tcId": 255, + "qx": "00191D91C5EF26FD08B5219B8B6E68FDC066220C00A699D7B89CC3032441CD74564EA917132E207C4B112675CB7DFDA090EB7C5B5282C59120CEBBA06B48C7EBD692", + "qy": "00F1DEB54975D597653D9D18E800E27CABEBF67A12C3137ECA45E8303E515E787D84133C5853DD944C12D27FFC309EEB029AEBBA011DD030013E30716EDB69C43A59", + "r": "001A7770FEE95EE318C3FAFB29294D7804F76098B7C4C34F475792F78EC5901B4E02F3A26B2FA164232677C85203378662A0C46CDA495010EC01803EAD3B425C5D40", + "s": "01DCD36061BD9A02DC39A79C68B15831754FF9C6595618E8638F18C0E2AC061016925AD6E0FCB9CBF53C05FE3F930DE05699865A432861533A069FB4ECF9A1409635", + "message": "3FA31F49B69FEF66546CAD910AE41752C53612ED1DCF53A2C44A5164CBE326CE0710EC93F0A2639BB919AB669D2073B8DA2998A3AA0A3D2B3710EC1A3AA88000D24BB27E9CF27C5ED9BCF75AFA8BB2B0648B0D4BE3F81AB98E89866C003D57B174A6F150D1D744E8757C9CC4C4CCB4BD7DEC57925AF4A7C49B8455E0DAF1DA75", + "testPassed": false + } + ] + }, + { + "tgId": 18, + "hashAlg": "SHA2-256", + "curve": "P-521", + "tests": [ + { + "tcId": 256, + "qx": "00D4C06FB36940BD50935D15398EE763BB8A1DF2FFBADA127701F5883056161ED0EE95FAA0CBB63BDFA420696067E5217354629371D361CA7B5609B6CE27FCCFAABF", + "qy": "011B2FF93751CED7150FA49C2AFEB2181E58B788D2EDC21D62C7A2895E66C47305926E0DA2C5E1EDEC7C1D07129B541EA170459FCAE9BD2C59CC70A20D809F3423B4", + "r": "012A58D0C0E4935C394F5F8561E818B8BFFCF0A69D5A184139B207D8F91211594CF562354443DBC82C90FB8A9ED357D71B0427091BF2DDC533E3F14C06B527953733", + "s": "00FAC0F1C4E7E08C785B79827D7311F6B028ED25C91C55F754ACF7E4F32F1611E9BD38FBBF424B51D0A60A8BEC8C04396BD1ECD0629BFF8F4CAFCB2E278E190C2EA1", + "message": "00DE9F2E5DC9D59AA795FE645735361DB5AAB88DDB3603F8B219045788E927142FB603F8D610B63ED04DFCB6D4A4FC8522050BA5B0C74F03D7753F1408A6E7A44BD30853BA5923C15069542B3ADB6EF22D0CFD708D73E73809BE52F9D206A825783691439629912075981897FF59C2296F111BB0CB60DADD169F7D4C79985A68", + "testPassed": false + }, + { + "tcId": 257, + "qx": "0144FEB44EBEAEB574E3752308D58FAC7BD1362422C5BBC86DE1B5476287E4B016180AD166A4687F237FFC8BDCA8005A509A06F35EFB5ECB6442F6DDD3C33E813955", + "qy": "004EC35EA41D2F32E8D78145E8AB2751B99B40DC5BE48062BAAFE4CF1FE9EEF1DF99383D36D9EC96F26B6B5F1FB38A9DB29D1EA383EBA8CC40FFB771E3FBCDEBCA0E", + "r": "00F4FF72A5DAFAF6F95B1F18898B033FC4B2933971861D3DDD7ADAD3487701B3093477F69ADD711DE987303F7C43DD3304C1E501DEE2511A5ABCE321A627C96BF4C4", + "s": "006E8B20A8828185766C3937387BD6E791F33623177FBDD7CBBE32A70D8AF1E3048711BE5861F3FE632A8403500A32905361D50F43C81F066C2275ABFD96E36D8688", + "message": "135D1F0100C3C8498B229E862E2851144594061FE41CBED582EE86AE7F2ED21FCAA1D16A181006513D8DABC667EB7BB69389872CE51349E5C83811061405D637E90671A9DFE59DCDC1EB322D01860D94F49AB45666BB253C4BB050B6DEC73C70BBAD4D747F705148DFEDE80B50949518EFF0CE517691E4367BF11A302D7DBBA9", + "testPassed": false + }, + { + "tcId": 258, + "qx": "014155EB4E5FF2EA367E59F8317C8EC055E413BB00AADB37175292E1089907056D9A18E78B3BA5251A07303D60D65A942DA74503D29AF1D0F1E2CDD73A66F87717FE", + "qy": "00351D2211B2D494125B10B8DB2DBDCDC9E9D15ADD4180458E7079CE501C606E810A3854D8AE61997000CBE7210C34332ADBF5F1A9995849F9ABF6A7DEB29C0CF29D", + "r": "01619B84B24DAB9F47B5A9E89E97CB577F28565F66F1A764345B777A20C238A92AD3FE0CC711E243E16378D611719B602B433953A801F3F4DCAEEC7FEAEDEEF6ACF3", + "s": "0107B868905BBB4BDE79A9FBB8753A4E27447CA644D239AFA258480F36DE7121915193A73BB7BE170F1EDA6E376E26A731E19665B43A7D463924423B70D783236894", + "message": "AB86866CB9D3DA9031E03F1ABEB038BEEA57B9A2E543AFBF65A28E51FA43AF28BDBF6E5611EB306F13892F47D77434306630DF5383CCD619DC9857EA43ED1A6128168EF2E19EEEC9AB3D6FBB5D8B58BD8CD13F14A5D73F4CB24FF400B5DBAC82458CD32F32C002A544842BC2188869D1980CC5EF705FEEFB45C1B3E343334ED6", + "testPassed": true + }, + { + "tcId": 259, + "qx": "00CD7FBC5CC5E25D7CAEAFD28DF6F198912BBFAA7B69BB36D39D641DB9F3DAF3815F0B879FFD89CE1A6A0F8DA95265A6A3D617660EC58C12D84678D3B23B4993B0E2", + "qy": "007923FB86A7E0458E96C9A24FF04481C1A6DEBD96ED8B0FB584FBC2290144C2FEF9CDC5F9E6208F2F39FBB30023D38EA8E34D545AB3178B074C6D07F5A17A4B4381", + "r": "0177A85188CB25A64B9863DB182690BB1A2BB6A3A1A91034FEBFAADFAFB5AE10AE6218D76D96A6602AB8BA9A94E610405ACE7FC64F93027D6C1CECF8A66C1630DC26", + "s": "01F7871B5B7C8E2D404BDAF0AA16A952E06E9597B7C346115ADB5EBDFAD56D5F6CE6FB15FBE44190C5A800B5696B2BC244FF3971830D89F9EE55536F358AB5D24CF7", + "message": "168B2EF0CD7A6E9F05B4CED7C22C4D2B39E69031B6B1FD20D412278706032D809AB899F7F8C57374BEA2E4F624D23A6B70E81AE7FD5B82AF8226B541EE2C41EAAAF3A9FD98BE1354CD8E8D386180468A5316B448EED87344B631B50B1940024BDB46766B5C8E81253008C0719F38E13832CF81F1781D31215E068B1AE3445C8D", + "testPassed": false + }, + { + "tcId": 260, + "qx": "01C46E25A0C41A66E3FD0F7DCCA26795E91D7961E29261A5443231E2E5D055428961AAD8A46F31C49C03ABA5C260485BA99BD11377ADD1EFD502B2C6093B2B9CF07A", + "qy": "0153C1A452A2B6B174D625DF3C526C26648C47F4435D17984D453C3CB33EA375052293E54500AC258086A72F9522A2D0AE3E055E6300D17306DB6111374756F3C29A", + "r": "010C076358F14F79F6E503C521E16BCE4B242CF00360B080CE31DAAE421E7214078C393556917CC7B5AD6C674A3FF49F42F8867FD10E93DBFA21E9022EFE46918FD2", + "s": "01BC4E8568ADB1B970F62C3E4F755B08EF3B411F23303FCFE7E292842EBD5B6BFAAA920EC05C4C66B13F04772EE26A125D8D4953134579457E414960BBE8F454B8A0", + "message": "152BBA0B14D770A224D03B9254CE6F1DF6469061537362AF2593D1AAFF8EACBD52F1879F2D69868AEB738AD7E5D23FC5E704B10C8979EC9DCAE7749B625C16AFA8216493945621A75219DA3F102C97992F3407153E55DFB7851CF54F11D9A4C6B29B047C6C6EFAEE1AEF61683072B9C03685750722C94AAD9ED1028F443B97B3", + "testPassed": false + }, + { + "tcId": 261, + "qx": "009C2CDB77FAD42742188508203A8ED8EED661665644348C7A3D9A324F4226F63213E221647121FEAB7B3554E3FEBF51FB891A65D92B60FF11360F37406407268434", + "qy": "013E93582DB4B9C471CDDDE355CDD37C73832A990967198F61AC292A70FE217EC5AECC998FF9792AA2F26BDC031E59F7B594B0C925889E2E6B721A2EDCE7B0FE64D8", + "r": "01A44EA4E56F9CC2C3A14E76F85459EDD7A1500603CF55A1DC27915924DB4DCA9657E85E4811F8DD0D55C431D3E1830CD6948E9B2BC4B39D5585C08923D743BE50F6", + "s": "00C25B0F6EA4C01E98CC6D8B649138BDE3E1B99184D1B2C2D02AABA18D22FFCB0783DF4B093FF19BBF0E884DEF59152BD8AA5F69DED5760264AE898AF69D519456BA", + "message": "F29F5BD82F5022FDC12960238D0C9E72CDDC9E32D37717A2152143B108E8AA38FEAC54B351140CDB16216EE71A98103AA71BC76657EDB74753ADED3C2B391F2F107ABB9D47458E9542F5208ABF6A50035D6EEA2718BBB3BA499CF9DFAA4FD137AC2D526A9B6DA89143E0220BA701E34C8C988BFC70CB5D62E5570AF0D7D17564", + "testPassed": false + }, + { + "tcId": 262, + "qx": "0076CDD031C3104E7F6617C17D292679F4D794CD4E92D26894E7B139A5EC8238D454440FC177CE6834C7261CB65C7F28C698BF89C07A044CBB8E3AD56DF65EFFF023", + "qy": "00CC99FDDB5567C36DB577977E0B2E5672A190FCACF09D6F73AF9011388D75676057D36AC3C431F4EB396FCA95C0595187FAE5A4668AB0A38FC89BC6288235A386AB", + "r": "00C3A81C3F04D32FC7335AF7592BD774683FE6B82461852F6EE4B439E617F068EBFB8A52D2B7B912029880AEC90137C72D6CE06DA20770ED5F7F9BACDB95D0DAA6D8", + "s": "0044B24466B96557EC917B9411B3EC6174299E2218382BA4BBC13C1C96A5B61BF0D1721A81420280EFD363429933626A4A3BEBE25D6CEEF41C9C5F484CBE49C893BC", + "message": "EC903D7906293C32A22F4DA3852D189F43B826CA9473503876E3E801A929A76D57DFFEAD4C8A8A9D31AEF424D3C390A40E9102942507ADEA3D8A0491C76DE19654216615D12731454C4BD2425E8EC27A75AF6E8BBFFB8FBDF5CFD47ED0D6E903F152B2963D05547C1DC290B4C5A3BA1209D568B170D2E907B7A31B25A44E08DC", + "testPassed": true + }, + { + "tcId": 263, + "qx": "01B044125B2A0393756A2F8D5FA0F0A65CEA926C7BEAAD27767B2745637D3448CA3F3F320261F097A189A898C6227EE80D3E3A2A96D86015BB67E016C94C024E5E39", + "qy": "001AA3A301BCD367DEB2AA3FD6A0E632B4E4D4591DD93DB41B7A5091DBB33B011210985D7C522B62B2475AE2E6D635FBEF6B39046FEEC84FAF75D7D59976A6497BFB", + "r": "0181617CF6E2F3AECBE72E7AF44BBC8385211A4D9885FDBFB9B0E74BACAA5F3082A70216AF6C200B9B54A531627FDAB7192F658B95763F23DFC12F9D2B8AB99BA2B7", + "s": "00EDBEB33CBB6531251CAD44DDCEE946620B65275A4DC36BD193A33CABDD1161795F0BB5D92E9056326287A7C09636356D2BA8F35DBD21988EE5C0AACE5926FEADA8", + "message": "88F942692E5C116FADEE7A92E60D77F142F587B6CEDFB3D8B7327A0C481A7D819D56A59658100A11B1E185D0C1DDFC298A3D2F151E7F292E909B7A396DC35032BF3B6FE337022F720BA636F70D4474316BE8D0994D3CBC0D3ADD98878316B7E8D89314350E68125BD67D52DB8C630C2923FD4F25AC29C6D4717E4B495D05F05D", + "testPassed": false + }, + { + "tcId": 264, + "qx": "01493BB60E5B8D7A4A0F9999CAA2F9BBA688D0D84678D77C79BDBBBB558B3D66F3AA366E7C5F88F2A6AF4E0740B1475CDB8F49D97AE7A361F4A6838C2D0A610B0D1D", + "qy": "00FAC0E4CD40F2B72229775FC043934C71EDBB8560264F5E433E1F4647E32B4D24E5822F2DC424B0393C3DC0F1BF371565CA6D92A6D51081746BACCB0A0036C9A489", + "r": "00680A553151CE6AB071634EA5597FC36870133E74216C711C171BBFFDC914F0281CFC6CD5699E6BBF93C745F8F363767EDB2C166B71A24E8A1C34D1133C57E05889", + "s": "015E7A2B49B79141755D58E57EE51EC8C37286D50C48EE991A8AE66A444637D4EB66E75685E404FB1AEAECBB4A59B0E38C87B7586A20CBA494B981203E15D009A1BE", + "message": "5608BA538DFCC4D38B9C2FDC9EA6C1BCB6A9126E5F9DD87AA8EE831F930BE233061820AC3305A6947D6AAEA5FDE9D5DE4F5AD6BF06546877B5EE593391423E3A422DC6738511168D6819C2C7158D6901221561D2452560CC8BA5BE49920FAE4032C33366EAF7F3B12C1CE46720F41D7338EB42408270FE7693B06A78C342A94D", + "testPassed": false + }, + { + "tcId": 265, + "qx": "019DA3B81FF79C00F458480957638470253B538C56C835C5D31A6A3281BAC4A1B301F859B8278833627C146784D87E0733404B0CF570E69D2268E0C83EB72ED3B708", + "qy": "011743E8467819641C750D174D7BF2BC4DC4F1C846F08D18C788DFAAF15DA3B5993E10827DD4D51B4C2B386229CC33AA966BB7F7F3C25BF88CAC4E5C73E84AF6532C", + "r": "01BCC23A0317ED242E84B24D303718EC7B87EEE3C57EDCB5C9F2CD74BBA737C58E798FB0BA98D115F77BA47EAEF37C0175C81ABEECA9A25BBD61060E7255B6EF3B12", + "s": "000A8671A32FFBB5E3D05AAD52EEA31999B59A7C0CC857BE756D8AE14793790E1E4BBAD8FE40C6E619B91E63B92BD6702F5A8BC8844D1A4546D233B8C88647E36C85", + "message": "B363C94DAA3C6F0704CD1073131BDD5AFFF1296E5CEC40F006B816B31E3DCCB7E31E0C411CE0306F6B06959E447E98EF7266BAB5479165C0A5E52DDBABDB0E9A6C54F1AC0A50C1B9A67000C2ACE6D63494C28F2DD7380CD4CA1791DD99D6DF6CC942841AB22CB1019391EE546630D737C3C6B28B47D7DCF16FA3D9BC51544B94", + "testPassed": false + }, + { + "tcId": 266, + "qx": "01A739FCF0DBCE6866F3B5AEF4ACE97B273591E69F1095F752F16C3172D7F891A579C8B7F54F65A83E6436C30AA9094F42CF709CFA1488828B187CB98A32CD84C635", + "qy": "00B9810EFB25E06BAB073328EA0B1676EE256AAF22657B05F8B4FDCD28D426E8D1039E170FD92F3A1BBC9C6F925511821D54F01B01CEBC5423B5D514E191F73B0CDB", + "r": "015B16F488FB944EF9CCCEC99D064573A977778F0B759A77A2520BA03BDB3194631D6C8BC86A36C3BE10528C69DFD5E560E17218DE3B51291746E4C25EDE890FBA81", + "s": "00143E6889CF920FB1ED3721B0253775FC6B62B82FF59CF7B082DA725EDFEEB3BDACFCFC0656D5BAF8D033652AD994E4711B19E68549540EEAB7410134FEA30AAC5E", + "message": "75B17E1B2B98BA0C657563A1DB4140795E13C0BDA16652B489610678236784CB621F2FD68825BE76F100ACDE8036A3838E6345A35503A8A5870640EA0EAB0C1153E3D77FC5CFDDA3B715C1490BDABBCA4C15243079D7AF3A9EF5A566C8758CB249B8B83B00EF98B293BE7B053E469A2D6C09609B5E56CA0C1FD86F5E81716132", + "testPassed": false + }, + { + "tcId": 267, + "qx": "00CA93DD6E8980473985D7CDFA282B8673EF52E5C0DFD76E64D15B4751973FD72100D7EF78BB437123A16AED78E9093FE87EA4C8B5378D14D0E908B76237A7F88CC2", + "qy": "01E44C78F4F28DF24E7BDE4ADB0EA577B1958CD07AD4F309C79E307DDFBAA24DFBF5F28046C145674B9DFA82D8BB0E7CE71FDAF22576AC2D461006A446DCDCD2E72A", + "r": "01332A08520C6C67E658B7C583E08E757DC3CB79F076EA2133E7832030E4635643B9E005C22CA7EA001F527FA3212143F02D0C2F3463B558D24F716E6C4840557718", + "s": "01DEDF5EA2565F15947322276A55A33E3DA696DB00FDB3815F23EA439724C8FF8B5CBEC57EB4088EE87F27CDAC2CA0544DE781CE4860586DBAF2F5CDCB80AA53DAB5", + "message": "46C69F8C3B3B1A6E8C0FB2296E1B743D55761B2DC0B2812C9AC04C1A846A433863D5197448B4B4F8CD482E3EA45B358B8E3189982A71FB5F3AE741EF34E8B6BA4D5684A4A6026EDF0F469FBB12BC13DBB081023B25908FE879C077B693C43F6D0440FBB836E60C906CAE29BA59751FB19ED4B37355BAFB490EBB8AB393DB8E39", + "testPassed": false + }, + { + "tcId": 268, + "qx": "016A9976089EE74C6BF96117324074CB68425C2B27B4D92124ABFD93D23EA05D5BC0F776AA9A40FB9F51CDC18F362CDDB5A3FBFB71EB00B4051FBA6487C4CDD898C4", + "qy": "00606B02A0AB4CEBF7BBEF115234F720981BDD54D66A708517394DEAA6E6808DC6B63EFC272955192B548339705C984F8E83E9201F470B2517F60D324E4002F5576E", + "r": "01D202DCC310B91FA5F351D5A0A4A178A6F5CEFE34D4491D3F86C631BE315D08F1A10162BB10F5F34611C7006103D9E0B99A83F11EE215E042348F76D94A1206DDD2", + "s": "00B45B2CC1B197C1A2FE93F4731637C7D2B1BA545CC45290685F4EB1F6EBC31FE72618E25227943B1A3E02A8A51093B7814DB0125D8B6DDA57BA3124194374D2EF51", + "message": "103C99ED37125C7D48DE16EA0C5762AF1631B651B41EEDC19E3DCA9BC177E95380081FB5E0802D4E93C1A1D3FA78EB4A133922AD11D4112FF27A6E6460F03FE9B11163F8A176E838DFC826C64EDF3B0CA12A8B00619B64E300C02BC9B80C16B988EFB236858D749F39834976B712F01D43277076AAC7D96447E885161522BB28", + "testPassed": true + }, + { + "tcId": 269, + "qx": "01E21005FB7A313D71C959C5AA309280CCEB4791C2435939E99DDB288D430D5C2B0CD778CD4BF831F1EC207665BC1474DEBC24C1C2902ACF9642136EB0366B336543", + "qy": "0064855BC76C245A8115A1730E8510160EDCBE67E6B373F989CC96F5C38D31FB74AD191658CC960A54644C65F550DF96B52031D39EE2AFEC6201487E9514B25DBECB", + "r": "014C0A80FFFF38FA1206AF6A992A745B5D945D19FEFA381385F88D48C395E1E8F18AD016A373D3C320D21FCABB2B49D7ADE04D7A5B8735BA26F9980480DE8E9495CE", + "s": "001CAC03ED9FBEF5F0989C3B2865739DB9BEC901D237ADA4746830A12A04B654330FE3303C33DF8AFE8DA26BE10FA8F5B7BD76FD95332BF355423FF00DD26A0A3F5C", + "message": "2D93BE6D29DFA2428F739F72AA01F1F4C577E33FC1999C3812F735A3A8B37FDADE6C2AC06E968B712901364A9C8644B5C7B01D8003005757542C03B450CB44C6BD3BF8EFB6B9A4E3F7E64019F1F06416AB856EEC7A3D16D65CE17913798358691A273B019CF03A369D97BD19D7B438CE407C37A8345FEEF93C94E0F1EF427AB5", + "testPassed": false + }, + { + "tcId": 270, + "qx": "0115E87D6FD9C3432E0ADD26B97903969C1FD323E658358DFE85B7BA6F84CF1FBCFB3B1809941A0F11BFA61F6F29E84484FD75A0F517B667FF04A0EE6FCDBFBEA941", + "qy": "010AE67502E4C946185DB159A6E84A84F37D491AEBFFE4E169EE5463494259522118F6092C580D8DF0A591C7718A7B282FE34EE732800FF2750D99FF144988B8DEBB", + "r": "01A032B50FA1164B59F50AAA69978A6FEF4F679AA273E6C83A9903BE63C15AE89B26A4977C37B35ECE120B2B8B6FA4D84574C9B2AC56EBD779FCD9DE4377B88CC236", + "s": "0025B115616E358A75639AC35B0F3CC6B2089C82E84774AD7D070E397E79AAC4AD79850A542CACB81610D3DFCA3AE94070F7FBD1B531A0E32C27FD6AA7F781C06494", + "message": "B87D1D37CF7249251267328F73D15C7858957943E74A2B38BD69FBC6823593AE192180E31ECBAF898645A9456383DE00AB29D7C761501938613C027FFCCF6BBCAD951351D207A1305CDA9401828C75C0E8F795EEF140442C7252EBC0FB0C641A462CD2D844C7F84017C908A57D8C8B4CFDFD8B60E9B2E87F6E5719CA48B8F965", + "testPassed": false + } + ] + }, + { + "tgId": 19, + "hashAlg": "SHA2-384", + "curve": "P-521", + "tests": [ + { + "tcId": 271, + "qx": "01934ABC3CCB2F001C249434A98D158E40BC6FFC0F6AA8828F884206612306B141DB1861BA978EEB783D9A9F0BA8B90498A98309E2D88C3870135FB1A8D2BB9B4819", + "qy": "00EC4CDBA3E5B0B47793812198157C37C8800FD57484F224D4C37EEADA6F2086F77913B80A9A50B8F7585FA3C414BBA378863E0587A7A9792BDABD1EF160CFB9B35C", + "r": "006E69F6BCAFAC5E08D0756015AB05F16564B3101196340CD8535E8337FBC658BF951C487A7B121A0E132D5B8BC544B3A6FC0F34B3049383B44BE7B5F760FBDAB127", + "s": "00FA97E71FD0CF21DB7EF29BB106E5AF19F5C9DF31B0141853919B91E5F5A0A5177E3D355B88B2355C498E8A0CA980D28E27C4855348B2EBD631D3A33661D9F4C237", + "message": "13AF2D66EE3B90D581B2ACF94C92104991F0779842E574BE057B8F7F65793F919CBC46BA1029DE22172E96C300CF1DEEEDC70671C9D9835A693D90CC5DA8031876ADC96981FE1098614171C640DEFB9648ED286992B63E6525C8B820C13F6489F4D6A2FC6565DC16309827083EA922215E510CC232F7EF19AA2ECF5D14413189", + "testPassed": false + }, + { + "tcId": 272, + "qx": "00D603BF8D8C0BEC23B1E091B3173CB267B74449CBDB97A2C5F474C9F0EF739D96F8EC5064A3A2B403A287288008F636165CC75D3BC7404D62CEDEBDB7429A5D9829", + "qy": "012056FCCC2EF9E3906CD7C96F15186E964D9333B8C2423F037D139F0E85D5EF9214E6AA1CE0C22D0EB7D5DA29D4B60C005D8387BD2D1D53237C39BFE150ACF29459", + "r": "0028FB40473D837D2586FDA04D78E04F8FE21F8DEACB026F87155ADCB5B011745D8ABB1C17ED826CFA02918C21CBA1DAFEB3FA3514B68CBE37B6397CEC8C3ABC4102", + "s": "00CB8A3724A4B3A07F7CAA850D4FF1BE4F65D4C2238EBDF85F76E646BBD0FA0C4AF2BC0D1FAEF0D86227928758487619A7B4227969624DA21F4039F30AB36015C2F2", + "message": "7C7D6E9C88A847A97C1B6CBE7CED48AB004C334DD131338A494D9AE438C6607FA6F31FC4B0568E6D8CE9A0A1221A8EE2F8F84C8B72A5BD9C411FF21616D4921CBD8FD90AD041A34DD8A5F28FCD74A93C64B1B9CBE31D0E7FFEEF0554A366137F796D16CC56F293B1C330A98025BB8C4774967D29540B8AD35B30FD63F3677E81", + "testPassed": false + }, + { + "tcId": 273, + "qx": "013EF5904868AC7FAFE38B22249E934B637FEC279E419228165DC806A1AC73DBAD3650CE0832BE1362C9D3E042E2C4F74BB0082F2F4B790B49CBF0791D7C89627E74", + "qy": "00701A4AE1BFBE63DB19638710E241E814CD43BAC9D8677F4B7B6C4CDA268F122FB8B543A6A933ADEE6AE1142865707589DB72917A82C511FD3C0F279011569F3BE0", + "r": "00EB396943DC114EA36DE238EC46B4E2749DB9910F4FF36CF0BD9708EB31EDB617890C0EFF6B3A93DAAC6485A407ECF526EDF9DB03F59D18D86A140133DD4FDE452A", + "s": "0088DDF7C960C5F75CFB24FDB59DB5C43BE3BB5D671DBF714A1F08C957EC9AA9AD2A797B768E9D0AF87B1563E33E1165E1966432D99F59110DC91AA2A9B1BA3F43D8", + "message": "EE15CBB1793624C33CFC6696BC228B6C25CFF96AE71E6F9AFC0AE85315F90436201321BBDB871D91184530718460388E8D9CD5313210C510D0A63897C83D086D6EEBF7F4B01809FA002B7AAC2E404135A2B0911D6773221808D2D3E4821EBD93F15FB2C596DA3F1EBA3CA45428CDE3A48BBBB685D0F9CC20B18DCFEF36C436A5", + "testPassed": false + }, + { + "tcId": 274, + "qx": "01359F3C132D4F17A65340995B056329EA2CCB5636A94BC8F053C92DB6F82AD026C23BD9933C5C8D8CDD59571D8552803F5FB7FBEBCDC9AA5DBAA0124E99E78DCEF9", + "qy": "01B5ACBEE00E9FAC332333D580C2F8D37E08B9CDB71DA9C2B4793BBBBCDD79AD4F17541D0317A0848603532D80A52DBD3EBC51E545D9560A1F75BDFA810A58E7F098", + "r": "0115AA83AFD8AA894F1B66C5D5937B098AFD6F6AA23793BD315317A391C4A14FBA792159483983E585506EFD357F464BC62B7F520F7F72C1E6710E6FC2DEE25403E1", + "s": "01890E9A69C3BC81E42D241931343AFACA0614B81F54D93E767C782C956BCBCAF7895558D631C8FD6776115BD3E4C79B8641A49AEFC8E1695B5FA0A9314E0476E95B", + "message": "40E20952DB394BB5C1433342EEF95AD2F09205502EF369537D25651BD7E67AC655A6A0E799422F2B41DD223E319D31269EDBCFF9673FF1E1CAA2940B658C92E48164E02020F8ADBF8C6D9020D533F61130CBA86ACBFC2B35C6C1E04701BC99D2FDF77228AF62F246459AF69275B7A3AAEA95C7FF5F90DCF48D8F82133FF35982", + "testPassed": false + }, + { + "tcId": 275, + "qx": "009D705D0D3242E6751C676E31033DC767B969E618EDDB66CF744101E66D86A1AE0BB330B2E1978837D5501E42C9DE024E7AE1A5FAD1DB9D2938832E0255B33BA523", + "qy": "01BE7FDD6B722A82F3048CAB24B2E6AD88A83B60562668B9ADB01A7AF855D81A29AF9ECEFD2AEB7C0BE302B815079E0780497B75981AC6D1255462FCE2260EAA7119", + "r": "0177D469CFF8283296A5F5FA5A252AE1267E47D6F35272540E0117634E6BA3941DF4AEAD8F1DC541D95FE72678CE0A639B8A1D846BCF973C85CD64C286D999BFAD8C", + "s": "01150ADD86EE1CBA82A375370280B37E9CA6E37A305D56FC7A93EFEE4D0BB6E7BC00761340964A97A4687218CC105E31146BC1B3C87E86D2BEE8404D8A8DB113B6FA", + "message": "910E95B3CA4B8CCDCF87C3DEAC2627E801538F37F609CBE868418D9793B333B585F2EA4B7D0C285B6250BAD1833AB117A94AA2003AFC0D7B5913C0F3A7EF1D8A5847195D3ED032A353C934038524FB28343586B13D8CFD9E4F281BB0AF7C2597533FF57F63E64C30FCDF8C379B5CA475C36F6FCC8671C94EC67C448B002E82E0", + "testPassed": false + }, + { + "tcId": 276, + "qx": "01C099C5BAE86F71CE3DA14C3DB41CE62E0136C5C1FA5FE9E4C31F1D1EE24819012E51A7AE53E09AA5DEFEE5312E8968BFA46A15BEC319260A3AA166B0318CBDA9B8", + "qy": "017EB3FCC1E25BF6BECD18D3781E6D57D59966047B2FF95738033DCB5BD169AF7BDAAE4C2FE18F8038D8EC5ED162BE0AB3DDB61E35063F2AC7D276FE925491A5E5BE", + "r": "01D35830285895F5BB97F4BB5DB130731EBC5AA20B8E3A0B8ED25197143001161CE1014DB8DA25FCA0D300947A6012610F36A8E2E37999297301EDE551EA6BF194BA", + "s": "00D3A4E5F688EC7A6CEADD22067D6313CA1B666BD7E12FBE57495DF00996F434633E61744C7453CB66E25EBF3DBB1154E8501C2DC814F2C7923C17E3EDB4C62EEB0F", + "message": "977ADC427814E07EE53CA3EE95F08EF4A2A9B3341E454458AA78F8DC3712E03C977BEC76765773546A1EAEB8852365AC11FCA2A3292A9F84F1529AEC694A9C93F52912FB9DA0F0444CDD5EBDCA36AA45646227D4A6D565AA768A17679CC032C9DB79EF3068CA0E39D148798FD4150E09BA36AC9B14780CE45A7BC5ACDAC28DC5", + "testPassed": true + }, + { + "tcId": 277, + "qx": "00EDB1A8C3DD3CF66831DBBBD22871805C361B3446A64389EA054F257CBD651784CCBB6498E4E8B79F922603DBDC6D9191788CBC12E8FF830ECE6C5317106877B18F", + "qy": "00565C1EC7E22D3D19824D4884B62FDD5F08D13469BE018689054733FFCC0463783916A0E85985414413D3EF07D95D8C6EE13C082A698E9BA6F2644A256683603E45", + "r": "00E2D44222365DA12A64ADEAC3E8F1EB2E57AB2C6BDF85753E3A1C442B58561C9828438ABD7E3DB848F7F13C6991A4B20ABCFCC6078CAF99C6DFC4AACA40554EBD92", + "s": "0187F475ECAD0F0B030684F02B13D521CCFB85B7E38B6553DB52316D24F3D6FB2916E701E56E791AFA6150C8744A7EF4F885B1EAF6CD57B3453D20C51926DE8167B2", + "message": "57B5F8E734DE748CE075D61DCAD2830B2C14215BE46C1BE2DA02699E5961BAA91D5C5E262352C10A8A0C1483A7A6C2C05DAC0E75DA2820B5DC1B3AF6E9FF98F4F97EC38D92E0B83A8AFC840522F7FE14F8529DF255B328E1E9F007DB8C4B070E11367BA6BABB12FA9E632903090AA6E3F7C642F00DA92B75247E48A4DB579EB3", + "testPassed": false + }, + { + "tcId": 278, + "qx": "00269BD3C54A9F93289471631F9BDEFD54E54EB82BB7B62F7AE90554DCDD49ACCB49CF3C7261EB1C7AA0D71ED5CD0958F06E9CCF8CFF64DEE8DD3ABDF7E474DFD3CD", + "qy": "01ECED929EA570D7231A69DE898E62A7E9A8AE6B8CC80FA1389744051FD08F6421775229221BB9A0A48B2D70E56D53E9F53CBBDFF5E2EB3FE28566589E2CC6E8D170", + "r": "009975B6CD45A69690D38192A228EFE6B8EE9A7FC37CAAE96B3F180921C6C9CFB22E077C3E9D8F15A541D58442484776A10F02926879F251CA7672AB64D077424F30", + "s": "0075F7534B6F2D319D444DF6AEA8BDD38422E4179B9F1C9382780429A972B6CA752973FD4692A97F9AE5F27686CA095ACA0ADA35D6FF063316768421F88E885286A9", + "message": "274ABF830D7D86893776B6AEEB01E1FA9E41437AA1E3528AAAE3B654C9F99A4501C196FBD028F9C25A22EAD4A7BCC5241391F7A34C6112BD458FAC063FE0AB224B5E6BB126F58B95E590DBB3A1981A57EAF535751CE5A36C72BCF15BBEDE5235D68C6DC114B01A49071389F0CD857A36EB6BE5911681AEB81F7F61403F92A86E", + "testPassed": true + }, + { + "tcId": 279, + "qx": "01738D0F1B691DF9DB19BCF5E1612AAF998615F48491D5F2C9358DAB5A44A5463C686A0C527E30958B70FE0969917C5059186359443622F0A2259AB5EBAFFFB7E75E", + "qy": "013E16EC01D5B63816536882413B3927A4E8FB412AC185E7E77BD7F54C10ABA9F779CE9233FBEDEEBA840AE51F875E5B6C2A5024C16B546F2FCC861AB3064DFCC479", + "r": "002A06EE77DD38B4314806607C9FC8C05AFC05B267B1AE68BF0003F1AA167E6314D181B6712884393BDBD073F5505D98ED0699DC7FECF0749BC3FEFBF53E3831FA26", + "s": "0136C24A4F2CD903772A8136B3C7229D3C88AD4A2C45F628C76BBFA0E0C182B2C229D6CF104CB8D179A6D945A80F3A1392A87AAACECB57A6E5F67B528208914B5D93", + "message": "4D358645F14FE0DD20F658085C9153EDBA787353920958BFB1F0A425595330C0807340516923698BB5CCF97AB13C03BB4AF00C54A0C1E28D86EF685BDB96AA19700A45604D9DDDC7CD14157596DFAF194B7FBB036CA1CBC6D38DEF47EA37A0CA42905961564F3B06F379F56C88B61B763653927B60ECA9CA6B9CAF88A4D140C3", + "testPassed": false + }, + { + "tcId": 280, + "qx": "01F80B6794C1BFFC36AEE3478E43CA14F318400C768F74D7DF10D613D68343726ED5D7E43FF05D5560CC960271BA107AEC63B69C400F0D5E5B98873365697B7A5DAD", + "qy": "006D5776398211BDF2BBEC9803328AA6F6779908979F65AA5916FD03A62BFC1F4ACAC7EECC7A17D3433EA5BD14AEA3821BE5E29FA8D16051780C4A88B1009DA3FC4E", + "r": "01947C6E7CD64D010EA153DA341CBDEF93A43B07DBB6EEC880AAB7B0021CAAC4ACB3FA1EF53B35A64159D85B40FB87B7084204B75501EB7F0F2242AED2CD1FAC417D", + "s": "01A23D89C4EBCAEC286AE8962C55A01026656E3EBC39DD80D590E9F88AD82E4446BC5FAB1783E5BAF2A348F5F5AF5A57E06533D172F1D77A066011E1642CDB67EE8E", + "message": "CF3456B5628A5320A6997640C105B44DA9777420321A152881734C464C1EAF2C48092CED9A3396A08FD4A415256435E0FA7C8804614B0EFC22F1E8F82AE2F54BAE9CA5F6E6AFC9327CD56B40173719696C762941695DC9EEFF129D63651276FA15BB4C3FCEA15723BDF1622A390E0EBF544E0BA0DD0A06FADC74973DD38723DE", + "testPassed": false + }, + { + "tcId": 281, + "qx": "00155CA0465B189EC0C5B5B32EEFEB5BF57F3F29748D03FFDE72912704EF7DDCCCF7E98A2DE36E9B5D44D80A603B94EB1D7FBE316E952EE8C4AA4B0F47F9E2217AE6", + "qy": "009526B690009F6B4D21DEC4BA4CC4F659BB4624C0D5EA789AB4AADDE4701C0F148848EC6F7E5AA9FC3B548071E13123FF0165F4A8D476282A720ECA6EF391F358AD", + "r": "0029EB70A6823B9E0131676E7D48C7909CED4E54C11960D7FBC3E1C7A846DC9417AD9D3A5D77F28E6847459CAD588D373052AFF564E4492CFC5EAD8CCF7A8F1A653D", + "s": "0068FE2626BD9A806A28430FA45E96ED2EAA394F8233D3B26882616923E0DEFFCA45F35FD8052B944D94147215FE70A6D58086EAD0D2E86A94A5E69AB9D2BE8C011A", + "message": "AA3F31E878737170758CA691D5743432EC4A467FF7D6F2613994C56AB8FF9694651E797DB1609F8566710F407774B300FF33FB1A43314A23BDE24918F8D8E285CD1E0589743365E8648AB141F9AF4382ACBE439B8564B26AA7EEB01648030F18B309F0BBF65FBF42CE807EF69CF2116DF8921C08F0968FBDD9FCE934753469E3", + "testPassed": false + }, + { + "tcId": 282, + "qx": "0127A5D0E4D9DACA5E7EA01CD176E241DD7BA9C07BFAAF663A2DCA86B1F44B4046D69F07186DAC7EBB90EB0EC8AB18AE915F323EC22BA15C4C44BEB167A5E7B313C7", + "qy": "01A6498B9D2EB68891FBE915AD509F9464051D63707A7FE9D463E251721D1690BA95EE1FA8BD7C872461D2C62D6A55C7D0286F01F13153ACA624770309471E0EC087", + "r": "00E8068B291CE75EA605E8D5E8E818DAD71B5F2C2E8D793E04EBD9C98D336C218C5A1113653D2E06D52CC1290359FB904224C7AEF1109B37FFF1EB8B98C768E9E1E2", + "s": "0050E7C57EAF535B9BD684D238D9ED1FCF11522BD11AAB05113A64770DCA0334D376580FD73C57D1E2C372D9C571A29EE2F34B41C298CC75FDD6A0D44A17BF3B221A", + "message": "FC1CD0849E91DAA42D18B410332B46B316A5DB5B3FDAFA7C56B2E356B28AD1DFE0B28E34AFD7A5AAC79950E5EF00A9BE01EA472D905DAE8A50805B443CA23D7DFDA410DCE9489D5ED36BB8EE654BFCB2F620F9F008CF84F18F787C4D3578168087B531ECB2A0DEFADB4FFC144E3E02CDCD90BC5322C5322F90C37CC84279ADCF", + "testPassed": false + }, + { + "tcId": 283, + "qx": "015021B082D739957894261D0005A065D3BA52CC4A93B238E2B2154A992DE3094E15869BEFC2975E3DC41D815F3FB7E2EAE05534AEC0CBD856A441CF5AEA275BE672", + "qy": "00133C1642021A93BC698BF35C31B7711CE0796F2F5F85C5100F54616F55E238B4743643F7CED9F4B288BA607E481D0258BCEAA6F70D39BE6F4FCEA7C08185081305", + "r": "01E98A81B64294E6259B3838738E34EC1A7D1BF67202325886D625706266F79F856B8760C9AF6A187259BF32FAAE8EF2DC9CD00FCE7D644478C0E41593E50F8D4C05", + "s": "00272ABACDCB07A32911C3B357CB2A615A0DE1045D5C1397CA5FD3B47B71203EF492F9965C565CF9415E327765775DE0A646C3EDB06B0FD928F4D18A08CFA8AB534A", + "message": "7F76540767031C88DCDCCBE1E19F6A8F8BBD3685BAC045B414A613F3903F5FC04F445E3B2E61B0C97A4F1C19085C0C5C445B0C221A5933DEB1836818CD96D7F8F6D43DEDFCAEEA97DF51DEED9FF7387CBFE189683855948D325AEA19F8901B583DBB1140D9CB3ECDC34478AFE765399B9D60A9E8EF15B3071417B93A7CAEDC58", + "testPassed": false + }, + { + "tcId": 284, + "qx": "01958AC2F898147CADC899A48345E96C59FBFE0FDC1A488A6394BF8BF8A4EF019E567B38E21A40A196047E2FDF18EFE7D90FF760E2C02923A2A2699D084C38EA16D9", + "qy": "013F68AC4D4F0757AAB1D4B2C7AA66B6C751999725737C5A1E7D9F46C808A28F2C23C24E6D944A9604F50C03B3EF2042D846400AC2E89B74BD72CA40D6FE1399D5D2", + "r": "01337AB36CC64190CA66AE19E2174EF15EFACE32879FFBF9165A04CCA9DF8AF173D5560EC3BA8266B86E497F5F276C8F2AC624ADD972B9A61E0092EEFFBAF1A88350", + "s": "0025F72A205B2350B401D3A3D4A370C14FFE44F581CB14E1A9F0FEF554004BA392CC554D97893BC6DF55153F197CC425121B5FD1C20B9BE21DD998E303EA23D600C0", + "message": "A2B78CC4A1D4D2149BB4BF1170B94657367F602547012CF026D364F32AAC3E6848F7A345DFECE34466CEE3E45B303ED2CC43CC178ED8FA46FC6CB0851939E27F991A41AF8C139A0296EFFD4148295DD6587D2C0C2BD8828AA630587AEF7A33640F2B0DB8069750F950F8EF1162A07655E79FFF4C9EF2AAA6D24846DC0CEBFA86", + "testPassed": false + }, + { + "tcId": 285, + "qx": "012128717872498A61F4C165019E94C70CF8869201150F983ACAED461B8B60CEFA2F9F4753147AAB6AB7A8C889413E5528106D3FCF6BE58E4EB0944AD20A8B36F86A", + "qy": "01540D77FC9C1513B5F39723560D3DE46C071F878CCE2026F3C5CD291E1D652F803CC3B91F3E5E1AAF888CDB2CBA3AC87628761011557E2CEDA711203AF7E05130FB", + "r": "003DB0E90D8B954FBCDCC008035B5C35F815CF9459E3B3048B46898ED920BE56C420A789FB0FA613C7888B3A06A037BEFE7A49F866AFC84C3DCC3EA6FB1B35CBDCA7", + "s": "00C7E50EDBACB02456A24C48C740355DC54AE02612A32280F7CDBC5942CD9E39045891DC1384EAC748013DEAEA6A86F3D20D5879C9643D10EA677386F0A30679C992", + "message": "2BD5B71FE0E9BB7A02E8A33C3812B25315418DFE8F884782B53308CF24F4B0123610F81AA4B73098199D0FFD83915EFA7375D88172FFE223F05BD71182D41712E626CE960C26C8EEC200FD71AC37DE8C448BA33B06963804A604406DA5F398170FBC35611EA28517B1DE18AB04892831C97C041BEC26CE1B88ED39923E7ACCDB", + "testPassed": true + } + ] + }, + { + "tgId": 20, + "hashAlg": "SHA2-512", + "curve": "P-521", + "tests": [ + { + "tcId": 286, + "qx": "004A5A9B670D577A524AFA338653BA393EE79431D11621DCD0F5C205EA01C7A62E85F8B6F7E5EEE88D3AD5F653DE4FCD33738880E88803F1A9B105EC2AFCD0A45C41", + "qy": "015F037F5834792D162194163FE6B51EC8704A245878FE3173D6F7C09D63739300BC4A449D5A8A3FC67DE9E7DCDEB0676D2508726FC6B7EE4A41250CE823A86D15F1", + "r": "018EF78319B77DE0C7D898A3775C987BEA2EEB6FC89D2A87C519F45FF7D21A26136486D1739C1F861CA5B36DDE6656D3D4FF0DC8B1A897C8AD3E881EDD04FD64C2BA", + "s": "0077A6052BFA59E4AAF3B6BA7239BA7ED12D424FEAF1E76E5F928113CF57359A3FA039029A6110F31EB830CA38F08433B733A2175F2F366B3B001329528F7FBCEC1D", + "message": "817802D0846C39DF90D2B2D60FA8AEB851C091113D519F742F4F1D0FF87558F00A762DB8C8E3796A2B12EBC60C96725B7E100BC5A2D3A6AE30CBB3FED665F27B98BF6D81042CC95C8534E4E300D040E24EF375EAF1F1AF78F831E5913FFF9E10F6EC964C79C04FF3FBFCB6514B9EE0155DF2FD7475E8672F0BE6415320C4583B", + "testPassed": false + }, + { + "tcId": 287, + "qx": "018EA13D07E349252EA7059E6E2A7F4473D7452C3B698C586C964225DC420292742F3C645B4AB36692FF9F8BBA73AE5F987150AF7E50C302B56F4DC7FBFD3CB0D71A", + "qy": "003F35F431E33E5B71780681345961EC77CEB823F44033524721CF41AB041D140D0051DCE833BF06CDD9645C31507E4B11CF083C6EA800724A025B81AB52C898FB21", + "r": "01F7CDF00FE983F2AD68927118B17DE2194511E9A14F9FB86DCD6CF1AB8FAC5F2E9AA2CE70299C816D5AF5835EC746077EC4DB46B9A0FDB7DDC1FBCBDC3051A6BDBB", + "s": "0020929715EE2A66181F1EBC78F3ED09F137A2A3B3F30EC8DC39875608A90DE41B4898FA09AB7FDC321AB7F7AFA77374CB91B680B30581A92CEB194B484DE555ACA7", + "message": "C64C09D89C5729D8F4DF313DEAB6F86EA5A12BC72B209D3B1F2C41942FA243786808340D737DC1A9055591237A6E3FA15E580529D85279FB5A7D565D012F2D8602ACAC2A5756C6AACB031AA41CF7B8758A43C35C28462414338C643A288CAD1FF9AD1B32E3C9E521B42E6FFD67AC88BEB77EEAAE4E26341DDF8FF43C787BD93B", + "testPassed": false + }, + { + "tcId": 288, + "qx": "004D14B94A33B39367F2737A542695B5C3CA590DFD5070F3155A7A28EF15F9766EE9F5FB5CA99A78F3549827AC6EDCDFA254CA440ADCD6CD66FAC5D77071A1F48AEA", + "qy": "00435F2206D29F5FEC0A91FDE6DC8EFEEF8E31E2B242F4B0F67CFDD54201CBFF18AAD8D9591431E0355BCD7FFC23F28F74C8799A09ED4785A27B6C55DA4B4EA6E5ED", + "r": "00B06BF06B3978C376815625C24C07517129A1CD3DAA254B6128F09F2D75D1069B16C39A3702D49268D5A6CB2D9687F848AA90EDAE7803ACDF4F9D70ED4FCCB1041D", + "s": "00048A49B6ADC7E93D8DBC265B33A599F490AD10E056AAE81C7944EEDD435E196E1086733B1ACBBC79CF1BD4A618096CD026439F40E01DB58210A620BBC8BDBCF4EC", + "message": "F9D6CE5A408DF9240472C652EC8DE9D43C5D29EBB7AA4D86EDD87F76F2079EB790C633F12F36BB02AC914183F51FF4EEECFA0D9C71CCDB2CC7FD91FC90A5B646F6BC71E07BD6CE4AF99BB892D714847ED40F1CA84D947301A7AFC7FD80B59D642419987A9EC9FD08A35B31E5CE82DC8FFB12B22D0ADB5F8F360FA979DE72A62B", + "testPassed": false + }, + { + "tcId": 289, + "qx": "01041D5E4CC3DAA99FF693066151EEAD60534997FE582C81139171A1168EFBACC7B1BD3CA95FB87F27150E79F21DEA40B411CA48E888EB0E79BFAC31D4D9F84D6DFD", + "qy": "01998D64A05F2DDFA52F4DCF7054D49CCE2C79BAED05CC434862B211263CB821B491C638A95EC7A75190077E9F7F8B3122E210A81E8F58AD36FF291C1BA2E9EC70BF", + "r": "01DE345BBC327969707E77505FB7FFE9FEF4A770F3EE77BE87F14995C403CD591DD2642887909857F47F2ADC4D59637AC81A42E61281A2DA7F42AF966262F40A695F", + "s": "0121318257ACD77D721FFF8F1A3B507D11A42547C58B23D795C5F59B4B503D0C1B4CD54EB4EEB21660F9B8AAA4B08FF3BB653B79AD68985E6853277278B6928DA0D7", + "message": "6DBABB33B03DEBE040AA45F56AF75B9F4B5EA572F73D4F88B7DE7BF212AAAE642B08435265A16529855756BCFCD8C1CC1105479DDA7B23B00C21D415677037966641CE2CC36DA493FB80ED1AED5CA98CF4E2634A4115A6F93506BF093461A973724418A564B6AE754F88B2817558B7CB2A097711E3AADA7FE732E272E2F41CAE", + "testPassed": false + }, + { + "tcId": 290, + "qx": "01AB0E3B8D0F82BE6A768A59F35E1EDC82AFBBE614676BD2FEDCB49C6A2F1CEC37A32D23A2181DB6B8C028C0671992B4FF4AFE8AA0EE28656176349303886F99588D", + "qy": "01C35DF0D09C2684D3EFC94F38063FFB2EFDAFCD86AA2C9B08B06E30FD2046D0B71A4A5E867AE3BEFC0E85A3FEA70CCD2A96D123D839AD13C82B383BB9AA38CCFF37", + "r": "015359FCE233B3BEC903875E8E265A71FDAE0BA5BD1D879BEA08BC90E20785E69A76E3FDD9FC913EEF1E06ED6FA18BFEF6A37DC7C8A693AAD733E7AC24439DBE9396", + "s": "01A782248E306B056FD0E5711174D65DA9C249A003D952827506EB86CAB3A4EED5FDBF2A50D1C50A1C3CC48178DBFF52AC02D58A89C0852E8DDF9EE0510D38030AC9", + "message": "42D64CFE832A093892A92D6D161D1D7BF4041D434BEEA88BDFCE5F6044CACB92EC6F7F886C0DE7025B9D827D1A9065D8F303DC9DD28585C15FB90B6A2C65D5142747FE7CF6117ED0A1F0C8D0B00844EA398CC519DFF2DAEBEB759AEBDD89F2246E32855F7B9F64B91DBB8FAD707136F9A4E9F41E894347ACA67A1C5BCB9B8B31", + "testPassed": false + }, + { + "tcId": 291, + "qx": "01A3E4FFE59EEC778BE9CAC257E70F5616F172C0CC0D0BCE040C53C1E4CE51DE32D795F6E2FEFF9673B63BA00EB19F07BBCB7FB8684B915E688A0B6272030328E5BE", + "qy": "00E58C66F080B093001335D0F8EA6D25513D7AD7972D1BB3B2161A97BD74835959BC0051B7F4A1F70DE42F5B511DBF88C2C782FA659EEDBEF750033813372E210B76", + "r": "01299BF74C0ADC2C876CB9972D4653AC7B4981B446C2D647F3926DA1CDDD2590CC269D9DDB8BE41EB9242361E9E39FC87444BCB351CD737ECB2AA81E9530804C225C", + "s": "00DC310D5EEFB399FF40DC6C1F69328FA4CEE3EACC4CD57EA13D17B92EB408D44B6A26B58D62CC78FDFCF8AD45AA30B907C94F0B77D9FF9AF379543FE662D630E8DE", + "message": "E73B2CAA8E9B8EEA5DB599B735D18C75B9A98E9D0B0B818561B3B09383765E9E692557FBED0F6B932CD0A57E68DE0227B8DE1F0329C30A3E361ABAF92EBABB0333029537F84453D8ADB760154AB89F1BACDF4E3E7991A0FE5D504041E8184A8DE6F03608FAAE06061C9895C9C2678E765BA3117848A1F3690A8FE6FE4B707142", + "testPassed": false + }, + { + "tcId": 292, + "qx": "00952F544EC49E44823E6AA1D9B21312174A1E2F1509EE3685A46DFEB86211751EBFD5DD12623D81BCE577B078B9C311ADB2DDBE2264B8EC5BA65DE109E309C7A6AA", + "qy": "00331C9CD2AE1DBAC8F613FE6EEFEF8125A69AF4C32429ECCFCBE92B4D5C6C4ABDD53C1AC26013AB4D047A2D02168AE528B8DBB98848F05B7E226042827A5CF667DC", + "r": "00130AF03F8A334D49933C1DDDC591A5E0FF2C59BC93C49DB67AB10AA1D09AB1FAD832AD1967D749DAEFFAE147B224C0B2559C9F70752D03C399198AF4D50A707A90", + "s": "00F56578C03353F73ABB2E80934E7BA447F8ABAA30D4842B5071053884D058C825F88AA4371F65DE877E9591A310C6004054025CE11D710E594DCCD829596F327959", + "message": "9FA82C408030B13E85DCED072466E55AF78B28928BA67C82D112011DE3DF13A718619B9BF3F116417246C0634D0F358FB3D5D4C731FE5C3A43203297722485453F3B175AF5982FCC535A91E8E1BFA203A97442692553E22FBC903423BE6A9B042EA123F012DF03F53EFA1B142E19CB7743F0010D28B4E7632B293AF98E6DC76E", + "testPassed": true + }, + { + "tcId": 293, + "qx": "0056A0274EE013AD0E100DF86BDFF1E370AFE3844EBCECB51320B4303B6EA578FA2992F67A18DD2F731465DA9CF8630C62A9A38FEF98EBEA35F7C8B02D91E45D8F8F", + "qy": "00343DF2AC8EF292E82CCC1B72422626E44CC78B95174AB8AA760F0D6FEDF65D3C50B3B485B77B03223595B8C0DB7A1A2BD86FFB9D924B25690E13C9EED5AFA2E9D1", + "r": "0042FEE66E4EA3A1D79E92A943CF4DAB531DB7988E8D5912133BE4A8DA28371CBB776B52356C23340AB1199EAEA32FFBC5A8244C61184A22630F92FE69CE8AEBE027", + "s": "0114F1947518BDFE93967902F8F6829A25B3DFC9BA255688A0BEE264EB670EC08D0AAF1F03E64BEA557261E9A33CA774A74D42AF6B2DFEA80FEFB63CAFFB3E280D12", + "message": "356A5491C0B139E7B6608B330F069D0BABF82779F4F6E6A24A3E14831FD09F7043BEDCF49F6B7CCB398AB9D1E09D02C988760A6FBE05A0125FF4FC3D7D73716F316CD012D02682B568E57F95084597467B91F69140D1DD13D1AD1A2220E5B0B81FC21678E37E5B7F074A419B1972BF79161D222E2B913148E4B4902BA589FFAA", + "testPassed": true + }, + { + "tcId": 294, + "qx": "00F1D13FF7CC4C9BACAAF3B891E278C0AB32B2734D4F9CD9B9865B99F5C92F8B274016573620AC1945A3981EBD5556F49E0FE2348AE9A34EE048AAD83D88E9322A9F", + "qy": "00C581970AF716C7CA6B3D1BF8B35397D2B4C4D321AB134104B67F1FAFC0D9D0DA327D46D30664CAE99B9BDA457B6DC3EB163AE19C976BDF2EB1E478871D64E89B8B", + "r": "01963D9B068A4585A6D8F4C5377B6A1B030AA70BBCA2C00911570FD6FA5C97C47CD00D3EED8890E6F7D4D5388D1D6639800B8A0439103C6A762A955E6ECB6361E040", + "s": "013806CE07D1617BBEECC292D64D45FD2A1AAD0445BA9C9611701AB3186B45BC2159B43254DA6ED442A760C71CA78C6A998EC0B64839CBD756031B410A10451E215D", + "message": "5E0A8E065CF44C375196AE6FDD799C6AE908B6D8C8E1A231808B9A68E08A5A0C00F45280AD62D6A6CBDC7BBF2C099A10DD158A78313386B08A3C68329B1713CD55DA79778A7A807480E80C4F922C6DE8BD3680F357B0E7796CDDFA2DD6578ED72B0EEC9AF257475D09E22919ADF38E846A3F892AEF3FDB42756BCFD2D78956AA", + "testPassed": false + }, + { + "tcId": 295, + "qx": "013944C0B734A5B3D6AE09C6B1E6E060949005B36C354DF3B24E1D3834BD8EE325748EA9B56C16F7C6809018D8D285596FC6406ADDD4DC12D8D067B4006EC264F4F0", + "qy": "018D620D3CFE8C194A77875F6DC0F3B821C317E597FF6C573DC02F19C23E4AE253E258FEEB372238701FC352D60F728807B297D262E4A1FD86E3DDFD1470B7B70FAA", + "r": "00B396F89B7355E00BA64FFA0F0E9E51563324C2C91FD31ECAD650B7A1F121CE9E9FBC4564290021619863760E5430CB53E97AD7A723E4297E6F13C7542B3CFFB147", + "s": "01F422B49843160423CC8154929196CD71B666449F42414D50631F1537E460919C28845A822AD2EF797784A89BE01A377F91F57637794AB8BD0FFAA2620A701CB523", + "message": "ACFC849FF5BB2F07025AABC1A2854737DEBE38353A109537B25D615A2B34B8D5D24D873E7E8C8B28E84ADC82EADED23950EDDBE3AE511F333B032B80E31751DEDC969F74BE9725B9A2E6865A43D03ADEDE44727D12956B71C245D6A3452E0E6FA41F5225BCB07DC26BED7919C3E27911A771AFF187F6FE2EBB5C253B5A90A71B", + "testPassed": false + }, + { + "tcId": 296, + "qx": "0026675CB85F4E30930C572FABDEBBB241F7452A72C0C37178654698C7A8999E50C28C27BBDA0BEB031AB69BCFD096321FFFB44069646A436853B922BD85743BF3E2", + "qy": "00B6A2685133772C256423586516BA6DD6BA10F98B5DD4B32A596C8449D66BF1EFA73444B5B1BFCC0C15F6699A6418259A49F4DC3A89B04A825940C3154D437AB087", + "r": "0085419F0A16D079AD0B40C058E03B119EEC53ABFE7F0ED3D12F99B1B56DCD050280341431B6B45BCAD13321C52104341926638852840842BAAB9268BA496D6B2F24", + "s": "00A9D054ABD49962D6B0A878FEF55DAB79B2E2ABD3686DA565F77482F664FCE52EAD2E28B4CDEF6920B1020A0EC604501BFEE23FCB1D682E9EF63E7A966A19777023", + "message": "AF03473406CF79DEBC6F9A0470935C1EAD16D25B53B8F0D3A037FFB44E57B13A9F6514F2D2201C5B87D33F6E396E08D5F4C1D167CFDE16C3F51954232B01B1FCDDD373796850DF7F7EA2396A7CE6EDF55B2BB600548E0E12DE7D42B19F9BFEC13DBB5426646400AAC125F6DEF1F54137CBF4BF2AC3EFB831F9D8DD68FAA0A475", + "testPassed": false + }, + { + "tcId": 297, + "qx": "010E7C65A27DA7E0387F9CDB6A9921C27136FA887BC1673ED766E6D5E66E9F592DD51EA528E8BCB03C7B527B9E0CE4CFFB412D73905E319009B25177B699F2D28A8D", + "qy": "00952D3B5913227E5368DED832F81705CB0209CCAF97CB949CC4AFC190263D9D0B8D28AF918D3F279A69E5616DF7162B238FE0E000AC449399190E0843F33E5782D1", + "r": "00043666F2282D0408CACF81AE79AEB5D9EA9BD57BC0BA61D0C1B990EA45EE556C6BD18225D517EBA3FD7276D69CA6B2A03DD5672363F8B323A360FA58E296D05A3A", + "s": "00AACEE4A8ED20BF447D05080C1E858F4EB47D060534DD10411163427BEADB8351C8E9A8B8EAA1604FCE490C667C8F799823BDC8BC052C5E6F6AA3A0A7079083EB5B", + "message": "6B2D56F4151D2485B4E9F9B6FE8BD583F183C82D11BCAE113E04B98CC5DE83661C7D625F5A2DDCA0D92A151BBD311E93E894AEB2EA9108CD8CB022F1BDFEB0CA05B7E71D1FBD18A035B2BF198A3AC260F6768A75A9881D039B811D72CE11529943A0568091150A730A583A0895A34FA923F0031097F36B5B387832293122F870", + "testPassed": false + }, + { + "tcId": 298, + "qx": "012166931D61B5A803293A39D927F86C518F1F3DA2941900BA342C96A1BFE5921745550D7A6B3FDDB2F447226462A39F623A79C507F66DF51A4FE16B85D46FEAB0B1", + "qy": "00B83D2F16077550912C53CC3F12156B9C561F9A6817AAB5FB262D3FC0414C5E676D172AAAAA26C38DDADE5BC1F792E75C2DC2DB8C1F72F249F0BE2392FF737BFA7C", + "r": "01E5B82398F55ABF8213EC7347B6642E38C3EB9FC11254572126358518252E22B6E26428B84C8C0E9CE85E72ECCAEB4E30AC5E5FEDDBCAE5D281D6EEDA6D3565B0FB", + "s": "0192AD46E087E06271BCB6E0DB0DEC1748E49CE8FB3686B5AA7C41FBEA5F65E52B04F1C47589017776DC8FDB51D907EDA57C84BF9C8DA40480E15FA2C6FBAD5F6E4C", + "message": "A5F846CB41F61C6EFBB08A0502C4566D7FDF9C6EB7B474D2EF970B15E49B946E29955379805C8187083C7BE8C7D50454F13619A923DDFEF972C628C37E25AA779952DB071847A49988C04CB6ADE698175A893B8F132DC1049C6CC124F50A4755F229CF60ED5FDD2CC62CD6E4E29B6633EA1ECDC57A9CA168B2C866F6746AC55F", + "testPassed": false + }, + { + "tcId": 299, + "qx": "0152A835E64E239D7D8EEA234653F01987318E88C172C0D0DCA3FBAB089BD440275F4125DEF2C0F7302CAB0CD12DA8872EEBF7231A7429FBECAE0C44AE0C8EED1D56", + "qy": "0082AC010B214127E65C6BD65F9CD54560BC78C14AEF4C5811FFF0CC085BD1A3686A7AEF3A39812CC5F54AEC45C3125641C9093B4375C058EDCC98A3634BCA9FD671", + "r": "00F567E56746D2C0818CE28493FC0A608261A06771A5DF0D108C47EBA1701D5368560B69C07DFE4FDB1ECD7AEEB5AC23308F459AF8516FBDC21513F883F448CFAB0B", + "s": "01863CFBB17E6CB5B03C472579F32F57C4066BE47565D0FBFF52D11EC84F458F0F91DC9595CE47AF248928F20DE5220713822DC1501C69BC8F7D0188B1C6DC535BEE", + "message": "74ECA9EF74CF19B7116A2103D1E07CD01F890819D135182DE30A27726CAE8BCD19F04716AC95DE1859B195718AD3DEC5ABA1A1E67FBAD6BB03558453E87368A7DBABD7B0A52772C06F88D4A7F11B83675E10E5D4556778F1A0EC3E1E564DA12D58878D0E3A3DD59176F74DF8AB77A84174DAA189A0C12E68B912ED7AB8E8B7BD", + "testPassed": false + }, + { + "tcId": 300, + "qx": "001FB95A7D8BD4C75DA752FE109401FEE3DA58D97BDBE8EB65CC132CB5FB9F1826141991557CD9FFAD08A60C72471DDCFCF03687B194D49E509CEA38BE00331196FE", + "qy": "0088B9AD93A67072BFDBCC1FF87D3E38772772470A2A6F2FD9AAEB1E3D327D76613AE55517E469F677349C62D2158D38ACBD9F5C98ED7CBF0BAA9F7D12D305E51A99", + "r": "007C744EFD72D618C3969D48B24CF1124376E7C3E00310AA132C66D9FF62272B3E66749D61F1B17A43A9F8CA05F05136CDABA96D3DE2A8A61CA42A83FB0FC19B0DC6", + "s": "005C3EEBBCB03FFF1AD438A9BBDB4EF98505951F841FB126273CDCB4D963951638525BAD751EAD0448521650F378855D3AC264BE36523EDB443C065227ED34A1C81C", + "message": "3C0EB99A4C46F4C9505588835D049006C1897C5962B294BEF3D8E32BDAD81936DF93CF952A77698C3FC19E2C6C534A0B1FF7FE15EC57F70BA3E312B5D2348AEF81F4D6A710AFFDC09F69B059BE38A1068DB66064C79A2BB53ADF45273808F5F01B5D640E59D7C17F5CC5B0170C32EBE90B4ABDC724A64CE6032F7FD12F5A864F", + "testPassed": true + } + ] + } + ] + } +] +'''); + +List sigGenVec = jsonDecode(''' +[ + { + }, + { + "testGroups": [ + { + "tgId": 1, + "hashAlg": "SHA224", + "curve": "P-224", + "d": "48fc9f2ec46a109e764f979c5b396ca41a1e736a64dbe0bde7e57777", + "qx": "bf0780a0d9c3a3699834ff117577274b8b32cd2e5bc4ac1928a9a73c", + "qy": "720c5f36a4d744b0d8a30795be3f8740203c618c29b7224376f80b42", + "tests": [ + { + "tcId": 1, + "message": "54681f61990fb6ea6e6a1b3a8cca36f594f1323650583f65dda32e5203c8837024603514b0efe6ee3a89d7aad2e49c71d312d4928dc98b897ccf517ffdf0734614ed1e283c09076983c000dce2bb352e232c43770e985d4289721eb7586aae3a65ba660713bf9e168ae32aeb0b14fc9a87a9eaac2ad9007af431e8db20914cae", + "seed": "e72ea93e28e7e40e76d5242fcdf35ff3bbc4885e08bbc21ce44e23288c3a78492e63ad2e5e1022b4cfef524d8824de998092d33719b0a150c4d6d89279d3e86d4f13bfe39a9dfa2eb678aaeabaae7324d03f1deb6952d4329198b4c2235035261e7c4b83210dbcb673e0ccb40a4eac2ffc6f93b68c13f3807ef7e12628b0f221be172819247be1235662f8e9bf28cc8fb97abf9f599793f6f35286cb52d536ea54f32588589d839253e8585bfe262f87ed9b7c8b2e43ac8c61c9ba770d882a5762c6f64dc9f94362ce197abe3e7aa6ea6cc693e7473eb88db4496f20cc909d5b083bffa1c2912f23ebe176c4e86faf7d1e0d999cfd6237f449a6f8231d91f55d9bc7cce90ccfb22ed064032edead01409a2c56c096fe3bbc9d72ce15bf64bf93d581ac0428dec72bd7521a21dec152b5f3fb54807dffd267e48d87c36e2ac0c1f0e556cb102b98601e46568945a92906ee1611ad1332108d95a094e945a73f0a4163c3d283de8a3a811ef1ddcc1e0938f8e9c9f6a64760f83fb0bdb3f6da2fb7bd14596cd0ceaef4037413d66bb96edc3cbb77a61de7501d89ed6a6b890f0f8222fa690e117e727d13c53f27a76dbbb419f6ebe56f3e573da1af35d851761cfc92e2df936b19e64dab44c45244b829d831798d8634f99665672872f1bd43f354b3b74b3f3f7c5b529ef4e57252828e1d6c2ac06a49213bdcf3970b177c6662fafc70021308efef8ed869a84a45b0060cfaf8f7649f6494335016fb107573cfa669eb6143c31d2e82a7bbfcd4176b86b9c582fc59448918adcb8d606e49dd253cd5ed4b0b7fccf2cfe9a90763ba3383ff808ab103123ccdf1ef17d3ef74083e9ee6ff694c8988106efc404d0c2555153ed18f6338e94f4503658418cdfc6be9a9b98a68301f3c80dafef6ab577666e4e9b0fdf88b4ede3f8a3fce7deb590eb0d8af12ff97614288c36039a97929d99bed199b126d6acbb925fdf6b415bbda8120f3e42373e64d1322e8ff929bee37e29165248e0c0747aa7af0345d8f49c5eaa3922105532f67b7bd5c71e63e03d6946922b9d57eaabbb3992a23975ed1955157b4c65b27abad6a1dbdc8bbc95202854951b5b414c58c29e62c47747449c496d3be259081f1dbb23a96321d1e4812f984372eda598f07a782dc21e10841bdb9a12a35a413dda54b5bcc3c84e0f57b4bf68b33c2a3eb2ffefbe5c43adf5730254d48d64e6b9fa1e9164190fd6533842b980a4d8402d9d34052eac963db52321c81b23a5cb6ac296b6d17989ea92e3d2c9e45e33d2527eaa82f81c20847995df6be0b0a2209c8dd79a5358c2d9b9cb49ba4414c725c0e08c5ad8cf58e76180341cbbcc14622e751a7207d8ddb55f6493d4e21fe3a223d0a3dba6cd208040c2f9737b1691aafb961d7c4e8335a19855f7613d3c36c4e7077bec0ad3b7e7cf98c4b2f", + "r": "ebdfeaa11c278463a1060616f484892b15ccc566376db7890407b9a9", + "s": "bf56d5a6092f904950a7fd3b6067e0cc9f01cdf453e7a868792edad3" + }, + { + "tcId": 2, + "message": "b3bf287b8654362d4cc69b8dca19967786d53c9035bc06ce72252e443e643515a20216342e2cc73dddda8aa4e0e71cd08c3bb3352df6a5caf356a74e921408d76a7c74e6ea23b23a0a6a87db86f9251a74c158463ca09117e90157e166d1a864b5109d05019092e582efd5bf0e8ecb4a370e203a79bde7088176777d08352ae0", + "seed": "04bfc5e989b90ae1adcbf6195c1e7825c13a5975ddcf1690d80a48636d93c64f9cf08d2629b20eec6f2e74d3347e7b1bece464f109e921d6ff70efb438a0e971a90652e33e72a87270d7aea220c7d2ade3bf288417adb8496ef8b06460cd38ce4996be51057f6bffb3baed9e2e379bea707477b8a5affc2304a6ff8321e7d9bf880f2f4b87171e442cac3b6508a27f28524313d2bbc95dc5604474e14307ef4227ca1eb3f63ae45411fbde237aa9a5630fa48c04c34855932241780e90978f107c2e209c2df45a30aaf26956cd2983c6e868de052b1c6a2172e678416abf62277d737b649184b0ffdb1cdbe2deaacb7a84836add406ec41f8b8652a08bbf8ddadf5973ae3a08131d371d1db4cfe4323f3b309e39aa1657a3348fc4f73e7c33d99f1bdc777bf8c8e671272735ccaef58041140cf081512348db9aee1c5279c0d53d22df59113d66347b3d6421bb97bc8110d9303c80164c9dfa9e0d47ed8c74160e574504c1b46aac5ca0d0a8b0bbae0d2936e02d2a9c5e402d02b72acfa5eb99c4d89986e62e3c40189da2c75ec742a2aae021ebfa0c72e0cbecfbca21e451ff43667454010612bbb0f0dc2750e7c6ec3da6b909537cbcc945eb56ccc02449be0f55e2a31e30963db452f1d130c1f1ede8b231e6fc2436c056efd9bc0c331822453a7fd8509547114bfc8c15fbbf95db2d7c9fd5d10b09a0afc93b00c271fd49c2b1dac956fbc96738741fc4f7972017b1b27b232a61828f122144f427e44c835442c10683ba4c570988cba3684cee018cb5bff4d6bb9fc9411e7805df8675a5b80c6589338a08f5f9feae01ded2ef027e9767aad567c39d854cb109a09d877bfa72693c933ba1bdfb5db7dd7d64f1344cad39ac232ab4fdab17e90e87e629b6e81d7dff10f18b1d53e211fcc23f5cc46968c5f9108c70d27a203aac51cf2e9ff106802ec8173c255337d92cde997ee1224de607a4d5fceae9ae5d7e2a9b1e2e44fbfabf35eba3db4c66c3a5fdc88b31c654aa21092d2f1932283a8507a37f8985b1294a2e5457a14ae05ca2a7bb67a7e66193daef6c6915e3f216695d60f91d6491e1d2d6410f0577a3af535ce1bd2cb92f53d30ef0fa746534b6052adc8822868d692747eb12ab2d4b4f752e42383e17d68765e2f3168b32b99fc568c25437fbda731557cdb0e72eccff2a60847a3754129be21de95121e357961b561c8842787e36afaedecc6f9938ccec024082bf908385ddf7247c451c2e5032a1672a158a338245e8dcd7c63c81c778b80222ed42b448b3e5778ae28bd70abd5be95dbeb4428a5d5201c432ed23c7851ef8308ba6a24680eb4567c64a7418a8df358f309b5cefed0725624bae03b89da455a9e65ecd377ca195dc696460c96e6563b358a5ccbd31b195c9977177ae3e36bb64a6739040b45745e8afb7a45d44c9e89653", + "r": "3c8a910267d98ec21cd93b8c461e0c7506140213e2f6696627a795fe", + "s": "2323968c42a22f458579587910f8df1482bda55e636a85b1061d554f" + }, + { + "tcId": 3, + "message": "f22d0b095a50abfa2ae6233d74dd825c743fd49e838b27b7664a5d4df636b1c911e53658f77fdedd770f3064087eb633794d44e3d19eca29860389392e220a5b4b2bbc2a11fba9b823a53d4eb4adbaef848c700191fdf4cd0f4754a1380283b45ee512c36e3bc0e94ed6e1c66cda70daa5c23cb2d668405eef2a65d1e5f88f04", + "seed": "662f8ff5647cbebc8ee92e0ef220b2be8212bf32cebac866740994c9dfde789ccdca177be81d35368334aad1bf24e91eec100d6179bbb91d65d8e71f5daa18f9f2030dca00f6b9b32bde9abb2cc0b79cc5ad0a36583f86b5c0d6057176b9e32cb717fe42341cf44cbb847a7075fb3eb092ceafc52373d3ed8731f3cdb2886b1a12b3c47746c30e2cfd77e2288b9310183db7830e156448e665af82bce30b6c69e71402bcc3f5f1f188a820735f73e495ea99ff7d49e648a2d1ca2b6c0410ff0141255522d3924804f068a188781ec2f8985c85ac8930c66bec76d4c0d485cbfdb0db710ec2370b1026695f2757ff195582627971cfa4b433594a1695a117af6355c5fe124597fdee4438315ca9e7f63bd8b6d037b2fc8c61970f4a0245ce7bbd48bfcc2a71c5f7451c99ceb310f8b2d1c05148e7cbb97caf17c18c2b4b5a7da1e6ecc416115b0f1b22d73bb05a516ce9197fb385ca4fbee9a8543f36cd44e720949262a62bf9e1997e903ee51cc5410418f11619b28a07d66f5f2162908ac76efbb94f98f76f815b7c6132998e61628ccb26f64e09d06fd22610ce7484b3502f76f2f95fce31503f8aee6a5cb4827858fe8368f4b377e1430f8fe7d1441d1eb3d3b6e0de4a2838ea035eb6162ba8f9a1b5cd1bacc62eae5f37096640308b9679d90481ddb78f858647f3ef56d4d2ded9e468ae8ea1ac1a4419d41e8889c87cbc0dd8d449f8d312dadd663d097044268eb1358b17f0a221baad59b5412bceaad24d46e811ad641ec456ee71607f5e35037af010dad526e429e59fdf8395be3d9e324ff20495f0b7a1b843be103a40a999a32e9fb3efb29050efd462c1f1f430e256ed8977adfa3d5e94baf9f5a3302320fc22439d0452417c41260e01fe754a574f95197c59b6fe67df68b2a4ff748b378e091b38335292df67e9a8f95e4b68500b9b6849efcca457e6030f4f44337e3b305108528d0b4fdec1b0ad846bf276ea14fcc932425f508bb01543d60e8e9e8d1cf21a0ccfab46d38e1a014143190f53750865f904214c0c8558037c9d2f6d77c292a9241c6dbdc04237cf3f76dff53df10e9ab8efeec818db53523ee26c8b6b11b6c6219d0303d212558c9025a7b9a367c1c3f74b743946de3ef991c9f135f3d15d584931d00628ac97b4fccc117ac86c90f8249ca0016e645cf925d8a0b59c4d100bfb25c3c96d777845e8b92719a8cb577c022da541da3bea8411df201f86bc36ce2d98db609ab9d6e5cdb46368d0028a810274517b5e6f8de806777e9dd88caf042351ae5cf3669889cb7099643464f7762534e90117ff4d3452e129e25c0cfdefef84acdfc7aacbbeb319dbcc8b359f91aa263f1725f2358da6df343d2ffb645de80023b275c521d0469037f9e09670249672987adac6da19d37f94a6fad93150ec3c2e4f74c672f7145f85a10a", + "r": "e6997ce09450cde6054ebc125d1246fd6e3421046cbbe771677028b0", + "s": "b1bd7f9d9028485e1a727fa270505198bdd1f807e0bd22142652caf4" + }, + { + "tcId": 4, + "message": "29956a51445c2994fcd10424a9138e617e5f1691b1d1fa1f62e2622b258eb786137fd29cf049aa4d9fd20c73dd4aebe3a29d0bbfbb3d5ffb315a9befa9c9670845e16e94f630ff8a1fd1ce11cd2c7afed10bf58c96fc678214c9ccefd3ca1e6ee4d99f5749bcef972aa2bc23c074c4fe4a6fb9c8384be1e439b751e6c7292cdb", + "seed": "9284edf34f0feeb50058826455935849c336f177cdb4288a8affa99f52f4988ca0029d7e0aba2734810c3f3df9b4c51ecd9db26fd536aa04f1403f014667c24afb6cd4e05e4af2d38c5ef6f4091397169d950429eb784ff95e99b33fc57c8a5592e7946aca62a6a1305de2525b1b8908abe88e655a9cfa373327fade12d14d7c943627e13ca3d9f216784d53062aa8e15451204c59de7d0c0c96f5ebf0c8c0a534158e62a871229da9a0ace3edd3d1191cf7c8caf40e891cee5a0aa78498e24c2ff5e9a84435ab93a3f3b721f6114049b747ff34d4e33696743c63acaf48aa5cac83eac59bc7ef0cd4f3dfd7eabba4ee1cd3a5e0122552ee29f9e56be58cf775def4187a7c1691314776ee7332e05661e81dfecdefe2cf9d77a7369dab61c8cf515813039cb69d9cadfe7489fa64b20885726e9173d2eb8a49e45ddf2299588b79f85b779a34d05279abd7085c45a9db622fa222a356ac5d97310815048ec3fa47e237fa0db2e0b3e5c9830c465f2cbd54d731a222a6b920bdeb0b01d975e90691b26d4c8f4fd8b6c8c35dfc816640fd34e01188d1a76b3504b5fb8568e68a7b7866cc0d46b3dd460b5794fb5c69339d02c5fc1a67bf51ff2fc819e16dac805ca803f7d7bf5a12373f4d600ecb01cb52ffbd4422ef10e7e24dfebbeb15d52e7529e2979fae218103d1fdbcc7633b256ec00196e6de9f17436857829ae8fadf79e254e1ddca1b8accc31162708da9ce29d15ed7cd7c1c10a20cf11e85c47465324bcb85a70f1b670b899de16a767563293ecb2f8aec9e5cc8f5d16530d75ffbc22589c96bf8abab62eb42625e66b73a7a52abab36ed6ff2c1825454d4d141e2b2d69854305eb4eabb3637b6ba3fe79fd23cf91ece387047030e2d5ef3cf6073104f547b94d15ed25392d9a1a48b22ee968aaedd082c4c5ce7d58222e7dde59fd1507e13f48cb8b7fb6e586c4c6b6cff3b8e2cf84eac851c3b39646439e3993971658d34596a1acf0f982dd58a134b5c3c007ad6a5c3ecd47b23fa9e6910ee7589ff56e70d0ffcb10dda7255bb468f2b99f6b17aee5322c4a738250418abb88cdc08e1f52c598821eb9490b36a43da311669e1259f24910b967fbef7126fbd323a60fbecbf4e37b79cb112a60f952473683f3a50704d2e2f96788c6149b7d604bc95d279d3934bb94c372d42ee7e1cd43d5bb796b622afca6dc9720bc93ae57e726c56732030b7b456b3e22ceeb147f83ca7e1fd1ee05cfec5c8e1337dcbe67cc9de6a41d32a22986c0bd221ce356d5d2d0719cd50ae87e29972102416281974db9912fd2b820b11b397fe30c4f9ce333f1f0a4611ffb832a211f1f1b927f01537ac835b4445e97be9ad79b0328900ccfc8b33591299e19169b268f438bc5a9f633861264be11b02594b9907699b9de85e5fea13720dc5fbac024258de2a67bacc", + "r": "54de5c5440a69855dce191c8509a17b08d83816b89b8ab4270f81548", + "s": "5c483265ad6ea7f41fd1b42d0ec87422ae729633c87370d3fdbd55ee" + }, + { + "tcId": 5, + "message": "7d061f506682e6d96eed6d8e8ffa448380daad08491741a309d56b942ea2dc7269c6d3f570a96f565d6861d6e2bae6afe09c16149ec99f50fb8ff9d5d84442d0c4504975a9252097ef4bd2e8683d3302aa43d87173a1c2b23c7d1a91405ea13050ca1316bd91f2b90d8ab5607cdccd16203a347a74939bd76606079cde2e22a5", + "seed": "fbc0325e74f6cb032f75d4e5b4afbc58cb84373ef8c4089c619128309793d488ea35f968c69e2fc24b09e24e3090b0629efda1c46b5db538fa4f766270e0a71d778a57d5dcf28a16f787107543e3e464026526577c486a8d9f84cc77991663a7c559ef8b27c2692c0ffba8aa97808b42e0a88637e198c58a70506962f8eb22e660aa6ce14a333a07252336c611cd31d76104f8155a0f17e9336faf6589d28e68750173a1c33348dc8f61f224e52dff325e2b13f171bc6a6bcac8e11fc0fe47012c2f7eb5db7b382261a699c351185428472314720f4b51cf0c04388c7031fc925b69d15aed2bf337847955a96b83a8c59fc727b656777d8b4bd2614f41516033264544eaa32df7803e68dbe6781c43f52b86b840c8efc442beceab66fe4739f4f0896a3065938280ca31fa4aac16edac1c1b4ebb8c4e91109bd61b7210035b7e3de9bed9718d026c7a4eebfea6ae85e9225e59cfaf5ea16a663757bb3c9059a51a7826569e827ee9dcc00a109a356543d4bb01f10bc400a10f365fc8c74a19609dfe49660bc4b698b4a94ad8c2bf75b591ce422d6978712894b426fab40b068e187823eaa789dfef32c7a49d26322bc90f54421bef9affe9c5a53e6650b27c47d43c8afa30e9f0350470b6f130088f4f4d6807431ff30d0a316bc0dbe176321c03ffeebc6ef4b7d4b4f9fa9af7ba3c79b97da21d1a84ff910a9df082883d4c16ae327c752631ab9658b2131b1935ad00137952415356f7d9c91bd2f2a2ee811fb61e2b603ba9ef9d3aef5403361e75e1f47a876ee13c7e2f34cdb2faf5d6165089957d598f2fd9b9bdff04db01c2f649feb4e4c8ecfd9a9d1d71113242e3b19ec4bb483b5affae1c9d1b80fb6f8e66ab548fbbf0f09bfe778e5d86c0d8e47880ffa48e5769c151df0551093cfce03200711e81671a9b235c889282674d6908ba47344fdfd37c0c34bdcbf4fc75995ee9e6baf4e36edc5b856190274253704f41c88363b6dd3398e1d35b7a3f9e0de36d3fcf5806d38a754cca807a076b0863f737532827f80bed4434b590e56acbe455286f184f85f7b2ac1597ceb504b61836b2eba372b2c86e28c92a432b721350ca573a4558220f7bd1afdc1255681490b86c524f15e8fed423b0dfbc588480c77f13da9caff1b11570e7067fb6ed33c7ed460993c1dec43f6dab7e3a3ef2dd2cc529bbbba488f22dfa179500ca954517725dd8ea02f317bc798bf5e0b1236596dfbe9dac4fc046e37071ba3d9ffa67f231935420daafff9b1a054eab88042d5d2b2090394d804c6bc0f805f252160dd4d9803ac51a02a9a924c9d65a9b2bae600f4dab7f5d31da2c5f793604cce4f05b7056e46594dd0fd478e3d092be1f4e0264dd086e6fc0b71c3953a13a9b95b847ed203ae1ec26e0e2ac128517f71f70273cf33364a3a15387a57df089f3ab4ad144", + "r": "9573bbc0567b2b2c2432720a3f63f8c01291bf8be29dd16677f1bfcf", + "s": "d1a6dcd8010cd0c856fe229efb912c3c5988498a79b0e19d096a3f9e" + }, + { + "tcId": 6, + "message": "300b760ca0f71e244d8f1cc0528299a95d386a3117e73a8071740789b8ac38af418288c0a46bce8ae9486e8dadfd56a76c2b2d447530a3b8cb1a776f81086cbb1dc9bda82a06d48b7cdf61baa0069be9e4889125675579ff2ab2c679f64b6a4b030e9349e63a30fe50959aee2fce6b92946ebbeb5370cab113a3e35a04252017", + "seed": "b6bc59550289ebf272b4afd4a017308e0a732c32cac1b49f6953b9f06b51c7ed7ca7dd287fe8235c7cba82fc4372b397d846b62425689a3266512b37ee6864890325bffaefa30c13756ca6748de2d7671a1af5dfb0cde7119058a91d84a69fa46a1a6ee2978badd403af11f1b419dc991d13275e9e51958c19bbbf696b1bef42d0e67c8a47c8240569806912c2914e23e2ef0082d73bce673917a1b4e3fbf66087fe5783df343c607779e3e4a0a25c68f87996b6a2c1d4354a748e75b02477d9b3b8887a8f3e1377f44b9e27c99fa3f725cf61eff18f6ef4e3d613531a16b9cc66cb364e2a482dcb65f0dbcc414e4c289b4e6308ee75bc01cd19dcce347bc0ef9e9098c7517345f91faaafbab17b66b7529f67014b81bc1a3e3cbe9b00b7968a931b712ee1d8099124b5b2c61372d0f634be9b5161fb33587b683a552bd6f033d54cd2e6b21e90c3662d5a82cd44b491b3f234086f305d3710f3dbab8a3033e51fa80b72f414157fd28891f2de6f24de43c2cc7bc8b35e0017707d430fa104f8bff06305288458de1baeff3030b6c80974b78750643d6a68255206ddc5d9de8bb4049e6e9be7e991f26516b1bc7e2011075d5fc1b479263ba4b67abba4e19969ed5ef38fcbffa85f745a692bc16b52de13f88d1d893a5085354ffaefe152de230e03a75c04dc02ddf5fe47736e4fcd6baf2f8a8fc05796efa57452ac843467e49698d0f9cf4321ef6859ccd7b862d1707f8d38f8f02eb300540d0220a62019a2e670d40a47fd2ca21e27be0b448b28fcc22dd1141c663739c501f1ee4d83eada06083603e0935444d58171086949ddeab53f506d6848a285b9a2346f2bbe4490753810c0a084c77de59b41aa7a8fedcb66659b049f0cf94b74674669980827076c7fbca13084e5cdeafc39f427e6c90ce216ef893557feb1755d9601febc20a4f1e9ca1620c7a464919557aeff2491a6a0e9b9aefbe1a1675c981abff808c4e464adff6aeb9cd0b97d6132677a32911bbfeda09e43b7d069ecef1d03a725e12cdf83ac7edbad4f601a2683b8d99983e1134960d7a6212a937facd86ab8f3fba7a2775e2e634459d66051bbf28ceb38421a397ed1b02adb7750cdf3795ab569fb4eff2e1c44c386ad0107a0a18e2bbfc7c9d02c47635f99c8614ea88ef61a567e6ffb7c121cae48376c94c526986a0aa92e15c68e9533decbf0eec60bf9cf1882f20344e161111ea41156f1374b9ab582be61af47ee8f4721460667f163904e6d6f02d7936b1e89934978bdddd2b3ca5981bf143bbd2eda24c9bcd2ea3cbe3f735fcde21e0526c044d5e226b73e448cf1313805d5d2902435c3dc8d9cf7fc269ecdfcc893155785a58529985a9ff51c05bbc4c4a5ed60940c3c538030e634269d4e7253987566d2fcebf14b1d1e376b6e207f1669d729af584b92a1d93cee481d", + "r": "afeaeb35aebacce0f9f4aa6856dde78a40d7aea93fb795b7dcf7a894", + "s": "d7778fd3c99ef800f9c9c543cbc6cda7f9e0ce6727b2621c9ece9003" + }, + { + "tcId": 7, + "message": "5327a470cf1b663d369a38a47d9eed72fbeda89420a340079312fbce1bc7e61f673baa199b04de870bba8e57efe5ac6650e94b98089a26fd404074aea371f8c4f128892a043d5b4785b02e47a1814808c19e3f138bd847f165af57f74b643839012fd938ed6e0490fcd770508b8cad9838c013dbabf9f4cb60779809cd581ef6", + "seed": "43dfdf6e89bf568af6d8dda83469fc35f2ce983807b149ca745d2718b68cf059b93576e1dd62a241604ea46d56891aa5671565aed3c5069b5d7781fc722374519302f49a4fcfaa9f62cd96f1f0333dfab7c3f9258f8f3beab4d998d07613b80a90d92744e6159c7cbbcd4e39185c3e62dcc2690cd460e86e7c32340508ed99fbf789578d8c57f81dcab02aca00aca5f8391a72ad6b41649060c7d9bb3c324b235d213b4f8f1d8ef8cebea6c012d3eaf155009749e60ada07a3653b7568f4073931108c730e1ee82b39fe5a49e43f6174b288a301e235cdc2390037d9d006160cf0aa11f3902c9cb080583beb043218e5deeb4d9c32c72adf640e0bbe69af6739f7bdb21a5f15cf6c641aa1201a293b925251c34290aa2a74ef081d2ab1e1c3b74c98d5b36412761153799277bc46ba241b498a1193f001e54ac7272c8221eba6e11bfa5b4a648e8170ae47b5df7fe17292d7c821cc87839bea2d0e92a319a392564e23d5d79d8ef5ecac89bc91a06e63b759bb1771d671ff03c126fbfa4cba3c8fac6518bcecbca330a79f861096069aec67d43e843b6d71fbae1d0b707359267aee1a1a569846333394f0f0282e0f3cfbee7bbeefeb8c9eea3efde20db9b2e359d24c3ec01076e6404eeaa332cb0a9d111a3267d31e89a5c2e51e0d1c59cdd17d66ca1fb24f0dbdbef26c75aa5b397b4c525f9a8e9d7e5f58817c8e1ba1e9a1441fcf0b73d5daccb0db543b051ed80a8d0aa0a0fd60ea89d80e86414f42fa6896aaa903e3841fa135e4fc03513c0b3cdef3dd781ab17b251c1b9293b8f7d53ef8eac37e148b2b55655f72ee4f01ba160e9ecfbeb186d4c856dbb971beb4de6af1a999d7fa12415d30263f596fe6e3dc6757144718523dce7a3ea01a1da758e004e9c44166f3e8ee9676464a18095fc920aa0b352e09e428951844c076a21509e31c7de14236b6eeea17e76f6641031afd988c4fa790e467bf9001809f4bdc5a045339d1a4a8cea775aa160138da6c76b0f46e7ef6455aa7f4d610863b57be763532122538218cc5609cc26b62b00b24340e2894e742c1bc7a40ee852ba4da60937491cec089834fd4ffe72d20fd4c28860d2df0c00036de72b9d4b724807fca9c961abcdcd8d81359dc334b1168380105f63295e5dda8ba6f84b89a2ebdd98cb8185b510fa37b1ebeb507ba37997c73a1d60e92fa85fdf5c19f728ab9eb908c74c45a5d9373b41c697cb314caedd8bf16138d450260f3e44833d3d90497f9c551bb2424bd50b0b65a34079763cb6d4b648db1a38b01e0f3035beb19e912dab4a046a73d4705f524163974b6fda8ecbdf3738b687a3ed1d82d12b1b41ff39671f694915e11637c07e911743e6dc5607e250543086c86b1ea712fc0ceb1d0cca11c770c6f834971c7df67378e4d40c525e7118e0ab3e17d94ce3f2f503ca4cb23", + "r": "4b6de35166c2864e8e20df1b62cea43855a7379ad9b0f67a684e31bb", + "s": "1151103fd1206cfa22d7a54277f96f08fbd5031c5ac371777b64e779" + }, + { + "tcId": 8, + "message": "a60316ea6cf8bb6ced303e7b40db79f463fde59b6514ec91c7124799b4b981bc11a6ea6a05ae0f6dd140527e4509863f578aae7867b1ac906e1b997b658cac3faf8385c61bd17e11754d4c12a55bad608ead2561f93040966d053b83c085bb1d52f8d9f26a14ed7deba7a8a8471996aa9f590121a9fe378876efdb084e6ab91e", + "seed": "13c00eb847c4ed670e6854dbadf097a5c272ccd860153b26ca2928c141f58562e94da066e3b64cb7c55ac026998b5efaa60b0ee2062f9e92ab92c7772c3d20a0bf3f6249195d84258c60c4b027319a2fbfbf0e44095a707f7605fdb274c2bfb68f43e9a442bd1e903cc896a470fcb19a9686605d2dbe650cac13669496c8687d1bc9d4a31703e1a74b566619a148525c4d61d00321005162583f9ab4279424bf74cd291d78250bc49fadffb95d87780dd8d22b86be6cedebf5cc86909e56a9cd6afb3c004cdd41ce8e6d0c1d1b5ebede7867dd5161996395139b47803213c77c7be1fae942a7035596ae5f67bcf0a0e3ac0a7ae15e991283c727e163d4869b213ec53048dfd04b56f3100e59fb0f2f7026a6fc512e23fe72cbe4eece4defd156a5f2943a64308c5d798141bc3cd02d9f22854a07fc7fec310106c33dbaf52fba43049662f6f0ffccbb70c9ebd01a94143f25e04991d8a1039b5ea1fcf264912a934db09cf6138c7a133d4806c0dfee2b4e1bd134806791bf8fae2c249f34b099dfe35405bffbeaa5e10666669c67c614bb4eaf45afbdabcb3a2be55aa6527f6c082b57b47cba5ec8adca28055cbaa2b1c6fca01986c58745d5e0151dba40acdbfc63f99e29efe20ae56631c9c75020ee3264c183f246c0fcf20c4eb6076d173d6db4a19ece04891be134988ba399a7c76277e85563aa0db6c179a93f32f0793a9971779d38db24a7b1c15ca96acf4a3737beb603b8a38abc7a5467b03ed316bcc98c2f9c079ff069193cda4d8ee46788545622267e808779df5aab0b1c85c491d62f4ebb17c99c16d868ad9530dc311fa04f283622a2b34c9cc78e6977d85db59174ce5217a69de2bdabea6d4aaca710c80e52ae30beba7a4d422c81dc74be14e1d9646c28d2049f2e6a858b7262f00e0de129a032a73c1a323262efaf62d18cb31f5a99b2e1c63fe9bb7a70466964564b75d35eeab2a493beb3d4709208b8070fa82dac0d685e8f74d835000b95229dde335773c90bf0401d91660d868e94bb0aca83db436873a41e120991eb7536981ff0c14c55acecd1dc03bf0b75c1ec4d8c30ebe38f493122e68459e690f003aaa588fcfc11747216f7f22671e7dbd0ab9043cbe9e28502bf8e31f2130daa11013f3dd876863700393342b1324b9c9257fb998ce138ea4fd488d662e550beeaf85b03168c578b51169c684908fc64cabe1c0f53dadf9e14c4aefb09638704034d84a657c14f2abe63920b6a85dbfd0c8f334b1e45b8a39e974705bea8b531d875b9d07da4564443cdb9beabcc8b4fc6f82511483b7780c2b211870427b97895e7b68b9f5533556076443e5b91eff2f0f4df53d646e3e7ff7d485f8d5d5a597f61d1701bad08bd09dad02b15bb7098d6917db738f7050bbb2f480aef860b487dfb62f7d6e78b51e177f4225724da7dba27", + "r": "6f534e1a0a467113121f61ce728e07921d9361972bfde2c12adfb1c3", + "s": "d446520f9faef9ff6d1f2deb5aaa1be2c87cc8c4ec317aaae38f561d" + }, + { + "tcId": 9, + "message": "fe5b5920862ceeca2ae1b2e6678fec79af131dc2fe4eeffb0fc6f7c509bb6f66699baf4de86963b3ab75711ebc72f7ffa3945310c6e1c5ada94289eae09a3f9bff6f595e8e8f0d0223e4a4c4fc983e98b1d85f49566fd5c2f93dddf66b86974f396db6fa0ba8d702deaa7f9ca4bfeb8638f47177e97909b66965066591ebaca3", + "seed": "e5cd614de65bd5189cddd64a9033ad6051f72df238483b80b0269b1e6cdeb12ee6c45ef733153a1e48f0538f64e37ebb0c881457cd1443d5dd5e3b94ab319e0f15a598da5f8b28d99963b9f172663ef206a0c8bbcf697fc43f580536e76b770df6c7762c07600b7731baca88e30f3cd3174704de3e4a4fb30e4c6613a3c2738975b87204ebe10c63bce77e30e42d869d4dda56721b8485a533ef655e7fe2dad779e229ef245ff3c0e141627f653e065af2dead2d6b776b7a4018040925fc1af336b18cb3e8026dfc5a1963af684c2f9cab8ef61d77e91bdc5befee3c67fa3c8afd16f5f3fe811f1594a928829e90151138ece530fc01ed3bbf6d3c1f36ccbe2905f7a3032f8bd6b01132003b184ec465a80f0abb630d9ff337b676561eee05f7d465d789b70d3cc3b492c9563d5688e3e6a1c20fde32cd54c21be68e0ba4e375fa9a2b821adfe6f52ced23a1ca760b042d1e607bed3601b2586a6b43e12ca2cbc48c28083f5090959ba01a4feeb4b056a35b2a57185d8e640883016add7649358e393ae4d5a174c26f911fa14df60b19e1a965461f01d71e72bdf34f5ca923806e3d8a4a6b53615b49fa0e3d9a73efc81d42fdaa32660f35182116f2d1343127a2bd9fa3ac9871e00cf62e3cadd9670de76d1735eb9127c89fb6fc77186db78a258b4138aff2425d7191cbbedfd5b3077e9921c499cf622f1a624423e3fc6282e9b8a48f7e7c9e576bca9f0e53e41ed8abd6293be7136db9c5f91eb6c25b61b877daa4025273a1a70f4ca97eaa60b02f4b9c4e83782400e283c01aeb8b49e0d04435fc42435e66ffaef6578fbe3a2dd9cc0b05f02ad6811660082a16d014f4a01572b899473fecabb0ea1f90db14187c9f63096adc74e3e6b537a08d2b3ab94abd9338ddc8e163f256c1610942765b18077d1cbf4cceee531e9505fd5f3fff3ff7f56ca044096ec1cb22b48feb7b8c810317a3d312f0b3ea514754c25c175e1d73efcd8a7577cdfe75dd16dd0e26c6702e4d94f3cfc5cf2dccebe15cf297ee1af140acfc4e44642c77648cbb5ddb407392a4a35f113eb10682b4f101c7744f5adbb8b86324e2be6499b135cb87f9b3ec263bd233c0e9c3d53c5a1f8762655b3c3f0397566f0196d982a51bc760db29edafe6f1cd7af04e3ea42968a8fe0e30b8110b38911d6e0ee78572e1619543fd2d6d94512e274b25dd331954f6501765e321d88c6a143f3db48dc6e3dc9fc3769f3d07206cb64076b3754afbf3eeb22aa296b3a7694c58f8836554e4ad2733e968109733a4753b1983609dd9f439fa5b131d5383e945b0fe24c2c487565b814147fe47f7237d664e9e8971faa4d4d6b8f935a0101ff45105d65c1b7a4f1b2743af8396fea14317958728c5a17857b040e600e898b8dd354a3eb22bb178259d88ddcd16ce2d293dac1507d60412991bd72b", + "r": "508df1252acb43b834caa5d5c397d3d88be600b80d39a8a05bdc29fd", + "s": "354711715069b96d214a4c3018ca5c9495e4055b526d79e9b5406e5c" + }, + { + "tcId": 10, + "message": "df53edaeca591c42cdd453d796d4fb97b87272c081e7862b7974f87cf4a4f5b9d2c60b8273c02f11cf0424f49dae14e9817b6cb3ba6e40ead5616ef96aeb46f2c9f086abbd7d1324252c2fc2d25c8ce86d63683b96beaa5871c80086e5553efec6f6512996824ceab6037264c7b2b2d5e8544fa8ea0de91a1a1d2d0967ca2898", + "seed": "115401903f26dbefcbfff4b54dc14746e729a22fcabed7f09f86fbcf7b28e0089f7e67dfad3b6895e3f1579c5e803a57896991c2cd6f9a2122debb016eff47365d0941653d9a839674c27a022585b182346940fe0490cbd8ef1c6abe91382c04df7d0bf0781795f826ec49349ad4fef511a5525c0c8a32fc1da848c886b94912c10a673a21794213e6d0c7ad9e936e418c7ce57964362252aca2fbeb6235b11dbc7751808f890325eca880f690350e4fddb9f3e6ce0fa4b230510fccf31019fdfd6d583a73ee54e292c2f8666ba7407ed5e40705a8043d7738a884719cac9691bb28e2cd1420c6ebc3a657790d8420e1eea034f6996f7f34e35dbf11fa3f18ad2c61c573157fdb5347b260811d0ea2f38f26aa5d3a432951c0e107f57f51bd55e8a499e31d399a1ef34ef081d1e2aa811142fbaa7b19affbc3460d4db81024e0fcb58a02bc390a68859839e6f8ef04f6f50a9ccded1440ada584dbb02a3eee2dc3851d78a20a57511d37c8652440976747ed55d2441f07be42ffe7ebb3681e25b5bb50219168b6ddf33ab3b7d27c6111235161d03a868f40c31a8c41e40e8eb183ec45e63b8ad9f97cbd6c83e61cae682b08d9e9e834ad4e0e9da01d7872580a729b124862f1f3f5ef400d61a5f09f4cd92c884298fab21de145fcb66918c36fc2e086b649315b0f26456f0ef63235512f8eca3383ffcabf5e510a94a9d6ed6b7344b847dc5a8344d7da2352e1242c2dbc783c9d927021dcea7b66f6ae6b43db339636dc9bb0812f9719a3005ff98418d90c666bb018b578d7d77d779f6a16bbf4bf6c03dca71c459a41b7bbcc466892b87c2be37e2a935771a399d53aab3c390df668ea5b721521a5c08c78c98325553eb55559b08e0c8d0a263c2c351817d09ac70f196c4748d8b01c23643f1f249bd7c796506929a17213007d8f1316484ebf89b870c33281bc108b96f88b36a8350c31442fc8e4b6764f0e2333317de90fbc347b9c619e6911d0f6c14c8d1304cd929272f1396257c01dbd711ecf7b26140c1ac4e35274f5dd1679c7dc80e4b2cae8a207f6ec63570ea4022fef5a1e4605f563e4db6b2746bdc5c250dc28ae3fc80852e1fbf58b60b0fa8bdc849eeafd483f0cf6b7018848c424db4ba3b9fabec96dfa18a1c683266b5f0716127025c3b7f241f7bbefa2dd42de90a09dd3960e8f7933e87da0b44f2e132e6cfb44c5d5f20d841ee3f8a92e12948500b14be216086bcdb14c1411468f69a3c782def214504b4e975e7bc5c42f15db3d316cc022ad75a0f9866d5694dcd1c96dc5f70a45a85c5a49bfef641a40ca56d480358b7267f71ecd41cc70fc195d009da584b9bbe4237eb368d084abdcc6b518d7a34706e9a16ea2bd1466d7cf6db2e5a51287cd8afaee7c1cd167abdede0e63a4c2bc529d142b1013af1cdc3a20bdfe2e0a6bc8ee", + "r": "e1d87d8ff8726de15d2c985ff4065670955855a64c4d460faa172f01", + "s": "31914be56c57959e91e4cc478d6a839f0ef3fa8a5fa895d809cd0280" + } + ] + }, + { + "tgId": 2, + "hashAlg": "SHA256", + "curve": "P-224", + "d": "d86dbbc56106088c83f354315544f95c782723abf209c6cf46b977b6", + "qx": "74c8dce33dd5b36c02a385a618e5366b52d32adee85e99780eee3bf9", + "qy": "12c2640854bde3c75ec87983ed87e42f878dddfcb294d3cfe73bef22", + "tests": [ + { + "tcId": 11, + "message": "b55d3d5ea152dc98c6781b61a0c684eb949ed30f1fdc2598fb187db2580d5a56c674459d1adf091b112b8320d36609524df3e12d730d98fafb583daa6dedc34999efc7a919d2df75cb471db7d720f039c3eba01c57f3458e1e5e6ffa55d5622ee35b41c49fcc3ded0f3821b99cb6596b52927fcf1ba6a5dab3677657bfefadec", + "seed": "12657afb3b8003b3cb99dab14b435eee7f1e3b3255aafe193a00976d8acc7d4aa51451485622fd3e370bfe71411eb07576210dd97f27a7b64e6d2ca2dbf68dc95a591fc0d6a68560388486352a187b12e721733013787df3a9fb422b50ff5ee51132b7d66edf5d821b370d81546e6d76fcdcf78241a7835a525ca5d40e62754a473bc539ef3df4412c67eb9ed68b7f6aa76218dd5ce87a6635cf07e8ba47c5e20da4a4ec29beb92cc754c9d833d97af4aeaabe00b49d32be36e7cee04a67b5331df9fef9141870e04546e83be79bbb5e51e9d4de9e1080e415833649c0d3f083f7bebc098563a1c99fecf2114eb298934da533743e1c4f0701a921ab10fe45bea32f566774e6542cf86c7ba90dfc8d2a11071109707ef06679ec4e3c3746cc8253c23c9240ec38740dd14090a267c1fe2813547abba2c0ffb6865b714fa7380b40585d223400ad74693f489d5ba6059b19448c5d3008623d382e818bb55b5e98ff4c2b080297b63410118774dda6ad03253f87e5ee3ebb52336bcde6ef52f115aa994e0b6aa71bd698829e5de97ec800b9a9748a2a1368f7c5d7e8d0ccaf172bd8f17d0b906c9d5ce1190bef2b98a3cd5e9019c95a407d22739120d080f3f044ccd8d25304ad95588281d58d4a303350ed118136ad9ea6e4c3ea9fb7a0408eb4e1a0961c98532d8015f75609f30422d910fc0469ad586be2158bc1c4f2dec393630e4c4e88f71dd112c44080826973083297879486a991ba9c3ad687d883d4fcec0ea687bcc837388a4d08ba6754e47db0206f85e465555e9f9a6f78e56425ab782c16e568c5e1a7b474df5950ac235626c86e153c551fcbec435e5d8661256aaf6794ba9c04086d6d189e7d3a7203e30d31bc977efa451e1041fa8362d6717f02af6f0d1bbbb13eafe7406da9422ff404f9fa41a79ca2054f3706fa131722497cc9e44669954b65421292ca7662e77f935d425f696e340b55279e0511997bc7cd1d7e96c6a7a7a2642f364b7e7c57068552c1d86c57f120aebd319f3a6a9cf439812ab967a6ed4cd12185041a6042870512f830b6d5d12fcc25c350840164e80ac7d2a969b784b1a07b01376620ce0d39a6e101eb859a23f4f28df26ac81fa10a4a4e9ef60ea79d241fac1659e3332cefc3d725ab365784efd6c2379a0c1afbc79b1778531f494ae0fa4913a463440fb0377a3db93a12bccbaee55d0b53dd17b6d15fd7363372305aea7c4b0d4a3b8b614066b1a3e6843d29613190d2e4fa7e6c84dacf04fe7d15b9cf9664b1273b41efaef69083c29922fc71b9d8122c67a718d1c2b4a9e5e6be1e84c60dcca7f8c83519a942a5eaf901de96f3996c0ab99d65e056486792eaeebc2f811eeecc7d8c67930811d9b7d34ad355e9e68277f08d72d9e985b2fdb36c7c5cb33ed9d06ce3fa2814bf5766ab6131cdfaa4683721dd", + "r": "0cf5895e35754744c3cde2a44009a45d96ff1e654bca3f5dc3269591", + "s": "7a27a6ea78ddcb74d8d14cee1687b2e1c1f068d625e7f03319911700" + }, + { + "tcId": 12, + "message": "41f341c81534a644660618fe9e661bdbb2230d7986a4b95bc8ef7b74e27a241b8b51c412e49e37b58731f7cead98946e133113504815c9050625674cea2e755dd4c69732d42e0dc573558e50a9bf812f3b65a358d8f9e122839940f164aa0b1682a08e2ec8d0d3b68aeb492a384d9e4717ccf6f545f8fe63f55f02a8e597b1bc", + "seed": "117147ab83ce5977c09cd9e9905ce1df7a098adcd33a349dd915aba643e59bd2d041d82de1deac5136cb10b9d035acd03db7c5477f389f1594736a670d49660770374055d8984d567dc949b760a5cbeab58dc3f48e95b8097f8c685030eb4c537ada588b1ffad77d93802282c813874f223d58db9cfb95b8b6abcb2a302636ff4385d9e33fc95a19d78ae0efe9ed65fa172cefbd4fa5c04332041546b4c2c1e3ce5c066f496040504b78b9b47b569fcb6ad59222f92e9a844006a6d829e083452786a3775f74f7f57755d20ee929fdad51ae5eb7f9bd0bf1f7f62b842a1845869ce7488d777fd9a40751cf584ff4bd50481788f13f8dd27685bf843c248f7a5d2a721ed0a76fd78918251d52bfe09e48e9584ada3bd934f6ac7dda58aad4746b0818bb0bf2982cc99c153278bda336350b76de1a106d5024316baed50ed71f853a7239c69709249f35d8ebcc88a0954516d0fd7cd8be452c15627f7db808c392158559c644d6ee3a43412c81131d49b5508183b8089f637f9c26955398f1986fa9e80250a94f2a2967cdca71b43ecd25ab54cb5a7da0927ba6d44f29fd33ba58376499b97642261c155ed82cc484315aca1d8923bf39da77a64e003aeb116e74b633b0bf24a6eb4cc580c27b9e16ced987e68ebcf01249afa269471f9b21691f2cadeaaa814b801da504280250621e0029522e4644ad06a76a6888f5b65376cc3292f26cdd0fbdcfa46eac437662ee5676fe73e20f5501422e80514425716710ee70bcd1d77ff6f305a1462261c175e906c918558c5f178dce46b102083de080db417d1433d0277d5a58be807e333daa3293f41bca49a1b4abbdf8938e93d7c6b0d3cb560e26fbd35b455363ae0232970ec3a73835109037e61c8b0ae4968d72dc7b54f98503c388f46ee43e30f5f430d66b620eb80de79f1245da60dc81d715d81f9911dbd2aec21644c97ec78b4409def264fa37df65871bba7a2d1f603fd20f60c21c8170890d0d413d0cb1f2b04e7a3cf80dae58d93462e6c4b99bfa053dd2f63a80ef14e634d3805e7b4d46a02c09bd54e1285ec4b89a4e58fdc8b4e752ae0fb0f1611e0134317c2d7235132d42bf4f087089d3790706f65ae8d53cb037cd51a5c782d771b0d73cff78cf375099fc96e82382ab1e7494a5f14104512a82322f88243feaf842f83669beb0a97554e07f6b4ed57f465a219f0d3144ab91d028c4cdedd8adf26f3a249278c328575e81337f48412c8e99e62481603d6f3c08c0f80e33629b59a8a78fa43904578bbcfec1b32a0aa83cbeef7461cce03425d104d3c01495490626fcca8cc9f66d8f608114a219a3f8a861d0a414215ad8bef1eba6ae85a652bef31a20fd2f619305f71cfa5dddcb7fbefcc012c29b0ddec61e180141e583814d0c47eb0589e77a970968d07434b75b4e9b42d572561beb5c6a", + "r": "7e19236f1c9439c7b6cea841910e9deb4b82339f428f8fdd32e3d3c6", + "s": "a45b500d6e409ca7f0b0a70b50ff525f7ce9bcef26f909eedccc4420" + }, + { + "tcId": 13, + "message": "95949ae8f380921e91394fbdda4b6fe772eafdfcdffac12a0caf3913450ecee4ee8887594c001d36032b0f8a7f2b6d9f655228f327d9e51dede6e910b69549a1c3cee848ead5399bde25d5c417af10f5c0f0a98faf91b3d6d0722e869cfb5bd8f0273990212e8f0fe2d885dbafb58f1c6c850c126e39c8fd5f0a7679e41b7363", + "seed": "3b59967a3ba65c7819ea2b6cd6f06b3602090e94e16b30a1e2c4c75f8f002e6c155f9e9b669e7d958b0cbe983c9702ad20e190cd4303f1a56c8da8546838ac40cfa3791a6655ec45d1324b61fceb9924e9fdcb4f66599eb629c678fb2b0aafa8399bd73c87148575585e5f54e8cfdf61f0f7145284d5425fe9815ae670bf2d0130b9187557ae92e4f59c0dfd26d6a6e649e260f5e39db1539a27879b0c1a616fc316dc7132e53d9ad3018d22143fdbcd048bc7bb49388bf38b600e18aec9ca1e365b7a9049b499b6651e3b80b715035f548a0e9466f2e1c1671a8cabc18be17f9628bd775e7967e1d70505a3c2978d7550e2296744f3b2923fdbad77a65791f5a30bba25417396b18861a4fbc14f88f47576f423197deba0417fccab9cf8545217ebcbd7129d7e28388d5d954938a71a1693abca693c2df7447a9c6ff0186276ece6f23d5994d47edde953da810c59204a4f5feb0a04935f37e8b2db80237f074cc333f97fe3f59da0eb6beffab147437331ae92be25818289f84351f696cf564a03a08cc662d88322f6e622241a327bc495acd88a3fa7f5305b3a5796e604537fbc1a08ed61b9f0439c4b86c92caa5b2e8ea73a1dc095c4f3615a23b85999fa1e8768f7e91467e8ca386a631c47d92409214d5f1ba3e1a2164c42bb3ef53f1a2f16fa2a84e48540b09c102ce604c7d319ba9fc9ffcf752d63177f0bf2c23d34bd6f471c84e42cb6ab6b5590b52d6fa82b25da735e7c1e4132f548f125a672a40a1da7d5accd9040269b9f9584d745b7d36caac589159afbb6a3b70595623a3704a8ecf422e7bdc2cf27b58044af1f4f4aa22d227f76b520b68bb52418a359ab96ce45600c7aa5188b8807e9e3f8913de63d539a1ce90bc5d552fa7684772223607540110f56f17116d2f9c5a7aa2cdbe354611ba2c1c5b62b5d45b5ab4a02e75058ac3a56020fb3de0a99d7a45acf435fc9b83f3b11445e92c695aff319b34c5ddb98235a1a5d908ccca779f510db28694f855ab358c8b31be66aa0f2817930694ac08736f5244bf78227389aa8d6cadbbe7b5d8e2bc494658770b00f3f6960593f77a86727500e43b276064d725cb838a8c0a0321ec791ea0f1b88233c00706c2b9c13cfc1acb8ac3c573fd340e4298ad21cda8b836a9aa34bf869bdedf14a27a1f4f5579291695e51080fb928226d747fa2559f86cc0076abae4dc6346811c4fc73ee210c8cbabef723c99e35a413c3ea6b8b2b092a10e4b2bedac223cbb823dfd7e0df19ab3e949a32c146d56d6a7401eadb4c16985a270e58bb83b283a45d4631b552ccd930f2db515f135411d11a5dfab56d19c677610f9ed2ce89fd950aa852e86dc1f3b3c119a4886717ece37dfe2d59484f74dd6b92baabb3a954b09c8feaeb0a713f9c9a564ef6e799d7cdd0cc01e1f8c2940319d646a9b4d88aa4", + "r": "1fec59f93945dd8b7d5d19d9b3aedae7b565a63f0bc0f892cb06bc55", + "s": "4e70cc489f4f685ece416adcc0ae56825944d6f9697145af99d9273a" + }, + { + "tcId": 14, + "message": "2b96115d28a9404a0a82a9adf886d8a30e737df056e48558701852d8ae2a7548e3ce3d688e7925f75c5fbc3b9b5aa98f5247d836f9ef2969fea0d64ea09da9c6bd4408a1152aeae7aa76df7f4d84f84766f27658f1328ceb7053937960cf6d3cdf0abf93a21082c8a0c96985da99bd9219371d0ed989d07dd7aab298f38ab013", + "seed": "b18e0ccea26237f8a1fd7d946542639eddc097365721cf26dbff7a1b755d74ae1a83abc75a36433edb2c2829ec1bc0c563a10306b285df8746c58a7e115010ae90888214b3a401ce57252e3d1d98cf14cac994452303a366ec564879f616f48145848fa7c15a3265cef69ea471957182e0bebfd96a4afbe2599afc43e7c59ab7fc3e27583fd9f2897e8c6d4b61c2d4789de6e22ed4a7129ff9975b7f5057e94af2ed46669291bdff046f3679de360d1ff785456921efc5f2aad6125d5b8c5407f5cc1a8e57301be09dbad99a7dd9cd5e6ec7bd5c64b98170b0f6e8aa99604827d8065bb94de3f2a3cb5d4c2a146aecc7d126cc640f03746f43deb9887a8288900cc0dc5d255889dde9c68ea619611f38f88c1236670e2c023eba350cdbe0d803a2c18f0ea204aa17765b91c299c4b632005fab51bf2df31604e6869c1879090ccdaf04d2aa5854656c39fc9b9b40be92f167a2c572d5232d4460f79cf00fca2b1a5a55f561b0238e080701eb7cddb547c05da9ccf58c2cecda8a2cb0ef31a23ed0ff3c8b87d27107083e6dcd0eeccab548af92d8c469160dc61bbb648cc53d063cbb3a4da04d87ade2493d2253364add2462ca3a772fc474464161f26d81971058f7890b857efe22f08e5146b1dcb1bf218242ac659046545a84e4d4cd13880e34b4a69e9bc737caf7dede5694efe7d56ec23b952bfcb30a0b2ae1d84db8ae231029550f047dcb712f025ac01a0d78a9830cb347d4d6680bd7cc725d95086fcad6d2a30cc1ededdf38db32dc7e314e5fceb2e7b4bc3eae03fe58ee7eced49b59a3d769be7da24ad14b7d33fcc27a6f68fbdfbebe8ca9daf27f48ae51b648d0ad5634acca7b52cc37e5ca00e90641cb6a80035f1cf0bc7f8fe2177a96599ef567a13effc25995cfa3eecc93e84f9a7e9e8e882149d5bf70a6c728fe67443c744588bd34ef02cc365c107faf73855429c8db57de8eb6bc3121b293b9f513c90a76738b98b8770d57f0f1f4af7bcc5fc01cb83af92ab49ed01fe5c16dfa146a89346be24511065d7fd96ac103e60cdc46dbf1f3b880c31b0c59d8fa7735d1ea5d4b77f30d2d18b39a7647c9859e19d87b8e11d335257318357ea25ff278874ca42c7c965eee49c5f19a5f4f871318d059f004a5cb10d3e93dea6d521d39c0d73e8a54d91ddaafd7d0e5699124965b3961d829a28496b15b10c7a0249b34291665df37337bb9b3565a2f2f57961a6b2ba11409cf5e92cd96656cb6e90b5b2d5ede29b5b38abfee83a9d7fee954ac3c7005c3290cb3f5e76278098b7147fad064dc6df6a0fc8996647ef733fa867418b1892aaf41be00822e8f3610ca77d2714690540b9050f8845ee402e20758dffcf0eb91c9fb41e656895b262b3d7e0e2882665cd93670f84245c08b15ce4c48e632cd62dcc84f16e7aec437eaa611f97071b486", + "r": "bf70c3d8c6fa85f8ab1f967879e06e19ce4ca1dbf59a730c7fd698b6", + "s": "010ebebd2937b83dcff8d3749532e285566c93c7df77eef7fac8c74a" + }, + { + "tcId": 15, + "message": "fcb9190b16117f840150e1c1af649622ec870311e36af6f815d6a421948418818b18ea70bca9191c490178cf81e5537ccb471c0c0c3c2ce72ad5b4302dc8857a2062a703e1616a09930f4e0f5120cdc906d2ea1afe38e4331ccbd226b2ad2c9810caf04eaf5a4eb5611a45f06f48b3fdfb66dd5960954410b1565d2f17cb23d9", + "seed": "8fdbd0de5e6b3d12a084861daea0ec3beeae1366f06655a699e3976f6599ec7c5754fd8e9bbba3bd342b5af44834c9f22117812b21ed5e97a68bb351d8a54c9b55a9e5e167bf16d21841d72128cadd87b3e3d52525b65f50dbf2da6af7ca4964f8db2af7690b54d998bcbff25568372780a9107806ecc07438a9db1813ad6d2bcbcd39ea3129e6d921006de6ae10af472cec211963c952936c1261ed0a3589b46958774bf24957fe848930ca1e637074966dfae9c6ac82d2f80da289c87aeac9d6a3e79a7ebaec15eabea1c3a4e30831bacbd6002fa2d209b30b2decc21527341f5088d6afc470acfad5428c5b8484215c014018af43b409ceb9a83340003b164ca669288b38a341ba76b98900fef13610d35c0c7f4fd9471cc7dc9d9ea6d660754455e578d973472b400d543d1d806a189bd76b6d0c1ab8fd18202d14fc313da5073c88179735b45d1cfd1491239fd9b7003586c27f7b13a16eb6dd79def7fb228e8ef2d05d11b61cb4fc3903793dae08de91a99b41fda8e3a812b22cf270395eb1f998d5d5bca8539e559458e79d57f668f8d2f1f207db9ca64d24d7334c31b216d41b1c7a6a6b73c6e9409a016a564e7904f31725e47400cf468b45f174a036174c2fdbbb6e4372d9b1407466a05fe686dac24f454caba2cd62404dc73265a66201d7e69ea8610a2677705b8f8a0802b2e8fb698e7a8eb7390f0356efa2c650cb424f880ac266c9b2686d092a81543086fb989798b0829bf492843f2b49ac927fa66d78a956d3770da0539f81667d6b8c1cede802abfc1542ca545e2c52a449d91c3d30506dd3da4de8ec129c91479b2f1fbde0dca32be243f1bbb73f04c09eebeb2fa86d73b87c9085413d451079c263b8caf489188f6b99e2dabe92fabdc4518b622a1f7ef9ab0591f3849b9c7819584f62e896163a0717a0deebf9d987e95cf60ea12222f18e9c89850afd857e8c0d0f139fbb66e13a2b50847706221a7b2bd1e5c23353d18498abef89604c01fabd54e3a3f458f431fb094550cd8223013038dcc5bf01a05df5a036eeaee6b510465c2c2d9558c92a31a8cf2914e5d3b622d5ac4ab08958e30755297fb45c7def838d1d421758e11d3e250250ae2e56dc5ddca8a1f6c9951eb0b65355646c7e524c3392b4e8010601aeb983dc49dd20672b0653c7756cae97bc8443ce9174729440158b0735d9ea67c9a10c6e8c952214fcc92db95ed07f2abd493f86d876a68f2ebc6190a3d6f5b384ecb630682a94c2cab00026033177fac0873ab73119dce8b3bda350aa4bfc0a985e3f101bf83c389733c028991c571b5f56c6781fae56f25e01c2f7674c74f0b9336c7075eb5fec085d39a8813176412336a178c912a22a521758c3b2c10ee92ea0a0d9c51a9e8a32f10047d23e6c57369bc98ca0c71fe83669165bd0bd39a5cf5f4e5ae5e50b", + "r": "dce59cb815f759b03746d4e8d42f2b9285f33e10e250c2069e3c6f2b", + "s": "933e4897e1a659169d3baaf9e6b6948b210cf16245d28f8ff9e25253" + }, + { + "tcId": 16, + "message": "2c3c48c19a8a6bb136f0f98aaa80dc7fcd54f74086c177e39fcd78f0f04183df31f61779fd82cc81986b363d1fa3ff6fe6597eadc80a5543b64544670c041d6c2e182daaefc3d84c01bf4bdc052d29e33484f40eaeb1f85fa0063cd6cece41e4483b6b488734f3db672c5fc069f64af31b12354de865a89961b4dfe39e407961", + "seed": "6843b775135b97ca67a0991e505f22c7d8bcbd16ed289f0b3f4715b288f4bd13e1c559fbefe9b0b7fa504ad03b6f3fbd9905d1d48c5ca1a38127da1a9b412bb3b0b2a59abff4cc5f8e641d8f3b7c1d0ac8ecbd98bb74b5d61dd59e44a318489e1e670562093b936477eab945d78978fd1c09f6f3dc2f235cfa07b7d83ee5ab9feafa13d9d943fc951f02ffc0d2c57409ba21dd59265dfb8eb083eaab69a1e3d727139c859407a9fa54e7ddeb49e29545f7cb9459557896970f66e387da0550a4eacbb512c23698ff22bd6bfb084b3627966acdae75bcbc5e1699f5e89c31b915ae821ef96c4c04da1f6f083dea908b5f6995f631747eeefcfe5c23335f3538138530731f2a4d689a383b196e513e51a3be575b0f31a3a9b50e23b2b1c90dad5930cc3b07fd83ec26e9f48a5436d7b8abf84ed93c98296335ffa53ab85e10fc54639a47cc52f34e52dccd5b6fa95b444eef4f6c68cee2a4dbfb3470e5cd09199aa1e7c971ac6721046a7b9d240b154c207047e1963f95e584a5a319d4a4aea48fa03c8022fe5a57d3396567dc9719a86e339b0376a17ae798b5c6957640bc21fc9dcb7b7c233f9fac7af422d2aac305dfc97b6125c36874604cd8b79c87aff5394ccf0dac4aa94ab00a5d173956bb2ce79656e8c40abc4a5323241d36e70b0854bdeb6b4797e6b6f8d2c97f7b9fb3a6145a32c64ae6b2268fc083eaaf6bd982791288196667bfa79462a53953d499d7bb5d292becd2523e337726c0b2e62e7297b9fcd2dff5c122caa03730c9acc195c701b62c7c9a6bd037e51c327b2f8035663ebd4d61dc8690a738b28a334d46dce04b75c365842409430428f40d0574f536831777aefdc5d164cefc9344e0766556ab1c1d3a09db50e194bc12305a5348f77caa1a4ce974083362be94ab908b5e2135f9c1259a61737f31e7380e34d7e364697d72067c2e7f2ddc88cd6991142ac9f82a072fdc17d7c7651558efc5415c3fe12ba4c3ed326b4e003b54561a53ef62300aee4fd4e1f1f9fcc6e2a06ec6965842bceba08dc248a91fd1d8206e510a9ce62cc9e1b897de8f880be2c36fc2b4d5334e39b9e6df063d01316744ab5de64608a2ff789f0adbab81052143810ba9e4f548be5c7891d2dde0658f365554e43546ed6547ff50fa53dc7dd7e55dc52051993799a15b30b039fd66b02e6629501f15b558e4f46675005db2cda004765702feb33a2b3994fb35681497c9fea190bee6e7ba5cc65f2dacc9849679ab6c8d62b40b7684150ef9a33d214a50f8b7828127f2c4a60d7799115b2344ddff171f2a8c1a656bba6423a0485070d7c5f118fb9d24e206ab3a11232ffe7c50839c06d4598cd6f07750ff4ce4d899dfe4a3cf0b1f02dd43778508d48357591f6400b906fcb514fb62606779f2852fd033258ad05c3fe09ecbea0f260b27f3b3e6a956c6", + "r": "edba5194340d67be66d9051e037e1f6409faf0c00e3b73acf842ae2e", + "s": "5fe3807d3a076dcef93a974d1065e88871ac65b002e150df69a8bc97" + }, + { + "tcId": 17, + "message": "681e888573cb3319f46804d5b8765d01084b7e5db2e1e502aa49bac9d64d910a172ab3bade2effc44ac00533bc99b7643e46c2d65ab8b71cd967b3738f7ed9f99bc06e70db9b47cb21d9156afdbe695ebc4a47b0472dcb869a8f5626f9219d602a02f125f774ae85f60a03263f52ab2f8dad952dde03fc8de666e48a213ed625", + "seed": "79e45b0a684db31894056385f1d8d630c6dc2cb53545860abddaea638483944ae4cc453da3f7c4a2be3d001f3c7dec513c756f25456f2bf6eac64bd19acc0ab5d45dd2b607228362f1298b9ccf52027f9009eddc38288058167c4ccdc1af89c46db453bcc94db9a37bc7308b0ccec29efe84547604b28e43bfa42a6ae695fcf857cc0c9d062cd70917b5a77084e9469c82bb7bdcb70242d2b579258cbbca7b4278f36500037b4cef7dcd18c19193fbf537ff8ae42467bdb2f053bcf65dd127f53a6bc1357ab996d1f8a0e84b7f1ee57c9efcd8d7f13553382361d62de6ed4ce005aa8fa4640d3e5403ceb2c6ceeda201687630320940789ca166576d53fffcf247b09ade9522cefbe26c1a0f059d3ca14d46db0e5e1c26d09ab6bea20043ecba00057ed7e9133b9169423c84137b978a4740f8416f979e581f9edde18ab9ab14cdfa048b86bdcba270b6a48b88ffe43c4d7a23f43d4a3f00b7bc5bd058ce330933d2cba479da98b1a13081a12cca9dd4f392726dc1eb55687256954c63d42c2338bcf4f24cb87183100f7682607edaeb054dded78c8411715ef39aea59b906e04fc4a2f722f44b35bd5461a0659043d8cfb07b779733544dc85dda24182ee3a7d56a7ca6b63ad0ceaece598bff5f8c14ccfb837ffd2d8091d088a4479d2583f02d1e3c05940202ed859114cdead5bc1bd9e226127ce2926c4d041ec5abaeffc07ee7ef022c43bba89f8ccb626c983e86cba94fa5769f2ad054a3ba678ec0481425501163979f41399f8ca780861c61a186d4f072a85b13cc72670396ff1d7338e07def5cf5931917faf12db8d241e37db6271a3bb53efd78e69bc8ed28733820f6fd14140b7e2b7a846f72b5f9e13fd1e2df397925286b46a875d8738ff412f5da28e64487927135cb962113177f0f1c05cbc51f175fce8b0a9197710bd2f3c3091d08b13c25e96d7351df0fa3925b1d48e8e451dfa1c6ae1690590b43c0605d037092510c1ae8ac74ead4d02bce934a2da59ad0daf224914396580418da79fe780fe03fa9e19ec5f95dc1a48868803ddb060ddd4b66c06f58ce31bcbeb8906991d0ed8fb45638f853e216840cb914fc93fe51cb5cbe56eed22755c5b85f594ca68f8ce6bad75990ac70f6969db387f8be59851df36482291d7e8364d30a7625713f12b95ac87c73da350aba3c83e3db4e339fc08c650c304ac4af5c10baa7e399b299f29d6058767ddbe92a224d684857fa80cd27aa8cd95f867d6c24abf4c53f0ed3a7593bacecb5861c4355135faefa7f994361bbc4a89e6f4ed56cd3909225fbee1b3fd5bb2867582fcd4dfc5f5e0a7fb012d1e1ceb38faa8ed5249c2338e450804c5a528434c68ae4e5a70280d2162bed3a516a0e6bf6e9162529ebaa3136237b756c2bb08c3ad66eaf2af859d73707456bfd9bf4e3bca7d2b948dda99f", + "r": "b2363721e0869dfc09c9bee172048c76e65f2f02908c0dbec560cdc1", + "s": "4af8730349f9b1490c4296e93034b232a603b46d74923c71cdea3f32" + }, + { + "tcId": 18, + "message": "54dd16387415b7366784a7414629d58dacc602e485215ba95e10e9ecb9e54ff06c0bc69889396cce685c52db5b35605eceee04a44f837f1a75a072e0e42093b95f0276a788a37cb06b5267053cd149d1f0ce0d4d9eaff3e3b24e3b06e9d720d0618faca506512cdb3ca25442663269b1a65cb705f0f5480ca87df8b47eb852bf", + "seed": "5b8f7105ea3af9bc1f4d44558644a7f425ea1dc26e644a63fa06ab002a0094e447e9901483236df77f89402957c8e02e597be6edc7805a6bcd99540584a6e4e18566a492ef9bc87ced3ed2981997c12912a17be525914caf17c4a30d0fa7e6871d7860a985b85744fb7b0acc12cab1a9dec2f386a1b038d49339039e879d7972cd0b9679089e2b908563a43facc83dfd4cdb9a2177e25d9ac042bc88a8710a3e0c431240f17e872ffa084451f97bb9291ea66ad77091adc6ac5ac0544625e047e302dd697af97695abb44628a40054054fa4a6b21a7e29231feb1e4c36877e561d7e0487ce1cf0c8756c28bacecdbd89f1ff12acb17dcc8a2071a32b08eb67dd3e3b255dc2f50add22b88a22f852491b47ea2b27aaeff462b8773f9c8485366aa7a545216a0391c1b8af6bfb77ed0e7dc62985d838368f7e79697226fab36da5a58f49e728b557df8496413de15cf8f975fc964191dda7c1433a175fa1f3fa2974a243ed29f9e77cc51d078bca59fdc219bfb74ec599b328b0086460c7e49fc80e9c14df762f23262cc5d14d2e6ff41a2b7933dfae2ffbb964398d1995005b5fe625a0b209dafa9e85b03ff7cb6fa950532155063a6b753a0344aa2c462955b6bf0043e098d4117721324eda409651d2b573f2e629ceceb92ed43f99c5d33b3d4a7b886ffa66cd7f4ae1e3b99686b34686b0666a0dd79fde804ed98da621a2232676e090b46853f9fd5a30838ed2afaee873371a66907216b3d89baa26494d2ca7897a9fe76799cd91360c754283dff8ece6d68683de117a91ff02f2db3796586e79931aa367de99e704af97b87eb7b81db9ab63150d0987612be36e9f7cbf2bbfb38a506d57230f4166417e08e1d0be208dbac6747aeafc4db97ab72b8d8008e80ba78fe5dfe10f45cf09f1e54ae9ef9414cf36865f1adc2366a4fea878f5d1bb3d0f7fb59e414d747b21af30f3b0111e7c58562ca0e66371ac1051bc2928425a23c728adc8c548c2366514481232ea38d0ea917926a8fa3d2a2e5eb14972471b8cfafb42288d298e87ba893b6cf68325c2b1fdf339037d1677a3e1014561516ba7359a8834edae55be830887574250f4641d562cb043475d5966c927bc001d55501e298a3a954d3d6590fc2c72686455673fd382b21f806a5d3e53c3f9142d512b1c695f8d2ec65f4d4d5b87b684ec5c48af2a0e6d47562c527cf1049d2f1215c70b35512ca733e6eb09c118d228ea6d1a4a8360e2b1c19fd90c7e4baf7946ad354bbffb2107012e97a8941985e9e80985b3aab8ed711c630924eb6ca401576dabf63c8aef5e744a931686efa98e5b639cc10ae2f33b15af64b9a81b2fdc639992ab0038d6baab1f183c0ee2738fce75ff7c9ab99d749b8e5747cd6e4a409df51ff1fc4610b9257cee22c2f3556eff816d46696934b87fc40524c3ea52bae9", + "r": "7aa20548f402c16ea872efe9275a6339f806854ea35af8ec9f39ebf7", + "s": "394b209cfc01ecdfc4d15eeada9838a8921a2fc1d9e7de495068340c" + }, + { + "tcId": 19, + "message": "385887138d875c3455da4fe71288cf0814a178cd6ee7ff9edad478bd8921ada2c20a0c53d20946929b9e8d3926b1871ae465ab38bedca945ab591cd319f7d3e214769899a2b36dbfda37aa172caaf8f7a892b55d04c1185ba4af073fc920c945b5bae31ea92fac99c2b0f9d6374df4b299e6f4e33d899cf79542c94e4d2f6fd3", + "seed": "04a5cee567976d3baab0260775d21bf50db170af8430b4e128e74e51508dd6ceece072ab70fd0487a6db23d25cb53f0142e1c3d8caf1de03e0404e65529f5e952e4c943594691de9fb883ddffcf4d2d0e38d7864e48492556e0272ee5bc1449e14f48eac35181e06c85605760961bb03980b33a2a875dd167128211a7b1909f862af1852a5798341fc341a5ceef55ab47c19f2a3926555b201a243e7fd8f6b12dda0a4fa75045db1c9a4016a0312325af8deda46d22721dcb21ec295bfe8cc15d4980b71786cc0d665533299c50da4f90b8a8484ae11488159097e7aae2a7856371202a86fb073fd92c7288624aa1edbc31eb6ea2596a50533a2e4297652410e1683af071ac083b8ad029e6aa94e2e8c46d4c52794cdae12b69da5753b52f2be59828c1ab84dd2f0e9ba14d664cab405185e8d68d165a8123d5a085ffc0185d0419cce6131ef5d8f290537cb480fc9a1c272a47bd0c7163ec61fb25f672c614b9cd8f70a4b7443e45712e10688d2c9f4018a433159167e93340c2d316884758f0a14bacf65b9aac3674f24496f7cb23dcfdc15e4d821ee985e755d0f1337bf2e4aa180d6f20fcf709686e95b4634702570c0b9fd7fa5a52914fb94de1cc9f79c701d064c06dd043bf5d0199048c85debd00e4561370bf68056228e74f1919c8baf1245f85e8c898c08938e162dfbc0a60d92240fcd0963fb1f80fbaaaec86291b380daf85d5480fbd20a4a6d8b97a86f29cc213d2dd137f0d044c1d46a52b105a89af06681972a0e68a4dd433882094bc02cab6ec4c4fc14b1826f6949ef53e47680c0f1c8d42fd314488dd8d85daf7db79081c5b32f3e5be901fc4cd299ac85394f9726f6ad95e301fa79b9444504d1de5d2d577925f8d885ca36b0d3ce483fe22dc35e39e3e242bf4b65f0c87be3f1eb9aaedf9e347e008a697f00ab4867df7d594815deeaeb4cdd193c0dad5c15751e9bd75f9cc858c05283c5c1a66b82adf1dd2ff50b7c5cc7ad4abdedecd53ad60e6b573e884a28d6ddc92fa6f5e7324c6e295b749c98daf752b639a935d30962982684a313e71d2218f36a378517c762a4cbb3d6149ffaa3ec477ffc0afe6bc331ef361976fe65066059ecaa73fbde6c3f070c75714b2b9b5cd91b95f7a90d014106cdc488a59129bc3e6a9300d6564434d02205c25351bab6448fcf849655569fcde5cbe02c9c69107dddbcd58885f03417d96d7fbcc18253e607807d2aedb60f670392a416ed433734669cfc9c8625aa95ab2bf60ace30028b8ebbbd6c75b88fd73477004aaf255c48cc54d57879e6db6af9e8a2cd0486ca9036dd179f0ad777cb0f81f73b1e5f2b59a71c22c19a2a129866602bf45d77ec50b28caf20fea0b442242c0aa158ef6267e44d887f754ae89dcb5a21120d5534177a64c4eff618cbe9befbc32b0b8c58cc274b6e88741e", + "r": "dc69e1689c4d653715e490b6088b5580ca4eefd8f7e6317f9fca3d20", + "s": "869532c9cb58d173146df5af4152d076a769c6dc8e1ab941542ef9a5" + }, + { + "tcId": 20, + "message": "d0507b4bee27ca5baa85a7b0938a2d6543dee2086ecbab5ca9fbf67de61b7182056cddbea57f3825f50a2ee69a0b3bcd52df1436327655ad0f21ca264cc066d86c41bccf5780445715147fc379ba7e7422423e4cf3dec4c13c343fead74d3a74cea7a119805e0f902b0814f63792e14e0ba1748635347f0d5b3c2e6610706029", + "seed": "28c7bc1d0c4602cf745012f0a93a9666fa1fc4ad1305e8bf90dbbd3e751c02f74a17510ba669be8bd9697cbe7ce6c19ab44e57bfb823d73d8ace15f09fd75d9992f05c1a399764fe97126d179f536470a07d2b687ecae9c456919aeb0acd6be1981a52bb45ee9d5ac99df95369a05e2077b7dc15a1c9adb30489439c7fb4c78d3a0537a8db6416f53956e75c4dbf88e294fc077cc57fb2de7769d53745735a8c5596d212ccf915c6f04e2b5121c5268513b1f639762873bf4157a6b98acd9de5ab0de3439c8f7b37fd941c10d2d7cf3a50b37fb09e41a17256912bedd06f48cd026fe00d1cd7dee23371f5a62fa450a713a24b865b2e22b088819df4a600f16a68e457e67da3b00c9bce9393bffe70044008501cd5077d92e72643d551ab4664bba6e9d6c5bbca9fb8e803489beeb5b7ef50a90a586217e26e5f1e63986e6e20fc437b74aad4856ab325941d913e110b27d32cff10100d21b8e6bb0e8db6becabe2787e3a0c9c85faafe9be842002055fb14a7de7de93d0b6b0c655f8b44671e96c1972c8b3999aeaa3fa87c233e8cf3feade71ec7cf7c3c7dc4a762fbb1fea699c8342b5c3d2aa8e534d955cc3d223ae161159ccdf409a3ad0ebf9d62e792ee440c9134e922db24ed4381526b263cdf00e9ec9c9edbcca6eed89ff6dde40b9ca9293889949b063ebb28cfcf7b55b5df184078a5a2c67fd02084b0c00675f1d8e40c919beed58a0f7883f94f9be23089e5b3c66648b85189c00a5c6d9112be704ed17ed9fb43c76e3febb4e8c08b178c9c68cc3293827c50f54dcdf4de52cbd2ff224d610dd4c6b16bf4af979e420fe7940c9321cc42eb6ef6344d9db265fe5a62a74b6b9fba962fe68b94873d82ff36c742d1a71d765642ec132488ab1da555e15553ebd336d5ae0f83ad66927746637e6e921cdbef336ccaa5638b37300a5d7653a441916e81f8b20a0fd87a38582cfa594cea6c0267c0253a07967408bb1ee3ef0491379ebaf26df8e08615562ca5eb73040c8f2f4b63af163db30566c19eb8970b827c92f3b50beab94a15c8479863301b600afc1db2d7bdcf8e2224a74ab6f29518aa06063df93468fc60ca13654b680251bfe4a3758689bef7774e4a734383285e71ea035113b59235ddc922b0b293fc0ee71bb74b561e19203c18694a05d2d68461b743223179e972e24a3bc4a006fe443bce64ad91d37406d70fe63bec79efa7727e4d2d5e1e075a55d304501926e6ff7cfe105cd511844b4ae0353259e107fc076b63c4e8c909f6dc5e896f9b245bdb8de95172a2f9a7a805b28c9a340d535a117aba08762d951f982d5dfb2ec71091e2a9d0f1aed2dc8614e7a9680ebaa98cc2ef8635033a08c0f566705b6bceaa4c5c676050ae831aa688969c96b3f41144fe971cacd2a569ce1364bcfe16ab08ff9a4275aea4c0779638c6c47e", + "r": "cfac17fba4d89f96fb090eb8d57579e7a005b449818f17bd5ff5f8d3", + "s": "29bc667e5b627c59bfd75f7af8affdecb303c9581010490373617515" + } + ] + }, + { + "tgId": 3, + "hashAlg": "SHA384", + "curve": "P-224", + "d": "c927a526af1735e2fac24a14b4eb7414e42b22ce50c87a9755e019c5", + "qx": "5403837922afbf6f79e890870c90107b93ff53c89b47abf8adefaa", + "qy": "0d58eafd0d2ce5f6d4012f8aa7416c491af06ce05063898a7a578104", + "tests": [ + { + "tcId": 21, + "message": "7cb2ffa57ffadeea4b0b94966a177182fdec5cb41e0890dfa9a5291de993b5b3eaf2fc7b2b72117326a9c9f2ae53f7423952c2c1eea0ac792e2b18916d049415fd42e96259aad4c0ad4b54cb81bf0ac23796227ea9b3f6d35455250033bebe7a754bb1b8152ed85bd06b74e57400cf542b4b502b7f0961affbfe913105a52b22", + "seed": "3d967de3ad420d2d6eb31466a8935ab969d2acddceb53e3a61601253f795a5dc4f57de27bf92ab260c3b469a81807f8beb22a060bf662bf505193ef56a7421fe4b0b8834ab5d87d8ce1c26423b2c93abed62b1c2c7cb21632e0d599f00bf4ca6ace544031d033384d4f4d4ec13f46afdd0665b74ceb223da187c83fa4130d724ad77e615fb22d90ac0af33dc70306ef40cd6563ab2d918f39af896c2fce6952e39c3d9ea4921a44bb7541f92d54386433658e4d2a3e6741aa95a94b5c9451ca72b09e883143cb556386e8c95ecfeb5180841ee80285af23660a5cb37501246702cb562fb25248ee73fa69728e1a2548dec82f1a1dc740a216047d399ecbf4642c1d56700ca1f5739f101ea60beda0bdb87afb5f7ed6b5cd41399423735366ebecf87be2f39ff9d3694b3059507ad017dfcacc3709946ed255989d2d0cf5a0a8cc09dbc885d868814a8bfad636a42ae02fcc6fad2fdf6890cd4507d7c7b66985afe639a3290e41ec4cbf63ebe32d275926026bb55ca997b3585fbd2b6ce1fc8d247ece1d8c95cb0348be97dd2a71340627b32ef7f8e1c7b856d7645016cd757cf2e5f9dbda5b9cd732e2906e8a6455316da33f2e1686a51006b030e249524cc128080651f21e7e315cf856a4791a7cf842d7e6f39c117bc427e88506c866ebe466b37176d00499dbf0ae5c93a5d5a855d92e52220b29ed1b0efb7e9ba44539a002f37839d22dd99da213027aea40edcb475bda3945114302e6d4e3a97890783c3492ec6d3f5d71d3787b579d1d1560f12dad21d22201089537087f4bbd20d507e1d1b5a43543e9ac11dbfa6847c7ff4d90826a085392699b8dd99d3837baa67dd065dd2d1f14a93f6760aab54deeb5189c271746aa418648acd4e032f9029df1ce52a591460676b85371cdfc3e91a53a2f2226a494910042db012131d4b73b118996bf15335c18b23a0823175d6015d2a434fc139abe5d510157237c24b0bfa8929ba6c06c2be98d4c31aa46530e856cd893e75ae5d37e5c3e97e365b73f282a608cfa57e599b15abdacad8f589247dd5fbf841901c537cb2dd06247234a4bfcb53af99837c9b8fe7de56ff4093911e6485d00f7eb595e511761aec0e5a7366b9f0def35e0f2b0c93cb624abc0fb93a3f33a1eb40b03d0a3c191d28ad71fd9d00ff548520ece165c45671d48ce1747e0e1a6f0f66c11f85f21ed8a0fb041b5c1cc5c94f3b8b98e0ae3838a3ca01f60fcc6085e02dbde1e2801eef2cd916c2695486f60c09846c8b15b7f10483dbc855f9bc887cfb3cc8abe010203cd866e6d957bf46be51f50018deb3d2d5c7ab8b0855422659b946d820638ce527cd57c345d1fcb86d9b8749dd7c6d235a93397f08d694677253472244d22d3e4603033e2862ee02c1af688dbf9492277dc1d6a18a9dc9ec7c8e5e5db9f2ca27b2dab165c0af", + "r": "5280218ecfdf4d6a5d89f91290faedecbac23b1dc54984c60e6e9aa4", + "s": "bc4432ace08b31a31d6cd542e78af950006f4e204a5228f0fe3fa0dc" + }, + { + "tcId": 22, + "message": "328fce749e40ca2fa325df162eee29b7d3771ee2523584b5a7fc27e811e9afdbd67c3a6715e02c97ff0d9fc31f147d7ef9f26e98fa4bb16df6e454cbd7ca3d42e8ff2aac6c22aa420f192e04a37b99fbc8ffb24e2c98da0028a78abf223bb02e12423eb90f457eac419a30d54cd91481a3760788f84f8427b83af2ebcfebdc3f", + "seed": "75ff56f73ae86361c27fb41eaf43c77dd71f1f647f6e6fd897883fb2032aea4f12038415a7acc3133eb0d6a047b92819cb5ead2c93f4696662d340a5d7407c862598dbd744a1cc188290258ba8233c7ccc19d2a5a962526df6cb5c2f5a8a0369d9aca2d6514e4c6b159e706d20ace870460517bf893c3fb5aaecbecfec5f8fdfe15df35f83583a2136e25bdffd53420c6f1bdf9acc948d038bf7d8dc1f69367552534d80fbe054a22b4e926689e3f8d679d4d3aed2044db2a734df15ad98bb434d67fd6c584350928bfdbba8d2f6ad4415ed318e28b4a373d7bc42908a270528c071cddb7117e1d707d5dff27579c32d4b06bda40a94f1209a676dd0c79b0cf007cf3a9f0f0f712189fa4d72e9111927595487576bd98b5fb4160e619bb0d3a98d13261235b9155bc8f93e016f7c204dfc4e82d612d4a2351f9205a21fb4f191ec9cad2b2ec651766ffbc9bcbee0824a49e96abbec927ae4c18b7f481e08a3091ed3fc4b498d605918f82397502459e3e3f432313e91dd3a186145a085221f96992a0b1e3b91266d3984a224e29b8631b0a5eb5cb624a1d73e7d4e8a23684224fc2fc13847154e19992cc22b6cd06c5bd9268e1e02f9abf74c65dea79413e0f55d0e5bfa13167d0d0ece399ab50600f7cea90a953e5df782f5e3a972073ce30d33ab8227a7f1be173a5f92e2b6805eb483c70998c121e756faa55b770d1b52e5c404f6502a12cf5c5cb72cf0a92391c0bf812e6a17afc877e0ccf0b7b2591dd057d4be813835be4ddaf4be3b04cde2d8c90af99b0b5ae1f27f7a55d5a5c22ef8ff15868662c320b87d2861aceae968398d706c1372dbc8d22af74ad141548367685146ad09d646d8f0cc9b142027e6d8ec17a328b16747c7e17b6739bb745e4a00babec81f778df4d522e5315ae264daae94d12acfd304955243c393a13e62cba4827e51c2a67ff0b0b5b197df390e391c2a41e0a21e0ecee095ceb1576e8703e58c74536544cfa64059373aa36823ca01955c8dc84270a09cb7cb1bfb7a1de3f555818b27db0ea6e290f3943b348d87579a4677aeb0acf27c37c863343660afc8c144a587a7dd3deae837ded3fa0da5934ba26a004fd10b5e96f25d3a55e8e2bdff47be900e44a3659c7f985a8329793e1da4497790ae83da3e0fdd0fa9913b9b3c10733af80703036bae3004b7f0df433a39d030a9dde4a83469adebe9ae3347a05ac09f79848c36bcc08d1d1e1525266fabbb709856021bc0d9d38979e6df07f84c605c4e0db8be9a1b89a9a0967819f1c2ea0441ed84d8dc43c175a153889e4bdc2d9351cf160d11ff7afeb5e858f1c9f64605f8807b089aaf2af93ee238f375800ffa48a804c3d3cfb7ef4385065d3bcc4355aa142e89811a55e15185bdc4be104b5136e50c3148ebd164d240482d3ed7cd0e5ca6d53feb184feb5a2da8", + "r": "f3788ced64fe8a631a62bff0e768546bb565f5c407ab80e77ccf06a0", + "s": "f3445e7e2669b62ff67aded3f3a38882779591ffa70ec62785275630" + }, + { + "tcId": 23, + "message": "144d9ad2664d9da634e617aa8e59c4c12ae0d04b76aa99227e98d303d5bb411447a6ebe78de3601563787bcd89012347c554c0cfe7cfa3003428b5c762011fafb4a0acb1a18a15eaafb71a1aaace4a335f3605f46bf5b5f3588d71a3ce10cd7e92269cd335837dca492bc49cc3fc8da5cb83d7307fb2d65074e1341f555f1674", + "seed": "13534f8bf4d5c1f1e60a9dea20163c9461b8d84d55dafa93a90916a837e4b19ac7170dd97b1438be77132ed9df8703a43b96b38d780648582be966579853cf0c595a5f1ff26de8c41413ec3009c94ed3704a3b4a4863867d5c32dad84ee1746214019c9de2222cf7594ece1a5830ad24bdd013a26cb913fd930300fd59d98784b3c12e971c6b382ea44d12a75464aee7bb3c982d75328c0dcd0d2ae84384157a11f89386f74a67e0e849351837eb4b3c3bf7b883243d96918baee06f7437967976eca6dc14232a21ab18b5a2c0f936be105c731f20dc793829e9e92be8ac8f2617186d6ad0bfcd415744b1d86b7a665bd2967d61458c3896c79dfa86007d6ce00e2ba14cad056f6b66ac3998f929e67f8eaea94a9331e105c82f37f58ed31d67a8be4976729bb3ac0e57416edd8ffbb55b12b206f4dbbacfa626f717aba1b862d26dd8b0c7b2e57189aa25a694e09d19693d246317299fa8084db21cb5968c85b149b495d0172f8ef844a8bc5b8154e0fe065592c15884b7a92ee020fa86add5d187ca33bb0e0bc878af2d8aac232e803fee205785519781bf4e89a6fa1f3bab14b6c36cf3f50044dde357cc9db5857e8d5f846e898ea05d8844229177c23a64cbd765ea7140929dd862df5e72b36a649acae2b7866481751df898bb705fead51dbaa4f44af062cf8184d0fbb586c66a332af19db03bf488e0bc427e111b3493d85b493fe093ad7deaaeb7435d2a9d59eca8048b0a605834a051b503f4731fb3f9e50cbfe36cbef6fc63aa910f529010bcf217d379a1fa1a2902819f3cd830eac12743c87313775ed9e6e493c678fc2d98bbcf25f274c8f3b9b56fbd751c5ffcf06658f6945af8d2210c32265427ecbb8f14983db4d6fd8244d037dba75accbec1e61687ff626b491b32d273f0a5dcdfdf9ba14a34273615f54b6fbe4390b6270fb2309cf6b9a960995acadc8f8e41343ade6db5828eec2345b02fe4f64b3b5ce2985e45d8ccbc201aeefefa673108b8cdfd297f1ac0c1cdbeefffc568d72dbcf5f3c9a682e5835160bf801443452e8d99decea3fd0887e1c6b31459cbabc8dd07c388b3530e8a09f4ff93d652bceab81f1a4e0e67ea46eb207a07e21ea5fb16ece092e4b0ad04a27e1fc57fe37fbb2f17a133e918d56f1c8771c7110ab7e15bfdca42689dfdf8cafca9bda83027189e9ff31b906db5214c08f6a7d47c6ee3b44f6c37bfefbc9ae892048082a6a55b8f66e193ef78ffd6d05040837e37e3c219388c5d1126fc0a1614ade4fb32fd0cf58060701e34b9c705d461fc66b68c602dd3e43ac73fa1d0aa0d1a0adeeeb342df66bbaa42c4d64aa030ce86874ca900f596084c305457f965ed856f4d52e6f9becb3a9edf022be398f6ccb369b49e92f9b37bcf4e5335c049b12afe5e5987bf263e966f060291a6c6c7a348a98fbd9613", + "r": "3b9a88ad0a19b48ca22f79f717bf3665b1bc9b8f248e4b9f3f3008fc", + "s": "23fe1ea6795da569fd4c4b944205d53daabd600668b5129ed08c795f" + }, + { + "tcId": 24, + "message": "5f96b6f2ef24975459a5e98a37d263352e133d1a4f1b50951480a15a30fb7920071b92468c398735f149dc01007c76950a40f56ab61ca4f2dc422c775a889d36a7ea07ad686e75247ef436f40d2dd841f7fce3cd31200a0fc8fab4025d0529283de92ed8bd6d92ed0e278bc02b6dec91448a7c83b0db1fd6c2c51bfa5c844b09", + "seed": "18aa689f43fef8bc024ab07b051fd6d538344700cf36fa192b9ebfcac0064586ba3feb5de03a7bd9285ce8e29dbc2d7ad0626e2a6216babc74a6f8f44511f8597067693d270165c52499ebd6a87907223085424edf7f7be35cbb597e07ce17c3ede8f9fbdb78dd0a5eea2a7a46b1fad3293665385c94b8e21e8f6781ce8d5e270ed7e88ee08c036018e7661c85512351fb139f279ba8852b93deb548921b81adcab4048fd54b7e269b5fdf7830e8d1c935dd9daa2863c3d4f63b076583a84dbaa1944e76b701c090275a4404b7491b518279069cb0f20f2b134c76ca078bdbce720c039b93817369c9ca13848dd859b0de076b244faffd134f54c9a1fb806ed783b7e8c489f443343df37b8ff49034e06d4f5b012609a0cd1029d2eac0ede220e2e6644bf27cc8430fe3dcf6ef45c66e837f0fbeee0bfabb0b3986d13913cda035ce797b7c4e52fc8a04467fef0ee843cbe0dd018c3b3792b8ab3c8922f77af4cbdf13e97d1ba8c57f1162f3c08013d781b3d90ce306e626fe93ddf2088422c23fbbd0439a057d42c6b2dfba3752d17c771a84c3e8d481e7bda2d0864e33b495e5bd5fc8a40749fb3fba0cb08a16e68015cb2925881b63124f869ffa6a50772a6d0d2c6c8c97d7e238b6eb55df597376040e2129be719b415fbeeeca6edb167d4b528e44f835b72c24d969a425cac4d1fac567d21886f85730db2dc3094450937c4b9455b8edcb48eebbd05fcee6ea777e6b7ba7417ce92e185dca32a263fc97dfe65bed01f09e1dd98d8380574db35854b8c92fcf5d1bb039350e6b461dbb6ec64a44fc57c7889fbfdea6dc0a5a4def8eff6a1b5450620593fa5590b8fd96357291c1423f81f1967966a2ccd59a699bbd226b6b4be7ab597a54246c83463e433480b43c4c72d8476f1b68e7622fffc469ee15d3d98da812f9510d3795480f0fcced6daea9c85f1c29201cd9d4e3f31b934e711c48af1ef8849530973737b4b3110928c2495ed858c6366ff5aab1b021c037c3c5ee92c50f78904334c26aa100b4444524c986dae7b5249d243c9a13cda9e9f83bf5959354b21806685e834c741a233a5384546715855c189465508d49882836ff43d615c396f60791f38965860547b50410be93bbe97f303072e64255ded391e397a05350e4eb05227e9e763d134d66bdf6b8a22db75b6434a0e7e591cbcfe614e6302f439b9313063864106f0e69e0364f07ccb71919428aeedb9147aefbf227fd974ef29d1db7fded58c1b96c333cfa9d053c826b06488d53253a1d2915fe9a9e4f7ce363ba23472994f01d35ce3bb9d1197f9e673f2c567eb1d9e80b1c2923da2abe3861391985584d96664ea28ea8de839fb1812b988ad19cc0a751ef9860a5a7c60767309d5d99cbd3785905dc7305d6aa2736ddf308bf84282162ec9b7e1566aacd1e4c1b1217c742c5", + "r": "f5d56a52f31677475022877a81bed3e5bbf692d2bdbe6c9a91ba093c", + "s": "82ebedb1e54ab80982f9d0678b9ef7bc86318a9e9370659a90cefca2" + }, + { + "tcId": 25, + "message": "e01f2f452994699ca7d70c7b5ddef3fbcbe05e62b867ea2295664b73cd73e874ceecfa644544ca8c9ac61526cf404f9e00a2b537d208b8db837589f4200463bdfedcbcac7df49e8118316b71426d971e5a6b773131e6518a997858e3c5e2bd06375893675fa90978d3e61e23935253db594fd6de0a9b1591431c56876c726836", + "seed": "0dba33d0d60e78ea06a458c63a23d632a9830fe78573728355ef1ea6c08c54e6f1a1d60b2a579d47429d0c2b16f0f1c1ae66e272a6293d93cf2c2e8c8e8597e6d02b9124b7a2ad187882a238e81534e081987cd4194a4b50af2195971a222720f6fb03a87158ab8fddfef70bdcdfa6f67f6a059a04089724181a677c59021f23960ce55654d0a3c6f0bcd228354727be231b803ec2bb725e8f88d88dd0cff41ac0c2a2778e3546b76ebf75db947c350faa099c9a1326c86c12554177f71a4375c29aae30c36683e00041b73c036f3b1e1580a5a3466c847da8329650c13f50ab18736586c6d3a9130991a74b9e0c727eec42133930812cb6357ec4e4f33e3943478bbe598844b0bd92b178cda16818550208d11e517d5624fb1462b97484569c7d25f0cb777f8c5cd4e3419f49456828f790f86a90e82d6daea63000135bfabd622f62b83361f7b24d27ea5c4846ca12fa1911232ded8cfbfc791b284a7b20e490e7f3780a73a114e3f1876f864baa9759e74c7319afe86d79d0446d8c77077d49c5a1651c3a1ffeb3fdb078e5bfface2f18c7798b9dbe0fb2f2775f13b1f42e310d70b20caf61302dfc4f85c23461270edfc2011e1b45845c24bb5f0d7da4fa43cdb9b4fff2d62757c87534c201f36910fa92132345f14d888d3d2c11b9e3335e8b1eeb944231e4c5810bbf980a86d9718fb2057d5d0d4ea7cfd87a101a7b0fb4cfc1d0c6f21634d4e7737f722ceb99660935f171f87f784f7aaa0d1473a21c5c055dd66c71564ec89919add6ef6896e9ccd86406ef4b48112d8610c3bc6c7697e80530156d4c62b7dac129cdbcb96dad45245bfa93871d18d81398ec580193f1cc871b51448a0d41be203b1a6fb4339ee65eeade682b5f25857a3b2bc6bee2d35330bda84371a12fc7267279941a6c3ff94560b82b19b74d801f843259504eddb55fb71baed828dba67d81cfb2f6307a3c3de898da20a6f5861b9b204915825fc4d90b2ea4b6451de5b1aef37d5f6a4348b06d592b4841fa47fe5eecaeeb4b7b3bb734b30a75a062b797f8b966cea849a8a03d3b18be809d2bcdae987abafad52b9c38ab54cb63966f11d9d45598d8f6b1936e41108cf00cc83f8af222b773d290c153fe381ab7aef3abdadc36fd7996e42a0dc8e51ddf13254b83e1bbf34743a8ab495c0e7dccd13a78aad3b44142ca4d6a225c3e15c24e4ceb1f3a06d364d3b2c147bc5a4c6e2b398c057c0caba4701fdee2be4f9349425f0a56d9e07fc731083a2b0d6162d7735c2513c1ed3abfe37eca22d60d411945fa9e56f7ce30fec67214296ab2671c31f0533fb19b1f90d6a4ea155144e9e2e18fb7f5fd6109fbff539a114e9d79e4ad651730b771311fa458977a5e4111425670cfad4429b6beda79fd77a573f2f33c5df42a9f53a936462f11340f9510fc9b716bbe6fade754", + "r": "36c8e2c6f51a5608571cc1d0f360f6b344ecbc7fa3c1a1c6c774a09b", + "s": "142e24cbbc7388b6e52352ee9fd668dae84ed3edf5d738268edcd49c" + }, + { + "tcId": 26, + "message": "84259fc8f2ed0025f5394cc30ee67a714c3349a0315f2668b9f6984ba96becc84090800994093393d3a5a7aa8916bed42cccd500cc7af7052f34d12580d3ca9ce4d5daccbaa73e2133161b2865569c8b1b181f7407d09d1a5d3bb1d22a67a9eecd0c0125a1daed4c41ddd16a955440e007fc8d2ac298a8e5fb7ca6a8f37ffe05", + "seed": "97e707e3be7aff5341bc1fe4e7c09c4dff696e21d355cb84f2fab4fc0765a17c50a1139f353be5f743dcd1ba77bbc2b46f000933c5fb397755e446e43818ce4d15cf96b6042146059cf77b08e2fbdcc484cb794b1ab95f191c9dbca4d77c2cbb7f7430eaac86d1d23691cba73f24d028314c01241b0f287cb8ace15bd169232863dcfc6e889f96742afffc83632e2976da86c2faa1c6271a3ed2fdd63b410b1ccb5593de451a5674a460aeec38366108f7e9aa167eef4920cc11a47308e0c42e42a08bed46e90bf2676bce1cd0c2a02a8d48455d586d43baaef425d37e8c03e10efc6c4b1b9cda1e1e5ff522089d13c698c03133b321ebb17733e12daec4c6f2aaa6bc7481d96cb88e9adf11bd8a695bda1c5caac0b1f26ba8ab0315019b0ff563a6d0e9904cf55fc95cf2ab4979b41c016cff5d3562ae781c5d126a9614505f5ca1cd86aa24beba7a3fd4da25047ee23dbf2d2265d431c38746738cc1a51e38aca2d5ed8eebc5171380f831e84bb31bd9f890d1b51d6d331f918cd7e1bf2dc03cab6b31882a89a8248872c8171bdc4622cdffe67a2f2fde09049be77d3930709dc64858002a793a2130728db39bb3d66b9932f03f467afa4d5670f27d9bcd7dd3e476f193725ae4c5a31385bbd131774bb4f82061c75c9e8f84ac59eede2afd3f082f1a53a8cd6b8ced700a5d6ce3fdacc74e1a476bbeed54df5293716df573c651d87c22839a51c5bb2839c5671ed877667878d244abd9a3dc48af5a1edba57048969f91195468ed7ff08148de34a7dbebb591887c157ee2ae59226175c66e57f8d9dc2cb3fb338105a5187eff28c1e13765c7eb6136853b397c85e6c6f994e1f555f8efc53e72bf7775e2cb87283568a1d94b2cadbbff0aefc57492e5445f23388aaa02eabc1b69db44b4fcc942f9c8d1ba7a75ff2fa683544bed62566a2c710a18a1061026016ce264a02786d2d34dd12e42600921b1d344db29bbf2f1401a522aa0f087533586e8000efee5a5e5cd9586d78bf52b00ae94eef84705d8b49bcad86ea2ca03d4ae3d5e510069ff380fe02c82047d72af3d471012d341d5e3bf656d734ff8e45e2b97f97e9979e95285bfb08c89b33d3d68c8623ca4be06d54b33d09a5c49ca52f5755f903db0fbc8e231490385d946b33b120e820d978f7e3de12f70a74339e3f73a9eda061ab8567e2042eaebb1f79e72359ea82fd98d8eea6abba4995248cd3664e6af8793d01cb91d5af8b38211f0f12737750a551248bfa1d09bf2cbfd9deabe108f0730d6e4fa526351865763afeda4468d6af8acff2d9b2d8e614a2c8700f7412e14aae1c68c5751341589e2d65a45ca070d4a021d4d1321a92652adca0f32ddc66fb13a753f6fe0ea13f6735c4b9ab573285d14aa341e9401199b382a4aeed4574696a994b7f662a8aa722525aa85bf4224cf4fb4", + "r": "2bbfc3357f0874d280b962c6bc11dfcb1cbbf24f299300601dfb1866", + "s": "a6b18ce37ba3782506e6ffc921e65de2525ac78f57f7fd244e36159f" + }, + { + "tcId": 27, + "message": "2bc75a63f801ab271b7b937e80f67e6816d3cecea4084c950c68ef31268476ecba627846a7f68bded9a948ae8f4def6fd00905f51102f6a40e015a83df84d0642a23cb6f664e711cc8dfd09aad5b9767eccfb6f7e9a10f85d2de94181354beaa44f60926b4db3e8600ee962088c883a31a6ed89d2f155b334a804ba4d5720b5f", + "seed": "7adf152435d034e66ed0adf4c767a57cb24ca38e84de405d0cda6a0b85e06cd1332d601a10948d4b2cbe8b1a1ecfcedde7b7d17dfaf170797224304d5689d6f78502c73555c03fec0517963ffdb26adcaf4094d2b230a45189aa663e2f5d43eafaa105c07210c26ac256dd735cdf1b330b6173063f37982b160e6425bd449e58aa0fd15df2ea18e51e2fe7064c1bb91ae929d8169d1a84e401cf7460119544191fb41fed2dd9a8f4ef2cd8e905f93c5e86305c78d45f1b33125736bde6faa24daa1f42801d822d2e8062f1ff7d8d9002f5d3d665d9ddcab659225d062a63c0e2942ee4e7448ff5c39fb6d6e8f801d1b7562d95f0edaa67a23d5f8e60ded51b1c9d5fda8dac75b3c6707660240edc15b43f340174e6301ec7fed31bfd202a1eac17584c78f46c6c8d82eed1baef86dfc1881a13a5296ab9e91d909608262b6c9826a116c79873a9a7fea867e1ce292920c671ebee7087371a4d2232ef9a872a3b467e0e3ec13102fe9d704e82567d7df3aaf27a8db492b2c6c3d836088ac93b07b6276fddb8fdd9def942f51d71675184ba5490ce87aca8ff222c9da9c1be72979d953f56091a169f785748c9b7ad6dbabd1461f0ded33d421ff16a279090eb14321330010debd6730f27fb6a4eb83c3cc1c4cf80693dda7bfc9a9862b0b75c70e14a2df8d26af6354b3202ad5e30074ab20c1e636dfac3324cd9ad830cf5d5f019885b9ba1a83bdaa58e9ad2ba227d6ed4456a216fddf02af4e65e95ede323aae0e164b29e2d2da90e4b624bbd91a2ccbb3c792061d3b87fcbb05baa1b4b69a8a1f645790496fc4b3d5956774ae4fb19682d41faca54b84f8101af1a06948f2a33df48cacbd0aa2a7672b2389f491b89fb1121c78e6439dfb46bb483acfdd0314b8a205eb5e7cb6bac44051cfdb8289a2320a240cdf97ae4848a147181a5a845d4e4625064a50e8edeb753891ad5f3ad41154dded44e0e469095ceb0fe72e8e574965bfa58c36d4496e2599fbf033febf82b12976cc74347c4d2623cddba9b8434d493d65bf41322ff63c29c0659a3e7a3b0c8dd1a54993d61f4f9cef49773d226b45b37e5f7edec0ebe6ee1f5770bf0e2325cd8aa9c86c0e3432c3659923409b06398a25f2bd0031fc58a0d3a5b2af40d84a2630363f4e9e97ae70b45dea0b5517ccea4e720987efbdfefcfcbcc8748cf09c88d0cc65c562befd5a9bbc7bca63ca899b9fb0fcf5158362e692cb0b7fe528f6dbcdcc75769f8c0e04745e6c8d3504b0516db1af958ab3dbc9e9f3d896a7e6a93595990092ceb304c0dc9ea8041de82c9bd1b2a6aa15dd900970646872f4f5820b79bbd53812c952207dd694e9cdc0e3e1a246d17ca88dc47be629ac8f7de6debb1ac4065b2100d8b3d4c330c4df8a7520f43cfcbd894fe74339d3dd9e80d8aa8b1d06cd54580fc3970fef22b25", + "r": "24555cb212c055a5b603ef68e5517e854205f17e15f284eac9686704", + "s": "65f9c2861f1e70248526a8228f3c02ea04251fbf076138aa01bd5b9b" + }, + { + "tcId": 28, + "message": "19c231d1e05e81700682538dff910c8e03f5ba4c5ece126f142324920b1cb1100adf78eae55e084d05cfc4156850b2890fba5b2770744c91ad1630e8ab873fca98bcdeb11b1b495e1c2bc1aa60bf85450bcf194be64acce89193062ebd2478c67a24d5ee96bd59290642713c5ddd25b445ed0d244eb9ee6eaa746f74454fa08d", + "seed": "996f5082af1eb310577f639e145c2706ec38706c25832a7c0bbe5a41263246955438d10a2db794f516f25ee30a757e0bc72b1ed18f43539463a9e3563d6d3ec70d3e42820cb9009ab9f6ac13a593f17aa47dca0b6d5316d9032c3a3012958aaa3413b1f049f4029c3f9d131350b3feeaa6768992116750ebece64192b779c7b952d3d3c3a389b5d98371e364bf3df9d709085d5bb65547344114f34ccfa74ba5c4a0d4d9751618f0dcfa4401733bb0c4d7424efccfce0050f3dc55d9106b8c2f29e34c21ec90c8f6608bfd1d40764891addc6a361691cc034457b0c281458ea2afa1941b38842473c4c6432604049c86719f3c86a8568e81e16a7f5c5383b92a2ef966665c11350cef886d8313bbc8d3808c1ec728ee96cb820974a91ddbb212487a9843656fa3451af4db33bd5c353a75c142d39c5a0402614e67c36ef21113b008bd34653372b68042255496b0c81ac03244ebeb6784805f8ec04fa321d5b15e62df6d8e5b3f7bdef39e088014da885d7ca44ca3b6776caec51f96fb41b83d51313b5b3eaf49a0f5f4f2d32c7f7d631260d6bf63d218ec072b31518d6a555313917e94d50554ee53768721f2a19385e96019163b7e60bddf4c93fc7c22fd912ac8057866076e1c441a9c5de4a91329af2a6b151b6378b9e551418bfd91f3158a4638192e2a5843b73ce9d9cef70bd1794228698bc73de152e508792db592e28b5f842e6f5854689546236f8cd1b77af945d3fc3462d6b78769879a95c30ab623492e1726c8c788601a5b28c4dcd010e8db2a13125328e8cbe53817524bb5179c6804c13cbc4c872757511df53a9635a324caa7db07b0478d7036dc6a5e946a1557a9ecd0fd8d703670e1f198cf5ceb4e9e9c6291ae54e332a4fd4f2a44c286afc3ac43ec4af388273b6f534129f9d7d35f9207703817040733a9ce7bd81400a50e39780008ae07a8ccbd1ae91f683996f557dbfbe2e2fe7b7ddff152d143e9d88ff1d3f0a9cc4a4af20a0d377a94836ce52c031bad3417a0a1ab9862e96535a061a4de2d6882368214d471c9bda235a4c82168236405cc12134c8f55bb9fe9e0a12bb12fe83f38bf749f6714a81c5d826657f464be1adff8c5704052c670c05907571b7f11e2592fd9cc5a78a0c8519d0aaef390bfdceae0565dc4eacfa27288ff113f3a0d1d6d5489c484d8f04df6af753a12faba21d88ffbcb0f590c0abca6b05042c44e95370ab950b1996b4c052f6f56722ab75a3702950947063cfe2a33ddfd266888ee147f9bbd0239dabb4ff911eb1d6bc28c0f3eb107a78460829518e423fb412209380f4ea4a272c13093c6bc16fdcea2045da3e6cb3b04cea81eb3c952903d3d4da5bbb6ebd861e65cbdb300eca5c5aa8fcb345b4dadd8d62dafb7ac8dac3fe70f7d199173ec575a3f5f834899f5debf8719a01de2e8d80e6542", + "r": "2595b48c92cd6108d9b78874970633b9898df84fd0900c81591737f0", + "s": "52f8bb310c8a3f2dde0877e584a277d6f583030a877a84a59a7b9e" + }, + { + "tcId": 29, + "message": "1d85b77008983c2f6b265cdaaa603c88b4a3dd48222bf74310bb3047aa90fbdae6507378190e2a9cdf619f244f41b876b58965b82554c490fdd07f32341b900b4bab1c62d7f212195b029ce7bcf5138fed65633b9b468603b24b6a2b28869f7c485b1963d0a5dc18c401feab5877dc67fba7b8d498d967650fed08b30ad61a5a", + "seed": "a343a4f521167d2028388b899d1480514a1cba79d181c537064497636cef47a20a6b5beb5411606286de6324ed29ae5fb62f6f86ce14d0beee6f0916c19162705d10d853850ae4a472833fc8ed6574860db65b34cf8eb72ad3679f6671d35df1d1fc319a9c90a8020a17d4e967b8c7b064ebbe05e04e4cfcbda863fe36bcc5194dd621df353bc1a17e6a72c7cbf08be987f1454ffded7e7fcf313b12ee3a0d46d2fb0b47c2d9b7e80330a0cf595aca92283be23f979d30ef67777b7508d5a1ebec0afd35dc9baabd26dfdb8061c58a898bd0e0cdc7fb8bba7c5425e470fa965a48da45ba341100f8abacea5ecc321e13af722c2dbc7823087454c3c6b2ee85ee576e10e7adf6223fc5e7201d6af177ba52c65ca05f7c1b79d0c8adb1dbce948700513393f350dec2243c5e1a6c29f11efd29235ff08e6e4620caf8959c6aeb96c14304d0c442233be692364c793d0eb8108906b8539065894555e0aaad8290a26ef85438b7c8df59b16e63258fe1a8648efdc67fabc8459b6238c7dd85f8019b52bfe07c9633d1015186071eb9a9e49ad510976e0aea04ce381ee0150af4978994da73932550bff896babebcee5ba9f1ccf1661d05a2149425ddfeac4e0c471ef75846407e03820524f0229f9ebd5345fd3382fc8ee077f4937c239ffb9556640980f8e51594ea3afd31a067a799076408fcdb42c4b62125a2f200cadfdd3276003198fba4330ec51d6fb2f21c50cf1f123958ec180dd1fe48978e0be52a954e7231105e9527afeaaad171a192a602f29d8ba346323d7a933a7da7c554da7a9d447ca722501fd46d26e0ae8c0197b8a720f4074d2e832e71bc811e50090d381530abc6dfde6ec0b22c7906f1e66727ac7579979f039426ede5b4b708bcd5778738cba19babfd421a28692b67d17b31cf77a883f8a04a2802785ac3e556086a34005be8b270fd96119b1b4d474357bb2820706b013ab5e094bf5d51dcbe0f6825b9a5ce387614d6213bbe124352ab2ec3867a2b437f1cb997a9fbe214dfa8936d475c23a67c89cf1818ea11ce52579f1d70fa2d2b459a80b155c1038127e765806ee51da6e52823b08b13aec1a2cb1d02012795e3851fa248706b649c7861fa11e230e1e68a421df0ab5f7b8120231233f04a370025f7097ffa2b82617a04ad09df6626a1359775629cca971f9e3e9b52b344faf2825463e8d8e40231ccf24a7b80a0b488c1ca982ff457e08a3d10415139c2ae7abe5df523b4632b0d5164866d3a04781eb31bac3f5113165f7afab14301bdb4ebaf0adc94ae60f401aa1d3935b2392ac604f02abd6c0878797aba18e376bb15ea8480535f02742869940f14061be6878449e09815f1920e79fbbbf990ef3b92e8577d2bf161548acf0ee6a066a00733e7c8ac918554f8b3914ffb6aafc9d66dbbb26a2e935a493e879a627e76", + "r": "c3b595a34a7b2039119878572956ebdfdff531d8cca4871b3c017e53", + "s": "8408e7cb0efbbb1031e38648eaaf1b7061cbce5422af0696797f71ae" + }, + { + "tcId": 30, + "message": "2b09bd8fdeb9b0b72a11bb8482658ac4f05924aae14f7e48d09ea0d24bc8dd60c53d3f9b5773135a6806bed1a28a78971e80481b47b6ae6ba51503f11418bee8e25e0ffbfda94539756b618fba235dd38fb4eb09b1bfbed4393d449dac88c6c99679f4005d084c0a89fada068ae7a8e9b2af7adae15462d65e6d034ab3ce334f", + "seed": "066c30170db86da39bb8333f0d4f73d568b4392a53df215e8d421ca157b492c071bac828ce8f2483310235adb16d9d14a8db788e84af48c61104b58f02563a367aee5ee008a382a765e59821647a5fa1b078550a66296290e59b9324cbb6c338c37217da8cf2ba49831a7b1050f9515f9386c2af36988ccd90ae66da88822c83742f0752a8a690c03c1f28e61b9402fbe228750b11db20edc036c4e98d69f4831d7853456e01771d6c7af9190c4db745aaec49f09990353cd37ca738dd0851a04d6902a823d6ada4b4d24c5feb2c67245dc15a794a58a253596c3fa59a5f8c9e78ff8856d4b9ca0d25588da667a790a4cc40f39f890c6713d83c11f51fa788a4e00f14b2c4d1044e3d343f36adba04a90474b0d75ef95b40d86da881f8cdda807f691ce3b34914a800e742b7cbfef296d152246baa2465477049060bdfe8e878762be329e9fc304cb9bdf662b01f170d46f9edc4c4ff0547b441da12833def1e1f995003dff3042eb0652ce9702671f25ebbddedb56e6de94cb4cb5127e9441ee30b788bbfa6e78ead5d049ce0ef65fe5aa81968aaa3f92818acbda9f5d93b320e7013011d4d67161ea8543d883ab818e52e0391e43530a1824d2e376b20c60416c79f8a4a64df06e3a5754d9a5037d81115c3077601e6d602b3ba4cf1165499a0a31a72fc7a85c0be52ff1c0003f23e6d39e53179867e0ed4af891b534b399060f9ce745e2018db8475b5c7de16c26d57d7cf7dad4c40985cdcfb1b4ee887b8ba9c7fda475c844b397065a6d9427a55019b506d8a3933c2fc3ad9876930068f42b931b3e393fb4c90a679827e860547b077b3f6cd282932379f97712bfd05996d443cf21f9907e36754baceaf53eda66915e5f38ac352c3bcdf67bd765d9d52c7db7ae47712be399a2707843cc25cee5be133a7d24b1958cd2385616cada4af0f3fa87774853bd6c337689faec87b6c4e96b3c63a1ede5c59e7ed07b3cb05f3ed0d8916a3c2f0e5b173230720740f8eb743f225af9fd627dc0b71af55d25d42f15160784dcb7f266ba1555689c72a9f185e35d40426c7bd1e84cb5d04665d524847e8e9484a331c4c49ce9b98aa82c163f79a33cd4ebd6026bc74fd2d72ef2efd71aeeefa5edbd8a21bee006207585b5be951029a88d16031159a4a051c717a6364be2c4d19e57dbe38afb5445ea537d8178446f37fed8196f8d658d926c4eb0a195bf38075e17800deae8d01dcee3c02d668a688653758afbe991554151eca00ed1f173687e2ae19464aa02c4cd15cf82f728bc02f38f9e47f7ec32e3a73588de0df35ac73059003ea1d9ba3a9aee53b583b4c1f6ee40d0698d727004b80873a97a3f80ab967ea16813950911ec3daa6a1d8f809ef437a7662603b31c2d02e14fafff8f74b57771d4e004dd323151691cc88a0cece7f0adf8fb1b453c7b24a", + "r": "2c6798bc4bbe0321b7f419769aeb73e616e91672534226224428311e", + "s": "4bff968bb12a15ccf8ca7a7d413d4555a2564f4fa1df2b3a7a5a2a0a" + } + ] + }, + { + "tgId": 4, + "hashAlg": "SHA512", + "curve": "P-224", + "d": "ee53e41ea04f4f156d35783ddfd46ed68aa41ffd451d6118ddfd3d32", + "qx": "3651711673316dce982a1e01e8cc0455ebf767b86ccf787073faa0aa", + "qy": "f8132d89aecfc10534a133cca7a1bb186c52ececbaed89fa5ed1e2fa", + "tests": [ + { + "tcId": 31, + "message": "01be13a41e0dc65ebc93ee4ff4ff3d4eadb87f1bfe81b1eea95c952c92e06241713d5eb42528d0bfe1b519d2aadff9e3509ad46ebfcb92607338cceecca714d566982eede38de882263fe690e12427764b62d4a6b5c8d9a02a42420eaaf6fec846faf7d155444625408a36996bbda2b54777e4cb705ad05d6a843129b2290c5d", + "seed": "53e26226a43944c0ac3e7ea4edb6cc223b1f6f9891153fab94a598d92a836a476cf16253872b3502011e1b4dee10369de0bb200a22dd28d414df9b19764f5179d018b4a25f88b4c146e9b5c9d076f534b97ee75c7e24af5e31ba2776a37b40aa447b001044f89e4581f1b9d9ea5c2e97c0a8158f2c5b74888d45ab057e69f1b92384a2a7e19bea3877ee82138a08662738efa833d592de2fb9d5b1a9ac9b933cf7a8d1d2f0be714b0b5d0ddb4a9cbf174d1b3fecc254da8af5db2eb2c56b5f4c5bc10ea1b127c40ad893c74617736d8f298444f75f5ce1a0102b17af875358a3476c9413c367190e9d2551bedeebf333b2eb8c7192f7dc8f3afe661a5cfb890592cf2f82cadce9123fd87b3d2e23d7b1389d0ab2b27387eec87e68380caee8ba46b93a2ca011272b52507af4d227e968106430f2fffcaf3b99fa7e8fa301453a64c13682426eeccc333e98c4acf2bafca7b589fb80c06052c34a6f7067094d0cb84ba3a66b29a7a94abd8591f4000db09bd3fdd23febb33335072fdd4d68330ccc0247c3d4bb9c5a1171044f9b6a0dbc94aa89dd424af964b1c1ac62bda5ef702aebd3e4c0f49db13327558a0ab52ab9f5ea308b5bd290d428935725928b9f2c82b2e39f72a0f2deb53616816255dec68358114ddcf65b18fc6be497547354bbbb8ce0a4e2a1dfb69708ed8c1dba9d7fb45d3b246ea1c1eac2688f5020205bd1618772c35e32368c7146108eed97c4fd04e8dd063026cf637224181df37b80ef9fe93c032fb948b31745657206b9974bccf73e2d05aa1c09815fa4c15aa8209e05fc07bb6db4038a2c2357db91b56b378a0f1dc2781ff3382373fefddeac55b563a301a7b198a2254cc95951cc115bddba04238697d1c44ecf565547d713b0ca652c4ba1e3cf0663d4f7087f11b4b8fb7c1c7ee37012429526e07039fcbf57c90bbf74bed10ee6499d15a85a4dc24af8e8aff8ac91fd4e1b56dc6d2f9a9833347a0062bb414631a66fb4671a9d60134f9b5fec815674731fe77a18e7408f033b0d10c645c177c1fbddeb3c0e019dea104481f1ee2000ef4a215ba93d1d2eba988efe2046c642d7e404eb8929f0fd7856c6c80d9d01c1f37541549f478ccfec06c9c8e4d40c36cbc4c2989489b206b2b70e8eafa3fda05f155a195e7f7f1b9e721f68bd16ba94c1cd8e1c7b8a11eec2f72e51b27449b9678e877b22172a46f61894c613c39e1ad3b08e12e9ade27cdeadd42f71b29b846d9eaa68dc78e57f965021dd7c201a2743bfbc9c3f1e1aaa231b8001d424c0e61c977f3670e22bf8f4db2c7cd1d35b96a6ab177b33fe6cc9dac1807afbc07b44aa64f02c90c51e9313251e5cee2b2fc11553c9271e0350654e553a9cde13e59bc5d0a237719648d2cc6ec43090fbb417cb10213264890139789d685ebc9b91329e5ef963433ea5168cae", + "r": "e8f9638b64b47ec2e36f443f77f9c4fa7672e23e9551f331f78150bf", + "s": "f15a66eafd75b47124aff4705c3ae854e74808cdaab75dfe441017fa" + }, + { + "tcId": 32, + "message": "415c25c8fc819d278e16aae9a797ddd97a3fc144c4dd6e07b763f267f506f280c62752e2c11a4ff8dd47409fb33e7ff7eccd6e7bc5be9c943fe6e34c7a7a6ecfb55d28268fc9a6e8bb87026071aeed9bb06ce164d5a7ddef4de2ac67030b80e0a8b24da1da2f64ce314323a3ade976eb4ee657fa5b178103ff0256f497d82cde", + "seed": "8bcbc1ec0ba00996f80a764841571dfb5415d4ebcefd263404ee6fb79dafb789d69229457cedf5a2355c18209b65e5c622663a4bd835a00c566aee9d7a610a6b2b0c427a299586fb6ec88c7a9356aed65a9beaf4a262e6256d6a73a7245fad4bd39f91dfdea368aff0998a8d8811f34154b570d663af3a4c21c7da85c06e64f8f4937b3b57e0de77e6d00a3eff6df213f0d37393da0c1e0aadc9c7613ed58849c12ce544e069fb4dab01f2e5b005a60bb49672a98db2f19a122b85b49fa65b1d6064e837268ab21c5a87fad55d1808bc88901885038dbed0bb986cde0316a22a9fae70ad33fd7717d36e587f6ce057514db449c9b468c34f899a0a98cda59cadffb1f0dec35b975b6c71522375f0b92ee57b7dce706b5b90c9bb64353458ef3ad51a9fdc89823e54506dfb5db17e338ae2d20f8f4f1cd2a387971929265c5b147fce4786d026833a78d2a368c6a5c7dff6a9d3c63f5405edc8995bd9342dba60bc9b379f878fbf2d832e9baf039085af78ba48723405931c836c3c20d1ff9adedef889a6668e9193d861a1cb8e5e7ee7577053bd0e8e54d569f7afd82aac073dc83524727ba5f03bbcbd233344379f677fb92bdb77ba2d4123852daf86592ff95cd5dfb7ac71343f63419d817e23b831fdd4ca237eae563c2db6f8c8012c39349957ad148acebb26c92ab70cb81a5f75baf0a3bec8b5c9c4d26a3430456bf7897ce7081c3d28736bd0802b2f83b0a62a96bd6302d532fa6c1336d30b0496e08b8c3cb0e7b7d5066e09cb1b86d33a5439d5cc333331c6390cdd67d55464e07583a8fabe6f73632fd36db9dadd436c4586a173048d3921bde70482e3806c7cd1614075be0d86c4f6d8935f1e2830970bc777e089b7b1d4251b5f2dce3650c70d528527f2fd1f86e3f37dbef247f812ed0bd2118e0badf81536445b25ef9d502557f197da02dde6f40762954e40a26633f2ff12895587d55cb8ae86e04517f5a46a869df17e45ca3039ebe8337ae1237bda26bfa3d2384769282ef83ecc9eb986af9068793faca266e6f9d6b34aa84bc38207a9a88f0b4e6dd63796c22e3cc7b7213ef385d1d829a2c25971ba9c3272b80a1bdb5d433613e7db42de2027ffab8357f47f2b29b83e457aac5b3a6e2f42eef9f99bc45cc18a837ffdf6ff8803c7aaff9b2737c8af3364b234da62207976cf49fa8185a2d940b8cc9ffcfe9fa605342803be61d044175194df348347fcec4a5506e4f270b733c1e3f346aefd106ced8a78cf9f60490be2446c7dd30722770ae60d44558bd810fb462f58cf45103044b0bc8bdc4de84c0bb9632f097eda2f2319d2f696e26e0c774883caa63d6e553c23baf971e7ecc804aac8acde631c6c99e8a6b77bde45e914b30876d4dc586eb3f782b4f65c894043fd5427c6cd0d20f7e426264a8adaa6aacefe3703c882064f37", + "r": "32a76ac5ec1a0e90a1a7787a88e16fe3ce7f5380a4e3e3a907f228ea", + "s": "a7b3810b8ee819bef70f9424e62a0ad48709b3e3bcfcf1c93a72be73" + }, + { + "tcId": 33, + "message": "c343766d4965b03a9183968fb28add3a641daa17815d3ca99d91e8c614c6c9f49c1045d130642ceebcf0e1a09bfa9d06d16bc99d9855c40915a6d275536d2a732431895090aea52ebb426c4567524f6f063c333f39ee262661d680d593e730283548f2eb69a44205aa038bbe7b25df957c655c849560bb171df3f5d2b3503147", + "seed": "bc72d45780be7340f2c557daca84d7e69be25b3e1f044edbdb4dfb92869490d6da6ae65925375bb98d7ad1c4fba8df2d26a1798e64fbf0c173f1c05248718e4212055bc20fe09f6046a34a74bc702dcde89630b52ba44b591dcffecd24917a6e325fcfe4cc4a899d22b2eb710e0e478b7aec6e45567638853c6788e217fbc1138a01993791dc2881f616965ab7d08e8b3f092b96f3c892ef4e1775f7d0e22553c7f02b85708a9a2ee74d0a9059030d072e067f1395ff82f3cd0b60d277e59f9eee166d0df7c14c6cc0b369d91780169dce82d60a260e8f1c1ee55c8e2dad1a6555c7f7c08e006d96758f871f6e064a8931d10064947cc52c6bf0bdfdf05dc6aae1df7362e910d0a693826a65d2b6c54d1ff8f0224e320d706965b5d438183d1cc0c0eb64ebef8cc277539bf865a994e2febe306d9c1972af103f660c77e0d1e8e1347a0bc2e7d918bdf81d776913f4d28e8201469d26b2384b54f53d313c8bb0b5baa4e997a65118de8275c67358826d30968bd3e1c6c93a9914f94cb130df78e32db24cd1599883d1276973fb181c350e781de43fd641776bcfcb53b68194ebc36d991558d03cd2d59eb32dd91f53fc35c3309c46d4dd08f4847be364b6a799240a2d85d953c4a76e75fbeb9b75a2558616f3a6496d9841edc0cef3c59f6d2e3d7a9214026edc5033c005c24bd55eb6c1ff426d94686ee2116ae672d213e3e4beee0ecc5e46264a9365b552f63c8c357405c610059059b56a41794ed7d6cdba32957c0d370dc3b4a0674801912d8a4cbf998937e4838586dc42389556821a420fd5e3be7d3de83bf6b6ddd45604cce702da670b910174254612879661a900b577f037a7c074951e78d86472ac985e30f3acaa2f53b6e42cea3d348fc275e81c6f1416bf794f4746a8d908d7faea9782eb48a396c9f18399cc7fb894a4f36341ec45fde1d9e41891dc433c55db9c0a63ca6ea82dde85684f04ab880cf1452de3a8570683976061deb007df8dd2145519a0f097676f90f54a2233cc9cab6d98327f16a2eef02d0152a6756cdba953aed5f780be3cc7cd20cc23778f853d96c7ad90be664055984ce872a1e804e3ced9a043f278bed3263439219fb429a4ce2c2ca14a9cbf5130c44a3c920d679495f5fc0dc328315251c2543e6e5c75c6bbd72335ece4c50ddae686369b5ab438be70c99db030aaca3306d398bac2bb6399ef067f7beeb9dbf37d86fac44e4209d42f3d4035ab8f66e7be19c821070fb7e8908123a297d7e872478eb7a7603301cbbf7d2082db5329f3622896bb8de141788c93bcb5982def1fbc1b132c3bd709e3934b9eee28ab1d25d8b2adc4398b39aa2e8fe1e96a6270fe223289051cb46bc8f442e7c5f4a603cc0a10a76ed2daa5d7d203aca1d9e23d808d608aceb9395025955db394849130c99f8d4eeb32898f295b78", + "r": "49e6ca90249f81ae8684afd261729deec2c5d4ff1578d5b8c99c0c6c", + "s": "3ab59125dd84c9cdaf279f5fc7c542a3425017a317e31cfed594d48b" + }, + { + "tcId": 34, + "message": "bb23837bc87cf1352add3d24d74f17a1a5de6939464de1d06b998b622d4bd61815d6b1143049d60466b8b4b713b5ae6f6ffde4b895df236c37b4c59e8158eddf9551da85be879f8996ff1869ba198430380cbb1a2a6b6aef5c709bcfd36c047f216fd098e6e67b2a180f2400cf7fdcd383980b85d80f4e65eac06c3ab1b798ba", + "seed": "b1477077a22a0a84d355d883111dc2d9ec692a77904997c32839d1fc3a3da3e03cd6d6c848083175867fee3e686221ad8bbd5f4b40cdf05fe4ee1d6fb10128dec1c86e4cbffd6c2e760384da2dc21a560b52da83f38ca0190b3c8527926b4361c31208bee24eef59efc5dab1ac15f51aed77b11c3ba5cc5e50d950abe30648d3640c05f4eee95d174f9c4e6654c4df3636037463ea8a9611d6aba2aab7a07248cca1114dd677e0728cee39ed65c792d6249b736532ec9dfc029c1fc40bfb6bf75c31644426295af690f1515ca58c16d8610c0998b32a2941eabd0c6727a34d9d5148e2f2869d1f448a3d03739a206a2e4b317855f412bc2ace7435c6bac7e696f49005ed52cb0f31aebacf78ac4608a1f52846224f559e63a6cfd47d5e9e2298c78f536e8cb71465d899062e0784f86ae63952ec3a059bac9312b66d66c329956a93f64b86aaf5d1c16fef9aedbf523445838be85627282ce76298c1c297e4a8d3e37f843d5e297cf62b89636703e459e33dc653ca66d01f545c3584f9dd56de346723ee8cd1d8adcf11ac406c48ce7a2bf75498564872836b304a163e02cb82904f164fbfa16401f75a5c336e6c65fa24aaf5a724415f05146ada3641709f830332cc5fbca82afd39c9e6f6a88d57e1396536555c34ace36f9dcd75f78af3c6dea8d61108f1ce8dbf3a0d460a3ec0e1e371ea4eae2167203e504aba75a198bd0279480a29055d9c54b06fe77f89b818df6b128fb0ce78ec89050e517460df3c63333cb78e652a2a5fadd56e52bbd64434b720e11230f98ebf318f10a6708b1ce937f5378a464dc067c4dcf28a2ca5412d671da599893f97955de9db2a3f34ff60dd771e8a20f36956152d0f833e5c1fb97f69f0d47d7d44cc6e718e308d7b360af6d88b0ee35135bfd2561b6df70fe827d002082daa58865b99b4464b774213b173ffb8e55cf4a6c5852f5bba49b0de1a29fac2d91dab2df90ad0c091ff14d40700bf913123203119a24db71d61e9145786c1fcafcabc465b90a7d7352aed91b32b70e5aafbd35b8713e7705500ad36830f2c2bc06b01e6286a2e7b0a9c3d399f2e83bb7bd11165e666e044cf15e69e7543218057e6a2779e53cbe7f7ee5586b9008c218d4fcde13d78875d8c10ed9c179f847c53dd623d1857af3327e9afafb57e1f0807d72ba03cd5c4a2a29845be82ab8dd8968d4f5d454307c56f3e68f781af6cfcb32bdcb3b6426d95f4a07edaa1c023b74174e4581dc6ff3d560249e4e61286b0f358eef6f382a61f487655548e0f3acfa48ddb24f0d0a3d4dbe870d50134f7e722255a3ffe83b657a31cf343a83a79fa82781ab0880cac6e29cbcdc364f4d6b523d240a5f5158f2495f43af145fb0d42e97d6ff210c3b2403e8060fa99d3b8dbcd44b0e211e8c93d51911e7677529c339639fd87d1ae6f2459d839d1", + "r": "092069779af7ea3de8886b103c46a5af2fd510ca59e92666f4c3b177", + "s": "e0971f60aa30303120a9db5c14ffc2c572d792e74a5f674b0a931b29" + }, + { + "tcId": 35, + "message": "29350eb3e93fce407241e2592559a4369ef66b9aba8a1d90bd6c04e3008ae3282f98d810fe5d99ded47c57e76cdbee0635494ee58ee4ae01450d10831da3bdca294e35145fda7feddcfa7f688c629ecdef2286be550c7664ac38ea7e4a76d853e5e44a0ba9dd28bb07a4f205495a3a2f8c5af9f6f7a2af7359def188958791ce", + "seed": "b9f48d5d7104a4dea01a342b7e17e9980a63b8f61f86ef7e429136f1db55e236e818d0eea4aa662ed1218b0020661e5cc2b6bacfb8c989920fd246e6e1102d86993693356cc5374b8b59fe1d59217f269b4e8e520a939fa5f2034e201a4044c405619a721e06d2d8c988deb183a0309cb54ff7cee9660851571fe0a6d5a2043833665d77dde21fa7254fce28bde93aa4364974f0944943a8ab3d76530cabd1364a037fae3b3376c3c42a79e9ae57527c8b40961281684b010ee75dba3903d10615716f959068189332ae7aedfa65e5754a67b5d7c43142989cbcb3ea96bf7f055ccacafcf1eac0f242e6f53ddecd67dd2be0ae68fa1fc14f9ed52392de8fcced4f98257710d85de6350f1325c82a1d4a1c2c25665c83edac02555955af97f0be2ee57f2c7193983685613fe2baea4b25c3d5dc0193c0e22c7245d8b47f20fa31de1be80ffa5cfe0a5413431b29d7a64e92a3325d7b8162417cb349d4db363fb611354b93cb455b92628d47233d2b784eae52cac26df6119a2d2a64aaa409bba4d9b5d21147bd2657b3994796faa6df402672b83fc3629324a61efac376ee743bd430e314c39fbcaf686f647828b31af0cd031b8ab94310d7c196cace01955fa7d3bdafa9b14c6af7f4adddf30a526b7123832c6746ca679d3fe3087e1c2e3044b2db7080dee0c056e48481605256c3207469156556a4b997c73cf95514e2e19b5f5e3618b9e298b566bb02afd5cf8e9d98e29d0493c2c9ec1b8696961d20fd6b221b61a553765513f165ea3075ef25fd1e25ca5a74223f8e4e301abb9622a3acb420e3389d8ceab3c6eca8bb11eb3d5579e081aad733dfe36f754d242c4daf033d1d2be1e8ccff5c69dedc2cef22f3f898f075fd49acc096ab54f496ea7de3f603d3a4461b854e57850062fbcc2cadb131efe9e2ddcb7dcd2d281945bde1bdeac6388677ec22a965ee8e13a4d7151d415d0e34da797a973c9679e7745ae756273e2a1608bd33004e0b8360f2b2a230547a6666853d6a634a764c0fecde0103d4435b3e342e8373a624e397ca4053da7f46b1539bb25b8d6a6a28404628c2d4edc8af97e165bbeb901e96c7066e58569a7598de87c5b6daa8ed81d2dffb0b179b4f1c399167de1f06895b90f6e9f20c7f5f1e7186d6240cc127428562242257dbb46cdc977e929a3103bf033607e858b52a748a9d468a588be09cdae383d62ff83573ff9390fee18403f86c1404f1e3dd204f40f6022118e91d64efaa53592bc8c83bf9238cc12679eb558322821901c7ed8baf9df2ed178a547c219fa823c3991f48cbc677075167d9dd4c0a9143d99f5cbc7e320547818d67b2edc336a1406b51fa4597d68bea104c1a4fb255765e399ced5b8f2710058b8b9cc67326ff3006480da69986175b193e48743177ca54017931fb990f1f4ce7d5de58ec16e01a87", + "r": "bf3c0eed726c8a6b90549c849a457bb65ab67f6b96b34175fa98503c", + "s": "f5b545e6b86ab92a99ecac6ddab6cbb1437afebb821983cf166fc4f8" + }, + { + "tcId": 36, + "message": "2baf4ae8993c8107673d7b56abddf2a3d6434030eaab90f39be7de5c37cb0bad9ace819f8d4d2e8f1641a6eb0a1ceadd5e8dc0a285c7adac4fd835c8cb98490d28867395ba503196e6c6f79757dfccd1b0a9f480d934340d643bf0bfe415550ed8fdcbd7ed9a87530d99d6bad511e83f971add20a6210bf45d613042a43e30bd", + "seed": "53b5b938672405637d0885c06037e922f19814f33e4ca617a9fa1bd5f57489ef3bf3039342974ff1c176a5e239b5f7567290fa40a21059528e9aa4a7a0cc13e69ee20eadb732b44bdaafdcf132537c3f39e9e367b6e46536693bdb76a6df95a465d310bb3119bbb3608278307498881492c0db353e486a7954e6cd63b3bc035b4304ecd510c8aeb542e22cfdb87f00cac9cc2c35ad4fd7af04e3e38f0b57ea332e3ae5bcbbe20a0d1d3feb7352f37c2efa172c4d154bbcc796760fe7bf40941f1da7d394d956e6f656d3eba8422eee055785eb53f51b6dba65561ab3a589eda9f9b47191795b18546695755e5d090d4f87f65620d5601b875699f55163b72dbe11d28f5c9c0d870e40e30592e0bf56298869a6247dbd7ab0e36b5d23d34cc9c916e0131e4de7dee11a3dad4127b4d2619d0b77fc26c8f6f68ffb19f7edeb9b9b77c17a8338fbb89fc7e726a5b4a09f9aa476f598dccbf37c154db2e0760fb1e356e5ba549cee2c3c686f2a86ba0f28a944bd63ad0c988f6e1ae0a34ddd78501d4df11ba3f8c164e4262cdbe5d324ec6f10dc29f3ec8b205f3660e596c74eaf420dd910717b5892a1d8274037c9889a12d75d93638bf13e201d53416746e4feaa04b134d25a949c2d6406e9b72e064103baf2c2c3dd2f1b2a109adfc4d91f7f84d146c74c095b9953cf1291ccba465c2c8e75587551bbdfa571f32604ba47172e480c218d2eb9ac3d237cac80ecafcfa60549384f8c4bc22d3b1c3fa15076a3af1ed758d605726737e367ded79f4dbe20661fb8608970fd61e7c0e2db7b240ed0b8189b6f37547e9587b3472f0d02a6a5f52de738996eac7f12f319627c7cde8799d1db28ef275f9509e519bbc94c07d7e1acec764bbe582b80a2f9c148d7ef45bfee6859885567f70390cc49faff0294f7658603a4889fa3387b9dc7ec92c91f9434219058da7739101751b670b6daee1b401bc5085e5de0e1f36376a222ce81d6b87a4f2b6d2bec7d5c65e1889041e3c18a34fab0b602a64ecb409e239757152613fa3f642c19fa7cc711b311f44f0da1721805d67c8fa005e76159f78de040f4e7f3497c1a3ac73913b8294ecd5e40987c672ed8e3b513e41117a6456e9dbe681d4f4c9ee159a11090ee1ceaeb1319e15083c033fd7fbe783ef16ff4b6a918c57361de5a36bb89907064a8280a765c30e24acff9c8551275cfd9cb882e53644ef91b5db5e5e7c764cd65713fce15f0cc0f87508e3b0a393bb4783b294c93c904dd69ad937bc52e5e2cced18bdaa6520fa320debb7b8df84e8c3e0b9aa66d9186caa4ca37df37fd3bae3213f7e2854548b5c3505050392a5b41b680d676103436dd9a4706d262c6b231b18cdd43011b32dd60464c5201d6b20a3d616362fa5351a9c77b19c9f502edf93baf53870dcadb85811ef675266ac03a0accf53e58d2", + "r": "db12ed27f93c2671da56fa9108f93e1e6647dfe3b2e5da6e4858b8ed", + "s": "1b112a071887f0aa6a5036284e5ff16872728802130001b61e28bd16" + }, + { + "tcId": 37, + "message": "0a077a922c57c00a67b737ec6fa7668ad19fb92c6dcd76e4c52925b5e507e1d3db6494bcc2b37692aab3c40d62090e2626bad9b64e22139ec43c46a2e96abe2bc499f67dcd8d44ab56084f806c3a210bcb0e1fa433a66dd1e2614a075ecd9af93330488315d935465e0d5dbbf4f5000e43a56f8363f15c0c1d0b5702d3a3b8b4", + "seed": "c42e01e4356ab1fee3c96381e96d2ce266a0629da94e06ab21664126335f889f4cfbafc413a3dc21c56a3197e1d32ae8131ece285018e0a521c0fb84d6fc369adc90153c372ca807bce0d7410c1d1e4d08fce460f58b9056dc3f7f737879a257fb58f21311435e578ac4f7877463c59899a42fce1a2e734e23e6f17753cc9880dee39ce5ef1cd1f989ec2ce5550e60e5405ff8fa7170d59ccddb33e7a9ce02afd459cbc07c601151326dd0e767dee5dab6bd8be2379056b3e9f3afd1a2f5e56ee570d268e8452c8b0ba825b54530d611b7763121ef176c261a898bc49b4b20d9a086dc0aa6532c3750b801873946fefc7493c33cdd8ee7255bb7ac3655b39eb4e4d20dc83b3718c153fa0dec6b761e019ad073cbcc39f20097709cb5fe46e0d44d1737e172c5b0d6f24ab96b6846bacbcdcb4645974b88b25a835555927defbd1d5c4ab1b4f44e389303a4b25df666133180c9190d93e485287971c9cd03901ff4c32efed7a59960944631ba94a6ed992228d9b094d3337c5336ef5968db0ebbd31e25279182dec4b9f9946aeabac9a85e4391d7b06dcd2a2f16c20bdc0a618f23f79466f506991ddab42efb0b57a1036afc4072157122c90b1bebe98a85906d4a86ecfaffd05cee10535bd203f59015a32ccb93ac287970fcbaedc6e03295ad6df63cc6e95c10b102a7baa4d9712d3a7eb01529e498336bd664eceb08bea6dbd017e15344a5324c67a6cd0e8eb0e72f6df49bf15d27f8582f88a030a22b000f8150451557d5a5fbbf878732ecc277ed7e388df03c0e0cf0a3ba03f6fc5f8c75e6c3853d39f84054d7c8feba0581ef4e68c3030d24fb4dc22d577136cfa516defe341e3e33a40f9c9366d3030cede7eb886cfdce2334f7ca154ece0b7c60b4dbe8058168d43a2f60b220bba17966051c218f47cf18faefff223495e149d3a023d5fae1988b58377b1a8e10cb92bbf1d975b19d7bfd7e6263a96823534e30576600b86095bccfe9ab90adaeaef93746c8a4ebe0125d19d28a082c99314a471a3c585856c84216e0b1c53ebd1eecd041fe277aa7c5c933839640b4fcbeadb3acbba501db3edb32c3394fd5cd6ace36630f1e8f20dab729d4115427863cbd2227796a52aca744a1bbfbc1615c3aab2284df1fced2b0257ef3cfee4a33dc7849f6837acfce1ecae34b1aad68265042897cb06e07887072762eff8ecade88da7561e160bf5ccae6ce9fc57c9cfb0f6d91e9f65614e13027d02678fdd27950c9a4cb3fdcdb4a491fd319c9e7fa0c4613bfd4f8236a0bb0001018beee527ee1c0fa14ef0f8b60faf3dccc4dc7293192515423c83a14be3c2b334a2669f713c497e32c1e748eafbf6de2c8ce2677f7524b01fd861d4a3afb73d92401129b0ad4b0737073e02375a20e197ab861c3ab2bba9d99d53fb550b2ed8adb6b2cb50e821cf7d4ed", + "r": "a439c71504b2ae9c1a95ea75959e95893a4edc2ab19b96d8c6b83656", + "s": "c2e43439145f32efb3f4b5b4e9cad388ed869173553beda862daa90c" + }, + { + "tcId": 38, + "message": "86ad867492a83c46eab7b644f8539d3e2956e7f32fb08339d12f78024e392db51919158d618bead79db09c332957a4a9087e003679238b9c3ae8007d80daf786eadf9b9cfda5bc298d6016bb4cbe22d1acf8dd45c01795b5b513321eb57838b46be8f14b2850a2e5c3c04e0ed841af6d07b5f5b98e636edb2bc4eda08b80eadb", + "seed": "e0f83d15c787de21753b9155bbfeed755c88fc0034c085d1c0ea78825f7e605636dead2cf7e6a3d1e48fc308b801b0e225cbb3aaa5c54e71e8035cc42816e51256f18b0b664b41a1364e20664296d75e88dc3c2c430939eb9efd3ed42f639de34a7860da962f9350fa342258ea828aafd09f0b01ea5c791563f6064bc92e046080043c51f03093562cd461ad63a9f05193dac5a3218895e8b947427f78767d13f790d86847ef4e504a894cbc257573e1ceb26382229319bf90d972afb78c98c09f56c8bcacfe49bc64d29cefcb3717967103212b2135494d0767e3626913d24a1fa618b8758ae81285cd436978c0a29f66c6cf6ed0755ee486dde857322eb5a4f51e87b1e543b4f0f71945e20d1b92037c4ab1ec9479cdd64d96d53fa71a829bc802c6c3d42f2b1323c12175b5aa9156734689946a733c7bc99fc268ac72c4de41d8095b8197a7265aee18bb059a569342053d44273cae18ab3091c0cfbd076b6663ed18618eec0ab870fa8777bcdcdd9b1ef00fe9efb5a776e29e585aa5deee97e6fb6f5b8f9545df3f770e996f5bbec4548cd79b6317a4f13da35d363eb27e497a1a4ffe68849fa297dc74c2d4fc57281d9b1b103aeebe4947f5dede907db17da0d56f1cb8d563df5dd962d18eeedfa98707be5fd3b2717a47b2379ed1d99b115ef0db9afd7730e00f6c92b362f9431f7f0b2213718326a9b3d2afb187ab3c1f7510171da53f09eb4d2df3cc16a2d5907d6242915948f7556ae4bf4588c79f0d0e6ddbaa642e5f9588d336e7e79b87f591c6e7eea24298638847fa2241b777563c926e0665badcd75576d6ef9b2eab5fc051e9504af60ec0d26728bc5e8a9f15e955170e3929521efb0fa100ee8d5b455e5eb8183ecfe496dfc28e6b1d1edc7b691f12598f24216889a711a2b09ce1d989d3639353fe9af34e3488802f450ff8a24e783a18fe61530ee8faa16a4931d2fda30b20e014d3690786c94f47fcff875c52df28c00b16c0fae675134047209790cb2f2af590de8fa685f9f525f39c57d2f30e90a6a89267c36c8c753caeed4c91d5228972697ce6105ba4482821be199ff3b09b2e4589ce881ab2c17cbf6c0defa8e9b403d297399295923e1f8f5df929f8a29b8080013714b1c6fd7781c2a520bcc0ac096cd8ccfa89c060cedd2bdd255e7fd222beb99768b69e451b6877c0bb9ea3a6ef675e29cc8e5695e1c50dd678e6fd35bec0f612db17ab614cbea99c2b76c29a97b297b7c0a35e8e7890af441d47db0691c8cbfab3c07274ed41741f94d61381b71bd81dd840a80b80e91ca89e00c2c92667f2c3c2184ff8ba971c16212d22d4f9715a045cf38e6147955e3d4054144e3e2660f170daf165908271246a20252e274ba1a3d75c5e66149d04f78e6f376e3d8473319ecc3a901e6df5698e58f8577ddfb5b66ffc7fbe7a5e42", + "r": "37c00a363cc06f9ad1901162a6ecd55bef99adea22201ba74b2792fd", + "s": "69a573367bfe4194228e44a3294045ebb73bb03155c85dca941bab22" + }, + { + "tcId": 39, + "message": "0bb6565a088a1696c9748173eb1ffe6a9b4f5a3777452b2402aaa396f5d904ad7b001635fc7d9e66d8ebcc615981b8fed22340151ddc2a22ec53d8a7f1ee8296d5dbf5a31ed18edb657813a1681877da519485776fda8871a434068b5803deec8c3479d15c0993589bb0efa64dce57f3de30aad0db0fcb4fac51adb229298b54", + "seed": "d707b96e4fd6012996f19d412e201782081d86b3f9575200801b00391883c0de1b7ba27bb05d5c7796d6661613651f5da660288f90e8415a4811649bd345e4053218457be29e0ef703ba7f32f03aee650c3dbdd55f3f8d2aaddbe240c2211edb023644a395419cf2ab4dfe038ac4b771eb79d5513afa73af9ecfc3ce0dc429ca9b0dd827a82c998a59e8b294bb3f4584811889335b7c17ea67c4bf4aab0cf9d9020b4458a7f9af74c95724434ef6b3175037ce10fd00489d20b01adbb4671dcd143bd3ec1fb775114f591643465ee55d31b4bc2d111b4168fd64dbcd52f69e92f6212b4957591174f2af4e4c7fd87933b9b82b9d86ea81eb652a69fd526695544f44cb79f317c0fbdf722ae21dc48d3e9155756f125bb54fcbf42f17fd76f02133605e70bac5262f78ff59e69a25e78a7638c9f55374c7b94be1299848db5e10e0bea588d5620d04f4594d0c321fc602f0661b7958342fb5fe41e6b44876001e303c8dcdcac2ed97e1df68b2c29374f3301c3f0c332d424ce1182e16518edf76e0debbb7ba66a357c02ce38eca3f81cfddc8cd695f94552eed08df5f767375089128611afe91f8ecb388f24e00aa7c6832a290590bc15b1930fd186a529f9899895929e814db5b6f1eecea0285f277bad7de793a45e11aae8e7c79d3c290492056ea2f7a5b93501340eb3878c29ce16deba8428e342bcaf204a9005bb50601b68e71195fe57abb5b9321b3f87adae355ab93c60fa5b8ab7a86d217024f3c4023baa44dfa34147f5a56291f2f595614c136f4baf64132e780c640f96a13a4322e8b89decc5b09b63db5e43fa9354e8351bbfa90f1f9bfdce45ad27535181f69672e68acee9cb1eaec16a5c62719ed699ec10c9266b111293e47f140f6530ad20febffc784257dbe512645a84a51c73e0a9d8a7b088966c2b4c725fd35e0e010cff2ce820bef0ac5f8b07bfe82a4eb00db2242be2c9419fd46695bbc3956c28965a44e0f22e941bc9b552a3ea4f9adc5b4a8ba858921b31a0d2def30046ca00b8b157a54888a8e24f627140fa6f95f866db10a863774dc0595ad241db8cd0f2ce5a6e868a468b2d4851fdf745ae95a229fca1ba4969be5cf84763b36e35b7e6357c0e75a704a3c1caf69a6854128a7cd77bbe329662939a1832b4ad2a6329654861d52d8e50c38f299c4f48d4922ab37b8b0eeca4b8e3e77a4a99f8f60c7c74de0ebee552193696c9c02d7141ccb72db980e2d7d124db15611f29bf382671a95b035bb288a2b419ea89abba86be9776514906284857be4039d601107197a695f5b3d32bd20e629c2a316f0990a7aec04868f8d3787f9f4ac8c7fb3afa741f83ab46f6f6d588d06fc37398a7db63ab43f24264ff37bae911da789bec314f701c751bed645a1670759bf14fa6bc892c4af5db9eec999b727f3e5a2e2742df4bce25c", + "r": "a53aaaf945a0adc9092d796ba5d645ffdeb59b586ab0fe3c475d168f", + "s": "57db7194228b6fbb91ab3052f633eada329e2ac64f1f5284d0914c25" + }, + { + "tcId": 40, + "message": "9c24656e1f07c1ef0022fc79de07bb8fb0699c6c716f26dbe140926d349592100b1ae698958c05996c11601796f990697c6e40b5cd0b9483bdfafb24a02e00613992736e7138fdf01e6a7805f3e3d6dc65339c34f6cca37f8857d0937c2303e51653fb6dd6f69c19a33681708a1ddb8d8e7748a41316b5350049640d51a0279f", + "seed": "d77a88b6502a7d0d8979e49e3e3002318b4c07c14260f65ecca4ed31d51027f625ea8d3d0ef142abf218a855527dd91ba4fb3b91fcbd8dbcc72f7a62fa7e6194f183d21406e62f02152eca542cbb4c97613baa72ccc7b9630e86eb5d3f068c687c19daaa91ade29a799453c22a49ebf72b4023538e35efbbfd6f3bf2e8f3c13d4fbd47cb07a1f8b6036f350bfe8282d9c84403457baabfc5e195157ea07aa5678319f04d999eeede1c4eca0fa3bfa96c75619dc8359483d2157b7baf0dc5b0cef6a14c827d929739969e5076d3ff6f12522f80daa630176cd263313ab339259fb9fcda07aa5bd217b0c4a0ae241fa9772256cca4116fa9da938b6f09a68b3aeabbcb841af3d1753e1a285a28c1fd4609838cdecd6c13699464bc4dd2359de68dc7b4eeca7748f212e453806d008f8c88cfaaf6e4b5db67c08a0a408cd1ffe91b7c496495708014eb22681da796f468495d626f3d8fa0d9134394a5a5dd30664c33a89d96175b6cfc5a8b9d2930dd4ab45017577b4e6dc9408dc25cf61591ca9ac56c0be31012b409aedf5a39559d3ca020250db46df39a7e0037c088ab482f92180a4db80ebccec34ad848ccd7635f712b8b42d6db04e1af0164adde4e1c067b3c23573ffeb3611abdf59d38521c6de4cae778f7da0a5ed2aaf6973404847ed2c08e438945d277eb189adf55844356e1aa64d7e20f99c8393631406e8b8bbf48337fedef3a3b35ef78c4a206c2e21ada4fcecd41c0bf0356adf16016922dd63b36df6f013a739b0ebc9c4d51b5b98f0dcb9c93bb219b12ed234fae2cbe668f2ce358abe64ce72efdc1b3f980f90a412b9b47bb0f779b45eb8da60618c7fcb9a93e3a8cfa4b23211b2a94efeef242e94c9c8ef217fc7be50fe4b75f9f7e65d5d1e026f489c4bf5ff719b78633fa7eb7c3cc5bd1b3093f41ad75871bbceb84b1f2a44747ae83387452a766451c6c7436c98bcc1b21a365fd198e1c05265fddd6b5ef752ac3c98619ceb92f6b8336632b88d13f79040566d8f94435d8e0c22d9513806bd2f28ba301982b43915bd7b83c57889ac55d71fa504198099e15850a15700d6f92cde4ba118020f1254c045884f9af8d2d9a9e4f7823991153dae869b6033d3798e7c11cff5789c3f6b0ad83a89a7911f42b4984c10b70c70b59e0ccb0518dd13c3c018a417ee5f52f06c44c3ab82265079e2cc0c0bc6060809060937f993680fe51141a7052f317b96cad2ba52b7268d8ad2205d73227000040e1947ea08c3685ff6a02fe0c59a68db3d40e95a7c3ad2674ba4353d5dc41805e5a5b3e84faae167f6d4a9c2efb288d867bf809ac28ac6bcc6603443dc4d6fd531543f437c4b249ee3396673e8abed3486cafeac301c41549a3b0dda5d1b2d57d8eee5060a21e9d3dd3d5839b6e8bba358a88b761dea20f0543db49ddc81c4e9f37c67795", + "r": "e2c82a5d7610270921e88208c98e58487d1c25df553a90e006003e8a", + "s": "9903ebe7d6b7110048d4a061bc63aa0bb3be0c68a378c3eebb791a6a" + } + ] + }, + { + "tgId": 5, + "hashAlg": "SHA224", + "curve": "P-256", + "d": "92b7671e1f4a1958e921e6ad39feda25d83d84dca00cbf1d4932fc9fd5a8b93b", + "qx": "63291b4fdd62ef2b43ff7e587aa25b2f4657a477c932a230d165279463eccb8f", + "qy": "ebba55e8fa0f42de137578887cc79fb9837b53634c489c75d8725b539c07931c", + "tests": [ + { + "tcId": 41, + "message": "63842c9b63abb7ecfec86696722f067489e4bc74c7255839ac2444bbae6e4677e2c6503785f7a8a2895e7295c6db061f43db328c6db487b4bcb1930c4d404a705d2d71784e4a4fbc712a294eda15eb3f3092fcf9dea3a4543f9e81d4b41accb3ad4caab11a36b13fd411301208c6533d8647261af3f8bc07de8caf008924cea1", + "seed": "22fad0b74cd97abb4dd8d25950721b07888c5c41b6ec9064241a45c54b2cc4efcab740aefd85de2eef96b78ae559a76707a75bb7d495d9148bec913f54c7e3e3feb1d344239a927fc37f7978cfb3c51da294118306a9d4aeb13e89debc6544ed7344da8b84316374c435765eac32bee0b26b325b22c8a51412d38c92737a89f3169a2ea4ce553112ebc27be99858de7b2e5c2aa24faa40c65a11b21b9d90c46b554a9902b5fb5c1c602e74dd2389c0acedf97aff9e720a2661b137744313b13189861e01a112dadc289e04f211f39f8835ee7cd64a96a9e9cdf3367dd507bcfcff4a8bf2acd7e93cb57dada97c1e7d2f3026f87d5c71e6d3c20d7f8facbb240eb5151975cd916658bb103a78440d166191f6863464828f4610ab07e0567a3fd57399e598c65e0f6dd2c9c67afb983a368db20382a174e6db4827861066226738a87f1c6f76c418ff7921ae6abaf32d3e2a4abeff67a335d40b5ab60f2521ff4fbb6b78a61bcbf1b08bb82d547f7ca3b40ca3582840a648733591ee77f161e1d783dd4ec7bb03ef3f3220a40f1768f350c035e401af4a11011b16fc03bcc2d7817a2b3beb077a4af262419c4dc0f5120eb0c8f0ece2652af3b0f4c6af3fb1d8daca2286bfa6abc3062b86f24eecf1cac2df90472d96bc49e7dc70a94b657609c7aa0a2b9c27e7e72271d00b06998f4132913b74e952a73d4d7b79697e26bfe12cdcf62ad9e584e13faab73eeb04f17ad805bfaa4869ca37f4a2f8dbf700b6f71d384ee3ee2c2670090d7ac49cda0d9965225eddbd2434ad4787f91388a30b508e8678b21dce9030bd75491ba512f26b2b2781cacee99c23ae1ad8b1b2f21dba2aa0447dc820216a45d043cb68c0319fba736397124557b5729527b1779a7a3f4a437f69c7ecd0c91238c431e7a5cf08a4cc3957edba60d7e372e41d211f1043b9df7e43efedc51e2b8c491058e95c2ae96e3bc8fd5e6737550653f9afd02c63b9ed990b47e49657aac810904848fd70e08e80b5cdbcbc95de5c33627df5f4cee12cc7c7561eec7b46a9fdf7a35182c508f505e1c765848c339ef62c94faa1674fe5283fd5f1404896744fa6602a749746e769df92339544379bbb404b0f39bac77274519e857bd43733392f1e822f2ce1209b23fc9d4a1a2b5e44a1600d0087e6c910a008c4120ddae6f5f20bdc74809c793e088b02613763f1c496a23396a3be743240a272004c41d97fe2f06f8b7dc78de31aff3641a0ec1a0d87a594bd364a21eb93c29902ab416382b292cae93f653fdb0fe8e0b724898cf3ccd683bd89eccb9f24e8cdc4a9d47be3262561ac7b942e999919427a9c7d6aa76af09526a35c22a898b86d5b6e1543f137d30fd3d16758993fddc59f7ea5731b7d60da11298b1995dcd918a82be0dadf09a8c2f1eb72c2406bfe3bffd3cf764438eeabe22517", + "r": "0687f20de0e49600caae9a6607323fe6c55292042761106f4b74d36272a3057d", + "s": "9303e26fde28c1e26452b1f704efce333fed64587c8417de6409a9669da1fcef" + }, + { + "tcId": 42, + "message": "8548b9aa68ef3ea383543c373261dc60ff339ddf6599f8be541c899a202f2c20c01e8252988b7109665bc9ac2378df390cb14e30707395089b5235d9f9a4fe4c0060b0129ae8124e630e53faa2931089f5823e1f7c2d8071311d3baad9d418b9566c403302d5bc4bd1cb5df1e4c626d6fc0fae125e54b94094b3e75734e319c1", + "seed": "f94856a293ae0727aee0e90e2e426e9e2fc96f0bb087f930b85377603147514011dc9c37da789b36e04e60dfa1fc26650c3771f041e08de8775a213469cdec161c6b4c5e4fc122ab266e476f46c950c53ebdd6fb57b3e23ac4bb1c14ae3dc7f3ae6c79450b383da025a2c6cdce25de14e607bd825c03b9b476c0481cc3ed9febaba70a375933d10990d1452e9ffbf4feeeb3c49d23f0e02e6a74d5db35969afe45d73f32d76090f6085e0dd6eb28677c70dc8dd3c38bf73f95648e0e3d18bb3c94807639d71fe69cfc6d0adb81335259eadc7f54dee00f90feeddcf384b760e3ef987fbfd065f5d5476a7a0cabc4d2001b1ae435872947631c013102826693f686c90d2b4a5ff5d2428a4f3feea6360ee063fed1c52df837cc2576b7d9671ea56be78136cc7fd1980abf25ac4cd267c850f0127deca07210d7e6ac1b165c79cae9e2cb15bddae62af2c01d1b31c0f7bb67b4cb69e924ce7ef09c65895e2862d213f777732afe6c2e069cfe6eef7d2c85c6a16402c825896b4bfd0e267e4011615040267267ce22a7c46e8a327b1d0976f12455be51ab0173e3a3fde01af65c13f0b66c7aa1c0518fd78ea4d565061f390adc5b8bb1bccb75c5482b1cb5aec54dcaf5d40e699b78ca69d670c752fb04bc45791cf203a2c34eb7d8b64328be7c7130e18a0e7910c68eb4187d0f2ca14d484ea5ba3ba2c45993b19818d447d535d3f7a33870f4b51ea50e3fe11804da3c21b0b39097a6cfad6b1c9e73c55d2d6ba980b5016f1ebc52f6aab74c788e096410141b0ee920e97b7d63e19179fd6b4d51b7d2b1d58071102edffbffaac9bc3b160c4a0ef7a529f710b94cac767c3ef5fd4dad342132ef40066503033ffc0cb939e016e073f96e6f29a4f7f01d3a805cd1f6690eaca47d8d31f2eb320f548be878477a9ebf90cb525b7723b6bc26e4143cee33edc56c39a95705db7fe4feb145ae1763dcc5fed27b3b70533078b5fcdc6ca7b287b8762a8b7820bb9653a165df6120a3bc3f55764e384d4f7fe4a1654c7a729d3fc41f4f56e91077df51407260ac527763513701d9b7837e86bc91a0af5b7d8d44d0c49a00fe9a90ab3bc7fc450e3deda550f81938390a8c3e22e60b0d0cb34a36bbfe4ebd29a333956b436eb78eff1d49d6bbb0a9b85e59ec327fc4622217626fcceeea6d990053be29b8de88ff33f358337553f39d7010ab15a959a2f0d87218f57f7b4a165ccb7bad950ac14c2d97272c431d699280c0d6b08f1395bbad9406530ef114ae1222165da864e497328cdb6cbc41cdf86af204a6cc0cbff4b410b01f745c4caae2312beb18cd02eef0b780465f152e97ded832648c59ef03734fa70b3480338e189d4c479e6b78eff49665c72c171ae95001078c4ee2e433ecef6b6592f066642038de4d74c689821c56c104debaec9250d2a69054662c06", + "r": "d6ea7852e03519f7e7b911560ea139ec30d41772f53a67923bb276251c539b72", + "s": "ec32ec62e326b790527bcafba288ed21377d31ae75074cac5623d1f64747c9b8" + }, + { + "tcId": 43, + "message": "453e30f4d3f894f21880d756d890a86909ec4610258d427678ad83cbff535df85bfdf562fa6e65be644b5cad083f7bf77807d636c425df3aa12a6239b7f93d752de09553872071e0220a3504c8e4a0dae73ac43dc88ad9f1507d836b4e88c99a502591a81a62323d459fc19d172fb82496b0c181938e9abe88b0b5ba5db680e3", + "seed": "fdf5a21112157d0644578bbb26aff6cca616444895a24964da0bffcdd0e13cb5bce73027a9ad090d5219e5daa9473d3fea752666e047ebc4ec032acd3d07fbf5bee279e94eeec8c6ef75e1dc569bcb04472e4fe4f83b941b3d3c465214f48ae2c2221bdb20d8d0e43fae5b8270ca2e5391c408f842d56db5dd149fe196c1f7d2b3a30e77be6c4ac473a1d7ffe6625ac445ed5814c2889d8caf16371308a98129bd3b45d2b58b9f1e668bd3a84cd7d70b6ed131b3ba9a12de8e42b716e0012057e327ad8400bc608df783c9a3f492e81cbb73ce27092886f37e1042039ef3b7e99a61b61b9e0095f68c4491cd161cc93553732755370db7332265e4239416fb85bee8fb5dd1ae0c004d5ffad9831e7a72cb7a822247e77a9b47bd55d3e651c280efd76516051341bd6a530c4988fe64feebd6dd009c09de9254bb68e376017508ede8f12dec6acde52bddcf73d8dff55ba1604923eaacbc4a35e71fd6263e58212c2c891a1f1d4235a288b0cc583c0bec8dc506a652e85b1dc00f411e3723a290919993cb0fd3f43dcdd2b0edf3743321d114ea93b7615dbf6f36b3215ddf26b7935cc5ad653f34de495d9742d7fd2f0520d3203dff7272400a121946fd59224db9b636f515a32d8e95bb0ba2467b5e0ce7f23be1bc51ae1bcd4ea83e815e4c59d33e625b314a373796350c16a37e46860f1de96695ace491b85d80c50a05be32bede23e5241dd0266213fdd1a93cc00277cf55b2b1cb80e64060f0549344ee223389b41ee9c980ff4406b6679e562148e45413ad3b1dcef04b09c15f5d5bafd92827251ddce3c13bc8f50832284179636e6d8c6d102ede72a4db243cb110b58ba489c2ec6b82d5517f41b09d159bc18f6111a72744032dac0bc6ad4f3111564432c4f9088cdf3a12e5acd3e8d6b31785f380dfe80812eb8f4f32fa7fa1e20870c074b5b1cd341d14b5028fa210bb547f7a427500bb1244bc5463a89e19e469796339c867494456ac80ca2953669c602c26e4df760973862f6e75c4167c96c50a86439a720bd9ea672d02c81f229bbe9c9f86049b1301560aef09960885afe6acd9a0c370899e8841fae22ca0dffb8a706e426b4cac9504ea16cf77583ec6cc82c34d16993e2cc7cbefb20d55eb98708ed53fa11c7fb66e14fddfabd19b9d6479d6ab2ec24c4a817779993f69c423df011b8a8aed9b09f26fe6fedab77ca3c5f6ce23364ca8b7baf20020b9ce199498b2eed44036c825ef70b7e7a0ddd7e00b991c38d62eb7cc6928c1cb49a39669d4af6ca26cb09def1bb83a0a3ece91ceb4fbd7a96f7ed719b92da265a502c9be243c2bf403f4b0a9a0cdc2161284012d31a2830f872e63a0ef708b0884dcbf4f79b789c203a36c1f607072bb5417e5297bfd22342d78aafaab7b43ab4787ccfe607ab7f8e94b290264259f5ff21da42a0837", + "r": "dbbfca99be996f3f755af6d84122f8cd798bb9641f0017b41ea5a0c2995078f7", + "s": "ec614d0118ea119d810e493e859b2063a911b3e35225bd2e2832d42f39396970" + }, + { + "tcId": 44, + "message": "fb27579b435f4844178858f98d47db21041605638f3690ae419f746a89a8a463d2f0d6ec4ed6cf1b4ce17466cbe9676a19a6b640e327d4d113a571127b94268bef24e3f5b2f5c7bb56e88a6407a353b2b1efffaf339387b6e688e215912604d6467b0a1f9c19591955e9d46bddbb5af5bb03387f6b6c06f943800e0c0e1ca52a", + "seed": "76a3175cf2168a55fff46fc2b3033dd23ada257cc4d9e44df6c8b0340e4c7b4e468fdbdb7d6355cdac36a39a2a0f68cf5a7b5f247c2ea014a24fc041735448a670dc1a5b4a82f20689721b5a5ec15c048706a1a8b447184ccbb48b3950f0bf73fd7c18eab1e7e9aece7e775c005c167328271b95f8551ff06af9136a8654e2ab8c16126535847a31282984297e274fa28181f08225e367b483a4f6195f99011d18c6def692cff22b4befccd14587b466f0097bffa3b744602d069f1e4046bd9563408b13ec260116dad9fe7a27db0eb37aa71171239d09f391cfe84793f36c0018b36edbf3634e9355fd4be42b103ed7365822474a94931f69e773a70b8059d1049ce9feb2e887c03f2c06ff5629e9dc615274eeaa3b4b390a93b6ec480a9fea65dfa4509c653ae0a33263c332924420b5656f5d764dbc929a5b353216eb9868a31bb605137651b47299ed608e8fc0fdb9dc8f6e19c07de9fab715555c898f1f0ae0abbc671d008b34d810fd7db9147072234df43993fdb1f1f4219d7065fde79a84ae45c1c336bcb2f069415018c06d4f088099344771425bb00b43e18803b63fbfbc106b4043f71f712ef707586115a464ee81053c5199cad14814eccf79ad341e47b741767128e3a2c9d4706e6ff09b4785379f39424f7604d966e08601d7c8e9c555f8db6c3175fdd340ca010f0dd16016586f1cab2f32dd36b7b02c12edaa386126bd6ce86bc05df76def3de7b6e1d38a466b876f01f92e019f201794882de399b93304bf201b3e3a7dac3a4f29c20f8da99f0edc0b75fa3ce76041c524c97a5c5e49a9b366b3b961a53ceea5e4b33f6030ee6f4f955f1ec1551a187aa32d7fe6129d002ce4d5012d0dc2848c4b5f1bdb37c7369756440f1a441c7325867ba32b42d9b646a32a246c8d626cd03c3fecd1f140848227247275f4f8f8582f7b529576c16df97a1ee7cf45f41c5baaf4e76a65854835a11c42a59bab9efaeb8ed83df470b40a8c7345845fb39a21ae088689d3cf0369696b3ab86c27fea8b4e3322cfc7df3be8833a3d2b3cb8e5b05cf88235da459b13bfd86bf48ba0789f4e7a48feac7e16f592ae542725f32bc5f318aa6cf9e23359d05951cba84116f9bbafc5af40531fbcfe5635da790d6ba181c00e77da5394a13bf73ad02c3d18987979c217a0fee0b1c5178a78fa9526852ba4fda971ecad4d9b1aba6c3b0a410eb757273c22ba70bb5a6a49bd27dbb1c861336a8585749460d33257d6ec57d3d2ee8bb893b652e6c57322ea47fb3411ee597567ccaead10820b428eb382b37fe74e0872e5b1e5d4be750aa63b75b3d5aa17a40a5a64feee1e0c3eeb8d889058c3c28be7c4273857e7c8c5f915ea37e3c3f7dc9f00287e6e11106177cc580779712208552f437cc7ff565ae31ad51229978525e1ac283336157a9bc2e6b0a6243b1", + "r": "be253290ee89541479589e99b4ba6c9981ccccad60b928961c841ec919e8bd4a", + "s": "459994858f461b48f5c74b1e01fc3ecaaf122d06186b40a0ed7580d92fcf611f" + }, + { + "tcId": 45, + "message": "72eb77630c0f830a8fcd5d13961d413c87f76ce0d838b50ddc010fe112dcd7e70d7024cc2430e01e90521397623ed86e4e16268bb641c096b89b94ed2d135da264c0526e8c9053ae82222198cf6da971ef3df5707e3ca75fdfb05c77de6340b1ebe2040cb0c7ac4387a5c75ea1a047141373516ec5498568cc023538d4da534a", + "seed": "3046d9d19ee4866abb2c83335349d12a10ed4b15347a0daec35e20488f4a2aa3e7bbf9d12c17875fd855e920143623fefac8604bef68910d0c9612cfdf37733f91c97d103cd84c84e007e77ea6b5cddd8c90e9f022a74662c03a46e78c9e108c717c7fa4fa655ca4a8b4211bdd844e68688f60a76f28a3078a82a4fecbc0286d81c6044614d3ed841f115678cef5cce45e25d96f6e6a34f3b5f457d39614a48cba73460a4e4a045d6c8aa780e23ff5915040d23732f57278da075691d5840aa7e2815f9cca1c62946ee2908897d61f377ede1f37673aa3e44905ad0d7c52c5d51fcb97cfad4236337749e6728c93eaece5c1e42c708d91c309cd682feb763d5f2a0166d5aece1ad250d5562626151d11a69d0209ff02bf3fde37a3c3d51b4371c425ed0024749c06ca87ead28ce9c1d3d13c78194ca42d0994e238b192ebc9a4e3d4bb6c2a575d59989bf9055514071766be57375150f2ff6ff8c8405307d813e24d5625fbbb205ae5722d8cc00714f870593864f5de49495f75a492221fdb707a4251977327c000e77313fac3704edd7cc01349310d98b88f7689890d4304a78210b14644a8780a2d07d281518e4559b3bd17ca21abf981d90673a8224b4b44aa447a796e68a7631dbcbd4b11acf9f026d3e3ae226890545434d3169cc79e41eb473f026dcc0a788af4b62cfe0cec8c568331febe26f5c8747022f9547e2fc92f5a217168598fe02555d53026000c0c705e786355272af39a548c8b1214f64f30242796b9d0a421bf827c1a700b46ffa93d02e877c751fb0a2c3c2825ebeba773ed53b02c3a771fb407531b6c38f751d55d6b33ef96fb8a91abb672e172895fe254f5054a59c4dedc78a47af8b0b02d9eb8290810a3548d61bd722999dc66f4aa80989ce7ba5e7461c3dbf81501c8562881ec319c228f5bfc6602c2afd7c9ab1a8edb6715e75835bc03150eeaede6324ebc9d4d9d8fe8109022a8215a31c5fa0b2cf975bd7153f0077197daf7fbcf4bbf910960f260383ab6304d60a96cdbeb5f7ea39d4f49b63f1acef79fa4e053d84c5151d2d225063cd5794528de6f06377e554901e386fff8142fbcef87104eb7a04d966b3f1a97cd2663b51e4c7da1819794bd00dcf540d30ec6ddf45c6c3e0f0e2e09b2cb2b61a469cfe920a39285c59ea07f400aca352688f8b62eec4108f1a3e55fa7ab44bd3f35911c2cb29c2520955cd5fc6e5005f42fefa0196edc9ceb1644f0d344998baf7af7249dcd02d765601f2c23cbc856169684b1cccb0d636b84b5f03274bd626fff1d1eb865e1f95e038ef73253d843a94503b72bc11aa5c272707b63b72069a51a61aa67a7c24481a25f9b9626c4fd860c5d567325b46a1a0cd6a0331907a728ff6085b1e5b93c23101ec2b7442a18f3c4d6dea2f3d0348c76558c82c897392eb7064c3d6c248faf", + "r": "b1b3cb775a8b0236c91d88c9ccd99d1fe3e163f4d7f1b53ceeb5de2d9c6b7bc2", + "s": "ae1c1cb3e67be7bac3cdaba29eca4b4403d8ef34ad446ff1207de172b28ed357" + }, + { + "tcId": 46, + "message": "0dfe1cbf20a2dd3bee218e6dc75cec1b6f905f10799988a769c093e46ec4c8ef1f8a1eebef274500337cc44e35f5dcde09f791b227bc9d2ce90be766a210b7b370c462a33af512014287cc16c572b2512735f5267739b4822d59e001298887ff928ac1e8460314fe1d09ebdb3ecb86ca0c10ee29104a3d31aca8a74ef42f0a2e", + "seed": "b5e3ca66a9af03a49a68a4c0df448fb8cf329e5d54d65874bfdf433b7b4a7eb741b00c5d90ce14250d67037650813917e46655f305a01c5b0907206c68f51ce3030917c782156fd46f484ef9a905364809c5ec24f089ffb8bf98eb47d2660aa1edddbe2672ad7f3181b8637e50aadeab4e6d83bcf9d060ed26938ba26cf486131e72fc203196c12197285f0c20d3e8dc540e5bf9da4bafd3157619c4498afa80291ee342953e8a48a3d3e6af4bec09b5858e942d1cdcb4a8522573a346ef24e37e60ee8ec7d9b95718ce3dc65943b7d1badb8264ffd5be2f1fa21149cac6528398031a6d3bab39d05ebac7e47ba376bb54e2a5e1f5753e94b8c0837387347a84e7e2dc05980113bb1e0f7b65578dc6b0dc7f087e5e9926dcf974f3011ffefb2df1105215b3f60897d1416e2d45aec6a55242b01dd24dbe39a647678572485ab7469f159c7fe93604265ae858e6780619b1cb80b2ccb114957748a8fce42c61b01e59219c62791f91d2d48217cfcb0ddde22eae9e9cf40617fbbb4cc9efc313a3db7d9b735b70ccfec7de54328ae039f637dcdb751b27c5530c9f8f9940c1f8e1baaefc7c1d93f1e72fc2aae5a8ffee1d764127901893c5e815226adf1c90f8801fa749c9f9d5e77082579abaf4454586677f6243609f093feb2bb6c1965d1ac915d4efe09e49eeff6d1a81fd3bab8df63c973c9e538deb81f2631e9f20390c305c3de74e1f83ebc37d66927c036c003d690ba9aff7792150329437c203152f2a62ad2ea19c999097314ab02c2ac980676157981a18b73dd67639f03388c620046735616e10f1218cf67f20c29e673193264b501f1355645c6fd20871e1610c746eb6ca86f674bab00e3c6e8a4b0f37c0d6e2869982860e7bf69967974cf4b181e9b45c339080bc89300b21b0d359b73c323ae3a7ab84564de0de1c2769aa72e1ba379a2382b09a141a4d89933cc05d63b0212388075e5e43711d6fcb96d7134488eadee8aa93cde9c1af99d726110baf1d4d429b25a563768f8fc766b1fafad44925e6fea3d443fa7804b36cb98580906be56d9cc8a2c6bc5d5938095ae9340d53ec9d5983e1b818247c715363f1ac8adee938c0bf942b8a2a1d0c404642f4628446cf3992c2bf7ae5fa76b6403acca1e85893567df4662fcf961532c194a2d9767a2eb34a7b3e5454229f911d0273a5d04556ab4936e90e09e28de9111a0795a9f0206861889041949a5f1cbb160596811b8cecddb07e0745c49a08bf1b33e43ffb314d76fa3f82afbc629cf341e5b0dc745bfab54c32f656ddc9fd9e27ca9ad7854a787c488d3b07fe547065c2070bb15d6e366767388400d54c8b71f292cc8490821690d88b3d5e0adf626a211e6355b96bcc64ed9c872f5c17fb658b75793fb77ee849572566576daec9dc761635f0691dba393367bc182c5c72e10aecf5", + "r": "27bf0024a2743b4fc68ebee606e3fc2aa934a3655d97306e528ef0b5ceb2115a", + "s": "c4b2423e3f7d7b7e7957df922a9f5b147cbc42106353bb36d0992fd9221341c8" + }, + { + "tcId": 47, + "message": "8fdc80e7c889b65078e00f8fe324a3192b20e56b03f911e7171829bb060259e0e57b705ab955fdff176b2027e727effb33c8191638659800373a3cc588cdbc9807f7b6d320d7e145371dd19cf9482153deb289c29b61d79c4f90319b9a341de9081a6f097bceaebc8bb5771002e79068d6d7faa6b7c4b3770032a1ce946dfaae", + "seed": "e47b9ec90938acce357a8328eb942f4845787833fb695d4c45796d5460ea9a6ae1fb77bf5f1a811381b1dbd0342dd3a92b7128e2470185feff3c153e09c9e4975ded9163a4a322123eb802bbc31b8b3342c0a84beef1d478199ece8de3eece8ce246a7d3f8c4ca754c1bfffeb04648dcd818db2c47649945d2f959d5f04b39027eabc7eba91ac9c02c145c0c7266828cffe03e011de17840c31e5f4d179327735000ac68f672c40b1daf3905cca823acdc78a5d3c0260d5853da6829b9661b6da48613cb52afd6357e169ebc0881eccedfe1441f4d618a97866ed4ed7943ebbb41359e755c71f4c095f686c4c18cc35526520a90913ef895ec1b651ddd13907af53e2ac3a0b4e0b6cb8e3a936048d9da9f1f428c8cd2e13ead4c8d12f44ada88e192772688ffb8d6a3a3b56c5ea4726ebbba946b3681b46cd445c4c96e830c45a34743c360cfb0e4c6d922b060a451392f233249cfa621394523a12564bd1ea85b2e26dc0a3ff0127f12b5bf61588feba12f400046e1a0cfdcf4426acf1f666a34c0bd8fec6b1f6c7e34c377fe042d1fbec2c24542b0c30f39080320566eea081b6171dbe5b202f04b8bc036f8d0876211d27b2755bb9e6bd84706e5c557052389c5b87bcd3816c9e2b8738e5b76b8c33eac79d31d64122c8da75bf928ed62f5838a0090ac922a1672f439ce18b5eb0e1ad4d4358cce28166318798d58d8032b95cc35362be7159650057f4b1e26a2dd88b69c4eb893441760ceced91f50f2d47578c98fb176e436b35dce0d1ade1086ae32bd6d03b3305835eb433c03470d0e3ea70854ed7e5fd67c435b9cf12cf437c87cf8c720bf9a0d8165a19c0d1cf0d62e11836d4f199eee29bd5fe8e8e07c35fdf1f22cf30ea09d7d287349e607063ff1fce2b93aa024e3fd046e2325d7d42de85c67fe46e7344c00d9aa78accb155f6b4fa177dee69c5986145ef61209a22f530773829b5c5544058a58aeb6e742d60ba570c7bc18e4db70b95d89bfb9261f98fb8ac992bbd02b5d883da9bc0e46482743a80d3a755d07108df619669a4afac0fad92e382fdd488c9c2e1edb50f462cab1ce887e673f4c37992122d7675834413df117150f83c35fbe038a8e2ff73f2fef595e082916454c64661cb7931506b4d5bb5f36dc5f1a90dffa719ce8c682eb26eae6a9b3a3e48f0dc99d79c9bd062653bd058cda2ff4e62c193af7b48d45228076befbb947433401fc2552c450c3a4e4e792a88c026262e8037e163442a42298b2019ebbeca32785ba07b6397713d23aece74449dd63b447ffb74d9707fb2b4a68504719debfc3a343df3bc9d241f9371f7bdc450e3fcfb41f90cf65e5a9ff8f136792019a544fa64efa0daa3f43ee048d62acb247a819ae3d50c65845a9033d4279d72f99ec0b25563421070e9ab9471b78fdc946e4ca0d75c939fe3d13", + "r": "815f4f6fc4026082f3dffc298824afad1aff708929dd33e4cc936f33578e3293", + "s": "4bff23e7a38c88509dea31d846bc8161d2fc08267d40b87783f55e95fd3c920a" + }, + { + "tcId": 48, + "message": "c8bc70bcaadff1cf54ec1c00b7e92fdc124088ea63e7d284210ee29d1e61797f74ec5c910a3413009ad0d111ed71724968261fd30db567254e7bf1bddf8c9f25fe09712a3297033213959fca0c210013ccc129be877889e6168f290e6727953a9bde33ed843e0a92e5a64b969c7db4788a58e574c63b0332f7f6683d2ae9d95f", + "seed": "53f5669ea00a8003770536881745282fc228d1d5e4cd884be987cd06ccb015ed55a2bb75314cb7f21444e0e1e9f7cb7796bfa94babacf33afe32b15f1a7c0696951677872663de0203a9b23ea98b313c26285080091483d698a23351f4974661cdb411e3571caf995401e85cdbfb941134a70a4e8bf85c476743a7ff983f1b992ec75d591ac4e499017cfadcce6c5c153a57300418adfd24626a1ef3c5d429bd99a1d02f62341ce47838dee3ad491de66746b226655a6595aef195817aafb4759a93f57fc6de374cb4ec7cae080f27b27ffac93a299d65e6a84d1eeb57a277b17da89fb942772ec3c4916dfddbd8a0fc3eea8b4afc037d54150f27b5f649f5c3a897e3c89ad1df1008116de501906f05952ac16f20ee4027189e8defbaef5d3d04b83643cb050713422020dd29b01919fca0dbd6b8d738730f4142b4adacbb1318e4bc3929bc8f7aaa7948e41e7f5a8495d07b5706763d21db202fae6d461bdf7f782561ff0ca23b5e51dd5834ff41e41df2319955668f965c9a5c47a6b5e7121f52ecd79962f4be4de06bc09bb5b7cf9b83403b14a35176173005ffa99dcba7ee672616d79bbe0a9207b38f2d26c54a85a2529d9954c5e392456081c2cdda2ed380ca3ff3dd5e6cefe0e1d1d2cd6c2e30dbc95cd825f059c9061677544486ca82f4e3906b997d451dffa50bc9ceeab4d90e4d6f4ff69764a5cda2150f2a7773bbf1d201340d8adbb22344a0747627e8fc5d67b3b0fa2dcc9d00cf0ace18d4cf57703c6c601035a1790ef0eb68dc44c285f5d14edd8d96145d355c5d6a2d0028aeb870f90e480b982de57a2528ee9ae589d0d2c1210b0b41c0c5c3249441bb07a1a20da26e1f2b8920b10d24f5ad0d69e964158a9f1fcfa020aea571d3480724ad1d9ccfb7604e7e92552348adafab0360bb845d245608b9c99c8eaf6e0bc9c21eb248d0a1e3cb94471a6a1f5188f9b18938375086409676d86afd623fb9595ac162b2eadb15a01e989789745ede8248fdda372342e07fbd09eb1b2e7ad573449612c943b6461930c815c1760141e4c428c1ad3cfdb4d29a8e04b145135d2b152247fecf59f5c378ddc26072263469a5e663852b7f378e10ab7122636f38ff1ba0175dbd588907a3b728b1663d33e960f8ec8362abf1df0608b67f9cbbc0543fcbceaf4adf39a2afe82ce4e18dfe598b851ebc90d2757abb4eca3924685850a839a46825d061035a88b10bbd032ad23dcf5592c893278e991740dba57c236e3cce5df1458270ddf0b04d12b9e4892083656c417e0553610d4e507af11416376227088000770ebdbf9299579900fa70b54a15a189087ccb0e97eafb60b56500763a05dd537f0462c4a3b0bc9e9cd7defe88b8e556b7cacc10d08270f1945ed28bdeea4aa289aa96df23a711acca3bcd784f64eaf4334c91969df28713f4cbaf29", + "r": "e4ddbfc3090baab32502c950e9b3bbc6bafa13ce9d2805540b116ffa2c5807d9", + "s": "ffcaaee23071b3996e9d8412e13b95bd2e248b7a5792b8f82daf736417fdbef2" + }, + { + "tcId": 49, + "message": "d3e220851a0c7f5b3f98492ddbc0834873312caa3d842fa0e4d5c742e842b7266a14e00381bb9dffc2e7439e5f9f961764fe5cbb1170e1b3e6a141b80b42438337a8cd71d7e746cfed3d1b1e371541268dd2852cc5eece3786b7eac88b8a3cde067ab4a1c623eae92a22aae0a8686bd069cd4248214afdeb499395c2d071f297", + "seed": "f1e1011bd7ca645d311d730e29400d79d3f8fc108a56a8e36bb382fd27778599e9a5352e03013701875d078bb5e75cc7d9173bea186cc956598b34464cfea14f2cb3997ed029506dad79a2045647b4b678d983d29c43d2571c0ff29668b5520e20a260034a97d788166c048ab1689761fc7c23fa65fb678823c26a98092e7e554a3a0e3429d5439bb8deced212a8c64fd5b5f754ca0f77d11c869db141c1087ddc043cc647a10c247d724781ca3c56bcf77498cc20935db183d698366bda8456ba028456e86181c948df2e7775ac3b98882c98a25622b1631d9d0967ea788d1ccab9b42f68997357db7415770fb368954412329c41c60fbbadd52c202d128c9a2ca21af8cebb7167c648afe66445bc3dd976e648c97dffe454fad256d3ad37ae402a14b6d973a25d234a309b15d4409f843d2d546c4002fad221ccbfc03b50231b0ea860c0e60a0a456b6d5cd9c624d8bd242b7e1f17463936ac1011eef7106c779d9e806c89b39f4c92b1cf23e6200ad8a2876e2fae68badccf32de5f8d352c6ef9ed3be90aead9c02c7411e83740d473921733fd7580062d616df261b569435747cae1ff64bd5dbe322de4c172ace5af9e26e3b54cebe36752fd9a1d06bd63fef4786277104b00bf4b903c1169a62c7f075f692617f218b44e14f110bf36ddaa3d2f6725488f7465f26d4bba214a47fae044cdf35d25253571f5a5e85d16f8e94446f081fa0f80382a39adab12b03518229c44821ee621f2e3e440ff7f6286bfe1e0b3338120b4e5dbebcac76cdf4283da4eb6e4365ea27ad6548dd631cf621aa7f99418be3171e898360b5650e6f2c93c86f4b988fd42b6da61f2603ab8a32f1fbe39ec6af92e46a7b4234cc0f948f074a248e64ee2d496bb5d4eb0b2452d25a7b1e33eead626ef9f6ad97ff97b67e87fdeb026923f3d2620195966a942d8d841a9355e111d7dca940f7da2f16882f14cc526563164ea2242f5f7d61d46b6afbcda51b5655b8dbc9f4880584ed44e97d597d887db37351c4963c3c5d195b79f40cf8b237bcad6c71079eb0ed3eb0430b14a7864fca264d85c47f56b1303a4e23c0542629a5caed5914c5ba206fc1547db0522fe32493bdca77efbef8869b86c22b94dc43f4ed29086c6e2bc1c1b96bec967178e793ad56da381714fbe96a96009cd1f3bbf016bf8313f4a3ede1a0f90bbc21e84e3c3888111d8cc336f1c536b9a2fa822fa7439b8554edc6429eb3084668ab292b15ebe3a71d5282f42303e7dc439e4775df55c813e123dacd0e33fa950aa8e0fb87d928c12f8a5a479a153564c8d62a7d8fd3e997573118d53bf9daf3d20e06d767ced96e8fcf7c1510225c83c930b64d1624952882de181446ab70210a4866837998e1ac4f578d43306576d306b0310f8c2cd800af72c621e5038948a0180f7e80f5c4c18a2049bee14ed", + "r": "cb9cc60921ceccf8e74b468b783d9304595727f6804e7c9b726f4e369e181553", + "s": "f951d825e6022d6d92cea02dd2408cbc5491055e2b74483041a85b48eae205d2" + }, + { + "tcId": 50, + "message": "3e72416d49d01aa4eb3f346edfd06a9467f98e68ba6b87ab2b40ad6cfde9b632ffeb0040f45694c6e92ef5a2d92e905e628bf6b04cff993fb235c4de9604d2e1e20d9d702ecc1f5daadb6853ab39e0ef1f4471cfca99409c5b2f0c14b43ea15181a1dcba1dafa2d35ac0498d9cf56fbf49781c38555382bec7ba20d1a07a1ef4", + "seed": "57ab0c32cfb3e5ddc7f5c435561ed04048f0fe78fd847b14ac807af10bc97a22a3111440288c3160aa4f72ed75cf3db82b19e003486bad47c4b6294d92db846f10591689f19c8fc39391f4a5b4cc13e4df2247d8c3c9acf48766cad8c99ed3e56843ee5bb0a5fef3d9445da821a8c5dd48b36b6b1144275a72ea25bed9d81dd8dc3975975e25721b6a6bad04c2b32169cb8b47b799314ef43a6d0b35a71e2b97b86c9ae3acbe4b80372758022df0d90a226f1247a62a171666e505405ae7acf3fee2df1ac74667e212cdc459385ae30216db4076f7654a84b0fbd6ec76cd8429864a1383e4bd77f4f3196221efd09fb3a2b25fb6a6c546f3e12646734d7b50882612831b0571c318e8074220737f4b781d524e9dde89def9b12e67661f03fd010d1864278ab51be234ffab57b80733ac982a2f6bfeef5486e26d61027e5fef7affe071467f447ea3ad3ddc7be4a4bda8613fe2ee3ab5de6387dc6123371af3caab382592562af97ccae117a78e329bda980bfd1f68431a8fdb0e394ef4a3d7c761c81cde9045f36fd28f27c5524ff12bb8d6d2c29abef21e5176025af915e4075207fccee10abcb265a97f4a695ca67a8eea6aa94803ec30199e708bef54f30129b508ad282555d71aa167fddcd4c999642da826c0f9b7677ec0ecd18c82cec0c2ceaf6bbd700c72ba6ace132b3d31f72533238b39a1f2b0477ba87aaf1e51b69dbe0f96c77de1e677abeae7a087a28145f27227b493f25c651f2fae5c31973d4746276a3ef350361e9f2e90744f650056ad88cd6b19b73853b314d09f2834609e38f41b644295f8ed3b96a4328c17f52223d801a5b9527ce83436d8b78d02365d4a85c4eaf3ee81656ee2f3272663b1c086365cc859dfbebc4175d96b740dc6489b20389b4c43921597987564d4a1f11220e728de70bc59266d7a462391cdce2d6741b81c2e7b5f42bb46a76e4b72528287b81fb61cf39fded6461cfc7e43bb67cf3948cfb9794443befa0729ce230bdaed8574a31e31abd9f7fe32d036a6c1b5dbe1755206cca37ee89d3b005f9c7e1d24caa7e0de2d719246e7414f929e81e3a0f5d831751baf3d40410306dfef8c33e3562efb09587f7534bfc429cdfb71ee94470940f7f67a09fdc94bbbc1f4c80cfff90814fdb4ad8aa91efc1901435720c050710c9a685afbe5b5abe4371e3ac94650947ce56e52b2e75cfd81995e59a3626285cf2c17cbfbcacb6d1df876502ea2a713cdbb73608440dd1fbaf21c1cfa5133739e6002840ddb6e658acda5ad86433e4e001853749b71d3ec28d7e45bf105e6eeb2b05c00b86d99baef1f97056f26a26a4ddc437f21298c907a69694434f2bb0d99c61fd70516b4ed89a153e32e3f40096ea63611554fe0d3999f5f85a6c80c1810d60a3960c79e3b6e9454322a6882fa7b0aeb0edc3b51aa921436e4", + "r": "ba83b4f3b03e2131864c9160b290df7140695c710cf2d503abaf89687fa04745", + "s": "d30b8db62fd560635dcf423465d56558ab48827fc2b59efa240424a4d62307ab" + } + ] + }, + { + "tgId": 6, + "hashAlg": "SHA256", + "curve": "P-256", + "d": "38c40adb4b94feea627d27203daf09dc394c5c125d41065e46ddbb744c09e297", + "qx": "75562c86fa97e31988caea869b0cc8c0918dd012c115344fd91b9821b5c888aa", + "qy": "6396c36f078b85383c777fc4ee02b2b6f610787ea74b0e272195add2c31c9e40", + "tests": [ + { + "tcId": 51, + "message": "f5932b3b054db990cecf5f31b8b786490e8aee79a3b0b17e33de3f24a4bb4d4bd9615fcd63a4348dd3a5d15b7c6b67b61380c49bb5928055618ee039da8c359f2adc9d206d99c9d226a30c2305130c14181ab1da5b77277682cc672d775a31dfc8d76e898080d1c45a1f13dc090221c9bb57940c6cfe7799651da03e5e24f239", + "seed": "2d720d0a87cd3f541c87cf959f7b5cde3b8f33e65f1b86291744d4282d4907e4646c03b294fc1520df5fc5a2660fc280328c837bea2c1593dd2b557dcde7eb2002bd32dcf4e8b7a358d16584566d077596ba6069bf4cb1d725143a6001163f1240757a4e27a949716641caef46f6323cfb8577e0bababf1944192660e80e240c48185bfc4f42540e057a78df29aa209f4006bf13e2811e8335d46f3b2dbe8e242c9de5d14794c763c0af02db2257885c5d0034fdade6572ef78a461a5fdf071ec45dc4ab1946567663361ece3ddf05bb6a982d6e98c12b763039ff7c84822bc1d4af09a2247e511a491842188198dc7b8c266d854356a14461e40f36e20282c13c61ed7731130fc9b0c0ceb061d3d69cfe67bda217d95394fe9dd29cb8efb308c21e60b04483bda623d2603306e650d861dbc848ab52561bbb1b6fd106f07de4ddc95c21ba23ceece6504ef66fb3927a794980768450d938b719fb9502642178a5e2bc869560b031ad0cdc220d130d7d15ad263c697546d1e326c63f0c9509efe6ab5744e2d488d26a451d164704fbb59fe7fee8017e8a93191a19d96d9233d995609ae4b65ee2dc1af95b2756ed0187f092095919b8ed5f6f6fa5581fc7de3461b4aa86beb8fbda103131b903291f6f08dc491e81412b7aba296cdf1284fe3d3cd97bff366bbf004ec74f6182d12d884a27b3a939a5959233291e5da8c56b17123ae2071b09c6d738b9a67b4ef3552778a094edb303d0dbf8fbbe50463f708d231a5fe6cf21a7c7cb7e55e405d4bb4c59230852b0f12b3f88f8259d9451c503671280ccda10c4edf32e123c1b097a66020a98fae7f12781f3d329ddfdb21b92825b90aa79242f1f692023367de0506e6c444334972e77d0ea983ecef3583437c471652585cd73964c3ab7043bd1988a940add951b5d8e0a7b5635c17258357733285688a97d78c0f24053b08435075a9cba03cb99d93ca57f3e88afc34f461d88786d298004f4cabd070ab8a35689b08eb87037c67ffc5cb945926d498b66886c3a9583d4d9bbf221379b4c83cf78dd1f78d279df7c4b80895f64956f52ffda6bc822d8e9843c129843001f1f6825e02ac6be800878810371ae08503fb294abd99c852383e710ff6847c5e5e00c12b98ffc1bbed61a749bbf96a9d9f3bbd115e3d804ca0f8d45c04c8a995522d03ffb2e0adeb575d091f49bbeb888df47deb6ebaa22d79f1f68b73009bd9bc89414cbec2cbe91800d64fdd2314f05931f582fe7e22957e4a10e9410e6cf8b60866854c8316890882844022c5b2de6b1dccbf64f191c00891a082c40cf5e5a92537b2a3445952b049fd27cbece1f11594e1cfc192525167a8cba5ca4c9dc2aa7c53cff349fc3fdc37242e67a10f85b4b1eb99768bccf154fb7a1c08a843702c0027d11cc7a2263c1ce43861c5889b3d844553a", + "r": "a264317e4f2b5b7357258c05bf09f2c9fc52d442524208af63c9a29e8999f863", + "s": "5faa6f5db599898f12e2336ba4e01dcaca9e41b5a4b3cafe9b0ec2438779dca4" + }, + { + "tcId": 52, + "message": "7c7d0629399a0631833fbf0d1c293ef68f898b8f5239504f1f3e0ba15a3d713f4b6dd4175f245d7b3adec7a04d945df1857ab19f76d5ff5095654e971640104bdf0ca17a1bc371412801655289e5b46ed522e26a88514cece8efdad065867da03051860202331367e53af0c3c2e73f7035b41d94e1419c650ea4ae2e2b567b18", + "seed": "a976626d1efb72c03e7f75410e9930e3d5caf540ee936bc7517fb4a8f6a35f2332857a50b7ee77338369373cfb9a5a02aa1fe3b4130658d4cb8dd3a2a485127b35f8187f072e6a8b4293f45a0703db6e61fe14e7961309dcfe2ba9aabb11cdd048fccea783ce157be7501d3e6b82aff59bfdde4b8a5a34d462679b3f4be2226f415c3c146e3d709ac4f788e7003595795f613b554062ebf9ec6b9976b2651c649e61dca9fce46f25e7d500917ffc7702cc75dd97891e602f8afc0499eb5dea78e3743f6749eda1bdec358959cbb2e1b105fd54ecf6d8a4d639113b5dd0f968b2506f85f918013ed4e367b35136cb73df9b4e961d4513fb777c2b522c7ee9cac9df9478f49766e80b169c3fd0eb9da76e3ac325ed3d30e82af89d882ec93c949040691d807a2740cfd96b165ce674bec18742211ffce373f1f92b674558c618b160ef7eec9e5f07bbcd04642f43d4cba01f0a41c79a6cc46aa0f1ffbdcfa6e51b5e0ec82cc27b400dcf7a01dc3c2a01c987818de533dc7c794192f2e180ab7f580d84a102f76cacb42c1003edbe11648ad312a3679ccdbf3ea2c9edfc35ce9f694ead95d61d428b6ac0fca9c5f8f66e1a0ecd38308f92298c5ecdc3799d23400b0c36295b411566ce87a77ea8002d1445d4e5dd6296c86642e7ef0bbd4282c4ea11894d31989586464c227dbaaff139278aa64c7aaec270464f578b361c9a0dc0d16b19ff8c5d16cca692ccd15f1664b270d80c5bd44c88a30a8876eddbbec00d8eb089f47cf9b1f1189e3296f1b949165f88822b42bc044a2eb0e8734eb9bc1446afa6494e6c2f03da3b13373a10e3bd5a356654f6e81f057660534dca42af4df29474def354b5bfd7d3abe8d45be2c823725d78d28fab41d174f119d3e24ef129a164df326e3ddde44b38c2b42fe886ba0d6a48670879bafeb38028e0f4c4dcd7ca01379f54a90c08591e7638bb2a89a7a00c4dba0a1926d90a2af5949fbbf04d2a1180ecb81230b9d9d728439d7ae6b9905e987f02f0e987f44543eb8e89f939473703bc1a2cd769423225713e4a2cf095515313db58d589f1fa81809815cf2e0c3fe978c686dc09115dda590bb89e46e013784c73259c3cbaabf979d3738a1e616d471887da265510fe2d7c4be3f33c6d619f50cddad08315a505b6fc5595306184fec9a5927a702c06ef61571ed07b0160016a26a6207809420d53a8523ef73dc6db2cd880e8ad1ff33525eb9559a21f32a627fba4ca6cdf2981ccbbcee1c31c995f32e005f886d30de6a33336276ccc4fd659bca44891589b93349182343dc0279e3030536f4ff840a94d6499cd6fe9e6b085024b3962570bc1ea2577f8487e8324025da080129ce5ce867de4b26e53cd27c7dcc071419e1d28c30e5e036802424aa6c62d2dbd9b23c1fa7b56e455f433071c58a8eaa9cd60f0326d9106", + "r": "b669045aff984a6ce8be8aac730b843bb6cec1d08bffb80dc4e887f4f0e06b9b", + "s": "35da67e119a90e7b3e9b8ff887c2349abd44b4c15987176c54aad3b0703c91df" + }, + { + "tcId": 53, + "message": "91f7748432743cbd0c53487fd9c4759fd268510dedcff53b7b839ed33f583dff834b293d51843d39613c77e049649db9f06d62a5caabe3ba34c6096fae9df9843392e4767e660d340d1bb8d0892a0285f34d7039dc709267c2a7a35eb94a54190d010b4be9910660a73f165c12a561d825c2ba03b707853eddce0884c6b47423", + "seed": "79c071981afb7e1c0742733eb3b3186b2f724e4ba62d92b8f2a6dfaa11313414a16572d3c13f4db607585f580198d75a1067585773c38af8da2049636ee0d82854e54a07dc358460e8c50c45592d8bc7a4016580bc167f44c4f27bb081b0477951df3cf49faa31210f88668ca7e98063c497c75739af80ba1a3a4d99f0553d38f7d8a7fe829a64e4aa8e8bb4be227a260eb80a5cd1c234d3f3babd555410fbd804ed8e5a4e24b608b157dcc3d42f7159f52d648c9b8a5a4922643c75ef6d9bffa2e8efe1d7da9e0cd3a7266bf7a8d7819cbccf0a69bcb2b70290562fcf7595236b5896906cb6e176df93f2686e76ebaedb5c14d08e5a33eeda5d2a748a88eae937e9f8c72beb18b89080442082b7a0b6aa40e7f5c6376af005c86b7c3ef2b9655ba67922a5571e886b8474d04dea012d384ba111cbfc18e8c7a32ed58dd2d947847acf84eabd55e381095890b8a29b824804bc69a7ee1b0030b2fe03b7440bf24dd0363bc7c4874a8a7c5786e23a24bf83624b7f0e3b592081d25b89a3d31c695b83b410c8312e9c421f7e1ab3822707ff8e67f04052abeca928f0b48bd25428a0c78482d71762876758f06400f4953928d33b9786d24092e96b22903edf62738d6b410d424683dc4d021fbde7e2d860d35f5aa3037c513a8fc33e649eeaa138dd66561f28048d6d32d98f94fe8ce978349c51e6ad727d38a08400b6a5aad23ee31a49940e85e74eb012f1a48c35258f60df9d508c6cdd392b0e52890429ef664a30a912820bfb50becf833294f1794ab073ef328dcde3327146b8dd53e1deb98a0d54266a039983f503078c6cd459a17d49bac6acd32aa3a1900af39f3a5bae1cc3a1ba1c8b93dc2e590399e6f8430fc78371dde9ed6216ad947ee3214b2c4ac7300a5b3fdf526fcab815019229c77334e4749c55886bdd316dae54c37e5821139ffc9028d0f7e8eb05d5fa86c3e41665415130c0862912cf0e72689eef6b3dfe4caf27ce705bb60fca2d565af49aa98c14611046d8a1379529598830750de5cc90bc0032935708061234f5834844a5209f6e37cc1aec9ee458a26c464f30d13981bce9809fa6227e25fd3fd0482340834efda7beeb99093e13b4af9ca10d6b21f0d305b5c7a0890915b5313c5082fea85dd95733453513d343690d65d3646d050705c9328ee7261e76e6383b3456a0e2939b41974883f58cf819632a2c58921be2b3a532b318aabb4cfac8741e49c842b791cae19bd3466102f919596fdc82e0e8af17fdca33638122a72d91c41ac634eefb3dd51fa461e830bd3e7df0c171450bcbd2ec038c49b4c121da672855df8f7c07517c039c5a34515d1671c198a36b5b17d2f1131ab433d1638300a3e3e35e778c4589801270d694173d9b3db1881ac9cdbd408b1a5c7ae298c3c4e5b31c03955d78b630b81285e4a8d91e835c20", + "r": "fe76fc2b5d4341204452d8957c49e978a68b635af4957239aeaab25027c8936d", + "s": "d6940b32627666dc21675c0125700f429c8e5cc26b9070b2986bc7f46e53e171" + }, + { + "tcId": 54, + "message": "0eb1c65b76c7296017b0b31b31804c2402b15fad9183b59827bce6c83843d61df9fac65af85e02f4c8956dceebbdb49d714037d3a82bf4d50cbfb978bcf1f6857e9ed8e51ebe653a8507d88558c157e035a3ba2ec855bbd2e0e4195e9887fca11bc690429dea402c6f002964fdd4ba251d52ffb893114c0fe176cf5eebd43aae", + "seed": "f3e3dfaa5296415ed24543ef07aba218f717538d1cdc802c85fea77e472e98d16406ce81bee20114ac374e4340301c8c96c29fd34f94adc70277d5dde24d243183a8db5ab38a029aeda0906092a11e18e8d17700253609ee242e310ebf0cbc9790085a657a417bb2111b7e25ada665223054d8177ca0526ff1852a77ed2d0304bc36cc7e4836e221bb8b0598e728dde0b89728aff38958883b6a5ad353e052378e6aa154a84aba42f65f6634fbdc42055067fd967ed2412034db9fd2628ec5c638efb86d0204597cb3dc2ff78188d439977a3c2f57a2ce0cf39ad9840c28fdcf4b6d84a2fb56d4c61421af7347f1e791ff8be828f04ec2f58c79415584adc2b02e1b88f33fa0a60b516e1aed236c89fba99f611a09d69c8dad8fb1bec820100fbaa28daaf1def7f50a5e68ce4013990049396a4bdd7f701e1b23c4a84bab2e43c46232d300aa85fbf4799a38a62be740308aa580a5e7d82d8038c31067a343b4505b970708db3ec8db71304887214ab92fe23591ff8e83eece11a9a69be3dc55b89049cea0cdef260682d4f2eaf00785d3bb086733ce483c7a56458a8ffa8dd3bfc41c02392d932bc77a2e5ad16274710189cd41b6027bae1adc1a9705e1a940dedfaa87fde10721fdb707e819b1d284706e2d3cb2344f964c8066f450d3610930151e5054a685b6a2c20db4156440631ee3dc9cdc1678ed9622cf25410215bb2eaad5f1094ab890b7a67e1c47e2736422c7b6b4d87aeeabe1e73eae571cd909fa7d642ad1fe04cfa1e1e6d513f46c72e08db1efdb925a911c76d1a1e2d29cb563e3f55c66abaab7c9db6553e7fb20b1ed739e1c469ef430810d22b96faa52d37716dd23e3359c78aba24cc30b9b454a242d7ac36e4092cacb1eef7a3feff809072c5afeec99dbfe8203ed4960911168e5b901d9cceef328af92d8f0a9f8f131399e51f11f1177ce59528d1801955201536d6ae5473f468313c1d8322bcf03076b264dbc780156f40473d8c10734786731f273a29c2cd80730295e4528966570bedec025aabfd4d9a7043f3c00455b6daa77a1e88217fce336cb3683adf3824fdb3ace0177e5c9d595ada5742795143e39c8243e3f4bba4d79228eb5b9b3240afe540a2c95bbbf2aeee4f7680de78d8d55f090dc0fecaa4bc9a57e34aba3d93d2645bdd849bab635d81568d7ce6ca58797ae43f23865300642f61eaa3d9b9b68a2bfe8d3f978b3155bc1f03f066d2c4d6db5a06d90204c140b62e0a0853f6c828c222259b57e757015b32551e6069593e9f4827635ed531f9436385cbe523c1017a6e82292f18eb7cb5499398c7f8d28f9e9663d4427f174b15dc03d3e2fc6e1ecc18a8be1d5aaf84c607a7b65640c1ba2e43da318abef86eebb4656da4367fce964010325f390429763264ab63f72e0bc3cc0680d552702cc9f7be3cc337fe8", + "r": "2756e90b085d6fca8f87d602eacb835fce698652228ddc6f848c5f863a324421", + "s": "973e4e4d4572735db0c8c66bd94c0d16c914a9b30ffb6b6e0562153b5ed720cf" + }, + { + "tcId": 55, + "message": "ec224924c47b160b85b18918cc2d6237a8abfaa0a831109e00084233d2fc831803b0edbebba8e4f06b4ce612077dd2c7fd50153af0f5d4dae105cca96c82586bc391959ef46088bde5ea957c0bf1a3cdb1aeb52b6746a9994ee21f4466cadb01c8f104ab4b8475b37c7c819a8f23bc004932734783205cc73ce1226a13043a67", + "seed": "02a0a90118bdec07ad1ee2a1fc963580dce421128832f4cfd8e2823bfbb0ec68f569057251141094b1a6b1b8f36202ddce0fa8a37e8166a481ef0ed52922fa336f063f8f874fd17db3489050d5b31be7921feafcf1c969b6450d287f8a7660d4439932ba49d05a4e24ad64e450642653da2752f2e25acdea42e3cb610a5bac3f93a9acd1f105b280f4662e52b2d5b6b5b09cc9c1bc73ae526048324285f57df7cc17519ca8bf1841a7b7c453b63d23aa3679832e883468fbe0d22af8e810ad1d7454baaa7236c6e82706a0c1d03a71f971553497bd094829aad16af6177db8ef030ea3a07058e4c0e15f368aab003885d44b2c487352ff9c051bae61485711bc7cf57a1c3bf210a7b89468b876606e381323a20177d9135f7112fa45b80651d6eda04de49084427d11f1350a489903fb110ed0c49ab151a21896710f70bccdbd5e7e0e0853847d1b2df60c751568f204f4fec924561958705bdfe4010e73d76a032ee371628d36cce912ba4862ea07f0dbae972b30a2a5572661d8c93bd20537b26a333fc4719fd3c4698e41980cb0c9082c838ea5420d84f33438a4f511ea11e93c1635c038a31c304c3587ecfbfea3cc6249e474e18f815f83161460cb4fb8667cff5ff8045cd451ec70d9891a24f7e00918c6edbd2cc182a834910a20a7996fdb4cf96c3c00f2203b6f37725808b0d2c226ecaeda9e8900f24b36f38f8ae2cd73b0e5f38c175d3b49ccbdd87fde3f83a0f6735b563bee94b0839f09334f78c80cc481389781c5eaf062308633dab68d1afc2930541d1a7a595f1503149ef64f74d37884c2c205def2f8268da5374ae1882ca1e1671126502f37247bbdf5cd03e516ef516704f207307c6915d6c9352edb60051e1a7b6c59771d4cb8a9bde0f28815955c8e763149db5d5ff2cc0510a19bf370ded44551e479dfb259cad3b2a6a24323d7bfe6165c4e3580f3d74144e499bf2d15e6acec00ad5c99d2c35694ee8141d9c2fa6fe9afc9e0d4644b35e634b85381da3f0ef65e1558b5071531b985bd14c40ebca7a9d0d79376555fa8e707dfaa18ffbb9139283362be060a62ff8667d9b6542ca039b1d07a036255fa36c0a697e8136c784dcc2213904b776963e0a8c001615d9c9c8c75f36e110676b5837e276c9c39d3a5be33a2eaaf717b4afc502d8b32b750897919f60ea1b866c055099ecf6900d6125d0d9eb863b9db5ae943992c9c412004375d1681b70e481460c5ebc228963e1a4579ffd8689411d685b9088a06eafa408a7177e326cc1c4d2b78e1a7bbb7c8df8b3c349a471486cdd4fb0864ff2df5b022bbddecddeaa0bc36f3c9b0a708ba90ee557b07277717937614f86cf4236b7a869f7b51ada61a3333963aeecfa069322e2d9baf7be3fd25408d389669d86dc984f0ab3ec37eadd9b632cdf910f647f7b7bea20010a0da29", + "r": "4d635e9036c38c84404ab4b3503752d50011e7199aab5b8128fd6b55f1764c33", + "s": "dd8244cc8e34daaa56ca608cf94e6398662597ce432c9cf7668ac050c61fb8eb" + }, + { + "tcId": 56, + "message": "0de165215d91dd9c75f2e6a1b8ad9d6dfe546f39f4d6271adb40b086cb228ca851b283d4bbf206081fe8ba64a4783845c89571d9d8c18691b62014649afc842f578a19f1f365036f2e47fa7a68de3befa44b835052e3336ba3773abe62355019632242e068dd914ce6c3bd0b2c2908f1df7699ea16e8529a6a81ce84b2e932eb", + "seed": "ea7cf0a80e91687161ba7a91e73b160c2a960a881ed0bbc6e8421952973b5eaca17009a7f3179f21b5d3f1a3bd9658bd322be48a68ce18bc55e36605b3010b2fe9746bf098cba6bd6a1cc85637288d567cd5949aae44111db1ca2360c67a652567b1c13bf0418b629dc018bcf9aa652a0a9d94587151c1da132fd9a4dc393881d484d55f3b7c0180b2598264f85583c9da2d3f134aac1b0e5b398c6d6010963ac008c902e2a4b4940ed9d470d34c058516800720322f912eea96f4e038bbc30c29cf1e9c90d7d325022151cdc23d01977e50a276d855566b30122bcfcc61b93e5c75e082bfb6e9e66785b020e8f21a2afed4d260b9dd2b7016517373c6b0b5883abf7c68d367219499d7ad22c6a86c80278f80bc46529a2ffb399823d0daf2427c6943757fdd7a743c3ace8e4c903e5a49abcfb27856d9506980826b5771b038e67445fc5711242f24ec0f6478087c7486428b2c41c8bbdb762c72cda837ba06053ef6490cb0f4e708fe127c383fe908b28afa3ce39c1973833f939554bdde6090aa6db940f028ddd47e428972fc04b23777b98151d9fd60b7546507e8e35f9fbd368efa9649006600511155bcadca5b8b61339e0faef524b502ab99ca48a66460e883e2fcf03938d5e5fa09c7236abfa94d553ad09b7a7a3088b71521d97bef8a121a8314c1e280dfdd5bed35da8bd8292a68faaf8fb6a95010094f6d23427021188e3e68140e7d3c6066148d2a46d4d091ceb014b4ec857a249066847425d27b1f90af26cd2fcd9e1ba97a85e49c1359e4f579f86256f5eae86cbb6c349432a6c6dbedbb69a15ff6b23064b6e4a5ed94cba7610f6df02ab69107cd81e87c9e761380eafa7f4d27023cd28a49f86b1b30fa088ab60515d251a3a61477f545f360b204aaff0a55a7590d448cfc45e86cce41d7d8f311187384d9f8cf17fbc399836a52b249c0f501302b72e47e4dd4059388ee16c945416fe56156b0fa85657f83c8f5f151d2d1fcc282e6453e1b5c87c1582863f803d7b56e6d5722f0b48468ada2e7bc77aaa6b2563f75bec456fa5c1e72b3046b23d4ef5dbd7b478d0605b9a1f2116184ea3436da97d1efecc51fae0c806f9a0258ad16f4b80c8a5592a21a4367b6b21aa06bdf44061d49fa0220885694e068cab291ec7fe012ee504794c16b09467e05c00e1880f6b6ea22e65e2897ec6448e7bcf1888a7e9a036aa1c805c61e53878b3a0f78e54b6dda6e0541b0de4007e92d40c117084797970f187c2486a1b743aebe19515c84a1d3d80cd3f41d8f69d06bde20f4efc7522e556226443df15d0e0a83e0d0e5b47c8f5c0db97cf48472bb9180cb1a8743c598ba8f6cafdfa3baded1fa093cddf1060732be218289255a1880eb900438c38bb46d3462401b1e07d2aed12779b17f6eada68c6867ec2b101d0bd30bc880f0b89d28e0ceb8", + "r": "fc92655e4a4796fdf0268936f0ad5a2ae463263d49cd05494e837d19c681a517", + "s": "21f85c4ec13ac0e828942420d9884376f6ee66f97a2c4f31b67a609fa41ceb71" + }, + { + "tcId": 57, + "message": "fa13b75d1e79923ccfe3695a91634c06be740823c5026c008df04978e82c1afe3c51bf10ed114fd561814520a1bbb0072aca7e1bb71f8cb923a46f6d4ff3bd15040b15426a76d13d8fbf4351bc90a4fd5e986ba5411e0952942987be4fde95a5d202b046b90e9f9670c039c17220e3ab62bf4ce4989017b451cf510a0c41fec8", + "seed": "c6a7b875c737051c90580b6a90c092b2beb30bab0996c7c94c79c99ede62faf2c1309dc69161742a9e5a8ea30e4c9ed19fb70ca538ac60c77f96bbf949e12d3055bc294ad3ae9bf843b8da424cf520eeaba73455806efae7c656c0a2837af6d03e0ff0fd12d80d6d3e410d6343eba8003a1d5dd59f75b871e17fa7035dadc1668357034243c10573de6250c6b7f84dd8e208dc80b240319d5308fd7d7c60b3579cb9baf45258a534b302efdfeb7add3fa21a6d29e6fc702290bc90f9e6fa583d480c3a8cb39b27649397cabd84a485774a708a540e89e85c91078a100027c0969bf9d9199fb2194b46aecde0dbc3490a005ba613740469359c24663cc3241fcb5cdf1d20fd78fff2eda08fd12b57a15a28ff13fd314d6daf6bc79a864a30665281d75d43407b065dd6181008769ad347d7fc3eaabe9c3b5d5d1f778ced5911a28253cef8608b5cf8a27360d2d5b479add65a7d4bfe6a40e54b675331525585aa531a88d72ad13cd46bef64a17dc8050ae5ca783349393443fdf30b45edd836e0d55de79f0196ed81693469a3324906ac85b127a0c73dadf8b1a2c5bdcba11a19f2f9825b24ef7e571ca316e769e026d4859cce885163ee02ea1870aacacea07f85b04da5929bb76e369d544860a7de6238e4a4af62e1093232d2b803f8e7d1175fe9d9249ba34169fb2f74f36ba60bb08b7ee8c4a02c9a8bdd9c7ba4ac39cb7981af99cd9627d97518747ec0b36b1cf480d9111a9c1b54cc0bba27dbdc14405e603d104a7b9d558cd7679252c8cc385e8155c5a20e157abd524b19c0900c97cc41bca68fac8efb2301f8278f270a7387bcba4925663ba270bc26a6ef21ee7f3f7540e2caf96d6f47d0bf3644634bbda324165a6dc7b5f76ba6bb691f77f904efb30823a99de270f800dc0fce807b9b7fa96cfea8a5e917b92717cca451d642b51826b376b3e8bc55adc468a9ffe7f7eeceec48713c81c63af92857d8bce686fd19ade3f19efe9b6aaa6a9b5cf94512b895c01d56cc35d0661a22d0dff814e08af1889ad2ed47eeff62ac558b9d508f8bc13c5ff2e62584d7810ca0feb9fd5dbef4bcdeb8f414f259505770b4a1bc513dfe4fca10cf4f4c513586bccfe0bfdd826be5bbe79d65a0a94569a1003bdde074e3960ac51c4a9a256045abab196427ef4360728cc778e3048632b7ac77baa72fae94e7f0ec184c938cc3a11bbed1fbd10a8cf6839d88883e9e1aeaac7f02b5b6e8ac847a65a0a999a424e1a4019ebdb2a3f511ab746b84540099308687d071b94f34b3967079ebe6ef119e700a42b05d6e3510ab2f1aa095d163cfb3d9282a9751609a5a3aec18b4fb0b3d698dc2a3a04934c26fad883132d122b0ef6a30990c58a63af66763151b3351b11f177dcc84fbe1a157965756b693cc0f11c6e748ae6ea1c3940b50d3cc8460e850621a824c", + "r": "4ad1fec40bc11aca1ca45e2ca7a5bb53314d69544d79bbf91b4e2e580971be45", + "s": "99f51398fc15f0a57f6baa47cb71a78cd09adcd2c23bee1ee3ba0da1288d6b00" + }, + { + "tcId": 58, + "message": "6ca92925885fb1c03f4669d25be4f875183a9ac706f05d870b9b2320fbff30b8a83caa645089143f8a42a234ef4cfa124a61d016b03741160d79af9d9f3b03e27b591e55f742d6e9504bff48066b01ba38c35cffe1ac11c792a1a72773658b898ba9a0f10632d6a661b2c2c2fed3b8b5a023022bc58e8b1b4a2588cde9389c13", + "seed": "1860f29b07f5c6d6abfd92f2432da511c8590cb14cc6dc39667d954e51dbb819fda3e3559d2677e12a9424af1374681bfd730540e71c1d486798835053649f050629e3df25640702bedde28e24ad884d2e0b050800dd53cedb4ee46e03879e076dcdec2b2680611a5c5382227bec0bd0ac4f2be445f7bb649db5bc7140a781b53ba5f50a7a684dc2c98d9d0b0fdc2ef7e0da66e7a5b414e350022a3e1e11838b0ee28fc4e1401399f6c91c394465828521cfb63e2214f555160e3c0f04f458bf7335a22cced04a56ee5ee0108027a067fc1d7ea55d6c488a89bbe66dc8912019011c52f89d6645f0fbdb20e8fc3f59e22bd44693da64e9d951b8e4bcb5837ab66c8ba58057951b3c2b1d19900aff45b0dd57def15c723413b62ab9cf258d298d541f3fdae08857c99cc185765ca4d9d16a52d88bc1410c43337352de5be044aad468f1653db14ed89839ebdbfde50fbe374ee5f8edabdfeda4a894a7f6529411486b6308ea85f62820a39a21ae23ffe882d9bef0f5803cd46556260e0162d646933923670a388f5d08c102c6bcd13848e54e04f1f463803db4d4a2792ead95a73ed1d0a3cddff94e909ac07589726f4ff988ee1cd3a34145b8841583e96c3661366a2c5681c2ebe3020a27f821fd9589d60d678fabcbb5fd2a535a981b1227c95edd747ea7e8a8421ba80495ec4f5b36b177b798632c428f472a0717277985d75095fbe8fc379c26594332aa1648a4ef819ed14a0a37c427b211fd41421b012161219b3a0173983b622c70bd948409eedf4770ed2286f87c614e0267d6fbeb36895e4c88a94b394a674700d77ab356c88a5fab0f056d6fbd923f68629df3980daf9d4a5a583247387364cbcec638b3c9c73350c888393584c4d9e600d49222fc9be3ddd8ed6c088029628c777bb9dd26ef5c56e7cb60753bd7e04cafb4a0ebcec6cfa75a75e0e54e80d5ceadd0995c1c6cc904ec8bcfc697103df4bbd13dc28e0a78e811d8510f0722f55b79e6c9e41aa1172fc0b27ccbe7b528b1268b429bfd609bbf9dff5e919d9796df1b3f4f01ac8d66da58ed7b1eec584fdc52a6a869e68ec4ffdc62ae46bf0d317712973e6214edb79470f4f25a817d0367f8c16e8d8dcf3a386da03f4b3f65e6bdd7aeaa8eb1376904e69a608b039fee24d5b8ddf07242f3b247beb0dd6916779f6301b11afe762e1a27dcb4f04c3b7021c47604781aa5e0ee0cb92401252177823cb2314e307f060129d3fe4c133fe797744ddc53807f27fb4d4c0cf3fc2a24e61a3cb1ffdf7b2938daa310fbf7fc266f3a95fa4fee43c3cad827ad0c201e716ae06d60bde48090bd5acd6e369a9f43793455c453c3af6e6589efba1930c8f303191b5768e866354ef195aa035db21c36384fb23cb768ffd8e98c0fe9a0f34b80fe9a9f6b05b699fccb1e875b36ac64fb49f328e0cc", + "r": "81b1e5b3e2943c08de1edfe4e7236b135d592916166678dcfc3fb78d6e6d9a8d", + "s": "cb6744f5af3315d8d04e49d39b3de162f3d375568931694eafb1a8b8f27ba146" + }, + { + "tcId": 59, + "message": "77cb76eb032747ae50274062af7035ca2c6a132d6ecce484ec0e73313f5688e7a1c5cc48708e4338f029cf9b8b724c51ff48db4e9c16e84313e77a466038d71fc3ccd4fcc1351208b9af43560ff86b6654d46917764bb476c28d7e8396fce8337fde94f7d9a126695f519a508caad1926a1042496c57fe58c3ad9de89f715a53", + "seed": "771b75fff49e8ce954c61fe0dd5ee833150fa244bb1a411e5cef81afae9bb821076dabbdcd1a2e79496e1b6dea902a831df391e454b925aaeb77b457b66216074e53889b5e7aec9cc7dac821cde425f2e6618693642fba04f5f6fcf0b0871ea89cccb532ff57e902eba14e32c46d89677efeccee095dc5961ce1ee69980a3d14329a9cc8733774cc3ec931e5af2191a677473f38a4f91c9166fbbeda6c2c2f89ff37371066243566b50389df214e126bdb46ba7d73c0f8bee61700fbdcabc21fa284a75995ea15446e7f249a84cf6865b6c8086655cc610f109b8c226e0deaa9e3c870e97c03f773e7e210ff293d1a0361fb1f17d6f27fa90b617f4199f07ae1011a5168db32451982ddc95b715ff0b84725580a627b3bbc45382fdcc4e0606f640122b95f4bf2a6d366f62998c4863a05a7c4700e3fefb9bc6efcbf64aed6e9d82936f2e8d573702c4e1ea6fe4630159121dd20165c5f6e97cf1ab75ad38392dca51073526d1d8193c1630f66533e2b2246edd2d6d71067e5a45c4a187a406af6c50817d018c80e6849da5f2f0033c0ec7d698b3ae2992d168bbcb8135b9356c70026f5f7025f5658685cf08035e9ffccb32a5b83ed574d8a174446decd5e6b372a754e2c8d485d36e9d1e8c317f6d48096750b03187e948aa95e73c984f105f400eebab92497b0c95f65264776f505ad622c87d8f381f56a2f909e0b0f41a98abe2d3556e7363d37494911e4f4e7bcc86428bc6bf43fb4aa5142a45d4c7cca6a4fea9a7aa19dd317fb1143b635701685760349b4124c5691441fe291458cd6663f483833b3ffccd60255525536dcf2d1aaed6d3610f4ba9495bc8953ca03f7e657a561ad8d10b727833c4d68707f2f85de7fdbf9df881219f0501ad511b5aa8e8a1accacec8441d74997f4592e993429486467ddc49993c865519b60710a3c94778686755f18c93bab3125a2c471b6abfc75c616d29acd0d00d4f89984bf7f5e3040edfcc7b5b08cc63e206236385c336f4dffe754de669a73b801eb9605f0c2d115e84b1331cf5b31ce00226b26223d511b5b65950763f0194c074365d516b7c9956fe522ff6d1d8cfb8f640aff1499824e90fd49d9d5c2db95205b3be4ec4ed8c1b4076fad218426b6dbd87b7011a8615a700f3c617cede67f85132f3c885670ca90d8d77160e2b2933416aca0bd5d62aeead9303c3afd4cbcba63dc24f82df2334e958cc0d0f4ec63fed9602d617381da7e5ffa742eaaadd460fe7ca5a57aa32dcd8312c6e7720104369b4f8a790925393e2ddf8b55741a87ca9d229ebed127f7714e55fc1dcca2ffb0f976d230e84c237c3bedd5b4014bb7f27e3b4404a49dbf85267669f214efb7e5b823b6c25a18ab8a7b626dc74d3d3de5d72c772935194994f19429a9bcba2eb2a424de0d7686860995ddb9243ce2868e716cf671", + "r": "910d788d11f3a488654572963eaff2242cdcc604cf7b46863ab5fcc0edb2e31d", + "s": "16af5b470397e67ab3b67520215a11e6806b475a222b6556bae62a909be18884" + }, + { + "tcId": 60, + "message": "b56262fabe1dcb747f93a950f7cdd4e4f51086a90fde8a9fe3edf588e21181b778838eff52e2a2cb338c623a7b02c3b84dfd0cdd3bc38d4362b4dc61e8fe00e1ce2453ba8622e102eec16c9c21ec54c04ede87e2f350dccb3d142233e5908d9f288427cfc21296d5e0002d178ecb5884e7c2f2759d2966f5f416cd1cf7c1031b", + "seed": "6371f0aab00bd8cfcf9062ae4485c55f17643b74b83661e75556833f056b2529611fa50317f5cfc332709b807a454af71f2aaa378141798968910b9198bba362770cc5f82c6b2dbf93242c382056f2ba9e2082d757141358105ceb407b58f5bf15ecce5cc5deda60506da297752f7c27f350bdcc82771653f691bd2ec6c5a0b01d6e9dc25ce8310b5e8919c60fb969f8956e6e3f2aab43611f98c873daf90c21fecc28a666fd1e3be3b8bcf8575c87fb7dcf9721acb50bdeff4bb8ade698eaaf9b5410b007f36c3f6aa37055d49f38195227a9604551b755f45eedc2a0f3975ff5e8c1b3683f08d0343d94dc8063fa7b26b62689a4519cfafbe4a35df957b277ae878b3425037a918eea2ecc63ea3a563b5c181ca5796b412acfec1b34f8299ec29ec6329012f1b6a90d7937d567559337077065e903dbae57e0a1865f797e325776b768e88558bb25f4f32e58d4e0a0e21ee73807d231fb0d496da420f81fa9f8f4c91f04de0ee35cfa5e25655eef23174267b6f27f93077bd2a4a89a3f8c8d413b99641ddd89814df527d74ace0b1456a5ef93dd0b5dcf47f9d6f2009b657bcd07ae81bcabc9e04fa8a9bfc0547fb19adab3b0fa801fbc6e07ea00144ce01fede0816556f8e843fe27df6298bc347300caccc5546e4e748e8ae849145f11a68feba2cb9263a093393fd7c0f73be6109116995822aa1212ab0cb2e254457f1d1106539a8e0833b0589a6e390429ca33a95aee383cc640d422cf35f69a60e67f0cd24c372b66379b79a8b182e0a6c67d406638c8098fbaa0192cc1f4e5bfa4ff56d84893948abe22e42ce60a4cfc835936c6575cd8f2556141f9c8a2f30075b7cc4ebbb35c9c10db21b238c0a6cf4c7b179b1b48710c8eeaa575e0b46d85c15bddaee3e5e323cc2159d5a73ae620aeaa795b72df4e03b594a9ba4cff64def706137db206a69999ae3f0867f050cfd34c5b7889540e04727dfb870cba53039a85385d36efa8dfa9911f0e32ee90b3da919aa706abf5f4c5509ef826f39924df81e6bfa637bc89680db55f35256798253a852c4d6171a8c506d458d202de9f708ad2bace0646086c201ab565deae41feed53030ee2f003033b8f03903c86155e08a68c4de550ebf0f70f9b796f29cd95f36e865d633334448d0bdbee9dc172697aa4791796ba31d6936212d227493e771c60d8484db80819a3752b5203d0fa034ff1661c638f5b5523ae1af7b3c08ed7897ad57a43b16fa8e29d4e4a36fe56aaf888842cba60442cc936b938086ce069732ce759c7b87ea0d5538b7b010a244641f303c957789d2f0f47667113ce69a6f3e4b134aca2ffc0d80b528e2a9becd3330157bcd646c44e0335894440fe00279f661a425577b9e041e42eba3728b5dc09feef4a83c89413a5fe7e8be10bd9bc352ba3c901449dccb28d1daead654766f5", + "r": "11ab37ef4fd2d49f93aed89cf08a81ec21f3a3cca465e0d6603ef2633ff17886", + "s": "267f5358f5f36e3f0462343a4b7362bda171f7067e366e304d91d2bb03616080" + } + ] + }, + { + "tgId": 7, + "hashAlg": "SHA384", + "curve": "P-256", + "d": "1eb621805d78ae90b6f3c425eebb3651c3bdb283b45c4ca70d9ff35037042939", + "qx": "631c790076dc25fb3fcafd09e4695bee0a5ef61fff6189deece992e1bb1d6962", + "qy": "3f4e9763d3da3f18d534e91c4e447922a57ea4f35d0dc34e5a2fc130b6c0b84b", + "tests": [ + { + "tcId": 61, + "message": "5aa7dc4547a91ecd408605cf3d71a9416b398ef197f99e0fa7f98f6d236b4c39871df7c8477b8d9c296db83cb9708e0b40c197733d75cc526f23c0d545483bf8c3be40cb7dea0303adcb66644c0e3368ced5b55e630ff7c8e875b24a7e3a6790d2044becd85de0f620fb83353db5c7226e3e10add80dfd0eaa19285ee023fe30", + "seed": "a283de571d06828720360e9790d51c81f6530502d3e0813bcd0f514047128aa80e8391f394774a326f7f206f1aca847cab2df8ca4ec65c6d5d9baaf033b9429262400123a3f1ba69ea1db3ca05c3ef07853916cd4286d23eb2a2c66ed9ee40a961ba46d3c2245b97607ba4447d5fa605a4b61ce310e8dfb485e39a0cefdc791da76b9951427266540924d8e540693d1b6f7e938822c665bf94ca310ed955898cff8d3423d83707a188dd7015d31af36b4626543de1e21adbd84128161ebc328a201db92f3840ef81ff5e21c4b967ff0d022cda79e3c948c0319b5b08440bc5101c265f56ba3bf68317574541d8516d394f560d5ad0566ee426338b079fae00c56cd55574b1b10e503db58af455949f608bd2bca0b562a68b6209b53be6736d043a551e1539514945e207b8f853ca8899b908f8273c8ace66785c6c2e84594f893ff7f2f6cf5dd7640bc69b157f53ec24a3808e5fd083b7a9289fcf78c75d55aac01a22aa3df29167f3ab373aa7bfd64f9d7749ffbf7a08dc012881bd4cc9f55def96d9ec00a9e6f916a83e2d72af4e1dafe5d5421c2f1e9e61d1a7e5f0200da959ed75575f8becc4d8d86a79b60dfe9dff1a3d5d5cd6b8470accc507b8e726352de0b445ee3b40ab0968bc5a9bdaf99bcd371b45cbb1f892a9519596addb82840533c2a7ebac4f65e90bf8e6cbb967bc705ff2edfda5fd3fd003574ec774d97c1db770ab2be0f78b7009e4598aa71fa7e6ced4d76799a224f1b3fb028e5164f32e084bfa3df44a772d62d5e1e1555e1ae9d062a9170f310f1d3bf24d5b649a19bd9ff16431fc87c047036b6335ca8d66b7050df6344cec5fe2d727ce0102b06341a302678b863e5dc3937ac31946b94fc0188846b1468dec016cab0171f7fba7462c6f0436279e1f1d54de893111f892ade307157ea927b0074455cacb55a78b0489f2e0c5d8bebd45450ba349106eb822e77e1c9fcd925132a99c8326a9fc569b5414b89d8da57078ca4a1b186b0f0b16f22d9f7e2b02289fee5002a0ed0e5dcb7f4a884c9774522d2a117563503676e98ec9bc6ba21ecc431291f38268883d81c07f28da1a89e3f4b224c379aa1e80c48ea4fcca571d2ef84a13ef39cbfdfea6d93ff16d6441bb45d73aeef914ee8d2078fd9f59a3d860240687d86524bec4a7687564219f910b6b5d9af2b495b9093a5e9d5e51a8bd1a4adac63d5fb38de9e2c6916a325ba8da79c4e795fe3d02ce1087050ce2ad3a445a5f2ab4de35b9fd902d853e56d551754d1245fad207974aa2e626c49089e34d99f78f61387a92fd3a1ceecdb51f0d7e04c2ea945a794b172d7b164a72d17fc03c65b9adbd5aacac42faca96b88e4adc75500ee688a21bd329c33990b60a7c2eed8cc8f3db4936dce291a50d24c20b4bec1fee028aa8cb2e1e4a32d8d77b66d16548cb261a1f24db", + "r": "72aeb648a893f1cf7eb6a9d0f887bcc3473bbf1b63833259561407adc97d4967", + "s": "7f88b5a1446b604938da1814a25e0ad4c28034c5be843907028c998b35d469fa" + }, + { + "tcId": 62, + "message": "620ae24c3dbf61155f0570b56a602ad5a7d53133b6e90a74d6fea7a81873048ebf563c69a02ea03e44a4131abf142f5451c0c1f8bec9849f74827addfda6ba72202fc99ab57b9569cdeffd3a897ef750dba54ed3e524be88f0f1e535976d2e42de9c99b6640bf99f93a71c7c52759159b8124b2be9990fb9e62ea6af1b2811ea", + "seed": "9164e0dddbb3889a649dba57ad4e5ce82923e0ec9bbb12c019ecba49c91957a1ea3a5e3e3cdddc782c7ba8d23f5530b83a8d9e6900e7b4d730180ba5b4c93caf2683a38502298509c7b6b0ed76ec69326cecca8fa1988896ca9f62cb484c5975dbdcc67dce79e65e8fb4ee67590ca78148c329408e4de1d9d67a3f6af5971968f09bb5926597db7434b121e0a0d5b0a1c97dac31348d9febc50a56e49da831e19a35e97aa8d4be7076b6904c4d13e2d30a7873f192c24bf7ad842f2dedea99953db1bc2e4ec155817513acb892a4d029e50033acb087335a67ff32453b52174ee68c41cfdc727e8b19ce248e255a30de84fc9e787572b0429258e538d4595decf26e5b01d610df865068f7ec5bdc9212ecaee7db7db4a4a0eef84308f149d5dcda83fa0339e1b7979ac3b33c25776c1d6a3e2dd7899b49134c5e5e61e0e4c8009d91a3d39a4cdb400b59f6936b452af910b67d826daf4f411ce72ee1cb65af27718ecae50374aaa45d73679cf9c26636d4811e347bf5ce74a2d57a70dfa39473a1e1e374ee94f7146e720eaa9d75b5c60223fbe7c79fbc9924731629265bcc193b7f8d0581414afbd727f2a25f314229d5c1acd9d9d802fe8020e4b792bd487bfb5f5f54a3003e6f491fbe829f6d43d8770ca4fe5c497cdaf6f148e3aa06e076abe74a1bae3ec27843b66c323dc0bbd6cd756a2bbeaae6e552ee383534af4e925a3980dc47bfb71d086c6924935b0c0d97eb9f01fde8a6e33aa4654b910530ec87fb67b9fd148b7f1f53d4ddd024ee440609436210f064fd4fef0f791fb6c352c849aca1b8beb06403868b8a1f569b71cd74565b642b2110e8fda69185996e140f0d984002687ffe0f829906df7f3c4ee63e43a82a0218bb394d3b36115582d5112544257948f621e52133743a5b6be9b14f02af44cdad7e3f84d8fff1d79c711c4bcece2564d41658edee298b55b4feea6962ffb88fe7a8f2f978342edd286497d4cc48e6965b98d26333432277564e97628c9daead859607b5f32cc7b0e92c89022cf449814c653fb2c86bd0d28617952bb2e6c460305f68e14579d65c5412f816f1b3b27ab9eb8bb547aabaca8cd255993df0076b9523a9efeee1d0db515890f1dcaab47cb377a58f9901512c465625e3884340a49c129a97d4bbb815f8026dc2b5e464d802a32f2afab0608e66040ec6f51c4099cce165ee47eb31d78e606f4044fc9e842d6d024023dee41ab792b36ac5631de3874b28d26210fdb9a8f0b2304f2898e1f837368df7c7cb0d899cb5a4a68b8bda42a3d60a1e407142095050c6938c14f2808a79265390e67c6c456df5d9275d3e754eb0ce991c936bafbdc045ba5c48fdf415412a5ab86aa91d64bd1d1ed426b5e30736cba1bf9fb32be132caa8327c97a1b9168e43293b83a111c67373630be7e53ac33a8c88d3a5c507", + "r": "a1f464cff0b78e727e71164896fe1286b05770f91eb66015a151ac643d54e9ed", + "s": "9331aa0a1bbd0a432fbd720cc225da3c676151a468d9322ab008421ce458592d" + }, + { + "tcId": 63, + "message": "a74d348108368ba8bc58cc634962a10537e122ce6b71e884a69adfa50aee9611030affb935f006b87f2df27b1241586855bfa8f3c883eea7066a710fef0bd5aed4dea5a2caf7c5e0d5ea525918eeee18a9ceb0e09c6af0a8adc9b1fbd0dba3d2870b6a0159023606a0455eb82c9b70b76542eb92dd5dba3fe0ffa501fe662534", + "seed": "90ef0266e7be4494666e55346514ac2c9619cf36a39546db7505f740771e9aeded373788a9be9b3e02eec6d4bc787f18aa115ac4cbf4d886aec0028a9e4aec01a9b5d568d9b9a59a7d3cf68e1bbbaea3360ffd94bc570778f07a686c19c09e6ee9f75f92c0707ba1169885c740b5c8a0be3f98559326210b9ec5b7240f23745657f3de137c85386e882daf886b0bfcfcf8c06a1c7553dbb1dbe6c4c97313a619a315d2b3675cd20bed671b23ff1a7e52ea61fbd0b6d12f5ce0595ba0ec47e538d8cd1f48bef2e0ad5de733a5f49f95f44fb20970caf345a344cb25733cbe16eb9d1ec17f39587a5a9ceee965de0531cd7b78a5f83c91be3f75d5ccc5d7d3d798971d2bf755a0c27fd7b04dd02ed237f439c2db5b2efb8dfb68d7a0203c7a7331866a6dcbd671e60661034800417043cd4d914a272e76d7ab0068a8925af1c143c7f81f37d1c346ff67f6ed680f6658a17e6c55d35ba1b6c911fd8abb8386936634f3ea84626d0d6cf3b217be0eac6ddf0ca3e284c13a61bffbdaa892f3e40881c7f6301d59ab8a7387845fb9be9a918de611f26cab0825c259696fdcceba545b6ba7e0ddcb396b064e66dba485c5bed07d1b62f137bb5f2574d0dfa11a6beffd06add54242a0ae71d0b24e2c3f70cbb2f14d2568365ff4c09461f740647c5386c981eaadfd0c3a574a1a57338f739f50de168ee78bef4a9889c90df7165f5f95743538091702e6ef2de2b573d4b01aaf9473025b18dfe2eebe21e775b2fcee0c2ada0e13d65c30afcc894239bf5ffbd1d1d3e1ca72d2b8fb6292e195b6cd81763ee87f5e70a3d640446bfad824cd2515f8555ed61b4f434d2d54ed89119fbd32614df9fc2fc4c6a43854fbfccff83ed26379dfe633913e7cf797fabb2874b553bdb246083997566287db32340a0d3d54a02d19c2d8d470b7bbd48956421789f7c1ab5868fc76a041a3e420a92621ca3b1319223f638af287cf3e90e52df5e4384b7bc3be085e2b09eaedd8bc3396d72a80ca5c4bec309bbea987f0ee7d342cc43997cef40cccd30d5b6b1de1e2f2ce649bde9d35699839e307423f2cd84934210036cff0752f62741dcf9c5b96da56e0ec7bfcdba6c1d4c7fc60991376e78461f7bfaca6b7c44f1784068b6b330af65627b85d1f55dc6e4c17ad9c38067af9070fbb08c9d2c0f7f5b5f0327b9c4771dad6ecc012ef67f149559ce927141978eb1c64ac960665d7f50a78f2868ee15e102247ba4a969469b6a6118636b582f025e9d16086626198b0ab951a4462ce13ee4833abaa4bc06a67266c1e3420dd0228768d871f6e91f8de019d1f0809c3d78892963464cc2e4cd370b04e3f528f21af2c35029de7c6a54392cff6bfe89b036f807e65aad1f8a1417d7ab743913940fcef534beba47d88bd1d0498a892d59f70f5758e5a242216036e56ae8ac3471fc2", + "r": "e3251aa889461de4b569b2fe32508a464eddbe6d8851945ad7e710f1950988b5", + "s": "a94b78f8d5d9d05ce1f6622ea9c4c23c94ac54fd7062cfcfbe9287d22e3d347d" + }, + { + "tcId": 64, + "message": "6feffcfc2b2986a2b26ca82ef3c079a2b3bd9e9f54a8a367e41d74aff355516cef41cf51e3632ba555496132cb53f9a073e0f5ddecda1d3e41df5f57cfdcec149f7382ec60ed83a99a8b7a71e7e4474474448bdf69f0df722e303e660dc631cfbb491712986de4ffc05fcdcc4c4b6f7f466c1d00aba85db6861a5a45ec430868", + "seed": "46516099c73374d4c6c86de6fc43624efdde337f0076ce13cee1e6abfe19ff7ecc70d61731ed0b1315af127fc1cb829d2383b3161c58331bfb153c5acc95b35cbbe23a9efd17285b54f177783a7c749ec46f1fea1a95813dd45e2202a6b0f870bfc0f2016174fc1396e3f6d5f3f1d58fa0c799cf989ecdb70573ca4b1084cc82bf9066ae8d92ff1122c2f471ab0cc2aaf0317297ed271a5295205d30cdf53425a5156f4111830dba5a03dfa849944ed62858e8fda1c8a4bde131350162197f07362878e2072e8c11d087735bd5b24953c0ff0c884e0ae9d6a8cd34d7a09e65d77d010bca987b471c08a1310c8c28be3f37b5bbb5e55db0ac3a38c83c96d2f6ac096245132ebcf4c2bd13801f3863f1aa1f57ec903a9abc8a7859bbd0e40ad69fcd929cbcb76151efd4370e690d88ac0765c55ee13ea8d2fb84cec014a3f7cdd31ed3dacedcc6481de5fce6aa550082d9aa95fcca6b14af34b7f9793c5d707960384ab779f3ce0fc83c9478e72840b871089c7994239001476ebc85ad9c95235c43c60d474e32dcfc00f5925c7ae5a59b5a23ca959250d3e8bc492339dbcf02a229c18286091bcd9f80d0049b2759119b89dab499a6429265017022881645c4be0367f2c7ffca8f27ee8894196ac13b547eb9c5939c7026f68e3272dc8b6f5d9e67b515a96ef42177930c499584ea5535d3d61c182863981c2f0fc10f9f4d23e783b887ab98755512d338d93afc758ece5de41fc8106525f62d25097986c1d2dbd294fe638d95a5680e1954f248c429e0e576065276eb71f4fba0ee8969b877e3407e6d9eff074c95307617b21bb8177f44a94da4aef93ce67f1fc226fcda8e0a44deda63a56e34b191f1dd519be1899da1906fcd1bae492882c27cf9c8213281b4a6179f0e5e2249b1d050ff22c77a65d3ffc758c197050242776aa9f4d4879e6e1991eab83735e96a1eeb606c9f47c5a0635bc6babaf952dd977a75ccf9ed823c700fcbcd2115a0b09b48925699133654b14358439d51db0e4477f94eac6a02e70c5889cdaad01ad288967c545a641102bfade69b5d514cdd1a0e979904ed9936a1a6eb7dbc1d0f3fb511363f29a2b1505ab055be93b55155867796bb74e3b7667830ac3e112079ab8038211a6ca90c76df347d2b54b8bca27911526b8588bc07771bdeb35a1718e55e0374864db7e143406b3285cdf9500195059af18b16cf3a1ef1608b42bdbb1e7997cc92ebbbaf5e4a8038f01a69595d2e94691f783965d13fe0727a66d98e924d05db7ce7dca0d28bc00e2affd697839d17d79ae5dcdc8a78ce5024f33d94c966105eb303cc48e5ac31fa0c537ad9af02dc86651dffbc118b758a139221960def336803be628c575ec2e0a3a65955ce6e8f71d9d651341e1e2e1ad1acbd1991ff3fd1093024f747fd1263b30c1c5aac10dd023144e36f", + "r": "671e970519ebf031e83ac917472ac2cd3020706cc35f399e0033931aa07867d8", + "s": "02d5afc4af8d48074ee37185dda81179f47cbc1ebe03b352abdbb74345801bb3" + }, + { + "tcId": 65, + "message": "6cd65912e77532355b4d4014649d48af430432d235687775d878b8d01f9c7ab0148d014684fd29502435210a8725879947effb65844f3c6d1cde1011c6576a7d58c739ec368f9f3f69b72171d59453e9897e288a19d3774e7a38d6233c930846a6f79eda0e10186f791438fc9db6a5f2014da4ce9e1174f7a248fd4eff1853a2", + "seed": "56a5e78f5dabcae5c250cd65b7dc983b89bf0763b833c50ea52713192a3d3c975296ffe14e4b0b5f9f536905527e6732976fab19861f94dfb75adce8819993dbf30de152a3d0f90cfa9e4c8db570090e785f03b28215ad7da86548112369303f543b8fe9466996b5dd19636191d6ea2375de51181cc457d22201e9e572e9bd4ae23863b0a99b9408ae77cf6cc394b133a34baeba8d6e3e75339582d8be881931f317a763f0c2ed7c64a56164db31a716273d81984dcb8a1e8b71d487fb3b1686ac90abf37353d44d402665f7a1f7af683eae78f3db128f875c7fa0a11f31b5367f9222064228677490a948eb9eede577022f98f05ec5c5c717f4de8dfae7cb7abbb75f4e16ca7cf7e163e03859f8f70cf6228c0c82ce00877dcca516d40676cffc50aa720175a67ca97bf12c2aa675a71b16ef325edf028080155573b3fa30a5087ea8f92d0127e1d65d820c4bf3c8702d9461d553eea38dfc815c24114f1209ff5c310074dd66eaca975773d617bac924ba0da2241aa71ba3312e63abe97f56579904ac30966a7399e6f9141d74e798ad00e54978b682c9472916fe293e53f73f664c19e7cd24199f3a723b667f93a674f490f6645b7516cf1a8a0dd01a4d6f285c1506c7e55cb9ba7039aeab9d7841a8de31229e827143b272e1d8227d5025f4f2f9e4c1efe6c83ffe3f12bef7fb660b7f12d8b36f5e32a71a5d538415d39ab572e477d212d3ba8ab1f6488c7fb05641dd08a8236b93f1e18b66662c774675763c29a912856dba296664984b67846e2525abdf52ef06980d6bb8d3edc2a1ecc0faebfb2aea136c3a8823a26f354af442fd282ddbba0952f685964c2bac7d2f890bc4b458c1dd09ae35df78564fbf19020b5cdc4ef3f9816a4b3b79a1d52343707eda24f9e90a81f8b75c502e956387ef410f60cbe11d85ae14db47627332873bb9a3674e224efa4feae389400dc16d631665bf94d2cfba87fda89884729c1bd33b2a14e40d85d0d2699e52de14c07d6c541ccaf9034b8a6cd072334ee6faf269c2caa426ea5acf20352b9a17f092479acdd711b5357cb1a48b10be941c1e945af3ed467b502db5e037e96821e7fcd06b40b74ad379c1573c1fead8dc31e2ed979c7a1ba3f5bafc500b853e8909d724a8e495753835784fdece1a23d3c2af2cc250e3c4b22e9cbd4df4bcd054e1b6922faf603e2e8261737a0dd36c76a8bbcd3be4329570db2c668a401314a09d67632d633f7e2da4a6d8b4df14a653ca4cd40557ff7cb7af4f3616a0a9a4a86ad5443c55bc97f1289ab857092af04c0ddc7ce05ee4957700b47d63276c6569f6b9625afc0b1494d7f73d5ca8580f179f8a3a21223b283b8188c5cd5015e2f85242e930f9239ccd328965d581507e0b3c51628dcd915f250fa13b1b3b38aabd427d13a33aabb6f73788d281a86f31d4c33e4c", + "r": "226462b96b091022eb6e47fe32b0f701a20c05e8bbfee9acb1e64bd2de247a1e", + "s": "d83db625e6360c778a9a5f1097fe489e3b3fde56f9afe798c9e7606167d788b4" + }, + { + "tcId": 66, + "message": "3c32142d52718656acf0f19aab83e0ee9f0bf882bb09e5c279fd22a18d5e2fc6acdb95e9b4f2497fc9e123d9ba3505012d3c5eb9ea7a7cd21bc91f9cf04f38d0c9acd0b0840d2afdc5e3fc38db018b989913f0c62ef9737c8c19f7dfef0e62c519ffda46cd9e141e028cb35df709ec13a80eaa531552d0a4f39e4f982b2d8978", + "seed": "4369a4ece453dac9a00d9fef2772d897a9965cb9d4492d309869068ff26dfaa26920e93f533addae5ece76092287cfe70093a04bddead015b6409167e81b9235b5c7d4bad724485fe767172b9825594dccd233668e20f92dff9a40a0c822eff1118ef9453a92bc9536e4c39c1976cdafd406be5e6658c9f69b789488d16a6579feb673acd5e8276a0a26bcbb0639662e1e91b200c1662a2e2c63b2e6924d32025a57ca622088e616cfa046647fef3acf382797be78cc32f95022e51bdde2e1b0c2e9b808c790a941c56fce26ade9fc1b9bb26cb57947add263950d9ec7dd490642aa7f767d25ad524120c22110bce92f8301fca1766609182e62d93acbae02e655d8ccaa813f17f40490deed523859cc4cb2d9efca57f7ee3787382321254b3166466b02f71f2d9ee98b14df6e529797ff61f8c607eaaa9280b9479b7edd8bec55a20e71243f2329093baba691f229bad370eb0d676ad2f3fa0e7daec6fe52e392d6037c8ee237783ed7934fd8984dc67fdd50fb10969cf7a4ba8ae15b899bc1fee197426496b460e673cec607f3b0a37ce162c967e7910916e9b836b762e97ae4acb077974568d399f8741816bbf60c5aa16e3a6745fc3346ffb3c15c4f22287c5f4bd99d03f63f59e8ccf571ca5f545f6166d37ccf5107395f23483551f9bc21a402f183bfc91fdcd1255d1010b86759055e6e7f4a6dd3a4e1430a8ed84a5aa3ffc8d87db109086a278572bd86533c7feb4e702503e04fa7ff90673e9ef8909fa3efd2133ef497b8f774bafe6a6251447328ad52d51d930075899b28022a83785c0299b22ef2625bf9643a5aa57b524ecb2ebeee49364cc9d3d3a7335ab8cef839451c51d78da8d1093a14223147315c2f3b8cffc5e2ae640473545c627615a4c9e702957086ea1d3b056845566290e37bf22558c16edbd17364530216ec2228aca13732355b9437925516f1f695fc615282e753ab1ddeca01323565060820ce87eed6d20aa779e221e8f05bbf972e5f6bece99aed19b392d62afa678599b3575c8dd20a07ccad67e293720c8ff8df53b576dbf4c9ea86b8ce620405d71c7212c679c399e0bf0bd019b3852829d99e8d8683fdabbbe7a3444be5d4f998dbc2a6885dc46a7e81a50df7c3de1b0a1ce6823d29a2af73e89ec3a943f73cdd4e8b7d811ee88908265672408873f460754ac3311ad72affc3dacd2345bf10e8785d066263d5d422f3240c1f8d08b8d10228fa48455f60d9fc2bab5324c2d97dc6f69102071128971206d58e53c7f84b202d280ab976c7f908b4d18d33d805242705ffe612ea97b8fa99adaacc8cc0e5441092f6ac64b17a962b45909ed6776ea3e96030e2f69f3a1d6f05db032dbd3f2b258372bc9417224ac855e4b3ffe16fa6fcca45b7ab358b4f8cc5e1df6e2292d926193e428f2d5df4fc88f17256eeabed69", + "r": "a3e0b6808dcf98a31db2c4f7a21c88a276a2660c09cba721eb2f89a334e135b6", + "s": "489fdfead5a5949ace1cdfc6bb6b3f111bb9a8ed1ab089faf7eef9e357962d89" + }, + { + "tcId": 67, + "message": "ba8b973790e1445ce2d46d935e835c8d9861a35e3fcaf7a72456e41f41bc4e528869f79972d516fa28e7fd1028c789a41e2212e2ba473eb1240a0da7dc6c44dfe5955be8277bafab445da57e7b1cb131fec18c869b33e8e4511e1422805b58ce66782cd9f98765aba8ae16a22b90d0392c8d02353baa58126e546f8c2658595b", + "seed": "25cbe0214b69673dd9e6c1bf54eb1ca4b890812c08fd399c6c698169129e570dd7a1e3e63d68c29ed47fb17cd11dacb901ecded1ef8c99ed1d3f6b1792c95d0510d0efaa44fb117546046801f5ba4bb7086bb82e6969c21767696b0ed93fdb8f6a8012315c44317e790f19952b9e3ee68814171f2f268e140e4851b1105c5b98ea6b655c324beebbabae7fe2c47f82307226159491e08a3db4529c4fdd5b79500ea4ece09fef236ea43d07442879a55aa49d70226bd64ac037ed76773e44caf72c8733ed92a0a2ba49c78384512e750b5e848c8f645fc2a79f028d9d0f861f44013f28bf1d0c1a5a2c56b1c9c548e5472a9ece6720f711c7ff026f8180892512f4109cf434f9d50aeb0f1230558e0ff37ce21ca4e55e3137922a10ed7f7ab474779208ce6d836542a0f7084c70fd9cf43dac4294261b55c6e615575ceee2bb6cb208a8dcb395d4b3edd4a42d39cc5425e09305cc9f6968933d7117aa14329fac8117d624c31af77568e2b235b5ff23c962ad1dbaf738fcd11c547709719229ddc2d06dada86dedbe59bb0b422ae06c44cb1355d680df66a89508a63d9e60970952ce4cd350100d885b2770db5b92b75aae2756a30d330a60d7cd53d273a0f9f1f49d5bbfdb259819e7d5e7af9bc602a710144ae99cb4f441daf591119f0ecb6ec4d5fe45e8a551e4e420cf555d60af98a9c6dea56e32d3182a4850fb065aa7ace300e51489f5fc01aff9e9ce170f50c8eb2e4d8e93578ea401e3b5b3e1191fdefde077c5b8eccb5a660af3ed16454cab8e91f7e0fab324c421c5e99fedcebbea2a6a7e75ef3fc1f88220b5b3193620a4e63c2fd72ae92ebdbce8c38d93b36fb66b6d778ecd934e45a56ba6639cb8f583b4aa6e8b35dd171f284de8c76e482d81df25fd4b0121b30b9eb9ad1ff8acedcf2dcf034909e978d664e0ea42d7238ff71f58e74c74e419b5284b5bea7a677d9baeecf5a21f4675e778f0e2f8c2ed385700d4432d84664786312edde29522d8c82fa8391a03d1222d3338955d480f2238a245eac9b56351bcbb6fddb82ae1563ac0180a1a4a758ced08a54b856321c83c58df8900351b98331de88b67d3dad04939991f08db7f73f335f450b79f0be594f5755cc27f8ccb279be7cb4a8e1006efd0ddbd5d9e443ce0751d4163a4cb01834cd097e66015efdab9cddb22dd1073f012d1cd188dd78ccc97a4aed9444f1a6f563b8f3755d06467c13b5ad94382703675bbb966c060552cb6e1f7ae4bdbfb6e5e741da8cc0cf134167e6dd9cb72b1e44221a1daa0024a448979abe71ce7ac84793bb404ac2aeaa9299ad173e57674dcb700e24854194cff4c5fd5f380250bfe39753e39073be55f503944dcdb92ed66ffe915a822c5c8fddbf9a4bfb2879ee61cb539e706783a4ebc6248eaa09b33b1755900885f6092b0a5001cbea4dbbf7c", + "r": "3145662ae5c140d8dce7c03562fa436e17febcaa8f1b61221d00279d2f5015d4", + "s": "2ff6cc81a9c459fffb998b597b9ce5f826cddcb39da93e943b9021bf21dbd6b4" + }, + { + "tcId": 68, + "message": "cf0dddcb7a42079d73ea026e81fbe1ab9ea584ea935961e517c188310efd4a98912081a855059ba1d0ae2054a4656b30dcb062e4ed6f4450b632d116e4d84c943fa6d4ed2bbe5b008a725ad7aa1818e8d86c095a91893e650eac67b00625132b86cb6dbc4e439ce60af36e2bd552fd1de3d73cf803d25fac632231c8a566f4f8", + "seed": "07226b37aa6326a6ed374d2693016d092ea59cb3a59182a1758b8431b02673219d7f98d8be5339c93e3950adc273c94af5d7fd083578c97213c87c9d543e84b5a5747f794ea8b5d1197d8d885b29ba17e0aa4682a8a3d386ff8e9bc9fbacaecbe3f9bdc8f4d7b9d1ce5b1ba03ccdc52b6c40c71dc0eae612e4da152f33cfe4e32e7182e79b6717af716a041d73a9a4b87437a11e681be556d7ad48af0bd537489f5a806b4b4665c047c48de9ae972b48536e5c2ac6f06a102e80238526f09f78fdd098dc4d2e8b661fa13e3e6702d5a2ce9c94b95105ffa66140c968940f55db11a5090be3d7cb5c33c9860e48f36a9f0de5f931a6d1391d76cddbf132d622b3f68dfc50977519ac814cca73645927cef558dba78d7d7e9800845ded3f3d8cf975d4fc82925c0107800987742a706519f2bdbef68b5449bfcb614a93c6dfab47cf6397ddb8c81c1adc0e6ca1e105d03f8072dbcef9b5b77e170a2f666d2695865f4b4dec5781e4b1ece4206c759048b8b5df0781cf50dc46dec354161fa553608cde4db5cc2b5fb2709e020cc87249217b14a33a578e86c2c8c31a2e883200ed1aa3d2a745d487a5fed68855ab801f0aa4260cd1c77d18c378acbfa2d509b5f9ff65d08964cea3681ed711ceb4b2ed5a15316613c146c1557d7fc17f3e9f73de49cbf4ad33611f993da47e88c14189640c90e80f4f656d38ac485af7a51fa9e97e754cd4ee5057f4fd195f3954eb362a322ae429286a7d0948ed5a135c2cb4491f550c91a6b49dff4a08d9cb2db53998ad43b068ce540409c1ed657e2b5605c2278b6ccaed838c81b1727c46c913fd6c181beb719377159b0eec9321b3a906aab0d8b346d7f9be20144c14aed9fb0aafe78a0294a9e30779a42c8a016d4cdcaa26fa8877305733c7d845dbb18ac22ba468b70359c661a331988e96f9c06881b7c988f9b47c79fe471d0e69c69691acc968a8f0d0cffd9fa350041050ba1cdaf291f617187104aead6fedce7c529f639baac4dc034c24731d29a76f6bec6de708eec3810cea37b81da415ce4a2562f8a4ac2e22ddb9cf2cf3e0f098d82f925d03dcb3103ff81c4a61c2defb8fe6bfca1ad902d3238d4df517463433e24b6926773cfc02a5aa674f19f3862e2b2fde8f8de80b7800385b98910e2d0de04b9a1ce402bab4ae7a7bc145b0cb6387813141f873e64c537beabce3ca194e81edc251b17bca2ff39885eef6c212f262b57a70814911246eda0e17452c6c7ee01743ea975ab24b4768a9acb65c9cc522a917264cf2078ec425efd00e7b4ad76e33f0d62b7c8b31e2e94cab5b45d996484cf6071a16ecb418bc3b3f7590ba628592aa17af1bce537b2fa61d961fddbf38eb328cc6d46ed3b2c19611cd9848ddecfe5733d83aa5f628190d09b7d7b49e7305a9845bf843db91406adb52fcbc777f037d3cdb", + "r": "268cd3ec6b23c4065c63483b45e16d6aabf67d1d501beeb55f92da4fbbcb28ac", + "s": "d009b05c8bd7887e7b9248945c744c36592288db07d24d8f9f7e9b372d63058a" + }, + { + "tcId": 69, + "message": "2c43d1f3db33c722e88845716a99373fc0a7c25c479197eacafd8319455e4aae3ccab041ba382ac41768b7c8ff2fbd95b96ef3a03036fadc848c2b06f8de8b9f5045a1282ef0adb447f293426e1c77f6037bf8d0fe9bf3ddf2de3268ec72b7aaab25e47725c110b13ff13b2413edbbb7f51778af8936c535bcc6ea3ea2eda682", + "seed": "6d5f38132aebacbacbc8c3a0ffbec621d56dd25e085b1c0de431e61c0afb2ca52b446742cfc3c57021a9f65fd5f2ec6cadadcd0f416002b79bc166b5225dab970c2c9aaab10a9a9a950c212e79d2c1c6b53442b79e3e719cc56f7a6e5e7a23958db2ee784c2cd9b1214cd2635c8e52bc861a6685f2f4e93d2ef80802754c3999c5b9067cefc08854bec317bd9802a756e8c39eb450cfe18d66c45a7e5e4b6ca314bd53a27c27d6a762913e10dc8983bd804ba2a5dfe7c0259b155fb5a2d3dc85677761e5ea9b38ced1a7a00faeecbd4c74630e6ef48b304fa1d249eb2fb642e6f521e3b6306b5e3961dfa26646669690b8d8edb9d53547f82b17bb596edb6235b2a9fe3535fffb07dc0ed672884f8f749e98fe76b13a8ea50dffbf479e4fd2ecbc36ffd2ad035135ca4c6b88db9dcb51091275369c6f1561ca09de0e024aaebd7b473ed2f4cdc306bb6045cb978a6fddc8e354a587f3f3c9ab106165d7e1794c9e9d0bdc4fd69bb4bd57fb091c50cde502b089918c1bf5b4a6bc12400d08e53afd5c88b3926390f604bb693b1d548df227298dbda4e9d833d6338ad4e6775b9c8525d62c152fb3cdc874461515db8d971e35b708e0a7a2886b58fb792bb853627eb5a5f45c41a457cca006642a68bcaba80c483918e41f5453c9a8d8de52942f6012b0c84d2c39c8c8d09a37078789ae643dee737bd32ccb024e28e3340a17c730a32b346e2ab82baeb88bee084b0ab6bff4065e53048ea52b3c90560f344e1657a19fb6ba7c181d85f98c54cf55c5549a4fd0f9528a9df4dd234f76db73dd5db7a0825918153c526666cb965a87c2682e55b8c81a967f955cb9023ec8764b30abcc9d08e69e81f56d3f7baadcb59856c780c317f5fff619d29d0501da90f5e8d675b52190e8982a19aea306881d446f68f690e6157d6c21d70dc16d92093424d883165008eed598287a218cd3218ccc2718320aedfa1a7e6f9fea94451ea999b2113311ec2a3abdedf33d5e4cdd5970c316e15558bdda61a65f9da667d804d6a7ab881b13e8c753ec582d8d774f0d92e7e3c4d78e806d91a2b5a3cc8d7bf9900f6171215dbcb61d3361fe3f92e6f53e65ece4bf7415ddae5fc81517f6e3132c687ab821c42100cf3f87836fe22a2aac0b6b41c5a1c1a0865a493d0d126cf901b44340c8af6b38c315f6154036ebda6f4852ff65a4c73a453cb4409267211bdc372fefc7d55625253ecd5e3173823cb25f3ee833f822d2c6cfe8bd9ce9d26719599d842c815a08c36c66f47eb5890e4953298cc5baa8c199f8893eda78fdb05659b9b8402c7b0331b5c50634db9bee63f5c80b2e380a59278751455e483978b6c1bf793c6a701aa7a0d0aa2dbd1d3582e871bcf7451b1fb3787f929616ad43a77e4e8deb026f2cb8be01d9f8fed4a25210f1301de6a4919ceba3b85742c1f5cd", + "r": "54c927628a2f3e3bb5ff129d5f0caac14e6b6d505611903ca2a661efd0d58cbf", + "s": "76c93f3ad6bce6834a2cc4dd28b4cfb939374044b8b7c1b68c4e1e7e9c9c454d" + }, + { + "tcId": 70, + "message": "52e5b74945b62550792f65b2bcff7897f5c3ac61a4c7138a29021eca786787ba0b98d6fd02bc2c0d54256735775b989a91208f94058f1c29e2b90571c47a76e064dd0e559909b88557b1f0c0f0f5442e73e344ee48ec9719ee7006ba4183bf45e6582bbc8a0c7ed60fd8809ca80a9ae97446f583bf5d399099986117dfc75dd8", + "seed": "aab00e303c03abe788f10863f506b99b43e3c168b81bf192c81780c0c937dbae2832526688b7f2fdfca5bab0fd11feae1941d564860dfb062b7bbc61aa471fc476a86e4a169282d9709053274a59940eacfe72d5fd5e365b745a3405ec4d5da4b0a20a3b4f2791cdac7caaefdddd144d66606544f17afdb2f449b47a40f0abc48ee4f08a23dc5f6d07d07e52b6cbf0dc7500118127566f7fc48523351e19fd446e3b90cb29a793998662e08517d1da59a61fd80248df1b3acbfb178f3f2a7b3aedcdb2a66a44ef65456ca9e13c8aa4efddb62aca70e8dc153f6926a3f762748a597fef6a60f1c5d6c2233f4ac00d02c019895031c3553ef2e867f0f77f859e33f6c3e743928478457ce9f7ab837b79c649146b89780c27436cc4987f6c8ba847dac85f9f40e1e5256e306d041629710175cf83fde6498d25d34083918b8795b7bf89bf992847f76c547fa44b5b99f47e999a7a564f0deb75536de97884818e9a3c4b9005de5c0d7fae1d768f8b995c4ebe3f1fd3ff9f66f7b2e9d6ba1924a9f0707b3c0a15aa1ab0687cba1ca6211c16b9d4f93922fdb8a6cc86a65cd09fee048c8e3b5108ee5a2580fa46a43bdd8ffbdf0614bb0ec9986af3f8ee4f99884a2e8f594ae8c941867f2bf3b58b613f02759185a1d484a054e231ac965dcc76679c3e4065d3745a81032ad99e00f24901a08e5d47f7803671c0cdf6f6eb3a80091d31929fc4d0b54c668dc79c1f15108256f7bacb315d7ef9dd96367bb38e3c05d29f75c5d5b15f3f47fbe9ccd255b85cc2fc166e7301635b9deb39dfcbe8f492172b0ae8adf3d1ddeb34ddd31ee6691702ba38060797bdea43c37035cad57d36d89fd475e0d37bcde09c1492e837f353a1d5dd138966f59e3bc9c6ba60622e07b1365d3a2a140b1834637af9b7a66de925e7e45044f0ce66eee6cfbd15c964bbd90bee2a8722ae2378c9601cdecfebf9a32f78ae2e67697415b4f11751dee0ace1557b539484ad1769f308028168c7876147f5cea36b4bd4e4322f2b8bdabca14206a00bfa034cf44ce1040919887d4998eff3b1274f31f878a91c2970c0f295f5f14c2bdee96300e21a82b75c4ec4d4d25391a851425fbc7bbf7cba2008cc1eda1f59dc5a58577c422af388ba588a0cbfd094059d2152a8763b77ef05397070fcfafe5b1af8736a8baba81067d92f2af373b37b19a1cce8fa5205722a5a3c240c73e28e46d848eeced890e8dbf06972892bc1df81bc309dcfca529f4b60eb6fd91551a892e1f64947cde01207ecaab0d5ea038a5ba4395626f359487d1b4a670891894c5429f0d721023f8806b320f90cfe9d01e73de21682a3fa14d4f1e74211f884b5bd13a85afa073d8b854f5b8fbc0283ebe3a92a4858987bc2f2231a4cd2424b2fabb3e3e86ebf20729079aec478819e80360c7e5b45b724109ea1de09d6", + "r": "6b8b8c8d767559734d573edf06eb0abe70be29a170e7b67bd4f53581441e196c", + "s": "d74816dca7baf66d6b71cec3c5ce5bfd1d46a8eb0bfcbe9654bb773e7d91b196" + } + ] + }, + { + "tgId": 8, + "hashAlg": "SHA512", + "curve": "P-256", + "d": "4d0175ae9f74cdb759786e903b73a93ed251fecf5bd7da0a0e43434b2fd49284", + "qx": "226efa0b44022bee3ec3a51f3d90f12b5a7bc2d1973733da6c490ea2f3a9542f", + "qy": "19007fcef15c58b8c76ef7e359d4a43394489795f2947c29ffcfc4af5bdb6ec6", + "tests": [ + { + "tcId": 71, + "message": "a6240d36314a79c92b777915c3e7680a1533fbda017648b9b27e8db0c30388c0f49877ee0903e9f338601bd581c801159e73ba6de5933d1d13163a1b3eb129474dfadec4fc077dcfa1e06d3f935bd0ec9acc61ed4ad6bbd35c74f587d38ad4a59fae3151b59be100600543a0669a91089e0da61257c9f57e4c9460de08ded5e4", + "seed": "c58c34156cf240f1166ad47fd6455f6f9c3b65179070c8d0d3fa45b54f7fbd5d3216fbe330e624514e6d66e88bc092e92bf8f4c168f2358dc274ed423b50bf4c4c860d73b0d10b9ba14fc80486dacb07ed5f1fc98c500a41127f536d2b2fefcedf75d4c000a79ebb7e444fde0cef5acd36e09486955056e427776ca81088c0818586d9a67417a8c80a71b29d17527c7367eb915752739672ba17c0e76ec309c03d82f65e1c67abcd797816a3328a342eda5e7a391a7bec246cdc31446f9861a35d986d28dba20f71233f178d7fc9f57af04271698d11004b272faefb86b867e955616130cfccc82d25965b53523083d01841082ef54840ef0efa63566254b6c5b05d359d02f8b2209b6aeb006f0d9f89d9a2ff593af1874ebe6c34cd135fafbe6c357ad9b6a43851742920228c4d6b6bbc00b12da5980f201634b4141202fd261e97a03c746bdd1ad62bff8620d96716991fe0fc83491891d8510efa7def896709afd109c824a31891328a9b4cd4f6528d3de0a14fdd63d9869215dd9824315e58ba44715e565972a9d446b3badae8a47d986ab133d9b32b2b0a3eeb2761f54e811e5095ba467d9a02061dcec653218c87929cfa43495c3fb2c4e571e153e480f868d828099a1c77668ef010dd386d31dc9ab0be01cfeaf9904ab9ad49e4f4651d81af3e43e351127326c25fb4c6fbf213e6b9f53816f83dda23b3836ccf3b52f70ff4c6e852297e40adb4804e13587acd85f271be3a94cbaab5fc1e03aa1d904962657d06abb801eb1feb34e461849ed9d025bb9adc82df3856b689edb63b18c4560a9f46565fecb59c16add75177fa336d1410f33693a54d4055b34540837b663ceb21f77bc6b4a71581a48417b2087cd1958832ab1b3ad8459c3b69f1865cf4394dbda32510faffe3f37b10b46adc0cd90242d0b32e940f14af0bb531eed41526df8ac3eb76ad651e2ff51fded30d8dcaf158b7a0158f5f1f477b279600956c708df26963a852cf0cd2feaebfa7daf0bc558b786f34c6f84151a25a11c4bc5689cc6da60185cc1d6f118cf90f5cdbfc81f979bc51b3f4bd15d1fc65ae05293b5a67843143bdee8d5a6c9528223ea4ccc2dcd8bde15f76a826717388735eabe12590d86165fde6ec56262eee2b8ed32a28bce6261fd77f74c139bcf94681f51b8f6bb3650eed2e5f5d00a206d97f08be185afa12032aeb44ed56ae23a9d42060aed5e3d7244bf821bc502df38d562145c91856236d9af2cf6940e8703ef6f319ab5d6227768b5e71ca641dae4b6800937e085b92c784dd680408e6aa9e53ab475202cd7b77acb50a45fdbbe325f1eba187c666992eb10bd9b45736dc71fce3dce9870982de9115d9c4c04ea0968676356855da00805d9ceebcea471c5ad2dc99c8b32a27c721a1cad2b008cf0e6b00131ab62541c0d9ab4af1a4eff2fdbb98", + "r": "3db017552403b0f61b41b03722038f308e65baaf07b0b5103d21ae8f889e1766", + "s": "9e309dc597d36296e5b59d6b9aa6f5678a27e92500fac4174cb8e1c28146b690" + }, + { + "tcId": 72, + "message": "e6612642e42aa4e271d86f4bd5a924f1e99274196c374ea5fbc6ccf97db098083583047af37af987fdcd21b87e977abd4fffeefb9b322febdb19bcdeb2a2af9391ede34f6774f0d88d0f4c9c222abfb8a47e9b2d4329f618d36ceee3528797496944e33e4f1e3cea2c3225924b0257cafd0e6549eb18d7752c336ea35e1d0ab3", + "seed": "f3aa2bd976afeeccff8e50fd5e66afb376926bd0239998232a48dc0e0d85f6f0a554b0e232b03e6c7a5dc6d7dc9194a5542a40e523b94ccfed14dbeb0d05cd7799df18b3d399685e4c1a789df75d6a39edcde50cb53ab740a4bb0083dc833ea3dd9168be00a75dd202cf577185a00094008aad8aace0023f45391561db353890adb153627d9b96ac7271262e3c916fe9062f0fee20ffe42d067257b865067c813b2a26319dd8f2803e55033c2ecf546eba1ef420c9726cff9166de544ebecb433ef0d93599e4a9cb069583b953f23d90b1af40dc2059dcd4f5ed9e4fc374705f111e0abf3ce12306fd4a7e8aa771b7b6963ea7daadd1fb78bb496d48d09b944caaed2307effe329376a6094dc03c2e13999606e3fdb99b0bf772e20e1329710ea556557162f1664fbc02671ca59cd8186d8413a6bdfa660cdafbcc9aa76071af01d711491432979cc381920e02357e8170950548d16b37c574ce8479ffeaec195d89c096f5e00deee76928b62337fba4e0112669901aa0950083dc5b16190557839c41cff4532df913009106a140d9bc99c06e1b2513ede0438d906ac323443751008ffd374907e5a26f9cf1b2573aad82c95660d6c26640b15465b5b446474cfbf900dc587c2be29a1a62a7870f9c7d273c23126e8f7c9163c3a7cbd1334491e767e3442f73084fa12e1be3a8e89e73d94949976d6d81f2bdb80e2cea4bb1b743a906c1114404be4e7601131da8d30cc5352932950fa85a48b27ca1ad830cd15b40256f0b39c1942023b3df90a4d89fa40faca7ac68c7e38e9effcf2deebe38fdb772ba575a7c331f068cfb3d9c1879502cf03002ccfc88c03c69eb0b489a9861240eee19e28d1e568ad50e65fb2469511aafcc9f0766d1e9077b08ec7297fc735904006193e5eccc892d2976624a099b7c22ded0012c529308cd1599e893ca02fa6c163e2b773ae10088bbed0aaee42dfab03e6c7ef28e41bec873d13844bb4a913bdd4edf4cef6dcc6b75e655a8a830d8fb499aaaa8ad2beec2d7a65474025b4ff4221e356bfa56fbd7e68969b31193a907f8e7da7f08166a2f983729e8de37bc9990e4fafb4922e2a425d17ff5ccb05632cb5dc51c70c6fb547f3b672b89a983fd463009824e1ac6e434b445234aa602880158656f29ca4e6b83256cbc5a8ec09765b9ee31e3b32f5e9ef702989b161c5987d6af108f6be62b1c10b7971a89c2a3d42f76c6ebd1e458101eb967737de6d0ee50abd097e38440d5d71de5874e00385e1bc2df08d2fcfe86081d6fb6a58d9ef309813d3fccece54f7f6e9303d197dbe5ca38392723291072454d05a9ab92b2f5199b1e9de54ff35ff41f0222aa04b769d483ec5db64d93ebad6321067a678845e2c3e6f83f5af07307b2585c2a82354076b122e9d41f42b912bc1acef66d73b548d3fe7ba9e47a8f95c841eb", + "r": "bfd4a02f45ffee9f6e212ab3c1a2f328a64ed5b71decb160c8ca001b093c4115", + "s": "88b3069108bf1a8db92b5ba0380423739e44e9479cef639449ae228cda3dbad7" + }, + { + "tcId": 73, + "message": "fd4e086013ebf20b0b4f27eab2503ea73d01c0852d0f28ddf12592fcf3dddc68c6f0da03476f211a05803a154f028108dfb759a2e02e31d75250cf3405f78b456476ec34591d5f97a4a0b45fe77b2dc05998f47e2341deb3243321a706c6bbb9df21907cc3dba1d3367ce4bfe2560b74f7d6fac1b16a67f5f3b010faf1961489", + "seed": "27b8c24f5fd677789ea5f5ee33eab01a3a71d6c5bb06b6d6ee2dcd3b22579aef20859e4692f4bd477bb72cf7665cad5f3baaf73bca9bf94a2c45277a682a08f8b18535881bbeeb2d1e13cad57411eb6727998966c1e80b914f87ddef375c8283e06e11b07398fadae5cf3387533b367a2dda2671c0b160ff2c033d86ba7e1ee38ccae5663d9082193562a173291f02c774b89400b2899be434f9569fddec1231a3d0cb7471e5d757a9ee1c0f6c11110cd4614efb92a361361e67a1ccf0d60dc4f0370091adc8fe2ed9098667e270f7c44ce79646572ca69531791cb44a27b595fa140a07dc58b4204552994dce781af7ced5bf696cb320065059f558e5fb9643ef04743f3f1ef434bf839263e19dc3173bc0e137c5257b028054c53d3afd01bf54eec4b194a7fe42b4bfa997504239f0c4890f3dcb8ddfef43060adc8004db04c1546051ce43514b210009e815cac8650a56250fc290099452536910c8d065eab64e9e1e4a60d7b9e3b722f4083eb825c7003f8d898aafd8beb169bde3e61a85bfa836ea95d529c47c38871a4294f75a9f22b4d6ddb5f14cb8848eb19b72eac31dad3bf6ad7a8fee93e13eb4cad20f677e13594b50f0e080ebbc9e1f09b14ef4327a01fdf3d39a1c91c776dfab6313d1e8a91b58d9b73432990a0a57241f450f9cca0e10e336b752c31abf155f9681f3f6c5b2f01e00562a8320c3663e0fefe4573d93bd9dfd8f9b0edeb28d3f171150c9e3d53954d9cfb9ea5895ddeb1781df9a3439091613a3c83f5019cdb5f87e7d666d1e82f6463117d9c3de72a7187ae976e75b5d29fea265f4cb09bad0933b4340b48174df7b74823898e1b7e1026ba89063eb1c725b29185df2dd933b2e4e139f716d153854297c0d87d86e2c3f0e14723b09b7c2ddf35d27cb8455939cf74985c4e3cb0167fd30a423933d4cd5fa0df61ea017bcbf9b900fcd588dcb1b9aac2f8d0063281c56589a3ba23efe4e03afdee95b0fb8048caac932313304056c7a662287821918ca68afe867d5a8ceb6f955fa53df25f8e1c0e476f6e359e34ba45a21f2a33090db2e86112d301378836c55bb5dc6acd1d2e2db0aac11bda3f2b72735a0c5d5c4e44df87982591061c65590ab57989007827e69ed71e177a536b32b188f3111e7c7e7064ff7ea9bc8aabce73814094a3d651eb83b9ddf406578946efd4fc8396c5c9e570d3ebb43ef73cd994ba6ab00e3eadf8a19b64e47448eaf07ac7a803336a6b30d67c0e8a80760e5a6f327e2548696f5b9840597e4b14cbf8a39ded1f626859aa80a3b4a84b76995fea6528168bfb6dc8a0d2b693bf41910b51a65d4791240e0c8b9211f8e9226325c7b2acc1775c6bcaed7955e32b8718b14daafbd6e450d7d4947443880c043fbe4c1adc3ab1d2516e0bb8d77d939b5d777fe4ed58fe9494d0f7f6272a908c94d", + "r": "f8a1c57d10095871ae69bdd25b256b9d16427bec15baa8911e9bc5d02b1ee126", + "s": "4425d086780f2845157367dc66b5a3c245714b150396b11a18a7f595fbdc1a34" + }, + { + "tcId": 74, + "message": "1dc487a2e6abf3d01ba676c3da18ca1c7abb397d225aa28d1d9a4db9f40590a0e584f87384e58ca34a65a2c4d71a86964d89c86111d71b16370b87734e3e35bd6b4ddd60af18a6421c4b553e70da99a50e9bf829c3fbeec3e4a88b2a27a9eea0a3139e70bf943245b38b5c009b00bfc236af1c3cded8d109be9df4e25d59cd79", + "seed": "7d87838a3c42a68c3e2b1f54d464bbc337090751a1e54699485f5ee7fd9bb47a5d58f09fbf829f2ada50792b9fbed50e5d6632de376b3d083aa9502b22972269d995f507e2721292999f7435278057fb1c38f5da309a27406109aa5e2a06c1ec537542353ba1615815e1cc6907af423ab341b2a8d89cd06bb7db188d5e923be399da928761b71230bc1213f3c59eff26b216d3adf795440a80462e6a578ada4e6c8b0d4c956a9ebec267930431069a0544b42e500eba6fd010bd42e454d28957a3de6bf63cd85331bbbabf941ce21f7ccda5e9d296ba7000490e0114fb8ae608c7ad680ea8e1adb39933ff6d685de3af99704dd2efd3c5de604d90be484f9bc7cc7ec858fededd066ccf229075914462c4d0a1a1030a34d88dd81bd8c6ab5e3b791f4188d7b3090bbbd05c3c1935d96f672202c752def490f0470fe3d3e7470930abda0cbdf4cd93c94292899711163e7d8ee4d69b6ccdbe91a4fac064b59af1bd8878a03e50082f3ae0eaee1aed7eea5bf2939f909f5d95512500aaa954cdfe230cc9ac78fcea87fed22c6d07e3bd4a3ea55711a5179dab0612259591eaaf3ecde78db1b5d4a6ad09faa50dc23e4654b7a8f4dbe6de91392065e2ee19ae57801115bf62604d4a30285c1cbfad72765f1203ca39e2377459a889f38600e2e12a28bec945a3c9780391829f48264bee222895a93c57f5f9c3fba826c80400d64772b5087b74fc61e84cf63f0a0a1c682b77ab6103c4c8c23fe3804601570e595a573a7a8b5131caebd7f31872e5a50a9065d8d70f5cdc2d2595bcf1fa6d977ef47dd5387d9778a33a9099fc80f136951c06ab3f6fd47dc33aace285f00deecd0adf6004be3c6318d4e7e379cf9116a6189c057b17d91f497b0a6b4129106482ad166ea8f01aab33456f200c3f51cf924668fd9079edfa2ec234ae1d92684835491ca229eb8b6ac9b561e2d0b3ab25dfe3fefe327a109377b7519f79011600eacffb47ab6e7c78c681f3067fe04615da61ea8c46286c56654a146e523c7f8f0339d79af702b536ec1ad2deab23d4cbca9ea8817fce25bdc9cdc8cbb30dc89661108e8217ab1fafbbe247c2aa27c34cb419e00ca6130585c3f179a16a7aa5ba298f94f231d8f445b9ef5e11b7041096a23bbfb72d46d3fe30520e1f2502374d184b3dcf2174e085d0ef71704943a158f4b2b66154a7117f795cef3e6f93e21b059699572c2160463ff53161be0afb6860ea7220bed110a71591e45c81a646c22d3bf50a68b6a4dfe1e81f881aa159bd38d924bfa80dd65c160efba7dc08a96f0ed94f02c84b0f3ad4c31225bfe27fa177b15fc52212fdae47ba9d0964ea3df5f6cac0c9f8ee9d489b052d2f0d35e2a9ac4c81f8c6543d8c3974b8912b2daeda2ebedf738b96e6ebe7a77c4578572deddbbe4d2c6d15e732379bce528625e8e6715c", + "r": "fa2981c02e4ba2c46b9630d16065ca0ae617ddf38785c64bae26c4703790df4d", + "s": "c8f29fb7618e760411ae182b9678a55dd5c0bf0f64f027e78ce780bd23223176" + }, + { + "tcId": 75, + "message": "ff55bca8eef70b517826b444bab2ed7e197864cf479db6e7abdf1d03c626abaa4fbed82cd0c5a7f27ddccb95eba76d0469aab1cde825e3d8818d6d96ea892e43bb9fec28b65629ca454df52a7638751876088cf46a674a3be68f83f98fed40730642cd60c0e30cf69f1b343260c9680587fd832afc35858800ac0bc34dc8e67a", + "seed": "ae4ae0cc9b85c3588a290121107ef35a946a22c7ca1db49145fcfccbd8e031be3f443991b108b1c7710a0be98800478f457b8aa43daf94f023ff082bfaf4400c95238ed24c4ce1c9032abf6a803396036d9640a00960240c77def0af9d64c0047b39b93a18134dfc22772db22254eece396a31f9031522df8d98b8815e989df0adeaca8fe5a827d7e9b22262b77bbc02a5038ac8ad5e30b9ade0f67628765866d9aaa3d15e8aca71c48a89afc1064afe22bbb107fb6ef53f5931a04bea1e131f0801c8dad825acb711b6c735839ec3aac2475958f8c71d99b4900deb9494ab359abd093e9482d3c3305a77eca249a70a9e9de68e63824246f8bb026f0ceba8879e904849b46a1c7bb54f1229e208f34dbae8eaaf744dad91abd21d3798f1b49741fa1ad03ba0382e668073e9dccd81019e91c9360ed3276939b3e2872b97c85a00fbda5dca010299c1fd2cf7eaf973126fef3d604a51ff7e3556bdd0d99e2f2b3157af179f6a9131d71eeb793903c5da68a382acda01720426c095197c4d5763c5ece7a83d7d535222def5ba8ba6da1d58dee39e78566cfdd34338d3f2db6b44a5e5bb9d1669340501391a67d00eea4762f58f08f484e458713d9e488a87400f0e727ad43c482940472e08f4d12242be22a6c3d62cffc50dfbf02a119d701e7561a4d25d6272fa40fc0d3ade2a47aec108afee44fd7fe9f35dea9f45554cbb17d9a7908d32ee0e4e66a2980cc741a7dec9c087cbb7eff5b7c0ee13a3f8e40ce7bdad4460d150b639b4371dbe97fd42ce91aa5a19d5cb67b7256ee7e4f0870a3ee6fb962a58802ba46666fc73cf2d685156f4f1fb147d4a5ef91c6105782e9e0f55565c8e73728a8209c491de6f3570f3a18342ce70ecfa59ca78ad738fe34e63fab3fb858d15279d4d89d37d4eca3268ef0c16ec36e7ba21e8f96ec2934a72f145f829a319d8b413571e94270b5edb7b571d4e3fb224fdcb56c9000c9f0bad373f5b1f0dc924af99f91d905ee42e91b0d951dc80a1dbcccb2b970a5047b110b75132186b0b396e4695bd29041b06dbb7085dd051af2bbe9d8ce35a72ed8d4a110c3643a5ddb9dcd7dfd162b468280a709e39864469ddff70c24db7f6568b789357ad7608db2e76221ad69bb568df788fc30539c8125f4542ab44db5b321a8bc7efdc86013ba5f28e47ec4d14d657c5bc0438339847f7c15743a96d107eac22acb3ab2d57c04e06dc6cd9119809dca2176be376def4b3a3c144e49da92a6d30db473d9c0da5d8d1a24fc09f24f08c2d2f7e32ad542db5a17f795105e8baf1972146bb9b85fce0310c5005e51d6fc21ea54949e88408037af2e3075e6f3b7f2ae2034132c7ba263dc0e15ffa9f6c162546be0fd71570cc3621c5271450ea1fda6e680a4ffa488ba8f47f3c24ac2e78e2e780eb1439a2e51c4d462bb454743a8e6c", + "r": "a6554a4dbead081cc55b6cc3d6faa7cb15519a811dbd2884335230c7f4e0a02b", + "s": "d22b9d5c873a4344eba00b53274297ae533b2bfb5515af83b6e1604a7f9e26c3" + }, + { + "tcId": 76, + "message": "95455166f365cbc9b6985a0ef83b33dbdf2b1e113043f483321075600277681d4aecbdff4bef313813b1f83446981ff792b83ea805599253459d55259edf7aafcca1a61832c6941dd4246bc2963920883513407d2735bff004efc6df0d055d7f748f6e6720550ad23665dec44a96420b7c622bfb5eee3e3b08c66d3c99ca83b2", + "seed": "4d33988ea9126a4eacd35dfcb959e7093863ddf83b4aa170792a12e032252b00a91086a9f4e24128024f95ec683e5c981206ee11e2536b9a5ad57d1b6258c9d72e6529e81d1c5beef2102b5555b0d09d93756ee741cc0f0f4363b89d95a81ebc17a3f6fee95dada70a1de9325d310a00ccf4354b1fb176556e58d05c5df4d9b3f5ede0f75fb5e53728332637168bfaa7acff0b89ad30741c80d1c60b49f5d6f75d2bb4fb1ac3f4b9ff840842d03233f7214d139c743d389e97c384f8b12b670fdb74e400125bd230b6d2c7b7a413ad367fd1657347105ba498c42d8008c6fb43cdbe61bb1b90ec85e9ea4d462ff62e016309d6127c7f96a1b8182ac97f45b182a315debdac3abcc3cd1a9088579b7f062f49f57fed1a353981537c2685c24ba61171b1a7081de5ca656c29fb3992db06d27ab548e6cc6310146dc2c6833c33d21848f2d6d90550dd813269a7a238cc47e263e27936a1ddc0a0da8378d2b080fe5168c66fbd9f41b123fc37eb88a1de059b30104057c80b8b2ce2c030f1157f6f2276c861ea6e43e44f6894010224dfc26fb780de92b510e3de5bea267f5750b24995c287bda7c2fa06efb4b318d9edfc0e07b0b33115aad05785c90558fa0e2e6e9de828f67be8e7a6a1dfa5040758e08ac462519e39a67e14594463ca372571bad154c36c3c0e575f4508445152ac804a9d6dbc8a61c991c238a6dc1f2e26cd22d906f1f855a312c4b943e1fbf3781280dc9da6511fe3217b2819ad05ad9486feba18010f913cfd6c4c3fa31c7e8a101cf59d61124007ea44ad6a863ad445e6e63d9ac83585eb5515a0a9e39512cac501e48a309440fc67a2adaff59969b49a251f7bbf1b39c34342f308c5278d74ff6513ac7d1e6f9524c5e3648b6ffc4d5cc615496532e459aa827d1cbb087ee190ff986b008aeb1d8f61a88df1fc07a411b0470f11d324588c273133aeaeea9576f83aba57bd90d14b3b81bcbbf1c7550220b38460957b9ac97c13357bda6463709454e28cc22f30f3bd670886b366d200cefd9f317c3cc1527fdfb6f92a2e3f1f56c02e1f4737851a64339853f5210bfd45e972026417a26cc3dbc01d748d09c8c73a8f23affc9bb19ee34b6ed39f5db391ac287beb29f08d74df28d573c971fc53ed5e17024cb626f4e1d448638915300f75efcbd5d84f6bd801c054c2eb4a1c5bf9263404519c65df04b9888046fbfcad7fa03ed40bd6bbec13451e62bc89051c2b429be67fecc1c7270b9383de0163a5f970003f5271002d3a542914da7250e10b7028ec07ffc903dfb411c053d0438964c061bc47f143dbeeb2152cbf1313f0022a923a685035c91809391ad9c961c0349dce86bd2d7004846be5f4badc8e628c8e6e370aac6def174bb55c84c8147e603ad386b09e6c7ed1d78eb5465eedac95bc0e8aba630388dd370c13099215", + "r": "5c65b9859e47107c9ebdbe13acbe50153efa172cda55c75e749bf97f39d11f28", + "s": "231145d38a38a30a2b019f8e79ef68887f44614da8d0eefbe9ea595d0b8474d0" + }, + { + "tcId": 77, + "message": "0deb2aa5771ae47e6863529c288dad49df3ce59369b9142ef968b28195630b1ac2a4817bf77c8bba849d33d1f11b8e502695e094300ba48e66222202d4691c9b3544b7b6ded3debfd0159f0d487b511b6b87eab1fe405f7a5a5f4fd63b5cd023ab7b4d4336f9d81146dfd49085ffeeb6f85e5ea48dc8168287eeafb6e4249ea5", + "seed": "c06ecac77b0a387e08d351c24ac1911bf72d1f61133f2b8173bacffb17158dc8c499073c3127129fd479cd996aba7a22b89f8ff4f644430ff3b111a3fbd4017676e93a61cc140468c0fd4c7f75923b00ad78ca55033311b0a26d5675d00a7d55144f77731d9be8be352ef1f1b2c062e1d238ad28aeea8f5f7a263406dec06bd14291120d366c85dbf7074a62c3eafb5888f510f87c81b5cc277d479b384bdb0b90cd5ab1f2dd70397072db789ed812f3fc23124d9e5e3984c9032388d490b0f3606ee494f2e00f7c83f0114198f22f1b0458968fad7294439f1c441f9be93b76ddfb06a70cc5caf2309b99ce421cb7505521c170858d9eca84ff1e683df1b48ad87b6db0c3096efd0013d6cd6eec8333353828bf852ce9f33522ef5a599862acac1b0d7c05864f9c8e73d1acf7f3844a03cccfbc8333c7c1571892415d89e934a4b6d32acfefa87723da319d638873b8606978f00855d6d2b69a86889526b6536bf64177e79e3bda3c1597b66203edfda8518118c87206077e78d4f82540d0c60ad9bfcb92905d2d5b630f7f3303738e93bed73e52272dda13a59974daeda2331fe8598bc6c6c0b1728199605d45f6ba9de84168eb1b6fdf7496108edc4fd3f9095001c36c3037fb6552e4764da954808b9a71d83be34c008839457ab7eab7ebddb0fd2a893e7d3b19c03b44bd4d228323be59affd70867ea7e17e6bf256bcc6cc489f4694402de18dcc286eaadf3a7ff9952f7f3c0eb10987313c8cff922b666cec5e896b14fbd10da14a4c6a1351ffd59d5282afc9c57ccde1bc3996b31c8a5104e8addab8a8e822da3af020fc758f5195301ec1f25c4e28bc334e11398585fa129bb7a485269ee0e9344acc704e6d754decb88525c25ca2d5b664c62781931aa9cf6ca562bbf2f4868906791e9839f9d7269a5e3aed8eb8bc43c66d1decf0357aecbaae6bf347a33fb0ab3f8201e153db14f1dadc8ea128d1928ceddb346e17a6569aea60fb9130ffb16c76b276cca6ca9902b63781fd9fa5bd0d9b839eeeac73a1f9f68662bf4901a535daef0cf6d16f3cefbd626d8e2e378eed3f032b121a4e30ecf8a3855dbae256ad19dd23f30b4fa7cfa9088dd934aeb8bc7884e09aa043516df6672a709c11978ec4ec7034107884f28e93f6739005a1a283a29cb5d0baec83720d017e7413c5f05b530efa8b9b01dfd48e52c7d3efb3d5aa285631262615a7d6cb21da7bc5c50970a5c869f5b591999a05005c83fe428d2333db81c7d831084c09c339d042e07ccc9419cf62ec2ed27a177683d982c9959d0f4ebc72b07e4f115565a7536f27704370746cc8fe31bc8fe5542ec3f999621f14fd4e097185de0a886fc20475617a224baf1b12053e475a5f5e42ac4c779bc7a76ce2fd2e908e54f96a19e9c8065b470f7da633b95d19911bc637b8850614fb0c2752", + "r": "7ed12964138e882e09f4eaee70a3d0d610d1ddccb54d6b87009215df02fb20fe", + "s": "30a56c9aff9fcffa6020eb147213077d5290ed6116c9a44f84f60588f3aa80d6" + }, + { + "tcId": 78, + "message": "4d98cb8adfb9746867044b817c30b15088e6819e5c0ddeb2e30a75fe74e5da5b5afdcd595b22cff6e551909e0f1c9b0f96d6fdba22b7d61bf226adafaf59baf8a25b9e183f482685a0a4563228d0d990b924582edd7db6f8160da281a8709a3b84b86ee8ad5534ef05da37d8b0ec2895a8551f4a953eb111444c6d73372b60d8", + "seed": "8caf9c89365868aecf01612c0ad28cd5d9b7ffeb096f7bd831f547bcd9f5b8692503bbc67c4bf6505207671161b72cf227a3d672a957bf259c0ec4a83346ddc7bb0132201d9db4f23c1b1238832dcb67c97eaa0a12936bbf72744e2477cb4367e1a822a13185946019a6b29bf58276d461f036532e45c9f1050fda6d73cbd0e7d50da12ac0ca7723694aa285f0b3ea316fca37c822c09b3fb60b1a84b3ee8d834c45fe39268da8b088036c49c07e1bb6318c32e43520cca215dfa3def08d7eed63a6afe7c84f42c104f9140ff841ab60f9b33655f9bd8f863bc686a0f60b185c63caff1cfd34a4f61cd7553637b5f4f0ba720b35eae3eac48d52d522c6949d3be0a0d86113acdfcf6b8ed0d6d604dc7752b389f5bb6eba30c31fe95867263b48007b8019c607b0d2be452870144e4b0ad88a541f9380b8c3a7848de9a659951557dd1b29add375fb9ce8c8d14acdbbf9cdf6e1a5e9d94e5ac8bb9a42e9af5f774133d6242a037838a0d557f82cada4d66cd15ac26e0ec84c4b975caeb53e2bedd5fbbbc021ffaae835340fa8aa069f1d3c707f49d3c3c981606bf700b536e806f686330debc8696239d68ec2bbf0324cf7d70b58e7e85be04d0d7a3bfb5a7fe5b2da51a316adbc027a205f1f1c73c85ff2f76b42c839afe1d39311e244930df58b4afc3663fae4821fd28270a20dcc3445af36c93c907e2f4007532ad79c6968c2790c8765fdd432a6e67208ee8a08d669977bbc221bb3c9cfde4163ba9a6c6c897de1bbc87d7ef660af8a97d6c5ec35eec993d90aebda72089349669c5989c81e4f47b05f5e2a6a1a23d92a260299f9bcd8d25b4b1a2a23a9b2a37a0ec01e40148acdd34914170314b518b878c114793ea18503afd2d3601676154d31ccb8ead0ed314bcdfda1784411c6d0a2dea03afdce567d3e6c0fdadb259c61e56436dc2f46ddecc5fa16397d2408c7bbc97b651fd4fb92e2aa9db443eb897307e2b58d8f8a6b20636cc36ae2f54eb2c2b95a199c21c5dfe565186eaa6867456223ab328352f61e9def3edc18263543379537173612ca5b5fcda7c820f8b4628601cdafe52b3d567b999f42167c82a68b8665c97c187b11f6b81d1c896e0b1ee1d9b3146ba10e346e75ca00812bb2fda9a3f44df5419dbe2bfe9b1d444e43df73c9327a07619f2d1cccfcbff83b4c25691a314bec2eec9184d200992b5c7bb84427b70643e06c1bc26528dc37c2233ca21d3824ca3f8049644cff78b0ba21a8aef436f2757c8e1231a4b056a22aaabcf434f5137f3abd1d0b5d11c8968a85248d70a61c4a0216c68a33589328fa76861dcef6477d58d7b1b25b186f67e0985fde664a6907a3a22f14b0cf1426092b1a99d4daf5981ee6dfb3f4b85e3b372fbefd648026af6612552dffedd818c01909d2a9f19d0ae375e6072efb9e8a086e6cb8ac1ac5", + "r": "67dd36e2234296f82a9c85fa198345d1460872dd749524b9b999aba44dc077a0", + "s": "7dd988da6c73fc9407f85ec829b3a864fa5b7e836d7f0565c818baa40796b033" + }, + { + "tcId": 79, + "message": "9fb12c8e88dffe409f8fb0a9e785f3ca92bbf690d659e5048bed218ba96f0e6c61889539e503d22db79d19877d23cb3c45fe3b4cf75da534eb12925b0cb6ddb9172dcdb3c238c9ce08eeed7b8dd1161d482e418728269a2e3c5772afd1db1ba519a7589441146b87866472928be18b5dc16336285cf6606fc20ec72dbf4f327b", + "seed": "8ad56139e96e8b99fae040a6c8b0ab49f4a358684b750d4e7cc200e289d6a27a725161f8e023b9775f2156b06ec973599bf470a192db4a68fdd0dd59fa16df2510afccdda8a85098d2d6a365367d1c73d6aed14969eb08451cd434d09883bad946a2b317bf778fd7e0f35355edb1d391a351ac3872950d06d1363ee1a1b75bd0eac58cc9bfe9e6155e80229da9ac50006591d34a54c8b12782caeaf963fa199db1df5217c9ba7346683538a38a6f3d33d71e0ef4c6ed99d14c3ce954e4d8b321e3ca29d813254dec18e215c48b5a8b010bca80d3e1b24e3815afcce2252314b099842a6ec04bc9bc2678fca9beb351c576f712d74102d6ce71655e6b67a2467d0a9c94395f171bad14cec23dd6c7af08da812cc2d5956debdbfd8190885c9c29cc900e974cb1b267ae87663845c9a2576c166165a2743b56ba33b50501837b1bb7fd2fa3a2bdbf8c1a06927e163553ce6ccec9405b0fbcf1eacc92a96171ba6343978fca93e7b1f8202b17b75025d9a5a8c30c32ede5ecaafa336124a6a7d6baa8da2eb3f92c6a658d4bb4e6390fe079c58d7050221762e1e11620bb01f9bcd0b6790874b49d454286b55163c8bd6745a0a2151b2a103b1dfd7523379259166c1656e76ed57eb1f29680a29f4d8932dab25c3a61f9694fa15e41c23b047acfeca12fef9178bfe4303b14bf300cf25f016c5cac5198c848564e712080e496d068ed641e873e43d6bd756f1fabb70938cbde09ad371c06285b8028100d71200c5f0db07d418664c96fca51dac742b4532d7ca375b4560b8edf9ecb269c06b9d4344767c5f501b2956931e694b8a3307f45b806e892c07db913db5717a6c646bf1cc30856bd919262396b7bb7eed5ca718bfeed0ec59739798ff4b3dfc132e9c759cd825c69c9d95c65b8aae319047265f6dd4f4a937887e6f0a5e2d458d9a1f67a3a88b896a5863f27c295321522f0d867fc66e21248593c3d7b2ed90114494751516582dd657f8eeb8034f52120a19cedff10b7de77513c1a2ccb1d7136b3deb6c528514e1c171f44b08caf16632710cb13d78614ad15030392746fb870afe496a7cec6c57155627c68952c2b7d6da00d1cf78eaed2cfce424de5eb3cab68149503eeeed67d486bf781a084822b4b08c57ae60a1e5ac855ab50f20bfa55e7d314e733838a744413dc18e638f0a4495be33eedeaaab3e958f47a6928791b03c871d2155862070ae43a1b0994d6d89dd50e729f616b05284d14c27c777572d0fb9915009ad878e7e13b26b3f7c6ae8fdbd358331ecdc6debc340694c1106ae3dbff11decd41185eb808ae966092b670d04c7b69fcba4306f59eb7a408a41201b6dfce7edac31d3270b11ebf51dde11af676b4c375abca20bbe73e2f0b12f09d1fcaae437f061d0a2e1057663f395c69921e7be3bf7b8f56e3856921016079df1653", + "r": "68c6ae3691163401bc569f43d243b037d99694613bf5d4131ad5e948f23a0fb2", + "s": "c03a659d33573b1636fdd40d50486e07a8b2e40a848b975d37d45b16d31f5947" + }, + { + "tcId": 80, + "message": "17a63029d36d0d7c2a8107c3d0b0a3dd1dd45692f5ce50db4fb7e4323d3b3247b50bd4b7cbd98b4ca96d7eda1214eca1f9287ad5345c8eeb5efb035fb9b7eaa95b1ad8bc519c0597aa8bee84baafd752169ee928e48e618ec82654d17035d797f13889ea67033fe3505f6396ea5711b3cc7495904fdce2e40440c0917f56f60d", + "seed": "93f1a335e0fe80e38387290aeb6e1f234aa864ce381098b06a97e22651f9eb0974d34491a4199f4d93d5017ade28df9176a049a806014b36bcc81f3a5dd04b82a0f9179cab26132244ff05447a15aa41eff98ffaea7d4c00931e1611ace61d5ee6f9e99183c8c880790c3689bc32d379f0defbded62a265bc3635b7e41c719e61db6eba040e8f3af8e34b2e50ab99b466d0064ee7846bb5de5635d1d0a775d5a2d6c63cbb85612663f9f3fba563a82b9ea1d475d903facc8ea12099da6f94b43a522e585d07db187145fd0d6606f542ed46191f0f48d96b157abe6369921b79009bee80be7e8426a7c490438a7a2e3efd1dcb0cb2efcca13c9dd29e02235838de7f9dd59ea27b242f7bc12ab6ac9e55a37027f403438c0ee167ec2fee001d6d2f7e8e87807887edf1b6810890304755d6b1e24de6ae5bc5815edfc027e1da997ec9dc20022226b87dc0433478a491e4f1be04cd2277e193771fa31e856d8bd7e8954aba6a7695a71665b61d480b1f19260a98a3d12829fd1b9cc430ccc58f9049dc4416b2ef613d5eaaa3aff1f53f6485a86f740995d9591d64ffcdeb7fe211565d97775d2ee692bc217e1e4396da19d99bf0e3f84d895012f43ec8c7ade0ed9cecc41ac6148f02eca2896c4d734e355424dab5590d33efda01f2b36c3d576487609f40e854195de357ccfbfa70dd917bfdcd0b35853150ff15b4cb35f0f2b00ecef365be0e52e7a32abb53a6c420b655c55651b15ec72912053eb2542bdab8891fc642d05f9e8a262244f139b215ae68c35b1ba54ee9cb44844663b848c9d2038e78dfa8fa2baaeffb73094664db3c53ac9d25ad494f42a4acacbd44dc1a275233ba469385d6f2e390d1a313c32290d9bc8fe0048f73a78897c4ded22f5929cdccd05322582fd19a3e6ccc233a2bde4515e9700f7285031cfd39bfe7b4e39c3686bb52f9b44241df1b95bbc8fbd7ba61f7cd9b4f529968f8f6cea3de924d3928bd028617bf643114e2a06fc54d015ecd1d873a0946db4acb4e97fd1421f3a094ba03593181e4a22c4fad81a34495dbae42b220b6c87cd772bf366c2ab51e71367a955dd6fd88a43b298982de90b5bf548dd84844f324451277fb12de5db7920c69d0400310beefd7f74c30aafcdab6eecb542f662641cf990122800be745e7aab7bd6e4803cb2c465d63d7e38d7bfbacd01a9725d0146b3b65870271ceacc406fa428a237fa6d85e57bc23055d250ac8021936d9d97d621b5b587de379324df392b341d037cc695d2a6e2be4144dfe0e17cca5892f0cee6ee0e2eb9f8a4022cc0eff4dfac48947425dc8b3d97d775620eab2a02b84bd3b3e6140d1fb474700ce52d79dee0161361c5a80a0b19aa058d3af5041f3e13397c855ab5df05810ef69a5c6726b377f63f27be1126108ae879081bb1f7dabdf94032f28f05d8d29548", + "r": "4a3613b1e3cf6a4560d39a1746a3727eca9e35fb3b42dbe2aac10be6aa648c86", + "s": "98f221ba642b93d279dc5e4a2b7723db7cf2e4bed4fcda372720b1b13282d6cf" + } + ] + }, + { + "tgId": 9, + "hashAlg": "SHA224", + "curve": "P-384", + "d": "ddbf695de959e3d19e8fe302cf3ef02f8be0ce771bee6d7f7dfa6207432ec6dcb7a5c5bc0fba88a54e82ed8ee3e2cd3d", + "qx": "33738d19c8a4e9000808a64b81b0460cd52e0aae356d4fdeb185f53fd1d84000c5cf5a6191217fdd830a3ba687220728", + "qy": "44c83a64dd0c98b68941d2715e3f8671555f2d508e3e6140f9cf1396cb6754823d0f0fb8e28e11231289012d30387b44", + "tests": [ + { + "tcId": 81, + "message": "6c50af1ad8af6226d1386cf4dda4b697a0015ea9589a928eb77165c732cad8ff9cfa21090c315a16bba3c67b27c62a4cf6d87af327ade58d59bb4c32c51eca97b393bb08f0ad6f1af586573d28ec4903a42be5fd628b92570212b67b4c4f9c12e1ef6771cace77dcd6dc7fba05e7a0103799826230ac861b0485d7688945f774", + "seed": "cdb9c5f106ca54a3c3cbaf79ded1aea8fcf981973258a71fdc92f9a35af5cb4ef4c1baa2830a11de253f444a4ab7e450b80938172f345715dd2f703701c1a5cab17e863794ec9e7dd0f106c2b30645dfd787e7599e159790fb622211a2cffdbf97ba078248b18c0284f5fa27a28348d36dc42a7a48a89e7e8a26bea92278ee906e42006503bd6e4450281f3124c7a8ae897083159e91529f893ab9d883608b985cc4688d2f648c770d784c40d31561ad12dd81c0bfeb849e90d006273a409004cb4422dbb88bbcc5402cb2ed6a62bc93bd89a9854465fa85627de1da97e75d446cc4bbe86b3fbaa5cd56a3f0a8cfdca38087d8e186269aa8cab7420542476b7fb55e7f0879dfa9e4ae1142d125ef26ec3af93e9f828b52cc56e40019346d54367bd888f1e49930371ab13dbddd4054868043b21798ba2a8bc19fcffb9ea32392e64447d6b4ad1382e4c3cf73a9c160420bbcf45ec0e6d97217b3c4ba607d72907bbdd0c709b7289c03dffe3748f5b1fe1f0e494ed5f960e146a8ec1b6c25602c87122d67d96e020812d118b49e956fd1c687bee7276f2955c4f12e3d3ad66fb1643cae6fda9288562337057d6fa4043bd6c49e51fe6a0536d86c8532f8ef36ec1552ae8d384c573d82518b7a1377255be57519b9b791e0af81e92d09a16519c2d799d20ad78d65ff89431d612f71b02a773671171c90f4f4986f99a24423de9031c19b926a321661a2950aa4a1cd95742252b8d4da281831bc3fe242eb8e06a091f13a14b457836c6635bdfd71c3d6ac8031de209c3e9fa65bde454aaef85cacf1dd34a658c5ecf631577e9a08852939226a884f51609373cd714003af7c7b8454d384447a197ecd8cd8d6ba4b26cc53adeda5c1b890e55198ee152d3ae59924cdcc416f319d84cf49a0b99cc190d269d5b95ce229a0124d9a9da245501eef2f2dd42ead32bc7b3b56d2160dd108e03bbc58bf07a587c30fe9727cc1451c7118b5ef96a3047403a2b2e6532d3ca94e4b2c01a6372d8b29f20601e1df13cf0a638f9da774c8ce493ae83b54fc1f0fa7dc650d199e53a33acf80594bf7cc3c4b0bf676524514be165f98793e569edd9ec5afd3f807f3caabfc3ae576a1a0e56db823c65f4e70121be16190bff43ae052884561f3cbf4a31981456b17420e4cbf74decf4d70e371b50e3a511d5812abae6019ce3cc623c984bda4a17f2eeefc817d57bf228640c4bb9c47b496212bab41cdede2a292ca70fe5ac4006058883931fb3a0865b6f66caa04cfaf8b765f0714951bddb2c1dcbb2b862e63f72215b019589763ec309056240cf166a7f859efa5be8c16e2ff986354dbbc369ac3c4be51e521549642d72f84867252ccf0fd6048fbe700609b9159e351b1cec50b362feccc02204c31c9f3f03daded0d6e6a21cda67da5f36a658b61732c2de27bee12db3a", + "r": "f6ee6f4d120f5553a788a0d57fb22466f56004ef06fcc79764e5e21b59a84bce6fe6f1aa765a73ada0fed4351506f491", + "s": "999517d899930d313f63ea4ed062ce488c2dd3dec77490a2f011e283146dd1c9721f3263a039ba4349a3419448ea9224" + }, + { + "tcId": 82, + "message": "aef55f985d0f36a53afb1402ac95f0bbff740243e14d72a7f47772074b1614d903aa414832dbdcfeeb99210a815bdc81f553ca1eb01e05ef3d91733a0d213e5b06955e8817e50ec993b262e63daf3967b1802989721a6f6133582d40a470b14d805fbabac38d021edd3c39208039486bd217aabf6ebfbac05021151a04eb06cc", + "seed": "928c6effc4c86d9947a2f74c86c7c9e12e29285db4b4dbe34f3d4d2455821823fc0316abbf1fecfcfa8d223d1275da11d567c3a88f5db8ce534dd73f41a702d70d370a5eb737c5841d6b6a7cf49858a44d0d4d8002ed5d3a7128a2006e1f62da8375d1874ab4a6e5a0e5faf0d0ccc887e73386649203361ee831dc1269e41e52fbed8bd31f059329b72d82857102dd5ba92c9306e6a7e17d4688a27183502ad0720c048338fdcc648c9762dc9c8a2347370db993545eafc11352c42142e8e4b31dea1e5c5851fb962ac7f32ab97302cb3919f9969f8993bb20a5cd36d7e53fce71e993548748e93ff241fe154f4e9d06ebdf4c0e7fc8137fc768f42298aba1684a9a4841263f95a51f5a78794791a61576c074bfed92a5ba591c203953ef7c22e217260b7618b26ee9fac6090d896509fe21b8e609b7c4e83387afb94ee7082ca4eb51331c3ce910e993e0126277fa45c1bda713918b776406175ae83dee403202f0c38cdf42a3274a2c6652c5b62b1debf3d9c0f79388296918e516ce9bba0e22c4eba76706d4b44f59ab79c792b1b564df1d89afc9f5f7538bf8a05ecd9ee704dc738530b2210373bde5e8b8d5e5c5ae2209078be0da86054d87a8d80d65a5c137a6de0ee08792a315b0eb0bbfe16570718feb92906e2feac330a939ac44552b790ad4b9b60cbee1830a17c7e0aa8072c6527b3033971ef2dbc3f9f17c7b7ba049a9f784ac768d392f216c32f4f0c3fc39549935f4bec380349c33d1b082329becc35f01848500547f2e3a3feb7a315f60fda82c0a3ca39272af8b61e31d646e254dac7a23c1d842f446e3abb89eb495b564ba787ea5a894d103522d1b0838246e2bf42a5ff203db57f94c27099fc7d9a8ba7d416759e8641181f7b204ae2be9b06e63db855b9a51d16655dd4fa85b36e8fd39e9a692b59f662b422964eddfd1bfcff06d0902b0775d14f967f922c427fbab4a50379e24eb20497fc55d2f75537e63b07cad1b836f30f3e6d2f639aaa11b9785f7516bb633d28bc2765d36dce47bf7eb214dd7ff298dd554448380e365be0c31d4b296a51e0582fc01c4e22a2188fddf46cf9943fe11fb4ead9299b25d670aff3327ebaf42f0f6a4a76893c808c21384960fb7972a305733e2d69dc6d8bc261bf6275feba27b66c5086a484209307ec7a16922b410abc7d2539e8a5eb594f66f68d5281a81fee28a5c40c530050c46760f96e65e09e04f52f81f43cb138d142ef508dbca4f81249573749c44cb2e50990d26b6c84fcc441a1961a4f3b5cd3cea86fea422a2c52b9753ad393f241ed038e81b3a764f3308ac4586999079a1ea8676d89b713874d91493e312adabc728736260169bcedae8ab47537ccc20d4a011f9be75606f23f3862018250826b1989aa2705ba0db6e70a900ce94dbc535f30f40f15f4b4d1c40034061b509", + "r": "4da400204d433fe0daf6aa0579e290ca3644d57ef5a14136c8b476a856acfb9e841fe944eaa3a434f5dd96e5e38372a3", + "s": "773a4722665a55d97907e5afbfa35880db622486ba1259c9aae2f2320c14a97c7a15d87f1412ee23ebd181437921a76b" + }, + { + "tcId": 83, + "message": "9e302aa736fcc014640d2cf136a1883f750c16fa1eb25bb073a3b90e5801f337e5a5cc5d92732afad25baa5e83d3501c318aca999dd99e6b8dbd1b60f6926f0e6bafc487bdb9c93fa5b4d4bc1de86d8e04b0a1c8105fe7a92c8a165cb2cfaea717c747f16154ccd252daf88483caf5a419cd30a53987d6b2a126db898b1c1a9e", + "seed": "36f86d5164d5068c9762d0f64e234689a7e76db34c94661a8e5010b2a60f1d9743b29ed3a014d041f71107161e1631f042467b827d08764bcddc9a85f233351ce9a13a33313a869779935e2d2b4ac21f6c3222ababcdef1aaf6760b6e1f1d96202cbd00cbc0eec264179cb2ab3ff5e2490d583f0dc5fcd5d45f12ef10d5cafbe16a4b85d7f9a074cbf756b3167feaf871ec08c5785acc9f5a6a6dfcf54b489cf7b3df90b1a460b89b0fc937ad935c6e2d7b9f3f9c7db1475fd6f94e9f8cbaa1603e6ac07436d61eda916b30da0fc1252505328bfdd8e57f4f6713e5017363cdc0fe87e979645dd9c59c17782f6c83e615af863285e6655ebf85f104ae30781fe32a81402ac2b9f0cd26ca8c0ab4ceed3768e355ba910671ba00ea133b5ac203b133cf9e056ce2305f7e8509603a42c7a1f682df2d225cf87e1fd2073d73806243c19abbbaa3f8076d749e0244b735aba68ce0479021bd88b1cc40f7d58d9b235e9b9a7bd206578aa56ca8fdb8bceb351daf7eb44886a4af4281a53dfa851c1770838092d1e32150c8d9e30e9c2a5d19085a7bd309d2717e8a6e0955ecb2c2bf6b5407f2e0b9c084a17f75cb6cb4bbc019048547a7022cfee7400b14ffc424160968d40c09665a44e046f9920501f6390c0fa6cb2809875a2cac2335e6971b41525e418613bc979d7a2069a2b1d10e71958aa50869111077c0962542f0c1ba88fce535a253f39fa68cc40d3192858a3a18ba462143c2a76220ef7c66178bd8a5eba030e6e0353276636575130fc1158839eebbcfceab301869e36ad5e9f5679befdfa461526f9e1dac53e93e78ff5d4e6abb31646b8dd0545cd4a38062efd23dd71353266ea09fa9bec268735c494d87a1d464fc9a5cb52f47937b020a0f8713640c45989cbe4eafc85d628e0b275f0c8de2017be24dec8d922cdbf58d97fa1390944b35607e601f697c4fd7faf516865db7bd638d1aa4b40c7b89ed6e507cc37b2b7d40768047826619bf1b8038c93f7cb7118a1e741bbef92338652bea10fa5e421b8fa4b5848ced3142ae2628c33525d658ed36c2e859065aaa237340cc2712de264cc8c8ebca9c2d570a96a8a87e9edae031ddae368c1a2991c00b4e435720f5868fe8532cf78ee7c83958d982537707eea3cc5839ca669e0d483217e76e32c99ecd880f49da096f53e85d53caf92696a1a544df61b15191f1bef6d7c7f549363a14688125880abd49f34fb9383e57dcf716018f4cec6cf8bbb5b0ba8329d310b2a7cc52a8cc0fd6b4f6aef8a2bff48c83f9f68d673c7a6f5c08d38ab8dada15c535cd3d11334bf60be904dba0e0ff1847457547aadbb87306f1ec1801c48088e420d20a02ec18f6c32e1a9af7ac1a5b09f76fc782456fea25c48437b146fb72bf7e487a8e0b85ea3169630121635526dfb4238f10ac6b2ce6e450eafce2c", + "r": "6a1f001d4577bc6b57cbe3648df8ec5bbf84c04fdaa8f64ffe48d6de11f17b10985353bcac1791bd87b981e634dba574", + "s": "a3734106e05bd8e1b3968884faea414e0cc40202eaf427fe60f0592123b65800862d398cf1a5b97eed12f75986ed455e" + }, + { + "tcId": 84, + "message": "ac4fc43653543cdebd4d040f7828b9431af9bf63034d7f1500666afa70b00612992e893620e70fe09d38c8f3a89c3ed000774de540bbd33585e41e6235da178541acabb7f9babb67de001fd78304f91fc99fd4873647be44e582f0db4fede1bc0f4bf8a2bb0770d5ff832cff00b9b876c06d50169626d1394f66be6a8fbaea0a", + "seed": "4941f4cdbe9ce3e771be63e5c69b305ecb87728e061cfc1e3128b2176d0c469ee390efda20182c199c0128f1f1265d250557f12daeb4d6f5dd6b19abb15c526b2d4f7470acb1ccff21d9033f161a9a0132a774d125a4bf29a99a7655a55aefb0fc9a7e773b2acb232a3799e33e57e4e6ebf1e2f20cbb370b0c38b03b0e6ecdf4e7c393420433988f6d360c07a83634d9fdea880e7d752af80828e6dfe97bf88a0776ca90f1f2710f80b3245b65f9193745ed5e7f7f8b131d41be7a3934119ea653a7e4331c7a1ace073eed2b988edd64a537b3c921d001b06f8322f4fd7b3f132761ed9f2b0d1b897972f1af4ef9e9e811746bcf99192b48f67b87df89a06392ba753ec45b1ba01a6a648c26f6e9ae62f71e4578c69f91ade907010ffa7ef2bcc62f77616e916cb838ec340c43e8681e3892328e4e76ee08d6a741420e55ed1fd2cb932e3309fb15ed5a2d8009d227909cda182389f5ab01166597c63d76c971efb417fd14ef470a847bad68c53d1180d81839510782695096715e0b3f2949404018006b7afd1607633df571662190d1aa04731bdb318d9acc3ca7a3ff3a5a55918d4951fc058c0d833e771b6454ca7ff38c79108a480bfc4492b309e7d36b1e4a586001593830c6b8081d62fea7d0408bc989deefd2e277ab0a92e9947845f0f0c8da198d5ea9eccf9fc46a436e603f364bb79bbe9e0e59fdc32b9e4b5d8bb2f343f289adf9820fbc34d6726eee92a0437ee929b6ce3e477ccfe9562968c1ef913eaebbc0864b1018f65f6a6bd22538667c5219ecbbafe7670baaccbd9435c7ba73a53bc0742c26b843fa649babd67f5d6e232b3d05043642bf574a41a8bb756a10bbf55f31aa1d96ac2fe173cc8c3d7b890243aa4a911dd2973790eea49e6e8ee099f1e13a9378cfbc4e1bf770158f524cc9bef31eb6e880a3941700bb2c4b49dacc7a31a8697eeb53c9bbd6f34f864db8e3d7ffdb943556492c39d120c31ff4b5f9e4c1f7770c52263a66171ed0d4e4859e8678a2e198f0df791b4780ddbaea951593efe371c691ca0be86133ca20d5c1740f0f2af68045bc2037b388139917763c4f3ae3fd510173f5155ee52a12d7f31139d59899aa16af69fe62412c7e831e6fab30058c41d2d0ffa859a96f39db6db1d19772400630f06a782e2538e241c552c24f11bd47fa4ca7832350702e80ff2dcf11c9d05219a1c3a05dc8935429e3140891b31c786c5bb5aa1d05e0591676901b040d8f18809372e4c1ba1b52fd5cf9e5d63b957ab77b3b06a74f7c78e280dfdda5c8ce246bbd15907315afc9aec8554fb5dbf75cd202e213677bde99f851fc6ec44d9b0ce2ff0e4b9ae50039f958737f1d616762b7728218a7e34c4c396d279e4d4c2e42b75b52575f758dc2734861a69f4fb382d23caf35731b08dfc52476ff11c3bc451d1712d4a9867c7e", + "r": "8818e2d57994e7d037ac8bff504763c48bc8764f18d4eec4e8b8add1e8b53bda0e3a9311bd2a876a407ce5f8fb344abf", + "s": "a01550989d8346294094ff739e19294f320c5fc5c321867050215b26ea4c23068426adea4012b8b2692c53c1128209e5" + }, + { + "tcId": 85, + "message": "b419894f1ab4c51dfec346bd453a34e244d282b06b1098603e603a93ad27a31914652f94e30502b71d3b153bf78042712b3f9acf2819dbe3ae6d551d6be35914ff3d3d87ab5f21dfa2aac946f446cd947ea576063ba35752eddaf404e5a561e7810a82c414c017a245d5737f6bc8bea3723ac2cdcadb1e82025248c30266b515", + "seed": "c4cad5e2b47f094d61f37b33650faa4642d1fc52d3824f62fb5477a1eefc3d7e7680f7407435be1d43abdad46d5872d16aa6ab30fe6ba3a427cf1994d3b647484711f263a18ba376c8133f5454d992735114ecfc60eaec5872072a2a78309c314047781528047f52c660572500a46ebb28c4573a0502734eac8c2c915485a4f13f8fec9b4f564674354142a594aafb18b5731f9d91f709b012ba85259956edeede6daeb0915e8bb66263f892528b1dd53d0100a3da313cc605f775079119fa375b403be4f0657c6c21402cb231dd690bdfeb105e4486587dee749a9c5aa3ac8bbf0e8b8dcc0d0d94fc4471e1a55d6e1ef75f72d4705913bb380352b8c358e3a193b5784d795972f1e411ec5218647de6a341381ad8b62de34bfa621bad9535dfb57de515371654cde3703d18897990c3a52f554511dcbd6c4f96673e97d3a1724d8f6946607b8a9139a8ccc7d6f37831c1a25a6f91527448f5200948a82868822a2605ac823fe78324054b04e613a054a5ce30aded190c9005bc9a2ecc4fec58d5a5dc3688d9b27a06157e6b8b74f3cd991fcf349695be8711d587a2f68e1bacabb23eed2ee2224b9d08205c349370eecb0d240ce9da304bd5e2db1c39711da98dc0aa6e1c79283f85b181f9daa9cca0bc16cd99cdf1513f188606accbed1bdfcb42eb89d8c97e3e6ab95c65d214f4ef1acb248d3e0aa27e7b581e67ba8076ddf0de9dfb9355183c1f9e0c2dc3cee67b8dedce73a106301927819b48c6fb36eb9ee028cb6d866eb5f6cda3bf1b6c673a2d83cf00833802c1e50e1ecc63011b2f3072524856b49ba69823196e60eddd9c46ebb72cffd3d8bc75fd4963d98c88d9058ddedbfc4a3c1bce2aec00b56526d24e30894ac81582f2cca2290347950ca10ed0823c9b6326fa099cf5cb7418740f005ae71a355db31fb4e2e62053b84bafbab2f14c87fe863c83a5981d037c1a7ecae0b5650849feffa48332bcafee56cd17feb4271f08a2bb4b8075d2274e4f21d189353bc78db4343e61d14010f42f7a8b25b8103e8f0a5030ff5e6ac7622bbfe1a97a566fd6307b4b9865b0cdd4ce42a1f146ab2f20127617cd54fc72ebddad046578bdad79c36565918efab344cb220b507b22052f1012a298e2a68e8f60d3d3c84aba665f7c950c3802693d783137b3ffd3d2ee76f81f50cf641a6b5fc49f1554d5da1bce28245a870e7813094cf8a12938b346844f9d5f9c15ff1808409177137ea52d955a612b471bde6109f5b260363478a1d583bc03267bf519b94b87139c41754168485cb1e959b9c5e3ae17a0f40de7c3d886416597a1d443757621898392f22f2c987940ab8260e812e7f3af6f336d8089b5b64b991dc3e1aea0b389a2f8b1c812517fdbed1dcdb3170b0eb161956b43078494edc6e14372cff4e56ec33106b4a0a76de196d9954e2b2dcd", + "r": "2c9db8db21a654e960e8d82563d64fd793af5f625587988f47dfdc05538dc93cb1d81ea3d0afe1802d5e02b6de6cfe85", + "s": "b343af2e66a32e8d40f716a201170b244e853fe08cac5d1442a9b708e7ad8534f167b5f260fb77e9efb2ec2df13c5d71" + }, + { + "tcId": 86, + "message": "4ba35bdf08c87a252c3d31c2604411ab83b0a135802490e2adffccd69b8eae53d5de3385f2ccf392c83773f0cd7148e32e63b9135b43cf7e284eacfc5b435da02dff33a9283f0f3dc3fd794fa2b93059fb2819f82fdc5208885bc5020ab790418716a9feca440c475ce8efae4c57d9ee50b6b3ec84e4b7d7fdfeed34876b26b3", + "seed": "22a2f5a04747370d371ce7cf3b84e3590f7b0b6d1958861ba12a874a5b61497b7ff83aa4d043e6c7dcbe469022c55190b4f75f6cc9e188ba4d630d6ce6e4297dbc8ed1c33bab00423274a080b2183804bfa2cae4b934db8a2330b3d3b597f5243054ec894f36ef9211b7ecb004b1cd5b36f7f0e8d3eef7534bfe9e78e633e324164e6b0f6075db7c72a2630d973f309d3a27a69ebbb62480542530a1f3820c8bc6839cf94fcd8b73e8f0d8402b44486c8354851c41b0ea7863b141602e631ec547ccab85a14ffeaec94bee2e1dd391c0934f4e7278755b787b0b953152fdbcb48799f4c662ef1b1085a12bed71639d309695386104e745a2bc4cbce436045e1da24fd92a4a06e5526b15a4c7c10e216b192b5814e67a417513f96be5142033574de0a2209c9283b5572ee64433ae2590ee4301594f4a504dd1f1e3b5d1061e3a43f26929902b7498c582aaad846b9346ebc17a39b170afa236f5e6d2e9a93ef69dfafdd172dc2e25a1994b88737c0696d6b10c1cee38083812a0295db11510c6a11f8feb18229ccec7e8084c201836613757eb340685347523c109c6a3fcce429e95c3f5b9472404c0a7fbb6d777ff75fba0dcbfda07eb50a732454887dc20a4d6d84697be2b2d84fd6961d48027d4bde348a17534e05f2e10ce2591b2241d13dd16cc68a485f215bf8e202e3b3477159e9b2732cbcb47bce3df4f0ab422b43ad73246df9bc9fba9f0b40322cdb62c24709cb2b50d062b0c5fbc8b6b3128e8b602162b12ee1356896106ef0bdc1744f848f0b6fdf3b55bef4e9f2ab3445f34bc2b91b649012589a375df26387dc54794e3f4e14bbd195ca4515d5e64bcf4bfd7cb5abe7c20f0e074ff4e91eea70845dc198855c203c90279f0d0993325f75d181a6422cbf0fa3429e9efb6a2e7f12e625b1aed590182b8d88ef35cdab76ea417ae960e1ecd9c9d596c4da930add94ef6c2a7facc41226fd69c06de6ac747ce84757326102ae33e1401a57dd1cd5df36cd340ac73ec34138d87b4cdae400d79086c4dcfd0b0d780cc57a2f732299c62d1034a70e858d242ac94a608cacf592a9bd692e6e65b0ebf7d1ff57691eb0cc4454aae8ff9e062750e0485ffdcc1eaa07c64fac302ae270f086811868b98d574380654ec94c08d40fc41af4d104acd8a0514a19a1c098ea7a5a7c0648d3b44a2d3eb10fac2000824212f6d4d69fba503ab0f52ae70285acec80b9a69b79b169bb2d2aabe90039c39d17b383d0a11ceaa461700a97379df41ac3110b41096770b3efe4d36ae239e3af8c5e4c8cffb956217fac7ac3615602993c86935d3ea945382341ddafc937bb1025461bef323013df6ca6c310a28b9e14fc40f689f5727a7ee9cbda82c4faf03cfbccd525b0345813f2b5005b9097461004bf05d991f877b500225920dd60378865847efad7265b2c0", + "r": "ac762b6c3b16b874c65229c3de851b421c55843cdfbc14d1f928a9cd07ac0470c789a0095f5f92da318d8b136251ec86", + "s": "f89421d8d7c41fc6df7cdaa02c708dc1e888d4876bdc899538a7d3b8a8942a6e2573d482b8db26cf25c533ba050159b4" + }, + { + "tcId": 87, + "message": "b044e4633ede982acee82d581ba234211fdc2d25699f27e89d9f313e1372c8b3e0a47747d393916545e77820adf775c8c42d8685cec430278bb7f6cf44de124709db50906af94fa661fcea99c7b29f936f751c25b9d18f3135e1402239f26230813fd34d8be53de15340565ef56509ccda2fc2a60e9387dc29dc75a8dba2e7b8", + "seed": "edc9ba841d6cc1300f56fbc6963ec0762d0f22ec62d6e169e8c8902eabf20769b024605fc9542dff38a2c925eed17dd05330abe311c2e6f889aad4cf832d78083b8515722b3461a4abc7ab1f5a3e2aa8fa4634d3fa6f6c925ef8f52ec632c150c1246fc6c621c2d79e17279d34807e629d1fab44fc5cae9b82aa5c7369da9427f250a463171d08f482d4dbc93971d2d7876721cc2611387b09a98d5b29dc2902617de7b8261a2de312009cefcc9df73157f9862f14805602fe03dccbe3959ce8443432224ab4cbfcbc8fb696bcb8713b0309bee5192df24b5584198e139855c178b42f062738f7b667eb2a8f4ca2d9a45274463711c523305190bf4fdfb948931b2db35d3b3aecaa4dc441989f74eb9097dbe48630af1a8fa41318def298d5d64f0be2f9c3700e3f8e525067683e63d3e36ad9ec39ba9cd613cbf69564a45eb846cca4fab971a76dca1fd00fe5e3b69509a6f02051dd0712fd9815df46be3314217b89df6c9f46a357914ec6071edee94d65800652f3ddf57edfa17b236c39a7ca71494d7ac4acd0bfc5fd411a5914b004378dc3d281ca18c50d02d2b918bfcc01d999c0d7819e9bdd407af0ec2d98e1e55d7b158afdf42b37829682ac3b23ff32bc5513720d7032fcddfa2696ad77232c53305370f8af1fe62c56f3b9046316d594cc13d314eb34f5950279e9addafeaa519b26e0644abddde58df6c6d827ab756b6d41a4795a8332681e37109789b1394e937e1dfb6cfc4694378c8c4b8dfb7287907840dd72cead71025e2b85fdb0ba6a826764aaffe6f0ca4ff114531d6763e0febd50e2f0f370af96a55e0eeec36e7b5f5d8c3039118c281cf61bd6237ec079080184191cd17ba439116bb91b1b9d9404600fd48237c0eb8b300861be2168e01211985f755226b82198e2d682c88c46fb74e50b64a0684ea8e1a6beabba1d64fea94e358088133fd7d3bcab278981f70e1ae427715aa3699ed5c7db866db2256306efc5d82e0a00d5847571406827a70c21ccbfc2c06eb970ffab5f3f2e93983275ed0f3e3e0fe031b7c5f57b30d962fb43d2f749d7c4cf8e35e8d0c1d3cfeff220902552e69ed2a627a7454f21a5e74901f8a8a3eab575bdd995ba530dc97271e47f17651ecbc7b45552f96b2e865e11761b90f20a4b1b9e05558f0b268424b7dd9fc0deacbf5ce77a24aee7575971e49d9246057a51cfab3d06aa9e1d54ee5fb2769950d499b911d8a85b151aa2e3a23aacafc43711003c7992f23da25ab930b45cde268e35bb8a1a7702c04769b23c0808f4976d6e89300ec96f04d554b74fc71dd1e3d612135e9585d425ec776b0ed5bea01c7c975a8c04fee77315be72dd07547cdfb5f0d442cee3361669f6dc52582899e282ac4827917aa3c4969f49108443874203ac4092f6eac0d536e71c99d2d3e73bd7175d6ecd323b72ab", + "r": "2cf9db6d95af735bfc09f23c4439c0076004868ac5a89c8e725467f5fa725b471d9710f9b2bb732577eafa6a426cc24e", + "s": "65bd6f4b833f3b0ddde65ad2be970e86b278b144ba8295603b37c9bcfaf931a6c8388971a065932aa4cb0f8af93dd8b9" + }, + { + "tcId": 88, + "message": "adf59df8684aa61070ad50839031b99b9f48312aebaac24efed6d39bef6f8b2623d81031dbb7351ca374ca741f6f6d0ca487169fb52686bd2679af9d664a843a2270f3fe3e5d23b5e8e6507168e9c7ad7439e674a9ae9617d64e8eff6d1d02f4e6325de61de2468afcbf4d4c3e5d0cb5781cbb693f6a6c805711e184e81f7535", + "seed": "1807664b54ec76841dec12c6ed171b4eddab27140d9ab457bf6c28e60c4418248b567a44a084d63c221836b29da1f976bed611785cbc4aabf116a86b75b0ed585e2a626e9a43ffc2fdabe124d2c7ad9b01cb1a0965c08113f1a2b0b39bee9b1ca4ca88e6b72de6c60bcdf09aaa9cd220773d97b89daea2ab2fd1e680d438e0910233724fc51221697f48e7605547c0038499b85be634cc2659f7c2aa10d30ca361e80009e3c4d90512115b1cdb9f1bfd5753efbc9fb757df1b6ceef6b258d4fa8ba2d4906b584080aeef8b167bb6f6e28e7ad58e2da3d3937e8ae994beb39f270b54051746d9b5e6df324f998d947daef719d264ed9324314bc9163fd0ddcdbf50873d298fc903b71f3e90d4cc4855551657c1f747c74aa13b691744d9d75956477a00deaff01be97fab25528764fd10210d4a82256731fc95d828f1334299b2d15b22548528cc9733473d80b116852df7cd63016d2a31392831fe9e275484b8f936afaef19ae758782607ce8eb89034e733e00e93458ac545bc774e05c1fc490c6d30596a3032516e848c99df51d98fd764cf1b85239da07c51715e301e89ca2ef572a09f9b1e25877ed4df1109629a895dfb278fd55ccc2fde59c2954683ec8f085c402b69e77c6aa8b0625c7b5f953270308b35c27e615eb2aed0b31dfcf0c4628fa9ee8a0d615ad9bbfa87b9a507dc98206122c2472405b3e84e1518bcd28ec20642cec12fdb8108cabd016e3c62539b98453ff2530abe935e51beb965bf0039f656bb09fa0666e12d0595e76807ba1173fc207adde7d215adcc0d7a33fa7e56655ad44127fcdde973e8ec4cfe4956a7b3b262422c7f9cc78d9f68de3db812b40a78addf7719b02ae9c7c4a917e8d19d4ea8917b4aab2a3b211804d89ec9dd6f888e6d4ac2ed91eeacb877c69591833a388f1dacdad48a478ef07479fdea4b039d54ef0d4e14ebcb941b0258aad7444081a573ae7f8cf564a1c55e145b341dba5a7efee3bbad369f93eb5a2521cac4b18b97d3819ad573210add9db4f2406775a99b837f36b2293dc88d2f2466fbb5030fd869f98d434c2856dead4694ba0e6d7c41be51163781134b90c6ff3967ee2fb209f21e64a85fa7393590190c6dc55e73e98a7573e22afca340f6784b89387eaa4a5459498ee85bd5ae2fada4f1a49296377d39b1c51853b11a6266c3ceb72ccc515d50cd1f5e0469cd1154a7c45d8356c7892853be42207e972551acf69a72403001e77ce5c80da699c73e82b3b78f245a68271353697dec096bbf7cff30d620cd00cafc43094d9bf0f344990b7f9790f86e56bd958b87e8448c9738812d5b2d53b091254e2433f6c3451921920dea220c2a8e2b557e51f29a264fe5d694419744edb160d6ad6de57c98d17f51088ebf0a9963790bc1cb8151d97d68d8f60f238047f50eb1d0a1cd00ee32a3a6", + "r": "49a06338d293ce65d08b0f5e2826b1e06ab9ce1a3311697f08eb5c9d41a51ad8b58ac132c49e28e9d7d04053cf7a75e6", + "s": "8314fa196e4a807e0296c6889bb535234f30a896d8cbd3c63094c24f2373fcfbbdcf5d15b097136a68b1fe5bd3b0395f" + }, + { + "tcId": 89, + "message": "cc187d88bffb91e11b9f447944fbd06db8bd15b492379a3949d76f578d1d75eeb5d760d16f50eb410dd4e7c21e07edde695202c63391a02ceaedd9aa3c9fb60262638131d939bfbb844946336484262282acf74320d85236093a0b2f0c6f8a53084b47452a708a6095229e86c7a967f61ce51ac6f3be4ea9a8aba2649955de23", + "seed": "396a41fbdbd42af9cc54de3ae80aab7ce2b016182966123fc94faf1d087169c968fd9b91910f06af9ca89076d6f921d4959810c6be4dc2acc32107f6064a88a411ae7e3a7af67ed84d181c3692870a3bc9af48f84414f47ba4b733a49d620f5a6af5b9997ec4a93b883b355bb2f83c25ede7415ccb888393d0e821f74c60e410be54b2a22a80b6556f194381acdb26db42cb319a79e712d86b8fe43ceb58b52eed254d43a06c3f54ef8c8e370187e16ede3921b615778cd645d421aed9a31a4a6f73a066a61ccee265f518add8083f174c4bb1c91c21219299ee817b226496244e36b0f24d7129d92d70ff3f904e385d3ceb124cf5eb946a704ff1d485d15816cb8e2ea4aea8546bb457d29e59339a80cf9fdef5ebf77f103df13508fb6653c674d331c62ca183491df8fd3a9b71f347be24b4ce2b30f0a3db93f62c604ae96ee770f695101f2d1e774cceeb0403e9fee3a05d53a774adba8b3225dcdbb4abf1046b8aa9d4ddb5aa5b53ce81fc796559d38f6cc2e29c112a14b86a341f5e6c9164f606dc3e45370ad2bdf009172b863fc55d9fe4d6a80f554a40c1d7341334a8b2415cfa9bc7decc909f0279004eb9af6f2b175c2a009f5dbe0caddc024289e2c890a2af4b9577e3db9099c68a4ee4120260ed39a9593de4a7db6627a55caa6410cb61ad2528f1bec4e7f3cf34c5096bddf13d055fc0762862e690921a61af35a78a36c29a199c89e1d02eb4cd75974f2ba0630dee8aa0ee919a1a3466a78b64a92b46c9c8238df2c2f60203e7339e1b87432cf862888e6b9f9f3b777b11ec76f286998970ea6c2d5750f689f391312dd7c1324ddf69539c2faa3a67df75f49132220eb002262e8df53b9adef9bbc5038509ecb5f132b4befa720535591c864951b56928325607bb77975353597120f5104d13cf426bac6cc617271a7c28528fb730762f97e7fbfcc4e1795a85d1e4d14527ff92c865f43d7b6f1b920fc2f9beea44f15cd64e60843893735b55b9749e62d764fe5b18ae558d06da8b60d114450873f8b66cfa6306f07fa040b2a252b1edef01af7c514e5da821734e5b1bcce5c75ea4fc06aa9a3fe12ff017ee98016cf9cf436bf05af6ff0cd4305c74afab300c67cf3332240eeac0a65b0ff6dcbab87518752dee8798ffcf8796ce5d6369915cf0fba235f210a24c79be855a4d279a7472701df65282ee0d50bfd8e230f32388b61b384e002d38c514f88808e70ff6b2ab5122838cf2bf30a9dfa8249e5fb5e2ab8b1ed2d925d8027a199858d9ccf64d3c11f95a2ca0ff2a277480f2ab5a084792c388cdf04b183187cad121f1b0be64fae32aa806da1a53ba56dbb49a41dd442e8045415b42cce53fd3d071cb29ea1fbb66cacd35f6ae2d44ed0789ce0373bcb21ec6cf2062276f416d7ff399228ed8793de9ae8a6fec5d9b6c1ee9a7509b", + "r": "721121ac18ca2b9418d721f86271b8e45d27ddca16aef3ead16b3f4de617f7613d2d269039e022999ee11ae2081ae0d0", + "s": "f11c567b1d10ab6890e7b7916e9e7fc46c1f5aad85fe701ac2c320b07171a25745ac83d4c52b554f9b4d9371fa9ae07b" + }, + { + "tcId": 90, + "message": "95cd37a583f02ea7d3fd42e7bc9b60aa03babf3c96b69e99342f9634f9ffd97f8a10dec6dd6c6b66994ebb8e8e7d3c3eb2f1b45738ddd073941411ee56c7f58f8cd165f8d9129cb711f719672932ad461eedfcef8f6550ef09b7d979237d5db3b5e5c13cc45a2baee043bd88ccd92b6d8d356cb47aab744e0d295305c07cfbcf", + "seed": "07e8a10d6d94378a09bce40a531c56e1caa8816c95ab6eacc7351885fda2bf4087cb4012c172365b33790498c637f0778b08c3483be1392dcf032550ce28fb89dc87a248ef0a312e9362f2acdf17c0c1d3f2432783988acd7adf67dc6508b655524611098bfc48adda1968b1415ae6a2ba5e295591b7bb27e5177d40051becf11924bbadc7a7e861c7fe70fd9921fdc6e154cf8b084a5c631a7038150e3c93867521156ba7b792687d130b2662ae12e214e7c1d28c1449e03fde3b2ea409a956b8c09a629010b461b21df2d752967cb92c6f814eb1baf00653cfdb34a98dbab1411db226b58cf62fe48ff56adc1a3613178c26d3a5f8bfd07b48178379029265603d2d1506ace44b67abf32c028526d71eadf66ffcdd89c290f3934fde35c202f1cc81acb68b2712efdef10a768c6d89a7e36bad7dddfb80bc1a9d35bdd3a1c4c94cf8db036e87bcff0b3be4fe03c07b364633da608802e49c3c43575a94f0de1905b342866c24334f9d678b582387a54f656c8614eaccff3d74d35836e887c93a615248d707c59836eed06a8992eda2f3bb7e61f401d57bdb71f69225e2e44d7651901183dbc4c091172d15434b92c4125b380b578fc8ffc6fa84ef752c8d73373c02963afc33c3582f4a2a642ff59a12b213d9bbd6a237c6063aed32be43a97497d3e7bae285c3f302b093b4aa9db8cf5d967debf748e29fd6aed49bd452a0c9ecbd3ecb2335f9f5fcc690e8402bab65b022b20926c4c395a57ecb0f9af1df903416f5d4e33b888666c8cd0165629ebe34c3f92eab6b098b68e69d7737de1fa4475e447c8d0c988614a329c96f03f6efe0adf9e05de016f6ab9509b873a26ba26322e3e6ca0abee0d269bdff9befecf6cb9eea15c998d3194e66f7de0add9d17a6e403c900c079c8bfbf7796fb925f53b43c64d0b928753cca2fc8d0497a21e3f432472ad1655d75a349e2b8752784620704a72f62de8dac210d2a214c176b3573cd3a153e5c4ed00405f236c1bffed88bb7047d9034ac70d47ad18dd2f26ae18df18fcbda4195ae6dafa0cca669628422d68a4b9887a6cab4aca9aaff4eb0d5f49f79311eb864f9c8f10ee135f06ddb1579192a4f8960bb1d4805663aa106378b72779cc0bea7dea57ca006a02008a3df49a5ce869eb2bb74f6486a09537b502bd1caf61ca8a41da18ee586d1349e3e4d355ca90c4e1e629ebb2bd285109b7f01031954a315996abb93308feb6c7769746324818d02ca936f5703c2645f0bafc9ada1982ad03ab031c8aebd9161a01af4bf1b4afe5503742afd6a6b6f9096964e5a04b5533c01f33d6e7c38435605d4b6a4784385fd25f02522dd1413ece66cb8167c0277bfd22fcfdd7dc817e67b5ab8c33ec742fef9c7008b12b944b42076b5d15021b191c21e2713aa59a8f4bd216c90552d29cb046589c02c964b5d39", + "r": "85b4bf6b5e981307fbc7b6dd16dc9c4d264c164063e1fad891827e381740c44320ffad4fc21c669613b6ed57ca081c4e", + "s": "3b87c027eb02be91a861215c97a9416484fbb74d1fa19ec93b7be488634e3b41083e535292dd50596e868326c37adda6" + } + ] + }, + { + "tgId": 10, + "hashAlg": "SHA256", + "curve": "P-384", + "d": "3e69758435ac30eb6479dcc96a8dda80bfa6be7e90deacd2a546e8ec738b130bfa0b9e70fcad977e390e2ad577ab243d", + "qx": "f5ecd8fb5a0a4b559408e1abbf7f5bad8415b50e42d00420e19f6d86f5d65de5a99f8536b93b5b973b8a65a52cf1a379", + "qy": "01b664582858a600ce7f6c08522843e9750e9e19f0ab06d33000533f52e924d1a425c881d46859f11250415766659a32", + "tests": [ + { + "tcId": 91, + "message": "ac5ef4667b463b99daf81204fb2a49959450511a3c2a82b7a76440a0fa0c9c81db90d72755c2bc5663eaad26ad67d36c29765928ffb31483854a29389c9e83871fc06bcf97720bee7950ce51ad0801d19cdc3f7e94bb41465f6e9961b136a6313b5a2faf38704968f4eee441fa74f11fabda6e43d0bfe24f6fa43fe0db00dc5d", + "seed": "14444acc79c674304db8d65e3158b23abb96c9cc17759479faf9ba8adf275c87b3376a7c7320dac441ea6a0875be4ea06514f4b766548e602a72c49b7dc681760693c1e88ddc9fec0f66b9013b8e76dd8bee6546f7cc2dc6f8050211bd320c4c340a27accb32987cc2870db07a0f99bbacb4647ac50b0603b218125ec70c61fcaaaae52b860521ebdf80f8dc49361db1a4625ba055b5db515351826363d26680271a8a638f4f5b48f49ada747439a33794c0d25f92579873caab57c5f63f67cb54f23caee397e61fa93c8b53de6e16a3e6d3567c92e5ff872e42a3876b94d2fa2e212837ca83a6d1cd270fc7ad086b0268a85c4f3106b00cec7e8bb1ffd957c7f12af538c8144189056daf66187af6a7755f3ba855145910ed8c9a6aca2989e0698c22613bfdbbfc9bd04893865ee23fce5b01d5433cd07cebd4a29fd90d66ae25bfd8dd7d38ebb64cffc25b44e33c38b531c33832985a8923e50d9ee99306872286fa845d643ee2a933db770310c2c036cbb863eca40037d65ed7a01c619ced0c814769c1012193e5c5a0b05fc499897bdbacad802acfc8e6db30559403c25fd2960b33e63896d45436b55ccdc71a0bfaf5378132c8df89a439467448d40edcbbdbaa9c512ebc0faa7c70351202f96870607eca3ecbfc0122b14e823c660453336da5a303ef46a925f2c1a94d48a405fe63c1fa040f186e116f9e3e78869c08b10494aaea2be13235f6b932c369a82d6140f80f91ddca2828f4c2885d072257e3fc9d05fd19710ece7e5a7a46fb312c84335d544c8b1259d11609887e2b58052cc056892789d25b0a67b76654da2d0a597d60964f47280d9d48e120e50006f4b39a2c5be30b02e16564abd1d4d180ed0d75260c6d88802b200a6d1e01e5363912f405b4bf23e94eb8a8f6d971f2845e273eca9afd2925460d0abf4fe23246690108406156c33df1277007c9a97347cbdd2fa67d73ef5390893a0be356817fa7090af58779b1de61d154820048caa85e60a1af0019f5fff5ed33454bfbe9f8f1cc9b43d1d4263b788c6244705e80e2961872d69d75ac53b5fc5b38727b739446f28ccc17eaa266f0c053b49225b71130f8a634e722b623e4d6ec96a26cdade04bc42637410b87c342af2675b7866b7e1a064fd4ae07b05ca89172d03fe4d6c2ff24a5a0667deb148e7803415b9b2ce98e0fe0d905eba02e328afa774cf29d5edf82a3649b29a72034dc5f2ef69bc3bbde8e2922bd5a72af025959d1e261f20448e62dc283087d316760cb4aee6cbe15eba54b31a03b9a9c2617495a4835ce26600b6c177885002a697efe6bbac11a960a685c6364aed85402c705d0a1bbb5baac524db7ff5c187a63c0be72d0d82f48e192aedf932c37d161846178be6f25788afe1871c9b7713f5b28a7bcad9d6e193e8a99dafe6b9f444f4729d152b044c93", + "r": "86d52f3849132e64224abed445d84d9bd264e29073ae325a2e05d939712d9bfe7b57ed860530c85797a118295c1c8b4e", + "s": "5aeea921ddd08c01e8b64655457ce8594bb65f95b1a454553856fb9a394eb6dd8c5016316b74d09b78b80f2748523010" + }, + { + "tcId": 92, + "message": "29572f31697144d763421c5a4a7f475a536469fcfd9839cf973450ee7188609ba45c50ad1bc092ecf545f703015739bcb53c32d3eeafe27a054bf1fc5d3a1c5b461eb2833bfd96853858ace0123e1a8930ad288de3a6b956df8cabb246ca44a1250a421ce1696adec9157aa806c206b0fe37c7a2dc4265883b93eda5db609ab2", + "seed": "f37da4337c74334b8b6c4426c295f619ddb5529f0c3a801926f6211d3ced38792469a6b26a309b8679873d9f0633100ebb94af04aa0df912b4fdb057d76c326e2eb9235e0c14435c32a79bd07344587aa27a41a31e66d9b2cfd0404c2d776b6835168763f59409aa8d80f0e81aedc47eba9f038aaddc5924a1e3fe8031d946379fe6e55f04368b6cc70c7dc11ad6395493ee7c965b3a98479f6f200f2c7ae51f006e5a4978a9adeb3b1fe2e014850ff77e1bd1efd9507795956a09dfe45fb47933690dd606127777283c2295dddd4f2c217450b8d1f693c1268d8d19a2127bf072941686c2b7d31a09b61fc51f7c91d7d4fd64c7ff581e4f354ff7194df4a1fa20ec3d65991175dd976743c18ecbfee69e6e6741c6a59db6e8d5211c12dc14bf70c11bc6848316a3e6f0e8ef98278b345a3d0239de54581b75f9d9b64327793f767aa61389280ab8967c159fab49ffab0e1fdb7083b4c591478edb38e47ddf8f4dcec220ab0b8224f5c9ab28475fa506792df197b3c90222aab4848d90d0a7e49f465934e1e5e9ea39b27616062f6fcb009d06e1ac1548156a445123f1a9b96cbcbe1ca39fd2dd305c83b7ddab70cda558b96ce67265f617bd00f697f221fc7564d228e1474161fa6be5f53b96c6559444cb6ecc1a3fd66990162922d57ea7e34eefa0c257c62c48c7633f98c10470ea664a361dbd76feb0e32959f36ff6fbd4f8a2c4898f26b57dee83fca0b202b49d4f1a525c35bd2d99281531db1ffc8d766238194f6ca207cae8be1299644191969031a8e27dac5141bf5dbd06325eb3bdf87ff7a359e7efb169c27e4780bf05ef28b1bfafb1b8b96ae710c090daa48d3f72c80b1c5b56b5b58800428e48c4f1fe286c9ae1b729f16c638ac46da3643b0001d0d7c83ab53f023e6831382cf3a2d37602f6be7a75293d36e3fdc2b9248faf433b317c68a0940b3fba367d011a7bf2d8bec8a98372955eb6e0406f23172d52957659acdf794b772d2e76f228d2c4998549ac91e168fa872f44399af19347a90beb895e027f82e0da304b89f4b7d289418f6fe4938235b6f37a9af01b4ce91d5e123c5e8f537c457469eb63d1dbcb53aab6f5e7a1da73a24fdcd3f5da6cddc208f4427c97b4115e4db1b3866f18dfb1990393fb4dd5aac6ab5e0e001b6a6fd20f67a44688e89698146c44bfc9a8f52867d42bb14818782632651b452817a0907d30a3895f4159cfe70fce5bec7b34e2a71c772073e856c9e6e2b922625593e84451a3cd2725538eb40d07e88aa0981dcbd4ae1aa43687875760c1f1f824cb70169d15948b6414ba50db6c9e6c600fb22d2ece9f85307c863e4d017904c3e64dcd9d076b9affb5624f5efe2e35f745c409bdbbd86a284c045560f52028e77a7a5f84ed2cafec19fc9a35905b533b1ae5986d9d6fb3c6aa057cb5472c2c686625", + "r": "a780d9519873a194a0ae2cfadf387f77cec29e28adbf69da5d0ef2bf5d4de2e2713f7c44b4c1f00f2d395e6f89996926", + "s": "2b19a416d9792d25ae5a2cc5babf55b2dbe48db1c278670cc0169fe2427da9bba95dd73da45ade324bad486c29c4c0c7" + }, + { + "tcId": 93, + "message": "e4eb4c38ba72678eb26e1c5ae67d919c207a0b386b7bc1e59ce18910b2bf6cda5d1cb927c49765ba99af2986ce6345b788bba91612afaa9d1210d01f2d013ddbf5ebbe2c341a57ca911de81619d4f56d00b711f09b61c51b48ed421c61f6d881c5425ac4d1466e9aac4478d8cbf38b552c32160583031e4fb08f72a3b5040e09", + "seed": "d7890a2faca9134f1c849ca1487f193d05a303e18d2a67b31ae198d78de5a182f12e91605e07d0719af57fd5d59fb1489f940dea0078907b5dd2e1e43a5f70ce3ea6bbfbb92f418c72b0c621c854f401565b8d9cfcb99a21320cf2491eb6cd3d23925e5068c98f7d213c2af3786daa88d48676547cf744a5ca12fb3d2b6c047913d5efca445732b2cab106a4b11f87cbc272c6eb90d22121fbbf8cffa04ef7ace6550ac7c8707ed1e3c5f4acd7b97a45416728427a7126d9415e663f80644c4c6003094eda1db1ca41a8382d2ecd3a3e97bbb5a36ba6904c4427806164684143acbe3ba0430f7e7f2a2f2f7432abd96b2df396556288dccab8ce5f59c5e8048acc4dc317762d683ef158afbe5172f0e23b57a1d89d4edbda69e0dca6139e44970fa74d2a65fa138172f1bb1bccbfd1a65e1c785a444b98c2c774dd69039fbfe2bdbf94aa9f958bb7aad760001d59554019caec639c2d3d0071262f16c9f4ff36cb58eba9966b4cc69234efa70df431dbb7d657b0982cda7765904dd528aa838a24795bbde363b3b9f289ff6df4eb4fe3845c5cca40bc4502f47e667965e30887ad13a6c00dcecbdee2b3c2001f891c73c4dc72d7013881c59a613f143c18a2cf48854b06ecdcfcdd0b9a2446ba64c8f224d0917daa17a25574307023b8d7b97bd503dde3cca6a9b76745425215640204dabe06346279b5d46cff323d7d6c6e8f11137065afd52b5ca26074f9ef3305c5226bea7a463180862db28341de99967f5342f9ef5ccd823bfb8d7f23b85f8354de6dc5df3d187c47282c5501b507010afc60deec699819cfc80be68f285eb878215d33697b1066b19ef1a844cfa41b3e356dc02324fec13509613649aea8acda9d13c457b0e5d23f911dcb4fb570cfa0c50e0cdd4056349bbe0643b36d418a2a128c93e592f4110c8a915c377041b32d5a1c11eabca3a3e2d7dd75744cc87c8c100c44e855f3c8661e863700d4b152efebdf7ff561c009a0eafbc1b95280344e24b1f4ec72f967eeb8c7aab7ea382aec7b0b94935fc2fbf14b78a39ea4f1a94e1e06b3c6bd17bafa54b221638da2aef30d0c5f2a778dfc863652f9728a7b112b1c9bce368a9d1ef1661398a315e3905fba6367f9c7d9c3f3a6816f09023a5e148543781b5d177c932d5e376244861b2a85d9e3b5b4650a38daff9db1688e76c49e135e6cc8e95dce6189cf01fc7748635cdcf74047e494823267baf06b2b7b96eaf443726258d6edd93f14009d874770465627bfd228465e3e3ec46592baa626ea4b89dc4313aa3f520446e0c2fd2570c6aecfb8dfe2bb3e73f16eda9ebad0a66a2b29568a825159cf502b7b978f17a93aca8be35df5690fce4816df38a3be2c904e4e2976f50e9ea0c60cac85cbeeb07107809778d83ba659db9a913fa21bf4f68e43cd77662e811aa32af0d75ab588", + "r": "8b50e2c2bc8c6be5cb8479a5956b0daa511d130ec0f6f613e82b75d198678c2936c9842f6fb9f9c4bb23d941408636b6", + "s": "5a7269f41abfe2bbce9566479f6d844d9ba93e77e000532b9f905cde468f23a28de9152fe293b23a9d3d5c3ef1b58650" + }, + { + "tcId": 94, + "message": "4221b27ac2ea9ce3b07f74ef9e7f63471ccdcb1b853d3b51b1c0f74bbb5ec4f928961155b8329bc34311b8983bbb46893b70782b8cb6c253776bac5eaedff56818b0aae5099eb794f857d24891b2bc5d1ea52bb0c6dca9d27b1af370c7941b155a494bf819652f66213f0835893e6e6adc73f2c9f54fb263a8c34a3804d8d300", + "seed": "27f42d131ee5db0365552880d069aa999e753f4441fc6c10c0631d45a7c27854e270848a55d5055901d538fca78edc3ef1cdd24649ff5025e67c1b5cb1f710d14abce6d1dcdd1ad973665622d9225262bda97b9386d3f92057965ae5ec9fc5af32156992c6595a3a653de43ab2695a31764a065c2e9a61921b90e11b4854c280d707147660f4db6ffbe14cab058b6a1f6ee3926a88d46d8e3153d1c73da57dac55eb6eea3ffdcfa31d9c49e29c1def5989185dae656f6c244df699b56cd9b6e55f8b43bded763679a51564b69c089ddb2fb08b5f786b2d47cc88c9ecdf3eccb74af33dd347be51df6fe075969941b9de503989a8362fe9b4c0e3f78eaf91c3365ff11bed9eb5b6e6881457b97f847f3dfd7a2fc2b0c39944e96db3d81dad66cfa77e8cd02a828717878fca7f15c61a3bda7ae543832f6aae629d664e8ecad1b98a1bc49511c79ae9331d0db48fa5e1d80b4c2a08ae7de91b56cf595f2a18a5fdcb97164a9f719a50922c5fdd115a09449656ed76ff4d7449d504c6ecd4a8d9f38d939242c48920a73a7e0432a83a213263ad11d687c3bda67b58bad3fd4f3ed5ad9a2cc094d3d5fcab12d6d2311b6dd0b7ef200acd10aa2d7a2e7182d8dc74704f21cf61779e18beebe25624baae1147f0b580ee0ccc776c8bfd8314e6b6f173fb0693726c4083f24b6eb4d850809ae91cf600e8310420fd569acf6c3e3e95de98a0204408fafaf990d86013da82b445b6b740d910d3b50c2fbf74aea4d4239d6d3636a837deb7a3300faee9c747ac83244fc6286960189756a28682b397c002dd3bd4cfca6129a3223d414dfdc56f2286c6c61295483788dd8e1ac572f69d1feaf86a607d07a6e4f03ab76049cf2b6a07cffc950981507137a28c7a385fa25aa924a6a18b9c26c662fd502ab8424e5d58777db97d2d5a4e513ab0a108796ef6d81c5dde047ea52b6b7e597738cf660b69601f5b3cb69b5a611a770869bc54a95272f3043453efa221bba0439c98e111ce934cdd85672df385d0066a0f69ef4c2fbc58bfa4422a411a2503b1bbd61b2de2724524c4306adec15df3d12202b6705dc3ac05243320f929c66eb86b3175479cc466fdd7097b96d0af88314424dcac589be85e803eb61b127917f220f2fa35c69930a94f1a843400db910bbcacee65349e8f9a3a75b6cb7ddcca957edd1a213c6a1e522c3b2b8795c0d3671b31b8fb0288f6acffc1f05f053abb6f76797181aa4cc8c9e262cb71b09df10b1df485519bb3384fc4638ed5cd26344e72d4e4ff3d10489a72e4b42bab899696c266904585d233506525ffb24a5210cca0868bc9d4613a058781342b46bddc1e706089a2c58093bb8f87f5172d07ff97be5c5414d1c81eeae0d92ac5b34b10d5d74d36067baa0aab9a6eccab20651d9dc3ba6e3c5fafebbc6d61ceee0ee1b6699c15fae7", + "r": "45bce16e0e856f14de7136933bab93386bc75fde2e9985d9a5b882537cfbc6467880633b3af14ffc5de0acb4d81e5abf", + "s": "c799fc3a859ca36f3c8c15de5385e5d360f04ecb237e035e710c606c75cb4c434ff67e67c47d72e1fab124324414f436" + }, + { + "tcId": 95, + "message": "1519feec4ae44f071d7cb00774f5baf7a7ed6a27091cec0db6da25720d1ae1cd13dd625f9db980ec2dac609ec53f83c441bea553677d9378799ca5cad07cb37e1b7547f8b9fcb64c40d1a59d9565aa5ba5f5efc199fd435bd51c5b5405c1bdd249f504709b28ba31803e50aad86894d4f0aa8b8d4ffd741fe6e320732d368a91", + "seed": "ccb2ced75b92233044eec04cf09fb4a64e7b7b97e44b1de18cd616ee59cabb108f0f9b5b345a86bbc4cf98409b1d6f8f32591f38f22c0c6b3e8b5f569852a3d4c26935a803ea50baf902945f5f236b124ebe070644e164d59d329e8e11741f2c81286dcd4a55a7eec49948d02188210ec310465066e2938fd81c35cd1b9e42dcdbb63366e08cd056befbce1f9e7973e85f6d723388c6fb571e07628be1099ff04b49610c17e36402eed60a9f4bb64fdd88a8bdc793c0a703aeabac5ddcc18d46dd74b74c7a726b26533676c562ab2f3793d82c8f285021129097be7033f5d7aa513d1dfc8a6e897cf69033774d27e7f500b22c9fc08ac2f017f06c353a14ab343dcb59aa41050dc7f068af4ee675e080a9d648f325bfc9b7ab9ea1989a885b152e4fef01123ade541a7e8f1646db2471ff92b5cc3ef1d22e499a11ce4f56a5c98fe5b7613cdb1289e01098f7a24375218c5491b41f493dd5df44a5911ebcf8b6aafdf37753695180563e6c32eaf236463c63199d9a1521ca5b838ff35910bb1fe31e7734de7b0165e431fde9d63e6da646cb3563879e29dfcf571d163c628f343bea6f657160bfe8f08e286ce44dc3b0f4c7939acb33a4e2f02b22f6f79200d37f426e8dceec5727589f521c68e07d6799ae7a427c90f4c8001d6883762e8c7e1fda2e4119ca6930cee9d4866dbd1ea610fd14e85a106c2365ae884fb747d6abbfae10d2590e318f1d6a0ad4bd65c9904a922b4a9ddc6171c715b93cf078d48a84e34fede6db2f103d9e1f42cf428618c2822b54d58416575c26cfa5ff87815370190527b812af2e740a9feffa7f0ea83a449135fbbe4c7cc999779d22f3a2e4f91945b3451b099ba68ff8d66fbdf77ac09f4d6d8d4ccf0609c1e4e28cd32ed79c4fa2e33d6bb362b7d5cf142ddd48964890d7afaa98599e4ea271b3bf78b4164645e419c2710a35b53fbab2eb9151ac185f4fed5318076a7458cc8f33867d892a5f43e07b9711777243ac5665845fa60db86d7113330dfb996b197f3800fbea4b7f08601e0ec143ad620a0e1277e386a5454e1809a77ff545a2bc4364beffe1de707bb1041d453b707bca7b72bbfc3ae0fb79d262a6537780d0d56c90496a793a430c6e8150ba33afdad805af31ed69e3446d844d398103bb76ec0e79d0bd819e8e4d576e921b80499e1ae0275d679b26299db00f42d1a9d17cc1c381341e6514c3f6d7c30c61a03e03e65bfab655a57b20f665412ca140ae05671ed2b3d7f1095fe9010c4ee6d76309160081d4d9ca95832224fa0c2be06d16458d2813aedc808581e3faa0223ba8a1e209b92e306da8ad8342600a950c933cb3c6f749456448faa1cbb496fbd6d1f2a6bfd5b400de8fe68e114018cbc0b2d9174b9b46f6ffab242fa8d5b1c25ca3644f6879279de200249af2dc6385bdfd8cd7acff20eaf4", + "r": "d9d10160dd7b14f0d36dd451b5d67c3d144bdf11259650938dc2b9a75b90654cb2cb69e35f2372e99e22582b7cedbbe9", + "s": "b73950cdf8202e7eaed327c55e3cd3d873d34807945f6134e412fb9a36163638f24cf4bf6a809aec5c6faaf221a633ec" + }, + { + "tcId": 96, + "message": "5c9590e93b6b80570dc322558038db02eb3e62303f073a3c92386ce0100c231e6788f99f3361bc3b29c5a034c7f4294b02834d37fc825e5535c44bf8a6aa1cadf8ea49a984dd8638755eb39d5c6f01dd31128a2db91b08b0317e7db99a329adc63fca4c9d15a5e8db10752043390d3b27de52b408680aa9cb31b04e36b3740c8", + "seed": "6922374245a5127ef8aac3f1a40f97a4d705b5ac01ef2c26e574003610ac37be514a50515c46652456a007eecdf2f7d64aee6ef1e89984dc3eb992b87f961fd85049c0daf478096e08914c44b0a37477bfc93eaddea686b68938a8c7497753239861fb5ab3fcc89fa89a4f6779fdaa5756e48a8ff19500dd987a6cb0201210b765396eda43cee6a2355d325f5ddeee5923c369231363355d0af8ec3888d9ad42e31418a6f86f209ccf0287e35c1e8c4dd8803d32c52aff69af61420bbf1df46c52d2b061f597787e3a030f8ddb99b545890c89704709dc916bf2a014243a8c3bc62795d13994b50e09f09f568b312fa4936aa37383a9fbfd22372290efe5855c838319d9229b07482c9feb5f4f86763e1fee5b74fbd5af70247ff28701b959d00ca9ee631d888226d9ef8cfc98fc891b12fa6b75f757f6a27457d1abb06bed02aa5f6e6a5b7e069cca76a5e5a89f2ca25000c261f97b9caec187791be344491e37ef18cdd2cfb333de4d2b59d7349fb38a2d77e6346a6e7d1baf531f1aa65771f29d19ea1566bb14e162cb6de0697e090d11166bcfb6398292a9234598f1c6bc261447c591b9a0c906fc553c9711eaa2594054fcbe1df02a6468357bd5b9d89b6ad97cb54d8e5bf386f844a2b00870bf34758d3b08a77f2123a43c2ec95090fc156c47ccd3c706f092f555be80d79a47485b27d1a24457b74299181421260d5c79caf77cbe8543dbb41e59958776d2195a0f9a6b5df8cf65961e121f0787df0a822a7892fd7b413fe41a65282e9517711b394a2f21fdcde1bc36aee1d6de3107d44a5f291e4748b1b6b68f242568969342b1c94aae9e111d655e29225407496e28823d991c453d237050c0cacee6934828731f5518ca3debf6ecb92d3166827c25bc60e6c1d6b0c94805d4cabe52358cc699655823e6cf8a82b20ef83a1458ca703f351b208e7df172da129676c58d1209ee91c062b6ca575e4a941702c8de9431f6b6bf824383c4cbbefb3dd2dec3a07b83e5fb7bebb9ff42b8d8dcf6d11002212f49544f950d2f4cfb79e72472a8b469c276a121ffd3b8c038117a537e4279951f732d7438b4de80e36981a2907841551958af27b03ab19e48093e77f67b689f0802832ee814e48ad0c4d623240d5ae9d2b42bc7088ca8b9bc89c67674dd9ec54215adc9350ae10602eb50c9587797ae7bde8c4d9975913885451689c3955ff182ec674b86315aaee7ebe6b6922e969c297806fa249b8c8df2f613f0b52f82161a2c8366dd5e494e80872d436db10ca163798408013670b7373fbfc7a114e48a84a671d06727010ab8f98e7e4b03127088c4674d91e1e0d2bdeb5c6891d08c88a43a1704e2ed713f65cbde51f54acaf41d350fe4b7ac5da28b7824efa659ff560104d6582a0b505f04d61608f89300ec864cc01a6f8a5cdab2859c88b91dfc", + "r": "6740ed5e64058e70528f6afab74157af7780e2d2a8b2e67aac77fcb235da8cc41a73b30a815915b036900c660a3881e6", + "s": "3a254c926e952b5167e1f3758a059f510e5e14a46393ff33b4d71b84df60aa10e8c41e8ed779e26c051c65867d3c340d" + }, + { + "tcId": 97, + "message": "ee7bdeb7fc3c72cf88ab9eb0bf923b1a9259abff7b9ea9f0fa3af582150658df4bf06787f4a6da4f768327a2407f61adbd07f127cb28305502d25ed68be853af4dde302140f82283807627acf4acc35911816b69b6a5be7b11a780162a5bc59e2f1c4e04d8722f2870a7cd8aa441fd82e98931518682cb9ce308946f21932b4e", + "seed": "f25bcbb814947122df253485bffd05b344f3fe189001a0dc19d222d46a710f24160a5bee22209e68193b6d26d03474350a451e3455ccf3708d14a24b7e1bcf55514fc38a504b1187efebe80652d3c7c3289005f5d4577c1451b31461ced865d836b7e9cccf4ec7d45d2b41e8ad6810fd112affa53665f18e25b4a80c4a2a05ead6d07a6322a2d5402af749769692ff21835ee0cd649ce89306f99a684a773fbc18df448109f568b231cb019f28cd060d2d25f5830720e483186ebc0f2df3ed951220f5d5a68bd8e8bcb6f06a7c1096cf66f4968f2366360e6e4575437b75ef303de7951397c6f82ae0c86a95c825913bc8cc51c1cab9d6785823a38e861f633230ca24b2e96ceee0dc8db3f9a9fbe2af2492ba11db2ab7eba7c806a4145ffaec4d2d31c0d6c04c2d7bbb9643c8fb3a4c163b9d3eb8d30a55269ceb66965ba15d93c8405e75b0d578e0e6c403b1da696fcd615a37fc57369807b3860ba4303377d61e881f79e164be19207d8a92480f2fee17a4932102a162dd0213a02322bb253297a93bf685ab14a65ed045a31f288bb74d112321115f290e3aee6430788cce2390b5d31e5a944197bc009d084065fc07c9d221c4df402d9f0834bed5fc5dcc3775cd495dde2d723622e078b7c8fa9dd722fe59f034b83c065c69c890e3b88e81039dfd4c86d312e7f6582f4e4ce8246c304088e1022993cf055c735cb0355aa6a44c0096441f2493d7a86d65bd7f726e652aa9a075fdf342eae84254d76c8dd355b476faf3145fc7f2ae762de781a5b03ba9e4a8263c323a556d736abe0f85b4b11cb0d6dd34927c2fae8c7ebdfa42d72a07b22e1c71f697e433a85c7f666fc3ab008b35a4cb4c596e38bfaa442c22aec36f9dad0024b4525dd7bd03d2b9aa356eed09111b10d50265783f24bbdddf5e1276a59550d569f8621c8246b9a789e7b3a041c4cdb5b34506aa65ac4203ad90454d2a4cfb22e3beaff684b88aa5a497ca52939175dbb42aec08aecea20c781ca7c37144f59077eae74c6024198802de05ceb1888fec89ad009ff5e2442eebc22bdb294a5b7da64db5ed5ea377e9ff95a29688d3fcb592e48ea4d7382174a375a12a1576adc09fec4321024d62a1bd3ef9b68ba283f3c5d8c9f50935cfaf15f499b311b0a486c3f8b3d842e607022bd15f0da36abbae67de03d78f33a550964017f9c5abde590a55efbdaa24214f58785cc593d17261410dafc42018571e310caf10bc654b8d66166fecf13c9a18ff62a13c067fd12d5addb1b23375d805da904273456afb586de25d5e0d8eff74029bf81dd9b84a94e7118b6e1389fa8370e7581c10b1c2f5d36351bf186f7a8d0a6cc1d087bf92ece9f019e160e2a79be35cc89b927ead96309d9bd4b4df046602ae1e91fc9f62db15812eec871bcbf386eae04ecd4de866b78b57a50c568bfeaa", + "r": "c81d7ebeef8f6c52eced874745850baab15f61bb0ab63f334f92f6228422704bf0c4e4d7040c18e7735bb652ea75b220", + "s": "38ce7feb59674944110814c6d4c8971a1dca4c0399e908d3c79fadd2dbf6f6240bf84916eb246750f712d6b72af61ab5" + }, + { + "tcId": 98, + "message": "1e606fbf0b550bfc6460863a2934c351e730b4e458fd4dfcf485266705f8b821ea19db10203e23931503ce280bbfd4d3b9b3aae14b766efa7190fd2fe920ff338892f9fe077c059111005ac6f8be8df1b41087052b40b4e417e28d25d035936fcac6e799b089e340b8d622ff5b85dcffb5cd647d90c9f96f2baa88eabcbd6834", + "seed": "c66a30fe26e942182276abcf86a60686597843a7145b838fe29cabe4e0b7a08721ebddf813cd3fba283b1a94bedc322c49462c70efa22b66a96c06dd0a90a0235000170cc7f179f5ee210dddda820f3a374efe4b9a12688577a62216a6a223fa9fcba60b12de717fe6ba0f8ce4c1075bb5068a05c5a606e7275cb6075361deb8596e85b93a46c8080204ff28537b41960ae345211788b94b4d2244f34d9c3f2724a75aaa9176de15c2f9ea341f38915cfbd96cdee1fc728f9b4552b83ec7eaca7d006e8786ecee3a45e23e85da9367d89e014f9f98f3dc0886c454ef7909f40724e5ce7c5d5d82f29f2dbbebbd9c14b06c240481288733080704dedd0faf82ba6825264d6ca4b9394d99f4fa19f0cffdc5451f80f2d55a00dceea58c02aeba53b299a55294a20d694a5e0916880c6951859e4d03ff3fc0a417f36a6c2110fc123702b698e69a1b7d35ef73b3ebc50f54d95bbf65f06b0c201949cad2d7a36fedce7fe31ca376189516504c972b3f2efca16d59debbe97981215113878a2ea68298adde83f056fc94fe74b225f893c9221297f080b55881b0c0b5b517fd8d02db4a9bc70c462a8253c94bf5060745b8af741b11758681030aa4a5cb5423165b5fedbd87ee5a9d948400fb4e3eae2df40c1284af907a312cfa1453a02a42a9cf6618d5fb7be45f8c9bf9988b0e18af83545c904598f612d04ad977858703f9a1a0f759b5c65721fc7f3ac3c4dbe5245d4d8193d71db1ae46db4799e1ca7e8031230ce84c19ab1fa3f126f83f198cd2ddd41957052f5c0ed4184fcf9d5f85d473ed73bbd683b489a522e6e68c1d830b009f441a91cd397524ca37519d2c962e251920b53c47bb1b4d3720ee9bea18f1b0fe3e5dbc90e6758ff0b6c5c6cb385764d00f3c322d5a830403227b7044d446d3f99809a00c9a2772143818203789e562ce086e1d10cf27a0acafde8e9be89f10aa486f46eebdfe03983007fa5affd29d0b308c5fcf34597a3477308df153bed7330be62b4b59904bf752124bbb86f546e0c8d4241bfa5afe4a3dae842b3c83a5621b39ccd0b2247bd8e36a54a0cebc6d4865e920f84995c5502f11381855390d3897512e7285335c8bd24c47825b95a26e31a74cd219a62458e9b638feb1e0d1d47ed944e4434a340b0be0ffa4390b27d1a29d94c33ac0868dcedbb10f7192b694cdf295faca3bcea5bfc566468daa5023871a7691d85e08033617073469c166de75624c10500338b8bff35f54637797cd3ae5a9dceb1de0627ae6457e0ebf928419bc71d09c9d84e7d0d82ced18331d96c01c5b6cf5cc65ae49c2280248691ed08cc040df2d1965deb84ce4e84d3cfd3156ab45d75437f16048f086f4a6b8a9f9b207eb90c728c7c913e35659b049d1a002385bbe4a4648ef0d17385d9d063cee9cf6e62af6e6ba33f23c345d7bbc3805", + "r": "d793e151492507ecf134cf35fa928ced7964a77f3e9cda05742bcb85a27a39c55223dabb3ed66b7b053111cc9083a3f8", + "s": "78395f1f9a84a7fa629e08398c4b18a34d9f55d3e4272b61e5ebbb18b3b69ce195623b5dea8a62d433e0be5d498cb055" + }, + { + "tcId": 99, + "message": "36eac918e02ab3abc2531cc60a8550f6c26b463f743b54b66b3b24c52359de288f96ca2cce26e1ef20859dad8efe49d063c4f6d12abc210016983fc21ad3316001abc45356b4bbb93d71fb963c6b4eabfd3e9954b9dfd353e921e089df1e601b1bd918dda9460ffc18afb1fd0f0b22f7211fe07aef4c3a1a886e9a65b1d469ee", + "seed": "4542afb18344f86d6d0856895e96abccecab3868b6e292598310de848719404b57ca6c6f772a69cff51abc70e15a4d4df898e122ff0bfa48c799c440eb6c62b038618dea1259dc64113e3912fa23134fbe4f75e58998fe0cb7757266bbc793fd6081db24753a26d217b29b271210746a3d3c9a5fb643db9a6f375ee8a888f5f015758665797c1245441e432a44947c7b05bc6e8e4793bfbc39b9fb3c6a761abb3fac6cf7abde968c1551df4a9cc8d29973e5adaefd48ca33d827a431f36a744e247e5bf732ebedcf9fd6723bcc331f3257bb3b12e9d012bede2fc604a66eb02c15e5bd2bea81a3a33fdefe9b90759722235eee0118c1cf3bf3fd7de24e074d1b84d3c2d550d242fce05b014508121df3938168f177ee68c9ab8dbc3973481c4a5d01a2c5d190907511fa616b05b96f54acc101c0cb95a4c7e1f67461383c1f85b570ef8a61e222ff333001b515e05bc0ec7bb826bd559ded60db63fee6105f598be4c38c57927290ab6ed0026957e5002a7b828bc6edd7aacae0dc3f35f530c1a4d66af6f859ca58d77e8b4d7d04ca230b5b83e44fae9e5b11d9958b34c49a86dd5907903539918df2b6e7d001e8b32294f39f0524751937501a77b4dbf0beec23b1cf2c0ecc9d88d5abca0c617ac170b19c985f17962e28fd47f7e00c1245eb33783b6d1cb773e7b40e7f05ee6cc06f528d72a5619388f45a3eb37a59d44081d23e3008a3db5fddebfb16662be6f6f075f3c5e2ead0fa8652e56f30399760797f7f515ecd84d79b8c17c71d7bf288f9c39efdc0d683157269999cd7879a8655f90fe8caca9ffb04e89d67059f2641f2e24a4eac1f5a6ce7d526f9231c85c07e0746b74c11bcba8aab024a62520305f8d7cabe2a1d53f8e26acf3dc1ecfae3fde857895f2e4458d55868dab1a2ced5769668f98d43e6f953cbe99965ce7aa742161f9198d2d28b6e1b7589a9ad415e39f25cee4f6dddaa587bf9cc22b31ff062a5a7e2428dda0a81e67cf985ede623320f816e96e9ac678313ca8b4865ed249578f451dd2b2fe304210c201a9dc3062054e18519b4c53a322e229cdc9435e68d2d7d829e8087d18e06e3ed267674534ae1699a3e2fdc0b1f54b17de19a3560eb77897ddb0d5e388bd4f5b1614e7e8fe1c0c73b994e85e2e8dd07ba1e2388ef963b7833a97711535c840c8bbb3104f764aa5e7cd261538d64bf493854f81ceef9bb1220dbf052dd9570d06e15ebeb19ca676743c92d768485f247b3c0ead86a30366840cb07d329779b647530b2fb6c306294e36b4458fa1d71641635ab17331bf1bc3f16fb5832b5fbaaba09448bd542019ee31cce29c14e902744059687bd971af83c2f8516c62d42fdfff0bd9f609f3c88fb684d2cc3242493d89680155f5d639eed18c040805b2cc4267e0738e733bd5a47eaa084a68b422e0856f2b418cb", + "r": "83f47618ad141c1243add2bcefd71662a48ecd70cfdf94e507b7d573f16a26f8a421828f162154b3dc0dc71b542b1abc", + "s": "d79a02caedbd9c23bcbaba576d5addc438e2728bb24cfa5a95464f92821f53292f875b05d18f78a68b6a8eab2f9f8c44" + }, + { + "tcId": 100, + "message": "59c7837be83a87358369b45f1b74de15740b145616cd8c404f7d2111d1aacfe80060e1d38129e3920c884bc952a8cd0c0138ad7905c6653a9b05a5cccd94becf330608e881e04d2184191c7b082845f449efa68f7902ee084962b3cf4b68ac290453f1989c16fba8c8267bf3ceae9d4ed4f03479bdc222259ea4ff7c88154800", + "seed": "276faa5df16fd15a8d23ffc43ec5f8ccb3719825f3a0d6581aba4f6493126c2f4224bf0f5855501edb9007e7d0628936a0e33ea14e3c4811ed83639f4dc230e2ee0cc512dfdf837de46a7ebe89fc7fbd39c519a47b5b4c5df12d5c464679c583874dcb29e2092939089d001381ca270d42739f10f39e817d5cd3a24ac1db3edac54011c21764be4811d7c357427da37ca48e411686258f4c8916ec52c4a5d402b97129aada809e705f817070f0e4cb351bb63a969dc39d4b6e29ee935e5221270bbddb29eb8793807b75a36b154f3676c8d15dc981b6f510793e33c01b07acc6311768240cb9b23f4593e536558c90a63730df6a80f68898b7d29aad4a6cc10418896d0b9b47f3fca1da4dd7d34fcb2136de674b37a5edccbeeb165eab64cda3705a1abb1ea8e806687cdbee1844202a2e6a1c593954dc34a8cacc61df3dc0db14ee240d128b2399ca65f29d9f1c54be3cf68963b6aaf71521cfb1aae9eae0e47b64f24d65ac04a8c6b84dc46d0983a1c2f0318a39e0e48ade6f8087388f4e42035692833f87bd819fca9cb1c9f0446996c87acef7fcfeac5d57e6216b4c531505a0ccd0d1c01f9e92a3d3722cb9d54daf01aebb7557162a7a1cb22cfbcbdbfcff7e28edc94f2ba4113e7960066f7ccf6fe56e79992764700bca645d971d1e6c7a84dce198416aca302dcf902979d50782ae892a80dc69ea5a331f67cd6e67fe39b746370eaa96c3390c061a041ec396225f9a8c3b8eed90482c2d3fba531ee6144ced1fe56f7bafbb1a6e9198632c6d43ffa2610557fe3b06a4c719f5ea826805d99e39f9da7f24c18fb57b9635b17864c19484acd7f032282e7394df43f578c54ab5800990e78cdd49aad6809eda8845ba7d9574b782c8228d9932c647f1cf295b71e40bff81953bfa41d1cd6a0d3c6eb4056fc287482e248c231df1d02a3070dae937fcb22a0be825ec4905d5146844e2b15b882403693bc9aa18e32adcc44e089fe74c41000873405744ebd62e032ba95a576dea93ed342e8dbfe7f0e81a313c9157c77cb49c6e2ef12b1d435a7d251abe93a3e13cee229ae84bd4f8d105afc071cef3a3208186868aa09b5bcba8b6e8b109370143f05f34668703b5ddb3cde862c44a8354388c9a89749816db04570fb40a14f5631a850e60671036f4ebdf446bbf8c8199283291f31aa352b9e1d583154ce3b91d64a38abe1f1fd626eb9c988848fb006e30c17f261ade99d649bd5d7611ecccdfcf73c61220d94122c61c7d1f88aa85670063ffb3929f82f06b949ac2cbc632870edb9fdff31ca1adf8d3f7fb47ed11ee378cf561fbdd13e5c699fe4fc9df8991a7efb081accd9218e430e2162022edde74200ec2b2965ee43e030342322fc621be90e759aa61b906af7f9773f6e790290c69e5eee15065a291a5219225f948ca91ae362e9c75370955", + "r": "3c7fd6e806943c612af32eba4919d4233173b79582e3795cf4a6cd95846fbaedfa8c902731b58fcd085ee0652e494eb6", + "s": "f595f1596c6785ae65e239a9c8a2fe1db2d02920a096515d863ed005b724a7bb460cac5b21b43ceb7b11933a9886cb8f" + } + ] + }, + { + "tgId": 11, + "hashAlg": "SHA384", + "curve": "P-384", + "d": "e4b198f7bf261954be282ed279a3aa684f4d57f4d2dd2866082eade436526e182e21732812c0e551c2203f272e82b01a", + "qx": "ae0501054f3be76eba2043970d0abc4a47a3c214392de522ce42a8ab05077c741a5bdd94652fe286b404b61d1ad78f29", + "qy": "ec15ff154b3ea8d6033dc84f64262913a324a15ebf6ee90953e013db5511065bfc3798b1cb4ced997d050d6b0abaa7d9", + "tests": [ + { + "tcId": 101, + "message": "37845371d3414bc8f8ec87c698fcee1514ae8c20fe204fd1c8bd1d6148a81f6174a4d728d28e674195437606ce840bd01d230292d00a1f0fad25ff3b82e10c6ff3564ba3cc0c3917415c2a1d30fdf6c7f8a043541812b7c048a4350ba6a99dc061a703c54c047061771ba587ca67b4e231a6e420a16d16f71b98a83d6eb132e6", + "seed": "3c36f30e0c6b71dddf6be747ed11cd3829cd333d44d1e9c21b48961418972cf58f999465f0c995a07d4888c7c02475e25e70aad08debc0abc19e1c351aae485a07eec7bcfa0c634c150fc38c2594a4dccb1bfbc78735e1cf3a79d02aefd36ff3cfa8c1aa84f30e6709221fbdd08612097da567a9d8634f3ecdf9d277251c8e50bc0e13f9125d3c5aae78608fd94d7792a23b535f19d80a8c167f3c4e37cbddb574072d4f681330ca91d113b4bff95c18b7b154ca1dd17253b988cd062d5aaba215f13b42c2e765a58a668da19ac49c3d9a96b6b8726501757eec1d643f75e1272e297c93e1fc41a550b02ca6a055255ed26a4f108d44bc29ef1fc87bcd6e341e27b61124bc0f1c5f50d398f143f9c6ae8c08d80f34d09d1446010ba8ba42e0196c926b4de1a62053badef71abee7f1d262ab32e422a1662d12f672ef8f8399e74677622afdfb60e78548012f6d74ae002eaa9fd668b1999d8417c21c9efad92f1436c707e2b4a1f142346991a250853faecb207380930af92bcf17d4108a4dd69d336f0b8fbf374c341414398b2049b38cace24fa1cb00f85a0599218fad593326c910bb41ad99aed75a36ef82a5abb323d889731a6b7d3e3ba1a27b3abd7a8bcacc205d1a374e225da5ecf9550c1d9994655b2bce1b9534a19b5f23c7537a28357306edf9a2f750783caeaf7c405baef59d0c1fb523cd4a1ae17b6f1cb78b2ee785e25849ae758e65b2b1ca05330cc403a2e36e71c5d55d59f0cd145a920090071b8297d2dbdc8aebeb3e320dade0134aecb3f4d16b01353db149162e11618dcae8a7239c5222843a879f992e12f4343fd6e96795ad98b301cbe251a678fbbe1a5481cda0551eacd5d56917743a106ee715de5b271b2f1ac20f6f4f73f3be7ab4b1934d14a53b330cfa72eb52e6aee106e08de2989f6eac9fab67665141b42d63096841b815a702200ef2e4ef73127f3693d519a43dc1c94e5b603c64f4b7dd67f41bdb76aff5d035e7cd911037287f42482e80e328d72007427f3aafcbff3dd369f2c16740f4ce4972cd7bded163cc6a89570935102e5320734d3d82a5e788771d0cad1a1567ccde8f0c1ab19f46e017a3d214a59e462a48fa9ccc342722842c0d07b74a45d3cf3b09c042d0cbc953e889d19475fb3f239a23ac0fd143917994b4a10105ba5202c019d4114583fa5d7c5b055d3d4f216315dd98ccdb8e30147e2ce9d444a0913fd3fd2903aa63215f92a623e3c967eeb16b65167f254ccfc2cc6c9ec9619a0a80198f943f64f18495244cb6943e3b74e22ea3f0ab55ff2a7437d4f849fb6d443cd8314dd970f87e00cc1344b5fa53b4f57b3dbb2a658ebfcfb65dead2214a0c780016c6ac763f1880b164d1b7f1eb6880fa08e38eb3057c30c75919210e792bb466f1e6797992771a599ca7f357f45477dfc36c61eb04d648", + "r": "cf19c59ec99f7149064d02057191cdf27fdbb2a3381bbe46623d5a9bb548481674b5815fc5214350913e7b1a7a8d8da4", + "s": "ca12199bfd926c3650791743f530b2fb033afc2660ac5fc5bcf64eddd33c1c7d3a018ac1867f6c488d021598738e11fb" + }, + { + "tcId": 102, + "message": "b7559830e5599eca83480c40990dd67e4bef029e5674e8781c0338e98271311984c000a57bbf4773e385c7fd6b70f308a1de5bd7f90fadb7fa13ef2dcd82504b4678b08c15785ca7c7fcae042ce38c0c31056bd2bc7791354d161dd8660e70928af4e0f87d240e0db1184f8a45fbce17ec563c3d14da3f27702eb124850dbf16", + "seed": "d11c9bd2cc79886a07cd5cef3203148ecb5cb6e89e736dcd48e398c2affd6b55156b64459c38f9ef896a51b01fbc9c9f700ba663b82f376a46016ee267ca5ce3d8e11f0e35fdf2e0a4080078a026e3dfcdb902ffc1de7f5ef619566c713820eeb06f323753ddc744e83a4fca27ba947779cc7b529a78176b40918ce8ead2382dd46a35a5b1bbc4f516c28b08ff19653ab26d09a5223739f67646b753c0ec75925eaac1a79b10126e8c1001695b901c67613b503060021dacc194df188220764d2d019eab10535c06ba392346882e2b880df13235d61876e4c29a9b17418d1c4950d301e326985de77bba6bcbcaa9e710c6b1fcf4aedc20a9df532df2c435bf9181983c3ab888818187d112c31e154e7cd7f3fa2cd3e69e19877967cb766c0bc4856c01e32bf6e75d2448398042a03b33015c1e183294b75f5c71a1266664adb5ca4edc3aa260a4930010eaa593b81e93166b5e67432c5654ba543208db5098bdb7b9aa6c076e8462cbb7ecd282198caf82560f4dac35b65efae7e85b225d03a8fcc3677464938cf2d2496c0699e20157cb98674246d726355202d7eaccb81ecfc2895d1d0a6f60e9e856e255d27538c005476175c1807531cb623f38d5e0c792261c3b0a2056b2d13bf2e17184df54f1b7a28ce231c4ae5e8f3610a2ab1dbbef8b4b0b8a88d8a4a1fa16eb3978e5a47a382db7411e2acf3b1dbc919d5af74801b350af89389617716d0e6623d4aaf11f468a5460f2fcf58433f8d5b50c1fa6b42cd1ffc9efb9be1656206d96456b3ca71cf7357973dad86bb4ea47359af48ae988bda194710283627ddd54ad10328bdd74dc2fc2f8f4eb5d9e263fe246cef4df31351bdda8b2b50e7a112505548a1c0bbfe656496213aceabea2be468286405f16f9b3c4e3f88f097684f6e20a787523d47aefe5717475f5e7acdef0c607c88dcbf3490b0d86ff55c79956867f1a85e0df6f8d32fea1ff646007feb53ebf61bb7edf2757d11e0e42737927ae8435a63e9bbdc04f1b34648768d554cec1e2aa39a6f5519e94b60f6665593cab1c3c917cdc5ee3b71a6ef47ccdbf28ce18e7b5e521241cf68ace0eb296028dea2f3116808333c7565e8019dd8251bcfd8c0873c0fe902d1c81d75d15150325f1ddc870cffc30520d75ec186ce2af3a982e4fbabd6a379c998652e4f4931c1f6115989d6327d6e8ad59a34d61577f24a2fb9431b7966f6d8c661a4cde860f9b4b1bf45a800f91f13ff92f8d15912a1be54e48e583f42d306cc90f696a107603a9393fa0be91202b5dc3b123bc7a0471403e6c91f584f635e65eff508186d3a4f229796120f8e48e49fd00725e0ccb846aee22e67c93d4fcf1d2537e2a34b67ad3ae369241bca17c2de96fc3195e79fa5273eab4d434a9f48e0717704c9c29ab530294e4a17bc6c70ffa51b04a4596942396137d2f", + "r": "60d475573f562379449268bff817a532d7edb7eb70acd282394a30cdeba8e25485b19741196436f0455ba2e42d80b812", + "s": "1c54967df772e1d6f8e2de505edfd1e1463652d00cf7fbf845e3763da23adf62a68894f4cb40fdf9edad0c362e27390b" + }, + { + "tcId": 103, + "message": "8336fa76db57ec83e8ce7cdb57fbc2d9b75e1402fbb346b12d47609a0cfb7ceaeb02ec0ed9a744182790b7b741d25fa6236f4fe117c3ca7045d41d1f6f1413a086bdadb7a2e548063f2cc6c5248b854a67d0ae209b02a898b98ff322ae8444ed55dc43c61cc676d28febe4c05b83ff39f6cba4b402697cc984ca7e19b7d8f223", + "seed": "7e585f359f03df417ae4786ca00525ca9e620d36f59900b9b8534a0a30334505d7c84f390a021509090be7bf9f9c87786e56d38dc70c80ab57fc6536702c4020d4b715f653e65e1ca3aaa5af211a9f3a2eae0e9112deb928cb152dbf23b64c894951483bf0dce4401af92e54d2c5c0d4c1ee60d650fa84c726508ea1900eacc150595dc32f1f9a1e469861303bb01fa6421a0340aae83626bb033b8d24fe5daacaee6c24a424db9b768db6fff7468b5ca69fd8f76d000e5063b14baf75ba19431794847c9a9ae6632e790ef7441001cc31205d28adc28315aa3568bc373af4911790d611f86df2c7cb8bff30fbf9ab58eba08933f2ef6f005f49edee099a45cf46188087e0fa0b97ab394ec2d1ebb4c7f9d007a0d3e4a88563e382dbbb135c2cea858ec74586a44e900f40bc855451b1fe3c07f5c65dc9174b0b5def00bdaf3499514acfc4a30cccb73f672a15ad071d36a572c663f266fd2fc5caba2447fdec12f09ef633386f70a1342b73d89572d063d087655436936b3d33d71f0bf823fcc1ba675db8d17e0d7461c5b69dfa0cd0f861a8b20525d89106235ceeaa24a7bdc3b166860034cde8139866d1ebba569fd2023523f468cf2270e2d386a540e2485b2d5ebd0a0ee8b9a3443f5d1045c6a97a1bbf46f5bbd2e2efab85ce4f04d3481bcfc09bf7e7eb23c03aa6ad6c735a60cc9b9336d25d3847e695d7414e837e630fa9615e8876d8605e294a20845e3698485a78c2c189f8c3878ee12c516fc1a2624b850cf3cbcbef191bd67a099ce830d0dd91cedcf1631401597c716d82b40bfadcb97cd51fc4c51d323137d7ab94416206b461fff1841067d831597a5c5f1ed7c67c8086301082c20e73bdc521d71a2fbd80ed645c554351fda1ee26a8fc4565f73eca6452ddbd3d514fde4d892cbd1e9ae2bde01550f91424c9ec42799ebadcbd92e63ca848510b801ef421b18f7a87df2d4bc3a81d1bed6fde3640bfcd9db7292083e8dad3a48301c8912811b313deb6a27cfe4e8a233950aafc9ecb24f79899636d1a71c95b249f500d8cf9c3f90150a60b446a4a5b04d8d101fab963857d615a7dfd24614652f4c892fca93ad6d50a9c704384209c22bbbc1a6040bb1060d7f003db08cb59894d9a99e2010a7ddb18d99fea94171ef076cf118e17c16bd7e3c9e724012324a3ee2dc78bf739c0b5d93ad4fa056ed91ed2879f4c3a3fdd84bf19f2801834661777042910959c257062cc35f6b0eab907091a4132a26beed0b407f5918b9bcd8650f6aa073f497f24c021a01fc4945b6c1aee1c5aa304733da2b3b7b7a2b497e8c69785b0da3fc0bbaeb2ee60f48e0be124c34a826d9b74bdd3f193f5c6ba0295076245ef2dba4268a796d99608cf957cd93e346e09af9f1f8ba5bb5029b28897712498c3af9908ecee8a7c3af6da4abf5c48ca0aef5fa3", + "r": "38e3d5075cefcd4b4a76b9cadc75a8b596bc22d6772a48c7d7b4a9ff735d4716234d07aca3cb9f125e19f0876b0ae58b", + "s": "cdab5cf48aabac210827b0340c8eb80185b42a622323dda0560076925017950d58159d899aa6b5d74ffcde00258ee35e" + }, + { + "tcId": 104, + "message": "30c8cc5013350d87c2a1880a62f1d2e5872ba55ee0ef43419cc5ee23b69afc5876d7d646e6567fd0aa301bc24afd74e92247cc02fda2f9070fb2a79306b8b8dd64d208d6daf52c532da201daf752f34358f4dc6e78612b7fadb13b13aaad73ac0b12153e41ccddfeb545632821a7b84bc551407965c3f07a1149a2b8f3e29991", + "seed": "b0cbde535243c6702acdb1442718c77c97c5fa97a404b93778c520b01c10dae4359ca3b5cbeaf44bb6f8d2ab0c4993c3485cd124d62e6f6ab5933b5456138411fb7a6666d5b9bc94bab90b5f0b69cc6bb5b568b4140f46f9a065cef9f6efdc879ac6da4d64c8886de50e33ff3c378436a89c1e2f0d4d668fd0fcb7c515085851bc8d2ec10f3330259222ddf63a0705a32568aa5bec49f0057c36ab21e78170e0c0eab25e927d37f726505b234873c56218082cc9854512044610957648e49ebfc1502c010e3409b610e70f32d7858109c1eb5bc26a4b3bdf59167fd513a24b2fe1dc2b7d5a6a71e199ec34dc2abd56a52439c3b08a7b61fe532d07f98a04dd1b3f5a22dad386cc244cd570aeee7d1ac524458bc8e513a6ee810712ea3517cc1c0212860b12747615a25d9f8074135204258bfb416afdc16d02abbdb13bdcf306df0722c7aaecf2ac323a42e0909d58e63f29dd80e176e20f5d69e1a2eee2fd2b0e439b1a6280e3d55b0cffe5563721a4d292614938f55425df72ce66d3a4c8cdb9ae41f1f62d014634fc53b3ad63d74ee17bbdb19a2417fdfa206dc971d4e6a3d41e688b4a65f6212ec7e9a2940a7045de3aa6a9257e4cf4b5079efbba70c9d4745ed7312baec9e862deadff8734a68d96b15bb5c5f85503bd924d01493498ec5309720bc3d81aca80faefff8b77b26ff6b6bda0ebcdc8efadc980748eddfe5610fc52aea227bbb3ba10321a3f6cf5d48ca6daea7bedfba29e93d68c76da98c629778bda91babcdb9e7934fd528059399fc824e44c4fc9e657431a15bc303ddfecf550f42431844934765e4bef1ba2634a4ed4de265b5a6580a4c43d3092b4b2cc1fee5e5a0ec1a6ff9b859bdd414f8b5e2dcd08426eb3077223d3ebc7b375b998ff4fe538b7fe2e30d8d9eefa86618bf6271cc638ad16260f36f83f30d95ab4b7aef92e63e0e047f03250a6c24f90ea7c791c2baac8261367d056deb048cc09eef00c4944618bef1913a04520b06b7a240f591fdbb9cac1ec313989cdd77d81e422c23a03e5ae60d378436e6b9aefc89c295c8dd85d5843c2ca43f953e061c16b8c24f19e81f55e0d54243199d362fd9bc78e108de03c8bb6ab63731be89e619bf23f291918e70813838d8d680ae8eef4b7880ba0c8905371c4ef459f525d818b8d5b3e87d4d7e31b308af13438ade4cafeeb1b9bb4a0e269a49aa00da87a716e9b57dbec989bf99d2c854bab1f038a46299875787d15063d1df7174c09d35e11fe012c000f2cef9c58777baefb90a037f25d6179d0e2367ca05bc4457dcd8ee5af14febcc9e8368b546b21311e9c161f8fe2fbe1ec8a062ae97cc420691e9d9dd0c525dd4842ba5762cc1bd48fc57dc6f8a84edf1e0cfc484ad00010ff084bbc04d448bfa46895c9fb19c44e542a6a66a44f4890d5907927f17b146213cf33", + "r": "472514b2c9335161c5d3dd5b274d2e3ed60a97de80c5aa99e11ff5da219e79a7af6c22c041d36adc12e4a88c271715a0", + "s": "8eac46dd8f75bd0e4e42f3b0ac56c6773c9edcd3d18d3f0692e9f5a811fa1bbaae6dff6333723b5e6cf1b1fe6ba33eac" + }, + { + "tcId": 105, + "message": "5ae0ffd07e7ac3311c2bb941aeb80dab891cc420aabc10810f52c74f165a0c0c820516031192e89e4f6c631e14972ef12b8c02e7ae69bd71e310626618139e7f49ced9ddaa38378b037389682df39272b8e062b4d956da5be2c13b481deb12d9d49112a709e7d28d40dc3d89c5a0321f5980522aec72105c75e3c47cc6786741", + "seed": "d58d66030b5d4e622ace67f5adcc6418220af5fff8cea2330057d8468285af70a96119d31e67a0725b884b0ffce22ac393d3840b051e4121b2650073c6fbd3f39a14ab25d7e9ce41259364efd5321231157dcbefb185f2760fc32386c46a57333b84149f29e7f1a6860c680bdc0202b19c184203af6ad72ed62f067e82befc1b3d28740c4db113a2748dc6a0225422d4d131c8c7b8ce07b00dc3e78fea5d03a87330e75729976a4648084ec578fbef066ab2ba2f55d46add8bf9b0f3d65e611f17b5ce15618d319dda445318b23868bc4dbe3638788148a7fb4196134bd33e0706012c685866a9cd383f44b09d5a63a34c87f61d72d7aaca78b9e6effdd654b578ec9f4e075f553d6c6d1e9844ec3fadef81e29a95e28174c31724baec9d6f46abc12795e8ac2ecb638dbb2c5aca5bc3a469d2bdbe05b20fe843a85648f6dd68d4afd7fa63c08fb2e2b8457a10d66ad67050345cc333bfbc4ca632410f2462423852b14ebe9e25cb1c3e82e83f1fd49c313fabc127d3826ebfcce87366da57c45ce64021a44dfcaf4e86cd1a007f64905fbaad4bf1e07d3a80c55b0789b9886725b99c55bf3a7eea03afe57ed20df214e98729448f9d4b36984650745f1dc75a15f806a3a9c877baf7c2cba76f20d64f3897f245023e65d9d16c84cac87ae56614f5ddc2e85ec0d719a223bf57d5ab280e6a29eee0363365904fa2eabebd2a34e7972180f6b4e104881b06d8e33d2d40fa8372452433320bef26dd0c194df1cf1c062777ed9ba0bd597923b8ea065cb8cb469e249d4fa00a92e4cc7a83d59daec2a12b71965fe39989981cf69aaa6d1c191e1158f6593af898651e1dec27d9f967d0a5b192b27a0d38c5c78a612d8403e099d6f6415aa869e23a0337be0669b0b5fdaa7887ed457d53bcc412ce3f19db790835bab52c4d3261399be83538c980550307cc54e409721090d364c359b6001bf7fe49563d696b88c5d2d5f61d659ba27f883eb34f0f6bdba6812c8083022fcb03c7b1fb98559ab8dc61ce77a178db81bbe1b572abe2c44e49e41e405e1d3579994dab1a17c64a047d4b98856871a7818cf0d54fde8feff89fa18696feb70a7543c33b6f5dbf649501f4eedf2198cf1e57d311451e798e6d5c8cf56b27876e5cdf9f5a7ace36be01b36a7238e6977c5d7ab4f285229bb1f824731673ff2b0e2bfaa1c9ff479f8ad2d86a2bc5cafebfdb2180cc6016822090ff02b9e592d7839727f9438f49e6dd09f04f8d03a81504ce9a28cab77efa285c1cbb8dad25d330b4c46e5400916311ba269f886f6a5f91986e99a32bb1698d6dbc5d3c921619d44caaa4b2314dabedf3a227148d390dfbc3d94bc16b16797650d6ecb396c48ab11cd2871bad200e37c4200abbf88f3a440067a78ed4e641560c059f328fa78b0a5630f21543f73ce6355164ed81164ae4", + "r": "7587d900845071eb8c08c2165f1f38a372ff5ec48b4b59c3fffb89326398f8cf711f8edf25aaa8819a581b4d6aa33188", + "s": "615436095d3a375f582574405d0d512d4783e231a4fea87286d6e604a7a6b1c08887f416036300dd5038aa8b0765ac02" + }, + { + "tcId": 106, + "message": "ceb95d8e75f495ce4636854c60f95462d519e7b521c1c316da3b2d165ea6d0489b4b50feeac4d62e4f5225f22ac758aee1568d4de6c83c1eb848524b22e5206b28af14b8a836b86367ce7d5de07b5f2d8750fb7f12f9f8b003f834a2273dfcccb0056e89f4dffeddd59f47df784017eceb79881fb2d17197390997a6148e02ae", + "seed": "36c0ef58a8b084483ad65432d2122574e7435ab9c63462e3f4315f52c5a11121215970dbc65b295081dd2214b35ef06952e7a396ac2012fa55a9a31a1239720e460e98689ee39d36dfecf7793cf6a8560f436c5e464aeccdaf4be9e078a2f4e610feff506f0e7cdf13ef1e61430b3f7499fa17c05ea2d24ac0d987fdf2308a0af2920dc9ae52512406152871572c2c4c294e7f13492fef76e94f48cd90806a98fa1cea7904e4b8a3c9f2ee6c00cfd58830765227424b8a27a1f0eabf06f8d3b7e81bf53b1915f2a5cc749ed7ab9e420b4b07b41fcddd270d31cc3725fed4a26856755ec140a553f673529d0560baaf20df4bef792c3e9c63d482dbc9ebb7a018cf332d8493aa539f9916e1c6e08b2bd0c8cccee225b495002f98840cd48df93a7bb4cbc04b738129cead619e66ff2374653ea9df0ef7c98bab0967ff94b569b794c9d4e6d8bf15d60427ec79f9d799f2c2d002d935f641aa0e093a23c0e2fa37c9d153d9c1bfcfda161a90b20cb9f9665c636eaa08b67f6dec30df26d5c975d028f08ce26d7576a61de59e7de7dccd7ab2cd5b585865e57f1039f98bd63ecb3560a26441083f998042ff139a1336fa3c051d7de1410fb2112ba0de6f814155413534ad79c67a83d3fd87f3144b97d49e214aec15532b573ea02e960dbe43bf17aed2c1a6f8da499c59b6fc92fec53939c31dca5e75d977f1c9cd5465bdb10509f5cb3b7420cb76ed94b58f39c5003b82e3dc321ddb2a9a5b3b34e973956456b4d1fad1f23041e6884de3dd2b62d5967569b07fc35f75cdf9cc94980bdc45e8c14b33efd6a53c535c184634160ca86ca37f8c9898604af406b5e4fc86beb419957c3643f1ca1cd975d02c76289949f7be0ca6258b940ac171bde729bd58b4b71f726ef2445df75bb8109b69f240b1fe24b620d563f111fcc40bbfd04b19ea76836f4a44a8bc542df588bcb410a74caddd91a22b34259eb19aa166d6858520912d835ba7180ca6c2f1155b9dc499880b63104be92b5c6e86b73ad422291cb4e44338fc246eb0aa4bd3c65eebd96ae79558c23ef31c08aee790875fb4d65b1c1c1ad8ec23f61f1838b5c9199e4db5984f15d64d1ce59ca51acbc23401b485c73473b5a87de7a0baf56ad7a150a0eb927749f395487ae422334a3eca8498891adf24f2afca65f8eb66fde6cd9743a4c366c8db2f8e3ea174655767a23d1901dc74981d84dbef127ddbb27d0205a0ec223b1e7e24a5564c4522ea5ee60fb87a5513c4a4a19325a561bde19662139b5f5a49ff2b8c73411f2dd5dfce4e9fd7cc166c3fc7fd8ce077bf0198b57ecb65ce8da40769e43c3fd9b585a114e655a2bbf64d5fe47705a74e906318e9eb97752f71d1422071a74e110b98030a446ae10e4618f58ae74d6f506527ae7a232a0a2ed09fb023fb0cd954937fc3e1796dec0b1bfde6", + "r": "7fee8e3c08a47afbbf4a39eb34bd264dd800f2f7fa072b1a67778108b59a976f56713d1d1a36503b262fa5ac2decf602", + "s": "475a2358cee102ae3fdb06d7149d47b2f806ef2781726e0b1c524dfd02fe8fe603b0eafb8f2bd37952c23effc617ff36" + }, + { + "tcId": 107, + "message": "d9514d84da6eee302d4401852643245c6bf438b753d81a937fd14043747369420f5cdd8f1a0eaa7f2e38a38aee4f2eaac8a69d1c6b1bb9b6e1679384ee1c68d1ceefd554eeed030811a4d30d8efbfb12562e60dc453832e4b1cb7d1d17bb2301453285e96284d92983e2549e006b825e85aa40111eae0354d937d9c71686eb66", + "seed": "8618bb4f260d77941d7681dfff6eb5b38bf4abc9059dc44fe014dbc11c46ce9e0c94af87201c9b4ad9267de551d9f3aa25951fc1e0cc43e491e40acd5c7ba1e2900d4f178a3af35c27827624c30ea796fa2f46577c41a7eacad2e249cd9eab798e9611f9f995a2db15ddcf3aad6c61f506742a0ad61d79cb8827efdb474c40226df9082b836fdc6eca8d1ee8abcf917391ef2cc9b36053dc82e2fa4cc90a995161faeb62a37d12a3be599c0a95ad34199e0c8d613d24a60897bdcd59a77276913e1567de7b4ecc62e451033c09de23b920153c3e77f2ddcd45bd372178aa26106577aa17774527f1828a56e4142eeaf23bba2cfbe15fe14a5d68b13a49045dfa6f7a7778442f87572fe85e421a14456b8b1c1acf3a80e94486e63ebca840d7f8c954c41a6ba332d60b459efc03c528c99b6a6a190b20a9335985deddf9f8740003ce3a632c72878c68b2a1e3088f47edc5e498c5ba2514a733d85879b4ee741ff09468e897e5f8e22e004bf1264bd46ac56390fa5c618d30a7905111ff1477be62088547b7f32ea24a17d9b184045e4cc955ccd16c4b836bbc4011a04d66d4b28cbe0fd45dfefb204dd7264f8e0403b55c521a052ffffa5ea63ffd1512dcca2bf4a3243ac8ec1f89e3f3d06e4d2e5eb0b45bd3fcb4373f3523c531d929ceb4052001c8f3345ba28714f77be432a9128d85190f9c19701bc8c43d6628ea9dc8e0f05b86eb889b3b2cdf15d98518eebfe39b161d9043226e795ff0f5bb253302eea1145e9b1b245f42d092685d930d0dfb3c5826e90c6c8a6367d4dfbd6d063b8217e18e74d08fc74eccf503ad1eab5aea30e793c27a5de310fd749a104a43c80ffa1ab8f348a020911dd993c762379a915a5e8646baaa3ae0cd4aef286d5837e340fcc1616f6427117a19569b6ac564f71b5b13fd67db0fadfd6c42e53742840a5f806d1c0ae850188ebf091118675414fc20dc7f462cbd652b421c0fbe1ac3917f229b1bfb759fa0a16fa915001e29c8e72d232f99b9624a18aee768c437a35d01cc199f092d3e4f7df03d197719c49b507cb7403fe81b017247213a38b07a167da9905a0c20be6300f82d4359953097b5dbf03a5ae73c155c70339a969b9ce0310c276bc2a502304676c0ff8866d7f30d47ce3c94fc9d9556592d2e099a67484a5b91784e10944232880f0ccd627160ba125538691e9d864f163ddfc1f730b4af202074e5472c46952e683f359ec80afe5ad2c639b7b3434dcca375f255b11a76f5f4e304aa955aeca4a7987832f9064b26afd50d2c1ae564cf2b14ee7cf4529b0affa242430f52d2d25c1a6adc5ffea42693938b4b4d6e201cac4577fcbc825a1656c60034e736c0b9b23017e8e6180e23f9736cd34bb4568476657a3c87e69590b74f86a6d3f083cbb146a3948f1d6aa61f856a31a214d25450df583f50ab", + "r": "2b986f67e38e77106fcf4a41e259d94bda598cd5963c9ca98931a2f3ef50412eb7479770576d50ce2661b2e281e5f1f4", + "s": "e4021a1c8e781f077f8eaee7bc0305dd2a8d204ebab1abd62abce4886a8ab82614d27776ee3d4cd5907317b2ea60fa01" + }, + { + "tcId": 108, + "message": "bcc4efd8f3414e66d3609e0bcb285fc2fbc4aff2c88a16eef83a5425d746ee1477afe87f059b32f43588d2cb4bd29ebd0059666de7b58ea544f574253583eea62be9dd6ae6601c623297a857305ae36c608aa9c5ec19fe541acfe021fe648bdddf03252f3efe48aa1f5387e50aa8752516728ac161cea951181c682e0b3bb6ba", + "seed": "00c6ac09fedd4ebe7c1485f3c48ea67ad997371c30c0aad71162093074b9f98719a04a138a65cbe4564a21a30b459ba590279de3fce9206744cf8be00fb712b2a28ef0b42ff6241909c2dc527460c9ec5339e95a7d0cf62686de36270672eb53ac1629f9e07be7c64670d2e188a450b246e908ce0fb87a649c269e9153034d730b1d76c1296f2c341c8c904fd6fc0ae3d3afdad5acf9b9f6cd84a2c8a413f4cac25279ff50170ff1b68fe00da6fa214623c4a018896cb7c5da4ee3942bd94a6eed17e7597b408946cf63bd31f1a759bf9d11308d6b76f0d19d0aa0ef5dbbf689d8c6821fa2fa0e58ffd22b0d2df93309c49b0a73883741593d4c8601ca2bc6526306a03fd592fc458612de890d28a61bcfcf8edb16cddbbc1b52f8a48e02d13b56655292f49099e58d57d83817822be863c418b9b5ce66c1559c5edc0b2a0a674d46192b2961ab0d76d4ad74131a89f50620874993d360b7a35307850b8281ffc6ae62619fc67048e9e42be0d09067307ba6353f6ca33eb85dfa53e867c07938e8b72b46d8776fb966728c495a5fa3ac51b5c01f984ac382b46c666848887eb75029f739309652c7ee31f755fb5e384ddc06fd8931a69c85d0632a6894db4ee4fce140aa1b5abda2b0e4f60994cf4e2a3239c8d0ad8e522d30cc86671558c800581c228d1920be256fe2d3ce2addb5567bad42775729dd3fbab230e34fd52b8d9bfb61058aad6c7484788c6bfa1d925dbd86f5253610dae4d3e23d4336d75bb798f58302a2abd2e0753f23a510553f7394af9475c59d726fce2013d2823491e03b11482d04172b7830526d06fa1a0f7f5dc31ad3cceb7d20d3c69e284316029c033cdf156df9f31c2edb11e158c3c0a148e2ec590ad5fcec9a62f8546b58596e6c5cdee0aa781f3198e8bb1a9606ca23ad61e55df1dd72411cc3327c93e03d59fd80f2311cd9b2964686689031478fe5a99ac02d06680983822b68628c977dbb0f648dcb444f1d77b13b26bf79826c3a1b12b6da79e5b47d66c968dbf578f15bd3accce6883e0363c73b8ccf49bdc2e48eda9448ede60c0379edfb78db46d7fa71e7595ab194474fe39cee4734f760642c7c612c065c02129e92aa4ec1bbb70a5b8d46f5b84b2c460d1d3fc1289d9b9cb7dd08a90f02a9dda45cf68c9dbbb47a656b4e0fac4560df77cd799c435b4631f1af30439f3c24066d2227e38e7c0ad020b8bce51484de9aa813e9e5d0ea9e728c1f2c46d20a1a79c10e824ee39c11fcd650f5878a0659a0e2ed0c715ca4d8f79d350e87228df9c979a74763de5b7c59e21beebb2c6624f6950458da910cbfebd63c9e7c9f6adaa5022fb7f8a6bc6755dccd129b3f1610938a57191e433bb4be1714909a1f1ab91d2e7b1c76b9893bae2e6b290cf8784a901d52b1ae804cac5318db078f468cb817407ddaffe6d7136e", + "r": "0d5ef7b524ea88fe7df6364181df7fc407259903e1ea34a39f00a146bc8f884d444aa1576b073529e2ffa47e86005310", + "s": "8d2dcabcc95d1f0faa47f8fb872b7b7e3cb8c5381da7363c213c44f957495f9d992e06262298573600f89a71ad1f5af6" + }, + { + "tcId": 109, + "message": "f58f85922ac46e8bd42dd878e1a13a66af941800a613fe696bca1bb748c4c4021a9dc4fada7493636f60dc36b54cae546f99ab8c2b4679b9896006bd27ddebb1648dc48ff5a9005a2144461fcd87ca728843953375288fdf2dbaa4dacfb4a7b67faabe7fbe369804cd21b5bb25a6732e3ad672cf946b5b220c83c68eaecd7cd7", + "seed": "8f290ad8ca7cf1a22f3c57071c8f59528dd4ec25524ed6f9310b71f3e6766ba11ba38202a14c4a93bd3ad7012ea6e93764853eb00e9b939949348c40d1cf4cf08ac84b1d820c88028fdaae3323538bf5f3ff58bee2c8e40efae30668663a41cf1d066377ac0786b03e8d15f9a0e26601f0f472a4f3a274fe9f4f217cb79428c5f9af153ad2965159336574b19935631e267365d1739611f0e815c5bfdce8f7b28ecadc8ea52cf6eed16f37c06c6e98e31bbb74daeb271f175febcaccc597710e5ca02f17bcfbca88bc04e22626310b3bfa9fbbd50881c457a8e36edcb6fd8e19d5a587a2c8f0cf475f18d27d0febfb79f25830a4b2e32309381af78f3303152f4cd656e86d3e730024b34e2ecb98f7d44b34d3c73e6cf8491293a68a0cee948ed4d40ba203b93e4ae2d5cf91bd786be4ba22ba373c812bc738f1458691cd01ad07a54daa63998094750cca92cab7b51d8d7929706f32029aaebe32b9369473fad9b9fba89d273d73d197465127714a45ed72f5520c3bd89b18290cfc9b54cbe1cd454380ac0a170768af0ee4256d55363bc4f73c6020de2835971f6914c1ecbde59bc53c7c6b3797c3df933ec83dff6db3d0fe6d2d8cd225109b36a9334c9db11aa1374fb0abea1eee7bdcb0e40fc861d49ee27292b8ec0dc6966f16d56bd60c1fb9cb039abd34a41ef941b467f2b5e49a6aa99bb0b5310251f896511d69168f8d3fc6417bffb443b525ce44d8a75fb5dfe5709a8e0a282498069eba7bea539abc002c26c3da41941468c6d29c7db1a916a9a5464e53863928ef812d446177cb08081561af2dc5a007c5ef5b4d76e697f792404c59b24db2d706038e167bbd4187ee4ca492a5cf63d4856e8f26cc9d3d89c1233ed9eb8caaec2ea2abbd1a5054072d3293bb2697230fc23a775118b9b15e29820cc15d38d1a4822884813f17c24c1b894852acc2c4db69c237282cedbb78da2aa430bc92da15d395bf21dbb9d57f2971612ce102edcfe1949e6b8df6ae8d912e0f0d471fadbd464450a82fdd2b73aee23eb1026db2c8dff4cbdc3c1d3d4f6743a642f6c978a20b9e1ccc25ba298b0e653b3a51f7680f04eb6e1ae548943a7a9d7f5b6a1693efdfabff42d8ab33bb75f1651d5c4414ac6fb6a06c59895eb4239a9397b841b9efb292520d6a4c6476124126d30184abf355bafa62d72a2eb50935c23b2a4771197516276c8914e4f8f3fa710d2a0f8b6b992ba83cf5ea1884ff5c2b11916b8301c28cbdb7c69e81c43d06d3c85203c9b5223acb4512a2fbc053a58cf0a0b90472e2748ad6e5f4b11d3e8e7e83063f55ff3db99386a6bb97abfc0baa61f3c40e8c16cbf8743c31022d243cd1a7ba432a9e3a8e6c77e4e92b26bd512b252ecdee85d2daf230e4d0f3f3f7b0209c8618f5373e820f267f5e53020ee1a1d9aba4ac77310d9542e8912c", + "r": "b083265e006b92597a3e65381026e8b709a11492fe02795874c1dcef50ea9477dd49e5b35591f71ef326db70d83d3bb4", + "s": "7023d4bd6944c9f9a175ab5f8495d6378e52e328dfe52825cee231e22ffef59a83285dd8ac5c2814f432c8c10ae40e23" + }, + { + "tcId": 110, + "message": "b8a14c7e0741d0101f49eda935e4a30ad9d4891149f4dc49b0e67283f940bf826af777f2549de60cb0c3c151928e8305ae77ebcb3fc1832f94a11cee4d80d3e09a7f38b9e95281c5a0c9d3cd2370eaccd4c004cd215a02a2b06045d66286d58391e4c17c5a58c5b2440c2542643490d9777e75230464c55cfc9211af04c6d2c5", + "seed": "da6a38c26207596fd5c1b731eaea145261ec1a0449f3d2219554c900a23136617044af7a8bf1855d7ca1858bfe469e3cd6e05e8c70db0f07cb2e50b3fbee47d5e1af9116ecaac75d1479425eecd1ceedf7ffab4e5699e11621d469c27b39b4cb73f346900a598e76e28bc05c71df7aea4dfe92a2bcf998e85e230e9d7e8dcf39a38ad9bbeacec85b618188a43a5126d9ece240ffdf587b4a1f27be37a1fc6552903fc3726c7b9e65cc9ba3c9bce9df63b2ab0e0e9d8574917b6acc1b98eb079c5ed8bd72b4ea72ba3ff3a2d214a05956114d4d82415c7ef563a000dec091eca1640cca3d98678357c175d908cbebd3bd0b5e0e3503a0d541d16a0b1d6fe45d224214627fdef503a30f6e9dac936459dd370114a10441352b62af47e89786632d9738f673a1a76aa6aedee90582cd200e5829caaa89ebc37a2ccfe3dbe966081e395a76d338baebf1a3e11b565110378312e0e4e47234c4b03d9c488cecca0ca4b999060d42142d815f782d17eb6cea9f1126e96107a66253493b8c40983ef80fbb06eb0e05d8ea16438e7c128c2e6877e31ecc8539b3824a01e7f522afd8bf82fe62efa6f1381f56c01b5cfaf1bd2860fd13da908d1db038bf1e3cd31a038a8ae773b25859f1e155633a037993f2804f574730d8667bb3b946b4f65d5c365408a8c5b988f85e151dab093d1c2dbf9eb8f03329b5d24aa39370b54a0193b50b018006c686e7d4bfdce19140ef5b0ee8e1e57a6f653bf016f50b3c082fbed384e4b75a2c34733ca813587878b3d47c274420b6749ac5a4574c0758983d24d53de75ecbbe54acea418b293da77acb35cc8c0fc46340ce29ed1fc96507f009d717730c978314fceb06164cbb7e4a60af7742c60b9e344922487a16fe23c2399c231aa1626e9e749ad67c0c4418352219eb795f05d34bcbb5081d6b53afca71bccfe57b16574ddedb57cc98a1baf1eb327e976afc03e703460a7a7b84d85fe8befc3789370e818ecff3504f32ca9371fc2463cc92400be171083d63e768bb4c5c80433dd24edfca62055b2bc433daa22ba428bb8812e5c4dd34a48c05d4fb5d5f68a7d6a51019f110a2c6a004d4b5b8864b4c1390c14ab7e13a6861d13777c0eb3168414c74297b4a0d5e8babe8f824dbcb3a2caf8a0eefbc2e322be1b77d32a808981cb6d3f1509f3ea84ad603a1a0e34dd35d3d6cb6af7543a9f41b11c2dfeb8ea997ae6d9dcbf783d22df3b2e07fe238c1aebf40e93a44ffb209aec26dad9efd4e89d67ca7862a11e05b106779aaea3a1b5fe3d0d8ea8e2dba7d5f7e11fc4095e84033c5aa56239a89be5575090a4be85e368956c79d81ec5169740907289f8e05dcee8ced8615c5d77ae2b0d23d03727c2d9bca9850b75066cb61fc78daa031119d4223cba1d9368fd4bcf609f10230b583c5bc0a16a379c6a3c1f189faaacae9", + "r": "9eb22ba960340b1787ab2c1d5c173defa4573bbdf89db64638595de7c097a093825063689ede5e0d4d2b8c4deac043ec", + "s": "d67ffcc64048b9a332951729b30e3f20cb034c29ade72ea83003d29c2e78f4a83583197fcf4e6d1b3d7ec77fdaafd549" + } + ] + }, + { + "tgId": 12, + "hashAlg": "SHA512", + "curve": "P-384", + "d": "c1fbaeead77a63120bbe2b50ad418a1a9cec31a932d44075789f87231f91af688c2154f8c67bb97b0a8bdc5250a0dea9", + "qx": "3c50d8149269cd3144b56b38107acf55d750f603acb3b44f9731e14f0616bf351485ee5233f85c8e2a77f1a7c95460f8", + "qy": "08fda93ae9e39420f515100e21ca81bed59d5afb09b128fc61aac4cc93ba333425cae0e77d0413b544cfb984b820b617", + "tests": [ + { + "tcId": 111, + "message": "f90cd9e86beb9f2900a0ceaff84be6d228585fccea872e2afd48f7d55ede3537a68eb43df97fb45fcc2dd183265d7a6abd7f07617a5443ad4ad3681f4b6b57d124f40c73b6a3512fb9d9202d3579fe65684241b5b05a2cb2016ae14baf6e39ed5a06fd24c2e2acfe35b7bba60745182b1e178d8459b1d82119cf5562a287e775", + "seed": "ab2436035a7577c8aacfa34d527656c9906ad53b470913b950df36892e1b45e033483eec07f61cd632a2887dd01e525429c48e0ae3c5713913085df684e7dba10800fa2b8a807aa486a7f5208089f4fa3bb464ce512c6d0bed7cab3684c8fb60736dfb54c07ff03752253d2d0c18673c6a1799765c4a8beacea9714aab6d23e82f8cacc93d8b0b5311c1218d82c2661797e322a8109302b5d4b5bcb198312c028fdb2fcb828ca1c0b3bdc8a0650006d469b8e65ca69c7e10700ba7513f29827d3df7d7c34062f96c6d8709be1bbd1170b838e274fd75008e45870e3af582dcc5e80d95c490032d1c0a45f8f14435e3f020ae1a818e922a36f21e853ccd8b2dad82fc94413858596c7a12cc572028ccffb3ca214d4da6d590f5ccc2f5c11b5abc5a729320796163b9e45e31ccf2e42bb54d5f3c4c0d60e75d3562780754437e9968173986432de7ef8432b04caaae5add88237e712fb04f5e61753870610ab05ef36c9091455c3c458ca87a3984c142dba44af125d67f971d4fdcb9eb4b6ddd719032689601007fded6aac73cf43c0a60472a7201423b649c23b2ee4cf39c39d2de12d0dc8617567bb96b92b62be37d9bf1be24b876bf58f027d96b9adb9b6303013e62651531a2b4335f7942946c0a5b76dda3a9291a699f4c8d1df1e4171c67b866c117544044f6d2047c4592ab277f58db23f91a47c5d13c26f4cfd02bf36adbe09a3df1c1a4100db0323b49b1f2bd335c9f3bf6e5a938e0a64c35f2db52184460f2972a1e62b4504a4194619d3abc33b305f5f5fac0a65d1b9114e8156619d663962ae54f06def72329795d28874005fb0b0586636dc945bcb9ba977eb07535ca991dd28f4b693aae2ef6b884239ee2eb995966002c2a67651a0b40c961d4749feded59f4ea84dfad7996ef718f2dfc3fd2bc13b21d68e8690a91901e8f20177e3d79745c9320bde05a30beeb97a77f6f991e7276847b5b6cf0e10281d1d493fe1cbbcd614e8ee1b1666e0b0132e4a5a7d1e75a4d80e3a5a512aa3b8fd9c1de7f131a0b5d74b014575e640f37960d5372c3336444de63016e9dc731693249381435ab56ed6d1a47ee26c210cfc9ed614fda21994047ffaf150cd450a891ec38f42f683013eb3874c66df3b6ff989d4b3b217f6579a722047c9a835fce177726c5d4869d71adfa074a0038c8d06c478ff20a155895d5d401a5a2e29c9d3112cb90bcc1bbfb7fdc4dd0a7c5b65545df4a765bfdde2cdefc838c461eff5164749b5f4f5f36b348c63683198ef2e55fc439015b7f37a325cb96621c0014b24ab249643ddd32a96bde4518d495744c50b9b45bb2058b9ae9838f243930b8c90171a2934ceebb8b032a550b42dbb0cc171ca55fcc24b4b277a88d39c5e9ac37da7dc57554b56d3d466b934f8a63c4e957ec51df3bb7e222270be5eddb948c93532b", + "r": "f090b5c2a39916cdaca1efeed409fdb8e0517a5a8b5a0b4d6f70a51d0134ec383a020a63049a2fdba95b0cf25027b271", + "s": "42cf55ce11669a2756c9592b888fdcbcd163df8a2e3bc59e75289557fdf7a8fe68b52a5689e7ecb31925f26d7d4f11d2" + }, + { + "tcId": 112, + "message": "b082ff63209b74ce3840fb7c884108e1ee480ed6bfa97e9b28d59cb20785d84cb07c638b4ecda4f90c442f90f5f01cbcb5f2577db5b0db130e4e31c594811267d1f16da5fdbdd346c5c4869bbc8de9599b31331aeca93d1e216049221369bd93e0ec1ede4ab7ede80c4427f3cefd735870442f5214f253efcfb85ceaa6e08aec", + "seed": "b43713f5fac07cc63cde6e9399baf242ff0bfdbeba3ebbaa2f09ca546e8aade897797206574271792ce1cc7d787f5664aaede770572e7a54e84dd6adb3ee0e5cb9a2789b6bd7e21985e5bd27f239922189d664f84d8ed9f2f59ef0a772687b771a30ba95bd08cc3c8b3513700f9b2645479329e9d5d119c49003851bde96026a230bbda6b0557fd5b1201f74d9fd9748277893c96790641c19908c47ef84af37ca68205dfd916d291bb42115a2b106919820f3197a3e2a9f4e7a0fe5a005a05cfa67caa7f3c12d037cde982b91ca8c071b27a376eed20acd4a11718d5d64694627c92d2f32b0d5a0ad0ec50a1bd3c7ce9788f1387c7cc664e6f52511d87ab3be74b28a490a8aed15f6518907a54639252860981b81394e7206ed048656c97dc28e574db301be3772a2a6b091f392576cc3be0185cf8144f9b50e7d141062bcc9cc21eb7d833c4bbe092e21658430ce58b45a05b77c52a073a2b6f82fc9687799a075fa2f2d6d2c0d63fb97e4194347fcbd61cc77d1492215f7e58711766a15771601c7aae0cdc73e2c1a520279c29a8dd9b75306f2de6d09b5136425abc1937aa696024682bf1bd5e8838483ab0670df73203dbdebaf760f963688fdee5ca6ad585b1467d445c435d1be5aa0e7b94b593d1cf298d43edb1f641f7597f6b522d89f4aea7d3654247046650652b169550509ea7f3aa71d92f943b1129a945c3729400a5133ad094421affdc3f49d66a85bcf913e971eae8d053d6cbf804a17a404ced8651f1820e077a39e49c5d37e3a290a1b5dd71d1990da26a7615d0889a2770e77ea49d110f17ad089a764bb55f91002ecc176ee31d1582f2f3cf3501e78290789e0fb8d084dde3976c4eabb9c45f3a091394137a56a9b31d9a0acbbf9fdf6db420f9cba639e3d3962b07299f7d7cce34a53cc6e6275b817aafa1d1c119cb7f89e1a50f426ec026c1d1ff5dabf1e75d2e08052a47e4804ddedaadb77a64e56815075261533c854f5d998d72c30ab2a3b283a39ae7e1edc3dd95ca0a978838723e13ad514efebe31b670d524bd28348f885af6302a66b244d3095f74af10847c8c50a759dc9a0411e2f4ebc480888fb619c156970f7649185f1c3b1ce10b3fbbeb17a1a93eb112452f78d3337348189a26d48349fefaef35736c9384d2515f37d8568cda09e63f7249cdcae14397cf77648e5be87638108dd297a7bf9f7c911bf9037859cbdb24aac3c5c6431d7e4036b21440db98512eb4673db146298cb6cb4a338590fc2d9ce7f3d3daaca4e8ecb9267676c9f9120df6fcd5dc978ace4f3557c7218382b161b6ccfb95b2b6bd5b32785dc9477d089548726a09016b5900df91e244a44925d42ab43dae98d50aac50fe5a87b709a2e8fd535e309382ad98ebb97d0db7ba9a2f07400ec2b3b09a52543a0bf5515d175e5576dbaf11c72b474", + "r": "10d57a299181d78b1ed15ff3ec6cf8fc10f2078ea2b3d2768e31fc417d0e252f03cf97357d3428e115e2c4d4c78e3673", + "s": "3d37f31242dd06b54964f7a2808cb9f94c50f112d37820610f3f1c598a3e4d9154975e33f36e87ff01f5fc554bf011cd" + }, + { + "tcId": 113, + "message": "a2979e7af5bdc70ac787451b9e224b410f4d005d3a39e107bed9fb17280371724dc3b596446718fe6c9f83cd20964e274a97a7d08f5877572ee3e10dbb33a94b5466b1ec4a96d8b71d90b5b1910feb9fe6b64ad24fc6d9feb0ff2d1d1e358e215114dd0b3634de9569f696685727575b00ff434955fb603172e721282b42aeb4", + "seed": "d16e706fef914dc1a0e65a910317829cdf634d72dbe357d1db051a01f530acb1227c33d1cb7f7d130a34b481308aad6a0661c53ef73e4c83eb78435e95d328bed1cd9b617c0e62691d0957bf6bf4add9e70171cdb16793956b56d808b095622d8918789a33962302b0f4eb7b9f2d1c5de92021968c4f858b42fea21c14b6dc43674cf67777484b4427b479247c10d5dadd9637527d8436207ac0af57cf9fd1a81314414c3677be3370ce19a4714619dfc35c749d41ba812f18fa914b17d49174753074d6256a5249e892bd72a1b43d5b7ddcff5f1d43355f4a2d178a75a871e326863d6e0fecfa0622cc5888af83134c0d21e4246577b3f665c5505ab4d3709277fde83d0ca5547ff290fe5cefb0934bac9a5eec4888a67e9e202f7af4d7035abc00c0622f9ad61df57a97d09bfc5e68e87bbbdd6a98b5a5e1a61786604155f128fddd72d7332082d692d8a98be207ffe06de1543e134630d860f025e6448675cd1d5bfe21e13475360e4d194470ee4cd5d70d84715e656f2e66aaaeac719da29ba1c89644508d9700aa33e8c81ef1345304ef17ecce05919123e15d92116d7bea053bf97da2cadeb3eefb4e0cad95857d6054b33a147d89da6d84a4c472d966f3fd06794cbc7fb10d169645881bb9d7346ebfca57e5cb3ca851a3ee47e12f97b7b78fd92eda2a7775eacb1dfe6f2a07693462fd44eabd0050fb0d3dba742d93a8b208d3eaed371abd620c0d922dc290d3518ffe952673f04af49e20b860c1329074a13aec0bc2a8b102f3cc4367e0976cbd3b5949f71da203a19ed782e297fabbbdc94af99320e85a0039b93b0344897d13d9ec06dd5c4f96877cfdf85346bf7c4e985dcb4348598758cf42efb6a3411a6de89f1822bd6f7a829829f7f11844fd70d576218cd2855a5ed7c8e013310c0954edf67b0c834c46c54a89af4fb9658244af230dfe9fe7d177973bfdd7d4cee5a17d155382336749ecbb6cdfa4b598a19d16b95c8445e3b6f81eebb73bd315a6fda718e520d196242db8c8e3bd595b417c5ea1a2c22ccae9f193c7ac07c2eb9064f56d6ea8c4a047f0df981fe7bba78f1b98eb227139b10dcd796a9b61399e6eaccb7f81329c239456655668ddc1bdd0bf2ec19919061c744caecb945b912e153d1ee3c67669fbe8fe8b7a1c206371b46b69d048aa714a051e8a9c7c1f5898cc3da735a71ca171df985a625b1a431c6ff1a083632ce1d16c70811540a4440f1caf54dda64ba2e918eb83b64117825223619072e037783d1d67f641954dddc10b570515b77d81522c50e7eb6c134ac26fd71c1fa1564041c0293284bb474ff0006e9398804fef92e9d8de9086efb586537cef6f7fda9a1c7a98a83b3d61433d5f1fd2ad89b76e5a8df13c43642dbd3d27141e63556a0d3127dddd0f743ffef605d4848cc4daf136718d0cfb1eee3b40", + "r": "d54d17aef756c4ea5bcc91ae6fc8f46bbfab9c517e1788b108de72ce5d4d12e97929028ea2abc328e87e732008a0662f", + "s": "354456389fb42c6e5e2a89ac8053964714ecc128e63f24d9ae8fb7776a297aa192c10ad467ba6e21a2d44aa5aade49d3" + }, + { + "tcId": 114, + "message": "c75146e048430f9cb94d033bc995cfc2734406c70168012352679fc12cde774b52d7464ebb79e7410cd862e82ae2ee32fbb3bfe65026620da002592f851c741c352e1db7c7cb75332b57ed6476a126ab9724dea1faad79708f0e1930ac1299fa3cd98a518e8557d954ba93ca96f21bba3306421e16b1f5bf7fac3d1fa4caeebf", + "seed": "67d81df8e3eb254bfe07883eb2f9dbafd70c4cb42127eb3ec0fc602268ce1383c28f3265be148032129c51e200e0f1d9832f960f535d8a157e69d1168de9fca60e16f8565796cd9c4322ae6bb6cce4e8aeb9668086483cbdb36a696aa944a2f73c986b09239631c4575634d5df4721c46e25dfdfa5512b089fe1d832b26ad620aa17811c0080329839a588da3763dd4f4d1ae257f4fc4998a9f20de872079d30184bbce13faa74acbf1d07ca7ea366c6169b8f8267e235ea61c6a8bfe8640d494e006136f8d2adfb46f9fc1f268aa6e6fc3338745e229fef7f4d6e2fd504692a91ca30f2084772be9428b0e77b093d194e924348311cf6fdd731cc118c699bc70d98b271f1c81175ead77304bda6a9804a8f5a371735c485db1c97a651b471ab25b4637a4481a424bf0f50828e9859f8d9bb4c9fb1b622145f9e99409de388d924e089ca3b4c52f395b0649d43d269f08ef5ac3fe784609f65917b1926d285daa3279039bed86fa4e843bb81aadae044e7281a2c33fb0be3273f6216317b72028b7d9797b4217c204e645b14972ca57d5aea2427fd1c7d573b12f7aa3a3036bf4fed68280d645c7ae37afcd884a435056aa45585ccb31a07a3461f3be97ae757044b14bc5fdb363dfc27bf28d661e38d75ea290b70b819ed8aa7ddd3701946ec1246a33caed7fa486fd5a716ced00a7d6a7c5c3b4a74b4a6952f736fbe834fd5f04b32f30b49ac627c08abbd2ad2605f94e0059ef74ba1d2b7679d84c71dbf8706211133cebde9b2188c19e1eec9b53da5a5b6540db41f3b39583406d72c7ca87e76cc6cf619ffc0bbc2f7dcccd502222f281f92633d023217072550d8c41ceec4137f1a48cc9a32b938a74bb3cdbd8f436e104abaf6c85ea5c9bddfca6c56822fa7881c78c06aa8edeb6ad75925d1be28e4bf333734825e2983dd930a573c7f59e95f5b81b2fe3807b39e7c3285f8fe05e81227d0489a1dcaebe962672b083cd24f4ad3abf8fc052c25910364819c95d60df92f63ec3f9fb5d4776e984470cbb9b493c676dec060c1040e45bff8a0a819f44d95d0dd1a8743e36402918548002f1ab32284aedb1c6ee653765e827087b9aaee7b8ddb482ea7441b3285c5aa766b2e3b0a07145d9b557a2b8c4949822a1c39f1564cb2c379de7459c674ff5ad08df64d5af79587f8d64030339c076ca1ee2c96430fa6ae55e26034671ad7f8408d3592369a6261c02505e7cb14e64c463e784cc8de51529d1c14752cba57af07c5b78dde78f9bd6fe138e8980adf0ed86ade5b07c81ae6a7361ac2440f2342c23a61971b07f7e51eea0a3cbe73176738137f32b7acb9bcbae71d9216abba6b38a4aafe80b141bce9a665c77661fc51dadd4a35ee0c956ea8b45425c7730c6c3eb604956fcd9ccc673931c6c23e4628210a0e7ed4b9010526045bcccbfc628564", + "r": "9b1e557b2ce2519dce209c3ec183e1ea9ac44757c3da06ec15871f0ff4b711c8764bf1ca2dd427d0f272b259e760dac5", + "s": "f4826d6d4d9fb7a5ff0766a358a946bbaf210ae6dab18426b4e01b22d2239714225ec25aa21c6cc7e38498d0828f3b21" + }, + { + "tcId": 115, + "message": "be3be1fc61d24c66710648edfaafb3b5e00149724ba15accfec633b7aab0340ae89513c624a60ef03e58922ded51e1c6efaffb0c747a27d10106a370c28abf0333353fdb75a264dc0ebdec73735cd3a136f54169b4673f2871896989821dae2bcb0589c0f318bc3119b074b4a2985a6a90268d70b58a09bdf533f432d47d8c83", + "seed": "90c1b1ac877e23be70823af00b6ea41191f5179116456f0ef6e683886699532f434cdbaebb6c923a6c1b35e812fd1e3b14ebaa7c5eca5cfedc3a7ee3106ed09770d8fba0b6d53a02492c18aa9a2d7574100f4f5d3c83b4cfbe690207194091cf0fe054bd5aea888b1cda731282b1633ba0f5c827b968b9b4117c34283df06e6c57ffaa4ba3b8c42fd24cad2ba78be30e7335f15d146fc79ff192f896ddb8869732806f3d4922fb31966c4c22f2a701e2ddb93968b93a495e6654888f8be8dc540e7dd8036a29b31b748d0a75a57f43b1fb27a9edfde2747641b5d13228457af351c2ee69e3a6db650fea377cf9c0dae9e910c35c972bad37ff0c79956ded3f324a60e6b1e856a3a9944b56cf4524070be6562b470b4214d72579b52263713407e060337ce80912a5eb53003a5bb26fed9ab02f42f4357af8393721584303068e687a8d834b464e34588dde16aa53bd232fc86e1a0d50b424acd4035f7ac4e6e658933f6be39d0c5cfc1e11b320e5207cc3600e818ca54f7c7cbc815a6a3e2d2c3f3c7e65922e4a2056609ad56b1a59451f23c6d0cf872ac5bda1a6c7cbfe750fd8300732a3e4fde8c7b8183ac1feabcf1a6e9cb03d7870fae8f079d42fef467721c806df0be8f9f3f0a4bda44046d362de3472ad53068627e1f5104db668aab27a5c734609fd139cbd647ed0786c34b77b656eca7c699527bff08c3d19400f3b7a32265256423f35b2a6f6e96ececa23e6b03bc221142f45f8101cdc5098343dc6ca1ac8f82fe4928cff9ae1194e922b0427bebaca3a36028d87edfd8e41c316f671340b05631eabdaa37cd544d9e3ca13b7f2d0605f1e3cf231e2b5d2b1aa1f5c8c00a4f84ac5312ac5982b453aa1b3fe2f7886047bd9418a6e0e7838ac2e749227c40a5504cad500e1fa5d20718a300a55b3b5ea50d5a889506e2afbca6dea74eec0eb7f37a297bcc9be2f45414c258b60301f5a6b634dbc77d50d1ca2b164b6a4a8cf1c4681fd6c695bf887ce225d13a321b8e170b8e115cbe09e8789517d5b180861a7f594c4369fe9124e879750664fece8b9b28512637a25515bf3b104cc15ad5565094446b128f9bf70c662b022079a328c966479ca923e4df61266dd198e2f6ea2ee6112a6fc9f6336ba8c47648762d837b25e8085e90b5e5f1e6578590c4b55b8e830cae2e1373d94e24f94043a5a6e999f0abcf172e3d26f4b65dd00b452810033226dd8bcc75d729a576e3fb734785374a61f01738afe123875015f2910f9e4eea7b0a174f5b15731e141762e7cea507853dc62e6641055e763090d7ec59261aafbbaeb8de87a445f6695c7d3e6c86eb4378250d7c06a1282660424fbd7e9b47e9bae1f8adccfd55871cc406416f5f0dedcf193e4f123a5bbc724ca8aa6308e60542b1df1174509f5c465b6dd88824854b81b272df24643fc4e12", + "r": "f77fb174daf22c4a3a3bc15edd89e54a8bfcb43a21e4cc283b94f539bf67566dd137801db7203c360fffc409778f662a", + "s": "0b788de8a705d9b55846d9b7f193d713f8a88d6989de2fa018f116f83e4a48e908e88c71826709a56380c81cc041d0b1" + }, + { + "tcId": 116, + "message": "947dc949c6600165eae60836607d35ebf6fa46a668c259bd67b03416d40f464a06a20f600f54dc719ab8890934d1eb89dcc1fffc985281a3ddd99ea3d29b1e74f03c074c0712adf5f7def9ea663696055307b2f28337870eee1672bc4ad35093a2ef40cad63e918eb382331f616fba5095e876222fc0633007de8a98a060782a", + "seed": "99661fb42b63fbcef79a284b10e34e60866b632e50a02a81a58bacfd4cc04ac4d9c7130c38cfc6bfd25fb605c0cdc8749dbb6fd9a9ecac7e0166434e1da1c802254458d6b75fbfd26a9663167240dddec2ec73a8e129e15ea997e1e11ea37a21d7d9b1447e50993ef99c2013140bce2a7916fbdb59bdefde16bedf62cc8b6d9485a9380a97e0b5df8163ac253bb8fa22608ae0410fa7df3cc01c97cbfd65144780b679f9eefa8cdfc8204ae3cc63c7d76c43b7c9217b1b3393405b2042330966f29f7fb565b3f03a53f5c97400769579cfda8d58c3d681b01279495742dbf9f8aa533d658fccbff0ab65be769d61a09120da4bc247c123b66d07780cf24a55004dad96e920108b1ce0af2bb33fd33d4c38576ce219c60f7deffbf18196aaceff0ab1f38c33e5b994d36191cd4e7a5c9c9eaa345c451a7ef12de912c72df445f9668aaedbcc4a192044f534a1d0e1bac7f8ef2ee5749576734f7e628cac841fb9061e00083d281f38f05e2add9c3a79109410b6108c66af8d858f085ad0b199e6142a27fac42fb531708fdd7439b089335edf696d08c9830b7574d6682573ec9b91ea7e8b2923fe52a02e3805da2e8143ca26018d75f2fb6b211844ddab3f8bc733e5f5e84404282668596325a4cc87e639b1d2e061bb322228d2bb69a755f323b27fff8fccd176672077451f0d11441588000537548508fafed9fc1830c68718f14b95e351c0b6a5de65915e099da304e5756859e1d7a59687bea954fefca7913ffe9821a1097ad9a189e5dd63901c6e27ef53ad7e80a245b6d0d8e28d67a3612468d60c4538e8ef64ff02f76541e41b1d73356a5c804cc6407e941e191d74bf4813e202857bbe479382ea1fc9d2e52e7ad57d404acb486a149ba8fbaeac088cceb2a13e1f61f6cc43e8f0d5bf60ebcd3f047c09869c502bcebb136261316c3c05047b1c5d49a0395ebd33e296d66b803f6f139768718268de7dcd97b2cbfd43e423fc1ea2230fd3e763379ca9a06e5e2a0640e9454305aedfa7d74a6140176c2ea4b9673142c4aba0fa21b1b63c2576575f3d3adfb6480f5cac5171cba7b09d77056b9158681c26e0cf6bb9c0aac9cf9b2286374640c3c82c9cf21bf430cd62d879b0faf46bd695509d9392d2ec32d03f9b5be3919b98878a577bbec82709268cf32efd9b27a50c522501b54c71a7f4ce23acb2c57645f2ca330c28e019ae96263bb04a2b275687aa4ff05764d38644b79bfae105b0207b63d10b76d114b3932e9048ab19f2dc899daf5ddfb22925c2aafea258a032dbfc33f506857bc59019291d67b7da7b209e3711fa8cc66ac7900f90290816503c38b5c71afdf3a72b6c0189d7c0d1625200e4bf5fa0877b7fb363cc6d94093ea992c1d235f53d54ede2b3fdc1eccc06a0a2abf1f9ec1b7af041c4d93e8bff4fd7a61f99a69a7d3f8169", + "r": "6c89151c3ca99a005f6912a43ef5c47fd4d310aea03befa597086adb778f5cef7111b1295ac5ebc0bb2f4fe891c94f6e", + "s": "7f0d42b506b27cc6db92815d9d1e96e443d6f3405eeb46d05c37dd1ad028bea4195e2f5144a45c46a4b4f455ae451588" + }, + { + "tcId": 117, + "message": "db9617e820d58252d3edac6e3a81a4a26eecc3cdab68ba65b2d1276f376d42960d0d39f558852569bc1eeb4924b1180501f314903f6c87158c706d453f3f70be36d1205287a595827d0239337d46d6201666aea82b79672e5fc19bed07a26cf551698ffad22e6cb09b4009a79ae7d6275e75e8ab35c128c6ccf281f35630c386", + "seed": "0d0ee009bb3a7675a712bef4a79f1e1eab1897c0f174e2f829f5593a42b070f39d5ec0b2344f3ab2a9dc71bed7317b4f7647754bf76473d584a03081f79534009b9d5afe106b53027a22e6cbd78df97b649b729a28edb6a6c43f979cae35e68afd36f9a500d4b498c477a958dd209f69fa261af98d62b6afe66c1aa696756094717efddbc484c3f5b43c38f8e8f92e1a47e7dbb8d591ed0c147ef92953764f9df84bb2b94c156e1dbed4714ea45e56e258c73e9c37104822272766f914c8cff92f8ff490d150c26a39a6f34e5155b5abb64c1cfdb0ed9272b6ebdf164b4f324c10921056bd0fdf37014fa61cbb7cdc67438b4cb060db80313374322d108bf0b7e581edc59baeb5ba6812b540202011b1f6621715110d317a61937c3120b763b72a15dad0f8da7334d34e000d7e2d3da93959c9a22aa3fb55467b40d5dfe9b336811b7f3ac5288a5885bf67d3b0a0ebc69f118951a6da8a7c29d12c469ce497097fe716ff0a251ffe50c1556f06c5caf2d2ee33775d4e0800176614c99a7b9c56955a6320651c098086f3a774d31e2ec5b8c398d4579afe2546e048892bce53a893c7afcf58fa13a0e1faf28fbc0b867b252b22d152f1530aff92754b2859e0101c1d320ee725f00da40ff11f67b5820fef9afdb9d6eba2d7d932b88a25fdc9804636e10bcf82ed4bc308eefacb315e6e89a3f044db9c25fb039f732d1e2d2dab21bddc019ce3b43b0b1261dba116ca86bf96459f106da70532a89854cd0564937fda3830491e32566e6ef473b80346e584e4ffb6d097a123e65d66df4c69e2d74ac7d69bd16bc2d9a27da3f2e2db4a95c42fb57971d2bd12d4d05865a47eb6ebd6f0bb423ef6b2dcda801f61732e0f34f30e3f13f795008094948dfc4fad934b6afe7c7df77d82b3a7e7488d60ccd1d7c9e91e37a0d0b194d83421680378d6ba4cd4911518f4a1dbe4995bcb9f7f57ddc857ec1c3aae4c76ea0298e7ba1128c8fd98cf695ffe0c069676562824ca1753ab80b82f3a8b367bf7c058d0db198d40e19ae719a77a39b5e15fa4aed400be0f54524ff8d33ba2eda285bcb061f79fa74fc607899d4d3309b62daf4fdd30d349be1096703098c14e572ddd78c05bec470a4bb2dbc83cbffe69dcd5f84d432a3f58d3e6c07f2e441b382be5ad7490a51de1fa1816fa082c08358a6bdfb76a5e7b209bc2b3cec15150c60064bd258d509a20cd3be027e77514c24b1caa2c46e83ab8b8fbac32074d61f104496825b9bcafc60675a9431e4b75884ee2521946dbecee31f656200907ed9fd1c695fef69aebe4072baa977209d88e7443bccb903c9555b9b750dfc08d4d684185914fc748536779afddee8831581d2cc6c98a4547f8508f1115e497c63d4940ff8cce6a0504e540ff6a7beee435b6dd3956ee6d262e1915751fdbacbf4ec8543f1acabb6d67", + "r": "82533bff4380be87b34387750a258250b3f34152e0df5490b368fa3bc809005971b8201ad37cd848d45b94274e9bb2b9", + "s": "93865e08d5644044e85f6532fefd81ba99847b9f9048b1133a9ef5b2dc7cd8d18b09697e0200fb0fd355bf52967467b7" + }, + { + "tcId": 118, + "message": "2c23b6562f201ab5c2a1ccc7c1eca4674eba8f801cc20b6ade252717e2b1b0043f4595958e09f46afc0940f051feef9969af7eb1ff7e76c2b94560248b16be03911dc5b1860d17cc6b8eff9284c4af3e49b32ea1b4422205f61ba2a5d660f9fb9bc5b4013d394c975133f321836dde5ceb368485125ac8461f02ead2a568005f", + "seed": "cb0bb0a4e5cc077d04a98617e81d672217e51efb5e3a0f8770882f77a9212208d08b70da1279f4b47b02512a9577eb3fd3a0147b390b8a5621d496c7aac820e76fd9d2edd812068b07dd91d5a61aa27211e2a89e071cd7efcad0e831ee3ca83ddd5e7a257bb777ecbec3fbef77c7b0aad1d0d447aa4ad5078bdb11dcdb31483ae241dc0fbe8f8efda0f20b2ed78d2ab3c23a0b8f3c0eace8f93c1f69f6902ad2121dbbc0d458c64f196bdfa2c81f1785f326d93ca385ef7860385e11ad57025e0e6e2e639fd26d16319f2de7310a72319b5987428758fbf4bcf442993d167a3c99b874276f23cd4ddba794ed6bfa621309848346a87d42eb07e91b7d22de877cc4d16a5484328cc03d51453d086312e735a384d032198885105a947d16d0fd0e6f83ffdc48679df4f2f1b776342a675671c9d81d857b6799208d80429d82947bf7c41ea51ba41a38b5411bda37bfd627a1abd8b07f61ee636e37df1730b402b3cb0d6fdb763b28daf6e9f3531be3b1d874a58da41889708d89ece80fc2f699aecb8c2059e071ade66d2a37d83959955b2c9e8023c64bc1eca48ee0e751e6c3539acf0120c782908a0b8fdd6279185159f5b04999f261c522ca92d902222d6511504f47111256b3728ed68bf8af0daed28ecd4b803e4f333e88cfcb684fe8fd18582452635a92406cde743d121b2f854e5bb933772a9341013d4ef950d17ad3c7c1a577ac85ffce8e4908554174380cb67fda9c55836c19e928c830b7765c9451d14bdadc26c14ab65dc937810acf1322d1e43f26e6bef7731d76cdbf353dc9abe4e1bd8c4295e51306c3fca90a8ed2041d01356d4a6db4f62e16f88871aea8fbc8fcbad2f1cbf784ab8c7acd6ba314686aa48cf92ea47a60fd9fe41df6cb9ea5487424718fd1b0d0452d4ef9dfe8684b361a4e114074749ac0bc43d0656d788624b7856a483d937e334bfc38dae70e95f7424175deae9bd1dcf0accb18cb3ffc03982cd68a8e928471a3e952d3fcf3f75b4dd5fe720d393b1891137a133cab74026ef46446ed378c33a0b2722d4eaba708182841068dc6aa4c7cdc480a3a240a404239244e9c51c5a9e648f978b83ff3cbb6a6764b191641cb069f6ea73c81345054c0d2d623c3b7b0fb977e258626484a8df958b3acdc410e048610c71c8a758e1d2b71bf17329ef26fdec7423cbeb4fde662fc68f1bed612b3a8d171d5474b1fb7447b18cabc7d4af2dcebd877213037ddb291338b1a8d7ec252bedfb49730324b9c81d601665f4aec5847eee0724c327a7f170551e7f742ac8ababd9b051c8ccc3967eb984bd132bb8521e9d60990fe0c7d6e5cc75e191ad0155ca7238fa5aae5ddeabaca8c0ca9b7139fc8a065eafd5e53a19253e1bb80556111faafccf20177355ff659691b70bf1502c5388e14881fbcb948d7729d643bf2dbb5157475", + "r": "04591ee87ad899c77e7ea3c2c95617ee3f6d7dbee1d756c9b23d733749922a7f5270ae3b849e4b940515ccc8df5fa7b2", + "s": "3471fe7ba15c47246bcbc38e59e10b67cf1109bde35e94e734d927a555bf67533cef2a33bdbce2f19adb89e92290ec8a" + }, + { + "tcId": 119, + "message": "9e3ef31966cd5a9b87eee59d2a5681704fb267ea8f66d7d07864662ed18bdcca1045d58f4537f98bdd8f977952e8cb65c34c6dcaaee7bd74cd38516058372a1e673786f5bc45bcbc7c16d24ddaa509cac4bf66fcaa4302963b91d401f376a1afdc711f5bb290252948170db17ef905a23a45d7fae7079086933986e16f05d38a", + "seed": "a24c3c63e24ff194536614bebead7f9d7ddb504c011b118f6c32a38d74841775246b860495d4cb6223cac95989cedc242df6ca33025bb6ded66caceb3455726eb706a3f7ac577c51d2639b2581fb958a6355f150babdb4697f9793ea48270a5112c894607ca57cbc9d71e1f79e47a7f42d7e54fc4bdbec37fe1d9feb04bfca19ef038e0b1c25351b08d0ad84a221c4fb4dc8d0172237ede92419de7515a478838166b318702784171711011cdf3d9da13173acec1c203803483cfe38daefe6aa6d7e9b799ef45382dd4a349e0775f9d93b65253331919661cb656c814ac942d65935c049829081e77ecb77637f3e8ee97a07a3d234bef44ac61a500514a872b35c5fb417f791543ee38a7cbe9595e4bfb3424e8f8ea6ed0e268279feb76f9fbfa74bf393f95644b0aa91cbafbce89dafb99bbe40305a356be2009dd56d353e821d98aded0a4772000e6e64e0b581edb9c3a3e07f6cb81d50cbc0f533792cdbd95948b5ddd045df61a8edb34f2d59721a03b02646d03d7eae4d90c095f708f3dd7f098738ea1a1f270d728e3fa5bc1e55b238b4e53958dbf34cf62bf4bb73736b787cbc44666322064bda2222198b138b26476e675d324caff18b55fe12de6e957e25bd75613f41b5e068bf550fbb4d892c2c48ee2081c40472f122a4548468757c798471fe9cf03619a6b720e56aaae7e65197a8194bc76cb4fbf7dc6e511342f4a4d9e0a86be8704acce07e0fb6ec4ccc77f6a95f6a0c46c9884ca1d1a345a1fcfaaeed0eba879aedbbdb820c76d8e5a753f9e5d017bf0752ff166c1593ae12f45e088b294e32f1760569f623e31c7d190e8aa0ce32b5065bb5635e521fc086770f3b8b70f76887114a644c5b7cc56fa5ec58676b8ba0d5d91abdb3099365d5ad90fcba16918e5b2d9be646bac70704037a1fc970ffd13f8c9006f518b9efda5e13d7f759052d8c65953e062520e23055a5fa19f556d6ac7c13b7139fd67a06af47acbc0d34de45281817531c811e3a3d86d3a9e551c532637cca3bfa1b6f5c89ec43d6da9bee3cb57e26de1d977d02383068d117abf83ae584dc92936dfb86da65375571f832f1d2c6940baf6c40b4152368ca8487b7c59117bfc265771ffa64297a2b6152b1fe953f38ced7a4df47bbb88a42d095aa7bacba29e9d3bee5b11b5f87333aa7741aab2da1a202f8de8f107a976b4d670b4344a9a44a8c60e254b03aa7f4eea5ed87eb7813bb3966b678be7d6e625340aeb05618e3415dae22249b690d2c112d6749b6cb223d6e6f37af1103cbb936e6725df78880e759f599bf338b1fed06861dd4ab4308addd1059ae6b89137fb9b6a414fdcf967cec04fc0d85f4208bfb3a650d4af7453cb22de996f95a192be51bd7e124b48802ca926f48464bc5a5069ce7496d02f8f52da6b48987a3cb2227cd9ef71a5c3095e98da6e0", + "r": "c7a42521b6bd8bc1f058be1da07c1396bcda390773cac740b52f1aa3f6c9e63b111025ebfca298fab78e6e731e00269d", + "s": "b409e8ec2b32320b2ab26d5f3ce70a4b48c1d4a6db47e475459c3e94190a2b6e68712e42cbad1e7ce7109320a05026f4" + }, + { + "tcId": 120, + "message": "181c0efc4c5b9f658af455d91d42b714fb81ac1eebf2422a469867e774849b2f1644c238fa202b966b57db32ab21e0313401b2605aac9bda54091d78f20abc652600fafe74eb16ade207ca86cd9733631059f231eac22f1043362310ce0e9d35dea8cade84f18a26329d228abcde107819eb868f409b0ef1df7feffe11484a05", + "seed": "1aeb2c92fd25e940c32c9f2880b3bedb5ec6422f095babcad6883bd985a736e22bddccab7eb2638b4a95f3476e224340e53057bd0ae4bdbb6dce66a1d1f02f76b2a9c2b2663e3f2b8754ce1f01fd85a8646f5a23121573bfca73e1644a4a4df93c46cc1ad253fab9ff935a95f30df2ae63efd50f7f8579551cd4f9ada850d648e588248538155c935862d8b7e7a5be7697a71b2fabca22e98e790b3d26b0e6716c6e1d3b8aef0d24ea394d51bade08cb2705fcb95c750947cd74691d137f009b59fcbbb6c26c911ca392b0487c1ebdf55f9ee25f720d893a56dd62d702548c21987208fcaa6f3b51881405962a11cb1f80ba9961b3798eb4cd194a5efca62ddd997258432f0a7eb3efa05da283edab0fd3997bc4361f2273c302a3c8522367ab42181440aab6026022c167b1407b39e2b50e39f6063a0a3bca6cda1fe31b7b9a0512d66dcdda0c2322b8515027851bdddc5d1ee9f496329cebfce2a9c9e4c4a38e9183c6fd179c04804bf99bfc2f710992a166dc40062a4a04c2d8b19cf015f144226fe39ecbbf25764eb0f26ef2d5e3341b25fa84a295960b6306a6f545165c65d4d538df36e63eb278d8f4af037fba76c07c3a294204f13ae4a2f12bf16364b64b8c79c3405709a423a5abe07a3dca0a293444ab99ad8bfa86d7af2e2242f8cff999d30a56914d44e4cfa031eac30f71481688514517350a3088e2e00d81777c4f529122117cdf605d4b5c0692c958feed930cdb48389099f8536d1e39966d0689ac876bd0e384a48543e51eee68641cddf210ce1ef5daa32bbaa186b460a9c443e432dcd5731d5370deba4230b8d97ff59e291d2f10c008cdeb5bf24547cdff6828e34f7f1665363f56a751f9a8bf46216d88d4bb6be48eb999861b716c00fea82004d4666c53a9badf49884b184d97be20a34cea0dc0da50eb27d33000a399c785b3374437fd07b7f790558d497d7f4ef22d2ec34e7b75342b698a39f3bed9ec776532f032e3f02566643e5c6e150b6e5159dee56a817e3a023adf0004a371a272af997efb11f5aaaac3df367911afaa5433b03f0acdceb847c1642e843ad51648ff45bd6da12c7f1ed665181bbf5c86112e693d2a3e1eb7cc5a0a580e69f22db5eba7925d157b9912835fd65f735d84573f0f2ffd1685b77223d3d15383cbbdb1d5470f5156a9758f4b673a3750d2fbf876edcdc4ad9c18f01b29bc6bd4b259f83039dfa59f3a18275d1262bdee57a9495e04f6b575c33a81c12cc6f3fcb1a00cc5f201b0784771983cb7fb3bceab43f0df692fdc5749c22ec1084004ef7d0d33f9300ae058f1ecc1ef84c7952f193cdb1b7e4a2171c4fa974e0c7a7c69486a91a5227f799d00f629e78c2bb0e0b965b7c24f747460457bc4eb496ca5309b21ba9d40090892330b0d3da42926e0c5d6783966e58deecc71a6281fe7d977", + "r": "c6c7d187b4e49e2c95b7462d2151ca0f75d52aee2de22e5166735399b3dad37b75296c32ba75214d5db555afb3a4e685", + "s": "a38bc9cc9bbc7be0b857bdb122c4f564294055bfa16f96cb09385890a40fea08e3eb079fc113a86e7eddb3ee8d644a17" + } + ] + }, + { + "tgId": 13, + "hashAlg": "SHA224", + "curve": "P-521", + "d": "8c0aaed4d3d7052b0bb69d28aec8c1ec35e50899724c84df1b27a0069aa383c5bebafe976e675e1de0c11704b98f938ecc2268667e9242e3200a954b79c80ad92b", + "qx": "0184de0de555644acb8fd8a68057c8e47963213d118a61453558d96d63a90ac19f7ae075aa497043cd88e65755013be815d3bd5e022fafa3d7903c9f4fd0ee51c438", + "qy": "0178f4a37bf13a1ef118d2c4f67883621a4d48ed8979cb7c97c6389ded29713bb15e03174a0f99a9600b6f76386d5a7c8356682c786ad4cf9588a97860b919fc10a2", + "tests": [ + { + "tcId": 121, + "message": "424098cd640fe99f0025aa7cd53d67d14e43d597b5fc2eb5069bd49cdf0861c243d1f641c4ad59e9a50c5b4a1eb0d84bb3f72c91d8563139815d7bbdf98eab5c70c92dae891bc97bd5adede635b0128259cd2b8b65d18c707f805c8e282e9792f391fa31323119de83916264c6b1b9deeba4ec90219eee6afb5fdfa3fa4c0c37", + "seed": "65de3e9d3b2ac8fca5e91d28cd3f4b7b68afeeae1488f83ab86b509a344003a27ce9c90df14d4db81fc0bf77d22eb27d77a3dcddcf4c3138e54cb92de92c68ff55bfe6345aa94850eaebd28aeb3ca2f425a04fbb09a53390be95475d1e29ca4f843191f9f56fba39a576f1cd8f222977e906c3bf8130cd55b5fe8c1ca545e36ea68bd19cc98fbd6cc74772cd3f958920993fb5c8d7b57fdcfdc82676ad40afaede77d9e997c22823f68040bb774855b2d8ad63a36b7d3bf85a323662fcb25ca9b6cab23ca8ea71fb0be5881d785bb5454fef0c807b42e3e63e6c42c0b61f3df7a5d302b0ea8f5fb4f1ac764e9545c34b311b9d2ccbb0b011adcdce47993b36aaca873595f481ffb29974d394f3b5fc68e6029b6cf51ca02274415d7ff119fde41e21ce3a86bc9631f47ca7438a83e2b6e081b1f3456e4eb84b292fa6eb7721dfae6413cfdd2a54cb3676b6846b46198399adcf8564fffbc03c81249c831aeec20bc73f9d2e91b9c62ebcd808f667cbf7a8c9a8b96b5cd2bb2f94cb40a90881884efa06c221c3deefcafa01d3957d5ca2f533afe366b11cae80a76fa5dcabaeab724567648494618b071a77d5f1cfaeed50bdc889407ec3dc09751a7ffafa31434942eed7dedd73a3ba7f6c039643f380147e1f9865e91b79cb95351c696551123e5a1a67e39b6f2c79ba2af9f4e6b3ad092536f496157c9bc577f65ca13e1954deb12636dc8b9115e0bb56eddb9149da015cc692aef0efaa2282c253da1e3e644790b89ecf197dac85f5fb7c10ea6bc9e0487f8c1e908c74584235ef8e8e64836057767761ce0f1db496b1bfb39adcbed13ac5fd88c6184f50abba20b4264996681ba70b44e8d3104c0ae69bd88dbdab298e3a3f36ec061fea2a779813699fde2308fb6571af1dfb1b87e6b7cde7caa3470f8248572e8fdc028b898eec337f8bc0174c331775676815024d688c0e115c86e903e8d38365ce202aa7e8b106353f4a51b713b8467f7b7311c99425e3d8bc5d16875ed53f71a0fb545a8fb3dfbc09edb2417e46b265e0e003a1acb1112821c73c3ff59ec88cd0b869918a363e421c96ec68896047d0aab007a46deacc6fd27c908c8dea337b343ee294da8a03926b852db410a22b3e6c195fe603a732748bd4299eb127c92510f8af3eedbdfcec3c5c6ea4f10371bba2831b0bf99e0667c4c0a0461a93e738a93a02ccc1a671ab01a7dc594542bacd130197a456a94b1e502ea8ccf32884f227940c77cccf998e7b55d635b04ad6f9998cc186501b91dad387527c5f494cc2d545f9574c885adfd352f2f213913a3783f43fbda734680d6b159424222950abff5c1bb2a150176551ebfbce1411746a61f5c51cf49111bd35de94706d97d78760227e54ff597258bd8ce648ce6fd789f5c00bf6452567232f4f4346518708b3eeed4e7dfc00ea4c7d", + "r": "63ef62a6730095fc4d0d19772cf588e0fab833caa0bf1030838fccfef0d3f8b27c5d3e384900c5a11f9cdaa5d1705f4871cda6023c19e2a4fd0b5aac9f1b8b9f32", + "s": "018238dee4583bb70e520e5274288cf0e407a9b74a187b3f25a3b6d25de0344bedbc11c3db3f6a945b6608dfd138230e180c1246f8237ef1b593f3b41fd8c03b72c1" + }, + { + "tcId": 122, + "message": "e4f585e4e0286eddc0e4c22e09d358f0e1a3bdd98f82b6e68be3edbbe131453a49ae5b23579686ee8073a25754a1da08538a6eb3eb7c953f19dc7a6616ee51623c16d0e4dcac7b5057a85524c1cfc3064a04aa33938250199237d0d2e6dd97d698642717a8240dfdbd02363b952877eaaf6143adc4e9c6642d7809e9aa38528d", + "seed": "4f467e1eab55d851d6587d72abda069f358b31d8cb446e01f40506fbade4736b8fe636f072cae2b58e626be447ca3f1b459f3c487e9cc3328a47026a16669326a8694c6c3f3692f021be6bf60f2f2b6b29c31d98e07760603c6b9298c3ece1ce8fddd34365f1abcea6b4d859bb111f530b9ad991f1df303271c2f8387f329c0ae6406ddfa3c94473cdad8bc6c4011cf0f5d62dd0c23c46e42a3e18a5dcaa142c000316d33ff37e74293104b89fc01c41ef985f0cfa2b6f74bfc992bb303ce2624ed93aeaad9d370f31a65a24c2d4fa2a848459503fbd7c0ab62d8f34bfaa82cba345c4e0e262a09431f1e5c3194897f7eebc2b092248e31ee672450cf74d266d9a5360ba5bda0cc3ee77126b0cb4798efe747c595681f88e5433f6c47cbb143a63937e2c2cc7ddf3d0d0e3663d371d7b6ade689fb1ecf9e4b5efa795e2eea9d6c47a2589c84b052c1c7f3f187972b3f84b90dc1093e69cf93666d46ac85ecdb3a1d53893f920b83093d7d812d6b869d093d48b9482cb824a8f81cf6f21312bfc401d87cd7dad699d4c7e748c2d5a87df4899f141c98f8ddaabd654a2a7277af0a7d1f8c2c607522d28dc3cc402a6b7c52288472963feea653ece36197715e33de7d62af34408f4d0cef353e7c4d38806ee5e0f0f1b57a040434eb4a30ccccc2a936446a299854068b3f959dee7864ffded8361d9a36ccf5181e68df2a65b6d40cfb084f6f501038848da810f1a4d3dd58ba2c8e0423c7ab457c3368a410afee080f4968170c9c8d6afe2f70f39f00517ad455976f87b1b6ce13c8733d3464c6e2c44d493176624765bfbedffdb4e7cd173c2d07eb89a644318c1fcf3f41df824113e6b14df1ac51893f28035bfe8c25c96ba559692f7c37960d90185ad32a300f467d420b1f5521bf64d5bc94823ba57ef99ff1d1985ec087b4911e21fc8a2b6b5924ed85fbc8ae6d5a9571d23e24227286dc21c00d4964ce624b9aff4d329ef2d9881434f618bdd238c1c93d5ad9eceeedb7626a5267874ad70beaff91d5929fd374a0b509a97b5e842cdff6e4b879241e5b264e12ad518591b1325ed18557f22118f97ce451253196b739155ab3c46142ec9496ba13f7a0731768fccc384ec2f2496ec50de0e240f9b1df6fedb96f090d7fe548a4e69e341f17c106f9c9ab6b4ee27dc620a4af293fcb743fbf2eadf49ebc0c003c996ddb02914aeab438e6f6c59096f39906bb64d47e4e5cf71388cb8892308497ffa5dc36b710133930446c8c0436ce0e14cd2938a600694511d3c9e57bbef3baf1288409963d5a894ab11bc854896e8bddf28096cbfbcf39f0a306bf8a03dd7f476799731f7063212c1dd04cf08fb0e67b87984289369f5463a901809992c95cb4e65947ef60dafd0ec4981c60637c059ac23bc606844e04fd2ae0cdcc868244853a11cecb162c75d3e76", + "r": "43c206b5d1b9d7b770391113f9d85968a56cfcd85d0291dc762190e1f84ed22233d65077a58a6d9bedb51878cba3d953f57dc77ad0c0d0a2036b25747be30e36d9", + "s": "01c4915101a55bdb09989c33f9b28ded8f9cb13346e10113ddff1cfe671c652fe0a0b78c432e7c6217de1ba7f1de0d9127d02e51cd4fae96efd2bb7f47aa135d9440" + }, + { + "tcId": 123, + "message": "e0da2b3fd2dea4dcbd853d79fa0b2d489ae5ed5d6c73d7de456ad780957490940a8acabf9e523c28c8c5def399b4f0f09185a896a30ea5aa99c9910e076da19c79d72eebfcbecd427c906b111d71a8d778dfee3710096b3875c67d6c95b8b934d7fc64428c69cf7fbcb8a00f461a70173627c7c0a17998de1aba55cc3d8afb1d", + "seed": "064aecd8c7908e3ce38b94ba7a7e038183c8b91c1aada442ff4c3c85a5c7cb1604766dc7f1c88b867561d02e567e8daf8a5805e14f453ecc54512ca02907e0af353a64fac537f4a980041a0d2d3358f6a3154be657dfd49913407a1046133cab78b896a73c5ed139542ad949d0b30aaad137481dd673d326f1f334ff495846464e1f462f429d4ea8e3cbfd73f286e08d162531c1ebe5d50b636b99a0e90a365b1a5bb8cc8919ee84012aaf1336f0b9279d8c12852671096e780bd32483ab6af0a66dc1832b464fc5c5395b0bb311de20bd69d8b10b900fe71839dd12ffcd0fe28e029462e080408d25a87555257b14da5a955c5ac79bceb70502ff74c892e2f0b3d9affb702daa501f4d8d6261ea7ef01f304ec5cd9199856c007a347d83d5aeea9fb75428955f513bcae6edd79b7cfe11e2d3f416fd36f504d0df21c9d01dcc718ba29c1be756e6284766d45d91af34a7c800c4a6907f49ab9d40eb4c7ac7ab0b5e31938da85c0152ff8af0d33024c29b777756c2858de5bf595b814da0619c7ef1fe533fc01f699c69d98a2ca1293a0caea5207760c5aac4af24301cd188ca82d63b15f8cd7e2a82fa254595b2f714cfc8f191edf29161a11564dc90080b97af5ebc4a045eb9ae9834e5cb007137fb29bf34f73200e7c52ad35c6e7ad983424fe8577d89ba8146e1c8be507ac5b5f8ef23e256f5f6d28854162fb6d57282727f198e4f9988fb2cecb6666d9ebeaa9639befc065f285c94f9ac4b81d6850a0f6b22dbd1f692cb568ef57f6c7c6b09ba52cf1f0d4d3bce8de4e11925fe4e45229798513fb660f75ad0c5c80f7988bf8412ee14b0e1cc5b77cf123592b809dfcc4fe9d6f6b0a17aeed49a21c533bb874d0ed67063445297517a1cef08f8d3e1a12e2ec7fb7b3aac8fe88b38dcc00411fef5760614065944158ab305a83a8d5659f9926cc3aa872ad18deb09a15d8f0232978078b1f15446ef6a0a86695e3eba0df4b8dd3def3f5f89f47724a449260ce28a2984315a7aa6450620a7c4e75b85faf35b7e818b80308286f0268e6cb910cd0136ae40eff6c427e1b57394eaf2cd613dd22dee7e1d99c7af23ae515d0899f866871bf384555982a6efd7aba9b1d1c0c6f9c01008854bfd634856e9657044ca4b2e9aa9ab15bffc1ed6480145996caa963d303119cdf4a3ff771da93a60247346df044da05d261ed97e8eb1dd3f212e18a3353cbc54f8dbda014586b0bc6754aac85276a06382814e832f022a002be7597b54f6f1918f5060759ae24b5002dc023951b03cb2e87126bb29dfba8b5ae94160eccadb36a642999313ddd09c0b9e800eccf6e5edad04485a13a231d7193ecf590e235592bf9593663f120f9cf84f0009938d0e456ee93a5a4506abf9394b45fd081529cce4e7b63f3db73ec2cf4a9b48142f352e644dd30922e1374d4830", + "r": "01b3b830b06a9701fcdbd9a2f8c2808b6116387ce6aa8472988ac2ff35c7795c67c594984bec6871912932de8f4881cd838790784be5eb27defac75dbc8241191a97", + "s": "01388eccb350fbac4b41cd7e0879382c23c119415c47bbcb97537126d661ad37c8f61bfc5407004e705817ce4af1b4df89f1f33516d4e1d6c1d9061c11dbec21eb95" + }, + { + "tcId": 124, + "message": "d9fb677a703b824053250b5a45d0e10b3119f5e8ac669a90fe970b4553eafaeb5a73e870d6899edcab9fdc38b9648dff5b2007f1ad5e8fc26b3d030e182ddf2f5dc5bed3d03c2b380ba2473c2906ce01a62473321a57b11947b8ac01c1a97ff2db053e88653424ce5321495f77d67b183fc5b79720bb359c4d2307f40b7e5954", + "seed": "bbb61fc1c9247891aa27c2d47658ea8c9d25b6d6a0fc77c907249a68b754d98b2ff8ac7bca2a8c1ebd2179d61ccb86bc3348d4c6e570bd24955f76e3a501cf9f0c5b6b7cd5f3e01892ae0ab9d2872f75db0a67ad510447b1fd838fef7b3f10aa047fac2ab8235968d622166933283e34d2a7bfc02f3509ffb757f86ab6b08728d57d906da5ba14a05382a79ffbb78dd8e7b02fdb39c4b9dafc1c80cab8c07fee799492e552301b5e5014ea8ef8aa95f7d7cf6f3fb5263b0b8f2a7e297ccbe31d237c823bdb1ed8b7380cfcf34005469970e080c976f5e91a256119669e7fe2284d0fe4f02231ab6c72b52582fd86a25c04d89fa4d156e6b9aa85ba5c87b7f6b31330359f177c83f2e6ebd9ada16bfa3e559cc93db300913a9e61cb3e2eb0cd2517583585a1b73110a2337878e081bc6d5666c15b0748bc0e19ec1e58509160296b7c58ed7ddbd02e320c019cc00578a5d1b415c50f1c2ea668302b7addfd4ca9800737073b7d36a5fc39e7cbf876def0f6ca96767b89d200e0af3cfde571303802862268bcda4ea7ff93f53799c31efdea77aae08027de9bc44adced6f70235771266f6906e9bb67f0893666db01c65a72b07f6eaad7d19dc78b392aa35119e0514b6d2f5fc06c45e91bbd818ad3c32885494d9b34b659d4815e895d03f35aca54a68be5ba7d5f66bac61ee3a25b37d4615d7b0976878954173d1aadacd2446382356657ae68fc7ed06e0db1ddff3d14c05b67e36209a5685771757b995fc2157802d0e8c206d2a8950fe54ce944a2d1be4517b3677d41fe0a33df8e9c970e8130433827a45fe4e580f7db6311a034982134c1145282aef541858a6f5d914470f3496840b0b4ff5b978fc3d54074a7d250f19f8b31daa78492a646ca608a16e2db0656ffbd18106dc17e20deb36bb8cd26db12967c01355287d3c5f1b107ad0484ce0da38524e7de7a6a8efa493658d38c4512662b4c582cd18d15a8a2b5e6affbed7374f0d31fd6ee4dc315218d9f82cde8ea4a0917512b563966826cf79f20208e4242821b3c5616198da4df29a9f366be71cc716d50dc63e0adab4314bb15ceca8e2f317fa76c852031d7347ff75ca9890b40157d1988add49aace5cc191bd86c72cfa637c6f94f459e1898b9fcab60d05cf35713e0fdb4e608d4ed9128c9561ad15ed47221b8ef0df919bff6eff6a1adc5533c1a7edb12b6da39a871170df2a2c143b4bd42f6c5072ec3d68b5b38c3e002bcf02cbc31aa83d0ca2110a0eb6eac7940e512ce9c49f6f5a6501a834d595ff96bb78be47938a97f2dc9bb849066c046746a68627026919d5855de6d0506f8d9ae5bc80d9bbc8fb4dbbbd76bb167f5e3ab93890dc6599c366b9ebbb12e5da04154062d0e1c7a24027055ecc662f321fa844dfb57256bab220ad299b600494f266ffd87a52c542ccb4004580623", + "r": "7a71b950ff82eafb4acbf9c67074a0c100b8aedbb9f485cbfb35fb6ffd3331b5278262ba9685ebadd196668e60900dc7134c15d8e911808b8037c76918c331b191", + "s": "013b9709b266105538f3ce9bf2c3b1b117f142b1a832dfe7e809b0836a0c84e9dd27afa372bfaa25616981f85694baed7d36e8715e353a74abd7943f23578d18113a" + }, + { + "tcId": 125, + "message": "7cd70ad70d259cd1dd2b5cd1451c153990b7a86a8de43093f8425f7aa7ae0d20e9d7d5967c589e9c316c71686b4db541067f091c84228b526e862facc1cd3e4f94c71ffa5e1cb99ad32c8c19379e1a27ef2148e5fea1e808d234b335f272c8bd85a8078575a4634f6507bd6c2a5e8621bc211f8a8bc4f89b4d949ec16b1fa191", + "seed": "d99cb833186371cd77a47e5043ec8a4679ff5e3bd34ca9965825774fa3dca531f6b826fb56180d88df450962e7940e823c205487c6e556a0ab656d2a10a14ad06066deecee4123fcc79e5696f86092d1bae3fb18cc7b34ab9ea5547ea0492316a1f896303b76261c8ce8c19ab14f334ca7e9a3af8b24b2caccb16899642230e258d973f48bde91c99281577c03ae6f941e5b00a8410a4354f118aa3c61332284a9b8f7c3dda005a5093903f9e7b7c913c7f0a6fef86cfb47f4bdca721e79617469934ce7bd01d6c6aac9952fee0d1c0484a06ea2b220dcc8fa0746566e58aceff7684195f09f6069ecd784a7192c3e968bacc13f0706d61940702e522d62f402215e840f17c8a1803ed9414a84c9d46412f225485614d9b955e7d51bce102b373187a530858120cc5d559c248169ef01655a23d2e10f74f8527f0c58ac65e1f2b3ca098661a79c94f0e2bda9fea54aa23515cf42d983843a8d89c483b08de08a8be9254404f64ec3157f3811be07b16f3d165d544e137b19583c3b7269b29688f7e1362a18816e299cf81d46caddc8083b048f23a3118559beb672f94c6d27c8bdd00fa4acaf8440cdb3e5032d7ba14c433c4b86c2604c3e6e373ea9c4c57fc3b7eeea22b24db7498581a2c2ba8381b8af17f53aeab358468267ac242b0ff1973e8caef34935a6ab5ded0cc8088a8c2ce999036001692fcafe840e9a62ff126841e8e71b0d056348887e91654810bcfc7eaf5abd1d690fb066b2aca9992b9e9cef5a7eef6268462a6393315f0898e4432b982761fda25d842fa6f8244be533c6c2b963a049d63ea68597d19e483e4c51a5fd6d6b767797a7bb4e8736515494b41b30099de74c3036a550a4df56b0843a3036e6fa7b93f47f09472cd993028c79a9f4dd6a8134d94e96c52fdb14335e791718f0d47ac4718da41388b9a86a735f05d885a561b06c85668ca3e1f2c4fa2923729fb194513d695bbf88e456f58aba87b88d8d4f3b42117a6be9f28926e5901563e0ca1a2172f51a22829c03771d73dc7b67fc033ded51e6511248209e4f93c570e3601e9029b09f11db305dab5fda9d6dca3b985cff1c1e8f69ec701910261ad3489604739f95440145113b95701661647e3885773404f50569c5b1465212165654c7251001111e28b4b9d7404c60437a37930d47922fb130aed9a270a4650dde271c99f923846702b1f66fbbd784015e1e0af233580837dbe6c2d2c094b08a4db84459d32ae31356e05a93d9c2362bc61eb730f8c4edb790a1fb465a5fa3776bd6bbaec73b7f34785c4c1572b93d68698b8df971c915ca947324a5eeac4913e85c2ce7527bd9908342ef03832623f65cdf7e550befab49c3fdb52a89a2717f5856262c6820c8004868edc458977f8db5752a959d47013da785f43d62db9ac9649bf0496680c83eae9815b53f6cde", + "r": "0119bea6aa7ebc8fc995f15009d6980820c5870f071187b02ef2bc66a9e48dc5a8351cc554606afcb35478f730a8b76fc714f2f3c2cefb33fe76c4bec7bea81cb9b0", + "s": "01fdabf63b7a1cb294fc69ffc81b74845a2f57a03416399dfea1810defe16da006d1c3294deaa67eb90d54aed138284be2951d2c87dee9c26e223fbc9de6f2075354" + }, + { + "tcId": 126, + "message": "8781bc18f583d38ae545d338c95a0246e2c140b190476bd2eded6e0941bedaccf2e53377d0e0fb2e6676b71f1a0aeb18112d8306b564b5baf98df9f1b139019c65ee42b573137366c8f51546026460e6de1f43425a3fba359aa68b4447c3237bbdb9847af0ca38546fde457099506084d140b5d4b5be55e968337fab68e3450d", + "seed": "b0367d2b3e30f2504533ac90616fe68ece4b6c61bcfc0a3c64037e9feb1be988f203e4a767f94ea84dd1fd5e80715b66e289bb153398fcafd43a06973d5f346f54b94c6d7f037b2cf6d8b90c8d2fc68f80983cfa2f0ddbd6a9553168b79cbe00d84c39c63392bab122a901e63ce39263f477dd0b1cb244a59b178c029fd14f159878bb93f62747a83d2f020f18fcb9e5ac4b149362835785f9ca8a4daa8b83ede1447e868c14d5f0cc6acd46be804e4f7bdbb55eed5382cd9baf8e1e85de7cab8bbcdd834ea182a968bb8f2d33bc16824a6365c7d8c6cc48ee23fa68bb5f244d2bf0247a68b597f1c9ef264b53ce96d7900a664201fb6833356398021602233857d1b60f4f7fcd8e1e399fdc8162ca4094678e9b16c2d2774c08a9a5f4f503087476003c6c121b9c1f56cd2f8c9d18eb41514919d6fbd464c2d4e0bab551f3ccfc8c5d151f2922012958bb0a9b2a1ad1890d700feb83d1c73a13448aaaf3726af38d07b53103a918769727bcb4201210ca446f8812baf1455fdf5ee00c4fa758ea688d7de05af3d999d75090b52b0413c50c20bb7a223c785cd859b4e2aed5b559bfa7400751b83e5ebdb40f2f1352a335d6a065fc8c26e37a798974a9cdc1e44f273e2c8e754e31424da0715f16543801a977cd034eb6b7cd8e70b737a8015104629aef2d7ee2cb5a0c595e18124ee349acab9fe3bfb90a1ee89db9f5f746e8891fce8a9538230a42bc02aadf75b6153027a393fae185a40e4e8a424435fb54ef84d7a03afd31856efcbbdbc0cb0eb523bd0ddf221ce6b0f72bda5c09b94500bf77e5315a1c1be2abf231088182766037fea0bf6da80c038134e9703d5ab09819b2e54f40b8eedef374300f1a5f6e0cc35e340d05311df6c77b19c59efe57ee572856e5b8be40fb75bd08ff45059d24582d97bccb865777e8ed439e71226b7d7735beb6e831b91012ace1bb7fe2b8a8935de6788a922f2ad44a5a52d65b83f96f0d7627f5512f4563dc3f95489dc8ef1afc5fb487bde9210e6e472f0cee53bd26cba5e566a754e5cd6efa5ec2d70c8b44edd7f98a65b3835be8707ed2fa9e51968dfcb7f0369d5396b034661bf516b3ee1a9ac255fec3f284829481ebbecc46e6f92e268685a9768cf533b9050f2f3e7d6e3c88c0948b24556b4a6ac42d3856cf006eb0eccd31103d91e292f2da7d6b3d2d496fc60bc1f91740567f1637e2a8440f529b6d96ba7503b983ee174ddc68ed3fd177db2f4a25fd3a02e8d221bb54992236cd9535c1f970815c10ad7ad60939bde36cb8ba9137795bcc2f49213af500c9200c0315a8c529dcc1db8c2e33602e898981a8e9f19e5127b13cd8ea783450b749fbb2158af024f112e7638497a032a542983458ac19bdb3ce98eb79a73eb8d82d436c815ed70c7369c76f3ed591df118e15eb4bbd2eaadfdf0f2f41cd3a", + "r": "01efc0df5a644c2ba109c347c129da07a1723ecd32e58e6734f5985ed8241f1a568ef7caca689acf4e1fa04179f9ad3508042053fd231db6ece7d4966279d32ebfb6", + "s": "0da771cdfbdfe82409422167c1e3b827dac22e36712f7ec927fb17b0ffc4c2cbec6239132708ce461cfe8306ca661cc82ae0a61efc3975831c5ef2f1a3fd72ccf3" + }, + { + "tcId": 127, + "message": "491e691dfd418e3c051191ec0c712e234a26fe3a86e913d783c8011c4126364bd0cf4b7d58fa6a1d78883f4743b7289d53f8247b10615a949bc217675e06c44559d4a3350e821b6ea20e9ce17eaf999a306023056b8f1f74055aff74690c2c1469bdf6dc5158fe77fe900b30d65fef9a3780738a1b2e0350b0f58e0df91affad", + "seed": "46f21535231d592d0b80959efe2558404580b41bda0fb979eda022632a81da5bd136c8b96c7c4fc7183b0d336f8314d0acb68ae31bec0bdf2dd8cbf6f634d37e9935f24a216775aeb0963dcee0a23d681e56cf53ab70739dfe4b8d587a052a7827a8287b64c82644913c6ea25d37ad9b74d8cc88f0915e17a05c8d523bc04a9e992c9ff5f1ca202411caa41a2523bf5d33554fae663bb833bce0ea9d56a6d2503f4a9f6ab28384e0982b61d568a7779c279a007a852bbeced9d5196db7e213d1e4ac3a2bee8765b3dcb773081a5b4d79627a4a27a4a727466542accb0fde5579d9c2f2b36f0a824650a85d76a657ba825b123dccec121b1c82d18f2768d93c96b3e2e75fd2d22df6d5cd4877cfa5259652c0a95ec431eb5e2996d2e24424e7745e10f819f968b93515fe803efbadac06d2e4d7b4ee652f9aa7e5e924085e1ed4268535916f5729fde16166991b3e1b359740e799289242549e1857b970a8125a81a2ff2ce1839fdba5934074a28f75c4d3b74ae9b1c291dd756e67195af88d7dd394b1ed756159efff1a4ced6b640102f72434c80225a7aabb8d65efecb03fa661792372c6a5e257e71891bdc2151ee43a737ae02c5af7c9dde55ce141e4ca16a3627e64f2329eb4860cd59dd98f93255ffe19af496b4432e98b3a3601848760703176e4ce63c735e324bb63361136152be81784fba80ceeac9ee78f516b05446a27c995fb7a7515d9910214deac5d91cf12bfe5acca21d9e5c0bcd3a8a522d8cc500c31c2b5ad11a19ff53e89fed03ff93e2579ca82a3d703583da8de9d7c9d4d6bfbee90f75eba13785ffb345a73992e8fc47d40212fd63c70ba9d01cb228ed9d3c2d6d7c8ba8dd586c8e835e88c7cf5b9e2f7739825dfb634a46045c924ab8763d5f502855fa111adde11b24cfacdf11696084a4b154f8d15bebcce864f00f4c70b073758c9732ef219d6679f2c526060ff6ee095e421a301373ab08d2cd42ed46a8975961edae84faf95f4962bf1e0e23068dcc3d6dfa499bb83662cadca00f2258a3b32a7e03a90374efe35a73e56e16b2aaacff53729dfc9eb39d554ec4ec2795aab41844d9617bacb7b86a1ace2cc92b633038098dba1626c90fd79aa733e230ec5a59464f440a62f10aed147473184fa4bd2f14c9e02a574c59cf8086a06a76d763d17a81aeee54a7bb103d92578873415d0075080161537777079a25db37a189fb534a6a8eefe666bc541eefadc1b710ab52a2c240582ec9261cf2c073e9486e1e91c5e781046c5bf6ecc33c1d023ab897dd352b3616e7ae1a2d9859b594d888e6a185d03241c6f8b0cb5bc24586a6896af391a9c157300a44694519069d28de28d3a346e4e64219e61e4a6b27f8f408295e6fe53e9d98d248a6c3392d27e853df7ba5c641670637c4a808abe2e94b3a64ada0c90897d0b4eb407fe", + "r": "e27facb11254a87343549082d2c694060b968ba4992e2bef95039fa9a168b6e486f3840d9330f2a27350b839cd12fd89cf25487f98161e954f2786debde89e1c1f", + "s": "991afe9b80ad7fd8ee112a5773f6c6bc682ad8efd1425d8a481cc4aae5ee2618376df9e697195487a2ea99643bc2b712bc3869b2ae371b2a698edea4ade80bf729" + }, + { + "tcId": 128, + "message": "5daa9d0e5c95725a46a91aa86b9f681a93364eb6d59cd81ed43b9d0109d4d80ebff6fe7365561b5e94b4c4aa8bfcf5915cdb5510efd5ee5c1d026477f4060e0a53a6a56031c5f6e9473e8bc3f8f62139b3920818de2cb564562f385b3f629c2078bca1ac35a82364f4343ca43a458c565ea4da912786c7f453da08542aea1d83", + "seed": "b13ae7b96aaa381d5ccdb4ede29200276f6919e2a8ae066773bf88fb7c0f07cca9f6a527d35c0c9e318adcb113e70a327e1b2b8b1f28485abd151c4267bc56012196ed3411b60494bd3a18c7d42cc4e5255d1aa30261f9ddc497908ae8b9b5883a1bef350f224f42e326404f47a718ca4285d4a4ba4817b2cd1c9154bb5e92f2f19de9c0d352d88e066d50cdbdbfc747100224a004f2f6afc19b9ac29ca7afab55a7841238a9c01c7308bb743801f1c7def1d98e3321d7fa715be4d552868f496de4017f8aff90481febbf482c44a0b505c3a31c0d68c2d9804ba040ed97c175c3e78bcd58a23c6f26a7ef7f1664c20bdff349b1cce6828dcb806bbaee88af1683b438a87f2eb1096355d9de7305d5096c7e5f0398d5c4001d0b87cf37e5516f4d5bef8963404d5cdde3f8e565cf01878bef28579a579227c1e59af84a4e8e9d0850bada54d6eaeed7ed0685c147f8d71329cff5c90d6eacf411db460608466aa72544876457b0f278e683724cd7da3d73b0bcbd9e8ea2ad6d24e632d91e841ab7940b31dad8572b25de1dde6454ad6fa2a7a0e78558ff13b54a63b9fd83e55380fa14c39819e9e56ec7169f527174770ff9a854255dbc0022883fcdc1a61a3f5325452290cb457a2645eb89aae42d0288babef78506a4d0fc46f8cc06c868ed33e6821a31762eaa86561cd241ce065e15a527c95cebf915bb4d33e2bb126a119be6d4cddbfe57fbefda7a2d8ead793fb9f1202dfcf4bfc7b4c559913fcf1578f67e130d0b22b3254532ea1366067edcab29322e931c321f8f9137c6e0e52ca7844e7c0d92c9a9115ebeda762adf7b8320d22d32a143edc161f53f12b5b439873916b257ae85d1828806759516f883f8514c0b24b14a8a9f74dca9bf88e20b9b8f8595a749c3507c20296d83a30878ea68617a2a5382cbe56e4d165623ee9b8d1381ea642dc293d9e6b219f39b1dc42b778fa01c43fe6581d5bb99ff7147b2f2c15377e8a14b298df8ba3a486a960b12a5d75e445bfb0da225ea455a8462ab6163490e36f289077d2e8df4d7afcea9b8a8bfbcf4679974769ac400b02b33e532f1362e59883882fb44fcbe716e3bf98f68c3c5f0d89b628de53708201f55dcb4b2d221c72afcd8a1db90cf1bbcc3012b5b524fec96cb5a358e0081ae9717f877abe2564ce17fce7ff2415327333fdf3d1e89e29b2981e919567350eabbdaf93060f6713d90e691c0ff904799b28f7cc6d9a31c9564dc971726e3c5ebdd07aab2d20afa23871919ec2c06f3721a84f79d7f4837aa0be4cae85abd15da83cc0b2a922c69adaf8e214da90aa1d556d4198ec28cd29d9d2d7b2fbdcbc996bba57d84457543f64cad190b17000a703de87566d9bdeeff03c338129361980a151b291ee84f41d5f02364de6858228821549dbf63a93b9f1a027ba7280151c14e0e9c68", + "r": "6af3526d48e8aa5a33c1ccff3ae13e200b2440fe42aeef79f103e38990d067f20efcc9e3d3e015518196d0761460cec8b0784cdefcc0197fd9492e0c2316a048d6", + "s": "673a842ab1bfe62354e116ebdda62d7e56c6b8978e886922b1f0d0fca8f6f8c5733c8737c95a8961258a0dcb215bb61049996380ac6661b625613b65f8679872dd" + }, + { + "tcId": 129, + "message": "ae35f7d63d854109648ca0f992386fc6fe7e539a2e71db95347ecf07efbfe970844cb1d3f175e6bba8d129be0806a75ac583fd5698c36c6009e84c2441eadb8e4ba9ff3a933449fcd5eb5e9ad1e57e80a310f1ca4e3419838744083a72bca7066cfba487864a6bb64e4c8bb246f3a41223bee0e8f04889ef308585feeb984860", + "seed": "2807bb102e913c3d424e6eb2f10ced34482d12ca5a04f3391ba1168384508d37b8d7e240e11b6f6009156024125bea4fe6ebaab9bfb3e57ebd9485c0470ca5b430e5736a779ee6bc1cfb15496c452940c352e352c3da2aa14d25959e4281aafec4273a0a39ff8b114f1443a82c88e519baf11fb75dfb7f25307a3ad3b8a0d477dea568a087f2d3665042efd23eb4c68ac473f5ef5eb9ab1caa83bfd9f24f309778c71311c94042e6befaad94fae1f6d696e2b496bd694797194b0587e40fec9cc8cc23fdac66d21ed99aec40142918b0efb61b351649f20529211bbf65283a9613b7ff75d87e5fe6187de51f64381da8bafca34d08ca35bb3527bfaf8a0c97a131ae304ea115e6f65898bc0b194a1412fdf79a8f5d3df39921f5de959ec902a0a9265c8c8288138b08d16a0b808cc51fbba384cec647a3c22dbfe871a6f43895142c395169a8e6702767383c38cc95b1c9c18b439e8eddf1459c3b56bebed478e6cc059bb83af8b7d2b141b7311de695b285d9b59c925c63b5b19fa3fdb6b1c145dc067d42411641ce754a638a270ef00d54ac3a85fb7de6a0cdb0834c5b724f6b8b7cdbfc2ebe5a62c14cbcf5df632d33087b9f07903a668fed3ba2ce15d9cc77b665f60276048839650d4797740a2bcc71aad427d4ab688eb338e17d75ed16c12111596b22e98f284892e808b5535d3a083a0a9c62bd3c228a9e6803a1350558149815aa9f8a79a086ec098ccceabacbfb29bd778b27b692795cb6b478e7470f219c522562da4ad3242dc391f03c6a3e8e45b3fe7b7aecf67e9b8652eaf7ca774bc7f126e54665db27d60f5001cb8c91676a5cf1bc0d7ed3f43cbfc1b24e2e327f83c730a7ecd1628f909753913042c22ae5b9bfd285fdad55695f273592cd391e5d88b13ec102605d4b52fa185fe5f0d5dc72ea4ec676a4766d01c33f1cba6c761fc6b5c52a62ba80df44250a9e5ce53453c15003e0372116db7141718d8341764b1640403da110ed133d93518f1885d1f510ecbae2eeeb86d7ab20ca5c6087f44c5c261d774abae43dd7a9a08e80b1b167a351dde0643370e43627ffc018cb4cca846e5d3468185f084c96b47e9bdbecb28650e9a2f93ad93209895a1e5b43bfd55004df829143856a1a766d072f618993df16ff26595724346c9f927be8cd4a6c9138d2c02d7a177d645d68517fc7b6c6e6a2312db15ace01416ab40f83977103bb7a202cbe5fef2ca37b1b1eb0e9b172d5c07bb01e484fd7cb02f122ceddd23bebfcc09c926a5b8f550907c90729cadb742c949a30602fa4da95e5862ea9f1f1fd83edd18336b6d704d586fe5d5e436061b1a026e1597d4946c713322aa51cc363c49627da2358e2975b474b2a2d372441f747ca866036d7c3eebf3496bb9eb6c1c23e029b8d53ad4c484b14e5de3246af65793b5836a8c8d1afaf5786", + "r": "018484cd87fe295b5b150ca090c8200f5e4cd171c6ee8b6f8c2cc825b2c9b9a75d57947208d4dfa6a6e95ac4ce5baf7645f57b979c751e6e1d8c37cc0975bf42dc7c", + "s": "3e92fc8c51f64316a26c15d084ee2a3651c358df99bce639e7c38eaa85155d1fb16f28439595e961e68b77dc9ea509822c5691a7a674b21dc509e56df5c20fb067" + }, + { + "tcId": 130, + "message": "f5a3b596d18618c4d6823c68e86bd8757fb26a796a09553dbb35f89f27e918fa50b96ec02ffd34302639f8129e3fc97147942c150456c96463e49405b63efdce94daa7b2dd200aacc86fcf336db9224f3bafdd25b7acd5f76c4be03aa9fc9ff56d65cbc08e042025bae4c2da4e35af441e3e0156336b34609b36b7fe45c4908a", + "seed": "3c9df6ae20487c053372ab000125f76c2dfcfd862841c4749106683c01416dc518379ed1943b6f93b7ab0d86fcc51a4c15918453317efedd909bfad84d378a8cbba08d641feeaa16592654a068dfa71f887c57adc5d0ca10491126c36985f35a725fa1501039d30e04c3ae35b19960379cc3b642cd7b23ff418ff25c6b708c6daa747c91b85d1abfe95e0b05e565ca2e95de5e7296b44b786f13a1f33d8bcdc9bc2ba846fc61da1c6ca4126350900bdcffc3056fa47aad8a42aad741256ebf2d3b3a2809d37b44ace2a6abe4308aa839852727188e1913bfd271f3314707bbf6b2da40862a212ae4308099e5cb8ab145dbdf1c414067df5bc35af9c9dae11d4cd29d7789ce4c296bf354482c880a12dd6f71b50a449d54e1fec0b2fb7fee61593d37d22cc3570308d4d0bd8242982b1dc3f358cfa5a284de58c2abc66e5e33221470987c28b3c7e83662bf389251d6b5acd21fb0ed9c7e47903cc6d0fc89b8b5285a013baf38ec1493c07ddf32bccc001e2b037a65a02d82319d8abbe6e3a225ecff8b67ce0c58ac99447ba0aa1433a16bc5eec2ace983a97c4edf5ad47ab472ceba3ecd99b1a4ed7c04efcc00a0a2d9838bca1083b9e2ad1caacee14db7a045f4b8d629d98cf373fd068322847bd9a0161eeb25dd003fc6d3bf7f59227afd1fe635ff0494ea29de7a3c5f5152eed339821a9635759d75d6aab133c47d81d67ab6ca6de0dc24547cae432407a543c6e79c60dd543b52a942a46269bff8f9b220f6c1e8a3394ba0658b6dad4890a3867c460bcc97aefc64cccc4ea2cf80dab9203349c68b8ccccf9a61a8014438dae2ee23b8e7c498dc1732b2df8fa94b3e5d904db6f4bb73ebbc0ab013b008d3aca7b4cd6b6f4fb245f2089888912fda0a0fff7d2f56ca7d8d0c9587204f978f92aacf76e8758e8c5141a5f5dfeb6dfafbb689c6ca25b13502d0eba857a238d0a934834ad10877108c5156d8de3e2e40d00182380539c0cb4d6832622e9261b93e1140871e179056a9ba050a79bc52207035109b5bb2b13a09fb3a0470c083633aeff0ab3f1f09c10589a64cf00c348fee5e90e9a5d59a452fdcef53002f3a7d43a83765875b00cc5cecb9f688f83a1f04e4113ae023f6982c73335bac03e7049fa377039c8431a199fdc8a2c62b155f73ac4544f0513df8b286a2b296c18dc55718cc42c5d1607e87016ca65b4b4ba4d7f13c03e6e54adebcf80ea0f73e5edaecaf91f8982859e3c243f298576955955de7622d7abb6e4058c0a231d7ae91c4a2289b6e5bc95f1fcdbc2df8fe5e7c683cdc78754ef2986d4d00eada47eca9ea520e956ab0b37bc20981d001801e92a7c375f449ddee5e1c22d2087802655228488b8beb6b801bb200f90515f3c8bf39a076761172697aed9e6fe064a8425e7326be1006c49f5dc9a8183921eb55ed482bb54f", + "r": "2fdded80055069bf0627659d5d153bbd7ba7c9908cfdaac04a67db43141bd46de94d439e6a0606cd9558d54959fafbffad3662084076a79eac7f9253ec3f85e4b1", + "s": "015588c052685852a6311a48b276517fec67fefdb4a34baaac771f037f6c0f35d0efe66052c755de090f140573fad109d32003affa9af9852650fbb92bd43ba4db58" + } + ] + }, + { + "tgId": 14, + "hashAlg": "SHA256", + "curve": "P-521", + "d": "01dc678f9a3ca4b018460d459e2dc5721aaf05fbd01fa4026ed87e008d5c53d9f2b8a498ce997bb3362164aa762b8bee2e9fddb9e07f80b3bcfcc73c3dd0bcd1c856", + "qx": "017d4f54e7493e8df56f7937e44fc694c123189af0e836a8820376a7d2175b221ed130913f06d6c13f8e4922413d5f4edc36f97f1d1b579d3a6e36bd0117dea9c4fd", + "qy": "0179dd16b5957395b3086cdaaf9349df954974b49c8db6174c761f23e159f90fe830941c38a5c0a46fe1e76887fa0eb46cebca547792d016d676b49193677f13b062", + "tests": [ + { + "tcId": 131, + "message": "505bed9f60edff64c0561de0c69ffbdbc3aec08b1c9f560743465c184a0168cc8daf8d5c19fb8bb997d91c398531d38f25dfb1632acc41deb7069aeca7973ddc90a2129a2e20bb7512ea575d7d0d0ede3203b088ddf86e9f4abc7cd4719da3ef379a47930f0692d5688f5c996c8b9a33db0c894a877476d83622a0c1f623056e", + "seed": "2c454bd7f0eafaab0d17f5376c99c057ec6617b0e00f303af54f29a0b5cc8a106dcc4ad544a6d4a9d5c526b6198036c2560d4b604f608db444deaa0a59d28ca2ad0aaf7993d60feb3a75dadd746039925fedc636fea03677b0b441c2d98f7ff9bb8bd61f4bfe08266c3b869e8423223e9b0b5acb4842824d191846f6e2b348668094c541514d529c046953b780e77a6a2ecb74bdb029350c31596b116c7d5c472fa5de4437d072cebafcbd99d5c8fe746b63f85898bdc9b05bcb545c7c5231ded2e57a44c1e0086fcfbd8a6c46191d3c80c7035fed9192d7eca585e329257616da7287f34bc5ca6df9ae96dc3c269e360a06f0c6d941bf129fbf657308212523be58ac1e678ad4fcfe4c9de1d9b5340f9c7cdb02ac7f9e80e29bb86cea4071b071452609e854aea71e02946603d49309e2ec8627b24a331f70ee3fe3efdd6a96c119087f2da04acabf87570645d77b2240930769d1600d546ff75bfdc7378698fe03b2f9c4017992269ae7fadadfd4b6472476694241d29a0545af3be9d0436e4840d24559e842849274361128546fb72f1de605519e83af883c5dcfd191921329f511111a2e2f9c2e60a7921f91d6cc93784fad60d59eb95b4c0988ee9706df848cdbbae7d2af551902c5fc6a7a48a88dab6608fe3578cd810b0b888e754f9adbe8d8b5525b4fd0680e948034d7305110d50cf0fe039fd39753ae628c35eb63eccc95f480a729389ae690e471cd6fe706ee94f45110982df153e1b2e2e17ce90ff1ee33d07d21127fb6b603f7213cb1f2beebf5fc78419ae0cf0282bc12706fb067743f10e1aadee460599f042f8f31b82222ebddb6316193e1ed19c62b2e383e7a20a7e579678ac54891068f38f49278f8e27ba3d96e26f240723c83c5cbb81a33d90cac55c12de8692cbf9b5b5858cfa608a2d601b101072728362f35ff35c7a0d22523cab523a7dd5e126064427310c64f50c2fc25c85cf580e2d2ef53d8bd223dc6039e3d8a6ac238910c71bb09f9b4ed1ebc7238f0efc3ab287761e138758850fc09b49978a8691747b4ac10c5c266a12340801b68574a13db848d726ac2386c955a676f2321bf6aa6d98e8d69e1ab4a151801c8bc3c321c0cd462286e5d29cee03c5f7885706a7c7e82b5d394c66cbff402a752ae652affd05d20ad44dfd1222a177aef2bb5895ee77133c29d14e124a9105d2dae8498829fdf3fefa1cbf41921f9e07cd8071b0f303501dee361523d6aa7c81d39cfc59643c2859f5e6d8ac38b1520d4c6273a05a6ed4ef667c628b502923363aa7ea848221dfd63ba3c4300f589634185de2c100f49f44b2cd61a0942f2007275d0e0e6318ed5263405a188290f15f5abf1e39f586056af250659b139149808b57be6421f9ce5fb29ea88505856d06b6df20858cff3bb15c835b5b4ee17d72a5b97336f2eed817879", + "r": "016602c423feacb1706cc0c4f7add30bd025e3f953dc770b4f0c8a6c9644fdfcfd24aec80d3bc2933d35803631ee7c02f2b459e58371aba234cc0ed6acb9a1d7ec4a", + "s": "8ba21ae9818a59ae74354365bac511b2dc620ec56fbfa723f9c836c5bdc5a8beba92aecb2c13fcf1a3f7e4782a1a5168a4c2ab7b22bfa6cce3b7417f07158befd4" + }, + { + "tcId": 132, + "message": "d8c20068307a88c9800962a1d09db5ca15ca7c84583a77cbca28afd4e5cb7192fba060ccc746ba91992872789cd95188d4dcb9dbbe2b23388ec8afeb0b21f2f281ff7b222589a6cfa63bb07c7306947914bbf6d8bdf39276c385556d1561cc49a5e57f31526543cab477cf50a2e6bee436c44dd86b98d80130ce8769545a4675", + "seed": "e70a017ecc1990ae35aa9298a1215e5e279e1718fe7a052577d1a9d470d79a3e91f7fc06ffb1647f567ecc949cb3b8800f4e76b26ddd91ecddbb08c68c8d3739d4956a0a70bf17c6ab85f7e3bc38a159d9006cbd996efe3097937a2e7eb9d5d102c2d0e57a216d536ee539821338302df7ab3c5fe05de9bb728d2c2335c4c58f89145d7c38a1e102d5efc03ea9bbf4c038618b35641f53f8e617415c5f9f85b0b0882cccef90b71d9db6d4c3b8c828882ac0653fe95f6d0efc9c6e095765ec8e57c892f9c52a202529bfad3df473860b2cbd6b37b20e06897ad66057bf6016def8e704a83a6c7f852fb04d3028fbb234332b485f14bc79aaf9c59d20ca2ecff370f751c4e6448297aaf9d5ec8adc414e04aa9b79d525ad0c806faaa5742352f5cb705b0902e4237e1ad9261c349a83ac7e9303210c8b95a827d849318b47d6fb75533a980ba89743b11536ff2ebc0a563aeecb0177a709fa4d787e54167f0b2df05158a2f0492a474a7ba731ce2c3107f636a11ae44bf170d9c125d97fe363199782725fb33aca0cae6ba92aaea1eaa7705967ea4ac4656faa57d2ba180317422b13ae70a413523ad95f6c3fe54d59a5db4f983301ea9d282609fb5925d8bf8edf087df3c87850a320068ec661795d99d8479020dd5f0fec280fd7ca3a1c15a698fd30a6fe674448770bd48fa1d3709b578a59bd65902478a499f56da4072a55ba35cb76a14adfe617cb23968f11a1f9cb5ebc0981468b66c9dd7437e1d1112e3a692bc3e81cd88298668fd8dd14f4988638dd845d12c54d05e14b301c82743b211c2daeea1d6a6d69688c2db0923fd4cf21a3c13bce05ab6c056ec412ded92179dad53027e3f203bfec220885298f52e410a143b53f39d7ae2e11b4f548e1c767fc3b38e643c004c450a62d3a9588628989e3a6b981d4190c89089c4820d4b1cbc60d14e3ce0912fd0955fd757190cbcdf207decc86eeef73fe67347934a7dbb0d359e69c516bedc537260ff4342f9866d5ab14ba62a754ac1cb2cc071059acdb9e01b3d34ba6024d903ed809791f8aeae6ad4a20a9d41ea5bdeae5d1f0fd254405e9db01b6b5024010f968e146cb3154507c261a053296039ee0f180fcd180de97289aaab4a0e7c4f6b0d90ec2c031208aa07ed53c70f2525cae6dff890686c6af96dd5fc520a02ceb2a9306b5cfc285bf54678ae7da67c498861775e8769b4c4b2ab318875c09de7bb3f6ff1d1de4b0dacc25efe26e5dfeb5b41cf1aa30ab88fd1bd3793478055b7177e93beccaaf8ad5291297cfc4ff4f52cbbced4bca79c6c412b97de4727abdf71e4940e06999f56d2cd132a7c835b1c2aec4ad0d9999d8b380d92b4ced27c34bc173001f3460e429b0bb5a63ee58fee0289bb141883c36d1df48c59f1603ebc34da861fe2e7ca1c009d71b88ec35348e63305fc4fbdd", + "r": "01d3962626302805829337aab7acd0b095f7aeddc82e57f8a58aa794e1916d59e7cc83a1f40f775f5fede77684c05c50ff6bdb5d21fd3fc222b585deb96db1696290", + "s": "40f27ed19dd61cb694d033da970cba511943f856c8d4ac0f3ee9e5d5520169fe5ac672143966f07607e6f8d9da0df17a3ac27ca125038ce1b433976be33f3b00a6" + }, + { + "tcId": 133, + "message": "98b777bdc0d6480eacd3a9f63c359d71f51e5593046175fd66c85cbeb20f220ffdfaa1c8d07b3f11b423eb00c15e63a95351d08d2e9f8b3a80473900e8fd3298d46b54a0def1c3c6ab8332909bf5459fc945bce5a7f67a529a80b99342eb95e7b487f606fd2cee0f377884a9f126bb3adb7bec7de5e61fca7151cdcd00fb3e30", + "seed": "f9a9f7f3dde3e1fc4ae90785c1b0aa042233b9a1f0c3610aa3c775ee6b35b573c6363c912c09bdbee2e9cf2fc5bb6db985b2db855757a48b0dabd15ec57c95d3dc984accce73bd5a989ea34f030da913ec5143c646ecf1684ccfd9f3d96dcb8aba22f62105fd18339233c41d0b625480316495973fb53ca88980a48e6cd98dd54d9c71b79b2f35725ef26ee63138ab9596eee2be243db51ce8656361005495fd48e636adcf7b4362a0c3cbec27bb715c1866a57d611c314571122a1403ea7effbfe36d403856418ffa618c78088a15c691a125501cb0e8986c42fd03168f6488242d5dffd6489d682010d589fadf8c7b10a54a6091ed39fbacd334d54885d1c424db28dfc02c127f5598bbd08023b17e77e20cfd0b385ac8be0a5e2735197931fc73bae3549260d36bd79f7f6ed7fdd50ad761bfd6a82c009032ab80ff76f7b1eb9baa26fd34ac97328a3be5e01e2e21d80c13a1f20f65529cbb03e0d2d19bf974989cbc506beddaa9264d4839b5ee37b349a86af9e13fbec701b96b0cee25e48992623f97259ea4ed4ba00ba5ccd20176844211efa9f9cad0c5b179989cb0ac1669d857da691b689cabaceb215a26eadb684469726938ccde1d14cb2e89d5271d87e44354740cb3a25f43e1a11b20dc69b8bc9bbeabf17734e66fbff80ea52d8fd03bfdebdc219f834448459ad9fabc6bf4a52b24b6a2e759076e8b1bc1ad250bea900d950b631ed5d4c63fc83684f1cd437fd90d8cd5018248d1ba73c813352c819879daf29175d204e3bc2f68e888f5f1f6e7d317bbb32787479cf5323e79a483d9b587ea27e10dfcfebbd3133ccd5230c3d1560169f9a07024ad8e6d408dcfb1bab360c488c88b9fd3b0ddb7c93e11cdc742b39c0a074b5de304fe939c936231f9e083ac2359c94bee88c929ec94b8810f7843d56d1231e17c4abbf2cf729fc8189252ee26bf4b6f8441b6e12c271c21e8339fee6a40027a1d564f8b78193dc1ab743c537a05b267c42904ac12bb2dafe5e95e17c4dd0c47e64524af99ee10ca98ce283fefeec863c707b2c6a595dad0e7357400dfee74b1677ca27277516546663e33ceb0ad94a2f7a2ebddfb00d15b819287c69b45b137e6be46d94945d0f7f3ac4b8bd9228210d01131134e624d8b6eb3c10ebf31e8e096d3515323bf05a741ffdd0a8bf243fd1d8be41509ff22748e5112e9e9aa5c6146098e8ba6ceba2b58b14b82ff044d81060dfe090b46f3d12593bc89fcc22fd7bde90b03bb8b39d6a63c3298413c2443bfdaae0543ef443852d688d241057ba2ce5df9a36614cbff213829a56a0864e8966b8df8d07f0afa80c43e03b09b6e0cf76c67b5a101c8fbddb85c5c55aa439a3dd6dbd60567567a9e76a0d24a957460475d0adc210a35d7ed7b0f1815c573f6c620a939a8f845600b4f1f4e20651b3db40c4838061b", + "r": "91c00af51f01539a43658dfd1b462d32b447d1498ee5094b31f250c9279063e5cc83f9222ed65d0eb9b4f888fd9b6785104211eaad8dd94d9dc44f10f52e776699", + "s": "01bf8f2f3b8a202a95fa9125364b5ce24e820be5418bb3d1ecc9b209e2921816b41213435748288546c0c588fa07de8e11412e2ebbab87e04ca9e4d2aab72324a2f4" + }, + { + "tcId": 134, + "message": "91fe1f3a95e8b69fc07871d946eced33cb8f931fdfa4fba752237ff200baf4a06539ddf164ac93c22de9784d6011e1c2bce0cf527a99cc6fef83e729aae48938c6d1eb27aea9149be10db8ac14eb2a3a4c2ad78af3ba7250618c9b784875d0e6968c388b4b2eec936ac30dede92dfc8afb2f9e7aca1fc5ff5d36559b3d7e5eef", + "seed": "cdcca210e0b89c54470ed4c6d74997b36865612f7780357a9933271d14f30facb98dbd2464c49f6df6a8edde4655076d9e8cc42bdaac4d4a009b86699b02604ab4ae29bc9f95ac2065567beb95725e559e749234333b4dbdf643a161107452f04db2e32c82a0475ff8ed27f26b6edddcbc65ac99e2b7d03705257dd7291f1ffdc4aa0a36a8e0ccecab725d1ce4ac3de136b23d95507835a3b0e26697d1557a6e8b5699ea754f1e0d5dd4b5fcff1867b2a3a9125358a46009727d4b2c46549120651598ec55adb04ace765bb5011ec4449822530bec3f8694c12f9d4c5dd73998a206581adb0ac27505dacf9a93ccbb5903784abb6e12e7a5f280227ceb24fed9cfdabee9cceb91166189990cdd23524f17e761e7f68441296a11d82e1e064b0a3d9f3e958e28fc7b59b6367649b4d579a2250c7973a8e0495b3a47cfb08b5a91148c4c488bc4236a003b3e3ac14434b979df1ebf565ab299148cabf4fdfc2d40f4546f56ceec01c429195da99b60aafe8f5739f3e19bbc3f7e3ac527e64d9cd124ab530e4baf09fe2a445906b39be32ec0623378db8404ddeaa9035bc4289cbf02bc895f59b72b2d9a4adb2d33d06a6352e82d2063c89e4f3e42bc49e50b6e15b06a994de3c913d95f3ab5827084d3a9e8883eadabe887fdc92dcc236eaa09d1f21b7e4a9d478e21a07022f3422fbf48c0e2cda6fc48d76379442701060b5ee814961286a4ab4ca2a95068d4910c5283c23a404a811651cd46d892cc51299bb413a5eca5e2a5e9c3f425a8910e85df1c7f1b61a4eb9fb7a7fdc7d7f7eeab0faa90f4fb9fdaa42cab1fe429f92b3fbbdc15b0628e07b978d6f7f35b38370f0c1320e68ff9ffbadf018f93af20c0e83ec1b4136ccda07e46d35cc652f302b94b1c2070057929f088bc91df1c5be04bc22e1fb5bfa5e2083bad7e35249979d71e30925fb35d6a6e65f77ce778ce4a195f1144d2ad546bed268d4720a0ab98cc5dbdec9c0e21b188f5ba4e51607ea4946fd0b3ae41592376c7275145c0bd591d5d000137a2e2005e3a2fd6ad687b08fb0dbf1132f7bead7f5a3af0b3cde9a69974012518feb8e5b4627b15697194cc18172f888fe3c4a82b60f6feafca8a4c8b08b2e8abf70d464be84b75921044f12f7e233894f957568cf31be86d2876427779732d64f05e88fa8505ab4ba261dcf6abf20bb133769d67626ae92963daa63ce5705220bcf5a216f8c78cc92c5e884426e257090eeeca3cd4d1dbac7efc1eb016f842eff83654bd5fde83e61d4cfeedb4b50876a6a52d297643e765d2698eb7d3f51f8431774d94b7acb9321da96fb18fc7bef62056f115b8a8452691816fff9d15f6a79d43dbed81afc3fd37e40c59f4a527c48f17e40cea89fab27687a8ece63d48aec98809e2e4f25bae7cae616d8f132ed2ab7beab4de25bfc6e0be0772c5cb", + "r": "013571e0b47423033b4eecef84dfa26b0cddf6d20c8557730f072d8d23f52cb18533ee6cf3c0bebbd6976a680655af162db007a43516d06bddf6f1d4d3f1fdc23a0d", + "s": "01ca0dd120169ebcda59b4b433f45152b299573906386bc9a2a10cd6c32169f4f2811123d7ed6ae890669bdb1a6769fe2e2646e9929743b7e91b371e2bd28e601460" + }, + { + "tcId": 135, + "message": "d5ce2547e6403be92d7754bd0b4d1b4f1ed18ed5222bd174b82726d034bc30927491eff2353892046b40d086a58d0c965f4b8165d84158c5c05b807844a62afdfdfa4b18e37a9a9f3666167bf092cf389f6b765eba2e8cbfa9d36cd0d8c96b81bbc01874c6ac01d6aa3c93650102982d2b5841af28e5be156e11c4e55044dcc9", + "seed": "8b995fe92a7a131d83f462746f2b6a128db6f0bff7a94e5a86ea0f85891d752315731ee59621a77c0c1d3012edaea473f0dd6b8ea8b6dffd003c0f4ec6ee17f64e40badab7cf1583627219452f1a33ffa123dc9aa7b279092cebba73b9041abb6d237dd936173060a23b9a98d81f78890c23e5d044d86b70f8f4a2b038a6958b6506b9d36b77b7e4de19bbdf2da3335780d819fbd2322e935eb8c619eef7e9abd985eea766d8cc467890faded9ff7bcf3826501ca9405219be0ef8d63dc227735897eb16653a35cd5234ce769f31ac688d249ede632b82fda94778eefd689175103da60a6d5bc210f6d4bd1f2b6bd4e6dac434b892624902de6ec7c1fa28bbbeaee9751d8205f95597bbd511b1905799901962ddce254a31ea0ee66348aff83112dd467b7a738c6437ff2b1ec8a5c1f74b0f41e45b3216e3a274b4c4f1d35234c2bd85312ffdd1ee6a04f8bcb7b4b809217766f5e00f2eda1a6cce1ce3a9ff3418e4994813f5756b5a01b88dca8cf65a64ca75685557483f9f1f710dbed6a089d910330b1d4aa7b4cc4eeaf5fb964b4a6d2e47227183708f28ac93dfd72e41ecdf3082f4c429655a5bbcf861269f430b10e76811f2a8213aba121d3d4823df743c89ad66d524dd1083a72d395975314cd8f92ae965c55934b8def75e79b5ce09961946282c7c46fc7ee37582d39109bd52129c2884779f2a618ed663a6c615ed5396f7ebfd0e0309799ffffd1110f3c2ed848da5e0c7a0ea4216fcecf56e86ac4e0e01b3e012754d4400c6f3e875cf56b0eaa26370fdd54eb78c10f8bfb96de16f969d2effe763c03c6a0d3f1fcf8204dbc86faec5a65c38cca75790dd3ed344ba803307e2b94ee6387eabaafb355a7c6d33eee495a4657497b6d97540b524a50812c1519de07725c7b19e8b1f88f41ed4d735e4c13becef2dcef2f6828bfffad7e43f9e4e961dfd1dae9c1d8c37cc4dd4d35a7805eec35bb982b2e7c3ca26456a1ea250afa25ce935daabbc2cc7496446cab2626fbe0c3872b5ccee187cd3ea1dacbd4bf448de9e9883d57a3e733d45dea588492d80675ad14d19a20c77ea431ea7ea3244c03b2ba26b4eaf69c637a9ada2f02defb5f293ee9cc13871fdd79b319480ecdd5797d8af157dd1f33d59dc2fdab0aaf7cd8efaa108354a907c9d6ce85500c52a1ca56a515c6153340c7f22fd3976ebf5e2f103ec2f0111ea2967ee2b15f509577a57a4b80e20936ac9bceccf2be05c858d5324b89fe70d92da862d407823310d331482cf0916694f5e767a5d34c7cfb6ef455a10597a0b217782832c14c8559a7ab8a08f77d0e36dc5b34ec05d540c80ef6f6a885968bc5f8681a10974b0e6dc23e2e3a540a32a8f927db941c02dfa1a20eefd68fdc76b5eeac941dec8ba3b30dee15b57b522c00411c4e353b5939982736b1b9af38e70033bf43f", + "r": "014bd9129f7b40ba2f5cd692c7ca3fa70a6352c5a63865ff7a445c967117a92346fa2221b1c189de2d3f68aac211f1f92b0e5fa5451d3aeb46fd5badc44fb5e37ff0", + "s": "9a790766dd63fdf3e8ec37ab5a76c95e223074e53d42bc8034cf5a97e4af053e1b1995b80500948f99ad17a4b358a3def6bbaeab91ec772043eaac8489d2406cad" + }, + { + "tcId": 136, + "message": "94f1209892a816bde87168cfec84b2a6669249a44e9991e358783434c01dd8c043251df481a370418d2e7a6783fb356f574697d9b3fb03b1e6a13c02e9a3ec62d9ebca22f409ecfe6cfda0514b7785947a1ed7ad7fb1ab0e4711fe6ea1dc3e2d80c5df088faf8d2ef3178b5f0a4bc3e410dddf28d16d28b9f35ad28138e015f8", + "seed": "e34a2068d69388dc916b4615f1339b8e8ca06efa4a1771e309c8454d8d972d4476b48c502bcdeea788c9d9f5dd6b5942089dfccbd90182addf925cd2e4b50ccea39e004cdf6effc77f9c02f901d0b15354bd2184f1359bc23c9f59a6e98987718f37b6a5d252eb4f16a7897477f47f779c9a7ecab7665be8c60624f44068cf8c78ae274e42368029d0e90cb47d470af70c04b34a8f39214ea591470c010eabd3dd56f010d4c95e2ff6b88c21a4f600c1500d9ff07a8db63c957ae75ee59a6e23b69f9af26857ecf4a0d74aa5c4616f7e8b22524f41a4f85e66f51cb9a933d0dc5b055b2ea5565178e749f47db72057dac756d98a40356c6b2c509db3933aa04495321a48ba6138e987b10aa6bbbad44c18a3f2feb2ddc06c75c466e73a1a54509fd3cda401d49f0bcb54d42d2b3ac71fc6243d44347ea25e818c9b6fe7ee7b22ebdc96cf608fbbdc16196201a810a08ea3bc24dc03551e335281ee5a8889293c7f53e94cb14e9b9b3ab72ff417f09199ea1e40f41cf055cc393240eb4d91671155cb135a88443fa967dcbb87bd2f3ccb42a0dbda24f8e0a47244c7238c8b02014d88adcd2590c5952281fcd8e7524b8e6b680718370e96dfa122a61ba8b554df07debda3c7a8942a8a960adac8b6aa66e873f072f66902564e168e46ec58c9be84b1403637ae85414af43eeb97b934dec369f0b3dfd3f82e73584355ed64e2735ce4f4eebc8d3ff8b947de6bb6550ca1279be357b3909fca0f79225ec3c81ff7298836c5e02879a958b99bc637c6763deb7ac3ae245a29b26665afbf92890498df08494fae848ac38fdefff14e7c4e25685716d5172c81ff08f0572c7f396a78f1e5aa0e3e2b031668dee2c91f9214c475c7f3b54640a2e3c18d68d515c8eda680f9e6403aa9f3e7685072ca7c5bbd95e48ec3280168e3061189ba2a511854d68b81f9e4982234936f99623a7639c1b3f0e469bbed296b14df8868aac2a9d099e7751943441f509163cd54b41ab7207ff573267edde7f9cc5dc66bc1c74d4843bf72a6167526d73b6a994de52c377e32db82a5a26e00aadf90dc6bb22d21d18a03fe466c5d92bab5be85e215de3ea67453e312dce2e44369e8519feb6f00b979020bfc276f4277178abc73c9e6d4659c0e2097aa81c4e7a09a7aa0e779a449c5ae73795590fc28b50d335161afb8cb52177e2d970216d067c87757381a9eb4017abe4029bc163dd33977ebeb0bfe4298541db72e72a098469aa7593dab3880a7caa34afb8b3047c229d93ebdd7085e5853513ad7849c08834d76833507c121c9ac54b2958ead2677f9338c88c60c1d8a30c439ec4d843bee9cf5bfbadc9bde40d8fe386b3c1b90ced08ff7002f6171242799d69d5b6a7ae6353750a1a8b170cc6eb30934da3f3adb3d4d2fc476d17cfba5938f283caf90630d61eb43241cc348", + "r": "ad2fe978f44fe40329aacfd2a898cd2b72cc527cfbfab287593e4001bcfbc252b1860498cb60fc6cbd3c0668345acf0fa16611440ae85a633f56fd7baf4d60399c", + "s": "0188eea7ebc0761a6cd64893fabdfb3d72e70a8959b74cf29ad67eb9b51cfa12129d6c541859e5f305aafeefda92b73c17c56690e4ce2976a17ee377beafe15fe4fa" + }, + { + "tcId": 137, + "message": "43ecd370c30d9e6b5d4703b9cd7c468d0c0c49d6da58290a0a8179672a6a8c3eccab62a5695629fea33b5e34c5cf8c8521d4ad68508095a5923dc7ed0c42a6bb7bc8895a026762b9749a5670febb47d26f85a9d12508075605650dcc109e98faab5cef0ca2fc0bcaa5d37158d69b0b9f09d88ba43d51186bd52b560e32088de5", + "seed": "12abf0444ead292c1a1b3f80d404b2c60587965a9006d58575152968c3f82f1bf8448457e180732776cc477d2f0814e0050c6aea0ab17cda4b27f42ce44b328340dde98c00371dc7c1861bcd5c46fcd75771b84f3a45e31a62404a9aa16f1e526fae46554c877c644c645a07a64ea99e1d0191902476c14ad48f6d427db0881b165c791d4724d14e1f6b9f3563819db5b42c41620acab7faaa12a63776443ccf82561ac1a9b0b1df31046ca9b2019bfaf2f1098b44b45998af99169bed9a804bfc8408ab68167f991f42bc6031c461de1e848ad018ae403cde5454819e1faa2e61fcddb254e835e8ac87a35df98af6688d525c52fcebbdab1d5409af3ae14c7e6be937d0a8a506268d7e34fc49ee286f529d9735845c3ec57eb366de668fe2d45552762d23a00dd30f1e97656c8648174b73e3c73aab9dd16c2ca4b8562ab0028dbcd382c35055f259bb44857bd8b3e0beb5549bb8e463718ffca3de489df1463d4562e5ac3711eb26724f92e904bb5f20c41af7577e3c0cfb4723bbc233b9db17004d5dd6459917305cdf09882dad4d4ade81c34aca443d064a2c9492153004bf10f2a6673b523cadf04b7f6f32068a17d69daeed1fbb036d8d2629b7ee9324e5e02d8ff718c601941219f02714efb11e5e4d70b0be481b2aa319c833e23359f29fed3ddfcc00d7a2101e9f8317b3d949649fba2931061a1f44ce30f61478390844c6b7ba98e1ffccfe8786c5f29c7b6f340904a92f500628322ebe0aebe67409deb93e3889d8879d9d771720de1e53264a72c9191c45c8d2ac10ca087854c5098b0cf27142b074cbe54611cd57cae2ba26194ad8d2a7748a8ca2784546e3c3f2b22073373bd1df73a5440607097762ca2ac909441a1aa68ce4aeffbb126bc823eea7fb11cdb13b99fd487c70e7062d263cd5b0e8968ba4bf91a0ef93f43bcc2e032b1383faab409700cf4e51196212c0c801cac70f7aa7bf5d11e321cdb54c7d0aea31b39214f1f9f7a11c7b786060094c70d31dfbdabb417a57629f215a31a653d3e18dabc50c5082353a1bfbd725980e6ecb5f310ab02a0f025641020d8ca97ab14e7c2ec6eb567badcb3f040f05b7feb956a232c66263534ffa80c7f35e69a8e267e4e27771037627bc59cb414207994ca4712eb4fa0c5fc615d7dbb2767edec89bee9382aad7c5b3fa89f20d87e1026386dd4306cf3d48a7aefe8f2b7d8e915daf02fc907fc5f30dc5e202752dbf4e3de155f915704c135e0dc8019b538740a867f70a1461c603a7925dfbe16b8f01a41c814d31bc14ba7fae89a173ffe9e6c0a6f180dcd99d710a7fdde30b21c7a03894d52b37301f7681aa24842b1d5740519ce8950024aefd1e894fd1d4f2cc15d4d51ff95dd280ba9533987bf5f434402bc12508eb64141ddcea6ca189b4702fcde490047fc2d8a2918f00df388e", + "r": "b6bf303e1bcc8e9f39b3a9a8380e8bca7c70818d29a922acbcca9021a45bf3727aa66f494eff6da7d0425ff21b9508efbed58068d2fe55b0d2cf2ed62a3c7a8678", + "s": "01f20daa84609984fcf018cb87bc46a2d0c848d8371dcae71ec88b196d1211a10c09700ef71618d973c06ae1c51258930c8add5b9cfdec5f202741d0c6a90465d535" + }, + { + "tcId": 138, + "message": "6594362a3f676c28ebd4c99200165ae3eb6e55d4d6370546287c79497aa084d2e822eae226e7c671b3df7d1b56a23565a1d4871ccc74fd50775c1106d81f0769ef1f34367cfcb8728a2148d4887ca339835168820973f21d5867dfde595192fcb30597f9dbb9b70a56908fbe9156b7563b6b586b1cbb6f861810ef33060e031a", + "seed": "d555830a336ee9ecd498927f6a33722628855b5fb4224648c061756beb6a754275ab3e8a43c3c0787a0a807f6507449ffc93819c77d24ab9453e89a1fa6d7bebba9299d0f7d6971b6ba1e632f3fc2760d98145d2aed2ed1974be167f4579894d2dcee1b8d8d71700bf651092d3a28cf0a33dd8abbcd9d5699fe9803f2219160085425de3d506be89249e11c0ce465f2cb9d7c681ddc20cfa5d2262628206b33748af5ff57cd67170dae4d3eba80d8f21341e33bb774d30ffc3869c932ba806c977399b1903f349fd106ffb8d45867f244cf27c3a2cd108b35a358c2f62e005ac407ec534c98c008ea9b4f696974c417e31ad23ebd9e194b180671c8ebe5aeedf0be89d2a3fb87ff4b16a32d04e7663f582a5a7d761bcf87ed5111a9247c8d0988239c12682ba2dc78e29efa0221c8883972900e0271c4e1f26482e3f5aac1a8ccdc7ece1853f1812cf6771d35aa7100f845bdd8171b075aea90b32dfc832685e014971b383d0b399c0657a8fcd469b3e0c3f1eb2dac685369bd0013574a98b6dad0413e6ad84e3f89ce5e64a83007219376a2d199334d735cfcc9f74d1c92d1e7c7a05211d00cd44ef6d7c2781db001cc0a5eb1e967b7df55a494802b9c8bf99c0d801f88a8e5bf4470927e1405227f6f6926b9d8d80ce14dbcf30a0d146139e9af9dc05cc3d3097367788af419c32cb361fb809be9e605ed47365272943130d0aff15f6aad1cecf80dc0a1e1d4d211bc8b150fe3bd104103c6181dffc50c0678e82082caa88eec8be6c9b02d67efada1014117ad976662de30142feb277234f447c9a0576316fb91c830c1a10d8e84563fee9297bf142ee9d06053ad0a8351b480f9f3410c5e707c82181d322ee2437a4b4d13d45f0d71cd3e3db0db94df2bf0b23aee77c7bff9630e046027d5e2a3ff5bdf06194159d3c8706b0ff4e6799b8a24e1381e1fe355c956722492aaa48a09df7acdaaec420a058d1bc1393f6a975e0a2cdd0da1b8c55c70b7dfa32e1d4d7505254765f34cc360cc9b3da024a0fb9286cb2f85e5b9452f99018b6020e5fa463ff6057bc7f93a2544f9e800c450fdd22fa183b3e8f2ce06d4eddb1dcb0bc196517bd445f64a1a692017da3b37e96ccc7ea8dcaa66d835f79811d27a1c5edfadb6c09942701b656ec35f6bede1d8ca07c4154d4bed5758355863160c532de270f340c33ce606a57977432af6de53fff9734cb26acc2dc62ea947a1af544f7d263ae08ffc379aa3e576ef54024b9a1d51b3c6a34430aaf1d2580b12d7de6a568e86390ba0e790704f9886d8b94552b3f5a16e82db04cc7191120eea7f2be2efc3bed57a6592a0d7daa394d0e60a6f83a15452552ef718b96f06b723d40eabe6ce472b0c62f5e902f98b71b21620e01cfb95b48e2f3b91ed9a7efc03c4b9efae347690ebf8f3bc77f848f49796a2182a9", + "r": "2ec7c21cafc9bbb07392ea8ed0cfe2bfa4f1bf4016cf1983590f5c4a0cf24cbd0aba7d7dd77432a94a529977eb1af889c625528ca1c26e26a94a28b4b62601c85f", + "s": "01ecaa96cb684e5052df3809c92c5bf759cc45fef713c43af0a405c163663f82843130edb5f4803635861890a994b2e4692091aa73e2559673b1b44fdf06d657ad0d" + }, + { + "tcId": 139, + "message": "95f332d2b78a8c843acb664bd2c200c490c80f0591814da1129e5bf27d3b5e196c0fbaa65aae896adeecf9ca2459044af7fb2fdf133fd050998c8041f56b7134958ba5d60cf8bfbfa7234561d1e72e93df505eee6ff3a412e6c79e196e318d234dcab152ece49a55e99ed2b851b61738a6ef72828ebefe46dd92bba74da95e7a", + "seed": "5d7a72164988000c91e1eb0cf0b6c003ef47ca5a7e39b963e20c3a832783119ac984f1b1a4914c2ecbc2be61fb7d342c08160600fb8583b7432a7b9cee3c156393735c563715fc5609ea40f2f10dce8fe2c3647c2a5d484136d281754a899fb99aab8798fc7c4605dd2a268f1ec10743e10dda91938cbfb87a5aa35c23ffc720f961f71b48a48aa3cf76a2ec14de8e516a5d3ccac605037294a24de2c138e3212627db8308c67dba46141e9e8aa78080bf414681fbe6b5af1c17461a2c6a9a7ac6ad628d827bf7ed445422cce10dd1accfaa6e01a0bd0f71b08dd3eff6b2aedf3dda21bea1a362ab97d63d5f2294bc2c4f85129b1851dbd1f8c420ae69d83b582494e9e06624a3deff2bd4a1072a3fc7d68357006c81c9495c1ee443f66cf3e9669bc7a7b7231f0e90ef713e51d0a9a64cfbe280d73f4286cba40d8a35c7cfeff272cd01d547cb2546c641b53bc2047bb65037c82e360423439ece0d179a2806d721f3a0f1e011560a02d976c4ebf962d94cbfdf7feff63446933a82a1da2b08984ddcb5f7d7e3dc53cbee7e2c4770e5eec4d071437bdd2829949de2cfcaa6a6774529427f3d3acaef825be9d70726b4229a5fe8e84a01cb84ef1a49732d0aaee3d40760aeb075721870ec14859daab4815f60e4b6d977968b73882797fcc5bdeb4633997518663fa89a297f4e41efcf8f51cab0e21c9e4a6d1722d5fa93d9797ab0646b70b60faaa9ca5aefd2f049b0857600f271212a908becb6f19ffec3ce6cea342f959af5f74e91075e7eaefb45887c6e17ca7428a569b55e264dbd321fb030e41e88fea91440d878e50afae2c7d3b4e49f867bba554b151043a29d49a24be3f09a8afc8b9e4ca21ca83c85cad4211060238c10e4a799ecf039af6d6e607311f007b7599f6430fb1abc601eaf4d9b7a5e4850ba62d7f444cc5c4375046684d57065168475fd6d278f34b4892f84b3a28564d2d3e421f18bc904273493dd9e06aef56f2dc81d2d014eb12e90b51d93fc43dec7e0c5e9b1fd918fae7d7af00a92cc37b14c04037392efb940133825c0c0eb44131878ef1e5561e0bd9d90fee80a6a11c33669b5d04029c9a2de0d5b3e34c39e81a05347d665f24a410365169e80993e2d91a0ebb63cecafccce93e23f30b4a4c0e45c512a1d1f33927c009c96a46ab82d0ca3ad8d8dd7dae474870a972b7da250b73908e949382c0e557c067044a60258ba3c66d229ae37e8ed37fa6ad1e8a41a1d38052dd5f918205a6164ee9cc4003f3d377534ddcff472abd1a4c774c7aa5f9d7ffeb0d8d4519d4556295531dadc2e9bead4ed89eb86bb5ad6ce3d3a4dd13beb0fc734c83550cd57ce2afe34501d8ac8d444e1e032f60368f4b4ddb1721d82aca1756b94a14fcc5c9e8cdd14d9819feaf128d0d43756da2833044bb07f6ee7981dc0338cef47981fc999", + "r": "0170dc654d3df5c238ff591b1f71e6bffcde9b62cd731750079928117fa6d8631b3fd2a228e8eb34da3a14c7e8601df3ac404a701447580e76319d6930cf628a9eaf", + "s": "4e720a00e34392115cf6f5e75c6eaefd1da6c18291283bed04dfae0ccf894093fe6723b46bf580241b60261fc738163c74c953a2a0dd51b094a751fcfdb5e4bc1c" + }, + { + "tcId": 140, + "message": "60ddb0d980df7f9284b56fe9d0b51e7cea5634c4bfa9683ea2b48575b8399b7af6d66a76a30b9b0fd54c343f6fd8e88b95651e78670ba0ca5453e41cee54deb9f4dec2b941b4e109ce9bd06073bd9287d174ca97f38f59b990ab2a841469aaa5aca8fc015fb9ff5ffc1207c0c430757ed8f98699f98b61f0df21724013dd1bd5", + "seed": "ad81a604955b39681f5c104789a4fcb7cd76a398722d595a98fb3eb244227927187394e433a45389e624e56893465694aa2db1750f37081891ae6988df3b53d6a112c891e182338f9496cccee9f18e8d17e0f5fc480f1b55e9b70a88df4f18aa664df3d9e985f82df31f3a9d4384ac3196b4cce4b2d0fcfb5ea29235afb9ec08933220c4e30a6356cec8e26c0a550237ed65b25fc69ef825e599009d4f8c0733d4c4352f8782abd7f3981fa5b591d816bb62dd5af30f4bbdee1c36328646381a0c437b2df72d8f4b806732a23efcb0efe305d7788072b0008e2b9b2aad625347c94eee493b0ab947009d33d861cdc7e103b330f6170a82530485a4d891d095f58ba4ddd0b37b725f47e4d1e279db53efd64f3592bcc8ba09f4fa8bddccec97ddb45b44ba1b2c3d7b01177383f249fcbc4a311cda834f5964dc5866f3352a615de98154613c0614374afa5d495fba60dc5db6fe7c7e9685de4e36bd9eaa5471898ee06ca8e16c0e64a3efd269b842f3e611c74264e2755885834af59b539ccb54cc16bfe820bccd9fb8ef2927f283deeb344839effe8596d991d63b315d73727851423b66b5b8c071a09a3de4c190834da4db73a2f842278c7511f37cd0faf97709cc8cc51f495dd5e879f62628bfbc551d024aaae5b77300ffce24df61a130c7401c4b430a14cd2eb763b8e2ea6d1bd270cd0dee0c363099ab4e98a76f0acef6528c850751abc45793167c9c1339568a1b27c4d85d84f443dc91b6180a8b93e3a0eaaafba877f49e36c755dd5cbf9e1963ccaec16ff53b43d7bf72ed56e573a400bf60b747759cfd39072fbb96104800a458832dd7190aae50cfa69141fd6cb9eaac29e647c323c8cc9a5d89aae380f889783f715dfe42865598da3ae6d0a51a35d4fbcc7cb17fd7a325fe60b8870cce85966f5077c83a2d49d2791a008e1b923a722c5b605afc082cb287ae3d3c763e615cc189894585120196dff1caf0bfc80b5239c6a20c8dd38b2e3ba11c406de3056aa0925a235f3729211c41141a08956b03cf1265e6e987829b4695af3b7a5e7fdaa169815ac9a1127bc06f56c7365d24d77425ece3302e4bbcfbcc9f40392041b441b600b9719b722f6e7bc829ba156438811c516dd988ed19ba4f08d5863ae9532343deb8e5c0e13398e697b6fdfb09c78a4428bc7bac3aca713c216d8d6ce5a3b4ba3df4529e7dd356ccdfd1f4e9a7051c2bbbcb40f9969edcfda0b0ab5eeb6ea5e5dccbc603f4020ecef0082439616b858b3d302032f0fef6525fa27f38703d8547a8cd52266be7fd78b9e824064897579c4db9e22e5bc6a673019997939110bdaf948c646cef6beb8bb1d45025c74e2f7c258d35a44b96bd5c1e0015c49c442aa9709a34afd67091a9a956874def795f728edc2e4a19f3ab0c2cbe68363022bbb26e7a1f1e2b555684b77b6578", + "r": "24ba1afe4073a6c3695181c279466ade513745fb1ab636b9210cc2a8babf65e90f6b59d66a61425b4d3eaae3f2ac97062cc7acb280131dc160431ba1209d47e25b", + "s": "df166ace0932f244577b60a2556c1413c8fd88c2ea91c4056d3a8b3a893247c0ffb5cdb219a2713a4eb6d708c6ece58af773d70a525de91eebf9b021724b9158f9" + } + ] + }, + { + "tgId": 15, + "hashAlg": "SHA384", + "curve": "P-521", + "d": "01475407cbae7ab93d70e42fc9d6a8a0610acfe9d59ea0f6f3fa020c3f3c72b724d68a20ef5d608dff13b3d815272a7bf0346ec7803bdd96aa0b3b8ffac16d1b53f9", + "qx": "01ee7705d2dbffb670903880a4c07e28d1e5c6214c3cddf601ca4f62737bb3a23fd58ef30e5a288d7d9c86ef3e5a291ca0ecbb2adccfc84054bd8c2d0acb86af4c9b", + "qy": "4b2804a0e4f975ca945e0ba627fab2b6ba94806ba0f3f88e3e9dc37073f1faff2edd0adae4e6d03b1d54c9a3e7ed87d8d2eeef0b680a9fac9970a41cf1461d6f1d", + "tests": [ + { + "tcId": 141, + "message": "918764dd0f4d4f96e832ccf9b30f8f3234355818132ebc4385d92cd4887358fe96d6994c1045ad720499befdde94ca0c5377726a47e0db2bd47522bcc05330a62fab8d7e1ce3a9a69fa0f9ee5991b8a896ed27b81a88a92354b530b9eb4c13fd88178e973c61f97b2f8cf3f10430e0042f0e09d351b8bebd42c9df155ed93392", + "seed": "c14d25175aeb0720ab2f6b0e66718e22303955ef94a05b1d7a8b2e43be9f3d2e9ce3e2ccc310e38ddd709cb3fdc6e771fddd030ee57743cfbc38acc2f030200acd6d6b0e9bb1998872a830f9e61ef14329a0a3bdbefa75f31078172844bb8112f2e88f81b562864d665ab9ed2c1752145d3c0f73cc31dfa90ea009769f2eca5e081a2baeb4cbbc5dc92c3df6e73a98cfaa180347ab39809d2c45089fe424ba3b5acf77f17766cddcb54c741b0026d89d5643a8c6ac6c821c498b321c3c2537811d69b743f8fa59044a759462578ae47ac17d764d646577b776cf91c151ec08060dab6b178670a021a8c442ac454484def77a5d3c858b66929d56431b3519c625e8ac31ee30b1151ea26b698fa4c9a0767fc062278386cdc0c75453f8d23811bff22dadf910421fb5cb9b600c077d1cb69e44136f4c5f46ddad02e35048a37f9f6930773681e66aa7a14188e9d21450bd21c3c083312b940db595e7044ea76e9d2f99057d0f1832feae3806e10a9c67b615cb2e10253a790ebd386942c9541dabb1c163f1d8a4d71ece2a28afa05ff32fc04888ddb673891eb27d91041d40b0b598ba761a3a69e54ce8dfa04ca951ac092e55f08e2f5f89a8e24a01a85a574aaf64905c32643ac17b7d3568dda017042142f254d1ebff4be3ac58da1a7a6f7c9a332de6256b469268a5feb388631acdb2854c3d25c1881123619e0e51c6869f5181ddf29e82dda185eb1fa02b25ad5f05f6370a0591ec703bcdc2d6d40c26bb182c26cb1a9ec1ecfc39d5b14d9a844adea2d2f68ba4e2b96130f587fe8268c477a2bb91fb00325b36d7baf594cecc8ec39dd6a74aa87e255b8104c480aa9bd5cf961ce6c8c0a25328d361da5d4307ac0e22c8ec993355c721edb15d6b0277139bfce876cbc8f47ec234c67ea28967db26ba8f310aa76844536fc16ef07a514d833419526e8953bc707c8198f1456d9c59e20603e62345b8f73bece1d70adca9f884bae99fa8f1fd13b41bfca649f5e48ab38354c76dd0d105668d4602e18eebc4f6c4f01ee290a6fe6aaf32cfdc282af1d7a36195f1944af83b8400069ecdd1d4e5afb7e1bcf33c0612017844d649d08a38695b2ffb12acb5219aa19dafd8e4cb50212e882e3c339a09283b29d0d3c7ffe5582645a2dbc13e65cd4fcdb69da5c3ea553981e2d4a44d9fae45bb37c1044db5f3305ad3036e9d8d093195d95738f9fee606ff4b5fe53a08d51bc7783ce21a0469737ca53e114a5653a0981345da33c884b7ff1c0cfa279088b60bb1804609c4cb8766c0b20773b6b1bcb8f30addb7a254c2a0ac61942d5064d2d8eb93ec18e04393ceee3ae7f24a5f7733856a77a249de4b3c81aec2fc8b783f857655d47ba42fe544176103ebfae4a8f99a3582f41c323e60ff4d30a7c66aa709bdc0e8d7c401bb33eed880643a2adca4cad405b2", + "r": "01a3940f9ee9d7919f41a4b4e4e13cf14d25b8bee9e45d1a9806a790915dba82edf4700e987bbc5c4f4363a4356610bd0f0c2f6c030c895191a6f44fadde1bb0cba9", + "s": "01e33bb35b2b7e349ea8483aa6d95f67cb813dc82e5ff133fb07db0da1ade5cbbf34cf1aff2796952f7867bffe7645bb437f0556b54d2618964316364ee89999c2a5" + }, + { + "tcId": 142, + "message": "e2c509844c7fdd8d23309fa620083f5f8462465de67fe68140ed2c1336479493da5dad79a510b8a402c0110e0808e280ee3f9cbf7df8e1903faf950524df4e343ea7ae03892e9f2021c356c8102631d5f250f3847bd33b896036a74431d968588821343addd5d1e1c41792b88142c7e7f4c6df8c38d75572e18cd85a0f6338b3", + "seed": "d7701a5647ebd138d8889d5ff934673ea32ac2b3661f8be754f302d5b5335df61f282a452c993c2a0ef47001a5d75616b6929ef4a268242c761b13d34f6e83b340df556af5c9b84fbc0190fec23baad99755e38584a690c5e4ce21df3b35bf2df5cb96e51db03f5e2628aea8e6102aedfa0befb66dad1fcdace25ba1a382bc2b425dc33c9330aadee7d73d91044808aaf582f64a941be2bfe4e1a6b88baf625206dfc4edad1bb81421624d36a78943896c5ed84a50264c7d56fcf4e384e136bb415e8f94e1c905896827d68105b9c65bee5230e205e93e067ef0d1cc1348cfbf01f6ba0d93baa9afd1191e6e3615d21ce3d49d408cf7569783a34f3af4f1e2bd238eb78007c868346d948df822058be941d22f0b795853b4b0c13676c5edcb57b485a4556a61387f89bcc85eca2f54c2d0f312c8c8316baf5c5ead0ba12dfae3fbcb493e85aadbaf15a4c126a33163c6400652125f09d98272d93e579cd38cd4ab4b237e77894ade950201dfc1bedb3bf9ec41051b06ac2aa5642379e13bcfcc6dd40657155b3f108f2267bed0e3181d4e70d3e2e6c200711ed0365dc1985ab769ed1149c2804375aed6c2edc5f90a40b5ae7e08ecb9fe57d5d950c1c06b1aec4eba442272dfb1125514429d22f81355ce4f509977617caaafcf8010871228b99ec5be3bd0dde99d19b77acc99edb11903b41f2b9015a9e5942a5087771071e3b3b98981b1a835344cf7014458f86b29c022ca198701550e2fff1a192c38ed36bdf80ead93e27c3d29bbc470cece828956b54c6a478cf63805b02bfc2344e8c3a118f8b9688ca386e23d1dd0912ed92d7fe1a3a3adb01a069058f105a679e6f7f208754a18213884180f6c9461942dc8ca46d2f4b8d951129bad2a5a579eb2c6f8e460f54cc62960f1483c8efd7611d8ac85e5ea236ec086cf18a2c56f63ff956a25c14611bf1075381a98b7f389268c46a9f634340574374c40205e4fbc670439b3757934736227f8edb24a40923267726816166cb8a89f48765d5b3a8ceb788e657cf4e760af5a5b0a85bd3c8ccb3816b5dcdffc2669532095018ea6d95eff96ef8bce5e476cb0b807ebb8f175cb75137cd025d0d42a017c1dc76b7deafc52ede80ff0223dd5e52aa102e5b798744cfac7ab1f865bb3b0bc1d2b930e0f3937f26f7f5a5c7547a91dba973cde6fa1bd801a3ed544f31fad2a1116a6967c6348bc2683fc8282e4dfdb14ee8cbf71e59e7c1b53a695f9a670dd8ee9162c3b00efc49ab18817843a00cc17427f946aae219ff12606d21e3bf93573b54d09577ad185c905f972ee1c98b8e482f39930c36ebe376e32643c1bd2524048643ed2dd73a1d1375c8c3d750958a94616d5bc9d7faebb748b3a028f934b48a29c2552afb5836e75b7d4095230b0bf775cefd5f76e2f14cf785b8c5b1e1af1d072a34e6558", + "r": "cb3bdd4c7da4d0862942d96601e3d75b2dc2284f26a64a31c501eb498ada21730efe0f8723607268ab1578bb4d2ca5c5c553a77f960d23b8938b00a7611233658e", + "s": "6273fc2608a9e53990220d04b805d6fc484acc103f19faf9e4c7ea1a88fb2bcd077d5c7f79ef450144463a24710e56c70c5d80d0af18e31936180674e5cd163045" + }, + { + "tcId": 143, + "message": "728f0bcdc663c7c466f7f4be25355b65bb3d070fa020bad7d35023bbdc23290d6e9ae9fefd16a897352d917061dd0e19efd056fd8bfa1d5b8d09e46ffbfdf1f867559b344e4a35123a9209bd7c47e0b8bf1fb8ce1b916209ce38483328e22a3feb0db84295ce39a89f718eed04eb94d63c0d51263cdd062097300287f2d584c9", + "seed": "ba5514fbf50bd6cbb24c91dd92bb2eb249f8ae23c837e654389f0e7ca05ed164cacad60259845c499693f3d76fb2422a837a79fb123946356126970e5cdcb8862c80b39aec2284de9bdbd1cc13c5212f8e6e7226339be012cc507cb9ec8fbe3f7b958734ba5f03461121570f8071e454ca0bf3a179d2c83ed451b539e6cf9194ef3542f47a3b0abb20fdc4fa5e2bef5997213867b50979133184d82b0bf95ef6efbd571525958f12ab713ddd71068b7ab1e8b01584a7c145fdb485708d5b4a5dc28642995e468b83d97c5617bf5c91880bf3e847a9b530d4586922e8173503eb1b520a945f4bb4416713a77e166e6863511f97247bacb7f3cbfca4507b3676fca0bad582732601d806290e54758c296eabd5544d1b2e5836fa1c5d31296ffdea4dad29fdcd743071985dc8d02152c90a68835e1582a2f686a78797b294df9021441eb69f385faa2d767cb7a3df320d9a357b8a61ec78a3104d76d2c8fa83bcebcfa7c3dd8058c1766026e750cb2e0024d005a999aca57a2765bc9ab54edcff2e41f024d04afd9805f7e01d8a9a44dab555b25e85431e35084f30bba5153b564da19586b4ce8241711fc1a7adc3a845e32d303a4f5ba57d2e1b511b347289ffc503a9abc7117c51b2dde8961e2cce84ff1cc7a9d2c1b3ad408ed46a00add8c8685ae52cacef226ab7a4b78a96b480088fac4c48e30e91e99ef047b8599a76b90e91660a8b081ffac1226ce7b8c800355d91159a2f9bb8b4ff022b2b5c83840dd56af19d8c1d37b39011749f201119a25207c32080c91da8e929fbf72a1a956cc9be890c4da064f20149ea4e55e3f302d78f6207d51ac9e2ffdc3623086378c4ae76dc6c539f566e56ed0d1bf9561c2243154396c3b7e0f1d1d9f1d0fc6eba6b6c64378df8f5472a1808cfbdb47fbb74f4a5700ff48cacae100435efa6e5583de5dc1deff31df956c51f65cd239c06573b00cd9e1b535c3ccce6999bea47bb555853354f804474c2aa8d6eb1b3b69a50a892ef1938744357972880c3a3ab060a2ad0e7abbaa9dd3938df5f2429ef3ab65e8dfb2428e3e36ba9091ce548f2deebb9fc78bfef9d97382a789500bce71c2a6c5f2ec495e533949ceda104c05f013f090ba39cf6cfcba28c66368a64ff58374024d51216e2bb6ea6ccae4aff7bbdb6c25c1ab6e4d8c6c06e211c275a7bbd5bbb8f42438a8cf3b40b35313ac4c33a861bccfd8d43f030342751dc77fe95ca36e53fd8af94b9784172eb34d1901eb81b06d9726f5d3fd7e5dafcf9b8229d1db0cfe2cdd6c35f64ec01e62e8abee52eb98eb92798f14fb9e7341732b7d863179245f493e63efaf0b2dc85fbf8f7f74b23880eeba570af7cdc402f6d4cc0b1888b3bb262bd08dc5cc953e2b36470b8f79eb3553a8044511281e792c08eebaa3397e545b4eb263d9c478c0062a4139d24bb46", + "r": "01c1f1957ad47e12037f10c311d2c408cfadc77d15ac5053db1f58d1e5c2ccd9f2c156067d6cb314e69a7449a6d5ce454891aadacb24647800ee3be5cc70c8c2bf37", + "s": "01296f450ce850211cf57c731dd4f9b415aa5bf21a1a00077013b7dcc624d7a30fb44d70b3c870d42fa9b99ea216ec2a110866b1992fac0781ca9562c1941dfa81f0" + }, + { + "tcId": 144, + "message": "da0322ce716454aed8af4bab01a3c9ed652234a4c3dee839226dd22aa474c8efe28213530a40afc21c0c83fc50d7a2d27408821a900a22ee572d0f212770ba5bab9c83a3753df6e73cc4aee6cc4066318ef99b5fd0748b662689910028ec86cbf2503cb60931cc1068528f1b704978e92d370eae3badabe8538dd4424e5e3acb", + "seed": "12226d456844463e0ba3e5f076765943e7ae91afbd503c335fa1ba098f8b752d159ee79541176074bb2103171628d8263c089abb1c119239cbe14416396a8e70165c61a1b89d14238d1ef82079f9d80f832f95cfcf0de56c0c490a74b19538a2b13b0a6fc929d360a9a69a5b2e6f5ac9cdf8ff42b038d599e80412751204ba8cec0b3649802e0ea7be246caae13bc1dc484cfa47da4b3cb8f1da30a3828a57e473bf5d15c9de1811fb21bbbebea241e132709d8dd37ba9c8b3b890cb482dcaa4f781f5eec17c7d95abb952a1e3ef7b0bd819346263f353df036f3b324f504e2092de1dad59059c57f0cf85a3310e5125b6ac0f4ba4b62ac6cc88e20243ebefda6f0c456ecbecacadd61487c725c633f4606168f48a01d4c6bcafc1f55db7f63ccac7db7e726ce1a00596e858904520891c3b027140d3b8af9b742f37efd6123b4fb6ba985746d0e0480adbfdeb427cb2b1370d3f489afe924e2d8a8afe4ad8f100abf613db6de2ac36e9d565addf289749d4b5c80f4f6de285be1f746e1a26bac70066075e62ea52f659deb9303bbc272b4b025d2ee797e2b08014d9495eaa1ca79629ca1a36c8ae895b1b4b380e5419872cd3cc1ad60bbd8c2b060ffa6564e3582a59b74eae9896a4143ef701262d75c5a8ea594fb70d0de163629476c476bc2fc6d5c6f78f27c88e6786a5dbb9590e1f26494eced32f6cfcbb9ad4c948e09bf86f2228f12e9a1420e26a99a8bc292eb073c7933a4967019aadbbfc2d7d964387346a2032657a1e287887618ef66a397700ec3b788b29f60a656fb5dfc8b6365cd21fce16d6c365db8751923147322444aed2d7c3894cea8d669ab3fc9741ef763146f77253b0e83fa18b4f1303e747abdaca83ee3edd73b1804ba876beb1193676dcd8a8a085f2749524e525dda5bb799e027eb062a61a9af5d0f6ed2690b986b29918e231f6b2137c96da9993905ce1a7a1530acad5c29422f92edc79f05d83e54726a7fde175803925e30f08e737ac0dcb37da08a04dc1762129fd8b0354cc0bcc6cd6eff62d0c8dfb31fa6b54881ea2a0d1be880d8e2ff0c5e6dd74d1188f5b04bf8d9e51e03fb19d19e3beb2a27b0ce2c9874f01cba217f9feb10fe236578c80247c7238967528ddbe2147600b8eafbb685f6f76278e94132e7f6dce0e1a8e84c7f66968bcaecf8cd8e181f829d5c3d2b79aec0767c192e048052af2f5f147b73313c979366266b34b3cde15e14f66e994e51c22b1e298aa5a94822071335eec7b29346e61ffff7526110266093daad78c1c2b9e1c20e0afb28261875c6fd85aee2822bd46ca2068b0cb3af5b0e7cda533a9e3f260d3663c78346b6bf9b0688c0871680e5f09ccf8ca1083d585350c086017ec6b2f91caef2db7a8540afa203f5d0ea2b6660e0a698a531482608cbe6af0a1dd8dd146efc6138df74d37", + "r": "01416fbfb1d3e500c035c89d60093838a30ed73a5f58583aff8ae8c83b7f9be55600e5a654b2fa44631f253025ab2c58827c17cbaa1825912b0ae0a70d1fe8ffa2fc", + "s": "014c1affd510818fce742741819b5978f7676dee88cbe01283520fbbf7df412b49c480c614080cbba27861a11e6ca9064d08a19b9f0358cb3e281a76a61388c39a62" + }, + { + "tcId": 145, + "message": "57c6bd56648eb192443788c7a7668d88752baa152f8895799f7ca04900283748267532d9d3e4abf0824d894121fc3327645a6d248c2fde8aa0913a107e33dfcd78a9c3da8df1e2e34f36440e13360ad98c1f7de0f6b0f1ea50c0cbb6c7fb27c75b9c772bd6c046e13a64d47e192f4a6b47020ba6fb3b6af0d49a9bd4d31d4724", + "seed": "deed06134bfe59257e71f718d7950d14c939919b2948c8b4dca948717e86011ddb64e35e29f1cff6046a449b4d08d291400c145a6abf6d43d1048b5337bd419e258e91c855092af31da812e2f2e8af8929e1d14d291f9840ff4d0cf6c8756d112bc5107f95092df39d062597bc53a453de64a98d92bdbf545609c44b85205fb3008c7d0b1d2cfc4b580e8c2d9192959ab8c3127bb6dfc8e05918904b9933055a7fe911dd3e9502f08be249de9b1c612fde9c27fe1db296f327bae84ba7c4984d67caf9b88cc1052a498b2a03c4dc362756fce34efc2202d6b8145ff6c1c413efbec83d46f896f13ab7d0a67140f8c013a378d19b672daebcad8800898b5e2040dc1e6e493a5fa0f854032a72f62d0ce78713b3db0f3189a0b051ffb462346f4c515241771352a5cea959afc16f95b8fc9a8efa774cb171985e11b78b66d51b4096b658ad634569433896b25bd330961f9a6fd1f218922e6979efd005d302b043c137ac29fb6601df8516e370a836b9ebeffc3d4b9184e00b3b68585dc26def9d59f59305058436e2059c5dd62f67544a2bc24cdf85a39444ce4eb40170b8b7e5ea1bff54cd23a22bd5e999ff3b908b10bd2036525ff1056595567d81af02bc289bde0144618ac60da94d18ed1469597d719f9795cd63328f7592bf165389eada3e86b02ab3875681d5ea63ba37158ec87748af750211fba7b3e74c5dc8574c33478cdfd413c9b621a6b71068d151231e05cc176661491c6e85471ddcb855c61d8dfa3fb9c0d25a94b644bb2fb023990555ea7556d6654b6449b3d502ef795b566555cfde928374b6c59a7a13642ff4c4b5d5695b6c14c4ec7db81af617805c76dd0577c27bee955e05b48425a84746d3e398744bc52bff750db72b555f5235f8e26beb68ec48e5a7469744ac80d75cac5b5e589aceaef8b92ecfadb2548adaa3814b8c5d40030a77e58afbbc3242083990295a1aa29c31e42961b51688abc1dc08acb07ac15c68b2fac8b474a215d450a9e846fabae36b0b0914e00fc3d3eed591caeaa1eb6e89f9f2cb63edad4c1a2d25735da71be25bcffa3b13f7d78710fc0cb62cf74e87f215d559be3857dd27a05c15d74f2e5feab1c9b4214e08c5d28efb3018452cc1d36ecb1e5fbf3315270c5ba0b9369b0a83534d4338c40c0104b29a190fdf7c77b4355226eee4613c2a5e127cb11083b7ff59a217f76c08c5f2f5d3ab47214476458f0e0f9e7a77976b05942ca79fb1eb6901176b6a68234f9f7fe27e7b79b47801ee24daa5ad6b67796b333d2c359f2b0b115f7de0c75a76ad015e29f09a1b0bcee4420243c4e24997a880acf76953bc1a71dd88782bbadcdee2f3e05fafa9390e7a16263a25b0cf2c976b680f7d5f80ac8e808e583c74504099b5ae4a7b752158983a34b1dc59266f41e72d2d0284c4e521bcbf30ac1fa85b21", + "r": "e4b2185878b953e0eeaed550d5d179af4b7ab638f4189b1e1b8c88b2c46f8da595f7d172646b46fbb0826ddb1d5569f8c32650bc697ea810fb4f03b61e5b76a502", + "s": "a6f22fc42c930b9f215a0903805826ebb55df33d75071fb85ddc0ebee46660bb2678f1ee456ec61c5ea1ceeacc0f1c704df444c8d3d4b72e5db1f04c8adcde52ed" + }, + { + "tcId": 146, + "message": "ab0bf1de56bcd80dd96e510f135274724d3e49a5185a465699bcc4eccd7785dbf23e3e80874ad9d14f020671309937b91eb652a56d3eece98c7829308d2710dfdf81a84b0c9228a0e4b6e30443d2cfc2ed5214dd57645c9b894a12afebbd8732074a43ff5b240b3293aa0acada75349e2714ee155a182a2381046f17c4bc4bee", + "seed": "1bdf90553b8dd2ae57e488dd9a0f45fec737ac62a5ad520eda6bdef0691de64af94a9f3a6af6d3282273b8007a7e2cec1bd2d5ad11f3e981d29dc492fc6b58cb983dc0ac548a396349b22c6e86583c5f527b5613bfe8feb6fbc3c7417313b177b121858d0135c692b84d3e2223f20b0756ca02dc4b8570df2d6f9794832bf43dd1639cec6f2ab1aee5e537a5f517fe1ed6405978f077aa6bf0e7a237d7ea162de71a4fcc6f5f65f2ccb6f7a3ab4d9b5247f7c754f5c75e0d53cc1a3256b6de2f0d30ab7f40a87142020bfd5d6e4c44cde60edd7ce25594636fa051486b5c28d8170e0e647a34f730d361d7694b06dbbd1d04c28af9f3efc039100b51ccd08f54127f964f17a9cbac57bc1e9a7f2824e898c761c4d95f77e155efce25cc2f1202d61919201bd533f7d07258bf0aefb11b54617011abd96611f807b82662e3956fbf3694bca84c983b63ddb0bad695209ffc2d38568c278facf17e1b0c57e8d34721c6ba1b06deed06f4448be9b11f1d61b027546889629ac766cbb1a0ddbba4ee54b9d82026c389419a28608e7ad84d8bf5052c310a7c970df17318fc5aed0727c7f95550b75e8d6ec8f5754f2ad3ff0c153afcdcad564b2b90c14e566103ef89881caf90e7c33ca528854d6dd3414b27df1cc2b7bfd6aecf9b516098411efabfb168ce98a989f04dbd25311d224c98ddf8646224e883371807b137d5f8aa946bd8cd1b73524f579c6a1201781d668df1dda46bd0aba97813eb4dc6cb41664f4e604ab5428091b7e313eb4fd433b940271cfe1dcf5391c87074cb2f2dd412cb651e76971afb56a47bf380a29125ee2d2c903920ee57b227974e6464b4e9a674bd033b95ffe5714f576dd8d9a0aa667d070ed9caf1dc9ff7078695e9b8ecf67ffcfd143956cb4449577270f5188c8aa287c45c10ade8328d817d8513b717ba83dfcb28a3803f127b10169abf5cefd27663fc626261a71eeaab381c551b58fdf3aff8488a92f3736ab9239305e4d42c80303c860d8ce02d7545740521be5865ebea30de9c7b62730825c8518c641222d227e35256687bfd6228830986b18b379eff66d4f27fe9bb2dc55f6cab0ade6eca63756e6e40775648e322c2f3534f350830c2f152d098f0aec18b2afb1b047a4e7f34cd51275def4e708653f5e20aeb69969068489c658760e782d7b0334a173b4f409f1a3d007c12d5f6116a762975b47e8bd73a1a38de0acd1c0e7a7ae316d44aee91f097e380fa53f04d05dbaf9aabe2df8aff5d4519313c32bd8caf730ea5f9c2c15468f1b30d472ab1b77188743e8da3d342c5bd8b954ef0b459840ce7631dc253cfa6c3c4723a8746f35de2aad4b4f16ad89077fd949f2cee90e18fa5e255b3f72341b63221cf277cb3332995d9cc6654f62707c0a0d165f05ef82d036d6d1cfa1703689e838870eaafc98a9d4313", + "r": "2d7477763b6afdbdee9e1186b97884f7c25e7b9d19bfccd559e86aa608f4a8e76754ce01a21d349e1de3c5402ee63c9867035d4470d1722fc6ad623647788334fa", + "s": "372ea9f8d6f85c2d3dc53ca74bebf4345fa2e849050b665e497f3602f64731e09e63b2c48dad5827cffda99c5d7406f0f0ad3ff7094c703216db7f954cf21307ab" + }, + { + "tcId": 147, + "message": "a42126549c0a430b5ea4c578f027c6caff3531fc24e2db4423b25113a99a155587fd4ec6971c7146c581c3f4e4771255b5e415b65ba760f3e8be700d50088d2298aaf0027c7bae14eb8da385d5c30394c0a11c36bcadff7700cb4246315dd3690699b8e80cd2f6d11ad1645b1e61bf2a05a16b237294bb5092fcd5734dc9e64f", + "seed": "a4e19fec493935ef3abe0dd732c6578c2dd5409fbeb8b7792853a60b71af881efe8fe97e6a6b906c341206711528f5abf768c8b4420797995b4264e2e66cab16cd0e1501b481eac7ac393effa69df58bec1286c4fd20f968a144c62b671a43fde63250e52fc1daa02f3bcddc683e78d2afcb3ef15709a22bb3010639fc5841cbc1e374d1ea372fbf96b5bbaa971c3c161305f188c3fbc1ae2e050c2c835f05a21062e179be22bb1117912093c6736be8d30081d0f6f2afd5c5726282308ffa778cccd90aaafa6ac588a644c38c89ea808c8cb937c27927ea8cf97c7412db38ae9f75a900d3732c223fce5a90991655b29ef68e07db223e6391f754a02175b4f688de15e6231e692ffe9e9c7234cbd58ce9e87ff2c8287e8a3891e2863440db834412ce5324d22591096f0f57b4421e9a02f9bffc3391bb3c2c568cc19e10fb4f61caeb2a1bff02a9c68af0b1ad1b8ec6be4a08f9b37cf62ad3d3c352882a9360c6c1becfedf9df6dd7bdb9213d60b0292f74e9f8da9f12eaf3043d9ce804db3f63d7d7fc5fef00d992203eb510ca4d6fb615759e2874faa59ec55b99735b6d94f48341525b9ed9eea2704078f6550523094eb68a55382215c42d8cf3163f45eff4dad1c229da8a4686453454e454820d0a375661d059ff8d679f62315f11628aff8d2b7392f87f5c8f83166ecdf817d48b9dd0b0549d4f7830ae2d39365077947c018a5d8be4ea3b24730038e1c62c01326a4dcc2c27403f69925f760864608abd636cf2b61f272aef3c0b3c91d07a1862711ded8e82e7faf85f624aae80d54966e498d3e8dcfa9dc73f9d6c63e9c4f12b6845e8dfd713aa0298ca7b9a685fc11e030f5618e2945b25805d713a46286f82835d91a87190f2e459df659da78e439eae6a3b121fe525a928be85359b7423ff3ba011cba8aa24690e82c54e6f67b1f7ac419a79fab14fabc77e62ae270b9012d258aa904d77bf28f6d5efde27ca8c0cfc1698d9d6e99ba3757d834c842f7f2296743f083a1f50f219c3322cf34a424436ebbc4960ddfb6b59e1107dfd8b9c6a7153c913d9a7b5014a842246565798a185ea904764e01b645139bb9b61c9949441b937469de7dea9dfb27592e01eea9e0cba27e631fd59d865b32bc0d56f1096150ff133468c156ceaeb2b1241bc42e21fa57142492afcdd7982fd3d62f126bec702ddbb05cdda0223b25617ae6dd702db1ae1f377467a16e6261bb134a47617af3ef71cfa7bd953a7701b0653b14391fcbfaf25c0532badd8e392d3fd758995022118b3445ccf378e318b69a9bf93d39c91f32b3a3fc76aa544a5d3e658ad7b9d4be521d2e7994e8a1b2b30de5abed96f5f4109760203560284f7d7c137927bcbab4ed1b7166c989cbe34fa5ea76d66e19f124ff43783cd4a21d171d39f90a70ca97e7386a715685ab21c8e6302d0", + "r": "01f5f7f451b375814ed1b6723ad944a5cc53019189ca85c54b2b1557ec803f15fd323acd74ea82492be7b1211f7c59eb3f475c77f999e0d33340f3cef15a3d3e7b08", + "s": "2066ac9864d71e5548c1bbe384d29f76a4cb69aa787cfeeb6890989cc5cb62c793685ac59686b96596f6bcb94b08f40be6e24665b1a8700964544239996931781e" + }, + { + "tcId": 148, + "message": "ee1610c1c77b545033d6eef641baf538a29ee47d4326ad084cdac1985921d8f000f7a632a423f415e6fb77e8738153cea1eff32a41d5be9448b5e4bc913b4babbf61789489962796c9255301baf6be319652d4a5cc9751788c2fc8ccbabd3b3afd32de31b2e9217594c0c2924e4ac311829e79cd7548dd9d922b7daa0cbc578b", + "seed": "393a8c57463e8e6a78ef7888ef13abd492b5902203ba45beeb23a7b087cb04a03be9d953172e973a5f69f29e909e4cd5993dc23a7e5a0dfe93292af015e52bec1287bed2eebc5e49f2b15d410703838ae2786bf16fd9f49eb3175e37feac5686d79a06531253e556a819fb5f8c156cfa8da70322770a60ec9252b4cc3fd4c88290a17377ad4220c4991e7b046f65d2c11b4865a86b39afe565eb8972a5692b983eabb6eac9796ba4a10f610fd8d3e2dd18e2b1be03ed039c3f17f30b217e7cfad530be8f2db277d5f9af7023ce50b2a3cfca08dff604d4349089b72c0641ba755ce346ec70f88c0cb43aa8582f0aaad11b017dad5ab7abea6617030cad13365e180bd7422a33d9cc96a84161bc340aa599c40b65f2808e8e13fb4bb437753b83d0a7c3cd14560a58687aa01842b3625b111041858251e6ea57c6416a8667af948bb7d72f9741eddd3199efdc5aeb1bf8e1bfeceda31b62f55a888935b02cd8be0bd24e7971c816780b613fb37d4fa87571af9de5d218b9d8d1b9a0d94d85c81587d599c6a582b832cec2ac10344c02cd7691a624772cea49ecc23480dad6abee8c8e50f6134004435cffeb468aaa82948a051fab2491f657ee5fc1e9b1142acf25f87d8c162781ff7349f4c0dff00f0414b03f9103b07bee60c092efcf1f89d7251e178aad56dc1a71f52cfd1a85bce18c6509186cbdf4171535491510ac9f9b1bed0de3f79889e9e1dca3bb1306a5979eebad914a2a36f21e3723118315d405e4798ef7ace95d797fb35634d2b21ec3cbb52cad341238903a43abda9a58b2b3dd712706139809fab91377d7cadbd8770269fc897cb3ec0fc9ff2f60b90ef895c20a92a4d024883a31c08afee41598baf4448540d40afbbfa297406b09c0868ef6cf7562fb7d7162cd6f473a2ec6669d232a1c686cf7f05e775f5c6cc7c0c3d4990d2ef491198d5a5056b44ffffebf5b9c363b66034978b7423473934a4a72fc24abb75830ac7dd5ce72d98a1eddbde0f01341f858856f5beb764dea273291e5e861a6b6b47b63b996199d2820e6499c23dd34afe70f9dce6610205497e5b86630de83d1fbbb98aec159fbd363565d6d0ca36aa1adf8d3a3247687810711cea189e649989f77486eb888d881be54372559f0e4166300647891764d151179fd14dff9c3e730238d0048cbed516f09a0efffac959d904287d4e3f9cdfa68a4cb79091bceea2f56ddda259d64bbcbd3d2d5de792d3a6b635ecc33c24c839a5795f966ed2be5ec802fdb5a02eefd305f0b17f26907113e83cffc2a2886ca437220438689344af25f7451d078f3a1c4121ee29a911c14f475dedf9889092804868d9b5510de96bd6023656cce40d80a72451db6d23005b20ad1e449ebd749835d5e15669ea3f3ccab9a372f3b9cea1840f7e61713632dfa4694ffb93446bf2d2fc277", + "r": "01472c19a5dee43bc72cde14a802eea296534608969309fe938b0e42b13e78f13cb01a730404e2a74d28afeb71b61b0c80a7cfdc56b2eb401041beb9616f942ce460", + "s": "fc36a52886dc8d9d60eb4e6d8116324fb4b0f23b92813c9cbd2a5148159651498bd6a3581e2d17f281c048cdadb40f19c30ebd59be95c75af52dfba97d3f1d99a7" + }, + { + "tcId": 149, + "message": "faa2da10762669eba5a1aab8b9cf87b728d8f6a664ca88709dafb1b5199135147cc6bc71e52463f1d60345529062ae0eeb6f2d7393dab5b714bf35d9183feeebf43a1b67de7326554b89811a829c30d288c9f4077c2a4e972e9be50b79af7b571dc8efc03536d8e077a99de172e352f9cbae8893960cb3e4fa519eb6539effe9", + "seed": "219939e6f4220b7b4ad8cac9b79f36e3f3736de152ce0f9d8c5c74a18c1a563944fc5192e3883c0dc59ba99a2b792f8e381d225b21db3dafca892f247e002e841da6a2000341cdbdb7b6450b1c9b0c6d2d21dd43a5638dcdadb470d930323993dcdcd7c260f266d4d6f10d8b86f7c3fb7894ee4030a609fcbeb124e1484c601d0b7399e0f8e012a417591d45508defcf770d8d01dfdeb12951e7146d17fcda32c79c683480823bfe86a2ebdc5b2a5803198906f914c88ac10d16520084ccb22e18e5e85d1c20c05ba3195ad6856433b34fc85a0c412d34aaf741770aced7f843c5a7f6d32757ad4ebd3c404931aeddc00a440a6a0fd0ee93437fcf2107fbc42d60b0a01a9d16cd8af8808d25966c732545f2e91b819410bc82bad0e49fd4eb8cc0bf6111f271f85ba6814055fa64b0a4f3658d395632e97879cdc1afab7fd13726bd05b2bce083d6bafe189a3e661aabc711c91bcd1236dcb881ef861f77b512b84116c98a1f23ba95fd6a41d1bdf18513df3194bbb17451ccd9b3d38620541923b0bbbc9da0f19e409ca1f7e4fb99923856c0976b665fcc5a6b6977261439889b5122c4209d250b64508bf2a4fff782004fc220ed85c9b168b60a15d891710acfd9f8bd570d150512c784abec208026f56a02453d282356da0f0f6a1e4ba2109bf559d4cd9944e1ecc1acf4d6d5d5d35279c578548872a5ea5354c8cd1557dc1e25edaebb6df0ce0815afe64285777fb8c9fbe7708d3942aa46212fbacfd701df6d0545deb0ee419819e5a3012c013a5ee16b5bad6486153890d07b09ae84e5c2694173298df13dfe80f048d6d095495470c573020401328f2d7e4dcc48b6cc75fab4aac3654131cd813240091c47cf6fac939c03dbf68e6b59cfa0b33fd40ae5fe280314e312db070bbcf33d073dbbcf95d53bf95469a4e4c2e9d10564fcf1b9e85464b1927db088359fc48a37f857af3532fcb6ce0f4483ba3ca34af6cd370b4ddcc38d98eea888ec887ba7558b89213460c06e51b993a2be0e64b2764e44641556531433ce066613aa515185ce7c7268b4bdcbc57455f698aec67bc63331ebf8156887f982a4ac7051d53308f67d5fd83a5e3b257a9ddb952dd4c728d00061b2dc189b4e5dc9b523f533b52e0fdb817ce3e52078493a4b0d50de1eb8828c69ea3b6d0ee4f2e1a4267b6933581297bdc4fb0eaec7f69334b73f332ea1c3d89732ae59736bbd02ba4ac1f2aa27fc701675d7c6f3dca5032caa826f8b788137be4cc4dbea66997ed1943fb6f2fa438e6b7bcbc24fe12864f1f8ff82f1b1fec079aa10ec09a5e96ab9fde05ba5fa6054dc371278b0ccdcd622383c1faa9beb5bcbd84d11b116e4c54b9cb5aaac0097cf918b981ab41bd6c7642dc8953401be316e62f5372bbb40309b8cbd45f2cf8ce72cf4f70d89608bcbbdc644419b02424c", + "r": "0198ad56b4f3f81b2b3d111e60512cdcbe604af1db1e1028c2453b975e475b8cb6c1a8ce07c4eb286f02b665160ba6aa2ade76a5ccdf4a3dba81d967322d9dad7a65", + "s": "449e9beea7694df856445a73282ebf5babb016397c270a66fdeff33fb7017e06eaa2f06918b5bc87bc27460e199f8c29cbfb8fe15f887d99d38e9f8d68b2d612f3" + }, + { + "tcId": 150, + "message": "6904481af92a673b7cc6224c5808577c00ad8fd2320b56c9bbd5e484eb1e9a7d0da295f371706cd84b4f43ac1d3d94ab3f0bf03af82b96fef7b98b6602b28ac072408aedb39688f1e787fec8094e83463ce73776df0dbe978f4989f961546049184dfaa184d0937682cf47b6c2254781b3ecba63fca20e6ce10ebe470c0ac02f", + "seed": "e496a791058aeb9860ebceffa69e97b9899c8076d4b3a9cf8776aea3a829fbb882af20f3bad3973e3dcb0fbf5644a3a61ce14cbde004df717543c6cf863f0e2a332fdec4c38ecd682712c7ebc81d865e70ac880b8a9af128152ce5b5cd707177a358cd0066e1dd79a98ffb6b6096202ec58d52c339bb0910a838a0e0ac886fb4e135e3694b2cd4b5da47c53efde66d9a0ee3fa015c7814dc742111669b3337f0e40f9ecb2895708ccb66c9151b3147cb4ccbd66fd9ca771a5545e306c9b3269fca4112a0503672844b7d6691061a2a40ba16bc09be83f7b0c03876e0e4b7035a1ccad0bb5fb076f35b4f2b28e1d5ad9e5e9b0954fc989ef587bae5dcc4e9c77e711d591e75040bffd5add36ac8849a52db3ff9cfb23a874db4e6394745a9b5f43e86734c9f67ca26f70871b679cfb06fdff1e31653842c4c98ddc7eaa2923fd684450616aa2f31afd3a9a2f0e4463db9bf724195e5deaa6d2f0b734daa6e73b56b704e00cbd81eafc3dc98f107d564e10927276e5bd8f05990f4032459a9f0fd30be96e5c426fc86fa5b1493b5e7c0158fd45b87b5ab16b57bb4fcd4edaab558972b6fe1f2eed66459cf824bebcf444b9d3bf28919b5d3271ba743cfc9b34516afb81d1c0642fa1e032fcbd4e80451a66f237b10c21196cc6b4a02e16d1f5c453ad03052a55f4e4873a672dbd64e5e33e54124dbe3fec08e6dbe7a7f29638b0d9c6f99129c983b55865a6936a52e598b076e9f8a98b6afccaa1036e601c2a854acc95c7dd356a341f43713c6dab027973fb87fa31e30ea810ba5589cabf8faa0295a06535e1177661643e3da8529c9a5d87fa6e420781c9fc0cb8771ba9d8b21b84d098f170833837ad51a6449927581232514860dfa9a582314c3f456b5378cca4d89ff674a2e29cf7a3a738b2bb8520dbbe8b808998b0f76a0fc87215e340a147ea1130e7fe42590aea7ba8d52184dc733416141b8174e0e8800e662813baff2a067a858e0c8e06e80bdfd9ef13de2c99f6fe91c57547feb24105b2c41f552483e858eaf96197621a12b8877bb759f8cd4ae400f0eb29d6bf00347eb919016abbe0bbd2140b0bce9012027d0332cfe78afb294784309eb004fc6eece5896e00564adcbdf9742f5aecdf149b162556d91f3d434b50b444c435d030c77d41a18358e1f414cbe48ea2ef0285e3e7aceae0d0fb2319086946865c878467ab6eeed8a48971be4ef5e761420744a55063adf127832f652ccc26a4de4c359210e838ede39980d292191d3afbd0202f0103fb1ddbd82221bfa33f13c7cb64197c3468c34c7145110430a81ec112da5fa2d8a4f7f1c0603d3da60c114c9b102d1625ea79ff702c8619bebf0a3d7c160681ab34ad6f7639eb0e41021c170433c00474215f06a99366d739ca455359cc598e74db2c6e97ca22a2baa6ba0cb88e08e7ba3b0", + "r": "01d58ea13ecc9e21c71129fa17b0bd6f2eda69804e17ed452c2c59f0acd3c532c3a56dbd65d4a8b0bbf92fc53f9cc1b8adeb2be31a03f1b9b1972e887d3a7528cded", + "s": "01a5573e25e76c2e057d6c63e0016208b63cfdf46d40f76ce18d5b52317a7b9b777ad60410bb8fefd4f3147f9e26f22217ecb19998cb4ca22368e361fb3b1d40fe52" + } + ] + }, + { + "tgId": 16, + "hashAlg": "SHA512", + "curve": "P-521", + "d": "49aa14209261219f1140be8f96c6e00607ff715c859b1a9b94eeccc45580174f58a06a42f71c35a88a5daf1957669a640ac14c163b71bb21e37e28cca3f86a303c", + "qx": "015a8fbe0f4136c981a5db114f52eb009272efb7d927e3ee7deb04c861eae30ec261607e4bdde7de7439a511ab757fb3b3dcb3898c3e3be3d1e77742b34d47cb48f0", + "qy": "0129952ab90c6d6dbc08bc6b8c0299ee0050dcd62ab0ab9fa67453d5ed034bf7ce16fe886f92a324e8dd1a30048c1bc193bc3b80c04f30e66e54fc93e92e945643a9", + "tests": [ + { + "tcId": 151, + "message": "ee80eda85a99aac26c7bf79d3d6b0f5785e26e0bbbcfcaa3187bd910698270ca1a43f44d87cfd3853128d8d7538b5c190de03001b7cd47e2ce75772e1edcea45524a289a851c37b5e425d902b2981890a9f8ec53c7c21442dd796abf85b8aa0a2b8a706b1b0611fa33f8c4cc10255c3834fde7c9e715cfc2b644a096166baea9", + "seed": "b10f9c7cdb7f29b9fccbb4fb601dd78a3651a3cc713441b589f938e36f3a7e7daf58ca4e464362faffde22547ffcc3101534bba96ea058e8e3da934cdefa92686ad28df882535c54f59968f4c9a34e4e006d8dc570b640065b0e7fa49b620491648c293bb39b0edd95868257c84771792860682bf80100f221fd68890603c13a1e2d3fe610453a602d87ae2ea848e56abd82000a4864cb28f31d2c56881513412178b38d6f31f8d04ea34a44743e14f0e78e793dee64ae9cbde6526ff2870dab93682f173bb2efaeff0b3f2222aea16185dc8b74b93ba891d3a9440c090acee33332a9b67f5548ea7d60e0e23faf9728696409f4c40d8983e220ab23c1f4ee1b911fb3dc3d3f9844045d5a3ea2ed42a877ae8240dd3afbcf59468a283a54f4df39d47c7edda0e33b27da8817b1a022029783c01b1760205f490535d89fc373df1fd8a11a91731bea8f956422a490d8fc31d86975b1b452210e842ed38cd5112cd709e96d6fa4fdebf27e530c5fc2411d26a8c1d4325e36a0f785d50ad4710320ed780dd4ffff4e9cb50bccd3a26643b9291d4088824e248a899187b34e69ca306a6c06bc5a6ebb854a60e9856524149d76f76ecbfa4536bedfc0ccc848ef4be0bb9934ec246cd18d639cf2a5c7659f7f4ffcef5c7a7ba1a373e03dd50b3cb770b5a258b15b7e9beb650faa3e657a49335e178796b9ac193cfbd88898125c50e0bd2691ea4ede11fbb7b6a0f30e867248d55bd26d62881de4d10632cce37d6b73872f8e3ab68dd267f2423ae1ebb1e9a7f33c499313eea8b0daf47fd04694f260ce090c2a2642e359d715f77b9fe7a630de02de5e1c52c6dea3e2294cdc9efadbaba800f2766585d36874db463bf090ead49ef5868e10666814fe64e2554f7676d2c62fcd2bbaad7e3ce93af6b44200f9355c6a9eadcc449a5663a86d6882d8e256d3874dd7e6474aa83cbed13a3822fa78db36be999e69a5a69727d41c3c992bb79efb946048808e742a82072ac3ba8aed131c147ad7d5f8cccd8f8d9d7edfa537d610e971ecfbb033861d879e44cc1b4ed400b32aac318d671153b99587e0bb8c81436fee5931aff8ef271db8a895dc5022a69eee9a3fe93eb82856e575afea4252db463327a9bbaf3e1cc8d3e1e73e138207bc5973135a124633ddc05c7b1e11180d0e350c5918d85e6e01143e1148c308c660f87d11c777a9b397561f9a1b692185757167373cdc5c42bb9dcabc0b4263f02ecc171ea081cc298c811cb957a32a01949a223321dfa55e6d41ac06612874b85f763ca5a7cec2ea4a8748973442eef78a8fccbf5ed434506e68d87ae97e4267b73b2645364fe0ac2696f4510c40d5f00cbbc3ada81cda654356324194bea8cfc7ad8b68e8d987b0755475e4deb076db66d997c1d39be3f2ed10f1c5db23e0e1523c79190cb932765a333e995d", + "r": "06eb40567b61a36016f3d835055132e7f099908f027a302368bc29539858d0a71e18d43278e871f3f8577684c988c6b3b37ea04a01ba0cbfbb0c2eaff7575a482f", + "s": "fb0b38d0bc0c00c605ee8126e8a603fc3356f8f754e6c6d31f32a20eededbbb4e32bc8f63943f8abb5d34fa8b88061a99144cdfc416e2967d670c8638987b6b601" + }, + { + "tcId": 152, + "message": "21d9dbcc62a4c6ab2f3904c77266cf88b7d4276743f970cd05ec8e2eae6f1c5426d6fcbae0c987f4dbd88ac0a9e7d1926e6e009cab1de31e93bb95ea98a284b9f9adae44f83ef7b870d385261704899ad627d132281502d51af5f8d882f8c761ffa1c43282a8b940a129b1adf2fd138b9317e26004835bbde031ecb27e99e121", + "seed": "97e3e1e5f03573cdd64f82d82fa43dccfa2a2ca9c57ccc1cc5345930b09f168923d6766673a72581103fed26b7078e917fcdae5979dd836baac74c1ddd2cdf84edb4cf4ca421e04a28ef29f875e31b269cfe1db2a6cfee8e6703e9c3ef598e293f219698a874aec73c65eab04484b23e72462217472029aeaf59f1548fef6fac2dc684109fa8b49482a7a573967e6f74face901762c69bcb3cc52464df6ffb33db1d6775589ac8a1e1fd0f8f2b5834ad0a06588c61f4e902a6b2edf18d4e3e63428fd7c858883a98d014ec65aa43a8c484665b454fda1d3e31594df2afeef3f64ef49f4b30bf351e8362735b43c070a405c86f8a232263e058462bb2608ef021949c6b6a5d6cc592fab84c32cb6a1c342a64aec7ca39bd6eb73f1d8e6e608b03be3a60473efd13a3a4753de96be26b454c6219a062f3cb4ccdfdb2d7eaf7f447e52acd3c1717984d6048aad95974d29237b24170e3d6a6afdb8b6abbe39d55bc2edef295891a141edc57afba8177574812d8f6d7f9a29ab376f9b83e280bfc7c7d8f0d5e7974d85e385c45f0302ac075d0c2e4b11faba583c850ceebb512cfe51ebe99f516afdf6e2587b4eba0b66ef52e3eb61a7ce5fd892af978b2a3289c7d69a15076fe976e687cf82b2aabcb13f8e5d3af9f4ca903b3c075d5d87118290fc1910bd8d8c17c5281a97a3385c6b33ebf3d47bd35043e80013dc15d2c7f41563094129662eed6b9fe69a480f60402ca04abc406c2658197a5a3b135dffa9d796078238699472f7b8a723279ffe3c8c70693797008277e78bd7e83de832457980c1933a4f3e4d4ee49527e853e154f3aaa31b01098c3b786fa5d7a200c816fb1a45d3fc569f94295fe67ac2a0e5cf2d267744d41b998549ca4c6048264bc44c53f7432d3fa3019e51166ebc853bbebc39d64627f5b5f49fbc0e8bc9f08a3fba2781b00b3f30b9a7343c5c6ce429bfd8f91bdc722a5002b25c983c2ff1c1c8b354f7a94b9c1f0f31c3c18ab0a5cf83d0ef88324a71efd77591a579063ed3315d13edf73b0f4f417d62a9d0ee30647e8df303abe504239b7c6b2de7a8a1c36d34ed3372712b24a746a41875b94ea9b4696fac39bfc90c97a95cf42513998d1e5b13c460ccbbe6643ce025276ac736a4aa6d43d60b73ac2b8586ba2de1fe6b17c2b03b026ccf20e12305bb8b24bfe77071431a2e4e90de4c0fd780f77fcb88e30ca29131266cd29d6a5e426d8761de38e602987be18b33c8920042c23a8b21789deadfc16a0c6f7f81e0cd60eb58083960fbeceda3d8211ccf2b6fa6cd215caf89e70a1ef711fb95a18920414b20005e9f8f5edda7a928465e82097faa93f9862adfcabadcd91707d450fc95ea9d37ea51f6edce2c75ea0a9b61d37f8126862257052e1edb17da5e6621ad6b8ed647f6858cc63b1893aca629bd0fafb6ce078cbff", + "r": "b839009089be9e26ef2caf262c7a8160771002b2e1f76c8e4e42495c394c30670fe3007b1e3e08979f6877d72530aba3ddf09c269446dbec0d00ad058a479d2108", + "s": "01dbc72ee6e1afe27d70c2a8f5c01f70bcf04b5285dc9ea9b95c586c1fab3346f10eee8ee301b2e075d41033ee6bef6fa38a76d132fce427fe37f72d32ceea829616" + }, + { + "tcId": 153, + "message": "8d5b87ff1d99d1116e20ff78405295c653f8499a95a870e2496891ea769e8620b749871e05c163250e87716531fbcc3aaec1d78bf98b4a157a8dc080bee098e08631730d8c44872a844326dfbdea6f09e850cb0f7f0c522b5614628debe76934672f50a005b58a79d056984cb6a029dd1aac6727150010d6d178c217bd58801c", + "seed": "0c67da63fc75448006f8d101eaa36d636f4229798a2b67a012a353e072cded11c4ea667739d7115ccea4ff0540242356250815549d0963e71316e1d6e318457991407c6652e4469a28cbd8a595de26b06eb48acf4553e4947608a5cea06bdabf401d97c2cb859d3d3e6e44ae3e743a7214a96770cf3de701de4bdf3d84152bfbbc37dac2d5fd93ab62d4a2418535186302a38879c4781b3c14a2b1096e2f0d8991d7ec82ac4f12159de71dd7c6813d7f8e54838af52f19febf67d6d13d7fabc3b9295313df22853f056fcadd37181bedaa509e8f286ae7ed389803319b48859fe708a823af3107200952ca34e5384aa6eadbadb130e4e5dfd25d3c216b0fe3a1eb4abb708d867d636e1db6aec0168e97065205d8099115cd3666f01baeb487e4c3b262a3754eeda962239589361aeceef0a7115e28a82575e547525230621d792be235c50599a3ee6ceebf57d268dce4e2e7737b3252b06d37a1d168d8de2a7166ec9231ae0d7391898be2e49cad292b8b69670649098910c58376233b911755d7c87f989a18417ba749a329c98f002215809754b30e583f56c2e443ed1b786ee3f8e744db51c6584be2bee9b63d97b55e13673a6146dfdb6b176a775d319265adee0d1d6362536ab3cb6e84d96b400eab17623fcb882a86a30f70097af62c0cdaa226208d89c4814e031292b99b9f1263a8b28b4a386eb8898a2a0b4dccf02d7cd945ff215fa93aca6c9c382df4b36c0824c018699de12cbc1317426fe0b457066ae18a0658d7981effe2caa3588d63edfb7e1bc4abf5c0bb478fc4002c76813b8f373232a632083ebed3ecf00645cc061f57ced32046cd72a3fee30aa7b2450284b3640a016d41e92dbb6e5772f3bbb064a94ddac748420140cf8bc157461032497e1e8620849ea51f63e50ce69a3be85026810e298d2914e77bf5407a63affe9bdbbe44068df200e48d76f07019e975ee0360b6a0b056dd40c74b3f71fff2fde3d658ff58d05168b50dbc3221dea891aa2431124ee8801a791d1c3339266fb4a83e56a31cf102901e6506764643bb28579f5fc6771bdca8ec38787e0d8099853392d06a7f134544dd0352fe3648dc49edf742d2270e5e7c8e583ca73da1d81adb21ec67c179c40c406387fcf7439ff128fd0056b3a727cc40063dc4209d2fd4048a8935befab7d0cb7edc701a72258bad65ff2eebe6c7c97b736bfc053e5e9bf9cb6ea3d86ffae335127aaf00a2c458746bc5e58d1f33fa6c1025e3936ae72eeefb1908b9994348152fe44fffd7a695ee6eacf5a410d1a6f8465b0d041735593077e2a97773406dda9d7780a28d5eb88067aa3a054a0d31d8fd24f212f242a36bbf63809f416887840f5adc182e027c0c52344a17ddfea8f2f29426500150d0a0e920f10e7b11b38d0b5a2fe0bcb3bd8c3fb0809f8ef77b779021afee4848", + "r": "9fced3c93e7f65482e4e424a29e2a516d39468a2bd5d4855e287f66729275e253b233f5c51e4e83d08571a17aed35a6193ff4e5cc576a4492279c4531294904bb1", + "s": "f32f30b9e51a07037ba94f9fd3d7c2684bea5befd81143eb70e361dc2582b9307902e3db2cc9cfab0dc56371c814e1b5c3d9468d00ee2e13551e5e7479fe116b47" + }, + { + "tcId": 154, + "message": "ce91890c982f57a074e59532068da20e0dca9e176339dc8c1b2c793ddba4e3e5c7a17bd1dc795d33851e2430fce5dd8ce0beffe70ae8b84a636585f562dcbe98169118e41983cc0cb2a9ff1c833ff2a021db1a993cf976df859555a9850fdd843aa870ee86fe68fa583ce181c83ee0b80f0b053f61f941867f9ee3817e254894", + "seed": "4e37ea7d7a55d0d39df977822d8f311c44ceddc205f60100c69d82cee3aa337c358edaa91449964f1e5bb866c634d595204cffaa478648fbff17b5c7f57ef177085a004f63fa0ccf066965acff0cc9c5b617cab9eff55dbcbeeb6e23f3384b0d484db1d8c94ffc590e1ed21c93b5a65d7895beaf052ee109ab41c696a2d7c872f323ce65effa8aefb12cf042892e638dd2769e3e318678571e5d8dd7af57aa1812daaeca180084420608deabec23a2f0ac111a6f715210b31f3813095309b2188e840270568e08cc7875da5e24e570abd69264224a986c74ac6ba0a0e12be719b054b6a91a732a0c6f2de7a2974a6451eecf6f5b423328211a8b53c75b69bf0a578f17e0774e0677254051bcfa870dc05033175c433d6b76ba9b85448d6f4432600125edc3cc2190af863137254c142e02d7417ff5bbd7379e42f48cc25d8b941f8de936f98bee9e8e2d44be61bbb19f292260a2690264061245ffbb579870e718b098bae333103c2feac5593b75322c66479a051006a803251acb7c651a376e3e77b06d015dde11443b3636fd44582af6941e259e33bc51da43bedffcf286a73d3a4e8d4d4abc906549395a75b7b60499bd18f17dcd3b38e6653e6e06730eebac5bbb9a0e2b3cf363e80c4a68a16b68418e0a21c4c6a02c9f9a0b6a4f9e8134e0c6ffbfa0e03c87ef402cf360632c2dfa34a4fe859a91eb8e8fb529836fec3957ab2df54be911baf2e1573e3353bcfcb1d376cef0cb24795c180b5aed255cc1b6c3a07662cf964165c4e9429d139f236ea7c01749b4ec8055004e389baff1031afac09701e72a26e9e1e014b038043c396b9f5b1ea3100418a570a36ced27c5296e79daf3cdb0d8abab87c08664a40f0026d8684618d5aebe7354a0c0e5dad7000653a6f07b0cea396ef8ff4db4869029284804f09badc8967a817a00ac4a8d5d825a2d14accc646a301075f429726ee126258feb7f0fbc877bfda1be6df0b7eb2af3f36dcb38782b3a4d9823208cb93c1dbe23f0b1f7b87fc9c2c518642cb6fe90f91ffbd5808776171f8223b4f2941dd39cff69fb65e684a66c8068c9e4494c2b78bd02e5833069f58416149e18c0a435fdfecfe0ea4d5710dfec2e89ffb3c63e176e6f536c121036aa3a7e455f4d0eec21c06f44c687ac55c77975c90dd725a78aa75b76496f7e92af0b3532389c5791960dda0a56f33fed2e5996b0d146d75d050162a11b785c3a12d180332eef57ab29198e5912f37598888103164153b536ae7094becbd98b506ee8e28c94522371f19b294898f8a786fd7978320e30f67e482ff1d908982d412593fede178af072c7fab06ae3e3e03fb14285d74fad9a68355c8ac67b84e3fb9898f4a270d6f3ac2046bf12ec4911c406b783ec32b5f4b76d8bbeb635c38dee933de7ebbe09604a6c11431df96ce9563d4f556ff9c4", + "r": "b993e48c7a2facef0b817502624412c0237cb07ef721aa4e12053a7ee69bcc26190a162181f95172ac4c0d9a140c143e897be995bcc94320e0f3ded780e86f58d6", + "s": "0180be2dddb88a816d28be821be943d88b4a212776bc53638d7888fc7aacab14408c6e0a0922f3fcdd72bf0bc6ce91c8232b4b1f14522de1a1b39f0064090e8bdb98" + }, + { + "tcId": 155, + "message": "87f4fffbfa78626d437facfb9e0164ff3aa2e52525f78689efdb71df92518d5d13ed8ca9fa08bad27b61359a632e02e10d4375126bd304149ef904b54adecf781a102aa1e37142b0b551f8290b2483f391bcbe61caa86e3d8f6f1b3cb97023748b41bfe621949dcca440bbd9119383b936bd256e525ab9daf74c35803ee7f170", + "seed": "5a8388d4f8a0a6640f8438fdd914d504678ac26caf4e10471e54b2dbb2d0ca791c4b40e0ef1da5f8015dab9fcd8cf6aa079cd97b573fd0cf2bf45238121d4e329b795b184dff973c20e2bce1950653b8d3be77d324a624c279d28f58c72e6a00b06ce77c6427fdb658f7efe80ab315623a1eca36f19be0124a92726986353e54055b77845a9169eed06c3781c0cebf28508338e1309883902926deba43843985a848802af5553ba022b8122da0b532a96c693f85a603b97a6e11a96cf0d74c85afa54a29a2f17b295519372ff419dcf0f0d50a0fe134ebf85e143a49d844de04605f4fa28b9a590c0db2a01aceb6de66753d1059782f428894c19931ee46d66d8375510c8e10bc619331dd78070976c726b777b1f88a55606bcbcc104c535f2e7e8a72e456277c2df5d246afdc1b52e3dc793eab6036e68ba107d66e9629b326d467663d07e0e2a323623fff83daeed59df9dca5b2815507455273deeb1309588edc53903e1ddf34cc43950e0d077a6be9ab8fae6ec46a3b01cafd42690b20a2f4891cce40692a9bbcfd247c46de9fd62117f45d3e7d52f7dfbf8651470deb193de34f28151d01484b361f40b752d82ba4c09bd96df8a4f45840ce1e9cc3aaca45e2aefed32693598db821658ebf8fd3e170dfa03aeb2387ba33f8f79b8c562debe3e021ba97e4ee079f0b772ad4a577841f2f2f6382bd2b9772d376c4dd484915cead0e1c5d6413ce434bbbe1d5250a0e634f762ffb5eb27d68fc3692a56a8effa327bfa65b75303d964348d6785b19b902db7900d2f2706b862458937295658b31272c3c6a6e18aa0f87bfb33a55c5c1a06d5dbac57f9cfd6ab12823a0c7fc9d49c07a7b0dab345c189c93abd1aaa66be4519874ff421fbb4ef65b5a3865c8a5ff50af79dbfa35971e28ebd955826ba041114cb131fb565db9e461595a2b4853c668aa53086e0e5df289ac399f9967bb3a686b5d4f3667794e505cd338d5a824c5f5f6668803d727311208299436049cceea13f4796b320ae269948cc2ba4d6b7fbf97d8a5fa44a4030affaae4696c9850ee579abfdbcd5d7267019b2dd5e1aa1322e42e865dad1acc14493612a429ee260f998bedf049a752e029447afed8c11affd00cb4af6c40c3f5cc5f1086a749041bf8476dd5bdb47827900f598449b55a054a307810c65be272ed045a1350ccd692cca52ad772ebf2a3e0f1e6152b6020825b83ee52a99d64ddf2491119ef7e01e2bbdce8627ef3c535e633b349db9dc8a56303adfd481478bf75d218ebc7b651f1abbe581a20c072d05939ea128f871de5bab09d017bd0d1e075ac3fd93d985032726443abc451cfb7119c2ba5fe3bfea6cb51a2dd2e4fc68741b5f0710a8bb85269a79fb6fa4084a923fb7aeb7d8fed8d509e796237200d9b0eaaa3ec2b92600f8fbe716b782120c77f2a2fcbeb", + "r": "01459d88224cb9a520011ffa10f776e182bcc8b1835be4d50f9290557d9f4beffeb304c649f42d1e013a8078fce392abe741952c27558621e169e5afac6294856775", + "s": "01dfb1a4ab36866ffa7b85ee7971d3d0b462207c64596baef3f8bd1201885b30159f8d8c185e6b33be0cc6fb207c5227e7a7fb65f2d9d8f343491ac5b54b75c545f4" + }, + { + "tcId": 156, + "message": "65af9763e9322793f4f800b02823681951f3278cd1882b541c6ead185d2d4d708e6e93026ab277f9cd865de0127257154bdcd9b553d37bf9b10115612bf41a52d913228039b4f62aa87b604c82dc5532cfd80c777f2683b1efcdb660dd20742dd3e0bd67a427ee585458dbd7846ac66861f381a022ed32967bc7a8280c4b8384", + "seed": "1f77eb89d3ad3f9a462312a20abe0e9c68edeb1a75016a8c1002f36b60cb1051c973e43d88346b5dbd81564128db45498bcab8ef7debe18dd9e5c13d817e3531e113fc90f3cdd203162c9a3dcf48b8890ae9a75eea5b144438221dda3508c76511ab142b96ac165cc09587520e85bf3f0f38cae8b59865a5825e29ed3745308a33bd46fe4a92a72692cd0b400c00dba7f35537f0f69ad7a1ff097d69c1175200045b59a0a3d495a9e6ecc5ffc8bea440c4050e3315ee951e460ccb02c02f5e4e7ffc53a8688b9ded459b62c0f92094d9df10bb4031f6222239dd8963d77061576f37a9cf8315792b81c4983fc9a7afea13d92d5fa99654fccf8cd145b3f67ca326b471ad72965b3dfc657203d9436e47cab7d1045b007c8259a2f993a8bdbbce912bbc33e29ed2dad013ae225bbfc997ec04485378d48649d3dc91b4c08b492f7e3e3c5423d8690e0f44fc48cf5767e0f4fa6135e25fe8b42f55b412839bc4da7f4e2d052945f4381e930a60c01a8a2eab41584790c7265f3c2bf99e88b5a844824ba370e2805f3cbf48a2ced82c9d01719dfe63d2a17520aff1311bd0092919189fcde99007a4cdd7da5ae23e0fe0e91d1f207231361f49f38d01656818b542879f077ec64369d21f5e2b9607c976f600472c5ccf7f969ea6db6e1c847d1bbdc5a449b77ad43bba2465e4ed18cc96ee8f738e898ce2cdc60382d73cb237a459da1a12ee95eb6fc77d13a1fd993c11543d470690824488bcbc14a334aea39d83c6340c902ddf70878772d64d39aa56e4f7212595c985369a3db772b06a5c0cbd06f78c2281aee7ddd7567330fb92966977e81042bb0ab6004fb4580e1ffe890114eb72e29d8b46854eb9345531e73ba6a84c24786d3207d03c0e1a8a11ce7c5fd378ba79f70dafad21f67559f74c38ad1d7aaf5436b87509e843985ba9a427de18607f8fbd92ff52d37868f7be034e800cf96f96288a719b11f6c91bac7c9520bf8a5cba39b62a1289018a35aad53c7c517d0eb8b4e08d3fc9820eac6d4f6afb112b1f8a2f1bc6962d90d0fe15d30c7588854a329cc79617676f81a73e520ac3d59ff7754ca89b669a8abed0dabfa5f50fb109b6682af7cd78ffb7e878839b2ed2c40d8b731dfcd7cb88730b2fdb4648cf5dc5e8deed10185c570e64b93cde24f2cbf0ff558513e6071272f93ee4d6711a88ebecd4f7f8f2c022d2f42abeb9b67b3d227d51cacc669ead30e8c86ae77d424a8a4a7ce6a28b27b138080871d0896cb34890c044aa003c8122ca2542ae4a744a04ba5f1088b88ae5cb05695a69948cc7c005f6044fbd165f97aa71785844396f17dc87706cea018cbc4034dfe349ec8ab882fccfd2b781b5ab5a623ecd9c4e981e7c35195bcb421ff26ad3a11dbe92d7ac72860953ee8ec4d517adb0ec9804048a94e6c9b32fae2622171d7aa2df", + "r": "01eef969e170b618fec887dcfea2a7967b05865148ed7927f5ce31a771652f1beb8ee1b633e900bbd9d2932d2fb26a4ab762ff51f7776a8dcdb4c6fac45dca401cce", + "s": "7b2e91da2742d5fea3af7c6877f50d81fbe34cd7a339ddc3b2fca06eb9ea380c871197c6637ef0793586d0dc0263470a86e0a4395c8427b84d3ca2d13b3572deed" + }, + { + "tcId": 157, + "message": "35e4a6474a5a5ffcc43b02c0e88c9a48047e2edc2598b1401f32b2c3f0f993797a7a57b01789e5f790a3841e4b4e98c2ac46bf3b05570b8d95bdd02f52f0a0485a4e0f804e468fc3ba3333302546fdef6105b39042eec889fba6f7a64c9f2bc4d4a965493efac760d6022acde106338d641dcf7eb474f2c0974e7a16a766c6e5", + "seed": "8f7be7f4df098a5d777a7eed07fa971fa9bd5cf91b32d6a7cc90b1cb65814ebefd45e91cf3964c9e108f14153ba8d6ccfaa9a0ca077c30c935309e38bd18c5b95baba8c84f7e288af68bfd5363e60c4dcd9da7ce44e6c9a2b2bfb4b25ef76b6f5f4646477ee1bb1091537c0dfdd2d753ea0a4537ee06f3d4372647a49629056c71da7f6267c52d6272ef5f2c424b81e7692e231052f86a6cd499bec090cd8b4ce27cd5f5b46a6b18736ef542def10b78309568b66993f44e4f266b0867edef0a2094a25df1d8b8281863a4807c97e2b361cd886cbf6ab6d3b8d961f8d45f665139376b3f8f83e72fd8813a55cf73c3e89c6a70f5e37ce90a4be1aa2087f629b43be0be60823f88510054612c87b1db4359400eba97ae54e61845fd86984d9da5d8b7a8a5789b93bb548a5541511ab54bac7a030d877be9ac73ad3236eb2f7d2448edf3f4b8bfe406fa37e9029298e5261c9ecd3d513839c9b24835c4f22d4b10b357da3c0f21beb8ae66ae07fba3de44919dab8dc3efc5d7a8e2b4abf531b4efe727e0db8de363bbc5ec7db8da730a3fe6c332eafd127b39a2f0fcdfb6644e3000bf804ec26f37d8909870b2ae6604cd03c385f539b249b49a955e65188206f7f9e5ef138ae703cfdebbd9f7eac1321a73c22ba976c8c1bef4cb8e55d87f5fa52d622328756668184cf69b17134241526be4b9b8d759ff574a12c7a4274bd8b6ad95165e360ad50b115717d3008cd136983d1404e71071cf7523ad02b2b5ff3ea189fc54f96e5be1228a8d7859de53d13422165bd9d65b3dce28149ba7c5763da36e49d8889472408dbef916b334f6fa5c0110729745f0eec587f29841d7b9261f9a86eb4d93942dd09bc6c866ceb26a73fd98a09eee22571e9991cc56d5bea1a7d5ae98f7ab1215188e2d1f5cd08ca1b1a4b988ece282fbad4e3a533af1ac17c0235fa657f08fb30d72fb04f839043b3faa5cfd3b50bf8cf6f1efcb8384e6cc6bf2e359c5f6b0dbd3d9274de367e8cc5a2ab76367ee6184243c0702ffeb0c43a10331939ce2deb5a3523804db4666b21f8b2bc4e8fc0212c3bd30c636c56b9e9b6d2d81ea21f26142f6b9ca0bba646b42d79bf99ad71e6805ee058ba68ebe4f58120e3efc6c41ed998974ef8af628f6e5f9154059d0179e1b70f57af8e25b14125a379cdf247af3edea3e556d044fdba6972bcccceca04dd625baa84217a6a6e8a410c3b3eaa71d396097994174bcc4d9fd64d0b581c1074f9ee378951b58c884ed3406a42c2e06b629780265e2b816259c7d369ef85c49196c65359d37f6d4b883bba9eecd80fc98aea7dc4777a990d48a63afb08bec3c974246c9324e9ee5ccf59105c5acdfe94fa7fe65c26696b1886ec7c4c74ca43c36dbb79ae16609b80c57bf97ca4855903a7c26109d53a70c204592b8fd411c340e66e3ff1db3083a", + "r": "018d2910df26d90395777ce8275414e85f3d5aecb57bc7c727a328ca40495d1f82c99d3a5a8b89aeee354584a042686b2f132688747b357daf1cb6ef2f2a18a54507", + "s": "01767bf9b7aa8079a1767b5cce1a4b6bf23972db69af1c5f6debf92fbf505535ed554001cce2a8c2c629adfab9b681841e3884d03954aa2c6f0cc7636526cb2050df" + }, + { + "tcId": 158, + "message": "e8c2e695ee09352bc58eca78fd9274d63e8f0f17adbc2cec2ea6f142fdbc60e54961ee9337fdba14b918df9e81eaf6843ed22fadae30b1d6561d93a81eef43a52d4b62f416b2a86e3dbd485e92820ac14f0f3141618e30ac550546df6cf7d2017672218bac45946f14913cdfdc06db9cfcff9ff0f0ba184fd60e39ab22bc0079", + "seed": "e700492983004560ddb765af70e2365eebfc709b5759aaf03a0d2762f0f89217da9429c72fb7f55c6935ee64f67b2677ca0611e4e0e6c49de13d5180f4d107ed454d0142221194b580ef9124f1391ea7d840e78749e615b52a6b8e99a9b4b1272f6ea18de959e9b4f0fc16dd3a1bbb3bb300533821c7842c6caa2a6b39a986a827dcfeb0d1ad153333886169f825e4473d2deed79d07192f005d0cc40880bab4f0121d4cfc99dfd6fae6c1e112fa17d0f2a1fcdc2c55d08a5bb2dce516a30976db781c872d513b51bfe4769b5ef33bbf093fed597a556ffd620fb62c811521dc4dec3aed453d6863eb2a2752b89f81cf76823640e0ca05695694c78e694730cc66634d168f2c511fc4743cb727302fd1a7568a8db959c0965263b0aa57a65b735e109320536c0b7d6459aaa9d226560f345bd512b5498387bb0942b57ff7c312df69c9deb64717b64bf222cfb7c7b6121089fcb5860dd55b2bf217c8bcbd2b4f92ddccdc7314be1674455d5d8373ab8701bdcda4ca08a26e325a1a0f1a5fc41c7bdf9a407bf978d9f1cc292fca397e9d1c9603c3b6cf39119763e54a557d14f32aa64b8e40d2f2f9f5e887754eeef8955dede97675ffef723adc8ade7631fe9384b4a7e0902f41d6b3e9590ed07b18a6bb1159aac088bafe90676f8f9bf637844a57820b45af3de905d06ad03515dd0749075617046ff8f85eb6dd3811af6da49b268e582c1e0d280d2e8707ab0eed7c49d16a8e924efc89ae8b80171a63b3396b606bfde87ea6d75ba43169781bea38b6dcb81dbdd38c96fb1a4db0f50b790847797fd82b7a488eebac1e31527696225a1959a6a9dbdbaa3562f094ef79b71f913c9cafa28a96f7ef7a8795989807778d9a784300711ec1a0fa8f5b2fc6c9a9aeea1e0be5a388a371bee574f0c763c40746c60a3ef6c77907d7544530694b9eaea72eb3d07cbd257200dfbbb7aa9d214ee5802ace27cb086f4b613dbe4e8c0d4416de9b90611430d1d87cd021e1c426c2a62d22b7c78c63d3d26a4c7a42ffd22a632acf2f4b3c786f88392e27349867ab52a23a0914fa66e18224f53cfbfcb7a2f5fbc3120e25c39c2eb10a4ff9061eb4a4c363f035e6373b5beeeb6679a4ce49e648c1d8497f82053a1a7e492152c08f4525f318f9b96bf424615575ba016435c69280445769db73aef46163b1a6fa7db1d74e87f5da1c8e39e8e9e6341cfbb29f5d22467d9c63dce4bec5077408f45b93fd27aba624290ac419830cf318b7077ba20f9cc638035fba3a111e9eca8ca59432d5df2f0d4505f510c0431b8f7d7e56a4ee27a7252548618dae2d6bfb8aed2a1988c4d93bad043299ff3aab9fc3f324e954f0ac0028cef512ffddbca82f734ef8e689f2d5962ea4ca7686100792c0621dbde2556778af0590f935f799ede347d3af4c77e5058cc23ebee9b5dec6", + "r": "15d94718e87111bdb33f0c9a13ffbb88874e0389e9a92d16e7464cbd4e970cb9be94b2276de524f1a35e6985e9529735c96fac45a270edcf288e490163f07e81e6", + "s": "e0a3d8d454fd4c15e33f4b3e37a8df71acb079d17c6570fe10d78b603e3a5cab6f45de8bdb225363f2a4ea0ba2378ab7ef5070a79e492cc45dfe9004eb83b325d8" + }, + { + "tcId": 159, + "message": "15ec3b08828d69ec8d3fe3cae203a1fd114fd64fc0cd4ae4ab3d3ef9a698a37278bccd1f5f8e05a5bd2783a74fb1162e09e14669466181e20b9a978732271310e7337cf931abdf57b91db142af557e43c47120b9a88ba6f4b6ffca3ee5bec36f6933fdcef4dba02a9beff4ec5638e2d6d87d46f6967d43e40171d4d1d57b46ae", + "seed": "4dca63ce24ddb1999dfe0905aa24818b13717efca16f445495b4ee7beee881b4ed06667af40fbb2a4ba8dbdeb618025b25249228ea76469db6489f3be89be06840d20cfa48ee31053e124a9a5093cfca89a551d0c6b3c8d7eb45b0f645da2c4bdf31a03633ab7e4530f369d8fa404d380bed8de07ef0e25bc7e48b0a2cf548359fbebe17cae2e71873b9db923b18104720c7f8117f21ca6a0fe64e6d5c3b323415b686baf990391eacd68ac9811e53c33cd5397cad0dab20157d9c251808afebbe8d0d4c268736230e83ab0ccdc5e7d75cb5d271dcce698f1ca01fbefe4c84033e98227e233731cfb68387b6fc0e0108351453cd74980d1e689485d149adeb8302f19fd8fb6aff883475c5e7ba69474da48fd02ec6b624c4dd95308683fe01c4d9c53558f25084a736231e6ea07e50e4dc4c32352d36711d2e1e2cc63dc72a0fb973a9e023101d727ab1179af5a7039da77aa2ac2d23f2191b34a92a1256e2a5deb539d722f434b5dbee6e016a6b2cbbd482798638ffd8941593864886d9636fc162d5928fe944ace763066fd97c80b38312a66858a3090207000cffa4cd19c2b2804b736527f8cbb19fb8128c6ba90975a61cb83cd7723554a1e0219c2fee1057103d950e77013d9302816136f76f1bdd5f9a08ca9b546e603ba5c7dae30a0780cb876cc1e59c7646324e02ee3be77cae78ed277e88c045f9bb7a9cdf09e491be4e5a38bb431acee438f297b9c2bf08f58a55951da4f89a9e2fbbd64f3e34fdc77734d5a8992e1c52f7380c94ba9bda6c4399227c37434045fbea0caf2cc7207ce9ef7cb9b1f54f6b87b71aaed839e48d123709cf6a9654deb0c44640a392d3660e8ebc2050055a9abe87df09835351ea99893b31b0eb321a0d0e7de1537acfd2f965f1d77e5a822f2b31576d3770ff47c88176a02e4995a94f5faa21851e51748a57c15c0734dc08745eda5ac43cb24024d2efb992c902eb72a1265aa0e6601dab4e2766dc7914c1b3486469ac651df924ad6c864598a72c942cb91a8e330f61084b8afc9949651ee45d122b837beb93cb058116c0833a400eb80737afb8d23ed9cf2004ce766576f8fa144b053b298cc9c0f31f5f1e42726ecff7a641cd44cbc139753386bd16b4dbf3e1587df37014105ac84ce348cb25834f039ac56918c528b9a27809b8c0662e4beb2777b46282f0a06bc7acaecbbf279f64d7f2a664cf8668ca7c0f9e55a9c365312c6bea8d091de6ea2e032dd1899b14c2a9a6dd94c88bd2d1be6d902498e022ff05a2ea1a406634addc446f3c63f1b4a2f4d956a9e31650bcb72128818e22798751e7c57e6cf9b309de8b8558cfd07ddbdb94edd3d4d5f7bb47ee5aed846724e33e8781753b314f470b1a143b4dd11a0f51e396dbd762cd435faa62f0a31318529aebf70c929b2702a87c002dcd82a07d42984c6f", + "r": "01157d2602585ddca93dbf073eb3131930ec5f69fac5674d7fcc83ef66a156168594ec1828269696b9f8f76aba28d2ad6fa85310f4a75d3a4f83f65d63fb1345649e", + "s": "0172f75c36fd039cd8d83fad3ef9c15cac95be44e58f0067bbc9f9f84fdfe29c8a319bcdbe8eccb0f33385f3885a0654c90200621a8aaf78ca5c8d86713e5237cafe" + }, + { + "tcId": 160, + "message": "7f2594630c345aec007d6c055df4001502550ab2604f8a34da25b6df4012906634b494432a37254be95ed20a193a807821f953dfa57de01468be9a317f434ad2878540dd6c220e5534b0304064f3f3745735228be518ec74910165388d59fb199f36fe0cafd7ad448438f792f17116cef7278b7a5de9098592efb51a67928e2c", + "seed": "a0257205067f0c632ae5cb48fe2475ffc15850f3174343aa502e13f58658b4e128b167c7d25e65642e9ab88d36644c36dface9bc5dae0e4b8dcec2bfe3f058fb86b443541fa81d571a3ecbfa2dce9ccc64b616a8e3d46a10e3ab1432a7b4ff4a0cc6579d299e8b30a04d1a4444c7969ea090e596ad5e354bb8002b6281ce7356c49bd094170270212c1c411c87f50d12862191da0a76f7a9f093679ae9e0e4737d1e732d67511f9837abdd89b437144d1f12a0210ed994810b9d78affcdc19de8c7bb6909bf1c91fe44dc2bcf2ca9f0fee3afd68e7b374d0bf2d2d90c397e2d5b9554c6e54ff1e8f49dc287801c4b87adac88b3ff1d321ea4cf5126070bc53f5cc8ba0c0055ad6024687a4ae519bfbf6b134c59025aeef7513adff7ea229a8ea01d9d02825fa62e17caa2d03e529703c88a5e3c1382ae04675080364824d179dc554961a36404fb2b3fdc1568371e43222dc8a5c4f0673217ce1d4fb80b531597f1535c5741f8035ce942bcae2c2fd18ede3bbb490ac73b5378b019ed7b2df2c6c6ba0f982649d581ab67642822e2bbd90a512149de7d5d73ffa1669345b20f2a51089ba9c658324bdc0c4ebfd82802fb424b49e03c0b2bfb59daeaee0737bb660013e1e3f0f9da69a0d53eb58488f5493b5ab72ebeb2be82fc2992db67f1c54ce04ae9413a61cfc567456fe7ca0d7dd6438319f12bc08c26c9dbf07c32c15a45e9cdbe158f49c411e69b993c8ffe9cb7c7f5e951a2826ca698e42421dfda82bd10a79ab3a8c9d280595d447f215abe481cd76088a0740c84b55355cdaad8aa46c40d78872907b749907dac0bcf5d8f602e2907cee48997de73a2269b5ad7a12eaec56f804bcafd2b0c3b853e7df7b05264a24e7e8071eee46dfd538e3618846f305171ff4630a057b934df39da17ad93e0fe3e863e138f9dcff3e7bdbb8c7a2289fa767a172c9ae9345576a686ca8ec604dc9368cd3f965bb47b7f16409b3db1d505ccb8e3166a5b0a8a2dd8dc8c46091048f5a7dbda7c3f60ba9b3243f75e9a6ae6abfd3d585ccd2d0656a1712993b65e7aee61f36cd1350874fc18e1bea2d74f67ce3260f64ac2134df41ffb1e54e0ac76af852c38a3c120cf1f33059ebcda22e0f75a2d81b0f71c7beac3b8733eaa2dee110ca0c3d70b153883ab33fe29b417d0837ada3a583c8109a9df2eb8ff827e4f14a91e799524962687380d2b53305558b79da210e261e212fcf7edc18c63d637a92438150b5ecab3b37f81615de18d3089f76be86b4fbb3fcabdee2ed3d85969158bb0297107db321e9fd6e0433f97f938c566860d664aa09ae9db7ea291cc907bdd695befc8b8873d8b26969ce0fed0f1def0e8cbe8c9be104500b1764ecefbc42d515aebbfb21f1b7badafe638e9f0d331b9735314a5f24f1eb2de8d967e06432998942650029dad9ad8c1017", + "r": "01543e7177c5effd86817a653baf74a1d3ce64ac6765b3b9792fe06462fee2f5b3e478ce8ef5a871217a1d4860e270b61450cb383d0568c796f92449bbaea72430b3", + "s": "015768e7873f39bdfd94fde161b12fb554460e22f405fd3756bde90b85fed91b22eca56fa4f6225db90b8f13e826161c2de2fc36f48bdbd962b5cb5bf715ee122ca6" + } + ] + } + ] + } +] +''') as List; diff --git a/pointycastle/test/signers/ecdsa_vector_vm_test.dart b/pointycastle/test/signers/ecdsa_vector_vm_test.dart new file mode 100644 index 0000000..fa92877 --- /dev/null +++ b/pointycastle/test/signers/ecdsa_vector_vm_test.dart @@ -0,0 +1,192 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/export.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +import '../test/src/fixed_secure_random.dart'; +import '../test/src/helpers.dart'; +import 'ecdsa_vec.dart'; + +void main() { + sigVer(); + sigGen(); +} + +void sigVer() { + var vectors = sigVerVec; + + vectors[1]['testGroups'].forEach((grp) { + String hashAlg = grp['hashAlg']; + String curve = grp['curve']; + + ECDomainParameters domainParameters; + switch (curve) { + case 'P-192': + domainParameters = ECCurve_secp192r1(); + break; + + case 'P-224': + domainParameters = ECCurve_secp224r1(); + break; + case 'P-256': + domainParameters = ECCurve_secp256r1(); + break; + case 'P-384': + domainParameters = ECCurve_secp384r1(); + break; + case 'P-521': + domainParameters = ECCurve_secp521r1(); + break; + default: + throw ArgumentError('curve not supported in this test: $hashAlg'); + } + + String alg; + + switch (hashAlg) { + case 'SHA2-224': + alg = 'SHA-224/ECDSA'; + break; + case 'SHA2-256': + alg = 'SHA-256/ECDSA'; + break; + case 'SHA2-384': + alg = 'SHA-384/ECDSA'; + break; + case 'SHA2-512': + alg = 'SHA-512/ECDSA'; + break; + default: + throw ArgumentError('hash alg not supported in this test: $hashAlg'); + } + + group('ECDSA SigVer', () { + grp['tests'].forEach((test) { + checkSigVer(domainParameters, alg, grp, test); + }); + }); + }); +} + +void checkSigVer(ECDomainParameters domainParameters, String alg, dynamic grp, + dynamic vector) { + group("${grp["tgId"]} ${grp["curve"]} ${grp["hashAlg"]}", () { + test("test ${vector["tcId"]}", () { + var qX = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['qx'])); + var qY = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['qy'])); + + var r = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['r'])); + var s = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['s'])); + + bool expectedResult = vector['testPassed']; + + var message = createUint8ListFromHexString(vector['message']); + + var pubKey = ECPublicKey( + domainParameters.curve.createPoint(qX, qY), domainParameters); + + var params = PublicKeyParameter(pubKey); + + var signer = Signer(alg); + signer.init(false, params); + + var result = signer.verifySignature(message, ECSignature(r, s)); + + expect(expectedResult, equals(result)); + }); + }); +} + +void sigGen() { + var vectors = sigGenVec; + + vectors[1]['testGroups'].forEach((grp) { + String hashAlg = grp['hashAlg']; + String curve = grp['curve']; + var d = decodeBigIntWithSign(1, createUint8ListFromHexString(grp['d'])); + var qX = decodeBigIntWithSign(1, createUint8ListFromHexString(grp['qx'])); + var qY = decodeBigIntWithSign(1, createUint8ListFromHexString(grp['qy'])); + + // "P-224","P-256","P-384","P-521","B-233","B-283","B-409","B-571","K-233","K-283","K-409","K-571" + + ECDomainParameters domainParameters; + switch (curve) { + case 'P-224': + domainParameters = ECCurve_secp224r1(); + break; + case 'P-256': + domainParameters = ECCurve_secp256r1(); + break; + case 'P-384': + domainParameters = ECCurve_secp384r1(); + break; + case 'P-521': + domainParameters = ECCurve_secp521r1(); + break; + default: + throw ArgumentError('curve not supported in this test: $hashAlg'); + } + + String alg; + + switch (hashAlg) { + case 'SHA224': + alg = 'SHA-224/ECDSA'; + break; + case 'SHA256': + alg = 'SHA-256/ECDSA'; + break; + case 'SHA384': + alg = 'SHA-384/ECDSA'; + break; + case 'SHA512': + alg = 'SHA-512/ECDSA'; + break; + default: + throw ArgumentError('hash alg not supported in this test: $hashAlg'); + } + + var keyPair = AsymmetricKeyPair( + ECPublicKey( + domainParameters.curve.createPoint(qX, qY), domainParameters), + ECPrivateKey(d, domainParameters)); + + group('ECDSA SigGen', () { + grp['tests'].forEach((test) { + checkSigGen(keyPair, alg, grp, test); + }); + }); + }); +} + +void checkSigGen( + AsymmetricKeyPair keyPair, String alg, dynamic grp, Map vector) { + group("${grp["tgId"]} ${grp["curve"]} ${grp["hashAlg"]}", () { + test("test ${vector["tcId"]}", () { + var seed = createUint8ListFromHexString(vector['seed']); + var msg = createUint8ListFromHexString(vector['message']); + var expectedR = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['r'])); + var expectedS = + decodeBigIntWithSign(1, createUint8ListFromHexString(vector['s'])); + + var privParams = PrivateKeyParameter(keyPair.privateKey); + var rnd = FixedSecureRandom(); + rnd.seed(KeyParameter(seed)); + var signParams = ParametersWithRandom(privParams, rnd); + + var signer = Signer(alg); + signer.init(true, signParams); + + var sigGenerated = signer.generateSignature(msg) as ECSignature; + + expect(sigGenerated.r, equals(expectedR)); + expect(sigGenerated.s, equals(expectedS)); + }); + }); +} diff --git a/pointycastle/test/signers/pss_signer_test.dart b/pointycastle/test/signers/pss_signer_test.dart new file mode 100644 index 0000000..cc0bb3b --- /dev/null +++ b/pointycastle/test/signers/pss_signer_test.dart @@ -0,0 +1,243 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + // Example 1: A 1024-bit RSA keypair + var pub1 = RSAPublicKey( + BigInt.parse( + 'a56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137', + radix: 16), + BigInt.parse('010001', radix: 16), + ); + var prv1 = RSAPrivateKey( + BigInt.parse( + 'a56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137', + radix: 16), + BigInt.parse( + '33a5042a90b27d4f5451ca9bbbd0b44771a101af884340aef9885f2a4bbe92e894a724ac3c568c8f97853ad07c0266c8c6a3ca0929f1e8f11231884429fc4d9ae55fee896a10ce707c3ed7e734e44727a39574501a532683109c2abacaba283c31b4bd2f53c3ee37e352cee34f9e503bd80c0622ad79c6dcee883547c6a3b325', + radix: 16), + BigInt.parse( + 'e7e8942720a877517273a356053ea2a1bc0c94aa72d55c6e86296b2dfc967948c0a72cbccca7eacb35706e09a1df55a1535bd9b3cc34160b3b6dcd3eda8e6443', + radix: 16), + BigInt.parse( + 'b69dca1cf7d4d7ec81e75b90fcca874abcde123fd2700180aa90479b6e48de8d67ed24f9f19d85ba275874f542cd20dc723e6963364a1f9425452b269a6799fd', + radix: 16), + ); + + var slt1a = + createUint8ListFromHexString('dee959c7e06411361420ff80185ed57f3e6776af'); + var msg1a = createUint8ListFromHexString( + 'cdc87da223d786df3b45e0bbbc721326d1ee2af806cc315475cc6f0d9c66e1b62371d45ce2392e1ac92844c310102f156a0d8d52c1f4c40ba3aa65095786cb769757a6563ba958fed0bcc984e8b517a3d5f515b23b8a41e74aa867693f90dfb061a6e86dfaaee64472c00e5f20945729cbebe77f06ce78e08f4098fba41f9d6193c0317e8b60d4b6084acb42d29e3808a3bc372d85e331170fcbf7cc72d0b71c296648b3a4d10f416295d0807aa625cab2744fd9ea8fd223c42537029828bd16be02546f130fd2e33b936d2676e08aed1b73318b750a0167d0'); + var sig1a = createUint8ListFromHexString( + '9074308fb598e9701b2294388e52f971faac2b60a5145af185df5287b5ed2887e57ce7fd44dc8634e407c8e0e4360bc226f3ec227f9d9e54638e8d31f5051215df6ebb9c2f9579aa77598a38f914b5b9c1bd83c4e2f9f382a0d0aa3542ffee65984a601bc69eb28deb27dca12c82c2d4c3f66cd500f1ff2b994d8a4e30cbb33c'); + + var msg1b = createUint8ListFromHexString( + '851384cdfe819c22ed6c4ccb30daeb5cf059bc8e1166b7e3530c4c233e2b5f8f71a1cca582d43ecc72b1bca16dfc7013226b9e'); + var slt1b = + createUint8ListFromHexString('ef2869fa40c346cb183dab3d7bffc98fd56df42d'); + var sig1b = createUint8ListFromHexString( + '3ef7f46e831bf92b32274142a585ffcefbdca7b32ae90d10fb0f0c729984f04ef29a9df0780775ce43739b97838390db0a5505e63de927028d9d29b219ca2c4517832558a55d694a6d25b9dab66003c4cccd907802193be5170d26147d37b93590241be51c25055f47ef62752cfbe21418fafe98c22c4d4d47724fdb5669e843'); + + // Example 2: A 1025-bit RSA keypair + var pub2 = RSAPublicKey( + BigInt.parse( + '01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9', + radix: 16), + BigInt.parse('010001', radix: 16)); + var prv2 = RSAPrivateKey( + BigInt.parse( + '01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9', + radix: 16), + BigInt.parse( + '027d147e4673057377fd1ea201565772176a7dc38358d376045685a2e787c23c15576bc16b9f444402d6bfc5d98a3e88ea13ef67c353eca0c0ddba9255bd7b8bb50a644afdfd1dd51695b252d22e7318d1b6687a1c10ff75545f3db0fe602d5f2b7f294e3601eab7b9d1cecd767f64692e3e536ca2846cb0c2dd486a39fa75b1', + radix: 16), + BigInt.parse( + '016601e926a0f8c9e26ecab769ea65a5e7c52cc9e080ef519457c644da6891c5a104d3ea7955929a22e7c68a7af9fcad777c3ccc2b9e3d3650bce404399b7e59d1', + radix: 16), + BigInt.parse( + '014eafa1d4d0184da7e31f877d1281ddda625664869e8379e67ad3b75eae74a580e9827abd6eb7a002cb5411f5266797768fb8e95ae40e3e8a01f35ff89e56c079', + radix: 16), + ); + + var msg2a = createUint8ListFromHexString( + 'daba032066263faedb659848115278a52c44faa3a76f37515ed336321072c40a9d9b53bc05014078adf520875146aae70ff060226dcb7b1f1fc27e9360'); + var slt2a = + createUint8ListFromHexString('57bf160bcb02bb1dc7280cf0458530b7d2832ff7'); + var sig2a = createUint8ListFromHexString( + '014c5ba5338328ccc6e7a90bf1c0ab3fd606ff4796d3c12e4b639ed9136a5fec6c16d8884bdd99cfdc521456b0742b736868cf90de099adb8d5ffd1deff39ba4007ab746cefdb22d7df0e225f54627dc65466131721b90af445363a8358b9f607642f78fab0ab0f43b7168d64bae70d8827848d8ef1e421c5754ddf42c2589b5b3'); + + var msg2b = createUint8ListFromHexString( + 'e4f8601a8a6da1be34447c0959c058570c3668cfd51dd5f9ccd6ad4411fe8213486d78a6c49f93efc2ca2288cebc2b9b60bd04b1e220d86e3d4848d709d032d1e8c6a070c6af9a499fcf95354b14ba6127c739de1bb0fd16431e46938aec0cf8ad9eb72e832a7035de9b7807bdc0ed8b68eb0f5ac2216be40ce920c0db0eddd3860ed788efaccaca502d8f2bd6d1a7c1f41ff46f1681c8f1f818e9c4f6d91a0c7803ccc63d76a6544d843e084e363b8acc55aa531733edb5dee5b5196e9f03e8b731b3776428d9e457fe3fbcb3db7274442d785890e9cb0854b6444dace791d7273de1889719338a77fe'); + var slt2b = + createUint8ListFromHexString('7f6dd359e604e60870e898e47b19bf2e5a7b2a90'); + var sig2b = createUint8ListFromHexString( + '010991656cca182b7f29d2dbc007e7ae0fec158eb6759cb9c45c5ff87c7635dd46d150882f4de1e9ae65e7f7d9018f6836954a47c0a81a8a6b6f83f2944d6081b1aa7c759b254b2c34b691da67cc0226e20b2f18b42212761dcd4b908a62b371b5918c5742af4b537e296917674fb914194761621cc19a41f6fb953fbcbb649dea'); + + // Example 4: A 1027-bit RSA key pair + var pub4 = RSAPublicKey( + BigInt.parse( + '054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705', + radix: 16), + BigInt.parse('010001', radix: 16)); + var prv4 = RSAPrivateKey( + BigInt.parse( + '054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705', + radix: 16), + BigInt.parse( + 'fa041f8cd9697ceed38ec8caa275523b4dd72b09a301d3541d72f5d31c05cbce2d6983b36183af10690bd46c46131e35789431a556771dd0049b57461bf060c1f68472e8a67c25f357e5b6b4738fa541a730346b4a07649a2dfa806a69c975b6aba64678acc7f5913e89c622f2d8abb1e3e32554e39df94ba60c002e387d9011', + radix: 16), + BigInt.parse( + '029232336d2838945dba9dd7723f4e624a05f7375b927a87abe6a893a1658fd49f47f6c7b0fa596c65fa68a23f0ab432962d18d4343bd6fd671a5ea8d148413995', + radix: 16), + BigInt.parse( + '020ef5efe7c5394aed2272f7e81a74f4c02d145894cb1b3cab23a9a0710a2afc7e3329acbb743d01f680c4d02afb4c8fde7e20930811bb2b995788b5e872c20bb1', + radix: 16), + ); + + var msg4a = createUint8ListFromHexString('9fb03b827c8217d9'); + var slt4a = + createUint8ListFromHexString('ed7c98c95f30974fbe4fbddcf0f28d6021c0e91d'); + var sig4a = createUint8ListFromHexString( + '0323d5b7bf20ba4539289ae452ae4297080feff4518423ff4811a817837e7d82f1836cdfab54514ff0887bddeebf40bf99b047abc3ecfa6a37a3ef00f4a0c4a88aae0904b745c846c4107e8797723e8ac810d9e3d95dfa30ff4966f4d75d13768d20857f2b1406f264cfe75e27d7652f4b5ed3575f28a702f8c4ed9cf9b2d44948'); + + var msg4b = createUint8ListFromHexString( + '0ca2ad77797ece86de5bf768750ddb5ed6a3116ad99bbd17edf7f782f0db1cd05b0f677468c5ea420dc116b10e80d110de2b0461ea14a38be68620392e7e893cb4ea9393fb886c20ff790642305bf302003892e54df9f667509dc53920df583f50a3dd61abb6fab75d600377e383e6aca6710eeea27156e06752c94ce25ae99fcbf8592dbe2d7e27453cb44de07100ebb1a2a19811a478adbeab270f94e8fe369d90b3ca612f9f'); + var slt4b = + createUint8ListFromHexString('22d71d54363a4217aa55113f059b3384e3e57e44'); + var sig4b = createUint8ListFromHexString( + '049d0185845a264d28feb1e69edaec090609e8e46d93abb38371ce51f4aa65a599bdaaa81d24fba66a08a116cb644f3f1e653d95c89db8bbd5daac2709c8984000178410a7c6aa8667ddc38c741f710ec8665aa9052be929d4e3b16782c1662114c5414bb0353455c392fc28f3db59054b5f365c49e1d156f876ee10cb4fd70598'); + + // Example 8: A 1031-bit RSA key pair + var pub8 = RSAPublicKey( + BigInt.parse( + '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f', + radix: 16), + BigInt.parse('010001', radix: 16)); + var prv8 = RSAPrivateKey( + BigInt.parse( + '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f', + radix: 16), + BigInt.parse( + '6c66ffe98980c38fcdeab5159898836165f4b4b817c4f6a8d486ee4ea9130fe9b9092bd136d184f95f504a607eac565846d2fdd6597a8967c7396ef95a6eeebb4578a643966dca4d8ee3de842de63279c618159c1ab54a89437b6a6120e4930afb52a4ba6ced8a4947ac64b30a3497cbe701c2d6266d517219ad0ec6d347dbe9', + radix: 16), + BigInt.parse( + '08dad7f11363faa623d5d6d5e8a319328d82190d7127d2846c439b0ab72619b0a43a95320e4ec34fc3a9cea876422305bd76c5ba7be9e2f410c8060645a1d29edb', + radix: 16), + BigInt.parse( + '0847e732376fc7900f898ea82eb2b0fc418565fdae62f7d9ec4ce2217b97990dd272db157f99f63c0dcbb9fbacdbd4c4dadb6df67756358ca4174825b48f49706d', + radix: 16), + ); + + var msg8a = createUint8ListFromHexString( + '81332f4be62948415ea1d899792eeacf6c6e1db1da8be13b5cea41db2fed467092e1ff398914c714259775f595f8547f735692a575e6923af78f22c6997ddb90fb6f72d7bb0dd5744a31decd3dc3685849836ed34aec596304ad11843c4f88489f209735f5fb7fdaf7cec8addc5818168f880acbf490d51005b7a8e84e43e54287977571dd99eea4b161eb2df1f5108f12a4142a83322edb05a75487a3435c9a78ce53ed93bc550857d7a9fb'); + var slt8a = + createUint8ListFromHexString('1d65491d79c864b373009be6f6f2467bac4c78fa'); + var sig8a = createUint8ListFromHexString( + '0262ac254bfa77f3c1aca22c5179f8f040422b3c5bafd40a8f21cf0fa5a667ccd5993d42dbafb409c520e25fce2b1ee1e716577f1efa17f3da28052f40f0419b23106d7845aaf01125b698e7a4dfe92d3967bb00c4d0d35ba3552ab9a8b3eef07c7fecdbc5424ac4db1e20cb37d0b2744769940ea907e17fbbca673b20522380c5'); + + var msg8b = createUint8ListFromHexString( + 'e2f96eaf0e05e7ba326ecca0ba7fd2f7c02356f3cede9d0faabf4fcc8e60a973e5595fd9ea08'); + var slt8b = + createUint8ListFromHexString('435c098aa9909eb2377f1248b091b68987ff1838'); + var sig8b = createUint8ListFromHexString( + '2707b9ad5115c58c94e932e8ec0a280f56339e44a1b58d4ddcff2f312e5f34dcfe39e89c6a94dcee86dbbdae5b79ba4e0819a9e7bfd9d982e7ee6c86ee68396e8b3a14c9c8f34b178eb741f9d3f121109bf5c8172fada2e768f9ea1433032c004a8aa07eb990000a48dc94c8bac8aabe2b09b1aa46c0a2aa0e12f63fbba775ba7e'); + + // Example 9: A 1536-bit RSA key pair + var pub9 = RSAPublicKey( + BigInt.parse( + 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', + radix: 16), + BigInt.parse('010001', radix: 16)); + var prv9 = RSAPrivateKey( + BigInt.parse( + 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', + radix: 16), + BigInt.parse( + '6a7fd84fb85fad073b34406db74f8d61a6abc12196a961dd79565e9da6e5187bce2d980250f7359575359270d91590bb0e427c71460b55d51410b191bcf309fea131a92c8e702738fa719f1e0041f52e40e91f229f4d96a1e6f172e15596b4510a6daec26105f2bebc53316b87bdf21311666070e8dfee69d52c71a976caae79c72b68d28580dc686d9f5129d225f82b3d615513a882b3db91416b48ce08888213e37eeb9af800d81cab328ce420689903c00c7b5fd31b75503a6d419684d629', + radix: 16), + BigInt.parse( + 'f8eb97e98df12664eefdb761596a69ddcd0e76daece6ed4bf5a1b50ac086f7928a4d2f8726a77e515b74da41988f220b1cc87aa1fc810ce99a82f2d1ce821edced794c6941f42c7a1a0b8c4d28c75ec60b652279f6154a762aed165d47dee367', + radix: 16), + BigInt.parse( + 'ed4d71d0a6e24b93c2e5f6b4bbe05f5fb0afa042d204fe3378d365c2f288b6a8dad7efe45d153eef40cacc7b81ff934002d108994b94a5e4728cd9c963375ae49965bda55cbf0efed8d6553b4027f2d86208a6e6b489c176128092d629e49d3d', + radix: 16), + ); + + var msg9a = createUint8ListFromHexString( + 'a88e265855e9d7ca36c68795f0b31b591cd6587c71d060a0b3f7f3eaef43795922028bc2b6ad467cfc2d7f659c5385aa70ba3672cdde4cfe4970cc7904601b278872bf51321c4a972f3c95570f3445d4f57980e0f20df54846e6a52c668f1288c03f95006ea32f562d40d52af9feb32f0fa06db65b588a237b34e592d55cf979f903a642ef64d2ed542aa8c77dc1dd762f45a59303ed75e541ca271e2b60ca709e44fa0661131e8d5d4163fd8d398566ce26de8730e72f9cca737641c244159420637028df0a18079d6208ea8b4711a2c750f5'); + var slt9a = + createUint8ListFromHexString('c0a425313df8d7564bd2434d311523d5257eed80'); + var sig9a = createUint8ListFromHexString( + '586107226c3ce013a7c8f04d1a6a2959bb4b8e205ba43a27b50f124111bc35ef589b039f5932187cb696d7d9a32c0c38300a5cdda4834b62d2eb240af33f79d13dfbf095bf599e0d9686948c1964747b67e89c9aba5cd85016236f566cc5802cb13ead51bc7ca6bef3b94dcbdbb1d570469771df0e00b1a8a06777472d2316279edae86474668d4e1efff95f1de61c6020da32ae92bbf16520fef3cf4d88f61121f24bbd9fe91b59caf1235b2a93ff81fc403addf4ebdea84934a9cdaf8e1a9e'); + + var msg9b = createUint8ListFromHexString( + 'c8c9c6af04acda414d227ef23e0820c3732c500dc87275e95b0d095413993c2658bc1d988581ba879c2d201f14cb88ced153a01969a7bf0a7be79c84c1486bc12b3fa6c59871b6827c8ce253ca5fefa8a8c690bf326e8e37cdb96d90a82ebab69f86350e1822e8bd536a2e'); + var slt9b = + createUint8ListFromHexString('b307c43b4850a8dac2f15f32e37839ef8c5c0e91'); + var sig9b = createUint8ListFromHexString( + '80b6d643255209f0a456763897ac9ed259d459b49c2887e5882ecb4434cfd66dd7e1699375381e51cd7f554f2c271704b399d42b4be2540a0eca61951f55267f7c2878c122842dadb28b01bd5f8c025f7e228418a673c03d6bc0c736d0a29546bd67f786d9d692ccea778d71d98c2063b7a71092187a4d35af108111d83e83eae46c46aa34277e06044589903788f1d5e7cee25fb485e92949118814d6f2c3ee361489016f327fb5bc517eb50470bffa1afa5f4ce9aa0ce5b8ee19bf5501b958'); + + group('RSA/PSS', () { + // TODO: Unify signer test infrastructure. + group('example 1', () { + _testSign('a', Signer('SHA-1/PSS'), prv1, pub1, msg1a, slt1a, sig1a); + _testSign('b', Signer('SHA-1/PSS'), prv1, pub1, msg1b, slt1b, sig1b); + }); + + group('example 2', () { + _testSign('a', Signer('SHA-1/PSS'), prv2, pub2, msg2a, slt2a, sig2a); + _testSign('b', Signer('SHA-1/PSS'), prv2, pub2, msg2b, slt2b, sig2b); + }); + + group('example 4', () { + _testSign('a', Signer('SHA-1/PSS'), prv4, pub4, msg4a, slt4a, sig4a); + _testSign('b', Signer('SHA-1/PSS'), prv4, pub4, msg4b, slt4b, sig4b); + }); + + group('example 8', () { + _testSign('a', Signer('SHA-1/PSS'), prv8, pub8, msg8a, slt8a, sig8a); + _testSign('b', Signer('SHA-1/PSS'), prv8, pub8, msg8b, slt8b, sig8b); + }); + + group('example 9', () { + _testSign('a', Signer('SHA-1/PSS'), prv9, pub9, msg9a, slt9a, sig9a); + _testSign('b', Signer('SHA-1/PSS'), prv9, pub9, msg9b, slt9b, sig9b); + }); + }); +} + +ParametersWithSalt> Function() Function( + RSAPublicKey pubk, Uint8List salt) pubParams = + (RSAPublicKey pubk, Uint8List salt) => () => ParametersWithSalt( + PublicKeyParameter(pubk), + salt, + ); +ParametersWithSalt> Function() Function( + RSAPrivateKey privk, Uint8List salt) privParams = (RSAPrivateKey privk, + Uint8List salt) => + () => ParametersWithSalt(PrivateKeyParameter(privk), salt); + +void _testSign( + String testName, + Signer signer, + RSAPrivateKey privateKey, + RSAPublicKey publicKey, + Uint8List message, + Uint8List salt, + Uint8List expectedSignatureBytes) { + test(testName, () { + signer.init(true, privParams(privateKey, salt)()); + var signature = signer.generateSignature(message); + var expectedSignature = PSSSignature(expectedSignatureBytes); + expect(signature, equals(expectedSignature)); + + signer.init(false, pubParams(publicKey, salt)()); + expect(signer.verifySignature(message, expectedSignature), isTrue); + }); +} diff --git a/pointycastle/test/signers/rsa_signer_test.dart b/pointycastle/test/signers/rsa_signer_test.dart new file mode 100644 index 0000000..a5fa8e6 --- /dev/null +++ b/pointycastle/test/signers/rsa_signer_test.dart @@ -0,0 +1,49 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/signer.dart'; +import '../test/src/helpers.dart'; +import '../test/src/null_secure_random.dart'; + +void main() { + var modulus = BigInt.parse( + '20620915813302906913761247666337410938401372343750709187749515126790853245302593205328533062154315527282056175455193812046134139935830222032257750866653461677566720508752544506266533943725970345491747964654489405936145559121373664620352701801574863309087932865304205561439525871868738640172656811470047745445089832193075388387376667722031640892525639171016297098395245887609359882693921643396724693523583076582208970794545581164952427577506035951122669158313095779596666008591745562008787129160302313244329988240795948461701615228062848622019620094307696506764461083870202605984497833670577046553861732258592935325691'); + var publicExponent = BigInt.parse('65537'); + var privateExponent = BigInt.parse( + '11998058528661160053642124235359844880039079149364512302169225182946866898849176558365314596732660324493329967536772364327680348872134489319530228055102152992797567579226269544119435926913937183793755182388650533700918602627770886358900914370472445911502526145837923104029967812779021649252540542517598618021899291933220000807916271555680217608559770825469218984818060775562259820009637370696396889812317991880425127772801187664191059506258517954313903362361211485802288635947903604738301101038823790599295749578655834195416886345569976295245464597506584866355976650830539380175531900288933412328525689718517239330305'); + var p = BigInt.parse( + '144173682842817587002196172066264549138375068078359231382946906898412792452632726597279520229873489736777248181678202636100459215718497240474064366927544074501134727745837254834206456400508719134610847814227274992298238973375146473350157304285346424982280927848339601514720098577525635486320547905945936448443'); + var q = BigInt.parse( + '143028293421514654659358549214971921584534096938352096320458818956414890934365483375293202045679474764569937266017713262196941957149321696805368542065644090886347646782188634885321277533175667840285448510687854061424867903968633218073060468434469761149335255007464091258725753837522484082998329871306803923137'); + + var pubk = RSAPublicKey(modulus, publicExponent); + var privk = RSAPrivateKey(modulus, privateExponent, p, q); + + ParametersWithRandom> pubParams() => + ParametersWithRandom( + PublicKeyParameter(pubk), NullSecureRandom()); + ParametersWithRandom> privParams() => + ParametersWithRandom( + PrivateKeyParameter(privk), NullSecureRandom()); + + runSignerTests(Signer('SHA-1/RSA'), privParams, pubParams, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...', + _newSignature( + '18683e8e227a62049c4f249fcebb5a41dbdd03a926cbf5928be2cf81f870c5fab7865a9caec7b50291a8e3be0089ad86692b3e319060da928934a3' + '1ee23b04867a4b5237f2bd66e2a42e1098db797303693cb435a0a6155f20ecc0bf8a6522a72a20ccbb6ae9f2e227a340cce213299f438cda9518fc' + 'fbfd63ed3b6d302f3248ee046bca9cc29fdeb64547b6639d24d4ea45361c98454ed413f0d0b96cdca62b74a193fcdf4ba7d9d6010bc01bd39f5c82' + '37d62b9025458aa71729331ce41d996643adfb1631c9561d8959e423aefb3024bf987589930e2c5ae780517199bab1e13efa2d1642648ad405b489' + '73e9ae0b4dea3943d91d7ab849b3935100e70dcd'), + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme...', + _newSignature( + '17716fff28fac619fefa4345042beb21217e34589b7bd3689b27acfad08ccd6ad4476f1e79cbcb3a239269c2de0e070b3e8179244db5cb2a5840da' + 'e372b174595992db96e6a007e5f2ffebaef9c7b7b0013f8ef6f4656986299b8e8459560185cfde06f77bcf82ec32d83694dd1a4e0b91f2e5e5a34a' + '653e1d89e7e8b80b2935ea9a422670e567332d24bb1ed3ca0daf367c833b8113105204ad677be45aa3507e26f54e39e36edf6175c64302d05261a0' + 'bade75cdd93f4383ed224fe1b61b2f74d7c0bcbffe9908cfb58d48d848b062702541af610f7d21f318297d126757492fc48fb3a1c91c36ddf0b5dd' + '971de9a857e390badb0766779eea5672097b695d'), + ]); +} + +RSASignature _newSignature(String value) => + RSASignature(createUint8ListFromHexString(value)); diff --git a/pointycastle/test/src/ct_nonvm_test.dart b/pointycastle/test/src/ct_nonvm_test.dart new file mode 100644 index 0000000..676f712 --- /dev/null +++ b/pointycastle/test/src/ct_nonvm_test.dart @@ -0,0 +1,65 @@ +@OnPlatform({ + 'vm': Skip(), +}) +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/ct.dart'; +import 'package:test/test.dart'; + +import '../digests/cshake_test.dart'; + +void main() { + // + // Not using a secure random otherwise so as not to + // invoke the platform selection logic. + // + var rand = Random(); + + group('ct', () { + test('xor monte', () { + for (var j = 0; j < 1000; j++) { + var len = rand.nextInt(256); + var x = Uint8List.fromList( + List.generate(len, (index) => rand.nextInt(256))); + var y = Uint8List.fromList( + List.generate(len, (index) => rand.nextInt(256))); + var enable = rand.nextInt(10) >= 5; + + var reason = + '$enable ${formatBytesAsHexString(x)} ${formatBytesAsHexString(y)}'; + + var xExpected = Uint8List.fromList(x); + _xor(xExpected, y, enable); + + CT_xor(x, y, enable); + expect(xExpected, equals(x), reason: reason); + + // + // Should be all zero + // + CT_xor(y, y, true); + for (var element in y) { + expect(element, equals(0)); + } + } + }); + + test('assertion', () { + var x = Uint8List(1); + var y = Uint8List(2); + expect(() { + CT_xor(x, y, true); + }, throwsA(isA())); + }); + }); +} + +// naive non ct xor +void _xor(Uint8List x, Uint8List y, bool enable) { + if (enable) { + for (var t = 0; t < x.length; t++) { + x[t] = x[t] ^ y[t]; + } + } +} diff --git a/pointycastle/test/src/ct_test.dart b/pointycastle/test/src/ct_test.dart new file mode 100644 index 0000000..8259c09 --- /dev/null +++ b/pointycastle/test/src/ct_test.dart @@ -0,0 +1,66 @@ +@OnPlatform({ + 'chrome': Skip('Excessive time / resource consumption on this platform'), + 'node': Skip('Excessive time / resource consumption on this platform') +}) +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:pointycastle/src/ct.dart'; +import 'package:test/test.dart'; + +import '../digests/cshake_test.dart'; + +void main() { + // + // Not using a secure random otherwise so as not to + // invoke the platform selection logic. + // + var rand = Random(); + + group('ct', () { + test('xor monte', () { + for (var j = 0; j < 500000; j++) { + var len = rand.nextInt(256); + var x = Uint8List.fromList( + List.generate(len, (index) => rand.nextInt(256))); + var y = Uint8List.fromList( + List.generate(len, (index) => rand.nextInt(256))); + var enable = rand.nextInt(10) >= 5; + + var reason = + '$enable ${formatBytesAsHexString(x)} ${formatBytesAsHexString(y)}'; + + var xExpected = Uint8List.fromList(x); + _xor(xExpected, y, enable); + + CT_xor(x, y, enable); + expect(xExpected, equals(x), reason: reason); + + // + // Should be all zero + // + CT_xor(y, y, true); + for (var element in y) { + expect(element, equals(0)); + } + } + }); + + test('assertion', () { + var x = Uint8List(1); + var y = Uint8List(2); + expect(() { + CT_xor(x, y, true); + }, throwsA(isA())); + }); + }); +} + +// naive non ct xor +void _xor(Uint8List x, Uint8List y, bool enable) { + if (enable) { + for (var t = 0; t < x.length; t++) { + x[t] = x[t] ^ y[t]; + } + } +} diff --git a/pointycastle/test/src/ufixnum_test.dart b/pointycastle/test/src/ufixnum_test.dart new file mode 100644 index 0000000..417d861 --- /dev/null +++ b/pointycastle/test/src/ufixnum_test.dart @@ -0,0 +1,786 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/src/ufixnum.dart'; +import 'package:test/test.dart'; + +void main() { + group('int8:', () { + test('clip8()', () { + expect(clip8(0x00), 0x00); + expect(clip8(0xFF), 0xFF); + expect(clip8(0x100), 0x00); + }); + + test('sum8()', () { + expect(sum8(0x00, 0x01), 0x01); + expect(sum8(0xFF, 0x01), 0x00); + }); + + test('sub8()', () { + expect(sub8(0x00, 0x01), 0xFF); + expect(sub8(0xFF, 0x01), 0xFE); + }); + + test('shiftl8()', () { + expect(shiftl8(0xAB, 0), 0xAB); + expect(shiftl8(0xAB, 4), 0xB0); + expect(shiftl8(0xAB, 8), 0xAB); + }); + + test('shiftr8()', () { + expect(shiftr8(0xAB, 0), 0xAB); + expect(shiftr8(0xAB, 4), 0x0A); + expect(shiftr8(0xAB, 8), 0xAB); + }); + + test('neg8()', () { + expect(neg8(0x00), 0x00); + expect(neg8(0xFF), 0x01); + expect(neg8(0x01), 0xFF); + }); + + test('not8()', () { + expect(not8(0x00), 0xFF); + expect(not8(0xFF), 0x00); + expect(not8(0x01), 0xFE); + }); + + test('rotl8()', () { + expect(rotl8(0xAB, 0), 0xAB); + expect(rotl8(0x7F, 1), 0xFE); + expect(rotl8(0xAB, 4), 0xBA); + expect(rotl8(0xAB, 8), 0xAB); + }); + + test('rotr8()', () { + expect(rotr8(0xAB, 0), 0xAB); + expect(rotr8(0xFE, 1), 0x7F); + expect(rotr8(0xAB, 4), 0xBA); + expect(rotr8(0xAB, 8), 0xAB); + }); + }); + + group('int16:', () { + test('clip16()', () { + expect(clip16(0x0000), 0x0000); + expect(clip16(0xFFFF), 0xFFFF); + expect(clip16(0x10000), 0x0000); + }); + + test('pack16(BIG_ENDIAN)', () { + var out = Uint8List(2); + pack16(0x1020, out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + }); + + test('pack16(LITTLE_ENDIAN)', () { + var out = Uint8List(2); + pack16(0x1020, out, 0, Endian.little); + expect(out[1], 0x10); + expect(out[0], 0x20); + }); + + test('unpack16(BIG_ENDIAN)', () { + var inp = Uint8List.fromList([0x10, 0x20]); + expect(unpack16(inp, 0, Endian.big), 0x1020); + }); + + test('unpack16(LITTLE_ENDIAN)', () { + var inp = Uint8List.fromList([0x20, 0x10]); + expect(unpack16(inp, 0, Endian.little), 0x1020); + }); + + test('pack16(Uint8List.view)', () { + var out = Uint8List(6); + out = Uint8List.view(out.buffer, 2, 2); + pack16(0x1020, out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + }); + + test('unpack16(Uint8List.view)', () { + var inp = Uint8List.fromList([0, 0, 0x20, 0x10, 0, 0]); + inp = Uint8List.view(inp.buffer, 2, 2); + expect(unpack16(inp, 0, Endian.little), 0x1020); + }); + }); + + group('int32:', () { + test('clip32()', () { + expect(clip32(0x00000000), 0x00000000); + expect(clip32(0xFFFFFFFF), 0xFFFFFFFF); + expect(clip32(0x100000000), 0x00000000); + }); + + test('sum32()', () { + expect(sum32(0x00000000, 0x00000001), 0x00000001); + expect(sum32(0xFFFFFFFF, 0x00000001), 0x00000000); + }); + + test('sub32()', () { + expect(sub32(0x00000000, 0x00000001), 0xFFFFFFFF); + expect(sub32(0xFFFFFFFF, 0x00000001), 0xFFFFFFFE); + }); + + test('shiftl32()', () { + expect(shiftl32(0x10203040, 0), 0x10203040); + expect(shiftl32(0x10203040, 16), 0x30400000); + expect(shiftl32(0x10203040, 32), 0x10203040); + }); + + test('shiftr32()', () { + expect(shiftr32(0x10203040, 0), 0x10203040); + expect(shiftr32(0x10203040, 16), 0x00001020); + expect(shiftr32(0x10203040, 32), 0x10203040); + expect(shiftr32(0x80000000, 8), 0x00800000); + }); + + test('neg32()', () { + expect(neg32(0x00000000), 0x00000000); + expect(neg32(0xFFFFFFFF), 0x00000001); + expect(neg32(0x00000001), 0xFFFFFFFF); + }); + + test('not32()', () { + expect(not32(0x00000000), 0xFFFFFFFF); + expect(not32(0xFFFFFFFF), 0x00000000); + expect(not32(0x00000001), 0xFFFFFFFE); + }); + + test('rotl32()', () { + expect(rotl32(0x10203040, 0), 0x10203040); + expect(rotl32(0x10203040, 8), 0x20304010); + expect(rotl32(0x10203040, 16), 0x30401020); + expect(rotl32(0x10203040, 32), 0x10203040); + }); + + test('rotr32()', () { + expect(rotr32(0x10203040, 0), 0x10203040); + expect(rotr32(0x10203040, 8), 0x40102030); + expect(rotr32(0x10203040, 16), 0x30401020); + expect(rotr32(0x10203040, 32), 0x10203040); + }); + + test('pack32(BIG_ENDIAN)', () { + var out = Uint8List(4); + pack32(0x10203040, out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + expect(out[2], 0x30); + expect(out[3], 0x40); + }); + + test('pack32(LITTLE_ENDIAN)', () { + var out = Uint8List(4); + pack32(0x10203040, out, 0, Endian.little); + expect(out[3], 0x10); + expect(out[2], 0x20); + expect(out[1], 0x30); + expect(out[0], 0x40); + }); + + test('unpack32(BIG_ENDIAN)', () { + var inp = Uint8List.fromList([0x10, 0x20, 0x30, 0x40]); + expect(unpack32(inp, 0, Endian.big), 0x10203040); + }); + + test('unpack32(LITTLE_ENDIAN)', () { + var inp = Uint8List.fromList([0x40, 0x30, 0x20, 0x10]); + expect(unpack32(inp, 0, Endian.little), 0x10203040); + }); + + test('pack32(Uint8List.view)', () { + var out = Uint8List(8); + out = Uint8List.view(out.buffer, 2, 4); + pack32(0x10203040, out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + expect(out[2], 0x30); + expect(out[3], 0x40); + }); + + test('unpack32(Uint8List.view)', () { + var inp = Uint8List.fromList([0, 0, 0x40, 0x30, 0x20, 0x10, 0, 0]); + inp = Uint8List.view(inp.buffer, 2, 4); + expect(unpack32(inp, 0, Endian.little), 0x10203040); + }); + }); + + group('Register64:', () { + test('Register64(hi,lo)', () { + expect(Register64(0x00000000, 0x00000000), + Register64(0x00000000, 0x00000000)); + expect(Register64(0x10203040, 0xFFFFFFFF), + Register64(0x10203040, 0xFFFFFFFF)); + }); + + test('Register64(lo)', () { + expect(Register64(0x00000000), Register64(0x00000000, 0x00000000)); + expect(Register64(0x10203040), Register64(0x00000000, 0x10203040)); + }); + + test('Register64(y)', () { + expect(Register64(Register64(0x00000000, 0x00000000)), + Register64(0x00000000, 0x00000000)); + expect(Register64(Register64(0x10203040, 0xFFFFFFFF)), + Register64(0x10203040, 0xFFFFFFFF)); + }); + + test('==', () { + expect( + Register64(0x00000000, 0x00000000) == + Register64(0x00000000, 0x00000000), + true); + expect( + Register64(0x00000000, 0x00000001) == + Register64(0x00000000, 0x00000000), + false); + expect( + Register64(0x00000001, 0x00000000) == + Register64(0x00000000, 0x00000000), + false); + expect( + Register64(0x00000001, 0x00000001) == + Register64(0x00000000, 0x00000000), + false); + }); + + test('<', () { + expect( + Register64(0x00000000, 0x00000000) < + Register64(0x00000000, 0x00000000), + false); + + expect( + Register64(0x00000000, 0x00000001) < + Register64(0x00000000, 0x10000000), + true); + expect( + Register64(0x00000000, 0x20000000) < + Register64(0x00000000, 0x10000000), + false); + expect( + Register64(0x00000001, 0x00000000) < + Register64(0x00000000, 0x10000000), + false); + + expect( + Register64(0x00000000, 0x00000001) < + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x00000001, 0x00000001) < + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x10000000, 0x00000000) < + Register64(0x10000000, 0x00000000), + false); + expect( + Register64(0x20000000, 0x00000001) < + Register64(0x10000000, 0x00000000), + false); + }); + + test('<=', () { + expect( + Register64(0x00000000, 0x00000000) <= + Register64(0x00000000, 0x00000000), + true); + + expect( + Register64(0x00000000, 0x00000001) <= + Register64(0x00000000, 0x10000000), + true); + expect( + Register64(0x00000000, 0x20000000) <= + Register64(0x00000000, 0x10000000), + false); + expect( + Register64(0x00000001, 0x00000000) <= + Register64(0x00000000, 0x10000000), + false); + + expect( + Register64(0x00000000, 0x00000001) <= + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x00000001, 0x00000001) <= + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x10000000, 0x00000000) <= + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x20000000, 0x00000001) <= + Register64(0x10000000, 0x00000000), + false); + }); + + test('>', () { + expect( + Register64(0x00000000, 0x00000000) > + Register64(0x00000000, 0x00000000), + false); + + expect( + Register64(0x00000000, 0x10000000) > + Register64(0x00000000, 0x00000001), + true); + expect( + Register64(0x00000000, 0x10000000) > + Register64(0x00000000, 0x20000000), + false); + expect( + Register64(0x10000000, 0x00000000) > + Register64(0x00000001, 0x00000000), + true); + + expect( + Register64(0x10000000, 0x00000001) > + Register64(0x00000000, 0x00000000), + true); + expect( + Register64(0x10000000, 0x00000000) > + Register64(0x00000001, 0x00000001), + true); + expect( + Register64(0x10000000, 0x00000000) > + Register64(0x10000000, 0x00000000), + false); + expect( + Register64(0x10000000, 0x00000000) > + Register64(0x20000000, 0x00000001), + false); + }); + + test('>=', () { + expect( + Register64(0x00000000, 0x00000000) >= + Register64(0x00000000, 0x00000000), + true); + + expect( + Register64(0x00000000, 0x10000000) >= + Register64(0x00000000, 0x00000001), + true); + expect( + Register64(0x00000000, 0x10000000) >= + Register64(0x00000000, 0x20000000), + false); + expect( + Register64(0x10000000, 0x00000000) >= + Register64(0x00000001, 0x00000000), + true); + + expect( + Register64(0x10000000, 0x00000001) >= + Register64(0x00000000, 0x00000000), + true); + expect( + Register64(0x10000000, 0x00000000) >= + Register64(0x00000001, 0x00000001), + true); + expect( + Register64(0x10000000, 0x00000000) >= + Register64(0x10000000, 0x00000000), + true); + expect( + Register64(0x10000000, 0x00000000) >= + Register64(0x20000000, 0x00000001), + false); + }); + + test('set(hi,lo)', () { + expect(Register64()..set(0x00000000, 0x00000000), + Register64(0x00000000, 0x00000000)); + expect(Register64()..set(0x10203040, 0xFFFFFFFF), + Register64(0x10203040, 0xFFFFFFFF)); + }); + + test('set(lo)', () { + expect(Register64()..set(0x00000000), Register64(0x00000000, 0x00000000)); + expect(Register64()..set(0x10203040), Register64(0x00000000, 0x10203040)); + }); + + test('set(y)', () { + expect(Register64()..set(Register64(0x00000000, 0x00000000)), + Register64(0x00000000, 0x00000000)); + expect(Register64()..set(Register64(0x10203040, 0xFFFFFFFF)), + Register64(0x10203040, 0xFFFFFFFF)); + }); + + test('sum(int)', () { + expect(Register64(0x00000000, 0x00000000)..sum(0x00000001), + Register64(0x00000000, 0x00000001)); + expect(Register64(0x00000000, 0x80000000)..sum(0x80000001), + Register64(0x00000001, 0x00000001)); + expect(Register64(0xFFFFFFFF, 0xFFFFFFFF)..sum(0x00000001), + Register64(0x00000000, 0x00000000)); + }); + + test('sum(y)', () { + expect( + Register64(0x00000000, 0x00000000) + ..sum(Register64(0x00000000, 0x00000001)), + Register64(0x00000000, 0x00000001)); + expect( + Register64(0x00000000, 0x80000000) + ..sum(Register64(0x00000000, 0x80000001)), + Register64(0x00000001, 0x00000001)); + expect( + Register64(0xFFFFFFFF, 0xFFFFFFFF) + ..sum(Register64(0x00000000, 0x00000001)), + Register64(0x00000000, 0x00000000)); + }); + + test('sub(int)', () { + expect(Register64(0x00000000, 0x00000000)..sub(0x00000001), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect(Register64(0x00000001, 0x00000001)..sub(0x80000001), + Register64(0x00000000, 0x80000000)); + expect(Register64(0xFFFFFFFF, 0xFFFFFFFF)..sub(0x00000001), + Register64(0xFFFFFFFF, 0xFFFFFFFE)); + }); + + test('sub(y)', () { + expect( + Register64(0x00000000, 0x00000000) + ..sub(Register64(0x00000000, 0x00000001)), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect( + Register64(0x00000001, 0x00000001) + ..sub(Register64(0x00000000, 0x80000001)), + Register64(0x00000000, 0x80000000)); + expect( + Register64(0xFFFFFFFF, 0xFFFFFFFF) + ..sub(Register64(0x00000000, 0x00000001)), + Register64(0xFFFFFFFF, 0xFFFFFFFE)); + }); + + test('mod(int)', () { + expect(Register64(0x80000000, 0xFFFFFFFF)..mod(0x80000001), + Register64(0x80000000)); + expect(Register64(0x001a808c, 0xd14e661f)..mod(0x1de25c1c), + Register64(0x19c7c283)); + expect(Register64(0x2419b4a0, 0xb107ecae)..mod(0xf9891c30), + Register64(0xed7c34ae)); + expect(Register64(0x18bda296)..mod(0x0c8b924c), Register64(0x0c32104a)); + }); + + test('mul(int)', () { + expect(Register64(0x00000000, 0x00000000)..mul(0x00000000), + Register64(0x00000000, 0x00000000)); + expect(Register64(0x00000000, 0x00000000)..mul(0x00000001), + Register64(0x00000000, 0x00000000)); + expect(Register64(0x00000000, 0x00000001)..mul(0x00000001), + Register64(0x00000000, 0x00000001)); + expect(Register64(0x00000001, 0x00000000)..mul(0x00000001), + Register64(0x00000001, 0x00000000)); + expect(Register64(0x00000000, 0x00000001)..mul(0xFFFFFFFF), + Register64(0x00000000, 0xFFFFFFFF)); + expect(Register64(0x00000000, 0x80000000)..mul(0x00000004), + Register64(0x00000002, 0x00000000)); + expect(Register64(0x00000000, 0x80000001)..mul(0x00000004), + Register64(0x00000002, 0x00000004)); + expect(Register64(0x80000001, 0x80000001)..mul(0x00000004), + Register64(0x00000006, 0x00000004)); + + expect(Register64(0x43dc7, 0xd7e76b0c)..mul(0x7ea), + Register64(0x2190ef92, 0xad752cf8)); + expect(Register64(0x0, 0xc32451e7)..mul(0x23567c25), + Register64(0x1aefe407, 0xe485ba63)); + expect(Register64(0x2, 0xd076305c)..mul(0x2c7b5a06), + Register64(0x7d2f7673, 0x7bf97a28)); + expect(Register64(0x1c, 0xca56897f)..mul(0x3dd00d4), + Register64(0x6f39c828, 0xbf4cdd2c)); + expect(Register64(0x288c, 0xebf98043)..mul(0x279fb), + Register64(0x646c35a7, 0x4bc66cb1)); + expect(Register64(0x11a82, 0xfc7ab318)..mul(0x710a), + Register64(0x7cbeda90, 0x5d896f0)); + expect(Register64(0x2edc, 0x994d7f30)..mul(0x1a21c), + Register64(0x4c895271, 0x4e264940)); + expect(Register64(0xddcf, 0x53e5547b)..mul(0x3b80), + Register64(0x338dafff, 0xcd229680)); + expect(Register64(0x2087b, 0x1f168aac)..mul(0x2067), + Register64(0x41e0cd6c, 0x53674b34)); + expect(Register64(0x0, 0x3e0b2bad)..mul(0x8fc3718f), + Register64(0x22d79b6d, 0x7e4bc2a3)); + expect(Register64(0x0, 0xeabdc8f2)..mul(0xf7f86812), + Register64(0xe360e429, 0xc36a7104)); + expect(Register64(0x0, 0xfb56ee12)..mul(0x2a25f213), + Register64(0x2961844a, 0x311aaf56)); + expect(Register64(0x0, 0x5639e48a)..mul(0xfc587481), + Register64(0x54fec81c, 0x162ab18a)); + expect(Register64(0x0, 0xbb0fca68)..mul(0xe480f4e6), + Register64(0xa6f84b1c, 0xf11af970)); + }); + + test('mul(y)', () { + expect( + Register64(0x00000000, 0x00000000) + ..mul(Register64(0x00000000, 0x00000000)), + Register64(0x00000000, 0x00000000)); + expect( + Register64(0x00000000, 0x00000000) + ..mul(Register64(0x00000000, 0x00000001)), + Register64(0x00000000, 0x00000000)); + expect( + Register64(0x00000000, 0x00000001) + ..mul(Register64(0x00000000, 0x00000001)), + Register64(0x00000000, 0x00000001)); + expect( + Register64(0x00000001, 0x00000000) + ..mul(Register64(0x00000000, 0x00000001)), + Register64(0x00000001, 0x00000000)); + expect( + Register64(0x00000000, 0x00000001) + ..mul(Register64(0x00000000, 0xFFFFFFFF)), + Register64(0x00000000, 0xFFFFFFFF)); + expect( + Register64(0x00000000, 0x80000000) + ..mul(Register64(0x00000000, 0x00000004)), + Register64(0x00000002, 0x00000000)); + expect( + Register64(0x00000000, 0x80000001) + ..mul(Register64(0x00000000, 0x00000004)), + Register64(0x00000002, 0x00000004)); + expect( + Register64(0x80000001, 0x80000001) + ..mul(Register64(0x00000000, 0x00000004)), + Register64(0x00000006, 0x00000004)); + expect(Register64(0x0, 0xb2ea00)..mul(Register64(0x73, 0xfecac71a)), + Register64(0x51112fe3, 0xca11c400)); + expect(Register64(0x0, 0x7b0e)..mul(Register64(0x4ecc, 0x2675c20c)), + Register64(0x25e065a4, 0xaeac60a8)); + expect(Register64(0x0, 0x325ecbc4)..mul(Register64(0x0, 0xd3dbfcc0)), + Register64(0x29af6ac5, 0xf459c300)); + expect(Register64(0x0, 0xc84d)..mul(Register64(0x7a66, 0x9e3d4aa8)), + Register64(0x5fc4fc7d, 0x7ac2b488)); + expect(Register64(0x0, 0x2ce3)..mul(Register64(0x1218, 0xe1c9dad3)), + Register64(0x32c52de, 0xe7994d19)); + expect(Register64(0x0, 0xaa442)..mul(Register64(0x35e, 0x2537590a)), + Register64(0x23d6a246, 0x87b35c94)); + expect(Register64(0x0, 0x83085)..mul(Register64(0x7e6, 0xceec37e4)), + Register64(0x40b5d917, 0x8a53c974)); + expect(Register64(0x0, 0x45c1c4d)..mul(Register64(0x6, 0xdd294ade)), + Register64(0x1dece243, 0x6963ccc6)); + expect(Register64(0x0, 0x274aef21)..mul(Register64(0x0, 0x4ff9175a)), + Register64(0xc465b43, 0x51ed089a)); + expect(Register64(0x0, 0x13246489)..mul(Register64(0x0, 0x2c6ae04d)), + Register64(0x3523f1e, 0xc6a41d35)); + }); + + test('neg()', () { + expect(Register64(0x00000000, 0x00000000)..neg(), + Register64(0x00000000, 0x00000000)); + expect(Register64(0xFFFFFFFF, 0xFFFFFFFF)..neg(), + Register64(0x00000000, 0x00000001)); + expect(Register64(0x50505050, 0x05050505)..neg(), + Register64(0xAFAFAFAF, 0xFAFAFAFB)); + }); + + test('not()', () { + expect(Register64(0x00000000, 0x00000000)..not(), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect(Register64(0xFFFFFFFF, 0xFFFFFFFF)..not(), + Register64(0x00000000, 0x00000000)); + expect(Register64(0x50505050, 0x05050505)..not(), + Register64(0xAFAFAFAF, 0xFAFAFAFA)); + }); + + test('and()', () { + expect( + Register64(0x00000000, 0x00000000) + ..and(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0x00000000, 0x00000000)); + expect( + Register64(0x10203040, 0x05050505) + ..and(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0x10203040, 0x05050505)); + expect( + Register64(0x10203040, 0x05050505) + ..and(Register64(0x00000000, 0xFFFFFFFF)), + Register64(0x00000000, 0x05050505)); + expect( + Register64(0x10203040, 0x05050505) + ..and(Register64(0xFFFFFFFF, 0x00000000)), + Register64(0x10203040, 0x00000000)); + }); + + test('or()', () { + expect( + Register64(0x00000000, 0x00000000) + ..or(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect( + Register64(0x10203040, 0x05050505) + ..or(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect( + Register64(0x10203040, 0x05050505) + ..or(Register64(0x00000000, 0xFFFFFFFF)), + Register64(0x10203040, 0xFFFFFFFF)); + expect( + Register64(0x10203040, 0x05050505) + ..or(Register64(0xFFFFFFFF, 0x00000000)), + Register64(0xFFFFFFFF, 0x05050505)); + }); + + test('xor()', () { + expect( + Register64(0x00000000, 0x00000000) + ..xor(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0xFFFFFFFF, 0xFFFFFFFF)); + expect( + Register64(0x10203040, 0x05050505) + ..xor(Register64(0xFFFFFFFF, 0xFFFFFFFF)), + Register64(0xEFDFCFBF, 0xFAFAFAFA)); + expect( + Register64(0x10203040, 0x05050505) + ..xor(Register64(0x00000000, 0xFFFFFFFF)), + Register64(0x10203040, 0xFAFAFAFA)); + expect( + Register64(0x10203040, 0x05050505) + ..xor(Register64(0xFFFFFFFF, 0x00000000)), + Register64(0xEFDFCFBF, 0x05050505)); + }); + + test('shiftl()', () { + expect(Register64(0x10203040, 0x05050505)..shiftl(0), + Register64(0x10203040, 0x05050505)); + expect(Register64(0x10203040, 0x05050505)..shiftl(16), + Register64(0x30400505, 0x05050000)); + expect(Register64(0x10203040, 0x05050505)..shiftl(32), + Register64(0x05050505, 0x00000000)); + expect(Register64(0x10203040, 0x05050505)..shiftl(48), + Register64(0x05050000, 0x00000000)); + expect(Register64(0x10203040, 0x05050505)..shiftl(64), + Register64(0x10203040, 0x05050505)); + }); + + test('shiftr()', () { + expect(Register64(0x10203040, 0x05050505)..shiftr(0), + Register64(0x10203040, 0x05050505)); + expect(Register64(0x10203040, 0x05050505)..shiftr(16), + Register64(0x00001020, 0x30400505)); + expect(Register64(0x10203040, 0x05050505)..shiftr(32), + Register64(0x00000000, 0x10203040)); + expect(Register64(0x10203040, 0x05050505)..shiftr(48), + Register64(0x00000000, 0x00001020)); + expect(Register64(0x10203040, 0x05050505)..shiftr(64), + Register64(0x10203040, 0x05050505)); + }); + + test('rotl()', () { + expect(Register64(0x10203040, 0x05050505)..rotl(0), + Register64(0x10203040, 0x05050505)); + expect(Register64(0x10203040, 0x05050505)..rotl(16), + Register64(0x30400505, 0x05051020)); + expect(Register64(0x10203040, 0x05050505)..rotl(32), + Register64(0x05050505, 0x10203040)); + expect(Register64(0x10203040, 0x05050505)..rotl(48), + Register64(0x05051020, 0x30400505)); + expect(Register64(0x10203040, 0x05050505)..rotl(64), + Register64(0x10203040, 0x05050505)); + }); + + test('rotr()', () { + expect(Register64(0x10203040, 0x05050505)..rotr(0), + Register64(0x10203040, 0x05050505)); + expect(Register64(0x10203040, 0x05050505)..rotr(16), + Register64(0x05051020, 0x30400505)); + expect(Register64(0x10203040, 0x05050505)..rotr(32), + Register64(0x05050505, 0x10203040)); + expect(Register64(0x10203040, 0x05050505)..rotr(48), + Register64(0x30400505, 0x05051020)); + expect(Register64(0x10203040, 0x05050505)..rotr(64), + Register64(0x10203040, 0x05050505)); + }); + + test('pack(BIG_ENDIAN)', () { + var out = Uint8List(64); + Register64(0x10203040, 0x50607080).pack(out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + expect(out[2], 0x30); + expect(out[3], 0x40); + expect(out[4], 0x50); + expect(out[5], 0x60); + expect(out[6], 0x70); + expect(out[7], 0x80); + }); + + test('pack(LITTLE_ENDIAN)', () { + var out = Uint8List(64); + Register64(0x10203040, 0x50607080).pack(out, 0, Endian.little); + expect(out[7], 0x10); + expect(out[6], 0x20); + expect(out[5], 0x30); + expect(out[4], 0x40); + expect(out[3], 0x50); + expect(out[2], 0x60); + expect(out[1], 0x70); + expect(out[0], 0x80); + }); + + test('unpack(BIG_ENDIAN)', () { + var inp = + Uint8List.fromList([0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80]); + expect(Register64()..unpack(inp, 0, Endian.big), + Register64(0x10203040, 0x50607080)); + }); + + test('unpack(LITTLE_ENDIAN)', () { + var inp = + Uint8List.fromList([0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10]); + expect(Register64()..unpack(inp, 0, Endian.little), + Register64(0x10203040, 0x50607080)); + }); + + test('pack(Uint8List.view)', () { + var out = Uint8List(68); + out = Uint8List.view(out.buffer, 2, 64); + Register64(0x10203040, 0x50607080).pack(out, 0, Endian.big); + expect(out[0], 0x10); + expect(out[1], 0x20); + expect(out[2], 0x30); + expect(out[3], 0x40); + expect(out[4], 0x50); + expect(out[5], 0x60); + expect(out[6], 0x70); + expect(out[7], 0x80); + }); + + test('unpack(LITTLE_ENDIAN)', () { + var inp = Uint8List.fromList( + [0, 0, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, 0, 0]); + inp = Uint8List.view(inp.buffer, 2, 8); + expect(Register64()..unpack(inp, 0, Endian.little), + Register64(0x10203040, 0x50607080)); + }); + + test('toString()', () { + expect(Register64(0x00203040, 0x00050505).toString(), '0020304000050505'); + }); + }); + + group('Register64List:', () { + test('Register64.from()', () { + final list = Register64List.from([ + [0, 1], + [2, 3], + [4, 5] + ]); + + expect(list[0], Register64(0x00000000, 0x00000001)); + expect(list[1], Register64(0x00000002, 0x00000003)); + expect(list[2], Register64(0x00000004, 0x00000005)); + }); + }); +} diff --git a/pointycastle/test/src/utils_test.dart b/pointycastle/test/src/utils_test.dart new file mode 100644 index 0000000..0ee7be8 --- /dev/null +++ b/pointycastle/test/src/utils_test.dart @@ -0,0 +1,82 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/src/utils.dart'; +import 'package:test/test.dart'; + +void main() { + group('BigInt utility functions ', () { + testUnsignedEncoding(); + testArbitrarySignDecoding(); + testTwosComplimentBigIntEncoding(); + testTwosComplimentBigIntOverRange(); + }); +} + +void testTwosComplimentBigIntEncoding() { + test('twos compliment encoding', () { + var bi1 = BigInt.zero - BigInt.from(128); + + var out = encodeBigInt(bi1); + expect([128], equals(out)); + out = encodeBigIntAsUnsigned(bi1); + expect([128], equals(out)); + + var bi2 = BigInt.from(128); + out = encodeBigInt(bi2); // [0,128] + expect([0, 128], equals(out)); + out = encodeBigIntAsUnsigned(bi2); + expect([128], equals(out)); + + expect(decodeBigInt(encodeBigInt(BigInt.from(-1001))), + equals(BigInt.from(-1001))); + + expect(decodeBigInt(encodeBigInt(BigInt.from(0))), equals(BigInt.from(0))); + + expect(decodeBigInt([0]), equals(BigInt.from(0))); + + expect(decodeBigInt([]), equals(BigInt.from(0))); + }); +} + +void testTwosComplimentBigIntOverRange() { + test('decode encode twos compliment roundtrip', () { + for (var t = -0xFFFFFFFF; t < 0xFFFFFFFF; t += 0x1024) { + var n = BigInt.from(t); + var encoded = encodeBigInt(n); + if (n == BigInt.zero) { + expect(encoded.length, equals(1), + reason: 'Zero value is one element array with zero byte value'); + expect(encoded[0], equals(0), + reason: 'Zero value is one element array with zero byte value'); + } else if (n.isNegative) { + expect(encoded[0] & 0x80, equals(0x80), reason: 'sign bit must be set'); + } else { + expect(encoded[0] & 0x80, equals(0), reason: 'sign bit must not set'); + } + expect(n, equals(decodeBigInt(encoded))); + } + }); +} + +void testUnsignedEncoding() { + test('unsigned encoding', () { + expect(encodeBigIntAsUnsigned(BigInt.from(33025)), [0x81, 0x01]); + expect(encodeBigIntAsUnsigned(BigInt.from(-33025)), [0xFF, 0x7E, 0xFF]); + + var theEncoded = encodeBigIntAsUnsigned(BigInt.from(0)); + expect(theEncoded.length, 1); + expect(theEncoded[0], 0); + }); +} + +void testArbitrarySignDecoding() { + test('arbitrary sign decoding', () { + expect(decodeBigIntWithSign(1, [0x81, 0x01]), BigInt.from(33025)); + expect(decodeBigIntWithSign(-1, [0xFF, 0x7E, 0xFF]), BigInt.from(-33025)); + expect(decodeBigIntWithSign(1, [0xFF, 0x7E, 0xFF]), BigInt.from(16744191)); + expect(decodeBigIntWithSign(0, []), BigInt.from(0)); + + expect(decodeBigIntWithSign(-1, [0]), BigInt.from(0)); + expect(decodeBigIntWithSign(1, [0]), BigInt.from(0)); + }); +} diff --git a/pointycastle/test/srp/srp_test.dart b/pointycastle/test/srp/srp_test.dart new file mode 100644 index 0000000..862cd3a --- /dev/null +++ b/pointycastle/test/srp/srp_test.dart @@ -0,0 +1,298 @@ +import 'dart:typed_data'; + +import 'package:convert/convert.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/srp/srp6_client.dart'; +import 'package:pointycastle/srp/srp6_server.dart'; +import 'package:pointycastle/srp/srp6_standard_groups.dart'; +import 'package:pointycastle/srp/srp6_util.dart'; +import 'package:pointycastle/srp/srp6_verifier_generator.dart'; +import 'package:test/test.dart'; + +void main() { + group('SRP', () { + group('rfc5054:', () { + test('rfc5054AppendixBTestVectors', () { + var I = Uint8List.fromList('alice'.codeUnits); + var P = Uint8List.fromList('password123'.codeUnits); + var s = + Uint8List.fromList(hex.decode('BEB25379D1A8581EB5A727673A2441EE')); + var N = SRP6StandardGroups.rfc5054_1024.N; + var g = SRP6StandardGroups.rfc5054_1024.g; + + var expectK = + BigInt.parse('7556AA045AEF2CDD07ABAF0F665C3E818913186F', radix: 16); + var expectX = + BigInt.parse('94B7555AABE9127CC58CCF4993DB6CF84D16C124', radix: 16); + var expectV = BigInt.parse( + '7E273DE8696FFC4F4E337D05B4B375BEB0DDE1569E8FA00A9886D812' + '9BADA1F1822223CA1A605B530E379BA4729FDC59F105B4787E5186F5' + 'C671085A1447B52A48CF1970B4FB6F8400BBF4CEBFBB168152E08AB5' + 'EA53D15C1AFF87B2B9DA6E04E058AD51CC72BFC9033B564E26480D78' + 'E955A5E29E7AB245DB2BE315E2099AFB', + radix: 16); + var expectA = BigInt.parse( + '61D5E490F6F1B79547B0704C436F523DD0E560F0C64115BB72557EC4' + '4352E8903211C04692272D8B2D1A5358A2CF1B6E0BFCF99F921530EC' + '8E39356179EAE45E42BA92AEACED825171E1E8B9AF6D9C03E1327F44' + 'BE087EF06530E69F66615261EEF54073CA11CF5858F0EDFDFE15EFEA' + 'B349EF5D76988A3672FAC47B0769447B', + radix: 16); + var expectB = BigInt.parse( + 'BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011' + 'BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC99' + '6C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA' + '37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAE' + 'EB4012B7D7665238A8E3FB004B117B58', + radix: 16); + var expectU = + BigInt.parse('CE38B9593487DA98554ED47D70A7AE5F462EF019', radix: 16); + var expectS = BigInt.parse( + 'B0DC82BABCF30674AE450C0287745E7990A3381F63B387AAF271A10D' + '233861E359B48220F7C4693C9AE12B0A6F67809F0876E2D013800D6C' + '41BB59B6D5979B5C00A172B4A2A5903A0BDCAF8A709585EB2AFAFA8F' + '3499B200210DCC1F10EB33943CD67FC88A2F39A4BE5BEC4EC0A3212D' + 'C346D7E474B29EDE8A469FFECA686E5A', + radix: 16); + + var k = SRP6Util.calculateK(Digest('SHA-1'), N, g); + if (k.compareTo(expectK) != 0) { + fail("wrong value of 'k', expected $expectK got $k"); + } + + var x = SRP6Util.calculateX(Digest('SHA-1'), N, s, I, P); + if (x.compareTo(expectX) != 0) { + fail("wrong value of 'x'"); + } + + var gen = SRP6VerifierGenerator( + group: SRP6StandardGroups.rfc5054_1024, digest: Digest('SHA-1')); + var v = gen.generateVerifier(s, I, P); + if (v.compareTo(expectV) != 0) { + fail("wrong value of 'v'"); + } + + var client = TestSRP6Client( + group: SRP6StandardGroups.rfc5054_1024, + digest: Digest('SHA-1'), + random: random); + + var A = client.generateClientCredentials(s, I, P); + if (A!.compareTo(expectA) != 0) { + fail("wrong value of 'A'"); + } + + var server = TestSRP6Server( + group: SRP6StandardGroups.rfc5054_1024, + v: v, + digest: Digest('SHA-1'), + random: random); + + var B = server.generateServerCredentials(); + if (B!.compareTo(expectB) != 0) { + fail("wrong value of 'B', expected $expectB got $B"); + } + + var u = SRP6Util.calculateU(Digest('SHA-1'), N, A, B); + if (u.compareTo(expectU) != 0) { + fail("wrong value of 'u'"); + } + + var clientS = client.calculateSecret(B); + if (clientS!.compareTo(expectS) != 0) { + fail("wrong value of 'S' (client)"); + } + + var serverS = server.calculateSecret(A); + if (serverS!.compareTo(expectS) != 0) { + fail("wrong value of 'S' (server)"); + } + }); + }); + + group('mutual verification:', () { + test('testMutualVerificationWith1024', () { + var I = Uint8List.fromList('username'.codeUnits); + var P = Uint8List.fromList('password'.codeUnits); + final key = Uint8List.fromList('keywithsixteenth'.codeUnits); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + random.seed(params); + var s = random.nextBytes(16); + + var gen = SRP6VerifierGenerator( + group: SRP6StandardGroups.rfc5054_1024, digest: Digest('SHA-256')); + var v = gen.generateVerifier(s, I, P); + + var client = SRP6Client( + group: SRP6StandardGroups.rfc5054_1024, + digest: Digest('SHA-256'), + random: random); + + var server = SRP6Server( + group: SRP6StandardGroups.rfc5054_1024, + v: v, + digest: Digest('SHA-256'), + random: random); + + var A = client.generateClientCredentials(s, I, P); + var B = server.generateServerCredentials(); + + var clientS = client.calculateSecret(B!); + var serverS = server.calculateSecret(A!); + + if (clientS!.compareTo(serverS!) != 0) { + fail( + 'SRP agreement failed - client/server calculated different secrets'); + } + }); + + test('testMutualVerificationWith2048', () { + var I = Uint8List.fromList('username'.codeUnits); + var P = Uint8List.fromList('password'.codeUnits); + final key = Uint8List.fromList('keywithsixteenth'.codeUnits); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + random.seed(params); + var s = random.nextBytes(16); + + var gen = SRP6VerifierGenerator( + group: SRP6StandardGroups.rfc5054_2048, digest: Digest('SHA-256')); + var v = gen.generateVerifier(s, I, P); + + var client = SRP6Client( + group: SRP6StandardGroups.rfc5054_2048, + digest: Digest('SHA-256'), + random: random); + + var server = SRP6Server( + group: SRP6StandardGroups.rfc5054_2048, + v: v, + digest: Digest('SHA-256'), + random: random); + + var A = client.generateClientCredentials(s, I, P); + var B = server.generateServerCredentials(); + + var clientS = client.calculateSecret(B!); + var serverS = server.calculateSecret(A!); + + if (clientS!.compareTo(serverS!) != 0) { + fail( + 'SRP agreement failed - client/server calculated different secrets'); + } + try { + server.verifyClientEvidenceMessage( + client.calculateClientEvidenceMessage()!); + } catch (e) { + fail("Evidence messages don't match"); + } + }); + }); + + group('client catches bad paramaters:', () { + test('testClientCatchesBadB', () { + var I = Uint8List.fromList('username'.codeUnits); + var P = Uint8List.fromList('password'.codeUnits); + final key = Uint8List.fromList('keywithsixteenth'.codeUnits); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + random.seed(params); + var s = random.nextBytes(16); + + var standardsGroup = SRP6StandardGroups.rfc5054_1024; + var client = SRP6Client( + group: standardsGroup, digest: Digest('SHA-256'), random: random); + + client.generateClientCredentials(s, I, P); + + try { + client.calculateSecret(BigInt.zero); + fail("Client failed to detect invalid value for 'B'"); + } catch (e) { + // Expected + } + + try { + client.calculateSecret(standardsGroup.N); + fail("Client failed to detect invalid value for 'B'"); + } catch (e) { + // Expected + } + }); + + test('testServerCatchesBadA', () { + var I = Uint8List.fromList('username'.codeUnits); + var P = Uint8List.fromList('password'.codeUnits); + final key = Uint8List.fromList('keywithsixteenth'.codeUnits); + final keyParam = KeyParameter(key); + final params = ParametersWithIV(keyParam, Uint8List(16)); + + random.seed(params); + var s = random.nextBytes(16); + + var standardsGroup = SRP6StandardGroups.rfc5054_1024; + var gen = SRP6VerifierGenerator( + digest: Digest('SHA-256'), group: standardsGroup); + var v = gen.generateVerifier(s, I, P); + + var server = SRP6Server( + digest: Digest('SHA-256'), + group: standardsGroup, + v: v, + random: random); + server.generateServerCredentials(); + + try { + server.calculateSecret(BigInt.zero); + fail("Client failed to detect invalid value for 'A'"); + } catch (e) { + // Expected + } + + try { + server.calculateSecret(standardsGroup.N); + fail("Client failed to detect invalid value for 'A'"); + } catch (e) { + // Expected + } + }); + }); + }); +} + +final random = SecureRandom('AES/CTR/AUTO-SEED-PRNG'); + +class TestSRP6Client extends SRP6Client { + TestSRP6Client( + {required super.group, required super.digest, required super.random}) { + a = BigInt.parse( + '60975527035CF2AD1989806F0407210BC81EDC04E2762A56AFD529DDDA2D4393', + radix: 16); + } + + @override + BigInt? selectPrivateValue() { + return a; + } +} + +class TestSRP6Server extends SRP6Server { + TestSRP6Server( + {required super.group, + required super.v, + required super.digest, + required super.random}) { + b = BigInt.parse( + 'E487CB59D31AC550471E81F00F6928E01DDA08E974A004F49E61F5D105284D20', + radix: 16); + } + + @override + BigInt? selectPrivateValue() { + return b; + } +} diff --git a/pointycastle/test/stream/chacha20_test.dart b/pointycastle/test/stream/chacha20_test.dart new file mode 100644 index 0000000..cbc54a4 --- /dev/null +++ b/pointycastle/test/stream/chacha20_test.dart @@ -0,0 +1,156 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/stream/chacha20.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +int i = 0; + +void main() { + var set1v00 = + 'FBB87FBB8395E05DAA3B1D683C422046F913985C2AD9B23CFC06C1D8D04FF213D44A7A7CDB84929F915420A8A3DC58BF0F7ECB4B1F167BB1A5E6153FDAF4493D'; + + var set1v0192 = + 'D9485D55B8B82D792ED1EEA8E93E9BC1E2834AD0D9B11F3477F6E106A2F6A5F2EA8244D5B925B8050EAB038F58D4DF577FAFD1B89359DAE508B2B10CBD6B488E'; + + var set1v0256 = + '08661A35D6F02D3D9ACA8087F421F7C8A42579047D6955D937925BA21396DDD474B1FC4ACCDCAA33025B4BCE817A4FBF3E5D07D151D7E6FE04934ED466BA4779'; + + var set1v0448 = + 'A7E16DD38BA48CCB130E5BE9740CE359D631E91600F85C8A5D0785A612D1D98790780ACDDC26B69AB106CCF6D866411D10637483DBF08CC5591FD8B3C87A3AE0'; + + var set1v90 = + 'A276339F99316A913885A0A4BE870F0691E72B00F1B3F2239F714FE81E88E00CBBE52B4EBBE1EA15894E29658C4CB145E6F89EE4ABB045A78514482CE75AFB7C'; + + var set1v9192 = + '0DFB9BD4F87F68DE54FBC1C6428FDEB063E997BE8490C9B7A4694025D6EBA2B15FE429DB82A7CAE6AAB22918E8D004496FB6291467B5AE81D4E85E81D8795EBB'; + + var set1v9256 = + '546F5BB315E7F71A46E56D4580F90889639A2BA528F757CF3B048738BA141AF3B31607CB21561BAD94721048930364F4B1227CFEB7CDECBA881FB44903550E68'; + + var set1v9448 = + '6F813586E76691305A0CF048C0D8586DC89460207D8B230CD172398AA33D19E92D24883C3A9B0BB7CD8C6B2668DB142E37A97948A7A01498A21110297984CD20'; + + // ChaCha12 + var chacha12Set1v00 = + '36CF0D56E9F7FBF287BC5460D95FBA94AA6CBF17D74E7C784DDCF7E0E882DDAE3B5A58243EF32B79A04575A8E2C2B73DC64A52AA15B9F88305A8F0CA0B5A1A25'; + + var chacha12Set1v0192 = + '83496792AB68FEC75ADB16D3044420A4A00A6E9ADC41C3A63DBBF317A8258C85A9BC08B4F76B413A4837324AEDF8BC2A67D53C9AB9E1C5BC5F379D48DF9AF730'; + + var chacha12Set1v0256 = + 'BAA28ED593690FD760ADA07C95E3B8884B4B64E488CA7A2D9BDC262243AB9251394C5037E255F8BCCDCD31306C508FFBC9E0161380F7911FCB137D46D9269250'; + + var chacha12Set1v0448 = + 'B7ECFB6AE0B51915762FE1FD03A14D0C9E54DA5DC76EB16EBA5313BC535DE63DC72D7F9F1874E301E99C8531819F4E3775793F6A5D19C717FA5C78A39EB804A6'; + + // ChaCha8 + var chacha8Set1v00 = + 'BEB1E81E0F747E43EE51922B3E87FB38D0163907B4ED49336032AB78B67C24579FE28F751BD3703E51D876C017FAA43589E63593E03355A7D57B2366F30047C5'; + + var chacha8Set1v0192 = + '33B8B7CA8F8E89F0095ACE75A379C651FD6BDD55703C90672E44C6BAB6AACDD87C976A87FD264B906E749429284134C238E3B88CF74A68245B860D119A8BDF43'; + + var chacha8Set1v0256 = + 'F7CA95BF08688BD3BE8A27724210F9DC16F32AF974FBFB09E9F757C577A245ABF35F824B70A4C02CB4A8D7191FA8A5AD6A84568743844703D353B7F00A8601F4'; + + var chacha8Set1v0448 = + '7B4117E8BFFD595CD8482270B08920FBC9B97794E1809E07BB271BF07C8610034C38DBA6ECA04E5474F399A284CBF6E27F70142E604D0977797DE5B58B6B25E0'; + + chachaTest1( + 20, + ParametersWithIV( + KeyParameter( + createUint8ListFromHexString('80000000000000000000000000000000')), + createUint8ListFromHexString('0000000000000000')), + set1v00, + set1v0192, + set1v0256, + set1v0448); + chachaTest1( + 20, + ParametersWithIV( + KeyParameter( + createUint8ListFromHexString('00400000000000000000000000000000')), + createUint8ListFromHexString('0000000000000000')), + set1v90, + set1v9192, + set1v9256, + set1v9448); + chachaTest1( + 12, + ParametersWithIV( + KeyParameter( + createUint8ListFromHexString('80000000000000000000000000000000')), + createUint8ListFromHexString('0000000000000000')), + chacha12Set1v00, + chacha12Set1v0192, + chacha12Set1v0256, + chacha12Set1v0448); + chachaTest1( + 8, + ParametersWithIV( + KeyParameter( + createUint8ListFromHexString('80000000000000000000000000000000')), + createUint8ListFromHexString('0000000000000000')), + chacha8Set1v00, + chacha8Set1v0192, + chacha8Set1v0256, + chacha8Set1v0448); +} + +void chachaTest1(int rounds, CipherParameters params, String v0, String v192, + String v256, String v448) { + test('ChaCha Test #${++i}', () { + StreamCipher chaCha = ChaCha20Engine.fromRounds(rounds); + var buf = Uint8List(64); + + chaCha.init(true, params); + + var zeroes = createUint8ListFromHexString( + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); + + for (var i = 0; i != 7; i++) { + chaCha.processBytes(zeroes, 0, 64, buf, 0); + switch (i) { + case 0: + if (!areEqual(buf, createUint8ListFromHexString(v0))) { + throw ArgumentError(); + } + break; + case 3: + if (!areEqual(buf, createUint8ListFromHexString(v192))) { + throw ArgumentError(); + } + break; + case 4: + if (!areEqual(buf, createUint8ListFromHexString(v256))) { + throw ArgumentError(); + } + break; + default: + // ignore + } + } + + for (var i = 0; i != 64; i++) { + buf[i] = chaCha.returnByte(zeroes[i]); + } + + if (!areEqual(buf, createUint8ListFromHexString(v448))) { + throw ArgumentError(); + } + }); +} + +bool areEqual(Uint8List a, Uint8List b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + if (a[i] != b[i]) return false; + } + return true; +} diff --git a/pointycastle/test/stream/chacha20poly1305_test.dart b/pointycastle/test/stream/chacha20poly1305_test.dart new file mode 100644 index 0000000..e6c8773 --- /dev/null +++ b/pointycastle/test/stream/chacha20poly1305_test.dart @@ -0,0 +1,90 @@ +@TestOn('vm') +library test.stream.chacha20poly1305_test; + +import 'dart:typed_data'; + +import 'package:pointycastle/macs/poly1305.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:pointycastle/stream/chacha20poly1305.dart'; +import 'package:pointycastle/stream/chacha7539.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +int i = 0; + +void main() { + //Test from BC + var K = createUint8ListFromHexString( + '808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f'); + var P = createUint8ListFromHexString( + '4c616469657320616e642047656e746c656d656e206f66207468652063' + '6c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6' + 'c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20' + '776f756c642062652069742e'); + var A = createUint8ListFromHexString('50515253c0c1c2c3c4c5c6c7'); + var N = createUint8ListFromHexString('070000004041424344454647'); + var C = createUint8ListFromHexString( + 'd31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a73' + '6ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692' + 'ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4' + 'b7a9de576d26586cec64b6116'); + var T = createUint8ListFromHexString('1ae10b594f09e26a7e902ecbd0600691'); + runTest(K, P, A, N, C, T); +} + +void runTest(Uint8List K, Uint8List P, Uint8List A, Uint8List N, Uint8List C, + Uint8List T) { + test('ChaChaPoly1305 Test #${++i}', () { + var parameters = AEADParameters(KeyParameter(K), T.length * 8, N, A); + var chaChaEngine = ChaCha20Poly1305(ChaCha7539Engine(), Poly1305()) + ..init(true, parameters); + var chaChaEngineDecrypt = ChaCha20Poly1305(ChaCha7539Engine(), Poly1305()) + ..init(false, parameters); + var enc = Uint8List(chaChaEngine.getOutputSize(P.length)); + var len = chaChaEngine.processBytes(P, 0, P.length, enc, 0); + len += chaChaEngine.doFinal(enc, len); + if (enc.length != len) { + throw StateError(''); + } + + var mac = chaChaEngine.mac; + var data = Uint8List(P.length); + arrayCopy(enc, 0, data, 0, data.length); + var tail = Uint8List(enc.length - P.length); + arrayCopy(enc, P.length, tail, 0, tail.length); + + for (var i = 0; i < data.length; i++) { + if (data[i] != C[i]) { + throw StateError(''); + } + } + + for (var i = 0; i < mac.length; i++) { + if (T[i] != mac[i]) { + throw StateError(''); + } + } + + for (var i = 0; i < tail.length; i++) { + if (T[i] != tail[i]) { + throw StateError(''); + } + } + + var dec = Uint8List(chaChaEngineDecrypt.getOutputSize(enc.length)); + len = chaChaEngineDecrypt.processBytes(enc, 0, enc.length, dec, 0); + len += chaChaEngineDecrypt.doFinal(dec, len); + mac = chaChaEngineDecrypt.mac; + + data = Uint8List(C.length); + arrayCopy(dec, 0, data, 0, data.length); + + for (var i = 0; i < data.length; i++) { + if (P[i] != data[i]) { + throw StateError(''); + } + } + }); +} diff --git a/pointycastle/test/stream/eax_test.dart b/pointycastle/test/stream/eax_test.dart new file mode 100644 index 0000000..2d30fe1 --- /dev/null +++ b/pointycastle/test/stream/eax_test.dart @@ -0,0 +1,313 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/aes.dart'; +import 'package:pointycastle/src/platform_check/platform_check.dart'; +import 'package:pointycastle/src/utils.dart'; +import 'package:pointycastle/stream/eax.dart'; +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +/// Ported from BouncyCastle's Java tests: https://github.com/bcgit/bc-java/blob/master/core/src/test/java/org/bouncycastle/crypto/test/EAXTest.java +void main() { + group('eax vectors 1-11', () { + checkVectors(1, K1, 128, N1, A1, P1, T1, C1); + checkVectors(2, K2, 128, N2, A2, P2, T2, C2); + checkVectors(3, K3, 128, N3, A3, P3, T3, C3); + checkVectors(4, K4, 128, N4, A4, P4, T4, C4); + checkVectors(5, K5, 128, N5, A5, P5, T5, C5); + checkVectors(6, K6, 128, N6, A6, P6, T6, C6); + checkVectors(7, K7, 128, N7, A7, P7, T7, C7); + checkVectors(8, K8, 128, N8, A8, P8, T8, C8); + checkVectors(9, K9, 128, N9, A9, P9, T9, C9); + checkVectors(10, K10, 128, N10, A10, P10, T10, C10); + checkVectors(11, K11, 32, N11, A11, P11, T11, C11); + }); + + group('eax ivParam', () { + var eax = EAX(AESEngine()); + ivParamTest(1, eax, K1, N1); + }); + + group('eax throw behaviour', () { + var eax = EAX(AESEngine()); + eax.init(false, AEADParameters(KeyParameter(K1), 32, N2, A2)); + var enc = Uint8List(C2.length); + var len = eax.processBytes(C2, 0, C2.length, enc, 0); + test('invalid cipher text picked up', + () => expect(() => eax.doFinal(enc, len), throwsStateError)); + + test( + 'illegal argument picked up', + () => expect( + () => eax.init(false, KeyParameter(K1)), throwsArgumentError)); + }); + + group('eax random', randomTests); + + /* AEADTestUtil from bouncycastle/java needs to be ported + AEADTestUtil.testReset(this, new EAXBlockCipher(new AESEngine()), new EAXBlockCipher(new AESEngine()), new AEADParameters(new KeyParameter(K1), 32, N2)); + AEADTestUtil.testTampering(this, eax, new AEADParameters(new KeyParameter(K1), 32, N2)); + AEADTestUtil.testOutputSizes(this, new EAXBlockCipher(new AESEngine()), new AEADParameters( + new KeyParameter(K1), 32, N2)); + AEADTestUtil.testBufferSizeChecks(this, new EAXBlockCipher(new AESEngine()), new AEADParameters( + new KeyParameter(K1), 32, N2));*/ +} + +void checkVectors(int count, Uint8List k, int macSize, Uint8List n, Uint8List a, + Uint8List p, Uint8List t, Uint8List c) { + var fa = Uint8List(a.length ~/ 2); + var la = Uint8List(a.length - (a.length ~/ 2)); + fa.setRange(0, fa.length, a); + la.setRange(0, la.length, a.sublist(fa.length)); + + _checkVectors( + count, 'all initial associated data', k, macSize, n, a, null, p, t, c); + _checkVectors(count, 'subsequent associated data', k, macSize, n, + Uint8List(0), a, p, t, c); + _checkVectors(count, 'split associated data', k, macSize, n, fa, la, p, t, c); +} + +void _checkVectors( + int count, + String additionalDataType, + Uint8List k, + int macSize, + Uint8List n, + Uint8List a, + Uint8List? sa, + Uint8List p, + Uint8List t, + Uint8List c) { + var encEax = EAX(AESEngine()); + var decEax = EAX(AESEngine()); + + var parameters = AEADParameters(KeyParameter(k), macSize, n, a); + encEax.init(true, parameters); + decEax.init(false, parameters); + + _runCheckVectors(count, encEax, decEax, additionalDataType, sa, p, t, c); + _runCheckVectors(count, encEax, decEax, additionalDataType, sa, p, t, c); + +/* this java code seems to be obsolete since the KeyParam is not nullable + +// key reuse test +parameters = AEADParameters(null, macSize, n, a); +encEax.init(true, parameters); +decEax.init(false, parameters); + +runCheckVectors(count, encEax, decEax, additionalDataType, sa, p, t, c); +runCheckVectors(count, encEax, decEax, additionalDataType, sa, p, t, c);*/ +} + +void _runCheckVectors( + int count, + EAX encEax, + EAX decEax, + String additionalDataType, + Uint8List? sa, + Uint8List p, + Uint8List t, + Uint8List c) { + test('test $count with $additionalDataType', () { + var enc = Uint8List(c.length); + + if (sa != null) { + encEax.processAADBytes(sa, 0, sa.length); + } + + var len = encEax.processBytes(p, 0, p.length, enc, 0); + + len += encEax.doFinal(enc, len); + expect(enc, orderedEquals(c), + reason: + 'encrypted stream mismatch in test $count with $additionalDataType'); + + var tmp = Uint8List(enc.length); + + if (sa != null) { + decEax.processAADBytes(sa, 0, sa.length); + } + + len = decEax.processBytes(enc, 0, enc.length, tmp, 0); + + len += decEax.doFinal(tmp, len); + + var dec = Uint8List(len); + + dec.setRange(0, len, tmp); + + expect(dec, orderedEquals(p), + reason: + 'decrypted stream mismatch in test $count with $additionalDataType'); + expect(decEax.mac, orderedEquals(t), + reason: 'MAC mismatch in test $count with $additionalDataType'); + }); +} + +void ivParamTest(int count, EAX eax, Uint8List k, Uint8List n) { + test('ivParamTest $count', () { + var p = createUint8ListFromString('hello world!!'); + + eax.init(true, ParametersWithIV(KeyParameter(k), n)); + + var enc = Uint8List(p.length + 8); + + var len = eax.processBytes(p, 0, p.length, enc, 0); + len += eax.doFinal(enc, len); + + eax.init(false, ParametersWithIV(KeyParameter(k), n)); + + var tmp = Uint8List(enc.length); + + len = eax.processBytes(enc, 0, enc.length, tmp, 0); + len += eax.doFinal(tmp, len); + + var dec = Uint8List(len); + dec.setRange(0, len, tmp); + + expect(dec, orderedEquals(p), + reason: 'decrypted stream mismatch in test $count'); + }); +} + +void randomTests() { + var srng = SecureRandom('Fortuna') + ..seed( + KeyParameter(Platform.instance.platformEntropySource().getBytes(32))); + for (var i = 0; i < 10; ++i) { + randomTest(srng); + } +} + +void randomTest(SecureRandom srng) { + test('randomTest', () { + var datLen = unsignedShiftRight64(srng.nextUint32(), 22); + var nonce = srng.nextBytes(NONCE_LEN); + var authen = srng.nextBytes(AUTHEN_LEN); + var datIn = srng.nextBytes(datLen); + var key = srng.nextBytes(16); + + var engine = AESEngine(); + var sessKey = KeyParameter(key); + var eaxCipher = EAX(engine); + + var params = AEADParameters(sessKey, MAC_LEN * 8, nonce, authen); + eaxCipher.init(true, params); + + var intrDat = Uint8List(eaxCipher.getOutputSize(datIn.length)); + var outOff = eaxCipher.processBytes(datIn, 0, datLen, intrDat, 0); + outOff += eaxCipher.doFinal(intrDat, outOff); + + eaxCipher.init(false, params); + var datOut = Uint8List(eaxCipher.getOutputSize(outOff)); + var resultLen = eaxCipher.processBytes(intrDat, 0, outOff, datOut, 0); + eaxCipher.doFinal(datOut, resultLen); + + expect(datIn, orderedEquals(datOut), reason: 'EAX roundtrip mismatch'); + }); +} + +const int NONCE_LEN = 8; +const int MAC_LEN = 8; +const int AUTHEN_LEN = 20; + +Uint8List K1 = createUint8ListFromHexString('233952DEE4D5ED5F9B9C6D6FF80FF478'); +Uint8List N1 = createUint8ListFromHexString('62EC67F9C3A4A407FCB2A8C49031A8B3'); +Uint8List A1 = createUint8ListFromHexString('6BFB914FD07EAE6B'); +Uint8List P1 = createUint8ListFromHexString(''); +Uint8List C1 = createUint8ListFromHexString('E037830E8389F27B025A2D6527E79D01'); +Uint8List T1 = createUint8ListFromHexString('E037830E8389F27B025A2D6527E79D01'); + +Uint8List K2 = createUint8ListFromHexString('91945D3F4DCBEE0BF45EF52255F095A4'); +Uint8List N2 = createUint8ListFromHexString('BECAF043B0A23D843194BA972C66DEBD'); +Uint8List A2 = createUint8ListFromHexString('FA3BFD4806EB53FA'); +Uint8List P2 = createUint8ListFromHexString('F7FB'); +Uint8List C2 = + createUint8ListFromHexString('19DD5C4C9331049D0BDAB0277408F67967E5'); +Uint8List T2 = createUint8ListFromHexString('5C4C9331049D0BDAB0277408F67967E5'); + +Uint8List K3 = createUint8ListFromHexString('01F74AD64077F2E704C0F60ADA3DD523'); +Uint8List N3 = createUint8ListFromHexString('70C3DB4F0D26368400A10ED05D2BFF5E'); +Uint8List A3 = createUint8ListFromHexString('234A3463C1264AC6'); +Uint8List P3 = createUint8ListFromHexString('1A47CB4933'); +Uint8List C3 = + createUint8ListFromHexString('D851D5BAE03A59F238A23E39199DC9266626C40F80'); +Uint8List T3 = createUint8ListFromHexString('3A59F238A23E39199DC9266626C40F80'); + +Uint8List K4 = createUint8ListFromHexString('D07CF6CBB7F313BDDE66B727AFD3C5E8'); +Uint8List N4 = createUint8ListFromHexString('8408DFFF3C1A2B1292DC199E46B7D617'); +Uint8List A4 = createUint8ListFromHexString('33CCE2EABFF5A79D'); +Uint8List P4 = createUint8ListFromHexString('481C9E39B1'); +Uint8List C4 = + createUint8ListFromHexString('632A9D131AD4C168A4225D8E1FF755939974A7BEDE'); +Uint8List T4 = createUint8ListFromHexString('D4C168A4225D8E1FF755939974A7BEDE'); + +Uint8List K5 = createUint8ListFromHexString('35B6D0580005BBC12B0587124557D2C2'); +Uint8List N5 = createUint8ListFromHexString('FDB6B06676EEDC5C61D74276E1F8E816'); +Uint8List A5 = createUint8ListFromHexString('AEB96EAEBE2970E9'); +Uint8List P5 = createUint8ListFromHexString('40D0C07DA5E4'); +Uint8List C5 = createUint8ListFromHexString( + '071DFE16C675CB0677E536F73AFE6A14B74EE49844DD'); +Uint8List T5 = createUint8ListFromHexString('CB0677E536F73AFE6A14B74EE49844DD'); + +Uint8List K6 = createUint8ListFromHexString('BD8E6E11475E60B268784C38C62FEB22'); +Uint8List N6 = createUint8ListFromHexString('6EAC5C93072D8E8513F750935E46DA1B'); +Uint8List A6 = createUint8ListFromHexString('D4482D1CA78DCE0F'); +Uint8List P6 = createUint8ListFromHexString('4DE3B35C3FC039245BD1FB7D'); +Uint8List C6 = createUint8ListFromHexString( + '835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F'); +Uint8List T6 = createUint8ListFromHexString('ABB8644FD6CCB86947C5E10590210A4F'); + +Uint8List K7 = createUint8ListFromHexString('7C77D6E813BED5AC98BAA417477A2E7D'); +Uint8List N7 = createUint8ListFromHexString('1A8C98DCD73D38393B2BF1569DEEFC19'); +Uint8List A7 = createUint8ListFromHexString('65D2017990D62528'); +Uint8List P7 = + createUint8ListFromHexString('8B0A79306C9CE7ED99DAE4F87F8DD61636'); +Uint8List C7 = createUint8ListFromHexString( + '02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2'); +Uint8List T7 = createUint8ListFromHexString('137327D10649B0AA6E1C181DB617D7F2'); + +Uint8List K8 = createUint8ListFromHexString('5FFF20CAFAB119CA2FC73549E20F5B0D'); +Uint8List N8 = createUint8ListFromHexString('DDE59B97D722156D4D9AFF2BC7559826'); +Uint8List A8 = createUint8ListFromHexString('54B9F04E6A09189A'); +Uint8List P8 = + createUint8ListFromHexString('1BDA122BCE8A8DBAF1877D962B8592DD2D56'); +Uint8List C8 = createUint8ListFromHexString( + '2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A'); +Uint8List T8 = createUint8ListFromHexString('3B60450599BD02C96382902AEF7F832A'); + +Uint8List K9 = createUint8ListFromHexString('A4A4782BCFFD3EC5E7EF6D8C34A56123'); +Uint8List N9 = createUint8ListFromHexString('B781FCF2F75FA5A8DE97A9CA48E522EC'); +Uint8List A9 = createUint8ListFromHexString('899A175897561D7E'); +Uint8List P9 = + createUint8ListFromHexString('6CF36720872B8513F6EAB1A8A44438D5EF11'); +Uint8List C9 = createUint8ListFromHexString( + '0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700'); +Uint8List T9 = createUint8ListFromHexString('E7F6D2231618102FDB7FE55FF1991700'); + +Uint8List K10 = + createUint8ListFromHexString('8395FCF1E95BEBD697BD010BC766AAC3'); +Uint8List N10 = + createUint8ListFromHexString('22E7ADD93CFC6393C57EC0B3C17D6B44'); +Uint8List A10 = createUint8ListFromHexString('126735FCC320D25A'); +Uint8List P10 = + createUint8ListFromHexString('CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7'); +Uint8List C10 = createUint8ListFromHexString( + 'CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E'); +Uint8List T10 = + createUint8ListFromHexString('CFC46AFC253B4652B1AF3795B124AB6E'); + +Uint8List K11 = + createUint8ListFromHexString('8395FCF1E95BEBD697BD010BC766AAC3'); +Uint8List N11 = + createUint8ListFromHexString('22E7ADD93CFC6393C57EC0B3C17D6B44'); +Uint8List A11 = createUint8ListFromHexString('126735FCC320D25A'); +Uint8List P11 = + createUint8ListFromHexString('CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7'); +Uint8List C11 = createUint8ListFromHexString( + 'CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC'); +Uint8List T11 = createUint8ListFromHexString('CFC46AFC'); diff --git a/pointycastle/test/stream/rc4_engine_test.dart b/pointycastle/test/stream/rc4_engine_test.dart new file mode 100644 index 0000000..4f9baac --- /dev/null +++ b/pointycastle/test/stream/rc4_engine_test.dart @@ -0,0 +1,34 @@ +import 'package:pointycastle/export.dart'; + +import 'package:test/test.dart'; + +import '../test/src/helpers.dart'; + +void main() { + group('RC4 Engine', () { + streamCipherTest( + 0, + RC4Engine(), + KeyParameter( + createUint8ListFromHexString('0123456789ABCDEF'), + ), + '4e6f772069732074', + '3afbb5c77938280d'); + streamCipherTest( + 1, + RC4Engine(), + KeyParameter( + createUint8ListFromHexString('0123456789ABCDEF'), + ), + '68652074696d6520', + '1cf1e29379266d59'); + streamCipherTest( + 3, + RC4Engine(), + KeyParameter( + createUint8ListFromHexString('0123456789ABCDEF'), + ), + '666f7220616c6c20', + '12fbb0c771276459'); + }); +} diff --git a/pointycastle/test/stream/salsa20_test.dart b/pointycastle/test/stream/salsa20_test.dart new file mode 100644 index 0000000..3439d9a --- /dev/null +++ b/pointycastle/test/stream/salsa20_test.dart @@ -0,0 +1,39 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/pointycastle.dart'; + +import '../test/runners/stream_cipher.dart'; + +void main() { + final keyBytes = Uint8List.fromList([ + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xAA, + 0xBB, + 0xCC, + 0xDD, + 0xEE, + 0xFF + ]); + final key = KeyParameter(keyBytes); + final iv = + Uint8List.fromList([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]); + final params = ParametersWithIV(key, iv); + + runStreamCipherTests(StreamCipher('Salsa20'), params, [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit ........', + '9d8d611ee047b47fc5e2bd5db4284463008aa89c174093d3ce4b3e8cc2594acfe9a62a84388fe060f75247d425c2fe0cd283cfce887f5c6b5dfea86d927efb36', + 'En un lugar de La Mancha, de cuyo nombre no quiero acordarme ...', + '948c330ee347b17ad1f6a25db4220840138a96940d039adf871f76c9815551c5e3e5308e2198e025b65841843dc4f400ce8bcfca87795a2f12a2eb269c7efb36', + ]); +} diff --git a/pointycastle/test/test/runners/asymmetric_block_cipher.dart b/pointycastle/test/test/runners/asymmetric_block_cipher.dart new file mode 100644 index 0000000..46e5522 --- /dev/null +++ b/pointycastle/test/test/runners/asymmetric_block_cipher.dart @@ -0,0 +1,78 @@ +// See file LICENSE for more information. + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runAsymmetricBlockCipherTests( + AsymmetricBlockCipher cipher, + CipherParameters Function() pubParams, + CipherParameters Function() privParams, + List plainCipherTextTuples) { + group('${cipher.algorithmName}:', () { + group('encrypt:', () { + for (var i = 0; i < plainCipherTextTuples.length; i += 3) { + var plainText = plainCipherTextTuples[i]; + var publicCipherText = plainCipherTextTuples[i + 1]; + var privateCipherText = plainCipherTextTuples[i + 2]; + + test( + 'public: ${formatAsTruncated(plainText)}', + () => + _runCipherTest(cipher, pubParams, plainText, publicCipherText)); + test( + 'private: ${formatAsTruncated(plainText)}', + () => _runCipherTest( + cipher, privParams, plainText, privateCipherText)); + } + }); + + group('decrypt:', () { + for (var i = 0; i < plainCipherTextTuples.length; i += 3) { + var plainText = plainCipherTextTuples[i]; + var publicCipherText = plainCipherTextTuples[i + 1]; + var privateCipherText = plainCipherTextTuples[i + 2]; + + test( + 'public: ${formatAsTruncated(plainText)}', + () => _runDecipherTest( + cipher, pubParams, privateCipherText, plainText)); + test( + 'private: ${formatAsTruncated(plainText)}', + () => _runDecipherTest( + cipher, privParams, publicCipherText, plainText)); + } + }); + }); +} + +void _runCipherTest( + AsymmetricBlockCipher cipher, + CipherParameters Function() params, + String plainTextString, + String expectedHexCipherText) { + cipher.reset(); + cipher.init(true, params()); + + var plainText = createUint8ListFromString(plainTextString); + var out = cipher.process(plainText); + var hexOut = formatBytesAsHexString(out); + + expect(hexOut, equals(expectedHexCipherText)); +} + +void _runDecipherTest( + AsymmetricBlockCipher cipher, + CipherParameters Function() params, + String hexCipherText, + String expectedPlainTextString) { + cipher.reset(); + cipher.init(false, params()); + + var cipherText = createUint8ListFromHexString(hexCipherText); + var out = cipher.process(cipherText); + var plainText = String.fromCharCodes(out); + + expect(plainText, equals(expectedPlainTextString)); +} diff --git a/pointycastle/test/test/runners/block_cipher.dart b/pointycastle/test/test/runners/block_cipher.dart new file mode 100644 index 0000000..531ce4e --- /dev/null +++ b/pointycastle/test/test/runners/block_cipher.dart @@ -0,0 +1,94 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runBlockCipherTests(BlockCipher cipher, CipherParameters? params, + List plainCipherTextPairs) { + group('${cipher.algorithmName}:', () { + group('cipher :', () { + for (var i = 0; i < plainCipherTextPairs.length; i += 2) { + var plainText = plainCipherTextPairs[i]; + var cipherText = plainCipherTextPairs[i + 1]; + + test(formatAsTruncated(plainText), + () => _runBlockCipherTest(cipher, params, plainText, cipherText)); + } + }); + + group('decipher:', () { + for (var i = 0; i < plainCipherTextPairs.length; i += 2) { + var plainText = plainCipherTextPairs[i]; + var cipherText = plainCipherTextPairs[i + 1]; + + test(formatAsTruncated(plainText), + () => _runBlockDecipherTest(cipher, params, cipherText, plainText)); + } + }); + + group('ciph&dec:', () { + var plainText = createUint8ListFromSequentialNumbers(1024); + test('1KB of sequential bytes', + () => _runBlockCipherDecipherTest(cipher, params, plainText)); + }); + }); +} + +void _resetCipher( + BlockCipher cipher, bool forEncryption, CipherParameters? params) { + cipher + ..reset() + ..init(forEncryption, params); +} + +void _runBlockCipherTest(BlockCipher cipher, CipherParameters? params, + String plainTextString, String expectedHexCipherText) { + var plainText = createUint8ListFromString(plainTextString); + + _resetCipher(cipher, true, params); + var cipherText = _processBlocks(cipher, plainText); + var hexCipherText = formatBytesAsHexString(cipherText); + + expect(hexCipherText, equals(expectedHexCipherText)); +} + +void _runBlockDecipherTest(BlockCipher cipher, CipherParameters? params, + String hexCipherText, String expectedPlainText) { + var cipherText = createUint8ListFromHexString(hexCipherText); + + _resetCipher(cipher, false, params); + var plainText = _processBlocks(cipher, cipherText); + + expect(String.fromCharCodes(plainText), equals(expectedPlainText)); +} + +void _runBlockCipherDecipherTest( + BlockCipher cipher, CipherParameters? params, Uint8List plainText) { + _resetCipher(cipher, true, params); + var cipherText = _processBlocks(cipher, plainText); + + _resetCipher(cipher, false, params); + var plainTextAgain = _processBlocks(cipher, cipherText); + + expect(plainTextAgain, equals(plainText)); +} + +Uint8List _processBlocks(BlockCipher cipher, Uint8List inp) { + var out = Uint8List(inp.lengthInBytes); + for (var offset = 0; offset < inp.lengthInBytes;) { + var len = cipher.processBlock(inp, offset, out, offset); + offset += len; + _assertRemainingBufferIsZero(out, offset); + } + return out; +} + +void _assertRemainingBufferIsZero(Uint8List out, int offset) { + if (offset < out.lengthInBytes) { + expect(out.sublist(offset), isAllZeros); + } +} diff --git a/pointycastle/test/test/runners/digest.dart b/pointycastle/test/test/runners/digest.dart new file mode 100644 index 0000000..6047408 --- /dev/null +++ b/pointycastle/test/test/runners/digest.dart @@ -0,0 +1,43 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runDigestTests(Digest digest, List plainDigestTextPairs) { + group('${digest.algorithmName}:', () { + group('digest:', () { + for (var i = 0; i < plainDigestTextPairs.length; i += 2) { + var plainText = plainDigestTextPairs[i]; + var digestText = plainDigestTextPairs[i + 1]; + + test(formatAsTruncated(plainText), + () => _runDigestTest(digest, plainText, digestText)); + } + }); + }); +} + +void _runDigestTest( + Digest digest, String plainTextString, String expectedHexDigestText) { + digest.reset(); + + var plainText = createUint8ListFromString(plainTextString); + var out = digest.process(plainText); + var hexOut = formatBytesAsHexString(out); + + expect(hexOut, equals(expectedHexDigestText)); + + for (var i = 0; i < plainText.length; ++i) { + digest.updateByte(plainText[i]); + } + out = Uint8List(digest.digestSize); + + digest.doFinal(out, 0); + hexOut = formatBytesAsHexString(out); + + expect(hexOut, equals(expectedHexDigestText)); +} diff --git a/pointycastle/test/test/runners/key_derivators.dart b/pointycastle/test/test/runners/key_derivators.dart new file mode 100644 index 0000000..ee988a8 --- /dev/null +++ b/pointycastle/test/test/runners/key_derivators.dart @@ -0,0 +1,35 @@ +// See file LICENSE for more information. + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runKeyDerivatorTests( + KeyDerivator keyDerivator, List paramsPasswordKeyTuples) { + group('${keyDerivator.algorithmName}:', () { + group('deriveKey:', () { + for (var i = 0; i < paramsPasswordKeyTuples.length; i += 3) { + var params = paramsPasswordKeyTuples[i]; + var password = paramsPasswordKeyTuples[i + 1]; + var key = paramsPasswordKeyTuples[i + 2]; + + test( + formatAsTruncated(password as String), + () => _runKeyDerivatorTest(keyDerivator, params as CipherParameters, + password, key as String)); + } + }); + }); +} + +void _runKeyDerivatorTest(KeyDerivator keyDerivator, CipherParameters params, + String password, String expectedHexKey) { + keyDerivator.init(params); + + var passwordBytes = createUint8ListFromString(password); + var out = keyDerivator.process(passwordBytes); + var hexOut = formatBytesAsHexString(out); + + expect(hexOut, equals(expectedHexKey)); +} diff --git a/pointycastle/test/test/runners/key_generators.dart b/pointycastle/test/test/runners/key_generators.dart new file mode 100644 index 0000000..0b07aba --- /dev/null +++ b/pointycastle/test/test/runners/key_generators.dart @@ -0,0 +1,24 @@ +// See file LICENSE for more information. + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +void runKeyGeneratorTests( + KeyGenerator keyGenerator, List expectedKeyPairs) { + group('${keyGenerator.algorithmName}:', () { + group('generateKeyPair:', () { + for (var i = 0; i < expectedKeyPairs.length; i++) { + test('$i', + () => _runKeyGeneratorTest(keyGenerator, expectedKeyPairs[i])); + } + }); + }); +} + +void _runKeyGeneratorTest( + KeyGenerator keyGenerator, AsymmetricKeyPair expectedKeyPair) { + var keyPair = keyGenerator.generateKeyPair(); + + expect(keyPair.privateKey, equals(expectedKeyPair.privateKey)); + expect(keyPair.publicKey, equals(expectedKeyPair.publicKey)); +} diff --git a/pointycastle/test/test/runners/mac.dart b/pointycastle/test/test/runners/mac.dart new file mode 100644 index 0000000..c0d7f2e --- /dev/null +++ b/pointycastle/test/test/runners/mac.dart @@ -0,0 +1,91 @@ +// See file LICENSE for more information. + +import 'dart:typed_data' show Uint8List; + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +import '../src/helpers.dart'; + +class PlainTextDigestPair { + PlainTextDigestPair(this.plainText, this.hexDigestText); + + final Uint8List plainText; + final String hexDigestText; +} + +void runMacTests(Mac mac, List plainDigestTextPairs) { + group('${mac.algorithmName}:', () { + group('digest:', () { + for (var i = 0; i < plainDigestTextPairs.length; i++) { + var plainText = plainDigestTextPairs[i].plainText; + var digestText = plainDigestTextPairs[i].hexDigestText; + + test(formatAsTruncated(plainText.toString()), + () => _runMacTest(mac, plainText, digestText)); + } + }); + }); +} + +void _runMacTest(Mac mac, Uint8List plainText, String expectedHexDigestText) { + mac.reset(); + + var out = mac.process(plainText); + var hexOut = formatBytesAsHexString(out); + + expect(hexOut, equals(expectedHexDigestText)); +} + +/// HMAC tests with test vectors from a single test case in +/// [RFC 4231](https://tools.ietf.org/html/rfc4231) _Identifiers and Test +/// Vectors for HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512_. + +class Rfc4231TestVector { + Rfc4231TestVector(this.name, this.keyHex, this.dataHex, this.hmacSha224, + this.hmacSha256, this.hmacSha384, this.hmacSha512, + {this.truncate128 = false}); + + final String name; + final String keyHex; + final String dataHex; + final String hmacSha224; + final String hmacSha256; + final String hmacSha384; + final String hmacSha512; + final bool truncate128; + + void run() { + final key = createUint8ListFromHexString(keyHex); + final data = createUint8ListFromHexString(dataHex); + + group(name, () { + // For the blockLengths to use, see _DIGEST_BLOCK_LENGTH in the HMAC class + _hmacTest('SHA-224/HMAC', key, data, hmacSha224, truncate128); + _hmacTest('SHA-256/HMAC', key, data, hmacSha256, truncate128); + _hmacTest('SHA-384/HMAC', key, data, hmacSha384, truncate128); + _hmacTest('SHA-512/HMAC', key, data, hmacSha512, truncate128); + }); + } + + void _hmacTest(String hmacName, Uint8List key, Uint8List data, + String expected, bool truncate128) { + test(hmacName, () { + final hmac = Mac(hmacName)..init(KeyParameter(key)); + + final d = hmac.process(data); + + final result = formatBytesAsHexString(truncate128 ? d.sublist(0, 16) : d); + //print('$testName: $result'); + expect(result, equals(expected)); + }); + } + + static void runAll(Iterable testCases) { + group('Tests from RFC 4231', () { + for (final t in testCases) { + t.run(); + } + }); + } +} diff --git a/pointycastle/test/test/runners/padding.dart b/pointycastle/test/test/runners/padding.dart new file mode 100644 index 0000000..46629ad --- /dev/null +++ b/pointycastle/test/test/runners/padding.dart @@ -0,0 +1,33 @@ +// See file LICENSE for more information. + +import 'dart:typed_data' show Uint8List; + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runPaddingTest(Padding pad, CipherParameters? params, Uint8List unpadData, + int padLength, String padData) { + group('${pad.algorithmName}:', () { + test('addPadding: ${unpadData.toString()}', () { + var expectedBytes = createUint8ListFromHexString(padData); + var dataBytes = Uint8List(padLength)..setAll(0, unpadData); + + pad.init(params); + var ret = pad.addPadding(dataBytes, unpadData.length); + + expect(ret, equals(padLength - unpadData.length)); + expect(dataBytes, equals(expectedBytes)); + }); + + test('padCount: $padData', () { + var dataBytes = createUint8ListFromHexString(padData); + + pad.init(params); + var ret = pad.padCount(dataBytes); + + expect(ret, equals(padLength - unpadData.length)); + }); + }); +} diff --git a/pointycastle/test/test/runners/registry.dart b/pointycastle/test/test/runners/registry.dart new file mode 100644 index 0000000..f0063aa --- /dev/null +++ b/pointycastle/test/test/runners/registry.dart @@ -0,0 +1,92 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/pointycastle.dart'; +import 'package:test/test.dart'; + +void testAsymmetricBlockCipher(String algorithmName) { + var cipher = AsymmetricBlockCipher(algorithmName); + expect(cipher, const TypeMatcher()); + expect(cipher.algorithmName, algorithmName); +} + +void testBlockCipher(String algorithmName) { + var cipher = BlockCipher(algorithmName); + expect(cipher, const TypeMatcher()); + expect(cipher.algorithmName, algorithmName); +} + +void testDigest(String algorithmName) { + var digest = Digest(algorithmName); + expect(digest, const TypeMatcher()); + expect(digest.algorithmName, algorithmName); +} + +void testECDomainParameters(String domainName) { + var domain = ECDomainParameters(domainName); + expect(domain, const TypeMatcher()); + expect(domain.domainName, domainName); +} + +void testKeyDerivator(String algorithmName) { + var kf = KeyDerivator(algorithmName); + expect(kf, const TypeMatcher()); + expect(kf.algorithmName, algorithmName); +} + +void testKeyGenerator(String algorithmName) { + var kg = KeyGenerator(algorithmName); + expect(kg, const TypeMatcher()); + expect(kg.algorithmName, algorithmName); +} + +void testMac(String algorithmName) { + var mac = Mac(algorithmName); + expect(mac, const TypeMatcher()); + expect(mac.algorithmName, algorithmName); +} + +void testPaddedBlockCipher(String algorithmName) { + var parts = algorithmName.split('/'); + + var pbc = PaddedBlockCipher(algorithmName); + expect(pbc, const TypeMatcher()); + expect(pbc.algorithmName, algorithmName); + + var padding = pbc.padding; + expect(padding, const TypeMatcher()); + expect(padding.algorithmName, equals(parts[2])); + + var cbc = pbc.cipher; + expect(cbc, const TypeMatcher()); + expect(cbc.algorithmName, equals('${parts[0]}/${parts[1]}')); +} + +void testPadding(String algorithmName) { + var padding = Padding(algorithmName); + expect(padding, const TypeMatcher()); + expect(padding.algorithmName, algorithmName); +} + +void testSecureRandom(String algorithmName) { + var rnd = SecureRandom(algorithmName); + expect(rnd, const TypeMatcher()); + expect(rnd.algorithmName, algorithmName); +} + +void testSigner(String algorithmName) { + var signer = Signer(algorithmName); + expect(signer, const TypeMatcher()); + expect(signer.algorithmName, algorithmName); +} + +void testStreamCipher(String algorithmName) { + var cipher = StreamCipher(algorithmName); + expect(cipher, const TypeMatcher()); + expect(cipher.algorithmName, algorithmName); +} + +void testAEADCipher(String algorithmName) { + var cipher = AEADCipher(algorithmName); + expect(cipher, const TypeMatcher()); + expect(cipher.algorithmName, algorithmName); +} diff --git a/pointycastle/test/test/runners/signer.dart b/pointycastle/test/test/runners/signer.dart new file mode 100644 index 0000000..e314751 --- /dev/null +++ b/pointycastle/test/test/runners/signer.dart @@ -0,0 +1,114 @@ +// See file LICENSE for more information. + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runSignerTests(Signer signer, CipherParameters Function() signParams, + CipherParameters Function() verifyParams, List messageSignaturePairs) { + group('${signer.algorithmName}:', () { + group('generateSignature:', () { + for (var i = 0; i < messageSignaturePairs.length; i += 2) { + var message = messageSignaturePairs[i]; + var signature = messageSignaturePairs[i + 1]; + + test( + formatAsTruncated(message as String), + () => _runGenerateSignatureTest( + signer, signParams, message, signature as Signature)); + } + }); + + group('verifySignature:', () { + for (var i = 0; i < messageSignaturePairs.length; i += 2) { + var message = messageSignaturePairs[i]; + var signature = messageSignaturePairs[i + 1]; + + test( + formatAsTruncated(message as String), + () => _runVerifySignatureTest( + signer, verifyParams, message, signature as Signature)); + } + }); + }); +} + +void _runGenerateSignatureTest( + Signer signer, + CipherParameters Function() params, + String message, + Signature expectedSignature) { + signer.reset(); + signer.init(true, params()); + + var signature = signer.generateSignature(createUint8ListFromString(message)); + + expect(signature, expectedSignature); +} + +void _runVerifySignatureTest(Signer signer, CipherParameters Function() params, + String message, Signature signature) { + signer.reset(); + signer.init(false, params()); + + var ok = + signer.verifySignature(createUint8ListFromString(message), signature); + + expect(ok, true); +} + +// ----- + +void runSignerTestsFail(Signer signer, CipherParameters Function() signParams, + CipherParameters Function() verifyParams, List messageSignaturePairs) { + group('${signer.algorithmName}:', () { + group('generateSignature:', () { + for (var i = 0; i < messageSignaturePairs.length; i += 2) { + var message = messageSignaturePairs[i]; + var signature = messageSignaturePairs[i + 1]; + + test( + formatAsTruncated(message as String), + () => _runGenerateSignatureTestFail( + signer, signParams, message, signature as Signature)); + } + }); + + group('verifySignature:', () { + for (var i = 0; i < messageSignaturePairs.length; i += 2) { + var message = messageSignaturePairs[i]; + var signature = messageSignaturePairs[i + 1]; + + test( + formatAsTruncated(message as String), + () => _runVerifySignatureTestFail( + signer, verifyParams, message, signature as Signature)); + } + }); + }); +} + +void _runGenerateSignatureTestFail( + Signer signer, + CipherParameters Function() params, + String message, + Signature expectedSignature) { + signer.reset(); + signer.init(true, params()); + + var signature = signer.generateSignature(createUint8ListFromString(message)); + + expect(signature, isNot(equals(expectedSignature))); +} + +void _runVerifySignatureTestFail(Signer signer, + CipherParameters Function() params, String message, Signature signature) { + signer.reset(); + signer.init(false, params()); + + var ok = + signer.verifySignature(createUint8ListFromString(message), signature); + + expect(ok, false); +} diff --git a/pointycastle/test/test/runners/stream_cipher.dart b/pointycastle/test/test/runners/stream_cipher.dart new file mode 100644 index 0000000..272f124 --- /dev/null +++ b/pointycastle/test/test/runners/stream_cipher.dart @@ -0,0 +1,80 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:test/test.dart'; +import 'package:pointycastle/pointycastle.dart'; + +import '../src/helpers.dart'; + +void runStreamCipherTests(StreamCipher cipher, CipherParameters params, + List plainCipherTextPairs) { + group('${cipher.algorithmName}:', () { + group('cipher :', () { + for (var i = 0; i < plainCipherTextPairs.length; i += 2) { + var plainText = plainCipherTextPairs[i]; + var cipherText = plainCipherTextPairs[i + 1]; + + test(formatAsTruncated(plainText), + () => _runStreamCipherTest(cipher, params, plainText, cipherText)); + } + }); + + group('decipher:', () { + for (var i = 0; i < plainCipherTextPairs.length; i += 2) { + var plainText = plainCipherTextPairs[i]; + var cipherText = plainCipherTextPairs[i + 1]; + + test( + formatAsTruncated(plainText), + () => + _runStreamDecipherTest(cipher, params, cipherText, plainText)); + } + }); + + group('ciph&dec:', () { + var plainText = createUint8ListFromSequentialNumbers(1021); + test('~1KB of sequential bytes', + () => _runStreamCipherDecipherTest(cipher, params, plainText)); + }); + }); +} + +void _resetCipher( + StreamCipher cipher, bool forEncryption, CipherParameters params) { + cipher + ..reset() + ..init(forEncryption, params); +} + +void _runStreamCipherTest(StreamCipher cipher, CipherParameters params, + String plainTextString, String expectedHexCipherText) { + _resetCipher(cipher, true, params); + + var plainText = createUint8ListFromString(plainTextString); + var cipherText = cipher.process(plainText); + var hexCipherText = formatBytesAsHexString(cipherText); + + expect(hexCipherText, equals(expectedHexCipherText)); +} + +void _runStreamDecipherTest(StreamCipher cipher, CipherParameters params, + String hexCipherText, String expectedPlainText) { + _resetCipher(cipher, false, params); + + var cipherText = createUint8ListFromHexString(hexCipherText); + var plainText = cipher.process(cipherText); + + expect(String.fromCharCodes(plainText), equals(expectedPlainText)); +} + +void _runStreamCipherDecipherTest( + StreamCipher cipher, CipherParameters params, Uint8List plainText) { + _resetCipher(cipher, true, params); + var cipherText = cipher.process(plainText); + + _resetCipher(cipher, false, params); + var plainTextAgain = cipher.process(cipherText); + + expect(plainTextAgain, equals(plainText)); +} diff --git a/pointycastle/test/test/src/fixed_secure_random.dart b/pointycastle/test/test/src/fixed_secure_random.dart new file mode 100644 index 0000000..a052c99 --- /dev/null +++ b/pointycastle/test/test/src/fixed_secure_random.dart @@ -0,0 +1,58 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/secure_random_base.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of [SecureRandom] that return fixed values. +/// +/// The source of the fixed values is set using the [seed] method. +/// +/// Will throw StateError when end of entropy source is reached or if +/// no values are set. +/// +/// For example, +/// +/// Uint8List s = ... +/// +/// FixedSecureRandom sr = FixedSecureRandom(); +/// sr.seed(KeyParameter(s); +/// +/// final a = sr.nextUint8(); +/// final b = sr.nextUint8(); +/// final c = sr.nextUint8(); +/// assert (a == s[0] && b = s[1] && c == s[2]); +class FixedSecureRandom extends SecureRandomBase { + // ignore: non_constant_identifier_names + static final FactoryConfig FACTORY_CONFIG = + StaticFactoryConfig(SecureRandom, 'Fixed', () => FixedSecureRandom()); + + var _next = 0; + // ignore: prefer_typing_uninitialized_variables + Uint8List? _values; + + @override + String get algorithmName => 'Fixed'; + + /// Set the fixed values to use and reset to the beginning of it. + + @override + void seed(covariant KeyParameter params) { + _values = params.key; // set the values to use (could be null or empty) + _next = 0; // reset to the beginning of the values + } + + @override + int nextUint8() { + if (_values != null && _values!.isNotEmpty) { + if (_next >= _values!.length) { + throw StateError('fixed secure random unexpectedly exhausted'); + } + return _values![_next++]; + } else { + throw StateError('fixed secure random has no values'); + } + } +} diff --git a/pointycastle/test/test/src/helpers.dart b/pointycastle/test/test/src/helpers.dart new file mode 100644 index 0000000..db2e77d --- /dev/null +++ b/pointycastle/test/test/src/helpers.dart @@ -0,0 +1,158 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/paddings/pkcs7.dart'; +import 'package:test/test.dart'; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Format ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +String formatAsTruncated(String str) { + if (str.length > 26) { + return '${str.substring(0, 26)}[...]'; + } else if (str.isEmpty) { + return '(empty string)'; + } else { + return str; + } +} + +String formatAsHumanSize(num size) { + if (size < 1024) return '$size B'; + if (size < 1024 * 1024) return '${_format(size / 1024)} KB'; + if (size < 1024 * 1024 * 1024) return '${_format(size / (1024 * 1024))} MB'; + return '${_format(size / (1024 * 1024 * 1024))} GB'; +} + +String formatBytesAsHexString(Uint8List bytes) { + var result = StringBuffer(); + for (var i = 0; i < bytes.lengthInBytes; i++) { + var part = bytes[i]; + result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}'); + } + return result.toString(); +} + +String _format(double val) { + if (val.isInfinite) { + return 'INF'; + } else if (val.isNaN) { + return 'NaN'; + } else { + return '${val.floor()}.${(100 * (val - val.toInt())).toInt()}'; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Data //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Uint8List createUint8ListFromString(String s) { + var ret = Uint8List(s.length); + for (var i = 0; i < s.length; i++) { + ret[i] = s.codeUnitAt(i); + } + return ret; +} + +Uint8List createUint8ListFromHexString(String hex) { + hex = hex.replaceAll(RegExp(r'\s'), ''); // remove all whitespace, if any + + var result = Uint8List(hex.length ~/ 2); + for (var i = 0; i < hex.length; i += 2) { + var num = hex.substring(i, i + 2); + var byte = int.parse(num, radix: 16); + result[i ~/ 2] = byte; + } + return result; +} + +Uint8List createUint8ListFromSequentialNumbers(int len) { + var ret = Uint8List(len); + for (var i = 0; i < len; i++) { + ret[i] = i; + } + return ret; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Matchers //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const isAllZeros = _IsAllZeros(); + +class _IsAllZeros extends Matcher { + const _IsAllZeros(); + + @override + bool matches(covariant Iterable item, Map matchState) { + for (var i in item) { + if (i != 0) return false; + } + return true; + } + + @override + Description describe(Description description) => + description.add('is all zeros'); + + @override + Description describeMismatch(item, Description mismatchDescription, + Map matchState, bool verbose) => + mismatchDescription.add('is not all zeros'); +} + +void blockCipherTest(int id, BlockCipher cipher, CipherParameters parameters, + String input, String output) { + test('BlockCipher Test: $id ', () { + var input0 = createUint8ListFromHexString(input); + var output0 = createUint8ListFromHexString(output); + + cipher.init(true, parameters); + var out = Uint8List(input0.length); + var p = 0; + while (p < input0.length) { + p += cipher.processBlock(input0, p, out, p); + } + + expect(output0, equals(out), reason: '$id did not match output'); + + cipher.init(false, parameters); + out = Uint8List(output0.length); + p = 0; + while (p < output0.length) { + p += cipher.processBlock(output0, p, out, p); + } + + expect(input0, equals(out), reason: '$id did not match input'); + }); +} + +void streamCipherTest(int id, StreamCipher cipher, CipherParameters parameters, + String input, String output) { + test('StreamCipher Test: $id ', () { + var input0 = createUint8ListFromHexString(input); + var output0 = createUint8ListFromHexString(output); + + cipher.init(true, parameters); + var out = cipher.process(input0); + + expect(output0, equals(out), reason: '$id did not match output'); + + cipher.init(false, parameters); + out = cipher.process(out); + + expect(input0, equals(out), reason: '$id did not match input'); + }); +} + +Uint8List addPKCS7Padding(Uint8List bytes, int blockSizeBytes) { + final padLength = blockSizeBytes - (bytes.length % blockSizeBytes); + + final padded = Uint8List(bytes.length + padLength)..setAll(0, bytes); + PKCS7Padding().addPadding(padded, bytes.length); + + return padded; +} diff --git a/pointycastle/test/test/src/null_asymmetric_block_cipher.dart b/pointycastle/test/test/src/null_asymmetric_block_cipher.dart new file mode 100644 index 0000000..34001e2 --- /dev/null +++ b/pointycastle/test/test/src/null_asymmetric_block_cipher.dart @@ -0,0 +1,49 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/impl/base_asymmetric_block_cipher.dart'; + +/// An implementation of a null [AsymmetricBlockCipher], that is, a cipher that does not encrypt, neither decrypt. It can be used +/// for testing or benchmarking chaining algorithms. +class NullAsymmetricBlockCipher extends BaseAsymmetricBlockCipher { + /// Intended for internal use. + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + AsymmetricBlockCipher, + r'^Null$', + (s, m) => () { + return NullAsymmetricBlockCipher(70, 70); + }, + ); + + @override + final int inputBlockSize; + @override + final int outputBlockSize; + + NullAsymmetricBlockCipher(this.inputBlockSize, this.outputBlockSize); + + @override + String get algorithmName => 'Null'; + + @override + void reset() {} + + @override + void init(bool forEncryption, CipherParameters params) {} + + @override + int processBlock( + Uint8List? inp, int inpOff, int len, Uint8List out, int outOff) { + out.setRange(outOff, outOff + len, inp!.sublist(inpOff)); + return len; + } +} + +class NullAsymmetricKey implements AsymmetricKey {} + +class NullPublicKey extends NullAsymmetricKey implements PublicKey {} + +class NullPrivateKey extends NullAsymmetricKey implements PrivateKey {} diff --git a/pointycastle/test/test/src/null_block_cipher.dart b/pointycastle/test/test/src/null_block_cipher.dart new file mode 100644 index 0000000..22e678c --- /dev/null +++ b/pointycastle/test/test/src/null_block_cipher.dart @@ -0,0 +1,37 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_block_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of a null [BlockCipher], that is, a cipher that does not encrypt, neither decrypt. It can be used for +/// testing or benchmarking chaining algorithms. +class NullBlockCipher extends BaseBlockCipher { + static final FactoryConfig factoryConfig = DynamicFactoryConfig.regex( + BlockCipher, r'^Null(?:-([0-9]+))?$', (_, Match match) { + final blockSize = match.group(1) == null ? 16 : int.parse(match.group(1)!); + return () => NullBlockCipher(blockSize); + }); + + @override + final int blockSize; + + NullBlockCipher([this.blockSize = 16]); + + @override + String get algorithmName => 'Null'; + + @override + void reset() {} + + @override + void init(bool forEncryption, CipherParameters? params) {} + + @override + int processBlock(Uint8List? inp, int inpOff, Uint8List? out, int outOff) { + out!.setRange(outOff, outOff + blockSize, inp!.sublist(inpOff)); + return blockSize; + } +} diff --git a/pointycastle/test/test/src/null_digest.dart b/pointycastle/test/test/src/null_digest.dart new file mode 100644 index 0000000..b845f5e --- /dev/null +++ b/pointycastle/test/test/src/null_digest.dart @@ -0,0 +1,36 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_digest.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of a null [Digest], that is, a digest that returns an empty string. It can be +/// used for testing or benchmarking chaining algorithms. +class NullDigest extends BaseDigest { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(Digest, 'Null', () => NullDigest()); + + @override + final int digestSize; + + NullDigest([this.digestSize = 32]); + @override + final String algorithmName = 'Null'; + @override + void reset() {} + @override + void updateByte(int inp) {} + @override + void update(Uint8List? inp, int inpOff, int? len) {} + @override + int doFinal(Uint8List? out, int? outOff) { + out!.fillRange(0, digestSize, 0); + return digestSize; + } + + @override + // TODO: implement byteLength + int get byteLength => throw UnimplementedError(); +} diff --git a/pointycastle/test/test/src/null_secure_random.dart b/pointycastle/test/test/src/null_secure_random.dart new file mode 100644 index 0000000..ac75759 --- /dev/null +++ b/pointycastle/test/test/src/null_secure_random.dart @@ -0,0 +1,20 @@ +// See file LICENSE for more information. + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/secure_random_base.dart'; +import 'package:pointycastle/src/registry/registry.dart'; +import 'package:pointycastle/src/ufixnum.dart'; + +/// An implementation of [SecureRandom] that return numbers in growing sequence. +class NullSecureRandom extends SecureRandomBase { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(SecureRandom, 'Null', () => NullSecureRandom()); + + var _nextValue = 0; + @override + String get algorithmName => 'Null'; + @override + void seed(CipherParameters params) {} + @override + int nextUint8() => clip8(_nextValue++); +} diff --git a/pointycastle/test/test/src/null_stream_cipher.dart b/pointycastle/test/test/src/null_stream_cipher.dart new file mode 100644 index 0000000..b67bf26 --- /dev/null +++ b/pointycastle/test/test/src/null_stream_cipher.dart @@ -0,0 +1,30 @@ +// See file LICENSE for more information. + +import 'dart:typed_data'; + +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/src/impl/base_stream_cipher.dart'; +import 'package:pointycastle/src/registry/registry.dart'; + +/// An implementation of a null [StreamCipher], that is, a cipher that does not encrypt, neither decrypt. It can be used for +/// testing or benchmarking chaining algorithms. +class NullStreamCipher extends BaseStreamCipher { + static final FactoryConfig factoryConfig = + StaticFactoryConfig(StreamCipher, 'Null', () => NullStreamCipher()); + @override + String get algorithmName => 'Null'; + @override + void reset() {} + @override + void init(bool forEncryption, CipherParameters? params) {} + @override + void processBytes( + Uint8List? inp, int inpOff, int len, Uint8List? out, int outOff) { + out!.setRange(outOff, outOff + len, inp!.sublist(inpOff)); + } + + @override + int returnByte(int inp) { + return inp; + } +} diff --git a/pointycastle/test/test_resources/kdf-56c/KDA.req.json b/pointycastle/test/test_resources/kdf-56c/KDA.req.json new file mode 100644 index 0000000..63f8063 --- /dev/null +++ b/pointycastle/test/test_resources/kdf-56c/KDA.req.json @@ -0,0 +1,72385 @@ +[ + { + "acvVersion": "1.0" + }, + { + "vsId": 0, + "algorithm": "KDA", + "mode": "OneStep", + "revision": "Sp800-56Cr2", + "isSample": false, + "testGroups": [ + { + "tgId": 1, + "testType": "AFT", + "tests": [ + { + "tcId": 1, + "kdfParameter": { + "kdfType": "oneStep", + "t": "951BCF10BF7CC913CBB9FC42FA97A033", + "z": "EF9D10CD82FC948F3F1FF84DF159D43888DB02AA7E0355D8EC64209F89B59A69", + "l": 1024, + "algorithmId": "2FAF70A225AC56BFADCF4A4C105F493B" + }, + "fixedInfoPartyU": { + "partyId": "11213AF8ED21AB3C138F26BA08BB173A" + }, + "fixedInfoPartyV": { + "partyId": "B8C81FE1230BF9767A71482A763B87F4" + } + }, + { + "tcId": 2, + "kdfParameter": { + "kdfType": "oneStep", + "t": "624FEE40AFD35B3C6A5C62CFD1A31E20", + "z": "65FF712BBC5D716DD0AA32F0F81960F5F3D8F52EE62C3080498EBAC69AD5CB60", + "l": 1024, + "algorithmId": "26DCA9F4E1302B533F20FF1899DBC932" + }, + "fixedInfoPartyU": { + "partyId": "473B75359F515A8F655F42D32981CEDB", + "ephemeralData": "36F89A0BE09668B400B21FAF73600BC7310E1ED25D552C05202E7257D5E0BAE0" + }, + "fixedInfoPartyV": { + "partyId": "3CBD070A15CD08535C838F1EB74B3816", + "ephemeralData": "ABACF59D51A7200487371357D299471F346B154DDBEF21E007C0D4D3DB696E6D" + } + }, + { + "tcId": 3, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BFFB6EFCFD30B63BC7FDCF8E05C2D624", + "z": "7F1C81B122A8AA47F4F6E0BC4B9E479189A817FBD11D04552BAE937918B7070C", + "l": 1024, + "algorithmId": "96F3255DF1D4B9ED187FE1D9E47145C3" + }, + "fixedInfoPartyU": { + "partyId": "23CB2BB289AF9627911DDA6E55E414BE", + "ephemeralData": "DE1B416D3025240C2AB61A5333E7139DE8D37A8CEACFD0C3102C03AFD0B56CA6" + }, + "fixedInfoPartyV": { + "partyId": "1C9BA74D09AB45B8100EAE67150A1485", + "ephemeralData": "8964DCAD6E0D7AD604EF81BE707765F1B581A2FBDE8BC48AB58CBAF0E41814A0" + } + }, + { + "tcId": 4, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D73F0A660D96A11A62E7ED2E54AD7972", + "z": "172C1F0AA7FF50D9956B582940BE77042107072BE4C5C2C7C3CC741BF3169836", + "l": 1024, + "algorithmId": "2A2813BA3399BE22932CA04819B2C082" + }, + "fixedInfoPartyU": { + "partyId": "123602276C8DE9ACFE0F35FC22FCC27E", + "ephemeralData": "19D76EFECB4093BF68CF24E50A6966AE95A8B92574CA19812DDEADFF4CEE0975" + }, + "fixedInfoPartyV": { + "partyId": "2F8789441B7AF51E147FCB3E16950DEC" + } + }, + { + "tcId": 5, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F524D8BCD84F0FAFA50F33B5A5DACAFA", + "z": "4D64FBAE9A25F34B0522B49B084848191405E141FF3C8C24E55BF9AB72D1C4BF", + "l": 1024, + "algorithmId": "8BAEBC7B376F5B2521D3FDA9D5995B38" + }, + "fixedInfoPartyU": { + "partyId": "CE6310F62981F46F00DF3BEBB7787A36", + "ephemeralData": "903B0FF832A6994768DD294E69C7C9EF272937C0D4B726CCA20B5A1B8F74BE3A" + }, + "fixedInfoPartyV": { + "partyId": "BDAE2C27151F156D201ABDF03C739056", + "ephemeralData": "EB1A41C80A39FCA7AF3137EDC3307D27EBBDA9D8B382480BE111BB649C460602" + } + }, + { + "tcId": 6, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4D855196C036648C3F244D8EAE51F06", + "z": "31F50577BF6205864B90904D3CB3D4FB642E934B92BF914E48FA8B38DE46497B", + "l": 1024, + "algorithmId": "69114C21A8156D860E717A25ABC87890" + }, + "fixedInfoPartyU": { + "partyId": "B5775F85479C9D257A303206D72C2095" + }, + "fixedInfoPartyV": { + "partyId": "9B49D13B293258FAB9EBA79BA144719E" + } + }, + { + "tcId": 7, + "kdfParameter": { + "kdfType": "oneStep", + "t": "141F9857E23765B0B6992B6D446DDF30", + "z": "35A2EBF973FB1DC74E5EA2577B20CA5756CE385FDEC622F1D5CBA013FA8E9714", + "l": 1024, + "algorithmId": "60280D7472D5C7CDF9CD31D8ACD3607A" + }, + "fixedInfoPartyU": { + "partyId": "7856BA654B539713904C2D7EDC5DC1A8" + }, + "fixedInfoPartyV": { + "partyId": "7F06DC57A4F5333F3872BDA3778D8BE0", + "ephemeralData": "4DBBBCEB57F93EA4EB0404BD156018DD83C60CE9134EBF67907D29D8F2DA9D35" + } + }, + { + "tcId": 8, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12548D1885D07CB2ADAFF096C34F4E65", + "z": "B756DF7D831ACD4C202A63D07D779A58A340CF2FDC8D921B3E296FE65A029789", + "l": 1024, + "algorithmId": "ACC068A22399B1446F644EFFCC7AFC11" + }, + "fixedInfoPartyU": { + "partyId": "E27DD36203A71125F6C565660A9A875D", + "ephemeralData": "4F79BD26BBBF5781D5F33D3535A87FD63B3CC0A555190EE16D2542D7167D2C2D" + }, + "fixedInfoPartyV": { + "partyId": "507FA0AC56849C744585A0D9B2504737", + "ephemeralData": "D8E0289CB899C162F93562896F5D1DC994234669837F95A839EF05ACD5548CC7" + } + }, + { + "tcId": 9, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F3EE1BE4275E93664E8CFFB755B8BD5E", + "z": "2AC0C6A1C103FA7AF2DCB9F76CDFDF1C04C85A81A12117C26AEF51A9C71FA536", + "l": 1024, + "algorithmId": "AF68FF78BC4D1346A4EEFF54694806F1" + }, + "fixedInfoPartyU": { + "partyId": "0CCCEBDD9F924DCD0D06A1E0D2855924" + }, + "fixedInfoPartyV": { + "partyId": "57FCC92E4EAF4C2DC97DFB813B050B59" + } + }, + { + "tcId": 10, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EFDDF552E42459DBEEADE650023CE96E", + "z": "35E2BA2DCE3C66FA72ED31A72AD216871EAC9F153AE980F3F6331B15540AD240", + "l": 1024, + "algorithmId": "816E9AB6301A1C2A359E52271854A759" + }, + "fixedInfoPartyU": { + "partyId": "3BD872FDCF0E45B6526B1A90E3EF2A3E" + }, + "fixedInfoPartyV": { + "partyId": "9D39C864DEAE5A97E40F48B3223C5C06", + "ephemeralData": "D57D5274BDC0F9FFDFE28B13A65D2722018D87751E2361737FAA6D8EC8B0EAFC" + } + }, + { + "tcId": 11, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48257A339B2EA22A6B5D12CAC7B5487C", + "z": "607CFA3BD57D02D78F133E48B4D7F7046239C79822BED7434FD2972481FDE673", + "l": 1024, + "algorithmId": "97840D6AC6726FDBAF956A77A76E34A1" + }, + "fixedInfoPartyU": { + "partyId": "62D33B53F3836575E572020F8352294A" + }, + "fixedInfoPartyV": { + "partyId": "5B4914FC1922AA6ED2350070A33C96CB", + "ephemeralData": "395079CB4F58A0B01D29DABD40636F6D1B2E9C3B20BBE23FF1840253B6756ED7" + } + }, + { + "tcId": 12, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C5E92143EF30FF9A8C33F963ACAFB2F", + "z": "FD1040420B165E5FCA2CC27F72B9143E5711F4E21F996558BD7CF9E0B0A26424", + "l": 1024, + "algorithmId": "29FAD96959E3EE90247F351B0F062209" + }, + "fixedInfoPartyU": { + "partyId": "05C6A3A531E20D7F35484A3605347790" + }, + "fixedInfoPartyV": { + "partyId": "55177A71E28250D83862ECECD8FFFF9B", + "ephemeralData": "CA930D53C6F95ECDD28AA3251041A60D1098BB24FAE072F383CBF4200BBF6A8F" + } + }, + { + "tcId": 13, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA85DB272DEF985CD36E70212B86D9ED", + "z": "96C371F56A0BEAA3A62B768EBA8CD36CF9BD3EEBDF0EA2C72F428756F384CD0E", + "l": 1024, + "algorithmId": "081CDE915903DE71EB9FE50368BE1217" + }, + "fixedInfoPartyU": { + "partyId": "1DE78F617E63569666B22859C34A3858", + "ephemeralData": "031444AD1238242621439FFAF4B38678DE563AD87B6B4FDEA2983BCB4E53C1F6" + }, + "fixedInfoPartyV": { + "partyId": "1CBEEA46D87B21B1FC8D4770AFFF8FEE", + "ephemeralData": "653CDA6A23D843B6F9306EA63B498D683B99F48503A627327E56E1283408E99F" + } + }, + { + "tcId": 14, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA18078268F497D5CB6AF97DAFFF2A62", + "z": "5B5289FF5D322A70EF6D6B419EA8CD673A17BB5291605C8B33F5B4B3FDC9972D", + "l": 1024, + "algorithmId": "6B946C9775E45B62D4F2F4F508F6DAE9" + }, + "fixedInfoPartyU": { + "partyId": "1978D8992123CC34ADB897A300481A42" + }, + "fixedInfoPartyV": { + "partyId": "0901349882888DDA29C189795EB501BA", + "ephemeralData": "22979C2A300AC8D68691C9FC9D8844DD19B297564C47746AFA14D0971673384F" + } + }, + { + "tcId": 15, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34FF150BA81036ECCC240E09BFF05AF1", + "z": "048ECA46DBAE4CCAD21C2FF787B76C8305E65B8616E231EE6CE52BC0E6E41A6C", + "l": 1024, + "algorithmId": "1501C2061A637C19997256129A18EEE0" + }, + "fixedInfoPartyU": { + "partyId": "91450D2CD8D18374C5541ADDECAD2E7D" + }, + "fixedInfoPartyV": { + "partyId": "A22326097D741C12FD3C3D775D9F240A" + } + }, + { + "tcId": 16, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1366DB12FE8489EC2D998E1C32787DB1", + "z": "6EB3D097C38AD57F3D3D9E1095B6EF12E0BF167C8098D58D4E18745B6CB39B0F", + "l": 1024, + "algorithmId": "B2DC878DCE8A114AC6CE1C4C760218CC" + }, + "fixedInfoPartyU": { + "partyId": "D5B018F646A429643D576FD4F1BE76AA" + }, + "fixedInfoPartyV": { + "partyId": "21BDB655EA86ED755D7102D12422EBA4", + "ephemeralData": "E7730F52D1825E944D73D94991E4F3F8B4246647F6F9E6317998A30CCD5705D5" + } + }, + { + "tcId": 17, + "kdfParameter": { + "kdfType": "oneStep", + "t": "469675D66083A4CFC7E236CACDA4504D", + "z": "CF13591B2A0AE00297EB262A47C0C6F02E56319F01A27188BE36E8110F3264D0", + "l": 1024, + "algorithmId": "E8DF6DBCE5B45144EAB99ECED9A8E5CD" + }, + "fixedInfoPartyU": { + "partyId": "9D27E1945945E61965D7CF3A58146DBB" + }, + "fixedInfoPartyV": { + "partyId": "5D2FA30CDD300D9B78A91C4FB4107055", + "ephemeralData": "16430C88A6C19FDF6B516C1A03E9C5DB6DB8210392E1442D5BEF21F3FD1D3245" + } + }, + { + "tcId": 18, + "kdfParameter": { + "kdfType": "oneStep", + "t": "55BAC1439BA6EB817F4EA9B881F18D2C", + "z": "3EC6BC1BE73E6A1EEE667EB590DC294426D40E47BFDB883F3F0999B1768201A8", + "l": 1024, + "algorithmId": "19C76A575D179EFF0958C2D3C0EA6D97" + }, + "fixedInfoPartyU": { + "partyId": "72378ECD3042B184926750E756B4C1E3", + "ephemeralData": "329020353C030B4AC1F33E7D5986DB9DC18223215B4757949B2AA02AE41A5780" + }, + "fixedInfoPartyV": { + "partyId": "8D633720F853BB8A21B95AAB659BD0CB", + "ephemeralData": "A813A1FBEAC2CF652143151D88508F14C77365EE9C1E995863419919B1B22F6F" + } + }, + { + "tcId": 19, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3FB7842B7E801479B1D01DA7743D517", + "z": "4072ECC574C940B13A4627917B07A16E41ADA53714BB7680DCAD4F114E071D86", + "l": 1024, + "algorithmId": "92BD30304F11DDB8B5A4AD7611DBCE3C" + }, + "fixedInfoPartyU": { + "partyId": "A263084664F66627C7806F2813C96EE2" + }, + "fixedInfoPartyV": { + "partyId": "0394163986D19CCCD65F118070A048A7" + } + }, + { + "tcId": 20, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DA7A54E2822DB4237DCD104CD2C699D", + "z": "7FC4F6AD26CE99AEFBD4D5B5EF80876AF975C8C396F7678730C1AB7288F345DA", + "l": 1024, + "algorithmId": "315CA30AAAB91924121FD00211D08BCD" + }, + "fixedInfoPartyU": { + "partyId": "797346DA9C45FBA8F1BFD3B0C4CF3C71", + "ephemeralData": "256821378FB9478EC89649B1F8872478A390829BDDD9D9F77005C8B825C6BD28" + }, + "fixedInfoPartyV": { + "partyId": "780C14E6F9B854CA73B959FD3985C054" + } + }, + { + "tcId": 21, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B3E6700D802F2C30670210873AB9F213", + "z": "4192423B66C97A86A179FE27D568A377565A41D4522F8FC680B8722D272ADE2C", + "l": 1024, + "algorithmId": "0D401B84B62D32B19FC36A92FAE189B2" + }, + "fixedInfoPartyU": { + "partyId": "EF93B0E0F7733939A0E019F0A589794C", + "ephemeralData": "E7D6C0828AED9BC7C35E66B4B75A06EEFD834552A8B2A089642E8C10076909D8" + }, + "fixedInfoPartyV": { + "partyId": "F4E7F82D7867405BED3B3928396294DA" + } + }, + { + "tcId": 22, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3500C18A7A94FC9D570167B7170FF733", + "z": "48298C9EFF0863B8FAD9843E85A778DD3EA7242D3AE288E8BCA86F4DB91EEA17", + "l": 1024, + "algorithmId": "87309D5B4BE2080AB30733FBA5BABA61" + }, + "fixedInfoPartyU": { + "partyId": "7829C7852E2E524EC339777E7034AD07", + "ephemeralData": "39F175AA55EB37E43E66BF36F07F32995F5C1EA967EA01241093F67A19119C56" + }, + "fixedInfoPartyV": { + "partyId": "34A55C4F755A60A1B78C2F17EF47AA8F" + } + }, + { + "tcId": 23, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B4261ABF43E400ECF2A2F39B4E9FEC7", + "z": "BE408A2479D640A6CFA9DAC0A63D965B2EC949AFDBE188743115724DE29D2B54", + "l": 1024, + "algorithmId": "9F466CC63F67CA20EC7F63BAE510D0FE" + }, + "fixedInfoPartyU": { + "partyId": "C5204E4EB03FB8E8555163CF9BEADC87", + "ephemeralData": "205780F89B07BEE845F85F2D5FD2532248EA0C9B9C0D3CCE827ACB9B23159910" + }, + "fixedInfoPartyV": { + "partyId": "AB4CB8432700197011EB9A2AF0140210", + "ephemeralData": "713001D15F14EFC167871DF9F7998BEDE44D89DEC3DD3AD0A1B049654DFB2B68" + } + }, + { + "tcId": 24, + "kdfParameter": { + "kdfType": "oneStep", + "t": "376D44A10191D0463EA39B72E9D3F51F", + "z": "A1C162194392F6C8F5546F596641F93D3F0153235B2051815F0A7EA424B64B88", + "l": 1024, + "algorithmId": "BC5B634860E50FE56264AB14D9356B91" + }, + "fixedInfoPartyU": { + "partyId": "F31A487B216773EBA11837ADFCD8ADA2", + "ephemeralData": "DB807A3308E57AA0E10591047A76B87F901F46C6EBAD5CC0F718DE0703A7C452" + }, + "fixedInfoPartyV": { + "partyId": "2D25B56ADAED05C0CE9B9E199DC6749F", + "ephemeralData": "55EA772BA4FFBAA71DE076827F524CD1DC46C40FF98C62C5BEC0CA78A48FFC91" + } + }, + { + "tcId": 25, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B64F3834145B4AF4D7546B8ED02A8DB", + "z": "1BF8EA239681318628AB5BCBC77BB0B9DC4AAC1DA962081FBCC3A784457467EB", + "l": 1024, + "algorithmId": "10FB2871079C920E7C2C684B317FFB6F" + }, + "fixedInfoPartyU": { + "partyId": "032FCBE3B0CD45E5348BB5B4091B112D", + "ephemeralData": "01BA44FB8D85E24725042841910C7C471034992C2553BF4BBB90BF9D77D38768" + }, + "fixedInfoPartyV": { + "partyId": "ACB80E38F5684D8B5290A32463BB2C7E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 2, + "testType": "AFT", + "tests": [ + { + "tcId": 26, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96849EBF5654B209075EA2EFBBBB47F6", + "z": "2671EBCCC9D9079C4081385682BD188B5650E2692C9035D537A46EE648", + "l": 1024, + "algorithmId": "F72D8F143D26AA9FD2D97B24F5D4277C" + }, + "fixedInfoPartyU": { + "partyId": "C0858F2B1121C088202EF58F26011282", + "ephemeralData": "6F1796F99CEA96C72AE056A969C4E96ADB95DEAB56026668D4969A7EB1" + }, + "fixedInfoPartyV": { + "partyId": "4F4939239BAAAE90D66D1BBB18820D15", + "ephemeralData": "45ACFBD9ED7C4E1F7D5C9E41924FD2DAFAAFE8EAE2DF2FE5C24D3755AD" + } + }, + { + "tcId": 27, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52CCEA51FDD90B1E4179F98FB094D886", + "z": "EF523824B004FEEBB5F8B47CA4313370F6F78469A1A740E14F4D62F6AB", + "l": 1024, + "algorithmId": "AC8D26C648F4AF1738A3C95D56662AFD" + }, + "fixedInfoPartyU": { + "partyId": "74260EEC97A55D40C3D09DA1E32DE7A5" + }, + "fixedInfoPartyV": { + "partyId": "EEA92A9C5EF7C09DD335D459A7D7AD4A" + } + }, + { + "tcId": 28, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3CA0A749A3A08CAF67FE5ADDC42BE62", + "z": "51734B9C934A7CA3BEDD14E8FF0B4B9BFE5C25CA20D7AFACF314EC1F1E", + "l": 1024, + "algorithmId": "32AF80A19C35797D70F08B7C16931230" + }, + "fixedInfoPartyU": { + "partyId": "C0E3BB6A0EB63F9A94817D91AF72FB56" + }, + "fixedInfoPartyV": { + "partyId": "3B605681A1A37BE4ECF68C9A2EBD2FF8" + } + }, + { + "tcId": 29, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2126C620AD390A91FCDF8FD8C35C3561", + "z": "C2731846EC960EB0B21D70FB302DD657399E079B5BFC367A237AD11173", + "l": 1024, + "algorithmId": "862E67771C9FAB8A4898FC7DAA42CC25" + }, + "fixedInfoPartyU": { + "partyId": "883D685FFFE762B39565A87D84C328EA", + "ephemeralData": "1D88997C9770AFBB1A43737039C261DD8E3A03C36F0956247D0C343AC2" + }, + "fixedInfoPartyV": { + "partyId": "62E50E7B6D036CB63FDE83AB0DD14752", + "ephemeralData": "D5700483838359E22D317B1CEBCD8B0175C38A062645C9F7263C858525" + } + }, + { + "tcId": 30, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DAF5E4F50C5BC8905CAB12D7E88E86E3", + "z": "251F4462B78B0ED597ECC23A1AEC36D89A1447BE35845DD9A1CC9785A1", + "l": 1024, + "algorithmId": "848E834EDBE80AD4105780E7D4BE629D" + }, + "fixedInfoPartyU": { + "partyId": "CB19B2092809E2C1EBC93A0E15F01B4B" + }, + "fixedInfoPartyV": { + "partyId": "3E953E150C77CC420921BBF16E92B8C2" + } + }, + { + "tcId": 31, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E410476C040FE7C126BDB6901EF993AE", + "z": "DB0717493E9C7B209BFC76845FB0B3F08148D6A282D0E85B0D918EF39C", + "l": 1024, + "algorithmId": "2FD984F0A85FD657D1A0EBEED870FC52" + }, + "fixedInfoPartyU": { + "partyId": "E0ED9C29AB532247F5FC0C7AC50F659B" + }, + "fixedInfoPartyV": { + "partyId": "E143C353F2787B4914D1E7A55F34D1A5" + } + }, + { + "tcId": 32, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70AF4811598F55E9DA720D292844F3B5", + "z": "22359C73EC4121DDD129F0BDA4B9333905AA00604879182673CDABD455", + "l": 1024, + "algorithmId": "C0B163792A0A77423D63B28A854E5F4F" + }, + "fixedInfoPartyU": { + "partyId": "0DC9E0CADA8E4DE4B8A5D49AC7F92B0A", + "ephemeralData": "4E6270C0018E646BE206343D57E38AFFE069B3789F865854B4D621AFD5" + }, + "fixedInfoPartyV": { + "partyId": "F15CFA41A1D7564C13ED9E243458FC06" + } + }, + { + "tcId": 33, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29A731701A08AD48BAB73886F9AC9638", + "z": "2B5355998E2790B793E8D79B9B1BBDECD504CC11DD1615ECB01B52D4CA", + "l": 1024, + "algorithmId": "4E00CAE840FD0D70FBB533019E544560" + }, + "fixedInfoPartyU": { + "partyId": "6C751C95814C9DE4771476D3653F8B9B" + }, + "fixedInfoPartyV": { + "partyId": "C196168D2B441295BE5AD47EECF05CE5" + } + }, + { + "tcId": 34, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B84366145148257B09B2EDDE7E52122", + "z": "BAC9609F84DAD0F1CA45D8694A7C4B5E8F2412A287297E696ECDF6750B", + "l": 1024, + "algorithmId": "EDF7CECC9F8E1A1A4419CF4BB84F2009" + }, + "fixedInfoPartyU": { + "partyId": "1B3A60BBA2B87F2AD856932295E4E3D4", + "ephemeralData": "A220EA20A4F4CA6C8E2EBFB36EB509CE481BA519A13F5DF7FB9736F921" + }, + "fixedInfoPartyV": { + "partyId": "B179815687EBD92392677E0CBE95910E" + } + }, + { + "tcId": 35, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10A876F96DF77B75E94D9EF1B0AADDCC", + "z": "CCF6F94E32AF2964FD0EF6CC111C0847350AB2750697AB86506372A80C", + "l": 1024, + "algorithmId": "3E6079EDEB49A92099CDC3716E37804E" + }, + "fixedInfoPartyU": { + "partyId": "EC7BAA133246EDFD0644DE3900A9A060", + "ephemeralData": "DCB0DF1415C369FB0908D5A5CAB48D0130C37FA8129A802C5BDA722DB4" + }, + "fixedInfoPartyV": { + "partyId": "C5362766287304F183CB9AEFC2AEB9EA" + } + }, + { + "tcId": 36, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB27AE9DFD793268B7C1C0251713531C", + "z": "4318A21CF840E93D2AFB4212E9BA8A4EF75AC6C1EFD4640A3FE0B47B0B", + "l": 1024, + "algorithmId": "76198E170B902D9F5BA9BC4A0BD3B900" + }, + "fixedInfoPartyU": { + "partyId": "FA64283FEF123639DA9BFF9506F1BEAB", + "ephemeralData": "0B30DBB0E0EF4F6254D40343904B6723E87491CED02B6B8B13BEA71AC0" + }, + "fixedInfoPartyV": { + "partyId": "0931C4DA8633988470885B91458515EB" + } + }, + { + "tcId": 37, + "kdfParameter": { + "kdfType": "oneStep", + "t": "421E0493419BAA2AC3419F09350C25FE", + "z": "F7AFCA6A40225C94DCDCB3D1AA5C23493C9AC8DD9C54F7C315F6BDDB5B", + "l": 1024, + "algorithmId": "3C030C9B5054F9995622935AF52D82C2" + }, + "fixedInfoPartyU": { + "partyId": "D72B99B72E3B260D4EBFF511DB95C3E1", + "ephemeralData": "AE78AB9D0E63542BBF321ABA5C47F8ABB59A7EC6664150C1963E87E086" + }, + "fixedInfoPartyV": { + "partyId": "412EAB9945014AB828E9E3994B30FB24", + "ephemeralData": "ED1870A41F0EC81C4F4ECB4193D816F930238B5BE8A510DE5BE7437B57" + } + }, + { + "tcId": 38, + "kdfParameter": { + "kdfType": "oneStep", + "t": "95DAB7C431A77657CBE9789918AF684C", + "z": "E6BE605A3CBF2FCFF216C4F9D1A316C09C641EF28E52B4472E855B2BC7", + "l": 1024, + "algorithmId": "99A2ABCFC9B9D92623888D35B8252638" + }, + "fixedInfoPartyU": { + "partyId": "5AA68A5DB4046A1C4FA40224FF6E5F57" + }, + "fixedInfoPartyV": { + "partyId": "F5E7D3499CFBF7A3C3F3CB60045F972E", + "ephemeralData": "B3A80A813B7B94F6E15FC92BB76588459462BF8EB45372BE7765AF9337" + } + }, + { + "tcId": 39, + "kdfParameter": { + "kdfType": "oneStep", + "t": "588B5AF0842D448D4ACE0F796188D994", + "z": "E48945FBC4359A5640454D3798A42F489AA57530F776261BCB8EF5E435", + "l": 1024, + "algorithmId": "EB72554632D6A2B5454411CDD3469244" + }, + "fixedInfoPartyU": { + "partyId": "9A496912B27920E35F62FD7E165B55BF", + "ephemeralData": "92D316B545CD4A1C8F19DA37929CD5CFCAC049DE18460DB9EB881445B0" + }, + "fixedInfoPartyV": { + "partyId": "181F65D04D9BD45B75004B9B9A51EC2E" + } + }, + { + "tcId": 40, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C71577796BBEBA414588449430778CC", + "z": "36093A83353E685E4386F0000C4D4C9A38B0B2EAFA33D139987F105009", + "l": 1024, + "algorithmId": "D393418984F85A139CCFF2F5DE978DC3" + }, + "fixedInfoPartyU": { + "partyId": "D25E48D4A6923B1430397A8BE8BC2539", + "ephemeralData": "E05DC5F71D131FACC7F5C5C1FCC8FF1549D1E7AA29EB6676896E9F09DB" + }, + "fixedInfoPartyV": { + "partyId": "51D062FD56AFAFC86A30A78D6C09166F" + } + }, + { + "tcId": 41, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39179D0D2BB1686B70DB2A731EB27FD3", + "z": "AFAF0D0BF69144F5B39F069CE032290979B8383F06545E867CAA813600", + "l": 1024, + "algorithmId": "93D44C9E02D1AE8A547F6118787BD1BC" + }, + "fixedInfoPartyU": { + "partyId": "F233185D214C162ACA67029797EC4654", + "ephemeralData": "7EB985B567C206E1204BF8B1A4AE7870B4F0F10A857797714A7F3E62F6" + }, + "fixedInfoPartyV": { + "partyId": "75F7121F55D5093071AB14D39F11DC55" + } + }, + { + "tcId": 42, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12062903AE1F6356F43B12E90A2D95F9", + "z": "909F1AA2783DD76C786493899AD79D10117959FDDB51131C71DBFC075F", + "l": 1024, + "algorithmId": "7E42E8BD632D22416914B0037196B34F" + }, + "fixedInfoPartyU": { + "partyId": "B9EC2FDB81DD0C66EBB6031B1B186565", + "ephemeralData": "E2B67C33EBE70CF65E409875C17401CF62BF2FF29AA295791448C545E2" + }, + "fixedInfoPartyV": { + "partyId": "8610807883EB5148DAD4C0B783EB3D9D" + } + }, + { + "tcId": 43, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E9558BFF0008E4C308431F118EE5FE8", + "z": "1196AF36699F46A47DEC9F46E804C172E6575B546FB93E6E77F526CCAD", + "l": 1024, + "algorithmId": "103E975C3DEACEADE0541125FB67EED1" + }, + "fixedInfoPartyU": { + "partyId": "D69DA9342079984870908F9B38552064", + "ephemeralData": "CB25AE9F9330E24A1E06330AA8A8BF418B868508D1A9B87907FCCDDA4A" + }, + "fixedInfoPartyV": { + "partyId": "0A87C98F9CA75D14C9D4EC3CC9A9FB48" + } + }, + { + "tcId": 44, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63A51108117C2186A70D295024D93185", + "z": "E8A27D84D09FDAA6B27C8B5BCFE38497C350D115556E8F4350B489E2DE", + "l": 1024, + "algorithmId": "B441A39B1A4A8E7748C264C3032BDDC9" + }, + "fixedInfoPartyU": { + "partyId": "583ACE6AA242648D19B83BE6E96540B0" + }, + "fixedInfoPartyV": { + "partyId": "ECC6CBE3E90837B12885AC41999CEFE4" + } + }, + { + "tcId": 45, + "kdfParameter": { + "kdfType": "oneStep", + "t": "897D621E93A3379D423AA010FA7583C4", + "z": "B467A62D5F8250418A1380904A81C1A0F4647CB86804B796BF959A4CAB", + "l": 1024, + "algorithmId": "A8455643051C15D3AD1E589F446F9922" + }, + "fixedInfoPartyU": { + "partyId": "23579270CB2EE8B0BCF6599398708E8A", + "ephemeralData": "4852A799C5CB4661CC0B2ADD4F4FEF923517FC6AFE69E28E492175FD4D" + }, + "fixedInfoPartyV": { + "partyId": "FAEF952E8E004093F2A9DF8A5EF8AE19" + } + }, + { + "tcId": 46, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F6D3122BFEEE1917F86189BCF76F2CE", + "z": "857FD589AED484D5A60C3D2AC5AF2DA661FB1B68893D339A888C480E9D", + "l": 1024, + "algorithmId": "2DC0765F8355BC49B2647460660934EC" + }, + "fixedInfoPartyU": { + "partyId": "FC334638BF34A4332D51E6B54E188FA4", + "ephemeralData": "4D08869181DCC0ACAC03D8E4B7B3C4FFDE7389C7F861F3F8FA3FB3EA1D" + }, + "fixedInfoPartyV": { + "partyId": "C71FBDED2497AA45CCEB6C22D8518F6D", + "ephemeralData": "DE413972E7D992BB9B38378A13EB7169BED72971DEF95A61810B70A555" + } + }, + { + "tcId": 47, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AA5826C9AD27D1471014D189A34DFC2", + "z": "0F34515FC99EABF2834D2D1F4FC79D7374B1A6F08EC5BB0D497C3CBA5A", + "l": 1024, + "algorithmId": "3E82D5684D908DA3A7B9E1B265D1CAEC" + }, + "fixedInfoPartyU": { + "partyId": "A7270B6F24B4F50598ADF3F6E8203B1E" + }, + "fixedInfoPartyV": { + "partyId": "86BBEAB39D0E671657544C4A0ADFA1FD" + } + }, + { + "tcId": 48, + "kdfParameter": { + "kdfType": "oneStep", + "t": "612E7C97FCAACD40D31A7D0332C1E031", + "z": "8F591DEACBFA20CAE79156203FAA7EE51D6FA7DF632CA58FCBA5DA8E7A", + "l": 1024, + "algorithmId": "CAA68FF492C3BAE8F00C39275EBDE677" + }, + "fixedInfoPartyU": { + "partyId": "D623CE943BA1FF00B46518628C6B590F", + "ephemeralData": "56B4213EF518CDBBE33B86549D4B71E1DAE06EAF7A9D2676BD004F5AB5" + }, + "fixedInfoPartyV": { + "partyId": "F769E7EE44E2518F0AC3342024FCFB52" + } + }, + { + "tcId": 49, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7FA33569F892434F1C15E7F832B2391", + "z": "972EAE792B7AB7A31A8A42A292BCDD25010D8B8AC77880EFC622E179B5", + "l": 1024, + "algorithmId": "884513B957D7AC1850532153E36AECD8" + }, + "fixedInfoPartyU": { + "partyId": "D2F4BCB2A3A2C223323FA1DFB2E5F9B3", + "ephemeralData": "E6A0E06E8A9D83215BA69114E051404CF667C112DD70F0B40DCD470EF0" + }, + "fixedInfoPartyV": { + "partyId": "7D8F0141F444A5CAE79F8977A7C3E667" + } + }, + { + "tcId": 50, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF35CD3A9C48EFD79843696642474249", + "z": "30787B306339F9C5C790012C4D4884B6CCCBF241BEF54B117216CE4010", + "l": 1024, + "algorithmId": "01E7F3FE3CBC5FDF2487786753C9A6A2" + }, + "fixedInfoPartyU": { + "partyId": "76248351F6378ED024BD2CCC2A12E9EB", + "ephemeralData": "9AC99D7C23C68900A1E058D2C5D39541B394474A28A4CC0E4E006A21CC" + }, + "fixedInfoPartyV": { + "partyId": "76E2A38545DA9D2F0D5A64EBC2D44176", + "ephemeralData": "9A7E3595C53ADDC8D27208B20A0371D1DDA397CBD695CBB18B23A24C1D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 3, + "testType": "AFT", + "tests": [ + { + "tcId": 51, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04AFA4BAD566E773B72575897A2A81B5", + "z": "427B5E41BB55BE1CFB47E79871CC973CA3634322DAFA756EEEC0508F565BAF", + "l": 1024, + "algorithmId": "924E9E8CF237EDF2FC50C4282E0CE391" + }, + "fixedInfoPartyU": { + "partyId": "73029B8F05BC93F542BF483042323D4E", + "ephemeralData": "816C422B057B8AD8F4722111E48CB8F910AD04FAD03960671D1633ED3E2943" + }, + "fixedInfoPartyV": { + "partyId": "F147EE0ED0DA15271A553C35FDACE2BB" + } + }, + { + "tcId": 52, + "kdfParameter": { + "kdfType": "oneStep", + "t": "94F8E2A2EE45FC8DB2F7F7387C48B62A", + "z": "5D43D918B94443664543C9D51258EDFEA3229FCB3F5255CDF577D4FBF29BD8", + "l": 1024, + "algorithmId": "3D8471A0ACF3DC62FF321E1546F63B5E" + }, + "fixedInfoPartyU": { + "partyId": "122CB8E6277AC1B269887F04D35EE37F", + "ephemeralData": "AE5F1C4E145FEF647F9F4E40E7BFF511F4DCBE90B88B5695CB23CF4A014658" + }, + "fixedInfoPartyV": { + "partyId": "F4D9D0F3AD3E93C0B0124292C04D3117" + } + }, + { + "tcId": 53, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0D0117B1097B042F156D1F2D7446711", + "z": "9A3E2AC41D9E25821FA14B593FF1A4CF294D990C9A1990FF6255EC671A0910", + "l": 1024, + "algorithmId": "BF2AA18391BA862A164EC2755F907B54" + }, + "fixedInfoPartyU": { + "partyId": "584A37D9474405BCD2C28779810AB619", + "ephemeralData": "4B45590654831FE148AFCB8F56817E52D49D384D4297EA6F6576D18A6BC786" + }, + "fixedInfoPartyV": { + "partyId": "838480EF8F12A53F4710D2623E2746DA", + "ephemeralData": "61581FB9EA16396D80715F1007674CA4155E214D6B897FD729C9F4B65BF470" + } + }, + { + "tcId": 54, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC76E5BDAC2379992C0FAB3B43B5FDBF", + "z": "BAA796A073AF2E58F1425B82B8A3EE71EBFC9BD4530B978383D5D93F2FBF61", + "l": 1024, + "algorithmId": "DFFCE05CDD38EB637854BA190DDC3D04" + }, + "fixedInfoPartyU": { + "partyId": "903A5730AC327AEA05BDB19D7C3C757E", + "ephemeralData": "01C0962908CE9E31C04E805F5FD550EFEDE3612A11D6CD1EA0F32C19BDB28D" + }, + "fixedInfoPartyV": { + "partyId": "88DAABDACF5E9C8151A0E9E313D61FF3", + "ephemeralData": "85E57E21C2DE84AF0609CF8B0A1DD50C8877EA5E7A8CF23E1C31DA81DFBC44" + } + }, + { + "tcId": 55, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD5D6A48E0FDCAEE71F005A6EFA53B8B", + "z": "A9366B5C0B3C679338B37EEB7E606D606CB9DECA656C87BBE356E3ED744E36", + "l": 1024, + "algorithmId": "1C06BCA5435E7312F1176927FAAD5899" + }, + "fixedInfoPartyU": { + "partyId": "9226A03967E95735391847570DB116A7", + "ephemeralData": "F3FE4B94934827551815AB2DB4BDC3514F864AA785E016822E72ECE8729D5D" + }, + "fixedInfoPartyV": { + "partyId": "EA929266418B82A3BBC1C3CEFED6A941", + "ephemeralData": "C2B1D420AA1002028D808774FD44ED173699DFA3C01D8448896572E276169A" + } + }, + { + "tcId": 56, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CCE6E880E3902647FB6F4C4F1D28297", + "z": "5DB6A4584E77B873D2BBA5191919F2E49828725D822AF0FD8BB8647526DBF6", + "l": 1024, + "algorithmId": "1F6430F6816BFC32E6C5DD5BB3F76E67" + }, + "fixedInfoPartyU": { + "partyId": "0C58719A01D5F6DFBAEF091B8ACF2DC4" + }, + "fixedInfoPartyV": { + "partyId": "39583269EDBCB3083BF6B5556E1C546A" + } + }, + { + "tcId": 57, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4279A15B29300879C412922ADA6C6458", + "z": "751D5520442147753D10F37F671FC90F1DA8F7EFD6AD21982024B37B2146C9", + "l": 1024, + "algorithmId": "05EF32AB8AFE5B7AD1478628BEE55A07" + }, + "fixedInfoPartyU": { + "partyId": "CD22BB7DB8D3433451741064C1BCE1D9" + }, + "fixedInfoPartyV": { + "partyId": "044200DF9233AC08B84EF9393C5F21EA", + "ephemeralData": "4354BE40645C086EE79F39BD3435735325B9C058203C33CE55FFB8E73A0DFD" + } + }, + { + "tcId": 58, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B60E267EEB86A49F64D11D8171749971", + "z": "EA410114117FDE1149BF11FBA51958BCCF25E611953F62EE9B79BA768DF10E", + "l": 1024, + "algorithmId": "AFB53A37B2C2CBF7692C88B9B0E3B02E" + }, + "fixedInfoPartyU": { + "partyId": "7EC087410F86FDF7F53FAD46A40CBDD0" + }, + "fixedInfoPartyV": { + "partyId": "20EC86683B977CA74EA412816592CAD4" + } + }, + { + "tcId": 59, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A0A6CFE0A100236BA056E2480230BE1", + "z": "E7FFAC31BD0632EC0086E8C0CD02F78272D11E8B59DAF1FD0E6E16417DE91E", + "l": 1024, + "algorithmId": "B7C9EAA7179EC76DE60ABC34F4C0385B" + }, + "fixedInfoPartyU": { + "partyId": "9C7A15498E26FC73A1876DBEF924BC01", + "ephemeralData": "D7B6F7C1C459616F15B4D8F9CF58F2F150DDB00F0F91E997914A9FFC138D90" + }, + "fixedInfoPartyV": { + "partyId": "C29178DBD561927161EBEC1EA15869B8", + "ephemeralData": "F639DE76665EF60705313B58A656BA329FCF86469BA478DC8DA3AABC569CD5" + } + }, + { + "tcId": 60, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A16AAD953DA25F5F92A62B96170AB4F2", + "z": "183E219DC155996E255D1BFBE217E8F6D53DB233E8A3FF99C885BE6923F431", + "l": 1024, + "algorithmId": "A818305C898205C9AD7BC3FD20E84099" + }, + "fixedInfoPartyU": { + "partyId": "DF7243F21870EB6DEAAE0D6757E09B1B" + }, + "fixedInfoPartyV": { + "partyId": "C0782BC368CFB5CFD3866ECB7D54AB89", + "ephemeralData": "C0A981DE5898845A2C4F9AE975149F75272A3245AA10742D39E86DE5D298CC" + } + }, + { + "tcId": 61, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4E4EA2AD66B1422AB50FB733C433F6E", + "z": "A60789002CD5B90F19B772DBE9FE1B0A3B7CA3AEFB169E66D45CC541FFD6C2", + "l": 1024, + "algorithmId": "505FB2DBA1E74A36D0DEF5144F80090B" + }, + "fixedInfoPartyU": { + "partyId": "07A1FF5C9EDD6B118A1DB305DE23664C" + }, + "fixedInfoPartyV": { + "partyId": "97DDD42FF088EFBD0A5108002CBB60D8" + } + }, + { + "tcId": 62, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3748F01AE086D693A0D5FD1A4D0B904", + "z": "B7A3CC6BC7303363F47CD084A35B858C68276631D60C57BCE248020D02CCF1", + "l": 1024, + "algorithmId": "D57EE7DCF5CF6A22B951D4D8316A40C3" + }, + "fixedInfoPartyU": { + "partyId": "D3DB88C44D13D7BCD271E41004EBF592", + "ephemeralData": "DA2F2EBCADE78913A857237B3C4454B4F07680D2DA9FD77413F0ECA5297B04" + }, + "fixedInfoPartyV": { + "partyId": "3B009645388FD805A6117A5066865C57" + } + }, + { + "tcId": 63, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CBE467A3225FB83698C8F7147B2E837", + "z": "191F393D6CD4FC64A1FCAE117B542E828D2446399569879EA67E9113C2C701", + "l": 1024, + "algorithmId": "57F9710AD991F32F93525E38F03E89F4" + }, + "fixedInfoPartyU": { + "partyId": "2253FA07C01341B9C6E5AF42D80434E8", + "ephemeralData": "6A9A3C9AD0C28E48D34A4C4104AD4F67656911BC165D2505DEACCB2504A26D" + }, + "fixedInfoPartyV": { + "partyId": "A709CE511DD226871CF31B96CF0DB1A9" + } + }, + { + "tcId": 64, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CD57F6CB4F50B4DEA4870ED973E20BF", + "z": "1AF04873816CBA183FF547BE669B46E7539D4C98A942518B368E550D274E19", + "l": 1024, + "algorithmId": "1905AAAE0800C27787A43D7ECF560289" + }, + "fixedInfoPartyU": { + "partyId": "9DAFC7AA45B3EA30C3F78360EE73ECF7" + }, + "fixedInfoPartyV": { + "partyId": "6042C30DE9530E0F23441619D16D0DB7" + } + }, + { + "tcId": 65, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C9E6DB716C66D4E29DC8D27E6F81DAD", + "z": "E62B4268038C1A0DA34D0DEB4D674857DEBC192F675F25740E80A8F7BE8835", + "l": 1024, + "algorithmId": "8FE0DF13B9758BE59E4109D651B5F69B" + }, + "fixedInfoPartyU": { + "partyId": "0FAC26C8C0830E2DE7E8218B8329EC77", + "ephemeralData": "E7DA8C89DD207F5F355238F043EF78F932A57C1BDDB0E5E83EB21F50CD6F8F" + }, + "fixedInfoPartyV": { + "partyId": "B0CB0B70A59AEB3958965ED2D9717D6D", + "ephemeralData": "54C4AD9D040997E19B5FCC0B9E6FC90A5BB4D5FFD06D3A3C591E693650C751" + } + }, + { + "tcId": 66, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBE23BFD04B0AF2E9D5CC23884B0F495", + "z": "38F06B7C6A10FCE4B63863D544910BC225BB5E5F3773FCA63CFB8727977EDD", + "l": 1024, + "algorithmId": "B158451FCB98A3BF35F51C2C98AE59A7" + }, + "fixedInfoPartyU": { + "partyId": "3FFC8AC4870AB79A2931AEA0EEADC183" + }, + "fixedInfoPartyV": { + "partyId": "0B3BBF91772AB2C8A4870CF76CF9EE89", + "ephemeralData": "F709B106FCD84A26B48CCCF77DF2F8D0FF5AF1B0591DAA67D91485CDB09EB3" + } + }, + { + "tcId": 67, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F9DC7ED6C046DCBD1386689447F50A7", + "z": "D4D70F82400BEC5DD74C9ECF5E30B63F47BF45C573E6099248BD3CE2943620", + "l": 1024, + "algorithmId": "55AA619B4807AAEBC24313EF0CDD25C3" + }, + "fixedInfoPartyU": { + "partyId": "8C72F2A23BED07E919C8CD6528670C23", + "ephemeralData": "6B3510B1C77516ED72E197DDB94F123183C67D31F5365ED401CE68BDB5C426" + }, + "fixedInfoPartyV": { + "partyId": "6CE8D2960653663EBA16214A5C347E79" + } + }, + { + "tcId": 68, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B94B45E5CA66699794C8FA649026B322", + "z": "0425EFB418C9D38332A3A683DC59BDBB2F68C5E816F44E98AC21184BCB9087", + "l": 1024, + "algorithmId": "3272733FC98E5ED3EAEF551DAF5D9C7E" + }, + "fixedInfoPartyU": { + "partyId": "CEE0E46F418E06011A27A8AE42D4138D" + }, + "fixedInfoPartyV": { + "partyId": "29A8F7084F77475EE313C7698C0DAB39" + } + }, + { + "tcId": 69, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7784D2B185CB9DCDA60AC7091C4E363E", + "z": "F7F9E321A8648F294D8F9B017780852D5BF8042CB594E7374D2F63DB65FCF6", + "l": 1024, + "algorithmId": "826748912CC9574DA87EAFBF760A9AF1" + }, + "fixedInfoPartyU": { + "partyId": "A1DD12743416E90E1E8CE2953551D27A", + "ephemeralData": "17D95B84186861F94BC5C2B35A3A9DEE542B86FF4B3BAE67DC825B31FF9D41" + }, + "fixedInfoPartyV": { + "partyId": "871E40A6E7CE754F1FC6F945DFD3C2B1", + "ephemeralData": "B8A4DEF33D0A1BD7F40E4BB33D9A24D50C576AF2CF06527B12ED83D7D745C2" + } + }, + { + "tcId": 70, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB63A286979469AE3B248B11D06737F8", + "z": "8268782AECBCE5240F8751D1C76E47C4AEB28D3F37B1345CC07A5385C9F8C3", + "l": 1024, + "algorithmId": "3A8640D5937D058909FF0C949BF70AB0" + }, + "fixedInfoPartyU": { + "partyId": "AEE554609B0A777EE70076DDD0D1A1E7" + }, + "fixedInfoPartyV": { + "partyId": "CCE4958D979FA5E93C5A92DB1850D0BB" + } + }, + { + "tcId": 71, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C98AA2FB00435C0E0936E4E058D9F13", + "z": "9A1B57A6A68B413637E6382BCFA2695F684E3CB5FFCFD0940755EC6529E3B5", + "l": 1024, + "algorithmId": "479FD848DA49F742C9CB5BDC676BD5A5" + }, + "fixedInfoPartyU": { + "partyId": "A3DE6E7F35F897BD5B39AE6424CC5F97" + }, + "fixedInfoPartyV": { + "partyId": "B53D60AF6123F3ABCE446CDA8D47A4CC", + "ephemeralData": "360DF915BBB85588F2BD0CD4B2DA33E763C7B8B13F9412472FB00429705667" + } + }, + { + "tcId": 72, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A887AE2462A9FF2ECA921A47660BC0E2", + "z": "215718C1A18F254BA563E5A9F38CF9CFC1F57384A99747A001306431A435F0", + "l": 1024, + "algorithmId": "26AC96F845D61BE646BAC2C1D05AB865" + }, + "fixedInfoPartyU": { + "partyId": "560E70AF1F6BBEB1C17BF1C2552D9438" + }, + "fixedInfoPartyV": { + "partyId": "EF873F8FD40B59908DC3DDBB9869DA3E", + "ephemeralData": "7E22EC6F9832C86AB67C89EE3E82683917DAF54379EA42CA7EDDFEA045EF71" + } + }, + { + "tcId": 73, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E06061398A8CD2F075432E987476101", + "z": "DEBFBD143BD03B45572AE1035B7265E57ABF01B977EAFB3E6CFA2A0EA5AB3C", + "l": 1024, + "algorithmId": "A536F3785985B567F25765E26AD79077" + }, + "fixedInfoPartyU": { + "partyId": "069ABAFF8C08F4077A274ECC1C06AF60", + "ephemeralData": "8A589ED90E54F83D97ADA2FA0A160B3B8158BF5AD35F54129D02ABA033C253" + }, + "fixedInfoPartyV": { + "partyId": "482054EE780A69ADB53E8BFAC1CBCAA0" + } + }, + { + "tcId": 74, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77643A5169F815BE38CADA8D149437AC", + "z": "BD3A0B97EBCCC0983A66398F366F0D8D0AC8A4A6F028BB11F775FE2FDEF378", + "l": 1024, + "algorithmId": "DC83D4E91EE4FF440FA403ADA9058A73" + }, + "fixedInfoPartyU": { + "partyId": "9423E96559823F37DE53F6F5A56C9A0A", + "ephemeralData": "AED50DB750FF91BA971423370BE66A80065F8A316E45B8113ED503E25B6B0A" + }, + "fixedInfoPartyV": { + "partyId": "ADACE4B03D932EC506DBDE9F8DF6389C", + "ephemeralData": "D5E6D78F0946DF8FA166D293F9D296E30486840351A1D4F6D15C1802FAD97C" + } + }, + { + "tcId": 75, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACA10B0C5446BC50BC7E34251DA891F0", + "z": "AAF0683D11AB7037AE0372A62FE249208E93B944A73561A01B7CEC08B03EAF", + "l": 1024, + "algorithmId": "D1B5418A91EA96FEB644AFFA6267EE6C" + }, + "fixedInfoPartyU": { + "partyId": "033A8CEFBC077573E5AD904BE23EF4F2" + }, + "fixedInfoPartyV": { + "partyId": "7037DE6B40987890AB39FBDB290B262E", + "ephemeralData": "9708A41517BB3704F91780E4420E54A835ABBE476A30BCFD9B8F42B07A4FB4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 4, + "testType": "AFT", + "tests": [ + { + "tcId": 76, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7ADEF70B06D2525FEB67CC8BE7A940E", + "z": "320C44035A292927BD5CD59118B2D7838EC92B2B2B27A9FA5FE24130406253ADA3BE", + "l": 1024, + "algorithmId": "D585D8232E2AB933740B974E4CBB1352" + }, + "fixedInfoPartyU": { + "partyId": "41FAF9D60D8269DC3864CE73322B8070" + }, + "fixedInfoPartyV": { + "partyId": "9CB55B88180619A5F6D711A545D56BE2" + } + }, + { + "tcId": 77, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E4253D1226B37150C19B312195A8EA7", + "z": "78E188B2896FFC25643931C3CD7D006105DC04649B3B6F1D4DEA08D04B14B06CCCED", + "l": 1024, + "algorithmId": "40038A3DCB9724DB84ACDA343A7052E4" + }, + "fixedInfoPartyU": { + "partyId": "66D27AD1A995C42F51BE5B2C521D70DD" + }, + "fixedInfoPartyV": { + "partyId": "8D959B6198D426AF773B0820A141F2CB", + "ephemeralData": "0D1C0029CDB9E9357CDAE268BDD79F96E6430829AB938F9BFF9E2B4205D98AE7F3BD" + } + }, + { + "tcId": 78, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0097E29A95C447D3D15D4B7A4C282786", + "z": "95D7F5D96893EEC9AEE964F54BB4ADA92270DF00F1BC9929B8BD09A208885950EC07", + "l": 1024, + "algorithmId": "CD1710BC19956FD773FD57369D7F47AF" + }, + "fixedInfoPartyU": { + "partyId": "E547E215C421C28E1F847D45BDBFD012", + "ephemeralData": "43AEA6E798254233BC94282BDDB21F2FDF26C133DE5475B33FD970ECF6BC4CEA3877" + }, + "fixedInfoPartyV": { + "partyId": "02EEE339AAD03E6B4DD2DA5649EDBC62" + } + }, + { + "tcId": 79, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E84E8E437CE64A7B7661AE02CCBB311", + "z": "3D1F2BA3E263CB53519D02C3789860DA7C08A5A7106CBC31985D6F813D749C533B28", + "l": 1024, + "algorithmId": "D67D22BE145CA41388193130FB09041C" + }, + "fixedInfoPartyU": { + "partyId": "28BD974BAAE848CF5C32D461E0CF83EB" + }, + "fixedInfoPartyV": { + "partyId": "9C06F47A0CB5EA23FE5177B086230E68", + "ephemeralData": "1B0DE253554F7DEA3DE27E0B3BB7FB1C3BB43A0EBB06F3197BA83C2D051A28D62424" + } + }, + { + "tcId": 80, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C10790BF705B8FAA3E44238B020207F1", + "z": "5FFDAFEC06A0DAA299928E66840EBBAB7941EDD32C211A66A4732EAA9917784EF723", + "l": 1024, + "algorithmId": "014F1D870D21043FAC76FC6A4CD7D7B1" + }, + "fixedInfoPartyU": { + "partyId": "6EBB7D1C29BCE68ED35D58EAD6CE8FEA" + }, + "fixedInfoPartyV": { + "partyId": "1DB6B86D8ECFF67DE5BF919EB34CE446" + } + }, + { + "tcId": 81, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9EFF207F8B885F1E281C62325826FD7", + "z": "A85CB2B25E416E6AEFFF0AFC61CBEC02B0DD990B66AB29678EBF3B19E9B27249FAFE", + "l": 1024, + "algorithmId": "FA41514CC1714CA5B957F9F35BD180D0" + }, + "fixedInfoPartyU": { + "partyId": "1F798B36585E95654656ED48CF0851C2", + "ephemeralData": "4322F4DFB8A7AB66FB849514670D90B9A302CDB4DC60FAAA7FC2733EFE9DFD03F056" + }, + "fixedInfoPartyV": { + "partyId": "8AA9B9054BAC6E855CC95325AA59C25B", + "ephemeralData": "841C01ADF539E9A6E2B0C7667D5773F2801CD8B59F0ACC9397A1786DDBEE0E8EC0E7" + } + }, + { + "tcId": 82, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16938BF10FAD270FE2CF611C705EA0DD", + "z": "44093BC70D241CE90E4525C8837A3015B6C616B140B7A5CA07305ED3B56D07C72F6B", + "l": 1024, + "algorithmId": "F7787D0E6F5A9CC7B81DD244F8F11586" + }, + "fixedInfoPartyU": { + "partyId": "9776CE2A2A961440FFCD278970B5DE04", + "ephemeralData": "C48DA61BE41B8EB3437A62EE2D5560D23C729C8E40223AB6CC5FC1A267E79B63763B" + }, + "fixedInfoPartyV": { + "partyId": "8E07D41DC5165B2AAF13771CA8A5C58C", + "ephemeralData": "2C8D86DE25B44C9202A64C5B20CAF6C9B45EAC10B07BA613B4A42100870EF436A391" + } + }, + { + "tcId": 83, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B47CCCC8AAFA25DED4580C96D76E57C", + "z": "26E648BEEF2F8FE8ADCD704B23F9E63A849A788EB32E8BB1B4C1BBDF733AE4E23026", + "l": 1024, + "algorithmId": "8E079F7DECB22E158B79DF31459B12F0" + }, + "fixedInfoPartyU": { + "partyId": "3713AABFB9CF15ACBB05095422BD4CC5" + }, + "fixedInfoPartyV": { + "partyId": "A568F6D28B508A8C1772E50292609248", + "ephemeralData": "B714661FD92FB57FC80B4B66C39486B676FFF87B3EEE14A036773DE0303077BB42ED" + } + }, + { + "tcId": 84, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9188EFF064D54EC8A669476CD6FFD8B0", + "z": "B1ACE245324839E1EE8187655DA6839E65ACFA63AC49FA45B9B08B068F5C89DB83B7", + "l": 1024, + "algorithmId": "10AE653D0A4335D236961E88AA94EBCF" + }, + "fixedInfoPartyU": { + "partyId": "DBEB1C5C6F02B22673D121B3258AB953" + }, + "fixedInfoPartyV": { + "partyId": "4D62747E42CDAD6E07531D59EB04518A", + "ephemeralData": "C521A03EA7300474451D369CF9C6A891BA796D4EC5911284B33732B27CB28670AA58" + } + }, + { + "tcId": 85, + "kdfParameter": { + "kdfType": "oneStep", + "t": "851C7CB2B7ACD1D0DDC40CA8D12B0593", + "z": "A1C40FD0C998D1BA5D643F0BCCB39206933DEA1782DE6D423E479DAA59C58BF97559", + "l": 1024, + "algorithmId": "6824701E2D27E08B838144A38B3B294B" + }, + "fixedInfoPartyU": { + "partyId": "C2BA4EFF57CA6A8A8E5A3AA39876A9D4" + }, + "fixedInfoPartyV": { + "partyId": "A8326D7D04D89F6727BA698DD18A751E" + } + }, + { + "tcId": 86, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E9D7A4ECFAA0CDBDFC8562E0CB8E520", + "z": "ACC098D6913AA2C7CA4AFA38FD78DFBA4B8436A5B7BDFC7E2024303D6786C95F79E5", + "l": 1024, + "algorithmId": "3AAF62DEB8CA5E122560E4AEA3AA1251" + }, + "fixedInfoPartyU": { + "partyId": "74662421CBD80DE787A7B8B4E60365D3", + "ephemeralData": "45C53BA3A97E222A16F13701979E3340E3113CE54A93F69B9FBB7E6441E7A5BEBF03" + }, + "fixedInfoPartyV": { + "partyId": "8FF2C353910C18F8679E23EB0702D8D3" + } + }, + { + "tcId": 87, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C157DAB8AC00645A1C0295ACF4C6900C", + "z": "573CC2B852321FC2FC6A8E1D399AA4FC75C794A112CEC741ACB600497CF7FA6A810A", + "l": 1024, + "algorithmId": "9B7BCA181418949D70FF32831D196C24" + }, + "fixedInfoPartyU": { + "partyId": "6BC2474E3A54003DC5468FA38060960A", + "ephemeralData": "6DC75C7AAE30391DFCD45D6CD146340A08768B7EF363CD29BAFA90DC63D027B3DE42" + }, + "fixedInfoPartyV": { + "partyId": "AED50CD9F71DD5A9F08433393089E475", + "ephemeralData": "D781631122DC40972856B0D7CE46029A7EF606CC3F4B60A345D3525571719E37B73F" + } + }, + { + "tcId": 88, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB6DC2BA3EB3259BEC171A6810097310", + "z": "1EAAD0FB4234B32DC8537482FE013F188F05A88DFDC3E95069DC3D67A901D1796ACE", + "l": 1024, + "algorithmId": "419F459C0A0A1793B581E7D8C8B56B8E" + }, + "fixedInfoPartyU": { + "partyId": "0A979E292DC9FE33CB0C6640CECB313C" + }, + "fixedInfoPartyV": { + "partyId": "3F7F6E9909B37C387D05E8CFEA2EAA2A" + } + }, + { + "tcId": 89, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D19F44BD4E763AA28E08A867C79C02B", + "z": "F9FDFF7C744B245C219E30B091805590C438841AF5C5BCBE11EAB4DBC06D31845D04", + "l": 1024, + "algorithmId": "F31D04D8C84617F4C8493388064A7FBB" + }, + "fixedInfoPartyU": { + "partyId": "6349B46224CC7592C4E56B85EB7F7BC3", + "ephemeralData": "D8E7DBA7BF7A633BFEBB70243F4D049F31CCBEBE957569B6634C9253AD73CCC46486" + }, + "fixedInfoPartyV": { + "partyId": "650DDF1D5B2E0739582BCD502C399AF5", + "ephemeralData": "2915555BE05F411D05F4D8D1E1A085249F9C81DBBC8C18F0727411543F474E5FAA83" + } + }, + { + "tcId": 90, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E12365F90F90107FA95C4414A23C5D4", + "z": "A5638FFF138DFF8CDEE80A5D0CB21887B75D1A8E1E0126B4463FAD9B8FE88F1B3035", + "l": 1024, + "algorithmId": "98EEBBE69A2475C55FA3870194D97DCE" + }, + "fixedInfoPartyU": { + "partyId": "DF73E9F86F0FFA0B752944B05EA0B564" + }, + "fixedInfoPartyV": { + "partyId": "C225472B1F9B0309A610D328CBF9AFA8", + "ephemeralData": "9DACEAB2DF568D41A7B790E23CDA69E056E1AD8CA3E679FA62013DEF4206FF79D8B9" + } + }, + { + "tcId": 91, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7AB2CFA75C5A56A9C497D21552A3FEE9", + "z": "C2FBF527075031408F6EE455C93AE362C1692EA9E5C0B32FE0E48A7B0B0681207DC1", + "l": 1024, + "algorithmId": "F4056119903DADC4CF63AB87E95306B7" + }, + "fixedInfoPartyU": { + "partyId": "2CADC304E4A2356E1983DEEE83419BCF" + }, + "fixedInfoPartyV": { + "partyId": "B73AB8DD3949CA77133C27F83FCE6CE6", + "ephemeralData": "062C687C90DF391476700473D7832C89411423847D8A8A41205B216084D3E5EC0D16" + } + }, + { + "tcId": 92, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B80598492F5811F4B98F7CDF51018EB1", + "z": "0B86E7F282309468A89FEBC7DB44B49B746E7A55841EFE3193788669178C56A21D9E", + "l": 1024, + "algorithmId": "2A5D7A1A7EC48B803CB189A65C612E67" + }, + "fixedInfoPartyU": { + "partyId": "DEBC709B904A4BD87A24999E06D7FDE0" + }, + "fixedInfoPartyV": { + "partyId": "7849A0F656D4AFE4B7B755C37451FDD5" + } + }, + { + "tcId": 93, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C86CF1ABB3938BAF157F97F3B482EF29", + "z": "2EB9D4872C85F265C701043E7BE055175CF9172E4CEF09BEDFB25AC38077D093EC8F", + "l": 1024, + "algorithmId": "67E459DFCBF626C533E0197E15DC819B" + }, + "fixedInfoPartyU": { + "partyId": "7B5D632575D91401282BA8EF13C6F23C", + "ephemeralData": "73099502A18B2A2A7AB8296E6CE6513B10C14FE95785D5D11BB0CE8FAE13E716D94F" + }, + "fixedInfoPartyV": { + "partyId": "26EFBC7B525A8D3E4436442947A3FA38" + } + }, + { + "tcId": 94, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F2E54455FA7C4C4AE6F208759C56E4B", + "z": "93A5B92A8766A250261DCD1412F58FDBD029532D0C12420B8B4DCDA2D6A50EE8AA48", + "l": 1024, + "algorithmId": "4B57DE7CD913D30D70E60E6615D48DEE" + }, + "fixedInfoPartyU": { + "partyId": "5496B89C2C14FC0CF7CB75A549F6D291" + }, + "fixedInfoPartyV": { + "partyId": "9D5260C666FF857EF01A95368A9F7974" + } + }, + { + "tcId": 95, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04BA617FB08E1A3A6446BD674B695BFD", + "z": "73A96940899024A011C5289F98BC77E159219A834F4481778DEAE3AD94D846445DCC", + "l": 1024, + "algorithmId": "5A9FA890317863CABF3A1E3FDB760CE5" + }, + "fixedInfoPartyU": { + "partyId": "F497EB20C545DA6186AD698258643364" + }, + "fixedInfoPartyV": { + "partyId": "D80E4D605388F3C6811BBD3348428025" + } + }, + { + "tcId": 96, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6CD3DAC6B74FADBF76F0A2A2CA3B01E", + "z": "D5BC2FF52240B62792EBDDB18C41699F56CA8AA07841D3C4CB65E0F803E72468E4A8", + "l": 1024, + "algorithmId": "4EE0FFD109AC896DA18DB5B103895AE8" + }, + "fixedInfoPartyU": { + "partyId": "E95963B59C465FC7C2B81B66BC97EC61" + }, + "fixedInfoPartyV": { + "partyId": "1794D5439F41DB55398A321B94649E56", + "ephemeralData": "4984B1898323773F10820CBA454157919F81575CC3DC4E9752C57EB084EF0EF3B417" + } + }, + { + "tcId": 97, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83E3084C0432CDEBF176EB34CD06620C", + "z": "EEEB88A042DA249EF08D92316EDCF415F88BAFDCEA177E8248C209A39E8B7F22FF4F", + "l": 1024, + "algorithmId": "0869133B5D72CF90ED470CF18AE2037E" + }, + "fixedInfoPartyU": { + "partyId": "82F001DAF769EB0AFDBE6D7DE9F13B0D" + }, + "fixedInfoPartyV": { + "partyId": "93FAA7802F7F009AF28FCDE0A7EFF253" + } + }, + { + "tcId": 98, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27BD6807F34EF2AF735DBBFDEC3F3225", + "z": "CC0CB45EE5840431D5E27E01BD64078F2859ECEA8C1122D3977770A4E4C54453ECDB", + "l": 1024, + "algorithmId": "B0FDEDAA67F3CA1D65D8D2F7E1483F39" + }, + "fixedInfoPartyU": { + "partyId": "620823613BE76574CF8E40EAB99ABD8B", + "ephemeralData": "4B22FC0E73A7979C4895784E3DA0522D0045151E3992EC9FB3F062D5EA1EC3B6D9DE" + }, + "fixedInfoPartyV": { + "partyId": "25C92BE2E2EE8DF957C5D26D0856DB7F", + "ephemeralData": "5882CD7066B28AC044488D5A923CBF42B946C9A3A57DBA3E4ED52E3D8AA0F90FDB23" + } + }, + { + "tcId": 99, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19006FB25A82DF4A4C5D3FAE4DD9E759", + "z": "39904FCAA4787EF204C82901F141B3A9FCAD0723A133328DD7ECBD920367371F84D9", + "l": 1024, + "algorithmId": "FD4A4839A25391BF7CFEFA5D3D512569" + }, + "fixedInfoPartyU": { + "partyId": "7BBBA9182BB1D7601B5455951329B5C8", + "ephemeralData": "F7FCC249EB9C782A90255E546799DE6ED9FAA23E0D48451311636FF582E8D84DC6B5" + }, + "fixedInfoPartyV": { + "partyId": "8873CA18D6414432A43332DF61428914" + } + }, + { + "tcId": 100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A1FC7EB91CE33D3F437629109AFA169", + "z": "5F11BC320E8512B849ADACB62220CFE44649F0E2F4B679996863D7B713103F97FD4E", + "l": 1024, + "algorithmId": "7CDAE02EB69930841EA053468C3EE40E" + }, + "fixedInfoPartyU": { + "partyId": "DD51DF3DBDC829A6D8E9556B9B493067" + }, + "fixedInfoPartyV": { + "partyId": "68DD365451A55AC692EA472B194FE2A5", + "ephemeralData": "E655EBF3518644FAA5085EE83B45C1D98DC6A7C0D90BEFE48D7C48E58FDAAEA7B28C" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 5, + "testType": "AFT", + "tests": [ + { + "tcId": 101, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC00C99760D137D3143F417C58BBA554", + "z": "B5553972F266169A877840529F38BFDADCDD72EB7EEBB7D1B8D52151B8", + "l": 1024, + "algorithmId": "B8DF30DCFE2B00BB7FCD868C0C8632A7" + }, + "fixedInfoPartyU": { + "partyId": "CE90DAD0EE8200090E8A465F00F2E76C" + }, + "fixedInfoPartyV": { + "partyId": "629746E2BA3A1D44878945C19977F837" + } + }, + { + "tcId": 102, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ECAD8C27D02479732C403E54B0407BD2", + "z": "7CEC69F128BD7A3B7F83A96D7B9BAD907ED7E2E5A87BD761954E5D29AE", + "l": 1024, + "algorithmId": "2764C699176D0A1AB38CA065DC1E69FB" + }, + "fixedInfoPartyU": { + "partyId": "5B6E08C5A4709216686F69805D8D8CBB" + }, + "fixedInfoPartyV": { + "partyId": "EAF8A325A0AF726D29E3BA5588CBE3AD" + } + }, + { + "tcId": 103, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51EB38A6D4DA4B23A2503C5C0F88939D", + "z": "D200C90C60A460A1F1EDB84ADDFE2F5038C924D11AE5C1B571393FE743", + "l": 1024, + "algorithmId": "3C0DDAF3422EB4E8ED7BAC4CEDAEB0E1" + }, + "fixedInfoPartyU": { + "partyId": "188BF5A3D1E7CAD49B0BFFDDC9AF46A7", + "ephemeralData": "1CD07F096224505A00748A7212C0EB65D99A87A15FFD7F5CF6DC1CD369" + }, + "fixedInfoPartyV": { + "partyId": "835D7ECB2FEAB0F6E4F6A2D98CD4AB4E", + "ephemeralData": "44A0C11CDBF5C3000DB2F611E1AEDCED79F7820F86A400839010FC65FB" + } + }, + { + "tcId": 104, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27C197A1141009836551C835D0B3C819", + "z": "B436E51EBBBC18E974D7429A7D69AA32D6A8CC6AA41B7F9CB981E187BD", + "l": 1024, + "algorithmId": "DFC20E4A8DD22993A7FBC53F69830C85" + }, + "fixedInfoPartyU": { + "partyId": "FBCB2B98497D26402DC3D0AB68FB06E7", + "ephemeralData": "8EC5733D3CE6622B40D163BD6648B69BC6246FD4B2EA540696A75F518F" + }, + "fixedInfoPartyV": { + "partyId": "53FCF87DA7FF510DD7948F12C04CBDDC" + } + }, + { + "tcId": 105, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C841AC5E92E7DCE209C5A6569B0DC42", + "z": "E021E20C0A58C3D8C6CB86CB9FA5B7BBB982AAAA13B142BAAD87D47A85", + "l": 1024, + "algorithmId": "DFBD20D8C971F9FE82810F9FB02DA6B2" + }, + "fixedInfoPartyU": { + "partyId": "B0BB55FF998831364C5D445474E3BC98" + }, + "fixedInfoPartyV": { + "partyId": "21D8A07C7CB7AD55B994F94989C61266" + } + }, + { + "tcId": 106, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C43AA71B961E7584460D3625F0C9DB6", + "z": "4D93EBA35B32B7315E76C07752A6412F972774F81F4F9B806445157D27", + "l": 1024, + "algorithmId": "042FFC3AC87A43D205CEAE7B44E8BC06" + }, + "fixedInfoPartyU": { + "partyId": "5F6A3FBD01369FE9E7BCA00E00289314" + }, + "fixedInfoPartyV": { + "partyId": "0894C1EAE2C5F60ECCEAFA66BAA529AD" + } + }, + { + "tcId": 107, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8770470135EE09281157618145F2DC1", + "z": "834006BAF5E718243012A8CD965EC481AE471C82BFFC8C79D32B922D46", + "l": 1024, + "algorithmId": "4A1F18D69EC3A6DC4D2EE220983C0B5D" + }, + "fixedInfoPartyU": { + "partyId": "5A965562A14876F386A857EB2ED8DC1B" + }, + "fixedInfoPartyV": { + "partyId": "4B721835AB1521A7655BA37D001B10D3" + } + }, + { + "tcId": 108, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC08716987DE07083366E0D99B38F27E", + "z": "621A4139D2D58A40933B001D6F73213DE648AB3834B071B81B4A8EBAA4", + "l": 1024, + "algorithmId": "F7B72B1E840AD34C8DBB41224A6C38B6" + }, + "fixedInfoPartyU": { + "partyId": "35A0678880C5DC6D9D64DF1DCBDB2334", + "ephemeralData": "BA3B4102D6BD5EC87CD014FF4D5677E277B8306358CC704B176BE5CB4C" + }, + "fixedInfoPartyV": { + "partyId": "337BC4FE6AD81CF63476EDB4A0E9D90A", + "ephemeralData": "663CE3562101F5C31847894E12350A1594286D83A0658C673A2A4EF9F5" + } + }, + { + "tcId": 109, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57740C172437C0165948B79FB4EE0F50", + "z": "30DC1D185DC1339D8E9303CB7FA538430936A4703F880DD7FDB30814FF", + "l": 1024, + "algorithmId": "0AD7854B680ED74A3B30689D3372A679" + }, + "fixedInfoPartyU": { + "partyId": "132F746502790D237D3769B7623E230B", + "ephemeralData": "918ABE5B2801DA52D4664C345830BAE45646E061C9E1084CA59287D350" + }, + "fixedInfoPartyV": { + "partyId": "5607ED8135D7669E5449C84CAE042928" + } + }, + { + "tcId": 110, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8E8A83498915C61CDB08696F39033D5", + "z": "7A334325A00106548F21197C96A5B95E9595CF1BFEBE0FE6654E51720B", + "l": 1024, + "algorithmId": "FB73C4F357A8F62BA5CC0B90A4F35087" + }, + "fixedInfoPartyU": { + "partyId": "B77AF4D123EF962572814BCF0D827134" + }, + "fixedInfoPartyV": { + "partyId": "DBA23FAE506BB748C78FB701EBA30237" + } + }, + { + "tcId": 111, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C611FEC691526BAF82916DAFE9107A4", + "z": "89002F35AEA861E06C8E0297EF89F018AD7EABB2299512AA41ED40D0D1", + "l": 1024, + "algorithmId": "9D48D4DEFFAA129FE2149F27E92DD8BF" + }, + "fixedInfoPartyU": { + "partyId": "6B28D4FBF4F95C5B930E2E2DB07FF5AB", + "ephemeralData": "9A083A94F5E2E97FCD2BBC7E0B127B0B3E986EF110D21D54798C35A24B" + }, + "fixedInfoPartyV": { + "partyId": "9F3D1CDD62A131FDCB8DE9033C390B70", + "ephemeralData": "C81B4C0E46ED223B5B35E5A0381519E59753B8CBDD406B56F0E27E511D" + } + }, + { + "tcId": 112, + "kdfParameter": { + "kdfType": "oneStep", + "t": "777214B89D0A38FC963D67A3A219F5B9", + "z": "2ADF9F02D2B4638B1579BABCF754128230E659234BA1A0C033119C91E3", + "l": 1024, + "algorithmId": "E21F221611B6C6BDFF1934189B98101C" + }, + "fixedInfoPartyU": { + "partyId": "0E7F577855F9AF0D85852D3F54A9477B", + "ephemeralData": "24C10DE9CE8C54F091AFDBCF76C020313FE72E5761F859FBA5B5267966" + }, + "fixedInfoPartyV": { + "partyId": "57D6DD5B4F4BD675B8269C7AA6E3349C" + } + }, + { + "tcId": 113, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2DEFF04F7AA00333D99AE92EDC2F622", + "z": "E388F40ECB5C6F1AD2CAC70F78046D576022FDFA219B2411120634BAF9", + "l": 1024, + "algorithmId": "D34DF2A0758AD769BF848E89274C640B" + }, + "fixedInfoPartyU": { + "partyId": "B097CC26D211C046BDE67BE7F969BB8D" + }, + "fixedInfoPartyV": { + "partyId": "9B1C043AD74BDECF1337F57EA692DBDD", + "ephemeralData": "E69A9D18E531C50E3CF6193055ACD74DABF8B64E314687DC7829933F93" + } + }, + { + "tcId": 114, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ECE505AC43907E7509E5BEF604E0DD38", + "z": "4BDE896630F6B2AF158856E7F2857C6EA75B7705EF1068FF5A1E959A69", + "l": 1024, + "algorithmId": "41000ED50F5CD3943014DC5CFE7016B4" + }, + "fixedInfoPartyU": { + "partyId": "47F114D07438E7E2793BA570EE8E83D0", + "ephemeralData": "131E00100B41C9376CE8811FC48976F3ED9FE8BAD65CAEC5510B010661" + }, + "fixedInfoPartyV": { + "partyId": "52EB9991DFBE7F40DD8205A7AFC09B45" + } + }, + { + "tcId": 115, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E9B19C3920AEDB8E0929CC63E8BA702", + "z": "0BB7662B92FB013FA5402F03EC2233CAAF92F50DE8E25C1D8E047F51E4", + "l": 1024, + "algorithmId": "2299BA4BB346C691534E16A41F0C2598" + }, + "fixedInfoPartyU": { + "partyId": "A7B955A94AE594943AF9CFB82B7890BB" + }, + "fixedInfoPartyV": { + "partyId": "A5B662718450A4E85AE9BFA5E7B9EE31" + } + }, + { + "tcId": 116, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C6F9891A157308DE1DDD9B3C1AF2C95", + "z": "D4F1BEF774F62E7EBDFD295A0FABAEF7BA54A7DF2B8759D0D4418C9B0A", + "l": 1024, + "algorithmId": "CFAC9D29A18E5F31CE412C214BD852CF" + }, + "fixedInfoPartyU": { + "partyId": "31D49628D3C5FA6A108D96F1F0983D9F" + }, + "fixedInfoPartyV": { + "partyId": "6712DDCD966D8CDE726F3792AC819526" + } + }, + { + "tcId": 117, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC7C88ABCC412100427434586845FC62", + "z": "D580E3941F193E8D6A3EBFB16210EBA33B1D932739C626BD393A54DC63", + "l": 1024, + "algorithmId": "A3C6B5818A239E3C933416A1E4D6934E" + }, + "fixedInfoPartyU": { + "partyId": "A0302F7FD5A5698B60A5267722B4E767" + }, + "fixedInfoPartyV": { + "partyId": "A6D9A51A3A9ED6423DC8F96A30365D06" + } + }, + { + "tcId": 118, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A37D0EC9B456C1E9A3F208324FB95BA6", + "z": "5660B391A9FADF8AF21767F3A4F279BC8127EBA56916A94155BABFB876", + "l": 1024, + "algorithmId": "AA42C6448ABA41CE3A9CAC229D349C02" + }, + "fixedInfoPartyU": { + "partyId": "1D8CE6A2B2655487068B1416C3BF71E8", + "ephemeralData": "64029E1CEBEEA76B632B3480C0488DC410C5D9EBB166A7D50F64472D21" + }, + "fixedInfoPartyV": { + "partyId": "B128655D189BD8F219866FDEDC52A44F" + } + }, + { + "tcId": 119, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D105E4D791738E61C153B513EFCD747E", + "z": "A0F266D29F0DC6029D14C6DC7D7346BCABE5041E498C71FFBC3424C67A", + "l": 1024, + "algorithmId": "9D065E67D735AD42BB241381C893F2C3" + }, + "fixedInfoPartyU": { + "partyId": "B1F5A640037EE0D13AA15C64A85DE392", + "ephemeralData": "1048FBAB38A45F473DA63AB6EB7F98EA9516FF7733F01DFA140048A415" + }, + "fixedInfoPartyV": { + "partyId": "A1E430B740E97DA0A9C2BC315CD05C5D", + "ephemeralData": "6651384BD5D62D63BA2F1BD6DFD5FE69C7A444CE300ABAF05584E6F63C" + } + }, + { + "tcId": 120, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26131CE6AF236A4DF8330AEB6F286B75", + "z": "FADA2CB9DCE2FB71900F844FDBF7C49DFEB5FE828441F5CA0A22F0948E", + "l": 1024, + "algorithmId": "ACFB4B791C825EEEF5601E4579B110EC" + }, + "fixedInfoPartyU": { + "partyId": "0C69EAE675AAA2D95BE58E5B4BD10EB1" + }, + "fixedInfoPartyV": { + "partyId": "1A9E51450E981D96039797D32BA5B0F9" + } + }, + { + "tcId": 121, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B587564BCF633DA7E5B61C3E63F9B4DB", + "z": "12C3F8A7CF25AC5E9D62B27029779757CFD7C84746E6E413E0EFDAAABF", + "l": 1024, + "algorithmId": "BA1A9BFD678AFDB6A4A975019F8C8542" + }, + "fixedInfoPartyU": { + "partyId": "54F61C12D0C7DA2BC053A7D5756059DA" + }, + "fixedInfoPartyV": { + "partyId": "211B3820B4FE611825A3DAA5ECA54F15" + } + }, + { + "tcId": 122, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDFE314AFB246F37AE9C3C765D719C57", + "z": "3ADF00D7DE067E49D5D9F3146B6040DF7C059164B084C1677A030C9F1C", + "l": 1024, + "algorithmId": "AEBF9C76E6BB3EBD95745F4F38867B43" + }, + "fixedInfoPartyU": { + "partyId": "AA11ACECDBF033BB90D7CACE3F8C4B78", + "ephemeralData": "FE03E0B0D06815ADC50519384AE166A3250520D217243D358FC42E5832" + }, + "fixedInfoPartyV": { + "partyId": "B6F7B71A4E16E876B0A8A5475C6C9CE9" + } + }, + { + "tcId": 123, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B3EBBFE672731F3564625C781EE9F2A", + "z": "66F19ABF8504237BACBD8374E93C5E6D474D6133D5613BA2DE45D4FDF2", + "l": 1024, + "algorithmId": "8D5F116BE3345EB793E38E238E15CC2A" + }, + "fixedInfoPartyU": { + "partyId": "C493AC8C6388AF193C6EF1A81FFC957C", + "ephemeralData": "59FBC4D000F07B9E2D649E58FB49071FC0D0D976DF80378A7DEBD2860E" + }, + "fixedInfoPartyV": { + "partyId": "947BC99FC40BFE7B1F14B08C408FCF1F" + } + }, + { + "tcId": 124, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0833C11E7882C8CB2920513F89519F1D", + "z": "3891D1A3E432597102E73C1231822A8C444ACBD146FD7B3A6D5229E376", + "l": 1024, + "algorithmId": "5CEC5E08573316434072BB5A9CCD0484" + }, + "fixedInfoPartyU": { + "partyId": "866E435324E2EF993425E02BE28121FA" + }, + "fixedInfoPartyV": { + "partyId": "E969C96EF68905054C840C46009E3EE5" + } + }, + { + "tcId": 125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B30C52A303301C81A0085F15FA0589AC", + "z": "1205B653C6CD1BA4C8B76B17D27464F8A16C08B7B7995A976E3C11CCE9", + "l": 1024, + "algorithmId": "CA1287958031C15B4822432238F4CF2D" + }, + "fixedInfoPartyU": { + "partyId": "565D436C2E145BD576C8977EB409A41E", + "ephemeralData": "8856BBFCFE9C6123B8FF12998654E01A7543B144EB54E78C31BBB789FF" + }, + "fixedInfoPartyV": { + "partyId": "165293602217EC574E2D542B76BD615B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 6, + "testType": "AFT", + "tests": [ + { + "tcId": 126, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B58A9EE096B410BF21C561FA5FE6F816", + "z": "A55C184CF54FE2342FEBA9AF5DCF0A81D53B8F36BAE7F52D27D6322B3AC4523ED719C8A6", + "l": 1024, + "algorithmId": "B327646D03CED7932F79E83FAACB74BE" + }, + "fixedInfoPartyU": { + "partyId": "5060F929C9F39D8BC733AC33C475504B", + "ephemeralData": "E59791FE813A0621B512D108D6D5A1761AE66F429914DBE1E2490695669427BCF89C33B5" + }, + "fixedInfoPartyV": { + "partyId": "89E630DFC2A9E4EAA69E5DE0288EADC0" + } + }, + { + "tcId": 127, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37438860A8918A85AA77E0D56B4298C5", + "z": "A736C9F9EC9156DC297004E322AF6C44DF55E0D1D8E98AE88455CBD1389861236DFB234D", + "l": 1024, + "algorithmId": "E661D6CB84013C74F1FF6EB3F5AF5B03" + }, + "fixedInfoPartyU": { + "partyId": "7FD7B8A0FAC2F38B0A9909FF64C3F3DA", + "ephemeralData": "D696B8117F23887542F096A4D23AE0F11CDEFD41531E8A69397A5B6FF01E8AD874E0F363" + }, + "fixedInfoPartyV": { + "partyId": "BB5FA7A46822D01FAD9073A468013356" + } + }, + { + "tcId": 128, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F8FBFFC860D844DD1E94045252B913E", + "z": "DA117E49D95498FAF029B9F9ED456C64A69484D33C4CBE03069EF94797B503F2ADF64F21", + "l": 1024, + "algorithmId": "94A4D02932AED898501F0875768BE32E" + }, + "fixedInfoPartyU": { + "partyId": "77B3D1378ECEE3A14BDE93DC3BA2F6D9", + "ephemeralData": "B360AEDCE528B89AEB164CFA8ED1CA59E1DC6372AD84BDC5A5AE9DC4DA38B40809B4CAE8" + }, + "fixedInfoPartyV": { + "partyId": "6EC5E14925DCA52FF517616942D0D05C" + } + }, + { + "tcId": 129, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F2B6CE0B1A345D5C3677D856B99B9529", + "z": "49DE18DFAFA6560B8E7BEBBC4502FA73E37DFEE938A92595E412AA35FC4AD74E81725470", + "l": 1024, + "algorithmId": "1CF3739D4F0A967DB17040ECD822341D" + }, + "fixedInfoPartyU": { + "partyId": "0C31FCB336A193C5AB849F4A52CE7100", + "ephemeralData": "990C5E99250FDB454A29805675D4982A30773760477D046304DFF0BC5B62C42D52767ED3" + }, + "fixedInfoPartyV": { + "partyId": "C452EF238E61A7A4AE8EF66CACD3F668", + "ephemeralData": "38BD6B4B8856279B1EAFD0250934C4CB646ADFE4F7046ABAE0E116179BADFB00AA3B26DC" + } + }, + { + "tcId": 130, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BD8F489A8FEB70454ADC0A082541343", + "z": "74FC9650E3180BBE4B691A52A48A5AEE5B0C59126FFF9B9E17AE1EADF4DDBDEAAA15FE84", + "l": 1024, + "algorithmId": "A832A67381F229D7A2B3BC036E6EFF64" + }, + "fixedInfoPartyU": { + "partyId": "30958FB769B5961182D5603585BD8791", + "ephemeralData": "2AD3FBE8762F930064BC9308858E26869B8ADD8B9E08C6CB05A1359253D0577074296C7D" + }, + "fixedInfoPartyV": { + "partyId": "B12CCAADCF457C332AA232ED302100D2" + } + }, + { + "tcId": 131, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00CAB2E52EF7236EE2FB3A4F26158B11", + "z": "A9BC9D3C84F293F0CE97E8F7E26D17C332D12C5085173FEEA6D09BBCD8896BBBF6B83E11", + "l": 1024, + "algorithmId": "20DEE7E7CD9E0636D8C2E8F106CBF21D" + }, + "fixedInfoPartyU": { + "partyId": "B9DE720C2FF45469B46A3D02A565E82F", + "ephemeralData": "60A5A239B57DC268F3A379B8AD85302BC767566E8350694CA828E7BBD4D2FED5D0FA3D97" + }, + "fixedInfoPartyV": { + "partyId": "1C9DABA4EA1D0C415646D192E959D8C2" + } + }, + { + "tcId": 132, + "kdfParameter": { + "kdfType": "oneStep", + "t": "731EF8332F8EB22D62F2A48E75C87276", + "z": "E79DA89338E9D383F69D6822F5FCECCAA6580B2985743438A7674229124047B363A33FFF", + "l": 1024, + "algorithmId": "2811AB279D1CB2311C0212A9CACB149A" + }, + "fixedInfoPartyU": { + "partyId": "2705093EF82A4A3D4B4CB5322E74AD07" + }, + "fixedInfoPartyV": { + "partyId": "978F142E58558F49AA4B41AD4213A877" + } + }, + { + "tcId": 133, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85B02EB4303700162DF2C126623075B9", + "z": "C071B55A31542BC7A42D75EBB8C4A4CCAB43B811CFA3FFAADA63AFC064F6E678F20B62D7", + "l": 1024, + "algorithmId": "BBE6F923493B0A5F085CFEA443A3DD7A" + }, + "fixedInfoPartyU": { + "partyId": "FC1F675C1782185D76A1CB7FD343F3ED" + }, + "fixedInfoPartyV": { + "partyId": "8DF47F325A959D51B90207529D33B804", + "ephemeralData": "0185788A8E982B1B0C2D2E1940EC9B223EFD5546580C5F4815F2D35A4E02012B6F741DE1" + } + }, + { + "tcId": 134, + "kdfParameter": { + "kdfType": "oneStep", + "t": "665BE4B1AA1ECF9814F78B4DD9768C7A", + "z": "81B9A67B5EEA1D6E3695A0F4DA80C289739CEF5637CBDE5D39D511C72645E53213A377F2", + "l": 1024, + "algorithmId": "4B7BACF9AB0DD6429BC88D062DB5EC66" + }, + "fixedInfoPartyU": { + "partyId": "C154E603BAB7BDB63B12504694196708", + "ephemeralData": "C9931629C88833DAE9362445B0392C07D5EE2F4924B7BE7727AAB70E50911FC8F62FDCE7" + }, + "fixedInfoPartyV": { + "partyId": "B6B995FFFF3E146898374487483F8A89" + } + }, + { + "tcId": 135, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DB558D0BF363D2DE8D4175522B2783E", + "z": "59DFA5EF44426BB0F753E0F07BDD71B97E9FE94DB9896352C3E69D7BA081903D13D6D6DA", + "l": 1024, + "algorithmId": "0EE1F430BA13A49C122BE63580C9C493" + }, + "fixedInfoPartyU": { + "partyId": "E6717CB4C9961030B7A711F6ADD1CD1E", + "ephemeralData": "F1B88A5CF933438A4ADF4A25C9A787F118809B2F83ACD4A25A0FF08A3C5D225AF869B436" + }, + "fixedInfoPartyV": { + "partyId": "E18445E93C8E5D97216C7073AAC36076", + "ephemeralData": "C28E0751BE4560A3BCC832861A80A5D5D7CE0DBB1B18FE15BD46B1134310D39F0DAFC7CD" + } + }, + { + "tcId": 136, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E21BAC1960F68D7305929E0EE4CD97F8", + "z": "3DC8C88ADECBBC1DD76E75B636AE8CDFA4F45618D043DDB3C322763AE015024E4B421408", + "l": 1024, + "algorithmId": "BEEE9651D0ABA68BE41D1364E27B49D4" + }, + "fixedInfoPartyU": { + "partyId": "C24726499551CE7C97A9ED82F66FA353", + "ephemeralData": "C513260974F68ED824E8B916E2F122FEE7757C0615EB3843AA7EC33E93D9940C657B0377" + }, + "fixedInfoPartyV": { + "partyId": "A94280669638ED2B2A4462950F46D74C" + } + }, + { + "tcId": 137, + "kdfParameter": { + "kdfType": "oneStep", + "t": "588677867976569D0A8BF4CF169862CD", + "z": "306BD3E91F65931294395ABFDBC7F20BB24AEAD3352FF75474AC22481F4AD35AFB9A99B3", + "l": 1024, + "algorithmId": "D164CECA1F2C6F96EC0C88EAD7644BD0" + }, + "fixedInfoPartyU": { + "partyId": "9CA54026A6B51648ACCD7917FA776834", + "ephemeralData": "8616F2C8EDD16D93A4A8921B24929B50726A01FE8B818B8CBDB50DB699FF3CBFD1C14DD3" + }, + "fixedInfoPartyV": { + "partyId": "3E281A348BBBEF186B6160772C745FAA" + } + }, + { + "tcId": 138, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDDE1B58B9AA1FDCA1BDBA01130C44F9", + "z": "7A07E5530F594926FF8CDF7CDBC317F7CD4DBE558506B8F8873360AD66260C6F61F53831", + "l": 1024, + "algorithmId": "0A8FAFB238A3312BB203D01E68813A95" + }, + "fixedInfoPartyU": { + "partyId": "9A64241923A83686A065A61EEC9B2EBA", + "ephemeralData": "1E4242BFE501E56936455422B150AE602327CB8CB113332306643F277F8FE41A7519C611" + }, + "fixedInfoPartyV": { + "partyId": "598C729503639A0166F76D0B49A004ED" + } + }, + { + "tcId": 139, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDAF2608F6F371943D95D343A34852D7", + "z": "4D8BE5D4C4A84C0DDF53BD718E9A5DB24CB5449319D90643F3A2C2BB3FC606A99AA2EBDC", + "l": 1024, + "algorithmId": "8FDA123967D283EAB0420050E7FA0761" + }, + "fixedInfoPartyU": { + "partyId": "C363D9978EF9A23181E8088BD0E53F70" + }, + "fixedInfoPartyV": { + "partyId": "7A5E1FDD1A6F31E6B3EC2914517E3A62" + } + }, + { + "tcId": 140, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7442852921C2CBB189F9ED61119D7CC3", + "z": "0B07171D661324217E4EF47DC3C7D4D5CEB2A1C33D0C0E5CA86755DD03C047F115E8F783", + "l": 1024, + "algorithmId": "D90449028A8B5FEC3C45E449007D77B0" + }, + "fixedInfoPartyU": { + "partyId": "885E85BFA22C51850B339ABC7BE8EF61", + "ephemeralData": "78A9928AC69BBEABC72C3DBBA13A1236B8D3DB0107458A0041B9E142F8FD97252FAE9E73" + }, + "fixedInfoPartyV": { + "partyId": "A9BE9BE6C685C979B87983EA583BDB58" + } + }, + { + "tcId": 141, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5C8415B3844DE8CE6F9D12ABF0236C1", + "z": "E6200E1714BB7BD5880510AC7B1EC5AE53C1DA9228979719DAEE2AA37738EF60B67792C9", + "l": 1024, + "algorithmId": "48E41779EAF3DF5616B41A6691F6A54C" + }, + "fixedInfoPartyU": { + "partyId": "80A51C46F4CC1FE2001C8BFDD1E72DA0" + }, + "fixedInfoPartyV": { + "partyId": "760BC3D96F27A1B0EA500AFC73043675" + } + }, + { + "tcId": 142, + "kdfParameter": { + "kdfType": "oneStep", + "t": "883188C2E311DF6FF352FD4BA972050D", + "z": "833FE6017723BF4256CFAF104FFE7355B652F10BFF34627F1D8511AC23438C21B5203F18", + "l": 1024, + "algorithmId": "964A39C3586E3300E5A353363EA2624D" + }, + "fixedInfoPartyU": { + "partyId": "D1D711AB0D7435773AFD4EC181759519" + }, + "fixedInfoPartyV": { + "partyId": "22981B0DEDECE1ECBD72A5D141A4337A" + } + }, + { + "tcId": 143, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7191367208BA720701150ED0880BD3DF", + "z": "E2DF4102C1BE2D89EC9ACC30C3971921B49202B5021DECEA471942B6BDA732BE43B945D8", + "l": 1024, + "algorithmId": "F11FA427B8B293F73036445EA2CD46D1" + }, + "fixedInfoPartyU": { + "partyId": "6F53B7541B17CEF48DD14E2BAD33DBEB" + }, + "fixedInfoPartyV": { + "partyId": "0CA84558848833BB97F112F6ADBF4FDC", + "ephemeralData": "7A9F190E6E899C09481A701541C9F43420F1251C4EDAD1977FB562CE0A47D389E4CFD917" + } + }, + { + "tcId": 144, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50B0DC068DB3EA4EC53C1F1493852E55", + "z": "C06A83522D711EAA9534205F19AB5DD0CA7E9F5F32B3C8264B24775CE36CF9576D702E3C", + "l": 1024, + "algorithmId": "DC9532EEA7D3020A78AC5D8083E69C38" + }, + "fixedInfoPartyU": { + "partyId": "672E8037869EF1FA9D37A1C15C8528C2" + }, + "fixedInfoPartyV": { + "partyId": "5EA3F9F6053D39D6C5360D5682DF7FE6" + } + }, + { + "tcId": 145, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6AC4439E7EF74586DC4B7F736C874E12", + "z": "98C0A081B3B02C0275B42EBCBE52285BDC2A7FFC7D2F2D292A79AE73D2F2000CBCE23D31", + "l": 1024, + "algorithmId": "039A60D5F20A45F64FAAF9BA3B0A083E" + }, + "fixedInfoPartyU": { + "partyId": "1E81791659B32106C5F8B45B11F6DD7D", + "ephemeralData": "919A9A91AA885F5B7A9BB78C30A68118891FFF966D88A8C6FE47D07D4BDE0024EB090EE7" + }, + "fixedInfoPartyV": { + "partyId": "7A7FEB2A7840C7B0E4DEC518DC59ACB7", + "ephemeralData": "99FB480DDF6F502376C57FC1A2537142A6EAB6F70E2C6C9D481EF063656D5ED868660095" + } + }, + { + "tcId": 146, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F0D0A04FC8E701F3D22D8C55F547447", + "z": "EC35C139DC8AA73BA8751E91543BE3404EF210DA187550FA8E3792749A689E656163FD66", + "l": 1024, + "algorithmId": "C4CBACEA9BF046E68FA4C919945BB32C" + }, + "fixedInfoPartyU": { + "partyId": "F42175FBCF4393A033EAB90BA85E6A49", + "ephemeralData": "D27BC49686C6ADA6DBFDB307F886434AB170CF891A39545A07CD5EBF2947CF0FC282EEBE" + }, + "fixedInfoPartyV": { + "partyId": "A672B4093F462B1D5B4B7F169A3929B2", + "ephemeralData": "F754D4203BF2D1BD6DDCDB2BF7CB9AD5955F6867D89570469812826CD25BBA89687BCD42" + } + }, + { + "tcId": 147, + "kdfParameter": { + "kdfType": "oneStep", + "t": "286CE8B2C1ED4ED80A3543488B5E019D", + "z": "FA8C50C0F53EAC5358ABA67BEAE98366430412B4AB04BE1C2E46180091392153946D03B3", + "l": 1024, + "algorithmId": "1E3873FD40782DDEF06D40A684B1B02D" + }, + "fixedInfoPartyU": { + "partyId": "9F0C424A19ED07FC308BCDC87BCBA405" + }, + "fixedInfoPartyV": { + "partyId": "32CC6D51DA533EE176AC19831A30C229" + } + }, + { + "tcId": 148, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B71E73F805BCD4F8CFA0C5A88A94200D", + "z": "0E1CFBF575982A262D1CFC620608F32E9DECB8A73C91ABBDA387AAFB0C48E423A0CF275D", + "l": 1024, + "algorithmId": "69A4C73679B314E99130E30215CB03CC" + }, + "fixedInfoPartyU": { + "partyId": "405E7F424C12FD3EFE8E87D7284504F8", + "ephemeralData": "7374EE57CBA6EAD0EA64C80A64A6C5C472A244838FC1AD1211D1E61BC7273DC81F6A8881" + }, + "fixedInfoPartyV": { + "partyId": "3BBFBD514F2BECBDA1BC611EC630EFB2", + "ephemeralData": "2B8A0F6A2A1298149C1EA605096254DC1393DC4D3923B9053F31F73DD8FF1405E1BCC3CD" + } + }, + { + "tcId": 149, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3387F48E1CB90C08C54AC1DF8EECA6AF", + "z": "B9615B6ADE6D3E7C5EF99822F53D71FFABA727FEB9AF9C32AE7AE4FB6EC577D30D80575D", + "l": 1024, + "algorithmId": "4D777010BF8FF1D2FB5A366A025D6DB7" + }, + "fixedInfoPartyU": { + "partyId": "661D005C6B929C47FA927EE1377A6AF0" + }, + "fixedInfoPartyV": { + "partyId": "3BD7449C77BCF2677E3AEB8A1AEC34DB" + } + }, + { + "tcId": 150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD8395D0D5D3EA36EA039CC1372CDA54", + "z": "32842C04A238C17541028C9127AF587CD929E0E06CEF7C0066D551817FCBF4217CE55773", + "l": 1024, + "algorithmId": "A9941C8AF8E987370897482B397794C4" + }, + "fixedInfoPartyU": { + "partyId": "EFF566FBBAEA9CC66FB5AD0E60881837" + }, + "fixedInfoPartyV": { + "partyId": "F7D4623319C0098AF294EBBDA81A40AA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 7, + "testType": "AFT", + "tests": [ + { + "tcId": 151, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABBFB3609C2A3893654D0ED2B061FCFF", + "z": "FABFE33130B2B9C3BD561918590B04338438EED47F1691FDD00C8F8E3C68121448D01846D9", + "l": 1024, + "algorithmId": "80891205BCDCEF651960E78FAC7DA719" + }, + "fixedInfoPartyU": { + "partyId": "C48C1D14A69694417E4473F9EAEA38B8" + }, + "fixedInfoPartyV": { + "partyId": "D21A9FDBDDD479ABBBFB2F760D42A527", + "ephemeralData": "C0F056F8D37CF565A170FA4D2FEF0841ED7C3D09A9EE2DA6A8B08283188CBFBF8A4E039BC7" + } + }, + { + "tcId": 152, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53BCAF744CA7ACCD5BC6C03EA967BAA2", + "z": "E842ADB877BDA93B289AD40412B007F3F4C7618D75AA9B5AC30FC3B1808A49707BFBE54E66", + "l": 1024, + "algorithmId": "4B96CD90130C336D1E88D046A15FD971" + }, + "fixedInfoPartyU": { + "partyId": "4EE7D7FD117297B7FD8D28DD7132D09B" + }, + "fixedInfoPartyV": { + "partyId": "59AD0A9805084561AF9B76E83446725E", + "ephemeralData": "1F2BFE3BB7C58D1FF885E37BC29659B3B4FB3A5A826FC1632B89616C5BB37ACB17552EBCD9" + } + }, + { + "tcId": 153, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CA254F4407D27CEB077D13C535D8A59", + "z": "1DD6897AB7F6959A5A05BE55FD11721F5E9C5E3AFB2941C1978230BA338F3997553203FD49", + "l": 1024, + "algorithmId": "FA0021D3D306594B89DBD72C8C0674E2" + }, + "fixedInfoPartyU": { + "partyId": "F6BA4453E50D19F5A0821FCD50C1A4CD", + "ephemeralData": "4B5F4CB100DB55061FB13C0870EFFF904B9C952E0B6B371DCA3924983434D9FF35F28A2A2E" + }, + "fixedInfoPartyV": { + "partyId": "2416487AD5FB2A675D87991BE8A4982B" + } + }, + { + "tcId": 154, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68A01A7D2E4F83D52488F9CCCEDA3CC1", + "z": "4BC8AF7715FEECE6E7DB90925026B4C37FF13AC76BCBD6E3B85FD2C403CF55CAE27384B352", + "l": 1024, + "algorithmId": "93FACF7C02DFB5186A14375E66B7D91F" + }, + "fixedInfoPartyU": { + "partyId": "DFB6C284ADF16B282607CA0AE7F7B087" + }, + "fixedInfoPartyV": { + "partyId": "0D33414AD3D81DE77A3950225DFF8EE9", + "ephemeralData": "9C9FDE04A0BD29DE522FAD226CBD6064EDC9218D661E3623622D9F2627FFADF9740A4316E4" + } + }, + { + "tcId": 155, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C71DD918512972C3DFF317480E53F06", + "z": "3C7C19492191EC9FCCD8F56C848B5AEC16178122C38ED354A41D4DBA7CD57A748F79E0D1AC", + "l": 1024, + "algorithmId": "128C1C4EC556936E7D25DF6F22A984BD" + }, + "fixedInfoPartyU": { + "partyId": "5C6FC284C3D898E2E3B90410C4928213" + }, + "fixedInfoPartyV": { + "partyId": "563A5AFBBCCEDC08A27E23F45577BFF5" + } + }, + { + "tcId": 156, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B01E7E510FEBD9C5CA0E59688BD3297", + "z": "B5FC7F082E6E29686FDE9CA2658E234DC182C17D8E27830EB2A5970A64F0A622DDE2E64478", + "l": 1024, + "algorithmId": "76DB9B41F7342F560E786D9C38FF0673" + }, + "fixedInfoPartyU": { + "partyId": "266781D63A8DAAFB4D8C24CC8C7499F9" + }, + "fixedInfoPartyV": { + "partyId": "868EA97628E1FB81C8863A7C57202A69", + "ephemeralData": "D982EC65B3FF008424AB294BC4EE5E7D5EDC549FB048C1E698A40EF86A419729F5F64CE495" + } + }, + { + "tcId": 157, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBBA2C292422F7EC3D7EC9FC0C9CD8CC", + "z": "1E8D7BD335AFC2E8F821A39F62A46844D0A65895E878FA1912D7F29A16122BC3FA893FD152", + "l": 1024, + "algorithmId": "16315D5FCDAEEFDCEC0D1A198FDDE06D" + }, + "fixedInfoPartyU": { + "partyId": "D4943CA9FDD32BA6D762F689AC091BA8", + "ephemeralData": "236DC921DB2EAC4F24D074BCCD064D46F94E793F596C9D3EA242D72D19091F5B269A690E0A" + }, + "fixedInfoPartyV": { + "partyId": "1AFC4F9135EC04948AC870A3EAC08183", + "ephemeralData": "AD05075513AFFF929A87B7387B85D65664B8BDD6482F758067A981CAE54FE66ACD63C0C41A" + } + }, + { + "tcId": 158, + "kdfParameter": { + "kdfType": "oneStep", + "t": "21987D4140544F364AED4A3A56ACCE76", + "z": "9E3910B04FB90B061BEBDA77A60D8BF97417162F52768000C70FD464C788FEE1E3DC20AD75", + "l": 1024, + "algorithmId": "526CBFE786D1E8364C476F3A10C19357" + }, + "fixedInfoPartyU": { + "partyId": "6611EEDECE3582DD76D68F24D0946E90", + "ephemeralData": "169403CE52F9173D1DA4F4C896B469504782C0C1D747F016BF1B59C16C13076C3613227CAC" + }, + "fixedInfoPartyV": { + "partyId": "502C0686456B1E5A7DCDB7BC8D025A8B" + } + }, + { + "tcId": 159, + "kdfParameter": { + "kdfType": "oneStep", + "t": "881707DE46EAD2E22D19E49FC788F765", + "z": "C8D109250B783BB56A09436378DD3AD663794716AFCACD6A7C3BB8A4F0C99A81101CABC95F", + "l": 1024, + "algorithmId": "9443749A69AE237F19FB55DB259091C2" + }, + "fixedInfoPartyU": { + "partyId": "BFC8971F0478B1DD2CFBD6BE5DE38327" + }, + "fixedInfoPartyV": { + "partyId": "FC60563040683B5F913EADA3CD8F8925" + } + }, + { + "tcId": 160, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2522266FFEC48EA5C10599B7ECDEB18F", + "z": "F80271F1D9C2BA14BFCB09A184E1B58D0266C1C5B656D764ADE20DA21CE9C4510BF303CA41", + "l": 1024, + "algorithmId": "8DB2FCCDB217FCE829138359AF628A7A" + }, + "fixedInfoPartyU": { + "partyId": "64AA486EB64113238B14CFF5ED3E82BE", + "ephemeralData": "EDBDCF1E5D10CC5014C88D6156A1BE0D798343F75DD5F3BB084BE8082AF947696E2215B322" + }, + "fixedInfoPartyV": { + "partyId": "665011E14E581B402BC6CAF3F6184FD6", + "ephemeralData": "C7BADC7CA97B3E327935461575F742868D2AA886E735ECE9EDD83CD9E57FDB0DCC73F51441" + } + }, + { + "tcId": 161, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BFB24818EE94745B07A463162C8555E4", + "z": "21362B981A3075CF035F073D7FE72A25D30D2EB9FC0CF1DC58C25C3012D1D4E8423D5A50C5", + "l": 1024, + "algorithmId": "59D37C86F158CD798EBE97D46344234A" + }, + "fixedInfoPartyU": { + "partyId": "1A5FF287827FAEE207E61AB481FB1695", + "ephemeralData": "108AAD751616DC7CDC888E9DDF440B1F8B32A266EBBAB1BFA72BBA43CD74E105BE7325A0EB" + }, + "fixedInfoPartyV": { + "partyId": "BC8C9BC8CDEE3BDB2BD7E60D1A11D7AE", + "ephemeralData": "F5E15B2E5950E014BA9F61041834387D17918E3CA926123114A366509759772193E095CB1A" + } + }, + { + "tcId": 162, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BADB62C9F75BCD927FA346E959355522", + "z": "433985EB65C741A4566BF5A62363B83CFD40842F7E484F6C4BF879154EF31869144BE36A39", + "l": 1024, + "algorithmId": "66CF27A3BEA6402A0B9BB2398826C7A9" + }, + "fixedInfoPartyU": { + "partyId": "DD9A78127E2634ABCCD30A423DB85183" + }, + "fixedInfoPartyV": { + "partyId": "15E65F92B1D4AA9CAD746E2780B1FCBD", + "ephemeralData": "11BD7E0C693FD4181AFF60A59044E35CC288882ECBE9A62B44ECCF727896E532BA03CBDDFA" + } + }, + { + "tcId": 163, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD5BA7261F9B55828EC372A7192595DF", + "z": "35400053549ECFFC5FC4FD9E48618D7CAF31A10C10E2FD85E5910CB07CD51878D806EA8A1A", + "l": 1024, + "algorithmId": "B87020CA1B31B046F61BFB19802C0CD3" + }, + "fixedInfoPartyU": { + "partyId": "05190EB957FDA83166F69C507D67E06A" + }, + "fixedInfoPartyV": { + "partyId": "BD85913D6DE08075537A3ABD89FD9E2D" + } + }, + { + "tcId": 164, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5EC3E178D8E7C92B450338AEE9C32A45", + "z": "FF8A5ACA22953361F88A7B4E9401F3CEB7EA5188A05129BED2B2A8A5E154E6E57EFEA681F8", + "l": 1024, + "algorithmId": "7186A50B5328E677AC39E054A7939739" + }, + "fixedInfoPartyU": { + "partyId": "90EF3895A06C73509009076E4460F287" + }, + "fixedInfoPartyV": { + "partyId": "9F6408901371805C5B6A306AA58E2AA7" + } + }, + { + "tcId": 165, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F001926F1DD059043776EFEA3FC5C7B0", + "z": "1A84ABA55C2E3BB75F725CC4891AF24ED118529C97FB0CF20C955EC895A7D9B3F6AF8A3C18", + "l": 1024, + "algorithmId": "9624A4C0C4955DC1AAD530CC60FC0009" + }, + "fixedInfoPartyU": { + "partyId": "40D285D54C122AE19021AA1EEDFD9F74" + }, + "fixedInfoPartyV": { + "partyId": "88466739308CDD48665632267049C91E", + "ephemeralData": "EBD462F4C3CBC3A76095CCD686A66D4EAA3AE28673EE693189264A9AA889D0A4B32A54FD23" + } + }, + { + "tcId": 166, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A978E36EBB2B925EAE489C6DD1457CB", + "z": "36A0462784C48296845D8BA0664AEAC6E01BE5088F7BA79C0B005C8EAAD44F52776A7D280B", + "l": 1024, + "algorithmId": "343BB3C852711B52B8823616B08A4AD3" + }, + "fixedInfoPartyU": { + "partyId": "A92E5C361188DFE32C38333F0778BCD0", + "ephemeralData": "6201BD081B53394E4B02C0821EB193A0146C4BBE440755E37B980C144FF2C7D704323D4569" + }, + "fixedInfoPartyV": { + "partyId": "E39DF10A32FC67942C1EF015B1E5CB04" + } + }, + { + "tcId": 167, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD37838F9D5F7BE5D1157287F99D428D", + "z": "93F044D1203D145E4F6EE6F8ED238AC3E0C9DBE1A35052D1E14DCF9FE7ADD8BBBD2B34D7E9", + "l": 1024, + "algorithmId": "5E31C7C82D7E58C0A4FCAFE9CCCA0296" + }, + "fixedInfoPartyU": { + "partyId": "A7AEFA0F2913EFC7A3E812F06AD2A005", + "ephemeralData": "A31E04B29666634044D3092680A2B1EF5F09419DBD618D102D918A895D6AD4C53E104D25CC" + }, + "fixedInfoPartyV": { + "partyId": "6D5D51C786DF9A115D8993FFFDDBC782", + "ephemeralData": "AA28A4F8F806EE7D4C298C6F44285C5F0C65D63BBE6E0B7AFB24251D2501BB188FAB74DC0E" + } + }, + { + "tcId": 168, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9B4D50F755C080892E6E1A1BFB9EB32", + "z": "2296267EC4D4BE88BB7505666C30943BD8310C1E0C300CE32C387D8E3E6AEF5035C8395DE8", + "l": 1024, + "algorithmId": "A0905CF40F7879AACEFE187D0EF85312" + }, + "fixedInfoPartyU": { + "partyId": "C8F0692BFC2465AE6412804EFBE16BC8" + }, + "fixedInfoPartyV": { + "partyId": "75BCAE73A9D0B6AF7A4ACF5B09C9AD21" + } + }, + { + "tcId": 169, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7DF6704FA24FE97BD68130C2F441F1D", + "z": "AEDABBDE477939F42086BD25A0958D717C44C8607CC484BFBDC12EDE571BE1B0F243BE888E", + "l": 1024, + "algorithmId": "74106C634AC627E13EEE448554E208A9" + }, + "fixedInfoPartyU": { + "partyId": "9FA47D5F79D7FFA7E52ED7293D6D82CD", + "ephemeralData": "DF9E73ACDA9577C00CE525F9B05F9953065ADEAF15AA03DE79B4A462FA5BF3CDA228FB1D6B" + }, + "fixedInfoPartyV": { + "partyId": "C5CD49CFD3202D3089752EE279B42B85" + } + }, + { + "tcId": 170, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5DD300FA43C4CD3EA9111954E372FAE", + "z": "7010FABCE628FCC4C5CD9E65666FD8C255E582410635D84FDD201A428E3664291C3154A000", + "l": 1024, + "algorithmId": "2D4AC5B1FB62C3590B690219714FF781" + }, + "fixedInfoPartyU": { + "partyId": "AECD9D0674830C71F752BF00CB841119", + "ephemeralData": "48BB6CEF7A2F26BF581A58F5778502541AFE30EDC4C7552039F145CA70968BB6CAE5C73E50" + }, + "fixedInfoPartyV": { + "partyId": "9CB042AC2DEB37050DF58F34F85A4F8B", + "ephemeralData": "807012CA92757CABED6CBE72780CC4E606D59D397E99B44A7716A3B13E705ED46D423BFBDC" + } + }, + { + "tcId": 171, + "kdfParameter": { + "kdfType": "oneStep", + "t": "037088C06FF6DA4027CE67721662DDF9", + "z": "2B4F9438A4AC94842860ADB8C27FF4A5DB6331EEBD60FE84540A73B0A915E2803FB49D4243", + "l": 1024, + "algorithmId": "5ADAC992D73B143455F31F3AEDE091E7" + }, + "fixedInfoPartyU": { + "partyId": "56D2B196DBBBD3C4F4C16D4DFA781A25" + }, + "fixedInfoPartyV": { + "partyId": "AFF01B65C61C25ED81D386F11D4E9E28" + } + }, + { + "tcId": 172, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0955AF1CB6F8D480A8CF9A209AAFCEA3", + "z": "6C73F04C5B1512344B1EEB2315A4EC17CBEC5969E9A443EA2C86717A05530AEE5081395D8B", + "l": 1024, + "algorithmId": "71C6A6D07C55B0C42FEB44F26BCCE53F" + }, + "fixedInfoPartyU": { + "partyId": "55B2CD5490967C4928A6955BC3B42045", + "ephemeralData": "027C0EF1C06066F78D54A7CC7B46816F28A448A438CFF9E02B5C67D007EB032D6C9570733D" + }, + "fixedInfoPartyV": { + "partyId": "69291CC09C9B1ECC3EC454D8B1F3D8D7" + } + }, + { + "tcId": 173, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC40E86CCBE42A5EA3C79DF170E41554", + "z": "D6DA43A96D02C9D0618C94DE38CF34B82838994C441206FD34417461E4B23637CCC051E5C3", + "l": 1024, + "algorithmId": "7CB728BF0685AEEB369B46B7F381006D" + }, + "fixedInfoPartyU": { + "partyId": "4F2087D223616E86298F8B32DF1CAFF6", + "ephemeralData": "2A38F566B3A9498F68326FB2A6A52CF6597D9C4E3B2CBA8BD371981450AAA3EE8782B00AB3" + }, + "fixedInfoPartyV": { + "partyId": "833996F7A7E3B2B7F777E13579C16E54", + "ephemeralData": "5B37B7E12610F8708B8C00EFADB5142404DBDFE70281956DBEEECBC141707ED5DB0BDDBDAE" + } + }, + { + "tcId": 174, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E65FDDB398DE768D70DBDFDC60DF2208", + "z": "00DC285ED1BEB2FF08E1EF9B8A30652084496B614CBDB8E3394B8E11EF38E30EFCED2E5C70", + "l": 1024, + "algorithmId": "53CF2F389944309B6597E6577C0C6510" + }, + "fixedInfoPartyU": { + "partyId": "72514C20BDA9379050CB70A63EF956E2", + "ephemeralData": "E5D8FDBB4B60B2E7234563FAE09AAFDE0A710A6ABCDCBADA79D05FF030021F6063FDF65061" + }, + "fixedInfoPartyV": { + "partyId": "47E264E0EF5D16806B80753CDAF57E02", + "ephemeralData": "3879AF4A19CF83425606E45F2E2E68CE9614EBB9F6E1DDBE84FE3D49DEDAFC681D5CA0830B" + } + }, + { + "tcId": 175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3360CC690ED0A9D23EF80F4F5C8B412", + "z": "3B7EC31D6DE1634ADD5F277DC591E5CA147FF4B8FBA65E8ADAABEA94CF60360DED80A15434", + "l": 1024, + "algorithmId": "7E18DCD3F8C0A4ED2ADACB69C4A0B512" + }, + "fixedInfoPartyU": { + "partyId": "170E9447AB124944955F25687E059097", + "ephemeralData": "10598EB6C955B596B4143481FB86A4AC00EF27646BE0C6BD3D09318582D6E670BB106E6A8E" + }, + "fixedInfoPartyV": { + "partyId": "E630DBCB4C8B068C2EA0E5A71E1FDB2B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 8, + "testType": "AFT", + "tests": [ + { + "tcId": 176, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDF3D6ABDC338B7FE0AE03910E1D950D", + "z": "EDB6A1FEB6B0828A48EBA7B1A1CDDF716124DD44CCFFB6873C523CEA", + "l": 1024, + "algorithmId": "8BF75079EAB223D069E9BA783681ADB9" + }, + "fixedInfoPartyU": { + "partyId": "B3CA51965704BAFD3CFFC430F9BE0D87" + }, + "fixedInfoPartyV": { + "partyId": "FFE53D9C8B6763AAEB042A92BDA06E4C" + } + }, + { + "tcId": 177, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C085CBE7BD57A08350E816E2654170C2", + "z": "7CE212C1297DFC41DEF35AA2888F2746A77B2907EDB3AD97B3B96A0C", + "l": 1024, + "algorithmId": "B6A23521A5BE465ECA23191D6662A940" + }, + "fixedInfoPartyU": { + "partyId": "B95E53BD141EEF7CB799FDC092E366C2", + "ephemeralData": "3BB20CD88E48E6E845A02B36CA85F190ED107FA6D88C1ACF115B0941" + }, + "fixedInfoPartyV": { + "partyId": "7E19BA574BF36B8708808DC39DED21DE", + "ephemeralData": "38CB437C710229729185F95068C239CDC05AB273BD28864999FEEBC9" + } + }, + { + "tcId": 178, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF8D0EB0A0CD857D00D831187F331577", + "z": "DD4F654FD115A43D3BFA17445FDF12791F1C78776A8FDEAFA48A65FA", + "l": 1024, + "algorithmId": "6CD4858A2749CEF893D75E63CD662703" + }, + "fixedInfoPartyU": { + "partyId": "A008C88698BC30FB242C6A40E9E33790", + "ephemeralData": "5A1463BAE60EDE329440D9B28F4A55B84F56A15114985B6EA66B87B9" + }, + "fixedInfoPartyV": { + "partyId": "C9EFD54ADB2137E3DE95BC759C74B561" + } + }, + { + "tcId": 179, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7619DF67BC852E805677D0095884FDC7", + "z": "944EEEEAC50150D3BD159FE829B38FFEAAC613D2929C7E5B9F3F1E3A", + "l": 1024, + "algorithmId": "356856273996A798254A02C2CE446296" + }, + "fixedInfoPartyU": { + "partyId": "F585F16149DAC91709FF208EB8BE8E7C" + }, + "fixedInfoPartyV": { + "partyId": "2F6CB5791DE9A25CC9C7D35B7AF157CD", + "ephemeralData": "157D31EEF7BA211A5D971DBB0BCBE15CCBC51F12AA90DE1C0D544415" + } + }, + { + "tcId": 180, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6991997A4D52F940A5CE9B1CA9249186", + "z": "FDA6F92C7D573575B5D0D2546F057986CBB76215F639587D3D24A2A2", + "l": 1024, + "algorithmId": "A5D223477BDE8294C8DE0CF6E69FFB18" + }, + "fixedInfoPartyU": { + "partyId": "BA942D572E2795FFA5D974F1FA4E91BA", + "ephemeralData": "ABBF70609F11DABC14843C3CB28410A64A6CF4DCC9A7F8E3F3C61F03" + }, + "fixedInfoPartyV": { + "partyId": "801431A698D609DFDA29999DA0475EA1" + } + }, + { + "tcId": 181, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC1972CEC3074CA97A92019D9A17DFEE", + "z": "5C2AE9DDD9140B6962AEB41D22F9E89737F33E8549302F7632F22586", + "l": 1024, + "algorithmId": "9997A6075D51F7D6C7A377A9D4646FDB" + }, + "fixedInfoPartyU": { + "partyId": "5F14CEAEBF2364B4E1D764DE64F8E06F", + "ephemeralData": "90B86E181132598F46A5D9D4048C5518117A83B7C31AA6E453C0E25B" + }, + "fixedInfoPartyV": { + "partyId": "E127A0DE398A086A0782CCB5F69BB3EF" + } + }, + { + "tcId": 182, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A360EF3F626E983296C5AA489001C98", + "z": "8AA66D0F22E70D8FF79597871490060D68F49173930376908A8BB161", + "l": 1024, + "algorithmId": "C1CE7AB8A43ED8B8B09F157429967B7D" + }, + "fixedInfoPartyU": { + "partyId": "12156D18223044EE0643A3A2AABDA8EE", + "ephemeralData": "6643268AC369C64AD3CBA478CF237A69C9530B3E785B6F11587D1C03" + }, + "fixedInfoPartyV": { + "partyId": "9863326239DC3228510BBDD4F822DE73", + "ephemeralData": "C745A7D26FACF55BE85F05F52CEBCEBAB33D1B3E4AC8A0520DC9853C" + } + }, + { + "tcId": 183, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02E373A4169AA614E4BC44A6F11B4FB2", + "z": "B6D02D7A79513C25A98625E9725E5027D8730DD68F1B7026027D0596", + "l": 1024, + "algorithmId": "71D1777E2FA5AEDD3FAB425CE41237BD" + }, + "fixedInfoPartyU": { + "partyId": "981A8C33424BCFFA7999A3CB6A9B95A8" + }, + "fixedInfoPartyV": { + "partyId": "A0F98804B359DC39EC7E2D2748C3BDE4", + "ephemeralData": "40C6917D1C67806E0C6F96A8B921997644D91A77E4B6840D097241E6" + } + }, + { + "tcId": 184, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDB7A9862A7BF1C3243CF7B2877575C4", + "z": "1D468D02D81AE1DA57A2E8B61E746B5B758573BC44051A31F09A4F08", + "l": 1024, + "algorithmId": "B69C8E3FA29A15E4CCDF450E0AB23ED0" + }, + "fixedInfoPartyU": { + "partyId": "3FCA316FA985ACF4F09ADC5D3B45B5CA", + "ephemeralData": "620A2A84D17F174A2D0679E8D4A3EDC13526E260079E735C7C58C8C7" + }, + "fixedInfoPartyV": { + "partyId": "FAFD33A7416DA0EEC53B67DA16A9E8F8", + "ephemeralData": "0B48E6DEB2595A0F38770E3B6932F88649AF2612C4B786D5E2BE33BB" + } + }, + { + "tcId": 185, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76009C4DC5DC191EE555885901006936", + "z": "A84358786375FCD9058A5910B6EA37C04BFDF30962F2F2D317F63512", + "l": 1024, + "algorithmId": "329E0A8D32C5CDD3709F20C2613DCDEC" + }, + "fixedInfoPartyU": { + "partyId": "65F79E76435F871457204ECC3622D944", + "ephemeralData": "FA89A29317727FC6D12F1E49AE7A9F92C0159DFA11F4B4252FE62409" + }, + "fixedInfoPartyV": { + "partyId": "B0D1252D251E785D346FD80F043A8E46" + } + }, + { + "tcId": 186, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1574F83691189EDC632FF33375C8863B", + "z": "82DC26FC960CFC00265256A07B0149EC3A102777AD340CB06292B2C6", + "l": 1024, + "algorithmId": "DAEFFA6E7FE3B1EF642B4220B88A2C89" + }, + "fixedInfoPartyU": { + "partyId": "0CFE1A512E298C67BCB8CD3CF72D9A29", + "ephemeralData": "2C131345901EFE18F9DC84B2308A65FCA6CA154EA6E0F09D9C9276F4" + }, + "fixedInfoPartyV": { + "partyId": "B8ED514CAA8CE549AF07B3FFFDE5D423" + } + }, + { + "tcId": 187, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A147784EFCFC7AFE8739B5E54B6F977", + "z": "093F9CEC226F166CC9F92897ABB93FB66187A495BF7298E6E6421BEB", + "l": 1024, + "algorithmId": "94D92E241FFBA6E57EDA79D1EF855FBE" + }, + "fixedInfoPartyU": { + "partyId": "BABEF787DFAEF3EC0934D1916DFAEAAA" + }, + "fixedInfoPartyV": { + "partyId": "5849F91FABD4BE4B7E5B58240E703111" + } + }, + { + "tcId": 188, + "kdfParameter": { + "kdfType": "oneStep", + "t": "957F2F923194B63BFACD41DFD47ED6B0", + "z": "C0F4859D5C072EE66FB08885725731410100F70A58151E2B3BBFC011", + "l": 1024, + "algorithmId": "12F6345AA0F654AFBDC2CD762F806A9D" + }, + "fixedInfoPartyU": { + "partyId": "E7CA26C191E6BA759A8E60D57F2B9039" + }, + "fixedInfoPartyV": { + "partyId": "2AA69D62B8E3AF107F09AB215E09B9CB", + "ephemeralData": "ABB1C50022E51862EACBD11C1F64BFAE1EA2CAFDBDA3E02B81CB791E" + } + }, + { + "tcId": 189, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F3C9F3B2D5F0DE17576FF2480B0D7D2", + "z": "1E1943544D84CA8D0CAFE92FA7CA4DE4DF7A8B658C91AB86166D5702", + "l": 1024, + "algorithmId": "F49845F8CAC2B2789B08F12CFAB9CA4D" + }, + "fixedInfoPartyU": { + "partyId": "981A2346276D81D8A1C76376D860DB91", + "ephemeralData": "7BADCF29858168A12B8AFA729142C21FD338D130F051FEB743949097" + }, + "fixedInfoPartyV": { + "partyId": "9146E70EDCD9DB85B3BCC8EBAF69C587", + "ephemeralData": "20970C8F0557E888676A68D550E81A0E0E2EE36D9029D3952BBFB8CD" + } + }, + { + "tcId": 190, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1610FD6752A5602AFFBA2E670E9CEC1E", + "z": "46E117F1B333061862556C61FEB5DD7EF8FE17E99248367A2199A15A", + "l": 1024, + "algorithmId": "11C16143E338032425227AA60B17ACE2" + }, + "fixedInfoPartyU": { + "partyId": "4F250AA4E7969FC8A18822F227BECFD5" + }, + "fixedInfoPartyV": { + "partyId": "546330E56D54FEAEA7FBF1A6AB4C80C2", + "ephemeralData": "3423447FC2DE2F9A95972F82E4E10EBD6ED6C13613555C06D65919BC" + } + }, + { + "tcId": 191, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F19FF28EA85540D229341F520A3A67D7", + "z": "ED72E293C9AA6486684D7154485CAC6C2DB78B0DB71AAC95198524DF", + "l": 1024, + "algorithmId": "2B9EDDF4EA57D8E4FF6B022D440BC8E9" + }, + "fixedInfoPartyU": { + "partyId": "C6FD824C2A968558CF0A6538F171C2AD", + "ephemeralData": "DBCEEF8CA106F5C6194A092D3AB385BB7A7B6B37A51C540CE325BD06" + }, + "fixedInfoPartyV": { + "partyId": "FA014C546EA1094C248C62E366031B22", + "ephemeralData": "6824EE8EF8589714671B8241851C5783B611A0ACB3791FEFE2009D54" + } + }, + { + "tcId": 192, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FED3DF62738AB20679727B4FF655008", + "z": "42132AF094CA1055DC03E8D51E4B7E8FABEE2958B3A3BE9F3A1C1743", + "l": 1024, + "algorithmId": "29C17B143D0DEB6FFDA402EE349188BB" + }, + "fixedInfoPartyU": { + "partyId": "8AA6B1AD4A89865FFDF97DFE32077CCA" + }, + "fixedInfoPartyV": { + "partyId": "AA744A874C323910390D521A60A2D8EC" + } + }, + { + "tcId": 193, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA2C0B9D690B4B264824940F297567F4", + "z": "9BCC6234213A29F28C8741199580800D9608241E94230C8922573E9F", + "l": 1024, + "algorithmId": "A6E019DEDAC9EEE35E6F68E6F3AB59B6" + }, + "fixedInfoPartyU": { + "partyId": "EA0BE044E71DBEC19F3B1FC1D8C0065D" + }, + "fixedInfoPartyV": { + "partyId": "3F26ED350475B7A0835C5075CAA63A8E", + "ephemeralData": "C567215564B6E7D02628A6954F1E12489F235AD3E045EED42F631737" + } + }, + { + "tcId": 194, + "kdfParameter": { + "kdfType": "oneStep", + "t": "010FD14DA20BEA71FEACC6718E4C0124", + "z": "847A38DAC49F7DCA1274135DF7B96C07DDA43E1B81527AB242B03818", + "l": 1024, + "algorithmId": "2ECCB8FE4D0B516552AAF16EEC36878A" + }, + "fixedInfoPartyU": { + "partyId": "3272CAAFAA7C8907C5340A41930508E5" + }, + "fixedInfoPartyV": { + "partyId": "FF7968EC989B36FD5C3944143104F7CF" + } + }, + { + "tcId": 195, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FB60627191D7133FBF723DA943D94CF", + "z": "25BC3C9D171C02BBC5DA8DFB34CCA3B8B3817D7D12C7F29E709EC5A3", + "l": 1024, + "algorithmId": "3008BFF2FEB5F13197FFD997EF37943B" + }, + "fixedInfoPartyU": { + "partyId": "5C162BCCDC9298212C5A153B2A6FE5BB" + }, + "fixedInfoPartyV": { + "partyId": "3662D386A9A1E4F02B9A1DE9A4904243", + "ephemeralData": "B9314AFFD5C8D2812CF95A74BFEB8FF8FEFA63139F48A278560D9756" + } + }, + { + "tcId": 196, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03FE97095B78A668722F9A6F6404B496", + "z": "0194D95C5ED6AC206CE94B2AE550A07AC8442A8303C757A8268656D7", + "l": 1024, + "algorithmId": "864A05F75429ADEEF480EAA8FC4B8BF9" + }, + "fixedInfoPartyU": { + "partyId": "45E100ED3FDD247FA07D26AF57EB2472" + }, + "fixedInfoPartyV": { + "partyId": "C2CFC9277F2BE391AEBE319256C7F767" + } + }, + { + "tcId": 197, + "kdfParameter": { + "kdfType": "oneStep", + "t": "617029D4E36E3F0024D6F7264B1E0BB0", + "z": "D0A26DC50A3382A53CF4F39D7DA236A3C04A39C18B928F361B1F4588", + "l": 1024, + "algorithmId": "646CB6D6284EF43A93680A10A3929B01" + }, + "fixedInfoPartyU": { + "partyId": "EC8A9378212E519790A0ED8410BF849C" + }, + "fixedInfoPartyV": { + "partyId": "ECC955141105BC3435E046F19DCA8115" + } + }, + { + "tcId": 198, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F5BE288ED98F0887429969D594F57DD", + "z": "001E4C8BF9EC7CAC649119FCBA956970EA9561B171D7C4CE6D6A7158", + "l": 1024, + "algorithmId": "8F3DCB52F680B63484E9A8F0A7C1B58F" + }, + "fixedInfoPartyU": { + "partyId": "3CA8DE7F18C1D060E09EE15B52FCFB10" + }, + "fixedInfoPartyV": { + "partyId": "A681E17084DBF2F6516EF1DD5A1F043F", + "ephemeralData": "C2EE64018D0932A5FF484CF8B0D3CEE478582C59B5CA8F8F4265B661" + } + }, + { + "tcId": 199, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F47B146D504B0581D1CC390AFD32ED7", + "z": "4B36840C704F9BABDE91FCB6A3EA0AF800F40AF9C2680E6D723BB01E", + "l": 1024, + "algorithmId": "FD99BCA02C69AC8EFE9D9EFB8EA22933" + }, + "fixedInfoPartyU": { + "partyId": "86B510C5C98F2680EF0DCA64DCB8C89A" + }, + "fixedInfoPartyV": { + "partyId": "D8E865CB6083F46820491F60C54E251B", + "ephemeralData": "8AD6FCBC6EA93985E85FF0A1C9E59A19C86C8F22FAFC2E9B17513127" + } + }, + { + "tcId": 200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DE332785972E61F396FEBCB88F357A5", + "z": "895AD23570BBCA0EEF43F285186F4FFDAA84DF8A27C0B1BE80335CDB", + "l": 1024, + "algorithmId": "B499261334E732C56117D0707A0BA55C" + }, + "fixedInfoPartyU": { + "partyId": "ECFDCC96F3F518F3B7599A4E92E9BE5D", + "ephemeralData": "FC6C24B8F6635BF1F5CCC93656EB4AC2A0103EF4EE86D35A76D03BC4" + }, + "fixedInfoPartyV": { + "partyId": "5B5AA463EB02128A977109CECD42584F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 9, + "testType": "AFT", + "tests": [ + { + "tcId": 201, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91F7A1BAA113DDE0115295218FB4F50F", + "z": "0B91FF0C4175DFC6513A98ABD508377244ED0BE5F683D20FB95F89615F14", + "l": 1024, + "algorithmId": "7E1922EDDDA9BB583BACA5DCED52C774" + }, + "fixedInfoPartyU": { + "partyId": "47AF2A0BE1E5561F8FC08EC817C3B781" + }, + "fixedInfoPartyV": { + "partyId": "400FAC1E148298C3575FF5E498DC6A9C" + } + }, + { + "tcId": 202, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C73606DE077D4225744580237D7A678", + "z": "5E7F362B2B16F08551774125658AFD337777B92A3D37192AB8F791108095", + "l": 1024, + "algorithmId": "F6E0CDC4AD4801E0593FF70A4D825A49" + }, + "fixedInfoPartyU": { + "partyId": "8A2DC500BE7BBFFF4EBD4418AC8D80EC", + "ephemeralData": "51B9C665653C3FEF5FCB2CAA50D89AF48DCB7B1FFA4325323A07557AA0AA" + }, + "fixedInfoPartyV": { + "partyId": "D39D4AD5865B45E4080596804B8BC2BF" + } + }, + { + "tcId": 203, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C490783F73C4FFFAD06BFD56AE3D733", + "z": "D3BAB9A70F92AAA9C00E2D97109215A58F10421679977EC0DB51A4D1D1BD", + "l": 1024, + "algorithmId": "E42A0359B7167AA142CBF608A7BD9869" + }, + "fixedInfoPartyU": { + "partyId": "C3A95BD264175792853287F9AA3199BF", + "ephemeralData": "EDAA163F7D0CE31E9665117CBAC4C4063441122627FC5D1B70726426A96F" + }, + "fixedInfoPartyV": { + "partyId": "730B5FFD4D15294C6E940F3772CF014E" + } + }, + { + "tcId": 204, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44877B0CF3A48671DCE7F36A57ADF381", + "z": "795592B5D20052909EF018FBF75459A2BC79088ADE2AB5AD76E90125B4AB", + "l": 1024, + "algorithmId": "05C50D1F52726F0CA16DF91926AFE746" + }, + "fixedInfoPartyU": { + "partyId": "DE688B2DF8450A1BC4E86BA62DE89195", + "ephemeralData": "70F7D3F1DB907137164B20F849B05F1BC11700D3230D546F7F159E4AE3B4" + }, + "fixedInfoPartyV": { + "partyId": "C3154899D978127FDA0BAE016F21E905" + } + }, + { + "tcId": 205, + "kdfParameter": { + "kdfType": "oneStep", + "t": "444941029E84522818A3508B2E468FCC", + "z": "D5FA3A49F0FDC1C995A2DECFAAEC3D260990BCCAF8A6285653DC68E53EC4", + "l": 1024, + "algorithmId": "EA2CA99B1E83AFF3E4747E8D7109A111" + }, + "fixedInfoPartyU": { + "partyId": "E78693881E38790DC3C35D5A3F66B1E1" + }, + "fixedInfoPartyV": { + "partyId": "2D1B09EB6A24742EA26B7158B1462B1E" + } + }, + { + "tcId": 206, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F0139FD0F0C3301F8F93AB486441383", + "z": "47DBE7EFC35302161D71B4974466352AC8CCC8B8E2BACAE5FA91147118E5", + "l": 1024, + "algorithmId": "4803252ECC1EACB4BC57E81AF0BC4D3C" + }, + "fixedInfoPartyU": { + "partyId": "3182D2CB7A2E88B7EFB315E79FAA7BBE", + "ephemeralData": "51F7860F8D778114E02D1D3C2372EEFE0BCDC06E02C70D4DA2B8A8D70939" + }, + "fixedInfoPartyV": { + "partyId": "2E45131F915DD9069F03DDB597218044", + "ephemeralData": "C09BC0631CD3EB2055369EEDBD7516C7932B3156F458FE1445AF598C2F7C" + } + }, + { + "tcId": 207, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C7C059E9B934AD9DE4748CEE2141DBE", + "z": "2FD65A78AB492CA463488197688E1C16A7CD3D6032AFE30A1ABDB0146419", + "l": 1024, + "algorithmId": "E618747ACEC6D0C4C9CB6AA551899075" + }, + "fixedInfoPartyU": { + "partyId": "0AE89C333013A428686015B5AA54BE2A" + }, + "fixedInfoPartyV": { + "partyId": "0DAFA11267E7BFB5D3FA6E350D773331" + } + }, + { + "tcId": 208, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B4C46EF05008384CDC02FE00FF57316", + "z": "6A9D457424DE0B229D342B04D4C39FBBC5B3A1887711F57B1F71E679D5C1", + "l": 1024, + "algorithmId": "4EE559225D011F3C04709DC8F8F29E3B" + }, + "fixedInfoPartyU": { + "partyId": "1EA768FD00F7F6DCFEE04C9B95D3F615" + }, + "fixedInfoPartyV": { + "partyId": "5736AB4D086DB3243720421B4260C7BE" + } + }, + { + "tcId": 209, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A9C866DB645BB3E52E00366E9AC63A1", + "z": "E6BF58B5A172EA1BC19F82298C923DA0DB4E87473D5B35E2426A1A18D7A3", + "l": 1024, + "algorithmId": "84C1429D64DE9CD45A9C0514F4F452EE" + }, + "fixedInfoPartyU": { + "partyId": "58BC298D76805E19A629C6C1B4FF4EEC" + }, + "fixedInfoPartyV": { + "partyId": "768A8DC9A82DBCE18B1A5DE023081A63", + "ephemeralData": "50FEFB09DF28E4F00CC3B73E519D192DF1332802CA72EB13DA199A88F850" + } + }, + { + "tcId": 210, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C00D2AC8852381A33EDE0BDFC0E938C0", + "z": "CFF58735DA54965F75734B6B990FC5DB1616B1AC0CEFDCADF7A4C97308C3", + "l": 1024, + "algorithmId": "5535A6A1A1CB03147F541908D81832A2" + }, + "fixedInfoPartyU": { + "partyId": "2D5FD2D00C8AC9B16C3298DE0AF5E9B6", + "ephemeralData": "A466C1A1E7A39342380BBBC25520E726C1C975DCA94E4CC1BF2F755EA58C" + }, + "fixedInfoPartyV": { + "partyId": "F655EF8FBD342A875997E1A8B226378C", + "ephemeralData": "A84D8698CEC64F4519174EA51CA9E5FF1D47D1CA63541C729D7CB0256307" + } + }, + { + "tcId": 211, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DE06DC0737D5CFFE2D436FF41A3174D", + "z": "955C05191907057832CF05E825C0BDB380F418AAA28762FF0D0BBFC53890", + "l": 1024, + "algorithmId": "738AE93FA51FE728FD09D96219FCDC3C" + }, + "fixedInfoPartyU": { + "partyId": "BC8B5CB941174068CB2307149206BA3D", + "ephemeralData": "788DEDA8BDF499AB6B6211F065F105F9F3F1B8BFBF5EBEDA859AB3BFA97F" + }, + "fixedInfoPartyV": { + "partyId": "136447B6D42B35A3E19C5C9A2B4B791B" + } + }, + { + "tcId": 212, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0B7D129D7AC5402670169008F2A12B6", + "z": "314D80B59F58EF0D5E8A58BFC82AA6FC287C058DD5CD15F72E27C7B123F3", + "l": 1024, + "algorithmId": "0B7C4B029ED5FD7E5F09FAD5B7075A58" + }, + "fixedInfoPartyU": { + "partyId": "FBDB2AC1151A88E3B599DEAB2446AD36", + "ephemeralData": "9C753E37E4740D1D7D58BFDF9F9BC77779876EC21594255E1161AD0558DA" + }, + "fixedInfoPartyV": { + "partyId": "47D6C816FEE79CD5844727DBB45C13E3", + "ephemeralData": "6659D743C917804F9ED211AE32F7B020D97C39F83B5D923CFC8B264DA20E" + } + }, + { + "tcId": 213, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AFDFB66279325B995051F23D2A7F22F9", + "z": "023F7B9C2B12B4294411313D9485DD5994A5D6ECDB8307DB28150111E363", + "l": 1024, + "algorithmId": "FAE50CA9FF4BA897F47C71D7367C64A6" + }, + "fixedInfoPartyU": { + "partyId": "7B0562A77747D1E5E4FBC69B9BC8E191", + "ephemeralData": "9D99E96BAEA1E293F8090D0B4980C85F8BEAEE5DBA1E9EAE79CEF3540205" + }, + "fixedInfoPartyV": { + "partyId": "F59E0B7DFC1A67C20FEB78978097AFC7" + } + }, + { + "tcId": 214, + "kdfParameter": { + "kdfType": "oneStep", + "t": "624FCB6184CCAAE59B2CBA7C950F4D49", + "z": "76CA557FF3A10368CF699F6E288DC798A66F72824BE1B9D6534252C05C24", + "l": 1024, + "algorithmId": "497181AFC7B0FC8728FB9600648FCDBE" + }, + "fixedInfoPartyU": { + "partyId": "BA3830B35676F6071EC152A24DADBCC7", + "ephemeralData": "1B122978216F06460422C5C6846BEE81D44EB0BCF455F9AF5C38F604123E" + }, + "fixedInfoPartyV": { + "partyId": "6D055D4C53FD5F8F7FC54240C8E6CB37" + } + }, + { + "tcId": 215, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D9BBA6939199D626A67737EAA3E1B95C", + "z": "EF1128F2B1070E98AF384D01E17C1DEBC7C4A13111E6A7214C5BC5138C6F", + "l": 1024, + "algorithmId": "0BAB319E9FAE25436A81AAFF18587E46" + }, + "fixedInfoPartyU": { + "partyId": "D605D9BC399810B0E51E1130D4699CD6" + }, + "fixedInfoPartyV": { + "partyId": "96F859A9BE04F4BFA16EA5B2157CEB5E" + } + }, + { + "tcId": 216, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7320E74C36A937D35A98D03D5D5165CB", + "z": "5F204E0AEDCFA9B532E5671A4A5DA85B0A7071F30138E40F4981CC05AAA1", + "l": 1024, + "algorithmId": "BE7BABE570350B2FB295C986DD47677A" + }, + "fixedInfoPartyU": { + "partyId": "26DC3C246C55813DAFA63ACFC1EB4865", + "ephemeralData": "0E7812990DAE01213BAE86AB9BD8C4C13F93FD5BF56E8DB8CC01D800DBC8" + }, + "fixedInfoPartyV": { + "partyId": "B14B446134327B63871F724104A8CD78", + "ephemeralData": "D97A542F3751A44EFD8F548E7C5F14A633F42AFEBA8D3A9F31A14BA89442" + } + }, + { + "tcId": 217, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F3ABD1390C4289CA20622344A1B8654", + "z": "9779C2B33C6DF032B3BB968EDC4EFEA317607B9DD5A8A03BAB5BA14D747F", + "l": 1024, + "algorithmId": "FACE2B5643B6300760273DEB50DE7412" + }, + "fixedInfoPartyU": { + "partyId": "8B845FA17A4BA99E2DDEE1C497F6494C" + }, + "fixedInfoPartyV": { + "partyId": "2778F71F335C41CB64A42F3741C68585", + "ephemeralData": "7FFA81A0F933511A1455B23D2EF9E16BD211414AE53D201FC152C8855488" + } + }, + { + "tcId": 218, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B70870E6B818224D7C7271B2D4C434D5", + "z": "543670A88BC3E81BCE364F498ED861AF85A8561B7B472E33702924241862", + "l": 1024, + "algorithmId": "8B8135A2D1D51C40820C4E93F6073659" + }, + "fixedInfoPartyU": { + "partyId": "1C56368C960165625D118A6E1D14D09C", + "ephemeralData": "41A04EE42B7A5025168A414ADFF3F7C2C79D603BFD9481B82658DFB673C8" + }, + "fixedInfoPartyV": { + "partyId": "FCD58CDA9C5CA9447480FDE0B8A792E4", + "ephemeralData": "3BEEE5A19B7E77C4E6E4B9A91852E06A422D64664EB148DB0B57999E3E9D" + } + }, + { + "tcId": 219, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE940B0B7C0A0A0A1347098F31BDBF5D", + "z": "242612A633CCBB35137ABCFF651CB9515BEA940E5B4960641566DDDB1423", + "l": 1024, + "algorithmId": "93D53C7F61F2898C5FA1311CB04613C4" + }, + "fixedInfoPartyU": { + "partyId": "B3FA33E85C5A472CF8616A3D23F48154" + }, + "fixedInfoPartyV": { + "partyId": "3A516E331020DE1054D70BA56051B9AE" + } + }, + { + "tcId": 220, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F3C749DF0ADD1EFD27E7BBB851EFFA6C", + "z": "5683389C230C22E5DA9BCAC7C0DA35553C204705CABC2DB10714E0D69B99", + "l": 1024, + "algorithmId": "132DEA2CC08F282B6C616156994BF4DD" + }, + "fixedInfoPartyU": { + "partyId": "9FB5EE94C14864FF4C1391269C60E28C", + "ephemeralData": "45D98162C18D21C41584E7233E65AA796BF0D3B4B6BF58FD811F30A8C9C1" + }, + "fixedInfoPartyV": { + "partyId": "795FDB674462616D26DA6EDA1C6D6DF7" + } + }, + { + "tcId": 221, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A90A8300FB455338947834C54F8B067", + "z": "9C2327FB0A0E5C16A0A85463F6D003B438BA34622EFD82BFF74522BDD08D", + "l": 1024, + "algorithmId": "ECA75AA8754721AD9AACD77C2E9455DF" + }, + "fixedInfoPartyU": { + "partyId": "13201E5676F16FA6859DD7E7FC900469", + "ephemeralData": "493263F3504B65DD51BEA35EC5615E97FC3A1360B9ECA23B453A3EB1A1FA" + }, + "fixedInfoPartyV": { + "partyId": "713C1DFA5954BF2E5D7186013BFB3BF8", + "ephemeralData": "56644F9E9603ED11FAFF1825C0A370D851EAF34BC3A9106FC258F5175973" + } + }, + { + "tcId": 222, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7610DC39725EBF675F79CDE8B9CD4F05", + "z": "3ACA6543A800E42B1D1DAB461B10ED114F785B5816433051374D6F7D391B", + "l": 1024, + "algorithmId": "3CBC6B40E3CC36108FAC2925AB0779B2" + }, + "fixedInfoPartyU": { + "partyId": "1D74D2769DFDCEEE4DEE07C856253455" + }, + "fixedInfoPartyV": { + "partyId": "65EBF3A56F980DFD5965951E6170AD17", + "ephemeralData": "49DD55FACBFCC09F37D85AB82BC1E27059A680AD772CC3FF0987223524C0" + } + }, + { + "tcId": 223, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B28B93AD2EDC202DB3596684FB377DF", + "z": "720650B8C03F23E50ADB2B0EADCBAB0D08DA64D5E81739D07B5D59CEF90D", + "l": 1024, + "algorithmId": "1702F5F8E0A0C0969C45F313BA9B74B9" + }, + "fixedInfoPartyU": { + "partyId": "D0C17F387AA764B9A826FFD22598DC61" + }, + "fixedInfoPartyV": { + "partyId": "337FC39D1AAB14039FFCAA8C0742B5FA" + } + }, + { + "tcId": 224, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B5E8AB251096EF8DB65754ECF1E72B3", + "z": "8F5E9D55E224DD6F74758A02B4DE50DCBA55AF6C4B0A113B30CA7AB2BA8D", + "l": 1024, + "algorithmId": "3165CB5BCEDFBE43B2E0670B4DBD8A52" + }, + "fixedInfoPartyU": { + "partyId": "B60802C40C378366EA18A141A35FB8FF", + "ephemeralData": "B068537E4DF3383B78B24FB34C7BB39EDAE856D54A18C6D388FE73B8923D" + }, + "fixedInfoPartyV": { + "partyId": "94435628DD8B30001BA50A185C6ED46D" + } + }, + { + "tcId": 225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6C9BE91BD9063CACD0225A512EA57D8", + "z": "9AC9BA8EC148DED62B541386286DE87064AA52710C4954B1FDA5C00BF233", + "l": 1024, + "algorithmId": "922612EF30918C84E7575A1E598E4B04" + }, + "fixedInfoPartyU": { + "partyId": "B0B398C996A5DBEC6507FCFCEAC3C656" + }, + "fixedInfoPartyV": { + "partyId": "8AF76EE3782C1C0752B537694FA8F366" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 10, + "testType": "AFT", + "tests": [ + { + "tcId": 226, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A57551CEB61528C25FD45CB0B6B44BA", + "z": "E82E3C2BC8C41A862E60872B0196A04C50CDF918F92B6FAF510BF15B69", + "l": 1024, + "algorithmId": "282BBBCF4699F26BB1464A80C951C509" + }, + "fixedInfoPartyU": { + "partyId": "4CB31140D50BD720CA74DC5E9A16955B" + }, + "fixedInfoPartyV": { + "partyId": "417225432D41E30BF7CDF0E9CBB13FD4" + } + }, + { + "tcId": 227, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA146E28C95262A476B92C92B15CE9E0", + "z": "C4E42288C300159729AD8DD75359BC145E1F26BA6A8D59341570124E70", + "l": 1024, + "algorithmId": "7C6760A9C726A752C3EC1646C6FE7D2D" + }, + "fixedInfoPartyU": { + "partyId": "06D847CF90AB66F74E5A575B92E39A22" + }, + "fixedInfoPartyV": { + "partyId": "75128DAC1139D9A166E15075F8A58F18", + "ephemeralData": "3D217EBA2C014AADCB3E937029FA3C4F5A1DE1715C0A62BD028C421F47" + } + }, + { + "tcId": 228, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6251B18363F68F8F507C206CE3194506", + "z": "949DAE48F40CFDCD1B4214537242CA8E7291821E70CED2DE59C91F6F3C", + "l": 1024, + "algorithmId": "C01E06D024DE94501C858A2D3E99712D" + }, + "fixedInfoPartyU": { + "partyId": "9D4D724A72276754E761E87B429F9921", + "ephemeralData": "CFECEB1D5B69A6F64EE3854E3A353010D512716F470F9D30F1B3C501DE" + }, + "fixedInfoPartyV": { + "partyId": "EF793433026930E0D7AC69086EB05AD1" + } + }, + { + "tcId": 229, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3162BAF502A1C63557A656910284763", + "z": "A08AC0B17A489BF300951384BE964CD48C75176DCDDE102B5329C920F7", + "l": 1024, + "algorithmId": "9B80C43F92CFB6BB1BAECAA62307F4AD" + }, + "fixedInfoPartyU": { + "partyId": "4DFC434A37374856FA1F9A0B9F8F6C5E", + "ephemeralData": "5DDB3C679B2D3981D588006F3D856BA1AE818403C281172A9194CF8EC8" + }, + "fixedInfoPartyV": { + "partyId": "9A97491E7842CC0CBA31E974FA9EAFB6", + "ephemeralData": "0FBDA231CA3AB83A86E5530C233BEE2AF8A2544730C5FCD40CB1CCA6A7" + } + }, + { + "tcId": 230, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F49A2BCD2A2D1FDB91021DA7DE11D8A", + "z": "EBF4E4D5C9D0CC89CD0049C83F364E5B1F6E1DDF8ED5CB3EB93FD85418", + "l": 1024, + "algorithmId": "C984AD87A8029E1CB2DA8EC6E28EDAF2" + }, + "fixedInfoPartyU": { + "partyId": "04FAEE0C524C0F44D4338FF2547AF508", + "ephemeralData": "ADFDB8FA611BCC2C1AA3EA86E9D65AE47608878F414958F4936C82A299" + }, + "fixedInfoPartyV": { + "partyId": "ABFFB00B2101747F72423B27CCD29AC0" + } + }, + { + "tcId": 231, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1C7185B5B83C79AF2C98DF69CA399AF", + "z": "E211D753A539140177F9C77A5158AFBA3152DECAB074550F07016FF2EF", + "l": 1024, + "algorithmId": "900805A474F4E24FD3E766D971456EC6" + }, + "fixedInfoPartyU": { + "partyId": "AE2BEB2F44A0890696B284231B37778C", + "ephemeralData": "B427F04AC1FD360E36A65324914338B35C36DDEE5ACE50E1092B17DFC0" + }, + "fixedInfoPartyV": { + "partyId": "D595C84CE69582B7FAF7922D8AE91547", + "ephemeralData": "C0BDA2DA4940202EACF4D8121929F0BE6A1AA8B24007D8C69E0168D5AA" + } + }, + { + "tcId": 232, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C7D10BA049DE40CC326B57A4C027231", + "z": "720C69B3D0F6AA499F90CAF0A5C9C6034D3414D065B78C99B68AB539C5", + "l": 1024, + "algorithmId": "92B47ADA0080E946C51A0FF17677F7AB" + }, + "fixedInfoPartyU": { + "partyId": "A0AAE74AE597DC2AC4A13A236C350A15" + }, + "fixedInfoPartyV": { + "partyId": "802F03B9BE8F7CBDEC46C95ED31E0875", + "ephemeralData": "0611BE657FEF40B69EEE613DDE55FF6254AB32147B0425C82AC7DEC550" + } + }, + { + "tcId": 233, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77D8651C1D41AC8737745D0CD266E002", + "z": "21077DF3B286FA1BA580DDF0F2FECAF673C26ADCDD44B8DAC2589BE15B", + "l": 1024, + "algorithmId": "5C30D40A4359F1EF359962B4052A26E3" + }, + "fixedInfoPartyU": { + "partyId": "F22FF422282799D83929E8E21989187B", + "ephemeralData": "57B6571AC5A10E90A8E1C46123B05DCFA614E73FD258882B2A42E191C4" + }, + "fixedInfoPartyV": { + "partyId": "41A810C101ED51DE26EC2E0194CB2683" + } + }, + { + "tcId": 234, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D3ADE90414D55FE24F748B4449F773D5", + "z": "0E0372DB5FC9868CE20668061A863DEED4452AE4F1F02BB064A0D7D83A", + "l": 1024, + "algorithmId": "7EEFE0FC88968D4D5121E363542AD354" + }, + "fixedInfoPartyU": { + "partyId": "6160570648251A4E09234DC3E0634D0C" + }, + "fixedInfoPartyV": { + "partyId": "273E89410E52AEF0A680FEF94F22F37B" + } + }, + { + "tcId": 235, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BD172179D94A4080A067AC592DC62F8", + "z": "C19842BDA96202CD2096A8F7F9C5D89F31557A27DB747D6F5C87331179", + "l": 1024, + "algorithmId": "6766C17FD1AA67EBE5D8563C4BC8AFDD" + }, + "fixedInfoPartyU": { + "partyId": "FF9DB767E5890ADF8D6D582F9579CE3B", + "ephemeralData": "B11EED1A386A4702BF0059A0B2E52C9FDED00FAB5A3BCA1FA4CECC69D8" + }, + "fixedInfoPartyV": { + "partyId": "5EACD45AAFAE97F3CBD8E4F8626415B8" + } + }, + { + "tcId": 236, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23A695419B6875B71FD08EB8C33A19DB", + "z": "9CCCE258C77BD64A4698006B94C8DE7A4C4E3EB4B8343ABB0E57DBD3EE", + "l": 1024, + "algorithmId": "1753A775F9ED83CCC6B0054199779809" + }, + "fixedInfoPartyU": { + "partyId": "4F040B06DF2009FBCBA10ACADD378515" + }, + "fixedInfoPartyV": { + "partyId": "6ED9B69060FDA4DD0D95D507A0973CD2", + "ephemeralData": "6AA466ECCFA2AF0DFC35A586452CD23F40B9E06298FD3C6F8271072FA3" + } + }, + { + "tcId": 237, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D425C6A0B6077344151F3EF494DE27C4", + "z": "F998F7F01180E33D1DE7BA330D0C192D91967675E98E0EAA3D09187C8A", + "l": 1024, + "algorithmId": "5B58EAD3A55D03689A47000B3C0530BE" + }, + "fixedInfoPartyU": { + "partyId": "C77FAA50181A1D4FD1561B88DEA2FA91", + "ephemeralData": "CF9F16BE3AC21209B8D47B579476B24DF798994DB73E0C6CA8FB591783" + }, + "fixedInfoPartyV": { + "partyId": "BDCED19F958DE9FD3EE06C87B86492CC", + "ephemeralData": "3EED6E9637D1E16FE034BAEA6E6C56EAC096047AD1F30352BBA167CF57" + } + }, + { + "tcId": 238, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C0F3FFB31EA89346FC275144B25629E9", + "z": "16989C9479F6D98B9B5BA3D3E2CDB479D50BB15C68DAD7583A4B8C195A", + "l": 1024, + "algorithmId": "806C4DC43CE7362D40FABF2BE291A147" + }, + "fixedInfoPartyU": { + "partyId": "9FE84A7C52914621C1ABE226432D8DDC" + }, + "fixedInfoPartyV": { + "partyId": "3FBCA5D1963FCF25975BDF3BDBDFCC26", + "ephemeralData": "2B6B1201ABD1AEA03BB9CF6D5D56F1401F09128DC10B0897AFC783CF8B" + } + }, + { + "tcId": 239, + "kdfParameter": { + "kdfType": "oneStep", + "t": "598C9BE5E5E1121397950454A5F926E7", + "z": "4FCFC40D3048174DED8D2199A5F5C57216ABB6F132A924FFA6FA7DAE88", + "l": 1024, + "algorithmId": "5E986B247B1BEC2FB02030E2D8A5C54C" + }, + "fixedInfoPartyU": { + "partyId": "4E62725001E8B79EEE75F3C16094CB3B", + "ephemeralData": "8B39E10607507F544B2126F659543B99CA35963A6CFF794C3FEC4CA181" + }, + "fixedInfoPartyV": { + "partyId": "DEB855601A7EFB6283238B46F9B4DB9D" + } + }, + { + "tcId": 240, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F011D9ABB31C4454856CC9C7354B8A0", + "z": "D81E65B6734D0741537875BF877589415FCA1CAB9651E1DF3C3C67AB11", + "l": 1024, + "algorithmId": "2C0A9EC2F09AE111766909E2ABFFC919" + }, + "fixedInfoPartyU": { + "partyId": "AFF1DD03D6C0F0CE3617DE6AE0F3DCAE", + "ephemeralData": "A2B4CFB93F7262F5EA28CEE778C37A86C819A4D0DC88A8DA33BB3A04E9" + }, + "fixedInfoPartyV": { + "partyId": "730D8E574B017A1DE360CDE79D16634F", + "ephemeralData": "DCCC6D5ADF19B9E17C8D6D8CE6F30B7A7CC8A1F3A18722F58B13466A05" + } + }, + { + "tcId": 241, + "kdfParameter": { + "kdfType": "oneStep", + "t": "740D4681ABE001AD6A4AEEB731C965C3", + "z": "CBB0A4E1705D398299842BA3DD1A30758020D72D9E5E13A6C079DA244F", + "l": 1024, + "algorithmId": "84C8605E30E20FA59564ACB2514BBB4C" + }, + "fixedInfoPartyU": { + "partyId": "1789936A511DC34E8539E06D015F13B9" + }, + "fixedInfoPartyV": { + "partyId": "6302DE087CEACDDB891BDECEC6D138E9", + "ephemeralData": "094E1292784435EA05DE6BF84545B0EE2E320DDF8E94F694121E7719E5" + } + }, + { + "tcId": 242, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1B0FE52D4E999F043A1A88419D49D17", + "z": "D56D0DA5989B13F2B575CC470037ECF8CF5D467832EFC6A48D28C8E13D", + "l": 1024, + "algorithmId": "1A08FB60824FC07D9837BF06FDE83A43" + }, + "fixedInfoPartyU": { + "partyId": "610CE6E5D7728CDF337F458E107F4563" + }, + "fixedInfoPartyV": { + "partyId": "5897E78F2CCD4B0B3A310BD3B2ADF773" + } + }, + { + "tcId": 243, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA5FB50AD89B9FF7975DF9F329CECCF5", + "z": "19D8DE667C374CF2B4C71287B1D34110AC9B7C9BDA216F62182264063B", + "l": 1024, + "algorithmId": "79F5653D7804A5BB9DEBB577D5FEDA31" + }, + "fixedInfoPartyU": { + "partyId": "7D574EAC5C9361D300363D1945059312" + }, + "fixedInfoPartyV": { + "partyId": "9683B1A52CB9493697A28227C85DE6EA", + "ephemeralData": "D47DF3E3AE6310EB517BF77CB9BAF4A3076B7F26DDD20AD393557607C8" + } + }, + { + "tcId": 244, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EBEA5DB40DD099178F72FB4F096E01F", + "z": "4F7809B2A589A53480675AFD2A112E14446B07C0E16AA8AF34AEF7A6B6", + "l": 1024, + "algorithmId": "D7D1183849432D1428C32D829B2A9DB9" + }, + "fixedInfoPartyU": { + "partyId": "28F40F2B3770A222209293046E6E4C82", + "ephemeralData": "2FEA5A08F09B8040FC98735E1A30A682096D0081BE574BDE15CCDB7D33" + }, + "fixedInfoPartyV": { + "partyId": "91114517236D6D839D8B7E1961B12555" + } + }, + { + "tcId": 245, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDBE43AE1DB36802FE44B73E087E10EB", + "z": "A269055A6C183E1CFF855418D94A86484F4DBB6863B17B098CF90780E0", + "l": 1024, + "algorithmId": "513CCA7C478C1256422D56D20858B1CF" + }, + "fixedInfoPartyU": { + "partyId": "FCD5A5CC94E2C443C2FB67AE54139410", + "ephemeralData": "F0715396888BE1A0F8A8D4520E1103318DEF41C3DE39EE954368E1BAAE" + }, + "fixedInfoPartyV": { + "partyId": "B9A3D01B24FECC3A884BAB741B687732", + "ephemeralData": "83D586D489B88618D3D84CAB487D42ADE055D90EFE540153BD82DE93B5" + } + }, + { + "tcId": 246, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D617E8A49FBE87D3010564B0263D29DB", + "z": "9431BFB36CEB685915A52C8C680D2DB525D3B6E9EA95259386F28FDC36", + "l": 1024, + "algorithmId": "C593EF42FC02D933FEFB52B893B5724F" + }, + "fixedInfoPartyU": { + "partyId": "AEC63CA704473EA06066C52BC14A595B", + "ephemeralData": "A1E44DC7ADC7EFF9116B908E01F3D4D286A374DCC071BB1737B0591EDC" + }, + "fixedInfoPartyV": { + "partyId": "F1E86B508F4224E3D7A1D73B3DA11D6E" + } + }, + { + "tcId": 247, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33E5BF6664E19E1E5A736B78F949CC4A", + "z": "76B7042E06C4C971129C37E459ABABBC79D6FCC61BE48AC4201FD0451F", + "l": 1024, + "algorithmId": "535434C8DE5A10B1FD1D575622897A30" + }, + "fixedInfoPartyU": { + "partyId": "6FB1DE65418633356483BF272AF197B8", + "ephemeralData": "5BB1B0244728FC51AB0A2F626DD3C0F2180B7BAD214888820A35F262E1" + }, + "fixedInfoPartyV": { + "partyId": "081106E26914AD41C4A24D68551793AC" + } + }, + { + "tcId": 248, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39CD40DEC072356A2A6D59B85AAA8E56", + "z": "27D9A21E5898A31D588CDBC7549066649613CB623B64FEBA9C59C9DB7C", + "l": 1024, + "algorithmId": "EA9B0C8A936F7AF8B7929A0E0D49C6F1" + }, + "fixedInfoPartyU": { + "partyId": "8D561F468F9C4D4143AF1635ADB7D9D2" + }, + "fixedInfoPartyV": { + "partyId": "25187E0131375EE14065176BE2CE0694" + } + }, + { + "tcId": 249, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43E9CCEDCDB808FFE29365E52C2CFC00", + "z": "F615C3149E91F4CE8F2628EF418B1D9BAB8DD4B6A8C09F1DC8E411E309", + "l": 1024, + "algorithmId": "63DDF2702C0B434D0FA0AE1DC3F632F7" + }, + "fixedInfoPartyU": { + "partyId": "912E836C5CE29BF8E08C22C75A8121D2" + }, + "fixedInfoPartyV": { + "partyId": "8959B3457FEF3BB3C3A3FE8C2CEA6337" + } + }, + { + "tcId": 250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C248C79B545BD08D8CD635B55907B062", + "z": "19A24F3901CF12E1D0549B126112D402DD5C463C2EE20E673682397D8C", + "l": 1024, + "algorithmId": "DE8A449FA3183E8AF6767473DCC6D704" + }, + "fixedInfoPartyU": { + "partyId": "EF792A24A2FAA8080B221755F5C35B22", + "ephemeralData": "B2A06A5907B2EB886682E10CC96B18FC806A6AAAF2F32B88F348FB8AAE" + }, + "fixedInfoPartyV": { + "partyId": "B86C630297D32FD0A7C48A87DF99B7AB" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 11, + "testType": "AFT", + "tests": [ + { + "tcId": 251, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F8D032EC6C590BFE201AE018BD6F4F6", + "z": "21B6901F6496F3EE713BA73C15A9ADF993EC4B6C4F1814A600211DA565E7A1BD3C0F", + "l": 1024, + "algorithmId": "B7FED69B45C043934D2B5B83AE533C55" + }, + "fixedInfoPartyU": { + "partyId": "79236FC9ED07016AB84E90D05D185E36", + "ephemeralData": "8B1CCF7EA74D9F3AAAF05E68C28F320E19F75E16E0BC87B27775651600F9F5E00A9B" + }, + "fixedInfoPartyV": { + "partyId": "8FF120AE319C195AF7025D3C2BD58683" + } + }, + { + "tcId": 252, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4CDA548525C835AEF75CCD1602172551", + "z": "E6B0017072676D24798AB76A422B496CCA354D739A1E830F773392349A7FE2498820", + "l": 1024, + "algorithmId": "221C7C9059328A55F69730A3D270E785" + }, + "fixedInfoPartyU": { + "partyId": "7BC114D8D8BD9FCE84F0B6A33A330739" + }, + "fixedInfoPartyV": { + "partyId": "D30E06C12AC7760658911EDD2190E7BB" + } + }, + { + "tcId": 253, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A9199EE61CE2FA7C41CBE169A21A4F3", + "z": "823683B856AE76E5908449A922B90F4FBB938DDD2EAEBC5CB04E12A4ACB8188074B4", + "l": 1024, + "algorithmId": "A981AC8B22CDC81CA6B87DA68D55A108" + }, + "fixedInfoPartyU": { + "partyId": "415279166062664C0FFF47F0682B166D" + }, + "fixedInfoPartyV": { + "partyId": "85D8F7F7642EC6279337CA9291814932", + "ephemeralData": "EADA896E55AAD180C9D5F44BDBF1B53A85886D246C7A24E743D5AA1007CA2A62C6C0" + } + }, + { + "tcId": 254, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB09AA09794A781FCCBCBE32F4FC1724", + "z": "3BDD808F06099235676395D5D367081A9F00AA614D31BB5F710588C5128DF794266C", + "l": 1024, + "algorithmId": "9A9BCB9AB906E72A987F540A55332054" + }, + "fixedInfoPartyU": { + "partyId": "9F16D19A015FC1EF7351110DA436744D" + }, + "fixedInfoPartyV": { + "partyId": "DEDFE2FE7E33DD2593FE509864018F69" + } + }, + { + "tcId": 255, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A86677C4176244D998B10037EC565A20", + "z": "AA794B58E5652DB7059BDAE2B854F1F3264090621626AC7670B0E2A5449EF84A24CA", + "l": 1024, + "algorithmId": "4CBABE94DD52E0C21DFDC872919E4DDB" + }, + "fixedInfoPartyU": { + "partyId": "D2E1C3720589C63B73B4DCAEC2746F12", + "ephemeralData": "0E934BF49396511B7CE13C16787D1CF3047B322B17CA7D788C985C6F41125375839D" + }, + "fixedInfoPartyV": { + "partyId": "D25EAE70F53C4F1566042DFF5704C7BA" + } + }, + { + "tcId": 256, + "kdfParameter": { + "kdfType": "oneStep", + "t": "87EBD259F207023F31D0AC9307341C30", + "z": "CBD85933A091700466B9B395AC3C3EFD50E4D4B81496D58E90B63008096B1809013F", + "l": 1024, + "algorithmId": "4883A1AF5E53C42B8C93987344988A5F" + }, + "fixedInfoPartyU": { + "partyId": "32492B9AFB1E0350031326DD6A98AD1E" + }, + "fixedInfoPartyV": { + "partyId": "FC345D159F9804045E556C934BADD408", + "ephemeralData": "CFFEE9A63A647A22D80B43418B7F2B842A915F26D9CCBE95915B382BD673793C0AF5" + } + }, + { + "tcId": 257, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A88236B6FC15FE95BF5A32B5CDA5E862", + "z": "2C7FB02E7E09FE2AB9B309543DC013C31554E9B998416418DE94E1DF62EE21FFFCE0", + "l": 1024, + "algorithmId": "D74AEEB2F7D401E6E57A1EFCC0780E3C" + }, + "fixedInfoPartyU": { + "partyId": "2C44FC7DF61AD739C308FFE929EEB617" + }, + "fixedInfoPartyV": { + "partyId": "E568AF16D8E137356DF6A7A3E76E72A1", + "ephemeralData": "6711B12822EB27C7B3BBF80E7344113D8DD5DDBA2D3BBCEF7C03FC0BC42C2AFA0381" + } + }, + { + "tcId": 258, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00A210E8252A525CE764D42866037B80", + "z": "8617625F8AE0DA833DE2D2D094142945194611845B1300B590F7D329AC12912BC751", + "l": 1024, + "algorithmId": "64810990E487BA7348B00A2DE02446A6" + }, + "fixedInfoPartyU": { + "partyId": "18CE01D3631F976E3052D352EFDEC993", + "ephemeralData": "AAC70C81697FB23925E4D771C75633BBC78DE852316DF34E29D5AF58F6BDEC78CBCF" + }, + "fixedInfoPartyV": { + "partyId": "7ACD66013C03AA7C4085D2D59A9F9790" + } + }, + { + "tcId": 259, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DA5C68441B06EE69402B987C6285AF9", + "z": "245A391F8EAF56F55F977DE801AD76BEC3D74F84B718F9BA71CB647AB8CF93F8A86C", + "l": 1024, + "algorithmId": "3B1A9F38F6410000A3CF60C5DCF39937" + }, + "fixedInfoPartyU": { + "partyId": "60EA2F7B09FE16FAC3E0406B86A68F8A", + "ephemeralData": "244F6CC6E38E7FD207E9967D5750A9F52CF49E81523DB423C270FC7BBF6A702F08C1" + }, + "fixedInfoPartyV": { + "partyId": "6A7CC3BC0EBC7EFA892BCF20B42A305D", + "ephemeralData": "5C24020F4ADBD9FF5DC77D250C407350F51965B7FC8D6EFBED6386988B6919B7F502" + } + }, + { + "tcId": 260, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA5EF12494544B133F2C6AF362C59A98", + "z": "9341440067EF44E83491405E88B0B8CE489A3ABED94DD56C71EBAD25EC5782D890A2", + "l": 1024, + "algorithmId": "3DF3292F563E9F3624FB4490FC74BEAB" + }, + "fixedInfoPartyU": { + "partyId": "1A8D39F157FE82771774ACE670519FB4", + "ephemeralData": "6DD5B7AF433942DC11984422622AE81E25B993277083BEE10322F1973119FAA523DC" + }, + "fixedInfoPartyV": { + "partyId": "C4D611F35992A9C47EBA6D9B999B2123", + "ephemeralData": "0B756CCA1D3EB2799EAB2EB18920F8064D15E82A53DEB85455076261007ACF316E14" + } + }, + { + "tcId": 261, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65745B7E97FFB3CFCCE2BC601F57E1C6", + "z": "6AD34B0D5E7F7585DC32AA66B625782E46E938590670E2587ADF5202B0E774B1FCF0", + "l": 1024, + "algorithmId": "577FB6A991CF47A78BF57F2854A81466" + }, + "fixedInfoPartyU": { + "partyId": "C759C95BFF64E63F04DE15700A04ADA0", + "ephemeralData": "B0B71BBB8032458076209918D6DF33AC65050F0C6C81D38D2B0B4207953A3FFC2D37" + }, + "fixedInfoPartyV": { + "partyId": "F05779BE3151E965C7FC17662AD71DD5", + "ephemeralData": "2A42EE07B8EF482F71173694FFDB38EE96D01B71708A0FC114C31F621461CE93AD63" + } + }, + { + "tcId": 262, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72BFD5EC5F3E2FABF7580610613582B0", + "z": "F4E47BB022D67CB28801EE5937B7B029295F5C82108BB2D09C34CC78C10FDF8C0763", + "l": 1024, + "algorithmId": "F0FBBD31D267A3519D8214AC5D805AF4" + }, + "fixedInfoPartyU": { + "partyId": "E1AD9A6CA635742C690AEFE01B302A6E" + }, + "fixedInfoPartyV": { + "partyId": "CE55EB12F6FB0F86DE9EAD2BBB0EABC3" + } + }, + { + "tcId": 263, + "kdfParameter": { + "kdfType": "oneStep", + "t": "231216156377F6E7177A5873EDF9C9F2", + "z": "AA4B22E3E44B8CB72BC79AA88CE95B709C9E6E07C2FE78FD7E9FD6585DAF986C135F", + "l": 1024, + "algorithmId": "4399A64465CD5E38F947C2829E4241F2" + }, + "fixedInfoPartyU": { + "partyId": "08EF2418025BF44E23719493003A3006" + }, + "fixedInfoPartyV": { + "partyId": "2CDA9BBB8ACCA683D1D26BD339B7A678" + } + }, + { + "tcId": 264, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33B79B02ACEC045635F36D3F39F5AED3", + "z": "4C916E87B1FD65957746EAA79505646AF63F21A0ED6141384ACFBD25655B693E492A", + "l": 1024, + "algorithmId": "4C37CAB2F98048098A5EEA69ECAC3A58" + }, + "fixedInfoPartyU": { + "partyId": "CA6469D3B235F56937886EF1CD8B68CE", + "ephemeralData": "4432002CA393B5B22CCEDCFC057196371E15AFC9C21EC0C0CFE42353A2942D52300B" + }, + "fixedInfoPartyV": { + "partyId": "036B324B77C79E0CAA38C63A1E3F3D7B" + } + }, + { + "tcId": 265, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB8B99E55F5AD3EB762446C49D53B188", + "z": "477DC3FBB294C3922E74D1ABF56EBA8437E096A10B2B7F9D41ABB6C817C484AB49B5", + "l": 1024, + "algorithmId": "B310F085E3F3085DE111EE967EA59817" + }, + "fixedInfoPartyU": { + "partyId": "C431E04AA4A882F29CE971EE8C453C2E" + }, + "fixedInfoPartyV": { + "partyId": "02D946F8220485950FD99EBF3DD014AD" + } + }, + { + "tcId": 266, + "kdfParameter": { + "kdfType": "oneStep", + "t": "951250C9ED838549009BC73375D7CA34", + "z": "8622E3F4B5D32116614C1198CE9B84A3AD9767D8CE9EFBBC446B5F2261FD9E7C01AB", + "l": 1024, + "algorithmId": "50801B69C41C3533BDA357A75F61E8D9" + }, + "fixedInfoPartyU": { + "partyId": "1CAD7B629F0AEF0A78A8D352E29F6818" + }, + "fixedInfoPartyV": { + "partyId": "D8D950B58B004B9C516A68DCFA8EAC1C" + } + }, + { + "tcId": 267, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FD61C88941D36C069AD2720314265CA", + "z": "D28F64E8814D12291335D3DA71FA93A14B980274FEF65A39B203F546AEE1A30849C8", + "l": 1024, + "algorithmId": "0D1869531A72668071166B48EA7DE3FB" + }, + "fixedInfoPartyU": { + "partyId": "1BC1C27252EE6D2E4D1F1C2B74610951", + "ephemeralData": "86325167A1E2E46D42AC74851F24A06AAC23CBD5CA81A73384CD6E346E57A5437A3D" + }, + "fixedInfoPartyV": { + "partyId": "8719A3ACA5EB975D062C9BFA2D4BE9AB", + "ephemeralData": "515BCBC9960688EDC11D74CFB2F67FEB1EFB75E21D2C8B500114F9CFF51DD77A5616" + } + }, + { + "tcId": 268, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEF6E2AC853A23780BE44314E341CA30", + "z": "FAB6365A228CAEC66EAD718A6EC90A7BD2EA42A6564B162DD057D020D1F979BD722C", + "l": 1024, + "algorithmId": "85B9DA52E9D9AD1906A7C6D23F7A92B5" + }, + "fixedInfoPartyU": { + "partyId": "F77C21BFCE16438B70A95F8B401CDFBC", + "ephemeralData": "869531A5AEDF5B46E359601C46A925C69A515FF6763544720A8BCB4BE8BD14EB67DA" + }, + "fixedInfoPartyV": { + "partyId": "6E1FCD562C37540075D1F7FFE5CACF80" + } + }, + { + "tcId": 269, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A6EA7520E846FD2F3580AE01DB59B1C", + "z": "053C14AF40BB23BBE0335B78201AAF9E4DC5A18A4153986F082085874D5EF1B410BF", + "l": 1024, + "algorithmId": "102BC7EC254FAABC014F3F938DD48B66" + }, + "fixedInfoPartyU": { + "partyId": "E2E590A0BF9BD8FC3014CEB23A13DB65", + "ephemeralData": "F7D93E2A4073C0A023EA9BD09B8B8EAEDB4D5B5A59DFC963927DBD58989E2FBE0804" + }, + "fixedInfoPartyV": { + "partyId": "63407E1D66B03B347CBB43C6D67D0CAA" + } + }, + { + "tcId": 270, + "kdfParameter": { + "kdfType": "oneStep", + "t": "244E25BEFBE722FFFBAAA4B1C8A7F673", + "z": "DC389A775493EE3A5BEE7D91D4124F2E8188D7BC94952D9FE4238BE37F7439B343A0", + "l": 1024, + "algorithmId": "A66CE441C30086BF36507B1039569822" + }, + "fixedInfoPartyU": { + "partyId": "0F656A657C04CDA41C13F3323230FD23", + "ephemeralData": "E08388CFF57179C430F63C3A4E55A6BF71B9F4056CCEF7F544194B35B2CB11FEF73D" + }, + "fixedInfoPartyV": { + "partyId": "88FE60D5241DAE19E7FB4B57CA39A23A" + } + }, + { + "tcId": 271, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52244963CED76569C7F13838AF640DFB", + "z": "0675BA3BA20C9D358119C97C1A3960BE1555799CF6B260869C492E1AA9562E5260B6", + "l": 1024, + "algorithmId": "8C794EB4645999039F70E3039F490B01" + }, + "fixedInfoPartyU": { + "partyId": "5EC9731590B29B6535F351364AFC54AD" + }, + "fixedInfoPartyV": { + "partyId": "EBCB60A7227D74D41488E39B18C48A4E", + "ephemeralData": "69A4E63ABD1376DD6136747111EEB12FED29ADD3C16C8917E0B5046D6DDF0A7C4748" + } + }, + { + "tcId": 272, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B346F353353436C5D008A0CAA711F210", + "z": "959CDF9092B5F9AAC234FA8BC96EF7E1BA509F432B3B2671A67D48D7E36AD4E283AE", + "l": 1024, + "algorithmId": "F1CB538D9348E2D3E3C8E9306F923C9A" + }, + "fixedInfoPartyU": { + "partyId": "94F29994E12E2429C81B2C87F77109E5" + }, + "fixedInfoPartyV": { + "partyId": "8A9116EB92DD38A79FE8F8E5454E1199" + } + }, + { + "tcId": 273, + "kdfParameter": { + "kdfType": "oneStep", + "t": "536C333390012D4A1433A9CD8245D43C", + "z": "0E51FDAB3AB4245D7B8B2F678A9DA8090360AE9377C1405F2FE0C39C6589DC9EB7F8", + "l": 1024, + "algorithmId": "0A3823947A62BD31DFCAB651A890BED9" + }, + "fixedInfoPartyU": { + "partyId": "5399D353F24A9EA28237D6815C85DC82", + "ephemeralData": "0A618A892899E5C8E81A7032820329B6F4B3EF6183A50E78080D506E506DB6C32A2F" + }, + "fixedInfoPartyV": { + "partyId": "02E91BFC73BFCE730C168C14578DD37C" + } + }, + { + "tcId": 274, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A10C5A6730F572086933F301EE3CBCC", + "z": "F1F9FACB6F6B8AA68E363F9DAD9A73B3E9925C0BB526AF3C3160655F9D43D5487EF8", + "l": 1024, + "algorithmId": "58D475D5741C0ABF72E37AE1C714C97E" + }, + "fixedInfoPartyU": { + "partyId": "B34B6A60E302FEBE7D6B2E14FF2C577C", + "ephemeralData": "8EB73F3C2D523C9EEF1D0784D5932FB43934B64265F0FAD4F6B59F08E14B8F9D11BC" + }, + "fixedInfoPartyV": { + "partyId": "2DC098CD8397385F5F247531615CE90F" + } + }, + { + "tcId": 275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CE49A7F635E5EFD4AF99F9A3292F057", + "z": "62037F5E4203852D744D5FC3CEC4B49E9536F28B4A0D206C2FBC283AC5B360907AA5", + "l": 1024, + "algorithmId": "4D2F37ECF8CEE71ADEA561E42BBF47FF" + }, + "fixedInfoPartyU": { + "partyId": "6BD3B23DD9336B766AB6919ACEA77252" + }, + "fixedInfoPartyV": { + "partyId": "1DECD07924B4973E1330B6D7A730FCE9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 12, + "testType": "AFT", + "tests": [ + { + "tcId": 276, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52615D3FE2FDF0A4002C1264DAB58428", + "z": "BD5BBCF5664222DF04C26487A2AEBD3918E01E6D89B53C86C5C4D968EC334F", + "l": 1024, + "algorithmId": "591FA82EF6360E9AFC3DB9E50B434EF1" + }, + "fixedInfoPartyU": { + "partyId": "E1BE88AE9E2EBF637FB7BCFBA6E3AD3C" + }, + "fixedInfoPartyV": { + "partyId": "E0CAD05E97460C2F8DEDD9BB9024C3D7" + } + }, + { + "tcId": 277, + "kdfParameter": { + "kdfType": "oneStep", + "t": "579618007A08BF15C31B767313B4F15E", + "z": "246E7F95F930CF921DD945437A05BD97AAFC3404D3C5D37168728D9C146EFB", + "l": 1024, + "algorithmId": "75A968EE2F9C3CF325E888540EF3EB09" + }, + "fixedInfoPartyU": { + "partyId": "8E16A2AE404288ECE70D537F3444A6DB" + }, + "fixedInfoPartyV": { + "partyId": "65F1D3785DCC81512112529EFBBD7115" + } + }, + { + "tcId": 278, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C3B727B47BB2E0BCB632BDA4C44DDF", + "z": "976624AF47E48EB70318DD8D69F240412AE38A69666AD51D07F2076D56471A", + "l": 1024, + "algorithmId": "4EE0EC82114EA9B3BF1BA06228A145EA" + }, + "fixedInfoPartyU": { + "partyId": "324DCC53CFA645ED4672963AF62AE5FB", + "ephemeralData": "EAB04937487CABCEABEFED5F836AD26FF958AB23DE9E440246364E35733A88" + }, + "fixedInfoPartyV": { + "partyId": "412393F7F6F3E3AFAD62F2EA2649B241" + } + }, + { + "tcId": 279, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DD3C67BF8AF776AB290F6359FE74FEE", + "z": "DB8C1F850B695214C156D2B3021AE496FA8321A6D85B3D9D16C2F3A174BAD6", + "l": 1024, + "algorithmId": "BC8CEA20230456445784CFFC761CE30B" + }, + "fixedInfoPartyU": { + "partyId": "91E91ED96249392CC9EA75654D86827D", + "ephemeralData": "F6E7F48879D650F92094369A235A7FB07D90B7894E5FF97FAB20C46013197D" + }, + "fixedInfoPartyV": { + "partyId": "74409C156CCEDB62B97B79060823D869" + } + }, + { + "tcId": 280, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5B917FE66786F8CD200F76BC581E25E", + "z": "DEF776A707B4359861E68CD762EFBE3B6E18C5AF1CC04B37552B60ED0B57F1", + "l": 1024, + "algorithmId": "B50123213FDAA165DC5DEF1794863590" + }, + "fixedInfoPartyU": { + "partyId": "0C50DBAB7A4A8C32551418C94E35E74E", + "ephemeralData": "BDB66C424B309AA922A4CA8FC8CEE154C0AE24ABB773F60A18E2B40FA83D01" + }, + "fixedInfoPartyV": { + "partyId": "0EA95CA4D3431C0499CF4E38A593A7E4", + "ephemeralData": "4D7ED08673C334110587089003D2B63F9ED6978474FE1A5DA97C880DC92589" + } + }, + { + "tcId": 281, + "kdfParameter": { + "kdfType": "oneStep", + "t": "711224A98DEA5EA31E01BD76B18D7FC5", + "z": "CE47C3C0812BB15EA70CC9D29277F375B0BD0F5F3CD2774DD6E2FC2546EA0B", + "l": 1024, + "algorithmId": "31F2F0BEBE7E2A7077D4AE1F2549B31B" + }, + "fixedInfoPartyU": { + "partyId": "0FA281A33A3FA8E334CCAAD3B30C174B" + }, + "fixedInfoPartyV": { + "partyId": "30891560D174E843FEA84091329A75AD" + } + }, + { + "tcId": 282, + "kdfParameter": { + "kdfType": "oneStep", + "t": "039A30DE0020475B0B4C789FA0E7BB12", + "z": "4010D286D49ED3E2A038F0DD958AACEF5D4C285A4A250A906AEA3FA622EB6C", + "l": 1024, + "algorithmId": "FBF7FDA08E2813801F11F3CD30A91F5A" + }, + "fixedInfoPartyU": { + "partyId": "E3F22D7A95565027BC51DBB52124784F", + "ephemeralData": "B526A2998D6DCD5B14A82A03E1FBE4FABDE416A1D33F4B3413BC9B545430E9" + }, + "fixedInfoPartyV": { + "partyId": "111B7D9B69ED11BCB4ECBCA29CC4BBE1", + "ephemeralData": "DE793E3CF22547F83D1B4851E5F28A2491792E2D86F81B41E4DF1032959B98" + } + }, + { + "tcId": 283, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC5DBC1F8C51B98F5FA9C9F9FB735F9E", + "z": "F9BA78ECE7BCCD96212DDD278F794E8D67AB31EC6E07E0E1EFF2DE29D77621", + "l": 1024, + "algorithmId": "E0F9F8F1AB5CAF251947CAA6761B775F" + }, + "fixedInfoPartyU": { + "partyId": "2DBD5BF21B9170AC01CF217A89605268" + }, + "fixedInfoPartyV": { + "partyId": "2568020B225C4155F31E352DA53EC351", + "ephemeralData": "6DA0DF73DF2595411C3B547CB49B028E103A2F124CB6E3787F6CED21D19A05" + } + }, + { + "tcId": 284, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D58672DDC4E5A438F967A8C47944121", + "z": "B450B665560252D44E1A09E3CC4C552A58969E006390E5FEC5AFA473C8E7FA", + "l": 1024, + "algorithmId": "7300D8D7BB812539E12D05BF9991E94E" + }, + "fixedInfoPartyU": { + "partyId": "F09517FC61967B72CF8C10EFC004CCD1", + "ephemeralData": "BD52B872675A7CC91A68D59A3491DB94475F59A120F499E074759AE1862401" + }, + "fixedInfoPartyV": { + "partyId": "182D6B1C56E08F5637D2C99263A811BD", + "ephemeralData": "5DFE12F40ADD5908CAB5FBB09063364627010E3F64BD0A98D755618520CD4E" + } + }, + { + "tcId": 285, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2EB79B5D6CB4D1D2D4210F610ECA1FD", + "z": "5440AAB1ED621E6A9424AF147E49F2FD04E0C61BE3E74180081AD25C51E0EA", + "l": 1024, + "algorithmId": "3C962972F701B80F0A1776FE0B8F617B" + }, + "fixedInfoPartyU": { + "partyId": "66272D0FCE6C98E3693AD8910C5ECC95", + "ephemeralData": "3D8555437C9BDFB82473D3674E4D9200D6572C6F3EE64BC6F2D7FB6BE4CE48" + }, + "fixedInfoPartyV": { + "partyId": "B7FAFCF245466CF59AE85CDC69B0FCF6", + "ephemeralData": "BB322D8DFB59B3AAA4FAED7B7347A9C670AE5B608B2CAAD469FED9E07CCD95" + } + }, + { + "tcId": 286, + "kdfParameter": { + "kdfType": "oneStep", + "t": "179490B09C257EBF5A280FD58D5476AC", + "z": "E1C540AEF68949EAE51FC1C493626872F22E14D1B11712F85AC712AB83F03C", + "l": 1024, + "algorithmId": "CFA79FF867139C349261652DB5E372F9" + }, + "fixedInfoPartyU": { + "partyId": "45575EBD7B5C1CE5BCFB1C072AFB08A4" + }, + "fixedInfoPartyV": { + "partyId": "4DB7ABD08962990B1C56CFFC4E34B28B" + } + }, + { + "tcId": 287, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F026763D0FD571C70ABBBFA1AE7D7BA5", + "z": "673D17F67F8F28EF788B197AC564E04DF07E8130CF259A0D7604A964647309", + "l": 1024, + "algorithmId": "6EADD5189FCA1779A44DEC68469AE4AF" + }, + "fixedInfoPartyU": { + "partyId": "898BEF7B136F05A1C54971A496DAF102" + }, + "fixedInfoPartyV": { + "partyId": "5CF67F84193B74FA7DD6ABB1D82F8781" + } + }, + { + "tcId": 288, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6236B315C2340CC92AD02C11127B8BD", + "z": "ECFC18A0EEFAF65F7665D9468335B6B56FF8CE0FF59B1BFEDBA40E9BEB8302", + "l": 1024, + "algorithmId": "26B2FAF43EE10B9B1E593BE0BA8CA461" + }, + "fixedInfoPartyU": { + "partyId": "C39E0C26F528DC1917160E713C3AE830" + }, + "fixedInfoPartyV": { + "partyId": "1FE63BB614A58C0C9DCDDCE7FCA66ED0" + } + }, + { + "tcId": 289, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BB32A3941D73DC26C9360C79F174C7A", + "z": "901D4B3E3778630602ABEF86FC1FF4EDC6174DECD519D77A3489D5D33A6A64", + "l": 1024, + "algorithmId": "C32C5D80A3EB8F72CA5E237CF9E5F766" + }, + "fixedInfoPartyU": { + "partyId": "1FA78AADC79D18F1ED5922163E60DB48", + "ephemeralData": "7B54E4526E0B319BCAAFD8ED108D88BA2EF5515D6F3467B89C2C2D1A4CEA77" + }, + "fixedInfoPartyV": { + "partyId": "9F90EAEDAE86C3AE1A76D061C68C58BC" + } + }, + { + "tcId": 290, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE555DB045F29195B052676E3DDBBA40", + "z": "8FED7445C377B779BB57BA74F4C796F223EB643FB799FBAD274B0322EEFAB0", + "l": 1024, + "algorithmId": "7FEA5005D8EDE0AA3F3267D658280AE1" + }, + "fixedInfoPartyU": { + "partyId": "4C12AFD5422D93F47CC7620B272E8A4D", + "ephemeralData": "CAE6158CE1004ACF9017C435B46A090D39E2888B6A743F5904E168E9AE006D" + }, + "fixedInfoPartyV": { + "partyId": "6CF05DEDCCCE29A9E4A63F73D7192BA5", + "ephemeralData": "71A24BF50B0B8662CEC50A6E60C5AA58437800689EDF7056E5165D44CB34F4" + } + }, + { + "tcId": 291, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E2D368E23DFFFC2A1ECF9473FBFDD60C", + "z": "C8D8F154550CD73BD21B9BD0530EC3D01F78A7A2B8CCADC54AB95F1A85819E", + "l": 1024, + "algorithmId": "97E62586F27D6DC7AA16F050802AA6D0" + }, + "fixedInfoPartyU": { + "partyId": "762CDBA74E388C5237CCA004549B995E", + "ephemeralData": "5F2BCD624401D7F72F1B230C095903D4D4F664534249AF82470314D37A2FDC" + }, + "fixedInfoPartyV": { + "partyId": "EEE4895755D153954AF55EC177A395AA", + "ephemeralData": "6DD8C552B9730F0E75127EC0BD97EA83B5E4BE12FC82FFC18D692281A37964" + } + }, + { + "tcId": 292, + "kdfParameter": { + "kdfType": "oneStep", + "t": "309F54EDA788B69034003B8B9436D75F", + "z": "353448A424936F7A8C44A27856D38CB09DA462BF18D7B2DBC1A1533DC549C6", + "l": 1024, + "algorithmId": "B7749AFEAD07A9C422DCD05AB5C86FB5" + }, + "fixedInfoPartyU": { + "partyId": "D24022B4E25B16BD6336D5B5E7D7096F", + "ephemeralData": "57D8624761987056DBE7BD8BB5A9A17D931C7CC0CD4ABC828D26FE191AD719" + }, + "fixedInfoPartyV": { + "partyId": "41A3688AF86449E3711B19718B38C12E", + "ephemeralData": "ED50EF5842D2378564229143FE9EF3E42046C565A9C4FC312E468B791264C7" + } + }, + { + "tcId": 293, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B24286385124E1824FFC4030028D30F4", + "z": "54164C57173102345493E7A46329B2CBFCB81ADC38FA930834A853D3F037ED", + "l": 1024, + "algorithmId": "1F541B10E45642C88C6770399980FF75" + }, + "fixedInfoPartyU": { + "partyId": "341F08356E85FB4BCC812BD8F6A4FF42", + "ephemeralData": "2C1E2462A9175C31A023C176DDF6A67DBBDD9121D0BBE359CB9E230E9E58E5" + }, + "fixedInfoPartyV": { + "partyId": "BAAAB16FF59CD9611E4577F4724DFCE2" + } + }, + { + "tcId": 294, + "kdfParameter": { + "kdfType": "oneStep", + "t": "60AA1DFA12D9B803971066ABA26E1F79", + "z": "E3AE2AFA8D1BB764BCA0FA93E70112086CBAD2AC6CBDC594FCABEF1517A54E", + "l": 1024, + "algorithmId": "C3CE8F1CF275BC34DDC003B291B3C8CA" + }, + "fixedInfoPartyU": { + "partyId": "C463F9EEDDD922CED4B97876A4141217" + }, + "fixedInfoPartyV": { + "partyId": "176A021DD35EB3E8AD661635F8FFD04C", + "ephemeralData": "20B0015BC58EF7AEFCE1EAAE59AD4456536ACEC32170192D5990F516BE9A55" + } + }, + { + "tcId": 295, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A1B1DC015229617212E9CD2FC504B2B9", + "z": "C68008348B1223A0F3DA8B38349AB178F0F88E1F41FEBA26267D2FD7E34B6B", + "l": 1024, + "algorithmId": "13D44ABE22E8B11FC7D23296FD250C6E" + }, + "fixedInfoPartyU": { + "partyId": "84CA8B300BDE8B3BE4FD6672B647FF42", + "ephemeralData": "14C3CFADACF9B6B4127D41471FFE38391DF1F21CB44358911579A766A0B171" + }, + "fixedInfoPartyV": { + "partyId": "48C748231A2531869A5FDF57C3118E58" + } + }, + { + "tcId": 296, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23EE936CF59F5D77FACA528376B3A42A", + "z": "E120269E6484CAD5691C541A96A38BFC3910E4884FD7A21E5ECD3ADD595A46", + "l": 1024, + "algorithmId": "BB8180CA52C212E24D16C6FBDC7F9428" + }, + "fixedInfoPartyU": { + "partyId": "164203ABD395455D80A327700B9E234E", + "ephemeralData": "D1BE48BFD53922E7D4C904456400F681F8C068B61384F02ACED3FDC96AA323" + }, + "fixedInfoPartyV": { + "partyId": "F4CA90A37FE1D0505118B5827BFD6D87", + "ephemeralData": "56314A227414AFDDCB75456B498BB232E10EFEC3A683CE5962D1DD02B5519C" + } + }, + { + "tcId": 297, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18263B8C7B2CB2263CD2AB460F94F8FA", + "z": "232D231FDE6082CB286308F8E00B714A28DD79F0C0DB1AB816337139B1309D", + "l": 1024, + "algorithmId": "39F8D51F97B947F0B0A950D2049C5577" + }, + "fixedInfoPartyU": { + "partyId": "C2E2EB6AF4DCE1C6C8BE24EFF9A021B4", + "ephemeralData": "E0BD6E2C161943B22638E3D8CF0BB7EC95F75510B7E50839102E5B800AE28A" + }, + "fixedInfoPartyV": { + "partyId": "71B7073EE6C090F259A3234194949DA0" + } + }, + { + "tcId": 298, + "kdfParameter": { + "kdfType": "oneStep", + "t": "345F5BE8C815176DD4D2DEEAAD4C960C", + "z": "2745C471D70CB1FA11E60F3CF12E955E6F31A3E062C8FE5E6AA8A7712EDFDF", + "l": 1024, + "algorithmId": "F9F7B049FA7E4058100DD98845E084D9" + }, + "fixedInfoPartyU": { + "partyId": "31F27C22AEEE2C645286816A1A4AE1FC" + }, + "fixedInfoPartyV": { + "partyId": "B99AF9D09BBF33CDF8242269BA33B7A7" + } + }, + { + "tcId": 299, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A197B70E52A5B5D81AEFFBE154EFE824", + "z": "D2D29DE0324787FDBFA66E5F07828F9DCC9F0C60D341453AD10D8DF11D071A", + "l": 1024, + "algorithmId": "5FD76902B511A213E12543960B6277F8" + }, + "fixedInfoPartyU": { + "partyId": "0E8F289F0FB51716D1E54CFA9A6F0A5C" + }, + "fixedInfoPartyV": { + "partyId": "729CF0DB456A1F48743338B08CC308E8" + } + }, + { + "tcId": 300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E24A0B8CD8189D45D4B38F0D2D4AA50", + "z": "69D9B9665F56083A5731A3F8A4FA132187FBB5317B330929728CFB091BACEA", + "l": 1024, + "algorithmId": "F8BA86FFC5F01EF122A73BF034B45472" + }, + "fixedInfoPartyU": { + "partyId": "A81ABCBCC8AA37C3FDB16A52DB72F951", + "ephemeralData": "7D9B69F8C0E0FD62B7341F423729CA30700C2CA401E154B8DA2CFBBEBA5F01" + }, + "fixedInfoPartyV": { + "partyId": "9658AF89FD2398CD55AB1F596486AEED", + "ephemeralData": "B22E37FCAA69D41F1116A7A6F61364B94EE16B1BC158A8CCB965E292F2983A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 13, + "testType": "AFT", + "tests": [ + { + "tcId": 301, + "kdfParameter": { + "kdfType": "oneStep", + "t": "916D4726D5C36CBC2784059158B28CE8", + "z": "E91E7870076FFC3302C8B1A182B13B5EAE95EF548197A85A13582CFA5B", + "l": 1024, + "algorithmId": "9359169AC2885F92B224AC8A35978B74" + }, + "fixedInfoPartyU": { + "partyId": "153CD61AE38E7F01E99F67F6F14B8C4F" + }, + "fixedInfoPartyV": { + "partyId": "89E1A351BCFD278EA496855211305E79" + } + }, + { + "tcId": 302, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3C7523E686A914ABB163F8DD2B8F76C3", + "z": "781606B453BDC84E6640E4CB692ABFC656921BCC9F925A0CA780010879", + "l": 1024, + "algorithmId": "4BA4E5F5C06A848C3326222BB265B6B6" + }, + "fixedInfoPartyU": { + "partyId": "DD108CFC1CB6A424E4ED472D0F684D9F", + "ephemeralData": "242E274545D27F2883B27FFF194406F32D433F2BD5343F1A1D7F54E55A" + }, + "fixedInfoPartyV": { + "partyId": "AE1C57DA293282F9C1215982E0B8C169", + "ephemeralData": "894C7D2082E499AB6287696C1010F3D8398265324E2A918CE3D7B0B1F6" + } + }, + { + "tcId": 303, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6236BA6E68E52F9F12BD850705C1A52C", + "z": "E2970EFA07DE04F1E5CF499D8242E1C26131272A80907285779BE477ED", + "l": 1024, + "algorithmId": "15D3F72C1DF194848ED9C7C7AD0CC463" + }, + "fixedInfoPartyU": { + "partyId": "5EDD843032A79D3812B52F8E5DC92071" + }, + "fixedInfoPartyV": { + "partyId": "DA777D930672FB7D6770D0E5A24EDCB1" + } + }, + { + "tcId": 304, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C87FC3698FAF4D16DCA59098899CF345", + "z": "8E1C08A6E0459769D0D762FE87106047D92568D0BE1129D6FD5B9113C2", + "l": 1024, + "algorithmId": "EE01E152BB2804D322B73D691F8386D5" + }, + "fixedInfoPartyU": { + "partyId": "27C8CA8ACA6EF1A5503FF85F850FB827" + }, + "fixedInfoPartyV": { + "partyId": "0CCD567B4B7C59F7A8606B089EECCF03", + "ephemeralData": "04C39F67DDAF4D1FEF3039A25F1ECE9E450CF40CE1C0204E799F581797" + } + }, + { + "tcId": 305, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1952CAC46793C89693149CF0B5321043", + "z": "953DD283041803EA3F50201FA19FFA2D7C279E36F3B9B4B56127A99219", + "l": 1024, + "algorithmId": "D9E8F248E9048CF27E522906681619B4" + }, + "fixedInfoPartyU": { + "partyId": "FEB9C1785C8E78C149B6D0EA3A27B9EB", + "ephemeralData": "F392A7E056445C91EC767C082476E3DD22918F2EDA01AAA4C5F4CD6917" + }, + "fixedInfoPartyV": { + "partyId": "27A110387D1525A16F686B171A4928C6" + } + }, + { + "tcId": 306, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D3CC86CF002DD42045C7E3F702EBFFE", + "z": "876B7B87139863CA1A399DE918CB36D8FB0DCC9B4722B49182E2BEF314", + "l": 1024, + "algorithmId": "3B31F082607529A5FD518A49BE8B6F17" + }, + "fixedInfoPartyU": { + "partyId": "B2A3280C0A6CB94E328E4C48ECDD9160" + }, + "fixedInfoPartyV": { + "partyId": "4915FACF258F4912032A82D836A76A08" + } + }, + { + "tcId": 307, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FBAC34BD6D12CEF1967C20F962F2173", + "z": "A5D3F08699ACCE7ECAB9B67BF7A69E8C24B0E3F52058985B0543BAA9A2", + "l": 1024, + "algorithmId": "5815BE9A046F30FDDD527600E09F016E" + }, + "fixedInfoPartyU": { + "partyId": "DE1A76D6881853D203F16160763A917B", + "ephemeralData": "309E2725A3AD2AC439A963A4B3C56A7EA90EDA2444000CD0DE2A8E63F4" + }, + "fixedInfoPartyV": { + "partyId": "163C1B762DC19D7A458D92E1CDB307F3", + "ephemeralData": "7CA1063980DCECC841271C50CF6EA9B887E0382F7E35B7D222C3AED528" + } + }, + { + "tcId": 308, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A7FE056145DF8C75E70E4F6708C47DA", + "z": "D60D33D6BC67C792DEEB71E906FBCC199AD6D1BFC9087548FED2E0E590", + "l": 1024, + "algorithmId": "8DC0A340909DF0685F753406FB342D4B" + }, + "fixedInfoPartyU": { + "partyId": "1236A683D1918FEEC25AFF5270880860" + }, + "fixedInfoPartyV": { + "partyId": "68142715791DFD6C936F6D0E622CADC3", + "ephemeralData": "493C02E6DD189B5274E18612225491EC5A19DF5918387119476549B668" + } + }, + { + "tcId": 309, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E1443AD1678BD805E15BF3399314615", + "z": "F3258DCA79D6EC2A85508087826E2E48F22A4F7D4ACCA50E6166B17D1B", + "l": 1024, + "algorithmId": "D6447F807E9F524AE8806CE20E288F95" + }, + "fixedInfoPartyU": { + "partyId": "6FB64E65A00674DECE0363313D063A69" + }, + "fixedInfoPartyV": { + "partyId": "808197ECDB91F1E8C4C326940A8E386B", + "ephemeralData": "F3717249784214D5E996545F8E6636DB20AF7912A4A02BE5C1ED4942E1" + } + }, + { + "tcId": 310, + "kdfParameter": { + "kdfType": "oneStep", + "t": "55D4203AD1A8A5FE137D1406FC5EB610", + "z": "2813954F2D450B664D3948561C5BDA4AEDA33CBB9B9AA34C32F329CB32", + "l": 1024, + "algorithmId": "7DFA084FB35F865D15B5D0B99463AB59" + }, + "fixedInfoPartyU": { + "partyId": "D74B60C312C34A07DE84810AB13CDAE3" + }, + "fixedInfoPartyV": { + "partyId": "90B6E2C5E4C0CC079BD7E4B54CCAB326" + } + }, + { + "tcId": 311, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2B71514A68CF3303AD83DCA50BE8691", + "z": "37914CACA37B30943D28A8A220B4F9A7C4C482BA9A332AB15433880150", + "l": 1024, + "algorithmId": "10920A96973B76783D5FC3857CE67BB9" + }, + "fixedInfoPartyU": { + "partyId": "BA0FB68A5CE0BC5F81944689BF6229B8", + "ephemeralData": "CBC8E6C03365613A042091E1FC9865A8900CD1BC748E6D7186D7FA8876" + }, + "fixedInfoPartyV": { + "partyId": "C3891430F4B7325F97C3368FC021DDB3" + } + }, + { + "tcId": 312, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FFBF9D1B69DE5602D0FC9CB9B77B69F4", + "z": "0A068738370D3985DBD529607E4D9CFAD5181CDBA2611BE85A309B1197", + "l": 1024, + "algorithmId": "0C831FDF57633B323964E85D8A0934AA" + }, + "fixedInfoPartyU": { + "partyId": "80DD14194D0CB15384CDBF647B951EFA" + }, + "fixedInfoPartyV": { + "partyId": "156022F88DD81224EA74BAEA90BA08FB", + "ephemeralData": "F6F4AD409020640F794B7F3D538D5B70C1871DAF2BC9CE3B709C87BCA8" + } + }, + { + "tcId": 313, + "kdfParameter": { + "kdfType": "oneStep", + "t": "968FC52EA51594F3260194C0D9AA8647", + "z": "72B2672B79B082921D0CCAA8BC078E89F3DA1A1C14449B639A0C60A248", + "l": 1024, + "algorithmId": "4EB52FFA0EB6B380D14F87465B527A45" + }, + "fixedInfoPartyU": { + "partyId": "7AA4C466EBE4B3A8CF57C62024BBA2AA" + }, + "fixedInfoPartyV": { + "partyId": "E8FB6F93AF20B57982FA86E80D056933" + } + }, + { + "tcId": 314, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93A021C3FFEC9AE29BDD67519C3F1FF0", + "z": "A2EA5FE798F3F8DED973DB652804B246A8D11AA67D2B18B31338F3BEAB", + "l": 1024, + "algorithmId": "6500EC1D42691BA01D8E8E854182765A" + }, + "fixedInfoPartyU": { + "partyId": "4CAA1F14063C52C7F85F96D67B7F5A8F" + }, + "fixedInfoPartyV": { + "partyId": "2E542CA000C5CCBA2D465DD6E8E89BF2" + } + }, + { + "tcId": 315, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A78B1E990BADFF6582231CD62678F71A", + "z": "CAB1624CB7C6BD19ABA2C4CCDDAB361BB013F4EB23240FB45CC50A3BCB", + "l": 1024, + "algorithmId": "7BB868B5B1A25826FA8578B1C8CFDAE2" + }, + "fixedInfoPartyU": { + "partyId": "27EB0354E8651EF25E7AE5FACC086179", + "ephemeralData": "BA5EADEA4DBC36B646EB8AA9595D52100D437EB2FCE859CD2E02C84AD2" + }, + "fixedInfoPartyV": { + "partyId": "FB33FEE4AE934BC8E9187AA79ED21657" + } + }, + { + "tcId": 316, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4E8D08129747076ADD56B863E45D827", + "z": "9EFAABA76B46506AC648BA2841CC7B2E4205C98C6FB06546601FB53027", + "l": 1024, + "algorithmId": "12948ECE51B44FDF5928126A225541B1" + }, + "fixedInfoPartyU": { + "partyId": "A2F9CF9472E0B274D99E29CF660FD7FE" + }, + "fixedInfoPartyV": { + "partyId": "6B9BB8B46EDFBD1DA01559E8A7F5486B" + } + }, + { + "tcId": 317, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6D596FE12FDC8EC9C4350EFAF599E94", + "z": "CBCBB6419FA7A16E6FFE72DE0251B2FFE5BB654BB5ECC2A0935A167CAF", + "l": 1024, + "algorithmId": "21361B8532B57286C4CBC994A2DDE3F8" + }, + "fixedInfoPartyU": { + "partyId": "EAA3FA6CDCF48DDB040882FF9CEFC5B8", + "ephemeralData": "227D51274CAA7CE61E7686FC20F6E952BB6FDA4147D6242010AB16ECB6" + }, + "fixedInfoPartyV": { + "partyId": "2D40B8C6CAA5A81FB5C98A17BCFD7302", + "ephemeralData": "ABE153004120C8A3B2DDCE44B3A6CFE85F6B70D069741CFE4CE50A3B20" + } + }, + { + "tcId": 318, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA012EA41A8E11F5D63E69642A9C0393", + "z": "9D09E1A1F4069E987780968C99B470A28B4FF6BE496633A4249C7DB162", + "l": 1024, + "algorithmId": "BF74339DAE52728CF5542C1BD7773370" + }, + "fixedInfoPartyU": { + "partyId": "73A6E035CFEE9AD8B5EB4B77705E513A" + }, + "fixedInfoPartyV": { + "partyId": "2AC382A77713CA6381981781D9A0524A", + "ephemeralData": "3ED88013EFC539B9C3688E570592F7B741B0A7F1C0FF845714DE976D0E" + } + }, + { + "tcId": 319, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3B4698CA50CEA779AAE4A48CD82A3CE", + "z": "747268A7370AFFCC22518EA669ACB4F5E016A1987EC3752D5B9DCC7769", + "l": 1024, + "algorithmId": "C58AFD32242DDE95618E815DDF41E555" + }, + "fixedInfoPartyU": { + "partyId": "A8B04FBF2DA16AED31BABA892A2CD5E8", + "ephemeralData": "23EC3B7C7BFA3A57EC75C3954E03C4B465C1779D8063DBE63B5F3682B9" + }, + "fixedInfoPartyV": { + "partyId": "431D08C750EEAD153CE6ED9F624F7D63" + } + }, + { + "tcId": 320, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE05C207425C064EC7098899BBA38966", + "z": "E7FEA02E461DF85D41E0F4B0FE1055F159098B1D5CCFCAE99467B7FB55", + "l": 1024, + "algorithmId": "31606F06FD50A76A69494405EFF64FA5" + }, + "fixedInfoPartyU": { + "partyId": "FC7B5FD3BE7D9CF9B70AA861A2A86206", + "ephemeralData": "22771305584B48F767E3BB55E8CC4865219A03F7AC25CE56434BB15D6D" + }, + "fixedInfoPartyV": { + "partyId": "07B1B47DD90BC29C4D42C046207CFE6D", + "ephemeralData": "09AF924C7F05A4DA7A86F83F0256433EF36614769719C009EBF23437D7" + } + }, + { + "tcId": 321, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2DB1A394A4DE19258C9527B521950C71", + "z": "D166F3257E01EE1E0E98322A9ADAB12DA10E7F4BFD6AD56654FD44362B", + "l": 1024, + "algorithmId": "02D1379EFB4FF895AC12B08018B21428" + }, + "fixedInfoPartyU": { + "partyId": "A76A232B360AAED4F267CF2246F1186D" + }, + "fixedInfoPartyV": { + "partyId": "6E732E7E43480C1E1970690A0368F7EA" + } + }, + { + "tcId": 322, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B491DE49C7B5FBA42C08B105F585FEE4", + "z": "6C7030D89396804A14ED90688FA2A1FB8E960A604E8C473C6FBA6F387B", + "l": 1024, + "algorithmId": "CA2369B75D3221A3FAF6226CD4059C48" + }, + "fixedInfoPartyU": { + "partyId": "A7A5A6F8B6A85B69FA7EE27E90C4B02F" + }, + "fixedInfoPartyV": { + "partyId": "D70B9626D8B8319FA34EE137125AA89D" + } + }, + { + "tcId": 323, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA8A702D095BECD5BA8824530BD2E39D", + "z": "86CE58973A1DD711477AA0262CD1A7ECA615047C5EFDEDF5FD8A2BA038", + "l": 1024, + "algorithmId": "48AE3D4DA52035367836E2BA2E52C342" + }, + "fixedInfoPartyU": { + "partyId": "20D6ADD4F5A74A2411AC6D75AAC64A2D", + "ephemeralData": "85F8DB08C0FB7F306A3E3131771F9C664F0DC927620FCF07DD8A44E914" + }, + "fixedInfoPartyV": { + "partyId": "E346129BF64350FC896F83C7FD016473" + } + }, + { + "tcId": 324, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A2604E55AB94483A07E2716095C131B", + "z": "01E370F5419B79D39B567780903F02423181AE13552F6B54737C76FAA5", + "l": 1024, + "algorithmId": "45BFCC71FEEB95AF6901BA28F395C0C2" + }, + "fixedInfoPartyU": { + "partyId": "7802B42DA8C6D142557758B16FAB84A6" + }, + "fixedInfoPartyV": { + "partyId": "87E47E3ADA80D29FD08C64C97942406E", + "ephemeralData": "7AF785129F1E1FDD87A130864523761F6DAEB1AF4EEA8AEA8012038FAE" + } + }, + { + "tcId": 325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B52C20D0CD7BC4D5A3F62CABAB35B718", + "z": "628E98E6BD0F8D683F0DE441F6B7BF1674F666569D5F7053079FE22FA6", + "l": 1024, + "algorithmId": "A4DE1EF74297AC65D93DDE536D89B33C" + }, + "fixedInfoPartyU": { + "partyId": "C6540DD647C49C3F3CC79BE27F44096F", + "ephemeralData": "C61FA5B67BF77A9177224D2DFDE1BB21E1D2A23D751F3B8ED7C405BE2F" + }, + "fixedInfoPartyV": { + "partyId": "255E6C60087A989E89D9B7BD49385B69", + "ephemeralData": "19D3955E58E269238969E20C591CE921490E449D88A407DFD865097B5E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 14, + "testType": "AFT", + "tests": [ + { + "tcId": 326, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C7C498F696161430A88F34BA65AF252", + "z": "FAEDF1ADFB2E418849B7304E0BC49C37C460E7D04B21BA8B2FCF153CE3", + "l": 1024, + "algorithmId": "CB50CA8B74A11E25DBB75C4F35B88421" + }, + "fixedInfoPartyU": { + "partyId": "0B7B5B3938C69B81B44F9104A1DB4C4E", + "ephemeralData": "7F69B3890F4DA6BFBF0B83FC26CC9A82D3E7FB5B53C418405E9DC40C45" + }, + "fixedInfoPartyV": { + "partyId": "5435B1DCC30BF05D29E468D322C52C10" + } + }, + { + "tcId": 327, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06DC2ACBAFB9CE57AA4FD0C680674BC8", + "z": "0307EBEEC2AB4ED739B1088CAA0D9460F3D5A2D3B781499105FA18598B", + "l": 1024, + "algorithmId": "F92EFA78AE796C1CA541BDD54299117B" + }, + "fixedInfoPartyU": { + "partyId": "2EF3C8E60237F434E21F227390F2DA91", + "ephemeralData": "AFD197762B753E7F44AFF9267D42A516386D0AB4CC2A213F04AC39F6B6" + }, + "fixedInfoPartyV": { + "partyId": "146DA765D09A8C57CDF537487C5B0E53" + } + }, + { + "tcId": 328, + "kdfParameter": { + "kdfType": "oneStep", + "t": "628BFF58E458D3B70A6E590C1F2A4F86", + "z": "705D96540BD993A8D7E1B4879ABDF6A089D92ED193DCCBC41ED1DEF08B", + "l": 1024, + "algorithmId": "153EC24004C3FCCB0278C8304D5F7932" + }, + "fixedInfoPartyU": { + "partyId": "2B3B8C4E83C2F76CE450796070CCA993", + "ephemeralData": "5EF28F2DD9A62728686228FF6B6E2DC9C6055CE28AA94BD1499ADD1680" + }, + "fixedInfoPartyV": { + "partyId": "F496D6C680D749D58080D375AD581C89", + "ephemeralData": "E151B695EEADF6505703C6014B58421BC136EE582CC9138CE214942DA6" + } + }, + { + "tcId": 329, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CDC52BC78B27CF5DCA13A5D69263ACF", + "z": "794A156966790876A4C1C288347F65B40FC10D13023C9A6254508E89E5", + "l": 1024, + "algorithmId": "E7A2F8AE53E24BDBC0BA2CC60A4508B3" + }, + "fixedInfoPartyU": { + "partyId": "2C4967EAA06C935269246D656F880441", + "ephemeralData": "2155F5E1154046AA52840FC0C24F4DEBE914816FD81A903344321641CC" + }, + "fixedInfoPartyV": { + "partyId": "A3FE8D54F8D0FC4633D49C874CBF0EB9", + "ephemeralData": "8C3EC37B1B784E62C8C2601EF93A3E621DD6FA218DA839A628501FA869" + } + }, + { + "tcId": 330, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1CC31A1410CAA6272880292578E51A5", + "z": "098126151B3BB3A51B261C3891B6E25EAA9FDE6C27FD569BA45E76A13B", + "l": 1024, + "algorithmId": "A91565A5DB0FC9AB6090162B8988A43E" + }, + "fixedInfoPartyU": { + "partyId": "23262F91FB0A04B7EF049F5DFC7ABE4F", + "ephemeralData": "2A1233D9C7DEBF4CA263ADD7F3D5748E423AED9595A61469B056C803C8" + }, + "fixedInfoPartyV": { + "partyId": "1609C75666549FB3B8234D32188D768A" + } + }, + { + "tcId": 331, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9ADC858B3D19F90BA431FBF70D5D2C0A", + "z": "EA68B94D455AF7FBD356384FFBE8E0A69C0279B6572AABBE25580406BB", + "l": 1024, + "algorithmId": "FF171D27FC4155CDB30E0462C5F17656" + }, + "fixedInfoPartyU": { + "partyId": "8241B632814BDABE192040A6794728D1", + "ephemeralData": "D5EC753DCFBF66F689318E85404305D713AA0FC0C6854D3B4131196507" + }, + "fixedInfoPartyV": { + "partyId": "1180DFF3FAEC8FB94E544615D7B645A1" + } + }, + { + "tcId": 332, + "kdfParameter": { + "kdfType": "oneStep", + "t": "21574AF71E082E3EA28B65A5254D5A9C", + "z": "257CAE12A3302A7EEF02D073C760AD64A7108F60D2FB78C0FD41256A1A", + "l": 1024, + "algorithmId": "11E3BFFC20B850F90BF72EABEDB42F95" + }, + "fixedInfoPartyU": { + "partyId": "D6455251E2DB14A29A910596F8AE14D8" + }, + "fixedInfoPartyV": { + "partyId": "FB12EA9DF43F9B32557A8357A881DAFA" + } + }, + { + "tcId": 333, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0BD6F3BD8983FC6A54FE4F26C7D58A2D", + "z": "669B33285D718CF001FB916F78A3A1279037CA3AC076C3A49EFAC6FC01", + "l": 1024, + "algorithmId": "CF4881DE79EEDF9B8249EA979D7D5BC0" + }, + "fixedInfoPartyU": { + "partyId": "85EB065FC688304EBAE177E208A7C5C0" + }, + "fixedInfoPartyV": { + "partyId": "2771769D556F1109DB624D10E05B43C4" + } + }, + { + "tcId": 334, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CBB17351E42A5029DDFFF08E3EB8027", + "z": "A2B1A68C87B0EEB0B21A662C465350DD32FCC8C0616715852D68EAE294", + "l": 1024, + "algorithmId": "DC77B19C08BB92D96634E556A82967B0" + }, + "fixedInfoPartyU": { + "partyId": "374781836BA1AF0FC7B9731FD7C13116" + }, + "fixedInfoPartyV": { + "partyId": "63DFA0E039F3E4E9A0B108D7EF54246A" + } + }, + { + "tcId": 335, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B973ED63061546B12B6F843FC8DB32B", + "z": "5613252B3554E907E2E01F1B4B0CEC8FEB1DF5E494C313F2E1BCE0EE6B", + "l": 1024, + "algorithmId": "0C096B1D2BC3E28CE8C1B867913EEB4D" + }, + "fixedInfoPartyU": { + "partyId": "035E67CA9F392A4D8A2EC0384A4D1290" + }, + "fixedInfoPartyV": { + "partyId": "00CCB5868B0563A8B71EBAE55467DB26" + } + }, + { + "tcId": 336, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB7B515EAB83608E005D63B6524B2BED", + "z": "3A276AFEC21D19FC54F684EEAE01BBA2B6E3B3409C09DBDFA7673A6B0B", + "l": 1024, + "algorithmId": "8C31D1E6D302C2A60C9BBE88F9FF2080" + }, + "fixedInfoPartyU": { + "partyId": "B076B5424F0EE5C9977BC7564654AEF0", + "ephemeralData": "A67608E46A40DA609D5E92ACCEB374A8A41D520F5785CD70FD82A5EC4A" + }, + "fixedInfoPartyV": { + "partyId": "29B8FFC1873DF2B8827EB4486CA34611", + "ephemeralData": "D654BA1530F6F35BB0AEC945DE566719176511E9DC51E409749C993C25" + } + }, + { + "tcId": 337, + "kdfParameter": { + "kdfType": "oneStep", + "t": "60E7DF76C62A9AC8B0DCBD83AA7F3F60", + "z": "BA94541ACB88EF6E57D21AFA22DDE2010CDAC8D10C87D61CE3B6403BA7", + "l": 1024, + "algorithmId": "6F99EEF7621FC4C6F88CE42E1CCAA745" + }, + "fixedInfoPartyU": { + "partyId": "F4B19DF869448CE3ADBBBABEDCE682C5" + }, + "fixedInfoPartyV": { + "partyId": "42C8C8EBB84C380915C47BA34CB7C6A3" + } + }, + { + "tcId": 338, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88F1633A1E9F35F8084DFCE8C6A05C90", + "z": "B04AF89CC475B8015D0804E2A98006893B0F4175FD117709091C0DFB02", + "l": 1024, + "algorithmId": "B6AECE4BB812B526D4E74F80F0A51171" + }, + "fixedInfoPartyU": { + "partyId": "BA72C98FE586AC92C14FB689C4C399C8", + "ephemeralData": "237E3516BFB6D3B24B7EDB34602C116C589743002BE85E57751E2F6FCD" + }, + "fixedInfoPartyV": { + "partyId": "0CB55EDC644153921B89CF86BA4537CE", + "ephemeralData": "199AE0CE11879DD1DCFDC85CC4E0225E5F789B1BF23C96952EB8753F3A" + } + }, + { + "tcId": 339, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF5ACEC87FDA90343704F3C08142E971", + "z": "2161B7583EBB17CC946C24168852EA20672C680924B37A9DC2999D764D", + "l": 1024, + "algorithmId": "31B686182A52974082FDFCF1EC9042AF" + }, + "fixedInfoPartyU": { + "partyId": "8AB65D8E6ED46F1DE8A1DC623D71BA7E" + }, + "fixedInfoPartyV": { + "partyId": "19E5695AE15F805BEEAAB1F687A514CF" + } + }, + { + "tcId": 340, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D67D5ED95400FCEB27E78BD41821656", + "z": "19D98692E325B26E0F09A27579BEFBF565C113B7842BDBA15D97F90CBF", + "l": 1024, + "algorithmId": "F5564BF76B171B26919959E95445629E" + }, + "fixedInfoPartyU": { + "partyId": "6405BD563BB597BE52EAACD9B450A304" + }, + "fixedInfoPartyV": { + "partyId": "011BCAB3D35A502E5D32771B8213D84C" + } + }, + { + "tcId": 341, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7F1E3FC268B9106492C63479654267B", + "z": "B039D0DF665483F71DEDB045C6B04E630D576A2BD4F5247999BD97BD59", + "l": 1024, + "algorithmId": "733B8A30BECC3C8EA4633BCAD62893B8" + }, + "fixedInfoPartyU": { + "partyId": "F91BC15E0101DA7DF27265254AABA73C" + }, + "fixedInfoPartyV": { + "partyId": "EBA9B9574339628A0432B760DA43A33C", + "ephemeralData": "AF39039B4679F0DCD5F62CA3915A6835BEEBAF6A49BDDBFDE70CBE8398" + } + }, + { + "tcId": 342, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6143CC47DC23634CF6D704B0E78231FA", + "z": "1F612FBBA66F514D67CA9F428988BF4FEAEF3082E61B30C52481F8DDBC", + "l": 1024, + "algorithmId": "B861CF82E992A837B62443C47CB17E73" + }, + "fixedInfoPartyU": { + "partyId": "D32D0067013494E0D6A52D30646A6E48" + }, + "fixedInfoPartyV": { + "partyId": "CF9668DA898B6FFA792D05529BA3FD0B", + "ephemeralData": "4D1ABE36EB3C69F584BE32B0BD9B234C00C96AADA9B11A22BA8AC6139E" + } + }, + { + "tcId": 343, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05FE46FD4FA3F3054F58A3D8EED4E0E5", + "z": "128C19BD168535E9FBEF41CFB6BDFB02412FE4201CB96A663AAE41493F", + "l": 1024, + "algorithmId": "D2395B03E0C31189B4D1B57F1F0D6E29" + }, + "fixedInfoPartyU": { + "partyId": "BFB8D11A757E988B1ABAA1BD1343B682", + "ephemeralData": "7AC2372AA34161831CA1699AA7DE4D7C97BB14550A0F042D99E5F7020E" + }, + "fixedInfoPartyV": { + "partyId": "A54BB3033E88E82C9416AFEDC67C18E0", + "ephemeralData": "62E1B17B4A36CDAAF5983D299542F66E42B6A18A0D1E4E377396311BF3" + } + }, + { + "tcId": 344, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAD3C6F87DB916C7BA8513764752CCB4", + "z": "658EFF29AE074699BE004C6BEF71552BA0480E8CB61F7F5B799A3715FD", + "l": 1024, + "algorithmId": "77195FBA1BDF0EC9FC8E1FA4C7E3331A" + }, + "fixedInfoPartyU": { + "partyId": "05E991324D59FE7E27A51E153A020411" + }, + "fixedInfoPartyV": { + "partyId": "F15B4FEC30CF630CD37A8C8D48C09B19", + "ephemeralData": "F7D5BA08678877831DCD641071025C088BB2F26D7149B00D8B0E0B88A5" + } + }, + { + "tcId": 345, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04E696BD06A4FAF92E47F51FDAF36926", + "z": "4ABC2515E22ECFE9C52796ECC3DA99D22F1B33A20905D8D1E9475EC035", + "l": 1024, + "algorithmId": "90336F904AD8E2C01B46EFB61F442A23" + }, + "fixedInfoPartyU": { + "partyId": "C17DD0EE9155A6EB10D015D3FC2A5E40" + }, + "fixedInfoPartyV": { + "partyId": "1BABD3642FF14B3FBEFFD043C96126FE" + } + }, + { + "tcId": 346, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4342F18CE1509DC266B3766728453A84", + "z": "036C69E1508AAA244CBFFBCB4DBB8E0CFBF02495CE4CFC3063B22E788F", + "l": 1024, + "algorithmId": "F407AAA64FF1511B08E853092B480300" + }, + "fixedInfoPartyU": { + "partyId": "51D25AF83E5390557B2DBFAD0F297B07" + }, + "fixedInfoPartyV": { + "partyId": "90C78161A3CE6BF782F6C194940EB66B", + "ephemeralData": "D75F53B58C32BA736E5DB3768D39D8CA5481A73AF740604C4EE1FB19C6" + } + }, + { + "tcId": 347, + "kdfParameter": { + "kdfType": "oneStep", + "t": "522B421144D5B8365027ED65E667DBF5", + "z": "1778ACE3D4B2AE61425EB26BD607FDDAB213C0B56D41B6A5C964E57C63", + "l": 1024, + "algorithmId": "DBEAD37516C192B900F7ED31E234FC9F" + }, + "fixedInfoPartyU": { + "partyId": "2DB07825244F1285EEF9B36F6776EEB2" + }, + "fixedInfoPartyV": { + "partyId": "3EF9E58F32CE0110CD8FA66ECEBB5B9D", + "ephemeralData": "BB2AB15F99E7484449BD5045C085FEE91C3962595118042743AC49C6BB" + } + }, + { + "tcId": 348, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28DD12FCDC926E420A0F3971A305ECDC", + "z": "196B6E00EF92BE485797C0E7489C00F82857210FE33F81BE67C2962997", + "l": 1024, + "algorithmId": "586E2EE494797AAD1E88ACD9B00BFECB" + }, + "fixedInfoPartyU": { + "partyId": "1761BFC66A1EF1AB97BAFC519D9A21AB", + "ephemeralData": "2CA2F69C0546FCD7BA87ED3725165066D2046A4FD145521494F56D49E1" + }, + "fixedInfoPartyV": { + "partyId": "4FAC8057470D1723FD241F377A5D8890", + "ephemeralData": "3FE01F01192B479B8A0DC74019AF1EF7F0274D0AFD907487A054CE8BD9" + } + }, + { + "tcId": 349, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0E6E935B2BF428150A8C1EAC60BC80D0", + "z": "14E4E845D82B34671831A1EDD39BC3B0CDC0D6F4962DD9F3B08EE29DCA", + "l": 1024, + "algorithmId": "C311E9FB5D140FBF13BD090DFE50644A" + }, + "fixedInfoPartyU": { + "partyId": "48B8CA8FA6DD1283065E9205A02BB792", + "ephemeralData": "8AC4DB5095641EC81FAA3C0318F40A6BB6B76863F63DF26D585865643D" + }, + "fixedInfoPartyV": { + "partyId": "F52F0E63394A3ABC7F83080DE27B9C88", + "ephemeralData": "71F2C95B748763A8D4EDC66DB32E9208C3004675AB9E7BC677B2D2A7CD" + } + }, + { + "tcId": 350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56CB32FB279349AA5BB5B62A2304F691", + "z": "BEE5A31229A11D0DE1256973148ACC02371954F009BFF372C7E4E9DE74", + "l": 1024, + "algorithmId": "DCB4394441443C4B52D4522F4E6EDE58" + }, + "fixedInfoPartyU": { + "partyId": "62391A44021E15CF5065CCED711957AC", + "ephemeralData": "234B5E443A663649A83A995C010DCFB4BB48C06774A5C88713087DA724" + }, + "fixedInfoPartyV": { + "partyId": "A56579CB51CF99B568FBEE8E3EE4F39D", + "ephemeralData": "E9CAC24BA5D3C52C09DC73D6827D29CECD1771DAF228A0BE43F44F6114" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 15, + "testType": "AFT", + "tests": [ + { + "tcId": 351, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20F5423EF99EAC38116FD76D51BD2928", + "z": "5B77BE2EE5D252026F859228F1992C4391F5F2B49D4B747FAA09A5D2C74F7B86", + "l": 1024, + "algorithmId": "B1D8AA2752CA3D9DB6B8CC920A647247" + }, + "fixedInfoPartyU": { + "partyId": "455DD28CF8D1132082DF115BABCCAA48", + "ephemeralData": "F430E38CC015D1174C323549260954F0FDC17B23D37FC4DFF6F3F703A812B60D" + }, + "fixedInfoPartyV": { + "partyId": "97FDAE5F4C7BB5D8B244B26407202E8C" + } + }, + { + "tcId": 352, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39A2D9DB53EAE3239F3F439277568B8A", + "z": "842A6349EDE532669CF5D7827C56889152E845D6FCACE59FFE9AA191DA955812", + "l": 1024, + "algorithmId": "FDF49AB072C5ED5E06B734D108D1A6E0" + }, + "fixedInfoPartyU": { + "partyId": "DEC84397ADD858F1E96C1A0557608B4B" + }, + "fixedInfoPartyV": { + "partyId": "BA3BB4ACBC5F73F8633BB6258353C298", + "ephemeralData": "9CA3442D0CA70DF425D42500D7A1B1F30669230548FF2A8B6C1C764D91E54AB0" + } + }, + { + "tcId": 353, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6F91E9FEF9991E4CED0A5C85F10D82B", + "z": "A1CDFC0A333CEDD821E35A8611FF134DB12340FBE1CAF9408B732DF6D7861464", + "l": 1024, + "algorithmId": "DD69FCAB5EACBABF6DECA3C521BCA9C6" + }, + "fixedInfoPartyU": { + "partyId": "A4D3EFDBCF1F8464FEE7917596F9B6C1" + }, + "fixedInfoPartyV": { + "partyId": "2B438140F008FF65300A6FE71F8CA1E7", + "ephemeralData": "DC03240DDE921065EF46DA82415B22C5981AE946143B02AD002CBB3B8D464420" + } + }, + { + "tcId": 354, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3528C5194419C592D559F2140FF4B494", + "z": "2600DFDBDC1F8DB911959CC074A07F405DC4C5413CA82B2F1390903BBEBC175A", + "l": 1024, + "algorithmId": "152DC3D0B1817CEB1A24F5A2B1631304" + }, + "fixedInfoPartyU": { + "partyId": "CD941D4AE8E0E02403D96F06B8564C53", + "ephemeralData": "F99CC7ACBCDF509CA5D1570B6EF4E8812B5037B371AD05AA81BE74B3249A04BB" + }, + "fixedInfoPartyV": { + "partyId": "A970922C6A5B3798D7A00266DA1FDB51", + "ephemeralData": "DF0A7867FBD4D51D487FC47617D71FB368E3D501956287F43364F55E9F34C8BD" + } + }, + { + "tcId": 355, + "kdfParameter": { + "kdfType": "oneStep", + "t": "360A65F35DA587A0826BC4C88453A6E1", + "z": "E960340959FE708FB8FB1B2274E039CCBF457BECB3DC87C53410EF7F068DA68A", + "l": 1024, + "algorithmId": "8BF49A7A476E934E5392AFE09EF3FA7D" + }, + "fixedInfoPartyU": { + "partyId": "2595B7E740BE1F96F20CED0CD3BD3789" + }, + "fixedInfoPartyV": { + "partyId": "27912BB7F00E77D5AB6E139584BA91E6", + "ephemeralData": "2DF3DE01FE7637284E24F364A5A32317D9DAD7D0BB5C03DEEE2CDEB271BDB42A" + } + }, + { + "tcId": 356, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD785E65BA7B0AAD66B105D12460E479", + "z": "EDCB3D739962F3947526CA9DE014BA4C504268861DF4B9796686E2EDEE6185C1", + "l": 1024, + "algorithmId": "8247AF9ED4DDB04C31F7EEA31059457B" + }, + "fixedInfoPartyU": { + "partyId": "45DF941118ABF95E9795594D19133037", + "ephemeralData": "13FF640E1EA3827D25F303295556E506ED3BF2EC7FFA5AEC5EF60F9849AA6D2A" + }, + "fixedInfoPartyV": { + "partyId": "0771179AFF61BA1C209FA421D049D21D" + } + }, + { + "tcId": 357, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1EC26063CA1D8054471E621CF312D094", + "z": "86202BA31C13EC23B5470B9DEA4D1FE4CF0BEF130D38553DC9C5A9DA73221A7A", + "l": 1024, + "algorithmId": "E9F04262FA430CE783F6C09D68344218" + }, + "fixedInfoPartyU": { + "partyId": "6533102AC6B6490BEB0E7C20477F2549", + "ephemeralData": "B9138B805554DF611168AEC470EEC4B1351126A895ED4F6CD36F80D71344E54E" + }, + "fixedInfoPartyV": { + "partyId": "226255202CB37410A47273DC4654A7AE" + } + }, + { + "tcId": 358, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CE9E92D8189085FD00BE81D931A3F0C", + "z": "50AD36A5A61EEB115D3D662AB33A30F22D442B36CF95CAA65E03E74FD9862861", + "l": 1024, + "algorithmId": "361234128ACB9239DBB72FAF7EBB1C45" + }, + "fixedInfoPartyU": { + "partyId": "34993C5353ECBB3C25E738ADEA286FA8" + }, + "fixedInfoPartyV": { + "partyId": "1C70B85CC963C728EBFA3236AEFC8F5B" + } + }, + { + "tcId": 359, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A5B29C161DC4A9B16E10639D3C72301", + "z": "49D81BD00E85D0F71CFD551ABECD7CE536E07DAB905A9614AF85667A28EDB891", + "l": 1024, + "algorithmId": "0E1CCC0366486A729A7DAD5820E6D822" + }, + "fixedInfoPartyU": { + "partyId": "1E6B50ABA2BF189E9A93F4DE4AD4FE0E" + }, + "fixedInfoPartyV": { + "partyId": "BEF8DE77E1A931D1BB3B309D5B457BA6" + } + }, + { + "tcId": 360, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79304FD073D85D58F0B4DF3B383ECE07", + "z": "A8941C0F48C0D7C6C59F9271AA416EE9BA6CE54824069574B43DA33CF03DE36E", + "l": 1024, + "algorithmId": "05791323947B56F76490E8A518C77AA4" + }, + "fixedInfoPartyU": { + "partyId": "72A78FD8A6C3899063C888D640260125" + }, + "fixedInfoPartyV": { + "partyId": "0057A5F5E3652A7743DB08860D61891E" + } + }, + { + "tcId": 361, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E044042FC547BACF606D4B3DDA43DD44", + "z": "30A09C8E891E5025894ED37E6FBE6CF06521526288050BFD76BDB855B2AAA086", + "l": 1024, + "algorithmId": "C5F524DFD8FC9435CF61D643EEB092D4" + }, + "fixedInfoPartyU": { + "partyId": "7DFEE44532DCCC1F8C6F437A3F521B4F" + }, + "fixedInfoPartyV": { + "partyId": "6B61E83499058D2051B362D446C3D4E1", + "ephemeralData": "7AE4EAF26AB559ED9EB97BE9DDC7ACF0A05141431CF6B15031FCADEBE2004638" + } + }, + { + "tcId": 362, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B68B6C1E72DB409C0947DA50F173B6B", + "z": "E065B42798B1516ACC66D1A1299D29C53F3BEC0001AB225A0B239068C6563296", + "l": 1024, + "algorithmId": "5512E58375D90F96279B544CBB11FE4A" + }, + "fixedInfoPartyU": { + "partyId": "1DC093D282B50B18DAED4B8F50DF6DA7" + }, + "fixedInfoPartyV": { + "partyId": "BDA6E38ADF165C89CBC5C93F189821EE", + "ephemeralData": "0E278DFBD7EF058419A367C7CC92391F9391D6FAE41C9611C23B7AAFEA0D925A" + } + }, + { + "tcId": 363, + "kdfParameter": { + "kdfType": "oneStep", + "t": "980C8DC78B907DCAB8A9B36708934B07", + "z": "C99C37CBA48B2C4C7506974B27D7FFB46E9DF126BD5D363F32EDE44A1C234842", + "l": 1024, + "algorithmId": "25E1D27F492DBF5764C35B2256E4F529" + }, + "fixedInfoPartyU": { + "partyId": "D892EB5630C9605E22DBC5AF360694B3" + }, + "fixedInfoPartyV": { + "partyId": "9A076749581ECFAD42AB4DE4B5C8D721" + } + }, + { + "tcId": 364, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AF33860C1E6DB68A02DFD5E368858C3", + "z": "4F426BC31D5E9638F7415F18B54A83F7C1CE03F3A4EF49F0EDFCDD72704A3FCC", + "l": 1024, + "algorithmId": "356365A0B9F8B188A32DA9F8C63666F4" + }, + "fixedInfoPartyU": { + "partyId": "64AD880D15469A5CE5C2F21B60ECEEBD" + }, + "fixedInfoPartyV": { + "partyId": "06842ADE7FDC3853FD6CF13EEDDDCA25", + "ephemeralData": "C1707D65E6BAC7627FFC7F6164A19D11F9E8AFE92B197D5865C004A66D1605E7" + } + }, + { + "tcId": 365, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A24D1E77F7CC71485A4D7D2EE4D59BAE", + "z": "1A7682503B5D097FC20FEBDFF29822C7B5745BFFFDAD22B364A421DFC86BB6B9", + "l": 1024, + "algorithmId": "5FD100F31B6D1738EE791DACA663CD3F" + }, + "fixedInfoPartyU": { + "partyId": "EC5B50D00B3170F68D7F09943C61CAC9", + "ephemeralData": "AD2FF203B96FFB0BA2BE2137F9353392AB301469C3D648A8A7CEC35A85552F16" + }, + "fixedInfoPartyV": { + "partyId": "5C8CC9A9C0EB9593076F9420523A3E70" + } + }, + { + "tcId": 366, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F108EB78919493BCC0662E92AA01DB6", + "z": "17AF0907B33EAA6C7B99D9814653210DB5FF849F505549FC4A2B38A17F574E42", + "l": 1024, + "algorithmId": "3B402F6E4F2C56A6679321FD797673DD" + }, + "fixedInfoPartyU": { + "partyId": "B62DB60C9F2E56F17E99C1D8200C0C46" + }, + "fixedInfoPartyV": { + "partyId": "99F24278F9F712DCB4689EC93B967C63", + "ephemeralData": "3C137984A1AFFC6BA36D7DDC198DA369877DB66EF9AB2B55D4884BDDDE78920A" + } + }, + { + "tcId": 367, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D3B173B43ED057CFA972BBCC2D217DC", + "z": "81818B722F1D691C00CD933FC78AF4E23BDE34B7FAD4BC0D1A6067C7784BE0DA", + "l": 1024, + "algorithmId": "4275BAA1E91B8199BCCE60349964B32C" + }, + "fixedInfoPartyU": { + "partyId": "48439C57FFB5B7B7757AFD6FC10ECD46" + }, + "fixedInfoPartyV": { + "partyId": "3B82A8304A5D5B4B12470E738D4661B2", + "ephemeralData": "330F862B1CA123AFC7BFD2F43A29C008D4257FA8CEDD87101579E4CC1C25E9B4" + } + }, + { + "tcId": 368, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A3CF95159350D9238C44B04973042F0", + "z": "D17606265A491175C8B43871B1BF8EE39D4E34D9A9BCA892B1FC04A7470A786C", + "l": 1024, + "algorithmId": "A7026BCAE8C489CAC75F5C68DC4A3913" + }, + "fixedInfoPartyU": { + "partyId": "5D5F1B8E5B057F46EB00BB60527B994D" + }, + "fixedInfoPartyV": { + "partyId": "328B8AA2BA95D242C334B98A39C27698", + "ephemeralData": "79F4A3316AE91E8E47E0C297B3908D9CECB159395832F16BD38E273CFCB93F5C" + } + }, + { + "tcId": 369, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A67D0C08503659360CC54A195396C18", + "z": "60203A73FAE9C594A057804B8556DF98903FBB953B97A1E9C254E02846BB4E98", + "l": 1024, + "algorithmId": "C173F57A70BC2631E1BF765F7C2561F4" + }, + "fixedInfoPartyU": { + "partyId": "D7CA91BD00AC761838992C3A2BD8B2BE", + "ephemeralData": "FA03E357D4D46D1E456B5614E3E37C3680AF4F59F762B21AF617BEE17AE1EC72" + }, + "fixedInfoPartyV": { + "partyId": "27BE41367A1F34C0F3DCE53F4D00D411" + } + }, + { + "tcId": 370, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE8A12DC8E8B4501B4C6B72E541D3063", + "z": "6C9B57912E7B9CBD4072CCE868EE39395DB0D463A3C3AAFAE8FE5A8B28A20C56", + "l": 1024, + "algorithmId": "BC21A3281671E07E77E61D737D5084F8" + }, + "fixedInfoPartyU": { + "partyId": "2D5022F3845A35310830F9001CBF8356" + }, + "fixedInfoPartyV": { + "partyId": "0EA257D0DEEF6A61998A052124A3552E", + "ephemeralData": "B7DD6029418E9E82357D3448F70263994E4C9B4DED72B337E508405D9414E04D" + } + }, + { + "tcId": 371, + "kdfParameter": { + "kdfType": "oneStep", + "t": "916456E17C88C69D6A85AB8429B4823B", + "z": "23E2538010CF38CE7E347CE0E4044CCA052FC481DC3B305E56D4E9D87423DCCE", + "l": 1024, + "algorithmId": "6672AD0E6968C67AC4D009D76CA25429" + }, + "fixedInfoPartyU": { + "partyId": "D9E8A86F53CB5DAD528EFE89319BD761", + "ephemeralData": "4F260FE0B18336B2BECC7CFD28AA7A174D0AD6C319A0A5A5A751B07F5295B182" + }, + "fixedInfoPartyV": { + "partyId": "87EA38ED59E3894926E2D14DA2FE79F6" + } + }, + { + "tcId": 372, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B3E5A032F453DD85D3C23DD9E06931E", + "z": "23B7D76E2BB151485D7D69989440CFBFEA02B28D0AABB0D05A23EBB19B91C03E", + "l": 1024, + "algorithmId": "DD5D0F1E695E837EBA07B36989AF8480" + }, + "fixedInfoPartyU": { + "partyId": "25D032772DCDAB6F322CC17E5D2A3344" + }, + "fixedInfoPartyV": { + "partyId": "F8F8ECF73A5F533443D492AA19336F5B", + "ephemeralData": "D4BF78F8CD6E491A56A1990A846812F18B8116E5509CEC240DA3FE6CA48759C5" + } + }, + { + "tcId": 373, + "kdfParameter": { + "kdfType": "oneStep", + "t": "810386791B08565CDECE6D36144C5230", + "z": "601D5AEC2EC4B85B4FDA24BAD6170A0BB5ACC54D683BA71CDF1E61C132EB0817", + "l": 1024, + "algorithmId": "7C70A7124672F8E69776F48521962ABD" + }, + "fixedInfoPartyU": { + "partyId": "979166328EF76C34CEBB3EBC0A2FF0F5" + }, + "fixedInfoPartyV": { + "partyId": "89C1F3EF9C08D69B2DF2C72D6E6F1052", + "ephemeralData": "36794431B26820DD3C29C7F1AE4A9A832D27F51D4C2C4DA1484FCDF9A1965C73" + } + }, + { + "tcId": 374, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBC79546209DAF20008FAEF28B475638", + "z": "A97F63F9A5F1F08D1A0744273450B31951A2344389FA732663A7E082F4C20CB8", + "l": 1024, + "algorithmId": "216B31031548BD3EC683965511F01CC9" + }, + "fixedInfoPartyU": { + "partyId": "ECBC05B47F64E3AE579E766EF75D5DF6" + }, + "fixedInfoPartyV": { + "partyId": "F3C36A01EE9267A70473C4924493074B", + "ephemeralData": "A178AD690C0FC7F2EA986364EC5BAD980533876688E04385F814A2E2ABD6E693" + } + }, + { + "tcId": 375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41ADA75D49B7C3ADE7F6FB686EB99CDC", + "z": "BEA360227913C644862225838BA3C0E91AD2EA93BE65E0EEF6BC8161BAA94707", + "l": 1024, + "algorithmId": "37D4D53B5447326601AAD93DC1AD3B82" + }, + "fixedInfoPartyU": { + "partyId": "C25338968880C3DF5AD6192BF44C0684", + "ephemeralData": "730CEF99A5BFAB48EAD0EFDD9E8D39A63C8DD3436D9A762224E1BD22049C609C" + }, + "fixedInfoPartyV": { + "partyId": "F09CED3BA309CF6B4862BA0700868851", + "ephemeralData": "0F5BAE2DE60E3244D7EC358C4CBA1C2769338A3CFD76BCB28FAD1324C6FEF04B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 16, + "testType": "AFT", + "tests": [ + { + "tcId": 376, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06F6FA5D131A80B5E801ADC4D273434A", + "z": "C2D983890C52BF1EC38D9B71AECC30C124FED5ED5514663E17341C2F", + "l": 1024, + "algorithmId": "2941ED0EBF8229987852A5438E6C8AB9" + }, + "fixedInfoPartyU": { + "partyId": "EFE51E2FE4EA2AB9F18F7C339D1A3F8B" + }, + "fixedInfoPartyV": { + "partyId": "8CBB8D27CA70E8326DC2A26BB48427DC", + "ephemeralData": "1F930030589D200E545BAC5D63D9FF94A8B047F5DAA045F160BAADCA" + } + }, + { + "tcId": 377, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2D9308886685C36F5302D910CECB4D6", + "z": "0DE39DE85F2A549BEB261B60CF1BBD5CA4AB474F434468D205F1353C", + "l": 1024, + "algorithmId": "94F9CEB6D77F51552F1D116A1993198C" + }, + "fixedInfoPartyU": { + "partyId": "4ABDA96F6DC2F4DD809ACC7824A697A8", + "ephemeralData": "596CF29A22902B86A0B79A3785341C920BE717EE0A6D25994178988C" + }, + "fixedInfoPartyV": { + "partyId": "B58A1939720FCC6A045CDDE096F17BB8" + } + }, + { + "tcId": 378, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83D233DD635A8F31F81FEF718C886721", + "z": "1F53C4E3E1324E21596B4DA9F2B9F5FC0E7281C89F3E2CF8C8D31F79", + "l": 1024, + "algorithmId": "CAF45B56C65D1B57F6CC62AF84BD03D0" + }, + "fixedInfoPartyU": { + "partyId": "EFC4E829F5D12B87374DD94823196807" + }, + "fixedInfoPartyV": { + "partyId": "D834E5F2EC2A6278C790BA68D63CFC11", + "ephemeralData": "2277D05B88AD9F4917C8D264428A3830757B7D6A82A822C54E685F97" + } + }, + { + "tcId": 379, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3C798C2D29C7453354CF9A6B9427F6AF", + "z": "4EBE7DE6EC03DAF8D7A77DF7EF2489E055252A3F85EC94C37B1E4070", + "l": 1024, + "algorithmId": "AE4064DCEBF0A2DABB8B4A93F2D2B687" + }, + "fixedInfoPartyU": { + "partyId": "4154A2091AEBC4469C7BB4284D8E6182", + "ephemeralData": "9132A9880E2C2CD79BDD029ED54595323C9544A2E5AF32D821A9737A" + }, + "fixedInfoPartyV": { + "partyId": "6F8667DE2FAA2C150A6B77C18556CD8C", + "ephemeralData": "5771C03A2ABB7B10EED4591EFF2E999B464E9DA5769F6B45A62E145F" + } + }, + { + "tcId": 380, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D0BF03BFB4F604A513E59CBD100E634", + "z": "94FAFA3938D850616EEBF0D221F6787BC2A8C9B4F7B974C713EEB132", + "l": 1024, + "algorithmId": "3CE152192CF7B1337D9FB0F5444C7891" + }, + "fixedInfoPartyU": { + "partyId": "021C092DC074CD6368FA79A54241A460" + }, + "fixedInfoPartyV": { + "partyId": "7ACCD9B6D8E11B9C054A292E6AD1D67C" + } + }, + { + "tcId": 381, + "kdfParameter": { + "kdfType": "oneStep", + "t": "364A57F6C4F74417EE6ABBEFA20CDBE4", + "z": "B5782E5D7BFDA2CEE92F8D3F914184FF8A59AF2A80ABBAFFC97AE3AA", + "l": 1024, + "algorithmId": "53760E26A9C6E16C9227AAF98F1CC737" + }, + "fixedInfoPartyU": { + "partyId": "3F788B302953AC9442FE8F97159B62B2" + }, + "fixedInfoPartyV": { + "partyId": "42D16CFEE6076760276985660392EEE0" + } + }, + { + "tcId": 382, + "kdfParameter": { + "kdfType": "oneStep", + "t": "737F1F886A9EFC07259C3F483A831237", + "z": "877FBF56F5D2E8ACD255FDF75E79E93870BA040308FDF873F8129A58", + "l": 1024, + "algorithmId": "609DF6145261987661945C8487E4F334" + }, + "fixedInfoPartyU": { + "partyId": "44377B153FEDA4E37AFAEE1957D92ABE", + "ephemeralData": "10537BFFEE4A57632AD8497578B3A21DC76FC6ACCA8A723F821EEC2C" + }, + "fixedInfoPartyV": { + "partyId": "276C8D4EB77F0460D22A6F8DB131BD15" + } + }, + { + "tcId": 383, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B34F7C986BE911416B7E042CC2E714B8", + "z": "4D104EE04B0783D739277F070E5028ACF89C76789B20A7D4E322D001", + "l": 1024, + "algorithmId": "39C7590C37EBCCE513B65A5F51BA5E50" + }, + "fixedInfoPartyU": { + "partyId": "B5494CF31164E3373B35387D687A4A70", + "ephemeralData": "1B23D715F2747A34FC2D2AD3978603D6C87EDC16551964DBC019BF85" + }, + "fixedInfoPartyV": { + "partyId": "5C671261E6958DF78F5AE351398A4516", + "ephemeralData": "95459FF6A9F2764551D03FFE4004AB274A0B33B91C21207ADEE06172" + } + }, + { + "tcId": 384, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9654CA229E57158DB5F8C7718FBEEE88", + "z": "85511F65C64FD4F98CD18F10664CB97A32A91A0A3BB7D19012A69B00", + "l": 1024, + "algorithmId": "72324ADF573FBA8223B7C69ADFD45D8E" + }, + "fixedInfoPartyU": { + "partyId": "56848337B7E120A44456A865B700196E" + }, + "fixedInfoPartyV": { + "partyId": "7F70ADDF4B2C9CC8F8938DF1C8D43AC6" + } + }, + { + "tcId": 385, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E53DD472972ABB4B5E5B3B34FF2BC34", + "z": "E164810214EAA0266FECC9AC49514131638BC4C7B5B1B7650777AC44", + "l": 1024, + "algorithmId": "05729189A8B6A88EA6B3FA8C1837E8C7" + }, + "fixedInfoPartyU": { + "partyId": "EF873C0B7CA06A19DC634755B15F8988", + "ephemeralData": "28412F75DDEA0EDA653E2DCF53E30463C1A448E3F07E7D2859728481" + }, + "fixedInfoPartyV": { + "partyId": "FE72C0E10C5F87F1FC81ECFB18EA6470", + "ephemeralData": "CD4862E78276C68B5E7E80553BF8E4949A734C89490F3B28BC66B51A" + } + }, + { + "tcId": 386, + "kdfParameter": { + "kdfType": "oneStep", + "t": "463F0FCF3F9CC0758B27E39A03B9B5F5", + "z": "370807480F02A08B7816561AD9E8488AE9A05566890EEB9095566286", + "l": 1024, + "algorithmId": "50F21A3C8C9A16364B4A69F87E926FF2" + }, + "fixedInfoPartyU": { + "partyId": "449D2FA60ABF5DC4D90654D7267B0BCD" + }, + "fixedInfoPartyV": { + "partyId": "E2894D4660E6BAC7F87825C2D72D003D" + } + }, + { + "tcId": 387, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5511CF1C0129BB68A19B6EE161FB6537", + "z": "80BC8612D582D8D5BDA1CD064DA493DF75355E1EBBAA17DDB22936BF", + "l": 1024, + "algorithmId": "A69ED94E8BA00AC5D8B7023C2528AD44" + }, + "fixedInfoPartyU": { + "partyId": "82423FBA1FC8EBAF17CC4AF8F5BCB5D8" + }, + "fixedInfoPartyV": { + "partyId": "5A57A054B4E67F532E4FFADC17D5C226" + } + }, + { + "tcId": 388, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A39DA1A311CEAFF794EFC5E13F2026B", + "z": "59D42AF76A19FAD95E504F907AC340CEB76EF462319080BA7AC71981", + "l": 1024, + "algorithmId": "FF8A87494DBB09F421CF6B44D4A34566" + }, + "fixedInfoPartyU": { + "partyId": "6AB0C172EB4510BF2FCC91D01A069D4F", + "ephemeralData": "0A80BB94733CE754EDC4E237AB90825D008650DB8ACBA1A127BFAA97" + }, + "fixedInfoPartyV": { + "partyId": "40F5903BFCAD31157F60DCAE4A18EC64", + "ephemeralData": "350595112280523C38EE25C020E6924B6EAF397DEBDE3A40B48D622E" + } + }, + { + "tcId": 389, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CFECB671F109D73EE681054D87C0A49", + "z": "2B31255E5ECCD784507C730C6956C51F081957125089C5B9FCB24F68", + "l": 1024, + "algorithmId": "1AEA44A51CCAA540563206C9A414C66E" + }, + "fixedInfoPartyU": { + "partyId": "FCC62B808360ED9256B39EA774EF12F6", + "ephemeralData": "121ED700118161A468FF5A5D93949D548391A7AD4FF312A647AECF5F" + }, + "fixedInfoPartyV": { + "partyId": "F6FA25FB004FE48256FE66CF1158D0F8" + } + }, + { + "tcId": 390, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43DD6BB88B80756BEB862100E0A8E508", + "z": "950865CDC7E604E545F0C86926BA9B97F6507496E41F44A27967F750", + "l": 1024, + "algorithmId": "DD13C69D3F29F7EDFCC8C80B735153E8" + }, + "fixedInfoPartyU": { + "partyId": "8B49C3C6C33A9A5EA6EFE51A81433D48", + "ephemeralData": "8DCFC814ACB1DBCE31599C8A3C3CABA0114B5E977BF02159BBCF5490" + }, + "fixedInfoPartyV": { + "partyId": "878206531BEFDA38113CF65ABA227F2D", + "ephemeralData": "ACAF032A6FAAB7913C184E625291A623A2B4025AF0273B86FDEEBE94" + } + }, + { + "tcId": 391, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5A31914998EC9B7BC72798EAA1BD766", + "z": "6E86EC8DC423E7B3F82EFC4BE9AEF3E9A826732F630B97803D8BF61B", + "l": 1024, + "algorithmId": "18E0865D70AAACE1735018383DA9FF3D" + }, + "fixedInfoPartyU": { + "partyId": "1B7BB7CBCF97A2FB6654D509C85FB78A" + }, + "fixedInfoPartyV": { + "partyId": "1093B0C6D23422ABEA174DA41BC3D3CA" + } + }, + { + "tcId": 392, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E8895FC51E97D20F686E702A9E7C1E3", + "z": "1F22A003A47F3E8B2F88DAF12B8DF702712ACB34409BB3775B4CF7BB", + "l": 1024, + "algorithmId": "A82BE36C3A810D236449B89D43968A8C" + }, + "fixedInfoPartyU": { + "partyId": "3675A7262F31CF96747E32858D67F8CE", + "ephemeralData": "A921951878CFEC9C633C717B91D657A7777DC2580C215FBDF029F315" + }, + "fixedInfoPartyV": { + "partyId": "702C814698112EF9ACEEE748C9E40959", + "ephemeralData": "604C982969BF2EB4DD4EB2773E28D8B1232920D23935AA9E5A78EEFC" + } + }, + { + "tcId": 393, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2339CB277A01490AA9C31A9886C9A948", + "z": "BC0E1E135BEC256CEA627E1C8A9632A4A1F1F27358805743C0541172", + "l": 1024, + "algorithmId": "7F4F6A7665E86DF9E304B80518C8D675" + }, + "fixedInfoPartyU": { + "partyId": "A5137129F13B8E1564F2C5332EBB89B6" + }, + "fixedInfoPartyV": { + "partyId": "4825ADF9244DB64E68A95E77B2D70522", + "ephemeralData": "A40EE5C5122B3F093618F1334712FBC071438D743140DF6DC337EAA1" + } + }, + { + "tcId": 394, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85EBA8103CBD348454B8585536E8B1BA", + "z": "B1E0A0E26F988DD45AF46CD334E01241F12C80505A4934A70140B3A3", + "l": 1024, + "algorithmId": "D88C52F38124B4293FF021E564F49BC8" + }, + "fixedInfoPartyU": { + "partyId": "D5E58D6786318A113FDD9FC8802FB364" + }, + "fixedInfoPartyV": { + "partyId": "54071ED11A15B091B3A36988547212C6" + } + }, + { + "tcId": 395, + "kdfParameter": { + "kdfType": "oneStep", + "t": "130A785CB3620E80C93C9A516EBF781A", + "z": "EFAFA02F7B8414D0592359F58D925E05CF33CD2DE5F53CE38B316C29", + "l": 1024, + "algorithmId": "0FD5963C49855261391D98FD30696B16" + }, + "fixedInfoPartyU": { + "partyId": "8440DA83DE2B4A65CF1F7147E9DD6936", + "ephemeralData": "2DAA28C23E938749EFC4AF058C435CB6E81443B15502BED47C22C36C" + }, + "fixedInfoPartyV": { + "partyId": "2E9693DAAB61728DDCC213FFD4F6D545", + "ephemeralData": "4E93FE6699A3E8404DDB10D413ACB9E42FE51E957B2A7D52E8EEAFE7" + } + }, + { + "tcId": 396, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36CE6B60231D1385008285D4B93ABC2C", + "z": "749CE01E973E182C101B8F5765DE95C56ADAE86BE3796E430696AC92", + "l": 1024, + "algorithmId": "791C6B7B62B6CBE6094DAD8721E1A01C" + }, + "fixedInfoPartyU": { + "partyId": "EC4D5743BD3615D5CED07FFD7AA92A90" + }, + "fixedInfoPartyV": { + "partyId": "D162E8FE6D790ABD50D0CBB734F03B18" + } + }, + { + "tcId": 397, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CFCFDBD191C3430F5FEF7D6C906C7E6F", + "z": "DB19B35E88B0AF98CDC763881682265A626FE3EB7ABCAB2CF7815095", + "l": 1024, + "algorithmId": "BB7A6181AC17AEA0DA1D4A1E28124E05" + }, + "fixedInfoPartyU": { + "partyId": "88A5F1C2C38E83DF311647DFC5098B86" + }, + "fixedInfoPartyV": { + "partyId": "917998F9A0E53701136E08ADC1E8058D", + "ephemeralData": "3010DDB19A83D91931ADD179280AA60B03D50436500F1282AADA5FF3" + } + }, + { + "tcId": 398, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B30ECF8B2994A25EA2525540315633B8", + "z": "9E36323E7E6628CE4022B45B878AB3069E7241FF75BEFB459A6A0577", + "l": 1024, + "algorithmId": "BAF6C95C725C303B7476784194D591D4" + }, + "fixedInfoPartyU": { + "partyId": "FF32E074BC755C5E57FBA9216CE94CE3" + }, + "fixedInfoPartyV": { + "partyId": "C5125CEB9E4EE5CDACD7CE0D18AB9CB4", + "ephemeralData": "ACC353BF127ED6868A96899C67F6EDCB663EFF2833B75D7C0657B391" + } + }, + { + "tcId": 399, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0089DDDED0E7FEB6C630512E575D7411", + "z": "B2C0CF0856D732ADEF450A3412A78AD9066497BDCBEE52AB4A3EF427", + "l": 1024, + "algorithmId": "526892235D02E4729D15F7B0769539A7" + }, + "fixedInfoPartyU": { + "partyId": "979A9286BEA71E532E35015B95BF450F" + }, + "fixedInfoPartyV": { + "partyId": "91DC41E81DF5539997D39BD5562BEC2A" + } + }, + { + "tcId": 400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8B5AAA7F3EA4AAEB464DB6EAE679902", + "z": "A1FB15E9A1382EEC6752DCB8C851DE39C5FCF5392820E21B58369F94", + "l": 1024, + "algorithmId": "91C1FBFE4D1251ADE3654FECA9CA4D7C" + }, + "fixedInfoPartyU": { + "partyId": "79743E781F7668C45FB92A9B033B7164", + "ephemeralData": "665003F1250F2AF9B9C7C47EE7056F956765FB4E57CA3A22F9D07A9E" + }, + "fixedInfoPartyV": { + "partyId": "2F4DAB703641A82B9A4AC2BFB9AEEE33", + "ephemeralData": "82D6BC6A24D3A7AB4D5F2464EA1F07AB6B74E5BFAD79F93770F82FF8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 17, + "testType": "AFT", + "tests": [ + { + "tcId": 401, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B360B3DD30DF90DDAF7DDAC9BAD2845", + "z": "ACF0FB99922B2F28D9FC50181A2E69D0671A1B4F9B9C70579D3BC1AA9B00B650D7A01CA167", + "l": 1024, + "algorithmId": "6DA9C99162E5C8366CFCE6F55EF3110C" + }, + "fixedInfoPartyU": { + "partyId": "EFEE387089B53CBB1C01FFAC72F49508", + "ephemeralData": "B864B5773B40F068739ADC5E1167D0BBA826B992F07F5C04A9967B7327BAFFBF85EE3896E3" + }, + "fixedInfoPartyV": { + "partyId": "34A5800959371286858C85B8F5D682BD" + } + }, + { + "tcId": 402, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9B33DA222E82D9D7511FF61B96294D9", + "z": "795F9ABC59148B5FDDF4A662848554027A1A88FE58210EDED6E4D4D3B9C6C0DA67CC32CB5F", + "l": 1024, + "algorithmId": "2516AB2BF9850C522E81C62144D79684" + }, + "fixedInfoPartyU": { + "partyId": "B5A4C9C71FBF9E2D2B8D009CD4FFBD4A", + "ephemeralData": "E83D6EC05EE69616D5E6C35759C602DE4688400EA8AE431A8BC0475AE8CB330547AD775D4E" + }, + "fixedInfoPartyV": { + "partyId": "64BA1F707C83A16B46A5B308CCB802CB", + "ephemeralData": "E2FE6D3182DBF6646A40B6EE805C2B3DBB870CDCC606ACCB6160C3D2F64C41F053B05B6F52" + } + }, + { + "tcId": 403, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA7216FF3CCBCE05A715BF18CC598A2E", + "z": "743718D340466A1A63772B7383898D993C4D623B34F85BBBE7D318C6032787D1B0EB5F2925", + "l": 1024, + "algorithmId": "0FFED4613EBDB25D6A572F46301A9948" + }, + "fixedInfoPartyU": { + "partyId": "B4C408D3734ABF42A651C931025C5F12" + }, + "fixedInfoPartyV": { + "partyId": "24A21493D25CE8C310A63C67D69B8BAD", + "ephemeralData": "AFE8E74F4FA7ABAED4F5E06EF2B622AB9D9B8C251C91A6119004E0B441E23CD00B4B05DC21" + } + }, + { + "tcId": 404, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3EF481368D6FD1FF1E05811A6751440", + "z": "D8C4DCD4034F3974116E7470C4940D87CC87C3802D919FD21E36230D1204C32B3510D28CF5", + "l": 1024, + "algorithmId": "545AAA50D278F2974CDDE76B9361A5EC" + }, + "fixedInfoPartyU": { + "partyId": "84923B455D4CD2AA3404947051151F4A", + "ephemeralData": "446DFD9BCAA639CB11279D195F09F25C36AE61E2B8DBF64A33D4D49DF354B7C54B3D7F6ED6" + }, + "fixedInfoPartyV": { + "partyId": "31588C81568877602FF77CFD5E5AFF9A" + } + }, + { + "tcId": 405, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A6398512D7F1675F22BB2425F3BB17F", + "z": "DC9BB5F4A2680F9DC9442C81EC0FD38857CDCF14CF44514084495F3DBB32C0734CE96C1CEB", + "l": 1024, + "algorithmId": "311D49B7A0FE060160CB485AA27418C1" + }, + "fixedInfoPartyU": { + "partyId": "C93D5E3AC4356EE15205A309F00CE533", + "ephemeralData": "5252410C9FD23F8E7FF7130ABCCEE44EDDC32F9C68B68A90A7F62E1E687C46CBFC5D4863B2" + }, + "fixedInfoPartyV": { + "partyId": "0EC2D20DAADD3A5BD685A074C619367F" + } + }, + { + "tcId": 406, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90C40C535ACDF4E55507082EC8800CE5", + "z": "CFEC5143A40F52255EF7847A63C0F5BBCFE52DBA779F9417B04FA8A32CBE876DB570F6511A", + "l": 1024, + "algorithmId": "CDC2C53D6BD4681CA57F2CEC69CF6BC8" + }, + "fixedInfoPartyU": { + "partyId": "DF99E32D60CDA4B85F8B9CC284781852", + "ephemeralData": "90F282C430B8413197B6D5AB606A1F0D60B4A124D0A8C66CAB9851075F90E93A0C365B5EC1" + }, + "fixedInfoPartyV": { + "partyId": "F7BE5DB806380DC6399562F48FDD4598" + } + }, + { + "tcId": 407, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C4E2424D4E839C6DEC6C65E281F1D3F", + "z": "C9D9842A13870E18D13763FEEFC1111AFDEB886243EE30009E8BF32F61C3F2F91085F40AB7", + "l": 1024, + "algorithmId": "EEABBEE43C4762AB33EDBA712ADCB687" + }, + "fixedInfoPartyU": { + "partyId": "9CC291F908C63F3AD22FC65C2A45DE25", + "ephemeralData": "E0E80BB0EB4B87D82F9DBEB5EFE154A0C042831D24577B73786C2049F1BA96119533F99C1F" + }, + "fixedInfoPartyV": { + "partyId": "3F74D5B14ACBC2650F7D6B70AFCC9096", + "ephemeralData": "A08C0D920C13037E52F2F289D2D6355093B68C8E769368C881D5C1188BF853E04417487EA2" + } + }, + { + "tcId": 408, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8464EAA259B4F5DB811AB75EE82136B", + "z": "18043C2776C7B6016AF9FD4DF6409C36E559BB4E5E1AE040B08EF9E8689F45CD659847AC11", + "l": 1024, + "algorithmId": "EF035FB04DEFBC16602605485A0608EB" + }, + "fixedInfoPartyU": { + "partyId": "935BC7806E1D0882B18C85E3CE9D896A" + }, + "fixedInfoPartyV": { + "partyId": "DC048918313267354CD018A1070FDAE2" + } + }, + { + "tcId": 409, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26348D3769930B62505308C64950C1C5", + "z": "0D75E218A16F9CA69A73A49389C351FF7F1815DCC5D5F9AC6D801B9959BB61FD6F4AAAEC31", + "l": 1024, + "algorithmId": "A668B761143FD6FCD30F2D7F07E3DCCC" + }, + "fixedInfoPartyU": { + "partyId": "775BA3BD12B6E3D2ED2CEF955FC8361E" + }, + "fixedInfoPartyV": { + "partyId": "84C954DFACFDB320ED58DCC0E69A32A6" + } + }, + { + "tcId": 410, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DC8A8266064064E9A17B3CA313C768A", + "z": "1810DE9BC90B8253F3A17B1706E965CDC4B8C6729375D8E9CBC985FB81934215053347293B", + "l": 1024, + "algorithmId": "87095F3A19B991B4A8B458A8C9B11E9C" + }, + "fixedInfoPartyU": { + "partyId": "E2B4CDEF2D64CE4E2DCEB0A9337582D5", + "ephemeralData": "4B6F42B929CE8503741648B7BB961C1B8451EFBD5CC80B30FF79792DA0A09AEE2D5DC46E58" + }, + "fixedInfoPartyV": { + "partyId": "C40F9365599E4FB455820993DA93A7BA", + "ephemeralData": "1E052D980976700EBDA96807409A12F0765C16A17C9BED4650ABA89C2C83A676A22E513D8B" + } + }, + { + "tcId": 411, + "kdfParameter": { + "kdfType": "oneStep", + "t": "61B5861BEEAC152F0FCF1F79DD93D16F", + "z": "88148165C036E98A6C4EAA8AB9DB5D7DB2B4FB554ACC136D762932DFE8EB32DF59B435B467", + "l": 1024, + "algorithmId": "179CBEC9E9C775BC04781963D99989FB" + }, + "fixedInfoPartyU": { + "partyId": "8AC5A4E002C199A6ED9AF4A89F8FBEE8", + "ephemeralData": "BE97B5BEAB23E58C4BE8F113EDC3880A146B966243FEEC1069FCF55E7FE335CEFB5956EAAF" + }, + "fixedInfoPartyV": { + "partyId": "2E429C03D5883CF0A49629BB5AF0EC2F" + } + }, + { + "tcId": 412, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4522F5B8A6F74F9A2A45EF6FDB95A04", + "z": "F2EF0B146160AE9A5F960D953AC74FAA809228708360E08CE99F73BF03DDFE919E9C9212D1", + "l": 1024, + "algorithmId": "CAEC8401DCC9B3900925CE0A0637DE26" + }, + "fixedInfoPartyU": { + "partyId": "07EA070E936CB905EB37FADB5C722C50", + "ephemeralData": "2BE3DFA259C3935003A0DC34DB18B0A436B544336DF180D43D1310697E67830861CBC32734" + }, + "fixedInfoPartyV": { + "partyId": "A5D4A0A1ECE4C7D726905DF4EE24EE26", + "ephemeralData": "6C4F19071EBEAF61B4F86D04F11F4742C7204447C59CF49BB94CD62D64E32B2DEFAB778F88" + } + }, + { + "tcId": 413, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0990CB5BF04C581F721B4C37AFA941EA", + "z": "C7BA74CCE17F85C57BD2A3F1EB408D55765B78CB91F4096C1448045E6059D94C33D72B5017", + "l": 1024, + "algorithmId": "9201F20B8BD6724AE1B5C82AC364078D" + }, + "fixedInfoPartyU": { + "partyId": "52905E584EB35ED248D94F50689D5F2A", + "ephemeralData": "F7B23AAC2CF5662384F09318F8B40526F3DB6C672D4FF8476684D89BDE07A841EBEBC3C292" + }, + "fixedInfoPartyV": { + "partyId": "23F72AFEBA176CC300B47260F41D3EDC", + "ephemeralData": "F5CE6AB5D16FF885367CAC35B351B492E64E285157460CBA57E334BA82B8ADD2F20EBC6B41" + } + }, + { + "tcId": 414, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18D0368C10F891D27CBB8B6F12EB2903", + "z": "DE37F3181285B09DEF7AACFBD737A592935AA47E00C296E548D1E0D57F606F5D104594E09E", + "l": 1024, + "algorithmId": "E9DD72189231E3BC3CAEE80B7E7793C2" + }, + "fixedInfoPartyU": { + "partyId": "920E1035FBEC33E9AA99938BBAA6D898" + }, + "fixedInfoPartyV": { + "partyId": "5EF230BE5B24E270F4B1156D5C3B0C85" + } + }, + { + "tcId": 415, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C93B7560D69A2E74AEF6A19A54085C4", + "z": "A18B8F4BC388FD47B646E4B31F5DA02B4512F9716AD459B24DF363FAD6E34FBB60418D7DE1", + "l": 1024, + "algorithmId": "801E2E0971E7573F54541FE9CCFD0FC7" + }, + "fixedInfoPartyU": { + "partyId": "BDE5A2944934FCFC071ECF5C360920DC", + "ephemeralData": "AED8F441CB18A421FCB0B62355825BE8DCF0518E33CD22022FDBFD8F2D09D6AC212FDDB656" + }, + "fixedInfoPartyV": { + "partyId": "9414617C11FACC2B203F2E2C3273BA71", + "ephemeralData": "7D869DFE848FC0809EBC5729611BBAAFBEDDD3C21E4A0DED10E5EA0B0C26F5FDDA5B5A6DA4" + } + }, + { + "tcId": 416, + "kdfParameter": { + "kdfType": "oneStep", + "t": "628F07C034BD9DD5DEED630524453673", + "z": "2CDB1EF007159481DC19D4F6A187C9998E9E2657A49F2523F333E189547992BDA438D8C640", + "l": 1024, + "algorithmId": "BF0A05A15E52961D55B599B6A9D48FEA" + }, + "fixedInfoPartyU": { + "partyId": "E169901D78B1EAB9827CD0CCA4B51AD2" + }, + "fixedInfoPartyV": { + "partyId": "4904022CCBF4D39C78E9AD9651FDA6D3", + "ephemeralData": "712DBEAA2EACE88DB688FC2F2BCC6D3BDBDD781D16342BF0BEA1220BE7044CC9C2F9703CD2" + } + }, + { + "tcId": 417, + "kdfParameter": { + "kdfType": "oneStep", + "t": "343F94FCD13901E2170F415856FF3B1C", + "z": "B9C880A626A912453A6AD1AD4DE0390B114331CC440ACEEAD144AF9892E70AC4A9129EF2F3", + "l": 1024, + "algorithmId": "4AA157BB74DA653D0E16746BB3C55C21" + }, + "fixedInfoPartyU": { + "partyId": "622F8D2E33F746CA92BFC4173157A18E", + "ephemeralData": "0F99842A46E2B80B36D966824D7A47FA11DA2BB55105692A1E06864DACA0F3FCC5BEB9E722" + }, + "fixedInfoPartyV": { + "partyId": "04D7DD2D8E1CAC8B38776A9064A5C9FA" + } + }, + { + "tcId": 418, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDB0609AAE3B38473C4921BD751F119A", + "z": "167C5A7B073553DD552F00B0C35C784C0B057A1D8AFDD68F91D78B5DA4CE97E775D576052C", + "l": 1024, + "algorithmId": "B36A8D828759B795EE8C916848EC0C7D" + }, + "fixedInfoPartyU": { + "partyId": "E57C243E62B7AA729560D05079B33D94" + }, + "fixedInfoPartyV": { + "partyId": "5A3415CF5509C77868E7C5121A8CDFD1" + } + }, + { + "tcId": 419, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12EFF19942611CDF79B8FFB1C686D65D", + "z": "C869EE6C03438061606474FB15138F18F274FBD19C9E886DFF4F74BB5245CC22924D5385FB", + "l": 1024, + "algorithmId": "F5C91CEFE97EF2341AA3C1815375CD13" + }, + "fixedInfoPartyU": { + "partyId": "F5C8A6C293727A688BF67440093A637B", + "ephemeralData": "730C4D874DB8BA9DD10281AC8899A4B26AC16D20D51F7E924C313AF1E567AE963840F5E21F" + }, + "fixedInfoPartyV": { + "partyId": "5B86EC73F3E81B59BB835AA18BCD4388" + } + }, + { + "tcId": 420, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B67CE471D0368854DC84BD7E7A88B58E", + "z": "2EC29A18D8B6A5A3BF5A893CF6FFCACD64142C186D90CF8107B3EB50A13ADE8027238804E9", + "l": 1024, + "algorithmId": "04B4B7C783CE549A1674F6E2DD187ABC" + }, + "fixedInfoPartyU": { + "partyId": "B75963A5B8D3D5D0D12DD84ED70EDC90", + "ephemeralData": "887EC570FF4B401AA1B667252E9CF4153D1E3BDC620CE7EEDB34ABFD7A83F7EB2D893A1B52" + }, + "fixedInfoPartyV": { + "partyId": "1E8743ABEBE6F59C82DAD35317F163A5", + "ephemeralData": "568946652DB9D6F6CA802F911A1A42E9074978BD8469296A355FBD60E14184085A9E273C2A" + } + }, + { + "tcId": 421, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68C88A5356CB29FFBF78E953686EBBA5", + "z": "BEA1354C97CDD8EB3A1C66BB4E7C5001F021D4C89EE98621808D0EEE1C94E9777EBF622D8C", + "l": 1024, + "algorithmId": "64FB20CEC2B560572B410545657BC666" + }, + "fixedInfoPartyU": { + "partyId": "B58AB8E2A3DE3FEADB644BDAD12DE53B", + "ephemeralData": "C5AAD4F0184D335878887C63A1ECB5164FA6E3622BE4EB33F54116315ACD11C371E5DC8A78" + }, + "fixedInfoPartyV": { + "partyId": "A755B7BFF20CF59A4E1A7F041C21CAD8" + } + }, + { + "tcId": 422, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9086542357A80E499B16BEAD6A302A4D", + "z": "0E2563E1DA6619EA2F97F3F7F1253A86A0474E0C5A8EA9E289789EFDDA579AF80A832B41D8", + "l": 1024, + "algorithmId": "E4D939663C7260BA3C42D7A53C9308E4" + }, + "fixedInfoPartyU": { + "partyId": "0516FC196567119E20B08FD89054D955" + }, + "fixedInfoPartyV": { + "partyId": "837EA89D38E4EF2802051292050651EF" + } + }, + { + "tcId": 423, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C26EA1BE9337B7F964487C28BB73945C", + "z": "6468720F1147EB62B6162565D06337F37A21EED166E443AAE2DA7E48ECB0D651FECC7F37ED", + "l": 1024, + "algorithmId": "A1DBE4A05FD17FE9AAF5EECE1EC918E0" + }, + "fixedInfoPartyU": { + "partyId": "B2EC2C53744E816EFEDFCFC3BE0AA30E", + "ephemeralData": "6779C8C395FE3663A1D6E362645724B762E42E587FDA38D2C8375D89F9BF2C99FC1B00F947" + }, + "fixedInfoPartyV": { + "partyId": "BED4D49916AEA5C78246C9FFDE0A1248" + } + }, + { + "tcId": 424, + "kdfParameter": { + "kdfType": "oneStep", + "t": "761C0BF65F619D11C9E0E1FA0125E8BB", + "z": "434E0168523BBB1CB7F85719A942E99FEE6CE56290173C62AC5C41A9F967D515A6B5AFF59D", + "l": 1024, + "algorithmId": "1654F3439EDF6F47B27C199568E28A24" + }, + "fixedInfoPartyU": { + "partyId": "2593CE4A60AE1C84A05008BD13A5709E" + }, + "fixedInfoPartyV": { + "partyId": "EE61430906EDDCAFDCBE8D0C6C0BFD88", + "ephemeralData": "E5A1DC76724DD87A99632C0D36E6E292D74203E0A115284E6D97A8FC25A29896305840F2F2" + } + }, + { + "tcId": 425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96F88CA5C403E3CFA6F679C8630DB0DE", + "z": "1FA927837881B569C2CE1E139124C1F5DC35168677BE24063D57F75C1A36A2AC5AF3824D64", + "l": 1024, + "algorithmId": "7A88A2F78B19710D5B2EC5B2EEB9879D" + }, + "fixedInfoPartyU": { + "partyId": "761F4D44BEC9699F816C48D60E312095" + }, + "fixedInfoPartyV": { + "partyId": "7ADFB9DF76A6B074D38D47625E8B6EBA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 18, + "testType": "AFT", + "tests": [ + { + "tcId": 426, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A53F63E87E6F96D78D292BDA2DC16956", + "z": "92555A6B2489E4A635C6531293F1A0CFD04B32EBEE9899EF8FA7EB75A0F9CF707637F7", + "l": 1024, + "algorithmId": "04A27CFC8AFA9ACF0D08533D0C537C3E" + }, + "fixedInfoPartyU": { + "partyId": "4B84A83EF3399C33424BC95C353105C5", + "ephemeralData": "D7873E5FFDF6D2197560AF5406731601E52805449423826191FAC4091C64A305047093" + }, + "fixedInfoPartyV": { + "partyId": "39AFA578B0E1BACE982B14A1228C50E9" + } + }, + { + "tcId": 427, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A790D26113AE0BB7B6007EC9076547A", + "z": "FD311653EF181E3015A0C50F2D421F0ADE4D4FEEE438677BF805BFC9373D2777718A33", + "l": 1024, + "algorithmId": "951A35A5317B906016295811D11C2516" + }, + "fixedInfoPartyU": { + "partyId": "C14BFC8314E40EE6D0AD1D3D6DA2C31B", + "ephemeralData": "231656D234928BE101477272ECA0E0AC2BC93B3565A515A7AB072787B2615CF02A6F2F" + }, + "fixedInfoPartyV": { + "partyId": "48DE7E68D029011515E5F061BE0C06A6", + "ephemeralData": "B20049AC6298764970D78AFABCC90A2E2FBE81FF50D8D295FCD060157EB8828EF91420" + } + }, + { + "tcId": 428, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6928CF373F6E32EB85E9DF7E045D4956", + "z": "FD626AF986DB357807FED67702C7E6D9EFB818138D802135F978DF2DBA197EAE2FFF54", + "l": 1024, + "algorithmId": "87AAC5B952CC92C8BE1AA3ABF284C056" + }, + "fixedInfoPartyU": { + "partyId": "265BA46A64B4E505242F8E3D09FB96B9", + "ephemeralData": "1907B4DAD39D9A2291FDA2B64AB1AF1C7CD482BECA00F204F842117FD7B8FD8D834EDF" + }, + "fixedInfoPartyV": { + "partyId": "E7A5E9E51320374C2C8A24DEBC70DF1B" + } + }, + { + "tcId": 429, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E646FB248231DFC877C1DB86119D3BF", + "z": "1FEB78BA67AC02F17910C95B4313A205D913376A6D5A65894BD403F8B222FFBF2E3425", + "l": 1024, + "algorithmId": "70E0A74D4569DC291AF4250F75984678" + }, + "fixedInfoPartyU": { + "partyId": "10B8B0A222F3D1E45D21209C70207918", + "ephemeralData": "24C89B4941D6EED5895FB581E43CA217F1553A7A10906C57F5C0A9EEF6D3F112DC5E95" + }, + "fixedInfoPartyV": { + "partyId": "67A7E24077062B5FF28229A6260D0F19" + } + }, + { + "tcId": 430, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C203CA7977E5D6A01BC285F5DA4C2461", + "z": "C67E85DF21438D4A2A0F9B1050AA8A754F0D1BFEBE068B9082CA0288E94A4EB2B02A64", + "l": 1024, + "algorithmId": "6FEEC5E22B4088A99BBA7221CB2A5E96" + }, + "fixedInfoPartyU": { + "partyId": "5BE6179A8F31032AD8C33B16213C15B8" + }, + "fixedInfoPartyV": { + "partyId": "0D0BA3A9BFFB9E203F169FD9B9388E7A", + "ephemeralData": "115B8226608118C89CF6E12575DE0C46F664B4E7A632907F6A0D25D2C63939ECDFE906" + } + }, + { + "tcId": 431, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DDF50B53839282294CEF07D40AC825A", + "z": "356C3E42D6C149318CC3CD49229419D3DFF27855A7843D277BF42B90C34FB5320EE306", + "l": 1024, + "algorithmId": "639FA32F3BE91E928CF9825AAE589B39" + }, + "fixedInfoPartyU": { + "partyId": "C0E3809D57A67489141CBF0BAE6C954C", + "ephemeralData": "D1130165B1EE6C26D4997FFD13D4430BC05B4FD0E8391D6A4791C3F164C4C172630C70" + }, + "fixedInfoPartyV": { + "partyId": "4E86BE3B6CA9D42D48BD07D08AC30832" + } + }, + { + "tcId": 432, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB2A7EB6E219AE71A801CE27ABF47621", + "z": "E27537EA2CEC9C3A043D6E887EB895E67845785925B753BE43B1A77B4F3241A9055E67", + "l": 1024, + "algorithmId": "6D0F35374A416268E2CEB6E976E57057" + }, + "fixedInfoPartyU": { + "partyId": "69BF89B955438B76037827EE2B662FD8" + }, + "fixedInfoPartyV": { + "partyId": "DD865984BBDF142D043A7CE0AE364406" + } + }, + { + "tcId": 433, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2374FDAFCD9A37DBEAEC430679F3AB4C", + "z": "0F138EF092891533449C5E5A79BFBBF92CB5BE88D2CAF511B3E035A07FB700F3C17DBD", + "l": 1024, + "algorithmId": "FB2331FCCD3603EE4256AF6A1F864A9E" + }, + "fixedInfoPartyU": { + "partyId": "0E116410F5DB902644522B94FA2F707E" + }, + "fixedInfoPartyV": { + "partyId": "E182C24DAC8B4C7364956603FE677AD1" + } + }, + { + "tcId": 434, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C24E1A875D5538BD8162A5E7A36FE6AC", + "z": "538E2E2D2A5AD492AE64532D0321CB028A3779782490307C373BE02C8AA2FA2A234DBB", + "l": 1024, + "algorithmId": "B44B49840F507C47B1B82ACB6CE6B5D2" + }, + "fixedInfoPartyU": { + "partyId": "E3DD132C51E66DACC2435B09BA212536" + }, + "fixedInfoPartyV": { + "partyId": "A14E09108558F8F495D6F64A9AF64B8F", + "ephemeralData": "25EFAF97649B3DEA6315244A2FECB997E29ED976F77F81136DBF565E88A6807D5752ED" + } + }, + { + "tcId": 435, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9370AE42A9D9347A37BC39C57707B60D", + "z": "74E2BBFD1740A904364635927C48C518D953E020C8F4D83DF3F7D44129A60652286F98", + "l": 1024, + "algorithmId": "12823D350D752BAB5AE98339B07EF2CC" + }, + "fixedInfoPartyU": { + "partyId": "C8B96C865E7E46CDA2C68D660B2F14C6", + "ephemeralData": "272878EF98AFE8B74CAEA5FF8A7247B00B017FF682F6DF94972470BF1D96F24FCD57D5" + }, + "fixedInfoPartyV": { + "partyId": "0667FC4FEE0E2E69F54C127ED3241464" + } + }, + { + "tcId": 436, + "kdfParameter": { + "kdfType": "oneStep", + "t": "358621A55DDC3AEFC063808B725948D6", + "z": "55B52D627EBBD10B917A1807543EEE0820E77C50B067B32D0D781554B49B7CD4B99FBB", + "l": 1024, + "algorithmId": "CF8C441C10EBB4832319AE45803B7C87" + }, + "fixedInfoPartyU": { + "partyId": "E08B8A880C3573135D05933A53B88B7C", + "ephemeralData": "60C0DB4580086DE39341E0E974E594C3C53311FEFFABF95982A90A01BBB24B7C477E01" + }, + "fixedInfoPartyV": { + "partyId": "760E35C81A0383EA2F51FDD931D86EAF" + } + }, + { + "tcId": 437, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAAFBF0BC598623AA4D833C11DB8C9B5", + "z": "CB6AF932979014A3ED408DAFDD5C26F0296A1094F6C3389D70BB36C1B49A91B86BA544", + "l": 1024, + "algorithmId": "0B951C7D0F54A9F1A255AC0527E466E2" + }, + "fixedInfoPartyU": { + "partyId": "B4046B776B3BC206E7F7141A79DDB1D7" + }, + "fixedInfoPartyV": { + "partyId": "CEA33E24A5AD11AD512ABCC8E7C4BF96", + "ephemeralData": "4C7F9D9784E24249026C28B2F40FE4A63A9BF6DC0F3776D452ECD6752FDC0EF133E31E" + } + }, + { + "tcId": 438, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE58D8D1A6F8E576E5D655656B4AD2C0", + "z": "C467D6699BA96347A93E660FDB4253C435562A49288DA3F190399D34ED70A0800743CE", + "l": 1024, + "algorithmId": "7BFFEB0593452F416C505C2D1F243C65" + }, + "fixedInfoPartyU": { + "partyId": "7CAFBDE842E5C42CCD15E450DB7EE4C2" + }, + "fixedInfoPartyV": { + "partyId": "3C1A279EF3D0A5C6621AF7678B8A94A2" + } + }, + { + "tcId": 439, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6D50C0429D812DDBFD69F1982723E4B", + "z": "E5CA4F4CA9C2ED28156C6AEC2F864925E9993C41F047B49A01598597E7C8FD0744EDE2", + "l": 1024, + "algorithmId": "35118D60C8902459AEEBC53BF22C408B" + }, + "fixedInfoPartyU": { + "partyId": "EC9622960B3C9DBFFCDA5783370A4972", + "ephemeralData": "293DD557067F602E4F70896ECE666131F87D61E94BB5AFC2AABEB2919D57BD5C7CB023" + }, + "fixedInfoPartyV": { + "partyId": "3421F0E810393098D0A56CF2B5884D9E" + } + }, + { + "tcId": 440, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B3D9BF7A98368F1D3B21C6B8D834CA6D", + "z": "75E71A1934531E5D6676464F37C559E09F25B4FF8B49000862A39725848B5BFEB7E4FA", + "l": 1024, + "algorithmId": "D8CC67356F9AF4D9AFEB54ED83B16815" + }, + "fixedInfoPartyU": { + "partyId": "E43604D33B186315410E46E27DCDAF51", + "ephemeralData": "F9DF6EE858923A2DEB22844B9ABCA7E74F3AD418EE486E44062725E5B868AD3459F820" + }, + "fixedInfoPartyV": { + "partyId": "FF222A1BA6FD071FBD981447A4418E21" + } + }, + { + "tcId": 441, + "kdfParameter": { + "kdfType": "oneStep", + "t": "75F10024992664A8324721341CB4BF1B", + "z": "357FF0CA646A6C1DB0CB86D455B5ABCDAF3F298A1D2C90B3C70A2258408CF532B0AD6B", + "l": 1024, + "algorithmId": "60FF1A95A1F4E2CB8804928259FECDF6" + }, + "fixedInfoPartyU": { + "partyId": "6F9B477CA1935929F95B7E8F6ACC6AE7" + }, + "fixedInfoPartyV": { + "partyId": "11C3FCA6B7EC23DB29ABDB57B6C92351" + } + }, + { + "tcId": 442, + "kdfParameter": { + "kdfType": "oneStep", + "t": "469BFC4501F95CBA76BB7BBAD2837415", + "z": "B8E6BC5B14FC139FADD55D7CF04A695C638C021C069F035E7F4D31EEEEC41FBABA92BB", + "l": 1024, + "algorithmId": "98B27B37742C57585AFE0DFB684B18F7" + }, + "fixedInfoPartyU": { + "partyId": "FEDD551B735CFC6DA094865179F8C0A5" + }, + "fixedInfoPartyV": { + "partyId": "1CA2243835DB4F164A5C3EA171DC3F98" + } + }, + { + "tcId": 443, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0D2DD030AC17BCE6B9EC87EF07A098B", + "z": "DC77225BDB00185D8102C8E9A80835C5004034E12904F2D0FBF7CB8BA320F2CDD98B31", + "l": 1024, + "algorithmId": "863431870D67F538DE0BD9D94F6E66B2" + }, + "fixedInfoPartyU": { + "partyId": "D6DF52C979CDCD8725EF666A946658FC" + }, + "fixedInfoPartyV": { + "partyId": "7BAD9F1BCA72459FEF05EFE328BA0CDC" + } + }, + { + "tcId": 444, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D47F8CFEC524527D81CDB5DECFCA1434", + "z": "B7C4F01E4EB806C7F557234F1AF3C558528B66D94C64AB0A7A495E64BDC5B0F517B162", + "l": 1024, + "algorithmId": "B3F7DA621A996FAB4D7D2B1973D8F005" + }, + "fixedInfoPartyU": { + "partyId": "5F4B0519D5C33A947066566F0301C3B1", + "ephemeralData": "E4DA58BBC1DB815F1586825F02E38864169AADE7195CFBA65DF6CF59D2C7966F0F263A" + }, + "fixedInfoPartyV": { + "partyId": "6CEEA9DE99CA085F9FA92EFB1A48B5C9" + } + }, + { + "tcId": 445, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1802D07B86437BFF0ED20896928ACC4F", + "z": "FF9187AC0F29CAE2649E2BDE346C975ECB1728E8502BEE8ACA199080C3963271018E92", + "l": 1024, + "algorithmId": "8ED51ECE92AA8A7C8BB00E5E63ADFDE6" + }, + "fixedInfoPartyU": { + "partyId": "5E5B2AD320473D7D020A09B95C631D40", + "ephemeralData": "A7ABCB6EB7907EE3A1B76A8D5512BAC4CB102B5C021E0967B6E031934622592680A404" + }, + "fixedInfoPartyV": { + "partyId": "A8C3451E739A542887C91DFAE6D911E3" + } + }, + { + "tcId": 446, + "kdfParameter": { + "kdfType": "oneStep", + "t": "828809F5F11755F015CAC92988D52559", + "z": "AE141EE09C928C0FFFAEDB29EA7974E589C5324369427D2001334CA6C06AF587CE10BF", + "l": 1024, + "algorithmId": "5CA508A86E96A7EA9183A364F0C3A6F3" + }, + "fixedInfoPartyU": { + "partyId": "BED4EBAE98AAC8F53B2F64EE671D3997", + "ephemeralData": "606CD3B72451163161F43D45809A5E1409D19368012097BA1AB06A46ACA426460DA280" + }, + "fixedInfoPartyV": { + "partyId": "1B2FA8A75D8115B3842071947168067C", + "ephemeralData": "ED0A35E688BA96BC30CC163DA375602A6185C02BE6628C19307B433108C821E5D1A9CA" + } + }, + { + "tcId": 447, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FCCAEF50190E3DEB34269EB18155242", + "z": "348FD47FF040DE119D6AA46F15EB98A4F54927F7A8159DC6EB126F7C0A36DB95267C03", + "l": 1024, + "algorithmId": "E9CE1F5F370FA02DE6416EF47C1DE6D9" + }, + "fixedInfoPartyU": { + "partyId": "DA983AC8157B7ED8A898470C0E38F9E2" + }, + "fixedInfoPartyV": { + "partyId": "0DF26C212F9EF89870F0B66618E628B9", + "ephemeralData": "74E7088812B778F94F739E47437B1BA9ABC5446545D7D55429F13C42005CE93AEEFEC6" + } + }, + { + "tcId": 448, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A958678439C0FB399BCA94F119786742", + "z": "403751C799886E9465D0B3373D6C34CDC3C19BB787CA9CA5F97FDABE4F7D87DE676A12", + "l": 1024, + "algorithmId": "9425E07852E1AA2F1DC12F909F6B7DCC" + }, + "fixedInfoPartyU": { + "partyId": "9E09736EFF259B723EBA17C40C46790D" + }, + "fixedInfoPartyV": { + "partyId": "645332E6524FBB17B72B302DA6758AA3" + } + }, + { + "tcId": 449, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF2AA5697E6A7564602B5C817FF42876", + "z": "2DFE32A11121075A5820BA4C06581D02AEFA3618FCC67080A01B93A4CBDC6F6B5E5760", + "l": 1024, + "algorithmId": "E6685C508EED5D477A9F71CFBC81E6A9" + }, + "fixedInfoPartyU": { + "partyId": "4751799DEFABBC66EC505D9A76FDFDF8" + }, + "fixedInfoPartyV": { + "partyId": "724DFE09719D70834FB0125007D128F7" + } + }, + { + "tcId": 450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B52D689A12D31B54F76B276C68E0C35D", + "z": "9D70197C78EEA1A335FAB361680D9A605641139CA641FABF1B60D4F6677554FB3C8F23", + "l": 1024, + "algorithmId": "6FCBEBCBC12647E4120174BE8AF11E89" + }, + "fixedInfoPartyU": { + "partyId": "FF377513FCAB0C0C93EA5BE81ACFAE3B" + }, + "fixedInfoPartyV": { + "partyId": "89A59EE7E554C43F5A48DB27161BCD12", + "ephemeralData": "0B6F72066D24AE9597A8C086D31487554B6A1FEF6A2D22FE07555B79AF046E2644ED6A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 19, + "testType": "AFT", + "tests": [ + { + "tcId": 451, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A72B712E9784C0EF4BB3D6253AED45B", + "z": "39A371A3FDE0731219D670CCCE15636C72D1687CF1D87749617944647296", + "l": 1024, + "algorithmId": "4D1F56B011F91533B7231CBDB1F29CB1" + }, + "fixedInfoPartyU": { + "partyId": "53C0707A378BFAD4DAF23D7A9FA37CA4", + "ephemeralData": "9E9FE5D1FA3A702EF732C5004D9ED3D7BD7B64F1607D8301EA43D315E09C" + }, + "fixedInfoPartyV": { + "partyId": "7600DDFD1BA29160668E9107DA8DB2A1" + } + }, + { + "tcId": 452, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8394A33F5709D711CB7882FCEF7AA95C", + "z": "C172E37AFB6773EA6BB96C7206310F619A9EBFC2537463161E1E9C2F5708", + "l": 1024, + "algorithmId": "4FD7B817CD480550C6187CBA8BC7DFF5" + }, + "fixedInfoPartyU": { + "partyId": "B9C0A97A17923D303B89BFC5C570AD87", + "ephemeralData": "F0A2D934D5F686A1D5D84E14CCB3F033A42335BC6D9CC928303925FA7676" + }, + "fixedInfoPartyV": { + "partyId": "05CD5228FC487C4D9B786C03CDADB341", + "ephemeralData": "ACDC06977E1778C7A05587092BAC264FFB642E74D4A1546AABDCC7265E99" + } + }, + { + "tcId": 453, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B3BF800B9CE587AF4724DD65A9D5D5A", + "z": "BE5BDCE1A5A97B88E095164D694DD1554418315676B3682189D4AC646166", + "l": 1024, + "algorithmId": "638F4FA3EB169CCAD2772A355B991BC9" + }, + "fixedInfoPartyU": { + "partyId": "40F75FA7353CD18FE3EB4185CA61D1D1", + "ephemeralData": "395FDA7BDA6AE614BF4ECF85A5F50C45A72F02E9D986B624AB976BFD0235" + }, + "fixedInfoPartyV": { + "partyId": "E00268FE133C253A525ED9ABC9688428" + } + }, + { + "tcId": 454, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E2377572A7CA1DF81217A9AFD513973", + "z": "39FE27859B0749D0DBFFED5D907AD33D276EEAA71074B9A4C5502687822B", + "l": 1024, + "algorithmId": "9A26FC189B60A90F39647BC8651D28C4" + }, + "fixedInfoPartyU": { + "partyId": "36D38A889794AE49FF75966F328597E2", + "ephemeralData": "536758AF467A5EA7B73B650F2E3ABB7D3FB41F3DB14F2F351AC7B0A863B7" + }, + "fixedInfoPartyV": { + "partyId": "E037E51F034F7C1B8955C3CE88D07646" + } + }, + { + "tcId": 455, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9AFA94CCBC00C3C08BF4C79F5CBF9CC", + "z": "EAC7F955E738268E7997E3EB8539E7CDF69E84DE4FB8A2D3F1D15F90A550", + "l": 1024, + "algorithmId": "2DA3CDC198A4972180B5880692EFF872" + }, + "fixedInfoPartyU": { + "partyId": "3B6D293D2825DB5C443D1B47BAE87834", + "ephemeralData": "3B6EBE1029F5A9B2AFE49C661ACDDBD99CE9276A16D752CCBDC691D93E45" + }, + "fixedInfoPartyV": { + "partyId": "1CD30470671CBA6E59EDBA0F7EFDB864" + } + }, + { + "tcId": 456, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5D1406A2C1728C9122E79C41808FEF0", + "z": "1D6F8E7B4294FCC1E21473ADF14DA4117D557E46F65C48B6544BF3506212", + "l": 1024, + "algorithmId": "3F5D5B3C42079041554986B64555C376" + }, + "fixedInfoPartyU": { + "partyId": "AF33CDBCC0479BF36A0BDA3061BF01EA", + "ephemeralData": "26542C11FDE399374DF4BF450C3ED928D8095E53A02F915D9279DF73164C" + }, + "fixedInfoPartyV": { + "partyId": "0BB73A00D0626E713EFB772F85E5C9F4" + } + }, + { + "tcId": 457, + "kdfParameter": { + "kdfType": "oneStep", + "t": "171AC9731814FE42EDA133EEF968C9A2", + "z": "127888396BFA29B5CF48E17100577A782BE49DB0185840AA3E1B5D9A5A8C", + "l": 1024, + "algorithmId": "3244E9185023E8C2692B8D877C599C5D" + }, + "fixedInfoPartyU": { + "partyId": "0482D5A0281F6316E74FBEC40CCDF8F5", + "ephemeralData": "2E1FC20DE9702ABA67D8CFB82345C72104AF6270A4BDCF385773C0998516" + }, + "fixedInfoPartyV": { + "partyId": "84DF19063D95A08152DE032262F6A7E0" + } + }, + { + "tcId": 458, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D46285DDE65E6C42EAA65296C33ED0F", + "z": "B60C3DC74B1E1FEFC6126076260307081FC3D55CC1590BE00D8AE3379670", + "l": 1024, + "algorithmId": "DA243ACCE285F655049472248C7AC884" + }, + "fixedInfoPartyU": { + "partyId": "D5086713280D014F4102367217B02DA7" + }, + "fixedInfoPartyV": { + "partyId": "FEA2453EC418A6A95AE5B236DB5EDEA5", + "ephemeralData": "107DEA90C9BDCA7A70DAAE5F22E1481687B3EA5374D7C104D1ACAB242F1A" + } + }, + { + "tcId": 459, + "kdfParameter": { + "kdfType": "oneStep", + "t": "453F2C4587E3F9819704B1E7EAE738E9", + "z": "C4B4F1041ABBBC8B17B75962EA59A178947B2E8D5A2708DB5C833BA5B162", + "l": 1024, + "algorithmId": "0BFF6A8FE64B7C4D254C97EB85B1C06D" + }, + "fixedInfoPartyU": { + "partyId": "D6238CC2DF5D8C87C4C4DE84063C20DF" + }, + "fixedInfoPartyV": { + "partyId": "53E9586980E8264A8EE6CA5B2E4181EC" + } + }, + { + "tcId": 460, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CE34F4E6EA0C916B3BA2D01099AB3B9", + "z": "6F44E3337F4554B41C97F1C7BA7D8905C7E11800AFF69822FEAB5D8DEF31", + "l": 1024, + "algorithmId": "4BDDB31029C1B10615DDE4AC49320082" + }, + "fixedInfoPartyU": { + "partyId": "A22D52130190BA9F7F2521F745CDB6C7" + }, + "fixedInfoPartyV": { + "partyId": "543FCB2B18393A15E4F28893F116C34E" + } + }, + { + "tcId": 461, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46A63E52F8FA17A3B48C4B8F1207B865", + "z": "5C98482E78E8FF0C5215DA2526923C1C999E123A48A21D1FC829650AD1F4", + "l": 1024, + "algorithmId": "A55C8B7B6C198E1A0455925FD22D744A" + }, + "fixedInfoPartyU": { + "partyId": "79104670E9999D7CF681A978D2E8DBB2" + }, + "fixedInfoPartyV": { + "partyId": "85D799B17C0AC4A131CC192C66BDFB0A" + } + }, + { + "tcId": 462, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03F1349420B35EDD4869E553C219C272", + "z": "7E604080CB0EF3494E7AED54CAC9267F8BB2A4B6D325BF2BF30703DE2FBE", + "l": 1024, + "algorithmId": "086BFB2C5F65A9EE479E139E5E1377D8" + }, + "fixedInfoPartyU": { + "partyId": "C42F809D5A977E01671CFDA061B7BAB3" + }, + "fixedInfoPartyV": { + "partyId": "5EEA733BF5EBE6708904DFCA568CDF52" + } + }, + { + "tcId": 463, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0703D40086032D6367D625B9107B1E15", + "z": "31F29CAA161FB3840FD93E9CC3404AD75CD04768C22825672A74F0D8E5B6", + "l": 1024, + "algorithmId": "0C9298CC5FA8E6F4C9B7F6CA0E7EF6D8" + }, + "fixedInfoPartyU": { + "partyId": "8FBCF7E756B6EB97A2C0E7A9A0E21FC9", + "ephemeralData": "288387B12B9D89F0B22F6448F8F732CA7F5ED12560A62DC5383C45B95607" + }, + "fixedInfoPartyV": { + "partyId": "D19B8602731DE78CEB3946A37F90F68C", + "ephemeralData": "B0BC47616C0BF984DCDE402FD47EAA3D8610A72F6654682A74FEF023EB6B" + } + }, + { + "tcId": 464, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1B427EAA67CBFC017FE84FD89F67B1D", + "z": "84FED77E3A400C6FE2F28212177EF9EC88D0A2A4306B8CDB60319C8137B9", + "l": 1024, + "algorithmId": "138487AAC9EF9EB1292B7A963E513F90" + }, + "fixedInfoPartyU": { + "partyId": "5CDFCD1E699FBCE2E705720FFDEA8A3F" + }, + "fixedInfoPartyV": { + "partyId": "8E04E2F65C75C8D7FF3115D32882D237" + } + }, + { + "tcId": 465, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5F7F9A0E0A225B464476C0CFDC30A63", + "z": "675E87FFCB40FB7CB44A304EC5602E86ED811170F9D95F259117365588BC", + "l": 1024, + "algorithmId": "8F713676BEC157A92C4700ADB4308768" + }, + "fixedInfoPartyU": { + "partyId": "35FC122463E4D1783BE1EE02FC5FB08C" + }, + "fixedInfoPartyV": { + "partyId": "019E924BF5590B087AC7ABDB7F739FC6" + } + }, + { + "tcId": 466, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E849F7DF03E67F4F901A004E5A94CE9A", + "z": "014B642C5B859C2E1E0EF578C855B4111C82F1350B3AAB4D1909106C35BC", + "l": 1024, + "algorithmId": "49EA7BF4803FD892680531E37CEC9F9C" + }, + "fixedInfoPartyU": { + "partyId": "28CA421FE9818140DA0FBFC4568F9A89", + "ephemeralData": "FF2573F6877BA551572B629B823860E8ECAD8BCF079DD9547F17AE316E33" + }, + "fixedInfoPartyV": { + "partyId": "4E3FB7277C3A1A725319F6F94E5CD2EB", + "ephemeralData": "30AF288010E546F2F35F2FFD1C9EB4E0888F338C1CDCE1C52EC0E6899894" + } + }, + { + "tcId": 467, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD44ADA4B9FD9C430AB9732732C6143E", + "z": "2D74B7FE76C289E928BB11218C417331662279E32B25D4A222346BA92134", + "l": 1024, + "algorithmId": "F4D7546B8FBFAC92B3E7715441807CFD" + }, + "fixedInfoPartyU": { + "partyId": "408FFC0CF1721BC06CAB495AC268E40E" + }, + "fixedInfoPartyV": { + "partyId": "60EA24BEA820380C41328C17788A6BDC", + "ephemeralData": "02C38B114E813558F6B5E94C218E82F9ED1BCA9E05CCD5C8E70B5F10FF1C" + } + }, + { + "tcId": 468, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB3563A507E02E78D90D2769435E9370", + "z": "3E8416952FAF4071BCA25AD6D6DC277EC2B4A361A240E0EB378A12F53A33", + "l": 1024, + "algorithmId": "8088ACDF623ED38DCF4665440E08BD68" + }, + "fixedInfoPartyU": { + "partyId": "69C6C6027EA738F575B7A52E629E2A2A" + }, + "fixedInfoPartyV": { + "partyId": "5BD5A25B62B5C87639DA8CCE2BB9AFB5", + "ephemeralData": "9A1201DCB728C39D5B13CA66DF0A4679AABA23B39EE06670D89452053777" + } + }, + { + "tcId": 469, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CD50A23BC94B0D09A4D6D1C584FD261", + "z": "5D1A0E1E6C22B17E9DB5036CFDDFAD7A4BB2303B5E9C36246A8A5D7DC725", + "l": 1024, + "algorithmId": "7E4FF739B1FE8EF3CE1AAFBEEE076F1F" + }, + "fixedInfoPartyU": { + "partyId": "1D31BDBC18ADF7F4F27A718B71B9E9AA" + }, + "fixedInfoPartyV": { + "partyId": "1C164C1D3BCB4987D7D19E26DDE73584" + } + }, + { + "tcId": 470, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5C1D914D9FC1D2D05B17FBA06389F2C", + "z": "4290279D526FD31589A4582E02557D825B62112D78797B3E8DD2468A2A3A", + "l": 1024, + "algorithmId": "55D1FE14B375E5D0121B8C44CA582053" + }, + "fixedInfoPartyU": { + "partyId": "9F52418CBD609E838B74EA788F24F6FD", + "ephemeralData": "FDE7F78F7FCA0997E2D3ED377B37EA16EF7FD6B714B04169AB12837E9AD1" + }, + "fixedInfoPartyV": { + "partyId": "B4BCD5C74EBB4AEBBE118DCCAFCF81D4" + } + }, + { + "tcId": 471, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1728F22CCADF78CDA42CA24D75AA5019", + "z": "81D791EB5FE8CD5BEC41369A9A2A78E8FE60CE29C134D951395A08C4A4F9", + "l": 1024, + "algorithmId": "5374BAB722105FD9F34BB70AB903146F" + }, + "fixedInfoPartyU": { + "partyId": "5E788C41D0FEDFF96BF51328F836E6C7", + "ephemeralData": "AA7038BAA1BE82D4D6689742F9B302C04DFA20F7490DD6F25891A06790CE" + }, + "fixedInfoPartyV": { + "partyId": "4BFDCA1B22438E35E06F011C1C8A54CE" + } + }, + { + "tcId": 472, + "kdfParameter": { + "kdfType": "oneStep", + "t": "398199778F11267EBD69EC617B729ACA", + "z": "31FA4678F0A8E923A9705D31EEF02F081ABBC95168F0277CA00F1288F248", + "l": 1024, + "algorithmId": "B933B34BB7EBB705A9C00B6CF6AD11D5" + }, + "fixedInfoPartyU": { + "partyId": "A09AF98A4A1D29AA202B586FB2366B31" + }, + "fixedInfoPartyV": { + "partyId": "2C36281E699ECE9EC82368899EE11E64" + } + }, + { + "tcId": 473, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5FC2D52A5440024010AFB4330DEB1450", + "z": "B5B517F9CE103FF6DF3399C5211582615AA0E307425EFD8D5741C31168D6", + "l": 1024, + "algorithmId": "C71D3D6A983B15D95109F6193ADFBFF4" + }, + "fixedInfoPartyU": { + "partyId": "CBACF1AEED86F985592C01C2DC520427" + }, + "fixedInfoPartyV": { + "partyId": "47765D73B3D172F72B290F083EBEA0E6" + } + }, + { + "tcId": 474, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1941E3ED5AB4AAC85043235D7B011EF6", + "z": "5524A1A8D92797B301E971D34D383C10C154522922983D3B42C0E8B9C644", + "l": 1024, + "algorithmId": "70923D5F195A0CF8BFB0D94C702A6ABB" + }, + "fixedInfoPartyU": { + "partyId": "F0F93BE3C3E3B3AFA98498D440CB15D1" + }, + "fixedInfoPartyV": { + "partyId": "199999E6C02112432FD010A022779A06" + } + }, + { + "tcId": 475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "264F333988614DA3D3FA2A284FF647DF", + "z": "DBC80A3EBF01743DA64716D31C20E96A21C091B707564D03990E3B3599D5", + "l": 1024, + "algorithmId": "0078ADD8F2F8CF0019642A57E292FB9E" + }, + "fixedInfoPartyU": { + "partyId": "687320F9A84346F13D773E1CD27FCDE0" + }, + "fixedInfoPartyV": { + "partyId": "84F95A4F3AC15B2FDE395F1D6777E282" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 20, + "testType": "AFT", + "tests": [ + { + "tcId": 476, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A3F4472A10F51898C4060A59B639F4E", + "z": "4F744F04B025E9B6902C1A584AFA4142F1E0370D1521C13EB0C107D0AD90871C", + "l": 1024, + "algorithmId": "A928D7971F4B1093E7F01301AE76F6F1" + }, + "fixedInfoPartyU": { + "partyId": "517F2B3EE45DB3DE46D87B471003E0D0" + }, + "fixedInfoPartyV": { + "partyId": "4DEFAC11E2E6F7FF5B0212F44A315F1E" + } + }, + { + "tcId": 477, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B0E373BDC07CBD7655E2B1001A50CCC", + "z": "7D017D43C984D7CCACD5CE925746D1D635A10A57F20B07EA792306CD83AE0C70", + "l": 1024, + "algorithmId": "FCE262CCF510CAB53D5A4A945B3C2AD7" + }, + "fixedInfoPartyU": { + "partyId": "CC0D6B1F09172CE8C52E5FB3C084E4BB", + "ephemeralData": "C9608CCCB7656F80A27781E18572368E056C355A82F6B70236A198B6F16905D2" + }, + "fixedInfoPartyV": { + "partyId": "F68E4338A8B08AE34C058C9777719FB8" + } + }, + { + "tcId": 478, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6717E196EC834B4FC81195CC23B4088", + "z": "3A22F7ED0776A009402FF42A0854023A92093733833420EF86A927A9A349D70D", + "l": 1024, + "algorithmId": "D8523F2A68D754B83B65B63C2A9C8A59" + }, + "fixedInfoPartyU": { + "partyId": "7DC8FDE43CD2B497612EAEF6535B00E3" + }, + "fixedInfoPartyV": { + "partyId": "FEF898A1B0099A09A819AC6929163436" + } + }, + { + "tcId": 479, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14DBEE172C801B3664C8FC87F3C9110B", + "z": "2B3D417A1173A813530CA25B48FBC21F814BA74A36CB682FA9B788AEC860B352", + "l": 1024, + "algorithmId": "B7E22E0D11B65519556EFB2DAA0CDB4F" + }, + "fixedInfoPartyU": { + "partyId": "8E1992301FC31F5983081ACD5ABEA17A", + "ephemeralData": "8F8022EDDE3CEE78B905B3F1E9A9BBA02AEE2EA51506B50DA6B0B992F2550CFE" + }, + "fixedInfoPartyV": { + "partyId": "F0B46E0265C0B30EE8E738E8347C42E4" + } + }, + { + "tcId": 480, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9D387E1DECA943D2A8DFC805BFE16B6", + "z": "50E8EAF2C7E1DEB5CC39C0ADBDAEC39F326828BE8A6B00986AA20DB839063376", + "l": 1024, + "algorithmId": "6C5219D7954145D7C9C8BC5C1E0943C9" + }, + "fixedInfoPartyU": { + "partyId": "146B039080C29473A8B41912A31F9772" + }, + "fixedInfoPartyV": { + "partyId": "17AE77DA2CDA8339FAB5FC16D81D3F97", + "ephemeralData": "141D987CD995D8A9699B5C77CAAB5B9BCC72B23CB9FD1849050E861FC4092718" + } + }, + { + "tcId": 481, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D29A23D9AE9EFC635B1C0C5AB29D3750", + "z": "A9FB85B54AF6CA698F27D8EE9A33AA7A69A6518DAB48EFAD8A2A0EFB41230C0E", + "l": 1024, + "algorithmId": "181B6CB5AE85ABCCD53453475A25869C" + }, + "fixedInfoPartyU": { + "partyId": "12CD70C46B05120C421CD948A8A0B211", + "ephemeralData": "FCF9CABCD3DB8DF08DA020FDB0DA999EF327D5DF1730D794E435E3FFF02F3434" + }, + "fixedInfoPartyV": { + "partyId": "3D2C2AEC01B3C46ACE11B9CC5180F4E3", + "ephemeralData": "61C6A19F6C39450C88E527D655EA3434DEC928620772FFA193145862F3D62577" + } + }, + { + "tcId": 482, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B73C9D90328409922447AD50D50AE5C", + "z": "17FC12F28AE1C913A42480F80228C3FD3DFED621D67137ABD5A025AE37C26DDC", + "l": 1024, + "algorithmId": "DFA5719DEF94E2E0D6151BCA7AEB571E" + }, + "fixedInfoPartyU": { + "partyId": "C2006E089E617B0D37306DAE3012096F" + }, + "fixedInfoPartyV": { + "partyId": "3A99E21644E5241E485B9371A11606EB" + } + }, + { + "tcId": 483, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB9D8DDA453E897964ED5A38DC41C720", + "z": "229BF8A15C0147770B9060D8607EC61C1B066699ACB7164CB4BDFFD14B571F06", + "l": 1024, + "algorithmId": "2DB48AC0FB814BAF753DDFE57BAB6466" + }, + "fixedInfoPartyU": { + "partyId": "13CA41A2228F8D09205B6833A1F5B5AE", + "ephemeralData": "7C35686ED04B565E6AB3E76570E3FD957B541361FE8AD44B8FA5F23D0E132823" + }, + "fixedInfoPartyV": { + "partyId": "79A821D194E7114FC3711387CF7ED8EE", + "ephemeralData": "AD3C981E005320208C82F3849588100D9EE221D5A7E6B0A9753B1DA2E7430CA7" + } + }, + { + "tcId": 484, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A1AC9E862869011FA053133AC07A1DD", + "z": "D4A556F15C028C0F1F0F6C91F70989839A250A42F10293BF2219E968E4EAA0AA", + "l": 1024, + "algorithmId": "379E781D258D1F9D8EB877ED13871450" + }, + "fixedInfoPartyU": { + "partyId": "06B8142E9FEDE588F4CEB98E7C7A4305", + "ephemeralData": "D4FBF16F7FAB6F14BAC90BA88FFEEB2EEE6830BDE7DBD5CA913DB822C05FDEEB" + }, + "fixedInfoPartyV": { + "partyId": "B5CA0DF3E3C4EB3C8AE214467706F0FB" + } + }, + { + "tcId": 485, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A1F49D8A607FB9E6299E37269FF9CB7", + "z": "3CF540206A0AEFA84D1BFBC4073CA14103CC6B179314A25565C5D1182A341419", + "l": 1024, + "algorithmId": "B8C5638D648D9D86CDE72765A8514231" + }, + "fixedInfoPartyU": { + "partyId": "324A05CED01399D7E5A09B2F784A127D" + }, + "fixedInfoPartyV": { + "partyId": "AD14455AC72881E6F91EB6170D366404" + } + }, + { + "tcId": 486, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6AAD53E35FFDD7D027E356C7BA1BBF3", + "z": "EEDA62E06DAE785EB2B07B69A3D932824A0C9D679AD677BC8D4AEF7917D29DB9", + "l": 1024, + "algorithmId": "00C2CCDB9EEF3FC31998DF4B2B7ADCE7" + }, + "fixedInfoPartyU": { + "partyId": "DF9BE45EF4BF14700386ABF93DE41895", + "ephemeralData": "DD7A53BBBC5533D6ABD750CEB84E05E89D5AACDD4101B920ED3D6D06FB0CB3B4" + }, + "fixedInfoPartyV": { + "partyId": "6792C285F2D950A7AB8EF3CDAE2C9BCE", + "ephemeralData": "A01426E5777D11A276F5CFAB804173243ECC318118D32561DC6303264CDE7557" + } + }, + { + "tcId": 487, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD7B593F170C1A8A2C2C4D8D0FD55ECE", + "z": "3569662DB093AC2ED751C40150308071DB2036FD93BE2BD5864213D7E99369D3", + "l": 1024, + "algorithmId": "6ADDE9F4B07FF38EA97D39CB1DD85A24" + }, + "fixedInfoPartyU": { + "partyId": "532F988F61394F1BBA92F3568BDDB178", + "ephemeralData": "7D9547EF8BB13475ED7D8595594B1B88C26F5991802BBBBC180ECC2A28BFA530" + }, + "fixedInfoPartyV": { + "partyId": "F68A3A67379973CEE54D0CAAC0FCB740" + } + }, + { + "tcId": 488, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B973FEF2E01C3FAA28DFCD78C8687554", + "z": "E5B1F4F2A440B9E85E097A5424C4DA5CBAA8FEE75BFA5C430FF6A7B0D61B7A39", + "l": 1024, + "algorithmId": "8AD86ABFF0219FE4A3D50FE3EBE1C82B" + }, + "fixedInfoPartyU": { + "partyId": "AC4083D31C84587FACD9014E45B7672C", + "ephemeralData": "78648AECF5FCA418005A6B63467F2F14AB4E1D5267F6EDBD71BF644F3A188462" + }, + "fixedInfoPartyV": { + "partyId": "3B2C45E21391D3F803DCAB9970900C94", + "ephemeralData": "78D21D46DA8F4E7C536812DD8D45D27D893284C967AA221729F73465C053BE71" + } + }, + { + "tcId": 489, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27B6590659940EFE8E9A4F647B8C694F", + "z": "04039A925AA20520D8D4369D50ACC185E93D55BB880137316AD1938D30C8403E", + "l": 1024, + "algorithmId": "B8C26648C69D1A5D0AF42669A193BA27" + }, + "fixedInfoPartyU": { + "partyId": "A8D2114D2D492297BC2A919E08887564", + "ephemeralData": "330F8AA7ED7AB9EF97F44B35CD4524FD3397D777F08810F06B078A66AC44D3AA" + }, + "fixedInfoPartyV": { + "partyId": "4A20CBA280AD9C81EBFE57BEC6E789FA" + } + }, + { + "tcId": 490, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE58702B9B3B5CD750DE8155C9D03C49", + "z": "F8FB9BBCCE0613E549584621C9375F2D3673B4958B0598E5CB03BDCCF665EDE3", + "l": 1024, + "algorithmId": "5483B02633B798682637F72BDE63C3CA" + }, + "fixedInfoPartyU": { + "partyId": "23BA537CBCE405388C878D4A3950C93F", + "ephemeralData": "5892CC9C621B90ABD7A0EB3A64CC4B0C9D490F34B6B9111C949CCC8E39CB6E05" + }, + "fixedInfoPartyV": { + "partyId": "F604D6CD7C2EA5B3FCB0BE2F2DB6E5E3" + } + }, + { + "tcId": 491, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF43A1E7E87184C2DE407DF597CD5228", + "z": "B05E03AC7003D13D92242C683C690B41951B55C3B526C4863978C9DED32BAC73", + "l": 1024, + "algorithmId": "1A0D88DD0F9E4E5246EB1DF5C5B07D10" + }, + "fixedInfoPartyU": { + "partyId": "6C1A8A57311093D95F3B3A5D309BBE0B" + }, + "fixedInfoPartyV": { + "partyId": "65838D07C60D95998747770637DBA6DB", + "ephemeralData": "8C06D2982EA4C4A953470478835CD10896B6B23AF31BD4620AD00738EABA05AA" + } + }, + { + "tcId": 492, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C784D5745F911F731CD54973EC50CCB", + "z": "AD83853A048555FD4DADA999288788936548FDC4957172BF569177867089809C", + "l": 1024, + "algorithmId": "8639B609E7EAFBFBDACB34167C86CAA2" + }, + "fixedInfoPartyU": { + "partyId": "F96D38E2257E6F7A54FFC92C884ACE82", + "ephemeralData": "E7C56B882A2AAD3389C939BFB3F612C4EE391B8CF231723BD3F38250C5CEB293" + }, + "fixedInfoPartyV": { + "partyId": "53EE62CE56F1B5574B31E7B5D3A73B8B", + "ephemeralData": "BED1BB73480A5BAAE1DC386674506649ADD04AC858A29244E85A094677251E36" + } + }, + { + "tcId": 493, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46193928CA3D29DED66E062D31AB3B3D", + "z": "96B02C21EC8163ABD0D67BA292828F797CB0FFF730839325D7119F2952AE5A92", + "l": 1024, + "algorithmId": "1BBCF79A850DFED0D9F65E15603A1AD7" + }, + "fixedInfoPartyU": { + "partyId": "DFDF3E83990BD32A9EF16A493FF3C7E5" + }, + "fixedInfoPartyV": { + "partyId": "E3F9B6241DC6A6DD8416A386B79851C0" + } + }, + { + "tcId": 494, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8882991A2BD4F820A6C468B3AFAEFE89", + "z": "F595124F96396CFD3BC59F4A172EDD8B3950915F3F04B36C1041643175CF5EB5", + "l": 1024, + "algorithmId": "50450FDBA4ED6E8EB03D248E5A12C1A4" + }, + "fixedInfoPartyU": { + "partyId": "8E47856300439EBC251FCF407DEE65EC" + }, + "fixedInfoPartyV": { + "partyId": "1D5AC0AB2BC5789398163E6A6A3DA09B", + "ephemeralData": "E9DD11FA5A57ADE4D727818A5871B4EDAA2477D8C55CAC5A09BDBBF8D3A3F952" + } + }, + { + "tcId": 495, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC02234B5149D40D58F2E7CA878FD3D1", + "z": "4E0C93610D54F8C5344B9BB5087451892305345BC5ABEFBBBCBCE7B800D531EA", + "l": 1024, + "algorithmId": "44ED97F4911BAA7258E4ABE26151B81B" + }, + "fixedInfoPartyU": { + "partyId": "D8FD2D3BDBCCD317EA8BEDC1C3A66EA8" + }, + "fixedInfoPartyV": { + "partyId": "E2285BAE93BF3AA1E54EF7FAAFF9C726" + } + }, + { + "tcId": 496, + "kdfParameter": { + "kdfType": "oneStep", + "t": "261D306B3C5948D0E1071BEB5396B38A", + "z": "6CFE740868C0F8056E6CAAF377B5C11D4B9522CFB8F625125625C0033FD0C395", + "l": 1024, + "algorithmId": "AFFD470D40840C9C69B062B091D90D89" + }, + "fixedInfoPartyU": { + "partyId": "AE124F25C6403F8ECAABBD7649AA5EEF", + "ephemeralData": "E6B648A669B4E9EB165FD54B7770C889269E4DBCFF0B3A6256EB32A67AA91F0D" + }, + "fixedInfoPartyV": { + "partyId": "F1D1CBA08313F2BE2C48F25555FAB512" + } + }, + { + "tcId": 497, + "kdfParameter": { + "kdfType": "oneStep", + "t": "300DE8C4DD4212688DDB4BC0B3742ADA", + "z": "50E2F836D7852FB8D5B2E72A9F9F4DEE903837EAFB7A8B87E0B1460868859034", + "l": 1024, + "algorithmId": "1F3ED19E2B440F39A7D579EAEEBD9421" + }, + "fixedInfoPartyU": { + "partyId": "30A2DFD1342B94799416D64C0DF61302" + }, + "fixedInfoPartyV": { + "partyId": "A98EA9D9C0D8AFAFDE4D066D4877EEB2", + "ephemeralData": "9DEAA0D33D269D2FA90D95076B0984FC548DD8047EBB96250B3718432A41D6F8" + } + }, + { + "tcId": 498, + "kdfParameter": { + "kdfType": "oneStep", + "t": "598DCFB078BD5A8A59F81F518EE6965B", + "z": "A302A77B080DD98B34C698190D9B40F2182A6768B2BE64072DB3190E45132181", + "l": 1024, + "algorithmId": "A0C6A03DB7EEAA73B21F396298328353" + }, + "fixedInfoPartyU": { + "partyId": "23F14560EC86B9E34192818C1C35951D", + "ephemeralData": "E846D4DA12602A59AE718B0E31D2951B6260B1AA0B35B9DE5AE93F7F346F85A5" + }, + "fixedInfoPartyV": { + "partyId": "0838365DC7AEC14C569D6E9221D6D8EA", + "ephemeralData": "F22350A9DC4CE57CF8ACCF3FDAD2214C730980D7DE55DAC1141A21F11EAF448A" + } + }, + { + "tcId": 499, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FCF123FEE2EF57F8E0C7AACD5B9EAC8", + "z": "1F9B13FB184925273E418008E3FC61EC35F209D4F5221D8A2EE171B78F6C3C88", + "l": 1024, + "algorithmId": "6351E2D0715CB531DA022A0DC8B433B8" + }, + "fixedInfoPartyU": { + "partyId": "75BA17578E4A8B0957ACC17694E8DDE5" + }, + "fixedInfoPartyV": { + "partyId": "827632C92791672EFB0876EC15DD02F8", + "ephemeralData": "D3583F2F1B594899E066F909BD110215D36B10E6B2357DDAA5B42ABF5E20F60F" + } + }, + { + "tcId": 500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED70DCCFAF34388B676FF04E2E48B00E", + "z": "198CF883131037C064193C171A3C189FF669FFBDEFFCCE06F4E1AD0E82BB65E0", + "l": 1024, + "algorithmId": "3BE412B4E1341AF55CA8B84C9C9F3055" + }, + "fixedInfoPartyU": { + "partyId": "8CAA7FF3802854CF612C62564E0046AA" + }, + "fixedInfoPartyV": { + "partyId": "410D71CE9CD7C1564CA4D5559FB6103E", + "ephemeralData": "1AE200C454A000015C705579D5E84444838D41719814C34BDBEC3D9F1BFE7644" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 21, + "testType": "AFT", + "tests": [ + { + "tcId": 501, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F8F198C1F3A7332C97F76660E92CF352", + "z": "D1F031ABC878D20D9953FA45812093DEC26CECE6B78952881755950FDF91", + "l": 1024, + "algorithmId": "091808F1F8A80380DAC59764D75F7038" + }, + "fixedInfoPartyU": { + "partyId": "0B7FA95FD96A3BB482F91167AF12E818", + "ephemeralData": "3A7A9009CC9E99CC5ABCD9FE9EB762576C8C1D3CD1F8A4F65240D213546A" + }, + "fixedInfoPartyV": { + "partyId": "64BC406E0A1B95D8FFDCDC409D6C5264", + "ephemeralData": "EBB2BE69C6B8857A2BEFB1EA6CBD2A664973347A870F6E31810AA77713CF" + } + }, + { + "tcId": 502, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6EFCDC29419A1BEE906EC3501C3B1EBC", + "z": "22F433129163D24AF6C6BDFB129BAE6D4E818FBD38E1EB5AB901E1084653", + "l": 1024, + "algorithmId": "1527EEEDC449D721D2648E4F0022D295" + }, + "fixedInfoPartyU": { + "partyId": "DF05173B50C3031446E6A771DADA45A8", + "ephemeralData": "BA75F9F7FE55C7C6DDA6B47890BEF627A6707D35FC5DA83EE116A6EBAE9F" + }, + "fixedInfoPartyV": { + "partyId": "C8B0AB14329C64917C0885728184CD32" + } + }, + { + "tcId": 503, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C21D075015B5AF60D146D5D7AED4191A", + "z": "8B8AB731EA4355FD8AB34A45FFC8DA3BABE471CCAFBE91B0D8511032C0DB", + "l": 1024, + "algorithmId": "A95AB4247E7F8D413EA1406691BB892B" + }, + "fixedInfoPartyU": { + "partyId": "D40827F0426942584A8164A2BC6F39ED", + "ephemeralData": "9A71E003A67D59D708270292C23207F9A767CCDCC3500FD3C2514DDA74B4" + }, + "fixedInfoPartyV": { + "partyId": "7DA4A151AD9B779B3EAF437CFC6F4CD5", + "ephemeralData": "B67A661B26F457B62A6A5D90EDB59DF2BFAACF819CABC5D17665BD3B6F9A" + } + }, + { + "tcId": 504, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72A946603E6E22C9AACD75B29E0B6EFD", + "z": "99C7B3CB5FBD2409BAD6681AE3B000E292AD8E3B1C1F39D05FA639118932", + "l": 1024, + "algorithmId": "7EAE965801ED2F50BAD736D6940A8A9A" + }, + "fixedInfoPartyU": { + "partyId": "3E39957ED29E9ED77584CECE7B850A59", + "ephemeralData": "3B04CA7C0C3A7B13C3310831C386711D94467BED80779C412B7D8D6D4036" + }, + "fixedInfoPartyV": { + "partyId": "FA974E57DE44DEDC0B597295627FEB73" + } + }, + { + "tcId": 505, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DA91D93196C5025A20EC7050D129CD7", + "z": "F448E75C2F64913122768B6696873725A1512881F9CB6B6150D67CAF67C5", + "l": 1024, + "algorithmId": "AF239E5833BFBCF0360EB43782D27359" + }, + "fixedInfoPartyU": { + "partyId": "E6460B41A73B86D8A7EEF06D5112D3A3" + }, + "fixedInfoPartyV": { + "partyId": "2279F3A6171D36A3F71DB6FD92342A83" + } + }, + { + "tcId": 506, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD3D9AAB96C45476C280CF56DC8D3E70", + "z": "B9599F4C16C60BFA79953E3BD3D1AF9CF612411C5171DDCEFDCD2CC91787", + "l": 1024, + "algorithmId": "6168E5B88F5171A0E14F1DF4C2D847DB" + }, + "fixedInfoPartyU": { + "partyId": "3EB2046BB07073933C1BA10883340535", + "ephemeralData": "0DE5CEC73F9593FBEE8F0D161BB8832EB0B765BD1C0E37FE5FD8C515B77F" + }, + "fixedInfoPartyV": { + "partyId": "D65E84F94B35A65DF344E7CC668759F5" + } + }, + { + "tcId": 507, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50EE7367ECE7E260DB2E337D2D1FE4AD", + "z": "77FDED3B6F1BB4082620E67E7511D80D4E917A78F3B2DF7E3657E36A8CAD", + "l": 1024, + "algorithmId": "A327610896600D1AFD64E4CF9B4A49E8" + }, + "fixedInfoPartyU": { + "partyId": "B3BA8A7A4066764B44F77BE8101EA796", + "ephemeralData": "ABE0800729CDE19265815CD15D3AE290FBE8C8B584863008F4F1DA0ED411" + }, + "fixedInfoPartyV": { + "partyId": "7C41F762E016B2A49DEF19292667FA7E", + "ephemeralData": "03A0451FB89DF377D1C260BB05DA4F87EDC70C2C42ABC857E92C405ED67B" + } + }, + { + "tcId": 508, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4604F37B7DC5D03038DF8206EF810886", + "z": "00D090DD55D5D17A638A95601FB3267CB2E0CB4F0F1CD7A3F4AAA211C924", + "l": 1024, + "algorithmId": "2E1DEB10C18BE602B37D96600D8DB453" + }, + "fixedInfoPartyU": { + "partyId": "1332F6D3A96492837BD9479D44E20E37", + "ephemeralData": "90E030CE9B384C34159CE940D81C06121655CD404FC0BC6E925CC99F537D" + }, + "fixedInfoPartyV": { + "partyId": "AE98F8DC87737BDA36313C60FDC19E83", + "ephemeralData": "381475C5FDE6D4D6B6580BA2CB30DB3EC3C191521E68BB2AF21EB6A2527B" + } + }, + { + "tcId": 509, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D76B14DF4BC21D88F2FC0C488EF1B77", + "z": "03CA21699293AF0AAF864CFA683C5F13D5A9F98B0BE4B5B881E762313DB5", + "l": 1024, + "algorithmId": "1BED68E1177817EBA2F886434122C370" + }, + "fixedInfoPartyU": { + "partyId": "3534B8A33962F6338B36A4626BA03A54" + }, + "fixedInfoPartyV": { + "partyId": "EA961855CE813205872AB7E5B85D0E03" + } + }, + { + "tcId": 510, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B06D35B50A8E2ED860C4C22A1802FD6", + "z": "A929FEEFC83C4360343B3B4EF6A89F186B296E914A0DD98B9797761CF623", + "l": 1024, + "algorithmId": "DCFF0C34F4FBF558D4F9D1E0DC4E4890" + }, + "fixedInfoPartyU": { + "partyId": "9EBBD793A6A33F4589EF3DD07FEF8478" + }, + "fixedInfoPartyV": { + "partyId": "B08DA8CF3AD896EF40CA8564A708C982", + "ephemeralData": "754F16A7E13F25FF130120346C6B9E8888A095970FB11FAFDA9AAA7E0DD2" + } + }, + { + "tcId": 511, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0A6B9EEEBB85FEB77E326BC0BDBC453", + "z": "DF0A2360A6DA3E9BCD0FC718C91AC1FBAB4623E97E8C0433DF0C4BA18955", + "l": 1024, + "algorithmId": "3C1A65C3FD1C330995CAC3834C1EBE64" + }, + "fixedInfoPartyU": { + "partyId": "C03C3E7FD790732FCEC43AA72B8C50A6" + }, + "fixedInfoPartyV": { + "partyId": "F90F7E667162ED88E1DFA025D0F7633F" + } + }, + { + "tcId": 512, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27AE48B29DF8BBF484ADD3ED4C54E04C", + "z": "D8362D0BFAA881E08CDA05C1ED2517964687AB5423C85724683BEE911666", + "l": 1024, + "algorithmId": "CE8558E5C8158BBD07762FE8007E5555" + }, + "fixedInfoPartyU": { + "partyId": "027FCA84FCBCE49296C6CE61EDDC7554", + "ephemeralData": "08DD49DC5B8F50C8E499CEDECEF021F65C41460F36D94DA887C477E124AE" + }, + "fixedInfoPartyV": { + "partyId": "50B79888A033ED906054095DFCA60216", + "ephemeralData": "5CF99AF13E8FCCEDFF44A00C20D16F5FAA69E8915CC96333A0FB93DBC687" + } + }, + { + "tcId": 513, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43BBC2351B11A58CC5EC074ACAC2AA00", + "z": "9F46969142283052494C839A5ED5CF2D973604CC8AB402544FE3AF632D39", + "l": 1024, + "algorithmId": "B31C5A44E804DEDCC2BB583C1E081437" + }, + "fixedInfoPartyU": { + "partyId": "E73AC016C055B1D06CF616AEC1231A8C" + }, + "fixedInfoPartyV": { + "partyId": "BBBEBDA08733DAEFF73827D7464277F5" + } + }, + { + "tcId": 514, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA032A4F74B01BC5F4C32B82FCE7939B", + "z": "964FECD909E23D61620A9D22698256B676F24D7ECF2F0C7DD79468A8519C", + "l": 1024, + "algorithmId": "F2A28CBA7EBFC7EE8D0BFF089FFDA568" + }, + "fixedInfoPartyU": { + "partyId": "75ACB3CCDA15C45D3AE468E2C4C4C33E" + }, + "fixedInfoPartyV": { + "partyId": "BD90FD8B856BF03AEF6607E6F25A654F", + "ephemeralData": "D1B47978A7D55EBB57A4F58789066D90AE9630875E0B48714D932D89BB91" + } + }, + { + "tcId": 515, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE36514C3E7D8E69B2EE64F3DDACC774", + "z": "780F6CF31EC5213BF000F4FA8F908F687E8544CAF71531C054B297FB6BF5", + "l": 1024, + "algorithmId": "57ABEB8BE3F117223DB68DFB5CD0B486" + }, + "fixedInfoPartyU": { + "partyId": "AA99FCC77A0620A414EF1FEDF3E1D1F1" + }, + "fixedInfoPartyV": { + "partyId": "22546094D1D93005FE4156BDAEEE26EA", + "ephemeralData": "104315EFE7F59F7A33C9204608F11B883E2885EDD9EB7B9F48909163F906" + } + }, + { + "tcId": 516, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23F87D018402D479749CC1ECD2308007", + "z": "C71C8922D4ACC98613AC69F017584287D542829BE45D2D70231026E1EB85", + "l": 1024, + "algorithmId": "BBB9D483E19C8737554B1F5E9C49488B" + }, + "fixedInfoPartyU": { + "partyId": "19260875020FE3AA93F2985C798FBA54", + "ephemeralData": "9DA95A0C6DC44FEF79C9F2E18F9510E6003C79186472778E8DE92CC04CA4" + }, + "fixedInfoPartyV": { + "partyId": "19DA33EA02002D6B9B5C3D7DA292A37E", + "ephemeralData": "8FC6F2B324FAB4A8829AE774E6D4CD34807C67705C2B68274478DFF129E3" + } + }, + { + "tcId": 517, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BAD1C626628CB0B95DE48C9E65FD4A74", + "z": "9F1C1FCAF0AF38076D6EBAE99FDC8A3805FB75C6BAA7DE378E70A9A9C4EB", + "l": 1024, + "algorithmId": "0B28A89A31EA50964202A9CF844E94C4" + }, + "fixedInfoPartyU": { + "partyId": "6FC6E3BE1F13E59B7FFFD546307FD01C" + }, + "fixedInfoPartyV": { + "partyId": "C117C37FFA71BD7E4C16DC86850178B3" + } + }, + { + "tcId": 518, + "kdfParameter": { + "kdfType": "oneStep", + "t": "97DAFB00144D7AB8BC18F78423FD7BF3", + "z": "E06A3B8C7C6EA7B86532CA71646CD6E5A606A68C936D31F9A78156DB771C", + "l": 1024, + "algorithmId": "ACE92A25216DE178C3F5B8B64438879F" + }, + "fixedInfoPartyU": { + "partyId": "726BF1B5CC814B2A924EAE05D5067DC3", + "ephemeralData": "AF66482539D98837A131A00ECF8CC6BE1B04E733BEB76510899BA7769511" + }, + "fixedInfoPartyV": { + "partyId": "AA1AEF4E70F6F32739F3A67BC7FC3CC6" + } + }, + { + "tcId": 519, + "kdfParameter": { + "kdfType": "oneStep", + "t": "236C570735114E31528EC340B3949106", + "z": "442EBC969C7BDA200260C1E7C1A2F6419DD3BA1C58A230E73BDC4CA5F06F", + "l": 1024, + "algorithmId": "6D18375DE3632691107A3F0AC7EF099D" + }, + "fixedInfoPartyU": { + "partyId": "D3A7E71164A9CB90CB926D733FBA3A08" + }, + "fixedInfoPartyV": { + "partyId": "012BA540D1CACF6CC2AA7045931A0C94", + "ephemeralData": "50FAC79D077C0FC9C2B113AF021EA73338F0FC171B31D664D4299400E24F" + } + }, + { + "tcId": 520, + "kdfParameter": { + "kdfType": "oneStep", + "t": "706A3DD40CA1B697BAE62D66141054A4", + "z": "EC27E0F895062B8C0E3F55380C7004B018FD311E1A2882DC7930EA8662B6", + "l": 1024, + "algorithmId": "4074774894D10DBCB7F8C996904FEC58" + }, + "fixedInfoPartyU": { + "partyId": "B40E4BEC8D772A0F8AF1E5DD61A37FE2", + "ephemeralData": "22B2DE0DFCE613CB3B9C8E9F373C5BFC819BE35BD6A8301405C89B9D067F" + }, + "fixedInfoPartyV": { + "partyId": "A6950E34318E7A1A508AD979D7521C40" + } + }, + { + "tcId": 521, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64135EAFAE97F8B77EC4267BD5F880E9", + "z": "CEE2A21072F42730070D1795AA732E3EDC4401C783AAD5609C3DBB85F477", + "l": 1024, + "algorithmId": "6D04986279430764297C7A9BC8F0B84E" + }, + "fixedInfoPartyU": { + "partyId": "C25FF82B231F4D2F49126D01DEF30579" + }, + "fixedInfoPartyV": { + "partyId": "F2BE8BCBC65DC47056FCC9053A68B9DA" + } + }, + { + "tcId": 522, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF9F02F3DD7BFE15FF0BC56DE7403CCC", + "z": "43B432114A3623102D1E10460A384BAD4AC953FFAAEF69078992FF23FD00", + "l": 1024, + "algorithmId": "D38B72CE61F70B9E17203030274A42E9" + }, + "fixedInfoPartyU": { + "partyId": "B7C6C2F8D73443418C4FD060276C9B23", + "ephemeralData": "3547DB03C9ACFCDCEAA2E66487ABB4D47747C800EDD3B18EBBE8A42F50CA" + }, + "fixedInfoPartyV": { + "partyId": "C34EE38C76DDDF3A9E84E147147F5D4D", + "ephemeralData": "5D2B08844C0D30F22F3349A39F9D6AB3B81FF83273DF93D1623B4C2260CB" + } + }, + { + "tcId": 523, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8959A89CC37ED2D3010E57A2B551F1DC", + "z": "8321235657A4696D8DC4FD0A7C4CFD6197D169AE56D4E848FE2D3B19DA38", + "l": 1024, + "algorithmId": "78537CD1324FDD5A9B47A0F62958B2C0" + }, + "fixedInfoPartyU": { + "partyId": "A4A84BE169A9DE4B1763F7FAC583B1FE", + "ephemeralData": "AC5B542C31349A6A9D0CE5FD5850C724A8D597B06DAAC45B9E207780703C" + }, + "fixedInfoPartyV": { + "partyId": "80B28A4F002813DE0CA0B31928FFC022", + "ephemeralData": "4E0CBCEA7A4426718EAD97EF4AFE690771EE42E6059F22BFAAF390A28435" + } + }, + { + "tcId": 524, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64EE05E870AFCB19F5D3812C36F91DA2", + "z": "95CE522145EBCBCBAAD0B2BB36E3B5DA69B8107C611D45B989A6FF3BB6BD", + "l": 1024, + "algorithmId": "606357552335C83E2E067D1D3A3BBF4C" + }, + "fixedInfoPartyU": { + "partyId": "C304CA18B46418BA631B9F66D1D93946", + "ephemeralData": "911C4EA37C7F993A03E736431B88766768611370EA13943C49B28DFAF1B0" + }, + "fixedInfoPartyV": { + "partyId": "50ABB4523C9DF09308D360700728C700" + } + }, + { + "tcId": 525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04843A194E339B2C2D4F58DC1F8282B6", + "z": "442CF3FBC215F476789F9D6A094C0476861E127D0903983C63157E23A1F4", + "l": 1024, + "algorithmId": "AD5C7E50F0AA4F37BB92608F27F0654D" + }, + "fixedInfoPartyU": { + "partyId": "3DDBD31CE9455298DE5AAEFBA6CBFDA1" + }, + "fixedInfoPartyV": { + "partyId": "6C486852682F2A7B64E7CF10012E25A6", + "ephemeralData": "46762B848041E42D9142FDCE54B4D819A35CB55718706DAAC78A78467F67" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 22, + "testType": "AFT", + "tests": [ + { + "tcId": 526, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D06063B533C8D1F52DEF0715F55BFA6", + "z": "E3F11E068622F34756CBE028494E89235CD07C5A54FAB7D047BE945872", + "l": 1024, + "algorithmId": "4B66D6F413ECB3B077241F7E3D596512" + }, + "fixedInfoPartyU": { + "partyId": "74160A5A08D503A8419CA17EADAA3CD0" + }, + "fixedInfoPartyV": { + "partyId": "C6B2403872642B173B261209EE04FBF5", + "ephemeralData": "CF377567718429C7F5ED221177AEDC3CFCC30A25A10CEC82DE23D11E83" + } + }, + { + "tcId": 527, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE547C1E7719487F2C5C662FBEDC1C3B", + "z": "8C8BD4F4A9AFA8EE38291FEF83DF67AE368BE7B635BE2FDB1144F0F622", + "l": 1024, + "algorithmId": "D7A5A27F4AE82A305601A6D453200515" + }, + "fixedInfoPartyU": { + "partyId": "7E79881EEC60C660B28828E9D6B33889" + }, + "fixedInfoPartyV": { + "partyId": "A4061D9A404D34C62B5D2FF33AE1D0F6", + "ephemeralData": "713AF422AB56099652A904FDD9302F65193CBE28222DDE864DB5337DAB" + } + }, + { + "tcId": 528, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A1C87BA708F4A0F0E1BE17673820A620", + "z": "49ABCCEAB1AB562019A253404E8B3F1327E44AC89780C925235A414BA5", + "l": 1024, + "algorithmId": "9D738738B5C343F745D23D4CBDCB70C3" + }, + "fixedInfoPartyU": { + "partyId": "CD9FA19FDCFA791846ED10217B7C9DC9" + }, + "fixedInfoPartyV": { + "partyId": "1E5839A996F48487252766BA6861DDBA", + "ephemeralData": "B0F98C995554360FE04AEE30D6DDB77F7AC658C7354552020668CD2ACE" + } + }, + { + "tcId": 529, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A7AAA415ABADEADA9AED924BCDE72DA", + "z": "FDAD8B6817B727DB268C00B428CDCA9B5E2F415F8A6CFA15C4D6EF9C19", + "l": 1024, + "algorithmId": "27E28F052620A20F9109B88C3812C591" + }, + "fixedInfoPartyU": { + "partyId": "98C5317278C4620B9F680C86276450AE" + }, + "fixedInfoPartyV": { + "partyId": "4C8A5CBE37743E73EDAA8C31ED14114B", + "ephemeralData": "68F4CE123AB9C47C1099791D981F62A9B4143B521D2D618FD707DC0EDB" + } + }, + { + "tcId": 530, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAE4C8E315218722172689BD082690B2", + "z": "611B58EBF53D6F7189216A847580A7DC555A5A8AF1E5A2DCDC480A860D", + "l": 1024, + "algorithmId": "4351E9BAA38AECFACD1282A27A031BC6" + }, + "fixedInfoPartyU": { + "partyId": "2E321640EED56709DE3396A00731E9FC", + "ephemeralData": "33951D6BA17346B55329A0F5848784F152CD179C60C25E5EA0A1E045C1" + }, + "fixedInfoPartyV": { + "partyId": "1CF93F44D38B5BBF3A122A290E3C5A48", + "ephemeralData": "551599C44C72C629BEDA42188FC84134006CFF0C78059221BC665176B6" + } + }, + { + "tcId": 531, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A84BBF53A2AD9CD99D6E4798DD18C935", + "z": "5DF786B3EB2AEA5FD76D7E120D9EDF2A7E3BB679331D0A4F8307B34808", + "l": 1024, + "algorithmId": "A0E63FA13E78F288401A0B9460505972" + }, + "fixedInfoPartyU": { + "partyId": "911FAAFABFE51DDF8C5836CFA7C8EC78" + }, + "fixedInfoPartyV": { + "partyId": "13C9CF1B895EA8D1DE4140950FBDAE1E", + "ephemeralData": "02FA8DFDC987ABE34E3AD795B998CBB5DCAD98F52E1286F4AF94EE8CBA" + } + }, + { + "tcId": 532, + "kdfParameter": { + "kdfType": "oneStep", + "t": "250DD1E206D900701F56BDEBEBA3DDCC", + "z": "6F18B37CB37EF51D8AAEE1FFCCA17C5FB6DC92F2FF9D9DA1D182705A6F", + "l": 1024, + "algorithmId": "CC1F4535C8535900FB1F4919239C0A3C" + }, + "fixedInfoPartyU": { + "partyId": "2AF8EB06402AFB9DD4DA592E4C2E1819", + "ephemeralData": "6EB7042ECCA106889064D9E62D84EE54CEF264519A5EF0E33A38841068" + }, + "fixedInfoPartyV": { + "partyId": "750793ED3E35DE3794A2143953FC3183" + } + }, + { + "tcId": 533, + "kdfParameter": { + "kdfType": "oneStep", + "t": "531C6E95A3CA54F14BE20FDF90040E57", + "z": "A0D50538C1801C6440B4ACAFFDCC24B639FC91ED74AFACFFFD950097E7", + "l": 1024, + "algorithmId": "1AA6CF897D8897947E126B2AF783A490" + }, + "fixedInfoPartyU": { + "partyId": "7EF11B5462581D11CFF196347B26E96F" + }, + "fixedInfoPartyV": { + "partyId": "D6F9C4D37F7A831367C1E5A5FE2F3A11" + } + }, + { + "tcId": 534, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B5A07ACBBED4C50D673868373A7D45B", + "z": "14639AB131B677E5F079E5BA793BED3775BC1E63AE292FC64D6E88D51A", + "l": 1024, + "algorithmId": "FA0370D19530912FB90401B0EA88A53D" + }, + "fixedInfoPartyU": { + "partyId": "681FC47DA595AC94E7FB7BE437280D48", + "ephemeralData": "D3500DE554F1BB9184F5556615CB2C9B3DD25E355BE122F241B15F1960" + }, + "fixedInfoPartyV": { + "partyId": "9D468956061A07620480507A4E572072" + } + }, + { + "tcId": 535, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3AF6EC8514A9688087B9E6504E60B30C", + "z": "E6325DDC9D064FC5C5316A5FEC0FBB2762D8B8A9CB93A3EECD2A2A3311", + "l": 1024, + "algorithmId": "1E2593BBCD6CD2C898A7909BDE6457ED" + }, + "fixedInfoPartyU": { + "partyId": "2EA783CC0F1E51FB6987BC31DBDB1292" + }, + "fixedInfoPartyV": { + "partyId": "7091F08D23E34C75C58126289AAD5925" + } + }, + { + "tcId": 536, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37CF0BB1B1940AF7AC8633B7BEBF3592", + "z": "1D44BF9E1AB146EBA848407FF1EF4A9BC5A5230D8A95732CACF053EB74", + "l": 1024, + "algorithmId": "0CE4310DDF0ABB52EABEB14EB74AA1E5" + }, + "fixedInfoPartyU": { + "partyId": "10A93429C16660F4DD226AD2EB47380D", + "ephemeralData": "86DA1EFD112730F2B9DBD57D782E6C0DD5A2A5888E87CA32BFA5C05CE6" + }, + "fixedInfoPartyV": { + "partyId": "7CE144637D064D778463B739A19CB77F", + "ephemeralData": "5ECE3000AA08559C0008D10F00F014C293982BF42734D4B6B092F9531E" + } + }, + { + "tcId": 537, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9824F4739D994B5A25A574D0F0EDF654", + "z": "018F32C7AB84E15A32D54D7F47D767DB519A11E788EE1FA62139AD3A2F", + "l": 1024, + "algorithmId": "0166C41910ADBCADDF5E9BDB8CED50F9" + }, + "fixedInfoPartyU": { + "partyId": "63E967FED6ADDF2C17DFE01498B96BC1" + }, + "fixedInfoPartyV": { + "partyId": "8F745A8E2858D4654EA6F455C2E47ED3", + "ephemeralData": "EE860BAE4A12776B3FAAB3F3A021F8F334FE9F9F1BC088FA3D02587BC7" + } + }, + { + "tcId": 538, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A6E825632D3EA387B7C76DFBD5EB207", + "z": "18F4246DB72194FB03C7290BF6C709E83A741C7EE1E16A8DB0BE4133A5", + "l": 1024, + "algorithmId": "671780A6DD333C74DFE3ECDE5CE93398" + }, + "fixedInfoPartyU": { + "partyId": "5A61DC7D4779B6593F723799CDF288B0" + }, + "fixedInfoPartyV": { + "partyId": "766942071F9EAA96A6584B3C0CE04F41" + } + }, + { + "tcId": 539, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8FC46F335F017907F0B4DCD8701FE9D", + "z": "CADF371FD13BE890910090FFCC8177E32D750E826F56B319EF46E2F886", + "l": 1024, + "algorithmId": "7FF2A9A37E5C608B5A72BBF6C79FDC89" + }, + "fixedInfoPartyU": { + "partyId": "3E4A18AA4B848FABC7AAF7936444663C", + "ephemeralData": "B50B7020BACCEC9911C91C328BD3E1CF75A60FF536FCB6F4686E9FAC51" + }, + "fixedInfoPartyV": { + "partyId": "9B015C688E72D45C408BCD3BFC9D78E7" + } + }, + { + "tcId": 540, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F132A364524C6074262C37C2251750E9", + "z": "4978BAA34349F0A3D8FFB0C37C389C50FEDC40C6BA99AB6E61C90A2125", + "l": 1024, + "algorithmId": "4C0B913202507F886BB295D92ECA6F80" + }, + "fixedInfoPartyU": { + "partyId": "F7FB6A7DA47BEA418711DD5E4CE4075F", + "ephemeralData": "5B35D93AB08B73A08F5BBF5A5033B3BE86C130821932F3A0D513C42427" + }, + "fixedInfoPartyV": { + "partyId": "E05A451AF1668A35B4967CF351F5385A" + } + }, + { + "tcId": 541, + "kdfParameter": { + "kdfType": "oneStep", + "t": "97ABD6B7AF28039AE74B838032D89984", + "z": "DFBCA68F0630BDEA3DB299364B87A63A7B291DEFB52DC4A7A5DF087DFB", + "l": 1024, + "algorithmId": "047FC1E19C557409ED3208BF407752B4" + }, + "fixedInfoPartyU": { + "partyId": "65917DABD4DD5FA0B863A1BEC9323683" + }, + "fixedInfoPartyV": { + "partyId": "080015D8D7C0115AF83D8063A15C606B" + } + }, + { + "tcId": 542, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5EAECB27DC658AB542C6EC02398F504A", + "z": "F88066E756DA533D7FE57DE18546C12DBD26BA273C10A44597BE7F2A91", + "l": 1024, + "algorithmId": "387E3C290294D71E099B5D0A1B291CC6" + }, + "fixedInfoPartyU": { + "partyId": "31DAFD7EAB05A1C0BDFE70352953E2BE" + }, + "fixedInfoPartyV": { + "partyId": "24DEB067A4D654DFC84D45571FC98785" + } + }, + { + "tcId": 543, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4443EBCD3E0F38C12AFF3E68DD605A1E", + "z": "B38622F3E1E3A55AD92F1F1E390684F754B74931FCDD3C2052056E114F", + "l": 1024, + "algorithmId": "0782A3B2DEF4964A33ABC3BEE41DE121" + }, + "fixedInfoPartyU": { + "partyId": "F436E1821EFDB57D34A18EAF525E656D" + }, + "fixedInfoPartyV": { + "partyId": "B5FD5F238B6BF46B13CCAE0508B3C9D6" + } + }, + { + "tcId": 544, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C29B4691CBEF2759DB3D5A090540B650", + "z": "760386811D20759711AA7554F4EDF3FE617C318DDB134956F73C3D1D8F", + "l": 1024, + "algorithmId": "120B978AF1B91805FDC3652ADF5C5A7B" + }, + "fixedInfoPartyU": { + "partyId": "297B2A2C6CFA1ACF5A6C62F67CBE6BF7" + }, + "fixedInfoPartyV": { + "partyId": "46CF761F1DA8F7B0F1D13CD702335A7A", + "ephemeralData": "3DC46A458AED2E2074CF2C065DF6F96DE43D7B392593869C6A007221E4" + } + }, + { + "tcId": 545, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B5C424AFDE28447877E081EF01F9243", + "z": "0C131FF6AC7257DE389165E470916B8BCC4166604AD9A7019BDD5EAAA3", + "l": 1024, + "algorithmId": "77A0265590A70132EF12EE98667D2A7B" + }, + "fixedInfoPartyU": { + "partyId": "A2BEA645EB41DBC3C8ABEC4BA5F0A514" + }, + "fixedInfoPartyV": { + "partyId": "94E2A530EB52C523CADC668D5119BBBA", + "ephemeralData": "DC592727DB133E86BBFA633B70D09937F2A62308ACC9BF9F809C76BB35" + } + }, + { + "tcId": 546, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C21BFC92A0D4E7D685F6B5BE65B681F2", + "z": "59B7F46755E8167A7761F0FC4286D74C3758247C38454FFE360A72B684", + "l": 1024, + "algorithmId": "86C22BFE896B3427B34B2E9ECAED4B9D" + }, + "fixedInfoPartyU": { + "partyId": "90422C7031F350B7B84704A8192B21AA", + "ephemeralData": "2FFCAB8ACD8F478E3FF85A8DEB980ACEB58AA00A4BB90B955D4D0F8A4E" + }, + "fixedInfoPartyV": { + "partyId": "A6FA5C60208B4D0CA76918B857D44D06" + } + }, + { + "tcId": 547, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BBC77C9AB199F5485651ED5921B9CB3E", + "z": "6F3CC641390C0ED4ECAF24096604B7131DBC7E9321AC1BC4D7E0424732", + "l": 1024, + "algorithmId": "CEA764E9A6B19ACD541309320F988AF9" + }, + "fixedInfoPartyU": { + "partyId": "6EC6000DAF7AF7C622A273F5D250BA61" + }, + "fixedInfoPartyV": { + "partyId": "DEFD95A735385DCF1857904A943E3539" + } + }, + { + "tcId": 548, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2E48EFDA8743E41D352A808974FA069", + "z": "18B2AA3B018888CFE097A45B466D706E4ECF91A5854A93F6E949C1F773", + "l": 1024, + "algorithmId": "BF91C2C42B3BB6561D9D8DF0EB0E5431" + }, + "fixedInfoPartyU": { + "partyId": "176212040C73D64700CDB799D1C720F5", + "ephemeralData": "8A3084FE6CA3B6B5FEC9859032E14BAD47396EA3C14DE9A16107CDD285" + }, + "fixedInfoPartyV": { + "partyId": "5F13D784DE7F9310E4D7B67E7126BDDC", + "ephemeralData": "EA06FC21FD74F7C9C748E6E5C2B81C639B2A1BD0854DDD82D12B282800" + } + }, + { + "tcId": 549, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50C97B4B9058690D2C2749E736A8F10A", + "z": "BC9C0F9FF6118BDD79DC0B7C2DDAB0012D45C48C08FA3CE7E09A72D9BD", + "l": 1024, + "algorithmId": "578A96EAE28B01BC282115051CCB1E5A" + }, + "fixedInfoPartyU": { + "partyId": "855B2EADB42377EF2310243B3840DC91", + "ephemeralData": "27E8053DB6A0DCF10D83AF773DA0D740A4614EDFD6ED6FCF637DB80BFE" + }, + "fixedInfoPartyV": { + "partyId": "C244644AD10D2D3EE303A0158B2FAFCB", + "ephemeralData": "B2A24AFEBCD4A08FD61E300BC587C926C6172F0CD302ABB670134B364A" + } + }, + { + "tcId": 550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CC1DE8490813BB843DC8DF67D58C853", + "z": "B333DDEBD8D52213E3475A929913C51E0AB18E4C508F672064B6EC86A7", + "l": 1024, + "algorithmId": "9F0CB116987B8552C45A356E952FB562" + }, + "fixedInfoPartyU": { + "partyId": "FEAA2CC961333A55C590F1EEC47340C9", + "ephemeralData": "E52657434D352C1CED1B0B87DB334378DD166493A97A84F2F76E759938" + }, + "fixedInfoPartyV": { + "partyId": "2C5D4549EE4ED245BE43B3ADD777E61A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 23, + "testType": "AFT", + "tests": [ + { + "tcId": 551, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0DB1DCFF565FE6113FBA29C1663ADCC", + "z": "5CF529F8C8EB091F6A0D934C70F2AE0F4EC876574C8ECBBC71C7CF95", + "l": 1024, + "algorithmId": "0B1B7BE1197558B8627A215B563CF46A" + }, + "fixedInfoPartyU": { + "partyId": "25BE161F014FA9B41283947D9A9285BB", + "ephemeralData": "43A3BCE02A7AD02DE4D29031D69379FEE48CC171103CA8F50CB203AD" + }, + "fixedInfoPartyV": { + "partyId": "D30C8955DCC65042254AEEC64B084A0B", + "ephemeralData": "CAE0936E2F101D41B82605F805382B8888DDAC40EB85ED2BBB30B52D" + } + }, + { + "tcId": 552, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28217F316575B46CFE7D38085F02206C", + "z": "9F21484393CAF29F6B8B8327D14FCDA9C2CF11D2A9239313650106BE", + "l": 1024, + "algorithmId": "315016E5EBB9E6472AD04D538D47C0CB" + }, + "fixedInfoPartyU": { + "partyId": "F78C58FCD91EEB14DE2C91C4C7F86AD8" + }, + "fixedInfoPartyV": { + "partyId": "71CA216E3BCC88B6F4AE3DA3649E55BA", + "ephemeralData": "5F080ED24A2D343B82F3882BD266466EB2653CBC71A018FE081868D0" + } + }, + { + "tcId": 553, + "kdfParameter": { + "kdfType": "oneStep", + "t": "046617CA732FEE6FFF88BA22C301B5B0", + "z": "18B5D753CFB3E5A7F9B0848601A867BB167FB5B7C75DF2CCF5B6B0D2", + "l": 1024, + "algorithmId": "8A2B90719A53400756DAE10624D7DB8A" + }, + "fixedInfoPartyU": { + "partyId": "6C0B3958BDBD35D9C0C74FD9F08B66B1", + "ephemeralData": "C75027E7A06C3C8E2A5015443CF5A2E6FCED5C6D6746ED2E46074372" + }, + "fixedInfoPartyV": { + "partyId": "F26B89457983D1AD93E09347D96DA0F2" + } + }, + { + "tcId": 554, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A99BEE5B4BA8664523EE8E85774593A", + "z": "B5733B8A2323F6EA8C6054486E8AF004D87FC171E96C27E5A3D258DE", + "l": 1024, + "algorithmId": "872E4FF23A98ABF7E07A3B3CD78DC90B" + }, + "fixedInfoPartyU": { + "partyId": "27E58AED12A18B7D995B0E1239FAC680", + "ephemeralData": "B2BCF1F094F5C545C6AB68B6B3AA18AE34E89F0C5E916B4CFC734D66" + }, + "fixedInfoPartyV": { + "partyId": "6F05DB695A34B900ED23B9FC11609F4D", + "ephemeralData": "34FCB3BDF4F438D63F6D11DEAF5B0BDE58A023613921375FF773CE65" + } + }, + { + "tcId": 555, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48992F7A9F23B05C7EE3370AADFAD8B4", + "z": "511A86A5CF2AC6AB4532CBA0318A555FAF6E96E11E47219D1398E2FE", + "l": 1024, + "algorithmId": "2648CE5AF349B6737A95B30177058907" + }, + "fixedInfoPartyU": { + "partyId": "73CBDC919388343577F5001D4300F58F", + "ephemeralData": "426BFB13605E922A96EB8EF506176DC9B8389C54FDAEFEF226061F33" + }, + "fixedInfoPartyV": { + "partyId": "64C94651F79D2A13667206B6FACEB49E", + "ephemeralData": "F1CBF2B1FBC2013DCD9F5E6C92F613A6C1A09EDDE04E9B8C71C76BBF" + } + }, + { + "tcId": 556, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE2F2B9ACFDFCB07A0913186F5942162", + "z": "70DC33F64137EE553C07AF55E24673623F65812643D3CB910DE6047D", + "l": 1024, + "algorithmId": "EC6E17CB53384671051B513BE4D48873" + }, + "fixedInfoPartyU": { + "partyId": "04CF514D975B6130C6D67A17456B4B72" + }, + "fixedInfoPartyV": { + "partyId": "EE5E16A4CD8F68F224EB7AFC85943D51", + "ephemeralData": "461124217FD175EA47F5A475321F03EE6F54F4B17F9DE8281F16DAD1" + } + }, + { + "tcId": 557, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4B09B8D3CAE63EFBF927463242DB8E2", + "z": "115A220DAD77C0A16459C80D52A24F686692D7BB3FF1FCEF72F61CC7", + "l": 1024, + "algorithmId": "0A5195C52844E088E4D0847549E19F22" + }, + "fixedInfoPartyU": { + "partyId": "8C68EDC7E51ADF9FA861902FEC5794D5", + "ephemeralData": "AD2DB3F9EED736A67F2669DFA2CD6448A407124B42C42F5BC1A0572B" + }, + "fixedInfoPartyV": { + "partyId": "7DE3AA92657A50B9CAE1CCEB57B39D73" + } + }, + { + "tcId": 558, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF6E1CF17449AFE04D75E2F3F6D065E1", + "z": "DB42CC84357A6251B92C916FF06C9421B4280C2A88E7C1A890C9100F", + "l": 1024, + "algorithmId": "FC79E1E4018DC06F9E19EB8B221AF918" + }, + "fixedInfoPartyU": { + "partyId": "E6CB477E1F54E818D3F1AE5252ADA4A2", + "ephemeralData": "3D86D898A27362D65F86E50B7FDB0C9495AD8DB4EF5F0558434B2BC1" + }, + "fixedInfoPartyV": { + "partyId": "209E624D9E4997F6A0C37C9496093B0D" + } + }, + { + "tcId": 559, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E934AE91323B21B860DCFD02D28DBBEF", + "z": "EFB557AAF8BA98548265067ACF50505B83CAD36425C02A1FE1F95AB6", + "l": 1024, + "algorithmId": "AA3C6F34787640E67DFFFE116EB786F5" + }, + "fixedInfoPartyU": { + "partyId": "2E6D68FAC48A5B75D9C18C0B38ECCCC2" + }, + "fixedInfoPartyV": { + "partyId": "75C83600A01E95B2488AB76CD1680559", + "ephemeralData": "A3F759EF6114561D4D5151C58C2AEC88A07C1F59768ECE7792E79762" + } + }, + { + "tcId": 560, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11264B1798BD75391AE5A19EC5638DD5", + "z": "047121CADC067E7633EE3E1FD6364117DDFA045582A807D80B3179D4", + "l": 1024, + "algorithmId": "C3AD5E35A270D27C3E747579AB3BAF7E" + }, + "fixedInfoPartyU": { + "partyId": "9A6FE0E5CEEBA12CBBCD5EAC3027DBB7", + "ephemeralData": "537DAA7A74B931C9DC79CBA395B6415572569BF25DD878E73FF80208" + }, + "fixedInfoPartyV": { + "partyId": "C2B9D34F62D0C4791FC2356B0E954E20", + "ephemeralData": "FADF1B977F1F074705A43C84FB3DC48348D6DDBEF61541383460D649" + } + }, + { + "tcId": 561, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A7AE19D915C2E146B1EA557FDDA89B3", + "z": "52D7B642535C7A328B3287E21B536548C2FE11A50CD33946C03EDB41", + "l": 1024, + "algorithmId": "71D638760E7097FE27DFB481EB2161F9" + }, + "fixedInfoPartyU": { + "partyId": "4557CDB57A2B15FA9BCD361D1D894E57", + "ephemeralData": "5CCC21B89811A5E18857B481618F7DEA7EC607EEAE15AE40DBAE235C" + }, + "fixedInfoPartyV": { + "partyId": "2E2E6F749F17772893E6AC162364D5B8" + } + }, + { + "tcId": 562, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05B0F9CDEFABBA8FC968B9197243AEFB", + "z": "D0A74081F22DAC81ABFF0B286680DEBB667BBFD5965D18E9E9F49EAC", + "l": 1024, + "algorithmId": "FF89775DC79F5EE051C0618B360AEAAC" + }, + "fixedInfoPartyU": { + "partyId": "5A9DAD50E2169F82BF1A99ADE684D1B6" + }, + "fixedInfoPartyV": { + "partyId": "71A8680271008405FAC1C6443AB10D02", + "ephemeralData": "1A15A8ECC30A7296F6337EB4D20FD35A1CF488E3C1C322B8943A03DF" + } + }, + { + "tcId": 563, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01ABE22350E9B94E20A81D9634EA1DC1", + "z": "1B1882AF867B435F833504FCB7D7A816DAC0AAC1FBFF593B64CC8817", + "l": 1024, + "algorithmId": "52D8F80D0EA07B02C98F02D567A257A3" + }, + "fixedInfoPartyU": { + "partyId": "EC73EF1D6816732B84F79FD01FA63F18" + }, + "fixedInfoPartyV": { + "partyId": "40B8B5450CD3A227AD1E5332E2A609CD", + "ephemeralData": "23FDA87287EBE6397278E12A8FD06F66CCED898B52B17709A10482E2" + } + }, + { + "tcId": 564, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D1EAF79BBFF50B472D4E1A68212C21D", + "z": "C40DE80C611221CB312025EFE0021BE7F1686DE4D3F69510118C4EAD", + "l": 1024, + "algorithmId": "E52CF6F2F363C1D42D400115C15AE143" + }, + "fixedInfoPartyU": { + "partyId": "399E3FCB87D41A6AA445C6A324B48401", + "ephemeralData": "50D5755DD5214E43B85FD1328828042A3C8CD1ED8F54CB1F4E998AE2" + }, + "fixedInfoPartyV": { + "partyId": "F4B5955FB8E275745D2AE7D8838C6598", + "ephemeralData": "EFBC14CADA4263084487F703F6A9F1C3699436803E6D99FFAC164068" + } + }, + { + "tcId": 565, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8479812D791A7D905C4CCF99030B6DF3", + "z": "D0BC5B0BDD3FA4FD615E9109E3AA125C60C7ACFAD05A1CE2E4EDF71A", + "l": 1024, + "algorithmId": "8BC843DC0997BBCF2313E14E4DB758AD" + }, + "fixedInfoPartyU": { + "partyId": "ED083A12D6A9E455E5EF12414DF699C6" + }, + "fixedInfoPartyV": { + "partyId": "6087D80FB7758718229B6F37D27EFFEC", + "ephemeralData": "798B282A5A2A8FFE3D5B1FD5519BC24E88E8258EC422491E79B5600A" + } + }, + { + "tcId": 566, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BFBA45B27DC3928CE1742D304926707", + "z": "576F96141E0268337B0DE2F25840FB3377A3561E1FD3CC37D07771FA", + "l": 1024, + "algorithmId": "69F89B4CC0655145CCCE9C9097652C61" + }, + "fixedInfoPartyU": { + "partyId": "7CE572943B322823DAC51955A071A7BF", + "ephemeralData": "B0C9356535192102E4775F7B5CA0BB596E92178097783584F82C9BA0" + }, + "fixedInfoPartyV": { + "partyId": "01D509F9713B5F42FA737E8582C0E6D1", + "ephemeralData": "241C19A547DAE90F5699C5C86B4F92F7827E9C986D1219DF916CC96B" + } + }, + { + "tcId": 567, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AFBE8B5DD361CD4D16CA0E3A42F1D824", + "z": "33FC9A563059B96433F8D5E15BF11A7D7895CF3F39C89D09EC01CD34", + "l": 1024, + "algorithmId": "2CF983E37094E2EF2508C6014AB0213E" + }, + "fixedInfoPartyU": { + "partyId": "6B03B80F87220D82153CE52363C73565" + }, + "fixedInfoPartyV": { + "partyId": "A06E95D1737B4B8B9388F105DB329952" + } + }, + { + "tcId": 568, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF73F6EDB6AEF29910D7A7870377067A", + "z": "CC05D18C0E8416BAEEB0E271ED3765A682913D73FDED5D8995CF2DE3", + "l": 1024, + "algorithmId": "EE02325B495961EC331FFBBF9FE164B6" + }, + "fixedInfoPartyU": { + "partyId": "4A8F79191C646C632E6599EEF546694D" + }, + "fixedInfoPartyV": { + "partyId": "58B808C0A8CD0584460B44C1BA346954" + } + }, + { + "tcId": 569, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC8628CBFC8BDBC202026B4F864ED36C", + "z": "6B63B9880E72F33157D2A22AFD35FE86754BFFD1F04FC6E2897B0383", + "l": 1024, + "algorithmId": "B411EB99AEBF777983AB004626BB8B7A" + }, + "fixedInfoPartyU": { + "partyId": "4FB55D84A6D1876F952BE3F150B7AF74", + "ephemeralData": "D0A28D9FD2A383FA48227BE36229006C9190AB2F5629D18EA6C47B8D" + }, + "fixedInfoPartyV": { + "partyId": "37C2FA8EDDE6C59F3DFBEE223DD3D22B", + "ephemeralData": "951EC3EB057E6F52D85C2A582F0106F1D70A250792E1A143A8870204" + } + }, + { + "tcId": 570, + "kdfParameter": { + "kdfType": "oneStep", + "t": "984D00A40FB61AE6845CD78D25BA9C6D", + "z": "8CDE1F311E3CBBD9D1C2CE98E135C9257092317855E11908B1F5BB0C", + "l": 1024, + "algorithmId": "42855F825CDF887207B232A7C4A38EF5" + }, + "fixedInfoPartyU": { + "partyId": "5CAC65BB5339D369C750473A7162A27C" + }, + "fixedInfoPartyV": { + "partyId": "3BE980D67E51BE7B3ED677D5E51C5EEC" + } + }, + { + "tcId": 571, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B875000398532FD9709963D60D716782", + "z": "6D56AFE0D46CF793A8DFB6CF6FC0670A61F54B265490EB56071E8612", + "l": 1024, + "algorithmId": "7333F0A76150E83F3853209C2F207937" + }, + "fixedInfoPartyU": { + "partyId": "8AE61CD6971D2CD2204F98723E34BACD", + "ephemeralData": "98A29CA01772EEB7166B872295A62749191A24CC214DC9E46E716637" + }, + "fixedInfoPartyV": { + "partyId": "73A61DE7F1E8FFE449A866E21076D248" + } + }, + { + "tcId": 572, + "kdfParameter": { + "kdfType": "oneStep", + "t": "568245256DFE77184BAC693563ADC89D", + "z": "0A1D97998913416A230DCD40EA843AF55370DED158B09AEFC0FD49AD", + "l": 1024, + "algorithmId": "B9B06DB488E9D4C4F395D48135E345F3" + }, + "fixedInfoPartyU": { + "partyId": "5692541702CAF0706BDA92527ECD27D5", + "ephemeralData": "034F7A195F6301F111A983A67D582673356BEC5E38582D14F2DD5658" + }, + "fixedInfoPartyV": { + "partyId": "A5F44675FAC1173F41408FBCAE150B0B", + "ephemeralData": "C18E3D17E6E379BDD7522D54DD99D87DF2570745E8D1718571C9FC35" + } + }, + { + "tcId": 573, + "kdfParameter": { + "kdfType": "oneStep", + "t": "569F1B46C65FB0441EE21AB99CE82EBF", + "z": "81D8590599200971426335EA4391B36CC863952CAC0799731DBC5CF6", + "l": 1024, + "algorithmId": "6B544794B128BBD3D3365A321D77E7B4" + }, + "fixedInfoPartyU": { + "partyId": "23703C2626F7368B37BBD11CB78C70FB", + "ephemeralData": "3EB3B759F89AACAC08BCB085C01A18223BEDE55CB810DB1C1F91B119" + }, + "fixedInfoPartyV": { + "partyId": "ECBFFE7B94DF6147A7EBE2FD99341C3D" + } + }, + { + "tcId": 574, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F4ACA9F1612335ECF6DBC65DE94BA0B", + "z": "A47FC3B70EF9733BA7F24DFE1D77DD4579AD8F708F9702CB9F2DBEC1", + "l": 1024, + "algorithmId": "08B091508CEA2EDFDC9987D7DD9225CA" + }, + "fixedInfoPartyU": { + "partyId": "D66D0523083D106492CA9BE3153D8374" + }, + "fixedInfoPartyV": { + "partyId": "8308E71EC54D13A3D75217F4BB808AF4" + } + }, + { + "tcId": 575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D55DBDDB933643C97D399E8324F5E727", + "z": "7F4FC66C04F5277C310E1E9352DAF4FA4CDA2800E70FB516F0B2E955", + "l": 1024, + "algorithmId": "8C81CFCD706057A2D71B29C31843A5A3" + }, + "fixedInfoPartyU": { + "partyId": "5A230ED77175911CE41B8BF9E4FC88F2", + "ephemeralData": "A80135F6D96F52F52B78F48F665083ADF42E582CAFBCFFE469D582ED" + }, + "fixedInfoPartyV": { + "partyId": "32CD353F880E1679447F419A036E599C", + "ephemeralData": "E679EC0C036C592AEAD21214FDAE73FC129ACD2EAB19470B250E6FEF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 24, + "testType": "AFT", + "tests": [ + { + "tcId": 576, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56E818F2DE01ADC27C6EBB23B61CA470", + "z": "1CBEEA36600E638543B210170993901D98E334B6F3108C750D13F1E4D2", + "l": 1024, + "algorithmId": "8A99E754CF5EA86577CA1E6CADB3CFCA" + }, + "fixedInfoPartyU": { + "partyId": "866CC30B18FB7C85F66FFC07BF4C85EB", + "ephemeralData": "99149A839D20219023E83007F4CD8AD6B3E2814D133608DAD46D1DA4E3" + }, + "fixedInfoPartyV": { + "partyId": "EEAEF48944AA17AEA14552D587F6C137", + "ephemeralData": "A386F0452B4483DE5B8A8CDB9CF34050D0FC8353679E3BBC174B71A6D2" + } + }, + { + "tcId": 577, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D4588AA66C4D540D6A9886A5AE1A80F", + "z": "77E37B8A619806C8E28EDECF1BE1381175E55019C7596E25C92B45FA4B", + "l": 1024, + "algorithmId": "B9526B242FC070C756373CB9BB600B21" + }, + "fixedInfoPartyU": { + "partyId": "3850938839EAEF262529E4B22A3EACD0" + }, + "fixedInfoPartyV": { + "partyId": "8AAA3FCAADF4822BB6A9DA4BE39D2F61", + "ephemeralData": "783562867394D18593454B289D60B5355954F4E0F4BB0E2CC3BB126DF6" + } + }, + { + "tcId": 578, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B6EFE65CFE02EA11AF6E77AACEE1F12", + "z": "8BB4320F2B6BEA79009C68871D752F01D2C18F18B68F559FDF73AF3C65", + "l": 1024, + "algorithmId": "CB3C180F436483992EED6BE2D32A2152" + }, + "fixedInfoPartyU": { + "partyId": "5761F65FCA72ECC969D2DD28159AC81D", + "ephemeralData": "D2F69B540B5C24A9ABF44F9804A16DCF474352EC3BD195DEB16BFF9F48" + }, + "fixedInfoPartyV": { + "partyId": "80F1ED4305EA6C1FB492C7F5148882A0", + "ephemeralData": "EF652BE4ECDA07522FC9699AFF9F435C5FA37B9E8963125E5B28051C81" + } + }, + { + "tcId": 579, + "kdfParameter": { + "kdfType": "oneStep", + "t": "642150FA13DA01B2AEBDED65579FB202", + "z": "8B29464DD2BE5988B56F252A93C68FEBDD770A824F0592D477C957699A", + "l": 1024, + "algorithmId": "91C45A3E02E9D4B9BE86662BF9FC8FAB" + }, + "fixedInfoPartyU": { + "partyId": "E2E3089A1F2E19FB02D56785B368C473", + "ephemeralData": "4FF71198C3BA8358C4A2BEDC79698D2AF6991012AEB12BCF7F1472C7D1" + }, + "fixedInfoPartyV": { + "partyId": "C555D6013DF4F376B67F7C8DDB75801A", + "ephemeralData": "65C9E802B20DAD69BE9A91946134BEE751B843788040252B20B6A0EE04" + } + }, + { + "tcId": 580, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58611DC12D500292C192F5CF08D7A11B", + "z": "F13CA77B4FC533EE2F85CA8C52B06F421B378B33C0CEA4739D1263E42D", + "l": 1024, + "algorithmId": "4BB34AF4CCCAB86AA2F0413F3A3DE1BA" + }, + "fixedInfoPartyU": { + "partyId": "699C4708FCA7ADA0E60F9E71574CE1C2" + }, + "fixedInfoPartyV": { + "partyId": "68CC22C39EB13E28DB5334DB9F9350A6", + "ephemeralData": "475E60487CF9ACE751A957D5F45B96A6278923DEB1CA5FA3A9E03F51FD" + } + }, + { + "tcId": 581, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA055652CE03CACA8CA2C9807C9EC20A", + "z": "6EAAE8A50ACE7F4216942EA58D527421E98809122412BBD92A25A44A12", + "l": 1024, + "algorithmId": "5B4B5439F12650AA4A5A7274B231AD97" + }, + "fixedInfoPartyU": { + "partyId": "BF6E588B06313125B0EFDF3B4A53F88C", + "ephemeralData": "8EFD7467A28541AE3EB51997A311F0841BD6CAD0D37027AD41B055A9A2" + }, + "fixedInfoPartyV": { + "partyId": "240E67D92C4B4BBD543F03F00E11EA8A", + "ephemeralData": "89CE4CE5BCB1812BC7B9E648E22A39D90ED067F4DB0954C0E8F540AC09" + } + }, + { + "tcId": 582, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35F8808E1E1F2DC23A96F041B3ACD556", + "z": "342124FE74B8833A152391D49169B370ACA8D2C9E835DC79DF0DD9BA71", + "l": 1024, + "algorithmId": "C95C827D75C4717EBB5B534FE6390AA9" + }, + "fixedInfoPartyU": { + "partyId": "1E78CA76F8DCE94FA8C2048F79FE2D3D" + }, + "fixedInfoPartyV": { + "partyId": "BB55E1982036361FD5EEB98CB579518E", + "ephemeralData": "888BCD6FA30F73B17EA7D270859A0B6F9F2AB5EB42C0F16C1D2FD39BAB" + } + }, + { + "tcId": 583, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91EAAC3F83340C5DC75A6ADB17B738E9", + "z": "B25FD8CCDA8DA9044A740CC5F3D8662090AAF926860A14E74481A885B0", + "l": 1024, + "algorithmId": "73F6CE7B9036BB8331ECE76C359334F7" + }, + "fixedInfoPartyU": { + "partyId": "70B590AC24012E7526F6E0A4D1D7F168" + }, + "fixedInfoPartyV": { + "partyId": "B40F78A71BDCAB4775A07A905CA53C36" + } + }, + { + "tcId": 584, + "kdfParameter": { + "kdfType": "oneStep", + "t": "062E21458E616CF00FFE4CACB1CBA5D7", + "z": "F2227A0F44F5156CEB13955BB0D2017CED11A878ED91B7C34F783C5A0C", + "l": 1024, + "algorithmId": "321F247C69D17FF63A5E538E6B1E4341" + }, + "fixedInfoPartyU": { + "partyId": "A433C33AED13E3A6E7225DCB51D4F5CF", + "ephemeralData": "25827809EADE1F21BFD3831D9E9449403347449F1B1B8BE9DE8E6B7322" + }, + "fixedInfoPartyV": { + "partyId": "DEBDAF36490BF163B707EC5750E2A9B0" + } + }, + { + "tcId": 585, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CC475CD3256124ED8786EEF9950EE11", + "z": "846A4FCBB74FDDA0084458825CB0D08226921B0F1979EC9E6928B2CEC7", + "l": 1024, + "algorithmId": "6A5F0238B9D022395F02DA7D9EA330BE" + }, + "fixedInfoPartyU": { + "partyId": "53E080D6017301374F6AF2535EC492D0" + }, + "fixedInfoPartyV": { + "partyId": "824E9D7163F027747F1D4AD5A542CCB1", + "ephemeralData": "EC79CADFDFA747FADE28831AD1FBFC203143E48125616690D333567D49" + } + }, + { + "tcId": 586, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2938EC0EC0F306BAEBA4EBD1DEFFA651", + "z": "346B6863F7B4C7CEB967E7F1618D8818D47276E07B040CDE6BA85BF4D9", + "l": 1024, + "algorithmId": "0406C00239BB30AE833F2872234E9BA0" + }, + "fixedInfoPartyU": { + "partyId": "74F162FB9A72985D650D5F92F8C1747F" + }, + "fixedInfoPartyV": { + "partyId": "A07508B1A62D0B70D0051D5E667DA117", + "ephemeralData": "BEE0542128BB5721CDEEC64BC440D56BBDCD745803287AB84279B56BFB" + } + }, + { + "tcId": 587, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D9DEE4EA9260146AEDFA4E69BD86BAC1", + "z": "F94CCBA42BD526C1DE628344343564BE7699C97C4D03094BC81A1407FD", + "l": 1024, + "algorithmId": "0DFDD65BD910CACAA5335A6036912523" + }, + "fixedInfoPartyU": { + "partyId": "85EC7082B17645E2C153DC36EBE6BBA0", + "ephemeralData": "B10CFE517310E23FADE2C1AC09BD7F23EF3FE03BFB7C61A65E2BAFAB76" + }, + "fixedInfoPartyV": { + "partyId": "73A03B6F841542CE9C1F2DC9503A515C" + } + }, + { + "tcId": 588, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1AD5044725BBC3A3578D007C2B96CAAC", + "z": "17F02803ADC512C2C4275DC3339BF1002FBAA10412F2884FF2A87AC893", + "l": 1024, + "algorithmId": "C65E2F193FC809CE83D3D2B3CB5B3AC5" + }, + "fixedInfoPartyU": { + "partyId": "5E7818A4425CD4B6B450ACAD33C93CAD" + }, + "fixedInfoPartyV": { + "partyId": "9827EEFBB5B5D056AEA783F21FD1A328" + } + }, + { + "tcId": 589, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DB96B768BFC3FAD66E23D6BA1D12BAB", + "z": "5028B2671EC1F076C672EDB8C8CCF318213E28850F047FAC1371BA9249", + "l": 1024, + "algorithmId": "758C9C28E15FF097C7E94D6860CD01FF" + }, + "fixedInfoPartyU": { + "partyId": "15E691CDACFE621AE19697E2372C505E", + "ephemeralData": "C6EF56ADEA5C813E07FB35B1B356FAAB52F9A2D3B6467DBDC2304C9544" + }, + "fixedInfoPartyV": { + "partyId": "F4C32CF0AF939B1FDC1D227AAB0AE4F8", + "ephemeralData": "4CA215947ADC88D84E98EFBD7F8D671546EF14069C1AB0E01A5504B6C8" + } + }, + { + "tcId": 590, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5116CDF6B0D1E6A577E301AF72B1F9BE", + "z": "440E559D0429AF65847815D26C15BEDE2FD9042D6914AECB5C1769B581", + "l": 1024, + "algorithmId": "13BFB8CE778C2167333716F5FB15E82B" + }, + "fixedInfoPartyU": { + "partyId": "FD81089D4BF2B6A74E19F63B0B993D86", + "ephemeralData": "2C231BC5C6A5E8F3CE6AF0E3CF9F76BF1340051CCC9EB72344BC28C748" + }, + "fixedInfoPartyV": { + "partyId": "13D96F6DE2194288E68E54FA2C2E5DE7", + "ephemeralData": "88D6A147B8E86B1814D6BFE47194087EF582DE553B929124CDAC7CF794" + } + }, + { + "tcId": 591, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4595B0C9CEE8051BDB6A3BD12BB936A9", + "z": "CA78EF06980D33AFF5461043EDC01AE69D7DD4BE8A7A0CFC7B4155E803", + "l": 1024, + "algorithmId": "4FC6E076ACC49107A904B37E0BE20248" + }, + "fixedInfoPartyU": { + "partyId": "6712A03E29ACD3858A8DA97FFB57DF35" + }, + "fixedInfoPartyV": { + "partyId": "930D75A848B5534F4E9F86E027EB353E", + "ephemeralData": "41D7552FADB75854A28DBAC8ABA5200EB61D646F68368C3C1D817CDF55" + } + }, + { + "tcId": 592, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D29391F4B7AE8F25FE95A5A75A0216A", + "z": "6BE12D94AE26272BB16163C148FCB1BD63750CFDB875E45D603990903E", + "l": 1024, + "algorithmId": "7EAB373FBD06ED24580DE5CA20F49880" + }, + "fixedInfoPartyU": { + "partyId": "4D5CBD2B3D0C1E71A6AE7E68C3EB38C2", + "ephemeralData": "2457A2D656033FFBB221C5F5090230CB8A696813ECC8D55E027D3634FC" + }, + "fixedInfoPartyV": { + "partyId": "456B7CFB16D9C0EEABF9983BD9CB6E86" + } + }, + { + "tcId": 593, + "kdfParameter": { + "kdfType": "oneStep", + "t": "31AEF4A6D411DDFC13AA421523A53840", + "z": "598BFF45E223754FA56AC6A8E9A7831DC0F0B09C9E85CCBC18F178F009", + "l": 1024, + "algorithmId": "10E1BE3648FC53D355766A68FB598D65" + }, + "fixedInfoPartyU": { + "partyId": "927984206B84F8EF45463ECBA4DEAEA2", + "ephemeralData": "FE42B0F9613DDEF54CD1EDFC2B41BDD20F557ABA8C442EFDEA6959DE52" + }, + "fixedInfoPartyV": { + "partyId": "CB833F60B0B0B7F03120F22890FCCA85" + } + }, + { + "tcId": 594, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06A4451DAF16BD0D6B364AF8682B6258", + "z": "8B32EAB97054BFA8FF2891181EBC49DFE84FF3C3E2023169CE6A6062B2", + "l": 1024, + "algorithmId": "746A05CEB8BD3C006938A1EFF825A79E" + }, + "fixedInfoPartyU": { + "partyId": "5635862831EEA6FFA56B06B698BB4C88", + "ephemeralData": "F7A2721E17DDD931B738765977FF7F14FA0BA309077BB4059159732E83" + }, + "fixedInfoPartyV": { + "partyId": "C8FCAF1C0647F631BEBC3689FE8A22D7", + "ephemeralData": "322F634540C3DE710D18E62F84129373429554522F1EBE2CB1316F9105" + } + }, + { + "tcId": 595, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA354F746BB8894DDF2470F0BA5DDC16", + "z": "AF3D77317EB0A948BB3863A04418B43480256328265C08267F13074927", + "l": 1024, + "algorithmId": "43253C479E4E7147970768C6C511A221" + }, + "fixedInfoPartyU": { + "partyId": "0DC79401D4F0C41135FD77A43BF7239B" + }, + "fixedInfoPartyV": { + "partyId": "CAAE4E95569FDEEFFCECD326A0D5195F" + } + }, + { + "tcId": 596, + "kdfParameter": { + "kdfType": "oneStep", + "t": "873C2DAF141F0BE552CBA2ED4D56EACD", + "z": "4709EF4B3B526E4502AE6222BA391086073D6B99E942C2E86F3AE4259C", + "l": 1024, + "algorithmId": "2F5794C0379964F58E7B6615D59E07F5" + }, + "fixedInfoPartyU": { + "partyId": "3653641327E4C01CB09A9A1228C8DF66" + }, + "fixedInfoPartyV": { + "partyId": "B9F823FF91B656848DCB8C5AE6FB5E4A", + "ephemeralData": "1FE3448D9AFD520B600D9101AD1C1BE0EE877E619D8975EBF515A3B982" + } + }, + { + "tcId": 597, + "kdfParameter": { + "kdfType": "oneStep", + "t": "25BEA38FBD95DB9281CC0EF00DCCB86C", + "z": "32043AA6B281EFE00339497DE911C70138337FBAC56B537478AF7EBF19", + "l": 1024, + "algorithmId": "714E5DCF30C61507FA3AC7DFCC287F8F" + }, + "fixedInfoPartyU": { + "partyId": "8E35486164F7F99FDE1016A156646B7C", + "ephemeralData": "D451844A33B7EA97DD1B4F48384F3AD1FDFCCF3921855911D483139049" + }, + "fixedInfoPartyV": { + "partyId": "40DD7FD00A5AA8AFF1A95D18F2BA97A2", + "ephemeralData": "10F5A0895E9073E40914A17FB0088C894F5BA6B1BB73E5FF2815BD28A1" + } + }, + { + "tcId": 598, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D192EA8A3F364A1858B643AE4C938EE9", + "z": "83B93A0B1AE57497D36D5DA5DECA19E92E34857B6D63D57112B2D6BB31", + "l": 1024, + "algorithmId": "CCDCADE1D2A5146C6B64B9035264D129" + }, + "fixedInfoPartyU": { + "partyId": "BE32DE30B878BA2AD726A1D38182E125" + }, + "fixedInfoPartyV": { + "partyId": "1C370697F04699FD248CE4606B312E2A", + "ephemeralData": "E6E007D65CF5FCC517870BE1982641B8A3B5E5EBB3F3F2485AB2029A48" + } + }, + { + "tcId": 599, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6316BAA888D8942D54FF611DB0079EE1", + "z": "38F6C753094BF6BB4B67AD29005853FFF6B4FB659FBD1B0DC176D47665", + "l": 1024, + "algorithmId": "1AA1F248EC592261A0B3108AF5A809AC" + }, + "fixedInfoPartyU": { + "partyId": "65B7114982D3582B1ED187F50BA6F82B", + "ephemeralData": "E4D9D1D53A817700A8556D738525466E6C8980AA17AF0D7E877F412E5E" + }, + "fixedInfoPartyV": { + "partyId": "51DDDE5B9879A3B8B598F4BDE53EA902" + } + }, + { + "tcId": 600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "698D83A36220441BDE2E0355D524160B", + "z": "99519647059E35FC9F669E71FB530736552F02A9538F7F383492C8BE23", + "l": 1024, + "algorithmId": "6D26BD20F7A5B458050AB995B22633A1" + }, + "fixedInfoPartyU": { + "partyId": "00AB829496D33893F561D33B26D562A8", + "ephemeralData": "CFCB38675EA5631A082D46AAF62EA2ED8D2A8826CA27E53167CC3DE488" + }, + "fixedInfoPartyV": { + "partyId": "D9AC70FFEF3041CC13B1BE069D8A7A0A", + "ephemeralData": "3E1569291AF02E868CFEACC0571AF9FF6D97816EF7D264D79E68314B06" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 25, + "testType": "AFT", + "tests": [ + { + "tcId": 601, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7677AA667779AAB672151749B759606", + "z": "FEEC326A7DC2837BCBAA48CEF794AF284E04871EAC348981FFD61992C4806A91", + "l": 1024, + "algorithmId": "4D2ABC5C867254789399E1186EEB9D1D" + }, + "fixedInfoPartyU": { + "partyId": "2348741DEB1A76BFEDBA663CF2F4CAED" + }, + "fixedInfoPartyV": { + "partyId": "9C4E9458560E48B4BF49D96FE5F63E28" + } + }, + { + "tcId": 602, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8A3CA41266F5C75E7993E7A8AB076C8", + "z": "D2DC4878B69758066E8CA2B706C8C973C78AE7096C3A64BEA02F07E3E4D0845D", + "l": 1024, + "algorithmId": "15C54CEC88FB079D1E6EE8120D409FAD" + }, + "fixedInfoPartyU": { + "partyId": "8DDD2C0415CC1047C132E17C682B2263" + }, + "fixedInfoPartyV": { + "partyId": "877528786F8BDE61F7BB209D0277B2A8", + "ephemeralData": "56E8CE52A6031A717002C5D06595CFE40A7AD96977D5A7BF0697924A22BCE709" + } + }, + { + "tcId": 603, + "kdfParameter": { + "kdfType": "oneStep", + "t": "210BEDAD94C9D10871A0F6DBA142DD21", + "z": "A442E319B9E505A93BFADC0F969CEDD638F3FA4B70146EAF3E769F112AEB4DE4", + "l": 1024, + "algorithmId": "D222C6ECE73FA292EF78E38AEE764A32" + }, + "fixedInfoPartyU": { + "partyId": "0D252FE26DF1036682C0F7DA9E031E96", + "ephemeralData": "DF79598DEA0C2F192CDF5E54F72DD96F2BCC24BCB90C81B05307117551BFBD90" + }, + "fixedInfoPartyV": { + "partyId": "DFAAC8B476294BFB0C2153832589DBD7", + "ephemeralData": "855177693409FC21B81BA8A69BE1E12C0757C61D05453792DE328916F8557241" + } + }, + { + "tcId": 604, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D5F55A6C66F382C3326DE117B209384", + "z": "C8AAF95DA6ABE359634D39218138EF92A19E1CCB9792D85A93AFBB26B91C7420", + "l": 1024, + "algorithmId": "16183AF523DCD31E50BFCDDFD8168041" + }, + "fixedInfoPartyU": { + "partyId": "10678E4B38218DE4C8EF5F1D81035E73" + }, + "fixedInfoPartyV": { + "partyId": "2E60350910425FB927E65CDE1CB633CD" + } + }, + { + "tcId": 605, + "kdfParameter": { + "kdfType": "oneStep", + "t": "611C2C765E080649876769F7F5D53B8C", + "z": "7A8D57218C76D3781BABAF0FA8C1EDB220C75A60C93E2EC479CDF1BFD8EBFC03", + "l": 1024, + "algorithmId": "13F668A20D2292A603B52993BF5BDF85" + }, + "fixedInfoPartyU": { + "partyId": "EF279D2BC8315C6D9B531E7DA60AC175" + }, + "fixedInfoPartyV": { + "partyId": "A06C57417AEB60CF505451736B88ABE8" + } + }, + { + "tcId": 606, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4EC9194394854B66FA31A1B492278F77", + "z": "DCDE823ABB47399BF16410529645718518EC051EC8BE6958C7D6556BCADD9214", + "l": 1024, + "algorithmId": "B7C745935B24D2F62116BF06AD34CD93" + }, + "fixedInfoPartyU": { + "partyId": "60DC69E34B3A60B9214CFC680147D609" + }, + "fixedInfoPartyV": { + "partyId": "8AD58D1A0E312EEB2D03FC32D4D10E6C", + "ephemeralData": "64D39F121ACD7CD344D9D7080C74CE5CE65D310E18D6F1DC232489B0EABE48BE" + } + }, + { + "tcId": 607, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AC0CCA8BD809629E8E564A6176DA5D1", + "z": "D7E7962263A0FA5F8F4AB3850B295A28234D874C9AEF66BF03C7D7BA98EB5DD0", + "l": 1024, + "algorithmId": "68D81A801811D1A39054A2FAC9E344F4" + }, + "fixedInfoPartyU": { + "partyId": "A29C4A753F5869DDFAAD402E23487711", + "ephemeralData": "5E141A0B5B1C2E2FADE8F4293ED488177F28E16336BF395B121C14B4A24D945C" + }, + "fixedInfoPartyV": { + "partyId": "887AC3ED06D2112C635D349901C51AFE", + "ephemeralData": "B36BC0E1211811702BE3E6271B483861244107C0F88573A0AC681F63C8C25DC0" + } + }, + { + "tcId": 608, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ECA990076478B1224B8E92A7B3A357F5", + "z": "81B4800B7B1BD3154D2CA5A016B3C27F36F02B079EE62379F9A5A98F39CE6B07", + "l": 1024, + "algorithmId": "5E62EC5387F11811BBE4842D3D1EA4E0" + }, + "fixedInfoPartyU": { + "partyId": "F644F0AC833AA9B14CCE281DE780056F", + "ephemeralData": "8F24A1A86AF66467F3571808AB012F646FF8EE2A8DBC24803E614B93DC45E442" + }, + "fixedInfoPartyV": { + "partyId": "BB87BE12039CA91FBADBA46E9CC9BA25" + } + }, + { + "tcId": 609, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4F62933FF408A961DA8913673B20E61", + "z": "F57714126728FFEE427C355772DA47564A3171F07498BA74F1A2A3A1F7E0A0C9", + "l": 1024, + "algorithmId": "333DABB0EDD9B71FAA1353F1BE1D97D3" + }, + "fixedInfoPartyU": { + "partyId": "242D33F87CFEC06BBD9246CA102424C1" + }, + "fixedInfoPartyV": { + "partyId": "4360DF3B7BA1089E23935C834EECA8F5" + } + }, + { + "tcId": 610, + "kdfParameter": { + "kdfType": "oneStep", + "t": "692D1AEB9685EC09F37228E8F084A20A", + "z": "8436660E01126BDDD81A7306D7271F984B155873B9BCFC943F3C0A4EEC933D5F", + "l": 1024, + "algorithmId": "6D929953A8E5C69E22FC94EE1B5F5001" + }, + "fixedInfoPartyU": { + "partyId": "B080B96CEB5B4565001EA60516497B98", + "ephemeralData": "EB246B2F17C1712700F245FE0FF72037C62E303BF7E20EBB22EB6256F2CBFD3A" + }, + "fixedInfoPartyV": { + "partyId": "152A083B984AF35D1842926A69D42A61", + "ephemeralData": "461EC55AFA0BB2DEDDA55BC45B1196F7E94FF3D3A1E4CBCB0AF4D8A189983424" + } + }, + { + "tcId": 611, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57CC9E7D299DBC5D45B3ABB803BBE521", + "z": "6A9A0317641EF9A2CEEBF633AF0CFE19913648F3F28147CAFAF8CC12511F20D0", + "l": 1024, + "algorithmId": "90E6AF5CAAB6EC08172DB4217B3F567A" + }, + "fixedInfoPartyU": { + "partyId": "1551C1297139C1ED547D94903BDA5E20", + "ephemeralData": "A7E1A579BD72C2B7818501FA6E94D117ACC6E393AE18AE5035D9231C917E0F0C" + }, + "fixedInfoPartyV": { + "partyId": "DD59A664E53F06003B04D81BF30BDE08" + } + }, + { + "tcId": 612, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A48433C50F22BD9414AB82B41EE33A71", + "z": "08228A1AC06161051149225EEBD244D68FE93E7170A7BC151EF4234A0DCD0CDC", + "l": 1024, + "algorithmId": "70ABFB40DBB9B03CE89A3C7DF676B193" + }, + "fixedInfoPartyU": { + "partyId": "55A33BDAF808C4454E259D2E33FE142B" + }, + "fixedInfoPartyV": { + "partyId": "998A0434C2E807BBC3BA469960813892", + "ephemeralData": "7DC0118C3C95727044CE92A7A15287EC0BBECA37511999A5841E3860B5405C44" + } + }, + { + "tcId": 613, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB207C79B05A0D850B065EE31B589402", + "z": "33D382318CD43778A476776056AF89054E39876EB24888A5A47D9AD09B9E1175", + "l": 1024, + "algorithmId": "D628A157C164EAB04D338B9959437E03" + }, + "fixedInfoPartyU": { + "partyId": "FD9C54155A76B41767058D02454B79C9", + "ephemeralData": "9B248F1B01AC3E4784784BF33BF5E814B42273F0C59822F99BFE8BCACDEFAA0B" + }, + "fixedInfoPartyV": { + "partyId": "4026A16D6A08AA4DEDFF66E4D825B8D6", + "ephemeralData": "17A5170D4349EE07E9AED04A4E38EFFDFE6A80FCDF8B856B32BFDFC2A76B00A6" + } + }, + { + "tcId": 614, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5F454AF354E165ACB839F67F407423C", + "z": "5E4D2DE8CA2459DF268485C39CA36E7E4A9A4B473C1EFF99E950C4C01E5F75EC", + "l": 1024, + "algorithmId": "38C9B044DC3BDDB2FC6336E17F2463C6" + }, + "fixedInfoPartyU": { + "partyId": "0E834681685A1EF27877AB51CEEF76E9" + }, + "fixedInfoPartyV": { + "partyId": "B16B01859F673E38F0670258B140B704" + } + }, + { + "tcId": 615, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D533B21F529B395A05AA2166FE9CB31C", + "z": "592B190AD0AFB5C2D96A768408495DDA7FCBD4A38B874C720F7E6E46EC1EBB0F", + "l": 1024, + "algorithmId": "AA3698302804760B4B6CA60A09BA6CFA" + }, + "fixedInfoPartyU": { + "partyId": "86611F9A198C8C35AE634A7A75192E42" + }, + "fixedInfoPartyV": { + "partyId": "205805ADBE902A455098512A68C2781C" + } + }, + { + "tcId": 616, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D02F072F68E9224735B84CDA2FB12AC", + "z": "D65B8DD059E5C19AB4DAC4A39479A639A733141992DB4F28AAC497426A2656E6", + "l": 1024, + "algorithmId": "E2194511053C03C7CD835EEB0A35F538" + }, + "fixedInfoPartyU": { + "partyId": "105AC8A87E79504D159FAF1EBB1F2F01" + }, + "fixedInfoPartyV": { + "partyId": "F49BDA6BB181D0727B226A6D76CBBDE7" + } + }, + { + "tcId": 617, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E36317B6DE6D8C1DEA5C5A67F452BFF", + "z": "E516574274BAB9EF11BB5A10A355130F16F4651F102AB64865FB7241D4C49915", + "l": 1024, + "algorithmId": "A875CB5BE9AB851792C5284D7B9794D7" + }, + "fixedInfoPartyU": { + "partyId": "5BBE949BF036DF308D66A007C1D31C4E" + }, + "fixedInfoPartyV": { + "partyId": "9FF12386B887E5B2DDBB7E93DC685ECF" + } + }, + { + "tcId": 618, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37AAA430C01C21E2C3E0FA2B46BE45AD", + "z": "BE481EFCB8F178E34E0C94CC5843146B9E08542FEC81EF3E0A7DD16F96F75E56", + "l": 1024, + "algorithmId": "791D5283EB80906379DE19DAD33BC349" + }, + "fixedInfoPartyU": { + "partyId": "8D93F3793C08B4C8DB0A865A249549E6", + "ephemeralData": "E4EFD5D08C188F680AE444E3BEE606C3A71F0DC5DFF7B3A852C16A52601C547D" + }, + "fixedInfoPartyV": { + "partyId": "A603FB12D3B1D2D3DE935E2CCA7E9E63" + } + }, + { + "tcId": 619, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBC37026065034E4EBEDFDA54A868DC9", + "z": "66893F2C9016F252D44B5C531751C1907857D5AEB19380F0E0415AC2F05D8E2F", + "l": 1024, + "algorithmId": "780D5EEB681A48D7AF457CC4FBDE40D1" + }, + "fixedInfoPartyU": { + "partyId": "0F3C3C6A2459A54B6EB61C015D394E84", + "ephemeralData": "B6166A2602ADCCE20A7376F99B602D2CF6B1B4B144CF9E8842D278AB1F6476D8" + }, + "fixedInfoPartyV": { + "partyId": "F19A2AE77E781A66D5D84725C953B207" + } + }, + { + "tcId": 620, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC68E8AB8F05E806DF3CC9B7345E01AB", + "z": "ACFCFDC3343C3B2DD41A33ECF8DC3F7043168CA5CEDEA7222BA2BF1E126ABB4D", + "l": 1024, + "algorithmId": "D8ABA5C220272395A78CC91C431A699D" + }, + "fixedInfoPartyU": { + "partyId": "7A3A6EEA1011325FECBA983B06D33BBA", + "ephemeralData": "01BEE90A21BA99F085D7070FB9691432AA25686E82E3E596A019FF700C6C1EC2" + }, + "fixedInfoPartyV": { + "partyId": "C9F069D6B3A565B93B49A090DE0162C2" + } + }, + { + "tcId": 621, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C33B2A31D6C480B7E1DD016A6839C649", + "z": "433E6241B565DD07DA4539C7E98307227E998409D7F373CFA99FE2DDFFA0BC96", + "l": 1024, + "algorithmId": "293D51E9B0514D6E6F3806361CBFE4DC" + }, + "fixedInfoPartyU": { + "partyId": "33D8050DF6999027664C3DB02D198E12" + }, + "fixedInfoPartyV": { + "partyId": "346D67E97DFFF8C6765DFB51A729B346", + "ephemeralData": "2B283EE94D45EAB6BB93C09C14AFFACF310501CC4FA037C21CBAE4CD6C6A7AC5" + } + }, + { + "tcId": 622, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E931CCBBDFC711B1AC5ADD26999FEA7", + "z": "EADE683A7E6187FB0A8281DD2CFDBE09D20FA522A479A8259AEBC8224E403778", + "l": 1024, + "algorithmId": "40B0D50E3B53DE06A92637F07DA2C0B8" + }, + "fixedInfoPartyU": { + "partyId": "76F821342A43FE13DE1E6294D7C3054A" + }, + "fixedInfoPartyV": { + "partyId": "C9BC606C669B5336B4F670671E0CB42A", + "ephemeralData": "879EA677830E5E22CC94E3CBD1B40F1CEB8EDAD6583DDF191E9FA73D37E21D59" + } + }, + { + "tcId": 623, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69111C9FC1F46D59CD3F91D3D7B5A571", + "z": "E0EB4996396322D2339F06A300F318934BE48AABFE1E68005361EAF193B44B94", + "l": 1024, + "algorithmId": "CDABBB1BB059D9FD8A0B8BA7BDEF12C4" + }, + "fixedInfoPartyU": { + "partyId": "CF2140726AD7614486DB1806D01BEFC8" + }, + "fixedInfoPartyV": { + "partyId": "7DB7BC2787CFC081AB8EC51129862DA9", + "ephemeralData": "20A51CFF0C5885258D2AB7B7651BEDB1940092C1352E42BC6D3D7B44146EBB36" + } + }, + { + "tcId": 624, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F5EF303849031B03D7DF67CD346A4C9", + "z": "23B73253D6D288BFF0770EFC1F8A36EBF7D6C3AE848DA47DED9DF119B0B535C9", + "l": 1024, + "algorithmId": "BC8D847251236217BAB6E30783C63DE6" + }, + "fixedInfoPartyU": { + "partyId": "ED8FF868D7555906D7A2DCCF3D871304" + }, + "fixedInfoPartyV": { + "partyId": "ED4B99C71E90F1C4BDBA123E69CC9899" + } + }, + { + "tcId": 625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F8186F82C6373C04CEC6278340BBD3F", + "z": "3B9A9F26F4A47AD17445D50F60BFFF300EEF439328721655C540DD7F54BB9A59", + "l": 1024, + "algorithmId": "53F6F276C09302C293CB896864C6BED6" + }, + "fixedInfoPartyU": { + "partyId": "7CB9C4EF61DE457C62D3A237DC672381" + }, + "fixedInfoPartyV": { + "partyId": "7CB69F4C3805824754836021C7F9FC54", + "ephemeralData": "28A63029CE1FEF87E3C36073A1A2D16F27C10D84E4F7C9E35D2B8DD712DC6FA6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 26, + "testType": "AFT", + "tests": [ + { + "tcId": 626, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7468BB62E07389194976944E792A54E8", + "z": "14ACE077E7007338AACCC14BEA02E636D127B975DD8E019F1D452B5BD3", + "l": 1024, + "algorithmId": "C41700A649B64C43CF108835FAC15E95" + }, + "fixedInfoPartyU": { + "partyId": "DAD99B9B5249A6D2D44B7642E4886D2F", + "ephemeralData": "7978A5182D9BC08F423108AE7A55BEA65D2BE79ACA9CF916F571A2E278" + }, + "fixedInfoPartyV": { + "partyId": "63DB77488E5639A309FDFE9825999C0E" + } + }, + { + "tcId": 627, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26603A72B591609C0B2EB44E323111A7", + "z": "472986F49D212CC97FAFB76EDF8B010DED6DA4C166E47EBA15ED08C005", + "l": 1024, + "algorithmId": "27AE7C4B67E8AD0D6F72D98A2200CCD5" + }, + "fixedInfoPartyU": { + "partyId": "108CCB4C93ED11C1738B61C14DD2FDBD" + }, + "fixedInfoPartyV": { + "partyId": "5433204FE7933BA6B18203D6065F8E1D", + "ephemeralData": "8CF8261A9C50F9E641CAF7D6DC11A0FE321BCA5D1E1775AB2B20D1C4A9" + } + }, + { + "tcId": 628, + "kdfParameter": { + "kdfType": "oneStep", + "t": "554DFD9750466EA242DC45D10F77E3AB", + "z": "9DE07738B5A07EC38DB4534DC8899702CE1D72DA84D12F817E0C55C1BE", + "l": 1024, + "algorithmId": "0C077954BFBF2A36F92CE34E197B91E6" + }, + "fixedInfoPartyU": { + "partyId": "D3F78BA5B3298DFA24920169DC3861DC", + "ephemeralData": "0029BFCD64040065403978A7344F0A4556B443FAC798AA4A88BCD69F73" + }, + "fixedInfoPartyV": { + "partyId": "4F07A1438E1754E009D7C5F6CD8738E7", + "ephemeralData": "AA61535345328060E6BBC1E098808BBA58D19F0E7E997EE371641F47A3" + } + }, + { + "tcId": 629, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1CCFE790A0572A6F88A2DA86E4B1B52D", + "z": "45DC76D94A37F3C3DE1A6F6DBAAD52C4192A026C922D34FC19125E71E7", + "l": 1024, + "algorithmId": "C4839E9AEDB2C504BF5E9D07E562EC11" + }, + "fixedInfoPartyU": { + "partyId": "D71952848030AB703F280695F51C2FBD" + }, + "fixedInfoPartyV": { + "partyId": "57863FC8277D233DB57823E6AAD8AA6E", + "ephemeralData": "18ABE25740A40BD79B04CB6AD25FD97159993EC2496D29BE8335E63DD4" + } + }, + { + "tcId": 630, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73A71C98DF14168875C3F80750507B0C", + "z": "157D5352E1687F4D56FC7696FEC6130396CB64A722F158B21230F8B640", + "l": 1024, + "algorithmId": "78605CB9914DFF6D0CED2A93DBC7A560" + }, + "fixedInfoPartyU": { + "partyId": "93602E5E2359652F630250DA5850740D" + }, + "fixedInfoPartyV": { + "partyId": "DA5FC04F8F36F21CABA502E14E0285DF", + "ephemeralData": "D4CB5DBDADAB722CC77ACD72E9D51F1FF7D91D30CE6210B2BB72143314" + } + }, + { + "tcId": 631, + "kdfParameter": { + "kdfType": "oneStep", + "t": "352845CD7C87403DEB6B80E9FE38C300", + "z": "22555A6681990984CF241EA247DD1FEE42293AD66DE05F758480EB3085", + "l": 1024, + "algorithmId": "23063684E90FEDB9E513A9959851ED1A" + }, + "fixedInfoPartyU": { + "partyId": "46129158638A9F854A5364DAC4731796" + }, + "fixedInfoPartyV": { + "partyId": "0A1A1DFE5226016604272B34AA204FA8" + } + }, + { + "tcId": 632, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D73F88C3CB71DC75E4E666784DC4C216", + "z": "2FE3D9A339C3A801BF102DDFB07998BCFAD11952E6E4A141505F6AAB19", + "l": 1024, + "algorithmId": "95A0F3D861F6C9727982A1BF4F872029" + }, + "fixedInfoPartyU": { + "partyId": "4C2667E020D54441882D471F89EAB5B7", + "ephemeralData": "EF579A6FF06A74DB472E9C2FB4BE67AD25A70318182F5BE41BF844B8EA" + }, + "fixedInfoPartyV": { + "partyId": "2A2F075A8FD19B379E21B82476819ADE", + "ephemeralData": "9ECA937C1F45F40130817E393F0349AC07D9430ECD1E89372C626E961B" + } + }, + { + "tcId": 633, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D0A2EE59FA9D44D77085FF6B8EE2BE7", + "z": "9ADBB7C5742B4DCC4CC672CC7F06AA5AAD222300EA894DF81A94F21F98", + "l": 1024, + "algorithmId": "9E78E318D23FBCCAE39243AF043D7D8B" + }, + "fixedInfoPartyU": { + "partyId": "3CF6CE65DDEE83E3F0F93A31B29BFEF3" + }, + "fixedInfoPartyV": { + "partyId": "7241551FC7D1CBC043BC181FA22AF2CA", + "ephemeralData": "28286E706EDFE5D3F7B1C4FB8EEF56FDE7E883489B16B0207B6F8701F6" + } + }, + { + "tcId": 634, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5AB6EB213D453B109CE0E6C47DEF0645", + "z": "43B8192944F92C4D94381BC363C6E9141F95BACF714290D47B8B197171", + "l": 1024, + "algorithmId": "EC4DF1071C005D6DC18B88F42AC625DF" + }, + "fixedInfoPartyU": { + "partyId": "2BF40CAD757071C1D796ABA5A6829F4E" + }, + "fixedInfoPartyV": { + "partyId": "D8BA5147204423C67ED05DDA7E52FB7D", + "ephemeralData": "B65187DE28B14274C4661EACFACD3841E6C2AA52A2EE53697AEE382F22" + } + }, + { + "tcId": 635, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CECFE4C6CE3FECA785086C79EFBA68D6", + "z": "29B999038BABA8A7E1C2591444F90C7CB998FC57217473710EC23425DD", + "l": 1024, + "algorithmId": "F584DD79140F64A0302369A640899317" + }, + "fixedInfoPartyU": { + "partyId": "6F22CE46F564E7C1A954374194BB6A54" + }, + "fixedInfoPartyV": { + "partyId": "B9D70A37897D35EC0D8AB18A46DF2ACC" + } + }, + { + "tcId": 636, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50539248FE88BF338B2BA7A7C1C045DA", + "z": "5576ED43AA31AD79283AFC9E424A66D042B25D77A380B6238DD78C6718", + "l": 1024, + "algorithmId": "E00F74156E94C4776E79DE3520CFD5D8" + }, + "fixedInfoPartyU": { + "partyId": "49301E3F8FB65337E7AE554370E4257A" + }, + "fixedInfoPartyV": { + "partyId": "4036492C5BB99F281996AABC3E586249", + "ephemeralData": "8CF4B61A574E7ABD161D8AF931E77C5BE8AB464B0A62B77AFE42785129" + } + }, + { + "tcId": 637, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D100ABB3416796EE7D87E61BEBD28D3", + "z": "5D2825C429420314E1EA46D09FBE18CE81585FEF12E943C9860C57721E", + "l": 1024, + "algorithmId": "FDDD142C0B55B0AC85BB73A294AB02C0" + }, + "fixedInfoPartyU": { + "partyId": "1E72ACD4E40A76D1BDB9EC179FA2C987" + }, + "fixedInfoPartyV": { + "partyId": "1BA3C2E2156F095B25C3EA945761A065" + } + }, + { + "tcId": 638, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54FEC569C1E8135F924D65BA17D325D1", + "z": "316FE867577A19B48A98DB22A01ADC88FA4E6356F2057490238AEE8E44", + "l": 1024, + "algorithmId": "88D112EBF2D323857E2C198248F9A5E0" + }, + "fixedInfoPartyU": { + "partyId": "026424CDB0406446235CAD7E25C0156B" + }, + "fixedInfoPartyV": { + "partyId": "05A8BC32747590C965E94621CD37D797" + } + }, + { + "tcId": 639, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC143486802BA1D98225ABAB402650A9", + "z": "95A42E81CCADB7B7DA53D686CC38A40493F4D0FF4473410C79514854AD", + "l": 1024, + "algorithmId": "0F4E0173BB1559568797C0450804F259" + }, + "fixedInfoPartyU": { + "partyId": "DAABFCB20E9D95FCB91F0E4945210017", + "ephemeralData": "4539F0D07F85F649AEAFFE2CDD9DDDF8859A9DF6F1C05EFFB3F2FCD5EF" + }, + "fixedInfoPartyV": { + "partyId": "82175784C30063A3A759929AD30BBA27" + } + }, + { + "tcId": 640, + "kdfParameter": { + "kdfType": "oneStep", + "t": "535082EA57ED71644D5488DDD4767C11", + "z": "1F280D78C37A112E776628E2C4E52A03281856912BB0C7D0E88EE3AA22", + "l": 1024, + "algorithmId": "C70C58404AAAC2FFB7C20C9A72C51803" + }, + "fixedInfoPartyU": { + "partyId": "324BA8C6B441DE7E74962756717DCD6A" + }, + "fixedInfoPartyV": { + "partyId": "9FC270CB6899F4DBE95A079308476124", + "ephemeralData": "0CFD337A8723C6D716E1AC538748C585B1B1E703457094DBD1A6D9C3C0" + } + }, + { + "tcId": 641, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F9D366CEB725A5764E1E12182E2C161", + "z": "07CADAFB6E8DB65D46DA5743B6A0F32A32110E1B92506FF2E71914A7B5", + "l": 1024, + "algorithmId": "550AC2050B307861428B7925315F506E" + }, + "fixedInfoPartyU": { + "partyId": "D306F092526E6EF1AD5E56B0DB2AD59F" + }, + "fixedInfoPartyV": { + "partyId": "A517ECAB87F05739C2DE2835D1662C32" + } + }, + { + "tcId": 642, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F41F1AB24C6E166AA0C37EBFFE2B7589", + "z": "39BAE6C1B1AE0A7E638CB8A37006873D15BA207B5F3E96953E6B41BF20", + "l": 1024, + "algorithmId": "50D49E42AA8ACE572B63A8D15161752D" + }, + "fixedInfoPartyU": { + "partyId": "5E439EEDDFF312695D838996AF3D7917" + }, + "fixedInfoPartyV": { + "partyId": "DBAE7DB993B4A19093610EDB688F2D8B" + } + }, + { + "tcId": 643, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77C4F13B834152E4299712552F38C60A", + "z": "229B2CAE4E1B3A27C7B36D75D0BE3D07E3F9DE9E8D378178511E4A728A", + "l": 1024, + "algorithmId": "57A7D50BD1CF95831B2563EE11D8E52D" + }, + "fixedInfoPartyU": { + "partyId": "33B6A200449105888A984657D192DFA1", + "ephemeralData": "6EDC6F4833A4C08C284CBEEB15E54CA2D02F3863B01183C6B28215DD45" + }, + "fixedInfoPartyV": { + "partyId": "60E3A7C00F19EF9F864E69B0E78384C6", + "ephemeralData": "3CA5FB765FFD392047B4DEE9A2A6566A4E701DB975E7F7B6EB5F4562B8" + } + }, + { + "tcId": 644, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99595131BA40F1966CF3521A1C7EBA65", + "z": "131B188D870F7FF8949F4879FFA230DFEEB2113F44B00C520A7FC7CDBB", + "l": 1024, + "algorithmId": "4AFEBFB25B96DAE9C765530CAFF97B62" + }, + "fixedInfoPartyU": { + "partyId": "41DBD7CEAD133F7FF7E59FFD809796AB", + "ephemeralData": "F1353980AA4B3FF13179A8999DF1397CF7B74DC304BA09B8BA9EC0B77D" + }, + "fixedInfoPartyV": { + "partyId": "97DCF8C58DDDF0755A611046CDA420C6" + } + }, + { + "tcId": 645, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A778FBAA7319E5567AB4E85AE374096", + "z": "DDEB2B72A776CF72B546D13A79F29F9D1914D44179BB4BF9A36DC2EDEE", + "l": 1024, + "algorithmId": "001E8907B08BFDAD23190E8980DA53C4" + }, + "fixedInfoPartyU": { + "partyId": "7A43357BF49D5DB0C61AC2F1861E6971", + "ephemeralData": "5134DDC82B84DB278EB6D708DD5FCE31C54C1D7CE531BD802D3EFEB84E" + }, + "fixedInfoPartyV": { + "partyId": "FD460C5560E9439FEC722310FB8C3D39" + } + }, + { + "tcId": 646, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC954AC19F2BC54F24E266008FDD7AB7", + "z": "DF4C9473E697384A4F403D2017413DA2087256407755D6018BEF2640FD", + "l": 1024, + "algorithmId": "07D9669B97046B76E74E0A11E398C8FD" + }, + "fixedInfoPartyU": { + "partyId": "0FC01888A3B67CE93F5B9A47D52C25AE", + "ephemeralData": "9D86A42E01E108C19C2A1AC8768A6D17088F08B26D540CA088E987AC1C" + }, + "fixedInfoPartyV": { + "partyId": "53E7DA801F8426F5C4E75777877731C7", + "ephemeralData": "0B95A181C585BF91089081A6B785FC5AE8A5A45AD2E5A55011194965E0" + } + }, + { + "tcId": 647, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CAACF04C95CF6754A79CCDF587CA4E9", + "z": "F7F429EDCB1F35C2A09CBD8B4D0858704DDCC48278C5D03A337F125C23", + "l": 1024, + "algorithmId": "EF25560521A2B5AA82E953EB9F3844EB" + }, + "fixedInfoPartyU": { + "partyId": "085CE0B7D4AFBCA643A8FD760ADB7E20", + "ephemeralData": "C70ECFA6C5B072D7D1E90457CDDB1045B4F327618C0E11787C539D05FD" + }, + "fixedInfoPartyV": { + "partyId": "819CEAFBC906A4A45724EF2E16D8E2E8", + "ephemeralData": "1FFDB32984EC5585DD4E7FA34703A8D58EED9226CB1F5888E9F99E76F2" + } + }, + { + "tcId": 648, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C3623B3A9F0EC55E6E35791241887B1", + "z": "C21B77B5957F520B6F0193D967C60AA6143EB8DC445AE44C3BF428E610", + "l": 1024, + "algorithmId": "42132E136D6B8C863A50B308CD9B79D6" + }, + "fixedInfoPartyU": { + "partyId": "9EB5E0BEA364061E062C5D5E566286A7" + }, + "fixedInfoPartyV": { + "partyId": "C8D4865FA893059D3490DA4229E1AED2", + "ephemeralData": "5D9957C122D1AC64983AC8E2F1E09D2BB15E2ED248C0DE49B5E756559D" + } + }, + { + "tcId": 649, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBBA275350281A7869A1AB1CDD403A90", + "z": "6A62641562661984570B5223B45E8CFDCBF42B6F4265BA854F8CC9998C", + "l": 1024, + "algorithmId": "9785BFB78ABD51952935937DDC7F0411" + }, + "fixedInfoPartyU": { + "partyId": "7FAC9BDA800B48F9F61EFED2976ED5E4", + "ephemeralData": "8B47DABB676EFFF95CBD995DFB57213A2A62800793AED5309BCA8D7B9D" + }, + "fixedInfoPartyV": { + "partyId": "9EF63EE899A5489FD4E977B4E66DE97C", + "ephemeralData": "23F4145B8237C3757C121E16228E55E0631F7CA351C2123DDF28E90DCF" + } + }, + { + "tcId": 650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE1627DFA04640538BF88FB8C4C1E7F2", + "z": "3B82C274D19EC314E5A046508D000EB54AC605B7E082B043AC58E5D887", + "l": 1024, + "algorithmId": "1FDDF93C4806BFAF81B682C215FFC92E" + }, + "fixedInfoPartyU": { + "partyId": "8A01E33F36AF73841463C138A987A116", + "ephemeralData": "6997DD08ECAAF4121D7D15CA462E803887461573E876E08F1345319D40" + }, + "fixedInfoPartyV": { + "partyId": "4E4D5032A61203F55024339F14C230A6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 27, + "testType": "AFT", + "tests": [ + { + "tcId": 651, + "kdfParameter": { + "kdfType": "oneStep", + "t": "419000006783C11474FB949D24272A20", + "z": "5ED9E5286745B6EE2B1EBA5450F1FF4005846F909B9E3298C75A999AFB7AAFBB", + "l": 1024, + "algorithmId": "863EDCC3EFB16D5FDA4CAB28592BE9C0" + }, + "fixedInfoPartyU": { + "partyId": "A5E45FF56B8C5FD087EB4362143370DC" + }, + "fixedInfoPartyV": { + "partyId": "58B29FF354E40C4E9001ED400E01267E", + "ephemeralData": "D9BFDC330736138331829B50D8BEAA2B9FD18E36B32EF4806A13FCA3703B20BF" + } + }, + { + "tcId": 652, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2F8EBB91A8A41131FF83B1EBC90B0C6", + "z": "E1C9005656BDB7A149E69D9FE21CC4479A2E1828E8EC08D49DE63DAB9BB21ECD", + "l": 1024, + "algorithmId": "3179A49A01BCA9CD831BE098D1D79A85" + }, + "fixedInfoPartyU": { + "partyId": "FAF6104E15E7F2C98986DEF27C340AB1" + }, + "fixedInfoPartyV": { + "partyId": "3FD4478F7FF3F968372F1216CFF5D3F0", + "ephemeralData": "12AB390A92E4894404F79B11D42C6643C2C190FBD0B6AD18923E69A8B2E41E37" + } + }, + { + "tcId": 653, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AD558F6A56C86C52956CD39CB61EEAC", + "z": "A84585E6419CF3A29C2268D07B258A8F511C650F3426BB6C8EE352FB2773D095", + "l": 1024, + "algorithmId": "07293BE9334083013C2B53C8621DF86A" + }, + "fixedInfoPartyU": { + "partyId": "5F1A21A67D5FD30A5A0C01C7199EF6AD", + "ephemeralData": "D880F5A508FC70CA7E8E8A03C619877E75E6A8A1B50785D6AD2C7A5A336B161A" + }, + "fixedInfoPartyV": { + "partyId": "2A68A5047CF06B717B5275DA6FCBD83D" + } + }, + { + "tcId": 654, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A21167EF177BFF5071F02AE7EC48FD2", + "z": "ED719C218CB57B30433F0C7FDAC3C1D9F430BD7EDFFAC38BFA5CD0B752107036", + "l": 1024, + "algorithmId": "ACD4FC196BAD1103EF8D984BAA834F45" + }, + "fixedInfoPartyU": { + "partyId": "37893F08EBF2CA3202F482EBA93532EF", + "ephemeralData": "F1F13A5419B5A8C1CC570886884BEF0D52EED9D01A3B21CD3029FB4653BC1782" + }, + "fixedInfoPartyV": { + "partyId": "F062E7B8601E790B37A99AB4859EFC7E" + } + }, + { + "tcId": 655, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08663A00AF28B805A83B707A1819AFD9", + "z": "924B1CF3205FDA0CF62769CC0D6F296B9203030ADB9E0FE567B864B89FF78CDE", + "l": 1024, + "algorithmId": "29B743CCAB1D0ACD4BCC1CD864834767" + }, + "fixedInfoPartyU": { + "partyId": "019E5FD16B33B1F77470184C40CD14A3" + }, + "fixedInfoPartyV": { + "partyId": "C4C8749705DE930165743C59CBD64495", + "ephemeralData": "6A3D5F6F92854BDA58D849C774D85D6B5E3CAD24BC361A15FBB85346C336F638" + } + }, + { + "tcId": 656, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83336D9FE3B5AFE7041320BE6C1A4CF9", + "z": "012F95C419763B4AA16DBB249C544EF08FFED03112A6E0815468A8C16E8D740F", + "l": 1024, + "algorithmId": "F7FA27BDC38F8A6ECE797AC85D405EC1" + }, + "fixedInfoPartyU": { + "partyId": "17D30179DDEBC5E450368B9949B30B56", + "ephemeralData": "68492790D05FB8031864F5B41C25BBA4B1EB8F4E318523EB06535E961951F326" + }, + "fixedInfoPartyV": { + "partyId": "35951FB068AD4260ADC0E8DDA29E675F", + "ephemeralData": "23E467FC4772BB78FBBCD348F1E6D21DD9C47683FFDE15388E31FCFAAE45D52C" + } + }, + { + "tcId": 657, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D732778B4907B0B107CB440476C4ED11", + "z": "5A511ADE2D3E167EBD7EF26C36237FDA0F381043E085D536EF756272924A5FA4", + "l": 1024, + "algorithmId": "B1EC22BBB0E249D1DD64E6DEF01E4A01" + }, + "fixedInfoPartyU": { + "partyId": "A1C4EABE2F3FD577AF3E5AD85C0C0A17" + }, + "fixedInfoPartyV": { + "partyId": "841C1148245B138CE0B26BFB530C6FF7", + "ephemeralData": "23C32F8BE3474B7B599F1B0644ABE6B59D5294FE4EB297BF74407F37DC0438C9" + } + }, + { + "tcId": 658, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE1D6DD8106C18DE877391AD0C76E34E", + "z": "3C52E666E0EDD45DC212A4F51D378991A593D33C5DAE8649E40BB0B2B2F3C0B6", + "l": 1024, + "algorithmId": "16D598A51C2AA4A92BF6D3F8CB5CD153" + }, + "fixedInfoPartyU": { + "partyId": "0A4B15E227C292D89D6423A5E4663C87", + "ephemeralData": "8947E0EBE1634499256EFFAE6D00D57233637D2BC2DD5431AD11F9FF354F7EC7" + }, + "fixedInfoPartyV": { + "partyId": "14ADDB86CF74365443880603679E5AE3", + "ephemeralData": "97BE9E9E8B7718BD4D6C30FBDFD0DE540C51C22F96BA9C2A10C7D79C4A406FF3" + } + }, + { + "tcId": 659, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45EE62FD6C6C9EE6718996B8A0531396", + "z": "938BF6ADC253627DD4BC6733B1556B225514E10FD5AA3D362CD23CFD637BEA3A", + "l": 1024, + "algorithmId": "B352CF60C70F63F68963196139D4066A" + }, + "fixedInfoPartyU": { + "partyId": "0461B3EB7B69264159B5EE54768DC975" + }, + "fixedInfoPartyV": { + "partyId": "B1407F0FE99BE6A62DD2113C0D924A16" + } + }, + { + "tcId": 660, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE88AB841E6DDF269CF96BA7E14CBC31", + "z": "0BE629F237B13C486B6ACAED4D607B1CDE8B939DD51DC11EE2ACE9B7B8FAA302", + "l": 1024, + "algorithmId": "686C667964FD3CB66A476016D8D942D6" + }, + "fixedInfoPartyU": { + "partyId": "93FE244DE6C2691048B1B46CD5621EB3", + "ephemeralData": "3E241D8407843D18CA6871B6307E2111DBF5F074377A6F8E3838F13B4A09018F" + }, + "fixedInfoPartyV": { + "partyId": "799B113644DD9D2A2D78C0DC2763E31E", + "ephemeralData": "A106932394190651A950FFCD8C90193C4A71B3306DFD323F991D9D6280023C0A" + } + }, + { + "tcId": 661, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DA286820CB32877E53B14F3A929A80E", + "z": "C152F875274A3F3925AF4D2F47527C43C2731B6F254454E65F51BAFAE43DEBD7", + "l": 1024, + "algorithmId": "98125AD936E1A047D505284FC1247439" + }, + "fixedInfoPartyU": { + "partyId": "5B7615CF9FC2CA57539D2E1DED5EC3FD" + }, + "fixedInfoPartyV": { + "partyId": "01EEEA2970BBAA183B89EE5B3306C8F0", + "ephemeralData": "D4E02DE3E28305B1D5D5A28D4C2F8473EEC82455108B64F0FEDE15A586BCAB27" + } + }, + { + "tcId": 662, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB4FCE1FFB624BAAC4F186A3AF5AAC11", + "z": "A7CE630B85DA70B6AC00380FE507CF9E2F209DA9CB2D6F0886D38B01F2395D7D", + "l": 1024, + "algorithmId": "7B6C3BB3B11B0A76ED5E6DD08535A732" + }, + "fixedInfoPartyU": { + "partyId": "0C1A255834A7D3D8857A7A01553360BB" + }, + "fixedInfoPartyV": { + "partyId": "A0A57B4DB0903C8C5D44AC6AC7505C33" + } + }, + { + "tcId": 663, + "kdfParameter": { + "kdfType": "oneStep", + "t": "563BC06CA7E4E7EDF3091B0B667F8D9E", + "z": "4383E67AE372EA7746C0920351138CDE160D2BAB0A34AAD2C9E83438D2BF65A2", + "l": 1024, + "algorithmId": "AEB58BF7F7C37A03EF8D5FCA5FDE8061" + }, + "fixedInfoPartyU": { + "partyId": "C248FFE66094B5A46975E3CC91546C3F", + "ephemeralData": "A1785F5FFE4DACA917FB497BD63ECAF127EB4E05C24E5A79A50F53E9ADDFC8CD" + }, + "fixedInfoPartyV": { + "partyId": "669FA7268853EC44195696A31DAC09B0" + } + }, + { + "tcId": 664, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88F2E55F4A22E0A0D9ADF3914D6BA82C", + "z": "84A2BA2BF1CB4B03F8B8BC7ECE77C9EC69A3EED3D14D8FC976455A414BD6FE5E", + "l": 1024, + "algorithmId": "2246CE5F4997346A01044ED16B24B0EC" + }, + "fixedInfoPartyU": { + "partyId": "B206DBA50283F563D2E1FBF860EB0F41", + "ephemeralData": "442752B639886BA4E7F1714203C390C9ED0F4A538FF648DD45A20A246E965EB9" + }, + "fixedInfoPartyV": { + "partyId": "AA0F42EBB31A1A48041D150B5C72B419", + "ephemeralData": "5B62FC3D5627BBBF73B3E1B3D89F76B1208B8F6981B9C9AE6D48FAAE424BDC14" + } + }, + { + "tcId": 665, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F5FDCF75E350DB55F87AB7A68E9FCFC", + "z": "E3C40958C8C0BF896B85C295E37FE68D744968F9AA6208FBB48E1B0A566B9354", + "l": 1024, + "algorithmId": "9093D59B31E72DC0BC688ED6761F1116" + }, + "fixedInfoPartyU": { + "partyId": "4D66DC48716D346DE1853D6A08DCA7CD", + "ephemeralData": "58AC22135560759D614F0A418B51DC7E43F15CC65A4BCCFF0D91A97C5D10D1C1" + }, + "fixedInfoPartyV": { + "partyId": "D8A78739706AFA4BFE5186B438970473" + } + }, + { + "tcId": 666, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D99C1FBA6F1DB2FCFA6994E46C90F4A", + "z": "90A19C58D2968656F68FE8FB92494A6BDD163F388B2F9DBA238146CD11FB7F2C", + "l": 1024, + "algorithmId": "A70FF8F4A2752A519D4349AEC656FC8F" + }, + "fixedInfoPartyU": { + "partyId": "EF971A69B18CA68E04D9FDFC75753890" + }, + "fixedInfoPartyV": { + "partyId": "FB1DCAAEAF46BB05EF44410777B03A13" + } + }, + { + "tcId": 667, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB8FC5637D41F279158B98678CEE7CDF", + "z": "6450DED3D5F958E0111BA01949EF755820B8EF47D58CC5EDB5A92FEC62BD69AD", + "l": 1024, + "algorithmId": "F9B2E24B0255882AB35C15C8726D6BAA" + }, + "fixedInfoPartyU": { + "partyId": "89CEB50CA29E38D2B00C4F24E2558AF8" + }, + "fixedInfoPartyV": { + "partyId": "740FE1D3369482AC4E0CB145D5ED2421", + "ephemeralData": "8F56FF7A78CD789448D8B38F62BAB29B6F8A2A047801E0763F6909FBD69ABCDC" + } + }, + { + "tcId": 668, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F34B17514D9484887E07190AC3B8EE3", + "z": "B4681E99BB8608C4C946D528833FEBF001CBC6CFEA6868CE277A2876270474DE", + "l": 1024, + "algorithmId": "F050965D8FE1ED65DD337203CE8FA53B" + }, + "fixedInfoPartyU": { + "partyId": "81B8F50828DD1313BB792891E8B0A1B8", + "ephemeralData": "50CFC11EF7146F8472C86FE2162D31B300B08EBFA16E623A2D0917B1718924D8" + }, + "fixedInfoPartyV": { + "partyId": "8454190BC556BAA7890742DEFAC03D05", + "ephemeralData": "1A6A660218286EA3297121B5CD819C1E93790E110241ED175C689A6B8AC45427" + } + }, + { + "tcId": 669, + "kdfParameter": { + "kdfType": "oneStep", + "t": "851366BB67AD60DC225251603CB7F9A5", + "z": "FD99D41ABD8C025556A204C93076103E0294FB2B6D54401E3F9C475FD088A937", + "l": 1024, + "algorithmId": "0F2210DAEEED0E64553BC81D6925A8A8" + }, + "fixedInfoPartyU": { + "partyId": "E1F7E5FC201D775C5EB0518731B767FB", + "ephemeralData": "0B705A81E752D41860ED7A6244C37256A64A24DFBA5C7B310632BBE2EFAA28AA" + }, + "fixedInfoPartyV": { + "partyId": "527CA354D6562A84AC180EEEAB70F1AA" + } + }, + { + "tcId": 670, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F80A51FB9E8BDF90CCEED40455B06278", + "z": "F93351F39E38B9C69BB1310B873AA68B81012FDB2100DBEF217F8621729BB99E", + "l": 1024, + "algorithmId": "F783E61428792A4A2EF07F7DC985B56F" + }, + "fixedInfoPartyU": { + "partyId": "61F1CCD328658EE2F1D5114A5B8A801F", + "ephemeralData": "C7FAC789CB7DA448D17A36A6A45A0207A89E2EE14E68AB00076CED831654130A" + }, + "fixedInfoPartyV": { + "partyId": "6001A36C654A541E929CE2DF3DE8C0D7", + "ephemeralData": "A3A56414EB5286C86524C860452177A1B1387DA070DECD8399D437BD96CACC80" + } + }, + { + "tcId": 671, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4687EEF755D4E07DD85B7CFE6F0A76C6", + "z": "764A88CC63016D0AA51A3AB41E403D9E684A8489A72253BB3B44C34336C7C518", + "l": 1024, + "algorithmId": "23D8DF083AE4756542DEA1447F456522" + }, + "fixedInfoPartyU": { + "partyId": "F84EB45AAAB4CF3203DFA11843229DEE", + "ephemeralData": "1E564A6F86E4EB3C5DFC500762EBB8AB08326EE0C1D62C22ABDE9269AEBAB76C" + }, + "fixedInfoPartyV": { + "partyId": "6051410975F598440B85C890D15FCE08", + "ephemeralData": "99FA54865A6F1EE032E378610E12B8B8D5D73B57AD7D715CBA1C8E9663FBAEA1" + } + }, + { + "tcId": 672, + "kdfParameter": { + "kdfType": "oneStep", + "t": "424E23740F76736D15ECD50CFBFA246F", + "z": "952C0E7907009E42EEBE80E58AF0FB8FE53CC96BB2AE909F770471E8EACB604B", + "l": 1024, + "algorithmId": "CCA05A82712EE1B8A11EEF7B6EB42EC4" + }, + "fixedInfoPartyU": { + "partyId": "A4AA3A277B5C821FFEE3B58E2126EC93", + "ephemeralData": "F408C74224626BF217D9561AA37E1E186490FEFD704AA8DCA2CA5DC332798091" + }, + "fixedInfoPartyV": { + "partyId": "84228D980DB27E5B8FCF63B28EE7CF5C", + "ephemeralData": "49657ECCA39B47EF4FB5B102162D14559F1560A6FB583F62A63A1D012C1B0F17" + } + }, + { + "tcId": 673, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6EB7C734B23B63F2626A066CEB508704", + "z": "FF007C0AF72FC3151E802D1F1C1AB0406AAA2EAE78CCA3E6B4D50165DCC2B8F8", + "l": 1024, + "algorithmId": "5E87B1A51F1CC9C7352F455A22267F25" + }, + "fixedInfoPartyU": { + "partyId": "C4B3F13AC9049CB202F8ABEEED27AE12", + "ephemeralData": "0F23E4B728826918B7957CBD060065CDA269A9DED2A1C6A337CA4E9AAC8371D0" + }, + "fixedInfoPartyV": { + "partyId": "F3D43056E44AB55D5F77527C0A3A3E6A", + "ephemeralData": "95E761B13107A9A0EE7A255E6F9F6791A3BF80A1CC3094CBDC53FBBEB38C6D26" + } + }, + { + "tcId": 674, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD0D53205DB4CE3B536ECAED36D92173", + "z": "E85915004D5BAD3CF00766DC3A1430D7ECBEA784E868CB62B5C64F404F3EE270", + "l": 1024, + "algorithmId": "E72F2DE64E52283C7973B51B9700AABB" + }, + "fixedInfoPartyU": { + "partyId": "94CE856122D4235A24A7DFEE04DE851B", + "ephemeralData": "DFB68FE591B8E0F089F7FDB9C9FFCD80714DB479F393134DDA0AF1D23FF086C8" + }, + "fixedInfoPartyV": { + "partyId": "6EE03013CCA029D39449A9698F383DC7", + "ephemeralData": "00BF752B5C90F56A84D608BE7C3B2CB45CBEF57838F14F678ECA55CACFB8E1B0" + } + }, + { + "tcId": 675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26C278F33C2281C5ADE6EB32A69BB5F6", + "z": "A939B88E60B8CCA64ED158A38A57A58D33B948B0C1072ECDA9A2439C9D928811", + "l": 1024, + "algorithmId": "509E4445BD6C68212DF5B1E17E798C39" + }, + "fixedInfoPartyU": { + "partyId": "7CFC24E304D8F112B3B301B1BCAB45A5" + }, + "fixedInfoPartyV": { + "partyId": "F4151B418AD0F744B6B98237204DAFEF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 28, + "testType": "AFT", + "tests": [ + { + "tcId": 676, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E38BA06ACD111C38B2A618BFC084EA09", + "z": "2CF7807641D19A6A4A7D983BC5EDA7E31F1CF264D5867C0098B445A8AB79150C7306", + "l": 1024, + "algorithmId": "57ABB18C3A108220E10FE3B7A2FD24B0" + }, + "fixedInfoPartyU": { + "partyId": "1FB8632C2917260B3E415DDD96A41833", + "ephemeralData": "90B2E2071E548014B9AF668641864D4BA159857F2172730E412F97743841F5E3BC4B" + }, + "fixedInfoPartyV": { + "partyId": "A4980499CA331CAEFE2FE0F23614C42B" + } + }, + { + "tcId": 677, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAE95FBB078D0EF3AAF8904BD7D39527", + "z": "3D69C22439BE03A7A19575F9D42743C6F61C46440977EE706F918DE8159B5CDC9982", + "l": 1024, + "algorithmId": "8531D93852275322DF404C119A4C8D06" + }, + "fixedInfoPartyU": { + "partyId": "47C9E9330920DC4645AD11EAD5FC9ECF" + }, + "fixedInfoPartyV": { + "partyId": "84AD4A58CFE56EF9C6669FAEC3A599C4", + "ephemeralData": "FA857292ED76C8A3F00F96FF217AC429604E7739BD6D8C551D8DE196B50C4749A539" + } + }, + { + "tcId": 678, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE16E736416E2F50C6C73235A36CC95D", + "z": "584194749408D96DA762A32D4C07CA32433BBECD77AC0313D19B896202BF648EB9CE", + "l": 1024, + "algorithmId": "EB2C5D501E26587CAAD67709BD6D29D5" + }, + "fixedInfoPartyU": { + "partyId": "AF62D91AC31E6407E3665A2BC8CF964F" + }, + "fixedInfoPartyV": { + "partyId": "C27F5C068089951802EB8C82C74BB5F2" + } + }, + { + "tcId": 679, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD76E2631EDFAC3FFCC4945F8FD0E8FA", + "z": "6DDC6400E8AADB38F825FCA564CBF171DC1AFE651ED6172612C5335EE61B6F37A389", + "l": 1024, + "algorithmId": "D567D10C5C4B52476406898878F4EA91" + }, + "fixedInfoPartyU": { + "partyId": "E0462026AC6D4DCA9D8A14B9F89968D2" + }, + "fixedInfoPartyV": { + "partyId": "3BC111DC8883AD23493AFE2512847087", + "ephemeralData": "BD70AC3CED14076695AE5F6AAD5A57F479E4CA9417D1798F579A2D675D222264FD4C" + } + }, + { + "tcId": 680, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F149A5CDFCC255DFE460ECA6B3F0EF2", + "z": "5EF587D40AC5EF61476D8279E87E327214A7402A9ACAB312048AC10FFA7AA38FF9DE", + "l": 1024, + "algorithmId": "48602EBD056E0A2131E99215BE45B490" + }, + "fixedInfoPartyU": { + "partyId": "8CFBC23392FBC5E17EFEF7CDBC9EC426", + "ephemeralData": "D239F49E13DA86B30700337B46EAA166736BBE8B2F7FFB209933360D7FF690E22848" + }, + "fixedInfoPartyV": { + "partyId": "D470966182DD5E9986914430CD125F8C", + "ephemeralData": "4B06151CA57E551DAC641022429EAB2BA3ACC12CFA205B86CCEE90AEAC014DEA944F" + } + }, + { + "tcId": 681, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D72C51B92B4F0A70AC77540586807269", + "z": "0479269DBB60C43EB33B863DB1F5348985F249876A90B80BC3FEC7024DA592D503A6", + "l": 1024, + "algorithmId": "5781AA2C2FDCA57757E7AFCFAF5FB2DB" + }, + "fixedInfoPartyU": { + "partyId": "0683051BBE484288B96F1BB1EFD52988", + "ephemeralData": "81594038977C3DFB293CC46DD303745DE28B3FE42543673E0FF2564EC5F4E2F8C833" + }, + "fixedInfoPartyV": { + "partyId": "7F641D4451310CBF9886639322815E6A" + } + }, + { + "tcId": 682, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46D4C5281D0244146EE645549BF5373F", + "z": "3B924A72AC8A8B0C8B79FEDD9F16D42219871D8A486AE7F48B74B888DD838FFD331E", + "l": 1024, + "algorithmId": "95A60CDF2582660F9ACA8CD021FA6043" + }, + "fixedInfoPartyU": { + "partyId": "E5BACC04FE51C8273DAE6211160EAB06", + "ephemeralData": "17A4D140867BAC1577D925C007700EDE412E55A919C72EFCD0F815FF557F2FFFA20E" + }, + "fixedInfoPartyV": { + "partyId": "A8A8AE600EB19119010E56860B92A863" + } + }, + { + "tcId": 683, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF19CF83B40DE809164583A72484064A", + "z": "C715FAB85489010C3E9A5D7EB29178F54DC2CF28981325F18E0A661EF45C20323CF8", + "l": 1024, + "algorithmId": "1864F299BC872FCA3C0996EA1555E0E1" + }, + "fixedInfoPartyU": { + "partyId": "3DC07003209118191EE755BB44BF5DC3", + "ephemeralData": "634B409C3B79CC66997290A0917E10CAD54B0FF6D6B5DC1DE81D86D4BD452EA1DA36" + }, + "fixedInfoPartyV": { + "partyId": "119B416442C96D9DBDEAA07E99742082", + "ephemeralData": "836831243530C732F3C1252A57B29AD6535290DD4BE20C0856ACBC103AA4732DF69B" + } + }, + { + "tcId": 684, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E53005FBC13DEDE0EC7645D6D363D1EA", + "z": "14242F0FB9B4587A279496F3BFA981DB64AA905010AAD0DB352B1BCB3CA8191F15DE", + "l": 1024, + "algorithmId": "95B33D817AF955340B7BF2455B130ADB" + }, + "fixedInfoPartyU": { + "partyId": "AD9CD041A669A0A84806ADEC9A1E6B9B", + "ephemeralData": "A206BBAAE5EE2C5317617B2E771072E47496ABAC25716772C2808588221F3BAE2997" + }, + "fixedInfoPartyV": { + "partyId": "FBBD7A36E193EB6C1495497CD8760678", + "ephemeralData": "3AF36ED8E180E7420BFBDD9AF8BD34A5ACCF60B7179A975CCE07DA33FB1F063AB85B" + } + }, + { + "tcId": 685, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42EAE5A146FBBD7163BDDAAF581814B8", + "z": "207B4F2FA667609D734ED136992ED956DCB5241663F1D6002CBE7F9D7295377F1F8A", + "l": 1024, + "algorithmId": "F425F110B7636635D1ED621E0ED60BAB" + }, + "fixedInfoPartyU": { + "partyId": "D6A60E71E6DA83999977455EEE71F12D", + "ephemeralData": "1490BA8F0267F6B3009561107DC7B32435D15AB0FD18183CD421E8AEE8F014108FC5" + }, + "fixedInfoPartyV": { + "partyId": "8B298581803A703D05C2083D0B6ABF69", + "ephemeralData": "63DCCC2D7E15279F40C1F01BF8C5F0F193038882451E81B835F07EAF7E47CA2381D8" + } + }, + { + "tcId": 686, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4C4AFD81119D38AA7103631DE4B3145", + "z": "B78776A9E050DE005BACFD7A51FA17360D9F98914126A92670867774283ECC7C267A", + "l": 1024, + "algorithmId": "BAEAD3FF676B4B2581F269B28A02BD34" + }, + "fixedInfoPartyU": { + "partyId": "804249816610C158D3BD1C7B1E56D8ED", + "ephemeralData": "6ECF9CB6D946EDB9F9265A1A928141B9546E22AFC7A5279528E31F7EAC28BAAC78CA" + }, + "fixedInfoPartyV": { + "partyId": "4460FAB2AC27F497FED82CC4FDDAFDDE" + } + }, + { + "tcId": 687, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3372DA192AAE8275C323925CE25B421A", + "z": "7F9D0D90F6C085347B30894CFE27528D05A673E5164341E3977A674CF15E4D01DBCB", + "l": 1024, + "algorithmId": "41780518A0B30FE7AA206E07A93F541B" + }, + "fixedInfoPartyU": { + "partyId": "3A9C5E80E1AFC467F4F529E22A043CD4", + "ephemeralData": "7286E9D5FB4ED98796335D64227C6FA941C3A4D60784A6C7BCE31C788ECD0B1F4C14" + }, + "fixedInfoPartyV": { + "partyId": "3DD9BDE34D2E6CFF0D8CAD07737EC07B" + } + }, + { + "tcId": 688, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E49B281CEE3D237720FA5CC3013614C5", + "z": "8409928C2C47F5FC4C5B2868514B40CC0251ECED9254E8BB11FF1D77F6182EE05C48", + "l": 1024, + "algorithmId": "5358F9D98169A5BBA81B8519746D5584" + }, + "fixedInfoPartyU": { + "partyId": "5136E5CC12A0B202199DCE3B29197D38", + "ephemeralData": "8FF5BE177F4988B64F32A3FDC727D27059CFDE2984D3D582F9CCD3B7F3F7985A5B19" + }, + "fixedInfoPartyV": { + "partyId": "33772D2F431AD56F56628941ECAF3772" + } + }, + { + "tcId": 689, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCE16796AC1D8832AAF17D18F5F442E7", + "z": "6175D01049A48ADFE862421DA65A5270B6D34105001B81373E017C16848FF4B5E64E", + "l": 1024, + "algorithmId": "9F3A06AEBE2D5738A7F5C212129354BF" + }, + "fixedInfoPartyU": { + "partyId": "DB82318F6F45D9F4772C630F4551C770" + }, + "fixedInfoPartyV": { + "partyId": "0B672DB8D88BA4A79273C9A7718FF6E0" + } + }, + { + "tcId": 690, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A93890A7AC545BB884CA4EE45622FFB4", + "z": "85E3BAD8F36A7670E7A1E6DE555709990C22C7671800E6BE88E5D22E13E27BC7CA73", + "l": 1024, + "algorithmId": "261391667E2F1B4A809FBFD2286B6C34" + }, + "fixedInfoPartyU": { + "partyId": "8DF49F83E48F5C714FD0A04498C99B0B" + }, + "fixedInfoPartyV": { + "partyId": "0204AFF268B7A3FAD9E1EC1E522FF69B", + "ephemeralData": "07E18BAC7FE719FC49BEE7AFED32B3C33D68DD82D063BD5682E30738F9C889FDCB0C" + } + }, + { + "tcId": 691, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E15A503B7C08167AF24AFFA153901306", + "z": "73254A78B12472DADA04A358EC1B7D8016FA1AF677D50428B97F3767D624109949F6", + "l": 1024, + "algorithmId": "B082F2B90C547F9BB42D2D8955CC4EA2" + }, + "fixedInfoPartyU": { + "partyId": "EE1F021C45D6E8D358AC2F8C71597015", + "ephemeralData": "2F3652D8BDBECC6F19C3D1518A88C0866262DFDD40CE13F4FB4A0CF5F00AC5DDCF24" + }, + "fixedInfoPartyV": { + "partyId": "66F8A70445B8334165637F0BAE487B53" + } + }, + { + "tcId": 692, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4365CD15C9E85B025E99627F33CFD969", + "z": "E7AD94EA2CFAFE9E6C0FC3056E97E4287597DD00FFCA641956325446017C64F1F6C5", + "l": 1024, + "algorithmId": "54DD8F9E8E2B126100F5E35AA1CBA925" + }, + "fixedInfoPartyU": { + "partyId": "0B5B0394344829007B9367D8799EA8C8" + }, + "fixedInfoPartyV": { + "partyId": "B7856B065947630F542DF057AC81A49F", + "ephemeralData": "B07DC3BDFA224B04C82570B7713B2CF04AF9EFA39BD8DA7ADC6D1B51C19D1D3F5836" + } + }, + { + "tcId": 693, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E7DF211811C34B8EFF677E2B4B08DD9", + "z": "9FF76533F28666C76072A07A33DE9182075514A19E4E7D9F860B531355236BB642D3", + "l": 1024, + "algorithmId": "890AFD37EF3D75574574A29B804F6817" + }, + "fixedInfoPartyU": { + "partyId": "08931AA079D85BA85D7983669E46F51B", + "ephemeralData": "C77DD2ADBFF9C71F8A8017FEA1B6CDAB82AF853A5218CCAD8DC3F916C7A0C0EC6F09" + }, + "fixedInfoPartyV": { + "partyId": "F39E088F90CCF6A2A5302D7ADE0BF52A", + "ephemeralData": "CD052916FBEF4B08FF109D7D08D07A4428514FDAE003FF4EA8153FD47067753AE797" + } + }, + { + "tcId": 694, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B12FF1D3F383D82932C0D26FCC39928F", + "z": "ABBF38E5777E044C6E050CEC96C3AAC79BDB3B0F6784C4AEE60BAF4315EDA3A35D67", + "l": 1024, + "algorithmId": "8BDF83634B5CEF2AB96A01DC75A1C5DE" + }, + "fixedInfoPartyU": { + "partyId": "47C8C2ADFB2388C0894F799E3BE006E4", + "ephemeralData": "60363B8AC009E863D6395B4DFD9F5B0883D904750193313FC97E9E9670D1EE842A38" + }, + "fixedInfoPartyV": { + "partyId": "F7AD872C580FB01F9D499513BC3B0EAD" + } + }, + { + "tcId": 695, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1594F72FCE69AE30577B6D37CED31DD", + "z": "154408309DDF7088F152D947EE79D13B7CD91C631C5B1775DE0258880D1747722782", + "l": 1024, + "algorithmId": "AB9587C655C69E58A399C50A6CF7CA90" + }, + "fixedInfoPartyU": { + "partyId": "C937C6AA6041F47A94A8D0934D149ED2" + }, + "fixedInfoPartyV": { + "partyId": "D26DAE6479188426F499DF94378814F6", + "ephemeralData": "658DD346151B904B6D587ABF3EDEBCF4397B1538C246F2975373E4286BE88C08C449" + } + }, + { + "tcId": 696, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3830786606DEA40E7A080ED1476EDE38", + "z": "C9CCD191D4694F9BCFA5C9565BD9AFF0C961340E218A49C7AC6EFF6AE9AEEAEEC8AE", + "l": 1024, + "algorithmId": "E5EF2C23A901FC49F7DB47F3A949AED8" + }, + "fixedInfoPartyU": { + "partyId": "A995EDF0BE4724D86F734E36043D5BFB", + "ephemeralData": "2FC0B9ADDFE7823182693CA2925CF7B325C17DF61B99951B4EDF442471525F80879D" + }, + "fixedInfoPartyV": { + "partyId": "4150083FD9570056BF18E9A8694B49F4" + } + }, + { + "tcId": 697, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FBB195F9F6E2BF19CA42D9BA79B3F36", + "z": "0D5C44A4101B9946D7CB86B81D115ECEA53D1CABC72FF33F6B1980967C618E1C1975", + "l": 1024, + "algorithmId": "6359C5F0989C175E04B08AC5387470B4" + }, + "fixedInfoPartyU": { + "partyId": "52802A6DB1ED308E1AA8BA02CAA9D622", + "ephemeralData": "AEC9191C6A1A99888EF7B614A37373D4A52297FAC60865FD368AC39560587D5D4BBA" + }, + "fixedInfoPartyV": { + "partyId": "19F26A85B5AB8377061376C98FFFF9EA", + "ephemeralData": "1F00A61D08420B902B6C5F5DDB929801DC599BE41920A9FCD8C985A63717EEDFAC84" + } + }, + { + "tcId": 698, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1EB0BD53C0379AEDDF30A30F21CB20AE", + "z": "A03C401A54A772F691DF0D2D51AF30572F5167594DD1BDD096F98CDA04C23F790E47", + "l": 1024, + "algorithmId": "975483A095BEECFE6E15DE0CE37110B1" + }, + "fixedInfoPartyU": { + "partyId": "CF419F0E73D378273E45AAD51409914E", + "ephemeralData": "E5D73056826C39B42A70EAAC5A3C5DC7FF31818F7BA4E5680D31606CE0F56E806524" + }, + "fixedInfoPartyV": { + "partyId": "F143FD8259DC9DA4B49CB05831BBDBF5", + "ephemeralData": "A57AF6B7A7170E0FB587C016A7FFC5B486BF0D37B7AEF3322CCBFD95B9CA337279A0" + } + }, + { + "tcId": 699, + "kdfParameter": { + "kdfType": "oneStep", + "t": "317C8B721CB1365B863E90DD4249F8E6", + "z": "DAAC60E575AC1B4DF58D0BF1C30F0C33F1F4926A0D2542253121435C15B932889534", + "l": 1024, + "algorithmId": "521690FBE50C28EC58915D52A97CCB9B" + }, + "fixedInfoPartyU": { + "partyId": "1FCC4D61FB6AAB20059CD098E30865B0" + }, + "fixedInfoPartyV": { + "partyId": "96C54CAC9740C8C4A57CA37121705880", + "ephemeralData": "1564A55F736E5C08D43E8BC23FB83C08644D8D4F009491A046A3096F62591089045D" + } + }, + { + "tcId": 700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65F0175B9F3C1DE20374ECD0F749A3F2", + "z": "D0A212FF1B6FAEFF25D8548FBD40E91C77201C50A7D87B2D41E4EF24F63867806999", + "l": 1024, + "algorithmId": "D086CB716536922A5ABBABCBE2294C40" + }, + "fixedInfoPartyU": { + "partyId": "1FCC3B2AF9BF8E135A7EFB971F4A07CC", + "ephemeralData": "9B4FE1C4FADE9500AAE66A20E001D148DA08D91A42C97F76F7138F2CDADB2507FBE3" + }, + "fixedInfoPartyV": { + "partyId": "20A44C4ADA0804848F1E2DF0AB9A171B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 29, + "testType": "AFT", + "tests": [ + { + "tcId": 701, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5957DB457B442E858DC331E7BF259E5D", + "z": "EE9795511F7BC96C95D9B78F30025BB65329C0AF81BDE32D71E5BE712B", + "l": 1024, + "algorithmId": "8905B813C3D624A528C032C61ADFE3AC" + }, + "fixedInfoPartyU": { + "partyId": "70383E68BA2F1720FAA2977DCCC9E345" + }, + "fixedInfoPartyV": { + "partyId": "4B981FC543A8BFC37E24B54A42D2CF3A", + "ephemeralData": "B7FAD8BA4EA52EFAACC5C616850A902E2D1E87781007B91ED55CF7CB3C" + } + }, + { + "tcId": 702, + "kdfParameter": { + "kdfType": "oneStep", + "t": "087A2079E4F457CEF1B293E647A88791", + "z": "8423A12A15ABF64664B0DB0A0C27E94103A8242CF6AC30771C25A5E6F6", + "l": 1024, + "algorithmId": "047F103AAF5EFCA322E4787B6F1CC73F" + }, + "fixedInfoPartyU": { + "partyId": "6EB950FC571AE75A6A53B8558182A900", + "ephemeralData": "58C022B2BC9588AD26A283F6270CD5F110F9F0B0A4CA456ED7CC6E8CEE" + }, + "fixedInfoPartyV": { + "partyId": "6308B1B73D3A28B7B5143C0B3D3CF667", + "ephemeralData": "6449CE7057C0B504BCB3BA3C71844C250FD90441E3CC3559D44A44F649" + } + }, + { + "tcId": 703, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8101FE4336993871E6BAE2270BBF6E1", + "z": "CC76A2B30113B033DC0EB70907E29DBB3ABC6AF0978E2265E075454BAF", + "l": 1024, + "algorithmId": "C12B391043F42387467C36092AD16CC1" + }, + "fixedInfoPartyU": { + "partyId": "4332D92DD37CE1B5F4C5930C13676249" + }, + "fixedInfoPartyV": { + "partyId": "ACC22C74329B7B0B0168DB2B86F5CCE3", + "ephemeralData": "C22A180111FF871D4680D6CF52CF7D5AAF3A3B2751EED8272EA9038E4E" + } + }, + { + "tcId": 704, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCF5901745975F6B460A23A956180E0C", + "z": "63A582E5C77DE96B8C32822B20ACA2EA7AE59981ABAD107893B832EF15", + "l": 1024, + "algorithmId": "CA2BFA3CB1811B3FDB8EFA04ED2BD1A0" + }, + "fixedInfoPartyU": { + "partyId": "8928AB6AFE933673C74D9BA525AEC348" + }, + "fixedInfoPartyV": { + "partyId": "6AF6AEF1B505AA4FC30EEC24EABD80CB" + } + }, + { + "tcId": 705, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDC072737597601DB2D5FC453459E68D", + "z": "FDAA279205FAE21FC64E2A756E36B70F56E4E7B0BA6BBE33E06DE5C970", + "l": 1024, + "algorithmId": "91114AE91E979DF13FFB950A4545DBF6" + }, + "fixedInfoPartyU": { + "partyId": "149479EE275AB0A46420ADBADD7FCB85", + "ephemeralData": "26CFC4CAD297619B0668E5346D140C4D68EBE651177248FE0761A90E5C" + }, + "fixedInfoPartyV": { + "partyId": "395CA36B36CD7E9C00183614E54DA5D8" + } + }, + { + "tcId": 706, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FE85D38EC60AA99AE253F702A938608", + "z": "3BF2F2726E6CB3999C04DAC7BCEA5ACBDF2678BC261900C7736BA38FD3", + "l": 1024, + "algorithmId": "7F8E91FFD43CDFCCEFC09B9D8B2093AB" + }, + "fixedInfoPartyU": { + "partyId": "C7B4037986410B22EE7000ACF66FB6D3" + }, + "fixedInfoPartyV": { + "partyId": "0DD400FD37DC3AF3E482702F7650CECE" + } + }, + { + "tcId": 707, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64D3F4F7A3020E40AEACB9BC71B32847", + "z": "77E8AF81706D1785B5BFA7D28CD384D3353A59895F815B658403172120", + "l": 1024, + "algorithmId": "72557E0A378DFAC79A9D7AF7F02F1D26" + }, + "fixedInfoPartyU": { + "partyId": "60321232CCE1ED5267E9162926D2A3F9" + }, + "fixedInfoPartyV": { + "partyId": "72B60392AA099AAE134C24162F8A6D79", + "ephemeralData": "BCDF7B7B12857FE2485E4108FE0CE47383F3C6E53A6C9BBC0B1386E666" + } + }, + { + "tcId": 708, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6172898A782B3BDC4253DBF661F66AF5", + "z": "795F7B884F98A97CC745403F9A1DBE2BB2EC297F320315CCB7D5954900", + "l": 1024, + "algorithmId": "0970D4A48C54002DD1AFA59B58CAA273" + }, + "fixedInfoPartyU": { + "partyId": "B1772FF25429519B3F5A8CF28EA44637", + "ephemeralData": "F017EDFFDD649EC05D8538FA8AB6502F86FD9F839A2C484ADD0E7DB18F" + }, + "fixedInfoPartyV": { + "partyId": "BA0957615CFC5A6AE2CAF9E7E6324DD4", + "ephemeralData": "283BA01FD486359E176D36C63C305CDE301813CE092C3E34689ED82214" + } + }, + { + "tcId": 709, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA26F86B745F9ADFC8C29FB40861F533", + "z": "72A05F90867C300BFB72D95F4FCABC3913A5EDE454480B0604E8D01B02", + "l": 1024, + "algorithmId": "59F8873D03D97FA52510D13B3F59481B" + }, + "fixedInfoPartyU": { + "partyId": "B2CFB318EA2C540FB622012F58ADBA9C" + }, + "fixedInfoPartyV": { + "partyId": "6AA6736254EAF6AEB31E0C2494DEA6B5" + } + }, + { + "tcId": 710, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A9099C158E90750C6496C347B25D009", + "z": "C848E61612546FC35A9D90DF97ED99575A6504B4FAF8DA012D3BDD84EE", + "l": 1024, + "algorithmId": "291B8E9F26AA83CB3533B24F37DC5CC0" + }, + "fixedInfoPartyU": { + "partyId": "6880802DF508FBE0B11A3860F23173DA" + }, + "fixedInfoPartyV": { + "partyId": "921B172889152AF0F309E2C0FC6DF96B" + } + }, + { + "tcId": 711, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BAD7D19E20801B378F86F7A350FB1472", + "z": "422CBF9391A03ACC54F4C83203FA023EC897F89F8FD02BBB07E9F61043", + "l": 1024, + "algorithmId": "982AA547C227E8C260A1C348F7231798" + }, + "fixedInfoPartyU": { + "partyId": "FE04C12AE8B69040AE367F6D10F1C181" + }, + "fixedInfoPartyV": { + "partyId": "FEFB745856D67765E3086C1D8518F8C6" + } + }, + { + "tcId": 712, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9D455C54AC7F431478F754D98C159B0", + "z": "3A12D619B4C9C6EB64E2550565B7B104E8FE032F5B288FAB7ADCE7712E", + "l": 1024, + "algorithmId": "639852B03D961BE1121401060761443F" + }, + "fixedInfoPartyU": { + "partyId": "721D3D98C904E9BB6A3E0EAD468C4DCA" + }, + "fixedInfoPartyV": { + "partyId": "7DD560271EAA4384F2FFBFE50F422D5F" + } + }, + { + "tcId": 713, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FE0E6EDD7AAB25B2B800C42D89B5044", + "z": "3BD817F911BC1181238ED9D755897F284B71DC9B3AB614B47D80B4B675", + "l": 1024, + "algorithmId": "95315EC4B303790501CFE68B732591C9" + }, + "fixedInfoPartyU": { + "partyId": "30A69DE53C9017B0AA0E3DE4981E14F7" + }, + "fixedInfoPartyV": { + "partyId": "3B9D836FF8A4F3FB520D1582203333E0" + } + }, + { + "tcId": 714, + "kdfParameter": { + "kdfType": "oneStep", + "t": "475AE218BBB1CEA119201C273FC24EE8", + "z": "3FEF6B917A93994F7BC8FE5B02F793B8A6C2571BF38C344A5CA9390FE2", + "l": 1024, + "algorithmId": "8876C5439A8692867EE4F0BD0DAB9BAF" + }, + "fixedInfoPartyU": { + "partyId": "C40C4B351A9D2CCC8C33B83E37A36628" + }, + "fixedInfoPartyV": { + "partyId": "45DECA2EA67592CC91E4BCB9BA3BE872", + "ephemeralData": "E5BD2572A6BEA96F84B4821F1CCE8D0445AE602E356B5F00688AB4B5CA" + } + }, + { + "tcId": 715, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57143208E57E0FB93066E1755DDE9DE2", + "z": "50FDA2DC9E3AF0DEFCCC41AC16BD130F3175929BC79A2F3DE780E841EB", + "l": 1024, + "algorithmId": "2C2CF9E6203D31A8ADC5CE0C5B0D051B" + }, + "fixedInfoPartyU": { + "partyId": "4ED996436EA444AC11A535E51D75A5DF", + "ephemeralData": "5E9C676AAB6DDA4B581DF6E749329B0AE1AD500D5B47F15CCEC1FCA9FF" + }, + "fixedInfoPartyV": { + "partyId": "54278AD58349118F00F9DDACEB1647B8", + "ephemeralData": "99ACD6BA31A22D34C23AC5A3E855F463158ECEB49931E3AEFA3C093ACA" + } + }, + { + "tcId": 716, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F0A94C7A6D65D49CEEAF6E9D04C43DC", + "z": "46786F6C6BDF43BE69E016D3FE50419B03CCF7FCB614DDF7577A9F274E", + "l": 1024, + "algorithmId": "B0407B0CCB698B8830781CD6B93A55D5" + }, + "fixedInfoPartyU": { + "partyId": "FFED193866E558C6DCE47C2980F369D2" + }, + "fixedInfoPartyV": { + "partyId": "6487EB0FBFE490D6297EF3A8851CAECB", + "ephemeralData": "1CFFEB525775762AC05BC1A04DE056A4307A307B37745D1ED94B0392E3" + } + }, + { + "tcId": 717, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F2D970407307A2BEC5D22621D215CC7", + "z": "5AF1FCCC571E5F0DF7A44AD1D343AE6230194C8FD9CF43128172102CAD", + "l": 1024, + "algorithmId": "2DB3D9971DA5B50540A48B6C27B9B441" + }, + "fixedInfoPartyU": { + "partyId": "D5D3435118B5AB40C96B7096886E3C9D", + "ephemeralData": "8C9526927A42F29A91DD523C745116B41AF1CCA017884D3233EDCCC9BB" + }, + "fixedInfoPartyV": { + "partyId": "9FCF7E00210A696D25321114498CC9A5", + "ephemeralData": "BC48D2072CE3A306A83FD672FCB70BA07289D721B1F78007DCC79EF625" + } + }, + { + "tcId": 718, + "kdfParameter": { + "kdfType": "oneStep", + "t": "92017594D6398CDD074CB55DB4F2C56E", + "z": "309D85B9212DB71EAC146DC731A37BB28843B36C6AAA992D74FF916826", + "l": 1024, + "algorithmId": "4770AEF190A90B5BC9E16A2962C16DE2" + }, + "fixedInfoPartyU": { + "partyId": "02F049472B40D3701C896A1609E5350B" + }, + "fixedInfoPartyV": { + "partyId": "FCA8BADE64B008E5ED08CDA496102A7F", + "ephemeralData": "B8D862301CDD67669A8C5A3A182AC7D465E92CF3C186F2487239CD375F" + } + }, + { + "tcId": 719, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9929AFF0B8777A54C66E1D4C622165C9", + "z": "77B9F6D6A0566DF2F5D91F6203C17BC3C926A295E0A659D979075085F5", + "l": 1024, + "algorithmId": "5276065EAB9090D1C169EE334A9D0F74" + }, + "fixedInfoPartyU": { + "partyId": "7BB6817A0BEFD96FB6D9B6F66721D0B1" + }, + "fixedInfoPartyV": { + "partyId": "A0E3A366F91703A34F8F8EB4B6FE90FD", + "ephemeralData": "BDC1B353179242FCC1BA65D858DBB7707BCE2F88940AA20DD2BF80C52F" + } + }, + { + "tcId": 720, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76FDEC037D27E9A73E75C4CB46CE4357", + "z": "10753653EC0B7C3A450285D87E27E9F2DFC1BA464882544ECA3E4C75FF", + "l": 1024, + "algorithmId": "3D266604D43D99ABD47E375FDE9261D0" + }, + "fixedInfoPartyU": { + "partyId": "0985FE4CEF0872E71A8FD4C69CBFD101" + }, + "fixedInfoPartyV": { + "partyId": "DE18765140F8C531FA672AFF0000B55F" + } + }, + { + "tcId": 721, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7EED4C586000D0552ADFCA295449830", + "z": "4B81904CB1DF9F4210977C7B42DCB02EC1A741BBEDC32787C4108BF4B4", + "l": 1024, + "algorithmId": "3B1678F15EF8206AEA324B8E969F5EDC" + }, + "fixedInfoPartyU": { + "partyId": "BBE7A78170A97605ECFDA911329624AB", + "ephemeralData": "26D2043CEFB384B074AA964177A6F6785FAB5572D656574944235CD790" + }, + "fixedInfoPartyV": { + "partyId": "A8373ADB3FDB672724B8BBAB24B89A8F", + "ephemeralData": "6BBBDA50813DBCB3879CD7472F84440834A852E09010506509CAB2FEA6" + } + }, + { + "tcId": 722, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CFD05035758B93A44A5BB3B32D5642B2", + "z": "47C9B044EAA8BD03AB8EAC855E725927C3AA93E0E01A88F8FA98666C0A", + "l": 1024, + "algorithmId": "8F914E0E60594F64B8ABD35C548F455C" + }, + "fixedInfoPartyU": { + "partyId": "20D24D3BB9B994F8E7A1558A7E138335", + "ephemeralData": "D4F2F0658BB7D1392B7F5DAAD3BF48B5AEBEAE072341A4AF1718397C86" + }, + "fixedInfoPartyV": { + "partyId": "F34E663D6FD31D2E8F33BD3887EAB66F" + } + }, + { + "tcId": 723, + "kdfParameter": { + "kdfType": "oneStep", + "t": "597EA7EE83326EE67DCA0D1D60922881", + "z": "1FDC848F6CFA9F61202B96323CDC155EE2AECFE0C51D2F6323528B4DE0", + "l": 1024, + "algorithmId": "600520AB5B832A89FAF1524B6A0C3608" + }, + "fixedInfoPartyU": { + "partyId": "3E3C9A74F81D3CB3945E7A29ABE10C6E", + "ephemeralData": "3378F58947B7E3B802EED457FE52DE94E690AD7F395311BC465658879A" + }, + "fixedInfoPartyV": { + "partyId": "B0FBF058CF4F27C984FCF450BC62C7AB", + "ephemeralData": "1E842F35CEE2A095D44AB88D2099C6BD0EA0A4E21950684376A53EA8CD" + } + }, + { + "tcId": 724, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83D2EE0F898CA42F14F77537C351B46C", + "z": "15C3CB5DE7D4F12FFCB2D0BE146BA10D886FB2E6751307D981101B62C4", + "l": 1024, + "algorithmId": "B1BFB18D81AB4D85A175A268FA71DF49" + }, + "fixedInfoPartyU": { + "partyId": "C2504E3DAD9230AE952ABD277B9791EC", + "ephemeralData": "053D8E66D6764F61F41B5488FD430E2329477194871F1D51742003228B" + }, + "fixedInfoPartyV": { + "partyId": "B9289F5C7A4077F4BFA8D26011A0E1BE" + } + }, + { + "tcId": 725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2812955D422835863B534EDF02100D7", + "z": "7CD9DFE200D1A121ED1F2D0BF2F147A85E83830F6AFEF2A53A0DF7DD7E", + "l": 1024, + "algorithmId": "4DE7170B5EF9F08E5DE49F5C3846B606" + }, + "fixedInfoPartyU": { + "partyId": "B1DE86230E3213DA1F2DDF576E65070F" + }, + "fixedInfoPartyV": { + "partyId": "18C5580C263B5DB462FC4AE1313CB005", + "ephemeralData": "F9F281A20B68BD2E4A9D2EDCCE1FC39ACA10FAF818D119C806151E075A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 30, + "testType": "AFT", + "tests": [ + { + "tcId": 726, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F07C6106B557856F4F9C1C80241898B6", + "z": "34E621E1D81F7C2413134C1CE9772FD7AE85398536A5BF2D47FEA9539E7F99", + "l": 1024, + "algorithmId": "12CE3DA34CC789933A9B7866486F1840" + }, + "fixedInfoPartyU": { + "partyId": "1617E5DB65EA50B8697A9F23B2D60D32" + }, + "fixedInfoPartyV": { + "partyId": "D90C662589D77A6B86A460788F857FD6", + "ephemeralData": "EA93E0A325B82B31ACB9A560A10AEE09643E38AE61CB300DB4378AD2627804" + } + }, + { + "tcId": 727, + "kdfParameter": { + "kdfType": "oneStep", + "t": "176794F0EE82396DF1397337B0F2109F", + "z": "DD9BC9EAA28007BA844A18884225A71D60370AD2AEF90F212F3AA305240493", + "l": 1024, + "algorithmId": "D89893B33E153DC6CD894B231071402E" + }, + "fixedInfoPartyU": { + "partyId": "E767C53EA0D0E16534936FAFAAFED531" + }, + "fixedInfoPartyV": { + "partyId": "7458449723FD698049FEDF52CB4764D8" + } + }, + { + "tcId": 728, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D39817F45250D900DFB53E28D5FEDBE1", + "z": "20FBDFF2F9B66686873A8CFBAE0177BD3FFF400C8AEB140B16759797408AEF", + "l": 1024, + "algorithmId": "36274D2B7AD8D668144D2FCBFA961BC4" + }, + "fixedInfoPartyU": { + "partyId": "9FA8B43DC1F3C56B9E900DA18A053D50", + "ephemeralData": "D1497999364262E7AF9D743BCF39CB182B237BE031BA03B4469C69F2DB9299" + }, + "fixedInfoPartyV": { + "partyId": "EFBE5E539ED6BEA0E72D1F4C58F817BD" + } + }, + { + "tcId": 729, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B3CF96E5FE735B6DCAB4D44AE2BDCDCB", + "z": "C574A9DCCBE03D26A6112A2A61AD9E5EB64EC6FA828DEF77A2AE2CCE879AF9", + "l": 1024, + "algorithmId": "CAC8E2A49E753FA6AB721D3838AAF2FA" + }, + "fixedInfoPartyU": { + "partyId": "03BA51BCF3452B1D9EFA5A09A5C16F0F" + }, + "fixedInfoPartyV": { + "partyId": "7BCEC6E34C9061F4E788A535385F15A5" + } + }, + { + "tcId": 730, + "kdfParameter": { + "kdfType": "oneStep", + "t": "259FBF4D4F3D37C52610DB522E459E74", + "z": "8B011640D8834C8341EA17A7DF0F4DDF1DE293089D75C0AEED1D326BD68F59", + "l": 1024, + "algorithmId": "90AE42B781F91716D95053779EAA5C5F" + }, + "fixedInfoPartyU": { + "partyId": "93073DDC6D97B1575D436C2728D47757", + "ephemeralData": "45647C7FF688B10A72F6BABF9146EABE97AD44AF1F524E6F0EF7DF3E015E19" + }, + "fixedInfoPartyV": { + "partyId": "12AE2419D9B9C57F774DFFB827F5EF44", + "ephemeralData": "E6591C01F911CF9CBEDF864FC0DA0CE9F28E01568CF7EB2328D476F6F2AEFF" + } + }, + { + "tcId": 731, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58646431D9A8F0A65E4007169BF377E6", + "z": "CA6102711E84D820FDAF8B6E7DFE1E2BF45FBE4C4FA39FA077963325C640B6", + "l": 1024, + "algorithmId": "035F17AC7EA5F74EFB3AAB61C5E31827" + }, + "fixedInfoPartyU": { + "partyId": "9FF3B772FC52FF4FCF39516CC74C93E9", + "ephemeralData": "688AB3386E2D2EE5DA889772B866D93D9E0678AE4DA64206CDF5E732BA7CFB" + }, + "fixedInfoPartyV": { + "partyId": "D721EBAB29C17F9D0297A78575D6E4E4", + "ephemeralData": "F92F5FD5F31B6342961891A2C9693DB8539486BA04D5A273B02D3A5199BEB4" + } + }, + { + "tcId": 732, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52FBEDC1EF8FE902837BB9AF5FAECE17", + "z": "809458594AF7DB4AAA1E35DB7B64D288074AEC91DF152FB5315FB35BF69459", + "l": 1024, + "algorithmId": "01A8C7B280F53B0C4184E8424D7A5703" + }, + "fixedInfoPartyU": { + "partyId": "96EADA9A2FF99DB74D4CD11E26A23F1E" + }, + "fixedInfoPartyV": { + "partyId": "9A5CD715BC80ABE93B1D20725D1C06E2", + "ephemeralData": "C5A291CB2534EB841EAC227852779260F07010EE3C3EC31686B6E8234A51C0" + } + }, + { + "tcId": 733, + "kdfParameter": { + "kdfType": "oneStep", + "t": "267CD839D6336482D432E6322351772F", + "z": "A7343A17FA0908D3E84F15345642F6726E347DF76B88AA1450ABE403860C8D", + "l": 1024, + "algorithmId": "40990A17F13A8D19E00A6E7C7CDE3AB9" + }, + "fixedInfoPartyU": { + "partyId": "573B7BAA783C26845B96840A63131041" + }, + "fixedInfoPartyV": { + "partyId": "75D938B1DBFBB3243E104881F6DFC0F6", + "ephemeralData": "EDD2809AD0E62403C8BFB0557921ACB1CC583ED6D90DD2E660EE63D069E62A" + } + }, + { + "tcId": 734, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19583424835889B18607F2CAF3BDB87D", + "z": "4F8FCBDBD3B1ADF967276785118930D91B653B67D51ADCDA4BC4A8412BC7A8", + "l": 1024, + "algorithmId": "EE4DC89E9DC08FBD741224648538B4EC" + }, + "fixedInfoPartyU": { + "partyId": "4B9F1DB016E26DB8450B9CD6F5A73688" + }, + "fixedInfoPartyV": { + "partyId": "4D0F70F1F794325F80B1D3229A527F6D" + } + }, + { + "tcId": 735, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E50FF8CAAF60505EC04C247818447AE9", + "z": "74E6B230C73089637711647C1F5583A89B81FB498D4C7698B808DD0A5B7F18", + "l": 1024, + "algorithmId": "FAF39FC262177DDB3F96128126F1D588" + }, + "fixedInfoPartyU": { + "partyId": "C402962BA1ACC2E11DE843434A316EE2", + "ephemeralData": "CC4C6FB8BA3E389B655737CADBAAD890E58840AC81F807068192D8752CB8B5" + }, + "fixedInfoPartyV": { + "partyId": "A070664B3B43B0DB0AFEBAF97AEA6B87" + } + }, + { + "tcId": 736, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8386F3948B7BF93D1A8AFB4E11C39263", + "z": "1398B4BF54F4FA6539C5DEB455386B597B3987CBF1ECE34E3CF1CFD0D90ABA", + "l": 1024, + "algorithmId": "AFFFBF999C381980A72430B9910E8461" + }, + "fixedInfoPartyU": { + "partyId": "93BE0A612D755672E02EE58EE1B4938C", + "ephemeralData": "5AD898695EE3583D73EC57D23864D94A997C9DDBD573D0F5A5D19D5B1F227E" + }, + "fixedInfoPartyV": { + "partyId": "D5045871BDEC0FC1EEB779924051603C", + "ephemeralData": "E4012E6BC2777522D1063B4B7A9918F85D3C73BA03E2AF92ABC186A687E2DB" + } + }, + { + "tcId": 737, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89FA7C9C2133B3918680AA4E34B7DCC7", + "z": "5056213EF5D1D0E9966702B8F6C4DDBAD1F8FEFFAA37389198ECC2878EB988", + "l": 1024, + "algorithmId": "ED4E55ACAD98DB5FED7755F186575093" + }, + "fixedInfoPartyU": { + "partyId": "8780FF16FC2644DA2BC7C6F3250EE0E2" + }, + "fixedInfoPartyV": { + "partyId": "E16F59F7F1B6A52221874185D74379E1", + "ephemeralData": "EAE33A1021D104879F5C7812A85C5C4950E9806ADC741B9915F4DED2EF1EC7" + } + }, + { + "tcId": 738, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BF65E676F55BD04DAF07A4268CB5269", + "z": "BFE00AD54CCD6CA158156A425C7743B3A56877C894DC21724953F06DBBFB4D", + "l": 1024, + "algorithmId": "C399142C0990EA7626505F9350A75D1B" + }, + "fixedInfoPartyU": { + "partyId": "6228E66547590816D32B5931BC15F418", + "ephemeralData": "BBF2CE113A45A3185A73AC62D47C1D4067740623011AA23711B301F02CA118" + }, + "fixedInfoPartyV": { + "partyId": "0FB0293E8F85044116CEB468BCB16A44" + } + }, + { + "tcId": 739, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D85E46BC8DF757F7179B073A4B56E3C", + "z": "ADEBBE142C90BFEF1B989A5B29FCC89D14129D652266A8841CB6BEC2738AA8", + "l": 1024, + "algorithmId": "68CDABC8E597C5C619B39D89AC0138A0" + }, + "fixedInfoPartyU": { + "partyId": "D3138E0DFC315285A90B373E3DF940E1", + "ephemeralData": "600E9B6909A352BD66D6D4A42541B8BCC5088A2E03846E100329BB6F004160" + }, + "fixedInfoPartyV": { + "partyId": "FB7B07B3D02DF616253EEB7CB3BFBCAB" + } + }, + { + "tcId": 740, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F1507932F026111B65FEBC33FDF65BB", + "z": "2303D544E3842073D4BD0F3EAA8DDD34BA0E4CE06A386E294972C8C2BF70A9", + "l": 1024, + "algorithmId": "B4ECE2A0C303EBC5B733D8A5F43B805E" + }, + "fixedInfoPartyU": { + "partyId": "6A7F808BD0B61C49EC29233019A4D6BE" + }, + "fixedInfoPartyV": { + "partyId": "6B53058E43A14B9CEB4FD65C0652CEA6" + } + }, + { + "tcId": 741, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E1ADBDB44777B95FB10386A48B27CCB", + "z": "682F363E0D94F931D6233556CADD8F1637C76F58F818C0CFBFC8A406478608", + "l": 1024, + "algorithmId": "29C34F06F3A6C8524474AEB9A2900969" + }, + "fixedInfoPartyU": { + "partyId": "8BB7405288E2BC0284BD0880EB78AD76", + "ephemeralData": "F0849B5399C858D20EB7DCF7AB82AF909880BB100D16AFE5F8C411FEB46143" + }, + "fixedInfoPartyV": { + "partyId": "4774AFF1D0057FE8656A7AD5FA3F0841" + } + }, + { + "tcId": 742, + "kdfParameter": { + "kdfType": "oneStep", + "t": "55F8A67D11E649769BFB876344B20406", + "z": "E369029BA45F7D7CF10047A5EB21575AF19C34A0BD85FF1B7D33BB2C04C769", + "l": 1024, + "algorithmId": "F19C50A09F98B646617AE9E51BFA7804" + }, + "fixedInfoPartyU": { + "partyId": "675BCADD459787D235704BD83642BE9F" + }, + "fixedInfoPartyV": { + "partyId": "9518E28F5BAF87D6680E53BB5CB98B58", + "ephemeralData": "A543D9C0C301CD346BE487AF7743C9F821B213BBB01E18EBE70F1966F1E11E" + } + }, + { + "tcId": 743, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B76756D6494B91EC59A20512A70B30E0", + "z": "6068354C046CDA71966C95CA0A6C32E18683C21A2F19DD92EA829F71267586", + "l": 1024, + "algorithmId": "559C849BC053025937B281DDF1C67D76" + }, + "fixedInfoPartyU": { + "partyId": "9687D6F8C978465EB62B5D25399B9A02", + "ephemeralData": "9A9DA21C84ACB60783604927802CB9755D9D7D3296B5DF1A229C4C6A166A0A" + }, + "fixedInfoPartyV": { + "partyId": "E08395A8461F79FEB6F651CA419AD653" + } + }, + { + "tcId": 744, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10EA5FA79733B651D31983C110C9A918", + "z": "F0CC7D7F6ADC59FA1D15C2034C0262CD11776F144644A38A49A2DBD842E81D", + "l": 1024, + "algorithmId": "F2C553B3CC002AF39864B035BBAF727D" + }, + "fixedInfoPartyU": { + "partyId": "63043D7D6C3F5F7616ED11CBAFEF3F93", + "ephemeralData": "BDA0A983A4D5EB74BC46C880D5B253D70DCA37FF7E47CA074EE713A43566A4" + }, + "fixedInfoPartyV": { + "partyId": "3F176EC900A7A0587F4B9616DA907855" + } + }, + { + "tcId": 745, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91B7D732A6AE59253EC72E9B3C939A14", + "z": "2A777ABAE5AD9CFAFF13E36700D41FA8EEEE86E937D5A5B8C1C9005DA8113A", + "l": 1024, + "algorithmId": "9E19DF3B7D29E05B5C1E29140BEB6428" + }, + "fixedInfoPartyU": { + "partyId": "B8DDF7C596DBD94B9DBB362A43972983", + "ephemeralData": "02397C088EB5366371C3AAEEC0B3AB2D3D06E353C1AE1227AE50D65D86066B" + }, + "fixedInfoPartyV": { + "partyId": "684AFA88181BE9D8ADCCF1744FAEF5BF" + } + }, + { + "tcId": 746, + "kdfParameter": { + "kdfType": "oneStep", + "t": "091CDD16ADB4E8843A54245ACA272F99", + "z": "A13F4703316D7577DBF37CFC29C69BB283C85E8CEF3658A449850C7198B057", + "l": 1024, + "algorithmId": "FABCF7BC81BD4D6DB8ECFCEBB5A8CA9B" + }, + "fixedInfoPartyU": { + "partyId": "DCC735247283E513ED4A5E0B2AB3308F" + }, + "fixedInfoPartyV": { + "partyId": "185D46549FFB21D4648C1FB44F110164" + } + }, + { + "tcId": 747, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3019B72C13A10C54CAF8CF928D69F428", + "z": "4F0A6C60229E8B838BB84EDA5008676D691E4BE2F2A88389BDD645F98FC1AA", + "l": 1024, + "algorithmId": "D8D849A28F52C1F37B1E0E6C76688452" + }, + "fixedInfoPartyU": { + "partyId": "7F16DCEA0AE0375293DEB9E0E421A73C", + "ephemeralData": "A7A1AE6EA3FD7488B48839293AB659781D5DB4A76D0C36F2E23E6723AB34A2" + }, + "fixedInfoPartyV": { + "partyId": "9EEB71ADAAF23F68D42B5E38BDEC1F75" + } + }, + { + "tcId": 748, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1341D65C07372F6543623836896ABAE3", + "z": "DC458414A1A46472E7FBC57AEA898E5E68503458925F7901CA99BC1A6F31E3", + "l": 1024, + "algorithmId": "5811366CFA83358D394DBB4407E8C7AA" + }, + "fixedInfoPartyU": { + "partyId": "0F0AA5D70F68F0499CF7C73A1670F4B6", + "ephemeralData": "CC10EB5D89A0ED97972D39C364DB82337DB5F817B5FC49E84EC7ECD279D8C7" + }, + "fixedInfoPartyV": { + "partyId": "518541CAF12E222CCA09CBAB4D8B955A", + "ephemeralData": "55CC3C0AA137117867D2676C815B3038FDF13D4BE5E24199DC4BA6C954DCEA" + } + }, + { + "tcId": 749, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C99A749A3DE5588B36B687AEEFC052ED", + "z": "0C1EA823E0FD5F8A43CCE8890D9E4DF0C9F51D433E68489E804CDB796325B0", + "l": 1024, + "algorithmId": "40973E2BA04286AFA65C8D7C6C331511" + }, + "fixedInfoPartyU": { + "partyId": "18734946A621D1A0641DDA06F078EB3A" + }, + "fixedInfoPartyV": { + "partyId": "29F65D6BDE1AD9E1E4E11067FBEFF48E" + } + }, + { + "tcId": 750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "372753ECB01BDC455719E978A1EAB9C6", + "z": "5C45ED71C0FA7F89A36CF79A8E7DD6BB20D7460E336D0513EDADE77549EAE6", + "l": 1024, + "algorithmId": "D2A72E1D0A37FC0749F5084E06529872" + }, + "fixedInfoPartyU": { + "partyId": "110BB60A9BD6CB18EA31E53224FFD5B3", + "ephemeralData": "D398D020CE7692A4D6EDB346387F11C0267CECECF5BF46793F8CC56FDA5FBC" + }, + "fixedInfoPartyV": { + "partyId": "2BFE3C25EBAAC048EEED6B8DB453E974", + "ephemeralData": "68B1020886EF90235499C7990280ECAEA91EBD4EDC3589CEBACAD236F9DBB0" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 31, + "testType": "AFT", + "tests": [ + { + "tcId": 751, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CCC69E374DAE129066C3924535DE500", + "z": "5E14529707997FAEE9E5B98E24A0430B0B56DA449FD148E3DD6A16194AE46F2656", + "l": 1024, + "algorithmId": "D42D375797E52B7D350BE17BA8B5561F" + }, + "fixedInfoPartyU": { + "partyId": "07E4679BF04175F2CFE68A49C8304158", + "ephemeralData": "929A474EF5781831D15D80C28DAA034672339145637C9A9BFA896CC8682B25D868" + }, + "fixedInfoPartyV": { + "partyId": "AF2F8F524CEE4E3FC379F033EF7A2E83", + "ephemeralData": "C8E8A17F1092744EE689553E441617DFE90054AB94F4AF3659C857A5F55DE12128" + } + }, + { + "tcId": 752, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5806ECB90F7428B6ADAEB64080712F55", + "z": "0B75F753CFAEC4A10F31D027806A61CA61EAAD29BA277CEABC0C51FEEEEE2295DE", + "l": 1024, + "algorithmId": "8677EC6118471261B16243D67A4FBDE8" + }, + "fixedInfoPartyU": { + "partyId": "7A8DF3863A56C464DD569889C9CC39EF" + }, + "fixedInfoPartyV": { + "partyId": "06F2683DA33A4CDFF1C5B7D79C8AEFAE", + "ephemeralData": "34635C27391C4BAAD80782186FEB07A5453337AE88F779621B8C0A31D720E1EFCA" + } + }, + { + "tcId": 753, + "kdfParameter": { + "kdfType": "oneStep", + "t": "306406FDFDB46D1F873DA851491B8312", + "z": "ECDBB400F074FB8DF39E525C285B816BFB771F388BAF882E083DA730E5C135825E", + "l": 1024, + "algorithmId": "92EA85372A8751E2B2FDA4E11A143146" + }, + "fixedInfoPartyU": { + "partyId": "4DE7FC8D1F2341DDDBE2AC294FB4CB56" + }, + "fixedInfoPartyV": { + "partyId": "AC79084D333558CD9730010808849201" + } + }, + { + "tcId": 754, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3AC9C99ECF49F76F73326FEBBAF5602", + "z": "8A4F8F68102D1C7B1751846DA638EB4E9B876381EA1E9EA34BFE2D783D2601C7D6", + "l": 1024, + "algorithmId": "D7BB672CA9D436EC285404CC93724B77" + }, + "fixedInfoPartyU": { + "partyId": "3BF50D14885B6FB1298A9A946665D331", + "ephemeralData": "F2276E02C829FEF50F61B40620FEADB8944E13E3EE005BC10EB04268FC74B14A50" + }, + "fixedInfoPartyV": { + "partyId": "478CC2282FD886B6236A35159E4517A2" + } + }, + { + "tcId": 755, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DDC8A1FD702558631B9CAE3D96F371A", + "z": "51F830E143237E0F330266E068D31C4DF75B5041958307F527E4546B2E3501FC3B", + "l": 1024, + "algorithmId": "3B86D99BCCF42D8250B845780440ECCC" + }, + "fixedInfoPartyU": { + "partyId": "04459B35C2EDB28AE3AF0C50D79F9067" + }, + "fixedInfoPartyV": { + "partyId": "0EC545A130ED1F02FE955B24086DD1DF" + } + }, + { + "tcId": 756, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D704A88824C35FEA0E1550CAC25F89B", + "z": "A30E1C0B2EF701C79033FE614F346C29DE9E1D9AF1E04CD66CD2476B817AE137B2", + "l": 1024, + "algorithmId": "6BA34CAC9CA01459A48E7A2CFF677188" + }, + "fixedInfoPartyU": { + "partyId": "1764AE0008364052B030E9286B74EA72", + "ephemeralData": "E09D198F2BC721FC833C3FB532A8AF7F3C3DB960A44F69B9E9AD3950DE3CDD5EA4" + }, + "fixedInfoPartyV": { + "partyId": "7CDFAE60C7303FBE3B99936731BE6680" + } + }, + { + "tcId": 757, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A49895CE782760015449C6482EB15F50", + "z": "2D5CEBF0615679290ECDF0210F932F015E1D6E25B0421581FE4E6364B064BD84B2", + "l": 1024, + "algorithmId": "17659AAD0EFDC6F2BA6888B77B7E5794" + }, + "fixedInfoPartyU": { + "partyId": "F2DCA306B0C62F62FCEC6701DC285B59", + "ephemeralData": "649D85071C29F1AC97429A5D4146C95715B8960EED0CEA8656F09491950565CC1A" + }, + "fixedInfoPartyV": { + "partyId": "302175EF01E0AAEC94CAC427F61FD658" + } + }, + { + "tcId": 758, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2BED0A6ADF6C55768CC0BB8540929B3", + "z": "2941A4CC130F9844C738658B582D8D2DC7C2452E6284383D2F2EDFB74BD12BA086", + "l": 1024, + "algorithmId": "C801C1971053E7114A7909D5EFAC9444" + }, + "fixedInfoPartyU": { + "partyId": "7F280548D37B24DA49FB7D3096F78A91" + }, + "fixedInfoPartyV": { + "partyId": "F799631BCF1F0709F23AFA69904279E5" + } + }, + { + "tcId": 759, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAD564201FFC7ECA161C1F484F407289", + "z": "94D62AD7015435780C73BE924A3AF65CE429B2A35B45B2E7BDC56A684D593D5CDC", + "l": 1024, + "algorithmId": "8B35D3971B8B6A3A4AF6FDD3008F2892" + }, + "fixedInfoPartyU": { + "partyId": "CC27BBD66D60917B08203DDB953A3FC0", + "ephemeralData": "880EBD35055D00CF32D61E089377649AB0DCBDE5C41532D44DCA9D4A809B6DC33B" + }, + "fixedInfoPartyV": { + "partyId": "A3ACB7F2ED698ECB9DF540F968669B2E", + "ephemeralData": "BA54173FE8B57AC8DA6F59B7735649958D241617C43F49B06897A5323F54C32025" + } + }, + { + "tcId": 760, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FB61B878DE3E604C4BFD3025F14A97E", + "z": "9EDDFD3BA0D2239E1361A3CCDAD570D1840B16058D905B89D10E44151C4EDDD55E", + "l": 1024, + "algorithmId": "65E72CE9D21955F985C983B82863D235" + }, + "fixedInfoPartyU": { + "partyId": "CFFF372E78788D05656949984E137479", + "ephemeralData": "022467E4E82A3FD5700788EBBC029013F17D8B966D72F17D3B7B3191C5E1AAB509" + }, + "fixedInfoPartyV": { + "partyId": "EDF797F377CB5DD2E2E2B4BD334732C8", + "ephemeralData": "3D473D7C8FBD8EE920AE5F34494464A46FCD1657930752EF71A32D1E1BCD6E233C" + } + }, + { + "tcId": 761, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F9EB62DB4BDD72C3B002002CD1E5F95", + "z": "DA0966A7EA794AD217EC0E28812AC98CC7868A3F0905F07430E1FEE4989AAE63F0", + "l": 1024, + "algorithmId": "03AB5D7FD59879BF945CA851760D170C" + }, + "fixedInfoPartyU": { + "partyId": "4DED31FA2F8D9C3D61B06B11AF1BE439", + "ephemeralData": "2C5DA01CBD808B44C91821B5D76E5AD02AE70D88F6849AC683C154C8DE74EDA0ED" + }, + "fixedInfoPartyV": { + "partyId": "801446DC15A48EEDC71C5B661BC6BAB3" + } + }, + { + "tcId": 762, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B709AE0FC8D96972C95AD86AEA14D905", + "z": "FDDD523C94AB90B1BCADFB672472D0593F616819AFCE5373F9FBB2A1C9B8AAA469", + "l": 1024, + "algorithmId": "7DED0151156C078C62056E14027B1685" + }, + "fixedInfoPartyU": { + "partyId": "0159198B84F6F0182663B33557ADACB4" + }, + "fixedInfoPartyV": { + "partyId": "7520BC66071117FBFCA8019297DEB588" + } + }, + { + "tcId": 763, + "kdfParameter": { + "kdfType": "oneStep", + "t": "181A77AB887906582532DD8AE7EF89ED", + "z": "646673034CFC61A914E22B71E654A725D229369EA2FF5C14D0807AA2401148023A", + "l": 1024, + "algorithmId": "85308C0F4F387EDD1F8CC603B9CF47C0" + }, + "fixedInfoPartyU": { + "partyId": "D0B983338176166E0F4B441E430D1420", + "ephemeralData": "2BA726E160B55A77455CE0B4E52889829AF5A0CD337D4096FD66D6C931C5CF86B5" + }, + "fixedInfoPartyV": { + "partyId": "D5493A910AAD21DD374BEE9F96ED4DFD", + "ephemeralData": "DF113DB451329308F13D93FB5FB27F365298701B05206EB97F73A50169A8300098" + } + }, + { + "tcId": 764, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09BF3EB812EB0A80CC00C5B9EA99B97B", + "z": "E3DAF981231C196F9ABBB002B1E04B39962A3C1D016F25B7388972C0B0F478FEEA", + "l": 1024, + "algorithmId": "E5F9C6879FB9A319B2930E27993C9B80" + }, + "fixedInfoPartyU": { + "partyId": "CE62CA909F02B20F47BA34044E89B5AF", + "ephemeralData": "4EB6A4091CAD50A198910491DBB268528C4BBDB76655A74159BC4DE858DFF27F7B" + }, + "fixedInfoPartyV": { + "partyId": "44FAA9F213F3AB923CCC5604E7790562" + } + }, + { + "tcId": 765, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8B0C0C28F6EC443060AAC106CD47E84", + "z": "81C97082A7D5BE11B060D231216D23FBE1A45F62286E51BF431E834503814CBA30", + "l": 1024, + "algorithmId": "A897ECE8A39E318A331216990117BA0D" + }, + "fixedInfoPartyU": { + "partyId": "64E1DE9B5B5129B5FB3FA515A02E72E5" + }, + "fixedInfoPartyV": { + "partyId": "874EC176AD87F1D1ECE8FF96429DC7AE", + "ephemeralData": "D402683F4DB7B344B446724F3F2CA9D4DD70DC33140481086B72E456CB0330F042" + } + }, + { + "tcId": 766, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19F528639A3CE5CDB53C5C29B7F21920", + "z": "FF5F3707E0017FA9ADA102EAA8D52095D1CB1A06EDB85D535E886AE71FC804ED6B", + "l": 1024, + "algorithmId": "318ECE236DDFF5889AA11DE64C5EEAFE" + }, + "fixedInfoPartyU": { + "partyId": "CBC7C783FED65869AE3911C6CA3601C6", + "ephemeralData": "35B7E12AA32C913F27E7830A01E40426B8FE1C57A76967761A62EA81701F07CEC8" + }, + "fixedInfoPartyV": { + "partyId": "B900C244D19BAC674B8056E058683E6F" + } + }, + { + "tcId": 767, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1F4C584A938FE8E0CA36DC7F6DAECD5", + "z": "28F7C4B609284B83DC5196A37DD44C6FA56A2F3663C534983DE88A849E52886244", + "l": 1024, + "algorithmId": "6207F96903651CBC485F4226DA8F80BF" + }, + "fixedInfoPartyU": { + "partyId": "CF58A9DD392FB8F16251C3B47006BE74", + "ephemeralData": "59F3DAFE1866EA8C72FAABF0FA2878EF9C3DD486DE62381B7637CCA1731F791503" + }, + "fixedInfoPartyV": { + "partyId": "5B31130019A83E393A1C00097DAEB23C" + } + }, + { + "tcId": 768, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6EDCDF559242F78530F78818F061440E", + "z": "7924F0DD2BE81B980872860ABC85A00857807911E9EB033240CC332325971FCAB6", + "l": 1024, + "algorithmId": "A7EF3B8CDE5B550445706DE0A1C9FFFB" + }, + "fixedInfoPartyU": { + "partyId": "7D74470B85E5B09411EA81581CC127EC", + "ephemeralData": "6AA750FCEDA05A2774B586FE64B8E9FC72DF4263A14A078C8FAC44ABB2563F4C3B" + }, + "fixedInfoPartyV": { + "partyId": "A34DF3C6E3F4C96F7C7C3A22E4A3A169", + "ephemeralData": "FD0C33ADD29235F43B6DC14FFA9FC137DF5F3C92BEA3518BE18AC53C5DC58A4B98" + } + }, + { + "tcId": 769, + "kdfParameter": { + "kdfType": "oneStep", + "t": "727A2A819A2804951AAEE2E3BE4D9FA4", + "z": "FA0A57A9425973BC30408FEBC1482C6B20CE75CB3967DF54B64D3BAD40F826CBFD", + "l": 1024, + "algorithmId": "B27AB33878987534D8446A5E08D7DF23" + }, + "fixedInfoPartyU": { + "partyId": "8FC9E146038F07FF63F771828D6C7A25" + }, + "fixedInfoPartyV": { + "partyId": "D5FC0C0BE23983C7E53C12B132FE157A", + "ephemeralData": "2E92FAF480BDEEBAA7306874C80B412FE7CAA9DBE93C00E3C1E534F99D40085013" + } + }, + { + "tcId": 770, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B00CD5387AA2DAC86E668CA9207C5975", + "z": "DB5FA8E04DB77FB82CF9A2F238FEA7DE8EEB2DAB36F3570552F8063926A3A36EED", + "l": 1024, + "algorithmId": "5D6BD3F20A13E734E05BF09147269386" + }, + "fixedInfoPartyU": { + "partyId": "AC1D377334A4CE84533B37C730831C62", + "ephemeralData": "0A6180B9C4FE24B3AB6BA7C7BBA98ED318F85D71AA4FB96E76AACBFB780E2D5AEB" + }, + "fixedInfoPartyV": { + "partyId": "475CDA0381C85086B721EACC314DF596" + } + }, + { + "tcId": 771, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0DB5D4E1E6D385229F90D30EDA3926EF", + "z": "3806E29D24A8753212FBFD527BC972D6022183BE0C136645E7935FB46164F31E06", + "l": 1024, + "algorithmId": "83A117523539EDDBC384F72D97D1A2CE" + }, + "fixedInfoPartyU": { + "partyId": "0163927D6CC9F3A5C63A223D23342E2B", + "ephemeralData": "A7119F958F345ED50337B3C5FD4F8FE0DB6062496FB63F2F52F820B491EC620BE4" + }, + "fixedInfoPartyV": { + "partyId": "67AA350FFBF3EA2B137A9A4BA3D7B972", + "ephemeralData": "CDB4A0F33BC0DAD23B14468FBC8B8FFD0F2E8FBD69EC55BBE92B571EB3B1D4B2A1" + } + }, + { + "tcId": 772, + "kdfParameter": { + "kdfType": "oneStep", + "t": "94B032034F4074A20406A0DAE57FC300", + "z": "A46F7BFE92C30C7217076A4FEE7863DB0A57CB30D1C0C7DF1B0C7748F7D44989E2", + "l": 1024, + "algorithmId": "BCB2D6D4955C54A27E4ED338AE771EA7" + }, + "fixedInfoPartyU": { + "partyId": "A9713346D9FBC9734CB7C4DD8D4AB3C8", + "ephemeralData": "1A9B3FD12D6F857B2CAB162DCA817D081C57641D7AB33B84BC421E93A537CE2844" + }, + "fixedInfoPartyV": { + "partyId": "97ACF8987C40204A2B20226CA152BAA9" + } + }, + { + "tcId": 773, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F250CDE328C4E68BC2C5A51EAECA478C", + "z": "635587A5B9682E29F48B61EC05D8E784EE802A58E44A363F20B364066C3344E201", + "l": 1024, + "algorithmId": "D2DC4B5B49EAB3226BCE7E4EB9EBB930" + }, + "fixedInfoPartyU": { + "partyId": "BB32DD7B6EDF8D16E28666A9067848F7" + }, + "fixedInfoPartyV": { + "partyId": "E0B87AFAFBD7433EB98014ED77E55F3A" + } + }, + { + "tcId": 774, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70DE6F7BB3C95CB0828090DE6586729C", + "z": "A5285E668782A190A05A791C46FECA993ED8C7AC06D6FB62A5F1DAF3B781BA2438", + "l": 1024, + "algorithmId": "194BE87C9C868497DA1951DE521221EB" + }, + "fixedInfoPartyU": { + "partyId": "95047BAA957CBF9597A861C92E586316", + "ephemeralData": "EC9D15F5C5FC5CB166213774AA6F49EF30D2033F6A585126E15FAB1C29E0A5E274" + }, + "fixedInfoPartyV": { + "partyId": "797F2B3E563BE8CEAC46EDC5837CF196" + } + }, + { + "tcId": 775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB5B8FD561776B7DF0D6031624F2A88A", + "z": "BF3345DB956EF97681F5A9848F35CDFAF57ECEF84ACEB1F862684DB3CBEDB250CB", + "l": 1024, + "algorithmId": "9D8EDB5E57501BC31B3C0DDA766757F8" + }, + "fixedInfoPartyU": { + "partyId": "9D84A507511DC28A5BD7D2A1280E8BA4", + "ephemeralData": "D174D079A38BC205D9F6285456BF6CA60F7EB286D2DEBA546CBDA6461B26C2DA6B" + }, + "fixedInfoPartyV": { + "partyId": "6B3BB77D1C7D346B67458899716B6F9C", + "ephemeralData": "20864D5CD9AA1FEA58271D760C4716350D4583F3191B84164CCBB117A2DD18FFF8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 32, + "testType": "AFT", + "tests": [ + { + "tcId": 776, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D763874FEF87737AACC4718324D0C548", + "z": "CA1171081F9CD817D31DAFE88905D5115769BB9A88423376A304BC54BBB5", + "l": 1024, + "algorithmId": "35A5D114EBAA65F7ADB998E483CC6049" + }, + "fixedInfoPartyU": { + "partyId": "09D6FBE19D4EA531E97D5936D2016F5E", + "ephemeralData": "F2806043581C58B82097B92B2A7821049AE4207BA3E1B9B49EC6E9B16122" + }, + "fixedInfoPartyV": { + "partyId": "C801B655184DD097E0600FE5DC92011C" + } + }, + { + "tcId": 777, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2FF7FFE7D1E9D44315F596FE9578CAAC", + "z": "57F5D227EAFC8A1EAE32C1A8050939C4402F1B64AE827B042DDA267B4048", + "l": 1024, + "algorithmId": "EFA0422F09A7172E8728DFA76BFFF220" + }, + "fixedInfoPartyU": { + "partyId": "DA324F12FCC67F1579C6EEC078202EA0", + "ephemeralData": "9B35FB29F09072D680B7FA350E2B853205F02AF0229AFC3557E1C7B01002" + }, + "fixedInfoPartyV": { + "partyId": "4FD6CB267BEAD7BE9045C225042258CE", + "ephemeralData": "593B0F5E4F9A406FE0EB079853FEC63A2DF1363D39822EDFFC41E7779479" + } + }, + { + "tcId": 778, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FE7EA3F5AE29ECBFB2F580F2855F0B0", + "z": "B617C76C5022E99B1F12F83FD00576226F4EF676A11AD9D7F768AED59D21", + "l": 1024, + "algorithmId": "17E7959DC1707C5A5010F966374C5142" + }, + "fixedInfoPartyU": { + "partyId": "38E16D0D7C18B9AF38C0009FE1947011", + "ephemeralData": "1296DF8521CCB621D06C61069064C1108B188CEB02017CEFAA6E546B7C5B" + }, + "fixedInfoPartyV": { + "partyId": "ACD5FE9E65A5C5A361AB4B10A2E9082E" + } + }, + { + "tcId": 779, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0B4F08F2FB04BE5439622E058946410", + "z": "2EFF8511DF066A768F39ED95FE22F18A89E7D4847571343983B5CCEA7EBF", + "l": 1024, + "algorithmId": "05F87FE578DEFBE0205EAFD1F6239D8D" + }, + "fixedInfoPartyU": { + "partyId": "C29E6AE6602B8C4F2B9567B9ED47EF91", + "ephemeralData": "A9D9C108AEF75C23D0FA8D95E44235B372D5C67F072FB6C65A910CBFC15B" + }, + "fixedInfoPartyV": { + "partyId": "64155F8937809400223FC3B58443CC0B", + "ephemeralData": "46C30D00E320F5F0BD5182B2FB86DD0551E215639E8B61340886A42B771A" + } + }, + { + "tcId": 780, + "kdfParameter": { + "kdfType": "oneStep", + "t": "917DE216E85E999883D0D8A5B4193734", + "z": "625FD54E3FD0F25A05E78A102006BBA98C9125E7381D80004EF4405EA372", + "l": 1024, + "algorithmId": "B095F0BEBEEF30F8204ABD6FE7C3A0CB" + }, + "fixedInfoPartyU": { + "partyId": "ABF06D969837E5BC54911B4C5DB31509" + }, + "fixedInfoPartyV": { + "partyId": "212BFFB4706B486DA9F2D2F5E2A2F00B", + "ephemeralData": "07E425D3DFB4C1431480BCE4424C2402EC6F4F532A64B12A8D403371D12E" + } + }, + { + "tcId": 781, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C4E4253D8D830567F70A9F17A3D13A1", + "z": "B9CAC58B0ED23A54E69C8CBCE674897A976963A3B282FDFACD8F1298EC8A", + "l": 1024, + "algorithmId": "95140A9E56DCF6A4EF91A3F6E18E42E3" + }, + "fixedInfoPartyU": { + "partyId": "0C063EF73F18D4060271B1CB4FA8619C" + }, + "fixedInfoPartyV": { + "partyId": "32344281405E97A4EFC2866C634FB6BE", + "ephemeralData": "84C2121A275FE5DB2F557B0FCCF7C53316EE5D73E8E07117C9CB19BB4116" + } + }, + { + "tcId": 782, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22E358D074B2996A4ABEE628660122B7", + "z": "C11FD2AFCC2C1B8B817F0FEBF8CAE71AA2D9D328A2A73C07CCF33C1CE090", + "l": 1024, + "algorithmId": "D041EDCDAE758661BC35D16B1A17EA01" + }, + "fixedInfoPartyU": { + "partyId": "EABE86BFC51AEADD05D1EC1E52A309EB", + "ephemeralData": "C1BAF4001BC5162D8486301FB7E61C351D261001550FA3D36DD8AACA7FC8" + }, + "fixedInfoPartyV": { + "partyId": "F4CF970EAFCF9B13175452E65B425C05" + } + }, + { + "tcId": 783, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB260DC193CA2F58431B8E6C3B4326E8", + "z": "540C01F1112B4030AF7E16FA45822D6DA00EF789BBEA505AADAF44455826", + "l": 1024, + "algorithmId": "2D83D62E026E5E4201E7D731495446CF" + }, + "fixedInfoPartyU": { + "partyId": "2305B051F3CB3A7E3F90D5DB72383440" + }, + "fixedInfoPartyV": { + "partyId": "4358BC9E180428767D10137B109CC2B7", + "ephemeralData": "DF268BAC64F42721C544703F39DC083B7F5E8B4ABFC7439C97C49CBF547B" + } + }, + { + "tcId": 784, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9447550343255D9428D50B85D592FFB2", + "z": "172DA1B47226D8B5072E1ED069754956083339D02B487453C08FBA3A2582", + "l": 1024, + "algorithmId": "F5CE4EC79155EA63DA5B53FF489BFBE4" + }, + "fixedInfoPartyU": { + "partyId": "9C3B598D1EABF1651314A10EC1A30ED6", + "ephemeralData": "7A0F73DE036135B4F97195C2553046B20C1D9462707B6628849ACEDB078C" + }, + "fixedInfoPartyV": { + "partyId": "7FB231935A7A893B49529A277C899D5C" + } + }, + { + "tcId": 785, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35BBCB4EBF8EC31F336AFA177B340C21", + "z": "039DF4DA6DC2720F1E889B133B1DC65705D5BD4DCD52AFF6115CFB9373AD", + "l": 1024, + "algorithmId": "037E82D65FB8D3EFC3C32BB8F9A02C6C" + }, + "fixedInfoPartyU": { + "partyId": "ADAC4A29841510A683EF62B282182474" + }, + "fixedInfoPartyV": { + "partyId": "120137EF3920648FAD20B712A2C76B19" + } + }, + { + "tcId": 786, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FCD757DDEA43F0666EE77EFC4B46456", + "z": "B71D3DDCB3E9EB7E77B5EB1E22B03CCFE83C07DDCF3720B17AD8E83EB5BD", + "l": 1024, + "algorithmId": "052A9DE80CF96FEF4C95C27CE219D863" + }, + "fixedInfoPartyU": { + "partyId": "E6991F8D94B2DB2C425E334EEAA179CE", + "ephemeralData": "E9203942F56EDD9C9A526563007F02749E25FF5237465AE1575B2D676F1D" + }, + "fixedInfoPartyV": { + "partyId": "420BFB0790C0227289B5CDBF8902515E", + "ephemeralData": "93C2A5408EF64CA7DE9CFC01D85D39A81466BF8AD382D781361F0D923E3D" + } + }, + { + "tcId": 787, + "kdfParameter": { + "kdfType": "oneStep", + "t": "270F239712991D8FE732D939264187F5", + "z": "CEA2AA85B9BCE5A51BF8EAF2179877BD40099ED152902DF6C188821F1A19", + "l": 1024, + "algorithmId": "C1FA43DEF72DEC4298E03BC715A1EFBE" + }, + "fixedInfoPartyU": { + "partyId": "9308E695139033397823C4DE05DD1E01", + "ephemeralData": "85E459BFDD2054F96203C0B351C28B4C3BCEC53A75FE2F24307F7A21604E" + }, + "fixedInfoPartyV": { + "partyId": "B2E84EDFD6B8ED8153804937DC28DDBF", + "ephemeralData": "822C07C5CF6F0B0204F29C5DB6784ACA71A15ACD67EBDAD35494D28844F7" + } + }, + { + "tcId": 788, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D9DE1B7412FBD1596CA6792FFF5D6EB", + "z": "EFCD39625FC2AF68DF25C093C6592F85965565DD6A9387525FE630DE1A62", + "l": 1024, + "algorithmId": "58AD18800DE71F1DD331FCF677F68D17" + }, + "fixedInfoPartyU": { + "partyId": "6489286C6E848B717C3965ABC9813B1B", + "ephemeralData": "72B63C0854DDF520EB8BE3A14FA3B918FD876D2FB282F8DC4DF1E7FF377E" + }, + "fixedInfoPartyV": { + "partyId": "0E0AB228D1A5EE2907CD01E31E5D253F" + } + }, + { + "tcId": 789, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3426071806D8902FE5972DEC56F23D9B", + "z": "F9A4E3DA9429DF78990400F63FBEF6932F134D77C0407081EEA61369B5DC", + "l": 1024, + "algorithmId": "5231BD7E67721944B9FF7D740979C10C" + }, + "fixedInfoPartyU": { + "partyId": "4AB52C1682BCADAC1E53C88A3EF23CA1", + "ephemeralData": "8382444893A0A2CAA4D55A3A1E47CC9D1312E9893D42302611D848E2FDFF" + }, + "fixedInfoPartyV": { + "partyId": "34CA8B470DCC2BC8B0C1E6DAC2DE2A4C", + "ephemeralData": "5CC88D0F55960AB6394F0A5FF1BFAEE1C845A840325BFBF07A0DCFB61E99" + } + }, + { + "tcId": 790, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA07051FD379816E32D10B5D52B0B9AA", + "z": "F2422F2181646207949EB8A0D5735C3FF13B561BC4C07900F52A293EAA56", + "l": 1024, + "algorithmId": "173B3B9EA0B9775362C6BCB090B3356D" + }, + "fixedInfoPartyU": { + "partyId": "7AEF999236B8B5EC11FCF349FE6F4D43" + }, + "fixedInfoPartyV": { + "partyId": "36D1D3A9C5DCA2C21C4E65495F1C417C", + "ephemeralData": "424C1F5087E221E7F99326EDA58AE9736E0267FFEBE962604CA83CE6CE80" + } + }, + { + "tcId": 791, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BA1C1DF7C66E31BFB06E9B3F66607F4", + "z": "39051F8482CE0A011776DB68433E3F8F6F24A3F158C745FC35BAC60F9DCB", + "l": 1024, + "algorithmId": "3739FDA72E540F572BB66C029F7ED4F4" + }, + "fixedInfoPartyU": { + "partyId": "63F85B2F200ABF7D73EE0962096D954B", + "ephemeralData": "E755D0A9C5CB51850C1B355B0C8D3FDCB138F7059CB3D5C6589B3D2653AC" + }, + "fixedInfoPartyV": { + "partyId": "7BE86DAE34A63CAFFBDFCBD7AA6B12A6", + "ephemeralData": "5DE78E1E5C916011D98D8CF2F6CC7FF5AFD672D4CE9FBB2D9C4EA2E12D0E" + } + }, + { + "tcId": 792, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C378C8D268C513F0486D1269E2629064", + "z": "5F5D9ED65A87FA0DDC79E7E60B7D58A1BF3E6AD41FED81149856ACFE5C0A", + "l": 1024, + "algorithmId": "DDCFA70CC2B8CC9A45C722B2C7A3F40D" + }, + "fixedInfoPartyU": { + "partyId": "033E4AF5E17BCC8623A8AFB8F554D272", + "ephemeralData": "E7986C1A8559B0F207491502AC8E2376C1FC24044F2D4991E2C7EB6C7231" + }, + "fixedInfoPartyV": { + "partyId": "FFA4608AABC3F0AB73F12CA55184BCC3" + } + }, + { + "tcId": 793, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E18945DE7719A2A129CFCCCDD23B7E6C", + "z": "4DDC4A2A6DCE806EA60E856F741C2875E2C90A929C932330EC33D9DEC01E", + "l": 1024, + "algorithmId": "0927160ACD15DD7F83C5F6ECCB969D4D" + }, + "fixedInfoPartyU": { + "partyId": "C43A303E184E80D54D3749AF34533AA4" + }, + "fixedInfoPartyV": { + "partyId": "46E6C1C60B5D5277D304D56A5AF12CBE", + "ephemeralData": "0F41D9F637604F6439F2EB1D6C0C09453D67F537EF9ECFF12C3394B757F8" + } + }, + { + "tcId": 794, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AF11C2A9C97793DC94B31B2DADBAB29B", + "z": "E8BB73E10CE70FD715E4B54142EEF81264B8187F4F1C6B3F4F5371B6BC5D", + "l": 1024, + "algorithmId": "6C5E27DDCB808AE0CEB13306BDA09A2A" + }, + "fixedInfoPartyU": { + "partyId": "9B9CDD904E724C19EC70216ED1781D25" + }, + "fixedInfoPartyV": { + "partyId": "B0CC6E478AA7E447CA5B8167DA7F8178" + } + }, + { + "tcId": 795, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A7F81541C204B72A81802B6343B9234", + "z": "FA7019BFEA23F90F54B5F6210ECBDF18A3FB2DDE189ACE3A0B502571C321", + "l": 1024, + "algorithmId": "5BAFD85DED21F2237217906532923CFB" + }, + "fixedInfoPartyU": { + "partyId": "EB249E996C58280A8A6699CC1773A21E" + }, + "fixedInfoPartyV": { + "partyId": "5E214B650178B4CC55895F46514133CF", + "ephemeralData": "A488EEE4FFC1E942D8A92EE6F03E38D571BA489EF80441787ED6E4BA3BF9" + } + }, + { + "tcId": 796, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C32DFD8CF40DFF0A0B5FC33CCBC4489", + "z": "175EA5A949CB06FBDA3E18D610A17A8B2727585ABFECAE8196122A879FE9", + "l": 1024, + "algorithmId": "0FE9D2808042C05D98E79E8599E98102" + }, + "fixedInfoPartyU": { + "partyId": "5CA273DF0EC3F3FCBF4BE096F68D7EBF", + "ephemeralData": "FA3054E314E12FAB9030CADBFFD550DBECC95E81A40F0E1908C82DC653C8" + }, + "fixedInfoPartyV": { + "partyId": "61C93C87E77475F7EA9852E0CF6F6387" + } + }, + { + "tcId": 797, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5E75A5165C996C0C660789290328308", + "z": "B334AED95BC525BAE1C2B76F289F491881DC461538D8684B2BF28AE98E91", + "l": 1024, + "algorithmId": "C6CA0C38301C8E6F8C18FE449921259E" + }, + "fixedInfoPartyU": { + "partyId": "1A625AB7CA38DCD43F23AA9F66A7153B" + }, + "fixedInfoPartyV": { + "partyId": "339D5297C4C3D4AFF230EA29C57F7D3E", + "ephemeralData": "3C7B5FD6EF74762A12EDB5309A71ABC36029F87E92545F266EE1769F00FC" + } + }, + { + "tcId": 798, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAEE78AE4F2D1A180B976173DC3AA51B", + "z": "4E7737EB448F17221CEF46DF8B3A71323EBC41CEB300A389B2A3629AD22B", + "l": 1024, + "algorithmId": "6AEB38FD2182D1EE519DA55204502678" + }, + "fixedInfoPartyU": { + "partyId": "5593BFDC961B69C6899D2AF698E376A3" + }, + "fixedInfoPartyV": { + "partyId": "2B52C65ED383B00FFAA7992215BCE8D9", + "ephemeralData": "68B6197AE79D3BDC8039BA4E11F63983623F582B75C5B0D30748245E5810" + } + }, + { + "tcId": 799, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A0428792FF5AD08F87260F9327B1DD6E", + "z": "49BB4128091087B6F34622F688F4F6BDCB451EC81FD606B8516B86FAA43C", + "l": 1024, + "algorithmId": "D7201AA704BD258D5C491511B8903697" + }, + "fixedInfoPartyU": { + "partyId": "08477351AB251D6B9A1F02C81DE205C9", + "ephemeralData": "A29BFDD91C5AD6BB03283BC2568D4A7728617673EE485A1F910A0A6312C3" + }, + "fixedInfoPartyV": { + "partyId": "24AC147FC2C374BE3E572E65C8073F42", + "ephemeralData": "8365784D974EF348C3996E33ABA6BE21B7EEB08D57C019CD851DC460ADF4" + } + }, + { + "tcId": 800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3DE425B2C570DA56962DF66B0BDCBAB5", + "z": "4DCA2CB91BB7D5EB2E4682B23D23EF0E71A6189FAAB7D890BA340DD423F3", + "l": 1024, + "algorithmId": "261455D9681A850502133A0710B1E4CC" + }, + "fixedInfoPartyU": { + "partyId": "1457C154032AFBF20681B674DCA1DF4F" + }, + "fixedInfoPartyV": { + "partyId": "0E63001956FE38C5F7627374A280CCE5", + "ephemeralData": "D8B0837EAFE53F6CDAAB4A60D42AA37E29DA4258B74B1C6E58FCCA77C05A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 33, + "testType": "AFT", + "tests": [ + { + "tcId": 801, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74A4ACDE516ECB0CCE5F5AB68C8BA020", + "z": "221B30BFF3884390A8B1099EF44D82A9B4456863986D251936977476C8AAEA", + "l": 1024, + "algorithmId": "BFF4228DC3B85758016D9E8BFF57A3EA" + }, + "fixedInfoPartyU": { + "partyId": "65FCC249677169894B7D5AE2D944B3AC" + }, + "fixedInfoPartyV": { + "partyId": "09E977A3EB333702386A05B891CEC417" + } + }, + { + "tcId": 802, + "kdfParameter": { + "kdfType": "oneStep", + "t": "363BD0136E60AC142DA29286CA2EEE71", + "z": "4C0D2CA560B7FAD675C7B47C59B1EF5552E4D4A8EC73E56EAE07360CA18B13", + "l": 1024, + "algorithmId": "DF3581725444525E5F7B8C5274E59C69" + }, + "fixedInfoPartyU": { + "partyId": "58F9A613E5C03F69A928E0E7410D178D", + "ephemeralData": "3062E2F43CEF08C6756BA3C7915E26D84209A67E12CA154C82BE77617E0A59" + }, + "fixedInfoPartyV": { + "partyId": "C22A1615D1F48B5816EA8E214B315F00" + } + }, + { + "tcId": 803, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A7435850301240B97DBD2102EB3944A", + "z": "B42C159DF90C7C314BFA43C820F92E98E4BF1A58FAC1C0DECC91731B45EA7D", + "l": 1024, + "algorithmId": "E4EB40FD25C6B86C392F16C204A45803" + }, + "fixedInfoPartyU": { + "partyId": "7D82D74E6ED4C8B970D0FB12A89B4337" + }, + "fixedInfoPartyV": { + "partyId": "93C92E98679E149E82E7AC148CD56840", + "ephemeralData": "9A200932E77425B497232757AC5DAC8FFA59FD8C6EFF67885D9DD1177E14C3" + } + }, + { + "tcId": 804, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EFB5781C3E22161D14BA5DE7BE75F188", + "z": "EE48923BF14FD8FCF9ACB539F8AEDE2EBFC14F887574ADF3234B97C4EADD1C", + "l": 1024, + "algorithmId": "38DE27535F8A2D090B87B4510F639359" + }, + "fixedInfoPartyU": { + "partyId": "C532E7731082CE3CA1193D75439B7891" + }, + "fixedInfoPartyV": { + "partyId": "6561E85947ECEEE4703A7C806E60F357" + } + }, + { + "tcId": 805, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE2611C4C9401CF2AE213F7FFDF24001", + "z": "968DAD8E4694FD45F0029BAEE4592C9141C4ACCC75C99DADF0DEEC3494D879", + "l": 1024, + "algorithmId": "87D5792C9E32E9685B56EEAB39421F85" + }, + "fixedInfoPartyU": { + "partyId": "0155C9B65F4550229BA1E4542544C257", + "ephemeralData": "7B3AA2565EC1BE8BACEC9F68091E321000619757374EE77752782D6B9CAFDB" + }, + "fixedInfoPartyV": { + "partyId": "8B4369966DAEF14A292BF0FDB31993A8" + } + }, + { + "tcId": 806, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCB144E2A5D586178891FBBB383D01A1", + "z": "BFF6C96E59F6B999AC78C407E564F0121F94E000E3DE500FB4AE3E0347CDD8", + "l": 1024, + "algorithmId": "8BA0113504E6991EA29C9FF4707E4B94" + }, + "fixedInfoPartyU": { + "partyId": "A89117DCE82E4CF24C9CC9672B1AE7DA" + }, + "fixedInfoPartyV": { + "partyId": "59464655484AAE205F07A95E7EB5C367", + "ephemeralData": "069D03521A47CC123D7C41410506D64E2781CF8F96BAF2185349B768C61809" + } + }, + { + "tcId": 807, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E070162DDC413C5E309CD91F5DE828E", + "z": "C2861204AD0C2D5AC2CCA1DA782812018B6367C33DA2E7DDDA93C02AB1C601", + "l": 1024, + "algorithmId": "5877938C9E84C9442464D71872EF3727" + }, + "fixedInfoPartyU": { + "partyId": "7C4690EE0E00A8FA984CE1C69CE5C143", + "ephemeralData": "CAD4BDA0327D8FC51FC4C78101F9E060CAD5E6B4FC570335FD2C8839CAC288" + }, + "fixedInfoPartyV": { + "partyId": "13E4508AC367E794BA88BC507C4B8FE7" + } + }, + { + "tcId": 808, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B862B76E3C12070A09A1B60E1A8F554", + "z": "90CD58A0B6F3683EA99F75C974BA804C57ED915CE00FF84AA681E92657A8E6", + "l": 1024, + "algorithmId": "61DBADF72D6F4AA206B11AC02694025A" + }, + "fixedInfoPartyU": { + "partyId": "0F3D3B50E85E4ED278B5554E46D4C376" + }, + "fixedInfoPartyV": { + "partyId": "2BF205CBF5BD19FE4726BDB7BB6375C8" + } + }, + { + "tcId": 809, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6C1EAD603C751DE5C05E8315243410C", + "z": "36E751A729D235149CFB0A0F265D5FF99BC97A048B07D617AE6168A20C1E5C", + "l": 1024, + "algorithmId": "49B20A5987A92E140CEB18F8072E3AFC" + }, + "fixedInfoPartyU": { + "partyId": "E2005C2A7C2B92AAE10FFE3B2A036D29" + }, + "fixedInfoPartyV": { + "partyId": "EEC50738966DF782609CB2C478A3CEB5", + "ephemeralData": "8B724BA206B9CA66BA65BD4483F114F035B7717FDE7C7B7C50FB609E779761" + } + }, + { + "tcId": 810, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00D58E9F9259802AF26E349049A6C026", + "z": "BF63FA11EE8E2024DC4AD50978884650903C0A41C0E09A7B8E407A3577935B", + "l": 1024, + "algorithmId": "3BC5ADEAE20A6FCB5FF5539119808F58" + }, + "fixedInfoPartyU": { + "partyId": "E82D73AFAF2A31E6C18F365686099A3C" + }, + "fixedInfoPartyV": { + "partyId": "36817C51EC1453B7102BCC16164B08EF" + } + }, + { + "tcId": 811, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71A667C994444E50A6BE68535B8A79A6", + "z": "753456A42ED24D1A885416111C07ECB2393B3F94DC960BD0CA4D9BF33C7F79", + "l": 1024, + "algorithmId": "830668B26FA738593FC99BF37F790B82" + }, + "fixedInfoPartyU": { + "partyId": "672A8BBD4FBAAE59E8122B32F63592F2", + "ephemeralData": "8ECB045B62C31ED98706440902EA20D679251FC8A522F6255B954BC1A89115" + }, + "fixedInfoPartyV": { + "partyId": "39206C093CD1DAFCA6B48CC58F196B22", + "ephemeralData": "6C7DC9732E05436C4AB495065D83932B20FF3287A2CE0A0ED05E28A19D7840" + } + }, + { + "tcId": 812, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E60436279847AA403D3E52B7390241B", + "z": "BADEB4F492F0E826BB260CF3C9B01FC2DCEA1ACB088F7F143CC0C291255FEC", + "l": 1024, + "algorithmId": "81A64C600BFF654D1D58396E37F4BC0C" + }, + "fixedInfoPartyU": { + "partyId": "E908DD9CF47BE85BBF1427011EC00509", + "ephemeralData": "491F32910B6EF00A9ADBCC59C5FED4A060482ED1A9FEA4C5316C79B25AC29E" + }, + "fixedInfoPartyV": { + "partyId": "2CED6B285D588E998F0883F155D807E0", + "ephemeralData": "9E717E73CA2C6FCB1D6EF256CAC9B58493A0600BC15028C3ED8F43DEC8531B" + } + }, + { + "tcId": 813, + "kdfParameter": { + "kdfType": "oneStep", + "t": "78EEF0C8BFF61234AAD265F3218644BF", + "z": "6A7E30EB45AA86870BC9725F653EA43FB34AABDFF0568DBCAFEF06151AC6B9", + "l": 1024, + "algorithmId": "610B33BADF38DA64323E26FE795458ED" + }, + "fixedInfoPartyU": { + "partyId": "FFF3749D94C994D05BF518F325C0EB74", + "ephemeralData": "136E34A8CA95E3AF27BF24EAF37CEC0E8BC3A95C8F92BAF0058F8A8A1BB65F" + }, + "fixedInfoPartyV": { + "partyId": "26FF65853934BA5CE9E063798B5BAB93", + "ephemeralData": "49A186EF3096930CAA12374EB1FC7F4CBB5DC4F5A66B8FA0C514FFF7B0863E" + } + }, + { + "tcId": 814, + "kdfParameter": { + "kdfType": "oneStep", + "t": "203209E7718110AB106A8FCE8C7B3E16", + "z": "434D343C50ECF2EE485FC719DCA752590A60103D9E5062FD6859BA94245394", + "l": 1024, + "algorithmId": "7F9CE988BD0C9FB52ABEB64CFBFD5D7E" + }, + "fixedInfoPartyU": { + "partyId": "002DF17D2A7ED5BDC407C43428EC6CAB", + "ephemeralData": "FDCA3449431EE34A94D53723D0F30D14C92C09CDA2350B3558192D3F1E2806" + }, + "fixedInfoPartyV": { + "partyId": "B4F6658E28F393527D032F0B3604ECC5" + } + }, + { + "tcId": 815, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7297B0BF05CBD8BF216779E1F850FBB3", + "z": "DBB5BE38545F0844477F18DD3AA5C965BD119434B31E3E159DB36B49D81CE3", + "l": 1024, + "algorithmId": "74A60DF04CB78E3B9ABB891114816FBD" + }, + "fixedInfoPartyU": { + "partyId": "8C32C6C3B93B5EFF095D35D46944F68B", + "ephemeralData": "7D83C5DC7F3A9C6C30E9A84F3D28428956645F0B4094D5635ABA751A3C651A" + }, + "fixedInfoPartyV": { + "partyId": "A0FD1CA0FE06EA3C15C079581DA7D3D5", + "ephemeralData": "4F8FEAA2650112820FFD46B7386A16519E7D3A3A7ED03431053CF59D8030E4" + } + }, + { + "tcId": 816, + "kdfParameter": { + "kdfType": "oneStep", + "t": "626BB739AB675F492A6A99885EEA6283", + "z": "7A20BD4FAF406DA6D469A3ACD28D8802BA881BB0B30BE2BC194C3C67F2FE33", + "l": 1024, + "algorithmId": "0881B37FC7EEAF3EB3CB25AFF96BD83F" + }, + "fixedInfoPartyU": { + "partyId": "0EBAE67C7C2E4936CB19C180948B4486", + "ephemeralData": "BF57ED74629BC16F413AF3906B2C91C2FEC99CFCFA4C2AC9BFBEE5AB2264A5" + }, + "fixedInfoPartyV": { + "partyId": "9ACF1F7456CACB85A1CEFD59AAEE31B3" + } + }, + { + "tcId": 817, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05DE96EA55367D6AFB76DB1F7FC9E386", + "z": "96E41298E00CA7DB155DA5635F6C14349E870167BD2CBF8BE0373445DCD6FD", + "l": 1024, + "algorithmId": "E5BFEB53A5A8E825803949154B081DB7" + }, + "fixedInfoPartyU": { + "partyId": "F90F1DF3C03D024EB07A0E7DA7A30A8F", + "ephemeralData": "BD219D676010BC9A2521E05D5D2E95DB794856279E01C1A05F7B367D4002DE" + }, + "fixedInfoPartyV": { + "partyId": "F788DB0DBC07448E5818A30FB9FD1298", + "ephemeralData": "BE1765D919CED57D38698E58140543A002F71A25C1A6DDBD029CB1EF5EE4C4" + } + }, + { + "tcId": 818, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CDBCCB80BAEAE08BD1B50F355CB60CC", + "z": "F67AF26A2134B3F0BC145EBBF420CAE430365A4379026D38BDD98A3FB00FF6", + "l": 1024, + "algorithmId": "7CD1399B076A105EAE86A01929F2CE40" + }, + "fixedInfoPartyU": { + "partyId": "62D7D6F1E892A2F3F191888C112D3591", + "ephemeralData": "19CB2BCC18002E385BA4252C0EE80CF24653B7568CC052E2DE1FD89841C97D" + }, + "fixedInfoPartyV": { + "partyId": "3B9B05C8392F4F15B95E3928EC50D2DC", + "ephemeralData": "32936BF6DDF82EAEB91E666783B0A687B61106D869096DD9AB35C9EEE4F64B" + } + }, + { + "tcId": 819, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27777747F9A338460961B915A5C41C0A", + "z": "974F4F5E34732A1FBE82312ED3E607FBE2DC04E4E88442F20F1DF8AB293694", + "l": 1024, + "algorithmId": "A57D36A5AA2BF56DDF48F3977B7C8CD8" + }, + "fixedInfoPartyU": { + "partyId": "047DD09062D10CEDACD10C6F15037DF5" + }, + "fixedInfoPartyV": { + "partyId": "F3A3B0E98581097711F548A461F2A856", + "ephemeralData": "5B04275002F8030D3550365DA708CA6EAC4F2D1F6021E63935EE72C60066F3" + } + }, + { + "tcId": 820, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14002E709CB4DA8DDD18403F7EFA222C", + "z": "3F7C2D9E81DF76A8C61F0830EEF6FBA04E0FDADF8B57BD6CAE731100ADB454", + "l": 1024, + "algorithmId": "50D071EF6C666179AF19E1790EBD8FE8" + }, + "fixedInfoPartyU": { + "partyId": "0238B4E8C08E73B93FCFC33A1751604B", + "ephemeralData": "F3DE5E7ABD35B72BDD14F8897E4018403E10F2318905ED350CD03F7AA1138B" + }, + "fixedInfoPartyV": { + "partyId": "C60D46BD4CE144900BC4DB1A1203DD3E" + } + }, + { + "tcId": 821, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D786E41B079893A7FA1D7A47A157F93", + "z": "A1EAA4816F50A47A43C777A4C9A63B990317C1DF5933F851F5A33C1C5A6F2F", + "l": 1024, + "algorithmId": "E711D2145C649DEDE29B1E0AAACF4652" + }, + "fixedInfoPartyU": { + "partyId": "BDC17E7181C38AEFABF477A52C56247E", + "ephemeralData": "FBD245B41AD9FB46215EEA6BBBDA910EAC7334EC77E02B6895D3A59A75DF85" + }, + "fixedInfoPartyV": { + "partyId": "BBBF7C967AC4C050D90774C5FC4B92E2" + } + }, + { + "tcId": 822, + "kdfParameter": { + "kdfType": "oneStep", + "t": "027A1657CA1544A1A0BBD65967E24949", + "z": "D68D218D3CA37FCD74D229EB14AACBAC3591670FC915DF2CE93017334BF0DA", + "l": 1024, + "algorithmId": "B0E8A7AE8D8603972E5737D1DE433BA3" + }, + "fixedInfoPartyU": { + "partyId": "38AB0C4387B55F1899B45BBDB3848880" + }, + "fixedInfoPartyV": { + "partyId": "520A5CF473B37D7B08D88F01ACFF690E", + "ephemeralData": "03242501DE42AAACF97E2A8DB87F2B6BD4C1304A738BFB11165077DEE38648" + } + }, + { + "tcId": 823, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8873CD8C9BD55CE84C347F40A6101D79", + "z": "B3613FB3FCE319C7E81920CAE25FBBDE7C63A2C971904B1AB9F728A3D1F8AA", + "l": 1024, + "algorithmId": "069BC036D1CF778F40FD1510E5304D47" + }, + "fixedInfoPartyU": { + "partyId": "A96B0EAF5BF56482DEF7EF3D264704C1", + "ephemeralData": "B838BD2B655F81C3EE3E3D5BC4AFDDE9DA05FA44890A109167A9EA2DDFF6E0" + }, + "fixedInfoPartyV": { + "partyId": "88996DE52D94DF5AD7858149D3773AAD" + } + }, + { + "tcId": 824, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4084550D9D83C8942B24FFC904E0596F", + "z": "AEFA138806158E931DDC277CED4E04189F492512C96BA9225319A338200C11", + "l": 1024, + "algorithmId": "A7F8AC783EE6CFCFBB9896509B41B393" + }, + "fixedInfoPartyU": { + "partyId": "0612355E5ABE065503C08B6C2CA54A79", + "ephemeralData": "5EBE816875984A448D331C7FC750BCAE0ECB128EA98CEF35190868BE996A28" + }, + "fixedInfoPartyV": { + "partyId": "427516FE7DF78C4210EF61A85FBB0F7C", + "ephemeralData": "2D8EB524F2843FCC4D666C577F2D2E30B3B092CF7455DDF52F874BE5A2ABAF" + } + }, + { + "tcId": 825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F19D6BB7CC939B14A8CA0470B0B9388", + "z": "EB8BF02B2530484784ACA70B0EECF130481170CEE06FD24240FD44DA966315", + "l": 1024, + "algorithmId": "B9AB52077157F116A607BA65D77BD4E8" + }, + "fixedInfoPartyU": { + "partyId": "D9BDBFD838C8528B74D0BCA45CC8D83F" + }, + "fixedInfoPartyV": { + "partyId": "475215D813924EDE68E70EC8CE8A99F0", + "ephemeralData": "3CB3603D6DC5F3E0C9761D01573A84578A88AC74DFB883782174A4B5A8F6A1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 34, + "testType": "AFT", + "tests": [ + { + "tcId": 826, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0FB96DA960F95A158A7020F7580F438", + "z": "C30E8483A3CD4462689782193D008937E7EAC568F3A597468F0D10B7D910", + "l": 1024, + "algorithmId": "02F73BF9137C65960D5A1E1924FB7446" + }, + "fixedInfoPartyU": { + "partyId": "E1991CCFE9AEA8F5E78420028B6A0033", + "ephemeralData": "99AED37048190517E45F5A68C0E288C20B69427377A758797C9C95855DBA" + }, + "fixedInfoPartyV": { + "partyId": "A410A85B33F183962D8826C936EBAB45", + "ephemeralData": "892B69E529B4FF9B423356C8310EAAA50B537C8046D50E87305CED60EC9D" + } + }, + { + "tcId": 827, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB14723533368DCA14C452DDC808DFBC", + "z": "FF1E97F9EF7158265B1D2121F7EC47F5788EA49FE8F916AFFD2B14C887D7", + "l": 1024, + "algorithmId": "4BBE6403059BE91896325425C40435AB" + }, + "fixedInfoPartyU": { + "partyId": "1FB3F4CFF130BF1FA99B7C2EAFD4A660", + "ephemeralData": "8C2CF161D742AB794ADFD0F987FAF817033BA270617BCEF3503E46EF9751" + }, + "fixedInfoPartyV": { + "partyId": "072B1AB2E1E15522B82F00A86A52A531", + "ephemeralData": "97FDEFA46541C9165BD150CB2FEFA101EF6603431D07A64EB96CD5F919BC" + } + }, + { + "tcId": 828, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F3A2B9022C422E3069F18F9F776B417C", + "z": "E7140DDD60BB0F36F89841072FDC5D64292BF009CA78A939B5C059876F59", + "l": 1024, + "algorithmId": "537C84C807502CE10313573C0ECAAD9F" + }, + "fixedInfoPartyU": { + "partyId": "0185D5FFC108C69223FD59AE5C892800" + }, + "fixedInfoPartyV": { + "partyId": "942BD8609E7738605A61B2D24FE5C907" + } + }, + { + "tcId": 829, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F2AB55CF1CA7D9FE53C1DD0EBD8A3BA", + "z": "4433F0745A9EEECA35318F2CD32F3BEB7624DFE0EF76908C44BCB1636446", + "l": 1024, + "algorithmId": "A0F678ACAC0377CB6E35FE6D1440DB0B" + }, + "fixedInfoPartyU": { + "partyId": "5D3CE075471675E345154765844C1611", + "ephemeralData": "C0EA78B6F0EA26A311A092CADD325C9CD06212759A114D9B8888C28E9228" + }, + "fixedInfoPartyV": { + "partyId": "329FAD5436B18D8882A45E4B9941B1E9", + "ephemeralData": "BD6AE13D55B0B73E84C8D1C3B0516323D298D768EE1720CA710342EA7AA5" + } + }, + { + "tcId": 830, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D6B876CB29F540A6D869447281C09B6", + "z": "ADC75E83695D747B66EB48080D3282466AB022F4C1446D254136D712556F", + "l": 1024, + "algorithmId": "382E20765E816326BE6067B28DD6E408" + }, + "fixedInfoPartyU": { + "partyId": "649F85E3AEE47501570D20EE74F89E52" + }, + "fixedInfoPartyV": { + "partyId": "A5C6BECC799ED90922237E5F801D0EA0", + "ephemeralData": "35DD6F46E551D41FF22CAA50E2ACF9D4F6833D63930BDB74257B3C2A566F" + } + }, + { + "tcId": 831, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09E29B912EE1A06A577CA54D874C6577", + "z": "BA9558D854E64A7B9300A8CE1703155E673020818B2F6E9E100B68EE7750", + "l": 1024, + "algorithmId": "D51E25FCCDB57FB789E977F942AC62EF" + }, + "fixedInfoPartyU": { + "partyId": "5B23C158DDC767C9B537847DAB9D1BF7" + }, + "fixedInfoPartyV": { + "partyId": "D94538B782A3FCBD0839CC792BCC4202" + } + }, + { + "tcId": 832, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3A8A1CDEA7938C67FD44655A8D735A5", + "z": "051A816A5C4C0CFEAC4EE71F29CAB3ED8A5840E9308F280995CD90BAD8F1", + "l": 1024, + "algorithmId": "B70A150020E5BA9F60EF94BA30DC2052" + }, + "fixedInfoPartyU": { + "partyId": "935C2519AF2C10E97A5B282E2211FE92", + "ephemeralData": "939EBB0F405058C45B352EEB9D890D872B7043ADDA4474C181A31FC64B3B" + }, + "fixedInfoPartyV": { + "partyId": "36AD4DE9AD507CEFE553362E35B8AFD8" + } + }, + { + "tcId": 833, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53AECC2DC880216894C59F8BA95F97B4", + "z": "1F1B7DF18AC38090756F10CDA841B5F5EBE809BC028632133E8FC5E554D0", + "l": 1024, + "algorithmId": "E07556DFE9D67C9360E79B9F591F881F" + }, + "fixedInfoPartyU": { + "partyId": "BCE388222D837650B0708B1883CDC632" + }, + "fixedInfoPartyV": { + "partyId": "17964D040265C35BE49EFF8587CB2C7C", + "ephemeralData": "4CAE0BC7BD9E2FC7AC98505074DE069D0752428D5757904469D2653BF6D0" + } + }, + { + "tcId": 834, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26E2F05060D1F493770F0C6A17A76FF0", + "z": "E57CDD4E448E43C4B53C259D889FD53A50143891910982E919F2470431CF", + "l": 1024, + "algorithmId": "0E00CFAFEB46594986464DD1E2BB9D50" + }, + "fixedInfoPartyU": { + "partyId": "D67AD90D2586D61BB8CB7D1C20775836" + }, + "fixedInfoPartyV": { + "partyId": "060CCBAEB9C06D19E9BC53C7C1FBB943" + } + }, + { + "tcId": 835, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1C796B496E4E83C37D99712F31EC9BF", + "z": "CE888231E2EC0FF5BE147257D381873B7DFEAC7F354EE505599A96C9D893", + "l": 1024, + "algorithmId": "E4D3BB66FAAB04B8B1656D6A6E1AC6A7" + }, + "fixedInfoPartyU": { + "partyId": "2D17DCA539C3654A3DF28D67E93D22FD", + "ephemeralData": "18DBAEF1894394AE16146E5C387F5D8327B7A9B9E2D5AC543EE0155DACBE" + }, + "fixedInfoPartyV": { + "partyId": "9439AA923CE8E41DB82AD573A9BFF718", + "ephemeralData": "84D786781BC632AEB40EE9C1CABCD1A64C57D2C9FEA825BEBBA426DB403E" + } + }, + { + "tcId": 836, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98A813AFE71CB4C0D6CF4A633811CF59", + "z": "98BFC668CC713D70CD97ECD9FCC0000C7E4E88C7D7B6FB1CD55F249CF9AB", + "l": 1024, + "algorithmId": "77B48FBDE79ABD59F680DB7B28A34087" + }, + "fixedInfoPartyU": { + "partyId": "46828C8115B3831890F3C43C02154547", + "ephemeralData": "4C813956E32F0D47414C73828F1D3C556C92B35E88DD01BB39B2261BA842" + }, + "fixedInfoPartyV": { + "partyId": "DD943B5E01590B9572A31E26452ABBE3" + } + }, + { + "tcId": 837, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1C84FEDAE780FDA8C2A8911E2340BC6", + "z": "2C76642B405A18ACC3FDC2863CC956013EE991B041E578F8300657F21FEA", + "l": 1024, + "algorithmId": "16118377CF74A0AB36DAEF7405CC85A1" + }, + "fixedInfoPartyU": { + "partyId": "98D8CFFDBC139510BA9157E4B2D75B49" + }, + "fixedInfoPartyV": { + "partyId": "019305C5FCD97326C305C9B0E4220D9B", + "ephemeralData": "4ABDB8E4BEEFD29298475456909EC140DCC641AFF12C0FC5AA5936B955F8" + } + }, + { + "tcId": 838, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBD1202D22F3B8632218EC516AC6DEA5", + "z": "D1BDD2CE5082AE521B29678582847072D086BB4E504C9E46CA11B7CCFBB5", + "l": 1024, + "algorithmId": "C2FF6DE8BA051F4EA3F4B18A32729B9A" + }, + "fixedInfoPartyU": { + "partyId": "5D9D001E2798DBB047A1ED05394E2E76", + "ephemeralData": "FD02CFAAD13CCF84CA4D6D20DA7AE174FCC1341EA999A26A9AAA9E834593" + }, + "fixedInfoPartyV": { + "partyId": "1282446B97E493CB323A8C3AB4251051", + "ephemeralData": "5FB5898C0E48A6E7C10C0F0E579BA09AF0D862B4C0C84EEF7D26A34624DE" + } + }, + { + "tcId": 839, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2422498BC9227722E2CF1FDA71FFE971", + "z": "A3828E8824C32B33362331C9CFC9F0E3AE2FA41E4B819EDE905F8D59D381", + "l": 1024, + "algorithmId": "6CF7A8F4E75DA3503E6CA406AA07924A" + }, + "fixedInfoPartyU": { + "partyId": "2B018EEF600AE00C694E2065388006B3" + }, + "fixedInfoPartyV": { + "partyId": "1C50083BCA2EA04A01F080BBFF319373" + } + }, + { + "tcId": 840, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0B4600B621C5B71B21AE95D3E03262D", + "z": "39BEA70D9B6976C5E1A1251CA973D16CDF8753C06BFE3C181D015D63D8BE", + "l": 1024, + "algorithmId": "30943218B097DA303F9CDA027E4E8460" + }, + "fixedInfoPartyU": { + "partyId": "C729F140C60E0F2F37CF3FF1A625D033", + "ephemeralData": "A1DB170D7A3C022CEDE02DF037C47D711066F3EC13DC4E8E4361EF4AEF91" + }, + "fixedInfoPartyV": { + "partyId": "43E22C1458968CD24A74B77B6FA14DD3" + } + }, + { + "tcId": 841, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1733406A2FAF3D1676CEA800DC37CED", + "z": "78136DCE8C6F49C393FEA0EE812FAE25DDCD52D5DAC1DF18578E32525F5F", + "l": 1024, + "algorithmId": "739352E8D428BE0BD41A0E61A0F3DC34" + }, + "fixedInfoPartyU": { + "partyId": "1A15A64BE36495E560FF8874664BD6CD", + "ephemeralData": "471A3B599CCFAE9C686607FE0C49CCAA8802C2099CCCC3D24585724CCEF3" + }, + "fixedInfoPartyV": { + "partyId": "9EF6ECA8A378904805C69FDBF255341D" + } + }, + { + "tcId": 842, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2884A5B24A5A178BD828C60B4F683CB5", + "z": "8291BC453093AD18A4AC1FCDCAEF1159B87279BF3088F4904E73E8DD9F1E", + "l": 1024, + "algorithmId": "6DD363235AAC9D635DCDEBD3D008BB73" + }, + "fixedInfoPartyU": { + "partyId": "AE06DAC773AB66F9EA86843C8319BDAB", + "ephemeralData": "DD387366D1058AD47BEE6001850662D30943552F86797B64D7E75A48BDD3" + }, + "fixedInfoPartyV": { + "partyId": "9556FDC207B4E5C32749FE71CAE4A73E" + } + }, + { + "tcId": 843, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0ED0FC3ADE516E16665769441A1484D", + "z": "5A9EC5F763B954CD693314551ED2CB7C0E943468DA91C50AA536E42C9EFF", + "l": 1024, + "algorithmId": "3D66A4F8BA61B78BC50783DBD9CA1FCB" + }, + "fixedInfoPartyU": { + "partyId": "310EB9B0DC3DA80681785ABAB1C97B02" + }, + "fixedInfoPartyV": { + "partyId": "2645ADD32AD8D0967CD8BAA4DB1A9AD3" + } + }, + { + "tcId": 844, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9CC64770AE299D8E89FA5C9BADD2318", + "z": "12F97FAE8F2E3465D71DD1682D46DCFEF439847B422453CE43300D100E6D", + "l": 1024, + "algorithmId": "90A8DEA93B2EEF4CC91CDC198678CED9" + }, + "fixedInfoPartyU": { + "partyId": "1A2987958954D45F9ACE9ACD4523E752", + "ephemeralData": "42937C93CDAB0E6327F36194F012594E95A1DEDBA995CCFBFC4AC4069AE3" + }, + "fixedInfoPartyV": { + "partyId": "BCF2F1387927EB084EF3E4CBDF140BDE" + } + }, + { + "tcId": 845, + "kdfParameter": { + "kdfType": "oneStep", + "t": "790CE24B1A76FAAB9837464D88A3A591", + "z": "B98902B74126D03954F096CD81D728C67A95BD260A56BBE6E9A7DB405D52", + "l": 1024, + "algorithmId": "7F82E3CEF70D60003AD300FD63D95D16" + }, + "fixedInfoPartyU": { + "partyId": "7A1F4232E8BEA8D7A6A271A594541DEF" + }, + "fixedInfoPartyV": { + "partyId": "31E43266B57024FD887615C9424E3430", + "ephemeralData": "71F1324CA70BDE0726763BCE863EACB0F62208D725A9308555D50169081A" + } + }, + { + "tcId": 846, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAFACF0FA1A5DA284236162A81303823", + "z": "9EE987A5CDEE8DEBB5CFD82ED4FAA7918E7BBB1617BDB0A068C7979091C2", + "l": 1024, + "algorithmId": "BDDCFA7BD998B403FE408F61CE0F24A3" + }, + "fixedInfoPartyU": { + "partyId": "7B0012C47F97BAF64569EA16ADB933EF", + "ephemeralData": "F14F4073DEB53DA777CD01E2281EC619C3FAA903A50C1B22A13BA7FE489A" + }, + "fixedInfoPartyV": { + "partyId": "9C65440A919792B3F7EB3F0B05738CD9", + "ephemeralData": "6D3B6A507427DBDAB8F53576CC1BCCE22D5DF1C0A122F9791DEAA5B97EF7" + } + }, + { + "tcId": 847, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86E0AD62370A80A58EAE78DDC2B9DB69", + "z": "612D63A7B27B40F9A7EC98F889899ECC2A7101E481446ED1D071A5FB427F", + "l": 1024, + "algorithmId": "CA6058E288AD0A3F139938E44C402AB8" + }, + "fixedInfoPartyU": { + "partyId": "AC935C7E4B0A9958BB5DA008262992B1" + }, + "fixedInfoPartyV": { + "partyId": "406D29BF29BB48D89948B4D8AE6CB37A" + } + }, + { + "tcId": 848, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E190A0396C247FB232B8B5FA37D31E4", + "z": "6F29F5899CC06586D66EDA1EF9ECD295C080900AE96D10D5150D42BA33CE", + "l": 1024, + "algorithmId": "736C5854119183F3C506EB3D84C0EBF0" + }, + "fixedInfoPartyU": { + "partyId": "9B8076366D5BCF65299D21437369E8C2" + }, + "fixedInfoPartyV": { + "partyId": "E7E08B708255ACF8AF3EEB0AA9F0B13A", + "ephemeralData": "F4A747754BC32BFCB7C538434FFA24E410A0017F4F93C334737C0D272127" + } + }, + { + "tcId": 849, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CC98BE326AA6A01899AE777E85994E5", + "z": "12A79CA256D82F9FD265E8B122A1DF970D684407D5133FDC57F2D29D031D", + "l": 1024, + "algorithmId": "5823E1B9CB9E2FBD27385206A3DF7216" + }, + "fixedInfoPartyU": { + "partyId": "55E0A2D519B88D655043B5AD62663243" + }, + "fixedInfoPartyV": { + "partyId": "973FB59CFA6E644BD6E1D9C185CBD2F3", + "ephemeralData": "C956D550628C8459818CDCC9AE35834EFDFD4B2F24BC509BE15F06DED491" + } + }, + { + "tcId": 850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7AA75BDB6185F64651A71E759EADAA90", + "z": "196DD729508211A13489E75CDC91AC979828C5AAF28AB3D6AAF412F53D5C", + "l": 1024, + "algorithmId": "5E362C734378BD04137AF2CD6FA22A2F" + }, + "fixedInfoPartyU": { + "partyId": "E2748314F9D4E56A243635E6FE15A838" + }, + "fixedInfoPartyV": { + "partyId": "46FE81A38FE49C27F0C0FFFFCFD85EAE", + "ephemeralData": "C6945199BF0E55A9394995797B27A09C1D20901276716D7662B12AB001B9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 35, + "testType": "AFT", + "tests": [ + { + "tcId": 851, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53082DF58A01F426F516AB2809C02EDA", + "z": "15346DC1C4CA48E8721ECD8A3F17066472EF2A3D9B99CD8D50FDAF383F", + "l": 1024, + "algorithmId": "809EF01F12C8DE5B0111162894B7DA76" + }, + "fixedInfoPartyU": { + "partyId": "80EB6D26604C30A141E6D275D62D0B86" + }, + "fixedInfoPartyV": { + "partyId": "99208F39E4EF57E0EA606B4BE9EDC283" + } + }, + { + "tcId": 852, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2708A38335875D27E2636403597B431D", + "z": "C2910DB0E35F436991BCC51318CA932F73EF76812EBA63AD821CDB459E", + "l": 1024, + "algorithmId": "0CDC2529220FC38505AE4AEE359246C3" + }, + "fixedInfoPartyU": { + "partyId": "ED812BC0E07089BF49E484E7BAE18178", + "ephemeralData": "DC558A5880AEAA8C349400B5F8D19FD2397C0135954BDD6F1DBCC9F86E" + }, + "fixedInfoPartyV": { + "partyId": "E34F516F04115B06C714416F71C13DD1", + "ephemeralData": "8FEE5AF2098A91CA0A3FF7C46F87E5C43B1B4DE23F588175C80ED1B686" + } + }, + { + "tcId": 853, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38A114C60C2E23CEC646D926FBC8BB08", + "z": "BE94ED4FA64F26B3430CB4FC1E1F7FA2C98DC99686B04F962BA02E0BE2", + "l": 1024, + "algorithmId": "A210A72DF686C3AA4780ECB8BB16EC28" + }, + "fixedInfoPartyU": { + "partyId": "0F8F75176B72766F7922144D21968074" + }, + "fixedInfoPartyV": { + "partyId": "BBA9DCFADEE42EF5955FC9ED0FA42CFD" + } + }, + { + "tcId": 854, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F71F6FE622346C2E3B810D16C7CDB787", + "z": "50D86AB66D3797BC66E3CB7255AF0BE825EED9BD093453D6D598061696", + "l": 1024, + "algorithmId": "896B407EC88C4543FB5C854598F1EE44" + }, + "fixedInfoPartyU": { + "partyId": "3359BE9963B1B3D23967319525D31539" + }, + "fixedInfoPartyV": { + "partyId": "7B6C1F2ACF7EDA913CA473CD84614515", + "ephemeralData": "6AE95704E82EA26BCC7724A0DB033EFECC7F1ABF8276A3B690C906A7D0" + } + }, + { + "tcId": 855, + "kdfParameter": { + "kdfType": "oneStep", + "t": "177A1724034140A5F580F9D1437F039A", + "z": "9E2521132072215D714B2F8CAE9226C597B4374B178D1D639EB734B3FC", + "l": 1024, + "algorithmId": "03A042B34F71F50EC48EE065C709A06B" + }, + "fixedInfoPartyU": { + "partyId": "C1852BF1E63765E90E0052597AF69F8B" + }, + "fixedInfoPartyV": { + "partyId": "F7418A97C1929FA52FE89854AF1AE05E", + "ephemeralData": "4D6DB2B34B0E0737EE0B41B554B19B328064F726C48326733D3940AB8C" + } + }, + { + "tcId": 856, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BD5D07258D05CAF058BFFEBEDFEB41E", + "z": "1C950C7A54BC212E0174AF283FB960F2425E3A61A0A9F486884AEE8572", + "l": 1024, + "algorithmId": "90AA7B1CE89F098275FFECF2BC7FDFBC" + }, + "fixedInfoPartyU": { + "partyId": "C58A4C55C09707608D97750333B203A6" + }, + "fixedInfoPartyV": { + "partyId": "5E790EF53163439A61204A1916FCBDC2", + "ephemeralData": "5C333169D292B88D06994FB727F797E1ACB41820DE2CC87C3F2B885EF9" + } + }, + { + "tcId": 857, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53D82FD69D9578CB043FA0264B75D3AD", + "z": "D133791960D3AAC29A35A3C5E6D5587BE68081A500AA7259E49F10CE9E", + "l": 1024, + "algorithmId": "7AF313FDF88C0287234A67AB451E9F74" + }, + "fixedInfoPartyU": { + "partyId": "1E804BCB60539654032E5A382A574CAD" + }, + "fixedInfoPartyV": { + "partyId": "3FDFCA3E3C24DBB9A28C10B7C01F501E" + } + }, + { + "tcId": 858, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D036A740B9B255B1FE93EDC1763894A7", + "z": "0A72FA14B80436B9E8E047B4E05B19292BDBB9D3ED1990B88A391524F9", + "l": 1024, + "algorithmId": "4D004FD36A9FE86E2332BCC7AC134CF1" + }, + "fixedInfoPartyU": { + "partyId": "33EE891F04EEC3C739AE70CFB2C6E278" + }, + "fixedInfoPartyV": { + "partyId": "1EBE758011EE40E7565F8CD9573C88D3", + "ephemeralData": "28BF30E75B66569FB235724000D0482FC9DC59F118216AB85B29F3F174" + } + }, + { + "tcId": 859, + "kdfParameter": { + "kdfType": "oneStep", + "t": "151F2ED4920285EF15845456B2C0AA10", + "z": "B6DF56FEF67461213820919CF4BE26153B3A06FC0EEF504C630194EDFC", + "l": 1024, + "algorithmId": "FE863165C52D4E4BF240B86546137BC9" + }, + "fixedInfoPartyU": { + "partyId": "4D59A4D05AC39B849D78C9172E1D1EAD", + "ephemeralData": "C6CD017021AE4C240CE9DE613970F6650B1F8BDADDFE9D379E435FDAD9" + }, + "fixedInfoPartyV": { + "partyId": "ECEE3A3080E60F72807C24AD27077D67", + "ephemeralData": "69F851C6F079405DF8835C7537CF362D21B18DB53D637B4397E9CD3679" + } + }, + { + "tcId": 860, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E33DFDFFD86ADA54522362DBB17B939", + "z": "E433E897908D8B6C879C143B4F9B5D4D5860ADB1BB7704587203A1BBA4", + "l": 1024, + "algorithmId": "5D27F25F57E5D0722A966AE08EDDB3C4" + }, + "fixedInfoPartyU": { + "partyId": "897C009FB4E1EB2350A3B3579D924A99", + "ephemeralData": "E7334F2B4ABA9900C31A662193D06FDA721330370796CBA4AEEB5058ED" + }, + "fixedInfoPartyV": { + "partyId": "727B5006C7A5EAF9E390AACE040F6BE7" + } + }, + { + "tcId": 861, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D657E17167A928476D66FA3201EDA4E", + "z": "CC928FEA5D7935EE5BF0B4EC852B61EF477DCA87DFDE50AB63CDC1C3BB", + "l": 1024, + "algorithmId": "9B9336A7AD76259702AE4624146134E9" + }, + "fixedInfoPartyU": { + "partyId": "A51B404089A337C675E4F208BF19EB97", + "ephemeralData": "6611B4BFB67DFC3EBDB09B4811BE1B796F478DCC1275C92A914E30952F" + }, + "fixedInfoPartyV": { + "partyId": "5625F64A4FC1057E61FABB04D419AD1B" + } + }, + { + "tcId": 862, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1CFC54EF419AA61CF908552607B9EA99", + "z": "9DB01035166A2B79E9C8BE5D8769DF9164F7419438BEB424FB99BA6C16", + "l": 1024, + "algorithmId": "BF88BD81D1E9EFCEA0FA37562C2E1FC0" + }, + "fixedInfoPartyU": { + "partyId": "1491CFFB3674C3EF0314BACDF27AB0B8", + "ephemeralData": "9249999866CAD69704C6E480210414C6824F419D32349591B930C68B94" + }, + "fixedInfoPartyV": { + "partyId": "D31D9ABEE41EFE6CE985A005569AAAEE", + "ephemeralData": "E1C581B41A8E257CF9A6F244A24BF821CAFCB4FC0C4DAD4EDA3160FD6D" + } + }, + { + "tcId": 863, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A12749060835AD4284F4E2D8FC65F2B", + "z": "43FE32A2B0960BCBE8B920322FE717878EDE1C7E6C69A94F1727FA4019", + "l": 1024, + "algorithmId": "86B84352D37192DAE837C65907CA00E5" + }, + "fixedInfoPartyU": { + "partyId": "32AF235CB5DC6E914912B917806558D7", + "ephemeralData": "0444C39E9E05CE775DB7259526AB1C757663344E7158535E309B434D99" + }, + "fixedInfoPartyV": { + "partyId": "DD6AA52811FAA6A7BBE5093F645CA78B", + "ephemeralData": "A52BEE7FEF376C37FFD8A6E6540E9B92FD3D7F21137B898E360ABFF91A" + } + }, + { + "tcId": 864, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3950E0C814D07CD342CDE4A598905D56", + "z": "A17347DE1429DE3A81B2DBC32C6A902494E50106FE1711986383139683", + "l": 1024, + "algorithmId": "D51B8704AD7DBFDF756D71EF1B21E10E" + }, + "fixedInfoPartyU": { + "partyId": "E29F9A794BBD7197746D29436EFFAD59", + "ephemeralData": "661D5195F523FA51770259A5769E50856FE9B849B89E0505E766EBAFAD" + }, + "fixedInfoPartyV": { + "partyId": "B5E08ACFFAA7713A8798302C463FA007", + "ephemeralData": "08B2333B17B85543A278A9B138E7B35270C8B45C70E045F503AD6CEC27" + } + }, + { + "tcId": 865, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2309E009279924F3D53898465CB244EA", + "z": "E072F07A529F8F5B9D3A0BF35F30CD1D9A11C946B6CDAE35F677C01071", + "l": 1024, + "algorithmId": "20401E0DE4E54FDEC7397A96E3508A38" + }, + "fixedInfoPartyU": { + "partyId": "CF00A6E595B429C85DFD72C145FEBE12", + "ephemeralData": "A456C997D2D0AAD9CBCB88A4EC3C457C2521811686CFD515C76956D63B" + }, + "fixedInfoPartyV": { + "partyId": "7C5C3B7629A84A771C193F2BCF8EB5B8" + } + }, + { + "tcId": 866, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB33A465D8DD040FF7124C477A8ADA2E", + "z": "F651035F6FAF70741E506DCF1FE3D37326B5F43974DAF56E1EA41233A9", + "l": 1024, + "algorithmId": "8FD8DCC9600F1E646E63D355135682FC" + }, + "fixedInfoPartyU": { + "partyId": "570D06B0E4BF7134C995B713EBC0088B" + }, + "fixedInfoPartyV": { + "partyId": "A46BBE3462C234DDE23696B8F9309CD1", + "ephemeralData": "66D28236098972D3FC20678E1358636E6E6BAE5EEB193EBB13CA3430E8" + } + }, + { + "tcId": 867, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C3B430572C8813A23D420054F79EC79", + "z": "0476FFD417569217F8D4112E43ED07E998B5856E0FCF09C80986F1B480", + "l": 1024, + "algorithmId": "DF8928BA255EAC2FE4CCCDF83AF8EB76" + }, + "fixedInfoPartyU": { + "partyId": "9A963FAAE2B0D5023705A45271ECDE5A" + }, + "fixedInfoPartyV": { + "partyId": "93C8356F9B2269136632D72EDA7A508B" + } + }, + { + "tcId": 868, + "kdfParameter": { + "kdfType": "oneStep", + "t": "811EC526F0A32954B1FBC5E61D0390E6", + "z": "2876FE3E8B26C85025E92DE442A65764BC5887B6185C33F33FB33E97DF", + "l": 1024, + "algorithmId": "D766544B60DC3584B420CCA052EF86EB" + }, + "fixedInfoPartyU": { + "partyId": "3D3004A65CF398B316B4805A16BE8E2F", + "ephemeralData": "8C3A4B8F90A2E46141C927E834BCF4012717CF8F5C359841ADFCD2EFF5" + }, + "fixedInfoPartyV": { + "partyId": "E4F1FEE1264C812CA40E48E7E8974B7F" + } + }, + { + "tcId": 869, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0ECF01F523A8743CCD5BE151E02E2FF9", + "z": "BE4436064A958995C9E22677E97417F54FFFD0F8D7759C0BE5DF3F8C4C", + "l": 1024, + "algorithmId": "DDEB94187B5B1502A63A66B972D4A676" + }, + "fixedInfoPartyU": { + "partyId": "105908B992EDF80C558B2F4C4501B117" + }, + "fixedInfoPartyV": { + "partyId": "58D5DE95AA03B645EDDB7E39335C467D" + } + }, + { + "tcId": 870, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C40D5EC8981F7A338D040B66167974E9", + "z": "899363336D71FE765AD12BB7B0898D5779331D8B5C4B2BE453C644E165", + "l": 1024, + "algorithmId": "63DFC2DF01018C20535FA90E96C1727D" + }, + "fixedInfoPartyU": { + "partyId": "EEDBB92E480410197DFE9C3D7EC28AC7", + "ephemeralData": "8927A7960C8EBA3BB45B0195C197811F58D3E2EE693B3210E896EDDC14" + }, + "fixedInfoPartyV": { + "partyId": "1BADD4438F79DFF3A6861F9C8222BD2C", + "ephemeralData": "CB87B6CEF1FA00BB51BF313CB10B68518A5E21D91C93DA246CB082F0C1" + } + }, + { + "tcId": 871, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A851A2794BD5847010EA4FE0E19E9E5", + "z": "865B8D0607B4402EA61AE29707CA1AD6D75B6CDF942924BA4EEBFEEE5D", + "l": 1024, + "algorithmId": "F34F5E88D0E6E478A56343B3D4081558" + }, + "fixedInfoPartyU": { + "partyId": "381F7AF0C52AA563609A734C5E5E7ECF" + }, + "fixedInfoPartyV": { + "partyId": "C92D47E449AE2FF46B378F8DF33D702A", + "ephemeralData": "16EC4357F226EF42931D1CDC547B21B3B554B8F2A36A80638AFC0D60C4" + } + }, + { + "tcId": 872, + "kdfParameter": { + "kdfType": "oneStep", + "t": "95BE35B7183E976C9D0E47ECF1A872C8", + "z": "85113DCA2F174C2A652C9C93721C0896B303FDE74201E15E937E4FEFA5", + "l": 1024, + "algorithmId": "A67C4DC14986966410B4C3A9A9673D5F" + }, + "fixedInfoPartyU": { + "partyId": "4904AFA7916A12FDFDD1A3F1D72E589C", + "ephemeralData": "9B3180751E37F3C22BCF8FA57CCF21C94F38A27B2F929924A5228ED5E9" + }, + "fixedInfoPartyV": { + "partyId": "2F28C1459533F6628368E023CD487ABE", + "ephemeralData": "395BAF194CB8E82B6A5A0071F667A3300357E227E07A75092BC14849AE" + } + }, + { + "tcId": 873, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F95B5A335C2C6C88FA79201B50A639F", + "z": "AA9125F5D627C78062EB6C1B855FC6D77AF32209D05CA714C0D19DD296", + "l": 1024, + "algorithmId": "602DE3004B51E90AD0316C57ED847EB9" + }, + "fixedInfoPartyU": { + "partyId": "6FF7E4AEBB8A9F5C462DB4C254552DFC" + }, + "fixedInfoPartyV": { + "partyId": "16EECBFA750B162DAA4988AF62FFF015", + "ephemeralData": "D0229E95A90CA44C479135DF21B7CF9CB32FE17B29199823B79FCDDCD4" + } + }, + { + "tcId": 874, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AF90B9CFA696FEBB4FC24E575BCFA6F0", + "z": "E06752772A2C78C609FA8CD4AF2A8E88965FDF306C9B010CE9CDDA2E78", + "l": 1024, + "algorithmId": "A70882C731FE9A69595977650DC6ED7B" + }, + "fixedInfoPartyU": { + "partyId": "6F27EF34A4E4BD3AA899B84E09B089B3", + "ephemeralData": "56A8167581F4CF48562FA7B8BA99B972A2ADB5B2A6952CFBF66C6F33B8" + }, + "fixedInfoPartyV": { + "partyId": "E306A873838DBD74F71FBEC7BD51D6D5", + "ephemeralData": "AB19FB45A29AB4DAF064DBD13F84E581EA7B63700C408036790A2A4B97" + } + }, + { + "tcId": 875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAF7BDC127FF791BA3D15346F6238BEC", + "z": "D8A4B01FAB13F9C9B24409B2FBC1375EA1823D40499BEC1B982D3FA7ED", + "l": 1024, + "algorithmId": "81FB4C818DB440D9ABECD71ECCC27C67" + }, + "fixedInfoPartyU": { + "partyId": "1606AD889ED1E9CD0DD9A0E9481CE9C4", + "ephemeralData": "A538C92EB45DBDB839215784C2486A78822BAD2418B3B30F2B3D42BD01" + }, + "fixedInfoPartyV": { + "partyId": "2C7CD19468D9989A61F21D5CFDF31B29" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 36, + "testType": "AFT", + "tests": [ + { + "tcId": 876, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B471EB597A39586566247515C36F1E8A", + "z": "0F6EFCAADDB27818EF284E10808ECD701A524EE01776227D78B17F86158E", + "l": 1024, + "algorithmId": "74269DDE751D824C4B89A8550F44D7EE" + }, + "fixedInfoPartyU": { + "partyId": "D595FE4C4CA012C3A717C8E7681061F2", + "ephemeralData": "A2DCADFEBDE6B5A832E93E7F2467B480CDD3CC0DFC9E8B23DAD8EB6CE74B" + }, + "fixedInfoPartyV": { + "partyId": "DB09CB48DDED861A2301145FCADCE31A", + "ephemeralData": "EA0C50F80A44B26C6E09EF2AE2FCAF75DC1B05B73F18299716D9E5971F44" + } + }, + { + "tcId": 877, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5042C2067BEAD56B670010E04AC384D", + "z": "32D5F5CB992E52B59BC01FF3F43F85DF6DD69E3845EE17451D9F88496728", + "l": 1024, + "algorithmId": "86ACDAF0E27EB33B259994A2214F9E54" + }, + "fixedInfoPartyU": { + "partyId": "D1C8C91594F330E6249188BAB8AE0E05" + }, + "fixedInfoPartyV": { + "partyId": "414F520559F7B28C04E5382B2838CDE8" + } + }, + { + "tcId": 878, + "kdfParameter": { + "kdfType": "oneStep", + "t": "162C5C0556A82421A3A229143946DC29", + "z": "4060E62061A9CE40FA789EDD8C4D85485E48325FDA046FA0C86F5AC6BA6F", + "l": 1024, + "algorithmId": "C864F6CA9B639848EB96080B42054CF8" + }, + "fixedInfoPartyU": { + "partyId": "70CA3A35D73B61580A300F2B4D6CECE6", + "ephemeralData": "C5A1637B3443543932FAC572F4C30FB9A70DB0F77A749D8D7F780823DCC2" + }, + "fixedInfoPartyV": { + "partyId": "593895B7AFDF6C6D373C0A5E06390406", + "ephemeralData": "7A4AE606868CD2AF490676F373AEFC2A0344C4CEA29060AA574571C781B9" + } + }, + { + "tcId": 879, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEF22AEBFDC93AF68465EAC7913BCA7B", + "z": "AF069A7A3B378C57F0DB8D099FF17F30307AED18A75DEA52D47953586003", + "l": 1024, + "algorithmId": "240FE37277DFA5822BADCFD470BF9D77" + }, + "fixedInfoPartyU": { + "partyId": "78D21F345177A6AABC8B127300B3583F", + "ephemeralData": "BB8A1562F435F41DBC793AC067AEE4B85A3D1BCC08130264214C0C4A0AC5" + }, + "fixedInfoPartyV": { + "partyId": "A0BF0960FD4E36F3A3BC8FB432BEBA38" + } + }, + { + "tcId": 880, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD390D6422CC3EF77972EF530A746095", + "z": "2A4CF199672D7E9A16428CB1F7581CE893A6577D43B7AF251BCD8BDD3429", + "l": 1024, + "algorithmId": "5BF34EB9B94916EFFD4C183090E19F6E" + }, + "fixedInfoPartyU": { + "partyId": "1B720F53C53A798E6770848F8CDCE198" + }, + "fixedInfoPartyV": { + "partyId": "633382655E5F99137AAD5C6DCAB05563", + "ephemeralData": "290811EB7B112F852A609C9B3595110C8AC37D513768F1AB63041A7A9CAB" + } + }, + { + "tcId": 881, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1626DC5D564340AA7C9F2A4035F6FE2", + "z": "27ABCAA48D41575BBB15BC7A5C9A0E2C7D06BD0D542FA45E0FC06EEEF18F", + "l": 1024, + "algorithmId": "345B5B575902006EE7FC0FFEAE350A4A" + }, + "fixedInfoPartyU": { + "partyId": "0BE450D4BB11D373EC6D65C9109E0022", + "ephemeralData": "E75AAAA6E8ADA1C7B3F61F0C3208F8946B322C9696D3DCA6F3693B55078C" + }, + "fixedInfoPartyV": { + "partyId": "C0D6CFF634F70DB8EC55C217EC35720B" + } + }, + { + "tcId": 882, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E417FAA2B174D64BC1A7C5054DFDBB22", + "z": "20784AB2C959AEA315DDBC250DE55D6002DA158B7CC8AFED7CEDA4A48537", + "l": 1024, + "algorithmId": "8171DC430622E90CA9D1ED21FD8A0074" + }, + "fixedInfoPartyU": { + "partyId": "923989854ECDA594CC37BECF3ED21107" + }, + "fixedInfoPartyV": { + "partyId": "37A3CA234BF6E122065AD494CB167648", + "ephemeralData": "708141DCAC37773C725461D369E3C6751A8F8FEF80791825A1339C427A75" + } + }, + { + "tcId": 883, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDA9FD3BD6EE570AA34CE0C9E39DC039", + "z": "713C4537C5DB03610CF0A207E73F73B076893BF0FEA19410D2DDB2F3B38C", + "l": 1024, + "algorithmId": "4BC30642756FE73876482A9C416927E4" + }, + "fixedInfoPartyU": { + "partyId": "10F0CA4109B0676E11128EE8723E3A3B", + "ephemeralData": "CBE6F2A0792E60218E17FDB5C33058CB9A17D6EF51800D06F553977AA793" + }, + "fixedInfoPartyV": { + "partyId": "3A223C68643745E8D9C19EA4ACCA1397" + } + }, + { + "tcId": 884, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0CA46075157967ADA086C328B8CE291", + "z": "483EBC4170232781E033FF900DA6055322EDD2BE4D9DCBD184BB9463D207", + "l": 1024, + "algorithmId": "0A6B6BD7C0F8555DFB9A9652BC4B2C94" + }, + "fixedInfoPartyU": { + "partyId": "36AEE4EDC1100C4ED60705B8188A16F3", + "ephemeralData": "F272EE83BFCFFD4E69D447A759558C15424B703C5127ACCBB6F9AB524358" + }, + "fixedInfoPartyV": { + "partyId": "66CBB4916CBF60FA9DEC78E983ED789C", + "ephemeralData": "D86888475FB7A09C58C782C3B43439DC323ADB55F5EE18EE068B9834FBC9" + } + }, + { + "tcId": 885, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBDA4CE538537FBEC4032CEEB27F0EEA", + "z": "6443E62D30C3CDEAFD036FC43035B1B12538EBEA0506E7C3EF4D91BD736C", + "l": 1024, + "algorithmId": "B409BB29861174E9259C9766EBF5C6FA" + }, + "fixedInfoPartyU": { + "partyId": "1741E9AC974BFB6778FDB519259A9C40", + "ephemeralData": "506C23C9C9BDB3FB0B12514EC4A1A4DCC11CCEEF896FE76A88B403A2CE98" + }, + "fixedInfoPartyV": { + "partyId": "A90E2CAA3E2F148C61A01894A4AB8C00" + } + }, + { + "tcId": 886, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B5C41CFC31A898574AFFFBA66F33FA5", + "z": "53678A063E1968817DAAB265DED7F5177344EF6EECCE49F0D64EF4A1DE70", + "l": 1024, + "algorithmId": "5425727CB8DA00A6C41782138CB2C967" + }, + "fixedInfoPartyU": { + "partyId": "BF90CD98A94FCF0530D19E483EA465F4", + "ephemeralData": "E5016296D8A623792B054B08F87AE266CF10DA385CF3F1AADBF1EC257212" + }, + "fixedInfoPartyV": { + "partyId": "569941554DFA8903664217F40E5AD7B4", + "ephemeralData": "D6B8507EF5139F4EDB018060A80EF04745184602F8E62A7488D51DC7E8FF" + } + }, + { + "tcId": 887, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE9DDB08C3A084ACF3EE46F0271F9049", + "z": "AB55863ECE05AEEA2ACB08484FF83E411D45DA8A5051A53A285C0C1B31EF", + "l": 1024, + "algorithmId": "90C540FFBF3C2A1D5E6FF50BEAC1F3F5" + }, + "fixedInfoPartyU": { + "partyId": "13BC9FD679562033B825CECF5E8C4255", + "ephemeralData": "5452B2271B4019734DE74D48FAA650B3EA8E066C47C4129592B9CA61428E" + }, + "fixedInfoPartyV": { + "partyId": "B1B8860B4BF7AF9CE0F443AF20F1F24A", + "ephemeralData": "429B56985EC55C6F3B6D1579FC70C0E26A9D8A47CF41C6C574A42F29A236" + } + }, + { + "tcId": 888, + "kdfParameter": { + "kdfType": "oneStep", + "t": "046EE031609380A5BF6186927D9E413C", + "z": "DC7C20AD8DE18390B8D4254A23DC512D7D25E48E083B0FEF666E0BDFD971", + "l": 1024, + "algorithmId": "CBD91973C90E22A1123D0FA0524C4309" + }, + "fixedInfoPartyU": { + "partyId": "7CF889418E51D65DCE399A5809B4C1E0", + "ephemeralData": "7646D373C60D1792251B30CD285E93CFB9E0295B49B82F48960D84415328" + }, + "fixedInfoPartyV": { + "partyId": "A5DD519FDA6B2AD2583BCC84F3648A06" + } + }, + { + "tcId": 889, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FEAD05B6197AB8D54F346888E39630A", + "z": "873EAE71DF600C04A625789B9176572585D90505D3A3665543411EB197A2", + "l": 1024, + "algorithmId": "FD12A83779BE83A034E8D559FF335353" + }, + "fixedInfoPartyU": { + "partyId": "EE41B4EBD30DC7BBF4F6A0D74F99D0D8" + }, + "fixedInfoPartyV": { + "partyId": "28A7D161BDA493FB4A7134C9EA408508", + "ephemeralData": "5936510DDB05279C0E9DFE28696571CB4FBB516AD4D5826185AE8A6B35FB" + } + }, + { + "tcId": 890, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6BB505C0EFFF88D5D4AADCE167B8F78", + "z": "E7BDFB9F135737984AB8DEEF98EF4B79B7B2753F8AAE464E0D4930B5EF25", + "l": 1024, + "algorithmId": "91806AE510543777C5F5BDF32C70A1E4" + }, + "fixedInfoPartyU": { + "partyId": "D46D436735416B4750B5F5EB8D7B2669", + "ephemeralData": "E3839C84519F9583CC24F91921C788536E36D87E57DA0EDD60C31EB47ED5" + }, + "fixedInfoPartyV": { + "partyId": "77379E107F9DC5A6C8097CCA6883C954" + } + }, + { + "tcId": 891, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E3EC4614465E024F45090A6AABAB967", + "z": "9A9B495C44E1520BB76BB0E173F34EC146037647BD63BB59F21B128E3D43", + "l": 1024, + "algorithmId": "17C4DA0F10F47EE66CDF0129803931E3" + }, + "fixedInfoPartyU": { + "partyId": "D949E847FF6075FBB24CD1CCC640220B" + }, + "fixedInfoPartyV": { + "partyId": "201096D6313B328BC38DE2ED50171EDD" + } + }, + { + "tcId": 892, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63BAE63DF743168908B0D7E60860C822", + "z": "79E8B1016428D730BC9C421551432964A4E431BBD691B529844B5CF76197", + "l": 1024, + "algorithmId": "5A537910370E281C5C712CC78B6DD9AF" + }, + "fixedInfoPartyU": { + "partyId": "7F1C1076AB9E9E0FF782AF9FAA6E361F" + }, + "fixedInfoPartyV": { + "partyId": "CC7882E7331F31DAC777D0EBB41AB1E5" + } + }, + { + "tcId": 893, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD404C881879619A6ED10D6248B02A31", + "z": "5D8D025E87EEAB1886E073E499F69BA3806E1B28F2E53E71C33C199DDD1D", + "l": 1024, + "algorithmId": "4F1459CC8FEE27756F750663F8F6BFB9" + }, + "fixedInfoPartyU": { + "partyId": "B5E56F6371B86D13FABBEF7111E629E6" + }, + "fixedInfoPartyV": { + "partyId": "B16E65B42BF2C496FDCD67EF21DDBD1A" + } + }, + { + "tcId": 894, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2D6D028E2096D06F2C26D88EB099F98", + "z": "0F8215F6AAA7AED5080B7BA94E0175D9E938D1BF7C5B236CCBDF9108850F", + "l": 1024, + "algorithmId": "3CCF816ACD80B178A4F28C82FC9D6A1C" + }, + "fixedInfoPartyU": { + "partyId": "F1AD0B90E632CC5C3D79E4BEBDDBA77B" + }, + "fixedInfoPartyV": { + "partyId": "A057D535EA59B006B65A27DAE194931C", + "ephemeralData": "27531F34B8068080A02DEE82D9F0B600C9782548DCF1C3FCF52B7AF61801" + } + }, + { + "tcId": 895, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E65BE5A7483769F7AF3089B6684E537", + "z": "6151524B59137CE533EFA923743EC1238EA7D7892D597B1A759A206948B5", + "l": 1024, + "algorithmId": "CA4ADBF3423A4303E8D5D4C9EAD40784" + }, + "fixedInfoPartyU": { + "partyId": "1C7E6E0D09CBC2302972AB8CCCDE458E", + "ephemeralData": "25E6DD6044144F7801DBF9449EF72AC729400CED62827EBC9BE536C15211" + }, + "fixedInfoPartyV": { + "partyId": "1C85490A4D21A9A82B8F003986F7FD77", + "ephemeralData": "F78DD79AF5CB9AC7F0BA15F0EB5C98DE3AA12172DA0FF8223ACF15DE0498" + } + }, + { + "tcId": 896, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDF626594CB8140A5D1E63EDC617CD66", + "z": "F65245916EE4EA4C2C570A7AFF0A6E3A7EA31F83BFF19A533394B4C960A4", + "l": 1024, + "algorithmId": "81DCD3D17D397B74FE420B599CCB024E" + }, + "fixedInfoPartyU": { + "partyId": "FEE02ED47D7A33EC280A70D84C844EA4" + }, + "fixedInfoPartyV": { + "partyId": "470EA126CFDE147796EBAB5A4249D98B", + "ephemeralData": "C6592C5C61B698A349B4096B05B3E60A1E57D9904712E164C9A5579A341A" + } + }, + { + "tcId": 897, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C57772116938746F3B9328E9040ED85", + "z": "217E3F4058F197B54B62512906DF578AC864D190B86CF071936ACF2A8D47", + "l": 1024, + "algorithmId": "498C5FBDFE2AE671323712C6874CAACA" + }, + "fixedInfoPartyU": { + "partyId": "E7A2D624507CF1DFBC3530B6DD8EF911", + "ephemeralData": "2612D5372722225A12864296A74A71325311DD92D8FCEA054E1B363CFC7D" + }, + "fixedInfoPartyV": { + "partyId": "DFA357B9F389ABF6EA4242C2C90AF5DF", + "ephemeralData": "5992B9EBB1602EEF9048D39CF9D5D83016F3141AA16B08A50B2ED9DE499E" + } + }, + { + "tcId": 898, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BB9487442F2B90B5FF3ABBB965EF37C", + "z": "C4A3F500EE81ECB0247B5C05D7E0987435A2C1D3643E72859D046AF7A595", + "l": 1024, + "algorithmId": "66DB1B136734855C200696AE0B4D7598" + }, + "fixedInfoPartyU": { + "partyId": "32D85657EC6DDE6271236DD1A9CB14AB" + }, + "fixedInfoPartyV": { + "partyId": "CF909D16E80BF4700F5C429D615A44D5" + } + }, + { + "tcId": 899, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE6D69696F7A350005444B222ECA5CB3", + "z": "20BC2F03D67B1B684B90E8D901B562C892573FDDA23A78294ECB6680F132", + "l": 1024, + "algorithmId": "ABC337EF1E398A8DA190366504DCBF67" + }, + "fixedInfoPartyU": { + "partyId": "046E7FF3523264E05DB7FEEB8B1C2437" + }, + "fixedInfoPartyV": { + "partyId": "BBF94AF4EA6489E61D858F68BA186C6E" + } + }, + { + "tcId": 900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C0AD2175C169D72295E38A2FFB8F6DFF", + "z": "87CB8FBF8B3B415BB98D3520BFF0237F431B530DA9F695A32E92635EF9C2", + "l": 1024, + "algorithmId": "B31CB8A77926CAE806483566E2211ECB" + }, + "fixedInfoPartyU": { + "partyId": "907C8504F9C9D120B95AAEB6651DC691" + }, + "fixedInfoPartyV": { + "partyId": "CA146E07281D9E08337701B5D04557DE", + "ephemeralData": "18903C0FAE31A5C5DCB78637E010AAC4D5B5936B4F9F37C9D18CB5364717" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 37, + "testType": "AFT", + "tests": [ + { + "tcId": 901, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F987090442DDC2EA95B4F427BF32052", + "z": "94EDE25869DF36ED3C518791D0FE91291FE41A4DDB43D5773309A18EBC0075", + "l": 1024, + "algorithmId": "557F4215724EAE52243210349888913C" + }, + "fixedInfoPartyU": { + "partyId": "8F0D73FEA57CEC48B3F18614FCCE16E2" + }, + "fixedInfoPartyV": { + "partyId": "E894DBA0C157CEC423F706A092B304BC", + "ephemeralData": "10A8F299B750D8D60F42023ADD9B1F5028793DAC0BA5874AA0A30AE74B37F8" + } + }, + { + "tcId": 902, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04A0061F1755DB9C80FECD6BDBEC925F", + "z": "6BDF1700D3F5CEBE82A887B2EB6095802F21AC9A15E9C4CB1E8FCBA4432C75", + "l": 1024, + "algorithmId": "9D273EE063304ADC8BF76DDB6F76CC8C" + }, + "fixedInfoPartyU": { + "partyId": "D463B781162173CFD183FAB4EE2CAAD6", + "ephemeralData": "070091663E1C8F12857A327FF03F7DE4B31EBCD5D584A9CC7DEE1ABE81D5AB" + }, + "fixedInfoPartyV": { + "partyId": "12FBAD750A21AFBBBBAC5E415458216B", + "ephemeralData": "64107011D03483D18672C963B46A7DA93B16AFFD2F6F4F314854727804326D" + } + }, + { + "tcId": 903, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BD28EE5344D52294990339E13EC973C", + "z": "D063F0BE2C47E0FB157DB3F7F7E7AE6D0AC1898CFBBB1BB1F6BB4DE3A2F47B", + "l": 1024, + "algorithmId": "C5AEC33C1A662EE1B6973E115690712F" + }, + "fixedInfoPartyU": { + "partyId": "BF0337E2F83BA18178CB20489E2B5C52" + }, + "fixedInfoPartyV": { + "partyId": "B8C0378E0502A6DEFD87DA97FD85DF47" + } + }, + { + "tcId": 904, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB4E9B8990CBC3ECDDFA67FFD3914F98", + "z": "57BD0523EFD46915A0B76692D8EEA0513F1E2873F33D617B0DF4989D86EA73", + "l": 1024, + "algorithmId": "D9FE2C74D46480B5E04DD0E7DBB1647D" + }, + "fixedInfoPartyU": { + "partyId": "B48674C1721542A34161A68A60A8321A", + "ephemeralData": "A1DF45515034AD3EABB5BD8041D8E6A476E904C3337049BB55BBC39AF07A84" + }, + "fixedInfoPartyV": { + "partyId": "9E7D2D3540A5537657BDCC8B9F211FE3", + "ephemeralData": "117574182CCA8128D7EB49E3A350CF6975036B8EECB1CECF0F34459BDBCD9E" + } + }, + { + "tcId": 905, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2F4136F9031ADC0C408B2A893F384AA", + "z": "AA837B88F57F9F3A94B44AF8E50788AA451D9AE8B92950F73917D2AFA6C90A", + "l": 1024, + "algorithmId": "B5053FDA90C44B901A13AD35B543A7EC" + }, + "fixedInfoPartyU": { + "partyId": "2A1FF87F42FB4A92E35599118511577D" + }, + "fixedInfoPartyV": { + "partyId": "CD7BB12253106B355668FB2D68088768" + } + }, + { + "tcId": 906, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B477B1A1C19A98D03F436058CA0104B7", + "z": "391CFDBC60C8C6723CD66D901985C59F6721D61D2BFF5501FD4763F9E47BE6", + "l": 1024, + "algorithmId": "EEB5AC2371B2D4D9DBDD9754310709D3" + }, + "fixedInfoPartyU": { + "partyId": "6926355874FF076F8ABCC7A88AFE5C28" + }, + "fixedInfoPartyV": { + "partyId": "380341E69A32713E1046E7971CFCFB31", + "ephemeralData": "C588F08955697AB775901D20018AB25FA03DE3616D89AAFA09D7BE97D8C003" + } + }, + { + "tcId": 907, + "kdfParameter": { + "kdfType": "oneStep", + "t": "581B5657869BAF917FBA4F135BEDE781", + "z": "4439209E574570D2ACA276EE66546B71C07A04548D1B3AA17D91A0E8E21341", + "l": 1024, + "algorithmId": "160312ECEC186F049BBFBC4DE8C52B22" + }, + "fixedInfoPartyU": { + "partyId": "7A66C2F8204B6AEF761A2FD9ABBF54AD", + "ephemeralData": "10B4822A8477DD5041E7CE45FFDFD70180DF3A5A770F679EE22CF0031B2AEE" + }, + "fixedInfoPartyV": { + "partyId": "B41CA21F720DDC27BD411EF6B03FCB0A" + } + }, + { + "tcId": 908, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2DA80F20A8C60E45FAB3F465454C76BB", + "z": "7C3C4F3A2DF6B2F160464DF11A92F2D13B0277D1F22C4B5A5ADDEA67F7F493", + "l": 1024, + "algorithmId": "E93D5B9E149CB4899DE5164973F065E5" + }, + "fixedInfoPartyU": { + "partyId": "82E10139F9F21CDEFED563AA816E0C7A" + }, + "fixedInfoPartyV": { + "partyId": "0E0A20AFF4B406934DE0B6F48EB5F4D3", + "ephemeralData": "FC2E0A215D16338D5585EE865A66EA73D1EF264C5AD53C931C6D918108C578" + } + }, + { + "tcId": 909, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED5DB9EFB474B5882C740CF35D62EE3D", + "z": "B1827C270621C8928C6C6A630CD80DFA4BBE4E6035B600CDD6B1D1BE50A5D2", + "l": 1024, + "algorithmId": "DF481CFCEDB26084A136F0DD8F4D3D9E" + }, + "fixedInfoPartyU": { + "partyId": "DD14D73C5D95188B0D8ACC561BC503CB", + "ephemeralData": "BA500FD54B80CB832EF4A3895C6A057D50AEABB0F5BE196582F9AC17A67969" + }, + "fixedInfoPartyV": { + "partyId": "E05C940E3DB642091E9ADC03BE3D43B4", + "ephemeralData": "EE20B7EC46524B6AA14DF06E6D4003C855ACAE2B4B234A742654B76D37DF44" + } + }, + { + "tcId": 910, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FAF22E661015F47E8F67D815845F14A", + "z": "A8A96B42EC7DA4B11B53A5C195E47EE1848A7971154B5F73B4AD47F27348CD", + "l": 1024, + "algorithmId": "710F60232D1670278E0A6CA233669A2F" + }, + "fixedInfoPartyU": { + "partyId": "6F846836F9D13D9C2A1DECDA6006C104", + "ephemeralData": "49E55AD383F8B961F4A92973B010A3B60771C1C94DC12C796AEE8D02E220DB" + }, + "fixedInfoPartyV": { + "partyId": "DA61CF2BADE69BD277A5C64B672E0E20" + } + }, + { + "tcId": 911, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDA8E1537C5F8C4753BF015C256F682D", + "z": "39AD58BEFB6E8712E5961756E403BC132864AD2F1C0F9F02DA4C625995283B", + "l": 1024, + "algorithmId": "00DF95F6552E74528D29B84A42C14713" + }, + "fixedInfoPartyU": { + "partyId": "A58FE44D856D8DE09D8500CD1950CB70" + }, + "fixedInfoPartyV": { + "partyId": "F1A91C50F4D28242A4C652FC4FBF4B63", + "ephemeralData": "7190A8B37D8A75897974EAEE0D5A19C8F72D9810A9C8036637135A4A5D64AB" + } + }, + { + "tcId": 912, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19D5E46964A4DB2C99D84D6906EC785D", + "z": "2AB619D33E5F9596DF9A9977D2FEA0D3B2274CB71A68648E0DF2CB87C222EE", + "l": 1024, + "algorithmId": "98F339F7EAEB9696931BBDAE6AF96EE4" + }, + "fixedInfoPartyU": { + "partyId": "4D213301A25E6B6BCC6B76D5FBD1C1B1" + }, + "fixedInfoPartyV": { + "partyId": "AD753AB36BF12C4353805D116AC4D129", + "ephemeralData": "31B7607A4A92A75163A0C0F247A93A127463DEF83B0B6732345CDD2C7AF668" + } + }, + { + "tcId": 913, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F2635FA2DB670718E6B8402F3743DCA8", + "z": "D12DB46A8718DE4BCEADAD2139C85663C07403B585748E2F0DEC3BB40492BD", + "l": 1024, + "algorithmId": "5EF61E6B2F0B936274081B72A0FE978B" + }, + "fixedInfoPartyU": { + "partyId": "E202BABBA814CFBC224119D871182F02", + "ephemeralData": "90130498527CA51449E702EA8683A2617AA26422D5B8C310454126DA850347" + }, + "fixedInfoPartyV": { + "partyId": "58FF6C611561D3EEDBF7A8B123E435DC" + } + }, + { + "tcId": 914, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D7B34AB8B08F19D1E4B51529F13E653", + "z": "C5C04DED326EC8A841B525A066AE17F8774951A1EC05AE0B3C3CE11ED4E6B3", + "l": 1024, + "algorithmId": "3EE181C7E2DE3262714C55DECF8C14F9" + }, + "fixedInfoPartyU": { + "partyId": "CDAA644CF008AA165CC3ADE02E90B62E", + "ephemeralData": "43F4C41CF64F51534A961BC0EABE40EDBE4E0A73552CA5FD28DACDFD74107A" + }, + "fixedInfoPartyV": { + "partyId": "0CE96D803A3068DC60C74C3C72DFA01E", + "ephemeralData": "E6CA5BEA580E5D78A181DC2BD236E8B1390BE47EAB20C5E4380CC0A60C034A" + } + }, + { + "tcId": 915, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43616345A5168BBF744CCF431A970151", + "z": "E5A5339FD4673E0D0443C8462BC856BD7C75ABD879304C5CFBF54752D48201", + "l": 1024, + "algorithmId": "305629D533ACFC7A2A4A492B93DB8BDD" + }, + "fixedInfoPartyU": { + "partyId": "C8745513CE3B055BE803545232689B16", + "ephemeralData": "B8F0758D41CFE052682943423C624AA6295C20E013C67EBD7B1A387C4E590F" + }, + "fixedInfoPartyV": { + "partyId": "3A08F08ED374ED81DE6857DA908B9ECA", + "ephemeralData": "62DA56CF54BB84E24F4FCB9542490E8E48EED8699CFBF0E5068637F2C82711" + } + }, + { + "tcId": 916, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D3B255AB4E097A192D878642439B86D", + "z": "C6AF8D6F33F53659934BCB79D00B8FB531781277ED2462CB09489EB4D8B2D9", + "l": 1024, + "algorithmId": "97D98BAAC2B19C1620646E06D4870ED2" + }, + "fixedInfoPartyU": { + "partyId": "7F618B3FC26DAF24F825B2F8E91360F0", + "ephemeralData": "CE54895DCAAB126902398EFE16FC5EB33D9A15A97E7E1E8DD2C2554E252B65" + }, + "fixedInfoPartyV": { + "partyId": "0F4FA634D95C409E9B778962090A75D4", + "ephemeralData": "C3CE5F32BD7861E629DA900B33AAB0C90374F7AA3CBB282C9A814B8EE00E30" + } + }, + { + "tcId": 917, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B9FDA49443DA83506955EADB5436E07", + "z": "C6C39C1E1EF035D04AD8942BEEC17DA1C62B412C434C9005734D2AA8AB176A", + "l": 1024, + "algorithmId": "0A1D252A8ED4C3A71007D9C754F7CA2E" + }, + "fixedInfoPartyU": { + "partyId": "C5681A61243EFBBAE0747A12238923CD", + "ephemeralData": "B5E8B4563034E10826B408B8097685CD68542E3973DBCD91B673EB87C69BE2" + }, + "fixedInfoPartyV": { + "partyId": "8CA6019E4491D2AFE13EFD003C152BCC" + } + }, + { + "tcId": 918, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7133E632DB7F6ADB43837EAFCECB4B0E", + "z": "1DBACAE36004D1028A78C1761AFA857BCE0A002EB04EAFCD55B5DF19828EE2", + "l": 1024, + "algorithmId": "34530BE7186A06644F954A4D3C475480" + }, + "fixedInfoPartyU": { + "partyId": "4255CD601FFEF6585439895936F8D37E", + "ephemeralData": "352959C27FC2A64CF175D3085A3231F4027154DA487F0469B0BCCC3755049B" + }, + "fixedInfoPartyV": { + "partyId": "037AF00955CD4717B2E564C5478FC27B" + } + }, + { + "tcId": 919, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA7721C754268764E4BE14BCC1441C38", + "z": "136F851E8C4A0948F350111CBB8A30D78634C8E17029AA2E917767745EBFED", + "l": 1024, + "algorithmId": "A3711646046E722CDBC4ACA5F12EC75C" + }, + "fixedInfoPartyU": { + "partyId": "1CDDA39317158AC03BFDB88717B4FB0A" + }, + "fixedInfoPartyV": { + "partyId": "3AA873EA1D6A15CB9CA85B663D234E00", + "ephemeralData": "16D51E92A3BC7A0B9FA4D54B371D5C2E2CA46039FC91FB4E331EFF1D14E566" + } + }, + { + "tcId": 920, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1BA124B842992C87DBA2D9079597DC9", + "z": "0053A99701453ABAA13E07FC802D4C0C11F68763D25E623F49981A0352DAB0", + "l": 1024, + "algorithmId": "645B4552AA388F744BD7D32ACAC3F4E8" + }, + "fixedInfoPartyU": { + "partyId": "F5575B32161933304957F277F967D562" + }, + "fixedInfoPartyV": { + "partyId": "0F95B196D5C9973971C9BD911E381C81", + "ephemeralData": "819A748E5B3E889D17D0E21B8D162F50E35F6E27EDC94FE3F41999FC208E70" + } + }, + { + "tcId": 921, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14BC4B4AE7AB9946956F565E35AC0CA9", + "z": "EB995820AEFA85E385000462557EA87E777F6B1085F4067F5C65AE14B9B2A0", + "l": 1024, + "algorithmId": "A93594F00E1A15CB368003BAF590F43A" + }, + "fixedInfoPartyU": { + "partyId": "295FD16A2F2DAF44FA21DA3D6D05587F", + "ephemeralData": "121BD1D6B2118486A33A1166B705086D263BB6B48FD52C9F1059F6CC3E2C21" + }, + "fixedInfoPartyV": { + "partyId": "8D46920510CDF4FE891F5A2CFFE7D025", + "ephemeralData": "F49E294371B87BE912FA3CCFE369C211CE39A6E447B889E7B5C3A7CC61C206" + } + }, + { + "tcId": 922, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF1DB3A4D47AC59F327D62AEBC8FF612", + "z": "B40D8107AF528BFC648540C54672DD53E8EA1792667C9876ED4D33D75C2440", + "l": 1024, + "algorithmId": "E82D2055734C023D58E1FBCC4E84095E" + }, + "fixedInfoPartyU": { + "partyId": "1AEBFC31241809C5B555C330328CE58A" + }, + "fixedInfoPartyV": { + "partyId": "8BF5E59DE14B60C0BB7F576D32F627DC" + } + }, + { + "tcId": 923, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3DA9782B93DCC5965C86EF478436D9D", + "z": "30A18B205EC48F6F54ED3B5E067C935AD891611B697BB98DB25D354E1D0FD9", + "l": 1024, + "algorithmId": "1EB494762350E7ACB25BC8EDB82A58DD" + }, + "fixedInfoPartyU": { + "partyId": "04AD0479BEB5BA40E86676664A6D0C15" + }, + "fixedInfoPartyV": { + "partyId": "170292FE71BEADBBECA77C900526E2F3", + "ephemeralData": "284177A7C8AB5DC590852A7BA82C95C0E16BDB2E86A3C6942CE37147F40E53" + } + }, + { + "tcId": 924, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0A4426699094D4F69B1A0EAA7ECE242", + "z": "67F8E7B5F46DDCC429030540FABB051646102DF1D9B3693CC8C6AD28292C4F", + "l": 1024, + "algorithmId": "BD812C1E5C492AEDCD92F00343D78D65" + }, + "fixedInfoPartyU": { + "partyId": "3CBFC7363EAF1A7B0F5803F10C5986AB", + "ephemeralData": "FCF2C556267EABAC135403D36B2D4C715512D23F4B65034BEA6347AA94F207" + }, + "fixedInfoPartyV": { + "partyId": "A9CF0C9DEEC16F2263BC64F4AEB5311D" + } + }, + { + "tcId": 925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "199EF8434387A2C4003E243372A6FECE", + "z": "F1C87DFC33CCB99F235A14F3C203B2241607F5D63972FCA5D688B6C7B92488", + "l": 1024, + "algorithmId": "0F32F625C9043A91340B049EF7CCF7C3" + }, + "fixedInfoPartyU": { + "partyId": "0A67EAC076002746596B3C0140EA9C99", + "ephemeralData": "B463E413CB7CAA47E715C60A3AA0813428DA55E90D19012E05AA353F91628B" + }, + "fixedInfoPartyV": { + "partyId": "F0705D220012E5F163B1371A7075C251", + "ephemeralData": "E9C515B425483CD0FD0D69DF26BC659E49F1DEB9944A7A76F6FF2D4A3E41D8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 38, + "testType": "AFT", + "tests": [ + { + "tcId": 926, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C451BFE5F5D27044E2452108B3B56929", + "z": "6EE40E52A407D6827197309C5D1963487B60E746B35A2349405BDBB2FF1515", + "l": 1024, + "algorithmId": "726E67CEA68FADC054D9E1C2E8E91CA3" + }, + "fixedInfoPartyU": { + "partyId": "FAFF6DAE8F6C28CD97BC68B890CA5B01" + }, + "fixedInfoPartyV": { + "partyId": "3E3AEEB7D3DB7CA37D94B461CB918AF4", + "ephemeralData": "3A15C3E0EC151336A79FA352845DC00CD714C307C4738F81A7DFC2CF1DEAB1" + } + }, + { + "tcId": 927, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67161040063C3B1CF39542BCE8E749F9", + "z": "A4FB49BC80C4AFC14126A7C57861A80069ACD872238085E0332D0E56948F9C", + "l": 1024, + "algorithmId": "B1BCDBF3B348097EE40186F79CB74504" + }, + "fixedInfoPartyU": { + "partyId": "1B231F3C630616CCA366466316E1F36E", + "ephemeralData": "A204C3A0AFACBD42B90596F77EB4DB8A9776AD4AA6D24E76BF5097DE5D3CD1" + }, + "fixedInfoPartyV": { + "partyId": "1E59BF7415A021A3D6C59D0DEA10A88B", + "ephemeralData": "8245EFF5D5DBDE16EC898C9DA11B3049B31FA0EB211B82CBD923A56A60D86F" + } + }, + { + "tcId": 928, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF5C768AADBEA64FD855936CD357A49C", + "z": "CC787742176A86F3D40D96D6EED89B284319342350E1BF603CEB3949C5FDE9", + "l": 1024, + "algorithmId": "2FE68549E0F6B2C1562535E86743DB86" + }, + "fixedInfoPartyU": { + "partyId": "A431428A13F668B0F69CBF4BF736564A", + "ephemeralData": "B04AFAA06E3DE2FE69F722FDCD051547E9FAD4CEC3D229DB298588B1119563" + }, + "fixedInfoPartyV": { + "partyId": "DC28D9EC221C0DD0C21A66E1DFE1C655" + } + }, + { + "tcId": 929, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0D9F96EC3BB8D2B3D5037CD8E2D41D8", + "z": "FBE5D007A5BF2181528DECEB6A1390F1117DAE19366BADF1FF2A51F3D7D7B5", + "l": 1024, + "algorithmId": "9077760E6A10418169A88C94D0FC72B9" + }, + "fixedInfoPartyU": { + "partyId": "8E370162E03B42AD3E839E36B5206888", + "ephemeralData": "7FF0ADB0A9BCD40D52DAC88EB0AD6FC821F88592D156842703ED8E5B32CA7C" + }, + "fixedInfoPartyV": { + "partyId": "28ACB148B18D1C7AF9A0B2068BF731EA" + } + }, + { + "tcId": 930, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A7889094B16802CC7974CCF4C530E50", + "z": "AE55BFE4999A6FAA59BBBEDC2A14D360258797A9D7DD713626FC1B4A403FE8", + "l": 1024, + "algorithmId": "FC5B2404D904F25EB7A0D564C66107F7" + }, + "fixedInfoPartyU": { + "partyId": "30EE75F1DB1CE853E011E4C5F06A79D5", + "ephemeralData": "3567E0A1F3D733C17C60962C2F012F1C77426381DB95E52CDC9C5EF477B55A" + }, + "fixedInfoPartyV": { + "partyId": "F05F364FDFC48EDD76BADD0989F36A80" + } + }, + { + "tcId": 931, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C0B9D46165885E3C80FF202FC1C8C48", + "z": "0D638EE803225F525E58E3BE20470FE7B44E1C413A51596713B1DBF1E5B6F8", + "l": 1024, + "algorithmId": "E2AD8F3748A3510F5479E76DE6EA6F44" + }, + "fixedInfoPartyU": { + "partyId": "ABCEB8B0A2B5799607BCAA804F064572" + }, + "fixedInfoPartyV": { + "partyId": "F6D92AAEB8919358A0B84D7DFE0671D0" + } + }, + { + "tcId": 932, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0870A1655DE70AD09D61BB345B7B9837", + "z": "A137BB692667EB481A96E06209AAF262777FA2333F2EC35A92575E22BCB29C", + "l": 1024, + "algorithmId": "F6E4F3D5934A6AE50694A273F7044D03" + }, + "fixedInfoPartyU": { + "partyId": "FA2D7B06972106E098C13722F742F943", + "ephemeralData": "CD14FFBF5C2812312B54875F3AFC8D8B9E2930F737739705270E98BA6A8593" + }, + "fixedInfoPartyV": { + "partyId": "AFA18AC38BF21BEBABE6CD36D5D56CBE" + } + }, + { + "tcId": 933, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCEE328485204D0228762D972F44D622", + "z": "34DAE92ECC3E6B9CF964E6023EE4EDD867832771359685BE8B6F9AA40B6E2D", + "l": 1024, + "algorithmId": "B98A60F9D739409CB95F0A7BCE66E1C9" + }, + "fixedInfoPartyU": { + "partyId": "0104F700AA854AB21FE6548BAA5C526A" + }, + "fixedInfoPartyV": { + "partyId": "ABD55CA25C386F74C8F6ECF3A09848E6" + } + }, + { + "tcId": 934, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A808F6A8CAD93DEEA544FBCDC0C89DD", + "z": "65DCF0F899CF026D2E2E7A40B109DCF5AB2CDDED2DFA405DBC536B57E2A826", + "l": 1024, + "algorithmId": "93CB67699CF7FF0ECF699E8B78BA57BD" + }, + "fixedInfoPartyU": { + "partyId": "0D6621C29CAFCC8A277384C0769C7E7F" + }, + "fixedInfoPartyV": { + "partyId": "636CC4B99B54757AF8E040DD61B0B7E7" + } + }, + { + "tcId": 935, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F8992BC1A19435A549C95111A703A88E", + "z": "0FC8BE94F5EDD501D5AEE74AC2DB6078EA65582E8B745785C22B7122862599", + "l": 1024, + "algorithmId": "AAE481BAA306BAAFD16953CA9A369E52" + }, + "fixedInfoPartyU": { + "partyId": "F09AC59C4F7DE56339C2FB95090D2084", + "ephemeralData": "3B395F6A645FA29E7D555C4B0E07658FC72D36844D854FEB114E68E6401C4A" + }, + "fixedInfoPartyV": { + "partyId": "2DB57576461DFCD11B2888A24AB6FC3A", + "ephemeralData": "29060E3E4F3CEB3C0624E37F881249158CA6EA0944A19EF5E2A58CBD36C0B6" + } + }, + { + "tcId": 936, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C76F3C5C4AA93A96DA7A00E84978BA7A", + "z": "9D33CC4E769995ADC1B709B311CB790405BB9D3B097F7E44B76C814A412717", + "l": 1024, + "algorithmId": "D987199D0C2306D0FA7E76880D740FAD" + }, + "fixedInfoPartyU": { + "partyId": "3C3EF668CB33020E583DD875F55C9794", + "ephemeralData": "B658ECD6B003723C2C90C641A475E14A7869F5E7B593665FBDBB2A91D1A534" + }, + "fixedInfoPartyV": { + "partyId": "187187440F959EDB690C6227199B5D56", + "ephemeralData": "B4E88131A2C90CD5E7504F5A8A5FDD0D73E70A271E9578A414FB9A808780BB" + } + }, + { + "tcId": 937, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34D59ABA531F2E5FF90C0469FEC9FA9B", + "z": "3BDC4D7343290F8D5249090D9088B3A3573414A937C1DC33D0E6B404203B38", + "l": 1024, + "algorithmId": "5BF063510BC2C8C4F62F6DA2A3221C91" + }, + "fixedInfoPartyU": { + "partyId": "E462CCA822952AB5A6EB4215D38DF329", + "ephemeralData": "C0AA2773E3DAE1C860416187B60D8500E55CA28BF593E8EE2BC70A329F7CD7" + }, + "fixedInfoPartyV": { + "partyId": "121AF6AF2DE4622B1F093CD19C1844AC", + "ephemeralData": "D2B0147C258AEE7CC414C08A4748D23DC7B7E42F50D71C95C95DACBF2221AF" + } + }, + { + "tcId": 938, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0087FE4E3C30A784EB9EA3720AD9696A", + "z": "FEA003A749B2C0EEF52881A9C50E4CF5DD26F7110783FA3EF340B1AFED1431", + "l": 1024, + "algorithmId": "A228D65AB27265984DDC334FCD9D5F91" + }, + "fixedInfoPartyU": { + "partyId": "F48C9BEF0F9B762AF078E8458072DE9A" + }, + "fixedInfoPartyV": { + "partyId": "5A3A4CF6FFEFFF1F097FDE383FF03BCA" + } + }, + { + "tcId": 939, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D406F24520DF7C330741F6F0A786298A", + "z": "19F002B25722533BA49790453ED649D5154192D56C7B7E9626327614510F96", + "l": 1024, + "algorithmId": "2A5ECB423EB9C1AA5E11E22F8A299431" + }, + "fixedInfoPartyU": { + "partyId": "746C897428F00357B3497A33A8E4BAB7", + "ephemeralData": "B12F6FA041E723005BE299AE1AB5628E9373DB54C1156BFE43C1B36ED60A66" + }, + "fixedInfoPartyV": { + "partyId": "7B5F8864C7A9A1F903AB1AF84C65ADE6" + } + }, + { + "tcId": 940, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C834191BF31900A0D9D5EC0D5541FA2B", + "z": "42B2E1254B793BD92D4B2E6C2080ACE8036FC129A61C447061E0F95EF27F9D", + "l": 1024, + "algorithmId": "BB96C8D79A3D90535EA6FA26EC5211C6" + }, + "fixedInfoPartyU": { + "partyId": "18AC45F011D0994AC138D558FD755C39", + "ephemeralData": "943C395ED2D5BE7412AB714BCC6CDA918F3B95802318525299C8F99A4730FC" + }, + "fixedInfoPartyV": { + "partyId": "B54115BD05ABDC9440A76BB02919608F" + } + }, + { + "tcId": 941, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54247C96D3A08151D509F2EEB26F6B9E", + "z": "424053373C9FA37929F2A7A1A51F9DF876CE56A4E95FDA0945DB0A4F7374E0", + "l": 1024, + "algorithmId": "29500E73E079A565D814F3B88E75AD6B" + }, + "fixedInfoPartyU": { + "partyId": "7E64098FD86526C21F009AFF002580E8", + "ephemeralData": "6F991A417BE2009C5D76CD3123001C99B60E9E6BABFA4BEDAC83D77636A70B" + }, + "fixedInfoPartyV": { + "partyId": "23B355A0B41378FD11CC0AAC2BB9203F", + "ephemeralData": "47BDC2BAB926EE4F8E09E3E54A6C8AB1D26A07F475994994B64D4009733EAF" + } + }, + { + "tcId": 942, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0CC94F1CCD7FD5E57404A4F54CA52927", + "z": "63A5BEADA8B513959943A9394A06BAF06C2AFBEC2772315BB6953B769BB438", + "l": 1024, + "algorithmId": "2F229080966933C37F733D838D2A1739" + }, + "fixedInfoPartyU": { + "partyId": "79177D831B4A7291F4ACF5CB5E5D6973" + }, + "fixedInfoPartyV": { + "partyId": "8C9C09ED8563061BF5628F0515138E68", + "ephemeralData": "69A46E48EFB069FAD96E4D923044ED3CFB1715275FC7B8110EFBA1CB9D83B3" + } + }, + { + "tcId": 943, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C590FD7A5A7A1074BB760666761F674D", + "z": "A01C91FF60C602D162DFB5E91401D3A47C58ABD81B1B0D42EC29C9B74CF3FA", + "l": 1024, + "algorithmId": "8AB1B5053430F1931A760C10D48278D7" + }, + "fixedInfoPartyU": { + "partyId": "0F9DEB4A69DD7A24C1F968113A6A6096", + "ephemeralData": "E51776D86EEF40D93B6A1E4177847BF0B0EDC902B57B901A0FA7E87886D694" + }, + "fixedInfoPartyV": { + "partyId": "5BBE44ED811F5BB9AD2795BB6B44B764", + "ephemeralData": "954EE8FFE6BED7535BF581844B519578A43638F938AC9A2AFDCE2667CF782C" + } + }, + { + "tcId": 944, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E796707183753C7BB48D38BAE1B3F0CB", + "z": "15947B87546806A0D66D9F57A347CC2A605338DB7EDEDAC5610234591C15D2", + "l": 1024, + "algorithmId": "BB6456C232356B568717F1C4CF1C94D8" + }, + "fixedInfoPartyU": { + "partyId": "7CB2B9DB07EE8FC8860B3AAD604DD5E6", + "ephemeralData": "E7FA66B1C8DBC0C1EFB2F3EA0698C84649D9AECC537B3E64483ECD2AB74BDC" + }, + "fixedInfoPartyV": { + "partyId": "1ABAB8BF6EFB059618EBDD30AA2DEB53", + "ephemeralData": "083044F7E5707FDD68182F80E0FF9344FE9676F169F55B293491AC2013C1A4" + } + }, + { + "tcId": 945, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1CEA9C8A02499727401DC4E8E615794", + "z": "A0EC488860816BD346BFB3E5641289F9322B56173CC9E33E6FD93A614ECCA0", + "l": 1024, + "algorithmId": "891B032528F415DA688C6C22D3F56DB0" + }, + "fixedInfoPartyU": { + "partyId": "1DE9A084AA22E7BB4EB9B55987034730", + "ephemeralData": "33C11590FEA9C4D044D8A353D00B28F7F6E678B9F67B85E13DE844B5172A67" + }, + "fixedInfoPartyV": { + "partyId": "4395C33AD4A6C55FEBEBD51D21196482" + } + }, + { + "tcId": 946, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63F86BECCBA82896D76CB0E9A9A23EC9", + "z": "DB679508240256D756EE39BAFCB95EB681E4EA85370671E295355B76F86AB3", + "l": 1024, + "algorithmId": "D47F39F375778B0FC7323E30BBDAC287" + }, + "fixedInfoPartyU": { + "partyId": "ECE779E337C0A89379084189C11392A3" + }, + "fixedInfoPartyV": { + "partyId": "0A4D8D1058202113C52A3E6F326CF2A7" + } + }, + { + "tcId": 947, + "kdfParameter": { + "kdfType": "oneStep", + "t": "261B28C3627EC5E3F76633C5CEFF1C3F", + "z": "8844363F56CB1D8352FD7865A789651095D7D358A96773FCE0EABC98585EDF", + "l": 1024, + "algorithmId": "A9BA2045F0A377424CA7B50439C284B7" + }, + "fixedInfoPartyU": { + "partyId": "230E8A5D5B023B55EC21C7E7107D5C1A" + }, + "fixedInfoPartyV": { + "partyId": "2EC5A193F17BD50BE1ADB5813AFD6D2F" + } + }, + { + "tcId": 948, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93D86E282083C3D4DA665B4C100CD3F7", + "z": "9D15DA5474C5D8B3D8C0BA85173B4D4D05635E7F04BA574B829505A8DDFE42", + "l": 1024, + "algorithmId": "0CAA846EDD2C5320C6365E17499F3F0E" + }, + "fixedInfoPartyU": { + "partyId": "7BE75692B8C051610602A7709B997AB2", + "ephemeralData": "5C4607FA34B5344AA695C8C504511C42712E203FD0292582D85356EDD336BD" + }, + "fixedInfoPartyV": { + "partyId": "41C7317D4A18C1275BAF41A496034AF0" + } + }, + { + "tcId": 949, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3128438FE4A23B9CDECA7C5731AC276A", + "z": "655F42CEABD3174CD710A4E1D405F65F566277A9D8740765E9E60ED8E5B0A5", + "l": 1024, + "algorithmId": "D461A0005DA13FD0F544E40A48B1E1C8" + }, + "fixedInfoPartyU": { + "partyId": "6720A3E229473D84C689BB50B76F168D" + }, + "fixedInfoPartyV": { + "partyId": "A8221B3A3BC099D8958D476E8AEE43E5" + } + }, + { + "tcId": 950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18874CD15BB00B6D2E614B624E61E117", + "z": "38657E1BB2398689DE65E0901A6B9C2DE153F10C7EB305D2C81C60E5703C69", + "l": 1024, + "algorithmId": "F0A861C34DD3CE240AC12E262068E8D5" + }, + "fixedInfoPartyU": { + "partyId": "3C55CDAE498E19FA8FC2F087E3BA47D7", + "ephemeralData": "BC301C52771FDBD93C597036C5A67BA054AC69265EE75D0438F63266BF8229" + }, + "fixedInfoPartyV": { + "partyId": "9169630929DE8250A5D2A5FBF199FD31", + "ephemeralData": "75332F91B37400A8FA58BAD0292D2A2CE8E57F128AE645D0A906902633A839" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 39, + "testType": "AFT", + "tests": [ + { + "tcId": 951, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17E306DFC1C82C2B6646FADB53BC08C5", + "z": "9AF2EEAA7B6160A435A792FFD97430C79732EE9926C36A5783697BCF", + "l": 1024, + "algorithmId": "32F40755455569244CEB30C71D54F076" + }, + "fixedInfoPartyU": { + "partyId": "ECB996455BDB709ED9753E861E6D2968" + }, + "fixedInfoPartyV": { + "partyId": "7768D9ED1A6F73AD5E4CC2EEB8FA9EAE" + } + }, + { + "tcId": 952, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04F89B3118B6D013F317540598AC3F4B", + "z": "AFFE5A4BE772A0B0641FBE93410DEE6B7529399E5F571381628E595D", + "l": 1024, + "algorithmId": "78393D8F12ACC0EAACAF4580124E623B" + }, + "fixedInfoPartyU": { + "partyId": "CCFA4CE737F6D7AE35B4A8C74F7A978F" + }, + "fixedInfoPartyV": { + "partyId": "142716A6E6BD54947B738475C32488A2", + "ephemeralData": "F65333D307121AECDAD2A9BDA5A6647CE7C7BC92D73AC3ADDABE07D0" + } + }, + { + "tcId": 953, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0E9B5F7EC72B46CC0A86DDB0A8F2FFE8", + "z": "15E9A674AFF9A0B98F7950D97634ED6026EB2B4538825A70D9AFCBFD", + "l": 1024, + "algorithmId": "912FD2922EC85F6370813D5CB6B0FA8C" + }, + "fixedInfoPartyU": { + "partyId": "8563B97C8E215623C630BAC403F2BA11", + "ephemeralData": "2F83526DBCA562E8388B266C71C96500D25C540BE62DEDB512DFA960" + }, + "fixedInfoPartyV": { + "partyId": "65B81DC4CC5C0309FC14BD743DFF13EA", + "ephemeralData": "CA6967CD51425D1F55F8FBFE6A62A42304FD094CD8920F1C57F023F4" + } + }, + { + "tcId": 954, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A74FD801AD79D57997E43C8E7886ED2", + "z": "868EB147E9BC6AEFFA61841D1ADCFFB75F448F2045E3717B57D8C0E5", + "l": 1024, + "algorithmId": "84DE06DB1CF0475752C1E724E64BC52D" + }, + "fixedInfoPartyU": { + "partyId": "39C6438B6109862E1B36D5D259D2A610" + }, + "fixedInfoPartyV": { + "partyId": "E2C90FEF037B2B799BFBFCBCC058E21E" + } + }, + { + "tcId": 955, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41767BDE5E98B43F0A4F750E675ED17F", + "z": "27A960B6159E624F7C16B3BD2B35987AF7F3BE1E5B8315A2C10A5409", + "l": 1024, + "algorithmId": "A3E2B3B96472DC33E2B6BDDCE96B058A" + }, + "fixedInfoPartyU": { + "partyId": "5049034E6A0020A9655A3166B7045824", + "ephemeralData": "B29C81CF3D48903BB9C6375B6B410BF5B6A6F2F9652AA06D7FA69058" + }, + "fixedInfoPartyV": { + "partyId": "3E6C52D9B7B6A702D05E934D194C2EAC" + } + }, + { + "tcId": 956, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BA597C3C50BE976B6F48D6A0BE78DF6", + "z": "3C07B0F308C67B2F5074D0412420838B5B8A21FD4BA865EF585DB3D3", + "l": 1024, + "algorithmId": "D143F9C014FF36DC9C031F267D66E895" + }, + "fixedInfoPartyU": { + "partyId": "490E9CE591E1EB9B0D41849144D83E13", + "ephemeralData": "EE5688134107CA4549BE376B5E3F6454EC584C5423F383E7C8F32B99" + }, + "fixedInfoPartyV": { + "partyId": "383C20E4BB2C7413855A057D6D936BE3", + "ephemeralData": "0BF74ABA094F6FEAB9E940042C5EB5B124CEBD004F647932A2864620" + } + }, + { + "tcId": 957, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07BB180F51295718A48921CEC8D9261D", + "z": "68212A03D7731D5055B2CB53A810D1067F0756E5BD32247594FAF57A", + "l": 1024, + "algorithmId": "0B97608C04A4E5CBACA179C039CF8CF9" + }, + "fixedInfoPartyU": { + "partyId": "78E31CF3F8950366968A9D29B29D5050" + }, + "fixedInfoPartyV": { + "partyId": "034B9023815CB7666644FD8046469E0A", + "ephemeralData": "2DE5C34B5852CF22DB8BF8BCFB3A3461B9354F427946695554B9946D" + } + }, + { + "tcId": 958, + "kdfParameter": { + "kdfType": "oneStep", + "t": "543886756C643070B57969D904A1BDD0", + "z": "B4A280B03CAA61D790C7C029721FEA337885C883D2D2DB7A62B13CB3", + "l": 1024, + "algorithmId": "8ECAD6A4AE3ABA25DE3B4FE512362AA6" + }, + "fixedInfoPartyU": { + "partyId": "1180CFEAF413672568FBE6829F68CEEB", + "ephemeralData": "ACC24DB6EF4DF6E65FB4E71D38F9B27491527DA7BFB543F211858200" + }, + "fixedInfoPartyV": { + "partyId": "68DAE0B38BF8A31CFDB05899E008A6D2" + } + }, + { + "tcId": 959, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58F9AF2B3619AE9A39965BB36CAB3373", + "z": "768B0D5CFCDE045FAA9429909698F0D42FB23543F8800C2B1BC5FA5F", + "l": 1024, + "algorithmId": "E560B98C9E12683BCC77B7252547F358" + }, + "fixedInfoPartyU": { + "partyId": "7D28B2B367B945F4923FBA6E8CA1409E" + }, + "fixedInfoPartyV": { + "partyId": "801DBEC81B5BF94E1B01A68216AA6467" + } + }, + { + "tcId": 960, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F597A4D5BF1FFAB1C579338E59AB7897", + "z": "787A8281D25E744B674496AC62F5137C9D7C9AD0970F73AC6DCD549A", + "l": 1024, + "algorithmId": "C04741F80FCCE21D206A3E732C47FA06" + }, + "fixedInfoPartyU": { + "partyId": "F38813692314DA73A475D74B784AAA1F" + }, + "fixedInfoPartyV": { + "partyId": "F829EBFBF625A9305F3F13BD059E48DC" + } + }, + { + "tcId": 961, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3ADBA9E14C9DDD0211726F1DC9675333", + "z": "5C75DA4ECEB62E4633F85E0B7161099B881707123172E84A7A4BEC11", + "l": 1024, + "algorithmId": "FA043FBD94AD0DFBB429DC3A77ECC03E" + }, + "fixedInfoPartyU": { + "partyId": "15B736E14AAF89F4D182723151D3DC3F" + }, + "fixedInfoPartyV": { + "partyId": "73702C7C36E3F4A7B082402C7CF976E9", + "ephemeralData": "9F7E8AA0509C13E07C646476A1770F52AEAE817C90862856C63435F1" + } + }, + { + "tcId": 962, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12886706C201B6CB2E948FF509C9A765", + "z": "01164E5021B206A7B51841EB5D59653AEF7FBE6F5CA5FEB7E23AFD12", + "l": 1024, + "algorithmId": "DDC3226819DFA761908A2BB7E17CE4B1" + }, + "fixedInfoPartyU": { + "partyId": "36996C026625E0E76B06CD1EF989C729" + }, + "fixedInfoPartyV": { + "partyId": "E86991184B0B6AD34FC5D6A35D66F3A4" + } + }, + { + "tcId": 963, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3221CE6D677C21C4415C3857B07CC25", + "z": "49A15DE185B6CB6DE3CBA4BCDABC1CC498816E4D743532E2A4095C80", + "l": 1024, + "algorithmId": "2B49A52B48A5E2538CF1940CBEA2F749" + }, + "fixedInfoPartyU": { + "partyId": "172D9297F249A59BCEC8C2BF36A51B1C" + }, + "fixedInfoPartyV": { + "partyId": "9184C283A6B4763F5042199D0500807D", + "ephemeralData": "134B7FE663017E43A0DD63439E9EDA4CD95B163EEE5402D84AC83257" + } + }, + { + "tcId": 964, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FEDDEC74356F909E3121C974228B7E9", + "z": "DA5877CFF0E389D2909D92EC3F890B4DEB3C6D0BC14B7B3B06DF6CF6", + "l": 1024, + "algorithmId": "0D83569FCB302060D443F7D4615BE10C" + }, + "fixedInfoPartyU": { + "partyId": "2A36676B6ED17C7733D41132810C00A0" + }, + "fixedInfoPartyV": { + "partyId": "23C437EE886D4C5C4035561770FE9527" + } + }, + { + "tcId": 965, + "kdfParameter": { + "kdfType": "oneStep", + "t": "721A8220E71F76FCE85434A9FBA36172", + "z": "8126EE9E5F810EA92C9D41B1C3A10FB02C05F1157CAF8F14F4E4B92D", + "l": 1024, + "algorithmId": "166F5E72B6791169405675F722D7F294" + }, + "fixedInfoPartyU": { + "partyId": "B7E526B1E3017A79B98806F6E61F6F55" + }, + "fixedInfoPartyV": { + "partyId": "68265684371EC9EEE4DE365CD5ED3727" + } + }, + { + "tcId": 966, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11E5EC79C2F230A2B696FBA81E16D5BA", + "z": "E63AECD832B2E5117B47AE11780E910EA1EE23266994728AB031C6E1", + "l": 1024, + "algorithmId": "49F19526BE27BCB9E4A30417DDA36F2E" + }, + "fixedInfoPartyU": { + "partyId": "85F7AC4048BF416360DC16D6CD6AE012", + "ephemeralData": "EFD014AEB5F7CA21B84657AE379DD7FF13FC006AA4CAB07A2211A8F5" + }, + "fixedInfoPartyV": { + "partyId": "166C289F2F98C42944E3252DED643AFF" + } + }, + { + "tcId": 967, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C06AB29EE7A1CFC021CF8727501EC08", + "z": "9F1DB394DE35F2D9F3AA0A534986C8A65BE7141FD916920C9DE047E4", + "l": 1024, + "algorithmId": "80A45A963509FDB1CBE8CCBB19B5B0D6" + }, + "fixedInfoPartyU": { + "partyId": "5D5528D67574077A4E50EDF605A2F952", + "ephemeralData": "964CCE3878B964E1722686767559090211F14313011E9A3195335BC0" + }, + "fixedInfoPartyV": { + "partyId": "AAE304845F210AEA57D3CDD89DB01C34" + } + }, + { + "tcId": 968, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59F38ECACAEE1FE7E431AFA4492BC0F5", + "z": "470EF36F78DD01B8C80FC3833EA044F4CDA5ED29FD228801CFB4251B", + "l": 1024, + "algorithmId": "C3BDEB2700C6A2FC7E3DBA66F5D7A028" + }, + "fixedInfoPartyU": { + "partyId": "B61F2D9D6CC1ED3602E56DAE6DB473CC", + "ephemeralData": "0296079E5E871E3839B531DB7A0E603B4719A12A7E0646B07FA2F064" + }, + "fixedInfoPartyV": { + "partyId": "CB84EEAD2C1BC76B020A6F27E28B2AA3" + } + }, + { + "tcId": 969, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C393A7BBC86DF51F1E0773067A49A622", + "z": "6872C93078A4B381A4464267A59E67D773A7CF3CFA12946B7937CF82", + "l": 1024, + "algorithmId": "F089B1066050D9A994D9B35D91E837EB" + }, + "fixedInfoPartyU": { + "partyId": "363E4F948E840F7936DE8C4601D91046" + }, + "fixedInfoPartyV": { + "partyId": "21A149BF2BCF42EE617861C756B84793", + "ephemeralData": "0E4A57A060AF7E11BA819CAC6D753210B8BD572C67894A2DA5F62BB4" + } + }, + { + "tcId": 970, + "kdfParameter": { + "kdfType": "oneStep", + "t": "139F2C7E5EE3B728F8EA06B2ABCA96E4", + "z": "55FFC4823B21C4107C4E5D5A6EEC2925F9414E7CBE11E7068C2892D2", + "l": 1024, + "algorithmId": "BBC65F84C0D41918FE81650C28BD6D41" + }, + "fixedInfoPartyU": { + "partyId": "642E0C84FDB43A37F2EEC17AEB802382", + "ephemeralData": "A81F37F93A647F55CE593CBCE74109EC700D0322DE210374CAFED2F0" + }, + "fixedInfoPartyV": { + "partyId": "BD570D5E1F0D8A01F29276BD9504F851", + "ephemeralData": "2F32E64F7676B277FF2A8C78E33CD1C36E716F95D5CFC71572314A82" + } + }, + { + "tcId": 971, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBD2CE891DD07F266BF68A2E72337FFC", + "z": "3AB4862970F0A03B2E6B8B5E34ED24B7046FEE87C4761D945C94E136", + "l": 1024, + "algorithmId": "D10F2271B27EDB78E776E8B9DBF21FFA" + }, + "fixedInfoPartyU": { + "partyId": "3FEB6E09DF3DB38E8F7CA209A95E5917" + }, + "fixedInfoPartyV": { + "partyId": "680D3323F195A0A463FEBE9C9202B4F1", + "ephemeralData": "E7026546609B7BA7B2D23856B0B5CC258C4DABA65DA714FBC5902DAC" + } + }, + { + "tcId": 972, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D87821247F15561A0D72478E80119A2", + "z": "7F5E4AE63DD182F4954FC044EA2E8F1FF777056831F5649E69492093", + "l": 1024, + "algorithmId": "F4C1C02134EEF5ADE5544FD5C0EABE62" + }, + "fixedInfoPartyU": { + "partyId": "737FD0233D55577601A1516D2BD20C5E", + "ephemeralData": "6BEC732CEECD894B325BD3750554820B4E10A8F23351030627D281E0" + }, + "fixedInfoPartyV": { + "partyId": "A87AF7800857588CC806905E02237111" + } + }, + { + "tcId": 973, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDC6F3ACBCE6421148EBB690F7C70467", + "z": "D1AA7A657BAA1EFCDC84359D6666CE5969D92AAB2FC25801B692397A", + "l": 1024, + "algorithmId": "DF75CF40D149E9AA3214DD14BCC25131" + }, + "fixedInfoPartyU": { + "partyId": "654C97410EDEBE3D07578B22B78558F6", + "ephemeralData": "57DF285E76CD4622A55238F0AE8751168F5BC1EA6F771E80DC43EE82" + }, + "fixedInfoPartyV": { + "partyId": "CA38480E3A76F5668BE29E44D2659B75", + "ephemeralData": "C2FB47FB6F784A895C4FF91F3E577ECC213BBBC0F95F5060576C2778" + } + }, + { + "tcId": 974, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CA0675CF77B94EBCCA03A2B46AA3E9D", + "z": "682D3091DA585375519B9B92DC952CE010AC13CE31860D83B958A2C6", + "l": 1024, + "algorithmId": "495D7A4BBD805A9ED61F91FC19FD3115" + }, + "fixedInfoPartyU": { + "partyId": "187778B790C5A421A9F653B936792815" + }, + "fixedInfoPartyV": { + "partyId": "DF52277E4A73B74FCCC1649EFFBFEC8F" + } + }, + { + "tcId": 975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "702723DAA37450CA2ED6DE48833ABBD1", + "z": "A2E4ABD5D3DFDD08073B1A48BD7B74B042E3FA1DA9C300C4031582E4", + "l": 1024, + "algorithmId": "CE0A5194AF94D435D74F64F3AFD9ABB1" + }, + "fixedInfoPartyU": { + "partyId": "4E6691F8D109073B11CB24AD12FDABEF" + }, + "fixedInfoPartyV": { + "partyId": "1B192D42A3076820E7BF5AB7D5567D93" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 40, + "testType": "AFT", + "tests": [ + { + "tcId": 976, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F67C35F2BE99E37941DF809390C764E", + "z": "CC76AC08480655E54C0560AC1BE6675B0C1A537B1A679784156298EF", + "l": 1024, + "algorithmId": "305FFC12FF4217D1B486BE6BAD412540" + }, + "fixedInfoPartyU": { + "partyId": "B6BDF20EB6AB4A99791012AF0D545BD4", + "ephemeralData": "B562826C56495D0CFE20469B21D80D1A929A4A1BBEFE7FCDB8CF3910" + }, + "fixedInfoPartyV": { + "partyId": "C8934F55DC0613A673F76B4F97F33D4E" + } + }, + { + "tcId": 977, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A328C5CF53B7253152F925E048A3C83", + "z": "F23485860B4991E323F373EDE7E02F2D244AEF78F01B1AF8D180C459", + "l": 1024, + "algorithmId": "E15F7C6843B30ED6CEF67B64889AB59E" + }, + "fixedInfoPartyU": { + "partyId": "6F8C992069E88DFBA4EA49DB4A710140" + }, + "fixedInfoPartyV": { + "partyId": "E5734B757AC8860F98E807539123E70A" + } + }, + { + "tcId": 978, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A7E5C1999840D062BC54F7DF9ACBAFA", + "z": "FF1EA66CD3FC3CA787A0F2249E7130F83BAEA27A749FD96D6235B158", + "l": 1024, + "algorithmId": "BCF44D041C24E278B762B60D24D23223" + }, + "fixedInfoPartyU": { + "partyId": "DA7E381B204F911752C409631C9EC932" + }, + "fixedInfoPartyV": { + "partyId": "BBC6F661B41C73F6BC2674E59BD5328A", + "ephemeralData": "A8956D5F77544C644973E13221BD6E6C80A293861F6CEFD79203B041" + } + }, + { + "tcId": 979, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FDE2480119F4102B23F1D49842A7E54", + "z": "383A84E6947E9CE5188229310F1B563D76740F142E64B2A223357EDE", + "l": 1024, + "algorithmId": "070922706C506C784102EF793D3625B2" + }, + "fixedInfoPartyU": { + "partyId": "3A6FFB19A165E6EDF28D008D53C0F150", + "ephemeralData": "C44B2229C83CE9214E23DE2C771D3DA0FF4269C6A257DF9025AC75C8" + }, + "fixedInfoPartyV": { + "partyId": "96C7B06911BF128E0F1DEB442CEAFFE0", + "ephemeralData": "1E19E90E1FB5BB167FC7C292946DFCE338DF88EB4B1DED2947A84CF2" + } + }, + { + "tcId": 980, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8522F5C137876A85B8EBD8BD3C7A797B", + "z": "921FE4E88812E6241B2EA497C6FE2969820C15B38CB78A44A6C74875", + "l": 1024, + "algorithmId": "670D864967CC5D15A21B0FFCA59CD461" + }, + "fixedInfoPartyU": { + "partyId": "A888EDC1F12266BE00F1473A1FE1E488" + }, + "fixedInfoPartyV": { + "partyId": "6A60BD3F368F6007C71C9FC16C5C4F69", + "ephemeralData": "61E63358C445C626C2947FBC6A5D36593D813007FD372147ED34CE04" + } + }, + { + "tcId": 981, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A6120B2D322C2E6D066575D29229DEC", + "z": "2152D63B429B5642ACDB9FC1633438DBBD42D8F0BFFBA043AB193EE3", + "l": 1024, + "algorithmId": "45E9872BAD33FBEBFA4671E338A6A19A" + }, + "fixedInfoPartyU": { + "partyId": "853863A24B013E6EEDCA299ACB48724E" + }, + "fixedInfoPartyV": { + "partyId": "4E6D70D7A28DC7B4441312BF8DAEF4A9", + "ephemeralData": "3C62E58735608E94A3E1912D151DDF09909D83F4476EB123778F7E71" + } + }, + { + "tcId": 982, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE2C77473AABB40412A52232A56004CF", + "z": "5942264AE1938D17939E418D852B95334591EB1A43020794411031F1", + "l": 1024, + "algorithmId": "DFCE6F13DDA77B010465E10D4739EF03" + }, + "fixedInfoPartyU": { + "partyId": "478B1D01C84B8C5EE2EBF84F89BC2B36" + }, + "fixedInfoPartyV": { + "partyId": "C56DF72E9D649798D806AC26896FDF60", + "ephemeralData": "8661B6B0B57E10CFD247E9514B02FA91D6F5002648AA3AF5082FEE0D" + } + }, + { + "tcId": 983, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5EB1122E44FEB05AEB7D00D4EDA5D707", + "z": "5968A24026C13236786B7239EED1021AF016829CEEAD74982D22ACA9", + "l": 1024, + "algorithmId": "15EF38612BF690B279418109C38DBE27" + }, + "fixedInfoPartyU": { + "partyId": "5250B62A937CC216B58298DEA04BFC83" + }, + "fixedInfoPartyV": { + "partyId": "0BF6ECFBEA762739A7BB0A0FDF57D08C", + "ephemeralData": "0B71A5F98FF2737A11D1B43C6FE1804DD8F676D71C8082117637A06A" + } + }, + { + "tcId": 984, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45BBAAD5DEBB54E4189EBB09AEF97290", + "z": "BB4E7964063BF0F8B0F5598C8A3C12974C2014BBEFBFB1C9BBD25650", + "l": 1024, + "algorithmId": "5EFA5A76CB233172C7AC6F0F329203C1" + }, + "fixedInfoPartyU": { + "partyId": "F4F309B2DE943F88207ADE75C8F2CDB3", + "ephemeralData": "C44D011B97B8D75721ED3B04635057CC1A604D0AB47B513118D28151" + }, + "fixedInfoPartyV": { + "partyId": "906A14777B82A37CF7126B47FDEEFE17" + } + }, + { + "tcId": 985, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F03747E32320BB643203C8A3521795F4", + "z": "B80F5A51CC26A781FFFFA63909381C75C9FA91BD0E7909D124FB4A09", + "l": 1024, + "algorithmId": "67E2B8D1D8B58B2731A3C274738D5495" + }, + "fixedInfoPartyU": { + "partyId": "1195091CEA95BEBC86CEC453E04E7FA2", + "ephemeralData": "107B4CB24DB0761A433D6BC0FA77D22E24626F38483CEA168247BD39" + }, + "fixedInfoPartyV": { + "partyId": "541A9712958B35C79D17FF141177E214" + } + }, + { + "tcId": 986, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0CC59B47E7C26072AD3D74273B99965F", + "z": "76D10C421B23821F4D5E6D7BBA1372F6F34E32E3BD0583872F61E152", + "l": 1024, + "algorithmId": "8156D784D55D63416BDE83D643BA7F90" + }, + "fixedInfoPartyU": { + "partyId": "F458DB90DBFA2676A282509EA624F7C0" + }, + "fixedInfoPartyV": { + "partyId": "B27AED45BED0ED773CDA6C084CFFB649", + "ephemeralData": "B2622669498AB829D156F8F52E2943BC8372554371EFA655A80EEBFC" + } + }, + { + "tcId": 987, + "kdfParameter": { + "kdfType": "oneStep", + "t": "814D3722D0A65D9A0D87D3ADDCEF1DAA", + "z": "A7290840F224D4255F7A43FFC35F60B93C5F48D1B5C1F2CE678A056B", + "l": 1024, + "algorithmId": "47EFB864B4064EE7FF018805C415C8C6" + }, + "fixedInfoPartyU": { + "partyId": "640A395BB778872E5F498401AFDD30E1", + "ephemeralData": "CB77950016353BAF6BA1D319C9C62797E0975CEDBDDFD1E2FE3A534B" + }, + "fixedInfoPartyV": { + "partyId": "2813F2FE5FFFA9EEB4F47FBFC9EB03C2", + "ephemeralData": "D470DA12331820CE71EAFA13594CFE231E10C4F9696642EEB15F967E" + } + }, + { + "tcId": 988, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5D05BD7DAD1F513E975A90EBDCE8F1C", + "z": "BA6D548D8512A58E10A360B1E187FF137250AA77CF32AD4FAAEC30C0", + "l": 1024, + "algorithmId": "50B2ED784095F7AE5F08E8B0813D032E" + }, + "fixedInfoPartyU": { + "partyId": "6446FF5C6F000700477F9F2753882D17", + "ephemeralData": "60AAE0407F734AFC2149B7773FFB1D671E1A67BFB77628EF6D14D503" + }, + "fixedInfoPartyV": { + "partyId": "38689B1205284C597F892BAE5F8EB433", + "ephemeralData": "8F2BE67C943B70BBD80B83157E0E2D9461B95C42FD47E42F05EA9928" + } + }, + { + "tcId": 989, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6A9007A3EF505BF63C29C72B595701D", + "z": "7616E36AD8058A7A3C01E652FD7DFEACA02E1F65851F4EFF82B593A1", + "l": 1024, + "algorithmId": "2D2F9B4558B255B57976E47CD6472D75" + }, + "fixedInfoPartyU": { + "partyId": "53501050CE2EADE6B2B7DCABB5FE37EE", + "ephemeralData": "B8A517CB46D0F479202E96A8371B17DD8D165C6DFF93ECF887C1B722" + }, + "fixedInfoPartyV": { + "partyId": "803EB66B4BF6EF542C486AB13A69EB32" + } + }, + { + "tcId": 990, + "kdfParameter": { + "kdfType": "oneStep", + "t": "951B3855EEC43E735B0DB450903FABDF", + "z": "5F21731E36296C076075D746DF8D7296FC073720109BBC65B0DDB187", + "l": 1024, + "algorithmId": "89A264127ADC2609C46B2C9E95CF2CEB" + }, + "fixedInfoPartyU": { + "partyId": "19702E102324F28760F3470BD06F7D68", + "ephemeralData": "B354572C7E4EF137C8A3A73B9AF191A6881A8EBBC37EA7E5B001C510" + }, + "fixedInfoPartyV": { + "partyId": "B94F0CF1D583AF1FAE0E890FFCD84F51" + } + }, + { + "tcId": 991, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26F09F560E92A888C30DD49D68FDC27B", + "z": "755A5272F6CED8AA45E0A3AFBB9B920E2210650A40EA46507BF1B8BA", + "l": 1024, + "algorithmId": "2126A78FF34DBEC3D8CAFF1DE3167FCA" + }, + "fixedInfoPartyU": { + "partyId": "375EBCD834D0ABB6D63926CD2382BC6C", + "ephemeralData": "D30405C459E754EDE24DD374EBFE09FBE9E17BABBFB25FD70CF5B4EA" + }, + "fixedInfoPartyV": { + "partyId": "AA2263CF5D9568659D8732977AED6DAB", + "ephemeralData": "3E0C866081C852678E3D13DF5AD2489CCD95D55410E86349D2A1BAEC" + } + }, + { + "tcId": 992, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D4B333961505B584E48774C894B7843", + "z": "786526ABF73CA21E6DE502F6BC4E0AF24D49635CBE3896078BD84CE2", + "l": 1024, + "algorithmId": "B108DFF328647AE8AB4DE7D3BD74F46E" + }, + "fixedInfoPartyU": { + "partyId": "E92C8C3FADAA7C07A645472EB472EB96" + }, + "fixedInfoPartyV": { + "partyId": "31E1DFE10F40FEDE4D376A940C4D5CFB" + } + }, + { + "tcId": 993, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29CE9D8774D3B38C4F7D7875FC0EFD48", + "z": "5B2C33C4EB82BF50AA5B7472A82475AAF9C8CEBF63471D1377AE8768", + "l": 1024, + "algorithmId": "F4B027FB37E67ADC9A41CF0EB8834163" + }, + "fixedInfoPartyU": { + "partyId": "A73CABB52BE1397973CFBCAC3E12CDFB", + "ephemeralData": "92382FB0A6ED4C89BCF267ECF1DFB3C304A9D8234213022B8F16A484" + }, + "fixedInfoPartyV": { + "partyId": "E389FCFECAD0CC158F3F3BDB82A5F530", + "ephemeralData": "9620DB5073872927332E1181C9FBDE70B73726EB4943C93A0286B66E" + } + }, + { + "tcId": 994, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3038F49A736D07BAAC22242C15E956D0", + "z": "439E435729D2F7924609A91DAA042AF942DF3B19ECEBC8745E0F932F", + "l": 1024, + "algorithmId": "91E3923C3DB38F41700CA94B59F07A4D" + }, + "fixedInfoPartyU": { + "partyId": "F0FBFD6A071C8482A80D83564DD6993B", + "ephemeralData": "8C98275B1C75EC926580B1A7293107E6C1379DF2EAF156C30290B3DF" + }, + "fixedInfoPartyV": { + "partyId": "E56362E44278410E8F77E4E1FB95DB01" + } + }, + { + "tcId": 995, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6736B6EC4D8B51638354AE5ABC8BCBDE", + "z": "527BD30DE5AFF5A0FECFDD765F0824A3DF819444942E4B7C99546C7D", + "l": 1024, + "algorithmId": "F2CF1D2A06FF536C9BDC6BA4DE576194" + }, + "fixedInfoPartyU": { + "partyId": "C678F69C927536C9BE88971DB5AE8FE0" + }, + "fixedInfoPartyV": { + "partyId": "D0A88C6EBD88C637E60FD72B483EDF74" + } + }, + { + "tcId": 996, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5AF7077A19B2F5B20FBBD9DD66D72F4F", + "z": "82FFE7D955330F9DE9DDBFB957BB2F79D1B8B2C865FD5174F9BDA058", + "l": 1024, + "algorithmId": "0BC8D01BBCD011EB9D060478B2F6952F" + }, + "fixedInfoPartyU": { + "partyId": "2A9D7132FE96CF137B63751AE423EC51", + "ephemeralData": "29E94440CB04B6D38FDC137A518D1F676C49BD0D2ABA605A398395EA" + }, + "fixedInfoPartyV": { + "partyId": "B70DBA688BF6487C51EE3309722BB7DE" + } + }, + { + "tcId": 997, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34D7B9E6AB1BC1DE19D497787088489B", + "z": "92E2F703C53E25CEB426C4C374AED28B151A5396A2E91C279B091A6F", + "l": 1024, + "algorithmId": "43F1711555BDE957774E0454C111D85D" + }, + "fixedInfoPartyU": { + "partyId": "24DAE65F7F1B5667FBE689119E90A2E8", + "ephemeralData": "A86D0DB3EB02037BC3F3B95739309743DC4A65229222E8A7130C8EBF" + }, + "fixedInfoPartyV": { + "partyId": "23EF0B6EBA417ED6694448194AE855A7" + } + }, + { + "tcId": 998, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A2A21F414129EF2003C8334C9C4418B", + "z": "F9858F510B611E9C70A6D1ED0DA7BD7530895DBA350C47EF143C9BAD", + "l": 1024, + "algorithmId": "35BB9346BDB02EE642AC5C9777908D8F" + }, + "fixedInfoPartyU": { + "partyId": "D60F8F354445A756AB104604C44D9749", + "ephemeralData": "8C46B6FCAC2F2BC50F22EB12C160C230398ECEBA7B222705F6348B0C" + }, + "fixedInfoPartyV": { + "partyId": "774A482A704402500345128A0E0C3B61", + "ephemeralData": "A70F705C7D1EAF80C17E1996E04FF9875CE034C7ECA42282E5E42571" + } + }, + { + "tcId": 999, + "kdfParameter": { + "kdfType": "oneStep", + "t": "920860429EA727BF986685228204AC0E", + "z": "CD8BDADC8F0B63BE9E49A49055DB5643F63CEB8537C4EADCFF641983", + "l": 1024, + "algorithmId": "AE3ECCFF34B4C5BE4EAE2AF54A724315" + }, + "fixedInfoPartyU": { + "partyId": "36FCCCE824D13F68E6B122BC5E0C1082", + "ephemeralData": "D251EDF5A5213ADEDF75B4F65F0122D40D20D36A169D0D514C68546F" + }, + "fixedInfoPartyV": { + "partyId": "4E52486E03318122866D46D566F2B625" + } + }, + { + "tcId": 1000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80BC818495495F65CF35ADE4BEAD66F1", + "z": "0C5B308497B15F158514B454A7E62B423014776BBA6B49254D4D4C82", + "l": 1024, + "algorithmId": "C91AABF131E8281B8A9B376CC100B945" + }, + "fixedInfoPartyU": { + "partyId": "6D53F2FBA8A4CC5DA5AE676C990506EE", + "ephemeralData": "0F8749417CDAC47A7164CC5EEDF4C9B59A236A366DD040A2783A8D05" + }, + "fixedInfoPartyV": { + "partyId": "FD352C34C54C9420A27EFE440B228A6C", + "ephemeralData": "80CACD524AB7561747AC00C0B95836BEB3411FFBEF269CBAAF03A70A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 41, + "testType": "AFT", + "tests": [ + { + "tcId": 1001, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8A1B52A3CE4A1601419AAAFDDF1B005", + "z": "737416A2CDFAC4DDAA23AFFF66AE96A1D74253C2DA1E489CDC51886655E1", + "l": 1024, + "algorithmId": "7082C1CA3EC9159D97B058B802E2146F" + }, + "fixedInfoPartyU": { + "partyId": "C6E8D4BFA913281FF95B755CE173E76D", + "ephemeralData": "EB7A9BD646B43A2C7A61E0DA6DAAD4863A838DA17736C5F2B5C38E4E0088" + }, + "fixedInfoPartyV": { + "partyId": "6CBAFD261C8032A9E5251619FB33DB09" + } + }, + { + "tcId": 1002, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C18BD3C7A1D0813ED8290FA7AF6446D7", + "z": "951540FB5EB5200D62E7BDAF9185E48EA951B7DE4394CD51921DB6355508", + "l": 1024, + "algorithmId": "8DE40615C2B490B26C36E5C23936DF30" + }, + "fixedInfoPartyU": { + "partyId": "7231641A97F4446F2DD0BFBAF204DFA5" + }, + "fixedInfoPartyV": { + "partyId": "B71197BF011447A5D9CE24351BEBF394", + "ephemeralData": "B02CBB77141936BB6F79294D66D742EFA94850C86B215714CFEF5EB2FF9E" + } + }, + { + "tcId": 1003, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A008C6C7A440CD4BA7C68E8EABA9C4FE", + "z": "EC54CF9C5F964AC767E0A7753539D95BE0B523DA70493A9CD9F7B684218D", + "l": 1024, + "algorithmId": "6C8FA296710414A1CB90949CE7075DD9" + }, + "fixedInfoPartyU": { + "partyId": "A3B41D616F282574D81E74E4640CDB03" + }, + "fixedInfoPartyV": { + "partyId": "E5CD3D971F395A25BF6050916A66716A", + "ephemeralData": "DCB9E419BEA4AB8A7181ED5D326DF296A906717F50C061BAE7FC5016FF6C" + } + }, + { + "tcId": 1004, + "kdfParameter": { + "kdfType": "oneStep", + "t": "781D7C6F5EF1B306701DA44463DDEF3E", + "z": "CBAE6CF91C61B125480633B4EE1023D15C98FF284629A5A89CA6194CF9D1", + "l": 1024, + "algorithmId": "4810C917E6B01D57B42AA01F008D7F56" + }, + "fixedInfoPartyU": { + "partyId": "1E7CFE3A3846A1A1F77C1D1537FFDA44" + }, + "fixedInfoPartyV": { + "partyId": "F63CA28AB79AD38872EAC8814DCDE1AA", + "ephemeralData": "173FE2498CC51412C37DE08A4F434335270ECDEC134D19A6B34760004D01" + } + }, + { + "tcId": 1005, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E19BC686EDAE3A719CA44C530CE2E0BB", + "z": "D73B732C197B2D6345A5FE6D8B383C34678CAA9ED973573724F433273801", + "l": 1024, + "algorithmId": "260A3790FE91025BF3C4E9AE9DB61F7A" + }, + "fixedInfoPartyU": { + "partyId": "F9AE79988BA89731D71058FDAF66956C", + "ephemeralData": "AC1955D659602CDC6ADC43086D9C1BC4F8DAB7FAD5BC3C9D59FBB5720609" + }, + "fixedInfoPartyV": { + "partyId": "1F15834173C93C7122C86D220A817EE9", + "ephemeralData": "29697ACBFB7A5356D6CF367BEB0F224782A154462A9F32B6A50CFC6FE49E" + } + }, + { + "tcId": 1006, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F51B680F82D4779F5B57B4E8B6C1CD1B", + "z": "0642086EE9FBE3157DA42E59E5FAF0ECD6AFB53DB08A7DE0BAE693008D41", + "l": 1024, + "algorithmId": "385B68249BFE1E00B68917800D455297" + }, + "fixedInfoPartyU": { + "partyId": "A276372C43EC6052C767975A090297A6" + }, + "fixedInfoPartyV": { + "partyId": "3AD84CFD981D77C351ED0F2987E38BC8", + "ephemeralData": "542F4A2096B815877C7F5F7DA53C586CDE506041F8933289547CA6B2A60A" + } + }, + { + "tcId": 1007, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79929761194B30FC9E0D3E48421A6DB3", + "z": "7E17F73517CAF12E7D37079346C3009A38598949FD775AD49EF7BA0372CB", + "l": 1024, + "algorithmId": "B7DA18481C5A9CA33F98622731B5D730" + }, + "fixedInfoPartyU": { + "partyId": "83F54ACAC09915BF1F15D550E00A0CDD" + }, + "fixedInfoPartyV": { + "partyId": "43DC69E0F011444E428A031B554B96C3", + "ephemeralData": "DF2F0491029D7F09C228CB6171D246FCE3B2776E7E86A4EAC4E7797F3D1F" + } + }, + { + "tcId": 1008, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5CE61D4213A374003C32D782263881E", + "z": "A4B8EDCAEEAC0CD186AAA48BC2E955A11BB146072BE599DB4679B48F7F13", + "l": 1024, + "algorithmId": "7B46BEEB45EFD28D79C6F2250AF26F3A" + }, + "fixedInfoPartyU": { + "partyId": "7C254C3DCAADD801922F6B324A032BA4" + }, + "fixedInfoPartyV": { + "partyId": "E1ED7B8A0882AD8CFA2AD61138E59625" + } + }, + { + "tcId": 1009, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB4FE74E2A1628AF4EF8F40E5C1D176E", + "z": "28260A4FC702D3359ABC12404200F9A9EB8A09F3BEB3349D9596D3F06BAC", + "l": 1024, + "algorithmId": "769199AEB52E448A40523C33FF15FBC8" + }, + "fixedInfoPartyU": { + "partyId": "EF0150A8E87AD8E0BEA9420952F5A2F1", + "ephemeralData": "F2D3986761415067E2371350CC8B0E9245CED01D36111F3CA70C2A1C7EC4" + }, + "fixedInfoPartyV": { + "partyId": "ED8C0BF733B8FBE5FD098B8B0313D1E5", + "ephemeralData": "EA045B54E78E0506BACABC4B501F4CA440AAE8CC16E28CDBB1831CDAE792" + } + }, + { + "tcId": 1010, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1601F27C856E02492754C72A2DE8BABA", + "z": "4B89B66A076292FA60F4DED5FFCF20E8E88921CF93E4A039FB65840C16B5", + "l": 1024, + "algorithmId": "527D6C3F52CB0BA0D0D1F7B8B42EB759" + }, + "fixedInfoPartyU": { + "partyId": "32F797494881BFEDF960299DB509AE54", + "ephemeralData": "16AB5D1611D6BFBF4BD418213E991682905D21791C5522231C7CB64E1961" + }, + "fixedInfoPartyV": { + "partyId": "D7E60D4893E691D7943B9D09692F9B62", + "ephemeralData": "024132906705DBE586F4F1DEB93E76C5066BE08E5A16C81AD558B031FE2E" + } + }, + { + "tcId": 1011, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D9B84AB400B7678ABE0E50CCD72B340", + "z": "CFAB0953F1A70177D706C469BA070D7CD885896B36EA452F96FF96391BB6", + "l": 1024, + "algorithmId": "AACB24ED561B1963690FB780CC9D87E7" + }, + "fixedInfoPartyU": { + "partyId": "577AD6E22D84A9AA34EAD1A0EE7DDFBE", + "ephemeralData": "F4D840C00FD223AA38970B8B781B9926420DEF38A3DE27D71AF138FDFA9F" + }, + "fixedInfoPartyV": { + "partyId": "45B22EC1C7A6C4CD96AD0FB3CC4F87A1", + "ephemeralData": "76D064C7AA84EB178F419FB102E94E975AE165DA4F678E4CEE5EC7945D66" + } + }, + { + "tcId": 1012, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F297CFDCB3F8159FEA8DC7FF6C9E9BBB", + "z": "4D199EEC31AFA84DF46E2EC75F2FB12AF68A24E8BC18F2667915FEA216EA", + "l": 1024, + "algorithmId": "DC041803D0766F7BF10112B38B1C3C6F" + }, + "fixedInfoPartyU": { + "partyId": "68DE4254AB3441C70676ECE684D7AB15", + "ephemeralData": "A0C2F98597283B3D10064D3CA7CAD8C88DE34FFAC9F58369077D8447EAA8" + }, + "fixedInfoPartyV": { + "partyId": "B77B23F0016EA498C9D2B443D146C90A" + } + }, + { + "tcId": 1013, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3386A5CD5193A99FC7B30F711065B7C3", + "z": "DBC85A62002FCB03EFAD6D24248D08E6B7CCC0CE7E458042531BA415E3C2", + "l": 1024, + "algorithmId": "499E8580365BA141E22C5B0402C7E3DA" + }, + "fixedInfoPartyU": { + "partyId": "F341F2CAE4756F2DF9709C73281A9B14" + }, + "fixedInfoPartyV": { + "partyId": "B8E7F11A754AE0D3861980A9C38BC3E7" + } + }, + { + "tcId": 1014, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C9F11C5B588027B084057BEE477E07", + "z": "D61A497B02515E4BA50A1AB8ADA720ACE7327E7E296E2A547DDC3C12AAD8", + "l": 1024, + "algorithmId": "60AD888D6262FBFDFE3172C9A2B3D664" + }, + "fixedInfoPartyU": { + "partyId": "068752801D2A89837076E2893E320BE2" + }, + "fixedInfoPartyV": { + "partyId": "100B02DAEAB45F331AAF396EB337D43F", + "ephemeralData": "A885C183552483D17423E2743B844BD6F925ECEF2E2A36AAC95EF44B7246" + } + }, + { + "tcId": 1015, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FF78057EAAAE5102EE5427B9FC08DFC9", + "z": "202A7F70C4C3D77F5769C89EBA4BE9F27D1D36E873C704A4FFACB615E2A1", + "l": 1024, + "algorithmId": "2339A3A75DCA03ED2FCAD9D172B318FE" + }, + "fixedInfoPartyU": { + "partyId": "1E3E4534033BC977828DC5BBCB8BE8B0", + "ephemeralData": "22658DD543C85B2CC151AA00C2A7D9248FE8F23E624A95AF66C35FC55F85" + }, + "fixedInfoPartyV": { + "partyId": "904F627135DC81EDC16520EAF2A59839" + } + }, + { + "tcId": 1016, + "kdfParameter": { + "kdfType": "oneStep", + "t": "812F12339487C0A3634F7E8FC816D52E", + "z": "495229E11F1515E5102F6288F77C4381E558652BDDEE6718A2D7BE2EE304", + "l": 1024, + "algorithmId": "8A26B93B22E1674E4EDDDAEA84836593" + }, + "fixedInfoPartyU": { + "partyId": "EA52B2D9AEBC8BB3688A581E5F383C1B", + "ephemeralData": "3680A5FD4414B829C7F82CEFC2A515EEC0B7A819FEF452CD893B17433EBD" + }, + "fixedInfoPartyV": { + "partyId": "BF715A2A0D6BB2DF310EEB24142BC232", + "ephemeralData": "9CEBC13CE27306039BA37C56CBBDD1278CF7038B14F512BD63F03499CECB" + } + }, + { + "tcId": 1017, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5D317AD8289E9276F14BDCD99A72B58", + "z": "220575AF1A67112A700ADBA40056F8C63FC7D7A3EE5241A08367348A25A0", + "l": 1024, + "algorithmId": "D7F42EEE4D041FDA04A58F5ED6897CCE" + }, + "fixedInfoPartyU": { + "partyId": "3D1ADE46658AD46FBFA3C8AC4F4CC257", + "ephemeralData": "29A451CF919654FD93788BE097303C2BD34DCC79FB30AAF873AC2C9123E7" + }, + "fixedInfoPartyV": { + "partyId": "F32ACD7CA4544EAAF57352C8722AF64C", + "ephemeralData": "16D33792EC3AC8D90BDBA182AE0605A6A41A963C25542FB1394716295E01" + } + }, + { + "tcId": 1018, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C427DA5D50D085117FD711BFB8103CC9", + "z": "FBEE77B2150DBA9A53CB4832653045BB1D3E920584AAB20ED86182AE1454", + "l": 1024, + "algorithmId": "15647C1F756DF9A37E4BBFFDC495E4CB" + }, + "fixedInfoPartyU": { + "partyId": "440B3A0E5E2DF1B3E1CD0A21A9D1C820", + "ephemeralData": "446C1B41B14E78B1FC95C13D63AEC396254C75F47A01F8DFA8F81F8AC9F4" + }, + "fixedInfoPartyV": { + "partyId": "6CD88F20B0F11F28DB64AEBDD4C8AE5F", + "ephemeralData": "DBE4CF1D3BD25FE86777AC461BBC8CC46746D11218F8AB83CED75F9B96CB" + } + }, + { + "tcId": 1019, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0B05350268AC4F341657EC3A2C0454F", + "z": "63041E460D1B887916BCB27FB3CFC94B4811CD822D2339CFDE5466EF54CA", + "l": 1024, + "algorithmId": "5E90E08176C7FA88AD898EE23A4F8006" + }, + "fixedInfoPartyU": { + "partyId": "97FC957F8676700A29F02CABD74A345D" + }, + "fixedInfoPartyV": { + "partyId": "35B098464B67DAB434FED49C56C078AB" + } + }, + { + "tcId": 1020, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE071DAD750D14251F1DAC23425C542A", + "z": "1FECEE06AC375C65228059446BBEA48104A55FF11ED0F6B155D6A7D5025F", + "l": 1024, + "algorithmId": "A2BC3283EADC5F7E5994FA032CCC5409" + }, + "fixedInfoPartyU": { + "partyId": "BDBA047165A2D4CC155D808A2E5760AC" + }, + "fixedInfoPartyV": { + "partyId": "0AC34F296F789C3D2DAED841B7699221", + "ephemeralData": "A2A5E5E44D00A9886A67835BE53279A261B01AB7709FA946007A76079071" + } + }, + { + "tcId": 1021, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C377F61AEF0C20B1B7739A2676A7DA63", + "z": "68BA31225A26C26905B7AD008C1AFE7A375F4349C90DE694DD1DD444B16B", + "l": 1024, + "algorithmId": "3B8FA27FCC4BD6AE8358C652D4119A5C" + }, + "fixedInfoPartyU": { + "partyId": "30505D69C146861DBA5ECD61875EB768", + "ephemeralData": "9CF6667A6F60A0ADD6D8E49160A42C62BAC3AE8248650CCAF68ED50DA679" + }, + "fixedInfoPartyV": { + "partyId": "0BDC85FB7B94C1DA92AC8BA903F5710B" + } + }, + { + "tcId": 1022, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5791C8FC42D7DE98FDF0BC0992BA2D78", + "z": "5025F5C095530EC247A6A2B366C70467E35C441F359B124CF0521609B71D", + "l": 1024, + "algorithmId": "471F976A9448812B3193FCD3589343CA" + }, + "fixedInfoPartyU": { + "partyId": "AC9CD3F7A8E087F4088DB376F1F06235" + }, + "fixedInfoPartyV": { + "partyId": "EC5730BCC3FBF5D6B1EF15957BD276B5", + "ephemeralData": "374592BEA03F004CA0D4527E0AF5A771EE50FEC12B72BE77B46C6B53BD00" + } + }, + { + "tcId": 1023, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E34E5EE9D1E8D03DB5AA6C03FB09872", + "z": "51B29FA52CBA6D94EF9A8823C76970E62A04465937689BB2A7572CE43E03", + "l": 1024, + "algorithmId": "F0AB1796545A364B05EFD02CA9081414" + }, + "fixedInfoPartyU": { + "partyId": "144C89D714E6CB997E3357501C026617", + "ephemeralData": "1885A2582DEB3D8FD9E844F31F17E912022A7276AA14A4ABC12633AEA6D8" + }, + "fixedInfoPartyV": { + "partyId": "0BBCAD3C7756A4F01D03F9CC55A6200B", + "ephemeralData": "9D70ED4F2EF9E51936D4CC559EFC1F0969F9487017FFEFCF5969C02BD3C8" + } + }, + { + "tcId": 1024, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B454E95FE4239A647E56BA2753B2731", + "z": "80FE0CE941B9EA028617FA207ECCD28D149AB49CA3144C21263B558F00DE", + "l": 1024, + "algorithmId": "DFB9D421D032047D887F404590899F55" + }, + "fixedInfoPartyU": { + "partyId": "30CFFF60EE060AA3644521F1C6BE2FF2" + }, + "fixedInfoPartyV": { + "partyId": "4E143CF99BA4FD58534A2D163270AB92" + } + }, + { + "tcId": 1025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC25E399DE34F70CC805946BE55402D3", + "z": "6696E0329372063398359E7DDD64F50916D0E5BFF5CA87D66F2504F5E6AA", + "l": 1024, + "algorithmId": "BEAFEB724D9391E18144CBD73E5C779A" + }, + "fixedInfoPartyU": { + "partyId": "1FD4761ACD2B6399AAF58CA2C66CFEE8" + }, + "fixedInfoPartyV": { + "partyId": "F0F63D9192EFB311978666BB7A3FEDF5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 42, + "testType": "AFT", + "tests": [ + { + "tcId": 1026, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDAA5A0100D1E5CE9FB7B4093CF498B8", + "z": "953C489B3ADCFD45FCFFD393B4F3B5D40B1CD5A9A79795FEA2D3B360E0C342C0C2", + "l": 1024, + "algorithmId": "E87DAA613D673F964A9B0CC1CBE5B4B4" + }, + "fixedInfoPartyU": { + "partyId": "0F24F8201F0A9921E55808B967A17A9A", + "ephemeralData": "CCD84DDCE0C9F9920D5DCC51B4342E0D0159B50798D6639AC642EC2E18B6A42DF5" + }, + "fixedInfoPartyV": { + "partyId": "5492880EF46DF324B44C81DF971BA685", + "ephemeralData": "74660AFF685E5E8F7FE28C22C29A60120A8B4DEA62233586A84761A300DBF6EA1E" + } + }, + { + "tcId": 1027, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39418541C5A25506580234ECC4D14242", + "z": "7F7D3C86890BDDA37FE88FE00C0F5CF0F6088BE1110C8175185FA5924A51564968", + "l": 1024, + "algorithmId": "E97422477629C0037E4C2B61E3FB821C" + }, + "fixedInfoPartyU": { + "partyId": "CA2446F6B377AC719CAF9E22CBFD0EF0", + "ephemeralData": "40B85C893418349B72AC51D33C8DD3218C033991D69AB5A7D26EBA872C312950CE" + }, + "fixedInfoPartyV": { + "partyId": "3E1A9A02FAF7505D4386C34D54EBB8EF" + } + }, + { + "tcId": 1028, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B07887076E6599546D06718190EA626", + "z": "B6ECBE8A26050E95866D8E72985B775FB4716C2A983F8B0E131E6E110C5D8089A8", + "l": 1024, + "algorithmId": "E5DD6043B7A6BD742E010C5EA4DB56D5" + }, + "fixedInfoPartyU": { + "partyId": "EC6AAD90DC0905EF3815D880DFB90E6B" + }, + "fixedInfoPartyV": { + "partyId": "9F5088F7680277D612FA35A2AB1010C2", + "ephemeralData": "3DB97CF7CF1260A9CDBED9C80ADBADC8B118A3E7F691846DA82362873391B21B2D" + } + }, + { + "tcId": 1029, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2171B6930FCCADD14412318AF8E2BBC", + "z": "8C6BE7CBD1F8C2554D118E3BEE86D50A9B3387013F99AED3263B3C70D607281422", + "l": 1024, + "algorithmId": "533558E097EFA48750FCCDC39F6A8F34" + }, + "fixedInfoPartyU": { + "partyId": "43DBD5A774458853EF4B7C2D30CC742D" + }, + "fixedInfoPartyV": { + "partyId": "42EB5B6943AE80BA1686E6D390465E95", + "ephemeralData": "325A2DE9AC9DFC7319458E5AFB25893608B5E680A59C48B29B97898D6D03BB8C11" + } + }, + { + "tcId": 1030, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32247584F2C32976A270C226AE8ACBB3", + "z": "EB4A32668266B08734ED1616E07AD7972B6E05236FF69D3FA027551750957555C2", + "l": 1024, + "algorithmId": "5603B26EACBD0FBFB759468F262AA4AF" + }, + "fixedInfoPartyU": { + "partyId": "2353337924E70D63769C056D3C18EA8A", + "ephemeralData": "425C54BAC92F087D033B92BE31EC38E40B530C39A4EE67C861873FAB52AA9EECC7" + }, + "fixedInfoPartyV": { + "partyId": "DAD4BE88343C0BB5D93E3840AB469F2C", + "ephemeralData": "5434BE7B0655B27C12F9ABCBA7C69A77AB0A74A7BE0FA3D4A7635A0824371A4F6D" + } + }, + { + "tcId": 1031, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BDBECA3BB25B55B76BD8C08E17F10D3", + "z": "3D95EEFF2D4C3D01B573418D2550C4DB667672226F251B327A03BA8FE556C3A0B5", + "l": 1024, + "algorithmId": "BDEDD1FAF7B8198292BA530199787300" + }, + "fixedInfoPartyU": { + "partyId": "4338079871D6667C5643D8970E5A423C", + "ephemeralData": "0805F91D026B26A9F98002CF6817E032E885437AD56E51E3A04F5F27568B27C754" + }, + "fixedInfoPartyV": { + "partyId": "92ECA6E7F2F5F6BEFB1AE6B26D26AB7E" + } + }, + { + "tcId": 1032, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C15C0890F5E94CE79623A4731CD7A194", + "z": "2F8F8EB23909085C41E33D5A3321453451E86FD80D7E63545C131F908D4194957D", + "l": 1024, + "algorithmId": "3AD5B94111438C981EA82356EFF36487" + }, + "fixedInfoPartyU": { + "partyId": "DD0E89A4401EBFC48204AD9424AB9381", + "ephemeralData": "2CF9D39CA21F9A6E9F4086BCC3C3458B4ED4C6A9D9158830FFB157238E3AC35CA4" + }, + "fixedInfoPartyV": { + "partyId": "5716EB6C7C7D95735370F3F4CB310E38" + } + }, + { + "tcId": 1033, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DD1A96FB8DC7418D4E503E69AB83130", + "z": "DDA1444ADF9B5A7969636F3184D9714891547E68B3BC36A72C7CED7EF0FB7D8C75", + "l": 1024, + "algorithmId": "EF7F24E969B3AF4AB303BB0F724D4F67" + }, + "fixedInfoPartyU": { + "partyId": "F5AF2028CD3E6E3B43B2FF83A65CF456" + }, + "fixedInfoPartyV": { + "partyId": "9563E29D522476921A1C44D9F8382727", + "ephemeralData": "38DB8B9EF18D88F18C3FB07DE4691C2357A5AA59409631C34895BE480DAE21735D" + } + }, + { + "tcId": 1034, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5323F88E70E996FD199D4DB4B117CBFD", + "z": "31C0328F2451773DC3041932397B00502F643F15DFED7F7D71F3E3DBFB7ED88C03", + "l": 1024, + "algorithmId": "3141A88FDE5F54B9C1000EE874566152" + }, + "fixedInfoPartyU": { + "partyId": "57E73AAFCD364023E72135C3D002DA0C", + "ephemeralData": "F990031437E2F21593DE1A6C933C3BD3BBBF4AE1CE9263BEBAD373D11AA7F83E40" + }, + "fixedInfoPartyV": { + "partyId": "EB5E5555BD7709FD8F09F28AC8F44F9F" + } + }, + { + "tcId": 1035, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A07B7F5B6BB3A546DE94116F01793AB", + "z": "4857FDC584E87B521E0DE0631B3F5B4B37FFF00DB46D97B4E83CC4F7FC8A88436F", + "l": 1024, + "algorithmId": "C7E2ECEAC4F44F0EF27B4023CFC0074E" + }, + "fixedInfoPartyU": { + "partyId": "4A46B97BA96207DBCFB4CB5863A6547A", + "ephemeralData": "9D3499A2637D5C4070A77FDE9C49B939253FB623B8DC7CA96B7A630C5EC75CA97F" + }, + "fixedInfoPartyV": { + "partyId": "ACE322F33721ECE842481C80FB5345C8" + } + }, + { + "tcId": 1036, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B10A01A81B23F7C17D5991D87ACED95B", + "z": "43750CD9B47DA92FD43250ADA09713A6154F6B37F2AC173A6125727DD619D7ED88", + "l": 1024, + "algorithmId": "38D0848B79D24E76B5F5D7756AAC2EC4" + }, + "fixedInfoPartyU": { + "partyId": "8B8A8BAD7A9E19A866DD62B6AC9EF020" + }, + "fixedInfoPartyV": { + "partyId": "A12D8871F4D4A744A59CDB1173ED0106" + } + }, + { + "tcId": 1037, + "kdfParameter": { + "kdfType": "oneStep", + "t": "49085ECFC92ADB1318C1F63BAF454486", + "z": "6D272C158933481D3E164C0129202DF22B1C728F13F16925FE090BA37FE563DAC0", + "l": 1024, + "algorithmId": "38C6A8236EBA7685FBDFB30E5C35FF0C" + }, + "fixedInfoPartyU": { + "partyId": "688405D08C16B03C38E3B8E04548AD70" + }, + "fixedInfoPartyV": { + "partyId": "42F9E980D85A62A74D8EBF20E830DC9E", + "ephemeralData": "491DC7BC5F885639F7BAEE5085F64F777ACAC4176D893550EDE84A394AD729E1A2" + } + }, + { + "tcId": 1038, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C47311E79B74883B491701168378E221", + "z": "70745DC6FD173D926C3C2D9C257F2C1FC9EC4EE864980D51A7C96CC5AA545A5E53", + "l": 1024, + "algorithmId": "7E80ABA8B85EE386456272A078DC843D" + }, + "fixedInfoPartyU": { + "partyId": "3A52E47FF4C5DCAE765BD42C5049659A", + "ephemeralData": "DCEAAEEC4767C07609D04B9C9C0483C92898F3E0CB548817E71E31B69EF3E5C7D2" + }, + "fixedInfoPartyV": { + "partyId": "D1FBE321D3BC443118AEFC7C8F95F475" + } + }, + { + "tcId": 1039, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F22BAD3D069BE2D80E53BD0B93D8321", + "z": "143419A6F0E7FAC789FD5E78A8CC55708AB7CAFA5042F44F596AC74A27269CA095", + "l": 1024, + "algorithmId": "0627C034303C36EEED7759A627476F39" + }, + "fixedInfoPartyU": { + "partyId": "F43230A346815FD3BCD7DE0123949A0C", + "ephemeralData": "F3C796E5B7DD19D50F7E918893365F432DC035B37AE050609C9E411C8656656345" + }, + "fixedInfoPartyV": { + "partyId": "4BAC59DC877E6485527E86BDCFB6613E" + } + }, + { + "tcId": 1040, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D7C33F713240EE4E1BC70F17F513BEC", + "z": "3312EFBF9810D9F12F0594CC5A1DEFFEB4AD9EED7BD677E8E3A41F35F4AA6F3091", + "l": 1024, + "algorithmId": "88C9B7E76402B046E6D2BD1EBDD2EC75" + }, + "fixedInfoPartyU": { + "partyId": "6FF665E6F9099BAD1CB6931F47B6D295" + }, + "fixedInfoPartyV": { + "partyId": "64F8240B0F5C037A6A9CC5135F44F85E" + } + }, + { + "tcId": 1041, + "kdfParameter": { + "kdfType": "oneStep", + "t": "791195D2CB52B45FB295E73BEDC42162", + "z": "1A4B74DA6AE67A6420D871174334B17086499510340C9A3E3199C9DFA620888270", + "l": 1024, + "algorithmId": "3E79490577832CE146A5BD9AD917B5C0" + }, + "fixedInfoPartyU": { + "partyId": "1F4E7D884DFDBC2B57839858C0830609", + "ephemeralData": "C72BE6978B745A18DD2ED82D8811092BF14FC9562EE26442FFAF105936DDE46144" + }, + "fixedInfoPartyV": { + "partyId": "3365FC741E56581172ADD33D67139561" + } + }, + { + "tcId": 1042, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90078827FB82DE13266B12FC8CE25499", + "z": "E4BA965FC45AE954775FECA12101260E40A8734F27F9D4B3A06BD55CB3D6F1DC33", + "l": 1024, + "algorithmId": "6E2BF9183ECCEB42BE5B4738FD7BE372" + }, + "fixedInfoPartyU": { + "partyId": "6BC3FE713D49EB767F3CBA55083B0B3B" + }, + "fixedInfoPartyV": { + "partyId": "1A1C40A77B735E5E92F0916E056219BB" + } + }, + { + "tcId": 1043, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4663D7F48BFE21E6B2E8C5B189AC676C", + "z": "3EBFEC54037311D3B1D99D063D3AF9FE373F66D95A15A18A374F0985B4A0DF80A4", + "l": 1024, + "algorithmId": "02DA42A924ECA196E0DF0294F8859A9E" + }, + "fixedInfoPartyU": { + "partyId": "BA0C58D22327525D5DE64D3A63287FA5", + "ephemeralData": "B8047ADEB675B3E0DC12B1FDDC3E5AB5D7E19DE24B9674E1EF05E39E0928DDF553" + }, + "fixedInfoPartyV": { + "partyId": "8A7011C6726C4A5D45E09C15E1F70144", + "ephemeralData": "EB43CF15A045B37FF97A18C100A6E106DE6F66104F6DEB284CCB4355E27CB2A3FB" + } + }, + { + "tcId": 1044, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E3122B6A92BCFD08FD11524FD78FA92", + "z": "3D343190CF2696EDAA17B2A83E68DF3008B9EC649F4F4EFF7FF33A982B3D28D2A4", + "l": 1024, + "algorithmId": "5447EAFCF6496F57E739FAF6677C7C2D" + }, + "fixedInfoPartyU": { + "partyId": "E36CEF82C7247D85BFF9280AC229511B" + }, + "fixedInfoPartyV": { + "partyId": "19CEEF2413013E921120FCF0C94386A1", + "ephemeralData": "AE558E60ABF7EA77B009552A74F1AAEE5D432AFD284F8E2AB9A9E607FEF7C21284" + } + }, + { + "tcId": 1045, + "kdfParameter": { + "kdfType": "oneStep", + "t": "368C01322576BBD74875302B66E81AFB", + "z": "393603A4011BF1EDD9BAA471263365B7FB3FD58037F7FC1178094EC5BE470050EC", + "l": 1024, + "algorithmId": "9B8DB4F100E3C53736C977D7C8364FEA" + }, + "fixedInfoPartyU": { + "partyId": "E656117E3319EDDFCC35DD46B3A013AD" + }, + "fixedInfoPartyV": { + "partyId": "C60ED40832D4D16D46AB7A10599B7B29" + } + }, + { + "tcId": 1046, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4F6CB2B5270607699D826C71C890686", + "z": "CB7D08056E733621B0306F2808B71A8CD3627C18F7BDC1C04F921AA34238D43A79", + "l": 1024, + "algorithmId": "B32DEA23BC5BC1493458DFD3ACBB8956" + }, + "fixedInfoPartyU": { + "partyId": "E35DA21B6407CDF6EBE270F515E84276", + "ephemeralData": "90D87F94CB685A12CC381CDE4D93D581F244B74923A76D2088A4CA51DB3FB19F7F" + }, + "fixedInfoPartyV": { + "partyId": "4F83D24474506C701EF19A8CCB698561" + } + }, + { + "tcId": 1047, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7571EB6FDE87ABE161D431FD46E2A37", + "z": "FC76A28BFFBB5667506FEC28C5504FAFC28A7F2E26FFF1EF3C9D7B9C6895926497", + "l": 1024, + "algorithmId": "73044D97B28553955888E835157E6DB3" + }, + "fixedInfoPartyU": { + "partyId": "FA90EF1D513097D1AE9B0A6EBA321BDE" + }, + "fixedInfoPartyV": { + "partyId": "7A4CB19DC046014523786EE206CE063B", + "ephemeralData": "D6E3E534EE54082997B9ADFBF5A89C4FA1C1C577321DBC91F3A1B4A553CF4D1248" + } + }, + { + "tcId": 1048, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83C10CB3371FE076DFBCC9B6C3E42353", + "z": "C54A166D3998798147E18987C48AFB05BABC7104AF33A3D31945C795C909CD5737", + "l": 1024, + "algorithmId": "D52316593ABD8756CAA55978F06104AA" + }, + "fixedInfoPartyU": { + "partyId": "6E72308925E3AA9E5BBE0B1A48010239", + "ephemeralData": "290751BDBBA5DC262E3CFAA0737001756D59BCAC0B2F1B48C1ECCEB0BE3711AE7C" + }, + "fixedInfoPartyV": { + "partyId": "27FE922BA2C3595C32527B8D3868F0D6" + } + }, + { + "tcId": 1049, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03B56680CC593381C41A4B4672A9591F", + "z": "D43E8685D33504576E8BE0FADBAF5DC63A51986397F16EAC63B7125AE68239C1B1", + "l": 1024, + "algorithmId": "061F4C7C7DA28AA406522C69851C89D6" + }, + "fixedInfoPartyU": { + "partyId": "9B1D2D29DD990FF247C41F9D13BACC9F" + }, + "fixedInfoPartyV": { + "partyId": "2F26DDE4DC558E13AEE1B7270508B992", + "ephemeralData": "AD73310E6A6E908A64D81477CE35CDF3CB9AE72A45AD46EBE96798A69C3EDE97F8" + } + }, + { + "tcId": 1050, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D9759FC4631970D7AE51B2A03827C7E", + "z": "67B0584D624E75E0996474D48C31A6B20DE611DCD47EF75694DDE5CE5A72BD0B58", + "l": 1024, + "algorithmId": "0FCFE4825AC5FF0A549493E5835B7F80" + }, + "fixedInfoPartyU": { + "partyId": "8531A66724D36FA596B0B55C27770278" + }, + "fixedInfoPartyV": { + "partyId": "47FE467A975879D9589784C066B34939", + "ephemeralData": "DDD5282AFE573B83CEDF7DB701FC0E1417C84439323FA065E79BF5FDB0BF9ADA5B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 43, + "testType": "AFT", + "tests": [ + { + "tcId": 1051, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02588BD5EA3E74F7EEB351E07D06D75A", + "z": "8EE281AC6AE6B9D37A95BFA5239EA3F2E33AAA3891B3705E45FB38055FA3D114D293", + "l": 1024, + "algorithmId": "CD569154CB913B0C8155242DCA694910" + }, + "fixedInfoPartyU": { + "partyId": "933B663B42F39A82CED2FB2A857C8137" + }, + "fixedInfoPartyV": { + "partyId": "8DDC9990524C8C283B552C7063B598F2" + } + }, + { + "tcId": 1052, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24E8E00F80B36871AD61688CA6CBB978", + "z": "A35DB5734B3E964E6853472898A19961B3CAF89988964DB797803BADF387CD20880A", + "l": 1024, + "algorithmId": "03ECAF6947C7459682CBF2FEBF15B4AF" + }, + "fixedInfoPartyU": { + "partyId": "BBCFE81613B1F5258F0B847C1E8FE03D", + "ephemeralData": "9582C665513F963373118DDC37AC68B84BF3F0012434FD17A51F7AD86071834F7F5B" + }, + "fixedInfoPartyV": { + "partyId": "22B0D0F092F4DF5CA4B680CC200D3617" + } + }, + { + "tcId": 1053, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6632C229646C5970210CB4632216D55B", + "z": "8830A6000302D990A57EC5A431E52222186CF7A15FA62BA995E44FAA8DFEE9C23392", + "l": 1024, + "algorithmId": "8F93596B78EE63682A686E3200C68A7A" + }, + "fixedInfoPartyU": { + "partyId": "74B7117BE00ACD3DC62BCE90A99637E5", + "ephemeralData": "0C8D217E299DBAD7F31FF75387C261697A1DFB0394E04DD1FD596AFD8E618010A011" + }, + "fixedInfoPartyV": { + "partyId": "E507385D795AD1373F99A983072006EF", + "ephemeralData": "CCB7B39E96A69C825083C8C0F615DAFCA5D4BFAF7E2FCD42B76D61184C8A35124D96" + } + }, + { + "tcId": 1054, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18BC18A446AB8FBDF9F78F4253A33542", + "z": "2B9BAD2A2E39604F1BD275524124BAA3A9C3D467303266D077DDB5495F65CABC6AD7", + "l": 1024, + "algorithmId": "78CF2EA41C4458C5CF74E5F00C14C905" + }, + "fixedInfoPartyU": { + "partyId": "D7278CC691BFCB76EDECE31305713A44" + }, + "fixedInfoPartyV": { + "partyId": "CA234CAE7CE80F49F8471895F40274FB" + } + }, + { + "tcId": 1055, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6607BBBB290F2B7C526BA89AE3ACB250", + "z": "96F9CC15836932A2A27853D74BBE811D98AA64AE703AA35889BA02662FF12137B941", + "l": 1024, + "algorithmId": "3E071FBF4FFD0187D1AC785D1EF5E3FB" + }, + "fixedInfoPartyU": { + "partyId": "AA7C0B18C74F1128A94B204DE5E8060D", + "ephemeralData": "03BEB5968AB103C6231436FD4BC47CA763A3AA8C733799348D4EA8E3E1F6A8859D23" + }, + "fixedInfoPartyV": { + "partyId": "1DC29DF00F1792FE3C042517ED742FF2" + } + }, + { + "tcId": 1056, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C230A0C2300F33A65C32D3CB7B23E4A", + "z": "5C18B1ED968397B2B79E73D59B9BBD1EE2E25B8C71D7B3532395289443059B2CC716", + "l": 1024, + "algorithmId": "0BC546CE52893BBCF9B9848BEC1C61A1" + }, + "fixedInfoPartyU": { + "partyId": "A566C88D0FDA19218AAA06062A19063C" + }, + "fixedInfoPartyV": { + "partyId": "9BA135FFA4FC914EFDB9F27A9066EB29", + "ephemeralData": "117439E322E5AD75B72C6014C2CCB2C6C355DE31E92A8E99BC79111318DCB8418535" + } + }, + { + "tcId": 1057, + "kdfParameter": { + "kdfType": "oneStep", + "t": "582982E319E0AB5A2A9E73D5CA1B044C", + "z": "A4D1F403B4E20D487C7AC0E94D49D4CD59A3263B37925D9E1F75DD4954730C8DE7C5", + "l": 1024, + "algorithmId": "743256FC32FCFB76E6CDC3B9A3A71933" + }, + "fixedInfoPartyU": { + "partyId": "B96F239841D5B6543EBAF80126C9156C" + }, + "fixedInfoPartyV": { + "partyId": "8CA91BC1FA3B0CF691CDFE770E55B489", + "ephemeralData": "ABB42C9A93447FEB0A94FC17F4957B3F793D299D24E339EA32F90A19D5587C5D25CA" + } + }, + { + "tcId": 1058, + "kdfParameter": { + "kdfType": "oneStep", + "t": "596AA4089BA5C5C34E542B6B1C9F55BB", + "z": "7CD740174C4CE8E88C4B289F0669D9702F4E4BB952D627C1DC1BE36D7293D1AF0355", + "l": 1024, + "algorithmId": "4789CB96D6D541E420E7F2ADACDBA053" + }, + "fixedInfoPartyU": { + "partyId": "590B71782D698E00BCE849B3B81B9280" + }, + "fixedInfoPartyV": { + "partyId": "5081C4CF968489078587644FEF9034D9", + "ephemeralData": "1EDCE8CA302663BFAC32942E318C460C3EFFF3DC76141EBE1005ACF1277B963026D1" + } + }, + { + "tcId": 1059, + "kdfParameter": { + "kdfType": "oneStep", + "t": "30A17B42A20846C13FEE71568EEF3E70", + "z": "BE4EB4BF70FFB17B3DEDFCBF462E533251165FD538E65B071B49263567E35C8E7B25", + "l": 1024, + "algorithmId": "6A63ACC96BEFF02F011307F73D7DDC6D" + }, + "fixedInfoPartyU": { + "partyId": "A870885893693B44C9090987071D4E45" + }, + "fixedInfoPartyV": { + "partyId": "0C535CD92784EBA56F92BBDE014D48F0", + "ephemeralData": "318616DE6AA1851DE1988B9266BD016BCEE35640F2E45A928402654A29CA0E4287F3" + } + }, + { + "tcId": 1060, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62139265D03106F75DC58581A17C1441", + "z": "DC60843752B39C8FE69DF5E6AAC3C3CA294D2AFC9B61B25CA1D61909DC19451B8A2C", + "l": 1024, + "algorithmId": "2F42F4539B3E74179D22E5A38744627A" + }, + "fixedInfoPartyU": { + "partyId": "060A5CFC1229DFCB630B6516FCD9C96F" + }, + "fixedInfoPartyV": { + "partyId": "52D76983656C4C32A726A3829F50C73B", + "ephemeralData": "76BF517547FE9E19E354B325ED3D10BDFCCFAD9233E98BCB07DE5FB864135151322C" + } + }, + { + "tcId": 1061, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9878482DEAAB04925D62628EA5F6FF49", + "z": "8CB9FD2AE8ADC1ACACF89EB0FA2B7DB9A6A257CCC5978A6120C28FC3FFFC27A2C580", + "l": 1024, + "algorithmId": "991576E85625314658D358C53F095B00" + }, + "fixedInfoPartyU": { + "partyId": "5437CCC5D7006DE2673C499DEED322D6", + "ephemeralData": "A15889E0E7219E4217C3416F09B483AAEE0AD164F5D9E202524F2E0415866DFA8F86" + }, + "fixedInfoPartyV": { + "partyId": "069C7709843AF74DBFCF0C501FBE6EA4" + } + }, + { + "tcId": 1062, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41FEE867907B1D370BD672F357087A24", + "z": "FF4800D6EECDE074D5BC0FA2F6E084C13E226472D3403E62131630A68B5865B6174B", + "l": 1024, + "algorithmId": "80B4EEE9214146E83E7E48FEABE09381" + }, + "fixedInfoPartyU": { + "partyId": "16AB63CA980FE040D8D499284F38D1D5", + "ephemeralData": "81B635100A24FFC1B507AF2816D32CA0FE41F6623C2863C51782A8A77555617A2628" + }, + "fixedInfoPartyV": { + "partyId": "A2ADA318750F82A5A6905C809ECDDAAE", + "ephemeralData": "8081521D9D91A0A6712C9B447EA328888EA7AC8F067884A7B39F59CAFD129AEA0A65" + } + }, + { + "tcId": 1063, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C268AAFCBB78F888AEFADA68B9DCA37", + "z": "B0D93D00287B6B4C2D4661A20044C88B0600021A900101D0A01A3FBD34D065B45E2E", + "l": 1024, + "algorithmId": "C909E23AC70DFFC7AFF332FAD5B7350E" + }, + "fixedInfoPartyU": { + "partyId": "B475F788EDDD05715D0D02F8A32DDC99", + "ephemeralData": "5CC6F655A459839C8FE6BB890E5CD53EF7502892A0F2C452E7A31F53BB2E185EFEA8" + }, + "fixedInfoPartyV": { + "partyId": "C54B657E98BA1A5484DA206A987B3F57" + } + }, + { + "tcId": 1064, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E94608D0C8A1D2742D96C7559FDE660D", + "z": "A3C4D8B9F2733873DF89BF52E6E31C47F6C3C630A6556A59FA90C1ED3DDFCFA781B0", + "l": 1024, + "algorithmId": "2DBF0A437C8C0AE189BA140BE80C1F86" + }, + "fixedInfoPartyU": { + "partyId": "DAA1CDD72B6D5B0F1C78D04DEF62C1CB" + }, + "fixedInfoPartyV": { + "partyId": "A581419D4DB4C90046E82FCA0529C0D9" + } + }, + { + "tcId": 1065, + "kdfParameter": { + "kdfType": "oneStep", + "t": "899AD623D0F921F62F3B5B27C8A24211", + "z": "3F1A22A460EE8202DEFB817DC04CA2EEB5FEDB96986531F77707EDCDC03A671C5FB8", + "l": 1024, + "algorithmId": "0CEA674110C9B4F8C730E8A4F90D36DC" + }, + "fixedInfoPartyU": { + "partyId": "1E8B5ECA0964B0C0B47550D1834AE158", + "ephemeralData": "8FD0F6A414F21DCCFF972C9DE37B90B43F2617D5D2A7FE4BBE5C6B9AE2F73DF8E86D" + }, + "fixedInfoPartyV": { + "partyId": "F28EDD19B52A927517B0FF6001223936", + "ephemeralData": "70FF8EEFE6E1020A6D63DFB5DE24F49B9C172E541948797D16F7A6CB4B8A558ED71E" + } + }, + { + "tcId": 1066, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBF70397F967EA974E1B6C3E8A036BCF", + "z": "86761B772CC71E8ACB1C03B4D39F8D27FB4C0F7816B59F3673B94FDD3D4DF6104527", + "l": 1024, + "algorithmId": "0AF0295EAE816E1F0E252F0821193770" + }, + "fixedInfoPartyU": { + "partyId": "587180997B35CAD1B48E91BCF9191886" + }, + "fixedInfoPartyV": { + "partyId": "291AFC8D87BFB382DA0C91535B69DB9B" + } + }, + { + "tcId": 1067, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE769271DA380E03902EA63966A60A10", + "z": "B0E6AD73698A3A9229B0534CF1F7DA409DD357F78B08E0AB7D9B43B70E3994D4A4C7", + "l": 1024, + "algorithmId": "A1C04BA0EC5F5D40E444C34995BADFFA" + }, + "fixedInfoPartyU": { + "partyId": "E11777874DFBBCCA635201672B76FC25" + }, + "fixedInfoPartyV": { + "partyId": "F9FD0A31B87D7C0FE38158D5B79C52D4" + } + }, + { + "tcId": 1068, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04A587F5D3F9603B1ABE67D586E1F954", + "z": "3206DA71395597E72CC85C62C34DA08F5C3D83F0CF9353D3811441605C1C6BECE327", + "l": 1024, + "algorithmId": "400042AC9536AC61670C4EF7234687C3" + }, + "fixedInfoPartyU": { + "partyId": "766F6C866A935372A099F7249555C96D", + "ephemeralData": "A3DE287BA55DC80F51AD079838A82D2761614DF90FDAECC974F0A2908063B604F898" + }, + "fixedInfoPartyV": { + "partyId": "1D9A4397B4D08233F2C449097B01E2D8" + } + }, + { + "tcId": 1069, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C5A4A5694B4B2B7A6166DCADC265DA0", + "z": "5489F106EAFEAA86A3EE821719B0D100851368035B0A2D6CB80B55453ED11329B961", + "l": 1024, + "algorithmId": "9459F932B3B1E33C5D7EB35C3D4905EF" + }, + "fixedInfoPartyU": { + "partyId": "4CAF5B9BE90112D0D01762C346D07852", + "ephemeralData": "68B2FB2A0705800548E0BA9EC2CD978A08B5A47AB121569BB82E24A7A148AB8849D1" + }, + "fixedInfoPartyV": { + "partyId": "458660AE797BAA952129D60AA801A735", + "ephemeralData": "21C0FAA499663EF42CAC6EB3FE0DA2D27CB8A4A08D261F269CFFCBCDAB0FB3B42453" + } + }, + { + "tcId": 1070, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4E2F9C6FF1E65CC8AE9C5E97300A7C4", + "z": "BBDEBE282612868F1D4034B38D54FF01BD561EF8DEABEC029C5B37525E4B61B2EE88", + "l": 1024, + "algorithmId": "925D5262E49FC0B7EF2530EC5CA72AFA" + }, + "fixedInfoPartyU": { + "partyId": "006CEEDFFCC34D18C8546546FB9F745C" + }, + "fixedInfoPartyV": { + "partyId": "0E43733525CCCE2E217E3BFB90E3F709", + "ephemeralData": "EFEE7FD9E3A3889617D92138612BFBC71F7D1119A13E437166758BAA9C765B7E8481" + } + }, + { + "tcId": 1071, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E754E401C7F3EDAFFB0A7D537415E7C", + "z": "34F61859D1E154F1B6F96068DE27CA9EC0DE77C1D90A54F1800B9EDACBCAC4EE944E", + "l": 1024, + "algorithmId": "30500FCB25A26B6699ED6093CCB6AA08" + }, + "fixedInfoPartyU": { + "partyId": "077D01F55BB6542CA384B0658C2036D6", + "ephemeralData": "93D9D7F0C19EAA14B28345ED5A52578A02D65ED9263ABD85D913CA8D2B7047AAB080" + }, + "fixedInfoPartyV": { + "partyId": "FDDD2DF1E5FFD652C1920B66EC4B67D9", + "ephemeralData": "A2A0CDE6C09E46160890C47F9CE912714DA6E3AEE9522CE317BEC364C225EBB0F2FE" + } + }, + { + "tcId": 1072, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C73C863981EB601F41C72A65D9DC8A70", + "z": "FB29B00B04778EA9732A0A8F4C59DFB94EAA2C5C35E1581F662B02E142F11C95CCBA", + "l": 1024, + "algorithmId": "8AEFF55338C26537458562EEC8B4F135" + }, + "fixedInfoPartyU": { + "partyId": "BE04EA5F6E0BFEAEDAA82D98D360867D", + "ephemeralData": "2CB88ABF13BBFF909E7F378BB5D6CCD5B7E52E6E5B278B52997DF18B3D6D6D5CCDEB" + }, + "fixedInfoPartyV": { + "partyId": "409CA3864F56941AE1D449108ECDE21F" + } + }, + { + "tcId": 1073, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4242310E23036049369274FB889D101C", + "z": "3DB561B781590603441DC8E1EDE24318EE34F51BA84E7F8354E68B7D0E3BD69D2E89", + "l": 1024, + "algorithmId": "A148FAADB580F792C5A55D664C7BB03C" + }, + "fixedInfoPartyU": { + "partyId": "0E44A1E713F1A6A212920D66715C7F2C", + "ephemeralData": "914BC1615D0AD63A4BCFB00A87C3989B7B11C9219C6531770BF6B9D54C9C60FE191F" + }, + "fixedInfoPartyV": { + "partyId": "49D0093CE11B026FB886328FDDB64897" + } + }, + { + "tcId": 1074, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD7B0E82E912696417A94E3CB5F5819B", + "z": "08F179DE2755B916D9807F90F6092F70C6C5DC740A6CCDA06BC2329D320B8E2C946F", + "l": 1024, + "algorithmId": "5B3B980B67D66D87601068237BF12ACE" + }, + "fixedInfoPartyU": { + "partyId": "35F559ABDCAED0F3C3E3684FAC6C76F8", + "ephemeralData": "0420C4BC2EA4D1BF03454B07761970FD1263DB278D9ADCE31B310DAC0478C34C9DBB" + }, + "fixedInfoPartyV": { + "partyId": "00874358E7004D1D9FBF717F45A5DB22" + } + }, + { + "tcId": 1075, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBCB260D63A0333CCF9823E8D5AB6FB7", + "z": "31C21CA05E6040C2F643A9D72B5ED8FB525C15F2FB49E1A3FCA264691A1DDABF8642", + "l": 1024, + "algorithmId": "D1BB490BF40D8E43AEC20074FEC6DBCC" + }, + "fixedInfoPartyU": { + "partyId": "8A414085B680EC3246059CB3E18A84B2", + "ephemeralData": "56D5FF81708D28EBF818D25E9E7A8B6D49171E865B44042957279615AF177CF32BBB" + }, + "fixedInfoPartyV": { + "partyId": "97FA90EE42DC448C4A74D49AB4CFF1E5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 44, + "testType": "AFT", + "tests": [ + { + "tcId": 1076, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B19D699600CD96DF5989CDF9A877ACA", + "z": "CDCFCDDB1D3ED4EDDE2C86593DFE3AF511BF20F6C9F26BA175ABB2E986BF6D", + "l": 1024, + "algorithmId": "349ADB5B868A84476630D9B48B346D8A" + }, + "fixedInfoPartyU": { + "partyId": "D5A2D3ED2FE6051F82B1559B197F6A70" + }, + "fixedInfoPartyV": { + "partyId": "9BD3998D731599E04184BF989B2617C7" + } + }, + { + "tcId": 1077, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CFAE028C732A1F3CE2D9FA7EE876510", + "z": "E165DB32C1406D70C4B8BB12D9F52CEAA1F56E9503CEF79CFFC1B5DE584E94", + "l": 1024, + "algorithmId": "A251554BA9A50B53092D0DD4B40E9A10" + }, + "fixedInfoPartyU": { + "partyId": "5F979BD8F6EA664FEC72FDFC15381173", + "ephemeralData": "D4EBC2D1AB8909B9ECA4DF368390ED92C1CCFF7570E88ADBB0E707329A4800" + }, + "fixedInfoPartyV": { + "partyId": "4F7702157239872A6BAFCA9231C3E1D5" + } + }, + { + "tcId": 1078, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26B0FA6570EC80CC9A9E82700811CC25", + "z": "1C75438C2A01C1FD0297176ADC07963155420230501DCA4ECAAA9C1C81FD12", + "l": 1024, + "algorithmId": "27F37FB2891AF1A681E52F0DF69B5F7F" + }, + "fixedInfoPartyU": { + "partyId": "976E31533EC3017A8BD7FDB477F340AC", + "ephemeralData": "CBAF595469627CBF34A1CA0EF0A400550A3E809A5B84FB7A0F451D5DD9BA2A" + }, + "fixedInfoPartyV": { + "partyId": "FAF07B79B9FDE4FA8FBE9B8962A06952", + "ephemeralData": "43BAE7CD29F51442BA81DCDF3108B84B21BADCBBE11A8689BE897D8D52E9B8" + } + }, + { + "tcId": 1079, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D37EB70AEB351B5637334F909DA466A3", + "z": "21AB9205E4A41F97ACA7C71657981D94C678039679AD34A764E97C4FEF19BD", + "l": 1024, + "algorithmId": "7DBC2B2733F501C12B97C7213BDB52E7" + }, + "fixedInfoPartyU": { + "partyId": "339CD5E269FD01BA016C3C0E7521820A" + }, + "fixedInfoPartyV": { + "partyId": "88145F05D730576C150C685F71CEA055" + } + }, + { + "tcId": 1080, + "kdfParameter": { + "kdfType": "oneStep", + "t": "740F6FB433ED428B5F97CA2814D5CAE3", + "z": "43D4E62ADBC9F19328B02BAAAEACEFE6EC0AD179BC37E3D06AEBA09A098E33", + "l": 1024, + "algorithmId": "5F0B95D38138E895F707D46D6629895E" + }, + "fixedInfoPartyU": { + "partyId": "8E1E0EF030045FF7BE708B454EC3D825" + }, + "fixedInfoPartyV": { + "partyId": "0FEA4010D6A97665834964C007430756", + "ephemeralData": "1FE7E7C614E0CB7A74643B90DFD35B3BD285387F264AB6EE7F5AA6BC0DA097" + } + }, + { + "tcId": 1081, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B7C34A623ACD151237A124CC20B313C9", + "z": "76C5E01415D343D4AC8A8A66C01B258ED06F6CFFF1C7B7F05BA2853F3BB28A", + "l": 1024, + "algorithmId": "A9B385992AEE663BD900AD2A280AE5F9" + }, + "fixedInfoPartyU": { + "partyId": "CAA2330468C3B82623744AE79F36A2F1", + "ephemeralData": "A0A722C7AE9AF7B143E8CF355CFF50F210478DB2FB6605FF2C5C8947153F45" + }, + "fixedInfoPartyV": { + "partyId": "997178E3E2A00946672EB0A0CE7208A1", + "ephemeralData": "385F062F2B169822416F781BA95AC55EDD65AEEF5063FB5DD3954633B376B3" + } + }, + { + "tcId": 1082, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2BB6BFCC3F633627D5832F26F8F1EAB3", + "z": "B42FCF49EECECDE9771F2D7B1C13F99E172D05B70119E3BAAE7C2FC59BA7B5", + "l": 1024, + "algorithmId": "39A2364347FA9399806E328016A45119" + }, + "fixedInfoPartyU": { + "partyId": "D0CC2E0C15373C360ADC9A9C91CFDCDA", + "ephemeralData": "BB6A0AF63FE6091C037B9B35DB2765B3EA648E60F8B22F95FE3BA2B845C41E" + }, + "fixedInfoPartyV": { + "partyId": "A8A9E3E86DFCD1A138FCE90A2AF4FE01", + "ephemeralData": "391B0E9F6439EE69CAE03A9962F7F6C48A08FBBCAF28C1A35D9AF007A7614C" + } + }, + { + "tcId": 1083, + "kdfParameter": { + "kdfType": "oneStep", + "t": "656E0949566608EAB7880BFAEF1E1C14", + "z": "FF3A606B1F055FFB3872AB207209AE4F439E01AAA987DD9C13EF726CDCE180", + "l": 1024, + "algorithmId": "DEC525B34B97A8374891C6730ABDE706" + }, + "fixedInfoPartyU": { + "partyId": "B6DE6272118108246C5849D2CB31392E" + }, + "fixedInfoPartyV": { + "partyId": "A23CA8CF6C0DE1A80EBA4E963FA816C5", + "ephemeralData": "6055004A682ABC77EB97BF924AA6D34F8098C6602A174D9C560670D3CF707B" + } + }, + { + "tcId": 1084, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEAC3C9FA0BF68B3DEFEC8EFE6DA3070", + "z": "43854E3ED9123FC8CA258CFD470F83F64D9F7684F58F69E9384BEB43A0D463", + "l": 1024, + "algorithmId": "C808AE59F3FC44B2E2260DA78DF03E90" + }, + "fixedInfoPartyU": { + "partyId": "6779D2607CF1F725DCC40D848F1E9875" + }, + "fixedInfoPartyV": { + "partyId": "E49AF971D903D8093D51AEF48F1CC91A", + "ephemeralData": "FDB403C0357A51CCE981B4688523C5AAC6F56AA99B062232BFE8C80F58EC7F" + } + }, + { + "tcId": 1085, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A214CBCF3CFCC6FAE79AEA4410015CB", + "z": "5356CDF7EDDE7010F010DCC89064CBF173F5E0951AD5F40C3D874CE716A52F", + "l": 1024, + "algorithmId": "33ADB245BFB75EA3104A9DC45D8DE9BE" + }, + "fixedInfoPartyU": { + "partyId": "CDE394CF4CF4D743E7C69BA0901D3C56" + }, + "fixedInfoPartyV": { + "partyId": "9D3E46996D7706B41EBD58BC5728DE59", + "ephemeralData": "91A97A4F95EB715FE49AFB2EEF9E73118C7C21C3E8F14C7D0455D365C359C3" + } + }, + { + "tcId": 1086, + "kdfParameter": { + "kdfType": "oneStep", + "t": "061C8CE99F17ED94C006E23032B94825", + "z": "366EEDDC376EE872079989344C27D991CBE964AEB3A22AC8F68E848567F0BA", + "l": 1024, + "algorithmId": "DA50E0C59B94A2B4200E05CACC2EEE55" + }, + "fixedInfoPartyU": { + "partyId": "5B582F8E07F1519656CB78D5E08E8527", + "ephemeralData": "43799298E2B5D10E18F508D6288B6BBCDA1957169DF5E8217CE840C1C68522" + }, + "fixedInfoPartyV": { + "partyId": "3F402D83EDBF119DE775A868BA8C128F" + } + }, + { + "tcId": 1087, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1F31B7297BBDA1229E855D2E480F8C1", + "z": "6073B23029E6EF2340FB78F67C4256DF9EB9F261EE89CE3A144016B9245555", + "l": 1024, + "algorithmId": "C63E3ECD96A333CCD30A6D0A3C10D778" + }, + "fixedInfoPartyU": { + "partyId": "378767491545E381AF851A7741F13FB0" + }, + "fixedInfoPartyV": { + "partyId": "5A88E4172FC900155939FD9F3040DC3B" + } + }, + { + "tcId": 1088, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8F258060631F2AFBBF8C50E41BB38AF", + "z": "4A12E7C37550F506415D49FB597E62351E327E288899C194E64CE329A5DD72", + "l": 1024, + "algorithmId": "4F6E2818E868AD4C501818B6240CEECC" + }, + "fixedInfoPartyU": { + "partyId": "3CCF3D74802752636B44833A768FBAF4" + }, + "fixedInfoPartyV": { + "partyId": "AEAD22D792349E9C148FF6FE88A4FBD4", + "ephemeralData": "2F8CD90FE59E6100C4F6C26DEBEFF81325C9CCDD21A9F6121DB1E3BCEE6E94" + } + }, + { + "tcId": 1089, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1ACE432CCEDE3A1F0C87332B0C40DB7F", + "z": "BE30B60434E9D85C031CDA210E1813A950393EA751706A455D596212F06B52", + "l": 1024, + "algorithmId": "6FAC0931A0CEE902EBFF953E53F65F8F" + }, + "fixedInfoPartyU": { + "partyId": "CEDFE1BBA1FA7E250C9918C64EB41BBF", + "ephemeralData": "7A487AE0A3E80C79918AEB898C91B1398E5825783A9467353FAC3413BB35E9" + }, + "fixedInfoPartyV": { + "partyId": "00935F845F18746E8AAA75811A4E1BF8", + "ephemeralData": "190D2AD3151E0706C40D3ED65D41191FBA5F094C0742A35FF944524F09676B" + } + }, + { + "tcId": 1090, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F0FA666A4AA3184529CB449E824047E", + "z": "872B794D82F5670ECBCD0387723AC0FB89DC76B927B98EA452AF7BD6518D38", + "l": 1024, + "algorithmId": "365B8178DFBBED6EEED0237E064704C3" + }, + "fixedInfoPartyU": { + "partyId": "DBE38C8F5980B1CEBB8430EAA66CDEC7", + "ephemeralData": "813B7483D5A47F3BCA9F360ADA6032632B042D866F42C26B4B87332BE4AFA7" + }, + "fixedInfoPartyV": { + "partyId": "A13515EE283A2056935C47C9A5DA1984", + "ephemeralData": "26DC77FBE983CCD51B615F536CEAC087F7C7B28FACA8E40871D1082C5DF654" + } + }, + { + "tcId": 1091, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA7360D90DF566A186CC9EF589BBD8DB", + "z": "137869A3DB4D81320E7DF231004527FA0D1002CCFA825D36D1237A20E4742B", + "l": 1024, + "algorithmId": "3536203634B037E6EC865E097CD34DD0" + }, + "fixedInfoPartyU": { + "partyId": "83FFA4732B8406B8BA163CC208D6C486", + "ephemeralData": "8D9B516D2B478B10BE4A072C08746FE4CD2E472D9EB265AEE8415F94E5FA59" + }, + "fixedInfoPartyV": { + "partyId": "718D77895C59ED83267E936F4A49C981" + } + }, + { + "tcId": 1092, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA1CE7586007082DE95563BC13C7CCA2", + "z": "F46BB853591D88AAD1EA34A7B6B49F6D3BD7F6CA59394D386B67F726B39CE9", + "l": 1024, + "algorithmId": "A1360A290B11A1C34CCBBF5B8607DD0E" + }, + "fixedInfoPartyU": { + "partyId": "F28A0A83C68E613AAA0F578D225785DB", + "ephemeralData": "9F4E24A5467B0A9015AEB59F447D44E180180EDA9E09CAFE867431A3C09ACC" + }, + "fixedInfoPartyV": { + "partyId": "2CD0704EC223D010AA50AA1E86042AFD" + } + }, + { + "tcId": 1093, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EFDCC2B2721957CC416B7EAF0BF247E2", + "z": "426BA1D98AAB654D717D12DEBD350C711AFA165AE811E92CF21743DE902534", + "l": 1024, + "algorithmId": "9C3DEA4E2F61A9F1F5DDBB3056EDD0CB" + }, + "fixedInfoPartyU": { + "partyId": "2A10959D21C554CB595F5929FA71CD2F", + "ephemeralData": "B8D45C4D89F1DCAC17F0FFA48DB9CF7E8A198C977843B3B7DCFD057C66A83C" + }, + "fixedInfoPartyV": { + "partyId": "3FC2E616764395CF2AC604F99CB88154", + "ephemeralData": "C50179BB0FBD8F0879907CD416248ADE5A8F7313A0B9904CD28683DBCEA23A" + } + }, + { + "tcId": 1094, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2A48944D1646CCF945E0C7FEF5C3AF2", + "z": "CF8C1E08588F2825B4E3410FE21AEF7142EECBE434372D3F4B29953F333169", + "l": 1024, + "algorithmId": "6B6BD4A2193AB14B145E837428238632" + }, + "fixedInfoPartyU": { + "partyId": "C979D848C11DEFC9D62CA170B0980CC1" + }, + "fixedInfoPartyV": { + "partyId": "A02042D006160D7D856095A629E1F329" + } + }, + { + "tcId": 1095, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2853719C36D4B6AC87688FF7E0F40A5C", + "z": "563CA7959E5D795DCBBBC17D4A0B3167ED9E95E96CD1548B3711734E120952", + "l": 1024, + "algorithmId": "5F7242BD91CF64E4F3737B4B4BE5E1EC" + }, + "fixedInfoPartyU": { + "partyId": "F17F23268C68D34BEB2430B33FA71173" + }, + "fixedInfoPartyV": { + "partyId": "17E4A27216D5B43D9666D52791056CC8" + } + }, + { + "tcId": 1096, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE9765C59AE94EE8610ED5571069A183", + "z": "3EA1F6E211FB3B8253A3C2F80F73E104F63C1A4B7591405F4944CC54CB3885", + "l": 1024, + "algorithmId": "D19DE71358E2CB7E043BDF30F95C4958" + }, + "fixedInfoPartyU": { + "partyId": "47C25FC6D009583F04491BDBD3233418" + }, + "fixedInfoPartyV": { + "partyId": "9E696632D11848E5E1FC9E5652B8E557" + } + }, + { + "tcId": 1097, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5D407E4A4C362F65FDCB26079DF282C", + "z": "853C29CDE44DB504CA113042FD3195FE94EBEEA37EF873EEE2B830BB81F82F", + "l": 1024, + "algorithmId": "E003160732B7618A6AE1ED30DAAC91B7" + }, + "fixedInfoPartyU": { + "partyId": "7038346705F14574B047940F02C18C83" + }, + "fixedInfoPartyV": { + "partyId": "36C415D4E2067C2D1EC59209B20EC5CD", + "ephemeralData": "309FCD4117E1E4FCFA79D22D64FFD9DC7CD0630B3EFD89814D6985E82C16FB" + } + }, + { + "tcId": 1098, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0560784F1D0F34F5AB3BF9985FB4F850", + "z": "62D062191DF111D68529BED1C78DEF7CBAD2B6D986AF5417C6E4607579CC13", + "l": 1024, + "algorithmId": "4851C777D27D5858B2EE724E139C4DD0" + }, + "fixedInfoPartyU": { + "partyId": "F56173E90B9D316CE7DB4DABBE78F8DF", + "ephemeralData": "629C1E21A05BA6132E0F143DE1A74C83B5ACC76F63A346EA468EB1C12D9279" + }, + "fixedInfoPartyV": { + "partyId": "A57878AA64D3326A2EA1A3CFA0F9FCB0" + } + }, + { + "tcId": 1099, + "kdfParameter": { + "kdfType": "oneStep", + "t": "921F66CD82BA5C89B2A072CBF5AE533F", + "z": "769893318335F81A9C682E6B78B2CBFB68DABCB08196873B0CC173C2BF2489", + "l": 1024, + "algorithmId": "5895BF718059FDD9441B4D8E0DE8998C" + }, + "fixedInfoPartyU": { + "partyId": "F5F0F1356D72467DE4D2004DF6C6DE73" + }, + "fixedInfoPartyV": { + "partyId": "EEA8DA3D3DCAA4882163B3ED1AB7BEF3", + "ephemeralData": "6C40A7085BC5D5632A855BE1D43DD540072966FABB24FACDF8FB1BE3F5D20D" + } + }, + { + "tcId": 1100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD163C4CC64F97A4E36AEA2221A2C1C2", + "z": "C25410C348C12CE4D3173CB4A473DBB7BD8B768DE0479FD244E3E1AFCBAE3F", + "l": 1024, + "algorithmId": "EA1B5047A6C5CAC60E1A5F5BECA496CF" + }, + "fixedInfoPartyU": { + "partyId": "6DDC0ADA82CF7CDE096B849967C8B48A" + }, + "fixedInfoPartyV": { + "partyId": "4BC2809B2083E6DA27C06197D8EA98D9", + "ephemeralData": "FC43E8E89EBF3F0752F2E96978EA2F544FDAF9956C37C5696F322423AED956" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 45, + "testType": "AFT", + "tests": [ + { + "tcId": 1101, + "kdfParameter": { + "kdfType": "oneStep", + "t": "390ECC445BEEA99D8C40C233DE7E0ED5", + "z": "B70B9890B7FBAD5A010FCE299276EE4CE7A1FE38C5C420A60BA77969", + "l": 1024, + "algorithmId": "CF376E4D0775864AF0BF4E61A925D17A" + }, + "fixedInfoPartyU": { + "partyId": "35A6B949B5282CC6D39D3B787DAB645F" + }, + "fixedInfoPartyV": { + "partyId": "140E7AEF7EBCDF0CBD76315C33AF3F59" + } + }, + { + "tcId": 1102, + "kdfParameter": { + "kdfType": "oneStep", + "t": "97FD0C89819A3B71BC3F46CF3999B14F", + "z": "B433B72E676D6F99BB2E2EC1320A1B44C84AAC52A82ED64E4C9FC3AE", + "l": 1024, + "algorithmId": "D6166C5D0C75A1422537CCF0A4736EAE" + }, + "fixedInfoPartyU": { + "partyId": "22E7F0837887CACC9A5DDEA3359BB531" + }, + "fixedInfoPartyV": { + "partyId": "A3971E38563FFD41DE5ABF6831557777", + "ephemeralData": "1DE0625641F5C983DD3FB66B4A87A938B5A7F7666FBD662414119C77" + } + }, + { + "tcId": 1103, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7A0929CE33A3E0ABA072C2AFBAE49F9", + "z": "073ADF88889F9719EC76DF2792C575D17EED24790B45D901068BE04F", + "l": 1024, + "algorithmId": "BBFBD74DF1605941B6014545449990B4" + }, + "fixedInfoPartyU": { + "partyId": "0682A3031FBAF54B6DA279B8AE1A1E0A" + }, + "fixedInfoPartyV": { + "partyId": "9F217D0240B7CDB41CBCBCA87895E889" + } + }, + { + "tcId": 1104, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A017521B258AAEE0B2C04036DEFDF69D", + "z": "C43757CD313E54329B16A26D603AA398E0328B942F75CC7483187112", + "l": 1024, + "algorithmId": "D19347BFB521F0F6A196FD73180A8E72" + }, + "fixedInfoPartyU": { + "partyId": "AB49CD81D05C0F2F4EA381D8A4857072", + "ephemeralData": "455E31ECFF16078E0524BCB0941DB5E632BE6D7B3B78B72A733D1AE0" + }, + "fixedInfoPartyV": { + "partyId": "145C680CB84851FA3DED24930A651A46" + } + }, + { + "tcId": 1105, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41043D5EAB6A3B205FF625EEA6EA9FCA", + "z": "3CD2972BCC93CCB59CA42F6D3517FD56F615AE0E8DE3BD15DD5EF19D", + "l": 1024, + "algorithmId": "55A70CB79EC937B4A22BC378F3F721F2" + }, + "fixedInfoPartyU": { + "partyId": "40975DBB0D3FC9ADC601883276437F58" + }, + "fixedInfoPartyV": { + "partyId": "EA7DB2925DD08B68992F3D35242309FF" + } + }, + { + "tcId": 1106, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C593E8FC8F576AECD4CDAB085DEC5578", + "z": "814AFA4DAB53730E8DA93653495A4EB9D4937A19BE8AA61C9395EB96", + "l": 1024, + "algorithmId": "9D69FBD7C9F528E9147C35EB36CE1A57" + }, + "fixedInfoPartyU": { + "partyId": "8D432ECBD181D665EC3330940117ECDD" + }, + "fixedInfoPartyV": { + "partyId": "5C2145E99722B7053FC63B0E0F9D1BF9", + "ephemeralData": "11788FC151B1CF71ACDF5393C52FDFC1D7B57CE36E1A893F91622DE0" + } + }, + { + "tcId": 1107, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99C72EA8765CA77C586044B2AF125574", + "z": "2027D229514D60CED12AA3A6E3C514D5EBC10F64BC72F542E479D27E", + "l": 1024, + "algorithmId": "54CD5005C83B1BEDD88D2FC8A32A8996" + }, + "fixedInfoPartyU": { + "partyId": "A34B55E27F11E9D63349A154BF2F16D3", + "ephemeralData": "91BD0C92CA339702DF4DE951CE6FBA27841ECBF50305CF79E1688274" + }, + "fixedInfoPartyV": { + "partyId": "D65EBB29475A3FBE50B5CEAA1578EFAB", + "ephemeralData": "8F120F1F0559D90853065873126C4E9D4FDD80C3FD6C91B1A12EAEAE" + } + }, + { + "tcId": 1108, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6680A99406F33FDBCB46987FEF626067", + "z": "276451CB492CC262A0BB03F4C184F2315C0313B842B762ADEBDBF82E", + "l": 1024, + "algorithmId": "E123A066D9A0BF1B50076B67401D12E1" + }, + "fixedInfoPartyU": { + "partyId": "6B361FA9053438C56EAA393E72BC0077" + }, + "fixedInfoPartyV": { + "partyId": "FD5B1F92CC6B03E0EE901232BBE899E9", + "ephemeralData": "3F355D842CEE456B7CB7E1B4C08C43F6B6CFBCFC1547F81E9157B7CA" + } + }, + { + "tcId": 1109, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46D913F6EA0D7C1346729D693BD39C49", + "z": "322A0888FB9BB58E4A6E308B9DFBF10A08C4C524F4CFB3A13FBB15C4", + "l": 1024, + "algorithmId": "3092DC0F469E92F0BF7A08AE3E4FFB98" + }, + "fixedInfoPartyU": { + "partyId": "A316DFCC968E5320FA8158B8DCC98FFA", + "ephemeralData": "A1377C016FB24FE8FC95F99D8898B7C07A0EB78FA4C65F7080223C6A" + }, + "fixedInfoPartyV": { + "partyId": "A02937022F89B108CC1D21F79EAF7DD8" + } + }, + { + "tcId": 1110, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6304199D89926F3ED8C842EBDECDD4D1", + "z": "E8DFAA881677A458D1C2E6D30E53F6C38F83B97F52DBA272A9C70145", + "l": 1024, + "algorithmId": "AF8E26F7B898BF214DF166581D835059" + }, + "fixedInfoPartyU": { + "partyId": "315E7AF92E3DE55EF57335BA07AF67D3" + }, + "fixedInfoPartyV": { + "partyId": "C3C720B189A10A3256B7B5841B471538" + } + }, + { + "tcId": 1111, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA74FF47299713AC05BE1D68C2855015", + "z": "C497D6264AD4E276254ACB8AE54628100E920F49DA762D41D50CAA52", + "l": 1024, + "algorithmId": "31AF3B008BCDDB0F970C8FD843DCE468" + }, + "fixedInfoPartyU": { + "partyId": "5879AAD9E8F0DA2E56391266104FE3F8", + "ephemeralData": "DBB0B6F0EFFDA782C066E2B1956AAEC1D56F444EB57B9FB2CC83F5B0" + }, + "fixedInfoPartyV": { + "partyId": "CE175AD34445F814E176BE7B69CC4B61", + "ephemeralData": "9CB9818938025A06770253A0EEFCDC93F708099812C82852852B6C80" + } + }, + { + "tcId": 1112, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E7047D93100FEB818CF8D0F2306ECB7", + "z": "79C33AF0126A7C1321B76960D39AB94DFC0519CC91A875D25DAE6032", + "l": 1024, + "algorithmId": "1F3B35AE6123183CAF27A3787B53BFA0" + }, + "fixedInfoPartyU": { + "partyId": "F5567543414CDE874E2FA4A7F5D5F5A2" + }, + "fixedInfoPartyV": { + "partyId": "B2986C9BF5B56B4E906FD12C63FFCBD2" + } + }, + { + "tcId": 1113, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62EC1730E0F69AF4F78BA657618B3BFA", + "z": "9B0CFAA38C22DE10688B7C8EBAB1AB489C41A0A7A0E92BC75B8C997A", + "l": 1024, + "algorithmId": "D2C8DA69368CACCEED25423500F12E32" + }, + "fixedInfoPartyU": { + "partyId": "B7B9EB51CF0B6C4ED0BB29BFB6BD444B", + "ephemeralData": "71216CE0EF1EDC8AE263554E1FCDB8FF779C51848CB3523CE949AEEE" + }, + "fixedInfoPartyV": { + "partyId": "D83B2A09F10EB1C24BB4266B242516BC", + "ephemeralData": "469C5C8204D90B782B6ECF4231CF085A9011DAD4569503B03EB34E58" + } + }, + { + "tcId": 1114, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06B846C6F1932B32B87F0B6DB59BD6F1", + "z": "524444A20FB2324CEF23B2C6575A5A22CB322397BB540E3B5D0C2BCF", + "l": 1024, + "algorithmId": "2D0422190A19C4ACB0C3807E76FC211A" + }, + "fixedInfoPartyU": { + "partyId": "4A1DDF82E2F1A715EE3B120C66EAD2EC" + }, + "fixedInfoPartyV": { + "partyId": "CAF6BAFD799DB9C822132A3CD1D795B3", + "ephemeralData": "9D594343D6A8B0816CAEEF3767146C6C40C01F416C1F0FBFCC38C4CE" + } + }, + { + "tcId": 1115, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B88621C1D805D47CBC611884D5BE152", + "z": "BAB3215263150BE862849EB61CB328FA2B56BB5BEB28C53328F781B6", + "l": 1024, + "algorithmId": "0AFA64B886F40B1158118118FBEC1874" + }, + "fixedInfoPartyU": { + "partyId": "CDF16FB98CD6D16D36CF7982AF3CF300" + }, + "fixedInfoPartyV": { + "partyId": "1212D6946CAA9326DD7E6764AA1FD09A", + "ephemeralData": "25E55BD1BD8B9C109350B7A8471A78A8F7C7E4AF7C5881A9A77E68EA" + } + }, + { + "tcId": 1116, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB44E5FE36B1571F7436581A56F5BBCA", + "z": "EDD9D14FEEF4759ED57469EFB39090B058AB22F0EECDDFCA3D0D6717", + "l": 1024, + "algorithmId": "E9B7DAD881CA77EE4D97BE45F9458647" + }, + "fixedInfoPartyU": { + "partyId": "F76507EEEA1F79CD71691F32084E610C", + "ephemeralData": "4975E61F269125A2D38FE1DF06F8EE1E72A10C6E709547FDC68FC3DE" + }, + "fixedInfoPartyV": { + "partyId": "12C398B9190F27490D7141FD1097E78A" + } + }, + { + "tcId": 1117, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9B926ADBF1498A15F30B3B62F9BFB56", + "z": "C8E7F6E553F90181609299CFBD011281EA40014810106DCBFB7BEE77", + "l": 1024, + "algorithmId": "FBBC0F7AFC079A351D6E546188561606" + }, + "fixedInfoPartyU": { + "partyId": "B5E78BEBE82FC1938B853EE10F70AE3F", + "ephemeralData": "6A0D29758C4209319099D04786D41628F57647589413F057978FDE46" + }, + "fixedInfoPartyV": { + "partyId": "F6887A5DBEE83158189EDF431AF675A9", + "ephemeralData": "E7162EBC7749B25B50E2EBA9E22E22029B3C42254DBAA4625AAB6B95" + } + }, + { + "tcId": 1118, + "kdfParameter": { + "kdfType": "oneStep", + "t": "348787EFD220342480DD17F069A1EE61", + "z": "D0313A97303DB7B6174C953D870600AE5A57CCC8E81718CAEDD76CF8", + "l": 1024, + "algorithmId": "2953A23E50E9F7D39BF98F0555BB7448" + }, + "fixedInfoPartyU": { + "partyId": "24A0B9D6495E66CBD257B56F4CAB276F" + }, + "fixedInfoPartyV": { + "partyId": "E79056A62F417E703B5A95982E24D283", + "ephemeralData": "1636FF105191D7A10D6713701916FD400236D7BC34A8F9EA0B21A178" + } + }, + { + "tcId": 1119, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FAA747AF0FC2787BE1E8903A9874CCA6", + "z": "AF459AF18954C147E1A20AA5714C138C5E2BE6072CBE1BC2C975F370", + "l": 1024, + "algorithmId": "1AACB4C269264B5743893028C07CD91A" + }, + "fixedInfoPartyU": { + "partyId": "5490480D8A58E33ECFF82BA40F937A6E", + "ephemeralData": "B1C1327D1A60BA1B528DBD0ED627D7EC9FAEB3C5A5A56A512C675589" + }, + "fixedInfoPartyV": { + "partyId": "78DE6AEE0F1D83DE4567230030FFD318", + "ephemeralData": "A08BF8E270C89F7EB4F28DF4A81EAF4CF5CF4901038AFFB3300B512F" + } + }, + { + "tcId": 1120, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D364533074CDB9DB701C0997DC38A050", + "z": "53F54D0CC39E79CE4D30B7491C34CE51CA0E0021E81BC0CB958EF1AA", + "l": 1024, + "algorithmId": "7E8D496986F8FD3DADE2400DD1BE28CD" + }, + "fixedInfoPartyU": { + "partyId": "97BA508490B2F8BB77DC2598EA7D6D72" + }, + "fixedInfoPartyV": { + "partyId": "CA7D88CA5230041722782AB1840D1F51" + } + }, + { + "tcId": 1121, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E05D20CCD687F6A6ECFC6FD9AA766BB", + "z": "E2CDC14BF0ED4892AA652F4EDCD2F23AE4235995B1EEB15050258A38", + "l": 1024, + "algorithmId": "A2B6AACC6A3E2D8503C69761382F1AB6" + }, + "fixedInfoPartyU": { + "partyId": "A405F5780A5165854231E028B2F6F92F", + "ephemeralData": "DDE8578FC059BC71629C810CE48F04359CEFCB5B6DDD7E8BAC7834EA" + }, + "fixedInfoPartyV": { + "partyId": "14CD44197AA435548C614D48439C325B" + } + }, + { + "tcId": 1122, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D32BCD07502720FF9FEEA3DC2663A98B", + "z": "F33386D98BD292CFD85924D03509F6B5761E8922EA52156C308635F4", + "l": 1024, + "algorithmId": "F437D8B52C19FC5ACE1E4E143226C82E" + }, + "fixedInfoPartyU": { + "partyId": "53047856758806527F3746D18DC6CE26" + }, + "fixedInfoPartyV": { + "partyId": "E2E556FA6362035273E37FF21608EA78", + "ephemeralData": "D4437E19E24E34DD2A9C61067E8E5782E49CCAE28ABF6FA590C254C4" + } + }, + { + "tcId": 1123, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24BC4FB95BAC6B2FE959347DFC95C1F0", + "z": "E1887E5CBDF91F08EAB325739ECEEC4E66B38EFDC074A83DEC473E61", + "l": 1024, + "algorithmId": "C4A96E7369F86BDF5A5C184DB767B5F2" + }, + "fixedInfoPartyU": { + "partyId": "EEFFD54C4787BC263408D4AE8FA1006B" + }, + "fixedInfoPartyV": { + "partyId": "20BF908945421CD29B93E80E9C429BF3", + "ephemeralData": "C6B7DCF40E185D4445E3683D0A20329E6C9EB67799E479B724EDFC54" + } + }, + { + "tcId": 1124, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3B04329A21AB0A8B1CD1A8B87EF30C4", + "z": "5E979306D31342A44B5A684AAAD7891B87B21B4558F799FE3AE07FBF", + "l": 1024, + "algorithmId": "DDA95658F762B28DE803530F4045D4ED" + }, + "fixedInfoPartyU": { + "partyId": "704296392BDF6F76D938BF024ABF6139", + "ephemeralData": "89DB34FE505C85685CE41F98016A340D6B7CFF64E8C0576FD91F9546" + }, + "fixedInfoPartyV": { + "partyId": "BF9D61FE0AC98578FEC06BA3000D122E", + "ephemeralData": "5512896C74A1C87BF152B9377B3BDACE39C1FF145D77A02A743A696D" + } + }, + { + "tcId": 1125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58F7A142F088AFEAB6F317DE2A88C3F4", + "z": "B98BAC79605D2E04AEA11182528228B657B3A9DAB085A9DFD547A8A8", + "l": 1024, + "algorithmId": "F1E1477F3D4116589FC5536875626C77" + }, + "fixedInfoPartyU": { + "partyId": "3450D73E4B110BFFD695E81FB75DD4CB" + }, + "fixedInfoPartyV": { + "partyId": "1D335CE74B795448FF306E352DC1009C", + "ephemeralData": "1B93D7B82D66968BCAACDDFC28DD2D7056007652AB93CE38FB4C05E5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 46, + "testType": "AFT", + "tests": [ + { + "tcId": 1126, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2F15F8878102E36E71ABF72C06EDC2A", + "z": "4165BE4DCCD1F978F0FFD740653A7E03FE50337AEEB01E365355D7CB", + "l": 1024, + "algorithmId": "1ED4DD8003D8E1E0D43E5D709CA6678B" + }, + "fixedInfoPartyU": { + "partyId": "3E457F2B0CE78187A83736EF814CC54D" + }, + "fixedInfoPartyV": { + "partyId": "B877058905D1290160B038ABF4B8E31C", + "ephemeralData": "660CEE219C8CA14CACDB305D93B3F9C4F2EFBFDD9146CD0ECFE7B5A1" + } + }, + { + "tcId": 1127, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F63A92B9D680FCC395AC147574F6B06", + "z": "61EDCEEB7EA1BCA0A2D43A98F854BF7A271C171651EB5B4BBB656831", + "l": 1024, + "algorithmId": "F108FC6A1FE6E529C4560871BA074540" + }, + "fixedInfoPartyU": { + "partyId": "2F40FD7FAAA64D9701EDA6827F98B89F", + "ephemeralData": "944B6153D2D3A49C7F5DB2896D7CCFE6C7749FC0D4F0046FBA0DBE32" + }, + "fixedInfoPartyV": { + "partyId": "07C2ABA8B32FA7E00FB9D9727CA2222A" + } + }, + { + "tcId": 1128, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39DDC0AABE15E6830330200A5FC66E76", + "z": "E5BD5181DE5C73BCC792013A061C2E87D081358650A12B59ABEBB26B", + "l": 1024, + "algorithmId": "8838CCDFF2E0BD9222DC1DCC4054B2FF" + }, + "fixedInfoPartyU": { + "partyId": "D5D975CD4B2E8CE12D87A7E0D1781E08", + "ephemeralData": "D3AE24EFA7E0EFAFBD6748BB6D082A0C56F77D152EA9830FC9547C60" + }, + "fixedInfoPartyV": { + "partyId": "29CBA3CE9BF81C68D4203F869A46FA46", + "ephemeralData": "4F9F043309CDD05D371BE7D6D5EADAAC9C70EF18712D11DD2661D4D6" + } + }, + { + "tcId": 1129, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47C3AF95632E7D077A887246D7488D1D", + "z": "D5E2E188716B7E37FA49C0B3355164E31CDC384756330AB1DF9FECC7", + "l": 1024, + "algorithmId": "36DD9909451431412DD37E53E95C11E4" + }, + "fixedInfoPartyU": { + "partyId": "0E8FF2591385FEF91D7ECD6D92977050" + }, + "fixedInfoPartyV": { + "partyId": "27CF562E81480FC865D4AFF82CA2976C", + "ephemeralData": "35BDA42CC2C158A93F4A1BDA5CEE45A0353BB53C34E615AE49A0D705" + } + }, + { + "tcId": 1130, + "kdfParameter": { + "kdfType": "oneStep", + "t": "771FE65B081223365D0838A809AB8C55", + "z": "F23A45893DB147F9EAA67C95FB041FDB26515B6FE67884C9AEDF944D", + "l": 1024, + "algorithmId": "3F250C2AF0C351FB6EFFA11671A29175" + }, + "fixedInfoPartyU": { + "partyId": "4C99C413D076762C96A24C311512F68F" + }, + "fixedInfoPartyV": { + "partyId": "4A8325A1E2067D3540DF73161F1682E1", + "ephemeralData": "9BCEFCD5328379D323C3A75664AD35D6D5051ECE6E7D8EF53B497957" + } + }, + { + "tcId": 1131, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B184D6014901EADFA03019477E2374F", + "z": "156A2B0323609BA9BFD13D2AF86E7AACD42DD46D4822CDA50EE0AEA3", + "l": 1024, + "algorithmId": "00A2206FEE199D68FEFF253417260625" + }, + "fixedInfoPartyU": { + "partyId": "C00A9915825B943FC04B9E851A9DEB95" + }, + "fixedInfoPartyV": { + "partyId": "62790ABD4E07D1587C23E998B0324D2E" + } + }, + { + "tcId": 1132, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65988EB6DFCC18A55DC51A1D4B23E9C5", + "z": "1B9EB27F10CD4C586FAA2EAC83B79E6478C3BACFA019C96A67B07A38", + "l": 1024, + "algorithmId": "7D90E8BC4A184183123762334310452B" + }, + "fixedInfoPartyU": { + "partyId": "637C83CFFB1328384111B2A9F45C5895", + "ephemeralData": "1A834B758DB1CECE5E770AFE2BB7E89FADEC0C28E48833496006F84D" + }, + "fixedInfoPartyV": { + "partyId": "A68010D3244CBA97B932B96AD0D49FAE", + "ephemeralData": "BE4393FDB5E5431C3788356DAFFEEB79477E88040479D1CF5C409894" + } + }, + { + "tcId": 1133, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E4FB56BDB88C7362DF73353AED1655B", + "z": "61EC9C6DD138159CA7C2F9997FC7A1478CC4E93E934B4CB23F3EEFD9", + "l": 1024, + "algorithmId": "46CDC7EBF7793B9C2484952823CA6505" + }, + "fixedInfoPartyU": { + "partyId": "696F3E190F948D89FC1EEBEBE6B9A90C", + "ephemeralData": "650BF6CB835BA0DD309486EA5F16D26CB6C3F1A7F3724208FF95E66B" + }, + "fixedInfoPartyV": { + "partyId": "FA44F34767046157B60261CEA55E8DB3" + } + }, + { + "tcId": 1134, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F476040D59AFD367E1C8216FC894748", + "z": "08E41ABCC82624F473E3016A94DDFBC15A1C36834F5403479812CD41", + "l": 1024, + "algorithmId": "00DF18EE43D1160DC3B9FF061A99D94A" + }, + "fixedInfoPartyU": { + "partyId": "E07839F345B94606210292CEAD83E365" + }, + "fixedInfoPartyV": { + "partyId": "1E2CDC49A61C4AD47C3F6A06203BBDC2", + "ephemeralData": "E547FA3043795EE8A95DF96146ABBA7F9D47238EBCF92F8B6EB39FEA" + } + }, + { + "tcId": 1135, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B23A4A1AD2B8988F487EF2CA034287D", + "z": "9F0FF0474BCB2F903E17FEDB5D5B1C092C80B9DFD3CFFA4CCBE80CE5", + "l": 1024, + "algorithmId": "D12C994979B876744F8D332898E5CE3B" + }, + "fixedInfoPartyU": { + "partyId": "72C06159838461B03D935D53CFADE007" + }, + "fixedInfoPartyV": { + "partyId": "EB5C839D40B6CBE58DA2D1CE2E6CEB5A" + } + }, + { + "tcId": 1136, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C2309C5D8B72002D57EA589ED93A545", + "z": "25B598A34AC3903CE12D561EB7B469C0A6D8760652571E296284B19C", + "l": 1024, + "algorithmId": "6D155A501D48EA2A5CAFEC46B86D21F0" + }, + "fixedInfoPartyU": { + "partyId": "13E7414D2643B2D69F81BCC62197D635" + }, + "fixedInfoPartyV": { + "partyId": "6991BF39EE0C4F41DB6EBA006C9814D8", + "ephemeralData": "756D8445281C34B91C83CA7DB0A9FB9306126CE115E803DFB7DF2F1D" + } + }, + { + "tcId": 1137, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D3DE627EB270822145F1EE6055A54C6", + "z": "FD2FDA40916B51E006348751FFBF8D614F52ADD6D6EF086DCF11316D", + "l": 1024, + "algorithmId": "347DDD48141DD3A2A7A0E80552EE9FB0" + }, + "fixedInfoPartyU": { + "partyId": "392F8364BEC7ADCB16A77F96BB80B5C1", + "ephemeralData": "C0A333A8E6E1B9972C2015F2D9938F80C61CBC36B29F99274995B210" + }, + "fixedInfoPartyV": { + "partyId": "C35F08E11C99B39A282FC632215DA276", + "ephemeralData": "7B3E3E6B5FBA93FA5F943BDEF6F4A0AFD057330C0F6E72E5341E4B50" + } + }, + { + "tcId": 1138, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FF03DB0D25E9519B023070754BF751F", + "z": "67C8B054B423C9D2844A82EDA01B4EDB1FC0AED008740DE7AF6E66AD", + "l": 1024, + "algorithmId": "4FB44804D02434CA863EC1FCE26177BB" + }, + "fixedInfoPartyU": { + "partyId": "5884B700116705D99E2395438CD56B63" + }, + "fixedInfoPartyV": { + "partyId": "44375BBA43E4BC6BF32DE4BE7ACBD504", + "ephemeralData": "3FD9D899A886A4ECFDDB506DCA441B84381BE8C67D2A46DB33D865A5" + } + }, + { + "tcId": 1139, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7943347E4136D9DAC18B043E6B782679", + "z": "02C3E1BD7294FE415E3E21E19B49694EDE0F4B8574282FA5167233D3", + "l": 1024, + "algorithmId": "A1C1874BD71ABB7BCB93D1DB9EA34977" + }, + "fixedInfoPartyU": { + "partyId": "F2E604FE49FBAA141804A177464C529A" + }, + "fixedInfoPartyV": { + "partyId": "6CC359FF9ED438E4F65D5F9A907073AC", + "ephemeralData": "2F68924FEFF20072536E107EA1183C60F42537873165AD67C9FE33D9" + } + }, + { + "tcId": 1140, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FF8815B3B15508653173467A459DF12B", + "z": "B46C0E2E88266DC75880CA1C13D014B4AF51B0BA661527D3CD4C2381", + "l": 1024, + "algorithmId": "85C2B5D3FABAA678F6FB22BCD240A2CF" + }, + "fixedInfoPartyU": { + "partyId": "CA8A37DB04B2F469B078BA1D62424ACD", + "ephemeralData": "1727A9209CF992EE6D709961BAC49EC3FC14372F95E9954238507DC3" + }, + "fixedInfoPartyV": { + "partyId": "82EECD58B48B7C1B916B935CE2907D7B", + "ephemeralData": "0EE59F333330A032A7B219D16D9817B48331065C199E7949ED55A5B3" + } + }, + { + "tcId": 1141, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C0D2CD3BB1F09E88E38735EF96FED2F4", + "z": "AB767AAA946EA0B4948F44F42C1E361F7A1F6ADD2D360666770062C4", + "l": 1024, + "algorithmId": "54D917295034C800A00DD74AFE5D31CA" + }, + "fixedInfoPartyU": { + "partyId": "85B9D19CEEEE6216C68C74F633655CE7" + }, + "fixedInfoPartyV": { + "partyId": "90ECCC6CF3230B3D3DF6BCC38052C40C" + } + }, + { + "tcId": 1142, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C82904A5526A64A33490817DFBD41729", + "z": "AB74ABBB7858003DD3749A5A709535852432E2667CEA63F5F9587BE6", + "l": 1024, + "algorithmId": "5AE52B9D20F55F24C51B5E1017E04BF9" + }, + "fixedInfoPartyU": { + "partyId": "9A94572CC564ECD321392C362020C9F4", + "ephemeralData": "366E9C73FB58EE12C29D883EEF493DE022E58B55900AF7FACF6DAF6C" + }, + "fixedInfoPartyV": { + "partyId": "A1E09015D1F9DC06FC4F29BD6BE6A6AE" + } + }, + { + "tcId": 1143, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F2E1056FB25DA22DD452C8454740027", + "z": "501D90605F78AA8B59A6983410A5E7B9EA6F065BCD70CEDD6BDEF6E9", + "l": 1024, + "algorithmId": "90F900FE04D3A639DB93672A3F6EA68B" + }, + "fixedInfoPartyU": { + "partyId": "7EF8A79058B38E22071B747729859741" + }, + "fixedInfoPartyV": { + "partyId": "B14C0B7E7E3ED4D469BDC615343B245B" + } + }, + { + "tcId": 1144, + "kdfParameter": { + "kdfType": "oneStep", + "t": "835AC38444B322077A08889A2C800A51", + "z": "6B38EC7990181653AFFFE12AFEE95714BFD0D779B941F8B9B2CB2790", + "l": 1024, + "algorithmId": "0167930EDDDCFBD206EAED8D3F668218" + }, + "fixedInfoPartyU": { + "partyId": "C3B2C7C95848B5C7E74D58A10E81A53A", + "ephemeralData": "987437020ABB1EC255D37ED6C0CD383B0E7930AAC3A31AB438B06649" + }, + "fixedInfoPartyV": { + "partyId": "27F64ADE8B853287862FD955638BE6A7" + } + }, + { + "tcId": 1145, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEAA55BC6A6975FB5718FB6932326030", + "z": "D5B7AF35F56CDB590B0E10FD16F0A7C18A3B6C83F7AF703245C7B22C", + "l": 1024, + "algorithmId": "16850F8C25791560CA58AD4BB2074EF1" + }, + "fixedInfoPartyU": { + "partyId": "FCAF3AB0C0E34047D9F9AA6B0A0EED44" + }, + "fixedInfoPartyV": { + "partyId": "B88310D14650759E46AB6C528554968E", + "ephemeralData": "A835CCC36381F1506319A634702B1E5B4E2CBDCF16AD161F305D95B3" + } + }, + { + "tcId": 1146, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08A3DBAF8F6C1935CA79DAF16C1802F3", + "z": "1C7E5E49E08E6267ACBFB6387DBA33620FCF6787B23AEFBEEA4A6D9E", + "l": 1024, + "algorithmId": "9A097FCC0ED509659D478C35B428C3BA" + }, + "fixedInfoPartyU": { + "partyId": "8AE466C804DC1F355E6FCD6589EEB71F", + "ephemeralData": "DA19485BC495A94679D0931D715FA06ADE3CA0F61BF857EE5F02676A" + }, + "fixedInfoPartyV": { + "partyId": "2C6E6DF56030BD7CF6DFD4047D01E4BB" + } + }, + { + "tcId": 1147, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A76482DDE895887AEC54A117C991FF0D", + "z": "7EB1E830B1C1FB6C00B6A9742D5A56F68C555AB45442506B9A851417", + "l": 1024, + "algorithmId": "C736A9D71B2C0584E585FB062BD48453" + }, + "fixedInfoPartyU": { + "partyId": "BC143CBDBC5C9C24C30484A102089C66", + "ephemeralData": "4DD808975171EB535218EEC49F8369D3531B3A64CC3474672D24F5C7" + }, + "fixedInfoPartyV": { + "partyId": "4A3D36D328FE508CF2696604E72F43F9" + } + }, + { + "tcId": 1148, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7F8930808FC5D5E380ED50D0167A318", + "z": "AAFD44CD8DB416223BC5895E6ABBF5B79C7E2345B1E6D69327B29DB6", + "l": 1024, + "algorithmId": "F90F2D336F14D155F027F3085B7CDC62" + }, + "fixedInfoPartyU": { + "partyId": "E9BBB5BC4265E87A96B91CD8C1E81FF7" + }, + "fixedInfoPartyV": { + "partyId": "D94F5925E89FD4BCCE7EA991A2688072" + } + }, + { + "tcId": 1149, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42F93D193DFFB60219CD16E4B153E2BA", + "z": "D7A04FB4741389E120FE25D29169D504AE620DE8F24456D7B1B4728A", + "l": 1024, + "algorithmId": "C78083BCA40D763C4FBCCB8EA368828B" + }, + "fixedInfoPartyU": { + "partyId": "D7C8619D64F0CFCE491ACB7DFF357ECB", + "ephemeralData": "3502C220BB383063D769266CB588FC3F5F0060D83EF36B6D4D2C151F" + }, + "fixedInfoPartyV": { + "partyId": "6AA4C042135E8A733A94C03BC080829A", + "ephemeralData": "C7E2424D677F233FDF56A3BE68AA2D71DCEE50FF5E3B30AE68D28EE9" + } + }, + { + "tcId": 1150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "61C16483B4A89187F73C739379E83538", + "z": "49DD1585964978D5559293948B936C04818A114CE8FFD4B49DEE4E31", + "l": 1024, + "algorithmId": "32C838DCE9F7477A291CD1DA650DC20A" + }, + "fixedInfoPartyU": { + "partyId": "812D0035647D2B4A8DB8958516A56728" + }, + "fixedInfoPartyV": { + "partyId": "F69E175705B88C6BD1EF1F1DFD1BF2BA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 47, + "testType": "AFT", + "tests": [ + { + "tcId": 1151, + "kdfParameter": { + "kdfType": "oneStep", + "t": "121C05802BC36CBBDD245EDF17DA6073", + "z": "4BC7B52E0BEC0DCB1E56B07B41398F47A5D31DD2FA428D07D3AFF296B6", + "l": 1024, + "algorithmId": "A2846D4D3C70CF68E49D0E33710B2F4B" + }, + "fixedInfoPartyU": { + "partyId": "410C1C98D36CCFD57AB7865EB2636472" + }, + "fixedInfoPartyV": { + "partyId": "C651A5A30688EBF3C65404EA8ADC7437" + } + }, + { + "tcId": 1152, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF1A1F04DE980F01051449110830BE54", + "z": "098C87CD576AD3AE4B649B40FE22B36DC707AC782B286F17EF8DD1B371", + "l": 1024, + "algorithmId": "C06F81E55B0BAC97591BA19B89D36CB4" + }, + "fixedInfoPartyU": { + "partyId": "9D99DC084F3DD1E2B031E94C9278543C" + }, + "fixedInfoPartyV": { + "partyId": "E28F213566E0C374B583C4E0755C933E" + } + }, + { + "tcId": 1153, + "kdfParameter": { + "kdfType": "oneStep", + "t": "922B0DCA91E522E1379DD39A42FF56BD", + "z": "A00ED75A535019C8155FD32BF5AE463C3C7A990689761C63C692779DEE", + "l": 1024, + "algorithmId": "DC275A8B7D84F39F83288631B991F023" + }, + "fixedInfoPartyU": { + "partyId": "3993B989395A1694E3EE8FF1C792B897" + }, + "fixedInfoPartyV": { + "partyId": "0D8B6C3F2783257CCC3A9F9B37DBA5FA" + } + }, + { + "tcId": 1154, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C64E2CF6F87C6B7D2EEF64D298546B0", + "z": "EFDF6FAA2B2CF45A399EB96A8DCE37E5540FA6F97A3ADE03BDA38946BC", + "l": 1024, + "algorithmId": "11EDA5AF73DE449BA86B77A6267C1922" + }, + "fixedInfoPartyU": { + "partyId": "5054AF4A68AC53491C68B7C2E0B8D9FB", + "ephemeralData": "350D1644B1CE2E912EED1F7F4BFE9413785C5162E2C52864E2B98FD17E" + }, + "fixedInfoPartyV": { + "partyId": "1654DF1A907419354F9D2C4BDCA0AAEE", + "ephemeralData": "5DAB6616AEF7E72C80B1B7F38F1B4D9E07C1A3ECB0623430FF6A1740D0" + } + }, + { + "tcId": 1155, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD654BE5C10640FB7FC019636F61C3C8", + "z": "0958A92A6F728C500F2EBEC0C790773B3ECEAD43F4CBC74967CBFCCBAB", + "l": 1024, + "algorithmId": "7EB0C943F5C7FA95308B1098A5A9308C" + }, + "fixedInfoPartyU": { + "partyId": "6B1F7A96FB7E17E5CD774AE994494BCA" + }, + "fixedInfoPartyV": { + "partyId": "6FA03C5B893E5BCD378C24F975C8C040", + "ephemeralData": "4339EE1B5CBC26D0948FE8E97D066DD5793240A9E2C3FFF1543964F72A" + } + }, + { + "tcId": 1156, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D646D4868E67CF649BF89FCC097586D0", + "z": "A48E518DEC0051D373446083BBACB9CBCCDAE74AA7FFE149C9F7D6F541", + "l": 1024, + "algorithmId": "A2A713F267C8544A429E0C5DB529E4A0" + }, + "fixedInfoPartyU": { + "partyId": "B8826275A486D8B03CFC25F20D75BC10" + }, + "fixedInfoPartyV": { + "partyId": "52F83C0BD5A46E63027402D2BB1599CF" + } + }, + { + "tcId": 1157, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CFD6A32CBDB59575FFC5303FECAC8F94", + "z": "F058B8F0FC476E3FB0B6B491B21E247ED6976FF4D9412BB73695CB9F09", + "l": 1024, + "algorithmId": "5D9BB3203F6C1C3EE29EA5EE2DF0C278" + }, + "fixedInfoPartyU": { + "partyId": "C14B126B63DC2606E881369D459AB5E0" + }, + "fixedInfoPartyV": { + "partyId": "D3FF46988330C91E20EE9B0A9671F728", + "ephemeralData": "64516C7F25AB19D659E7C1C7CE86232D4553D86AAC36A3483951D43EF8" + } + }, + { + "tcId": 1158, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57A3692F9B913443F87EC81E1E83C2A4", + "z": "6276D14482BD1A41826C877E2044F5CA077C36FF586A325071EECB2B9C", + "l": 1024, + "algorithmId": "9777DD4CA4719E735A6DF3AB143D0085" + }, + "fixedInfoPartyU": { + "partyId": "911EC5189053268812210819FB0A2BD1" + }, + "fixedInfoPartyV": { + "partyId": "BB7F2C6C0E105AD436E1B17A4D3F78F1" + } + }, + { + "tcId": 1159, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B713C5F838CF203C36435DCFC31C222", + "z": "B2156D351D18BBC16CDC6803F310800257A3084D981504E0C9AD4723DE", + "l": 1024, + "algorithmId": "7425ADCD69D957D683463F0770F8824E" + }, + "fixedInfoPartyU": { + "partyId": "2D8E641CBE41AA7765A98B4EE69A23C2" + }, + "fixedInfoPartyV": { + "partyId": "EF73948F2F681C1E95D35C907C72006B" + } + }, + { + "tcId": 1160, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63E7AB66ACB6474282D599000E1441E5", + "z": "75989F5BE561F82386F45286785533C8832A6598DBBA4C4D92CFD2E3F6", + "l": 1024, + "algorithmId": "9F236EF8024163FAA8912CE0E1DDBAFB" + }, + "fixedInfoPartyU": { + "partyId": "3468335AF5980D549C140BDD7C4E42E4" + }, + "fixedInfoPartyV": { + "partyId": "B3AE37EA70EBD2DDF258E033601379FE" + } + }, + { + "tcId": 1161, + "kdfParameter": { + "kdfType": "oneStep", + "t": "218CE594FF6C8FC9796CB83E6BEAE1C9", + "z": "7D176508741544A12F052AAAB0014D1729E7AE6153B78464B184D7E150", + "l": 1024, + "algorithmId": "EFBD5D4CF551549A892CE9A72F82E1CD" + }, + "fixedInfoPartyU": { + "partyId": "09DD18335C643D39866BA530C7B4F52D", + "ephemeralData": "A8C56C777BE272F91FFA6B253A6DFFA80FC29DAEF187BBEA4E6B42B150" + }, + "fixedInfoPartyV": { + "partyId": "CEF73E40F80BDF11D5B4B8EF0B6689FC" + } + }, + { + "tcId": 1162, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52340096A592FF16E137733BEE01A899", + "z": "CC16D5CDFC1BB795E51AD85607CECAC0240E16712A1684792E94B40BDD", + "l": 1024, + "algorithmId": "6B1AF01A4B75AA9E94CF5F15ECAE338F" + }, + "fixedInfoPartyU": { + "partyId": "5DC9C3EA23203D853C0F6D22759EFD2A" + }, + "fixedInfoPartyV": { + "partyId": "6EA461989954486C1A273F9DC43556BC" + } + }, + { + "tcId": 1163, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96E326F5CF6A5151B45B697E93CAECE9", + "z": "F7AE58393C1264F35C220A66F95375128535B155EE13CE8C07EA153452", + "l": 1024, + "algorithmId": "FCEF292723119F765D996100A9EE987C" + }, + "fixedInfoPartyU": { + "partyId": "B829A4B71E5CF50413F3D07ABC4F67C9", + "ephemeralData": "03AE71F53F82420B7961ED241B1F34CEAD02CF5F3AC11B8ED516DB3E2F" + }, + "fixedInfoPartyV": { + "partyId": "237040FB33D9F4E0D21A0A17593B4EA5", + "ephemeralData": "2D14303A4C19C495A9941194BD6D1CE0D759FC23AC573C809BFF282657" + } + }, + { + "tcId": 1164, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7F867D80EE011CCC2DD6241CEA7FE45", + "z": "820478591BD8F8FD729D0AC75CA2CFDF02E65A01C4218A0F6F1D66DEA5", + "l": 1024, + "algorithmId": "0757234247457A8F43AC6316441CF93A" + }, + "fixedInfoPartyU": { + "partyId": "073F0A8574359739BC64A15E82276B9E" + }, + "fixedInfoPartyV": { + "partyId": "859716018EE5A8745A5C10B13E42ECBF", + "ephemeralData": "2E7EF9E927CA5AED44C28B9A25D0B8F3ED28D53022E56B3DA464339625" + } + }, + { + "tcId": 1165, + "kdfParameter": { + "kdfType": "oneStep", + "t": "597F05E290BFEF87BBA964F9B593E964", + "z": "F54A28769E250C51EBBFCE3DB064870CF75B7EF483687992AA0CFDBDD5", + "l": 1024, + "algorithmId": "E636909869F3BB8EF318B43AAF32488A" + }, + "fixedInfoPartyU": { + "partyId": "E605322B70D13B2993DA93993C891088" + }, + "fixedInfoPartyV": { + "partyId": "2E6A346ED7B1846EBF37A5E05A677BC4" + } + }, + { + "tcId": 1166, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE93029A3747173DAFFADF2053BB3505", + "z": "95D8C0C0C03CABD4425D268ECB552A0A7FE28564B413E62B9796A1EE7E", + "l": 1024, + "algorithmId": "14F7033128D39808D4B4DCEFFE70BB1C" + }, + "fixedInfoPartyU": { + "partyId": "5ABC9EA84EDA7C616242AAF504053A7C", + "ephemeralData": "0E4C116AF3E85F89DE7F29377D0E6BD6D56543AA9B36DC0B6BF1EC3330" + }, + "fixedInfoPartyV": { + "partyId": "FF005ACE292E11A3EB8D90A9E1EE359A" + } + }, + { + "tcId": 1167, + "kdfParameter": { + "kdfType": "oneStep", + "t": "884EB4B1499361C87FE116369789F75C", + "z": "535F0A1B6152AF32D1F2FB167A5C750A4D843ED84BC97738493B433AFB", + "l": 1024, + "algorithmId": "F7E21B2B768EA6945E9DE7C1D29A4268" + }, + "fixedInfoPartyU": { + "partyId": "D75E4CC08023AEA7D8F17B0658DFAC54", + "ephemeralData": "71D868D284838F472B5E2BF775172E2DD9F18AC9B65CB89BCE36ECBD31" + }, + "fixedInfoPartyV": { + "partyId": "67B24FFC2711851D734CEA037A51E511", + "ephemeralData": "361A7158A4E243D67639E3A4EADF33FCB2682EE9327832544A68F480CD" + } + }, + { + "tcId": 1168, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB9F7566426448CA8F0D61631C0E2E68", + "z": "030BCF5ABFF7A48CC1DE35DE3ADBE59ABD7C14FC79C9C96308F8FD1DD4", + "l": 1024, + "algorithmId": "1086933DC9FFE7DFB23B685399EACC59" + }, + "fixedInfoPartyU": { + "partyId": "4C67A3446505088D961FF423486A4CF8" + }, + "fixedInfoPartyV": { + "partyId": "BE93AD380578471AC13F8807886330D2" + } + }, + { + "tcId": 1169, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13BAD6DB2BDD2F610B663CE8F4A766BB", + "z": "163D53890B0800838C8617587B610B9C70654AECCB75B507EC59A21AFD", + "l": 1024, + "algorithmId": "1B5AF673532CCBDA5593F36CB4947245" + }, + "fixedInfoPartyU": { + "partyId": "F2FB2931B0B32F005358561910037967", + "ephemeralData": "D563297B0DB24657544772635F78B4634E991A798634BF82AF7C24C49A" + }, + "fixedInfoPartyV": { + "partyId": "3EDC92DC44F6B79A198EEF0A16045A5A", + "ephemeralData": "037BACC45E25734383151F2B5E5B58346E717E42ACAA88C5D238FFCBB2" + } + }, + { + "tcId": 1170, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C798F20128D6EA377D6CB72618007486", + "z": "8B725B192DD316625E61697AC4D13D885C213EFD3061029660E40718E4", + "l": 1024, + "algorithmId": "FAB158D465590E5C737A615D92979A8A" + }, + "fixedInfoPartyU": { + "partyId": "7929E79F71F099CD50BC8092766A7252", + "ephemeralData": "F079E0F6818107CAABD38BDED58F3B47B6340182683689876404ACAF21" + }, + "fixedInfoPartyV": { + "partyId": "BAFE293FE1EAED86C5ABF8E259ED7ABF", + "ephemeralData": "F2A0F14FC98F4ED4DA1408A94610A66D832BA7579FA59D09C9E1B45216" + } + }, + { + "tcId": 1171, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45786F1DD62B0B273AEFFB3E8C9EE0FA", + "z": "8A9093FDEC2EFCB18939391620FA512F185A1B9848A90ECBDE159EB292", + "l": 1024, + "algorithmId": "759AF4C73B48055B932CB69CBA37DC29" + }, + "fixedInfoPartyU": { + "partyId": "DFA544F5D22E96855614A9038DEB7655", + "ephemeralData": "670B7F9BA43C8615CD2F22F21E7D38E02870B6E1BB3E3506B531BAF721" + }, + "fixedInfoPartyV": { + "partyId": "5EC8484EB66F9F59D59BDC574E566D94" + } + }, + { + "tcId": 1172, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A1693B11222425A87D9A2F5DFE94081", + "z": "386B2F01578233366B1A5F85EFD258B49C7505849FC9F112F9AB986302", + "l": 1024, + "algorithmId": "DA524AAC403B5BDB1BE55AAD8A883024" + }, + "fixedInfoPartyU": { + "partyId": "9C713F204F6FE1A7B2493DA1444769D3" + }, + "fixedInfoPartyV": { + "partyId": "86E2F853162FCC2EFC342C224FE9A5EA" + } + }, + { + "tcId": 1173, + "kdfParameter": { + "kdfType": "oneStep", + "t": "727CA35F839C6A6AB8C376686E44014C", + "z": "F1EC0BE1E2A5B5710E26320A97BAB6C1EB77E314895E38187ED15C99B0", + "l": 1024, + "algorithmId": "3FDBFC990BD5EDBBEB358D56759AA51C" + }, + "fixedInfoPartyU": { + "partyId": "9354E4E5C833C10A9FFF5A6370178CB2" + }, + "fixedInfoPartyV": { + "partyId": "4C0C9CEFB6E33E64567154EBE1B3A9CD", + "ephemeralData": "E81C1CFE1AA637C6103962149612618C285DFE498D1BB6668806CB87D7" + } + }, + { + "tcId": 1174, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB04AEEAD61DEED0A7AFD2E6D7340C40", + "z": "40AA2F058E81C275528B8E3E82C8C4809A0B0CB6A4A18347248D0FABCE", + "l": 1024, + "algorithmId": "87CC7D5496B49A0FF3405E9900AC3D53" + }, + "fixedInfoPartyU": { + "partyId": "C52F329388F8623F6EA9C8C99560096A" + }, + "fixedInfoPartyV": { + "partyId": "D9171FFF8EE858987920AB53552A4F0D" + } + }, + { + "tcId": 1175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F18C91E822055F815D4C20C4137C54B7", + "z": "5633CB249C4C2BDA03852C8FD56927FC1363DB26C26C8C309031344E55", + "l": 1024, + "algorithmId": "13B22DF0DD0DD58504385B924D81E86C" + }, + "fixedInfoPartyU": { + "partyId": "459D500FC7868381F9A1871C48F31C15" + }, + "fixedInfoPartyV": { + "partyId": "59656B95E8227AED0765584D9C378549" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 48, + "testType": "AFT", + "tests": [ + { + "tcId": 1176, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F95698572BC2254A609A1D5ECA557C4", + "z": "4D3BAF21BE1AE7F845624D54B9D4397945A357D136F62E57A0B2FFC375B4", + "l": 1024, + "algorithmId": "2D14C9AE4D62BB6176BFF8D176642488" + }, + "fixedInfoPartyU": { + "partyId": "B2D09FF67600237A150638990226F7F1" + }, + "fixedInfoPartyV": { + "partyId": "F3A87EF4E5DB7D6FFC4715CC9D82A80F", + "ephemeralData": "852F2ABB2905DEE225AFB90612BB6817584FEC4D303FBF3341ACA131D945" + } + }, + { + "tcId": 1177, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB196A4C106DD4C403EF47419BB38741", + "z": "6599200C78869E6E87E593CC9B04B041FB37CAF97E2E2C856554612AFBEA", + "l": 1024, + "algorithmId": "52E830ABC13ADBD7C37606F5D07C76E6" + }, + "fixedInfoPartyU": { + "partyId": "254EC36C8601DCFD8605AFD75FC16D76", + "ephemeralData": "1A5E92EF9E7DAA9124D8088C08C8926559DBDA8C8C63F5869EB10CBD92C8" + }, + "fixedInfoPartyV": { + "partyId": "AB792273693BCFC559DC8D43AD6050AA", + "ephemeralData": "B06ECDBD426FB6D7152E7A3BE14896F4AE138E1200A4F31CC1BBA3F49C83" + } + }, + { + "tcId": 1178, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64F0D19CDF3BBBF5E79B939762260C5D", + "z": "2B51C5D6BFAB0B87C8D82F5A52DD09623F01469C5D4F25332F9313E35096", + "l": 1024, + "algorithmId": "72AF159546E13526390A8D81CBA7469E" + }, + "fixedInfoPartyU": { + "partyId": "55F73A1300D92DDE9C3245AF7C45549D" + }, + "fixedInfoPartyV": { + "partyId": "D46D58D468D8C8CE8CC1774A013258B5" + } + }, + { + "tcId": 1179, + "kdfParameter": { + "kdfType": "oneStep", + "t": "838365171B3819E6F317E4A00BC41401", + "z": "EB40E976E4E101A773ED1D9203C5E3A4DDAC4894F98224581D3779F8BBE2", + "l": 1024, + "algorithmId": "56B5A6966CA55293830678035CD8F9E5" + }, + "fixedInfoPartyU": { + "partyId": "CF4FA788A0BBE41F3BADDB8922CF2D6C" + }, + "fixedInfoPartyV": { + "partyId": "E46EA75398F7136E9565D31356547509", + "ephemeralData": "CBA3B6C71A8D695A5995EB746C9E11B200EB4D61AEE48935C9548A78678C" + } + }, + { + "tcId": 1180, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01CA0E3F0778BBF4B49D9EEB13F55138", + "z": "B1A7C19E1CF03FCFF2A626D0FAC184E6B26839E176054E270D88FC022D1B", + "l": 1024, + "algorithmId": "897872670C66D36EA9B9207C93D08DDD" + }, + "fixedInfoPartyU": { + "partyId": "63BC750DA7292A017B703AF164086069", + "ephemeralData": "E5FEFDA6F94614ABC10431800C54A6666F6C0CC25E285BA43D4545F3D542" + }, + "fixedInfoPartyV": { + "partyId": "6FADDCC8096423246BB4EB5CD08C8259", + "ephemeralData": "F8FBCC5DE8E8F17A139B7F4004435CA6964CFFDF2A8047323C68B901C2BB" + } + }, + { + "tcId": 1181, + "kdfParameter": { + "kdfType": "oneStep", + "t": "390AB6A0F33DDBC1D36741BAB2623076", + "z": "57A0CAAE0227B31A3D523D8B30D5FA3C6B43BF4D2D31653F1FA992F8094B", + "l": 1024, + "algorithmId": "34EAB9D17CA4799B074ADDA56FD68FF5" + }, + "fixedInfoPartyU": { + "partyId": "A8F48D81FDF1578A58C1C7316A6FE467" + }, + "fixedInfoPartyV": { + "partyId": "C57570A66B44EF0DE7CC2A6F1E439E55", + "ephemeralData": "E3EC7CD82383A2BAF7385C2B58727FBF8DBC554C34A67D38753AD85068C5" + } + }, + { + "tcId": 1182, + "kdfParameter": { + "kdfType": "oneStep", + "t": "652A224F30FE5FEFE0683B1EE60B273C", + "z": "C1C805118A671621BECB44EECE5F7193A31BADB88CC9F3BC1637DCE4B4B5", + "l": 1024, + "algorithmId": "B5E06813E4075A160FF2C765016BCF51" + }, + "fixedInfoPartyU": { + "partyId": "BA82921D176A257D04845E2FA230F3BF", + "ephemeralData": "A1B4D9C9515BEC3473787DC4CC072BB604AD75CD92F69AE63381D08DCC4C" + }, + "fixedInfoPartyV": { + "partyId": "8FB7CB390849BF3EF03B39C4C5AC938F" + } + }, + { + "tcId": 1183, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DAD86CCAC8CA97632E8AB2FE1D9D3F0F", + "z": "27B39457685F209A75FF7D4564FCEE87F849B88F6EA8D33DD8FA16930B6A", + "l": 1024, + "algorithmId": "D6206E71DB9E2E428EEF7E2BBA96E9D3" + }, + "fixedInfoPartyU": { + "partyId": "D1229075CA0237DB09DB6570C355D5C4" + }, + "fixedInfoPartyV": { + "partyId": "1FA98092B67371F4DB5B2766CCDC0F6B", + "ephemeralData": "495368F47CE8F9AE5E5AD784EC838DFD0900347B0D88F21221878662BAA9" + } + }, + { + "tcId": 1184, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E632E4DBFF345DD0777BF70EA915609B", + "z": "0483CD010540B4D085EE3067D363842D77698F95064144B8E1FAB1D3A775", + "l": 1024, + "algorithmId": "CA1C8494B161D1DCCB04B72AD17DBCAB" + }, + "fixedInfoPartyU": { + "partyId": "EC620868D1A7BAD06AB1ED3C7B9EF7F0", + "ephemeralData": "1D1C88AC03F8D3403AEEF09D153CC0EBE0F4701FD6EFF7027D079CAF2F58" + }, + "fixedInfoPartyV": { + "partyId": "F992164C839C7AE868D49EA8F75451C8", + "ephemeralData": "EE6B53232CD4EC4C37FD1CCD0ED2DB79D004A3DBEE1D1FFBC5F22B11BCDA" + } + }, + { + "tcId": 1185, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9EB990F6B2648B980AD1F577BD96B900", + "z": "ABC32045FB4507B290BA16F7115C900A595CFB613D9A5D92E7FAA621723D", + "l": 1024, + "algorithmId": "ADD3F7BD8E6BBB04A45D28ACDD0617FD" + }, + "fixedInfoPartyU": { + "partyId": "D6943922382619B32DD54A50CC0273AD" + }, + "fixedInfoPartyV": { + "partyId": "9972A1FE6119C0ACE4A299E456D3813E", + "ephemeralData": "B4CBBC8AA4E860D9C955F09E064D6E73786E81F0DD5E2EBBBF088FF8EE8F" + } + }, + { + "tcId": 1186, + "kdfParameter": { + "kdfType": "oneStep", + "t": "81DDEEC6656C8A023535385492F6CC87", + "z": "3BF37618C943040A17ED37FC11BEAD2FB5789DED6D0FBD337C4D56FA190E", + "l": 1024, + "algorithmId": "4E625DBBA25B2FEB2FA15F001AFE783D" + }, + "fixedInfoPartyU": { + "partyId": "974BE78339990B000B62A293DA52FD69", + "ephemeralData": "94B49EF011B24A8C229D4BF004D3C9BD648413F60FF794A5F1B5A6BE5B4C" + }, + "fixedInfoPartyV": { + "partyId": "F86B929C46AD0BB495341ACB0BABB823", + "ephemeralData": "85579DE4503E94A39878673DEC62DF0601A3F473CE2A1F4C5BE2AF6FDBA7" + } + }, + { + "tcId": 1187, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0544AF00D1090284FA929287004CF4E6", + "z": "901176B73F0D6D0AEA33093BAF99C7608670C8B275795E3B3A521F711969", + "l": 1024, + "algorithmId": "0E377EB2FDEB0519C8621A793C399FFF" + }, + "fixedInfoPartyU": { + "partyId": "C9DF1286EDB8ABBB180D9994E6C169C8", + "ephemeralData": "6346518FF481BAC7F28A0749ACE84CC4821312040E7ED13A74503841A1FE" + }, + "fixedInfoPartyV": { + "partyId": "05098A151486F57858CFD5B9B5438DF8", + "ephemeralData": "DC75805434907CEFC95ECF76161A8BE8E45BB787DA0BFFC296659EA0F329" + } + }, + { + "tcId": 1188, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4208D08B1F0F467DBC3DA2042C3810E6", + "z": "4861A43883310C903634B4D3D9B8290E6615CDB57F4746FCFCCDF7732D38", + "l": 1024, + "algorithmId": "C19C4B6B92CB7327E16870EBB6406EAE" + }, + "fixedInfoPartyU": { + "partyId": "6FEC84E4F113EAF4A4D83D59886A5755", + "ephemeralData": "5142A1E8E51350D10C8C625D2AFFE558C449C6679D010E53FDB167E63717" + }, + "fixedInfoPartyV": { + "partyId": "DD71A0577A175AA3E07A6C20DCC11F0C", + "ephemeralData": "B5114B03861E6AEBA46C054790AFCBB214CC5395660A1A0D8E59E50CBB26" + } + }, + { + "tcId": 1189, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CFC6D8C0CFF9177099492BC12F742B1", + "z": "BA11A2A8E7F4913DC2BFD58F15428C1EF363FF69A20CBA390A1248A2C639", + "l": 1024, + "algorithmId": "2414E73C836FF9A381C7113420F18923" + }, + "fixedInfoPartyU": { + "partyId": "95281A063D09A712CC44764A12FD35F4", + "ephemeralData": "BC81CCE8037647A7A9500234AD51A896612A531089779D26DE76CA737283" + }, + "fixedInfoPartyV": { + "partyId": "7833EDD274D6577EF09D3024415F6922" + } + }, + { + "tcId": 1190, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D9EBF88EF05585C7C979184108D6948", + "z": "C8CF0A1791CFDF46772865A995BA3B6177987DD967B17C27EB1471ABC853", + "l": 1024, + "algorithmId": "65467FEF4899BFD8A4B7D562730D6771" + }, + "fixedInfoPartyU": { + "partyId": "1AB81D5F11415D51D4D427F52B21191B", + "ephemeralData": "1717234C44E6673A826C5BBF4BE8AC1DD483A2CC81DC443815F234C9F6E4" + }, + "fixedInfoPartyV": { + "partyId": "3107A518E6E9032893051332ADB52729" + } + }, + { + "tcId": 1191, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7CD38975A10EC1C71CE1A6608FDAAC0", + "z": "0955075E6BFE508E39CFE7899AC88DDECA29A29545F83094FD4BE4133F15", + "l": 1024, + "algorithmId": "269E8D08315A0B59F06465F37ADDCC6B" + }, + "fixedInfoPartyU": { + "partyId": "2B85200FCC16C3DABA79C91C623D2158" + }, + "fixedInfoPartyV": { + "partyId": "DB8D9FE0E5C3B0DB27E6AEFD92820E51", + "ephemeralData": "F9D4B618403A57735B77D2F80C23D3CB6D2A03D1C6C00E1314AEC76473EC" + } + }, + { + "tcId": 1192, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8CA55E1E21ACF0751B128B4E4C167AB", + "z": "6521DA329AFD06D74F4EDC3A45CFBD8F7C0FB313F652D4EB09FE7633841F", + "l": 1024, + "algorithmId": "8496FA508EBD0B6D75473BA93AEBAF2E" + }, + "fixedInfoPartyU": { + "partyId": "FE14BD92EC7BA2861FC7CB6ED5401893", + "ephemeralData": "BD616197BEAFF5C30D3A72FB63ECB311D663782DADCF99ED1A9C125C3F8B" + }, + "fixedInfoPartyV": { + "partyId": "A69A1E9F3B52FDF652C49AA758FFF119" + } + }, + { + "tcId": 1193, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B58BD528129B6C7DE9B5166362FC826", + "z": "D225E249771D886C7213B740701B4B225D93A8E062F288B3B3BE6D2EA24C", + "l": 1024, + "algorithmId": "251DA109CCB0BAB5AC534E991155B9DA" + }, + "fixedInfoPartyU": { + "partyId": "F3710343A6157266AF7267806461F75A" + }, + "fixedInfoPartyV": { + "partyId": "63D169474FA635D938A17DE165DE946A" + } + }, + { + "tcId": 1194, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41FC205AC5E6873A10E32E1EDB6834BF", + "z": "CD39918AEF04B32371B61BC72DD16D99966AF8D0D05653563E671709A615", + "l": 1024, + "algorithmId": "B44F7A60FDBBF5D4B9932018C4FFE7E1" + }, + "fixedInfoPartyU": { + "partyId": "EB5D4E8415DE814C3770BAE77AF9B35F" + }, + "fixedInfoPartyV": { + "partyId": "19C4B378135682A48AE0592DF478EDA3", + "ephemeralData": "D4241A3742F0185A32D9C0A3E6491855D5ECA03D46E199FDDFAFEFFF1D71" + } + }, + { + "tcId": 1195, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1AB1D655E15C6BBF353203845B583797", + "z": "6FB503641DA16288B9B54358B7B43F5462D03390905E2EEAFCE2D2533DA0", + "l": 1024, + "algorithmId": "C607A0B75AA5FDCBA250116F2452D465" + }, + "fixedInfoPartyU": { + "partyId": "FE72F3FC2A4D9AE3354C7ABA8B4BF54D", + "ephemeralData": "BC8BF5BED37FF2DAA745E89B43EF79E798C530F1B5E6646E7E9D2C1D175D" + }, + "fixedInfoPartyV": { + "partyId": "045BC5D326DD76AF4298EB06B8A2F094" + } + }, + { + "tcId": 1196, + "kdfParameter": { + "kdfType": "oneStep", + "t": "909F0C7FED9A415E49CFF5EF5C06BECC", + "z": "C2B93EF8696EE8818667D64D9C22152D4E5FBC2F13395FE2925D6FBF9525", + "l": 1024, + "algorithmId": "DFACE674291EFD1440B0548057B33DDD" + }, + "fixedInfoPartyU": { + "partyId": "12C6DC23A7DC39823D27DE048E5E07C0" + }, + "fixedInfoPartyV": { + "partyId": "A5A399F300D7149E28C8BEE2CA851410", + "ephemeralData": "8F3C4FCA65659648DDF7342AE87F5C22A562C0FA1319E5ED4F4AD15E2853" + } + }, + { + "tcId": 1197, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02B5BFE7F3637429856F4FA8265CEA8A", + "z": "21A615A7C74066E9831E640B59168A7C2B200A66175D0601ABD4143260A2", + "l": 1024, + "algorithmId": "925BD4676FDA238886150A8AD04DAFB6" + }, + "fixedInfoPartyU": { + "partyId": "64E990C855E8DEBE46A207CCD76DC99F", + "ephemeralData": "BAC87B2D9ACFE8745E489D9D783B60EB040CD4CB761FE450B48DDDD8F8FE" + }, + "fixedInfoPartyV": { + "partyId": "72D690ACF31D141144CE1DA962DB7D59", + "ephemeralData": "B2557F8867F791CE5BAAF84E1D651BD487F30DF0839F1CC74C178DF5FDD9" + } + }, + { + "tcId": 1198, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F04FF2DC5C834D3E702F4614A9BE3D1B", + "z": "40746030B654B876FEDDD4EBCBD130401165E870F4C7D349C4ADD6F6CEED", + "l": 1024, + "algorithmId": "89338E5C06A5AD3B8C9DF8AD6E2784FE" + }, + "fixedInfoPartyU": { + "partyId": "46D61FE1EAF357DC5D988D18B45E48B0", + "ephemeralData": "1DF2E194EE7397B2F8B08A2744875EE993F6813E58EE137A06118A530C2C" + }, + "fixedInfoPartyV": { + "partyId": "DC5A3529A0E3429EB5215303AB0EE156", + "ephemeralData": "CE0FA6E4A5D13D968F4B735C01D12199722217BB5A345BBCAFDB5A8C09C3" + } + }, + { + "tcId": 1199, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3919EC725275056D9695CF65A3C39527", + "z": "5855A15D8C239BB51836B5CC73B7A08EDFD01A48636DA2C7E2E0B515D997", + "l": 1024, + "algorithmId": "76ADE8583DB5752057AACAA6CB23B86A" + }, + "fixedInfoPartyU": { + "partyId": "7B86023621CD4595F7D37EA67B5B34E5" + }, + "fixedInfoPartyV": { + "partyId": "4C268454927A247F03641FFE9BD4768E", + "ephemeralData": "4165595A2778F614E6BC802ACFC5A814B2E115E887DEBFCD0F3954BE147D" + } + }, + { + "tcId": 1200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FCF2F497B489FF55161F6DAECEF6EA7", + "z": "B9495AC6F29027947507ECFB30CE99FDE464CB45E1DDC54AEF33789FD675", + "l": 1024, + "algorithmId": "65E4FEDCE85BD422463592FABB43F21E" + }, + "fixedInfoPartyU": { + "partyId": "96B1F90F2A23B8326C5F05720B04F3FD", + "ephemeralData": "66DDC843FD6139F77258C651E3237BEF2940E877420048E23318ADAFA110" + }, + "fixedInfoPartyV": { + "partyId": "83E7C372C221BFE40C9AB8B505F9769A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 49, + "testType": "AFT", + "tests": [ + { + "tcId": 1201, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0885829C52F620FA3AA16B397DC42420", + "z": "395249B6394CB2669609F5E4FE98D0699FB059E71FFE0269F58BB98F", + "l": 1024, + "algorithmId": "10FAE48CDE4F67626180F7594C8357A4" + }, + "fixedInfoPartyU": { + "partyId": "DF95A4251DA60458D24E47E1DFC52D00", + "ephemeralData": "4EDFA6C58121BED094BA1FC5AF203E526DDDA2EF78A66EF78729D001" + }, + "fixedInfoPartyV": { + "partyId": "A5F2661EBE08B12978B47D6C1CC170EB", + "ephemeralData": "161385A889D500C1E07F8D578F51C2A7AE43EA4BDB85606E86C60565" + } + }, + { + "tcId": 1202, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7CA70D341BE9A3545B411F7B510145F", + "z": "57EA5112492DF8EC9C696EB5E13079891BFB42BC1C8F56CB0C5C6DE6", + "l": 1024, + "algorithmId": "662887A22033F29542BFE6F22097C75B" + }, + "fixedInfoPartyU": { + "partyId": "B4F8F385099A1C2B343A8C27246E7D28", + "ephemeralData": "D399B5FC3EFDF3D6D33EF3386B79FA1240EDBB2E07658BDC69BCBB99" + }, + "fixedInfoPartyV": { + "partyId": "D0F81D08F14BED2D95783379FFF81760", + "ephemeralData": "A84A3DE481DEC7EDC217A792F2276D7DBEA63FE1BAFF4C9D202119F4" + } + }, + { + "tcId": 1203, + "kdfParameter": { + "kdfType": "oneStep", + "t": "715A5591A6AC08862AC4F17AA79F882F", + "z": "91AD7FEB904B16F425095A3B5D9D490FB25A439E8A375CA2B7227EA7", + "l": 1024, + "algorithmId": "AB3DE97D7830D5AD45C5A69A34AAAF81" + }, + "fixedInfoPartyU": { + "partyId": "37081550D20886C7FED0BF7B57B41EF9" + }, + "fixedInfoPartyV": { + "partyId": "AE22CB9232907C354C366B4E6B3D1B11", + "ephemeralData": "3F43450B7DB2AA267064DAF9130DDFD43651B4969E784F36038E8090" + } + }, + { + "tcId": 1204, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F54E5A367B8B222BB93A65DAC4CA9AB3", + "z": "52F6520CC89FC75E8FA7E0E6F0E2A451461AF392C512C6194796A9BD", + "l": 1024, + "algorithmId": "49A80D5BB6CD8F37A7308875220B462D" + }, + "fixedInfoPartyU": { + "partyId": "E6310488ED306177B2F8D840DD71B5FC", + "ephemeralData": "B0847930AB79063D82DCC8BFCFC73BCE09F696BFB355949B408668F3" + }, + "fixedInfoPartyV": { + "partyId": "4181291B2061126FEA187CB8955A07BA" + } + }, + { + "tcId": 1205, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24921A50896768649D6A8F21795AE03E", + "z": "5AEEA58087AC8CCF35BCAD59F2606BBBF8A33143BE65FE0CEFC935FA", + "l": 1024, + "algorithmId": "41F2169FA5E185649F3685C35242EA16" + }, + "fixedInfoPartyU": { + "partyId": "EF359B7B3F35024C69ABBDF3494EAD1D", + "ephemeralData": "7856A6F7BFFE0559E296A10A10666E42896D555C5EA2307408F8E271" + }, + "fixedInfoPartyV": { + "partyId": "6797EBAC7CA852F5C20F9BBC5634BA7D", + "ephemeralData": "F8B81BA45FA6CC1720A1E02AD9CE1138E36C920D9FF9702ECE9309DF" + } + }, + { + "tcId": 1206, + "kdfParameter": { + "kdfType": "oneStep", + "t": "285B0A283A7235B3CF151A6C8D61E7D6", + "z": "50A02202FFDD9A4BCA711D14C93627198D8EE91131632BFE95965E93", + "l": 1024, + "algorithmId": "94795344D2862577A1E5FF8654F2181A" + }, + "fixedInfoPartyU": { + "partyId": "837C2F83AB95E4BDE53E5EC96C78AB8D", + "ephemeralData": "882F0C51E8BBC3217065A3138ADB929681F8DD91980A25A8FE8CB587" + }, + "fixedInfoPartyV": { + "partyId": "8138D46D85E551146D7A735A1E1B46C6" + } + }, + { + "tcId": 1207, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52F577BEE9FDF1A1DC7696F323BDD10F", + "z": "F4F81B199E01756317115C5C6F715C7040251585CF377112A0222E81", + "l": 1024, + "algorithmId": "C1F5D34930F932F4ADF17EE59AF88F35" + }, + "fixedInfoPartyU": { + "partyId": "DD9EED999DAF55B01BAEA73C7CEE0881", + "ephemeralData": "AD07BF56AEC903A8277D4E4378F687842D0BEEDD65628C8D7F446C36" + }, + "fixedInfoPartyV": { + "partyId": "B85F168B7BF374B4AEE32C23D7757E73", + "ephemeralData": "5ACEC347A4570A34785EF2B584CD2996A332C8B6209F5625B8CD2BEE" + } + }, + { + "tcId": 1208, + "kdfParameter": { + "kdfType": "oneStep", + "t": "31B823F5FEDE348A55E4D1E860FE3C19", + "z": "3E51B9595CC0909BEDCEF559FF960BF80BCBC6F2CE93D9072BF85ABC", + "l": 1024, + "algorithmId": "881E1BD0CADF3C590261E373DC0E3E2E" + }, + "fixedInfoPartyU": { + "partyId": "216D30A83F80F222760EAE83360C6204", + "ephemeralData": "7567DC20FC4A8795BA8FC955874ED29B9A2B96CA54FFA4DF9E7F5CD9" + }, + "fixedInfoPartyV": { + "partyId": "18B8E10CBE25A0D25C80579E226B448E" + } + }, + { + "tcId": 1209, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3F2C3123DF7702DCEAB1247DE896A0A", + "z": "2DEE0E4C1CEF3BE8ED9AC44204741B52DDE0FC4BF7144C51F2034118", + "l": 1024, + "algorithmId": "1D00D1011E90C709E3E7049D1CDDF72E" + }, + "fixedInfoPartyU": { + "partyId": "4B939256BECC0ECEC005ADD545D1AA0D", + "ephemeralData": "F83436B415A4089A2BA1E9E75D42A5E652DDFA04294DFAF2FB127CCD" + }, + "fixedInfoPartyV": { + "partyId": "B2D01B83AF1A31DC927EEAA3A85597DB" + } + }, + { + "tcId": 1210, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3902128E0DD9A91CC64C35171CCE5766", + "z": "9D0F91887AD4761D4F81A60B727107183920C6612637DCAD256D16D8", + "l": 1024, + "algorithmId": "4CE9834CF301AC91A6C584472B58D4B0" + }, + "fixedInfoPartyU": { + "partyId": "50BBA81F8A9EC415361BC8AA7F18B7AB" + }, + "fixedInfoPartyV": { + "partyId": "CC1B9CF341621BB391E802663715AD12", + "ephemeralData": "B8ACF7EE2FB54566FAE3756584BB752FF707465D3BEC508FA1AEA97A" + } + }, + { + "tcId": 1211, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8D7E138425BCA0A1011A6A173D977A06", + "z": "A403A418FF527A50761438C0CFAEBD20CCB32FF278A3554D0E88602C", + "l": 1024, + "algorithmId": "3C891124C8F8B4F694984A44A4A53269" + }, + "fixedInfoPartyU": { + "partyId": "E84A1ED7B0EF7A88C49C6A35E20F728E" + }, + "fixedInfoPartyV": { + "partyId": "51A8F6890EB13C08FE4C65ECF1E3E04E", + "ephemeralData": "EA2E2DE4C30DA1B21FC3C9486A30329E63484546E921B596D11F80EA" + } + }, + { + "tcId": 1212, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8486CFCE61C016CDBEB641F68ED33B89", + "z": "98AD2FB513281B6AF7A0072B745763C2397EF552A355650C5254F6FD", + "l": 1024, + "algorithmId": "0FDBF682DC0B61D245B662AE7AED6B55" + }, + "fixedInfoPartyU": { + "partyId": "013C2FE5240388A18BDE86DA037754A2", + "ephemeralData": "03A2D2CB853C5E7A7EFD01BCB7DD9C41CDE21A8E2FC7364CBE69FB7D" + }, + "fixedInfoPartyV": { + "partyId": "6B4CD4B01E55DA4433385027DF3A127B", + "ephemeralData": "ABE273A963F0A603E07CB4C3937AF2E3BE1E48833E2E286D26EC60BE" + } + }, + { + "tcId": 1213, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7817F4F8161CDA29EDA6ADAC4262252A", + "z": "848A4C86F9007A226B13D42A92CFE57A44A68E66BDCE76CBEC680D9A", + "l": 1024, + "algorithmId": "99B6EDA56D00F517FB96E05FB4392CA6" + }, + "fixedInfoPartyU": { + "partyId": "1DDCA457B3CDCA8598D388DE220280C4" + }, + "fixedInfoPartyV": { + "partyId": "EC7F666E0D1F55ABE124EB890B437261" + } + }, + { + "tcId": 1214, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D0C77355A43B03646D82023FE8A536A", + "z": "04E10BF7CE1074C1AA6F309EA097E0483E75358C79FC8800488BA1D4", + "l": 1024, + "algorithmId": "6872749E00834475E1180FB41852CFEF" + }, + "fixedInfoPartyU": { + "partyId": "EE721056E2682AE9FD2B7638FDACBDCC", + "ephemeralData": "C873B799B5D1067789CEACF8A6F451BC90604B610804BCA21856FE99" + }, + "fixedInfoPartyV": { + "partyId": "2AD6F4A80129EB8B0D5D232201B0538D", + "ephemeralData": "820D1AE6F3996E5E9A0D7B3B48EB7FA02C933465A4645E3B73D92D6D" + } + }, + { + "tcId": 1215, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2C50BF062A3A945C1F96BC4FF4867EE", + "z": "EB84B29541A5A426E101AA9CF71121498D9D7DFE61674DA298B15E13", + "l": 1024, + "algorithmId": "05CD03C84C040592C7EFDB94CA738FAD" + }, + "fixedInfoPartyU": { + "partyId": "4601E6FFA06334516A39613F87D68C37" + }, + "fixedInfoPartyV": { + "partyId": "C8EF036FB96E7CE30A45C5AC9723776C" + } + }, + { + "tcId": 1216, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB4D47EF4FFF0F19158E1C79C03FA6C7", + "z": "5C43CD9E3B7CD0F94EBBCECBE852FE002FFD5EE431CBD14186EC3CBE", + "l": 1024, + "algorithmId": "193EDD2E581AFE898716EA6B5CE32C57" + }, + "fixedInfoPartyU": { + "partyId": "1ADC0EDBF6D8B8F0F1995FB14297C6EB" + }, + "fixedInfoPartyV": { + "partyId": "8D73E7B1C0EEC1FE8B218416BC1A145E", + "ephemeralData": "AA9DB2B67642D49F29B93F1C62F3EB73C5F512F86065A17DBBC71D46" + } + }, + { + "tcId": 1217, + "kdfParameter": { + "kdfType": "oneStep", + "t": "559501C82A56A16D4EC6E6E679241571", + "z": "FA787D64C49A072D072CC81F2B4409B29B9D5E25ACF2C0E0645BF802", + "l": 1024, + "algorithmId": "C8807B2C22E9A8E04402DC9BE6CC2BAB" + }, + "fixedInfoPartyU": { + "partyId": "87547823B0E81C1F34209412DE7CD885" + }, + "fixedInfoPartyV": { + "partyId": "4762FF965EFA278DD5FF0A2B5C649C2A", + "ephemeralData": "266C85097CCD5A9E14E13A7B12B3B5E47BE0030B0FE81E88BEE24D26" + } + }, + { + "tcId": 1218, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE5BDDA823F384AEA6056C993CB806E9", + "z": "5BDD316794F723DBC1B27A3C53ACBE8A4F3A3718E898DDE496B0E030", + "l": 1024, + "algorithmId": "1D75DCB50FC88C24D6BF16E08BD76D01" + }, + "fixedInfoPartyU": { + "partyId": "6123CF6D0B38DF2BD4DE1A30462E9C23" + }, + "fixedInfoPartyV": { + "partyId": "00B32E1BE90DD3992A2DE79FD8EF1BB5", + "ephemeralData": "D047971B01B48383ED15B26295FF0B54A7425C27D8E0701EF3087CC5" + } + }, + { + "tcId": 1219, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37058BCCFC310D12F5034CCBE62C0210", + "z": "7902AC82559A4351AB9061168D9F8DA14DA6A371A27E6D928F5F5294", + "l": 1024, + "algorithmId": "9220D4A2F11171E822428B8714A286A1" + }, + "fixedInfoPartyU": { + "partyId": "28748A83A3FF9175505CDA6C5C56455A", + "ephemeralData": "6285184F30C7E0494D2C48046AE50C0AB750E559FB6AE5A46E8454B6" + }, + "fixedInfoPartyV": { + "partyId": "F41261EB60B50B7D58CCAF72CFC727EC" + } + }, + { + "tcId": 1220, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD9934EEAE3E854DF0515DE3FE631D24", + "z": "71E213F659F472295A6592FC726D0E75BE333BC0728A5D970AB652D6", + "l": 1024, + "algorithmId": "C95D7A151809D43B0E8957F6300447B7" + }, + "fixedInfoPartyU": { + "partyId": "A83EF192C63253C4C3410B3B061FDB18", + "ephemeralData": "60A9AEA9CD6A822D1CE459197B83135C5D63D43ECF5BB1CB183F7A92" + }, + "fixedInfoPartyV": { + "partyId": "36FC37C4294D59A399632F4C3437C79E", + "ephemeralData": "0CBFD7EAB02C112F9C7630FB081D6E710F0FFC8B5998794BAE3F6865" + } + }, + { + "tcId": 1221, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9BDA84440877A6515AF420257DE6F49", + "z": "1A6E28CFA57370B5E00BBFBAC72D83439A97FA47C9B9E1240384E080", + "l": 1024, + "algorithmId": "1D4B4C79F0B3D0B89DAB7395D33D7FE7" + }, + "fixedInfoPartyU": { + "partyId": "080F14B568F848C7986FEA130F596BEC" + }, + "fixedInfoPartyV": { + "partyId": "73FC33DF6D1013DC9D8585BF4DE2D114", + "ephemeralData": "5ED73672D3E52CCD8C56BBFB6B61A12AA3C772009513598788A1DCDD" + } + }, + { + "tcId": 1222, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA0450DB72CF63BAA7955EFAD58BC52B", + "z": "04AA29A8D3AFC827F14BD0B64474455EB80E3424075D9041BA2FBA03", + "l": 1024, + "algorithmId": "711E5BB473E16353BFC76B6865D13E31" + }, + "fixedInfoPartyU": { + "partyId": "C5B083689A30632CFA6F165F03E3559C", + "ephemeralData": "A052187AD548590A50CF6B58E617115C0A3BA313040ABB8BEF7448DD" + }, + "fixedInfoPartyV": { + "partyId": "734CFED999101536E1CB83EA17A488B1" + } + }, + { + "tcId": 1223, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9D2D12DC2CC814880F3C101AB1D4BB8", + "z": "3AF82C89753B9C658FAC77C30455D4D34B3F398E248A0BCFC8F8FB88", + "l": 1024, + "algorithmId": "0ED349B85910C49B02E04FBC41AD7C37" + }, + "fixedInfoPartyU": { + "partyId": "C71DF9C1AD3E0A51BCD126F2CAD41D82", + "ephemeralData": "38B8B29803AC59756470A24F12A33F82BFEB844224B5FFC82C73ADA7" + }, + "fixedInfoPartyV": { + "partyId": "A2AFA51E1EBA0E857FE1F3737F6BCEFF", + "ephemeralData": "E7418D235D8E4C6C1874257C4615936F004E0C62AC57719A9BCBCFFD" + } + }, + { + "tcId": 1224, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AFDBAB3EFC514CCA6526FBB36431D321", + "z": "3522795DD7A25E5D2ADC820D0CD1AD89804347BBD059F1B04923A5B9", + "l": 1024, + "algorithmId": "768A81CDEB33B72F12781C82EDDE83D2" + }, + "fixedInfoPartyU": { + "partyId": "6BA9617930C5415D273284DB83D37BCA" + }, + "fixedInfoPartyV": { + "partyId": "CE36EB4C035B51B1CFBBEF457B1CDBA5", + "ephemeralData": "D6332AB4188C84BA069DB81E36B4FCB1ACBDCCAEA97B04A4BF743F06" + } + }, + { + "tcId": 1225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3166302DDABFE44158E94EA4D4C9272", + "z": "3B12E3403344D8D0BC48DF469DCDFC8516179DF8ADEDD783BA733936", + "l": 1024, + "algorithmId": "B3AEA9CA2E136F6D6A05423A57F9CFC7" + }, + "fixedInfoPartyU": { + "partyId": "4C559EA49B30F43591F8505909682796" + }, + "fixedInfoPartyV": { + "partyId": "C49F7940F55DF35A1B22960D30488F78", + "ephemeralData": "9A5CFEEE4691890ACA54C8B6F7833117ACAE52673C0435BD0E35D016" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 50, + "testType": "AFT", + "tests": [ + { + "tcId": 1226, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01530744BD7A93E5C912E884B2C96E7B", + "z": "98790EB0B2F3E47124207D966060DC1F4F49B6CA1E70AA1D26E7D710FB", + "l": 1024, + "algorithmId": "C136B38AFC33F8CE5238120CF37AC5DB" + }, + "fixedInfoPartyU": { + "partyId": "32BA9358C35D9A4EDC7A0031A5C70D7A", + "ephemeralData": "5D1FFB1284621E1DA4EFBCA4D8310F7535E42C89DC328AAE5C19B6C679" + }, + "fixedInfoPartyV": { + "partyId": "4D7755723C5F1E7EC24836E8C129DECC" + } + }, + { + "tcId": 1227, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F773F18BBAA58BED6AA53C636CF28EA", + "z": "36342CE6CEE296ABFAE70480D87F0A9B8065D000900091137C4D0E2E7F", + "l": 1024, + "algorithmId": "82A3AC6F007A97ECC0C8E18DEBBC7935" + }, + "fixedInfoPartyU": { + "partyId": "82C5A6CE96D605559E40813A20ACA70D", + "ephemeralData": "502D7A82E1C9194545235883CA5DE6967E2B98D3458F3A98E22B4E2355" + }, + "fixedInfoPartyV": { + "partyId": "A8ADF590720F2A0BE60991895FD0052C" + } + }, + { + "tcId": 1228, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9883B6E3C44BE6FFBC1E1DFD7DC213A5", + "z": "52092A46717AF97BB3D7E94D172DF18BDF1D20F54307B139C9B2F74820", + "l": 1024, + "algorithmId": "2B7319F11D1C2F2693D79EEF29029098" + }, + "fixedInfoPartyU": { + "partyId": "FD0839BB626C61C022A9FC83AB70B012", + "ephemeralData": "757DEB570A488E5B71AF4431B4A80E83407C4EA5E4ABCC95AD1EF474DC" + }, + "fixedInfoPartyV": { + "partyId": "5A569FFFA41B653414B56A707DF141F7", + "ephemeralData": "0B29CB7F935918D0FF5C63EC364EA95613ABE5808F4EC30807BA5DDE7F" + } + }, + { + "tcId": 1229, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2386A219CB7E83264F0CFBFAF4C5FF25", + "z": "9B659333384F500C3C891E6BDC482690C794D2497590A760C5830FB728", + "l": 1024, + "algorithmId": "2505677953F69F9795D519E9B982454B" + }, + "fixedInfoPartyU": { + "partyId": "29B17F3457C4608258C22BD319F57C09" + }, + "fixedInfoPartyV": { + "partyId": "42CD924AC0671BE6FC83AEEF355D9688" + } + }, + { + "tcId": 1230, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1631FE251EAB1D5BEC736135EB6BE04A", + "z": "F8964C3C70906CB56105759CF52908FA148BF4C02BCC99FFBBCAF6AF8B", + "l": 1024, + "algorithmId": "0150ED0095AFF3A729E6A4B3A728E4F2" + }, + "fixedInfoPartyU": { + "partyId": "6C75BF9E464B4686F6500A99C2A904C8", + "ephemeralData": "BE29556F32B8EF7BC94BBB62D302B27F596643D5B42B888828821460D7" + }, + "fixedInfoPartyV": { + "partyId": "0C34E497207BA07682EB648923F6F6C2" + } + }, + { + "tcId": 1231, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB816000941FE98F6ABA03FAF54B4CAA", + "z": "42EC82D82A8C2A1FEE91F34438BD07D95011E26AE7F2FFA148D3ADA9F1", + "l": 1024, + "algorithmId": "67AA5A5CD32C589821A861D51142E490" + }, + "fixedInfoPartyU": { + "partyId": "20900E594D091ED7ACB3E141D6372114" + }, + "fixedInfoPartyV": { + "partyId": "121E6FA9207ED2FCF06DBB5B61E1B51A", + "ephemeralData": "8B340F44E6C965B8E00ACDBE816C9A109544E925611053F70F3BAB48D2" + } + }, + { + "tcId": 1232, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F9057DDFAAC2F06B2C64ACDF3E38FCB", + "z": "FEB6D3817A1564236F03949146B79A320678471F73B676AE217A9CCC85", + "l": 1024, + "algorithmId": "90D135BC1B27DCE3574AAAE5DA344060" + }, + "fixedInfoPartyU": { + "partyId": "03AE802C191C6F5698EF95174C8B794F" + }, + "fixedInfoPartyV": { + "partyId": "BFDBA0FF8667629F8CC34BB4F494D3AB" + } + }, + { + "tcId": 1233, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0319A88B7FAD8452B1D112512C9CA958", + "z": "065E622C1A0858DE7F0C0EB395E37240C2A1C99D3A6C44AF6B7AC91E8A", + "l": 1024, + "algorithmId": "FAC97B8A853CF454AD47B3E3B5DEEB1A" + }, + "fixedInfoPartyU": { + "partyId": "48B4F13065A88E4FB16BFA39DBAC22C8", + "ephemeralData": "A765244631074589C61D7B7266E54C3F60C1C6AB830C99D8E9CA1212EF" + }, + "fixedInfoPartyV": { + "partyId": "A54EB5CE1249DE3B4C503DEABFA4ED4E" + } + }, + { + "tcId": 1234, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F89934C94CB28538C8DE42BCFA9BA23", + "z": "2A1264E954ACC3AE2CA504C70195B8D9AFA33BC2CF3723D8FC3BACAA4B", + "l": 1024, + "algorithmId": "57A8ADCC19501CAA4C73F53BB876E291" + }, + "fixedInfoPartyU": { + "partyId": "A9680071964A5B6D0122CD21921600DE" + }, + "fixedInfoPartyV": { + "partyId": "107412E7FFE79D03E38F8592356F7ADD", + "ephemeralData": "023B301EAF877A4CF5A2EA0C6A035AADBA0EB96B9494960B8D1024C2F0" + } + }, + { + "tcId": 1235, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A24A3F72988DCF36E9C9074A9F4F3B6E", + "z": "3F393C21EF726E30B4BEE4E1DBC655BF19A91359BBEFD3AD91AFA4E044", + "l": 1024, + "algorithmId": "D020BF85FC4F38B6E4CFCD09720BB97A" + }, + "fixedInfoPartyU": { + "partyId": "F4F1E35F68C03E711BA5B8ACEE777237" + }, + "fixedInfoPartyV": { + "partyId": "99716FBF317114EE8B5A91BCC77A76D0" + } + }, + { + "tcId": 1236, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9615D31F0A2494ADE1FB920D8E01202A", + "z": "B21B5FCF6B6F11755AA4A94C64B7E5956DAE50988B19E5AFDB8FBCB57B", + "l": 1024, + "algorithmId": "D978BFCAAD2A3CB61F16D6AF0CB06601" + }, + "fixedInfoPartyU": { + "partyId": "417503E73A7AFEE90314329427E2000C" + }, + "fixedInfoPartyV": { + "partyId": "CA4F0B244DA4053B702AD2A66DAF1874", + "ephemeralData": "B6702C59B6B72E65446B475B1E2D9B72736A2E4E7AB3D062D8876E977F" + } + }, + { + "tcId": 1237, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8DC3E609C8E7717DC5B0739E42B49D7", + "z": "B8B88B0AC924F9AFB1303C0FB77F0013C0FFBE68148D044D7AA7CD96DE", + "l": 1024, + "algorithmId": "A83E1AA8870B3BDEA4064730A2E6252B" + }, + "fixedInfoPartyU": { + "partyId": "48D1D09E458A2E964C11A8225E9F4469" + }, + "fixedInfoPartyV": { + "partyId": "4BC170DEA99C2E37AC0251E50F76031B", + "ephemeralData": "A2757AEBB29CF384A84288EE6DDB28DF13EAB1E12133EF6B9DA01E23AA" + } + }, + { + "tcId": 1238, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06F453EEE52D48D96CB2AC1AEAC2F770", + "z": "A820BF3076BF1978992FC919AD53DDBC2E5C5F6B49CFDB9999851CC216", + "l": 1024, + "algorithmId": "039E56FA4B54BB0F7FBED669999D286B" + }, + "fixedInfoPartyU": { + "partyId": "4CAFA1F31BD669193937344DC7BC91D8" + }, + "fixedInfoPartyV": { + "partyId": "BBD9690F5CA99D6DC489D438DA6A1D3E", + "ephemeralData": "DC8E97DF0233BC9FCDB6A2F21F726AD7A513F3B09419A687E195A2DA70" + } + }, + { + "tcId": 1239, + "kdfParameter": { + "kdfType": "oneStep", + "t": "850ABA4554B3C3D392BE30DE96A37A62", + "z": "82CFBA3B7F611FB45A4FB8BC89F145FE8B462440C31D3B1DA2F928A273", + "l": 1024, + "algorithmId": "65BA9DF0E2E4BBF8DBC636938DCE3E92" + }, + "fixedInfoPartyU": { + "partyId": "0C9ED2853F45C2C0744D6E5FB03D9572" + }, + "fixedInfoPartyV": { + "partyId": "6C62677AC782BE2ABB0289CAC27ED507", + "ephemeralData": "ADCAAF34F53B0CA7C051E534075581E2D41073FAC97CF78F2C95E7AB51" + } + }, + { + "tcId": 1240, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1F810CDE67F3EBEF1981E829C6116E5", + "z": "2BE627C99DADBDA7E4F498FCF15AAC98FF666A855B29126BFA60D2380C", + "l": 1024, + "algorithmId": "B6B8CCC4CCDA93A98884AA24E6BA35CC" + }, + "fixedInfoPartyU": { + "partyId": "B3FD4038047ABC58FA8BBFE99B98BB9E" + }, + "fixedInfoPartyV": { + "partyId": "2C4330C3247B650C0378D1F4259225F2", + "ephemeralData": "D5105ADD981FEAAA065402D76BF9BF66ACF01E3F995F20D815CBD2C9BD" + } + }, + { + "tcId": 1241, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0627DB642756F0207DC3EE490CF0C636", + "z": "1BDD6075B2149C4C2C3AC292AEDCB6128282A50BBE77240E0EE1891191", + "l": 1024, + "algorithmId": "7E20C008CD03CC1ACE4E71CD80F27503" + }, + "fixedInfoPartyU": { + "partyId": "483D4E78A228703F36F73BFDA53F6927", + "ephemeralData": "989A226FA5BFD684DC66A2975B47AE992F747445DAEC18D27979390DFB" + }, + "fixedInfoPartyV": { + "partyId": "82F623B82697ADA1A3527970CC5EFDB3" + } + }, + { + "tcId": 1242, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66DF80D11047A8F9F06DD885ACBD8CD8", + "z": "F2426AE6F9F5724E0FD00F7C1CB9371226F912175F6CABE829785B884B", + "l": 1024, + "algorithmId": "6CD5C1DB895946F12BFC3AEB63D667CE" + }, + "fixedInfoPartyU": { + "partyId": "C56E4C51E1F0425D65533DF367705AEC", + "ephemeralData": "EF1F39BF53E4D43392A1BD7379687D437E6515FC560E7055F38E70E7C9" + }, + "fixedInfoPartyV": { + "partyId": "3D409C58FF05F864D2831C862F0402BD", + "ephemeralData": "A2B87A1496FA26F73511FA991F511B343A8C1296E024B1D9D77872FFDF" + } + }, + { + "tcId": 1243, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44BB3C683B385AC20C7BDCBE2CB58732", + "z": "AC8B2C91055B6F524461F5427A5EEBEBDD7F92FB0F0E063937AEEAB7EC", + "l": 1024, + "algorithmId": "87E08E58D6AE1A92D4A9E4E6EF9E8138" + }, + "fixedInfoPartyU": { + "partyId": "49C31DA681F85031A3A1EA6A5F556C6D" + }, + "fixedInfoPartyV": { + "partyId": "7A0CA5A88F489AFF594725C1D96ED62E" + } + }, + { + "tcId": 1244, + "kdfParameter": { + "kdfType": "oneStep", + "t": "526CFA14C188556A699DD5245643F87F", + "z": "4EB1F6C7D8BD83DE89CBE4D26FE1BC9937A4D112988347CB8D598305E1", + "l": 1024, + "algorithmId": "AF826EA67F6F909F1986D70760307593" + }, + "fixedInfoPartyU": { + "partyId": "0412BEBFB0B32128EBA19E1D23A405C4" + }, + "fixedInfoPartyV": { + "partyId": "95D5C681C58102C8A0164252A698D031" + } + }, + { + "tcId": 1245, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C7DA7ADF7D9FA2438BE7B95A7EBCEC4", + "z": "FC8D609E5D4F76CAB92ACA5E3AB7398339C9543134775070A0BB517510", + "l": 1024, + "algorithmId": "9338C3D74E7A731BB04BD68785D61BCA" + }, + "fixedInfoPartyU": { + "partyId": "276372747E54F37C71613D0EF6730254", + "ephemeralData": "AB766ABD45D8462AD2E02EE07AC210015E02FF46B353DC4FBC22C0A1FE" + }, + "fixedInfoPartyV": { + "partyId": "62F65BA396B397DACCBF9F6727125744" + } + }, + { + "tcId": 1246, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DE15E9DD592E70C9AC31CB81B91582E", + "z": "620A063A804B60ADA641EB1DB18FB173E1064D6899EADC4998CD8A8503", + "l": 1024, + "algorithmId": "1AEBFCC0CD0440CBF0AAF4F112D44367" + }, + "fixedInfoPartyU": { + "partyId": "CE5081A77BE5821E723ACA775F6C52D5", + "ephemeralData": "C6059B931D77A969A6E015C488D2425D4D3E2455E69F737F23023598B9" + }, + "fixedInfoPartyV": { + "partyId": "157490BFF9D2B25FD46D81C37C102CFF", + "ephemeralData": "E7421129FED5DC89C21429E7D96DE48FE5BEEF4F16EE3ABD1EA8A224D1" + } + }, + { + "tcId": 1247, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7B5B305A7AE0E1B7AD14854CA725823", + "z": "81DF31DA6D22F53008AF8F70B95CF60E21A8A129268CBC13B95CFEBEA8", + "l": 1024, + "algorithmId": "60749920171C43DB8A982FEE4D553F6B" + }, + "fixedInfoPartyU": { + "partyId": "A72BA3E59B0FA7179B616E448D2884F0", + "ephemeralData": "147FC9A1C1949FDD1A78A4350BDDE2DEEFDBC978CF052395EE51180D58" + }, + "fixedInfoPartyV": { + "partyId": "98F6758804EF0230C62382437ACA8C23", + "ephemeralData": "73B533DB16BE5CAB60FFEBABF0A3CC4C90836E7B0F2E876EDABD2DC828" + } + }, + { + "tcId": 1248, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB24F4816A3D08024039F8AB39B67731", + "z": "6D2D1C916D2E822F6FDF536DF546742A9EFF12ED668DF10FE43FFF837A", + "l": 1024, + "algorithmId": "CA29827ABA40364AE786AA351ED2A627" + }, + "fixedInfoPartyU": { + "partyId": "E6BED2298522E5EA83F73F641255661C" + }, + "fixedInfoPartyV": { + "partyId": "C4F253D1D1004B6C45A01374F693D7A2" + } + }, + { + "tcId": 1249, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D3732B3DF12F7D84159572ABCFF5F12", + "z": "7143FFF5323DAA545B7D85C5584F40E2B4FA04188BE27118E7B3048A0F", + "l": 1024, + "algorithmId": "5A915AC5714DDC66E033833AD7368C95" + }, + "fixedInfoPartyU": { + "partyId": "5311301CEDF972DE563B62CFA4342D54" + }, + "fixedInfoPartyV": { + "partyId": "2E18F280C6DFBB21BAACEE87C2B6F58C" + } + }, + { + "tcId": 1250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EF617F525664F2D9E920A03AA598FFF", + "z": "1A553FE22FFDF814F855B6BF9F6B6005C0EA314823BDA0E92EFA23FBDA", + "l": 1024, + "algorithmId": "D99BD3D49E0C17015EA880A46C80C108" + }, + "fixedInfoPartyU": { + "partyId": "D9BA879CEF15AAA1AFD8C3CD20EA6883", + "ephemeralData": "66A014FDBB8741F2CA47DFA0A34BAA4CCB2502C646A1613586FBEE27DD" + }, + "fixedInfoPartyV": { + "partyId": "D5FD877F8833FC1E66170487243E8C5C", + "ephemeralData": "BEACA384E492474301C439E93AC020883F66E6EBDD91DAE7F8A46B5ED6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 51, + "testType": "AFT", + "tests": [ + { + "tcId": 1251, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E48CC3E052C80F6F4CAB2C16158D111", + "z": "4388EEF0F38CDFB9785DD6014BBEF71732BA4ABD7E7B8723E0CE1D3F9F877975032D335C", + "l": 1024, + "algorithmId": "25826477E56C39C0CAE4E5F953CBCCFD" + }, + "fixedInfoPartyU": { + "partyId": "F348AD046ED1EAE3A422B84A97AF7E36" + }, + "fixedInfoPartyV": { + "partyId": "FE35EFDA905FE60E1B9F02E275646716", + "ephemeralData": "0964CC6F9CFB0914C2D13B7C107C54CE2386DAE198960B73EE0417671AD55EE8229A3E48" + } + }, + { + "tcId": 1252, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E738928B747CA7ADF576C7586324393D", + "z": "091F418A945119DB3EE82CCD25F0E12EBB853825BF060422309E426FEEF16882D244867B", + "l": 1024, + "algorithmId": "326E06909B29C326DD8D57E6962243ED" + }, + "fixedInfoPartyU": { + "partyId": "524EBDA0A9D3452915F43548D4AF9CC2", + "ephemeralData": "880D86FFCA1D9E3F5887FCDBECF872B08989FDFDE4E0A50AF15613B27F56041E959AB97D" + }, + "fixedInfoPartyV": { + "partyId": "C0A3C4F39F1F239E2295555897A37384", + "ephemeralData": "2A35055DFA7B64E7DDB74ED6DD5B30F2598960579883F28BF51440FE7D22BAAEC00A5CC9" + } + }, + { + "tcId": 1253, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41CE5712873377BFC82D9B0921FFD52C", + "z": "CE903653980C2269776CF27787AF9EDBCAD374B1BF5DA14A29C4D6EA36BC2247095D7459", + "l": 1024, + "algorithmId": "12B6A242EA7822EF1EAA9CEF2BBBA523" + }, + "fixedInfoPartyU": { + "partyId": "9ED6731A1D7D04D63337C8180ACAAD44", + "ephemeralData": "D14F146E4CF55C4E7472B17C6613B1C8A9047B8E1114D62CC9C7CD45B65492D5C4BB6504" + }, + "fixedInfoPartyV": { + "partyId": "F88C0C692EAA696FFBD354751B6F09D5" + } + }, + { + "tcId": 1254, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9DBFD291512D90582814EFA58EA1841", + "z": "00C71262A046FDE3F0B703B2BDB31A47F529FF2CBB633D483930C5BAFD01DD60F63900D3", + "l": 1024, + "algorithmId": "6E64CE009BCC3E9D7012F5C9BC86340B" + }, + "fixedInfoPartyU": { + "partyId": "29E85675C83A481D359EED17630D6D94", + "ephemeralData": "A07CCC1C148C7BEFC96A9F7D7C5ADDC5F2BF26637535D68F7EBD1910265D437C4DB872E6" + }, + "fixedInfoPartyV": { + "partyId": "2F115204718EB6E1D3063DB02A18B30F", + "ephemeralData": "BEE4EA5D699CC4F911C79B86D68741940EAF65955AC262A88C953794D8DCCF3B18080E37" + } + }, + { + "tcId": 1255, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2199AB55378FE7051E8B82E05B8D9710", + "z": "CDAA98DA4263C10994832884232AD63ED6403BB42DD3E4F2A495603729AD5B59FB9C3FE7", + "l": 1024, + "algorithmId": "9E9F100D92B974EEB9F8987B884610A5" + }, + "fixedInfoPartyU": { + "partyId": "19836213212BE6ED7F2464EAB445A374" + }, + "fixedInfoPartyV": { + "partyId": "395AC952FD761F18D73176791510E2C3", + "ephemeralData": "72A90EE7D11D9B82AD44D1DC142CFAB89AB517D7493EA78062FC9E35AAB2D9EB8BF610B8" + } + }, + { + "tcId": 1256, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B42A02F254013CB83B10EFCFF6A88310", + "z": "B0338C307D69FCE972CFD315C1A463545771E143E10E7B005EEA7A3590187D418AE63095", + "l": 1024, + "algorithmId": "9EF537E1C8415A805C51EBAE870E25B0" + }, + "fixedInfoPartyU": { + "partyId": "1110202D3C3AB10555C1176A925C6A50", + "ephemeralData": "2B5DEC58EBC845929864BB4FA13CEDDF84D8905E48732E6C1038A7A6AE6E74258C3260D2" + }, + "fixedInfoPartyV": { + "partyId": "8FCFF3C68298448870C4E4EEF52B2400", + "ephemeralData": "3ACCB339759FD1E1230A18CB28FA96E365394747D080B84CDE601BD510693D9024E5B28C" + } + }, + { + "tcId": 1257, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B8591468B0FB3B0F78E453DF213636C", + "z": "EA27E3E85CAB563EAE8222D54C72D460B7246F351837A1B48F7D87A13C26B274108044E8", + "l": 1024, + "algorithmId": "E0E5DB2E0F2E6EEDF1E14D62321A6492" + }, + "fixedInfoPartyU": { + "partyId": "D755F67B0E42FFC8B650D73CBA6BD45B" + }, + "fixedInfoPartyV": { + "partyId": "7AD1A620DB4BFE7830523B33D114EACE", + "ephemeralData": "F4392E937158A7DA04D8C48A1999271813F81AEFD300473274DFD684BB83887A6A0361BC" + } + }, + { + "tcId": 1258, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44081E5FCC31A62BC07A786C474EDE2C", + "z": "0B285DC5EB0B0B893603866E8FB41B828B1A258ECDAACCFFAFD6F905D88D1AAD87FA2343", + "l": 1024, + "algorithmId": "2A17682E6CA1CE0A6BD8BBDC2F46E908" + }, + "fixedInfoPartyU": { + "partyId": "3A3E64FC5FC0CBA272417551127D8F6E" + }, + "fixedInfoPartyV": { + "partyId": "A3A2E9EBEDF94E571726186A6F27C17D" + } + }, + { + "tcId": 1259, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D5B572152431DA82CF3DFABCCE1F507", + "z": "582D60AA0E8ED110FB44126AB11AF5EED41FED60C31204502B2CA6A4A34E6905826F267C", + "l": 1024, + "algorithmId": "91CA1F7FA96D0566AF235318ED3F5E91" + }, + "fixedInfoPartyU": { + "partyId": "33F27F0AA4DCC8B304283EA69E8C48AF", + "ephemeralData": "4024D75ADE90F09F36A2FE16CDAF2E81611814BAD7EF801D18D3925224F217BE0C861F86" + }, + "fixedInfoPartyV": { + "partyId": "6B50CDEC4795EC55AB537A9930F04CA6", + "ephemeralData": "21880425A0D2495B69297704DA07C7E7236D30AF5C46BDF4016284BC75C0F5B96F58B6D2" + } + }, + { + "tcId": 1260, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A0F20C3231D2F6F12795C2ECE8118B64", + "z": "18A118AEC33B66152577CE829A66B658DBCE1D9F25580E43FE86E321FC3B4350AA027431", + "l": 1024, + "algorithmId": "B478238CD2B8A0CF6E97E81B68F6175D" + }, + "fixedInfoPartyU": { + "partyId": "1591AD9DE3E4973B08C7144F2163CE20" + }, + "fixedInfoPartyV": { + "partyId": "6D2A50C3A7BAE616CC8128680D7B4716" + } + }, + { + "tcId": 1261, + "kdfParameter": { + "kdfType": "oneStep", + "t": "393BCBBCC71D35A3EB5ED969E38AB22C", + "z": "94BA562DE2675EBBBF48DCF89AD2095E8D627F327B378139A29020A4F1009750991046E7", + "l": 1024, + "algorithmId": "62C9AFDAA18F69AE2425D8F5EBC75773" + }, + "fixedInfoPartyU": { + "partyId": "3D95A2FD21B1BC48493E98B294112F9F", + "ephemeralData": "7B7E7929C819C2262A3C5189CAC5DBCD6D02DBA3C7E275ADB94636404F74A07573DEDBAE" + }, + "fixedInfoPartyV": { + "partyId": "C65A5ACE479A90F86271459D8E2920DB" + } + }, + { + "tcId": 1262, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5C074B1206C72331D46B4C55ECE1569", + "z": "F725833E59BE384703FBB8A620599FE4131A5A8C23E6CD25A578934F2118BFBC39F5FF5B", + "l": 1024, + "algorithmId": "92C962F68059FECE7059B4752ED6ECD5" + }, + "fixedInfoPartyU": { + "partyId": "5794498B65F7A13B320FADFDAAD5906D", + "ephemeralData": "9290FF66A4FE7795C104E5279036167084FBB5EFA8A2671FD516D915C30393D4A5BBF1AD" + }, + "fixedInfoPartyV": { + "partyId": "939CBC553A1C5CF8D3E7E6D1FD985169" + } + }, + { + "tcId": 1263, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13956F893DFFA7CC3E82CC322AAD8A9A", + "z": "4EF30E4A0430AB9DDEF56BFCFE2FBC86CD29D60CB79E665DDCF5A34CBCB7C0878732D53A", + "l": 1024, + "algorithmId": "6EB96E242D22DF74B9E99C86C1A97FCA" + }, + "fixedInfoPartyU": { + "partyId": "B330470965E0A6D68EDDF0D3DAE7323C" + }, + "fixedInfoPartyV": { + "partyId": "734F92F173A01FD8CA1C8B34A57D8DC7", + "ephemeralData": "56CDBAF19113E41A3CD1FA10CBA708A9758082BE7D7B55D4908A5628A1DF95FA4EEFDA7A" + } + }, + { + "tcId": 1264, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4473C0D817928711C49D44C71274DFFF", + "z": "BF3660F0025D9E94AA9F7FCC06F69A2EA5E4612E9A6F609485788B6A610DB5A28092D22D", + "l": 1024, + "algorithmId": "3118A99264A564C235B52732B1436A4A" + }, + "fixedInfoPartyU": { + "partyId": "76E8F718B13018CB3CA712D24A8E9816", + "ephemeralData": "4A2226E6B69C91EE4EB43ABAF21CD29AD39683AF293395762ECCCC631523B48CDC9315CE" + }, + "fixedInfoPartyV": { + "partyId": "746887FD83550DDB456F356BE48AE3A2" + } + }, + { + "tcId": 1265, + "kdfParameter": { + "kdfType": "oneStep", + "t": "346FF025AB2181C70443C1CEE72EBBC8", + "z": "0CDBD0E17097460AB05C7F70B3F9E34FCD024B71864F8173D94FC81CF31FD61306DABCC5", + "l": 1024, + "algorithmId": "07BF7EC8A0055161BCF12B312483B475" + }, + "fixedInfoPartyU": { + "partyId": "D93A9A324690697206CB3A9BF2F4B9A3" + }, + "fixedInfoPartyV": { + "partyId": "A5A2F7DF30D5E96E79949527C2E1E4A1" + } + }, + { + "tcId": 1266, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB2FDEE3F74EDADC284C3B21E9332FF5", + "z": "3F5F602C231F886A4DEC0350B4A4CEA8C518E7C641E7C12CE1081DB2E544D58BDAAA1EC2", + "l": 1024, + "algorithmId": "3196035E213B5C010280B927C82B9CEF" + }, + "fixedInfoPartyU": { + "partyId": "FC310DF21AFB6A3204374EEA1FA6BC59", + "ephemeralData": "2DC15D22575D5AD107E5829F9759DAF9410AE8A762CCB4E5FE297AF7E9878AF57AF3326A" + }, + "fixedInfoPartyV": { + "partyId": "254BB72FB54C060DD3F3351E3163C56B", + "ephemeralData": "91672F380E1AD72F35998986E7C323D884E1F79EF388DBD21D9D1780A473DA5CD890CCBB" + } + }, + { + "tcId": 1267, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E3F17E73663B01289A9C8ECE8FDA1C7", + "z": "8E884154B4DCE385E2ECD219024E5742E94E95EE2CCFD6B39E76403FB3CB2A24BF8D866E", + "l": 1024, + "algorithmId": "0F178214F7B093CBC319E993FE5BC3CB" + }, + "fixedInfoPartyU": { + "partyId": "514737E03BD50B52ACA949D69DEA58F5" + }, + "fixedInfoPartyV": { + "partyId": "4E7149C1635C2EE83D51A58A37172B56", + "ephemeralData": "B1FF9FED63C191484D1BED5F98B36A567016FDEB8A9B4E01B0FC0EB0A2AEF812B0AB9637" + } + }, + { + "tcId": 1268, + "kdfParameter": { + "kdfType": "oneStep", + "t": "727471E17ECB29F9B93B080E74EEA4CC", + "z": "24F4FDA4D934A9F6DC762BD53E55D675265489FB2FD800125A6A3CC6FFAF30EC4377DF88", + "l": 1024, + "algorithmId": "E44E83037D6F184B1628C10670E51146" + }, + "fixedInfoPartyU": { + "partyId": "57829B51F9A7E19ED2ADEEF59BF80B0C" + }, + "fixedInfoPartyV": { + "partyId": "0B15B590071C09D2B9C16E3989B2FD4D" + } + }, + { + "tcId": 1269, + "kdfParameter": { + "kdfType": "oneStep", + "t": "817DFE340D4C1DFD9ADAFE928003E62F", + "z": "6E6FA7DF5D87499F74E1B205370C442FAEF6139D96D57A49467563EEDB4DB2998C023B13", + "l": 1024, + "algorithmId": "3282B8A982285C5BBB56EB92DF4DE035" + }, + "fixedInfoPartyU": { + "partyId": "206FB548835194882F9127997C98F5B6", + "ephemeralData": "550F5666DAE92B5E6071AEDDB308147A7AA8E0660BA16718DBA53CD8D1E787CA2ECF51CF" + }, + "fixedInfoPartyV": { + "partyId": "D5E177B02C7053EBEBC0ABB16DEB3F9F" + } + }, + { + "tcId": 1270, + "kdfParameter": { + "kdfType": "oneStep", + "t": "451A0D529D412386D10940381790955F", + "z": "EA5A6A4A3026CEC076E8C5EE197EE24824EF08F1C071AB15B14791232C94AFF080B650BE", + "l": 1024, + "algorithmId": "9C3D393A19B0653E796C01996F97F75A" + }, + "fixedInfoPartyU": { + "partyId": "4AAC80B1DABB58F9A7F36301B0ACBC83" + }, + "fixedInfoPartyV": { + "partyId": "51AB66166A546C1EC62A919CD1DBFDF6", + "ephemeralData": "78432A8910F1E23D9EF7E2E9812BE7187E6C5411DC223FC40E099620D6EFE4233E5B343C" + } + }, + { + "tcId": 1271, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB57AA83D58B79B93F7E669E75278E91", + "z": "9A5D492E03BE08F550B66D156358C5AFB50B6F9B7666F03565DBD80DB211DCB988366630", + "l": 1024, + "algorithmId": "07217C018D0586AE42DE81CA6FAD94C9" + }, + "fixedInfoPartyU": { + "partyId": "133A1513C90A198AC568747DB44D9845", + "ephemeralData": "3D8C64AACEDF3DEC62FBD9925D3A3856220330CB93EB36D81904BDC0264B73D30D6B0CA1" + }, + "fixedInfoPartyV": { + "partyId": "E448361FE3B1AB63B6BD8D0225728DF2", + "ephemeralData": "1BB997FAF4B6431827E6F9837BC91FDDBE3DA0ADAA746F35DE833AE877FA7A0DD16948F1" + } + }, + { + "tcId": 1272, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF410A440612F617DE7433E80C843C42", + "z": "01DB1926D5DA1D355E3A7346C1E9EC07D027A7930EF422E9EC95FC4AC1807FFC597979FC", + "l": 1024, + "algorithmId": "86175B7BD8E967E01F2448545252BBF4" + }, + "fixedInfoPartyU": { + "partyId": "9D730402F5F5889DECC1C3BBC38ABDE1", + "ephemeralData": "51B6F13DAA305C457EBE23FC2B4414641DD52CF347D0C5C0212D8B21448812B89010C870" + }, + "fixedInfoPartyV": { + "partyId": "D80EAD24C2DCCB9437997E01AA2970CB" + } + }, + { + "tcId": 1273, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4F91C0411AD45C42879561536585280", + "z": "59075F5D7A2DC314A8BC035B2FF38527DAECE213DE6B5AAD59E31B6BB60381654A3E10D4", + "l": 1024, + "algorithmId": "2BFC7C69DC33579731D4C2ED802CD486" + }, + "fixedInfoPartyU": { + "partyId": "21FDCED9697A1F73F9CBA24EFFC6B23D" + }, + "fixedInfoPartyV": { + "partyId": "534EFB68EDA8A15BC461EE0F1C4FAD1F" + } + }, + { + "tcId": 1274, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA67AAC861EFAC7770AF7587F7CD9D74", + "z": "C757F6182C56E05B609F3664694C1EA6ED06576F33D798CF5A7FFE7485A44CE2FF5A2404", + "l": 1024, + "algorithmId": "A54B5EEC5BA180D71E424A0C17A614DF" + }, + "fixedInfoPartyU": { + "partyId": "71F2BBD5DEA055F6888247F828C34C03", + "ephemeralData": "F29E88E4EE9F8BC0950F72C49B5EF4DD94222F0F41D84152A8932A44ACAC9AF1D7E6047A" + }, + "fixedInfoPartyV": { + "partyId": "8BC59DC813A4DFEE1CB47C17B112F071", + "ephemeralData": "C2071F14C523CDFBCEE5AD413F617C711D1FD0E6A3C9C3A58AB9EB168B7E134AA586C6DD" + } + }, + { + "tcId": 1275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB7595015F9A6C3E58A47A599B24158D", + "z": "9AA0FE8F0DC13B60D757B509BB7878BF3AFC93F0899AB0DEB6ADB9B094A234C6106A606A", + "l": 1024, + "algorithmId": "2F775DFA0AA905A3C39AFA44960DAD36" + }, + "fixedInfoPartyU": { + "partyId": "6D6E10D28E79EDCDA0EB9072596966F3" + }, + "fixedInfoPartyV": { + "partyId": "0FE0269FF77433CBDC1006AEE7F1EB3A" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 52, + "testType": "AFT", + "tests": [ + { + "tcId": 1276, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BF2EAA5725F7FFFA0F04988A57D0BCF", + "z": "311258C2B7DC5DE73DAA607A1482D8F96269A1963B46789241847A135414", + "l": 1024, + "algorithmId": "75E9911CF9547B2CAAA472D7C157CCA6" + }, + "fixedInfoPartyU": { + "partyId": "4EB34D5E05788EF16E7DC7E5F8894104" + }, + "fixedInfoPartyV": { + "partyId": "65397FCC9EB66DD6B1917091F087859D", + "ephemeralData": "24D0C7590E47F7D173408BD224808DAA99DEA5E7EC22135A327D70185436" + } + }, + { + "tcId": 1277, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BD50A335A7DE1F084DD52291E6D20D9", + "z": "7C9FAE947C6A6DFBB50037FA12C57B18B46B4BD6C05B3B266154B07AEE2C", + "l": 1024, + "algorithmId": "56134CB5D8552C7341D61C8F840047C0" + }, + "fixedInfoPartyU": { + "partyId": "927C68C331FA780163D2C6ABEA57680D", + "ephemeralData": "F2CF3D821062A9510881F46DB3DE9B77CCD8460DF3766B9D10219401C83B" + }, + "fixedInfoPartyV": { + "partyId": "1CC4D3347EB958EBE79EE55963D7F092", + "ephemeralData": "D3023A15C8F6FD9173746E1C61849C608E1132577632989D0EB4E49583AB" + } + }, + { + "tcId": 1278, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B845584D0028871641E91139A247090", + "z": "3C8C8DB7EE84CAC20280BB1F6DD715A747E712020D5B8DDE82D874480E9B", + "l": 1024, + "algorithmId": "C3D04DF4826D7660080C8E162853A35B" + }, + "fixedInfoPartyU": { + "partyId": "0C8F063E96920EEB5B05E6E741F20A84", + "ephemeralData": "C3E92810817B10C05FA520F7891F0151CAE9EF7E4B99AAC83617F8ECE12A" + }, + "fixedInfoPartyV": { + "partyId": "6C879A4E9729D46C439FAB8C71783ABB" + } + }, + { + "tcId": 1279, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BFD2A3C6299FFBBCDEFF269B75D8A15", + "z": "A4F545BE0A29C11B2E2B2829405B1D6C454643E24C5E6AFDEF429EDA21F8", + "l": 1024, + "algorithmId": "3020CF0A1F874B696E078F4479D819B4" + }, + "fixedInfoPartyU": { + "partyId": "AC0F1C59F38D25ED82F5E826EB4D3E32" + }, + "fixedInfoPartyV": { + "partyId": "75B83138741806C970D401FB077C9375", + "ephemeralData": "B50DDCE25D7B783D379D79B248847DB1FED5389B0353D928841E5BF5A31A" + } + }, + { + "tcId": 1280, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C6CF7109211EA0772657B558F267B13", + "z": "A723E4A67B51199217DC7FFF10DD509E8CD1651A5A45699436011F3BA471", + "l": 1024, + "algorithmId": "C3D3823452C2F8116F3935CFADEDB694" + }, + "fixedInfoPartyU": { + "partyId": "FF60FB49BCE7DCC2B44690E0358B195E", + "ephemeralData": "CD1F98224D29090EAB9BD900FC9E45B08F86CE221259AFECF800B4C14C7A" + }, + "fixedInfoPartyV": { + "partyId": "E6247E86859F215DF262982BD951B897", + "ephemeralData": "25153ADE9EABE21864AC7C697A8C8F53D5B28BB83DCE062560FFAB77374D" + } + }, + { + "tcId": 1281, + "kdfParameter": { + "kdfType": "oneStep", + "t": "742A97A7D323C8200A9CAAA6CA4DAD9D", + "z": "4DC6BA8300D08D62362065A1678B44E28A22A97B87EF093056AE35A8D828", + "l": 1024, + "algorithmId": "1872430473BD5951AC20E983A30A6C37" + }, + "fixedInfoPartyU": { + "partyId": "F32F1FDA437C46693C9A2C4B482FB904", + "ephemeralData": "5BDDE95AFE4FAAB63FD97AC182A24375D2AE651B76F253C4F63F47DEE695" + }, + "fixedInfoPartyV": { + "partyId": "D67EB558F46AC3C406E7D4ED18DC5E43" + } + }, + { + "tcId": 1282, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8A2C557256FA2DDDCC40779A823A9E3", + "z": "E65C3049227D2274C32F79480EF39CAD24C44238E0CFACFDDDA49AC42FB3", + "l": 1024, + "algorithmId": "C5F8AF8AD8588BD5F10BCCD227FF412A" + }, + "fixedInfoPartyU": { + "partyId": "82CE99D876AB06205EEB5A24B0E9109A" + }, + "fixedInfoPartyV": { + "partyId": "50CC93821DA1BAF078287C4831D2F4B9", + "ephemeralData": "9E404A9F3437C09352B4893C9009FA54DBEAB9CD42ED95B152FF14582846" + } + }, + { + "tcId": 1283, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6D3F70B31942A99FC01750121BE3465", + "z": "08E9A0E6604E79EE83908068DE953AA34183D781946B6E842709D4564161", + "l": 1024, + "algorithmId": "33B4A3980BCC65692B397ECA7F5C4FEF" + }, + "fixedInfoPartyU": { + "partyId": "2AF46DB64FB03E2ADF4C56A9D692711F" + }, + "fixedInfoPartyV": { + "partyId": "84E440A986DD52DE66528E2C9B5A8658", + "ephemeralData": "80596F04CB6F3FE3F36C8F198EE7248580CC40D02AB4B6ED4C97AD450F74" + } + }, + { + "tcId": 1284, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AE115AF80F3BAC3E7068C86372B9C73", + "z": "9AE85922C63A37FA514E5DC66911E2C6D7E40F00634DBCAF0EE8038D08C3", + "l": 1024, + "algorithmId": "F56AEC940C35404C6D1BDB14E5AE41C3" + }, + "fixedInfoPartyU": { + "partyId": "F78C22EA6FEC650C665E8C489B5F37BE", + "ephemeralData": "67DF70615CAB843A8E49B0C9A4B2D455EB22C8560E714B844F456E11F3EC" + }, + "fixedInfoPartyV": { + "partyId": "9D077DD64FDBE7782CD66636C343AAD7" + } + }, + { + "tcId": 1285, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85BAE9C7A87A6F5804C658D0088840CF", + "z": "94C0A490C01B5E57DEA79BFBDF5D7F4B52CFFA854CE2A1162794ACFFA06E", + "l": 1024, + "algorithmId": "6C2E8740DBD0EB22D23C3A14E8C5E2B6" + }, + "fixedInfoPartyU": { + "partyId": "CCD28325E729A8D882889F6D4A31380A" + }, + "fixedInfoPartyV": { + "partyId": "E17197D390A14890DE1EEEE84BFA2405", + "ephemeralData": "05F1E657DD6C124A2249C5808A8C4E8BD4B8BF725206DAF7ABE485C84C42" + } + }, + { + "tcId": 1286, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE0E45CCD8DB38F4EB0049BD269BF47E", + "z": "BF35E60A4E3099C1FB517B19977E20C303BC034142D128F8DBBB12966B1F", + "l": 1024, + "algorithmId": "9A494AF378CDEBFC4097111FFF3A30E3" + }, + "fixedInfoPartyU": { + "partyId": "FD087A5573FBA3DF37B48858EFDCB773", + "ephemeralData": "A6DD7F76B8476C3AABCC2689CE12F211D06CE2FCA9248D932B345ABB75F0" + }, + "fixedInfoPartyV": { + "partyId": "55B7DE3462498C3F647A71191E339047" + } + }, + { + "tcId": 1287, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADB0AC4A5126D8DCF4905C9330F48F4B", + "z": "2F5DA2983F93928BB29B92EA98A6F130A02556C303DA0FC3976975EEE96C", + "l": 1024, + "algorithmId": "CD3AD143155E6E1C7281837A753323EE" + }, + "fixedInfoPartyU": { + "partyId": "3A999055E4CBB363C4E359A8B0BE7028", + "ephemeralData": "5DB7C63634E10DD6F7749753DAAAB221FE2AE25B5DBA121EC2B1AB35A73C" + }, + "fixedInfoPartyV": { + "partyId": "E187FCEE9EA0AE778428FA5C7058F9FB", + "ephemeralData": "09D6F7A563268A26A2BA8962625D5B578B7CC927D0445BA245B5AA31A9B4" + } + }, + { + "tcId": 1288, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBAB881459506A050E46ACD21D556309", + "z": "F1B1081A2E48F5905DB7429F7D9B6561794933791E24D5BCDC0C337B4306", + "l": 1024, + "algorithmId": "11AC349EE0FDF148BB4A01721F3D8FA1" + }, + "fixedInfoPartyU": { + "partyId": "1233B4F97FA62C0578B85AD91146BFA7" + }, + "fixedInfoPartyV": { + "partyId": "24B3C2DDEB86B3A93469E997BDEA098C" + } + }, + { + "tcId": 1289, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E9CA56658B68E0B01B93DE978B7BECE", + "z": "64EE4AC170D35971DA407D3C8DD5FD65639A57C74B58F3F55146F5CB1A52", + "l": 1024, + "algorithmId": "47CE71FD9FD9AA0B6FBCA5D9CC718D96" + }, + "fixedInfoPartyU": { + "partyId": "62769D20C3C87C00D9A5E24C4B0E6608", + "ephemeralData": "B97CB5C08DFB5783164F496142F405AB90D62172A9784D1E68D883B929A8" + }, + "fixedInfoPartyV": { + "partyId": "B73338D4FDEFFE30E13521180871E2D4", + "ephemeralData": "415159621213CF8977CEB08FD5BED069A84B8761A5911719155A2BBE1DEC" + } + }, + { + "tcId": 1290, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF5D4A65B77AAB6BBFFCDAB92C9BB23D", + "z": "37595E071C45FA1C9C53220C94164C5E66BBD969D585E158E83821E51045", + "l": 1024, + "algorithmId": "470AEB8578DAE20BC7EFD40972DB42D5" + }, + "fixedInfoPartyU": { + "partyId": "2271E3A7BA5A550EE9057432EB85C162", + "ephemeralData": "F499C7B7852D46E933CF54A7734E87F9E01CDBEAF3A99B3A3DD0A12E4C04" + }, + "fixedInfoPartyV": { + "partyId": "0E1B8189504A8391962B120218238939" + } + }, + { + "tcId": 1291, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E727B342A946D75BA5012BD8780F6AEB", + "z": "9B9B8116E86F509E57555CBF54175742039C18BFBB0AB4016FD869D3F0BD", + "l": 1024, + "algorithmId": "30D3BF4C3D0398432D44E259728D717C" + }, + "fixedInfoPartyU": { + "partyId": "E86C1C6D5A697B586AEC5B801C708FEA", + "ephemeralData": "E9FBF344FBAD6AE6837FA72FD16F197F58EFF982526691CAF3EE91EF9557" + }, + "fixedInfoPartyV": { + "partyId": "706A09198AA59BFC09ACECBEDE87E381" + } + }, + { + "tcId": 1292, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D48B2D80D29E528A753E6EB870175A5F", + "z": "3D646CE84D8037ED7F47DCEF62785335EFF927CF8FE366C2C2A521FB4DE6", + "l": 1024, + "algorithmId": "7D4B3AA887C0B639FA0F03BE73C2BFA5" + }, + "fixedInfoPartyU": { + "partyId": "179E298CB0979DD82A3E5AA0EB2A0C79", + "ephemeralData": "F3974451894D14DB4E0DFCC215A60256D958A0C460668CAE3D1E594A1C9B" + }, + "fixedInfoPartyV": { + "partyId": "897AF9395E7BCE5BE31A504CD16898C3" + } + }, + { + "tcId": 1293, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0A777CAEE3B0533DB70E1357D22CB0F", + "z": "FB0EAFBA804A109FFE338C5102FBA98206E68F16A1936DA4DEE46114DA29", + "l": 1024, + "algorithmId": "4A6B02F90DB45CEAEAE94AB4EE5CBAF2" + }, + "fixedInfoPartyU": { + "partyId": "E0CB94E9B42730660AEE1EE3C4B47320" + }, + "fixedInfoPartyV": { + "partyId": "5EF5246317033B2BBC1A25C7F392822D" + } + }, + { + "tcId": 1294, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23BD596C78F34CBF666665B8EBEC6157", + "z": "336667B869DABDBC67304B9F2C7B24BA2EAF131CCABAB2984A9AF6FC7786", + "l": 1024, + "algorithmId": "AF9862409979189048AB5AB478D04022" + }, + "fixedInfoPartyU": { + "partyId": "5248EE303AC90D14A266C913565A36DC" + }, + "fixedInfoPartyV": { + "partyId": "4C3091311B3FBA1FF271BA3FFDCF9191", + "ephemeralData": "E386260EF463E97C9C3697D527B28874CE36F6829117D9BDF11A59B8E6EE" + } + }, + { + "tcId": 1295, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80F437F0E119AD47BEB9B597589A4F13", + "z": "DF26EAB27842D75933873E8DBEAAEE0FDCCE9284DE86DF5416FFDA400E3B", + "l": 1024, + "algorithmId": "7D6B1FAED2F2372805C04098F937FC8D" + }, + "fixedInfoPartyU": { + "partyId": "2731B8D1BBFAFC7E90DFA0977242F114" + }, + "fixedInfoPartyV": { + "partyId": "B86A64869868B407F8B6AA31362B9E6B", + "ephemeralData": "F7F876EB8F798B47E3A8FB4C46881BA6A062CC439040190E6F455C5092C9" + } + }, + { + "tcId": 1296, + "kdfParameter": { + "kdfType": "oneStep", + "t": "857918A0A48D7A77BEE12CFCC4FB8436", + "z": "15CE6839970AC6604EE16C68CD5AE43CAB71427629FE47D6616EE048069A", + "l": 1024, + "algorithmId": "73FCB45D9BC390B78EB95CE2B156EBF2" + }, + "fixedInfoPartyU": { + "partyId": "9EB5D3C5B4AED5051C6B56013E179FED", + "ephemeralData": "892DBE92C73E78E5A9332BD73BE9786D28D7D582A64BA30CB0D349A83DCC" + }, + "fixedInfoPartyV": { + "partyId": "46E8B0B59A0AEE1ACB252A6C4A6C108C", + "ephemeralData": "F49820E8201D5242BB8C697219C2764D1D0B0A3057221A72DE98DC3B40AC" + } + }, + { + "tcId": 1297, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17D53CFCF7ECC0260F46E73DDD718DDC", + "z": "19636812020CF7982399A2A35E51FCDC1DD58401C258DA2BBDF1A37E8A6F", + "l": 1024, + "algorithmId": "B04816840CD5E2BEEF104F29391152DF" + }, + "fixedInfoPartyU": { + "partyId": "C1E67A8496621FBFA597FA9CBE0C82F3" + }, + "fixedInfoPartyV": { + "partyId": "77C2AAEE9687F14B7D33989DA5F0E408", + "ephemeralData": "D00E10095040D9E95673728309C84A111E9E033F849FAC64E18016777FCE" + } + }, + { + "tcId": 1298, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2FFEB24DBE8B03FE967B15D5AC2F3DE2", + "z": "478389557E1D402707D48352DBBD1641AE570BA4D1BF9B39A1551045086E", + "l": 1024, + "algorithmId": "9F94B5A8D25C5DE052050F8C53159856" + }, + "fixedInfoPartyU": { + "partyId": "6F7104EC9303414A83709F642D5E2D05", + "ephemeralData": "1B4080119039A6A14A2AAD76CC7818B04CD6F305E1665B7B60720075C24F" + }, + "fixedInfoPartyV": { + "partyId": "906BBEFDD2E2CD93460DC6053FAECF22", + "ephemeralData": "4D58CAA839320AEA47974535BE4B1BFB4EE1C7CF210414C1FA38737B52F4" + } + }, + { + "tcId": 1299, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C5CE82006C043804C903C2AC518CC4A", + "z": "F77AB71AE29ABE5A3D6123BE7ABC5ADBA8545BB2219187819AFA2EC6FBBF", + "l": 1024, + "algorithmId": "DB10ED3C0991091326FD3AFA9A2F2AFB" + }, + "fixedInfoPartyU": { + "partyId": "358A0933914BB0E0E226414A65AD2A06", + "ephemeralData": "0AD0D70E99DA33995DEFAE871A9A0DC980179408A081CA3829A5496567D8" + }, + "fixedInfoPartyV": { + "partyId": "4D1EA0C99A740160AD144F41EB653451", + "ephemeralData": "93553986BAEDF8793E2C2FD34F76FA601A0C6E32CD7A088702EE9884822F" + } + }, + { + "tcId": 1300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B770DEDD7CED74FE08737D18A3EBFC46", + "z": "18FCF197E48C1C49B534BCA3F83FC7378EF8128A81B7B9AFC8354DD02727", + "l": 1024, + "algorithmId": "1DFAA548E366FD7DE695EA6595ECFF9A" + }, + "fixedInfoPartyU": { + "partyId": "60F296EB314C7DE8ACD420BBAF8D9E09", + "ephemeralData": "C90370260F93F217D24985EC779FBDBE3150C1B4DE7283B33BE53D263C70" + }, + "fixedInfoPartyV": { + "partyId": "EA2042492CD96223DAD6B526D42C2AB2", + "ephemeralData": "881DAC8954C4E6090A7C94892BA97F4315D5AA33249DC6DA061F4C748E4B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 53, + "testType": "AFT", + "tests": [ + { + "tcId": 1301, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E84FA120F5FE70433A9D1933F07DC27F", + "z": "77F92887728D4B79B9132A2F715439BA2298A3749A32E861000AC618A10F2A", + "l": 1024, + "algorithmId": "E8AFCC50C314972597EE27F8B5C7E992" + }, + "fixedInfoPartyU": { + "partyId": "97297E01081CC27521962B40992C4784" + }, + "fixedInfoPartyV": { + "partyId": "EE38789839CD275616BD202FCBBB444E" + } + }, + { + "tcId": 1302, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B68AA7F0923E1B85CE7DE03B860B9B4", + "z": "B4C5A58EA0D67996EF56BAC7D44ED8FD462243AF31E554C0C99B676742931E", + "l": 1024, + "algorithmId": "0172864A73E762D133CEC97059326074" + }, + "fixedInfoPartyU": { + "partyId": "1837AD1E63A0F0189A0B44B754BCF926" + }, + "fixedInfoPartyV": { + "partyId": "8F1B3AFA91EDACA3C870A0D53131269A" + } + }, + { + "tcId": 1303, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DE13041F03E2CEC90C73DA78A6B1C0E", + "z": "DBC5D25334BD0375FBB8F4C22C78D04C55235CC67C3137987538D7627F5638", + "l": 1024, + "algorithmId": "03D1BB49003796061DB5107F204DCBB3" + }, + "fixedInfoPartyU": { + "partyId": "3401C17653D3A6D62C6F3BF3C79AB4D6", + "ephemeralData": "B48565211B564B6011615BC211A65572C522031A5F0A5A80A81F03C920F1D7" + }, + "fixedInfoPartyV": { + "partyId": "D2120F319847F195D212A4E17C6B8901" + } + }, + { + "tcId": 1304, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3A76CFEE6C33FAF5821CD2FFA00ACB7", + "z": "B8057C9D4BA4F800A429198A8B077647E67E4595F1922C15F8F1A423780D75", + "l": 1024, + "algorithmId": "E9A2124B5A7B0EF4B6EC3FDCFBFC19CD" + }, + "fixedInfoPartyU": { + "partyId": "128BDB9CCDEAB3C6457E9A3EE5976688", + "ephemeralData": "25075B2ED6C5C1F7ADA799AD2F69DA27995BA5FF2B77684BC91DE0F7707C59" + }, + "fixedInfoPartyV": { + "partyId": "20455322D69ACD49A7C09500441A916C" + } + }, + { + "tcId": 1305, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15399356F5A3836DF42D7A8A69EB5936", + "z": "E8AE2B475B639ABB328DE909FDCFF3FA45AAF1F65C687771E0A3972D303FC2", + "l": 1024, + "algorithmId": "49CC0F4547A2F4613FA3CFCAC958C835" + }, + "fixedInfoPartyU": { + "partyId": "02361D22F2797992B29FDE06848DBBCD", + "ephemeralData": "9D0F9B6F906A1D541B3F25643B8F7FC94599473392750D342C30968601A93E" + }, + "fixedInfoPartyV": { + "partyId": "4B7E0D69F94F608A3661AC8208976064" + } + }, + { + "tcId": 1306, + "kdfParameter": { + "kdfType": "oneStep", + "t": "25D40ED6A372EB1221114AE660CE3B48", + "z": "50F26D29D3DD517857F470DB99A4F5B852ECC497883DB67679161479C02D75", + "l": 1024, + "algorithmId": "AE36E776DB7CF4EB2696DF15E6FF63C2" + }, + "fixedInfoPartyU": { + "partyId": "5C79C2A9A957C23199BC274966561FDC" + }, + "fixedInfoPartyV": { + "partyId": "C3095043372748D580B5F87431AEB999" + } + }, + { + "tcId": 1307, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C0B25B694C6B912EC45A3C4A224A36F", + "z": "455504791C1CBFAF196AB05C8D92DDA4D067EAB5957A66039BCFBDAEB09B79", + "l": 1024, + "algorithmId": "A5FE95227D98BB99FBE9CA322F090553" + }, + "fixedInfoPartyU": { + "partyId": "02900E493C2008A0E750E487032BB074", + "ephemeralData": "A0D02E9054EDAA8CC04963BE04213511FF22B2A0EF01810FBCAE9724B721E8" + }, + "fixedInfoPartyV": { + "partyId": "ED4661E305F46F02DC209DE291711A2E", + "ephemeralData": "2BDD436F4F024515731C914086C060B0E02C59AA792A619F47438CED132B21" + } + }, + { + "tcId": 1308, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDE761CB92F8EC8D405A44811E320E08", + "z": "7CAE864C8C4310548AD5E052E30029EC29CBF653988685A8B34801ADB623D3", + "l": 1024, + "algorithmId": "608C1E548CD65CDA48417E3819846A99" + }, + "fixedInfoPartyU": { + "partyId": "4A07ABFA98895BC05FDE6830B9087478" + }, + "fixedInfoPartyV": { + "partyId": "D62267BCBD9D6199FDED957ECB690CC3" + } + }, + { + "tcId": 1309, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F0478343EC56DF2313D402AD24720B2", + "z": "422C2FFF8AA0F22D869C869C90A4EC4A767536ACF2D22CFE4196BCE191F385", + "l": 1024, + "algorithmId": "CAC98C9FB9438FEF766AF56C7CD2306E" + }, + "fixedInfoPartyU": { + "partyId": "FA914E58A548DF1B0EE8FBAB34F48B76", + "ephemeralData": "DF2DF63EBD7496044FCB4142217B8FFFCF420B1BEF636DE8C867E78F517BF6" + }, + "fixedInfoPartyV": { + "partyId": "10F2F8973D4B2C238FB2DAB4080DA561", + "ephemeralData": "0BB78DF516FDECDD251A39FE758D843FF289AA72F94D2C2B3BB86FD3C8A679" + } + }, + { + "tcId": 1310, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E061233F0BE9BAA35B1FBEA815472653", + "z": "A38FCE62B71EB651196CAFFC65A9E7A3CD281B020CE9C346973D204B5FE33C", + "l": 1024, + "algorithmId": "7DAF0AD47A377664E29BB71C5A79D610" + }, + "fixedInfoPartyU": { + "partyId": "401DB2BF52008F165C63ABF13E561440" + }, + "fixedInfoPartyV": { + "partyId": "3378358602950DC9CF3064BE952345ED" + } + }, + { + "tcId": 1311, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C9A366454D643D8F3B09FC45DCC2FE2", + "z": "D51D578C00E253C249FFE09D780A78FBF12460754A388EE2B5FC259AB6A3D3", + "l": 1024, + "algorithmId": "A32DCE725380E57639712ECFD9D60462" + }, + "fixedInfoPartyU": { + "partyId": "933A558BCFE979E67D9318CE7F334B40", + "ephemeralData": "6DBD30F623918DE5E322A42C2A0A63718A29FB4346F45AD46BFCBD59DBDB52" + }, + "fixedInfoPartyV": { + "partyId": "EA3A4C2473AAC74E827B417C3A4C4F18" + } + }, + { + "tcId": 1312, + "kdfParameter": { + "kdfType": "oneStep", + "t": "402832041E6A4D8777814CB6355D8134", + "z": "8F30348A33B6535CBDE7651CBB34989B3A45240A4359248F1A4790DFEE1693", + "l": 1024, + "algorithmId": "DA7EF6C3F7E01AD3944F9FD7BB2ED5A8" + }, + "fixedInfoPartyU": { + "partyId": "5376085C10CD66EC4A9E08AD639FF2A0" + }, + "fixedInfoPartyV": { + "partyId": "F45A8F13DA8B9258ACDB0B76CF86CE12" + } + }, + { + "tcId": 1313, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3C872704C6AFA5FDF3B2C955710F2069", + "z": "1B4628BFF0440AA7B6B8BC5E29882FEFD02E2AFC7B2E9C7EADBDADC41E4299", + "l": 1024, + "algorithmId": "D0E9E02F2E39F0BA200CD765ED37BC71" + }, + "fixedInfoPartyU": { + "partyId": "C8B64E26D49073AB2225C2EC94FC6993", + "ephemeralData": "598FE32BEB7E650A2DE39A2D93E7125556EECD68BA768CE18028FD7B96BFD5" + }, + "fixedInfoPartyV": { + "partyId": "DEB96A4B60B37C4096A0B068EA207B53" + } + }, + { + "tcId": 1314, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6E6491570829ED7BF8FC861929CD02B", + "z": "5A25F422C2F68B67934EBE5E2E5281F613C3583D90C3A30756F7D8227A3130", + "l": 1024, + "algorithmId": "FD5E1EA7DC09C688709576C199B61A2F" + }, + "fixedInfoPartyU": { + "partyId": "6652379EEF957933243CA475AC33E03E" + }, + "fixedInfoPartyV": { + "partyId": "7D133335E196129DE117871BC2EE8B8B" + } + }, + { + "tcId": 1315, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE3464A79815C69AA9D39BB1F2A6473E", + "z": "764490E298F5E0DC02D915426585AE1D432DD8DCD02E91CECF3AE23C65AA63", + "l": 1024, + "algorithmId": "62B2BC862718C2351EDDA5A9339EB378" + }, + "fixedInfoPartyU": { + "partyId": "D0F7CA8361D877037F7556DBC4198DD1" + }, + "fixedInfoPartyV": { + "partyId": "4C3DECA1ED5B88A789E9F2FF21EAF783", + "ephemeralData": "8A619219CE343A309BD2545A985E2C24E9127F783DCA610538C66769BE4EFF" + } + }, + { + "tcId": 1316, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F36A288D32A630DDDCD60F34C6FF8D6A", + "z": "967B606F5B11E267FD5DB43472B5C4D745FCCE761F993D02EC8B25793DC65B", + "l": 1024, + "algorithmId": "35C2DB64379B727723AD069F38EDB977" + }, + "fixedInfoPartyU": { + "partyId": "0D60F09A89FDA1DE10489E9DDCA7084F" + }, + "fixedInfoPartyV": { + "partyId": "C2A27C301497D6C9FD3E35B5D86DCFEA", + "ephemeralData": "25AEFCB1C8D4DE68D39ABD0D90857B03827662D4B79394A47B39A820266DD0" + } + }, + { + "tcId": 1317, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1959151E7ED3B0BC2E856DF33E5F90D", + "z": "ADA9773AA5B7F1D77CA4E20F1A3B049E3D19D6CCF757D51766679EF151BB4F", + "l": 1024, + "algorithmId": "5A930914352D469EFE916476B07AD92D" + }, + "fixedInfoPartyU": { + "partyId": "EC1C5E875DCD92A6BBA1B758E56CB00C", + "ephemeralData": "78F447157D748062E7E5336A1BEBA92BA02CC1E7007A3FABDF857615E34EFE" + }, + "fixedInfoPartyV": { + "partyId": "E4D4A13C183A8C2B9598C6283BB3CBD4", + "ephemeralData": "C1ABCCF8DDF055116577F00E1B2B024A63CA070294806618BD810173DD312D" + } + }, + { + "tcId": 1318, + "kdfParameter": { + "kdfType": "oneStep", + "t": "377EA7F2CFB680AF26FCAF34A46D4E55", + "z": "FFD8B8DFDA42EABEF40D63CD2EE85EEADFBBB95383B6AD287B6DCB4F47ECF2", + "l": 1024, + "algorithmId": "C6BC47FDD7C59720F1A86E608A69E76D" + }, + "fixedInfoPartyU": { + "partyId": "6DA92B7DF744D2E7FB6DFF10E58D1878" + }, + "fixedInfoPartyV": { + "partyId": "D5709B93886489F8E4D4B1780971CCA1", + "ephemeralData": "37537308761801B967FFF567EC3DE6D5419276161EFA47ECF0EACED62B3A0A" + } + }, + { + "tcId": 1319, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F9118B2F7F3F8CDB553A7769944EE33", + "z": "1085F7401F0734A3A92AAD649E883CEE26EB6F8A693317EC694D29378709C0", + "l": 1024, + "algorithmId": "48C45D455931880BC37CEB39ECBC874A" + }, + "fixedInfoPartyU": { + "partyId": "45C83E42825785E51E8CD53C9901F7F3", + "ephemeralData": "6466A856DEB86AAF19E9526E93752291F5282E2103E45F95812C7929BA05D2" + }, + "fixedInfoPartyV": { + "partyId": "B7FC89F0DD037FCA79E7CAF26E3DC26B", + "ephemeralData": "26280C4EEEC8FC3BC603BAF05F9780F8ED2B4EC1BF0BEBE88FD735C820F162" + } + }, + { + "tcId": 1320, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DE38E84A55FD293144DEE7FD159260A", + "z": "CE744EA57FCF1E349BE73ED4EA20D1DFE9AACBAB41760630462BBC418759B6", + "l": 1024, + "algorithmId": "9571383D3C2ED8395219AD7812E46C22" + }, + "fixedInfoPartyU": { + "partyId": "49A2AD09CA28DFDFD830B1E48690F5AB", + "ephemeralData": "87911C15F50A47A02E04233AB595A792E1A1ABED2253BDCE5F0EA463D37FE9" + }, + "fixedInfoPartyV": { + "partyId": "33EB0E5E26B731E6076AA0CFBC95867C" + } + }, + { + "tcId": 1321, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32773B2A152FF6B787524365A610C011", + "z": "C568A4EF24AB692489BE1B23DBC3DEE67E53445555AFC58979C748E22173AC", + "l": 1024, + "algorithmId": "17296BB1762444A9F07ED3E6DB33BC68" + }, + "fixedInfoPartyU": { + "partyId": "42FCEDB6E187464ACF47493DC9F1CD6E" + }, + "fixedInfoPartyV": { + "partyId": "5CE589A39C78FDE9EE17546067374877", + "ephemeralData": "BDA632CE4C53DBDA790D5D315B78C0686C36D3DC94DC91F3969C41895388E7" + } + }, + { + "tcId": 1322, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCBA6AAD72E2564AA3CA622CC2BE8B2F", + "z": "CB0B551E3682AE8F2F26F3684FE429D8A25AA0AADB9F9543B0FFEB84F0188C", + "l": 1024, + "algorithmId": "5CFE22C56D452991797D3874802578F2" + }, + "fixedInfoPartyU": { + "partyId": "031F878D2D7ADB30717931ACE0686E26" + }, + "fixedInfoPartyV": { + "partyId": "8AEE91C968D560E966E9521BC84909B3", + "ephemeralData": "4A6608A3D1C37A7F1C0A02C14B6A457E8F08A2F9788C1F73AFA6F579373BB5" + } + }, + { + "tcId": 1323, + "kdfParameter": { + "kdfType": "oneStep", + "t": "086BBF7D978712E8F6C21C59FB302249", + "z": "F3523F35BDFAD3FCF9A334E5460E2D57F9715B552635A3635F339F591F4300", + "l": 1024, + "algorithmId": "05432862EA0EDA4470EAC648A5F09518" + }, + "fixedInfoPartyU": { + "partyId": "9A6CF62458CCC31665EA091FE9056E84" + }, + "fixedInfoPartyV": { + "partyId": "50232975A48623495CD486796F6A2F18", + "ephemeralData": "99A0C063E6D58D31E80A84E8101C46606605D54B67222FA8434EDA8755E7A1" + } + }, + { + "tcId": 1324, + "kdfParameter": { + "kdfType": "oneStep", + "t": "190DDAD9586E3628BD667DE89E832BA7", + "z": "8A055A1D4CAC5DFA1ADD2899B715C7E6179A8AA3C1F7FA6A1AFD147E34A70D", + "l": 1024, + "algorithmId": "0FAC5D6B7B95889C645EC9547469C478" + }, + "fixedInfoPartyU": { + "partyId": "33C3BCF1A31811AAFB2E28C46E7B7AC2", + "ephemeralData": "3E293A10870D1A99BD532B0E28FF6CF410FCB168203A8C2FF07422C490871E" + }, + "fixedInfoPartyV": { + "partyId": "F8920DEE373F8B069FC675D3FEBE7999" + } + }, + { + "tcId": 1325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BA5DF3F64078DF777A5E6794EB1A64E", + "z": "950E8A334E5E8E83B59D310E34BDFF3B96C4A24AF020B7254555B3944252B4", + "l": 1024, + "algorithmId": "E4F6843B0AB66BD1D57391C145D53369" + }, + "fixedInfoPartyU": { + "partyId": "D45AF559968B60F9316242E9557AC6F1" + }, + "fixedInfoPartyV": { + "partyId": "A89B11075405BE9C170A96AB8165CCF6" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 54, + "testType": "AFT", + "tests": [ + { + "tcId": 1326, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E7AE3A3A82A4DDC27805F7EB2838F67", + "z": "919A5B0892C736D65BB0C72414E2761FD6A54B497CF8C4D9B533BB6E389D", + "l": 1024, + "algorithmId": "5F7BA2CCEDBF24A67E3AC5A9E4BA4796" + }, + "fixedInfoPartyU": { + "partyId": "341501B9BEB5B22CC033934F90A9C3DA" + }, + "fixedInfoPartyV": { + "partyId": "2A7EADA0F43762417EB3BF8EC6B42E05" + } + }, + { + "tcId": 1327, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8A88D9592AB1B3997541305C0D1B446", + "z": "653E0B8061B49E8E7EDF33ECD34955252070E239E879F5640FB8C15F89E0", + "l": 1024, + "algorithmId": "45AC37EBE979A2F314F8EA26BAF809B1" + }, + "fixedInfoPartyU": { + "partyId": "72D91D47DC4F368CEAD76208C0FA657E" + }, + "fixedInfoPartyV": { + "partyId": "B6598E570CC1FB62D974A1C24955F518" + } + }, + { + "tcId": 1328, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E2F1D6A982E28D6C160C54F8FC9DAA5C", + "z": "C913AFBD67A4E57F0A24014BFA2040A4242BD1C199562CED69CEB01959CC", + "l": 1024, + "algorithmId": "B80E663BEB8D08B0E24BF63C2A7DB13A" + }, + "fixedInfoPartyU": { + "partyId": "3B935FA671BCF2EA5E4DE11FAA17D938" + }, + "fixedInfoPartyV": { + "partyId": "183DAC670B33D9C1BEEF8AAF61A1E848", + "ephemeralData": "835319075EEC274E896772C6757C68522064B3445910C2F3C30480B9E860" + } + }, + { + "tcId": 1329, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3AFFA66E6B7D5E990AC9986122B59F42", + "z": "94FCA2639E9EF812927D3BD309557614BCCD629950CBD38E87C5137DBBD1", + "l": 1024, + "algorithmId": "B506344C421E495752007901FCA86791" + }, + "fixedInfoPartyU": { + "partyId": "67FF1056E211BBEFF3B69171E349B0E4", + "ephemeralData": "3C9A2A181962BF834BE918E86C37D6EB23277585A83FBDC3D26516064ADC" + }, + "fixedInfoPartyV": { + "partyId": "7E31E8322686DD7F7EF558866037F901" + } + }, + { + "tcId": 1330, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73C48E3B54AD998606C82130EA318A53", + "z": "EF419AFFF08E99DCD5A65F5DF95055FC28DD499ED62A82DB8906349E8BB9", + "l": 1024, + "algorithmId": "33C0DA9F4E53B2694644EF3485F657BA" + }, + "fixedInfoPartyU": { + "partyId": "7F8259C0AFAFC92D8C3B1395DFEDDB0B" + }, + "fixedInfoPartyV": { + "partyId": "40408A16A505AFE4CD64314203589C5E" + } + }, + { + "tcId": 1331, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4579C4166FFC36ACACD622A273D8C5EE", + "z": "FB59A8C9BE6BE0FCFEA5AEDCF4EB83E9A4606B532C4A2EB42AF5C9BDB1B6", + "l": 1024, + "algorithmId": "38844733C992EA779C6A56DE766B4203" + }, + "fixedInfoPartyU": { + "partyId": "6BCF7628AA10C343BA8A82134D71B285" + }, + "fixedInfoPartyV": { + "partyId": "D40C61365DDDB5B89FCBE82283794C07", + "ephemeralData": "0D5DACCC5BAEA5CA6377E05BC172FF1085D5FB9E19B030F9679112FAA1A6" + } + }, + { + "tcId": 1332, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6FFC552A6CC0C78961B43B38D2FD01E", + "z": "D47AD7337B01869353002E770E07ADEC9A0BCA221D036E24EFE590A19507", + "l": 1024, + "algorithmId": "AD3903DFE8F5F6082D7A46E3AC111DCA" + }, + "fixedInfoPartyU": { + "partyId": "50219589C0AB2EC7A86149E14EF743DA", + "ephemeralData": "CA3F8348475E4BA2B9BCD3DF432FF44DBB6A8F1B02B3A6D04D449E1E1FDD" + }, + "fixedInfoPartyV": { + "partyId": "1846472EA827F596355BB755F0B064FE" + } + }, + { + "tcId": 1333, + "kdfParameter": { + "kdfType": "oneStep", + "t": "949FC8FFE8BBCB4FF077031A8AFDC4C9", + "z": "11802651C3CC86DAE99177206CC221264E2C98E9EB947B5FD83974AF3FAE", + "l": 1024, + "algorithmId": "DEC702D65B4FD79B43F93CF1A0B3448A" + }, + "fixedInfoPartyU": { + "partyId": "DE192EF58265F1A4535397ADBA37D343", + "ephemeralData": "F40F122EC76ECE8EA0716116A883FA398776A72865C40328A793259AA501" + }, + "fixedInfoPartyV": { + "partyId": "AC2B31E9B70F2BAFEBE6814F00ED6DAB", + "ephemeralData": "B7BA52EBF89813B83776B9BAB9D0F41679CBB7CB1660517D038671872C6A" + } + }, + { + "tcId": 1334, + "kdfParameter": { + "kdfType": "oneStep", + "t": "461DCEA1E4B3D6E6EBDFE94C2E78A9FE", + "z": "60DAE2E720CCF39EDED84F0B2668972768AA5CA13F6AE7234DF90B632E1D", + "l": 1024, + "algorithmId": "1D4AD446A045CD41BD448DB9CD0BACDC" + }, + "fixedInfoPartyU": { + "partyId": "82480DC39086B1243F711882FFAF721B", + "ephemeralData": "1A48C85A0229250FE5ABAD2E230A0D4066D93E6F903F6DCEC27B7C1CAE7D" + }, + "fixedInfoPartyV": { + "partyId": "0102884391E1B09FE3BD346ADF4AAA90" + } + }, + { + "tcId": 1335, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD11C33DA82EAD9165781E895F675119", + "z": "40147C5652ED3E74D797759657977AC91F884A53116C2FA6FFBB1C8CC7DA", + "l": 1024, + "algorithmId": "902D66E581714A3FFCE8422AE7B7665C" + }, + "fixedInfoPartyU": { + "partyId": "2ECA78F238AA19D410DA1EA7C4397BBE", + "ephemeralData": "E45FCB7C8287A0AA78C311D8532C1B29A9692F4E5202169B2DE610B4E471" + }, + "fixedInfoPartyV": { + "partyId": "E08BCBA4AE9D4DD82F6098E575BE73FC", + "ephemeralData": "D415738A7BFDBB91C3F470DB561DB7D0B063891439F8191DF225C61C8070" + } + }, + { + "tcId": 1336, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8DD3C3065AFC472D9C62FB6EF82C971", + "z": "FA60B85890AECB5F2403DE1842DE80A56F108F76B16296317781D5E06E4D", + "l": 1024, + "algorithmId": "9221403B0F7DC819A060107CCB6975FB" + }, + "fixedInfoPartyU": { + "partyId": "37B9058CEB97F9114C60CCC294EADC6F", + "ephemeralData": "9718461E309220D8AC7BA499416735781EF026140F28E4FF23EE862E1E03" + }, + "fixedInfoPartyV": { + "partyId": "264BBD99AFEBB88174329955C677115A" + } + }, + { + "tcId": 1337, + "kdfParameter": { + "kdfType": "oneStep", + "t": "84BA90B438C5321372220A60825B8F3B", + "z": "5C866606927392651F363BEA5B9FA33CFDDBE1027EFD1357550B589F7821", + "l": 1024, + "algorithmId": "D94CE1E2AE479650F9944C991A04959C" + }, + "fixedInfoPartyU": { + "partyId": "4008E2854738E5CDF3416A8DC3DCBF44", + "ephemeralData": "9AEE03048DAB62D26F18054239A08CF04F79E50D12014E7EA6599821F616" + }, + "fixedInfoPartyV": { + "partyId": "0D33578C745D18EBC36570F0FB338A83" + } + }, + { + "tcId": 1338, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67B3EEA74AE2BC79DFDEF205C7855EA9", + "z": "13FEAD3EDD469986531D6338F0DEA14E1F8790C65503BEFBC7614D2048C9", + "l": 1024, + "algorithmId": "2490680D063C5ACE015EE169B8BD258B" + }, + "fixedInfoPartyU": { + "partyId": "4E2BAFC4C763E1C34347C43DD4A6DF5A" + }, + "fixedInfoPartyV": { + "partyId": "BF4D88830687C175494FB5B66B416D5A", + "ephemeralData": "3F3DBF03C88B5629A3A7BD3FE485F76DD78F5600572D9A5A89E2B2EAE7FB" + } + }, + { + "tcId": 1339, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C14B8FF67299775EB2B4F9283C7DB50A", + "z": "4CD5B2BF1CDD687E1BB8F5424708FA8503EC34237DA05894FC4F150557A8", + "l": 1024, + "algorithmId": "C064B99F33340DF7C4BF6E291DCE9162" + }, + "fixedInfoPartyU": { + "partyId": "7FD6AA9B24200E704EB3488A72C168CD", + "ephemeralData": "7F94D434D6BA463C797973BAAF5383E23C33389DD88D08564CAE699FF25B" + }, + "fixedInfoPartyV": { + "partyId": "16166FFC6A6B1C1FE336C064565D92D3", + "ephemeralData": "7C0E079E90704D21D8DCDB0B050E738117D7AF58B5E14C0C1BFB47A13ED1" + } + }, + { + "tcId": 1340, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67CB5BF5B7F9D2636988D073B183EB67", + "z": "6CF041B26913FF1F14D76F675066007A45F31C532A0536C765ABDE5A3552", + "l": 1024, + "algorithmId": "F6348F7D1D7E284A6423EA1315D29BCF" + }, + "fixedInfoPartyU": { + "partyId": "6B7C49AC4C23024A553547CA165DEE6E" + }, + "fixedInfoPartyV": { + "partyId": "4586B242CB5A163D905CF4A450F8571D", + "ephemeralData": "078ADA318C8501FAC91BF7E994F2A883D6688A4B640610CB327ADCBF64BC" + } + }, + { + "tcId": 1341, + "kdfParameter": { + "kdfType": "oneStep", + "t": "396DA2790ED025F1769954AC43475B79", + "z": "FEC03DA90F47B896BEB26477BCF80B69E2931B3DE302AB3BBD07F5CD9097", + "l": 1024, + "algorithmId": "B857D1D0231294E1AE0C90629A86E10D" + }, + "fixedInfoPartyU": { + "partyId": "7E17C8409B1FBCB162033F8CD9273F34", + "ephemeralData": "7D1644BB0A95072955B9F3FEAE04EAFE14F8AD14FAD886092ABD16C4BC0F" + }, + "fixedInfoPartyV": { + "partyId": "B4EF45B3521D1477E7FB81992BC9A1CD", + "ephemeralData": "A167D6E9371DEE7D7ACCE4732D5A6FC46FB280BD92B9298A181A3BB121A7" + } + }, + { + "tcId": 1342, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89FB0F7A4D7A6FF2C188AFB9C580E316", + "z": "73FEAC96C963374369893E47A9330874CDF4EDD32429F9B4679C6173D90E", + "l": 1024, + "algorithmId": "6C0085E1B7FA988742C1791C888AEBE7" + }, + "fixedInfoPartyU": { + "partyId": "9ADC949B862EAFD09F1207A9709D77C7", + "ephemeralData": "CD020F98D893F66C24834F5C5DB5FA07D0D3FE3B96A400BCC8D11A72FB24" + }, + "fixedInfoPartyV": { + "partyId": "A1D6710570E1AEF5588CB171FCC85BAE", + "ephemeralData": "1E136EAD685C6E565ED635E0E7D6FDAD2FF8877C8F00494A7F36E68B27DE" + } + }, + { + "tcId": 1343, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA7D886F17F88ACF20EC8ADBE7607519", + "z": "F691464386E154D0FA123349E90263D593A6E7DD08E559ED0CA2B55F8246", + "l": 1024, + "algorithmId": "07A4A00BE90DDCB6710D89D012A6CDDF" + }, + "fixedInfoPartyU": { + "partyId": "05ACD30206870D65EE4088A3135F2D02", + "ephemeralData": "F80BAC3C8313224CEF9287B005EEC8A7C91BD30AB24BE7493E861595B53B" + }, + "fixedInfoPartyV": { + "partyId": "1B36D6582B15EE7BE0FC91070CDCA8FD", + "ephemeralData": "976671C18A0DCC16C20FF761B553DC9C02020172684CE77DFCCD133EDF44" + } + }, + { + "tcId": 1344, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24AC1991B12AB363EE7D545AF9F6903E", + "z": "306B7B958F9B67C16B8FCBBD994AE2BDC2A50F73107970AF8D69D70CCF65", + "l": 1024, + "algorithmId": "84A559BB59EC3768D0E1952EF87E18BB" + }, + "fixedInfoPartyU": { + "partyId": "6EE04A7F86E1B11BCD4DEBF3C78A4E3E" + }, + "fixedInfoPartyV": { + "partyId": "0434F7D93CA50DFA94E15CF86647F5A0", + "ephemeralData": "4291A8DEF832A8F146C92485F4472D8777EC09E90C7E7C95D1CFDE8425D1" + } + }, + { + "tcId": 1345, + "kdfParameter": { + "kdfType": "oneStep", + "t": "84122EF722597CF9B7107068CDA770FB", + "z": "F1F517EAB8024A0C9A1345062A56241F1A95843591380D164D52B033E718", + "l": 1024, + "algorithmId": "73E86BAB34504A20BC134F94E37013BA" + }, + "fixedInfoPartyU": { + "partyId": "8B3AD6949A59AD213738C31CCC38F2C5" + }, + "fixedInfoPartyV": { + "partyId": "17FE6399AEE8DB7E70CC27CDCC355DDE", + "ephemeralData": "88894FE79E5C6BCBF825C0BA0B967610350579EC59081EEC5BFEC94C43CC" + } + }, + { + "tcId": 1346, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D72EE6295DF73E6A126681F43B390AD", + "z": "A2B2959FCD5143CD7F56BF96B64E9227359CDF0C26762890A0EE0116BCE6", + "l": 1024, + "algorithmId": "80D8B5AE4A1919670B389109856E78AB" + }, + "fixedInfoPartyU": { + "partyId": "475BF8CD8A000C92D79FF264CBA679A8" + }, + "fixedInfoPartyV": { + "partyId": "76FA0020AFD2EE66F7B258AB464C4CB1", + "ephemeralData": "7127CC03FED4F421FD5B6548EEC80AE8D4B2CBBF892477F234D0D038937D" + } + }, + { + "tcId": 1347, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89ECEEF65554F02FA3047ECB76A08D67", + "z": "E4C2FEDFD32F1AD3E7D1845AB858B8B3CF1A8435183A75E862BDE0BE5011", + "l": 1024, + "algorithmId": "4B8BDA87CD8DB688583A17EE0F773498" + }, + "fixedInfoPartyU": { + "partyId": "8048B33B2BA5058DAB1B37BB03C99A62", + "ephemeralData": "ABA5DF552BAC9C7C1317BA9BB555B2E982EAB0A47C2AB867933DFD9C3C60" + }, + "fixedInfoPartyV": { + "partyId": "FA77BA914B610625E726C17F4AAED11F", + "ephemeralData": "81CB5994906E8C2803A001D25C7E13883E1250FFC04D72C5ADFDE678BB82" + } + }, + { + "tcId": 1348, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85B1EBEC90FAEA75FEB7111D6224608D", + "z": "402CDB11500B8814F809891ED5FD5E9F075A220169B70F432D98BD0B6AEE", + "l": 1024, + "algorithmId": "C7FF14793D3337F9BCD127C5874EC39A" + }, + "fixedInfoPartyU": { + "partyId": "940FB4AA141C5F2F41090F4FAE860ECF" + }, + "fixedInfoPartyV": { + "partyId": "E2681C48B18255F57C28CC17939B4A6D" + } + }, + { + "tcId": 1349, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CDA10821B8DC887E99A97315081B9D0", + "z": "8EE36F7B577BC1F819F8122BACD11353F76BA20E5F77D64B9E1330D175C8", + "l": 1024, + "algorithmId": "CD814282D8CBD9DCB0AA713702411659" + }, + "fixedInfoPartyU": { + "partyId": "F888D2D8AB6E31BA51710D0F8EFECC2D" + }, + "fixedInfoPartyV": { + "partyId": "F2DC23BBB40F7DAE44C7E4D54A79748F", + "ephemeralData": "FF9C618F604A37E7574469FAEBD9833925414CA3FAF17FA246E8DCA34231" + } + }, + { + "tcId": 1350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73B511DCC8FF9758CCFCB48EE965719D", + "z": "F473ECC707AA0BB27CF3E88A8A7A7CC6E078C37A53ECA12EC04041C69C59", + "l": 1024, + "algorithmId": "ED7C9820DC07665472BC728420D4A6C0" + }, + "fixedInfoPartyU": { + "partyId": "38393AFDC343DCAC3BD1838394B14396" + }, + "fixedInfoPartyV": { + "partyId": "2D41F93996BBE9DD80CC86514D82D178" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 55, + "testType": "AFT", + "tests": [ + { + "tcId": 1351, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A84F9A53D9850ED4155D908556ED23E", + "z": "28553E629C2B918A146FEEBCB7D1DFDDB06CCA883160306B1D92548132EEA9FB", + "l": 1024, + "algorithmId": "12058D322D59B821FA7BFBEC18D2DFEE" + }, + "fixedInfoPartyU": { + "partyId": "23B82478D8EA5040EA90D29E8831BF33" + }, + "fixedInfoPartyV": { + "partyId": "DA2DBBF528F0A7D9390CDDCD27C560E8" + } + }, + { + "tcId": 1352, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B8231A8E08B32DABA2F0F50F856332B", + "z": "9CAEBDD0BD44305E521B5CC464E626C064CD8F544B46BAD98624F290BD4FE15B", + "l": 1024, + "algorithmId": "6ECAD0F90DC3B3CE579D5BF01EEB8E62" + }, + "fixedInfoPartyU": { + "partyId": "4A66E3C8961FCF0F39DE0C8118B16831" + }, + "fixedInfoPartyV": { + "partyId": "0B1CB667AD5F5EFCC5FF961E4A822027" + } + }, + { + "tcId": 1353, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13DA391FED57279B683557826D706EEB", + "z": "7D892899CCE80D20B677C1EF6708031CAFC4358F7C12C027C75E0F1064F7DB73", + "l": 1024, + "algorithmId": "174792D2E30225B7A916F0F48475550D" + }, + "fixedInfoPartyU": { + "partyId": "66D9B844C146A80FDB06E29BF66FEE4A", + "ephemeralData": "346871B57B46572DFD3A13CDC5A0319437FE2E912703444064B12472311CD1A8" + }, + "fixedInfoPartyV": { + "partyId": "7A7EB3039E5A92BDCAD84C6D57F16982" + } + }, + { + "tcId": 1354, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79E874B5D572D30AC16D845DADB323F7", + "z": "6C1E48CF9A1504B450DAA6BFE57E973303B0CED9E60A6AC893D271B0F449C3F3", + "l": 1024, + "algorithmId": "81CDB6B6311C80E1D31D416E20C622D4" + }, + "fixedInfoPartyU": { + "partyId": "3CE88779F3E41F5085D0D96CF33DA398", + "ephemeralData": "1C2CD7E7C2A094F9C75997BD90354E9E4B7FC3385BAC3FF9E84CB903F51DA16E" + }, + "fixedInfoPartyV": { + "partyId": "5B182A2399720AF0E9947600A66077D9", + "ephemeralData": "7BCEA3C024B29F4CB9274AD862C082901322018A196EFC5647D765ABB239DAA7" + } + }, + { + "tcId": 1355, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91B1259BD296FB33721D0BD3AB29B4D8", + "z": "BDA7F00970196EA309D91E7636E9088E8D1429F404539286493C36CA34625B25", + "l": 1024, + "algorithmId": "43AD56F1C6D5DEE342C29F6C4CE1C115" + }, + "fixedInfoPartyU": { + "partyId": "097E18B74025DF77A27979F395A1442C", + "ephemeralData": "EF8A5199F997BE478F159A7E88B0D796EB9540CB1D5C905981061A7B3C924308" + }, + "fixedInfoPartyV": { + "partyId": "9FAC851CE89A149A29B18014AC00890F", + "ephemeralData": "12C1722CFF6AEE862515D6E83F420D6D0507E70D83BCF5032E6E6980CE412155" + } + }, + { + "tcId": 1356, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABF5AACD474770004BA9E68BEE227916", + "z": "72952F7A7861E92F005B54EEB0E857AADC333EBA07BC0A6DCDFC5BBA762E06F7", + "l": 1024, + "algorithmId": "7E32AD8ED66EE01D6376C2E96234D9E7" + }, + "fixedInfoPartyU": { + "partyId": "C291A22A8180557DBAC3BB7E87DEC3EA" + }, + "fixedInfoPartyV": { + "partyId": "743E5383FAD1462EABA3BD45C2769D6B", + "ephemeralData": "4202F9C0F1754FDC3A05A5AF1F910F3B9E578DD6DAD399332D94EE5EAC5FF71C" + } + }, + { + "tcId": 1357, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8D9B4143E5DA6F3DD18531969C57E5C", + "z": "44067023812B22463CE1D7BFA7FBF60156A4DB6693A2871EDAFCCA655C25779F", + "l": 1024, + "algorithmId": "E5234E0484856DF91BAF81271EFF5F8F" + }, + "fixedInfoPartyU": { + "partyId": "177685B1914BEA819180C7298DE4DC94", + "ephemeralData": "ABC08B4F8BD4266976392C17F78AFF5D80ADB77B9F4216E896C8E932B91D3D07" + }, + "fixedInfoPartyV": { + "partyId": "3305F23DB140F61BF2618BE9321B7F13", + "ephemeralData": "20773888EC20DC979DD2977A9BFB8B97555D463D150B50A703DBE920EC865411" + } + }, + { + "tcId": 1358, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B21D9D7A200A127E28060C286F29D0EB", + "z": "06200156B6E6E69C7F8AF8E90CE1D113A449480AD7EE1260335E2422320A766B", + "l": 1024, + "algorithmId": "C45AE7952A645FA49A2161C8640FA28B" + }, + "fixedInfoPartyU": { + "partyId": "351E2E1E160EF572C6A227DC1EBFB241" + }, + "fixedInfoPartyV": { + "partyId": "F15FDDA83E3C968BEC72C910BBA80C65", + "ephemeralData": "AE18C988659151324CE9304A77F4F1EDB0C76D6073EAF49A1A2FEBC72A895895" + } + }, + { + "tcId": 1359, + "kdfParameter": { + "kdfType": "oneStep", + "t": "730618F825F19A61F0D0A156A8B074F6", + "z": "7E0E87F4D56FA879DB9D34E73170D4876C3B2EEF9171C0EBF948010796F198EA", + "l": 1024, + "algorithmId": "52090CFBCD24559607ACE570D198497C" + }, + "fixedInfoPartyU": { + "partyId": "33003F2F95BDB72CF44B721B63E3B04E", + "ephemeralData": "A73AAB07772F047B891451D74B3E42F3B2640472915F1D15FAB58BD5A7249D84" + }, + "fixedInfoPartyV": { + "partyId": "B2BA62EB5505682D2579D6EAE96F763C", + "ephemeralData": "49199EBE4C6F1D19C91CC77A95FB55B8E26AF33D5CD12B9A883387E7C2FC3CE3" + } + }, + { + "tcId": 1360, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8576F3C7498FB02D9D634664605E6DA6", + "z": "07C9B696E3AF89E8D25DA7C1A61F56EB8BF3C963AF44D07C4A8A42A9998A06BB", + "l": 1024, + "algorithmId": "CCE170DB1B4991FB91002693DD264C18" + }, + "fixedInfoPartyU": { + "partyId": "6439B40194E313E3642347E5D45FC31B", + "ephemeralData": "4F34D0C9C4AEC2BA33A3A51E699F943C06C5B4A69220B1B8A814C4D0D4715E04" + }, + "fixedInfoPartyV": { + "partyId": "5E3CD102962C2B4BFF4A33585892264A", + "ephemeralData": "86E9310D79F21DA04909AE6D228048D17CE8DF4F160D193DBA5E9EFB991FC58D" + } + }, + { + "tcId": 1361, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A711264682D367B6739B225AA90DCBB2", + "z": "45311425E3999EC36F523574F91D07B5EE9E48D44B4D19CC576F0811136C096A", + "l": 1024, + "algorithmId": "24BEE5696B14466C7896F84A4F115F92" + }, + "fixedInfoPartyU": { + "partyId": "6D9E4FD540DCB55BAA12AA7860016D34" + }, + "fixedInfoPartyV": { + "partyId": "E7B8328C6E7350FDB6343218093ECCE4", + "ephemeralData": "2383CE3B9F5A7AA9CC3A1C3BF247401A2CFF739A1259BE9E73F50A763D466717" + } + }, + { + "tcId": 1362, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E86F0D13552F1CA751B5A0257FADDF15", + "z": "538F9B95B752E2F34C39E0D055B51A3FF70900923B176002E59D25C2F58CE694", + "l": 1024, + "algorithmId": "BD5FCE7F1391E761A2F0C4D3F934A9EC" + }, + "fixedInfoPartyU": { + "partyId": "A7BF7A89C47DC741F0FB6A41997FA977" + }, + "fixedInfoPartyV": { + "partyId": "D16750E6D2DF0140ADB3171958F81537", + "ephemeralData": "15775B1D1B6901EBCB915DFB97855DA4AA2379C374620914C51FD5B67081E9C3" + } + }, + { + "tcId": 1363, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B17979D9E19A105EF6A6B242C8A184A", + "z": "3334009AEC2E4BA5D3F5B676AB0A1F1A4DCC5E4BB50B16A590F659066159F9E0", + "l": 1024, + "algorithmId": "80E5B48F1209C4CAD29FB38D333A0F3F" + }, + "fixedInfoPartyU": { + "partyId": "A6A3B5600E86F922F17A845A9631BEAD" + }, + "fixedInfoPartyV": { + "partyId": "E1A4F50A2BBABC85032AD56B8C7D83CB", + "ephemeralData": "E20318C6BFC7D49207E941A6B77DCF1787A7EF73E72F7C8819A496F3362D8D08" + } + }, + { + "tcId": 1364, + "kdfParameter": { + "kdfType": "oneStep", + "t": "899CBA60E50629DB7E398CF1C076A48E", + "z": "32B676EEC6463BE3212FD795EA76726A692777768563D1BE191E0B2851E3083C", + "l": 1024, + "algorithmId": "E47D1E40F2F250ED175BF5F022BA1CAD" + }, + "fixedInfoPartyU": { + "partyId": "6408B32820015D8682BB2C3B38B668B3" + }, + "fixedInfoPartyV": { + "partyId": "1A482A57C5EC6EC1D964F3B243ED7B9C" + } + }, + { + "tcId": 1365, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A81927501C31D53B303363D692564B91", + "z": "74704185D8CD7F78AC4325B66ED614E04FC4C0BAE66DB1CCFF3120399831B14C", + "l": 1024, + "algorithmId": "7616F9B791344D9BC15EB7AD09AFAB0F" + }, + "fixedInfoPartyU": { + "partyId": "7A764DF525C55619713D7EC806448B34" + }, + "fixedInfoPartyV": { + "partyId": "408A795952BA20846D27F1AA503B3CE2", + "ephemeralData": "3ADDC01E825E43981D9989233405A3C753082AB61E5F605465D76286BD7B2EB2" + } + }, + { + "tcId": 1366, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F7250E44A5FDD562D9CE9C3422B6175", + "z": "EAE0E3500F37BDF848CA3E75EBEF2B4CA5B42582143D4C8BC69FB1119EE7CCF3", + "l": 1024, + "algorithmId": "DA21E656D137813BC42EAFEC8EEA9431" + }, + "fixedInfoPartyU": { + "partyId": "30AA87AB77B764C2C3C882FE89DE970F" + }, + "fixedInfoPartyV": { + "partyId": "6CA876907954A69F02B52A8760B9FDB9" + } + }, + { + "tcId": 1367, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA8D6187227B8F787103B46899004DCF", + "z": "2FA2D4BF1EB2FAC4EDFF1C192D17FCBFB824D4D16E80CC4248B415ED62D25DFA", + "l": 1024, + "algorithmId": "A17C235C64E9E09129F73BAE2A6BC8A2" + }, + "fixedInfoPartyU": { + "partyId": "A39F95349B56B799B9B31A51FF6A2F53", + "ephemeralData": "5A2FB963C561935D48A467246AA21A51296E899563F39DE55DDEA05F498B63C3" + }, + "fixedInfoPartyV": { + "partyId": "2E0356BF7C6BA18C8EF3E51771FCB20E" + } + }, + { + "tcId": 1368, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D593D5E5DB4D193178299A6A2330F16", + "z": "78ED9D71DFCAC99FA072546AF436337CCC844D78F7E8B3D6C65343BAE782A5F0", + "l": 1024, + "algorithmId": "76B536B68602B6B64CFA26B05DE0213A" + }, + "fixedInfoPartyU": { + "partyId": "459E8AB1F3CB6DBCD2BBCDB31095B55C", + "ephemeralData": "2A15EF7F89FD386477AE1873B8C29B6FC539547479F147E1329CE265072BE0E8" + }, + "fixedInfoPartyV": { + "partyId": "184758CA86D1DDF9D3F671C2BC889185" + } + }, + { + "tcId": 1369, + "kdfParameter": { + "kdfType": "oneStep", + "t": "082579119A97559D34089B76DCC9782E", + "z": "7476F5CE4363651F6C024D9E2DD6760F634DFD690DECE73B72A4D7E6CD9D8FD2", + "l": 1024, + "algorithmId": "05E108247DE968ED88906598019A2808" + }, + "fixedInfoPartyU": { + "partyId": "9FCBFBAF8EA157D4571F136A94ABE143", + "ephemeralData": "9923BD73AC47597F57FBF8B95287C9777145A3607380AD308D8469F7A29A8B33" + }, + "fixedInfoPartyV": { + "partyId": "B373E39E663A0626774BD1DB6A9A3BC4", + "ephemeralData": "E59BB995BEB22B0F7EA696DB0924AFE6897219D8229E23438F3B4E4C4332371C" + } + }, + { + "tcId": 1370, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E1233106BB40EC0316C47A76A3E3D3EF", + "z": "593A1B9AF0A5A444B32008F12AAE7F96A056D8F6F18460112C5168DBD7578B20", + "l": 1024, + "algorithmId": "E50F244C88B55A8B41D7DBDDA9BA082E" + }, + "fixedInfoPartyU": { + "partyId": "2A1FD3F51591B682860A38CDC168D337" + }, + "fixedInfoPartyV": { + "partyId": "25F69161C23793A36A17EFF88287259F" + } + }, + { + "tcId": 1371, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE1C7EEFF0731291006C4F340B20D2E7", + "z": "EC0C5E850B4731E41FB43E1C63EC8C9FB9B96E8D6D99EBE14ADB74A5B7276827", + "l": 1024, + "algorithmId": "9B5E96D284DCF86AFC4EF91DD832516F" + }, + "fixedInfoPartyU": { + "partyId": "2373FFB6482AD6F773F6A76F6A5C2DDB" + }, + "fixedInfoPartyV": { + "partyId": "DE82C4D02C73D307B4E991B9926350BA" + } + }, + { + "tcId": 1372, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F0C1258701E35D6F593FAAA84807496", + "z": "C359DCA02FC582FF14EC1DA7E60D94DBD0A14ADF0E7A7F66456D3532F277DDC0", + "l": 1024, + "algorithmId": "C7066DD06F05A9D6B24DBF649B78930E" + }, + "fixedInfoPartyU": { + "partyId": "8B1685802A1E3A06609514F6F2AFD59D", + "ephemeralData": "6C7993C1FF6CE0ACFEC6D9AE9B0971B62589A53E6FAFF263F0A3882505C4954E" + }, + "fixedInfoPartyV": { + "partyId": "95C7F0E62193020B4C77BE9546519B3A" + } + }, + { + "tcId": 1373, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3906BD23F27DBA7CEC6FE497821C15F8", + "z": "5DC60C15A287484051C37EF070895872A5364ACBAB2B61573139FC043491747C", + "l": 1024, + "algorithmId": "CF5EF2D8980ED31BEAFF925D0335B036" + }, + "fixedInfoPartyU": { + "partyId": "3120C4B8362BEADBFBCB2960631BD4CC" + }, + "fixedInfoPartyV": { + "partyId": "9A4B1C9775BCF43FB1FE489633CB80D7", + "ephemeralData": "DFCE44860E3421B21C8B362AFB8C3E1E55277C998D5305958E8C4945D22EF7DE" + } + }, + { + "tcId": 1374, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0739C1B4D6486C5220D30B78143EBEA0", + "z": "A428FC7C8A01AE78B9F12359D0A5D9CC3A680DBD71F18BF6C104EAF0007C8DD7", + "l": 1024, + "algorithmId": "9F707DC2039F3665DDD3C5F753CE4BC4" + }, + "fixedInfoPartyU": { + "partyId": "44626119ED1E7DB9B6AF6F00352C97FC", + "ephemeralData": "4B16A00304DC16EE295C3933E126754D62F9457AE94188C39CB4AE681CDB0A0E" + }, + "fixedInfoPartyV": { + "partyId": "373FCD6EE73D9978E994884DF16E86BC" + } + }, + { + "tcId": 1375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06310EEE9508180A1269EC3313D805D3", + "z": "42A1B8067F21633F39A336F70468FA6557D60988203E4D683AFF65D5183B87C0", + "l": 1024, + "algorithmId": "E6B5AA99AEFE1151904E0E972C75A925" + }, + "fixedInfoPartyU": { + "partyId": "018949ADE5AB9E056E109D6E12EEF7E0" + }, + "fixedInfoPartyV": { + "partyId": "ACAF34804371D801E38A0F2CA5F42FB0", + "ephemeralData": "FB6A842B9EC46C2E64E8B49CAD89553D20D9F68BBD8B59FFFAE9C8E9C41B903F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 56, + "testType": "AFT", + "tests": [ + { + "tcId": 1376, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43B6B147C4E57F215232A84531E01B91", + "z": "16726E8FA439EBC0228C45ABEBC3194EFED1C4A1C5985956049B4DEA", + "l": 1024, + "algorithmId": "0DB4E69AB46D31D00A6CE49694C1C14D" + }, + "fixedInfoPartyU": { + "partyId": "80901A8337B7AF4B4CCA297B1FC3A8FE", + "ephemeralData": "8DFC9F764F2482B201F9C782E6E874F614FE8293250218FABC080433" + }, + "fixedInfoPartyV": { + "partyId": "A7E8F9C08F045A6A695BCDB85BA59F54", + "ephemeralData": "C2277B7E19295CA3DDF4D1741C5A45B8E0B1257F97530150CF3A5438" + } + }, + { + "tcId": 1377, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AC573D98D078ECE51A6081D3A1218F5", + "z": "FD1D2CB2C3B3D406A4465C5C4E6718901A9DF121C6539190B613D4AC", + "l": 1024, + "algorithmId": "2A1B72D57B2F47E33C35E68CEB7E59CB" + }, + "fixedInfoPartyU": { + "partyId": "2C194BC4639A655E00CFE5816F62A8DF" + }, + "fixedInfoPartyV": { + "partyId": "7464035020D744202D7D30B827B5C18C" + } + }, + { + "tcId": 1378, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8510C5A7CEA056EC1F5A3C0716C9BC08", + "z": "0C0A99822A588150DDFDFE3823D1371762258264C1145612BE618444", + "l": 1024, + "algorithmId": "FD2A0018F4F30C2E25513962F6B9DD66" + }, + "fixedInfoPartyU": { + "partyId": "85B107A7B1EA6C9E94AF6DFC687D8298" + }, + "fixedInfoPartyV": { + "partyId": "4C793B372BC33533C8A9957C85B408F8" + } + }, + { + "tcId": 1379, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7278D6909B14EDDEAE3C8302A7DB1012", + "z": "F090792D7CF5ACF90F29A62E56BD200468BDCEF00DB7F03FFDD89E1C", + "l": 1024, + "algorithmId": "4BA267B0BBD6C239FCAAC8DE6E286900" + }, + "fixedInfoPartyU": { + "partyId": "33B6CD58210BA58F119E644A626C0FB3" + }, + "fixedInfoPartyV": { + "partyId": "60C6D05BA86F7968ADE96CBD30BDAAD4", + "ephemeralData": "2FEBE2B582A2F5BFD2CF58B6C2F52BB6079A88C7AB819F1D5A62E15A" + } + }, + { + "tcId": 1380, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FCFB1E933A3BE621DE17A78BFC651CF", + "z": "AF597E050938DAAA1EEFB4F4C7993536EE521CCB6E6364580A5EAECE", + "l": 1024, + "algorithmId": "7D7D4C555624A26AABAF076DBB9BE684" + }, + "fixedInfoPartyU": { + "partyId": "5CF357EE6B2472EDA688D4D3B8C17C63" + }, + "fixedInfoPartyV": { + "partyId": "0ADA055576F3A4B1C1353EDC242CE6F2" + } + }, + { + "tcId": 1381, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6041DAE50D6E44CBE41149A1BD62C8F3", + "z": "5E6F997AF04807B3EC313593B3106D6E5F6498FA79A7B7602E5A60B5", + "l": 1024, + "algorithmId": "12A91CEDA0FA7FC2236A24A23A7E8B3A" + }, + "fixedInfoPartyU": { + "partyId": "08C2E8213CB27BC18CEA9A3EE83E5CB6", + "ephemeralData": "8317F18382D4217B5A9EC34847C6B36A18AEAD55A8AF7ABA335D76B1" + }, + "fixedInfoPartyV": { + "partyId": "ECE8408EE1FB2A1223C80B3F44CACAF5" + } + }, + { + "tcId": 1382, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CB6CA873AAD3DEC4813EF4862B87438", + "z": "44FCB6F5BE3F88F300E0A02F1124FAB42085E7ED6D258319088B68D6", + "l": 1024, + "algorithmId": "4AB3F6669C10816A7A695482E8FF09AD" + }, + "fixedInfoPartyU": { + "partyId": "61754B4FB431AA6AFDC683CBA0F22FA6", + "ephemeralData": "6E85A626333154E4F4BEC6E1876213CC294D99B5E9E70A9C18F294F3" + }, + "fixedInfoPartyV": { + "partyId": "EA15B60B240A2B09220254DE13A8B12C" + } + }, + { + "tcId": 1383, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1FCF26926C25714073255491B80E96D", + "z": "D77A20BACC539D019FCA4D76B073DF444A6AB26B6DC979E2ABF12B6F", + "l": 1024, + "algorithmId": "B5E35604230F55844970262E8F27EC21" + }, + "fixedInfoPartyU": { + "partyId": "96B0121FF4D23765D9B43D5891DF4A63", + "ephemeralData": "7B3F4B9A2B07F2D8D2210AF2FEC2F124D7D2D05D281BAF12E335C2E8" + }, + "fixedInfoPartyV": { + "partyId": "6DFB69C39A51F3445DD1E0BCEDEE7FD6" + } + }, + { + "tcId": 1384, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FF1D64F2823EB2F021939BEE094D82F", + "z": "D92F10D3FCBCA95158AF7E590023DA0F180112A4BDFA8683A5C807B1", + "l": 1024, + "algorithmId": "434FE3C7CB8F45DF15EAEFC55E13EC36" + }, + "fixedInfoPartyU": { + "partyId": "AB3CD7DDA9C0AA1BBF1A6F5308C5C1CC" + }, + "fixedInfoPartyV": { + "partyId": "5672D1CB4B08CD9926D1CF22C854F300", + "ephemeralData": "12A2BAE1F4F2AA11DB1DD3C3106C7A7A06BEAEE563C09FC4F84CE2F0" + } + }, + { + "tcId": 1385, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5A734DD1666A6E786C3BC1BE916673A", + "z": "72C86110ACF8CD42271DCAFD8A2BD68FEC7BEBD73100768A05B43326", + "l": 1024, + "algorithmId": "42C4703702E4B5465E7EC318AFE7D469" + }, + "fixedInfoPartyU": { + "partyId": "3011E467C3B7BEBC04DCEE0D1180685D", + "ephemeralData": "133ECE27F9A1DE696A6ED48EAE28F4073A58B380171218DB7A11F6D7" + }, + "fixedInfoPartyV": { + "partyId": "3B8CFA6E4F81F7B66B396BC8BB5EBF59", + "ephemeralData": "5397F7BDBB9C729D54C1BDFFDA0C531755F8D7C5A210D8158FCAB4C9" + } + }, + { + "tcId": 1386, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C469BA9AEB3B3DE015B153467465AC7A", + "z": "BEFC2C58ABD0CA7D9D1221175D9049B95CEBCB25072A328CE21436DA", + "l": 1024, + "algorithmId": "A4FDB53334272E63781E2EFCDC410AFE" + }, + "fixedInfoPartyU": { + "partyId": "7A4E5D8147181AA0FD5962C4A8DE33F2", + "ephemeralData": "09FCBD92EF579742EDF2146B355F8A69650F47CCA878D3DDAD965B55" + }, + "fixedInfoPartyV": { + "partyId": "1BF700655F151165D00243557C1F1BCA" + } + }, + { + "tcId": 1387, + "kdfParameter": { + "kdfType": "oneStep", + "t": "455C2F235E302E8CF333C2E97511B0DA", + "z": "5C8FE6553B8308B8C2543B245A8BF915BD5089A6FC95E458FEA4618C", + "l": 1024, + "algorithmId": "C91E11BEBA80480CF9EC2E8B1BD989FE" + }, + "fixedInfoPartyU": { + "partyId": "5FCE141BF671206D5C2E3BEBDDD68EFD" + }, + "fixedInfoPartyV": { + "partyId": "5472A868DE848C99DAE73AD6A392DE76" + } + }, + { + "tcId": 1388, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34262F344803A35EE729351E6A3F5D15", + "z": "6F1696BF42FBA2EB75FFBAC963912E8381879CEEE0A7EA8B638F2896", + "l": 1024, + "algorithmId": "643EA332DEBA55D6A52B3E12747DE878" + }, + "fixedInfoPartyU": { + "partyId": "817C5FB52BD8DB130A47852FA671E23B" + }, + "fixedInfoPartyV": { + "partyId": "D3F5A34D2DF349B02F797FA0112F63A7" + } + }, + { + "tcId": 1389, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF3755B0FB93792CFBCCF471F2724273", + "z": "AD0A3D0164B2905CF82C7E1705F1C6A2A5A985D28E05C83BCCB9353B", + "l": 1024, + "algorithmId": "DC63A4DB737A9649C26E8B273738CD58" + }, + "fixedInfoPartyU": { + "partyId": "EC20E33DAAA096EBA637AA5EF41172F7", + "ephemeralData": "DD811A4A8FF746B4735F9757BEFECA5483AB733E2832E38E88665926" + }, + "fixedInfoPartyV": { + "partyId": "3720CCDF8F6924A4E3DA18C57078BB82" + } + }, + { + "tcId": 1390, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC397ED92C9D2F98C98AAAD8AD219483", + "z": "5627A0D2A65B4F9128715E9DFE01052323653880BDD2E0B803E8ED3A", + "l": 1024, + "algorithmId": "969BD83E68EDBB49228B2186BF6A5D51" + }, + "fixedInfoPartyU": { + "partyId": "A02D64C2A2DD97F0512E4181CB495E84", + "ephemeralData": "80060EAFD7E1A19AEF21387CB917304191EA1A100C7A8F9E2E93A667" + }, + "fixedInfoPartyV": { + "partyId": "2670BECECFE52793FA6B61BB212C66CE", + "ephemeralData": "5354251DC5E0D5C9EEAA3EFA89907FBCC4C5AAB10C2B46E8C666AEC0" + } + }, + { + "tcId": 1391, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C089EE32A45400ECFFD5430FF76D25CA", + "z": "0201F5050F3D76458E801D95A7C317D595C131C1937D76024C7236B8", + "l": 1024, + "algorithmId": "F0718F2BF36C209280D99F02EEF5DA52" + }, + "fixedInfoPartyU": { + "partyId": "DE35D9A754EE251DF43AAC96A34D354A", + "ephemeralData": "2F6F89CEDC28FE1DE38C487B740C4763F9417AFB6D150FAD3DD52A3F" + }, + "fixedInfoPartyV": { + "partyId": "329A3638259CC42CCAC58D5F416CE62C" + } + }, + { + "tcId": 1392, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33D4A3E062A0D831C1674101D0EE28BE", + "z": "704CF6848B41F547FEA85827BE2DD407E2B6DF09B4A05EF7F348D2FD", + "l": 1024, + "algorithmId": "D04C46C4AFC4B839E3A505497DB8EBCC" + }, + "fixedInfoPartyU": { + "partyId": "21C639875FD858FEF1B190E496034364", + "ephemeralData": "7FCEBF3B2376FD1FDBC6503012006FBD9008EBD5FB873AE2AB5CBA85" + }, + "fixedInfoPartyV": { + "partyId": "A50E9A7B0881C4EF3CFEFF1F2E0D7648", + "ephemeralData": "CE6B22C370BD70D9DD5EB2086C23703943876B4600E9574DD8E84160" + } + }, + { + "tcId": 1393, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D51A12CCB8E0C0F203DEC92AAF02B491", + "z": "0332B13F11F677480908E233B3C3802353FE79E4F197716228440F6C", + "l": 1024, + "algorithmId": "CCB805BEF40E46564D9320C325B51EDA" + }, + "fixedInfoPartyU": { + "partyId": "B1CB111D1F6990C0AE88382C4380DA3F" + }, + "fixedInfoPartyV": { + "partyId": "3EB1E83218F58D110AE9852CFD72E08B" + } + }, + { + "tcId": 1394, + "kdfParameter": { + "kdfType": "oneStep", + "t": "161B18A56842C96F070C082D88314C3B", + "z": "267020687A1A29DE583ACC89B68B6EB351934A058274BCFA705CE0A9", + "l": 1024, + "algorithmId": "6A9BAB6A882EF8CCF7EB6DF0DF277483" + }, + "fixedInfoPartyU": { + "partyId": "E383AED87F6F2A4F89DE18DCB451822A", + "ephemeralData": "5C5E6702909B74DEF882584D4BDA07E1C57F37C3DDD8DE8B3D0053BA" + }, + "fixedInfoPartyV": { + "partyId": "E019D779A49EE96FCCAE0537A63080BB", + "ephemeralData": "B963DB0D59DC8DD80742217B7F243B70B84596EB01558B3395226DC4" + } + }, + { + "tcId": 1395, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B42FE21EC2A32DECD07B1758E359A5C5", + "z": "E664109CCD49837C4471B6B08E9ACAA6EB7A1809A15B60A0A5AD17C2", + "l": 1024, + "algorithmId": "663EEEE0013E88B34265231351E018E4" + }, + "fixedInfoPartyU": { + "partyId": "40D9B74964C69941C83E8959D024A380" + }, + "fixedInfoPartyV": { + "partyId": "FB8F08DFCE3F37EA7167111492222990" + } + }, + { + "tcId": 1396, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7EB6EF09F58DD10FB890E10D5C06FD2", + "z": "28B435F7007BC71812FA9C380D1607E5A19AB1689C651572B0EFB08F", + "l": 1024, + "algorithmId": "5827E88D79DEEC46D99FB005C530810F" + }, + "fixedInfoPartyU": { + "partyId": "5F6D2309BDE677F9DCE9E601D7E8FF57" + }, + "fixedInfoPartyV": { + "partyId": "613CB8EE35C8DFD97453674BC60915E8", + "ephemeralData": "2006276394970B61AA200F8B1C59F4083CB6C1143A1DFEA0C2C86945" + } + }, + { + "tcId": 1397, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C123C5F2C9AB6C831B1B77FF5D84B49", + "z": "356529CC78D2030AD177FB7A93F37C85AD369970EB7CB9E0B49489F6", + "l": 1024, + "algorithmId": "743FA3E281EADE94EE02E2EB2E5A7E2F" + }, + "fixedInfoPartyU": { + "partyId": "E585EDCF8F938B0E598B8ECC588FD648", + "ephemeralData": "67EF849AF1F7E1DD0999A24653B7E81CB6F25241C463B106C34CAB03" + }, + "fixedInfoPartyV": { + "partyId": "3B8A942B244172197DC9F7EC7E1C01E7" + } + }, + { + "tcId": 1398, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7330E1B0CAE45B7C90C68B53613A2873", + "z": "F19915AA9E2967B5DBFB5ACB3D01A9FE5D06F03B8F1FB7A090BC83D7", + "l": 1024, + "algorithmId": "5EA23FE1614768A5A7E7E84D16A6712A" + }, + "fixedInfoPartyU": { + "partyId": "6325AB09BCBD12825E89D337C3F61D03", + "ephemeralData": "9CB9BAA31F2A2542F91E8B2D1E8AE61E5A6FBE55E656FEA759D39269" + }, + "fixedInfoPartyV": { + "partyId": "14E2DDA01E5C97C5834018C54209D23F" + } + }, + { + "tcId": 1399, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7889D986F08C4F9EE78FF598955576C0", + "z": "54649FC411894C1349ADFD2ADB6880CD5D9B3BFC31738B55B845455D", + "l": 1024, + "algorithmId": "29B2AABC5C44BE3B3CBF11A302865307" + }, + "fixedInfoPartyU": { + "partyId": "5C99230234D4FA6477FFCC3461B6CF85" + }, + "fixedInfoPartyV": { + "partyId": "27B5F334BB10643F2B88C6B1E61E1A31", + "ephemeralData": "EE67F4362E09D36D468492B72DB3EF4679282F77F180002839852CAC" + } + }, + { + "tcId": 1400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBC9E618CAA8331F1CDE1CBE0D33739A", + "z": "0B500740608A0B6B4BB1FA2D502171771A590D00D2A4FAD01FDE8712", + "l": 1024, + "algorithmId": "74F0C8A8AA50603BEE54E53E6F231E7D" + }, + "fixedInfoPartyU": { + "partyId": "B10C60CFA0A4D0EA2098549654D68A3C", + "ephemeralData": "565C6600D922830436769699AAC8DF7EFC07907E351D9D5811ADA5C4" + }, + "fixedInfoPartyV": { + "partyId": "C4181FB9EDE4F9A2627C9DD8FE0A7C11", + "ephemeralData": "B19F086662E12308850223C740F111D48240BE7A96CA36F5DBF16B23" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 57, + "testType": "AFT", + "tests": [ + { + "tcId": 1401, + "kdfParameter": { + "kdfType": "oneStep", + "t": "413E94433594BC8BFD6AB7EE85F84BD7", + "z": "88DC300C43286C15043787DC6A45B2BEF4474FB17EE63EFD3671836968327773FC2253", + "l": 1024, + "algorithmId": "4B6C41D6DC1D6FA1875E00D18F35F294" + }, + "fixedInfoPartyU": { + "partyId": "E6E23DA4BE6C807C028EE3A4D4F944B3" + }, + "fixedInfoPartyV": { + "partyId": "62CD2A2D5AFD522E3FEB20B70E8E80A0", + "ephemeralData": "73465C9F564FA7909076940D24FB7A4DAF6B474189D85F781B5BED4324DB4F72556DCA" + } + }, + { + "tcId": 1402, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59362AFEA26383378A3941E38E0AE802", + "z": "4E1A93EBB509FFB81A4DA93307B4C42D9E3F79712184A5F8E9F235A4A21D8E2DDB81A7", + "l": 1024, + "algorithmId": "05390DD7F573C916B3AB623B52D7E274" + }, + "fixedInfoPartyU": { + "partyId": "29F161B3E54157F0596645E4760B3255" + }, + "fixedInfoPartyV": { + "partyId": "8A65FD3D2BA5E9024184A87AF295088C" + } + }, + { + "tcId": 1403, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2335D6DE78BF8AC46C3DB13CDDC1043", + "z": "748C36700195E6A79CD6F30914D954188AAA2C17562B2109D33354FE8777F0CCFFCE23", + "l": 1024, + "algorithmId": "75C2708C973E6ACD6F7D71A0491DB7E4" + }, + "fixedInfoPartyU": { + "partyId": "BB73A28025BA07E078DE89CC85F670BE", + "ephemeralData": "9D3DDA72051CB139023460758FBE2536A698B795D26232BF17DFDA19D9F5B9495E1AD2" + }, + "fixedInfoPartyV": { + "partyId": "C88FE7A4AEB9C6AAF16B1D7B042A2E1C", + "ephemeralData": "A5FB5322515D86A6AFE4CCB9192B948D67B6C5F4E4A5DABE679FF385E9E88B149E84CD" + } + }, + { + "tcId": 1404, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E7CCA878E84411B569616A0AC964D4E", + "z": "6423A7C8F5005C985C523BBEE871153B05954278816E4265972CF1613B5D02614F14A9", + "l": 1024, + "algorithmId": "2FA390880D5224937C8EE1DA77A8D2D5" + }, + "fixedInfoPartyU": { + "partyId": "4B0CBFAD13317F74BA3412F02D424073" + }, + "fixedInfoPartyV": { + "partyId": "1FBECE37F004A201B025912C381840C5", + "ephemeralData": "B1A3F472B03DCA2F70EF7C1CAF472C0B660302B550D9AE3E0A3E73B6E129146700380D" + } + }, + { + "tcId": 1405, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34E5BBFE9ADC568421B9BBF71E84DBDB", + "z": "3ACC09C2E806762A02B60EA9E379A213204F1B2636C9A6947538304FA64A86B0B3C9AA", + "l": 1024, + "algorithmId": "669AAA1FE500EF7DE7A1538187D7C764" + }, + "fixedInfoPartyU": { + "partyId": "7EB61FBB7A2446BFEE343490DFE9F656", + "ephemeralData": "273887C00A463CE962238A6DDF8F703130E08EDA8BB35029D97B48D0A20AE63191D29A" + }, + "fixedInfoPartyV": { + "partyId": "2C9F99936FC55BB8470E47EB6F093A37", + "ephemeralData": "3ACB1A9C50CFB4C512264861EA447085A0538B17A118710194B8A7C2A623F20A3F4D86" + } + }, + { + "tcId": 1406, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E88D1C7984420A6C7B27E6AD1AC38E6", + "z": "B5C5C3C5874EACEFCF9A7C9A6AB40F3F6BBA7F22905717779A3E31C376C053EA3ACB18", + "l": 1024, + "algorithmId": "D69D7ED6CD134B974EE7F11076612E19" + }, + "fixedInfoPartyU": { + "partyId": "1922904EAF3BE32B9FE8C22582B3430B", + "ephemeralData": "5F7A358A5F81EA40B63E14267D4537CBDE85A251B3D5B7E21686F0B96DA061633F4866" + }, + "fixedInfoPartyV": { + "partyId": "AB5E870E73BDD23B35C945A3AA51867B", + "ephemeralData": "4554D68CB9A7CA575441106E853ADA51CB38753DAD8C276ECF2CE9224E18CA20D54E44" + } + }, + { + "tcId": 1407, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9EA5EF172C9D3D14D3FBA99180F6D7A3", + "z": "7DB416EDAC26CC1F395A8C3CEE580E0CF3C994D1E7A86D9979E55F01BBD16CC3718167", + "l": 1024, + "algorithmId": "88632FFFE452BCDCC353695C4D2D87E5" + }, + "fixedInfoPartyU": { + "partyId": "98CC566B656130AC20F41CD11BA0BD7D", + "ephemeralData": "F15F8EFFC8CDF42A0B423819F022ADF413692BB9828B3839359C98113735920E9099FB" + }, + "fixedInfoPartyV": { + "partyId": "3FACDFA473E6BF7F390A6988EA6E247D" + } + }, + { + "tcId": 1408, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9A7036BB484B55865C83AE1F24127BC", + "z": "7C4CEBD4D4CC1D707D51FDB9338519F55FE184B37A835867BE45DC02844DC2FD814D91", + "l": 1024, + "algorithmId": "877C38500E0593D84081A226D5B7C5F3" + }, + "fixedInfoPartyU": { + "partyId": "2FD13AD40D607B9C153FA36EC57FB703" + }, + "fixedInfoPartyV": { + "partyId": "0B7CEA700FE413CF71FFC8190C9FB2A4" + } + }, + { + "tcId": 1409, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5061B20E62C1688F5FAB3DC6BC130979", + "z": "D77DA85177E9DDC5CF711F4067571C31D3FCDD2AA694438AB8E7D142A9FB2B582E2928", + "l": 1024, + "algorithmId": "1DE66B02FFCD0904854B9E2E5ED1CA7D" + }, + "fixedInfoPartyU": { + "partyId": "8497C1FA1C2084DEEBD15F7EF28D3DD8" + }, + "fixedInfoPartyV": { + "partyId": "C5E26770E865E32BB939EEC2D0332FDF", + "ephemeralData": "F23C563E1D6D026C7B5239534F15064A797264644504D455FEBB886C4AD2550950ECCE" + } + }, + { + "tcId": 1410, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E845F1AA5618A79BE507530A1C208A6C", + "z": "192C8018BB23463FE618D15EF8241105FA512DA29353DC19AFD7FC661FE9E2B5A71387", + "l": 1024, + "algorithmId": "B3AD42F3A015C50A667A5FE781FED9B2" + }, + "fixedInfoPartyU": { + "partyId": "2875144709EEA43220B96B83D0F89BDF", + "ephemeralData": "2262FBD12A9E0FE2BAC504589A77813507B43AAF98961BD81FE003C9E3491B62D640F6" + }, + "fixedInfoPartyV": { + "partyId": "0D59550D1647998A7F071451C4B65640" + } + }, + { + "tcId": 1411, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FEE314A73DC5F87296D878A26E596E6", + "z": "477721F7E1EEED47A31E7D7EC745C2DFA972423602AF2E195E34563312FDE9BF81590B", + "l": 1024, + "algorithmId": "0712709C528610292C62CAA62B47EA05" + }, + "fixedInfoPartyU": { + "partyId": "31A65CD8FA532856CFB184E91E52EE42" + }, + "fixedInfoPartyV": { + "partyId": "B6F767526846CB5ACA420391C64C0F88", + "ephemeralData": "9C70445CC103676BB88E5310EAB0812A126F08BD46EACA2329557075105BC054EF47C0" + } + }, + { + "tcId": 1412, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E20A3BC645BA929A3F660E40584C3AF7", + "z": "E8F4BD65911414FD239F1AD25D18A01437235237686EF68EFDA4C53BD93B69F035617E", + "l": 1024, + "algorithmId": "D592E1CD66D6C7A1585ACE90BEDF80E1" + }, + "fixedInfoPartyU": { + "partyId": "F282292C49D7109B931161BB6BA2AB6B" + }, + "fixedInfoPartyV": { + "partyId": "01D19712B026DB17C9D562036541F503" + } + }, + { + "tcId": 1413, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98A4EB7C032F46327758BDB7F5542A95", + "z": "A0A3ED784C16B57AB4F8AFBA82D65F0FE0F3522F0A7EDC39C4327CFDA452D7405846EB", + "l": 1024, + "algorithmId": "AC7FB1188C3C9263C819E5C1E7700777" + }, + "fixedInfoPartyU": { + "partyId": "B0003CB39A1FF88579568543D43E59D2", + "ephemeralData": "6DC365B53E005D90C2FD5D08899C1E14D638DE394B4CE56648299DDF919EC31539950A" + }, + "fixedInfoPartyV": { + "partyId": "D561D3AB9F120E5CA5F5ADBA0E8B6A58", + "ephemeralData": "8B3A2BFBBC165D4BF92DF729661B2952CFF3DE220193EB9D8201DBC5B7310C6E6A9C2A" + } + }, + { + "tcId": 1414, + "kdfParameter": { + "kdfType": "oneStep", + "t": "60431F9F4E4053877EEB229C27D7A92F", + "z": "F70324C9ABA332D956302C697F6CFF0EFD6DB30A9C7A799340933AFE2922C73B20783A", + "l": 1024, + "algorithmId": "F8E2812D316468E84AF2722DDEAF178B" + }, + "fixedInfoPartyU": { + "partyId": "9B35B70D0557E108ECD97F0D31A761B5", + "ephemeralData": "A77908FC22492AD487767F268EEF3C0CA8E682756E76E796CC4FCB960EB7F8CD613422" + }, + "fixedInfoPartyV": { + "partyId": "8A8FE96A21550D30429A98AABD2AA2F0" + } + }, + { + "tcId": 1415, + "kdfParameter": { + "kdfType": "oneStep", + "t": "132A3462132647F50B82A3DA40BCDFA2", + "z": "923B7F8E39035B4E7862B3761E775EC5BC9D1D60E55692801731FAB64DFE24D78501B8", + "l": 1024, + "algorithmId": "09AFB73A4A4EA9C29C1782966E6D3519" + }, + "fixedInfoPartyU": { + "partyId": "F6C6619E79028BA8460591A4E5D73139", + "ephemeralData": "16740D95EDD9E9B0EA7531583318B7452EACC4570189F7F65BFE85C1240FE340B46577" + }, + "fixedInfoPartyV": { + "partyId": "DA220102B050AA921E23B22156528619", + "ephemeralData": "FE37FFC7AFE7C4E0AEA0F994920D5572D0E77283E9C511ACD873256D0F5B315F0DB097" + } + }, + { + "tcId": 1416, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66B3CBDC9895F335C6900278224DDF06", + "z": "48BAEEED2791105FB95F4E71251EFDC02E786559F717679AD705D1AE88FB92EECE4F54", + "l": 1024, + "algorithmId": "BF5B3A5A9C21A1B90429A552EE26DF73" + }, + "fixedInfoPartyU": { + "partyId": "333BFB1D5EF52A73519E560A2C6C6C0B" + }, + "fixedInfoPartyV": { + "partyId": "ACACEADD409D2942329F5D293669F29D", + "ephemeralData": "0F4EB248409611012DC7F9CC0FE21151FB4FC35DD4639B005946B2CC5E69234BF8ECEC" + } + }, + { + "tcId": 1417, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ECE4B728040E70FE27911ACCDAECAA2E", + "z": "449AFFFF137A108A74ABAE0663B82E6CFA9D26E7C34C81FE09BFEEDA7171944060FD63", + "l": 1024, + "algorithmId": "ECEE432CA787E3B73C7E1EFA72D34020" + }, + "fixedInfoPartyU": { + "partyId": "DD26ACB2A593100CEB1139BC57AEE22F", + "ephemeralData": "42889CEADDC2051BF557CC1C333D4578049408E7FE09AC74C9E6FDE9915A99AABE77BD" + }, + "fixedInfoPartyV": { + "partyId": "A9BE940760764853BF6D1D879599DC88" + } + }, + { + "tcId": 1418, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7BF9818FC536E552FF7FCCF4224D90E", + "z": "BF6BCB411EB5D933B97019268131E685EE9A10F9561651845D3B1ED5ACDF0A051C2C98", + "l": 1024, + "algorithmId": "B20530F558428AD937B12CA10EA01023" + }, + "fixedInfoPartyU": { + "partyId": "EB59173EDE729F93244F2C2FA80014C8" + }, + "fixedInfoPartyV": { + "partyId": "E6B91C1C69FB792599ECF5AA67F139A9", + "ephemeralData": "89E7F7B98276BB53B20A0F141E1E577A9197A0C97F1B7B92A687EE0D9759BFF110E48D" + } + }, + { + "tcId": 1419, + "kdfParameter": { + "kdfType": "oneStep", + "t": "946A27D154F52D4C51414CB02459C4D5", + "z": "698C13DFD4B372140C52A419EBFC66735D3D1506059B90D6AB17D32BFCDA87BA754C80", + "l": 1024, + "algorithmId": "A5F17E1BE9207E07A507674259A4E565" + }, + "fixedInfoPartyU": { + "partyId": "3FEE28B1C16BA098512EC7FA1E3708CF", + "ephemeralData": "15407383EB5B90397852AB38AB631FDEFE353104C3CB4320B9E7CD34165C61832DF7CA" + }, + "fixedInfoPartyV": { + "partyId": "7FBDA8D4553075DF2CE920AC6EE55E1B", + "ephemeralData": "93F8DBD291A4FD7AC3CB3636BE51C74BA5A7B603AC35FC72A4DDE30ED8F54B667460F0" + } + }, + { + "tcId": 1420, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F29440B26949E84611FF751BA5E31802", + "z": "51562C632C07A07E92AD87CD5E96BA6B6D6C3A0FBEFFC454DD41C3497935721F5A6B01", + "l": 1024, + "algorithmId": "8B6AE33D5249C0A4DF70EA66D8BE8642" + }, + "fixedInfoPartyU": { + "partyId": "2F3A2A464DAA98DAE2999ECC194A89D2" + }, + "fixedInfoPartyV": { + "partyId": "6D287914BCA9FBA3C5988D0C6A3828D3" + } + }, + { + "tcId": 1421, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE243F8EEE2D91AE7550C7017A02E3EA", + "z": "4512B18160D60C7E793C505BAA42BA2AE6AC692EFEB03E460645A2CFA4602D99A83CB6", + "l": 1024, + "algorithmId": "A8624A43FC01D5C1EEC4391028B1A122" + }, + "fixedInfoPartyU": { + "partyId": "84FE92FE370AC0BCD8333E897BC9A207" + }, + "fixedInfoPartyV": { + "partyId": "2B9584E5CBC325E7F1484C917333F959" + } + }, + { + "tcId": 1422, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D46A272E7EA805E63117C6B12FD59A2", + "z": "143F8B4A7F257ACF66BC5226A0A58F9C7384CF2498925C2C889C78DAA1C48A0E564274", + "l": 1024, + "algorithmId": "791CB88D88DDD1EDF10C6550C51F64A3" + }, + "fixedInfoPartyU": { + "partyId": "17C6E8CC07E5F4CF9A23B7DDEF0E624A" + }, + "fixedInfoPartyV": { + "partyId": "1DA13E1D525FD25DCEBB30A2CE0DAA2E" + } + }, + { + "tcId": 1423, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35145C7CEB89740A2829A50B5D11D057", + "z": "411FD8AD135289437B4495A66043AD390885FF789BCC66A3ABA280A880361D56168794", + "l": 1024, + "algorithmId": "784FBE58D655EC098F3E12B8856CBE4B" + }, + "fixedInfoPartyU": { + "partyId": "EC10D83DC185FA69DC6950215AF8A7D0" + }, + "fixedInfoPartyV": { + "partyId": "46CBFD8E2D1E3CBAD8C070265188DB53", + "ephemeralData": "0DB27ABAFCDBAF4A1466813736A9F097FC5A1D66786B3E8310ABF76643E8E72A07D1CA" + } + }, + { + "tcId": 1424, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A12AD6CE238C7B42831D781DB56B72CA", + "z": "E07C4B7AFD63490DF0DCC260BA03E49A2682F62B9C38EF12BE30517AC880F47754A695", + "l": 1024, + "algorithmId": "538D8482761E7651CC87D5883260E0D8" + }, + "fixedInfoPartyU": { + "partyId": "2D60DE09930BB9ED64F0A94A5F162FDC" + }, + "fixedInfoPartyV": { + "partyId": "72C74332ED31BB9017B4F3EB91BD90B0", + "ephemeralData": "1DB2204376BB77BEEEBA47613CF14FBFBACAB135E82FE649B7A6CD9FF3F0DB22E0FBC0" + } + }, + { + "tcId": 1425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C03C9B61EEF3A45620A3712C69F15FDB", + "z": "92153B46D4DB6DE3C93380C702135C7F2433D05BCC62A3E5E7AF7DB028E4C3B0178EAA", + "l": 1024, + "algorithmId": "D11A8A303DD678E135CA608820532339" + }, + "fixedInfoPartyU": { + "partyId": "1E98D7F47DBE897DEB4137F60E6973A2", + "ephemeralData": "D0A6BDD50BD5B5C23D85281B482D2567E82ACF8DA9A0DBA243441B90304F8C9663BD76" + }, + "fixedInfoPartyV": { + "partyId": "25F015E9A149FDF2DB7D392316FCB17E", + "ephemeralData": "255EB0C5AD54E3DF1D5552A72EC514D2DB2AD035E46E3945DA6E12066D48754808B6AF" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 58, + "testType": "AFT", + "tests": [ + { + "tcId": 1426, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01685C37BC367F6A6D86B846BBDC5AC3", + "z": "21EBD198902D7E1B6D344421529EBB33E1C92F3F7BBC6804296CBD8E1A6E3A5C", + "l": 1024, + "algorithmId": "E4ABEB7C9F64E37D238DCE1098EBA225" + }, + "fixedInfoPartyU": { + "partyId": "3B2E0AFCDEB7B2EE0655907C4243637B" + }, + "fixedInfoPartyV": { + "partyId": "7C3291DB8F10FE010618DF15BD7B8954", + "ephemeralData": "8421127744917A3C2A8365636F4844DAF14F1170558D6E649866A26486ECDC00" + } + }, + { + "tcId": 1427, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABA42530994DEF9931D36AA6C37A202E", + "z": "EA316F56AE2053FF61A7F841CB28D1E87EC707C8D505FE1038E50D8715470104", + "l": 1024, + "algorithmId": "27562523FD3CE70F6108A49DB984D3CB" + }, + "fixedInfoPartyU": { + "partyId": "9168FE65A7B2413B21A040DD21F89043", + "ephemeralData": "EA01FCFF45008F0730A7A1A50E37921BCDA1E236ED3315E65A0C69D9FD5EB1CF" + }, + "fixedInfoPartyV": { + "partyId": "5E04346D2AF6C7EC266AEDD2BD87878E", + "ephemeralData": "8AD2C37CAADE2110272EFBE35BAF5E4814EA5AC66949F62D092E8183316C49D9" + } + }, + { + "tcId": 1428, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE9053C3A54EA7C26534C99988CB0D1F", + "z": "307999FFAACBBBB253710DD673A643C3ED65BFA0F03348BD0C95178373B6D90F", + "l": 1024, + "algorithmId": "42FCA4A2D1E1B5843D3E4D528E20E71C" + }, + "fixedInfoPartyU": { + "partyId": "03C5439650CABE7707BE88EEC8C13225" + }, + "fixedInfoPartyV": { + "partyId": "CF240DEB4BC8C0636802D81CAD80E260" + } + }, + { + "tcId": 1429, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FDB456ACC32FB379C3F8A9A8B1444FF", + "z": "60BA5CDDF63EF22162A70F41545F6FB0FBCC13E9FA564B96D27927FCE7E3FE2A", + "l": 1024, + "algorithmId": "55AC746E5A2B7EA6242910F1768E60EC" + }, + "fixedInfoPartyU": { + "partyId": "24B344334FF542CAD859C5906F30BCA3" + }, + "fixedInfoPartyV": { + "partyId": "9039F583E80AC581561A2E87E6FA1C36" + } + }, + { + "tcId": 1430, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1607877311687781AB5733735F58EDBF", + "z": "962836A44F37FD851571C185F6D57761DD3226CFF89D4257E9DCF57B013E1372", + "l": 1024, + "algorithmId": "E0720D014016571D9C470DC6B9A9DC49" + }, + "fixedInfoPartyU": { + "partyId": "5ADC5E9530086E11C96570CEEECD004F" + }, + "fixedInfoPartyV": { + "partyId": "1920448CBE7D7B28A1B19010B1FCB08B", + "ephemeralData": "E729840BE7F4A64D1B703FE42B86190ADC20267F40B816E40C12F00E4459CEA8" + } + }, + { + "tcId": 1431, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B58CACAEBCBE0FF77921B6EF84595874", + "z": "E2A7A1BF96875ED1B7708800FD995D6A4BD51B4D12C26E58D89AA38A0863CA91", + "l": 1024, + "algorithmId": "B9DD4EB564BA018F555E7EA57FD7F26D" + }, + "fixedInfoPartyU": { + "partyId": "DC2C0EF3812C80BED12ED4EAEAD30475", + "ephemeralData": "31C2C4EE5C803EC82F9560EA47489DE0C6B718031B2C36AC5A08B48F13505273" + }, + "fixedInfoPartyV": { + "partyId": "67BAB5019E3E90CB4FE5CF564E4B5CAB" + } + }, + { + "tcId": 1432, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77FEE0162A489BAEB1D1B3228B9C990F", + "z": "2E9D023775A0055E7E64E57A78104EF12F76908E2C7A3C66308EC4530B7EA8CE", + "l": 1024, + "algorithmId": "E33E3B8E51015A0FB42D80104EB62F32" + }, + "fixedInfoPartyU": { + "partyId": "1E22A438E5246B0A4B9032BDE582895B" + }, + "fixedInfoPartyV": { + "partyId": "9E64F819234EACFF44E8FD86D0C83919", + "ephemeralData": "C073F1274285BDA19A8BD55ED5C91E5082E2BA457EC10E6DC4BDBE71900D05D1" + } + }, + { + "tcId": 1433, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5B805E9D6C2456E547857988B5FD53D", + "z": "3C812DFCF1010A5A4E3B302527A82508785BD4619EB03A8F76227418A2FE019F", + "l": 1024, + "algorithmId": "5ABF99FF8903BE416B03BE366F5ED2A6" + }, + "fixedInfoPartyU": { + "partyId": "9AF2D9A75DFCE9B3C9411C9AFEEA2D06" + }, + "fixedInfoPartyV": { + "partyId": "B8627A31720E48B0C66EB0905DC4CE49" + } + }, + { + "tcId": 1434, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41E6A4B87DEC27E6775B262DB908EE0D", + "z": "703B303C9E6FEE1525B47273E286EE949A107CF3D4460945F3634FD258E2D130", + "l": 1024, + "algorithmId": "7A45FD89E5FF4915F4AE28C65566704B" + }, + "fixedInfoPartyU": { + "partyId": "6A8486DF2474158ABEA8EC1BB7B4BD62", + "ephemeralData": "6A8E4590FE5D58C845A77F58C73571D6CD14B7C5E0E343BD1DBDCE041ECAE951" + }, + "fixedInfoPartyV": { + "partyId": "5EC5DDC5A95D9AF6EF5E527147EA8704", + "ephemeralData": "92EB7FFE21BED14612835CCDCC3EDC79B5778CBE70AB558542D1BEA24F150856" + } + }, + { + "tcId": 1435, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9B595D47BE29F76DECD25A817F12100", + "z": "FBF33B389A3F22D95E781F8F5A504721A38A7581F4854F94EDB538E786EF8E79", + "l": 1024, + "algorithmId": "A5F3B02C9BAAD791C7B61A39B500A784" + }, + "fixedInfoPartyU": { + "partyId": "005DD8A05982046BC8BD6CC09E210122" + }, + "fixedInfoPartyV": { + "partyId": "5B59B51BF8C5AD91165A195A448D593F", + "ephemeralData": "294E50CFF8BE2F88C7E7C7B765E2F8853FC400BD1E9C8BEE8889B5E2EC537FD2" + } + }, + { + "tcId": 1436, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C10AA6C0F63E029E93691963972E762C", + "z": "922D936CD1DEBF2B9C5A41B7F1272B6581BB9CAB9D1317661CCE1FEABAE39F47", + "l": 1024, + "algorithmId": "89EDD84B6BABD239EE8AABD37C5395B6" + }, + "fixedInfoPartyU": { + "partyId": "01E7CB054B3011A80C9E32F5AC24E9C7", + "ephemeralData": "D860960E11A6491B8C328C0F78C2D680EAD3B0FD412A8E46450509187F9490BD" + }, + "fixedInfoPartyV": { + "partyId": "61AACA73A4AE671FE0AE139802AF89DC", + "ephemeralData": "9F50198EDEA759E1276C51D0007464522EB036F463CF64075E30388925F58561" + } + }, + { + "tcId": 1437, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0285AF9D45A766154BC7BC72C7A8B8AE", + "z": "0C56F35DD68775AE2400825DE9555F6184C598E1842712698A73D97CA2968A05", + "l": 1024, + "algorithmId": "2676A1204A4015BCF339043D9CC075E0" + }, + "fixedInfoPartyU": { + "partyId": "7C6943955F5E1E45D4A9D40A95453E8F" + }, + "fixedInfoPartyV": { + "partyId": "BB752C9C5206F3728A82A49C593DE423" + } + }, + { + "tcId": 1438, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF8A643A2F33F5D4FD55333146C04EF7", + "z": "ABF9C81C3AE3DB2553CF3EB83C966E3F1983EF247530B8A3D30E457CCAD10ADA", + "l": 1024, + "algorithmId": "29EB02883D09A41033F74F30B7D97B87" + }, + "fixedInfoPartyU": { + "partyId": "E4D8E00378A3EC40B1AD20307E623919" + }, + "fixedInfoPartyV": { + "partyId": "BFDAB7D362A1A57D3A9C164ECECCEF19", + "ephemeralData": "C8356C4E0B7BB343C622CBDD2DD902C8FF02454F579BCBFCE4C11EE8058CEB5B" + } + }, + { + "tcId": 1439, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D979F99BB93B07D65947CAA63D27A5CE", + "z": "25FBDA5A98622C68BFA13C560E34C28BE387EBBC484EC05CD3E1FBE1C12B32CB", + "l": 1024, + "algorithmId": "DCCFAE36DE1B041E979495A03886B08A" + }, + "fixedInfoPartyU": { + "partyId": "EA9DFF7BE6E054C3D2FA0E820312428A" + }, + "fixedInfoPartyV": { + "partyId": "C481794999B5586C918F826AC4D92E57", + "ephemeralData": "5EDA7A3844B5167283BF206021AC0217778F6944BB5C024B62C87C6183D97ABD" + } + }, + { + "tcId": 1440, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F2B4F3244F7AE0B534FBC68F526297E", + "z": "7278331A4BAB6660198FE0E7DE85C3BB68B89F12FACDC9D9904767216848A07F", + "l": 1024, + "algorithmId": "E5829BE77CDFB0C2AA7712FAB7B9AFD6" + }, + "fixedInfoPartyU": { + "partyId": "6C4054EF9E1C95E217C4195247FC8085" + }, + "fixedInfoPartyV": { + "partyId": "51A576FBBBBB072E109F784DCA6E888E" + } + }, + { + "tcId": 1441, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51202110E94AC1589A380CEA4D019DC1", + "z": "F4D505E58EF97027559AD411D983A4E98C9F13B43D5A6254ABA2FD0610F4084D", + "l": 1024, + "algorithmId": "ED91B08B70B02515E6EF2F4F520A6061" + }, + "fixedInfoPartyU": { + "partyId": "45E5FAB287F855FBC3E780BB82235F04" + }, + "fixedInfoPartyV": { + "partyId": "8C4EC5130396E89F6E7840469D6CFFBD", + "ephemeralData": "AA90E7BF51971C14AA1EBD566806276CB48A2DA212DBBBDEC0BC69D01CF05539" + } + }, + { + "tcId": 1442, + "kdfParameter": { + "kdfType": "oneStep", + "t": "126B910E9BBCBBD8FBABD732A9B6136F", + "z": "8D6CEDE4BACCA5E081F2F21D861D09E37FEF44E36B7A1F9D77510834167AC893", + "l": 1024, + "algorithmId": "693219F1FCA0541E7B89A075A5A08B58" + }, + "fixedInfoPartyU": { + "partyId": "94173F5D130B3FC166351B9E29698DE8", + "ephemeralData": "8DA124DEE6DDC4B7D4C7E0C6DA5583ECB2B092973C8F35F9D6A0F5E57305B83C" + }, + "fixedInfoPartyV": { + "partyId": "AC2A2AA6E5A552C99802196734A7EF37", + "ephemeralData": "998C2EE13A7311BD80D34A7BEBA8040194D5F7B91721BC30F15C04BAC1BC7061" + } + }, + { + "tcId": 1443, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F7BEFC94354E9817923980A66A65BE3", + "z": "51CCAF6A50B5C5CA081611922D0970FEBA4797564B5A6598D71B26084F74EBD8", + "l": 1024, + "algorithmId": "AFDDDD563B412F4095F3BF39363EEDA0" + }, + "fixedInfoPartyU": { + "partyId": "EA23D83DA4CDCE3FBCA78E686A62D2B3" + }, + "fixedInfoPartyV": { + "partyId": "98E86DCB7143856CD5C7DD4DE658459A", + "ephemeralData": "E461734A6308FC959AF4666B7469CFAECAA1F2CB7143C3EE4CC97051DC358497" + } + }, + { + "tcId": 1444, + "kdfParameter": { + "kdfType": "oneStep", + "t": "258731200D9526C9B97A9C41886EE881", + "z": "A0B15A1A60601178A982155A0DEED7BB7A2CB10FA0ABC82669F6F6B74FAFEC92", + "l": 1024, + "algorithmId": "3666486E0D8DD6D1D167AF8629CBF346" + }, + "fixedInfoPartyU": { + "partyId": "18A9DAF0786105F28A7E1799827B684F", + "ephemeralData": "679EB80AB3541B6459A3E1A935A7500B17CC4E9696A6D605697DCB794248521A" + }, + "fixedInfoPartyV": { + "partyId": "B65CF3D8409319FD9DD65D6808FF6647", + "ephemeralData": "BE7081634D90380A7AADAEC44F304E3E384C5EC9765EDEEEAE3950E20289E560" + } + }, + { + "tcId": 1445, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2610D00D1CBB8E4B5929E7C313E59EBD", + "z": "729F13F96588E94B4BF137961870D00876E77D007988EC6BDF9A3BE19DD49088", + "l": 1024, + "algorithmId": "FAB6DFCB9288B743AC30B5F4D3437432" + }, + "fixedInfoPartyU": { + "partyId": "CE58AF5ED6A706048118180A3A0961A7", + "ephemeralData": "919BED1B8F8F14EFB7EF6CAC739FD2154C57E534B3F752899E5190F7603C1344" + }, + "fixedInfoPartyV": { + "partyId": "20CFCE20C6819BB8D1AF126200B5BDB9" + } + }, + { + "tcId": 1446, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B50B4B14858BE76DD04F4CBC7CD193F", + "z": "4BAC24CA45C3126AE2A6E0DFDC5065F2CAC1620081890163E228163D0AAB6E21", + "l": 1024, + "algorithmId": "0D1D604A84090F005E6D230439EF6FD7" + }, + "fixedInfoPartyU": { + "partyId": "14DC836BCA64EBF029CF12B4DB629DBE" + }, + "fixedInfoPartyV": { + "partyId": "553E17E2532BA0C9C8408B74644C568E" + } + }, + { + "tcId": 1447, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80869465E4A687649BE14A966CCC340C", + "z": "D04F10187C4FB954C365D61CB492DEADB3281F7AED12353A944B26A45E5F3B82", + "l": 1024, + "algorithmId": "E092532AD26E7B65B4F4BF03B454360D" + }, + "fixedInfoPartyU": { + "partyId": "4421F337603137E8E53C33F3EE50EDF4" + }, + "fixedInfoPartyV": { + "partyId": "E62A7BCFD6EB099CD6AB64D2028637F2" + } + }, + { + "tcId": 1448, + "kdfParameter": { + "kdfType": "oneStep", + "t": "367ED0B6691A225E08B0051F0892C806", + "z": "F41C74695E122241C096689A91B0BBAB398A8C91BF5A5ABEEFF2F9035CB5FD5F", + "l": 1024, + "algorithmId": "FC832BB9DFB59BC4D3DD8380702AF2C5" + }, + "fixedInfoPartyU": { + "partyId": "D176F1ABC549A3D50CF82676BC7F7F1D" + }, + "fixedInfoPartyV": { + "partyId": "3D4A8594E7E11AF466F69CED20FBBEE0", + "ephemeralData": "FF1D4125170C815589E22FD421B689C640AB5015D11EF6BBA3C284C2CE0D12A2" + } + }, + { + "tcId": 1449, + "kdfParameter": { + "kdfType": "oneStep", + "t": "369061FAFF526E5EBC926B5442E60C30", + "z": "EBD78BCA234B37D3B520B8A8FBAFC69572F06477F9C7C1960DFEF24C7396D569", + "l": 1024, + "algorithmId": "08A9C5FA0CF0174CD18B1C91AAF46521" + }, + "fixedInfoPartyU": { + "partyId": "FA4598A393ACD90E3DBC352E24A3B987", + "ephemeralData": "F13A128D0CCFED710A5F44CBC1BD72DCE90A43DBA714A0E1B4B08E94B2346ADF" + }, + "fixedInfoPartyV": { + "partyId": "953396A7954D70F32BF238A321EAA551" + } + }, + { + "tcId": 1450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B287B3B30B667FB25C8CF857A8938650", + "z": "D55D21037349E2D04B24260F3AD3A8397C93AE9F79D9AF54261F25C12DD5F22E", + "l": 1024, + "algorithmId": "0966CF2579AA5E89112D69F3FC3F5C44" + }, + "fixedInfoPartyU": { + "partyId": "04BC121FA8536D662B4838FA334BF8D7" + }, + "fixedInfoPartyV": { + "partyId": "513222ABDBDE5C8ACE07A24DDF0AD1E9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 59, + "testType": "AFT", + "tests": [ + { + "tcId": 1451, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96B578B21778EA7ADF29CFCB6061BD28", + "z": "FD32CE4969CD576CDFE8A4869DBBCC615E70282F4AEC408CBED1F0FA", + "l": 1024, + "algorithmId": "631AB97BA33123DEC71874E7ADAE7338" + }, + "fixedInfoPartyU": { + "partyId": "A33017D1E7D75BE78AA89B6D651500FB" + }, + "fixedInfoPartyV": { + "partyId": "0EBE756822A329D6900E91DB2EAE7ECB" + } + }, + { + "tcId": 1452, + "kdfParameter": { + "kdfType": "oneStep", + "t": "718644C4676C37DE7640360ED98392DF", + "z": "006D8817927C60A769DD49E03A7EBCEEB6B93BE07E96A7DFC93808B0", + "l": 1024, + "algorithmId": "CC7D117A700872ACDF49D3384CFF58C8" + }, + "fixedInfoPartyU": { + "partyId": "D2F904FB38EDB3D872BF96EC681AE167" + }, + "fixedInfoPartyV": { + "partyId": "3A56B2A58B50CA1D667A8732B921878A", + "ephemeralData": "6FCCCE019F5A35474B018D16A967A36DA55C2C610CFD58CA5121FE17" + } + }, + { + "tcId": 1453, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E85CC22729D499F90AE2BB67B9407AF1", + "z": "9145DDC57A309EE898713D8316EF4CBB0E36E9CB485F20E1DDB92C74", + "l": 1024, + "algorithmId": "419FB138CA414D9C5B0C952A3EE8A735" + }, + "fixedInfoPartyU": { + "partyId": "7DEDF81AD05FC2F80B5559F0DA34E2C0" + }, + "fixedInfoPartyV": { + "partyId": "DB03183EFCD600C450E9A5BDA9AC4ED4", + "ephemeralData": "7F582C8A4B3C02E8988FF0F5B2B0EF7EA1DDC11EE3F6621D5BB5E988" + } + }, + { + "tcId": 1454, + "kdfParameter": { + "kdfType": "oneStep", + "t": "067988E2EA85A4A2CC496882B3C762EE", + "z": "D716E24294034E0935248E9508207293A042E0B24288EA42F62DA547", + "l": 1024, + "algorithmId": "2291D3F75642C2C1858FB27BB8AF8BFC" + }, + "fixedInfoPartyU": { + "partyId": "A20084D903DF9AA6510E3C4838A2A42D", + "ephemeralData": "AEFA61CF645757093D0D15B1D45FB498A1F8FC436454557D832F39A8" + }, + "fixedInfoPartyV": { + "partyId": "3F05D44D4FAF53E6A99A6E614D845C21", + "ephemeralData": "655DEDB61A2940AB77E743A55B1BB4CBE2501C64F36F282F7FE60DAF" + } + }, + { + "tcId": 1455, + "kdfParameter": { + "kdfType": "oneStep", + "t": "633FFE0E316510D49D8989BE59C58FD2", + "z": "A4B8E785C925A868DCEF29406E3B248DA5DBE464A7A7AFEEACAFFDAE", + "l": 1024, + "algorithmId": "4D34B396E2AEA69FB5B451B58D850E53" + }, + "fixedInfoPartyU": { + "partyId": "DAF41EE7235F880398344B66A1A783EC" + }, + "fixedInfoPartyV": { + "partyId": "F60627E6D706FA630EE5F0F6D5B010E3" + } + }, + { + "tcId": 1456, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64FB827F9A304FDBDE3EAA33D8ECAF5D", + "z": "EC5E9BFE448E13DDA6B6C90DA96F621BF90B8B34CAD972724DA4B634", + "l": 1024, + "algorithmId": "47F812C4D3C54CE51196B63C397A3CEF" + }, + "fixedInfoPartyU": { + "partyId": "A7A421D5EBD5AA6E0E9E60516292FB85", + "ephemeralData": "F4633B61C3BBA8A8F93845ED14D74F5F27208754CCB58D87E079C344" + }, + "fixedInfoPartyV": { + "partyId": "D8FC96DC6EFE0CE4D7B9A4E76FBBD1CB", + "ephemeralData": "46E12FFF95BB40B1CC8300C12A4B7EB5079BF7AD6CDCE8D6FE5A0EE6" + } + }, + { + "tcId": 1457, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A4885CFF9D7D2E529DF8DFCB83C973E8", + "z": "AB28D3AFE8D66CF4EB6BE49B1039BF9D2C695C6BB3E356D7D0D19452", + "l": 1024, + "algorithmId": "B93AAD662790F3E3FB8C63D97B71A8C7" + }, + "fixedInfoPartyU": { + "partyId": "6E17158F91E169DCD2D4EB6B87FCEEE6", + "ephemeralData": "03313467EBB1C1E2607CCC382D0321E9BDE5AF9DF01B026CF49200CC" + }, + "fixedInfoPartyV": { + "partyId": "3BCD96E0EC79B696D2E2726854DE5BD9" + } + }, + { + "tcId": 1458, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1735FB3467F2BE535BC855B901181510", + "z": "7AA5769F69553FC1E12782837E6D67EB1DE141FC62046E23CF308F8D", + "l": 1024, + "algorithmId": "DECCE6CC8B00008BCB0DE338F8D168BE" + }, + "fixedInfoPartyU": { + "partyId": "7805B510A1BAFDB53DFDE8CA8F97A5F1", + "ephemeralData": "C885C82F69025252AA56718AC8AD2FC7394D5553D4B1E47351EB70AA" + }, + "fixedInfoPartyV": { + "partyId": "9377BAE5C17D29BA06F5F5DD3A0BD185", + "ephemeralData": "F3610EA639D15B1349824FE95EAB21826D5721CDAE4485D80DCDEE04" + } + }, + { + "tcId": 1459, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB58474C2A7090314AA8430477D8D22F", + "z": "14909FD4BA3B05FD6A938D5B6C01528137D154558D89A29D7590BD87", + "l": 1024, + "algorithmId": "2A45FCA6D2D0C3CA1040CCA4C2EA7DFE" + }, + "fixedInfoPartyU": { + "partyId": "B0214A498C8DD06CE84B056A82C4155B" + }, + "fixedInfoPartyV": { + "partyId": "11FDA0D58281CDEEB3BECE048EDEC971" + } + }, + { + "tcId": 1460, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CCBB58D5B1008D425F9F5236F1D89CF", + "z": "F24B3CB9A12F38E5338BF4D58B00D735D1C7A7E5E1207259085CC32D", + "l": 1024, + "algorithmId": "396D7B59FF1F62253B7129FB2062B397" + }, + "fixedInfoPartyU": { + "partyId": "7C8A3B685CE0651E95D2F2976FAE1519" + }, + "fixedInfoPartyV": { + "partyId": "261C4EBB93F447982A99868408FDF027" + } + }, + { + "tcId": 1461, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04BD4CB0790888F110112D2030DEB1C9", + "z": "EEE6FC9F254D7038F9195BB041BFF43F7E7626685BB32614CAEEDD20", + "l": 1024, + "algorithmId": "22AE95D430689C180A3F3176D80DB052" + }, + "fixedInfoPartyU": { + "partyId": "FAC882FEA20EE4A6F61063DECC5AC529" + }, + "fixedInfoPartyV": { + "partyId": "40172BC98FAFCBC43254C9C6C9FDD193", + "ephemeralData": "6097199905FB6324E92B0B6E53A7B5FA764CCB9BC8E4DC9FAACBA331" + } + }, + { + "tcId": 1462, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5EC24EE8223AA3B433006ECCC4A78F4", + "z": "6C10B6BAFF384FCE2D52F8FBFBA8CCD3AA0EE398F56A32A2AD68EEFD", + "l": 1024, + "algorithmId": "E2ED14AECDF21E5D6BF901174CF9EB05" + }, + "fixedInfoPartyU": { + "partyId": "0834550DC23F40ACBFD02C32387C77DE", + "ephemeralData": "B9BB4EE8FBA678D5672117FD21ECF369B6ADF7BED1F68728026F6F86" + }, + "fixedInfoPartyV": { + "partyId": "35736786EFB66AA14633072F1B791F90" + } + }, + { + "tcId": 1463, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5EF81916BFE90E59F4D9E50E9B2FA5DB", + "z": "02C9748B66D17A3C83C44F324FCD93B939613C10A8EECD67B061D5E1", + "l": 1024, + "algorithmId": "E065745BB12AEBCCB15492112269644C" + }, + "fixedInfoPartyU": { + "partyId": "D18B87B70E78B51386CFCCF3B39B95A8" + }, + "fixedInfoPartyV": { + "partyId": "04F224FA0366217454C68C9A41C53B9F", + "ephemeralData": "69AA7E5ED4080EC10339EBE2FFEFB5CCB6D67D3C46C3ED46AEA17B00" + } + }, + { + "tcId": 1464, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24828CF31D3E71359D4A7945CFEA6DE9", + "z": "46F7EB8425471AC1F858B30FADF2DB2B5A56F9EA3B464CE8A1930540", + "l": 1024, + "algorithmId": "4B0B64F33B983F81D00363B72D89CE9E" + }, + "fixedInfoPartyU": { + "partyId": "4CE5AE269C6369D0EDFB74BDF4DDE624" + }, + "fixedInfoPartyV": { + "partyId": "54FC1D6EBD256389333F0E917E5A72F0" + } + }, + { + "tcId": 1465, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF95627ED600283BD8DDA3AE90D4364E", + "z": "BE3D4B8E1A3D438DBD7567E3E21F712018469AD5D0C3C1BE1BB50394", + "l": 1024, + "algorithmId": "64E0C54123ABBE400C987DE679246BBD" + }, + "fixedInfoPartyU": { + "partyId": "13BB04738CA6C4103D8EDC28DE8EC17D", + "ephemeralData": "C11ED1E1E343EF670C13530583728C9BC65141D8EC17F21E08C9B8C5" + }, + "fixedInfoPartyV": { + "partyId": "9B50F176CE5FB57393C9BC2988894AE9", + "ephemeralData": "F3500FDEC3DE9DC8B78E0356D44C27E674D5F507A7B06D0833377577" + } + }, + { + "tcId": 1466, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59F9583F14F5642367AB6BFB8F223D7B", + "z": "BD384880033A5D468AC8DD0ACED90F4876EB1B6771DE3C39498CD84F", + "l": 1024, + "algorithmId": "D80ADB5E32C0C1365B7CA7215BAF2B6E" + }, + "fixedInfoPartyU": { + "partyId": "E027B15E3F9FC04E86E366C8DE1B68B2", + "ephemeralData": "3E4A80532CE2AE0DFFFFBF2104F1C9899EF1136F8F6209268A141E34" + }, + "fixedInfoPartyV": { + "partyId": "53584EB95F8C3223294B835936942B88", + "ephemeralData": "32EEE0C77D0644BB7E430623BFA537E73B8672E128F23D3BADF7C4E8" + } + }, + { + "tcId": 1467, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63F9ECED97F138B4AEA772AFE259CADA", + "z": "9E32963D0C241FE04AEE42B6224DA9343B837762A6B72AED72F85E95", + "l": 1024, + "algorithmId": "B4476F26CB3AE1DD0D39B9D6E645E57E" + }, + "fixedInfoPartyU": { + "partyId": "3880B312AFC7D476C735D6E7F120A2C8" + }, + "fixedInfoPartyV": { + "partyId": "F85634EB3A7682AEFEABE1CEEB0B7A6C", + "ephemeralData": "BF5339F374C0F9B2261CD11DEB9E2D383E7AE1AB85745D539157C0DD" + } + }, + { + "tcId": 1468, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B97872E003B2C0EE5BEE93BF25D4A208", + "z": "12B883CBAD3D365D71F7D467C71AD465195DFE459F68B21320BD1B0B", + "l": 1024, + "algorithmId": "4540771F65B6E7AC7F6913D3A6DFBA40" + }, + "fixedInfoPartyU": { + "partyId": "C1DF3439553120B9035AFD6E399E6560" + }, + "fixedInfoPartyV": { + "partyId": "FA905410DED55B077B0C9BEBA619F6D5", + "ephemeralData": "84A166BE92CA756C9E8DF5777B562837A1A3470D167A67AA235FDF3E" + } + }, + { + "tcId": 1469, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2973301228350221DB7EBFCE08B30C79", + "z": "9DB24ECEA64FA96D37FC3ABF7561107964EFD35DF61AF587E8821134", + "l": 1024, + "algorithmId": "80B7498CA9CDFD4C1DF2C99FD4294D65" + }, + "fixedInfoPartyU": { + "partyId": "FBABBCF183F8CFC67A75A4891C0BCA94", + "ephemeralData": "41F0AEE79AD5DAD3C892627D423919DCC28ABB3C33D868BFA011611A" + }, + "fixedInfoPartyV": { + "partyId": "E84CE83361D4FCA1EDB4D654FEB04578", + "ephemeralData": "8D80A14C65056E8B0BF6BA967810B9768B3FFC32185A7441BFB5EAB8" + } + }, + { + "tcId": 1470, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58C81B1816D1F7FF629BA45F5560337F", + "z": "8E877E5EAD4510B0C1ACDDF8F0275B110B6E23C680A3F3522D22F357", + "l": 1024, + "algorithmId": "13496F8B5E99A4D03347358686E0F951" + }, + "fixedInfoPartyU": { + "partyId": "3C8FE08F8CC01B4D970740DCB51B3063", + "ephemeralData": "1CDCA38F54D02FB908951C156BD4CE74AE46A8066F3B1EE1D0A3508F" + }, + "fixedInfoPartyV": { + "partyId": "98D545DF1282BDE42DCE770981CF311F" + } + }, + { + "tcId": 1471, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DD5C0DD4E5C7EC11EEB258F1B7EE5B7", + "z": "FB03DCEDA595CADDEB0608E7E3CC00C694F892F35C7D02E9D6B2329B", + "l": 1024, + "algorithmId": "82B52DC74FF1134E88844C7AC4FBD9CA" + }, + "fixedInfoPartyU": { + "partyId": "FD272267B598DF7A94B4A43D8EAB36EF" + }, + "fixedInfoPartyV": { + "partyId": "FE0DE80C9CD070EABAD46679B2C05856" + } + }, + { + "tcId": 1472, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69035B8C3A444AE588BE5D672BC2007E", + "z": "9901A250E4EC24EAAAF976615517D807BCFAEB530FBA0CAEF715D997", + "l": 1024, + "algorithmId": "5951E1C3B186332DAA6B1CE4E62B0E42" + }, + "fixedInfoPartyU": { + "partyId": "7CD7B34671AA5ACBE9191C2FD21E31D7" + }, + "fixedInfoPartyV": { + "partyId": "0A0BA630ED737F596115D8EF330D8101", + "ephemeralData": "A69DD6700858E865F3214E82704C366487CC078A2DBEEA8C28CD2237" + } + }, + { + "tcId": 1473, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4CC4A4101ECCCCB574D6B87539CED7C2", + "z": "4932A3B8F34B71FE211ACCC20D1EB5CE18D257FE334DE2EF73E8BFBB", + "l": 1024, + "algorithmId": "23930346C122F549D3041715E7188FAC" + }, + "fixedInfoPartyU": { + "partyId": "1E3B9A89E0331F1B8606D631A4C2E54A", + "ephemeralData": "99A2F197AFF7E72D9418E904AF4CBAF574494DA389445CBFADFFA6BE" + }, + "fixedInfoPartyV": { + "partyId": "888D1B7E898A9B33FCFA0D2D3663983A" + } + }, + { + "tcId": 1474, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADC54CF423AF7F1C048290CAEBAEE0FA", + "z": "2D751EC08CC4DDE219A9D401D518CF8A23F92E7D3C9BA0807CAF2F53", + "l": 1024, + "algorithmId": "6A488D38E1DA1C6A422691AC9123421C" + }, + "fixedInfoPartyU": { + "partyId": "9C6D71445AE9CCDE098D2D571D4D03E1", + "ephemeralData": "EB35F70F415DCCDBE0795A6E2B61BC226A76CAABA31F21DA664C795E" + }, + "fixedInfoPartyV": { + "partyId": "62AB792DE207C628A561F5286F70D54E", + "ephemeralData": "53A802BC5A2D420659D65434ECE3560B1C92BBBBF417D52F8810BB9E" + } + }, + { + "tcId": 1475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3C48764CA3E0253D5CF60408480C792", + "z": "118A415A7B30FDC01519C00CE757A170FF559976B606B178C4A40897", + "l": 1024, + "algorithmId": "766B541BB2F1D414494FBF14DE172ADB" + }, + "fixedInfoPartyU": { + "partyId": "A60DCAC1E1FEA6B0121B0D108CE48581" + }, + "fixedInfoPartyV": { + "partyId": "26366A29D89922AF6DA3BE56ABB164D0" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 60, + "testType": "AFT", + "tests": [ + { + "tcId": 1476, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F001EE56BE6AF27D4D9C1E4F23D740D5", + "z": "7A9FB93C23B542EDAD9A94B90031B76703F0B77FF06B2BDBCAC4F158FB6B495583AD14FE86", + "l": 1024, + "algorithmId": "06108F9E3F2D25A399AC178C12079D4F" + }, + "fixedInfoPartyU": { + "partyId": "37D7CDFEC7A282D82CF7276BF67F8362" + }, + "fixedInfoPartyV": { + "partyId": "8B228DA03C150EBDAFC0C9ADE3471FEC" + } + }, + { + "tcId": 1477, + "kdfParameter": { + "kdfType": "oneStep", + "t": "175AACEC929A5ECBA4D583FB4280006C", + "z": "0E2CFDB357EEC5AC654650BFBC0406BADF56C386F51D158C73FB081C4F8880825A350F1D07", + "l": 1024, + "algorithmId": "B9731D4A04CBB29BB13F00A51C649288" + }, + "fixedInfoPartyU": { + "partyId": "E9659C7D493E31DA7ADFF2F780EA5E3D" + }, + "fixedInfoPartyV": { + "partyId": "E98FBFA41A56A32339319A780A164D37", + "ephemeralData": "103EE46D60AF713660884ED446B8C4C50315B07C53055F0FE8FD118EE28927C8E8D5D927B8" + } + }, + { + "tcId": 1478, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC59B22DC05CE2348789DB5B858A5FF6", + "z": "C1EA0C8B81632E9D8BD794E6B5F0DB05DA9E474B97929BDA1CCC63963621D3F4BBB1957C5A", + "l": 1024, + "algorithmId": "E00D57676767DB165B5EE7B9C96D3FCC" + }, + "fixedInfoPartyU": { + "partyId": "6BE129C9465A6ABD78C44E698C01245C", + "ephemeralData": "49B889C5F84C74C2903A7BF87816B7711145273AD1B1CD914BFF689995FB60D5FBA4A15401" + }, + "fixedInfoPartyV": { + "partyId": "BAEEF8958CD872785CB5D390A14E611C" + } + }, + { + "tcId": 1479, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3DDE0CA9AD62EB3C9D6D9099C27E2B9", + "z": "622CD888E62C5059808369265366B2A4286F4BFC6DC606D9B9741E0D447636C2E29F895952", + "l": 1024, + "algorithmId": "5C89EC852B2BC30D1AF456B21DEF2940" + }, + "fixedInfoPartyU": { + "partyId": "94CD2C1028DA0F61BBFC58B0ACF77AEA", + "ephemeralData": "852A0D7898822D6F5B8E16F2AAB64C77C354828363D900308EF1BDEAF6B259BB4B22A6AE7B" + }, + "fixedInfoPartyV": { + "partyId": "4BA9AD4EDADED2CA3F6DBAFA9DBE9E3F" + } + }, + { + "tcId": 1480, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F00D8889664657909B994F6519F3F3B", + "z": "2934BA28C2CBC103D553013FE26BD2F142EDD9E41F55EB972CF5D72507131A26917A0DB2F8", + "l": 1024, + "algorithmId": "737736E6B248C2A44A9939B97B499CFF" + }, + "fixedInfoPartyU": { + "partyId": "FFA3770E7AE2DDC4BDD0498C2515E1FC", + "ephemeralData": "55B34BAFCC1E8BC6D91F621DAD01A7B6C8C403222BB6DD03320C63043EC6245298A2DF06DC" + }, + "fixedInfoPartyV": { + "partyId": "A054E2C304D992B16D454E5EF08F6487" + } + }, + { + "tcId": 1481, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D117331EE72617A9DF75E05D362F8922", + "z": "D31FB6F75BB8EF3C9C47089384D67796564569310AE13227BB57033E777F02FFC626456895", + "l": 1024, + "algorithmId": "4DAE19874CC972EB0D23C35EB173FAB6" + }, + "fixedInfoPartyU": { + "partyId": "C9ECDD45E482241EDD1EBEB086238687", + "ephemeralData": "2EB77C8AEE025F5663866F66F958D7A5BF46AB820D1370C3FC4B4F3BE2BAF632A16FF1FF7B" + }, + "fixedInfoPartyV": { + "partyId": "415A37D011612191CE83CDCB2C53E664" + } + }, + { + "tcId": 1482, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B443E78F87B95A325E41B8AD9190A3AB", + "z": "4619C2B77BBF2BCED65D793DB2E1C951D7789C3A09F5A787BC0E70D846BAB5F8F81C1A3431", + "l": 1024, + "algorithmId": "7678604DF46CBEA6BB5590B8AB9CF399" + }, + "fixedInfoPartyU": { + "partyId": "4A547DC3B2ABA13347D44BD5EEB37D5C", + "ephemeralData": "AEE2DBAF74D65012ABCE9C7F99F406028AE9BDACAF8EC40492B1AC77E3577EBB69396BE0DC" + }, + "fixedInfoPartyV": { + "partyId": "97D11423E69DA09627D3F19634C2F30C", + "ephemeralData": "08006E123E7FFE88E7FEDF03CC3310F3B4FAB9A2E0E129E23DD627D1ACB01EE99F76D9DA41" + } + }, + { + "tcId": 1483, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A67F681C5D05128DACA689C2F369DBAE", + "z": "B83C33F3AD32CF1D547D7A8149D047706394EDE6101CF9F6A14F7590D973947EACF13E8CA7", + "l": 1024, + "algorithmId": "14F8F7C9DA9A2C9AEB7B5A8F082EEF59" + }, + "fixedInfoPartyU": { + "partyId": "7A354CE918960A5613311AF5462F6806" + }, + "fixedInfoPartyV": { + "partyId": "BDC3ADA143C1BB1F16032AA86E453643", + "ephemeralData": "BDB843855BD35DB4D06F5FD6302B3D5E4AF7FDB0C2B799D06B64E476F2BC15566E4DBD7D09" + } + }, + { + "tcId": 1484, + "kdfParameter": { + "kdfType": "oneStep", + "t": "020F2191A9043B9D16E0C18225A451D0", + "z": "9A592C34342959D4C7A91666AA6F176789906A18023C9E761337A0BD8735AF217A2EE6872F", + "l": 1024, + "algorithmId": "5B0F80E15C37434BEA7DCBE5B37D8B31" + }, + "fixedInfoPartyU": { + "partyId": "B778A6C79C2603A820C49E6FA1AEE1E0" + }, + "fixedInfoPartyV": { + "partyId": "454ADE037764B26D060B13837670C879", + "ephemeralData": "FA40842557DC24A4A95FEB019BA2CD5C23E864BBB572E02DFF0CF063024F52C81AEEBC3722" + } + }, + { + "tcId": 1485, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DD10E1857E6E6CB3C6E7574A39E1540", + "z": "9590A527B26502068F7E86328DAADEF358A87A08708407D9797B66F2F5A2F0A768C983BD41", + "l": 1024, + "algorithmId": "9302184DE74484741A5D7565516FFC1F" + }, + "fixedInfoPartyU": { + "partyId": "940FE661DFF1C3F30F81ADFC25992B38", + "ephemeralData": "B1586289D0F21F2D9F946F9A9B5C465C82E0DD37EF763352C800F0EF137121353CD9DE4DC4" + }, + "fixedInfoPartyV": { + "partyId": "31AF7268BD712A0E91BEE9B478F5FCBC", + "ephemeralData": "51F9E21DC170BA37D6FD708CCA8772CE67E83B32C4DBEF3F2FFDCFE6D18CC6A13E810668A6" + } + }, + { + "tcId": 1486, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5399BFAEF964DC87E72F0EEEAEF42D86", + "z": "DD0585785C3880150233C3412D51613C451E9DD606527556AF4B840A3DE8082294D297D3A6", + "l": 1024, + "algorithmId": "9DA475D92CCCF5F82F0F66104B285D5F" + }, + "fixedInfoPartyU": { + "partyId": "21D8F311673037E489E4700C256408D2" + }, + "fixedInfoPartyV": { + "partyId": "6FD136EE4B8928E5D45E53A446716A0D" + } + }, + { + "tcId": 1487, + "kdfParameter": { + "kdfType": "oneStep", + "t": "848333C409275070D4985908959BA0E9", + "z": "1CD86F039B67BECCC0EDA8F565FC63C27B4A82EC2132641BE8D459495C26FA132FD64636C8", + "l": 1024, + "algorithmId": "8F5C620E38881F9B82D5E73E19C9FD56" + }, + "fixedInfoPartyU": { + "partyId": "B1D7E7F4EC55EBC4FFBF3874A6D65F86" + }, + "fixedInfoPartyV": { + "partyId": "8BABE538F28A8F660C6A3A7149D20609" + } + }, + { + "tcId": 1488, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0805E8F5BA6AEEA873FCDAE8D0A68D3", + "z": "2992D0ACD21B6AAAD8366A49AB69C2A10E8AACDC4798E22A209B0DC8B076A7098326FAACBF", + "l": 1024, + "algorithmId": "EA98233F8F8C5279F9057FE455D0EB36" + }, + "fixedInfoPartyU": { + "partyId": "B1B2140ECBBF66A3C0E5DC93C0CA6771", + "ephemeralData": "A9B2DADC69B796CA6AABE208A9DCC47AC9E275D56F4F5A74C9F25E069D709E397A90E91DD1" + }, + "fixedInfoPartyV": { + "partyId": "3D3E9F7C64F2D9CE86D6F64F2B2DF698", + "ephemeralData": "5883B09A79572BEE46F02EDA56ED8479B647DED6A6A89AED88A66FD205F35772E70C59562C" + } + }, + { + "tcId": 1489, + "kdfParameter": { + "kdfType": "oneStep", + "t": "436458FF2E965807A505942CB483A6B9", + "z": "17AF5100DE1107F144452B875E6FED5F5F37E7D96FE0111BFDD55B3CE9F6A1698D569E0415", + "l": 1024, + "algorithmId": "45ECB6B46743436A061FDB9E332C6404" + }, + "fixedInfoPartyU": { + "partyId": "7126BEB547ECA83039F0CB8C044FB896" + }, + "fixedInfoPartyV": { + "partyId": "61C9FCF64A35F8B15C3D06F72E17B5E4" + } + }, + { + "tcId": 1490, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FED8F82FDA724475129ECA7A1858821A", + "z": "98425665E431E8C5FC7ECD781C56C0F13A1C862D2C1E7CA851479950A0D9A0C6C03FA502F3", + "l": 1024, + "algorithmId": "A1D53D454A63BC2917A06FC2428ABB20" + }, + "fixedInfoPartyU": { + "partyId": "7202AE54C7CCC0573129787FE253E196", + "ephemeralData": "0054A129BFE517A8B600B7C5259678BB3A324C96853A51EC636768DADD21F948234E4202C3" + }, + "fixedInfoPartyV": { + "partyId": "B618CE8D7AD3F3C9C19DA1C05A987249", + "ephemeralData": "CA99A87F2FFED92986E3D15BD5DB1979D8B3233C3AFD4B3AA882C2356AF8915E29AB890780" + } + }, + { + "tcId": 1491, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90016FFF92471B0B7EA75F6977AFE292", + "z": "194958807C2221FBD82D25C5C297A84AC3496D3D61E0308AC56AAD227E4CBCD7A3A48BAA33", + "l": 1024, + "algorithmId": "2C8DA5F48B117E91208E2049304469F7" + }, + "fixedInfoPartyU": { + "partyId": "02C13166EB81B93CB147F86226BB88E8" + }, + "fixedInfoPartyV": { + "partyId": "E63144EE8B0182738FB2DEE2F402E8CD", + "ephemeralData": "500CB99F044F754D264675EE9709A90625476FB3C3205FCA7142A40B85E560516023B1B478" + } + }, + { + "tcId": 1492, + "kdfParameter": { + "kdfType": "oneStep", + "t": "487463CBDD01A9C7D0A8D6080E5F2CD3", + "z": "781488A558D249A6CD02E8511714FC0CF05D2C4839A7E29C368A4262CE7A0811EAA1173391", + "l": 1024, + "algorithmId": "83A58F4719EECC351483CEABAF22C0EA" + }, + "fixedInfoPartyU": { + "partyId": "3682A35AC72B9A1E94A53FE423C29903" + }, + "fixedInfoPartyV": { + "partyId": "CD1490326F1828AD0629988903368557", + "ephemeralData": "CCD36D2BF9160AEB248D17371D98007A74DE024D429BC702723BBCB6F98056CC0B3A6AAF36" + } + }, + { + "tcId": 1493, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BEB1C5429195EACA173FE2958D37ECF", + "z": "60DAC2D04D132D23204786531B8EA732BB6A9BB3C73D04C12F5F7A3BDC674A7484796F51BF", + "l": 1024, + "algorithmId": "6D8ECF2C816B392F824D3AA533F48F8D" + }, + "fixedInfoPartyU": { + "partyId": "81A162DC59EA721484EE7B6C335BE815", + "ephemeralData": "3035F1CC918CC144ED9CE0070AB9B64F373FCBB2DC2AFF5E11670DB94603ED315DE0AA8CDF" + }, + "fixedInfoPartyV": { + "partyId": "D6B0FF2FEB13021CE0C2252F6EB7B87F", + "ephemeralData": "5F61834FB51045BEB0CD05EDD9F32A07D113FA5CF9C96D44D581F70215515055D6F0D68F49" + } + }, + { + "tcId": 1494, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CCB22726D61B6F26C9C2C22C9043F71", + "z": "A6D57FB85400D5DE32CC84B9ACA8BC473875DFF58E31DB615FDB3C6A33A2CE214AD231415D", + "l": 1024, + "algorithmId": "3D05D716DC341F22484C9383772549D4" + }, + "fixedInfoPartyU": { + "partyId": "427DDF2FDB910DC0F0B896627050F332", + "ephemeralData": "506974FEBE58FF03F1F3ABECB804B1D6048E015B8B06E2A6873B94546F019C912588841543" + }, + "fixedInfoPartyV": { + "partyId": "7B84A4D5AF6639B42342F26FB3620C1D", + "ephemeralData": "0406AD0ADC7B5E1B4344B303E16FE395DB9F4E6DB57832887D3C556C10A9E539D07F646D51" + } + }, + { + "tcId": 1495, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D2FB941A1A23B0A5333E68E81502400D", + "z": "2E20D7C4073EE34C032BEC3080E45FA7C07AAB2FD1F81CA64DE2776E238AF7D8A33528518B", + "l": 1024, + "algorithmId": "F61D5671639603D3FE6626DB9264BE4D" + }, + "fixedInfoPartyU": { + "partyId": "E8EB482A93FEE65CF07AF177493452E7", + "ephemeralData": "2EF2B28655F803D898EE4924F3E5B5483176DCE9CAFCCF89DA398AD787CBEB72B544F1E411" + }, + "fixedInfoPartyV": { + "partyId": "0E5F60962E5D81B7EF1AEF7D49DF32EA" + } + }, + { + "tcId": 1496, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E8EEBA35F5B46BCC401A37BF61F16F6", + "z": "F10F3C416017298AF9EF743D82B2ABF58A93BABDEA43131437B5A5217B14CE0D49A58F9BDB", + "l": 1024, + "algorithmId": "205880AA17C0EF03CDE9543531018356" + }, + "fixedInfoPartyU": { + "partyId": "31E6751832A88D4CFD5A7B0B48E8D7B2", + "ephemeralData": "1F554D64E64314E0BCCCB036B451797E4BD1E6375204D8F5548EF7F01BDF980B22DDEFE6F4" + }, + "fixedInfoPartyV": { + "partyId": "FF3EC62DCF97F76F628AF0684FCB9013", + "ephemeralData": "E9D7B48743D61A8FFC183E44EFEF8DE2821AA63EE482A8EFA7B4DC3A22CC5BEC289D6C75B0" + } + }, + { + "tcId": 1497, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EFB1C8B90E65EC128E3EB9C7F8D949AD", + "z": "A7BFD0D07FC89E00144182CA5172F937881776F55F8C02C40A4E9DBA1BCF0BAABA50C0E20F", + "l": 1024, + "algorithmId": "815967A2E0C03191570E792D9558902C" + }, + "fixedInfoPartyU": { + "partyId": "52C3AED9E94E83EF1C0DDC093E02C708" + }, + "fixedInfoPartyV": { + "partyId": "42F43ACED41C1BBBC928F0FF4DE8D867", + "ephemeralData": "DE9657F4A659482148F0C04E74DAD60959D6F769E576DA513A5734466255EC5B7ED9742D57" + } + }, + { + "tcId": 1498, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BF66DF7E33353D3D7CF764942849678", + "z": "069E9BE412FA4069EE04960FECF638BC885294042DB56668645E10797336FFC2176AB5E5B6", + "l": 1024, + "algorithmId": "98A3BB83516F0868384C22576AE6BC6D" + }, + "fixedInfoPartyU": { + "partyId": "D9F2B67EEC6A737165CFCE4E97B68138" + }, + "fixedInfoPartyV": { + "partyId": "C8CD804B15380A47FB2B077DBEADF902", + "ephemeralData": "FC6EC1CF249DF3265096C4069B8B79BA47F0A1E16E214EB36F172B9C7B9068ED3ABBDD83F4" + } + }, + { + "tcId": 1499, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B487AD3FADC9D14ECEFCAB3644B1F607", + "z": "E277F6DDD341A78EEE6ACAD411F2B5501DA20A5F91C27D70ECECAEA68779D6CBDF5B259CBB", + "l": 1024, + "algorithmId": "82B00813B2915BEFE63CB73C19A20D9E" + }, + "fixedInfoPartyU": { + "partyId": "A2DF1C0654DDE210FD8FBD37203BA254", + "ephemeralData": "908B47EE9EC772E716ECF100F52693E681CEBC3CDF067A0E186CFFF88B6B000B4A32E66B96" + }, + "fixedInfoPartyV": { + "partyId": "23DF264D63D4F7908FC4ABB43A970AAF" + } + }, + { + "tcId": 1500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "944741A6AB0D5BC9B5D41CD1AFBBBAEF", + "z": "89045D91F289C6368227160378BFFA23B1700904C8FB4F3BF1FC522B1EEAF1FE4A0166CFF4", + "l": 1024, + "algorithmId": "1142EFD451253ACB6CE29083DFB84CDC" + }, + "fixedInfoPartyU": { + "partyId": "38A1E3120B8EC4D8C9A591D1C8F1C741", + "ephemeralData": "2E8DAD1B512452701B883EA0F65492DFA8173D86724BDD6009C965E767CAE74788A6D5D0E3" + }, + "fixedInfoPartyV": { + "partyId": "635C9FC0B064CE0040A969FE097FB8E3" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 61, + "testType": "AFT", + "tests": [ + { + "tcId": 1501, + "kdfParameter": { + "kdfType": "oneStep", + "t": "214BBB4F69DB6F6443558AF5534F1A87", + "z": "B1571758F62612FC1E52180EFEE2082396B89E5E5235007A37AAD0668BA1156F1B57", + "l": 1024, + "algorithmId": "4525BE2C7BD2A2D3A86001826062A7A2" + }, + "fixedInfoPartyU": { + "partyId": "3C11110E540FBDA87FB4FCA3104E1024", + "ephemeralData": "44E901EA10FD085055635327F2A84F4D2E83A962DFB4AA538F82C3570C583E4397B9" + }, + "fixedInfoPartyV": { + "partyId": "ABADDEF4D5606D204DF703CB72137F9E" + } + }, + { + "tcId": 1502, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63021600785500D65950F4215E26469A", + "z": "0BF02A2643ABF24C8F51125EAE895A7728A2B784BC8C7BF5E7BB323FED204695B223", + "l": 1024, + "algorithmId": "3F440830176EF24026BC01F223E9A107" + }, + "fixedInfoPartyU": { + "partyId": "9D7B1ACDD4FF3AA2F307AD1EFD727EF4" + }, + "fixedInfoPartyV": { + "partyId": "8BCBC078874CA090F5835374DAA79ED7", + "ephemeralData": "4B4933792A6CBB0C8D08EF2A8030488B4E6D0D7632C27C12230C9553CA0AA44406C7" + } + }, + { + "tcId": 1503, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F8547496DA74E3C2ED20FA128D8D1EF3", + "z": "E73872C69031C4DC88744AE1C282C0CF187BE7DEB123C8EDEFBC3FCC367F7262BC1D", + "l": 1024, + "algorithmId": "C621E0D8DCE08DE65C6AA6A89E769544" + }, + "fixedInfoPartyU": { + "partyId": "8D0510CA580C22D14D52BD47AE7D1BBE" + }, + "fixedInfoPartyV": { + "partyId": "8F7B292C0E075AF6FD18DB5B7694A47D", + "ephemeralData": "8EC890F9A43F4A6351B065406371A4CD4831A4BFCCBE1C3EBEF1346D12D0CD69C2F3" + } + }, + { + "tcId": 1504, + "kdfParameter": { + "kdfType": "oneStep", + "t": "736A19A5A969FB412297154BDF23C602", + "z": "D80DDACF263FB5FFD972FCE78E34DC408308CDF00891029B41CEA91170E9675ACBE8", + "l": 1024, + "algorithmId": "D2BFC40F774B78F474D0A9B041FB0911" + }, + "fixedInfoPartyU": { + "partyId": "9B0A399094790A1079B592E85769438F" + }, + "fixedInfoPartyV": { + "partyId": "F5C071A7695C7010F45EE4593E8DD921", + "ephemeralData": "D69FB89868105922D8630B5F35997F01AD86A3AAC649DD83DD7DBA27AD9AB163AD79" + } + }, + { + "tcId": 1505, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D9AD4ED3E04934211A269FF97C24B38", + "z": "F9EEA56C2DC6D110455708CF525FEF29C6CD66F64881462B01DAFF3727CDEF55FCF0", + "l": 1024, + "algorithmId": "94F4981F7C7789795A6CCB655356FA72" + }, + "fixedInfoPartyU": { + "partyId": "9D9DFA8F5C3EFEBDC21310C70443228B", + "ephemeralData": "BC283416B5FBC9D1959CDC18FEC823D4BD88578594AC39661788974C2D9D1EAAAB27" + }, + "fixedInfoPartyV": { + "partyId": "04B8691189ACF93E6CF6F4EDDB44F945", + "ephemeralData": "AEF7106784132F1EC05B2CDFCFAD138C4EF0103200D29C835B0881CE9328A87AC93C" + } + }, + { + "tcId": 1506, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A9EE2FFE366D13A63CE4FD75476BF30", + "z": "FEBEFFC1F193E6353CBC3DE7FEC23344C0D74D8F00B8C00ADD583E860A4220F9B509", + "l": 1024, + "algorithmId": "FF2265971C185CE1C0D5F9B7709F8B8C" + }, + "fixedInfoPartyU": { + "partyId": "18413AAA0D45F9FC383926BD026BE212" + }, + "fixedInfoPartyV": { + "partyId": "020A1C66ABA0D40563BCCD0B586B9D3E" + } + }, + { + "tcId": 1507, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CEE2C18A717AC66430CB66BD2B218F5", + "z": "AF57B34D7C328C6F40A3E5EDB1FD8184F662198A9841957687602F7D715A260A4F16", + "l": 1024, + "algorithmId": "60C8D5BC58EC45DF66244938D684B09C" + }, + "fixedInfoPartyU": { + "partyId": "FD21CE027740E472829B8306A2CB6C41" + }, + "fixedInfoPartyV": { + "partyId": "3EC239E3FDF10219822462653F6DA822", + "ephemeralData": "70397DAA8E85AA81EC1FA70ADC70EA0A2B38346AA03E2CA4093E7AE500F0C04D1E56" + } + }, + { + "tcId": 1508, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C74FCD72F12A00B8391803766CA79EEF", + "z": "9287639D95A109CD560080F23DD7C0E4F8B0C600EB910BCFDF2E01AC50ED23C35A42", + "l": 1024, + "algorithmId": "0F5DFA024D59D6301087CB0A86901883" + }, + "fixedInfoPartyU": { + "partyId": "6300CCA80C33973EA6F29F223937A80B" + }, + "fixedInfoPartyV": { + "partyId": "846C41985FA2839622426805EF8FE87A", + "ephemeralData": "A887C755A5464F1C8B16F43F05A2F77A22543E0800AEF44C5AFF30CD45D6778F58E0" + } + }, + { + "tcId": 1509, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F4CA296BED603823221FE9E13F54D18", + "z": "F088D4A99EB3A555EDFD206BAE7851C9A0E820AC4610DE66789DA31D2E50BAA1EDEE", + "l": 1024, + "algorithmId": "CA251F37A340D5763F5C89A8D8201E1F" + }, + "fixedInfoPartyU": { + "partyId": "B5573C22439725765230EA796A7D4AB4" + }, + "fixedInfoPartyV": { + "partyId": "5592CFFFEF77D862BD808140D7FBD8F6", + "ephemeralData": "02ED05557762B81117ADFDC974198CFBB2C8FD4D19CBB98846372520DF267DA26191" + } + }, + { + "tcId": 1510, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D19284AAF03DDF66C00CD981CF5DFCC", + "z": "4C6F68DEF9B2040E0975828A24D152B16B9EE308BAF6B9136D5B940E57D091AB1174", + "l": 1024, + "algorithmId": "DF7ADE1EA1B9889028A8B5E20575764F" + }, + "fixedInfoPartyU": { + "partyId": "20D43C7647B92AC160D1740EE8320D2D" + }, + "fixedInfoPartyV": { + "partyId": "49AB8F61E20948C71B28864F9BC676DF" + } + }, + { + "tcId": 1511, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6348672E0C5C0A229B71E29704DB688E", + "z": "1150988D4E05BEF7249B250783EA8C23177E80FED43332014DBC2D9B7C4979372359", + "l": 1024, + "algorithmId": "BDF530CE267499FFBC5B61C81ABF0D08" + }, + "fixedInfoPartyU": { + "partyId": "DB0B4D673EE14947ADCD11747BF9AACC" + }, + "fixedInfoPartyV": { + "partyId": "E168C06E27DC8525DD111BD678BB4316" + } + }, + { + "tcId": 1512, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F438ACE3E6DE2F6616E2C47FC954CC9", + "z": "B901D911F73B98AB5D32AFE196645BB6D74B63855C67877CC7B84AD8D6C34F25B164", + "l": 1024, + "algorithmId": "57339C1595284564DF36A87BA2BEA1DC" + }, + "fixedInfoPartyU": { + "partyId": "095D9AFAE6B07F444B73F394E4776431" + }, + "fixedInfoPartyV": { + "partyId": "85A3B6C00E402A661C75D0CD0AE8D4F6", + "ephemeralData": "4C610DC9833C33C92DC7019363AE19041A05323B11634BFF615219E7C24367EC202A" + } + }, + { + "tcId": 1513, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B2420C3D2A5295650E43ED7B3F6FB59", + "z": "DC168764A2B9AA3E1F3E7B537200960747B222E660A0B4505A12C7CC01BAFC19CBF0", + "l": 1024, + "algorithmId": "7B8570BD0A773BA828755ED3957022B9" + }, + "fixedInfoPartyU": { + "partyId": "8243F5B030ED7CA12E2F58C18857F21A" + }, + "fixedInfoPartyV": { + "partyId": "9DC8F56F0E21C39ABE9D777D9A8E197C" + } + }, + { + "tcId": 1514, + "kdfParameter": { + "kdfType": "oneStep", + "t": "156F5E3EC9FB69084E7E76E261302A03", + "z": "A74C049712D0122EDDFD105C7AE8C7AA6E9C950E6555A9BE4282CFDB804EE25FE9EA", + "l": 1024, + "algorithmId": "5FB42DDAEABCBB63D6DBCC7C362C7C87" + }, + "fixedInfoPartyU": { + "partyId": "655AA2F9D4B8A0DF604E8310D2CDF100", + "ephemeralData": "E56AB88BE42858BB9A8879275DCAC81D65AD5DBAAA70FEC85271E54F8D702CA8B4D0" + }, + "fixedInfoPartyV": { + "partyId": "76FEF56F6185319FEC7D638F7BA34FC7" + } + }, + { + "tcId": 1515, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDD67AD632362A392D4459822ABFD6A5", + "z": "D285A76D915D991EF80C16089ED73EEF09A176C56DFA884B7EED04CC2802519903C3", + "l": 1024, + "algorithmId": "F52A6C29CCAF5B2143C493C457255170" + }, + "fixedInfoPartyU": { + "partyId": "BF65CB32BC0E033DBA0A7CF3D9D22609", + "ephemeralData": "009D3452C5500805601C347316C8A49F632703A3115BA7320A094482FA2406978ACC" + }, + "fixedInfoPartyV": { + "partyId": "B96AF1E213D772E994502BE5CBED1CA0" + } + }, + { + "tcId": 1516, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7312F06630966DB833ECC21B006B6129", + "z": "4181033B1AD07659F3141494EB13D66A942E751C6F72BA9B21B0F8DF647172A9E655", + "l": 1024, + "algorithmId": "720BB6319EB494F4A14A67E3122700D6" + }, + "fixedInfoPartyU": { + "partyId": "215048C03126FA4F7382C500980C4A49", + "ephemeralData": "18AE251032E3EE9A9C9F54A5939668D226313898E69627680A7E5E945169603B86D2" + }, + "fixedInfoPartyV": { + "partyId": "F88E14B94C19BB823A78F9DFE0457D68", + "ephemeralData": "A3EA5F86E2523AE9105CF0D84651F21A7D7D7843F94B7BA6B6CDC1E7E03F6BB97E22" + } + }, + { + "tcId": 1517, + "kdfParameter": { + "kdfType": "oneStep", + "t": "840459EA7E294A609A18DB5D8CF11F44", + "z": "7109ACD5427A5A68398E104BFAD6366124B59AA3E8FE32FFE336D77E8B6A6115056D", + "l": 1024, + "algorithmId": "219A82E72EF60D06BFC1A3A4C9D4A7EB" + }, + "fixedInfoPartyU": { + "partyId": "8EA6789CE6DB79561AA0B9B7386DE2C1", + "ephemeralData": "79EBB3F09DA734D1A4BC96A86D7C2CC1268C29520EF35D242230D204BA72AECDF8C5" + }, + "fixedInfoPartyV": { + "partyId": "BD896B62BD7C96866668274FC33BB30F", + "ephemeralData": "8DEAAB6641FF1A11E616C499D7C9EE9EFE79717032932ACFE8CDF23750574C62E451" + } + }, + { + "tcId": 1518, + "kdfParameter": { + "kdfType": "oneStep", + "t": "136F553878D862C653FBC2FF7DCCEB79", + "z": "A8910CAEB42FE2246B285B9CA62320F53FA71DB6DD8847B863BB4E61BDAEE9944FDE", + "l": 1024, + "algorithmId": "7B9A60208CBC0161E72C0745EBBE231E" + }, + "fixedInfoPartyU": { + "partyId": "BAACE9CBB4099BC17E89BBCCB0CCD0AD" + }, + "fixedInfoPartyV": { + "partyId": "B5ACB5071E7F9843C038B338F04F5FF9", + "ephemeralData": "EBFE5DE6BA5F092388EF931D75B742ACB5E374363B9F745100E4A5973973F651E52F" + } + }, + { + "tcId": 1519, + "kdfParameter": { + "kdfType": "oneStep", + "t": "091658EF460F7A54FE073A9B521F2012", + "z": "3229066AA0ACD7F8DA4839764F9BC1E2D26DAC48C99783B21293BDB370D595EFAEFD", + "l": 1024, + "algorithmId": "203C6493533B405E5AE6BC524DD94F74" + }, + "fixedInfoPartyU": { + "partyId": "63328B67848888BF616CA24BA775E456", + "ephemeralData": "C649A46D73C3B1ED9039553F86C53763736559ABA7F310DC77FA4DB538AD6E55751D" + }, + "fixedInfoPartyV": { + "partyId": "2ADCE1CB518F2A515ABFACA8C3D4904D" + } + }, + { + "tcId": 1520, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDB199ABD4855748F5A34FF94A5B9E62", + "z": "5ADD8DE8B3B8DE5FEB57175FAFA26BCE0E5A616D8029C8AF2314139F5F001B102F54", + "l": 1024, + "algorithmId": "A9231BA262588F2693883E35A7E0FB66" + }, + "fixedInfoPartyU": { + "partyId": "24E9C7CBDBA0D53547FF03A9070A730E" + }, + "fixedInfoPartyV": { + "partyId": "EA223B615AC1FF15C4F9D0A45B46CA9D" + } + }, + { + "tcId": 1521, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A81A9F1D58118DC95C8ED39A823FB1CE", + "z": "F8EB0F4AE7C89ADBF1C7193F9464760CAE3C0C8D0DAA83A57D1ED37A9768012A370C", + "l": 1024, + "algorithmId": "79F67544A2A106AE6840DA27A54E55ED" + }, + "fixedInfoPartyU": { + "partyId": "05FFBBB20A2E1C646B363611F54A0C96", + "ephemeralData": "CCC39B203EBCEB2230F93FD69D46C28177B1979533360AE0BC773911F87743A4926F" + }, + "fixedInfoPartyV": { + "partyId": "7398E92D60557A9ABB39141EB5477CDB", + "ephemeralData": "3D4852380298E95C028B896D58FC4F19586A46459B387D26D5464A64BCD1D5427E44" + } + }, + { + "tcId": 1522, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9CB9756D6A450F0A264483A6BAB68A5", + "z": "88A866FB00276713A75C902771286E1B7941C3A31F005F9FC9F4B095AC92B42DDD1A", + "l": 1024, + "algorithmId": "B54ED21E553173FE51D6CBB70349C1D8" + }, + "fixedInfoPartyU": { + "partyId": "E0ACD0A105A97176FAD2F9229AA5413B" + }, + "fixedInfoPartyV": { + "partyId": "B738CDF4892E98EB579DB5A9815C7CDD" + } + }, + { + "tcId": 1523, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC8769F27E85F80C5A28DA922988CE48", + "z": "4C3AF7B20FBB433DF0C8C982763D4EC8B2CCD44EB4AB6DB067FF162BE7A69105BDCC", + "l": 1024, + "algorithmId": "ECA82A257C09C160A48D403C494BF1A3" + }, + "fixedInfoPartyU": { + "partyId": "B0AA57AFBB292B2A71A36146162467B0", + "ephemeralData": "5D0A99E6410D9F564BCBAB676CB6AFE6045E33B9B4EF5BE7A9B6C93C3B557F39A13F" + }, + "fixedInfoPartyV": { + "partyId": "8770773A16BBB7904DE82C5ACD005573" + } + }, + { + "tcId": 1524, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36E4151B898BFC94626869D373BEA461", + "z": "4293D7E966EFF749FCBEE1662C963D62DA210E7128CCD671EB9FE99277542563917D", + "l": 1024, + "algorithmId": "2AB7833F457977ED04EF7AF4DE5E264B" + }, + "fixedInfoPartyU": { + "partyId": "7C8B6B9691F8E7D3D512EAD5921FAEC7", + "ephemeralData": "FF726CDD652CE97E58C02B77048FEFC2608943990239F99A2D5867822A50A0A6B341" + }, + "fixedInfoPartyV": { + "partyId": "4D5FE59ADB77BD7D2B9D8377A1EC24A8" + } + }, + { + "tcId": 1525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72F4846E9E74674D4EE96D5AF02C1A20", + "z": "01A461EBD7F2B5C65F816B5306E44D639AB525548BB846E9539D2531DD62C72724A5", + "l": 1024, + "algorithmId": "787AF86CD07398E55976661D13AD6BD9" + }, + "fixedInfoPartyU": { + "partyId": "4E13C195A383065307E94316B3D1472B", + "ephemeralData": "EEA3A104CADEE84DB3DC641F8301540C60B7A18868C5337B170345BBD09E8DA620D4" + }, + "fixedInfoPartyV": { + "partyId": "01FA9E8DD46D2C126D16768C73FD4016" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 62, + "testType": "AFT", + "tests": [ + { + "tcId": 1526, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32716AC1C72276E329AE4BC632FDDE8D", + "z": "77169B22797651C75817177368CBD7893CC70BD6E040BFF91B2165D1982C", + "l": 1024, + "algorithmId": "73093A0D0A621918BD3E391205A3249D" + }, + "fixedInfoPartyU": { + "partyId": "A275E6F23EE47251A46874DE30A7ADFB", + "ephemeralData": "66D9320016266F145D976328E4C8A95DF8A8EE80D0D31A59F659FB4AEDA7" + }, + "fixedInfoPartyV": { + "partyId": "B5E8A40A154EB7A27BCBAE7B17D3DCE1", + "ephemeralData": "53811571424CDEAF7D901BA3EE6D4026F542D4DBD849CA3E4C012A948779" + } + }, + { + "tcId": 1527, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44219629EA11BBCD2202EA573077F966", + "z": "EEE99FEBBA469FF8EF58D4BA0EE517F6D0CCA1DEDBDCC35FD7BEA4913F6F", + "l": 1024, + "algorithmId": "B79C83C100E3708424D8FA5AB9DD4889" + }, + "fixedInfoPartyU": { + "partyId": "600B7B54B39A8EF9F7F282909E4FEDFB", + "ephemeralData": "9BA43A2B15ED25743F2E52F0E0EEDAC0EC035EF1467FEC4CDC1A05F9C4FD" + }, + "fixedInfoPartyV": { + "partyId": "99013B10B10311E0E9EFDAEE64E5937D", + "ephemeralData": "2E7D4EDF0004EAE5FD9F795DC9E44811B10517D450BD270E1B9B66D9D9A2" + } + }, + { + "tcId": 1528, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6AD30A0CD6ADC69DB1CAF1E7304DD5C", + "z": "2BF3308FFD404BD70E49E2C3784275E5F0979B45E525E46797CC3EDFB7A7", + "l": 1024, + "algorithmId": "5563EAF2A73E87695EF85E0CF9D95CFB" + }, + "fixedInfoPartyU": { + "partyId": "806A384D2076C488250B3B0087DA39BE" + }, + "fixedInfoPartyV": { + "partyId": "F03708CFFE94DF996DCA6C278BF5F779" + } + }, + { + "tcId": 1529, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8430D8D44F7B75A9403B4CC4373ACC90", + "z": "BEBBC4B4AD9CACB6E0A9D5E2AADA7A98660E2B2770F8348EAF03A62AAB74", + "l": 1024, + "algorithmId": "6BFA3AA52F58AAFF200D373A5EEED8F8" + }, + "fixedInfoPartyU": { + "partyId": "1024543E053EE0685310F9BAD479264B" + }, + "fixedInfoPartyV": { + "partyId": "79CAFA550A7DF594DA5AF62A7401DD43" + } + }, + { + "tcId": 1530, + "kdfParameter": { + "kdfType": "oneStep", + "t": "797DAB784178832F72911B94FCCEA636", + "z": "DC514034DCB36C6B21737FE141A1C0B13DFD57E97C6BFC7C4701CF491FD8", + "l": 1024, + "algorithmId": "CADF94D7A5317C38391DC9C4644E4588" + }, + "fixedInfoPartyU": { + "partyId": "39321891D12AEFC80F4BB8CCB8FE8DC1", + "ephemeralData": "90A155F1789275F97045595CBA8FAB3B12251BDCB4B706FECA369FB7D2F2" + }, + "fixedInfoPartyV": { + "partyId": "F36E0314B200C28A3C996D41677A3A53", + "ephemeralData": "5B9359992F5211CED0BEA1A2612764A9D8BD0D42D9812FE0D55D0126EEDC" + } + }, + { + "tcId": 1531, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AEC05775243A6B5E1FCC66FFF6C2785", + "z": "07163A35ABDFAE19E78B92FDF91BD7555F08CEB161FD20B1AC12EE0A9294", + "l": 1024, + "algorithmId": "7C9F7C5DAA06456DBC5A59E0EA8DDB74" + }, + "fixedInfoPartyU": { + "partyId": "2D150D024C75D869B171CB166C596844" + }, + "fixedInfoPartyV": { + "partyId": "0A7676670F5C79AC0E59077D366B5155", + "ephemeralData": "02A21551695DFF60C6D1AAE9E0D2B1990BE53F1C24906A668A499C75481D" + } + }, + { + "tcId": 1532, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BFBBE064EE657EC7933AD196A7455AB", + "z": "CEE592F98122DE2791A41326FA089DDA1F67BDD5C4AA4F21689C0F01C197", + "l": 1024, + "algorithmId": "14B191EAD454F0EE861CCBE9E5FA558C" + }, + "fixedInfoPartyU": { + "partyId": "75D755BF24344277A18F283CC8F4307F", + "ephemeralData": "D17FDFE383660EB1E39EC9A544DC6A8E6F1BEC229906E7E8980C46487CCC" + }, + "fixedInfoPartyV": { + "partyId": "B46C8E36E10B9773889D152C6FAD07D2", + "ephemeralData": "ACBCBD0DD054CC7842AC3F1BC7346709B488DF3ACBE973AC3110E2BAA5D3" + } + }, + { + "tcId": 1533, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CBC9C9DC22DF0BA5CA3154BEF3162CF", + "z": "895B9A30FAA73A92E6F7C72F43FBDCB5E85EDE363DC38C8CDCEDEEE262CA", + "l": 1024, + "algorithmId": "143FA619F71FD9CBBE4B888BEB574B4F" + }, + "fixedInfoPartyU": { + "partyId": "C5DF0D2CA5D6F22751C4B62CE21C2E20", + "ephemeralData": "BA51F13C1BA917FEBB7CC1071D3A31F1ABF246A8D0E445F46D5AC6503BD2" + }, + "fixedInfoPartyV": { + "partyId": "0A1CE6479D27C1C5C20A5F5EFDE25A84", + "ephemeralData": "74DF9946577726924DF5644D4B2AF303303F1D383C168103D7F0F173E446" + } + }, + { + "tcId": 1534, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73D7D96F127654B6C3E629BFAA6577F1", + "z": "E71D392AC132790A4AF4172178AE3EF8D54356A7E58B3B8560CE5D65921C", + "l": 1024, + "algorithmId": "62DD5360D697B5CFEAFA938DE18518A3" + }, + "fixedInfoPartyU": { + "partyId": "8F81DA1E2AF291947FEECEBA24DEF67B" + }, + "fixedInfoPartyV": { + "partyId": "1E4C350C2BEB87D17EBFB7F763375CE1", + "ephemeralData": "87530246E9A61F3E8384E5DD4940A2F7302CCA2590E32F50291B1E78B16A" + } + }, + { + "tcId": 1535, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DE50911193EECA6F6981D9140AB19C5", + "z": "9A77C689E93C7F2B77976B950D60D6434674227E0C89A897C81DDB25FAE1", + "l": 1024, + "algorithmId": "C5FDDE8C28EAB3B11FB3B5B22FE0D49D" + }, + "fixedInfoPartyU": { + "partyId": "759F85B60281FDA821B892475DCDA80D", + "ephemeralData": "C195EA98653F1DB1FF1754D5FFEF31D13F339FA6CF69F5797304B968A85F" + }, + "fixedInfoPartyV": { + "partyId": "8112C3DE67543509E10F1D2967C6E0A6" + } + }, + { + "tcId": 1536, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C9D7B39B4EF7279FCEDC99ADAC8A06B", + "z": "F3A49EA4D7FF7D25982886D79303DA739CBC52CA4E76BC71C5E75837019B", + "l": 1024, + "algorithmId": "F2BAC626EF180B0A7AA794101DD3EC46" + }, + "fixedInfoPartyU": { + "partyId": "9AFE4B630C2FA60A618F25549C6E8F41", + "ephemeralData": "351C573088A14B4D4820E43B0D8318D3211059B9DB025316A3A5B114FFDC" + }, + "fixedInfoPartyV": { + "partyId": "08D54A514858EB9B418F9EC797647ED9" + } + }, + { + "tcId": 1537, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F01F53E5A48265005B52D97931A6BE2", + "z": "238313A8341806DCDBB6CB0C34E106F507CB495B7EF49ED481E70ABE9DF7", + "l": 1024, + "algorithmId": "17A822F0CC920949C77DCB39F939CD34" + }, + "fixedInfoPartyU": { + "partyId": "6BD2199F7C96602F9E6353D533085389", + "ephemeralData": "3C3A34AC0443A3A232984107F5D11BC0D9B3F1B8C01CA935E80A78413048" + }, + "fixedInfoPartyV": { + "partyId": "ACAA93B98AD26A7FAA41E25FFAAC34C3", + "ephemeralData": "790E6E9C7627D9DE79B94484FCDF6E003C05359E8E16A02ACB24CD61D687" + } + }, + { + "tcId": 1538, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F53B1527C1D798B7C7BF00D848121E6", + "z": "8190BE7658EFC28323F9D69AF1C35DA715AF2E1EDF26C3D96917087A5D24", + "l": 1024, + "algorithmId": "1793FAE4B356614023FDAD3701D46BB2" + }, + "fixedInfoPartyU": { + "partyId": "4CD22E5EBD477DFF8A80868E470D8ED0" + }, + "fixedInfoPartyV": { + "partyId": "331BF3BF18B8DA01167D1761B8C0D276", + "ephemeralData": "4072C8AC8D3190766FC9CFEB008BA2F054C53B8E1CF238DD208668218F0E" + } + }, + { + "tcId": 1539, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA767187DE6FADA3B951FD3B8AFE01B1", + "z": "8601DAEBE752E63DABAF4C38D74A098C16E5AF4D43543F5003FC172AC719", + "l": 1024, + "algorithmId": "D6057263CE6E87E0F16470888FA1A4E4" + }, + "fixedInfoPartyU": { + "partyId": "A2AFF836BEB0ADD9EE479BB4C3106E6A" + }, + "fixedInfoPartyV": { + "partyId": "3D761814C4438A6EFA2A39B09465218D", + "ephemeralData": "C42A041146C8E534B9F19CB85E13B0374575F09B8AFD5BC1F061219FDFD9" + } + }, + { + "tcId": 1540, + "kdfParameter": { + "kdfType": "oneStep", + "t": "805C9B8ED4E1D8463041BAD7E614BB3A", + "z": "24CFFB092383A1121D4699AD79C8911053842AEE4A53F46B5B9407BAF787", + "l": 1024, + "algorithmId": "143C75A977372062D5F9B0D44F54C45B" + }, + "fixedInfoPartyU": { + "partyId": "16CC8D931F4FDF8034BAB2EFB7C4C647" + }, + "fixedInfoPartyV": { + "partyId": "247051718419E46939C3ED150B4FC8F3" + } + }, + { + "tcId": 1541, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B45C766ADDFC8FAD77A0B74EAE6B627D", + "z": "F9821C9509491B24A64C7BB7B235D7C3512B37D4BB5C119B635C95A445F1", + "l": 1024, + "algorithmId": "AF13B47C134F3A4563D67FAB4381E9D2" + }, + "fixedInfoPartyU": { + "partyId": "69E2925259C71A537D1036219ADECFF8" + }, + "fixedInfoPartyV": { + "partyId": "8E7FCD534C88214B67E0BFB7A725CC5B", + "ephemeralData": "00318814D533FD1041525D4F3ABCE0389153F2B49C5FB8C68C30905804C2" + } + }, + { + "tcId": 1542, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7ACE4A037C95B7A78A5EFE26DE432398", + "z": "4AE72F517F533BD48B410806E2F608653388F1A3218EBF3AE0ECD9838FEF", + "l": 1024, + "algorithmId": "E27526FFB52CAB0A67C77DE6F909B239" + }, + "fixedInfoPartyU": { + "partyId": "6D5B045083E8B8F69CA26FC5B1DCBF63" + }, + "fixedInfoPartyV": { + "partyId": "D70B8E6D8548BA6439C64421858D5274", + "ephemeralData": "881659B46178167B42C55ADDDD7CE6DFD03BBE1F4EEB5A65F56DD614E4BD" + } + }, + { + "tcId": 1543, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA6A6F2DB2D7E2365AEB6923C0EBE162", + "z": "8F83ACF544B2F187EC0ABBEFB41A83F2C8D4A7483504C4A63F76AF814374", + "l": 1024, + "algorithmId": "F20580946E3EAF8A64425A8E2C9E9D5A" + }, + "fixedInfoPartyU": { + "partyId": "4320EDBB263B237C56FE50F953451B36", + "ephemeralData": "30E480CB38C485A2CF81622DFE7541FA4932FD90BC88DFAE80799853EF6D" + }, + "fixedInfoPartyV": { + "partyId": "586E947174979BBDF730BC87BE6ED099", + "ephemeralData": "5E0DCA91407D103DC2738FC02257FB2DB440D3CE4D9E04E1F3EF46E541D9" + } + }, + { + "tcId": 1544, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FAE4B29FF230C9CD42B721D303C6DC0", + "z": "DE9847D4A6D23048DCB2B4DB12D4E83AC522BD3C231B089F7F44DFEDE0C0", + "l": 1024, + "algorithmId": "79CD6372160E9F5790DDBC53707BFEA3" + }, + "fixedInfoPartyU": { + "partyId": "6D36FA1433CD4135EE769255EEF10B66" + }, + "fixedInfoPartyV": { + "partyId": "7057AA9D0CBD97E46DF96F162B3AD1D6", + "ephemeralData": "97E1B9FA7081F79C50B25D75FDF364FA4EC77EE699DDE572A87033CC30BC" + } + }, + { + "tcId": 1545, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8826110EF7221CDB62A53E77774390D5", + "z": "F4746042339B058AF5440A79D589AFD6C7C38AC2998CA23EA554E7CD7F0F", + "l": 1024, + "algorithmId": "C19F25967CDC20CAD7EB977D1E954143" + }, + "fixedInfoPartyU": { + "partyId": "1A7BDDEAA0512F6CB858176C53FAB8C9" + }, + "fixedInfoPartyV": { + "partyId": "2DDD62214BC7F41A441B98386D734614" + } + }, + { + "tcId": 1546, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4945DEF0C200751F7ECD7CCA49CAC95", + "z": "592F25896C2AC44131ADD34E18E0F5B388D86378EA1963EC1B5408184AFC", + "l": 1024, + "algorithmId": "0913D9D44170A1076A654F2CDB64179C" + }, + "fixedInfoPartyU": { + "partyId": "895FE28B38BF79B50AC18945AC0CAA7B", + "ephemeralData": "A67514D463D63429432C56CD6EC033C791E7DD5308CA16C00FD62B2A53C9" + }, + "fixedInfoPartyV": { + "partyId": "2C6D817A954C9BA42E04D1C04DA1655F", + "ephemeralData": "C8960A32CA922EF5D19A3CEEA924A1AC3B7355F62986F3329173CB04F8E8" + } + }, + { + "tcId": 1547, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C71EE7939A9E8C46669CAC1CAD0CB53", + "z": "7FEBAEBECA9B75FCF22226E440A8828B35FBAD0E235A7647BF6377540FEE", + "l": 1024, + "algorithmId": "387E687C18F737BCBCB994968330053F" + }, + "fixedInfoPartyU": { + "partyId": "BCBB9D6F598394D507146C29DBC5CD42" + }, + "fixedInfoPartyV": { + "partyId": "8B980099DBDF12FCF94B0A3890265C8E" + } + }, + { + "tcId": 1548, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7C831B35D855A6EC73E4C2302AA10D5", + "z": "A069262386E5CDD54BCC449CD1ACD4E86FA0DAC27E2CEF4BCAD2D6F88B14", + "l": 1024, + "algorithmId": "6AB24A9553A75C2542FDEF80924D2419" + }, + "fixedInfoPartyU": { + "partyId": "6489A4D5BBC40A98DB510A3E0093F48E", + "ephemeralData": "75107F9239D182DD30A047CEEF8B8525A74CF02BB5C9DA8394E1B0B171FF" + }, + "fixedInfoPartyV": { + "partyId": "EA265475250F5FADEFB8B4245E814331" + } + }, + { + "tcId": 1549, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20379096FB039A1BDEC994BEB82832C1", + "z": "2CF60A7EADB45FDD45131B80DEAD3763941AA19BBAA996DCEAC7F6F5C887", + "l": 1024, + "algorithmId": "1E48E39E68E333D8C727F9A49A8B7EF4" + }, + "fixedInfoPartyU": { + "partyId": "28F8030F9256D75751EED5E1C3FB4731", + "ephemeralData": "3680C4A8865B498DB357A554897D9FD26B1A4196EB420D1C10B74DCB3686" + }, + "fixedInfoPartyV": { + "partyId": "1058EA9EB6DF3779DE2AD3F8E98C66DA", + "ephemeralData": "14A0C51D109F74FE7331B52F100C8C576830F182A8D26C82A47991F3846C" + } + }, + { + "tcId": 1550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B6F3E65557D25CDBC3716C55E531EF7", + "z": "388D5D1097BF56F79CCBCBFA71BF968D4FCB038FC8613D31D96F27182AF4", + "l": 1024, + "algorithmId": "6EB6386FBAB0D2DC268E0A83DD53F76D" + }, + "fixedInfoPartyU": { + "partyId": "3387FDFC16ED1EFE8F2044C664639DC1", + "ephemeralData": "9FB5DEDC723075488966A0F20629B0D3C9D867C133577FA443F496E7987D" + }, + "fixedInfoPartyV": { + "partyId": "275E106FE5BF59CDA2A5C592A58BCEFA", + "ephemeralData": "1981E09839860B0E3632DBF239B7C9C6678165724FF48B9395F6D3651955" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 63, + "testType": "AFT", + "tests": [ + { + "tcId": 1551, + "kdfParameter": { + "kdfType": "oneStep", + "t": "700F9F45A7C3FCA4FB9DF6DF342DA8A9", + "z": "088A092B635B36CF8542C237607E484C8B3657A3C21078859C4B412FE6D43019440168", + "l": 1024, + "algorithmId": "83A2521270FA18CAA902F9CB293E602D" + }, + "fixedInfoPartyU": { + "partyId": "4F1F399383185994F3FEC1D552890D10", + "ephemeralData": "17540B1695F2BFAADECB8A498AB5E3CE96B208ED7B71E7E5F9174EED560DA1E928C314" + }, + "fixedInfoPartyV": { + "partyId": "8A959DE7AD0E04A9876432006F1E6146", + "ephemeralData": "8C0D67290CF61E7C45E12E7E9B9642EA8B355A93D9E3825C2EAC2ED55EDE385E2C8189" + } + }, + { + "tcId": 1552, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0768AE8163B7A6CA958B0C9203CCF08D", + "z": "208A2C2EA45B13C515AB02738E49C0EAE5A01F4649A5026DB0B173696A6471CA61B41A", + "l": 1024, + "algorithmId": "3FD7A2E43A9294DC25BFCB6CDF408D7F" + }, + "fixedInfoPartyU": { + "partyId": "44705D25921D5BE08F638628CD0D402F" + }, + "fixedInfoPartyV": { + "partyId": "7841820C1755A44FC6C7EE25D0467EC8", + "ephemeralData": "449F1ADCD8D3780EE1D80645520A4F44AE65C416A368F018E517AEB95D63BDD3110519" + } + }, + { + "tcId": 1553, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA4677600C2D3855E1A5B80A25D19784", + "z": "1E30A4E7FDE2155356D82B4D364859B83F81E57E8E37963D08AF8C038A925BBFA75C75", + "l": 1024, + "algorithmId": "26D5688894EAEB5F5EEE438CACB9D105" + }, + "fixedInfoPartyU": { + "partyId": "27AFAA1D4B68AF5A98CD0DF2CB15C12B" + }, + "fixedInfoPartyV": { + "partyId": "669820B1AAED363B839459262D608E38", + "ephemeralData": "4704E4CF8EA8EDDFD6B647806704F1CF16AF1FBB65A8398CC39EDBAF8BAB4DB6D0BC63" + } + }, + { + "tcId": 1554, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB5B9D5F6E3CA8FB1961129DB7A20A01", + "z": "C40FC1A524F3BCC02398B314419F8066AD73F36D47886896AB12C7631366E75AED175A", + "l": 1024, + "algorithmId": "042496931EFB1D438361F8691EB21527" + }, + "fixedInfoPartyU": { + "partyId": "7ACE6172B1CA678BEF3EF79A1CC9A97B", + "ephemeralData": "B63978ED5FB0E7E9ADB6B0426E13572AC3CBC458D405EDD4A752434EA7D8D5BA6AF5EF" + }, + "fixedInfoPartyV": { + "partyId": "AE58F5629E1B96A557CD22D1A60AA5CC", + "ephemeralData": "E2C9028FF34B1894ABC9BB8908F224B9B3084FB45BBAF29267BE2A1F0A2886DC93500A" + } + }, + { + "tcId": 1555, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B89BB7A376F429CCD7183ED6FE78453", + "z": "F8D30A120CE44C71AD682DE05F7B3FCF215B0B5C0410892055D765877C2BDBE02EECE6", + "l": 1024, + "algorithmId": "CA0402A8DF2F94CE871CBBB449359F63" + }, + "fixedInfoPartyU": { + "partyId": "2C123D8B44512D15095F0727EF23D3BB", + "ephemeralData": "78EDB839342223DBB24971DFC8F96CE7884817B51542CB803B0A7D72B34E8D6A1CB99A" + }, + "fixedInfoPartyV": { + "partyId": "738F3CEA4A8923FCAA7C70852E8DB750" + } + }, + { + "tcId": 1556, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D3C555241D30EEDC4DE56483EFE69EF5", + "z": "09AC4079D3C30FE38A7129BF43C3F38BCBE9159AA99824337E55B7B4E909CCBF8A4867", + "l": 1024, + "algorithmId": "C66EEE17707F05CEF8E140D167BE0E23" + }, + "fixedInfoPartyU": { + "partyId": "0895444428B1E52D3831B5ECFAAF64CF", + "ephemeralData": "EE98BB7A9E464878DA158AC1D6DEEE6635D98E78F30581F3A4057E5B95CA05A4E03A8A" + }, + "fixedInfoPartyV": { + "partyId": "B5B0BEDFAC448CAF6E9E199ACA65CB05", + "ephemeralData": "19339098B9FB694534266F4F4C9B0F29ACED17E9382A6738121DEFEF191F63AC4CA160" + } + }, + { + "tcId": 1557, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6542B6D2DBFBF905AED29E05B1FA0B66", + "z": "16012F852BC8CC4B348FF1782A216B968E00432E7ABFFDBC3EE36B0DD6B53C30752570", + "l": 1024, + "algorithmId": "4FBDC4E38766713CFDA3C7453A3DC416" + }, + "fixedInfoPartyU": { + "partyId": "97CD7F45B116602246EC35B1138D4EBE" + }, + "fixedInfoPartyV": { + "partyId": "FB8DB9B7A2418A80AD3FFDFA4EFAAC28", + "ephemeralData": "C39CB588A66AA3AAAA30654D50C4C807825C5830FFCCEEDDDB1807DA7E61DDEDB6E0BB" + } + }, + { + "tcId": 1558, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACBAA1DC834AC3E4113691329A15C2B5", + "z": "7B55D76BF4E5E04BAFBA4F9D0196208547067975456482411636AFD59393A144FC2979", + "l": 1024, + "algorithmId": "16672F5FF501910DD1692B0F94CB862E" + }, + "fixedInfoPartyU": { + "partyId": "0AD47E7F8FF57AFBEA402E2274223335" + }, + "fixedInfoPartyV": { + "partyId": "2C6AAA41CAF448E3E7F45F28E28B3459", + "ephemeralData": "6F96628AD0BA1F4BE63E8D2DD40D98C9A2111EDA0BCD2F2B5A2205ACE056259156420F" + } + }, + { + "tcId": 1559, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C410C5EFE697B7E7D2EB0F09F68EA28", + "z": "E61C1AFACD5A0ECB8E2EAF789876F0C938FD6E850C9A3180D7508D68892E1242256244", + "l": 1024, + "algorithmId": "7AA7F5352B285C062B5977470CABDD29" + }, + "fixedInfoPartyU": { + "partyId": "8FE36EE44BADD99F120061FA6865D0D2" + }, + "fixedInfoPartyV": { + "partyId": "1565DC83325ABD9FE492ACCACD1B77D3", + "ephemeralData": "33303547FD1CE0A5A45A84D223081900A3276DCB2A5DAAE2019EF864F0683E9509B53A" + } + }, + { + "tcId": 1560, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5FD9572B65A3248BE17072AFE9DB72AA", + "z": "55C05CA953EC3029FC827020628B5E71781FE2CD93BD40DFC14C5FF275CC7A50561819", + "l": 1024, + "algorithmId": "C6CBA7246F2035007F52D34D8863E093" + }, + "fixedInfoPartyU": { + "partyId": "83D590CEA191B16289E8FCDD4C7B510B" + }, + "fixedInfoPartyV": { + "partyId": "7F8217F972C14CD0F7E035B58E0068DE", + "ephemeralData": "0966210E99681626AF0C549B1B56C7BFF4CA46685A982EE1DE6E000175749BD2667C87" + } + }, + { + "tcId": 1561, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C186D78EB937F03F8A55D1337D8C812", + "z": "317C0CB44C40905384B97F646E9380CC7DD76627D0C718AD3AB9E6656B8A9EDAFECBA6", + "l": 1024, + "algorithmId": "96260132D8E92422C42C23D287B225C1" + }, + "fixedInfoPartyU": { + "partyId": "856CAE3BE0F8225951735D87F84C0266", + "ephemeralData": "C5ABBA24A449D9874115420C6FF5DE1A246A969BA0866DA5D41705E45A9A5C12EC4BEF" + }, + "fixedInfoPartyV": { + "partyId": "A444579CECAB9F458214F1680A1F90C0" + } + }, + { + "tcId": 1562, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9AF3CE5A03C9A1B2D8F5259E8EB91FE", + "z": "BA141A0FA679240DA640D60283044600CB3F53D7C404D6BE9215A083D8C2EA47BC5F66", + "l": 1024, + "algorithmId": "D12F30B620BEC94B8B1961A7C16E6655" + }, + "fixedInfoPartyU": { + "partyId": "4D65D61756D1BF434867B83BE6E87357" + }, + "fixedInfoPartyV": { + "partyId": "C2A4826E265ECB1CAA70BADB6263AE71", + "ephemeralData": "69CD942C3CD42109ED1F3C78B97C58B16B9E002BBF368EE9054340BBDE478F586A646C" + } + }, + { + "tcId": 1563, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41693FEDB4CDB31407AAC092AB06C82A", + "z": "8BEC1AD4ECFFC2BC7F883A1B3AE0551512018BB6EEE2B5BCA3D6F06FFA76588060D5FC", + "l": 1024, + "algorithmId": "1DDEA02B872E8314D9B3906F9490E4DB" + }, + "fixedInfoPartyU": { + "partyId": "2817C43152ED1DBBBA96CDB3C55D3F56", + "ephemeralData": "A601D6ABF74D364CFD7F26BE475E3C2E769857C9A2CEEAF1AD3DF6CF46459A1BEC542D" + }, + "fixedInfoPartyV": { + "partyId": "DA884B4ED1C8E98FBDF517FABB6FFFC5" + } + }, + { + "tcId": 1564, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54410FBB2219CA41D1A50403321661D1", + "z": "8C670CCA2A0939165F989559AF7B2B5DAEE8DBD5F3AD4EC74CF7224281EDA4704FAFD7", + "l": 1024, + "algorithmId": "1B70E86263BC4DD9E52C53E0A16A3B5D" + }, + "fixedInfoPartyU": { + "partyId": "4644D79483DEB70C0FD4E0E4770098B3" + }, + "fixedInfoPartyV": { + "partyId": "E6BA82CD18086A8D0BDAF6005B28E460", + "ephemeralData": "97739C23343FF7CB75576B25A2B3303F276957C3F53ECB15B6A2A26B577DC971DB3C3F" + } + }, + { + "tcId": 1565, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F66E0E86B8FFBA641F431AE4E2DD51A0", + "z": "21FFA5B5074F2E3BAC26FCE6FD8B1E18232A8AA93AA2DBCDF95EE652E16AF80A984999", + "l": 1024, + "algorithmId": "70C7490ABBF613C38E082DF510464001" + }, + "fixedInfoPartyU": { + "partyId": "2E557FC143762186FB8B703577BCB0C0", + "ephemeralData": "C9AB20D9BBEAE286C5768F93A8EDB3CDF87981DC2843579623A5BED10DB14C0ED855EB" + }, + "fixedInfoPartyV": { + "partyId": "40674DDD2E6567CA77A5AFFF7412274F", + "ephemeralData": "7CB6AA7B39E748292CDD750E1EF9056EB4D97AAB754AEAD3EF86ECD57F44ADFEA8615C" + } + }, + { + "tcId": 1566, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42ECB9D153C742E85F1DDFE1867AEA73", + "z": "07C49D4E4158A129455B40DFBA8211DA6E85DB291225AE4787EBC626E9C68A271750ED", + "l": 1024, + "algorithmId": "41BEAF55F507890812AC696C2EBA5DBE" + }, + "fixedInfoPartyU": { + "partyId": "789D30C3B0D557F6C05300ADB6979704", + "ephemeralData": "03F5DF03F882AA6A87C4C2BDD9C0CF44910D1DEAAA38A96D85C0802FE738956A31124B" + }, + "fixedInfoPartyV": { + "partyId": "A5C62A1F4C53CD402D87AF5F6F9D938A" + } + }, + { + "tcId": 1567, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DE1B6854826F9FA5677049C009C48E7", + "z": "E8A7C136BC91E6400D51875A02A306A1041C2B291D7260757C2D4EB443FB9240055DBB", + "l": 1024, + "algorithmId": "D1CD253AA4C5A3ED41D90D3908A8FE5E" + }, + "fixedInfoPartyU": { + "partyId": "1CFDDC88F501876EB2E804EB3F8D1FDD" + }, + "fixedInfoPartyV": { + "partyId": "B9B34571BCCD02EE40B8AB5A171740B2", + "ephemeralData": "9BFE3C4E41FDF51A01FDFED47482D09080845374E964855C85D293F01E9C18DD9E0940" + } + }, + { + "tcId": 1568, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AEE20B000A0F60E22B315CCD8C629A8", + "z": "BC40083FBA21298FB7AEFCA9A7A84C9A3607C45A6A66C426C9FDA51620FAC439D9F1BD", + "l": 1024, + "algorithmId": "608FDA9E7A4BF6606A21C985C6D0B0BE" + }, + "fixedInfoPartyU": { + "partyId": "3B458BA75D8C4BCE33AF08AD9B5601AD", + "ephemeralData": "5411E5E30310506F5DD9759D91886B6E59BDA9831E8A4384ED9142153C304914BD54EA" + }, + "fixedInfoPartyV": { + "partyId": "FDDA6EC18BAFC1776A8519D064A882B4" + } + }, + { + "tcId": 1569, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E62DFAD755A2E25E3C464EF6E03202D", + "z": "E93C8127C45DEA7A952A2B03296D943913AAA355041D238C2219335877FD3F2F688CD1", + "l": 1024, + "algorithmId": "4F53D95CBB7AE30672D245A9BA0EF067" + }, + "fixedInfoPartyU": { + "partyId": "D1052907C03841D53BAAA92F0F2470D0", + "ephemeralData": "5BC08BE4508D6AF2C15332EA90E49A7FE43334E60AFB54D56EFC681404656263A928CB" + }, + "fixedInfoPartyV": { + "partyId": "D3DA2E4681653CACC7FA200A6D859358" + } + }, + { + "tcId": 1570, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D4BEBBFAAF70E37B1D1672CA5990846", + "z": "110C0EDB56BB6D059BF84C3792CBE75B07D604E3022D356A881AE9D82379B5ABD79F6E", + "l": 1024, + "algorithmId": "BA3326777F7959C615656514D3A91E9E" + }, + "fixedInfoPartyU": { + "partyId": "A5140C097C67DE11BBC0E4CC05874FD8", + "ephemeralData": "F76D1559F9917BE559810F27763AD17C942A1C285BADC42E6B1DDEBD5FA00CA385F0E3" + }, + "fixedInfoPartyV": { + "partyId": "ED530B304D8D55C6EE4728AECB6E861E", + "ephemeralData": "D917A427DA283381D1B04C8954E55EAEA23DB6561811244C4179468B935E79A917287F" + } + }, + { + "tcId": 1571, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9AEFFB2D4936C8A12E1ADAAA8C2491C", + "z": "410F7B67CBCD72D14CB194E8ED39F6B05491E3C6176D954C9675C2F311F0BA6F034504", + "l": 1024, + "algorithmId": "EF13D53945C829667EA1063DD7C37696" + }, + "fixedInfoPartyU": { + "partyId": "F0CD541C7D941634E5CE382B34A4D2F3" + }, + "fixedInfoPartyV": { + "partyId": "85D12FA9F5813FA308DA1A58CAC3FDAB" + } + }, + { + "tcId": 1572, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C50944D4C71C4483A77DECF347BBF5E", + "z": "3ECD5C6D4E929EDD21F2FCF477E52292E6380696ED69BDEAD190C6A15714DFF517A05B", + "l": 1024, + "algorithmId": "D59286A999DAAC029BDF0FA2692C73D3" + }, + "fixedInfoPartyU": { + "partyId": "46DAD7DE7C8C0D3E6EDA674AF69C6E09" + }, + "fixedInfoPartyV": { + "partyId": "EF8E6341330379F2ECF9222875EABEAD" + } + }, + { + "tcId": 1573, + "kdfParameter": { + "kdfType": "oneStep", + "t": "578B6A96568B9C3308A14AB0DB958B0C", + "z": "ABB31B9453FAC671F4DE13957D5A571EA7D9C24658EF4F01673BF4D198736E5533A1BC", + "l": 1024, + "algorithmId": "73F69B43680AA6FEE951510D27E7B5E0" + }, + "fixedInfoPartyU": { + "partyId": "93444443B8A0E374E7C3F39905A168A2" + }, + "fixedInfoPartyV": { + "partyId": "9CE5D3E8F90A277E90429D2362FF6CC2", + "ephemeralData": "8D001CBA0F8CEDB9CC1B755ECA7E49B3AED19667812CB02572B20972932B0DD421DEB6" + } + }, + { + "tcId": 1574, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C66084F38E813E52B2E21B3A84E52190", + "z": "B6A9B7AE7DD194B1EF31E076DBEF776D61B0C26EDC2A5934D9E5E1B2C3A6A4F3BCD9A6", + "l": 1024, + "algorithmId": "12B430F85C701832706015EF42E4C291" + }, + "fixedInfoPartyU": { + "partyId": "CB13612858AD4154A2325EE96DC0741F" + }, + "fixedInfoPartyV": { + "partyId": "AF7C2B68101E12B7731346FDB64EF223", + "ephemeralData": "A3B4A83016EC92134B32FAAC2E21FF5AC48A3B05804FC6D83234864D450F774302FABD" + } + }, + { + "tcId": 1575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7164CE362CE52F73DDE6D61AD1CB4D1D", + "z": "FB2DA545B278A5E5C1351E447EEA3210388A809BC77C8D55D246CF3EB840AE5AB1019F", + "l": 1024, + "algorithmId": "24DFE87B9A9F0A14E8A58B143513041A" + }, + "fixedInfoPartyU": { + "partyId": "AC4967F64F9004D4028D94DC76853679" + }, + "fixedInfoPartyV": { + "partyId": "60B08D945698D37E783B6D82B53F5496", + "ephemeralData": "1974EFE07740ABF4C15DFE49C9F645ED51AF05CB5C7ECBE68D3FAAE7A47B5C13FB654E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 64, + "testType": "AFT", + "tests": [ + { + "tcId": 1576, + "kdfParameter": { + "kdfType": "oneStep", + "t": "165830F457308D8A3384C9F549E3869F", + "z": "29A291F4924A7AFF39537DAE432D3CBEDB49EC6E2D0027DA67F1B083", + "l": 1024, + "algorithmId": "56F53DCA1C4020DDD67530B72DC4795C" + }, + "fixedInfoPartyU": { + "partyId": "08DBB685777B8D4B19982AC7ADE11EFF" + }, + "fixedInfoPartyV": { + "partyId": "8549725E6609171EDC76A9ED5F4E75A8", + "ephemeralData": "8F13A8D06A7412CA531B4C11429E48B3DB0220F713A393139C0B4F2D" + } + }, + { + "tcId": 1577, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2677DF058F82B849F5F4E5D3ABD08F47", + "z": "D959BA63350197AE8A9B992550E2218F12EDDEA28A52F91A8A6FEA2C", + "l": 1024, + "algorithmId": "B50F8C487AD2F390AFB4F792A2AF571B" + }, + "fixedInfoPartyU": { + "partyId": "F509453C4D9A841C5D4EAB7CB1AA2575", + "ephemeralData": "FFA03484D3E3953C347D1578A0602739E99578EC446C6931D62766E1" + }, + "fixedInfoPartyV": { + "partyId": "33906C3DBB43033154813D0C8D694D4D", + "ephemeralData": "D1756F0BA6FBDD070E9EF66DC9FD5254824CBBC08B2FC4AD3A5CE374" + } + }, + { + "tcId": 1578, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A89EB254F115D13AA8758A481B13BF8", + "z": "1B697C9CC2449A6AC222332C67493B1FCF504B957FAFE1D72472329A", + "l": 1024, + "algorithmId": "720B5EC6FD424445C7CC0D787C26241A" + }, + "fixedInfoPartyU": { + "partyId": "58EC318B179BE7EC9463F8BB59A17CFB", + "ephemeralData": "97457BB5D82614F6A9198494775B87B0EDFFDFC6C9F223A913D78BB8" + }, + "fixedInfoPartyV": { + "partyId": "18F490AF58510792F1E4BAECAE38370B", + "ephemeralData": "328CE56AA2F50150A78FBD5ADD2E5DFE64A310AED3ADF79F405F3BA6" + } + }, + { + "tcId": 1579, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D39C43B17A60CF49B910EB05237F91C3", + "z": "3AADC70CF03825D3A73F7FD97DA14C762E80916C584F73C628BFFB34", + "l": 1024, + "algorithmId": "1910DE613E123ED86AE3C009F7801CDB" + }, + "fixedInfoPartyU": { + "partyId": "73B726424F53E81E65093FA194B9685F", + "ephemeralData": "2BF05F3B43368DEBD803F914C6FE1CCFC30FFFF50332A1E22DFC43E1" + }, + "fixedInfoPartyV": { + "partyId": "3FAC9087C77D0CB0842A84C46DAC65F0" + } + }, + { + "tcId": 1580, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9332EBDCEBE795E517501EFC8FA51C4", + "z": "B4907098CF41524DD892E2B93EC9CA8FBB4E4F363D6E12A2FAE2F805", + "l": 1024, + "algorithmId": "E2332FF80FD53863F4B73D2EEFC10DD1" + }, + "fixedInfoPartyU": { + "partyId": "9F91BDE3B140384D00091B043536E87E", + "ephemeralData": "A280F0C9C074B619194EBEBA82316212B7B36B5A9CDB1580B094C1B9" + }, + "fixedInfoPartyV": { + "partyId": "AFAA985BD2FE03FCAFDE1CA1C090F5E0" + } + }, + { + "tcId": 1581, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3ADD958C9951B79EAF1407A6526182E4", + "z": "4B363299E613AFA99A8131FBD874B4C4E008CE717F3C3836944CF00B", + "l": 1024, + "algorithmId": "7AA4FB91AFF7ED028AF91E02D4E2ADED" + }, + "fixedInfoPartyU": { + "partyId": "D8E1E146AC4310AFA0A3BD0F6CFD60CC" + }, + "fixedInfoPartyV": { + "partyId": "0103FA66DC5C9042145B9D7843EAEA33" + } + }, + { + "tcId": 1582, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83F0C0C368CD0FD0A5981D05C8971C36", + "z": "BF886E5D8DFD246E3840708E5380A9058D6C67B201E36FEA576FC8CC", + "l": 1024, + "algorithmId": "F229BE9603F73B08B1DAF9CF5813F6AA" + }, + "fixedInfoPartyU": { + "partyId": "9D169539C707D14FCD37744B48EE722C" + }, + "fixedInfoPartyV": { + "partyId": "E67CFAE1CBA715B77F52DA7A8F269F0A", + "ephemeralData": "905F93C89B98B23061CE53DC5F0DD8FF7969BC04B2719042247940D5" + } + }, + { + "tcId": 1583, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AEDD0EF136DF23F0A05041614F85E568", + "z": "D0F674353D9AD7385BCECBE7957D096889A3CCE4C31D13EF5CD7D8AD", + "l": 1024, + "algorithmId": "AE379F43EA745C9C811C11F3E714867F" + }, + "fixedInfoPartyU": { + "partyId": "956BC2C754BFDBC76B3CC57F8D8FE532" + }, + "fixedInfoPartyV": { + "partyId": "1C7B279A3DD5768140254F49A5E637C7", + "ephemeralData": "674FFD4D6A96E82A103C6E9F056C7694790B0CCD12CCA20A153CFE90" + } + }, + { + "tcId": 1584, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C7B5FEF0FB46C201889FD82C710E07E", + "z": "2D77DF6916547C4DB041CE513F7001E700D2408F0F3193655A2A0CA3", + "l": 1024, + "algorithmId": "EA5D4FEDDBBE77D5D4BA809A98F7F314" + }, + "fixedInfoPartyU": { + "partyId": "423700AFEA850224E037A1FB75E4AACC", + "ephemeralData": "494E1A8FCA45055D5BE542031B86F114B826CECB1D20BE75FC1E3088" + }, + "fixedInfoPartyV": { + "partyId": "D33057C3EB573158AEE0EB11444C0057", + "ephemeralData": "EBD1C2D71128A6E282CAC6D76F5A6C54EB83CDE651BEACCFFF111027" + } + }, + { + "tcId": 1585, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAD47ACDE3DADB732A6B3494BF1637E8", + "z": "9BBDCB3CEF5456EEA675B2B95968F75A6A011D1CB166FA4A97C68BA0", + "l": 1024, + "algorithmId": "54819CD4991BA57ACEDA0D7730F5A723" + }, + "fixedInfoPartyU": { + "partyId": "77A365D0EE0AEAD649F951D0FF01F632", + "ephemeralData": "A8CF821EFE0999021C257ECB3C7E5BD6374ADB2D051B2A81737BD000" + }, + "fixedInfoPartyV": { + "partyId": "75A3FAE5CCB02841FB3CBCDCB389D687", + "ephemeralData": "CDA2FA831E195A9752567D725BFE547DC766305B7DE605B18B8F0012" + } + }, + { + "tcId": 1586, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF1FEF3F8DA6FA4AB089FED9C2436E73", + "z": "DD46C96B9DC09ABB80D24CE31685F90D48DFFEA923D51DD772A069D8", + "l": 1024, + "algorithmId": "44A5F4445ABA6E178487F3D7917AF59B" + }, + "fixedInfoPartyU": { + "partyId": "DB181F98566C3253DA81FB4E2845F94D" + }, + "fixedInfoPartyV": { + "partyId": "D60D0703A83D049F1CF2AA907451A341" + } + }, + { + "tcId": 1587, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F2DE99ABBB57E3F10774B3AF003BD79", + "z": "AE8F8726893DFA11F8919E15394BBF64CF715B2443FF9FED0852BB46", + "l": 1024, + "algorithmId": "85F5F1BE629E856CB7846D2CCF979ED4" + }, + "fixedInfoPartyU": { + "partyId": "DECBC0BEDA98ED9F031B5E57821DC9B8", + "ephemeralData": "06279947A30577EF3E5A8B510F66E2C87D4C2D3558FBA67C337FACA8" + }, + "fixedInfoPartyV": { + "partyId": "31222A21233C7B0FDA7EB05E2E513AB7", + "ephemeralData": "4FD5FF8B63171F1EDCFAA0F57EE2EBDBA730E9A071346DCB320BD785" + } + }, + { + "tcId": 1588, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0EACE475065368F0171CA484B8A45DDF", + "z": "B1E0E40F61F12031EEAC94CB49D8C33D92690EE3865F3FF6B8A79426", + "l": 1024, + "algorithmId": "0EEC6798BA6750B7444A321AD1FB2B05" + }, + "fixedInfoPartyU": { + "partyId": "76D41EFDA01734C0049458A3D2CF44DE", + "ephemeralData": "7C9688D42FE4EE963F9FA7AD5E12A845A206DCBD37E13A0A902DDA89" + }, + "fixedInfoPartyV": { + "partyId": "7BE69AED09D421B20A85267B4B13F00B", + "ephemeralData": "D38CAC07231F27BBC9CD2C64A381BCFEF59AA53735775041058B7B61" + } + }, + { + "tcId": 1589, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C51238F02A46B136EE6C50A90E7759BF", + "z": "D8E75DD6EF00D014A2BA4C47265D0836F340B72ACA4EBF33227AA388", + "l": 1024, + "algorithmId": "181AEABC46CAEBA7AC290B891D4B433F" + }, + "fixedInfoPartyU": { + "partyId": "F2E3AD0AFFE5F76F18BE04D86FBBFFC4" + }, + "fixedInfoPartyV": { + "partyId": "D8D64B8BA2B7B1707EA4E220532EB879" + } + }, + { + "tcId": 1590, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A874171895955F792AE47198A4EA2206", + "z": "756F1FD51A3A061385D2F59C64DE6E2CAD1323EFBEBE4FBA770C2D95", + "l": 1024, + "algorithmId": "3A414C65AEA495E3447030D4E849BA8B" + }, + "fixedInfoPartyU": { + "partyId": "75B52C64B680CA403719FC20CB2CDA9B" + }, + "fixedInfoPartyV": { + "partyId": "E09BA2F2F28F94EF4422F831810BFD36", + "ephemeralData": "8967318709E169F364229EBBC551E7211C75D224A755308C47F71523" + } + }, + { + "tcId": 1591, + "kdfParameter": { + "kdfType": "oneStep", + "t": "086692E8460B9C6728968F4FF5E47841", + "z": "7AA3EB377DB8156937597F4CD0A669388ABE1C7F00DA1958B7A10603", + "l": 1024, + "algorithmId": "37B94798FE499FB55E03A2170A14CD0C" + }, + "fixedInfoPartyU": { + "partyId": "3276E49D27DF02A592FA40392276BC96" + }, + "fixedInfoPartyV": { + "partyId": "766C7F234DEE9F2E3968FA3AF5FEEF0B" + } + }, + { + "tcId": 1592, + "kdfParameter": { + "kdfType": "oneStep", + "t": "878BCF1BEC83215FA67F3CFDF3EF86FB", + "z": "795DDD2ECB1605A386F3D34AAA19891C7D08335C54FE81A48C077314", + "l": 1024, + "algorithmId": "63F4E0EC15A9F7CACB62259BBC84AE08" + }, + "fixedInfoPartyU": { + "partyId": "CA979B8879BE68D87901226CFBAF75A1", + "ephemeralData": "14E1D19F88FA110D83E6B28423C65D3C5C0EE404DB48A2D808D58A02" + }, + "fixedInfoPartyV": { + "partyId": "3D671F67D3C97188532C974C6E08FE79", + "ephemeralData": "E9139B7330A410A0DC056233C007684D8FF02647B0E90356F80B9C1D" + } + }, + { + "tcId": 1593, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9D6692B2939FF89F661B11484265C3A", + "z": "A7241FF5452F2F88DAB0435AE1B2F29D670EA7F4BC57FC1E113C1641", + "l": 1024, + "algorithmId": "2D90F02BFFBA7824B91EBCA6AE1656F6" + }, + "fixedInfoPartyU": { + "partyId": "6D8F69043D0E7EB315BED0A2BB8EF583" + }, + "fixedInfoPartyV": { + "partyId": "D7FE1CF7E61261FBB9E7CE574D9658F9" + } + }, + { + "tcId": 1594, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67F403A1410797BC1BDFFAB0457A89C9", + "z": "6055D2FF255A91A8DDF2C493B808C0969E5A2B1E88CAB05D288CF0C1", + "l": 1024, + "algorithmId": "F909A8903D56F723A04A83F811EDDE1F" + }, + "fixedInfoPartyU": { + "partyId": "8527F1BE199BE11CA07BEF021FFF097C", + "ephemeralData": "28B29C6844A69B3B2B150B695A8B28669530BE1611DDAD4E8EFC8540" + }, + "fixedInfoPartyV": { + "partyId": "31EC0D215B2DD2594CBF86D46AB61FD8", + "ephemeralData": "DE97013E69DFC1C607F638B4FAB226B7DEA5645911E654BE10B8B60A" + } + }, + { + "tcId": 1595, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A02C242CA2874FEA7DF2AE5AA5EC983D", + "z": "774974A9FF7A5C7BA6100DF587CCDF7B246F7338F1173CEB97662F7E", + "l": 1024, + "algorithmId": "AABEBCE767F72AD0B971E2C633F19BAE" + }, + "fixedInfoPartyU": { + "partyId": "E76DFB8100BE2756B8E857FEAB8DCE5B", + "ephemeralData": "4ECD3113F72426C3E669959FF377ED66B5222485141EADFF820A01CE" + }, + "fixedInfoPartyV": { + "partyId": "3278976E215BF43E72DBC092EF7F250F" + } + }, + { + "tcId": 1596, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F38889637351600EED67C5115AAD63E", + "z": "8F21810D95CC043F37E1516235B2B50A16F197C66692BD170739FED3", + "l": 1024, + "algorithmId": "6358E0CD11B77CA2D6367DA62170E412" + }, + "fixedInfoPartyU": { + "partyId": "B94F4344804B51A7CE3E77431A3FFF48" + }, + "fixedInfoPartyV": { + "partyId": "9B95F9A331CF0001A745D4FF644AE3C0" + } + }, + { + "tcId": 1597, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD606E62F103B8FEC6C8D019E746B51E", + "z": "4B3F1C74974118A7A4457DFA785682D74017C6B31BDED798D87F8EF3", + "l": 1024, + "algorithmId": "187AE56712985789A05487033DE33D67" + }, + "fixedInfoPartyU": { + "partyId": "53342AD6477FA165D81FBAF71B3E6283" + }, + "fixedInfoPartyV": { + "partyId": "977B64E74DDA35BC29E4F78B617CEF88", + "ephemeralData": "44843BF1596BF8EAC32DECDEEDE47DCDFDFD58127E631C49FC885097" + } + }, + { + "tcId": 1598, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBA6A7BF65B15427892CA4599033334D", + "z": "7F2E3BF092F545CB5716516061BF2DB421611F2807D3DA248239E497", + "l": 1024, + "algorithmId": "C6BEBD1CCDECD41CC2C2D4D455C51D37" + }, + "fixedInfoPartyU": { + "partyId": "3A672C6073A23B833835202D75035C23", + "ephemeralData": "AF24DD87F794F4EB1CCBE453ACE892A6EE51FF4F906E055094F9D40A" + }, + "fixedInfoPartyV": { + "partyId": "21DDE49457D3EA3467E64FBBDE9FF6A3" + } + }, + { + "tcId": 1599, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5FC0302BC5B18D5A3266A715F32C2AB5", + "z": "34B420088D52CED8FCF046D6655BB43EC1F378890C0525C4CCDCE404", + "l": 1024, + "algorithmId": "5B4EFB46A8CD692872785CC10F536F35" + }, + "fixedInfoPartyU": { + "partyId": "9C691F259096821F62A46EA8F746B3AA" + }, + "fixedInfoPartyV": { + "partyId": "71A4C34E913686C440E4EE4C31A6F3A5", + "ephemeralData": "6EE7E4B661C45D020D2D63D9B664B8D75FAF5445F90FD019FC32D662" + } + }, + { + "tcId": 1600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79ABE90EF95E096D6E57D27E7DEECE25", + "z": "D46F5A36FFC8A84FB3091BCA1E198D562488D81395CBA45B7C1BCBC0", + "l": 1024, + "algorithmId": "921BD6549FCFC9212FB817DEDCC88DD1" + }, + "fixedInfoPartyU": { + "partyId": "A66A590381379FBB89DE551E3720BEB9" + }, + "fixedInfoPartyV": { + "partyId": "3501451C03182AF8E0F32F3FEFE01832" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 65, + "testType": "AFT", + "tests": [ + { + "tcId": 1601, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79252B3E9BDB2595FC14B337F392BE0E", + "z": "D0F4D24D9B978CF6D60B604A9DD6568A2BE9AEB39992CC6E3CBDF78F3A", + "l": 1024, + "algorithmId": "ABEB2EAEC25923974D04AB196749B04B" + }, + "fixedInfoPartyU": { + "partyId": "058459FFF1A06F2E361F87E0FD6C0F69", + "ephemeralData": "19C0DB6EA037024AEB41A330C2D89CEF215F0244A21ACAF3FE04CE0BD1" + }, + "fixedInfoPartyV": { + "partyId": "1D433DE3A21C6ACC25C67B7092079CD6", + "ephemeralData": "9F87C5F5B2D573B0CDFAA7CB000A178F649708863FC3E1283D1904800C" + } + }, + { + "tcId": 1602, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5A7E8D2A01798A7ABB9C87F80EDF928", + "z": "E0E48F6D8ED1ADD7127338645526FE31C237F7C3423D6059FABDFE2524", + "l": 1024, + "algorithmId": "B00BACEFAA3570B95FA1F87C3718479A" + }, + "fixedInfoPartyU": { + "partyId": "D1BB3DB098CFB54EAEC9858FC8D18D00", + "ephemeralData": "DA69AE077735AB326E2636415C7CC98D2F2C784C9334AF6D4BF19975E9" + }, + "fixedInfoPartyV": { + "partyId": "5138FC94211FB5EE4A1A830C00F19A62", + "ephemeralData": "05178C6D31AF09222C86B2305A46BF447963C9B613AA85FB531C05281F" + } + }, + { + "tcId": 1603, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6B18CBBF6C78B60BF590883F8B69E68", + "z": "72743C3E13C27ED76D6F8283D351A647BEC11F0EFCA861A50658789381", + "l": 1024, + "algorithmId": "C8F56FBC204317FC9E843AFF9CFD6DCB" + }, + "fixedInfoPartyU": { + "partyId": "E974FB0E3CC2C19CF6299F9D6570E38E" + }, + "fixedInfoPartyV": { + "partyId": "ED69C844B614AA384209382276E41900" + } + }, + { + "tcId": 1604, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71316768EC37C9A0D4ED1C8655918A13", + "z": "719D1C30F40D81F6E8B02357F3EDFD7C95C9F7482D5E915A7FCFDE9F65", + "l": 1024, + "algorithmId": "D3D048354B13CB843C87A966BC05E129" + }, + "fixedInfoPartyU": { + "partyId": "243D2732F9B953006995E6A2991DD39B", + "ephemeralData": "B76904F2836796F32FDA7592ECF43D4FDBD11E6E88814410F84ACB233E" + }, + "fixedInfoPartyV": { + "partyId": "77771918D9C2A227D1F8F1D0E843CEB5" + } + }, + { + "tcId": 1605, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3AD88370625FF468C195D9BF9F115F1E", + "z": "4A9E13BC35A5738D5D0DD7228AB93D251D0FF4682E3A285E9B7DDB9168", + "l": 1024, + "algorithmId": "3DA6033ED1C1C51014D3AA927C7ECA7F" + }, + "fixedInfoPartyU": { + "partyId": "E55670D737BFA22827AD6886EC8CA470", + "ephemeralData": "D61780619290BC962367C4BDEF8A4BDE48351DDBDDCAAC4DD8A5B743A4" + }, + "fixedInfoPartyV": { + "partyId": "8F8DA922E05698A5E6CF18AFC01D1C85" + } + }, + { + "tcId": 1606, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7603F6D78C50714188345A78F43A02CD", + "z": "72CC9E6B272B81139A47841199787E31C6ED3278AEBB9B5428FBAB8E98", + "l": 1024, + "algorithmId": "36BE721D10C9B1941EB6C23EE0F35B85" + }, + "fixedInfoPartyU": { + "partyId": "27FF467E67780EC2C78F7753AD9D462A", + "ephemeralData": "E00C03D6B1EFBA733F94318349CEB5BDD4800C85DBBC72C5F2D8F30FC2" + }, + "fixedInfoPartyV": { + "partyId": "82F177F12B80379AD88FA8DF0381CC1B" + } + }, + { + "tcId": 1607, + "kdfParameter": { + "kdfType": "oneStep", + "t": "041E92740D44678954D7F31A579CA9E5", + "z": "F50D0ED3FD1E67E9BE8EEB581BB03581A64174BB90ABEE958FA7786CC1", + "l": 1024, + "algorithmId": "B946715C4DDC8C5770C33A759827D512" + }, + "fixedInfoPartyU": { + "partyId": "7E5FC7F0BA4F299EF9F08CD86DC4FCB6" + }, + "fixedInfoPartyV": { + "partyId": "E187BCA95904D74590A61BF2943208AD", + "ephemeralData": "9FEBB492DC1DE0C461DB062667A00822CDD39C2F7CB745F5CED4AFBFD9" + } + }, + { + "tcId": 1608, + "kdfParameter": { + "kdfType": "oneStep", + "t": "869819C4999645035FEA2D0198D3661A", + "z": "833BB577DDD5299D32F6E016C8E041853CA95C46D6D8D8D0898E9659BC", + "l": 1024, + "algorithmId": "649C079B31122C80155A1981B8D6C802" + }, + "fixedInfoPartyU": { + "partyId": "D0BAC2FA8D49DA0D7042758C946750C0", + "ephemeralData": "69963CBA6FFF10B014F5F615549C1B12B0C0301F53A139AED1B6037E23" + }, + "fixedInfoPartyV": { + "partyId": "125638F32DA2EECD3836549C046EDA37" + } + }, + { + "tcId": 1609, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1062BB2EAC6FA701A6262C598EC7FBA2", + "z": "5D1E5272D90C57493620552472422547B2F228B0628B344F5490305366", + "l": 1024, + "algorithmId": "C29F1ED57234DC2E9C34CDC55319FF39" + }, + "fixedInfoPartyU": { + "partyId": "03A92C3CC7536D0FEE820C247A726E87", + "ephemeralData": "5902B66354A33A8E78B642DA2D16FDE1B623FC1DD941660A392C81BAF3" + }, + "fixedInfoPartyV": { + "partyId": "85EF4B380C634D319C977FA509AD1CFA", + "ephemeralData": "A9DF8CFB796562111A4E00DEE86354D6D8DD7F65BA4D67520EB1568C58" + } + }, + { + "tcId": 1610, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D092C95A76F83C6F659C7A6BECBA8E74", + "z": "A570563399AA432C0FFAF16826BAC414BAA9FED2524F0301D52A4F3BDB", + "l": 1024, + "algorithmId": "282A7887D476A178219E9DACC6983624" + }, + "fixedInfoPartyU": { + "partyId": "7B98996B8A725300284CF8A50FAEC727", + "ephemeralData": "707E142591781B159A500B2AA993AAA191A5F8AFC197D8F1503E775AAA" + }, + "fixedInfoPartyV": { + "partyId": "5349E377D6D5D767F8FC88A52FAA92A3", + "ephemeralData": "793553429AAE18EB764D1D1D2759DC2AACFE3F94582A8D6EC1F7C7B26F" + } + }, + { + "tcId": 1611, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96ACBF8D313BB08BD7A050B257396103", + "z": "0FB0E349739C2DC8CE66031E8FCF49D34E2277417A91FBC6D278236EF2", + "l": 1024, + "algorithmId": "4E0B74790A7ED95E2E834B606F2114ED" + }, + "fixedInfoPartyU": { + "partyId": "D970DDA7663D7B93500B18E72C9FA151" + }, + "fixedInfoPartyV": { + "partyId": "4BE38804864129C745BB6FA26B67B889" + } + }, + { + "tcId": 1612, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8F40F33C2ACD4966E4F555E27968271", + "z": "290D54BA069EE8DC4E4C1C16FD5748B451B0ABB974FA33C4F664726134", + "l": 1024, + "algorithmId": "92EF878D02F6D0BB4A7DD5E2EB2856F3" + }, + "fixedInfoPartyU": { + "partyId": "A9A4B39C4FAD9C8B152CCD4EDCAC17BA", + "ephemeralData": "FD6F7972421BE603D4FFA2B9D0256F3B5DD4785759A7F21CC4548CE11C" + }, + "fixedInfoPartyV": { + "partyId": "B376F434B9FAF5D481739E67F44329B1" + } + }, + { + "tcId": 1613, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A73D434616E3CAEB44B13203D325CFE9", + "z": "8BC35403975E7D326B9262309433588B53A1EE90A1528CF9F66904EF59", + "l": 1024, + "algorithmId": "5DECCE32C4A4D922CB726E8D40484990" + }, + "fixedInfoPartyU": { + "partyId": "437231D342EF6682C9436AFD9CDE845C" + }, + "fixedInfoPartyV": { + "partyId": "C9A4F2D2A671273BABE11682AF715FF0", + "ephemeralData": "23D243C1F0FC6EDADB51F413861A0B00984F72C9116914205605100B45" + } + }, + { + "tcId": 1614, + "kdfParameter": { + "kdfType": "oneStep", + "t": "578264CCEAC02418C5699BB1036F411F", + "z": "8A577C17262B5DD0FEF9F074EE1BD9B71C67785023B8D55A15E874F070", + "l": 1024, + "algorithmId": "E667091F8855CDA1472B4A7B95DC8FC6" + }, + "fixedInfoPartyU": { + "partyId": "2260E0B76BC4D07F942F17FE4A3C7A40", + "ephemeralData": "8D2CA36F86AAA01E1C3CD5E22D7EDEFEC14893A058897458FBA44A61A8" + }, + "fixedInfoPartyV": { + "partyId": "9C76A5C1C82244E50D1B6E2409FCEF47" + } + }, + { + "tcId": 1615, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E785A5D5BF48110302F93966B5090F8", + "z": "E94EDE9B18B969C53784DDBDD1EDE963FF100E00D05AC164266C4F5F86", + "l": 1024, + "algorithmId": "752B2257EF5E3F2BBC10DED0EFCB484D" + }, + "fixedInfoPartyU": { + "partyId": "84969BF6CE934EBFD3F8681FC7D15FB5", + "ephemeralData": "B5496F111AF0FADF483DA01A7072858B5395F5C007F37C9F890797AD30" + }, + "fixedInfoPartyV": { + "partyId": "03A718D354BF2BE2B7316AF935D32A41", + "ephemeralData": "E8E0EE8EBB542159602296C63E323077ECA7B251D647F580855C0EC26C" + } + }, + { + "tcId": 1616, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D702EC09BB205A6C7B6FEFDD1BB533C", + "z": "5B70957A547BC9E821296DD3B33860C814C3216D517717EE657B6D6E31", + "l": 1024, + "algorithmId": "A88BFA186C3152538AF10E763C420A79" + }, + "fixedInfoPartyU": { + "partyId": "DC907F443C4D420F8CAA3A23E225C955", + "ephemeralData": "EC1F91A3ABB68EF0E0FCA3FC1BA658EB27F1A449EC46C1ECE87AA4DDB2" + }, + "fixedInfoPartyV": { + "partyId": "06F1379B63DD6DE0CBB8C8619F3968DD", + "ephemeralData": "98C68E3BDBA022C6516AE10F59A15B44CFEE4FC112DFEC832895F557E8" + } + }, + { + "tcId": 1617, + "kdfParameter": { + "kdfType": "oneStep", + "t": "763DD6FBC19268395CEC0AAB04302699", + "z": "72872B9BAF95F634D720A99F7AD7F1A6152E65EF24CAA66C7AA1A71376", + "l": 1024, + "algorithmId": "C328025369A43973DECA04EF65F79CA0" + }, + "fixedInfoPartyU": { + "partyId": "A5BBDF657F2C48875B40F22DFB9DE208", + "ephemeralData": "A07C56F27BB0B3E733C80D1C581E40DFF1121D419F1D2D5C47BB769347" + }, + "fixedInfoPartyV": { + "partyId": "23B18EDE7086C0B6109854F2F03A5571", + "ephemeralData": "58875BA10DA78BFF21E2EB2D7CB106553FC5DF5F8ADCAEC20D60EC6996" + } + }, + { + "tcId": 1618, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C27120F29AEF1CE450F002C320C8D0F1", + "z": "131F4D3922ED7AECBD908F6B10FE8833B0DEF8876F9990634B4120AA56", + "l": 1024, + "algorithmId": "5D4269050A6201624AD8023C328912F0" + }, + "fixedInfoPartyU": { + "partyId": "093BB02F3F8E1100495BB3A08F42573D" + }, + "fixedInfoPartyV": { + "partyId": "7116121F32306A04E190868AF194B19F" + } + }, + { + "tcId": 1619, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00DD69F50293D4656C939A11729ED07C", + "z": "AA7698D4558857FECC399DF3CEEC0926283DEA5546A636EBBA0A21923D", + "l": 1024, + "algorithmId": "96D7AFF3E384AED489403D4BFE41E922" + }, + "fixedInfoPartyU": { + "partyId": "AFBB2BF79A91DCCC8E60A583D16A933E" + }, + "fixedInfoPartyV": { + "partyId": "BF52E5B5983B3E34A4CC0133A6CB3E44" + } + }, + { + "tcId": 1620, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C89662F9D6EF01383FE8E2323A9EC8C", + "z": "F247ECD535F936961ACD338806C6914BB247CC480E07FD1460276A5213", + "l": 1024, + "algorithmId": "FABF42123B4FCAEA72E8613800583388" + }, + "fixedInfoPartyU": { + "partyId": "C2DB14A2EE779A98D7C027334084434B" + }, + "fixedInfoPartyV": { + "partyId": "B5288BF1711B7D01BB32A796A85FC8D1" + } + }, + { + "tcId": 1621, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F41A2A458D16EA06BEC8BA2773000023", + "z": "0F9BD3AAFEFFC38B5CE696B4C0C5E4A3AC6B216C8A862E090B6F81B375", + "l": 1024, + "algorithmId": "AA495DA44CE6B2534BB72686D968C6BA" + }, + "fixedInfoPartyU": { + "partyId": "98BBE87AD11A9ED9DCF0D7F298290529", + "ephemeralData": "147B16E7E9F3CBBAD3F76660769336617181F0E998339490CC50066312" + }, + "fixedInfoPartyV": { + "partyId": "00EE5A6495745DBE956F98A16708A3E2" + } + }, + { + "tcId": 1622, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68B63BBB42CA9F80979B6C19CC795D42", + "z": "EFEAB59418D7F4A84351319D02971F0169CE9D3D47F2974C9D3C241D86", + "l": 1024, + "algorithmId": "0BCE1F8F79E100BECC82BA89362BB344" + }, + "fixedInfoPartyU": { + "partyId": "CFDB8586C5F56E91FA71F3794983103F", + "ephemeralData": "8B3B2E709CAE0DF0841A2C0702AD9709244D28DD2465091D40337F7F2D" + }, + "fixedInfoPartyV": { + "partyId": "481654E479F3FFBC6A35664B081923BC", + "ephemeralData": "A13907464262A3D9440FB967D9CDEECF96D1723D48B4AF7E83185D646C" + } + }, + { + "tcId": 1623, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66BF2BE0945E703CE307FF5C32E22DC0", + "z": "94497F862A9A7B35A5199FF609195D5C8351A3D9FBE9787D72235B15B0", + "l": 1024, + "algorithmId": "C19683FB6BFF71115A3EF2BABC69319A" + }, + "fixedInfoPartyU": { + "partyId": "5B8236F8B5424E7327E5BA98B2E579AA" + }, + "fixedInfoPartyV": { + "partyId": "2EFDECF9C09A7AC1A58CE98A4413E05F", + "ephemeralData": "674B3FD70C588F1F4F369F27733FF8FEAC635DA795F177A1EB9FBE6051" + } + }, + { + "tcId": 1624, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCA923486C22837452757CF823BA8900", + "z": "60241FB968991B36899AC8044BD0B0335A90977B807F6BD4BB55B1E365", + "l": 1024, + "algorithmId": "EFB2CD6EA9B1E2CA9B7682A8940CDD15" + }, + "fixedInfoPartyU": { + "partyId": "E57DA33A1E2C345D1B8A43D538A65209" + }, + "fixedInfoPartyV": { + "partyId": "46B401ED18C82F520F5B442152D341F7", + "ephemeralData": "03C21483294B0EE80E51DEC283B39D934E7C9CCFEEB425EF8457F02876" + } + }, + { + "tcId": 1625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6709956AC5D5273A0AA1BF7482ADABF9", + "z": "F55439702EF70965784EF6E71CD6EA668B3F6F3D548BC1852D98E54014", + "l": 1024, + "algorithmId": "C50AD8F21DDFE7562969CA7C747BD0B6" + }, + "fixedInfoPartyU": { + "partyId": "4F372E21E9749771F2B20977DDC0BFA4" + }, + "fixedInfoPartyV": { + "partyId": "6C4BBD69ED36AEEFBB9E82A8FE3DD47F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 66, + "testType": "AFT", + "tests": [ + { + "tcId": 1626, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6C3B5E2A0B9E2EECE72DBDCF282CCDB", + "z": "B424C79649C48EBCE98F041432DA461B767E18F0439BA50F0EA6A64F", + "l": 1024, + "algorithmId": "46E1BC7AE62DF4332179A79712950824" + }, + "fixedInfoPartyU": { + "partyId": "C3023E313637D316D49676307E3FD9EE" + }, + "fixedInfoPartyV": { + "partyId": "8148775CE1C1FADA25DD8B8708A8B2FB", + "ephemeralData": "D47B5658614D66AB7B149BEC008C7DB759CD411B06AFA54600D91755" + } + }, + { + "tcId": 1627, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26E793D02E331A1AEF3CBD3AFA83A554", + "z": "D087DB5966523C9C268A2CF5E5CD82FA814CAF2CD5973AB5842702C0", + "l": 1024, + "algorithmId": "62733ED661E09779C14CE5EBA2CB9623" + }, + "fixedInfoPartyU": { + "partyId": "8BCEAD0E1AADEF16D4A1BAAFE5F01DB1" + }, + "fixedInfoPartyV": { + "partyId": "B2D92AC1B08389C108A3384D4D98F5BB" + } + }, + { + "tcId": 1628, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1B5B77377FE364FC64328A6B2F7A0F93", + "z": "9A9BA77066111418D59A8031A8BE99D2039C6159F45AC267051DD321", + "l": 1024, + "algorithmId": "495503CD255ADAC6CCB367FF970CA2F1" + }, + "fixedInfoPartyU": { + "partyId": "0AD685B5D0E250E5F9033E7E4F953484" + }, + "fixedInfoPartyV": { + "partyId": "27C094B6C20C0385DDB64D3AA662912E", + "ephemeralData": "F73BF972DEE64AF338154178073E931FC99EE1C3C49593844DCB2570" + } + }, + { + "tcId": 1629, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BC0EE33B9557C7803362C3EADCD28AD", + "z": "596C2517184BB9635E5BBB5C19AE55F4A448B0DE06458FAAD561CBC8", + "l": 1024, + "algorithmId": "260DDAB5CDAA167DA0081AD6E5284E45" + }, + "fixedInfoPartyU": { + "partyId": "8DCFC6E31D7C3778EA044F568F6D4EC4" + }, + "fixedInfoPartyV": { + "partyId": "2384BD497F0EF76192775D3BCE230E91", + "ephemeralData": "F657F4FDF5F1898B48168634BEEA9C7B3D3F24A1C350A54EB8438F42" + } + }, + { + "tcId": 1630, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BA56EFE1FFE6C9AEE762F0B793B9412", + "z": "ED0B4BF39C172D5F8A8C03C67A19EF5E1F295173D8BF1727F7CB9C08", + "l": 1024, + "algorithmId": "388C83DD62667B7D068B185AA5396ACB" + }, + "fixedInfoPartyU": { + "partyId": "B90562D4FA1095B7415A0BD50F086B1A", + "ephemeralData": "F230C2D79552491A4908BED20CDC032F85DBFB1BE2FB598453AA9057" + }, + "fixedInfoPartyV": { + "partyId": "0FBA2D0C11969960BB9C975D27FCB591" + } + }, + { + "tcId": 1631, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90E0950848C48BA4F614715ECB030DB1", + "z": "A4FE2B36A5D9733C20D27E302D975D84F0FB8EE98D60A0574781AA76", + "l": 1024, + "algorithmId": "6E8EE4058AF0B76C2CA2852FA3224A17" + }, + "fixedInfoPartyU": { + "partyId": "D0E276AD101747635B135FD7D7235AC0" + }, + "fixedInfoPartyV": { + "partyId": "A12B10DBD00254BFC38A1796F4477124", + "ephemeralData": "110B171499422AB0B7B9122F0991C573C166E9CA3B492418246A8FCC" + } + }, + { + "tcId": 1632, + "kdfParameter": { + "kdfType": "oneStep", + "t": "610E6D721F2D28B9CDA8857A4A80B039", + "z": "BE0C4648FEDCAC651306F403CBDED76BD1F9C1EDE8D0454385501DA7", + "l": 1024, + "algorithmId": "E1A09027D1E66D9B2DCCD2E6C613F183" + }, + "fixedInfoPartyU": { + "partyId": "B85D98E0F49D1B400A2A845E2EBBACA5", + "ephemeralData": "57E78BD4ACE672CB0640421139FD3C5141FAFCFB677D1C6149E261D7" + }, + "fixedInfoPartyV": { + "partyId": "8863C73E90437429E47173234FCC3311" + } + }, + { + "tcId": 1633, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EED00876D2449A37BC6987500BE58F3", + "z": "9E08F9FD477C8FCF502E4A892291BF470B4D418A699C29A2BC819F00", + "l": 1024, + "algorithmId": "95CD761326870D627E92B3E8AC74C3E0" + }, + "fixedInfoPartyU": { + "partyId": "347554BBC9F211F47326581F62F7248E", + "ephemeralData": "58782E1D99EFEBEA4A66DAFD21A9BE3A23705F9CD13CE302B8E333BB" + }, + "fixedInfoPartyV": { + "partyId": "F98390BA408CE624C542FB481A7A9465", + "ephemeralData": "4E17FCE47C3EDB56E4076CE36BD49B4A44CF60E90F7ABEA84952B950" + } + }, + { + "tcId": 1634, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B33688F96BC0A7F2AD734FFA83B897C", + "z": "7C919EC9AEAC70BFBB25DE651F73923B75F40619A463699AD02A9466", + "l": 1024, + "algorithmId": "BB4EBB7CD1A05B4B7ECBDD8611C8A0E2" + }, + "fixedInfoPartyU": { + "partyId": "F88F972612207E90E76A6427E2EE3420", + "ephemeralData": "BDE78F8B28D64D1118E483E7D7FC077BE8F67B7743B1309D96ECEF61" + }, + "fixedInfoPartyV": { + "partyId": "E9AF9F3D0483E5A4AF676EB3E1289512" + } + }, + { + "tcId": 1635, + "kdfParameter": { + "kdfType": "oneStep", + "t": "31EE676C4FCC9A84D34C5C83E703D489", + "z": "1F123C4F73D8F923CC554C14CCBB56804D9C87A6D935F9A8D248B450", + "l": 1024, + "algorithmId": "ED763BAFB0017E186EF4D9BA970F9BCF" + }, + "fixedInfoPartyU": { + "partyId": "FB41299F8F44A3F3FA60D090B102A50D" + }, + "fixedInfoPartyV": { + "partyId": "E76C83D4DB560E2212203AFFDF2E53FE", + "ephemeralData": "09C16D9EE26A0E3FE3E951B3DDB8FA2CC50770D9C0F6B0BDEB8501CC" + } + }, + { + "tcId": 1636, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59BB4D9EB860DA6E3715C0235AE65437", + "z": "1F884119AAD2FD0EA8BEB9EF8075AD420874AB18844348AB73585A4D", + "l": 1024, + "algorithmId": "38990BD369432B493F84F7FAF7792E6B" + }, + "fixedInfoPartyU": { + "partyId": "78426211EF8C26B2791BEA70FCA0CB96" + }, + "fixedInfoPartyV": { + "partyId": "BF6959AD87504B138FE5C9E065C0F50C" + } + }, + { + "tcId": 1637, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41C8CCE46E6AC71D91A8F3949F1BC649", + "z": "5034A347CAD1BED1EFD0D7435062B3517647C7947DCAFDE7753409CA", + "l": 1024, + "algorithmId": "52FC5A1533F12F13541F4E175234EFBE" + }, + "fixedInfoPartyU": { + "partyId": "CD0A9EFC4B6A87250C69B0664670B0E3" + }, + "fixedInfoPartyV": { + "partyId": "C9442D6A380B6FD8FC0C2B1A656A4032" + } + }, + { + "tcId": 1638, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4888555DB7A95F5C17FC86191FC41DCF", + "z": "DB854912BD760C215EC46C055A913C7FBABEC6157926D7FB33B9B8B9", + "l": 1024, + "algorithmId": "CE6B6146CF045BC047171A3BE2600F43" + }, + "fixedInfoPartyU": { + "partyId": "52094BF7F8D337A78E15BBD26AEA5F71" + }, + "fixedInfoPartyV": { + "partyId": "51B221FC41AD272A91F1B24ECE209842" + } + }, + { + "tcId": 1639, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8F2A982A2E0980BC39AF3B2190F3936", + "z": "E02490090068A266F36648FB87E2E95D65F7D88757AA7029C64E7AA3", + "l": 1024, + "algorithmId": "0A0B6B8FA0243EA481B58C792F53A3F4" + }, + "fixedInfoPartyU": { + "partyId": "D991B78FC5E1451C14FD3C4CFBFF12AC", + "ephemeralData": "66B66BCEEC2118FCD975ABC94C99BD4E120181FE423AA758B5226534" + }, + "fixedInfoPartyV": { + "partyId": "BA4DB8C56A532A022AD4048E11AF63A0", + "ephemeralData": "579E4A6EE84983EFD29BA2D3F1EDE736441BFF001C0CC5794787CE02" + } + }, + { + "tcId": 1640, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13D8B64ACEFD22D5F76C6160D588C00F", + "z": "307DADBCF6ED3C7976E0245B9F9AA99AB47D08EF77C60B0883F1DA72", + "l": 1024, + "algorithmId": "14C5C5F50385039599D7F45352A52858" + }, + "fixedInfoPartyU": { + "partyId": "58E511FA030C41D41A91722ADE4E09F7" + }, + "fixedInfoPartyV": { + "partyId": "8D5BC7FAEC359A62D526735E882B5DB8", + "ephemeralData": "5BD7C808289598A7514F04129556677CDC1819CB7F17278A9EB9E680" + } + }, + { + "tcId": 1641, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F23C15A7FF7C06EAB56F28E0C4CD3042", + "z": "3CBA48EF6C9FC3A5B859A72560A001770007CE1BD877A1A6A405B5F5", + "l": 1024, + "algorithmId": "42B16F5955DC7F125D35DB42A4FE5E94" + }, + "fixedInfoPartyU": { + "partyId": "12A8F4B8A09C0D69A35FEA43FDB5355E" + }, + "fixedInfoPartyV": { + "partyId": "E75DB49916324C84BC00DA1C65E83E6F", + "ephemeralData": "2D9DBE40B55A41D6D209804B8D1AB000B80A18F6FCA28DBD0A18E679" + } + }, + { + "tcId": 1642, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59CCA117AB66D5A38E71C3F1AA345B39", + "z": "0AC2E01E46F25D24234C2F30487ECDBD66DECE2D3C37564BD55ECA90", + "l": 1024, + "algorithmId": "CFE84687B8CB4249DE08B2DF666E9009" + }, + "fixedInfoPartyU": { + "partyId": "237CF824E38412E7BC287275A8C75D4B", + "ephemeralData": "AA1E60C1A54BF13507D0F12D936AB718D73234A955E77A1E56D5D00A" + }, + "fixedInfoPartyV": { + "partyId": "3DCB53DFE32CB3EC0F1360CFE12CFE69", + "ephemeralData": "C479A65AA3B7085108ABEB3D5BBD94308519AF1CAC07F74F1A5ACEE4" + } + }, + { + "tcId": 1643, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C9F1E656C3F0492607FFAA848B613AD", + "z": "002DBA00F523ABE67E80C8B3292925A95F497A42103E93AC927E770A", + "l": 1024, + "algorithmId": "1559C24BDA6CA8EC63030904C01A80EF" + }, + "fixedInfoPartyU": { + "partyId": "2E06A5D41A69C744D3CF0F09CDFD96CA" + }, + "fixedInfoPartyV": { + "partyId": "65F19189545F76209E9DB816DB6DB620" + } + }, + { + "tcId": 1644, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88599059CE9D276E25B0820D6B88743D", + "z": "B47C9E3D4838C7EFC04925FB6E6FB582F66F49A04D118F7B2FE7791E", + "l": 1024, + "algorithmId": "DD999E5A1AAE6D4E4C83F8DBEAC4EDCB" + }, + "fixedInfoPartyU": { + "partyId": "C4CB3B63AD616AB7E1FB2613BEF3B45A" + }, + "fixedInfoPartyV": { + "partyId": "12DCF19E405798994634D32EB7B8A3B9" + } + }, + { + "tcId": 1645, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AE6B0443D8AC71C54CEC93BF4276B4C", + "z": "552C66BEDC8BE0BA0C63D4AEDE219813392A57CFED830B54C8C01314", + "l": 1024, + "algorithmId": "58C175CA52AC7286161C511C49BA8DA5" + }, + "fixedInfoPartyU": { + "partyId": "E32539E74003F9B4B73D628BD6D1DEC7" + }, + "fixedInfoPartyV": { + "partyId": "DFED0AE4883490DA4C6F8EACA5834095" + } + }, + { + "tcId": 1646, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A6D982F943022F78B3D878A2D9712E1", + "z": "F9A2CF128329DD42F2739A0C51813DA6BC02317F85D68E01A44D3A60", + "l": 1024, + "algorithmId": "DCE7522F848F82D9F3AD611B995A4F0A" + }, + "fixedInfoPartyU": { + "partyId": "58AD113C52DB4205F523441540C31830" + }, + "fixedInfoPartyV": { + "partyId": "EC3192C91083087A259588DEA0B9E480" + } + }, + { + "tcId": 1647, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B3DAFF6150B619FD47A0B456A557E339", + "z": "8EF989EBE66FC2C9712BC045E6C5DBEC38C82A698BF72C8947457F86", + "l": 1024, + "algorithmId": "F5A2E9614CB95C87F3A8BDA8F7D18C9B" + }, + "fixedInfoPartyU": { + "partyId": "2B3BCCEB0C6C5AA4E2C6068288925806" + }, + "fixedInfoPartyV": { + "partyId": "32FF5C5E0FC3E968D4A00ACF54225A68" + } + }, + { + "tcId": 1648, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F00BAD284796BFEFA5FD037CCBE2F4C6", + "z": "CDEC49452A154C64640354DE29E6EEC9CF0F8BB9B8F84E27AC51F6E4", + "l": 1024, + "algorithmId": "32F2B313E42DA2B331CFD98CDCEE422D" + }, + "fixedInfoPartyU": { + "partyId": "F1122AFB770A46611CFF3C9605098842", + "ephemeralData": "4998C8C9EE8C390A8131752B62DE6727E1988CA7A9D4686CD900DC2D" + }, + "fixedInfoPartyV": { + "partyId": "AFEF5B341FD6F3EB6D1736243A39698B", + "ephemeralData": "9F37767050F1BD5E523D1D8BD0A40F124FF4E96FE1B4D0152CDE393B" + } + }, + { + "tcId": 1649, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A47701BFECA23BF59B58B32DFDB7DFCE", + "z": "141792709B4411A880C851862DD45D45404A4BB7A19A21C4E936E3EA", + "l": 1024, + "algorithmId": "DCD653E391D4AF33FD2891500C2EC94F" + }, + "fixedInfoPartyU": { + "partyId": "E1451545AC18ED1CFFA73037313D3CEE", + "ephemeralData": "399910D4B61508190E7AB2850A32789A9ED9FBF6396D657467975618" + }, + "fixedInfoPartyV": { + "partyId": "3440F7CFD67AAC7F3C583263CB923A1B", + "ephemeralData": "38D88BF61F683B0E69BB1D34CC6393E1400F50D3CB62C0A2E6748161" + } + }, + { + "tcId": 1650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C58FDEE1D8646B8BC5A9C272400C7D0", + "z": "33689C10D387308D99DA20A90DEF7783F354942A4BE221D092B8A039", + "l": 1024, + "algorithmId": "D7406AC191D137205D7FA37A21596A70" + }, + "fixedInfoPartyU": { + "partyId": "92F9B5E4AE06ADB2215835DF226E621C" + }, + "fixedInfoPartyV": { + "partyId": "B93382E419080EBE22CE737957413967" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 67, + "testType": "AFT", + "tests": [ + { + "tcId": 1651, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9449CA51ED752A4DD290242B9F7B3AC9", + "z": "F0842287EDDE75715CC3D8D7FD9C24E50BCF0AC05E791E5AEAF191F3946E7D650D0402", + "l": 1024, + "algorithmId": "B72ADEB9F3186B513FCBEA9CA99569FC" + }, + "fixedInfoPartyU": { + "partyId": "E2B4CBD3B4363A390E88A55A39C5D0B4" + }, + "fixedInfoPartyV": { + "partyId": "99376304B37E2212BA8C3506666F63BF" + } + }, + { + "tcId": 1652, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02211A2D99D34437CCC3D15375410BA1", + "z": "2094B2D5C59E2957D96C4ECA7B89385C4B2A90369991A270233DCCFA3312F9602EE1AA", + "l": 1024, + "algorithmId": "6D0A0063CA96D3F0F338FC9B1039129C" + }, + "fixedInfoPartyU": { + "partyId": "099DAAA52953AD15A946D88F74AAD182", + "ephemeralData": "06C2958BAC3443FB1C65E0F283BCB6E56417710EBE4E782ED1DB398C11636621C9C5CF" + }, + "fixedInfoPartyV": { + "partyId": "331B945F9C7A75FC56E8996D1CFECAEC" + } + }, + { + "tcId": 1653, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C9007AE5B8E8A8A053E2014782A3799", + "z": "7EEEE57FA4460EB28E308D8F262774E03BAD4416CCAD65F220D01EDB2C2415347031AC", + "l": 1024, + "algorithmId": "B992A3452B3B758753A29D3D1935CCAF" + }, + "fixedInfoPartyU": { + "partyId": "1778BDDC9F4CFF435A4E0B74A45D3314" + }, + "fixedInfoPartyV": { + "partyId": "760DA02BD8CD7995E4A6E10A85D8AFCC", + "ephemeralData": "05AD293F5F18818192DFC0B65209F81635B3A42F95F4B291418FE2CD25D4C609E6E2B8" + } + }, + { + "tcId": 1654, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6D764F1B30FF10242E407D0AF29E3EF", + "z": "88CB733A0F9DAC2F1BBCA8CC8FCBF7E4A086D902C095CB56C7B357CF0905E018EB292C", + "l": 1024, + "algorithmId": "4A6324E3B4814B9E0050BB201EFF8DD3" + }, + "fixedInfoPartyU": { + "partyId": "DA0C316D778E3F1C585ADAE96A4B39BA" + }, + "fixedInfoPartyV": { + "partyId": "FFE28DA4BA22D9EA236F1E9A60BEF3C3" + } + }, + { + "tcId": 1655, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53111E81CBE57AD890E48C26095F7B50", + "z": "17810FE19EEE20CC9138B39FB5A902D1151E63444B3F1390F3FA70DDCCE0D9D242DEDC", + "l": 1024, + "algorithmId": "D39B90CBF4D421FF20BA054769C8972B" + }, + "fixedInfoPartyU": { + "partyId": "68A02F997D53992C9882AE70FAC94DEC", + "ephemeralData": "D73A857F9DF7BA5F0689117F22A52399F65E279280125C82BDFF4FA11EA32932514009" + }, + "fixedInfoPartyV": { + "partyId": "71EBD387D016C5AE2059AAAAC3E530CF", + "ephemeralData": "D5CC86CF8C7EB8FABA7384CAEE4C9A4261B13A21FC3D6257E6BF9DA021D11D6440CEAA" + } + }, + { + "tcId": 1656, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D804522FE03BF09F117A27FDBBF8C1E0", + "z": "A3F85988DBB7653A4601D8058F79C21B5836B91F661EF301E152EF2D0631BE8C001361", + "l": 1024, + "algorithmId": "46BD3FCB05D15DDB0B97A02AE512522C" + }, + "fixedInfoPartyU": { + "partyId": "261B89811D7945ABCBCABBAE87313FB7", + "ephemeralData": "8DE19049B0C4E45FC0E4ADF75FA9AE88E0AE7AFBA7587638C8CBEBBDB3FA84E816E8FA" + }, + "fixedInfoPartyV": { + "partyId": "0621D1EC349302EFC3CA7D4433BBE270" + } + }, + { + "tcId": 1657, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB390E2931088DFDC5F560882076A03A", + "z": "A948A5818E1EDD8D109300A7A63C4560C2C6A80D2C1CB73349F373FA525AFF121FF97C", + "l": 1024, + "algorithmId": "51557BF32604DF90B850E51A0E59F507" + }, + "fixedInfoPartyU": { + "partyId": "89FA61E10DC11795AD7B4DDF51435CF9", + "ephemeralData": "352B94E22C2F863F8F118FC912E27564B132726E8EC764551DC5496B1177524075D84C" + }, + "fixedInfoPartyV": { + "partyId": "6E9E334F30575E8896E531E4A669D3CC" + } + }, + { + "tcId": 1658, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAE9BC2059A43E659DEB8B74267B2E8E", + "z": "E3B0060ED57CCFB3513CC688E884EBE71FFDA79107443C04C426772A150AC9399C0489", + "l": 1024, + "algorithmId": "FA3F9B796C7AEFCBF5D673F2B7D9B213" + }, + "fixedInfoPartyU": { + "partyId": "B212372160E7C64EAF5018843005FE74" + }, + "fixedInfoPartyV": { + "partyId": "8CFDB551FA5A61B88D73141C04DF019C", + "ephemeralData": "A4BFD4EA11FDB4F5B7CBA392EA58DED10571B2CABC7C30DBDFC19AD59ACF9BCCA19292" + } + }, + { + "tcId": 1659, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C6B7028377CF2B9C9F25717FE796102", + "z": "75855D29E7953B5A3BF2F9C7030B1F6EE6A83D7D198C20BAF57E204DF44853F5150449", + "l": 1024, + "algorithmId": "E74FDF98BFD2C99A10CCB74DF5BBEB1F" + }, + "fixedInfoPartyU": { + "partyId": "F9FFD92CA8376299DD2B6DB99359CA94" + }, + "fixedInfoPartyV": { + "partyId": "9B5DCC968A12990C61FC4D003E2DFD8A" + } + }, + { + "tcId": 1660, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2117EB117F0C2E408EC3C8B9FB46DAB3", + "z": "4E84F4685E0668C9DA5947E45C5D1F91E1E194F0F94AC04DF92CB21051CD5D92A3F96E", + "l": 1024, + "algorithmId": "068E8AF4BDA50B546F8574F71BE70AAD" + }, + "fixedInfoPartyU": { + "partyId": "EA1C35F6CD76CF8D493588E6A9FCE6FA" + }, + "fixedInfoPartyV": { + "partyId": "3B5990CEACA888F3044ABF9D11018609", + "ephemeralData": "36FA911C3FBF9D8D00F3A5B1275D3C826D5E2D1B4C94E38BD114CE13E908FB379709FE" + } + }, + { + "tcId": 1661, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B83546679D6A51DF9155BFB0CAA7154", + "z": "B2274B09B3FCD21BC7653D4D906EB3AD883686FE9FED295AB7370991A28A640F300B13", + "l": 1024, + "algorithmId": "E4E83347C5C3CE5D1975A9C0E55F53A9" + }, + "fixedInfoPartyU": { + "partyId": "F2D8052FD0BAA4C30319CEC97FD8033B" + }, + "fixedInfoPartyV": { + "partyId": "010FAE840CBE87C3FED1E27BA4E8D5CB", + "ephemeralData": "A1F3CEABF63FF65B4606800721BF0D3E753D8209F915989583A9CC6A99DFBEB6ADFA63" + } + }, + { + "tcId": 1662, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC64D57B745F157B23D7D5B84BDA8072", + "z": "2F10AA50F85884E0EC36B84F95CB21630AA37D4BE431B0D4455FCD664F670659EA2CA7", + "l": 1024, + "algorithmId": "9A5E0B00D6BC0F2574CDE3F5685A8F25" + }, + "fixedInfoPartyU": { + "partyId": "F713314A73028F587D73310A940420D4", + "ephemeralData": "85216171AEA2C2B6C03D4EAD32FF0F782A0F019F2AF56774E16F7ACFA19A96DB8A01CB" + }, + "fixedInfoPartyV": { + "partyId": "48D4D899F10992C190C463863E5485A9", + "ephemeralData": "888D59EEDE264C451B706F4B15A4D1AD198170451270C0D70DEBD9588DDCCECBC77EE9" + } + }, + { + "tcId": 1663, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB7589845B2E58EB0BFFEC0BF8F9F96B", + "z": "62F119BCC25F8FC9F56F3A1E960E992A282F0D912EC2613F474A5D7E289039F6625C2B", + "l": 1024, + "algorithmId": "E9F9BF7A8E9D8E4546BBBD22E17A3A0A" + }, + "fixedInfoPartyU": { + "partyId": "4E9C2A29A9BFA5C09B7BD1DBAF025C1E" + }, + "fixedInfoPartyV": { + "partyId": "70268A88FDEF5F9ACABB44C51D124A60", + "ephemeralData": "19C938991A389D8C7141E547185844DECE5C6D11F29FCCC57A79D5721E594D7F0A3410" + } + }, + { + "tcId": 1664, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E4890CE5DF068E5372DB599866F3A0F", + "z": "454CF4C03EB670831BFE6C11F15D0DB4BEA0A307A135891877CC62C2817D14BE784622", + "l": 1024, + "algorithmId": "30D8230F67CA3D500C1460EC01369AC6" + }, + "fixedInfoPartyU": { + "partyId": "BAE8C7B0AE153ECD24ACB9921C1AAAC9", + "ephemeralData": "EE10FC88BB6B4F57D2243960FB2C84895CD7F03C23B68EAC52FE6116516755C47194D1" + }, + "fixedInfoPartyV": { + "partyId": "BF71F1873E785ABA3005C8427480DB60" + } + }, + { + "tcId": 1665, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F86616F6DEB126C07E4B7D59485F6AD9", + "z": "33F444EC2A8EDC6032D23F3542869D6A582F31228AD0BAAB618CC8474E13CD44BAE1BF", + "l": 1024, + "algorithmId": "5447B199F3ECAB03206D8E86F2518AB3" + }, + "fixedInfoPartyU": { + "partyId": "AC8F9CF0C3A01CCC7F171CC68603F6B8" + }, + "fixedInfoPartyV": { + "partyId": "C6667462396BEEE0FA04859E395BFCBD" + } + }, + { + "tcId": 1666, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A48842B7E48211213C5FC064FE3DA34", + "z": "604D798524B227648F720DDDB0CE3EA0FDA52116BDDA23995E90E5D885B006D4B9C225", + "l": 1024, + "algorithmId": "5F0ACD9285A8C2094F316F86A285D3DA" + }, + "fixedInfoPartyU": { + "partyId": "5C316337EF2C9D766A0A5484593514CF", + "ephemeralData": "FE9F56F5015882E13F3964334B784CEB02ED7AD520D96C32B1202093C6DB12561CA886" + }, + "fixedInfoPartyV": { + "partyId": "BD1A0BC40A37593464C56F39BD0931D0", + "ephemeralData": "C68B9A68D57B2F2CD91714867CC93070A350DBCCDCBB1FC811E59BD8F2E85D0E39702F" + } + }, + { + "tcId": 1667, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E5738CF84200A687912EAB654F72D9F", + "z": "2E9CF516AF500B9CC64B889803DC52D1360EFC7BE4598F28706CBBCD57CB9E781C8E71", + "l": 1024, + "algorithmId": "B9D505489FCA4C4E7FD42BA62FC49A83" + }, + "fixedInfoPartyU": { + "partyId": "87A4260FEAEA7949992AD5D41A5DE8B9" + }, + "fixedInfoPartyV": { + "partyId": "F2325ABC6AC1BB0453F0838B95DB8501", + "ephemeralData": "FBE3F7B71F8D2F6919D0C76D652E98C16F14EFC96775B7619E1EB94227FC62F49F932A" + } + }, + { + "tcId": 1668, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6782A388DCA0A2C0C7D12C1BE26C04A3", + "z": "A77E234B14EFA5CF86B8F26005CFDF06DB848CEF0B1BD82026966FDEE976FD341A6FA6", + "l": 1024, + "algorithmId": "FAB2E4C94EE5A6EE9DCC45724680C38C" + }, + "fixedInfoPartyU": { + "partyId": "50B097A4EFB10584728D1B2CFC7DCA5A" + }, + "fixedInfoPartyV": { + "partyId": "5AFCDB81803919F04442B96AD7877BC7" + } + }, + { + "tcId": 1669, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAC21DA7B5EC10C2869B436B8A95E1CC", + "z": "448B5763B99CAB869300B258DCBE2FBD56A0F8560C98D40274138A116EAB8E71E3670B", + "l": 1024, + "algorithmId": "379B3DAC505619806051979656874D9B" + }, + "fixedInfoPartyU": { + "partyId": "BC95042AB298CF5700847320A82A5A44", + "ephemeralData": "9DB2DF1581694E198884BEAA4A35F7CEFCC75349AB115AEE66E7178EBE8B8B4D9B04C6" + }, + "fixedInfoPartyV": { + "partyId": "D669ECBEFD111E8B081A6BCFB9F7EF52", + "ephemeralData": "7C4492E52DCA87AC8CBE2CDD632D0D5C595974A80E5066AE40A402068FF0BA900FED98" + } + }, + { + "tcId": 1670, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D1E0DB30C47C05E5C7C69444F9BBA56", + "z": "CE3A986BF9D97FE87C5DDD79433DBE3487FCA04FFA6FB7939DF7EBE670A6B6EB30E833", + "l": 1024, + "algorithmId": "29ABF62101B8B778ACE5C7A9DAB959E2" + }, + "fixedInfoPartyU": { + "partyId": "6BF8C6EEA4E8CC4D64B549B073C0C639" + }, + "fixedInfoPartyV": { + "partyId": "7CFB32FD1266872A580EB6A5F5BFEA85", + "ephemeralData": "054D28ED994F514EC1851BB20F93D87AAEE5436E86218DB8F4ADF5D908EAD789E088C1" + } + }, + { + "tcId": 1671, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9D5BD46A5127164D2557A23A9948C41", + "z": "D5B28228F969629CBB93A5450EE251DD604CC3751C4F5102F8EE4E885682AAB4127B6A", + "l": 1024, + "algorithmId": "A93DDB8A406C57E53F0E750E2066FAC0" + }, + "fixedInfoPartyU": { + "partyId": "E19C5415815282345B0B36BEFE89C80F", + "ephemeralData": "CCFF87C548A61252C2DA8746A7A24D3AAD0D799E80CFF5E526B9C7170ECD6C8767F85C" + }, + "fixedInfoPartyV": { + "partyId": "9BE2D2B33F75E57DF7E77AFAA34E4A89", + "ephemeralData": "D6010A307F0F9A12612AAA66BFB2692A54F603F65E60702105BC0B92FF2150BAACA7EF" + } + }, + { + "tcId": 1672, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEB4ADD1A4B5B5F15144FB082A85C58A", + "z": "DF82BBB80DC19E0140CE42E0DAED331B828122214F4A2FE7384405F1D7434655441932", + "l": 1024, + "algorithmId": "3D027E8212516F66DE6653B7312086DB" + }, + "fixedInfoPartyU": { + "partyId": "819366A7225CC3C42594EE46F6AC3A69", + "ephemeralData": "8CBD400A9B98ACE51D16C79E2C3B8A76E7E66AAC2C7F374353D5037713633F459B992B" + }, + "fixedInfoPartyV": { + "partyId": "3C7530438CE24119437F99D6299AE622", + "ephemeralData": "5E1B5C36B4DA89E45D13F80BDD11BCD0C609F27A0248396ACB2E45297DFD6CF0C50BAB" + } + }, + { + "tcId": 1673, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA1E5D89F4EDD2D597BE121EC100FE02", + "z": "18C6DE44B8E86C47977CDFD9F6BB31F0F507D84AFC1D6CBD69890502B1570B75BE7B60", + "l": 1024, + "algorithmId": "B348CF6079B0FDA141DC591A6D149DEB" + }, + "fixedInfoPartyU": { + "partyId": "1BA2D5B72A00A895BCFD4CAAA7D310E5", + "ephemeralData": "DC36CCCA71E051DF3160FF34A44A5F04391705A6DF25D11D966ABF8E95E585A5B92E67" + }, + "fixedInfoPartyV": { + "partyId": "B2842083C49E66E1EA183E2B60730DB0" + } + }, + { + "tcId": 1674, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEA9E12897BD7C9C55DB4650423F720B", + "z": "469186861CBC16519403990CFB06F4071FF2E59EBF8F7FFA18EBF3B7803BB401DE7632", + "l": 1024, + "algorithmId": "79D56ECE797030684454D4CD31587553" + }, + "fixedInfoPartyU": { + "partyId": "B21FBD0CD6E12E644F88F2CFC5D48F57" + }, + "fixedInfoPartyV": { + "partyId": "ED7391CF36A02FA6B167D27B2BEAA2C1", + "ephemeralData": "55C3E86E9C9418E7C228146CBDDC1AA6E4C4E50AF793882DB7DE97B76B15502D100E67" + } + }, + { + "tcId": 1675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10C7AC32F8CCE6DA5E48A6CC2F7A82B4", + "z": "F2E50366EF9DD218C5C8226F218973CF98CE028D475711E8EDDB5034258CECA82FA165", + "l": 1024, + "algorithmId": "DC89570258F6CA1222959FFE9F276B15" + }, + "fixedInfoPartyU": { + "partyId": "F53F9E824D5FB9F1DE465D27EFE12860" + }, + "fixedInfoPartyV": { + "partyId": "2BE587EBB2610CC72485BF80DB9DF813", + "ephemeralData": "B71D217A32052CE4505FCB5B68E016480B528BA89379427BC3B630AA2D7171DE2165E7" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 68, + "testType": "AFT", + "tests": [ + { + "tcId": 1676, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AAE51FC71744ED34536524FDEE544B12", + "z": "34CC3F7C1A2A65D8B8FBAB3D0AB27E010166E49A7F63847F0EDE2A5A6E", + "l": 1024, + "algorithmId": "0FD792120AC37535778479BA74D0804F" + }, + "fixedInfoPartyU": { + "partyId": "40626EF1C69201F867B79C198F16B06D" + }, + "fixedInfoPartyV": { + "partyId": "B73F91C3FFF596F1EA748A0C926F3351", + "ephemeralData": "67C20527A5A22560A25C0C2A1BEA0269C634183B114BC665E8D6CDEA12" + } + }, + { + "tcId": 1677, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CEE7D71A7E6C9D6546CC0A7DFE91E9C", + "z": "8978A644BD885CE42B2AFC7DDC8446CD310263576379C2F45FA9A8D7CD", + "l": 1024, + "algorithmId": "5C9C8D390DD9AC9E18BD70427C982949" + }, + "fixedInfoPartyU": { + "partyId": "5D507B6F5BA8FDF2E5623F7DBD20A615" + }, + "fixedInfoPartyV": { + "partyId": "4A4E1AEB1F7AE930C480F4CA61830922", + "ephemeralData": "C6E7564CF8A0B14A28F59C21522B0B68BBCF5380EA9FE48DB44442B04E" + } + }, + { + "tcId": 1678, + "kdfParameter": { + "kdfType": "oneStep", + "t": "143CD7B0C744EDF8FA29AFE27051045B", + "z": "CDC0C327B1397E3A23462C0DC996E27FAE045B121EC63E7C69CAC84C9F", + "l": 1024, + "algorithmId": "3F69A32EB95E4EBE4E8411ADBC21DBE9" + }, + "fixedInfoPartyU": { + "partyId": "54D0518AC5DFD59FDBE11A4A12E79DBD", + "ephemeralData": "804D372ABB006564F1747461F97DB842188ECE65F1F5ABA3FDAD0A794B" + }, + "fixedInfoPartyV": { + "partyId": "13B4581C3CFABF1FB54ADB8CE5AEE898" + } + }, + { + "tcId": 1679, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AAA05183A683127F58259991434822FA", + "z": "996F7BA760417793AF82696C89FC8AA5D2AE1DAAD53A0980CAA0F53B84", + "l": 1024, + "algorithmId": "BA012A1715B6B345B2851C81FBFF86DA" + }, + "fixedInfoPartyU": { + "partyId": "7CE66D0D1979EF6034DC900B12F42EDF" + }, + "fixedInfoPartyV": { + "partyId": "99052340B4C3F1FB1EE8171D8787DA85", + "ephemeralData": "7F189E10F40B17C212E8A121EAC59125A168EF7C29C7AE14C79C297BF6" + } + }, + { + "tcId": 1680, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BCD24FD6498429F5D46C607AACA26E1A", + "z": "744CB9589D5963EB5FD04FBC466D372B1E9D01CDC7BD69F5364F5808BC", + "l": 1024, + "algorithmId": "227B58D0CA1A17F9E55EF975AF2D0AB9" + }, + "fixedInfoPartyU": { + "partyId": "5FADE4E40424EC2C00C80E5D45AA0E15", + "ephemeralData": "CB2AD0196D6F1DC15756BEB2481C3CDEB1FEA5D15D0200190317F1C9B6" + }, + "fixedInfoPartyV": { + "partyId": "233C0042A9F4125D5AEFA2CDF9B5077A", + "ephemeralData": "ADCAA0EAC24C3BE305EFC9E237D549E9A982ABF57708EF319CE8E70E7A" + } + }, + { + "tcId": 1681, + "kdfParameter": { + "kdfType": "oneStep", + "t": "255ABBD45D418E4A6385C9EBCA62151E", + "z": "5F80B6F35ED08EFFE2184B34573CE4779F6FEF0F209F22AB7626058182", + "l": 1024, + "algorithmId": "03B433F3856DBB2A554AA00F0156E399" + }, + "fixedInfoPartyU": { + "partyId": "D9DBA9C3F2738D8D2E710247616E81EC", + "ephemeralData": "25D8A7CA0D7274570E808D3340A1F483C834F3824341709F0505A9D3C4" + }, + "fixedInfoPartyV": { + "partyId": "7E80041FFEE2E75AD7E32E49F6B3551F", + "ephemeralData": "82AB4BE5CA11547F3E3F2D241B97F83BF7365E6D06594E7682507E0AC5" + } + }, + { + "tcId": 1682, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0D06AAC85E54274274849251046AF0B", + "z": "67B2E88270C65A48E6DB3F586322E2A33ACCEAAC7F31AB811764D4760A", + "l": 1024, + "algorithmId": "E49FC5B6EBB629C804704CF55CAAB90F" + }, + "fixedInfoPartyU": { + "partyId": "5E7890140389CC3BF13FE1C6595D57EA" + }, + "fixedInfoPartyV": { + "partyId": "F99994F30E1BC10AF52A5422C360D0ED" + } + }, + { + "tcId": 1683, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42BC1A4C35387F7075765A30D1303248", + "z": "7C326ADA0A56295D4584C10E7945A722B6262686097ED43623EC555FF9", + "l": 1024, + "algorithmId": "BB97007AEDAFA6438A2CB4B1DA5080B1" + }, + "fixedInfoPartyU": { + "partyId": "34A9C8B25D1197ABAB1AF36DEA293DF7", + "ephemeralData": "26AF77CD998C2F493CFD481202A2CB49E1FE369BFD38583EBCF2D74DBF" + }, + "fixedInfoPartyV": { + "partyId": "E45870B1D0FF3A895B1D1BBA227F9593", + "ephemeralData": "2C48D77847AD2D26DBB6066911A8C7EE584A1D76133761B5AFBA464EC9" + } + }, + { + "tcId": 1684, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D82ADD6455E396B6EBF66603F8569E5", + "z": "0CA6BF3A3F38483E20FD7E6A159C37FC4DC191078BFAD3F11DE3A2D88C", + "l": 1024, + "algorithmId": "F6D44AFC759EB20530CE6BDF2AA8FF9E" + }, + "fixedInfoPartyU": { + "partyId": "D558B38B96F3D8F1A823E95030575988" + }, + "fixedInfoPartyV": { + "partyId": "2C32E3A36A8F4D2C852F6B30C1026F20", + "ephemeralData": "3E949B24AB27ED584AA44F1A4162F08A95678A9123F41312FC9139AE03" + } + }, + { + "tcId": 1685, + "kdfParameter": { + "kdfType": "oneStep", + "t": "275EB0F43B7E03A1A613792154B80DAB", + "z": "292EE209F0FE4FE5C59DE3BD231F11C927B1B6AC6261F9B4846728CEF3", + "l": 1024, + "algorithmId": "C88661DB567F5826C487A83283B00378" + }, + "fixedInfoPartyU": { + "partyId": "C374F15614F6431F390D6358FA76CF4B" + }, + "fixedInfoPartyV": { + "partyId": "CAD27A762A7F0D61C0CC37175EF1D87E" + } + }, + { + "tcId": 1686, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F76B9AF6E273A8691AABCAFFB17A357E", + "z": "241035F6FE0F307BD3501659D7CD7D853FAF6709BE94AA1DF9031CAD74", + "l": 1024, + "algorithmId": "B3F9413661120D26EA3E97B89F11A9D9" + }, + "fixedInfoPartyU": { + "partyId": "63F6F3E68B60BAF52489EC1AA18BF45C", + "ephemeralData": "C5B59EE1A9F499240DDB15626F9AE802050C7DF8231A849C0AA52AE3DA" + }, + "fixedInfoPartyV": { + "partyId": "0BF3F7860757517EE5521B02AC3A88ED", + "ephemeralData": "D3BD11F1B495E6026043703655CFFE28FC354AB5ED87E09076F078B8F0" + } + }, + { + "tcId": 1687, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FC47BD2CDAEE31C9F5FD9C5AE52B19F", + "z": "10B4CAC9F2473025877CA6ED1BB201EC500E675F54D4C0745739C35AB9", + "l": 1024, + "algorithmId": "934A89ABDBAA11A30E31BE98E7695220" + }, + "fixedInfoPartyU": { + "partyId": "72665A7EF12A3C10C550211A4D283B63" + }, + "fixedInfoPartyV": { + "partyId": "0BA98D477C2A940848D5E5B2FBE2304F" + } + }, + { + "tcId": 1688, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5DDC8BBC8D1E4F2D4EC5D28A88ACDA7", + "z": "22244FC58BC1328E2D137EB6487C653FBBF6A408F330FA99456EE3265E", + "l": 1024, + "algorithmId": "59AFF4264D44F808AC20F3094299781E" + }, + "fixedInfoPartyU": { + "partyId": "B81FB559D20E144011FFEF8F1B40F157" + }, + "fixedInfoPartyV": { + "partyId": "D64980E321F3CF88C9490480557FB319" + } + }, + { + "tcId": 1689, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5912158F5F697C50BFE74712E90A4FAA", + "z": "1AB496A53ECBA99E83CBD4CFBC84E34C2355A314B21408B23CCB84F26E", + "l": 1024, + "algorithmId": "BACD164FAFD6B88922B18431E6652612" + }, + "fixedInfoPartyU": { + "partyId": "A3FE36F646F87D01915C407DA5739352", + "ephemeralData": "84DB52BAF3860CA6B0308060F9531B978DB948CFD64741BFA2E498039B" + }, + "fixedInfoPartyV": { + "partyId": "1470A75E31D3AF351C930AAD28AB688C" + } + }, + { + "tcId": 1690, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22AB39EEBBD2DAA811B29EE8989C1CB2", + "z": "C2F78A866F3BE0C92DE044AA54C6225EFE26C9F8192011FAD904E5ECE5", + "l": 1024, + "algorithmId": "9FE0328FFE3FDF2E36FD94D2329821D9" + }, + "fixedInfoPartyU": { + "partyId": "D5F07E7B0BB8C6DC4DA2181C33F54841", + "ephemeralData": "D48CE477787F45E1F3D4AFD85E196F5295A90C1CF5CBF443670CB84A13" + }, + "fixedInfoPartyV": { + "partyId": "96FB27680004DAB63F3F73E466EF4AB2", + "ephemeralData": "D3ABFDA8D930DEB1431CD143F6675FEF93380431970040A61CF1487446" + } + }, + { + "tcId": 1691, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74CD4B6C9022520FDF20918601192E94", + "z": "9C085FB0E83F112CC3348CCA3D470FA1624ECF9C1C87B92F8A720D5273", + "l": 1024, + "algorithmId": "8189AC0AA3B84968D157BF5A6F8F09D0" + }, + "fixedInfoPartyU": { + "partyId": "C1EAE4927564F7179EB830447C1D65C6" + }, + "fixedInfoPartyV": { + "partyId": "B1CFDA89CE4046B099BEA152DA436E7C", + "ephemeralData": "CF78E994E35EC374C2C5F133167D274831BE28D326A956711ED2B23755" + } + }, + { + "tcId": 1692, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13B65FF826D91B68FE501DBEA537115A", + "z": "9E0D38C82CE034DC57895F50A46973BDC660CC9FA28E92F9C36488C5EB", + "l": 1024, + "algorithmId": "EC0857F1B676179F3BF27828A0C67DFE" + }, + "fixedInfoPartyU": { + "partyId": "501F02A87E6128A4CE2BCB63613F43CB", + "ephemeralData": "0BFD28009A48F263FF8D5CD7F085C1FB37A7910EBB2C00A78270A7AA37" + }, + "fixedInfoPartyV": { + "partyId": "9ABCA7343E9C492D658D903D9015DAAE" + } + }, + { + "tcId": 1693, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15EECF2E09D2B189614F1AAFA826293D", + "z": "DEFBCB24A00B7F36C7E0A7DF790FB5299ED9813B288FE74A5D3512B961", + "l": 1024, + "algorithmId": "A8BA802423D1B52A6A5BB1AD5486F026" + }, + "fixedInfoPartyU": { + "partyId": "9873809641F24B856D6AC1BBC65A3B51" + }, + "fixedInfoPartyV": { + "partyId": "EC7E3894073A2B4D0E274F8FC3FB5FC2" + } + }, + { + "tcId": 1694, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E750156256A7891F89871EEECEAAC0A4", + "z": "FA22D5BCDF19495CEBC07BADAD39895FF963F0BEAA35ECF3E06E219094", + "l": 1024, + "algorithmId": "A86259D6A52A8377CFA4A1ACF5456638" + }, + "fixedInfoPartyU": { + "partyId": "2D302474D4B1C8F43746104332626D4D", + "ephemeralData": "EBC9E4B902434EB6308E515C3BC91D238F084638FC909AB5A96DFFBF8F" + }, + "fixedInfoPartyV": { + "partyId": "FFD847A1C8B7A48C22162DBBEC183776", + "ephemeralData": "C599B8AEA707F6D31B2E0085A4D0D0EF6BBC71D8F29EDFC7390A93A464" + } + }, + { + "tcId": 1695, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F07F1D05EDF4F70E8EBBE544E196DE9D", + "z": "7C59599C185FFCE2BD086F554B07382BF7A20CCC885A59C1A1EBFCB454", + "l": 1024, + "algorithmId": "72782B783EBA760DE9D17151682BD444" + }, + "fixedInfoPartyU": { + "partyId": "D877593C84DBD08C2EC3EAC9F6EFE4E4", + "ephemeralData": "849385BFD875412DAB1DE7A4DD006804D29DB8713376AEB0A1ECBFE397" + }, + "fixedInfoPartyV": { + "partyId": "0B78967F413442909A7505FE86848981", + "ephemeralData": "DCB3614D65F2FFD41633E7B2F21A2AE21449A2696EBB90B45F8473CBB9" + } + }, + { + "tcId": 1696, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A498B8915130F0B55CC203616FFDB04", + "z": "AEE1A8382E9A95B48413A97C73E62799C59DA9788F68B14E080CE392BB", + "l": 1024, + "algorithmId": "B0A8E0446945D17D69FBC2F1B38DFBBA" + }, + "fixedInfoPartyU": { + "partyId": "76BE869729B5A89CFDB1ADAB87F2E0E5", + "ephemeralData": "E9F3D4D7E975EB1915B697A9B9CFA6CFDE49FC061536E20CA22CE87190" + }, + "fixedInfoPartyV": { + "partyId": "B5A7955110D34381F936A8FF23D62EEC", + "ephemeralData": "A6C36637D66F27DE2525D8294CEE38CB4373857619C027DCDE590FD8BE" + } + }, + { + "tcId": 1697, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8733B2E24B6CD7AB257981DF813C2C3E", + "z": "088003CC3DE5AA775A9A0E5D8C746A3246D22BBA40C9C764A71FBA7CCE", + "l": 1024, + "algorithmId": "FC0DEDE388F720FAB6BD7457AFF2B666" + }, + "fixedInfoPartyU": { + "partyId": "5524407364D954ED3366BA70ED48D472" + }, + "fixedInfoPartyV": { + "partyId": "4760DBE2D4D2562C98A384BEF76D79DF", + "ephemeralData": "5E94644354A44FB310138AED968F8636E73635089F410378D6E5E3E6CE" + } + }, + { + "tcId": 1698, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4CC21A8532ED8F79D98923CF073540B3", + "z": "2D36DBF9C08B34AC879414F3492E58059C8ADDDF1E670EA914ADE07B16", + "l": 1024, + "algorithmId": "5A711C92B87502EECFB11AC654D24AAE" + }, + "fixedInfoPartyU": { + "partyId": "46EFE9CE320A45C43B17A22940D34A7F", + "ephemeralData": "610AAE85F24163724909959E39D7CD1AEC554669C42D0691E8BE36733C" + }, + "fixedInfoPartyV": { + "partyId": "D0386412CDB9976E0067BCC14444C3B8" + } + }, + { + "tcId": 1699, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3DDD30AFC27CA2ED91C2708486D86FD0", + "z": "9BEFF304EC8CF0B91C7C2D208AE6A29B8DD9D80923E12743633452BDEC", + "l": 1024, + "algorithmId": "BA5B3645BC3508F481531791E095AFFC" + }, + "fixedInfoPartyU": { + "partyId": "987A63F7478D5726E488D0F72BC4D290", + "ephemeralData": "34A0C9630219CA95AE1437924537505F47C5CC322061028E3895FF5204" + }, + "fixedInfoPartyV": { + "partyId": "BB9DD7CAC1435805EFA1FF03F4755625" + } + }, + { + "tcId": 1700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3912B055B8F9F547FEFEA70AC39304A", + "z": "C351C7850D8C955E42B9267297DD262D628A819CC65FB46E2AD5C3CE02", + "l": 1024, + "algorithmId": "9C4C36A8439D3E976FD952F01C04FC76" + }, + "fixedInfoPartyU": { + "partyId": "68D4E6D97CDB727772D941B9AC6B697D", + "ephemeralData": "3D4A00206B4DEBA8DD1532489C62A6A5C83739A3A1D70493C3B178271D" + }, + "fixedInfoPartyV": { + "partyId": "A09E18D567D6B912D8A067A723C07869" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 69, + "testType": "AFT", + "tests": [ + { + "tcId": 1701, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10540718B60220041CF00D46411574D7", + "z": "F32319964D8321D3EAC603BEAFD1E2054D66AF41D9C10869DD4B0592E0B9BA4201E9", + "l": 1024, + "algorithmId": "1EAC9BE170037820AF038541D706B710" + }, + "fixedInfoPartyU": { + "partyId": "52DF2A5AE8A369F610E2F665F158DF86" + }, + "fixedInfoPartyV": { + "partyId": "E45046FD81710DCEF43F42393E7202CB" + } + }, + { + "tcId": 1702, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E10051BBB5D3B5C512BDD0ABD5BB19B", + "z": "E336115BADAE4D1DC60F7105905697A57C2E386820C786F86BA84572D5AA2285544D", + "l": 1024, + "algorithmId": "19E2C8C5A732461677690B8979183B4F" + }, + "fixedInfoPartyU": { + "partyId": "24D33C8AA5E59E15163FC56EC0437159" + }, + "fixedInfoPartyV": { + "partyId": "4FE60FFA9724B7E412144FBDF8785F9E" + } + }, + { + "tcId": 1703, + "kdfParameter": { + "kdfType": "oneStep", + "t": "705BFCC9701B8801175FB54E3D5E1360", + "z": "F1715F24021A9100F0508C390AFB7EADF2B74A6883D6D5D911BA8B904938BDACA714", + "l": 1024, + "algorithmId": "2B106742D861CD5CEE7235190208AF41" + }, + "fixedInfoPartyU": { + "partyId": "D1207E4189DC3C83D28316F253BB9AC4" + }, + "fixedInfoPartyV": { + "partyId": "6479EDB871FF49476D206E0974DC4FD7" + } + }, + { + "tcId": 1704, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8178345C5CC627A5E21508C2449407EC", + "z": "78EA7DDF8E6FB9FE6E7AAE7497BE3641A6F2361365FD4232EDA199C1E1DCD7075F29", + "l": 1024, + "algorithmId": "ED7DAEEB22F962B13CEA35E0A45190B6" + }, + "fixedInfoPartyU": { + "partyId": "8F1340E5D3D6D4A2FB450A11A6A68CF8" + }, + "fixedInfoPartyV": { + "partyId": "58B40D132A08E36D5C59EA92C341F2B6", + "ephemeralData": "5F7B21C78FD13D27A3494CA265B4A88A2924DFA5BE89A7D79FF4C2F036954C8F866C" + } + }, + { + "tcId": 1705, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27C67892B683CC308E74F20CB39EEFDC", + "z": "8C8978817B1600180AACCD517B3ACE1344C8159E0680EB6C0AE84E18CF5E2EFAB0A5", + "l": 1024, + "algorithmId": "A3BC2D9C28B44FF014329ACD489921C0" + }, + "fixedInfoPartyU": { + "partyId": "6E2E290E888602CA4FD60D448D33EC82" + }, + "fixedInfoPartyV": { + "partyId": "62F4886C3718B654822C5E2AEDF8644E", + "ephemeralData": "1A25927A5D18BE57F00B068D589E9013328CA8D1EEFC23474FB1EAF805FF3AE1B183" + } + }, + { + "tcId": 1706, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A2088158FCD1D6E30BC56A9B204B92A", + "z": "C67FAFC392DB979EAD341677399BD37BDE4DD58E3E4DC5BE6395439FBF4A14C71CC1", + "l": 1024, + "algorithmId": "274F247E1051A038D921A8B40CDEF06C" + }, + "fixedInfoPartyU": { + "partyId": "F78E30E3F797461DC01A6ADC3B5C624E" + }, + "fixedInfoPartyV": { + "partyId": "450F9F036807219CE0B0A587EE4D0D37" + } + }, + { + "tcId": 1707, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40B787926C5AD9A488E137E131D6576D", + "z": "97761F0FE8EBC64A30B0D71D6B8B37F25213FC737992CC45372EF385519211EBF2E2", + "l": 1024, + "algorithmId": "F823EAE4CAD72EA6A15445A0EFB9920E" + }, + "fixedInfoPartyU": { + "partyId": "5E662AF615F2AA02E3D21B6512FFF1E7", + "ephemeralData": "8F8C601F3A9BE57369A864D7EC00FD8292FB5525274608BE07626113D477B47F9540" + }, + "fixedInfoPartyV": { + "partyId": "BFCC82BBDA131403B0EB1C70E2F78ACF", + "ephemeralData": "3EDB19F1AECD51C2E950126521185E9B58B77B5EE728C62E610D0C1BBD535860E498" + } + }, + { + "tcId": 1708, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5DB41A8573265678C7E950BA7E2C2CF", + "z": "AD2D0C5AE9307E64170BB96032339FFF89507CE6735F01884BF97001749D8717C4BC", + "l": 1024, + "algorithmId": "0FB641194E63084D024163E3CCA4894E" + }, + "fixedInfoPartyU": { + "partyId": "B57EF42C7C0CC0AD71C05B712E295491", + "ephemeralData": "E27BFF70EB8EAC9F85C2DEA417215392E2B2D47CF0103F820F857C5E6489813C411E" + }, + "fixedInfoPartyV": { + "partyId": "A790CF9D313D4CECB2CBEF072BF0CA3B" + } + }, + { + "tcId": 1709, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E375AB20D77F335968546270EC21578", + "z": "2CA1DC35CF470DC39B3B58D6C7BBDA1DFBA4C2114F78C1A1FC7C16E4CCCFB0065AA6", + "l": 1024, + "algorithmId": "74D1B5EEB5CAD937E7DDBE01F831C09E" + }, + "fixedInfoPartyU": { + "partyId": "B5E2E51EC3A42A92AC30ABA421AF940E" + }, + "fixedInfoPartyV": { + "partyId": "1FC4C7ACCFD7083475AE83DEE25D3DB6" + } + }, + { + "tcId": 1710, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F298C101E8330EE29DC87501C97A8AC5", + "z": "93924F4A1CF2209403A42495D7B62EC303FA98DF499998AF3721FFB23552D5D31F83", + "l": 1024, + "algorithmId": "58BF4F2B15852B114B05262E77A06D99" + }, + "fixedInfoPartyU": { + "partyId": "9B2E990430C5C9A77BD88F06EA7C0B91", + "ephemeralData": "2F57F2FBFE745ECB2F3B5633FC101BD3B705065FED050C91A04E30AE8AAB3B6AFEFD" + }, + "fixedInfoPartyV": { + "partyId": "2A65DCA26E46EFB8B9CD81E55728514C" + } + }, + { + "tcId": 1711, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E72DAE00002334D9F0C351452E230F3", + "z": "75BB06C9123C07D6D708C96096CD6F4ABB75DAE0965440D2371557D79971798CB4ED", + "l": 1024, + "algorithmId": "480E0BC418132DE0AA133E3A247615FF" + }, + "fixedInfoPartyU": { + "partyId": "2852B64BCB63DC3C8A5859D7947E102B", + "ephemeralData": "8614B4208B3C6583594216F0E3E05BCF6BDE85CC6D031AD0C29A71C35456D0039025" + }, + "fixedInfoPartyV": { + "partyId": "46976F397088973D22BBBCD4A5B875A4", + "ephemeralData": "1EF5CE1420D28E59A6BEA0139739CC56C97C061BA10E355DD0FC8DECA041AACC824A" + } + }, + { + "tcId": 1712, + "kdfParameter": { + "kdfType": "oneStep", + "t": "84B51E091D97148C4C585082937EF30A", + "z": "95219DA9AE217A413A5DB9AEFB9C47EFD3ACC3D2D656C9197E656C0BC89181A2EDD4", + "l": 1024, + "algorithmId": "BD41E8D1F21AD7BCB3CCB98ECD86B50A" + }, + "fixedInfoPartyU": { + "partyId": "D442B5F58F37042E11E7422BBF46E41D", + "ephemeralData": "3D4D388B45CD82AACC8A5FADA8EC7DEEB9C1A87BD4B64B91875624E93ED9E86E2E35" + }, + "fixedInfoPartyV": { + "partyId": "E6BB2F78C656BAD49B5DA543ACB36F73", + "ephemeralData": "11E7C67A54C309F3D3511F487514F50C6079FE58FC115666940C5D0E808D855754FB" + } + }, + { + "tcId": 1713, + "kdfParameter": { + "kdfType": "oneStep", + "t": "975928760E2297500CFE3D2B5882DEC0", + "z": "4AA64BF33093CAFD64A7B5CAB5D8BA2AEFB732FF51E58358CEDE9024E42D4D642437", + "l": 1024, + "algorithmId": "9B74D70C9AE1FF74693EB6614E70A5F3" + }, + "fixedInfoPartyU": { + "partyId": "F098FE277AE55D7AF2B9DC6D2673E762" + }, + "fixedInfoPartyV": { + "partyId": "DD0CDBADFC59E6C9A6AE5A81BF9FFE87", + "ephemeralData": "8C9DD881CCF560F5A480C48DE08A074C6BDAA331FE3C2CD06D3BE6004E8191BF17EF" + } + }, + { + "tcId": 1714, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CFE45D2021D19B3F14E363AD72F83FA", + "z": "E7ECFD1013C89B8CA7C24E2E5BD0D864CC3CECE3B54C1F8D710C74B2AB932A4783DA", + "l": 1024, + "algorithmId": "4387FD851E54EB42E215E5B540981084" + }, + "fixedInfoPartyU": { + "partyId": "3136FEA52EA9C9CABAD04EB05CB50243", + "ephemeralData": "4D97658E0193A464901508151BE036E07164329060F9AB161FEB68F9547F9C25E105" + }, + "fixedInfoPartyV": { + "partyId": "FC1968D10EB92FC4F4BCADC44BC71B0B" + } + }, + { + "tcId": 1715, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BFCFD498EB4EC48E7ECB6131A0BF8E4C", + "z": "5631F21CA13C2EB4BB51F8D7C5617F4DB50CBFFB6A3E9954A13B3400870D4B018FC7", + "l": 1024, + "algorithmId": "B20A67B4A21601C6B48C8BF343391C59" + }, + "fixedInfoPartyU": { + "partyId": "8FC92440320C8F658B8EC5A5BE6524DA" + }, + "fixedInfoPartyV": { + "partyId": "6762859AF8D2D251FA09B7015D5087E2", + "ephemeralData": "58CBAA09CB92BBF354C35C6CD8F8E16A3AC2AC65907B1EEB4860D6F187104E5AD790" + } + }, + { + "tcId": 1716, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8245FE42A691D8CA1B592297376897AE", + "z": "A79FFCEB9EC0C54C09022FD045AA9C87525CE2A782EDA22094A939EDFC41F5E53572", + "l": 1024, + "algorithmId": "8F3930F55F29E5FB2E45529D17255C52" + }, + "fixedInfoPartyU": { + "partyId": "AF30482DB702038E2EA9B14E434BC0EC", + "ephemeralData": "55119404DC4B2CCDB77BF3D6031896E795460223A90A7828AF37F2B5652CD7A976F0" + }, + "fixedInfoPartyV": { + "partyId": "B4DF5A84B680011651955AC0CFF586FA" + } + }, + { + "tcId": 1717, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A7A9D621DAC289F79138E2063F20BD3", + "z": "69C09EBDEEE9584F0B3B9FEFDAF1628CCF2DE54B91BA990A99B72F82262B2D24F521", + "l": 1024, + "algorithmId": "DF435014F7943A3C1F0C9581EF844F2E" + }, + "fixedInfoPartyU": { + "partyId": "C6DD0EBF7A8387ABC389ADB3162C1FD5", + "ephemeralData": "FF227B414CC11C682E2ED8DE1C16B82CBB50D96CDCC8452AD620F184054738181092" + }, + "fixedInfoPartyV": { + "partyId": "A117ABE27E5FD69325A81A8E30A88D2A" + } + }, + { + "tcId": 1718, + "kdfParameter": { + "kdfType": "oneStep", + "t": "285EA939D5021632F07FD856F39F6031", + "z": "467641A29A19D563B947CF72A36BD298B9204D9740CD19BD4831904EDCAB3081BD5C", + "l": 1024, + "algorithmId": "D80EA8395A6ED4EBDB701CEC96A9C6A8" + }, + "fixedInfoPartyU": { + "partyId": "B57EF122651A0DC20E11542DDD267CFE" + }, + "fixedInfoPartyV": { + "partyId": "A37BA696767979F1E8B14BB8BC8B107F" + } + }, + { + "tcId": 1719, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3E78BEF4DF8882BC9B79B764C7EBCAB", + "z": "3CEA2D64D9809F31763C88B5395273FE19DBC373D4DA489F769B8483C3B1D930F0F7", + "l": 1024, + "algorithmId": "DCA57C2F34FFD2B8532778285D3FF423" + }, + "fixedInfoPartyU": { + "partyId": "351456EE6FFBFFB0FA38E72BCC4B3F3C" + }, + "fixedInfoPartyV": { + "partyId": "5D7212C203E3923B9CA73ABE70748CD6" + } + }, + { + "tcId": 1720, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F50FA16236EEC384446B5A1D63EBEDE", + "z": "3460AADA6A5136A31F6C87B79FC21F1F36867817CCEADF63E8FFF27EC23A3293A1C4", + "l": 1024, + "algorithmId": "E41B194999A4B1A4F18DC023DC64B33D" + }, + "fixedInfoPartyU": { + "partyId": "F6D56B596652B8D74C401BA9E985A7D4" + }, + "fixedInfoPartyV": { + "partyId": "7FB80E95A0471F1BC50CEA25AD31DADF" + } + }, + { + "tcId": 1721, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC511AF414A9F66750A2EA79B8BB9332", + "z": "FF5BAC964D99344E5BB263D141BE62510CC58A8C9DBA9A7968B417BDBCB31FD69763", + "l": 1024, + "algorithmId": "869FBA8803ABADC68B61422BB6AB554E" + }, + "fixedInfoPartyU": { + "partyId": "1E6ACA9608711104A4D675D280E4F0A0", + "ephemeralData": "FE7ACA84C4A9F2C03C1A8CDC3944A59BFCBA3ECDD1667E886E586D72C522EDEEC9E8" + }, + "fixedInfoPartyV": { + "partyId": "CAA43F9D254D077A13712A7E116DE3AE", + "ephemeralData": "E9DF4E819EF43FD4BF3134707EA9D1E9236803BDE993C38005E5D362EDAE0A78CECD" + } + }, + { + "tcId": 1722, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB4A8E1701C80D3FA2546EC69058E372", + "z": "72242EEBC26ED96949F20017F5D40BE108E54C02939366DDAB9E5A76AECB5F7BDFA1", + "l": 1024, + "algorithmId": "8D15A1328A1D6FBD02C437E6A8EB476E" + }, + "fixedInfoPartyU": { + "partyId": "7C0AAC0EED901AF1FD6DC3C2B52652E9", + "ephemeralData": "A6F2CFBC3B0570FD03D69E1E453026B0A92042AFC0DCEC9C45826D7BC7ABD63EAC0F" + }, + "fixedInfoPartyV": { + "partyId": "ABE05A1511D07D3F48AB8A3D9BE582DC", + "ephemeralData": "4D598FA2EEC5CDA006E87A256B845C2DE336F9CD8847670ACAA7FFA08EC9EB565A02" + } + }, + { + "tcId": 1723, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCB04756784464B9715F4C009A911099", + "z": "1E294E411F04D2ABEFE7AFF48BEF257DE33D59DBD56FFEEBC6D3BC1B7B40CD66DE91", + "l": 1024, + "algorithmId": "1FFE702FD3EAD99598974837656147FB" + }, + "fixedInfoPartyU": { + "partyId": "EB89E40261603AC7D4F41DDE31095142" + }, + "fixedInfoPartyV": { + "partyId": "D49C85B3B849CF51E5B7E905DC8AC972", + "ephemeralData": "B08CC3B4141BAB4E8D4C51673C429E85CFE41949C7EC854EBAC31B315F050B508993" + } + }, + { + "tcId": 1724, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A6F153BFFBDDCA88A50CED604583511", + "z": "1EA75CC43D4CE2ED56CE99ACF9C5634E05D0960CC27956D7F10A6CACD46734C42B3C", + "l": 1024, + "algorithmId": "2BAA78DD4B681671003C09BF96E11E67" + }, + "fixedInfoPartyU": { + "partyId": "26D0E610FAF7E4FAEC883CC475B3B10F" + }, + "fixedInfoPartyV": { + "partyId": "AF7B2DCC20C9E611662A7F42850BC635", + "ephemeralData": "B44B7BB72ECBBF56B20F8931CC989B958E0F25120745D3A2C7FED8DB11415AE25BB3" + } + }, + { + "tcId": 1725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7030B4C3AE1A35BD20AC583826C4B516", + "z": "CAE27ECF56DC8B61A734884C0F15B9668D4653D7D8D09EB1BA36E33119FEA030D9A2", + "l": 1024, + "algorithmId": "73D8F5F04B3B12339205F6C11FC8E0E0" + }, + "fixedInfoPartyU": { + "partyId": "C65EE5500EA67EEFE184FC7538C417A8", + "ephemeralData": "EF152D7C5726E2CE1F343569180E8EC02F06BB33EBDF07A5B7566BA88C935B764E35" + }, + "fixedInfoPartyV": { + "partyId": "5273930FD9DF441ECD1C8B156E6C2F99", + "ephemeralData": "0ED36E3B0F5A5624F94072351A974E0351F0F2773BFE44C6BD742740E51D59389EB5" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 70, + "testType": "AFT", + "tests": [ + { + "tcId": 1726, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12E249981A4947D293EA03856DD92F0F", + "z": "FA403E434DDBDE102A3AC94B1BAABF1C99C4C33274F8C0316D544C7687DFA15F7643D142", + "l": 1024, + "algorithmId": "10AB9FCB8251259774F85A720C5D351E" + }, + "fixedInfoPartyU": { + "partyId": "D4E7D54F12627CAE39F6524F6EB1345B", + "ephemeralData": "48FAC806F73BDB2867CE6C70C9CA495612FE18FD7FF22907709876B467952B282782F648" + }, + "fixedInfoPartyV": { + "partyId": "BD51927053A6C85EDB9A061B0833D3BD" + } + }, + { + "tcId": 1727, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C58A6DEB6533D2A9E60DADCCAC7E27FC", + "z": "F57C649C37248BE6A9F99E4BADA0D3960AAA5F6376B7CCFF72F790564325073A17053291", + "l": 1024, + "algorithmId": "387393270D2927A510F11A7CA384585A" + }, + "fixedInfoPartyU": { + "partyId": "8B01BD1ADDE69AB53C563A01F4FE5B8D", + "ephemeralData": "361D74998A298E1CB7B0F8647C5C09B56108E8C2509BD5BF6BCA5D7C0E9CCC5791BE2E7F" + }, + "fixedInfoPartyV": { + "partyId": "D5588D4BC5F5D18BDC85E6618E3663BD", + "ephemeralData": "676E9054368E6BEA0393F07F84CFFF79B25E9265B84BD14034EDF1E51C5F2D41D1760D2A" + } + }, + { + "tcId": 1728, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A02656755469A8F319E237F9E1CA7A1", + "z": "26B7E497286DF47F1B0F0F95E765C257A3C2745A3115DB07D1E69485E81402B197655E62", + "l": 1024, + "algorithmId": "93A16384195F998ED549C5B59F40330B" + }, + "fixedInfoPartyU": { + "partyId": "F3FA1484B329CC3DEB1834929EE209FD", + "ephemeralData": "C138857AF96A965BE5C9AA7AAA221023925134EF24223ABD269169F9F2A2027EF89F235E" + }, + "fixedInfoPartyV": { + "partyId": "E0958F069180C486CB98AB40077F2D17", + "ephemeralData": "051A508A00CBDE372AB5245777775249B4C10C610138AB98FE6397BC38D37DF5004E8060" + } + }, + { + "tcId": 1729, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96D14C3F115E327F303DA29E2B331700", + "z": "9EE02372F5894EAF36507E8E70F4CCA7BA9085ABF583E87CF17B88673E3CD6073798A103", + "l": 1024, + "algorithmId": "1E528440E3B94442C85F0D69D0AECC13" + }, + "fixedInfoPartyU": { + "partyId": "B96668AF97B34C2616C4F5DB29161AEB" + }, + "fixedInfoPartyV": { + "partyId": "07597F85FF198E058688A928AC36EE16" + } + }, + { + "tcId": 1730, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C80BE7BC0B6868283F515F2DB65BB39", + "z": "6988F619C8C73E72A98B52453363D344DD223D6F1C2862DC821B7C91CCB193AAB58069C4", + "l": 1024, + "algorithmId": "948FE7D34D029A8643FE282F0ED63B48" + }, + "fixedInfoPartyU": { + "partyId": "3D50995D20A773F97549990AA5EAD966" + }, + "fixedInfoPartyV": { + "partyId": "D9E56853B5535A070757704D06F0C8A2" + } + }, + { + "tcId": 1731, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D40CC4E8C515356B77B7CAA1851A5A2C", + "z": "14EF2F3D594B3A2061A8B4174D60A5C1869E8A5820CAD1BB618B8FD45AB5B21DD5557199", + "l": 1024, + "algorithmId": "C737098689034A1D34003697132CCF17" + }, + "fixedInfoPartyU": { + "partyId": "5E6CF46A99BC553F11B0C0A479AA61B3", + "ephemeralData": "1BB733EDCE2BF70EF7C20D4EF401E124DFF66CB5E18C2431439939540A68BD0810F41386" + }, + "fixedInfoPartyV": { + "partyId": "88B4B82F310DCE1786506F41A4AB04FB", + "ephemeralData": "326E58A34256C891FF80DD7A90B59E52C1B1E5706CFE56CB0E5CFB71FAFBC2FF12A5007E" + } + }, + { + "tcId": 1732, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2357A310FF8E38273447DC3C31158518", + "z": "112F0E3863F5E4D7B642F1D508BB98BF4A58BFFEEF529549274BE7BD91F36858938DB0D3", + "l": 1024, + "algorithmId": "22687AC203318F0705E365EE69261CE4" + }, + "fixedInfoPartyU": { + "partyId": "51009FE691EB1F9055748491AFCAD4ED", + "ephemeralData": "AA2B17A4E437D0B006B57866243BB9A8F52A0241653BEFE8F1D8BA3D2666BE84F43A630C" + }, + "fixedInfoPartyV": { + "partyId": "9CA42CB030A8639BC954896316681CF4" + } + }, + { + "tcId": 1733, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5733B73306698A1D8A49AB038CBCE683", + "z": "33E5570DA2AA5EA21B007B1A9CFA8077C64FDAFE426242120E9FC15C2B3A42362E76A545", + "l": 1024, + "algorithmId": "B837B1D92AAE415ADD650CA51D056347" + }, + "fixedInfoPartyU": { + "partyId": "58082727DA773A0B413091AC4081083A" + }, + "fixedInfoPartyV": { + "partyId": "5DBB01FC17FE881F42BB13DAABC4E06C" + } + }, + { + "tcId": 1734, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BECD7F79B352C4A79D04D1215F7326D7", + "z": "CFA0B33D4835CFFF12AD59B28BC4FE5421768BE885CC572AD18F9FD31BBD1114C93EBDDE", + "l": 1024, + "algorithmId": "2A871A8C7E710BC7AF8252D755F6B65C" + }, + "fixedInfoPartyU": { + "partyId": "EECBCCF84F723241828C5869C615BEDB" + }, + "fixedInfoPartyV": { + "partyId": "B777934769041BAB63BB16B3F8DF6AAC", + "ephemeralData": "A122FA98FB9FF918883DBE6259A728D6C049913F470433195DE67F4A4271FBB7B07629AA" + } + }, + { + "tcId": 1735, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74D05FD11C40F2C101DC9667F55874E1", + "z": "6EFFEC0209D09259048A7420625A63E1912BA67B650A20AD3A3CB399DE250F257516183E", + "l": 1024, + "algorithmId": "280B16863E61D268A1AE99F74C76FCF9" + }, + "fixedInfoPartyU": { + "partyId": "2BA0DBE8A154A25AB45B794ED10296FF" + }, + "fixedInfoPartyV": { + "partyId": "20C03732E207842085B054B3BDDA923E" + } + }, + { + "tcId": 1736, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E7D61B19761860DBAE2F52F1633B2D7", + "z": "2E3B857942DF484BAA1D65544FE2E9B28BC48EAF2AF7586134EE2DBFC11BB394930C8457", + "l": 1024, + "algorithmId": "FCB838B293A3F6A390E0AD312A1F3745" + }, + "fixedInfoPartyU": { + "partyId": "22E7378EB559AE06015671962468242C" + }, + "fixedInfoPartyV": { + "partyId": "1CDBBBAC4E767670962E3FBCA16E6BF1", + "ephemeralData": "5B3AC5987DF25AB3DFFB258D39E5708DCC1987A6BC61131C670CA649E19240F5A0268BFD" + } + }, + { + "tcId": 1737, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16CA35894E72349969FD33587F4AD07C", + "z": "69043B66463817659B6F2E3F4876905B142932D89EC0FB212A860FBBC1A2197F7EDE654B", + "l": 1024, + "algorithmId": "9E65F8CF4F51317BC266D7D009973D7C" + }, + "fixedInfoPartyU": { + "partyId": "5776D4749D47D2AD48C3892E631FE61A" + }, + "fixedInfoPartyV": { + "partyId": "F6E6C440D6A35C06A9513E95EFBABAB6" + } + }, + { + "tcId": 1738, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BFF52FEACB1C337888DE0909D6749C2", + "z": "D59F5AF58F74D12439BB5458944776085D9BCB66C7440A9C14CBB52C918F91FF6C461B72", + "l": 1024, + "algorithmId": "656DE7F112F6F5E1727ED6FDF2DCE674" + }, + "fixedInfoPartyU": { + "partyId": "3245E97F2DEC7814DA71D5BA306601A1" + }, + "fixedInfoPartyV": { + "partyId": "6A411F3C415A6D56D6AB13B1D3FC93A1" + } + }, + { + "tcId": 1739, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D450212BDB27C9F3274C73AA14B288AA", + "z": "C0C52F6E9F1F625CB3A691F4F51813C9F66E8123DF8B55CDB65A0F073463176C3F2E91D9", + "l": 1024, + "algorithmId": "A838C4519E03BEC14B3E847D9AB94069" + }, + "fixedInfoPartyU": { + "partyId": "A9B8473E9E5A95189B0C7D25933CF896" + }, + "fixedInfoPartyV": { + "partyId": "909E47BBEFA5D7B070DA4B3879C50A5A" + } + }, + { + "tcId": 1740, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F752FF407168ACDC4A3500B2B7E77EB1", + "z": "486EF481EB6652C5703F5E05E29AA1E22A87B4CB44466C5961D3A356CD31C41E943EB7BC", + "l": 1024, + "algorithmId": "7E3EA5002AECD4EAA7C42D1D1CA93AE2" + }, + "fixedInfoPartyU": { + "partyId": "8CA6236570F1D32C0E60194DED60AA67", + "ephemeralData": "DF5974DAACA10BCF6D31B58C40C8DC9A5420DDFDFD65DFE83C0308C084BF8E5C1C1B1428" + }, + "fixedInfoPartyV": { + "partyId": "4667728CF344D25C118C68A01B0B2C53", + "ephemeralData": "97A1275AA35CE13E71BAE4B75032B304D2D1AA858574625767B5B5525CA690DA4B4BDC38" + } + }, + { + "tcId": 1741, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0010E166B8F2278298B3CE7BA025AECD", + "z": "B754833C54042F81E5E1C8E9000F0998ED18E417128672F636B4EE53674B1448F5BB3CF2", + "l": 1024, + "algorithmId": "E16DB7F346834C356AE7730D63619DCF" + }, + "fixedInfoPartyU": { + "partyId": "81A0DFA00FA27D198C4CBE62B99977FB", + "ephemeralData": "1B188B828EA244D1256CE682BDDA8A5E4B9F17CF1E73F960EA24E565327F0CBA2CE86723" + }, + "fixedInfoPartyV": { + "partyId": "C7D1F12F83B9A227D8FD87196B408A6B", + "ephemeralData": "214D8DDA72DFF6E82DE095028CD73234D644B257E1D567954321615AA0D4AA2B8D996A35" + } + }, + { + "tcId": 1742, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE083FDB414E82E4CDCCB20F3534921D", + "z": "180FAFD9979BD49B97263F66B73469E649BB8A775CA47958637C93385A945AB7E4382450", + "l": 1024, + "algorithmId": "4800B23C5FAEE2D67616E91A0B0C326A" + }, + "fixedInfoPartyU": { + "partyId": "50CAF1DD6A7468367BFDD9FEC2901C79", + "ephemeralData": "9719134B0AA9B9BBCBFD81B96C0C4AF9FA5AE28C6AA889E5F763BEFC34787E80EFE617BF" + }, + "fixedInfoPartyV": { + "partyId": "0F5100CBDF5184991A028E189EF92928" + } + }, + { + "tcId": 1743, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB6F619D48A3186D8A067CFC8CEF48D4", + "z": "0E7E93DF78E65E6C4C184B420906AE41D6DAB0604F54C97BBC917EB49D5688E2230E925B", + "l": 1024, + "algorithmId": "D619FDA0D96E4FD984A6106486D64886" + }, + "fixedInfoPartyU": { + "partyId": "ECE754C3A40F49EB7DD852F14BF3F6EF" + }, + "fixedInfoPartyV": { + "partyId": "4AE7DC189755300A7096E0048BAC9A99", + "ephemeralData": "7DF47E5A276CD2E58221E6DB5C15EA82D1F946F1FA761888733CF81D88D5EEE48EBD695F" + } + }, + { + "tcId": 1744, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E137E085C012D3453737E5C1587715A", + "z": "895EDBE245E106168894C751EAAEA4E37F8809D9BAA49FD63621E18A05EA38816FEABA96", + "l": 1024, + "algorithmId": "09FEB844F479F5C3EA6317B6C81BC568" + }, + "fixedInfoPartyU": { + "partyId": "FF834788947D3D5C7B8A818722878ECD" + }, + "fixedInfoPartyV": { + "partyId": "41FA54DBFF84EF61A3B91D000CF2BA93" + } + }, + { + "tcId": 1745, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7D8A7E9DE7635F16CE94BC70F7C1445", + "z": "5C160EECBBD8D4AEC71222790E7438E0C6BE2ADA93A0EA4B25696F9AD09A06D21D5F88B6", + "l": 1024, + "algorithmId": "57EDBDE5CDD6C563C2B224FC038F635A" + }, + "fixedInfoPartyU": { + "partyId": "BF04E3940720C4E15874AB7A3E85D05E", + "ephemeralData": "27D9D118D0CA320A02B52D1CC4344B7FA50A3544D33C38AE96C622D2F4AFA350147EE712" + }, + "fixedInfoPartyV": { + "partyId": "AD5034E48B33C1AD88A74AD52C0E4898", + "ephemeralData": "67FED61CE2D61D2AFA5A16ABA435CFDE27FB3A155FDC7DF657A0EAADEE22F7B9B2C66A1A" + } + }, + { + "tcId": 1746, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B509AE8D4918ED95C1E7E26C92D4A13C", + "z": "FE56F1A1F7823C7BDF0EA8ADEC40B6674A71DA2CD7B6E5A9227B8986946CBE13CCD91CF3", + "l": 1024, + "algorithmId": "2536711B4AA7ABA60F8593CDA36994CE" + }, + "fixedInfoPartyU": { + "partyId": "B21C4037B017C567E20C40347E116998", + "ephemeralData": "A4E3BACF203AA85E91E8845EAA2715F3C8C33FB88EB780830749188CB06A1FECDB3C4DBE" + }, + "fixedInfoPartyV": { + "partyId": "007F215F44E3DAC227A8CEA749AB221A", + "ephemeralData": "70E5C639293C31A3A183E7006D242179949674139DC93829DEE451D937677D9225A94AE9" + } + }, + { + "tcId": 1747, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA7616F3E2426D1188D3AF73EE7FF97F", + "z": "27C751C9B1E1E31BD1569F652E7CB7C5BB3A7CB0282952668E97F934423D5987DACA73D6", + "l": 1024, + "algorithmId": "E0439E9B9DFB40C8D4C65D3F672838DE" + }, + "fixedInfoPartyU": { + "partyId": "77321943BE2145177AB93DBC255969D3" + }, + "fixedInfoPartyV": { + "partyId": "8B15C4E61850266B02E7749BF71FE4BB" + } + }, + { + "tcId": 1748, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B75AF421B6763FB17B3E856F48B5756", + "z": "6AE521075FD54BA116A3F48A340F1F982855288EE15F40D16C015AF0EBAA2CD3AC1E4470", + "l": 1024, + "algorithmId": "90F1C9AF552C7D0E1766097A9F0C3E1C" + }, + "fixedInfoPartyU": { + "partyId": "198D8604BB4546E6FB03A0AD29BD45AB", + "ephemeralData": "AEBA06BBBD1A12E8AE444D131CF87B2C6B4936F55AB065A285A54A9488DE21EA3550724C" + }, + "fixedInfoPartyV": { + "partyId": "4F0E6095E144765E5519A1DE23C03595", + "ephemeralData": "D80E7ACA03881962099CBDA3618A8D2575BFC501AA9CC9E730819F30DC9C21347AD12DAD" + } + }, + { + "tcId": 1749, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7006BD1B40845367B0F23489DA74F0B", + "z": "6C5970DC45C538FD0E59453DD762F23F7045DC20B80D9A5579B86F3A665FFA6B5617302B", + "l": 1024, + "algorithmId": "BBFC5B9D8468DDB096EC055490C14CFB" + }, + "fixedInfoPartyU": { + "partyId": "F4934F389C25956BD86341EF114FA544", + "ephemeralData": "B84D1FD0A5ADD6BD1FA76C898FFD81348D7A73A041E59C73AA016851A126193FCE38B88F" + }, + "fixedInfoPartyV": { + "partyId": "DC975A40F9F72E61D89E6F298B059D20" + } + }, + { + "tcId": 1750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4E42D3535E9ED49EE8167A4A9751D0E", + "z": "522B06D4D0692DE20B8E8C92C01771AB01D71938A08220CC36AE2BB8C2FD70C2E382A7AB", + "l": 1024, + "algorithmId": "9796FAFAD6FBB9FE9E62CCF8D77B1327" + }, + "fixedInfoPartyU": { + "partyId": "1BFD496A29224AB979F0B21F9ED4B378" + }, + "fixedInfoPartyV": { + "partyId": "F5C562DDC28BE0F2E23650C2903948E3" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 71, + "testType": "AFT", + "tests": [ + { + "tcId": 1751, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5032B1E2EA8B4928B20664C7FAE9107", + "z": "32468D22D2915EA8F667F080D87434566C590AC4E68510462748C6C4E3", + "l": 1024, + "algorithmId": "86160917D31F15396375DAFB1FAEF2F8" + }, + "fixedInfoPartyU": { + "partyId": "5C87992881C15ECE4253F04A120E4547" + }, + "fixedInfoPartyV": { + "partyId": "C9B9047535653ADF9C3A9E55337F3B1F", + "ephemeralData": "0DEDB56A76D3A7F2FEC651030C34D60FCDE52F210A31E1662247FC7E9E" + } + }, + { + "tcId": 1752, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5649DD7460D43A391E24C9743540DCFB", + "z": "B401A284CED824064AB73062BF49BEC8A7541091D178AC8B4B92F758BB", + "l": 1024, + "algorithmId": "C281285AB421A3DCEC4B893BDCA3F2A2" + }, + "fixedInfoPartyU": { + "partyId": "B9E264C7307076EF3101F9CA5AFE77EA", + "ephemeralData": "87BFEBD018BDCFDCF91219E7C3AAE8C7C41E34B50C91AD12A08A7B7177" + }, + "fixedInfoPartyV": { + "partyId": "CD44BEC85065492986310DFE1F41A183" + } + }, + { + "tcId": 1753, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FD7CADF06757CBD200A481871F4A4ED", + "z": "8A0088B99AE0CA580EEA06382ED4CF16F722A34A9CB936C2750F32D728", + "l": 1024, + "algorithmId": "13E9BFDCB2C46664A787007C45D9A528" + }, + "fixedInfoPartyU": { + "partyId": "A4CDD43A6E2A9DDA8C058A348E99C780", + "ephemeralData": "7CDC9A5447C98CC2940A821B2F363ABB74520DCF80EDC4A6D8A0ADA629" + }, + "fixedInfoPartyV": { + "partyId": "F7BAB3A1D520A8E952E28FB23CFC83D4" + } + }, + { + "tcId": 1754, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A41D7AC2E31A6389577D4082311D815", + "z": "76CB07587787BACA52287744AE00AAD49B3BD8E0513C05183D6A5907A0", + "l": 1024, + "algorithmId": "C583A55574B0BDD7F27DA8723FEEEF5B" + }, + "fixedInfoPartyU": { + "partyId": "FB27D2D5D2FD87194C4DD4857B00464E" + }, + "fixedInfoPartyV": { + "partyId": "3A11E5F3D14DD5D7195F688031FC64F9", + "ephemeralData": "7AFFFEAD62A0DECD45CFA35E3A8B92F87C557ABC94B45CFF16BFD89A03" + } + }, + { + "tcId": 1755, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85746A224426D393FC9E14122B301C97", + "z": "86E26066CE90EF9B6F60D561BDDD83A8A54B701A4D9FE601E17E10A570", + "l": 1024, + "algorithmId": "04517A714979E6051DC0ACB6F4636DA4" + }, + "fixedInfoPartyU": { + "partyId": "A4F8DD91359622D369CCD9F3729BFB7C", + "ephemeralData": "2A3F3FEA74B6CFB2D9D51ED01904A07AAF80B6D4151394C0864850EB57" + }, + "fixedInfoPartyV": { + "partyId": "1604DD5E073AF53D91750F7BECF6BEDE" + } + }, + { + "tcId": 1756, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76A6839FB0DF8D8FCE6C04219B773E86", + "z": "39A7307517BE8428EEF850BEF5F9C276871ABC0A3CB20DB341F2551963", + "l": 1024, + "algorithmId": "B032E563AF510E90E4FB1835C04483C3" + }, + "fixedInfoPartyU": { + "partyId": "48175EC531D36F3F8F494BDA670C444B" + }, + "fixedInfoPartyV": { + "partyId": "6582CBDB97943B87AE32E1BBE5CB1847" + } + }, + { + "tcId": 1757, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C7EC77103D3C90D2A21AF3799382FAB", + "z": "ECCCB1370B3CCE30EA1D0219AF4CF5B79191CABC34B464C375FAA1C0C7", + "l": 1024, + "algorithmId": "6238C25440B586CB37CEC096BE622DEB" + }, + "fixedInfoPartyU": { + "partyId": "E57A6584CAE8EC3E219479190803C6CA" + }, + "fixedInfoPartyV": { + "partyId": "98123DEE65F196B161C4575387D35598" + } + }, + { + "tcId": 1758, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EEF1B1FAF58C57B4F4A06DCA2D5CA7A0", + "z": "5140E2FBB646DB6E6D1CDA5EEEBACDAADE9F0C42899A112C7C3653C835", + "l": 1024, + "algorithmId": "B5DB5EBD0D8E9842D1EDDE9797EF56B4" + }, + "fixedInfoPartyU": { + "partyId": "6088A3C1967439A50AF4D8A0A790D7F7", + "ephemeralData": "86662549AFD8D23EF77B6B9249D149807F0DECC680D4D69B07D28A0915" + }, + "fixedInfoPartyV": { + "partyId": "07111FD3B93BF07FB6D9E5B5E553CBAB", + "ephemeralData": "C230A1CA1B709ACA2799FBD54E7076BD22B136D60AE51C1178C52AB825" + } + }, + { + "tcId": 1759, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE7292D6F5512C785F237C49F9EC4081", + "z": "C20596F79466F9ABB6B75D72C979F063A58EE5CFC9D06FDE8282B8EFA1", + "l": 1024, + "algorithmId": "BD0B6F7E16EE0741F31714310F57B8E2" + }, + "fixedInfoPartyU": { + "partyId": "967A301BD0A33B89B78F750094AE1C22" + }, + "fixedInfoPartyV": { + "partyId": "6A478BED51F5F537BA35632BD83C15BA" + } + }, + { + "tcId": 1760, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06F4B09C21A417D0290EA83982BAF843", + "z": "9F1A302B02D76A3D1AF2CD5E8357D242F1FE97D6AF8CD3705CB93CD770", + "l": 1024, + "algorithmId": "9E309EE588B19452812F443201551080" + }, + "fixedInfoPartyU": { + "partyId": "1063D32D24D24176620D17AB9FA1E50E", + "ephemeralData": "CDFA1D0DF5C42A455FF5F1A0EDB84030B7646C33EC02E33D9D4D458D38" + }, + "fixedInfoPartyV": { + "partyId": "A0E4BE9CBEA77152D5A3F3F2C70769EC", + "ephemeralData": "374A2F9AE39D3DC59D65CAFF35E9208F588062F2B01A7133406B9210BE" + } + }, + { + "tcId": 1761, + "kdfParameter": { + "kdfType": "oneStep", + "t": "97B37EF43533D237278DBDA7A68399E1", + "z": "52EA4B009436110673544EFA3C6AD186F2F1E2A948A93A841F3A4633A4", + "l": 1024, + "algorithmId": "BB08FC285D8373A1112D86BD832722F4" + }, + "fixedInfoPartyU": { + "partyId": "DBFD5DDA5F5D9CCEB5F4B9EBC0221DF8", + "ephemeralData": "F4F05D6EB4DCCD0631BF8C50564F381EA50F229E245E30F9F8C901B135" + }, + "fixedInfoPartyV": { + "partyId": "D21AC761F223FF89E99ACBF85B13A899", + "ephemeralData": "CC6850CC669E53ADB40EF68A6A3F9C8A1424E32E6A1C710D8410247D28" + } + }, + { + "tcId": 1762, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FECA638B38641453344E88179B8403F6", + "z": "18A4EB24810516013A3DBE991C6E8C58CE3594583683FFCBC0276F75EF", + "l": 1024, + "algorithmId": "C1256845B1B115F9C17A7DB93F58CF8D" + }, + "fixedInfoPartyU": { + "partyId": "F4BE6500032B01FEF9D0C1B34B953542" + }, + "fixedInfoPartyV": { + "partyId": "5BDF9BA66A5EEEC38CA4F21BF688FB65" + } + }, + { + "tcId": 1763, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9068B0D34A90D9A6C2515D20569F962", + "z": "E0F909406886448641EBD53BA4AA9A0A1630CF4C2E7C0294044A4CDE60", + "l": 1024, + "algorithmId": "B6E6E4CB015309A1FCA48907A3AC8D9B" + }, + "fixedInfoPartyU": { + "partyId": "4585D6ECF6CEB19B97EDA1AA0215EF6F" + }, + "fixedInfoPartyV": { + "partyId": "098BC4E2C699D9671AB6D190FE728F55" + } + }, + { + "tcId": 1764, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69EC5C72484D32E52C40A3810A699A03", + "z": "8A2C6156BE126823C349BFEEFBAA5D981163A165FDC70401C147333787", + "l": 1024, + "algorithmId": "1FA607C22AB7E5C8CA34D75E4683FEB6" + }, + "fixedInfoPartyU": { + "partyId": "021C0CA295015D5ED48AA34EF86B58EB", + "ephemeralData": "B3BD909CD6D2F5C36A350D123CD8A06A8921CE64A5A39C844DA2D44C1A" + }, + "fixedInfoPartyV": { + "partyId": "BC3EA855CED39EE857153BE00F4C1620" + } + }, + { + "tcId": 1765, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4C8147E181D49235D0657B49762ED9F", + "z": "6150D6D0934806CF95BA65681610B4163AFE1AAC3CFCB93508B9380357", + "l": 1024, + "algorithmId": "DCA1238C4E2981F0010C7E99F92D999F" + }, + "fixedInfoPartyU": { + "partyId": "3C075A66336AD4E8EB89F754B8DC83F3", + "ephemeralData": "86FB942E252B1FE5453E29489A695E3725EFFD883E0DAF15010C940C22" + }, + "fixedInfoPartyV": { + "partyId": "8B6E15AB2C6DF155BCC9AD8B0CFE742E", + "ephemeralData": "11BB5745AC948A9AE3FE131086B481D3E768ED3CC1FEDE11CCCA0B9CC2" + } + }, + { + "tcId": 1766, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13E88ABACED85DA69636BA8C66FDDD01", + "z": "D95EFE862A788CED4B644B07F91355715BE3AB8BF6383B39E2BC568432", + "l": 1024, + "algorithmId": "F96B3BC58A4A946BABAEB2BBA51C6133" + }, + "fixedInfoPartyU": { + "partyId": "0E006FC5A1C816AEE5415736ABE0F1DF", + "ephemeralData": "C283F04A2E13192437CA9A165FDD3A5C92DDF845C8843EB2D4C508353B" + }, + "fixedInfoPartyV": { + "partyId": "49126E26A23F0B1456C94BD76A8B7E86", + "ephemeralData": "285B0B4A867011BA736CC742C1BBC28A96F41B161B43665865C48DBA1C" + } + }, + { + "tcId": 1767, + "kdfParameter": { + "kdfType": "oneStep", + "t": "666B5245DE962740C56061BF806B764B", + "z": "C50A4D3BF7F39907F02AC2EE96970D5558C93C2118F80D37DE07358326", + "l": 1024, + "algorithmId": "B9F468148C93643F8FED5C328D015854" + }, + "fixedInfoPartyU": { + "partyId": "249D67736913DBED3290652CF9EC4A0F", + "ephemeralData": "C1AF13A9647CEF2CCF50D6093302EAA20F42EA1F7640905647FF1AEB6D" + }, + "fixedInfoPartyV": { + "partyId": "A645B5B95CF3C7C5F062CE5FCEFB9F7D" + } + }, + { + "tcId": 1768, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DF6ABB70350D330BEFEDDA9B4352E26", + "z": "23CFC8CB92B9E102C289F414C10982EA652076B7732946047A501A45B2", + "l": 1024, + "algorithmId": "3A54DFF4C64384D1A5F873A2F9899096" + }, + "fixedInfoPartyU": { + "partyId": "66F2400CE721BF04C5AE13258E25EDF5", + "ephemeralData": "A1D254BD43D3D63F9250C97E05773CAEBD6063AF5A6DB7A34147514658" + }, + "fixedInfoPartyV": { + "partyId": "4A63CB206E4AB3DC7D8272B552EFC1B6" + } + }, + { + "tcId": 1769, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80AEC948268D12045356B114D29A7AA1", + "z": "3D23BCEBCD3FAF390F13A5A761C9FFBD5935A70D3165198F334369BAE5", + "l": 1024, + "algorithmId": "D4C9CA088A7BB00BEDB0CA35C13E23F0" + }, + "fixedInfoPartyU": { + "partyId": "0A07A0346012A186614EA5FB0241A489", + "ephemeralData": "B29206DA68B0185E326569A728F6D248762A0BAC719B23A1C5C31247F9" + }, + "fixedInfoPartyV": { + "partyId": "43F889661D03C4791075F1AC34A898DB" + } + }, + { + "tcId": 1770, + "kdfParameter": { + "kdfType": "oneStep", + "t": "910B1ACA7686659F73030C7583CFE80C", + "z": "72FD93A88E7B3163E16EC674AEADEE7C0584C21C44FDE210975B4DAD8E", + "l": 1024, + "algorithmId": "CEBAED88A9AB8EA64DF4F963331B9188" + }, + "fixedInfoPartyU": { + "partyId": "4A583FD106FB375EA0DA1B19838C827D" + }, + "fixedInfoPartyV": { + "partyId": "E47DEFCDD17C2BB09D5455C7D976236D" + } + }, + { + "tcId": 1771, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DFCD936C0DA5A23100DF5D0FE68BE5F7", + "z": "9711958362018D8AB876C9BABC6CD7FFABF73C9030EE5EA7847BE84D5A", + "l": 1024, + "algorithmId": "49ABFFE18FA718AD20503CB4C784415E" + }, + "fixedInfoPartyU": { + "partyId": "207FB59D864FC52F179334C84B1AB343", + "ephemeralData": "EF7AF48C5543CAE3AB22DCED574C120118E6C0CF2656C9B25038CA3155" + }, + "fixedInfoPartyV": { + "partyId": "D365A1F55001F25E46632E7AE00ED51B" + } + }, + { + "tcId": 1772, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27E78A10F33378DF4C46FDE399663844", + "z": "D9EF4CCB6293A12A6FB8D9A5E438AB4842A8E6C4013B97CF4C57F032B3", + "l": 1024, + "algorithmId": "6C87506F667E2F5F25FB0C672B17A890" + }, + "fixedInfoPartyU": { + "partyId": "161F972AA0751F305F3DB25748D41407", + "ephemeralData": "186385B4D86E95EB6012AFF961A78281F45D9088B82EB16B0EFACC960A" + }, + "fixedInfoPartyV": { + "partyId": "AC2A9E1A22A9F9DE23B5C1C57C819244" + } + }, + { + "tcId": 1773, + "kdfParameter": { + "kdfType": "oneStep", + "t": "94C03D20A36296AC32E031F756922E98", + "z": "715A6F7986C21795CB26BCEABB6360FF2AED76AED07BAEDDE49C2028F7", + "l": 1024, + "algorithmId": "D3BBA69C90DE04131923D4F11BAB66F3" + }, + "fixedInfoPartyU": { + "partyId": "BA48851780BBEF1F8573994A44D5F980", + "ephemeralData": "A501FA9CDDED66E0A9A0B55009536D6A165D1161C8998036E7FF36AC07" + }, + "fixedInfoPartyV": { + "partyId": "613781AA55C2987124C3719207CE10B4" + } + }, + { + "tcId": 1774, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E49870A86E660038AD1FF574FF0E0C2", + "z": "DC202EA884CC7C36EAAA47C712184DC8A9D296AA1ED4D5AAD918BA2C89", + "l": 1024, + "algorithmId": "B9D45C8E0562C481E044C280313256CC" + }, + "fixedInfoPartyU": { + "partyId": "68AC311C0A18E0BCA2617C147BF9D5BE", + "ephemeralData": "9F2EE75576EB4B95569DD560F7B57B3093EDAF52639E404274CD133BE0" + }, + "fixedInfoPartyV": { + "partyId": "B129B0DDB9934A0E0CF3C78463D004CE" + } + }, + { + "tcId": 1775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28DABEDDB6D7FC199A45B59CD427C15F", + "z": "D38B54D741BBB6ACEEB0E2A5EED94B4286130E31FB7B6ED5635567F548", + "l": 1024, + "algorithmId": "A7EFD5314D9490E03B45AB876D718670" + }, + "fixedInfoPartyU": { + "partyId": "A76AD8AB528A44996E3C046CB5215E8E", + "ephemeralData": "5E5861546B0F3E1A5DECD36CA7E3818B14AC3F9B3A2ADC38C7FEB0D613" + }, + "fixedInfoPartyV": { + "partyId": "FC68328B4526C7D5DA7DC30F134BD443", + "ephemeralData": "A6ADA5D20903C80598F3C7F6CB83D77293A198F9D3BB976C046E09B885" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 72, + "testType": "AFT", + "tests": [ + { + "tcId": 1776, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E662827F99FCDA07B1387ED3E3CA0C9F", + "z": "1E5CCB7BF227A64901A2DD1E4F3FE5C35117A3A08E697352CDAE4C92F38C2FB0C82E1C", + "l": 1024, + "algorithmId": "7A503FCD3A422DFE71C1A3240953169D" + }, + "fixedInfoPartyU": { + "partyId": "F65B4B9E3DE6B024963719124BA0769F", + "ephemeralData": "4A8A314BFD6364F76D2BA8ADAA3ECB032AEF4B178752BC24ECA98A8DD2A9DEDC009E30" + }, + "fixedInfoPartyV": { + "partyId": "53265E5E67724B6F88BECDCCC0415C2C", + "ephemeralData": "19A2103D980EC336613BB50D355D2F09BB5A0732F2A1AC2628DA3CB33353F3F29BF231" + } + }, + { + "tcId": 1777, + "kdfParameter": { + "kdfType": "oneStep", + "t": "543A3E801341F69959A6C3AC241ED495", + "z": "E9BF628254A035F5B4848170EDD62A394A3A1DB9626A6B25E27EBCCBBA9CD7CFDA9271", + "l": 1024, + "algorithmId": "353269145A139CC0D5B477EB4DDE2834" + }, + "fixedInfoPartyU": { + "partyId": "F588932FEE81E02E685319F85D628F81" + }, + "fixedInfoPartyV": { + "partyId": "ABC360291B95C4E8534E69A49A2A00F3", + "ephemeralData": "B2AD42BE80044CBD55100A1426DD4E95618E0EABAD628596008FBF6ED61F52DCBA2AE0" + } + }, + { + "tcId": 1778, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51536B2197D40A7DA00CBB271ADF1DC8", + "z": "8FCFCCCD35BDCF78B37DB20DCEDAA64CA65947D21786F026350E7CC840DB7E5B674A3D", + "l": 1024, + "algorithmId": "D319D00FCD2120395755A483301DBFC8" + }, + "fixedInfoPartyU": { + "partyId": "4F02F2F6AFE685189D16DDEC55BD68C5" + }, + "fixedInfoPartyV": { + "partyId": "205967D9BEF8C72801A85A7B63AB06C5", + "ephemeralData": "A0FF8E8D1E3FDE1E15C454150D492B24C5086C6DCD86BCCDCC87B63C8F6FB903896A52" + } + }, + { + "tcId": 1779, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B6A91527F51426E4F8860E06232980D", + "z": "8613B3238E6771D66A516689ED84E90CB2A1E9CEA544E99264DF85E138DCCA359D42DA", + "l": 1024, + "algorithmId": "283B26D2607F1DB5E0E7C318D9A1EFEA" + }, + "fixedInfoPartyU": { + "partyId": "95839C2A66F6FC01DC505F315E06888F" + }, + "fixedInfoPartyV": { + "partyId": "D5DE41511E6F617178CE135455825DDF", + "ephemeralData": "866C9017BBB0BEE0FEBFE537753A31915544DED2EE3A40EB708DECA898AC8143E34516" + } + }, + { + "tcId": 1780, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD01AFAE5DD4B7A146167CDCE7C9DC28", + "z": "35EBF8986C9759542E69E32350F2BF6E26E7AEE849145C1DB2A07AD1B9D751DC0BCA73", + "l": 1024, + "algorithmId": "E91A0146A899F9471BF52E0CCFAFFAA0" + }, + "fixedInfoPartyU": { + "partyId": "AFEB6E8CE9F8CA3B6DF72251973DF57B" + }, + "fixedInfoPartyV": { + "partyId": "71251933E27864A9E8F8E87A80EE9289" + } + }, + { + "tcId": 1781, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA933C2C35592DE179C209EFC452305F", + "z": "FAB8BC2F7438C6DF3E6E7ED7EBC646D039FB25B37831A8BACDEFB83C8249D379BC94CE", + "l": 1024, + "algorithmId": "DFB95F83C8A3506BA16E1F0C20E841E1" + }, + "fixedInfoPartyU": { + "partyId": "10A5B4B0D1083CFF0C15AD150C40A2EE" + }, + "fixedInfoPartyV": { + "partyId": "F0FE9E7A7F76A30B65FBE4A907A4C303" + } + }, + { + "tcId": 1782, + "kdfParameter": { + "kdfType": "oneStep", + "t": "014D91E1C623CB53D9B9D143FC9B9E89", + "z": "CF6728654F3C3CD1B7F57744055FBE05D984CD54B0C00894D79B3FF8B2F19EF4A1AD07", + "l": 1024, + "algorithmId": "6635BED9D76975F73103609D0ACE3016" + }, + "fixedInfoPartyU": { + "partyId": "F9CF1B92D124FAA7BDA3EC98C8411D2C", + "ephemeralData": "ACF2426CB62423524A5DA21B1940BC8C3684F1A06B714B02BBE13AA97D5CA8A84247B8" + }, + "fixedInfoPartyV": { + "partyId": "A131B9885CBAE70A5E1EC3C1832725E0" + } + }, + { + "tcId": 1783, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F672B9798DB3BF575314589EA3122E6", + "z": "1E15FDB5C42969504DB1E9FDFCB84A84B01221065A07FCE6D760C9CCF3718E63AF9BC2", + "l": 1024, + "algorithmId": "64577297E1B464E15CC1448B42261B42" + }, + "fixedInfoPartyU": { + "partyId": "76D4E0EE784A6D2921642E74D5F4C3FB", + "ephemeralData": "393FB394705F389F8FD397E5553B3C2D435FE8E6E9229CA062A324DD79B19E0A54E37B" + }, + "fixedInfoPartyV": { + "partyId": "0591614B8D80028B50F87B115C14C11A" + } + }, + { + "tcId": 1784, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76B6A81D64338FB1640156EF32CC5AB6", + "z": "424F0732350643DDCE10CBC990E6D2B63D127CCE520FDB630F7225AD34E87AAF094796", + "l": 1024, + "algorithmId": "F99BF3BFD8C5BEDA526B776C7F74CC1F" + }, + "fixedInfoPartyU": { + "partyId": "E8653CA2889D467C0C1E25CD7EEBE977" + }, + "fixedInfoPartyV": { + "partyId": "8B5CDD3C1F6A571A6AE33FB7B0A4006A" + } + }, + { + "tcId": 1785, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16F0541926BFCB84DA9B0A17199DFB49", + "z": "936263CF754C28154347A29921BFEDFAD685AB0E3841A3E0A7D420F95F472E95272AE7", + "l": 1024, + "algorithmId": "E28FFF307A7953248E73E8E1C8213EA3" + }, + "fixedInfoPartyU": { + "partyId": "7AB0924336BA6242F9A39C02B3FAD805", + "ephemeralData": "51E1D17883FF11E736DEC5495ED4D1B13633AD417DD85FD3D04903E7F38D092829F57E" + }, + "fixedInfoPartyV": { + "partyId": "95F43D8AE326D352FECC064AFC6A396D", + "ephemeralData": "FD23691CAAACFA9E760BD605AAEB3642070F867D0158C604D50B562A63DF97A9C1C97A" + } + }, + { + "tcId": 1786, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF1DCF20C2A8A8D45C10ECB18BAA286A", + "z": "D511B75F945A71CA40B0C134EB60F356CF611A9B967142C7FF02D816D0A09D824E68BF", + "l": 1024, + "algorithmId": "05D1355695E0D52EB41D1973150CD120" + }, + "fixedInfoPartyU": { + "partyId": "A80D12631948EDAFB39358CA674EE7EE" + }, + "fixedInfoPartyV": { + "partyId": "31109F6D7EA5055FEDC11A7C5FDBC6FF", + "ephemeralData": "69C8E8384E4135EE526B798CCC717635F060D5B263B8DD9678463CAC5FFE04FACCB4A8" + } + }, + { + "tcId": 1787, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E1FD4D245DD69A00DDB1A984798AAC09", + "z": "24F8E2B1A49317267D096E1A66922C8EF69331EDF542219730BCF4DB32A86D0C4E13D7", + "l": 1024, + "algorithmId": "3C30817BFBDADFFEC8F0EDC17DE61FC3" + }, + "fixedInfoPartyU": { + "partyId": "2BE9A5BDBC1978C884AF7961CE243367" + }, + "fixedInfoPartyV": { + "partyId": "28B47E1761C40C2B649E33AD44B56F56" + } + }, + { + "tcId": 1788, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD48FD004E828A08C5BF80F1B4646F4A", + "z": "D959E2BCCABBCE29F3976C9D5D00687BFE755E00B65D3F5A197F35ABD83886F6EAEABF", + "l": 1024, + "algorithmId": "F8BC3E3D99372ABACA0951B4FB5C2B1D" + }, + "fixedInfoPartyU": { + "partyId": "EF82D4AA856466727EB9971271C55353" + }, + "fixedInfoPartyV": { + "partyId": "E6785DB47ADCAF44EF8A4D8DBF74CCFF" + } + }, + { + "tcId": 1789, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8FC4D68B04CAFF52615F57D8AB8C0DB", + "z": "978C53BA291C7686A29B3BF8C9F838B616C5BE1B73D43A59D770B309E54749B3E86A6C", + "l": 1024, + "algorithmId": "65C21C2604544F0792CDC23598C250ED" + }, + "fixedInfoPartyU": { + "partyId": "F2313B21ECBB1D0CD6AEDA931C0E33BB", + "ephemeralData": "82862A444A81AF7FDBBD2189DC82A9B0E8B73CAE051D4797935FA4AE78F0A1748F4537" + }, + "fixedInfoPartyV": { + "partyId": "E43DB6FFC43F1B7AEE6D96421A23FC0E", + "ephemeralData": "FAC79D71C9DBF8E26E61933C19A59D18B2F79BC06C4F1423FEF915E4520569B5F94249" + } + }, + { + "tcId": 1790, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11D23D549537BE1ADB728CA80A71A19F", + "z": "4FA72F0FB93D254F87BCF909A70147FE648EE523BCA4BDEC49FBD6A917A4D8472ED052", + "l": 1024, + "algorithmId": "C1902A6AA1B8014D0ED35C0EA2976C95" + }, + "fixedInfoPartyU": { + "partyId": "B01402751D8542AD34C88AFAE948FB99" + }, + "fixedInfoPartyV": { + "partyId": "16BD3A419884C71C1C4D252850CAD4D9", + "ephemeralData": "DF2007C8076C9B43C3DDCCFBD670FEDD5B36F38C104D129E74C6F9CD7E7369A49C2722" + } + }, + { + "tcId": 1791, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E98E8397A11AEBEA1F62F45CD73737DE", + "z": "37689696280C788E7185B349D46EB8D57134707E3CE2ACB16397012D9051F8111DCBAF", + "l": 1024, + "algorithmId": "4705DD7BE651241ABFAD927A5BA4163D" + }, + "fixedInfoPartyU": { + "partyId": "309BAF0772B090C4D609A68D4FF4C0AF", + "ephemeralData": "85C5DBDCDE691203B80F98AE2EE3E57CBE8CAB441BCC6FF4B502E0735DD4F74030B911" + }, + "fixedInfoPartyV": { + "partyId": "5C2E95C355E154A4ADDB96ECB8F737DC", + "ephemeralData": "FFBB0DE36DF5BAB7598A3609E6D2D3B30C3E47AA18D82376605A1BE7A7828A2D7EB3DD" + } + }, + { + "tcId": 1792, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E58796FFDD9F2260EDD51629C070210", + "z": "CB2C2F9F2C127E0FB88652F323C5AFAEA5D2108E0DA37EC93365EA39D4176BF60324D9", + "l": 1024, + "algorithmId": "ACFF40C4A46B87189C0F5802DE943044" + }, + "fixedInfoPartyU": { + "partyId": "EC4AE58290141EFCB1CE2EF840093DA0", + "ephemeralData": "CA8F25342A35F63DD42613E17FAC9207516CD751999438D8BAC45FE5A41000138EA9D4" + }, + "fixedInfoPartyV": { + "partyId": "AB3E7A8AC4D81469995B652CA0B79D85" + } + }, + { + "tcId": 1793, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA84DAF80C526162BC3312C1083BC33B", + "z": "0B6898FB3C75425A4732E801270A60AFF5330BE1BD0A3F16EAD2E5B7D347372B9C00EF", + "l": 1024, + "algorithmId": "7104BE1EFB231CD5348295BCA9EE1B13" + }, + "fixedInfoPartyU": { + "partyId": "0170A4587D1D27EF2283F0F43AD9211E" + }, + "fixedInfoPartyV": { + "partyId": "D67EEF957075780004439BD8E459D5E5" + } + }, + { + "tcId": 1794, + "kdfParameter": { + "kdfType": "oneStep", + "t": "882F803D39661BA18F02DF3B0717E964", + "z": "AD6A820A3D125CC24AEE99079ADD4B798084DD9A9A51843156804A1823A11A8B74468F", + "l": 1024, + "algorithmId": "BE9BA7743DF3B28B7B4BC2DEEB7D9CE7" + }, + "fixedInfoPartyU": { + "partyId": "5BCC814F0BD188BBBDFFC5C3A30F322D" + }, + "fixedInfoPartyV": { + "partyId": "19AE4C4237BC60562CF26CACB23DB600", + "ephemeralData": "14ABF2233C788643656C771CC681FB2DCB0A85B68F41FAE2C77EDE1F4CB3BCE1CE676C" + } + }, + { + "tcId": 1795, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20D3495F541EB2E0D9B85A46DD306F78", + "z": "D70086D6EF0D31CD15C108A1CF65DC182ED607F9A3794AC1E39A648BEDC3864297CB00", + "l": 1024, + "algorithmId": "EB98E6C7D82159204E61507FF59BC1FB" + }, + "fixedInfoPartyU": { + "partyId": "4D250E668FF776AB79A582B465564FFC", + "ephemeralData": "BA66C00CBEAE32112A23EC36967970B1A9A7A1493B0CAB565920ADC439F5FB9A44BA1B" + }, + "fixedInfoPartyV": { + "partyId": "C445BC6A00224B6107A11C59003CBCCB", + "ephemeralData": "9056E9ED55C023CAEB3471CF9450A6658D6F5245964D61FF9127CBD7AE0D24A2189B7B" + } + }, + { + "tcId": 1796, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D9232391CBA278E81F843168D662921", + "z": "237F865CF61961129FEE6A0087B42F682CFAAA43D3166AC7263BD5ED0251E4139F3775", + "l": 1024, + "algorithmId": "8A93D995999D188F2F351C392E6F6244" + }, + "fixedInfoPartyU": { + "partyId": "7277537816301DDAB77926CFA67F3A5E", + "ephemeralData": "57B7A7E9BE27D739E2ACFDB6425D532A0975F2EA41C945BC8BF0B1F5A99FAFC1ED2905" + }, + "fixedInfoPartyV": { + "partyId": "852CEF5495FBED351DB1D69AAE62925D" + } + }, + { + "tcId": 1797, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CA683CADBDABA24E5AFBA39B8B95394", + "z": "2E81DE6CBB4D42A5BF36C39EE44B95A0DE68FEE0C1CDE08F1201A4E236C43DF53DF5AB", + "l": 1024, + "algorithmId": "00963C66DAAE85EF86291D5FE31C7358" + }, + "fixedInfoPartyU": { + "partyId": "DDFAF8570520A83713D61CD0C3A0FE70", + "ephemeralData": "C75A6F47AC6831A2F6AC38BE840EA55EE1509E5FB0A64657A0910406329F105F9705A4" + }, + "fixedInfoPartyV": { + "partyId": "B8A57002F1BB368BCBBD6E5F60CEE9D8" + } + }, + { + "tcId": 1798, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB5C1DB6D8E5ED484BB1BCEA3D5B58EB", + "z": "5329BC5DF458DFE00E6B4E43BAD88E38FE6ABAA2F7321A9AC823F1FBC36F7028EAA962", + "l": 1024, + "algorithmId": "9C582612B6F5197BAA30C5CD56B600FF" + }, + "fixedInfoPartyU": { + "partyId": "1D43F5153117F4C64C5F947C2C2F3B69", + "ephemeralData": "3DA83A9CEAF939364FF38B2EA3813D8A678DDFF0DD6A2F981BE26005DAA7EE8A3D231F" + }, + "fixedInfoPartyV": { + "partyId": "36403A8997B344B11B2754937AC9EC99" + } + }, + { + "tcId": 1799, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7945E937E53048A0F5C34EA6EFBF9BED", + "z": "5C6130BEB1BE803602C57D9DBFC7FAFA11D5DE16866A5CCEDF5F9BD90A26D8D63D62D1", + "l": 1024, + "algorithmId": "2A60FEE12EDB75A8E8A4B17FA3BB40EB" + }, + "fixedInfoPartyU": { + "partyId": "071AC13698F46E4653E690C7518AC07E", + "ephemeralData": "E64FB66674CC2D882E7873146949845456080DFA9E20ADDD58D4231259A0A30A7F4AD8" + }, + "fixedInfoPartyV": { + "partyId": "289E554E99768DBCA43E311FDB52E2E5" + } + }, + { + "tcId": 1800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "602934F189E92677F3FF61BFB0C7DCEB", + "z": "638509672D4B23712D91330BC5AA726F0A42BBAD19F099AB9D211B2E33B86F592E6AB5", + "l": 1024, + "algorithmId": "BD33520618E5339B1ED40C97A584336D" + }, + "fixedInfoPartyU": { + "partyId": "CD3B0D865954C39E9499A9324DDA239B" + }, + "fixedInfoPartyV": { + "partyId": "14A136F4D00AC18BDE2522A50AEDBA29", + "ephemeralData": "8FF845B28DAAC38EE8A76FB401F658974F3D7E7DE764A738DF482616D9C5D7F4E1897D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 73, + "testType": "AFT", + "tests": [ + { + "tcId": 1801, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29744D058D5518D0889A426300D1B373", + "z": "CAD142697D18B6D8C7C584C53A0FFDD158F5E665DBD138AFA8B5CE33", + "l": 1024, + "algorithmId": "6383EF1CE0A3B628129F92E2A1CB03BF" + }, + "fixedInfoPartyU": { + "partyId": "7C9AF5E13BB4DA394EAC7A42DB0D123D" + }, + "fixedInfoPartyV": { + "partyId": "666C3F38B57D51AC8781C81B09D2B642", + "ephemeralData": "2F2895538C4A22C0FE8B27309B1BE2E589CFEA01C05057151AD9539E" + } + }, + { + "tcId": 1802, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65F9CC5D5F1346EF9E9185FBCE6ADB0E", + "z": "882A0B198F6D89DE1E10F57C490863E1B4655D654C41FA0F13E21E86", + "l": 1024, + "algorithmId": "B55774421A79A4BFB00BE5CF19AAAB14" + }, + "fixedInfoPartyU": { + "partyId": "9D691E9914A64492239414AAF252ABD2" + }, + "fixedInfoPartyV": { + "partyId": "CF03FA53B1FC86DABC68E2CA3E8BBCDD" + } + }, + { + "tcId": 1803, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6D8C4DE8951F7A24B60C10C43A59ADD", + "z": "A69837EE0EB4F10BFE68C8DBF71CFFC2C5F2B0E8590EF514ADC5BF51", + "l": 1024, + "algorithmId": "838BE397353B0EA9A6D81E9D3A834ECF" + }, + "fixedInfoPartyU": { + "partyId": "5B5B4B8CE76FDE1DD8E37536E5C84ECC" + }, + "fixedInfoPartyV": { + "partyId": "5DDCBFB70A60BADA5B15AD5ADAA2899B" + } + }, + { + "tcId": 1804, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA861D761228178D5B052478EB1E6D53", + "z": "111254CA7698CF39D758B819D0D6DEB0ADCAC48966BDC83D6C27ED22", + "l": 1024, + "algorithmId": "DC70C90D206262BCEFF76C299FB0D09A" + }, + "fixedInfoPartyU": { + "partyId": "B362B7B08A9F04A220FDA8DC9E79E544", + "ephemeralData": "19142EB6E008D12B4BA322ABB6E8A1B1545281AEC4BEF85741AEAA57" + }, + "fixedInfoPartyV": { + "partyId": "272DD9BAECECD063AA731CE56D8127CD", + "ephemeralData": "36DB533E2E946FE5FF87F6A4E4298BCEA2862E67BE9505D4B662F1CB" + } + }, + { + "tcId": 1805, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F39E56DC59B84F584BE2D721A3D6A32", + "z": "7C0391275BC65F71E0E6D8D95948868C63C1EB3C70961BD5D46DA963", + "l": 1024, + "algorithmId": "F7AAE90D7F57FB6D432C5D00F916E589" + }, + "fixedInfoPartyU": { + "partyId": "86DECCD31722D57C631C48C288D566C1" + }, + "fixedInfoPartyV": { + "partyId": "1743AD11E3049D58FE95EC423B6EF85A" + } + }, + { + "tcId": 1806, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4630EA6FADF62E0EC9A5DC3E0673963C", + "z": "FA9E2C021165E3ECEFA67E6328D99D1E963432947E54CF829B0BA891", + "l": 1024, + "algorithmId": "D4D6C137BED142121E5E9C29ADF5A7EE" + }, + "fixedInfoPartyU": { + "partyId": "0B71F5426C513BB68E2D8B1227AFB0A5" + }, + "fixedInfoPartyV": { + "partyId": "305699F943AD594044F049CE5471AA0F", + "ephemeralData": "8031D1E3BE67D6A52D81F2695971F6AD392C28714A7092840C83E3D8" + } + }, + { + "tcId": 1807, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE276A7F17AB698940797E419498CCEF", + "z": "37AFD55C30D983ABE122A482F74B2EDFE8655504B5B83270081DB8FF", + "l": 1024, + "algorithmId": "3F81A50DCFB603DCE56A43A13915D5AF" + }, + "fixedInfoPartyU": { + "partyId": "EB90E313BCCE798854D0D7DC72665297" + }, + "fixedInfoPartyV": { + "partyId": "839BACECDF7B334648DB95B41E5B6190" + } + }, + { + "tcId": 1808, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DCC6DDBCD583BC646D2090B80DB3A2C", + "z": "3720224FC75753E2E6B40F18AF0351EBD1D1DCEB5377AFB3BA5F17DB", + "l": 1024, + "algorithmId": "ECE23C02D679F91A5E27FB73E76921D1" + }, + "fixedInfoPartyU": { + "partyId": "2E9588C37C3928DCEBFB0C2DAC8359A3" + }, + "fixedInfoPartyV": { + "partyId": "8F906B98BF888AE5B9CBB4A838755B01", + "ephemeralData": "738147F3B7A4FAFFAAC74D8E28BD5A2337D5F0D31755DFA4245991AF" + } + }, + { + "tcId": 1809, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19E67F67047197D4076E20CE834F7E0A", + "z": "58360BC02E208A6EF75DF87DD4C890416726FE89B8DA539001C9E2D9", + "l": 1024, + "algorithmId": "2A26550D00CC2AB53024C6F00B122F4E" + }, + "fixedInfoPartyU": { + "partyId": "D0FA97A3B799248C2B26B34335C82054", + "ephemeralData": "5F58489C6A8D23F1356963821C85409AC14EAAEF226F869DCF43C607" + }, + "fixedInfoPartyV": { + "partyId": "0854125999B789F344B9345090D753A5", + "ephemeralData": "ACF92940876671BED39B7C0F2D5432D938E4089B9033219A13E3F169" + } + }, + { + "tcId": 1810, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F15320A7EC425A09036C183553F8839A", + "z": "7CFC9085FF32507B810F43DCBCC321535EB9B3D18B9F0945CDF968BA", + "l": 1024, + "algorithmId": "17222B30850AC5A336EBB4D70693F218" + }, + "fixedInfoPartyU": { + "partyId": "81826DE490D25431C8CB1872828EFE72" + }, + "fixedInfoPartyV": { + "partyId": "0DB547FA356975D11163108597E7B00D" + } + }, + { + "tcId": 1811, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB2EADA687F70DC2672696D91BD12E79", + "z": "18C52ED278A0F29C6DFCB2358A305FC21B5D7095A2177C9EA57F9C92", + "l": 1024, + "algorithmId": "74A353495982689F6ED95E258896F80F" + }, + "fixedInfoPartyU": { + "partyId": "68852F17FCD6FED3ADC7C739F1C85167", + "ephemeralData": "DC37B68398FAE16BA8443AFFB76FD307FB9F1EC0B1F4516CDC63A50B" + }, + "fixedInfoPartyV": { + "partyId": "A97940D4FFFA3B6289C63F376D6D56FF", + "ephemeralData": "40C354E60CC7C332B16AB1181AB659CBAB29CDBF41F41845662ACCB1" + } + }, + { + "tcId": 1812, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71D25C8AF71935B896496B6256190CD4", + "z": "4F1748926349A20F33B33ABCBF2E6971C3B8FDFF47B3142ABFC18628", + "l": 1024, + "algorithmId": "2BB5FFA4320A4B7457339285CFDEDBCF" + }, + "fixedInfoPartyU": { + "partyId": "6456D259BF01F53E1D0A987918CC3B79" + }, + "fixedInfoPartyV": { + "partyId": "FDE12D5D3D85629EA94F3A59064F2485", + "ephemeralData": "8536DA6F7C001F48C7240CB0E54C3CDAF339C781115ED84AA031C4CD" + } + }, + { + "tcId": 1813, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB3A59D94794B0042C6C0DF1646E9DCD", + "z": "1F5EEB0584D6E13934A10A5FAD8F21E49CB24A80E7E3DA03CCB8005A", + "l": 1024, + "algorithmId": "A195AD593E20597AA14DD3D062177191" + }, + "fixedInfoPartyU": { + "partyId": "A6E386BAF39DC8F458E3741E20C7053E", + "ephemeralData": "6D96B8363D6F7E91827BA8C37C18C7342A797206B7CEE8E720E348D0" + }, + "fixedInfoPartyV": { + "partyId": "021768F91D57FE7BA235282FFDB279AE", + "ephemeralData": "50C40175920BFA7BBF8C0961522FEAA5D851C92468DEF7768401C02E" + } + }, + { + "tcId": 1814, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5ECBA543422499B0F2841C1812811DD", + "z": "C6148D9003D7446529FD371C77921EFC5A02772189BF3EB208CD4626", + "l": 1024, + "algorithmId": "68064EBF4CE4B4572A3ABA10B09CB944" + }, + "fixedInfoPartyU": { + "partyId": "4A609E519EB5FD807826EFC79CD50598" + }, + "fixedInfoPartyV": { + "partyId": "292578CA6FE18FC3BC1D17AAB77D13CE" + } + }, + { + "tcId": 1815, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67BBFF1E3034D2F1486AE1BCE9624110", + "z": "A7192C1F73B325EFBEBB6E7FD84005BF166B1DFAF3AE8CA489F59A9A", + "l": 1024, + "algorithmId": "70D1AB59154278AC81FF35790B758A55" + }, + "fixedInfoPartyU": { + "partyId": "9FEF6E9384CB48B6BF7BDABDAD62CE00" + }, + "fixedInfoPartyV": { + "partyId": "72776981E67478FC43AFB05C92EC8854", + "ephemeralData": "0762C069B31DA4152DA4CBFD1336802B37A336228189E459BDBA2BF2" + } + }, + { + "tcId": 1816, + "kdfParameter": { + "kdfType": "oneStep", + "t": "697CED252DEF29FFF774CC0B4FA82256", + "z": "8B525FD25CF36C64C117790EEFDD0AFF8EAB01026357ECF062F0D968", + "l": 1024, + "algorithmId": "7BABC87C80367B3BD1D050B452574728" + }, + "fixedInfoPartyU": { + "partyId": "0A4C44CA6A8B48D8A217CDFE4EABA360" + }, + "fixedInfoPartyV": { + "partyId": "99919094E5FC05BBD5AC1E004CF5F8E6" + } + }, + { + "tcId": 1817, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E43F68776FEF98934894329E80572035", + "z": "A0F734A0D984246E0AEA98C54B792F0231AE9EF41F517879AAF7D5DC", + "l": 1024, + "algorithmId": "B38D82C7FE847DB1D1A873398A7C340B" + }, + "fixedInfoPartyU": { + "partyId": "008C38CEBC3AE28BF1219F3D49593984" + }, + "fixedInfoPartyV": { + "partyId": "81440A1D51B876357DDEA9A41F644562", + "ephemeralData": "692908CB7B90DF8093EE3D558498363B2E5EE3C0870D62F36544BB9B" + } + }, + { + "tcId": 1818, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B4D03E0BEC1756E172227DAC14AD282", + "z": "AB4B3A033C6BBFED01EB8F48A47073B60947088ED6A4CEDDE5EEA23A", + "l": 1024, + "algorithmId": "F69CADA4F9C46A12168C7021B9522663" + }, + "fixedInfoPartyU": { + "partyId": "D233742DB319B7BE01BF381C0F36CEAF", + "ephemeralData": "7691E66EB47EED38D2C027F983A2E1B2367B9E4C1751751C05FA6019" + }, + "fixedInfoPartyV": { + "partyId": "99D0F7E45892A651D9EA5C998C79D337", + "ephemeralData": "945232C8F7559DEF2578E0DBE4369645E22BA700734D343076D50CCB" + } + }, + { + "tcId": 1819, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51ED1973759F402BBD3DCD4171BE9E23", + "z": "EA556993CF5063CF18C0C50EB2A1B888DCCAEDC3FFC6D14408EE796A", + "l": 1024, + "algorithmId": "1A147EBB2596E182DE86232B8026D19C" + }, + "fixedInfoPartyU": { + "partyId": "53ADBED751D60B9042BA45F3686B1083", + "ephemeralData": "EE02225FFD43E86182B37CDC7CDA741F290782D458AE67ED9F733461" + }, + "fixedInfoPartyV": { + "partyId": "C21F10BDA9964BE13532CBFCB511416E", + "ephemeralData": "E6919AA541542D517093EABF64CA3F75F078A2D0FA41FBD5FC977018" + } + }, + { + "tcId": 1820, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B188ED8737433B7F2707818C3F8B2E3", + "z": "91E2CF32E49EF759391465F94D48C74951944D6C30B431F528B9A896", + "l": 1024, + "algorithmId": "331A6AEFAE7069258287E5C499C2A35C" + }, + "fixedInfoPartyU": { + "partyId": "CB56C8FDB13EF1B14617455196A91371" + }, + "fixedInfoPartyV": { + "partyId": "4F25F5D40A9FD1DF79737A26EAEFA91F", + "ephemeralData": "7773721C35994AA6F22513FFD3A0903B6226079B01B003FFFDA359BE" + } + }, + { + "tcId": 1821, + "kdfParameter": { + "kdfType": "oneStep", + "t": "868D3039EB6F970722BD28A4E6CB8BBE", + "z": "5F9DAACFBF56E0D1E60A77F30FA2FBC7CD7C786747BB52CE3383544D", + "l": 1024, + "algorithmId": "6404D3CC65CB6E9D2D35D1F6A4CC8DE8" + }, + "fixedInfoPartyU": { + "partyId": "2C7E84CF6B95D14F781845E16CF34A62", + "ephemeralData": "E122C02AE382EB0F841DE55CB52363C3FD6CB4A725C2F860F40C5AF0" + }, + "fixedInfoPartyV": { + "partyId": "913A473051026A9150DF142A624D169F", + "ephemeralData": "E2F224D383AFD20A669085E1D5A0CA28D8049CA7619F73B5726E8B7A" + } + }, + { + "tcId": 1822, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA247CD405EFFD43FAE1071AF3076D21", + "z": "66F979EA0553E9206CCB433B84B8784B53B473CD1FF174D52E920061", + "l": 1024, + "algorithmId": "DFE089174ACF132C6B13A7633C74CB0D" + }, + "fixedInfoPartyU": { + "partyId": "A725E87CAD09B1F616E814EEB0970EB7" + }, + "fixedInfoPartyV": { + "partyId": "7A5B448DAC789AB8B091C96B44CAAF8E" + } + }, + { + "tcId": 1823, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B229C47C01B302D4A690E93B63930AC3", + "z": "3926FB2C6244CE3DD8FB46799B2C6967CDD0E3D9C4FD3186B4FEF061", + "l": 1024, + "algorithmId": "205D0A00188B9B888E1CE93CFBA2BD4B" + }, + "fixedInfoPartyU": { + "partyId": "5889CF0D919AA80B10B7D872C4111B35" + }, + "fixedInfoPartyV": { + "partyId": "0B8A879CAB927550C9358717D56B3FC2", + "ephemeralData": "246222FBDC931D63BABC694AEC456DCA69ACD1901BB28E5A0CD1BE8E" + } + }, + { + "tcId": 1824, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1761AEC8D40316D5C9AD71197869E67C", + "z": "DB19A2699C449460ABC45AAECDD9B802E3786DFDEDC25268B63F40F7", + "l": 1024, + "algorithmId": "23626FE8BA8CDCAAEAFE3FF2EE6B170D" + }, + "fixedInfoPartyU": { + "partyId": "AC7B7B242ABAAB30A8C3757BFC22293B", + "ephemeralData": "9F039D31F48D687B4AD3B2E738C64DA2FB62B6B6EA6D25363D1CC7CA" + }, + "fixedInfoPartyV": { + "partyId": "BFC412B504059EFCDB9FA29819E48799", + "ephemeralData": "AC493CEBAE006349D12F50CD21990B2739627D61A7C93CF1F45D8DAC" + } + }, + { + "tcId": 1825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E6A3564FD1FAB991D4AD2D622D309155", + "z": "E522D884BFC7D9DEADF955D9571F208FAB3165CB13EDF23DD7577898", + "l": 1024, + "algorithmId": "E712E4E60354D356AD7E029EB3AC32EC" + }, + "fixedInfoPartyU": { + "partyId": "FC621DA462AA3B8D6E6B6D30FF5DAC08", + "ephemeralData": "AB9ECAB1B4217B32071F0A08D0645297B0BE08F65CFAF8A299714501" + }, + "fixedInfoPartyV": { + "partyId": "6539A262B3654BB09383C3CA77C00897" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 74, + "testType": "AFT", + "tests": [ + { + "tcId": 1826, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02BF784C7B13A6C7E8C33F509720A1EF", + "z": "50F4CB24A1FD759C498A7A6CC314A858D91CE2AF387A328EFE245116", + "l": 1024, + "algorithmId": "CABAAD7A053F162E1BB9CFF7BCB3E8E0" + }, + "fixedInfoPartyU": { + "partyId": "6DE7E727BD3BBC8829EE3C56B5CF3EBB", + "ephemeralData": "3FAF3AEABA1B826613717C293DC3D98353A16676EDD20F50921E90E9" + }, + "fixedInfoPartyV": { + "partyId": "D6E0C7FD2E6BBDD63A3B7E8F8DB421CD" + } + }, + { + "tcId": 1827, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58D36C5F4CE2CC08921843E2E4B8E25C", + "z": "9D26BC07D74790DE7B538AE5704B0E4323E18E37B7FA7741A3511A10", + "l": 1024, + "algorithmId": "5F1C5AA01EBCC1FA15F97E6A2E4E201B" + }, + "fixedInfoPartyU": { + "partyId": "54AC00E7E41E7808850E63EE8EB5AC9C", + "ephemeralData": "6B6C68C500DF3453D88A1B5D51849C79D37F7A5818D5667281F94FF5" + }, + "fixedInfoPartyV": { + "partyId": "E99675E046291C2C6C1176F3E3DD936F" + } + }, + { + "tcId": 1828, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA42357212B526881719A9587A58ACB3", + "z": "C6537CFF531E032FBE525CBBFC7C7F6BAC526AF12E5B8066E2A1B8D0", + "l": 1024, + "algorithmId": "8B3CB2B9B5B9829F6DF9F2ECDB9418FC" + }, + "fixedInfoPartyU": { + "partyId": "ED88295033245A1001E4DE4069FAE73D", + "ephemeralData": "3760EC7A9B8D6BE86F0AF1952CE9E34E99CDAA84E31657B8AA08AC6D" + }, + "fixedInfoPartyV": { + "partyId": "33BC86E48F841B4BD091FB307A056D1E", + "ephemeralData": "6D79E11851526852A516C4DEF6CC2F6D1E016E7E7E38BB063B77C267" + } + }, + { + "tcId": 1829, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D9D55A1DF59751F2B3DFA52F261CD2B", + "z": "82394370A8E989FB6D4AAA5C1ADF96EDDDCFCB16B3BF4BE61BF49654", + "l": 1024, + "algorithmId": "7E4C3097852C615B047801F8596FADA2" + }, + "fixedInfoPartyU": { + "partyId": "86DBAE0EDF97303B0131DEC4066298A8", + "ephemeralData": "122BDFDE650F18C9697E0B3C12A3AB4CACCA522F0AF7833F95893E60" + }, + "fixedInfoPartyV": { + "partyId": "8C94FB6B1469EDAF05107D63AE4D5F6B", + "ephemeralData": "A24F629D9ACF481B04D09FE45860B7242F47611D5DA2D1CDF484EF54" + } + }, + { + "tcId": 1830, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4D553D139AE0E2EDB242A54D1E055E0", + "z": "4085B1587CC553B1247D88778F98AC217EDF9B91B4E3D71B5448E2FE", + "l": 1024, + "algorithmId": "8F46C7575EE50F7903FF5E4FB48C7CA6" + }, + "fixedInfoPartyU": { + "partyId": "B9402C710874F27F7560303A2531C6B0", + "ephemeralData": "14850F234CF144B969CA04A3516AFBCB1CAA03B0D549C21F7582B9A5" + }, + "fixedInfoPartyV": { + "partyId": "2D8950E80391CA03F8B2310B1285B275", + "ephemeralData": "72D84E71489A10977DFE60353D0F5235C76191507527CEB60AF6B359" + } + }, + { + "tcId": 1831, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57CF8FB3EF2EB244CF13ECA68C3B50C2", + "z": "2AE62CE810B5AD8948BABF5321CA98D15F174DFDCDF0EE8BAAC005D8", + "l": 1024, + "algorithmId": "3306911562542E229872BFDC2BFCFBFC" + }, + "fixedInfoPartyU": { + "partyId": "598E6E5FD4A75BD10F89FC5F92E48391" + }, + "fixedInfoPartyV": { + "partyId": "075FC2B04F2BCD86D5F49B0CE7ABFDB4", + "ephemeralData": "5E2ED8BDF0E784423A2E343B5C1E1AE8E517F850BA0FD40084687A3B" + } + }, + { + "tcId": 1832, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB97312A40C25D80C61BD0434CDFF26C", + "z": "6DC3D2AC5D4CC055F22AC148E625257B076A013C99F77A908E41A2AB", + "l": 1024, + "algorithmId": "5F32B9505C705C1E21B95CCB4499C72D" + }, + "fixedInfoPartyU": { + "partyId": "410F46FAF1CEA377ADB1B5C5ECF6799A", + "ephemeralData": "F2A46F7874C5427D0BC3FF8AB7BDE2E455EB65A40769F7DB375B4B13" + }, + "fixedInfoPartyV": { + "partyId": "4F20E58D82BE35688798F70BB00EF838" + } + }, + { + "tcId": 1833, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4059F38B7E299572FADE5F344A00A67", + "z": "EAB68979A499C8C71FA569034723BA034815C5A82A0827A16B4E5674", + "l": 1024, + "algorithmId": "8D1A3421272B3585D199BF830DB9278A" + }, + "fixedInfoPartyU": { + "partyId": "2E9C76013FECAEE5CBB23630E598E2DD", + "ephemeralData": "7C55615808CC182F2CC64C1D7117F1A9BDAC2CE6FACEB39A759D2C65" + }, + "fixedInfoPartyV": { + "partyId": "0949EBC92F4274195C14D56B2C511D65", + "ephemeralData": "0AA857BADDD45180DBC995525E391C945F4C9F02D629E3CED4BC3B0E" + } + }, + { + "tcId": 1834, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D94796B9F999F59F8BA2E9AC36CAF27", + "z": "495CA43D06C458F0868D89770464341F577280BCB3DC545582CDE91E", + "l": 1024, + "algorithmId": "5012DFF8DFD8B36A90001CE9B59CF734" + }, + "fixedInfoPartyU": { + "partyId": "1907B8D2D3FA90110FC1CB1FF1246083", + "ephemeralData": "8EE6F355725438815C5B3092F7B144C725C51D0DECE228943A24D862" + }, + "fixedInfoPartyV": { + "partyId": "AD11044238EE0F37CBDA4BAA5137B4BA", + "ephemeralData": "4183BFE5697B7A73E659325341A1E5B1842A3ABDAB8840DB494B4AEA" + } + }, + { + "tcId": 1835, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C93C477D9C714E455E162D4C3E4CD161", + "z": "586AE2982F2BF616B511DED62D6BB6488A943AD299B3A5B3309743D9", + "l": 1024, + "algorithmId": "B5FA57288F029E0826E39CA6AF40AF5C" + }, + "fixedInfoPartyU": { + "partyId": "126BB31EBC02CABFE4B63961C0A8472B" + }, + "fixedInfoPartyV": { + "partyId": "3BD0976818E2B387359EC543E28E158B", + "ephemeralData": "D386DA8A0981E775DBCD0C96188A639655DC0C6E86000F29D3918B6E" + } + }, + { + "tcId": 1836, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADA1A30A00D0514630BAB110636CCAFA", + "z": "449DB7C6E5FA4D655A32FA9ADC8E82E4137B3CBA61B115A220FC0CC2", + "l": 1024, + "algorithmId": "2A839CCEB18AC493C7802D95E4E78196" + }, + "fixedInfoPartyU": { + "partyId": "D3A80A19E588629FC2EFDC22F0BD7F5C", + "ephemeralData": "72373DCC9308F08B7F3A056D77EB591712754747700F65F4C2C34BA6" + }, + "fixedInfoPartyV": { + "partyId": "95DB7FAD1A6881DA6B20AF26A45B404D", + "ephemeralData": "9DEC9D7F3967ECD1EC06239D2EB6F53043B5AA546E05AB6D9D0888AF" + } + }, + { + "tcId": 1837, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC243A9BAB401B942A9181F0BED61016", + "z": "4428308E22ECD5CF4B946BD262BC320CC1EB7BA2216713BC6DAABF53", + "l": 1024, + "algorithmId": "BCB98817FE5C7F355DDBC85FBD5B20A4" + }, + "fixedInfoPartyU": { + "partyId": "751BB4A903FF4CDD57AA705AFBC13088", + "ephemeralData": "6B858464889C66F0B9729923EA8BDF87D37E1CD8A530D9DD5E611DD0" + }, + "fixedInfoPartyV": { + "partyId": "5382559156AAE5C613BE8D77BA1AA290" + } + }, + { + "tcId": 1838, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FC64D097C4667E0180819616EC6FEB1", + "z": "6D6782F87ECDBACF55DA6C07787D2CFAFDF8D48B0BB4874F0028212E", + "l": 1024, + "algorithmId": "DD1A48815E2C32A34757DAD5479B0098" + }, + "fixedInfoPartyU": { + "partyId": "8DE3BA49298E19206030AC6C563DDA93", + "ephemeralData": "DEEE581CFC4E90A296B0774620CC08A95474B070729C74CEEAB31D0B" + }, + "fixedInfoPartyV": { + "partyId": "FCFCE4A166C582B365EC5D40D6140CB1", + "ephemeralData": "B2C36D661B4C139D9B64C0BD8676CDB7CE7A7EF633430308C111760C" + } + }, + { + "tcId": 1839, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3AA76946AB2DE58BFE7019FA98482F63", + "z": "AC1C2FBBB7A22E1D45FE561E2A9FEB666C2832D5AE2B1E7E62CA53FC", + "l": 1024, + "algorithmId": "E24DC3410F9E187606864E92A82E2CD1" + }, + "fixedInfoPartyU": { + "partyId": "C7C399034563EAF9EE1264710CC0DA20", + "ephemeralData": "F33331B1D801FB1B72FA8D7E014FA712B0CE1C626AEF8D0246A09803" + }, + "fixedInfoPartyV": { + "partyId": "470FA1D04C1E667B96B7C6DA6A8441B9" + } + }, + { + "tcId": 1840, + "kdfParameter": { + "kdfType": "oneStep", + "t": "942FA529976D2973CA28BC5F770BDFC0", + "z": "B385F8428BE42D3877DB2AC0EED2C5091D0FC24FB0E3CBE84FDC60A4", + "l": 1024, + "algorithmId": "C1EBB073BC0BD35847CFDFDCF9C26B47" + }, + "fixedInfoPartyU": { + "partyId": "9D275BFCF5D89BD4121876A3B31E3872" + }, + "fixedInfoPartyV": { + "partyId": "46EF0C507B765CB7C9FED67E57AEC00B" + } + }, + { + "tcId": 1841, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0BD659E3D95F241313A2E83490D8385B", + "z": "A476540A24840C1E89780E6A2C23C313A90A1EEA8B1BA725BC77AF9A", + "l": 1024, + "algorithmId": "288B89A21DEBA9A52674F3C88A67AC0C" + }, + "fixedInfoPartyU": { + "partyId": "15A64D1CB402CF11F383E0D24C439B93" + }, + "fixedInfoPartyV": { + "partyId": "31D1B1522A8DEC4CE1D46E33004FFFF8", + "ephemeralData": "F6F4856A6F2C60A3265411466F66D16DC30C9B1A304032D7BDDB4EF7" + } + }, + { + "tcId": 1842, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C126AFE04597C30FA44B57D621FB1145", + "z": "09CA11F13AF60419867F7D15EC098F542312ADBD37DEF459F82C241D", + "l": 1024, + "algorithmId": "C13B0D6FE23AF18D085D58CDDAB53C92" + }, + "fixedInfoPartyU": { + "partyId": "2864C432506843E04BC579CBDE2817C1", + "ephemeralData": "14D20CBEC9DB583385A676D4294807F12D18A7A02F6330AABA804F28" + }, + "fixedInfoPartyV": { + "partyId": "D12AAEC5E7164F4AC1C8F5CDA055532F", + "ephemeralData": "6084DF863FFB5F77514D004E5E9EFBB674D011A3BD4D5E26203BEE1D" + } + }, + { + "tcId": 1843, + "kdfParameter": { + "kdfType": "oneStep", + "t": "418FA46BA5BC20D0CED4E64747EDC54F", + "z": "71741A21D7651D4CDD13598D63F470FDFAD534AE6C0665B5D4F308BC", + "l": 1024, + "algorithmId": "5AD8E8BC2385C9F543129C9145E8F5BE" + }, + "fixedInfoPartyU": { + "partyId": "139981BFE9A404F5B467443950D76DDF", + "ephemeralData": "B4886E3F08B9C0845C408C95F19BB31BA29EF5B2901217592C60D1DA" + }, + "fixedInfoPartyV": { + "partyId": "4E87BFC5558644134847C65184CA1D2A", + "ephemeralData": "0550DD526B54511A2A94665D8FEAEC5817198CB658F429F80950D911" + } + }, + { + "tcId": 1844, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2016AA4C6894A8D8F9AD220D64B0CFF4", + "z": "3E7BE309E53DEC0251081DAA50C2C657E59BCBFAD55B74755342ADA6", + "l": 1024, + "algorithmId": "2403D667CB99CDB30226C3E753DCB608" + }, + "fixedInfoPartyU": { + "partyId": "426ADA737FAEAF93BA2479B709B6BD2E", + "ephemeralData": "6FFABD08A1DE2E91153DA61DF9914A5D6FBA1DC4A12FBE43E512A1C7" + }, + "fixedInfoPartyV": { + "partyId": "5BF26786FEEA586841415DFB8227DD89" + } + }, + { + "tcId": 1845, + "kdfParameter": { + "kdfType": "oneStep", + "t": "900613A587BA28516D2E792DC8014C4C", + "z": "D65DBF5DF6D88426A14C95AD6E5BE97C9806E3BCC4AE3616E2161C40", + "l": 1024, + "algorithmId": "BAA4E0669C9F1A08AF1CB6FFAE2D8B6F" + }, + "fixedInfoPartyU": { + "partyId": "490C3D9D16A4C1CA4A5C0E13F40A94FC" + }, + "fixedInfoPartyV": { + "partyId": "D856851F44BB6964C60FD94CCD68F196", + "ephemeralData": "A0A4AE2EFABBAF09F5CDC7848E78E90336F1ECA3118C6D8411D927C8" + } + }, + { + "tcId": 1846, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B57EA1F0C4B87C45C86BB08368BD6C9", + "z": "FBC07177AE9919D6C6D1B402CA5A4201C6B1702D26ACC2941FF30082", + "l": 1024, + "algorithmId": "1B4651AA8D9D1EA6EF8AFD8284CDFD6A" + }, + "fixedInfoPartyU": { + "partyId": "9809652A0686265EA90B32C6BCD07EB2" + }, + "fixedInfoPartyV": { + "partyId": "0223A84567689490186B09802C815AC0" + } + }, + { + "tcId": 1847, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABB2789D3800FE46DB1A1F280C8076A4", + "z": "B8D6B2AEE6E4F26216FFF781DB3BDF559228ED21E90B4E4C432B6078", + "l": 1024, + "algorithmId": "C2A0FEAE441A8C72739D0AB71C8DC905" + }, + "fixedInfoPartyU": { + "partyId": "3AEB976A56765DD24ECC6EDAFAD5640A", + "ephemeralData": "802409ED12E6B82D18BCDF53789994457C85489B78A6B624C3678688" + }, + "fixedInfoPartyV": { + "partyId": "253E822EAEE5F46E2C26EEAA07CBACA9" + } + }, + { + "tcId": 1848, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7D7B38D743E98B835A6D9A42EC39970", + "z": "5E54439F04FDC50B11853CF296D4DB17B8E80FD3EF7F3009C31B73A4", + "l": 1024, + "algorithmId": "0203C4722B694E38AF394EF60C7945DE" + }, + "fixedInfoPartyU": { + "partyId": "945BD31A3FF840A8FE86A2768522C510", + "ephemeralData": "44B2EDD554754262ED0EDF21DCC5241776DFBBC62E5081A7C3DD1EED" + }, + "fixedInfoPartyV": { + "partyId": "E6B057D243689A7725B113696938F745" + } + }, + { + "tcId": 1849, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9ACDD81580D21ED0E65E7B24EAA3133E", + "z": "74C4EB285E2BCEDE8870F6967B72D517325B995494ACC77F3B451381", + "l": 1024, + "algorithmId": "161D8F8BB5B688C6AE7E239395D187DA" + }, + "fixedInfoPartyU": { + "partyId": "8B950F677796E24978331BBBEE99FD51" + }, + "fixedInfoPartyV": { + "partyId": "029413E7E7B3BB45671EEA57ACFBCE2C" + } + }, + { + "tcId": 1850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7ABADE02604628984BEF1FB63625F5DF", + "z": "D0571AA50A0D98D24960028D09217574628AFCF49602B860D74DB613", + "l": 1024, + "algorithmId": "F57DD6F0603F56650E71F2F9EF659529" + }, + "fixedInfoPartyU": { + "partyId": "B9418EF22695A688394CC49C860C11AC", + "ephemeralData": "6DE680E828AFC503F0E3EA3161463143A97BA8707DFFD23D0622D68D" + }, + "fixedInfoPartyV": { + "partyId": "1B2B080D3F6ECA34431775545643573A", + "ephemeralData": "7B672C0219CD542465194391EBBC1EFA26C791C95EA4C0C44F754590" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 75, + "testType": "AFT", + "tests": [ + { + "tcId": 1851, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8BFB716DCA4342067A2876E1EBC89FA", + "z": "0C7B000BD9057A8564555BEAD1A806541CE4A3D2AC972BB78077F2CDF4BF437D", + "l": 1024, + "algorithmId": "B1B33524071990C391DDAF0E26E227EC" + }, + "fixedInfoPartyU": { + "partyId": "7C94F5EF42663B1207E4BE75E18970D1", + "ephemeralData": "E58F7512F4AEBFA02295A6021A62DB8BB0B6759DEC526F5AED22BEED0E108788" + }, + "fixedInfoPartyV": { + "partyId": "C6741B914F1BF366B1E3FD6B79838989" + } + }, + { + "tcId": 1852, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A58D23CEAB7AEC25EACD0DB8C4489FC", + "z": "B32BC132029B0D056CAADF4C8EBE3D725FD78D57D8EFD284A7A4E67220B1B4D4", + "l": 1024, + "algorithmId": "724B8127318D5E8668ACEAB15E6CB13D" + }, + "fixedInfoPartyU": { + "partyId": "3406D3E109079DE416002BCF735D3306" + }, + "fixedInfoPartyV": { + "partyId": "A6C374A14A641B4409F40DC914FF7857", + "ephemeralData": "442842CB9B108B6969253C9F2C49DA2C6706318BA1D8AFAAA83D468F642F24D2" + } + }, + { + "tcId": 1853, + "kdfParameter": { + "kdfType": "oneStep", + "t": "403CF891DE155405809642B9FBB577BC", + "z": "C93DC1D8E7D347D7B3E6F0FF1A1F13F34E83EEF347A6D1683492FAD3C1861759", + "l": 1024, + "algorithmId": "0AEC75DDEC13DEC1CEA0ED3BD9C86DF5" + }, + "fixedInfoPartyU": { + "partyId": "178D4E9BE89380E5C2372BEEC693D2A2" + }, + "fixedInfoPartyV": { + "partyId": "94A65CAB278BEAD331694021D87EEAC7" + } + }, + { + "tcId": 1854, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E2EB6E796B124F176D0F246B1DDD135", + "z": "8D6979688A145825CF8BC3923A70799105D51456A885AC413AD346ECCAC95E4F", + "l": 1024, + "algorithmId": "824B023989A0C44451101AAF05CFF6C2" + }, + "fixedInfoPartyU": { + "partyId": "DC1F286D9A6FA2FEEF958138DB3A6296", + "ephemeralData": "39FD62F053EF3B81E310CCFADAF411F742C8D1483293A4F9D28BACF3466D04AC" + }, + "fixedInfoPartyV": { + "partyId": "D1B5BC02DC3E08AEB5A247FC74BB3B37" + } + }, + { + "tcId": 1855, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29665131E5AC17D6626467B2F9CC86E8", + "z": "83CE6C74892399DC3B9F7A9B00141005C6C5159E0E96E438C1025025E5436428", + "l": 1024, + "algorithmId": "734F471530D126D4FF5121A0F9FC41A3" + }, + "fixedInfoPartyU": { + "partyId": "C0C456D1CDC10A84974D6A04B107A8C0" + }, + "fixedInfoPartyV": { + "partyId": "16CB4D782D8C0807C4AE8D653D21DFE6", + "ephemeralData": "F6BD0B6AC161FCED591B5A46AD8D8E3762D5866AD1B8917C7CC29AC2130DF54D" + } + }, + { + "tcId": 1856, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAB2B5B94209D440976E72F5E1A13302", + "z": "2A0D4223610E950684CC2FECA29F9EEE098290FE9F4FF5D2004E9DE025D61C0A", + "l": 1024, + "algorithmId": "7F2E64A10B9F6AE0C7842D354F2C74F6" + }, + "fixedInfoPartyU": { + "partyId": "B098CE22000FA0E4659E088E8401D4B8", + "ephemeralData": "FC3762CC204CBD3AFFE67BFD8E2AE724E78FDDED8E4B1F5150DADE10151B54FF" + }, + "fixedInfoPartyV": { + "partyId": "C3F7D752E83C3426F6A715F2EE230F5D", + "ephemeralData": "C662ADFD3FC967333F0FF5A1B9DE304FE7EF83BA9152DB1B6E8354226EE7FD19" + } + }, + { + "tcId": 1857, + "kdfParameter": { + "kdfType": "oneStep", + "t": "480E63644AEECBD2D185C4E80BBD80A1", + "z": "1C8058E6207B61CE1D00D15479B956F2111D957129D88D1118BED64584E273CE", + "l": 1024, + "algorithmId": "00BBD3BA9110617FE4A3D5EB4D3253E2" + }, + "fixedInfoPartyU": { + "partyId": "3C605CEC5AFAA4C1CABB36F047C2C752", + "ephemeralData": "017231A6D7B0B8EE9ABC20D6D3A9D6BC0DB9319E5AE4B6C472FDF495AA0E57DC" + }, + "fixedInfoPartyV": { + "partyId": "722270D7802BD5C5D3BD7271000A723E" + } + }, + { + "tcId": 1858, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A19158B4BA352CDFDB3605375C278EE", + "z": "445C9B5F84DEB744CF297FBBE139D6AB47A30964DE022E037FFA4E91FACAF823", + "l": 1024, + "algorithmId": "96279DDF1882FD5AE7E603D7ABB5F72F" + }, + "fixedInfoPartyU": { + "partyId": "C399D55D2571427E9F052CD3E6F477E3", + "ephemeralData": "1E6E71030D786299D07F74BC15ECFABDD167207570D9B6FBCFA44E38DBB59F5B" + }, + "fixedInfoPartyV": { + "partyId": "22092F2B76D8175028AB69A6FC03D51A" + } + }, + { + "tcId": 1859, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36599E85C52B26572D8E79E58E4203B5", + "z": "C40AE8D5DFF88AC56211A6BE4267E1DA3448580F04DC5E31172CF9EE157D0D4C", + "l": 1024, + "algorithmId": "223DF6AF88E42A6390AE000650B754DB" + }, + "fixedInfoPartyU": { + "partyId": "FF1E8A9C865C2AD7BB332878A23BADD1" + }, + "fixedInfoPartyV": { + "partyId": "5348424C01644F1BFCA5771637A4EBF7" + } + }, + { + "tcId": 1860, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B5E0BE8527353C70C1DF31EEED7B351", + "z": "D81CBF5CD5461F29F3F7DB29A833E531959C8D147DF92215D0EFAF907AD983F8", + "l": 1024, + "algorithmId": "09049C752DAB96E40512D0280E2B46E7" + }, + "fixedInfoPartyU": { + "partyId": "3AF8A0FAFBD906C4A17889C3F1348038" + }, + "fixedInfoPartyV": { + "partyId": "0655731A687151E58C1C01B5D80321DD" + } + }, + { + "tcId": 1861, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C030679238F8E0C83191D78A7806368B", + "z": "5D7B84591111FB01C651D7E6D4F32825F6C3DB016FFB744BA5918E1C72A25630", + "l": 1024, + "algorithmId": "E99CFE0798318AC50DBC52F1DA2D939D" + }, + "fixedInfoPartyU": { + "partyId": "ED3022DC162C61A4FDCD2A5BB068705A" + }, + "fixedInfoPartyV": { + "partyId": "F9C74C807C2170DB0559DA5B736A1201", + "ephemeralData": "65142480ACB97FAB0F95FEE9107157F424CBDFEA3BAA842FF65BFB9B13739115" + } + }, + { + "tcId": 1862, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22B390D8C2182AC54CC0D8D2A82BEEF0", + "z": "CA7A66A002682516F1BA8CD35DA5FC3B923CFA50D934B8DA56510A8418D4A88E", + "l": 1024, + "algorithmId": "E7EB8DE8530C1E5B5329B82C2E71D7C9" + }, + "fixedInfoPartyU": { + "partyId": "CBFBE7A319CED49CE562D2B840C5E96A" + }, + "fixedInfoPartyV": { + "partyId": "3D73B64FA15F02E3ED014E56EBDB8786" + } + }, + { + "tcId": 1863, + "kdfParameter": { + "kdfType": "oneStep", + "t": "664B622FD51033C09DD793C79C799402", + "z": "7AD50AA66AA17E2C8238B883896CC2EF51B778EF68B4797ABB52C030E0982648", + "l": 1024, + "algorithmId": "FA3512D1BB50A6DC05E0B79D611C0416" + }, + "fixedInfoPartyU": { + "partyId": "48AD6FDF4E22BD4141CA5579AA73EA5A", + "ephemeralData": "D1BDA3E996C6482BF89AD70D04040D39A47015E81FB1B316EE8FE2C1F56CE5BF" + }, + "fixedInfoPartyV": { + "partyId": "A8582118A163BCE30899846824E6EE58", + "ephemeralData": "EF0AE0F9745021FC74B53C4B2FF9C7E0F67204F91C79CA744BE86E43A961A5A9" + } + }, + { + "tcId": 1864, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A87A63F486D4EA3D3CFC55C55B8C04D1", + "z": "98B65477C164054FC454D70393E833A538D2DD39C350F034DD004BD59D1E1133", + "l": 1024, + "algorithmId": "C8C30C6248368CFCAADA4BACA2424B19" + }, + "fixedInfoPartyU": { + "partyId": "5F023905D527AE0386F226EE51148D11" + }, + "fixedInfoPartyV": { + "partyId": "39DF663EE6CF4D5ABC5CA4E67BC1E09B", + "ephemeralData": "4848C59F23D89494B8E82B1CF574DBA8040216BE7FAF549062407F4981C8ABB1" + } + }, + { + "tcId": 1865, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E337C6DD543C7E77F7639A5EE7331793", + "z": "89AA92C1D36933A70BD9ECC28CB9B3CDBDF05A97905089486655CD5671B97D57", + "l": 1024, + "algorithmId": "79258BBFD4E1EE4F87E6FD52E02B0BA5" + }, + "fixedInfoPartyU": { + "partyId": "1C5FD249D49ECCC2C523B4D2427DFEB6", + "ephemeralData": "D4D5C1044DF5CAF38F19EBAEDD99D9C7DFB5A5816422C9AEA46B21AB0C2A867E" + }, + "fixedInfoPartyV": { + "partyId": "27406101EB239E12DD0B7C800C42464C", + "ephemeralData": "89928E2DC810CBBCCD4A5FA9623B174EF4ED9F1D2BE1189A6D92DF3EC5F981F4" + } + }, + { + "tcId": 1866, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4594AF2C2BB8D6DD5A5A5097BDBAE4F7", + "z": "E390649775C2F8B7C57C896F17EA44CDBE9737CFC3D1A0DD4A0DBC5F32E5CAC5", + "l": 1024, + "algorithmId": "F1F69C419278A193BC90504CA0521216" + }, + "fixedInfoPartyU": { + "partyId": "A58A977FF7DF6FD63A91C3B777CC320C", + "ephemeralData": "6E204584A9FF41B0B20906206B9CB7ED1078B398FA677A1F4D3BD67CC5E75EFA" + }, + "fixedInfoPartyV": { + "partyId": "BC3E402A489729905C8F1EA8069C351C" + } + }, + { + "tcId": 1867, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C948228FA2253A7A1571D749037574AD", + "z": "A7E794A40047BA37C3A42E44131719F76225E7F8E352B9E9D0511E5BB9DEBBC6", + "l": 1024, + "algorithmId": "9F42155EB77BD1CA7736CA3BC2D0A99A" + }, + "fixedInfoPartyU": { + "partyId": "931D8E84901AA4228F448937A2F1B289", + "ephemeralData": "9DA83F14149FF088D46D2B82F54659ABD1552B51D7A0811A169785350B76ABC2" + }, + "fixedInfoPartyV": { + "partyId": "79D1B7A4071D8C592D539C71E8E2EAB3", + "ephemeralData": "1ED02F660EF69B19060E606C49662302D8DA0283E54582A23D97929DD634D9BE" + } + }, + { + "tcId": 1868, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CA38BD0FEDFE5C1199199178A6EBE52", + "z": "43E0998476B0A815B74196D795D076AA32038C8A1D3192822C10B345B4DD7EA4", + "l": 1024, + "algorithmId": "60EF9B461B3578CEB198645C71C2A651" + }, + "fixedInfoPartyU": { + "partyId": "358E7468840741AD9E1A3ABDC777B9D5" + }, + "fixedInfoPartyV": { + "partyId": "B1E9A799039C9F253D0DA50EBB5A54AD", + "ephemeralData": "1E99149A7E9B988A6914C6888644D7947B19A14FBC8E95E7315B70743B15D147" + } + }, + { + "tcId": 1869, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E14340E0C06F301B405D16EB80DFF8EA", + "z": "02795A49A05A6B50237458372715D25515D9768BD010FB0F973C2D1A82F832AF", + "l": 1024, + "algorithmId": "BB9342BF0395DB42591BB8D076ABAD3A" + }, + "fixedInfoPartyU": { + "partyId": "A5B48C05EF7148BBBCA1104A8C53B397", + "ephemeralData": "B6C31E85E7EE6B583144CB4C22D7380E82B44D9CD3AE31D4BD56A91C2B0D6B59" + }, + "fixedInfoPartyV": { + "partyId": "FA1FE9F2DF75CEFC0A7BD66BEFEF48B4" + } + }, + { + "tcId": 1870, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F22CBA7C524BDD30852C8887347C52F8", + "z": "1F02A1C8172135BF2908C4C8609434706B8BC3C96E2677648359ECC39035D4AE", + "l": 1024, + "algorithmId": "7553235DE4A546DA7EF413F551BAECB2" + }, + "fixedInfoPartyU": { + "partyId": "6DBBBE620FD0F9F80CB2C2ED8836B219", + "ephemeralData": "7A01C7F8F3CF678882AD7D028D16550775C2BA41CA8ED00CCBEA2ACC2548E2E0" + }, + "fixedInfoPartyV": { + "partyId": "3EB64123F1E1BC4B884CF9B9BFE8C6B4", + "ephemeralData": "B0465EBB9C45418D080DBB03D27B1614CF44D3F65A659DC634624FDFA4695A9A" + } + }, + { + "tcId": 1871, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF030BD96063C185256CD83BA7677B8B", + "z": "3F1D68F9C393F119ECD0A17E62271992BD4616EBBA1D3B2F29C495108CFFAB3D", + "l": 1024, + "algorithmId": "40C852F26122804BF6C95D85191685C4" + }, + "fixedInfoPartyU": { + "partyId": "6F39B1BAFF783EB7F6303B534624337C" + }, + "fixedInfoPartyV": { + "partyId": "1EC62F00011E7313DB9C70A1E4C0CEA6", + "ephemeralData": "B10EB6F411C83F6B88C2DB5B5C99534823B86731D02940AB31E8566AFFF1B83D" + } + }, + { + "tcId": 1872, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D0C379261A2A0712BEDEDE514DF78A0", + "z": "5468F4974BC6F9E52B3DF8D5CF59849C673492F188F99B917521275CAF54C183", + "l": 1024, + "algorithmId": "B1CD0E9D7E71888BFB563AEC3724D318" + }, + "fixedInfoPartyU": { + "partyId": "DE3965F349836A5778541EBADBFA547B" + }, + "fixedInfoPartyV": { + "partyId": "329DDED56163C928848B473CDD0EC53B", + "ephemeralData": "E68C8117F15491576F0C3E765A2F5BDEE7C08038F3756A78E0307DAC58979D0D" + } + }, + { + "tcId": 1873, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6778C5099E16604DDE0A6B3A2B0F229C", + "z": "C06D35BE371F7FDC25751B4F99FF5CEB5F20B1C8774C05423F36D8740FC8B456", + "l": 1024, + "algorithmId": "E9552EE75CF38B8676D4D5986C5EE691" + }, + "fixedInfoPartyU": { + "partyId": "9C16921F35E8CFEBC474466533058B12", + "ephemeralData": "68490640337FAD3BE7A5FAEDAB3C658B970C80FEB9F433A33E3A18DFC6ACB3B6" + }, + "fixedInfoPartyV": { + "partyId": "4FEC0B7F12C2F4CB7333FAC08207F882" + } + }, + { + "tcId": 1874, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9800E0D2FC1CB5C065CD9F5FC902C843", + "z": "6212DDCD5CB13316BB451D91304C17107A33A59935BF3BF8E8AA4C3B6649EEDC", + "l": 1024, + "algorithmId": "7D4E2E3FFAAF9643E5DAEA117198E45B" + }, + "fixedInfoPartyU": { + "partyId": "1ACC97E023D11A1EF641E8E4501D1696", + "ephemeralData": "677FDB224C761255D52795E388829F5C281A1A4D9A084F8DA9BF07CF93BAECA2" + }, + "fixedInfoPartyV": { + "partyId": "FFD05B399957A75E0FC6CF58F12ADA97" + } + }, + { + "tcId": 1875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B3FCACE73092B37953FC50549B2F736", + "z": "E5989A05B0087A24088448DB369111D60BA3E7790AB2D4093F18AD8FB85E5786", + "l": 1024, + "algorithmId": "FEF4B12A63E59FAF660E0EDB3F0F64CD" + }, + "fixedInfoPartyU": { + "partyId": "4F1B3512304073DE886F3B52D3DCD95F", + "ephemeralData": "5FEFF65307685709A19AB8D00AA0AACD3C6E3A67A5149355D33E300938BD9CFE" + }, + "fixedInfoPartyV": { + "partyId": "3877E25AA7FDFF9EA956ACDAFE0629B8", + "ephemeralData": "E02746F2BBD06BF654216170333EEDB5A45F7F36C7B12F1B0145B7457B8A44F4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 76, + "testType": "AFT", + "tests": [ + { + "tcId": 1876, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70120139C626B4DAF3CD693EBE41CAB6", + "z": "17FFF315F04EB8FECA9F0ADF5EF9631F71854F486AF8AF067DAC19C2D3", + "l": 1024, + "algorithmId": "829DF3F5FBE9C05E44243EB3CE08BDB7" + }, + "fixedInfoPartyU": { + "partyId": "1AF554481BB004F0D9332879AD5C0B5D", + "ephemeralData": "835ADA6E202FF6F7D8F23D0CE1AF1368BBCB09D4A672F759672C50BB81" + }, + "fixedInfoPartyV": { + "partyId": "2A53D33A64B1F6EAAE3793A934C2AA81", + "ephemeralData": "8E8B15F601DBD51296462A24EF9D7EF80C20C4896F27B847676B9C9C35" + } + }, + { + "tcId": 1877, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66B00ED0FDB6722B4080B43BEF4D907A", + "z": "06302F38813D57B84A246C6628F2A7ECAFA4A2C289F30F0F051EC7D81A", + "l": 1024, + "algorithmId": "1AC82805096FDF5C91B3BCA35B7801F2" + }, + "fixedInfoPartyU": { + "partyId": "1278655A816B15AA602CEE092F4EC0B5", + "ephemeralData": "A201517D917AFEA6755401D3EDDEDFCC9D8A81611C8BA26AD5C4CB3E90" + }, + "fixedInfoPartyV": { + "partyId": "AB8DEDA3AC56E04165F0A7A52BDE53EF" + } + }, + { + "tcId": 1878, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09A439CE329E95D8606EB1D37F497576", + "z": "82D9D03EB108A66E11C8085D915ACCE997741C280E0D17C33921BD2A9A", + "l": 1024, + "algorithmId": "870DAB556847BB47602C206EA89E20BA" + }, + "fixedInfoPartyU": { + "partyId": "95AA713C5DB34DEBED2BCE3E160E92F9", + "ephemeralData": "6A5510A66CA11B595E0E95148A3DF3FB6FB4842CF8DC3070A044C8EFC8" + }, + "fixedInfoPartyV": { + "partyId": "A6A2463ADD22583E10E075B772FBFCD4" + } + }, + { + "tcId": 1879, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EECF51903043CD18108D6035652175FD", + "z": "6F9CF99C25E369EAF719E0772E6548BDC02B8122119FC49E8A401F2F13", + "l": 1024, + "algorithmId": "302B7CDFAF91A47E5153B36A11ACB344" + }, + "fixedInfoPartyU": { + "partyId": "DE135481B15FA6EA5CB09CA2D42CC122", + "ephemeralData": "6781D0430997201E575560EF2F27A5ED1A3BC529F7B6711802DD855B4F" + }, + "fixedInfoPartyV": { + "partyId": "EA72AB1EBBA82092169D4CC404569675", + "ephemeralData": "99B8CE9D1007A156366F92814EEF47BED4EE3A310A89B2645289B9B8CF" + } + }, + { + "tcId": 1880, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79926D63748B087205B59A8CF0A79219", + "z": "455F245CB66D0A82F5911BC9A1B8489675014D55406DC0D2F658EDA758", + "l": 1024, + "algorithmId": "7555122CC1F524545DEFD16796616B07" + }, + "fixedInfoPartyU": { + "partyId": "4C37AF39D2467EFD2584697C91E6F97B", + "ephemeralData": "BED44AA493C42CF970675CC52860AD9AA2809DD583015299D2D2BFDC8F" + }, + "fixedInfoPartyV": { + "partyId": "E793F88F945FA872A048CC0221D3D2BB" + } + }, + { + "tcId": 1881, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B558049D6F764273FA2A482BD79E4D0B", + "z": "1C90645E9CD6D7C4F7AB981E1A050D463EC37180D450EDB361882541E5", + "l": 1024, + "algorithmId": "12B4FBF36006118EE47693D2D758C71E" + }, + "fixedInfoPartyU": { + "partyId": "D6AB024D5F57B12CD6B17B50B9894606" + }, + "fixedInfoPartyV": { + "partyId": "5D4F02EB4E6920BDAC6B7E5571342CBB", + "ephemeralData": "87475A920D1EC8B1AB5B37A335002CC1AA4C406DED2F5CCBEE0AE739CD" + } + }, + { + "tcId": 1882, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62A4BA15A893C6F9AA253C25C8E06CE9", + "z": "7F7DABDD59FD4A1DE6CD3F8EE4FC87E14EB7A8A7546650F1EC94635952", + "l": 1024, + "algorithmId": "AD4CA719A29949C47CCD1243A4877E39" + }, + "fixedInfoPartyU": { + "partyId": "937D74791CF8C1B743C05036A4096725", + "ephemeralData": "B047CC2CB9C79118129F402EE7D3460E3B650F357CD67B86C3963E185C" + }, + "fixedInfoPartyV": { + "partyId": "B11ABACD8EE061E83E9281EB6ACCA96D", + "ephemeralData": "1160CDFF95B38D4FFB428B0E2633BA96DD7787435BF33C459248B2B27C" + } + }, + { + "tcId": 1883, + "kdfParameter": { + "kdfType": "oneStep", + "t": "055B8A14ACE9ACF99895667ADFB603E8", + "z": "58A56033C80CE2398F444540DAEF99F5893B30213322AC707224D5EA45", + "l": 1024, + "algorithmId": "674C05FC40D27C24CE7D425259CC5E73" + }, + "fixedInfoPartyU": { + "partyId": "3558AB945778F4273012FACC2199BAD0", + "ephemeralData": "ECCD4CB2BF87FBBC1A966762C906103F5CC8070B761745D3D2FA12040F" + }, + "fixedInfoPartyV": { + "partyId": "0AEE560A54E6FE5E935C236ED78A8EFB", + "ephemeralData": "4280636B73B41CEDF17D7D7B2A77861F3B8B09533F9EF049CA5067B4CB" + } + }, + { + "tcId": 1884, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A9D858C9F0A0AA644BD45F213F82C44", + "z": "171848A0534544DC0572365655787CC88449BE4D74A1DF412A942979E1", + "l": 1024, + "algorithmId": "28202A8E9C769BEBBA302223EFE5118A" + }, + "fixedInfoPartyU": { + "partyId": "87A49E574C02FE8C0014BB6BFD652D90" + }, + "fixedInfoPartyV": { + "partyId": "C7F88A41E43504042B4F354A928DDEC0", + "ephemeralData": "1CDFB666D216F846858A69E0DFBE9F3DAE253358C977680C194B581FE3" + } + }, + { + "tcId": 1885, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47640AB54A2C367B977B3E0678C2EA52", + "z": "FF6B7AD53E8EF279BFB8B9676A64EA7A46DEB18CEC6E281A8E3D4BD727", + "l": 1024, + "algorithmId": "0152C96022E7FE1C93D62CA1F56CBACD" + }, + "fixedInfoPartyU": { + "partyId": "8C7A8B53C13773157E88FBA09A12DD8C", + "ephemeralData": "F681F355E6617FA6439FAF606FBDA0B8FEBCE5AD87AB504EDFC74C0150" + }, + "fixedInfoPartyV": { + "partyId": "A34D19EEC18EAC381F7985A10178ED6B" + } + }, + { + "tcId": 1886, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1EDA1701B2F0C423445D0AE8DA9FD2CA", + "z": "A581E037A61BB09CD7464DFEB69C616D6BA6DD9F7B396FB2ED00CDEBF0", + "l": 1024, + "algorithmId": "DA0C05C6638D4AF349C89546047C0425" + }, + "fixedInfoPartyU": { + "partyId": "2C495F666317ED0C38DB736E70DB4816" + }, + "fixedInfoPartyV": { + "partyId": "EED2B559B13B534693CA02FC5363B5D9" + } + }, + { + "tcId": 1887, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8B70B6F71771CAB56B3633B5D216C1E", + "z": "66766863788D7293F859ABD6D7113794DE47E50C69FEB764479068DAFD", + "l": 1024, + "algorithmId": "99DCC644DAAFD3E496FBDD9314B92BF0" + }, + "fixedInfoPartyU": { + "partyId": "7D2FF423B5BA524B5D6ADDE71BD82789", + "ephemeralData": "A3F1838CB3CCB7F72C0CE5E09740FBE318DB676ACF5E60999966E51777" + }, + "fixedInfoPartyV": { + "partyId": "037217BC788DEFFF9051EB0C0F439FD5" + } + }, + { + "tcId": 1888, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4EEC4C7A6352AE102C5B8525548A4C3C", + "z": "301B2E70103E15AB01CCF322FC66971AFD09A35F836C01EB0AD0A2B353", + "l": 1024, + "algorithmId": "C2A1EFA39FFC012B1B7083C93E9C6CC4" + }, + "fixedInfoPartyU": { + "partyId": "E2C5D11D4A51B7D14DEF4BAD14DFA00D" + }, + "fixedInfoPartyV": { + "partyId": "E5BD9ABF639EA84D20585866EB17F52E", + "ephemeralData": "E951A25FF48647A645043842BE5C4FD9E381A26B2B19A7CF50F4C3BE76" + } + }, + { + "tcId": 1889, + "kdfParameter": { + "kdfType": "oneStep", + "t": "047D6AD6531CF8613A0B6AEEF7E90447", + "z": "786A376924628E171E9A493D701656D28A952DD680EBB43E0B29E8653D", + "l": 1024, + "algorithmId": "33DD0B820A5176D737F3956399A42FCD" + }, + "fixedInfoPartyU": { + "partyId": "3C1776FD4F0827B4221CCD4CF86D609F" + }, + "fixedInfoPartyV": { + "partyId": "4A06A20485D725E6E32199E306A28FB0" + } + }, + { + "tcId": 1890, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62C2994C1F5960DD255112E3CCEADD5B", + "z": "3B08551DC694CE33B4100775BB6E8C3B06D1431C90C107E3BAD3E3E94E", + "l": 1024, + "algorithmId": "4BD5D9C0DFE78D5596DA9569334318A6" + }, + "fixedInfoPartyU": { + "partyId": "CEC63B29D6789101F5D69184CBBB49BB", + "ephemeralData": "398EE4B979B5AA810688D2D585FE8D9D0D4F1B1BADB292D763EAD4A11F" + }, + "fixedInfoPartyV": { + "partyId": "BB75D7192972575034B4FD47C507F78B", + "ephemeralData": "5F607E34CAD89FC5891323227803F2AA711EF69E7945F466A4D8EBF4F4" + } + }, + { + "tcId": 1891, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67012FC94BA442E7482F90AE365FD7EC", + "z": "0E981EAE00065777C9687291D94A0EFB6D5100E140645BADACFEFFEF04", + "l": 1024, + "algorithmId": "86A83784E353655127B8B2DA05F73096" + }, + "fixedInfoPartyU": { + "partyId": "8FCCF6FB7C3FDAAA3795DFEB63215E6D" + }, + "fixedInfoPartyV": { + "partyId": "C28FFEFEF9988D9E99BC38725A34ECDB" + } + }, + { + "tcId": 1892, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E6D27FE020D48FAE63300FD754C639D", + "z": "FA231B5ABE1A972ADF20A4525A01E2CF01D755B6810E1092981806DAEB", + "l": 1024, + "algorithmId": "7DEFECF2D0AF3700D18E076B1641F21A" + }, + "fixedInfoPartyU": { + "partyId": "AB46F33D530BE4D7E518E550CAD9D28B" + }, + "fixedInfoPartyV": { + "partyId": "EC763E59EC43C17E4C82ACA70B652AE4" + } + }, + { + "tcId": 1893, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7892B3FE252CE26E8EABA75B26CA0AC6", + "z": "83F9A7E7B29CB63A02F4CEA750BF83B22733BD9DA0E6016111E516E2DC", + "l": 1024, + "algorithmId": "0B3D90778F64DB68951AB0DB16765E44" + }, + "fixedInfoPartyU": { + "partyId": "EABD85E30865FA577995B3EB48B497F5", + "ephemeralData": "EB69ADF846EEFF3CEB0906AA6308BA29327A2CA1759EE556D46D5EBC66" + }, + "fixedInfoPartyV": { + "partyId": "681176A9CF4020169AEB803BB2F8B41E", + "ephemeralData": "39C58A4D6ECEA9F7C733EC57B27BA9DB266FBC2A8BE0B7DA80FFAAD024" + } + }, + { + "tcId": 1894, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CBCB7F9D4E12B86FDEFB55E84AB3709", + "z": "E151B09CA7C38B185C46CCE2C7F98F694AACD809FCE7593045DAE7720E", + "l": 1024, + "algorithmId": "6C13EEE9C28CB95DBA46C37D379A9679" + }, + "fixedInfoPartyU": { + "partyId": "DD5588C3DDD927380677B40FFDA6C072" + }, + "fixedInfoPartyV": { + "partyId": "077FA83323E6F52075EA160DE79C1CB3" + } + }, + { + "tcId": 1895, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D63178BB3323241DE943A7846DA24F2", + "z": "BF3341AD52BFD1A5A4417B2A81D796811C8B7DD43180FB8391F5AB0DC7", + "l": 1024, + "algorithmId": "E29E7E145F07600C3612F266838BE6F9" + }, + "fixedInfoPartyU": { + "partyId": "BDA41559296F51A9D30798B9FCF5AB5F" + }, + "fixedInfoPartyV": { + "partyId": "C741E3A3EB3C21A8229B61325B9CC0C1" + } + }, + { + "tcId": 1896, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC7AA1AE6E1886B8EF4CD6649820B1FC", + "z": "6CBD5B549A67E0AFEEF0D3F24DD0B300AFF085A177BC76DEF0497393B9", + "l": 1024, + "algorithmId": "5AD195C89608D555C80C85431443E73D" + }, + "fixedInfoPartyU": { + "partyId": "50C220633A1D69872134DC1C5BB31A9D" + }, + "fixedInfoPartyV": { + "partyId": "B9829CAF0CB30AFD8ACDBB2147D2B840" + } + }, + { + "tcId": 1897, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32CC9B7554A396298BBDE3195474CB17", + "z": "6375C964F33A662F27E0D4F1886B79E2058B4427FC598425FCDEC59339", + "l": 1024, + "algorithmId": "EDF3C7CD65D6096FF65E070CF3EFB11D" + }, + "fixedInfoPartyU": { + "partyId": "9EF2571A46F2F114023A2CA33CD38109" + }, + "fixedInfoPartyV": { + "partyId": "0E5B98EB8B2C090BECC783CC381D4786" + } + }, + { + "tcId": 1898, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9B743BD1BC84278FE845F3E5D67EB3B", + "z": "694DE556DAA38D3C2AA558FCDCE5C429BE58E91202C656C2B4ED41FED1", + "l": 1024, + "algorithmId": "E91F1FF7ACEEC6173AF232905D555F03" + }, + "fixedInfoPartyU": { + "partyId": "762C5AA094783432DDF9DBF40ED37CD6" + }, + "fixedInfoPartyV": { + "partyId": "09DD5D129E7094CF12EBC13FE27E4F40" + } + }, + { + "tcId": 1899, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70B9D2A8AAF3AB79EE24F75EA20E2CE8", + "z": "9EC0299C241578097EC0BA0B3D870F14B0BD3F6D67C183FF750870BACF", + "l": 1024, + "algorithmId": "A01858325040EA65BD77916CA28B480D" + }, + "fixedInfoPartyU": { + "partyId": "B7F03B4DA8E82B10E77781CF319315CC", + "ephemeralData": "17D1DF2DA09793E18BAC589A22C3D6D8E35B42C6F2F8179D6D6B9C643E" + }, + "fixedInfoPartyV": { + "partyId": "35BADC387C775F3223C55EBC5D87CE30" + } + }, + { + "tcId": 1900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DE6CD9E68085D8038EACDE0820B30AC", + "z": "B53FBB0037A51841B96246FCE070AB792DC1331D3094A0A6EAFA764E2F", + "l": 1024, + "algorithmId": "A3D2327A2FD802CD3048BD9C3B392273" + }, + "fixedInfoPartyU": { + "partyId": "9AC352778F05B8D7BC2C008A1B0091E0", + "ephemeralData": "D3404308B37F79A2A5328C4FDE61EBEAC2D136ED948386A28798B1060B" + }, + "fixedInfoPartyV": { + "partyId": "F512F59879EF581C8DB4F40D0A54EE41", + "ephemeralData": "B89CF7C1D336F5B5C6E1FF53AF455E7FE4318C6984673702982D19CE14" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 77, + "testType": "AFT", + "tests": [ + { + "tcId": 1901, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F5FFE4BF2B8982FA9F98356435114F3", + "z": "C84BCEA17C75FDA48B85D21EE66DB7D5864D4EDB7E4A49ED3ADBA679B37593B48B", + "l": 1024, + "algorithmId": "7F3C4A22484527491A93340D2C4E8408" + }, + "fixedInfoPartyU": { + "partyId": "49532BAE3A6908756D7ACCC6B76DBD16" + }, + "fixedInfoPartyV": { + "partyId": "FD1E995F317B0FE90EE26C48F146756C" + } + }, + { + "tcId": 1902, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5138DF3E75E757245F8D96945DC26DC7", + "z": "8F2CFE43E599E8E271CB6E4452E4A28EC27CD805A522D496F8CC1BD8FD1DC18DC8", + "l": 1024, + "algorithmId": "CF3CE3EDCC05C70C3CB8CCF00C41FE62" + }, + "fixedInfoPartyU": { + "partyId": "7E1FB96BC2FE65F552EED11F215F03B3" + }, + "fixedInfoPartyV": { + "partyId": "A797B5E781F01BACF61F83FF533DB0B2" + } + }, + { + "tcId": 1903, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F515D723B7CA5E66A872657962271FB0", + "z": "C0B66F64EE39619B0374ACE33038DAAE6E6BEA9015594C817D87A30C41304DB9A3", + "l": 1024, + "algorithmId": "66600AB1C224D58D921BB897C74376D9" + }, + "fixedInfoPartyU": { + "partyId": "74D6931818F8E4A07BA32430BCF71E2E" + }, + "fixedInfoPartyV": { + "partyId": "961219986AABA62CD90CC0C4DCFC7448", + "ephemeralData": "82E6CB0711F87D03E3EA5E69E4B9FA1B90C48A07EB5BB4FE90BD36893EAEF271E6" + } + }, + { + "tcId": 1904, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B298E3EBBC4905009FF7438F5E618BF", + "z": "CC9EEF7892F4CC5C36D532650C4FC73A647BF77EA767CE54F38703529487BE3682", + "l": 1024, + "algorithmId": "C486DD71C399F62C2D3456851C65364A" + }, + "fixedInfoPartyU": { + "partyId": "99D16198A6E3025F146D2FFF1E3A415E", + "ephemeralData": "5BFAFA9E2F4E63AC3B590A645CBD3D489B2F657AF40E853750E8041C2FDAC70357" + }, + "fixedInfoPartyV": { + "partyId": "7D886A05E7F8AF3535252FF1D7EB2148" + } + }, + { + "tcId": 1905, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9FBC55CD8EAF2661636D3121504432D", + "z": "A8929E25248D37F75C0855203CF75C1054C4B9B45CB03B80CBDD1AA09AA7C082C3", + "l": 1024, + "algorithmId": "865E7FF767CBA458FAFE0E7F9D0D92DB" + }, + "fixedInfoPartyU": { + "partyId": "38B2BA8698924A26298CECB6BF75A3D1", + "ephemeralData": "55853CD670C2D615CDCF249E0544108A07A8E1A5B98C69A34BB72DA2BC04694B83" + }, + "fixedInfoPartyV": { + "partyId": "B1A46D9D23496B07470115A32952A1FE", + "ephemeralData": "1031A830ACDB32FEFD0F75637F8E03BA37E46674476BCCA6379927E51FF3A1307E" + } + }, + { + "tcId": 1906, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9EF8CCC0F4444574D52D1AEDD0EA0D5", + "z": "CFEF330486BC863208114F4C573CCCB9A64A68FC7DC3695714864B51D69719004A", + "l": 1024, + "algorithmId": "B59FA44FBC4FBE7CFF13CA01DD805AE2" + }, + "fixedInfoPartyU": { + "partyId": "DB5AD08E6757C9875484DE088B4F7256", + "ephemeralData": "E12B6279A9F882CFE848DB9EBE198A26F3792410008ECBA48F07B0FEA1B2BF1268" + }, + "fixedInfoPartyV": { + "partyId": "32B987C5B83978839E74B51C30209B8C" + } + }, + { + "tcId": 1907, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8EBCDCBA5E469BEC2B6FB3337A40A5BC", + "z": "2EFB5D6D8EC7EE1BC222EA7B8D6E6368206477D04227BF21008167A1BEE9CBF03F", + "l": 1024, + "algorithmId": "696DF52EED5EEBD717CCD562DB4731D6" + }, + "fixedInfoPartyU": { + "partyId": "231CE947F31279BF3E1BAB84293EAECF" + }, + "fixedInfoPartyV": { + "partyId": "C4C492F29FB2A226A905C3014D78513D" + } + }, + { + "tcId": 1908, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17D03971A30744B1BE4C3B2B8EFFCAAD", + "z": "6E10F72BBB946641A996256FFB3F32C5CC5D9E8BC2FE07334A69181B270CF822ED", + "l": 1024, + "algorithmId": "6218926D37F43F4969CFC3D91800F5D1" + }, + "fixedInfoPartyU": { + "partyId": "A526FC4D33F74495B2923A0B9A4B4ADC" + }, + "fixedInfoPartyV": { + "partyId": "F73C1EAD83B4E66262FC7D1C9107ABD7", + "ephemeralData": "3BBB26E72EDD54A9374ECDC0DD084B5411EF40445B622D2B658DA08AC0C35241E5" + } + }, + { + "tcId": 1909, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FE5EB561EFC55CA86CB39DB607075E6", + "z": "29D20D68EBA118EC6BA02AB71BF84A5F3C29D61A14229CE2385C8380568039A56E", + "l": 1024, + "algorithmId": "50CDF9556C9E0EBD6386E7F6E37336DA" + }, + "fixedInfoPartyU": { + "partyId": "7EB072A99DF82714F266F94DC0B0FE2F" + }, + "fixedInfoPartyV": { + "partyId": "CAD5D070E1676A14987BB653ECA0F7E2" + } + }, + { + "tcId": 1910, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F9DDC6AAADA1D53180168C6895FF3A0", + "z": "2331BF6786F497DB967D1487237E7DC5BE558C2121168E655A9883391B1368A8AF", + "l": 1024, + "algorithmId": "D96A7B68EC63C10E29116111EBF398E5" + }, + "fixedInfoPartyU": { + "partyId": "9132F6EADA602EC67066BD5612BF3C03" + }, + "fixedInfoPartyV": { + "partyId": "5CA6F2128FA2407CEB94273C1F5FA4EB" + } + }, + { + "tcId": 1911, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C8131626917502271F43730A86D0ED5", + "z": "9EE69F9470AEF1B1521DD1E3A8B511AE9F23DD6B6A5484F4215CBBC854ECC34133", + "l": 1024, + "algorithmId": "6AB1028D977D201702FD88FF14224655" + }, + "fixedInfoPartyU": { + "partyId": "73B7069FB33C8611530C15C43F4C6371" + }, + "fixedInfoPartyV": { + "partyId": "9D548CEB0DD7A299A6705063CB20B4C9" + } + }, + { + "tcId": 1912, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAD2854F072C3E205D32518DB8381DB9", + "z": "5482BF638D4AFEBE9AE3C0B0F0DD4C889E6B0CA5284F93D6A14AE25C036B5B66E5", + "l": 1024, + "algorithmId": "44A51FD77BD426080F6BBA891E1BCD34" + }, + "fixedInfoPartyU": { + "partyId": "327A35E2BDB716ED3A5C4039C4709609", + "ephemeralData": "188388B826089A03A2EF4764A79B0F1EFB11163DBD975E45D077A534DAF539C769" + }, + "fixedInfoPartyV": { + "partyId": "A0D830A2FDFB684CCB612F5E48F7FACC" + } + }, + { + "tcId": 1913, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43587924633D8E96873E46BB18264A2A", + "z": "2F11C47618DC96AEB2757F5850C54D6CF1912E1F111C848BB3A210FA8D62004920", + "l": 1024, + "algorithmId": "AE9C6E36E5AC878BE9D9556B2C36F0BB" + }, + "fixedInfoPartyU": { + "partyId": "60767521C12F65843930213A6EECC468" + }, + "fixedInfoPartyV": { + "partyId": "73C63D893464DEAF8ACAC7F2932CB771", + "ephemeralData": "4D6928FA05CC438AE321FD769BE50D046C7B1F3990B34FF3CC8B1C4BB722415AA8" + } + }, + { + "tcId": 1914, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEADDEB62D5474581709745C0F0BF7BE", + "z": "51DD23751B70C429E3F3374226D138A103D6F9D8D9DB285CF2D5FD0E67120BB8E1", + "l": 1024, + "algorithmId": "B499192B9F07FFBCD9A370E41C40ED67" + }, + "fixedInfoPartyU": { + "partyId": "7A7F3D2E4C001D36FAB04D860D73BD08" + }, + "fixedInfoPartyV": { + "partyId": "4A397CB98C4A3D2F18809ED7DCA61529", + "ephemeralData": "01C7A07C6D650F57F4F21E3175370E4C9DF545EBB5A63725F0D788547DC8861BD0" + } + }, + { + "tcId": 1915, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F41A52E8F324A89A393EC53183F1D407", + "z": "F3B6A37180FBBC8270BE5BD18E00D5ECFFDA2A3047D5252733D0BC61D98B4BF151", + "l": 1024, + "algorithmId": "0C110817A9C00E088C64A4A457BCAF83" + }, + "fixedInfoPartyU": { + "partyId": "7D6AF1699F09502117A63286BD2558CC", + "ephemeralData": "7D5290071F51816DE82FB9791D04D87BE16F83C250C1A5561A8C957F661A7CFCF3" + }, + "fixedInfoPartyV": { + "partyId": "858DD05601DB6C308FD865D939A67D36", + "ephemeralData": "CBF39C912EDD0DEC74FF160735DD451A4353C6126D43FEF9314D437A2C79927687" + } + }, + { + "tcId": 1916, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC83E61D7EF08247D146D07DB66B7261", + "z": "D493AF89C55E1C0C5A88D1BC2E56F0A954916EA49776E7372E451D4C4825E1EF35", + "l": 1024, + "algorithmId": "9CC8219A402A5779CC08B6E063DDA058" + }, + "fixedInfoPartyU": { + "partyId": "13A339CFE8458826551553A33FAB0A3D", + "ephemeralData": "4B79D28A9F8C340801DA55B151C29959A25488A480BE303BCA591D79BE2CF67329" + }, + "fixedInfoPartyV": { + "partyId": "BDE3A696E518D8E58E917FA79C3B6065" + } + }, + { + "tcId": 1917, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A321B9290F0EC67600E68CF584D766F", + "z": "C1D1142D9F14C4D667C9DFB97DE9ADF5262B8313EFB234DE305983D30C95478752", + "l": 1024, + "algorithmId": "9B2B9731044DF4ECA7BD90012B377532" + }, + "fixedInfoPartyU": { + "partyId": "6853705C33F127F4F39B8E9550AAB142", + "ephemeralData": "AB70660B95ED9289F6116690DBD961ADF063C903B96E0E352E7DA7998C496D9D6A" + }, + "fixedInfoPartyV": { + "partyId": "28233A858D5967D20218B6786377C2DA" + } + }, + { + "tcId": 1918, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20D4CC4765E3AEE65C56CAF5631495E8", + "z": "C7215E38155D83E3024540E0E4F47D8C69DA1EAE4756BD8F0A9FCF4852ADCA316D", + "l": 1024, + "algorithmId": "919AEA5B612E9BEEA59DF80B69405910" + }, + "fixedInfoPartyU": { + "partyId": "8F3815000C665974C59F3FED1F29F40E", + "ephemeralData": "CD4BCD0239DA87702FDE4D7BBAF5BA388E9C31D18A72C56EAA84F18D3BDF4EBAFC" + }, + "fixedInfoPartyV": { + "partyId": "3587EA52DAD0439A3867D3E7D3A33C0C" + } + }, + { + "tcId": 1919, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A0B5BB28169C799332DCCA654FF22FE", + "z": "ED9BB7D9EC99F522E3572FDE2A91196AEDE866C6B7263E4AA15B4A2E769D84A5D1", + "l": 1024, + "algorithmId": "2296D1A0D700F8F76A5B56618E551124" + }, + "fixedInfoPartyU": { + "partyId": "61D27C078E5BB3A4D8D0ABF94DFA0586" + }, + "fixedInfoPartyV": { + "partyId": "A293C86EB03854B92C75F34F7A424794", + "ephemeralData": "EBC8EB362897573F2085123772596F446B3823A6DCC9D42A85B849BEF39B6BC030" + } + }, + { + "tcId": 1920, + "kdfParameter": { + "kdfType": "oneStep", + "t": "81113EC803FA19EC1E31C2584988A30F", + "z": "0904CD14D5581A29D8581344FBEF5E71C0C1A0B9DA025558F0740B164B9567DA74", + "l": 1024, + "algorithmId": "E153B30A52EB1A439517D0720648091B" + }, + "fixedInfoPartyU": { + "partyId": "7932442E6DFF581497F996BD4C2FDE69" + }, + "fixedInfoPartyV": { + "partyId": "508BDC9EB3FB21BD0EC72F8621E05742", + "ephemeralData": "1D737C75E4FE74FF3D68AEE3E72475D19DDEE7E5A9EB13ECE65864DB027570DB70" + } + }, + { + "tcId": 1921, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23B88F9653E4F16FD30F2D1F0A500757", + "z": "3CCF99C1E1E7A97EDA222DB13ABE6F55BCFFAA41FD0D14D96F99AC14AC8ED47A65", + "l": 1024, + "algorithmId": "7F7FDB3A6339F45F3015C5D91951EA4F" + }, + "fixedInfoPartyU": { + "partyId": "472ED50218459AB75B42D3F006C0FE15" + }, + "fixedInfoPartyV": { + "partyId": "443FADB7C46A2DB3B24CB3E8F9204097" + } + }, + { + "tcId": 1922, + "kdfParameter": { + "kdfType": "oneStep", + "t": "185BFDAE2E716EE94EEEFB1E779A6AA6", + "z": "A47552B70994258AA71CA484AD91C895C6B15604E31FCC5698511D2DE12AE19C55", + "l": 1024, + "algorithmId": "E384D8054A15FF7201E57B030ED99618" + }, + "fixedInfoPartyU": { + "partyId": "18E46BCE2FC8DE484C790159F769F4FD" + }, + "fixedInfoPartyV": { + "partyId": "5703E04889085682C4F7D16AC9341967", + "ephemeralData": "D8C4FD00C371ABD732712392DA40394F487C401FD8EDDCA565454F936CBAEC0FE6" + } + }, + { + "tcId": 1923, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8392A9380638DD65187E8300199E7F1E", + "z": "903A58656EF3443F15C120ECB7F4FC5C4AC9EC901ADED047967A0C0CE2645CD9F5", + "l": 1024, + "algorithmId": "0B2788F9FB0223E4916CA7D1AA589344" + }, + "fixedInfoPartyU": { + "partyId": "F1D5FEA0B2B88223721129C22C1F057E", + "ephemeralData": "026F41740E676A9381EA33879CCD8A9B4E96EE300B18C7A24F9AB808CC9EADDCBC" + }, + "fixedInfoPartyV": { + "partyId": "CA51185A4A87739166FDB2F28C7CA8FF" + } + }, + { + "tcId": 1924, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C89C2696054850673A81016B17CAB0C9", + "z": "DD8E10BF62CE2CB6EF265519162F18BCC96DB114DEF0E06588B1DC99F7BB647F7B", + "l": 1024, + "algorithmId": "5376912D38587AB4A7C4AA1E94F17128" + }, + "fixedInfoPartyU": { + "partyId": "9F525C9121058F19D42F5BBA2DAEBD8F", + "ephemeralData": "2EDA5A5E054F8AFD5AE9600F3F02574F135154C94E0E6C41CB3D2962B26D0DDA3B" + }, + "fixedInfoPartyV": { + "partyId": "B0C5CAC6C21AEFF0845ADD6F80358387", + "ephemeralData": "9EC4329426461F4F7EFD71A3D11E45C7DF92E76D37DAD7B412247A2C9B9CFA0C7E" + } + }, + { + "tcId": 1925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C38ED3AF1AF570E5E40A9B7BBF1937CA", + "z": "C567F01F29186B66939F5E470899219FEB83D49CF129099381C3E73C96F10ED6BE", + "l": 1024, + "algorithmId": "94A77E1A26D8543AA03A1E88514A9E3B" + }, + "fixedInfoPartyU": { + "partyId": "9B49F2E191E83E554F8EFDB56F446815", + "ephemeralData": "7D2273B20D7609B24992A235149034DC64A2A2619ACED0305E6F7777BBF4B10F2E" + }, + "fixedInfoPartyV": { + "partyId": "46DCBB81BECD5700CCF05AD0B5E1F1B8", + "ephemeralData": "2F2CF6C8D4D4DE13C3438293ECC06FE251AEBCAC61016E08AA1E6DF85D0B15167D" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 78, + "testType": "AFT", + "tests": [ + { + "tcId": 1926, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59832750D29C7E86A0129FE0FDC39EF9", + "z": "D0BD50057BD3F20418EE30BA1562C44E36B61B041969BF616702F7BA03093C1AA3BA04FE", + "l": 1024, + "algorithmId": "8FC646D4BCAA88A224C5A19674D0CCB4" + }, + "fixedInfoPartyU": { + "partyId": "35CE8314C63EAA9DE843BF95BD75228B" + }, + "fixedInfoPartyV": { + "partyId": "0111628623C8FEF04DE9E8A5A23A0A4C" + } + }, + { + "tcId": 1927, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50A364F8B50F53B9DA639054DC172EC5", + "z": "DCFC2CAB5171C31B59F9D5626124896A9D152027725EE6B592057B52EE9A9F98516D4CCB", + "l": 1024, + "algorithmId": "766CC929C77D4FB56A782AACB2AFC5F1" + }, + "fixedInfoPartyU": { + "partyId": "D78D9DF4D324D18AD889299426DD1B5C" + }, + "fixedInfoPartyV": { + "partyId": "EA89E7B3098FD240A5C3EF0B2742E506", + "ephemeralData": "808872E99BEAD6CFF95653801A2C50B4B946A4029A367D6425B091D64CFF4108EF420C15" + } + }, + { + "tcId": 1928, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE06ED4CB221F692BA1A7022A1B3653F", + "z": "82987065A1DE09BD6B51513C10EE8FF4CA6DF83C3E20DA06F7EF6347DBD500591DC65A9B", + "l": 1024, + "algorithmId": "E2F6C0DC346E6C8F2BBCDF62E30C5780" + }, + "fixedInfoPartyU": { + "partyId": "5376E3D5B7B42380BE5AD8903E88D9F9" + }, + "fixedInfoPartyV": { + "partyId": "4196914E853D1D69AF07E0B56B0B093C" + } + }, + { + "tcId": 1929, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3445D11204CF64766074DBD1CDEDE034", + "z": "F53A57729880B885BA7B5E5CF49C19F6D52C2B56C97609D7214CD1FB8241BD967429A1E8", + "l": 1024, + "algorithmId": "99073897238CB76992BD541EF2BED0D0" + }, + "fixedInfoPartyU": { + "partyId": "E6AE05EE6D88538FFFD26A9F7702920F" + }, + "fixedInfoPartyV": { + "partyId": "CE80AFB35042FD864138183404CE3E70" + } + }, + { + "tcId": 1930, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AF75512914444F616DCBD396D122F35A", + "z": "28ECA8704D269B80F61705EB4F0009C2F98FB0044D91D327F6372688EFCF617CEF27C0B7", + "l": 1024, + "algorithmId": "AD7F80E9A357E69F4FAFC4467973B623" + }, + "fixedInfoPartyU": { + "partyId": "7910F6BD8D46D59C70483223F8309059", + "ephemeralData": "BBF38CAD8A8A3989BF15B28FC190D5977F74F468E67F85E9FFED6FD84A7704D8C0ADEC7C" + }, + "fixedInfoPartyV": { + "partyId": "0154A7C64FB3705BC34AADB98B80683F" + } + }, + { + "tcId": 1931, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC4E5DAB66A5752261AD5D47FF2414EC", + "z": "00FA7A107FD0A0A65BB9E37DEB83917933CE79FBC33B68A3EC5BFCBDBE89D7648DFE740D", + "l": 1024, + "algorithmId": "75AA147408375EDD7C074CD0DB452A49" + }, + "fixedInfoPartyU": { + "partyId": "326BE239B9BDC0024A41658A15111C16", + "ephemeralData": "38F5F09E35C421FF25BCE9384F13A9B868DEAC3A6D28DCDB2B1D172D1D801012F17C421A" + }, + "fixedInfoPartyV": { + "partyId": "35FF4B95E3261F244E5CF7900C030F7E" + } + }, + { + "tcId": 1932, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E70448BBB3AA7EE23DD0919A603004C", + "z": "CAC1670F5B2F8053A8768FC47FADBCA9FCF218FACFE9D51F211923F5C1978AD018088B78", + "l": 1024, + "algorithmId": "B06C645539D6809FBA3B8D5064B3A188" + }, + "fixedInfoPartyU": { + "partyId": "72C06BBD1804BBF0F6B04269C2E0545B" + }, + "fixedInfoPartyV": { + "partyId": "14B711BEF3756EEE14415489DDBCC573", + "ephemeralData": "19F79E044CA931023AD47BAE9EFFD1EC04A19B09BDBFE7EB5E8A088FB70B67923038A674" + } + }, + { + "tcId": 1933, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BDAED3E25CCEEAA523EBACE6F661317", + "z": "2FA51FC65172EF29BA7768F07C29CB925EC67BD3116A1797D6C98D7E291F7C26948C9D58", + "l": 1024, + "algorithmId": "6B77E2CDFEAAA13EB015F5A922BB2E37" + }, + "fixedInfoPartyU": { + "partyId": "C352BB8492BB68F140F13CF39A45E255" + }, + "fixedInfoPartyV": { + "partyId": "71770F781B8EFF6404BEA40F748CF87B" + } + }, + { + "tcId": 1934, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CE8539C19717348133DB0E8818A16F3", + "z": "BB0263BBF383F40487E7AADD1BA70458E160306DD6E3314388DB2FDB2FEF34DE567390C8", + "l": 1024, + "algorithmId": "E5C2F64BCBF0A4471F0E76FA30BD1ACC" + }, + "fixedInfoPartyU": { + "partyId": "6CAC9B9017CFB5D4B9A65B26BE066B82", + "ephemeralData": "2FB400174869F7D0DA2847EE5EFCBAA12A0153282EDFCCE8ACE62A684C347957E8C43406" + }, + "fixedInfoPartyV": { + "partyId": "4868E8F0E8EC0CBF31BE72D1F22BD23E" + } + }, + { + "tcId": 1935, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6C5BC79F04B4841367F4A254D76866A", + "z": "68BCBB42A51D9184B811DEC3893613308F8AD49F4C9D8F9F8B08D34CF86313BDACDFA926", + "l": 1024, + "algorithmId": "0C4B4612E29207629781D000521442D4" + }, + "fixedInfoPartyU": { + "partyId": "A550FFAAB196F44251007D23574E9F66" + }, + "fixedInfoPartyV": { + "partyId": "D3E34962B6BA74AB02DFE8557213A535", + "ephemeralData": "511975DDB3ABE09B460878556FB610F5A8160C737840840D5F47CE47E512B26C3286FFE5" + } + }, + { + "tcId": 1936, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D397DCD4DCB1ABBC81642BA4D0048882", + "z": "0F1253F1220F5BF47400AB15A779C90F11FB9DC208EA05A0FF86609FEE5B5C75D5E96FFC", + "l": 1024, + "algorithmId": "FED5817F0F2689FFE438A620BD2C7AD3" + }, + "fixedInfoPartyU": { + "partyId": "371AA8C1B7E065A44430162D26890097", + "ephemeralData": "8F6B40D7414BB249CAB0023598F9E3D414C171DAF24D0D645043F9E65BC9BF41F633C385" + }, + "fixedInfoPartyV": { + "partyId": "37E6C5935740F3ED1C47CBBF405519DF" + } + }, + { + "tcId": 1937, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F3F68765D7159F5AF745C08CBFB935E", + "z": "5CAEF49C6B4EC9AA3D1516513B983392F9BFD38DF3D3582138398404092EFDA7A735E5BC", + "l": 1024, + "algorithmId": "6C512A416B33DCD3C5271B970BC5C698" + }, + "fixedInfoPartyU": { + "partyId": "A3D07E869C8E3C2283C7F26560C4A9F5" + }, + "fixedInfoPartyV": { + "partyId": "AA2C9BCE363A5FF0E79156FA4C88AC45", + "ephemeralData": "EB800EF261A0534C8C9374793352FB0F254857C2AAF92CB779881519156C9F945F0EE4FD" + } + }, + { + "tcId": 1938, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA59D7991668645ABBEDEF02A2C753D8", + "z": "A8CBBD87A8D3EEC93E10A977366CC879CB6300CE319C4843323166F760FF4BCEE0C211C2", + "l": 1024, + "algorithmId": "418B3BB98D67E0806D0432A26A646526" + }, + "fixedInfoPartyU": { + "partyId": "984737C71178BBBD9BAB67548D73AB78", + "ephemeralData": "8CF9343AA69276FF30BB78D01C1276D68D23B8F47D85AA89920996C13A24698CA5FA308D" + }, + "fixedInfoPartyV": { + "partyId": "7ED393F2113409A1D093524E42EC02D0" + } + }, + { + "tcId": 1939, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D40E8AE7DA84352392600539F5A5039D", + "z": "D375EAED368A985F2F8ECCD52AA631A1EF1D500414AFA4A27472CC7AD23FAD200098D107", + "l": 1024, + "algorithmId": "8067E1A47DBEFCC17172E365B15F362F" + }, + "fixedInfoPartyU": { + "partyId": "97D56F857FEFEC926C7AD3C4F0606649", + "ephemeralData": "B7CDC9F3C2EFA90FDDE9973AB7CE2A2CF09DCBDC2EB8873B42E2720F1F532B6E2AD6321F" + }, + "fixedInfoPartyV": { + "partyId": "A4A950376457299860B5D00C3BDBA99F" + } + }, + { + "tcId": 1940, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F4F90B166B47AE6AEF9C64923830277", + "z": "8495897A314722EC6A0F625207A2A56734B082AA62BDE4496DB160E6A48642115B0EDE0B", + "l": 1024, + "algorithmId": "15ADDD62A1C8C9C1F889A0E5F5114BCD" + }, + "fixedInfoPartyU": { + "partyId": "2FBC52BD01658B15E83CDF7C340352CE" + }, + "fixedInfoPartyV": { + "partyId": "4FC0F28019C4B81B33AE08073C66D71B" + } + }, + { + "tcId": 1941, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69E6FF2C13BEE2922C312EFC9231C345", + "z": "CB78876B65A43FF5A70DA0B6E2FE50C6F4DABF8E0FD383D51B005C450DE67522E0567AD3", + "l": 1024, + "algorithmId": "CDA159454CF15164D152B3899FCCE810" + }, + "fixedInfoPartyU": { + "partyId": "6C85AE0E0E56162D9F4D23DCCFABC002" + }, + "fixedInfoPartyV": { + "partyId": "0A4DB09AB706173F68822A737B83A3F2" + } + }, + { + "tcId": 1942, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D02983C64B1056BA9DC9A3D577312126", + "z": "35564E398EEAAAECBB67A4897E896248161EC7EE9C504000FD0FFB0C1A666D27F199FD28", + "l": 1024, + "algorithmId": "EE27D6327F1F6211B1F6FD1122415221" + }, + "fixedInfoPartyU": { + "partyId": "FF5C74057A9CCB93DA6B17BBB9C6363C", + "ephemeralData": "C62729EA4E77B5EC08BDEAAFF7315B6500B85F1BE9B2C48110612DAB0583681B74C58812" + }, + "fixedInfoPartyV": { + "partyId": "15E990EA0712C90AE90FB343CD21C091" + } + }, + { + "tcId": 1943, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56B27941279D043C8EAA612695C65605", + "z": "BF9C7BF4AEEC5E1DCA487BC9E9F549EF10CCFA1BC569659739B78F1A82E0A028E57E5B89", + "l": 1024, + "algorithmId": "1CDD801B25D1A6282E85BBCE850A734A" + }, + "fixedInfoPartyU": { + "partyId": "470CD79AD7F771AA977B447665F3F702", + "ephemeralData": "155200A551452F7184573E5DCEAB99670723C3A9C81B4409A2BC651557AD1C95653F66A1" + }, + "fixedInfoPartyV": { + "partyId": "13F00EDB2CA1F5BFDE600D45DB6C5A5C" + } + }, + { + "tcId": 1944, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8E87DF7B0FE7E52E0E08ECDBE61618C", + "z": "D56EC763524A4259503C4483743D38E8597D07F2CC8AF890B85C1DC2595440989B4B5982", + "l": 1024, + "algorithmId": "477D1E2EF1B04BCF41F258CF8E246403" + }, + "fixedInfoPartyU": { + "partyId": "EFBE31F35A502731B0FC080C4BAFE1D2", + "ephemeralData": "C8D3525B83275CE1F45B438C3CE04C315810FAB489C8550AD2800004045418D61B49FF8F" + }, + "fixedInfoPartyV": { + "partyId": "373FD087D227DD7B0707475BC9FBBA25", + "ephemeralData": "85C4D5F01D116C891BAEC0D845E9FD47FFFA640081B777FDD8A8225FBC938E0D1F42CD96" + } + }, + { + "tcId": 1945, + "kdfParameter": { + "kdfType": "oneStep", + "t": "919EEADBA8A02AA9C14F7B619F6877DA", + "z": "F12258D0C9580797C60606034F8152BB5CA8374F09B8EE9C71216B1BF0E754D35395BC80", + "l": 1024, + "algorithmId": "778301AEA2E96FB434AF38F0B0C853CB" + }, + "fixedInfoPartyU": { + "partyId": "A4599771BB25DE59F684788F86A42F6B", + "ephemeralData": "838E87B4ADFF554BE125F58ACD43CC22931F9DC6CC43A058121458204DCD50453B2ED542" + }, + "fixedInfoPartyV": { + "partyId": "FAAAEFE23D01E3701F6E38D7DF26B6F3", + "ephemeralData": "68A47405AA5BFEE8F4A75D245DE9BC40760FD8BF12D05E6659CB02EB2A4FB06091761F10" + } + }, + { + "tcId": 1946, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41F99C8E3E3C2A73D88DD028F07303A0", + "z": "DC197B444835CE6268D61FF7298D0F5D5899C9A420EB7E0990732D1D3C041D8656279677", + "l": 1024, + "algorithmId": "D0B2867291BD3EE5C40D9E9249F884FA" + }, + "fixedInfoPartyU": { + "partyId": "C5991B3EF5CFFC5DFBD237FE83495B5F", + "ephemeralData": "97A24570354629E150FBCC923C2659157F48C10F648D4C2AF84EDA9C46665FFD0867E4A1" + }, + "fixedInfoPartyV": { + "partyId": "5A2E9041AF3303835C613CE2FC61D3B1" + } + }, + { + "tcId": 1947, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1077A20C5A90A5DD1A0C82D4CEF66022", + "z": "05777BB909F4DDDAEE88CD0D63CD9602C3E86F7977305D1095665E0B8DCA1087DB804394", + "l": 1024, + "algorithmId": "A0E28B490C8B30AC01386A9466E71AE5" + }, + "fixedInfoPartyU": { + "partyId": "9DE118747F09771B76C268961118070B", + "ephemeralData": "6C064F57FCC17A09C4964757D4992DD756726C2BE595DC5D692EB3DB87BACD1C75FE0EB3" + }, + "fixedInfoPartyV": { + "partyId": "AC4999739BBE0C94B5BA895E39EE8F79", + "ephemeralData": "6D118C14306F51FB894A3FE3734DF7387D9B6C28D50D1132F1617EF537D51E297485E246" + } + }, + { + "tcId": 1948, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B1E31C1B39D9924B6BAC6FFF213890A", + "z": "6CCE167CA4E514DF6A60D1F46412DA3035BE623F79B7C79072287879247E01373CA506F0", + "l": 1024, + "algorithmId": "EE26D072BEA19AD6A7C87D048588AF2B" + }, + "fixedInfoPartyU": { + "partyId": "5F7424E25C26479D8779EE0A08B6EA2A" + }, + "fixedInfoPartyV": { + "partyId": "F97AF68392654514A1654740F3155AE8" + } + }, + { + "tcId": 1949, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BD7203F884624FBE7BB9787CE9615AE", + "z": "448444F089C74207A44F2EDA94D43A474763700FB246020BF995DAB30177E15F972E448B", + "l": 1024, + "algorithmId": "2D60E18910DFC7A907CA4DC94A16952C" + }, + "fixedInfoPartyU": { + "partyId": "CE7893DEF8DBC101AC1A959ECDCDC9B3" + }, + "fixedInfoPartyV": { + "partyId": "7EC7090B1371FAD29231BD996F50548F", + "ephemeralData": "3294DD7A14B8F699A99ACC3A9C0C1AD534EF60CDF9C973C6565218932820B1A896A345FF" + } + }, + { + "tcId": 1950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE2C4922DDD68F02A3E854AC2E2812FF", + "z": "39953E05F845979496BFBD685196E5A43219E370189DB2331B06DB28C6351B8706E97E45", + "l": 1024, + "algorithmId": "96341CB7DA2D314168746B25C26150A5" + }, + "fixedInfoPartyU": { + "partyId": "3E6CBDF25070CC4DD00662DCE40E2D32", + "ephemeralData": "F40BC8062AD7A46F4D9B04C5DF415535D442E6641CF4150E9591319F5BC99E98E85F4AFA" + }, + "fixedInfoPartyV": { + "partyId": "D78D337BB73F3B74313D88448F9A5035", + "ephemeralData": "CE9C00FF163BD1E4C48A6B1018AD90B34B13E7000A458F675AFAEC7C0294228008A4FA69" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 79, + "testType": "AFT", + "tests": [ + { + "tcId": 1951, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47F58DA38B83C690472CC59ABF455997", + "z": "7D9AD8206A7956E8AB128B83B674B363C7F5055BC70B201794CCF519E38D50", + "l": 1024, + "algorithmId": "C576AA88B136260A20265BE6FBC082AD" + }, + "fixedInfoPartyU": { + "partyId": "42D0FD8F9F2DC5CAD05CC6FB60EE317D", + "ephemeralData": "EA1C725DBEECA4569CCC94162A4A8D863F73627CC3FBE13EBC71D62ED81FFE" + }, + "fixedInfoPartyV": { + "partyId": "675499CB192131BFA64FC1B822CF3785", + "ephemeralData": "BDD1B372E46AA43DC4875192443D10C4CB5FB3EA89818231062BA6B20118EE" + } + }, + { + "tcId": 1952, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8A14187E9BE1ED21711E18CF7066DB8", + "z": "F45B0F4D5A4B6B2144FDF9CC9F0A4BC9D45ED495B560B9B4BEB0AAED2F47FA", + "l": 1024, + "algorithmId": "D3DD4C4AC85D9E517B44CD6B2D627C03" + }, + "fixedInfoPartyU": { + "partyId": "427B2C2B3E51AE0728EF1C02CD74FD0F", + "ephemeralData": "F518BFA71D97E15CACD1915F98A66C5EA571555F820D03FCEED5A27C9DF44A" + }, + "fixedInfoPartyV": { + "partyId": "B2C96D0FFFD086286C77BD1B02E708EF", + "ephemeralData": "EE9DD1C0D97039F5A0896E6E579217EB3D47B70B9A414779E2E3E385BFE0AC" + } + }, + { + "tcId": 1953, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0086DC037C381FBD5365A6C88E957EA5", + "z": "6CF1482FDC2A77CAA7A6F16BAD5F2F9B4F216107376335BBBD33CDF091C9A5", + "l": 1024, + "algorithmId": "7AA1A74B1605CBB0706D804E9A7DDD71" + }, + "fixedInfoPartyU": { + "partyId": "F15D6F6559DAC172ADB11681710545D4", + "ephemeralData": "5B424D17AA3BB27E85CDAF5BC262F643728D56A278C621FE0E1A2EA44D9CD0" + }, + "fixedInfoPartyV": { + "partyId": "1C0A38505F73F72BA5C8A3AC5F40381A", + "ephemeralData": "45346E3C6397BD2EA0C52E15695E6ADFB0F76FF3F1CF1702EC969B0C6E1568" + } + }, + { + "tcId": 1954, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B32C0273EE5DE2C5D9B82C7852803B2", + "z": "74610DA98CA1D052A65C48AF93A4E6C95F4F68F879CEDBF0226997AFAA8FF3", + "l": 1024, + "algorithmId": "ED5A4DCC0F96D3CD9C9FF388B9FE6CD5" + }, + "fixedInfoPartyU": { + "partyId": "F4A308F8A938E14856AAA23D1B2BA10D", + "ephemeralData": "49AEB210CE4B4E3C2622343C576C5979E279DDF5DE57E99722822C82571B7E" + }, + "fixedInfoPartyV": { + "partyId": "6A60CB4A5384081EE0F10AF22AAFAC2D" + } + }, + { + "tcId": 1955, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70968578EEA90184F54D8B135EFB5CE1", + "z": "DF9E86054031C8D051028A491AF3AB85A9DBE3BB33381209419124288AD4A4", + "l": 1024, + "algorithmId": "7990489B3180CC55588C2F07C526155C" + }, + "fixedInfoPartyU": { + "partyId": "119157DA4CF11A505467BEC68D0F35CF", + "ephemeralData": "7976B6982FCA9F44C7E24DD485635873833C50F360B982A1E64D6A84422358" + }, + "fixedInfoPartyV": { + "partyId": "FF60070543EC28E8655A5B62AD961F36", + "ephemeralData": "3CC29F61AB9DFEFD18208FB9D329400BEA4E1D9FE5FE5C755C3C0BF382D86E" + } + }, + { + "tcId": 1956, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8816EC69CFDE88BF38A09225E512F4DD", + "z": "AE9978F60636B47B7C96293C513D76899C3CB78802343CBF35D58FA0920BBD", + "l": 1024, + "algorithmId": "F7F57ADDA334CFF61769567FC66F550E" + }, + "fixedInfoPartyU": { + "partyId": "81188FF1A852BE086754E8D2E5ABB80A", + "ephemeralData": "EB8BEED67D49D622A1C9560BCFF885A3473FCE58EB178E275EDA9A2B5954EC" + }, + "fixedInfoPartyV": { + "partyId": "390E68D143BE4CDE6F8340230A83B59C", + "ephemeralData": "B9D08598BEF189026223354AA34F2B0338875D515537B2222C7548966B050A" + } + }, + { + "tcId": 1957, + "kdfParameter": { + "kdfType": "oneStep", + "t": "21E479E34216E8A888680E89DF4D95FE", + "z": "E794BB3BAC14471A2BD2DB1BDEA7372BB7E5047CDB98F933A94A92372CC139", + "l": 1024, + "algorithmId": "115B1E5727EF4BA9CBD7D124559CAF29" + }, + "fixedInfoPartyU": { + "partyId": "83EC32F1E61AEBB37F24F295EECD662F", + "ephemeralData": "E739EBC12F2A28133822F73615ACB064786E9D7EF011966746C99A3C0AEA31" + }, + "fixedInfoPartyV": { + "partyId": "150033E1FE86879D94AB8AD00AE9905A", + "ephemeralData": "DF572370AF771804DAA763B4EE95295C7C85997014F7B10ECC4DD6864182A2" + } + }, + { + "tcId": 1958, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BA9DE0245715B135EFC03BA32750469", + "z": "B8BD1394CF04C117B93494FBFF3F55CCEDCB90EC72DF5D8E19A8EA2C47AFCE", + "l": 1024, + "algorithmId": "1F08C29117FB364FBA0384F0E262BD1A" + }, + "fixedInfoPartyU": { + "partyId": "CD1091DBD5E7EAC135DC7BE2497F8C71" + }, + "fixedInfoPartyV": { + "partyId": "9F7A84D9E66A30F59AE7AEDEC3EFA46E", + "ephemeralData": "65E74E714BECAE97DD92F5CE6F268636B185DE5FAC103E0978510B82115F01" + } + }, + { + "tcId": 1959, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FC5EADF502AE9BEF84D1C828127F72E", + "z": "B7178C84B0FC0A5B1EA0D3A1CD9DF1F788552D5C8410BF1F52DA9BE6D06310", + "l": 1024, + "algorithmId": "010721FFE89105D59768B66E6EF55877" + }, + "fixedInfoPartyU": { + "partyId": "CBF19871C207A4536621519BD77240EA", + "ephemeralData": "C3ACDECBFC7A37D0A6ED7DBB1B9958A793CD2A9FDB74446F4C231D415F3260" + }, + "fixedInfoPartyV": { + "partyId": "28C745DC5767261CCD75B85923463119", + "ephemeralData": "8BC9961595FFCCE2EF3AAAE36DC2B197918027A2098E8C73EB0FD5FE191A73" + } + }, + { + "tcId": 1960, + "kdfParameter": { + "kdfType": "oneStep", + "t": "95FD685B3AD2B1196E88655265B414EA", + "z": "B238CEB7EF8CC8308027F7F3389EE3A42D2C61ED9874495C8C92A9E59EA3C3", + "l": 1024, + "algorithmId": "8043169CA0CA760B0D72A16808FB5196" + }, + "fixedInfoPartyU": { + "partyId": "0D9ACCDE1B588858D75E77F8DC3579A2" + }, + "fixedInfoPartyV": { + "partyId": "118DD5A21D1C6D239B9D0A30BC562D84" + } + }, + { + "tcId": 1961, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5AC62B26F3F6BDDD4AB9D532B96AE38A", + "z": "7D3B96B58553836719BD9312E4CD746A13308792B9D775C25482CD7A4E98B1", + "l": 1024, + "algorithmId": "9410C68CBCF6D1D5A42E8D72629D3D3D" + }, + "fixedInfoPartyU": { + "partyId": "C3271B5A44A78E08C79677F40A9C0BAA", + "ephemeralData": "4CBE78EC83DC06DEF31E25EA860F593A2C9FFD79F7E67EF4C6B447597E8BAA" + }, + "fixedInfoPartyV": { + "partyId": "0A4D9E917516D5576224BC0B0AD8905B" + } + }, + { + "tcId": 1962, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D605957C35976720AD13BD5A0FDEA9BB", + "z": "96655304C318A64DB43A79F6A4A5E3228B8436852D6297254BD991725C7A00", + "l": 1024, + "algorithmId": "0A9BEF2EFC662640129BEA6CE3C6B90B" + }, + "fixedInfoPartyU": { + "partyId": "778D90F778B95DE1792892B4FC8F20AB", + "ephemeralData": "BDBCC1C099C32BBA90D688A66582CB31D2471678CC0EC6C65D0EF0D75174DC" + }, + "fixedInfoPartyV": { + "partyId": "CA005C84EE353211BABF13DE2827A118" + } + }, + { + "tcId": 1963, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E53CAC3CA135588B8699D9B82B2AFC6E", + "z": "6B25B14C808C272D500419FB7650585A8143AE878658CD5C598A633162EC2B", + "l": 1024, + "algorithmId": "1F2782E7D580F95AA7C6E7A50C12C006" + }, + "fixedInfoPartyU": { + "partyId": "D71152605ECEA3E4BBF61FFAAA9BBCAD" + }, + "fixedInfoPartyV": { + "partyId": "A7AA0C09D709359C26CC4136EB48DBD6", + "ephemeralData": "96DAE4ECE95D84CE7B777FDCD67538B416DBEFA64B579294623B879813CBD9" + } + }, + { + "tcId": 1964, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E70C3FE0376B8A4C8F33CD8B099BC191", + "z": "6079403C1D5EF17CA3650271BEF69724EF7CFF5FFB65B82706CC3C6F99FDC0", + "l": 1024, + "algorithmId": "39C03A991AE5D2E841B0ABC669EE2449" + }, + "fixedInfoPartyU": { + "partyId": "8FD4D1265074BAC5FC50A09B59FEC6A8", + "ephemeralData": "AA7D148EB7F9F947835423019953043FE7CAAFDE7E1D595BE49A81EAA0469A" + }, + "fixedInfoPartyV": { + "partyId": "151ED28341FE192B2676D9F9A14DCF1D", + "ephemeralData": "75001225E86D2C8E66ED28610F6072DC4655E288F058C346AC8D3B7D21108C" + } + }, + { + "tcId": 1965, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B83F62A90F142FAC357D209525E99B9A", + "z": "E378C3705ECC8C5A59E56303F6B69AFB26F8D11B737E50B7BB40BD6D7194D1", + "l": 1024, + "algorithmId": "BF7CD9306A53A0988C87D8A00B010A7B" + }, + "fixedInfoPartyU": { + "partyId": "6461AD17D432DF59010E689B999A6035" + }, + "fixedInfoPartyV": { + "partyId": "D8F34AE1F1E0163BEC543C6BF2741809", + "ephemeralData": "9577102D5260AC4624CAF003AA67A9672AAD421031239DB48C938A5E36BB3D" + } + }, + { + "tcId": 1966, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CFDF42FECDB12C1C3D0F742793C2FEE", + "z": "BC5EB749A48DEE396031AF7DA02A8946062942D100741509EEBE36CA9A03C1", + "l": 1024, + "algorithmId": "95F46F2574C97609EB4B935B6650BF30" + }, + "fixedInfoPartyU": { + "partyId": "80FFF6CE6333402F5E2AD421B33D7815" + }, + "fixedInfoPartyV": { + "partyId": "B751A51AA9DB60A38FDC80530462950B", + "ephemeralData": "9B15B54E747D2360F8C1B7FC223D0B0CEE4292CE7B3D70CB5F71E5750558EB" + } + }, + { + "tcId": 1967, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A26C3DAA44C67B42E2833EE0CCF1ADF9", + "z": "02CF0E62DB3418CC43B2E1E6F960E0B13FCB48175995D92DF26EE2972F8213", + "l": 1024, + "algorithmId": "B0545762044A3AF4AD13D5DD1E179C0B" + }, + "fixedInfoPartyU": { + "partyId": "9A6CE54BF2C3BA8ACEBC28E0F0A8CEB7" + }, + "fixedInfoPartyV": { + "partyId": "0A1F9092AD7E623E61C085434A63153C", + "ephemeralData": "29F8203DC6A28FE74973B76BF826659AACE7F8BF1E2C6E9123895EDBA048A2" + } + }, + { + "tcId": 1968, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BE679BEA335D41547959FE6FB3CEEC4", + "z": "FDC705BA4076B1004CF2A3D9B9F4CCADDB55B9936CE9CCACAC31B39A87BF4F", + "l": 1024, + "algorithmId": "11780EA2EE4D9053BB6B3B8F55BE46A0" + }, + "fixedInfoPartyU": { + "partyId": "8E0133FC2F8F41935DDD86E39FF1AAD9" + }, + "fixedInfoPartyV": { + "partyId": "04A7F1F13CE887725CB70CC0C9D688F8" + } + }, + { + "tcId": 1969, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9872675C5C8DF0C1FE6DA91026784E4", + "z": "CC1B6E3C009063BA5A7DA76E7D5C47C04B603C0A2A111AD8093BA779140DAB", + "l": 1024, + "algorithmId": "440C8C4132386E0841E0371C0CB04995" + }, + "fixedInfoPartyU": { + "partyId": "E3DBAF7FE88E7AA89D927734878FE7E2", + "ephemeralData": "0BDB9519F3D4BEB54817D9AD234845FE6ACC3B161559B22E0119A9187D0894" + }, + "fixedInfoPartyV": { + "partyId": "6D867C1D81598DCE38B39E65A854AD87", + "ephemeralData": "382B9580205510925F0424E6688E4ED798E825D55AC8C07DD135B86639E924" + } + }, + { + "tcId": 1970, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE8F1A7E1A0D8AAD2F229CEBBDB1BC21", + "z": "C13DD283C0C5D429F8923553D90DAAD6A8A788E841B82080901D2FDD75A655", + "l": 1024, + "algorithmId": "897AE13C6A8B667B4058DF0D6EF5F6C6" + }, + "fixedInfoPartyU": { + "partyId": "A6395A339D312B03599D6B95158DD660" + }, + "fixedInfoPartyV": { + "partyId": "E2AE0D5C69084BADC2C93B41707037E2" + } + }, + { + "tcId": 1971, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D7333C572D5EDC7018CD5770C9CAEB4", + "z": "9643CBFF6817BBDC6FA742ABCF4EEC55BAA90CC34B733FE50D24F84C52F596", + "l": 1024, + "algorithmId": "6794AB5BA78897755BB6A0EC301848B2" + }, + "fixedInfoPartyU": { + "partyId": "F4C98A04CDB7A0906F475966113B2441" + }, + "fixedInfoPartyV": { + "partyId": "FB1A0EBBE1907586EE0AC76476857F32", + "ephemeralData": "91D48DB7E3E022315DDD1FBD4CCC4A23F2526BDA8B0B3EDFA4FC5498D19E09" + } + }, + { + "tcId": 1972, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D82ACCB8E62E84DEEB66579A4AFE1D4", + "z": "2C408CEDCDC03C99DAFC31AE40489C8194A6D1ECE57417B8D71BC0A975A7B7", + "l": 1024, + "algorithmId": "895D5B71567D3DD8F7CEEED61AAEF3FE" + }, + "fixedInfoPartyU": { + "partyId": "1CCA80058CF609B9C9B3E6CA9E70BB2B", + "ephemeralData": "19D5703AA4877EE89ACA076131B948D72CE94EFF6DDBCDBADCD36C83F2E154" + }, + "fixedInfoPartyV": { + "partyId": "6AC9460AFDE493E7BFA84DAB9925A371", + "ephemeralData": "A28FCD22CD49F99F898150285CFBC2F84AA12EE50409468AA0BB99C7BCB5CA" + } + }, + { + "tcId": 1973, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00E8B7CEC766F5EB293E9385CAF1BD39", + "z": "392E0BB75C3EB68E33A313A0126C777A78F8C67606BFF1588AD4AA34556801", + "l": 1024, + "algorithmId": "E785E41687FECC3A08F572AC4768F422" + }, + "fixedInfoPartyU": { + "partyId": "62C88DC5D89832653D518EAE86FDE382" + }, + "fixedInfoPartyV": { + "partyId": "C34CD2776B7EC7355DED48A4624FEC7D", + "ephemeralData": "60EED1D2C77828109BDDD7DE1F3A69DCED016DCA7A6DAD2F26EBCA72C99283" + } + }, + { + "tcId": 1974, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE2A4DD27DCCB462D13CBFE8886464C6", + "z": "6CF9DE5B146A0E119C6F1B090AB592662DC263912BAEDA4B236F419B38C80D", + "l": 1024, + "algorithmId": "DCC6FBC4B15103583E77AB10773C4BD0" + }, + "fixedInfoPartyU": { + "partyId": "6EAB9339AD1940569B2BC3FCA452D80B", + "ephemeralData": "7D62C102C8B31A66A3301E10B82042E16DC75AD68C262C9EE221431CEB6687" + }, + "fixedInfoPartyV": { + "partyId": "FCC49E9CD0066FB6C74F0D78D475FC63", + "ephemeralData": "C8065F17A00158F3D4F5F3E5DA29A9C9DCE0598F0284C357815EF273F6CCAB" + } + }, + { + "tcId": 1975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70ADA9B91E5BD66E154A8449C4325C04", + "z": "824EC8DB62ABD49F796C6E6D16CE8B1F266142A18D340A9970DF75B7E622EB", + "l": 1024, + "algorithmId": "A20FAB0037B933C13C6C23B1D1C11E24" + }, + "fixedInfoPartyU": { + "partyId": "D3A8F714B999EB242C57C5DE4C498517", + "ephemeralData": "A764B2D581F1A1345A4815F81C75B1BCD0957DCAE346A97F014093EB923BAF" + }, + "fixedInfoPartyV": { + "partyId": "A762737E35CC48458497BB8D2B55D72B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 80, + "testType": "AFT", + "tests": [ + { + "tcId": 1976, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E211473660B37BB5D564F450DFD4F04", + "z": "9728E58EC5BB2F964DE6B2BBB3017D66FA216F80B9DA25E758F3A626", + "l": 1024, + "algorithmId": "C1C7E7DD8879DAF63D09A2CFE442E414" + }, + "fixedInfoPartyU": { + "partyId": "D58D4374DFDA6FF33762EBB9E1CAA296", + "ephemeralData": "D84CBFCA1A7B4040A5DD2343FC02C92EEAF6F7D32DC0AB58363EF65C" + }, + "fixedInfoPartyV": { + "partyId": "F3E6B309F73E61EAEE3198E6A252D907" + } + }, + { + "tcId": 1977, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6067254BA9F015FA7D57078C86DE4A0B", + "z": "4592D26C761B73E0CA7B1E0581C1AC204EF018A79C6C1429C55A0081", + "l": 1024, + "algorithmId": "277FD8C8AF5793065276335A8C50C37D" + }, + "fixedInfoPartyU": { + "partyId": "73DE42DDF7FDB97EC72DF72CE006CD43", + "ephemeralData": "214C03F97E29220F12DA5926825759E4E40D7F9CAA2DA36E534E5C08" + }, + "fixedInfoPartyV": { + "partyId": "778F36D929D4F24476635EA8959EEC84", + "ephemeralData": "84343DE1F6853C78E1AF250C576A59CF33E6076103E9B774A65F99E3" + } + }, + { + "tcId": 1978, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8CF524B8C9470E704296D025062C898", + "z": "6E4D3F8B246C4600C237972F636B8AD19397EA621EC3DDDA26795D99", + "l": 1024, + "algorithmId": "22EFE87BB3BB9A3C2236ABDE3444B492" + }, + "fixedInfoPartyU": { + "partyId": "18ED4404BB48C96F1D1AF2CAEAD7A917", + "ephemeralData": "4E66F44D70DEC9AD13B90755909A9B54F152C80D1AB45C30045C3295" + }, + "fixedInfoPartyV": { + "partyId": "2ABCCF224CE669F00DF54F5458BBBE7C", + "ephemeralData": "20ECA08DA5059CFA0D4E9E65F63CB6EC53CB2805343DAE2AAE2E1A2C" + } + }, + { + "tcId": 1979, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B5BF629F81D609823E3DF4FB5FB9672", + "z": "F2FC9B116A620E71CFA86DCAFACA5B18A1AA94BC767CE6BF01E8913F", + "l": 1024, + "algorithmId": "DF49A3D109A81CDCE210415294BEF54A" + }, + "fixedInfoPartyU": { + "partyId": "BBF8851A8C1F48BA40C90DC1E6B81823", + "ephemeralData": "4D813F8A910AE0C3DBA4528AE924EF7E2E30298B4DBC2D23953D0B41" + }, + "fixedInfoPartyV": { + "partyId": "E43598FBEAFF5CBF90CF34A716ECB51C", + "ephemeralData": "522E2A941F4987193CD6306EACE40BAB006171DF533390A2FA593C11" + } + }, + { + "tcId": 1980, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B61A1566397354818A2EA811814D85F0", + "z": "123CD6C32CA13AF02365F0E0ED1B55BEE46D423D1BB9F65C9DC72316", + "l": 1024, + "algorithmId": "DEF3B0CC02565773CC0EFA66BD61F2D4" + }, + "fixedInfoPartyU": { + "partyId": "CE4432CBF98255E8A9EB9F3D5D66D586", + "ephemeralData": "6D8A0572691FA60FDC6894A7B985DA9B82DCC6F6B0765985382BCB4A" + }, + "fixedInfoPartyV": { + "partyId": "D946ADEF7C01DA100A78F0D2F6BE576B", + "ephemeralData": "93CDA97B61ABAFE6079E4408CE80C5C2ACA42BF1DC9D243FFC7B4C26" + } + }, + { + "tcId": 1981, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0E0EC52808B86E804B49AB51AC746F61", + "z": "71CF718C590623A0CE41B7A3ED8172E9C65290F46060550C1E2D8EEB", + "l": 1024, + "algorithmId": "0074BC75EC801D9BE9DE6DDF4FBDD505" + }, + "fixedInfoPartyU": { + "partyId": "C0B8140F0CF3568EE600710FD5C0D5B4", + "ephemeralData": "C34D5F9A7277B77CD01EABEF859A92D488C86E3F847164CAEC0D6282" + }, + "fixedInfoPartyV": { + "partyId": "03CF514F71EA84C10F09FF456A8CBF35", + "ephemeralData": "C16AC48A89D4425DE2804EAD176B519BEACADCF09A681F8659C3BA5E" + } + }, + { + "tcId": 1982, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FED6355B0A82487F389AAE8915BEC86B", + "z": "68160C55FBFF84799B98B7BD7C88ABEA9842D9D2240EEB9DC4224A1A", + "l": 1024, + "algorithmId": "FBC0A5890EA29DC38D9C3FB09645F0A9" + }, + "fixedInfoPartyU": { + "partyId": "B0429AB97F5EFB833FF4A4C68E3292BC", + "ephemeralData": "58C1F949B746D1B4A73F67A5D4916F274B95853B9CA34C06BFD34E02" + }, + "fixedInfoPartyV": { + "partyId": "1F8AF18E46B6A943BD528F4E42DEE119" + } + }, + { + "tcId": 1983, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D6D05E7CA7610DA594A2D649780EC49", + "z": "53B42EDEA45C30C0F759E90F915E098E8759570CD75D79357B439962", + "l": 1024, + "algorithmId": "012C904A180CD9D8048FE8638F8829D1" + }, + "fixedInfoPartyU": { + "partyId": "0C8AA98ED0CCB04CB1B5DF6CD21DC471", + "ephemeralData": "1D5E44AC54AF1B873948650AC4069C9F3C326C75ACFDBBE5B2D0CAC2" + }, + "fixedInfoPartyV": { + "partyId": "73F6261F098CA0E4631CD04FA5176889", + "ephemeralData": "D969E0A280CEEC8C540D22DF5CA1067C1BA64BD24243840BC614AD75" + } + }, + { + "tcId": 1984, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDBEAD9C60CEC26046C60EB692992F48", + "z": "C6BDDB5059081FEAF13A294D9AE90ADB87773CCE8826BF14B461B22E", + "l": 1024, + "algorithmId": "9A50CCF8DF3DB6B424A584891D221768" + }, + "fixedInfoPartyU": { + "partyId": "7AC4100889859C6A45B16FF8068744B6", + "ephemeralData": "A4B12FA3596C8F70B489D25F02396308AA0EE3CC73721233D9556A3F" + }, + "fixedInfoPartyV": { + "partyId": "8B2B93143182ED677011C28D5BD9E8B1", + "ephemeralData": "4F729AC851451CB209E4C1CE610436FBFEB026C53A3EA8874C38629B" + } + }, + { + "tcId": 1985, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70E6C3BC4CB9FF2EDB9E266A2D13D27A", + "z": "2313DC4A7DBFCA0D6B4B5BED44EF9EFE2B6D48C9A189A43FD67A0276", + "l": 1024, + "algorithmId": "46A1A259D5B8408BDD9BF92342B8E8A3" + }, + "fixedInfoPartyU": { + "partyId": "21637248D506CA28565E475AC8214F3F", + "ephemeralData": "55221B983FB6D1A4277A616691638CFD42AB637A77605E751090DC73" + }, + "fixedInfoPartyV": { + "partyId": "E4DF51C1F0CA138300D7C39E669B2276" + } + }, + { + "tcId": 1986, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0125F1D82E4D8A2806F31E19CEE41A6B", + "z": "D9D920DD6F3C526BAADBE500DB478979B16E69526FDE377D22FB3DDB", + "l": 1024, + "algorithmId": "6E7112D920EF82DEE2BF20630126D08E" + }, + "fixedInfoPartyU": { + "partyId": "AF7C743B34F14F169B44EE5CEC0A90D2" + }, + "fixedInfoPartyV": { + "partyId": "5D5C458B0188957A15F22E72429E8C42", + "ephemeralData": "BB59E1D718615F963A939ABE8CD6F76FA7F4B0C4AC458B54815EC29D" + } + }, + { + "tcId": 1987, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E53362D713F643D7F9E7FCB8C8EEEFB1", + "z": "BF0E1727E7AD499CB40175C18A309FE4B986D9B4C0F7A23F7737C3FD", + "l": 1024, + "algorithmId": "6134C124A827305806BC9A03E6100FE4" + }, + "fixedInfoPartyU": { + "partyId": "DE132DF80F22BD8A60AA42FDF52EA9A3" + }, + "fixedInfoPartyV": { + "partyId": "93274F5016B3497E6161526C1337142D", + "ephemeralData": "F7F97E93CC5737ACD602F971CE356EBCF2530300CFF4A2BC91AB0A1D" + } + }, + { + "tcId": 1988, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35620EDFF7A06142E57726D6676A2658", + "z": "36EBA801C17F0DF9DDF7991C8A404ABA39C8C06C16F43B9E9F646EEF", + "l": 1024, + "algorithmId": "87BBBADFE2C2F7F06649AB982E8E79E7" + }, + "fixedInfoPartyU": { + "partyId": "16FA54311DE91B5571F38C94E286510A", + "ephemeralData": "B00034CE562DA4E6391B0CBE50F59EA3EEE13C841646DB1621F82B3E" + }, + "fixedInfoPartyV": { + "partyId": "5010CB4075F314F37DC2636913A5ABDA", + "ephemeralData": "18A95C78DB4085CE97D93C96DAE252A2FD9A77DCDE4873CDF37DB282" + } + }, + { + "tcId": 1989, + "kdfParameter": { + "kdfType": "oneStep", + "t": "637E1841A39D36A4647432CE3E16B6A3", + "z": "C8503B3A41E2C40DF1A1675823F34D3E2D137B4B8BC115F85AF17903", + "l": 1024, + "algorithmId": "0010719CCB2DDC6CB136CFFFF4A0AF73" + }, + "fixedInfoPartyU": { + "partyId": "53F38AF58E07B68023C7C95D536F9331" + }, + "fixedInfoPartyV": { + "partyId": "C4BC1FAF973F568C77D94A7A42572647" + } + }, + { + "tcId": 1990, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B71618DF3BAD25A5749621195E2406F", + "z": "F4AE957A807915CA9E84140EC8AD86A947C896240ED83BFB3C078551", + "l": 1024, + "algorithmId": "C052A472C64EBC03DBEF70C609EDC4E2" + }, + "fixedInfoPartyU": { + "partyId": "7B70D46833C4159CED74F24AA14EFBB6" + }, + "fixedInfoPartyV": { + "partyId": "8D66C2870B3B91D3DC78E5F124D4AE02", + "ephemeralData": "386177C5D516C5D0DAE778E6FEA5F6365150F82CC012B6FC26482958" + } + }, + { + "tcId": 1991, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9853060D4EF245D39D84D23DF8D10C0B", + "z": "CC8042AF05CA69EE5DA7A36904CA00D0442E73039F255056EDA88282", + "l": 1024, + "algorithmId": "7A3A1162A4FBB8E5C37C8C1153DF34D8" + }, + "fixedInfoPartyU": { + "partyId": "C9F432E7BB234C68E0216264DEB52E9A" + }, + "fixedInfoPartyV": { + "partyId": "CF143EA2B718AAF65E6AE4EE7AD3CD40" + } + }, + { + "tcId": 1992, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D53245149B8F6A5AEE42D980E8E91C5", + "z": "3F6391301FC7E0424102B0959EC0E5A4B51F87E843B7F82DB52E0DBE", + "l": 1024, + "algorithmId": "C89272DAF7332900B28099350940154C" + }, + "fixedInfoPartyU": { + "partyId": "10254BD9CC9BDD43CD39D5D5DB6136E0", + "ephemeralData": "14B85AF3ACCEDF4326B26378949B840F45DE1B1121A1B31A35BF0A2F" + }, + "fixedInfoPartyV": { + "partyId": "BAC3B9C083C609A4870111B6BBF76835" + } + }, + { + "tcId": 1993, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E0BB92BD936DEB9A22E1D33A1705268", + "z": "F6DE500FBC65966C30C9EC261FEEF95FE22D1ECDCF2F9436477E060F", + "l": 1024, + "algorithmId": "EB658EDF9FBE603925154DD597F33DDA" + }, + "fixedInfoPartyU": { + "partyId": "14D3A022D3B41E0FD990605480FA3B17", + "ephemeralData": "37080F1468FF8DAC2492B839B6E637C1A179F1DAEF3EB317F0C0424B" + }, + "fixedInfoPartyV": { + "partyId": "6F7A90BB88FF051E0DC3CC50C2CC0EF5" + } + }, + { + "tcId": 1994, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EDF11B4EFAFDC68C6BAA99132634192", + "z": "F7923A09A9BE550D36A8C56CF31B914B475119721B9F6208D593F185", + "l": 1024, + "algorithmId": "504EC374BC9DE409B48E3AD3FB01C452" + }, + "fixedInfoPartyU": { + "partyId": "78C048A12F48793083366E05F8FF9E8A" + }, + "fixedInfoPartyV": { + "partyId": "CFCDCBEA323020A968EF83BBC0D77B72" + } + }, + { + "tcId": 1995, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9773D1104CB7FD5242524E1298490CA", + "z": "F8C65FF270639C49B9046EB56056798AF4936B0D810D421B5B1795CF", + "l": 1024, + "algorithmId": "656BCDDA0FEA394E0EA7A9789C831794" + }, + "fixedInfoPartyU": { + "partyId": "751C028287490FB5443F40C211FCA3DD" + }, + "fixedInfoPartyV": { + "partyId": "7CBB68A6323360BD38A34E6B295C9930" + } + }, + { + "tcId": 1996, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65FED02F618E05BA4406B2965E5ED592", + "z": "0BFA86EFF2AB50C14FBF83BF855449198EA2E179BA5699DBE52BAA48", + "l": 1024, + "algorithmId": "BD2A2726E9036DF664481A10B5CBF6A4" + }, + "fixedInfoPartyU": { + "partyId": "B4E4A37FF9E145FC7CA09D6E2534E78C" + }, + "fixedInfoPartyV": { + "partyId": "9E55F539FEF8A4AF10ACA108B0702B77", + "ephemeralData": "A8F9BF148746845A895B78E2F76B1ED0C6A17A89D8A87B207CAD922D" + } + }, + { + "tcId": 1997, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86CBBF9308171C5A1F17029866F7B838", + "z": "519325EDFED3F62506CE15B26F15DB8FC8DF41B4E019CF893C522077", + "l": 1024, + "algorithmId": "79921A4FA65A4BD6C994BA6EEE440401" + }, + "fixedInfoPartyU": { + "partyId": "57B2179F68F055C82F2FD38017358BA3" + }, + "fixedInfoPartyV": { + "partyId": "3B634F534D8061C4F07E56A7077F8F4E", + "ephemeralData": "AE72BB26B734FC4A14959EDC7B430E6766245CA7E5ABBC48C80B283C" + } + }, + { + "tcId": 1998, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6477361DA42935D21BD6A73731FF60E", + "z": "9B6D6601ECBAE306003C974B33E6AE61CA69DF9AB5EC9B89F5688826", + "l": 1024, + "algorithmId": "B875D297B398F19BF47FF82ECA87BE57" + }, + "fixedInfoPartyU": { + "partyId": "93D96A0A722E7F6A0F8DC2A92893A4B5" + }, + "fixedInfoPartyV": { + "partyId": "2E23F47BCD43D04736CA8F0EACAEBFF2", + "ephemeralData": "49F162F1C915A7EFBEA60EEB27099CF6CA68CBC9D6219F20414CF5FF" + } + }, + { + "tcId": 1999, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0CACE5ABDDF9D5BCDFB03CBC89311943", + "z": "3F4E5CF513C95FFFF335A621B70CF093CEEEF8F81B67DDA4A9C68730", + "l": 1024, + "algorithmId": "4BFCE93D191A9E33874FB5150A3BA64F" + }, + "fixedInfoPartyU": { + "partyId": "C39015B265A75222B6E80EF14DDC71BC", + "ephemeralData": "FFCE94560785DCA01C875F278F48B3B3BDD10CB8B004BC41C9CB4BE2" + }, + "fixedInfoPartyV": { + "partyId": "01399DD7B57A76821013C505CFE941CF", + "ephemeralData": "E4B00C38A0EEB7012377E105EDAD72C4C605ADA709B68BD65E9E6FF8" + } + }, + { + "tcId": 2000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0BB2BD38342661553FF36596D99BE939", + "z": "B82D413FF4F5D68BBB643939009E71E13B10F7F84DF8F124FFE7C979", + "l": 1024, + "algorithmId": "1D190A9275BC37A16BB4171983803359" + }, + "fixedInfoPartyU": { + "partyId": "9FE04EF047F91923C8FBB084E3327FF0" + }, + "fixedInfoPartyV": { + "partyId": "C3E2C0F3D4A380F759FEFB26C2E45DB8" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 81, + "testType": "AFT", + "tests": [ + { + "tcId": 2001, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3564B48EE5BAC20F689D58C56C46A4E6", + "z": "C4E035B8D380F3B1A61EA3D0A33E58C623765F86A0A1DD24B052CF5B46E1", + "l": 1024, + "algorithmId": "30EDDCDCBE26FD148BAA9BF7C83B1D4C" + }, + "fixedInfoPartyU": { + "partyId": "3ED225CB687F35DE1E8095DDF1995FFD", + "ephemeralData": "DAB6239AC520D8304585C527A2DCFDEFF77E4E68953A16C0E4EAA762FBEC" + }, + "fixedInfoPartyV": { + "partyId": "CF1800A2DAD97A131C7E39CBE142218C", + "ephemeralData": "A3ABECAD8EBF7EB52B9D0C47095F609C4A24878ACAA66C78AA82EF6A903E" + } + }, + { + "tcId": 2002, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74E51249920326FA1F30214AB9E6717B", + "z": "D79B853F92CF03F0BFE389DA7DF493F235C3F4E7EC973E97F85E232E048C", + "l": 1024, + "algorithmId": "8C8861A1A4970142876A9FAB3AB10025" + }, + "fixedInfoPartyU": { + "partyId": "3C395D21A8DA832E65329D18221B303E", + "ephemeralData": "9E3AAF574E8F60551DA0D8B6AEC0A311B8CB532B13CC915C37CB9E7034C4" + }, + "fixedInfoPartyV": { + "partyId": "1107894B91BFF972392A517B3793C992", + "ephemeralData": "D10F18BD3B8778C03C94BF61812E56ADE07D0E0FDFA6BB6382AF6105C8CB" + } + }, + { + "tcId": 2003, + "kdfParameter": { + "kdfType": "oneStep", + "t": "84118480CAC35B8A3C4A72D6F33D7395", + "z": "FD5E54B47EA6FEB604E9A60698532E53E114E53CD2D7DB83DC0F6CAC8A7D", + "l": 1024, + "algorithmId": "B8A6B7EEE9E3F1A03EC822AF3FBAF071" + }, + "fixedInfoPartyU": { + "partyId": "6436031B61F0B9A8390B636B5EE01CBE", + "ephemeralData": "E888B64DEF1A23EF76B6042014D97D2E2791C5AED4799A6A7DE8769408A8" + }, + "fixedInfoPartyV": { + "partyId": "735D8FF1C3769ED587CA4C0C5641C8B2" + } + }, + { + "tcId": 2004, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB9FE283E7B1525172A5ED03ACED661C", + "z": "4DE9D014A1D94C8031CC042E63B42703168A23D7F9ECE030F37B63F1679F", + "l": 1024, + "algorithmId": "FCFE543C7F158C91F1349B2366147F39" + }, + "fixedInfoPartyU": { + "partyId": "82160AC00C3529819A62D5DF69EDAF6E", + "ephemeralData": "71C0CE05E21AC42D372035278A9EF660DED98AA5E66EDE9AB31F328A4E3A" + }, + "fixedInfoPartyV": { + "partyId": "0FBCEF718B53FC4E1B5F81D9B9573576", + "ephemeralData": "C695E22B3C8397DE052033706FFD1ECBAD3C17C52003C74CEF7F2215D54A" + } + }, + { + "tcId": 2005, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70A38271A4603642078B92074BEA1E6C", + "z": "F8C1206416D552706C4EAF87427355E6FFB6FFAE53C05A86ECC24BEC294D", + "l": 1024, + "algorithmId": "46BA420557E6B6FB2D9C2256A71E61E4" + }, + "fixedInfoPartyU": { + "partyId": "8CE3B38B8F987F846F56DB0A751278BC" + }, + "fixedInfoPartyV": { + "partyId": "986587AB759AB9E122F4FA2E300A4F42", + "ephemeralData": "D9FABB2229531E7D8EC7B6D122C6486EBCE0BE1708BD04FF0BF541EC3596" + } + }, + { + "tcId": 2006, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86C4E1338EF22B3E6EB04554160DFA5A", + "z": "5161D6EDA7C41252BBA8C2A836A72677F8EA82727FDBE7350DE7ED98AC1D", + "l": 1024, + "algorithmId": "A696E237BDB7C489F4DF54022B167558" + }, + "fixedInfoPartyU": { + "partyId": "2DD3D43A26C54CBEA9498A9F31FFA8C0", + "ephemeralData": "8182FC5B77FEDCEC59B983CABF89855E203F28855A62DD0239FDE6CCB445" + }, + "fixedInfoPartyV": { + "partyId": "80C3303C54FC6EC36B9522A723963F7D", + "ephemeralData": "1C64865BFB1EEF3C781B9246DCE15B06DE85E7F0C8ECCAAA0815B0A0662C" + } + }, + { + "tcId": 2007, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4537B2869F2028DC114619511D2A5EEF", + "z": "E6D9D459F00F4A43D0A7566AC3D416D4AF94F052EFDDBCDC802BF3FAD174", + "l": 1024, + "algorithmId": "EE663D71E33511A96486F9FC36015664" + }, + "fixedInfoPartyU": { + "partyId": "56C7623F6E826EC37342A06FF0DAF6DD", + "ephemeralData": "9038D4FB0060D33440A4165B11F7E208273BE3AF8EA39EE048C3CB0A532D" + }, + "fixedInfoPartyV": { + "partyId": "909212CB51F9AE1A1ACF812C72B983E0", + "ephemeralData": "75521CADF7DC1386FAC8292CAD12660C4CC26A361EECD83F6B50488C7A47" + } + }, + { + "tcId": 2008, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D31777C64CC528A9BF6BABC28B98E906", + "z": "904090688F476E0375E1D2086178E32F272BEE1B53ADD8A17C256185F48E", + "l": 1024, + "algorithmId": "5C16254A6950E5FAD0DC06B9124EB21A" + }, + "fixedInfoPartyU": { + "partyId": "7C906FDDBF478936B49F56DB7DCE830A", + "ephemeralData": "98218A7E2AC343D84CAE2098481D971013961A17F118F1456E64D4E2F982" + }, + "fixedInfoPartyV": { + "partyId": "9A8865C28B8815A5BB5E97E6FBCADE93" + } + }, + { + "tcId": 2009, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0ADF8A0A2185E57B8A7D71A96FAE1A2E", + "z": "CB5EB55E597A3A9FC443F3E580D35F1180D39A9C0CDA62179B7D47850E44", + "l": 1024, + "algorithmId": "0A26045BBF32ABF554ECE49BDAE4F8AC" + }, + "fixedInfoPartyU": { + "partyId": "E3D59C954C03938DDF7F4C7B27CC6A4A" + }, + "fixedInfoPartyV": { + "partyId": "03613C23CD4B6E7FC6EBA5894D26D3FA", + "ephemeralData": "6A1134DDFB60E0C4C07D38E164A39765032FF7F052F3F4E0C405ACCE32C2" + } + }, + { + "tcId": 2010, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA4414AACE8AC14D584D442075BFC420", + "z": "98A1C5A1DF0F7BB62AF9D3484AA779114C3058591519D526976B4D07723E", + "l": 1024, + "algorithmId": "C5B1A9C616DB06DC83662C87EE375DBF" + }, + "fixedInfoPartyU": { + "partyId": "F4EA0A5BE99E895964A153D810C1C7D9" + }, + "fixedInfoPartyV": { + "partyId": "3461F68C3D8CBC13D171CC602611AF01", + "ephemeralData": "CC261597C43F50FA78718F159FB61B90ABCE0F35BFF043D7BE731F96923C" + } + }, + { + "tcId": 2011, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A95F67BC6A76AEEAF4FF6F6E42AC2A9", + "z": "F50E4E3D50DFCBF2D826D0C624675EBDA0C1C7EDAB781C031CFB99440E7D", + "l": 1024, + "algorithmId": "2F3F6AA03BD93F2E5DBBB6B92BFF2EC2" + }, + "fixedInfoPartyU": { + "partyId": "88094A6C0DBE8D33A52591BD4EA937E2", + "ephemeralData": "6C181239F0C1382BE2721EB5C8830EB4DFABBA791CA463C530575E49AD4D" + }, + "fixedInfoPartyV": { + "partyId": "EBAB7518EAE3078B96C5A1EF6257C1A7" + } + }, + { + "tcId": 2012, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A1001B3B6EFFCFF08614C33422B8286", + "z": "95755CC41D4AFC23FA3AABF7EA0A8DF70161BCA51FC9F95FB619A855DD3F", + "l": 1024, + "algorithmId": "E04DA4F2BC493A62204C6459C425AC49" + }, + "fixedInfoPartyU": { + "partyId": "A5A714783222D0C6A54F157CCF2A616D", + "ephemeralData": "8208892623643EE285919243B1348402F1FC5D59BA443F6409C9AC6105FD" + }, + "fixedInfoPartyV": { + "partyId": "47F65B378FC557A4E91357C675A4540F" + } + }, + { + "tcId": 2013, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BAF9C65997FC8D978B9F6E9C8813D00", + "z": "C76EDC20BEF9B024A2C64EED8177799CD37B2CEB16DB27149A5FC8880D65", + "l": 1024, + "algorithmId": "CF7E7B9BE7BA3740C160EEA5F936B2A7" + }, + "fixedInfoPartyU": { + "partyId": "8C0BD3ED5A286570B6F38D825F87A45C", + "ephemeralData": "B56C258811C1860E511CA547BA14B8387AA1CFD7E9C29461AEE322052C06" + }, + "fixedInfoPartyV": { + "partyId": "E71BA4BFCA25F578A568AF19C06CA551" + } + }, + { + "tcId": 2014, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38E084FECDC8AF251EF5C4C5490BEBEE", + "z": "D10BCCC208DD53DCEE5E98495D9A4BA935FBFE2599BD872BB5FE1B36A0B7", + "l": 1024, + "algorithmId": "4D90A14D076476733C9ED47CE826D218" + }, + "fixedInfoPartyU": { + "partyId": "F69F2B8C83C0384F746AAD4F2B96EF3E" + }, + "fixedInfoPartyV": { + "partyId": "7B5EF2F53EE3C3C9DA483BA0327C06F0", + "ephemeralData": "593687E986504EB39E9E8FC6D2E5E7B4B062DAD8110E25E1FBE5D068365B" + } + }, + { + "tcId": 2015, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E1C1BE79DC7626A3BD8F2898FF2AE6DE", + "z": "B63970889015A8C2F76E7C3D3FB0C88A8D4F93EBACAFC94D08318434EDDC", + "l": 1024, + "algorithmId": "906F3E7F65EA667EE492B0972B4EA4D0" + }, + "fixedInfoPartyU": { + "partyId": "FB3DEC4F6199D65EEB09918908A5BF6B", + "ephemeralData": "A70CE366E1C5BEF90347EE2B41F98FDC7FA06E8C2BE4734481392BAD9B15" + }, + "fixedInfoPartyV": { + "partyId": "7C7D65A494603D318A8CD57323196BD5", + "ephemeralData": "5EB28DED0F6E02070C7D5520563C66611B5866EEA211260D11AB56D2BC57" + } + }, + { + "tcId": 2016, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE40F8FB7770AC99803FE73624FB1F3E", + "z": "3B0B1B61449C7133A3EC180FA969AD04E92243F932C3B9286510D50A4E15", + "l": 1024, + "algorithmId": "98CB414D825749D33FB27CC8FBC4DC58" + }, + "fixedInfoPartyU": { + "partyId": "FBED046042F7D987F536FF6CA909DA44", + "ephemeralData": "42A92135217376047C793A1FEE88AE0D03CC39991A71C227E9520DC3A8B0" + }, + "fixedInfoPartyV": { + "partyId": "BC9DE4FBE7E1F0F22D4772B0E6A0842F", + "ephemeralData": "8092592EFB5A669A52E59815EB2F1806B430994CA334E4C1CE16D894E9D6" + } + }, + { + "tcId": 2017, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36684BA1FF03C754B1F998F36F8074F5", + "z": "A02AB9BCA8E96DD278D5D703733D69665620B32D106B3B3BBEF99DE3D9FD", + "l": 1024, + "algorithmId": "2C74E0C19E7C6D251B9F2D80105AE206" + }, + "fixedInfoPartyU": { + "partyId": "456BE30344393732D6FDE8A14505D979" + }, + "fixedInfoPartyV": { + "partyId": "11820250B47507846090482EC29960FD", + "ephemeralData": "E12188E01CE475914ADE9059BE18A302EE74919ECC40666C7EB4DBAD5396" + } + }, + { + "tcId": 2018, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1CF39E51CD9214F02A25A7E3225253E", + "z": "1F60529828DE5342379E644AB1ED8DBFE09F438CC6156075E2B16FECA7B5", + "l": 1024, + "algorithmId": "2355D0239FAF6A8AA43C3A74E82B80AD" + }, + "fixedInfoPartyU": { + "partyId": "5FCDB71CC5B05B71E5E37BEAED9B50BE" + }, + "fixedInfoPartyV": { + "partyId": "002249889199657D226AEE342F4C626E" + } + }, + { + "tcId": 2019, + "kdfParameter": { + "kdfType": "oneStep", + "t": "273AACE77281ED4ADE49B51DFEA3A4D7", + "z": "8154DE09B8FDA4E58A35D68E5B6F14023D672DC7615F250597883A8E4A69", + "l": 1024, + "algorithmId": "1AE3D547A37D95B15DF4D5CC54964659" + }, + "fixedInfoPartyU": { + "partyId": "1BEDBB9E7E9F3F92A846FC3A565B0476", + "ephemeralData": "EBB7374EC8C6CD050210D1C3EBDED1268DD03DE964DEF1631E8C036CEB0D" + }, + "fixedInfoPartyV": { + "partyId": "6B5C985B65F8E6EA7EE7F3FC40E2B629", + "ephemeralData": "A6ABD9DC0160EA33918F5B323BF33A2BD0C33C9EE50B66492AD0C0AC78B1" + } + }, + { + "tcId": 2020, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D3B0088A7FBEA8AE450D01B5FC660FA6", + "z": "478D2DA12BE6CD2875BF0A8DFA0A7E07690D8E65FB2746B4763EF8A0AE77", + "l": 1024, + "algorithmId": "E86DE6A17FEB591485C74BD55070F3CE" + }, + "fixedInfoPartyU": { + "partyId": "7E9BBAD41F5B2FA97546F20718A80CFA" + }, + "fixedInfoPartyV": { + "partyId": "B887D51312D3850213A67A90753FA045", + "ephemeralData": "9563726D0504029169D24D8C5BF267316EA09FAF5D5194381461F5E65801" + } + }, + { + "tcId": 2021, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59115F7F1A82BD4DEC97200F572E1266", + "z": "72E612521BC92449DF58D72050DE8A0C91F3BCC793594AE0C2D276CBB4EF", + "l": 1024, + "algorithmId": "006F29910D9B0A0A528D69D0A0086145" + }, + "fixedInfoPartyU": { + "partyId": "DB597CFDE431A32EF95DDD1E41F8ABD2" + }, + "fixedInfoPartyV": { + "partyId": "64CD6FB6ACA76B0F003A3E2E3CF8B1BB", + "ephemeralData": "774CB6720E40BD6DA335EE619623EDCBCDE174A57C22E42C2F73B2C31BC1" + } + }, + { + "tcId": 2022, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DE8DCB665D12DBB9E62B6C2F1BEF17A", + "z": "1B27B37DA622726D04077163745A47517DCC08BBF1B84F021CD678213A33", + "l": 1024, + "algorithmId": "4D3099A0656948069E80F9E139458428" + }, + "fixedInfoPartyU": { + "partyId": "59FAD0386EEE5E76B87865310C5F2AE7", + "ephemeralData": "CB988205FEA2CEEB4BC0A9910A9D284E9E2F56AFCC2F557779420A8ADC3E" + }, + "fixedInfoPartyV": { + "partyId": "61C99902B6E8B0A5109CD73FD5C8779D" + } + }, + { + "tcId": 2023, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A66AB8F514776374727BDE7CB78B75DF", + "z": "82411FDED98AD06334256A009B745B7CDFBD19B8EA61315A32153A284219", + "l": 1024, + "algorithmId": "EA58AEFA6935962E3A97B882534C06AF" + }, + "fixedInfoPartyU": { + "partyId": "61269156591AACD41D85B8508E2C7644", + "ephemeralData": "DECB5053C756D5C48F2FEC42A6DEF03B533BAF57DEE481FFB759A01BE695" + }, + "fixedInfoPartyV": { + "partyId": "6E2ED96B0C2CBEEAE22538492429AAD2", + "ephemeralData": "2422C084BBFCCB030A1786AD0B06B5AF64924A4622058574E4EB7769DE59" + } + }, + { + "tcId": 2024, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FAD8BC427FA8214827013862BC780AA", + "z": "B524F2290497A3026005EFF8D5A567891EEDFFC64F2E502AED2DE28C3765", + "l": 1024, + "algorithmId": "39CE49F588E570BF4ADC1E753D8708B6" + }, + "fixedInfoPartyU": { + "partyId": "704C36FC7755BD0BEBBCBD2346C23385", + "ephemeralData": "648E993BC9B9ABCCFBA73D92C9792C37C4294BE9350499BE92EF8292F8F5" + }, + "fixedInfoPartyV": { + "partyId": "A0D2881EAC04A1963291F9336E2656CC" + } + }, + { + "tcId": 2025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB36965F88A93B379B988AF5BD674B30", + "z": "EEC4403676C4B0EF92C5BB55EA582D911E2487C72A8BEC0EA982A6946EA8", + "l": 1024, + "algorithmId": "5B13F0C95FA92FF562776D7C6D125C3A" + }, + "fixedInfoPartyU": { + "partyId": "10C2CA327B3D87D96C5B5AB6BDF95F03", + "ephemeralData": "60497ECD10EBD13667668E67269C28CD720BE2E47F15267A4075307CA919" + }, + "fixedInfoPartyV": { + "partyId": "8A77DBA0977E1E8EBE47971DFFB3ED24", + "ephemeralData": "C6CE0F4997DDE036540C2FF75AB5DCFC736445AA73B110825BA496536F15" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 82, + "testType": "AFT", + "tests": [ + { + "tcId": 2026, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F841FEE9E954F729F677891C6F0E9CE1", + "z": "A3AF923FF647D26EDC7BFED59DECE15BF0CB4E2EBA0F0CB0FFFDD716", + "l": 1024, + "algorithmId": "5489C3FA639AC3DAF2130D9AD989B77F" + }, + "fixedInfoPartyU": { + "partyId": "CD40538CD4A48AC6234CA181DC092AB9" + }, + "fixedInfoPartyV": { + "partyId": "5D1DBF078F448A6582EA13B60A489A87" + } + }, + { + "tcId": 2027, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADC242B15CAE2F5AD37CB5C07CE904DE", + "z": "31940276EDC8425A9C0CDF64716A39B983813F0795691F914F6D292D", + "l": 1024, + "algorithmId": "623932B7029664D2F3002860EFD6F2A3" + }, + "fixedInfoPartyU": { + "partyId": "8175539ABED1E9C58DD5E9A28F41A479", + "ephemeralData": "0D7AACDC64CFE1F1FD621C388B8ED97F61EA522536D2F83DC52019F9" + }, + "fixedInfoPartyV": { + "partyId": "977C596FAC3C6C73E87CBA46CD06024D" + } + }, + { + "tcId": 2028, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FBB8E487D095DB13DA94F31E4D91D22", + "z": "7F9870A3C26E529D532DA40805CDA5A76E1615808B72AA3B22CF1599", + "l": 1024, + "algorithmId": "4CB4588598761CB98E8E87DC49AE4D11" + }, + "fixedInfoPartyU": { + "partyId": "1B634DAB7711928870FFD6602B45107D", + "ephemeralData": "93767D5DA6D00DEAD0700DF212CA7E0DA646026860A375038F0C963A" + }, + "fixedInfoPartyV": { + "partyId": "D4F8CBA19B7AF08CDA698952EF4FA8B5" + } + }, + { + "tcId": 2029, + "kdfParameter": { + "kdfType": "oneStep", + "t": "984C5B773BACB612C57B54B1AB3A1C50", + "z": "DD8734674FCABCF2E5C9EAC92CC681CD737981C6A3922D97E6BA2858", + "l": 1024, + "algorithmId": "E38BF89F97751E713B5857939AFAE2A3" + }, + "fixedInfoPartyU": { + "partyId": "30E59689224BA53D763EDDD115C41CAA" + }, + "fixedInfoPartyV": { + "partyId": "A6627E6A5E9CA567928C717FF090F707", + "ephemeralData": "A238698337AB2BEDF63C607599D65B5BA79E24EE4F42F0A263BCA9F8" + } + }, + { + "tcId": 2030, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA078C5D0068A7281D15DAC34090BB9B", + "z": "53803CC33EE98CF850AF055250F8EB9B38028B5FC8E77A3CDD671A37", + "l": 1024, + "algorithmId": "733F72C2F087BE54CEBC4BFAA85AD819" + }, + "fixedInfoPartyU": { + "partyId": "37E0C7D42137620AA8B9DCB6C770BCE3" + }, + "fixedInfoPartyV": { + "partyId": "F9FF1A2830AAB2B7DC57AE17AE3C81DC", + "ephemeralData": "0E2AFEEA180DCBA544BAE666B2AB307C8ECEF0455032BE823A1BA3E5" + } + }, + { + "tcId": 2031, + "kdfParameter": { + "kdfType": "oneStep", + "t": "831EA6EF941FE852C39B1F50CD9AA1BA", + "z": "293F3776C2A515136BA24A6E7CE7CDC5146BBC63CBCF73AB27793CBA", + "l": 1024, + "algorithmId": "1F9ACFC5F50427D5B40C6B1292FB11E1" + }, + "fixedInfoPartyU": { + "partyId": "9469CFD147737255893A80092FC4784B", + "ephemeralData": "D6FB265D93440B3CF7EB80A63474B0B796A56FB204A425A30185FE86" + }, + "fixedInfoPartyV": { + "partyId": "10562B1F52A828BA38F00E11AB44995A" + } + }, + { + "tcId": 2032, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D882932FD60D80555DE5AFB61162D198", + "z": "9FD296447ACC854A2700DBFA35357C11F8617E40A389F2A714A7ABD8", + "l": 1024, + "algorithmId": "A045EB15AF0E2A0B2212161F28F42A29" + }, + "fixedInfoPartyU": { + "partyId": "38D1BF47A5F930436AD635A877F33B09" + }, + "fixedInfoPartyV": { + "partyId": "1F10CF2DDE528E5A9254DBD84AD84BED" + } + }, + { + "tcId": 2033, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F16AFB1F7C00B5A60B99BC80A0EA69B", + "z": "5306D23A94080F8E68FC65FE1CCDCFAF54C543CAADC83B5D3C81240A", + "l": 1024, + "algorithmId": "00B74BA59DDD8C4755A95F5F6132F330" + }, + "fixedInfoPartyU": { + "partyId": "843F61DD60A27AC981928D7598A3B19E" + }, + "fixedInfoPartyV": { + "partyId": "348B02ED1BFBC1AEB34BF8A43D8AB064", + "ephemeralData": "97CCC7E558B8FA157B21D5BE83CF2D8B9BC283524C3D21DF2D9F180F" + } + }, + { + "tcId": 2034, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B92D0DE6B09CE8E3DF212E51666A6CC", + "z": "1E88244535591D856792FA05E8CC6D4E6D7ED8D0778F6F30E4CEB6D7", + "l": 1024, + "algorithmId": "2BB24919991C3350E4C50EED17613847" + }, + "fixedInfoPartyU": { + "partyId": "0C45EF175CFBCD7A62C1C0A080065905", + "ephemeralData": "FF386D69AB8DCCFED2767171E70B9E995DBAD62A3EE366210221EE85" + }, + "fixedInfoPartyV": { + "partyId": "E9754222F3E41B6735C0A14CD7955035", + "ephemeralData": "8C5580D5DDF811E341DA08E42EB3987560B8953ACE7EA674F02FE105" + } + }, + { + "tcId": 2035, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF4FCE260DB7C493C709A0A69075119E", + "z": "A681D76EA8AC8AF1DB87BF001DFD97BE25FAF6F8380F1A562D7A8DF0", + "l": 1024, + "algorithmId": "83634A5A2AD467C5175ABB6A149F7848" + }, + "fixedInfoPartyU": { + "partyId": "AF973C02832C36CFCC3AE518F6F04D03", + "ephemeralData": "93CA4E315DD80D0306AA3469987FBED2E166FD7446670C9AC6FB09E3" + }, + "fixedInfoPartyV": { + "partyId": "E7A3B0894069DF85CD8A03FCF2B4D803", + "ephemeralData": "CB8A13B133CEE474499B43D3424C959E31D6A1A9EC0798EAAC78FDEB" + } + }, + { + "tcId": 2036, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1BF5EF9744E176BF6B124FDB1A3800CC", + "z": "7F7C81E034F19967F26E5CAC0F13F0682C440BF53E19F1A2CAE51FA1", + "l": 1024, + "algorithmId": "642DC22724DE62787F9ABEF53CEDF383" + }, + "fixedInfoPartyU": { + "partyId": "CF25FAE7DBC163DC0883C26D88E756DC" + }, + "fixedInfoPartyV": { + "partyId": "7420E9B12D08B402803B97D262CF03E6", + "ephemeralData": "7A0E6A08ACBE0A1DAD7EFA2921736D0B939A49330B6CA5BFBB239E61" + } + }, + { + "tcId": 2037, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F6E7570385263B04E17C493F493DD05", + "z": "C152CA33A0E380CC1135DCE44AE822371FDB584D4435CB6ED0B03094", + "l": 1024, + "algorithmId": "B7A3FC08B3CEE09A95A1722502194B64" + }, + "fixedInfoPartyU": { + "partyId": "3AA64FA73A49D34BD81FAE7225256920", + "ephemeralData": "9311FF0F0389ACB633E4247378A39C104D13535C409453087B8E16F8" + }, + "fixedInfoPartyV": { + "partyId": "5B15E491151746C4B33BB6A8DA7D69FA", + "ephemeralData": "0C2DB4EF6159A438D6F3450042096B8A8D4B3206C22A33C1A5363B8B" + } + }, + { + "tcId": 2038, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D215995333974BC743BC82652F16EB9", + "z": "62D4DD97E958A790313F10F7D01A350B7AFA7EDA3AFB81EE7833BE26", + "l": 1024, + "algorithmId": "225A49FA20A7C3337A0630D79052D2B2" + }, + "fixedInfoPartyU": { + "partyId": "A777B6723733E1163BF909A1DAE4D2F6" + }, + "fixedInfoPartyV": { + "partyId": "AD11E149657E0CF019843C685A8669C0", + "ephemeralData": "7BFCB1C05F958E074D74D61BB130D9BE08DC15BADE3B02D8209A0843" + } + }, + { + "tcId": 2039, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38AC832D349283F116FBCA2F36F6A9C6", + "z": "030B63213B51391B21CC62737D5835D0E481BAE6F07ED9231B781944", + "l": 1024, + "algorithmId": "13082E9437ED8DF652DEF687FC7A1D06" + }, + "fixedInfoPartyU": { + "partyId": "7450062BEDEFEDB67AF2B4E07224A963", + "ephemeralData": "7386C7DD421C030E963D8C7ACEBFFA3CC80B1C8BB7CAC1142ABB4517" + }, + "fixedInfoPartyV": { + "partyId": "9855BA59E84FD84F1D0AF2DCE915F6DF", + "ephemeralData": "3DA17FA1EF4AEB220795D8573A4D4C7929143ADE127AB01E2FF279B2" + } + }, + { + "tcId": 2040, + "kdfParameter": { + "kdfType": "oneStep", + "t": "785F34D139DBB61CA962186EEBD0379D", + "z": "A58D15A78FB11B572BF7F1D4D5BE0AC7D98655163CE10D030992FCF8", + "l": 1024, + "algorithmId": "A6378CEB1648B29604DECC5BA9BE0AA7" + }, + "fixedInfoPartyU": { + "partyId": "19D5945690A32DF9EF1ECF536232A5F0" + }, + "fixedInfoPartyV": { + "partyId": "7FEE62034ADC21333CE06406F712E189", + "ephemeralData": "41AE20255240EAAD7A331DFC9846C2D5664EA6DBCFEBF7852422704B" + } + }, + { + "tcId": 2041, + "kdfParameter": { + "kdfType": "oneStep", + "t": "320C02F2EBE2B8079A4D58087C2C8D8C", + "z": "6A1A4055278FE1C896D7ADBD30163DB4042C01D61E0AD20528135156", + "l": 1024, + "algorithmId": "69450A147E65219BF1BB642322DAA280" + }, + "fixedInfoPartyU": { + "partyId": "06A60E83BA641DF7C328331499FED081" + }, + "fixedInfoPartyV": { + "partyId": "B7C4D3ECC17469762B442DB2A2C9E549", + "ephemeralData": "B4CA9D6EBAA2CEC7515A0BFA893BBA121D49A039531480F09203069D" + } + }, + { + "tcId": 2042, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D10EF235617345E3582CC115114CAC71", + "z": "C55397B5A424E66E072FEC1424916FC7285EA2B1CAC944ECB8ED0DD2", + "l": 1024, + "algorithmId": "E80C8458E31A67539A4AB80B37EFE166" + }, + "fixedInfoPartyU": { + "partyId": "735F81E32CFC53964B1149586064E845" + }, + "fixedInfoPartyV": { + "partyId": "F1540249E8EB6207C3484D4FB4749003", + "ephemeralData": "26E6519D1C9BF511DE06B142B187EC2303F0C08D455D7ECFFE3DC885" + } + }, + { + "tcId": 2043, + "kdfParameter": { + "kdfType": "oneStep", + "t": "313DFA641950B706EDE2890C0C2E1F5C", + "z": "0BFE8B7A382EAAF76D032AF0E62AAA0297E430B2796476141F3B27A9", + "l": 1024, + "algorithmId": "FC3541789E88989EABE3B4C204795DC1" + }, + "fixedInfoPartyU": { + "partyId": "DC5AB5BBE5E8160650F5565AA446CA64" + }, + "fixedInfoPartyV": { + "partyId": "7888A402F9FE3AD0F63A286A8C5CEB4B" + } + }, + { + "tcId": 2044, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5411CEFD0F9DF6F4D80C639E9338003", + "z": "EEBF4A99CC7EEF2EAF18018C828A6E782D48F50EEA97BA94D92ECE19", + "l": 1024, + "algorithmId": "DCDAE3101EE20CCF35B8E9CD2E981992" + }, + "fixedInfoPartyU": { + "partyId": "44DA48E9494800B44204FCCBB245E8F0", + "ephemeralData": "B98CCD47697C6296AF25FAA8FB4940624F29B69204EE43775501D552" + }, + "fixedInfoPartyV": { + "partyId": "4538AE57A57998BE75464F3A14E6C5CF" + } + }, + { + "tcId": 2045, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38F9F16BD8901E0E68A1C233B30A35F0", + "z": "0565128CA68425C43A8EE9479C351890B2AA908CF3B7C97E7FFC161B", + "l": 1024, + "algorithmId": "ECC539863B1F6D3319344024737B2E68" + }, + "fixedInfoPartyU": { + "partyId": "A327167D276E453D6F20E77441AE5CAF", + "ephemeralData": "7A025EC6F7A93E68E22F43B1636BF35592F573BF638290F4E9F5D8EE" + }, + "fixedInfoPartyV": { + "partyId": "73B4DE2BCCBB1C6F3A9D8EE0FEADBC67" + } + }, + { + "tcId": 2046, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E873BAAD33BCBEA2E7228F37F66FC77", + "z": "C33771001BFD6E61434047E45EFB847CF6153A9B4CEB3FF5552CE1C3", + "l": 1024, + "algorithmId": "E93C7A606DAB4A20FF6E348F229F7344" + }, + "fixedInfoPartyU": { + "partyId": "B8E41A1138F4E74D7EAA5DC3E5559BF9" + }, + "fixedInfoPartyV": { + "partyId": "07845411E454ED43FA63EEDCD066B27C", + "ephemeralData": "56707FEAF2AC1CF3D1BF8409448A46320753FC107CD91E3330E50052" + } + }, + { + "tcId": 2047, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74CB15C70A7F7E87CB3CF5111329FBA2", + "z": "2FCF5E1C5DC72BB5CF9C87FA64EACE3CE125EEF5306F67F428F8F221", + "l": 1024, + "algorithmId": "B42976CED4502F91D12A20AE56295853" + }, + "fixedInfoPartyU": { + "partyId": "221EF98C3BBF017EDCB3DB647C0A1FA0" + }, + "fixedInfoPartyV": { + "partyId": "98960C9A2BF6BEFB793F0F1B94B98F5A", + "ephemeralData": "BD1D6803CA10859B16CEC18DA40DBC4361C7F9E60E1B607DA8E3D58F" + } + }, + { + "tcId": 2048, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD9515139D6BEB78AFDF4B8C6526A35C", + "z": "20009B9364976C1C1E948E226896F4B5787BE6A5148CD62656604642", + "l": 1024, + "algorithmId": "6E4C71455C3F9A0B3366EC0C784B73B0" + }, + "fixedInfoPartyU": { + "partyId": "A5C012168547F610FF1A6105F520C881", + "ephemeralData": "462B5896DA537385C6DC926BD68BC2FCAED6C07680857B025583FA67" + }, + "fixedInfoPartyV": { + "partyId": "A18E749B4D7ECB7CA12C94F2AC0A070F" + } + }, + { + "tcId": 2049, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E349DCE8C904E9826E2754AB3DE439C7", + "z": "F87D0805C10FB0543ED043AB2C9E0BAFB3339919B56CAB1FFC68461A", + "l": 1024, + "algorithmId": "F622FAB70A0E6DFC32A28EE2FF772C16" + }, + "fixedInfoPartyU": { + "partyId": "12242ECD1CD6259271F02A231F4AD88A", + "ephemeralData": "6C859A2D1B858F134E402B732E17F7A6376A8F0B0CA41ED74B76BE74" + }, + "fixedInfoPartyV": { + "partyId": "9B1813A5BAB2AD064A90A0FD8C2671B4" + } + }, + { + "tcId": 2050, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B65588E72D3F0BFF14326211CEFBE68", + "z": "2A2A0CDFCC493EEFDD3D5906528952105AFE82CC644A2EF69B7296A8", + "l": 1024, + "algorithmId": "10579B393993971D74BB961BE9FE23F3" + }, + "fixedInfoPartyU": { + "partyId": "9F508B74391ABC29A3904832C5E549C3" + }, + "fixedInfoPartyV": { + "partyId": "04E9BBA54D6A5B881A356B81666CE0E8", + "ephemeralData": "26ECA9AAB0DE42C4BE2CF7A4A9EE6468033F4A29E5C1C828399C82A1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 83, + "testType": "AFT", + "tests": [ + { + "tcId": 2051, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5AF4FBCA3E367A73E6F7765F95C9F7A", + "z": "11E18886F2639EB69E730E9DCA4B0EAA2AE25B721720081E84FCBB32", + "l": 1024, + "algorithmId": "5654CB66521A2C712B613D7888C6F669" + }, + "fixedInfoPartyU": { + "partyId": "0986447F7238CFCFAA20457D216EBE5A" + }, + "fixedInfoPartyV": { + "partyId": "2695FD0958931F10DBAE05181C999444" + } + }, + { + "tcId": 2052, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01CE6290805F76867A13FAC7C81CFB3E", + "z": "01E6844348713A7717A8477AEC236FBF3625B25AD2B4B38C3ECC2E75", + "l": 1024, + "algorithmId": "A038CF21F85FB431F9A1FC776CFF5642" + }, + "fixedInfoPartyU": { + "partyId": "146E4A478A14F902F3835DE5CF69219C", + "ephemeralData": "3280EA30EC615155493835B3CD07FB84BC3A89B7B94905735216BBDC" + }, + "fixedInfoPartyV": { + "partyId": "D32D161F1B29AECFC866725CCC2DD01E" + } + }, + { + "tcId": 2053, + "kdfParameter": { + "kdfType": "oneStep", + "t": "87D807C742B9139E7CB8530EC74583EB", + "z": "F7E5345797C17F5198162A0B83DF691B243C5702239CBDAC17ED1029", + "l": 1024, + "algorithmId": "8A77000EAB963E59A709300A84B010EB" + }, + "fixedInfoPartyU": { + "partyId": "B7C522E62DDE6012FE810E6651E0C776", + "ephemeralData": "4CAB70E1E80DBEEA773AADA5D878C0554EA9363FF19C363633346094" + }, + "fixedInfoPartyV": { + "partyId": "D72660439040C3B0D3C27F0ABA2EB1E8", + "ephemeralData": "6DE227A4FDD644EF078E08508BC6524C53D52D3F8A74415565A0BDAF" + } + }, + { + "tcId": 2054, + "kdfParameter": { + "kdfType": "oneStep", + "t": "597428F874314FE21D12006B3FE7AE8A", + "z": "0000678478BD80C4A1ED954D5B551F9A09EA73E6B95DEE60C48D1C17", + "l": 1024, + "algorithmId": "B20AA03A6934BDB998FCF64FE3859679" + }, + "fixedInfoPartyU": { + "partyId": "F8582E509C5146131E51DB48919F88C5", + "ephemeralData": "44074736CEBFC059D35EF45DEDF940145E9794D33B6226D6FAC28309" + }, + "fixedInfoPartyV": { + "partyId": "4675553C62EF063DE37A62C528965050", + "ephemeralData": "0456B015C5B2996FFE82EA1E1E8EC3F4C349BC24F93AF3AE5706FEBF" + } + }, + { + "tcId": 2055, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0195AAD36869B8F66FA0242B24B69E7D", + "z": "CCF495E0215E6B362DEE0A3C27459B9F2AAC29A719872B80388B125D", + "l": 1024, + "algorithmId": "E8E6E3F8A156921657AAAA84EB048045" + }, + "fixedInfoPartyU": { + "partyId": "017C9C165268AE57E54355FC6B844240", + "ephemeralData": "A28ECF5F574A2D41A565D9BB37EA586AB3F2CA68BCC82B41725BCF76" + }, + "fixedInfoPartyV": { + "partyId": "8A94AFBB16FE5999C66AA95DEF9A169C", + "ephemeralData": "DA619D24EEC0560230511F259C7212048548365C16C25B1B7D55ED32" + } + }, + { + "tcId": 2056, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B695780CCD4E6A411667F6ABE144285F", + "z": "8A211A1800007848A1EABA59CB104F656991C4DB57566BAE5417CAFB", + "l": 1024, + "algorithmId": "DC1598BB13F6FC4522BF2EF4633180F7" + }, + "fixedInfoPartyU": { + "partyId": "E706EDD2F42EC181F1184067CD16F1E0", + "ephemeralData": "8B984A1E362502C3AEE977CC4A933B16C9826DF38D51748359F2B0FE" + }, + "fixedInfoPartyV": { + "partyId": "D2733FC47D5D302E6A199B19725ACFF5" + } + }, + { + "tcId": 2057, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FE6D1802BE080162284D2C44E8F349A", + "z": "3A93FD6603E24F82B591C694662D0E16CE34FC89FD15591373B9B401", + "l": 1024, + "algorithmId": "BFC9EE7B33C49BD2D73C6EBBAA1FEBD5" + }, + "fixedInfoPartyU": { + "partyId": "C8C5921F40AC5635C632B4B40156118E" + }, + "fixedInfoPartyV": { + "partyId": "C6160CB6D2B18D3140BA977952080BB6" + } + }, + { + "tcId": 2058, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01A048F66F89365BA51126B2C27E31B8", + "z": "1F947CA9B938E32C4448E417747179C79FBE92FABEA21F087B3DFA79", + "l": 1024, + "algorithmId": "67E7E497BD75F8AC63E2AB56F021BBDF" + }, + "fixedInfoPartyU": { + "partyId": "20C8C08E995F6BA79C447358636D7321" + }, + "fixedInfoPartyV": { + "partyId": "8A8CD183C295D55B00125715C4E2DE72" + } + }, + { + "tcId": 2059, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D73567C372EB5F2B8A5F83B864E62AD4", + "z": "579F5C0402B02FF5DB62FE0E193EC1780579778CB7D37A0988D277AF", + "l": 1024, + "algorithmId": "D4FCE86C845792706A217FB7CBE66486" + }, + "fixedInfoPartyU": { + "partyId": "41D72F5659CA7415F4D5805D08A6AE94", + "ephemeralData": "33990349ECF7A771D1DD237BDAAD83D0C680E15905C563D1216A125A" + }, + "fixedInfoPartyV": { + "partyId": "9E0302E04BC236354AAAF86F57C68408" + } + }, + { + "tcId": 2060, + "kdfParameter": { + "kdfType": "oneStep", + "t": "728D285E4DE8F7501C1B89ABEB969357", + "z": "AD04DE1D9204B1A6597B7D3BC331C416243BEF3466CE6C1F6C2C5453", + "l": 1024, + "algorithmId": "06A1FCC968A1B8376E4BF4A454FB391B" + }, + "fixedInfoPartyU": { + "partyId": "BCB62FC5EAE734D074152F2B0F10FD0C", + "ephemeralData": "9606F3BCAEE7F92CDF375A2168404F9950A1CB34ACE01224C68C05F7" + }, + "fixedInfoPartyV": { + "partyId": "63F7622FEBE7E777D9264547FB769491", + "ephemeralData": "723AF067285408A6559F1B4A0C3009DD1EFD21DD7FD5A382A7E53623" + } + }, + { + "tcId": 2061, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F77D3844399EC7E2A7E67FC4CD94340", + "z": "CC5181E78D5DEA77C99A0D213C1A341F271075EFBF96EBA604DF7B4B", + "l": 1024, + "algorithmId": "F8065FF468DF0059F0820BB9CFAB66F5" + }, + "fixedInfoPartyU": { + "partyId": "875C19AD55520180781DCF88856C3E72", + "ephemeralData": "BB1FBBA1174F9E8A08B14DC999241D511E6097AE3976225DD1490B57" + }, + "fixedInfoPartyV": { + "partyId": "37DA4CF51B15FB07769035D58E5E1C45" + } + }, + { + "tcId": 2062, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B43B98A6EF61583D73F2681539F5921", + "z": "8D946938E095FF7C2D59565F04420AC4D61AD6EE08C6EAB187EB3083", + "l": 1024, + "algorithmId": "AB809C71E5349760880AC0A217407806" + }, + "fixedInfoPartyU": { + "partyId": "AA64979237FAF8B04061C854A6FE9CC9" + }, + "fixedInfoPartyV": { + "partyId": "55484F0B9B84EE1560330EF2D2781268", + "ephemeralData": "DDD93E46CB8DD7BA1C56CFD3EA9AE49B225C675301A8FC8273D7523E" + } + }, + { + "tcId": 2063, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E2FDEE7DB92E101396530FE441471DD", + "z": "9E75D81207E3BA58BFA52DB4BAF568E0E49A7A492B3B10FA648E24AD", + "l": 1024, + "algorithmId": "AE42AA75D7D50AE5E1E1118076127737" + }, + "fixedInfoPartyU": { + "partyId": "84FBE936CCB3DE1B512977DA06F9067F", + "ephemeralData": "79D59EA33F680A948042AB9C9B21518740F3056F39BA27D8EC985980" + }, + "fixedInfoPartyV": { + "partyId": "716ACD3FDFA7B2DD7E92715EBF6F89D8" + } + }, + { + "tcId": 2064, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F353074533A6110F193C23F0F8161DD7", + "z": "18384592FB01A6738323BCF335C49DBCAD133DE2BC7F54FACB25496C", + "l": 1024, + "algorithmId": "877D1228D73D4C1DCC22E129485ECF1E" + }, + "fixedInfoPartyU": { + "partyId": "B2155A9E838CB1ECDE6A4AF81687EF3A", + "ephemeralData": "304148E63272B4FDB6F381671BB4392A47C57FD0E38840714C725C8F" + }, + "fixedInfoPartyV": { + "partyId": "CA2832FFAEC9CBC6E902EB4E9018E5A0", + "ephemeralData": "B79B54CB363EF83466EA4357FE28663FE9DB12FC21D93668D777C296" + } + }, + { + "tcId": 2065, + "kdfParameter": { + "kdfType": "oneStep", + "t": "931C99FE59A7B338E74E2D2A851FB861", + "z": "F78E333614F70C2A225CC74C8584C2C4BD79BA6E11F139AFBD9A7F59", + "l": 1024, + "algorithmId": "5EE2905A6549F6E48B6475AAC61A8542" + }, + "fixedInfoPartyU": { + "partyId": "70170DC628AE25F5DB0BB5D94A8D0BCE" + }, + "fixedInfoPartyV": { + "partyId": "AA7B8685884C69FA3C360D212E762391" + } + }, + { + "tcId": 2066, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A4AF63D20B3D8E11EC297BAD87CBCD8", + "z": "6141F4834F4426D0C1DDA698F646C71AA111294AE51625D20E4F7510", + "l": 1024, + "algorithmId": "5D7B89786300E351041C403A231245E6" + }, + "fixedInfoPartyU": { + "partyId": "918D96A5B28B6D390253E6995BC7FB8C" + }, + "fixedInfoPartyV": { + "partyId": "E4DD8A0031E94A89199688BD92190320", + "ephemeralData": "699B10413172CECE27F162C8B298391B2B1B2ABC44743408B6614F59" + } + }, + { + "tcId": 2067, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DFC77FF10ECC6B3ECCAF8B32CA6D603", + "z": "ECEF003C06F91D1C92E8AC2ECC5A3E1D066F9D83BB01A10E8DA86C88", + "l": 1024, + "algorithmId": "D95D2D9F0A4C407CD8C2A9B3A3EC06FE" + }, + "fixedInfoPartyU": { + "partyId": "15A9EAD461CACF843282FF4304D8B2BC", + "ephemeralData": "E15F4727BC1DC36AC5D1FE15B10E51A2736B306A8F53E2206C74CEC3" + }, + "fixedInfoPartyV": { + "partyId": "CED97585D09C7F7B31797DE47331BD87" + } + }, + { + "tcId": 2068, + "kdfParameter": { + "kdfType": "oneStep", + "t": "247C1E3813CC4B551DC228560091308A", + "z": "D14D5AAEB9D4DBBB5C6A5814798EA55C6EED4EC3EC4A4DC696143541", + "l": 1024, + "algorithmId": "9FAC5AB67683EB239E66771CA37770E1" + }, + "fixedInfoPartyU": { + "partyId": "083DA4E63DD9154680345F6F046553AB", + "ephemeralData": "7EFE330D70FDFEE8E8704178006BE85B6066681FB4E0FE52BCB0C054" + }, + "fixedInfoPartyV": { + "partyId": "F64F50845458149C9A5A7ECC9D16752D" + } + }, + { + "tcId": 2069, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F26C0BEB00C6621717C504242E635CBC", + "z": "C3419D29BBD1A4FA52B40B0FB711A0E6076AE5CB5A95B5DD5C349DC3", + "l": 1024, + "algorithmId": "EA2C9804C51E269571386D2559B5EEBF" + }, + "fixedInfoPartyU": { + "partyId": "3F6308C7060CCF6367022BB98A8538A6", + "ephemeralData": "FE4054AA9EBA4DDF5F92B4D1743F3379CC1FF71A56E0F00F507631BE" + }, + "fixedInfoPartyV": { + "partyId": "339E33A5479672CA6B6B219241F28AAE", + "ephemeralData": "1D5FA9D3C85839DD0590A8E1B0BAA6D87770BADFD054F692CD9BE99B" + } + }, + { + "tcId": 2070, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64EEA734C0E6F50CCF0B9EBDAE1A7683", + "z": "5AB1FD2D3CB65CE6EB5431D1D3CDE4E3097E63A44FA84BDD79DB6B23", + "l": 1024, + "algorithmId": "FE9EE97807585BF907E29850BECC39DB" + }, + "fixedInfoPartyU": { + "partyId": "5A09CBCD3820250D0CE4F36D52D221B2" + }, + "fixedInfoPartyV": { + "partyId": "9AE04B9EB5C77E025303EF132828EC01", + "ephemeralData": "1D746BFECF329F3289102B1C5C521A1D1C11ABC5C1FFEF9B2C91829C" + } + }, + { + "tcId": 2071, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAD6DC21CA7017E177AD39BE95EEB47A", + "z": "AE588A1778CB917DD8D498BB81312F554D7352FF1D4FD651B54C6422", + "l": 1024, + "algorithmId": "1FC3832FA2D422195E319FC63A01C5B2" + }, + "fixedInfoPartyU": { + "partyId": "6B96D164A4CD0E37CB7FE94C3D3D672F", + "ephemeralData": "CAAD4A66AF6C01361598EEA07DC79DD398916CFD08880EEFE6B12260" + }, + "fixedInfoPartyV": { + "partyId": "7D4F34B45840C8A768B7B25FFBAC742F" + } + }, + { + "tcId": 2072, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF1CCFF3FB776DED4EBD1079FECC2D5C", + "z": "7967644338FBC8F646EF12EA12FCA6460B0CA1CBE8774D91B17F4B12", + "l": 1024, + "algorithmId": "5FB77BC33E1CB05EB702DAE655B20049" + }, + "fixedInfoPartyU": { + "partyId": "D833E4B60ECD06FC772C5C948EC40662", + "ephemeralData": "45E315847AE9777DDCC485FEE62C6D465049C9D5E0E01165704708B1" + }, + "fixedInfoPartyV": { + "partyId": "92BEAEE4F4FC081F5C923522951190E0" + } + }, + { + "tcId": 2073, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1048BC5F586ED4B30CC90C80ACA0959F", + "z": "AD04DEE7D839B69AF7996869143B55050C3E1804F94CF6A670757CD3", + "l": 1024, + "algorithmId": "E66E2B3975AEDAC79DE06282B8EAB0E4" + }, + "fixedInfoPartyU": { + "partyId": "67A8A649A93FFDB5BCA19E920A3D88F4", + "ephemeralData": "286B5F7EB3677A34DB7C059EF1C8889D431C755023F7EF59995E07BC" + }, + "fixedInfoPartyV": { + "partyId": "2841E745999B14A6D62A0AD10EF3AEF0", + "ephemeralData": "698A4BF15D92710E81A232CF83FA1BAB9F42988C2CA1AAB776751879" + } + }, + { + "tcId": 2074, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE41404C254A47F36A1D436043491F31", + "z": "31579979B8A41366F6940CF940A32548311D454BDF4AFEB78DFD359C", + "l": 1024, + "algorithmId": "A6A02E5B5DA2EC01487714794A0497FC" + }, + "fixedInfoPartyU": { + "partyId": "1AF76AD432EE133026C0A4AAC0FC51CA" + }, + "fixedInfoPartyV": { + "partyId": "A71D14459088974BAC3F2C09A4CD22EC", + "ephemeralData": "370C5E14BC25C08D89778D91891CFC21621EE50F7C65A4875C49FA15" + } + }, + { + "tcId": 2075, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2531D1FC4472807710B21258A5EA19B3", + "z": "FA810353F91882E1E94BA80152758C0B310D94FC2059B8B7BA7DB250", + "l": 1024, + "algorithmId": "2BF3CE87CF5917E0340EC87BF914050B" + }, + "fixedInfoPartyU": { + "partyId": "C4A9CAC0FA733851D47E34E60E37CA55" + }, + "fixedInfoPartyV": { + "partyId": "36B3668499CD44478654431F0AEB0480" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 84, + "testType": "AFT", + "tests": [ + { + "tcId": 2076, + "kdfParameter": { + "kdfType": "oneStep", + "t": "234B0BC78691A9C974C570FC40CCCD0D", + "z": "1235D9872837D53DCB6110552810EC3F4B73EF7E8C55F5EECC9196F1D2E4C5AA16", + "l": 1024, + "algorithmId": "5ABE5204E28C5E41A00DBAE19FB290D1" + }, + "fixedInfoPartyU": { + "partyId": "B94BE86F7A0E743B371B88DA8D59CC68", + "ephemeralData": "7E89545BE602E1ECD8D0B771E596B12342BF1444685E1C9419639AC0FB3B1F873B" + }, + "fixedInfoPartyV": { + "partyId": "F92FD3D9FFF3C02ABF0B6DD716524C0B", + "ephemeralData": "08B119FED1C3B0BBD6A6B56BA9C2F85DE09240BD7C98DF0E634ED0C9382399C52C" + } + }, + { + "tcId": 2077, + "kdfParameter": { + "kdfType": "oneStep", + "t": "614606A3343F45A9A17B3B9DFFA42087", + "z": "F4175E901B95987025F3DF80B938FCFA0CAA5440A8116075AC8EBE0B9DF3091AC1", + "l": 1024, + "algorithmId": "F41E1D2657C83A1D01C45ADB4111A02E" + }, + "fixedInfoPartyU": { + "partyId": "F168F969DA285316617B562B130B9566", + "ephemeralData": "A42F76BC18B72CA3D681A3E19649AB411C49171B7328732DCD163B41A80D09A927" + }, + "fixedInfoPartyV": { + "partyId": "1038A23807295EFDD053BEE60DB46986" + } + }, + { + "tcId": 2078, + "kdfParameter": { + "kdfType": "oneStep", + "t": "707AA172FC43B8368EA99A11C2517F28", + "z": "41E20F4F01255D8C4F0C06E70BF9B354F8993AA12FDA5760065D20055BE33730CA", + "l": 1024, + "algorithmId": "EC8C355C380DBC83814C44DD941BF8A6" + }, + "fixedInfoPartyU": { + "partyId": "7D955FCF43B0BBF35F2290A8FD2C6D9C", + "ephemeralData": "A7C72D7FC9552B179A90C4509B0E3392987550B65CFBA8CF942B29E26581EE1D04" + }, + "fixedInfoPartyV": { + "partyId": "6005966479C014D2038A37C0F3F14B57", + "ephemeralData": "F526803616033BC90AA85AD7815F6A0553E0A11562D3B74DE65D59B30E6F62CC37" + } + }, + { + "tcId": 2079, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46C319F9B0FC91D31C97FC53A65A834A", + "z": "F3F009831719FA70C4F70B78306D43BBAA3228B522D9453FABCD6E8B359D555827", + "l": 1024, + "algorithmId": "8A0C761B0830B609023313AACD8C5BF3" + }, + "fixedInfoPartyU": { + "partyId": "691DFABEB713FB8D15BF556F20C2E0E9", + "ephemeralData": "B0DC76063FF77CA25784663A1265D438E5553627B55591C4D85E4DAE1656D53D06" + }, + "fixedInfoPartyV": { + "partyId": "DCD3D7C02E9096C27532D39D1ACB7C4D" + } + }, + { + "tcId": 2080, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09B8A27C85DA5FF25FC31438FAE93701", + "z": "17489E6A90E2C189AE52550532830E3A5A30D14C0A8FDF6359486C1DADF51B9FB0", + "l": 1024, + "algorithmId": "529288FACE6ACFEB1AEF6B41B4E87166" + }, + "fixedInfoPartyU": { + "partyId": "8DA6543335D4A0A1CAE4A49D6D5A1E60" + }, + "fixedInfoPartyV": { + "partyId": "96C5EFB78A5B2446C94AAAD63594422A" + } + }, + { + "tcId": 2081, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D30D0A3019E5EFB75C19647AB868E2ED", + "z": "F597DA5B24842BC754F3B08A8524CBD968B6975EFB915CD0C2E522EEF7031860CC", + "l": 1024, + "algorithmId": "15E079DAB83B02A20B750974E2246D57" + }, + "fixedInfoPartyU": { + "partyId": "5858618807AAF583C0FE1DDC607AEB67" + }, + "fixedInfoPartyV": { + "partyId": "C5F567C09DC330AF25B0424EE83F56B1" + } + }, + { + "tcId": 2082, + "kdfParameter": { + "kdfType": "oneStep", + "t": "187B269FAB130A668DE95C0972870C15", + "z": "BDF524FD22C8BDBC78F61257CA0C45F2279906155E79D5C8D3732CDE25DF22F29D", + "l": 1024, + "algorithmId": "5760DA8B519E381CC3A935D2234A6252" + }, + "fixedInfoPartyU": { + "partyId": "04512F7086409F14DF363280B798B386", + "ephemeralData": "C36B8D086FD1B7B52C0FBFA6E26D61D8BCDFA4D550642168672CDF464E6EE1AD84" + }, + "fixedInfoPartyV": { + "partyId": "9CC9C47B14CA198AB86D374E147779A8" + } + }, + { + "tcId": 2083, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7700A88578C627CC660639DE689A5737", + "z": "0D1B5D8A93C6F2C8E500A8327EBB6D22768FAC11AB9339A82317C6AD56AFF395E9", + "l": 1024, + "algorithmId": "983C1D5A39E50DC3E30259EDBF2EEB3A" + }, + "fixedInfoPartyU": { + "partyId": "7BBBBA7300354582918A418D29C5506E" + }, + "fixedInfoPartyV": { + "partyId": "1E4B998400BB8ECAF3EDB6F8443B6302", + "ephemeralData": "E2E9ACFE90CEB3C336D79975C8DFF9875C4A360E720072EDFB2AE3E0E866E6C03D" + } + }, + { + "tcId": 2084, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2956E7CEFDC48922CAFADA1E4D5E13C6", + "z": "13BDA0A864D6CF01E67CE7D31C49056C0967F6F7E14A15A26077DF6D26515B67BF", + "l": 1024, + "algorithmId": "DBB8C15BDDEF6AA46EA6295FF2CCE157" + }, + "fixedInfoPartyU": { + "partyId": "932BE8B0C47CECE63459B56765F31EC5", + "ephemeralData": "42A41835B86AE73615ABB7A20102D81B365802B812099D246ADF80EB0C0CE161F3" + }, + "fixedInfoPartyV": { + "partyId": "7A34D42BBC90FC867333B806DB3EB507", + "ephemeralData": "F0B362E9EF27A57A8EA5622F7DC3020AC6F80C34261503D6F735A9505B9052CD7A" + } + }, + { + "tcId": 2085, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB99C82ABB30EE56CDC8CC1F3FF94F80", + "z": "84F2A6E1ED4C9F0AA5D349EA0F7BFBCAFCE93C0CCE36C8C7991EF3680B53E7A439", + "l": 1024, + "algorithmId": "C6E39756E26F1EBBD19C1D3AF5D76DA0" + }, + "fixedInfoPartyU": { + "partyId": "B149FF910357A5DA5C17BA8FB0B1A983", + "ephemeralData": "9A550A13CFF244341FE40F6C398A624AB1D521B831A7C901AE135A4FDB1ECD60BE" + }, + "fixedInfoPartyV": { + "partyId": "36EDA9B44DB9E19C575AA866254523A5" + } + }, + { + "tcId": 2086, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F769BDF11A03F7B68516E974F307298F", + "z": "8BE07FEF68FDA0C8A06C531358EE11A421A64B4076F03CB99F5DE7890AD8ACBCBC", + "l": 1024, + "algorithmId": "5D374C88B57DF49E700A6BF5564EB756" + }, + "fixedInfoPartyU": { + "partyId": "AC760F26ADBB53A94205525FA0CCF885" + }, + "fixedInfoPartyV": { + "partyId": "5B3AB0F5EAE941384069A99E7AAB4CF9", + "ephemeralData": "5281A3B3571C102760624EE7103532F60B5129B97ABE97BFAFAC0B52C1067F47F0" + } + }, + { + "tcId": 2087, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67DCA13604FAC6FE969C7A799A75E35D", + "z": "8F1FFAC3783EE36A09E7CA8ECDE83D26D2024EC71D336A1712B9622431E53F9487", + "l": 1024, + "algorithmId": "E9B8671B5E1F6BC131C77204E200A562" + }, + "fixedInfoPartyU": { + "partyId": "783779690F6187BC8039B8D22786D6B7", + "ephemeralData": "C6ACF1A0D868061067046E00DAC7F065A44B1C4F402340C6DC57C9F99AF4640F31" + }, + "fixedInfoPartyV": { + "partyId": "44377C5CF9F1F5D0BDDD1D9ABBEA9281" + } + }, + { + "tcId": 2088, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC400AB619224CCD3E5D14E8C8D6DAA9", + "z": "61746368EB5C9930918592D21409560ECDB2B7E1005274F73C9F787FBC9F047E8D", + "l": 1024, + "algorithmId": "FB263B4F2E6FA27F1A820EA8676FEE9A" + }, + "fixedInfoPartyU": { + "partyId": "94EC3D0A9FF08B3762293E8737D1A182" + }, + "fixedInfoPartyV": { + "partyId": "FF93D3B41BE58C0D7EECBAD837B3A84B" + } + }, + { + "tcId": 2089, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66D904FC7D42A18D5C3E05D35D2AD6D1", + "z": "2D1129341921B023F015DB02E2BEDEE95E3A7D53CB54890EFEDEDE9C45C5FB9EFA", + "l": 1024, + "algorithmId": "7B32873F1A78071626B25BC33E7F2E1A" + }, + "fixedInfoPartyU": { + "partyId": "243A90E97BC55E4CF835366D8BA12012" + }, + "fixedInfoPartyV": { + "partyId": "77E4C9C4BCEB21D5E5C2F7831B25131F", + "ephemeralData": "03E094873B491497A6DE288F12EC151511FD7593069916A496C6A9B2F1AEDB32B9" + } + }, + { + "tcId": 2090, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89E8B3619DE61496DE2346C92A5FDD98", + "z": "6B9549F293CF9C75708F005EFAD6AC7E29F190FA5DAA43815AEA54D23E9AADA1D3", + "l": 1024, + "algorithmId": "00C54A23C9455348AA9079E3335394D5" + }, + "fixedInfoPartyU": { + "partyId": "839C80780247D07589C6C22B9C81F5BC" + }, + "fixedInfoPartyV": { + "partyId": "AE3867568435C8291EA1748F1106E274", + "ephemeralData": "530F691E0490F9017DE0812D598E667E9E4B00F4F78DB98D844DE6BCFE550E04A0" + } + }, + { + "tcId": 2091, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8EC6D32473F12AF2FF485CF1A4D9C1BE", + "z": "6B2EF97FEAD958B4F1E1ACB9ED06B3749B95598B0C97187C6D8CF6AC02B491B141", + "l": 1024, + "algorithmId": "66649B7FBCE831021DF3DB044BB3393E" + }, + "fixedInfoPartyU": { + "partyId": "D167F3B14475374CCB1263AF09CD7B5A", + "ephemeralData": "07F1C1409D3781A13AA110EB8B8B10B12CEA82EEA21C534EC3AF0587A0C01FB0D8" + }, + "fixedInfoPartyV": { + "partyId": "F248AAAFBF15EC5AC7F3B9AB0F48A78F" + } + }, + { + "tcId": 2092, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2ECBBAF8361504B569DE57E54B173637", + "z": "A55710C6495B38DE6AB23ED1820C5FA62F89E9ADFCD8F772038278B596DF718040", + "l": 1024, + "algorithmId": "0DA0F94A44C8711209FD5F60ED48480A" + }, + "fixedInfoPartyU": { + "partyId": "1B076D065F734795BE8176C087C9049A" + }, + "fixedInfoPartyV": { + "partyId": "A0613D381C7DB775BF416EABBF5A5107" + } + }, + { + "tcId": 2093, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E249E1E0BB63871891D868550CA2648", + "z": "BD0E24BA27D1A62DB54898DFDD75AEEA680A1ADF8E3FD56A82C3E6D80861D770F7", + "l": 1024, + "algorithmId": "851335C68D78E1AD43C6DD0A17B7D2CF" + }, + "fixedInfoPartyU": { + "partyId": "1E91FADDB11BCE06406F7DB25D559529", + "ephemeralData": "B31432D7977D11D6353E6DB5ACC4496482C746C79C1432DBAB8FD81771AEF034A3" + }, + "fixedInfoPartyV": { + "partyId": "D5066A2B3DA106CE7D7DB80E1EEF177B" + } + }, + { + "tcId": 2094, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5E3DE6C18CEE388BE9BB6438061901E", + "z": "7C91785CF75AC47D0F4F5D244D9DDCCD074E1949B5231D93743DF8A4B0F80BEBC8", + "l": 1024, + "algorithmId": "EDA8BBDB84116070E575C53D4D3BAA05" + }, + "fixedInfoPartyU": { + "partyId": "C93F097898B00C23987A3CAFB0EFBC3C", + "ephemeralData": "90847496B7AC1729056190579E2A8D79A68B1A17459EDF32E9BB8EA48846029E11" + }, + "fixedInfoPartyV": { + "partyId": "96F4DDF99A0AC6F46018B4368FD94B77" + } + }, + { + "tcId": 2095, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73E90901F5D6E4D54199ADE965785B4A", + "z": "4F36AB1C21365B5F3703CB8FA55602F5060EF8EE63F8A004972FDBB682C46194CD", + "l": 1024, + "algorithmId": "285C5E0F9F673940AD11F81B30A1D1B1" + }, + "fixedInfoPartyU": { + "partyId": "EBE6DEA10DE4CD498094A597FC7AD1F3" + }, + "fixedInfoPartyV": { + "partyId": "69587B0DA55A228C5DC93ECD93070CEE", + "ephemeralData": "A38B523BDA39820A9EB19326BC2E9F2D594A748196F6E6C15BD66D506E117E1C6F" + } + }, + { + "tcId": 2096, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE4F82E058616F7DE690A53934506C61", + "z": "6FC4041257D58DA45E9C0FBD11856750621931863C2BDF24313D855D3FDB94D7AD", + "l": 1024, + "algorithmId": "C444D58D20D2BF47E46AB8440B8BEE42" + }, + "fixedInfoPartyU": { + "partyId": "3DF7AA64C6140313E604846941B67214" + }, + "fixedInfoPartyV": { + "partyId": "1A201EE6B0CF9A7CF7C7F0ACCA1B8FF5" + } + }, + { + "tcId": 2097, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE18F82664037D12478FBA5C5F4D4792", + "z": "B870ACBDAC863816D828DC69D065AB69DB97CAF18166960C8952FE59F130CC5FC1", + "l": 1024, + "algorithmId": "195D6EB5C441D068D322AF034A5E68E2" + }, + "fixedInfoPartyU": { + "partyId": "B320C629244FD5FB4938282DA1550373" + }, + "fixedInfoPartyV": { + "partyId": "265FCBA67721DB58A48357FEB24DBD89" + } + }, + { + "tcId": 2098, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1B2ED8130262C08398270CE734F24C1", + "z": "CCCEA87CFF9BF28E3B47D4012AC7F14B83C0CCBBEF6FB0B17BB94AEFE923699079", + "l": 1024, + "algorithmId": "506FC3DC87987EBC2AAD25C8FAC8BDB8" + }, + "fixedInfoPartyU": { + "partyId": "604D4A12C01DF895D9D1674C5A4C0DA7" + }, + "fixedInfoPartyV": { + "partyId": "E208FEBAAEFD5AE721BB78C6EBFC36AD", + "ephemeralData": "DE14F9DB2AD40D65399094E0E1D272CF983BA4442987B70895ED1FE3366580AD48" + } + }, + { + "tcId": 2099, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5A1E4D4403D0D552C49A13DF9FDF1914", + "z": "E0727A969804A970CC5C8B9E949D3B0435D3954B4250962C411FADF196947739DB", + "l": 1024, + "algorithmId": "9C292F4DA1BEFEC0BF9A68D9FC34666F" + }, + "fixedInfoPartyU": { + "partyId": "3F07814A7CB25DC06B220694B714C663" + }, + "fixedInfoPartyV": { + "partyId": "24B1AB86A94826C81BAE3CC581123FCD", + "ephemeralData": "5801B239C2D9DFCC9B668A9D5F603BC99BC4A2EE81DFD841D43119FEA11B8184DE" + } + }, + { + "tcId": 2100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1D0F953F61B846992C4F8B0AFE151CF", + "z": "FFE4ACD4DB2058CB24E2B9486F75208AD1ED35F622A55ACE6C367CEF30CB61F983", + "l": 1024, + "algorithmId": "EE6F70C38C3AD0DD00CAF7A4C15DE9DB" + }, + "fixedInfoPartyU": { + "partyId": "4E72701E9EE143ABD4DFBEA30EC90948" + }, + "fixedInfoPartyV": { + "partyId": "7622975B5C9765A67E403A825AD8C924", + "ephemeralData": "28BFAB4F784758FC8F89CFC6A40BE3AFADD1E55A0644D705C4A040CC2DDE6BEDD9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 85, + "testType": "AFT", + "tests": [ + { + "tcId": 2101, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53E19285A00F26B38F5755AA7B9546DB", + "z": "476BF1B9E4AB16202A1D41653E36F89D90B2297DAB710086E81AF29763", + "l": 1024, + "algorithmId": "6DADE95D980D3B94F86A5692A4483C01" + }, + "fixedInfoPartyU": { + "partyId": "2B2CCF2445548593F6C535BA590172CA" + }, + "fixedInfoPartyV": { + "partyId": "94952F3546804229C3512062D82E15FE" + } + }, + { + "tcId": 2102, + "kdfParameter": { + "kdfType": "oneStep", + "t": "947421C38AE16D2DB7B3D72380A4C266", + "z": "0A3CB04EE89096AA5AE3CB657C8CD1108652600F4D1A7B30355DF00E2E", + "l": 1024, + "algorithmId": "7B87A59B14A85B4FAC75EBAADE059C68" + }, + "fixedInfoPartyU": { + "partyId": "771333894635452AB58CE614E72EE9EA", + "ephemeralData": "9C962052D7442A716B312662103F80E7745F78833A90555D0E559C1D31" + }, + "fixedInfoPartyV": { + "partyId": "1462DA56D98BDCB59F921C87198277D0", + "ephemeralData": "589A865B9FEDCAED45F50C69F4BF3DBC7E57F3BFF645EDD07907B55DB5" + } + }, + { + "tcId": 2103, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D60202C8FF2124D5107376476E3BF58", + "z": "ED2859FF452BC26F6EDEC40F33A2C7F47DDD7AF0EF44C8487040E23798", + "l": 1024, + "algorithmId": "8CC16E171234643697FCDF3BA7504D62" + }, + "fixedInfoPartyU": { + "partyId": "BC73869EF60F1C818CE079B604156A6D", + "ephemeralData": "E7B5F2B216E77BC7D964868257A0EE70FAB775280F815C1D5B504A58D3" + }, + "fixedInfoPartyV": { + "partyId": "6B51A682B94C119CDD012C1C6E4EE9D0" + } + }, + { + "tcId": 2104, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F3B9A1F06F545FDBB3F7789A92A150D0", + "z": "BAC61D6ADA1D3CDB249078C9C5DB65800A221CA513C137BA43DC460EBA", + "l": 1024, + "algorithmId": "5C17C9C9740C3F4D9DBC0F25F91DD195" + }, + "fixedInfoPartyU": { + "partyId": "5CF47EE01916193A83BBBA1985ABAC4C", + "ephemeralData": "7762B08A58AAC5F19C70F8C606719CD80228D1DECE282827AA79F95BA8" + }, + "fixedInfoPartyV": { + "partyId": "E9DC4A5C8285A141CCC2C204C1475C44" + } + }, + { + "tcId": 2105, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7E80DA008478C1BD0EDF7AA71C0BB33", + "z": "563C0504A3FFE1FBCB8C4F4CCF71E264FD761CB447A15128A78B1C2ECD", + "l": 1024, + "algorithmId": "71E6B0077879D8C04DE99DC920D490F6" + }, + "fixedInfoPartyU": { + "partyId": "DAF52A1F690BCA5B94D9AAD1F0B2ACE0" + }, + "fixedInfoPartyV": { + "partyId": "1422A2E81D4CD1DC5BBE5338D5AAB6D2" + } + }, + { + "tcId": 2106, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DDC39C29485DB679403E4C45C25B11B", + "z": "6B47DCC1CB4A22A83FEF9E4FC37F393371FD727FD3784D8FEE1A99A2BB", + "l": 1024, + "algorithmId": "62B78EF1260C3A5EB555F1224455CF2E" + }, + "fixedInfoPartyU": { + "partyId": "714489AD638B739CF44E6B9E5E25F2C1" + }, + "fixedInfoPartyV": { + "partyId": "06B32D4F4F80122DED9B73D106A13422" + } + }, + { + "tcId": 2107, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C1ACF2EE3CC32863B0274714C8FD6FE", + "z": "9FE4E1688C1B75197417C47CD650D2250A52667A6BBAC3B9C6E6C0042A", + "l": 1024, + "algorithmId": "26B818CF194D9B207C316B1668A38F90" + }, + "fixedInfoPartyU": { + "partyId": "0EF6E1D513445FD157CAEE4180514E4D", + "ephemeralData": "047F1C05F80736C9D1152B1D1BDED85E59A48E1097020BB20C7C5F6130" + }, + "fixedInfoPartyV": { + "partyId": "3CDDA97E459B4023848037DD0D7E389F", + "ephemeralData": "CF90DDF85A57277C960FD8F7FE8B950783582A66DEF9CBC3B9346C0078" + } + }, + { + "tcId": 2108, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BCBE42D5E3217C94F1A8281FFD17934D", + "z": "74AA59EB6C3DDDF70D3FFD5BBE8BA0041A709F38E06D6DE957F37C3AAB", + "l": 1024, + "algorithmId": "4306BA5D85BDBB081DBF9626EEDC1565" + }, + "fixedInfoPartyU": { + "partyId": "89E61CAA2564EB133E22D901FCC647DB" + }, + "fixedInfoPartyV": { + "partyId": "C28F6C863F5DB4AF7E44792596DB8FD7" + } + }, + { + "tcId": 2109, + "kdfParameter": { + "kdfType": "oneStep", + "t": "55D9066B9AD55A6F1CF1AAF0F01139E4", + "z": "B00C7230F15679DD83F35866266958927B0E42E0B22B04BCB248BDCCC1", + "l": 1024, + "algorithmId": "6EFA9F948DC06A769BA68566E14DE301" + }, + "fixedInfoPartyU": { + "partyId": "670F3EE53427BCB2E1C7CC6B916F300C", + "ephemeralData": "BE30A9748891C5107CD3B0A67BF74A81576653E3D1E5AE04736B01DDA0" + }, + "fixedInfoPartyV": { + "partyId": "73E899ABC02B99440A95900EEF699E9D" + } + }, + { + "tcId": 2110, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3BB4D5BA9060ED17B9ECF32D1C04718", + "z": "04C86F8AE0AA2002CA54A84AA4A025432A9A21182329223616C4690762", + "l": 1024, + "algorithmId": "932136052B5F11C6E5510BD640057F79" + }, + "fixedInfoPartyU": { + "partyId": "AD1AAD9724E27C5CCDFDC97C56798AA7" + }, + "fixedInfoPartyV": { + "partyId": "5AC78BE3BEE7601967A5110465E98D50", + "ephemeralData": "0F156862EED478A29EDEE239DCFD0554322FC6CD48D3277AAE44A88E7C" + } + }, + { + "tcId": 2111, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA26FE814015DEC1BCD2C8CC04BE490D", + "z": "DAA4E247720918AC4DEE92D5593BEFC1E864BD8814D44362A96337D1DA", + "l": 1024, + "algorithmId": "185EC533B6F8A030245DF083A30344D1" + }, + "fixedInfoPartyU": { + "partyId": "0B44EFEA06AB6EFB8D61DB2D7931A31D", + "ephemeralData": "E7E7675EAE8EE6BBEA8BE5F7F99E7F62F02EB92E7D386BABE7D9EEFFD3" + }, + "fixedInfoPartyV": { + "partyId": "A7ACB041C5F73500B6E27404FDD3BC63", + "ephemeralData": "C5EDC2F8E79DEEEB31E5711A508444892B60191782805EF7F1682B0C0A" + } + }, + { + "tcId": 2112, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79395BA34ED46A16741473ECD9EA4318", + "z": "446CAD5F659D0C1396EE3C0F4BE18A283E23803BD3669DF30ABD0023F5", + "l": 1024, + "algorithmId": "DC1DC70F45BA7D635AD719D7C3D47911" + }, + "fixedInfoPartyU": { + "partyId": "F3B10584A624D25FC7EB4F414407B688", + "ephemeralData": "48173DEC199ED9FCDF78844A213046AB586217E2E24B1F9403F3E0ED36" + }, + "fixedInfoPartyV": { + "partyId": "D46C5EF8E82185508CC02973AA5B0D12" + } + }, + { + "tcId": 2113, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE14F28700081944B5470B4CC223CAAE", + "z": "67E130B59DB36A347B4CA93E6DB84BA3D9B6DBF76683BF741648417F6D", + "l": 1024, + "algorithmId": "C74BD4202E16694106B46FFB746BE4BF" + }, + "fixedInfoPartyU": { + "partyId": "30545BA00B39B10392A0C137544F7EB3" + }, + "fixedInfoPartyV": { + "partyId": "DD4360AB8D153862C74949934FCDA0DC" + } + }, + { + "tcId": 2114, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8D11E9534A156CCA306189F014F02AC6", + "z": "2E89E877D97E05EB321FC11214DB6249B6FFF527A31E78B0B792AF26C5", + "l": 1024, + "algorithmId": "7F858A1BD9B4EF3F07A943F6B2A73B08" + }, + "fixedInfoPartyU": { + "partyId": "94C871D2B116C7F3DBF41426DD55B45E" + }, + "fixedInfoPartyV": { + "partyId": "EEC840B83021D95BF22741363A09817A" + } + }, + { + "tcId": 2115, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FD943E0498337EF4806F7B028E60A05", + "z": "7C893369945155CA8EA5F742E6317B1E4F63F1F0555D2B233CD1134B76", + "l": 1024, + "algorithmId": "FF1CD4F2B3C170D99330FFC122B19B49" + }, + "fixedInfoPartyU": { + "partyId": "06C0D288DEE2C24AC1A63D519795B3E7", + "ephemeralData": "C7157F9C70D5E1FECB5B3C6EE1A1EFD33DC2F6ABE0334B9E6251BBD0F8" + }, + "fixedInfoPartyV": { + "partyId": "B09170644A15842ACE6271F14A94F706" + } + }, + { + "tcId": 2116, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA33F00FF7E51CEBFFAA325E861713AA", + "z": "2CF99D01CA557BFCD45109C4F6BE448B1461A0761B6B4752532A286F3E", + "l": 1024, + "algorithmId": "3A0AC6DF1F14E9237742121689017487" + }, + "fixedInfoPartyU": { + "partyId": "92E86AACCB57E7DF9E70E01AB632684B" + }, + "fixedInfoPartyV": { + "partyId": "4EB55160D3F44125E1E74A0127D860EB" + } + }, + { + "tcId": 2117, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29795B73B39D4871C28F9D3F96B111FC", + "z": "60417C2342200C05C594C5806CB8C76C5AE4402271F1BD9F45D0B13A0D", + "l": 1024, + "algorithmId": "48B58C1EA0C089E4E68AFD89EDE6D2BD" + }, + "fixedInfoPartyU": { + "partyId": "5C1D25BF535C02E4DAE49297108872D6", + "ephemeralData": "41687E87DDE2D9C3D3B7AF9A917C23228D912E0863E496F247E5810467" + }, + "fixedInfoPartyV": { + "partyId": "B68A342CF27F8F7BC077BC97C3EEE006" + } + }, + { + "tcId": 2118, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF91D02585A0C5835CF38EDD2C38E0E3", + "z": "75BC3B303DD79911AA68B2436AF943982F0886E169E8AEC98DE2F55251", + "l": 1024, + "algorithmId": "76F0281F4BFE973A33931582BE8D3066" + }, + "fixedInfoPartyU": { + "partyId": "08FCC24F3119E90E33CDFA3F056A0E0D" + }, + "fixedInfoPartyV": { + "partyId": "F28E5CA41DB93F14291DE11BA782EB2D", + "ephemeralData": "1614BA2BDC4C2CF2CE39500353CF9D4E5B36995A5BC5769DEF031CD35C" + } + }, + { + "tcId": 2119, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F7F46AE89AA82352F6B288E059C4189", + "z": "6EF291DF7F7FC8EF3F0C1DAA5635915B98F26C1C17B21F88586E01BAFF", + "l": 1024, + "algorithmId": "B80979275E5C9853DA101874C70FEAA8" + }, + "fixedInfoPartyU": { + "partyId": "BC71EEE92101609B776C5EFD190D2C86" + }, + "fixedInfoPartyV": { + "partyId": "2DF678EE82F2101F7228033374F0D996" + } + }, + { + "tcId": 2120, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E2281AD10D0FCCAB1FB6153B1E220D9", + "z": "B85B8871AD9502846D05C3C23B3C80908403D86BF3A5C311AB6EE0B320", + "l": 1024, + "algorithmId": "DC4D8F89DD2325EA3D1888575323A8F6" + }, + "fixedInfoPartyU": { + "partyId": "88E7BD3D5CC730DFAFD6BCB402699007", + "ephemeralData": "A8FB915C8DAAD3CF016EDBECED678839C14BB19C001DBDEAD4937B3A2D" + }, + "fixedInfoPartyV": { + "partyId": "2420B3E4ACA53224E04E44B50C1AC730" + } + }, + { + "tcId": 2121, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0E4925E17A1AF9B7E54DDCCF4F3899D", + "z": "407AA304FE606B872D7365B76C6C5C0644D5AF2FB9F8B83DEBD39F742D", + "l": 1024, + "algorithmId": "C69EC5FEEC8F0E167F84E1293E82523E" + }, + "fixedInfoPartyU": { + "partyId": "2E9D3AFBD15FDACA2689BF9F2984206C" + }, + "fixedInfoPartyV": { + "partyId": "3D9AE6D43E08A6C2702DA6AA34529539", + "ephemeralData": "E78018DCB85779C20B280ECB7F32CE4C32A205DCA145D347A5AC2A0E4C" + } + }, + { + "tcId": 2122, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD3582E8D9BAE8D366EACB0876BEBC27", + "z": "301E9F43C4979AC4ED3FACE8F0C1FEC9B15F194560E1842D0F0AEBC29C", + "l": 1024, + "algorithmId": "ED0D9C791B1F4698F338EB0673AAAE63" + }, + "fixedInfoPartyU": { + "partyId": "B2C215DC38FADD02B1B67E6210160B5E" + }, + "fixedInfoPartyV": { + "partyId": "658DCB455328D8CFF6D500E8F9E90AB5", + "ephemeralData": "5E8EA6931A410A763734948E3AE5D8AE1007B20AEE10484B4E4E023A02" + } + }, + { + "tcId": 2123, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08D8F9E7418C2CCE1C75AFC3D559F80A", + "z": "5AF1F88317576164F87628F75FDDE63675536C3CF9D28F60136D2CC322", + "l": 1024, + "algorithmId": "19C0012A1D62B7382457E61EC79F8D07" + }, + "fixedInfoPartyU": { + "partyId": "4287DB8669A90553D567FB59DE3F3D16", + "ephemeralData": "0C7EF10C077F3B1C752DFFE2789D688F55D462BD1062D0EFE1AE4697A6" + }, + "fixedInfoPartyV": { + "partyId": "043D487B6F4D35ABAB60DCF515D98871", + "ephemeralData": "BEB1ADCDF207B260BE88349F5551FDD4A7C75C8AAC1587F90ECB4176FD" + } + }, + { + "tcId": 2124, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E543C17C0AE549B8DF9999EAA4AA1E1", + "z": "AF3425D2D56A2EBF43F08DE4DC2BAC0DD1F9F3C7777EC64479D7D9F8D3", + "l": 1024, + "algorithmId": "D81B8AA0BE5E7FBD804C5E88C15FCE04" + }, + "fixedInfoPartyU": { + "partyId": "A6D733CCDB9C5F43B0A7EB102A81688B", + "ephemeralData": "15F185987A0422C1CE715EEBCE921EA7026FC9130B64AE32E483A88DBB" + }, + "fixedInfoPartyV": { + "partyId": "DDD705C6D335A62C8B9716D5C3578C76", + "ephemeralData": "9E2844A10686902CAB7287944EBDAD4C08A36BFA30357947FE497EB741" + } + }, + { + "tcId": 2125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C9EE69063C5D1A48581E4B8BCD4D002", + "z": "F591D059A521AC18978EF6E0CA6E764AACEF622F2E52AFD33816E5B4CA", + "l": 1024, + "algorithmId": "075716DA411339117A2CBA6275DE2606" + }, + "fixedInfoPartyU": { + "partyId": "82898D81202FCE41312577A69B2BEAC9" + }, + "fixedInfoPartyV": { + "partyId": "1E02DF70C308B2D510F0AF99565A5AD8", + "ephemeralData": "6D1CC5D18B3A3B309E377680139F238B156DC612883D51D20654364465" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 86, + "testType": "AFT", + "tests": [ + { + "tcId": 2126, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4009D79798299795783363B62B1EC84", + "z": "8CC3652E66341655AE86B6B4C3724EFE4C3FB9AF85AE2387FC71BE7087A6", + "l": 1024, + "algorithmId": "44B610FE83140537880646FEA8BDB84C" + }, + "fixedInfoPartyU": { + "partyId": "C986B6B48E6587D3F8A076DC2004990F", + "ephemeralData": "F9F7502CF07AAD886F1FB41676215F21CD0A895932F86E4AE8B506349A2C" + }, + "fixedInfoPartyV": { + "partyId": "6E4644E4B2BAB059868FCB024E6B909E" + } + }, + { + "tcId": 2127, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F03AC248F9ACE3F7AB496417063DADE", + "z": "7491F5211AC36C7F15677CCE48C5F3E40D170D617B880252A6A1A4B9D499", + "l": 1024, + "algorithmId": "80A85A59A28453F943042CC360947803" + }, + "fixedInfoPartyU": { + "partyId": "A735C5E8608737DF03A1840915504D1F", + "ephemeralData": "2D06F49768C2525F0302BD145C14705C8486E14C55830886DDDCC9A7E932" + }, + "fixedInfoPartyV": { + "partyId": "22542F860CC96F42AAEA0BEFB71C37B9" + } + }, + { + "tcId": 2128, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A635AD21E8B356DAB7319EEBB6332EE", + "z": "A431B8B1BD33DFBECD9B2EE7B0B139F50D3E5DBCB077E54BC21AE2D548E9", + "l": 1024, + "algorithmId": "746C7523DABCEE9B1AC2BCEE1E69A6F9" + }, + "fixedInfoPartyU": { + "partyId": "155D3E437DE62C5A8A9FDBF0418A4048" + }, + "fixedInfoPartyV": { + "partyId": "B493115CAFF68A1BDE3573226D52405F", + "ephemeralData": "FDDBA950D56354CD2636DF7751511D827F891D47BB562699191CFCD37B67" + } + }, + { + "tcId": 2129, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2867BCC9657C8666CD4CF6FB7343D147", + "z": "DC5ABAAD7ED74297BFD7C217E7E230CD519F83261BBDF3ABF37571521900", + "l": 1024, + "algorithmId": "B598452E044815470041D741134C2339" + }, + "fixedInfoPartyU": { + "partyId": "C8CFDFB64F26543F26F2140420AE8A37" + }, + "fixedInfoPartyV": { + "partyId": "98F045F69A10824050A5A5E1834CB814", + "ephemeralData": "498CE192C3CF09E455580E0198500E72B809879BC3A7BB3EB94D7ED59CE4" + } + }, + { + "tcId": 2130, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73110CB87238C0C15A7F81EBBB81AB2A", + "z": "83D5F88106DADADA138D9E6D644212E91DFE65DAEBE5EEBA21E34F17EB41", + "l": 1024, + "algorithmId": "799D246BEE309180C9F60EB842615A5B" + }, + "fixedInfoPartyU": { + "partyId": "1AA6FFD593F008954E0C80ADBC807410" + }, + "fixedInfoPartyV": { + "partyId": "18C2A0DD743D102EE6739E543026D7A3", + "ephemeralData": "B7D9CE6F7ED60DD5BC53AF20DDAAC033DB3DF9AD64CEF406697042E566DB" + } + }, + { + "tcId": 2131, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B510D798D77E7A3BC0A885F92B19A9CE", + "z": "76AD98C401F66D9AE53C8151282B84C87D7497742EF56D48D639876AFF33", + "l": 1024, + "algorithmId": "2A7CA3F1BA7B779D7D4E2B12FFC29EF2" + }, + "fixedInfoPartyU": { + "partyId": "1111CB36AB60F7F1F438F287C666C5E5", + "ephemeralData": "AE91205A36364BD6F6AE30AE497EC0B0123791FD644E788F8570ACF9B1BD" + }, + "fixedInfoPartyV": { + "partyId": "633B8D394ED74074CAB3E706B6E55CCE" + } + }, + { + "tcId": 2132, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B180312D249D7BD76105C76A4325EE8F", + "z": "E220C7392EEA02B37685C2E03067706C13920A3DB1463E9F1B8F34988A5C", + "l": 1024, + "algorithmId": "C43568F50BB26DB7C107BD42118FF0C9" + }, + "fixedInfoPartyU": { + "partyId": "FB8AB9FDE64F733500D06AAF01ED8693" + }, + "fixedInfoPartyV": { + "partyId": "1ED8E1604995D7E52BBD50FDBD2D0FC4", + "ephemeralData": "D4B73A92C9D52F359625F3B7755FEF78FA799F736CFB669F0263911DB61D" + } + }, + { + "tcId": 2133, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4745FA08773E9C3D320E641115E6673", + "z": "5AC296FED68D79FE75277EB3342438A1A4D49D7DA3666B36E3F35F028356", + "l": 1024, + "algorithmId": "3AB9F684B5F1A7DBB3E2367FC2A9AE5F" + }, + "fixedInfoPartyU": { + "partyId": "82699EAAF330904659F3005E1C327C12", + "ephemeralData": "CB344E23EECB44A046B76B01900CA89FE51DD28985E0ADF6AC6C633B481E" + }, + "fixedInfoPartyV": { + "partyId": "866A7B7E6F3CD0A6F7874EDFD70A1060", + "ephemeralData": "C7482E31EA1421510545C879241579A8887E97F6A7D84717680D9E4A90AA" + } + }, + { + "tcId": 2134, + "kdfParameter": { + "kdfType": "oneStep", + "t": "108820EE892857D170E618E32FF11244", + "z": "2E34FAA30EDF731904851BEB6356F223CC324B9985F7D9201976F88B8315", + "l": 1024, + "algorithmId": "E0C3E24C892F3DA766B75D52757FC68B" + }, + "fixedInfoPartyU": { + "partyId": "9B7E5E3718F12A69CB57C8741EB58778", + "ephemeralData": "CC6C29C0FA8B9B5A581496120DC9A426766819176A118B6D358A32363404" + }, + "fixedInfoPartyV": { + "partyId": "B13F5E62924852EDFBFEC59ED043F4BA", + "ephemeralData": "F5814EBF20CDA660D797D523AF441E437490A69ADAAC29056C506D73CBB4" + } + }, + { + "tcId": 2135, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9FD481CC8CC36E5834AEA677EDB6BF2", + "z": "183F951E0C76BCD7DAB5FB5A8C94B67F33A0C42905195F0782307EFB0531", + "l": 1024, + "algorithmId": "D2308E4026644E797CE00CCB048FC0A7" + }, + "fixedInfoPartyU": { + "partyId": "85C161647B6470A2B1933AF56B503060" + }, + "fixedInfoPartyV": { + "partyId": "1F726324083E2D564302EE903315B6B2", + "ephemeralData": "7DA8540D9E274D41CFE429DE6C29F0FB75753996EAE9E322443D3574F8A4" + } + }, + { + "tcId": 2136, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67F9D35E5786D073B34A8C73F68597F1", + "z": "3DF89E29168AD272A9AE4304485469F3AEDB8797CE6C4424CF1D718C11F4", + "l": 1024, + "algorithmId": "3605301A0B2C7019C3947E6F9DCAD45F" + }, + "fixedInfoPartyU": { + "partyId": "C3F5A4894173221994A40817C4774664" + }, + "fixedInfoPartyV": { + "partyId": "4C85A606E6B99F4AB9B5CE16021DDDC5", + "ephemeralData": "12ADEA69CC0BC1774D3BDBC1633EC7DDCE206DD0E22EC0C5EA971610516A" + } + }, + { + "tcId": 2137, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D70F5615F550E0DF0F7B7B7DF3FB10A0", + "z": "652485898E90289B2E0A84D8B8F6907AFBDE850F695403C816388A3E2496", + "l": 1024, + "algorithmId": "1A476FEE0A25FEA3AF5A7566689E0CA4" + }, + "fixedInfoPartyU": { + "partyId": "F66C149FF74789E1BC31CA734EEE4D9A", + "ephemeralData": "8E123C4ED6395FB0888F96C2CEEEDE428CA9FA158967CD8B7D5DFEC065E3" + }, + "fixedInfoPartyV": { + "partyId": "C21B410C8163CF3D66641FA65D9ABC87", + "ephemeralData": "7B0E33F291887923E64C605901D8BA4E2F86C561B45BA15FA945B11904FD" + } + }, + { + "tcId": 2138, + "kdfParameter": { + "kdfType": "oneStep", + "t": "748DFBB3F6C3024D78E7A45448A77E1B", + "z": "F54D91ECF8A51F1844E9592F7E529FC12F22D2C45E400275FDB3B713CB36", + "l": 1024, + "algorithmId": "1ADED0AACCFAD7934AEB119439718DC4" + }, + "fixedInfoPartyU": { + "partyId": "14DFF608A5091D6726BCDF96864A9797", + "ephemeralData": "3C444F11162BE2E2989C882CC64AB4E311BA11F3B2F18A33CC34A323401D" + }, + "fixedInfoPartyV": { + "partyId": "14C82DA5FC16CB62512A51CEA3903F21", + "ephemeralData": "F3A0726164F98A92431681B390B546E3BA1E78415E85B98CB32FBDF1260B" + } + }, + { + "tcId": 2139, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AECA203B5E2EDF3466DC3735028BCAC", + "z": "BC4816FACB7B630633D09DA2A1C03E823F66D2F28405B67E245689F87E23", + "l": 1024, + "algorithmId": "98011DAC9FD28D2AE3722B04EE12E927" + }, + "fixedInfoPartyU": { + "partyId": "9BD0EF4B713E884277242E7B88A187E0", + "ephemeralData": "E85E5F1A5F481953C4DD316AA4486D672A8A0D9477F0794EFF61F4A46BB4" + }, + "fixedInfoPartyV": { + "partyId": "6A8FB68B0E53887EC8A4AB45ECE09317", + "ephemeralData": "38CFDEE22580C9BBE49E2D015F071AEEE501AB8A17F0016A654B0204D75D" + } + }, + { + "tcId": 2140, + "kdfParameter": { + "kdfType": "oneStep", + "t": "381DCF47EEE17B952DE2880FC8C2EF8A", + "z": "B69BE140DE024BF41A83231020177B3240059FBD1B5CE716AEEDF633BB17", + "l": 1024, + "algorithmId": "D62CD4C9496AE409E2A47C5CD60BE4D4" + }, + "fixedInfoPartyU": { + "partyId": "43CBF46BDBD8DBE935A00D3131C63A9A" + }, + "fixedInfoPartyV": { + "partyId": "4C356D0FF4E8C7FDB5FABE26D7664954" + } + }, + { + "tcId": 2141, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A96D08C8773D1DC9648B786F915F223", + "z": "FE01FEE3756EA271CAA72C8C076FD48F6479A8D772D1B1785E473B30FDC9", + "l": 1024, + "algorithmId": "8FD082FC135FA1A2D08574CFBF0BB759" + }, + "fixedInfoPartyU": { + "partyId": "A0DF1428637AC4479451FF49150BD144" + }, + "fixedInfoPartyV": { + "partyId": "B0797BD2CD8E8BFEA3694484189E4178", + "ephemeralData": "74C7C2744B71A18DC0E562BC6A58CEC25DA244B2C8C0DA82901A649D052D" + } + }, + { + "tcId": 2142, + "kdfParameter": { + "kdfType": "oneStep", + "t": "114B55D415D9867CE55207C1E20BE637", + "z": "7757EB4D359E714D335C7CB7F535E60C1CCF971CF87822C065ABDCCFC412", + "l": 1024, + "algorithmId": "DE43BC92C112A2C0048C3172CA1AF079" + }, + "fixedInfoPartyU": { + "partyId": "BAEAC969E825D13267EDCEAF01566A30", + "ephemeralData": "CA7357E5C2CDF83E6DCD40B1C701CBD517753D5D76DEB4CE9DDEE0F37A5F" + }, + "fixedInfoPartyV": { + "partyId": "299057D14C87CC51976471EE1FE48784" + } + }, + { + "tcId": 2143, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27A01C8E7AEACF869B32D56AC39ABDBF", + "z": "0A23662F31C6B1396FE405DDAB4AAF303D78FF98E4BDA7C54B03C8F89347", + "l": 1024, + "algorithmId": "6E6165D26184AAF422840E35B5CCF886" + }, + "fixedInfoPartyU": { + "partyId": "323D8605F3F8736A996C3F1A5C09D793", + "ephemeralData": "6AF10D6A41B042F1231BF5C050B3845E1CD2024759D7429A3EE2303B9E48" + }, + "fixedInfoPartyV": { + "partyId": "9624E642196E99B1DAE7C8E60D9373B3", + "ephemeralData": "E00186269FD89C9536C46ED4A56D518DD4A17FF8AC25073C7D35526F9956" + } + }, + { + "tcId": 2144, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B218D265D13BFA3406265A98AD5F905C", + "z": "47CE4B7996A539B6AE11F0EC0AFDA8F910545C197B15B05D571EC938F69A", + "l": 1024, + "algorithmId": "7785ABC8D3D250BFC6190A45AE9CCB94" + }, + "fixedInfoPartyU": { + "partyId": "C9401D98AE320459BC72D2392038ED61", + "ephemeralData": "1662BDE7B1413526D634232C1ACDE212DD8823FE40EBA128E65AD4930124" + }, + "fixedInfoPartyV": { + "partyId": "9874914D7E100707733A4A55E5DBF999" + } + }, + { + "tcId": 2145, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82E9807B0692267ECE71CD7D6B214E4F", + "z": "13CFD2E6B3D81E9CD5D9058C1D012061A36F0972D8D8589B907D385A6E53", + "l": 1024, + "algorithmId": "E283CEFFFF4A148D331961F865814AEC" + }, + "fixedInfoPartyU": { + "partyId": "685AA592C8B3BF644A7491ABC72A0CB8" + }, + "fixedInfoPartyV": { + "partyId": "89C8A9CA5F3CD17EA9E4F45D0572C4DA", + "ephemeralData": "9AEA37C02D1E46185A0E5D0E0C5470C3F7421151CCB9B6ACD0F8A7DE6520" + } + }, + { + "tcId": 2146, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9352731D22ACEDF06D66795F5937ABF0", + "z": "F17B6E0DD27EA490B0A84D8399371054FA48713079B3B89A74C415FE89BF", + "l": 1024, + "algorithmId": "B7E9EC20BAF4D9FE8014285BFE40E41D" + }, + "fixedInfoPartyU": { + "partyId": "F448E5A67F107BF2D4ED96FA60878A62", + "ephemeralData": "0A293C08A66222BDFFE8EAA616C13C2C67F29759F90FEB04EF84EB9B98F5" + }, + "fixedInfoPartyV": { + "partyId": "3C949CEB74839ADE05DFD518AD895CAA" + } + }, + { + "tcId": 2147, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0C947997EAD419CD51BBF0B91730A92", + "z": "C43494D4F3375BF249354642A266155AF026500DE1DAA0A91854F49F584B", + "l": 1024, + "algorithmId": "C0EEB8CB46B826436F42E2D670C9531B" + }, + "fixedInfoPartyU": { + "partyId": "CAB229B7D360796CF91873FBC85DFBD5" + }, + "fixedInfoPartyV": { + "partyId": "6C154360BC446501BA8304F71798E7AB" + } + }, + { + "tcId": 2148, + "kdfParameter": { + "kdfType": "oneStep", + "t": "279755A65B205700B5D63DB1262E1C15", + "z": "184C090FED0FDB22702483990BC54BE2B65195CFF3E4F8F75DEC66ED1E24", + "l": 1024, + "algorithmId": "BB7DB3C973FA502028746D600FA2E519" + }, + "fixedInfoPartyU": { + "partyId": "406DBD423524B7CF17C5AA4ED3B8CB81" + }, + "fixedInfoPartyV": { + "partyId": "ABEE4EFE5711FBB30213BC9A96D57449", + "ephemeralData": "D0C0B4AF9AD0A40FE7827795C589CE6E652EEE5FE13BAE8637687DDC0471" + } + }, + { + "tcId": 2149, + "kdfParameter": { + "kdfType": "oneStep", + "t": "563DCB30058AD48A92D4DA5FCA4EA3E9", + "z": "21B02D61960ADDC94C0C2C2BE0DEDE22EEFE18F5B45A3EE3A2C8858FCAC1", + "l": 1024, + "algorithmId": "342BBB0C06572E0290263A01EC28DFB7" + }, + "fixedInfoPartyU": { + "partyId": "BCE4AA6F10BF476BA62B424500F03660", + "ephemeralData": "DCFB6DE37438B2DFA9FE27BF53398DB640327AB200744A10A04F26ABB19B" + }, + "fixedInfoPartyV": { + "partyId": "2B7842D0B6DF9610FA047BC6024EF81E" + } + }, + { + "tcId": 2150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA738A239782A26139792D9A50385D80", + "z": "C474835EEFBD48064A4F0741BBCD256BABBF76B0176DE66DD8F953088929", + "l": 1024, + "algorithmId": "CFBBEF3A109E2036E45CF726C0283775" + }, + "fixedInfoPartyU": { + "partyId": "037D83E252F0A8D667E6B1E7E4ADACC1", + "ephemeralData": "68FD1799E5653FBAC4DBC90355A971E9790A95C083DE6A6C4867CA5D37B6" + }, + "fixedInfoPartyV": { + "partyId": "D1252D0879416359F9174BA875B9CB82", + "ephemeralData": "BC6187A0FCAF5A9DD195DCF500766C54AF82651E7DF19E3A792D38E0062E" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 87, + "testType": "AFT", + "tests": [ + { + "tcId": 2151, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8DB75EA99356C47FB5D5C286BDE64F5", + "z": "42A47EE23D39C8F76C97BFD8335E4BF561950344C251BD42122C36CF", + "l": 1024, + "algorithmId": "B392A2EDB6D024D5EC1E30AEEC7A409A" + }, + "fixedInfoPartyU": { + "partyId": "24271B1338708076B6E6E8485F0185FA", + "ephemeralData": "4E57BDA8640D183601BEC80F19C32FEEFD07F06EDE2BC0020DFC06FC" + }, + "fixedInfoPartyV": { + "partyId": "F7DA80D6C4F834A778E67614A1DC595F", + "ephemeralData": "CFDB714B4877E86614157FDD69456598F8E390236853031EAD5187B8" + } + }, + { + "tcId": 2152, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A4D0286E68BE5FD95D39D34BBC12779", + "z": "86803F01A46EBDF400F4129E87C64EE9D442CF77447E3BB3F8789A76", + "l": 1024, + "algorithmId": "72C6727790DE363693E00A6B7DD4D541" + }, + "fixedInfoPartyU": { + "partyId": "65437CA83DBFCDF9DC1A44E8340DF97F" + }, + "fixedInfoPartyV": { + "partyId": "BB73F7D42CB8A64D0E7448041EAEABFF" + } + }, + { + "tcId": 2153, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB4BA3EA727DE35072731223D6C0C049", + "z": "D42BC8BA46870B933FF7C60EF46AFC598D7633B9E1A7EF34A210C93B", + "l": 1024, + "algorithmId": "59B9AE48E074B63D731607B77C3B2E58" + }, + "fixedInfoPartyU": { + "partyId": "F01DDE195924179D7EA5C96B9989A38A", + "ephemeralData": "A1F756EB568F22DCA91557D3C36BE7CA4130180BAC236388795419E5" + }, + "fixedInfoPartyV": { + "partyId": "B15FED663F015BD7AFD5AA96EEB4269D", + "ephemeralData": "5578ECBC121FAA4263E40E816C328DFD89C3BE4707874596B92FD33D" + } + }, + { + "tcId": 2154, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2906F719F3C1B47D57D24863A1C6DA27", + "z": "C8F0F024901243A529608159751364202166E88128728135A791B63F", + "l": 1024, + "algorithmId": "E0B2EB2E2B8AC741C88CBC7C6D48F7D8" + }, + "fixedInfoPartyU": { + "partyId": "7B1F9D68A6AA0B5A77EB61C14AAF99FA" + }, + "fixedInfoPartyV": { + "partyId": "90458200A3FC83DC9698994BA01836B1", + "ephemeralData": "EFDEE5B41600AE27D8B973AE972407C1BAD64E1B9B78BF5F1B38E82E" + } + }, + { + "tcId": 2155, + "kdfParameter": { + "kdfType": "oneStep", + "t": "30EB8E916F04789FC57D267BF9BEBE32", + "z": "AB045FCD58822B4EC1E2A8F9FB7CE1B38D6FA4AFC99CD1528B7C53C2", + "l": 1024, + "algorithmId": "E6F729B41E982E334708F724A3244B7E" + }, + "fixedInfoPartyU": { + "partyId": "D749F42261946CAC615B6742A4B698F2", + "ephemeralData": "138D4F1B854C4ACAEE16D6F0CCF2BD24D096E12AACE87508FCBD11F0" + }, + "fixedInfoPartyV": { + "partyId": "8518F8CD23EAAF464EDDA1ABE1599F81", + "ephemeralData": "EC4185A4DF8325B5878A2AD4E8B9E038C5A6ECE9331E3194A1AF8790" + } + }, + { + "tcId": 2156, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F0F8A5F9D5907FD0A29158BCFB4B3BF", + "z": "524AFDADAC7811E0D37CD486C95A32D4A2BD70B4E7B7B46DBB449636", + "l": 1024, + "algorithmId": "758ECE4BAB53EC547B612D5A4808D7C1" + }, + "fixedInfoPartyU": { + "partyId": "1B1ACCFC0A08D289B57543DDC91CC3D4", + "ephemeralData": "CBB33FA5BD91C4F354F013646A700E981D242F3B0E8B1790ACCA3587" + }, + "fixedInfoPartyV": { + "partyId": "14A2BB90AB44A580C825555CF614D672" + } + }, + { + "tcId": 2157, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D22132D5345A985EA2BC874973799CAE", + "z": "CE385A024AC93A60C1B2FFDBBC639D2A57ED7A7A21764930B4C1DA55", + "l": 1024, + "algorithmId": "A7F383F23FAD94AA65F91B6797FCBFD2" + }, + "fixedInfoPartyU": { + "partyId": "CEF9572664763FC117EADA737890C5C0" + }, + "fixedInfoPartyV": { + "partyId": "11D6B177111B725F80D5599E35C07764", + "ephemeralData": "CF6813F7BB6B229977E29DB0FA40089B4E889BFA4BB34FE475E9B460" + } + }, + { + "tcId": 2158, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B4C15FA77C05791CEA821D74095B736", + "z": "169B97E66F8FBA9B408A2DAEFD9D0DD95815CB465A69E40571B3A49E", + "l": 1024, + "algorithmId": "264A34DC6BB3CCCF8D70396D2C658F90" + }, + "fixedInfoPartyU": { + "partyId": "0BFA3B4E5220D88137CCA780BA93F979", + "ephemeralData": "0CD57C654031D75B384CE053486E8B4314E46F0B8BCDC9C2BA84F450" + }, + "fixedInfoPartyV": { + "partyId": "38752EC530B65B17A2966384BF60F237" + } + }, + { + "tcId": 2159, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88A61A5812493F5BABBDC6D732A18C4F", + "z": "C1B6CD6F29AF136D13B384FFB3D3A331746B1393FD36307E62405CB1", + "l": 1024, + "algorithmId": "E3086DC93D7F311CDBB9100111792CEF" + }, + "fixedInfoPartyU": { + "partyId": "C39EA4551E65A62D6D8BF68A0282A7C6", + "ephemeralData": "1F588565173BE96891EB367579B0F216AD9D1B9366D312966CB87A49" + }, + "fixedInfoPartyV": { + "partyId": "DBF79CAF943054FE5326CEEB74C9BE94", + "ephemeralData": "06217B5DCC48C22951D4D1B4BA1107A03F5FF232B26DE0A4B4B316BF" + } + }, + { + "tcId": 2160, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82E92EEC96E5DF1A4AC380EB7B4A5F4E", + "z": "4FBB6B1E5AD2CC09590970F7394F7DDF9F615168819228B173486116", + "l": 1024, + "algorithmId": "9FAB385FD7AD1063C0A1C22ED6B6E2DB" + }, + "fixedInfoPartyU": { + "partyId": "9A13C8CC26ED37F0FDC12B2734D30ADD" + }, + "fixedInfoPartyV": { + "partyId": "6D4554ED8E49798F247B9FAB8F9D6A24", + "ephemeralData": "78B2980F576B31C01E00FA3C38B9408CE382BF4952BCB3772D7E5DA4" + } + }, + { + "tcId": 2161, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A4786856CBB220DD5877AE9F13CB3B3E", + "z": "416435756EBCCF5C1F6F17C4A2A9747F150924332BC48C4A1010DFF8", + "l": 1024, + "algorithmId": "7BFB98F870CEE2F08AC69C61428DEC1C" + }, + "fixedInfoPartyU": { + "partyId": "7BE09F76B230EA8719782A6A8733FAE9" + }, + "fixedInfoPartyV": { + "partyId": "27159BA222294758F83E07107769D861", + "ephemeralData": "4EE2118FF4F2D8C9FB5C13C941EEBDA8BDE7D91A8FFC55AB81F13842" + } + }, + { + "tcId": 2162, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A45E402AB2F09772AAD449E23889B669", + "z": "0FFDD128F5B33F8677E867D0230BFCB11B25E9533A843DC613F38E25", + "l": 1024, + "algorithmId": "F8DC2218CE3EE8857E562DA6707CFC3E" + }, + "fixedInfoPartyU": { + "partyId": "F8E44F312C32C82E8AA89A894454A43D" + }, + "fixedInfoPartyV": { + "partyId": "3FF5EBFEDAE51DE757C2E1CC8B76F8B9" + } + }, + { + "tcId": 2163, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA5A12A92520B65C7D395645A149F502", + "z": "E8FF5E31A7DBE483E56BB38B4F83B626B81148480BB03A3736A6CDCF", + "l": 1024, + "algorithmId": "D3836B5A0F8C9F462C95269E5BDC6BFE" + }, + "fixedInfoPartyU": { + "partyId": "FC593E45C89B4DC58C3FB24534827006" + }, + "fixedInfoPartyV": { + "partyId": "3BD804FEF1EB5774A6F59AD032A55681" + } + }, + { + "tcId": 2164, + "kdfParameter": { + "kdfType": "oneStep", + "t": "318346DF2218EFD8445E4E32F9BA1B34", + "z": "101ABD9D68B6E5946569D2AFB6D8E1424AE66BC6F3247401C131AAE4", + "l": 1024, + "algorithmId": "228F1EE64FF125983E0BF6FFF301FCB7" + }, + "fixedInfoPartyU": { + "partyId": "C733C6F7BF20CDEC3C6BBFA2515EE8DD" + }, + "fixedInfoPartyV": { + "partyId": "5A4424C8F3FE9D1EDD0C726117F70213" + } + }, + { + "tcId": 2165, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5844BFD5838401C50400F22601F0B7B", + "z": "5D0945356591B6EABBDB631DC924CEDFD1EC57141EEC057CBC6412C7", + "l": 1024, + "algorithmId": "0236D68FEA447B46C078579D25957675" + }, + "fixedInfoPartyU": { + "partyId": "CA4B011F76857A717C228FF7FBC21F1F", + "ephemeralData": "DEA357A8AB50DAF095F4FE8EFB3687FF8111CAC870993B6F1C4D716F" + }, + "fixedInfoPartyV": { + "partyId": "C42E8A29E4B041BBD4C641C66AE99C64", + "ephemeralData": "4E4D3F62C1BDBAA6E12C0CBB971774A2219532355702907A4FF372FA" + } + }, + { + "tcId": 2166, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12B8EBEB35797988E0D58523934E736F", + "z": "923DBEFA5304AAB657B75BD08D7BECD26A6000056EB072EEC4C14B54", + "l": 1024, + "algorithmId": "6D8B246A1C3CEE507D37370CC59ED0D8" + }, + "fixedInfoPartyU": { + "partyId": "228EE0C3FD7FC7631FC72A36649201BE" + }, + "fixedInfoPartyV": { + "partyId": "352FC96E46AA5B60348F65EBFE9C0E6A", + "ephemeralData": "1DCED530029CD294A0AF902EE11BD693B9DC082A5C24A733FC6E03B0" + } + }, + { + "tcId": 2167, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5E652E3C92BE4C9D92CD76AAF0A7302", + "z": "F756CB24A273401E95D6F729A8908438B1078BE92BA28A78CFE90B0C", + "l": 1024, + "algorithmId": "20A3A0091AC5B37E9FAB54DC20A5517A" + }, + "fixedInfoPartyU": { + "partyId": "DFC6DFD077A7D3B6FD0DD0CC2CBCE228" + }, + "fixedInfoPartyV": { + "partyId": "33ACAB4798CCD6517BEC9F825445A07B", + "ephemeralData": "41F97BB1CF43A5A3112AA8D294793FC45F4F55F2927668E4DACF0602" + } + }, + { + "tcId": 2168, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C8A80E8E55F639A99833CA3C098A8E", + "z": "D87D9744E36D8DC8F0E8EEA41AF337DFBD1378ED72AFAB8297DA1E49", + "l": 1024, + "algorithmId": "3BDAF36E89ED7A04E60465CFB640DC17" + }, + "fixedInfoPartyU": { + "partyId": "524F97DBE2B842194F40C8B15CD77610" + }, + "fixedInfoPartyV": { + "partyId": "2DEB52F6B1BB5BD8BF20E93B0201CADB", + "ephemeralData": "846CD99CB78CD5D57BCC69C31A3E311405356200A4F7160BB7A07762" + } + }, + { + "tcId": 2169, + "kdfParameter": { + "kdfType": "oneStep", + "t": "75E412627D77E080A89FCFADD018F393", + "z": "1B66AE8D260D5A986B06B9FB2794061CEB58A1142C20520B2C5B5DD9", + "l": 1024, + "algorithmId": "2D4C1CB5B6345A67E3E9BDFBE6562CF5" + }, + "fixedInfoPartyU": { + "partyId": "0CBBECD2412120C057DDBE7555816B45" + }, + "fixedInfoPartyV": { + "partyId": "EC5C9F35507EDD780CA8814F4B7A8BB3" + } + }, + { + "tcId": 2170, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50626AF53DD86C3308D9FAB74C441A73", + "z": "A11C000632DC709F8B232DAF982BFD4CC97B811DE857FA6FF25D0BCE", + "l": 1024, + "algorithmId": "B7683FBA9044B52B1B1E780E5009E02D" + }, + "fixedInfoPartyU": { + "partyId": "362F5CC3784775E2AEC2F353C025E19F" + }, + "fixedInfoPartyV": { + "partyId": "DD6EEC2B2F5DB1D647C78D404036BC10", + "ephemeralData": "64417D795D535F61E644F6B3A54142C8AAE639B67C3B5875BB5B3C48" + } + }, + { + "tcId": 2171, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3D1C5518C256C45C0B841F547F3425D", + "z": "407A2CFB7B19DFA1BBACFF7BADF1DBD8381D7BAB2F98D41CD287704B", + "l": 1024, + "algorithmId": "5918711F00D5CDFBA0ED65ACC0EDB4BD" + }, + "fixedInfoPartyU": { + "partyId": "799CC4A9893D45EAAFB432FC354E613F" + }, + "fixedInfoPartyV": { + "partyId": "59EFD70B566C0115195211777B6AE780", + "ephemeralData": "4831E61CFB4FC8C410447B56A042DD1123C135C34126A63CE72D4AEF" + } + }, + { + "tcId": 2172, + "kdfParameter": { + "kdfType": "oneStep", + "t": "682900C25C07228202750352978C1C9D", + "z": "217825F962EE62EF9431F915E242F211DC85B8629F1B542D832D356E", + "l": 1024, + "algorithmId": "4990C1CE3897F50FC0DC2543FA286E65" + }, + "fixedInfoPartyU": { + "partyId": "9A34ED01491C0C9399C92ECB0FFD7F1E", + "ephemeralData": "DD084EA929E31075BBE381F9DB078ACB460C7895CEC94725DF8FF098" + }, + "fixedInfoPartyV": { + "partyId": "B536413438F941E83560E4542D0293E8" + } + }, + { + "tcId": 2173, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E960158B83A74DE49E603054FA4B572B", + "z": "0204ECA4689625C578014B9F037A387210E680326F9D64ADCD255C86", + "l": 1024, + "algorithmId": "93B38AE05AE1CAF1CAA5DC4FE98B0499" + }, + "fixedInfoPartyU": { + "partyId": "D3C7DBB9C7E6E66483D4F86ADB3F2134", + "ephemeralData": "64B99FF76379A60A40103A9B60C029BDC56023E71440E4A3D2AC2C4F" + }, + "fixedInfoPartyV": { + "partyId": "D582C7FF3D903057C0551FC25DE9BF3A", + "ephemeralData": "A96B0800D39D02033A28D9DB2B04DB48B2A83F93B7A11E6626BDA7BE" + } + }, + { + "tcId": 2174, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F664C18930006A5E1FA97EF652C65DFD", + "z": "B7CE44493707CBE2CF92E1891756D00567B20EEA71D95C46A8556242", + "l": 1024, + "algorithmId": "345D0C09EC8151F548EB9B222D63F2B5" + }, + "fixedInfoPartyU": { + "partyId": "E8685484A1EDB5B6A7AA8AEC33BEBA9B", + "ephemeralData": "F4D360AE267A7B7F4F30D6218D025E1E5A7613952EA7A7E8138D1941" + }, + "fixedInfoPartyV": { + "partyId": "7657041612B2A3412A086B1E638E4BF1", + "ephemeralData": "237D4CD756B23B1385493DB3D48765679FC54C98387E6214EB56984C" + } + }, + { + "tcId": 2175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8B2A33B9BD0ED50A8148B18A326DA15", + "z": "FA6DDFFEF2CA0D2791EC80D3C8F09BF7B2795870984552343052072F", + "l": 1024, + "algorithmId": "0DAA61B384B642CE8E0F58E7BE88137E" + }, + "fixedInfoPartyU": { + "partyId": "C0338E94C3D97A0EAB54FD8F2B527488", + "ephemeralData": "A759B94546FA224E05FC104BE45531603D229021B7BAC708FCB5B162" + }, + "fixedInfoPartyV": { + "partyId": "6C6E7397AC7FFDB82E9CE00ADA99FC29" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 88, + "testType": "AFT", + "tests": [ + { + "tcId": 2176, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B3020FF2B50E1909914273FE3B9C838", + "z": "A0CAD4A87EEF94C4C157EABD4D49D0F53F8100FE8CACFB2F44FF1BA7BDAC9945DC8DEEB2", + "l": 1024, + "algorithmId": "3581AC8F7D0FD89EEEC015A3E784D175" + }, + "fixedInfoPartyU": { + "partyId": "FE2CC435946AD027243CFC1B9FF0A41F", + "ephemeralData": "8EB7DFF067FF8BC280EC252593F924E210596C0B305B9C812C12F8EB425A1F3FA5E246F0" + }, + "fixedInfoPartyV": { + "partyId": "582A640E34A6F729032F5D9685DFFBE8" + } + }, + { + "tcId": 2177, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7C93E291A002790CE2FD86D82F67AA2", + "z": "86FDCD349F1E73131F0A891E3E78098A9D4E0BA1C75A2F79797CE7CCCA9F2427EADD8FDE", + "l": 1024, + "algorithmId": "49F09015DCC4FDDE478E14479B584D16" + }, + "fixedInfoPartyU": { + "partyId": "1E7939CD6154B65B85B52CDA7D2106B2", + "ephemeralData": "6008AF00FAD952A93468E2F2545EC3D1E99A14D331AC45DCC958B780199ECB9E17D56C2B" + }, + "fixedInfoPartyV": { + "partyId": "24F92FA8717FBC5C745963833A146E28" + } + }, + { + "tcId": 2178, + "kdfParameter": { + "kdfType": "oneStep", + "t": "494D9E90757AD3D982880E43056ED705", + "z": "0DE2DB1486E67C52EC783CAA38B1680CC23BF9E27B38DD59619178E9E5F21AD02170678C", + "l": 1024, + "algorithmId": "E5A9EA756F24622477F1CDC051BF3247" + }, + "fixedInfoPartyU": { + "partyId": "9793FE9BFC29267CCA1C88E4EA148779" + }, + "fixedInfoPartyV": { + "partyId": "FA7D4D0B926D9206A2937737B6233C8B" + } + }, + { + "tcId": 2179, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F853CE3D1EEB7C883C03138582882AF", + "z": "703678F198591502DA20226C569B65E86E048E80ED3CE978BF809317386B4CA58866B422", + "l": 1024, + "algorithmId": "0766142459F877D43CE6F091E8A52D87" + }, + "fixedInfoPartyU": { + "partyId": "5451007ADF0A01B0A541F0176362DEAE" + }, + "fixedInfoPartyV": { + "partyId": "B3FFCDE83A0235912C831B1018BD9616" + } + }, + { + "tcId": 2180, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B0169FA034544195DBCC8011F8B486F", + "z": "0109BD9A6EC8CC38114A9FF913D85BC8E6C7F5849749C64CF2A49D4428DC902E48DEB3BF", + "l": 1024, + "algorithmId": "5C20B7B4C9089CD7C2D07D5664FCB6DC" + }, + "fixedInfoPartyU": { + "partyId": "047FAEFB5311CA2363DA626CDF2ED8D9" + }, + "fixedInfoPartyV": { + "partyId": "BC8F5736D578F0CA458E4ECADB64831A" + } + }, + { + "tcId": 2181, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3837114D006EB9D8FA1D8CB8AD524896", + "z": "943197E78DE4A306E196E519728018F81CE89A5E8855BE0A02CC66D7CABDEDE6BF556B94", + "l": 1024, + "algorithmId": "FE5C92FFC5CF1E9E31A3749A6FDF37FF" + }, + "fixedInfoPartyU": { + "partyId": "B2A1E66319EF1AC051D5888BA8179D3C", + "ephemeralData": "57CC6431021F7D7DF5FEB22E4270913F83C14BC18D731A3E8234C4DB5601A5E2EA7B3F1A" + }, + "fixedInfoPartyV": { + "partyId": "9BA28C7B0081CFA0C3AF5215F85AA9B5", + "ephemeralData": "7A022284DAF17AFE305EA2ACE1ED6EC9F118D71C4DDA5032A45ED90BA630BC38CF89E92E" + } + }, + { + "tcId": 2182, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50B5738A40D22D1232533D28B10E80E0", + "z": "60BEB1051A936F71FDB5BE0ABB78B3E35298BC1391E3880F9810DE0C2EE9509EB8A90DDB", + "l": 1024, + "algorithmId": "A1B9F06E9902BA8D1DB0432BC8F05EF8" + }, + "fixedInfoPartyU": { + "partyId": "CD2D404A8A22BB2C4AA4E09690020046", + "ephemeralData": "44A33FC54230B22B9B4F8E2D0F03BC07BA124A82CA5D92F54A9DBCEC9AE0ADEE95276D62" + }, + "fixedInfoPartyV": { + "partyId": "F5C8BFC52837FF0723A9F6225358CB97", + "ephemeralData": "6BB2273AEA6BD526572E08DF121197BEF2B63319EFB6855A8C3A6F445D5F67176AA6D413" + } + }, + { + "tcId": 2183, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43EC211213CA3C3E45BE392F216F9AAC", + "z": "25244BB1C7FD941547C39481241AE5B1052BEB04F1D30E772406B85B1626DE1C9F653916", + "l": 1024, + "algorithmId": "03D71A5E3A8E9EE910A7E08301DA3F5D" + }, + "fixedInfoPartyU": { + "partyId": "270ED8682FCD9A3376C55974CEE638B5", + "ephemeralData": "B9CBD1D6853DDE93C7E7F0A32058905D04CC3CAEE92C723EBAC700DF1A871D411E3092E6" + }, + "fixedInfoPartyV": { + "partyId": "9CBA45A128F4BCFE5895B35F1A7406F3" + } + }, + { + "tcId": 2184, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06BAE492F282AD2BD4A9B9DE2869753C", + "z": "226F4F74C4785874805F3E2F00386C9E8F19CC56E9207EDE84368BBD50DDBF5FAAA29DF3", + "l": 1024, + "algorithmId": "73BC86BF63552FA80A4AF72E8A13D8BA" + }, + "fixedInfoPartyU": { + "partyId": "C69B998DACF62582536B18987C1411E4" + }, + "fixedInfoPartyV": { + "partyId": "0F8F0F721365DB5C60207BA16586672A" + } + }, + { + "tcId": 2185, + "kdfParameter": { + "kdfType": "oneStep", + "t": "375FCCDD1A5F5B9D7D21F3F73544CD8D", + "z": "E3F9FD17583DFD13CFA6FE680797F8B586C73F51C86C35FE37FA81244DF91EDF07611D38", + "l": 1024, + "algorithmId": "C9E6D100323576251B18732B447B8AFB" + }, + "fixedInfoPartyU": { + "partyId": "9EC996EF687FEAF97611F7D46EEADE70" + }, + "fixedInfoPartyV": { + "partyId": "3B011FA14326392978E19E5A854082D8", + "ephemeralData": "563D662D7DCA5732EABEAAF6083F155DB97A3F549E347DE03D7E7E0E21E6BDB258557258" + } + }, + { + "tcId": 2186, + "kdfParameter": { + "kdfType": "oneStep", + "t": "240C89CFE5F5F16D0C7D8381434DBCF6", + "z": "D1C67CC69AC2D18DF36635FEA0C504B504302EDAE88CF1DD08EA8DBE60A05A3808711497", + "l": 1024, + "algorithmId": "95D417E55DA0D22491B682E5D4417C24" + }, + "fixedInfoPartyU": { + "partyId": "A00A0C657B2E7599F384ED1C9B5DCBA6" + }, + "fixedInfoPartyV": { + "partyId": "2B61414FCBEDD3ACF30309D04E926E07", + "ephemeralData": "FBC9AA50CC334A2897196FA85AC1D582330DBE4121C6808EEB078907D280C8E894D10F42" + } + }, + { + "tcId": 2187, + "kdfParameter": { + "kdfType": "oneStep", + "t": "121A1992731615CD96CAD1E2E89D9E28", + "z": "3BC1D9B32F727F376408D881A9003F71AC0EE7070C21747FAC635F78A3CEC92E3F5C2A15", + "l": 1024, + "algorithmId": "6C2CEA65D6ECCE4905F34E79D66F4B7A" + }, + "fixedInfoPartyU": { + "partyId": "AB6C0AF359171D6D8270F9D05E3DED8D", + "ephemeralData": "384523C7122D70AFC0633B7DCE77DCAFAA1A7FE6B2A5F934EDF86B6AC056BEB329D5A16D" + }, + "fixedInfoPartyV": { + "partyId": "8A0DA671243995788D669EE72EDA11EC" + } + }, + { + "tcId": 2188, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA9EA82CCF7AC2153029BCA837AB6CEF", + "z": "5CCEBF45594C43E15CD2FD689DA41549D2D475E6798D11E455B3FA841E2473D28EE81C5E", + "l": 1024, + "algorithmId": "B6D4A9792C99E40279135B1EE82D9159" + }, + "fixedInfoPartyU": { + "partyId": "B6E80134044CD408AEB28D477BE345C0" + }, + "fixedInfoPartyV": { + "partyId": "42250F59AD403DC8A1D5264B784890CC", + "ephemeralData": "474803C127C4AF00714F7EDA0E1F75E3862E7985965BDF27CEB09494F563BC8A5892A1B8" + } + }, + { + "tcId": 2189, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D6F21599FE82B9DFA408924B30F2B68", + "z": "559288E67BD0DAE183B35BD88DAB7A0CDE8353E93F211EC51BBB88CD616F37906D7DB7F0", + "l": 1024, + "algorithmId": "163A350D83A5569C2979C9AE51561816" + }, + "fixedInfoPartyU": { + "partyId": "05B5A80A7E3524CE9CE6ADBB3186CDB8" + }, + "fixedInfoPartyV": { + "partyId": "8C3D3440B7F280EC833495F00B761090", + "ephemeralData": "98223EF1F8F08EE4F32CCFAE5137C8491C7755DCCB2538793526B3BF0F945E2351CD1C86" + } + }, + { + "tcId": 2190, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63084F3F01E856E97511C2EBA5D4C66D", + "z": "269B9608461A76C3AF401B4A3E66E538E003702970914F6C8C51D36266E50EB3C8C6C0A2", + "l": 1024, + "algorithmId": "B31025E63EF911955A77AB0629915B00" + }, + "fixedInfoPartyU": { + "partyId": "CFD878C59A09857117426EE05F00485F", + "ephemeralData": "6CE1FA4B9E4BEAA612C5CD4EA2CAFFA370E1106BB4D6830BB8EBA236CD987D8859BC2A27" + }, + "fixedInfoPartyV": { + "partyId": "6759E63201665E57CCAA9167CAD7CCDE" + } + }, + { + "tcId": 2191, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5781B8EB060158891471612571D06E79", + "z": "05ACA41E9A8739560DE6ECEAA1E1E30454C1A62696E81F42FD815AC71D08AEB9E69FE94E", + "l": 1024, + "algorithmId": "E56682EEFBFBA052733F57666F015C03" + }, + "fixedInfoPartyU": { + "partyId": "45E06B6F6AD274DFCAAAB365CA2C7FE3" + }, + "fixedInfoPartyV": { + "partyId": "729DDEE7D38EC6FAC8CCFBFD086B522D", + "ephemeralData": "39B88CF73495F8F71CEC6B025F84E5FC4152F0A44258EB9D7B1A76C1163851EEF779A6B2" + } + }, + { + "tcId": 2192, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB4BB0320D5040DDD235226B879C1974", + "z": "0E5D52A6569E6D2809FDD0DE5401F1907DF25EB2A3791A122443301754FDCB9C91D7D1FA", + "l": 1024, + "algorithmId": "3153B3DF572EF106D17A794ADBA21376" + }, + "fixedInfoPartyU": { + "partyId": "D45BADC6C3BF10DF3A70481BA894C2DC" + }, + "fixedInfoPartyV": { + "partyId": "BCC07EEC92A92BF4CDCCB383D0084BCD", + "ephemeralData": "6AE65B06FF92F2A8C71C27DAC80E583D5407D898CA127B423A10CD75C680476149C9F0C6" + } + }, + { + "tcId": 2193, + "kdfParameter": { + "kdfType": "oneStep", + "t": "965394678D5EB2D4E516362934C7AB1E", + "z": "E29DC58931407279E1DC7F7E2A25629457CAC268F4349AF9CCDBDBF76FB2760254C4A6F7", + "l": 1024, + "algorithmId": "795F9E89945BDCC5A700D893B1649560" + }, + "fixedInfoPartyU": { + "partyId": "A4256A7D39EB4A5A4D3D57F8A7770ADA", + "ephemeralData": "C48D689C4D0E63A39434CFD7253D5F234B5D1A52FD3443A99A84F6D19982D59A819501FB" + }, + "fixedInfoPartyV": { + "partyId": "502B3CB707B0B3B861260DF4343F6108", + "ephemeralData": "C24386BE3767DC2C1F246CDC38155728DAF0F46FB541FE36E76EF6EEA1CAAA6FC39CA558" + } + }, + { + "tcId": 2194, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7481FBC2323C7A91624FEEE938EF946A", + "z": "E0ABB51343A9236926E9B740AF17058C75B48CAC47F71ECCD37AAA04A84264C3782239DE", + "l": 1024, + "algorithmId": "855DB6198A29943E6C55A5A17A19909D" + }, + "fixedInfoPartyU": { + "partyId": "3585F58372957C743E34475206C2E494" + }, + "fixedInfoPartyV": { + "partyId": "7317C03600E13F1B7B0C387322D9E80B", + "ephemeralData": "BE426BFF7DBB3D3E5307378BB6AC20BED2CC08FD749D74A37621C43BD8D04523AECAC7B3" + } + }, + { + "tcId": 2195, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C8CE683816632584CCE2E5A066ED4DC", + "z": "DBA63396BF42EABF9B60A3B470E504B92CB52D51598741734F76FE2AA1EC6305307D52E3", + "l": 1024, + "algorithmId": "B3675E2D8A4022A5C56C25CDB9EF829F" + }, + "fixedInfoPartyU": { + "partyId": "55300DAA17D97EB75BDBCDE778AD36E0" + }, + "fixedInfoPartyV": { + "partyId": "9A3FB9B7BC3FE25102627C0C6CDF5260" + } + }, + { + "tcId": 2196, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28488CD4548B1EA686B3076C9B2A4921", + "z": "3AE53C804428002F6B2A78378ECB7134CA9BDEC66520F928C8B81FA765D84DE624E72D97", + "l": 1024, + "algorithmId": "46FA27687D64C9D1FD55BB8AD0FFEB95" + }, + "fixedInfoPartyU": { + "partyId": "F58E26FDAC5EEB4E4CF4C471D35FD540", + "ephemeralData": "4701523271096D7D1A4B3F7E7C6F58C87EF025E514EC4774F7A6366C236EEC586226F47E" + }, + "fixedInfoPartyV": { + "partyId": "01189871A4D9554D8E05AFF1E9E7D8BE" + } + }, + { + "tcId": 2197, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E39D97F637C24BEC8029433811721810", + "z": "8F164943B1BF6055004BB28DF1A91016C80C1484155D82637775620BEAA23C5EE8975E44", + "l": 1024, + "algorithmId": "CFF17BED5B2DE149B598174C3832B634" + }, + "fixedInfoPartyU": { + "partyId": "E1B3ACEE691CB1CED5068876D47109E4", + "ephemeralData": "7C6E25DDACA811E295DB22D30A8E5238A37B31CD6C1A34C3A3AB95A1F0AB5AA6B534CDD5" + }, + "fixedInfoPartyV": { + "partyId": "7B21FD027D0A325BF2D4E3C5AE3DDAE2" + } + }, + { + "tcId": 2198, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B7C74202ACB05E7008ABA4D6EAB28F53", + "z": "EBA70B26D7B8FF411167FFD33EDCCBB24B3B8600BE5CC624CFE0097543E12A503A7FBFA7", + "l": 1024, + "algorithmId": "DF8DB3AA4FC2ED1ABAACF16FD7077FE3" + }, + "fixedInfoPartyU": { + "partyId": "7BABF101A9E4DCC4CC746FAD298E5333" + }, + "fixedInfoPartyV": { + "partyId": "1F18A808517501CFC2516741E2DB057B", + "ephemeralData": "FE669089CB33BB7BFF6DDE663DECF208CB06ABD13C534F0FBE1BF77A1057429D12F7AD8B" + } + }, + { + "tcId": 2199, + "kdfParameter": { + "kdfType": "oneStep", + "t": "974B92DCC86EEC89036E384178D8351E", + "z": "9359E59895B169C7E2D4798460B2F9301E3C1799BDB5F13FD649038F70FFF98F959CD1A2", + "l": 1024, + "algorithmId": "687F0365FC7DE4278D3236CE5D7CF298" + }, + "fixedInfoPartyU": { + "partyId": "C42EB13698C398EE3EE9683624D9E966", + "ephemeralData": "7E6B3FEC3B16AC3BB6EB72740FC8E7183EB05622975A3DB45225A81C2515113B1FA9672D" + }, + "fixedInfoPartyV": { + "partyId": "5A1400695B39EBC3BF19FFC3D72B74AF", + "ephemeralData": "0266BEBB983B4D9039884C08CE187BD92BADE7DBD27565E99270E95F26C8AA999F453D85" + } + }, + { + "tcId": 2200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD97D427BCD9782517D1AFBB3C265012", + "z": "3C19D2EF67CE642DEA3A53B71C9879B163B71DC5CDD1271F4D192EEB3BD793F9427A5198", + "l": 1024, + "algorithmId": "66AD928DB280873CF5200662606A88CC" + }, + "fixedInfoPartyU": { + "partyId": "0AF60BA7FEF783958D51EA797E6D6A18" + }, + "fixedInfoPartyV": { + "partyId": "0D4C5DB260860EEC59A68B5EB91FFC33", + "ephemeralData": "9B5612F0AB25E32DCBDB8C25C7DFBA82FAD6BC4AC36D21433C5B33860A27C6EA39AF5AB4" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 89, + "testType": "AFT", + "tests": [ + { + "tcId": 2201, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6EEECA61C21A4004CABFE145B3B38FA1", + "z": "58CCE52FF752FA0C03F181EE7D0E37751F6357509D27CE8573C28E3B00DEEB06D0", + "l": 1024, + "algorithmId": "8CECB523E27E469647F21292FED7C2D2" + }, + "fixedInfoPartyU": { + "partyId": "E8B32C9712C03FF000668C0DCA1C1110", + "ephemeralData": "6947DF6BDEC1AE8C0DD1E811993B3E8DCE029F43CA3C40F3DBFA85E2F1E092ECA3" + }, + "fixedInfoPartyV": { + "partyId": "20FC26C3259932D0972F1F7839F98C40", + "ephemeralData": "A0B26549AC4FDFC8A40F6E56C9A6B689D2F9136F1BC33465D2C103911DAC759FC9" + } + }, + { + "tcId": 2202, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72D7899C01BD2ECA5E582F6B94A12E42", + "z": "D3C1BB1409459BF7F6F6B23B8D37CB6CC4D2F7F491C1FE0E0D3B6474AC33BF26B2", + "l": 1024, + "algorithmId": "8AD6470E19CEAB4A5816C77466554F26" + }, + "fixedInfoPartyU": { + "partyId": "37D5CC97315D8766CACDDDA387E8675C" + }, + "fixedInfoPartyV": { + "partyId": "3C52F8311ED9B53DC97376E49FBD2F3C", + "ephemeralData": "F40B8E34ABF42865BE74F17734048CD71F0EC52A5EC555B4276DFE8E214A0E8D35" + } + }, + { + "tcId": 2203, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3811F52A706050CE1D52BF4D07856089", + "z": "FA909FD0E93541021CA5D75A9C9B52DD96A9020B013E657A2C81E29CB021B68D2B", + "l": 1024, + "algorithmId": "B687BAB8B0680B86CA4149860F206F65" + }, + "fixedInfoPartyU": { + "partyId": "4EC21C1459D2DB047DED0666032A8530" + }, + "fixedInfoPartyV": { + "partyId": "D5DA5B97AD5BAD0411B6D09B76A34DDA", + "ephemeralData": "84F7806DD0925862F274B49484ED52F633E77EE6084C047F981D64D62FA6D786D1" + } + }, + { + "tcId": 2204, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2DC1A2E66BE8D09758F20579706480ED", + "z": "2468CCC52764003141A4F371C2230F8479BE4D1E746A8012213B1D3CA40CE0075F", + "l": 1024, + "algorithmId": "51CA30BA7093E60AB3311035988933A9" + }, + "fixedInfoPartyU": { + "partyId": "8279E38884664F2862B0ADBE4FB21165" + }, + "fixedInfoPartyV": { + "partyId": "18465B14B83C73CB3C14EE6B9D9361F2", + "ephemeralData": "6C20F414AA743AF3139D23FA86D56BD3FDE2874DB81F8C219AC05FD7BA6F9B0C0E" + } + }, + { + "tcId": 2205, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D93486AB87B8F2D22AE6F2DE7601E5EB", + "z": "D358A5E44E7A4257E160DD3F355B48F9220A8227D8DC75DC968C7BC88686566C2D", + "l": 1024, + "algorithmId": "3ED636660D8808DE506B076D1482C852" + }, + "fixedInfoPartyU": { + "partyId": "70AA520A7C02DF746A23B74FE0FAE0AE" + }, + "fixedInfoPartyV": { + "partyId": "1D37B23E01862EA5F68EEDA4D93EB264" + } + }, + { + "tcId": 2206, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01B85EF79BFE0511723D9259EF4172AA", + "z": "8450ED90FF7B0DFF459F1D7F3D5326247FF061DAA1F165E2D8008C4368F6022454", + "l": 1024, + "algorithmId": "9EADDBD2913F3CAEE42BFE801F728332" + }, + "fixedInfoPartyU": { + "partyId": "A436D14C2D771741E66635B6D9AE3C3D", + "ephemeralData": "D6D72DF972A568FC6CBFEEC817B29D636D15F44700113669B06207D5C46538D31B" + }, + "fixedInfoPartyV": { + "partyId": "82CF40D530CB0676A767791E171974F1", + "ephemeralData": "2298BC978E23C2A10B36EA4EFDDBD20F3A5E3CB7F0626DC8F879E453F6F1986DDF" + } + }, + { + "tcId": 2207, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F239CE7CFB44A3F275C0F682DFF22D9", + "z": "358D696A72C4E421E483F6848ECB364B64D5AB8048C72CEB2C3A0B331DAD0FB273", + "l": 1024, + "algorithmId": "239E3261FD0C5929513A270F24484193" + }, + "fixedInfoPartyU": { + "partyId": "9FBFDE95E27C01C416A505F123AE898D" + }, + "fixedInfoPartyV": { + "partyId": "9F81C2C7474FFCC88BBCEFF058669C6B", + "ephemeralData": "43FA3FFDCF55092897F19A9CDD27CDFF932524424EA17A82CAB5904573B2FDF6BB" + } + }, + { + "tcId": 2208, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F9B6E3F1FD5801AFA4110C375E1EBE4", + "z": "55E1B9215660A38761CA948BD04EDE33A6855F908FAC0F67FA9CBA061F4BA687D6", + "l": 1024, + "algorithmId": "A638463CD5FAF150F8402CE0BE82A2DA" + }, + "fixedInfoPartyU": { + "partyId": "208A6B94015B7B4530DE86EC9FB4FF6B", + "ephemeralData": "3F191CCDC938108B1DFFACB9E5AA9123572DAED9455A6298E9DCF34BBE4D900C78" + }, + "fixedInfoPartyV": { + "partyId": "ACA2FFD67CED03C3C1B3AC0851ACA807", + "ephemeralData": "8C6D8C4783BEB622E9DD764FDC02303E1A487C1C12BA3B332F905FBF6976F8473C" + } + }, + { + "tcId": 2209, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A89B6628795F33055C7B1F7C603FC08", + "z": "250A954B36CFD3FC202A33ACB1E2233E25F9710BEDDF1F06D9F0A376AF76E9CD35", + "l": 1024, + "algorithmId": "8E9522FE2EB0AFC1F8D3CBC30352E7DC" + }, + "fixedInfoPartyU": { + "partyId": "822468E892F1EC125891DE1E3930F925" + }, + "fixedInfoPartyV": { + "partyId": "14708EBAD4A3B256BE9988D9A7932462", + "ephemeralData": "7D805E5883EE2BC87A97704C7E7770E99A4DAF94389842C09E8A915F07C04012C7" + } + }, + { + "tcId": 2210, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4602F7A9DDA4F82E881CE64567D5958", + "z": "65B7EDC496ABABFF251BBFCB422A6364ECEEC678D1E7249E533D6A64629F38E163", + "l": 1024, + "algorithmId": "97DF15449EB4C6E7676271FA2DE7A7EA" + }, + "fixedInfoPartyU": { + "partyId": "8809179AAAC5033FEFF33540DC623B00" + }, + "fixedInfoPartyV": { + "partyId": "6CB18EA6BFB963791C21987135CC15B1", + "ephemeralData": "3E1474993039D1C6BF40A38E2FEBD713AA22A2E88B71F9C8033B702FAC11633DD1" + } + }, + { + "tcId": 2211, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E733113B821DB92B3A6E01E16E2E68B9", + "z": "60ABA98BECCFD831060889782C9E46EC9DDF306B75470C294A33CB036C23BFA794", + "l": 1024, + "algorithmId": "A554C897B0B193BCE50E0A88036B750A" + }, + "fixedInfoPartyU": { + "partyId": "88BFC427F5B723FB9CB5393108EF1CCA" + }, + "fixedInfoPartyV": { + "partyId": "607FBF46FC2B3B1CB61E1CBA95CB4EE4", + "ephemeralData": "943764B49F8AFE1551D1000FCAE05BA6AE46186CDE13D155310190B36CD7404FAB" + } + }, + { + "tcId": 2212, + "kdfParameter": { + "kdfType": "oneStep", + "t": "25F3C10A66BC8C9A9BBEB937C621120F", + "z": "C970B43A5E138DADD9F0BC456D219CE09D86BA562FBA0246EBBC7EE67C92B5D14A", + "l": 1024, + "algorithmId": "138ADE031EC1BD31BEA01AA0284897A9" + }, + "fixedInfoPartyU": { + "partyId": "D1436B03B7F1DA65932997F82932D39C", + "ephemeralData": "414941D538CA6A088E7248A55D888292F09291B05D6B58CFB9C41405B7D12529C8" + }, + "fixedInfoPartyV": { + "partyId": "602A0728D0C83E641DCEE5F84A8A7128", + "ephemeralData": "6A400165A28066F86AB3ADF747073E35290E8DE48B4A9AAF43B3E123D849C1D913" + } + }, + { + "tcId": 2213, + "kdfParameter": { + "kdfType": "oneStep", + "t": "49F6B1970EC0CA55C2AF909039C38C81", + "z": "6328FFE05D8EAA24A612CAEA69FF5D869D4EC2F3BA74D5DC2428FAC47B6D6DC184", + "l": 1024, + "algorithmId": "C24DC89B236A59DA97EF1E58FFE656A2" + }, + "fixedInfoPartyU": { + "partyId": "0762073BBAB4149A92BD46E05BD99E20" + }, + "fixedInfoPartyV": { + "partyId": "ACDC43CA6B1A56C65BF699E0F6541171", + "ephemeralData": "0DD7D0CF26A2EF19FFE204406DD4EE6FEA86471D6B5716D6CE6DA03FBCF3E85499" + } + }, + { + "tcId": 2214, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9175E7846087DAF34D4EC82A2DA04359", + "z": "F360F7F455A33BDAB581FCAFD6B890DFC8267C7BC2E9236E6BA97998898C628107", + "l": 1024, + "algorithmId": "A403AF9EE59C69487C55DD7E2E28034A" + }, + "fixedInfoPartyU": { + "partyId": "5D778A64A4BBC1F6CAC01B774D1DDD0A", + "ephemeralData": "46C44F50DC40EDDFEDCFC451D85F9EB8F6C2767654D55DAED7E08558BBBD57A597" + }, + "fixedInfoPartyV": { + "partyId": "444AA2F4636C9F6D97854F3509525DF3", + "ephemeralData": "FBA23CF96B58B16BC71869C0B92419608F995E8603446BDCCF88E04688FDD9D26D" + } + }, + { + "tcId": 2215, + "kdfParameter": { + "kdfType": "oneStep", + "t": "168E55AD19471CF36975650894C35B36", + "z": "E79A782253A7C9D0B15434448CFEEF1D44683E4C5B33A27C2CE5AF99AE94FB8069", + "l": 1024, + "algorithmId": "CB5B6C7E822376EF253C9BC3BC3A26BA" + }, + "fixedInfoPartyU": { + "partyId": "DDA70E41C28B67DDAB9C1CC670FE190C", + "ephemeralData": "C922C26F91A8DCAE5252017DF83F324E4B08030A9208D0DDE3A74B248A90668FD5" + }, + "fixedInfoPartyV": { + "partyId": "885D4AA3CC3EE3C9B2F4825733E94C73" + } + }, + { + "tcId": 2216, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA2D36699C89AAE96BF209FA19F37FA0", + "z": "32898888B828401C54200E0343339EF7EF28CE13B28DE4E819709184E86328015F", + "l": 1024, + "algorithmId": "099705D6E3DB5FC0F12541D32A884729" + }, + "fixedInfoPartyU": { + "partyId": "DCD6B96425120083ED1C2133DDD48310" + }, + "fixedInfoPartyV": { + "partyId": "5A5F90B76843CC0E08F35B87F99871AC", + "ephemeralData": "CAB270CB84D85424D4E1288939F116DC584C6962F0FAFB03C04581D6BB4BF98FA1" + } + }, + { + "tcId": 2217, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A3F36490340E2EAD7D86F09A9E06599", + "z": "FC417FF12F667D6D22DEB32F1A4A20D6861A21838E55A4D08B256F72B4A718DA6E", + "l": 1024, + "algorithmId": "C3E87F4AA30F3C78C9F56F496845FA4E" + }, + "fixedInfoPartyU": { + "partyId": "C1674882CA391DBBF5270E41666F34E5", + "ephemeralData": "A516259F1379125E54F9C744B3B14EA95962509AF608F4468539273F10F516737D" + }, + "fixedInfoPartyV": { + "partyId": "E983C4EC32C7BC2D48F5D5072B0C7409" + } + }, + { + "tcId": 2218, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FB1E940897F56A310738AE1B45C3FE6", + "z": "B3A878A017672066BA1F96E169AFD0343FF0CBACC946447C6AAB6CE61677AABB9E", + "l": 1024, + "algorithmId": "551B347A1C806491B82996BDC3772EA9" + }, + "fixedInfoPartyU": { + "partyId": "8AF6462D456549B0D3FF3FA389BF7E71", + "ephemeralData": "DD29208DD93098B8DCD1F59C660C2E58929C04CA9405C6AFBD8B25BCA601180C49" + }, + "fixedInfoPartyV": { + "partyId": "607E1BCE388FE6FE99C1CBB18F6C5687", + "ephemeralData": "D0199D0E9865B568726D8DE10D98740C289D8F2FB2F424ED254716AD287DC8ED9A" + } + }, + { + "tcId": 2219, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0995A2657F959B38342F4B342A649D54", + "z": "BA6EE255D3D33812231F3679024F7AED3C9F58DAD83634E4FCD7D147990F2D9298", + "l": 1024, + "algorithmId": "B4736EA35ACC4F1047D5686E7146536B" + }, + "fixedInfoPartyU": { + "partyId": "425E5BF9164F2E8DCC0C1B644011C2C3", + "ephemeralData": "91D9B62A09E64B74836DD1D75E4717147CC602A604FD0F86EB0E5B1E0746277843" + }, + "fixedInfoPartyV": { + "partyId": "4D8789CEFD957832B5A4BC74466912DD" + } + }, + { + "tcId": 2220, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7073C5F92A0B9DBE6C8B7CBC7DE59EA8", + "z": "7CFC0E37C62F33AD645075028B0E3653DC2673DEE69D30C17268F92C3C93B60538", + "l": 1024, + "algorithmId": "F84F76541AADF0C10762D1CCF11AF0CD" + }, + "fixedInfoPartyU": { + "partyId": "2AE086ED4CFB0B7CA57CBCBCC04FE23C", + "ephemeralData": "04532677047AF60F68BA96206623FCAA2033B23AA2CAF98E2E658F35E5648EA54E" + }, + "fixedInfoPartyV": { + "partyId": "48D0DADB822D8D5AC0AC57186D68E9E0" + } + }, + { + "tcId": 2221, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D2E3A03504E2421393C9F93BCC102947", + "z": "355D9F117449B2546361B4D69C77D8A23B9929E1D989A4C4AF936FC6E6DB07730D", + "l": 1024, + "algorithmId": "7332F98EF89019FED415568CC6E82C5B" + }, + "fixedInfoPartyU": { + "partyId": "1831BA3F55771D7DBA808D57F11AEBBE", + "ephemeralData": "30819A230C3CB91EBD5715E4A70EF51A5346259D1E25139278A5BF37366CC892C9" + }, + "fixedInfoPartyV": { + "partyId": "527F5E946DFBDE4C5BB488C9950C482B" + } + }, + { + "tcId": 2222, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BCBA0DA1B0C312E264C236ACE6B0174", + "z": "195CB06CA1C103F49F8F24443DCFF6EC1C7DA839B62D4512C004E8D0050A601480", + "l": 1024, + "algorithmId": "88F64CAAE195E4FD8B88AEF2311AECB3" + }, + "fixedInfoPartyU": { + "partyId": "88F46F1FDE580D6618A382EBEB96612A", + "ephemeralData": "380F8480B0CC37D7B75269309212D88C14E861546227CC116AD0EF3B2DFBA9EEFF" + }, + "fixedInfoPartyV": { + "partyId": "F6B903F0D771801AA725FC1DB2C26C12" + } + }, + { + "tcId": 2223, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80235494EE2B732E0A83464360D91EF5", + "z": "0C54C6CA3E97156FFA0902BC7249BCC9A149815CA242E2D62C9921109DE73D6F03", + "l": 1024, + "algorithmId": "8A428B2B3AE830A95AB86A0B437A7E50" + }, + "fixedInfoPartyU": { + "partyId": "F2D16741646D333FFCE4ED5B4DBB3668" + }, + "fixedInfoPartyV": { + "partyId": "8D10625A89FB2DED346D470DD998CA4C", + "ephemeralData": "D75CD0E473E9BF6E194EEE5B32BCFB7D5CA54308B8A49588334CD7DC46FBC5263A" + } + }, + { + "tcId": 2224, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDD620E228FCBF6F07777668819B109B", + "z": "EF1278DE6BF84A7B114A73C4274816E4115000449D1FECB827FC644CA387CF8DA4", + "l": 1024, + "algorithmId": "02F8E58028D5C5325A0767B8B98389C1" + }, + "fixedInfoPartyU": { + "partyId": "BE2A69588AAF599EAC4E5E7016F38307", + "ephemeralData": "391F12B9C0C46A889CC885A13A0DC19530DA4048916C0227768419DFA68D09FE16" + }, + "fixedInfoPartyV": { + "partyId": "6F110C3F4C37F991D9A360610879C7BF" + } + }, + { + "tcId": 2225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9085B609446004DFB8EDEE0F9779C1C4", + "z": "984110B3AD8D87EA2D03E891ABB605E2FDC8EB5D9BF9B29D84063CD7A745AD5975", + "l": 1024, + "algorithmId": "8CE4C6D75F811EF719F80D9266A21BF1" + }, + "fixedInfoPartyU": { + "partyId": "19811CF43B71127384ECE59F197EEAF1", + "ephemeralData": "7305CD39C7767F373118FD5EAF6C73A960718DD158AF50BD17AA70E3E4CEB02646" + }, + "fixedInfoPartyV": { + "partyId": "E4411AD59C27876E0D060CC990E96C15", + "ephemeralData": "923D1C5C7CD6D7405E6C9D96E1A464433B4AF0DEE2FA64AC9D9728E8E8AD0E7293" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 90, + "testType": "AFT", + "tests": [ + { + "tcId": 2226, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C132DCFAF07F83B7675B6742C834F11C", + "z": "F29AE5CA1D3B1915F84B38EC972C3FA817008088105BCAC7E00D693D62526D34", + "l": 1024, + "algorithmId": "EF02FBA9A94E89CE94D64AA0F381715F" + }, + "fixedInfoPartyU": { + "partyId": "37DE4A0B770053E3B3B1A0A93C748C57", + "ephemeralData": "3ACBECD33798B3798D076DC30BFCB96930E215F02D244C5921FCD59AAFBA4868" + }, + "fixedInfoPartyV": { + "partyId": "3DF2858D544F1A78B6BC42DF9D629903" + } + }, + { + "tcId": 2227, + "kdfParameter": { + "kdfType": "oneStep", + "t": "210475DA83091F79C8CB5B311C69944D", + "z": "C46CAADC44CF30DD62F02E9FF51ACA4F81F543435DC56F3280687EEAB6934055", + "l": 1024, + "algorithmId": "1746D8FC4EC9D239472DE66449F9A9BD" + }, + "fixedInfoPartyU": { + "partyId": "36856D95C1EAE82BCF2C8F45BBF8A8CE" + }, + "fixedInfoPartyV": { + "partyId": "0387A323AFBAD9305027820E5A0F3488", + "ephemeralData": "6245082072B6146BD126BF695D76541A99AB6FCC2E44B6CA4B9EBF3C394A9B8F" + } + }, + { + "tcId": 2228, + "kdfParameter": { + "kdfType": "oneStep", + "t": "94DB68E0B4EF18DF8ACC60CC72ABBC09", + "z": "0D77F9265A9A34C8829870C381E73A05896D3D55B7FED4AD36AF16A9221BD362", + "l": 1024, + "algorithmId": "470B122D692D7F7558AD16737ABE94E3" + }, + "fixedInfoPartyU": { + "partyId": "A1341561F7C4750DF39DE8F65A0698A4", + "ephemeralData": "FFB221A0AB4D74F39C1C931337BC13F05CB30F547B745A983AF2D15980A5AE65" + }, + "fixedInfoPartyV": { + "partyId": "66B877288E5D1F14C74A8DD24BC1AFF8" + } + }, + { + "tcId": 2229, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F569BC1B277AB7E0422C7487BCF16617", + "z": "D18CDA958E853B4D23B431F33B846E5D15B775EE228AAADF5AFCC7E6ECB6765A", + "l": 1024, + "algorithmId": "0F19AF2E6FCB878DA8010F46657E7A98" + }, + "fixedInfoPartyU": { + "partyId": "6B540AE9DCDC976950292DF9B815D51D", + "ephemeralData": "E64339D7555CD134442F1CFE5F1804B91E04C56D41AB9E92C128022E37ADCA64" + }, + "fixedInfoPartyV": { + "partyId": "D1FC0E7E8E66F7ECD3EF99DF10318F1A" + } + }, + { + "tcId": 2230, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A34C86B3EBA8536DFC29D5778E1DB5F", + "z": "DC8AE53DD16B4CDFA1743A1EF188353E3331EB6BB06B23999EBE9628AEC0AE2B", + "l": 1024, + "algorithmId": "04C4025F41176AA5F523F857A12CA23F" + }, + "fixedInfoPartyU": { + "partyId": "4A73123233DE421DC8DB1541B1150C36" + }, + "fixedInfoPartyV": { + "partyId": "99B461EC2BDBCF1F39F1EC4240350087" + } + }, + { + "tcId": 2231, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EC0DB1348B0D6F11901436927F2B79F", + "z": "0553AF2AB5904AFC84ED7F70BCDEF0FF1C86E24E5DABC45DFC9E2500B50D2B49", + "l": 1024, + "algorithmId": "44CD2BBEA1495EE167F7DB8C8263FDC8" + }, + "fixedInfoPartyU": { + "partyId": "0ECBA398A5CAF5197A43181D93570A9E" + }, + "fixedInfoPartyV": { + "partyId": "70AED2E994B6B9893ECACE04FD234993", + "ephemeralData": "1B232FE58D5E94558D3C990830659765817F58EB47B57BA264ACE7FEF38A43BF" + } + }, + { + "tcId": 2232, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6604B81D6D60DCD994B00118D8669337", + "z": "966F49E149D24239842C77873F3837CE4BC95CF5EB9F995E483562B4674A55FD", + "l": 1024, + "algorithmId": "D0866E7234637D4E8CB74226ACD7E986" + }, + "fixedInfoPartyU": { + "partyId": "7C9FC4627E7A1E5DD41C1E241C36FC78" + }, + "fixedInfoPartyV": { + "partyId": "2A1466EB8F722DC52986DFC47FE69F15", + "ephemeralData": "65B87144AAF05EF3B01DB31688AACB3656A27422AEFC68E2641AAF26AC25F872" + } + }, + { + "tcId": 2233, + "kdfParameter": { + "kdfType": "oneStep", + "t": "399DD9474729433F893B7A302CBAE198", + "z": "194D4DFC13F6F9CD8D08FFBE6137673CD8350C0AA9D36CB9D3C8A67864DB3B0C", + "l": 1024, + "algorithmId": "4EA3BDDBEEF9D1F29594255635820807" + }, + "fixedInfoPartyU": { + "partyId": "337E91A6C372E619F1D53FE19FE1BF34", + "ephemeralData": "7A3BE6458DD7474591FCF7962A4B75BA1E6CD7B4B07F964E330D7A3CA1E00B50" + }, + "fixedInfoPartyV": { + "partyId": "0F644156A8926CD444F8786D41AB06C3" + } + }, + { + "tcId": 2234, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32A5A328F9B3A6252061F356B1B047D4", + "z": "DEF977DC7D306BD6BAE37132D160E175ADBF24B21A1780B1E63968E2DA3F1025", + "l": 1024, + "algorithmId": "2CC6D1535010A18121719024568C38AD" + }, + "fixedInfoPartyU": { + "partyId": "016E46DBD500C90E6C4AEB91422BDEFC", + "ephemeralData": "FD8FDF0D7168C3F497891B7CF8D41E39873909BC377603852DB3FFD343478405" + }, + "fixedInfoPartyV": { + "partyId": "C05234D4E70C1577DE289BB2F3D6962F", + "ephemeralData": "71BFC3A10E6781F6F59DD5453226087874A6204296104FAFFAEA6B089928A24E" + } + }, + { + "tcId": 2235, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A97547153D24E26E7C5DAF4CFD31BC5", + "z": "C2D67396D9991B51001701C1E59023E25EB7EAB427145125502BC89A863FC1DC", + "l": 1024, + "algorithmId": "867B613F4DF8661748C76827BF0217DB" + }, + "fixedInfoPartyU": { + "partyId": "3C329DC6A3A983EFFCEBF5227D71DDCF" + }, + "fixedInfoPartyV": { + "partyId": "7AB2B9522F7E343EA9DA58B1C44D7173", + "ephemeralData": "F6C99DCD6CC0E3D397841EFE890222425CE9B33A74583EF69338ED3C3978D758" + } + }, + { + "tcId": 2236, + "kdfParameter": { + "kdfType": "oneStep", + "t": "60012AFB68F63D5E6922EE992B82E15C", + "z": "C0C41409C4B04C6C284DFE02298A9FFCEC22F6133F40C79C09DA1270F029D1EC", + "l": 1024, + "algorithmId": "55A960F8792BA5EABF7C00010EB58E17" + }, + "fixedInfoPartyU": { + "partyId": "6855E3ADD28F79064AE4B837278DCBA4" + }, + "fixedInfoPartyV": { + "partyId": "0287FF166224840083EE5DD79F5B6B0A" + } + }, + { + "tcId": 2237, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C40D939C39D437B08A9251D506103E3", + "z": "6703B872C2FEF52AD3A0614CC90E036016BE36A53B141481C4A24D5DB6B357D5", + "l": 1024, + "algorithmId": "045249FF518F63413D7B0F057AFED3F9" + }, + "fixedInfoPartyU": { + "partyId": "44636E1109CE9C6196A69B96A87C4322" + }, + "fixedInfoPartyV": { + "partyId": "10C952DF4E688CDFB674FF76CB356286", + "ephemeralData": "054981483E0EB6F10743AB9CCD55EC3EB992BBC29792AF68775DC48016BA6118" + } + }, + { + "tcId": 2238, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DDF32BCCB393E0B42737CFD225E7668", + "z": "BA9C923DC0B76EC906D990D9C0C230828B22E1FC16175751BAE7590225AA6BFF", + "l": 1024, + "algorithmId": "BCBFAF78006F9EED585E76FEC2B13D82" + }, + "fixedInfoPartyU": { + "partyId": "29465D65A6D1A38F0FBA9A050D0011BE", + "ephemeralData": "286CA132BE3630B375E88615E0EB575CBBBE7D27A1935BA4926F831F6F8C49AD" + }, + "fixedInfoPartyV": { + "partyId": "25686D263E617A918D9F4A10498FA48E" + } + }, + { + "tcId": 2239, + "kdfParameter": { + "kdfType": "oneStep", + "t": "228CC609BE33374C444F4073AB031110", + "z": "7988A3F794DEA6DFAB62265F8F8B182F211A532AC6DDC2EB2A3AF398133DDCA4", + "l": 1024, + "algorithmId": "39630CE7EF9A6A4091612BCB2BEA2FEB" + }, + "fixedInfoPartyU": { + "partyId": "F9198962B0BFD9D61CA14FCE0A4B78DE" + }, + "fixedInfoPartyV": { + "partyId": "3A4832A515F133927A7EC2FC3BF08E12" + } + }, + { + "tcId": 2240, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47F16849CE6A016252415F498D902571", + "z": "BF2765639CA0673D5B56B7F3EC9F1F2261698CD78906CF9F50C9DBD7213EBF6A", + "l": 1024, + "algorithmId": "D1759521BE3F54277034CE9D02B97EBB" + }, + "fixedInfoPartyU": { + "partyId": "D67BB85979EE3F5C96FA53566254F863" + }, + "fixedInfoPartyV": { + "partyId": "A839ED2C3B6FE4E269B25304C829AC09" + } + }, + { + "tcId": 2241, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1076F4661C7E336A0E7FC79DE03513AC", + "z": "9F497A176769DD5691F2D606A77A722CB208C2D118D949052F974D7BACCBACD0", + "l": 1024, + "algorithmId": "7D55B476F676CA94B096959AD3ECD558" + }, + "fixedInfoPartyU": { + "partyId": "A73C66ED53DA057C5F01A8E9C9266554" + }, + "fixedInfoPartyV": { + "partyId": "008B182FE49D563AB9F90ACE7AF4EFCB" + } + }, + { + "tcId": 2242, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F28F6EADC2CD658FDCF79996FF83C63E", + "z": "C86EB45955DB93CD3E7CEA0F0AEF7BB3AB9CBAF9EBCE99BA24992A67F18C5F5B", + "l": 1024, + "algorithmId": "04C4CF320959F2371C7726BB6B6FC5D7" + }, + "fixedInfoPartyU": { + "partyId": "D4E30CCAFC445E2D149DD242D3AD6763", + "ephemeralData": "AFC17380A6B0DDDBDEE068C80D9287062B06CB434ED4234EE370E3847F320F22" + }, + "fixedInfoPartyV": { + "partyId": "93E9C6C8AFF4F03D83DE493BA5368B07" + } + }, + { + "tcId": 2243, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82FD36B086D034CEE0FADF1F663018CD", + "z": "931A3258E1E070C7BF752ACE189967FF9A12FDD938E1C38C273C7F290A83C10D", + "l": 1024, + "algorithmId": "70D698D4F0E4AFCACAB82815AF50C29E" + }, + "fixedInfoPartyU": { + "partyId": "D106C2FD5BDA09DC4E46CB1413E362B2" + }, + "fixedInfoPartyV": { + "partyId": "A95ACF5A9EB842C44BE3B4E49D488635", + "ephemeralData": "803A81AF8D8950C7FFAECEF6D1AB22BF0E6905C1194FC43C4A203385FE1A7685" + } + }, + { + "tcId": 2244, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DD28E5249A6C32FD5EB8D0F54B03BFB", + "z": "17E768155FC428E46BAB83AD468B4C1612D00619AD550C592B6FFA0E4A65990A", + "l": 1024, + "algorithmId": "39CF93B619A759A539B1BB23F4FDCFF8" + }, + "fixedInfoPartyU": { + "partyId": "28BC3D3703FB84CB012B842D1D0F1A86", + "ephemeralData": "6BA633A788297A8A2191E4B2F7FE263E24F1160F35E665FAEE87DF8C02053394" + }, + "fixedInfoPartyV": { + "partyId": "6DBBCB441E332F873AF914E234806C9C", + "ephemeralData": "BEBEDC73B1836FC32D2A42BC95A3997ABFC646FEB61178E3A1AF4030BD17F8DF" + } + }, + { + "tcId": 2245, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13573A60D36876F396D4FC16580A7A40", + "z": "20524F3AA0DD3D0AD56A6CCB4D3FFDA73E9BF3FACEC04FEF9D41C0CCDD64E63A", + "l": 1024, + "algorithmId": "A0043C871BF30D5AB222A216D1D4DED2" + }, + "fixedInfoPartyU": { + "partyId": "009B063CC7696D397FD427D7A1E0E0B6" + }, + "fixedInfoPartyV": { + "partyId": "FDA062A1E38ED38F7CCE4709FB632C2A" + } + }, + { + "tcId": 2246, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F63AE86C29A2E8C3ECBF3D41ABD1F3F", + "z": "8F8DCBBCB81136F503E66DA02B641E226FB40FACA619205BF58C2AAE0179D71F", + "l": 1024, + "algorithmId": "AD1B7315A348DB3D138E57E79E74C0F6" + }, + "fixedInfoPartyU": { + "partyId": "7D9124D9B4BFC79214FF1AFA3D83C878" + }, + "fixedInfoPartyV": { + "partyId": "928F38D318780C75F0B1DE374967A02A" + } + }, + { + "tcId": 2247, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD7D8FCD96C638E7B5932855D1C61ED1", + "z": "AFC39D71D2DB659824009FF1AB2EE84B28AFBCBEEBC2F4CC4CD2BD1EDD7877F0", + "l": 1024, + "algorithmId": "A63DA0CBBBDDF43F9133380AC21A2C4D" + }, + "fixedInfoPartyU": { + "partyId": "2AF6A8666004794C13875F2753CB0F77", + "ephemeralData": "6EF0BE9F9A775F1B60EB015BF1AE7312312FDAFFE2B944537750DCD160E54B9D" + }, + "fixedInfoPartyV": { + "partyId": "9F4C31CE1AD3DC7A33A54EDE52D349B0", + "ephemeralData": "12EA92D02D7F777ACEC452DD06B6324A5495D7B6647245845F9C2D394834532F" + } + }, + { + "tcId": 2248, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A432EC2302BA13254A37CE4BE8270C5", + "z": "DF1F00D0407F19AABBB363BC8132122AF726E45C604355974D3AC5E88F938C16", + "l": 1024, + "algorithmId": "DE63ECCD48734D0EE231FCE1B26D4D37" + }, + "fixedInfoPartyU": { + "partyId": "4DF742398F27343500F6D4594031380A", + "ephemeralData": "216782243C874B311C569DE5B223566336977DFA45CEE4D7D8B27EC2FCB00634" + }, + "fixedInfoPartyV": { + "partyId": "B73BBB27EF81677FB948E36EF99CC532" + } + }, + { + "tcId": 2249, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B968F6A2B895340E8925031517A21DF5", + "z": "43B2D825AC9BB56C919BFD38310C070505D5007B9223A7023EE194FE455267CF", + "l": 1024, + "algorithmId": "1315B19F6301B13A5590BBE0AA3F9194" + }, + "fixedInfoPartyU": { + "partyId": "0D0E93E06D14633C6014D05E38944748" + }, + "fixedInfoPartyV": { + "partyId": "F42A1934F948D8C1CCD18037EA9BB390", + "ephemeralData": "EA4A0767CBF79D6CC2C611591724954E8EA7D9B12DE8D4F4ACF234A69D6C3349" + } + }, + { + "tcId": 2250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D6841FAC4B5021565F62EDB48E12953", + "z": "D2829213E0DC9AE9899647D4B9717600C67D7553D9A0D074EA43E8D86AA85182", + "l": 1024, + "algorithmId": "6DBF058A26840B147C56C9E3F1FFE0B7" + }, + "fixedInfoPartyU": { + "partyId": "A0111D8D0BD4F7E66A95545C38A477A3", + "ephemeralData": "88CCFC8A73DDD207E0AB6944D1DB36CD4EE2D6620C3D811FBB3A38AFD084C3EF" + }, + "fixedInfoPartyV": { + "partyId": "20845D58D33D7D693EF302FDCE245B3B" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 91, + "testType": "AFT", + "tests": [ + { + "tcId": 2251, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01D6C271F434B3A5DB8529983B5884F7", + "z": "29E7B67A8FD46717DF4358143EE1FDB656D27768F13C958FD8F07B3658352031", + "l": 1024, + "algorithmId": "3AF3245CABAAF6EB58AAAE437A439D09" + }, + "fixedInfoPartyU": { + "partyId": "2D7393ED03AB7F937B039BEE3B7AA91F" + }, + "fixedInfoPartyV": { + "partyId": "AED95E61A6CF4056DDD8EC98E0733DDD" + } + }, + { + "tcId": 2252, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8550910A87C69D857679132820ADC51", + "z": "FE919FD23C867A0B882B058E919356C0A3174CDA6541312FEB075A664B1107D7", + "l": 1024, + "algorithmId": "D7D43B438AAB1C07A2474EA65ED2721A" + }, + "fixedInfoPartyU": { + "partyId": "8C7D015001531ED4F770892A3BB3C3C7" + }, + "fixedInfoPartyV": { + "partyId": "9F9019CAD4EC3F88DBD259C375B9E7D8" + } + }, + { + "tcId": 2253, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80599398A5EE0F2F67C53270947C6A1F", + "z": "AA2D43EDF96ECC1189E3985E309C472F146F0C93B79573CDCA6F27D31868C3D5", + "l": 1024, + "algorithmId": "439C9213C53FB33DC6E9DB099D34D6BC" + }, + "fixedInfoPartyU": { + "partyId": "23D40D9DFCC6B1FBF76F832A4FEFBE59", + "ephemeralData": "F804ECE6D1AC35A4D8ABEA201CD45DEA4589DD76B90707DEE03D2229F65176D9" + }, + "fixedInfoPartyV": { + "partyId": "D4843E687C4C6FB29C30B4DCCD13594A" + } + }, + { + "tcId": 2254, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D974F595AEB663FCB83DE28ED2B0266A", + "z": "E93EC3CFD65E78D10A05211C067872D18F2A5EBD977875809FEC170F79635AA7", + "l": 1024, + "algorithmId": "846951C3196436DFD371863A5A310EED" + }, + "fixedInfoPartyU": { + "partyId": "9DFBA56A1951103A5275EFEE68728AC1", + "ephemeralData": "7D2CA0ECCF0CCC25FCE1A1C1EC33D68F37BDCF15B897A7585485BD6E7D23DC26" + }, + "fixedInfoPartyV": { + "partyId": "40249ADE479513ECCD536B1BE6A99DC0" + } + }, + { + "tcId": 2255, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6134502DC68A3CAF521C171D2F0BE6CC", + "z": "FA8538C6D73EDA4160B50D81E4F39D3660E01820BA7FC8AC98E55D795E8A3C92", + "l": 1024, + "algorithmId": "A9A44DE59A6E234BB2FE5014EE2D5D78" + }, + "fixedInfoPartyU": { + "partyId": "97326197548272006F2F45C3A9070DEE" + }, + "fixedInfoPartyV": { + "partyId": "4374D20E1E9E1C298785DF505D908F2A" + } + }, + { + "tcId": 2256, + "kdfParameter": { + "kdfType": "oneStep", + "t": "612C5C5C6CEB89ED78A340465839CF6B", + "z": "BDE8F64714CBC9F79E3F4BBAFDA3CC174112F4F43E0B8EA4F5FE894E095F45F2", + "l": 1024, + "algorithmId": "FB6729643AF3271A4562329EB8419BDF" + }, + "fixedInfoPartyU": { + "partyId": "F8846535B8B443D0E1AC5EC91F4892FB", + "ephemeralData": "4491688796772DC21FB978F3AB61424DA5ADAEE9BE8511C105A6A72EB89054A9" + }, + "fixedInfoPartyV": { + "partyId": "95E722264C0819A2EACD0557A19E9DD2", + "ephemeralData": "469FF96C6FD9097675474D0B104CEC417F587E0F3000F5719B31844C2323E812" + } + }, + { + "tcId": 2257, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D2D2B1FCFAAEC405472EA63906F30BC1", + "z": "393614D4B665BAD86974FB81559CF168E3A4AD1263E1350C8165B9E36CE4DC86", + "l": 1024, + "algorithmId": "B34E1CAD1401ABEB320E837A6B02070F" + }, + "fixedInfoPartyU": { + "partyId": "5834CBC403F972A507CFE237D08E2FD9", + "ephemeralData": "860DA471010FAF942286ABD41FE38AA8FFF7ACAE5428947B678B507C150A91CB" + }, + "fixedInfoPartyV": { + "partyId": "C5F6B3A74DBC6803DE5D232B8309960C", + "ephemeralData": "B8E07B38EE6C1B052C84D474A31747A286D6F68941CC81E80A204B3951411C04" + } + }, + { + "tcId": 2258, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41FC99142C252F0F27C8BD3E511127B5", + "z": "804256F3A085D3B42FA3989AD7DB4A336B435DD077AE88766E8CB63C91841E88", + "l": 1024, + "algorithmId": "848058F37AC9FD1A578319D094FA7CED" + }, + "fixedInfoPartyU": { + "partyId": "B157500FB6DBA39BFF48EED3D5F18801" + }, + "fixedInfoPartyV": { + "partyId": "451F7AEB3068DC547AF0A624BECAF8BA", + "ephemeralData": "BB29AFCEE0127E5A01E1DCC2775E39B4D37C6320EDBDF63CDC0145976E6B4876" + } + }, + { + "tcId": 2259, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6D5E33E5434A0F33F8CD067A35D620E", + "z": "F83B06E94AA7DAF86166A5058474D653BB835538E8607E8976AFD732041742F2", + "l": 1024, + "algorithmId": "9F72CFDA29476CDB7A5A1EEB9B1A8432" + }, + "fixedInfoPartyU": { + "partyId": "9D06A370E819E6B3366D6DB898368197" + }, + "fixedInfoPartyV": { + "partyId": "43838C642F570CB5DC4DC1506E670078", + "ephemeralData": "955A4F07156103BBE8BF4689D306712E0AD355F17D8C1ED13D69E602EB1FB751" + } + }, + { + "tcId": 2260, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF406E3175880094947BBE920B0F2BA8", + "z": "0A3EFFAE2D867141E70D01D3D7D9A822964B8587E510322731EC5C1E88A49179", + "l": 1024, + "algorithmId": "5E2974BEA4BC0B787075372D1A06BDA5" + }, + "fixedInfoPartyU": { + "partyId": "0F0D96AE5FE3DE3E4C40A1D02C2AECCB" + }, + "fixedInfoPartyV": { + "partyId": "F42782BFD5AC46BC8378FC69948952F2", + "ephemeralData": "BB5B7F77935A13A9B1F06175B5ACBB787764AA39AE1DF5988C6781C51E5B9A1A" + } + }, + { + "tcId": 2261, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC31F1489912C0262CB2F8343FF2E3BB", + "z": "166C83ACC8F3E67754A09E9475C8380263E21C0F7FD8F919857D5557953DE577", + "l": 1024, + "algorithmId": "82DCB04BE82BFD08B41CBE891A12294C" + }, + "fixedInfoPartyU": { + "partyId": "0A1C331F3A256D66652B467366716ECB" + }, + "fixedInfoPartyV": { + "partyId": "8D96D9B462711EE844D828BC280F97AF", + "ephemeralData": "8F93B203BA288A2198450EEE5CEBFCEAE9C943346578270E620DBBEF7CABA1B4" + } + }, + { + "tcId": 2262, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E6018BB78C89D0E91203A893192814EE", + "z": "B8187725DA1E80E28E2B130E142F6150A47EA3E36044CFDD6EB8F90DB4C2CB1E", + "l": 1024, + "algorithmId": "084E2A1F25400844CF04AFAB0892E636" + }, + "fixedInfoPartyU": { + "partyId": "462EA363C33CB95BF4FB9A6853075906" + }, + "fixedInfoPartyV": { + "partyId": "B66548DDDB8CD1349F0AD8ED5B553CE5" + } + }, + { + "tcId": 2263, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FFDCF046A0FFD8DCDF83B31CE0E8837", + "z": "0FC420B0C8A30327B7BB73771CA8CF63074C1C3E620AF05577FF741BC84031EF", + "l": 1024, + "algorithmId": "B4C1AD3B6EEC72DEC88BC0C631D120F2" + }, + "fixedInfoPartyU": { + "partyId": "708F953140789689C299F96D097EDD74", + "ephemeralData": "7491857AFAE092E5356A9A429E60EDFA2C34C737D117A089767C97E026340708" + }, + "fixedInfoPartyV": { + "partyId": "CF52F18258E393024593E88F19A81632" + } + }, + { + "tcId": 2264, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE072EECBDF7107EF2C3BD8A6D9EE727", + "z": "85790D2A382FFD9AF74BC7169B6106F520E08137C79700688E3516D54EF7D059", + "l": 1024, + "algorithmId": "E196657580FC37B366CA2248AEEF5EB5" + }, + "fixedInfoPartyU": { + "partyId": "FDBAFB258A050FB1100C486DA5262E2F", + "ephemeralData": "429ED2C1C106EA51FAADB23A5A099812865A63FCE7D7B3FF8492B76CCDE5C7D6" + }, + "fixedInfoPartyV": { + "partyId": "ACB42835946D219476C3B89345530832" + } + }, + { + "tcId": 2265, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AE3EA8DFD1D672D6E6B6A56B090D0A4", + "z": "2223BF15CBD0750B5A2AFC375C2F53F36D2DAFB64B6B8C49E2514CB5F6094E97", + "l": 1024, + "algorithmId": "F700EB1A86FC510CB0BC3333FEE377C5" + }, + "fixedInfoPartyU": { + "partyId": "7EB81FFFC966AD7E57410AE2CCEFB26E" + }, + "fixedInfoPartyV": { + "partyId": "698ACD867B40EAAE249A1286BB3909B0", + "ephemeralData": "DCDFF7DB012033A754A0E867E9B5649052BCEC5B61968ADED711E88A61C004DD" + } + }, + { + "tcId": 2266, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51AD05E69DCDC50BC08D72E871197B8C", + "z": "58B93E6B875DCCDE7FF5292F18FF9B1FDA58BDC9462F3CCE3CC5C697034D9CB3", + "l": 1024, + "algorithmId": "158A2AC408B0DD5EA0DB384C688D6CF1" + }, + "fixedInfoPartyU": { + "partyId": "4DF64743ACA3DCB6C57E86DC27545E2F" + }, + "fixedInfoPartyV": { + "partyId": "8390D13D69CB24CEA78A2294064B7EF2" + } + }, + { + "tcId": 2267, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D844DDFA38F133479A3E90BA249369A0", + "z": "1CF3FAC8393BAFE068277B3F1E7DA0DF4A7069A9CC3A80F39C5FE1437B42E719", + "l": 1024, + "algorithmId": "0B245725C9E72CF9EE33B96C824A1EF9" + }, + "fixedInfoPartyU": { + "partyId": "DDF171563A31F609BFC8A9143EB00EE8" + }, + "fixedInfoPartyV": { + "partyId": "8CF8D326A5939BD9BF9D99255F5A58A6", + "ephemeralData": "3923E219340D3B7F1275C3BC99A222765EBE6E12ED4A4815BED8363532B99AE4" + } + }, + { + "tcId": 2268, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89EA5C43A86D5D29E15E0158E8287538", + "z": "71393D9CC43007A5C2DB275EB5E4C4816B5E396F7C6CADDAFEB2CB96A40AAA78", + "l": 1024, + "algorithmId": "DCA24369866378CD7CE50A225AE804C3" + }, + "fixedInfoPartyU": { + "partyId": "F072E294AB0D29C36C46FD39BE0DD98E", + "ephemeralData": "95C32D2F1934F2777E83329F2B95EEFB749D61ED9A8EFF47CF512B34777E2701" + }, + "fixedInfoPartyV": { + "partyId": "C8D5D1B7FEF1EFBCAE59F9BA159BC53F" + } + }, + { + "tcId": 2269, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05524909C0E0658D8B775E5A8D372E63", + "z": "A907F087600DBA2860ECD4916A9EF9F43C61A8E0E64DC3170FD83052E345B740", + "l": 1024, + "algorithmId": "BDF4744367BBF0F211B068C59A469FBF" + }, + "fixedInfoPartyU": { + "partyId": "E4AB901196762756326A112E8C26B69E", + "ephemeralData": "0F974F555E6A136C8FE20ED5812A48A4BC2788772398BAE4CB6C73E7AA10CCA4" + }, + "fixedInfoPartyV": { + "partyId": "9EDE0ED15649C0BA42B6FEF723E35C28" + } + }, + { + "tcId": 2270, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DBE5C7AB3EC16264CEBA7262D0AA9A3", + "z": "43F11AB7FD5DEC305B724543546697E790C91EA282B09B0383E3EA0E3576057D", + "l": 1024, + "algorithmId": "D9B5E0BA300E8FA06CCDA41384381B03" + }, + "fixedInfoPartyU": { + "partyId": "08AA68F68B2986C5B8CA7F6AB5B3B0D1", + "ephemeralData": "41C765E71BBD8FADCD6725146BF1B06CA9E9CBE68D22051A92381A69F6E2CB5C" + }, + "fixedInfoPartyV": { + "partyId": "BADF2BA77A50227A96684D0E4E5BB054", + "ephemeralData": "AF8225EDD5F1F05A481F9B9B703638E13DB5AB1C5CDA48156336399DB9B889E1" + } + }, + { + "tcId": 2271, + "kdfParameter": { + "kdfType": "oneStep", + "t": "233E2A1C0C04FD3E9411606E5CE79A16", + "z": "A018088EC0CE6A6CD6DA77467B0896A08DA56EDBF29196183C6125816CFAA38D", + "l": 1024, + "algorithmId": "8589212A5A8B80CA351493BD0CFE7D36" + }, + "fixedInfoPartyU": { + "partyId": "D0B81ECED744AA39F1031C2686CD6841", + "ephemeralData": "B14D0702339B41179283661FA173B1F17D10ADA157170024C915DCC321866C77" + }, + "fixedInfoPartyV": { + "partyId": "FD9899EC1C02BDB78B7D7F919B1768FD", + "ephemeralData": "A97DA6666361E9E73371EB7496385A66B31CC6E2408109F3E911382F456DDD5A" + } + }, + { + "tcId": 2272, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F9A68C7FF88866858D451364425EC63", + "z": "3854ACAFEBA6C0CAD831A55DD78953A6D6079BC924660F603C9796FD8675AB90", + "l": 1024, + "algorithmId": "DE21E525AD2CB1A01CAC38710F199E29" + }, + "fixedInfoPartyU": { + "partyId": "CD8FB0EA27E3E855CCE19A707A1C9D17", + "ephemeralData": "301AED0AC17482BC720B658C7E2B0C2EBAB38DACEF3CBB9D79EB31C2DE7359B2" + }, + "fixedInfoPartyV": { + "partyId": "5BA8DDA4DED200316C5459E153FC6BD9" + } + }, + { + "tcId": 2273, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C537C0A61D61A6222B7C5012C76F87DD", + "z": "AEDCF98EA44725FFCA5771E506ABBCC97C0C1E4838D2E99C042356A943EF7F81", + "l": 1024, + "algorithmId": "351F8997FA9D776F8316F04A6A517C1B" + }, + "fixedInfoPartyU": { + "partyId": "04E3437E282B6B63868CDB9A1779D740" + }, + "fixedInfoPartyV": { + "partyId": "0DA3757F0F834424280FDF3115E953E5", + "ephemeralData": "88F5E476089775EE69F70E99F2A5A9094242BB4B2E457AA22430EEE1F4A470F8" + } + }, + { + "tcId": 2274, + "kdfParameter": { + "kdfType": "oneStep", + "t": "120A5CA103BE4BC88896EFE5FDBEBFBC", + "z": "91ACDA7123399713724CA3A27E7BDC4D46116C76E4BD717B21988BFC5E0BD3BF", + "l": 1024, + "algorithmId": "4030716352CB89ED4EDE306E011FA961" + }, + "fixedInfoPartyU": { + "partyId": "5B11B13174819C263144D1659092B87F", + "ephemeralData": "856140D822055749977BE181D9BD652BC5A1B07552644B99861C6F8CE0C5B678" + }, + "fixedInfoPartyV": { + "partyId": "ECB0DFDF86CC0A7649F2B0E624F8E9DD" + } + }, + { + "tcId": 2275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6AD3F7C7FACAC74ED1F8C6B2AB1B29B", + "z": "57081F5B63FB602CB206F22152D4830E0CD1BDBE2D79F95DB155CC2072D1B7D8", + "l": 1024, + "algorithmId": "E40DAD9C9B2F8C96849F070F6F4D4B3F" + }, + "fixedInfoPartyU": { + "partyId": "B62FF11272CC005DCFC39BDCE5C258DF" + }, + "fixedInfoPartyV": { + "partyId": "F13D55F1D1C0451EB0E5B55B6AF9719F" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 92, + "testType": "AFT", + "tests": [ + { + "tcId": 2276, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C56F74A4EB733BE22E56F5C42F9E5A51", + "z": "A755DBBEFEE1271846531008248BDC40519501AD777879CA64BE0E885E4DF8", + "l": 1024, + "algorithmId": "3F80A2AD6D7DC1874C414EFAE0107E0D" + }, + "fixedInfoPartyU": { + "partyId": "2CA97D4CB5D4F69331F8446074B85212", + "ephemeralData": "9AFA9E3B12915AE4FCF120495A64D023EEA5C02C604506A5B56650190E32EA" + }, + "fixedInfoPartyV": { + "partyId": "D30497FE59CF03ECC28E47A8D3B0B47D" + } + }, + { + "tcId": 2277, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC46A06069544AC2616E4B05276E65F4", + "z": "3C3184AD31FDEE354F69E85FF29C301869DBB7D54A7E9CDF16B3359D16C404", + "l": 1024, + "algorithmId": "D4B0D7D7BDEAA1B99C9AD9F7F35F5C81" + }, + "fixedInfoPartyU": { + "partyId": "AA9901878A8E4E419E13C113B92E5B19" + }, + "fixedInfoPartyV": { + "partyId": "6B5B698137AEE0749AD3E7ADC4383BE1" + } + }, + { + "tcId": 2278, + "kdfParameter": { + "kdfType": "oneStep", + "t": "383D65A33FC9B5FAFDB998AC908366D5", + "z": "6FB29EE519F14EE3F9968573776C2FB5D964E93A1D7411E72193CA36705549", + "l": 1024, + "algorithmId": "073C3BEB9861035C12F2689B13EE087C" + }, + "fixedInfoPartyU": { + "partyId": "147E7B387F9C44423D06CB964F29C6F6", + "ephemeralData": "67C017E82E342F28E94315C07426045E483C79D9E78C5BB3B3C9EE361014DC" + }, + "fixedInfoPartyV": { + "partyId": "C8631F3F3A9C75FC0738A28A0984DDD0" + } + }, + { + "tcId": 2279, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C22E9C949D6E0BCEFC9A9165159E0957", + "z": "F8C79B04BFFE837E2F79B780A67F2DE1FE5A54E3C83CD42087D5D6051F89F3", + "l": 1024, + "algorithmId": "E95CD90C60CBEE478D64090F8EFB1E10" + }, + "fixedInfoPartyU": { + "partyId": "A8B7C929417D81821356BA836D08C0AA" + }, + "fixedInfoPartyV": { + "partyId": "0D858315D782A059790AADF6146F8C0D", + "ephemeralData": "FD6D3BD41929F3FD12B4E4580EF64B56CCB506383AFF236CD7277AEC4B231D" + } + }, + { + "tcId": 2280, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A6722E77F82B78B0F520BD87B1BDBC1", + "z": "4FF03C5ED97906C81762CAD854B57E22384221E755EC9802A471C5C2C788E1", + "l": 1024, + "algorithmId": "4B30049F7751C642376FBE15658859D4" + }, + "fixedInfoPartyU": { + "partyId": "ED6BB6EBE2183650856D3D1796D75E1F", + "ephemeralData": "112B7FB1A1042F11E521AB4A88359CA8C646974CBBFE717EB08FCD32005F7F" + }, + "fixedInfoPartyV": { + "partyId": "B838B23EA51826CF521CEFDCDE908B9B" + } + }, + { + "tcId": 2281, + "kdfParameter": { + "kdfType": "oneStep", + "t": "501A39D8E66C3C8DA41B6B0F9FA8BF65", + "z": "ED08B56C7E34B3F60D5C885ACFC903EEE9569F518E42A8303DAB62A2580801", + "l": 1024, + "algorithmId": "03752455046C1D37C6EF21A80BD9CE61" + }, + "fixedInfoPartyU": { + "partyId": "05C9DCCDF67881BAA1D2CC4C031B03FD" + }, + "fixedInfoPartyV": { + "partyId": "9F7BD12D2DEF61FBA4C7C06A0FE37E52" + } + }, + { + "tcId": 2282, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDF71A5DDFEAF023194FD6C2DF905B9D", + "z": "2CE5734CA8CB028C55ECCE255665419EA310DB8A9AADFD33C0788C2C2CF6B7", + "l": 1024, + "algorithmId": "5E89233101D6CBC089C45E3DCCE55263" + }, + "fixedInfoPartyU": { + "partyId": "3DC43C15E25D9B25D25CF73B4919D4A6", + "ephemeralData": "503F0A718A3193E4A768C6C1B6F48017BF74D0C02A9FA1CAEED1C4F79E4C4C" + }, + "fixedInfoPartyV": { + "partyId": "541132579A7F2A02E1344727FF958D3D" + } + }, + { + "tcId": 2283, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E6511B0D9ECCBFA49DDE152D56FF63AA", + "z": "69BFF18CA54C3F813996E016226985BFEE9BCEDCA0581C1C2EF93A7E08E9B2", + "l": 1024, + "algorithmId": "D1CA6BC06696B352765DBD4C4AEA1D96" + }, + "fixedInfoPartyU": { + "partyId": "CE0174D53AE234B0974C62D7B4AF6237", + "ephemeralData": "0D635BFDE171D1395C17E71F7969EF5C2BA154ED3F87AF1B063BF9A4180CD0" + }, + "fixedInfoPartyV": { + "partyId": "5CAA0DDB2798A8263DC4A7E4BB9C7E3D", + "ephemeralData": "2C80F04E77532C2AB446E6B86E01794CBF085A87D3DEAFB922AE880AE6DEB7" + } + }, + { + "tcId": 2284, + "kdfParameter": { + "kdfType": "oneStep", + "t": "321AE8EA8C01B21EE832967D2AC3B9EA", + "z": "EDA80202AE06F006074115E3CD059A7770199A5A6865FB11506872DC0672AA", + "l": 1024, + "algorithmId": "873A5E0AB3CF68B2D83503B5CDEF239D" + }, + "fixedInfoPartyU": { + "partyId": "4ED72E172FB26881155D5797099D4EC9" + }, + "fixedInfoPartyV": { + "partyId": "530E4EB96BEBFF6B681C361AE5F28A41" + } + }, + { + "tcId": 2285, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2ED99F847E0BE8B216F1796643CBE5B8", + "z": "184DE47E172E2290F05B7E892F44F6FB2FFD7AB4C3501B45DD51BAEB12B427", + "l": 1024, + "algorithmId": "058DF4A39D271F2E9CCBF066CA44140A" + }, + "fixedInfoPartyU": { + "partyId": "9B3DB515278507674AA2E2EE76F8468F", + "ephemeralData": "DADB34F881C8FA53194086816E3438CE615F398CC981C3CBB04F6F3F8810B9" + }, + "fixedInfoPartyV": { + "partyId": "2EBDD9602AAA48F620D8C4D3C56292E4" + } + }, + { + "tcId": 2286, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5F8D0CE5FE1013D426AF1BD566B9AA1", + "z": "932A464792BB510602FDE68120581EED36950A37E46EA382736279785E9F32", + "l": 1024, + "algorithmId": "3B7B26982B3E2A8A628A2749D0FEBBF7" + }, + "fixedInfoPartyU": { + "partyId": "37330C4EB2E8263EC102C7F9F99832B9", + "ephemeralData": "F9B34AFD5BE2961B263D9C72052ADA783C2CCFBE27589D34BF77B07641F3CA" + }, + "fixedInfoPartyV": { + "partyId": "6E03DB6F5CC4D9BA091DE9537DEB841E" + } + }, + { + "tcId": 2287, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A0275F8B13DD695C36316C09A715BAF", + "z": "40CAA661E4A64D56A2D54A43088D926993A5A9511D5895DE6C2B107D6E945D", + "l": 1024, + "algorithmId": "E88CC9292D86D47A387CE3377A6AB06C" + }, + "fixedInfoPartyU": { + "partyId": "1912F9670593EE84D70E5A94D03CD105", + "ephemeralData": "5C3AD0B75583B5830EFED56D7F1818CA380B47693018F287FFBE6D6B1ED443" + }, + "fixedInfoPartyV": { + "partyId": "3D6DDE41A2483C1297D4ACD11DF48D3A" + } + }, + { + "tcId": 2288, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EBCB927775B67190FCC969FFE3816B8", + "z": "F5F24F88F5B13F905BF1FEF1163EB241D8455E6D376E8A4D8935BF5E11532F", + "l": 1024, + "algorithmId": "BFE19EC0286CFFF01C6AAAEF0FC10C27" + }, + "fixedInfoPartyU": { + "partyId": "B05E5E3073EB8C83FF828C6CF82D4237" + }, + "fixedInfoPartyV": { + "partyId": "98FD00400E1E81F83D40CAA3E8C4198E", + "ephemeralData": "8C42F1640B74BAED77940C2E35FA2000E1312A7E1265923E30B46C4C312B00" + } + }, + { + "tcId": 2289, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B5090482A892C0E9C2AC144D4807046", + "z": "5F6FF648D8AF4B88086A1B861A8B8A82F42A81C94F741C1B90221BF66B36C9", + "l": 1024, + "algorithmId": "842FEE2A9643EFFEA7997F74E64B764A" + }, + "fixedInfoPartyU": { + "partyId": "1B6071CFB864DF23693982F3CDC79E6E" + }, + "fixedInfoPartyV": { + "partyId": "AD25474A6BAAE22E5E60CA75BCA00637", + "ephemeralData": "98D9FD8EA0C56F66D4F8A2CEEF11F394EA1639B1B6A6F6225000015CBA2BE1" + } + }, + { + "tcId": 2290, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CF1003D77CFF6E1845801074FCE699E", + "z": "E18F8BEB830FC410E202D4F555CF5A6A73951164603D487E011C0E4E192F56", + "l": 1024, + "algorithmId": "B6ED3BD16F26DD5D1E065BE165941C11" + }, + "fixedInfoPartyU": { + "partyId": "72F3A0C906506882A89E22A218FAEB5D" + }, + "fixedInfoPartyV": { + "partyId": "B8F21698FE8A084D5457FBAA6D1C6482", + "ephemeralData": "52E9A9141954C3A2F0B374732768379CD06F19FB838DD327BB48D17C167802" + } + }, + { + "tcId": 2291, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FDEF0F41D34E7113823B4D6DBF0258D", + "z": "FF99D4AA4A3BC94B1F02EFBC7114B8785830C73BB4704A86D71C2C29D1A323", + "l": 1024, + "algorithmId": "6A7B64CC623614E3F4B609925C73ED00" + }, + "fixedInfoPartyU": { + "partyId": "70E7FF6691694E703E5193293FB636F2" + }, + "fixedInfoPartyV": { + "partyId": "B1B22DD1F05F85842090227FDF64BC8F" + } + }, + { + "tcId": 2292, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E568992DD628E68C8603EFD08CC8B567", + "z": "FA1C3D120FF9B03353C2BE08D36140F24D7338C9E062D0A23936934C428C9F", + "l": 1024, + "algorithmId": "0A69E1E0D4843EF027F266F89B7FB423" + }, + "fixedInfoPartyU": { + "partyId": "4E3A0F6EBB257C31771C9F54349ED556" + }, + "fixedInfoPartyV": { + "partyId": "B4642727999B0E38DD2760C5CB953598" + } + }, + { + "tcId": 2293, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63D7D242210AFD47574BBFCEF42674B6", + "z": "F6705C9A3063A9A296F82E182D042E1FF1018E898DF3526B8A7E65EA60C527", + "l": 1024, + "algorithmId": "4F0C44EBBAAFFECE3992669778BAF461" + }, + "fixedInfoPartyU": { + "partyId": "C8C132DBA1BAE937EA21E325924C26FC" + }, + "fixedInfoPartyV": { + "partyId": "E20FF04D0241BE2F2F34BFA43EF3EB0B" + } + }, + { + "tcId": 2294, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A29AE189EFEFC63A8DBCA026B693A7F", + "z": "33D46E228D5085B37CF7DBA7AD0205562C3DF0C9FB23692DF02AAAEA52AAED", + "l": 1024, + "algorithmId": "4A1664A4A0F74A724B736C1EF0F8617D" + }, + "fixedInfoPartyU": { + "partyId": "B712CEDF023B49559F2B11FAB3EC20C3", + "ephemeralData": "E59DF59F5D5862D944328A04A837EF94BECE9D5A649E2EF52F82001599A8CF" + }, + "fixedInfoPartyV": { + "partyId": "B845C672CBBDBC9EC31E3AC652679973", + "ephemeralData": "13D166CD470973D159F87B35C0F1B991009024A7B2BF639C9BB36A97EF6D7D" + } + }, + { + "tcId": 2295, + "kdfParameter": { + "kdfType": "oneStep", + "t": "292056AB3971BAC2ED43DE48263F3F99", + "z": "ACB4928D943268A88B441167E8122068627A2321CB1660E5889194462B417C", + "l": 1024, + "algorithmId": "A72BA93A63DD0B5057ED03475620AC86" + }, + "fixedInfoPartyU": { + "partyId": "CA221232C65AB60812E57DF8E6B3EAF9", + "ephemeralData": "96597DB7B1DF003BEA6A946F37D16AAC53FBFC62DD82B53818B96E99190957" + }, + "fixedInfoPartyV": { + "partyId": "0CAF07FB42AE9B318B139A88354D6846", + "ephemeralData": "34EF27E5D405465711CAC5AFFA97EC5BBA60088E98DD1FECB35AEB40C71906" + } + }, + { + "tcId": 2296, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7AAE4651064D5C8F0F1BCF36BABF9750", + "z": "46548FE5C80AB8C172140E3399EC9B5B14EF7290F8297C9E31FF5EECB7F85F", + "l": 1024, + "algorithmId": "4594C594787DF3C3975ADD415819D390" + }, + "fixedInfoPartyU": { + "partyId": "9D8BD70C3E216550E7A80D9B1803447D" + }, + "fixedInfoPartyV": { + "partyId": "280E4B365434F6864B6C7AAC646BF147" + } + }, + { + "tcId": 2297, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C19489B61324135AA7C788A34805A7D5", + "z": "C692EFEF7124589E2D4F6EEA773FA6085EDFDC70076835E4964B969DC1E0A8", + "l": 1024, + "algorithmId": "3E6AFEA8935EDA4D7CA61402CBCB2026" + }, + "fixedInfoPartyU": { + "partyId": "CA57813B1321108AA7CC3DC7EA9C45C4" + }, + "fixedInfoPartyV": { + "partyId": "A2F4A7DA724523B35953AA11766D1CB4", + "ephemeralData": "69B035871A1490499AB35025D33BF659001CF23B4CD9EC97D9CB97F4402A42" + } + }, + { + "tcId": 2298, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5529CE0EF3F34B4E8DD65993CE617D08", + "z": "45D0899B7C49A56ED9C4B5FB1D2FE6E2D605BC37CB4CA2DAF78C2DB588A365", + "l": 1024, + "algorithmId": "09E3E6530515091F54C47DE7CBD77CC8" + }, + "fixedInfoPartyU": { + "partyId": "D09F8D462C86867BDC2D5EB0A0BFE050", + "ephemeralData": "E092972E74A153B8832665FC577B06D1505B0FE30F19CAA19F2EB1DF0D1174" + }, + "fixedInfoPartyV": { + "partyId": "6BF81E44E5FF20B19F66C37726337806" + } + }, + { + "tcId": 2299, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36B4CF5369D790B2C36BB9FB5D5B65FB", + "z": "BD74B36191B7ABB7E7ED802EC7957849527D09AD0C717C03647209D71FDD08", + "l": 1024, + "algorithmId": "E90CC985332241AF11DE8AF1437B1771" + }, + "fixedInfoPartyU": { + "partyId": "BABEAC89E1580189DF35A9A82BEB8CDF" + }, + "fixedInfoPartyV": { + "partyId": "085003E1522B67F61AB68608BEF08E3D", + "ephemeralData": "FEA88D0A42B1103406D6FF8325245DFDED0B5D0C272D3DB6439FAA521D202D" + } + }, + { + "tcId": 2300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1FACF930126A20AE098539E13DFB7A2", + "z": "DE6E9EE909E41584AB8B95C00BE77678AA427372AC69D3FCFF29525C90A8D9", + "l": 1024, + "algorithmId": "257B5387CD9EDB90726FC58C13C4ADD8" + }, + "fixedInfoPartyU": { + "partyId": "6D25A6343FE3B878D21EC2DFF4CCE0C1" + }, + "fixedInfoPartyV": { + "partyId": "655D15206E470BFC4E3C39C3AB8BAEF8", + "ephemeralData": "A25863D7B6E2A590A7FD32E3F0F14176EFDD774BB208921557B5CA4EA692EA" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 93, + "testType": "AFT", + "tests": [ + { + "tcId": 2301, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44F0512594CB3713886BEA107AA2E29A", + "z": "BCAB73AAF977CCC85016B3752420A76BAE266B381E3E749541EC29F21815E1A1E1A08CCAB2", + "l": 1024, + "algorithmId": "1D65487626EFEAC9F15C1B4EC6FE900A" + }, + "fixedInfoPartyU": { + "partyId": "E5EC768CC37D477EC11E618C00F93BC5" + }, + "fixedInfoPartyV": { + "partyId": "C82296F3B12550C5CBEE6C7B6C224796" + } + }, + { + "tcId": 2302, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4954A3C2472621246B46838F71299722", + "z": "8C84FE048065571899112C9AF92B03797FC9877751B80C243D1A06D4FE47E52131217CE5B4", + "l": 1024, + "algorithmId": "8E1A0969B24ED509195FC032500640AF" + }, + "fixedInfoPartyU": { + "partyId": "1C4BF66E14FF2E2C7DBA72E2B2005DF9", + "ephemeralData": "A2C33AF5480C212AFC2C6BCDAE48069D17861A582B88263899A17DE6AED4F5972751E13AC9" + }, + "fixedInfoPartyV": { + "partyId": "309E438CD8F692DC3D8B34DD0AC5D13B", + "ephemeralData": "8F0E80B2DB83E76F53743AD10B7B69397C5486F0E563FDA45871C483D8C92C59A299332C74" + } + }, + { + "tcId": 2303, + "kdfParameter": { + "kdfType": "oneStep", + "t": "536A0B365DE551229A425181DA7BFC9C", + "z": "7A78437C04EF26882089023103C7BC39F89C932256D91318D320358EF10DCFFCD6A27233E5", + "l": 1024, + "algorithmId": "177BEDAB28D06EFA5CE605DB25CB4518" + }, + "fixedInfoPartyU": { + "partyId": "7713070B3D0AC7221CF2E86D2DA041D9", + "ephemeralData": "02972137771280144BF869E0AACA508A6FF3E17D5E9BD4561B456868ED45F9A49FAB76AB5A" + }, + "fixedInfoPartyV": { + "partyId": "328AADA2357006D6898080E7A69C39CF" + } + }, + { + "tcId": 2304, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAA6597BB126BD4C39107E27D59E3080", + "z": "56569AD1AF67874E59B74E7B6696B8A1CBE87DA59726E92D5E8B957FC5AC3DBCD36CBA2D7E", + "l": 1024, + "algorithmId": "788C1184189C55C003FF7F749AB47614" + }, + "fixedInfoPartyU": { + "partyId": "DBD51AFFD31EDA85E8A810F1F2C3A41F", + "ephemeralData": "E1BDD1F18CB23359E32FA1E0AD0F90D9F6BA0177CF93938DDC2EF77753866E57062375DCFF" + }, + "fixedInfoPartyV": { + "partyId": "D4A230408A4CA9BAB0989D6C544C1833" + } + }, + { + "tcId": 2305, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7910DFAD19FD239E24E13BFE07F5F30", + "z": "C2B79E5B5ABE8248023E2BE348D22247BE2910A52C7914E73E122DD108516AC99AC9722420", + "l": 1024, + "algorithmId": "682634DCBE42EBCC7D19A11065C696E5" + }, + "fixedInfoPartyU": { + "partyId": "FC54A525BE52A43CE5EDD72DF566CD5D" + }, + "fixedInfoPartyV": { + "partyId": "5D49E2B86F4FC04E2C9EB680A002D928", + "ephemeralData": "527CD66D6108C183769D17DEC9C716DC21B5C532F2C12DA3DD7FD83F0CEC346F9133AAD8CE" + } + }, + { + "tcId": 2306, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D47A0F40D8B318544881FDBCFB840138", + "z": "A7D58170B0E5715225C4E309937C726D0E4EB7CAEC1247A9CB54AD65118717EDE572B73644", + "l": 1024, + "algorithmId": "28135F0BC5452AF4B22BD8DD38511479" + }, + "fixedInfoPartyU": { + "partyId": "5776ECA0D0AB7C2D4F57E9FCEA4B42A1", + "ephemeralData": "11A9AA848DFB6584F3388C662C1A8312636C884B6B72285AA3C8F3BF625209DBDF3BC3D7C6" + }, + "fixedInfoPartyV": { + "partyId": "EEA1355E83228987632A99974166C26B", + "ephemeralData": "56F5BCA10DC44F95B46ADDA5B75878CC2A2189FF607EB01F3AF859DE5ED14F780FA853B4C7" + } + }, + { + "tcId": 2307, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A05AFFF851177BFFE22560F3617B6CE", + "z": "912866DE2891C1D358F56F9CDDFAA156ACFE457CAB4628ECE839FA81441B61B57E49763CF8", + "l": 1024, + "algorithmId": "9FFF07645F682E41C059696D2F9AFF51" + }, + "fixedInfoPartyU": { + "partyId": "6A82DACA4ED215E85C8EF1FB541921B6", + "ephemeralData": "8CC30021273EF98DA79D86F49E1364B1A92B5BF5B400860A1068BF70C36B45E16B7B9BA2DD" + }, + "fixedInfoPartyV": { + "partyId": "27E4164D4C0BD8F3CE8037E8D43F4A16" + } + }, + { + "tcId": 2308, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2404D87A8825864F43F97E463B02CC29", + "z": "F37FD4A8CE74801BE06763FC74AC94E4B2463CD2E40F326245A0CD2B3D1367C0D3E6E55993", + "l": 1024, + "algorithmId": "5F24D9D868CCD34DFAA305EEB33F6E2A" + }, + "fixedInfoPartyU": { + "partyId": "9BA7A31554EDFD59B01BFDEF65698B3D", + "ephemeralData": "BA253610D9D977CB1376FE1BFC79E6C2E0D347A71CB38D9DD158AA2132FF5CD77239C4AF72" + }, + "fixedInfoPartyV": { + "partyId": "60FCF9A15F60875770DBBC660DB4CBBA" + } + }, + { + "tcId": 2309, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0239DDA7D0592DE0B753DD83D1865405", + "z": "BE3302CDB2DB6057F6A7AB2686ACC06868C75770ABB9E1C519FDC4FE4584A4A662CF587FC6", + "l": 1024, + "algorithmId": "4C7B16B2C9CFEBB8072750D48BDEDA8A" + }, + "fixedInfoPartyU": { + "partyId": "8536259F4B1A9E5519848B01AF5EE9AC", + "ephemeralData": "74A53240562931565B908731923BDC6717F987FFFBAEC34C4BE89EEE8EFDFB3C48ACBE5D9A" + }, + "fixedInfoPartyV": { + "partyId": "AF26A49D57520A31E69D73B262AD6412" + } + }, + { + "tcId": 2310, + "kdfParameter": { + "kdfType": "oneStep", + "t": "777E384E7685FD664438E64435268909", + "z": "8239841793DC1CE5599A2012381A4E05CA533AB707CD2C0143A314C79325D9AD40CA60C569", + "l": 1024, + "algorithmId": "C014E2FFED8E11146A5CDE9886567001" + }, + "fixedInfoPartyU": { + "partyId": "FD976EB7D0650195D17DA101AF5C804A" + }, + "fixedInfoPartyV": { + "partyId": "F27C2B0F38ABADCC3E8D2E92457664AC" + } + }, + { + "tcId": 2311, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD36739820A2D12E5106A028384C3110", + "z": "1FE00601ADF8D108611B7985D2EA03108A4736AE887EF0972685A53E9EE96BA2469D880B18", + "l": 1024, + "algorithmId": "FFA5A7EB1EDFE46B692804ECA8D7D88A" + }, + "fixedInfoPartyU": { + "partyId": "3CE99824E0972A81FAE99A63C56EB807", + "ephemeralData": "D8FEAEBEBBE7703D3AE25A51EF1A762782C8F5805F109025D8AD6C96885029C1CB9D070753" + }, + "fixedInfoPartyV": { + "partyId": "F417C4CF0605A94D7C04DA7445F73C81" + } + }, + { + "tcId": 2312, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B2CAC55A8BBEEA8EA08CDDEE5D5E5B3", + "z": "69373B6EDF841CB9AFA6243656EEACAF834EF382F09C2A8DB54EB8BBF7AC58789B5C8ECFF3", + "l": 1024, + "algorithmId": "1FD9F7062E990C3171616B95CD205FBB" + }, + "fixedInfoPartyU": { + "partyId": "B9D2B71FC41B34BA1422ED298C3B837D" + }, + "fixedInfoPartyV": { + "partyId": "F351476F339F3EFCB15365059F2343A8" + } + }, + { + "tcId": 2313, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C137843DF532ABFB8CAE4643F761E698", + "z": "E2E4B262D848BA99C9B3FD5C5B4C20190E2A3829C5539780A653E872EFACDB1DC7F39B0A3F", + "l": 1024, + "algorithmId": "0BBE7DEFF12310CCF88EFC5FF8E80A93" + }, + "fixedInfoPartyU": { + "partyId": "4C1430DF147BE55A5ED108B40A7A44CA" + }, + "fixedInfoPartyV": { + "partyId": "B2CE447BA0B755E328206A984EEA26B2", + "ephemeralData": "8E2F356D61ADA0DFBE19B2D1E25AD93293FA8BAFCCFBA569EA9F827700EE4F105A20BDE4FA" + } + }, + { + "tcId": 2314, + "kdfParameter": { + "kdfType": "oneStep", + "t": "010905FC576EB283AC4F8B93A601596C", + "z": "4F8770CAD308EF43A42487C8F73465C2277547419B488C122BA4DDCC81CCB144C33F461C96", + "l": 1024, + "algorithmId": "3A3795A306CBDD0EEB9B13D60A7446C0" + }, + "fixedInfoPartyU": { + "partyId": "BDBABC25257080AAAEC72534A72876F8" + }, + "fixedInfoPartyV": { + "partyId": "04A161D0D4DD3D278DBCFB4711B6D3DA", + "ephemeralData": "9EF0182B21CE1EDADAEAE70C1A6B7BB03DD09CEF3F4B34877EFE16484C859E9CF2CD1FCAA3" + } + }, + { + "tcId": 2315, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EFD5332EC17B7A67DBE684C58107F0B", + "z": "D28CF2EB0BF90F41B1655C7040278FE4495652B7405A8F2C30C4160467E1ED9D32F19431FA", + "l": 1024, + "algorithmId": "21ED66BEED2A084D412DC81C03EEFF90" + }, + "fixedInfoPartyU": { + "partyId": "007BACBC287A4DFA5248F12F926EEFFB" + }, + "fixedInfoPartyV": { + "partyId": "023944B91CF4252F8840C1B06CA215F5" + } + }, + { + "tcId": 2316, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AC1899608BECA0E6688CE57699524B4", + "z": "25092BA80B49B37728C8BBD8DA5F2CA811ECAC2FE7AAF16DA1556A73E3164C7644BC6CE42B", + "l": 1024, + "algorithmId": "D8CF92EE57B3CDD2497FE692CA3F632D" + }, + "fixedInfoPartyU": { + "partyId": "DC672013D9A1C53364E4857ED73E9412", + "ephemeralData": "51A8AF366C4C5614EF1A13A7FB482292146E9AD484E741F84A21BF6CEE83BB6CE20DB783F9" + }, + "fixedInfoPartyV": { + "partyId": "CC4C8EF260CCE8422419905482273018" + } + }, + { + "tcId": 2317, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B0E480765D712FD3DCC861EAA4442C6", + "z": "0762C86A750F26F99A3F3431F78A7CC2D550CD5A89869D1E1389BFFD61CF9CFBA9388B0564", + "l": 1024, + "algorithmId": "19ED93672D0684582E5E7251316FC311" + }, + "fixedInfoPartyU": { + "partyId": "7BACDB5174DE2942C7204974A5CA70B4", + "ephemeralData": "DA26A4B8947A1D49CA5608B4C35C7961AA03EAD47E3B56A913AFD668355DC777410088A1C5" + }, + "fixedInfoPartyV": { + "partyId": "C207D23987802F1749E13F4703F97307" + } + }, + { + "tcId": 2318, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2C59E1B1248ED3453BA020B57E108DE", + "z": "CF67E53812C33662FB453619B8336935C925F45457089C3353DBA0CD5AE0D42DA847F506D8", + "l": 1024, + "algorithmId": "F3D6C46DBEFAD761527443326B6D7335" + }, + "fixedInfoPartyU": { + "partyId": "AAC7BB3F500100DF613DFD0033B14B8F", + "ephemeralData": "CB424072186FA7BBF53518D8D22C38C9F24308C739354D1AC8DD96F8E58FF68F8FC29CA3F8" + }, + "fixedInfoPartyV": { + "partyId": "BEF3061BB3E51683A6041AA4BABCFF0C", + "ephemeralData": "D811C5B1B0B4B5DA8132C14E8533AE4E884BC82C690ADA56C527502999C176B6F06F6A2EAD" + } + }, + { + "tcId": 2319, + "kdfParameter": { + "kdfType": "oneStep", + "t": "318D55DE20B3369D26335DBA6CC01BB5", + "z": "4BBC2B4F1C040FAB78AD667087B907368DFD39F133225735F7DB4714ADC187F1E9393E24BE", + "l": 1024, + "algorithmId": "CF5B8AE0EA81A959EDCB2BE40497BA16" + }, + "fixedInfoPartyU": { + "partyId": "1BECEC90DF682F5816A5BFFE94C3E521", + "ephemeralData": "9FA4AB8CE922BEE7CEFE412FA361778E68750B11D69B09A7BE42050249D98A79B1851C87A4" + }, + "fixedInfoPartyV": { + "partyId": "E0DABA445F8799D3A0BDB5BB386C70C6", + "ephemeralData": "9494654341E32D8A9EB995CFC1B9D9AD3D9FA110FB64FC3159E343620A8C3882E1BA101627" + } + }, + { + "tcId": 2320, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE1AFCBFC24F679730B0DCCB888F5D31", + "z": "D0F85AC9AB5245BE5170B3166479060761C37CC5B9208DDF8B97EE2654E4AB40D5BA28D5BD", + "l": 1024, + "algorithmId": "6BE2F8CD1877C54E0581A1D84A471556" + }, + "fixedInfoPartyU": { + "partyId": "7FFA082FDAB8A518EEA533AAB2F09628", + "ephemeralData": "29A47C53D24BB62296FA714B8B60D3B6108C2F91509484C2EC9CE095923A8DBE55AECEB64C" + }, + "fixedInfoPartyV": { + "partyId": "CA77DE4533E22C52C49D187763D7D321", + "ephemeralData": "C1E60CDE803E4350C78E1F399B359E992857BD2E6AE04598C995DF70A4924C09236DE29546" + } + }, + { + "tcId": 2321, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3657D3064598707CBF579D0FDD3CA5A0", + "z": "89A390DAC037BD16AA1000EA794BE3FD0CAA251527FC4292EEB6BF19F20B3459A53AEEB590", + "l": 1024, + "algorithmId": "ADE177582111170BC35B42817CAAD1E8" + }, + "fixedInfoPartyU": { + "partyId": "AEF01E9B2EE9D1A1DDF6EA31704708A6" + }, + "fixedInfoPartyV": { + "partyId": "9F0213F6885CDC612358BAC1A2D1932A", + "ephemeralData": "D0E29D288EE7BDAB559A0ECF4DEE4DE5E6D1FDB01389CCF80EE21619D86EED12DA39DE0D80" + } + }, + { + "tcId": 2322, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF62E5DD59A370AB00113049449F7E67", + "z": "38ABD3D349503250CDE7D7126A1002DB2549453DAC2BB7FDFBD6A8D2B4CC5FE5A165A5D2A3", + "l": 1024, + "algorithmId": "912ADD7D77B3AC350FA9715783137C40" + }, + "fixedInfoPartyU": { + "partyId": "9F9FAC78B9AE053A877690D31E81F0C5", + "ephemeralData": "DB0B1930B092A3552D280D2F888B4B522AC44DE7F20C29278D58A064FE780D8EFB95CFC8BA" + }, + "fixedInfoPartyV": { + "partyId": "52C585AD84DEAD2FD62CD5A67361C9A3", + "ephemeralData": "8EB141D440DDD080A32F8258B51E7C8450EB1D4F301D0D5DA80DC0A84AE581CB0D447C68EE" + } + }, + { + "tcId": 2323, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F1E1FECC743899446C1AB0E8C998837", + "z": "F545EBC5577C1CB0E66B20B301519CD4BACB0EFAC9E9B2B36C6AFD761391631CA54B82EE1D", + "l": 1024, + "algorithmId": "37B677340855759B097729F4B4F9C3FC" + }, + "fixedInfoPartyU": { + "partyId": "10F1FD5AD6E0D956AD977808251A926B" + }, + "fixedInfoPartyV": { + "partyId": "6CC8A613815963AAF7FCF249315148D5", + "ephemeralData": "1C899F66691833432C3D145D2D1E9F21C4F3A2EF056B2BB28C9540D9AAA3055CB1A6F3685E" + } + }, + { + "tcId": 2324, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA2181C6317063968CDF5899E5E48613", + "z": "7489E0D1C6D4E6C3780FBDADFCD85B59B7856E331446443CFD07037AC89E4F2C0527A8A2AE", + "l": 1024, + "algorithmId": "48E71D2C8FBBE755ADF4E972543ADB31" + }, + "fixedInfoPartyU": { + "partyId": "13921D291F5A8FD7551E1D4637E643BF", + "ephemeralData": "428B9D2AC053A64FF0631D24833C3B704E87EF54D2BA5B2C402F9405253F6E572BD0475533" + }, + "fixedInfoPartyV": { + "partyId": "A2C85764FF6397268A1720F778EC94A3", + "ephemeralData": "72DADD34B0DDF78B63B98D5CB22450560F03BF2E78CF8E156E405FD64F0B39064D0A19C24D" + } + }, + { + "tcId": 2325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C0D213219136A669A6ACDC141375CEC", + "z": "1031E25BD3A8800A6ADCA84077A2FAE87871F3984ACDCE32F3E1AEAA15368D6D893F7C01CD", + "l": 1024, + "algorithmId": "79338C33AFE8E1C9B3237E460FDAE170" + }, + "fixedInfoPartyU": { + "partyId": "2D99CE469C34A6891F162B00CF7EEFF4" + }, + "fixedInfoPartyV": { + "partyId": "9C50970D062A0BCCB1C449C8DA07E514", + "ephemeralData": "B8F07888FFE40E7B19EC1F341EBAA62C352AFC47377AE63B24407499ED83E3BC77A174A955" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 94, + "testType": "AFT", + "tests": [ + { + "tcId": 2326, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03388E686ABE7B223F515AA2A6AD7038", + "z": "7593F9BE31798F20CF029AF0B46DE70926B5E825E095B04F19C8DA43", + "l": 1024, + "algorithmId": "BA13D7834A0108075C262CF1B5380F8C" + }, + "fixedInfoPartyU": { + "partyId": "B981CDDB886BFA0EA907FDD078F4BC6E" + }, + "fixedInfoPartyV": { + "partyId": "1D565A9660B4E3698CCE79090E3A362B", + "ephemeralData": "521A66EC2642646758C2938DC00E53F37A2FF6A5C3E00B563CF46972" + } + }, + { + "tcId": 2327, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDB67B52B3D55C0E2C19053C7B3EABC4", + "z": "7D61D29D6CD5E481EDB1D8D589B56F091A5D40B5C1E2C578E19EE4AF", + "l": 1024, + "algorithmId": "8AD76C18185C93266A9A6BDA6FFEB672" + }, + "fixedInfoPartyU": { + "partyId": "FCC67DC8FF11F5CE34689FDCAB17E795" + }, + "fixedInfoPartyV": { + "partyId": "64A644320ECB3BC9CA79DD4CA79E22FF" + } + }, + { + "tcId": 2328, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C518E8C78D95126371E93CB19E781D84", + "z": "1B765C7D316E1945CE0203DF2E61873BC6A9A93B5A5B6BAFA98E9198", + "l": 1024, + "algorithmId": "01BA7135717413AADE69A12DDACD676E" + }, + "fixedInfoPartyU": { + "partyId": "08621EC2185110E3A3D8AEFBC216DC0B", + "ephemeralData": "B1CE4BBDAF8CCAE7925F4F40F5522B5D237F804AE6C4AD67B1DB3623" + }, + "fixedInfoPartyV": { + "partyId": "2EB1DC522EA4699A265A9E65B6270BE9", + "ephemeralData": "AAD65A2CD1BEBEC8593EFC12DE1CF32CA958AB7602CE8223FFE5857F" + } + }, + { + "tcId": 2329, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B861311C5C0F8EBD3F5949B86EF1F9F6", + "z": "706CB1948ADF83BD187C795F5850F415D24A93957A515D469DE495CE", + "l": 1024, + "algorithmId": "AA4E17D717712C90202EE9FF2AF1EDD3" + }, + "fixedInfoPartyU": { + "partyId": "24D876A79963B0334149B9CA5F03D2D9", + "ephemeralData": "16AF250EAB5C07EA90C3A0E0F094095AB64BFA48B4A3FCB63EC82986" + }, + "fixedInfoPartyV": { + "partyId": "BE82AB60D62332A4880D8ABBAB4671E2", + "ephemeralData": "7CAE4B0CFBCFFBA0B3D7D28D4C912F1DCD7F149314D6C6A9CEA6D98B" + } + }, + { + "tcId": 2330, + "kdfParameter": { + "kdfType": "oneStep", + "t": "728281440CA10AE80EC25C84A4FC2CAD", + "z": "46B497000DDBD1705376C74F1A9406C7B00FE18FF7BA338CB37A3DB0", + "l": 1024, + "algorithmId": "859F859A32A04A2B146EF8519CA6C269" + }, + "fixedInfoPartyU": { + "partyId": "A31504717AF9EB0A5D812DC7A9CF6257" + }, + "fixedInfoPartyV": { + "partyId": "7FF4B36D62DE022E0B7CBC8676E14612", + "ephemeralData": "A32B999E53A5D0D0D251EEC037BC6BE2FCCE630F36849AE865112C9F" + } + }, + { + "tcId": 2331, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70A78FCDAE63A89B84C9FBB3C8AEAD1D", + "z": "A99BB050A1BF0F2230022AF3C0E1A0BFC52AAD9B71C1B8091BEFCF07", + "l": 1024, + "algorithmId": "EFB0F2272B8A3D9C4AD2A55237341A9D" + }, + "fixedInfoPartyU": { + "partyId": "052D3CEB64E69502582319960D7C2441", + "ephemeralData": "445DBD887CA52E1C30772F171D59CA4E0FF84D768CA2BBA3C7FBC404" + }, + "fixedInfoPartyV": { + "partyId": "CC1F80DA689EE1A0EB4CCFB9E2E5449D", + "ephemeralData": "91357C6D7E7F56166831EF5D5DE53F7E1ED5B4D5B50DD4468CCAB348" + } + }, + { + "tcId": 2332, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29385DF942E91A56B4842BDF84553D5C", + "z": "82282253DD1F2438CDE61901A6AD0BF7D536917B60508C87331F2E95", + "l": 1024, + "algorithmId": "980E8E59CB07ADEE92E19C9D7FD6D808" + }, + "fixedInfoPartyU": { + "partyId": "4D08F4ECCF11DA6E2A35DE7590999EB3" + }, + "fixedInfoPartyV": { + "partyId": "6365DF420F71F16A77DF40426D4BBCAF" + } + }, + { + "tcId": 2333, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3629A3EC912324A6AF28C24FFADED0FA", + "z": "BDEB1C9AFB4352C7BEAF6D42563D6F32D9127D97C5FC0FDEEC81CA90", + "l": 1024, + "algorithmId": "0F8FECAE6DD1663027A1E6E291CCC2BD" + }, + "fixedInfoPartyU": { + "partyId": "D16219D4EB31A36BE3DC9B3C8C3B10C2" + }, + "fixedInfoPartyV": { + "partyId": "23C15286873E6E6BF37E4FCCE7377C4E" + } + }, + { + "tcId": 2334, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1915D426B174A9AAB8903E7BC7465E48", + "z": "0AC8C4182C409438184ABE90D456E9916E93DB8EE2C3F02E90426199", + "l": 1024, + "algorithmId": "9B83D55B07D00721D12D96B3737CA86B" + }, + "fixedInfoPartyU": { + "partyId": "A038649B576DF292F96DB7F14DAA7B21", + "ephemeralData": "519D415D7BDA7C463013C0B8286A78162105E0FC896821A052C12621" + }, + "fixedInfoPartyV": { + "partyId": "D6F5C4425981B8079DF681A05BD47DF3" + } + }, + { + "tcId": 2335, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDDD5555165B92931FB9997FE5465CC7", + "z": "ED8019F688FA9C9FD9BE8C5CF8AF25266B41835973378B01406F40DF", + "l": 1024, + "algorithmId": "ACC6E98E35876CCEF196007F1338AF21" + }, + "fixedInfoPartyU": { + "partyId": "FB8CD2253CAB857A4E55B98F789C80A5" + }, + "fixedInfoPartyV": { + "partyId": "0AE74AE745432E0397C9B963E36DF94E" + } + }, + { + "tcId": 2336, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A2E6451AB09BF1953BAE66DAA95A189", + "z": "F6E609B11B4EB41632D1037C0D5C68B60E066320FE03B1C181187B0B", + "l": 1024, + "algorithmId": "AB3289966222D6F1FF4417B5005D6B01" + }, + "fixedInfoPartyU": { + "partyId": "098A979ED7EAB1701A5787A78DAD980E", + "ephemeralData": "19CB9C42112F6678B687F00DCBB8CFFD2C5784FB934D2EFB62B19DAB" + }, + "fixedInfoPartyV": { + "partyId": "03ABFA5F6A1293346C063B442A7F94F9" + } + }, + { + "tcId": 2337, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E25EC2B2787BD720FF9B033A8DD4467", + "z": "F15DF4467E28643014CCCB7001631E101946D13C0A5687DB2BCE2F6D", + "l": 1024, + "algorithmId": "EBEDDA7CD83B4CCA0D5AA2AFD0043F2E" + }, + "fixedInfoPartyU": { + "partyId": "616BD2EEE00FC10C4C6BFC26DEE2331B", + "ephemeralData": "BCAEF516B213F368EE09EE6429E6E45006090D11205FB6855A54FEDF" + }, + "fixedInfoPartyV": { + "partyId": "EF14BE827C969708F66714C6F85D25EB" + } + }, + { + "tcId": 2338, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22CC05F1CB9E5C6DBB02B6B9C84C0C5E", + "z": "3B0B4F49366AF71D4D4F2E949F7CC0B90012692E9C74D46DF674ED30", + "l": 1024, + "algorithmId": "59BBAB96CE2CC9CDFC915898780A4CED" + }, + "fixedInfoPartyU": { + "partyId": "5099AF988AECC436A99E09FCC80AC6B9" + }, + "fixedInfoPartyV": { + "partyId": "C81DAC3E8239057FB6C336FEDFAC0202" + } + }, + { + "tcId": 2339, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89BD2B72EBE721EA0059506BC79643F6", + "z": "CA91925FB4AA4EFAAEDB7DCF80EF5FC5BE72312C7C2174616E766801", + "l": 1024, + "algorithmId": "2190F4DB79DB40BB0B881DEC7C93B805" + }, + "fixedInfoPartyU": { + "partyId": "399A1A2182BF217D7378518390989D36", + "ephemeralData": "BDAD027CE7743BE2988E4557E2CF0EC1BDB38F0F50F41C67328B3B9A" + }, + "fixedInfoPartyV": { + "partyId": "C2733FA481CE980657C4D770B3E08C58", + "ephemeralData": "77BFDC774AE94CFFAE82F7376E65B5A3C65FFAA00BD4C99FF012BCB5" + } + }, + { + "tcId": 2340, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB5179D5ADCF57CBC3DED1881B803F84", + "z": "B3A97F964914D83CB3A168882E79AD62B3846DBF60F000A97782FE4B", + "l": 1024, + "algorithmId": "C6B386F38296A6CDA7306D0B7442751A" + }, + "fixedInfoPartyU": { + "partyId": "1A5B204E831D3B04F5369B5553D1839D" + }, + "fixedInfoPartyV": { + "partyId": "5729E138E973BE9DD86D25A0DD1D612A" + } + }, + { + "tcId": 2341, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1BD3CCE3D7C9415248B48F5EEB6A8B66", + "z": "4D8DB5E10730C6D649D9359A043C5E31D1EBB35028C20B1EB9998E5C", + "l": 1024, + "algorithmId": "A8367C67D05087C96B2C5B8EDFFE9697" + }, + "fixedInfoPartyU": { + "partyId": "AA9B42C95A897CE2D87434B3FC875492", + "ephemeralData": "AB1D2164EAFC1DEF2BFB96747E68D7915E95448AF2AE3DC504F317E3" + }, + "fixedInfoPartyV": { + "partyId": "F02809D917CD48999EFE64862B94807F" + } + }, + { + "tcId": 2342, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8830332DB123A0E59F027158F600A11B", + "z": "8119B5642084D66CB9C45ADF9B659900C75685A7C55AC94C8C0FAA55", + "l": 1024, + "algorithmId": "BFD94516F36DC48F6E64B422FE556692" + }, + "fixedInfoPartyU": { + "partyId": "D24F3A4751724C366B9EE5935B41B390" + }, + "fixedInfoPartyV": { + "partyId": "B09728EE257E1B776FD2D1873B4B9F3A", + "ephemeralData": "1FC91BEB6EE10845CD152A05B187327172E79365FAFB1B34FB44F335" + } + }, + { + "tcId": 2343, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D3C380A17E740717D0F083286FA01B36", + "z": "79909B4B118CD8C303886096B31D5EF27C78DC8622DEAC0F21D51721", + "l": 1024, + "algorithmId": "ACEE3E3011D389B4693BAA80A76B3C95" + }, + "fixedInfoPartyU": { + "partyId": "4CE87E3C899DCD6819F0FFC534C7BD35", + "ephemeralData": "C2C84B046DF2B64314C9EC651C74D5C48A490FC0F840E7C1E9B9DD74" + }, + "fixedInfoPartyV": { + "partyId": "F0053C86D57490D6BDD7063FEF45C6FE", + "ephemeralData": "78D545B6FDBE4B59CAFAF97E1F76E44BEABDC7381F91D76C29F8A48E" + } + }, + { + "tcId": 2344, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04C8EBEBB1A1E6BF9DF63BCF948A0ACB", + "z": "98DB93C5E5CC43C946B36C9E164DB4F431CB06FB9AD5080B5C855EB7", + "l": 1024, + "algorithmId": "6BB1EBFBCCCFBF5FEE56057F9B30BB20" + }, + "fixedInfoPartyU": { + "partyId": "C898F035C35F54659C14CBF77302A563", + "ephemeralData": "0D49B0B09F293A570356363C2C7797A092733A82377E128B990AA8C4" + }, + "fixedInfoPartyV": { + "partyId": "90743C8392D7FFD1EB017503AAD910F0", + "ephemeralData": "5F3D5B8B962A8EC861714671C9DBE86A7E8A17C442B9F896E7BDC50A" + } + }, + { + "tcId": 2345, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC1671EA4BFA90915E35FC9C38D07C69", + "z": "1143566F0D99B39B0D423B1F49F758C475EE84518AEAA27C30C414C4", + "l": 1024, + "algorithmId": "343065DD01419033E49F00A2D5B4A40A" + }, + "fixedInfoPartyU": { + "partyId": "17E64591C6B7FFA1C83D557AC2FA5305" + }, + "fixedInfoPartyV": { + "partyId": "5F26C1B67B1051092EAF2BB199399ABF", + "ephemeralData": "2C0370934B2754780ABBAFFF82CD557B7B831FA72E1B6EFB2B8AFE84" + } + }, + { + "tcId": 2346, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C1A3D1DA96193DC4B2C64E67D807D62", + "z": "93EDBA89AC42DD8BCD24C2DCFE4D47A122C3C68C5C6F2A15600A1B0B", + "l": 1024, + "algorithmId": "AD34BB26252520FDF5352D27CA06B511" + }, + "fixedInfoPartyU": { + "partyId": "20F0240E3798D3B10B19D805C0D88CCC" + }, + "fixedInfoPartyV": { + "partyId": "3D5AD65ED92DC14D195ACD634695AA0A" + } + }, + { + "tcId": 2347, + "kdfParameter": { + "kdfType": "oneStep", + "t": "401548C3472CCD58A1C254084B4765E7", + "z": "03442E4E5EE8B6BB947EA18EC9EE3E6EB24E6ED9E4626107D02F55AA", + "l": 1024, + "algorithmId": "3BCDC754D5EDEB29D41006D09CD011B2" + }, + "fixedInfoPartyU": { + "partyId": "997263038633FD98FF2AADD6E110C9D9", + "ephemeralData": "6D9031EF14C1DC6D5E100A5F1CD881D16CF48480CA22B963DE193310" + }, + "fixedInfoPartyV": { + "partyId": "285516ED0F76242BFB3D584F445891F8", + "ephemeralData": "933AF1DC43781CB02BEED1B52931EF047234973A6159A3695B7BC693" + } + }, + { + "tcId": 2348, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52C402C5A363C64B823CAF835B73D858", + "z": "76FA926F2F104498C0DB863064F29001F86270438B5918C72F2DC31E", + "l": 1024, + "algorithmId": "18452D1C2A015465D721833D4514ABDF" + }, + "fixedInfoPartyU": { + "partyId": "1318E77E40511600580BAF9063127E20", + "ephemeralData": "351A6399845267FE5EC56BE31E34C0FDB2DABA03263E73FFD4BA8044" + }, + "fixedInfoPartyV": { + "partyId": "F48C3DD40A21A13F112BE2FD2CB0419B" + } + }, + { + "tcId": 2349, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6898AD18481EAF8BF0B2C68277CD3051", + "z": "142F78CE01F0618041F7FB55FA1F1AA12BAEB2889F03A628CEAEB5F5", + "l": 1024, + "algorithmId": "9FBB9C5DE4BE0A8E5CCA96C4BA6981C7" + }, + "fixedInfoPartyU": { + "partyId": "CFEF2E2CAA77ECEEA8EE5671E0438278", + "ephemeralData": "83680C772B4AB9CE6F0527EE77AFFFADC494E756B61DF3238F714E87" + }, + "fixedInfoPartyV": { + "partyId": "6E1B2A258E5484BE2A47EA217152154D", + "ephemeralData": "D26AB984B8C2A3239541699A8A16184503CD4860E9063D32C8ED41E4" + } + }, + { + "tcId": 2350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54361AB20200EBDDBDE5B88F90421D8B", + "z": "858645BE49AC8B85896AD20ACF64EFA4F8B0AAEF798DDE8753A6E9E9", + "l": 1024, + "algorithmId": "D8DBED30D911DDFF6B7598706302A301" + }, + "fixedInfoPartyU": { + "partyId": "E5A1C98FAC51884746EFBCA6E4B97397" + }, + "fixedInfoPartyV": { + "partyId": "5742945C3D5ECFADAFE0F73186EE18ED", + "ephemeralData": "91EDF935D97B66FF982CD041C7EABBF9BD8181871DFFE851CBF17CE1" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 95, + "testType": "AFT", + "tests": [ + { + "tcId": 2351, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C74C6FE285C90932E57AB02AB4A059C", + "z": "2240787B586A5582B0E93A7BC3907638C9E7D2A90C74C55B8C635D9E", + "l": 1024, + "algorithmId": "518AA01841E6F1FD82BECFB2D3A7D203" + }, + "fixedInfoPartyU": { + "partyId": "30013D91D7F5FD3CBAA27A7C36839572", + "ephemeralData": "447E87D5D3BD4DB14E149A5185E3110BF348E9C4DDC4AC99FF1CF68D" + }, + "fixedInfoPartyV": { + "partyId": "90B759BEE8D9222382ED943A54451F12", + "ephemeralData": "C12F62612377B8F4A4A4CB802E112A49384012E1ECA33F5112EC30C7" + } + }, + { + "tcId": 2352, + "kdfParameter": { + "kdfType": "oneStep", + "t": "304BB00EA2DD5CEB5D13E87BFA121376", + "z": "9B4AEBD072205CFFDD35837B91B2EEE2087C87E2D402A0726668D1CA", + "l": 1024, + "algorithmId": "A1679C18EDA91C4A57D7AEF83549E35A" + }, + "fixedInfoPartyU": { + "partyId": "F3173E10D52F0133462278D19A4934D1", + "ephemeralData": "547A5D6BCB6937E23EAE0266558796F6B16D316D7B8A274CA9FC7B0A" + }, + "fixedInfoPartyV": { + "partyId": "47641FBE0D84F14E6FC6062D45C1CC5F" + } + }, + { + "tcId": 2353, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85AE1BB221EA8885EC37743F4D8F058D", + "z": "2F8DE869DAEB1E82FB1E885C266BE39AF6083AD98067F63DEC71E09D", + "l": 1024, + "algorithmId": "49517ACFD63577541B18BFB812D4A14F" + }, + "fixedInfoPartyU": { + "partyId": "05740E9D960B6508EE39AFC83869F7D4" + }, + "fixedInfoPartyV": { + "partyId": "69558296F57E02B2FD29C5C41CA25141", + "ephemeralData": "BAAD163B40310F12EB96286EE6A9745E877DF61D7DAAEA2DCFD0E2AC" + } + }, + { + "tcId": 2354, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA7E561DDD79964BC9C2E72C05679934", + "z": "75E618B006D3FE44602B07B37394FEC1D4F127D703EDE7E92953112B", + "l": 1024, + "algorithmId": "635F20A06E44675302A7900C32E173EE" + }, + "fixedInfoPartyU": { + "partyId": "052D64AC4D7935CC8E4289E8FDE5C917" + }, + "fixedInfoPartyV": { + "partyId": "00D1784D3D2D761D2A152A05014D07EE", + "ephemeralData": "1412CAD2CF9F11739810C210CDD0DFB4DE8E7DA705BB37EBF4420EEB" + } + }, + { + "tcId": 2355, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4246996EEE7588814E6312936FF3DA7", + "z": "A87C3051E715B66F5990F5EFB91BD37AD840341083BF91C042B9B416", + "l": 1024, + "algorithmId": "DBF1B6C46040112D3746660105443718" + }, + "fixedInfoPartyU": { + "partyId": "F4267B7E161AAFFD104A5CECC4A1577E" + }, + "fixedInfoPartyV": { + "partyId": "1590F1D29E5F74CBD9A0FE2E3DB5990D" + } + }, + { + "tcId": 2356, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2555DF63780E2F815BA72C76D96A70FB", + "z": "EBED376BC122A3F2230E5771253DC21F3F0BAA5B005437DF1C6CA15B", + "l": 1024, + "algorithmId": "A95BAF34A7D21152B8471E1A6F9212EE" + }, + "fixedInfoPartyU": { + "partyId": "CB7D6A1BC4CA3E42934BACBB7355CF10" + }, + "fixedInfoPartyV": { + "partyId": "49A8B1AB7EB73232D10C06E8F1BF3C67", + "ephemeralData": "947A89A249C927F92EFA04A0572588074A8D32E2AA76728498558BF0" + } + }, + { + "tcId": 2357, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FCACF8D01594F32A37771AA5AA2BDE77", + "z": "DE13FC6158C2F6F564594067BF10643C748DE51E2357A296A165DF21", + "l": 1024, + "algorithmId": "C5AF4D6C2123201944C3D0D13E33D872" + }, + "fixedInfoPartyU": { + "partyId": "C08C0886D42F0EE88C0027742174AD3C", + "ephemeralData": "1158D7846315006B7170E7798F9A3F0D1D2A06479E8FAED4E2C6FA02" + }, + "fixedInfoPartyV": { + "partyId": "202C83E5FF67FB4C015FCA016AEDDE84", + "ephemeralData": "7F7D4298E0431BC01969197D55FD5E63E501224F1B210C4595CEDB6E" + } + }, + { + "tcId": 2358, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A3DE1C247C8F0ECDBB97C2B2FC7C1310", + "z": "2ADA846B0422FB05BDCD6B7E0F3D74E4749D4B788969CDA12C942E4B", + "l": 1024, + "algorithmId": "1C29EC803F5C765EC2D45539A84002C6" + }, + "fixedInfoPartyU": { + "partyId": "6784F3AA437AFD5852F4B897419E58C6", + "ephemeralData": "F181B7EA802CDC5BAC1FC33EF21DC1900B509E214FB8FE7FD159D722" + }, + "fixedInfoPartyV": { + "partyId": "1A76F2E55A465981AD48DEBA76121389", + "ephemeralData": "7CE5707079B150D98C0DC5C77CC8E7D8AB46CABA642F6B505C3BC846" + } + }, + { + "tcId": 2359, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2B793868B8209D3A6CF6900E0726E01", + "z": "AF5761D4AC6288B61F863A6BADCBD76DE33275872A367C7BC86D43BF", + "l": 1024, + "algorithmId": "05F98D124F981D083F28D3B92A08A315" + }, + "fixedInfoPartyU": { + "partyId": "8B594738848A311FCF8FE56674B89D50" + }, + "fixedInfoPartyV": { + "partyId": "2419F3C1E036FC970D4C20D43DFB39EC" + } + }, + { + "tcId": 2360, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DA62F7CB974884EE745CBAD6161B999", + "z": "F24F860792A588475B80206ACE81DD2E120AB7674055D1ABAE263BEA", + "l": 1024, + "algorithmId": "3359D36ED645601CB1CF5B7B9E6D4D5D" + }, + "fixedInfoPartyU": { + "partyId": "F5F92164C788ABAD33EBC8BAED3416E7" + }, + "fixedInfoPartyV": { + "partyId": "8225A6949562354BAE5B4EA50771B933" + } + }, + { + "tcId": 2361, + "kdfParameter": { + "kdfType": "oneStep", + "t": "846172129212B27E49A10D969B9C8B28", + "z": "F3E00973D3A2C6DB3AAD29016D18F07373CB5D7AB1AAF1A518DFD954", + "l": 1024, + "algorithmId": "ECC463C2F7057332477B84A65E5314E1" + }, + "fixedInfoPartyU": { + "partyId": "3920EBE03647AC84E8A28011C035E972" + }, + "fixedInfoPartyV": { + "partyId": "119BA40B368EA927C5E891A59A8ED62E", + "ephemeralData": "14D7EAFA4C57CD585233459169A5EF5976E255E82F4DF2610B28913F" + } + }, + { + "tcId": 2362, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C482E5D6F7F2F8CD19EADC9B8468F0D8", + "z": "1FDA5F4D86AD98F8B8F59536BC1C93BD6B724881EFFF606FDFCABDA8", + "l": 1024, + "algorithmId": "F5E70579DE26EED9123B8217A7793862" + }, + "fixedInfoPartyU": { + "partyId": "520279F07785083ABB35616CF33C4490", + "ephemeralData": "0F2D81615E5BFF7F0C3D5FE0860F91430F10CCCAF041C036DB395C7F" + }, + "fixedInfoPartyV": { + "partyId": "95A202FB835A43A103CE1D5A957FC77E" + } + }, + { + "tcId": 2363, + "kdfParameter": { + "kdfType": "oneStep", + "t": "693E869A8D5A41DDE98B601E2424017C", + "z": "E749D4CD4DC206AF3CDDFEC95E721D38821A9198510FAB2CB679B32B", + "l": 1024, + "algorithmId": "EE429091D97A336D98B9482926BD59AE" + }, + "fixedInfoPartyU": { + "partyId": "8D8BD2F1D0C28C17DDAD10F5E6FE2BEE" + }, + "fixedInfoPartyV": { + "partyId": "6258E82BF125BA02A99CC4FCCEBFB009", + "ephemeralData": "8756F33D6267F2198923C407357BDC4A0D3C3D469570288D33926D63" + } + }, + { + "tcId": 2364, + "kdfParameter": { + "kdfType": "oneStep", + "t": "55E5A8A666292FE152188D073D0D55A4", + "z": "7BA2D410E997C30A42CD5FB890196107099E47CEF414C3DB29BCD308", + "l": 1024, + "algorithmId": "4521C4342CFEA653A119E3AA84262976" + }, + "fixedInfoPartyU": { + "partyId": "BF6F1940E06AF7086124A8C0ABFAB2B9" + }, + "fixedInfoPartyV": { + "partyId": "210619D23B454BA2DA47AD9915804B0F", + "ephemeralData": "DF5D1DD0B2052065228901FAD853F102ECF4C087B73D5E48F24D1B3A" + } + }, + { + "tcId": 2365, + "kdfParameter": { + "kdfType": "oneStep", + "t": "334C7DF04A8F8B612FBED8C8CB755215", + "z": "4CA40D63C83EAF8CF4200E6221A4E382C44FE55E7CB2CD9D1E0135C7", + "l": 1024, + "algorithmId": "23D25A2919F3F5FA45206CD8053D22A0" + }, + "fixedInfoPartyU": { + "partyId": "E26CF8A04785B459F451C0A97D55D5DD", + "ephemeralData": "88AEC8B091C21BD190899F65288FBA38F718A6575DE2E86DE67DADFA" + }, + "fixedInfoPartyV": { + "partyId": "19511F72ED6F662760693F5B439354D8", + "ephemeralData": "2FFE012E50F99CD41303855A39A435EBEADFB752E3593A1FF6F920FC" + } + }, + { + "tcId": 2366, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDB08D73E36A515E544292DE25361947", + "z": "4BF42F0BFE767A44B7E5FE0548BB3EB7E755E7B25CB5E4817A4B7856", + "l": 1024, + "algorithmId": "2FE9193F6510D8142830219C52834E91" + }, + "fixedInfoPartyU": { + "partyId": "F773DA6463AE6FCEC60E132887B44DB7", + "ephemeralData": "50967AF430A3BFCD3264A56AF0516E4C02DCB9F8A774DD22951F9D5B" + }, + "fixedInfoPartyV": { + "partyId": "5A2FE03F6F95B5D492B0C17F076A5382" + } + }, + { + "tcId": 2367, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD1D07214479201E98BE5DFA66FB097E", + "z": "F06626EF75E4F51B6B8395375FDD6D829CFFB149B5408862007CF530", + "l": 1024, + "algorithmId": "5AF21BFA7231664C7E971C1185BEAED3" + }, + "fixedInfoPartyU": { + "partyId": "491D46C9F6F8F19F05413448445D53A3", + "ephemeralData": "9D45BFD72B4D54BB54F6114F213C1106103BE1B2848B0D1A43B11622" + }, + "fixedInfoPartyV": { + "partyId": "5295BFD14689ADB50FCD179BD7D4A28D" + } + }, + { + "tcId": 2368, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD76D112850D36ECB5F14977EA453327", + "z": "33502749110389A3658442CF9A619A7DFFA75A0A063381536F1A0D1D", + "l": 1024, + "algorithmId": "7D5BFEE370179066945E976A3DDD3A5A" + }, + "fixedInfoPartyU": { + "partyId": "1CDF3E00A52AECE4D6533A1A9481D98A", + "ephemeralData": "18E3B68B4743E512D9317CFF312B260809933A104DCFB572D45237F2" + }, + "fixedInfoPartyV": { + "partyId": "000947B223185FFDEF5670E6AA6465DE" + } + }, + { + "tcId": 2369, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5A75CF0E3C7970D6AFA7920AAA11662", + "z": "21E7FCD9E074B9D156A28F0B742AF1460177AFCFEEB5AB37DB02BB31", + "l": 1024, + "algorithmId": "74F61D3FE0078BE4439742B9F567D45A" + }, + "fixedInfoPartyU": { + "partyId": "70DAB261B73C1B1A83AF42E48852B47B" + }, + "fixedInfoPartyV": { + "partyId": "C33A01224678F350B960D8526C1B24F9", + "ephemeralData": "364E93CFF1DC28B5CCD8E0DD04DE1EF5EB53F059A742041DEE5D1B73" + } + }, + { + "tcId": 2370, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A07B133B4FFC12061DD809DC6560545", + "z": "950D9A82BAEC8990B7083DFB887783297033F1E9060C583D0FEF3AC9", + "l": 1024, + "algorithmId": "DB7E638198384C8968F167572EFB603B" + }, + "fixedInfoPartyU": { + "partyId": "ACDD4FF9ED9E6F7346CF9D44D7353D68", + "ephemeralData": "9F8C1430B48B2C5BBBAB9D764BA38C344D3F094FA9F5B8764A9D386D" + }, + "fixedInfoPartyV": { + "partyId": "94F42D4084F24A7062156D40AC41BE1B", + "ephemeralData": "AB2CDA4177C60D93C8918E562B621AE8AC41F1F031B282A1FAE23FF9" + } + }, + { + "tcId": 2371, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FEDF2F510B41BBEBE8B82D44EA52524", + "z": "579E42F6425D0B8ABB1B28ED14E4991452BAF935590FF396F830FD49", + "l": 1024, + "algorithmId": "47A7A1EFF99C6FC40E34F9735C0081C4" + }, + "fixedInfoPartyU": { + "partyId": "DB194B1631B1AF71F1AF0C82D2182445" + }, + "fixedInfoPartyV": { + "partyId": "555401EEA03E0531D7CD23A03624AA38", + "ephemeralData": "700750FB4B01A4207998BD7981F23EA5EA773EA3F2EA07CFE8E01114" + } + }, + { + "tcId": 2372, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0834758FF70FF4281A3AB27FBD32B26F", + "z": "3CE5E26AE13A8EC13049009FEF214CD7873039575CDEDDB9A5E3CDE1", + "l": 1024, + "algorithmId": "49470C3210BFCC69AF1214300EFDA593" + }, + "fixedInfoPartyU": { + "partyId": "4565D6D4928FA229652EB697F3201B04", + "ephemeralData": "70FDC5BC1E20F03D193C57A1F7D63A02925247042B8E5720D2DB43B2" + }, + "fixedInfoPartyV": { + "partyId": "6F92C791C3E4690A9FB85FF429EA5CB7" + } + }, + { + "tcId": 2373, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0B4C7633DFE402BD3EB25C6BCFFCA16", + "z": "EF5C56C0E35B73862C7A97AA75F807810A2EC1AABADF0DA347F4FC4A", + "l": 1024, + "algorithmId": "EDC05E4F39FB72E4EFAD7D2F8829AB09" + }, + "fixedInfoPartyU": { + "partyId": "041244EB084A796A52EE0BBE1C8C707E", + "ephemeralData": "4D310BA518764C11353A3BF0B14C8610A0D76A874CCB9288472451E0" + }, + "fixedInfoPartyV": { + "partyId": "A137D0C0DDF6A73804E0EC5761414172", + "ephemeralData": "45487948A62449752845DA7E607DA20BDB94E5CFD809FA57FDF259B2" + } + }, + { + "tcId": 2374, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2E9AD4084C2D13ECF0A91D46647BE79", + "z": "DDEF47C4673913181CEEC5E6420F84546A2E99B5DA4717C2B269B214", + "l": 1024, + "algorithmId": "7E7C1E5DA28604AC82B892AF2E17CFF8" + }, + "fixedInfoPartyU": { + "partyId": "3BB16C7762BBC9B4AA8DC41BFE4233CF" + }, + "fixedInfoPartyV": { + "partyId": "277AED027801AACCBF7A9D80C1BA7BA0", + "ephemeralData": "8C1A4E3EC8964F1B35CC2404FE62ABA58B0A1C8D64F68F4E3056810B" + } + }, + { + "tcId": 2375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1A78A21F81E8DD3603A175918739D02", + "z": "D043A097EAABA72CA4B78333A77156498103BB009BBA63248AA5C5D3", + "l": 1024, + "algorithmId": "A4982F572C42200F6BDFD75E1700D102" + }, + "fixedInfoPartyU": { + "partyId": "9D18D7E29F7F0D89925980788549E6B9" + }, + "fixedInfoPartyV": { + "partyId": "1F84F3BB192C9402D29EC5761C7D16B9" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 96, + "testType": "AFT", + "tests": [ + { + "tcId": 2376, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0986FDB947BEB8230902C0EB73A36C95", + "z": "97E7117C5A4C5763FF8258A8225CC883D48DB203B6BFE2CEF505E2484976FE80", + "l": 1024, + "algorithmId": "984914B57216D994A0583B126F6066C0" + }, + "fixedInfoPartyU": { + "partyId": "71064B0109A4AE66B350009EB6F10C53" + }, + "fixedInfoPartyV": { + "partyId": "FABC78AB95F1E5767B276163A0F1C3E9" + } + }, + { + "tcId": 2377, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C56DA9243A6E456B3A4B85C7A964CA1", + "z": "B56C92FCB30B7AAFC02298E951C42203EE03B53A01C03FD0874AF4C7666BBDF9", + "l": 1024, + "algorithmId": "5A8705196C934290FFD6A398622E5478" + }, + "fixedInfoPartyU": { + "partyId": "A179A2F71DA90E01AC92219A5B7277EB" + }, + "fixedInfoPartyV": { + "partyId": "D23D8B97E84CB6AB9B613305157040B8", + "ephemeralData": "6C836AC3456AEEC01144E6A0FC5244D26A010CC804EFDA4F188FE153A742C216" + } + }, + { + "tcId": 2378, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7DE06F696A3F497D52CAFD4FB8333528", + "z": "A5A89FAA1D30CE6813C8758BBA4D82E3FA32AD311BA6E1DD600238133E920F03", + "l": 1024, + "algorithmId": "7706024468014D14120AE967AD203210" + }, + "fixedInfoPartyU": { + "partyId": "CF20AE566DDAD233F063C8703565836D", + "ephemeralData": "AEB9BC5B9AB8875D1E1B89FC47AEAE01383DB6E40745D67E468DF22521E68645" + }, + "fixedInfoPartyV": { + "partyId": "1C4EE81EF1F1EFD8914783C219640560", + "ephemeralData": "3874FF29970C6E1D667D762451DEA6961CC2EBF2399EC3C86BBB1B8871005534" + } + }, + { + "tcId": 2379, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AB861AA2FC4688BD3BC1F8E2853ED2D", + "z": "9A49A143F14AD363E96FFB162F7CA8947AFC7FDC0EAFF8643AAD39DF5DF95BA2", + "l": 1024, + "algorithmId": "0365247A8CF9F7FBF3D1075AD6A71F08" + }, + "fixedInfoPartyU": { + "partyId": "0CF7AE7096C3183FF424082B1FE95F3E", + "ephemeralData": "DCB478D837FEEF88848C4EDD967DD014AEC2F7BBEF0BFA10ECA78489E4019A4A" + }, + "fixedInfoPartyV": { + "partyId": "208404190D1B3341DBB4B54707F9863D" + } + }, + { + "tcId": 2380, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0947D8C10B20443D428811FF2D6D911", + "z": "9ADF7F802863FE10A7A85765BB03AD804C9D5650B5E24978784ABDC890A220F6", + "l": 1024, + "algorithmId": "8447A118B874C7176C8F332CA7D23828" + }, + "fixedInfoPartyU": { + "partyId": "ED84729ED67A5E8E54BCB6FFF7C28433" + }, + "fixedInfoPartyV": { + "partyId": "69F9F72259CA80FB789E8AD87ADE8F66", + "ephemeralData": "81666BFAF136047F23F95B2001EF1AC1767A9D08D1DC072DAFF1CA4CA593CB82" + } + }, + { + "tcId": 2381, + "kdfParameter": { + "kdfType": "oneStep", + "t": "746229F75F7F02FED8CEDA8444A2198F", + "z": "A4B2F66DC1AD34A7A1DB56D6BEDA53EB583A040C74464359A71AA5EFB36BF31B", + "l": 1024, + "algorithmId": "BB3BE9582E5E37CDA956ECC3AC0C767B" + }, + "fixedInfoPartyU": { + "partyId": "FACC599340EBFAFEEACC887E6513EAD5", + "ephemeralData": "674D0D9A6BDBC0F08762DAD5F1219FA291623A59F8BB0BCA17C59EA34EA47426" + }, + "fixedInfoPartyV": { + "partyId": "C0A4F1117DB34D4D4B31560E8246F9B2" + } + }, + { + "tcId": 2382, + "kdfParameter": { + "kdfType": "oneStep", + "t": "078661B9A21EB113E5FC1C98D3D1FAE7", + "z": "13547D46C0A8A11EB4E098840439603324D00DBABF96133D901C5E281D0D281C", + "l": 1024, + "algorithmId": "8DA30E6D5D3F49740E206471BB861BD1" + }, + "fixedInfoPartyU": { + "partyId": "052B3C85859541DE88658600444137C2", + "ephemeralData": "76E22F5B034325B0FAAC248BCC82FC83BEC0495CB687FE584883838227596FF9" + }, + "fixedInfoPartyV": { + "partyId": "F782D1DE88A7FCBDB440EBFB0D4DDFA2" + } + }, + { + "tcId": 2383, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1B2931742E9B6AEB0E5F88C1EA41F6BB", + "z": "3A4AA825DD35AB0F0035DC0FAEE75B873C6D4310587DCB05B3EF2F879D93A10C", + "l": 1024, + "algorithmId": "AB00AE868244AC6CBED7C04721BA6E88" + }, + "fixedInfoPartyU": { + "partyId": "A8FE060AF5E48E078C23631AE4762882", + "ephemeralData": "AC09F63FF781A75B37242188CDE7D643805C8E12F9DC8E936B300B7B4919A75F" + }, + "fixedInfoPartyV": { + "partyId": "00F49247D48778451C06F03101C5E08C", + "ephemeralData": "B2C8F04F9A1088CACF524E5BC8326C2F849D2C398AD4EEE1823D74DA1730C775" + } + }, + { + "tcId": 2384, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E02575DE32A611363CDBAF0AEAAA777", + "z": "D1D466170C26FBBB9A0FB337DAD93F6536DB6FA9BAEF5D286B24E265085FC69C", + "l": 1024, + "algorithmId": "AB6F9CC748336428324A416E3A5E8954" + }, + "fixedInfoPartyU": { + "partyId": "A4BA13CB92853E829546673D01ABE461" + }, + "fixedInfoPartyV": { + "partyId": "88C15318BB6A4CC5B6E816277D1D7EF3", + "ephemeralData": "C4EB6ADADB1B774AC2CE3A53B6E824868241A8CE7C2DF85843F9FEF9DAC4C458" + } + }, + { + "tcId": 2385, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FFBEA58440111F6E755CE361EF328F01", + "z": "D0BC96DEFFF57FE4C3D6B476C035ABE4D978DC4FC096FA04B98052D9884C8A4B", + "l": 1024, + "algorithmId": "B9724F1F8365107641D6EF1E64F440A7" + }, + "fixedInfoPartyU": { + "partyId": "91259B4C67EB790FAEE0EA0395386551" + }, + "fixedInfoPartyV": { + "partyId": "3D6EDB805D59A488B39689FD6FD95C37" + } + }, + { + "tcId": 2386, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18484760145FB9692C2F982B94231789", + "z": "9DC73D0872AD4CACCC6C37A3CDCE43A9242E9351159EA8DB2370AB0B76E7A555", + "l": 1024, + "algorithmId": "7551F14D8E84A8E52752672B1778DC65" + }, + "fixedInfoPartyU": { + "partyId": "D6DB1AF983B9FFA7DE69DA0AA8396C60" + }, + "fixedInfoPartyV": { + "partyId": "E19D1BFDFDBFC91A391D747A781C6B3B" + } + }, + { + "tcId": 2387, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC6F1ED07D88769657B26AE2C1F295A7", + "z": "8DF5FAEC3D3611E4CA6FBAE3D8B98411BCC87BFA6D1D019E676EE75B9BBD6FB0", + "l": 1024, + "algorithmId": "84B0C6AD221D71ACC57774B3CD699734" + }, + "fixedInfoPartyU": { + "partyId": "1B5D454CE0228B27C02814093E715002", + "ephemeralData": "B39F7D8E9758B1F85BFDB38A09A96A8F0BA47B30B149B6F2FFF6E996654B6BCB" + }, + "fixedInfoPartyV": { + "partyId": "10F60FDF5D163F7B676B27AA8E20901B" + } + }, + { + "tcId": 2388, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43CCE53A3B4A1A0B5B1EB378B4C23321", + "z": "BD9B1BAD12976D0451CB467CC9AD2A4FAEADB02D763A51760667825A1F4A5D7F", + "l": 1024, + "algorithmId": "2BB97AEA416C26A3D557F82CA2C92304" + }, + "fixedInfoPartyU": { + "partyId": "5A2DA778263DBCCC9FD0992F8CC22859" + }, + "fixedInfoPartyV": { + "partyId": "B65B5955EBED1BF89239C7023810EC9C", + "ephemeralData": "E26376B3E37E37FA886156858B2F11A53C3F5CD8A508C0FD0E59B57E20ED051D" + } + }, + { + "tcId": 2389, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40BE33B4918C8D22BEEE6D35AD615CBD", + "z": "0FEDAF63B80BFB528705646777FE80D3A906D851B1E21B7D969AD10E6F88D3C8", + "l": 1024, + "algorithmId": "C387D87DB2EA4043A241EF452EBA41F4" + }, + "fixedInfoPartyU": { + "partyId": "4A6C3D8A1930CAC2EBB51850AAE9AA82" + }, + "fixedInfoPartyV": { + "partyId": "2ECD33E1C6121C01CD64D8463534BEE2", + "ephemeralData": "6296E125A3FB4EDC85D23BDAB9F18031C18E14FCEB349DB512CBBB595BEFA62E" + } + }, + { + "tcId": 2390, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5407F0B999CFDBF423AA9B199EA1D64", + "z": "4E6AAEB930689B58051AD55AD00E43C8C65D898BD5DEF36F2B2E163E3500AD40", + "l": 1024, + "algorithmId": "BCD7B5D61711CCCE7547562E27DE93AF" + }, + "fixedInfoPartyU": { + "partyId": "35B764CBBE29BEEF4D7DA2B528D64C8C" + }, + "fixedInfoPartyV": { + "partyId": "89C172FEAEA3DCFB936B6A6F71C7D0D5", + "ephemeralData": "684CF09FDAC6B9946AE21CDDA2DDE48F32E3F43A5BAB9CE1C0C6261134B33E49" + } + }, + { + "tcId": 2391, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9CF203101E7652E880F691CE714B74C", + "z": "A749BABDF194A19DA2B7ACC765BB13509838B4C1A4427FA44A6C4A99E04B9902", + "l": 1024, + "algorithmId": "4B81E4E5D072DCC87BBCA557C22AAD0C" + }, + "fixedInfoPartyU": { + "partyId": "7AC66B269C42CA4A01B2A0994BCD890D", + "ephemeralData": "DB327C1A69FD1AB961AFFFEDE638969B36E98C7AB6F742A8E256226A641DB14E" + }, + "fixedInfoPartyV": { + "partyId": "3DD04BBA5DF0697766A3432B096FC41A" + } + }, + { + "tcId": 2392, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90BFDFC367EF4BFE55110817399ED569", + "z": "A6F5541BCD61D29556DF2EBA10C95E55F109745E69E2111CC1C40CB952ECA7E4", + "l": 1024, + "algorithmId": "A2106D4D574B2785B8BB0A195F27A75F" + }, + "fixedInfoPartyU": { + "partyId": "89F6A825061CDD115DE9BD80A572BB67" + }, + "fixedInfoPartyV": { + "partyId": "1CC8A6F6AAE6BD95C8B5D5AF166411FE" + } + }, + { + "tcId": 2393, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F96AFAD70A5D67E41A94891027043C5E", + "z": "CA76D1D54CF2DC58D43B28EC58D54774B5AA754B1165F3A81C39B3423A231D24", + "l": 1024, + "algorithmId": "91B728A810DB14C44EDC33B3D6F7ED5D" + }, + "fixedInfoPartyU": { + "partyId": "6FCF83241C7EE802AA4F7D058BECE2AA" + }, + "fixedInfoPartyV": { + "partyId": "7DD647EDC165E14EE2FB0C11249095A8", + "ephemeralData": "A7A015E8E99BB6A8F0D599A5E63C2D90830DD4B01EA904552BF8F7AF1F896966" + } + }, + { + "tcId": 2394, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DC2AA09905D0AABD8D389920287BA8E", + "z": "5E42F24F92D9665D63EAACC4516D59D309432C98454345AC6F2FF9D563275918", + "l": 1024, + "algorithmId": "7527966FAA3947094B83AD9D853F30ED" + }, + "fixedInfoPartyU": { + "partyId": "7E408D464C55178B94A0C46E1692DB84" + }, + "fixedInfoPartyV": { + "partyId": "03B91F9C206F05C36F6B98703DB0BC54", + "ephemeralData": "9BF7EE7431BEABA6264214209136FBCC5A26D01D9D56ADC6D8B90E9A2D9ABDC1" + } + }, + { + "tcId": 2395, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58C6CB2C5865E1523953F0B0970FD395", + "z": "4A56DFF7E2080B213846328EFAD73FE09E146A63CD747EEAE5988E6EC64A6175", + "l": 1024, + "algorithmId": "800335821ABB301583375DC35B457429" + }, + "fixedInfoPartyU": { + "partyId": "E7D6857C31AC2A3A07123CEB21A5626A" + }, + "fixedInfoPartyV": { + "partyId": "270BEDB68562A4111A42C9CCF4EC77C7" + } + }, + { + "tcId": 2396, + "kdfParameter": { + "kdfType": "oneStep", + "t": "393FC37613C47F14762D13B1141355FD", + "z": "0B259278B7DA3156DC0BACB8F530ED563F9B6637DFF6471E8919D0382D29D123", + "l": 1024, + "algorithmId": "1D677C3ABE0BBECF9CA53C36EEA884F0" + }, + "fixedInfoPartyU": { + "partyId": "AE3F4E1D6AF68A3C2CE53A52699AD27E", + "ephemeralData": "F208BFA1B62EB804071CEC31CB6460EA218C1162F606D74DC576804A9289BC85" + }, + "fixedInfoPartyV": { + "partyId": "79D936DF6305A4235233799CD5F3D32C", + "ephemeralData": "DECE28B9E78DA7122C7184B61E8EC913CE8E24C051918E81A098B2E2DAED3348" + } + }, + { + "tcId": 2397, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8789EE5374E129ECDEA6725119FE7EDA", + "z": "11BB3DAC7ED7B5761B7E5FEA1509C8F44890D8F3D4166E75B98AFB93B698D9DD", + "l": 1024, + "algorithmId": "96CE2B31ECFD5EFF0FB28EA7C3941D8E" + }, + "fixedInfoPartyU": { + "partyId": "14EAD15CE3A344F4DE021893580E75D4" + }, + "fixedInfoPartyV": { + "partyId": "B2370C0C24DD3F7D5A7E9D74E58B7F98", + "ephemeralData": "6C38E7BA25D816FD90D8602C30BE14E5C3CBA4BF9BBBA5212AC5DCB538C97EFF" + } + }, + { + "tcId": 2398, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBC18ABA4A41DE22941AB5AE09C18B08", + "z": "2B98315943FAC0E8EF81EBCAB1CBB185660AE34F9347D935A67918C460F3545D", + "l": 1024, + "algorithmId": "599B3B352EDC4EB5537B9B211C5503A5" + }, + "fixedInfoPartyU": { + "partyId": "3F45876DD5D41B11F0943B47E1D1008D" + }, + "fixedInfoPartyV": { + "partyId": "40044C361E037703D271100FBE08C4DB" + } + }, + { + "tcId": 2399, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1445AE9B12929C240DCFC24C544CAFDD", + "z": "C7EA05F2268BAD17006F62C65E47C1B8307EE7719C6CB3EE8CACE9AB4EE710DB", + "l": 1024, + "algorithmId": "E9EEE5C757F30776861885C3AFBAE6C3" + }, + "fixedInfoPartyU": { + "partyId": "3D9B32569865BF03F33EA0FDB67BDEC2" + }, + "fixedInfoPartyV": { + "partyId": "C9E99A865EFD36E7A1784EE666D95A61", + "ephemeralData": "7C257D95406916140390DB6011AB91074D11E5AAD7FC065A54831733C86B93D9" + } + }, + { + "tcId": 2400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8F9D39161052D0E8BC396DCCBF1F4FB", + "z": "D0D8AEB559A020F7B44193B7DFCDF0866D68FC8BB00C50971DF0C00E24853697", + "l": 1024, + "algorithmId": "67B2709D941C31A46A0FBB87AFABBA4B" + }, + "fixedInfoPartyU": { + "partyId": "12FF128A8B34D4043A588EEB66FD3338", + "ephemeralData": "20E429B55EE3DA9398F88101FF58783B78E9679620EE2CD0F504311906A1DA98" + }, + "fixedInfoPartyV": { + "partyId": "6C6D196A611B71F9011ECA37D31D948E", + "ephemeralData": "6D792D9666900556597140154A0292CD48A63FA54E3E7309E216C313A79A4E13" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 97, + "testType": "AFT", + "tests": [ + { + "tcId": 2401, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52B069E824371916E550BFD3D821759B", + "z": "F663497E86CD742E37BAE2E14C4D9C716A43D928CBA957ED7B752ED546DBDC3DC461061962", + "l": 1024, + "algorithmId": "2E96FD7CABD136375D536FD4F9C69D0D" + }, + "fixedInfoPartyU": { + "partyId": "90C0588EC2296ADA91FE9246995D6934" + }, + "fixedInfoPartyV": { + "partyId": "F3A3FCEF606017A3215BE314B97CF0E7", + "ephemeralData": "1502C1DACE856DEB319D7BA27802851F3CE65897193CB4D6A9F8B87672BB9EDE24AA7BBE97" + } + }, + { + "tcId": 2402, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5796D119626DA331CB9D6D6D01079BAD", + "z": "4B651F6D7B3A143D7235B2C42F1393A0DA98CE890087CDAFF30D7D20E84AD96F0AD31C284A", + "l": 1024, + "algorithmId": "9EDA678D69C4120C2EA0E0D9E390CD80" + }, + "fixedInfoPartyU": { + "partyId": "039062E6D681D88FEF4D18BDC13E9407", + "ephemeralData": "D076F07E3783DA8C5F31EBA02345881DD690F4F83B67908591420BABD7A3BC46A30995A97C" + }, + "fixedInfoPartyV": { + "partyId": "9B69AA6EF152FEAC416DE51D824E6342", + "ephemeralData": "559157C4E770E1F04098A276031B37B80DA695F9971995130B88D04A448A5A03E54F205F27" + } + }, + { + "tcId": 2403, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8545A9C1C2EAEF64D8904D58694B5C81", + "z": "37AD724D9CCE469B4CE6050BC4DABC48FE6261574CF05CB19C64155E93A32CE5E766DB162F", + "l": 1024, + "algorithmId": "5C2412C4A1D3E278075D36D56AE35527" + }, + "fixedInfoPartyU": { + "partyId": "476975F992B23B2C37F9D5A7309B74BE", + "ephemeralData": "528BC5B986DD26525352CF98A3C2725732C6E28EB9AF3F4FC74717F85746DFDCA1005AE787" + }, + "fixedInfoPartyV": { + "partyId": "87E63FE373EC64EFE2DC4FE9BB981C36", + "ephemeralData": "16950805563F1270DFE234B3DF9507480B4A72835CB4890EC03AD205F28D0D095D987430B1" + } + }, + { + "tcId": 2404, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBADEBA6B1630EF7122ADF5B618D069B", + "z": "D35D208DDA99F5A1949E3417B8FF44A15B1461C6D1508E548D048FBB3ADBCFDE37A8AA8896", + "l": 1024, + "algorithmId": "ADED7EE5B78987859C53F8AD2B2AE2DF" + }, + "fixedInfoPartyU": { + "partyId": "8AE0DF137FA28425509F26B237BC7645", + "ephemeralData": "192BED410E15C2811E919292AEA57AA9DCA5508C7C3134FF2AF6C6984630AA1FF0AB43F59F" + }, + "fixedInfoPartyV": { + "partyId": "9052964E6E85FA5AD88D6B0711565428", + "ephemeralData": "B1F68429856FEAD0220D9754CCED3DD493F93853180811E9E7B1D6C511198C5DFC9E7AF6BC" + } + }, + { + "tcId": 2405, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16EA422DF0FDF1B83C8EBDD32B496B04", + "z": "CC22B94BABB0621C0F16801C60814576C7D294B78DB6B777537743CD23FCB221AE43B38709", + "l": 1024, + "algorithmId": "573580AAC36296F2900C0D083858EE3E" + }, + "fixedInfoPartyU": { + "partyId": "AD7662473A41E8177906084DB8E2A9F2" + }, + "fixedInfoPartyV": { + "partyId": "94BD08CB926A07EC9BA191E33242934F", + "ephemeralData": "FB68C65DA683E04BE69B01611D41170F9AE026FC9302ECB9C8DC3E3448073E6E7919B10D9B" + } + }, + { + "tcId": 2406, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6C55C37353A8756E53335742BD362C0", + "z": "D203B82D1F50DC70AB86238369BFD8BFF3D9244BAC6A9998749EB394B5257104DA0B68FE6A", + "l": 1024, + "algorithmId": "302F3B0122E3E4AC14A5E60D7A689DF4" + }, + "fixedInfoPartyU": { + "partyId": "38EB88D0EDBE709581DF76AEF0BC5523", + "ephemeralData": "DD0C6A3318F0E7DB996512D43DF84845E867F6889796E0477F63B84479EAE057A1A825ABC2" + }, + "fixedInfoPartyV": { + "partyId": "F5FF3957DD29151E26313406DBFE8229" + } + }, + { + "tcId": 2407, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B028368F1275AB8503E76390009E753A", + "z": "8DF1FAD0518288F21EC83195188D3243E749FC1F94DAAF6FEB627FFD529566395C6FC47EBA", + "l": 1024, + "algorithmId": "4747516FB4817AB817059374B79800F1" + }, + "fixedInfoPartyU": { + "partyId": "396F7D9AFC151885E392AD090F00EBD7", + "ephemeralData": "A483067248187584CC1C7D92A99F95DD39FB33BD4DBE751A10FD755F779D08C657374C77C9" + }, + "fixedInfoPartyV": { + "partyId": "3BC04C3E9FFD75E61D4E9272F8248055", + "ephemeralData": "A11ACD0BDCB4378E7C7F1DC381474BC7020F3CF819F2139EB45CEAF3D0EB49C48DACE1EBA5" + } + }, + { + "tcId": 2408, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40E4079E779FC4F3173ADA1DBA1387BF", + "z": "B65260900D0EF3CA63427E0AC881161A351B88392956BD39FAA1BDB1C392EF22B6B1FF9D4D", + "l": 1024, + "algorithmId": "0DECB5EFADD1F215914103077122035C" + }, + "fixedInfoPartyU": { + "partyId": "7E644D4907B91C991D6CF780979D573A" + }, + "fixedInfoPartyV": { + "partyId": "6AD96993AFBDF92FADA3ABE87D86320B" + } + }, + { + "tcId": 2409, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F667A8C2F8D9D341D00A884C45438F98", + "z": "0ADA76F171523F41E42C6A8AC5D437EC471E09F83C22093297A7ECA4617BCE573C52D9F3E0", + "l": 1024, + "algorithmId": "3D34E4CD56E8D9FA013ABE00AB5ACF5D" + }, + "fixedInfoPartyU": { + "partyId": "9EC9BCB7CA0E38639CA8E4C7C04100E2" + }, + "fixedInfoPartyV": { + "partyId": "2FBCA6359A651F97A2EDB28D04BBF3AE", + "ephemeralData": "D6D163A09B52922D0142C4301D544D55061F824228B375852C625B5161388F087F5DC8F859" + } + }, + { + "tcId": 2410, + "kdfParameter": { + "kdfType": "oneStep", + "t": "913D70268B6375CFE2E860708F54DEF7", + "z": "222EA6A5BABCB2C344B1BD87D41975B7A5524B32E68467CEC26919D26BD876BAB9D14113E7", + "l": 1024, + "algorithmId": "467864418E37F72CD84FA7268C6ABC7A" + }, + "fixedInfoPartyU": { + "partyId": "24F3A5DE0E00207E479D237C673C8DA6", + "ephemeralData": "8F77B9CE98BE1D65A2BD6756D2D79329EA0FA5406139271CAF5C20A893C5FD31FD279E2FEC" + }, + "fixedInfoPartyV": { + "partyId": "4E657DD5D803CEEB7D7BE8A23F5BA9FA", + "ephemeralData": "DBF6CD8370B8E8CDE56387E65A184048CF499667A9B063E0C3618A2E233FCAA655C79BC201" + } + }, + { + "tcId": 2411, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4379BDDEEF42744AAA41C01426DC6E00", + "z": "D4A23204D2272513F6B2908EAE1F6C92DA9397D1DC5746B02080FB4A3CB7F81087F7C6D675", + "l": 1024, + "algorithmId": "38F19A79A8484BE504023927DA38EFDF" + }, + "fixedInfoPartyU": { + "partyId": "260C12EA2D998AC0C4C9E92476EFB1F9", + "ephemeralData": "384F9AEC0118000B84F604ED5AA3A9B51DA820E283A37E1CAED42528C14580F848A66AE369" + }, + "fixedInfoPartyV": { + "partyId": "EC2F67891B6E12F0A3C063306EB8B02D", + "ephemeralData": "15E624832CD1A4FADB95DB6AFFE852EC396831566B2E81C1D20C27B5C089F45B4CC739B3C8" + } + }, + { + "tcId": 2412, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E49A3A56BDA9E9AE78EC774D6D38F753", + "z": "565C9B386DC12A0CD229F7A6D757AE5C715878AF3C7E6FC7529F5E410C0621679E7D52CAB7", + "l": 1024, + "algorithmId": "830DA927521D08FB80C97C12A61FC4CF" + }, + "fixedInfoPartyU": { + "partyId": "C2A6802A79E7264C180B6031D6ECE48F" + }, + "fixedInfoPartyV": { + "partyId": "132C19329D170034F76FF8A5FA1B5A73", + "ephemeralData": "36DBD30266BB0D197BF460FDDE7DECEA5C4040C52AFF838BA7AF10808B3FA2FB40818CCAAC" + } + }, + { + "tcId": 2413, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DA60F120CE005D8595472CF6AC5C1E0", + "z": "E8C87196FF9BFF2D682CA91615304512F6A7C644B31886BB7EA8C0172250FF0E06B25E6E0B", + "l": 1024, + "algorithmId": "ED8047367C24A6AA113A4931826F69A3" + }, + "fixedInfoPartyU": { + "partyId": "48CD59C87E1DDAACB2B74875C2D1E7CD", + "ephemeralData": "9F78FF005231D4A0AE8C3B697E8DC981E4F45DE52FBE4AE7A82418F4E7D264F09C2D28F997" + }, + "fixedInfoPartyV": { + "partyId": "707398BFD3F3038D9F538DF06DF630BA" + } + }, + { + "tcId": 2414, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D91953239D12674D4B036B152177B9E3", + "z": "1EDD68DCD252794275E9669E9B8CD7346FAF5F6CD1AD902AE2FC2A9CD068757886BD787E31", + "l": 1024, + "algorithmId": "5750965C99B6EBA69DE08850B3EA9FF8" + }, + "fixedInfoPartyU": { + "partyId": "F4B6CC65D62269074179510F446AD093", + "ephemeralData": "366B72685DC27510124334934B5EE3606AF49B3D8FB2C10529D7228DF38B11E821EBA7FC6A" + }, + "fixedInfoPartyV": { + "partyId": "1B8ED5246164DE6956C31BB858E87132" + } + }, + { + "tcId": 2415, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EC8F3D3948AAB158B1B550C3A5A90CE", + "z": "5D902C1FCBDE30F964987E39D8A0DB46BE4BEA2FAFB91DA9C036AD2E405DEE0E40E8AB5E52", + "l": 1024, + "algorithmId": "27CA08EE7F4D94D2038EEE4393C5F4F6" + }, + "fixedInfoPartyU": { + "partyId": "09A3E5D18E6CCBE4A7DDFAFCA2BFE7E1" + }, + "fixedInfoPartyV": { + "partyId": "8C7CA16ACFFE46F9569006100A820B70", + "ephemeralData": "DF5B177502F0297AD8DFB3034C2FE1D1520D21AE4FD48C149309116EF3F9FD4CC1A92A47CD" + } + }, + { + "tcId": 2416, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AAA36AE1DC0908066B7ADBC69EC910B0", + "z": "3B8F7B7AB188778924F3EC5937EC6E66CB0072DC20DDFF3D006B2D8D2C1D72BD74CB23A935", + "l": 1024, + "algorithmId": "A3315E39B12455F359652DFBF2C4B2C8" + }, + "fixedInfoPartyU": { + "partyId": "F804BB2B08C86A0EAE3872AC9EF32E66" + }, + "fixedInfoPartyV": { + "partyId": "6FC185B9A415A3F97FD11B93363BCEDE" + } + }, + { + "tcId": 2417, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC15A15F347FEE7EED12F8563C7A6841", + "z": "322B249B651B1A1E31BDB5FFD2EB3D58EBDB00AB8341A32D2D55043F86FC916BB42B16D067", + "l": 1024, + "algorithmId": "38A948FB8B677ABC7A53B0AB34EDE4E4" + }, + "fixedInfoPartyU": { + "partyId": "A0B4B03D4B51BFBDF317B67DD6D5847D" + }, + "fixedInfoPartyV": { + "partyId": "770991EFE92468CBD4B6B4592A920FE0", + "ephemeralData": "758DAB2ED3482DCD0AF24EB2021FCF24079915BA2B7B666DF372634015F726A26D042B2605" + } + }, + { + "tcId": 2418, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8D68599D2F43470CE51B83DC31F6A68", + "z": "C534EBD13A1DAFFF6F95320FE5040D2F5CC1A65926362A74D21EEFFCA501E2871F5FB16CDE", + "l": 1024, + "algorithmId": "DE8576A1CABA10A249D163C9A3DE37BC" + }, + "fixedInfoPartyU": { + "partyId": "DE3FACBD09FBFC33C9401E1E87E1BE25" + }, + "fixedInfoPartyV": { + "partyId": "F68900E4D24CA5924D54107AAD5EAF8B", + "ephemeralData": "19A4AB4B1372FB4FF6F3788C398DAEAA17D53C45253E6F53B18B3713B23BCD103E39C59A00" + } + }, + { + "tcId": 2419, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0AEB08F035688D86C5A98B2CCC6DB24", + "z": "B62E59B5A240ED9E19A6C20AB7B731CF6062E3B8D08D5E8FC24509ABB0682BA672C6ED4FAA", + "l": 1024, + "algorithmId": "C4A5A47D049650F07CA26F2F9A761250" + }, + "fixedInfoPartyU": { + "partyId": "CCD633C82A49A9158F061C5EB07D51DF", + "ephemeralData": "107E365673166B517B7960A1282BB301B16566F0D72F350CA2C9BE114E84E3680E351DDB7F" + }, + "fixedInfoPartyV": { + "partyId": "7042F0FA139D72C6480A0F2B9AE9D081", + "ephemeralData": "57B8BC0CA628618065C32E62E3A8F285CB7D20561FB6D64C55A7A6FC096A086D0CF2277D9A" + } + }, + { + "tcId": 2420, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FFAE57505F197921A03EF0C4E5C6827", + "z": "1F9D358EF9A9197ABF7974AE1D2AA642B5DDEFC2E95FA85D8E8B8AD2317444282039EE3D09", + "l": 1024, + "algorithmId": "60840DDB3FFDF38F8F80B01007C92019" + }, + "fixedInfoPartyU": { + "partyId": "F5B21C92EE348C78643A1DE723FF404A" + }, + "fixedInfoPartyV": { + "partyId": "0A280091E1B8B7B5CBB3711CC497C6B9" + } + }, + { + "tcId": 2421, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C0E3D363DF4DF588811FF4F4DCDF6AD", + "z": "BD3EFC2E58616F9EC05300A62846563CC41F3D71D7287A4C1D91459F725D668B65B853EE57", + "l": 1024, + "algorithmId": "2106102D53CB669FA5DCB433592E3A46" + }, + "fixedInfoPartyU": { + "partyId": "00C466CB640B6B80BAAFDB709022BC4E", + "ephemeralData": "A6E1566961AA38F4EEF43BA88CA661538E1AB5886A3C50EE38E330D39C128ABF8F0C981AD8" + }, + "fixedInfoPartyV": { + "partyId": "0FDD6128BB7C47D77F07D47D97FDBEB1", + "ephemeralData": "28D1097B9B5A93C539BE60B526597F1183B8CAB9956E98CF81859BA7249583E780F1B98460" + } + }, + { + "tcId": 2422, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03E06E7EDCE07EB0B5E0EAC8953466D8", + "z": "073DA941DA03E6D23511B19D22E82CA4FA2D99CB76D2BA217FCEA73478028296C6ED000C0D", + "l": 1024, + "algorithmId": "8C31074AB745BB7264AF1690615302D3" + }, + "fixedInfoPartyU": { + "partyId": "D4B2660DC48E361143931D31E441C543", + "ephemeralData": "5C4038272E336C284D236610A59887C948570532CB7C783DF3A34EA5CC71E429CB17E06909" + }, + "fixedInfoPartyV": { + "partyId": "AD33424716F81DA0447864725C9C77F0", + "ephemeralData": "5EF8BCB18639E5050D6EF205540E64D6FA68BADB1F3805CC741B38A424C1C2BA7148E2406A" + } + }, + { + "tcId": 2423, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BCC6DB38B6606EBC9607E578FBB6C799", + "z": "1A506C7AA2D99F6550C61CFAC080806F6088BE6F06E6BEB26815DA3FE28467B99B6DE938F1", + "l": 1024, + "algorithmId": "78C403885D3769B5D81CB134D990C865" + }, + "fixedInfoPartyU": { + "partyId": "1DC8B079AF0A2EF20B39183260E0DC56" + }, + "fixedInfoPartyV": { + "partyId": "6E45ED72009F7C34A09DA1AC68B7825C" + } + }, + { + "tcId": 2424, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A13D8482B098D90762989D556A683016", + "z": "7A690CE4263B4D7D0BD9EB6267C5D4BDA3BCA0632C085504BC660C24BFD314D922D5215209", + "l": 1024, + "algorithmId": "21359CBC158563BFCF2DA3B2F3C50063" + }, + "fixedInfoPartyU": { + "partyId": "E41E838F8302A5329130AA941B3CFE5F" + }, + "fixedInfoPartyV": { + "partyId": "EBF8D740D1D742C73AEDBF6E5B7E4BFE", + "ephemeralData": "80B9B602970ACDF2C05968CCE04F3FF11FEBC0E6A5572FFA7B55E9BD3534A3130EA16365CD" + } + }, + { + "tcId": 2425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6398EA948FC81CE59B69F1FB3BFBC1CC", + "z": "05DCB706B3813C2B705431ADF2775BBAC0E040AC1998B0F873584B87BE92BA0A3FA3F728BA", + "l": 1024, + "algorithmId": "1835FD0471694C6BD1BA397017495C68" + }, + "fixedInfoPartyU": { + "partyId": "A9E875306CEC2811A5737D6906C2D892", + "ephemeralData": "0FB764FBD754B540E74585E1D2E73D57D97ED48792D3416CA4CA4A922266D891B080CC00A2" + }, + "fixedInfoPartyV": { + "partyId": "13ED9D98ABBC6DDA29EA47A0EA46E185", + "ephemeralData": "F4191DAC40C8A24E9AC974F7BD521039938DA60DC38A08A8F3F5DCE17E920CCFAEE5C24ADE" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 98, + "testType": "AFT", + "tests": [ + { + "tcId": 2426, + "kdfParameter": { + "kdfType": "oneStep", + "t": "497CEB1D7AAFEBA698A957B0C0F3549E", + "z": "5D8A875397FB0EC633DDF958C8D9CD380CA66C68A81A3C4E94619B49D4FFAC", + "l": 1024, + "algorithmId": "15652B497AF27B457B05363F3E94B71E" + }, + "fixedInfoPartyU": { + "partyId": "2C40AE9583A4BF3D7A1C574ACDA9FF5A" + }, + "fixedInfoPartyV": { + "partyId": "B1C740CA9F3B0DCCCE50232344AC77DF", + "ephemeralData": "7F72DBE0497EFE59DB3619DE0F7396CFCD179D5954988B5FB1E0C1D8C2684E" + } + }, + { + "tcId": 2427, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77663AF28980A75F688C3E1B50138F6E", + "z": "10EF777E4AC2547A37DD1705B086BF5683B0B61B83E192B4DAB747FE9AE062", + "l": 1024, + "algorithmId": "C2C7C2B8257A53280378F725AA2AE0B9" + }, + "fixedInfoPartyU": { + "partyId": "B170BA3ABD5EB4B77BC828D8C302ECEE" + }, + "fixedInfoPartyV": { + "partyId": "A33C5C6C84AA1FA9846061896BC92923" + } + }, + { + "tcId": 2428, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6E307B14E28021092FE94805991E6CF", + "z": "507769BD01B9720EA22C219C5234F3891A4C8812107A8A8B4F5735949CBAFB", + "l": 1024, + "algorithmId": "BE0AEF80BB59925C02C592C0114C70A2" + }, + "fixedInfoPartyU": { + "partyId": "0AEB8406CE059677897652C6BFA3AE54" + }, + "fixedInfoPartyV": { + "partyId": "122192567B218E18CF9447B47C5B9FE8", + "ephemeralData": "04200D54C3AEF00F679FD41CCAD53DAF87899B5D1C06DBAB7C36538CE464BB" + } + }, + { + "tcId": 2429, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA78F2EF14A45803A3FDCB1E33D2F602", + "z": "D58ED330699987E8220682440659E7A0509E5F180DC734EAE162D5EEC863D1", + "l": 1024, + "algorithmId": "F657FD6190FCC11DC5A378886D3C85B3" + }, + "fixedInfoPartyU": { + "partyId": "44E5BD56FFE7159F216834FDBE11492A" + }, + "fixedInfoPartyV": { + "partyId": "A516B1F83C66DF41CA6833EC952C0307", + "ephemeralData": "63A7E40255BCF4A9163D3F62D0280455A22ACB079A2F66387E6B52DF4DCEE3" + } + }, + { + "tcId": 2430, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65B8C10FCD5370883627951F4EC7C258", + "z": "675A48B700F60FBE470B0F8171CC316320B0F197DB818884B0F30CC1E6F639", + "l": 1024, + "algorithmId": "4B4FEC7D2220175776279B28892C3754" + }, + "fixedInfoPartyU": { + "partyId": "4490BA9DC54211653E8E0587E9BA5E95", + "ephemeralData": "04A946CD6F0B8DA25D98C73638461A2E3CF8F215B127AF2D553750439CEF50" + }, + "fixedInfoPartyV": { + "partyId": "7328DCDDD7BB65274423BE586728B17F", + "ephemeralData": "C680C00CD11101F670E391C964322306E788C744B6F991B8100E5774839606" + } + }, + { + "tcId": 2431, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B75F138D26D766E8EC4303CA0E52CBA", + "z": "BCDDEA2AB091560F05F43F0594A5E58B9EE6E0B790262555BFDE945169B54F", + "l": 1024, + "algorithmId": "5125B3913222DD14F5AF57A01E201B3F" + }, + "fixedInfoPartyU": { + "partyId": "AE0D9F157B906CDCBDD44ADCE3B66722", + "ephemeralData": "6FEF79AF98B8E71141C203294F6D6A476A942D02FB5AB05A2B6F5C93ECE1D7" + }, + "fixedInfoPartyV": { + "partyId": "AFBAD8F02B888BF8C529F0095229E349" + } + }, + { + "tcId": 2432, + "kdfParameter": { + "kdfType": "oneStep", + "t": "075003D3D55815BE68D0BD62CB881F03", + "z": "BE6E14B16CF4BDA632EC4D93D35F4C347FAADA6C83BF2A417EEC8731287CB5", + "l": 1024, + "algorithmId": "6E46598EC1C1B85C92436CC72A5C8E63" + }, + "fixedInfoPartyU": { + "partyId": "8E6439A3A146A017E61430120BB96859", + "ephemeralData": "6C8E4B06F2BC7937036D9E20032A00BC2DCC7F9374824AC8BABC2F73882496" + }, + "fixedInfoPartyV": { + "partyId": "97529FAEC742FFAC294BE6F01B586558" + } + }, + { + "tcId": 2433, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1FCAD1FB4C160340A4C88BD39D4250A", + "z": "54A8C17B6FF6CCDE7C13BD41E295D30031623BF4F0693F0CFB80BB7F6218B8", + "l": 1024, + "algorithmId": "2CE75FBE57C5067C745D83DBA3001866" + }, + "fixedInfoPartyU": { + "partyId": "CE579753F9C72A8A7067FDA69E130ACE" + }, + "fixedInfoPartyV": { + "partyId": "974B7F10C5B3839BA4F4BBCB8AE1C12E" + } + }, + { + "tcId": 2434, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BB19B269C6313E19D0949D5C2AF9EC4", + "z": "5A6B062AD18BC4E18FA1F6A66E34AD37A418B3FC912796B7C1F5D3F852649B", + "l": 1024, + "algorithmId": "D91D0424B1C6E0BB80076A3DB229CE2B" + }, + "fixedInfoPartyU": { + "partyId": "EA0DB8AE2CF8DCCE0625B1C0165B2F1F" + }, + "fixedInfoPartyV": { + "partyId": "2BB09724483370D5F9750B2DF1EE2B6E", + "ephemeralData": "44A9BEF141EB1CE623F1687CDBBC08A0B629E074FEC9A02E8885E40157CD71" + } + }, + { + "tcId": 2435, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0EA0F25090289A22822D9E9DF5A89B7B", + "z": "33DDC802158EE42DE74ECB369277F73C6026FBD06CD9219E8D248620951211", + "l": 1024, + "algorithmId": "A7A7E0C8608A0EE3836EF19C371012CB" + }, + "fixedInfoPartyU": { + "partyId": "875D32C4D30A0E5720874AB54F7B6EF1", + "ephemeralData": "FB237BC1283B566FF2AAD67F627AA644D58B0EF83B682BC2426A5FD999EB39" + }, + "fixedInfoPartyV": { + "partyId": "48274CE28A8C3903925943DCC8190687", + "ephemeralData": "22101F49455EE84C00F9C2F4F2B36C0747804224822AF98F2508FAB71D8E34" + } + }, + { + "tcId": 2436, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE87EC1252F48AB1738D84E84354A23F", + "z": "7A5CCC01DA0D620C9F9944B474DC3F1FFCADE41A584432A67B18936D73D910", + "l": 1024, + "algorithmId": "1D8BAE726968CEEF8CAFC08C8C80F091" + }, + "fixedInfoPartyU": { + "partyId": "8E732CA311AD27278A1E3B9959B94603" + }, + "fixedInfoPartyV": { + "partyId": "D6DA793E850A6639776AD2773613D48E" + } + }, + { + "tcId": 2437, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE091DE9A6ECE963258F33BD5A19C0F9", + "z": "9ACD5BC5408DC8E37004B20FE4CF6434896B5BAD756AD4954D9823546F1DE6", + "l": 1024, + "algorithmId": "AFB08B96F2BCEBB8837348AFA4B35717" + }, + "fixedInfoPartyU": { + "partyId": "CAE1BE53868472608C5B1C790CDEE29A" + }, + "fixedInfoPartyV": { + "partyId": "07398757958C8BADE12BF9391942B760", + "ephemeralData": "EA08F6CE90CB2BB2E961808AA36548C3E6251C7E2D9C83430818105E7DCBDA" + } + }, + { + "tcId": 2438, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CADD6B1140AEC2FDECA9395B94E2DE69", + "z": "671529E8D1EBCD82E0FCFA637EDD5D382F116F8616DDD6147F1EC023D6492D", + "l": 1024, + "algorithmId": "3F981A69866315BE7855D8AACED777BC" + }, + "fixedInfoPartyU": { + "partyId": "7C23237DBECD5E4B7F74441F59983853" + }, + "fixedInfoPartyV": { + "partyId": "C1EA964CD555536830D079EC33E27592" + } + }, + { + "tcId": 2439, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4CAD3B2E8AEB68D818297D85D000DC86", + "z": "38C17E6E57101766334627E438B403ECD462931BC85ABB636F2BE864C0B616", + "l": 1024, + "algorithmId": "1E42B41A07C3880D674C6AD7302940E3" + }, + "fixedInfoPartyU": { + "partyId": "850EB42A149C6C5B36DDF463F176DBD2", + "ephemeralData": "B109328B78DD7E26F770711C40F622FAE501D3D74D5982CF24C9027986FF93" + }, + "fixedInfoPartyV": { + "partyId": "885E909AE0225211CFBE3A7FDBE28B08", + "ephemeralData": "965D8F4ECA2E2663C06525F04B45A8799C995125FB6007220468CDBE0819B7" + } + }, + { + "tcId": 2440, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24654856C2FCD72E8273E520D1E8B739", + "z": "C96379C747156C54333D8167CA5A25D0EDF89B23956E4008FFD56714BD3AA9", + "l": 1024, + "algorithmId": "35D43190E8E60AC42025769F7598DF39" + }, + "fixedInfoPartyU": { + "partyId": "E74F4FB190DFB764CEBF73563EC2A47B", + "ephemeralData": "0481ACA1AF668C655C96B9D87E19A4DD8E388E52A769066CA3FE7EFC9D2CEA" + }, + "fixedInfoPartyV": { + "partyId": "D67B170A50D11EA6FDCDC54DDD112D1C", + "ephemeralData": "4E5146E7BAD81CD718415A7C248B6484BF014E177037CF537C0ED1360CB250" + } + }, + { + "tcId": 2441, + "kdfParameter": { + "kdfType": "oneStep", + "t": "701F70BEC8B875DABEF2A16A9AB539CF", + "z": "3027ADE1CC9366B1FB1DBC0BDA38BB7826A6D1FBBCBADCD0FEFB22C95A97B0", + "l": 1024, + "algorithmId": "B8A37A8976E21BCBEFEF6657A7525853" + }, + "fixedInfoPartyU": { + "partyId": "EDF6E5AFBEE43AD496D920F2C572FB5B", + "ephemeralData": "CC4C5FD7D006A2E25834E15F00618AB5221D2E8E63A89B93B31495860C404E" + }, + "fixedInfoPartyV": { + "partyId": "A50776775631BEE6C5A91A6D9398A66F", + "ephemeralData": "6CE1DDAFA0199CE09AB48A95E8F3DC4F34DB448FE42AE71A528EF6832408C2" + } + }, + { + "tcId": 2442, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BB18B0FF810C6350ACF4A4F882B142F", + "z": "4E90F95BF1672C0E3240F681C42045FE0277B93ED40E993D73A373F01D0AFA", + "l": 1024, + "algorithmId": "91DF51C353352DA65E8909222672FC58" + }, + "fixedInfoPartyU": { + "partyId": "51917541EFEEA18B1EEF34B859D97C1B", + "ephemeralData": "98F15108E0380156CA491DDFC1B9BF094418B20BC30FD7B96430C6EFB311C4" + }, + "fixedInfoPartyV": { + "partyId": "D8122B24E09F744C545EDDE79633169B" + } + }, + { + "tcId": 2443, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89BBC0D675BE3D56E6375782D954C0E3", + "z": "4EA34DFA5B12E5F61F02E0AB398D89A2400B891C91BEFE2B20611AFD199799", + "l": 1024, + "algorithmId": "4ED21CD436B9329824180B37B2F81C4D" + }, + "fixedInfoPartyU": { + "partyId": "5C1AC5C3DA299F8234D5023D9D3077D8" + }, + "fixedInfoPartyV": { + "partyId": "5BDD26050718237796A80F8648EB1BFC" + } + }, + { + "tcId": 2444, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9515C1BD228E2A1FF66188EA985214EA", + "z": "53ECFF3DEA903B7D3BC55EB1C23B777A8E9CBC0463B3044472204997DE48DA", + "l": 1024, + "algorithmId": "186C648FB995A3CA110F8E6809879D06" + }, + "fixedInfoPartyU": { + "partyId": "395D2536940DA1C9CFD48646DE008E09" + }, + "fixedInfoPartyV": { + "partyId": "17453436B85C600D143763FE81AB149C", + "ephemeralData": "6C9317782538C9C82A0BD141EBA16757DE5804315010F86CA2F447BDBC7659" + } + }, + { + "tcId": 2445, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C402196BECFE521A1DD1EE8D2EAD4F02", + "z": "D230FBCE76B352923F0AECFAC6E42113623B1784B42E8FBDE0B53E9D520A63", + "l": 1024, + "algorithmId": "D640468B1978E9643E1CFA2090D12481" + }, + "fixedInfoPartyU": { + "partyId": "064C3A5F9EEF6E4C98A3F381B6B3E74A", + "ephemeralData": "58DF6BFC8B7A4B7E1FE184639D695B5EC1123F8A4AC0CA58D7075387CAEAEF" + }, + "fixedInfoPartyV": { + "partyId": "0C0D5833B65DDCDFF64B6511DF97AD05" + } + }, + { + "tcId": 2446, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FC6BE87CFA2ADA3C4AC2A22964C0FAD", + "z": "61955B4D6173F0D080944C8FA54B5A9174A5C4D9A5D306E301CA2A723BE16E", + "l": 1024, + "algorithmId": "59763F5DAC29E792E864FEFA04389DFB" + }, + "fixedInfoPartyU": { + "partyId": "00D3854F8F680EE32E04037B3DDA20D4", + "ephemeralData": "4B3005E480C11D568DF968EAB8D1727188B369B6816A61DA0237183B751138" + }, + "fixedInfoPartyV": { + "partyId": "797782991963D7E8BB2520491563731D" + } + }, + { + "tcId": 2447, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DFB2056EAEFE51EAFAAB5138CB2D8545", + "z": "F5FC246399F0369C679FACE44E1F2E7C1571DEBDB919DC0F554593825FA99C", + "l": 1024, + "algorithmId": "8F8F7C1A3BC5ED2F64AA23B583EAE2EE" + }, + "fixedInfoPartyU": { + "partyId": "1CEE981EEE1D2FFFFC0C1D709EE53A29" + }, + "fixedInfoPartyV": { + "partyId": "E0EAF1ABA24BC241FD33CEB74F7F813C" + } + }, + { + "tcId": 2448, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FFBA4262EA90B6502064DE236AA194B", + "z": "9EA7853E443182C5A8E19C078317EBAE5019D9BA0B84316127EA3FDA84774A", + "l": 1024, + "algorithmId": "8C61A3DCF01007C4C4D62F4AAA338813" + }, + "fixedInfoPartyU": { + "partyId": "284C425E0448F1614D871E64A6810C1F" + }, + "fixedInfoPartyV": { + "partyId": "89DBE8A60E57BFCF68F3F3200E42FBBB" + } + }, + { + "tcId": 2449, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1340F1D1455659671E6F6C8381B94504", + "z": "1E7428A629E3355B5874143D6CEAD2A1BDC299BE3E2886C9CFB893C2E0D56C", + "l": 1024, + "algorithmId": "CE162B27A0ED271BF0BA7E009102A4C8" + }, + "fixedInfoPartyU": { + "partyId": "85B02E5AFBF0764B3B534B5233DAE72A" + }, + "fixedInfoPartyV": { + "partyId": "11A0298FAF8C847CF8FF0284E773B59C", + "ephemeralData": "4DBC8BC6C6D53BDBE5A53601730A845E852DFD7823C721AE7E556B8FBFD714" + } + }, + { + "tcId": 2450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4C29BA754E159377ABB3943DB525D57", + "z": "38C0631383D107B49BC4081562B024DCDA94BDD9A198A5A0946D9FB548705E", + "l": 1024, + "algorithmId": "1AD908DA8BCF3FB0E014446DBB4CC2EE" + }, + "fixedInfoPartyU": { + "partyId": "BDE297AB35B2C8E97A23C0692C1A7C14", + "ephemeralData": "1DF08E554D7936001B7168A35C8C5FE53C81EACDAE93D59AACAC39F72F057E" + }, + "fixedInfoPartyV": { + "partyId": "FEAD742C94916ED0DB41905E95DF1424", + "ephemeralData": "8CEEDCD7348CB11E55DEEB0AB88A76E50C565FC0C12FE90D3A1A860A4B5076" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 99, + "testType": "AFT", + "tests": [ + { + "tcId": 2451, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5601CB7E6B5A9298C0F5B4088D7A86EE", + "z": "3FD1BB5456433B872F66DFFA7529120666E33042564A880416380B53", + "l": 1024, + "algorithmId": "39535B6ECD59A902AB50ABD1697C490A" + }, + "fixedInfoPartyU": { + "partyId": "D84A243C66353C22627A03A7362DE450" + }, + "fixedInfoPartyV": { + "partyId": "B748C1E2C718CFD1659F71E56985BA8E", + "ephemeralData": "6134D6D18D736BD54B01C5856BF063F300A9BD52C69803BEAC035E05" + } + }, + { + "tcId": 2452, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7003E69B77B7302DBB1E25D40A60562E", + "z": "740218A07DD1E409D3E67EC7451E5FB139B8AB3BE08BEADD02A4E7C5", + "l": 1024, + "algorithmId": "E0AED1ED88CB08155A4297A430D3BEA3" + }, + "fixedInfoPartyU": { + "partyId": "29CE7FCA4302AB2C05C35B052FBECADF" + }, + "fixedInfoPartyV": { + "partyId": "E7C5622716E0662FFF1CB07212CD09E4", + "ephemeralData": "E2F5D62FA11A6C62350EBB10A8158A09A27B1B18189B563389EC7101" + } + }, + { + "tcId": 2453, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48A5CD5C8D316C81431E67EE52DCF5BB", + "z": "265F0B1CF3F3EA91E985EA91F3A9AD1F110BD7DAE2A87CEC965C7346", + "l": 1024, + "algorithmId": "B7B64869EAB59AC5451AAB92E04E3A5A" + }, + "fixedInfoPartyU": { + "partyId": "1677FA4D3FCB20EBF5A36CF5F8E98D7A", + "ephemeralData": "1E7108B409B21C12EE4D67811DE179697F5BB7BB4772FB3DC2D4240C" + }, + "fixedInfoPartyV": { + "partyId": "B539B176913C638AE60F97DC72979C46", + "ephemeralData": "2B1E92FA69D1A2E8201F00538A350ECA71F048272A92CB21EAA78275" + } + }, + { + "tcId": 2454, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D92513DC85A022A4B0616827D0DAC414", + "z": "7DC50FB3DF1AE2A94F3D5598A6A00193443F2B7FB4389C5A8396121A", + "l": 1024, + "algorithmId": "03E2A0B0FF81D985DFEF789F69C01448" + }, + "fixedInfoPartyU": { + "partyId": "FC51268C77A85F099EE4A7B371026AD7", + "ephemeralData": "AD399D011DEC90CD2914DCBAD74AD0B6F73830D6D586EDFA81A21C1C" + }, + "fixedInfoPartyV": { + "partyId": "77DD9B7B7DDDFC22F397B61E9182C3C5", + "ephemeralData": "FFBEB5573900D8A7AD130FD9B35C7F84308C5BD33C49D19F5D8F52A7" + } + }, + { + "tcId": 2455, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACAC0BA36CC4E1184FBF56D29B2AC73D", + "z": "E0DFE8464B9B8030212B015139D5ABD06A5C957F9DC481D492442659", + "l": 1024, + "algorithmId": "2F724EA1CCA5937E4F871CC1F83805A2" + }, + "fixedInfoPartyU": { + "partyId": "3C1C8D02BC5BDF0A7A72F8E772AC1B58" + }, + "fixedInfoPartyV": { + "partyId": "A1EB4CF88BD97C8ADFA21B8A0B6D7E54", + "ephemeralData": "987C5D930A00CDD57269F1515E63A31F6FA6712F5B39D782E9E96345" + } + }, + { + "tcId": 2456, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF0A55D1174CD4FDD1AC740522EF343F", + "z": "D8F8A34199A803709766A40A8AA9A1F6C32996DA7CDB763E33B77BFE", + "l": 1024, + "algorithmId": "D31750AF038C93D41C7241ADF575ED0E" + }, + "fixedInfoPartyU": { + "partyId": "6F477258C995E49833049D897F4A5BF4", + "ephemeralData": "0E26F1759C593AAA4B7F88027D9AF11ED2FB7E73EF2D0DC22B5CDAE8" + }, + "fixedInfoPartyV": { + "partyId": "1E16901D4D31AD9CC8594D39BBFD3E9D", + "ephemeralData": "5655E0D198D098408134521EE7D0B6BF81AEA123C8EA554BFAF27961" + } + }, + { + "tcId": 2457, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FC295FFBE1EB353C86CF4D3DB948244", + "z": "E786F411208A1C282F41C07FDC2F7BA1D92ACFA4875F8EFD5D0AD90D", + "l": 1024, + "algorithmId": "786628DEF3512B293FC04E9BDABC7E14" + }, + "fixedInfoPartyU": { + "partyId": "03370D22B67A091D04E54169933F0130", + "ephemeralData": "4675BF2B955F70978FA2577707094BE94FF1E793533E3F4184D82692" + }, + "fixedInfoPartyV": { + "partyId": "5AD54000C2EE63AECD7F5787E41B0C8B" + } + }, + { + "tcId": 2458, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83DDD53B5476796F502A3628E5F1FB7B", + "z": "4A1CB05207861FD19DF483318008A06AAE540A5CBCE022FB9A217240", + "l": 1024, + "algorithmId": "32A578F5319F99898075B0C38B017C3E" + }, + "fixedInfoPartyU": { + "partyId": "1D89351A58370A5783F01BBCB4442039" + }, + "fixedInfoPartyV": { + "partyId": "064A4719EB20B23FE0B723F570CEE67B" + } + }, + { + "tcId": 2459, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6107EEB84765F0EE76F3F48766B4751E", + "z": "BEACB92327CD09BE23A0010B5BBBB93446CB9441FD0B0449E9E5FEC1", + "l": 1024, + "algorithmId": "D1E7A8D2E61F4724D8B533AF9A2F161B" + }, + "fixedInfoPartyU": { + "partyId": "F224B7691A88FEC3D424BE3F36206DCD" + }, + "fixedInfoPartyV": { + "partyId": "5890C6BD31B7A2E44DB63C0A353541AC", + "ephemeralData": "6D1B5AE86930C388777776FEDAE507B986790C98E79475079474D42F" + } + }, + { + "tcId": 2460, + "kdfParameter": { + "kdfType": "oneStep", + "t": "180FD6122D93E281FEE874F7E906FCEB", + "z": "BE5A255FD127E015EE82A2E6047C9023E6232C2D03D20B6F1DB4DB51", + "l": 1024, + "algorithmId": "3E22405084061F8E5B046EA0DB244745" + }, + "fixedInfoPartyU": { + "partyId": "CBBB032AE0CF048C7433ED10B848D7DB" + }, + "fixedInfoPartyV": { + "partyId": "B149BEE2B3710320536F468E65F1DA02" + } + }, + { + "tcId": 2461, + "kdfParameter": { + "kdfType": "oneStep", + "t": "622C721C2AF731CCF4E090240F1853C0", + "z": "D7E5585D92C4295CDB053C7006D3DF1DB3B01205F72E5B883E4257F9", + "l": 1024, + "algorithmId": "F3465543C378B0D3AD5AFA09B14D3D23" + }, + "fixedInfoPartyU": { + "partyId": "11092025656B0712EBC9158360903003", + "ephemeralData": "D169F3E71507305081D5F456752FE1AF93D006516DE0BAF15EECD72C" + }, + "fixedInfoPartyV": { + "partyId": "0F31F3B0761179F88130B2B21F3BB59F", + "ephemeralData": "E2DD7CAEB0FCE1B0CA9BCD0E51FE76D6CFFC8F90342CCEEF3B256358" + } + }, + { + "tcId": 2462, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F96F4A7DF5C07F58D0C3C6350102DA0", + "z": "6983B8B6E6A592881CCCF1456114F81DB52B7C8C32803E7961300C9E", + "l": 1024, + "algorithmId": "EEA1492867DA67219EC062707845C322" + }, + "fixedInfoPartyU": { + "partyId": "E7C3DEAC627440181BC83BD12CF7E006", + "ephemeralData": "7C0549F82FE2E4FE85AC2B17BAC1AB4A670B167927B69AFAF2FD6F57" + }, + "fixedInfoPartyV": { + "partyId": "25570541460B7686495FD5BDCFAA6F6A", + "ephemeralData": "20A034784B75A93C6C09BD3994B1FACD8C72126117B295A7B394CEB4" + } + }, + { + "tcId": 2463, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9EDC2D93C6FACF48216AB8728E184764", + "z": "9EDED9A3C1FC2651BD3516201963F8AC5DFBF63D8F2A2709B2D71034", + "l": 1024, + "algorithmId": "D7BBC1A90C8F399C432F9C6D26FA0E79" + }, + "fixedInfoPartyU": { + "partyId": "7C51881D3CCD08E999D8F15C6EB068A2", + "ephemeralData": "49182FCA1FBB018C46D4ED8B49300F15140D4D1EF77CA6E16B50750C" + }, + "fixedInfoPartyV": { + "partyId": "A33D7633C2C0328D6396047FD5C89FF9", + "ephemeralData": "2C59BCCD79109438857EFE338EB1A131BA0B30357C9B91F39CF8D484" + } + }, + { + "tcId": 2464, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33D2355B70BA97291236D245533B51CA", + "z": "16FF52CAF76F1F98085283704BB8970566BC2DB767742AE4FEE944C9", + "l": 1024, + "algorithmId": "10E7512E54440631318E4DAE286401C9" + }, + "fixedInfoPartyU": { + "partyId": "189CD4DC9F2CE868E98A1133FCD51D92" + }, + "fixedInfoPartyV": { + "partyId": "2B9134F1D5AA9ACAE2D7006FDF910CCF", + "ephemeralData": "DF766919FE1D23376D45FBE15682C42CB25787E3CE0DF433C05799D4" + } + }, + { + "tcId": 2465, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88D7795DF4C7477DB4F1EE02DAF24B28", + "z": "3BBF3F6A68C2CBCF4FC3402005FC1AC5F5EBD804330BC814E56F943C", + "l": 1024, + "algorithmId": "9E0B2A5B338C9A70288705833CF35C56" + }, + "fixedInfoPartyU": { + "partyId": "2AD6BE3F5F8A25BBC6F603C2F7CB923D" + }, + "fixedInfoPartyV": { + "partyId": "09D47B06D271B987B61DD3C24B62EEFC" + } + }, + { + "tcId": 2466, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC921C8F21CB3831022C9C78926A9C7B", + "z": "7BE62BA01B2827CE6C2A08017CCA7FA5F2F3E95025EC9B448CE3B49D", + "l": 1024, + "algorithmId": "B4126B0159FB2AB468B363B4172ECDB7" + }, + "fixedInfoPartyU": { + "partyId": "8E4145AFE06F85884CBB4E9797D89197", + "ephemeralData": "987BF47DC3565A5B10BE8D70B519ECC78C75DD26F287204F6DB25D3A" + }, + "fixedInfoPartyV": { + "partyId": "7171A55171480D33CD657199E589BC49", + "ephemeralData": "4562814B8656F3905469A8EFA45AF0EF06DF4D7E82B83E2B5699C0C0" + } + }, + { + "tcId": 2467, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C39B40908A716AF79D4283BA02298772", + "z": "EC2B8B5A76FEED4F008C90BDA58DA94F8DAD6AF652DF06D4AA3CC1F6", + "l": 1024, + "algorithmId": "5350D68B43D0A77150AFDA5623289DFA" + }, + "fixedInfoPartyU": { + "partyId": "500CD7A86B7FA699C94D0C0B30BF2469" + }, + "fixedInfoPartyV": { + "partyId": "DA484FC5C308749BB3FFCDCBDC4E4EB5" + } + }, + { + "tcId": 2468, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82B150CD4797B3124CCF98743A32EC4F", + "z": "5A3448FA05B21ADE450838BFACBC4ECF8E821A49112F08AA40D363DC", + "l": 1024, + "algorithmId": "61C07D469364B9A4E44C7C0E4794CA9D" + }, + "fixedInfoPartyU": { + "partyId": "59F121BD46B77FAAE2B6E207541705E5", + "ephemeralData": "813F02D997ED862D03432CD4D36245CEB1C2A36C489588EAF7C47C41" + }, + "fixedInfoPartyV": { + "partyId": "3F9B0C827CFB6370CBB8EF5828BD87C1" + } + }, + { + "tcId": 2469, + "kdfParameter": { + "kdfType": "oneStep", + "t": "479AFCF3BD3580DCAD76887754934DF8", + "z": "8951D74936E82F4B38461735954959F85AC7815A9A6AA28BE3FEEDDA", + "l": 1024, + "algorithmId": "E42AE208F408F4961DA11C092E85C0BF" + }, + "fixedInfoPartyU": { + "partyId": "F6F9F9E3565846E31B19C05A9A2AE3E7", + "ephemeralData": "BEEFB12E3F37FF2D5777B2E050B49AC804AAFC61B5DB87A03783B51C" + }, + "fixedInfoPartyV": { + "partyId": "C4F8E44E5B4752CD212C75F1355155F0", + "ephemeralData": "6B8E83926D521374AA0CC51D98EE08447E1C939E82460205A4AC1B16" + } + }, + { + "tcId": 2470, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AABA22751231DB3BB38646F264660D3A", + "z": "9B686D8D751B813825F9A3A069B4ADE8A79C94AA7C0C8DE5475D9093", + "l": 1024, + "algorithmId": "8CFFC8F204312AD1046C3877A32014BB" + }, + "fixedInfoPartyU": { + "partyId": "5EB9EA01ACA6B76A6270876FAF8E5907" + }, + "fixedInfoPartyV": { + "partyId": "2578B9E87411719529D271C7278ECBDF" + } + }, + { + "tcId": 2471, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1565981BB92504D3E17C1C394597E7B3", + "z": "0230C0993698277FEDEE99A251A9AA4C919FFC3507554A22F87DAEBD", + "l": 1024, + "algorithmId": "68C7FA2E58BDD3B923627D0704A21553" + }, + "fixedInfoPartyU": { + "partyId": "3C1090916946CE7C809BA86D2107A958", + "ephemeralData": "52D3D4290FA4237EF58BAF531A615F4715959677A98217D35A2995EB" + }, + "fixedInfoPartyV": { + "partyId": "12F677859285A7072BAEB85C16EF5C84", + "ephemeralData": "2AAB1236B18EB97FA61B252F43FE3119F0C7FE4784E03E4FE56F356A" + } + }, + { + "tcId": 2472, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3C7AB816DC3877145F0A8D9AD7FAE4A6", + "z": "586D7E4E960E56C3F4B94113902779938FDB4D33781459FDDBD4D99A", + "l": 1024, + "algorithmId": "E897B7CEA64534F7782E1ACF81DD5824" + }, + "fixedInfoPartyU": { + "partyId": "4DA381CF4DEBBBE3F50C09B93F6152E1", + "ephemeralData": "5657AD326C89D69CEBE096BCEB7F8D3DCA437886FED4C8A7509BCC7A" + }, + "fixedInfoPartyV": { + "partyId": "9033408D893907D2B1D3E4C1B342256C", + "ephemeralData": "5DB419CDBA5909903661917E71FA1D2E42A41561C3EA12616C2EA52A" + } + }, + { + "tcId": 2473, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5FBCD6565F2C831B4974CED5986E196D", + "z": "0184B91309309755649826CE7CCE70D414AEA32A192F46D410087BA2", + "l": 1024, + "algorithmId": "3D95DA2D0E7FC1B52D3173849F0287D8" + }, + "fixedInfoPartyU": { + "partyId": "326D54E9276984D2B16B1F05DFD7D246" + }, + "fixedInfoPartyV": { + "partyId": "C11AFDFE4B0B09573D2F91B0B4AA745F" + } + }, + { + "tcId": 2474, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0CF2C002220BD255782D6DE0330696E7", + "z": "907168954943B35FF44300D730B22D9A7F6A63217753BF8B2A056BA9", + "l": 1024, + "algorithmId": "121DB8DD018B80257AB71F63C6E0C2B6" + }, + "fixedInfoPartyU": { + "partyId": "7D128F432886F2B372587E8D64789514" + }, + "fixedInfoPartyV": { + "partyId": "4E2395BB27F5ADFE7C014ADA2027DDAD" + } + }, + { + "tcId": 2475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0656F2F9EB06A382D3669BCC91D6E0E", + "z": "9CC7837C4D800B67CF59795A7646263C61630323D943F753392F95D7", + "l": 1024, + "algorithmId": "03F1F96B76F45279CAEF7F0700B0B2B7" + }, + "fixedInfoPartyU": { + "partyId": "B8A5432B17AFB7C9D69E43EC099B51CE", + "ephemeralData": "CAA3AC6F87F8745A68D20AA630D0BDE114CC489516B5433A2311F0D4" + }, + "fixedInfoPartyV": { + "partyId": "FA56F2E50D9478B692A748C76524A442" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 100, + "testType": "AFT", + "tests": [ + { + "tcId": 2476, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF2EF9CD2DA6E6002E418D2849D81C5F", + "z": "23EA5F11488B4DB58C52E626CBBB90565E0A6A2CF8B9308872F7067EB151", + "l": 1024, + "algorithmId": "BC753B8428C28D00A65191461276CCDB" + }, + "fixedInfoPartyU": { + "partyId": "D6612F8FA794ECC56FBDD2D7035F07D9", + "ephemeralData": "FCAA523A064BD38386060B241F96462861AE7B30FBC46C47D201721690A2" + }, + "fixedInfoPartyV": { + "partyId": "F48CD612971735D7B0D4CF6F24B4EC85" + } + }, + { + "tcId": 2477, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7385733197AB4A59A5CAA30D5E6E3C4", + "z": "6512DA62DF4F9FDAAE4BA8CEB4B4FB5DFCF8C9EEEDB08C596F7BA2D70C20", + "l": 1024, + "algorithmId": "9BA89E8AFB2C6AA00D7F8C8E0779AB4A" + }, + "fixedInfoPartyU": { + "partyId": "93BB42245989552005C67EDA843249D9", + "ephemeralData": "89F11F7993AE34DF217496A4134A7A7E0D9B533831725C8F887F657F56A8" + }, + "fixedInfoPartyV": { + "partyId": "B18E4C6827A3C15A009283B93EBCE397", + "ephemeralData": "B94CF3E2B94AE7FB545D975499E96A700FEBB64B76862DFC172ED9DF0A48" + } + }, + { + "tcId": 2478, + "kdfParameter": { + "kdfType": "oneStep", + "t": "587A8CF66336F7E9696D65600065094B", + "z": "58EE8924FFB1CF7E2494255C3451F3FD972BF31AD6584AA7529F90CB1BB5", + "l": 1024, + "algorithmId": "3C2DC95EDD2E6F6963BB24810D681E34" + }, + "fixedInfoPartyU": { + "partyId": "794B89A81A61F89D9CFE4328D5F5DC6C", + "ephemeralData": "7C79C46496B5F5BA6E56FE3D69FF5B1E2E9FDEFC9D90C3542FC21142FA52" + }, + "fixedInfoPartyV": { + "partyId": "BD01A69711A0ACAA46AB8FD1C23884F4", + "ephemeralData": "D7445D91BFB8AF8F5DDDA577A8144A90CB2C5C4D3FE4E77A0D1FA8BF43C9" + } + }, + { + "tcId": 2479, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADC621B0FC296D113501BA0172C94AB8", + "z": "A9DF6BF8C6D95131791E1474B4E7BECC55AA1B9C72939E4A7908511BB0AB", + "l": 1024, + "algorithmId": "4CF060678357DD5A6AA609D80AFCDA0B" + }, + "fixedInfoPartyU": { + "partyId": "E51E8FDF2B003F449E45B7D8AA1738B9", + "ephemeralData": "99F313356F4879147DFF0463B8EABEDE804178CA7E328EB2ADFC156AA0BB" + }, + "fixedInfoPartyV": { + "partyId": "267A39A61C648BBC9474CB3D3BF432A2" + } + }, + { + "tcId": 2480, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1CFE75E52687A3D56E4B83E0F4604553", + "z": "266A66D44BA52CA8CC43ACBDBFF7D0F3884EF8F071F906A9BC931BEAE21A", + "l": 1024, + "algorithmId": "BDBC7D5AC3E35D1D114CF209AAB9F1AF" + }, + "fixedInfoPartyU": { + "partyId": "53926FFA599C962AA09277A8C65EA72B" + }, + "fixedInfoPartyV": { + "partyId": "9C42E84876BE3A4ED952B8262FB7AF4D", + "ephemeralData": "E12AD33D59ED0CEF04F6B3B6872A529A39D2EA102795563D7BE087994945" + } + }, + { + "tcId": 2481, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F26A35BB54FD21A36D18FC70F68C4FB3", + "z": "099C0960B8BC028B723A0EF2EBD512561DB33D5DDEBA746FDD0027940784", + "l": 1024, + "algorithmId": "970B38907E4D23BF625D9A2A0325D5FE" + }, + "fixedInfoPartyU": { + "partyId": "DB9E913C17DFD697E3A488FA5AB989A7", + "ephemeralData": "36222E1C54F16ECD235983D337B0D8667D476B927C11B85C43CF7FEACA85" + }, + "fixedInfoPartyV": { + "partyId": "78110CE8A25D46D78AB13EDAFFE063F9", + "ephemeralData": "3AB7268D5F262628A2488A2F83DB952E267B8D7CFC626058CB5A8B3F7959" + } + }, + { + "tcId": 2482, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACEB20D4B0B49A6EF9C96A4BD0B03284", + "z": "D148FA26FD75CB832D3873B62409F69F6B8266536CA98694FC68E7A3FCC0", + "l": 1024, + "algorithmId": "40712B38A0C0DA371281FD9595F63F36" + }, + "fixedInfoPartyU": { + "partyId": "6216DE27299E87D789883BDF14EF163E" + }, + "fixedInfoPartyV": { + "partyId": "3D9AD56B72D7799273776AB0A6BEFA02" + } + }, + { + "tcId": 2483, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5ED47FFF3E8701556D7AE53AD09E716E", + "z": "32BA674E7111D3AF0AEAFCE7B3C7251C66A5C41E0A44F81DE48E98B3904A", + "l": 1024, + "algorithmId": "F70A5AAC6E4F87BDE7714168A4DE8BB8" + }, + "fixedInfoPartyU": { + "partyId": "B6C7308BA6548A6971A71C24F0B33DE7" + }, + "fixedInfoPartyV": { + "partyId": "3DB6951C86DFE03F74D7984C7761E4EE", + "ephemeralData": "4CEBC73BE57CDBA59BBA588260A85A0C7E7E43A85D4A557E0041B410E022" + } + }, + { + "tcId": 2484, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35C109B050A4897BE9D95D2225EC73CE", + "z": "2547925087CE4A4947FC4E7AA0C831E7C37E72FD6C1B72D58A837E9D3014", + "l": 1024, + "algorithmId": "56A3E3C447059EFB4F75EB1BCC70A8A7" + }, + "fixedInfoPartyU": { + "partyId": "675FB6097A9E43D325469432CFDCF19E", + "ephemeralData": "3D81AF36CCA3EB5390AE950CCEF62B423AFCAF53E7CD39738F108773A1B7" + }, + "fixedInfoPartyV": { + "partyId": "75F3AC659569618D9DD3F0981B66EA93", + "ephemeralData": "2B182BAA40585752A1E04968538FB7C35843E3884D26BCD253E7134E5B09" + } + }, + { + "tcId": 2485, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C04E6A4987914DF65F2F4E93C65FDAA", + "z": "F95F9A4F2FA01ED80987B763E8CAB0C591927E6B81E6C8C92672DD400BEB", + "l": 1024, + "algorithmId": "16C74E9B02F2075BEF91D9AF2E949212" + }, + "fixedInfoPartyU": { + "partyId": "748868559D3383A4EA0E8F175503744A", + "ephemeralData": "B3EA84DF44E0A2357A3C7AF736ED692FD6433D2233E2154C82BBCDC84E4D" + }, + "fixedInfoPartyV": { + "partyId": "ADEB5C3540B6F18E2C974B025C2B9570", + "ephemeralData": "45FCC305A7C1D1E3D4E6118CC22E2BC8A376EC2518D296F99131683303AD" + } + }, + { + "tcId": 2486, + "kdfParameter": { + "kdfType": "oneStep", + "t": "65B06CCC2562158E9A3B1526958102C6", + "z": "B6401A2DAC2DAC2806B1A5F5958C1B20FAFF29828FCBBABB2C044878FE0B", + "l": 1024, + "algorithmId": "C233E7109E2BD0818FDBA230BC4668C1" + }, + "fixedInfoPartyU": { + "partyId": "119296CAC6469ABEEA6F1192C61F15C2" + }, + "fixedInfoPartyV": { + "partyId": "7AA1FE581BCBD604B30A77369946F594" + } + }, + { + "tcId": 2487, + "kdfParameter": { + "kdfType": "oneStep", + "t": "891F6B3F4ADDF66220444299D55BCD0D", + "z": "F4EFFD9FF8B4F99D793802E3F42FF0F3B804C9F01FDF27F751D6606A0BB6", + "l": 1024, + "algorithmId": "E7F9C5D91FDC1413BE3FCDF30119F83C" + }, + "fixedInfoPartyU": { + "partyId": "7A5279F533D5BC10985ACD6952F5A77F" + }, + "fixedInfoPartyV": { + "partyId": "37FAB1DDAC716E3C511D874B1AED03A9", + "ephemeralData": "33EBE85F2D01D81F33D902F9F6DC39A72383042C27E39796254EB2D449A0" + } + }, + { + "tcId": 2488, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E64E54D16F286B75F329523E72734571", + "z": "7E5F6F2C9CC092245DEFADD056A91F5DFDB2AB7A90704F4C82696A916D2E", + "l": 1024, + "algorithmId": "D468912FAF03A0CED2ED88DBA18FE9E4" + }, + "fixedInfoPartyU": { + "partyId": "7ED7AD0123F9EE6AFE00C2801C517901", + "ephemeralData": "5CCBB3E1EBAB1F9B7D9559008FF2EFDD56CDAAFE48D0F7A1847AC5090E77" + }, + "fixedInfoPartyV": { + "partyId": "530179AF25B0F486B85661B45B41BA77", + "ephemeralData": "CD70A90B083A987BA1726844D1732BEDA28F1AEA72FAAB25D71E0E341C98" + } + }, + { + "tcId": 2489, + "kdfParameter": { + "kdfType": "oneStep", + "t": "422EAB67DC843FCEE8100AD54F4AE5E2", + "z": "80F8E6B67DC8F5D721BFA20A54B4A4CCB56EEBAE2D85B785F837F0C1ADEA", + "l": 1024, + "algorithmId": "7C3A86A340991987925C7C268565D900" + }, + "fixedInfoPartyU": { + "partyId": "245CA7CA9260E94449C4F55656EBDC2B" + }, + "fixedInfoPartyV": { + "partyId": "BF9F41BA27CBD6C8838BA11327DF7319" + } + }, + { + "tcId": 2490, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E5A09D6F61911301799AE624F9475ED", + "z": "2AB30A5BE73A490B48651A0113B26ED64087107B50AE24C9CAD72B8902F5", + "l": 1024, + "algorithmId": "2E29D6B609ECC41F6420CC1C8CFED3F7" + }, + "fixedInfoPartyU": { + "partyId": "883312A070AC2357FD4CB313BD69158E", + "ephemeralData": "A7F46DDDBCB421222DC9A665C18470BE6EEFF140F7ADC93F08C243AA3BEF" + }, + "fixedInfoPartyV": { + "partyId": "0C0CBB66F4290CCCE608CF6C57B115F8", + "ephemeralData": "C6D57C59F59D68EE0297402AFF05D4D22B058F8918C2C6E1CD511CFFEEB5" + } + }, + { + "tcId": 2491, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2238C345CFBFE9A7E842C02E1A649BBF", + "z": "E8D8B6F0DBAED722F93D20D047F39D722363F195CD5B3ED233EF4E0D6C7C", + "l": 1024, + "algorithmId": "6450070DA4C263C729B8989F98C4F197" + }, + "fixedInfoPartyU": { + "partyId": "512B61BF25C88B7402FAA027A02B03E4", + "ephemeralData": "3A185744D3F0A3D1FCC2C692E873661C43149F364A83E417F3FDDC217783" + }, + "fixedInfoPartyV": { + "partyId": "63C456A4BB1310E60CB73E6C555DACC1" + } + }, + { + "tcId": 2492, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5D3F3DF0512CF154C503E9E0643641E", + "z": "90024B9E90CDA2BB73341D7AE98EB932640701C5D6CD5D029753E7032648", + "l": 1024, + "algorithmId": "30D41EB6561E1F843E95151AB4DD1EE0" + }, + "fixedInfoPartyU": { + "partyId": "4F78C838E56187DCED1A900E784B905F", + "ephemeralData": "3A4EBCF30CA09EA1568EB634763D5BB7F9C319616AD471B579F677599DB0" + }, + "fixedInfoPartyV": { + "partyId": "D3B925390795176818A9ADED4A7D29F2", + "ephemeralData": "1C87201D0E24B20A0B789B37779922F986E9D6BBFB5AB6994451FA8AAA8E" + } + }, + { + "tcId": 2493, + "kdfParameter": { + "kdfType": "oneStep", + "t": "44E06F9357F098B0AAF70BCB23CAFABA", + "z": "F223F3C3137727B6DFA81C010A77E14C77F16BCC9EF98A492F33145831C8", + "l": 1024, + "algorithmId": "6E150DB2195F803F714A148B74BE6E33" + }, + "fixedInfoPartyU": { + "partyId": "8C3E2D2A40B08B3A01B481501BA0D0DD", + "ephemeralData": "B5676B76CF762CCB26D6CAFCC00667566B209D307AE99CC36D89DF0E4B39" + }, + "fixedInfoPartyV": { + "partyId": "638407677EDC62541314A88A5AEBE989" + } + }, + { + "tcId": 2494, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1BE4A9E0AA10F06F1BF7E525AAD2CCE7", + "z": "2FBD29163EEDCFDB36CB4E15264E3747509ED05488429D22057CF665F9A2", + "l": 1024, + "algorithmId": "D77092D2E87EA426F0D9CE198559E5B5" + }, + "fixedInfoPartyU": { + "partyId": "27909C6835AAE25A7A2CD94662BF7C0F" + }, + "fixedInfoPartyV": { + "partyId": "DFF8EE3E08951D6C509694BA5CD9A81E" + } + }, + { + "tcId": 2495, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6232373DC76A173C4049924CEDBDF4A4", + "z": "DFED22AED4676462CD554E15E080A8EE938B888AD508B257C819A442507D", + "l": 1024, + "algorithmId": "AC7C53E6E7C8D65CCBA75839EB14B1F7" + }, + "fixedInfoPartyU": { + "partyId": "C00777E50A9DDB93D810966A66A3258E", + "ephemeralData": "E84AB1394CA797582825E4654728C43419453CDEEEAF0DE4215D46C228A9" + }, + "fixedInfoPartyV": { + "partyId": "9C32A8BB58BF0331992AF9041FA75CEB" + } + }, + { + "tcId": 2496, + "kdfParameter": { + "kdfType": "oneStep", + "t": "610A1A75D1B8BCEB7DDC75917587E64B", + "z": "5356273B0ED289369D3CB16D48F880E0DBB836D83A71D8A622EA36205E7E", + "l": 1024, + "algorithmId": "D117A76932B80A24D6250EE4268BAFFF" + }, + "fixedInfoPartyU": { + "partyId": "A69C5703AF4029E7E0860AB356000A60" + }, + "fixedInfoPartyV": { + "partyId": "827EE6DB639628E02558AC2DD938DB0F", + "ephemeralData": "0B7CEFE2D231A85D337A1E4C2C492CEDDE9A8C71446118F9D6286135CED9" + } + }, + { + "tcId": 2497, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D826D42BDAAF9C01A272004CAFDEC1C2", + "z": "A324F1C2D8A2CE2813AA536D502C6CBB029BFA8026A30924074DD1F1BEA1", + "l": 1024, + "algorithmId": "A48BC5A495273B0F9A7DD48EC47A14CF" + }, + "fixedInfoPartyU": { + "partyId": "7780250BD59CBB57B9D4E6F34F143A6E" + }, + "fixedInfoPartyV": { + "partyId": "E43344752F22968D2ED266DBAE43E1FE" + } + }, + { + "tcId": 2498, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1D2FFF24BFC5AD0AEEF9CC81E43F07F", + "z": "3408BFC5BB2649E382953F23223E4FFA2EC6570CFE77F5B2821972D27967", + "l": 1024, + "algorithmId": "DABC18519C9AD7524A80041A966A16E6" + }, + "fixedInfoPartyU": { + "partyId": "9790CAA74E3EFCC14946D735D9045357", + "ephemeralData": "DB46012661F40922F9ED53B9A642EDF3BC5D4C8896E52C93DBCF0DAC60A2" + }, + "fixedInfoPartyV": { + "partyId": "FDBD414FAC717788275B5E23D38EB819", + "ephemeralData": "A940E2411E1B91949889BDCF7D0AE592B56D18A23DA9FA44D72364604B40" + } + }, + { + "tcId": 2499, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E094459EA76DECCA2970AD3D0A8C8778", + "z": "8AA6EBE0FBD2A6947370A73F89D90588465982D8CB8D3CBFFBF6AC9F2A20", + "l": 1024, + "algorithmId": "5571EC4EB1A3BAB0903114D8AA244353" + }, + "fixedInfoPartyU": { + "partyId": "EDD4717C50C87D5FC54D2390C3266AF1", + "ephemeralData": "F720DFC22A13B864B5965B6EDA0395D31BFAD9F896AD6FEC0615CE686384" + }, + "fixedInfoPartyV": { + "partyId": "EC548DE3533A63DCBB3E885B2CE4D222" + } + }, + { + "tcId": 2500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C2700E7812F506590EC7CFCC504C35C", + "z": "E689216F75AB7DEE0CBE14B40B7BEFF3753E8D3151049C79ADC74E58D2DA", + "l": 1024, + "algorithmId": "1D2BF28E5487493D0968B872D50597F9" + }, + "fixedInfoPartyU": { + "partyId": "5E4AABC16849AF56DC9ABB7A7B223D22", + "ephemeralData": "4B56CA05B49E5537FAC36BF42E1D12573D52A2DBE4CE4E124BDC053F5DF0" + }, + "fixedInfoPartyV": { + "partyId": "39BFD7AC2C0FF145E04AC47F234D3242", + "ephemeralData": "4E965C02E83CC893BE2F54A8A183F848462767EA25F58EF2567CA355F271" + } + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 101, + "testType": "VAL", + "tests": [ + { + "tcId": 2501, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A47014339982FC0DA538A893908E2366", + "z": "EC731D4F939583E5048781F21263E5689086BF6CD6C78DBBFDCF3C5C6003204B", + "l": 1024, + "algorithmId": "43F18C27A464A8AEA56C56EA0418C80C" + }, + "fixedInfoPartyU": { + "partyId": "94B3115BEAC83282DA16623AA075BF38", + "ephemeralData": "BF7E08B8F4F6058F2F0DD2420231EEB235F587B295B9FEEDE4717BE8A9ED2975" + }, + "fixedInfoPartyV": { + "partyId": "ABD0455D644CBC04444FF085A95ED461", + "ephemeralData": "344AD1A88586FEED9FC2B04B29DD33F97FE42B7D84E31ABD1BA3D6928222A8B4" + }, + "dkm": "BCDDA97399511EEFB6EC46515C8E20B98F4C5783F8CC4806867B6DECC00D09FAB3895E6522E1AEFF1EAAB3EF4A912E168DE7AED6A4510EB1B8B6FA8BCFFF9583B8E4015229E2661A11793430027F31C915301E1239EA1F8694035F492AB0D423F5CA15931F1D34BA41FAC8158970AF96D88E8699EBBDB0328B9CE06C0AB64894" + }, + { + "tcId": 2502, + "kdfParameter": { + "kdfType": "oneStep", + "t": "572320E226FC143179A059238B154398", + "z": "0757358C5D595722925BDBE615867E85CA82D144CAD418A3D2123FD363BEC211", + "l": 1024, + "algorithmId": "A97F8B794E35EA28395C88728BD0C2EB" + }, + "fixedInfoPartyU": { + "partyId": "5F34D6840BE7423159D61CCDB73DDDC7" + }, + "fixedInfoPartyV": { + "partyId": "C06D46B5E67B412C6636700D9963A031", + "ephemeralData": "79FC7C735ADBA051076DB96DF3955ACBF9224B0D50F3A4E42DA769FDCA946603" + }, + "dkm": "6598179FFE00C60632D3FBC89A51AAC70FAA686F1E0F55050F0357047188A6C7AC31BE54DCEFEA160C36600339BBB115F4E5A54A27E46ECA5ACC125740B6DD621CF89E664BF9B29B2A110EBC6C955FFA3C0C6E0501B511533868B73DC3F82E4E9D79DD779DF928FCB6054B0DEA7E368AABBA324047D88927132CA64A6AF67389" + }, + { + "tcId": 2503, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F0A91B055F8FDDB3CF70CABD9A41A5D", + "z": "BE1CAB32DEF53A5AE0DF15DF96095ECB98C03834425D8E13F98FFF927590002F", + "l": 1024, + "algorithmId": "55410BA1F09CAF50CC002BDBD17751ED" + }, + "fixedInfoPartyU": { + "partyId": "A307B5AF1DC5AA8A5EC2CB7AA1C05DA5" + }, + "fixedInfoPartyV": { + "partyId": "7268C7B109571BB0201A5F7488528960" + }, + "dkm": "039FF7715302F4B45B66249328A49758A8C833F03C940AE5BEE80146ADA5A2B578FA6F40DEB73CF9CAA2E7ABE5BBF422FA37BEB74A4AE640F3AE8AAD0F80865B822E75163E48E9AE3D4FD4438F16E2A5ED34A5417EF0874EBFAD121CA6C2556F22BE04846107F9DF3EEE777C0CA9DB9D86319634B5BE54FC736BE2722DF4B7FD" + }, + { + "tcId": 2504, + "kdfParameter": { + "kdfType": "oneStep", + "t": "78A793BBF595FB14EC1DF615A38A6DBC", + "z": "B6FD069E37F32781CC667E59A60CC07C27B8411AB73A937B738F3C2F69D903F0", + "l": 1024, + "algorithmId": "8874C722B194E949B9FC333308139EC3" + }, + "fixedInfoPartyU": { + "partyId": "D3D265BC822717DE80590BEE1FC01B41" + }, + "fixedInfoPartyV": { + "partyId": "9575D4584807E70C9C711E0186FB796E" + }, + "dkm": "07EC6D331A0E3ABCFDF4373F2C7EABF62EC1FD2478C3BAEC9497464ABF84619DB26A7DE4C711DAB826C5A15182BBA44F4AA1C9E1C264E75A378066102CFDBF1DCED856F4F10FDCB131D8ED161F1F338A05C70554150290ED2627F0EB80A8DD9DBA0111C352BCFF27E668CF984BEF33F4D5E315B2E4688776517CB50E68E40DC7" + }, + { + "tcId": 2505, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C506EA41145E5CC586CBCA5F054E6257", + "z": "0F2A18FAA4B35066E9C9CBBA194347EA32ECDAE75F2DEE52B8813EF287E145C7", + "l": 1024, + "algorithmId": "13A8924DE47855F96B2C590179D731B4" + }, + "fixedInfoPartyU": { + "partyId": "EA9E6B9D71B296E0182020B1071CB24E" + }, + "fixedInfoPartyV": { + "partyId": "C33ABEDC8BA221F87CFB0BEDA7F9292C", + "ephemeralData": "77D8038D7DFEB88A20A7616831EECE34C9B2FA4B581923382B27CA81E5BD3511" + }, + "dkm": "CA071AC3B013AEE55DF089C833D0A815F2F9FEA4F7A49A21597A438271733BE588B6E7112C75FD0B5C40F8A316B0FE1B531BE34DFD017DEF0FDC3ACBD9A6338CA90D5230481265365396208ABE9D14981E13015CCA3FF8D9AE45155776E9FA8AEE82EDB49C94F25DF7E1E87FAAC1AF57FF5D678432CFC62CA7073262663490E0" + }, + { + "tcId": 2506, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5E7A099490EEB0A10E46866703B676B", + "z": "7BA57ED4E0C1763432CB1313956C3E94230528E5F37FAEEA6A581B66E629B4B9", + "l": 1024, + "algorithmId": "C36BAEC167F5841C3EC8E3CCCB87189A" + }, + "fixedInfoPartyU": { + "partyId": "E22BF0E8B885D00E505C84850CAE009D", + "ephemeralData": "4A4349138D42861CE2109DF879E45603096B96775AF0B1F7E9A6E251335BB4EB" + }, + "fixedInfoPartyV": { + "partyId": "3996F66BD28E23081D4B4749CAE8FADE" + }, + "dkm": "6A10499260CEABDCB9A5A95E12683BB00A911370F5B76FAABBDB7EA54C5E437D3BDC09FD0B7AA1F6725D724F58263DAC9850CF199A08DFC1C5960792D5EFBCC089B08E907EE8A322A46441AA1363BB6A4CABA52EDAE0A4EDE85E9BFC19C3ABCC411B82A5A32F3DA1167DDE0F4C1CAE5227792B95AE9A207BEC9E7474877ADD0E" + }, + { + "tcId": 2507, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6219E4DF10DA41F2614731F34181B6A", + "z": "628974D78AD1EBF14E517C9A1167257D3ACBAF0AB37D09FED75FF05FE13DF6E0", + "l": 1024, + "algorithmId": "CAE24BB870866E01D666E52FF01105C2" + }, + "fixedInfoPartyU": { + "partyId": "6F1B60F5163641BB796B000DC290CF4D", + "ephemeralData": "CF91583B465956EEB97C2C081E3A651A8089FFD41F73EFEEA5631C0F362774D3" + }, + "fixedInfoPartyV": { + "partyId": "41E75AF7101E1D2DB33E2C610004B162", + "ephemeralData": "6F93C16C0DEBF18627EE1F88FB23BCA45E956A1DC2B8486DF7A6D050E1FADA95" + }, + "dkm": "07B6CDF74814BE51A32CEE6FF7004C4CE9FE6335F3A7041F39F8ECC1D124AF17D890E23C6771EA0B63F31948EFF6C09C3D8372537C5BBEB21E4DE1BF3A4EAB5A409E1A791ECD748EC604CA8D76281C6E9952E46CE88B95293BD6165D89159AED906A789A870EBD4867FFAD66AD350E7F8DA1AB420952C7193654506C0B3C23B2" + }, + { + "tcId": 2508, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C917C9D5212001A324A1CAAA0488B46", + "z": "AD239A299D4B8ABBEEDF5F5BD443FB9E2869E134AB7B9097802580DB660FFA5A", + "l": 1024, + "algorithmId": "B025C84192BC8029C0ED3B9D66BD050A" + }, + "fixedInfoPartyU": { + "partyId": "39FE9EA01908C865C6D5BEB84738B0EE" + }, + "fixedInfoPartyV": { + "partyId": "6DFC56883450AB211AFAB0BC38A2B4EA" + }, + "dkm": "7BAFA10BD52C58F46E3EFA00EA2A003961F6B7A8B32DBABB5E079038D5843A0F97ACB86A968979B2974E4B4D57096A9A79D3413F83B0151385455E66628994F12614876674912917EED742FAEEBC4FBC1437333210CACC73A6679B0580843A99C2CAC80FD99245A2893E0B01464D1C8F457D027632BAE047A1CB23FF16D7643F" + }, + { + "tcId": 2509, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54100A464A5C95535963C0B42CEDE5E8", + "z": "99BCFD5E55AF5F8343172C60E62F74C9CD76C15FCC9B5B6FC324E68C69728A0A", + "l": 1024, + "algorithmId": "B25B8891F2624C3765480253A88F426B" + }, + "fixedInfoPartyU": { + "partyId": "86C01D4BD7E4019279E8959E385A0E3B" + }, + "fixedInfoPartyV": { + "partyId": "BD4A45941B93E63EB417F60ECD38CE31" + }, + "dkm": "9E9AEB0EC6F07AF055D2413169BD2F247174F692824EF062588A19F4B4B8B21E35CFA661CB3A9B6576F606F662CDDF004391AE4222BE04518D31CB6934CAE7B6C95F00D7E6C3C9BCD814A4694BF288900CDAB0434ED121C95EF82A37171053DCE51CF8E3F6215323A1AF7EBFFCACC1C8B79A2B7A19CE336DF1ACC889162CC112" + }, + { + "tcId": 2510, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B689BA042F8680E7DC36289688C1FB0", + "z": "8052D00001BC8E2F37FACB39D200F0B393CCA7C08C9EDAF05211466ECBC03D58", + "l": 1024, + "algorithmId": "1B52AA75E322B51BF313F86ACB0BF399" + }, + "fixedInfoPartyU": { + "partyId": "67BC37C3AF773A0E6AAC87EA378BF74D" + }, + "fixedInfoPartyV": { + "partyId": "871F510F89DF9B89438DF1969AB08F64", + "ephemeralData": "57E8FFE0CCEB61F4FE05B7E6A2409B6555D2F8734B53FFC396432BA8941CC93E" + }, + "dkm": "A13BA9BA515B4787E9BFF7E09DB7E3D97D2CFCCF3D1D44A066E2E8F55A58477DAB147A7BAE89FAAF048569F8D9FA4607D68D25191E74E0AAF37E95FD031B7CAED58EC04967E3EE9FED0C50960FEC389A02B6DADF06D99A58EF644756536E3C3EBA070B6560DF838963EB39DE53A9FA1B8924B6974C5992E740ACAAF8F0A090F1" + }, + { + "tcId": 2511, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38398F82DEC3A77F79F058F572F67C9F", + "z": "BA366BE4C5321366DF7C68E7B811D4CF9F33E40CA4686B06AEA25132D7405DB3", + "l": 1024, + "algorithmId": "0828EC30D581B74AB84AA86CB28D5637" + }, + "fixedInfoPartyU": { + "partyId": "9B6D4BF0896C48DA4ED650ACD221497E" + }, + "fixedInfoPartyV": { + "partyId": "359ACADD1E1E7160E04A50817DAD0F24", + "ephemeralData": "D17EFD2FB7DF4BF2D6F8FD3C885CBF5097A61BEFF3FC9FDDC3FD7EF260C3C226" + }, + "dkm": "94B523537C566AAFED8DA43A744BC6C0B5FF6B74E6D82111A108EA104D63C4ADEACAA56DD8FA9BA7E9C752F3A21B665A3FCBC9DF8E8C0E2D80C79F55BB3C4222AD3D4C8D6A7062E0B89FA92F69ECBEA48736A1C1BCC4D2714CA24798179F7CD50D9868D5E5EAF78A6A59387A5473C84E72EC1A03C90394BE399335EB555D46A6" + }, + { + "tcId": 2512, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A16C67458A6A1B2FC0B42A5125725114", + "z": "42C085CDCC5D17964A618F17C824BA682514FCFBE23590E242D0CB95A6256FDB", + "l": 1024, + "algorithmId": "B8A6A6560860FBAA050F38E78DD74B75" + }, + "fixedInfoPartyU": { + "partyId": "33C4D2F4C0432F8048220081E62DBE8E" + }, + "fixedInfoPartyV": { + "partyId": "D05C74046D7E10DA0D4B8AA4428B2144", + "ephemeralData": "E7BA7CDAA4EFA6D8E133E900356489C52A52C355A14BE747DC9768A42DCF3D53" + }, + "dkm": "0298AFC2F53FD09D9F333FED9B6DCEE2157B4466A1CA89AFA0300014532B0B4B96E10BD461C0BABB03196945F1BA9D1CAD290741E8A6DCC17B7A31E4B61595A4B4B3ED9A50A742699A345B55D5C92296458A147B8DDD492A36EE2615FE86B2EBF2991CB25922EB6F2AF8AEC46FAF2839462B86EB789E065B618DBF75FFB3D7EE" + }, + { + "tcId": 2513, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D169C65D8C35A33ABEADB76596C6FE0", + "z": "84DD8045A601466C2ABF20D7C2D287A3FC76AE3CCB8D07417A2CF303C746F6D3", + "l": 1024, + "algorithmId": "E07DE1C67A8B26204258090034F25605" + }, + "fixedInfoPartyU": { + "partyId": "846E1E4D6E17F142EDDDB69ACFA62D0F" + }, + "fixedInfoPartyV": { + "partyId": "2AC13486F1BC5A1C36B38554C9DD35C7", + "ephemeralData": "56BCBCFB215C7D98F3A7BABAFF4A7DC17CD74DDC5008E67FE4A9EC61A6080FBB" + }, + "dkm": "2CB8D538B93FC3B584FECFF92398A44C6041A59F1D5B7028C6B4BEE2A784AF93338E775D6F17304E78BBA12A588C95D89E83DD9F050083D59B19856D9920C105AE6A9C5EAA52315EFF4051B72BA0B418CE8DF2229B27B9FFD9A8675D15E9CF009B302EC8FF15CBB4DC158FBC24DA5FD3A340AA6C924116D5E1B737C994CD301A" + }, + { + "tcId": 2514, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E88BE923AF87DC2303BC8A17CBD0C4DE", + "z": "A9138B98CD7A9F8B10F4A99B053FCC4923B8E5C799F5E9BEE5A37645E1B8D343", + "l": 1024, + "algorithmId": "716855E5C6661893373A20A99EA3489B" + }, + "fixedInfoPartyU": { + "partyId": "3E3B23952D0DEB20672C869C11837D8C", + "ephemeralData": "63687BC69CB0E5D8A0C387A7614A0C4BD6334CD6FCA556A8DF994D85AA566563" + }, + "fixedInfoPartyV": { + "partyId": "9E4A6A8630F332EA3007FFBC2534AA3B", + "ephemeralData": "9A6D1A9393747719054C1A0D172CC041ED2D18FC9DA0D2B6A1DC7BDDF1174957" + }, + "dkm": "C4F45FAB44569AAAD1DBFE84BE2820B197E298F13CDB5DBE2AD6207DB73FBC1F76951B60EDDD4D44E39255A9B70C6E42459FACADC8C47ED3559988438729A21FCF6FFA2EA76270F9B881E4E52BA8B8E2BF3C2D78D78A942DB64B39DDD3E1635C9AFC89A104B23133E7DA76BDE027A0DD363A56E5A421FC90F9A361C91C5C76CD" + }, + { + "tcId": 2515, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39DB35C9E22033C247F8B0C4C570A136", + "z": "81DD5B3C2396ED4A3EF740FB480759788558E5CB930901FAE012B91021B2A6AD", + "l": 1024, + "algorithmId": "09137F029333FFB7A73E5C56583543EE" + }, + "fixedInfoPartyU": { + "partyId": "DD7C65A7C3CA908F7CF8F1CD5CE6F923" + }, + "fixedInfoPartyV": { + "partyId": "249FA4EE2322D674AF6D3D932E70699B", + "ephemeralData": "2BEBA059D51A58AC78BB8F536DF1A048B971E49634766BB98A6187B7FCFFD16F" + }, + "dkm": "E2AA52685052C2DC8DCD73EA68DE1AC62B53903F9744D18B7457DBE189935F7BA9D30E12FEF9C7E3D5E6E7D488B0DBC6700774D4EEA6F554E1675D7C409CB0D64B2E4F1F76556BFE54014820ABDC20B5B4F0170F587C7C1C9DF8605BEC75C3EDBAE32FAAA55C44C27605FA47382CC6429CAC6542F0AB49EFC3DAFFA849A1DC8A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 102, + "testType": "VAL", + "tests": [ + { + "tcId": 2516, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F53CD68D2A9469F66282C22DDCB7DD66", + "z": "1489125B1E8431FE16ABBC5E611591E6A8842116CDA538F354F07732", + "l": 1024, + "algorithmId": "0CE10A7330F5B3D7783C7B7E8074DDE0" + }, + "fixedInfoPartyU": { + "partyId": "0BC5E9382E188D1AFBFE007600EA11E6", + "ephemeralData": "A3D0461993E532833605E691AEE1F8D1F300F6262BD1CC3354647BD9" + }, + "fixedInfoPartyV": { + "partyId": "0A4FD51945B3BF259681E1786C14DE7D", + "ephemeralData": "32D1884B77F07A94E148AD2DFCEC3AD096A7B9D4C003A67F37944807" + }, + "dkm": "272225FCC3200CF6A455D098F15F5AF5CAE0FE209DAB4C2FC0980E4F1DB3F27204CE0E3CF1BFB338D3BEB283E19E25FB77807FEFD283F2E10FC990B9C128FF07CB4D596ACC66C21AA095072E967835B3A74CE159EC91FD69EC0C0690EE8FBBAD436535E9B8CFE2C074D5BDF049ACF9EC716FF46665E61E5E6C911E776FE77A44" + }, + { + "tcId": 2517, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AB2B96084F311579E6883EF3C0B89AF", + "z": "5361ABE683C8BED8017B6A22AC89E2E7C0144053E4A1FA91CC0B96FC", + "l": 1024, + "algorithmId": "0409546756552E8DD2BA1565B84A4F06" + }, + "fixedInfoPartyU": { + "partyId": "AEE826E7B5733C48D159BB7CD3713621" + }, + "fixedInfoPartyV": { + "partyId": "98E5E688CE3DC2B13EF661478874B7A8" + }, + "dkm": "37924665D000E0BD283CAC332EEAEBAEA51DE5F6AD30A7C47D4B86246AD82DDE5115FBB0A0F6C7BF905F7EB22E468FB85DA7F977A744C214EA8EDAEFFC9048C2175133717924E862BCFBD0E5614ED94E9BB31F8B371ABD26E713D3D6141B20DBBC08F4D60B10E5871CDE749299C0950A22505EDED80087B168FD434A10C0D0D7" + }, + { + "tcId": 2518, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F315153074D8CF0EA9BCEF6094B74624", + "z": "F742DB07E1DEFE327FA34C198C735136A5E7777D8A405F3CAFAF681D", + "l": 1024, + "algorithmId": "62DA63C932A7A3542EB900C75084C4D0" + }, + "fixedInfoPartyU": { + "partyId": "E8172C06C5262AB36015B48E3FFD4528" + }, + "fixedInfoPartyV": { + "partyId": "1C61A8CE8A1EC19571E45A4B5BBD7217" + }, + "dkm": "23DFD0F961BC4DF3FE4B2B68A577E79D4C34E21E4B31D35F611D9EE87C1BB24C756BD5DF50BA6F5064231DA13F10AF7BBB767DA3087227E12066C0CE7F93164C9BFD3812FE2837F6B78B16387380A5CAEDF822B69D1260FA96ADD61EC41B9EF4A5C5A818A07D116598EE5B55FC976549BAED0907C0E28694169829DD7D8B501B" + }, + { + "tcId": 2519, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86E34B832B17029820689D08E50FB98E", + "z": "E88B2BD9B15518023B7C95619ABE2E30DFD407FF143CDDC2FD165F0C", + "l": 1024, + "algorithmId": "48F86E0C87CAD1BB5C3732EB244B414E" + }, + "fixedInfoPartyU": { + "partyId": "01E6FA7CB186FA57AD7B44ED70D90B1A" + }, + "fixedInfoPartyV": { + "partyId": "5196246509F384A8CFEDCA7C446AEF89", + "ephemeralData": "88BF44A1EB419DA4213C50E8543207BECA0F674211B2ECF2642EF3FA" + }, + "dkm": "A06C3EF2DE33B490D5C7A2EEB168861DA1F6ABE52C131A3B443CD7866AF7CC5BB7B9CFB7A03ACDB3377EEBCF1FFB78A9420A3D3C462297EA6C406D347B296D6B01398CF0BD0EDE957546AB0D6C86DC6ACFC5442EB2F359223CF88CD375DB361B1FAF6A1D53D5AEA3D19C8CB8B914F2724F4F172AAAF91B3531DACDEFBD2798F2" + }, + { + "tcId": 2520, + "kdfParameter": { + "kdfType": "oneStep", + "t": "147659507B1BAA44E37AC0571CAA9E73", + "z": "32435AB29CE70B3A78D98A01EAB24D0901242BE4D3390485D4C4E817", + "l": 1024, + "algorithmId": "C209EE41817736C4A85A77DD873E2C5D" + }, + "fixedInfoPartyU": { + "partyId": "2B37D7646E3C352A586962BF6A58DF5B" + }, + "fixedInfoPartyV": { + "partyId": "C12A2227010CDAFE7FC57931F7F7D978" + }, + "dkm": "1127D31CBB795592C12BED9D5F1B622DE4C6C6E26ED4EAC2F9EB4F66129E4F560D167E6DA4BBB8A5B2F6248E1997BCE78139E59F5856FE7CE12302A2FBE57C7DFA8698D91FA3B2C4F85FF1604AB71BC760D6BC139B321BD78C7041399FFAA8A99277A0FCD99AE74F7E73A7646C9BFF55CD1B436FBB17D33AA4BCD8C0B2A2BF64" + }, + { + "tcId": 2521, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9DD581697BBD8759A8DA35D49F4E1EE", + "z": "3DC723E65653AAD103E498E7ED592A2267ACA860327742E4A7C0B7DA", + "l": 1024, + "algorithmId": "CCB16C0589D61719A7264C163DBD73F9" + }, + "fixedInfoPartyU": { + "partyId": "B5E8C16AABE80AAC4DAE0C39C0918E91", + "ephemeralData": "B0DC410C7C162EEB16D1A13A7AC1C06A642FF7DA747DB0CD7F4B7725" + }, + "fixedInfoPartyV": { + "partyId": "155E4C13DEC4BE7CACC15E9EC1109938" + }, + "dkm": "33DFF03F2BC44C9F970248CF2260A39C360923564F73E585C497FC41D246DD1E8255F36812EE376D65F29FD06D5FC66C1BAFBAB839DE467B9243B89E747CA07B1AFB09821C31C6CF2AD14D231FD4698DD60CB064544EE8B347B7B80F224D82BA961025648EA34E507039CEBEF2EC49CBC3B876A1649A30A7ADE0CDE8C03A0A9D" + }, + { + "tcId": 2522, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC58DB0487A2330479818D2B2B5C7366", + "z": "83FAAB7E7AFD46B0676188B48BA0EF1CE988115B06F78CCB772D881D", + "l": 1024, + "algorithmId": "F53548174B02F9EC2A2664663CBEAAA8" + }, + "fixedInfoPartyU": { + "partyId": "30494866FD939C5A77BC15A010269FC2", + "ephemeralData": "DDAF536695BDAC35D44351D9311C6FD25AFB852A33923BF455B2A634" + }, + "fixedInfoPartyV": { + "partyId": "8F76DD9363CDDE859EF4D4144A1EC8AA" + }, + "dkm": "2C28ACCC37E91C8E1FC758B4268C9962980F166E55F0D94C1CDD9FEF467B1ABD44238B90C7ABDAECFCADBAB3EB1948DFB062D015AF271796185790BD0116A24F24A99C07C587B2003CB1BC2EB1677706F718940A5E9B26DAC838B9C1F1E586DB98016F2E04FB60096399448C09BD2541BF60BE87C058583E22EF24FEE89277D4" + }, + { + "tcId": 2523, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15A4D20BB4E322EF3049072BC15FB84C", + "z": "8CB7E7041C6595893409A8673EEC3569BF9FC27DD6DEC83AF772BC0B", + "l": 1024, + "algorithmId": "17BB8BFEFF070FF48D288EAEA6184D24" + }, + "fixedInfoPartyU": { + "partyId": "684389DA83DDC41842F4F26B228274AA", + "ephemeralData": "CAA325AA4077537D40092C521152F35556758B6FC9634CA536BAC689" + }, + "fixedInfoPartyV": { + "partyId": "66FC591F270556FC207AB5FD52005A85" + }, + "dkm": "8DDCA1BB63F848A9F734F5FC77C96D7230B7C66347679E08E874903D51EB518AD241AC42BA1A09FF0A88A8FD0A7F83264A5FF8443E4C48BC452E5D2DCE7AC003FCB92E820649078572E726F1ADBD11966C787AC1BA14B1829B954DF60680CE3564B101AE86431868B604CBE5D32E587CE711B133E9B95A38BF7D984C921C1BC2" + }, + { + "tcId": 2524, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE0CF1D7FE160F989722156D91E2577B", + "z": "AB6635C3FDC0B9BA544A6248D2B2649F3C32908A3FD8A3C735013C88", + "l": 1024, + "algorithmId": "C47682F50DD8B040451B24BBFECCE513" + }, + "fixedInfoPartyU": { + "partyId": "DD06A27ED8FC4080B88519A34E6E1C0E", + "ephemeralData": "650851FADF8598E3226D312D3D9272037CCE04B7A674B5445D34F8E6" + }, + "fixedInfoPartyV": { + "partyId": "15EBA8F966C94D313DDC1AE3B317D572", + "ephemeralData": "67DF0B5495E9981AECE2340EADF26354724EFFBB9871519B6ACE7C3C" + }, + "dkm": "0748C591ED0F6C3A359B59CD236C49FFBAF7833EC321302DBF9EA34133F475B3FF1DB58E29DE986556BF9997F4CA9C2AFD2D2694937B11AB6CC4F7605607B83B5AAD2B79BC70E54A07565616A87AAFC26402135E41B94AEBE5A987F6357148CD49AC06B477D226C5794A3DE63BEF1CF154747CD817069456C587882903689585" + }, + { + "tcId": 2525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5A97FE0ECD661F8EAFE6D53AE030F5C", + "z": "0620898F821CF8CC67AAC70AA531B8306BBA805795E6EAF60BDC29E3", + "l": 1024, + "algorithmId": "3916F0A68D32A1F155C116971938D568" + }, + "fixedInfoPartyU": { + "partyId": "02AFE00B3234B33862595CF77174D53F" + }, + "fixedInfoPartyV": { + "partyId": "08B78CBD9D523C6EE2F1B94669B9A30F" + }, + "dkm": "2CC62A817C5F4FE413FC7A2621B20E2D0FB54F02651175A658B7F982F2F00B01315B58ADFFEB2EA633CF29A858F3984578B7EDAC70B90221FD4A6899002333C2BC17A355FB51951CE9551540E610F2A498CFF5562490FA0E3F2E58AF31E344386A302FC157F9D7A7E76283ED40FA9BCA5C5DDDA8A5A592D7BBBDAB2B79910A1D" + }, + { + "tcId": 2526, + "kdfParameter": { + "kdfType": "oneStep", + "t": "728C75667748459625A125130221B134", + "z": "B368372F39CFDB5BFC7CD9BEC6BBB31D780D6DE7BBD7FE32BED549F0", + "l": 1024, + "algorithmId": "2322EA0FE7AF9643908E1BF8FE5CD15F" + }, + "fixedInfoPartyU": { + "partyId": "A51A66DA36F06314C5F73D09CE2A17D3", + "ephemeralData": "E85BB1F5BCE06E3F43D0E72396FB8F9B7A15178FF98CB8828AE20729" + }, + "fixedInfoPartyV": { + "partyId": "2579D59D5F50298530062229C0F42245" + }, + "dkm": "3CF6497D98BEACC0D7BDC547EAE9123FE2459434193D9A68F37479B17375545609965F197D281C590DA86669B9697125C385ADF8248EF6D5281F12C6F0F93F721237192A72E24478FD2AF1DDED7A9DF4A36DB0436CFF5C9FF87E667E633053B651C06AE76CA1B19DDCC5AF0E046E4C3E5895CB090B9D710FBC19443B1EE52199" + }, + { + "tcId": 2527, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DAD3CA7D87AFF99C942386DC31DF678", + "z": "29C36F6B977EAF00591A6750FA1BC91312AEA6C2E3682985BD07DB1A", + "l": 1024, + "algorithmId": "2D33EBE8BD6EE063BC2384285C39AECF" + }, + "fixedInfoPartyU": { + "partyId": "C600398D4EA875E40DA3D03226154A09", + "ephemeralData": "BFDA150E2642E0889177DA3F6516526F5C6A9D5421408880E3CFB630" + }, + "fixedInfoPartyV": { + "partyId": "33DD04D4C28946F4B93B0DB8AFC6CCCB" + }, + "dkm": "88EABBEB6BEDDCDDEE3449F220C429BC58A4B85A6A01FA18FDBEFC5AF756E22A4CBD104E0AA1C38F9F2F0324642F3B9CA5FC1BBAEA2224948F8E9ACCF84131DA3F96E7DA3B6B71C2E3B347B47D912332DE41D229D51D6BE16EE462E6A8A7D997DB98DD197CAE58E19EB93DBA934E1D632AA9AD247DB38309F71A6473A094D302" + }, + { + "tcId": 2528, + "kdfParameter": { + "kdfType": "oneStep", + "t": "079CFE8A29F311935F7375F549B491E5", + "z": "FD955B88AEA4CC267AB6FCAB34A9305E75F1E1A4C36F29C77BCA9722", + "l": 1024, + "algorithmId": "68CF2E79A5886C641A05C90E28BAFB24" + }, + "fixedInfoPartyU": { + "partyId": "13A4F121BCA05463E18280D0658FDCD6" + }, + "fixedInfoPartyV": { + "partyId": "946CF31BF355E121478D7DBE686200FD" + }, + "dkm": "BC737C5ACDE721667A66811462F920EBCD4C7BCE9A9ED6B21A16C0AC0C7B88A23925E283E30970740D2276390E973A6699F3CDA29FE8D366C1BA1DE41F84F0C7BD8E29433C93EB1A39B03CFC43175BD420B000E645D0FEF654C29FA3CE9C1B7EA8ABF8679FAA7558C6C5C9895C87418D8C26D96E6DC094529DD61056FCAF3470" + }, + { + "tcId": 2529, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6113703599CC24E78179F74B8836F1E7", + "z": "0AB23186835538390DA27E3320B3BCFD3ADD97EB827BF4E165FD5D7F", + "l": 1024, + "algorithmId": "23F7402E2ECD83F04DC45A2F99B2007B" + }, + "fixedInfoPartyU": { + "partyId": "B49DB475F3429142D1AF6B6F80182B8E", + "ephemeralData": "3CA2DDE10D91CA5C7FBFF37141B0DE7A07462806CDB665AC712A833F" + }, + "fixedInfoPartyV": { + "partyId": "4369B261C5E19888AD4769A19B8598AE" + }, + "dkm": "0879B7A6E8127D85EA11A90A6FE1608F7219FEB35E466AFD7F44D8CC6A18EFBE13C954FF4AF90B0F938503992B61F69D45A3694DFBF2229A1D708A8DF3FC6996AB244A838AF7107022866A0FF362040ACB48C9B5CCD8D58DA512F4DB64DD90E76D3676AE99782810EB55AA8E01B017C0F0726720C658D7434A9EA91A89E48FA5" + }, + { + "tcId": 2530, + "kdfParameter": { + "kdfType": "oneStep", + "t": "166605C3DA2C55073B064B6C533204C9", + "z": "829C8D4C2EB8117483E4AB109F932AF33E60B5DE959D38D67AE5F6FC", + "l": 1024, + "algorithmId": "87ECA0B77AC98DFECAF2BBD7A4C95279" + }, + "fixedInfoPartyU": { + "partyId": "B6759D6791B071BBC17EB327F806178E", + "ephemeralData": "FB9EE4D2AB401767AFC6061A9B482EB73EEAA2E22117CA8CC1DD48C7" + }, + "fixedInfoPartyV": { + "partyId": "1044D7EF4C02C0BF458442019BD61C53", + "ephemeralData": "045ADC03AA743D4FCCC6CE1C2CA8EE3108B08307AF964CF568420382" + }, + "dkm": "53DFF0DF21431CE0638816DBDF5D42AEF785E2D09D9882BBDBB07B6CD73810D7432BF360DAD870C26617ABDE2BEA5021EE40EC63D31BB4F4D85505C1C9694D553F894C57AB1EDADC4B1A1F0F7868A754244408B5495CD9FDBEF0928BA930619B1A62EC9948CA91E7A8C8E43E7D84B239855FBBF4E744659A8EB4B4E9FFFB3912" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 103, + "testType": "VAL", + "tests": [ + { + "tcId": 2531, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A5B3EC8E3B970872014B39B0FA8B8F0", + "z": "B8F82EDFA1821A6BBE62358529105932BFB97DD8678156F5CFCC66F54A", + "l": 1024, + "algorithmId": "6E2EA6D0379DD670DD367168B500B536" + }, + "fixedInfoPartyU": { + "partyId": "36C3A72661FB9F613FDBEC327A311452" + }, + "fixedInfoPartyV": { + "partyId": "5EC6EF2BE4DADFACF80943BAA9165460", + "ephemeralData": "5B010C868127D0980EE2DA7F464C57C3970039E5C7D07E468C3F4BC315" + }, + "dkm": "C004AB251A52A8EB4F540D3340CC3D354D582C9A9A59046995DDC028D657727704A39D5256754049EF26EBDEDEF885E25CA44821A9DC7ABC28A674C445CE568DF785405072B3A7616D32A0A9069A6653E42B299672772F6FC4F0EE278057433829B2ECA649D85FA08447912E67A6B90DA3DF527FB9029CC15FAE4B0A669C3496" + }, + { + "tcId": 2532, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CFF4A5A0C4283FA09777CE3A7111AC52", + "z": "2BD5C6CDDFF7B3C22896C8A31106024D6DF78897F89A2867A4357CB020", + "l": 1024, + "algorithmId": "4C8DF7222690031ED0CC5414666457C5" + }, + "fixedInfoPartyU": { + "partyId": "46A2797784EAA8587B7106C00E792F07", + "ephemeralData": "12DDFAB88B9147ACE90F68F06E52A1D75585FD5EA75EDDFDB3223C522A" + }, + "fixedInfoPartyV": { + "partyId": "73A719B09B3254089874A260B11048B0", + "ephemeralData": "73359C66BA2C34F5D4ED15F64BFF02FA97AB0A7E96363A88083149D102" + }, + "dkm": "014A992A45205831A72CD7B1558DD96B554EBECFA553E715E9DCBA3F0C0FF0FE9E3222CA86B58B522D6F7E741A8C5F0AA5FD4C2AFE6EA72204927D63DA5932D53B0E481BAFF55005DBC61F0AF17DC55D80A9CEA9C6531BEF63C565D4963FA157B4AA3D7667072E881558CE78C4270ADED7F4E36BFE9F11B2D7437F5B44BB533B" + }, + { + "tcId": 2533, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32CA0C491BE6958FA2AF937AA4931E67", + "z": "386E3049C9388BE509AD626AD57CEE95B18D9426395C1084C5D9367569", + "l": 1024, + "algorithmId": "A30A92CE382DE877B4AB1F03C0EB78CB" + }, + "fixedInfoPartyU": { + "partyId": "FE536B360DE2DD315B59CFFA1E6B6B8F", + "ephemeralData": "A0808CA42195C5B66E29BBAA24A2537C10FEE983291CA9DE466AA6FAF1" + }, + "fixedInfoPartyV": { + "partyId": "6F4CD102C18C49CEC73657A739387AD3" + }, + "dkm": "0B7827E982040CB18F54DC6595C30F2B076C73CA70F93420B01CDCE3A3FE0448251D5AF2286094CFB755F4686AAA3868F70302BABD5E290B5455414BAAB64123F1A87BC843EA1BBEACB3BB733DDB3E4A8C0D44DC0284CE804D7FBC9EAE414D563D27796BCB5FAFBCD073CC12B34EE68751A4EB24C882836FFE94D6DAD435D2B6" + }, + { + "tcId": 2534, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E9D4D4BB4699CB867BCA2FD9511E038", + "z": "A9732AFFEB14A97413379E54F0A0BDB84B02355AD27BCEC9DFA7C27F2F", + "l": 1024, + "algorithmId": "8383B33287894AA088FE1210E267A7B6" + }, + "fixedInfoPartyU": { + "partyId": "6CA3C296126FA4DCF0B3581BAD523C49", + "ephemeralData": "252FB014B00A603054E31D89D25A9FDFBCAED5BB5B65AEF6C3C8DF001B" + }, + "fixedInfoPartyV": { + "partyId": "DD9CBF48A34585E0942AE331A706B27C", + "ephemeralData": "3FD703F2C674FB8B06CF09DE3F7F46AF18D5A0EB64888538C3B7CFC51F" + }, + "dkm": "00E701F2A0FDD3238A13D2F93A1BDA3EC66F99BEFD5C2CD91CB94084D72626CBC76326B8711418DCD947D972215E9C1C3A203B8723D9BFF925186AC215AA490AA3B2203A3A070B4EB48D289738F7633E2C9A3A791CA15958172AF0FD54144BFBF6C5EF0FC083E1E0532D2A35E066542FB125C7448685B4E986FDCF8BCEE7A2E0" + }, + { + "tcId": 2535, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0766147AC5F706A45A44AA9F2C63D9B", + "z": "289F70BF38B8068F5FB03A7B9320B91AA2B04CBF80592ED9A6405A2AC6", + "l": 1024, + "algorithmId": "765D3A8E05F8EA2476B7870FDB05DC02" + }, + "fixedInfoPartyU": { + "partyId": "FDE9726C0FC1D01DE0633E0874C32F0B", + "ephemeralData": "A178AA754056DB9A3C888F75318E69E608A1243791C526CC193FB650A3" + }, + "fixedInfoPartyV": { + "partyId": "3E0777AE9C62F2E9E8201C44BA1C1DF3" + }, + "dkm": "35515E4456E425C0C38C79B9C5257A6D07AA03515AF56FC8118FBA45A8D028E2999AA4606F7DB81E107747F378EAFEEE1558E20ED64EFB298A98566217EB8C8D7047967868B8A1DBA79C08CEE5AE46D05B6345505E7B4F9D7AD7E625E9AE749EC79E0C1D553DF3F33DB04304070A0BD8AF6C616D017BF01385FA932EF69532C8" + }, + { + "tcId": 2536, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A031B934E8436815D858EBA0ABF33985", + "z": "C286BAEA3D5AFFD2798A2A1FE6BA9A1541AF913715E08A09DEB0C394EF", + "l": 1024, + "algorithmId": "78A7F805E782FD2EF8A505EECFC29545" + }, + "fixedInfoPartyU": { + "partyId": "59689613AF7C9AF73470F7E1CB75C4BC" + }, + "fixedInfoPartyV": { + "partyId": "034FF47369941C27A78F140188CE0096" + }, + "dkm": "0101E635F7587695AFB2DDF390C5453FE30802F32DD4328B9CAA432E79CFF05663ECC68ECE58BBF8BACC8FFD58627CD5A4D4E0928C38A21D8D959A59693C8EDFB4CF4905E8CE950B7536A84FE3E8EC4B4F668E609F6D93A9625A0DDCC2D7E8C947CDA5E03C39D7FDDBED25A7B9D09EF7A19108C8FCE0EEF14F25672801A65DA3" + }, + { + "tcId": 2537, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BD90B1F9D22382F411BFEE24E21F66A", + "z": "E055B23E69716D088E7BB025B6587F4BC6DC0A7FD047E61C0E2B0CF637", + "l": 1024, + "algorithmId": "47AB532EADA32C70807A028EE1808570" + }, + "fixedInfoPartyU": { + "partyId": "F3627DDA104D398047377607526460DD", + "ephemeralData": "6B62EC361148D4BE89A51FF267916ACFC19A892F0D5E5AF9E6CAB8E47B" + }, + "fixedInfoPartyV": { + "partyId": "AE47FAF40A66F6169CCEC32A7D0B8AB4" + }, + "dkm": "D8F49247A98703D6BA58C91B5BB16A68BBF87EB2AB80464E33A5C6B99422EF76F38E0CDB11524DBA612DFA4D02057258E3AB561CAC8482CF996111041589755FD417D8F7F35AB5E2BF14481E4C3EF9F1FC8FF7D904B7A7E57941C1A4C5F79D363475CE3CB3337B50BE4A25DDCE74C9F79878D444624DB04EA01A137553C03E93" + }, + { + "tcId": 2538, + "kdfParameter": { + "kdfType": "oneStep", + "t": "841CFE4DA9D945C9A1C41AE83D5E53BE", + "z": "7AE8765E6E8DC12C28579B5CD5140153B7E0A0B203E980B5153648E9A7", + "l": 1024, + "algorithmId": "90532C2009DE43A8ACF5542E40FF33A8" + }, + "fixedInfoPartyU": { + "partyId": "7A353A74D3097B1DE337625926AA5E4B" + }, + "fixedInfoPartyV": { + "partyId": "973EB6C7BB277B5CC563F1D4C44475E9", + "ephemeralData": "2810E6FD60476C77B5A400748A138BF1B38391E1B730C9F15DB9F554B7" + }, + "dkm": "163EFE2BF8645ED89210C0CC7813B5B6A4EC173E6D4D21797E12E77AC1F1CD306F3DB12A013E0D7145A7FAA7E39251904FAD2041FF3618C0C06D0C422B964CAF3A47D11C4DA6BB0D89CDB9336E2F7B7E32B23E99A0C9985B53FEB6DD8446C5DA9C0DC88878D8EF6B2F7268439DE3D698A08B648D25509DC7A009A60538FE3A56" + }, + { + "tcId": 2539, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8036A1B25DE564AACF50ACDAF8F24830", + "z": "A15AABF1D804BF24BD4519F75B2A0A9391B26F461601AFA1AEE205881E", + "l": 1024, + "algorithmId": "0136690D980F90977D5306B229E972AC" + }, + "fixedInfoPartyU": { + "partyId": "0C53A67A5BE3F0669ACF928F5AF6CAF6", + "ephemeralData": "D416AA5A7911F37A74A9BC5B579DCEF5ADCEA0A49C05A7179BD18224C5" + }, + "fixedInfoPartyV": { + "partyId": "2FEEF2554EB35A4FCC5B55A0F44ABA69", + "ephemeralData": "5A090007D173A00DDA56EA3330906D405770304A0D63974B22BE15FAB8" + }, + "dkm": "A4C9B69F05B60AE5C54D385F4DC73486EE8B807EEFF8B1707996CF141568B43B9ABF35E69AA93892F5082646C226399118AFCC87E69D32B13B159D232026D8B25B56208540A3A5DB3AC72F445EBF67FD1986AA110A77AEE69B739E657E7C7ED6AB300F0F11D883267EEC1FEB27CDBFC7D705A2F08732C119616CD2ABC3E92473" + }, + { + "tcId": 2540, + "kdfParameter": { + "kdfType": "oneStep", + "t": "172075DBC159B9447F96D1495307ED24", + "z": "82A799475C1F15D67AC9163E765E30397DFBA30E3D6A03477AB4F92CC3", + "l": 1024, + "algorithmId": "8319B0827EBD8E93BF386736A1869B9F" + }, + "fixedInfoPartyU": { + "partyId": "0FB491BA11E0546CA9BABCA56E1DE477" + }, + "fixedInfoPartyV": { + "partyId": "5DE628A8386E234E42FADBC6167C95F4", + "ephemeralData": "704C98572B2208B0F701C713D1BEA40D0FCC9BAB8D9981F2E6F5A4B04A" + }, + "dkm": "8C7A8C0871F4B5FBD2A86A312151BD1AF7AFB71B6C8284C47014C653C5B31AEB5DDA0FFF15FE04900E16795154D9184B0FC19E121EEC95D28E60F6E124CC3BE46B4CAE86B59098CF79C717371F927570F825EE3FB32A4F2415F212DBEFFCED832437F047FD2FBA11DEB53A3F6E965DEF288CBE0A97D51D71384EEC1D9C4EB8CB" + }, + { + "tcId": 2541, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F71355EA702D07E1976DD56FEB5EF17", + "z": "389CC76E706A872C9988319FB7AACBDF40C16A114B9433B7BFEDC7A8D5", + "l": 1024, + "algorithmId": "F735DEBC486CA1582C833B6D4687E647" + }, + "fixedInfoPartyU": { + "partyId": "7244B220BB5F3847161372ED2F22CDDC", + "ephemeralData": "CDD2667093B86D539148446F5C96F0507D5D21A9E6E803BFEF57049FD8" + }, + "fixedInfoPartyV": { + "partyId": "F1C906461E0DECE0982896BAF8427978", + "ephemeralData": "2936827BFEC7BAC264DE2F6D1B31587FC44C3284232A0043C4256FE7C9" + }, + "dkm": "FD78E701A23483D427AB2BEED6A859179A870F54F30BC4797B251168B33791B204F2A896A4A7E1B5A843A26E328505D0DF94A46CE1D843018558C8734DD4AA426F6295978BBF60EE89B1835C6604CBB26851AE732148ADDB2A591519F58BC22DD2D924E4455229D88DD02B00B70A391927C6D0525FF8822F1F89C782246C7B0C" + }, + { + "tcId": 2542, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8F4AD8F185E083CF67B322A2824BD88", + "z": "A31329919563FA51A71B2E02ADC35BDACF2470DC53D45F497A0C730846", + "l": 1024, + "algorithmId": "D63358412B7B04BD8D7E011C66871096" + }, + "fixedInfoPartyU": { + "partyId": "C14ED5505E3E5B27E439E5D31010FD65" + }, + "fixedInfoPartyV": { + "partyId": "4B20E9770F0EF401D87E8D6B9AAD6227", + "ephemeralData": "D42AF0D1379270FA0866C76A3EA1AB7C57BDF0A785DF22F4FC145FDEED" + }, + "dkm": "9974D234469429FFB9B583770DFBC35C49A8331AE2DAF93A5E44E1464FAAA55365A12F312262A00EF342BE00BE06B8B0F8EE8894C421F286859BB502D501AA65F19A641A004D58BE96F70FF0F3B613879C4BF976B9B8DF0495884D3F4AE50003A705B81AD9E2E1A5C0EE1E5DAC94B3A9F7B0A2FF0772E950F04E973D4A9BA431" + }, + { + "tcId": 2543, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D91CF5B02513ECAA41537A100BC2B7DD", + "z": "78AF0B9AE025E9F236E0C4B7318FADB5F737F83642A89A74A0945EEA3E", + "l": 1024, + "algorithmId": "F9D70B5BF2217570F3D48C9BB5DC339F" + }, + "fixedInfoPartyU": { + "partyId": "82DAC91A1D685842AD71B447597B42AE" + }, + "fixedInfoPartyV": { + "partyId": "EB6906B438004BA33B31F8F3833FF54A", + "ephemeralData": "747069A31E4A49BBF56F1550C3A20E291BC35C5EEFE23C00B0DD7CF393" + }, + "dkm": "333DFB3982898FE061BCE5A1D2E6902A4C6A8B7097FC8C52A7EA2AF4D1C6D319D0B55903B95EFA6FB31F3790AB5027E82CADB099A173E941E43CBA26355729064AEA37325ABF246E41A06E808848CE25C89A0A388EB2BC363B3335BC7505770865504C50B25D262DEDFF848E25B2F713656FAA46B2DCFD13A1E042621106044F" + }, + { + "tcId": 2544, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4F2CFC7E20936B2310A6A227BB2B3D1", + "z": "67A1764F10A0C674D8FE69E1E5B19E9581249EA2525EB8054AC7EE01D7", + "l": 1024, + "algorithmId": "16B7A63AD71AD5B97FBD70D728811A0B" + }, + "fixedInfoPartyU": { + "partyId": "CB7F2953FACBCCF0B839FF55E3EAB8DA", + "ephemeralData": "049D15F5F865952B40B4EA77F6178EFAB64D3B62ECF366E5FD57971CB0" + }, + "fixedInfoPartyV": { + "partyId": "FD9C69F083D2DD0F0A599F2BD4474B84", + "ephemeralData": "30189AE60D355B8B78F31767EFC8D0075F318784A51794B15DE33CD13A" + }, + "dkm": "F3BD3665B4FE3557728FA4008EC8F4EB1CA303D36A431683206DDC48B7C91AF4352E5DE1593AFAA8E184F228E5E3D3E6A6800F68E661EFCFCB52921E458C5DE2B4D46DEDFEB5DAD4B998D3FA8F0F6FB749F6E9B0C83B11BD884ADDC0B6E3C18C771103D1549E44205711AE03F8118052C12EBA377BBF165133C3A0C5BEA77852" + }, + { + "tcId": 2545, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A1643892A02F606F5887555FC4B2D36E", + "z": "0D783930645F16C8CB08E72B6E31972D4D89C1A240829567A1EF329D6B", + "l": 1024, + "algorithmId": "64BD3562ADE6D11CAC623CD9A988EBB5" + }, + "fixedInfoPartyU": { + "partyId": "94BD832F3D06C2CE03C441456DE319C2" + }, + "fixedInfoPartyV": { + "partyId": "1C2E718BD286A3D65B516731FEC9420B", + "ephemeralData": "313D9E6E1192B2900EAFF62465CA59449BCAE068A02DD2EC081BDD887E" + }, + "dkm": "BE0F75D0D5F5CD6709396CDAB47E7E9E317B3CF01A46609CFDA59DB21C171E88B839DB6F4F929F0DFAF63FD9F4A88F18BDAA08E9C3175A59625C5A0C626971A6EEE77C6279E22AF3E03A6E69B1AE04B666CE2188B66500D534F9D9A6B69D75892C00D17C34328762A25E2F8069A4584AD6625036C137DB484EB1F191F6CBCB9F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 104, + "testType": "VAL", + "tests": [ + { + "tcId": 2546, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E7C1A2E3BB2CC9B0797B9FC3AFAA814", + "z": "BBF2EE4728C01C37100B9663555153B57FB809C2F4C35B97819E8A8316AD00", + "l": 1024, + "algorithmId": "6094D5061049E1FDE92EA013C3C8B4F1" + }, + "fixedInfoPartyU": { + "partyId": "FDD5C539DF622675D610BE580FCB65E2" + }, + "fixedInfoPartyV": { + "partyId": "68A93A76CA67DF9CF5E719C5DCE8FC4C", + "ephemeralData": "EBFF0CA9DFBC1AE34B1DDE0AF1FA45C24672D72C343DDF7B42F726A83E5D11" + }, + "dkm": "1406A1214F8BD824AEF7690D189E999356B35A6793A4D042795D4A9E8B001B435F7A32AD6338B79128F5E6D480E5BC21BFB6DED1DAC213DFBAC26B7C6F5980190CE728D91C7FAFA253EAE62E15C6206CCE9BE8DFA8399D8D1C51AF8D837ABF7803B79BE7A99BE244260C274BD2965D41B74BB4D921E0F31738452DD628FFD608" + }, + { + "tcId": 2547, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11C974A26A5EA9A11B86F287908EC5DD", + "z": "C9174BE2253619A87C10B759DB0C30A0546451A9B36FCDDD6001BB8CA7A827", + "l": 1024, + "algorithmId": "90C2D67D5D0F11526B82AA8CC651A09A" + }, + "fixedInfoPartyU": { + "partyId": "CADC3F18C2B064DBD4362ED536FD47DD" + }, + "fixedInfoPartyV": { + "partyId": "B6927EDB8572FF2B165A7099953ABD55" + }, + "dkm": "B5965969A295D4225B08132FA5076EF4CC12492B5EF53C7754DBB5DC1B185771699364314BDB7E316BFC5BBDACDD401594FA6242B0F7DC4BD4EB02F82B30681BA7A72A5506FD4D1D50BB7C55326ECDA639BF116A0B8935DF95E49E46AFA6D6867E743598A266513148640C9C16AD83959869CF4F15FC16CDAE2553BB63B4640D" + }, + { + "tcId": 2548, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A98ADC2BC2F0ECB1230716CBB3E193A4", + "z": "DB86E72BE067C8A5D8C73502D8D45F063CC568289B170E187144781EA5E390", + "l": 1024, + "algorithmId": "8989F46911D82BD80648D818928ACFBB" + }, + "fixedInfoPartyU": { + "partyId": "BADE7BB3A5C8215F116A4E85812FA1FB" + }, + "fixedInfoPartyV": { + "partyId": "883046641056000AC87388045662E9B0" + }, + "dkm": "F8C20367BC775354707F96B971B9D56AB85C8FE34BBED0A3C473D292BEB7F74A1EA4C396FC775F26CFBE73147322E69C356880FB69AACF9430E0F622C775C7ACD3859D773A61DCEFD81BD205A753883A4D08EB4F814980666599038FE93F2960A59CC52AC0ECCB26A16EE96E22A6FB438547349F77A0C0D586F518D4CA424BFC" + }, + { + "tcId": 2549, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BEAA10EBB1E5AF26B75FBEB908C1E052", + "z": "5A7BF82B31D5B8D0FEE3827A235CF992E507FAF9C4228F2378E38338C08E49", + "l": 1024, + "algorithmId": "180E856ED5B362E5452DDEDA588D188E" + }, + "fixedInfoPartyU": { + "partyId": "BD66FA97789D686F94D6C4DF8CF4B7D5", + "ephemeralData": "D6666BE412B3C722CD057B0541EEC7142B4DB1AD80F090653C2FED8EB853C9" + }, + "fixedInfoPartyV": { + "partyId": "BEE755D44F26B887E7CBC3A461121851" + }, + "dkm": "EA66E23CFDE2C7F0D29A23F080D2264CDC59E9322C2FAEC6D7E425E1D104319D8B2D45F0E99B00FB8AF1D72B133AA1A63E15D84798C61A92B7F53013858AD9FFF8D8248FA55331E52127F48B09B4DB89AF7F90B1B93C6DCEE35A93AC5E4E1820A233A0DA449BA84FF6CD6CA234409F7192C23D7B528C041A32EE2F1E880C7851" + }, + { + "tcId": 2550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF7808BD0C4B6554EBC63AC99905C6F2", + "z": "F115F3A53BD186CC2DD3E0220ECD823C7DB7BF24A15769D5EBCC3F7B0B9F59", + "l": 1024, + "algorithmId": "D3C9518BE24D27BAAF223F0A90BC4C07" + }, + "fixedInfoPartyU": { + "partyId": "2CA199722F30DA26934E46EC888EAFB2", + "ephemeralData": "32BBA3B047E83934F5912F3074EF6554E146906EF53E7286DE55F9F0890EE7" + }, + "fixedInfoPartyV": { + "partyId": "952459077902B059B8018BE4BE9DA5E4" + }, + "dkm": "763C3C570F699783DE7CCD2762C13B9EACB6F902345AA2F09537D483C7887329320D512DD6BD31D9242996E5E8122DBDB0FB59426EB10BD885E8D621B68FD0662F247372A2D2BAE7E5F25F545F9525EFB21A54948974E963E985AF0A2C65CB61D7EF99D9ACFA9F5EA498AA83D580CF355CA06D17B01A8A10EF64D0559FCCDEF4" + }, + { + "tcId": 2551, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BDAEB8B8FAA38FEB8746C5C7B0446F4", + "z": "0B64CF40D5FFA6848A12FF9C0278482613764EBF9E918E58BE72A4C4DC37DA", + "l": 1024, + "algorithmId": "E42CA1C489E3553496F47978D3B71AF1" + }, + "fixedInfoPartyU": { + "partyId": "6AB5CECBEDAB87813F68C58CAE477B48", + "ephemeralData": "B6BF2553158138E06186C70744558529897E9DA51E57ADC79C3DE913478325" + }, + "fixedInfoPartyV": { + "partyId": "E3994A6DDFE7AA3D5FF81C4C1B4D94F1" + }, + "dkm": "5E946C062AEA59780F175F58A79C4BE4AB66BFC99DDF3BF005DE4A514634F7B5358B9FC751A83C9C23941557E03A3ADB6249BEE940D40A04AD47D0B439D9785CA7EE95C6BE7DFA7B7BE32653BE3DA3953FF788B357B361B0EBBF42F6A09B45BA795C0A3FF684B5C7692AE57815EB37E7E651831CE2586EE5F98D27F5525E948F" + }, + { + "tcId": 2552, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F32CC52389E4D1AAEAE6AAFCC255AEE7", + "z": "6FC2BCB3A843EBC53D0501CD54DE1F628B102DA42D3F4C92224E33F50F4AF5", + "l": 1024, + "algorithmId": "FC1AA8BE0101F970934BA084522DD26F" + }, + "fixedInfoPartyU": { + "partyId": "BC427CBD76C28B98C92599740C0DCDAB", + "ephemeralData": "48808F3E41BB15F9C916031FD682CF8AD66FA6EF09490CEFF25E7144698145" + }, + "fixedInfoPartyV": { + "partyId": "F1D91B4F681D1B6E392A583A6D0E87A9" + }, + "dkm": "0CB2F9B095AE34803FABC6D2E2A627555495533EF3CECE4FC12BC59AD2B7E27B3A368BF16BDEDB528CE8231D4A1C66E1DDB95E975C6C9FB89DEE9061AB82063B1B5A0A80993E0AC758C1B2F05E44A5151E8DCBE2D8D7688CA3A0DFF03578CC7599B2607520B59E2EFB8264E3555705003C1BF303734D7669C6AE9E41AA2BADE5" + }, + { + "tcId": 2553, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E1BB50ED9E153A183DD384D77BDFF6B", + "z": "5C0FE7F1EC72385AF73B8C5F63648CAD7614C54712FED00461E46F12E8B882", + "l": 1024, + "algorithmId": "07429B78851F3147DCCEB9474688B4F6" + }, + "fixedInfoPartyU": { + "partyId": "CB9B5C331DB427FC66CBEF1C8ED11692" + }, + "fixedInfoPartyV": { + "partyId": "6531E3C99CA0EE6AA7D75C80DD86E19D", + "ephemeralData": "4432C92A01B1E7FAB911F06DF6576A383B61BD31C29739CA871199D8E62B4A" + }, + "dkm": "F184D7A5AAB10B32E60E913DCB6B26B2F6A52A4C94786AABA1DD79D3A87149BE3BE888BAD9288E5714D811CB226DC73C964765FEFCC174B1647FF173BA8153902B8DAA629EBEFAFFD7ED59CA62F3CF78109E57CC73AD30D404FA1C96A957B31A9B5E8E3854FAA075545585B2741192E196BC8921CC9BEDF6AF082659111DB33F" + }, + { + "tcId": 2554, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5169536A1F686F4B191FED2597A25AF", + "z": "7C8E1790029DA1ED5B0C0706D7EAC87693401A25BEA951DBB920222DE1648A", + "l": 1024, + "algorithmId": "61C604625AFF11A551B230F23D4603AA" + }, + "fixedInfoPartyU": { + "partyId": "5C5C8E4C56657617BB547101AC19FA0F" + }, + "fixedInfoPartyV": { + "partyId": "F1DB434F1000E6C5F5E05D519D7B6B30", + "ephemeralData": "33C8AA548A3CB6389DBE7D96CE3B4838151E4E61A0422CDED11954473B3A60" + }, + "dkm": "71AB1A770DB31349A895FEB48B1CC3F972FBF67547C38FCCCF88DBCED02D03F28BCABC3E30FCA3CD311C711186AC83B13F0C29E82D138A98601C1CFF5472AC27CBAA629A541DCB114BA72DF745A28C562CE03CC21F8A602B9887B1ACD42CC5AA15C90C44ADD4D5EBF4DF43BC0AC2E05E122E783CFF5127A6E9AB57AF0643B686" + }, + { + "tcId": 2555, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F9895E68BDB7759B70E374681EABF06", + "z": "0F89501E42DE80A7DE4D94FF4BB9DDC7DB68C3D29613F08B35872766CFA67D", + "l": 1024, + "algorithmId": "F15B01BCC7A02F3BF6152C969B958FDF" + }, + "fixedInfoPartyU": { + "partyId": "F33CA133905F897EC9F53115493196A6" + }, + "fixedInfoPartyV": { + "partyId": "663A174549E528C730DB99492DAE149C", + "ephemeralData": "7239800F094E1956FD5CE2DB3C8252EA4405ABBC3575CCF0E895C51E923BEF" + }, + "dkm": "0F10402B699381DC13BD82B60E08AFDC8BBC14C6F467C5357C0AC101E4F59E23268706CE36C847B3D30F3DC1B2AD3600447DD0C496A3D1787C293CCDEC95418AEE08360EE762C33C80557C1D7569DC7177672A5804C0BDE5CD3A771E958AD0E97A3ED78B1C2A2B74E5B0926314396C5D858CDA245EF1FFB8A9FC81A03A245830" + }, + { + "tcId": 2556, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA96C5AEAE137837700E36B28344911A", + "z": "B0C4BC09234D2A77005CA6CB30230E16DF4690B8EFB2F952026151F0D0E33A", + "l": 1024, + "algorithmId": "5C23FDF8FF4E9E2F5E72CF815BBE39AE" + }, + "fixedInfoPartyU": { + "partyId": "E05647FF89F28EB80B322C14C4540869", + "ephemeralData": "3000D3B43D7817DCE9CB813CAF85023595F93E04C559E3DE54CA958B9FFD98" + }, + "fixedInfoPartyV": { + "partyId": "7A076CD330E6003ED42425BE70326CD4" + }, + "dkm": "0658080C8A3D756A50FFD882F5EBB2D242AE93EFA708F9290B75AB56D519D27B298E7DC8FEB1787CDDC7D4CA6819A511CD8D87DFD1D8311EF0EB3F396DDBF910F0743CE407ABC3D4374473BDF7AB938DB4110ADF1416004A89A5A0A55439CE6EF2196EF026FE821748B8D0456DFD88F6DC9EA6D4F2016A713C49682157FFF1C1" + }, + { + "tcId": 2557, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE6107941DE80D92CD022AFA79D355B7", + "z": "71876BCAEC09977E9C410F1581F88720A86ADF0976013F3DD8AA3A6609AD06", + "l": 1024, + "algorithmId": "C1A7F218F494E1D605A553D87FD79AA9" + }, + "fixedInfoPartyU": { + "partyId": "EEF9B3F839957C0C8741E96BEEC680CE", + "ephemeralData": "CBA3087998747045363D7C1889A88FB8D20DBE30CF8A10C4BE4C869C96C764" + }, + "fixedInfoPartyV": { + "partyId": "4E56725F5A29083447D5F1A366C51B9D", + "ephemeralData": "D3D7E252105560BAC62EA7F81531BF6CBB44B3122B509027ABD5700B6981C3" + }, + "dkm": "90121BAD61D3B165C9FA661A932897A85D2409F8CFD5600B767AB8633EB89187ECC7983706BCABC8AA336C15371935A3996AD01F501BA25ADE24F00B2691743CA6B5C13F795C0A52C63461D91A3527E6FA41C6F4AF85B6333B03971C2C4CBE4F7F96829A47550B786D91BF82BCA35BFD5994220969D941903C4ACE9975DC7396" + }, + { + "tcId": 2558, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6724D91DB722DE4D6A6E3BC282D59EC", + "z": "E956B9F5C0B207A140315C29B7555CC8AD139856E0B6E762EA956E1A0826E8", + "l": 1024, + "algorithmId": "0F64F546C232F93F7A312B23A488AD85" + }, + "fixedInfoPartyU": { + "partyId": "3D50020540CB6F56A149EC1FDA5C86F1" + }, + "fixedInfoPartyV": { + "partyId": "91A9F5D5BB1366E6B77A48963B7FA97F", + "ephemeralData": "7A81E535853823E13D5BADD70F75EF74B79F3AF091BA60B312DB8E393CD0EE" + }, + "dkm": "31D1C5767F47F0BDBE15ED72657D00CD0407C1E652669687E5C306622A2F456F535EC8B1C75FFEAC4578CBD87E9A1B0B093057521E490ED07B00E6F81693291BE70A35D1B7BE62D0984205A388EE95765C87D20922C16FE0995187E2952F59B97F2BBD53845E8F79B40A2B7F1A2C6F4B554DCED56B676FADD18E5F4B131CD386" + }, + { + "tcId": 2559, + "kdfParameter": { + "kdfType": "oneStep", + "t": "653F92F891F5618CBDEB8E9A3B44F8B3", + "z": "2E65C01B2BED8437E0A8A5F9B6697CB7E209F6D416A0B53A239995D3567CCC", + "l": 1024, + "algorithmId": "4CDD35BCB08414C626F6B57DB8AB6FC6" + }, + "fixedInfoPartyU": { + "partyId": "C71677F9860AD519B609DF40E31ED533", + "ephemeralData": "BFE6229B249CB373D8A225D7FFE372507A086EA84F1E9C24BF45DC8E143D7E" + }, + "fixedInfoPartyV": { + "partyId": "AB0EB9C1A4BF5E8F57A050829CA8266D" + }, + "dkm": "B18DCB9EEE283CCFAED3411A82D4C9B7A5E57FCC74AD011BD78FC9F81487DA9233DC86E000F2F257ACE36C55CC57E2CEF18C7EE02FA0D79928F2F2964180290F307F9B25CA7E4DEE1DAEF462A98C40B66A358A52F0233AA71733FA233322E9CA23A95EB20127D9F130EA08FCD11FB1B71B7CC13C24430980755230E41D7F22B6" + }, + { + "tcId": 2560, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADCE03A2D220BC909D1F972E3858A6C1", + "z": "FFB07A520B5C96B07D214D55C5C398FCA28A2BBEA55982C8A541E23CBD92B0", + "l": 1024, + "algorithmId": "0C2FE0F490AF5FCDA2829B0F9CF9B648" + }, + "fixedInfoPartyU": { + "partyId": "7161F2D4B58F017F2AF22362DF0191CA" + }, + "fixedInfoPartyV": { + "partyId": "D14D523686A60C148F5F783EDE39241A" + }, + "dkm": "DCECA260AC298E2E2FEF93E87CF30CD00B60120BF87058006E4AD7E201E06AB91581717EE23646E52F71AD3E7530218001C78257671FDEB119CE485F136A970A014191259D6D81C5428FFF0E1B6462CEA2D06E09F7E22F4C72A50503B320C24EA347AE42C29F01E7E8C19A2BABED9D3FFEC336F5F0BB92D855F0AE15F75219FF" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 105, + "testType": "VAL", + "tests": [ + { + "tcId": 2561, + "kdfParameter": { + "kdfType": "oneStep", + "t": "226333012266114A07BBF1BF5A700E6C", + "z": "E9642752B405914A30214F4582BD0483727F0B81D70C66AFC2D1E0846BA5C9BA2B634A8A", + "l": 1024, + "algorithmId": "F342D533EF4AB6E806B3B0426C570174" + }, + "fixedInfoPartyU": { + "partyId": "F5A18F05E357F91FDED60468A3381671" + }, + "fixedInfoPartyV": { + "partyId": "01886F1DDBF32174A86BE6E08C869FF1", + "ephemeralData": "3729E1E2CE8A0202E3E3F3FBCD30915CDE8761000FEFBB2B3DF84B63DF2D7E0ADCD36A65" + }, + "dkm": "9039310B75E84D1060EDEF096F201DEB2F58D963B5BE190109FFF30B914715542F9DE14B6D1BD9B105AAF6009935E687B82E29C2033CCFB9389C9DA7C0E9B3479CE747A1B7F537A39B281B84E019C1EEE5191080706FC1539C51BBBB6E241F244C4E64FF698BD705AB70BFDB5D2D0EEF783E85777542330F65FF4821ABB4B5FE" + }, + { + "tcId": 2562, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5F560EAA6331AD77C1FE37567C235C3", + "z": "4BB7DD713699CB23C64107A9943172B8AE0907A9F26939C28A27F85AC3B20901B21459D4", + "l": 1024, + "algorithmId": "B795A6A58CA36697847256E01884C978" + }, + "fixedInfoPartyU": { + "partyId": "E3FD41B09EB995BB7D0DFE83BAB5E391" + }, + "fixedInfoPartyV": { + "partyId": "81E519F05E8EA0EBC7FA087F28620D46", + "ephemeralData": "37E0921CD47BCB1E7E5E97F2BADA122255D02AE0B6CEE216A34D14D8B365BA2B4F52C560" + }, + "dkm": "08B6014C11F2FB7DA6D94202F8767146FBB988969D591E4CE875C40C7DCCFC3BC32520CD257A889C5582A2305EDCE34567704897B5025036E2A8006C2056CE38D3D8CB08FCDA07EAF454FC97E3063E5F7A8E667356758867490959868307A8B7769505FDCA323AECC84438AC7BEFD6BD90FC3C867FE392B65BFB7334A560FF5F" + }, + { + "tcId": 2563, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4FA212C4C2FD813126BD5A6BB7AF91D5", + "z": "F877211894F23686B028F9579936565DA5CE4BF3994FC2FA801938CAEF5DBF3C0490ACA6", + "l": 1024, + "algorithmId": "CED9A6740AB26B1C80B7DE3C706BE9E8" + }, + "fixedInfoPartyU": { + "partyId": "22A41EBFBE2BF3C39AB9FBE7F6107237" + }, + "fixedInfoPartyV": { + "partyId": "A697008C1409D2EE9F773BE1C626947D" + }, + "dkm": "8161EA709305551E2A313A3AA9A1652E523764CC13512F40CDC6FA1FEBE426F10A1212DC86B9C4764851AC6ECCE8375409D56F22E21007008D14EB4574439213DAD360D718A1B6608E411B8AD26853C04102861FAD21D886DA7E39D7FA70F296F3F0649494F4D4165EB32870E1494B2612BA39F105E6BC8D5FC7FF4369789053" + }, + { + "tcId": 2564, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5CD86E5FA70083CF65CB56F0EE7F43B", + "z": "143A83CC87755B215B74FF779BC4E040F198DC49DD54607C15EC3C97C956AF12BA48A82F", + "l": 1024, + "algorithmId": "29FD7ABD6949990E5B559264B0F5D350" + }, + "fixedInfoPartyU": { + "partyId": "08B193B4DC7A47C933771D9D8B164232", + "ephemeralData": "FEF09A6DA98EA797852FD2916923530CC506AB3F26F84964C63CA8FA3B1343ACE34F84DB" + }, + "fixedInfoPartyV": { + "partyId": "E875B681FE656D3A75A35003FF8530EA", + "ephemeralData": "BA2AFEA532E003316C242EADB0BCC206250E3BFA58C958921953A38E13DA52E56188E042" + }, + "dkm": "6389A08A4FC31C3A3A3FF82A6648128C0567F526007F0F9C8EE0F61F02DF3123A95F3BFFB46148398D58408DA181F688474219D7CF90C5E3A148FC05A39410D079DC389E5146714A92DE474383D1ACD8D810CF0B1F0FEB17C63C231CD3A88517BF7FF5475DB0E58684A25BABB7D6AB2B0C95270B122AD000AF6392D14ADFF51C" + }, + { + "tcId": 2565, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0746B8E854C3003B5DFCC04717866B54", + "z": "9ED32C787E72F652C2C6A929FF2BE3DED7B7BA832728E282579305913D11C5B26C688FB6", + "l": 1024, + "algorithmId": "47F8B12E8933BE375B4B15C2010625C0" + }, + "fixedInfoPartyU": { + "partyId": "2ED19CD858DAA52D4286495A8E958C48", + "ephemeralData": "03097D4324B6EA6ECE83D2E85C957D2825F6DE890F56DE14929AEB4FFF09426864D2286F" + }, + "fixedInfoPartyV": { + "partyId": "BD4E4984C619AFEB5E0A8E8C49DF3901", + "ephemeralData": "A33A49F89C2549BCB8397136729999ACFE4F0D52D5974E763564913ABF967B7593F1D909" + }, + "dkm": "08B2DF6766AB1135F901314B8D9487CBEC93D09328758E0400D9F9B7EA485ED0AEBDD2AB02DAA24CB4A3832D9281347EA4C2C92BB37F201EF902EB9195E0C8E2296DB5032C1B8917B88BFD299992B43FC81921E38F86CDFE1AF13FE96E4718074258436D3C498EF0F6A9BC473C68F0D42CD48130647C009AA3AEA870F47A1050" + }, + { + "tcId": 2566, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CEB14A02C54CABEEAEAD1ACF7ADCB72", + "z": "323E079C1A1E7B7F06CCDF13EA14EF5F130E85937475F18BB06C77F6C557CDF431AE1F5E", + "l": 1024, + "algorithmId": "B9B0DB529D93882FBEA7D3D08AC9FDBC" + }, + "fixedInfoPartyU": { + "partyId": "1B98DF55CD5E39653500E773A5C57E2C" + }, + "fixedInfoPartyV": { + "partyId": "B2841351587B465100141DC40A6E2CD8" + }, + "dkm": "7718D1CDCE5463AD09521747868D24E33BACDD2B18FAF133629471B8D8D46E282222AB84ED98DC79C275ECB2C735BFA5DEEDC1133AF6756A3A5CA282BD3690A276CE6A0EE29BD115EAB7930696EF88817B50C538E5C4FEDF6A54558244066B880FFFB44F69CA05EDD7CE1A9BACBE24E2E6956480D21AC8BD7266958431E9DD69" + }, + { + "tcId": 2567, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A0231DE6434E3A06DB36C8CE7DA93988", + "z": "A8D85DF8CFEC767E7D37BDB98120FD7BCD27FF5975522C17784853D5E0CEC9E98188E196", + "l": 1024, + "algorithmId": "FA9C788A6EFD1CEDD3B9CCB73D99EF49" + }, + "fixedInfoPartyU": { + "partyId": "E7E9D8E8D9C3BE7F7BA8C86ABE101AF0" + }, + "fixedInfoPartyV": { + "partyId": "54BA7F78665E6251922BC806C1992455", + "ephemeralData": "AA533E85093E07144965192CE552E9E63F39A2D9058DA5945DFAFB01A454B36269EE3E85" + }, + "dkm": "DFE9B40314DC483D6B277F3B37D191A1E532056B1244459F32CC6D4E34B8C55EDCAF6B937CC24BA665263E22F7DC7B84ABBB91DF4B28F52307BF0A33DBB2556DD186EAD17418494E4C5EDA041B0FE951B9EB965B24DD871A745FA888BA126363B4B6FFBCD52ED72E3468EDA82534D9D0AA0EC0E44D6B7294945E88AB851E12C1" + }, + { + "tcId": 2568, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E4D915768AD86055C3C9094E8F7E9BA", + "z": "7AC675312EC500F7476D0CFC2CF69AE52E511F8C4A46240719A55AC2346F582A7C32F574", + "l": 1024, + "algorithmId": "84E70B703BC37FC01C69A4CD726938BD" + }, + "fixedInfoPartyU": { + "partyId": "37DC623FE05422EA3925C37A62596BD9" + }, + "fixedInfoPartyV": { + "partyId": "5D92E87695C23C27EB1E7F05FFD9681F", + "ephemeralData": "BAF27482C23A74A3638652763BEBD47BED0D12EE8D2495078DB7D942BD7422B3EEC52170" + }, + "dkm": "4EFE20D2280D570C9C3ECAB1DAEA5978D5962F1D4584662B21B2AD1BEFDDE695CC942DB3D4C99A9C5D02431FC74FE557E2FFC02B089E55498FCFB4A9B3D30D2C278E9908A47D698B8948A1E8961E63C386DA08D6367F78E624A364CD3901242F4D642DFD5FDC3FFEBD5EE878300FEC2A39990D63243353371ECA31A693EF7CD0" + }, + { + "tcId": 2569, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD2516D1D7F0BA2C2A561C9926DDA2ED", + "z": "9C048EEE4917C53AF7CA8EA629489EA4112DBE8283F1B9972F41625BF61805FB00C56BE8", + "l": 1024, + "algorithmId": "D0A3F908EC5B1460E99C2BB2F7B9FC46" + }, + "fixedInfoPartyU": { + "partyId": "13546DC9729326DB36CAE68AE7D5A333", + "ephemeralData": "66DA600370CD2E57FA7F4E11D3BD8746E9DE4F54B50841F84B96BB203A6D599C23492814" + }, + "fixedInfoPartyV": { + "partyId": "1D74BD8BE5E2EB342B6AAC67499679BB", + "ephemeralData": "BDD9FAAFBA996F996B269E921D998195B8DAFAA266984725EEF1E372DA4D11756B8CA22A" + }, + "dkm": "E402464DDB8F4126AEF88827747EF033588ACBB362B61541EB277804C69E4FBC71A281B1CA5A85F1D2D71C42A0C105B2877BC03570FBE85DE1F35F6CFB79EFCF8827FAAB5BA46D149F87F7DC28C8CB007C8906076D92257806643EEB817174223AAB796870BBC6495902E3B01576202354A2B0996F64A46A22B86CFF619618FB" + }, + { + "tcId": 2570, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB1F955F73E0D228161A76D36643C71B", + "z": "DF04EEB34DF7C7074C7E6BE043B72159D914D2F6FD1701C7E3346CE00588CF16A331A3AA", + "l": 1024, + "algorithmId": "65CED60FC0062E89106B322DAAA37FF8" + }, + "fixedInfoPartyU": { + "partyId": "011EC430AD9A23E872CD7E0C57062132" + }, + "fixedInfoPartyV": { + "partyId": "CF71E99AB0A1715E41D147220FAE9022", + "ephemeralData": "EADBDDDD293A4DC12C0CAD1535D90F3EFC7AEB83AFD98E2AD4F1419A4098ECF1CD5633E9" + }, + "dkm": "306F744225262C3EE0323F28A3271D599CCB1A6E23725FCAE1D765B6D3DDA29FEA1CFBCDA356B49DB13F12D0076BB778CF5257D293F40E764A928B14D50D98CC813C39A9A14F4E7F4A33BF1FB60DEAC9A0465DB9877A8C6F7AA61FB487E21B529F48965C3BBE41EFE8DE3FA9DC44F568497A59EEC5AF9AF4F36F0929D50474A5" + }, + { + "tcId": 2571, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A9FD1DB392334D7ADFE5D2CFCDD92612", + "z": "FA145DEBA9CF1BAE9048105D0386AB139500335B5B37030698A5AEDF1CABFFCF043032CC", + "l": 1024, + "algorithmId": "EC4FE62CE007E8C783ADE1DEC3EF43D6" + }, + "fixedInfoPartyU": { + "partyId": "8037D71676D84C2D20EDBC7A121C4BB5", + "ephemeralData": "C7848C4EE4D67AD13710D565BD561BEE1610A53DEFA8ACFBDFC46E1AB7BFA62DAB219667" + }, + "fixedInfoPartyV": { + "partyId": "32D8862F9F3241294E5F5A5DA4884EF2", + "ephemeralData": "5DE4BDA3A14A0871A3249408BB93B86B1CEEFDE1286E90E097A0E68795574563404C2F6A" + }, + "dkm": "1E983B79777D16EFFB25AED3EC05255C7130172B1B6793447D8958703DDB27FFBE07B8B97DF776FD577CE21671B55353710A0D1E88559D5BBA08FF320D726F80143446C7E77BFE9B793A4314E3AE14B2F99250DA1B610A454914FA24E566B772172251101D725869951B3AEFF65B9DD26B0F1E027021C1CD0B36A75499F506C6" + }, + { + "tcId": 2572, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5E0FE58BDEB792C3E378B91A56413D0", + "z": "BCF5AE94B4C9BAB658C8246E8D8844CBBFAD270596F7808E937904990840EB5DFDDEB3C7", + "l": 1024, + "algorithmId": "66D63770BC9374B22277A2D2F463A618" + }, + "fixedInfoPartyU": { + "partyId": "31B75582ACAFA3118C0C5BD2E509D859" + }, + "fixedInfoPartyV": { + "partyId": "8BE0FFC43BDF51E723388F512B831921", + "ephemeralData": "8B174620CFA44C512C09EAC1D049079172947363970261D61B74CA7BFB386FEDC71E2C3D" + }, + "dkm": "06287987038C8C540BF1C3FD7A58FB040CB6F96727591B89334BE3E0873648F4FD5D5B15EDD43A11B8E6C402C6B39F5787FE168C6161386441C9934F835149BFB873506FF49969E19D2E8AEDDD5510A7BE26B5830A214775C8FBD6CCDFFE7D6DB81BBBAE2D60B98990815E7085389F1E38F25E6FDBA461B1171889FDE7B0C28B" + }, + { + "tcId": 2573, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A2959A9C9C99DE13EFE6660F6DD47AA", + "z": "7FE9E6EADACE49CA9D42DB30CBF55F038AEE23814D6E4A000AB358A32C478A87F49693FF", + "l": 1024, + "algorithmId": "AC16F212E95113337713933A24192E31" + }, + "fixedInfoPartyU": { + "partyId": "85477B2E963DF3B30853B1002025215C", + "ephemeralData": "7F4B6F49024E6EAB9E3C17ED0B528ACDFE5FF1EF601A20D88A5961A947ABC4CB9EA0679F" + }, + "fixedInfoPartyV": { + "partyId": "8A3F3523D3DA7DFA4F56D97A5D90E049", + "ephemeralData": "D1C11AC32F767B683D6F110333F48302600E179AD4694056133A9B0C87B4B09414149E87" + }, + "dkm": "081683C593CB7E9EE922611E3B32849E36B3FFDED7CF765186989235113FAD6073566D7251C59BB35D5BAD74461C08A531BD0DAEB5525D9EC2677F37811D90DAA77931639C6964C6AC470AD8E84342055584A7062658D707D02EA30AF2DED2BA15C8B76CE721EF6C6C2A8BD5DAE65BF15364786A58DF28FB44B5E11D44717A1C" + }, + { + "tcId": 2574, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A6D6DFA86B04E72F3A7505DA80FE7E5", + "z": "9BD084E3291FDDFA1EAEA7B54EB6991434302032520B1D5608B971A54AF647030F10B22E", + "l": 1024, + "algorithmId": "5623664EFEBE50961A63AA6D219A5D9E" + }, + "fixedInfoPartyU": { + "partyId": "D9535D43559D9E96EC03C5F09D521455", + "ephemeralData": "5DA9EC45899CDB580917B8C9964E4392CE1EFC6F4DD1259051C850D7985C59C2FC942639" + }, + "fixedInfoPartyV": { + "partyId": "60D308CB79059B3A751805F6BA929F3B", + "ephemeralData": "403A543B08503E9DB22E5BD92A8CD7636AD012747BA40B3EB3FB3F52420A32FED7F5AB0B" + }, + "dkm": "5178465EDE6920305B1137FB0656B1344312A2154AC1CF0E91EEEF4972A82CB6E13AD4B4BAAAADBCC1E70514BA53A5A879A7EE9453FF6102CE528067C8A5EF27855E05F22FD25CA74A1EE5C761E3BED46348B112F558C1B531A568B62B71F218DBF8C499F5D879D73310A471CF17492CAEF4446D0BB5B2EE71C9129F3710C3FD" + }, + { + "tcId": 2575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "116C4F0FEB291467A6EBEF9841F9720F", + "z": "926828A8D1979527DA649B1FC98215B2F50192D7DE8B9035BDB0E7845B3B2A36EE8D9372", + "l": 1024, + "algorithmId": "91A86126DB391520A68050EFCB420BB8" + }, + "fixedInfoPartyU": { + "partyId": "7D144A89D7712E3EB1BD9D37E55BB9D4", + "ephemeralData": "C931831A80DC518D2AF18AD05714BE1C361E09F8270C14DE4FEF3460C69ACFC3115D5F76" + }, + "fixedInfoPartyV": { + "partyId": "4190AF64196061CD69D61EC1E910810B", + "ephemeralData": "53D38B9BC1DDC5D72A6F8AABE8FD7534F9771C43E25A356E570F396FDE3940054AB83046" + }, + "dkm": "0DC8B455EF46A062C2917660162193157BA9AD2634DF31672F82F8328DC25CD089FD875C9F12AF292EE4F32E73B4D08ABD65BBB5038BC5EF00CDF7CF56516CDEF21B0A7270793D5DC87C8F7225DCEC744E716AC42573C97C0852A9EC783DB6DF9EF73BB56739422FEE61B07BFFDF46C532218ADAA00C4F642077046CC332199A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 106, + "testType": "VAL", + "tests": [ + { + "tcId": 2576, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BCFF6A7FBC1962E7B842103033D5F4D0", + "z": "685A03A11ABAB183F17306675DF9A783B67CE01A9AB023D5A578A198D13258FF3BC32F12FF", + "l": 1024, + "algorithmId": "AF68BCF7E63312FB92D1C4267800213D" + }, + "fixedInfoPartyU": { + "partyId": "23FF5BD54474B2586C92C4BCDEEF7903" + }, + "fixedInfoPartyV": { + "partyId": "48488FD7138B5A6D514FEE86FC289309", + "ephemeralData": "CCF8FE23FC2B22805907694F8DA08A7C96AD986C026D13B9D57F1D9587C06563F61056075D" + }, + "dkm": "9566A2614299CDB08E50B45FC40020846190336CEB5D4F368A5BA96B7B393CA225BB10FD7CB48DA2D1D104AD31074BFC6FCEF9414FD62C807BAB426A685CE2E56E9887CAA12058D909B233D8203661DEC290672153FBD600C49CEE5B9C0532CD832BF6BAEBF49B0BEAB45E43B1808434FB4420D0E4ECAF1DCD5E827CB32A5301" + }, + { + "tcId": 2577, + "kdfParameter": { + "kdfType": "oneStep", + "t": "597E0896135F595E32100116DE01B7A6", + "z": "B36F72BCAC38EE35C3BD084C2C9097DF079558F861BD5B77D678D4F14B3E6B1078783022CF", + "l": 1024, + "algorithmId": "67F6E39241152A4084492216677E3C91" + }, + "fixedInfoPartyU": { + "partyId": "AF9DB2A2FDE75C972D2593C34C95EF7E" + }, + "fixedInfoPartyV": { + "partyId": "EC051ACC9C02157BAE072B4C9F8BEF52", + "ephemeralData": "EC95CF9811E242CB91227D479D8DC33113E48269C488508320BF21EF9463714C4449C308E3" + }, + "dkm": "EE17FD9EEF2145A456C7CD16169D317D9606F3E52E2E3035737930130545DCEA75806F177A4AE94DCF3936D9A52A54B897951849B18B2C4B5C20B7DBAD1A71CC5A7A137E29DFC5C9125FF82A4BE318710B8774AAA4272DAA40A43E79BD9B9E4775622907FE654FF4F9AEC9B20469F55380D8B294CB4F37D0FA1EBD21600C2E0B" + }, + { + "tcId": 2578, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D8516EA9CC65BFDE914BE43DB8716D6", + "z": "9C691C9F4BC648ED715FE982C18329456CFDD3BF14E1F6155629A9A1E09B42FB1A7876B26B", + "l": 1024, + "algorithmId": "B525121C88CCD1DD338A37BAE76CD542" + }, + "fixedInfoPartyU": { + "partyId": "422B88E565E793EA15A1FAECD3DB9AAD", + "ephemeralData": "E0F6DFC3831D648CFA01EFD66E874B802AF82466458CF9B6DEE258F32AE31197B6F28925C0" + }, + "fixedInfoPartyV": { + "partyId": "0621A0D8EEDC0C324906C2F0C903F6AA" + }, + "dkm": "65D5E201E90C8C44EC2D6AAFEA96D77080A6CDE9F408F24FF922BA63B0B4B22D5D5FC418258CEC4FB8934230D86F9F25C3B55B56F76D01887E74B28B7098DBDF652D3164B0AA84CC4430BC783563306D2872055B4D805547EBC0313530AC4685CBE9CE3BDABF4030410A61AB4C205B577FE4D342F5710B769F505D50CC23AF1B" + }, + { + "tcId": 2579, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DB85EBB7B1E1CBD3BE543E77F69C3B1", + "z": "B4E2AA1B860D77AAB58E72B0A6D6535C4C005AA85FB1A0BD02D0A6356C88F5DBC069B3C817", + "l": 1024, + "algorithmId": "9BEE68AAC1B93E6C3326D3AB2FEB8C1A" + }, + "fixedInfoPartyU": { + "partyId": "04121C6C7CFF38149DB113E1CDD6DA85" + }, + "fixedInfoPartyV": { + "partyId": "BE12E64A99BEC1D367680FC2DC74BA51", + "ephemeralData": "8044426EBDEC52C903F3510E656DCBC2D76DF0C9CE09648E481172779239A1496A3283CDD9" + }, + "dkm": "986C9A000BF5AF54C039D21C531C48CD5495A96CAB03ED1D5C26AE495C63A75034AB2D4B37833D3CCCAAE30E0D32BDA497F90503D4DD44A883279C3A5D572163E82EA4352C3FE80367F35D65E89CA76CFE67F65C3A734D2E77D512751CE976A66C9FF2D318431FFE4D9302A22A65836BE14320965371CE397D17BCB8633BF30E" + }, + { + "tcId": 2580, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4ED27C00A7F69D4F3F974DCB2B00583", + "z": "E15E34BD3441427FACF1F11BBD7686E4301F20F34AFA5596AAB750EEF70666C8054500D106", + "l": 1024, + "algorithmId": "0804E22F3B91226902892B5AC60EB7EB" + }, + "fixedInfoPartyU": { + "partyId": "07CDC084133E494124EDBBA99EBA02BE", + "ephemeralData": "131219663975BE27DDB3D17C529829868065F08B18F761EC820EAB785A75D7EA87894A21A3" + }, + "fixedInfoPartyV": { + "partyId": "DC356C1CDC5CBE1542434F29E3173658" + }, + "dkm": "EADC3DA1D28691CEA0B64F0645B200909AA786BAC8DF415531B070EE1111549E254F0BDE10D6E1F94BE7EF3181614B58BDC4CDCB9D798287CF0A4B884BAAE95CCF53539509449CB90D378569B8364313D959C87E8789143AC7D99F049F82C16DE7F819C211D2103BDAE428EE1513F015BB968D49EA9A7B467D191F9648A13445" + }, + { + "tcId": 2581, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEB54B3568A179F1F5427C79052C294C", + "z": "0D74943C9AF37D8A5F5B224C32DFCC434D1F5A1CC1ECF0FEBF2E21CAAE0A067FA35B7BC3B1", + "l": 1024, + "algorithmId": "07878938461A4F3FB2F301D41441745C" + }, + "fixedInfoPartyU": { + "partyId": "F118A6B589F335135BAE562122CC632C", + "ephemeralData": "7D26AA050165E3AAD22F161E831EED2BFD8DB995DF7B6A83932E4D24ABAB5C57299CF76E91" + }, + "fixedInfoPartyV": { + "partyId": "5E11D60D89B1802D603176766F0C0370" + }, + "dkm": "C2E62340EB0A88F2362483092A58D788870F7997879B0491D8A8081930DC9687036623771EF44B462F3F0E74BC9B0DCE192D9CB279DAD83D01BC8B49DC9759224973C42D3BCBEA03F8A9C667AC598197F6EDB6EFDBB404CE79AE5E66E6484EB59F292F445621BC62BDC660EB069209EE31C0B6062A39DF5EA6F23477D60B806D" + }, + { + "tcId": 2582, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76AC5199A1D150CCE7535350F18C888B", + "z": "6ED03C4C4C48B612E776FBFA4FA3F832DAC7276EBEBE88D143B7819BA580AEAFD60F781012", + "l": 1024, + "algorithmId": "B49BE6E14FC3F99A4FB4B8C7C7E2A2F6" + }, + "fixedInfoPartyU": { + "partyId": "2A2AE213C8FAA49BD2B44C0BD9DCDD8B", + "ephemeralData": "B85DB0671E8B30D3AD0055B3D143E6CEED4A903350B795F66A38E5929838B4DCC0D518DF9C" + }, + "fixedInfoPartyV": { + "partyId": "9AAFC21165AE3099CFB973A12700CB98", + "ephemeralData": "64E26F3EF181109C9BA78237742C5B4C239067B7FF3745031A5961C58BB3860C03D4F8CDF8" + }, + "dkm": "8920BF5F5B102AC01FC76B0F47C61610B8B8775E9DD3A15BECF830442A3E24D9BC1A5FEA837C53197A7A2DCE4B8D5D2F7222A522D3FE00EB61FB146664F326EB9171A4AA6DF9C43D65CD866704E8FE22F7AC1900A25147517CC0442C8F4AAAE7CAC154F25C932A38493C4A812810873CDEFE8BCADBB4FE48E9ABAF668245468D" + }, + { + "tcId": 2583, + "kdfParameter": { + "kdfType": "oneStep", + "t": "455E8DE1FC49AC7E4C519D85B6809243", + "z": "22330AB426BFB92CB1B1D348230616E95E725CAC75F99D8DB39D1F2236698F778C18C28297", + "l": 1024, + "algorithmId": "11B4E4B5A1F9854C9A29FB5E519475A4" + }, + "fixedInfoPartyU": { + "partyId": "3035864F0FF098B37E627F1703CB859B", + "ephemeralData": "C75CCD3B8F84A662A1E3B06F87B369476F9126DAD76A83FE765F6909B7DDA443F5BB6BADE6" + }, + "fixedInfoPartyV": { + "partyId": "0EAC77A56C993C1EF9755F252741A666", + "ephemeralData": "182DBEF076FAEAFC77163369BAF4E74969E53471A227303BD0E563553CC0938533B7439F7C" + }, + "dkm": "83B895DFF15708DC152EDBBF1998EBE7F2E9FB982D3FC68772754B7FB4EB1D56DAC702CC1043E125ED41082DF35CD033F0459887407A77D3D3FF0EFACBD5A5D76092B06295076D095223BDA87386BADBECE320CD068FA3125054049D1B6A87A379500BDF2CF9A7EA40F0F04F4E17E7A059D9D11FE701890AF5743F97EEDD123B" + }, + { + "tcId": 2584, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F153658997520D63B539A445C757010A", + "z": "C84A3C951532C7EDB50FC47DFAB507AC77649BC9CBE9402C2992BED8A0BA5398A57BD5FA82", + "l": 1024, + "algorithmId": "3B59775025A115FAE910E244A33E2B14" + }, + "fixedInfoPartyU": { + "partyId": "AED426B7DB887F8C00C83C17CF585669", + "ephemeralData": "A39D45BFE58A52D75AB709656EA4E06F805E5E06A76E8785EB0F1D11B0FB715CFE141FB56A" + }, + "fixedInfoPartyV": { + "partyId": "7520106C01F9A0F1AA2B67D4E6FA6BDE" + }, + "dkm": "6242A4AE1434276BEBDEFD984F74A98B64BDC654C52089C7708DE611D84FA0CA90F4DD73E06B7390B95E2870BCAF8E96313E0BB583B05A0D1DE5C4161E767F7CDF30520A2DDFD83D82CF509B91500D80721777FE6C3C19F68D9D3C28E0B96679F864473731F884902F91595409D348DE6D9508EC18716C0E912F4A81E150D6E6" + }, + { + "tcId": 2585, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB1ACD792DEB75B3AB2142B4C689DDD6", + "z": "5ECA97070A5065CFDC92CAC6F79F3558FA15E50B9D4040BA9AA0583D804DB1952BFFF5F880", + "l": 1024, + "algorithmId": "0E8E54C21803251EDEFCC8087E7219E1" + }, + "fixedInfoPartyU": { + "partyId": "E86D90AB35F91080EA76463C2C40E28F" + }, + "fixedInfoPartyV": { + "partyId": "7622929507D8B1701FCB640756C22701", + "ephemeralData": "434582C9BFD67EEBE29E94CB0C757E8808076F060667F73E315CD1B577B4BF12BDE9A4280D" + }, + "dkm": "3645950CAA97DAABD0F7A42A2118F3B18C08D8AE44CE51E28127C19AED2678A07A0DCCFAA2513F628D73A49AB015A6E142980A40EACDA3F6CEED2A516028311820B4FB46F5A0CF619E4E30107579E28F4111510BA8A4BFBC3339BF9C51A07BBA811EE86E9377454485B1E50F474064FAF43BF794CA3239810C4F734BBE8E5DC4" + }, + { + "tcId": 2586, + "kdfParameter": { + "kdfType": "oneStep", + "t": "875A7637472664A3C6F72B2C47B0AEAD", + "z": "B70BA97DCF3FFED6250885C30344B61BC60436BF170D575A515BD4F8F359CF16D2DD35255D", + "l": 1024, + "algorithmId": "BE1FEC31060429B6361D4B6D288AFB6F" + }, + "fixedInfoPartyU": { + "partyId": "3F772F180D48759C56335356DF96EC42", + "ephemeralData": "9C68BD79FF86A60DFA3D4E66ED83C77025A0D2D5554CB0D38C95F91D33C7910EDAF06E41C0" + }, + "fixedInfoPartyV": { + "partyId": "A55AC2C097A110C13936221805DE67C7", + "ephemeralData": "EE6D4860E14B4A3AA5AC562C49914D0C9AF46D8EAF48161295737626CC54C07303EB795030" + }, + "dkm": "B54B02A7961279E4D16C3923A9B4E4B546B65A7796AC62BBB2677A2609CDE0BD408310032D98DC5EEF6E2E5B1C8429A46249175DA3480F41AE04B0F57EF556991DEECFDD095BF2A1E984BCD76F3471B7E1D476A89E97C979D535829AF9745B9023CF51D4094FA3B629876CC5674AED61ECAAAAB8B4EDFC1125E788A074EC2872" + }, + { + "tcId": 2587, + "kdfParameter": { + "kdfType": "oneStep", + "t": "037C850CF74B79B614FDC69B80ABD32C", + "z": "42DAC776DB620D1EF22876875B5A28382F70E989D68B756C6B37CD01C9D942847D9254357C", + "l": 1024, + "algorithmId": "2013970F447A57E719163EA22C9B5920" + }, + "fixedInfoPartyU": { + "partyId": "9C8221C00449A8C5F899B7D290A8A381" + }, + "fixedInfoPartyV": { + "partyId": "9AA5F45C6BF4AAE7190DF537FA0C44D3" + }, + "dkm": "A27B822A21053967D3EE787EAAE8D806398E6510297EE3397F6FAB850933620512900E03FE208CC36AC504EBA5AAE82752F1E2FF48B54BF2767F3D0EE1CF92C831B63CFF1C872658AD1F15EE53C7D5AB3C545081B0D51D01C83A7B3AB7D438A3FCFA0DDC5A858A156CC5431B8DB0999524EB98CA4286EE4064B484960F10D9C4" + }, + { + "tcId": 2588, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1EE18C1FF18964A62291CFC90E97052", + "z": "A9DD7BE2909985F604BCF85A10E126FDF287669BDA96FBDC382F879B7A51526F524758DD63", + "l": 1024, + "algorithmId": "9E0E01BBDFA47FB247F61D5242BD39FD" + }, + "fixedInfoPartyU": { + "partyId": "B22625819A6D2AF9956016981DE24BC7" + }, + "fixedInfoPartyV": { + "partyId": "1E61559EED15834D9677F83676B666CE", + "ephemeralData": "2FD612947C0CD55BA74A924A876B5290322615132AE65FD183218B2F174BC6E65A6A835012" + }, + "dkm": "09A5342680ADD2B026CD8294847223F59AAB1B22CACE3C8CBC280DE6AC9FCF30A2CBD16D7423C2A141DE31E19B7629E7A05C81125C13E5CFD655D0033326470835B28674FAED20503B2BC9C175B2DFACD6425844345C61880A51B99A81E11EF9FF185E14B4B3056AB2FAEBD792B587B2FE6B7ACC7799E667E1C05A6CB492ABB4" + }, + { + "tcId": 2589, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B0B96DAAF57351F9258C8CB543A1C7F", + "z": "15CE99F604A625C1C9B7FBBCC55BD05678557D93DDDD13DB41ADE5F072F9590D5FB13F1EF0", + "l": 1024, + "algorithmId": "6D5F55ED8932103CFF7121ED1B4F1D23" + }, + "fixedInfoPartyU": { + "partyId": "1846D17A224450AAE2DBE241C3710EAE", + "ephemeralData": "80FF334F8EDEF04F95B76B1B79F47336920B852FC744424BA83FCBB12FA112A2EBE34E9AC3" + }, + "fixedInfoPartyV": { + "partyId": "C1A2B2DD010501A2103111215F6BC232" + }, + "dkm": "0A5EF8C83C1C49228FF371725177B96A19414E085263B1E7E4A842A68E7EEA2E445172860D3518C57D72B3D9CAB247A378C7E6FE0DD7A30AECC2470DCE5762177AC4D7B3373E0CD136D32D9039C52DAB1F9BEF7D8716FA9F7BD8B1C02F289F2C4287BFC9B932BB291CB4589F0E78330707055D524D32DCB3FE4D92B60923E8B2" + }, + { + "tcId": 2590, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B2394DE88F71EE90340ADEA9A684876", + "z": "606AC95233B6B9AED91D3C5ED991EECE775A09496F298028A4881109CEACDF80EAB803691A", + "l": 1024, + "algorithmId": "847C63D4E47E564A9737D03C2561193E" + }, + "fixedInfoPartyU": { + "partyId": "8A9418CD9EC05EB79CE1CBBC69F59AC3", + "ephemeralData": "EE7E9F692C24950B7F7BFF22F50D03BBF014AFABC9165E52555A5020D2C1448CDE717B4BB3" + }, + "fixedInfoPartyV": { + "partyId": "E46C0488610C614190ABE9A8B00EE4EE" + }, + "dkm": "16A50BD7C85F9ACBB17F3FF15AE2406DC0DF483C205738F0156A2C0B404238AEEEF1DEFE81729F0AC80320977F768134A42738605C7BF90DDABCAA833A1288C3018999107CA235015160133041E3B6E3C631D1EB6F4C19A30161092989BED7565894618259BCEE4BD4BFFEDC1C187F8BBC92B7E495697DC4A711480C5B5E933C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 107, + "testType": "VAL", + "tests": [ + { + "tcId": 2591, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29E271B9E628A4F761BE92B7AA29CA3B", + "z": "86151F1D88B9C19016211BE71510B6FAFB2BE0F701E3F9DEFC1FDE4DEEF6BA", + "l": 1024, + "algorithmId": "761E98D410F6EE533FFB47C17F1B8022" + }, + "fixedInfoPartyU": { + "partyId": "81C790D4B04BCD1B98D0A9DD56CC0BE1" + }, + "fixedInfoPartyV": { + "partyId": "E3BEDF97248C5EDF980EFB5CA9302DA8", + "ephemeralData": "ED8473444AFEBDBE1084DCE5F174BC38FAFF4270D01AF978E5511DD413EB20" + }, + "dkm": "02A17F2F3126D9F115930629D13B827F6AC759196A876FBCCC6846FEC1637518BDB8C5B7E8C3F2286476648DD4893C55EA3EA87460C90B64E7480CB5FF55A336950A82B5F0FA17DA9291BB80E52595E38695FF3E071A32072A4694457FA7FE6F1CD8AFD8452DE4244FEDF9D6937F5953EF0B79044BDA872019FF23AA2B549053" + }, + { + "tcId": 2592, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20896FA6C80345F71A73CFC8D6CC1004", + "z": "668A7EBDCA87DA9ED720B49C020FA1344CA262B329B61FCD6EA3D08A798252", + "l": 1024, + "algorithmId": "2D0FCDB7449F1C1A0D528203C1A14E6D" + }, + "fixedInfoPartyU": { + "partyId": "B8C0A512B6FFA1605D845435F27E92AA", + "ephemeralData": "F8C46AB4FAA1B21CE017B0E3207E4F954EB1D948B0DBAA316CED6D9727CFF8" + }, + "fixedInfoPartyV": { + "partyId": "8614D4788AC011A53DCF63AFC574CF1A" + }, + "dkm": "26A0A462615E7FFDBFE14EBE2A20C5CADA9B2E96AB9F94EDFF08A680386A21C7458FDD2ADE48539558FACFBC4DEE75F693C95EAF97378E7F922B46C95FEED7C2122F70D8BC5A1C9DFF652A2150B28B0BC8C53FD466393F7E67C864258EA6383820AE26807D24D4C34F30590ACDD2156D0FC7A1BE62D2F5E5E1AC45C40D5316BA" + }, + { + "tcId": 2593, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10A11FDDFCB53ABF417928049BCCE5F4", + "z": "6169645C8DD86B1947C4CD0A63CA981EDD3657F115AF8EAC7170EB5B55820A", + "l": 1024, + "algorithmId": "B20A607ED9E486AE3F6619974C19E442" + }, + "fixedInfoPartyU": { + "partyId": "EA8812540D207484C7AF0AFCCFD3E48F" + }, + "fixedInfoPartyV": { + "partyId": "244815E313F03B3A454296BB1363965D" + }, + "dkm": "19A892CCACB6CFB3A0562C2AEF35F5D8347ECAB0EABBACCAB14F1CF8F96A20A33F737EE4CB1D298C8D14151053A94D303AB669F6D08015D86C7E369F62A3BB2C36289966A67D3026F74B51EA80A7CB31B0E1CFB6384B9FBBD0AB5383E8A874B125FEE3B7B59A00C74DA3EFC9651499DF6A094E7B05A4092EFA080D1B306680F2" + }, + { + "tcId": 2594, + "kdfParameter": { + "kdfType": "oneStep", + "t": "782643D5D8A082A03781ADA0E49B917E", + "z": "9462298DDE7BEFC9DA636ACA056955A4FB2C7008F05CDE9A9BDE0794EB20E5", + "l": 1024, + "algorithmId": "42EDB19394E4E5A140C41165F3CCE57C" + }, + "fixedInfoPartyU": { + "partyId": "802ED64686B36F8838183254646CBE5D", + "ephemeralData": "F8351CD11C06A9AC26237F4B9479EF71763EA37471B0C28CF39AB4F314470A" + }, + "fixedInfoPartyV": { + "partyId": "E5C4A68292D87823A976D829D7971435", + "ephemeralData": "05A491A7D270CF78994D670B603CB78C6F227EAD4A6820E63B359A5D57143C" + }, + "dkm": "4805B723E1636EC3C045CC6AF22B20804850298AA25655540A6F31EF060246A04A926C2010C231581F5F8DCDF8A8A85D9B6856D660ACA474876FF21A42B79FA71606E858F83226D441BD25FD5C6F53B8F3AABBD4B70F93E8A23F92F33238A2B7A39840A4FB5DCA85A1B2A255FEF7E1B7DED00DFF34702C6738D15E867620F1FF" + }, + { + "tcId": 2595, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E73BEEE2D0B5E2071F44B29BB3CC5D7C", + "z": "EBE2D8BD41F9C54C6467C278A70BD11DEFF7AB393F8A34E392ED5169695DA7", + "l": 1024, + "algorithmId": "5692C07A5F18E279CEB38EA0481909FF" + }, + "fixedInfoPartyU": { + "partyId": "740B72117EE9CA8E0429561CB830A78A" + }, + "fixedInfoPartyV": { + "partyId": "520AD4AC57A41CF93F25C346D7FF97F3" + }, + "dkm": "D08A124E667D2D1909759264FA677B2BF5F69D0D6B35127823A2C341700EA6BA1A1DD0C7CE133AF6523ABE29205CE215E9136435A61694774FBB87B71A82A45AE16DCD39FA506AB84A29201E3A21E903D3A3F827BF5740B50A0EDD90F93412EA3E7DEF04D1C8925BFD6EFA9780E826ED7F6E565E7A85A6E00C11FC507A601DE6" + }, + { + "tcId": 2596, + "kdfParameter": { + "kdfType": "oneStep", + "t": "977F55AF1FC2032D81AE62CEFEFB3AF7", + "z": "382A9B7C9A0C842DC97077F386E8C4123BB749ED441B1E996BBF19379393C7", + "l": 1024, + "algorithmId": "5A83FAE361277CC6E7495E7FC78E3390" + }, + "fixedInfoPartyU": { + "partyId": "38C01EB3E062CF38414C67509A90FC71", + "ephemeralData": "0F168F15244EA778AAEA1DB8F0D3E3F3FDEF240CB265C9571F8BCEC65AB0C8" + }, + "fixedInfoPartyV": { + "partyId": "13349A0186437171A271CFEBB324D4C3" + }, + "dkm": "75D52DC953F6FD0D339778D2D341A1D4BFE4710F5E748B9827F711BD9A80B214C78B8335A6E1F0DCE521B2E770B5D377526C640A7AE0E2722BBF3DA579441631E8EDEBC70E537E161DF6702313C4C6CDEAE455A5CF626EF830540EAB1CE65CFCA7C5AF52721628F3F717BCEB1E5E04ED5752F46CB645FF37AFF2915D7122CB99" + }, + { + "tcId": 2597, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4108403653CB000A2E2D4B66EADCF664", + "z": "9EF4271ABAB699F822175C4E54246090394B5D9F69985A22DBE11CB3673426", + "l": 1024, + "algorithmId": "F89495F53CE22246D447F31AC4E4C744" + }, + "fixedInfoPartyU": { + "partyId": "D08EE2CD90BA1A82DBE12DC116A11906" + }, + "fixedInfoPartyV": { + "partyId": "66FAC12766196E120EE4B9EB11F33BC6", + "ephemeralData": "595B75C7BEAF07BC5F1B8C01EC53FBE60B165487A133D1487E627734BC8562" + }, + "dkm": "2CC4287ECE79A67CBD851C9A63B6DE41FF5AB494888D0D0F85AE1112524CABFB08A6949919F084EE94B498EDE454B40CC64399E783C5BF009F9557939CE814F032EFBABEB5CC5E8DF72A1F463CAA70702D8FB6E5F84304501B0AC2CE7DC19C1A6A515D84D0D940615A9765ABED1F506D00FEC2608B52ABF47AB3212BBDB8FE37" + }, + { + "tcId": 2598, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93911526AD0B17BB80FBC5C0C817BF86", + "z": "5506AA2D7C743597FBE70D99ECFE19807315DAAFBF164AE73A972EB54A1603", + "l": 1024, + "algorithmId": "D4AA6E558AF1F19F7CB3B54538F4305D" + }, + "fixedInfoPartyU": { + "partyId": "A54C05A97D2F85EEA5F4243E875E608A", + "ephemeralData": "915169DD14FE58245C348E7C4F35C1443C0C1ABA80B31B1C85F72828948BA3" + }, + "fixedInfoPartyV": { + "partyId": "D4EB7470236AD868612D721F8AD7CEE9" + }, + "dkm": "4A1939D93170FAE39B9874574AC3DAFEF91C9B13F68854C9AD1821A82D1E47660CF39EB8A415D5477C63A1013BEF8F93FCD16D68AF4B776D78AAA854CDCA697FDAF8FFE08759829AD19C26D6531958A8E4FA92B7AF53CC7A4D6FDA5831D9F668A07AD98A33C079A7AD5AC2A650FBF3DE76D39E8ABA68019242126406D564BDFF" + }, + { + "tcId": 2599, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E5ED8764D38625F0507DF5936D3CE76", + "z": "F70FB0116497733024305CCA77656577BC3A54CE3F15EC7E4DBB1C68F85601", + "l": 1024, + "algorithmId": "E4F268081639C0996D5DE974C49C7B10" + }, + "fixedInfoPartyU": { + "partyId": "B038A0444A5481BBC7896FB114EA62C0", + "ephemeralData": "8FE0E50749BB9DDC080A26696C7E1EDCCD3B5684F5C831D1F1936111E8C1A5" + }, + "fixedInfoPartyV": { + "partyId": "654393A68042F8CE5EE527EF6B3FE63A", + "ephemeralData": "486189E3709D1F39B4DECF169EBA3950EBEA49A5740BB99BFE46CC22256D87" + }, + "dkm": "03A059E9B8250D60ED3EAFE61DBCB240CF22730B390FD82D5149F4D0020901DD17D1499250B473DD6BFEBBF461FD4F533A5EA682E20D65C23CD7A9C65715079C76B2C0095E334474FD5BD228BA5A1F597C2D713E264BA57036CA6ECE385BE55BE7F8093E9E58CF980855BADDB98A2776CD237FED248EFF1417F31E1A634219FC" + }, + { + "tcId": 2600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8467F03DDB4928852ADE62FC91B1777", + "z": "83B2CACE624E606146B8CA80AA0B70EE7ACA8CFE7160F46534970524C6412F", + "l": 1024, + "algorithmId": "EF45FE590523C9C3868F7E60EBA00D47" + }, + "fixedInfoPartyU": { + "partyId": "C6AE75CFD4B5E2DFEA213718D64A8243" + }, + "fixedInfoPartyV": { + "partyId": "429B6634B7C365FB760DC6D4F86CC617" + }, + "dkm": "06E79F4EF4E5B133023D384AD1A1FF1A42B55CD631261BDDC5CF95068D263308C9FB79C52D7128003F63CECC99C4ED60D27B049F85EC2BB68329EAD06909D064BE4F429970DC9647AAF86746D3C3CE1B54A1E7FF6F8B333AA951732760BD52046AB2DDBBBCCB9DE65D30A91C6D38C14C2CFF567E1350A852B0C71D038B6684AD" + }, + { + "tcId": 2601, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37E52D7A63812E4B4CB6BBBB4F3C8969", + "z": "BE0F29B0F3F937754B56C0AE78F8759043B157DA04CC138DB808FB367688B1", + "l": 1024, + "algorithmId": "380ADA8918DECD573973ABDF3E46ED30" + }, + "fixedInfoPartyU": { + "partyId": "F5DBB6EF3CAED0613DD3630066A7E729", + "ephemeralData": "BE5C1A12DD16BBA22D424AB0F3DB0D0363071401FF013C5B7636B582EDF1EB" + }, + "fixedInfoPartyV": { + "partyId": "4D3CD461C30B30B1733C2138C559045B", + "ephemeralData": "CDCB7E3E7F4267D1E12A42BAFCA443E04064589EC74BC4A94F44E8DBE1384B" + }, + "dkm": "2737A993DE6882A4BD797FCCE22763CE0613E5EE20F686CBAEF378ACBA7A15BB14DCDD5A883517021BCBA8FCBE921C7E3205365C41FEDBDE3759BFB7AFA871B3DAB56E79DC77086CB005FC3DEA64756C22E816BE646615E27651A11CAC445A25DB3FD1BA069C8B50A91F6C7E1723594ED4738AFEA9AD6713B03FC8C1112B58E1" + }, + { + "tcId": 2602, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C04E3DB6CD2FB3A437369CCB4C097007", + "z": "54275277091F33668F60C78C0B070D804C439332528E7AC8420971AC3F306F", + "l": 1024, + "algorithmId": "3514AF2630DC80D76BB6155AB3C10CEF" + }, + "fixedInfoPartyU": { + "partyId": "923BD7ABC9C9D22CA99DD290491C3299" + }, + "fixedInfoPartyV": { + "partyId": "9959F8CC02A18935349D87A2AFDFEB76", + "ephemeralData": "D960A7FC495A147FAAF7040AF9303FF79A7BB5E859F46F5D5071AD8C88C92A" + }, + "dkm": "D0A5095EB2C7DED9F02BCE8625872C54D026890F8CB7DB4E3DA64C446537DBA51EB95E9A6958C997C9564DBCDB2446A05914E0330FF8AA3D7C31E897ABCCA958BEE45FE360BD645E131CDC7209CBCEEAB68D6BB9744EFFFAAEF3EC9C282F545AA5C02A329E29910A876DF967E9D541A6871A7EE669877C5026A66B00955D1B86" + }, + { + "tcId": 2603, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D48BEE08D07602F6B8DEBEC9F0632EBC", + "z": "384F877F3572D30BE4165EBC72FF324BED78D7D5A3A94AA05124DBC60C2A3E", + "l": 1024, + "algorithmId": "13ED845BEF9082E34020FD812C2BB1C9" + }, + "fixedInfoPartyU": { + "partyId": "E1081A20A5C3DD9738277831B1BCF7F4", + "ephemeralData": "F0C4719ADFDBC60BD3BCC71ADEAE71FA18D2EF68F200452775CE7B099D2A15" + }, + "fixedInfoPartyV": { + "partyId": "A7CF3477EB894728792EB15C6AB791CB" + }, + "dkm": "4E62F55FE984A75F9820D6C9FEF423039560CF3A3602CDE035E3331D0ADE1DF9768D9DBBB2E9D32876B921F8B03A52A26D93629AFFDED84159E16067D53D794B77ECD118FFE84E0FAF9093F69301D5393C8F0B3BDEAFCA4147BE49B62074EA0BAACBECE06F0694BDB3DA092233E1651B5C8604B64D4356712BD7368715B3ABED" + }, + { + "tcId": 2604, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CD62BF9803B6A1CCCE54B235E62B50E", + "z": "549A2B196EC9778F217D802214CB2B1ED2D3178BBA10AE2A17D48A17E892EA", + "l": 1024, + "algorithmId": "110E7B596F5061024E1A66838B965DDB" + }, + "fixedInfoPartyU": { + "partyId": "B55A9113AF389E3A87F693C684E48BD7", + "ephemeralData": "FE0DCE4883DA44358A0B4F3200E2BB14FEFE65C0A058716DEBB3162E541D98" + }, + "fixedInfoPartyV": { + "partyId": "D4C6553A5517F9D7C026460E8025131D" + }, + "dkm": "BFD0E474C807EC613B5A394446C2FD8DC29F9147FF928BE6B538FE1CAE842F48097D7ED987FAEFE73C941B96F2DBC1F291C99D3C0A570EF9ECF678856FED9785F10A81684653F7460B9D949A328CE06043FDADEDC5B77955B93964DBB10A9F46C0ED15E7C103A824A6990B72FCEDB5A8A560B81190CE0834B2B9E62BDCF2EA51" + }, + { + "tcId": 2605, + "kdfParameter": { + "kdfType": "oneStep", + "t": "533393B6C64D9C2125BF926D120CC99B", + "z": "26488E69F53240D232A68D2F34C000B5DEC00411DCDD24DAA225D8F21681F4", + "l": 1024, + "algorithmId": "DBBF7EEF3820108DDC0EDC051658FF65" + }, + "fixedInfoPartyU": { + "partyId": "21ADB68FEE31267602CC676D43CDDDF9", + "ephemeralData": "1BA2B85C09BDBD344D707C3634E2B7DB4C3930A5B2434E4EC5035FF5C598BE" + }, + "fixedInfoPartyV": { + "partyId": "465D19231FF508DA9A3082F6AA931192", + "ephemeralData": "1A2951872E59478659568E9C942027AB9569FAA137914B4DE4EB79D4D812E5" + }, + "dkm": "7BCAC28D67A9E7A00632320019A3E1FFD9CA211BE7832811E24FB05C688F0CCC460309AC5E9E8700587835264DF06292C07E7FBC9FDFA7FBCAC074FE181B85BA233049058EECD03ED1163232ABAF07AFD9629F9F76AF0B0C00AEF6183654D35B5038584B062E95A27A394BDBD62056727054EF1CC40B941F16882F9A33F6D185" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 108, + "testType": "VAL", + "tests": [ + { + "tcId": 2606, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C168553C8936BE2A05EF1121E56CC4F", + "z": "5308FE748EFFCB414638BB340997104836390C26202B135ACCD253AA", + "l": 1024, + "algorithmId": "048291D92B60E70226F8F6BEEA9ED37F" + }, + "fixedInfoPartyU": { + "partyId": "05F735A03CAAB6BE8680F4D17DD23063" + }, + "fixedInfoPartyV": { + "partyId": "0B5C574453DF2BCF4C979389D3D15827", + "ephemeralData": "A0C802303A9CD97F37A54CD5F9D30BA5FC117D4B11905464BC3AF5BD" + }, + "dkm": "D9C903B75656E9E57A60A79ABDAD69EEB19CD06CBA0CF60506D2331B70FFCCA327E3CA7B2B0E3A48495B0BD208C99DA512D1678754D1B63D09326528557C76101F8D05FCFAA0D200D1E8E7F1E4B571C9C7521BFAF1AEAD819ADD266F7F220AC850B1742A83E248FDA1012795B43547DD0E0BFD5C254F4B1FA55821E5B7808774" + }, + { + "tcId": 2607, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3DB93839361CFE2D74C63FC2B024880E", + "z": "D52EB025DF8BF6648D6AD0E1F435DD45AA22C8D0E73D1D792D365D1F", + "l": 1024, + "algorithmId": "BC308F0096AE46410B2C18D45C25EC1F" + }, + "fixedInfoPartyU": { + "partyId": "F9E03C4BF1420359A276708C08D2F6FC", + "ephemeralData": "8DDD9B9367D41D19F5D9EB68EEC90756D229D92CCE695527C94F2F1B" + }, + "fixedInfoPartyV": { + "partyId": "97603A69A1D50BDF8009C29116284279", + "ephemeralData": "155C0F49FD944013B0E954DB778B36E85AFD03040651E30278FB02D0" + }, + "dkm": "33F7BAEABF4F79CBF6D851FDDFDCEA1766D118AC54F3F9110CEB678EC29332C57A0B9CBDDFF2E300EA21C5C9AD8D4AAA613374657356BDEABC8190791D3559D059430F42BE85A2C4540BF7F8FAB0B2E5BE3474FAED1FC1A777859F9E54E6AFF64F7F35F3973BF847EAE95DC32977A1721EDCE03E95CE844420309156EE8A74A6" + }, + { + "tcId": 2608, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42AE49A44B164D50A1188C2076563804", + "z": "F25988144D395BF71A319B714F6C23A224F845934BDA5C4734187AE3", + "l": 1024, + "algorithmId": "EA34BDA86BBD544599A6D83FAA2A2DDA" + }, + "fixedInfoPartyU": { + "partyId": "DBE30A5DA8A300A52E877BA5FBF55AC2", + "ephemeralData": "F770A93E9C267EFD4F3889E803BE20CA40884A941709DAC7E12DFFF4" + }, + "fixedInfoPartyV": { + "partyId": "3011E3EC80FB102C8920B95D78ECBC89", + "ephemeralData": "8DD7D6340011E2105ED78E11691DA391D875968CAB8175A5E5E0DAED" + }, + "dkm": "9D8BA1AB943F44EACE3847055B4C7F0AF6C3967457036C2D92F8E1AD3650E81CA2DFD9ED233CEFE4EA5A98168C22C743738C06C6CCF81AE12AF50C1634BA1F5F0546ABB1031B0E4523025A397A040FA206B6CC671460DF2117CAE0C1D28BC21B024A1354769BE26A5CC4A5F73AD458D2DDF015F62A7B451BE1E6DB4C55029062" + }, + { + "tcId": 2609, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC311EA2A9D828D175C69EBB20F8C29A", + "z": "43AEAD7B99EF0C35DEBEE30D85E0284DDC6BB2D3AB9D5D1CDCA8E625", + "l": 1024, + "algorithmId": "072D1741F196B27B75796A6B80224238" + }, + "fixedInfoPartyU": { + "partyId": "084C4C243CEA506E5ACCBA815CD3D092", + "ephemeralData": "F8BD16855B935A0EDF03185AAF6F600FF718A75260BE9B5348A927EA" + }, + "fixedInfoPartyV": { + "partyId": "122FFC14353FFB05859166E6C0E8BA82", + "ephemeralData": "D95EA9EACFA91058BE97DDC6DD3DC24D949024294933CA8D7BEF5F63" + }, + "dkm": "AB41F90478513BC87F7ED31FE8C6FCB8809FE175AE460E477AC53A2B7F90DB255826C4F50E2459EE5706A5C8221E723ADAA1AAAD0E1C0B8ED98469B7C26B4B7E205555A0BA0D31C63DF4E960B5D8E986AD34D5113298DFB6F74585288B329E98771A2FA7D452570294D3A921B7D58B4B80F00B1A88D6BB6AB3E5FE69929AD758" + }, + { + "tcId": 2610, + "kdfParameter": { + "kdfType": "oneStep", + "t": "078EC1DB4D6A1E1C32FB4A66D3BF52D0", + "z": "87F34170CF561E29187FB878B4DF4473F41BFA6A6FC89170E1ADF0D5", + "l": 1024, + "algorithmId": "D6C96F03922EE21F4336ADA610736B1A" + }, + "fixedInfoPartyU": { + "partyId": "6C684F8A3F65E7C213BD27545D67E842", + "ephemeralData": "5290F2CC874CA0BD92812D409D2F71DD9AB7DD754223D5B63ED7BE06" + }, + "fixedInfoPartyV": { + "partyId": "49DE1B44138C491C826A9FE9B5D98E40", + "ephemeralData": "A0F780AC063DB00203E701D044C3724F726572D9E72249A13676E479" + }, + "dkm": "113C2E71A2C618364555487732495DE7BF1DF603E60B77F7A9306D50D9174457FE0ADF157AFECC3E901D688E96FC072532807316AE43CDF26702EB000B55B05CC2EC95E7939DC931986C2B8B2C8E767A46EAAAE87AEF435D452575985C41E33820C5273719D520E6E8CAF656C6739978A235899394482A09F2D720CA2BE16E4D" + }, + { + "tcId": 2611, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E0F10D9A80E7F0E9A797670C2E851BE", + "z": "338D378EDED700815B2F73827A6948B80180D97293170A5FB5B46523", + "l": 1024, + "algorithmId": "3BDC1BFF68BA7AFD43BFAEB39CD10755" + }, + "fixedInfoPartyU": { + "partyId": "9750553AB3DB27669A458B6BEC6A17A0", + "ephemeralData": "975B13CE032C96936E5AF3E37C2827D58D23ADB4E065259416C6E277" + }, + "fixedInfoPartyV": { + "partyId": "DEB60B04F20B1DC75416E940B02B207B" + }, + "dkm": "AB0D5CA605365B64D65F2B99FA5703ED63C504C74E7BEEDBAD39EF504002EEF6D164ADD5B4E05CDB828D497327C4DF9FE456019B5C6D69B48789F3418DE2EE349150E2DBED81724BC69C832CD1EF9A1A5588C776DE3542B1ADE81A52964198AFC53A62F20DED53F2B81869D28AFD23914295AC9C36005FD184F57893F2C54F30" + }, + { + "tcId": 2612, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D09BB3E2F5F953D8E19FE90658A83F8", + "z": "5636CA94EE56245164AD05213B858C9EDDFD43DE6BCFD8D09E55777B", + "l": 1024, + "algorithmId": "08368349DC541622CA648FEB7358ADEC" + }, + "fixedInfoPartyU": { + "partyId": "4C861EB31F38972ED261E60C678B3530" + }, + "fixedInfoPartyV": { + "partyId": "A2050A6721571BA40D380D230FB1EF3B", + "ephemeralData": "0ACB685A52270C4685DB58ED099D33B08DCD890DB32AB7D096B7A83B" + }, + "dkm": "D524E6CB2F011A29F8DD61896616A7A8B8A12DE66C8E4CE26C6E6FFD0B5EA96763F384424DDC03E5F49A99FAD84D8C7FFB4FE9438A43A9A5ADB68C74727C2B487C90CB0C08C7CA3683051FFE08C4E93529B58BF5B2B42EF00030E6635B0F0060FBDE18F9DE93A94FC3910B8AB405779E465124F830636F546EEF21851F6AB859" + }, + { + "tcId": 2613, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D9786E06760CFC8A0F6E396521750A73", + "z": "1D3F788A99B483C1D77C831377D68005C7A1F4D0F10539B291EEE999", + "l": 1024, + "algorithmId": "D1F5A4D9B33786B86A8AAD29FC03A0AA" + }, + "fixedInfoPartyU": { + "partyId": "12233ADDE89A201E9EEB5E0D496414A1" + }, + "fixedInfoPartyV": { + "partyId": "1942A214B0CE1F95BECA601D6C9978AE" + }, + "dkm": "28C8CF64F1B26A1A0A7E47DE9177EF3BB9AB4F2A57EE5276C958CA0D23D9A2AEC30340170892B59FCFF952B929936267ED4E9CDBD72A62BD3B810DB32261D6486F5DD579D13D358C65A8BCF66AF8BFF9BBDA2F54E91A70E8D3705E9DB8F50DEB434F75E5C1D186CC9334DB60031FA0F0E749D72C2B2BCB2BDB603BD5009D1C54" + }, + { + "tcId": 2614, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42A162037181649F6D0B48F055AAD019", + "z": "9A1C261B7DBEC93C6B9CDD4C39BC2D1D727DDE07C7D2182F774677D5", + "l": 1024, + "algorithmId": "365852506FB0696A1D9FA6FEBC9426C5" + }, + "fixedInfoPartyU": { + "partyId": "114EE2FD0107E10CD89A6EC8071A2D25", + "ephemeralData": "D66B2DE393AEAA75C4D9A237FB085CC8B90B0636C6252547A7715098" + }, + "fixedInfoPartyV": { + "partyId": "679241F508DDF2ABD682B2AC7B596D9A" + }, + "dkm": "CF3A57FBABC921F7F839CF2F6B39E4CF035500DD632D11029694E98F85F9414FA2F0B54C9AD3309B03BAF8AFBBC1A0A23B13AA8F319FADB511DA6566E487F656FFD4D92F2FC0A2839FEB6536F24324FCA89FBDD2A77977460448DD0608BA34BC0E0917647CFD4008169E547717C45D64780F35CF2A6AAC9DE3D5BA1AA6B94C1C" + }, + { + "tcId": 2615, + "kdfParameter": { + "kdfType": "oneStep", + "t": "557FDEA9C8346883DFAE715DB53CA437", + "z": "F3F49CB3F3C2C58F76F3266AB37EE326306C010A0BC9727FA8591232", + "l": 1024, + "algorithmId": "C81885C84485E8A5A653505B777B6164" + }, + "fixedInfoPartyU": { + "partyId": "5CAB31DBC448702CB6113068C7FD8A1B", + "ephemeralData": "DDFA86C8D1F6C7A4047FEFD57EE3F565506DC609EA835E81E9A0B87D" + }, + "fixedInfoPartyV": { + "partyId": "695FDC7A2C990A54E335ED661A5E9A2F" + }, + "dkm": "0D6796BC3F6DDB84C4E0A5CB4D2671947CEF3DB2E2B407275DA7E51A8F6FCFBE21E9236D00FB07B809531D3AC20AC2D9CFDEDFC8D17E676904C561C00CC45206CF5664E483EDB5586B2F15659743D9AD3B0F2007857B7AAD68923536830BD91FEB95393F292CCC15A03F848F1B1B8846F9A1FA900970FD27D3BFBA9C3F7E95B6" + }, + { + "tcId": 2616, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6037D9EB3A01C89F8B67B5F150675C12", + "z": "44EDEDBCDE8DC828BA316E4C598F8ABFAEA52B7A2AF4295161318B94", + "l": 1024, + "algorithmId": "75F3F4D08EE71E7DE2A5700C8C792493" + }, + "fixedInfoPartyU": { + "partyId": "C5D63D68E82491C245FA86E7A3F76A6F", + "ephemeralData": "49BA974A8F39C702330FBBAF3C63A553FDCB377DA87CEEA73815CBB9" + }, + "fixedInfoPartyV": { + "partyId": "4F69FA7A7BC70BD72102CEC7F1EB5148" + }, + "dkm": "0A1E1D777373E4F38C4496BD1B251FE694FB47F0E7AF6DE5F528FF3E2F411C0C72061E93968CCE89F110BEE083799E728472379226B6AE8F243B3C0FF8C88226474084447E9855B811847E4456ACC1D705A8C065D3A23F7251CB96002F81C95A73ACE311946209E8A0977C49EA96AC6A27EF3B636E8001BC3EB264D92F9851B1" + }, + { + "tcId": 2617, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2E7E791CB270485A385A221E7377908", + "z": "84D86AEFA70881E51F86C6828C29383FD824039721ACE0A69D6F7516", + "l": 1024, + "algorithmId": "A0AEED94C53179321598563CBF7E98DF" + }, + "fixedInfoPartyU": { + "partyId": "2EA4F380B29003E391BD6E924B83CC2E" + }, + "fixedInfoPartyV": { + "partyId": "1B3497CC483996275CDBC4AC521A544C" + }, + "dkm": "45ADD2391A6854F9DD1704F241FBA00D277E83E760A2363EB3AC38E7498FDA9E758B9959AE317B61B77801D0591D3417E0E84D0D157F2DD15CFEC38E10E7A9F8D3ABF850F742C70154FF07BE20E64AFFF1E5E94B4E9E634A3204385FB156AD7B4A363CD53364C8EC2584C9498CB52299E9963E05FB397047EEE43A47E1C67331" + }, + { + "tcId": 2618, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85E891C65EA4D962BE67A227AAD3344F", + "z": "33980FC51B5D678BC7E03A192E290644FB96A05605D2AF6B6B7D092A", + "l": 1024, + "algorithmId": "85563C1C8894236EB596900CFACE2CBE" + }, + "fixedInfoPartyU": { + "partyId": "8653CD629F19EABF135E0F3BDDEE38EC" + }, + "fixedInfoPartyV": { + "partyId": "165BA661ABC3FA20B08B4576AF5B7A6B", + "ephemeralData": "9B141B2D62F276833C95590FD613BD6540202E6F15A835C0B8B21E19" + }, + "dkm": "C8D2A24C4A860042AFCB1DC95387CB237FC1FCF24D221ED53D3E5CEE9F27B5A9C4991FF5B60E26504F541BCCFFD5F5C37A09BF63312FE774D8AD7B5D09D456B1FA65A32D33F1DA225186894FF404630949AB990E6BD01E885D59716A4C764E70E132581436C49E44BCA08CC84B28EC69BE58F36E2A267905E03DD5D0231F16C6" + }, + { + "tcId": 2619, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99F63006710ED9342423BBAADDB79C60", + "z": "94347FC830DD783BA101E03CE03A9C48F53B5D6D819FD29A5AA8E8D2", + "l": 1024, + "algorithmId": "86B5394F877B12FA1D6FC96D69A3EBEC" + }, + "fixedInfoPartyU": { + "partyId": "4C7036FC8DEC5A9066B5E11CC917FEBB" + }, + "fixedInfoPartyV": { + "partyId": "9D1B92770A595D542F25342D9E98DB2E" + }, + "dkm": "784028FCE13204557B99EC1BA2EAE1A55042CD183E666BC427EC43F63AA6C3C8E6ACED3BF1D7AC47C431A1AF9AAAD3A141E444C0C68B85F115F0D3FC174F9BD1A8E35ED3330AB6DBAEC8702D08C38FE91370A712CC44EADFB5FB0667A642E446AF6FF4253F4F7BCC587525A796B33E9A576E3153F91E3E2A6FC0A84917213339" + }, + { + "tcId": 2620, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B069F7456E9BD3F4463E30CCE1BBAE7", + "z": "6727D4E9F51F94E157F7E5E65629EA36C4DF79C064EEE2034877DB9C", + "l": 1024, + "algorithmId": "020D44C3F4BAFB5EF1B8EC2467194CD8" + }, + "fixedInfoPartyU": { + "partyId": "930DB6CC04FEC4CCE7583FF4BE7D6103" + }, + "fixedInfoPartyV": { + "partyId": "BB2F5F82BC079AAEA88E709293550E9E" + }, + "dkm": "673BCC1DEDF893C961524F4DDCBB34C53B72CE949432C62AD1C164C399DD6336B28BF55F2DBD60F012134F574453015A474FD373F025796B23F1AF29D24EE1FD403FA0F2E453796ED33A0E3AC02DBDC00BC6B7927A6BCA31F2C0BE86DA366161D1D23E05E5DBCCDEA199667ECF4424C1E591138A38A7ADA3CE4833B115CD2230" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 109, + "testType": "VAL", + "tests": [ + { + "tcId": 2621, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9013769C74BF3F43F5A1EA36805EDE73", + "z": "177C4BB902537B71A29166D23D88DB28D7270090057FBD438F057F0F0D31C9", + "l": 1024, + "algorithmId": "2BD9B2A90AC0BE7FB4F10AF946481C5C" + }, + "fixedInfoPartyU": { + "partyId": "F411E4B7C21B4E6DACC9A477412FAA08" + }, + "fixedInfoPartyV": { + "partyId": "40F8D6032B949B8F382A403913999767", + "ephemeralData": "786A803509E808056ACF04E3B451E65F6A8CEACE4B83CFDC118360E6D1E5FC" + }, + "dkm": "301352A0D1F85655C3C158CCD1D9D84B2F15CB9DA66EC770DE17610C678A81FB25DB8911639E2274B6B041DEAE1B00EDD6B54E3123146D60A6CE8B503EEDB82E13CFCD8955BD39B2E75D7D4FB8F50D8A77054939E5815001E9F2636B24B7A6F0B400061E63AD655D736FC8D6F4B7B1A0FCDAED16E50314660A1E983CE56CE211" + }, + { + "tcId": 2622, + "kdfParameter": { + "kdfType": "oneStep", + "t": "873AB3F9F97BD4BC707C0F3161709DB4", + "z": "A0B93908A6BC13E8CCD8A01CA8510488A0B272599B5556E69BC34B35B40409", + "l": 1024, + "algorithmId": "94B90FEED18AA58F9810D2C962805FAC" + }, + "fixedInfoPartyU": { + "partyId": "982EB4A32791252C64CF849396026ADB" + }, + "fixedInfoPartyV": { + "partyId": "238882E21F06ED9F59D4437098BFA713", + "ephemeralData": "A34944C996F33D2E266B0656AFE1C577B4E917B821D116FC6A502D45D5E27F" + }, + "dkm": "37192D6AED4C635301D0BA142E3225EDA27FA5FD81AA9AD2781D69FBD47972E51EFC0C9397B1FFEC80733D3CC571F94F6EA313BD4469218686A2DE1C090D7040A6254ED69F9D0C7D16BD6D3064AFBEC400F9F9BA6570ED7D202986803DE5951E5EA871A6AD7BBFA27B44677073BA0E252F0A7A888E72D774C6C245BDA991EF7B" + }, + { + "tcId": 2623, + "kdfParameter": { + "kdfType": "oneStep", + "t": "640235D264AD06777C9BD29AA79BF6E3", + "z": "E8A68F241EEA840A3E9B42A83005678F9B3F2107033510C85E16831DB2D665", + "l": 1024, + "algorithmId": "CA43CA48CEE7E68FBA0A3D2A966720DC" + }, + "fixedInfoPartyU": { + "partyId": "5B94CF6497D298CD462518726882E35A", + "ephemeralData": "3AD904701062BE427729D79E23A84D6A3939F79898A797C9215A04CCFC1D6A" + }, + "fixedInfoPartyV": { + "partyId": "D6AD8D70DA9E6089551BA971B9E78FF0" + }, + "dkm": "FDE99131C0A354A2092EC3991FF844998A1B5928C79DBAB1003A345A9304FC6FCC2EF6327325D350903CF6911170286CAF2743489B904D9C77104C11CD5DE49B2B9FE331A333220843FEB8270009940601089DE337CA6A2258BD6AE9C18B9ABC739231D47EB40B490F2538280AF2F1C2E41C088A439F64A51322A1EE31A1CE88" + }, + { + "tcId": 2624, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BAEFC8AE150CA661EDBA45714952C588", + "z": "0C3DD80F17C297832E43BACC832CBC449B8EF7A4981BE26ADD3DDC3BAEF2DB", + "l": 1024, + "algorithmId": "E7473AB763FAE439BB52E5B678B052C8" + }, + "fixedInfoPartyU": { + "partyId": "F616AC5566E7E74A0A0B8BC4873FF571" + }, + "fixedInfoPartyV": { + "partyId": "A592CD261AA42AC4970022458259C80A" + }, + "dkm": "0E1C035B8D9DDA66E076BC57B3A52993E4B05C58E9AC5BD2B06197B13780749DA2882E120EF0F5303F871EC12E53A4F41C7D19BA510E820D53498BE05CE380C0C0D2DDA18D78C90CCBB13747CB4B5D4DFCCE10D5C9BDAA858030406217FFE100546F62744AD69D3D50B63895D4875AF379BF9A9505FC7DBB66AE22C31E60049A" + }, + { + "tcId": 2625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15BBAB2CC1D51D7CD792AF658A141A52", + "z": "1A541F7968F772081C68DBCDFB816F2274296E2771B838D6801F4341FDE347", + "l": 1024, + "algorithmId": "CC4818D5C88E965F19B6BBE147C83066" + }, + "fixedInfoPartyU": { + "partyId": "3E7D1D3BBCBBF83C2E0857716278DBB4", + "ephemeralData": "99039A9829234680A26ACC1F3ADC3DD8735D4AADA209250EC1984AB738DA41" + }, + "fixedInfoPartyV": { + "partyId": "F180654E4B53B7426934BC0A827DB120" + }, + "dkm": "AEA5E6EAC78E92E442B0611F68F9B4D1CC98EE413E6B180E0E6E38FDC9DE5CA9EA25B3052CE7E0E0F0D3267534E5FB01DC1CE2846246D29E068D4BD505CEA9F4952C37C8A1E226A3B842E80ECB715AD3DA2D95BAC05B37C713F54614E08B0930531B815D9292804CDF7B92731B6BF75837B7C2915E2DDAC88B8BFD58D273B034" + }, + { + "tcId": 2626, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E9464BF202656487AAB8BE1EAEC87C4", + "z": "AC6F51CCCB46337CC0D7D0DD5063A63FE79E8F9EAEAA2B6DB8CA6DD6C832EA", + "l": 1024, + "algorithmId": "7611EF99DD249BD76C90772213C0DF08" + }, + "fixedInfoPartyU": { + "partyId": "EA0CDC36BE7FCEF9083B2766F3B60773", + "ephemeralData": "A08918510F575A6B1880AAD9973BFEBB1CECFF26A24B72129DB6135C7AE76F" + }, + "fixedInfoPartyV": { + "partyId": "F9E298DBF3E01950604FF5695D215C27", + "ephemeralData": "D23C8CCAC047DBAEC6B28FDDCA7BABE8FA4CA7BB020FCFEEFE1074A1380362" + }, + "dkm": "09C6876613006CD42E71728638DDCC53F48CCA5A945D1CD79BA4015609261CD2D7F3DC449E459BC518E1852A619DE26E25F1C13BD7F20C6AB06FBD47B28E3C5CE5823B2CB0A195DBF3273D05A2C1B45C88B959162A678F17B20D8CD220D57D06F3505191D0ACA8F85C2F75D4FFB935C4F18B25C2402690E07CD86CB10E24DF0D" + }, + { + "tcId": 2627, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C151DA57643596F6051386C0D2738D0", + "z": "A6BC893AC2E6C16A6811601359666F07F218ED31380F63104B1DFB76E36D80", + "l": 1024, + "algorithmId": "352DA5777EBBF7054C33CD93324713A3" + }, + "fixedInfoPartyU": { + "partyId": "731F005DA917ECB23AB6C20AFE5FE2E8", + "ephemeralData": "6A0A674926A72CB944E81A8E4F5068A686115A14B478046EFC02C33F063C66" + }, + "fixedInfoPartyV": { + "partyId": "5825014A058F62E02467B54DD36B72A2", + "ephemeralData": "B7FAE38A2B6F2B01F1393DEFA2120EFA06B3DB1B124DF77D3CE5CFAFF50290" + }, + "dkm": "0F1BDED4BC2ECF86C28B7305EA9EA73057239410CE158280F6AC21461AE3EC92025FDBB30B6D1FD8463935A5FB15D3110FFB35F5BDB027A1124240740C550E8C61BFC2154066FA258616AD262464E86483CEB8C672455EA1205B92E19477A25D9F9B7C78A3A2AF8A161031668370D6319537D310895949BEE79F3D7ED3BED83B" + }, + { + "tcId": 2628, + "kdfParameter": { + "kdfType": "oneStep", + "t": "635CF74B62D08FE8764A396F498AE847", + "z": "F4724B621D74412A530499AD746054DD4D6287655DE052C1BBFC91862C80DA", + "l": 1024, + "algorithmId": "C6A0CFB01A79E57D3FD41CF105EB8C63" + }, + "fixedInfoPartyU": { + "partyId": "EEE4DB8EF6C82C4A341AA32F3F168886", + "ephemeralData": "4EC40ED080292C3A391E2271DDD7ECE07559DE1D44022DD6CAAF82EA0DF241" + }, + "fixedInfoPartyV": { + "partyId": "6C17D5A102694CD8030A64582098855D" + }, + "dkm": "CB48CF14E6B768677D6F138744C55D753EA49DD1C626BAD423E894A08CE2607A339626E7615E9495BC37D15080A793BE6B34B006919FA70DB0B3B8A2F8BA3CD23E821540A0D2C86F30AD5CC0C4C183AB0807DF10BE868C1ECFFA04EF76704007C4E5FB7DEBFF68C9EF71925657A8E3332F83B17F11EEE6AF7A705902EEB9B6F3" + }, + { + "tcId": 2629, + "kdfParameter": { + "kdfType": "oneStep", + "t": "913FBCE11ACC0E5747E5DEB7DD9ABA28", + "z": "DB7D6E74AB81CA6DBB5D56AD00319E2AB3AF0C5BEB7370A19BFB582D336269", + "l": 1024, + "algorithmId": "236A7CA1F00FEE20BD983B8302C9AF4B" + }, + "fixedInfoPartyU": { + "partyId": "3A8AF3436CF81E2DCA3D493F867DAF63", + "ephemeralData": "7977F05D8ED36660E174288EAC8797F2322750D663C6A70C3B92BCB07CA25B" + }, + "fixedInfoPartyV": { + "partyId": "DDF4D982977A421CA72B01CC19034740", + "ephemeralData": "875EDCAD4C8FE06CF1660E4C8F234C2F1BDD04E9491CC0E67FACDD6BAB79C5" + }, + "dkm": "8EF14CCC21BE93D12D5AA351162DD6B68D92518F9B534808ADB6DFF624F548701B7D1EB3ADE05D943081FC8A020B3807D0551EA0749760AC1AB3DD311B9D7A38E01DA74CE5AD0EBDC21377B02CD349B16FAF940D366210356CFDF53782714E01018340D2AA1ED30EE5854D02371B9733409B08D0AB567C2A46CC0E4CFF2338F7" + }, + { + "tcId": 2630, + "kdfParameter": { + "kdfType": "oneStep", + "t": "260E37BAD2456FE0DD866466B67AAAEC", + "z": "60BFA97E53E5A011C1CF5A7A6477CEAF784C04D1099594F1229C2DB61D6EB6", + "l": 1024, + "algorithmId": "1242C9E09009DDE41B92EEEE33C32676" + }, + "fixedInfoPartyU": { + "partyId": "D8B45BD12289874FE58CAB71DAE2CEAD" + }, + "fixedInfoPartyV": { + "partyId": "D448A34847150CADE6CB94D2430496F7" + }, + "dkm": "0E04CF273E6FE59EE250A708092C64DF6D11A9649EDC3CE9D4D5974B5E1A0CDAE58266D51CE56BA3859FFB1049187D28E1B2E026D0659DEFE4E318F259BAA29DBF42D171345B1000F4CB80B5815C84063E143BFA8A1110CE544BA4D6CAD35B63AA3002C26ADB7FEBE191E4832401D1F2CE9A4E51AF77167311D1D9CEBA01C822" + }, + { + "tcId": 2631, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD3F13C79464822FE3520FFF65F0262A", + "z": "296A1C4F77F307B8A331C0BD8FA2DAA1017C9F8EF5CD982C3E90E9A68AEAC6", + "l": 1024, + "algorithmId": "D5F0B41CB0E894CBF1FF81D2A6D75AC8" + }, + "fixedInfoPartyU": { + "partyId": "44C41A31CCC4E89AEB492A31E91B55B8" + }, + "fixedInfoPartyV": { + "partyId": "2D0FEE19F59ED146950C828425BAC381", + "ephemeralData": "F981F5AB58EB540ED23404B059CEC4AF439D7264FBD5F5B69077CF9284393D" + }, + "dkm": "14F491FE9A1AA83925D8212223E4DCD04C4895F80EF36086323860AA200270BDD97133ABB1AB6DC3FED288889B112D9437255D319808E843E8A8531F39DED5B089824564CC5CED7161ED71AD2CEEB7D6CA86AA7102D0F7A1EDABB93E49797F4D23C010203705C4CA840FF7BBE1AE5C03D87AC44490B121F64211CBC8560F9C67" + }, + { + "tcId": 2632, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86B6B4FF9EF4BA276D466677101DF0CB", + "z": "6CA82EA5D16B5EFE947EE0470E079897EF09EC281F0713C1475DBE82B62BF6", + "l": 1024, + "algorithmId": "422A0C2D3A3BC6D06C462260F8D9A565" + }, + "fixedInfoPartyU": { + "partyId": "811E4770FC5CA96E83A8560143B5101B", + "ephemeralData": "B72481849D9F84F041EEC53617039B6B92A28B5323B79777A56EA6F7065CCB" + }, + "fixedInfoPartyV": { + "partyId": "E32F849E6ACC0FA17574A1D2DAB3EA40", + "ephemeralData": "6BA283F826768D26C9C0C7D868E2FF72F521D00672161BDC584A0643D491CA" + }, + "dkm": "1FCF83E2C66050068C8E3D34FFE6901D7B348D8C2BA292443A6130C6FBBE4C60E721837870D38BB9D3417F6F5E08A340F6096D7D91D8D738C3C234B26EC656585B33B8C5A436DDE74EFD656B8F72708509745B9CA5E296E1E699137F5EF3AEF040D847687215331ADEC76CE8FD056F5B2440996F75FC9087465F4AE02A329EBF" + }, + { + "tcId": 2633, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E7ECAD7D3146DC24A2C27D01A522052", + "z": "3FA739ECD7C48546AFD112754F7DBB909BCA9E8C933934B5A438873D24E9D0", + "l": 1024, + "algorithmId": "263818CDB94E0BF5167A4E599A0FB26D" + }, + "fixedInfoPartyU": { + "partyId": "ACA09496E69C7B199EFBF4E4E92F8D2B", + "ephemeralData": "B119EB75F936DFC09CB7E16EFE67FA8C7BB760C3B8DE39FF0C097A591784D1" + }, + "fixedInfoPartyV": { + "partyId": "B9DB4316AAE92284B1E58FB51BDF17E4" + }, + "dkm": "31EF85CF11B50D3A3237738CC4A100083D5B128919D2160272F4A42D02A2C2FCB05B1E1F2186D1022C2FD19253580AE4B12138C1937205ABBFCE8BB9402F9FCDF1BD760854FE776196D04E2BF034D126553407DAC988A21E0216D18DE0D5BC54CB0903A833518340B3B0CDA39414EC4E7E5B391654BDA0B860A2B2834F7EF925" + }, + { + "tcId": 2634, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12252B28A56776C7475378D5C93C2F78", + "z": "9373381785A5D03347BF6236F0F27C35160F633ECB62868236A7B6CB584EA2", + "l": 1024, + "algorithmId": "25B60E162EB11E62BB199F8D4CEC24AC" + }, + "fixedInfoPartyU": { + "partyId": "E315AD7242BAF9D16FEBB5C88C9EF836" + }, + "fixedInfoPartyV": { + "partyId": "134A1E2211FB2506E2B0EF3A35293160" + }, + "dkm": "7B0BC8F9BFB9366132078C11A4F4E8E4BEF7ECAE7A7F049F06F9C44163B4688F48A5CE08ADA1538013A683C0BC8023581D8933E51C3B46AE045ED341D59DDADDA241E782C5CD283EF6863CD08A47FC5AB75E5A60EA6A98B87EBDF0ADB4824F9532FDB00FD398B922116679C44F62013C1B27228BF55E9E0D6BD14235421850B1" + }, + { + "tcId": 2635, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5BE5532F5B2C1953040AECEFC09B8CCE", + "z": "1245BC1A917B4486E022019CC0E25BC9560A2B7C0BACABFCB3EC7D61A0B8E9", + "l": 1024, + "algorithmId": "0462E2FE8FE3534142A1E933E4804F72" + }, + "fixedInfoPartyU": { + "partyId": "D98EE043149FD8E287014146A5886DED" + }, + "fixedInfoPartyV": { + "partyId": "663F985A011C1AD7C75948934C0063C3", + "ephemeralData": "408786E4276EDD2F255AC645595749A2B6A69D0E62C3DD5B59870F65A20E1E" + }, + "dkm": "056093F299A0B3694E140C7F7838B8F029763425903BC0F681780DDBA188A4AB12D55C3C206B5FD70FA64C393B43515D08741881B4E6855E80B16B303192B64F7AFA3587777B710C41B5AEEE1898E763B58054C0AB40176CCF50A063350BBCF077A1C44AD6283540F288F8FE2537B6D119EE587C06E44C19DE5D03859135AD16" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 110, + "testType": "VAL", + "tests": [ + { + "tcId": 2636, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C3BF50BDC8D7B988E8C737C419F33A2", + "z": "117270441490A9F9294760513236B08B42CDAB7A15DFE6170CA9A949", + "l": 1024, + "algorithmId": "7585779506F6550C267ACB8C0BFED188" + }, + "fixedInfoPartyU": { + "partyId": "D1C68954BB5D78CDECBC7A1A161A9E3E" + }, + "fixedInfoPartyV": { + "partyId": "73A7C79418A08211ADAB8B5A44E80249" + }, + "dkm": "0A5D3854344EB181B8DA377CC0EA6FC39172589DF9E26A79891EAA2E62A76DA95E027A752EA0CF4FD5246E0E7D08513B377D07D344A1CD63639A4A109A6F0578E061BDB12E573E5C7B5DF6ED8B7057D8BB3083DF020DD1A7B3BA1D6749AD8B4B0A7DB577B5A1D773E30E8B61D32DC4777CF2B000E400243E23119D4BD47F6B4E" + }, + { + "tcId": 2637, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8408B19CDE5BA9DA0E61E1A1F1658208", + "z": "A3A20C5EEC49002430BC071D6DB510486CEDC8D1391B690F85ED8B66", + "l": 1024, + "algorithmId": "9B68707D3D6E1C19E3B7434C7C1AC0CD" + }, + "fixedInfoPartyU": { + "partyId": "D91F2B679F8BE382F2D6E9146846D8E7" + }, + "fixedInfoPartyV": { + "partyId": "C7032601416660D8F495C1EDF3CAC5F5", + "ephemeralData": "70893C73B117FAB0D74769F870E0F8C81D7C39EBC33A5F578481F851" + }, + "dkm": "6A6DF59D91B860F24FCD4F87D02CA537E7A9C9F59F51DF1C1A3C7B12AE9746F2AB720AFE4BF8CC0C9FA5C48963C8BDA8C0957D9559086E747D7AC7AC771A1A4DF54AADC1201EE145909B3137984F597FC6D95069E2B262F27E1EB1F199BD8DFC26A7A16784F5D0FCBDB79C47091FE3414C871DAFEDE15A861108E43E3346BDD8" + }, + { + "tcId": 2638, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E84EA6B199B1B28217AB010122397C6", + "z": "8E7263F07786BF4FA7FDA124F572E01DF9E054E4C94BF013DFF7A053", + "l": 1024, + "algorithmId": "DB393BBB8AFCA1381D7605AA9B856A27" + }, + "fixedInfoPartyU": { + "partyId": "BB2E5A4CD5C859431B376E1D4EB15C6A", + "ephemeralData": "D8CAB157A9AFDC92A2875FBD7DAFEE801A933EDCECCAF5A6A8480480" + }, + "fixedInfoPartyV": { + "partyId": "2F4061E767C3E5295F6FA7CA91F55B27", + "ephemeralData": "9BD753507FD84F014881C4F12BF4519F54A43C18A6FA8E58196AC301" + }, + "dkm": "2164029651F8095C5A76A1335CBCED01849F209688BCD3DA40E10377603BAD3D3EE5D30017FE81EAFBADA7A6C7C926950BA9AF90353920364FB2AA5543BB6F8615F8E96CB7E9FA24F4035A0F2F0829CE429892CAD79D22FFF703D4C991CC5130156FDE8271D7B3E73752FA1C05A46E8A52A6D48326DCF72F0C512E05F04834CC" + }, + { + "tcId": 2639, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0462C605F18126041666A4E1D01439D5", + "z": "ACC753013E09A72E6958487A8FA9D2C4A33DD1C53049696803661849", + "l": 1024, + "algorithmId": "442F4AEBFD5470D9742DAC0EFF4EB2CF" + }, + "fixedInfoPartyU": { + "partyId": "9BE299DDA108A51C839D4F0D126F3C2A", + "ephemeralData": "C15EDD6851910D60D6B24F7439043E033AD66A6FB63BED873A15344B" + }, + "fixedInfoPartyV": { + "partyId": "E59E5C344EA3ACE50300F992A700166E" + }, + "dkm": "F67DE255FDB61E400DD9DC43D7FE75972B177838C217B92494AC464A1F3B3A6CD8774B4978F8E295FA7B00AC1F6EC058E18B990C4F9A7E9AD26837618623BCBAC9B26FDCCD0168BC855907E57EC48FBC4020D5AD697BCABFACD987751BF067C28C43AD80BBE3282A5163B9360287999D02A8B1E5D5926C59CD793701B521B693" + }, + { + "tcId": 2640, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51D703A9DD80818DBFC32BFE6A4A1C06", + "z": "D679DF7B8731564D1B2039D37E363C88C199B82F88DDDEBA23B28876", + "l": 1024, + "algorithmId": "DCE67A1A7959320A1373F557079F3EB3" + }, + "fixedInfoPartyU": { + "partyId": "453AC13F2821C2C89103075B07699574", + "ephemeralData": "1710B5A4398166924F99140664DAA72A562004BBE37009024A503602" + }, + "fixedInfoPartyV": { + "partyId": "029F23F98B728B28A979F5EB1B8BDBF7", + "ephemeralData": "A27B3B302E346B0479DFEB58F84CA616B49BFEF6A0AD38C3471A9E3A" + }, + "dkm": "066E6F37FE1D816AEB0AA31521C3327C9A780F2C5466B2A4211A6332C8F4A62F1097220B105A1B49C054C5D20C64C904CFB04A8DCD6F9F11D2D08866EB7DFEB37B1111A8B1EB79FBEC4C8858887DFD16C47583B7C4A1F194FB8D7FC693F7F788B81641E1CE1944A3A300954BC58D1A9F0DEF26AE433B3D94A7FDC86C2DB7C77C" + }, + { + "tcId": 2641, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE7329FEFB7C5047C4907D892CA5AB8E", + "z": "14C27E332A3952312667BA18C9F970D1C1B442D0C453EC5CF2A54BCA", + "l": 1024, + "algorithmId": "B63B90402165E18C064CAF030B7C0FBE" + }, + "fixedInfoPartyU": { + "partyId": "DC90A8B1386DA1CC0B56876D63075033" + }, + "fixedInfoPartyV": { + "partyId": "91911A828E41C4EF2FDC17E0809D50C5" + }, + "dkm": "7612AF925A76FC6A4204761392F85013400F9C851A3B5536D449A3DADA1E7882BDEBBD74774873098954C502DF0C644DBDFB7238A1F6E0B30BC8B3A485B9A3CD41A7A0CD882F3E0288815FA72AFF3A9856F94A4AE31C4DDCB29D5ABCA26333309EBE642877E0A1210C7B4345410F2BE195132BA92F0D871A40134223B455409D" + }, + { + "tcId": 2642, + "kdfParameter": { + "kdfType": "oneStep", + "t": "21162BEA65D1308137A587D8C1940D4B", + "z": "928BB3DFE6D42F14004D0FAB35C8B7D4E17E4A35800F9A7C7C94EB17", + "l": 1024, + "algorithmId": "322BE33B4BA5E8062AB5C6C20DEA856E" + }, + "fixedInfoPartyU": { + "partyId": "8E8C13FEB0B6AF4E503483D2DB4050F5" + }, + "fixedInfoPartyV": { + "partyId": "0EC99DAD17E70D15DDDABA9B67C963C4" + }, + "dkm": "EE1B2C972F18AC6702699DBB025948201F95E86C8E332F6DB9D61846A88B5187938B5EBE896256D8FCE34C562E7054A3FE59636E2C33EC846AA7AFB315552C1DC6F82FE9D577DF8BB84000D6544999C67B3DDB178AECDB0B5C0CEF433700EFFFD9C3329CB6AAD2DF3031048AFA8D24AE4E7243756AF76CB6FFAD4DB36E129E2C" + }, + { + "tcId": 2643, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C574803686EE4EEFC1FAA896B248BA49", + "z": "9F1A7A7BA7E4555ED2140675EB3D2931842E4489C45DC67516C3658A", + "l": 1024, + "algorithmId": "943DB93A2A42486D0821D2ED0A3C764F" + }, + "fixedInfoPartyU": { + "partyId": "5128835C831F27F6D4A07CD3ECD19BE4", + "ephemeralData": "E64DF56888B4B14272EEE0BEABFA9A1B813466A26B30110310C69076" + }, + "fixedInfoPartyV": { + "partyId": "163080A08AE08E54EA052E922CDB7591", + "ephemeralData": "FF2F561094EDEE078A2DDA49C30EA73DDBC537DE3AA29DD8248CDA53" + }, + "dkm": "EB91A0B827384CBDD501FED88AFC43691FAE064692B92C9F90DF756944A76AB912AF2C410D48E9F8DA0CE07089A40266D090AEF132ACC063111FC7113A4D09D8BC7236CB53C9CA17B4D99252010F130A9A6D1941061F8ED6A02D85BC8C5C9D628349FE4A4986BA88FF732D35557A8D9ED0F20AA37DF79844A1E637456FEDA7A6" + }, + { + "tcId": 2644, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEDBD7E3A0D7FC554A1343068498DB98", + "z": "D99F220D7AFCA2E25D0D81C6132FC7833FFFB01377CCA486F2766C21", + "l": 1024, + "algorithmId": "9A9E788DCCF18B3E8BE0BBD6F56C21BE" + }, + "fixedInfoPartyU": { + "partyId": "5570200EF313AC0120AAF2B066A740E3" + }, + "fixedInfoPartyV": { + "partyId": "0564E4FC707F1C7EC961DAC4CD8DC7D4" + }, + "dkm": "0853D479F3A515C8DFB0F5BCB437C0D910423B92E439B8A86450F7A62F0F2FF6A1D3F775BBB190F449B4F2B29D10DCC20CCE4A2ED82841ABD60AD2D6C1C325897555EFBDED7F33285D9323835B8FDF03D289377281ABEB6E8F633F918F8B4689E4FC083CF7E8212058A94D21C3021C40ACEFAA93E9E712E98098347B3089CA01" + }, + { + "tcId": 2645, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C8611EFA0DBE2E96F759C606F068777", + "z": "0109FEE4A4507745A81DCD2A32B88D10325A8BBB3E50660101A9536C", + "l": 1024, + "algorithmId": "9B3621FBCE7055E1EDDA17E3F36E5940" + }, + "fixedInfoPartyU": { + "partyId": "D4B3C83710993478A76103CED0FD3A3B" + }, + "fixedInfoPartyV": { + "partyId": "5C021D0503F426DDF32175A92A5C5E43" + }, + "dkm": "73B4256C0B0C0728AF41C907E1ED1858EA63A36B2D89038958AE0C8352474CC90794A96EC05C382E5E4789C398E826BF1008962A8C062388983889DEED65745937FE7C7F4E500B291530564A41C33701C9BD23000950ADD274BBE8F4D9040CEA32050285731040DFE507A70AB2AEED9AB28CEF0770CB710DAA61A0EC3B39A89C" + }, + { + "tcId": 2646, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7303398E2BDE116B281EF6011172AF84", + "z": "B7F50B276D87BCDA3538D97215C2FCBCA64A6D717B456F33AD768085", + "l": 1024, + "algorithmId": "D80F1505BD29A298BCC75DC860334664" + }, + "fixedInfoPartyU": { + "partyId": "94A0F66A14A4619E8437B69E5E2E9B7E" + }, + "fixedInfoPartyV": { + "partyId": "7A288508F8C999CD01B5B9C84E6E6B78" + }, + "dkm": "C0C0DCDB01663F57BB62D876B90C7E95308E0626DC6DFF2ED24FA8E4B12E7895DDA8CAB3C35FF40FAE6C792A1B4D27F320E280A2798281366661A2BCBA42CEA6EDE8E7B45EEF871D12E8653B7EBE1ADCF143B09685A1727B27EFF038F780A990E39F3AD2311CABB79F343205A76A333811AB30D43C34B5537EB734881DF11273" + }, + { + "tcId": 2647, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F75EA67B9324B9E380B8E96807C11FED", + "z": "299DCE826988B17792515F1927E28819006280F1E7B990DC455EB14B", + "l": 1024, + "algorithmId": "45FEFFEDC903EF7A5E9EA3E2814E3A52" + }, + "fixedInfoPartyU": { + "partyId": "E715D9665C68B9A03B7E0B90D3E20A7F" + }, + "fixedInfoPartyV": { + "partyId": "F30EC3F5299A80CC551B79FCD65B66B8" + }, + "dkm": "8CD13B197010543F121932FB170B222744D9ED1D3932D813786A9DC5AD33305F4E4C7518938A085BCC5D37DFC537D110F02C6DF7587502AA1DF863EF65F2FBB9122D8F638BC55F716C2909DCB17611FEBBB2F05ADAEF5CA779478EF9D038F5C812D9B54EB317D6691264D5D975EB78269D85ED9FDA181C494B84F37D006703D7" + }, + { + "tcId": 2648, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57BE7F0CFF0335E8B20E8750C4117FC4", + "z": "7E393CFC604984047B0B3FCFA704D4F9510F9DFFDE542DC2994071C1", + "l": 1024, + "algorithmId": "E6BFA20D2E3130C999A78BB321EF0AE7" + }, + "fixedInfoPartyU": { + "partyId": "B3C5322A972426619C6DDA72498CA888", + "ephemeralData": "1BA94568671FDFC5105656D6F3859DE0283D524374CD2F5B3013B9BD" + }, + "fixedInfoPartyV": { + "partyId": "872ED5BF792C4E25833FE896BED15073" + }, + "dkm": "CECF9EC348D546586BCD32D6F947190D65ED712DDFAEBAEDFF8BE1A0BB0D7876006D7C7A2E93217C8B64A46FBACE4B61E602B8BF74FBC8330E245BA73B2D6E4315E19B6FEE6D170FE6FCC389537B49CBA5A128E2A5BB42ED21E81C691DEB4AD8D1C8D6B2B377D8954ABC391345384CAB9FAE031A49BEDA17A11A830BBEE4CCDE" + }, + { + "tcId": 2649, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41E29353FA54A46AAA0F52E278AF87BB", + "z": "F65828CC7A66D171B0E3BE34D76F8859CEC78B959BDFF024C4AFF94F", + "l": 1024, + "algorithmId": "71C1253C5FFCBDA592C63C9BC2D3DCCC" + }, + "fixedInfoPartyU": { + "partyId": "56E213A8CA4CFD764210BADB113ECCE8", + "ephemeralData": "7237612C779EF2B54DC9B3E898FBF735937DCF31B094C57C35E15141" + }, + "fixedInfoPartyV": { + "partyId": "EAA961A9066BC176D78BEF0FEE5E0818" + }, + "dkm": "0ACBA2786C567545667652587D58AE3D11F5BBDD8C2EAECE0024E06839747C6BDA3BC09C22E8C41BDD7865561550A2828B197ED0A583FC85C1A816DB99D3A105AFB6B9193871BFFA9DA8BE94FFC4E970FA366973AD0E745BF0BAEDA71716D5323FA572A5E12635E4330B4ACCCE6F1B1C363252B41F8A4882B279829F8A4C4146" + }, + { + "tcId": 2650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E94463C0EC4536600D50F5BBA5555D2", + "z": "06086CAF4162175E1C125EE877845260C9395FD9AA71EF466638C3B1", + "l": 1024, + "algorithmId": "0CBBC54035F0C80BDE371A5A6F6C8450" + }, + "fixedInfoPartyU": { + "partyId": "FCE1ABE4E3C6558D7C847233C4A22956", + "ephemeralData": "9793EA08CEED9574BCAF536BE6D9B7F7609A207834DE254CCF149F0B" + }, + "fixedInfoPartyV": { + "partyId": "52BB90C4030A37F4CCA36B6635B3382E", + "ephemeralData": "4834F20D138BFA646D4005469161C746B275613F315778FCEC9E961B" + }, + "dkm": "89CBFD9D180B0B53DA618D9BBDC788D8ECBA7084BEE8C0152C41C25319BDF5A88F70D48A8586F218BB8A2CEB6480D00A8FEB3BAA0E004BAA4881D70FE44B164901902D1DACE37F717AAAFC294FA4EB5D00FF5B1DBB431244F1CB82CB8DF5617EB8784D99271B086CFAFEADB6A4DB2CB211EF6FADF93468ECA9A99BA5777B6574" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-224" + } + }, + { + "tgId": 111, + "testType": "VAL", + "tests": [ + { + "tcId": 2651, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8113F8ED64638B03A657C7D2E7170E40", + "z": "C82DB0B9127C1B7A9B2D483F0153F63A155154218702F3911F3D44750CD7A26D", + "l": 1024, + "algorithmId": "F6B3F239D8B9C2C01A151D9E80C1D263" + }, + "fixedInfoPartyU": { + "partyId": "AF85CFC5DF55F7D0FB80A71A966A37AE", + "ephemeralData": "95AAD64DF34731587693FABBEAE9D839C5E1662AC85A913B75244212A4F6294D" + }, + "fixedInfoPartyV": { + "partyId": "91A5332515DF2145F59C2437876BD9CD" + }, + "dkm": "E631C2818309AA4B2FC1333D8B10871D378C306137D9A2EAA1DCDBD61B7E040BC806D7B7C58AA9A93146E548B471612362523735A8B59B7B71DDF78E381B3D07BA77281EA44879910F496F83E88D86FA8AB2654D2980B166D83BAC305C57BC74469DD3A12D0EE1ACF62A6B8958397F58DDDB0DFFC7AD8302694D2DC4969E80CA" + }, + { + "tcId": 2652, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2957FCA7C9EF4D44B1D4905213D1682", + "z": "9655570C06D721EF86392C773ADE1061AFFD5B356DEA0704B4F09C24DA996D7D", + "l": 1024, + "algorithmId": "C292922785B1DD161FD3ABFAAB6D0DD0" + }, + "fixedInfoPartyU": { + "partyId": "7816B05FFD1D8826E59EB7F9B9080F47" + }, + "fixedInfoPartyV": { + "partyId": "B2ACA8E9C502EB1234502A5AA1B91AEF" + }, + "dkm": "F2B4FCE46488011060BFE56FD104695C092301663272D2731294D1AF1D93820D19ACAD22331FEDD54A98EABA8084B28DA5F9DC07F2DA7A593DE60B5CADB51B72639F071957311A55026DBA2A807CA36F2F7E6C33BD35039439DC7CC448944FE54AC0726D259F6E0F6EF7B338F4C706CB090CD8684B565C801C4CDDA17966C049" + }, + { + "tcId": 2653, + "kdfParameter": { + "kdfType": "oneStep", + "t": "20E6E3592D4E91D260FC1080E89EE495", + "z": "AE89894BE7132241E83393552FD186C4E6A700FE38B3105726AB6E19645F5E73", + "l": 1024, + "algorithmId": "8AA614859B336BBB0DC4F1497EB40FE4" + }, + "fixedInfoPartyU": { + "partyId": "FE59EB4B1F4C9CD6B779841198F01285", + "ephemeralData": "F92888E62F262E0D44C1C8C5E4F58BEDAC045E5633BD0E2FE62E5EE21E9BE774" + }, + "fixedInfoPartyV": { + "partyId": "3D7F83BB75E1B1C1B3A3B918AF2F84AC" + }, + "dkm": "2B72296D3CA04E6D043144812D4648D1E84F36B1975B4916EBCFEF089119D4043FA81FF418E80958EFA962B9B25D6007C5B0A3E1691C432F2303615A1056061E3DAAE587A58313AD15E1971A9920AE178C36DD7029B94D35AE5BA6F90EC189DE15D7742687CC19F0767ED8B6F4D9677B965037C749C480F394A09D1641533C67" + }, + { + "tcId": 2654, + "kdfParameter": { + "kdfType": "oneStep", + "t": "30A6F7F0F78F7ED408D636BD3A9C737E", + "z": "EF23608DEF99DAABF5AC6949C73F9ECC2BF8AB026E2BD959127FBBCA519603E4", + "l": 1024, + "algorithmId": "75A9B2688A7102E614571D6E6DE2812B" + }, + "fixedInfoPartyU": { + "partyId": "2805670BE3E089F4C2AA571B65A5405C", + "ephemeralData": "D443E9C889C0D27CF3740F9305C1123BB5F9848F22F0A6A1567AE6DEB7522A64" + }, + "fixedInfoPartyV": { + "partyId": "0465A0BAB17A0E2A597D37D135286970" + }, + "dkm": "DA30F2FB91EAFEE1D69F6108136EE032894D95379EBD751D54F7D807DFDD2B10ADED9E97B2C5BEE6CEDD169027FC31D07CB4ED7F66BD0E066B53A2CAAF21F98D9B8BC27FA0DD7B226D3593BDF51E14EB5400753846325154FFA701F648C96F09DEC838DE0C07529F5F3FD574FCF582144AFAE89E24061C93271E023F8E19EF57" + }, + { + "tcId": 2655, + "kdfParameter": { + "kdfType": "oneStep", + "t": "503391DB272D3734241EF7549744EF2A", + "z": "5AE2B5A61051C8A64AE52E455D43A05348F6F313B9C6BCCB07DFE9CF654AA7F1", + "l": 1024, + "algorithmId": "2E55AFD140D99EEBBEDDD34786EDC541" + }, + "fixedInfoPartyU": { + "partyId": "4111653197CB3C10405EF065294F896A" + }, + "fixedInfoPartyV": { + "partyId": "DA1561CF9807BEFFC2C20AD54E3BD3E4" + }, + "dkm": "DD77C5250B232B1EE68C7A3AFB7C28D807F46E16FB3B2763A799A1882CD815BAAD690D04AD05A15982C427E2439ED449A84510456903D3DE228BB6F9843D723BE1FB0F5A49120519ABA5CE998582016A3CB49CC90928500EB921B27489EC1C9611FA20FDABF7230C3CC4511E2FA23529AD1B7B95D7F940FBB88726B0DA358B00" + }, + { + "tcId": 2656, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB9A45EB2C0AA55B3CF981757917B243", + "z": "9694182D5EE934EB1E2513ED039970F310A60419D4F4340A17F44E9C42939769", + "l": 1024, + "algorithmId": "872FDA70232B95DB7F4437034470E5A0" + }, + "fixedInfoPartyU": { + "partyId": "5622248D406F00BDF4EAEC46D8B92FFB", + "ephemeralData": "11C691E5A4EC45A48506C9CD4BE9D85EA0F2E9966568577571560E96AB7A39F9" + }, + "fixedInfoPartyV": { + "partyId": "16278F8295D166632165EA19DF345F92", + "ephemeralData": "1E150271F867E8C873738612B537D25690E38CB1215006F4322F310A384B2EA0" + }, + "dkm": "0839B610F4584B49F032967B909BB7E18155BF2DBE0231B4E42F3ECA782512A46C311943B523FCFB1391D663BE6C1EB318F678DFE80E4AD7DC31A8200DA30965160F894C96B70FCA1EB63628D7EA2E7DC1D902639927D8DEE9C0FB9533DFB6071533BC575AA96438ACA1689DDD2B619F9BE1E62BE707BE0C21FB98AD43E5D7BB" + }, + { + "tcId": 2657, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05EC0097D8A53C54734B2D43AE5929FD", + "z": "83CC54DC8EA476F7BA8D95E684BA24EF85DBA8649C6595F4BECCEB5CEBED31D4", + "l": 1024, + "algorithmId": "A07BA8D809E81783632C82CBF8EA42E7" + }, + "fixedInfoPartyU": { + "partyId": "AC0FAFC8ADBA9A5D114390BAA635E22A", + "ephemeralData": "6747F1DFDB4B26A8E05ECA35738171E2C9A0E23E47E6F433A43E1F684573E920" + }, + "fixedInfoPartyV": { + "partyId": "B81ECA5D9C8601F7C3C13D586BBC2DF7" + }, + "dkm": "C5D485E88E6219EBA8D47AA665D498B3E88E5958D6D8594B346505E9F1F9E51EF3D65BEE91765A00B086BE24AF065C654132986694F59528A1D602BF7AD7D401864AB7560E2DFA602CC172B7DB060BA438F605F871C93315623FCC6C26910308BCE6ADCC07D510459A4D16F7B33CECAF0C06C0855D8B9D888CCAC472E304F66E" + }, + { + "tcId": 2658, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6419E49B516BE0366EC92FC76E74B2B", + "z": "AAF746CABF6CF8DD40690975D1D8D4392FAB9E954CDEE52484D6CE7D57B0CDC9", + "l": 1024, + "algorithmId": "DB9B2B5CEDE5444941FCE17E6F5EC9D3" + }, + "fixedInfoPartyU": { + "partyId": "64D19FB4175263755C5E437B8E232E03" + }, + "fixedInfoPartyV": { + "partyId": "EDDDB91662857A6F64C0416FC6747BE6", + "ephemeralData": "75A95EFAD9C80B2962EC93E483CAE4AD07263D8C51B6125C7B76F6B41C7B6749" + }, + "dkm": "0F9E5BC089C70A7B8CA2AF9B58319A181A5176B6B70D14625EF6371199D37935933D7276EE1CDC5C8B1D0477371D573D205BD9F8E691C84C194380E0FB6B87EA43118B8FB3876A8479BCCF8111040ACD562A8412FE34E8A689BE585A5814B2F052AE8E3DF2D896B07F8A8ED1AAA2816BD71014B8A85382EFEF1CBEDCCCDB0EC4" + }, + { + "tcId": 2659, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B8417850776A79EB57615A1F8FA37E8", + "z": "DEC1FCB7979A971FCDC89150BA75202C2C2E9EF91D8DB2167D61094BF649371F", + "l": 1024, + "algorithmId": "7145E2520439B1F647042E3E394C95E3" + }, + "fixedInfoPartyU": { + "partyId": "00BB5988EEE27DD6DE254E981AE4CD2D" + }, + "fixedInfoPartyV": { + "partyId": "F019C5CA6FB4D77B6E8E1ACAA264DB4A" + }, + "dkm": "ADB94C5648DE30EBFA3BDF69918BE085A5DDD150204FEECE03A6CCC75EB6115E52F62BCCED2B7DFFA2CE7ED7E88D7BB437C1A5900E6320D2C1CAD6AFF4FED450B2397AB94BF299A8C8340760D40C7BACDE1B2AE2F0269F6F9D1C885939CA159ED985B78BAA18CE7255002E7C5CCD66997AE4B2B14EC2DAC8AC1FB658A556A032" + }, + { + "tcId": 2660, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADCC5FBD2B9695A50326DD57C807B29A", + "z": "AC5D4EAD759A1E12DCB8FFD7EBC9FB0D9BFBA82C2EE3B685C9650B7D339E374F", + "l": 1024, + "algorithmId": "91F8A16EF718140B1A7A440B402139BA" + }, + "fixedInfoPartyU": { + "partyId": "FDD6F8FAA0423E4D8F13C50237A76B47", + "ephemeralData": "471AE217BC999D39E74898C400C1E63658371BEF705F20C27F4FD5E195C11EFB" + }, + "fixedInfoPartyV": { + "partyId": "235E1EB4A440B8579666169B30B2DB9D", + "ephemeralData": "3F1A32A3570CA82A7F20BC066813D31806DF68933C435CDAD563D5FC1512C347" + }, + "dkm": "2631FE62EBE582B477EFAA120DFD05C93905FB955E472D6E584F54AFB5629A239D0D8FC4FB0E1C866C4EF2E43BD2F936F07F486F8B955356BCE0C6CA549FCB307110F8BFAE51A1E731FE87B806B9672EBE532C0CF4581A60394E16C907A618D21C901094BD838D798BB4471E500FA198F7A43ED501C062D36DDBED7CB1F69010" + }, + { + "tcId": 2661, + "kdfParameter": { + "kdfType": "oneStep", + "t": "408850234C650EB9C335ED4EA6D43DA9", + "z": "FB529F367D5E76A3265ADA14DC57BCBCA54BBBAE9CF97E22E21450B47852D745", + "l": 1024, + "algorithmId": "61BC150B67D0A54C75EC9C8B1839D913" + }, + "fixedInfoPartyU": { + "partyId": "FD1498F3D083F22859AD44C23421901C" + }, + "fixedInfoPartyV": { + "partyId": "2B83AB97F13DD42C7C6B2BACF96690BF" + }, + "dkm": "B134F6B6F6AE054BC0520C2764A05F1BD687417F5883CAC9D87071A7F34A79D736BB83CFD7E5284E40D50ED69271E34DF10B00320E4D533E59F6A7FC30AF0BB564E9F97FD88F1AF0D6A862B5750028736D91550FB161E4833C16F1CA814EDC3B211FDBDBA3730C9DB2C2699D609A352AEDC0DFAD37A59626083ACE8B8DC0B22F" + }, + { + "tcId": 2662, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39C028EA1A055BB241928AB11955F3F4", + "z": "868562DF4657FA0D615C39296A9FDB0389B2D936711B258E63892645FB37FDEA", + "l": 1024, + "algorithmId": "92F75599827D17AE707DE4A10A3B9FEB" + }, + "fixedInfoPartyU": { + "partyId": "D90A216E8B8AF169CE4DFB1D9B984356" + }, + "fixedInfoPartyV": { + "partyId": "A02B8442CF4AEED5A0B10F56880F167B" + }, + "dkm": "28FD8E4A7947DF2FA721E905B2BE97435E5E65630C9C5CB909A31738B2903587FD38CE97916E4289EBFEE3C407A82667BDB28D16A32B1E29E9D532245D70A6F45D20CCB6FA0C5ECDDA9D29FE5D691C31BB3687195D54F353D2A87E50638B8E23142D0C9213BB902ED934F202313F72B71E063D8FA2DC0EB50CBB427F0CDF4A6B" + }, + { + "tcId": 2663, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C0E51EE43E7566099F7DB51F54465B33", + "z": "2DCDE04A24D4EE22FFD92CAF50241622FD26A594860D1DA4EFB8C0E4C446DC73", + "l": 1024, + "algorithmId": "D43111AC8E6F2A4CB11FC08BDD8D9FB5" + }, + "fixedInfoPartyU": { + "partyId": "630AF6A702AF56A273F06CCAD01BAE45", + "ephemeralData": "E32B57D77D58ADB125B532568AE640E04FC4A593ECF5A14702471194F9CD1C78" + }, + "fixedInfoPartyV": { + "partyId": "B10F87FACB83CDD49DB033FFC4D1E570", + "ephemeralData": "9D2A2BEAAF88B54890AC4FFFD3AE7B1276EF2BC9B8E748A76646E9D924B6C7B2" + }, + "dkm": "61213D2A4A6AFC19F5B1999F7BDB810FB6EFB9A75CEDCA6D5F5A54DAF401670161D94DF04AD1992AB963744A8AE4C00AC1D0455A8F095C8AC91F347BC523BD69FC326B8E31F58DF8FFD778DF3A435D9DDF3E87C8BDA583E684EFDA5E0D3D55588865B9708482DEA1FE57C481A7DFF5A1C2DAE9AB5043CEF45EDAC96D5C68332D" + }, + { + "tcId": 2664, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C91BDEE6B7DCD11FB7A2C621BD69DAA1", + "z": "13E76B0BDA320438E77A6EED9E727F4B00080BD2719157DDE3EBEE5C22AE3AA7", + "l": 1024, + "algorithmId": "2B12A1F2C43CEBF1CD22E8AB51BBDBAE" + }, + "fixedInfoPartyU": { + "partyId": "13E43134CAE086EEB2CFEFF2B71D73D0" + }, + "fixedInfoPartyV": { + "partyId": "6F72D711BC57EAC7BF39DC7D6C666BDC" + }, + "dkm": "EA38D2C195139226001878BCC55F1FFF9DCAD4A8ABC7495E0BBA420B9B399EE9171652F173A87A92FC55E608EE03D8DCA26219CE588A396F4C1D7812F0049A084D127EB54C08E1ED298B9F180B3944359E9666DF73E84F01DBFE2CFDCFE0D906B02563EC380EB4120C81E9B6D7F31C2DBED66951BB9FAB5EF5E7C1B4C3866E60" + }, + { + "tcId": 2665, + "kdfParameter": { + "kdfType": "oneStep", + "t": "38F78BE1FAFF31C41DF881DA3A471215", + "z": "BB4F6100EB86820D79BC48C4870BA9007B97D38C5E293D634457F87F78DF99B6", + "l": 1024, + "algorithmId": "618C8312CE06FF857E9FECCF45564184" + }, + "fixedInfoPartyU": { + "partyId": "CC303D5B4A918C5353C60CC7CE89CD08", + "ephemeralData": "080BA83527754346967CA1796E1FB12BF403CD21406237B7C48C375FF1847195" + }, + "fixedInfoPartyV": { + "partyId": "BE311264D50F0AFC95A808173357B4B5", + "ephemeralData": "123432A6916F71890922DCD0766D8B592C0F8E65C21CAAEDF5F36F5D108C2F55" + }, + "dkm": "9FB546BFD739BA5094D7B8D9CDE76AB7CD612A8FC99ECEA9B5C7C3BFF7EB2AC9A60B56650B784DB067C4D76830EE6EB7D4AE29D88B0746AE9ECFFE2EDA58508FE1FF179D386A7B65DD2C98276E2C3C379CCC66CFACFAD6FB58035A474E5438D47D82A77836BC5B007A788A667496A8AFBFCA77AA4A0519E8FC4D67CE35F37DBC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 112, + "testType": "VAL", + "tests": [ + { + "tcId": 2666, + "kdfParameter": { + "kdfType": "oneStep", + "t": "047D5EC336178B047424B2EEF0C99C94", + "z": "FF5A4E70F30C4DCB5D4B9968B3A2387F7B0AD9A12A3E2B9C5B2D9D2671", + "l": 1024, + "algorithmId": "74A106FFCF51B604662016E652E417BE" + }, + "fixedInfoPartyU": { + "partyId": "D94CC58A70F8197368D85D4D38A5A3EA", + "ephemeralData": "DBA14F3F3A5F212ED233FE3F3FD14DEA3A91D9A6A731C55A82745384F8" + }, + "fixedInfoPartyV": { + "partyId": "FFB7A506DF48688A06C977D9320006D2", + "ephemeralData": "53B5D7B4CA8372605ED9A0D456240B423AF463CA46A54E854B9FAB2E39" + }, + "dkm": "7598BBE2EE8906B47AD4FCF3BC7B3189AE0B73D2DAAECBA32511613D6688C0CD48A8572DBF2885094AA2ABB9BF9A5EA4864702C59B70C405540DBBDB7F85277E86DA723527DABDE0BB62ECD70DA0E7D69B583D07A0A8E6FA6EE52F86AAFD95E36D3D79ACFECCFE7BEB3E51BE298D10231B4BD1050E0009D251F5C7776B539127" + }, + { + "tcId": 2667, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51898158B52A8997E4EEF5EB57B731AC", + "z": "F05AB1F1A9DED0F57B86398C03639B19E053F03F9B088EF8402EDFF937", + "l": 1024, + "algorithmId": "D5DC3E00DE0D50F8CFCC1AE449D698D3" + }, + "fixedInfoPartyU": { + "partyId": "04ABBBAEA3B395AD5E07A7BCC7767617" + }, + "fixedInfoPartyV": { + "partyId": "33464E85002841D50248CCB2C6ED7D04" + }, + "dkm": "21D876E8E4F7654B9414E26B9C4B37ECCE1538A13B05FE5595DCEB922D4FC065361D3722DF3D24953F3DFE36F594A94EE2A66ED149DC1763B43B11386B181455F5CC5DA43EFF4BC1997D83D429C93CC636EE0AF2C8A77ECE8CF4486ACCDA093E6F7CB268CBAEDFC8B2464D393A23EB479770DB9C3EEBB71F535AD25DF2C7C128" + }, + { + "tcId": 2668, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CF6D705DAB69E91D9C26EBC947C5BCC", + "z": "F160C3A249760F8EC042C544148AA1FEBF4F9508409755F9E340E61AC9", + "l": 1024, + "algorithmId": "B356099E9933885B968BA8FE557B0BE4" + }, + "fixedInfoPartyU": { + "partyId": "D9B354E505D3D0152384D0F6928491B0" + }, + "fixedInfoPartyV": { + "partyId": "F53541F7700A3B7BB311C0C52CFC921A", + "ephemeralData": "B37A947BDF72D0EBC5643188D69D5C39DB3DF174FE661D2DC8BC11778F" + }, + "dkm": "07233CD074BCD166DA047B38F24F7C8332E3FDFB40707701AAB0063720A0B9684162F993DB485C5EA27A13D01EF735EF6AF6A9432253A7130F26804F25AD5B887140DB70F858A99BDBC9B85B6C3D316825927CC2979FEC756D7FC8FAE819AA0E8FD2997382A1C794F0C1EDC55892779F2AC89C1DD95FE605E318748069F0D355" + }, + { + "tcId": 2669, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF1DE6C5D06E19735343B6E0EA49B280", + "z": "911D54B4B658EDEF0032A1DBDF641CE0A588A4FFE2DB6EEBA53FAD4D87", + "l": 1024, + "algorithmId": "66C0BD867D1F8FB29467FF36C807FA0E" + }, + "fixedInfoPartyU": { + "partyId": "12E1086D4495C1811038F55071CBCF96", + "ephemeralData": "EE0C1A5E54E3EB5416D82F4C4A5097F188556097CEEA45E9F10AFC93AD" + }, + "fixedInfoPartyV": { + "partyId": "D85D818786E5A58620C106FB450BE793" + }, + "dkm": "31EF42143683749768C46551F05A353B447577AE84305CB7349DFC022329FD5BCD243CBC06092961F19C94981BC1E7C81D6684C6D606239E74B9B5A638F701B4C0CB35E321595DF0A2AA12A5D3AC9EB4821C25B1FEB2691AC1B3C2C9CC5B115F11B6E7B9DD1ED05F6331FAAC9F229EC530A3B572EC762CCABF6FE353472E492E" + }, + { + "tcId": 2670, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C9D8F5186467BE1A1DC5360E33AA659", + "z": "B35A01020D1A6559333426F8005B1043CD8B4DE80D6261C3ED3C2D8629", + "l": 1024, + "algorithmId": "645948776FC9FDB087CBF9D6E3A4E96E" + }, + "fixedInfoPartyU": { + "partyId": "0678D5D84595761D1BF0464C5F213644" + }, + "fixedInfoPartyV": { + "partyId": "06C1EB2F1220CF4968685886EA6A9DD3" + }, + "dkm": "5BA45DA9FCE96CAB76325A1EE2752E56515D14D7FF73C6884E1EB4ECECBBE3DCC323F43F4B76FA475B18973C458691B068ECEC56EEF178BAA29E10C868742C9ED28EE9155DD3E1CE6B5A44852278EEFBBDA5966F932A394529D8E6B529ED28B6F142873E7E2DE8E6FD7589BEE8A3807B0965F764702F7C2FEE94D69CB0F77E9F" + }, + { + "tcId": 2671, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E415C567A1B3C8E2C4AB12A0DD40EB6C", + "z": "53ED237A8CBC9DFE594F3098D69C39627138B625621889971A2F94B91A", + "l": 1024, + "algorithmId": "AF2A3A8B5F9AC6B7746D06B5053F38CF" + }, + "fixedInfoPartyU": { + "partyId": "5B7B7B2762D494FAA6D244B6B0F20CCC", + "ephemeralData": "ED5B04DBF5661DBB87C41895C59B74A0A3D71B1C8AC595CFCA168F7F53" + }, + "fixedInfoPartyV": { + "partyId": "B6282BEB5D3D023C5EA3271960218231" + }, + "dkm": "D0971E7243A7F871160E6387403E0EADE044A6B008ACA432E26C02C81CEFB666F7AE9DDBC4F4083C57D407DDC5CED67EF8BD4332FEB8B3D74B25523B74BB8C2B8924547CC7B7531D92F3E7E048C64C68B113D073814784B72B56FD5D0589F466DA4430BD73648B8924A73627849B70A3F074D3E9D9CDE31B70026C4E5CBD5A12" + }, + { + "tcId": 2672, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B58C26CEFBE8DD1DEE4450F0162CA6A2", + "z": "08EE8A3782567A2733C8F09F6E311AB705F855E70E799294865E15CCDD", + "l": 1024, + "algorithmId": "E5DCA93D2143CF1EF14FF1CBA726C6A6" + }, + "fixedInfoPartyU": { + "partyId": "FA0907B2140E5F7E9471438E43F82253" + }, + "fixedInfoPartyV": { + "partyId": "A4094EDCBF52B682C3362E8DB7C266E9", + "ephemeralData": "D41F8D0B80C2F4C6502B234E365B701F80B3E13FEF9DA97377B45DC4BA" + }, + "dkm": "1A43E0BB61CED45E23C4BF8681EC4EFC887143A920BF796DA66771AC9A2D12AD94FEBD96E27C4968FECDDE1DE347C89AB17C2018E101789BDCCFD49314CA39E41E659DB8AAC1842619EE577A4CAAFCD63C4DBED05C0647D4DBDD167EA5A90D880BBAA034A00FE51D78190F566D8764197510131AFCC828E73E1DD180F1642AA6" + }, + { + "tcId": 2673, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B730D07488C9E1BB5EED5E2DB80ADCEA", + "z": "F7CFC46794D007F6A595C1A3F5086D06F89232992404B51F8A3971B422", + "l": 1024, + "algorithmId": "AA8B9368E386B9CF32213A3A8CB8EEDD" + }, + "fixedInfoPartyU": { + "partyId": "31922012DE4582D621E251CF88FFBD98" + }, + "fixedInfoPartyV": { + "partyId": "A5D3CDB3F2C49AA4A3C9AF5C4F48CE94", + "ephemeralData": "2F1EB62BE5350D3B201003C6BD4D2ED800AEC1425657B69BFA202DDD00" + }, + "dkm": "2B2EAE2BC0529C4EC05C15A90434FA5FF3A876AF3C566652521962BA667FD469A797589E3822D407C9DF8A012BC086A40D4460794B249C2C55B2875B9BF49A30710A5675273775CDF00C843AB55DFA92EFD891160ECA4089BCF908B9EC0A7F711E58AB45A36A58753C8FF40C0F439B92EF1C545E12E2A228EBD748D8B9E4EE40" + }, + { + "tcId": 2674, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEA96B8D58CC20F07D3B3F10AFEB34A3", + "z": "BD95385F8006523F2989DF740653660B7B125397799B3593D239D05024", + "l": 1024, + "algorithmId": "078F43A2EAEC017361E489B628DCBB45" + }, + "fixedInfoPartyU": { + "partyId": "EB78364FFE1035557252C60D5707D48B" + }, + "fixedInfoPartyV": { + "partyId": "9F5B72B9CAFDE5B41F8C185279BAE502" + }, + "dkm": "547B52794A6520E4FC751904F9310A52BF08552DBEC6FDF19739FBD9E552B03BA49E62D062288E6FE3428EF16AABC4F48466B71BCA435EAAD7934DD7070954C3DEACD79D912912B5165FE5BAE6B8F24F72AA5938A7DA0FB442C941933F7E9CCC01A8724009EA36293F2681F6B5D53FFCE2EB8AAA52558C1BC0417520AB1E4457" + }, + { + "tcId": 2675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06AF14A0B132F562157177294CDDDFF4", + "z": "10B53C77AB58951BAA3DC6B1C4A660087B89D9ADC7E0235D4F998FA21F", + "l": 1024, + "algorithmId": "A5EC38A23BFDDEB68A4752D951A2A635" + }, + "fixedInfoPartyU": { + "partyId": "DB3189864A4ADD6BEDBF24F62FA2E996" + }, + "fixedInfoPartyV": { + "partyId": "B0BB3B4B8D77AA1814B891A760DF8BE6", + "ephemeralData": "60487ADD1AE958EFBF0463A630E23AE3675011319EE455B2383DFA0E2C" + }, + "dkm": "57E483F3D249D31D8EC0BF9C4D007E9879089BCB93A211D0A6160476D433ABA56481714C3B4A6659390687FEFC2A7196764358965A75B103589E14ABC5B105212ADD71DE0775CE0F869D0DD79A3017ACEA9FE27E33F38A69A97FA7915ACBD45C4F3A51D81BED3A33F109043985AA240264BF3B4A4E55034D8EDB72859368489A" + }, + { + "tcId": 2676, + "kdfParameter": { + "kdfType": "oneStep", + "t": "105D0A2867BFC1A10437778893B0E569", + "z": "370422547A5420E190B6AC5A43B8BCCB6B5F0E2072E1A3338D43BCD061", + "l": 1024, + "algorithmId": "118A22A6EE1019F8E8B1F6C5C359B1CB" + }, + "fixedInfoPartyU": { + "partyId": "686820CE4235844766D58DFFBBEDBF49", + "ephemeralData": "7476D6FB52E63D6BA3206029AA9E1138C967B07F80A65DCE240605D699" + }, + "fixedInfoPartyV": { + "partyId": "240D7F158FF12431FF4BBBA2ECB7C1C1" + }, + "dkm": "50CAF612579F9E778C8362189B8ED4FC2A1A9A13F46067DDDF665AA9F52B1062048A80EF37B2D10C21E8EA15051D8A1E60A3EDC26BF9218CCE70E7CA02F8712DD4575AE1B1B858E5ADF04A5C8B31121A3D7EE778BB07511FE5EC357F0D3B5223CACFB12020437D5FF48282373DD1AA6B4F73E52FE961E1506CD2ABE467BFF3E1" + }, + { + "tcId": 2677, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A95F8AF515E94B99226C7D7450E7E6D", + "z": "B930AB3FE3B70F1B5D45B7F2F9D384F67315B6B6BBCCC77A370BC368F7", + "l": 1024, + "algorithmId": "6B98116F71CEDC0A96DE17C564D1097E" + }, + "fixedInfoPartyU": { + "partyId": "10208A41B6F3348D4E077A834612E68D" + }, + "fixedInfoPartyV": { + "partyId": "96CEF7270C59DBED5040BD588A10C21E", + "ephemeralData": "41AE9E96F6D229352E20E820D2A6EE911B8FC4BD6C857C7CEFCEA3D02D" + }, + "dkm": "10D409BDE6B5F473A8AB34F408B4986A19E47DBAED2CF73992B77D9074A7452F4C2F912BC18B5013EF700B536D29C6764057CC480D6738B25132060181112577BCD44938C2FC311B9661A6FE5DD8A66C6A83A2B90B7F0E2F6A8D0FA7B8D5FF153F74B74126A2E6919906C43DE658C7911840CD75B53EA937484A385B15246554" + }, + { + "tcId": 2678, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE5DCD11B379C796C797069219584D91", + "z": "990019CC95E11CE03A67BF9937355E232B44D03597C8C4A2C985AEFBAF", + "l": 1024, + "algorithmId": "25AC4D6C0D4C4B2165B512C8AF932CE8" + }, + "fixedInfoPartyU": { + "partyId": "355D818F89EE5C269E715E8DED535302" + }, + "fixedInfoPartyV": { + "partyId": "C489FDEFCDDECE84F50D787C4369729B" + }, + "dkm": "550E799EF3EC7AF16A1308EE37082E32B8E447084F31F2D75CD512BDD92E2396B8CF4CB86FBC7E5EDFEE7FEF65FD8FC3693D0142CB47AE6A2BEB1084A9243A9BE09030D982A999895351CBC3FA96B8A2520C0BB5D5BEDE95CE4C99B185FC4BB9BDACFC07FE103DA4490E751B9E5B240EB0DF017266CE438CE082447DD5E9EE9B" + }, + { + "tcId": 2679, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EAF86F75F5476F79960DAF589A228FB", + "z": "AF908A58EFB8DAFD7309F80004D7320864BA77FABCF837C80364B3EC28", + "l": 1024, + "algorithmId": "160FA22DD7C59789C821030781F14F93" + }, + "fixedInfoPartyU": { + "partyId": "63FACCA9F13313ABEF41AF86E803D0C2", + "ephemeralData": "17C5ED59E8F159DED2742AFA49A63DAA74FB112BCBA58DF75A7D44EE34" + }, + "fixedInfoPartyV": { + "partyId": "2F83BA4275D967324B9B244A54E030CA" + }, + "dkm": "01B3390C4BB6783AD53E93B0F5EB72921584520A6A97894297260F81C2F33A5C4CC329EAA8182CF09E7834BE7B0AAA879C0907F5D162D61FBC1719F913E0AED3259A4084B89ED8FB0641E6894B919BC0A3F13B5F5CE5480601C9F988A941C3A22AB438AE8039EE1E15F2E597F0687464490FD13D134325D03C4DB39083E32EAB" + }, + { + "tcId": 2680, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88A07441146042EE9AC27C19A2DDB2D8", + "z": "E5B224E59C1966985FB684E5D586DC3F6379217D8EB423F725D4CB9B5E", + "l": 1024, + "algorithmId": "485005F1F8C9128A7D4445F413805E95" + }, + "fixedInfoPartyU": { + "partyId": "5A9B13298EE0227B39569A4172153C30", + "ephemeralData": "27A3C25A4C86A522070B415DCF71D33F38B234C628E9F05C3ED965AF37" + }, + "fixedInfoPartyV": { + "partyId": "22D3188824DFF20B4C75AD53BECB8436", + "ephemeralData": "E6616BC3255E91E4F36841F2C14D9AE48DDF0915414F59B6591D0DE343" + }, + "dkm": "67AE2AC9CDC305DB1BF2005231F4447B6E4A95CEF9738E9D40F4F7C0CF915F671CA970BB542225520A8B0B65777F6CA3D942F7AD808823ED240242B3D39074C25DCAAD894ADFEC433C58C206FCA2926F43639823542F9BC579184C7F303D4D5D388F7B2F5AC41111C644C90AEB101B51F5848BE47C0EDBE40BDFBF344B4990CE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 113, + "testType": "VAL", + "tests": [ + { + "tcId": 2681, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01726CCFD24C212119639E7253550199", + "z": "364F4F0BD5BF25AEFE75B4646014EFC829B267C733C47F243D4796603656C9", + "l": 1024, + "algorithmId": "7813BD5BBED1E89305219B2DF7D9884C" + }, + "fixedInfoPartyU": { + "partyId": "B19B6AADD430C352E1B28704F5D07526", + "ephemeralData": "4350A183A00E333C4124BC97520D8E2FD53271D63A8758534C0E0BBAE383F8" + }, + "fixedInfoPartyV": { + "partyId": "E00A77FFACA184661A7B6CCB13660E8A", + "ephemeralData": "C541781A12ECF212C20A1E0BC8B04407B2C96EFD87A642D3B21A485D1FA45B" + }, + "dkm": "4A9BA26EE8BF02030F72DC387BF228F149287FC400E47AAF385511AB497D6A3FF7A2F764E962546EB5DFB3389584E49538553C2C3B1B285E244C0C62E1FEC087C955C9D10BE23A259CDEB270A6F94599696CF27595C0064253D381F371DC142CF266FEFD34D85440A2DEC5F2C345E3261FC72FB538FBCFEE0FC1CDF25982A817" + }, + { + "tcId": 2682, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58E160CEF09F6AE3D2CCF3FC8EF028DE", + "z": "0DE08CC80301B1C9D08AACF091A3CE3FE2E4FB1EBCD5D8BB658484645300F8", + "l": 1024, + "algorithmId": "E38AEAED6552358CDBD12B33E6D47EBC" + }, + "fixedInfoPartyU": { + "partyId": "D7AE3627B535C25A5F2696EC6DF9532B", + "ephemeralData": "92A8D4762D3744A7A8F67602CB90C7F82E9D8182B28A306DACF1CF2A226087" + }, + "fixedInfoPartyV": { + "partyId": "D8DC740CBB004C625CE3BE2C40042A03", + "ephemeralData": "339C3A76B56833E439015C7D58AFF7889936C397E57AB79188D4E2A660BD06" + }, + "dkm": "0BDE6B9905C4C4E511ECDB1582E9411E76036393207FCEB8DB67FF86AB603BB4B2FF0FD0D492C842BE6036B37D6978028C492C4E639409ECA5E4796F18FF430424B69113E4C6B9ED5DAACD3A33A6689416B582CF9229105B889C4312327553FA4D8BCE4326E330BF807C7A43C5E147F06E136ADAA49AE7347DF221FE9F548013" + }, + { + "tcId": 2683, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED91171B5FA697F03D761D6428C8762E", + "z": "DD2A4F784997ED898827AD62C33ECFD0A0FE47D40F8600CEE97FF6948C58A6", + "l": 1024, + "algorithmId": "8B463F8346EE66B3029AE8776DF266C0" + }, + "fixedInfoPartyU": { + "partyId": "DDCC8A042316AEC53BF5B51EF600D49C", + "ephemeralData": "17C7C5EC4DBEE871F8D5085ED6F678CA70E8EC9A61E79866EA9592F8F8F9A4" + }, + "fixedInfoPartyV": { + "partyId": "D8A094CD8690153F09EE42483B8AD722" + }, + "dkm": "9A9BFC11B09101F9ABD1B87F598C19B2BD6AA1D0154D3B48F0069FD0121299DE3B756801C1037E4A52CBEB3192D193CD36FBEEDE053FF8A45D38981BE5F4B8379D73A9BC7B06708C667BDC2853CA9C1D0E38781BD38E3821B8287713E9C4DC899A67A82CFB11FA31627F4F7B8F5649BCD0D43866E1A2D216467AB7F68F7A512D" + }, + { + "tcId": 2684, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E86D66FC4BECE7C4EAD9FC2B6EF4068", + "z": "3F7AA66A9C983A8FE692214517F7CA7FB0A8B0A10B54D247676D1E1498F3A0", + "l": 1024, + "algorithmId": "709D5ACE06A61765AF3E643819E7E72F" + }, + "fixedInfoPartyU": { + "partyId": "9E0B946EE4A7D9FA5189C2DB6517908F" + }, + "fixedInfoPartyV": { + "partyId": "58A1FDD086D9080D0E6D41BE78F93E1E" + }, + "dkm": "0A103C6CCFE178D1671BF8065E581CE9EE008D84FE2D153A1755FB006B2C85D8DF60E46F454C9BF63DE65B9D595393184B8226DD5E9D98F3F58A7FABC6090E73049A3A164EF9AC4CEDE524AF33A392F920496F08F33307995D9017AF57AEA5453C548DDD82C2EAA0D23F4433292611428EB6BFF7DC59727280A421021AA845FD" + }, + { + "tcId": 2685, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18318B6C5F4F8615DF34B7AD04A66AB1", + "z": "76848D579416EAE77DE7FAEF24287B3281E9B5AF5E0EBC6ADBC6EE77954B80", + "l": 1024, + "algorithmId": "F2DD7AF7D2DAA30FE2E3DDDEAAF61F9E" + }, + "fixedInfoPartyU": { + "partyId": "2A85589E473B8EEA0366E4AC51C17183" + }, + "fixedInfoPartyV": { + "partyId": "37DD8331D88CAECD981E426643E31D05" + }, + "dkm": "9BC787897EFC5B34E1CB03620A5FD0274E89CE06EAEEA7862D84856B36889BE101F8BBC92360C9C093101DCD5A3A57E4C1B073838147B93FAA21984F2EDFDC7B8073196BD4CE00E5E1DEE899DB1EBF4C3A80252142A5A6E251A09B260A1D0619472602DF5A26DEAD3BCBFD01501475D040BCDF9779ED3E6409719C148328B9CE" + }, + { + "tcId": 2686, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13F4D0BDDD48D764CFCB669218A648B6", + "z": "4E918944AB1C061C455030E0A90FAEF3EAFFE231E27A690C49A9B4DDDCA79E", + "l": 1024, + "algorithmId": "58F0876CFFCCBFDC0B6FD21B0FECD182" + }, + "fixedInfoPartyU": { + "partyId": "ED998417AF99FF0DA313ABC461B8CB0C" + }, + "fixedInfoPartyV": { + "partyId": "D78304FE97D7C0624EE21427AD2F55EC" + }, + "dkm": "FF7FCC8ABE1F2081B03BFA5A70879736F3AF49E8D141BC9DE2638D081E710BE89F6B2048D155D14E504A37DA0FBF9A93B2DB32C283E94DDF0C77982DD3DA759D0C651CC92C338D4D44E21601A5FE377871F830659DF67DC3B01C8B988FD076490DD16A95F6284F199181637AFCF1DF957DBEA4C7DB0C73D858F70A5249F32D5C" + }, + { + "tcId": 2687, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68E69B81B8E4756A6663285659D6F113", + "z": "51354456ACB51CC8FE67FDBBBFA5694EA6FC0F3D2C489371DF7B9AA182C1D5", + "l": 1024, + "algorithmId": "4077B81B12FB3CF147793901671D50B9" + }, + "fixedInfoPartyU": { + "partyId": "FD2D2C7EEF886EB0EA708C156E935556", + "ephemeralData": "64E8E031F80C219F872016D6DFA611A9F8F8659E199A9FD4AD7FDE75A8CF3F" + }, + "fixedInfoPartyV": { + "partyId": "4B4B57F17699E5D5785018854B17BABF", + "ephemeralData": "4796AA7DF1092EC09073AC4DE45935B7F37C87D15409471ECF264D856D4590" + }, + "dkm": "7C8730081255148D3F3F4389C7076233025C37BCC1E229ACBC9A896F2C9431887EE8A1AF2F990843FA6F25BF974FEE71D8764ECD792EB1F161CB673F9DC380538C97792B13783051BCF7E4F3080997D8DA0F84BD5FA7A341FCB7AA8F9627CDB56F5929B6E5C7629528CE19A6FC839DBE18A03175714AF843EA1BA3F603A145E7" + }, + { + "tcId": 2688, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABEE5A29172E929F8149FF066A07B57C", + "z": "C9BFE4E097D3C2F88B4F5B5F9EB09485C582BC2A86EFF1D2D1145700D80793", + "l": 1024, + "algorithmId": "3D6440DCFFD9523BF3D7137337550CF8" + }, + "fixedInfoPartyU": { + "partyId": "C51F78167934E468E66468D56C2D64E0", + "ephemeralData": "8074D6267B35C9301DF0158EC6A52631EDF07C833DDF7C43508EBC7982A8CD" + }, + "fixedInfoPartyV": { + "partyId": "EC6227885929DDD5244F3C3C137A0EA3", + "ephemeralData": "099497ECB1F081D6F4B1DD0175995F076C291286B0528ADC073658D2F04747" + }, + "dkm": "DEE6DD0DB75E9537ADA96D93897A545C0B422265E5C3F6BE82B3A1C5A82CC2A9696808C60D1B8AFC9150FB480732353E143E285BF3DC9011231B4DE9569F4C76AAB1A4A662AAA9FB2037D48E7A0C6ECCA0B865048A5B4EECD1FD908DF27DBAD15DCF3C2B504CDC42FBA6DDC8C69BF118BFC1C2F65B56A63C98592578B7F132F0" + }, + { + "tcId": 2689, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1F914CABCF601F35B47CE13D460AAC4", + "z": "EA67F8BD738E4A3C80C5A7BD85A4846E8F6CDC621B00A4E86279ED00E1C196", + "l": 1024, + "algorithmId": "B399611ED5CEEAC9B424EEBE67EA910A" + }, + "fixedInfoPartyU": { + "partyId": "7FE4B2122F78474BC5997F5C3E0CF0B4" + }, + "fixedInfoPartyV": { + "partyId": "3CEFA5055EB5A541D01A3C8F25378772" + }, + "dkm": "DEF9BE52EA40E3BD5FF5484B03FF10C3FBE2AE709097F28D911666F8B68AF3051504FD847A108FCC2035DB3F2E9260D4ADB5E4DB800BF4C64EA38E474372ED38766257DDB409BF3F384AAD6FCFEC619C7E41CE39AF842D3EB159C3CBA0C7CA6F164CDB784154F95F5B799219D2E3B66DB69805FE8C3D28CA8E8A6E2D79AE1514" + }, + { + "tcId": 2690, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43660D2D2616A99FED69EFB7D4DBE001", + "z": "D81292A812F0C34058C9C7F517671F392B624B0D93B1E3D214CD0E050D2423", + "l": 1024, + "algorithmId": "16C522AB3A7BCB000638A852B2DE2C2F" + }, + "fixedInfoPartyU": { + "partyId": "A25B5C05F108CC3308BF1586173764F3", + "ephemeralData": "E353D8BF28E45F6024A44B14A99FD9D1406BBB1D42CCCB597B71F5C606DC7E" + }, + "fixedInfoPartyV": { + "partyId": "78EB7D48BBBDBBF2FE120BB529D54E67", + "ephemeralData": "E2DCE88D58B6A0C6C58A41E5CFDAE97881BC491166A6B8DAF28DB2BD2C20C7" + }, + "dkm": "D0F5232F9B0D9927D69F8007B976B64FB3C617F59D6883BA091FAC12E85668CA40F51AFCE43E17A4117005240D0B984B187D4D7065D0956D0F990874E5F9B204FCAEB8900EC64A799B72DA8A574A8A33C0BB4F4261E97B09D0BAE3CF7BFE61FF644FB04DE0DB578E8FA7E0F7AAFF2A62A2E2EC0F64B0C83EB8D97A9258C46349" + }, + { + "tcId": 2691, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E7FA254535722A98DB130DD3C6EBCB7C", + "z": "1CCF26AF4BB5F4EBE2D769C16FD29DF8E73CDBF3CB691B1BEE0FE2AF0DE915", + "l": 1024, + "algorithmId": "3A39AAB269955C97620498DAE49107F9" + }, + "fixedInfoPartyU": { + "partyId": "FF1F4269AACFDC6C588A9CC854AE6272" + }, + "fixedInfoPartyV": { + "partyId": "4CF53EC32CBB22063E7D39B673977A43" + }, + "dkm": "56F160F0876C8BC60E28F9F02114A0C4D8A812A9BB5618477C27C3DFEE2B679DCE097488FE2DB7F822DF82BF265D28940D0BF7BEDEEAC158FBA62E2A4C22C7D3B8178E9B5CAF5BEE65E10FC70089F1F334C66F2BE96F2AC09866DD0491ABD60CB089444D2A36C707B747DABF1EAA18F954989E80BBF0E4A657504C86322095FB" + }, + { + "tcId": 2692, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22F4FE9B7F24B321CE37909BB1BB15EA", + "z": "D857EA7DE7C04FA7C133018DB7C1B9F9DF734B51FC1FE25BEBE56E59F011AB", + "l": 1024, + "algorithmId": "894E77C3B048B6BF74D60F31088E8738" + }, + "fixedInfoPartyU": { + "partyId": "82E6947BCE5F2A041AF486B20426C2C0", + "ephemeralData": "124665A163B3A6C5732D6F258F3B468B706DFEAE0A494F78216647DAC52AD4" + }, + "fixedInfoPartyV": { + "partyId": "056CE93D638C045B79FE92C0A9393D69" + }, + "dkm": "09233680CD1818E520DFD47DD00D6CFDB3A54C0792EA9F5B1FE9C453C7A61049733F2615DE54B45180C2C42D754994E6AFAA043B3C498846C58C61E417CC413038E3DFC3971F2187D07C6E2B4AC56C2D1F386666775C487DD9B4FCBEB985CC85C760E34A26C157A8C07F291AFAE09AC2BBBBB98EB863233AAA82261158EA9294" + }, + { + "tcId": 2693, + "kdfParameter": { + "kdfType": "oneStep", + "t": "92F5C0A9819676186617226949B35F1B", + "z": "6D195A9DCAE000E76169BC6C69FEEB06C7E9CFC385DA7BEA446A224AE63049", + "l": 1024, + "algorithmId": "DA691E0DF858C6B3169BF114E2471809" + }, + "fixedInfoPartyU": { + "partyId": "96549C8FCDC91BB1B81F38DDAEC5D1F2", + "ephemeralData": "4AD29BF350B746CBCDE93A0AF1926D6190A69F4149FFCEDFD58957AB9690AF" + }, + "fixedInfoPartyV": { + "partyId": "1276D5380ECEF0489BC183C9EE9B49AC" + }, + "dkm": "075A842F4C0692EDCBAF5C2B7889C425415BED136B47FA8D683E9BCF29EDA2E74105CFABCC60174AACC5FD0994B2BB80DAB8569D171D78ADEFB262C6A91EEBF39C70412BC046935891B464E48019D4D3CC37F276503F00BBEF6A52B21D3AA5E63ECA6319ACD5CA7658CF3CA0E6527F50210FE15FBE0B3F4FB865DD84155B331F" + }, + { + "tcId": 2694, + "kdfParameter": { + "kdfType": "oneStep", + "t": "97F430E5C33CBEC9EBF3B459031F9CB3", + "z": "8314DA29ABF6BE49BBB89F21EC453E48BD6B0A3E49DD6A600D190589C10104", + "l": 1024, + "algorithmId": "41F592328B2DE98E69D816E875E1B1FE" + }, + "fixedInfoPartyU": { + "partyId": "E0B56B7C98BE8E9A3C6BD0308795F45D" + }, + "fixedInfoPartyV": { + "partyId": "5686E36D0ECB77464CF8D3439F85F301", + "ephemeralData": "AB2C2DA058EA3A9C2119E38FE7284D1608DD3F1FE0925209D2778CE47549EB" + }, + "dkm": "C0E9CC9E9C74A645B960373E3123103CB47720F9E7B11CB473AEEF30A85A84C3209E355C11E919F9D069910D94B5541E8ACE2E80CA68BAFC3C554C9FCCE679C99603969E19B15EFE39FA2D95E8EEC35E796D3EE1E045E3A731B4F37F355830B711857D1C52348FEE29BDE54381EF756098C8B8DB6700124FD77C8A894A9A7386" + }, + { + "tcId": 2695, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5283A78310219C23F73F7A2D725B8120", + "z": "7650CADC38066F17CA635F87460058681EBDD5824308FB1C1356F5BFDF52DA", + "l": 1024, + "algorithmId": "871F1BFE108E8D2EF960EB785CFDAE92" + }, + "fixedInfoPartyU": { + "partyId": "21BC3724763F6EC9925F3CAC353C0986", + "ephemeralData": "DFA5EC20187D6DF82B72889979BC92AB51361EEE50C88777F3FC6082B7B87D" + }, + "fixedInfoPartyV": { + "partyId": "ABA40F7424BD480C26F398115ED2E5B2", + "ephemeralData": "E9B74DCA506C969E1340D74B089DE8E28BD3E3E315BE8D0ADD87437A92CAED" + }, + "dkm": "68C1A2F3D10A830111DC0BD94F6C167FB8A34ABCAAA7271BA48091046C22CF56F6AE73B7AF515AA85CE9FA59C718C2A7B4C8EFA02261706C44F3F7AD6435B7506FC80FD0AE816EA6F72385DD91A7B3527D08C7C6FC1D80603DBD08E4E0A139D2CECD630A1EC126F633652DD9565A9791AD24ABB6F10A8F8197225DAB0089E18F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 114, + "testType": "VAL", + "tests": [ + { + "tcId": 2696, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A568EE06813583BCC92C80CCC86C8F8", + "z": "A2C287DBE5B44D975635F2A1EDE88E4F7708F76B0B6A065D25124F6561DCD5B68B76A004", + "l": 1024, + "algorithmId": "CA825843C721327495B6ABAF71BE33B5" + }, + "fixedInfoPartyU": { + "partyId": "E8FD08EE356E6CB5BC6725EC2313F7E2" + }, + "fixedInfoPartyV": { + "partyId": "43D64A2D9B17C9859FC3E989B8764BDF" + }, + "dkm": "EF5567BDBCCBFF46B9C71066EEDA4E9D43E2098BB7ED625DE0996E9E5120A3A8AA877D68588B913028E4AC4BAC78500F4E86D61BAE855288BCE0D52724E46E9567313EA94DC78F7D99E055281825F78636B9A247BB95DF9E241A396BE2BBA2EB7EB92B9D5638085187EAA4342E59EDB94B5EC409BA3E4399715A0CB2FE2C2110" + }, + { + "tcId": 2697, + "kdfParameter": { + "kdfType": "oneStep", + "t": "615E71B87F2D69F5F48579D48C1048CC", + "z": "1551FF21677A9953E457D73774FECB191B414F03BC7F0ACFDDBC53C67A9941EB220295A7", + "l": 1024, + "algorithmId": "E4A23BAAF9607FD93219804E4CCBBCEE" + }, + "fixedInfoPartyU": { + "partyId": "687C70EAEB25A7BD81C695AE8BF88038" + }, + "fixedInfoPartyV": { + "partyId": "B8D0BB54D82C27B5EA14EA8E96DC4742", + "ephemeralData": "F9EC803255EB68A8996DF9A1E396AA7F75B7DF37111DE2FA6CB18FB77D04836DB6578283" + }, + "dkm": "AE5B38FD202F0F3E16377CBB3051E2CCA67D688751F56620441CA85D9600612C93793F76813321C908A7AF6B0E71C6A10B439DAE22E9603C2DF291B3E7DCCA6283C25C7D55A9FA3576856B4D2E4F95655C84C32F308CBEF31FAF9FC60D4C61C9364FA6E46A60908609577ED45BA3FBAAE5BA107DD347E84FCADF0F56BF67C0EC" + }, + { + "tcId": 2698, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D7587787338ED3782A39D295DA8741D", + "z": "8A3B08583D155CBFABAC8F1D12DE922FB1E5379FA092AA3D1A6270581F56067E07270668", + "l": 1024, + "algorithmId": "595A16BD22C2442C297E329AB86726D2" + }, + "fixedInfoPartyU": { + "partyId": "0EE9E4A0BB8C88D529F17E5765C3BB2C" + }, + "fixedInfoPartyV": { + "partyId": "0A904C234E5F306F36B01BB58F9F7322", + "ephemeralData": "1ABCCFB0FB3BB2DB914EE82F139F76EBD2F1AB90A322150CC558FB5E88206CFB0DA6CE27" + }, + "dkm": "E3A738248CD9A238ACD61A46B08B794C429EC87C8A62A3F886CFC1B9AA4C9F48BA88B3880267062F936F8E0D5BCAB4896BA147EB7E693C9FFD85D96D093DFD43FAE3ADACA2883AA6B16E526FE1EB207508D6315F8123F429BE53C243297739F57C15D673F8A9603B80116D31153AC64540674A5A99BD6EC8928554E62E6E788A" + }, + { + "tcId": 2699, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A019B89A048DBA33370B861EF1AFCFFF", + "z": "C4D456F77EB4A0612B83BDD909F2F517AA55FA0B350F0C29373EC6501D7AC108736CFF6F", + "l": 1024, + "algorithmId": "C8FDBEC344F611374EA4EEE6B7F5E48F" + }, + "fixedInfoPartyU": { + "partyId": "9FF858AB260DD44858A191553DC08951", + "ephemeralData": "CD881B15A709805CB004C199548555173A82E34B38D33FBF11B0BC4E3D4A9A620C79886F" + }, + "fixedInfoPartyV": { + "partyId": "7560EE3A948847F1D5060075EEEFB75A" + }, + "dkm": "02174AF90F15CD42C9327DF764C15D6F2E58A415E36E741DA9B5B0D3AB11D21EA364E2F248C8516D0158B3A66E4087B1C1B4EF266D3A9BA3EA46F33F4B319AEA9FFF6C599970A8A7C632EC6484C905C48BD6C41A4EEEE8352E1EBB1D00D2A1DCD27862A7A8B3BF101BB10FB8325E67123EAE8A611E6688ABABC1A9DD845C3BF3" + }, + { + "tcId": 2700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7894AFED43E616465891EB280AE5511A", + "z": "EA9CE1D3D68AA31468CAB1B1C3700C0D9F62DB918055C331361056FC68EC8DC19EEE981F", + "l": 1024, + "algorithmId": "B9C6DB83BB5A678577E6FB7F110943AF" + }, + "fixedInfoPartyU": { + "partyId": "11B166C082265ADBD10E7D658DF728EC", + "ephemeralData": "76DE8978F1AEA8488A57E79EFD903AD5E368936A27506339CB585383C210EC2A28136BF4" + }, + "fixedInfoPartyV": { + "partyId": "D2555BD5F7A105B629E1CAE63CC1C289", + "ephemeralData": "1149A8DB52ECB46046984666590AFC2CD1A89ED985B05366A5DB7A8595438915DBB9772E" + }, + "dkm": "90D358AFDBD9438EBF00F03436C9DFA1A96E8949DBC70FD65000F0E4BA9E334703106E400EBCDDC96E4E86A0B5272BB45665DAEFA2AF2B5CA77AB61CB45F30C89170E5FEC3128A9DE870946DC21309E0D4FBBF62C3A16CCE0F7F7061C1284739754E48DB632AFE11D6539E7D4DFB07C89CF929857A1404B6C34E3BE71779CF9B" + }, + { + "tcId": 2701, + "kdfParameter": { + "kdfType": "oneStep", + "t": "92C0C8881D086496CE3ACD9325322F76", + "z": "0394F3E38C8BFC40D82909759640FDADF6D7750CCDC2573E075F267DC072D0B3978ACAA4", + "l": 1024, + "algorithmId": "EEC72ACD3886A454141A493DC0D7AF63" + }, + "fixedInfoPartyU": { + "partyId": "13103BA23F90326D6DA871BDA53A309F" + }, + "fixedInfoPartyV": { + "partyId": "C24A24D39B807F99A7AA21F489A6E5C9", + "ephemeralData": "340DE27D450E99D128F124FE900EAB79ED0E199B77EC0536E9794229D3553C39323ADC2E" + }, + "dkm": "8AC4B19148AC128F6F320901BE20B6BDE3994C1272B8CF7D1B59F4E6769253D005E76AEED241CB1108FD279C5ED1176810A5A1A1EC09A3F2EB6C03EC90C0801B84A956A1EB2C5F6809E1010C6A3CE6E9526C9DC2FB51679DBA6EBE5A385EC3A432B5BF04F6742D8D0C7F47FF1CF9DBBED3CDDCC3DDB09016041BB648AED6F86B" + }, + { + "tcId": 2702, + "kdfParameter": { + "kdfType": "oneStep", + "t": "789DCE1195052F61FFF6DF115364116C", + "z": "247CD0090FDF7EA8822B0C069C0A20F3322B8A5D7439A0B63974DA33B627AADB6A48212C", + "l": 1024, + "algorithmId": "99A0F446A948A6DDF013ADB18C0BFC7C" + }, + "fixedInfoPartyU": { + "partyId": "863790F5C049BC6B3720AEEAC1BD35AC" + }, + "fixedInfoPartyV": { + "partyId": "23E53065FAB50EA57FCE64AB170C856A", + "ephemeralData": "0FC8DF9D638C063C6A9F4542EFD1000D704B9E6C5946178C6AC34931D300454869CC28C8" + }, + "dkm": "56027B674D5C18FB5243F8ECEC91B1FE51E531F712C59FAC1FC92E943621DC95A3123791AD67817C2F90EBBFE2EE1AAD0106B04065CA9735224311A357069DC26CFC654A83A3F498653E1754BDBBBF1E43052F89E6EC64191CEA4B393ACFA12F3E3037C415A4446AC3F34C65A926F8161A33E92224FCD711215F6846C1FC2169" + }, + { + "tcId": 2703, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76C4AD6CD22A87B1F8B24FCD97944F57", + "z": "D129322902F1B0634CCA116530242B33D059435B2C5AC20FC7D4BDC58764422746FA066B", + "l": 1024, + "algorithmId": "4545DED894A8EEAF5D828ED47B0A177F" + }, + "fixedInfoPartyU": { + "partyId": "2876FD2DEFE8EA7A0FD20DEB141EFEE3" + }, + "fixedInfoPartyV": { + "partyId": "98DC9DD1CB1423177815E1C9E23F43F4" + }, + "dkm": "50318886E1E65CE42FA0660F807A8038A9E2528C71B015C731691AD0B10D07BCF4E6C79CE40CFD2072441C28C0CD1224306FC87EFD4577C43E5FABC1E11F86E4372650CBE3515889AD698C9DA33597310496E1156A2E9F34E07E5CA6AE44C16E3512AB7901DC94FA943708E3013BE27E2711CC7A6C765BF2A792BF241C695AE3" + }, + { + "tcId": 2704, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BD46208EA1434167C64AD963CE775C1", + "z": "BE4D393254AFD78A5677BB413B48D3CD3CE94FE4B3B573CF86A52ACE2B65262DAF3B030D", + "l": 1024, + "algorithmId": "7D31B7F1E0CDA95305587183A40FB915" + }, + "fixedInfoPartyU": { + "partyId": "A08CD2B18F4C1E44CB1D79E20AD479C7", + "ephemeralData": "F8BEC25BE18A9DFE4636227327A9DB2A93E47A6840DD7178CFB01143281562889A555816" + }, + "fixedInfoPartyV": { + "partyId": "58484E6FACCCFB6C689FE2BF163E7FF1" + }, + "dkm": "6BF068D4418E52D79AE3BD5CBEE97B93ADAF4680F6094B87C57BD5119DBD0C26F4BEFA4CC4562113A3A959D4B5EADE449889AA29D8D6C72731CB7EAD9D1A3F6678589435A7A7C81F403F55BA0E2004F3F231D474D57A424D6DE21929E763F1155C6FD34BDD53FEC358564AC1C5C878C79485BA84A22340CCA75C2011C99602F5" + }, + { + "tcId": 2705, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06C31B1DFC856A415E8D8DD31912C846", + "z": "B0B4BA75E40CD22392423C46C45CAC12CA82578995F66E7473061E5417F9EA30520DD6DE", + "l": 1024, + "algorithmId": "E2DDAA8692C138FF2ACEA8FC849AD352" + }, + "fixedInfoPartyU": { + "partyId": "C673F073D3E91A86B4C4FBCE5CB18A9C", + "ephemeralData": "C77B4A465E331E6F522C3DA7E717FB25A5FEF845BABAFE221282F466A8F30C497931F3F9" + }, + "fixedInfoPartyV": { + "partyId": "F72E182F1B64A2420767B3BD7E533782" + }, + "dkm": "0368D98B6E4128528A20ED02FACC57F9E18EFC47B56802FDE208FE5C7CF26D9E33FD94D59B0524DF7F5F8B8E64707E0C192B9F516B9D4625F42C7D211FDEB854D94F3C980B3D8BD210114DF48812A90E145E40F04E532B1163D2CF59D51B10E86F0CDD9ADF9967087508D047BFD2B44D378810CFB4F7F20FF2ED3BB7CD3132A4" + }, + { + "tcId": 2706, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D188CDAD37F48A483359887588A39685", + "z": "F3FA7DB313382C75C12F57DCE15A37101914BCF034889A2858E4A26A0419B66329776BED", + "l": 1024, + "algorithmId": "14B4DA5EE84F3CE0E664694B778A3569" + }, + "fixedInfoPartyU": { + "partyId": "F147BF02AD0A00A3D21E9F7CCFB08A63" + }, + "fixedInfoPartyV": { + "partyId": "A0ABA4D1693D8F58870C4C9510B6C16F" + }, + "dkm": "2896B1D738FB0E43F9D55E588E624C310926E28E623B8937E0FC1648C28930F0A92ACD9DF4BB7927F8D74639B95A5BD7BB1B1882FADD08CF965CAA8ADD9FC4DE3CDA27F94B62648B16C8A4D92C64B30F6D5ADB747C316E3C00B2FC5F51691F68D79885B96E8E9D669CA7E2B1D6B6B515DFFAA7F62BB24BDBAAAF1D6885C9C42C" + }, + { + "tcId": 2707, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3180F8D4E27273AE01E25327D87DD1C8", + "z": "1DBDCC14C930C6375CAA0E06748E30811F91D05EEEAC1A5184ED0E81E9605E5908E07A09", + "l": 1024, + "algorithmId": "A9B9FC97C7FD94C204A9AAD05810E9C7" + }, + "fixedInfoPartyU": { + "partyId": "038484C793B05D6519569470694FB11B" + }, + "fixedInfoPartyV": { + "partyId": "5C857023DDBBB204B44B016CEBD8B060", + "ephemeralData": "D6B237362BED423B9BE16CB404AFAF31E51CB3632D42B295165DA90E75D9EDAF2880ADD2" + }, + "dkm": "02EFAF4CC54334DAEA49F882A8F50DF2DD8930FC8862A9C420EAC076A8AC0C87A051BC42691624FE0974B3BAFF08A1E5C4B3BB125C6FBC3F664772B91F796DFC4E14816B5563E8DE5627E0EF2D64EDB8EBB1BA44FCB8CFBEF6EC699036906B42A97DAE5927B1FABDF336C825DE04CBE122C2F8192A04043EA02CF242AA775D3B" + }, + { + "tcId": 2708, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BEEFA57F5ABBA37C5410E218FD82BAF7", + "z": "502DF3DACE6C6D6387732B631916D990D984C093E69F93DF81127F8A710736959F2DB688", + "l": 1024, + "algorithmId": "4C417407B6B2C974EBC81F2BF07F74FC" + }, + "fixedInfoPartyU": { + "partyId": "BFC7D504E8748ED0997210B3C1B6A246", + "ephemeralData": "C5C4ADADA68E838BB6D5497D668025C209F1A04F65ECA643121C0E7FC26A3B13A0AF2E15" + }, + "fixedInfoPartyV": { + "partyId": "34B48388E88C86560133FF4B6632B07E" + }, + "dkm": "80562FC5F5021627BAAE2542D40F688CCD5EFE4006B372A0C2C900FA3B06C5282B97E2AF54F2CDA27B16E95C4E3EBDACFD8BF5D549112AF6181B089DF0BF55DD6A68333340D5E8577F36B400B11B09422A3D1CA6FE328E58726E332E0A1BA4C53737A80F10DA2E7CE0FF361CA1637503396718EB10911DC49E65B3A77BA3327C" + }, + { + "tcId": 2709, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B836B7F33AA54A21B5F67BBFD35B12E", + "z": "39A82DD7128EC7E422D8C3FB8045234E53EAC6831FD1551B59CAF9FEF7C762D61DF036DD", + "l": 1024, + "algorithmId": "4697137085995B7D0DFB8E767ADE5BE7" + }, + "fixedInfoPartyU": { + "partyId": "B8B08A824CFF059DC2FF3DEACC707922", + "ephemeralData": "10A791D517599F8BC3F6E3822310691D5609FC97ACED82B76A3613A589132270F1BA1D30" + }, + "fixedInfoPartyV": { + "partyId": "8EEA9F1283E557C82A44435C57B248EE" + }, + "dkm": "8944496F86207C8A908DC85F1143BFD2134340CE14CE4D13E9119F20C8E61835088E882E07409F6974B63BB760CB1E14233D137ACF262F866E801DE8DB87DA69DD1D14E7556964BE8CE11954F6522EF87AFEAC395DCBF791C7EB51B37C69A8DDDA62416F4A4982D915CF960F380E31D05C0B4B5740C4966AA0C51D5E165B7AB5" + }, + { + "tcId": 2710, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDC33E97D0687DD38DFD44D94DCAD625", + "z": "FF4A5F63EAEDDFE575CC383E3EBCB87F70F3828916BB446AFCCCEB1F978942584DB38452", + "l": 1024, + "algorithmId": "68969B839C4C262985AF4EF2A0C53B82" + }, + "fixedInfoPartyU": { + "partyId": "154652C18E220077EE2E334DE31048E8" + }, + "fixedInfoPartyV": { + "partyId": "FA0B99E2FD3FB114751F0F75C7996D52" + }, + "dkm": "9527EBCC25F67DAFCE56F11DB2195B2159E266A005B054CC9E62D58F1C02F4F139B06F6469EAB9D460B9EC54FD5175D300B7CAA8CBB81AF8E2551A5F3043BBA72EEFBCABC893016FA0A09B904DBC75FD6B95D98A77DA6A456B62B6019DED0D2F39E22E8A32A0EBFC4F1AF595E62A5B413B6AA4126B1A6BA5C3FE55B0774C3F7D" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 115, + "testType": "VAL", + "tests": [ + { + "tcId": 2711, + "kdfParameter": { + "kdfType": "oneStep", + "t": "358B8AA66220D97A9C5E990614EE4E17", + "z": "58699758403EE7D5B78F8160B0A421DE8884E375477093B96E3F8D9A", + "l": 1024, + "algorithmId": "3F71332FC532043E4BB68032E333B7D9" + }, + "fixedInfoPartyU": { + "partyId": "239EA7DD848503F3A12AFC79B4A4545F", + "ephemeralData": "FB5DBC03F6E10FCF3E21E7172A2215FF4EB260D4FA2501703459BDD6" + }, + "fixedInfoPartyV": { + "partyId": "9CA4BA7F52EF240FD9822A1B492DD90B" + }, + "dkm": "268FDADF15EC6F3D84B0D34479CE08C8151E362D3DE55AA5B271E45EC80E602FC53CDBFB482303F7EE55EDD8BD2C2DBB32F6FBAD4170AD93D7E1B4B76D5FF49098A4ED0550E8B7EA33C9F6D39B7ABE247BC66881FC55D9A701280A456619CE396CC975EA2F3896BA9B25AA79E160ECB1B413F3C867E70DBECFA0F0DD4FE5A252" + }, + { + "tcId": 2712, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BE76941A44C8BE24436F031E31032C7", + "z": "109EA2D5197EE45CD69DC7D894B81C7B6680EC313D34C1E63C26AC0B", + "l": 1024, + "algorithmId": "F84F315A3B82BE4764E327DCD0C52873" + }, + "fixedInfoPartyU": { + "partyId": "A0F0B451DF59C12DE72E36D6DD223FDB", + "ephemeralData": "0727B2441BD3EF936EB3808FF91C9B81DCBBB69928E0BB6B60973A6F" + }, + "fixedInfoPartyV": { + "partyId": "803DB442836FF056478103F75FE0FC61" + }, + "dkm": "2FE1AAA7A75D4849FA1A26CF79077719FBC6828DA939002469DF2CD4820FC94DA21FC4546849010918DC05A6EBB39664287B2D10115D89658FB5DF59EF46CD9297506B7A8F4D05415D74D93ACAAC42B58928450F1AC5DCA914004A54C2269D987819FBABE9DC8F60FA995894A2ECF106137AB3AECDA1E1F90F08D0BCDCC26FF5" + }, + { + "tcId": 2713, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9115412EECFBBF91A8F46C13B1055E95", + "z": "74893DA7D0998389FB2490BA744F9F9A8F8B2130E72D59DE9C80CF69", + "l": 1024, + "algorithmId": "AACD2957A9CF3CF005E3CF341BE59C3C" + }, + "fixedInfoPartyU": { + "partyId": "F1801E303BCB30A9873F3E26AFD6F7D3" + }, + "fixedInfoPartyV": { + "partyId": "CFA1F4AF36E608191D9D328770F20D65" + }, + "dkm": "525387687AF93909E40EEB87FB51081358516F03429F622CE0ECC9F751D2096DE3636F83F3A6E40EE13E100F2944204945DE248EF1A652886DF820EB160EC3890D9DCDB9ED7A561094CB974796064B6D1D51417B87F383A90816B3F2C12A7A10492B8E5E6B009C39EA063B110A19509FF92384081FF2D21BA8B858E9DF5F1B6C" + }, + { + "tcId": 2714, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40F4B312B6AF9B1B5A129D1B1E209EA2", + "z": "36134D237628B03152DF49E097808E45A78F7C3AA75F45E94F67B610", + "l": 1024, + "algorithmId": "0F03FB81B74D40FF9C6D6ED22EA73613" + }, + "fixedInfoPartyU": { + "partyId": "9EE3793F5D25B394CBA60C4C4B8AB7BF", + "ephemeralData": "242C02B5E7385B44F283E828319B2BF08D5F0FA2D3C9D5181A8C146A" + }, + "fixedInfoPartyV": { + "partyId": "FDAA77C1E1A71C8739B9688ACDB81382" + }, + "dkm": "756419CA5C3014B9D6AB24C13DD6D66C9EACBA16E6E9121BAEC408BE2E1A703513F0EBDA726BC12B4EE54995636252729938D744E22666AB7000D065CE84E1699CA0FBDEF7B2B367B805C8EB71B4ACFBC0944C4BD8E115FCB902211578DF75336EB998C7C37CB2910C29282FB0A81E99400CA53C9F59B2BDC552E9D8ACD9C08E" + }, + { + "tcId": 2715, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23F43A69078C9B246D3EC83F3F5B6CF4", + "z": "9D29A13628700686492443072F07208CC1482CFC786984F081F71DEA", + "l": 1024, + "algorithmId": "1201D3025D3DC891D3FDEA394E0E74F0" + }, + "fixedInfoPartyU": { + "partyId": "1242E202702180DCE47219D3576AF65D", + "ephemeralData": "21875322AD72EDF1C2061BCC5A4F4BCEADE39CAB1625FF5D9404E07D" + }, + "fixedInfoPartyV": { + "partyId": "7D274144F6000925C0B8A85DC4A446B3", + "ephemeralData": "1AC3358E92264F1EF8656204780A72576E8F8E503BC73615D2340D37" + }, + "dkm": "749561ACD2A6CE464AE3299337AC155A1206EE9BF3DF4F14A39CCB7CA768B5C77E79489C3D0671FB86E13527F42463D7FCFB6C1844D30A142E2A963AB55D3E9D6946C41139B130D6092AFAB264F4A92EA45929C05CD372F767BADF8233B7822ECFF26E52E7EFDDB0A9B5A77C90368335C711ECE330E2897DE280CCE3E5AF7386" + }, + { + "tcId": 2716, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15ECEC74A7A97568D355A033B8681DCF", + "z": "52622DF495512008CEA8A3A5DFEB9283E9C88211E1BFF21D635D5AC2", + "l": 1024, + "algorithmId": "70631D17228C69A002BD4EC8CB014A36" + }, + "fixedInfoPartyU": { + "partyId": "B1A6865EDC53FFC0BC60767DB38E15A4", + "ephemeralData": "50A61F2E320C6C15F4FB3D6C90EF6FC709A10C1D44D101CA8AD6506C" + }, + "fixedInfoPartyV": { + "partyId": "695F6EBC14DAC78CDD87BEA079826FCB" + }, + "dkm": "07F8B227B8F35D7F4663EF4E707D812C6AAF1A502D265E9387381C0B258D09F97E5DD56059D012DB9162E8A0AC86C71452D45B5A40355C7DA223091C13588FACEFCFBDB2264147540F39DAA6EFDF9D917D83C5DF4D8F1B9D4D1F47EA24B6611074AFEBE406850E4514168C173A91728B5A47D8BC6BDA8F61197C8680DB06D56F" + }, + { + "tcId": 2717, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91636E8480A7F582A5805D2A914DCB76", + "z": "F26BA623144F6A7520E3B71C0ABD8FF940A72949D29A3EDF87583D92", + "l": 1024, + "algorithmId": "F9A34FFD5E64D038EFFAA2E8EE4BA472" + }, + "fixedInfoPartyU": { + "partyId": "00477B30371A1CF6BFCBD36CCA6B79FA", + "ephemeralData": "9C0013FDC425D3DDBED0D7A8D3386343EE271B428ACC649D38F3AB40" + }, + "fixedInfoPartyV": { + "partyId": "B72A3F9E155DBA78FBE35F4F22F9F0AB", + "ephemeralData": "79ED5A3D7FE49E052251DF2F63893A2E856CD84277A48864E1B8B2D1" + }, + "dkm": "B427B21A86A5216A2040157AE0310FE80841B3F716D69BF2202F8387DAB971BB27A7DF84E284DFA22AB8F5111BCCEB7160A4354E31404BB140F70E9A552A5B01CAFDB010843D5F526E6E1CDE3FE538E46C23C7FABE0160969107C9E669B76E1B2BF4C124853DA888FC5FD65C2FCE1685272E9857C931047070DFEB87D88F2D09" + }, + { + "tcId": 2718, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD1943DA9060CF56E097ADCA28574265", + "z": "A4FE34A538C4CE2FD4377608D73EB7A74D567FEA70095FB94A35310A", + "l": 1024, + "algorithmId": "AF87B71735755FD53365757354153CE6" + }, + "fixedInfoPartyU": { + "partyId": "4A3EE63905F63C81E52A78469159D414" + }, + "fixedInfoPartyV": { + "partyId": "6185A5FC6D3BCE440C648789909F3949" + }, + "dkm": "85554C14F1547AA019ABF71971F340C27D189989D0AE1A436FB66907AD517DC9BE018E335DC5722737009891B52A0E72A2CBA177FF3FB4A3FA5414511B03AB7EA0967320E7CD624EEB54E4547C6B8568503B03061450F1DFE081BB5438F8927A8C86DAA8A175E9F26C35B88E45D93076E2D72D0AF871A9E215F64C461CB83D77" + }, + { + "tcId": 2719, + "kdfParameter": { + "kdfType": "oneStep", + "t": "052692E2D58279A53D085FE2555A84EC", + "z": "69E1C492AA3A621A5EC704F1268179560403FD2068480892A24665B3", + "l": 1024, + "algorithmId": "E46965FCB519FA1C15D078E387019A0A" + }, + "fixedInfoPartyU": { + "partyId": "E535F13CE352C71F960113D48A32FAF5", + "ephemeralData": "B22906EA78422F79CB2673DE26CD0F9B2B50EAC7CADEE45CF72BE603" + }, + "fixedInfoPartyV": { + "partyId": "290CC054159871B6DD8E4F552D2922E4", + "ephemeralData": "DA6C70EF804BD523C1A5E62BBB550DB3A3D4E21A0F7E5EBC84B8846B" + }, + "dkm": "0191B301DCE700FF5425ED3967A4253DE2DC6CBB498563224C4134B3A9AB52A4E40A0B362D5C67220BFF5B65BB581081B7B514A538C7E861F15C476B6C0E47B3B439644A26876B31F99E000CB3E664A3B7EF30729F4479EC85A9A41BD7A910AB52A102969B3BC353787418290AD0089BF54B9051163722A417112A0C5D4A8A83" + }, + { + "tcId": 2720, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED8FF2402F3C74726F5A5D26DBB07284", + "z": "7546DD4C4AA1A918E15BB5BCB0438C6A2C090F7423BC632AB4FBF58E", + "l": 1024, + "algorithmId": "F74102DD61EDAFB7D6250FEAB84DA6A7" + }, + "fixedInfoPartyU": { + "partyId": "17668DB621CC8C06E8D30020C595F6D2" + }, + "fixedInfoPartyV": { + "partyId": "1D4C68B153E4D4AD968B728B31E5042D" + }, + "dkm": "B54F533F73FD05AA713143FBEC812D463F93C7913977D1B8357FCFBE88EB27F238BC44F0EF844540C7C0F57B6720D72CD2D036E32B508F93414D60215A796E1C5C77C4BAFCF352806C6A673FA9858DCD9228565B47CD694F659FB76F917B5DC4B81E1CE0BA893C0F9740E77AF589D5E9C2F377D5ADCEF786641034BA1ADF7F8D" + }, + { + "tcId": 2721, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA9A72B887671D42453EC6A5C531E05A", + "z": "5F0F9B5C1306C32A056F98FCF3E761B06259A84A104AFFF78BC51D6D", + "l": 1024, + "algorithmId": "4BD735162BA9278771EE1D7C51E19BD9" + }, + "fixedInfoPartyU": { + "partyId": "FD7A20965B544C6FF8BEBF8D14B967B6" + }, + "fixedInfoPartyV": { + "partyId": "EF5B2FB217A9C094021F8B7435E194DC", + "ephemeralData": "15FFF91199DB41292E0680A609480A6F1344B083EFA2F1D444EFE35A" + }, + "dkm": "862A09445C40889BD6A1DB9B6C97D25D3F8A2B196AB724CB25CD04374F950F92DDEA2F66F929C24DC47213B31EB0AFDB5DBB31A750277AF6264A53D40C1BA15B6C97E90A34898F212ADA01AE12B8C00B7CFB15E9414C72B42E69D67256ECA1A101D565511A210EB707AC8779F4D89E9F8550E6BD9E717B55AE06FDEA331D7BFE" + }, + { + "tcId": 2722, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D721BB74FB9A693DE1C51507D7F32CF6", + "z": "F9FF0B06741C604CA077751A00C817425B9B4398B65A0F2AD479E0A4", + "l": 1024, + "algorithmId": "712398AFD1512DB1AED5D0623CECCB8A" + }, + "fixedInfoPartyU": { + "partyId": "C43E3DD1E7474E1FCE2C7A0BF639D936" + }, + "fixedInfoPartyV": { + "partyId": "0F1ECD04C3448A8043FFE199A0259E6A", + "ephemeralData": "E8F08AB23AF79D58D96C9CFA58220FCE902ECBE1F9EAC74FA40ABF7F" + }, + "dkm": "57C1DF93655328800EF52A8039EBA3BC6B99FE81FB1D681D44315D1A63DA9C350DA75471E036BA5E5371511DB4C7889892E9A400B99D5564535CE1A2F1389271A481D5481F1E2472DA06B7A4212545AF9C276CBB76AE5DFB6B65A3E7F9F098249084B2027B4C60E387BB598434374C95CF3751D57E2E328C35ADEA08181FC8A5" + }, + { + "tcId": 2723, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F01907161925164E725A3B123705497", + "z": "47B0C1090795878AE9CD5B9CDB88A1B495A46EEFAB41413D953C772F", + "l": 1024, + "algorithmId": "8E0EE2B533C17385FD1F809915A92FAA" + }, + "fixedInfoPartyU": { + "partyId": "4333C512565078A63D046271F58BBDED" + }, + "fixedInfoPartyV": { + "partyId": "917C8C35E2A8D418C316C4B7C9C33290", + "ephemeralData": "5C8D583175F9357EED8E79085253C5D6760A24354A9C5223AFE231BD" + }, + "dkm": "F5AA89F8BEA7EC053F14FEE0E11A50F42BE2E5188735F1BB5F0B9E203397F9E2B87318937EA0F67A6D1E7254604230A52D408D775436BB7F2DAF61293190A487B5B8803D2C718B0611F92EA06627E03550A1FD9461C66138969DC23925A681D2BCC9D95902EB32E7C1618DF755E2F7AF0117EBDB139E8779D3BCDD07B802A61A" + }, + { + "tcId": 2724, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F8D661127EAB7D38C624C7761B3DA6B", + "z": "EF69668DC1864EDD96F813F6BD49E7737718A010935F8A228F8E7224", + "l": 1024, + "algorithmId": "361EC6E0E6EFFAD8AA8364A63CF3EF0D" + }, + "fixedInfoPartyU": { + "partyId": "D750207BE1148E376EC1A06C71995C7A", + "ephemeralData": "FF6786DA26D20AA706B4197020BB02CDEBD671F76EFD312C6DEB19EB" + }, + "fixedInfoPartyV": { + "partyId": "2E75039B2A4D817E4CA28EAEFDBD1A17", + "ephemeralData": "CBEEA26E603F3CD8B4DC56FEC9A692C546E08BD19C070BC0588C6A82" + }, + "dkm": "567E2CE67252FD8C1BDBD066AD018AECC4517C366DF80BC9524E8E3BC17D79F00B0B3EF2D5AC6BE51A54E8849C848F648E73E64A0A252237159D939EED038F0E1CF0F7F5EF98AD6C4E91BDF1D538233ED657E19AC7B636C5BE96D493A441C3C3B3738FF84D8CF46F07B04C80F2B1889C8CAB812888D42D91EA910219CB38BD29" + }, + { + "tcId": 2725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "50AF0E1D1FEF0323109E444532F0C4CF", + "z": "9F6B5E447D788EB5AC9EF5ADB867189BEF60B10337356380DE31A21A", + "l": 1024, + "algorithmId": "F546BC09DD9A9787631DA11650270427" + }, + "fixedInfoPartyU": { + "partyId": "8135B98A115E08BE6EC949E77846FEB1" + }, + "fixedInfoPartyV": { + "partyId": "9180D71C53C9A1617936E7CC56FADA0B", + "ephemeralData": "00A885FF1017E5BB333B5AA3C514F5C384882E643E5FEBAA8D7DFE84" + }, + "dkm": "BC9CBE11938FC082CC0633573D89A8F26257DCCE22F84648B389E76E4305D099F5BEDE194BA8DF1F2D2D8868B191788F90A982CA5C659849C68550C369F88B47C090D177CD162CBAEA5129B457614BC72E0B6B764BE779D39854A474C8E0760395B312FB3BFC97FCCB6759CE0089EE42B1164554529AAAEE4C066577E19B9996" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 116, + "testType": "VAL", + "tests": [ + { + "tcId": 2726, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32711B766C14D84CEAB9D159E49091DC", + "z": "D945749506CD8A9F2A9A791DDBF751F10F61604A433B71ACC39FE1F31AE002D492941721", + "l": 1024, + "algorithmId": "493737F167A6062243F6B303E664D6AD" + }, + "fixedInfoPartyU": { + "partyId": "1621D09CDA3EF53277F075B0D974A5A3", + "ephemeralData": "33334CB768CE8EBF3B27A87F617B5F87EBA5A0622B372E9814697BB5685B75B920CF4161" + }, + "fixedInfoPartyV": { + "partyId": "303AAE06C69A6386FAFA71192FE9B876" + }, + "dkm": "C6F589A7EC5748907A1324A9A77314FC4791B656F058737FAE296F6DBFF2B1068FF8F72D9B9CDBCA8664BE4D3CBCA6FD3BF2FCD46A4E23A6680AF1535DDA42B4CE1277279DD866B0BFEB317A5BC2F0662A60B260367B9BFC5B85AD49B386E12CF22ED2A7AB89BA6E7EC4E962D65E236B9F2D6AA25BD375E33984200168CACB56" + }, + { + "tcId": 2727, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9179EF401CA1DA1C454CDEB2746643B6", + "z": "90137DE6947A1821FF4814766052B131C85C017EE87849CE7D1D6F3FE7A31CB5AFC2F139", + "l": 1024, + "algorithmId": "19260C824D0E6084BB34C3D96459C23F" + }, + "fixedInfoPartyU": { + "partyId": "3E9EB961D276CEC142347F9F9A64764A", + "ephemeralData": "1D34013B7A679D759DA89F0F7CB228C29D079DE835519788F527C6A4D4A139619F885FB1" + }, + "fixedInfoPartyV": { + "partyId": "1B799C2437384D0DB8FBC6C23DE8F18A" + }, + "dkm": "17874A063F68182183333722C2878ABE711196158D27696206D287721246F5C8597D7DC475D9368F15FE57DB13B62FA290DE83567500AD274B680A31F1483AFD59CCA1F94A872329ECF2D369D4CF82045957FAD955B3BB2975171B59DF5536ED6BFF4E4F9A2FF9FB9FE070A12C7A23B9E0DE97DDC890E5694331D959B5AF3357" + }, + { + "tcId": 2728, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BAE97C9F9D4A8D42FF6761155AA09595", + "z": "44482B8373CF7AD88371DB547369B556794946A1CE1DD685BBBA20086D09FFC5C1B91948", + "l": 1024, + "algorithmId": "1774705E90E56CF06E172311B4DABCD4" + }, + "fixedInfoPartyU": { + "partyId": "58FB7C706B79ACA7F452338C9551B3B7" + }, + "fixedInfoPartyV": { + "partyId": "8D5A3846518D95858DE96C46B0936470" + }, + "dkm": "2A3BB89C71BC8C2C1040B08C5AFBBAF40D5EF10B80EF33D0AED4B56F1050B41D0195F9B8FB310C3EEF08D6D2FFF3486FBACC99FEDEE1B380C4D15875C004F964EB66E5B96B41E1D4A2A570241F7920A182C043C40A7F81B1BE97822F1DD8A45866734491D25A17EEE43CA28EBDB7A13E2FD16D4021C38F9491747C42287E1257" + }, + { + "tcId": 2729, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22BEF249A63DB89C3D6F5AFA6127AEF8", + "z": "9D7BE55A853FC48F8B1E62236BCAFFE06A2ED208B68F66C37CE94FA3CD4AAD2F6582D299", + "l": 1024, + "algorithmId": "2464FD7014081978886ACD43BB9F93C5" + }, + "fixedInfoPartyU": { + "partyId": "769D87283679F271ABBE59634AF5FE7B" + }, + "fixedInfoPartyV": { + "partyId": "EADD22640FDE3EBF8ECC421708994254" + }, + "dkm": "2CE1E03B1244F484ADBCB7A9EB15DCE899A577C4620F5960D26F24B1641FF4C6C2A5FB9A968E7CB234A0B62B5DD932BC7EE44521AA52318E7C9A30512017F8853BBC6337611C43C81087005E152934AC9740A2A2E2D347920B863A333C61E8E6037DFB1BEE28D273D876A2C80C95ECC333C9CBE0D73532C2FCDE11E60D6D617E" + }, + { + "tcId": 2730, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4781ABB934B5868599233C27177CA13A", + "z": "D6F505BA11B719D50874526A8FC392B6CAED8AE07A9C6879380B8D2B27CD0E614BE9F21D", + "l": 1024, + "algorithmId": "68DC50C9134D3BBD704E8B8FF9EC8ECB" + }, + "fixedInfoPartyU": { + "partyId": "2E543BEA1C1FEB309AEC54D42C069167", + "ephemeralData": "74045488C59A1E57327F5E29A662F6C1834F13C573747DF9D61151C49A0EE0592F8B90B6" + }, + "fixedInfoPartyV": { + "partyId": "2824A8AB6D37C4DA031091F7B00DA769" + }, + "dkm": "0D72FAE65C136545CCEA8D8F2B51AA2896E21F242FA3A037025883F466AEE65F0017F85CCFF91FFEE7D89D74EB05F73C15AE822A317386F36895C0DF40BF4B5362713D8450605C23C0A0D23F2FE7BE16FC57F8FF1046969E12002B84D2021053D68CB644EF42D0BE15F151385A91992468C61E1ECD3D04FFAEC828A1378C1BEB" + }, + { + "tcId": 2731, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0562310D905A50F9372E77FA50E38F3", + "z": "398557E27DCF31CCA5CC6A0138F45220DF3C998BD61E461F7A1C9E486537EA7DD625EA3B", + "l": 1024, + "algorithmId": "82D8CB23C14839A1E00BD14ADCFD7320" + }, + "fixedInfoPartyU": { + "partyId": "774E2E86C973F7CAE15CA800080401A5", + "ephemeralData": "876B9658E39E1E02F60A6D13F577DE34948930E5C0C8989FCE1698921E13D4EDF5E8D077" + }, + "fixedInfoPartyV": { + "partyId": "FDA108AB5E2B13450F6EE9F02DB8439D" + }, + "dkm": "2242D9C92FD52CA8EC1808D894A553167FD4F6164F1D194902F8086C3E310DA2EE75009B84035ABCE10852F3C2C7F53B019D459449C035263409E4E506B45B75E1FB025D495F2AEE04DF382B3A353BDD9178B5D5A610680AE49A7F2F0EE8ED4739325A7A13D06E618B8382674C017D268B5E7B34BEC93F1B746E02D251689767" + }, + { + "tcId": 2732, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DDF9722AE60539110CDFE2AEDF727A9", + "z": "198C8A00A630DAC08E1FAA7B4F205ED3951DEBE0BEBC36D82622C63AFECA020473F08C40", + "l": 1024, + "algorithmId": "F0BDEEA5CC28DF3D528821E2B0BA494E" + }, + "fixedInfoPartyU": { + "partyId": "37CDA2975A37A6DC64B3F85CA7EC49FD" + }, + "fixedInfoPartyV": { + "partyId": "AA4E267C955F3E3CE359F7A16BE1C949", + "ephemeralData": "36E1F3B0E87F5FCE53BA20C392525BADAAC1B62CF80D1EF7C473D573BCABDA3875FF96C0" + }, + "dkm": "AD4EA648D16F477395DBF3BA79EB69A7FCDC5950CB12C241C5474774141DEA21826DD16A39BB429689874636040F4F4305AF71AEA8D1BB0823DD8C1501AA22CD9B7D21C9C4032BCB92D516220043C1B9EC426BB3773B4E741880A661FEBA14488D477FF287415E1C714FCB4001C27BA5C87E7FE79F557EF90D9873FB60B39841" + }, + { + "tcId": 2733, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AF980C5A29409DE1A2E85BC41F1AB581", + "z": "81C4D6C87F9DAB7A230EEEDC1B02113F5791A0BB3767FFE920BAFD7EE2990285B117196A", + "l": 1024, + "algorithmId": "ECAB10A0B1FACB73A658B626FB196C61" + }, + "fixedInfoPartyU": { + "partyId": "1C0EDA373B0B95F249E7E9208C8B565D" + }, + "fixedInfoPartyV": { + "partyId": "FA4B21022F09BB0BDBEAD1AD2C51BB48", + "ephemeralData": "49D2D240C073EF1ADD2E14B0A085B0D35A8FEA9A2F209B51DE6BEE1329CC0A30B3B2C408" + }, + "dkm": "EBB1FC012513D51E7CAC715E8BB700E394868260FAA4875629FF78936D64037DE556C6E54EC59F82F1FE0C6F99C7B5468166FFAF9E6EA228228B0B69D4A21BD168A6BF0470FEAA1B744FDF396568BAB47265A51A9320D82AE221EFDD5A6E28E65052570CFBC7A8B9F2F98F2BEBB473E1E29C0AAEEDBCB330315B6E6AC49E40FB" + }, + { + "tcId": 2734, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4491AE6CCA47E329C771AECA525E9DA", + "z": "1DD465150034B3FE368CAC7D3AC7EDF7999C9B90DBDD3957A3844F48CA5A3C6202B46C7B", + "l": 1024, + "algorithmId": "B1BF758A4F195E1B1B80A3B4BF48F554" + }, + "fixedInfoPartyU": { + "partyId": "4A3BC9A0F944D3959D5C5A8F9E4FBCC0", + "ephemeralData": "A76582E97834969368AAA429909C09FE4CD41ABF65F28E841B95CC23AFB5857AA58EBDAF" + }, + "fixedInfoPartyV": { + "partyId": "AEE09451451082C78E6BEE9937457846", + "ephemeralData": "03EB1085B5FF166494A7C80D9E10B29DD4471E4A2901311C978D1C4DDBD57BFE20A57FFE" + }, + "dkm": "025761A376EF297EFDEDD59DF23A896E111C69E2C193133AE8F32FC9D548A9897D56731B15CBDBB9EAB4D480CD0DA58339A10DA934DD1C4864738E6F35D9A8E5C16BF35E22D68559DE287B77929CB6F55FB7CA1021C3D8111796BF548CB71AA08F83D451ECD55B14268B7DE2A7097627D6F6DE1BE0975D1D86C0EBB8C7D86752" + }, + { + "tcId": 2735, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CC44321C6B1DFEC75CFF85915873A21", + "z": "EEB11D69F16FB70D01D05062FCCCB9333932E0A44F7343D599C1E440D6E38BAF4F5AFA72", + "l": 1024, + "algorithmId": "EFDAA31C36E70D25A82219100545AF1E" + }, + "fixedInfoPartyU": { + "partyId": "38E8235C7F0EFBE6EFDDF8ADB58EE31B" + }, + "fixedInfoPartyV": { + "partyId": "151C8B2FE2DC275C53911661111E1867" + }, + "dkm": "958C5F1F865AD261621DD682F273DA379F590ED70D1296383594ACD58339FD86BE2DB9D17B45E45201C809BF9F63B870DD991665172BD49B58CC9CDF189B20B4D53A894546ED37181A6008D41C853326850184E82DEBF09517320F4B93348ACED8A2C09D5D43C19D8D632EDF7A408FAA5B83328A45F59A36F907FBE0B8680569" + }, + { + "tcId": 2736, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7DC03802CD2289B533B86B5497FD5BD", + "z": "BFB9EC6BFA9D30365F11E7A85F06E8ADB73DBF794C74C8583475294CBCE800207CA57078", + "l": 1024, + "algorithmId": "993A5D2F319447FD1D5D0988AD3BE4E5" + }, + "fixedInfoPartyU": { + "partyId": "C0B385B3D3FA06108BFDC3EDBD79BDB7" + }, + "fixedInfoPartyV": { + "partyId": "0E6CC97B8B1B8689EE38D346698FFA24", + "ephemeralData": "F7EFFEC58E3D94FFE13C64CE40EA70552AF24734DC7DB1AB3EECA24E7BEBEACA8045BB95" + }, + "dkm": "4BB0A69FCB47FBDBCA5D501667CE6C353150F458C6E8EDA3CB24056FBD00ED97A4ED95ED6B6FCAE2FD288DC3FBE9A075759A68DD3F113992B926D9D7B52E823CF640B4775C82339AC063497BD956A0670456D23862718CF546E3FD9E8063A0FB185E5DB585B4B7636DCB080AC5E126B6BB4E621C50751976BE79649FEE1F462E" + }, + { + "tcId": 2737, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02A115707B845443C4F1811BA34AFC45", + "z": "2AA9FEC235DF4EB30D5790F430E0BD4D46BD22E72FAA7A951D46185E1D6A4C29FF6F27C1", + "l": 1024, + "algorithmId": "56DE4E526B00634A4FC937619B54E5B1" + }, + "fixedInfoPartyU": { + "partyId": "4E9454AAC92ED43B03442C91F82DDEDE", + "ephemeralData": "4967DE90B95F628E6120F4DD7820B4C5F408517FD1965A1038106A5DF5990B3F4604B45B" + }, + "fixedInfoPartyV": { + "partyId": "022AF898792ACA34C2340394D39EE4A4", + "ephemeralData": "4B372D5C3896C9A6CA12435D80C16035B39B2C4CF332A8560BFA6637EB4A698C94A69259" + }, + "dkm": "3C43F598152F62C66706828E22BA2B5CAF85B0DBC4E1236380796A1FA2937FA3CAC5F872DBB7AB7A875881EFAF7FC61FEB5E78432D6132D4B98F4D397C78497D5CCF888425C3A9154F1C2A64B1FF11068E26F04780093FD945D34AA0AF9191970A90F02EA379C413902B9DCBC1F9860104100119463E8E98A83BFC6F15671028" + }, + { + "tcId": 2738, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43AEFBF64765A7FDA8F2C155989B5B76", + "z": "63BF86EC95226F058DB0CFED4F5FAA37484B06739B96C5BB673DEFEB635C6F4B1C52C0BC", + "l": 1024, + "algorithmId": "258B07237CC99A9019B76A34AD77E011" + }, + "fixedInfoPartyU": { + "partyId": "EFD4C91037EC8B8465AD38FF07D96FB5", + "ephemeralData": "7986E6339A3B7C78E362CBF9FDFE48442D03E63205357AA7CC7C5DCEBF7C2E0261120C66" + }, + "fixedInfoPartyV": { + "partyId": "E3DE31B610DC9830DA30475D41B202AD" + }, + "dkm": "B61EEAC801CA19F8747E953206436656CE50470AA78583E5BE08074BD4621E9268AB744C33C08246C265BB18C0BFA8774C7EEC1BA343BB6713610164142F4F477014BB4F39C2DF9037782A54A0EE95EB0B6D9B075D5DB3D8F2DD75F82F4EB7D5A17F6BFAA69C2FEAE8D07A132D5911EF57F7BE6C92535E9A29BD58D06F628FF5" + }, + { + "tcId": 2739, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C157973A8D66BFCC00638972F0F03925", + "z": "D6EAFA025ED1C03BD3666E7FAAC13354469DAFBF039D737328EED5C01BDBA25254E02039", + "l": 1024, + "algorithmId": "2F6F97F723BC59F50C4DA292336FE233" + }, + "fixedInfoPartyU": { + "partyId": "8ACD6321588D3A9A9D2FD45E82DC1AB7", + "ephemeralData": "8EF16447F2D8B10DE1440F240480E81AD3A44CC68878269003FFDF083CE3D5365E056C10" + }, + "fixedInfoPartyV": { + "partyId": "175AD015140A9A2FF55546F8458178E5" + }, + "dkm": "1E12F8D584B3B2B121FB73680B7B992037AF78C6B52C9DE006C6FC35DAC0F72C0AD3FCB1AFFC7F593DAAFFE451A8264647711EC64B97152DFBB9C41AFD2127632630E52AE518B7554C810B16504CA7325112D139B1AB8F7DB7C6552BEF6A4B1DC7319A9ECED43E0B60430D2897E6D17FA41381CE7E9F6F9D57B335509406B754" + }, + { + "tcId": 2740, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1F71AE1EC5A93A5E9BAB630367B03A3", + "z": "A1F4C1FE4AF66FE337B8409CCECA0EB1B81B095765890C2EE45AF9B49D7828703A9B3E54", + "l": 1024, + "algorithmId": "9A861EE04893F665D75B3DCA5D2A5784" + }, + "fixedInfoPartyU": { + "partyId": "D794F40A98BBD65B3682DE8A7B294C83", + "ephemeralData": "A1C04B1EDAEF2C1F85C672938BD32EA0DF0BE2E7186CE5100344BA416F2F9DCD74451F3E" + }, + "fixedInfoPartyV": { + "partyId": "1122804EF14B323D23490BFAAEB62CAE", + "ephemeralData": "EC2751DD0A9F36D526604DAFE594E55C2BBB6ACA24C4E469CA1450AAD75AE0BA4C105EF7" + }, + "dkm": "D06B3DA559709451E0382FEB960882D6EDAFCE76811F00D28103B901169C5A9A95FD9FEEA3B0E9B1C2AF40ACF6A513E3B185D00A32F3DCE016970CE3C796694C93416D50165F92F553F2BF243113AE9C1820EA2B717F2C8288E380E8B9C0C36BD1D9AE6088B17921BFB678CCAAFDF768DA95DA2A5E59EE1415D241F8A24E0682" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 117, + "testType": "VAL", + "tests": [ + { + "tcId": 2741, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C953739958D6767DA285943640239BA", + "z": "983949E939B2BBDD4EB697076EB5C6DD9A0517E1BEFE4AD38DEC8AB129A3FEA4F1", + "l": 1024, + "algorithmId": "6D3B1EAAC4272D70827FC71922B87610" + }, + "fixedInfoPartyU": { + "partyId": "50861B2A0E6FD616AF0943971F06D2DA" + }, + "fixedInfoPartyV": { + "partyId": "118AA3B3D7F64C54470CEADEDF715BFA" + }, + "dkm": "9E156590DDDC737C29276DA94192EDA4505C75B3B7E72F5B84A05D14BE5F4F17C9B9E4647618B35CC9C7AAB92DC22A26A735D526E0405E639E7A166FEABFCEB8E5EA186165FC13356A848910E20C9E7EEED6DFBE799AD61C3A6C1EFD5BEC9A5E5BC8AFC051A966F925AD98648ADE91DAFC7E01BC7E5118853E9B28C8239804C1" + }, + { + "tcId": 2742, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8E152A1BF2E9D9C294022135F4F085D", + "z": "1E4AA12883BA6A933D3D3BA484BABDC5CAEB573664043C55C3E462A36E5CE409A8", + "l": 1024, + "algorithmId": "A7B4F2529C240838882ECB762A943855" + }, + "fixedInfoPartyU": { + "partyId": "EC3634932DBBC96D59C5D3A8FECC5C4B" + }, + "fixedInfoPartyV": { + "partyId": "0F702744D60A6814C18E20A7A22A2AA9" + }, + "dkm": "880C4C431B437EA6EA75E44A067DDC749E32017EAEE8142F06F1E380277D161BB4F758CA5F9B6D9722953A195E8F4BEB242E9ED166355614EFB99F70F8876D2A6F8E249CFD6F38403CC47FB1F9BEACC6A1082246B9C62B6573DAF71E8CB41626E19DA367F1DBF49EDE70BAAC2E283056AFD37C7842298E37DD2045B5EDF62471" + }, + { + "tcId": 2743, + "kdfParameter": { + "kdfType": "oneStep", + "t": "584DB35036BAE956A35B33189189AAEB", + "z": "108B82E30D3D595A87757A551A1678CD32A9563FCFDC5C7C130E0425AB4F5D5BC4", + "l": 1024, + "algorithmId": "65C75FA377915D3ED31AC726AFFDE3A8" + }, + "fixedInfoPartyU": { + "partyId": "9216D37FD79C7D7AA5C5B9780248B238" + }, + "fixedInfoPartyV": { + "partyId": "D1F93001C7CC51C8E7E06F3D363A8304", + "ephemeralData": "05A24D78DEF967AF1A6742FAD950FFDFFCAA4386079EDED7A070B214BAA70E8C96" + }, + "dkm": "011113FCB225C228D241AE0F8EF119C981C2A7965097A2274EC2110CF9F94198006ADD3D66343FF5A5BEE22763E4F5389F935F83D41A437779876B585B1B1A7F0DF2AF8F448CABCD3B14B0C75831F5F6EADD02DACB9BFD6206292953C5348579FA30C1BA454E181CCE62A3CE68622895DC819D0A5EE22F6DDF8C74E5DB03E944" + }, + { + "tcId": 2744, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99C5FF9F9BEB96764BB9D46EC7E0368E", + "z": "6FBAEB8C01ADC63461A33DD35E8329CF853060B9974752E2B6661BF4D51595FD7C", + "l": 1024, + "algorithmId": "ECBAB1F049CA35B98A28EC443C801A78" + }, + "fixedInfoPartyU": { + "partyId": "35BCB372828C10791A9A17A41CF2CC31" + }, + "fixedInfoPartyV": { + "partyId": "98F729656D2DA0B4F1BFA93A42D6CF16", + "ephemeralData": "E995E614AC6C76F02B3323F62DE41B7646780981EE21B1C3E4688FB8E0136DEC66" + }, + "dkm": "313A0874BD942452FA7E260CEB3CF20591B2FBE4B67D16B1928F8EFC7B2CAA2F458B9A3C8A4F9D131F2CB639ABF55C6AD6C658DF84FC42D027AA7C7C74B7F2873D96147D0BA42959319DD169E9959B81047CB61AEB4C7E264D522421CCF0F6C3A7A634B18793B4849E65718E53EAE7A3D6C0E69800768AFE02C95363897E209E" + }, + { + "tcId": 2745, + "kdfParameter": { + "kdfType": "oneStep", + "t": "94A67EF9D524D27D5726E4EEBDF07562", + "z": "C60522F4C6DE8F23BD11262F85C8F67DF28ADC7EE83F24EF9B40334E2F63FD2866", + "l": 1024, + "algorithmId": "6F5036A2CD996D831CC9EAB10D7BE3F5" + }, + "fixedInfoPartyU": { + "partyId": "F5FF6FE7C0FE21B041143FEC38796704", + "ephemeralData": "E990B4D651280DD587E23D05516317E3781FCDA77955BE0BA5EC02360FDD877CE2" + }, + "fixedInfoPartyV": { + "partyId": "307937EC5533474C7631F5E87DA5112D", + "ephemeralData": "F7949D9B8D09BE05EDE5EE8FA127964C6B2E56CF9ADA283A56A43FDC4792E88B6E" + }, + "dkm": "40B6A0DE1B49B02C897A3194F91D9D04DF3EFAFB83AAD87E9EB7A156617E5798B27C2431ABB70B83EAB0150F8B40B177F964D4884C3DE55A6EECBAAF4B1040B248A3F6013A7296B65A14DFCFFDA52FA598F745F538908CB23C1F90EB5765252FA5A8E3808A22D3D438B3D2D46C339A30CE67B5632675C56A42388C377520A384" + }, + { + "tcId": 2746, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5F3DFB1F8D6C16B128EAA9F29485114", + "z": "3AA8B358335B313307A0824D88097370A1F483EF8636BB25E72658DE36D43785AB", + "l": 1024, + "algorithmId": "3DFE5494D94B2D8765510A1D9D46954A" + }, + "fixedInfoPartyU": { + "partyId": "3E7C8C57EF7A4221F83606291C0E2E56", + "ephemeralData": "1CB4A7AFB1080B66103C6A77D774C130FB12718EF2FDAC02CD96025D6DE96B4057" + }, + "fixedInfoPartyV": { + "partyId": "09B42FFB8A035B860CD0E9503C720152" + }, + "dkm": "F059478F0769635A4B689560293C77FAF33BDF22B121E2E289D4AE3303CCF86F6BE4E7A8FB018CE8E338D7D97BF554F7D7028F441E0575478C7B9940CF5CD280D683DBF0C5C133D1CF839E990EB002BABC25330C524643E59FFB027A488B6775184C7A20F4B4507549A6BD1B86A775A85BADE12B9059BEA4A841BC503233AC6B" + }, + { + "tcId": 2747, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2FCBC4C5A0A1FF24B6BD6B71BF9F14B", + "z": "3D477FF5B9665ABDAA616265E6A7EE4AD7989718E3B935EB7901E1345D5B16DA0A", + "l": 1024, + "algorithmId": "3C33769E1AF83903CC50C4864D081638" + }, + "fixedInfoPartyU": { + "partyId": "88DA67B2A0CCA1F80F17DFD75FC41045" + }, + "fixedInfoPartyV": { + "partyId": "EE6B83477ADA9FB0B578A4CC55CE0282", + "ephemeralData": "B2601DB0953C3F26A94C6B79E8797D7347DE7F55F8C095C4EE97D66B0039D2089E" + }, + "dkm": "03382B5B810EA62DAD2454E132BF55274683A6A04E1B3D7ADE05D8276344A91E3CD52ED30306F4E0DC0FF2D6697933E4FE95E19BDDABC72496900C84443C608452CA8E0148C20F5EEA9AB8C411D97392E07C77EFB86DF1F3AD1E01F91AB9C49BC12DDA8307B5A9711CC199818F301DDD6C3B92EB6C0296E7D43269DB4714F7D5" + }, + { + "tcId": 2748, + "kdfParameter": { + "kdfType": "oneStep", + "t": "493A29A1A5A9926C89D6BD1EF94B384E", + "z": "F770EA41B70EF02FA1AC00A06C798AC4092F1E560A7292368C208B23D6991356E1", + "l": 1024, + "algorithmId": "CED564019B55329A8BE760A15DB8786A" + }, + "fixedInfoPartyU": { + "partyId": "74157F632AE76C2AAC2BF73B51ABBA0C", + "ephemeralData": "9ADBB03D82193341CC5ECDCEDE729CFD7A214C4B697D32A6F8665540DCC19FDC9C" + }, + "fixedInfoPartyV": { + "partyId": "9A20C12FF85043EA55792F36D00EA43E", + "ephemeralData": "7E127F9D667C8AF41D22CD44503EA62BE357F6BBE43C0C9BF4400ECE9A017981E8" + }, + "dkm": "05F56A09C22471AFB8F70486719CF9802A4380559C995B7500B4DC5E13CF2D6F94516A79630F4404424B5AB564C3B580C4587989DFBA200F38C94F8E593814A781A497D39A821418BBD3BBC1B44C8CB44CB750E63117818C4B39B2B9F528F553481A04F9BB301A21032BB13D7CFFAC3C264CAA268B0FEB144FDDA286F240466E" + }, + { + "tcId": 2749, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEBCFEC73A8D1BC0602650BF6CD6FA70", + "z": "EC47083609688828959FCC2AB2E62430E8836C1AFBB846DCE4AE46F75F1EF10C7F", + "l": 1024, + "algorithmId": "296DD0E652B8A845CF7096834889BBEF" + }, + "fixedInfoPartyU": { + "partyId": "AFA6656D09E28728B478CA4EDFD9D3E9", + "ephemeralData": "B9E1C22895E9A38A32AC6699A4924711CCFED4AEA4DE6F37895140541CD5D99652" + }, + "fixedInfoPartyV": { + "partyId": "0ED883D50892C58D997ECD166D71E3FF", + "ephemeralData": "DBCA065DA3D3D417F8C844B59163CAA5258D7461BB56B191A22D30B8651C5F53A1" + }, + "dkm": "4AFDB85BF0DC71269C470EFEE55027CE7763CCDE6B00A87314416492745463C3D38155CE03B384812CB73B760DCB1B7D0879A0E97B4FAFBEC91448F8D5657FFAF4C367425677773D2CFA295CA6D8C035ABE0A0AE535417AA15706DDD2C5FFB71D91FE828AED54C5BC01023822ADD9191E775F75F4BB1D370AB45667F49CEFF54" + }, + { + "tcId": 2750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C88D8D4E07A8EF4C1B5BA4E4BABAD5E", + "z": "E8ECA990269679DEC7E05B53D13542649BBE7530AB63E200AE2486D115C9774F48", + "l": 1024, + "algorithmId": "84E3603B542970C47D71A0246E9F7D9A" + }, + "fixedInfoPartyU": { + "partyId": "18C41551D74E9C86278D6E1AE8EB0BAC", + "ephemeralData": "7DB5C875080DB64B0DB5F580D58A24FE7BF6571DFEEF57370197F4F5AB52956F45" + }, + "fixedInfoPartyV": { + "partyId": "F67F883735371851F716019556394B6A", + "ephemeralData": "1636C2D57FBE6884920EFDE59F1DD19372A16E8B8FE63E5F45E07AC4E68E9F17D6" + }, + "dkm": "0D384F69229097285605679D6B5D97F1E16514BE3FD577F10EDE08BB25C355255B0CA9C6E78AD6E2104A4CBB7377E50FC10AE5228450DFBE7CC01BB988627DAC6AE7656346C0A3AED208EA33B16C97B7CAEE9DBDB4A7BBDA214F7E8DB22FEB496A34D8C1D0B81898160D6D4DB9292D24692B8CFBAEE8C02FA47BC788E6D9EC28" + }, + { + "tcId": 2751, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EEA8CDB986FF408F23729B5E1AD2F6E2", + "z": "B6550AE2F28BF3A482242D0A19C491C4F4A97D5130BBE4C9511099D39CB543BE36", + "l": 1024, + "algorithmId": "71E31BF289E45E23C368F1CC82C8F4BF" + }, + "fixedInfoPartyU": { + "partyId": "C33EF3B7B694C9C15D0ED42ED73352F5", + "ephemeralData": "C7B4B1CB6E9940576783F0C6D149FE3A048EBF6E1E0DE0F7321F902CD4E33BF491" + }, + "fixedInfoPartyV": { + "partyId": "D55BA34F2DDCFBB8A22520D31A16519C", + "ephemeralData": "C3E5B4175513CA19A6D8193074A81D81462C4667B0F7EB7C7CB803CB837A3FB8B2" + }, + "dkm": "C9F02DD7BAFB8AF8AA799B63C9C216F73CD690A4D66BD384A1542AD999294EF8ACC31BC7DDB3B1D256A7BADD1D83D1C84E35415887C01C5C2263D34BCD2730E31CF68AED3CD40F53D34C539E5D31590F38CBEF910AB51A316880C9B3DDF7D3BDFD15C7C896240B3A80A5348B552DF490BF2D6286F4068537DC677971F53B7ABF" + }, + { + "tcId": 2752, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FEC94106F97DBBB44741E4CC68CEC55", + "z": "F266F7C7C700A1690F332440C40EF51CA7DC3EF5549A86EA07460E1A9020A17900", + "l": 1024, + "algorithmId": "E4FD433AA268DFFA07375EDC5DAD8351" + }, + "fixedInfoPartyU": { + "partyId": "9DC6EFD99761BF45DE3B54DDA2C1A1E9" + }, + "fixedInfoPartyV": { + "partyId": "20F2407F0D7927116E54C0BBDE9FF3C8", + "ephemeralData": "766E7EC5D0C22CCC346CE12D14C603FE0C63DA7A359BC3807E2FBAC8CA397D546B" + }, + "dkm": "A91574C6530084E43D3144A991A7455449916479F64E1F0F18BF729C6087305159DC547668BD81946656963A9287BB691E19C79BF7D6889366F60B3FC72EDF55CC32600AA343EFC8387179E418501C9193F9722FA2B505BB79F1B27C69ECFB02A798D49139D66AC2520D21BFD80A4E1A3FF973EE379C98059068D3D83585A160" + }, + { + "tcId": 2753, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A59C66CEA43A8E12149D8B1DF9259911", + "z": "BE71D307D4D927F4CF40F7807C644600B145C7C9AC1C5FF79AE52C600824C9B54C", + "l": 1024, + "algorithmId": "1B1A913CEA5E5AD7A2AB0F6739096DCC" + }, + "fixedInfoPartyU": { + "partyId": "C64868812C265E3F6DB112F5C7879DB9", + "ephemeralData": "13DF8B4E13D0223DF795EDBB7D402CF35EED2392105239145489BECB29371FCEF2" + }, + "fixedInfoPartyV": { + "partyId": "02CC2E1A77FEA03EC8D19087510515DF", + "ephemeralData": "CD560EDC1DEE1A3F775A63D69B1E7D313F59880675EDA9EC408AE03777851B7523" + }, + "dkm": "B3B33091523471E5B5BA1555D3D6F5E325AC9318F3D80D5D7B80FD26EBC1C334B3163625B60414A7A0D5F705D346E80709922ED167898EC91C86CF62F56A49AE759087763FDF8DF26568DE150AA72C25F3C19AE875F564DAB78C2EB658A0B9F0647E867A2803CF79204A5B5382EBFC846BA52BE8D5CEE89E6036AAA747838334" + }, + { + "tcId": 2754, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C74471C7A4B23F94F641740C47A16AFF", + "z": "8A96B1C8D70002BBADAE5E608827AB438698710A6EEA2534DE2ED4B76B2AA51096", + "l": 1024, + "algorithmId": "B4BC6D831569CF07786C894097B1EF22" + }, + "fixedInfoPartyU": { + "partyId": "CE8A87574ED7687395484991C7737EA1" + }, + "fixedInfoPartyV": { + "partyId": "8E831657D3B4AF7DF7B2353F1CC5831D", + "ephemeralData": "BF53521CC1949A14CFC048626ED12DAABC327834565F86F7149262F9F5D1FE8BCC" + }, + "dkm": "7E2A351CF360A2B25DAF305602292B4D635CFBB5FC295E38FA1944A489AB0B32CA8DED232EC48BC30DDC2FA5512DB4185FC0880F6F6B03CDAA1CB52DBB0010DB95835CDD82FD1DBFBF89C7CEB83176CC88CDC1E01004B9097BFD003FCD4A15972DB2328183877F8A03F872FDD4BF25BDDE94F6A1631C303173B04032556E6672" + }, + { + "tcId": 2755, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CBEE452F43A3F47AF5F44D157DCFA2C", + "z": "B8FBBACB541EB261CE06DEAA21335426DB444D9670D7EE435DAEEA5B9ACB1FDB12", + "l": 1024, + "algorithmId": "61C5D493E6876F3B8342D0B1103CF8DE" + }, + "fixedInfoPartyU": { + "partyId": "CD3E96CE7C6024568608FDF44FAF885A", + "ephemeralData": "A489F6C91DEC406B5594628934C280BFDF713FE4F0025BD738EB96F86BE146F276" + }, + "fixedInfoPartyV": { + "partyId": "213F6684AD25BB63198FEFCE103ED7DE", + "ephemeralData": "CB0004D1E63CCED0A9F0D01060000C115DD1E16ECDA9B8008BB290EC820ABED6EE" + }, + "dkm": "DD49A03760A311F701A5AB8CF7F106037CC7376F51E72CB1187DDA27310E7939056326A138584BCB905E94EE2A40C5AEB825095D5EE3EA09EE0053114607890468BB63CC5FA35B8EAF0166A43BD216E7462B7B1B7FC3B25910F5A39FFED23BF370CACF2B76D66C4EC41E1159E8636F46490D3424EA6D45FF22831B72E11B4D80" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 118, + "testType": "VAL", + "tests": [ + { + "tcId": 2756, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1CE166FF003E4EAF9000D36CD2AE18C3", + "z": "E6C11E8CB42B7520CC1C3974B6CBC5E1A8AF1D9160BCCA1B3AAF6499F3537B", + "l": 1024, + "algorithmId": "1538C4B49CE35481E5C25CDA64BC75F3" + }, + "fixedInfoPartyU": { + "partyId": "726E72AF0892DD13B19FD16020C7721B" + }, + "fixedInfoPartyV": { + "partyId": "08FDADFB3824D3875FE26CAF333B5CA5" + }, + "dkm": "091FA3B62360DC8F379F891B9F17DEC512B3688F8A9B28AD0B2FDB9E618DF85A14FE48D1085E0728889CCFF6C5358A78F4017F93795444E831313368ABD33FE07C7450DAEF77EE4B0B7F97B2D98CA58669C01220091D1B6CCCF3442B7D0DF2A02C48EDC4FB270A8AFA8AFCB03309D99FC3524194D66402D285607D151E59E5A0" + }, + { + "tcId": 2757, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C375F4640C39D2FD9B9F9D8F0751018F", + "z": "42CB267D8C6E7CF4DA43CD7D072D0AB173C16DDFA9A61C25CA748CE09F2F31", + "l": 1024, + "algorithmId": "C1DE92CB7B67637BA7D760508A091B91" + }, + "fixedInfoPartyU": { + "partyId": "2DC0F3E9EA2B361B35FDF39B49A4ED87" + }, + "fixedInfoPartyV": { + "partyId": "51FE4CE81D64AB54EEF6F8ED3601885E", + "ephemeralData": "E933179847465BAEF59A0CC99E1E5041BC00F158A146ECF80DBDD777C9F122" + }, + "dkm": "7773BFAE9B2DBBD25EC5E894CACFF08AD36DE8926B7162027FF2BFBA9BC31224580D648FF5948D49B74AD97DD69DF168A8FC807E2974F5238228E91B6D513A910126AD6AD9B0A912E8E622ECE05B392871DC87440816532732E765CA1B2D2564B208C38D6DF101A5B6E9063966C4BAB0DE1C6BFC578CC020643F6AA48AB9D80D" + }, + { + "tcId": 2758, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66ABCE5FC75A92A2D4F0E7797130E51C", + "z": "047B32874552B946DB7A3C04EA8C79E0F1A33F527C4524AA749796419CEFC7", + "l": 1024, + "algorithmId": "F16D145776BECCDC64438C1AE827A92D" + }, + "fixedInfoPartyU": { + "partyId": "959E6B334D8570855B2C7867AE58200D", + "ephemeralData": "DBA82CB69365314D688AF4E7316E40A877EC51438856134D2AA7E3D34D79A1" + }, + "fixedInfoPartyV": { + "partyId": "3317A32154612D792A312DB9E646BD1A", + "ephemeralData": "A9463593B9B7440F7ABE060B856E7B6B2073137EA20010170AAD6DFCF2A50D" + }, + "dkm": "DE31B5854D5789ACCB67A9DAF00E5EBD96A73197027A77608B1400826E68C3664387B9E573C3CF4831E2455C8CED89E0461F42DF88428C7DB68046A837A079D491ACA29EEA7E368E1337FB342D6802BE6925070ACB6C9B88B3EC55DEC2B5799FE19DE9E0B1B26955B2F191D832BAF6E883822AB359EBBB82E31ADF8EC6ACF019" + }, + { + "tcId": 2759, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B8C55D966F69389F15BFA3743C2A8A4", + "z": "FE3ED70DC8559BCB0883CED57754CF0BFF36BFE19248F3A8A288D3811E76BD", + "l": 1024, + "algorithmId": "12B0630C39D6C626D8A5CEA15147F6C6" + }, + "fixedInfoPartyU": { + "partyId": "327967EE501A051C3F2F44967C5B3AD0", + "ephemeralData": "641933B4D05B15A0C669B964A7C249B4D094BF7DE5526E39ACB6DD8496EB94" + }, + "fixedInfoPartyV": { + "partyId": "5DC249F22742AE84F27AA8EC79742321" + }, + "dkm": "29702AC661F0856DEDA778DCCE2A51324D3C603CFB98DA3847280C11E700CE9F14B6B5761C64F5398E4D0FAF82EAF77239690F33C5A5D36F53AF0081C18854CA8A8956B1328BD8F59F53266B37407A15E8C6B74756DED3290E8CF3C23728ABF59E58DB5CBD4298009F7F1A57DFCCF1738EF67947DCFC4F063C221779E0D9004E" + }, + { + "tcId": 2760, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BABE8522348DCB214C95362C0731605", + "z": "FF43A1362C9E3EF387B043F0399CF5ACDA1866CC85422EB38D000B66E52BA8", + "l": 1024, + "algorithmId": "4ACAE317413D57BB5166E913DFB20746" + }, + "fixedInfoPartyU": { + "partyId": "AEFCCE1F92C089043F63FEEC98B1ABD3" + }, + "fixedInfoPartyV": { + "partyId": "EA1156D36D28F2A4F748BAAEB52D9B01", + "ephemeralData": "3230D23B0C47A169F1244915063592EF4125681E8367345C91AEEE7FB420B2" + }, + "dkm": "11C6C592777A8362EA1333F17F2025CF1A33BCB4782CEB3289D66314950E68FDF981EE8C45E4E703AE1B507484970551B3313D11529DCA2187983957A3D05F13908D8ECCFA0B87350480B6D8F49BEFD3210F7EDE5CFB5F7929A3CB08DDBF2BC1C12143A410D7FC72891D3141067C4EEE1E31C2118CBEE027419F6050ACDB3107" + }, + { + "tcId": 2761, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D7C590DEB02A00DC4B3F820843D7737", + "z": "78113A886F63C7CCE69C4B184BE309F894F1AF257FABBBF3413D59DDD1DFC9", + "l": 1024, + "algorithmId": "38EED3D3B918E52586FC3D297D277AC4" + }, + "fixedInfoPartyU": { + "partyId": "148E7875C84A35FADF1102F3EFAB69CC", + "ephemeralData": "5370D300E25003F8F5A00103BBB332AAB8B9CDF51505F82D21630E2AE1090C" + }, + "fixedInfoPartyV": { + "partyId": "2CEAFCFCFAC28905BD4E30317C534E39", + "ephemeralData": "FCF9A53F7AB6F5E47A863D79A7DCB288592081BD26E9136B1A10D2C5421E92" + }, + "dkm": "043DA9BB0F00D8041D14BB207779C1BABCE8FCC87EEBF4D73A452ED2FE4E0328CC5DC26C24C3AB764759E0BB5C75E6312EFBDFC5783787C68531D35FD9CF0B9E7CB9E8F31CD1CEA3AE60FA72A3CB070ADD441ACA90FCCCA636B359A8EF33E7B8B022353921197C03986E1150C6229DDE102D7D52E3D0C276446EB9181D59C648" + }, + { + "tcId": 2762, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BEFB82AF88A26B2C43EF75630C10F7EE", + "z": "77ACD6698F9CA980A24685C8E37E2F412F47FF75A5B09F29B8E16527E225FA", + "l": 1024, + "algorithmId": "C75A6B85C8CDA1F5273579D4BBE098F5" + }, + "fixedInfoPartyU": { + "partyId": "4479CFB36DE73E0C62328960CD0FA672", + "ephemeralData": "B0EFD99E8AD61CFCB8CF79F0CF3338F3524F52C87E6282B439329F3159613B" + }, + "fixedInfoPartyV": { + "partyId": "B99AB326DD19D673D24653752DAA582F", + "ephemeralData": "4891F160195C60F29FDD21A86F4FB193DB9AA8C9155CA86C6B53A99C7A7994" + }, + "dkm": "2516054419557F2CCA27A299E2BFF92EC876E2423D01164375BE1B39444D8C8E20F2641BBD399F8485EB5B65E2614F7DBBF63691DE190195A4A8A9B7BEA097A873878299EEF8668164D56CDBF26118984B3844A0FADBE46197D7ECA7F6937B1A01FAAEB2E9582BFC001BBF44E3DB3A7624A0F943A9D47D19C595958341E51C0A" + }, + { + "tcId": 2763, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B4DA944BDE9D39C081D1AEFEAEF35AE", + "z": "72E1123BD0F2806D90CEC7BEE64F5C96FD02A30006271E5BE64C7CFD25BAF1", + "l": 1024, + "algorithmId": "C939661EDB287AB5145925E544255D48" + }, + "fixedInfoPartyU": { + "partyId": "1CB6052204D2269EC720B179841D2C0C", + "ephemeralData": "2976AA1B41843BBA0C7F18CF3907FC49E0FE67E6D9860CA71EE58541E22BDA" + }, + "fixedInfoPartyV": { + "partyId": "37E0472B6CDDFE47878EB91136A80089" + }, + "dkm": "526F31D9EB6E374D9A732640C85FEED553D95C0B440081B8B38A4D342A4A70C76B791733D42358A4109CC1F30FB43EDF9A61CF4660ABEC5309D0B70A94D1327EB56F5BA86BACD2D10EDDADB9B91F8E713DD2737D4B6319BD076251C81029C2A6FFE9759A35C588C04C0972CD790312046D16B9DF0E45D560A4505B2DE0F8AE91" + }, + { + "tcId": 2764, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03A07205DCE5C5F7561868FAF394494C", + "z": "CBA9A4C25107B971A11C39B4C5BE0ADD921248F31B6982A918466142378A32", + "l": 1024, + "algorithmId": "3D3C1A1271A0812BD0858A88485ED1DA" + }, + "fixedInfoPartyU": { + "partyId": "0D244C9171EA3005DCFAE3883E9CE1B9", + "ephemeralData": "240FAB4E83C0E210FA09D3AC12619DD90455F55988C5E915CAECAC46D10833" + }, + "fixedInfoPartyV": { + "partyId": "1082721D9F28D1F50D85D79C8F6CFA95" + }, + "dkm": "0763B615A809C5AAC9B12EC65861C4B7B59774D7F27DA10ED9C194E02D0285AC4F2FD97AB7608BF8AFD0ADD3560AD6EED10106A1E2A8859FD2483575781C4FBE964CA7AAC414545D560BEA2A963881330B4F8955F65A081FFE819AACC004E1C1F0813ECE547DE55C87E6C1770E11EEF79CE0E6D18CA2769F76169BEBD538EE83" + }, + { + "tcId": 2765, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7736BB7F7099E82F5FDDB325BF03E044", + "z": "D5E6FF6D4C1CCE9219A5EEB04460B93576393ECC3185171CCA35B25A5F95B5", + "l": 1024, + "algorithmId": "F4A540AA655FECE5555699567B7CAB46" + }, + "fixedInfoPartyU": { + "partyId": "2111829FA8E6160F424BE114B0E8B62A" + }, + "fixedInfoPartyV": { + "partyId": "311D5CE8958CCC7B0F8885761FB66471" + }, + "dkm": "4EE47EDED5FB25A5D3721B69214D9BD7878B3C06730F082B7CE1ACBD783A63FEE337E7E23093F6DA12938C237EB1D7444878F99A7D7E8FDA61133A9D7B5E05EDF899739ADC1337F5D604373841BF891706BFEF6FF10A0C06458E456D59FB804DE2D26E55341575E5DA36CAAA32ED62AD084622CA0FEEEDD6B65410E9E4DB44B9" + }, + { + "tcId": 2766, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD7152EE5077AF0C37BE622842FFFFBA", + "z": "EBA6AA75014BFE5909373C986AF5DC69F80F2A361DE51FAC1549426EE23F92", + "l": 1024, + "algorithmId": "57A4D7A2A318310C7E46BA0FCF3F833E" + }, + "fixedInfoPartyU": { + "partyId": "12208B3DC5A74050F043CDDEB85ABFBA" + }, + "fixedInfoPartyV": { + "partyId": "86145EA65F9B2DF78E922D9C8D79643E", + "ephemeralData": "E2AA90A89FE729C8921D027DDD220EF5A5508E96820365709345919FC9DE1C" + }, + "dkm": "7AE8C89BFAC965173A7FEFF230647F96B57465A8C5FC730126ACA47FFC253FAD5A68A751603797E34A0345AD70518ADFA6C43B608A6A0CF43999DE7EB1B270835F6A5AD3720E072BF75046078643FED4683D735BDA47CE3107B71B3A1DEF2C9E9FE680F3ACD30FBD994494114F16A5887C8691C72498BFE124B061A7D528949B" + }, + { + "tcId": 2767, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B9A3F4165DCA5DCA00DD934DC6A0939", + "z": "0C7EF7A2369F4C5CF58F8D140BADF5AFF88EDB6FE9D84FA4BECD523DF84A35", + "l": 1024, + "algorithmId": "380970B9108B548D4DE4D347123F5A36" + }, + "fixedInfoPartyU": { + "partyId": "C59EEF5B8DC64A6BE5CB776EDA30B94E", + "ephemeralData": "6D9902C7CA9FC72A378AB4AAB69BCCD0AD1C97B2F09B54A6CD8534946F2DAC" + }, + "fixedInfoPartyV": { + "partyId": "D433DBDB1A34623319780EC9F5E9DAAE", + "ephemeralData": "4F5B708048828253C2E327ADD8422EBAA306BB94CC45F522981AE7538FBC18" + }, + "dkm": "FB0AFFE95737458CB2E56A25C4F3A3689C007450904E610012DBD0159672C33B99CA664190272A3778471E7D56309823A151A24A7FC4E58933CF4D50325C23C88FF74278936B6E7CA95B13A30E040559EBE3AB55CB68E992481DE57DABED119BE5B4E474032479221A70C87DCBCDB535B40A85E9B7E002C14A1C552C195BE909" + }, + { + "tcId": 2768, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CF865648EB6E207467154D8A2B4E4F6", + "z": "78A54544ADB66583491E45BFA39262D8BDAA6B79F4306ED55503A7C9B6045E", + "l": 1024, + "algorithmId": "D4DB1C6E01033A0ADD33FC26B4FDD6D7" + }, + "fixedInfoPartyU": { + "partyId": "DBF85FA833DE8FF22D11656AA3D742A5", + "ephemeralData": "23A0EA6730B0655172530794374FB7C9901156F06433BB40E638C2D22BDE24" + }, + "fixedInfoPartyV": { + "partyId": "9C3CAD32AF62F00AE3A57967204FDB6D", + "ephemeralData": "A340A3A4A32C6B125028F10714F7101A567F07116DDA6BD05646C110F06A4E" + }, + "dkm": "F2474D14DC6DA3699A8CD58C13D73FCA0991D3371DC5F81F8E42D2366DE0104651E9EF69128C3FF292989E2FEA126AB5F3607A4C12BF1905A77B3181C613E145B3F86158F268ED16B2EE061CFF0E86690AE3C4C5834104A035614FCB3F47A1F30E625B43B2E85E1100347452E647CA512579DA4C60362D0CFFFDA5F246A15CCF" + }, + { + "tcId": 2769, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54B377E0577CC7A1EF880C9446F7EDA1", + "z": "A641D09E008AA2CDE5C7731A0A706CC64A20D3DB75ECD5BE2DF8CF0931F297", + "l": 1024, + "algorithmId": "4E9E56625D274EAC86984D66A17A2ADA" + }, + "fixedInfoPartyU": { + "partyId": "1BAC97A77138BFA97E952570C6D29A34" + }, + "fixedInfoPartyV": { + "partyId": "94EE8EF74466630CCFE1986D6FEAB67C" + }, + "dkm": "8BFDBDE2A99909D23663DC31069E8CDFCBD894387D010E939F19BE618DECD681F5B016D46248B2D790B9833257711A08ACF4850CA1ED272D96793BCAB10D6F7992A8EF0392F97A0C0891B869ECA618932AD61EEECB00156ECAC3D13600C3F2EEE479B9D3628E3A657094BA351D719B05FA9598B3E30831845988E747DD484ACE" + }, + { + "tcId": 2770, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68BA4D8E5C798CF9495FCCD8EBE9EC58", + "z": "A8D84E3FD489587EA010928601E5813AC5A09001375D25032D547856057AA7", + "l": 1024, + "algorithmId": "F51E1642CC296BBC3734C7CBCED2B74A" + }, + "fixedInfoPartyU": { + "partyId": "B95D947AC6E6BE047CC810C724C0B16F", + "ephemeralData": "E9254AABC7FD69B929FD7BD050C8B54DB4EE80EFFE87D997D6344BA8DA3EC7" + }, + "fixedInfoPartyV": { + "partyId": "848CCA89ED8DEA7D23FFFD10787BCFFA" + }, + "dkm": "C038E33F0A954E42752DC0ACC5B846996D867F9632ECB3E521C7F23AE479F88DF75A98DBD26F32EE635EF3CFF7A20A7C5CBD0E1985AF09C0EE582F1F9C8C31F8F5FF3C716C0D8575C12200D6A4E281A0D7FA5677271D8290E5F9C66BEE684A8016B2C60B515CB2C68005F7B63DD982A2D99A04D7EFDA4EF106193F649565BCCE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 119, + "testType": "VAL", + "tests": [ + { + "tcId": 2771, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D44FF8D19A1E3ED0722B1FDB43ED0F26", + "z": "15126CD12E63CAB3AB3D5F9EA79DBC9E4EF02B50363451716909843263", + "l": 1024, + "algorithmId": "F5A656333D8AB26B0E1733513C435A83" + }, + "fixedInfoPartyU": { + "partyId": "F38A0CB8BEB48B9CD200D9B662723D7D", + "ephemeralData": "7FAA120BCABCC5978DB913B91F3E0598DB2068B029129932F281813224" + }, + "fixedInfoPartyV": { + "partyId": "98288D50D90A8A939139ACF36F3FA6F2", + "ephemeralData": "E0082E8BADCCECE7B128093692EE1FE7B6C56D8CAD3A7753997FAFF2C1" + }, + "dkm": "BD3FCB85F2489FDD2FAEEC27D7647D2A9AACC80DB7E029C204C3A35EF7EE4825B02CB9C14212603B1F62A751695FC2B18A728DA52EBB5BD1F482FA5674389789D661BBA13DD8F228616D588BFAF342474C8994FD497B192108E9125F204794528456B1A111E9A141556140CA226664787938BB94F425D1FF8E850D102C5F490E" + }, + { + "tcId": 2772, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77A63107AF1B3B90CDB5E13D9814E477", + "z": "C4177F3AFC0626A2334E2D3064DC4AC8173D44CD78AEBF0CF267A1FE76", + "l": 1024, + "algorithmId": "E48C5648B16685B86E77E0521007B2E7" + }, + "fixedInfoPartyU": { + "partyId": "9D701F66256AF224B54A3BEFDE8766C7", + "ephemeralData": "28C23D4027FF8D285EBD66B0EAA88CB76B9BD8D4435803D74A3EF1C7B5" + }, + "fixedInfoPartyV": { + "partyId": "7266AB86838F7D8525B8848468B583CC" + }, + "dkm": "E42D7F2A68F2B27F5DE51871D24876CC2D187D419408C54841C0A6E7BBDDEC6405C9A2EB0BB1655C02E1ED364B65333E80F41E1C2999181DD2203E450020695E548BBD6171EACB1D3A1B56F796740B7A358F5E74330F350A023EF2A3DB83C2BFB699DA9DB454C5161057D4C72E0E1EA243D3E3577EF22C0AE348254D86507391" + }, + { + "tcId": 2773, + "kdfParameter": { + "kdfType": "oneStep", + "t": "350FB9EA280020C05279FB9E7A7015D9", + "z": "5BE8BEFE494E012B53847A8219A0AB56FABF11F6802DA255B76236A1F1", + "l": 1024, + "algorithmId": "ABC6C462BE5E032339C15C097E50C249" + }, + "fixedInfoPartyU": { + "partyId": "E9A8FA427283F3648EC0CD28F36A4F98", + "ephemeralData": "12F78EB511EA88D1CBA7A6E7D2BA97B819E8A0C5E28A3E670F60756958" + }, + "fixedInfoPartyV": { + "partyId": "200846682CE789FA7254A68F64583111", + "ephemeralData": "7BBE5ED747431289834793D07847D8594E8BE086EE4202126FB7EB3B4A" + }, + "dkm": "074DD142D36C0F358F54F77CB9F1DB3990527D30854D5AC7A6BD6129288999A177592189D4CE9D15BBFC597D146D0D0C6841019192E263BB9C0FDDFE3BEFF93A76D8B15AC28E92D272751C5D7558ACBC96A9920EF8A8FE5121CC292790C4BED7145805C0666B4200BCF5E3FC2CDD78CB546CA6799F5FDA921328674BD635BCA9" + }, + { + "tcId": 2774, + "kdfParameter": { + "kdfType": "oneStep", + "t": "10573ACA81C6B68AB3B7E42011C4F605", + "z": "80520B9DE74DD1118D736BB251C29A6D0302385765497752A1DBC94FD6", + "l": 1024, + "algorithmId": "F07A1B8A62DE5A43BB4B95F25CC694D1" + }, + "fixedInfoPartyU": { + "partyId": "92534D4B4A7E96394650EECE0208F0C9" + }, + "fixedInfoPartyV": { + "partyId": "6FB44662E8AC493B2F3F67DAC2B36A9E", + "ephemeralData": "5DA4A492D3C889EF0C886775515A38DD88DD7CCD6DBEB131472749DCFA" + }, + "dkm": "83E3FEEBCF3172C7BAC9C173A0465A2B23831E16A9CB58B6AAE4C9FFA7AE372DD2FD695E09319AE22F07D54EFEA44D07B013BD4E6F8321813CFE1398EEC6C4EE55079ADDF1F4FCFE301BAB033D474B91DE19BAA30608196BCAD5166C37928E8B790B392624C31EDDCD59D24573622325E054EC926EF69774E880B942B107D955" + }, + { + "tcId": 2775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2773FAE5434D250B4308B5FEAB8BD31A", + "z": "79DDA5C4843E792ABAE3E37F4389160B67E54ECF6F84E70BC0AA2B1801", + "l": 1024, + "algorithmId": "3E07CFB4EE9198D0A675C602B1078DF4" + }, + "fixedInfoPartyU": { + "partyId": "662F3C07EB0E7E5CA49BEC6A25D6C132" + }, + "fixedInfoPartyV": { + "partyId": "0A66FC25ED9ED76C901666FFC30F00DB" + }, + "dkm": "A6A4F7EE5E94025E8086DB270E2261C2E9634BBAC1E71D7D1872DC9A6275DD01B439D83F7026244B0A0942E1A5F62F542D4F2CB000E95D85F007B291176DF52AE5DA074D1BD8732EEC7E69DBD827BE469343428E3966EF9CC12F23B546D7937919453A3E311E83061E66AA59523FD0DF9DE86296CAF7A7E292D16C7BD18C0387" + }, + { + "tcId": 2776, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83CF401277B7546C52C166450A9C89FE", + "z": "E4B519D42818449051F99100CA5BD2736CED08D56FEABCF085D270B525", + "l": 1024, + "algorithmId": "0A4CFE11FC3F79134DB74E6065138969" + }, + "fixedInfoPartyU": { + "partyId": "0DB1F4E45609907F470892BBA9D33B40", + "ephemeralData": "9DF9956A19C7B26AF38558D62127FBB805B4125007DB3DEB8C5784282C" + }, + "fixedInfoPartyV": { + "partyId": "F542B4CE954FB33E87D194A3F4452698", + "ephemeralData": "EF0822E3A02A2361BFCC296F3D4456213EBD75C22F88581DC22E0ED87A" + }, + "dkm": "56CAD66D839F01BCB4394384BAC920BE23F7FA322C736CBE8875174267ADDF14B049FC709FE33E552E8A725BD2F5B66815A88BE3B072631B2A2EBD2627630C0C9E08E0A40EA817AE16FA1AFF552CBFDC394FD1D6E44E8AED599FC2CA50368654825242FCC1E775A09AAD84B975DCCD2C68177587AEC6B16EED24FF21B573A710" + }, + { + "tcId": 2777, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD8C3990BC1A211A920CFF69560280B6", + "z": "43D0DCC982FF6B8A3FCE309BCA902D60BFE0591AE0A5D41CD6B31CC82F", + "l": 1024, + "algorithmId": "BAFDE6F15D8895BC18715DF1F65B8EFE" + }, + "fixedInfoPartyU": { + "partyId": "A54F765CAC99E44ACA292DAA088387B5", + "ephemeralData": "2296B680C6033214D7D6922A61043F0C311D5CA49EBD09F5F289F4B9D2" + }, + "fixedInfoPartyV": { + "partyId": "CC880C4B7992C2BADC22F6565A1C14E2" + }, + "dkm": "0F8072C9B18F58306AF4AB02DD5E6E864D3578D3AB3692CF146C29BC573326077A25C1C285D0FA1E1BDA7108E902CB826C13EB8A1C55F34B9CD1C15E9A941697AABAE2E50378EAAA1880F511167A95C77B49ECEC3FAEF69796B1B4D00CA895C9461AEC5E69632136C448485840B3C7FDC7E289828817E34BA79CC3DB1A8ED798" + }, + { + "tcId": 2778, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A72109724CCA3F23CF4471DBF713923E", + "z": "8E9FD710A1A613A6BE2D9A00D71825B6E5683185A7925E4DD8258253AA", + "l": 1024, + "algorithmId": "7061DC7BD38905250C6F58DEFADFE518" + }, + "fixedInfoPartyU": { + "partyId": "3F554F8034F1973B592829E2E31B9923", + "ephemeralData": "F9A9689CBEFC8D028516EC8404BF75C784DB4003E8F36E7274B11A6CEA" + }, + "fixedInfoPartyV": { + "partyId": "E825F9F0AC27AFDC846A26C566BD563D" + }, + "dkm": "BAC09E07FE1A5242794A1CCB21CF51158A56296C624F29E306F3142D4D58EF6A5017CB1BC7D2DF9D5489EEF6A312EEC8CE718A6BA0903C7449538FEF0EA9BAF67B30FC621FAA522AD84F69B1957EC45D1031CA5D1290AFAB4C10BEB3041946734C50363CA031C745E3054E7B7E1531AB3130C5DE6329B61D4425BA7A8696BC42" + }, + { + "tcId": 2779, + "kdfParameter": { + "kdfType": "oneStep", + "t": "551924F0666000F03ED32B8AE30F0544", + "z": "57D61779DCFB84C182C8E14D2353EBBA2D3D0C60A80F33CB3D678547C1", + "l": 1024, + "algorithmId": "CC80D6D8DDD2E53821B0B8D707B8AF27" + }, + "fixedInfoPartyU": { + "partyId": "1F293B00D1798E1951911C7DCB14314A", + "ephemeralData": "F668BF0A02599DB071F72F5EB85CB4C48B89C2FFD25142A2430C153511" + }, + "fixedInfoPartyV": { + "partyId": "CE1CAB7AD18F074AC1E16846DB5A8682" + }, + "dkm": "B60A27DEC458ED14BF46516CDD76C951CAD817658A0E294C3383D58D04CF726BC93F3D26C3650C9993AF11717EE52D07B5A3CFAF3CC7B4D77BE7767D2A3F377818D9FD82CCDA119C7BB9F76C45F2A52E0FE164E5F3D29245B0BB3159EF2924EEC23229E4AAB91959D6164F56FE8D67927F24C51D0EC037C59BACD71F84693C3F" + }, + { + "tcId": 2780, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C90A979C455448241198AD24EF2210C5", + "z": "2B1DD601816A7B0E7D52DB06ECCFF5D9CCE9F43B3AACC3DFEC81EE9BC9", + "l": 1024, + "algorithmId": "DDA10399A3025E14BF297F66FA131A17" + }, + "fixedInfoPartyU": { + "partyId": "B8E9B4764CE6F01F15FDD938537D23E3" + }, + "fixedInfoPartyV": { + "partyId": "A609EA008320BB4CB7BC955884534B44" + }, + "dkm": "D8CAA462F21CD9E0F9F0DEE9FE6DB2987741CD91FC5E4033E6647A893BC83C712547762D79B76D0B7BD17449D3591A7B58FA8A42476B2B6B8DA909AC828811A9B76BA395DCD8A58E7AF5D20D30FEA47F9C843911BAA76AE62D6D4955BE077BBB4A936116D325C34A2C93C783ECAE948330416E22894BA3BEFBD59E51A0E19E24" + }, + { + "tcId": 2781, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40420F5BF9779894CDF5969A195C3E58", + "z": "254DD15093080D87B8AA908E17E59FCCDEAD4F9E34F39DA7B7277F0263", + "l": 1024, + "algorithmId": "0C9EC35108BBF8979EF89CE5651D889F" + }, + "fixedInfoPartyU": { + "partyId": "47FCE569A0B05577444FA47AB58842FF", + "ephemeralData": "0AE0399FA1502763F7C75B34CE50D6679376F4DC87987ECDE191F8C7EE" + }, + "fixedInfoPartyV": { + "partyId": "5AC8F31D09751D93540A614BC111A14F", + "ephemeralData": "BDE6173AFBCB0647B5E33B378E9E9341F0A89F8B5080A0B09A50DAEDE4" + }, + "dkm": "5FB466254AB4AEEF50F237E21769C989004E38499C85FFCC1339903A351D01C4917024FDA97F2D5EC336689EBD1B9A06B6D5177060F2F7113170D4ABF6D238FE21312B8DE877F8D779B6C97FE474A5B32F8C6DA2AE05D415227B99B0846520C41BB5138DCBAD26387EBBB35950A56F5C9F6F8B33AEEF176A02C504474B55115A" + }, + { + "tcId": 2782, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19543A5219E1E4DDA91DDB37152C376F", + "z": "DE5D9282FC6A974D44F88AD9EC648A4C2E818A62E794F1A3555BAD4765", + "l": 1024, + "algorithmId": "72083B4548AA78C66AF4C0416F2B1945" + }, + "fixedInfoPartyU": { + "partyId": "51D42E9845CB1CAD8DFDE391238B17DA", + "ephemeralData": "B2BFBC3FD68D699C5EFE4B0DB69411D35F43B017D45CAF792D7C59917B" + }, + "fixedInfoPartyV": { + "partyId": "4CCBBDC6DB9DAC620300066018C21FAC" + }, + "dkm": "C34BCBE12567D4203F5A53EEE84AD88F7667B4F64DDB28E0055D7F9FD8B3BC395C41C1BA5474C0851301540CA6F3CBFC62F3FA7AC846238A919FDA5517E3E7A03C68151F8F8234393E27A457D793ABFAB4DEAD20A401249265EB3C52097F6CCC913BA91670112E418CA7DE78C141CAE5D79F0EB8D9895B01BC7384B8153845BD" + }, + { + "tcId": 2783, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8005F726A0576D9BD25B44AD68794F5A", + "z": "85DAD9F26E491A66A35B20F6ABCE3F05490722B360A83A81A2F47C398A", + "l": 1024, + "algorithmId": "DAE3380ABB98602327FADD4774C5CA8E" + }, + "fixedInfoPartyU": { + "partyId": "22F907D015D838EEBCD131175B2C0159" + }, + "fixedInfoPartyV": { + "partyId": "60A8B086331E23DDA9D72FF4882D9589", + "ephemeralData": "89B20E3AB155D165FDAC43691926215FD34647BEBD116ED332ABF5B207" + }, + "dkm": "3FE4D73AD4AD795516C7D70CAEBD09D000BBB15DCE8EF4FFEEDAFE292CECE8CFF7533DD74011239AC75E87E93338BA75EF9B15B9ECCC363E2A9638F4F456928F94BF9960366BD2188D9848945B1CD20B4495CC0800B69ED71132328A218C7A59BB7D3666EFFC3139FE2D5E61F64F9B25A5A58B2D92BBDACC3D2B0F473EA1DED1" + }, + { + "tcId": 2784, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB8EE30A2D4BE1EC0213135457DBE7FA", + "z": "4B171EE44D9BE0601D59207607DE5AD22C1D921BC6470B62A7526685FD", + "l": 1024, + "algorithmId": "85C4C5CC64CEB4F2816396F90BE761AF" + }, + "fixedInfoPartyU": { + "partyId": "81399193DB98DE725F476702260E7635" + }, + "fixedInfoPartyV": { + "partyId": "F444C204CAA49CAE34C294266C871AD6" + }, + "dkm": "4B0530A5804C0E9D7C952B06CE41CB2726DCA5324DD08A35044EF32857747D97B4240FA6F2F5074D4FA6580BB0961970ACD3E483BFAEC45E5076DE69066F9DFDBF119A08156975011604051A949A81AA2A2BB8600E9BAC87EFC1A927348CB2794297388BB5F1E1A12E7C856D7DC8ADA47F0569482145C125609771DA268AE939" + }, + { + "tcId": 2785, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8EAA6BFD0356BD35DCA384EC0EADBB88", + "z": "1B72B61EC1CA35E29099688C8F097E1BBF93666439FF6EEEBBC9A2F080", + "l": 1024, + "algorithmId": "44313BA0942621F505BF7230EBFB654E" + }, + "fixedInfoPartyU": { + "partyId": "1D87D5AE4D9A886799AF1497768907BC", + "ephemeralData": "4CCE042870CE07281CDC5C7DE3FB389D08D7BA9EFE100371744C3F1A1D" + }, + "fixedInfoPartyV": { + "partyId": "F4759966869647CE339C01B2ACAD0DE1", + "ephemeralData": "56C63615C89B9C562A0C901CC3346D4CDC7012F5F2402A57CA5161EB5E" + }, + "dkm": "1C59F72B17BD9AC33AB2368EE0CA2FE57EEFDAE45F3434F3A0C18871FB59C23EDE11EA5DD0C2FA4212721654EC0BB07511267E50AD073AEF239E20941182FEFDAC8F0EC195FDCBABBE231EB1B474F9BA17356FF5016DAED4916595A95CE34F6B0C30E521CF678F3BC421898E2AE36297D6188EC30055700BE076C2405601DF37" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 120, + "testType": "VAL", + "tests": [ + { + "tcId": 2786, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F538ACEA827EFE8525F89E1712DFAEE7", + "z": "7A15684D06A8AA113FB8D5C63AFD28D019DEB8A56FB7BC861217EB37ABFB03B6", + "l": 1024, + "algorithmId": "EB4F1E6E73E4B526FFEACC042ECF09DE" + }, + "fixedInfoPartyU": { + "partyId": "CC7F89E75B8BCC97FCB3A4226ABCEF7D", + "ephemeralData": "2B87585D49F9A301742CF773FBB6F23DA71EC511428C99BC4BE12FFDAEC2B165" + }, + "fixedInfoPartyV": { + "partyId": "0786BA260A651FDBC07FCB53B6E8E6DB", + "ephemeralData": "1C474D21915320F672725367DC2A66611263EE983559AD4D856EACD1C897A9B4" + }, + "dkm": "DBC4861A72410781BCF6E589EE00EB061A19CD53E47CBE21A067AB589DA379A64A9D96136363C71E823C020A448C631F2CBCA9CC49F5CC38796B8AA6D22AB41EAE1B78328A989616A50160455396EE6696CD7E981A58568BFA0DE1B0FD0C9DEF4FFFBE3D66D46FF9B2FFB79D0E87962AD46E4CE552C72266ECBF4EFB404CE02E" + }, + { + "tcId": 2787, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BFB27241DA1EE07DC4D96226FE2FF6EB", + "z": "19EF36872DB1CE63AFC09F1492FDBB0F541F6A9A469DC9AE65720D602DB1B416", + "l": 1024, + "algorithmId": "B511862088725F8B3111A60D2F923D12" + }, + "fixedInfoPartyU": { + "partyId": "132993C45C4FCA84DD54E3D46B72B2AD", + "ephemeralData": "A4CFEB634F4A0E1F662B7FB4F8E89884DA77DD455C92C902F477AB1F7486CBCA" + }, + "fixedInfoPartyV": { + "partyId": "EC3F81C219D276FA078EA5686BBD6C9E" + }, + "dkm": "0639C0ABD1E44A41EBA099C9A28179AE0080D989E5B37961FE401FE24C96ED9AA32CDAB3094B2753B5E2C491AC2E408C3B6220661F94CB93EBBC9CE507F25767F75291960A8EC4E673C64CEB35AF9A1323C3ED850B91B43AC01F99AF8FDA6497623CB5A78F4CB6E3522F3932A15E22BED6C2FD823A782022CC31A9EA4A452018" + }, + { + "tcId": 2788, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AEF3A561F4661E424FC945254FA52AEE", + "z": "ECF92A6B4338D21CE0DFA7C0562D6B690C54CB97E44939C0F2D0A1A7C0E97AA8", + "l": 1024, + "algorithmId": "F1F2A5D4DDC2D2A92D6E7AD2419D7907" + }, + "fixedInfoPartyU": { + "partyId": "5AFD6A5D0097ACBFDEEAEF2A6B3414DE" + }, + "fixedInfoPartyV": { + "partyId": "583EE4B610B952B81A54F33E001BFB85", + "ephemeralData": "58C708CD309D7250DF209F03B07E8E89A54F45634EBC0EF5C65B09B588B23D80" + }, + "dkm": "E75ED38FE6ADC0E18495932D20FB9B33B0FDAAF1E167DD810BFE589866000E1DE1093336180A23575AA942777962CDCD74C33FC67414A2C401F1F5519BD88F1E383BD63D1309D4933EB1479487C1F21437532B0E1474E6E7D1CE18987394701DCE393A2EB7901320F4FDD73386467E2FE6FFB2FBC9BA8AED4D5317038424807C" + }, + { + "tcId": 2789, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F8FA7C52F0B16BBAC66F6CE3F285CA3", + "z": "2FE03D7F171B8C79617A7662D788C40BCF73224C17C01E8155D869309E30942C", + "l": 1024, + "algorithmId": "2D74BF079E2AA4D7A56D8A2DD738DF57" + }, + "fixedInfoPartyU": { + "partyId": "995F4E35B0BED28339FDD68F7271DB15" + }, + "fixedInfoPartyV": { + "partyId": "3D43D6C14DA324CF19B6EDB71F00243B", + "ephemeralData": "7AFCC2EB59B1C059BBEE5D10E0194474822D2B2BCAB88F534EC7354000B07102" + }, + "dkm": "A2EEA54E6D5CEA50F032441C96C2B7E92740B29029355A7DDC4F2E5B12354FBB58717B0B705E4B6CBB1F6AD8DBADB45101A3C25CEF51ECB6A861AEA3BA8972C9204622F794CA78122F20B097B86A63D7B1AC2143CE2BFA05B5F3EE8C4B6A0831FAA98B6C78EBE9C2C0B965A55CF5EAE2CF779D990C5DDCA573EEBCA95F9BAC53" + }, + { + "tcId": 2790, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1EB2F6474E2F2EE9CDB2FF9885B357AC", + "z": "64F3E5CCA146A50F921AD75C9D1FEF57C85986E68FF423930A18AFAB4BD0EFB8", + "l": 1024, + "algorithmId": "C37D80FC2178715B3A33FCCF3073C291" + }, + "fixedInfoPartyU": { + "partyId": "63E7220A75F1A93FFC1732B00C695ABE" + }, + "fixedInfoPartyV": { + "partyId": "2FAE3D7769053B3DD5E0C114D658F767", + "ephemeralData": "436BC79312F672378898AA8E9BEE64CCE2BEEC87A5E5B35E23D725174C1C8CD0" + }, + "dkm": "0DDC0D0A2644C6E84D1C1DD7D7B83BBE5A845A9A711591D6D2F512F8D2A770606944D52BB500D8639A3B8AE3C3DAA806C816F181EA726E010CE4B78A3E00039FD99536FE17CC5709D7678710BFEFA83FD52FCCF36D9D0BF8B707D9FF6EFBE6D15495EF4A30FC32568C26905C772B81D87C04C08A06130EAD51FB0EF3020D731A" + }, + { + "tcId": 2791, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9028A3A45437F35FF83B8A65B45E9CB2", + "z": "FF9962ED820653E93DBA1F44948EB491BE186B55A3C91696F3BD7B71AC296CDD", + "l": 1024, + "algorithmId": "D6BBEAA14543FAA23EB62575654C25C7" + }, + "fixedInfoPartyU": { + "partyId": "F3A298C04F1E6BDE36650FC13567B2D2" + }, + "fixedInfoPartyV": { + "partyId": "7C33053A751DC2ECB1BD4C9315F0C379", + "ephemeralData": "EA66A4C1484DD484A9653EEAA99E74A712B1517C6B01D8B5574F81FDE303A2D1" + }, + "dkm": "33C09A0F7E33C12814857012BA0748D3D4AF09FBC3029910659E4CF66F9C7E9C5D1E09832D370AC1D1E4384063DF05CAE28430D13D53B2AA0FE1097A29576264DA3D2A122DF69DFCAE75CA513AAEC4053008835C19F522F14066BF25153E8F4233814803962E18481C1276C3BD801BEEC2A8816336C464A89256BF7E37DC7E81" + }, + { + "tcId": 2792, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FED34B58C1F7808BD1E6B0F26379275", + "z": "F7EA61BE1D8CB6D1756B1D4CBBA79CD7984153A4CACC701C376F1DD372DC9048", + "l": 1024, + "algorithmId": "8858645B3A859F2CA0EDDE959474F0E1" + }, + "fixedInfoPartyU": { + "partyId": "B518539F9E09002358B5E588CBF275B1" + }, + "fixedInfoPartyV": { + "partyId": "86BB7851911CA067252BC3328D18B586" + }, + "dkm": "E8A6C7944707E7E2B79D2E7CAF8D4F3E7D470028FA0506B7BEA08962A3635259ECABA45E9C27280EE360C455AC87F409A4D946629482104F187087FD85A3D520602C451300BBC1B480A713B4203DA23090B2476ABD0146A2E1FC50FDD6823B538BA2960F57BC819FFB23A6E5A4FC3528CDCA2A6AD2BEAD7234BAECD4FB022376" + }, + { + "tcId": 2793, + "kdfParameter": { + "kdfType": "oneStep", + "t": "733B48580A81B94E4807B15A7CB8BCEC", + "z": "28223AF0043EB03DB3C5237BBB5FB34D84742FFB702335B55BCFE5191DB292F5", + "l": 1024, + "algorithmId": "C25BB7F7DAC2C8707B4471BD8DF84465" + }, + "fixedInfoPartyU": { + "partyId": "1F4C968D24C65DEC07A83E0564E54E8D" + }, + "fixedInfoPartyV": { + "partyId": "137B6BCBA669E0FECCD1F77FE9A5BCFD", + "ephemeralData": "4BF121613F5D079814560D3E7C7DF3BF1F63A625A05C1ECE570A0F7E0F49ACE3" + }, + "dkm": "B59E600C1DAD147FFCB1AFC396C95618C75B1CA86256982634D864DF2AE1EEBC35E08676AA7F863108FB35CE3537B27F78669F7CE3ECB1F8FA1D6C752859DCACB5FB7AA5DFFDF1CCBBDE93DCBCC3C0C401A5C8C3477F7019BC8C69FA4468FE572444ECCEE7EB8F2E8B6B1B957D7CC2E5670E548981E6C925E64C297B3D7865B8" + }, + { + "tcId": 2794, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BEC9898DD134FDF1CF74606D321C01AD", + "z": "7DC38F728147A426C3A3178CDAA42FB8EE54E6F6E252B99B85526E2A3F609F09", + "l": 1024, + "algorithmId": "BDFC71F1B24F84065060A67E39739A24" + }, + "fixedInfoPartyU": { + "partyId": "0AD8910EB39696AE3E92BD1151A891BA" + }, + "fixedInfoPartyV": { + "partyId": "F60B13D12686189CFBF131EFE45D1846", + "ephemeralData": "8B82DD180BA47456B75FCB9865772BD93CCB94B5EF81F62B659DFBDD033D6528" + }, + "dkm": "9CE368AF8F81B8E48B36093D31E2C43A4871C0B2D97DF854E86D51372CBDEBC4813AC6832722736C3F99C2D282C2B9551CBC00FC14093C3FE2CABA6CAC2D954CCC051DB9E7A32FD1FA171B552F4B81FBA28EFAF1582016EE4189DEB2727171364FB2FF176411B8B3FA1F87F7F664643AF740070DFA2208E5C5DF31F1DAA6A602" + }, + { + "tcId": 2795, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A1D67C892C8101F5670621A4E1F3747", + "z": "2D1830D471107127B13D4B6624574E6D5B715F65125EDE7A1FFC282B27E1EC53", + "l": 1024, + "algorithmId": "9F5D91D495A65795E0C29C812FC79714" + }, + "fixedInfoPartyU": { + "partyId": "C0F05D033BD3FF3A1F7336AFE7425C39" + }, + "fixedInfoPartyV": { + "partyId": "C64A4B8B18B9FF2FAE07E3F91079256C", + "ephemeralData": "89B4AE07BA3680383B783F1C9E0A67D24F81C9AE027866E937DA36AC891D08D9" + }, + "dkm": "1FCECBA453D499590DCC8ED18BED32111B3FB27FBFBAAD305AAE48B3AE2F1A61E754E61756F09D8FBD5E5B1D9D2F476B6BF54D4CAD7EA6CC6F4C806F4F9F803A018D95F53AA0B0176A5F59372A9086EBDC901F20E2690EF2BF2BEF9D9E4FE8FA3DD3EAC0DAAECDB783D3994930D52470F525063F77A1C6ACF020D0DA1021B7AC" + }, + { + "tcId": 2796, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3AB7480741A25780A7C7772812F61AC7", + "z": "46CA1122FC17254DE75814A0B51FB02C85BF1D5F5583D53B5FB871C5360A3E47", + "l": 1024, + "algorithmId": "ECEFF40011EE958FD252C55398CD155F" + }, + "fixedInfoPartyU": { + "partyId": "624772F452D696625626B9EAC2CAB4DD" + }, + "fixedInfoPartyV": { + "partyId": "0A2A3DBC5A9FE822E53299022857151D", + "ephemeralData": "AB59A5FB86D0C7DC971ADB1D73FC0563B4DEDBF3053E0953C989739AFC53AB78" + }, + "dkm": "6F8D52101326E707B8187844FC92C4F8EB35F1A365D5E461D411FFD5B3479B2DFDE89EEB0633D0FF5D983DBC69AC26F27E152757E778BED52CA511CF0D68898799FD3970706CB86656D4456F3F7EA413476C51444A9BCC97FC0A44AD4FE3431DAF7A4F11BF8AE7993151DEC2F161E7626AD29398220A9B1BA40BB0B0400A094E" + }, + { + "tcId": 2797, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9049017D9B8804443EAA0E7E8B149BF3", + "z": "9EE777992B9C24C90FD82CA770B206C6A509FD08F14344DE639B9CBCE1005F1E", + "l": 1024, + "algorithmId": "229ADB5CC62670A06413222FE163741E" + }, + "fixedInfoPartyU": { + "partyId": "4736B9CB3AADB0005765B8DAFCA79527", + "ephemeralData": "EE0F449E7EF76F5BA10DCA0C5573C9A45C67C970FF9818F087F2E8D94E76D5E3" + }, + "fixedInfoPartyV": { + "partyId": "E78F57CCA0E975B5AC4D4F71A2B62F55" + }, + "dkm": "54F2535F63F9359DBFC5CCF36182895DEB12A8DAB2BF6C60080DBB07FDACAFC9DAF36D376A17CF893EB08BEC469813DA5F5119ECE01EFEF5270E69BB279E6242940C5B78680B4F1B6302F6D7F398A8207ED542416CBB0DC0BFE5CA7E5158F996C08A16BEDDCF0EF572D00F961B7FFDF34BE9CD57C39B8802037F63DA9D6B2682" + }, + { + "tcId": 2798, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A4BE65664C5DB7007EC0989EA440442", + "z": "BDAAA6F241D061791EE81F1F0648AB89B3FC77035BA8E51910FC3DDA0F62E1AE", + "l": 1024, + "algorithmId": "700468D39064EAA3000AB71D41696627" + }, + "fixedInfoPartyU": { + "partyId": "F9049161A4D134070596F506F1E21A9E", + "ephemeralData": "5CE8BD444EEBFE431494AD0A95E9BCEA3B731EBB6C789544F88E2B449DABDB11" + }, + "fixedInfoPartyV": { + "partyId": "154C981D5FC2F953EE591FFFCBE062D7" + }, + "dkm": "3ECF674916D369493E0C7779BF1B4A7D3237C5482650B01C11567550CAB30D73534B366FF3A22C8BF7A8572B4264F3B366C70370DA7EB620C9F685E79C0C739EF9F6FFDE7095C0C619077E47971DD7FD286CB9606A3875C3B7910FEAC9D7007923174F6D9CA234AB18DAA50EF29164088F1EECA225A0576F1E37C138AA5D4E5C" + }, + { + "tcId": 2799, + "kdfParameter": { + "kdfType": "oneStep", + "t": "912952C45B4171AD8CCED6AEEE066702", + "z": "A5D36C045EAB0533D237E6C55CFDA9870713BE3E6E6ABE26D524D168BF82F044", + "l": 1024, + "algorithmId": "F492537C88B9203EDA6C556207141F54" + }, + "fixedInfoPartyU": { + "partyId": "5274923FAE41E2F156E5756D49D727F7" + }, + "fixedInfoPartyV": { + "partyId": "E99B0F855187CA671605F01126BA146A" + }, + "dkm": "79B8000FCF9CEDCA6767B9E83793C500D43009C73E5C231B9AEDB8B2E10EE369DFCAC624B1813B2C3299AC0AA12803F435551BEC3CBCE04DFF93E55590374E448DE63F40242ACB003F0E03C8F0283D28B8111DE82F9C4D2B0EF982BC0D6F2959766FB4C6541915121188D4CC40260FA00CCAF86C044EA6E203FCD19BD946AA62" + }, + { + "tcId": 2800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CB7B3299FE117EB62C13F33C614A0B6", + "z": "8EB459563AB414823048481E52DAE676B89A902546C0FAC116DEE64D1D45DF92", + "l": 1024, + "algorithmId": "A1036A4BBC3A1241DDF937519F77436F" + }, + "fixedInfoPartyU": { + "partyId": "5B3C7B7F3804FEC2D053E6256B290D5B" + }, + "fixedInfoPartyV": { + "partyId": "4667C0A432399B14974A0D64D8422929", + "ephemeralData": "9C3E1D9E1A4B11D4DEFFF6B572302DBD59D806B10F4320900A938F922F6618EB" + }, + "dkm": "76874697755613B19F43DF1F2807820812094A47BE3CB0DE17C4DFCEBE49F954E9108D0A2645D5B11726AD2957A53A517AD5A60AFB366DF084F8D08C69DA13C4CA7EA85426AAA6301B4982FD01979FDD10F638835AEB47C3C9909B24B9B0C2A574E4627A18538D0F94DB920826A5E0ED7218EA3AB9DBBA6DCD2107DC5BB4F2D6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-256" + } + }, + { + "tgId": 121, + "testType": "VAL", + "tests": [ + { + "tcId": 2801, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48874D02CCEC0D4A71AB2A86B904AAC2", + "z": "54FA3C74B3438EF1B07458EA74FEA2F0344E6091F1AD3D5A6948591D", + "l": 1024, + "algorithmId": "37DBE2A5472322781513636244AD1FDE" + }, + "fixedInfoPartyU": { + "partyId": "252813FD85DC729A4B29DB9B2A124677" + }, + "fixedInfoPartyV": { + "partyId": "431EF594158F56D6D8AAE2770FA88076" + }, + "dkm": "94288959F75522923CF394B762BD2B11A601B2D4B78267633B8F8A81C33593C5B41382A918A82048EDE784699E161D34FA0C514F4DFD29D3EB5C91C9DC9108E30C9C525763CADF71B5713D8B01D06C531AEBCA51931F2CA19A2683073D449A4022CCA63DA5C24263AE25716FA7434A8BC4F0FB974E2CC65C3826DCB695F351B1" + }, + { + "tcId": 2802, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8464DA5CE587070897FF065A5A89EC4", + "z": "F3621A9E857A3B8A0075966CAF1A2DDBB1E67352513E5F24537B51F8", + "l": 1024, + "algorithmId": "D8DD1F928B12DB268AEAC7D29F4D8C11" + }, + "fixedInfoPartyU": { + "partyId": "E9ED3C4D5DB425A8F22D3995D8E41B6F", + "ephemeralData": "C27C4BA8334F01D2979CFDEE3960AA56F9FDCEB6C32E2C65D60F00E8" + }, + "fixedInfoPartyV": { + "partyId": "6BDE15B6EF098B1FC225DBBD72CD412D" + }, + "dkm": "23205C02981D4A4C51F234F6BD83EDAFDF773885801227C97667594DBDF62AE6114249F4117E9795B0C095A29DA75911196FF56C8611B80B4418F0C6FA80BE622285003FDA51E553FD3F0FE84574CD218F3242740AFB50E24D00D1E968F3FD3125A4C5335705F1490589DC9D0C5EAAC788A682B14460AA2C642B77AEF704E536" + }, + { + "tcId": 2803, + "kdfParameter": { + "kdfType": "oneStep", + "t": "862CA02308F279DC0A1EE379F977E8CB", + "z": "80DADC9C129D95639523A9D00422F6D2E659B72C7E90DA343E765EC6", + "l": 1024, + "algorithmId": "ACC3228DDCFB00E7442776F9B7E6BBF6" + }, + "fixedInfoPartyU": { + "partyId": "C1CCF957F07784AC2E1675D346211F84" + }, + "fixedInfoPartyV": { + "partyId": "0058A263C03022977D7937ED56E63737" + }, + "dkm": "F7E93C5B2385F73553139EE051AAC659E74C68A13855FDCC75E9979CC7AEAFFB3578D735CDFA2F2C956605EC792CE740DEDAAC1AC0D351E501BDCF1372DB39BD61265E99DA476C9F9ADBE2F485B890FF1937938DAC8D7768C02A4001079603A61FC2BE88DF134BA7C2CA8D1DC1F3BC5E00321042555A3192D9858C8E392C0CFD" + }, + { + "tcId": 2804, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F12524518852FA9F09955EF71C189282", + "z": "67B15DD6E7CE0AD006160819804C0D65111B31B0FF372AAC74EE781F", + "l": 1024, + "algorithmId": "4E0516E8D01CCF9316FC706150666C46" + }, + "fixedInfoPartyU": { + "partyId": "C66C195A58A2912870B02BA96FC5741E", + "ephemeralData": "668757DB5D3968AB6B3CE1D0794F9D06A914201F0D486ED2AD91A383" + }, + "fixedInfoPartyV": { + "partyId": "0A89627C054CB920B952A4079EB7ACBE" + }, + "dkm": "08C404EA53E64542BB94FB2523C68D007CE9D07F6FEACFEC51C37054B513583468F909D584F587EAEDAC0CF9D6B23FF61F9EE3401334919AA7D2118AC2840D3F8803F852DC0AC64B1B417C3A21AE7A3D7C965799C4BEF6B624F86BD729426AB67DB037C43711AD5C1456E646779B13B1CE2609768C08CB1E3D65EB0134D820AF" + }, + { + "tcId": 2805, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3498B321BDE6AADE237CC7B8255C7C2", + "z": "8B75F4AC1BDFD4CAF8C52943447E92C5B0953FF09615D1CEBD675C99", + "l": 1024, + "algorithmId": "C271DD6B6B10972C2E5AF7F523D6E3E8" + }, + "fixedInfoPartyU": { + "partyId": "3B92BEB2F1F3B4750ED24D4DA1FC3E18", + "ephemeralData": "358ECF6FBF7863F442B17D8A5BDA104B7DC4F951C609D899EB1B1C86" + }, + "fixedInfoPartyV": { + "partyId": "53FBDAF3667E9F5AD826E4A3410B45D3", + "ephemeralData": "FFEB0002EA67D982EE0BF2D349CA7B5BA32243F9E040279519A42991" + }, + "dkm": "0710D9CDD11CB3BE45E4D211C8ED7A64C5C98845DDD209D19BE04C19E66A284091BA79E1A194071FA53AFC91052D10FA5346D65DE568F166B4C79918601F93243C265F21D9171D1F062671A93982F989C993F92B9AD71DED764C8FC4E4330973182BA9D46E0774E18DDA80A0F7A636ED811E4188C5F203F5FC59080BF7D0712E" + }, + { + "tcId": 2806, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E004D46CE096A0C67C55EBC41240A9AA", + "z": "51FC73D1F281D44EAE22973D8C42BAE45C9CDA9D40632A1F1DC0380F", + "l": 1024, + "algorithmId": "08ACE973F169F2D4C818EEF1C3EF26DD" + }, + "fixedInfoPartyU": { + "partyId": "EA7400457FE98F283AE189EEFF5B3858", + "ephemeralData": "AEAD6307D85B6D9C7F65E8122EAC4BCEB73B9155B2D5A30A5D0C98F8" + }, + "fixedInfoPartyV": { + "partyId": "F7994D86944EF3F0DBD9A2975F4E68A2" + }, + "dkm": "50F77F2F401F7DB6E9CEFE4B2734EAA87663D13A2068BD1F1AF3740C404FB1C030C1F566C05728F7709E9DB85A64032AA8D00B4FC7AD32E139C6634DB5A76A28A84CEEC54250C0F59A2D03D86D57522EF75E7D70B49F975A6DF6DD1AFF65EBF6A9CF3DD80A033887E2BAC3213106F8BD8C4F8683E1C7E45A898EC3219CCB6871" + }, + { + "tcId": 2807, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC44263C0931A96C3785DD0583E66BA1", + "z": "F76D127A9BE5C621FC2AF88DCCD91ACE1B6EA6AB8DECCD8EB0B4FE8A", + "l": 1024, + "algorithmId": "FF109FE9AC423DA87EE9C0A1DA4A0079" + }, + "fixedInfoPartyU": { + "partyId": "5FD8597ED4705FEAEA2155F88242E08F" + }, + "fixedInfoPartyV": { + "partyId": "5F7C351819C3CB48FC447C64D0526869" + }, + "dkm": "BE996CB90812F0B5F59BDC46E31D5B76A09F5C79E78B2E6214FA55823ABCDF720E492D9E4318AFDFC19E2206EDBFAECDE588119549F35EB943C6590341089B2AE8E9E743D29FEE5B354F1401F7F7EC9DEE53CC9933E00D6391C4936FF9D66D14CE072A06D213083D963DB877FF57122A0F28894EE1DA43C8602F5036E6CD8625" + }, + { + "tcId": 2808, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E6731D982FC0CCA4403B33484CEF4CC", + "z": "336289EAF6D39F28AFC72C0CB4A01CCA01BF5C8303248B2EF35E3642", + "l": 1024, + "algorithmId": "A5E844FD4F696307D833C23F2CCEEDAA" + }, + "fixedInfoPartyU": { + "partyId": "D800CAD04077F4E6C60CFAFBD5FFB0C5" + }, + "fixedInfoPartyV": { + "partyId": "29A4096762A345B86AAD75486CAE7A02", + "ephemeralData": "69B4436B513B7DC6B30FE701FB9F5EDF86B417CDDA0FD006E95DD23D" + }, + "dkm": "B0D324D2C0171D7FAC32773FC949AB29C789FC59889DA365F6332647A6FF14019CC8FDDC575E765A7AB108533E1B396E0638F13236C12E12573806AC7A1FC4924ECBF0563830679F8189F3F093E0E774B34C15C16C256771C1D55261603EE88878B1055BB774CAE12ED74FB3A6CFC2C6E17468CEF7E1A6919D8A8CB34F780B6C" + }, + { + "tcId": 2809, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A36DD940B846347CCC7B73DE3498EBB6", + "z": "DA560C080CC7179D82593568C74E0CB08AEFF58B2445546A4773C58E", + "l": 1024, + "algorithmId": "BE8000AEA84A3437E1DA240FD3D88380" + }, + "fixedInfoPartyU": { + "partyId": "E9A973A66154388CE91AA6C65DA121DE" + }, + "fixedInfoPartyV": { + "partyId": "FE5D3F66FD7606EB800A4F7EE5701CF0", + "ephemeralData": "A4A0DADD96D25FF5E6F01788DD6E29DBF8E1303A65F209C392536A46" + }, + "dkm": "7639E0B9472F9FA0C458B0325245184C443B69338D3108BF3E73FA9A2155AC0A7688E8809656D2E01CEAFE94DE113DC9AE7AB33CF144772ECAEA61CA1AC2BE9E565DD2956857D990FC1DD9D6B40EC1035C2B17CD2DCCBF1B2AEF25BD3DEA5F018B9A506ABFA38D69F00E577DCDCB2CE39385DEB17F94D00F47781DD9420F4B7C" + }, + { + "tcId": 2810, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7050E45C9E2CD199BCC1F5D6B4A04B4B", + "z": "CBEB85C50C686F21063B154EC0822F43B0E18CA5E5B12B8FDB1695C8", + "l": 1024, + "algorithmId": "71EFAEE9C43B9EEB5A92979C85428702" + }, + "fixedInfoPartyU": { + "partyId": "490FBA991FE2139753FBCB4E06FDF36A" + }, + "fixedInfoPartyV": { + "partyId": "3F09150A2D584F49A9474F6C4F697910" + }, + "dkm": "3045291572B42EC5E9A10A311B6AE727624A87306D1419FDC538794994016E5E7E8F46F905AC2D152A2B3BA25349FB6704D86E2A7167A30240F734DD9EE3759C0DFB16815144FB3A138DF26ADF634067810ACBF02B0DE604854B43AC01A11F7E3987B61459FFACF45E27D2A8949246245EBEB9E2A3DBB6050DCF760024AB5B75" + }, + { + "tcId": 2811, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8A449547271C4AE9A43A20EDEC2CBD2", + "z": "F7CAC4EF1D27FD103794D0BA12DC60EC70971D74D0A0C7E1936AC9A8", + "l": 1024, + "algorithmId": "EB53079E93748C475F7819BB795F32C0" + }, + "fixedInfoPartyU": { + "partyId": "F169F22B0A0ABF9DD5EBBCE8FE0A05A8", + "ephemeralData": "C6FA7407752F8898126E28A8FD1DA34CA1ABA76DB584B85FE74DAED2" + }, + "fixedInfoPartyV": { + "partyId": "147A48864D480F7D151D1135931E0B89" + }, + "dkm": "0435C38D4D2B5D3B0D1349B34C1F9C06BCF0DBCC9BA8829A6F8E43D35A28A9590F87C2678ECBDF3EF67A3965D2A579E024694B000FD9316CBD2CA845A7AEEDDF33E06F2C7833749364BD2482B8AF4E6F9EEB795B2D9A7EB114AA3186148E3844E9D77BC9454E0D409DF7627CF909ABA30812AD3DDF9F960B925C4D17DEAB2D6F" + }, + { + "tcId": 2812, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BA2CCF12C4357066E30DB53FBCD58B0", + "z": "F37946E0C84D88B71438FC7D3BE6CFB90A44F67525FA40229C9504BE", + "l": 1024, + "algorithmId": "5EBA4A95C004A4AFBFDA634B7FB510A4" + }, + "fixedInfoPartyU": { + "partyId": "5C85A85E6F3B1DB49002C901E2CDAD1F", + "ephemeralData": "C05F8655CDF0096128C80506C7DBBBCCB735848E93F5AF077036B425" + }, + "fixedInfoPartyV": { + "partyId": "44734ED8FE17824292BB31F0020EB6C9" + }, + "dkm": "457D5211D8701894E7FC9397F11E04E28DB1924061DB28C97241659ED8DE27ED1E326BB6A179F9897FD512406C85A5EBD52DD9FBB6A4D66E9D4BBC2EC111AD93F67F183AD5A3F083BDEFFCB131386D62F06615D3A72C1B4BC07D5052B6362E9B4D6FC4F18AFB6DDE6254EF7FA7808A4C9C613094C496FAD4FDC95B0AE3A4F17D" + }, + { + "tcId": 2813, + "kdfParameter": { + "kdfType": "oneStep", + "t": "49AB7B8A7CB82A226078FAF8CED6DFFB", + "z": "C606B9D55F7A133B5BD44FFAE5FEDBECFD324231450CD88AB2ACB43D", + "l": 1024, + "algorithmId": "A3868792F2DAC1B30C2B50F029194D5A" + }, + "fixedInfoPartyU": { + "partyId": "B59C91D32318D3DBDDB591163782AE98" + }, + "fixedInfoPartyV": { + "partyId": "D2D1DD4D3A290D50A73B82D22B46737B" + }, + "dkm": "04A501C9E00268244BAB60A468065572C0E775405A4EA6E0C9B6FB9A901A9027F9D5A4F145B919778ABA5359D8023D6D9C6DF9337AA6F40390B113914D66DDDD2D705EDBA1E91690B2020434FA01BFC43EE07314797C197C8EFD2D3CAC68E13AB487020197589B6DE69AB55573BDFEB18ABB641A3FE19E2C3FDC9ADE596FD63E" + }, + { + "tcId": 2814, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5F8BE0D705641603477E4FCB3FDCC4BC", + "z": "3F31168B6567C31A34B8AE43B0939B914C421273D3463572DE71EE93", + "l": 1024, + "algorithmId": "8AB34B0DBD8E85C82DB1EEB5E84593A7" + }, + "fixedInfoPartyU": { + "partyId": "F4B3CCAD25B5887001022FF9E755AC8A" + }, + "fixedInfoPartyV": { + "partyId": "B2D616826D10E34BB53216435849B263", + "ephemeralData": "F24CAE32229646469B4BB11BA9F6AF9306EF66B0BCB765212A81DF85" + }, + "dkm": "16B7EE4BF62D47E37FF879E40F6B4EB8F9C40C5D0119BAF05EC293B32DF150649CA2978CE44C2D61B3F466B91B2B18202E1A931A23AFA40FAA905716C5DD81E516DCCA9D3D7D4FA3C1B12E7B40310D7C6218D20B7512B75965A8BC6FFAFC995CD92199C4EC82939651FF8161924685F7AB99EEDC36A2241C01E02995B12CF01B" + }, + { + "tcId": 2815, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF148C66A338F4C15F90940CE845B5AF", + "z": "01DFA3C0777BB348C9DC865420DFDD2F827D38548331D32CBD23B889", + "l": 1024, + "algorithmId": "11369535EECC4F019E21FBF6A103510C" + }, + "fixedInfoPartyU": { + "partyId": "D494C283DCE579717D650C3B74387EC2", + "ephemeralData": "A0DBAF617822470800D5C02FF388FCAB3DD6774BB0DF4E1815E3300E" + }, + "fixedInfoPartyV": { + "partyId": "94EFC4582FAAEBFC72B260A61F8545FF" + }, + "dkm": "3250942FD689ED8F3ECE7628B2E3D24389432D92C9723DAD791CF78A8D243145B88D8671DABDDA9081C1C0FAC50817533199BCACAF0AEF985C733ED15568E4D9AE3522CDCF9FF67D6CBA8510BBC8BD8B0746E0339581A6F86FC6B622284E94582689D6435864C1EC0A2AA070DC75991EDD7458E1FE222511DF8A84C23857CE84" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 122, + "testType": "VAL", + "tests": [ + { + "tcId": 2816, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5E450D5C3834B5F0D93C28BE701DD68", + "z": "33E1208A7274FEA2D16AE94B04E6F3AC4178C0800B27509B25B35389077FB7670FBBD6CF5F", + "l": 1024, + "algorithmId": "5D8009B07F8057C4D36654B6485998A8" + }, + "fixedInfoPartyU": { + "partyId": "8F54B85BFBC4E8DF6F01DF8126014DC4" + }, + "fixedInfoPartyV": { + "partyId": "6E7B9A41DE8B65AD4C7EC4B6EFDBB2B3" + }, + "dkm": "8268D04DB615CAA60A45DD47F24D0939590DB8779D5BAD946C3EA8C32CF701BCCF70108AD6DD61B53028015C78C84BA4E6857D068C047B15B6C2C31610EB0E1EE758F39AC6631E81E0924ACFC07CD032318DD44B6DA9851D7C9052587B76EE5CF38B6D8EFECDA4FEFCA528EA1B6044559BFCEE89C644F3665BD0D7AFFBDB9D1A" + }, + { + "tcId": 2817, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DE3D8546BB0C981A6FE3136C921D2A1", + "z": "8B2017F2523256304F549DD1D86B68A846F410B724777E5ECA2968DDB789411D2B301810AB", + "l": 1024, + "algorithmId": "5233A431C24F350BAA9BFF1E1F77D69C" + }, + "fixedInfoPartyU": { + "partyId": "C89D46394B23DBD4C858129890842702" + }, + "fixedInfoPartyV": { + "partyId": "5D46D8D73687863AED7F5958ADA80216", + "ephemeralData": "3D0D254DEDDC03FD91D18B5DA305CDAADE7815DB636AB9E915097AF503A30F96AE638B8F21" + }, + "dkm": "10E8A34CE57197E4D6B3DEE642DDDEE921230FCA8844F5863437FD91E7733D01B2151574E2AC226540BA30CCD6F04AB288BDAD5BC4E345E14FF4D9F5070DEC567E5119A0B3E42365AFABB40424093459BE308F2E23ACD635298D52A1D312A091375D7569ECAAF7A871CC90B6DF5545CDE726E93B0C17A973D218A8904158C113" + }, + { + "tcId": 2818, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5366ECF9DBA5ECC5344D303849A9F72F", + "z": "5371BDD6E56D8DC183C17353C874FEAB061D85D9C98C98ACA6557A3B47B343C553CE6DF945", + "l": 1024, + "algorithmId": "6929C06B032A4B59869D28AD388716A5" + }, + "fixedInfoPartyU": { + "partyId": "6620111953198EF8B5FC02F6B46A155A" + }, + "fixedInfoPartyV": { + "partyId": "26EFCF6F0CAE853082510006F8FA994D" + }, + "dkm": "031A1B740E0DEF6331D2B3F1B6D9F5572271CA6AC8D47F68C2A0ECA5A037D3DDAFAA2A7FF14C9D788AEB44EF0BC61E76F24701C06FCB1AE0993B2CC893EDAF96A42650A34BAB6D0EC2CD701E24DBA80CAC0B5850F30970932942E6ECA41357A3CB6AB72D7641794E00612599524BF7D656769E8403CB8DCE21C753715788F802" + }, + { + "tcId": 2819, + "kdfParameter": { + "kdfType": "oneStep", + "t": "75CAFF5279D8A10F12D39BF43CDAC83B", + "z": "15422BF232EDD6549D17DA083A1A5FEB78AFCE086EB413E05F901DDE3F09935978249C3953", + "l": 1024, + "algorithmId": "16C4B27B7F68FCED28CE76B8E91A0EB6" + }, + "fixedInfoPartyU": { + "partyId": "31490B248E2EB2437E15FCD034E19DA0", + "ephemeralData": "68C3F416BC8C497889AB55F79C49EEA77AED6ACE9ED1B56C5D2F08EA6C7C7F70E982D968FD" + }, + "fixedInfoPartyV": { + "partyId": "DE3C86BC7945E54E0D1264B8612DB693", + "ephemeralData": "499E7578AD0CF2CC3110114D3CDB43C18B3C170A69F17847737CA0F4F3D41AF2E68F7956A1" + }, + "dkm": "A8FFA057DA8AE04AD705923CFC8E1CB524DBBF0B0A07E29FC4FD2AA08DF549B75DBADDDE6C9E42E4BE4504DD4269A463D26C825D13B9F2887D8ACB612B351EE37E195C3E81EE7EF108CD26BF830807296A7ADF745294C3B73FE20AA1C64C2EA7356CC2686741FF7B6D70DE5826000BBAF81F2EC0375D3157A0875314B700CEB7" + }, + { + "tcId": 2820, + "kdfParameter": { + "kdfType": "oneStep", + "t": "86C9FBAEA386FFB9029E81A3D8D9B467", + "z": "28547C5686D5CC4E98A9AB283959017DC601BB0C56DEC57214C459FF239356B325F3B0D707", + "l": 1024, + "algorithmId": "150785071B24D36A2559022C8B9D90AA" + }, + "fixedInfoPartyU": { + "partyId": "CE36D2998D78719E5B27E37AC4A9FA0E" + }, + "fixedInfoPartyV": { + "partyId": "3CB7F2F5B6053DE2C2EC7F07F24EAF71", + "ephemeralData": "4ABA0F1650C07FA8A521A59801BD7A0776E6D92C83A140E4E29F592853CD5BFE997E837CC2" + }, + "dkm": "0E94FA8AF1084D6438370E1002292C3C4DA90AC460087F8DAF2492A4C99BCC6968CECBEBE5FFC73A535565C68D5A555FD9D7DC84AE4CB2C720DFE84FF9F42AEA571D5E3C9325056B7A56AF063058B86DF7195B67C4555C72A2A91FFAC32599E38BD21E35DE8FDD2EFA1463D688A7FAA58492186ECE021F430D342D81E7CE7EAD" + }, + { + "tcId": 2821, + "kdfParameter": { + "kdfType": "oneStep", + "t": "982287214F5B66834F0E58E94B3BFC5F", + "z": "AF420EEB13B00BD7CE24619466D0DEF79A4ECECFC83A1D9F40B3518C4F2153A10488DF25F1", + "l": 1024, + "algorithmId": "CB4F8F68008335372C272A8BE5E37428" + }, + "fixedInfoPartyU": { + "partyId": "B951872148E40F5A075DFC1AA8BDC7C6", + "ephemeralData": "FB14ED3FF7B950ACDC7C840CC880FB80A61008018ADB9054A0A08177532E4070220F47FAFD" + }, + "fixedInfoPartyV": { + "partyId": "4986976D53BBB966DC84C6797D56A4A0" + }, + "dkm": "1A3F5BB9A7DE4AE97F81D57FFE239F5508AE7B0BBDFBBC1A598B946EA493897D5DE22E4409F072BB060B67BCBE46C4ED3A67C2250EA771FADDBE85D1411EE391921E1B6CAC2D0355ABA63695637A3574705CB8DD9ACF85BB9524014299B6DA3474BB275FF63338F0811355A205332E21EDA42E810EAEEF2CF1E5286EB996AA70" + }, + { + "tcId": 2822, + "kdfParameter": { + "kdfType": "oneStep", + "t": "081DAF542921F0F5A5C2C5276FAC4F15", + "z": "F51CD2E5289E37EB1E984EC5977DE79F88663DEAC04B467E3AB98E6656E12BB55715865077", + "l": 1024, + "algorithmId": "130F7C6C4AEE464D8B143F88436B5943" + }, + "fixedInfoPartyU": { + "partyId": "716969D5A9776B0837C119CB245FBBF9", + "ephemeralData": "B3FA65702DCD8248EED75A8E462685BC41DD2EC6562AAB5491F02E6AC29367917E0868D880" + }, + "fixedInfoPartyV": { + "partyId": "3BA27F7ECB16774692AF0891F82A7BEC", + "ephemeralData": "A6A2FA9992DFC9700B44170093D5B4B0E5034B6977B1EF20C360E879A49036EFC24253C375" + }, + "dkm": "053BB6B3D7E1B43D79C8183FF8676A3BD787E283B12411B4D3F13E23382B7F550AC27ED7DF651C520B2843259B82018FF15F413136A371F1367900AAF95D701BF2F1CC7D0E12066BEB4BE0563082B9CD0392EAB306101364E0CAB0BEF23E1B36DD13A34CD629A9B6E5E320DD75DEDED916E00A77F7E1513A18A5A8BC43975011" + }, + { + "tcId": 2823, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80210583EA94670ED36B1477DD4DAEE7", + "z": "F24E3A16D675C137A301AF7FCBA0DA85F2D035758CD3F731234B4B905BD44139850875EE0F", + "l": 1024, + "algorithmId": "F024683D4A97F87B45223868BD5336B5" + }, + "fixedInfoPartyU": { + "partyId": "CF0E5EC16FDDAF20C8E682796CAD6A1C", + "ephemeralData": "3BB18885A5B3D9E292D2D0ABD7F3037963880B6FE1A8F60D74D6CF2331408A063CD413898D" + }, + "fixedInfoPartyV": { + "partyId": "02EFDFC7E6A2ABF2175F482C2264E01D", + "ephemeralData": "2A74965DB0EA02CAEC2DFFE4DCA3303665A68FC36D4584EF301C4A4EADB83591FD1F8614EE" + }, + "dkm": "9ECEA4ECE851B9D8D8CC9A692D8B39C3B5930BD8C66C167B60C71BAF5A8FD333376B574F0D91E5CC205A88A6B6E5DBA6ECCB83905E2A33392A42096B41C55CF587DE98DAD1A9EB96AC86B94C3F3281E75D4E82E3AC860286E1C4D32A1BB574F323AFC40417E1B37702B62A916C7DCF7D95BA8CD4F10D40A2B23B573158707F35" + }, + { + "tcId": 2824, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56D8F0BCFA900B4D493C08EC9BC21580", + "z": "53EE6B665C40100A8C3822A950EFBEB87C6F886168B378A85DF7B484E4CAFBC8AF4C0DE251", + "l": 1024, + "algorithmId": "DD9F60D1BDBC3431CD041C4470F38DF8" + }, + "fixedInfoPartyU": { + "partyId": "685B92DC92A5EB455467B6F81AB82D52" + }, + "fixedInfoPartyV": { + "partyId": "893DF79A7374DA3DC2A505FC1D2499DA" + }, + "dkm": "3235AB56B0B47C2730CF8D0BBFD9EB06292765B61B8C921688F5D6CB42016F55B558C805186FD8075F959FD0B92C1846B8182DB3BF68C7A01B483A55479759338EEA1A71551B78A6235BBFADEEC1F9F4B12AFFBEF9437F4B5FB4B1AB928C126C1FE5C64CA0D0B4AE6D8AA148810525FFFE0CC38F6CA93E5BA12B6723AF04C734" + }, + { + "tcId": 2825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "527165B16CFF5E5E7255C3B714EE09B9", + "z": "1EAD22BE51D346D55B416C6621EAD4C225381B12068E9B1578D4C16EE244ED96892CFD92FE", + "l": 1024, + "algorithmId": "56631B3F2010C238F7415B9FCBD876AD" + }, + "fixedInfoPartyU": { + "partyId": "499E6570C249F981014932A91C23CD36", + "ephemeralData": "EFE791178AA76FEB7F236CA0E88B907B1BF845D070EEF3BA83EE280CE8AC29230A12BD3B2C" + }, + "fixedInfoPartyV": { + "partyId": "599500D4563EFD132025C170FAAA2B0B", + "ephemeralData": "3BE0FA384DDAEAAACC2EA2D56A6ABAABFE9AA465FE0C296B63819DFD2C06B66A2A32ABB11D" + }, + "dkm": "375C106FA64316740206EEAC555F8FCF45AA603E8888CD21E6FC95449D40DAA235251D720F1CBCB8FAAEEA5CEAAC816A47F159146AB90C74DE6A4A8EE96F6F290A9777F6E5703A75D0219762A3A5A8DCDBFF28B259BE440B10B5FFE67A7607CC7BB6FC363967DAD6350814C656530AFD5CB4691FE7BB5304B3BDEA29CBA0ECF4" + }, + { + "tcId": 2826, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B2070051F93CF43ADE4AE7DE8CEDDE5", + "z": "EF1B2FEC240C0A9269A5CF4692BD89E856873A75302AE309649313809E6530DEB4CB22AA5D", + "l": 1024, + "algorithmId": "9788484DEE07C8ADAEB645836FA4EA81" + }, + "fixedInfoPartyU": { + "partyId": "12C58D4D201976676D3C1031DE3B9434" + }, + "fixedInfoPartyV": { + "partyId": "FB0C6BD5039741EA4B7D0B4C8F2CE255" + }, + "dkm": "2303A3C639CACF29F7ADA3B76C7194C51C1BEF6602355B9285C6FB30D80F88D22134E286E6F36E88377D8FF249081C9F8363F703FFA9E7057E02867FA62C80DC85C32533ABA0E1E384F0B4A006D5029F076987E33AC59A65F184DBA9C3BD0CE9DF04995E6F365BDD792F22092BAF719408B00AA591683A802267C9F56AA13F0A" + }, + { + "tcId": 2827, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2021726FDA0468C1B63C705C97684C87", + "z": "47EBABE1E051B09E2FE4E60642E0B87B628548F2B277063FC00E0AB1668091E6C027B4A624", + "l": 1024, + "algorithmId": "AC5EFC92D00202C31F78344CA7BC7F50" + }, + "fixedInfoPartyU": { + "partyId": "297C278C6281F52E65AA30E7BAA0EB37" + }, + "fixedInfoPartyV": { + "partyId": "1B94DE2DB901C851AD00B9E5D4EEA9BE" + }, + "dkm": "46D4FC55F31665597E87CC5D6E01C70BA4BBB39C829A01542B0CD80FC214B1EB2F09B7F2B88C7763AA406A8529BC7F84EA49AC511B25585626AADFE5FE1168FD012992B3955FA885D7AA1D1E383B242F55CA75A7C617E525102B4BB0A0913A1C14C13D93C79A84DA33A1654B33541D009C32A1D26626EC699991C178F98F8E0F" + }, + { + "tcId": 2828, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D31204872DF4E8130B45E19EBB8C864", + "z": "3C8B4073EE9262D79E7BF04F0788FCD7DE8C1FA4F46AAA516C2977BC55D08B39094FA0C5AE", + "l": 1024, + "algorithmId": "8846DC51EF801FB3AB4A7DC9727FBBE7" + }, + "fixedInfoPartyU": { + "partyId": "00A47E75A430C48AE75D95E83C2A7FF6" + }, + "fixedInfoPartyV": { + "partyId": "1F11F83BE45A7D320F49BA4817C9D62E", + "ephemeralData": "0B7E8047851ECB4E030218B62CE1C5AE24C169444991BE5929D7C08B7CA19F41F64FF525FD" + }, + "dkm": "9EA8B75D1839EEA68CE14194E4C613250A4B6E7B80CEDEC43ECF81EDBBAD86CB85D86B64F92FD92D261E3744CA7121D8E4FEA48358EDE3142410B130D12F0C181C1CB7BAEC1AF3307B9048A6A56ED1C6BC6E96FC9F0FB9664DAA4BEC58BCEC2622499B93D434BE43A68C2B7B0C7ACE5300E32FB1D1CE85C5A36934E11B17D9DB" + }, + { + "tcId": 2829, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E47DC7D887BF05D1311FD64ED076D1D", + "z": "F5ECC8F8E8A6E3BD5EA968D24B0ADCF82CE6497FD816D7F545ECF677DFF9D0BB1A5DDE06F5", + "l": 1024, + "algorithmId": "1F7ED3F3BD162F826145D999C5E55C07" + }, + "fixedInfoPartyU": { + "partyId": "92FDB0641968CD2407ED0D0D9D610421" + }, + "fixedInfoPartyV": { + "partyId": "EA2C4D045093229B27534812D329FCF1", + "ephemeralData": "AB82F8432F3B7F1FB659EB72750DBB0E21C3CC068713E50DF98F00052703EFEA1E49E77BB7" + }, + "dkm": "D431C004E8D3A2B5DB3CECFE99DA73E7D83DC03E1BEB6766754FE842DADD1D971EF2378A7D9AD6042574AFC14134315A331F4978062BD49D63C1DAF7B597265CF57BABC95367F14D2AF8ABF58D95082F561CEFD6499B9963E75B7FF053CB09E5736E3DBFE8F3E2D0F2161087DB2969268011FE6824FB659C1B562B293BA6BBBD" + }, + { + "tcId": 2830, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C713FFE51020F10DC6623E2A3ED98A42", + "z": "10B50315F57CE251D21116B4D6DEF83E724D1493B5E8756160AB57BF02759CA1D15F1A5AE5", + "l": 1024, + "algorithmId": "1F862B10E8DD087CC862F203247B381D" + }, + "fixedInfoPartyU": { + "partyId": "EB525B387BAC66B7E76B3B63EDA04E26" + }, + "fixedInfoPartyV": { + "partyId": "BF5D4BB6DADDB1A38A8B1C893B61A654", + "ephemeralData": "770ECB60BB4F1B010C8D89C06315319CD4545DC02E918FF69996694D1EF78D030F5F73448F" + }, + "dkm": "592E9425F616E5E71EB157ED783900C12AC0705039E8E9564A6D2FD4381D2BF70FDDE040032FACFDE0D6A4FBFC8EDAC8DAE7A3AABE951CDB70512598204A711F5F1F3C73838151B73BEFA7407459B61E28F0885DD2F3D9F5BCC58A7C539BE069EA4D1DA78BB2E5A5CBC34A94B690D84C6F93773CD1CFCA87258D3194BDFF4D22" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 123, + "testType": "VAL", + "tests": [ + { + "tcId": 2831, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68BE9920BCEE629D64BD407DB969FCBF", + "z": "78345A9F42F7931E60BC37BEDB65370794B7D051C8848DB945BA1A88", + "l": 1024, + "algorithmId": "1E2955DE842D1EBE3DEC36DBD1BF5D82" + }, + "fixedInfoPartyU": { + "partyId": "AD68A0783164E49AC3FBC45F241D2F48" + }, + "fixedInfoPartyV": { + "partyId": "595EA67822F4495DDDE8FE13FC655C28", + "ephemeralData": "067B01473531357CCEFD76B94A2B7EE88AD3DA40A23C423593B22280" + }, + "dkm": "0A22F34907CAC0E5D773F5D16B05109E3659041426D9C1006058685FB906EBB5D63192F2450F3394581349F7F80B89EE39376C1D7AC9C1E578C120AC20C967D78891A255D7D5A3B21C5322B90EF42F13C936883E893684536346CC84C834825D79CD4E325AD24DC0D6340DC15198046CAB7D3244FF069B99AFF093F506981464" + }, + { + "tcId": 2832, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B6BA442410ACDC647B8E1ECF7E5C584", + "z": "CB48F8C8663F2B7F2447A1609677203E4CF7A731232DAA791A690800", + "l": 1024, + "algorithmId": "F293682B672934DF169E2C980F3F8047" + }, + "fixedInfoPartyU": { + "partyId": "45C5C198D97979FF2267BDC93BD35C21", + "ephemeralData": "28E69655B98083BCD3D4016262815202C8D4EB465DA0E17455A5086B" + }, + "fixedInfoPartyV": { + "partyId": "D282DD327BAD75A2EF5C7CF965BE8B6D" + }, + "dkm": "0660C30013F552ABAB38532A361A2E63A6F9CAE93D0ED2ADF545A1CFBDD153F70ABCD83F86AB5A0BA109B03D5E9BDD6A068695D099A0B7A08BFE9620A241104D609368BC545ADC32723AE7C30E21BDD307F5688C114F130D1B428C7C13D678CE37732C20E6271B73FD0126F5ED8589EC85530A4EC52EC0146F92B8F6BDB2B67C" + }, + { + "tcId": 2833, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE3CFA7AE5EC597C6B9D6E0AADAF4E34", + "z": "EFD8E4C76DDA542AF7C35272D3B140B074BC6B0001642973CB0365A2", + "l": 1024, + "algorithmId": "CF92B1E4CF292903D1D01348545065DC" + }, + "fixedInfoPartyU": { + "partyId": "9EADADE90B5CC6AE7E2D5AED0957EB26" + }, + "fixedInfoPartyV": { + "partyId": "508E03958B4DA34436287218A83CBB28" + }, + "dkm": "4C2938EA5D02A0FADA53C2CD31FFF083A86F20C8E0A18180244809853E020BEC0419835DDF8E26E72314A9740F7A765E59C2EBBB2111D8E59AE12BAE2F08404EE8DCB0169DECFFD95511FEE7B11034EB2E1AA6CBD654A7D6F4CFD2CED333BEC488E2630457491EC69988A10E95129935DB4171ECAE74882F7C92891EC289A83B" + }, + { + "tcId": 2834, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6BE3E8333D4FBAD08FCB957D68A84B8", + "z": "0A82AF6275CA5DE3FF037F6FFFC4BB195E9E1E066C577B74D1EA6F48", + "l": 1024, + "algorithmId": "540AFAE2BA36905D4C99DE29245351F3" + }, + "fixedInfoPartyU": { + "partyId": "4A6EECE8DBED4F972C493FD11EC8650A" + }, + "fixedInfoPartyV": { + "partyId": "661B6528E4F204EC7102718044BE9364", + "ephemeralData": "563BE5ADC5F489EAB7B8F05D860F05E9F19372BB89A535C6BD440294" + }, + "dkm": "67016A9954DE09B05FCC3F205B780F91C076056D327A71EBF8E61A203F47DD632B121A6CD55D54E6BC1E63B905FE07F010EA4424C2B52F47DD133C06639A4F193DDDB8B787F6D57A7FBE6B10A13EFE1752A836B562D467B764837A7190092A9E032DA3BFD3F0B433811BA5415B1C4CA25E946A13639163074ED5F23A08834531" + }, + { + "tcId": 2835, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BAD8346BB9363B2E9B8103470A7DC25B", + "z": "D6E46FD95E9F112461DD36A50483E85BBE1EC7066886A5F481F33457", + "l": 1024, + "algorithmId": "FE364A9261018083A9D5D612130A5B61" + }, + "fixedInfoPartyU": { + "partyId": "7F03143CB60AB4565E0A47A84F3D1C9F" + }, + "fixedInfoPartyV": { + "partyId": "C085A7949445957657351431B74640C3", + "ephemeralData": "C4B131F808086D1F9E2E167A200D0F24262CF0AE25DE1316CF8AEAC9" + }, + "dkm": "0B71F648BF04DE8D3B45C3E78011FED92FFB7190CFC40830C909D76AB984CFCB33A841FC0181BDC2F03B6E736499C411696AC1B4B9F6F3F10053ACD5FAE7423040011348E3E163C32B7A67ACE482E27C6AF510E5C7B0085949C2788D65188385001A1CE16EB54D21757BA1A7AF0E64F47D0F4048E8DA68AFEF5BDCED35720120" + }, + { + "tcId": 2836, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15CF293309868A00628231783877760D", + "z": "73DDAF40909CCA4964C13A08160DF13AA84F60187C3F0845D35727B1", + "l": 1024, + "algorithmId": "4B65D523AC40FA29A26CA2FDDE12C3C2" + }, + "fixedInfoPartyU": { + "partyId": "181FFA370505917DFCFA2B2AFF6F631C" + }, + "fixedInfoPartyV": { + "partyId": "2A9693C78AE7CB6B67F9006F7D0F27DA", + "ephemeralData": "125FBF987562ADF6CD8866AD84AA4F2CBC34769810F60F7D4FF1B560" + }, + "dkm": "127AEB941BC7FA9D1B4B3E59E474254966D37E0C4C7C4C91623775C24A160B322F7ACB87B0F8F80B3CAE99F0CF78D9F0FB469C47DB2A1BEACBBE2074FCE6F685E68EE62C890A3A0285895C7A23A9EF946DDC29152E84671EE5E2727A31C57E48129D6050BA200F768318CCEFA49D1D0E9D7B37A0D317D5C55F350BEDF51E9746" + }, + { + "tcId": 2837, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5647D0C187C4DF310C112373676F96C", + "z": "4B18AF2F79FFE76F83C5A4E9D9B9B791990D3AB1177AECE998C90C34", + "l": 1024, + "algorithmId": "B302AD272C5F73C78282D25AF08E2E2B" + }, + "fixedInfoPartyU": { + "partyId": "F7C0EC73CB02735C97FE690E49756A56" + }, + "fixedInfoPartyV": { + "partyId": "A4322137BFB3515F19FC6A6E9D79B9C9" + }, + "dkm": "675BCBD1897E0C9B4AAC192648EF4E17E53628FC4DD60344E9124F0A7EBD524104E18033F9E7A4F0C7AF6B173FA0A36BD352399F6A00C94EEC78075A6F0EB110AE833DAB07052E074D13A4C5F94ED4B302C086F9718B92E69DE92004077AE30F2EA21DC64C829EF9D6DA99F1B68A4C4AA9EAB709EB0B3D16ED606D1F5C6F663A" + }, + { + "tcId": 2838, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37C56914A7A795E011CDD16A9875427D", + "z": "1DB2C76BDF1A9CC89E782DF5E62D7915916A00437080532E29516582", + "l": 1024, + "algorithmId": "574692B4350F7AEC69165FB292D838B1" + }, + "fixedInfoPartyU": { + "partyId": "695404C129281D404FB3D8B583556EB8" + }, + "fixedInfoPartyV": { + "partyId": "A167BD724AE66E27F0E6B1C06766FB3B", + "ephemeralData": "CD698E926FBDF7B54CCB3078B147C3DC4F05D8A5DDC63DDCE7ABD4B8" + }, + "dkm": "C4ADB230AA27811A5C9A7967CC776A2FCBEE4DB9B9060D6A0352923AC9D704F23C7E237DD6F9441FE2FDEC4E8C8CD4871F418A1BC64FC366E05394453028D43828355E5A16D9B5B09BE29D1BF58501BD4213437EFACFA6DDFA031BBBAD40EA193830F849C14A74D21A0B76A5D98C162343B67C9B56869AA2622E7B024392A43B" + }, + { + "tcId": 2839, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03FCED98531407C26967AA6A9CE91C5D", + "z": "ED117D24C715E1587B839B69714D98DA01CB0149D5F02C3AC3A9A18E", + "l": 1024, + "algorithmId": "A7B24ECCD13F7C8AFB158DF4D4E78C71" + }, + "fixedInfoPartyU": { + "partyId": "6852142C306CEFA52A423B7F9C63C179" + }, + "fixedInfoPartyV": { + "partyId": "1BBD9EE28CADAA806AFCEAA3BA2A8F66", + "ephemeralData": "9490FF3167D7D632E6EEBEE8AC8E444F522E79CC22559E812E9D885C" + }, + "dkm": "5D3C8226FB29FAC6BDB3BF5C5DBA557ECF730AA89BD8CA00F3B9B86EA5B441B8600D37F8C7C8FBE91ED231D20DB1C8190B4BF041868063ACBB7F27176C7DCDCEF9A8A20686A6F7E8999E2CE9FE7A523BDD5EFD27D9C8B9A3D669A0C3DDE4ED8FA6CD941D265ECA0E18811994D84AABF3F4E57BF375FF92B8AC32CBA273B222F7" + }, + { + "tcId": 2840, + "kdfParameter": { + "kdfType": "oneStep", + "t": "930AF49FCE19119B60778A369C4F7084", + "z": "53AA0BD9E7845524113D64EC9CC5DF3218D545103A87C7A69D1C69A2", + "l": 1024, + "algorithmId": "D587079DA7205D66A6C34165456C5171" + }, + "fixedInfoPartyU": { + "partyId": "F18B15E8BD2FEAEB34048D537106F528" + }, + "fixedInfoPartyV": { + "partyId": "1C9AC334E54D6EF8B73AE17D4BBC2D5E" + }, + "dkm": "42C3FA8B67C4F3DF6012AAB9794147BDC2E0C3CF0FD255B597200BA5C19A30FCC2E9382FE508FCFFDA8EAE5FAB58DF0AB4345FCB7F67A07546F4859DEB14A06F79E897FFEA510CA43ED41FD3C729BB366BA5646BBCE356C700C84BD2EBC282D7B00951912FA6FF1F0E657D38471A2C245C756FBA6E0500FCD6491D16372D9632" + }, + { + "tcId": 2841, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7813233073BC4C2D1286B842892F2371", + "z": "64F2ACCBC3F61D7222C903C25E66E90C071CEBE69F234B96BE2B33FA", + "l": 1024, + "algorithmId": "DA60FAD827D46E9B87145CB11FBF517B" + }, + "fixedInfoPartyU": { + "partyId": "56A28FFF2643A1CEA42C5B5B7856A1A0", + "ephemeralData": "BF208FC1BDB1ABA49444FFBE58E9F3673CDC06F05A2CB15DE643057E" + }, + "fixedInfoPartyV": { + "partyId": "556A1D2AF0427EAFA64C27A07BE223A3" + }, + "dkm": "AD1B6EDDC6FF3531EADF5AC308354949E4506802CFAC120D30A7FCDAE685983C4842F2F66077524B77DDC027160C92A916275BEA569306A0DDF3A3676281CD946B927B2F4D5CC34FD50C6ED1C24E1726843CE3BD6847D46B0D16A79344EC141FCE86DBA4D85DD951A05F50E815834A25DCA9FDB6E686C22D85AD19312ED0A394" + }, + { + "tcId": 2842, + "kdfParameter": { + "kdfType": "oneStep", + "t": "349E3422E3B3A5A68EB4DBBA0F557C62", + "z": "A6DA287FFF2D06D83F15AB938F1411A599807042844FBC8BF172D28D", + "l": 1024, + "algorithmId": "9D1ECC3CD1460F61BDDF7D4C80B633DB" + }, + "fixedInfoPartyU": { + "partyId": "4ACCD12DA5122D5A694312712D9BFBCA", + "ephemeralData": "996635ABCD922753D446B9A8E2627273A5865B5E1F7650239094E91A" + }, + "fixedInfoPartyV": { + "partyId": "B7130E25ABA616453E64A4E23A06116F" + }, + "dkm": "58994DB5ADF69E11D2B367EAB1111967189D0D285F42AEFA2D27A726891E2E7AED620D204A6975925B2D4CFA9926A931B65188252FF0146115EE28DF7E9641D471B98265F937D301ABD472EE4E9DA6BACBA9609ED7928E17CE13DD57FA5C1F07783CE2188BF5448988086A663FAB8C3C6C2CEF2142B5F58EBA3EE1A76191EDB7" + }, + { + "tcId": 2843, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E9D38D3C3587874584D55241F56A189", + "z": "597C5520E15D7987A70BD0F1BDC1A760701D185C76AD493D3C293ED6", + "l": 1024, + "algorithmId": "8603AF554FFD670A1A77C9D2F1AE6D36" + }, + "fixedInfoPartyU": { + "partyId": "0CC2E0F43F48C78517785ECAD146B370", + "ephemeralData": "872937AA2F01A64BD1A90553CCE71C47E05D17F52D03D29BB7CCF8DD" + }, + "fixedInfoPartyV": { + "partyId": "47D4A443E0D5A2B05D42AA51B6A7B3CB", + "ephemeralData": "2FB11C8AD99C8FA67042617BA8630C9DF737EB3A19DAA07261AA3E36" + }, + "dkm": "FAB0F0B02BD7F263BF0F7E25116BDC414158E56A37E89B58124E6D7528AA9E646CADB8185A5B427B1ACDC74502C3FBAC7E43FFDD4726590BD1C2B097F7D47DB2D4F0F9FCFE4409D30E3814AE939C3125A7DB01E82FC7D52B7D403D0C4D8C16998F4311137F30270303250B1A4345BD2356A9FDF20F7D21909E7B4BB05325C1B5" + }, + { + "tcId": 2844, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5AF6AB12E38BC47EC69082524268C9E2", + "z": "AA10D756E63DB0A6F91289FFE2A06024197630505848F8492E71D669", + "l": 1024, + "algorithmId": "A09B9D2BF4F76086A60A0D6F8E9EE768" + }, + "fixedInfoPartyU": { + "partyId": "22F10F80EA566C2B558B9C69DA932681", + "ephemeralData": "3292B64AD487AF9B9C2AD69EE872D88B98B8B4FC9889E4A8241EA177" + }, + "fixedInfoPartyV": { + "partyId": "E86D420A41D886F135DEDA1BBE967828" + }, + "dkm": "40CAA22206B253B14FAA02BAA1019C2D31372A93F8D151837CA1BE2C50FE456F6318DAE7CAEA80D78B737ABA795AF60F762655DC1266621847B61E4723A73582E629F0C7FAB9ABCD0C849E692DFB853939AAE4CA18E1079B22FC4EAA4178C95FEA459EE0D7F96E372D8FED9BFD0506D7323E9C2B89DE7DF05CF6E9D5EC3ED440" + }, + { + "tcId": 2845, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34035723D9B1E130617C8D5D75F9B25F", + "z": "2BEEA5B32D90F2FB83CE729879A86B8A95554678636B092847369299", + "l": 1024, + "algorithmId": "963AF49D190821D76C77E30D1F062FBB" + }, + "fixedInfoPartyU": { + "partyId": "16FC9646566EF3BE0B80D41E80489E31" + }, + "fixedInfoPartyV": { + "partyId": "1B83940801A7387F88B1403838C5D7E7" + }, + "dkm": "D03F58BE814DA3CE63D818B1CC1E6F7605465FF858499E6F443EEB0C8790C896348F01959327886F6B35C4AA2D07946C6BBE3314242719F022A37561F446D3846CA7D966A9C1B3D3728CC17AFB680059683E54F3C207DE6C1D56029A6F196E16BDF25674BD0AA5AB0D30E643D36779F4C612640C68E752D3F439F673738BB137" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 124, + "testType": "VAL", + "tests": [ + { + "tcId": 2846, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD528DB064CD89259A0033356DF147A1", + "z": "C29A71FF313F9B84A7B5CBE59C59494968693E85643E1215C34451DBB5", + "l": 1024, + "algorithmId": "D04F421ECD323EDF952C902397993173" + }, + "fixedInfoPartyU": { + "partyId": "F5B009B2348C0D0AF1431785EC51E5C7" + }, + "fixedInfoPartyV": { + "partyId": "78A3C313113F30069CC1CAC77440DC31" + }, + "dkm": "6F66EF19479F9BF247A2D7579B3F874FE902B3E2F39AD0C6EC380948A88894355B008B649C85B2BEA906A58EE725400B4AA8CE5A05D29EE3CFA6D74C8D057D01CDA2EC14FCC0B114A803E56B207DDFBBFD106A908244D7DE0502B0CCF63E39346969314483F09C0CC787C94F9982452D3A24955A3FDD24FF63178ABB37B114CD" + }, + { + "tcId": 2847, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1744F112B408454B7F5E24650EF5D264", + "z": "D3788079576E13E361F0E9E654C66501198E32F6151788F72EB30F4C21", + "l": 1024, + "algorithmId": "A52D265CBE484F20ECCDDCBECBF9B692" + }, + "fixedInfoPartyU": { + "partyId": "F16FF9DD496C767A160F9D300B2ED919" + }, + "fixedInfoPartyV": { + "partyId": "0F77B45CA1393DB553082C5F42E04965" + }, + "dkm": "C0A95AFE3204DD3A1A84A33D2531FBA3D0544C504AF0C332322006A083F71A7B6F8C5D57DC27A1097E5A3FFBBAC73E4767B65F1088339FFA98375088C83C55F294C2DE368DE1F0C9180F0C964DB940C979A34D9F0D2AE5FC8372FA4748DB0A31CA6FB574F702A2513030D416C3661E44AFBB15014933B78E4981908851C49ABA" + }, + { + "tcId": 2848, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDE9F9260D9D00E05725D2A7BC1F5932", + "z": "43B4F0E5AA0ADC19667A5647E8A30C712837DAEA82CC2C849C3E21D02B", + "l": 1024, + "algorithmId": "719D75C66724746E92C0E0B4D13DCFDD" + }, + "fixedInfoPartyU": { + "partyId": "F8BD39522DAED55F54F53C578B756CB3", + "ephemeralData": "4CA871884E1635D1AB657DCF897894B69316F412666EA3DF24FAF36F2F" + }, + "fixedInfoPartyV": { + "partyId": "012AF01CD18D8E49C080B6BD111FDF14", + "ephemeralData": "93F0403FB714FFD605D5325222FB6D9CABDC3A5E41933F6AC9B5191ECC" + }, + "dkm": "3DC64599646AA051422A9ACCA2B98B4AB4C73C2B362FA73528CFBFE83312CEBC73E5B6FFB133232969C73D3222E2CC4BD23CD6C1C931E25899466A4BDE294ACD3024D7F41D990DA87A2A6026E6C7587F5E3303AF7CCDBC65E9D87590854EBFF5C35F3AC129DB67D2E31205AD098D9988D4557034E33C715C85660FE097426E77" + }, + { + "tcId": 2849, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B520C87D0D817F684DEE5B3AB0AFF6E", + "z": "EC027C737F638B860C8CF75E8EF7CB5A1A32BCD172CC32D01A15890703", + "l": 1024, + "algorithmId": "093522685E9410F4C128C51972F85E49" + }, + "fixedInfoPartyU": { + "partyId": "29E2383DCC9DEF2099615A38BEE73A58" + }, + "fixedInfoPartyV": { + "partyId": "3054A695267B7D4EC6152841E14B9C69", + "ephemeralData": "72E5DCE9F7D211160BB6DF0AD339A94DCEBF596F6D5D6AFFE174D49619" + }, + "dkm": "60CFD5F30002523C46786624CFF9070A9AD4849E17C73C89F853FBFC41509034748A8B9A67E0833F8A6ED3B4052A7D8DD9D957E73192A401B9CC97121C4D5608A0C343F844EB806AD1827D81EE3187F9483D3B9B2F73E88D38E0D89C9C8FF898195DFB3B0D96780B422DCF59BC9E8EBD5CFE99A9BB54B93F92D5B57261D4F91F" + }, + { + "tcId": 2850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B9CFF8CF89F5C6D0DA102DB3B845FF9B", + "z": "8B03C4BA02A10ADCF671D59C9B2294DC129FABB57530908162552D9A63", + "l": 1024, + "algorithmId": "2D50ECCC1E3985FB6E5EB728A098B627" + }, + "fixedInfoPartyU": { + "partyId": "068C056C47F6E2F18E34C77FB6029ED5", + "ephemeralData": "6652E4BA8D1F77D9F92489DC1655D48DB963697D4020AF08DDD9729281" + }, + "fixedInfoPartyV": { + "partyId": "CA4A3F955395F8E8EF3D3C44F3A2D40B", + "ephemeralData": "D1F4E42E6696517470C7A834B95C24234C531BA767E1022956F1215438" + }, + "dkm": "28F90BCF8A3416911FB8CF2BBD45709E92C0521C1D32F6E07956F0589CAAEF1DCD7103955B86883975BA8D9A1D8E38698BD4159821FB4323852379DB78CFA80E5FA46C607258CD477A058B3282BF178F9C46D7315F493F47B3B457791E030311040261620BCC8ED2DE88E76EFAC59F915875DB3099EB0E316ED09B03099C48D1" + }, + { + "tcId": 2851, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE6A7EB6B73A065E67DF802E25B5949E", + "z": "4B49BEB1F886B54A986D98C510C7B6C00E24C68A5473F6CAFA67ACDD35", + "l": 1024, + "algorithmId": "6B78845D4EFC7231F58686501D18D706" + }, + "fixedInfoPartyU": { + "partyId": "B9A4D1429DD37011D780184D07B23ECF" + }, + "fixedInfoPartyV": { + "partyId": "AD0C496E2627EB16FDE6F0A773509E59" + }, + "dkm": "0DC2D3E026EBB8DAC664AFA8F677B6979445162575EE3F55FC2BB9C62D3831E9379E6E2BC08E8195DA94B49ECB8F51E5266004F23E98B0F9513390FB8B3189B842B56021C1042E5D1932DA4F57ADD078F43510B0A06E5CF712EB6BF1AD94CB8B5553C932244F53325F8FC6B653D09B34A19FD3DBD8A6B09E0E5AE38A12B62B4B" + }, + { + "tcId": 2852, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A47B4143F2FF8435BB628703AA59786", + "z": "F35EF6B6200183DE7814BA8012797915AF108944AB163C5394379996EE", + "l": 1024, + "algorithmId": "478FD520B4C4E7330D6522573911D629" + }, + "fixedInfoPartyU": { + "partyId": "9E2C8F8E5B32B2583B8AC539A07EF825" + }, + "fixedInfoPartyV": { + "partyId": "DD5DDD169812101132FA942CB57F2EAB", + "ephemeralData": "A378B5276D8464F93DDFC80A7963574EEAB988CDBA3EEE4F756F0A4B85" + }, + "dkm": "128ADB0D99F9AA115B9CACD34989E7D0F1CEA344E0E4178B7B22C1A7F3B3F0998A58E5BE158A6CDED9E1483DE2D47901233589CF1814F747CE38256254DEBE86E62E5DA0E12259081C3D4295064DDC1D8A04BEAA5813D3F0DC7CE7D7B854FAC80B75BFA126F02C2663FB62286100BDFCA6BB811B2B39C0DEC38B465B597FD7A3" + }, + { + "tcId": 2853, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7B7A351E2AA6916F0DCD5AE7AF2AF5F7", + "z": "1775BFFBA1CBED6E3B89271A961A0A56739D694A4141FBB43D3E6BF2B2", + "l": 1024, + "algorithmId": "5941EAE889D65A7298E1E7C9CCE518E1" + }, + "fixedInfoPartyU": { + "partyId": "AFB35693FD82B9D44FF9B65ADF3D7AB7", + "ephemeralData": "73CC2D7F717DA7B4566DB8A156BF17C72113E2D28109E637D5E51A11FE" + }, + "fixedInfoPartyV": { + "partyId": "17E4D9D65643E15A1D4CD9B3D759AA66" + }, + "dkm": "3332A4EEEFDD3A3D995EE666D8FA86ABB86FA92A428F6591EBA103ECE31FF771C8561C46F570C06F6F9CC4E691F3BF2503A866293CFA3768BE393F0666C89D33124A197A86A90343E819F80DA5384E284F806F6C01CC3F155C6F1F474CB7F0A38F27CD16B7A356426517FB2836C8EB48AC53082969E2154E6C9C63D1032C412C" + }, + { + "tcId": 2854, + "kdfParameter": { + "kdfType": "oneStep", + "t": "721D2C417BACADB548CAE481E966947A", + "z": "F474034B44B10D764383D170726B92225B787F3848D44FA5D8AA2EA3D2", + "l": 1024, + "algorithmId": "7C0CC8E359B2219EA977A021B9930E95" + }, + "fixedInfoPartyU": { + "partyId": "6448A19245D5A461993F863F037168FB", + "ephemeralData": "3EFBCB10D1529C1C740DCF4CDFDAA18D667C955C2F995BD109401A93EC" + }, + "fixedInfoPartyV": { + "partyId": "AA29106A1697F2B35A705EF24DC4D4B0" + }, + "dkm": "BC7178E9B0171C0C453AE0751B5750756C36833D7287ABCA7FFD2646C3C5AF39B268232C533CE622E5BEF5662F1BCBBF04F2FB257438BCC3D7699CCE460B953EAAF29A34782FBF16FAB538F0980EF62EA34102F14857AA61D119F845993C928830B80A654E73803D44C3283D27395BC3B68D283416AAA05B2F500D693CBBE5DB" + }, + { + "tcId": 2855, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A1CDBBDB214CC202CD9C51450734A1CC", + "z": "205EFC286203EE79E36419A71178D8B2A38038DB5590AB1BCCD0E092C0", + "l": 1024, + "algorithmId": "168F6DBD297BA17546EC6C20FEF5FE54" + }, + "fixedInfoPartyU": { + "partyId": "196AB2A4F5B04ABE8C2B68D9D3BA6ACA", + "ephemeralData": "6E695D52EBAC49C9AD7D718A704D1FA36EDDA347BE69A13310D3EA4F29" + }, + "fixedInfoPartyV": { + "partyId": "87211B691937B94C74ACFE47EA84C73E", + "ephemeralData": "643AD123D873A426F31F7F7FFB37D5BEE73D05606D9BF92734A890A650" + }, + "dkm": "1AED72B0665543660C46B85B66C687CA32C472D286BA5C4FC90BD271D9BB7E8D2CE91C0393DC38F7DE6A1683C49B5D0F55494200A85E3CCB52475766441D3CC30CBAA05E6C1DDF6CEDEB4198C4EFF6142D93A11C38A4FAA26C8009B991EE7FE513183D1E6F7EED29FEAC1C9FF7F96010F4B6600FC477C5A43C09994A439FFE66" + }, + { + "tcId": 2856, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5257D44277B523D0CF0CE41B4A5AC4EE", + "z": "18AED4D48F655512678503D23BB69D6F0AB2C74FDB554FBF74976A5FFE", + "l": 1024, + "algorithmId": "5506F8E6826FF6252A99CDD2A4A49B49" + }, + "fixedInfoPartyU": { + "partyId": "1DCC6F05742FE06E8D86841C9E50E822" + }, + "fixedInfoPartyV": { + "partyId": "A0EA9F08050AEBEBD1D06F3BFE8560C5" + }, + "dkm": "2DD4F97E075913235F768F76E8298FF2CACA18E5F02AEB5DA8C6FFB9D5B2F7EBAF356A61E67A26C6E0B50E21A797EAE16C6A7137D3E0D04513CC6EC4CFD9B4F3CDD3B02CD3F7A0D47AA024147B124258198A9BB650B93DC43B0AA4641626DE72910F6CDAB0E55E1469244CC636E93FB82CD5B69A2EC79D7322F31A074B257F31" + }, + { + "tcId": 2857, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8AE115B59973C56927A38DC24FAC1EA0", + "z": "E35DC4DD234044C476141AE31A9C50EAFF2F5EB41F6BF9525BB0D8CF7A", + "l": 1024, + "algorithmId": "EFC9D6FD69946F7018AC57232D04C7CE" + }, + "fixedInfoPartyU": { + "partyId": "2F0E2F40254D9319FE2EEE098E5A6313" + }, + "fixedInfoPartyV": { + "partyId": "9B8E7E8C978AB514CCFBD27ED6757E27" + }, + "dkm": "94C2DB93B452FA6E603CEBDBA1BBB275FC82201F24BE1453A924E9E144FEE0AA5A73B89DE2E1F063DEDB40CCFA3FB156639841B41ACEA78B2482D68C7CF121F73B30ABD274E6C51F997878671AA046BB8D11A18C9061B9DCB520D35E16146A2B9402AEAD13C20C52F291EA21F9116238F92A00EB62925FF617EF36C6462D70C3" + }, + { + "tcId": 2858, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6ADC86A3CAFBAFF15B29B573B725FDE", + "z": "EA1E3A83FF48C1387C8199B120B86BAA6B9A9B1E785278756D1A776456", + "l": 1024, + "algorithmId": "8E8B3C55B392AE2DD8CD9AD83998B1E4" + }, + "fixedInfoPartyU": { + "partyId": "0039C31FE6682171C4F05C9B01656E90", + "ephemeralData": "9A308FAEF47B4DD09935B0E867593AEA1B2EA21E7A2C2EB91CF74E54A9" + }, + "fixedInfoPartyV": { + "partyId": "4D3D21D537B574F3D0E5D9E74788755C", + "ephemeralData": "FEFB737489541033E61AA81E91FD296D03D307D97DCB88DAB88C2E3756" + }, + "dkm": "E6432381ED2B436AB6B5F63AE1A70B7B148C7DC52F886F310E2136AC62647AD3DA4C818808FC14F4943A7F2D1F110D64DEF84DFF9B0AEC132B458AF46D6E745F6D9EBFF54750DC560F83929A79024754FEB3ED210150F60D2D66A4A11E3524D8B05168996D6AFDFC5E2D9D9AE25985FDA91A544D9E2E8A508946FF51C01B15E3" + }, + { + "tcId": 2859, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A0B3B0DB5EA219C82383AABEC963C720", + "z": "CAFA34A9CBFB0F116EFC74AED22290F540582592FCBDD48E87493466A9", + "l": 1024, + "algorithmId": "0C5A2018018B96CA84A36C14FCCC4FA5" + }, + "fixedInfoPartyU": { + "partyId": "842CCCA6F2918410ECB258EAE21AA944" + }, + "fixedInfoPartyV": { + "partyId": "D95ADD7D39579732B73B2D8B7F89D3E2" + }, + "dkm": "060B4F8E1D27EB6794A4698572286ADF94BA4C00EB458E5DBF66A8998FCA711D708D072EAF565E79A6B9A1A0BDB7ADBED40C58F2F7B0F50FDB3AC09E3FD3147628C86B28829770E704F0F79DC7DB07CF12C996E8116B0701F833228DC01C12B9B0FF50B1AAC79384A030C473291DDF2AD7B075C7B2C24E144425B4941C78366E" + }, + { + "tcId": 2860, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29E57C9103F369FC16DC7BFEC2E64458", + "z": "09DAAA817595EF568A9990A05FCEB125C4FF2CFFA8A829DDD8947BD1D0", + "l": 1024, + "algorithmId": "093BE9108CE8E3C25490FC44A6985210" + }, + "fixedInfoPartyU": { + "partyId": "4EFF1A3E1B7A30A66E3EBBBEFE45C38C" + }, + "fixedInfoPartyV": { + "partyId": "4E33571EE5E17A9F4BECF0A324B7D652", + "ephemeralData": "885C411EB259D2E8E423D32F9946F03B4B7D1570B86073690601E73C1B" + }, + "dkm": "0DF62BA90B74CACB29E43A0048F5E96F9B057A0EFB0470F2FC9D0E86ECE8C2BA9C9935995261E80C21ADA934F1E4769D34C01D75E9AA4014AC33916323C6EE188F3AD1AA18A8B0ADBD3FC5CEE493410D18907BA9BD3B3BBCAF973C281A3D0DF99D024DCD3BF1A64973B3A14F61C46A02DAC6DA8B020E043A08A735A3B7AF2EDE" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 125, + "testType": "VAL", + "tests": [ + { + "tcId": 2861, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2056A37714076407455254B160FF1AC5", + "z": "B3042B91B7BA1785ADF8DBBA850332AA9ADB96EED0DCB30596DB3065F3", + "l": 1024, + "algorithmId": "56F4BD423B10A2C0C9CBBA6833D60A0E" + }, + "fixedInfoPartyU": { + "partyId": "BDC3902366C0C0198DDC48F04C1D51B6" + }, + "fixedInfoPartyV": { + "partyId": "AFD90523764D6D725DC7BD8F03315DAA", + "ephemeralData": "178FDB7DEE559427AFD2CEE640FC54F58A921BFA6C765561AA8F799C19" + }, + "dkm": "55E04D4B645DE1F76B16184D9032A08A23C07D25D464178B5EE023991EB63829DEFF53450BFEB647C3F57F627A17A2F38FBCD485470B346E130B2C9A3238AB645C5137C9B8E13EEBBE11377AFCC1207F094745146FC9B40F4127FF5328AEC17CB975FF684A4C34DF51FABBEC91D947D483FB1ECEB480B8351BB13CFDEDB10A87" + }, + { + "tcId": 2862, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7A0B3A4D3C87D9B7CD112B64754A3D3B", + "z": "ED8551CD0B56E31BA622DE9156C2A910606A6AC99C1E7C910DAC931417", + "l": 1024, + "algorithmId": "CA0930F6CCC13E048514745F099A1C81" + }, + "fixedInfoPartyU": { + "partyId": "C09BD82CC1A9BC5D9DE2B44632CA38D8", + "ephemeralData": "6034D5F824C75C1A379F91C430F63F40A13C30FBD3E95BBBE5C530A66C" + }, + "fixedInfoPartyV": { + "partyId": "B1B972496E7CF22754AB60639548427A" + }, + "dkm": "8FCD88774FA77A4E7CAE64C22B52B49052B42ED1DE1D6FEA1545B70A04294D7E149DE2BAF4CCAB08610B44C294B530340EACEA05ACAF4C78DFFD13CB62383A97EC29581475F91DBD125B57B38DBCB9F2751D1EED68330B75E3C44F6D3C9D3ED68253D16649B893BF28E3E7046EF951C7C4721D53BC9218E264D83EF0A580C21A" + }, + { + "tcId": 2863, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BAEC76C94DBFBAED149BB105DE783B6", + "z": "E49CAE9ACD8D747A836BF0486CB4B1121F66CDFA5B7F40C89780D72807", + "l": 1024, + "algorithmId": "C015316E74A61CBE2FDCBF975C6C1649" + }, + "fixedInfoPartyU": { + "partyId": "EE15026743EE299459466C6A6EF6C248", + "ephemeralData": "27021ED75A6BA5B5F8D637139BA41AFCB34AB48CB843D62428274A9BB1" + }, + "fixedInfoPartyV": { + "partyId": "91E0B22A209D1FBC5112E8E99F5E781B" + }, + "dkm": "3F3096F4B0FF4DB48D9C0DCCEC2CC96A90CC60639C800B7863CA0081D460F2736B4EA3D300387E93E7AEC2EBD7DFA26F42BCB69BA3DA614E6C4CAE4A8FC7607E7D515E12C03F2B0F147EAAC985E915CC05D34805DDEAE9C05234F6845AE02F23190C3F490B1CEC43AA282F9C5DE4F37F602BB939A67CF9C18C71116D8F89E525" + }, + { + "tcId": 2864, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D54E011E4FC796F02F40ED1D32B2140", + "z": "B1FB0E2E4C6D963D8606E2EF00BDBA0AF1E4D359AE8E1957AB79B2D3AB", + "l": 1024, + "algorithmId": "FB270AF9B1062A9FEB63AE747D31407B" + }, + "fixedInfoPartyU": { + "partyId": "3A77259C08E84FAD572605C9D6BFD97F" + }, + "fixedInfoPartyV": { + "partyId": "1E497C2D453C6EB64DFE22E33FBF6510", + "ephemeralData": "12E9971288C0B79B713CA81E3B321E17EAFEF99F52659304280D147F2F" + }, + "dkm": "C91B5960715F6667A081869752632F1C4F7354074EB1F760D4D1AAFCEA7B242FA0D920FC6E4E7A7E64855258D7DA158AD46F4B46A97E43A2E4766401FE35E2813D558BC46E92847685561A31E1CD247EB7E4F3FD5128702481A1F58A04F7C23878008F5677BBE9C053FA3B851890498DD7A61F09F6D2DB35A0D39B7FAD09428D" + }, + { + "tcId": 2865, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEB0085F43FB0E64D61D9EEE001836D1", + "z": "4818578FAAE6978C5753C1BDBCC497F215946933E8F12F219F60AA7AA0", + "l": 1024, + "algorithmId": "DB22CB7E4634D2FACCD14326BB65C784" + }, + "fixedInfoPartyU": { + "partyId": "35BA182707AF3BC12003A65522F26C8D", + "ephemeralData": "4B1282FAA4944CBF7176C75AA817CA10B6C4E313875D46A187367671C1" + }, + "fixedInfoPartyV": { + "partyId": "2092CEC5ABCB0612A1E6CD20B1DC7430", + "ephemeralData": "CAFB539675E4429513069E5611341E8C92E2240117BEF3BD7EEFE52A0B" + }, + "dkm": "081EF296FA4717FEC7B46F8B0F0E1E8A3FBD6A005D046AB4811905DEA6A0DA8F7E915E0EA03CF1052307815B58ADFEFFF692AFDC268C628BDCFBA4E17B4B810D88ADBA0102AB96787C79A2D425DD3A49CD230C438C7A3BFCC601C93D8B51708CD7C4635DBAA8085A0B804CAF32F3847EF03909A9077F808C62B4360737003A9F" + }, + { + "tcId": 2866, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70E03C209BCCE685B7E4ECF59B3C1D10", + "z": "DDCFBE9C41385E16708AD966F6ABEAF8413B46A8477039B225F08A0A4B", + "l": 1024, + "algorithmId": "5E0B3F273C0FEE14F872A9B643532525" + }, + "fixedInfoPartyU": { + "partyId": "A64C54CBE45E391BB41CF19F0ED8D8D7" + }, + "fixedInfoPartyV": { + "partyId": "69F388AF52AC34005663B9A420FB8D76", + "ephemeralData": "6270BC9FB7751E32BCD33025989111C2A4A67B2DDBF7CE07A12D6DD070" + }, + "dkm": "A397ACFF1FE6132D26905D1719E9DBA084380BF259D266B2BE77E6E8800A3259E8D0298EBBAA5E7BC16936B4CED5FCCA0251928D3A7ABE2172C0D56DC5D7517589B5D41AE8A488A4BD25AF3EDA976743D2D90EEC6DA6DE9490BC0154235CB8FA01AFA1722F473F6F458C1C774380429D66109364165F0E302ECEC73883D79475" + }, + { + "tcId": 2867, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FE2496DE5523BC9A7E79629F3A46588", + "z": "E7DE8E5D5664AC6D373EC380A8A5541D4C7F76297879EAE0FAF4E27470", + "l": 1024, + "algorithmId": "DBC86A3D32314B57F4DF5D1312960DFA" + }, + "fixedInfoPartyU": { + "partyId": "00C6ECC94011B0096BF64212690E86FA", + "ephemeralData": "FCC9345F4C6208358387DC0CCE4C2E3C989A5FE36AA56F887C99E17E5F" + }, + "fixedInfoPartyV": { + "partyId": "975FA7C39FFD7E71F5CA902B622020EA" + }, + "dkm": "967D0CCDCAF74DA0065B3B871160C38D37FED23AC48C2B284355AAF17D669D4A6122076090964E4BA78370C3FE0E5101B89A9016C1FFA8D4E4C5F960726796319EFB5588625AC9180F5AF133267B79793331AA29C529CE6A0099897AA4BA9D2892719D73B95A4BDB7D91E0B3AA18BA8D01908250B1D68ABA46FF4CDC5F2574CF" + }, + { + "tcId": 2868, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D830E67519FE3C50ABC3EDEC889101C8", + "z": "D54B1F3B13CCF27C5DB185EB93CA15BD06B8C90ECD8551A4EC204237FC", + "l": 1024, + "algorithmId": "0B333D36C0642879A854D4876FE6D6BA" + }, + "fixedInfoPartyU": { + "partyId": "23DEBA0BAF231E13FAFEC48CF892333A", + "ephemeralData": "0161CC80CF16F97ABF37DB93AF0685B10C75447F7B7E618A85332692A4" + }, + "fixedInfoPartyV": { + "partyId": "B944117930A8B4A2258C9608A814C152", + "ephemeralData": "0732DE0DE1F81A04CC30BE287D00BD05630F98294BEC03275BA99D6D06" + }, + "dkm": "0C0C84625BE474F3A1A8A848979699D0DB2FAFDD706E9781BF728AD0B1A337D87AA5B3ABC951BD05C74C19CA4FECE5D0E9E41872AD0CA66B626350427FF58740D9A16689EF165B613C0EF6072E057D6A69086FA073ABC9C0AF6BC3603A7FA94574A28380385B7A31DEA3BDFE50D87F9EBC2BFC2AA572BFBE555989431D8A7E6E" + }, + { + "tcId": 2869, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D07B894F3A46441A28535DA4C2B6033", + "z": "F4138BF6203ECD18DD68C67295D36C6E56E5CB1406A3B6060E6E9FE1A8", + "l": 1024, + "algorithmId": "3410EE8592F10C92C681B8ACC0EC6E47" + }, + "fixedInfoPartyU": { + "partyId": "FFAFE292C3A966E7EC23A89404D9328D", + "ephemeralData": "D79DE0CE302DE67CBD5CF8DB84550A843FEF0DE71E6D714D3D8713B291" + }, + "fixedInfoPartyV": { + "partyId": "16C0759767E4508D34CCB72612A420AC" + }, + "dkm": "1CAA1C4233DCAE691324CF5473F05A149D42548A76FDED5ECFE8EC3C11EEA66142B7AAFF7C6538C30C376D6CC8037369622203BB9DE0F46CD93BCBE1DBF872BF12C39A6FD8510E12E2267BB4D5F28B310B20DBF6E398BF355C34E3A26F6D1F3C12ACB1B3E82E8963176B138393298016AF7DC8E5A83C791323170FB279B17543" + }, + { + "tcId": 2870, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D2D4C4A6649E56BDBBB5861DAC916EFD", + "z": "6CC11BC4B01247B17F671045D9F10078F1759D42CBF858A4A6456C9C06", + "l": 1024, + "algorithmId": "43D88E2CE84000D92D400A18D8806598" + }, + "fixedInfoPartyU": { + "partyId": "E8DAE19915589D93218FE16E2C1486DB" + }, + "fixedInfoPartyV": { + "partyId": "9689E1945A5554526CB3608BAC5544CA" + }, + "dkm": "3D9AE55BD9C152244BEBF205AA5602F9DF858E504A9FE4DB6FFFDAE3D9D2B89A3DD1DA3C3EF0A87EED2E238C18CD619DE065FA636436E4D28369F2B9F512F504650F067D912567B425377711922CCD3DC25742135C8E0A66101F4EA728805C8873CE0B2D5339AB848EC07037BE3EEE3D0E7B16BAD003377831EC189F32B27E24" + }, + { + "tcId": 2871, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6D65CD03DD3B5344249BC6838D62710", + "z": "F374386C61EEA16FF80C666AD36C39DAEC1F041101CBA18315C6F0D534", + "l": 1024, + "algorithmId": "81B6DAEF9F42925758B6C62A6CAEAAAA" + }, + "fixedInfoPartyU": { + "partyId": "B757370B868C6BF0EA1A6B4BBBFB8778", + "ephemeralData": "86DAFEE2821E6FA063098988D82C4BA8650233C5FDC9F5666A667C5A56" + }, + "fixedInfoPartyV": { + "partyId": "E6A54DF105210D8CF7DD1637364A38ED" + }, + "dkm": "D38CEF51EAF782A591FBA6A84BC662C8CBA075CC2ECF05358E4E4C1BF6EB0E68F590D2FFF062DF12CD62D75BC1F9818BA78A3A909E43AF2ECDC79E5A3F30C76CD2445D91CF10EEA4C50A587BA6FEB536312F0D428D3FFBB3E86CF559403EFAC977D7E9A4882EF549765D4E22B1D9A6F6F95D8B1F637E1AE2CB5551062E7BD208" + }, + { + "tcId": 2872, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37A793B35BC1B82ADE7CB94A7160C7A1", + "z": "DB9D4B2C6CFFA867F916DBC273526AAE5903C949AA368CB47A4314B318", + "l": 1024, + "algorithmId": "76E344C709E229C136DE9C55760AE8B8" + }, + "fixedInfoPartyU": { + "partyId": "EF01C72A3AECFCA03013F0AB822E8283" + }, + "fixedInfoPartyV": { + "partyId": "EF694DD6150BB03D90B7F0E76F4D7C84" + }, + "dkm": "9CDFB8CC9AE06E705AE6115516915BFB65121E6EEF5CE3F964ABA5BBF5D41E2795F377E19FC5B3AA2DDC3170A640E0C0F5DF94C199C144A0AFAA7938B4D501E562121237FCBAF0033D7B17FBAA023F988697FCC5A0A7CD1036859BE110D77160339582928926F9892E58FBAEEC7634F72C477B36A24E00863DE994ADED8AADAC" + }, + { + "tcId": 2873, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A928D84EE27B642579A17FA41FBE0F5", + "z": "8142F474AE609B2425785634A9CAB331C3DC29B3DA5F4E60AADF3F02BD", + "l": 1024, + "algorithmId": "819919490EC875169FACA9F837CB4878" + }, + "fixedInfoPartyU": { + "partyId": "ED47679C9294D7BAD946518DE2881ABE", + "ephemeralData": "E5C15DEEF06DE036FAA1981CDD0B6C3630DF6799151A3750445D021093" + }, + "fixedInfoPartyV": { + "partyId": "DFB778C851CA792440E4E0F17354BC89" + }, + "dkm": "8BD62F9C2B182E45967BBAEC0568E496C37D83BDC6308FCCBD26EBB7489A27F54DE35B5F3448D515A7519BE986A18E4A8193AEAAFA0075CF67F76E778AC7AAF8CFF6778A7CE79C6214B14FC2FD368F24F745FDA35C1429DD3B90A322A83210015174DF6704F0C7E12EC2A999CE3CF17A8E304485E52535A31AE030DC673576D1" + }, + { + "tcId": 2874, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64BE2B66DA40F77EC6A7D18DB9E85196", + "z": "B5004B3084A9233D9CD7EE55A79ABC9A86E2A43597DE9C2E41279C571A", + "l": 1024, + "algorithmId": "1A42366573117227B7A6F6F7CAF62C7B" + }, + "fixedInfoPartyU": { + "partyId": "2D572209B567D91B990D58ACB4FB50CB", + "ephemeralData": "22867B8C00AE41D92EA8E5CB299CE310A2F234DDC8E63D1132A63AE43F" + }, + "fixedInfoPartyV": { + "partyId": "D97BE4CDBE3F980FC566F0BF7CCC1A92" + }, + "dkm": "6B99C0F07C934E3B42FD8DED508F575E94D742DD0C6873D0AADB35458DAFF7A8273890F49E70278BBF36A7BD3A2AF1FEDB84EE836349EEF62471BBF98E9F991436F28EC828436504E77B41BB73E54A3C98CB84005951383DD72D7243F06B436C841E3E4D0F1D65714EDB11E2B0FF51C3A6D0491A472D59FF9A72871670B3CFCD" + }, + { + "tcId": 2875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07CAA02C520D058BB23154CD8CD48AF8", + "z": "9090194944E7F0C9C97A6261C9D8DECF51B12198B18822A68AE034AAF7", + "l": 1024, + "algorithmId": "47B851EC1EFA1453A0979E95A4FC763C" + }, + "fixedInfoPartyU": { + "partyId": "3235DB4C6752BCD81D4126F34AB37344" + }, + "fixedInfoPartyV": { + "partyId": "928D419C4CB92E3E4F3DCB893426BC61" + }, + "dkm": "0A40095112F5CD6A626EF2A64DA38EDCCA0255FF0F6DC3E00D2161854DEF667BB170E8C9D8FE43CAB5E9AE151C457F4AB4BD2A5696810ED653A9F8CED9AC727EB71A702676A4EEDE4F0CFD7B2455AA19B1C59A9131AEA32FA464B9684C9894742D50C5369692733391A5A1FA6A381EE2C183B634EBC9D79C2BF3E1CEE2196318" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 126, + "testType": "VAL", + "tests": [ + { + "tcId": 2876, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F268E026C5F874C043F839B53AD17163", + "z": "818B071D101151642D6026A55720F8A313349DB970984E9E72943F8CAB28A113EE828898", + "l": 1024, + "algorithmId": "30EC0B0A24F986F038175DA1216A9D91" + }, + "fixedInfoPartyU": { + "partyId": "890B88DC71A585A475AD2649C21DFD89" + }, + "fixedInfoPartyV": { + "partyId": "C39754842D3A46FB40ED492A67A04E55" + }, + "dkm": "B7541A155D452CED3FA09AB6DD258CBBCD05C9E94F4A8A7DCCE6EBFA18F2FA19B39577A3FF0A073C38957DE65BBD718ACF7913EA76EBE1E3A1541B099170174CE1AA1F75DDB05B3CAAD21B00EFCFB4A124D9ADA42737FC1D1F68C8E578E372BAE4CCD32E9D8079FCAD675B112083893A6131E92928D718081884A80CDD68CC00" + }, + { + "tcId": 2877, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16B322A78884194FDBCD0996DD8E73B3", + "z": "21F815CE537B6A80AB175EADD8DA4BC5D21872661C622B9089EEB1FFC04E6EA77B0002C7", + "l": 1024, + "algorithmId": "D3339224C02C817623F205C567397AE1" + }, + "fixedInfoPartyU": { + "partyId": "352168B6244B431AE4DDCE25442CB792" + }, + "fixedInfoPartyV": { + "partyId": "327ABA9B36953FA25649CE28287B50E0", + "ephemeralData": "73DF75F2D1897FAE488E83EEE3E96AF97DC5EE48464818F4F31369BDF56DF7ADD345AE89" + }, + "dkm": "B302B8D3842303194744BA3C9800C14D0EE3387FD2DC34D59BE92E11BD8C0EA4380D8546B3254CACF072CF774579AFBE07C4FCABA1E1BBF901A6D204ED155269CBE70059C751C41453451D2361CEA9529CF329BDD350F61FD529E23DB0D2314A76949F25508B92BFABEC0D0D986A202D93C0FC9F48A302F6AC3FB2C73D812BFF" + }, + { + "tcId": 2878, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1535D89B15C60F5BD870828F8FAB3E24", + "z": "F49093EEB1B74BF74D448E17269A074E2D1B96D42F40F02DDE0A34EE76A854CA8EEB89FB", + "l": 1024, + "algorithmId": "477FD87D8BA8248A5360BE5CA06688A8" + }, + "fixedInfoPartyU": { + "partyId": "044097CE6AAA91775AA03496CF7CF0ED" + }, + "fixedInfoPartyV": { + "partyId": "609AF0587DA37F5B103B77C4EFF4C608" + }, + "dkm": "15D64B118760688E51461ABC26B392C01225F8517B67A62E70B620E52CD10479A0634F804165684D74B29A8BD155409D75D850CFA310F058193E33EDFB143BAA0CD80E8154AB005621FFE96F46B6EBD0CAE038F39FCCC0D943B3D48494DE61F96BE1A7A79C1EFA88856EFE9AFF4C1558EA06C267C9A462A29C34479E325FB349" + }, + { + "tcId": 2879, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6646B7EE7F2E70D5D3A5738C713E3740", + "z": "07B91A5B3C34BA65624C49C74E56A87A2529FCC1FEBDEFD9A67E814D324C2911CC0865B2", + "l": 1024, + "algorithmId": "D5CBBB6C6B80A1F4233993D2211D6DC2" + }, + "fixedInfoPartyU": { + "partyId": "F2BD2FB3E5F9FFF50B230BEA17C3FEB3", + "ephemeralData": "2E3AAF42FC35AF6650C8594B846F3A1238C24AB636BF4B414C93CCEADCC805B90F09EB20" + }, + "fixedInfoPartyV": { + "partyId": "E4FCAF3AB3B3BE903E003AFBF8FAF7AF" + }, + "dkm": "F1DF03AC67795D03281AB154AD7F96E2DD4A389CD94DF9628E193D906E9D9A3C4A62DB23553B482B66304B839DA3CEC238EF27D9D4E0CD777BB0EEE8CEB854519E07A6CDE7336985FA0F65086D567E3C4A9728208635DECE87068D2451B298EA1F8F5BE364FC1E3EE477A82D54E74B6CC941CC4C99EDDCC2D4A539E8DAA214EA" + }, + { + "tcId": 2880, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C439232BC3A6592E8988DB99F2739F", + "z": "DF4B1696BD10563169631B4E9D70619BD56B6D30670A56529C2D719C2368E9D7740EDC43", + "l": 1024, + "algorithmId": "7F30C8BB8E3B5AF73381F40FBD49D726" + }, + "fixedInfoPartyU": { + "partyId": "B6FA5B9B03DBEC5B69FCCE0AB5A8BBB9", + "ephemeralData": "8DA7EF5A5CD5CE603F61420764CDCAB5C575AE2B0A3C066F6146F2FE85BC25706BE289EF" + }, + "fixedInfoPartyV": { + "partyId": "AD6FF89FE6EB07B6DC0C30EC96497369", + "ephemeralData": "D768D7285F679F7B56FFAEF0BE85D8DF64B8A0AE5E7F07EA1C2F247CC32D647DBB2418F1" + }, + "dkm": "0BBB95038B208E3D59DC83E361D924A110958A3FE2ED9C0266CCCE33E2FDFFB55F645CE0880E7AD0B6D399732DE132B0A0FCB06355A8829F21337C32699D247888F04EF598853A525A82BBEC0AAFE71CEC49F9756BA17B26C63016619D69197D9AD834BD805A6581F3A5B483EE9B180B6795EF9AB4889551F6DB2AD37E9DC3CC" + }, + { + "tcId": 2881, + "kdfParameter": { + "kdfType": "oneStep", + "t": "726C7844815A8718F47BD43793E6D860", + "z": "C6D521BA8006B52F876531CBD50B584476553398CB14783C983CA31254F27C897856B0F2", + "l": 1024, + "algorithmId": "94628707EDD4CEAF99964DF424904DF2" + }, + "fixedInfoPartyU": { + "partyId": "8CD20DB006D29411A0FC7574AB1DFE6A" + }, + "fixedInfoPartyV": { + "partyId": "07BF858C41807EF8A9DB92FF40373AA7", + "ephemeralData": "212B3BFE130E855F7CF77B02416C6B20D327BA77C843E5BB05C83D0CC4ADC2500E9AB0E2" + }, + "dkm": "AF27FB12D9A43AD969A82DF32EC8F6FFE7FD8F9503298A15E74DEE7722852DD330BF9A97EE16648DE75F01824C259430CF0A626CE966B3B5EEB5767499E1466D5B72E10B50BD001470B2702002174DCB657E6957A0E3A8C6DF94058DCD728A51F33CE4C0ECA85C6040464C4DDA13ED4AFA3B97A6FB8CF119AF375ED93EC4EDC0" + }, + { + "tcId": 2882, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33514F036E3708390F8B93C27B5C0311", + "z": "35A778451F836EBEF029704E69A836CA37D8DE29EDD6B35C48A28ABAC9F953B33FF24BD2", + "l": 1024, + "algorithmId": "8CAC39807AAC976F86DDF5F8637FD9FD" + }, + "fixedInfoPartyU": { + "partyId": "2445493285B342F038C19309BDD86C47" + }, + "fixedInfoPartyV": { + "partyId": "0CE30282064B0A092943F088A29C681A" + }, + "dkm": "0945D4F8BA3D764DD2A5169B4E3D654ABD52976F516C4EE9D64CBFDC04B418768F6F14BABE49743A9FFF110BD602B403E5FC775A0ACE0C452D740866B56A61CD3D919FA5109ECB4D42E2FA422A97D286D820D83D1CA05EDF440B4D192A789AD49F5FDB6DF84DFA2C16CCB2F8D13D8CDE31EF0F54CB5AFB32FCF21E0BCC9F0492" + }, + { + "tcId": 2883, + "kdfParameter": { + "kdfType": "oneStep", + "t": "994DDD9EA6A4DF9104B821D3AD01A076", + "z": "113BCB04D8299520607F9AD6FCDFCC93DA69528424FF85CC3620D520759A2C53E4E0B3A3", + "l": 1024, + "algorithmId": "204CC6C5DE6451B5C73CC440109E8F1E" + }, + "fixedInfoPartyU": { + "partyId": "4C227FDF0B378200FD8D8C0549CC67E6" + }, + "fixedInfoPartyV": { + "partyId": "49003248AC8B543AADB90EE3D3D60573", + "ephemeralData": "0541F1C23750B8510237CB9B1358023E65C69163DC73A080736253FCE13F07D420851C3E" + }, + "dkm": "834E148EA1AB957749171F60503AF95B4C56F16734A6167C3151D8E9CCAA2127128A3D62BFBAE08B7370ED9F7A4F395A6A1DD529217B9B36B6F6095AEB9508A178DC05E8F56E8A2B2477C3D18F3FC39E5EE75CEC655BEAEB7582B06D32C825CE35C832ED3F557932B959E4F9A3ED5F98605DF0947CD3D608D32FD5E2F7B62077" + }, + { + "tcId": 2884, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC2AE199278E16A767A969009EFA4B33", + "z": "059B56EBE8B090517508421B2457C251BF0AF12167AC1C6C4FB7F1452518C960848372E0", + "l": 1024, + "algorithmId": "E67B75787B5316CA4AB8DF8BB0A9C58D" + }, + "fixedInfoPartyU": { + "partyId": "A80526698BFA59B10E59D4326985F6F1", + "ephemeralData": "AA8110078A2A0B7D47C27248697C8DA16B2A75A6811663CF40B4D4A3C11E685F1B1EAB6A" + }, + "fixedInfoPartyV": { + "partyId": "B1C209E4F5E2CEA4008FA8678E92EA7C", + "ephemeralData": "DBCAAF79487362CD907AC47BFDF9049CE3BB046BE2BE3929A99843D6A6EDD2B52FDD353C" + }, + "dkm": "919F92F9DDE84C504BAB0C719909E2CBCAC5FC5C115F68AD81185C3F2CE95FBC63BC5F9D3BB6276A36F743ABF74FB25BA9517EE123C1779DF35B30325FF4BE7667ECC5E45AF9B96665A70DB8A4ABE64B218C4D7A293D5CFC14C0311D0FEA0AFAA34EDD71E5CEA870A3C399FB201EAEF11642E60E6203CDC756AC44D391438819" + }, + { + "tcId": 2885, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA27E446B72463413DBA9D86B2A43E53", + "z": "40284E815D8235AAE1A3C144C4D91FB6B5B52E6693F61A2140A495F2661D20A89B5820E7", + "l": 1024, + "algorithmId": "80D4238FB0CFDC125054D0819741F95A" + }, + "fixedInfoPartyU": { + "partyId": "FA2FE38857B288185186EDE8683777A6", + "ephemeralData": "30E8600F6DC994FE51B6A3CAB92873AD13109B52DB967C562A8F0A3894441DC0EA61C4CB" + }, + "fixedInfoPartyV": { + "partyId": "48367C1C0CC227F7E3AFD4F35AE59DAC" + }, + "dkm": "49B710D8E8A57DC7C972780E5D845D3AE10B98D735F749F5A8D52CCDA3811695987D6A6E851C155867DE4BB60F3A60897029FC14E39EAC499916D40ECE1F79115FD1660413AF5D8DE96F496CC0A37216E5152E7F4170DE1BAB1181D473EF832B87339900EC4FB95ED1E3EC047DC2B86D28315A1DEF03F2E1C9D7189954E7DEBA" + }, + { + "tcId": 2886, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4817AA25A6B5E4AB7618E0866BA706F0", + "z": "E1C144DD9FFA409CDF808734FCF85B3EB9A59CF82154CA879657FB99B1503997CCE61DA7", + "l": 1024, + "algorithmId": "55074DFF698CF44A20E651C32BFE4CDC" + }, + "fixedInfoPartyU": { + "partyId": "89AD9490E0EE81898AD1F6B6B7BE3A66", + "ephemeralData": "3A7F9A7192074FA099B2736E894702EEDDBDBA720943B9B700591570B80F98E9244B0A5D" + }, + "fixedInfoPartyV": { + "partyId": "D91DD7AAC7D18A78E146FFAEA27CBD76" + }, + "dkm": "0B945ADA3C040B71B38533CF60B31DDC14C7847F8FA3D9C506593B38DACE1956B110CEEA38134880E144B75B56EBF92A2A3C35AA6566F7B1855992D33F43E21B885E2CEE5E53951FAD3A596D1ADC5BBB8D80B810E35AE6EC6F7606CAF722F77D5DF73DE21675341136B3199F57C1FA8EBD7BB150876CAE1470BEB5D7F68CCD0A" + }, + { + "tcId": 2887, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F78399FB55537D950D201611145A42A9", + "z": "EEA26E0259116ED386CA0A707EC135095379FB68EEBBB6141F607BE71B23B04927FF7CD0", + "l": 1024, + "algorithmId": "2506296A726586F30CC3270360189095" + }, + "fixedInfoPartyU": { + "partyId": "FFEC64C1DEF901B6952D3F1FF8DBDE29", + "ephemeralData": "7FD23912826EC4EB106FC82B08C934801F8AC5CC14A51C066978489CE53EB780BA9AEE30" + }, + "fixedInfoPartyV": { + "partyId": "9FF4CA53E4AF2CB4F782139C27A83308", + "ephemeralData": "9A3220CED021BC8A18FF53D2B26D82631C980C2549CC57F6D9D7F92D48B88F9124FB9FE0" + }, + "dkm": "3349169E274FD43A2D0FB862A6B96207005451C11E219BBE707AA5BC4275ABD4186700A17970867DF663AF03A4E98D76DBC7A2834AA333BF939EBC21E941F23F64124765B7B3CB597C3BD8C2D48C83474E7E5E0997E3D1F45F1E7F981EBA63B7B69527375319EEF0E20667B1278B6AE491532B664903EA5909685DEE279F1DD7" + }, + { + "tcId": 2888, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A7BAB5E4BBA5879B08C931D364B6A96", + "z": "1DC691C9CA1FB4DBEC90146BB42ACA3BD8C12BE0EE1A35E32C0AC7A545DDFA5ACC75E6A3", + "l": 1024, + "algorithmId": "BC1F5E0369DB45757D0096450AC5F747" + }, + "fixedInfoPartyU": { + "partyId": "326BCB3E44CD5F895690068D9C6153E9", + "ephemeralData": "8226E0EC4910AE4B470B2BD33A344B25CA8D05FD6F52623FA7F169F0694660C1BBD80EA3" + }, + "fixedInfoPartyV": { + "partyId": "C540D47AFD49AE9E9D9D321BF22861ED", + "ephemeralData": "1C846B4A6D76CC0EE2259B96AEF2AE9ADD9C82CF3C5EBBA858411EFE5595E89EDA57C468" + }, + "dkm": "E0BFDBB67347BA4A78AD9C72C5F96111C873F52BBBD59C3CE47247A96313CC830E3CB75E7BF7A3098355CB7E0DDCFA923ED995A34EF1302EE1DD3C84503A0E10BD50D6D61A86AF40ECAC2393137AD2BB9226E9A7CFC71889487A2F184450EE58C080E7BA847BE54966B40F9D5B5452421253253A68D1B5E6328BF5F4BE222E39" + }, + { + "tcId": 2889, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E66C349BD0F42079E5FFA663E1970210", + "z": "528F0C046301755821F61E11FC713DF608706D0528361131DD9EBF2BD23E43DD2F4DC889", + "l": 1024, + "algorithmId": "54EF9D1A19F271979C454C41700410A2" + }, + "fixedInfoPartyU": { + "partyId": "2DCBCBEA67B42107A4B5C4C4CC76BF4F" + }, + "fixedInfoPartyV": { + "partyId": "8124D83ABDB6791C4CBF1D51574CEF63", + "ephemeralData": "85F206E68F49CDE6FF4BA77FB7A2FEFA431CA09FD3A98C378E69EFF4CC873144A3F645D8" + }, + "dkm": "60295289017EE56E38283DF3078711F39F535D8BD9BB59B4AA19411FD4355BCB5D1FAFCF52AE5E881F69D0042FF3AC427F6EEC636A281F8324C4172E227E1203223CDA4B690267D2B86ED633B5DDAA7BA57CE11993CCE864D1DEE5F658B2676237552B47C8A0C0833D437A54CD7CD08A68FC2EB23A5FB6AEFCD4BD7B3032873F" + }, + { + "tcId": 2890, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32C334BE6B08DFAE6D4DB909A8396408", + "z": "BA40CE1FD6AD157B43071D6D9132DAA2C6BEAEC04D8A5158BFECB71E3015FCCDC1B6ECA4", + "l": 1024, + "algorithmId": "70184FA7E501E20A6B818323B68BBB4B" + }, + "fixedInfoPartyU": { + "partyId": "10AABB555C148DCC528A094E0CA25699" + }, + "fixedInfoPartyV": { + "partyId": "108AA0160908B5D1F4B05324B9CA90FC", + "ephemeralData": "4007864C8AEDB64881537D17F1027400763E22609C6BC0EEAA08DFC4E0509977B20B6AB4" + }, + "dkm": "6724A6161E8028AC119C2C89AC20CEC824823D55378CBF9840E0A908B6B5160BAD82038931AB4B894AFC444B1FEB3E75597A0FF535A181AF91EAB3E5B1B70399F0CD7C1B01F56E32DEC1D8522121BB5B831CF8D1C0B5BA3817B672225D8E83BAAE308BB96F9468B500521EF63E4BF661BFC2EA4A9EA5B6ED0DCD8DC4553A73F5" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 127, + "testType": "VAL", + "tests": [ + { + "tcId": 2891, + "kdfParameter": { + "kdfType": "oneStep", + "t": "224CEAF6D6BD5F64D5E2D6AFE45E8524", + "z": "3D138BD95332F570FA84A7950536481E639376F56E3F4A7E5039476B", + "l": 1024, + "algorithmId": "083B6D47130349160BA6AA9C7860BB29" + }, + "fixedInfoPartyU": { + "partyId": "38EEEF46DA8AEA33FFA8E0FD2C14D0ED" + }, + "fixedInfoPartyV": { + "partyId": "36F377E61575B252664E40B7281CB77E", + "ephemeralData": "322EAAC5C68F3514F7D45A10F90780B3A91DAAD136A03D6667612581" + }, + "dkm": "EC15244969D7133C5EAF7187AFCC9EE1BB4A9D23E66AD10A212708FB4B590D1333ABAD2ACFB593042BD190FFD02C016DEFD667688F941FA4992D3EBC4377236AB370B3AD0A7976193AC29876843EB86D4F82EAFFDDBE7ADA55740EA58A3CFA56EB2119D9700648BD77553AA427BF594323E5A2E9C1C4169A0318E504DF649864" + }, + { + "tcId": 2892, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E3E0532B1F63D47864FE0985E9EFF3D", + "z": "F7F7B4D2F7D70180E8FA37300FF7FB6C15E505F54EB3BE92A3004B04", + "l": 1024, + "algorithmId": "F5E81B57D3E1368D4A44AC343E3A21D7" + }, + "fixedInfoPartyU": { + "partyId": "9268504B7F62441B0CCEA2F8871893B6", + "ephemeralData": "D4EBF4EB2DC91D5DEC6297BCC7DED1087302BD550AFA81E6454B1939" + }, + "fixedInfoPartyV": { + "partyId": "E5A27D1D12D0B1AC9A99FB4498309C7B", + "ephemeralData": "C60A1A43370C2F698CB88E2596F1591D501C9DA606B88EB784731298" + }, + "dkm": "FABAB106FDD647609680FD136B088E051785F8652078F08C5CDD411E72E0CBEE38530FFF9C77BB4BDD6935596F5353DDD4E3820279E83F6F5D3F0C3C9944580838E419EA4537780B9DACE681A4A50E4CA2F76F31D6101703443DE96E9F42EE0F4CEC478C3E77BD58B28B6C4BA9857DA1ED5D78F330D1D7FEF4F23B9EB376BB3A" + }, + { + "tcId": 2893, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0E8BA7A2BDACAFB7D0487CD33C158D23", + "z": "F846FEDC3E867BD40CA32C49A4778CC029F8BE5201284D759D682F4E", + "l": 1024, + "algorithmId": "49DA847215BA14FF73B2CDA8FECE24BB" + }, + "fixedInfoPartyU": { + "partyId": "14EA1365D5D43D1C42C6AB8858D1F520" + }, + "fixedInfoPartyV": { + "partyId": "0776C029A9D2397F03757407382B101E", + "ephemeralData": "F47109545B8019C01BEDBDBA7190C1A6CD570B8835C514A0A0ED5DE1" + }, + "dkm": "AF67DA5C99D995F360B45C231DC28F7ACF9F3BEF8F7DD47449926B35210A2AAE6CBAC99D4B595ED01FF2B8FCC25DE8EB43091EFEA40C368C702061581F1EB08D2FF7C4E56F9F271804584F819C4BD5E678A5721A47F6A76DF7C4BCB6CE556E54118E6D080A5AB88DF92D76A279CE5776092BE87A4FA8CDEACE201019503B421C" + }, + { + "tcId": 2894, + "kdfParameter": { + "kdfType": "oneStep", + "t": "89F24E292B2857FE45A6E9E85E7B58EE", + "z": "0690890BB9F3A5A8B5EF7CF04920D9A063E27476E43A8C1A93715EFE", + "l": 1024, + "algorithmId": "161F1CCF6D391E5FE6ACE05D8ECEB2A3" + }, + "fixedInfoPartyU": { + "partyId": "73E7961D62FC8BAA706EB02B11BC80B8", + "ephemeralData": "7F659EB06AEF38D0B7F52C34FC9188B76A59E03D5EAD3ADE3625A543" + }, + "fixedInfoPartyV": { + "partyId": "D0EEB30F46D9CF6AE3C8B180BD12978D", + "ephemeralData": "526491ADC006EA9CCDA5D02DD54086BBB50A37BBF16AE9666A03F205" + }, + "dkm": "2F522AA8DAC425E6A1EECA1BF8CD088BE01F17DD08D2D0DC3B0072238B7527999D5D3736ED48C9E12278CF9361F21A7304AB356F64CA3B1B99FE1214BABA49431F0CD47C8E09B8C7D70B4CD5DBB8E1568686856245D3C209EF9FDD828711C0DC4FB8214849C10D84B83F164F7858EE3BA0E873C8F8BA76582CF35F1B0F939717" + }, + { + "tcId": 2895, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4373ED5D2E096865450CF16D206D05F", + "z": "94C86D5B0B8C66E2D3F3FEFEDEF6E6B6C3E69B64FA22E6F6CF9C1EB3", + "l": 1024, + "algorithmId": "3F851129B124C6D2CDB3902B4EC1ACDA" + }, + "fixedInfoPartyU": { + "partyId": "7A6E0CAE7949B6740BFD2F8F94F8E1AF", + "ephemeralData": "B4486AEAE8863352A3834B8E1E887391914C12634BD7D301A0A09E8D" + }, + "fixedInfoPartyV": { + "partyId": "1D2B48200EADF327CFCE2111F8D6257A" + }, + "dkm": "CA4F14C413D75FBA5DA5856063F7D978C92C4DC7BD94FD645140DAB941E543694A856E91AA7F4C7702E56A7523D686EBE20286C53AE245522CF618E14C489C481C62F0070A32BA80990240B6133E71600669DB3E51E9DBF1FF83A5A36FED9E86A208338A4B77EF4934FA1D709FFC5F1FA737EB7EBB0E42E119938F2C09ADA104" + }, + { + "tcId": 2896, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB4FE69BE172D4248D6180649F0E727A", + "z": "6A751E6D85D7746A1227548EB0E6FA08740A5C1CFE49E20A9FF36E17", + "l": 1024, + "algorithmId": "5B6DBBBD7374670E31866B3E9AABCE05" + }, + "fixedInfoPartyU": { + "partyId": "078210289750CEC74F5B98172895A5F8", + "ephemeralData": "03BFE9979E6F5DE2C67705DF6DEC326E96A2703DBE4752C1EE2984ED" + }, + "fixedInfoPartyV": { + "partyId": "27DA694E53377B4B9A800FCFF15AE990" + }, + "dkm": "D335322CD6F8ADF8FAA3B33C12C3D29D707EFB66D1BFA4CBDCBA890CB2B8010EA1D5DBAC1C09D42913FF141494E3C06EAA45503E7A58E19236D8E5095E6688C7334F3AFCB6B7F6531D805347821E541D1069A7563A8245AFD7B9176AA1A997BC796AB2308627102A8C39C0233378891DE14158920A1FDC07EC1F6577FC35D5E1" + }, + { + "tcId": 2897, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F3F5CC953D785273F888005F04CFFC1", + "z": "70FB10BBD75041FD23B3C2226B99C224D0ADE0E32AEBECAE7F4E2D9C", + "l": 1024, + "algorithmId": "518D7132B3219A9BAACE08F6224F4458" + }, + "fixedInfoPartyU": { + "partyId": "240D2214D5A20E230516125A3EE07B30", + "ephemeralData": "20134894AB11766F0067F97AF09EC376DC5B111CA906316BEC651BB7" + }, + "fixedInfoPartyV": { + "partyId": "013D95DA4AC58496F403042B33DB0EDE", + "ephemeralData": "34F659A9BF72B028350DCAE61D2357B909416324A52999E4034BAC28" + }, + "dkm": "D410905707EB1BAA160472D9E022B5E46B5057118597AFAD5FEE0FC35932893C5C912E2EE31C73A0E3293D0321452D1522CE47946E2D1267C7EEBAF5E3F50C129ADD783004C017FF224A96BD2D51630A0B87BA44B28578080858482A8B2ECAF270F6CD98C272720176A69A90F2BEAA27A09A310AAA76A0CD2C684935E59D090B" + }, + { + "tcId": 2898, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83D09743D9698C17A3D3B8CD34CF6DF6", + "z": "4B4834FE24B13E0B735350895D509E34E478556E65F5B7C588771918", + "l": 1024, + "algorithmId": "2E75FB8B98E5FA961D2869D860D8D1DC" + }, + "fixedInfoPartyU": { + "partyId": "77C569783E68ED84717F6129FFDA4EFF", + "ephemeralData": "E79CD9DF1ED3BA797B1F66A96E90895267DA785D43F34F0C3B796EEF" + }, + "fixedInfoPartyV": { + "partyId": "E9CCBCE7FEF30FCFC60FE53A78A1FA14", + "ephemeralData": "729A9FCA7A6D2D62D6632E0BB3335C5A9B34C6FCA603CED0D763310A" + }, + "dkm": "F7947077CCFF63F1C379001D42C647E008AEFF8704E176ECF11EF9C7D072013D265893CFBAA28367218CD55238E4C98C7AF2632B24C44877CC4C570114C84823061E988FBC13E4D404A64910A7827FB96CFE3A43B59C9E7A71565876E18323D088CD5C4BEBCE491F5781C0568F829901E110BA6E8C8BAEDFC9E1763214A1DA56" + }, + { + "tcId": 2899, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABFB2C1AC4ED0A19B95E7015DC65A4E8", + "z": "8C24ECBB7436D7C56FDB1419088DBA02655665AA034A5BDA6342EF5D", + "l": 1024, + "algorithmId": "D11B43E11607263783D51960A6F7DCAC" + }, + "fixedInfoPartyU": { + "partyId": "2B67C2559B7BEFFBC3AA5C2B0A68112B", + "ephemeralData": "C265B2C6B67CEE00816377F9C017AD0C65E5ACC0D2DC6E3F80B8E144" + }, + "fixedInfoPartyV": { + "partyId": "AF6B388CA3EBD4D45C39D68D1F3CE5BE" + }, + "dkm": "2E436D6905AD39210646ED224A85AF7B035CADCEAAC104C457C6B24ECA2C704AC405267F28E458BB9262BC2AFDBF0590062DD11AAF3E7301EF5CBD406571E7E2299F991A4E64381CA8EA7500A0809D2E2B7985382352EEE12F69201C532B5B0E3C080C0FC321853EEB939A168F294DE2BFE300DD92FC209A7824D3EFE3F5900E" + }, + { + "tcId": 2900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B02EE51CBEABFBD011F115607419CDD2", + "z": "77CF84F9970AC2D0C8D89822BA7B199277606EE1B1BC005C8B78798C", + "l": 1024, + "algorithmId": "307EF08FF4C7F7486481EC729F95EBAC" + }, + "fixedInfoPartyU": { + "partyId": "F1926810D1D4F278166716C96348C341" + }, + "fixedInfoPartyV": { + "partyId": "31D791E06FC9DF650C839CF07FB67F79", + "ephemeralData": "9E366356C42650F718057FE3182F68B807C42F4265B17BAEFC251D6F" + }, + "dkm": "0BE7F1B163BBF7294E81411E2904F683C4DEB55EB8A4C122386F69401E2B97D36A4138657C2AEB8F8AAF3F1F503999F0489AFE7430CBB45BE52FDFC37A3CE0294B4A65EDD17277C1162B5E6F34CA82B5AE351F8A04F301B60BE4262929FB68EA4E1371A723DC8FA8789C1D53C9DBBB9E19BD3AE1259542178FCCDC3801E3B038" + }, + { + "tcId": 2901, + "kdfParameter": { + "kdfType": "oneStep", + "t": "451A85685119539516EBED8D2951BDB3", + "z": "3B49715E797B6A452FFD2DE23709FFA68D9D4EB182DD498A3C4948F6", + "l": 1024, + "algorithmId": "C29E9FEAB13673D74AAD848EDF884966" + }, + "fixedInfoPartyU": { + "partyId": "3F78CFDF6A386155A2BBF15852E25B6A", + "ephemeralData": "F580E16743B4354A6B5517A10018DECFCC8BFFEB873A6FE249966F5D" + }, + "fixedInfoPartyV": { + "partyId": "F26CCBA7EC88F2B302012A3CF2764F93" + }, + "dkm": "578B7434DBFDD8072E9BF4D2F8C6E505C69AC04303E66DDE722FCD69220728ABA3FE4C157799DAD64A8F107143B2D4F85D5382276635DB490047F65E1C5F0EFC4A7867D58E9E67FDD6EDEC2740A2A534C23DAD8ECFF4EEF19E7CD58D899A41DB22B4E29E1FAF7909D8BB78523B1CD4080F8F9028CBADF7024FB9E90B1E5A79AB" + }, + { + "tcId": 2902, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F7461A3C49E070768477094B5C61241", + "z": "E5AC8CA6A644D8932505DA0E39718788C37B3B3041837E630D6597DD", + "l": 1024, + "algorithmId": "767F5B130661A8CB746222ECB3F4EE17" + }, + "fixedInfoPartyU": { + "partyId": "5884858FC21371F67C28413369D09E84", + "ephemeralData": "C79C43F55F4690116A92BD9DD2D666BE52058C4F5CC8B564957FDF83" + }, + "fixedInfoPartyV": { + "partyId": "B5E40D08E81F502CAD22B1EC530E9543" + }, + "dkm": "14E0E61D77CDC75B081889F5820EC2CC013656FBF75C6FBF57944F9CC1A0BE9BCDFDE3DF0B0C5E536C05EDA494065D59A7B2FA710D79FD5328CB6041EA76CC14220D5515363EC9C956C09AD3D1055088AB0D5638BA75BF6CECDD9FE5F64C737D0C3F41215256DA027A4C2313FDD2D6217A9EA72F95DAEBFDFB75E9E13A5EAB05" + }, + { + "tcId": 2903, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA5B2C90AF25688072E66EBF768346CE", + "z": "DEF9ED7B1171B65AE83D58AA05B357DA22438464743155C9C4277537", + "l": 1024, + "algorithmId": "5720FC73344B350E0F8193477A606180" + }, + "fixedInfoPartyU": { + "partyId": "3A110E15788D5BD4FEFC70DAE17ED26D", + "ephemeralData": "CA4E30B55A694861059206525CDC491603817F72EF37051FB52998C3" + }, + "fixedInfoPartyV": { + "partyId": "F067F246CC4E29D054B8E636A44CD3C4", + "ephemeralData": "B8298B879030CDDC339F2B6DB7EEFFCE2E7BC9347E07C21CB112BDFA" + }, + "dkm": "033F8F305211CB21ACFB6F5B50AFD8645D3814B9D5291A61AA96D1824901A9E06F6902250E948FBF95CB16343DED419BB700E7EC357F8133318B26EC19DA514531968D4736C2533189791807BF69E1295960752A568D0DD0B1D7115BAB7A4371DF37BC83BC0B275247DF46F76920C765FA40F6051A606F3873DD621CBC0025F9" + }, + { + "tcId": 2904, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29E75880810F3DD4F9131515D0CC3434", + "z": "85D870EB771309FC02B50F526985CE3087BE1EAE93E09B86D86488B0", + "l": 1024, + "algorithmId": "B7A90D9758F0E694B54E414DFEBF52F2" + }, + "fixedInfoPartyU": { + "partyId": "B53847B27AEA2EB80721C6FE3B34CC31", + "ephemeralData": "03A0D31EFA90696A2ACB537190063C78C9C2BD6D3692B28416B7A3AA" + }, + "fixedInfoPartyV": { + "partyId": "099105A21AADF97222936E103B24C8A8", + "ephemeralData": "A6781DE3A809B98698A58E8F11B0F7BD1341058A6DF440E9E4F2403E" + }, + "dkm": "FC1EE9C433967360700B7DB8F8FF356C7878DB6EBEB24C21F361828E69DDD68E4893805090B4B80A0555CE1C77E4D4A58D92945BD90C2AEC282955FC8F224E40EEB478637298FCF71E3FB186C744D59C8D3BA52EEB5277708529A0BB8F8257A925BDDEA264AC9E491C02D6D87C7372C8D4FC5FC46D0C0E649825E71A37883EAB" + }, + { + "tcId": 2905, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE4D53B32E0B5224E5CD95750C2D3297", + "z": "B1B1201C32A9C2C7BEB875AC0F1886CCA370B51E23DB401CEAE0CCF4", + "l": 1024, + "algorithmId": "24FE97A28BF4A8EB8320DE04D505EAC7" + }, + "fixedInfoPartyU": { + "partyId": "C0ED0A56560713B7D697065A98D0F2D3" + }, + "fixedInfoPartyV": { + "partyId": "8FFCCEAE2231268F9B3D81FB3A9D182A", + "ephemeralData": "65E0CBFC9270D7771307F20DE8D4BC68616D995842EFC548D8E52C50" + }, + "dkm": "89CB1C5AA51A4CA436A600BF5274CAAE435D73FFF10F9EB4488C2C78910E3E592C82EC3DA8B8E63E450ECEF815F6FBE460C2E253DD3DB391DEE3333C548502EC358E2A9FA8BC1FD134045462D1E319621F25228D529045CA156D9EE79748308D4874792B5E070B398FEF7134545267F3D8C338B336A6D17AF07306734535008F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 128, + "testType": "VAL", + "tests": [ + { + "tcId": 2906, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5EE5BCA45B537AFE7FD6A4CE55B502F7", + "z": "4CE27F01A7A22D17584122829B19F45CE93449EA81C1E1A7743142D6AF884127", + "l": 1024, + "algorithmId": "8B40DC717E1EFA0886DB5422A0ACEDFC" + }, + "fixedInfoPartyU": { + "partyId": "B49454E2EDAD40D1B4B491533056C015" + }, + "fixedInfoPartyV": { + "partyId": "FE277389A0A89730FF05DC49A2AFFE69", + "ephemeralData": "85CD47140CF9233051E4CCA932819761ED98C275547441CA643FCB9504F3296C" + }, + "dkm": "01A677B6D6BEBEEAA62EA1678A3E6310AD6D89E95BDFD39847023A583396672BAB0A3B673185155BE97F07C08D1AE1D3C275074860D03D985D2872FDA770D7C4884E050EBC9DDDCFF78A69DA9BC2BA44734BAA4DEC2F6FCC037926E163D7324177899AD23878FB57C1EEA49DE6365EFA0A13E4E2B554D3EF16A74934A044E134" + }, + { + "tcId": 2907, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD2F7CF5F3A51969865195CFC5149B55", + "z": "B16BF67A506A69D91E895D3F94310B3828CEA39681C05631174F5A16C9E3109F", + "l": 1024, + "algorithmId": "0191467307548A2E60EA2069D3EF2AB3" + }, + "fixedInfoPartyU": { + "partyId": "C6EFCFD47893FD4BFBEBC7636367565A" + }, + "fixedInfoPartyV": { + "partyId": "EA3B9CFFEFADF0C58642BE9B4BEABB7D", + "ephemeralData": "57614B0B3ED79DDC2598BF65813BFD05A3790A4911CA4248352071C56B3B3F26" + }, + "dkm": "9CBB48E7BC56F4663C28FEA7C9FDAFBDEF04CF0A449BAF8C3B8167FED115E4A49DBFB3CE532D0C227FB94D0677F8B29D479B6408F028ECFE440819E40BF19621EF6949F9D18B33F6BCC1C611276B7B3A424EE12DA3E2E57DFD39EA90BC7EB9A3FB9D7571F79D21D863C997296A23906CA6B18D3B2831FDF761579964710F4C37" + }, + { + "tcId": 2908, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDC318F3DFB7A8D32F780E479C299FBB", + "z": "0C3E329EDFDFE59CCC2DB46464DA4EA525367D32C7F4752965A1FF8A98D275BA", + "l": 1024, + "algorithmId": "3CA77D0DB8F5AB2432125587B21414DA" + }, + "fixedInfoPartyU": { + "partyId": "55FCB01AD172C4FEBBB10FAA98FE27E7", + "ephemeralData": "E8EBB25B41A0661F9D967B9E7F0ADFE737F7C6C120A5FB054705695F3EA43A91" + }, + "fixedInfoPartyV": { + "partyId": "FD3C9B0C13A551F8BE88CD9AF80C6D8A", + "ephemeralData": "2A839082D54D864B571A9CFEBA5495BC1053EBC4C8F91F07A416D3D6F2D0329A" + }, + "dkm": "69B359F92DFF2A0574126F9B723978EEC85D27F49A56AB27DAAE8380B02764C5F818F9DB395E36A3EDCB57FFF7E9EA7858FE7856817B76AA934FB8C11EA067CDF9A2FC1EB96D687D63284031F3AAD58DA582E5BB38B5C2BA74EBD4F33CF3D8ACE59D2E704746AE6BE98569EA9399676E72A6461EAB466380D7612031560471AB" + }, + { + "tcId": 2909, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F98233455D5D8B52A8E70E2D87B0503C", + "z": "CD12C15DAE3A14E32C291D4B7B6AC4D434074942EED919B1C64068EF8BF31275", + "l": 1024, + "algorithmId": "CC317259FF2AB301581FBB398DBDCA3B" + }, + "fixedInfoPartyU": { + "partyId": "0965F83514D6EA0FD4DCA67E47893030" + }, + "fixedInfoPartyV": { + "partyId": "06EF68922DDBA8C6E958AE07C8808828", + "ephemeralData": "E6827DA601FEB75E318129049139352931AFEBF71547606B96E72EB5C0BF12BD" + }, + "dkm": "65EFA9D571E41021A785907CBA57BB9FE45306EB2CEDCC8B3BD6FFF7FCAD9B7E53155D600AFFA6CC4B2DCE07355D9071FC50CA679FC1F7FF148D3C60C6CF7479E3AA54ED4BC1C3D24ECB93C01219E917F002A7EECB06C144376F577EAFAA1C07E8B56CBC393EC82F2597D57D3D8DF1173E5B137B1460CBF100AB43D47D746756" + }, + { + "tcId": 2910, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2FBE397F0A6C6FCF4D90B253613E9797", + "z": "98C03F8595E0BEEE9F5976A7038F511F45B5FB4E437D37AA35C27BFA1F70FEF1", + "l": 1024, + "algorithmId": "D7E367053A7EA0D14049F105AF0B7F51" + }, + "fixedInfoPartyU": { + "partyId": "D3FE4D341CB709D51CDDC3F706484FE2", + "ephemeralData": "C0A06A3CBF9E2D73745B4EAFB2FF60E5766AB02C9B3C31D1A57A88BBA92DEA26" + }, + "fixedInfoPartyV": { + "partyId": "58A980A0922561CEC727EE93545EDB0C" + }, + "dkm": "CED92F0C9F7EC5A42CC2F6BDA9FD8BE087A4DA1CEBEEF8175C0437C2C0A3342B96711461EB7E7DBD5CF179BEDE0ACE3DC77781863470AED8F6E9EF3D2C21363D603B76344860338BCF25D2725A48C09C3287B0EE772FC637BF414AE9A1B997F99B7F4E5D505A36E00D8B0BEFF0A420352BF1AC4C8CC4DC69DE89614C6EBE91C6" + }, + { + "tcId": 2911, + "kdfParameter": { + "kdfType": "oneStep", + "t": "186F6A6221C4511C59F77E76F3DE7AD7", + "z": "FAD9854E177896B2ACF91A42B8A50A9DD17ED959AB953417185E4BAAE4867E89", + "l": 1024, + "algorithmId": "5586D306DD9CEF5F0260752504404D45" + }, + "fixedInfoPartyU": { + "partyId": "EB250BCE1D054E41DE9660E9F6E4837F", + "ephemeralData": "C14AF8EAD5F812EF2FD2B4534DAF6CBAB9AEDF6511D8D022071DD11C9C9DEE26" + }, + "fixedInfoPartyV": { + "partyId": "6FDBCDBD90C7EFC6B2635802508ACCFC", + "ephemeralData": "36227242EC6486FD0861B75D5499141786291D47D80AAC6D1C72B39E759F1463" + }, + "dkm": "CD11FA93B0373819DB0113905BE784ABE758B42FFD07FD6BA678999C7A818DFCE605CB3F0DDE802E45F6C9331C0F7A65844CC741DDDCACC2F76255C3E30A445EDFED974434982A4A75206BC520A403E2B59599C13D8B566BA89FB6BF2B7B004EEA78CB35A372D447AEA3F4D05E4FBD4E4F0259205464D5AB83110AC971A91C29" + }, + { + "tcId": 2912, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99AA42ABF8FC8E2479BDAF862FCFFACD", + "z": "85CAE607FE7879B2482F4FE913C746E7E755BED6EB5D3752D652FF036673A3E7", + "l": 1024, + "algorithmId": "5A6037C50635FEC775DF038D9DF26FF8" + }, + "fixedInfoPartyU": { + "partyId": "65A2D1524EDCF8A8CD56F9C4221E9B54" + }, + "fixedInfoPartyV": { + "partyId": "6D6BCF54878AB42A7397B0977B651115", + "ephemeralData": "70295446CC459AAE86EBBC0A64D5F2C513D6E0F6E173F06AF9EFED2233A03A97" + }, + "dkm": "857977A7A3874BB5ABD8C079BAFE0CF984A50DEDADB1A56661B393136102D315A135EAEA54EC075ADC536B5322A5BC2C9BDF40CE1C5C37E5167AB014E02CA3C3B6099764B742F5332DE523A843EABF5368DF8618871D132CE952221A59FDFB857E8228360D4DC38BEDC222D5E8EDD6DA5097CAAAAFDD39D38A4BB24F85881628" + }, + { + "tcId": 2913, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BADDC60C7D4DA93C1561FC7191C59CE", + "z": "E510E59570261EA7213EF4BAA46C2201A0FDAEAFDFDFCF9D8054162FD6D51C5C", + "l": 1024, + "algorithmId": "9624AFB7EDC6EDC171AD694BBAE0FE41" + }, + "fixedInfoPartyU": { + "partyId": "E4127640F77C9B04B8674DD99B915B3F", + "ephemeralData": "0C30E147771EA0B3BBB3C7611D54A0F9BFB7EBE3EF102FB4DE67B0086F3EC633" + }, + "fixedInfoPartyV": { + "partyId": "B020C8561E25BD29AA3675D21F629241", + "ephemeralData": "7FEB6495A2A4F4A96984ED988950AE04FED396F09268BC83136C7BC7BED64638" + }, + "dkm": "00D472844F4CDF16EEB138C7F0250C8E6CD0A9C4D29EDEAD9ACD5688A87BD92C5E047C62264CD4CF7676FB8650ADBCFC4DA60789A2F9E12DA90CC19A25437DE39AC5AAD7268F264FFA1B65E13DD98A2C92C7BD4443009524E06AAAF448AB94323AD6725B6D181532FC73604DEB512C387B5309E36FAC7AA3620D1D85D11853F8" + }, + { + "tcId": 2914, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9833B86B580DBE628F593B639C500D4E", + "z": "2F46C7A047CD66BD5B12B2C6999394F2896079C64584B97DDA82709E81783CD0", + "l": 1024, + "algorithmId": "AB3276B38859EEE8B120AE052FF61697" + }, + "fixedInfoPartyU": { + "partyId": "E9C913B6A91E758BDD0CB1FE76B8C0BB", + "ephemeralData": "9DA9A56894500EB687418BE9C0068A5573B6393BA338C41C2A1DD29A24D76683" + }, + "fixedInfoPartyV": { + "partyId": "3B503AD4ECE14C9BEE210B6F601DE9E4", + "ephemeralData": "BD7CB355A99C2517694904551C51BE9A1A76C188818C6E4F24F87428C3886136" + }, + "dkm": "1AA5B92B555A3DB3893DA32137BC6FAB5859884897416D173DED209D49D02542664CBCE7F8BFF5B157A4E45CEE6A2C256A858FD73658ABDEE56710A6CA08E390592AF52F5ABA7768FEB2F52636FCE2306B7AD0828D353B9F7EC21B3E15E9DB7D2568B97B1EA69E8102C05678F089932384622931446E7FAC7C1AEB54FB5A4EF2" + }, + { + "tcId": 2915, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F17BB4AC749CB408EA3E78C6DD6D578", + "z": "6C7E774A05F7A824FEE084853AA84FF6241AD6B7A8E203BDB3D112B2892104A4", + "l": 1024, + "algorithmId": "A7D413FF67FF1627C93F93D13836C7E6" + }, + "fixedInfoPartyU": { + "partyId": "69D6FA0588B0230366F44AF1FBC360FE", + "ephemeralData": "D129F957D36137425BAB321F1357AA75844568CC1A0A652224201ADD12FAD025" + }, + "fixedInfoPartyV": { + "partyId": "BA374BE9E5CFD7A346215984A725538E" + }, + "dkm": "58E41345978504360BE1E02FA5AA1892E77E9577DF4695C64BFC64B8EBF9C516057C4EE90AEAD426049B93396325CC7FC89482B2D800CC600EF5A16ECA368157CA22F7CD205B4F2F9AEDE02CAE7243A50B5AAB9B09E913BE0103566F3A02C4157F005EB242A71602A17C6A630EE369492EBE213E50811B96AC1E3D559EE014FC" + }, + { + "tcId": 2916, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D4FDF5611C6AE5E7FE1C85161DB4384", + "z": "B7429CA93665D5FFA8C485493FA8D392DCEEA98B4C674FA57C55A4DC75FA189A", + "l": 1024, + "algorithmId": "FD111EECEC501D9798AD6FE4C355E170" + }, + "fixedInfoPartyU": { + "partyId": "B5F4956002BC5EEEE0219C23D351B2CE", + "ephemeralData": "E16A48C2C9EA50C8B2F6B91B57D87EAF0D08D31E3E0675525415540F37837EE9" + }, + "fixedInfoPartyV": { + "partyId": "8BD0A11B26D17E3B5EBE80BF1DBF76B0", + "ephemeralData": "802796D0E79C1B79BF2F4DEB13A78E240B09924C69BE6ED08830A45D1C16B0F5" + }, + "dkm": "D5B25BE2199F33663DB54D0368A769BBFCE2CB27DAC94ABD04832D9801C59AF54381C7EE9E27F711CD067E33DFB4A91EBA7381E805447CC91001EBF3B6016525392BAA6E82ACFBADEFACCE693CDCB775C4CDB225DCD087C30C0EF970E2E780FB86846E9E163BFFA94F8B0A5647AD107CE8D5223E43DB38EEFAF0519FBCA7651B" + }, + { + "tcId": 2917, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9526B64FB71E5ABACC13AA07EEDD7A32", + "z": "FA4123866BAA7208672C2EBC490152825FD03705E0CCBAE1889950B26F03B4A0", + "l": 1024, + "algorithmId": "93CA0E28803401B091DAA5C5643E1B12" + }, + "fixedInfoPartyU": { + "partyId": "82C632DE4D0C54E1E2E05A0B74DF9FDA" + }, + "fixedInfoPartyV": { + "partyId": "78BE022EA640679C8872D8DDB5FC34BF" + }, + "dkm": "2A730B4F04D2929DFC236047D6BF12248C76FDD6B89C8924E95A6A1EFE9B1DFCB21E2A80CCEFF0175C0925D83E0195C92355A67A38C6F3DC9B31F3F0593E2BF625F66B82BD786EC048E905E2C8887309DE59947371E28A2CF19E2690012BD35F16E3648A220B5DBD1C84D6D27EDD44137E9B785EDDD578729AE7EB7C70FB756B" + }, + { + "tcId": 2918, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B21EB847EC7AD6299463626DB6FD7436", + "z": "4502B133D6CD30020F95B9255C1898C3F2438275C30B6D4AF37337E989CE5472", + "l": 1024, + "algorithmId": "C631FB2B526959FE4A9DADACF7C46571" + }, + "fixedInfoPartyU": { + "partyId": "A61FA056006B0A01FFDCA72DD7DFB63B", + "ephemeralData": "1061B8954E1A5B19BC1BC46CA3BE87C66A99BF9D69B987BEBEB88DC19FAF2888" + }, + "fixedInfoPartyV": { + "partyId": "4A639522206F18262979A55388AB4227" + }, + "dkm": "00D8FD852408558EA768FAF91FB593BDCE211A803D19E55E16ABC3DD771AF8BF737071A8C52CBF9FE94F87A4E5DC9C3D1C618D543A1D13D09C287B0BF724EBA3A17B214BDFBC0DBB7332F84DA408A8FAD820C11E5A5C907E8F1A8D7F14D460874CA3E630B0545FD168FD12DCB3A0C71304E784F2B1ECCB9660DB984FBAF98BC9" + }, + { + "tcId": 2919, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73DDA863DA477F307123123B0037EE56", + "z": "47F7B92F7004367997B7019150DEFFBF25D6DB527AC019894BDEC9458234F956", + "l": 1024, + "algorithmId": "B3C709677F1EE205DD587FD04BD0EC64" + }, + "fixedInfoPartyU": { + "partyId": "0D1E362C6533E1FA926C23582445AB04", + "ephemeralData": "4092253EDF1BB11866570FE5DDA7E9895C4D1CA2A8E7DB5E9E277531FD905EDF" + }, + "fixedInfoPartyV": { + "partyId": "C558EA8548F9851D35D25FE91F59DB0D", + "ephemeralData": "592EE10F1660BF72162A722EC3C69AA7483960475A80E42906CF902F764DA309" + }, + "dkm": "4610668B48DC3912B84219A873AAD36BAB87C883F2B150F39F840924AC68264CD3D5BA17CE2CD23A28DBA2EC3E58468B53110AF7A10C4FD001A9A2F6E7861F046CE88F6ED5732DE8E14EF9B9C27E0C4340BADCE2AB808075740CA3A9A81CDF6F47E03CAF5445AAFFDBEB6F55CBD910A4B74055684C96B90AC97C0ABFDBBFCEAD" + }, + { + "tcId": 2920, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC689DFA378BD2207EF2DD2FA985D96E", + "z": "24FE7704CFE297513D149BFDEF5024F25C42BE218C4A7BCFF866045AC3EB23B2", + "l": 1024, + "algorithmId": "B28B8FA0E0723EC2F9AE90A10315431A" + }, + "fixedInfoPartyU": { + "partyId": "625C6592B3DA8D736A57C8A37C2DB6D6", + "ephemeralData": "3AECAA60C16F7BE5CC2AB8C5906BB6257D57F49621C372AE0F16BF784DD6442F" + }, + "fixedInfoPartyV": { + "partyId": "99DD489456F46D17F75DD72832D4407F" + }, + "dkm": "C8E8077DEB63437377C742270D5F09E56933283AADEDFEEBE066D9ABC4147F10F7B3F4EA70150F139F48DA862DDC20E3A68B8BEBF4F19A42B82988420A34FFF83A4998F42C9D660B8D6725C03C5ECF61F1E008961AFE6DCDD5C4DAFDCBA09752A7311CFBF35854DEFE74D6237531FF2F4A8E419F08CF4E9D6F8618280B1AF087" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 129, + "testType": "VAL", + "tests": [ + { + "tcId": 2921, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CAEBDA7B1866BDB51554E8676ED3AE6", + "z": "F70D832651B51AAAA33525FCCBD3A4ED98FDEFC2DF5F72105F9BF6D78BB692", + "l": 1024, + "algorithmId": "BA14920E1D356D649FBE09912C076FF9" + }, + "fixedInfoPartyU": { + "partyId": "61936F2703DDDA4BC33C06588BF8BFA6", + "ephemeralData": "3B7C314821800F68E64072F7033967648D394940BDE1125C16B2F2D30C99D3" + }, + "fixedInfoPartyV": { + "partyId": "01837F25462EE20CB32301E952745486", + "ephemeralData": "E8C0F94315F6854463A3E6D5EC36A5952ACE9172C4A4B3936B6A9035BF9E50" + }, + "dkm": "08105F825934C6051297F69FF544E26449AA2F144332F492C9A66E54722C5642842F03D280AD487B6821B90EAF7DCF3609C038FBEAC035F7020361841DF82406A13C9834483ED01044432C1B5132C44A951B347B62754B6D88DC749E3F0257508A1B69F9B34C68E1A9B7ABF260F7290AA67B0C1FFB8D3F5ACF0F3E86B7919420" + }, + { + "tcId": 2922, + "kdfParameter": { + "kdfType": "oneStep", + "t": "39065535163C42C61F0138F79E90F629", + "z": "0489A18C915E08B526A0E7946F473646433D8645539CE026F94976C602E7FA", + "l": 1024, + "algorithmId": "6C4D7B943EFCCD2439A0DECE577E09EE" + }, + "fixedInfoPartyU": { + "partyId": "98BBE55ABE6AFDE0F58678AC44C2C6CF", + "ephemeralData": "CFCBE27D968F51AFCE96F8C47F849856846CB817BE4CC1595272E5EDE0F6FE" + }, + "fixedInfoPartyV": { + "partyId": "27DEC82BEBEB7053E916A9AB8D08C64D" + }, + "dkm": "EA767BC291EC7C9A969F341C16D85A69AAE59DC7C60218788F5752482D6FE81864269F7260DE5743D1C6EBD761F3D6B1BAC6374D3B404BAA60F6B594BD89BB1CD9FB1F492C04CBBE93F1EAA6856E7AB3127026FFF5786F93553333EF4A1C923EC89E8BE25BCB05DEA711F3BDAE4127D0063022E0A170B942E3A57107708E5FF0" + }, + { + "tcId": 2923, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0EC355CB174B3E26B3EBC9183EA9BF3E", + "z": "B25E0365FDAFE4DF700ED36043287177AC6034E5C4927D89955E0361A5A144", + "l": 1024, + "algorithmId": "BB2733B62635864C7E764EA42462D0A8" + }, + "fixedInfoPartyU": { + "partyId": "7F060586C12029E0B8C68E15E126C3F7", + "ephemeralData": "D9EA4DB337636FABE8977F0D22CCDF1F863060537CC630363B6211A3A6D492" + }, + "fixedInfoPartyV": { + "partyId": "7F6549C8E4ABEB60E60FB82ED23730DE" + }, + "dkm": "272F05131B092359BC4FC69A7A3B27D3046A7B87E86E5EB45C8D65A6118BD340B06956AC6D6EB6628A15109FE63CAB2861940FE586A196F334DD1B89C7341A2A5102D93E13AF8605A1E1C8731C0E96909CC76F7B86E83A088067FB513BC868336E325546102D791DC5D3ABE79838E412B073CD219FB4BE56ED7991637D6289BA" + }, + { + "tcId": 2924, + "kdfParameter": { + "kdfType": "oneStep", + "t": "674402D92622AF33950343398B06F0FC", + "z": "293236AEF97AAB81C46F6D838D7611C96A1A0E7984FBD015A5A5F72AB9CD8D", + "l": 1024, + "algorithmId": "DEFF697CFF9AA40D0258585E2D0FAFC4" + }, + "fixedInfoPartyU": { + "partyId": "8789BF3EBBF14B57E7D5B0AF7233600A", + "ephemeralData": "C286B37B37358F3B19BAA8DA1979D19DDEF6AB7C7E38081EF9C07562155844" + }, + "fixedInfoPartyV": { + "partyId": "AB6A5678A753399F94C61DDD69E0F322", + "ephemeralData": "E4A11354A079E50A80018CCB885C76816A7E8840D3D93E8A71AC70456C1D12" + }, + "dkm": "C3D2B978251B601F3D7DAA33293462C2D956FF56E2171EE8C216BBB4701F49042A9D19001C970B37AB646FB983F2E288223E496275BF8DC8FF039D340CA08A058174E9DC0294F4DDC3021F805A6146FC44E87DBBFD5D6D1A2F91F063A009D1589A4C136AB8213E9BB972865A2C79ED0E65890DE8D357C3C88BD8A2D94E66FEA4" + }, + { + "tcId": 2925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7FF0E84816582B3DC371952D840C433F", + "z": "935C5D0FF3DF880A23C25DB10EF56B596C2F9E3E09D9CFBCCAF9ADAC057315", + "l": 1024, + "algorithmId": "E10A89016FFBDBAADC72B63A30A2F9A0" + }, + "fixedInfoPartyU": { + "partyId": "25328C54B44F7845335E838E5A7BEAC2" + }, + "fixedInfoPartyV": { + "partyId": "725EBB05CE24FB4F53213ED952AAFEBE", + "ephemeralData": "BD3F6539873E065AACE941B25F50E4BA557ECE0D0D38C8C20DD6DED5225346" + }, + "dkm": "D70B82E41D61C5F25251462BD8F61AF50A66B17068405C97B2876020DEA74FE6A457D3EAFB8F68BA28B177144CFE0626AE5424CC94EFFDB8A2A85E27AAA603C1540CC82361F9E8D1EB5F21A0200516995683704000965391438513B8CBC91A2BC112BE8B3E6F82C1EA472D36000010DC86E738B214467A02DD6E33D8E04AC260" + }, + { + "tcId": 2926, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AEF0A52BE69662FA6FD8F9743738AB1", + "z": "F4C6B17A688995CADA5ED86B5A620B5A6EC1883A4B7E243E63E0D0D5436DCE", + "l": 1024, + "algorithmId": "A87B08600381331547851AE0972F935A" + }, + "fixedInfoPartyU": { + "partyId": "1DC244191E3527D0D8A6C4F23477440A", + "ephemeralData": "86C03FA343898A64957B8D11F640895E8DE878473F78936F3284B0EFB30EF8" + }, + "fixedInfoPartyV": { + "partyId": "5891664C5EC445C05A0513A281FA6BD3" + }, + "dkm": "02417EDA8824FA167509B5A9DA949E555F77C0466B05D274B6F3F4CA5AE3BEF0CAF8CCDC5C2E739CA502626EC51DBFC08C3D1D1BFF7A9A19148287CB3A634C9C44B5B172D5F8B3E80ED76A83EA120774273D03E5A4B8A2B594F5748D658B6CCE737754A2249A1CBDBDFC9C552E162CBADC85AAAAB3EA0525A0A6E0AA59E299AC" + }, + { + "tcId": 2927, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD636CF21C370DC1114CA3E44EFCDB1D", + "z": "32C12F800204DF31E9071101FF7780769C31BF8FD4F99FC9B19671DAA01F53", + "l": 1024, + "algorithmId": "769AC9DB28A447C724DD678DC3162BD4" + }, + "fixedInfoPartyU": { + "partyId": "52BCCEEBAE33298705BF28BBD5C6E45A", + "ephemeralData": "62FE58DED87772C04DE15CF8AB79C6DE9A31936CFB6F364BCC616D7A9CC171" + }, + "fixedInfoPartyV": { + "partyId": "F398C4B98589FA82EDB8256E0E72B222", + "ephemeralData": "FC945BD3FE288C0EB92B2221BAD90C38F2ED88F507DB738F3259115424D099" + }, + "dkm": "393D460F3B3FFB7994DDECE1A4F72306D50529E546D188CC0936167F8E28B58EA1CB8F9371BA10DB304DECAB1D07DEB8682FF6A2597B4CAB046BF44F628758BA010419C0286BCA40B481FF861738492C0E394CF6F87F09B6EE50ACCB17BFE653AD4533EABAFB59A2D03F45A6A21AF01FF96ECEDB32B96CA1DA8D46C674B3D456" + }, + { + "tcId": 2928, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F8B638CAD9113D1D8C1FCF8E6B42165", + "z": "AA92C2BF729DAD92CDB2038C4162A20ACDF49047C39A8F9B9878FB6963D945", + "l": 1024, + "algorithmId": "A454C84D39703DE1364054D343766F8F" + }, + "fixedInfoPartyU": { + "partyId": "4779395E561989EDA9EB6574F360B17D" + }, + "fixedInfoPartyV": { + "partyId": "FCD8D9055DBBD00B920CFE22290B8646", + "ephemeralData": "B0E74C3094696154B35B80873B79965633596F5BEA0353B9B6A55801309545" + }, + "dkm": "C8F00973E784B80F6FFC8146EC998FD884A5419487E19DD378FD6F3BB769B305BC7B53BCD38D95F4397B51790CF5F636F92D5EA24A200B24A4451C048A6DFCF10FDC37FB4FD440A75A6B17ACB02C8F0D925CB9BA22C7F3FFA5F0D75DB54C71313DCF7633D131DC147367D3F6D20A1C970DE138352FDB3E412D14E027152FF7AC" + }, + { + "tcId": 2929, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34B05D0E98912EDD2157C8359FDC4DAB", + "z": "9D7CFA887E1C1549FEBBA99FC881A25775384C120BDFB8B7D017CEDF76195D", + "l": 1024, + "algorithmId": "7145C4E382364896AC158BB75C3D6D11" + }, + "fixedInfoPartyU": { + "partyId": "D444BC55E7257C94A3654DCA25019738", + "ephemeralData": "8CA8D3832234DE3D09AB134A7AD3423CBD4898B2CA2D1AA28B11958CF639B8" + }, + "fixedInfoPartyV": { + "partyId": "FBF09B20AF837686A21186C0CFD947D0" + }, + "dkm": "F91FFA6B006523CA9DFF371A0B6814594299C8ADC6C51BA68246369ED344F55B232F7B528A73D794A594E4E4A2C4E21BFF3D2ED76CB2AE6CDEA06F564FD42BA26A1BB30AFBA39276A42CDEC683078587519F3835E17EA7322B75B631C0E5477D96DEDECAB66B51F6AFA70121CC8DD95F66F41068837233C565CE32980D4D2024" + }, + { + "tcId": 2930, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6DDD262C83C26071D9CBE0D3BF16830", + "z": "3424D5C2FDF4CCD03F9C7C2A626C0D7EB3EBF22F7A1FDCEFFBA6993D7C73E6", + "l": 1024, + "algorithmId": "4B73F9859542F5290287F0F6E69F612A" + }, + "fixedInfoPartyU": { + "partyId": "041180344460E63A4F384528F79C1757" + }, + "fixedInfoPartyV": { + "partyId": "38DDB216797648342ACBD8BA22945163" + }, + "dkm": "A2E307BF6300B0C1C88341381D731AFA6E2F6327CF85460E28A1794F63C9F4400287848C9A437268BC0FE9595097F39FE3CC41BC811D9ED9F1D58E64C21E156A6BFB9C8F978ED414379E1822FD3C029896A421D89C1E26D221BA1595F8C8E989E69DA13ED0391AD883D70C1CDD78966275146ADB55FF73D521806C08691F9E8C" + }, + { + "tcId": 2931, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9527104687A4C356D922DCBE98D1043", + "z": "9F45841211F197F68B4B17DE2D3FD41F66DE91A0F95FB0CB03793A66608CAE", + "l": 1024, + "algorithmId": "1B6887E45EEAB5C6ADCDAE335940C38B" + }, + "fixedInfoPartyU": { + "partyId": "7A31BB416C035715812C304B25206354", + "ephemeralData": "A1DB8F15E698688C555B73D2FD1DDF1855D109C70AF97C3BB015C319AFF4A4" + }, + "fixedInfoPartyV": { + "partyId": "0CBA2236CEEA704E918FB43F428758FF", + "ephemeralData": "691F8D8862AF8C5063168E816E0B58A1AB9B2E2AB1239E4828A8339E6154AE" + }, + "dkm": "55542D908D46BDE10EE4B43920DC0DA0C97009DCB830CD0B787D27B175E13A5AA5B2B9FE96FFAAA15611EFDE02191F978F8DEC7C4CAF3089E065FC5C5490053B783FAD289ECD6BC58564C3A3F28AD432C87297A34E58397A43008932B44EF7187F87E73150C99E9834C74EEAA526C066A7CDF054AE3637BF9C6985E420CBBF3F" + }, + { + "tcId": 2932, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E52B33C9FF26EEB6CC6FD4445EEC7E0", + "z": "E3D235E570EB9F088D33D03B4D7F949213A9507075958A0C6A2E2A602D0CD4", + "l": 1024, + "algorithmId": "27ABD588DF2167681F7228545B586605" + }, + "fixedInfoPartyU": { + "partyId": "1C5687AEBAE15CB2FC4BA87B0BD315B4" + }, + "fixedInfoPartyV": { + "partyId": "B8D685BE3FC1247FA07E1765BC0A605B" + }, + "dkm": "642E67727EEACD6BC3843D1AE341169E6188293C13836D0FA4C019FF2B1070BA8ECF0BFD4D3BBCC307B5486D4B7CC229913A6F006BE8D62511751BC941558484D57D1F22258C41501E074FAE3A19722A515C285E0D49D91442EACD107A7EEE7D92AE0776DF83FCAC9A1D395A7CDDEE2D0D82C6C9DFB39E371EB5C4D3A280E59A" + }, + { + "tcId": 2933, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2629CE08B03485F2D8C2AE7D0FC5AD38", + "z": "BEDDB8E201B368C1299235EC5A88B368F01DC17C620F25C37D10C03F060A4D", + "l": 1024, + "algorithmId": "5715071A26568331C68EED67F38B2A70" + }, + "fixedInfoPartyU": { + "partyId": "17454C6EEA01302797D60010D9305A62" + }, + "fixedInfoPartyV": { + "partyId": "470A9A0E0DD744E1BAF03D7480FDCB94", + "ephemeralData": "951989FFBC2F1F3F1DEE3DE0ED4E2D9B2275BAA833BC32F1DC67E0449121FF" + }, + "dkm": "BB3070BB0026B7068B88414129A2E8FDB26A7B3E100B52185A6C03D36DC979C03626D1A3A25CA4A5F166E0AF22E882F10FBC03F971530AD393257172926422A7A0FAF848F166516F621BA1348C329AFCC2B5455F1448DE49E8C73A2A60E512863D1D064B498AB3DD614A13DF97FBEF9B1EA2C9373F61615ACF8D2200F6FD9340" + }, + { + "tcId": 2934, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A290683F6CD316343DBDFA045557AE5", + "z": "DE9BF7EDBCD678D17CB9A6EFF5EC31F943574DFB42F6CC900233F165912D0B", + "l": 1024, + "algorithmId": "02C7A24E05737C4C6191C51E201954B1" + }, + "fixedInfoPartyU": { + "partyId": "F5DF9DA979C477B211611121F9685345" + }, + "fixedInfoPartyV": { + "partyId": "319815761AECBFB05163391196C4D4ED" + }, + "dkm": "041BBEAF8E10F57CD1EAFA1EB4197E426EF9BC6ED47A866B08BF1EB127E6C3F095A3C1C12F45598AFF79C4763568F3B0CC8BB78AEFCFF61968309D6F88823F183A2DCC01438C4FEA9419D986C66220FCE8C22109A005F38EAC8E3C41C6E7F8938EC5C50446B3ACF389335FB86A3D0287B9546417A4A9C972A70ED3755129359E" + }, + { + "tcId": 2935, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA611FE247EFAF58212461AD50B8C5AC", + "z": "57A4C18188770D03401339E90BC4F2705A57F60FB312EFEC38183B427AA58E", + "l": 1024, + "algorithmId": "A168251710EBED153AEBB131E0983264" + }, + "fixedInfoPartyU": { + "partyId": "2A14AD9B60CB8C946526AA7182F18CF6" + }, + "fixedInfoPartyV": { + "partyId": "4B2AB68FC43477657AC078131E547F55", + "ephemeralData": "D604A1F2330C073013E3394F422C884CF955A5B26D5C775FCCC5E8D50583BD" + }, + "dkm": "0B00F5A0547D2429EE5BF5718F6AB1007C0172CC8C5EC0FCC1285481748AC368D118077EBAF05A9779C9BF1039CC55735EC0AC492975A4F9D6F9D227B3C3CF7B9C5B1E02B97FA1B0679D2AE1779E5C3D6CA9F06B0093E6548BB1786781D27F7EEAAE05F8944B7F7279AD8ECD1A7C9844217500E11A403B024B071EB8D2425596" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 130, + "testType": "VAL", + "tests": [ + { + "tcId": 2936, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E281ECA554E07FC8D62D5943742680AE", + "z": "224A088A68E29559F1920D2FFEB66066CCC7E36050639F2A8EDEBD1863", + "l": 1024, + "algorithmId": "4DBE49E094C9960C7A4C4B0923170F72" + }, + "fixedInfoPartyU": { + "partyId": "D7E1A53087AFE95A8DB08CE7141FD5F7", + "ephemeralData": "686E6603795B9B54E6628CD68B6FA42281A232AEAB91CE54F6D9739F9A" + }, + "fixedInfoPartyV": { + "partyId": "7DDE3B835180009016BBA6B1411CB205", + "ephemeralData": "100CD5FB59E87CD06015FBA6295FEEF3601704464A7555CEA4170BC6D9" + }, + "dkm": "6698773F909F275E2E4751DD175CE542C5449CFC6AE299C2A92FE9942C84041988578AE4FF30AC3DB6639B48408286BA43CF49A3EE6AA8BE46385931C5A71BC9B8CDC931A59B6C735C6CC5BF2206DDB35B88A7DA6AED81D145364D36955863FC2DE369516F2D1011AE9EEFE8A379529D98F6B4CFB0FD249B1B7EC0911748FAC7" + }, + { + "tcId": 2937, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AFC705AF2BD5319D46661F0C115A3936", + "z": "BA5DFAC26C74E5F309ABC5C94D5A2FAEF3C0B2BE703645AB4D9E8C1CEE", + "l": 1024, + "algorithmId": "A631C14E1A6D19110E1C908F9808D293" + }, + "fixedInfoPartyU": { + "partyId": "6C4EA124F38A599334322CBE510C5EF1", + "ephemeralData": "B73B70B925FD82346EA65F7F7BE8B18A311836FAA51C3FE6DE7B02EE52" + }, + "fixedInfoPartyV": { + "partyId": "FB311934CD78123F5B0C6FC6089752E5" + }, + "dkm": "BD8C32FEFB10777DAD949158678E7A4065EA15D5F9E31241DA9B5B9BE841F5884558DBC6858FF505D5F50408726E104549D7F07C28842AA0B5A6EF8CF2AF98C9E66E227D8AE859BBADF27C08DDFA381B73F65A5945963CE3A33282002CA085FFC5B2BDDE3E1A79CA7FE4BA6FA71FEFA6B3B4D129036DE1AD2824F12FDC98A7FD" + }, + { + "tcId": 2938, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E07476901C1BFB8857875F2D97DCA8AA", + "z": "48D3482D11CDBB9B3BF09CE3C5594499CDD5D4978CDDED2F6BBF745DB9", + "l": 1024, + "algorithmId": "639554B1003EF4CA86C463CED085992D" + }, + "fixedInfoPartyU": { + "partyId": "8B960BFFBB7BF8D5E053475E8053F5A7" + }, + "fixedInfoPartyV": { + "partyId": "1AE73DAEA6A11DA584D9AD56C1B7EF8A", + "ephemeralData": "39B22AB9FB7A4850861C59A35F4225903B3421EBF079F0516F5480A1E4" + }, + "dkm": "75396AF1064C1F5851E70E9F31451A1401D5B4D2D2A03136F4A5218DC7A87645877E24A89677EEA2CB04CCF6A0335C91DB2AEC9E567651C917F7888649313A04A5A4795604FB50867E5C13E5DD2DB275C1266E494E177B5704A0DEEE217818B4471885484D733F7E2CFEEBFB6C420DDAAA552C258D947BE4D5EED51F5FD7957A" + }, + { + "tcId": 2939, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4FB76B39EF41A9D0634284A2894B34E", + "z": "C774917D4033DACBCD6095EF92F4B059F70260E4072E0C43B1211B24B3", + "l": 1024, + "algorithmId": "0A86B7BC2080935B19EABB8E2E84745C" + }, + "fixedInfoPartyU": { + "partyId": "C8652066A70B59659B976CCB97E4654C" + }, + "fixedInfoPartyV": { + "partyId": "98B233E0E74AE8E69BE0C40BFF69440F" + }, + "dkm": "290A4517B37B5C6AC622AAFE8AAE1DDFE71F195BB13EC0E1C996C2200446BEE63D19A74E4F7C5A10807B9F6BC8397DCBBEA1D3E8177277C7469810BA72672A458A8B5C9712471D9C6F689DFD3E185C4A120889CBB7BD14B55E499843801309B107514D800494F50962CC64FB5D55717201E2B086B996C06AC52F6313DDCABC2A" + }, + { + "tcId": 2940, + "kdfParameter": { + "kdfType": "oneStep", + "t": "187F6A7F591EAD82CD71C911F4614589", + "z": "9254084F532AF0E8A2448FFED82D4BC1EFD22D78FF29DF617696D37E91", + "l": 1024, + "algorithmId": "335A39E98AE045748E10B1028B1DC5F3" + }, + "fixedInfoPartyU": { + "partyId": "9B98F4386528BDC4666AF8C7C6090EB6", + "ephemeralData": "DE674114C7E1C8280B236A49968A582742A98DA9763BDB8181F062C1DE" + }, + "fixedInfoPartyV": { + "partyId": "DC4F518B2E8D35A2F24771B48E58F36A" + }, + "dkm": "199DABCFDB6EEEC3C52F6383DC3331D21763292EFA5F7220F26ECE25A29B0B5287C8D2613A873AB5A497B9E8EB7408EF544D602728DFF8B0A91B39DA0DEEE662DDD158D67DEDA93651832B0F90B5AD6E1880C2C1C7F23BBD9C58003B79F381126905F18AA51F84F10974F6E6DA99D3A087D713840206DC6AA94DAE6315810812" + }, + { + "tcId": 2941, + "kdfParameter": { + "kdfType": "oneStep", + "t": "87952C78AFEF83E45939AB019A5FD0BC", + "z": "8676E0B8EDB4E963587119908701485D2543320B5A630A4D7BC7EB93DE", + "l": 1024, + "algorithmId": "156294318D695E1BE70076F9C4112760" + }, + "fixedInfoPartyU": { + "partyId": "79F53FFCC56E999BA89EAEE2C9EF6E51" + }, + "fixedInfoPartyV": { + "partyId": "946DC3D937AA7A2E2313E827ED3A8733" + }, + "dkm": "0D517879A572326B190F517293BD3E1B523B5574C26602BEDDFD85B3A6B30E6926A624103115F9F77FEE03F29DCC6516B2A1682FC99CC013EC6E813BC9C86B9F0E92C3D33D78AE658FFEAD4E091083CA03C199F239706DBB786097E7D94E522269511D76B7A92954A70A0CA46C77E2584E10CC3F511EAE9825AE43406E277B64" + }, + { + "tcId": 2942, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB9A92AA35361AC8B757D7AEAC9B8F4F", + "z": "ED9CC78558DAD28DE6203E4B4D956BBE26A3A959729B57D9C81167CF89", + "l": 1024, + "algorithmId": "3D023193EFA7522752B023B78F3CAFB2" + }, + "fixedInfoPartyU": { + "partyId": "2D553AFF387575F1CAC466ECB795A87A" + }, + "fixedInfoPartyV": { + "partyId": "BB1242B98CFDFBD57A545EE7A0AF0A91" + }, + "dkm": "6846F726561BEF94531033DF193C7E3961C9F126D2E78D9B8E7E51A4FB71D99AE4223D22C88DE53D0A84BDA68680713788FEAB6DBF51C24DF888AA61F5DBD80F9E652B31111174BF300233180EFE5627C8A2642B06D1BD559F0DB687338E07BA22F8C7B22812221D7EFC7A7937BA6EF61DE561FF2F1A8CB2D4C8CB50CD60C8A2" + }, + { + "tcId": 2943, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3040A238449A15FE0690388D8B8F9EA", + "z": "EED77BB8AC9BBAC6D720E0DAEF3551B220E907D8D3AF5F77F367630D62", + "l": 1024, + "algorithmId": "FAFC093729B16FBC9CE53779DB99169E" + }, + "fixedInfoPartyU": { + "partyId": "FBAF04089A720695A629C7EE6AB27961", + "ephemeralData": "856DD3598F27EA317F555E72C187FC3ABAC8539BEBE42A48951350ADBF" + }, + "fixedInfoPartyV": { + "partyId": "D62B03868730CBDA86CDF82C9F0AC2CF" + }, + "dkm": "6261861684456A3D709E3D6528C9ECFC1AC86239CDEF6AD24EAD38D9C9F6E4E9266392BD260F98CA297524E919EF7ECE0E3DB69E4FE50EA1CFDB1C9F7874A30C27EE911DEEBE2DC0403FF99DB5535477EEDB32EFA074A0B0299D4C7B3BF12EF1EEAF095F867C8F53C54DC45BD5BDDBAAC59525E9B1B6772F869E93D5962EDB3A" + }, + { + "tcId": 2944, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF49EE37941759954A61A17669734FE1", + "z": "7286BDA9C02525A116129A1DD2E7EB4F370DAD6E7E22DE13933514C02E", + "l": 1024, + "algorithmId": "E77AD134691B975A2F3889DF53F322C7" + }, + "fixedInfoPartyU": { + "partyId": "F407EA5070CE5344BD733A3B4D6BF8A3", + "ephemeralData": "A2CCC98D2A7814FBBF4175DBAF5855EA75EF9A8DC8365419C22F6D4512" + }, + "fixedInfoPartyV": { + "partyId": "D8AD731617DFE0431878966C301EB7C5", + "ephemeralData": "2996FA6B3FDD5408BE7CD50294874F3504F4301794B3920FA1187969CF" + }, + "dkm": "ABF1F193534E41C5D508F8E26F689F92B4D83B75A26CFC49857020B529CECDF29F8B480FBA8BF7F8D8C1FA0A5AB947B06C289CD6579D73162A5E63E6669411A27EF13BA23560D9A9D71B2B8D8B5D492D23F6E91864E2F72F2633CA3B7DFB4139894ACF4D8BB213423C0CDDDBFF45D77BD9D2F8730E044E620D75D93AD495DBF1" + }, + { + "tcId": 2945, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51BA4C13A5518C9920E92E1B016E6234", + "z": "2B02314B81BBDBACB26CA811106C65579045E5F244C4076A9791CBA289", + "l": 1024, + "algorithmId": "53D08FFA05803D9F746B7C8FCA6B6BEA" + }, + "fixedInfoPartyU": { + "partyId": "4929BDAA5BC9BC3FC4587C2E825260C5" + }, + "fixedInfoPartyV": { + "partyId": "04384B1010C6DC9F4EA40294E4274190", + "ephemeralData": "B4919F8F34AD5D3046DBEFBBDC71B2EF0711DE54D1A80DDA61C393917E" + }, + "dkm": "0251A397516BF8E15ECC30913BB3D282A1684919A5A370A7F6DE6EE1105A42C57EF6F71FD0A0098119D2BE933F60BF122D038916CE3A57534087CD607C93D91E879FD38B4A48854CD008D9A76B2215ABB6BE26971FFB0FAFE0ADCB2C9DA76F3EE3AB6A2C64EB79EA0D2A890CC72E8D095D33603904DE428796616C20C2CB7995" + }, + { + "tcId": 2946, + "kdfParameter": { + "kdfType": "oneStep", + "t": "37860C05068506F93EED8FFAE61B4D23", + "z": "05B484E9FBDCCD48EBA025FABD5FA6AB9D07CFD97DC09820BF8300910E", + "l": 1024, + "algorithmId": "D12D8ADAC3EC0B8D1C378BBA7D27E86B" + }, + "fixedInfoPartyU": { + "partyId": "BF20695BB50312AA8949B5B585811630", + "ephemeralData": "EB22E813D55DF6E7824DC24CBAE49BD68824C3C64CE5E60A48265F4DA1" + }, + "fixedInfoPartyV": { + "partyId": "86EF689F9A0CE7DF543647161CADDF8F", + "ephemeralData": "B2B665DA8F658E710715E6BDFAC42234500157B963725E1CA1D1673B22" + }, + "dkm": "921EF66A0C99D15BFBCFF098DA70B41B52FA787411F6070E18FD24626E45C76BCC29B0621CF4FF14612169BBE1A56BA5983A3286E06FCA753C6BC1A4595B92760F2FD20BC0C192A70156825BF4C8B7FBB539BE3226CBE0EAB7CB7F653717C62268503CF01E11A9C4E11450A3A5F62F1B943308AC7C45A7118509C33992F1D36D" + }, + { + "tcId": 2947, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01436B71FC6B66DD6E4EAC26FD91F3DA", + "z": "2C48EE9DBBC99451D00D11D00548C628359B53AAFB68CCCBC882E76DEE", + "l": 1024, + "algorithmId": "B67DC4B29313283361AD97AFCB0B0976" + }, + "fixedInfoPartyU": { + "partyId": "597C0128270FEDFADC44A511E5C8EFB0" + }, + "fixedInfoPartyV": { + "partyId": "83DC2AC61ED99C31365AA1F722A0B439" + }, + "dkm": "540413C2D8226991FA456EE9EA95AE6B7AE5678055AF3A5634740E34631D990FDBDD9D893B2BA1D59B8DFD5A913B21B1821090AC7E711EB08AC9C8FC2D2624F8A96AEEE93C66AB12219971B7631BFAA5A9E0BDBBC6B23E7FCEE0E694ED4ED4CB0D1CE881BBEA69E3E46554A2DF6DBFB161A9CB412FBEC474C6A522BD8FE522F6" + }, + { + "tcId": 2948, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C15509DD80901B577775902F870779F6", + "z": "CCB48303AE8A5AEA00E3C32BD4C4F5655956AA3103E17B4905172B6268", + "l": 1024, + "algorithmId": "AA7624E507988BA2EA2453F93F99F489" + }, + "fixedInfoPartyU": { + "partyId": "6D4E1624D91CF5309EDFFFD736980DA4", + "ephemeralData": "D314F8F54C73D6B79D8BD3CC1FC2F193C78CCDDA63A8D8EE5BA5C980E9" + }, + "fixedInfoPartyV": { + "partyId": "1225738EBF1E491C146738DD8CE91638" + }, + "dkm": "973D42EA2E55F58C9025F37C8F80F8411B5C383E5AA9F0B365717A8E0F0973FC4BD70E7BEB8C61679B1A0682B0841042D2C3BF63F0C0523DE2C831291BDC4AB9C3BB7CCAE45C4DF5F3D14D9513D1E9D9DEE7594BBC3967EDE3271CC0EACAF5903D9887A98D9AACF91F45C12D6155655662A0C1BEBADA06FB5FFB323D417EF6ED" + }, + { + "tcId": 2949, + "kdfParameter": { + "kdfType": "oneStep", + "t": "683B64812F331D2AB17918B9E8F37F6B", + "z": "066008DB4D9850E274DAE7A3F5EAFFA4EC8375BF5076109AFC460320EC", + "l": 1024, + "algorithmId": "83165C86376B6A94DEE23A7D328DC6B0" + }, + "fixedInfoPartyU": { + "partyId": "A2FA977C6FD087CF58654A032E2F5CB2" + }, + "fixedInfoPartyV": { + "partyId": "B09220F96BD009F3607DDD3A491E85C4" + }, + "dkm": "13614C1740373D83B45BF1E5E5F845B26D3140FC33F900101B89C74C697A0BA9A25C1753A078DC25B745468ECAE058DF5DB4C785A24E1CBFF1EEB3F1C8A0FEC64F1D74FAB5E9F6ED0FE5C92CBA97AF815EB2F39D622F7226A0E3ACD74402A312779A23A0578169475DD8BE6F888BA0F0350A410BF05E0625FAB919E0753FB01B" + }, + { + "tcId": 2950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B25507E1B9AA4F33C158E59FA51FBC4", + "z": "E41FA8BA768A1A965437612E79F914FBBBD8B6F1185B08FAB34A347FB6", + "l": 1024, + "algorithmId": "E6652731FAE04B8095527EC49BF78B19" + }, + "fixedInfoPartyU": { + "partyId": "D768E1F6F2CA331AF3B2445526301737" + }, + "fixedInfoPartyV": { + "partyId": "E951F8D4A9651F36EDEF50A2A090F880", + "ephemeralData": "4A4D241E3941C694438EAF3A3AB2B1B55E4496FB5F0561B666B186DAE1" + }, + "dkm": "F504A9B756B551661A13212D3905287B7DDBCEDC27A181A20FA7F40B6E955C4333CAA677D76AA10CCC460F3204DCCC8DC502D31EF91042795AFD9EC96A6649DAABEC477984557A358CF37B9E8D51FF55225BC51DCF28313679CF22A8280466E99BDC832BB702ED259009016DD981FFE29432CFD3D3C80FE2BB24F106DA3E4F8B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-384" + } + }, + { + "tgId": 131, + "testType": "VAL", + "tests": [ + { + "tcId": 2951, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D169E714DD0A063D463529B973BD9518", + "z": "75B799227932E2185D4D5651848A187343ACBD785C5EF63B2F9B75B2D84AC1BEFC82", + "l": 1024, + "algorithmId": "F660422DE446208037563CE856A4837F" + }, + "fixedInfoPartyU": { + "partyId": "4C8DE1E83EEE8AD748E33FAB9E833061" + }, + "fixedInfoPartyV": { + "partyId": "3FA10C2143CFC0ED7368ABFE465073D1", + "ephemeralData": "FFFF4C7DB604137FBE2B1B85632E66255049E55436740F67C7AC423433970D3948FA" + }, + "dkm": "9AFB04996997F8D331CCFEBF6AF842A6201C15B1EA67BD67FB7C4401475C8DF4DF367B5B67F8574E24C3481B8E962D2DFD00712F31EAB16BE3B5A899005CE93F18704BA126E5CD4E14232C5995CA778C710910D0167B29AFF45489611BE6C49E6D2D2A74ED358DBF194C5BEC64C4395AFD1BF65FC17C3D1BF49C824527A7E136" + }, + { + "tcId": 2952, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2256F7A461A6996AA90E6BB474EB679D", + "z": "2159328602CDF7BEED403664BCF886E16EC98CD8E258AA647A8648FFD3E48795B37A", + "l": 1024, + "algorithmId": "8A11512EDF44B02A2A64739028974FA1" + }, + "fixedInfoPartyU": { + "partyId": "1AC1875163063AEDA368C9A58ABB7A64", + "ephemeralData": "6AB335369CDD2F2ACE541D18C83FD05D7D365131F3847A0814F6465F4EBE2ACF1635" + }, + "fixedInfoPartyV": { + "partyId": "12D546692860B4AE445B2BA5F78A1C51" + }, + "dkm": "189144E0833830BB5569361A2187CB0BAF8F4EB785F0BF59D644E822CA5CEC1BA7779C37780BC5F487E673707D465A44C9DA33FC3D38532CA9B21A16CCA797B5A117F63867948F07E7F16636C30C21F1438CCE0B36C9F8B7640C3813C6A0C14B891B59FAC85500F07FB40219D004EEBCB3C0064F034746551DC010572D7E3C1C" + }, + { + "tcId": 2953, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C4816C47BC0A46F8C39E62D8345B90A", + "z": "C5C762B505CDFC8A19A7A76B7ECBA87C85A47EED24F6D82D28B97CAB768FEDF57BC4", + "l": 1024, + "algorithmId": "9E24800328F2107879808EA1F9A5E18D" + }, + "fixedInfoPartyU": { + "partyId": "42B64A9560B905CAC90E930E368B8764" + }, + "fixedInfoPartyV": { + "partyId": "11CB73B3AEAEEC76454D1046619F993E" + }, + "dkm": "A44FA2E5B33B4647EABB67C10D9207818F44B887B5FF173190D545C01A9D1C3CE0B635CACC39ECFEA1C0A2385DA58171008414DDFA660702DA31D522F3FA4F0C76EC44A06D14E9E02C735EC130D4031331E3E678E28B8B2F1D62DC4FDED678A5D46D93E1245B499228A14FD55E8D9A6C18006D8B0BD0085D1B222B629153887F" + }, + { + "tcId": 2954, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16FA0F0B3CEB6212D6B6E5A062345746", + "z": "A862EC86B3EE9E33A021702D02B480905CF25D1D344D5B03AFA61A691318EE1459A4", + "l": 1024, + "algorithmId": "2F6C972DA197E09B6C9B47259E2966D5" + }, + "fixedInfoPartyU": { + "partyId": "C32D658C83595FCE278F816A38E942C8", + "ephemeralData": "8D989526C62B962BA5271D36FD323EF1E4C84DFEE035B104397184BE5F64C74D57A2" + }, + "fixedInfoPartyV": { + "partyId": "355B7F99768B47F8B42BE364BA9834BD", + "ephemeralData": "02F63BAC0BB191EE057D130E7F0EB5CA22A7186E13AB582733BE9F2F21A59F843B81" + }, + "dkm": "330966B2CA102D0BB620B0251C450B341329F501049C3C8E546D52BB0876C54E9E235E70040BC7AA2193DFB66B631BFA8E9CBAE182FCACF3E6BE465BFBF0D45DF678A9E5D233E51816A9AF3810DB064B20530EBD2719848BF412833740FAB129145CE9EF9F7BAE4321AC958BF7B1991E903621443B9FEC4A1326E64A62619934" + }, + { + "tcId": 2955, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D245203A4BE7106587024F7D981BC40", + "z": "1A0B7C079CCDFC5B080DD21126FBF7F12219C74D74ADBF6729F46537181ABFB1ED4F", + "l": 1024, + "algorithmId": "F391E2B53A772FCF0A408C6E61607DF7" + }, + "fixedInfoPartyU": { + "partyId": "F62492AAB0BDCDE41C8527D9D230C7EB", + "ephemeralData": "10D6D8C85D5C144341DE72CA484697858892B3EB2258973ABD11B1DEDC28612C61E0" + }, + "fixedInfoPartyV": { + "partyId": "FDD2AB8C844A6AC72152EBC2B8DE1B26" + }, + "dkm": "31AB038C02AEA476308A6A2F0063224D0B8988B096D58F0A582C86606D1D88DD03F820C5E7B73EE6BEB719221597B235F69CBA89822DAD91F317C839AAED191D50515640D03E4D9591DD6FEA2F07FA5162017F759EBFCCC78CAEAE0EEB5DBB20C55C89FEA6800B7F69E1A5322F5EEB13067DC07FD73F222B3CEBA04F0B3DF767" + }, + { + "tcId": 2956, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70AA8B40FC3A12A3DF39BA0B0920B5AE", + "z": "3D4E23256F2E027CE893481F0B62A83355F50BF988F021CC7ECECB860D3BAEBF2E04", + "l": 1024, + "algorithmId": "25D8A2F425AEF8AF666C68141FC8CC02" + }, + "fixedInfoPartyU": { + "partyId": "2E191AEE17EE8D3B542EA1E929E3C620", + "ephemeralData": "68FFE961FA7B5992D00D79926BCC273267B3D3A8595E9D8391531B770EF80E0157EB" + }, + "fixedInfoPartyV": { + "partyId": "444534DDB7AB10960E6CB7272E4CCC3A" + }, + "dkm": "F5D9B6479170CB05ED8F15D9666D127240363A2D40504945149E0D0E02854F96262C3DF254698D1D556DC7D9642EDAD7EED5230F336A906E789E03B7A53C06347F6B899D73CBA0F592ED0804742DAD80BE77099FACEDFFEA7F391A9A05B54EDFC668CAD7C6E7BEC28B951AB0C84627BCF9C9EDD3E2732321B2A6AD9BB61B28A4" + }, + { + "tcId": 2957, + "kdfParameter": { + "kdfType": "oneStep", + "t": "246E1088F413B50CA4223EED135DB6FB", + "z": "19D35A280AD8AC4D239C3A289DBA4DC60C081ECB47F62431864E72F4CA8B7E502DA3", + "l": 1024, + "algorithmId": "64721073F23D416BB0FEEB6159C8BE79" + }, + "fixedInfoPartyU": { + "partyId": "F5E9C4AEFD0D66C4EAC230D9F3C0454F", + "ephemeralData": "1FE2C389749E2DC2D8D08B9633145D86F7DC51D65E449A477D68E215040569204A7B" + }, + "fixedInfoPartyV": { + "partyId": "AC3608804F7AB27111AB414AAFB20FAC", + "ephemeralData": "A3F2F6BA588010E3C202B245AD2D9EC6B124B784F4F344E8422C9995B448D79763CC" + }, + "dkm": "C155D8C40699FFE7C6E5551C98105BA3558BFE1E4D4B1ED442F366DC930B7B39D737201E4E7CE6B7BC3FE523826D2D5CF3811666037A2DAE5E1104481A7FB7081ECE93AEB888E1FD0A0D69A4B68ADDD381F8BAA8D902A7E0CC0473DDCD747A4F26AA2B1FD1C8D5437271350AFF208E9A42449AFD83A0733F97E69068BC114F48" + }, + { + "tcId": 2958, + "kdfParameter": { + "kdfType": "oneStep", + "t": "176188301B15BD868E14F3248C111179", + "z": "2BD319E365B2379E9FDE4E9EA21FEEB800DC15514A21C87B3D5096C18A4D300F61BD", + "l": 1024, + "algorithmId": "9014F529BA937C35C9803D51697D68D8" + }, + "fixedInfoPartyU": { + "partyId": "B8715F9C7E05997B6208C92E22B53B84" + }, + "fixedInfoPartyV": { + "partyId": "7C40F1AC8574CD739D5BC985258D24A8", + "ephemeralData": "2601C5A7CFDC94FBBA855A71FF568D88F1D070228352D5DF8B348ECB9A5A64A810A2" + }, + "dkm": "DB667FE507B9E1CD0EA3105F505870BDD36E32F05A73A7074AAE87C1D6233531C1F28FEFD82F7D5B9A059488E7AFCB91F4A4BDD2FE1388A9CE1D6F500E15688FD921E6C0F4272016D5C406A7D8A151BA8717039636BD88097BA5FBE4CAB631FB080082BFB64AB0C2D26705CDACAB77335BE5F1CCA6C7FC983F3394B875083F14" + }, + { + "tcId": 2959, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F26435FB1C655A3C1F921BA25E433CFF", + "z": "5C7E8BBA0AC15DBBA7D958407DA550580DB31A608DF2020E25C251C8C381A5F2C3DB", + "l": 1024, + "algorithmId": "A9EDAB64FD4FE3C0B52626B8F8C76B74" + }, + "fixedInfoPartyU": { + "partyId": "4AFAAF2D8F0D7D9BF1733B2747B9A121" + }, + "fixedInfoPartyV": { + "partyId": "84836AB8906B08DACC9A835E4C14DCED", + "ephemeralData": "980B8A12E36108334C7B1E1DC3106AAECDA176630C79494BC3E1B4DC1DE66B61BF6B" + }, + "dkm": "4AA7E8E3D26304A7FD09D606E2EFE6A5ED0C796751EFA6E3212843FCC31589275B19EF36F06D7011203FFB4D8CA7F588F8A8B19C59E250E5E251FECDED356217A5A3C1938435968030E8B592280DF62296F56C6F831CCD465194CEB822500037228A455B0673D00600D614578F286CF98B17BA751C05EBEDFCEE98267DFBA168" + }, + { + "tcId": 2960, + "kdfParameter": { + "kdfType": "oneStep", + "t": "537C1696EBA4B8A5B2434688F3E6C4B5", + "z": "0931801E99525F35B21689DBB3FE3E9F4630DB12B7E2B438737F5E8A4F66ADCACBBF", + "l": 1024, + "algorithmId": "75C3CD03865CAD97B485F617DA6459D0" + }, + "fixedInfoPartyU": { + "partyId": "C8A5EDCF8F0E14748839650F160337C7", + "ephemeralData": "DE89B947E3867BC63E75043A3719D8DBF0D982B755E50B2B1AB49740F00C553E774F" + }, + "fixedInfoPartyV": { + "partyId": "0C56BF8E7C0E4B5A7EC246BAB3F309CF", + "ephemeralData": "EE7A2406AFF9F6EEDC9B159435268FAD86068271D2D010C52ACDDF393D17A1F0CAFD" + }, + "dkm": "F8FA536DA35FAB319374D0A53FDDDDF5D2D4557228584A8F44699F1C9130CB5BFCDC3B0564E0E8DA7CC6AB9EA6C1C466F470E166A093489F83CF3A2568CFA1268476C520516C2650176623DF4CF1BD76AAD6408F59BBDFA4B13FCF2F70103B8598EA12C98837D78B74A9DB0EB7E3C8BB9525967299C51F1E0401FC24BF72CFC2" + }, + { + "tcId": 2961, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6905482FC8DD944AFEEC322CC9A044D0", + "z": "1749067B1840CCEEC36286EFE5DDC43518183A350B00FA0AC666355D03D9D1A3C9FF", + "l": 1024, + "algorithmId": "485BD6FC69814E4FAAE11E6038C14FB8" + }, + "fixedInfoPartyU": { + "partyId": "A25F3FFDF22766636BE7CD6F8A32336A" + }, + "fixedInfoPartyV": { + "partyId": "B0034B4DF49115156E1DD9198C401216", + "ephemeralData": "1441231B157756B85A1B1559508B08F464689E6DAEC6705E888271DD68A98E0801A0" + }, + "dkm": "086CFD4CC9D1FCD4D9F95B6CB3F5E178F44C2E08D995CFE005AD8192A1748FF2F78FFB62150D248CBFDDAC7DE5A09C970E2CDE10C0A4B0FBF9B13B07B2E535DA553B12FA3F36F187FDD5486DC583F374103CF9168E38BA08C66384BE1B563F134424D7E30D62CA89C135D8F880680461F27C0615AA36BD62740F54DA057EA9C2" + }, + { + "tcId": 2962, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14A519C50AA481C84A0D86E801B81877", + "z": "C88126835FA72160AAD52AD41CAFEA52FA5014789EE36565C453F6BE9E04025D5E42", + "l": 1024, + "algorithmId": "1634869D2FDD273F48694CA229F5E3B0" + }, + "fixedInfoPartyU": { + "partyId": "8F092966A82023AEC15AD91132283FED", + "ephemeralData": "A5171737442D09B06DED9079E81EEC38B11BE33F41F34F9D3D592C33892665BBC6CA" + }, + "fixedInfoPartyV": { + "partyId": "C4E1E2BA72BD9BB805F5B6C663C65FB8", + "ephemeralData": "F86928CEB37BD3DE2F18F781EBB71DDF884E37850615FF29D8B8772A4CE29BA3D177" + }, + "dkm": "2F86CB607D8107C654FDA40281927B4074CEA8F1F89B7DD7622FE7F4A54219C7B7AE118047EBEE6434EB94BE6216B5BF3139E7AEF7647F8E0BCF01E444A344CFC64DCAF5EEED2327C804B2FC1D7677B3DAAA3B42AEDB5ED27DD5289AD6FE91A10732B510B9F27524F568EAD3183AFDE5F3C594776E3386423B12F31D9F1B8513" + }, + { + "tcId": 2963, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C403CDB699F3DE520714C9AB55139C1B", + "z": "31F91D6044FBED4CCC1817633BCC150E4B98CEF0721BECFE87808A4F882EF2F54CD9", + "l": 1024, + "algorithmId": "D40551CCDFF6FCEB17DDEECC9FD32CE1" + }, + "fixedInfoPartyU": { + "partyId": "24EEE0EC27CB23D5894D93A5125B8005", + "ephemeralData": "42D6FF6CDFF04C3F6642C87BA685736F6CE9F3E1273C8E613B62DADEE89DF8EDBE6B" + }, + "fixedInfoPartyV": { + "partyId": "34EAFC99FAEB5742387D9768390B5EF5" + }, + "dkm": "D592F460711ED97C027E44863E6831E441E059609E2D65C0432A1BD9F7F2433147F84764068363653E2FD09747E841576A6DD92C5B8AE75581D712C594F9AA251A6882F3BCD9AF9D007C82642733625EBBCECC5D5716D15187B9EAC66E161E0FD172FCC52273BB1010DE63E7C92168E40ED7B08F02A19E40F9E2EB3DD3B46D87" + }, + { + "tcId": 2964, + "kdfParameter": { + "kdfType": "oneStep", + "t": "40C46A1901DE42D7E772C6CC162ACA20", + "z": "2DFA8CDD3B261571EF046F1D0BC459496578D0209AC9B49823A37A48D62F99DDE74A", + "l": 1024, + "algorithmId": "DD021659866EBFF7F73C045749D67635" + }, + "fixedInfoPartyU": { + "partyId": "0D223C1EBD2DA972B0814AAD6938713B", + "ephemeralData": "B118F234D14641739814D7FFB70F97AE5F9BB90B45685333643F956DCA3F7C6B20B4" + }, + "fixedInfoPartyV": { + "partyId": "032163095C4EE56ED3CBA7FCB18F6B28" + }, + "dkm": "07A9F5C23BC72EFAC114B422F282AD2D58C978337C4ED95171DDF8D5ACB32B77A3A491457E9B4BF71BF80418021A48AED0D2713409A76B53B602FA60C66FDBB0EFD2A0F31FF65CD5E8717EFED157147A3B48C5B2AB38C9A3F8FAF5FAFD016565AA8003F1F41C402296BB8AEECF4026037679D9D6DD076C1AC71C51C53406C8E2" + }, + { + "tcId": 2965, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F18AEF7BB4E7EABD54348AE27EF0BFE5", + "z": "869ADB348A5895FC5ED956F18B4AB8A81D3F61960DCBDD095A61AE64DBDFC999F4EE", + "l": 1024, + "algorithmId": "15C881C3B27725CBB03F407FBAB30DE1" + }, + "fixedInfoPartyU": { + "partyId": "8653B0885680871D415A0A35FFE7CFC3", + "ephemeralData": "14D2414CD682D5696D095D9EE73F7AC74945422D26D756CFDE81F0430263A7D2465E" + }, + "fixedInfoPartyV": { + "partyId": "14526146EB8B2BB40FA3CC60DEC895D6" + }, + "dkm": "255930B364513D5E9A19B96FCD9323320ABBBDE6A1C8F8C8853675611775B2E4D429035D2D89C769CF550F32A0A088FE88BB44E5616CC2E31FF0A6F0722D88CDB7E09BE2D9D50C468CA63CBA0F0B1B5486AF5A37276CAC76117CF67982683707ACCDACA3CF3C9F70C18CE530432C8C6E071F7B3CF9BB8FCDFC5E886DDA691D74" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 132, + "testType": "VAL", + "tests": [ + { + "tcId": 2966, + "kdfParameter": { + "kdfType": "oneStep", + "t": "476C6532502B37800D156DE40501E2CE", + "z": "DA620D57F83CF0B052FE064E88210F95EEF0810AB8B1EABFD85D260A", + "l": 1024, + "algorithmId": "F24B8994005F4ED8F1204812E21A6D65" + }, + "fixedInfoPartyU": { + "partyId": "63FA4830E433732B6EF617E172BFCF1D", + "ephemeralData": "D3DB5DB3197D0D7EC23B9BD687B18165E919961A662B01A316707827" + }, + "fixedInfoPartyV": { + "partyId": "81C60B93CD79C4F2952F7AD9F568211A" + }, + "dkm": "558A4D344DCBEBBD32D1F30D8BE6756D188D2950537C59B395CFAB9C0FD8A7BD00C4D63971BD59498F52ED76BF6028AA640C0812CDEF3D9DEB69C1BC467D588FE0C507A5849A2F31290B94CBCF8818F98C47BAAFEEDA81177E02AA0E5CE1B3ABC3FEAD3BEB77448267D4D977433809096F5BA86024CCCF5F3ABCC95DFFB2DACF" + }, + { + "tcId": 2967, + "kdfParameter": { + "kdfType": "oneStep", + "t": "323D5359C15A2EA1B16C72A67CA32720", + "z": "763147161D7D6447CA8BCE03BEF84CA519682C5D2297A5236B09FA0E", + "l": 1024, + "algorithmId": "D4480448B08EB44E22215FA4D3F8828F" + }, + "fixedInfoPartyU": { + "partyId": "791E81907BB0DCFB4EA25B77FAC96004", + "ephemeralData": "1D26C3AAAA49A16D63FD1D2174DC55EC7CAAEB73C88BBD9C35540C53" + }, + "fixedInfoPartyV": { + "partyId": "7004323DA26840DC3AC3130345C63A10" + }, + "dkm": "AEFB3194C18131BCDA468ECE707ACF152739936BC8C3CB77D79A33EF41904A32C9A5304607C031451856D96C02E936A2CE10DFFA914BBCB622295901602D56F9E1A2F4FD2F3CA0A5FF78E79407B67E312CE110B216C20B8C5B371CF4F63DB90D98C49093D78BF6C58D662DF0D30B5325CE1FA364B43005472FE0304BD3ED12CE" + }, + { + "tcId": 2968, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7EC1D588C69280727EB49C78554FFD9", + "z": "B2DA8632766B4C344B9DC8D7E8CF10B0C1C0EE283BBAC50BB700D0D5", + "l": 1024, + "algorithmId": "27A3AB1137FD6B3BFD1295DBE2AE1DBF" + }, + "fixedInfoPartyU": { + "partyId": "D85C1945141BECAA4161067F1EA4852B" + }, + "fixedInfoPartyV": { + "partyId": "EA8585896489C2A17F90B58158F67729", + "ephemeralData": "D843DD9E14D0AA5AE30E08EE92EF1A0688ACEA3E8EAEA942A149A20F" + }, + "dkm": "0F834237EB7948F951D01E3030E5ED6BCDE4B6F8250BC3D790FF843B224ADFBDDC495CC8868B2D00AF64C1B519FA2479AF3BD97A2ECD459B87406B8C4E749BCCE9C4E534FB89481DD0F92BD1DD6AC689E211BDBF17F2E12BEF1DEECAA09B41D403FF10E7922443D03CAC49D01E4F2858D06C1F4845F319261CF8EFCE8DAB7ABB" + }, + { + "tcId": 2969, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D24AAF370867879318067422FAC9C5FC", + "z": "45B6483D2D7E38096D6FC0890B5D1CBA9825DEBDD7C19B4A02ECA3C6", + "l": 1024, + "algorithmId": "277806A43392DC58C03B53CD4A6143A1" + }, + "fixedInfoPartyU": { + "partyId": "443DF10361DD7619006DC091A88933EC", + "ephemeralData": "E313F15CAFF9077C5589EB7BE501C4BF258EC8DD40767E5C2A775D6D" + }, + "fixedInfoPartyV": { + "partyId": "F8B46812B58F1B3EEAD0DE3AFA186A0E", + "ephemeralData": "5C60A616F4E0EA93AF7231926A6ACEC86465D2EEB405877CDBB15ADA" + }, + "dkm": "0985F63444D9501275E8193074CA188B39AE62F674CAB6CB46A8314E03D6352CB2B008E09D1FDBA6BCFB855E8ADAC385BF1CE2B4A157FA112DC60F0BF7E39986ABA23223B4958FC430144F029D835295B94252AF89B57992E763850EC182323939A44177ADC987F4F6D4C690EF330CEDAF17A89A08298516144A29EC3098B9A0" + }, + { + "tcId": 2970, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3901FB6525B54971F4D570139B7F001", + "z": "2C93F27D76D825F2F9CE6752E10AA7E8490F869FA61364125E7B5A6B", + "l": 1024, + "algorithmId": "41BD76B4EFF57DCEB622A7802B11CBCD" + }, + "fixedInfoPartyU": { + "partyId": "7B9911DD9C2E5FFB5A8411ECAE00CF4C", + "ephemeralData": "39F3E6B023D65C6186CF59E6D120E0058246F197514EFF7949EF3604" + }, + "fixedInfoPartyV": { + "partyId": "20555DB1CFD3E3A3BC782E5C8CE01B32" + }, + "dkm": "3EAA0E3E81484AE4B1ADA695DFE1CC7076C06DE24C2746ADBEDCAB6F9A2E3177D66ACEFF8A25E349E0663DA3C77FCE01F44DB706E996FD8B5EB49EE4CB4D1857BCFB3E329846C63BE6C6BEA14D9414443C7DFB806599533E4E3E923080083A55E35759F8F90B2D8C3613C39D0035A954675FC597E31F021483CF6E705E9A3FA3" + }, + { + "tcId": 2971, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CDE79AEE6046848A4319C0198686000", + "z": "02B248BA4F1A5970BB4FDBBD675084FCE8813E77E93D4E92A35325C9", + "l": 1024, + "algorithmId": "8C5FB31DB52E70B82F969D6BFAEDECEB" + }, + "fixedInfoPartyU": { + "partyId": "C3207E22B2F9BC60F8EBF2913F81AF99", + "ephemeralData": "E200075898095641BDC8503A9B4AE8030A70CC2229D2299C18C4A849" + }, + "fixedInfoPartyV": { + "partyId": "256F15AE85FCEAEE9F71335739F1999C", + "ephemeralData": "544FADAB77D0B336DA898DF02895BF2B9EF3DA05582EE716AED35CED" + }, + "dkm": "D1B57783BDF6D8B77B621E769ED170481F8E4AC315A133DB3BDFFD34E81F59E2EBA2075F0BFE12416A7F45EF84BBAB86741BD71058C4BF7287D251845AF3A3178E6AAF28E708CAF5A266DBD7166F2DEC64BC5835C5083D1C87DD43F69183E14E5E3CF8B18224B2B16D97FB3FF0A1082CF4C07EE4356947BAA2B09A754867060D" + }, + { + "tcId": 2972, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2C84688DB0301B814C2E6B9BC294633", + "z": "8CDF3DED3202E26E1A7EE9C7897BC42100F5C9B7FE1E79D704E7B6EB", + "l": 1024, + "algorithmId": "7942DC1882ADEE100C37BBCBD34A9AE9" + }, + "fixedInfoPartyU": { + "partyId": "762FC77AF8A3A848746A0B25C9845CB8", + "ephemeralData": "0ED41FE4168453A9BE30A901209FC191882BFAE69CD55E9BA8388449" + }, + "fixedInfoPartyV": { + "partyId": "103F2DAEFE1D21E2B28E8FA5BDE067B2" + }, + "dkm": "71D9DDD9D42F87BFE1A08B0F01B75269B39F2AEA035B3A122C4C520E8756DB3CAFB5F72AFCDCBAEA6E88DA75E7B9F81407F16AF517763902C0CE83F78AAA987C7EB09118B602D81D0E580F2C03911047B1DA43EF2F886137ED6A6FF2E803755BA2960D54B1125CE3FDCF87D16A3359FAD24E51A4B018B7EA9646ADCA539D5B05" + }, + { + "tcId": 2973, + "kdfParameter": { + "kdfType": "oneStep", + "t": "714B5B63E6CAA4C76CBAFC69E7C4EC9C", + "z": "D77835ADE6C17293B4B7B34FE950AC4AE03E8A0E2CA9F9DFD95C90C4", + "l": 1024, + "algorithmId": "0096960382051A9D8CC6957C3FA268E2" + }, + "fixedInfoPartyU": { + "partyId": "DED99742A320BC3972BD93CE4128E0CA", + "ephemeralData": "9393B0DEEEB611FD622E62D180AA2C76CF52DD97A4AF96E0541B22DA" + }, + "fixedInfoPartyV": { + "partyId": "B6379D7949EA835C13D328E299FC7113", + "ephemeralData": "784E2497584DECB8E126901C0330762C6CC9C07BAB3470227690C2A3" + }, + "dkm": "62A22879A279A93C3B842E9E4CBB0333D5EF93BAE046F35B637567C045939F35D6E86C6B3079B66C91840FEAF5058D796F8E37959F35F0DEE97B3E810E85A3CF3CB0F33E578A781DD1DE9185680AA2D64558DBA3A6A31A6CCFD51325227A9B1DEF089A98FC52682EEBCB5B16541EE611A2D7407E64466DFA908DD69FE7FCF035" + }, + { + "tcId": 2974, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B4610290B0E5FCDAE9E7982F46FFBCF", + "z": "D450F4FC3E9B02F3E1E8CCF746F0EDF56631C9FDD93E4A0691476876", + "l": 1024, + "algorithmId": "969DEB67A655D878D1565D331EA29AB7" + }, + "fixedInfoPartyU": { + "partyId": "B9F696BC858F0BA3FF2F099167A74B4F", + "ephemeralData": "3DECA2F0BDEBD4C921B2896AF9129509CD735865285C14C76FE0B838" + }, + "fixedInfoPartyV": { + "partyId": "B12C3F4B368764703BC3F7E20C5C2463" + }, + "dkm": "9C6F130B9568A7032867CE01CAA75244D7994EF6C42FA8F7C6AEE6A174DE377E6E6CE6250BDD455E7BD947F8819B10532619AF58BC3577C49822AD49B0BFDDE72DE1AE1DC9C39C5F3C5E43A60528D71EE5467A1107394BF08F58C4AF55D0957F01B8C70B19F26B1A932A7095E6CB85B11831B2BEB8DAD2AB2D2D8FED94F9B3C9" + }, + { + "tcId": 2975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "596F7F9652F48DD5673F55813261BC64", + "z": "2A299A8CAEA56CDEFD9B1C909CB7C7291653F83C68CBBD25E86B310A", + "l": 1024, + "algorithmId": "72C57CBBE4C80AE7FB65D9B7FE02CC04" + }, + "fixedInfoPartyU": { + "partyId": "89F5F9F1A74CDC118AD96E9A676513E5", + "ephemeralData": "D0B38A2CEEBB7CEB932883A1938B5BBC8B9D7B72E379C158D60D3D28" + }, + "fixedInfoPartyV": { + "partyId": "F22784EC518C541C5C63AD1C76E50CF4", + "ephemeralData": "F64D772EF70F6F279566EFA80ECDA91F82AC15F6CC754F13C18155FE" + }, + "dkm": "0D80A673620D6D0866493175D39F886C2937DD9616499D7A463606BBB2B2E4756EFD2450051AA47331D3B9733FAB3AFABED3F2B2B26764A1D8B7D0F1888E681802BAC299A94CAD148AAAEB4A544080D97CEBFD83F23C203E8A21AE06E6E3D19337F75294B8EF68D486323AC5A9820B1FC52DD8DDB025BE73FB6B8477C0E2C7EC" + }, + { + "tcId": 2976, + "kdfParameter": { + "kdfType": "oneStep", + "t": "529D9D7DC80398589C271AF9A9602576", + "z": "A1541FCC64E9EFB727829FE008875473825745E579EC6781C496E5B4", + "l": 1024, + "algorithmId": "5366B2E9363FEF08E6C0EE7CCBA88DBF" + }, + "fixedInfoPartyU": { + "partyId": "3A153154C285CBF9582BED516B69F7EB" + }, + "fixedInfoPartyV": { + "partyId": "41C03414A3D62465BC6B82484A501896", + "ephemeralData": "54C8ECAEFD74A29821F4CF2AB31FFCE31D8B7AC0F6DC963F35559C44" + }, + "dkm": "3C9F270A7F845632BF140B31A2C3C2CEBA1129CFAA770E7EB6424A2633FCB8253920CC64703C3B6FCAD9E40F5AF1F510682FAA09F2614AC7B25C4D5732D3FEDF96FC868569DBE5171B6B08AA6E56024580DEF3D9ADA60AD51B1DEC87DD5FA8B8BF4421D80BBE169547549F6074EAF23D7F37B3D1EC1EC462A5B3CBC53D5439AE" + }, + { + "tcId": 2977, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F2464EA0DDCF9C35471F88AD1F34640", + "z": "61728D3A8E16E7791DC10DB5958E5E246474730198507BBEBDD166F9", + "l": 1024, + "algorithmId": "8A1D9941499F26136C981E5B36E2AC87" + }, + "fixedInfoPartyU": { + "partyId": "16CF5BF5C4CC5FC8DB4F2001AF818A42" + }, + "fixedInfoPartyV": { + "partyId": "083183424F120607A3DD58466A652F0D" + }, + "dkm": "E8CD8EA5FAEB15FAEB081DA07370189331722DCBEB9486F97BBDF793F7E31D335029A0A245916F66509896D7A379E91B340F8EADCE7005FF2538A59EE3A0037F4667D83B7913BB45F4E432F7D3942D4CAF5B1879B3014F93E0142FB8C2F443597E7229A066D0AF0AC47FC1E9F25176EA558E067356DAE583DB810E1BE2E7C9B2" + }, + { + "tcId": 2978, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DA67F0661A654B2B6BE6ADB19C23C12", + "z": "6AACE44FC1A0F4DCCE0A8615BFF4B9EA6C0DD5FE73285A88C2A1ADDA", + "l": 1024, + "algorithmId": "3BD079A4841028316B6ED1BE5F9B0D2C" + }, + "fixedInfoPartyU": { + "partyId": "051A4F14B8B20ED7F6A98282B1640D2A", + "ephemeralData": "D307E8FE0F68EA5B71F149BDADA472DF0DE5B0D775804BE65FF9CB51" + }, + "fixedInfoPartyV": { + "partyId": "D2AA3CE3C1430AB318FE649ADA8DB952" + }, + "dkm": "2FAF6DA07638B470BE796357563A0CF820FEFE81A2C1149B542E991120F953A1A85490DBD343F4FE9A04F77D3EE19B9A87D22452BFF9F5D2B30709F735BAF1E639989E4E1A3F4BB22F590122F91F91E2F2DB966B6F3D686C3C406FF013155469F3801E8A835E12AA22EDD7683C92CABC08AFF8E5DF7BCC13E4270B36F84B8B9C" + }, + { + "tcId": 2979, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C841240E195499D8BE79CA6F4288D52F", + "z": "208E6884D1C8327754670887C6BDBD7C76A8F4CE5A625BC5F49D664F", + "l": 1024, + "algorithmId": "04E657A9C0F9AEA9EAD83CB96626FD9C" + }, + "fixedInfoPartyU": { + "partyId": "7B732E73D33FF1B94271316C84DCBEE7" + }, + "fixedInfoPartyV": { + "partyId": "CC5D70CC9D1C50EDBC05918EDC1A4103" + }, + "dkm": "2F351AA710876D888949F6197EE3DAA747B50483B9BD991804C88CE628F6D95BE77315C3AB34A36E40F5D288B9315017AED415B820B6AAC542D7E1D595321A23BC995AA3FD346EE46BC0FA2ED9E374D7060E87644B2495A04D3EF606735EF15BEB9956B4770109CCA18AF6690101B957854DD785210690C6F50BB866737E4132" + }, + { + "tcId": 2980, + "kdfParameter": { + "kdfType": "oneStep", + "t": "444165877B9831CD8078E61929730F34", + "z": "BB46F6EDD223777790D3BE824989C1FD7D6ED56E76D847A765B6C8D4", + "l": 1024, + "algorithmId": "4788A26110D3F1CD2917EAED137666B8" + }, + "fixedInfoPartyU": { + "partyId": "43BBFD36EDA023EB993C8FB067A29B51" + }, + "fixedInfoPartyV": { + "partyId": "01B177E4A55DCDB092C8F94FA70B83FB", + "ephemeralData": "DFC200D5D9A202143A73F259DFBB7A5AE51E5F5EF0846DCC0633D224" + }, + "dkm": "28A4954F4900CFD121E451823E48F4206CF0A44A5BBEA5146F89E88D6CF661717D5D67F8EF823647E5C95513F24647373F5245B67B234CF1FAE61A03C24C702578E747704AB48BD37790C861386A30068B7507E016D026792C1B35702324DC0790BC88BE96628CC8C4D586245F0D251CDD38702FD59BF7F74641B5CEA67C5FC4" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 133, + "testType": "VAL", + "tests": [ + { + "tcId": 2981, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F04C7B0FE9D0F19CADE1EAB2FC85526", + "z": "B91D55BBEA6C5731AA86140FA984599B71185A6EFEF3680CB37032766457B6079D0B7C5D", + "l": 1024, + "algorithmId": "35D575367B64C0B21C56CEBAA0DFEEC8" + }, + "fixedInfoPartyU": { + "partyId": "56909E1CB0BD2BAD78B963FD6F2E3869", + "ephemeralData": "E1293B16C6928ED556E3FC0C9F3773A92C35953A4AB7F785C61F32AC30F28D61F7047492" + }, + "fixedInfoPartyV": { + "partyId": "09E266063427B19A30513F3BAA07C119", + "ephemeralData": "35EC6B89AC6F50AFD45A05062269F18A8D7831D5CE4AB058A01D5A9BAA65EB643C1E0629" + }, + "dkm": "C34343928863AD91336E302E9265F4436D7353450DB6BE91890B93330554E8EBB63684C2168878A6E5D332A0D07A64D985F2E5324328132403D404368FAA4E3FEA7D8911AABBAA30C6887DB303B9772FA9ADC591E6616E1625BCED2C7660C76A8E1092205C6C609BA2E5E39E6D577E31B9D7587D72FF9E15B237C9A35D25E117" + }, + { + "tcId": 2982, + "kdfParameter": { + "kdfType": "oneStep", + "t": "700DFF8CA42146819BD98C3D7DCBD44B", + "z": "E605300EAEDCE97146E3C6A2C856E55EB99352AB532BE2C8AE5700C7116EC80D8C9BC87C", + "l": 1024, + "algorithmId": "294476AE81A11CAE688E938C64627C54" + }, + "fixedInfoPartyU": { + "partyId": "39F9CE1A9FD32B353CB5BA66831BB7DA" + }, + "fixedInfoPartyV": { + "partyId": "DC979FA824DE9F27E446EAD371961254", + "ephemeralData": "0655D4C23B8B8C18D71A3E9ED4CD07756E1DBA42A2EFA32C44F37693192FA3531036F378" + }, + "dkm": "703D0BC4A17304CAE2BB9A014F105658E8137F301BEAC0CEA85F124768B6709CE62B9F315F7106C9CE51E92B57005B7C5AEF0331CE7036AE4072637A5816C71F4FC1C8159BE62959EC2733F7D5328BEEC6955436128AF84F560CBAE5C8F3679FF2B43A7C176F2EDF02945A32347A4386B5C77ADA8056B6AD5AC142A48CDDDA27" + }, + { + "tcId": 2983, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B707B64BCEF4C7DFBF2484E3DF28DF8E", + "z": "497031E04086E93C96CA70E923D74A7F80B02707528CA8A0A88E3FD130456FC3D6F5B6F9", + "l": 1024, + "algorithmId": "D442C304D2ABFD92DD5806B6508F31C5" + }, + "fixedInfoPartyU": { + "partyId": "289DAFAF4990541B3FC80C22B5F44C17", + "ephemeralData": "33880069EC623F283EB725F7ACEA77252EE32DB0A73BDA8C128C0BCD6710E86A666FC06D" + }, + "fixedInfoPartyV": { + "partyId": "81FFA1557A8E2D3B01544EE463AD007F" + }, + "dkm": "1004A7E958D2E7667DF96F3C97331B990EC631C46030B732AACA50EA4FE410BE7C8F4FB4396557935BBA206E10A294AC6E11FDE3FC739D3B9709D8D1FD81CB311FF9B8D47F5D6F98741A5D4B78ACCC41EF879E6004A4F9736CE73962BB106B6CD3DA45FF85128DD47A661A3328143CC43649AFCCF6CAB0552763F02D2524EE2D" + }, + { + "tcId": 2984, + "kdfParameter": { + "kdfType": "oneStep", + "t": "961772A46CDCF1DCDCC492D6ADA0A062", + "z": "89589DDE476BBF3071ADB1BC7078AF627DA38730A96BE7ED80EF1A3051E0B84632C5E8B4", + "l": 1024, + "algorithmId": "7BC47D710C34F5BA102B0D63898D8002" + }, + "fixedInfoPartyU": { + "partyId": "1D3C3285F4EF44A3BC7C4EBFA93591B7", + "ephemeralData": "6844784D83FDEBB8C277CCBC3313BDF9529EF2E28F50A2A7AF71216F0B9576557004349A" + }, + "fixedInfoPartyV": { + "partyId": "40A2659FA1FC0D0B2D509E9F1A611853", + "ephemeralData": "A282E5BC485223D6D0AF27E56C5BB28390C93BE75E2F61EE238353D3FE89B4D020DCD5CB" + }, + "dkm": "D9D67C76D047A6BB26AC8285FC67946F8EA8864BA86700B248E882A5F61FE2545E846BAFAEC6F8F9A7763A58434FA832CDC948BCA1BEC2580509BBDA01490B1927D1BD1655FD32CD2B4AA75588534AECE5B743A87570515EF72D3A4A8966B35E1F7568D6D1DF1EE7238C5690E94C2C684E46C8A69E0A5877710A6344154AB16F" + }, + { + "tcId": 2985, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E936228A283FA5E4BEF15768F5944728", + "z": "F691097130A2C17DD3E085E8CD5F5399E9C1B490AAFEB5D5D0D0E98FEA0FB9531C8310FE", + "l": 1024, + "algorithmId": "5F90A60790F2A8532CEABD78C444DA24" + }, + "fixedInfoPartyU": { + "partyId": "D59795A72EE920867F66AA376E0C7423" + }, + "fixedInfoPartyV": { + "partyId": "23CC5FA046CD6C3CD9CD33B5B1AB4F4D", + "ephemeralData": "7B0E9F0B1CC1E538983DFB953E406D45E6B923CFCD29E82CB19CC847DFECEFB253A81C86" + }, + "dkm": "DFBA245E8CAB498F681D6309DD8585127E033B1C96E2D1C37137A48161846C1D875AF7ACE818167B35126BF57CFFF076CA995CBB5D358406E047FF5AFAFDACA69A3B2F2CD036ACF7B93CBE4BFC151D18FFAD24CBF518D7AF49CF41ADAB353221BFEC64B437ECDE04824D37C0B4C97E4E569232B038158218E6C0D259BEE4C5C0" + }, + { + "tcId": 2986, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12A34C6073636CE51C6FA44DB32521D0", + "z": "5323898C52B06972A8A5396995DA12C47E6672759F85A7D88A2BB269446F3514E132C7C5", + "l": 1024, + "algorithmId": "003D361BE89B309F11DDD5148B56D83A" + }, + "fixedInfoPartyU": { + "partyId": "EDFEC3E63D44E4799B49E0B29AEB5C04" + }, + "fixedInfoPartyV": { + "partyId": "844EFDD80100D1C690DA779CEDB24E25" + }, + "dkm": "F12D495D2EF8015184AB0A8AA48DC0A456884A6E2C44BD1CA11354AD5150293E9D2366854684529CBCFE4B9C612D5578F444F437B13EC926B322FEEE1C4B3ACA300BABF653367F1274ECFA00C46FECDED15F8018A61A36D5267D994C775F1EB856A651914FCC04F8B852EC5410627BBB7968AB1B27DF01D06C687C06C76F8445" + }, + { + "tcId": 2987, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11950734285F5A3C92DFD3959093626C", + "z": "CD389A49C9BB625AEE558F6E186CACB7014610C1D4D79B5E4CE3264E58406FAD3F06FADA", + "l": 1024, + "algorithmId": "706F45BC74DEBDA1417CF7F000C7F6D2" + }, + "fixedInfoPartyU": { + "partyId": "58C3216D4B32B3CB3799E240BBE7E9AC", + "ephemeralData": "CCF16FB4917628770264331D3C2E1E20F47B9147EE93046D50A3198CED546E99C19C0036" + }, + "fixedInfoPartyV": { + "partyId": "8F255C9FAE5DE7F5C9B3CE937A12E366", + "ephemeralData": "645149E7021B63B5D63547656B5261007E6488C712FE9B12A26475520A65A45FD1170A63" + }, + "dkm": "378541A35B7CBEB33E7882ECC8414E8E08F5465EA84A87F0BC9672D96F82E2793D91211E789A0AEC53A6A44257E958DE5ABAC66008B7553A7F44A34A472223C03A23CB7920168DFF3589E50EFF3214CDC64C4E4731487457772FB1C3E1994CFB02A487A0F1E7F413ABB58C71D87021C0BB9756388F42A0113873B3926083BB99" + }, + { + "tcId": 2988, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A2EC04DE64B91AA2F1847025079E445F", + "z": "B6290B4818F59B7B752CC6F3C05830D2C0429C412D9AAA40EBCB8E1199C8952D086F27C2", + "l": 1024, + "algorithmId": "0031D7DDECAD341CD3003590CEB87731" + }, + "fixedInfoPartyU": { + "partyId": "42228C80F7B198A497F5057CCAD32867", + "ephemeralData": "3C1C56B378EFF534155A1CC13ACD4377C918C5E38035A3B399761D52686715AECE92CF2B" + }, + "fixedInfoPartyV": { + "partyId": "C69C767BF5F0FD7FE729616B13B9E897", + "ephemeralData": "0D3A6E2958BD99642CC3BBE51A165D050CFBE9F8865CE6FD2D5D3452BA910D5701E74979" + }, + "dkm": "8DC4FEA18B5E6B91796E6D8401B868747DD6249CDA924393B45A19EF4133C1CF80673040E7C5BEAF0D0779C2C70EEE758CA30DEB82493EC3A029D49374B6F3CE62AE3CF93E4D12B1BBEA43DA78F6D196D6C5906D4A2538BAC7F261D6EBE9D285248D0ED95EC4C91FDFA88CBB215417714175C8686E836673E418221A4DB9B2ED" + }, + { + "tcId": 2989, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BA660F71F4D18D212FD569977AD05BF", + "z": "F1BE80116B7DD87D86294E9A5004BFB65105BAA2DD1301B42B4CBA70ED67C7CFABBE1345", + "l": 1024, + "algorithmId": "6CAE1A0503CBB7CB75F8CB9FFC6097A6" + }, + "fixedInfoPartyU": { + "partyId": "3C7D7005D05DD109DF06C09DF89D035C", + "ephemeralData": "EBBC0F415B0D8159F1C84625B8F6B40D1C9F802243341AE13C976FE19D80106D0F869454" + }, + "fixedInfoPartyV": { + "partyId": "EFE38C28B728A26F50BB5A1CF2EEE238", + "ephemeralData": "C0217D1D9DCCC8111E8249A5F8B200AC913F0B495DD2FB3C6160448F4726EACD9EA04E1F" + }, + "dkm": "D208908DD1ECA0BBF9EED0466B484CEBFADCE379B6F1875DB006F3CD28B892F487F5BEC6E2E37B1926BDAC96F62FE65E6BDB8885188142AFB9BBB1B836B2CAA85C08A4EDB9304D01A3E7BD5B0DC05F829FB360CCAC2EACBB7ED81008364CBC3F24EA4ADD1F7E32E4CD7C1740E172BBAFA8D80179E7F056C3837D6C201C734C99" + }, + { + "tcId": 2990, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0D8F43355884B182C38D0A8CA3A2A8E", + "z": "FB908B09EF71AFC37A5728A89644030BF84A7D1C1DDE7B79CF9D9DA357F72EB8CCB1C22C", + "l": 1024, + "algorithmId": "4E9A55BEBC3CE2E3A4044BC66F54E067" + }, + "fixedInfoPartyU": { + "partyId": "B5396B6C9CB268330A26E2336096CEA3" + }, + "fixedInfoPartyV": { + "partyId": "EAEEC5AD2CF3947CD78F231A7D28A5DF", + "ephemeralData": "EBF189B2C4A385DE334DB78806AB887D67E52A45BB76570EBA7540633ADC28C5EAE74D79" + }, + "dkm": "BE7B4889CA4920E0430B32607A7D890792976845D12F50047A4D53B7DD5964EA43B84E8128BC53D6E7C232B24D6285EE799A95462EDD7EFA65A48C0DDCC0F1540C7F5C1A1DCF1328C6D51BFA9362BCF5163147507C30156F5882963646DC8D9243087DA402009D34F77D8EA5B92474804DD0C84F968DCA57005C7794DC6D85FA" + }, + { + "tcId": 2991, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6835D79782F30BC673B4D7516935E0C7", + "z": "C65D5F4BC4630728A4007B4B3E910CBA37A9C130359624B27ADE2FE7C7646FE709C73354", + "l": 1024, + "algorithmId": "3A366FF9B2C8819BFB8A1CB0C7EE0016" + }, + "fixedInfoPartyU": { + "partyId": "D652BD75A2C13AF922826E7C58522CA7" + }, + "fixedInfoPartyV": { + "partyId": "C6522E1ACBE09EBF6E6CBE89A248AEFE", + "ephemeralData": "4E2FA5DB6F0CDE56A1D0BCEAE56E1E2415B14C968CB56A2F5EBA10446F8A4CBB506E038E" + }, + "dkm": "02801198328BFE9DB2D6116C667972C3661838DC386EE16B794DBE174D156A271C0673F752B9B727A2A2D99469E346696309ACFCA66712AFDAD18DFA563CF1C109C2AC12FBEBE12A6F8D82064532185056C3F8E9DA53581933FD530E062561EB95ABECF7E6A32C2824B8B9265286E6C9199B5C1C32B3CA2C11910A2005F6C4CD" + }, + { + "tcId": 2992, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBF60BC2C96F1BADAD0A2791AA2A877F", + "z": "66D1E7916930B0425F74DF8DEC02CF5E1BCAF521B2E5302118E1330E55CF6BA54B96E2F8", + "l": 1024, + "algorithmId": "D3064748C9E28875F279B27A218C9714" + }, + "fixedInfoPartyU": { + "partyId": "CCA7BD357C8CF1465E9CD4B7132DBBB0", + "ephemeralData": "4BB62863088429F7529BA6A4338A63B6C766017F5F398677025D136FF6C6BDA9DF289CDB" + }, + "fixedInfoPartyV": { + "partyId": "BCB61D526BCE5B3EC0481C67FD0787A8", + "ephemeralData": "9D5EC6C872DA0030D848F5C91A996068FAF7B6EECF4F9F558F46FF7421023BF411778A05" + }, + "dkm": "9E45E5F4D97CB7E36B508DD07FA0B6B25813B40FD20B21FCAD2835C7ECC5572D2BCE7BCFD0CF615E6DE2E79F9E00FD2EB758A06701457FF14D88F6BE58BFA7A7EA821F41ACA1CE6F97A1715C738C6F3C8B8C0DF6103FF7C94E59904F9430703102AA338B250BC7D3C6A8A12F37FABDB94E17277D10F76B9268C99B61A45985B8" + }, + { + "tcId": 2993, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19C0B6525F99FE8877F7192CC95AF6BF", + "z": "31AC86425A018BB1E09090A53145A9C35096AFF5823679B7F051E22AA6898FDFC12C2C15", + "l": 1024, + "algorithmId": "6109BD5DC29F021154EA4ADE19079D4B" + }, + "fixedInfoPartyU": { + "partyId": "A36916C70EBF07C74A9FB36D30824891" + }, + "fixedInfoPartyV": { + "partyId": "CC31AEF6E19EF5A9FE4F1BFAE66C556F", + "ephemeralData": "BC26C2428E59D06800BEC432332D974B4031D23A5D219A1882D09E6AFB0A10E3652CADF0" + }, + "dkm": "CF90DC488253CD9E68B618591F1FEE44BEC684F91F17F69D8336ECCE16623FD5559503D33013104990BAE9015801A7C1C6451B2061A9DFEDAE4825645BB8B95A4E84D2E1F3D871E39C862F2211B6AA24DC2EA1E7B28D27948DC0BAA899E32EE45B7E69D6F99B8DD8E1CC71E454F9E50F29221555A42CCF6E23C8F9D8E1EC0E7B" + }, + { + "tcId": 2994, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCEFA010EEE5D3A4B550A476041F039D", + "z": "75D4623174B9EE0338270F288D597F6CC6EC3940BF10D6C0DCFBAE9EE6EE1D60D279F779", + "l": 1024, + "algorithmId": "B44D2B6C4D3F2014C9DDE90CCCC57832" + }, + "fixedInfoPartyU": { + "partyId": "D6AE26C3CEF573A9C766391480537BB1", + "ephemeralData": "F209C0E240DC75581AB4E4921933B16CE5C50D9B015DAB86F5AFE3B5F650A9EB9DFA6F28" + }, + "fixedInfoPartyV": { + "partyId": "1928CD98C822D1B7565F8903D1C6D7DA", + "ephemeralData": "79F157C24D8B82ECC1C061DD52E2E2F347C3276AA2C5136E063F9D36F5070BE13C7647F0" + }, + "dkm": "F4A45D2F48955F4AF74E26BF4E9C439EA58294243B0BF46F199FEA7FBEBD4A2C401493414B8B777D29E8ACDFAE38A73057EB2A4FA61D673FDB26A907A8728357F9D97A8E0496401FC17CFF955C8A61804551183F5C47F84833F49BDD3E610114792AFFF934A8063CD866BDF87CC071E1466D3BA7D38B25964E88DF8153B89796" + }, + { + "tcId": 2995, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DC3793D50763CD3D7084848579D822B", + "z": "A062392B77BB184763BAEC7FA4977ED88EB764C0EB5628354097F2112926BCDCAEA8382B", + "l": 1024, + "algorithmId": "BF6B4BD98E87EEF0F969BDA08DC387ED" + }, + "fixedInfoPartyU": { + "partyId": "D9908BE5AAA1C7B05646745C6EE2BDA3", + "ephemeralData": "C4F6B6E187BB7D0F4AB8F44137643248810248B5C5FC142037F8E2C202F02E03A1AC7535" + }, + "fixedInfoPartyV": { + "partyId": "432FE4A5B2901E4E92996CF28F9FFFB6" + }, + "dkm": "0051D5297DE1FF44CB0230BF71EB8CCA50549E9DA8B5BCCF0FFFC6ED6BAAB3954A731FDDE6292983F881386BB79D17EB52B614FE8B9906433707EA71174734A53FAD014CA45EF8F40F2D47AAAACC585F049487DC64BB71A407636D3891EBE7FA33E5B7CFED3B9F0F24927E6886CDF44A92C071572C9CB299F7565A3B7E86E886" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 134, + "testType": "VAL", + "tests": [ + { + "tcId": 2996, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98B1DC9D32F852A348A5711D7CFD5697", + "z": "779F8E9ADD2C25C475CFABB4DA6F1D6B519C07FF85CEE2FE683073FE93", + "l": 1024, + "algorithmId": "786674EE8B7C53E1CB2C70F232E3829E" + }, + "fixedInfoPartyU": { + "partyId": "6A1DF62E73990F3600F0F7E3A2052EF9" + }, + "fixedInfoPartyV": { + "partyId": "436FCE5247D8CE23E231E858893537F6", + "ephemeralData": "B81728C0BFD346A0EE6A56A4D5C208CE475B12A5A36F2D746DFA02D18C" + }, + "dkm": "C155F86AB9FA6433BBC3A5704E3C2EC349076DAA7E939B1042F562E9102E01B5C9422763F195B2AFA3C7F90BC7BF1AC240D44269965D54A9D6A6D1E1D05AE14317422FAE7C8026DA4BC4B08457CEEF8E7CB4EA9086FBA752367E062874F0DEF797DEFFF1069C42D73B12FE80D40749DB79A5D74962A0FB8F7D83DD3B58664EA2" + }, + { + "tcId": 2997, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A90D4BC7493EB9F4D613A3FA2613C5E", + "z": "2EAC11AC900EF7014B5C83D0DBDBA30BE42E28DA9BD71F1815F020A29E", + "l": 1024, + "algorithmId": "0FE5E3611557C640C4C3C198B1F9F249" + }, + "fixedInfoPartyU": { + "partyId": "1264078A1D45FAF4C2BF772D366B074F", + "ephemeralData": "3E3DD6E718E493B7F8BCD34CA97206686012AA9CDE3450EC98B8489468" + }, + "fixedInfoPartyV": { + "partyId": "14DA4E011A1BB675647C435DFC93FAC1" + }, + "dkm": "97AF0F024427BD3B5B9932AE5E6EA566D96C282D8EDD7F2BE9E264D3036357DBF09BFE6C25123C4D015C13259717F926F9F9AC556C1CF5246B8271CD44DE7C46A1AA740E1E375617EFBB0AF50722F96DE1271ACE2D5B4E490318F86E133C8E63073A21C229C6CF8A3B271DDC9E34B0B22C6258A801E5AF975D29A498FEC96F37" + }, + { + "tcId": 2998, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C832A818E144446D54A9D4BC6CBB06E", + "z": "364590F0BC4409D8874346A3497EC06E7E858C431AC65016779DF97A8D", + "l": 1024, + "algorithmId": "F0ED36530BB1B0FEFB3A4A8AD7C507E2" + }, + "fixedInfoPartyU": { + "partyId": "1107AC055F57794F3CD97E952DD479AC", + "ephemeralData": "E3EE29F942E6F0E958B7CA6E8F0A8586E1B470B59440E4DE449584D756" + }, + "fixedInfoPartyV": { + "partyId": "68C800ECEF9B67A1C1B99AF733012B81", + "ephemeralData": "C82E06EE49CCEBE9816F8A135DF5B44B539DE76C6C593D3E7555D2F26E" + }, + "dkm": "271FEDEF372AB32CBF559EB3917C88EF42D0880EFA79E8BD5D8B7242E2C7AD11774F905EC21DD88667665C4D924094D3D1026626F5A4819750F68C94A437CAF61BAA9CB179F306B631734D66A6E02B259237545A5BD00097F9882E6946050913C0005E8FEC776027E84F4BAB3201DCDEF8386DFBB804BDF154A63433F72CED05" + }, + { + "tcId": 2999, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3969500C4C09216C7D4EE6F99ACE80EF", + "z": "F8F3A14D74166947D167EE1BD9B75EE1A8A0D885F7A2B4FF1D23CD5D93", + "l": 1024, + "algorithmId": "30BD86FFCDE0972DB4B7FB26D05225D8" + }, + "fixedInfoPartyU": { + "partyId": "3AF39B380DB2483146D0F8A62EDDA76B" + }, + "fixedInfoPartyV": { + "partyId": "6ED912B54DDC5758BAC63E23209D74B9" + }, + "dkm": "D30580BEE6EF9BD55E5A9569D97F813C3E26EABF1E61255E91134D76A661A24625C82069D2814DC619ADF7B225EA80635719B4C8B18E087E1A37BD50C0563171021455BFD8A961CEE9552C7D1A1E8E9D52DC5AF301B8E8042F9197B5CD73399C086C3EC46E6DD076EA3C2F4D931495DB933FEA6CA557F6DDB21E9F5DDF3083BF" + }, + { + "tcId": 3000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48619A32EC093993F323CEDA60B7DE09", + "z": "AE4C2F12AE47D33F8D4ED8E68FD0FA91120CAC04B8CC1B2503FEE17FE7", + "l": 1024, + "algorithmId": "41A12E589A5698404CDDB785C306D115" + }, + "fixedInfoPartyU": { + "partyId": "22D5A7EAC3E33EA34DD9B30D36A619F1" + }, + "fixedInfoPartyV": { + "partyId": "CFF5F04F9AABA7BB12C14B5C383F01E0" + }, + "dkm": "D54BF313E7EE04D7F64C428D3039ED03A73F931C3163DCBDCC2E60115A5241FBF2F269885B104475859407921521A31A86B707805452F2D1329DC917D4736C7EE7DAA04AA97AA8243BE743E6B762342C3FA957A2E4A87C437EF5B2F529DB05C41FDB5A0BF864731F8AA9E97E21BB0764AE42F3DBA91068A947D44BBE0C10EA04" + }, + { + "tcId": 3001, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1688CEC6A5CAC541B48E09AC1C623D6", + "z": "5A516038F599F0A28C0E0F68EA9A20E79D936178FBD4A40D4ACBF9E49A", + "l": 1024, + "algorithmId": "E96520F6D08E9CCB2D79B6FEB5543E7A" + }, + "fixedInfoPartyU": { + "partyId": "7E21C5F17EC89F9A271236BC333F410E", + "ephemeralData": "8F47C84F730EB0E0602237ED7A53AC11D560F3F7445A7C8380C18C6D7E" + }, + "fixedInfoPartyV": { + "partyId": "1E3F77D8C2BD8E98C5F3BA401ACEDD9A" + }, + "dkm": "EB8E59CA4F8EB12525C75F03446A00B50EA5F5D9E4C02943CC9179A7969A6079B2CAA7A7AEA731A5120239308677E979F89C2AA80F7A5A689939B4A8A69330C9E2B387BA2548387C2A54D6F193EB9CCAC95A9A8E2875E36DEADF9887DB429BCB2293CD0DA35B85B5CFD98956734CEC67FBA5090C70C2664D15AA67380191533A" + }, + { + "tcId": 3002, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EAF6E9BC7C0E564618DC78D8B5646637", + "z": "632A2013D993EC781E0F0DD1A5D9838479143754CF69B42C7730F1891D", + "l": 1024, + "algorithmId": "64632DF7AAB3948BD8A47180672BB60C" + }, + "fixedInfoPartyU": { + "partyId": "4183E6FBB10BED333B6D8CC99DA21B27" + }, + "fixedInfoPartyV": { + "partyId": "8A0B64565D9DA4CBE7DBEAD634D2C29E" + }, + "dkm": "2A9672DE4F9563D959F05BF437E19E031D05D8459A5D3009081633E47E854FA42AABE3D5F233A0F37E6550D3EA31BAEEF740B6507B749F01745EB26D58CE968C885A4F28D03D78072DD4A186B0840E819356B8FD1200740581289FED9D9F256177A6D357B7AD5F53D98CA36035745B27145E439032C0F3599D6F1BA8ABD89FE5" + }, + { + "tcId": 3003, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B54BAA5E37C728C10941C6EBC7BA4F5", + "z": "8CD9EEA5F1A678603592ABAB7DE94FFFA43DC5243170E7F33AC00F37BF", + "l": 1024, + "algorithmId": "B3370ADCC2A279FC9952084C7BB585C3" + }, + "fixedInfoPartyU": { + "partyId": "574A8A0ABD027877FBA503962541F46E" + }, + "fixedInfoPartyV": { + "partyId": "0D0495CE68BE5FD5C10EFA6592228D6B", + "ephemeralData": "93E6A3C16432F908FAB760399B4F2DD62BD5A93206EEAAFC0E178330C3" + }, + "dkm": "46C1AF58CAEC488CDC1CEBB89F15A399C63B3B1FC714E5B584BCDDA2F52E137C0B537D198F2E4B62CFD0CAF11F165AE68CE27E9B06A594053B197BD7E3012CC0510D9CFC0B5B40F20C6F934312A27F34F9B5E0DE8195653A6D4534973C2531F2A62A41D1EEAEFCC7D967072CDC92353A1C2D39B8B5C6B53981CD8292D23CD9A8" + }, + { + "tcId": 3004, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1939A9A571AB344ABB0E7A4508FBC25C", + "z": "DB694F40FD09EE1BD9FFA0B1D17E86BE4991B7A378F61551F624F6EAB8", + "l": 1024, + "algorithmId": "42FA51B9DE3398AAC994879D99FB0B83" + }, + "fixedInfoPartyU": { + "partyId": "C2A29005AD0B4CD65BCE25195F012323" + }, + "fixedInfoPartyV": { + "partyId": "AC02B627EDFC9C3F3A09F49F2DAE8C72" + }, + "dkm": "6591863BF786B8C81AF49C563A439BC8CE2F432C7FC11ED622D23BD5A052ED4D25C60B332F59A965EDD8565953D98986931B9566A0A2DB723338A165601B405691E9393B4B3794B66EDA0BFB307BA80165D625699D8D771A6CACBA41F142443CCCCD151F96F8A7E14B409FEA80DD34A5DDBD963DDE95839AE90FE7445EF74AD3" + }, + { + "tcId": 3005, + "kdfParameter": { + "kdfType": "oneStep", + "t": "92477845134C335AA2BE9AF6B36AD8A9", + "z": "B34BAFD67BAB5399BA4690E87152A75F6D20AF6123B5DF3A1DC119BB14", + "l": 1024, + "algorithmId": "5855429B2F411A8A518EFF7F09783A45" + }, + "fixedInfoPartyU": { + "partyId": "EA948FB4F96E3B9328DF1AAFD2110B7A" + }, + "fixedInfoPartyV": { + "partyId": "938B47456E677AD701E85DA1FA8CFA35" + }, + "dkm": "821950017E3915A26DE4E5B2132371B27AF516211DA3DF8C2FD4FBC59CE99388241F795976070A2383A04DFC869ABB4A26F9192B12DBB2C3777BF120D7B68AC605AE3CEE5DA4D361D2609E4396FFB6C0EEBB7E4DFF987E0437DB6BC0B307BA46C764B13A040A24F465A41CFA51CE4783805375791189F11AEBD44AB9728F57E5" + }, + { + "tcId": 3006, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6420D0EC4A2B949484ED9FDF91324566", + "z": "5887029AF83CA3645D4BFCE45445D57E8D1355E69876A7A1E4303DCC58", + "l": 1024, + "algorithmId": "DE761482CC0F2A13A383B960DD5DF404" + }, + "fixedInfoPartyU": { + "partyId": "1F5B00C6FA75F1DE846CA8AA0A42B738" + }, + "fixedInfoPartyV": { + "partyId": "7FA814912BE5A510110613D430804BF4" + }, + "dkm": "096EBCD34A3F37A655D8B2399CFFC4593E6C5F90BBFF0B70D1757B1F915F75273AA9E5E3C1740A455E3D3A1E9F770FCE96613838C776B6EF99071EB96CAEFE70A584FFA87AF4351253AC5C75D542026B9537B9C88E8B816AD5A9F08B94B9928FC01C92871691A90AF37C22008D3BD7E885E29989DEAB3B6A3A3801F7A61C603B" + }, + { + "tcId": 3007, + "kdfParameter": { + "kdfType": "oneStep", + "t": "701F512C8AD3A97D57AE11145499A7D1", + "z": "149C3EA2452859CB21B3AA442900BFD1D39D85974F264888064775FF45", + "l": 1024, + "algorithmId": "A672E8824BE4BF81E903E745BCF9F33A" + }, + "fixedInfoPartyU": { + "partyId": "8C7C05725F499F2A73830673A030BC78" + }, + "fixedInfoPartyV": { + "partyId": "AC4963024DA57A4E6CA7E761D2EAAB83" + }, + "dkm": "0DE8F6A188E4635D97C0FF40FF31DA345335EE559B4747075268E47897E63C3E260A1A4AA47CB2DF21A4640516EDF7894859F6927F4132897F599C0B8A5BACFEDA103E97099BECF5EECB7410FF162FFDA55FBE4F5123A96EE1FE31299E533B65832BA238476B2C86F7FA5791EF3761594AD7CB60565E12218FC2273DE2D5E386" + }, + { + "tcId": 3008, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D17CBCE3BA580E74F192BBD7728D8DFF", + "z": "0E8DAA69200BAF2D45BB23E50F3F1290D3ADA5BC25F0F62B3D7F544FDF", + "l": 1024, + "algorithmId": "D421C80CABBB7BC5BB75679C1F5BB2C7" + }, + "fixedInfoPartyU": { + "partyId": "161A4D9C97D397A273BDCCEAFF08D8BA", + "ephemeralData": "23504E6DCB55C4E9AE9DE46BE16880D35F48A0B28CC199FDAB19FBE41E" + }, + "fixedInfoPartyV": { + "partyId": "1D195E3E6FDB0FF592C64A3BF594E0A8" + }, + "dkm": "5D93E1E5D624975DD095501C8414E3651481B06972BEB3D71274319C28ADA904BC8A25BB141C31BBBA3FBD46D4972CD8E55FD4B8E20628937AE39147C6E37A9488CF427C3E6A724EC5FDFA236FFD81BBFD392016CD89CD3C8A398CE3CACC7FD12CAFCF025139C09CB993CCE818037BE6CB941E412E3CBE7C7BF9F25B54BA94CD" + }, + { + "tcId": 3009, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D228E03518838A5EE860B2A16FF756CD", + "z": "27D895C37124D581615F02FBDFB636B32A201F7761D9E695981850D22E", + "l": 1024, + "algorithmId": "F3007587BCE5304B6BB9AA62F4ACD1D7" + }, + "fixedInfoPartyU": { + "partyId": "932A0E1E70375AE725B58E12086B36A0", + "ephemeralData": "EFCAA1F89180251718B341C0B20EFFD4A72BFDAC71C9DE3A38CC54AABD" + }, + "fixedInfoPartyV": { + "partyId": "B8E2A13F8DFB675A83EB063190AA7242", + "ephemeralData": "264558578A14CE759B52392FD91399403BD385A627DFE84E6C6137853F" + }, + "dkm": "083C866D29E5CCAE993AB3CBEA83089C442B181881738F3580F4602CF53BA09AEA50EF732370565ABD3DC1B631BA8AA494193A98607BD124269A17971CD1308C7FFE1328664C8E31F5EB59D68418EE2687643419CB8F61061DFCA0F7979A45AAF0868A2AACEAD11BFBD2B27F8751F27505CE5D36F4A0D3D2CEA57296847F3CA9" + }, + { + "tcId": 3010, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0EBC216F6CA8D692C1EDD7E72A90101", + "z": "1283FC3BA9E7FE73C76E779C50C7AA658C3237D943FB99E061F39FB385", + "l": 1024, + "algorithmId": "140012E2A8389445EFA3DC116568C7C5" + }, + "fixedInfoPartyU": { + "partyId": "A6A42EAD6821B30C732E2258A883D8AD", + "ephemeralData": "0656E943537B423489B40096E915E42549B7B412187C4A79A503E304A0" + }, + "fixedInfoPartyV": { + "partyId": "7A10402B385E080F9FF89BBD4159451A" + }, + "dkm": "D54502A65E0ED463A2A5E58EED875305A960F51744595B6931F72D5A2A55997AAA55CFAE93CFBECA6CB41F41B3491DD93A916AB103F931C51ED944A8D2D9BE468E13E59DE1B76DD304266AC5D512F1EB9C73BF4B29688115BAF7483FB8270C1DD58EB1E81067566C13720E6D11C6483546D46E33F87DB6CA6E2C59228CEFEC97" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 135, + "testType": "VAL", + "tests": [ + { + "tcId": 3011, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D64BCE9DFAD7ECA8BEF50D4929728AB", + "z": "21260C27E65B95D0772FD8170F22BFBDE98F2FFB5C73DD4728D91A442D2F77", + "l": 1024, + "algorithmId": "D52F08F2886DC83B0B06BAA6B0E68521" + }, + "fixedInfoPartyU": { + "partyId": "5CF3F461B54FFFD2BBEBDAC21020637F" + }, + "fixedInfoPartyV": { + "partyId": "B63B00F3BFAE5CB848754DADC720F095" + }, + "dkm": "5331CFC5056AE853685EB7D0D0DA2053965112927C61CFD7666509E6DF47E3051D2C61D61B16D4A97837001241C2EE232088953ACCB9B64576EE0BD1CCCF41C7C3349EEAB70677DD45D294654CB8F20359CD3739A99308AC4F7E607B4D3BFC85EF8D44AEE00C28170DA4F16D782A5A2EFE12D6C169A168ABA630806AB6508B24" + }, + { + "tcId": 3012, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85377EF246075BBA05866358082D84B1", + "z": "4135EC31F3B274EDF8539D44E4D67F7390A19836CCC202F8914CBCE7CBDA2F", + "l": 1024, + "algorithmId": "30087A317BDB99E5347CF38DAEB8FA51" + }, + "fixedInfoPartyU": { + "partyId": "6D5096960535F3647321AE564C566166", + "ephemeralData": "57624E67517F625EC43A5541D46580CD0B5F590A73DEE2DCE7F39A1BC794CA" + }, + "fixedInfoPartyV": { + "partyId": "0B69ADD0746F6E6ECC266E5866DA4423", + "ephemeralData": "B1F4C6E5D265995A5FB3F97EC54F867F8D80A21AB969CF90C32B7B30153729" + }, + "dkm": "E76AFF06976C8380BF11EFE07C408377F71BA0D9E1BA25559654987F034FCFDE5E0D34ED5D91F3F087F217ED11C938324C77A829B1D75460BEAC2A50A5A8542977C480F1319DDB0BE35049623BCCD7CD298BF5F5D17CBCF6AE96153A7DD88C4CD2ABE6E7697DB71AA0425A1890B212204921E3C208CDE1C704E6CECCA3A06239" + }, + { + "tcId": 3013, + "kdfParameter": { + "kdfType": "oneStep", + "t": "720B0AF738592B7F312E742FD0877E5B", + "z": "5F41FB87EB02E886EDD9A1910EB692FA4493798E15F64B7FFDD3C8B515B4A8", + "l": 1024, + "algorithmId": "5F05F86FC7F6D0DD567955B26B3316FB" + }, + "fixedInfoPartyU": { + "partyId": "B7A05F39850880889750E2BA1E83C4D2" + }, + "fixedInfoPartyV": { + "partyId": "0A8476E7C6CC8EC7CFD07AFB41A55FE7" + }, + "dkm": "C36C2120C6247D2FC149A0D734BD0C1443114F4453DB0D35A29D22FBE798E42664D5D83C32AADAC78268BAC7647504F901F96C9950F1358C13FE32AE3401C62C9FFFA4B36375071B0D9FDA5E667695945398C67DD4FBF53E384D9B79437EFFB2C0433E8CD1BC4B6AAEC8E87AFA976BC49991EC0CCC26AEC1B6E47D002E844AA9" + }, + { + "tcId": 3014, + "kdfParameter": { + "kdfType": "oneStep", + "t": "891188F742770D10EF18C9A488D08931", + "z": "6269288E8740643BDE2605003AB4B0FDEFA6836B83A528DB461BC6F0BEE7FA", + "l": 1024, + "algorithmId": "D0BEF72CA0FDD1CD45B611F5A75FAE9D" + }, + "fixedInfoPartyU": { + "partyId": "4B8FBA0A7E982634026E5AFFEF74C045", + "ephemeralData": "1991A125B473B917FA98ED2FC8CA4C969E7A645EBAC98F91CC37DF3CBC2274" + }, + "fixedInfoPartyV": { + "partyId": "D0A3B491705EA8886510B77774632305" + }, + "dkm": "4BD117B34F4165E0332DE4B4262B40A57C8E44A0A6D63C94E05B59463260C0F574E4D6A6022F2F5AFF4BEC1C0B2D37A2B6B2EE5DBFD023DF5AEEF140DDECFB427A0B52F30BF834DFBB374A4EFD57412F8E373467F58CF14B79E6FD253142BA82583E603DD854D1A65F7AF9557CF8AB9EB9B735F2D9826BE3F6E9A54782D771EC" + }, + { + "tcId": 3015, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EFE82EE5E15D985BCE73F74D9A1AECA", + "z": "63DE4B5E67486835FC4BD70B1EB74A2371DDD588C8D5516AA6BD5968759087", + "l": 1024, + "algorithmId": "BCC74E234CFCE9FF513C6138ED055075" + }, + "fixedInfoPartyU": { + "partyId": "E65F779E8837080C635FD893C4CEEA7D" + }, + "fixedInfoPartyV": { + "partyId": "721E475510FF3F943C57F3633614F167" + }, + "dkm": "79C47B125D1E2AAC9F5405980E8A76FC3F8B350B68D1A3222A9BB2EDD578DD8D68B2DA2FA845B9246ECA1A5184F76FA8CEDC81335A5CB1B21FF14797DADC0C212A37E12D40F6EC6BA19B9F8F4EEA8536DEF87D8B01D6528D85330222FB14B6315474DCDF382C42FE13EC9DAF33A751CC341875A4CA2AD37A64DD4249765862E8" + }, + { + "tcId": 3016, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99285599B07B3BACBB2C96487FB00413", + "z": "5C5442574BC351F6A040493E017B43E4066C26CC0340A0D797D511F337BBF2", + "l": 1024, + "algorithmId": "7B415F5C36BF08E9F605BD93F87F7E8C" + }, + "fixedInfoPartyU": { + "partyId": "94609308DFD96C3E694D28A14426E093" + }, + "fixedInfoPartyV": { + "partyId": "4C943F894DA2411BB150E9541E6C9634", + "ephemeralData": "2DB41BABE68692D6F73F3DE7AC230B2FF16398616FD2C311F6BC652800EB6F" + }, + "dkm": "C45CA176B45F6F2C833C0AA19C4130006D0637E2B19E5AB3F7D56E48861C37941EF39C1C97CE3B0C24A2735967F716602C50BA00A02CF7B4D83A8F8A73515ED8C40EB16B0D443059BBD69BBE5D384ADDC63237D077554C662FA4D4CC5923C76C3EA0317CAD51063CF641DE2805DD29AD00B53C67B5CD92FD9EF9E2266AD675EB" + }, + { + "tcId": 3017, + "kdfParameter": { + "kdfType": "oneStep", + "t": "597B5D7B4DA7A8341D34CED1C681D232", + "z": "C52BCEC97C4B9F59DEA88F390D69213CCD842F4270C700514D88B63E900F54", + "l": 1024, + "algorithmId": "E215BDC455741EF041797571B169D428" + }, + "fixedInfoPartyU": { + "partyId": "EEF25E0AC52F85AA2BD72CB4001BA293" + }, + "fixedInfoPartyV": { + "partyId": "D583840B6A9E3731ACC9424F122C6ADA", + "ephemeralData": "009EC138F58354516043B3FF63EECC5DACFBD4E260B4633D4A10198313A0DC" + }, + "dkm": "727AB16CDC555035E39712D87AEC5E067D9D5BEC6CF157A7FC28490DC506080096235BECC898B867DCFCE09DA4A9CE99E791F5E456D223FD5A617F06D278F9912C3AA30B3515149F165D7036D224325D9BD39AE95500280ABB04A82508CF958F1FBA334C670AE83B20096643F91B755F4B31514D5415957A35D1EC1C588B96B4" + }, + { + "tcId": 3018, + "kdfParameter": { + "kdfType": "oneStep", + "t": "464A28FE8A26DC4D9A3F9371D8E25AB9", + "z": "D0F298FC6DB5EC9C68169BA81D1B91CF36AC5C75C4ABA8454FFA66506AF13B", + "l": 1024, + "algorithmId": "45C1F65527D31DAD19CE2E72A433C1A2" + }, + "fixedInfoPartyU": { + "partyId": "FFE344893BC534CA9B2A8E875C8DD285", + "ephemeralData": "CAB549010E24C748DE48670D8AC9CD581490980F16588F457E08399B17B80C" + }, + "fixedInfoPartyV": { + "partyId": "328B1336F7170EC94B7F2B4F89CD9A9E", + "ephemeralData": "35A85150FFC07E4E2CC507CA75788DD9FC7DFA15D3CFD9C421F1587BBBE2B1" + }, + "dkm": "681651CA4890715831AB85EEE965D0F9AFB19909F6B41E32EFB0338B48568A5D1E0C041B88A02283DD1D951E677C8D77C5EEBB241802E68F3D52E4EBDAA3288BE1C7D3A0A3B032CBDFF78C7EC644AAB69EECD3268FBAF026FE10FECF4FD21B1D9C4F3999F789AF8F622781C5E17C9166DFD7BCF49114A1901A585907F15E47B7" + }, + { + "tcId": 3019, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A15BFCEF8F31A4992D4336932FBEF29", + "z": "AEC7D2401A5B201F0E69A9CB55AE3BF2ADFDBBE536CC6E13B0986FC7B07E45", + "l": 1024, + "algorithmId": "A4B43162DBC745E47DBFC65A63EEF452" + }, + "fixedInfoPartyU": { + "partyId": "D6EFFC9DC4E73E9134EC81E4965C3025", + "ephemeralData": "2371A5C18DC3794E71C8675EB4111EA740707D13A7906FDBC04A6920BD006D" + }, + "fixedInfoPartyV": { + "partyId": "132144F075BB9CE6BB8D09D2D2CE8430", + "ephemeralData": "0A8053ABC2CE56909D6E9EAE8E766DFD35FEBDA5A76E8FA4E4783AEA7E1CA7" + }, + "dkm": "8105D9B8DEA5DCEF7C39A25B063890895B7F92A90A531EDE10212AFCB1E6949F8E0728DB5F0A980D1D2904FAA403C2BF71E4C73FDBD8193981A4F925D3A408FD380C648D329483BDBEFB97A06B6C027D2336DF89333AA93373B8DB6F854A1919E8014114D00EBEBC0FA6FBF9363CC428D39356446F8C23A66BC120A8130B5B58" + }, + { + "tcId": 3020, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A58B4F2BA31CDAC64C52D4AF3CBA706A", + "z": "0910A6AEF7F80A93EBD860BDF7DB6FE8894FAEBB02DE09A2B762E912AD0D20", + "l": 1024, + "algorithmId": "16069AB345AB54D435B3C288BE445D68" + }, + "fixedInfoPartyU": { + "partyId": "9D97D2D03217B8072DF4ECA62405C884" + }, + "fixedInfoPartyV": { + "partyId": "F9FC086BF10719214745CE5850333351", + "ephemeralData": "AF9C3CEDD384DDC0FA2CB8DD735D805B73C11AA64804EFAE7AFBE22BA8F27D" + }, + "dkm": "C3931F44AEDED4B421350364468D763C809ED819BC4A7F83CF83B93F5CF8902903FCB78AE5D7CA7B36DCF2458F91D86F029A778F49AA26F425F70C38120A3753DE61B14BC52F19A29618DD81DEEBFE6885DED1D23EB4A9162ED9412A3967030369C52716C6704C87F6662165DC0E9D36A613EF93201D0DB1A5B3C2782E640FB8" + }, + { + "tcId": 3021, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7410CA88984DC5B72CBA9D75EF78D93C", + "z": "2EF0A7BE1612307825FABEE6F187B3F0B6C0971A299DE7CE7275D266B61FCC", + "l": 1024, + "algorithmId": "979227A44EC5F3E2B789F584CD3EEA16" + }, + "fixedInfoPartyU": { + "partyId": "949F74D707AA67C6C42B70848151E318", + "ephemeralData": "044DF3147F2AC2887F313E4636106FF727B35EC0363DFAD1B529D901E55C0F" + }, + "fixedInfoPartyV": { + "partyId": "6804F5338AAF9BBA3E2C0B4AAF1E7E90", + "ephemeralData": "924CA68EAA7CD143EBDC043F42A538ACDEA0AAAF3F5DDDDDB84E6863671083" + }, + "dkm": "075A4BB6047DD3C67F0DC1314DF6018C56B8087BBFED4E74DCAB5AD1C2AB7E07A0C25B45E913D041F5DE03D07CF66B1DDCBC0C7F814870D3EB9B0A9A9FC9DB9A915E283ED8F8C17A51AB54D6492D653FD2D0CA119E0A5D738C6A4AACAC619BEFD6A3DC1B988F6D4488F5A40B6C4A9189A4F9CE4EE07F6E83A6B739E47CE6CE65" + }, + { + "tcId": 3022, + "kdfParameter": { + "kdfType": "oneStep", + "t": "068971113EEA6A53501C99E09B3703D1", + "z": "340C3076DE446B36FA6A0FAC78DF87CABC1F66EC88C0A9C38BDD9758C4C08A", + "l": 1024, + "algorithmId": "8A4A1C69225BC218464B1BE1319588D0" + }, + "fixedInfoPartyU": { + "partyId": "EA2F1020F27378F4F3F157A8975439A7" + }, + "fixedInfoPartyV": { + "partyId": "9C9314FF52EC8DC61FF6DCF832B720AD", + "ephemeralData": "63F5A005CAE2785D5DAE015510C8AA5A3B26D9789C3483EB9572138712B2E1" + }, + "dkm": "20602597CBD177C4CD58DC5CF4C29A1D38603C2508BD21A49F9D8389CDF11224825861444A5A5CE1AB975DB4D5AFC1727E78F1BE2465F9FABD0AE1E2DAB51EB45D5EAE29C6BB6175946425F8FC759CAF40F37E31CEB764A147DA77CD01BFFAC793CE1B59349AF6A5EAF3F5FF54F26B49790BAE7DECD9BF382EE512AA265AD2A7" + }, + { + "tcId": 3023, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DCBA9F79143B36C6C69C8051F0D3D4F", + "z": "2AF73B80F14A71258623E327BCA6FABF1283639AD1D89780ADD373A224D94F", + "l": 1024, + "algorithmId": "CDBF2D6510A9946422887F335EB7DBED" + }, + "fixedInfoPartyU": { + "partyId": "09CFF72D888D8F7B5A1D088CC05CC8BB" + }, + "fixedInfoPartyV": { + "partyId": "A0442DE12831FF522C69A4EC509684A1" + }, + "dkm": "A84060232C9E1FC4F353D554E44FDCA759B9DC46E89A49509A9A6AF1750D17BB66CD24AF506B4F2275315FE36C6CC947489780D2FA5F513A608B67D06B2A2F71D90A63C13DC921EE39ABD41D63F12E5FDD2C4A7860F02540326FB47A2AF6A203C90C6CEFFD21A13BFCC92879A787A1A3DED06E463C38B499AF9EA3D5878A7FF0" + }, + { + "tcId": 3024, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEE75311E36A4F19EF7C0504522D0DC3", + "z": "22C5BC0185A390B3EB44D7D5015D881C8C371C25292E7ABC468ED29ED87595", + "l": 1024, + "algorithmId": "4D26D7055031D6E834A927519F920CB9" + }, + "fixedInfoPartyU": { + "partyId": "D256DCD5D870C7347B87FE90BB63EE94" + }, + "fixedInfoPartyV": { + "partyId": "B40044092E0D258950F61252B45A4EC3", + "ephemeralData": "822A4C79D8066B6CDC426E6B6D3DA3D03AD6156C660DCDE2011DFB7BB93694" + }, + "dkm": "0AF6BC8E8DD54F83FB7621371DDAA10B91029F66EE0E456A7E6F40E0847E7F3EBCE42DB5731FCFC88C8601850375633062C4877D72EC6171C6AF433C2B6C693453ADDA1B7D43F23144A8220CFC3F30702629D1471E2A7140CF7E5B55B00C1E74665F9C36565F47C9FBD42A9EC5B018DDC8BE80CA0F63870CCBE13B78E14BBFB9" + }, + { + "tcId": 3025, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6BC7F89FE72562010427DCE47933F2D9", + "z": "14C6112A93D1188F401BEC5EEED524DA2FDC49233DE292D3D5CA96D99C6D01", + "l": 1024, + "algorithmId": "2A78C9B58B9E39CEB4AD368C95D63F6C" + }, + "fixedInfoPartyU": { + "partyId": "BB049E02E65F1D0E949F2C47893271D6", + "ephemeralData": "F03D358C41DF4085AEE85216B167CDCCC2AB37C4C10D2DE57F680ACAC34A32" + }, + "fixedInfoPartyV": { + "partyId": "D7D0DD1F1AA3B308CB4903C6F76E1614" + }, + "dkm": "043F6B2751F8942598A5CA7818AAC314F8E6090C287CA212A7C63060583D057626C9BD499B8132BCC3C9F4BCF078DE772D8CF4F3231180394F400CE8C81F0CFA60DFC482B4BEF43BCA0D9C0A7663DEDF5311111F77BC5CEE4E2E7D2C170DD56BAD3744A475D560DBA822B23EECF2E58A21912779EF774526BA1E49E94214BA46" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 136, + "testType": "VAL", + "tests": [ + { + "tcId": 3026, + "kdfParameter": { + "kdfType": "oneStep", + "t": "035F17CD26254725DF5DA6F9002DC878", + "z": "3DA2803B1772404C5227490E72F26A40F9C6EBC6FE114DD340C4906D2726", + "l": 1024, + "algorithmId": "77FF135E91A855345663C8C761F7CFE7" + }, + "fixedInfoPartyU": { + "partyId": "72E0FBEEDFF537B36FA6366BA4F51C89" + }, + "fixedInfoPartyV": { + "partyId": "AA5205AC1D2CDAD3DC15095B33BB072B" + }, + "dkm": "1797F1B3BE94659ED5E10F4F0B3B29661F5A1C481376A957AED625DDC0B3480B62C40829ED92E2E963C1D7E0D5C86794D534F24B9E68533742BFF23B2B3CC6FE1E586311371021C0CF87F3BD5BE5810EE21671AEC55D7917AD88F20B94B6211007F9A35B666268E5D7160F860D31ED0F44FC336BEF3BD26930FF8FF81D3F879A" + }, + { + "tcId": 3027, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CB0EB1123A3E6D393D21D8142EB9721", + "z": "CF05590419440A2265F3326A1289B3A1AEBF36FD23643A8B80A5B627D49B", + "l": 1024, + "algorithmId": "CAB2A7E32ACF6F2F6E1729FCD0E839F3" + }, + "fixedInfoPartyU": { + "partyId": "CF2D658246AA606182BD470062BE435D", + "ephemeralData": "0EB932EEF835743E37FB44ACBFCC1ED6C512C914A4986DD39CB76B72619C" + }, + "fixedInfoPartyV": { + "partyId": "B9A8A267F5EBA7A58814B45F1F97A992" + }, + "dkm": "9B67B9F9EFD5AF1D21EAAB554C8578362037131487DCB93CFC9007966B935D31295B15591C0C499F35A55241DDD5821A09B5A9A0336C58F2EBE1F4751FBC03BB773D0F60A01B6D6A21427A514834B065C0CB20C4CCCA2859171D96A4EB0F6F978C310F2CB137BADECA9A20B20D3DC49522C15064A1557559174A697518C696E7" + }, + { + "tcId": 3028, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2023C2F22947786C59165C57E97C6D44", + "z": "F1C207777F1263FF7BD2315199C74FA2D48CAD204F55CED1051A220352AC", + "l": 1024, + "algorithmId": "6A26C2582A8C78A0541B097FE4D929BF" + }, + "fixedInfoPartyU": { + "partyId": "693B0894AD9B3E4F04BE057E6B55DD61", + "ephemeralData": "E624951249C2919C56205743ED630CCA8D9B0FA052314DF2705962F8D597" + }, + "fixedInfoPartyV": { + "partyId": "F51DB24C1E626C088ECA31E0B1A927F6" + }, + "dkm": "48C5171409747F04B8374918DE9154184AA8AB1CF271A813C477299AC2274D98987577DA518AFFE100371B572F7502E2841F4AE4989053D8F1B7A9898686614C77327F3585AE391E130B7F9FCB0F35348B77782091FA3975F4E48596FC2BDA1D05F0EB1C15E5A9DDF502F17F7DA004918529EF4CEF8C6300C3C7DF98201BEAD4" + }, + { + "tcId": 3029, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3063E5FA592DFB975BF4F4EAB6AF8518", + "z": "B8774247AA8694A2382D511C1B959DF3696365BEEC6440CE76584538A2FB", + "l": 1024, + "algorithmId": "701B80617487A5FA9D12A43DDF067A88" + }, + "fixedInfoPartyU": { + "partyId": "8E35FD526EB6A117D548BE79574115A3", + "ephemeralData": "E5BF9A7B03C05535F00C23A949ABC88C2FAEBFA300C20211C8DEC38F072D" + }, + "fixedInfoPartyV": { + "partyId": "16A4BDB6542F4CC4F5E83A19B3F75FA4", + "ephemeralData": "39B7F45C84B5DF5115FAC7445CDD43774DDB0339D13DEB6A8CB4A7A62A72" + }, + "dkm": "E51A1EA6B19A85DF7BE13F463667AA04A66699A752E6A845C62C4BAC7A7A3ECA3223C03CFD9B389C1A3980CC3A650E76BAEAAC231BF24A7A629E73425B7D003A5B20C456B27C1FAD4CF54473D2F85C0D7942E263BAA240CBF35E9220CD24CBF19FB1B7EB6A30243563702CD79BB68C7EB881441E4F94A05ECEB7298FF2AF5383" + }, + { + "tcId": 3030, + "kdfParameter": { + "kdfType": "oneStep", + "t": "762140864FA77917FD7C43E7054F0351", + "z": "644EA168C3495F427E407F84E75255C86B0AABC3BBE2C7F5D22AFD25CF9B", + "l": 1024, + "algorithmId": "6534F68FAE9253F699B3F51A80C1C6A2" + }, + "fixedInfoPartyU": { + "partyId": "D17F2C23880D7F3B36D0C0121B31B512", + "ephemeralData": "5BB87105AC1C840858EE790EA87E78546A66B4C68C1C36A2BC9EFC52B1AC" + }, + "fixedInfoPartyV": { + "partyId": "810933F6E58FF97467FCEFBCD077DF16" + }, + "dkm": "9CACE6E0C89138F9C4ADB3F994F6389A4843035625D318C81021E954E238327B5AB8E4B9E970A687891F7A6C4788037AC27CB012EBD10D08994727F59875C67E230B15CE99A568EA27404115729DC5439AC8B3A1A51E213D836D0F432A16B8D1A4627B43E43D8657641E6EC118B1822C1E990171119B0270B2C1F902BF6A1943" + }, + { + "tcId": 3031, + "kdfParameter": { + "kdfType": "oneStep", + "t": "753BD70C6F19A28A815575D1DEB7287E", + "z": "17D2BAA61E3682984DDD5C6678B5396DEC02B1A209AC0DFDB1E3729A930B", + "l": 1024, + "algorithmId": "520DEC7A05459BEE6A87EB5C30A08CF7" + }, + "fixedInfoPartyU": { + "partyId": "A3D2C832A92BCD6E9A51E6F9D05F175D" + }, + "fixedInfoPartyV": { + "partyId": "3B420AC43B18FABE98DE7093BAE0349E" + }, + "dkm": "96A3FA2D603B23F7C7EC4F9825721CAF7443A467E890D5DDEA5DBA5C0A441C175B69CB529819237C7D908D8319B40F805920AB91AD0ACFF574E505B8CB79D720B3201DE9F86C3306F015F036ACBE7065899EDC53ADD86790195B04DC7E4B8CB846445081AFD442EEA1CFDCBE2D2C2EC52529C2B4F5CFCB054E8E285E50142B36" + }, + { + "tcId": 3032, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9029818D2D9FBDC8C6D9155F2901263C", + "z": "8D40BB18A9E5B059008A615413CBB6EF8E83537B7B44EFB59A5975B84E98", + "l": 1024, + "algorithmId": "1C01264410A7193B73BBDF78E06FBEC6" + }, + "fixedInfoPartyU": { + "partyId": "8699E3E41171A2C38B6DF57716EFB9E5", + "ephemeralData": "1B78EFB14F3F48FA176C63C196B6AFF981B09007F59806C82D7961E8CD39" + }, + "fixedInfoPartyV": { + "partyId": "FB6500DF10278C6B2C57EDDF665F1676", + "ephemeralData": "375C3C352A8A580CA14931F07E7C8DD87C2A22A0D322D622D84C2D627721" + }, + "dkm": "219396A2A1F24F4E3D28491077F61931FDBB5B98250A3CEE4A6217CC23C4162035ACEE4B5059CECA7ECF0444D5199DF8DDAC84933AC1A81A1A640C8E285FDDB58047D5F3ED7B06DDD0A70461F22C6DA85283CF47B7722C8AEFEF01A8033D70B4F9E20E27BBAEA5827B02201A555DF30656D847919E48497DA496ED74450D06C7" + }, + { + "tcId": 3033, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1834CFD0C5454F31D9160D90ACC92B4F", + "z": "7A80B6CDAB2D12FDBAC815A64FC22ECC35945C5E0619A794D6E6E9C40547", + "l": 1024, + "algorithmId": "B91AC3DEA1EE554D753FC506FF84431F" + }, + "fixedInfoPartyU": { + "partyId": "B9AE8A93219778D330FFD959D5217EA4", + "ephemeralData": "27A77D2D7C922FF3DBBE3BE0619E26DD093BBCB1078C4F1F2881021683FB" + }, + "fixedInfoPartyV": { + "partyId": "744DD1CD86015523786A33D265736473", + "ephemeralData": "0E38398A3D26BCAA36D6494D9364A8A1FA0570E78F1F877ECE29F4FBBA6F" + }, + "dkm": "03F90163EDAB5838E197D8E8E96D225ED099A288ABF4A977F87FAE863099BAE03BA3868B0DDE7A93DC863F0437A812369AC741782B96268D111E6A6741AC0086246350162F54166FA5DE0BCE8CB3B6886575035B93BFB048ECF643832168F50AA5E901FD1C7742FECF8ADD89EDFF292B189BA45A045885AFABE4953130AFB0ED" + }, + { + "tcId": 3034, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C727A2B1592C3709CC4E27D8F920583D", + "z": "DC7C881347FC5D50B3EBF031591572C02E219AA8831AF5999DA6594C19F0", + "l": 1024, + "algorithmId": "CC117856CFC555FEEF35A8C01D134B85" + }, + "fixedInfoPartyU": { + "partyId": "B37E54DF2BBFA026B82C3CDEFD2E5C3E", + "ephemeralData": "D4C03190325D45834F236C4C443D79108A5E5CEEC93CDC36715743B977DB" + }, + "fixedInfoPartyV": { + "partyId": "5B3E73A121F7EBE698C210389C48DEFB", + "ephemeralData": "AE0174605EA4B7FF51C2140FCD681B04E024E573F48B87473210A1B1AE16" + }, + "dkm": "4C59A0CD57B9A83B95ED7A0C16E9C49473A305B5E099A39FEEA1651561BFCF63401FF713DB5F13A8741289B9971C50C576D9946ADB595F2DB22787DD4F0BDBF5C6F1ABDDEC6BD8EFF3CBEB1498DDD6739BDFFA5B300671ABB24FBA6BDC8A9286543A729DCA5EACCC64C5E7C2570F68058919BECB4BB1939C866CA1C00468CAEC" + }, + { + "tcId": 3035, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62F731FCC59DA1690F1D6B1B43AD7178", + "z": "34811805E6BEA0E696DC1E21AD2141FDCB1AC2CF35C741B9D3A199C23258", + "l": 1024, + "algorithmId": "E5CEA60F7C9BC6E3DB4188CD53865727" + }, + "fixedInfoPartyU": { + "partyId": "04466E30C2BC73264054C46939CEB2DE", + "ephemeralData": "DFAF9F78DDE1BC539CC94A73CD96FF891B475496C501F09C44F8A38C8963" + }, + "fixedInfoPartyV": { + "partyId": "EBBDFF6748326DE6D85FA3856B357417" + }, + "dkm": "EF989F9FA4CE31F5D5E547507434D4072183EB39AA194048E1FBDD8639274F646AF240BC1740D380CF96A76D1B51A0F1510E25C45CB7149106CBE86814782B5C1647A6E81BB3DE9691F17FA0CE053140AFC8CBBFA3C3D9CE5D2334AC9DC18B8DE502FE3982B9A61D56E640494D9FA11441EAED6C5F6507C099E65FC4BE87212A" + }, + { + "tcId": 3036, + "kdfParameter": { + "kdfType": "oneStep", + "t": "302DC250FC1B11CF1F82597563E436F1", + "z": "32648C6FBAECFDA81186C8DDEF51CA6013C52993CBEB9D7ED1D1566AE27A", + "l": 1024, + "algorithmId": "434D6728FC65F3C8872F809D3FD96E56" + }, + "fixedInfoPartyU": { + "partyId": "58C5A97746B72071F7FC468235C50636", + "ephemeralData": "993F10BD7D5ACE1A9190638D94B939F16117696D3A69AA65E460AB50B0BB" + }, + "fixedInfoPartyV": { + "partyId": "8D8F0C188B6021D68713DCB4619338FE" + }, + "dkm": "F3F6FF842A2CED5C38AE58CC85E1C28914482107EA4E627634D503B60399B22FC3956B66B00E07806A62DC13DBC5C02A4C60852A1F18DC65129FE8F0C3358FBE263C0E8FA7C08B3085A215A85077506F466F24690ABA9621C098C4893C6CF49C369D81D4DD78DA29A4C002F82F37489C587C518FA25D36AB02866A68CF04F80C" + }, + { + "tcId": 3037, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B377816994CD9DD2965DEDF4B65A0DCA", + "z": "0D59308FBBE5FBA32FB8B60C769C62FA8A8C3002DA3BC2A9CF8900C8E83E", + "l": 1024, + "algorithmId": "94DE306A464FFC5F29A127CE625143E8" + }, + "fixedInfoPartyU": { + "partyId": "2CEA1A7A9863FB0BDD6782079B85DDBF", + "ephemeralData": "B52052116BBEFA7882F0AB251A2E697940CD1ACD450FFAC175F2F86AA348" + }, + "fixedInfoPartyV": { + "partyId": "C29A3DF8A0C468CC15EE8D47B1B91088", + "ephemeralData": "8A4FE6BD4D197AEBF81C61BCBC5ADA6E638739702AC51981C4FF4C2EEABA" + }, + "dkm": "0065E49133371165BCD53252BE13EB7E248556EB2308273D2BCB221DAC0B834110A2643AF364D6A7A5B8354AFB23D16F738D982C2A4BAC0A38053E2D16F9E51A322CB833FFFE68556ADBCD4C2346DE5B02FA216DEC89B1B527A0993955E401EDE61160E04B06F8AB9355B0AC1978CB19AD26B7864DB76F7D03522AA4729DAD63" + }, + { + "tcId": 3038, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03CE3F5F9D4E7538455561EC46D346A9", + "z": "B777B41EE0BF68C10BF89DB0DBE4554A9E80E0580C677A5E8DF003E0FC46", + "l": 1024, + "algorithmId": "D05910937949DE39FE54C629572615C9" + }, + "fixedInfoPartyU": { + "partyId": "7408E0DE58E81CE056309733450FF99E", + "ephemeralData": "2DA0B594FB8D25B36B3AD15E6DB003A96E0F43773A3A0B318F84B9F82A99" + }, + "fixedInfoPartyV": { + "partyId": "12B85DF83ADE6A1AFD7E89851B4B5FE0", + "ephemeralData": "72FFF2F453B3841FE9F4F818590D6A7BFB882BD3772E8AA3AA722D553EAD" + }, + "dkm": "0DDFDB7C0AD76158EBE7B1F182F949BD8038AC154BAF5873C3AF724FF68CEB962B43E78618D41C53475B8E2754E9EA8E402860FD0EFCC89DDE32C1A73396ED2412A077B752715C86F885B861068AB639E96C90D73FBDE50048618A0A448B88ABF479E3DBECE65AD9FA6499782B299AE07959486E3F81FD5CD3D5A800583D33A7" + }, + { + "tcId": 3039, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5DA961BCF5EA40B3EB3421F4A726868", + "z": "BDCF10622770D6DCAE33D71132F5BC33692B3F6974245AA4B21A990DED1A", + "l": 1024, + "algorithmId": "830027461D11393D678D2DB56E662419" + }, + "fixedInfoPartyU": { + "partyId": "73D8AB2518C4B669661A59024C5EA74B", + "ephemeralData": "881B125BC98EA2D967DFE0C228668A934FF22836116C910384E8DAA170A1" + }, + "fixedInfoPartyV": { + "partyId": "3DE34896BA5B2262E32EA0C014FCFE30" + }, + "dkm": "A618383457F740E069DA223AB57B8CC4CA043C83D28BC1A620E71F36D6301C13F1F45B5DB1BE97BF175FDBD31D2B19286456A5EE6FE371A7584DB8C5E7328ADDE28E0AFF5C893D9659FA46AEEAC6E5BDA0B521A804D4683F502C7EE98655036219135BE9ECFBDDA51622FF035D108967AB2D9D0C44E86CD5735C0D58995E6ECA" + }, + { + "tcId": 3040, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8062526B03C3DDFCC88A1B7EA7D5577", + "z": "95A2733E1FF0DE532AC202A272978DC5B04DB10BD4AEC578D397C31B5394", + "l": 1024, + "algorithmId": "66AA4EA3DEAD19245546DEB11EEB7980" + }, + "fixedInfoPartyU": { + "partyId": "D696E33CB8DCA3CEE732504AE413FE2F" + }, + "fixedInfoPartyV": { + "partyId": "22059478D23DFF69050483B318AE782E" + }, + "dkm": "B1649D8FF218798A1AD55B889C9A24A7BF77AE2EB2E61BE1B35FA0C8FA18970EC5488D52CF4DD48E1E658FE1E881B4A84CA63E46CBA61A8D1DBD4EE0B2B2CC50A5A50C1BF537A12F70BDA3A4382989FF6FC2E81145441C3735373A891132E221179DFFF56C52D5E2EAD3D7676ED517948D05E502B3A9420390B16A1E5C2F21AC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 137, + "testType": "VAL", + "tests": [ + { + "tcId": 3041, + "kdfParameter": { + "kdfType": "oneStep", + "t": "346048EE2C9FAE1D015F1795325A8A2A", + "z": "88D9813EF76D5068D5DD611168F1622DACC84D3125EDA0B42257F8C1DC04AE28", + "l": 1024, + "algorithmId": "90283459FA5C57D0C7AEDDA58B52C7ED" + }, + "fixedInfoPartyU": { + "partyId": "D0CF3929F47D373331CF4B30AAD128F6" + }, + "fixedInfoPartyV": { + "partyId": "C732E4608B70742FD1C622F8578CFEF2", + "ephemeralData": "4B53D3A55ED600D90B05FE314C834B109D812FABE8E3D934BF93E27C1D7C092E" + }, + "dkm": "D0503D23E7E76D668DC8BDA1C333BA65F72B61569FB2A78A26333AA35A525DB9B3305FDAB21F8B191C7ED130537E0646BFD063FD10617DABE1AA761935826AF991B204ADD496FC31B6077A22A3C9BEFC0588EF24B88D805CB1B6B976CE86BE01A39225A0D32A42AA20EC0F2DDCFB054F86D67AFFED85751646554F04EC1C319B" + }, + { + "tcId": 3042, + "kdfParameter": { + "kdfType": "oneStep", + "t": "337C3DD5D6202F355E883E630AC7DDB8", + "z": "4BC81D773065B7CFAD2B256E8FA86A0C311A08C5D858BCE69A335F7657E16C75", + "l": 1024, + "algorithmId": "4294AEA411ECF8899DF397609A1557EB" + }, + "fixedInfoPartyU": { + "partyId": "2D98AFE5A7242DAA58CC3CCD379BB87B", + "ephemeralData": "1E1FC7840040E54F9ECF63E26C0D5D0DF3C92302FABE88334150C5ED946AC9EF" + }, + "fixedInfoPartyV": { + "partyId": "09A75E0DB399F64AF38EB65E53871B38", + "ephemeralData": "3DF1911BCAEC2119CF5795759BE7C1A0696CBD50840845CBFA8B32C08B52D7B3" + }, + "dkm": "5199D02EF3F176AC53C47227CBF1770205C86AF20AE6A24464CA2538B41C8DDC5DEEA1EAE83C59016AE1A32BE5AA525955CEC3B8D4AA5C6F5663FB9B9913C902A38C72C944041DABB975FF85466DAB27371D5962C5D761A7B10B8F312E2C75D52E914829844174919DBC33DD1B9512296FA5F692CA9F78721E3995747164500C" + }, + { + "tcId": 3043, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6159EBE489ECAE51C1C31B07130DA7F2", + "z": "4233D5BC1392F91381DD11C2FA3234FC7E308B938DC158D00148EEDA8957BE10", + "l": 1024, + "algorithmId": "C742B199BDDE34AFBFCCFDA39F60C1C5" + }, + "fixedInfoPartyU": { + "partyId": "2F515928A8F15249B611B22DA4C87CDA", + "ephemeralData": "4CA5827CCFB9F2BCD941BE6058F38E2F84DFA969ED1691D9D033551C78F99500" + }, + "fixedInfoPartyV": { + "partyId": "A9E0C8FB2153D39426BE4AE1AC114A1F", + "ephemeralData": "12F3DD206B8CC3CCD0E4A233971ECEC9EC5754649B2ABC20544149D65ECAF824" + }, + "dkm": "020B2D289A7F8A352B5C0F9A88F2C41DA3D2AE6EBC554BFC9BE88BFAE6EA9B8B5A2164FAB67FA322A3A5C8D86F4A9A3EADE0C492ED07AB6F60AA30CCC651315E0C5C6E9562020321694664543D45C7CC081DD628EB5C3E2F4077C636EFEF9A9782FF2BF0646352313664911C390456E1C3AC1F78DBCF3E99B41A430EF0D5F4DD" + }, + { + "tcId": 3044, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26F15818281B5560059D67D8B7DE61B5", + "z": "6C6F99A1339B61A716406D004EB1FC5D14DF8ED405929706CAFCA3CA967F6686", + "l": 1024, + "algorithmId": "A878400039783FC588C2BD88FC67447D" + }, + "fixedInfoPartyU": { + "partyId": "D13097D441B0146512DDE2C099B3524E", + "ephemeralData": "301041FEBDEBE99F1E7A5346DB82B725276D28C90769EE69261926A3A61CCB07" + }, + "fixedInfoPartyV": { + "partyId": "EB9B0A74F457739A2CABC653CE99BDCA", + "ephemeralData": "4D95AA85FCD241560C5FD39E8F0B3D38DD27275B3ABA06FD50B32FF6AEE0AF1A" + }, + "dkm": "85D8F99CEE15F7951AE6F2F4178C8D6F83C99F2442F8B6F73B208EFC0715727FD6C42799CFF0CC763E492DD5B773236A36332FD667A82C28D71D6BCA6A28DE913BB58C9144F7A54892F67CC05401BFE51583E04E3E8F3864B52A2EBF08B5F726713E5A640D358070D3458B722BC0C89CF55EBED84352CF0654C630104647DB54" + }, + { + "tcId": 3045, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E9DB7B56519D6E4422471AC1A6C95C4", + "z": "55A5D2B79374E367B25FA6351C19BEEDA8F1237031150433F2C726D8A62C821D", + "l": 1024, + "algorithmId": "431759B1ECC0E00C5A37D06A59268C23" + }, + "fixedInfoPartyU": { + "partyId": "C0D2F35BA7E77ACE9D6A712D2FCF7242" + }, + "fixedInfoPartyV": { + "partyId": "5F603A34B2F53E7A227618819DF77771", + "ephemeralData": "863F99EB7432B30C5859C1B7AD5A45AEB4107456B8BFBA4E7C537C7AC254FDEE" + }, + "dkm": "5294054A1BE040917A0AB982BDA3CD6511D6A41DD3C59B5A975C743FD65B73C6E61094273B824B595ADA2B4E3517F212A2401DE5BF013D207D12FBC52A62B8CE121D70580CDD4273D62F5567F8AFAA4958563C2F838407D47F01D51E41178F2113612F08B1A763C1E0C54551F59F025FD7BFC794F5BCF24B194530F5ED8C37B0" + }, + { + "tcId": 3046, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D35B99DDAABF90C917595D7387C81937", + "z": "DE26CA593DB3FE3B8B365B61DDCC9289C821152147E1FBD61ADD998337093794", + "l": 1024, + "algorithmId": "5BA84B899B4BDF77037518CD7C1595E9" + }, + "fixedInfoPartyU": { + "partyId": "B3F5127B78B0AD3B9ED7704251067883" + }, + "fixedInfoPartyV": { + "partyId": "D40BC0A0E585FC7D0138717DCD4A21F7", + "ephemeralData": "A5EC9BB85274C44FCD060510DBA961CEFF08290FBDABB3A22EBA1985D00EA9C4" + }, + "dkm": "242F9E00CE9BE9ADC37ACFCDF7093F0FF34BC97BE56D54585485ED6E09D4A5AF7ABCBAFD865F0E79EDE65268BA232D6FEDCB51FA2988FAEC1B1E116CE39968D3639E2D224A4A1F9BC090D40E71046222BDE4CC56CDF8C6C3B99AC4A25E42258DA82D8FA9A96249A1152AE5BEBB57BB401A6870F23BE13AE4B28D9C937C34D3E2" + }, + { + "tcId": 3047, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBE943D1E860B3EF1FCAA6BF18E4F364", + "z": "2A1E699CFAA7CEDE1BBC8921451B888A64A92BE77F617E56BBD94A4A86BBB915", + "l": 1024, + "algorithmId": "54626398FC35D16DEF52FCAD96EEA8C2" + }, + "fixedInfoPartyU": { + "partyId": "C3384B4541C129191A0ADBA7DFE669E7" + }, + "fixedInfoPartyV": { + "partyId": "5FED1FDFA27BA89FFC8BAAA327495EFB", + "ephemeralData": "D3093A778E3208E25ABF4303D50AA0EFE39693D67BC8F82C017DAEBCCA447D97" + }, + "dkm": "223003B4C68C349FBB2800102CAAD156AD54E143D0467B86CA85EE63DA9491EF76A2697B6DF076370948200D8F567476E519618A048F84CCA5B24213E19A6EDD9D6B9F1914E90EDD1CA8ABE84A4753E22EE67CA0098A4727D5D4575F7DEEDB7F7B69891462D895AE6207A8449A6121B6CC0A672B3AD8043719E68A2BC5016474" + }, + { + "tcId": 3048, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BFAD400C902D353077BDAE590E768D58", + "z": "C57530FD7C2259394AD253E671E89FED808A06A32B0B2C4C0703CDC8206C6881", + "l": 1024, + "algorithmId": "7774EBDBF28EE40582C12BB253D0F7F8" + }, + "fixedInfoPartyU": { + "partyId": "2AD392A32CC16F898BAE537F7271CE37", + "ephemeralData": "85A7A6A69277E75CF199011794D4F345B71C0987AA6FE622952DD93C586DA3AC" + }, + "fixedInfoPartyV": { + "partyId": "6502E03F6C5DDD44F5FB6C088C51D1F8" + }, + "dkm": "1B9AA5B5898D7A49A1D759AEB52E39D6D0355C0BDFF3B9D3F31F2268C2C246A9C4F5E20BD42D397A6B8522750983CDBC9770D4DE4A9746F1DDA255AD5EE13E0714241CB05DC48B81ACED7712E5918471AAD315584EDD68B1BE6C4491145D695B95DC28720626C0B3C1B9DF35BE42C66DB7356FEE16456912BAA82BE93BD60DF0" + }, + { + "tcId": 3049, + "kdfParameter": { + "kdfType": "oneStep", + "t": "646639DAB18A24BF0CCCCF3FC03CC594", + "z": "4EDEFE0DFC8A528D1BE28C69ECCC644A261CCBD2FB4FF479BDC080F2E181895B", + "l": 1024, + "algorithmId": "0A4C4E2795DB2787B9B097214A5E59EB" + }, + "fixedInfoPartyU": { + "partyId": "F439D1804B467F0514176ACC9E3A77C0" + }, + "fixedInfoPartyV": { + "partyId": "157AAFC3F5A05466A6CEFA7A6D756664", + "ephemeralData": "CCD0411E771566F86B7D46E06997A9F49618BC9B9646EAE7B84DE0597D905A3A" + }, + "dkm": "35990B7E138E99D02BC25CD819AFE2F9B1CD33F81291918CEAC50C77BC1E061DCFA7080621C69933C40B41C251DC1E0F869F35625809E61F8EF7A53559E56CA8BD01E63F53E34ADD1F1C8D2B8694A373F677801258E9402667C98AA5F87B0BD5F5B94AC17A75DAC3F74F461B53E823FC382EE19A2DA8AD24E523BE4B820771B6" + }, + { + "tcId": 3050, + "kdfParameter": { + "kdfType": "oneStep", + "t": "371B9D24CADC6E5221C4B50509769C81", + "z": "4AF620CD10C6275B74753DE2672C6ED978E7AF949356453EBEE187399771133C", + "l": 1024, + "algorithmId": "CEBC1B74E17314143C97F2E80DDA0201" + }, + "fixedInfoPartyU": { + "partyId": "42D18EB7D1C32B214992A2FB359D3CF8" + }, + "fixedInfoPartyV": { + "partyId": "1C7935007C81DBD3DA29C6BB94B0A0A6" + }, + "dkm": "8D15B73AB01F235C8E7A505CE25DB10D279E0272A7645AFAE7FCC11497A78AFD373AAB178AB6437BA7A55C0C76C8D6F15E2F0F67B38AD26B906D68C4AC3DF1B927DA060ADFA4A9ABA03C7AF3B0DB590E10473CFFB9C942FBDAB13AB17DB979A431854851B491C1EE7293A6915DB0D091D8839233612A963A3EC648EB89A0963E" + }, + { + "tcId": 3051, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E44C6CE7B48C631614C39B4CC692F722", + "z": "0F7EE32623248E908A4D2A6DA7C494EFF309E1717511B5DDB10FD7415F8A7DE8", + "l": 1024, + "algorithmId": "DF3496CCF474457B6598B3863AA35326" + }, + "fixedInfoPartyU": { + "partyId": "34A34D8A96E9E0E74A9ED50C4E0B8FF9", + "ephemeralData": "EB4200B6418CBF79F61AE7BBD5E17C0137F98AECB3B2CFFF30BD77A4A752C498" + }, + "fixedInfoPartyV": { + "partyId": "56FB97EB050C1E4E1855672C1E8DC9EF", + "ephemeralData": "C4E20A14DA9C87C8269A0ADAFC23C3C68CFF797CEAE42D5BAAB19E5EC1D1885F" + }, + "dkm": "0ECA000A50733990CADEC8C86924BD1CF39DDFF4AC02D2380CF5AAF22C3835CD852853A8A9E597946AF11BC985322AD0E38DF995B805CD532442E28A9945980E3BCF0F78FC956AFAE574191878050E12776DFF0FD40CF193008CA2682B0ABBFC80FA7945D5BF29FD16DECA265D3E1357ACBF6D1875AA8998C9A04D19E2F48742" + }, + { + "tcId": 3052, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB0362A99D4DA629440D66B27DB91901", + "z": "8A492AA54813C629C270382BF407CFFEB00C142FCDFE6046A3538B920CCB3D90", + "l": 1024, + "algorithmId": "18219F2099F3E4EDF2C8F2EF3C0A3729" + }, + "fixedInfoPartyU": { + "partyId": "15144068513715C5768615D4E20847E0" + }, + "fixedInfoPartyV": { + "partyId": "171BFE0A77CBE208CC58800E5BDA9E9C", + "ephemeralData": "1B16BAFEBA32CB15AFC6D12F6E8B08AEFDB1E95A1E00152F9149E9DC290CE7EC" + }, + "dkm": "19E8A66C0FB69BDCF69A6BFA40D8A1C11E941E317068C8697A21B64717914923AF970CE5E494F420C3AFB4D21AB09580667D60F5CF4BFB8373EFFCC4786EB9D121B058C273760D23BE965327B0A071B9C190AE859E6972EB0F92307BAE093AE7393986CD26683D98576907C71EC1D3E361C000615CAE1620FEC53AAE876F1D33" + }, + { + "tcId": 3053, + "kdfParameter": { + "kdfType": "oneStep", + "t": "60BE8311AA0324D0EAD28CB824470BDE", + "z": "77889EDC16D4F9CA62AB6169EFFD8A6314176D111E78E85A0AB061E4AB79D8B4", + "l": 1024, + "algorithmId": "CD4B6E25AC48BEFB9A48E03AA4E49CEF" + }, + "fixedInfoPartyU": { + "partyId": "62D9B414CFC93C5B7CE9A0F54CF8E7FF", + "ephemeralData": "20164EDC972C9481A1C31FCA75291F005FBB2E9A8DEAE1162D53F7CF858646EF" + }, + "fixedInfoPartyV": { + "partyId": "0EC1EEFEBEDE1FA5F030F20258ED0871" + }, + "dkm": "0EEC2E6A220B193D90F9739A5FA698F49ABF6D0BA7AE896BED5987FD1756932AFAFFD9520BC2EC5AB87D36AE0520445F998054807905D1A7393481DACA48E054817177B24A128CE0FF3C0FD29D0EE0D3688A19075318CC6C7A4DB9FBCBD3AC55578A78AEDB6C0D8CAC4044FCF2DC738413EF735D5368BDD3C1C0F798A4AEDEB6" + }, + { + "tcId": 3054, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64FAB023EB6C356985FFBADF43735B14", + "z": "EDEA91A75F5B87BAD33EE5412202F9968B6B1849920F37385AC0CA1E2F179F93", + "l": 1024, + "algorithmId": "672D81BF4C54A19E0D7D1495C50DBA8D" + }, + "fixedInfoPartyU": { + "partyId": "513B6CABA80A199A4948FE6920B9F0A7" + }, + "fixedInfoPartyV": { + "partyId": "4DA6B2616F97744461AD23D7AD2A54E1" + }, + "dkm": "6FA47B6E9F14BE886C01C2DBDDB49F7DF3ADC77424F6B66CA30FDA2B53D60CD9C70198BB54987710D4B1DE1FAC4A64B56F5DFEA34227669B341A0F0A370E842E7039C7FB64D7999CACFAC1B6C9DBE7B117A14292004E595E41A6AC369890BFF3CE4472BF578885B4FBC1DBCD49BE711058C7F32FC6A610F2185837EA2563310A" + }, + { + "tcId": 3055, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FED2C21E70EECFCDD074A0D38E7AFD00", + "z": "63BA50DF007D2BFA02D885A6A74196BA0FD212665E941E795B9AFE23A7260687", + "l": 1024, + "algorithmId": "C3DD974608EBFA25D9C0CDD04AFB6FA3" + }, + "fixedInfoPartyU": { + "partyId": "BB69160BB5151E6202A036703F80EC27", + "ephemeralData": "C1E4F6226F87443FF5849E929179363163287C9980F8AC232D02582B8088B6DE" + }, + "fixedInfoPartyV": { + "partyId": "A2C882A8894D117D94FCE232990003C2", + "ephemeralData": "7BBD4DFA518014E53A4E318E7C96BE36C72C0A93D0E74192323F6A29EFDFDA51" + }, + "dkm": "1B303CE00B48BC227D9931B771839DA773EBB386304EDA33C5AD17168C442CAE15ED8BC416BB23017B62F4B52EB35866583F7BC94B5EF7689326C115165FE62939DE82251F7BEDC9D07AB67B26B1DAA1AE80FAC0D150F41D8CDF893E20D8FBDDDA628966DC6128E00DC3D5AB65AA5F4EA3B86BE0589E1FFFE40C9D5C93B3B339" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 138, + "testType": "VAL", + "tests": [ + { + "tcId": 3056, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EDA155AF0F2FA356C21F1C367708CAC9", + "z": "A0C8FE659498574F51414DC56749E461F8FAAE2D7F9BCA8656F8D276", + "l": 1024, + "algorithmId": "28390AC1F561A00FCF0D63418F8606EE" + }, + "fixedInfoPartyU": { + "partyId": "1EA65D3E082AFB24D6D274FFBA1FFD34" + }, + "fixedInfoPartyV": { + "partyId": "873956136432AB01548A65DC4EE78299" + }, + "dkm": "DD0A5855DA497247F948FB82BA36367AC65BF953073FCB291655128033A9024A0C8713B3BE99626B383240FCAAEE7515D40C3E157D2F091756E5E6194252A64A435DA690B69B0FFD4CEBF25FCA03AEF515879CEF4A0CD43066EA0A6BE75322293133BB25F354645A19DDD9F8F059724254DEF0AD924F85A12AFCDA8A6E322ADD" + }, + { + "tcId": 3057, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DFA9E5FBE70B0BC4EC29C60D55E2EED6", + "z": "47CCFA640B3CA3F1E403796D24EAA74BF694532E21D5112B2530F1EC", + "l": 1024, + "algorithmId": "A88EA015CD586E1319973C5291E68DD2" + }, + "fixedInfoPartyU": { + "partyId": "BA27C019C57C686F23E079C52E1EB031", + "ephemeralData": "FC04B5C6C6D23066357EF08D4531C124B449EDC5E2827AE6201DA033" + }, + "fixedInfoPartyV": { + "partyId": "8B004B9B354A26AF5930DA827C31CA3D", + "ephemeralData": "A66695D8904A32CCBCFAA48576315A56CE02CA84A8CF8C804AA74A6E" + }, + "dkm": "036421D274249653B8660B0A347113EB0AA21E86474E4E257621DA1C5F2DE98A0C1C1E337F7A251F3729C8AAAEEB70CACF59A1FAB7DC16CE756ED6C07B264ACA68FBB1CA45E7B61FFBE2C69B17518CB61252516B95F9C0471EC9A28E9B11A1B35AE15D51771D0D3FE579839840D618F677FF6B1451DF42EBF8F1EE2525739DB5" + }, + { + "tcId": 3058, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D157B193B0238D6902B8541EE10126E9", + "z": "52DA9E10C6E376B6270E9A56EB4118FAC8D4046B58EEA25CB0056B67", + "l": 1024, + "algorithmId": "EF789AFAFFBE721674D2A5DF44A1C91A" + }, + "fixedInfoPartyU": { + "partyId": "1975A8374793C8948F98EC1B64E12182", + "ephemeralData": "078E56B2800EAD702349D59BC7BE9F3F87F01B2FA2F85A384B5008F0" + }, + "fixedInfoPartyV": { + "partyId": "D1ECC2E8C74A0789961F47C9000DF0C7", + "ephemeralData": "8B943D2780F8BDF00D3FDBF1CBE198CFFA420FF52BD29B7FD5285507" + }, + "dkm": "4E96B116EC91C4946B638AC96079369A24E89248AC85D3729F3B8AEFD6C22003FDD3FC24412101E3EBAB7ED81A54449751C28265C5E197A47B332A4716B9D8F27FF3FEB1259922D9D54F3C0118DBCE7732A2E69BF838622489AA77FB2A07E51827D27E113891B97C2F976948BCA5DF2D644FD09FAF30B6426D449881E2C5B4E8" + }, + { + "tcId": 3059, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9542CE351BDA8E0856560C88512BD029", + "z": "829592F445D92C6A6CEA5B39772CFD1934466F24DA7FC8AA54DC3778", + "l": 1024, + "algorithmId": "557668966B5F040558B627109EE94A51" + }, + "fixedInfoPartyU": { + "partyId": "182D505160AB218B5FF3CAC236239A4D", + "ephemeralData": "AF18EBCD094F710F4C898DFC331760975E4C2AD6E4D9E163610B3C22" + }, + "fixedInfoPartyV": { + "partyId": "A0EC5249B9E9208A55D27FC0FE191A8A", + "ephemeralData": "A3DBA9C18D179D4D10BB5929C9789401EDB0B5CBA3C3542C94C1F401" + }, + "dkm": "434FEA23F45E74415B43EBEFA2978C9A0F2A41963CCC0382ADA6EB5AC5B6717150C46F0E0646AAFD603FED52D27BEF3600A3954E6AD655C9C3DCD93F8593E69F1D4729A26A9DCFDA3CA4F3D7B007A4CCAF27862CE589EC698FC2FE2E2DBBA9BA77D9D8BB4AF6DF36B27929F659C93E8E470578D03EC662A5239F98B43962C33A" + }, + { + "tcId": 3060, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0DA637E662A50311E80868288AAE7981", + "z": "4951A8EF4A96DFB1F53BB9306BE89A87FBE4CD397E7EEC16267C74A2", + "l": 1024, + "algorithmId": "5BAA5BA34300C2BCAB49F14C6390F8B2" + }, + "fixedInfoPartyU": { + "partyId": "5A502FFB944584DF2FA0F31C85C4E64B" + }, + "fixedInfoPartyV": { + "partyId": "9A6E3631DDC35BB1FC2D32391A77600D", + "ephemeralData": "DD976B8997B4122EDA47E2C63C8E81FAA674AC8BB8F993DF5E095232" + }, + "dkm": "F860C49D81A1AC17888187E9B8A5319125F35AF589F9154BF3F13D7F2E6E3E0B0C97945C16CD47E49E3B871EF4F166696E63E328AB62882EB6A639D56789B6278FEAC2C2F847E09F5226AB5FA6E8FE0674E74C3F224B4F0F3466C120F848F7CCD06FAB17BD76D15C3DC1110293BE0A0F6FC76FD56768A3A3FD4F86533E7588E4" + }, + { + "tcId": 3061, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA66931DA89C49F46BFC62D10738989D", + "z": "5EEEFB2C9D27085E2863FA75214766737BB444140B0EC0DA821471AA", + "l": 1024, + "algorithmId": "D3108CC74CACBAB7D92BB96FDB97C494" + }, + "fixedInfoPartyU": { + "partyId": "00126F9A214907727628E25324BC831D" + }, + "fixedInfoPartyV": { + "partyId": "955E40E72ECAF458F71F5C15C7BEC8CD" + }, + "dkm": "408354CF5705D791BE976A7AACFA32FE15ADCA4968542D1F11C3C8E7B3063F4DAC8A757CFDD3C73C52D35770435A8CE109E013A4D97C28A8988C1B4D648159ABBE62384C6C9E57721C6EEE255A7BC70322715F6224FD8B7D235B9F32DECB643214F451C5043AEB266B303385FA5E19BB2AAFD0B3B621B564D02884E95FEE0C82" + }, + { + "tcId": 3062, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5138B66B94EE7F392F6492CD8377859E", + "z": "0AE1904BC53CFCDC2623A540AA012B70C48280340BACE4FDF54E630E", + "l": 1024, + "algorithmId": "2815E69B422DEA0CF638F2891ABFB058" + }, + "fixedInfoPartyU": { + "partyId": "4D4F6CD9BA2B1F973734DCB2568AA404" + }, + "fixedInfoPartyV": { + "partyId": "026DAA882712751292C553437D0DBFA0", + "ephemeralData": "22679FC4C551C18CD3D1AAB5EFAD704C697A2112C9F793122BF58F06" + }, + "dkm": "E2C1F9EF016F05AB311AF0CA7A36FCDD42C39B10A83FDC891EB3178641B70536572C405CFA63D3C51624A95E36E08DC19A206CF20E6ECABB893D15150E138AA130DE5590D37F2119EDF76467B1C71019A653248FE5459DE33DE0D933580CC6897EC1375FC58A1C536C683C1E718852102762CA7F9D597F28AD62F564B7DD93B9" + }, + { + "tcId": 3063, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCD0BC2241F0E73AC86FAAB4DBB31FF5", + "z": "BF8C07DDF035B932F5B649572A5B243CA1539D04409EB0393453371C", + "l": 1024, + "algorithmId": "231FC5CF0EE655D9461735A7C7D04D9A" + }, + "fixedInfoPartyU": { + "partyId": "17D7728045EAEB7197F209841D24D645" + }, + "fixedInfoPartyV": { + "partyId": "233157630262A9DB05D9E9C58C168CCE", + "ephemeralData": "8F60A9184BEC7F33767B0E991EE1BF74715E6CB8C332331C35782DFB" + }, + "dkm": "B23F14F74C573746E4663DDBA8D19F7F0C8EFADE684E5C51EE301C86EE8A6EBB547BD5B3F132C4576A05CA25A0D9C2BA1FEBD23856C66E447A48407F226E91D57653545A50BBF0DB3A31CB24CB4CF20813962AA9D67E44B46CE36DB31021F2D2EE1B83E9216ED99E391C21858B48FD48B4668FD6DCABF897F5E416034A6ED56D" + }, + { + "tcId": 3064, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2995BF67E1371D9003DB6D866EA96113", + "z": "992164F054AD9B782E6C808B77F43132A5353808E8E89F097B51E805", + "l": 1024, + "algorithmId": "C20CF4C48E607ADB3B6623B6B167CBC1" + }, + "fixedInfoPartyU": { + "partyId": "4E66C17874B890A3DC8936E41BD484EB", + "ephemeralData": "C7FAD417A7FCC01A6483FC4F7DA58BFC3A6AB16752E655C0295FD035" + }, + "fixedInfoPartyV": { + "partyId": "847DC8ED2F2B70C193BA1C5F34B6B5F7", + "ephemeralData": "D1DEBC12D0E0DA35FBB15A1F5BEB11B7D4741DEAE3C429F71205A6A2" + }, + "dkm": "C0C3BFA4904642DE5332172B8BDF25C0F891A7A69FE42FD40160AC711C558C2B560064D4C918017122A8B90515B5EF05669DF8F838D4C3EEEB9FBA19CDE8ACAB6125464AC434B5943BB1FCAA9C56A106681692EAB520A832ED78A3C146C8685389A6BFEDE2367C7156F0669936B62CAE93F1F0C1E331A5A6802F1068955B4D7D" + }, + { + "tcId": 3065, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2E19EFC366399081916F88FEF50485DE", + "z": "FDDEE097E79E238C223C9E53F7EF26C72393A46FB726152C08CF1F20", + "l": 1024, + "algorithmId": "522CBF30370934E27FE1D58E60710670" + }, + "fixedInfoPartyU": { + "partyId": "59854C5FC92523EF1016DB1AF2BC7A9C", + "ephemeralData": "792F07DE0FEB08A1E8F51B28364C71E881FCA1F7B2241242A15AC94B" + }, + "fixedInfoPartyV": { + "partyId": "3A233F9868595C83164BF2449E40C372" + }, + "dkm": "0EDAD623A69CAE2EDB22DCCBB4A083CC9F904AA063906EA2182A4EC3041F6910B14A7E49CBD99FB754F3E1FC38FB06AEFEC21B39D09DE195EBFD465575ECA897E81C757414B33E0DE09FE06249BB185BF4551238C2AC8562B4970D16B471F01B6EE4AA48301FFD87B1F7B0F819CD1A95458072589F6A4CC9C5AFF8BC7F7E349C" + }, + { + "tcId": 3066, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33995C3B4251CAE7C608E1FDE3992525", + "z": "386E4A7D91400AA53743698E743DFBDAC4C7501274F7C26EEDF1C77D", + "l": 1024, + "algorithmId": "3F77EC0095638AEEACBF2F0356118572" + }, + "fixedInfoPartyU": { + "partyId": "ADD0242D62D08AFB39182FF191717DDE", + "ephemeralData": "98037903E2AAD335DE9596BE5324705F86728E6119D1B4DC8DECEC43" + }, + "fixedInfoPartyV": { + "partyId": "A18F789FC801AB825D397792398109E0", + "ephemeralData": "9513D1C636E8F3390C573839B1638909426FE3CE3B8D6E0FAC1A9BB2" + }, + "dkm": "96B6BF36A1C8730E6D1125F4B438A26EAB885C7FE025EAF4EEE214ACF7C852CB7A343EBE9CFBDB2DDE22B62EF2EFD35BF6B25B2C819348BFFC5E2BA28E44B5B69E1BEBC26379B19957BB90ED6B37CDF5BFC103E9144D059E818E0611576B2A3E667C563648774CCEB42636158D539A4517BC52870B18FE2270B72A796C712336" + }, + { + "tcId": 3067, + "kdfParameter": { + "kdfType": "oneStep", + "t": "897512FFEACC4441FDDEDE9DFB84A820", + "z": "5B0A5406F820D536CA279FCCB75287C77B271E20D80E83F8E381E4C1", + "l": 1024, + "algorithmId": "6A8FF38E5571EA4D3145709F4C52E5D7" + }, + "fixedInfoPartyU": { + "partyId": "7EDAAB9A9C72AB72AA93E7753B325BA3", + "ephemeralData": "2D2044A7F3DF06ECECC534B279A4DC88C3EB52AAEA5F1D15F1BA3663" + }, + "fixedInfoPartyV": { + "partyId": "95CA50D33D8D69501DA340A2FA8B308A", + "ephemeralData": "A7492986394721F1C6796031FCD14AC6565CCB921576E723CDCFE9E7" + }, + "dkm": "C356A5A1BF8B0C02DD1584BFA0BA69AE50AB23DA1A8C37EA0B7A1DF85D90356430A75F8A24F9FD4BA0F8BCE616B4AF7CA78C1DE69895325C4EB860A892C0D4FF3CA1E8ACFC2D90F3CBD5A23A871DCB53A05FC8E305E8F3CF6B4FCD25A856FEEB29CA064A158EFDAD5D10FE09012EE2D9534B98F5E4BE02DADC9C0A185FF462B7" + }, + { + "tcId": 3068, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D75FA1B4BECFC189914ED34E05CDFE04", + "z": "1FDDF2BDB3001E7B17DE250D35478F9500DC107A827C22667C8C06E9", + "l": 1024, + "algorithmId": "EDE306F3B6AD96DF02E913E066830C86" + }, + "fixedInfoPartyU": { + "partyId": "3D8B4A81E287667AECCDD5363E4E2B44", + "ephemeralData": "9EA6BA5AC2BFC99EC24E3D5D4474BED806CA5C48C28EB1997AFAFC4E" + }, + "fixedInfoPartyV": { + "partyId": "78EE7CBF7AABA4E2F56FBCC2933095FC" + }, + "dkm": "D50312F961E70675450A415DB0FCF037A5AAB33D34C549015F6FD36298FBED6AAD29972E7B9565CEAD97A37879CB85A935AEA23BFB9274472387816FEDAB10D3BE87D83FB301FA22FA66160DFF1E70BE03A5D533C6D4BC250E89CDE16AF0D5E2D253A63DCAD7847E0B905A4D624B97A2ADEE4C738C18E105EB9D0FE77BEF4AE7" + }, + { + "tcId": 3069, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADDCAF2DA13F684CB406FCD7ED1AF718", + "z": "4E57EEC136D69CC6AB39623ECBA6BF7363D1499567C14A7274A46C59", + "l": 1024, + "algorithmId": "59BF5CE7E5222181C89BF6B7A4A3C832" + }, + "fixedInfoPartyU": { + "partyId": "8D58B335CEE74BB77B8B7545D19AF9B7" + }, + "fixedInfoPartyV": { + "partyId": "F383B26E95BDE63076CA6373C18C41A3" + }, + "dkm": "B792C57D71C2E92E433F7262FECBFEF4BFDE06B302E9B1314A8A379A28AFC1C9B185E406E1765624A3ACC3067C99F12D65D4FC65151B1D7B9BA124B7EF56C697E689336DE2826AE1019CF8D6060FD73213C97379700DF5730E257C9BB6A170D00E807D0126ED0C937097D2734D9AB14EDF602AED4D0798F2EA96BBE549074343" + }, + { + "tcId": 3070, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73331E44DBB8397756558496727017FE", + "z": "D6FD9B18F5CBE079416B9A4F27F6B6EAF4F89864E6DCA6E4B512608B", + "l": 1024, + "algorithmId": "E599FE54D7FBD66295DC9A1075F16D7A" + }, + "fixedInfoPartyU": { + "partyId": "FE0E893A5701E3ECF34C88A2445100E2", + "ephemeralData": "996C3B02696152B446630406A9499D1C94AAFAF2B2A98B9042C16C60" + }, + "fixedInfoPartyV": { + "partyId": "8EB091A87451933C2FB76ACDD2EF0614" + }, + "dkm": "BE0F5656E19A3FC33D786ADB02EC641B3419A630A98F6C8E453684061D7AA6E980396035D8C720E6EF2A806759952548524818EAE89AC042A2500120AFAF71806C6F70F8AAF91CE7A6C1DFCCEC3B76F46CF8842679579C5D550EDF6A98E40503873D6BF767DCC239B8820A9A18EB27880664FB26E408CCDF34497CE6181ED05A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 139, + "testType": "VAL", + "tests": [ + { + "tcId": 3071, + "kdfParameter": { + "kdfType": "oneStep", + "t": "59E4642CBD6319FB7431D73EC614A219", + "z": "AC1420A4425997A7181A5259BAF739296B491F16C9B29C1F7705780895E8E722CE5BCBC8", + "l": 1024, + "algorithmId": "C7D2DE5A683024F0D5B1FD6C5849640A" + }, + "fixedInfoPartyU": { + "partyId": "CB2F8DC5204929221DEEF5BD065D01B2" + }, + "fixedInfoPartyV": { + "partyId": "3D54C82978E38492B5949EF9A67F9841", + "ephemeralData": "A3684AE2F461F8A40A712B51C962B8321E3DFE77DCC40D8C3C8C0810BE5CCAE549038C24" + }, + "dkm": "CAE8DC210875B25957A0072667300A0341FEEEF596FA9CCD7BACF5F14C99FD8B39EDEB6F228FD0A28D8316F3C29FC6F3C3564C066002591CEB623D17314E4DB4B90F812079EBF985F5861C457F97F6EF785F29668264AEFAD89FE452AF7F5820629267360CEA68D0253F7E6CD3C68E55C5A911A5371BEB6AF9E3BAED18374E7F" + }, + { + "tcId": 3072, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FF2EBBEC5187C36B1E271C7D59CB8924", + "z": "6B83E1719C80F63183EFAC937C20E1E277E263E0C8A5B4605BFB6B5C02D907E97DD0EE63", + "l": 1024, + "algorithmId": "AA80465AE7E09F586C47B9475BCABA99" + }, + "fixedInfoPartyU": { + "partyId": "8870BE1EB6BDCB2012FDC8AF1DC10376", + "ephemeralData": "C5BAC3F785726538EFC75C0EE41AC7C4A1DC5239317FEA5EEB65D156173CE953CD821CB6" + }, + "fixedInfoPartyV": { + "partyId": "6CE4853DE0C22697F759058419239D01", + "ephemeralData": "AE10F20680B3B1E69AE74D236DBF1CC22F9B30BA309BF3E05EF0DE4D22F7BF9D01EF14E6" + }, + "dkm": "08B2E63DF25AB3F21E88F31A9A01942D4B586E7EE11FC51630B39446DBFC13F46B4591A2B5DCB2F3F8D854E73D54C48C4B3F7FC1B3F96A1191647917259BA80FE305C19BE4BE40661F27043E39EC7D06CDDA331E4EAF7A0E81CC91D58E69878156FB02B843DF3F5A2780AC8F669BD258D4C32D1495C476A02AD6D3888DFBCC91" + }, + { + "tcId": 3073, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5ABA1933A5AE626989DD0E2C1C421FBD", + "z": "9805DAC8F1EDF881015D43F31417498FD2083CE6AE5F42965D1D2CB5115011DC18EE59F8", + "l": 1024, + "algorithmId": "F42961F1FD35830A209D2F63C7CDD022" + }, + "fixedInfoPartyU": { + "partyId": "F7BF000226F280F1006730CFAC181173", + "ephemeralData": "0FE0E0F63880FE3750732217E25E025B24D43BC73DBC942B3FBD904EB39824DA41AECBE8" + }, + "fixedInfoPartyV": { + "partyId": "C43BE936EBC5C1A9A080F87FEC985756" + }, + "dkm": "AA7E1A0F2B2DB6E02DA7C05617E4AB771251EBCCA731D2B45BBAF7DEB10F11B24B1E37106E23A5F03E961E529E05A79E7AD509AB2B147610853500C09D2C41F96C685ABDB0290FC741DB4F0B6478EE7D8DF8730FADEEF01CF2B732CA36CD79ADE0ADF42EC9545723FE96900D54D04AFB374795C24CF5205A7EAEC2CB210BC27C" + }, + { + "tcId": 3074, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9B5BD97E675176C28DD2007DC0F8829", + "z": "30A9433CD8A746C54B89D048CB9DC3CA546DB21B7568DEEA96472FFCA095EA37147A4D69", + "l": 1024, + "algorithmId": "1F44807D122DF1953F2D3B63F6F826EB" + }, + "fixedInfoPartyU": { + "partyId": "E4CB00AE8E3E46D8D7E06FF33EE72F06", + "ephemeralData": "25DC89C27AC49CFB9201F2C5E35B612FCBEB6E3834A6596E88B6DB496067CBAEB0A51E60" + }, + "fixedInfoPartyV": { + "partyId": "91765997ED694E2A93A9DD8063577F03", + "ephemeralData": "69A89A3226A1FA148976B9C8B7514A8817B831807DE5C63B16AC65D5CABCEAC1C2FE2019" + }, + "dkm": "3934C3C4A0C9C4CDEF8846BDD84C4AEF2146B9F8A9FB41F2D0131181413E2449716623E8FE5886D684431B0A45F4DC6D4627A19C70B2B2279F3B3D4DBA10D28C1E8E68632A253D7967413472A79796887854D2D37A8D95EBCEB529FB96410E20C90AC019BA8144A1213E016ECB81E8B4556212E0752F86E23484E6CF8D1BEBCF" + }, + { + "tcId": 3075, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D47678CEFD27B417F329FEB657995E2", + "z": "E8B147C38854B50123E543EF1104219B3F96A4F959B271EA57C0E3CFFB7BD10148030A1A", + "l": 1024, + "algorithmId": "E6C7B8F2CBE40BEFE1A5D49F27C321B0" + }, + "fixedInfoPartyU": { + "partyId": "E8F678C9CF94DADE08957D1911E57EB4" + }, + "fixedInfoPartyV": { + "partyId": "C0A394388E19F958EBBD59F105F90108", + "ephemeralData": "7BD3000EF145A67A7B84C0252725C2E3B845BBB76CBF895916AE1532FB8B1D2684BF7AA5" + }, + "dkm": "58B276499DCB623FBBC53DF0498C3C6B9A4C045554C316B12D2C092370CE4DC4F0D37CDDB7C328DD3D2472AFE93E91F5BAA78F76EB446E9F7761D35E2D4514D3EDC02D184EB8DC96126CB967B275812EE4113D6DB2FCF287CE8C67A8828D7AB478C08D0CE207C68E7EBB83E30A1608A82D823003CCF9E6C2E7465C324514E9EA" + }, + { + "tcId": 3076, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33A1D939D0F2A59321D47418A80ABE15", + "z": "65ABA2A7E1E7DC02980A205432D69FBF90DFE0A9272FA4C57341E4860287FE9BE179066F", + "l": 1024, + "algorithmId": "81F2466B1AD548BA20ACF53E9D4229A7" + }, + "fixedInfoPartyU": { + "partyId": "5927CB76EE5C61323321083716E611CD", + "ephemeralData": "2E96E88EB437221BC4F3FFA27DB659C9F9975AC9F822CC5FFDAAFFEEF47A8C462FCF7410" + }, + "fixedInfoPartyV": { + "partyId": "71ACF63994D335760948226C858735DB", + "ephemeralData": "B82E25C675258A5F2C6C07AD10A68D12D2941CF435776FF6C8CCD8B698468D52BDB7305F" + }, + "dkm": "7A4EE8053320F666CCCCEC6099270AF4D5DD422470154938483C6A6A0217E69CB540CCA398F8B5898156AD147EC9D4F85859F25FA151BE8343AF38453E11189A449352016124CFFA2134B95695E3D8817FD375D53AD4867435AFF88D5441034E253330A4C99C59EBE4918574A32DB60C96861DEDC621649ACA4A0E11F6AF290B" + }, + { + "tcId": 3077, + "kdfParameter": { + "kdfType": "oneStep", + "t": "003B2725DD8B253489D51741B2931E34", + "z": "FEA33F1C4586B394B96D81037D5A70DACF95C49F15904E1A34A9DED93B1475C40425CFC5", + "l": 1024, + "algorithmId": "9BDCC5AE5461A4FE8D3BCB5FFD54DAD6" + }, + "fixedInfoPartyU": { + "partyId": "7314D6841C4392B4FC03B3FA21633A97", + "ephemeralData": "16717DF34869B5AC88730BD5F6024AAB4E8E1D5277E4DA8BDD519FEA496B9C6E8FB94AF7" + }, + "fixedInfoPartyV": { + "partyId": "B932A55EB7281EB1140FD8F79E28BEE7", + "ephemeralData": "CFCDC2AF82072ABBE2B644ED3BD356F0F5938FCD680EE90836359CE32863BAC247ACAE25" + }, + "dkm": "371A1F9CA278C15B24D75F5F1B03D31A519E5F9B3CA467953A2210E94C697441688BE640117B8FE2855C2F962AD38ACA7DC333120C7A8EE14C5EC8319600E532710F335BDD85E20BE273A75843B839EEB9C8C72652FC1795750DB47A5780AC9AC7589EFE874F561F97AF3D4E460D272E89C870A39511946E10C8895AF813A4AF" + }, + { + "tcId": 3078, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E56C0021CF8CA957AD4DACBEDF43D14", + "z": "7FA9688FA3B56C3379AB5447E882ABF0A873B567119777007BE3CFEB8B642DDFCC64991C", + "l": 1024, + "algorithmId": "19D6B119C6F6E563B8882C4440CF1CC2" + }, + "fixedInfoPartyU": { + "partyId": "4DB4E7331D7A59F6FB0169D9E639094D" + }, + "fixedInfoPartyV": { + "partyId": "CE98EC3F197F57EB828B847C16709EAE", + "ephemeralData": "57231B4FE26CB6E18211EE64AD85D06938C9E15668B74B468DD9EEF187AA87CE8C7C5DC4" + }, + "dkm": "575380870791DFD5700AC79315B9B0B36385783AEFABB32BE0284D633FB8A03D5D8123D6B76A405366EE9F5852517B01817BBDD9AF3B1DC1E99B92858A97D62CA58FCC7603C1057152072381A91FA8F78B657A2966DC9815656866025CA00EA177113AD7EF6807F667EC123F2FEC93DE675ADB2E2229B2581A08DE2C1CFDEC58" + }, + { + "tcId": 3079, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B119476EC94388256BFB5B18B96A9BAA", + "z": "87FE0079234CBC9CC90EC86DB673DF86E880BDAA9C2E2742710D11C13012A883CDE123E6", + "l": 1024, + "algorithmId": "58CCE2AAE5B2926ABA86E05233336911" + }, + "fixedInfoPartyU": { + "partyId": "B11EA65AFE298A4D07F8398801D5FF00", + "ephemeralData": "D5475B9A9EF56F0F9EE2696BE74C5F7EE8AB9CA72841F7EAC50494489ABB5F2AAF062B31" + }, + "fixedInfoPartyV": { + "partyId": "0AB2D5E7926242F4A54067199FD5D7F8", + "ephemeralData": "12D12AEABD3AB74F0628F2A71F16CE0BC6D0306CB08E2A659ED88A1C7DC1441FDED149C9" + }, + "dkm": "0F806E56B84FE1095B8D22C0FD96C1A7DD268FE37B6356D19DE773BFB0EE89C07F9B789919EE60210D855D6588F4524D6DC6C0AE893170032F70848C2E67D9BBEA3F6735BBF901A611E40DB4B86FBDD14BFA479896FA848E238EE7B5DC4D98B2E392910431900E699BD3BDB4E9DF61A880E75152A8FC135DB4D7F15CAC41A135" + }, + { + "tcId": 3080, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67116E1D9E40718ED85A6352E218CEE7", + "z": "71A294620B7154D79F03F736DEAFEB9C12AC11A7D29F83A6DEB56ABE7BC4ACDA411D80E8", + "l": 1024, + "algorithmId": "489BF6F28BFC737A8FF3181191CF9042" + }, + "fixedInfoPartyU": { + "partyId": "0CF76DD10A327BADE7249D0A3B6E5AD9" + }, + "fixedInfoPartyV": { + "partyId": "E0117CA9F969A324A9E30A3ED1FDCBFE" + }, + "dkm": "48D34EFED9F3352E1B7E3B6C22240E09E836E59966AB157068AF45B37181F2FCBDC6A3E468D220F351C2085383C9FAE6A1F36FC1F89DD5FF3C7B3A129BAE1BEA37D3CED63CDB5837506B4458202D23F18AF759241783BBDDCD74E08C31B5DAB9D69DE0C6C289FB54B371BDBCECECD4133B213B5B854ABA4F759FA06D88AF21C0" + }, + { + "tcId": 3081, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D8FD8D25A37C045CB6A3FE7C810CB4F7", + "z": "B93A593D9B0890FA5D7DD80E7C6ABDFD60120EF7E8DD8E141443203601AF39BA5D3FB3E0", + "l": 1024, + "algorithmId": "1E60666C1B323B282E337761DA8FB17A" + }, + "fixedInfoPartyU": { + "partyId": "16AB9427CEA28EBB5B4B0A05BE640326" + }, + "fixedInfoPartyV": { + "partyId": "53BAD6A717A60651BCE14FC34822DB9C", + "ephemeralData": "B6D2037AE7B81343A503B40282B36371177EA121F2E56636AF367FC00F72F25B54AAF4C1" + }, + "dkm": "51A2968D209288430ACD4FC85992927F024AA7B06DDDAE41B3022948A499DFFB7F555E364B06D2F28BFD8B1026DA75A8DF4B3C1C0DDE8F5C4BF6B21871B5BD45D1824C6EE02BAF859AE77CFC9E524EE32834FB22674BA35888DB5B92A1D27E671FBE584D379F4F17418422674DDFF5DF82F2688F35D0A8E1336E0BA35CB3A027" + }, + { + "tcId": 3082, + "kdfParameter": { + "kdfType": "oneStep", + "t": "111BD62E02EBB9A8754EA5D96D30560E", + "z": "58DFBE25C93F6BCFBED78E07B46FF4598C621867C898A7FFD5FE4BCB957369454F1AC357", + "l": 1024, + "algorithmId": "85B8701B36D0409F6E6DBB7880045659" + }, + "fixedInfoPartyU": { + "partyId": "169B2220017678A68DA19AE3A43F6955" + }, + "fixedInfoPartyV": { + "partyId": "C841B0340C60C5B492B648655363B88E", + "ephemeralData": "9DAFE03835C8718141D52E128821F0057B06965529D0AC9ED6188F0EE152BEA9BDD8FD72" + }, + "dkm": "7BDC301B165815B5C8EDA549EB6A711138B78DCB67B1E1A0EAAC2EFB3338FD9997AA3D130FEF653C4494F2B466B6710EF50A7A0BCBB069E842CC4B12198F0FE1ED6B5FCDECAB4111890B8B9F99D8FB24EF64F1A5AB3E95A1DE3DE3ADE136C006F1D4AF99BF2BCEC0EBC66082B2E9637E8B52C56EB169D297B8E74D309D816CC7" + }, + { + "tcId": 3083, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6569579D30320D2285040D5C7E1C50F", + "z": "7DFFA09FE99DAE70F2D6F1CDCB0B39A461907DAC7974BE17DD2655D019C0F865DAA04406", + "l": 1024, + "algorithmId": "5BEF1CC10656F67E17817413A9191E0B" + }, + "fixedInfoPartyU": { + "partyId": "FC2689AC131072197FF7C80416F5147B" + }, + "fixedInfoPartyV": { + "partyId": "BF773E3DB722A8CE21730DD538CC11F4", + "ephemeralData": "8D8BB5549934DCC8D52036F58207A544338FAAE4A187E646C2E05AB18B41DC5D798798FE" + }, + "dkm": "4495FCEC5E84B5AC676F739A65900FB6FBE92802C89C8EBF8EB08B01A12C1A4F22692C2A07AFAEEA20000770D9B627AD0E526BA12551C9B8B4262EAF6DD8271EFB1555D24F8357A3E04A365B82BE6303AF4D5F46BFC98F208BF2E325739FC4492C2F941A4BF003CD21CA4966742A55F7149DECFF212D174DF6DEEA3559D36C24" + }, + { + "tcId": 3084, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9ACC0A7F905BAB571D2BE896C5AD4526", + "z": "75945311B0EC80EDE0B6A5E8977C3B6D858D12AD9F748F45996017028FC0AFA1F13D433A", + "l": 1024, + "algorithmId": "C0ADB0B9CEEDDEBB6B11498C0DC31480" + }, + "fixedInfoPartyU": { + "partyId": "6DE3BB36C8D892887FC31E85771FBC73", + "ephemeralData": "26C9337F9D31AAEDCD560FFD784FFF15F3F02BFFFAF288AF2A82A2DFF9FC08A5C7FE2C47" + }, + "fixedInfoPartyV": { + "partyId": "9037CDE609D954407BA57D22B3CEAE95" + }, + "dkm": "041F409796A9D1CB431FC82C30CEAE2021334328FC8B41B52333A89DF3E44A5EEAD234858DFF7A6723C2C1D5EEDB7168A288D9A464A3AC47DC5CDF6F7542BE5976402404CE8CBA4C7CBF0D14DBB8C23C169FB57DC9C56CC7686E9CDFE5533049D4C7BD69DFF1F64AB9B9692BBA068503BBE92F5A5B64DCAC9289375101E6B63E" + }, + { + "tcId": 3085, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F021EC60579F485C2DB2E6E38E6F7BBF", + "z": "7B7E9E8E154A6BCB3A1CEE884F84BE81231ADEF85CAB138D2CA1332024AF6BD8FE25434F", + "l": 1024, + "algorithmId": "E8C038BFCE8EB001AAC36B82781B3B35" + }, + "fixedInfoPartyU": { + "partyId": "825F439D48A08544AF6D4ACC540FC112", + "ephemeralData": "2E9043C80C889DD34E030AD5503656C6CE36492F94EF9E8CE9B458754FEA75D6BE906FFE" + }, + "fixedInfoPartyV": { + "partyId": "F96EB4B0E7B8C6B9F25705254C3CBCED" + }, + "dkm": "9D6C9130F156CAD45EF4E52E7BD4DB1A1327871189CCE4E82FBB0C4FF4D509457340C035C6607A2C5D0135A75D0E8937F4DFBD86D3F4EDC247965D95E07334240B21C41C0B61F3ADA44B875DB88EA8CC8FCF358ABF82371252B1D227F65527CCF43F976786A9078A2F417CAFE6B005C4D5E8C13A499DACDBF6A913B25DE2A330" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 140, + "testType": "VAL", + "tests": [ + { + "tcId": 3086, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ACD97138AEF6DE48800F4157BE9F8923", + "z": "AA4BAE9D8DFF08634AC0D33CDDC3E743853EB52680F37BD0D7B8AC12B339FD7101", + "l": 1024, + "algorithmId": "4EE854517B1283BCE64C83DE50E45A01" + }, + "fixedInfoPartyU": { + "partyId": "2921FF1CC686E7E7DC119BAF56DF7A66" + }, + "fixedInfoPartyV": { + "partyId": "3022392AAD094FEE3D9EC5CE1689F429", + "ephemeralData": "9564ADBC2F074CC11941B49893C1B974D5D6E6642EF94C54F6E6D6A8D6E7D5AC1A" + }, + "dkm": "8299CEEA2B3C2A1B3A2659BF8EFB70F71D937C35E5C06731F7B73BC5DBFA0A324989DC06A8BEF080C9DBEDACFFF373B997A1CFEF9D28C379FFCD314823A26A502227B3278B15A5609FEDFCC3A84719587C6A576ABF8633366354863CF9B4AAD7D3C98CBE531C10E0CCD0BF6F440C8221753187BCEADB7F2264178E62C2F407FC" + }, + { + "tcId": 3087, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7169875F795FE28DB9569545251AAACB", + "z": "36EA83500144026D3021EC50CB987813936AE803D7303D3D54D54DF54AF18B9750", + "l": 1024, + "algorithmId": "34BB304E7DBC9D545BEAD8772B1B8EC4" + }, + "fixedInfoPartyU": { + "partyId": "98448239AA86411586680981A5A28E4B" + }, + "fixedInfoPartyV": { + "partyId": "1DC2738A8FC4C8015C2BF54C9B7AD176", + "ephemeralData": "8CC3CE8BF6A3407F497798FE98522AFA77FB5ADFFE84FAB80E47A48481B7A7B9EB" + }, + "dkm": "160364DBCB70547A53164BDE2E6D366C8C7C6F063DFA9C5584BDAFD6004765FA6A73F13205789A46CA33AFAD1D1B4E4FD522DCE7177B47E0CEF42701D098B6AFE5C5D2B519CBD472C47E62DD8F51E3E9A60255D86DAA11EF418A70FC28C5171FE9C5E42D02E49D83C80B2F9807A0E58DAE2BA30D79D7D3778BF46DAC705D51B8" + }, + { + "tcId": 3088, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F2C137C9226FD8BB196A61F0BD2C04EE", + "z": "EBCC646469A2A72BBD742E57D66C098D36C95F8F6166B0094A7D1680478A4B32F1", + "l": 1024, + "algorithmId": "D9B1FF14E325AC042E87D97A634527D6" + }, + "fixedInfoPartyU": { + "partyId": "782BB803B0E772AFEE6E9127B4E1F233" + }, + "fixedInfoPartyV": { + "partyId": "E4A4E51374D81CCCD604991B542E3CEC" + }, + "dkm": "175FD3A1654E0976D4E0BA03819A30B38376C0C364AA53922B7B81C08665F3CABD2FBA73A7B616C8E0D6424AA0FE00FC19B2B78FC99AF44E284EBF6FE0AECE73B9C7891B7FEDC2AB954689A34B2E2CE16FD45A2493C2E30C4FC12F1C7497891FB9DDA92A766F8A12D8607ACBD8AD2165170F7103C8133D3DF2E309E0927FD196" + }, + { + "tcId": 3089, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A69FE3EC62AD1E1A2F31FDB3B965801C", + "z": "5786CD3FD0E748083A990A3FC28E7E657B09631C9279ADBA985E3528456221364B", + "l": 1024, + "algorithmId": "D1DAE1267010F66ABAA27E0562386B96" + }, + "fixedInfoPartyU": { + "partyId": "BAFD9DB84FF921074BF38B78C0EF2569" + }, + "fixedInfoPartyV": { + "partyId": "26EC588D4EE03D28872B0BE4106586E7", + "ephemeralData": "280CC879FD134D5038C41985462146572B2C4A6B8149111EBB428ADA034874F728" + }, + "dkm": "0502379E620CC97E79D0E1B347335BA53D9E63DB57F7EE36057AFFD47F10B9B06D64FFD7A2FAF6521D17EA4E06C83C726912195ED96D097925D60DBE7B55A79819D31D03DC26D080908BFC6074326C84EB72984B1FB60466CB6AF65642A0723FD68BC30F0A252B97136802E34C00011E93C9A82521F743103CF3C377EADDC9D8" + }, + { + "tcId": 3090, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71B7DDDC15536CF2A2D2947A5FB6572B", + "z": "7FB82E561920F6E3EC0D18ADB304B0E64DB0470648D7E58365922E6602F62ED6CF", + "l": 1024, + "algorithmId": "0C22602ECAEA37960A6C6D8DE886BEA2" + }, + "fixedInfoPartyU": { + "partyId": "25EB5AFBAFF7FA2329C5092B3158FA78", + "ephemeralData": "FA0A89F05E21B390DBEBDD217EEE0CCF572D550E790E6F1E0A21BD22BDB32CF5C8" + }, + "fixedInfoPartyV": { + "partyId": "A2EBAA1A55EB21109BD8BACC8B388E76", + "ephemeralData": "7FC7E5C096F2006E5334148BA11C800313649519C39C6E2DD74118A72437DF8BA3" + }, + "dkm": "4845C587178C9A44A8CB67552E8C81029DDEE8FC4AE13A2707911ADF3B9B79C1A64F354A34ABF17E125351088FB3C480D94CAD34B06C9C70557508E847B84E02B2DA88A49EA997BCFFB6BBC54CA4F6F9E2436A98C06CA7E94244AFEDBF451749E04EEA74985CCABEADFCDD71964BEAE831CE5A2DFB702F896D7ABF445C0199DF" + }, + { + "tcId": 3091, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CCF4ED702AB1F1732111EFE7B39D16B", + "z": "6CD69EB92E022DFF1BF6BF0079833E1113AAD4ACE419F8DB02C0F932905B6CCEF1", + "l": 1024, + "algorithmId": "8A126C949D1F3B2475BCDA2144312D14" + }, + "fixedInfoPartyU": { + "partyId": "4A6A4DF826227979D739FAB600C6AB83" + }, + "fixedInfoPartyV": { + "partyId": "213D4991F7059140760FF1224C10C5EF", + "ephemeralData": "04E52FE8E034687689B7BA601FC5D8C92EB7C2B123CF9C87FFAB04175CAA0D0161" + }, + "dkm": "2259A3438EEEB73BE78A1A05B39456ED47D804880EA7601101D770101B4157774DE81BDAAFE176687A90CB1C612EC0C8861B64EDD025EBCE0DB97308109A4EC626783172F2830C9106839A947F0B704C3D1580D9285D65EFE29A043FC5310BD0AF627B44CE5B53261C3EDDACFE39C93D904C8CCB2A0EF42114BD76E5A5EACEF6" + }, + { + "tcId": 3092, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD9DE2C79C6010E97AAB4FDC823A4C3A", + "z": "1EBBF1BB11000F6A0BEDC02DA6EBFAAE929FB2BB1855EA6898936A0DB19EEC33FC", + "l": 1024, + "algorithmId": "19DFE28F1916BC9EB8577110F9E5B63D" + }, + "fixedInfoPartyU": { + "partyId": "5E2E62556574EAA7E22D6840F65C1C59", + "ephemeralData": "A2E108B5884B42FF09CD4551A8559EBF372E76DC816AFD4693FE72CF16B2E81809" + }, + "fixedInfoPartyV": { + "partyId": "FE0D25772F21ADF8EA4D426CD3D9B250" + }, + "dkm": "B9299BE300FBA2C1508332F45A0E11525AAFDCB37863242262B905E44B076A2A1D5361774EBED1E6CEC9E8E2B74C5F6D8FE865698701EE0726F2F54E8BBFE429EDA994B80AF7572DEE9E8573BEA64D3B18965A81F4A5AF7FF46B2697F914CAC0672A53EB9B35192AC5CD2FE10E7F550E2E3DBCC5F2C779A89F2CDABB91EA7B56" + }, + { + "tcId": 3093, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC67C3D22CF9E55584041CFC830F58CC", + "z": "0831B6137995D73197A7C64B50DAF1D270AB5B9FB39B3E206F568847410E78F859", + "l": 1024, + "algorithmId": "A6F13BCD3ADD6FF48940737A2DB59CC3" + }, + "fixedInfoPartyU": { + "partyId": "89B5D068DDDB13B9CF8564E3C3D5E111" + }, + "fixedInfoPartyV": { + "partyId": "0D6A5CDCF36F1076D0320E7C8DD100BC" + }, + "dkm": "96262066163B2DBE30D30E2955108792ED0B16B00D38F6E391BFC384E9AE010737C58357606CDFBE1D1F78A806A1153DDD906F35A21CCD4CCA0876C9CD847EE3C1702A4A66405173B7B4B830EC907B28214961A320168AED7A957FC357DF30F9D98CB1371FDDECB22A0B1A8F69A5D2DF69497339559E49BAC5F6F94F59874231" + }, + { + "tcId": 3094, + "kdfParameter": { + "kdfType": "oneStep", + "t": "237008B0B86D02044A41CFBE128EB868", + "z": "29EC1EAE16E832BFCBF3DCF9E19468F3A79120830592C37E70EC128600CD34EDA9", + "l": 1024, + "algorithmId": "3CDE17B2ED19B1976F412ADCE5A191D8" + }, + "fixedInfoPartyU": { + "partyId": "D64AD2CBE05341E5E40AF33D7D5838F6", + "ephemeralData": "03968483283EC16EC749E2D58DD381823560AB48ECFA7DF35091C8B3D0C4B3DAA5" + }, + "fixedInfoPartyV": { + "partyId": "A7F8F9E98DFFEDEC9084257BDAE5E35B", + "ephemeralData": "96C875DEBBE2E7A143FD5CBA86C66490F6E66ECC688AF262FC6AF8D0D403C85096" + }, + "dkm": "86AFC7E1E2B4FAB48BA64DEE2BCBE216FA0A4A42C9C248F6AE5A65422066E61BD6E35CC351EECE3F79B07396158A085698E709A3561C764CC1DFB543ED7187B0414743DE056112803AF84A31C96901FE5AE2358D98CF52B78A5DCB4ADD5B9B088DCA1D1D1A6C9950DA14F9A8A087AE6D44FCF0DC548E7AEFAF0CA9BC57B8D24D" + }, + { + "tcId": 3095, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82B22E177D022E33BFEBB95848468A85", + "z": "6BABA2B18CDCC5014CC71407D27D982E5585650842E6176418B2BB27830F4430A4", + "l": 1024, + "algorithmId": "8F59DB4FEF2B1DDABA2F8F0BF8C13780" + }, + "fixedInfoPartyU": { + "partyId": "C92A7D05A2F32F94CE5D0C4A971E4BA8", + "ephemeralData": "139B84462421D73EAE3B220BEE46BD997A6BC16625DF6281C37D1B9CB03595E828" + }, + "fixedInfoPartyV": { + "partyId": "31C86EEFFB8A861903AEF83615BA890F", + "ephemeralData": "EF0ECFBF409784D5430FA1445607DD15CBC7FC7C59FAC472865AC61C8E826DE38A" + }, + "dkm": "C4AD6A5B258C3A24E71EB4057698ED5E18FFD854A9B15CCB4CBCA13A750819928E0AF84847C1688F5353A44E557E1F618CA2A524E9EC6A2118FD3A98E7F9F2B4533A1AA19F4E131C208B5D8CF89C6533D1B44683C30D9EB9E4757F6CF7481F3E3D96ED4E93058890B3A21C564B273B7B261DB5FF4D76766ED48582862C975A86" + }, + { + "tcId": 3096, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEC4AB54B141719869AE515957450125", + "z": "1F191246B1C47A24B8FB39C419F9FE5EA1B7AD82B27AB35F271402FA4D36F4FD66", + "l": 1024, + "algorithmId": "AC2637470D13E4C567F7F336138E674D" + }, + "fixedInfoPartyU": { + "partyId": "C416B7339DFA2F31FE2B5EF04349A714" + }, + "fixedInfoPartyV": { + "partyId": "994DE1623E7F297DF8C4A2E5CBACF60F", + "ephemeralData": "03AC4ECEC0AB35734A85052E546C1C362700646C855E3F94E7FAD3FFB17463DB9D" + }, + "dkm": "0A008258EAC6A182E7F6CF66DF0C3DA2096B53508B53B4B1DEA924736F353A07624E4053DDBD644AEE008AAB27D5A81CBA5F93D6CBD0D17904E61F24268E42786CB8AC317D2AE5B8C456EBBE559A970226C1387AA78489E10C0E4ED5DDB41D8C79C7D723C0DCA12F4DE64C035B969468BEF7705A388A25E0A34FA33233504454" + }, + { + "tcId": 3097, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D07D2E493E0D99F413C617DA6AC4324C", + "z": "A7B6FBB970B9AC7A83EEF4FE4FC56EAE7EB069BA1D8B15FB101CFAE80DAF45E3E7", + "l": 1024, + "algorithmId": "BDA4E90D288024E544F77E53A08E4A06" + }, + "fixedInfoPartyU": { + "partyId": "3039F63B02DE59A73764B0F4A42A40B0", + "ephemeralData": "89728348EC15A5A88E09FD8A0B3F796CE45E0057AC413C922B56EFE880B7C09ABF" + }, + "fixedInfoPartyV": { + "partyId": "DE01FBF5281DC84D3A582FEFF661F913", + "ephemeralData": "37A4AD99E1DFC1BE04203CF4689F5E99B8C90EE26AD942D729B69C3551F0C08A56" + }, + "dkm": "EF43F0298B028B11646C105A201240DE848B72215D329A221E56645CAB5058FBB52813B5FA6EF73285BF69E34BEFA4518507DDB17EDF1DE8406E1F32EEF1C88865047DCD547599C7D1CBF4DDB6ABFEDA520F4BE72B980CB8F9C1649323D44C3E679E380F5A18DB23749481AEC4A63CD3E613E953388ABBEADF8B933E2053524E" + }, + { + "tcId": 3098, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C61EBC19155E562829119A7FD319AD2", + "z": "C4B27390A5FFDB3D88417A9B8AFCBC93721BC63B39285FA6B01354207B9D953FD4", + "l": 1024, + "algorithmId": "8F4F8545FAB0259E3421FBE53EC0195B" + }, + "fixedInfoPartyU": { + "partyId": "1F264968B9014C1D45B113B2F00525A4" + }, + "fixedInfoPartyV": { + "partyId": "AC32206E55443E1453C43981642F2D1E", + "ephemeralData": "0DCE2CAFF06CD59E9D40EC23608346726BE0B5F42087794E6DB60A80C02AC11595" + }, + "dkm": "33274314565A8ED926D337797614F63FC89F683DA61EE5C219F8C8CF0416512CB5E52494CCD27B58A326599E689F3589BC5717F6860B84269A7016867BCCAC019069FC66A068F55EDFBD7692CC9B479E7EB362F4DDCC5919B5391C1EE52CD1806C2CEDFC360E306A1C05EF5FE94D1BB9F21EBD986090A978285D5CA2D7A31252" + }, + { + "tcId": 3099, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3ADEC1469F7183801EE56EC09C6C4A2D", + "z": "7B3BA2D821496FB2C0C97C5424D09CB326AB49E5031C9FFE4A0D9B7CECAA4DCB53", + "l": 1024, + "algorithmId": "39FA6E85719259FCE87793CDEFD0A537" + }, + "fixedInfoPartyU": { + "partyId": "3A9A1BC8CFC1525FAEB14C4F21BA1D57", + "ephemeralData": "0FD496F7FABB02C422EB66D78A8EC8ABA1635C71EB520C3AEA844EFF160D249378" + }, + "fixedInfoPartyV": { + "partyId": "65E0745CA412659C6C1D416D170F605B", + "ephemeralData": "552150C5475472ED21AA69334C4C118F4238A3F38A93FD51EB382CA13BABD27027" + }, + "dkm": "17E63737945A19B29BBB595CB5029D24EB97C0802F0BEC102CEB8D8A70448A8FADFAFF85341B266F12EBE36FCB9F9094ED342DD083384AFC16A041542606C2CAB10518291A827F4D18F9BF41BC221069B4B462FBF36945FDBE2F22539E390ADEE882F89C0F832AF51B5D2608B7D8CDBE5A82633FFC6FBBACAF5FA55297DFDC13" + }, + { + "tcId": 3100, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF1D26F172834F445AB15690380241F9", + "z": "D4F5C4B1066962885118E87995CD5E8BD0823D494E4A1C031C032ADBDC47E34301", + "l": 1024, + "algorithmId": "DF613DE1B7ACF11BB52489B9A7E2026E" + }, + "fixedInfoPartyU": { + "partyId": "11FB0C66398C1CFF171D031A5A9DB5CC" + }, + "fixedInfoPartyV": { + "partyId": "273F6AFCC07854F5CA5B884A4FC766A2" + }, + "dkm": "F9289EFDF288ECA49BB05F162C6601814AC355F8462D01C4F03DB1B4ECBC3904B766FDB73CCD982A5A0986EC3015B93C07A9CD6736128A50A80871E8F1C7F9D1FE7CC13996DE26D594D8A46198C139C0603E0C067500A65F030005C99A59DB85EF273C0A71A02FCB275EE9DFB5BC0B230CE88823AF0402431B962B210515C032" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512" + } + }, + { + "tgId": 141, + "testType": "VAL", + "tests": [ + { + "tcId": 3101, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8D3CA86B58D4020CF456264018CE3827", + "z": "0B64279C33653236B20D011F6820ED35E87FC19819AA2F2E1E7F699761", + "l": 1024, + "algorithmId": "FB2131A24E03562EE47ADF6634918A8C" + }, + "fixedInfoPartyU": { + "partyId": "64A7FE2308F9DDA2C70AEC751A857821" + }, + "fixedInfoPartyV": { + "partyId": "CB06814B03652ADA2EA64CF0B315D60C", + "ephemeralData": "C4A5C19BEBDE2B30574E518F5C018B388F050841C558E24972653C20F8" + }, + "dkm": "05E9898883BAA7162D5F45F3E788103F5CB59DC5BB5D2BABF26E64A50C291BA8D90DB2F2244DD582948D69033EAFC28C667CC70B76CC15A2CA6647404558212614E1B40524E8517D0D39E5198976D0BDFA2B49D8ADAF590A3A890E215A41CC55BD6C2D4C56C857BC19CA4A8ADF1F01F26D632D737ADCD805B446020FB1A87FD5" + }, + { + "tcId": 3102, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B201613FADD8D55FE6203896BF89D8BE", + "z": "EC51A78A42F958BDC55CF6F89B47A6B2582309FDC9AF08C43DE633C1EE", + "l": 1024, + "algorithmId": "60A48001B55E8F56FDE3C42606706332" + }, + "fixedInfoPartyU": { + "partyId": "2F98F6D9CFF923BE4C3FC7AC8DF4BE35", + "ephemeralData": "8DFCD5DDFA66EBAC95143F94C3B71CB2A4396831ECA56B4712902FAD8D" + }, + "fixedInfoPartyV": { + "partyId": "D795BFE88977235C22FAFD44CAC0C6EC", + "ephemeralData": "8AC870669522B55F6FA86BFF176E713495C8C2E0671A59621617DD7019" + }, + "dkm": "0B762DF476DB0086CC8D790CE5D15FA48893EE0BF3097027B6BB5CF45D4F54709A7AEFD02C62CAD21785592A2B51493BF052AC47BD529BA96C15EEB32363D0081AB42E01B23A093D9079D58A9FD0685DD3EC54FF329A2B2948CE2C55CD30BF8B8BDE0D4BF851C7B2999B280E5A31DFB2BC03D2E0BAB5F54469BCF8825F4E22B4" + }, + { + "tcId": 3103, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA4795A1C6B6CE50F0A141BC1F89C747", + "z": "957BEBAB7646EA2A9FBEF2D2110BB230F8D1AB758A7A0C202F798DCF9E", + "l": 1024, + "algorithmId": "750FE51448675F515BC04B4A3B9B1887" + }, + "fixedInfoPartyU": { + "partyId": "9547940FBB2646955744AA6C18BBB9F9" + }, + "fixedInfoPartyV": { + "partyId": "9135840247E5745A88A3CFB4AB1C1FF7", + "ephemeralData": "105F36119018EA44EA5ECBB3A6B0A3959003CB8C7BB46D868BB9EFBC90" + }, + "dkm": "0AAAB8089690FB176F25488E851BEAE7A4FAABA15391C8578EAC509D9A63F6ACC59807D1E26E59995D50A6EDC77F18552CC531FAEDFAB668FDC58890246E7EA9710CC653E90F6BDFB4E483D23B21F532B3C176C7812BA008D7C7EF3CA63708A6385F984B678B1768855E07EA0687C91911D7DE3D96D718C1E37FC5C64934C565" + }, + { + "tcId": 3104, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9536361146D74306EE284BD66CB34EBC", + "z": "BFAD2D6B683555E2ED50D13F22A0E28C60EEEC382965BA1593BC05197D", + "l": 1024, + "algorithmId": "A1B9525D62C110646E2D96F1335A9081" + }, + "fixedInfoPartyU": { + "partyId": "5F9E424D93A70EFD4D43E52BD92D5DE6" + }, + "fixedInfoPartyV": { + "partyId": "0DE82753CFC49BA8E665D1243661798D" + }, + "dkm": "02AFAD97A78A681EFE9335DF88B8F948D9CAC93560D199A5DBFF0C3EC97CB2BACF68A42548E1E9406B22455DFCFDD2160F7AF7D23135346CBCF39BC10B72A429D99C88E866A8ACF42399402152AAFA9099935D05146F8439F2B4DD6805B472E14921939219EB766C75D4A43432E9B9FB7EB216298A2B5955BF732F254B848675" + }, + { + "tcId": 3105, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7BDC968C6E1CD05C78E2B568869FAFC1", + "z": "E9368FC6F34725F389D54604ACB502DD80A85111AA6570BF54CAF9DC99", + "l": 1024, + "algorithmId": "F31CE4CB233410763DC40607EC3FD5FD" + }, + "fixedInfoPartyU": { + "partyId": "6457DC3A3F019E52EAEE89B934E0B156", + "ephemeralData": "9544665ACA1354C774715F537B39308ED6B2B6A6F2064F87C167CE7EF7" + }, + "fixedInfoPartyV": { + "partyId": "38E3C72D902994826811CEB9E3CE174F" + }, + "dkm": "4E039BDD8A564FEFB311DAA5B30EF4D4F637FCFAFD5C27B511789CCD3B0A3EC1E028E25096936051D0F1E7BAE3875E59902EFC9703EAFC278002D7413587D59949087B9B81177990D76EB63D5E14B62FC45A678D2A295E19E7800E1CDF6448799D6C81DC18FDFF57DAEFA6BF1C5548FD1B73347416A238631F670AE451E3B161" + }, + { + "tcId": 3106, + "kdfParameter": { + "kdfType": "oneStep", + "t": "75F84013693464F57AB85ADB72E37CCB", + "z": "72FB9A9ED1A2B5ABAC33FD1F45489BA22FA97ED87E00B4517ED42F1507", + "l": 1024, + "algorithmId": "2744B7E9A50A3E4BA375A7608F1889FC" + }, + "fixedInfoPartyU": { + "partyId": "DB03F3E2C77AA86F87D39D94450B8F0B" + }, + "fixedInfoPartyV": { + "partyId": "B9B7DF038D605BC8C442F424ECC9524B" + }, + "dkm": "DE5A411D5FB58BBCF6C4968883192A886223CAB5AA1C19C7F1FB34852E29632198FEA0D4AFD6C7C09A5578CF5D7D1B191962D35DE3C82EB1EC5734A1C3AEFF284BC80582C4DBAF65319F09B5F5E2C739D1838DDB7ACEC5736F5C327C297542EF3028B7050453D460C9CEEB50E599C4D8061D849F1CC7410E37B7383537F8E4FA" + }, + { + "tcId": 3107, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9272AD5F39BC614D00471AAC3E77359F", + "z": "1045A3EC9CBE9545556B4D4D72195E752D33C50BEAF4F699C0962783B6", + "l": 1024, + "algorithmId": "2C62084E33E68D3A325ECDA6F1EDE4D9" + }, + "fixedInfoPartyU": { + "partyId": "55A053833F066CCBE0CB7C541A8DD325" + }, + "fixedInfoPartyV": { + "partyId": "B0F6D4F968EE713C065F12C7A302D7D3", + "ephemeralData": "77DC0A17142EC15D6D42CB188869F4F1D22C47E0A73893F9D8183838C5" + }, + "dkm": "5DA7CE90D0332D02852AC612A36BF71B2559DF9306B444D27811261E184B7BBC29072BB03B143C0F303CFE15916C2EBCD4E1FF33AD20A3FCE8DE9A24C9615EDC50D5E7AA91FD607E8C962703A81EC0857EB966BCD840832BA1B18B029786409ACF0BBFA6BB45762D0180D884D6DC53F34A3BFB05864F78657E96FD15275B19EF" + }, + { + "tcId": 3108, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AD1604E8B3F875FE99065B636685E64", + "z": "8CEF37AD650CD027744FE776228B0C5ADBC9F4C13E64A4466DF3D89462", + "l": 1024, + "algorithmId": "18BDE1E50C32839B620DCB779796F671" + }, + "fixedInfoPartyU": { + "partyId": "71F4F704B91EABCA0950A927B13A1382" + }, + "fixedInfoPartyV": { + "partyId": "B50EC08DCBC43A968279D769B47A050D", + "ephemeralData": "3D8C6F912FC13B18D774319F9F9BDC2F6F95C8CB5781BCB0B417B9ADBC" + }, + "dkm": "6B83891AA70F8D8482596DCC37A0D8F7D302DA07D25C524471DBE85FE586A9D1D48D28393C83D91D95D30731B72FE8E583D770E3F3F0BBE846B4AE2D3BB0D11C405B1F867829E17790D6F3695EF12905E67B48F8144EAA006BAD9BA87FC10B934E5E2885AA94F0BF87399845B94E3D95669954C9177C19731B041B65D8C54A1D" + }, + { + "tcId": 3109, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02F9D089F95D1B33C1D4B4F9896B81C5", + "z": "F7507C8661592260E3381C0F0636D21F81BE41FBF0A2C8ECB9B7CA316D", + "l": 1024, + "algorithmId": "5233AD4BDE2C469F9208556BAF48360D" + }, + "fixedInfoPartyU": { + "partyId": "73FE98C9B9D9997CE319712A4CCF080F", + "ephemeralData": "7E43758953B8AE567172F3E1AB78703255700F0C1FC1B37AF227481340" + }, + "fixedInfoPartyV": { + "partyId": "0A640B8B1B8E1CCF0768454BE624C81A" + }, + "dkm": "30E520224D004C09A42DCABA8B8B2C5CD851425173E4EF81AA34112424FC7B8495441177DD2FAC6057A306AA3B6FB51A227E208294FED786AC11DD4ABC5FE64F862BA8603E0CF95E40324FDEE33F964EAD8FB5A758E3098BD391A7AF14D9EA279351893FAC4982FFD937C1205F3F74B01701BCE0398E493A308DE28152CF7AE7" + }, + { + "tcId": 3110, + "kdfParameter": { + "kdfType": "oneStep", + "t": "953018787BFDD9C1E4056BB286C1E6B4", + "z": "116ECD7119D924813BC7467F1D256A4B3BD50D18154D5D711C4F2DD800", + "l": 1024, + "algorithmId": "B806AD1D13A796A21A260F488E561F45" + }, + "fixedInfoPartyU": { + "partyId": "5E99717489439CB77F441311668AA2AB" + }, + "fixedInfoPartyV": { + "partyId": "EEA4AB3653B47E5968D1F85DD86F75A9", + "ephemeralData": "2B9095B7FDB8A94D39FF57C8E97B8A10C73E03E366A625372A6E83766A" + }, + "dkm": "CE4B6206CB1D919B102260F8F65F0041F45797FA7232816E5ED1CF112878A2FFCA48A463929DAD5FCF5FB819722492FC1C769AFA121B073BFA1FBB4FD301BB54679963D06CBC5E449266A6D71190507CDCAE0964F9A5BA5552E96CC4AC6A443FE60F27E7CC9CAEB9EBB8DB49F0FCC04724F7F7135CAF6EA541242E040EB27D92" + }, + { + "tcId": 3111, + "kdfParameter": { + "kdfType": "oneStep", + "t": "557214C0EF6FB8A80CA99FCA80852FC5", + "z": "797DCB9612A3657B5AC576CF02182D746E5B4D4D502EC74EFC7349C533", + "l": 1024, + "algorithmId": "43827946A6D68DC5B304E83573A2BC42" + }, + "fixedInfoPartyU": { + "partyId": "517D2F566776470F308172801AB1F314", + "ephemeralData": "5DFF88F3E8AC01ED419B593BB54A836660A55FB8FBAD9DF0ED568A349D" + }, + "fixedInfoPartyV": { + "partyId": "21BA856D14022722F297F8C451E84B03" + }, + "dkm": "04FEE9DAA704429E82F6B40CE89AB2EFB3ED7D91BADEB095852429799F5D321B76D1CB0FDDB76033001A10F96070E7FDCC48BB181EA97411604B727FBC8B77752A86A2C84634650EE35ABDEA5F832BE0AB51DBDABC6FF9F4108FC5B78FF59AA9BD2E840243F5208FE29FBE90A941594CAE8085C279CCE1855F9BE6C57F8A68D9" + }, + { + "tcId": 3112, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CE379F0D26B6D51CF693F7FB1843B8E1", + "z": "12E746655E1482901154BD1EE13D2994366CF77CDE31B812DDA4DD6C3A", + "l": 1024, + "algorithmId": "096C04A650F27274AD11C9BD635BF20C" + }, + "fixedInfoPartyU": { + "partyId": "007F3911FFCF2BC7263A16243AD59FEA", + "ephemeralData": "55EEF21916EF7D113122DCF31FD0CB7845C9EAA9BCE2E1EF4579AC88BF" + }, + "fixedInfoPartyV": { + "partyId": "506C6857F3AFA5983BBEA636140357FF", + "ephemeralData": "2F2D4E86940DD10EB4E652BC8DF3FD2B63BC0AADF5DDA245F22F03B382" + }, + "dkm": "E0B56ADA5F2DC336246F7D6E83B08B41A577B797576BB1E61026E2B55D501FF29B11D6A90369D6F37670415EB61AA8375CB7353F6B37EC30B72F349B06E0673EE84DE1BE748ADE643B5B271E2F94169312F6681AE63D607F0356FC28C58476215532599A6BEA623C6BA0E3C433D2C1D930FB49C1EDB67A27F7C0214A4EF1962B" + }, + { + "tcId": 3113, + "kdfParameter": { + "kdfType": "oneStep", + "t": "30A8DAA626E588E69C243FA2DAE83E08", + "z": "BEF8270F9A3655EA8A8DA26F18743ADD3B8B7ECEB7F443CEAE7D23B898", + "l": 1024, + "algorithmId": "379AEA0CEDE5BE552E5D8AC4BE1F2036" + }, + "fixedInfoPartyU": { + "partyId": "DC2F3978BFA9B61B4DE853B4157B8836", + "ephemeralData": "E8DD5A17AE0A0A0CABE7EB6ACA4186FD83A5408113005294F4E99588DA" + }, + "fixedInfoPartyV": { + "partyId": "A7D2A11528F342BBA74FA8981BB3DEA4" + }, + "dkm": "8BD18D45E69F8349B3B17BAF0F2405CF6DEB61A14A0A6C75D80E086F5AE1D0716AC2FD11A95B7B55F1B4D0C41B94E36FF7058A9B183BEB82EBD8FDE7AFA3D80E5DD5B83C59CB2D5F078AEDCDFEC0311A55B8353CA125C7A49EFF074D2A311E6E11BF3B5A3E351ACD000122881CA7AE9A5EE29F4812E0779DC1DB1DDB2E4A4F10" + }, + { + "tcId": 3114, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3A87A6AE7BD959ACDDB30DDAEAC06AE", + "z": "51BB0D6F243C395F00F26711DCC9FE80D5A5642A93DC5AD9F33B170403", + "l": 1024, + "algorithmId": "35B9CCCFA774A5E328C60E51A83C006D" + }, + "fixedInfoPartyU": { + "partyId": "CBB21ACFACD4417EB4CAA3B1FC69BDDE" + }, + "fixedInfoPartyV": { + "partyId": "9ECC8416DACAA3C3B612580AF3961AF7", + "ephemeralData": "DA0000EE465665D45D25F377EE718645304692D05D1434DC23A9FB6CB4" + }, + "dkm": "5904A36AC2601207E36B6C20D3DC5594839C862A69EA1C1B9435949EB5CCAD10323108DA4DA59507238F2B41B66FE288107ECDB7C707A5A0C2A8ADE12C32FFEC2A520CCD8EB93736FAFC30AFE703FDB49BED94AAAE0C2F36DF8217BAF83909A7D772222CCA0FD4330E1C0EB26106BE7D319A3839A17384DDEA335F2B0201E95C" + }, + { + "tcId": 3115, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E4D501F6FAF2686894CD1DEF55E562A", + "z": "B09C25EAEFE23BF7058632894B4F0E7467EC4A402D8D3BCDFC985FF1B1", + "l": 1024, + "algorithmId": "B08E29395C228E490E8B2DA9DF99AF69" + }, + "fixedInfoPartyU": { + "partyId": "3315536E3698C86E2868CEE340F9EF1B" + }, + "fixedInfoPartyV": { + "partyId": "9D39D7BD69A0B62DB103B2BAF7D50173", + "ephemeralData": "BEC817B68EF53C6087AD569CC5641A84A366B3A4468FE8B7326FA5D985" + }, + "dkm": "205892BEBF372563EF53086FD2AE5B1DF1B144AEC32CDA5119FDE796C6AEF9F3E87335CE8D78BEA72A68CD840BAB05E8B4FB5D3B7D863CC86AF056B470CCFD70651007CC3C809C72AE4D2782762F692BB5299F57A8D8D1D442D380C717395E64241EFADFEA5CEA25057FF864006F19732E0F75AB4D8696CD82497A45808E031B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 142, + "testType": "VAL", + "tests": [ + { + "tcId": 3116, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23CF32048AEB7603D8C8840DF94092D4", + "z": "E8865F6A828165498F05D359AA50CE47C3A32AF8FDD07730DC1D729A129F", + "l": 1024, + "algorithmId": "0E862782BD8B67221C7272D66D5B4AE9" + }, + "fixedInfoPartyU": { + "partyId": "9D8B1029C961F8F0138C701D6797EF18" + }, + "fixedInfoPartyV": { + "partyId": "F0D1729BF034C80F1EFCD9593A1C2E3F" + }, + "dkm": "40CD4450F6E4C9560C443A0164BD3F49A1D3AE4640D9E7E8F2F18AB679AE8346106E8B7092D30786CCE2C234CAD0D6A409F8835F80D4216BFA07C836E66AFD4756E839251F17875DA462DA8E6DE6E6E9EFAE1B01B0EB71C4793EA3D0A142444676BB2D7E99B18BFAA95283D04FC22D50F06AB4D3FC8F339C880A948CE5264B5A" + }, + { + "tcId": 3117, + "kdfParameter": { + "kdfType": "oneStep", + "t": "15FEA3BE4088F299EA0B22BC6CD78D17", + "z": "31251A9E44B6138881BA6D967C88F51A73FDB3FE4F94B9255393455C8C0E", + "l": 1024, + "algorithmId": "D06729696505A579AA71AD0C372EC236" + }, + "fixedInfoPartyU": { + "partyId": "57246CD81E67C33C22CDDC56F0A7D6EC" + }, + "fixedInfoPartyV": { + "partyId": "930BB54E8E48048D5A900D42B792D725" + }, + "dkm": "69C5FD4A2CCBB26FD9383BA8DCB7CE8BC72F0FD9EED65B4FD7A7F4AF503932A690FECA3BC382D417068B7643FDC4E0C5C91B7797535DEFE31E20C8EC357C577CCCFBD65C6DA02B0C93D4458006E51C505B27DC7A7C5BFD4A2BF2D35C5CA4D8EAD411C9CD75DD860F5F46B79E4819C8FC910B044D3EDB53CC19E44DFDD667E229" + }, + { + "tcId": 3118, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07B7F90F65D1B4487834435687523453", + "z": "0100561ADB6A36AD71D42979613993CDA42A64540C4F89448E4D9BFFA212", + "l": 1024, + "algorithmId": "E9253BAA3705E442EA67D10B62539F7A" + }, + "fixedInfoPartyU": { + "partyId": "D0EF4937C9EFC59C8A3B0824FE2D49DB", + "ephemeralData": "390A39B3C5AE58C57F2B360B314E88ED737230C8F5A1338E80AD2C3DE7A3" + }, + "fixedInfoPartyV": { + "partyId": "5A721383CB9FC82DD4C36F768D9A4763", + "ephemeralData": "FC6097420379C57DFDE5968191672854CCE87EE521242299E318E9400251" + }, + "dkm": "03F9FFB250A84B5C4865CC065B8794B922B67530F88F19CBD65A64ABD26778903C3950332BDF8638D396D2F244422916814697EDE1DBFF16FB8BB22C83FEB723AB10CF6A3E2DA761C5691788118EE11A06F5C3A3E4EE86FA30345D77F20B2651D6A1F18E95FF8FE87741DC16B3BCC16BB4E1BCA84DB5769A245AFE97EAA4842A" + }, + { + "tcId": 3119, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46AC746FF3EF47E67158F28AC64476C7", + "z": "D74DC913F013998B2D48604AD5239DDC8891C25307E9AF750348E6AFEF57", + "l": 1024, + "algorithmId": "C1F497FB27430C1B1DCB3C10F9616B8B" + }, + "fixedInfoPartyU": { + "partyId": "959E83DD9401C4780DE80BCFFC5FA7AD" + }, + "fixedInfoPartyV": { + "partyId": "62ABEF58D316632AFE4C2999D0516B5D" + }, + "dkm": "1933E47021AAD44B9EC9E3B26683BCFCB5DC7150ADCBEAB3E34011FF5BEC517A70BF1255E0456AEE7ABDFDC6BF9BF70ECAE7C0D6553C2EFDBCA8AE6362577D4E8D0E075B1F1A50E4EC7027DF01FED6A2475F123B776087DCFE3429C554CAA070E33EDB83864FACC7E1EB3C3B64CD0EA856DF4E751F717D08CDC7E578B2625129" + }, + { + "tcId": 3120, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FDBC29BCFD18D3AC0533599758245B8", + "z": "74345F52E49EF9889A9D048C9D7A75E7168900F32529025AF49D315308E9", + "l": 1024, + "algorithmId": "C16DD619E339F4FE8D4305EC8CA4F22F" + }, + "fixedInfoPartyU": { + "partyId": "5341734C80EAC4233B8311F9CA193BF1", + "ephemeralData": "4E1D1AC87A3FF1D61CBFE7B833B4CEFBA2B993597F4ED1D635FD545BA524" + }, + "fixedInfoPartyV": { + "partyId": "A82992ABF84205F41FD8B92DAC4BB714" + }, + "dkm": "DEBA7D0F401A7C20881E2D2A609A39FB13B16EACB0EBF2CBDE85EB1C26E31DB5459A022026C764C5F518B0C2C8362BE570098A9B71B589EC148EA8149A097298BAF3E8421B5D58144E8586E004419FC6C68EC33480CDC27F60578F557A3B64AE04C416E0E2667D3D5D6691FF2EE3129154434C59F7B3C6D1C445AEBB8B4C287E" + }, + { + "tcId": 3121, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88915ACCA939FC18FC68AACDB0AB0BF7", + "z": "0B8909A9965233EB4B0FC05C9D7727B52510A7CF119F63D483B9DB921EF3", + "l": 1024, + "algorithmId": "803A3919E1CD035121B5C306C193BADD" + }, + "fixedInfoPartyU": { + "partyId": "C0DBBB10473674C75FA7FAED4571F755" + }, + "fixedInfoPartyV": { + "partyId": "D9CADA23885E33A779D1FD2E321147F3", + "ephemeralData": "A3D648C646CB9FFA27D978C1B6A991582F3AC78AE8D61880BA37CB36D7BB" + }, + "dkm": "E0C13A5BACD44B351BC1D25A9DF16874D57585AC7A3763FCDDDDA02E949E9BD7BEC3FD8802316CAE4D57E3A6219E27184B8C49EA4333258517E5BF31B84E90A79DD3D35D0E9A336B713200BCB5D43CCE42D8074FE01BD46A162B0A202C88A53E3DFA3383FFDBA41EF8CD6675AC4C5174F2EF5219BF452B8D66F79DA0A6EAFB05" + }, + { + "tcId": 3122, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC5053BBE8F2791F49A9A4A4A498BEE6", + "z": "EDEB67A2C5582705FECBE7451A1ED3B8BA7D440FF55883DAFA7BFC04A98B", + "l": 1024, + "algorithmId": "42C2F7343DF4B75F79D6DEE0C10E02CC" + }, + "fixedInfoPartyU": { + "partyId": "6495AF4B15E3EBC6C6F38BB217670CBE" + }, + "fixedInfoPartyV": { + "partyId": "977358B6A3DCA38C11690DA0C91FC065" + }, + "dkm": "62AFB45F6C6E23AC3C2F70D5D436B5EA6E81AF6E7F6601B85AD8C088B6C52B5B13A75399FC71153C8A1C5C56E9595AFDD7FFA6EEE37742449AD50EBC15017EB743D8F85D85B5864BE0E91D1C8AC7771A40FFFA1D4F37CB3FC9CCA6165DA784689257F99D343A7C51AF55424FC6D30F6E766A44EFEE44845C6D709A8C61112E19" + }, + { + "tcId": 3123, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D9454F819359A0F2459578CA5CB121D", + "z": "936BA429110F4A167B5A8C40B435D2358730093D288AFE8B16602EEBE6FC", + "l": 1024, + "algorithmId": "57E55D8D7E89951E4BCE75FA50309010" + }, + "fixedInfoPartyU": { + "partyId": "72514D0FBB4C6C395DFDA3007C00CA52", + "ephemeralData": "9BBF893047D97DE7C255E63BECE1CF666F1350A728D192BEB778E2BA0F4C" + }, + "fixedInfoPartyV": { + "partyId": "0D557B2EE94212DAD18550F4B8C46674" + }, + "dkm": "B3FBCECEC16625493444A344DF94ACA27BD3AF0364F01483B335BF3D97FF6078DDD7F8E6949A0ED346D734E150BB6A782002038936CC321AB176E9250F391367F34A90E218922EB97C1C4419F6025486B0CE51AB0D2031445C734E0318592FD972D7D402CE0EECCA6D0061616D9A892D50B3AC5D8C5CB460EC68C7131DE22D50" + }, + { + "tcId": 3124, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8280A633E4FA8D8496E6C2363ADFAC56", + "z": "8BB4496984FE83D21433E5213737AAD403C8213AA640405744F2FA488BA7", + "l": 1024, + "algorithmId": "0DFE3F31DBA3D60B9F6FAED7ED1BE546" + }, + "fixedInfoPartyU": { + "partyId": "C48890F99F54111A03F7A6332156656C" + }, + "fixedInfoPartyV": { + "partyId": "8B0EDB6DFCC4B8934E9A84FCAD4FB981", + "ephemeralData": "AC0733EDA0D3BBE070DE648FE7B639FA421A94900F1D33B22ECFA6CBD439" + }, + "dkm": "B3631B753FD921AED2ED45C886A842577A197A8F401B3BC01AE8F0C2E1D63A19BA3C45ADFB4669B69CD2589153DEA4748807C1F6A0D9AFFD5B2226C0541DB079A426E9735E372AF63ADBA62062FDAB47F72839E5126613F350C837F2705B106181F43ABEAEF38F611AF718A58262B5A0407C91B569F36C40D001219FCE980DA4" + }, + { + "tcId": 3125, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1AAF734EB1141FA62CB3CA83D59941C", + "z": "78C2222171AA2CB5D7F30301B23A4414AE13C568847C8D73411346DBF0D5", + "l": 1024, + "algorithmId": "AD87B43F40465A964664D4631BD47668" + }, + "fixedInfoPartyU": { + "partyId": "06D323C0CB21DB9940D84E6A94AF9F12", + "ephemeralData": "1727E22519FA6BC5447E15C97203CB5120A29BAE3AFDBEA6F681B0CD2C4B" + }, + "fixedInfoPartyV": { + "partyId": "A42A136CD509A890C8F5F5D522A45991", + "ephemeralData": "D7A90C20E13BD55B4A80F654A8E697C3D068B5616607D0F009B1BDFFCFBB" + }, + "dkm": "DF9A9C237A0015EA6C6BD68167A0609B168FD589B3EF2ED35DC714351D00F4D57855C307F04CDC78938A14DC2787404D1B19BB732E4760F5F07E2999C81AECBDDF1EC53D59253E9C24A611ED57C3EE556FB7B2FBE70E675BAAC228CD4D8C0DCD21FC89CE436557C802124B6669E171A8B023D2F7EFF5A29D9FF9054928A6876E" + }, + { + "tcId": 3126, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6D004C005BC9A3C4D24953A996900131", + "z": "6B741B1906FDE89E520A4EA65DF5E7E533E3FFEF616913B7D236B2019993", + "l": 1024, + "algorithmId": "EDF773692C45477E5AC63EBEDED9463C" + }, + "fixedInfoPartyU": { + "partyId": "4A64482D7C495FB74572D099D846325A", + "ephemeralData": "248D0446A6B074149A0AB9BD06FD9E9CB830B518FA4062B2A6A265E1BE91" + }, + "fixedInfoPartyV": { + "partyId": "9059D55875938BB706935C8816B28455", + "ephemeralData": "419525314FF70B3F30190294A51CD5AD5FFCB46DA9F7E490A6412FDEACA6" + }, + "dkm": "016AE4702FB603EBACB3E40DB52B678DE34456BAC27ED456B56244DA58278ADA01A0C6AF7E0A95E592289457191FC159D646A436E8919E14EC8407BDF725E65409EA9B4DD590B35A9A04E285137AF040F60E6FADEDBC23AF9083AB8E214713E24229694DCE44AAE1311B346F76F1DDB1737930A0EEC1092181FA426AC0C28B3F" + }, + { + "tcId": 3127, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CCB15D49CA0F72BEBBDA73BF9C252F7", + "z": "FBF652236C60799177E6B9109C2C8DE7C24C60782594565840C3CC512D3A", + "l": 1024, + "algorithmId": "9D6CEEBAAF1CE3584E9797494E571D21" + }, + "fixedInfoPartyU": { + "partyId": "5C2E16646CF9B6DA9F9C8D75A018427A" + }, + "fixedInfoPartyV": { + "partyId": "60061D566CD79BC3951204376F131068", + "ephemeralData": "8333C5F1B10B053D428BE342BACD044B7B127ABF5AC18CF05A4CAB4836AB" + }, + "dkm": "43A974A48DE6D9B2288F627063CDBC71BEA6499E9848755B703494EA2203FB7098FEC10DCDBE6E7C73CEEB607BD65F58C517B0E6FF1A3E52BFE15E5021CF1329086C5C6B3571D432A6E7DCBF42DA011CEFD58AD0A272C571228501731CDA9FEE371990CDF435A2DB6E485D36FDD9579A1C317658279676DCF681706F2A1EE4BF" + }, + { + "tcId": 3128, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FB12A0243903DD0098472C33BAFE439", + "z": "340A218F8042976BB9BF921F10746E0C9F507147131C0F4B2540A978A3D6", + "l": 1024, + "algorithmId": "A0E4CF17B3B93A56BBE7F197FD9E54C7" + }, + "fixedInfoPartyU": { + "partyId": "23B52620631671ADD5BAAA542A892CB8", + "ephemeralData": "E5DEC78D02FEC63F2FE7D790E576EA739A5D3FBF2C594DD32C536F0E524C" + }, + "fixedInfoPartyV": { + "partyId": "96FB7EFADDB50064345307E19EAC9F1B" + }, + "dkm": "84C445971B3D81B47B48EBF9F1669DB1DA2587C5D50BAB5F871D1D6C668F117290627878B72DB8791019919287252954E8670C43D1D87FC9F5C901DD9EC591820E00D300A4E89C37F2EC045C8AABD04FA54CA27FF036A3582A37967BB53BD03E11989A19BE1E403B6B5C3E9D69A4211DA422ED3FD36EBC3ADA9288BC8C67EA3D" + }, + { + "tcId": 3129, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1026567C345ACD3E52E67944C971462E", + "z": "FD93E1F98603C5F7CFCB9277C4CB3AAA2A1030701933B1F3E78A4C28DB8F", + "l": 1024, + "algorithmId": "E657E65ACDB74516F432EDAF38D9E93F" + }, + "fixedInfoPartyU": { + "partyId": "B5092A96C053475C0ABD7E3EA71EC078" + }, + "fixedInfoPartyV": { + "partyId": "1D11ED044963E4C04493DEB7691F2314", + "ephemeralData": "58C05A9A7E628BE1C19474BEE4434DBCCC380B3F3068C17C2BEB6911B0A1" + }, + "dkm": "AD41C45816DCB5A857EDC11DC90D364B58486A109751455AFA1D281883CC4D830987C169EC56298F7BB6FFA0F2B5239B6554C60DE243C64FB7006132835216131B912520F57E2DC81F797D63E38798EDB13D449F656C81902E6FF28C5CA1D67A344E1EB611D9A855093226B2765E6D5BA602F6DB0F35D8A173196AB70DB9822E" + }, + { + "tcId": 3130, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E33D63B3371108389BDBD241D6DF478D", + "z": "47CE5D3976D5F2DF08DC0D76D7857FC225AE331273AC16F9B6D1CA1E56D6", + "l": 1024, + "algorithmId": "883A0540399EE1BFC67EDF667212B1C4" + }, + "fixedInfoPartyU": { + "partyId": "A7C0CE2AC84DD7B670E7EA62BAA45B13", + "ephemeralData": "DD13BF9F201597D8C3F38EB66064489C7C5BF42B77CE072FEDDCB2924612" + }, + "fixedInfoPartyV": { + "partyId": "7BBB7294B3746E37953C1627882E3210", + "ephemeralData": "2E401A4828CF0C8555D2C5F966F0F3704DBB9DFA6E4FF918096EC67FB05A" + }, + "dkm": "BB7052131BE4642798ADF3E33616C6E5AA6308E90E5F9479F81E11EE1BFC9FFC85616C64F8D55CCB901C930398323FB2A904ED0106C303B33CBD0A3F337E44DF75A66F0E53607E20207BEF5E83CD2E3D48FC55C2ACFF024E61E9FEAA21D9E86F10B2AD42086B4BD9120A759B9AE6BE72313741042E5CF76DC7FC90B802D30D66" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 143, + "testType": "VAL", + "tests": [ + { + "tcId": 3131, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67E2CD93994AC719866E3226A62F9E91", + "z": "F7C7079CC7EC2684E5B67B3FBEBD62CA1084E75D4FA037B97DA7AF19EFCA0D26", + "l": 1024, + "algorithmId": "29AB667D38DD32C55AA1E78E06ACF217" + }, + "fixedInfoPartyU": { + "partyId": "32291E92EEECB2F6E210BC9C6F11764F" + }, + "fixedInfoPartyV": { + "partyId": "70B1E1E0C2F26BE457AA28241030CE3A" + }, + "dkm": "938540C1061499A8E511153072BA2643BA9118923737CB9D419AD18C20B9F6C33EC3E248ADEB8419287BDCCDF355B0E63E15F11522334469773B32A3126CD11F6AD5EE3874B9E1C6DF7A119D6F7192013769FBFDA11C839E618E9E25497E128BEAB42DC6D64D19C797DA2D8385F9E65665E9E734E643E16E1C3A2309309B533E" + }, + { + "tcId": 3132, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A3EF7823AA52875E027CED7F3AE95CE", + "z": "BA1350EA9EA0FF98027F306CB91461CD30BA05496FFCF045D971B30196986028", + "l": 1024, + "algorithmId": "0BE9B0C70BA4F4B1958B8FC616DFC0D0" + }, + "fixedInfoPartyU": { + "partyId": "7096B8D2E7ADD4231A09531867E379B6", + "ephemeralData": "68E03097829795F9577A175222CFB942DCF5EFD31202FD95E0F8BE85E3216C74" + }, + "fixedInfoPartyV": { + "partyId": "E5500806558387EABB30D6F2E4753030" + }, + "dkm": "7278A43D847E7FEE51679ADBBC5FD8B8D51DE198EC36EDE332FEBEA025B7A2D6209FA940D96871D2EC404DA4F9EFA16729A41D3AAE4E75758AA7D4DD45C2370E96009881730490E9D2640B36BE4A7A90DB71BCDAF6C48B6C32A042D7739DEC3A37DA052E19D1649AD4859969E0DC3FFD9740306F2432BC270410BA205C5A28FF" + }, + { + "tcId": 3133, + "kdfParameter": { + "kdfType": "oneStep", + "t": "57071393D16A26A7E28F7BE75D012774", + "z": "DD2AE7F817BDA4F140449559135543DDDB367A700CCCEE9F8AD43A9B3B6A619D", + "l": 1024, + "algorithmId": "97298E78D39DF0F1BDB8633E648780BC" + }, + "fixedInfoPartyU": { + "partyId": "2D7182AFF9BD77533AFCEE24173645E9" + }, + "fixedInfoPartyV": { + "partyId": "C4B891BD7CF649291D07FDF3BD50F48F" + }, + "dkm": "8F84EFA555ADF4127AF9C9F4D442D285CD20243D341A617008E347B74FBBA225A24512E19DA9DB92B4C91E0F03F3E052FEDF054006B027E444A1CA285AC83E8EF8EF1F5CD7896ADA16239B505A9FD0B504E29529163744B6F10E8BE3DE56E6D2A83533CDEBBFA6C8E0A6FFF87AFC0D2A5999D1DF4D02A7CAB20E351242045B38" + }, + { + "tcId": 3134, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1C26F3DBF9D6CDFE6E4FAD78DB06A09", + "z": "248C8429D8EC5702AE10C53AF00068782CB010E576F129712361BDA303156E2E", + "l": 1024, + "algorithmId": "53FA1AFC763D1393C943C645CC3EE6A9" + }, + "fixedInfoPartyU": { + "partyId": "CF006E09AE1B8C084BAFF6058D484B51", + "ephemeralData": "5794A562A9ADE8B4B9822722C89924CD9DEDFA89D04B01665D69B7D16FD44770" + }, + "fixedInfoPartyV": { + "partyId": "927F7B63F49E30DF9380B5B83CB81C1D", + "ephemeralData": "6939558D88F2E905A318E5B0416DB3F46DC0FABF0AE9BA1AC549990667493B11" + }, + "dkm": "0D5449072C5422A1FDD2FEF7550D5C5666F346058844DBD0241F2D0BB931B82DA7D4FA4115D077219A77D7E9D612CA8B85B5213E2375B7CFE7C9C84AAE8A82A8ABAC1FA4B9B3E1D9085270098E80979DF43225395E7E6BDF68E194ABFCCEFAC31CB470C2109EDE05F38EF55B2E25578CA6ED89ABE8B9880AA063CC94DE52DA2D" + }, + { + "tcId": 3135, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA96025319D4AC325C7C943757609E66", + "z": "67DADA2C7FE28736F1DF43FD2D2FEED617FD163AE8961139FC5E6B144C53150D", + "l": 1024, + "algorithmId": "9B3C810F4AC1656A2DF3002C14E4B285" + }, + "fixedInfoPartyU": { + "partyId": "1B2293FE261E6340FA87EF2DF93DE7CF", + "ephemeralData": "65A2F3B92499ED3567E6E903D952192E375FCFDE898D166236CADC68D26442BC" + }, + "fixedInfoPartyV": { + "partyId": "946171F9D9CBC3720B669576976FD0C6", + "ephemeralData": "8BC46E0D1E406647B399C1C7600EC228736F7CA5437B9DFC5CD3AB41CF7ACFEE" + }, + "dkm": "C2D2034E5C9B3E42095B6E721F3C7C7BE2897DC0490275F96E382E10C88E4E9C6DDAB47AC8187BF6345ABC38065C4618D002B854A3B2D1A8EB54331AB577EDB7182314B9796096D1ADB4AF1A581F9B0052F98F4ECE450D195480ABEC3DD66CBB01C99F235F6F9251A48C2DCFFCB37572C3B24438F84CD9DCD60BBE6D7847132A" + }, + { + "tcId": 3136, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C75A5BCBE2B6BE5D4C82BB874576D8EC", + "z": "ED9208BFC15E0C7C0462A69A3125B8E45AA9B9718148D82CAD54CA021C61DAA1", + "l": 1024, + "algorithmId": "A445B5807FF84C20860ED87377CB58DB" + }, + "fixedInfoPartyU": { + "partyId": "019C796837BEECE6005FB7354E5C30F1", + "ephemeralData": "E25DB720F8AC96C1A0BE95D2FE7F178E955A683DD1C7B760DA6A2EDE99CC6CEA" + }, + "fixedInfoPartyV": { + "partyId": "84A82E97FFD474F202122BEEC0371818" + }, + "dkm": "57F2D40175D62E8F658DD2DDECF5E7BB8CDE39FCF87F5943D719B868BA4DFD59C8819E467E2DDCF9133B98B94EB0EB82248F77A894B1FDA81BE9F2D9AADF48E55F11982F6310C848FEF228F8488FE258A0A45C72888A78F1247B074B40242046DD2A1BF3CAA949F79E0B302E5534EF40AEC922BC2DC5030AD194A14DEF4F9D6F" + }, + { + "tcId": 3137, + "kdfParameter": { + "kdfType": "oneStep", + "t": "31DAE692EE6DF3B4433CFB3C54A11318", + "z": "C57DA7522EDE5EFBBBD369011EB25D15F650437863772B586AD60FB20F79B53E", + "l": 1024, + "algorithmId": "DCA24435A2DBA9AC0F95BF2193A237B6" + }, + "fixedInfoPartyU": { + "partyId": "71CBD98310FB363C092A92CA8064A9CF" + }, + "fixedInfoPartyV": { + "partyId": "AEB118A8305313BEE2D430BC3434D877" + }, + "dkm": "03160BBA44A662A21F295EBB265EF1E663B03A90452B97A5991A5C6424EE11FCDE3D79624CEC05AE5F56466B5EF45D019305AFD6A128943C0178EB0ADE449D84512FDA251F0F3210DEAEB22015F3CE409860EF9C7EA2903B4B0FD9BBE35FA0F550F750EEDAB69051477422AD87B749D4E9C35826B8BAA0E86F565190F86232CD" + }, + { + "tcId": 3138, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B84ED9EE1CD8E17637DF02D114E5FEE4", + "z": "B3D2D12D04B6724D090648EBE68F319A398A773080A5FA0D77767898DAACCC38", + "l": 1024, + "algorithmId": "B825348FD7BEDA8DC1EE06E62CAA2D0C" + }, + "fixedInfoPartyU": { + "partyId": "FF075E5DD6076D876B1F4A88C29F068C", + "ephemeralData": "6BEFAC30417E5F23114FB1C7D72AF4F1283C4A71C2258DA2C6F0CC674ABD829E" + }, + "fixedInfoPartyV": { + "partyId": "2315A8F9BDE5FCAF3A2469154E8EADB6", + "ephemeralData": "497B1892CBCB28F0CF8812EDBBC40CBA9DF596AE4E0726AB32ED8F27DC6A6BAD" + }, + "dkm": "C2CDA95493BC0FC6CB181DA5809B5DA5540A9DD06F80EDD92ADF98709DBF0954D59572B64473AC1EB236DACDD659F9BBFBCD55B3B788537AB60F98F29AAF8BA7AA7FF0D4E87F0BA175993EEA7F2A88A7238D9F2A8DFD3C203152139DDCC4CE19C2F8F3FEBD518F8B043ABFBA3868C9B56C87DF858A31CC9088B8AB05F24ABAA5" + }, + { + "tcId": 3139, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9DAEB00142A5A1331F419B88C75A92E2", + "z": "7B175836C0C00D23FFA7E7CDEE2DC5B918D7F2985AF0851904269B072681AB32", + "l": 1024, + "algorithmId": "1F8DDA1C6C96A32B189BDB62F42C659A" + }, + "fixedInfoPartyU": { + "partyId": "4086E7AA02AE556B471866587039F8F5" + }, + "fixedInfoPartyV": { + "partyId": "6EC0CE65DBFA0282044AD0BF823B888D", + "ephemeralData": "EE87056B1E63D66CEF2835F8DBD0A8F67F863C54A4397883E6AD53BF66B8A065" + }, + "dkm": "0432117188C4FCE466C727BF5FE26CBFB8EF4E4908D1292F5A719C5A24CAF29F63275873164C28061074390B7A590D9B6D813C0F115B3DF2564F47E66C7876D3112F80A107B3D36B30C70C32E3D9D839F123E942CCEEF7F1B45D1A237146ED451DAB58FA7AF7FEC21B7B8E7FCA9E8F124CCC03A7BE93C20A7A21624B1A93BDEB" + }, + { + "tcId": 3140, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A94C6C3E7DEE6B48A589373B9EAEF7B", + "z": "3343E79110770B37257681C635AD9F022904C13E4796D08C49B0CC4BD743F72B", + "l": 1024, + "algorithmId": "BE4393F15D10B7F906CF70F62B968FB9" + }, + "fixedInfoPartyU": { + "partyId": "F34C11FDA32DA13FAE726B4FFA32F522", + "ephemeralData": "BF2628D35325F5FE2D96D90A8F4824628DA4B7A05540A01D80A9545F1923E5B5" + }, + "fixedInfoPartyV": { + "partyId": "E99F5931CA327988A1C31A1F02DC2E83", + "ephemeralData": "56A5FBCCA79106A661486DA2DA71D1817AF5AD562F691AF54EDBD66404EC9A15" + }, + "dkm": "BF1EB1CC9C3B11F990F2C3D575684385E432C99337793E2F7205A20584AFDE7C56A24CC22D4EAA481B024B6A9F97CDF11FE319A5EC242E07096C8EA2B1585BBA4141FB4D8A27D795CF073B63EAD1404C489366C17CFD41DC10A2BABEB8C9B6C7E38954473C57FA5E995BCD7930E102AC99FAF388E6E1891A3E6FCA80658CFACA" + }, + { + "tcId": 3141, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EC8EDB0A806B7CF786D95596403A64E1", + "z": "9EF223625270934218E2FCAFCBE184D95948975C1841F3200B0267CC83281059", + "l": 1024, + "algorithmId": "27B835B753303279FDA3CDCF671A1B6E" + }, + "fixedInfoPartyU": { + "partyId": "5F2AC013A31F2E627A5B340DA6F944A4" + }, + "fixedInfoPartyV": { + "partyId": "00FDA9AFF738400F2E5D3CC2F986A611", + "ephemeralData": "2285B38322F3FD789B07E1A56C7C501E106982043FDC81696729A44BA19E1874" + }, + "dkm": "043B3201E57589660B23A6E12CE65A7DA9E885CD14E2F6BAF4F971B0EA2891F8291B974C0F060DB8AF68B2D90957EF351BD58CBF2B4DEEFDC1EF20444E3AA56598B8A205B4FD10CD2452D361E877564370FE916AAFAEF3D7D3748E8256D0C003D7D333CC08EA3340423B45D9D3386F8B0D5F1CB37C68BE74EFF95EAA9C1BA002" + }, + { + "tcId": 3142, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD7DED50CD1D2B48CF416C4B480599F2", + "z": "FA8784FB8F27B5DA485647C889DB901FFC441C41A3742370DF8F31AAC84F66B6", + "l": 1024, + "algorithmId": "B8DAA344640F85E8D85218BB70841CB5" + }, + "fixedInfoPartyU": { + "partyId": "2C8E9EF828D8250AC00E1153DDAD5208" + }, + "fixedInfoPartyV": { + "partyId": "9BEBE4FF09F4EE07106FF5F312BFAD20" + }, + "dkm": "ABB9FEB01E9A0305393229C7FBB437E93C5DB5DB22C21E621FA405C6B2BD8235A8CF109692943AA8BFA026BE9BB1697857C5C1713DA4E7969D378363AF08F3B9CF38893AF9946736DB135553D69368F1ADA7EBCACF3E2E5E535F848765E7A77EC5ED3076BD4B5BC311357BA7CC529D5A1ABC38BF5313E6C7A14042704B39B9DD" + }, + { + "tcId": 3143, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CD34EA0CEC7A75C03C0FF6A2013CF7C", + "z": "DA3F6A3B37E90A81F2521E516A0ABDBF46A6D9B1143670ABB77638C0CB1C7B89", + "l": 1024, + "algorithmId": "80461305108F9D28DF3903DE460E42F1" + }, + "fixedInfoPartyU": { + "partyId": "8352ABC8F9755C5844C07BF78A8732CA", + "ephemeralData": "B8D62959A9F511C6FC444F1B517E4A5C31407C3F4EB5492A286A0B6843E20E80" + }, + "fixedInfoPartyV": { + "partyId": "E019F50B32CC611D2761965C5BBA3565", + "ephemeralData": "F8D0F01283B93456E9C5D4E4C109E8FC7201CFC015567DE6CA31E531D3606CC8" + }, + "dkm": "EB52F978640A2F2C45FC55D2EE80501630EDE09E50EF498BA605EC8FDD83792EBCA9153078B3C835BEA5828E9E09F5BF07ED678007385FD168284D6B8E53BB57EB01AF48AA98916AB7E606700458ABD78B64F0AC1F3AE0E87408BACAECB508F99E65EC61D99B53785BF94363EFD02B18BFE80BE559E0BD05E13FCF5A691424AC" + }, + { + "tcId": 3144, + "kdfParameter": { + "kdfType": "oneStep", + "t": "66C51D7CAB661D6B30205F1705292E5B", + "z": "B417D18638E598E303D6CD566C7500BCCB8E0FA1D6A78D2EC4760775D37620FF", + "l": 1024, + "algorithmId": "E668373AAF0F7ED2937DED5550C90362" + }, + "fixedInfoPartyU": { + "partyId": "5B8F49B889D665B8537095C11AAFA8B8", + "ephemeralData": "09994A4CF6F0B4218F270A745FF81DF2765D3D3E22DCF0734A321059A87BEF9B" + }, + "fixedInfoPartyV": { + "partyId": "28793194A44ECF7C985F0C9BE2EBA889", + "ephemeralData": "3AEFFB82BBA4E25FBEE6DB7A519698D35628FD3C1FA586EBC7901BFC972BC512" + }, + "dkm": "6DC2B8F04C7D6E66E91B0CF87A62DFEC161FD8185B143DC26CC4F58BDF2F0D64593AE67D3AEA82249A5956631B743A5FDCB89152D95947C8984C48C7CA24EBCAF8AF111CB16F3B1273E13FB858A367FCF8723112CEB82912E0E94E70E93A52EE58E20DF30FBF9D779744C388E0238B85065C33EB186B0E59D751A6CB6BFEE2C3" + }, + { + "tcId": 3145, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E040576B85565499C1CCD331B04B9A1", + "z": "8524E2F7FCA823E353D1A6805611B133E997BD235E776C1B789620B2F4795064", + "l": 1024, + "algorithmId": "8D836E941782B9CB2C195827DA3F3A34" + }, + "fixedInfoPartyU": { + "partyId": "9D63F07E49D857D481E2C41D456BF3B5", + "ephemeralData": "3E2DE98F46129A354D51D8524045768933E2A9238E07A0E9758D24954E46A260" + }, + "fixedInfoPartyV": { + "partyId": "AEB0F2DA2433CFDECF1F7770BEA2F3F3", + "ephemeralData": "E943722CA58361765711C32407309BC97300E54712FB19F851877A5D1E7AF516" + }, + "dkm": "F7B4E8F99C3B232C8F99CC7583189B8BE402D8316449F7F1ECCCC336CEB6AF4B25ED228FB4824ED79F39CE997226F20A7B610617A3441B624F3C18C1509EACBB40C42A0D0DDCDCFE839DF8D12AE442A2673FF90428A8085DFC2D9119D67235B9F470DD0DA5D2445ADB0F8F0E8D874D596AF801D6FDFCCF2D5568D06DECCE45F6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 144, + "testType": "VAL", + "tests": [ + { + "tcId": 3146, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2DC21BE01B1E5A5D83A6CCA4C114763F", + "z": "B5DF72B0B22F2D64BEF352255C887B51816CB4E736C192F5949E877A", + "l": 1024, + "algorithmId": "B044D3575C5BE89CBAC8230F3CF6577F" + }, + "fixedInfoPartyU": { + "partyId": "EFDADDB5ACBAAF34D0E22E2580DAAC05" + }, + "fixedInfoPartyV": { + "partyId": "B383E3EC574CC804288DF6C1D1E23224", + "ephemeralData": "956521584CB543E3FD408C524052860847987527B898235CEBD93A31" + }, + "dkm": "C0848352701FEFA2752795BBC9E6201417AB7DF6A0C8343CE3D1DA7FE1F021787C0CB37EBC297109C80C1AFA21294F8429E07702415EAEB22DD137755D23CF37F7449CA0A0469ED5DEF58AE5B5545309AF831B10387EC89F005E305D920D54339ABCD1C8A180C594BCF90F0DBD1B2D708F60ABBBB55E27C629D789864EA433B7" + }, + { + "tcId": 3147, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7533FEDDED0CDC26DC7F019D505D1F4C", + "z": "70392C000C6D793CA566C2350616C8E6088B2A3D461973C1FCF82B96", + "l": 1024, + "algorithmId": "21D05B974186D5D7CE0F7D4C6009800D" + }, + "fixedInfoPartyU": { + "partyId": "73121705D960D3636BAA10A1D8F02270", + "ephemeralData": "6161A3AA1ED566B33A1BD6A93994FBECBE1D398E971BB806C65EF677" + }, + "fixedInfoPartyV": { + "partyId": "D71341D56969AADB368996FA6624A08D" + }, + "dkm": "0D7655198BF3EA512982D04CC8BB1797934EE48CE453D311189134E91C416C6B720AA327A39EFC6D2BABD1639D45EAF3F7D70B55F4F692AC7BA910C0F6EC68B79998E1BB0541BE1B3FB21D5163E49867EF9B57270FA92FE86C35FDFFF9AC424731A09729009518BB322B861F9B45871778E61DB565F5058953895828708403BC" + }, + { + "tcId": 3148, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6FA906EF584C04D4E458CDDC53701DA", + "z": "1DDC0285B15FFD6760D1D33988BB19577FF0FFBA170C23CCD4A6C199", + "l": 1024, + "algorithmId": "CAC5755C06373AE32A85F4DE2A51CB3E" + }, + "fixedInfoPartyU": { + "partyId": "DD0A20F4B6FDF0CE9B6D614052BC9070" + }, + "fixedInfoPartyV": { + "partyId": "47CA4FF5619C6E9ABF9ABCFB0533F7C6" + }, + "dkm": "0346C502746F42F2F45D160481861A7162A302C039439191794142545CAB59835CBA71BBE7A4EFBB32D434962712DC377674290F000AE7D6EB16D42A9765FE7F3B5B648057BD0FD2C054A86B8A0DEECE9810A68095617943A3453EEB9FF244AAAAF3169D3C942066E49DEC48F1ABEDA20DA7326CA2C62B825AE2C5002ABA2D1D" + }, + { + "tcId": 3149, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5540414599930A521E33F97F59BA8BFF", + "z": "60B6F553ED2EBA2D9F8037E1AE681C70F203CC5542502518BF4536F0", + "l": 1024, + "algorithmId": "DCBC847D5A907C7E7C90EA61448CBA77" + }, + "fixedInfoPartyU": { + "partyId": "CE5259AC12963D9E18E63B3C3C37F757" + }, + "fixedInfoPartyV": { + "partyId": "FAD6F76828A74D89B3C785AE87EEEA7D", + "ephemeralData": "3EEDB2896F71A8D004830A396D7AAE097CE6D6466A7DF87A78790F09" + }, + "dkm": "F114659E4832F96817D2051AE656CB029819F01C20923B22A3492FFFE676115712CBD50C72072E9F0E0430D56FC1F51651126643B07CC9A5E8D0B85943997C8996AE1650593FFE83D828E4246F5D18C3B7317BDF675889A93CD6DA4604868982849AA9456C79B297DB8A5F1D898772807FE956478512D85EAB361E43E7B67BB9" + }, + { + "tcId": 3150, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D3851967A9E57A841566142031EB1EA", + "z": "21F5B134CDF99A11B510F43CC8722A01C4CDDA45C34700F9A1322BEB", + "l": 1024, + "algorithmId": "C0E17CD6A4ABDA9F148484BD31AB3325" + }, + "fixedInfoPartyU": { + "partyId": "045EC026AD7B9BF1169B7EA24D7E09E6" + }, + "fixedInfoPartyV": { + "partyId": "B4DA68C62B5E91114C2BD38F3687C340", + "ephemeralData": "3DED90015236573002A69BCC904CDB0158EF0B1C0B85FF731CBF9B78" + }, + "dkm": "371250537AB29C839A7F419E83F039E739630FE077404391F281843BABB2A43205FAC1D00578E1DE3D28FF8C690DCE051CE1A9A0ECA78E7D7ABF5C5E092B3F09F32D09BBB4A4BE1549F626EA1046FB4726E6033B5D4D40DA6CDB9863ADA499A00D18F660936B90D3A89BC982E05C1D423BCB513E34DA3C52478A7C5C6011DB82" + }, + { + "tcId": 3151, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D5C3C6BCA5F197F0712535878810E14B", + "z": "259690CD1B7DEE7D9B9B378E4C92942FE339E33B778FE2F9F6FE4330", + "l": 1024, + "algorithmId": "3BE51ED154C5600E6AADB7BD8601F351" + }, + "fixedInfoPartyU": { + "partyId": "A34D99526841EE1F8D23F09C47AE07C5" + }, + "fixedInfoPartyV": { + "partyId": "4C6928E2C64158282A8516A5055B4142", + "ephemeralData": "E198741D29F020203B4E8B1FD9A1E44833F59F2C04703F46F13434B1" + }, + "dkm": "7565CE8ED40570481B45825248F12AF943475CAC5DAD8B548DDEF627D2AF3D16C79ACC19DA362F6F572D41B1DDF28B45623F37DA5CE8CDCE809638757CB139C22145B8DBB5A1EB7AC08852BDB20C97844D3A4C67000277A425885B8480FCA1940F34A70ABB21A8C5768313C34285EA970A473A9A7B4BD6DD4BB5689F71E5ACD7" + }, + { + "tcId": 3152, + "kdfParameter": { + "kdfType": "oneStep", + "t": "700046E136BFF8D01EBF1DCFE78EA371", + "z": "C636B2505E69505423BC85082DE6AEE69EF5F0D68E8F8E7356DF91DB", + "l": 1024, + "algorithmId": "0B21679CBA2A30C4F2F788BF06D1107B" + }, + "fixedInfoPartyU": { + "partyId": "DE110013E297CB880ADFBA2F7D11C1C9", + "ephemeralData": "ED3DA4DBCE2C6F77DF15C5C858C00580288A1BDC8A5C2D9211223820" + }, + "fixedInfoPartyV": { + "partyId": "9E53F3B49336B4137A30368B3F5410DA" + }, + "dkm": "364BF8E19EF9F11B561BBC390844C03406E329D32153E57FA26E82F2ABADC9F100BB4964E179DE400A9727C8B45F0F6F9C23E8A92BA67CDD75EA6F45C058F97E2304CDDF331BE9E4BB851AB758FE12337B56A7566E60BC9F30CC3889B2B6DA99BD8BE53A7E6397E9DC9E9602FA1410FD4AF6A0E4EB7543D56B12896B347774C3" + }, + { + "tcId": 3153, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D0ED4A73246B3C20343A9D1B942E8A4", + "z": "DEB64B65254ACA2861C924214DF731A45252DD92FD4B2333276D4236", + "l": 1024, + "algorithmId": "52AAC0EAF3F6445B141C9D92794EA8CE" + }, + "fixedInfoPartyU": { + "partyId": "F426449D811E8352A8BCB936866DEA56" + }, + "fixedInfoPartyV": { + "partyId": "6CE8C248F76C14AC0B8310F8BC905EF1" + }, + "dkm": "2994B5EEA22B8D664A384932CFCF15088DCC2322A2FF208556B0D59AA67816339B3CBF2CB9BBE627CA147EB0DC5B1F87EB92B40EC497C711BA132F510DCBAA920A61F53FE9AD8A46389787B337FE9204B822B0F42A23E7C54A49D0299054363EF2DABB6EADB1247BCFAA58EE25D385BCEFC97C2B19CD3A4F176638DBAD22740A" + }, + { + "tcId": 3154, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2ABE88A84E7DC6321815545A7623899D", + "z": "493703AE1ADEAFCB46D20540D5C614F73B3739F8F03CDE4A5CA3E02D", + "l": 1024, + "algorithmId": "076DAF696D5AC4CFBF02A910691BC36E" + }, + "fixedInfoPartyU": { + "partyId": "217E324CBEBD100C884030064616B42B", + "ephemeralData": "4830C83DD4C735F02244C5F2A746AE88017D5E77B5A30DA7FF1D20D9" + }, + "fixedInfoPartyV": { + "partyId": "D18E9173A7834A19E2D4FDBD3199FA14", + "ephemeralData": "41A88D64D98B444BC47DA15ADDDFC14959A32DFE3A6D591776628386" + }, + "dkm": "071C7EE29F3250AB7DF280A0AEDE688FA4EC193D4A7602815EA64A854019FFFE8BAEBE31B517822CBA521DD569E20227794A59B3D211B00ADA3A147DB0E61CEA27266CE939D98D0F6559D024E5FD3BEB0283FBB7F6EEBEAB8C8408932AA9AAAA3A36C762A6DCAC19E6358A2ABA536F69A0CD800E5B2517C49DBDC2226B21EE5B" + }, + { + "tcId": 3155, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7E4309366252D57D6E79139E9015871E", + "z": "95DF0F83D6A8E615FC61925476F2AE7971381DE1BD37FF385A2E29F7", + "l": 1024, + "algorithmId": "AE8FB79F94845D1C96F65B6B5C7DFDE9" + }, + "fixedInfoPartyU": { + "partyId": "80AE584F1F763488759C0619125F9309" + }, + "fixedInfoPartyV": { + "partyId": "1F29D75881116847A8A40DDBE3CEF508" + }, + "dkm": "017F88A3BCC51D599548F7A548D22E271EB2E74F14BE56B223F4248AD20E66CF4D5D9DBCFE60DC02B05547436F36A46D6C1BC524A81E3D35D6606B2508E59F585927B1EC4731CF2BBAF92B10F1D5338CFFC42EB7EEAC33738CBC63E6EFAEEFA5557517CE77F78D74EFAD3F74BE201B9D82380800D9BAE494E71F330C3A32B78C" + }, + { + "tcId": 3156, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F775E9897D003D061106D056E4A3DFE", + "z": "4DFB141C5CA43252EBB15F6E11E290F3BF00FD373C9B2693B595988C", + "l": 1024, + "algorithmId": "F050BE55FD84677450312C51CB752CC9" + }, + "fixedInfoPartyU": { + "partyId": "08360DA1D85C9A29BC7165EF15B89A5B", + "ephemeralData": "02D4E7251F8DCFEA459DE04D2B7F9938F459CC8BAD3828BF213F6E51" + }, + "fixedInfoPartyV": { + "partyId": "9963677F719C2CBBA6CAEF9CFC444AD9", + "ephemeralData": "442170D9CE48575D8741D43654D7FB20E08182C2982D53ACDD00F1C8" + }, + "dkm": "55D6198753906060D9C834F2248206BF44AAAA8F3A0328905477461585967F0AEF59D941BE18E1AE2CC74FB65AE5DE7BBB7B0F59EFE79D15B5D4C13103637F8B25AD1F643B3048F81A998F0C4CACD4B8F898C3653349A1D6FDF3BDE696763ABCADDC4FBFF9CB60381F6A3DB00E2C70CF4B3B8F149160C8C590A666CB4B0D7F41" + }, + { + "tcId": 3157, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56121E7A737B8405C85B83C414336616", + "z": "926A3F03E46F88070F9FC96EE7F58CAD01028E0C3F82C6BB387D461B", + "l": 1024, + "algorithmId": "9EC5FD4475AF7B5620EB48166F085E68" + }, + "fixedInfoPartyU": { + "partyId": "3608F3E350E38C7FFD59586837A678CC", + "ephemeralData": "E6E167F7325599CBE89372F05B7C3599D7924E037FB004948E781B59" + }, + "fixedInfoPartyV": { + "partyId": "0965B8F5733804F223A962397F132B4F" + }, + "dkm": "1643EFCB5DF17A6FC03805823966DF2EDCE39C597872EC93D5A512C343D5E06F694257FA7DC9C68D101DC9E5D9B99459BB0E5E3E755AD951825C4830592EFB91D4A8573B103539A58510B84B1D0A7A7965EEBF67EB8115BACEA15EE7154F3E5EE74196A4C36D3549AB88D46C7B62753F8D54370C9CDD2D5B8F98B05294A4DB68" + }, + { + "tcId": 3158, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5D781E25C902156911A743786513008", + "z": "D42E7BA7548D2BDFC700E4E98C370169642AF4C49730A7E3EC5C1961", + "l": 1024, + "algorithmId": "238392672CAD15F5194A8CF6840CC1C9" + }, + "fixedInfoPartyU": { + "partyId": "42C1B900603F97364DCBC83D7336EEFC", + "ephemeralData": "A45156E936A126B7BDD69B5B796745078C35050F81FD7303EA5427B5" + }, + "fixedInfoPartyV": { + "partyId": "C22EF2397BF9EADA54F10A4A6A25C79F", + "ephemeralData": "A1719E1353FD42CBDF48E15921AC001D868E9285EB1EA4E7D8522EC1" + }, + "dkm": "778D78788EE669C3B1473D95ED16B60DB952998A6FF0FC679A3EB5CC521719AFF7FE699A775901D1C01FE1F5822C8C9C0AB4AD11DB9D56EBA50975A7A8AD9690ACD641C1D9520E8A18916089F727B2C8179537CBE3E0C5D86EAEDFCE2C6D51C4CE19524695B041BA126165DE0CCF41E48DC6C7D9AF2E68034C915D90953D23C6" + }, + { + "tcId": 3159, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4287648C831766FD6035034A3C01BBE1", + "z": "8D77A6A50353FD74630C10C5BD3DF089C2603105ABB5990C6EC254B3", + "l": 1024, + "algorithmId": "1E108B34D07CF3AC9B9909F47407DB07" + }, + "fixedInfoPartyU": { + "partyId": "183656064712A2C9DF1C3A6C470E16F2", + "ephemeralData": "FE23F35ED34F561822EFB8272266C8BE01B5CD24577BBD59290CD773" + }, + "fixedInfoPartyV": { + "partyId": "6C48F0935998646ACE32603AC71E5CC5", + "ephemeralData": "1FC3B797955DC6EEAFC7927D9965CB39881C8AF6479DDE25ACD90BDD" + }, + "dkm": "5B7008983832814E1D9B4F5766906A70FE03D5DF6088154A05AA7801D8415B0E0E71D7FEFF7FBE88DF3117EDDFEF64E185C534AAE8B06193895B6F1D4DD1987B51B34E1D60FE0B595C8D0AF5F5DA63AB775757712145CA01C6A8BA5EE94B69F9A8D3BAA083747C6369FD25C50A06BC543F2129442F713865A55C4025080D5A21" + }, + { + "tcId": 3160, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5981E059CE159A4FA01C91C633E5AE12", + "z": "3441D37745C9B9DE8C96829B8364A44570F8EC1A4951857F039BBE63", + "l": 1024, + "algorithmId": "5986F09BDEBF4A6E46F63ECE907494D7" + }, + "fixedInfoPartyU": { + "partyId": "D9189C5D8DDA8355DC7B65C98DED2828" + }, + "fixedInfoPartyV": { + "partyId": "44AB8C55F5AA7BF44AD7339236AB5BAC" + }, + "dkm": "07F9D7ECBE9005607318895C2BD7CBA9BDD8FFFA185A86194FFFAB9C9E75A1CBC89DDD0517AE8381BFB127A01D9FD2705BEA6EAA8196C0B9623EC6D65D69A065AA704C6F83B055AB4730CF5F8668EE90A90456FA73FCDFBCD21017D302589027D431440D469288623E92F17E0DEF9DC3C791FDA3A3AC13BA212AE4BE792878A0" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 145, + "testType": "VAL", + "tests": [ + { + "tcId": 3161, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F3A9CC634570A40125E462C4623AAFDA", + "z": "4E6C5A426DB96A72788B2A85F0C19004F2A92443B453BD763F7414E2EF", + "l": 1024, + "algorithmId": "BBC6116FEAB5463F7967BE115B68521C" + }, + "fixedInfoPartyU": { + "partyId": "3E81ADE7F2637B51FD8DFBC29C731522", + "ephemeralData": "98C70A9FC303092F0CB02E9205501CFC075B777C7B1EA1DD54AE13FC33" + }, + "fixedInfoPartyV": { + "partyId": "157E477DD237CD9F585D0F317AE9C591", + "ephemeralData": "DEF6C465F8BEEDD5E08EB7E986DAD3B5EB10F2032E8E521BE1A1467E4A" + }, + "dkm": "96497AE7BA09E23192CF2E6E5E8903096CEBAD4FEC17794E227F295F05B11FC9424A69E339F87AB033D36FBF12EA19CCD3CDCA2598C69CC89F81A1F48F156D498DB5CD8F5DEE82121989FB75BD94F242A7F54CE966533B5E5A7964B5039CD4BA756C8E68EC0BC537C9977C063DDF66412C92009DDD1BD234201E745357F9CFF4" + }, + { + "tcId": 3162, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBAA7DB7F70A107320DB3EC7912C8634", + "z": "E2BBDEB0C6D73B4520802C4DA4D02A7584BBAA7326AD57A177B8DE4E5E", + "l": 1024, + "algorithmId": "D655E080A4E29CC2C0F5EDCC52D1A215" + }, + "fixedInfoPartyU": { + "partyId": "93536B7E2F925E9D01314616F24509FE", + "ephemeralData": "5199EE07CEF92E6DC9656A28CA9BC2C7F1071219AB295069533AE5FE9C" + }, + "fixedInfoPartyV": { + "partyId": "1F2D6AC8F49FAAA8D6E013A644E8DAA1" + }, + "dkm": "677914C5E3676700CE0E9227143562B8C4FFB7E7FCA3752D4ED3C2583610B2651B44874E3F1080D6A0AFBCE435F2A408AA48A9272E0379F46A63050641DA3A56AEF1CD7AC02A4BAD1A55E85D779E8CC88167D34D9D835565172D036C6A0A2E15E5FEA9EB40759DE92B7A07037F93E92748D671CE9ECC4157E86B554EBFD04DE0" + }, + { + "tcId": 3163, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27F6115E430F44AAFCA865EE69B3E0BE", + "z": "6993DC0536D20B02AA46D097EAE1AE368B46F0EC59E043B33A9E967DED", + "l": 1024, + "algorithmId": "95062A41CA825D8EBE0511E4A22C3797" + }, + "fixedInfoPartyU": { + "partyId": "E4E9ADF6EF2E71320181365B667C5FC1", + "ephemeralData": "0E009F6DC13E415AF404A5FABB5197F344F70EDB64F8E24DA34C853246" + }, + "fixedInfoPartyV": { + "partyId": "725AF66D9A121DB51AC5E8414CC80BCD" + }, + "dkm": "9162C3638FAD5164BD3D98458ACC2BFAE8807E8EE85F5E412B1F4D513C99FCD562A7F11EE2D068FBBABD5C2FC39760A6D0C0C83ADD675B728F8EB57CBEEEE2AFEBED1A83CF523A8CAF72A14BF7DAE3A0CCCECCFA18752F5F0082348FF74BB340F779948DB7ECC2E0971B553F40598CE11503B12AE66C2EA62727F3840BB671F8" + }, + { + "tcId": 3164, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A8C3BF57ED9A6CF352AEE1C5B247F133", + "z": "85A4F3CD0FC77F6A762FE76525D306289D4190A53FCB9655F96B24EB55", + "l": 1024, + "algorithmId": "3457F7B968E28012E3C1416C24D85A1F" + }, + "fixedInfoPartyU": { + "partyId": "694E889FD4A2A5459F045539BC538BD3" + }, + "fixedInfoPartyV": { + "partyId": "1C600966195F616CAD8C0C682FD14820" + }, + "dkm": "6BD43472DA9182EBB3304E4B703562A5D7D94085927CF1464CBD3B7F5080FC33168E5BE6A8603430C922554F9CF109308A3AEBD5B0F289612CAA54F0D853F257B1163DED9A82FAD35867145C73D6970CB1C432B35EDE54CC7AD5690EC3DB667356BF2502E65B7FC7D6E20E748C90BA35EE4C7FBCC4D4CF6528F78188DB853BE8" + }, + { + "tcId": 3165, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35DA919D24A4B06B517DCA5B9D2A31C8", + "z": "13689D3E2653DA61E2F3AF13E3D082C3C12AC3B706FA3799516497514D", + "l": 1024, + "algorithmId": "1C3EDD75268C17A81BD2B718088FA31E" + }, + "fixedInfoPartyU": { + "partyId": "07A39630FA2FCAD94623D9573D177DAE" + }, + "fixedInfoPartyV": { + "partyId": "CFFB133E4376EC52E6E28941D42EA88F" + }, + "dkm": "01B7EFBC8B2897A5A24A6D2D354181C01BAE88D74DF64471FCB418CCCFCF50F13A0C8D10A90049AC4F65BCEFBA70B0E1A08092B991A7736544D3061F352426EC4C40BF96DE9B6A1B09AA06BCEC69571590519E1D8631F28C06DC94817058CD93F2C149E0CA50BDCB925DF66CD32200DEB941ACC7D84568897956743DB8D392E5" + }, + { + "tcId": 3166, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73D5719D2007BF26546BA134DAB655B9", + "z": "BE3AB0F942B0A9BDB433DE2E63CC5D79B4A0EB918434AC9D5EDD661CFB", + "l": 1024, + "algorithmId": "85AE617DCD2E2551FDFCC5FAD74DAE52" + }, + "fixedInfoPartyU": { + "partyId": "B6A35682A81B27D0FA60D1BA4FDF5FDC" + }, + "fixedInfoPartyV": { + "partyId": "71EC659AB6723EBFA2926FBC3A61AD9F", + "ephemeralData": "44ED92FBAD4CF01F83D8025977FA0667328AC20792D1FCA7F9510B31A8" + }, + "dkm": "13E96AD286D96E3243FE3D90BAFF7469309A867ED4EB6861D681D53A53FAD98B3B2CBA59380156CC75B44463E7A2BD8E86159C68A6722B359EABD037BE5690133207FA7C9DBE24435A046F0338C4C03CCB1535804B9FDEFAF8159B4BEAB08E78E0080EA6568DE3EB43B07A2795E5A7E12AA674CCC5DD0D94D8A696892BE95FE8" + }, + { + "tcId": 3167, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B43F8B98F68A1928760B0040B8F9AA4F", + "z": "B9726A124CFC43097405456F298FF0FAA9435D2CB6D2A9506E81628584", + "l": 1024, + "algorithmId": "E6C993968BDDE3A6BA0D448B938857FD" + }, + "fixedInfoPartyU": { + "partyId": "A314012700FE774731110729A41A2217", + "ephemeralData": "0546F7E25DDEF2809F420A9F1837E65C3565427B3F394629CDFB292ECD" + }, + "fixedInfoPartyV": { + "partyId": "CF8CE96AD4F94ABE493B4585582E074D", + "ephemeralData": "6D115559EDAB17B00C1373F2340031EB9D4A3B4C276109620EC9171A11" + }, + "dkm": "3F56D21CA7F25DADEFAFDA6C770E66654A85C40C5400094C8BFE796E06DE2475D667724477E30B0BF0B3D72B80071AF919DE2DBBB0EEC8DD434975326EEF87D4505E470877B13A4BBEFD1F7A92D815C39A64DD995C9DC6A5441B6AD18E43C0505857C04D5559D2EDDFB6BA699ACD088446EB3F7383F202CCA0B6BB7623F3A7EC" + }, + { + "tcId": 3168, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA2665646D82F4EB5D6402222F5F4AD7", + "z": "588427B2D8B0202F0F3D75D35BCF154C41AD9D51E2B76FDA7BC720C428", + "l": 1024, + "algorithmId": "600212DE5075E4C807B5DB7812103DB3" + }, + "fixedInfoPartyU": { + "partyId": "65D14CA8DAFDE53BF21928CABD62A348", + "ephemeralData": "6378EE1FDDFB2476EF3AAD9A5FEBB3C8EE6FA4F89AE8EF9012B2DE9E1C" + }, + "fixedInfoPartyV": { + "partyId": "742F30D4721236A5A58896204B4EE367" + }, + "dkm": "099F057BD5038DA8C1BF3F9B72D91843498E5A5CCA375505AC192EC19D8479324E39B0C4B6B1A4BBFEFDE7012E3363CC0D149AB8B6E1746C245A926C74AB39B7F6D349BF43AE4D93E55E89866B67E23FA0E6B67D821D68AD8C5B7DABDA47C5FBD6FD2FB0C9877441796189879E50382198E9587A5E519A0BDF2884D0B6F3BD14" + }, + { + "tcId": 3169, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53C6390140025EB8CFF165A2FF3D7D45", + "z": "1E411381D3FF47AC46F978808A1F1E65AE6F0609783C7E68F0E49C4B19", + "l": 1024, + "algorithmId": "646869DBE09AFE32BB8920A0CC51C564" + }, + "fixedInfoPartyU": { + "partyId": "5F998600FEDD7483CD90C64738F9B948", + "ephemeralData": "FB9A0C06518E9F67370D4F301E3D546E109D036D0DCCC181B5E23F5321" + }, + "fixedInfoPartyV": { + "partyId": "8C593A6B3738923B01C060529FAE2545" + }, + "dkm": "086869AFF02DD3A27F25E4CDEFA5807340EC657ACE465890DF2AC63D19A08B2D9747B9884F716456EE4A9FE38A55182BEFDA909BA488179AED931F03FB7545B6B2B786A7981599C8019896DA74FA3044653D701C993374DE2E0DF3E34BA361C50590278CFB0A394B2A4487EA4B9DAFF438EF8EB7BFDD3C46921A1FD44AFD58AF" + }, + { + "tcId": 3170, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A30B13A2EC263F7F102C7375619227F", + "z": "DE76630E3E790E3DD46C78D5712DCE79A63D0C7D1416A2261B6C5661DD", + "l": 1024, + "algorithmId": "6FF5363E563A5B60F2D6A0DA5A004040" + }, + "fixedInfoPartyU": { + "partyId": "BABA420380595388DFDC78F02AAFB7A7" + }, + "fixedInfoPartyV": { + "partyId": "2BC30C2EDC539F75C43965BD94957E4B", + "ephemeralData": "0388D97B667552EA49E0E4C379BF54FBD1EC1E81E84DF200B5135DC56C" + }, + "dkm": "4EAFAFEA0781328BD174477337F70912E73AE381327E478E2EB86CF77264F4755F19C59D8BFC6271769DE1BB8DC04F48D94B4DBF92087A70759115457B8283507A2A2288206F80564CB6B4A537733076D8D1E4CAFC45CB61124613AA4769E0EF3DDAF79DD4708C6C3B794D3D463FB2682590DA62F9DC69F9488DC7FDE6F39A25" + }, + { + "tcId": 3171, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D600EFD1335505C1342AA1E41B1322D0", + "z": "7C67E3F6ED8E59BD6DF11ED513F9E94C9321F6B7BEE5D40B7CD990C1AC", + "l": 1024, + "algorithmId": "F025C0DA1CFB350FDB39D26CA52A1830" + }, + "fixedInfoPartyU": { + "partyId": "AB2D5D2D4DC5734C2F186F2434200905", + "ephemeralData": "A45861C7C9D0DC6EEDD5ADB8686D2886EC0268EE690ED0FC1F5C1C75A1" + }, + "fixedInfoPartyV": { + "partyId": "B080BB254F0DE5204A6D54E4E22B6040", + "ephemeralData": "86A0D24822BA31071F3C8E286A789A58924B98321BD580A4C4DF9DEC60" + }, + "dkm": "3E6AFFC37AA742C3A4B1F9DEDA8ED51C3E1B444999DCD6247077FFC546530E772E154D023AA1C4BC4806B8752B6FA0F343311D1A4FDD05A0D0A52855C0FC1D86D3980201C9BC4618354F2920C1077E0166B377E2B1DCAB923A004F1DC05AAFAF2EF1365C8AB180D9249DF115D9F817F7B3891B5733BCB6CF811339A3D4F7D202" + }, + { + "tcId": 3172, + "kdfParameter": { + "kdfType": "oneStep", + "t": "077568A4C18140A3BEF2F9625FD2E67C", + "z": "1D64A88F86AA428DC9D1D5A2560B40482A714BA1EF2F5ABCDB971A05C7", + "l": 1024, + "algorithmId": "D26D438DBDDB9F9008729EA54B4D78A3" + }, + "fixedInfoPartyU": { + "partyId": "AEC070A28CBFF6D62987F6D4292763B0", + "ephemeralData": "4515AB80E1B8515648243D3E11F5144C1170C3393EA493026A75005A93" + }, + "fixedInfoPartyV": { + "partyId": "C4BC9685946046A7634DFC05FB811D26", + "ephemeralData": "8FDDF76A92C64F0B74411C175E7D57E99448083D388A83319096ABAAC5" + }, + "dkm": "A55DFEDCC9C83819D565BD7E086B483FA7A1FD232E7CEC3633811B138E41BC9E03C0F6F427C147C716081F9063ACDA41078A13608134F4E4B346D8276D836999F1F61CD5DD4EFB0971A3D80565277D9AA7C125EC65943A5E502F3ED4EBB4B5D1CD13831D3A08E216A79B59CBCFD0E1120923F5269BD532E87553434910935CC5" + }, + { + "tcId": 3173, + "kdfParameter": { + "kdfType": "oneStep", + "t": "41866A54BC40A942A6409C6123CDB76C", + "z": "FF24170726CBEE329D66BD5F74592951792FDF1D52E2D56572285A6C5B", + "l": 1024, + "algorithmId": "90CE248654D2F7C15D9040CD5AAE6667" + }, + "fixedInfoPartyU": { + "partyId": "BD44D1EAE1071DA5CA19F991715609D3" + }, + "fixedInfoPartyV": { + "partyId": "B14E6B028E7E29A320ADF448E780F02D" + }, + "dkm": "1AF5E9021367CD0F05588EBDFEFA367AE65C18CED47FCCE752598F03A3861484EA5F947A8FECF2AFA8017D8E4E488F06BD65CADC9919E204D8F2B5B91D2CDBC3D3ACD70EBECD272EC1D877D70A8A3BDD72E50517C7065613AB433897FF58940B4A195C53D03E853D11018E94CF9CCBD691617D1F2F4A76A3CEC0FA9C82BACFE3" + }, + { + "tcId": 3174, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D50A07D870BEA0903D5149315DFE835B", + "z": "204F1438098D68D4214B74638FEE352A95B4085313842BF495CA723225", + "l": 1024, + "algorithmId": "BE2D9BE3D4BE1DAA196FDEF0A4765BD7" + }, + "fixedInfoPartyU": { + "partyId": "40DD497A5767286329B1AFE813A241FE" + }, + "fixedInfoPartyV": { + "partyId": "DBE05DC1E4C950B3BF9374E1CF6B65A8", + "ephemeralData": "44E75F34530ECC1C51E4AE906C4D8A8AA7F30D3B2BC5847BADA1661215" + }, + "dkm": "C9B3AFDA64DD9F7E22E4E53919F123FD95199EDD42E5DB14B959D1926E1A15EC713A5D076679F6FC148653468DE1137B209012A278C941043A579CA9B39774EE71AF86CE82158787FBCCF1AC052127D516EB47ED5395C86AE0BDB6EE3A215AA15CF64BA337337856588744E8B448E44A73263D8200AF9B7106BD9A07F6DF1E04" + }, + { + "tcId": 3175, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1655BCDBF5E6C54F59ED06A7AA6EF21", + "z": "EFB6DE8BF110942B3B4B7C410C66FB1D8D0208EE49862E0AC62E1A7FF3", + "l": 1024, + "algorithmId": "A25A6E6078752F6E37EC4E22328190E0" + }, + "fixedInfoPartyU": { + "partyId": "C77C3020C016DC2B53E085A4C9136A2C" + }, + "fixedInfoPartyV": { + "partyId": "782B3A3D0AEBC7951ADE8BB3F7703668" + }, + "dkm": "0657F08BEC97685DA6A1EF569604EBCB44C713346118CC96FE967B2FFA2C6C89FC9591C62EEA9E258F98AADAB44511866DE4811DCB74F14B97DAA1647EAE7AC465AF473EE19BE606E360ABDFFA78F1185502F61A272975B01C07C56F6DC71E52B8940D0119EE8956A3C7C947AD8DC1A3EAEDC676BF3695C81F1419802DDC674A" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 146, + "testType": "VAL", + "tests": [ + { + "tcId": 3176, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D3FDC74E766A7774F66365B53D4B6D86", + "z": "CDFB9DCDE71510C3026A908755A86F2CBCC9562E4228DCB76ED0E6C9", + "l": 1024, + "algorithmId": "660DDCB71085175944243C457093304C" + }, + "fixedInfoPartyU": { + "partyId": "5F0E0945AAAF9E0BD047B11992F6ADD1" + }, + "fixedInfoPartyV": { + "partyId": "E019A1E9D1B910FB5CBDEF14CE04CAA6" + }, + "dkm": "8F053DBFF94448BAF272E42FB442035C367C880680DE85DD1795735AA1F6BFC0948060D35A57CF0411CC2512ABCC90606FD8C963DB0609CCBFD54A7413DB8F23DF79AD1FD96938A9EEB148B5716D747B88CC867C43DE57697ECCA3FA7AF96BF4E361B5A26DE141E409DBF36D181281FC6F210ACC9A270DBAC7F6AB0AAAE1A22D" + }, + { + "tcId": 3177, + "kdfParameter": { + "kdfType": "oneStep", + "t": "95868D69D4A3099A009871DB62C6901D", + "z": "524EA6CCD6109763DB25B28BE08915B73498466EDAB06B25339D5D3F", + "l": 1024, + "algorithmId": "85473B56CAF08BBDE7FD8F5BE9A66447" + }, + "fixedInfoPartyU": { + "partyId": "95F3ECDFB260149EF88A5A04307D28EB" + }, + "fixedInfoPartyV": { + "partyId": "1C7E67C74CA831AB67B649C27F854863" + }, + "dkm": "B1C7B4800DC64DCA1E19FF612BF3B1A7E21638A83762C2802512D07C94200306E0C48BB662BDCAAD917734D00F9D550ED98CB5C667FA30A95636FE412BE8C1D588E3521F9F49AA51DC42933A4BBA13F36CD3BBD06A3F0775337C17E4D91498B61D070795834C75BB7A820A06EEEEE6B7F753850AE3D7383BF5FC93857DF3CFED" + }, + { + "tcId": 3178, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D05D82426F5BB341218E907FB5CC7980", + "z": "6C933B91A5775BF68326BB1B4DA6FEB9602BFA7AD4300E127B118590", + "l": 1024, + "algorithmId": "FBD0D5342AF27B2CBB4F4E20D55D2035" + }, + "fixedInfoPartyU": { + "partyId": "853BF74971E954C4AF9A221DA979E0F3" + }, + "fixedInfoPartyV": { + "partyId": "7BD6EA6C0D34D9D95C86530D0C42682E", + "ephemeralData": "6548444CF28CE55F51D36240F220FE3AB4D1C689F7649642818099E1" + }, + "dkm": "D0AF7AC7BA98A6186CFFB3B341F0285D821CC89366A2A3008DAB627D7C4A26CB003013CBF9365C58904BAEEF3584A7131087F793A814C5164419EDCC4753645717097237E87FE6195704E89DE988192E4F308BEF9A076F9BEDC3E07F5D5CDEDDA88C3C90E068FA1BA3A2591F2B90A77258485B95C3AF52D09A2B04991742E71B" + }, + { + "tcId": 3179, + "kdfParameter": { + "kdfType": "oneStep", + "t": "76C62101AF94285883D113E707792550", + "z": "79CB29CBCE0ECA766B6F6CF6841017B8B1F0C6E5AC15586A8E873DC9", + "l": 1024, + "algorithmId": "5E169D8D5CD83353E4808AA123AC9CE2" + }, + "fixedInfoPartyU": { + "partyId": "2122CD0FF8F488155092626C31E3D0F5", + "ephemeralData": "786E6EC0855645BEE314B69B8C40C3B92EFFFF5BB294B9101741CA1F" + }, + "fixedInfoPartyV": { + "partyId": "62117F4E17E5628A5EABAAEDA7A95B76" + }, + "dkm": "CA7A8BC1CE58896DA346386A9CED54372C5B36B98B803715614057F9261D15C5414253B42D626AC5E986654B42897D19AA3E694AE1860EAB3E6BA247E8DB89B40952A70A3C83DA47B3425F870DCFACD2D5B730924A40D54953346D9F39E6D253B6C8D658897030469E37448501AA36848AB679F112D5CA76025BC1D56DE8F964" + }, + { + "tcId": 3180, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9072A162744066BDA5FCE127BCFF3056", + "z": "4C583BE5EA6549D267D7C1651527A4604B78BD2E89E3A0D158268ECE", + "l": 1024, + "algorithmId": "E35E932CA3A32D0B9FA27EB215E0E2CC" + }, + "fixedInfoPartyU": { + "partyId": "698D754CB611056D9DD513BA693C2E3D", + "ephemeralData": "AF60A88ACF4D900E80004C974896723B2984BE0ACAA10E2B3E1944B0" + }, + "fixedInfoPartyV": { + "partyId": "54B09F9B1F120D3EF63581FBBB5C1B21" + }, + "dkm": "4B35FCCCA1219177F78E8E7B792E27F9F195D3405E82A64A1D69B4914550499585BAF54DA06995880FB54C9D0A4AA16C7211FF05FD74DA7F918EF9D733F3715EFD9926E0C8E767B1CF67E1A705FA3B16843F5D6A370106164A75AD74E0624FA08557A7E3DEC55F2B5C4BB3C7C608566117BD42F666090ECFF5DD2B024BC4EE99" + }, + { + "tcId": 3181, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3C3001BF3CF03D7A178B7D45339DA573", + "z": "63FB3B327F7AC3F9020E721AD53DA4C8C778C6720FEDFD753B3A0A38", + "l": 1024, + "algorithmId": "5378B53E5DDC0792B50740A17552BDFC" + }, + "fixedInfoPartyU": { + "partyId": "7EC18EB775DE3D7B3325A0D790F5CA50", + "ephemeralData": "93DD590A7F27EFE7D1A7BF89023909BA9074432DF34D221B00D54FC3" + }, + "fixedInfoPartyV": { + "partyId": "5DA99CA8A8346325EB6E7AFC026A4B99" + }, + "dkm": "D4672149F6E152D2A5F8DFDD3F2CE4EF47834C4415DCC4D8502816AE6D2492C8CA8ADC38AF043B9592FE2CA742D843DE7E390B8C37F486A3BEA24510D60994A171270A0F59CCAB6E229997118CA5C7840997DBB7ACE4B4BE1637C223C09CA177F379007F4F171524A096C0788CF92CE26B11BAAACDB872D36052B5628830C997" + }, + { + "tcId": 3182, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBF72C9388F38C3CF73FD449BA5C3D37", + "z": "211640F1A2B6BF51CB0BAD9D394D7DCC5C7598530EE244F8B90D0B5B", + "l": 1024, + "algorithmId": "94EAD08AD3B452582B1D39D19BECD960" + }, + "fixedInfoPartyU": { + "partyId": "A419BB0F9429111A8BC6C85B2C979445" + }, + "fixedInfoPartyV": { + "partyId": "44753F2A21A5B11B3BF4DE86F393EAEB" + }, + "dkm": "D522FB2D87291CF707F79C6B37BA57559C1486976A2BA15A6EA2D01C2C91809F5B30509253607BB728FD1FCC19DEE830417FC9D75FE7BF838BD57FEFF54C417710B1DC4CD6B01177941DD65C9EFED69C563FE481375A027F6254926D7DA84F4B9AB2D0568F2FA0DEE8E3D5C1EECA0358145A35CDF5EE4D8C90AA57AE0879DFCB" + }, + { + "tcId": 3183, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D7ADAF8031E04C6C299CB0B355B13D9", + "z": "D95ECCE5E2ED084DC194FD37F5730665EB50F1C3A69799F17510B332", + "l": 1024, + "algorithmId": "ED7215F1B8CDC98EBB8994DE258E7FAD" + }, + "fixedInfoPartyU": { + "partyId": "1972B47C3FFBFD053D86A04EB3C28675" + }, + "fixedInfoPartyV": { + "partyId": "3A258F2DC629DFB946FACB2890BF5CAD", + "ephemeralData": "5CC0956DC7BA4C499E6F3867D396984454013AF03580C59C9C2E3C31" + }, + "dkm": "9F0C76C8C4FA2E7BCCA20E28F1ED65DC5949784337EED07EE9DA5B1F90A17E5A9027924A117560A9B911BE01007A562F5B8EB7ECE0003CE5D623CFC37415F3EDFD214F857DDF18C6B641667A0C586865F181EB0E8201AA6D3D191DAF071B630CDE1B1BDE836C0631CDB541AA62AF6C66C9DB87ACB01B7D3E194E0A54B7F449C5" + }, + { + "tcId": 3184, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1776D50775AEF20A850101BB02D5B0D9", + "z": "9A5D73C14E7516C43634624105BA407D40CE678C4CD1C98DC154E67C", + "l": 1024, + "algorithmId": "D21A85BDB29927216043BB8D67F9C250" + }, + "fixedInfoPartyU": { + "partyId": "537588DE0F445931D73682B14B59CE0C", + "ephemeralData": "1DE7D4E30AFA8F820EBE40376B1A00067165523FA1A534A937C908C0" + }, + "fixedInfoPartyV": { + "partyId": "2F71A9B3996263946B001B22A03C5824", + "ephemeralData": "DED4D6AFFFEA4EC415E77D874CD553BF0D31B044B747A7A42A592A66" + }, + "dkm": "A6471C51FF5C3BC910ACCEE79050272C8267BD66911B7FD3550E82AE260804D8649295BE0F5466938C8596E214CF77C1434B32D0AEB79B878B65397D2D7A3AEE3B03970BE4FA7596D6C4848186A725028D361215DD188A693C974D17A1687CE04ECCC3461E945BCAF0F4DD7ABA752505576BF7DBA40DC87872267A7D2503E350" + }, + { + "tcId": 3185, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5ED0AFB6F44CD206EAF6DB967D75B019", + "z": "C298EE3FA061762C9C5A28B01C547D7980004AC8DA1301FF4F7BAAC0", + "l": 1024, + "algorithmId": "EEB82B7DE9759BD96C9607949FD8367C" + }, + "fixedInfoPartyU": { + "partyId": "4CB49A9C18EE69B0D32916CB2AB5A1BB", + "ephemeralData": "39476C815462B5D694271F51681110DB484A3133548E432F7D897076" + }, + "fixedInfoPartyV": { + "partyId": "E597D6275D8B440F7DC9C515C1910042" + }, + "dkm": "097A0A1BB510ABB7B4C934724317224EE6D6C30867913FFAD92946ADB8285D55BB91D2E641FFCDB19DCBE367A336E33C361F2DFBF429E338412A966569B858AFD48AC4D8C8381D46C431ED0BDFE551A612D1D29A2107CAA0C9D7019875B2FCF9577530EA234AF115A8420EC1DDB29474FC1E8B5CD29F557A41C93E0EADC0E196" + }, + { + "tcId": 3186, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9240B6E1D7994A21BD8FE9AFE439095E", + "z": "E3C0B6AAC34A89C9D11072DA179E3B3DC385F0DFBEF0173F10506073", + "l": 1024, + "algorithmId": "E9E9C11CCDDF25CD8C0BC52DE1733AAC" + }, + "fixedInfoPartyU": { + "partyId": "BF057B1946A9D870BB594DE416AB332C", + "ephemeralData": "C801A6E3E1F0DF6F45AC920C5788668D15EAC86EA66EFD81ABE67FCB" + }, + "fixedInfoPartyV": { + "partyId": "8475703C36AB38DA37DE5F8B844EB8CA", + "ephemeralData": "E7D47D51872D8A657AB6DBA6FBDAC8048EECF47A58E80CEE2172E3A5" + }, + "dkm": "7CDE9796DDF282346A465757ABAF599F305FFC939D88E1A30F3B6D7332AFB3257508A1E71986D813F47E20003356138C331EDCAFF33A85FEA27070C9F13F8CE54B45B3D08018A58BB0804547B7BF9B913EE3A18D9800ACD4652AB1314E572DCD7BD7FB4EA5141C5B57CFA370022973CCFB59E50750E9D4357C88E14C3A949191" + }, + { + "tcId": 3187, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32AC9EA6DA04A790E390114658CB0D9C", + "z": "A21DF25DBE41ED3E99D0288CFDD52BAE20C2193CC86713948FBDBC23", + "l": 1024, + "algorithmId": "DF8FE72B53A6F1728714B54AAED5EDCF" + }, + "fixedInfoPartyU": { + "partyId": "2D1C02A5884A00296F2F7444D4E139B0", + "ephemeralData": "DD8BD365FC3ADCEE380218C4F6A231FF7A36F313CD7D4E07D264356F" + }, + "fixedInfoPartyV": { + "partyId": "80310663EAA8D0B9BDEE6E14D13CF447", + "ephemeralData": "6FF43CE543916565B71F859FC2346C68FA9361F419EAE092A8CE29F4" + }, + "dkm": "063A717D032A68D6184DA9214BA1AC1238A42C49B6ABA76AFC3FCDB3A690424EC44063705E707237B0C30234306A4FA763D6F30CFC315332A3E5A3E4BDECA26916E62A6949C197AABEB01E96B76357EF033390CB6BC72D0FF6C5DBAC10B558DAF5C2574861556181F0D0E1F3C8C31DB46E8B47A9DBE4835853E1C724D8AD5D5B" + }, + { + "tcId": 3188, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99F2FC4669B92BB988D8E03A8AAF3B57", + "z": "F6E5922DDF6B62C1819BDAEE202D684C121E2193D0C73F752BE56C7B", + "l": 1024, + "algorithmId": "2EF6E76C83B62389A75DF38A1A4FE5F6" + }, + "fixedInfoPartyU": { + "partyId": "F32AFA078AA5C04EBE111C308C61F339" + }, + "fixedInfoPartyV": { + "partyId": "6AC22882991A379E5F8287D79CE02B32" + }, + "dkm": "D34FC29A6159833F2926C1EDCAB99204FFD0DF1E32307B1674C1451015EEFC34DB9EA658826AD50D9093F5AE088C172BC4D0D093778E98A0C8BD1199FAAEC25343C7F1BEC3E65009865B2D6408D7AE145A8CD5C542C8F6A2E34F87387B4F495C1371283AAC837CFD1547F43993CA62F1BB767B746C3512DD4434F3BC5C20DFD7" + }, + { + "tcId": 3189, + "kdfParameter": { + "kdfType": "oneStep", + "t": "90153893A39C280973EAB9D7EADCCA8E", + "z": "47A2C83E4D90F42E8A07CD7000465D5D13741EA52C02A1C392910972", + "l": 1024, + "algorithmId": "1B281AA684D6FB39D4BD2870AC3B2806" + }, + "fixedInfoPartyU": { + "partyId": "B844B0C8EC5896889D1246E501401A8B", + "ephemeralData": "74D978A84B162D72DD8BA1BAFFFB5344787D628B31C6339BE2AB16D6" + }, + "fixedInfoPartyV": { + "partyId": "E459D07AE7F065F6B16708D7B07EC11A" + }, + "dkm": "E04F19600565F3092D20B210BE0DB3B8C5B40D31108BFAADE88E8C601DD2B78DB4F605611D2D56E08134EFE8418D4BF74CE1AD9F81FB7916B78B8A98CB9C0E220FDEAC476EE2AB57B40C6FCEFBDB1E4943902E01CEEA70506D8D4A1E8BAE664F6C8FE9F358CF01ABC745A7EA4B0935CC91E697E05248F5C7A2FBA4CBA30C1318" + }, + { + "tcId": 3190, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02C4AF83B0C2D22EB3648643F1CD2626", + "z": "9BB67E2921EBF197A597F8E01473FC5D0626707DBC24407A12C81E93", + "l": 1024, + "algorithmId": "C4191BEBF59A1F16DFF87C6DE4318EA7" + }, + "fixedInfoPartyU": { + "partyId": "D2731001E54A0753CC61975B665B47BA", + "ephemeralData": "AED8C0A69AC5ABC01535028989FBE8A733A26B1E188BD0AE5E32555E" + }, + "fixedInfoPartyV": { + "partyId": "2C3C4ED0770C3C8428CBC1197D86A3B1", + "ephemeralData": "F54C05D31DE51A25E47B66DDF7EDB8978FB29FBC3E0E785B4E1EAB99" + }, + "dkm": "0D366D6274D1D1C64D233C520347677658D3C2237D9B418C1E677097A1519B7BE619EBA16189B1AE691FA4CE5394C632E425E25F392AD3FA01343714D3695B75F4059B35CFE187B0FA46E59123092D872CA7BDE30F85CCB4EC29731D22B7C0A2375531F58F5754B5B35339F96EF5C4490874F5A0411C6C2A7B1D1CFF4186F900" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 147, + "testType": "VAL", + "tests": [ + { + "tcId": 3191, + "kdfParameter": { + "kdfType": "oneStep", + "t": "21FF03EDBBF9E5918B4F9AA0A4C96349", + "z": "DA0B0523DF17FE5F8E3C481960940C3A56B01E4F0E0937CCF65168A974A329", + "l": 1024, + "algorithmId": "655D69CEF8C4BB30C8C6FF0871A34DF9" + }, + "fixedInfoPartyU": { + "partyId": "6CFF8C966DFC6CF8FCB3F52BCEA3BC2C" + }, + "fixedInfoPartyV": { + "partyId": "2CC6D37151AB1514EDD8E5A358AEBF8E" + }, + "dkm": "97097DB5C91A6CE5DA88D055CFBBA780C4DEAC1FF8655F9225D4432C5812CFC3370E091E9701B4906ADC09DCE99D6EE2F7161851782CE0C5B544E1F8DAB6B9BA6F95F6A4EAD288B967D5474B2114A67227F688B57D73589C3D73E2D74EFCDDCA7120BF7E4746524C280EF1DC915AD79D48DCDD844A2B84A5AA4F9C83C489CC91" + }, + { + "tcId": 3192, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96811AA17729D1A769E6AD80144D5ED4", + "z": "16D43074B7F8063D13B85B1C8CE6CECCE66B1997BFC879686644CA05F00957", + "l": 1024, + "algorithmId": "C4E01A21332B710FB84B59455F61ECEB" + }, + "fixedInfoPartyU": { + "partyId": "4F4EEEB89AE5F790FADB2917DC94EFF4" + }, + "fixedInfoPartyV": { + "partyId": "A538F28CD1FEB2F69E3A648DBBA95DEB", + "ephemeralData": "050428DC77203E5A8B675B2BD3887BA9B74F5A1E7625FBECF2A2CF8E84A7CA" + }, + "dkm": "769E8969209D78D595E3D0C1A0CB3729517935EC1FF63BD838A8951FB9BBB27FD70F2DCFA2F3B3A82D488021FE42470D9F1C16AC5145DDDC9A7DBBEA1AECB94615268A095AB17B5B75FA2DFE9517928AFE8203E7532F7153691ACC4C68519FB33C21BD1A4836484C3B18B733E14988A881B0A0AAB7C4D28D77B271F16CA84BC9" + }, + { + "tcId": 3193, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DEFD7ECD15C3E203B364A50B4D2945FD", + "z": "EF307477D72E3F321F92B2DC2ED5DF12402A6AC59074CD263072D5FC9256A5", + "l": 1024, + "algorithmId": "B515761648D36B57BC453859DBE2A4D8" + }, + "fixedInfoPartyU": { + "partyId": "499E15978003148BE018E4BFA2F56ED9", + "ephemeralData": "1D8712AFC7A2F5C62E80877557B6859DB1B99AA6BC5F37132C204FF836B1A1" + }, + "fixedInfoPartyV": { + "partyId": "F0395C85888FC94D89F6FAC3D5FEE5A0", + "ephemeralData": "6AA9F8F8AC092D8EA3EEE39CC01C42AF007C58AC036F822052D3475E12E251" + }, + "dkm": "50E1001EF0FE0954D7E446DFC96A7062AFE56D714037DCCF4E0B58D729297F3292CF0548DF1971AFF17BFC3B16C4C10B8B9DAB2FBC08B1C4E2DDFAC4B223D2CF2EEB9B6844B7A2040489D56197D9DE7073A69D670BDD7336B4D15A17F4A21E855390C97B3D12AD16E2F7E483DB2365D5865E0849B3423D830583DF075C607A49" + }, + { + "tcId": 3194, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D39884433CAE2784F7C95220FD2A666", + "z": "0A6682346A3402B4C8F924282A3BC8B48CABAA500416AE76D04199FFE3B17A", + "l": 1024, + "algorithmId": "9063FD5CB6D63A9F4F994C16E3837F4A" + }, + "fixedInfoPartyU": { + "partyId": "A42B910C605BD624F7631AAA3B880017", + "ephemeralData": "23BC98C95206446499E16F2150ED0B47F49BD664FC2EE98028105D096B1555" + }, + "fixedInfoPartyV": { + "partyId": "4D9267ECC1BA60EFB900FB6CDE9D8FD6" + }, + "dkm": "594EA0C1A176CC18D9938B7DC229C8E053523633DD18E4869DF079D0D0920738B396F011236F1EB7974C6CE78448CC6C3AAA8CE4A822C9C6D56F97DEF921DB3D213DC04BA28DDB87B1A204C18851A93D6C610F2D671490307CAC6D4BA92836428D495E9CFCA4EA778697DA9EB7B70C23CFED9D1B930E316F3B38C6CF215F8FE6" + }, + { + "tcId": 3195, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5D323A7D3C64A15ADE9F1F349BAA0C3", + "z": "60CD93BD74372948533112C53E11C1031111DF143D92FE3D8820E2F9472304", + "l": 1024, + "algorithmId": "2B42A76B2FA6BD9807A1590789E51239" + }, + "fixedInfoPartyU": { + "partyId": "CED4B4604B7D18A2494860482AC0EA74", + "ephemeralData": "93F2E595AD9BC878A3C9E61E2AC93230AACBACAACFFFD0D3D30DE59511C339" + }, + "fixedInfoPartyV": { + "partyId": "F69E78607856EDDC8FCABBD084706954", + "ephemeralData": "0042518F314D3A6774D9463B417A6BDDED3E6049CD98206F1DAFAAEB2E1AD2" + }, + "dkm": "0C6BD6583C83E02ACF757575B70E3570A717034D7718D27D9D737E5442999FE22E0B992C20791319F2E9D41EDCE5AD74D9E4644B798328805BCE0B7BC276C64FEB10B329ECBEBBBEF2E2495F58051FB161B0E70A391CF18B73B7E4A88EAE19E9819DE22E0DA5EF2D655B1AF039FEE88D83F5E612AA7C42545060028302A88C2F" + }, + { + "tcId": 3196, + "kdfParameter": { + "kdfType": "oneStep", + "t": "712A33C312823988C854C840F67153BE", + "z": "C5B0C1BA6BF88CF5FBEA88E58FE850D482181026CAE2F7680AA6E38441D048", + "l": 1024, + "algorithmId": "F19AD64A1592AF9F88C343F3F4C0E0BD" + }, + "fixedInfoPartyU": { + "partyId": "B72EFD5DFE0849170D15947ACC20846C", + "ephemeralData": "F79DEB7F9C77DA3B3F084BEFA15D1D46A74F3AEAF84CD45EE845A3DAC1ADB6" + }, + "fixedInfoPartyV": { + "partyId": "DD231D48A56E383EC9EBEE1304FC405D", + "ephemeralData": "1EF662DDB762943258934B3EAA9A54367268A82CFF866DAE24C88CA040B761" + }, + "dkm": "F052DE49B2CA31AE1FEFDD3F696B14A0FA05082CC20768A54863A3285B55EBB710B2572342297CEA5D1F123F172F00A024A2C87B71C855AE55E140EF13C9576BE58078933A879C2DB0971C141ECDC78CB919A6F99B1B9FD66F882AF7B0D1316F6EB952E78A61908E98E5D8B4A22868C1DF2EF46B37B2B51ED28ABF3D9D52C7F5" + }, + { + "tcId": 3197, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7731EE80BD4C6DC6B19B1CAFA5B54DA6", + "z": "C4B379E8F99567030FB852849E2D8551A2FE5EFEBFD1A86C77EEC084687B51", + "l": 1024, + "algorithmId": "554DBB95483147EE4570C556BF46031F" + }, + "fixedInfoPartyU": { + "partyId": "529C5CDDFC48D6B795C9531AF7BA1600", + "ephemeralData": "A731BC09ADE698BCFE8707A4E8BF0CF5F38EF42B1C656C9824AD4F5237FBCB" + }, + "fixedInfoPartyV": { + "partyId": "C36AACEDAE5F9568B0727C7D1D3242CB" + }, + "dkm": "7D299C6347383616CB3F3BE08098186E329C5926E260AA0B478F50A3354AEC76CAC39794F418F718F4045CC0CE70DAAD225D06D0129F6745814A4B5201DCD3B1EEE4607EC1DA9D8A80B7339599A86DB6E8D9F4D36B2CF3F7775AE51AD777C6015353A0A64D6EA357A66449B728533E15EA28A4DE75524A2228162A5218958898" + }, + { + "tcId": 3198, + "kdfParameter": { + "kdfType": "oneStep", + "t": "48C4FE317FC9E2E510E0594CEABCCE62", + "z": "F7A9D7FC13B3A4015486E245F1857C4CD925288C2284D77BA796CE008F7D33", + "l": 1024, + "algorithmId": "77C57F0623B8CCFF2828A1DFF8C4845B" + }, + "fixedInfoPartyU": { + "partyId": "E85337C8124027CCA9C5EF89F0700800" + }, + "fixedInfoPartyV": { + "partyId": "2EA3AA821A5B8E28AC667F0DAB027D09" + }, + "dkm": "7DE3F4E24B7B71A5895BA17909B0D3D4BC266B32D2AF5774C2154C223E52004A6860B24383BF1BF1BC588BAA9AB7E33387105A49F148650BE96C4C555BE3DC3A0A77BC7514E54F886BA50B0C713BBDB6753A937093DBE9C842BA69655F13BC21C2DB52983D19BC548D6F5F63AE9FCB298CEC89B737A51E8FD5CAA42CBF4BE8E6" + }, + { + "tcId": 3199, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EB08BD04DCE7CD823A06C51AE415BC3F", + "z": "7CD3FC1D805EA69D690163A175AE9059FCDD8216A23EC5E7148756D570269F", + "l": 1024, + "algorithmId": "CB4C5548110836EB81AFE4EB0399AC63" + }, + "fixedInfoPartyU": { + "partyId": "B8F023DB1F2DA8B77577E422721C2E2D" + }, + "fixedInfoPartyV": { + "partyId": "F1EAF606F72FD3BC9D886748564B8ED1" + }, + "dkm": "71A9F7F7575AAC5B1D341E1ACA4F4E4BA581099A2469D11680C0965635929DA24B8F4EE951C06FE53655E070E1DC0FC2F58DC153F5285390190B7D6E2FF5D10A5AAF58F0D4092AA8C95153B01B91450EC681D0246D0E415E790EB991F3911C2367960095A1C5787E250418179579F4E05A47505EA2F1AA0BF1C0E64E60A27BEC" + }, + { + "tcId": 3200, + "kdfParameter": { + "kdfType": "oneStep", + "t": "484B66CE525A70E8A38B8B7FBD950599", + "z": "945956EFD5892FA350684D6C4B737545E9FF885C30A98980799AB331189A9A", + "l": 1024, + "algorithmId": "D9AB35D3CA1C0C2A50D676A8D99FA3B8" + }, + "fixedInfoPartyU": { + "partyId": "B62F2DE525E730811AC1EEF73CD4C1C3" + }, + "fixedInfoPartyV": { + "partyId": "14919C27C3D1196E0C31715B3417D0C4" + }, + "dkm": "3E90434449615F3D8FEEC9FBAEEE7594878591A12D926AA31C5480A833AF626BEFCF555E424502376EB0971D985E02A8576419AD941821DB05E2A08F9D87E3F4E0831CD68733A2E39C6C6387469C6FFE3BC5851C9D1439A8B2C705A699F5AC9BA58B6D980B32617083B9CDA4E2DA3D4A5D1E9CF6F563645E7FCF5054FFAFE82B" + }, + { + "tcId": 3201, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B2AA948D230AE5BA0CEFD0B3E059B49", + "z": "44CAC041269853E5CD91815600C82ED9F2A83CD1651D16A4D8BE6A06D769CD", + "l": 1024, + "algorithmId": "F1FB1F16BE6906078D9DF0F0813921E2" + }, + "fixedInfoPartyU": { + "partyId": "64FC98ED2761C28B87F448ACF1CEDC5D", + "ephemeralData": "4CDF6920937540399145B76DF507D94BE49798D2B3F19C3C1AD4A980A456BC" + }, + "fixedInfoPartyV": { + "partyId": "F3B5415610B4B407B4C3266985723356", + "ephemeralData": "F73A3402B9ED5315257A11259E5CA4BDD2F94033406AC577FBF6079014DB7D" + }, + "dkm": "2F923570DB384F6E60E559D962166345730FC96A677F5AB1E44FA77D30B5EFDDCB70E242697A47A588DA2566C55C7B76757A9BE3B34194C9F4039BCB1CD61228C67B171C7D275EB56427D37E8BF804342A20EEF2E14838A94D447831F4FFEDDA975839937B26A87C4016D8ADAE3696F6A36501D3F4837C758AC85BBEF96566C2" + }, + { + "tcId": 3202, + "kdfParameter": { + "kdfType": "oneStep", + "t": "269D22D993919AEC1E83A30A3166329C", + "z": "A50B026CB2E1983D5BF3AF61CB402AD8410066933A0070A17EA8122E8B3A6D", + "l": 1024, + "algorithmId": "EBCA41CB58F7E29C7F9F93069EFF1CE0" + }, + "fixedInfoPartyU": { + "partyId": "B7F0690AC0C4B4F3D89BB590EBD0457A" + }, + "fixedInfoPartyV": { + "partyId": "649F11F630964DDF7A763B579868B858" + }, + "dkm": "0E461C17F89D0D8B0C187C19C099E29A984C1E97C81473EA4F84B9357F372EBF32BC81CFD642C430ABDE1C646723F4D84A1D65989726F6E3E45CCCE5F90730E58FD26A72B3DC2EDBF9840D1ACC7460547B3B830831B8806F7A1168DA683D856C8F33A96FC25C343DD8CE097EE8EC7A069B0E7DA523E34DE8E9C03926D4B86F9D" + }, + { + "tcId": 3203, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A77B14C6B95408C07FBC3D4559B89FA", + "z": "8B445B96DE38CD694B1F1D82A1169B7DC2144B352FAA4BAC5296E5CEF00109", + "l": 1024, + "algorithmId": "261C0B62981C5F2ED7AFF1D66A3FC92C" + }, + "fixedInfoPartyU": { + "partyId": "BBC593290AEF3664404D1B618E92E87D", + "ephemeralData": "D522142E4B3DD54D616085B94DB11F0651BBB8AC0187B5EA6CF50F35D0187D" + }, + "fixedInfoPartyV": { + "partyId": "AC934C94ACA425F26E56744219667C07", + "ephemeralData": "01CDB4E1935A43C9920FA25230F9B193D53DAAD25F82B61CF20278E20A039D" + }, + "dkm": "0E187726DF07253C3B3603DC49C89C9D364D5A2758FF3FFA9D845FDADFBD542A5850A24C88124CE1BACD69EC28117C6B28A09B38400CDE4AA06C2FEC6DEE46ED4F15A3C86EEEEA02FC8868EC94297034BDD9C3207A9F7DA6FD083ABF375B0BC20B71B02D2D072218DF22B8827CDA2E973B521972EBD25EC251AE945DEB6C8F23" + }, + { + "tcId": 3204, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D508C21DF997F08863A6C1788612BBE", + "z": "DD216E5D4F8C7676021F3A8265925A6436B5C5E1E1EB47D63F1D1F10C1C939", + "l": 1024, + "algorithmId": "BDEAE0D77F4A73DEFBC9820DEC1C5033" + }, + "fixedInfoPartyU": { + "partyId": "B39B157F33D8AFE5DFC60DA2643C2252", + "ephemeralData": "B1A8583F6DE2AF96220332967B04BE6A9FEEF4470D0C0D8EF533C4918169D9" + }, + "fixedInfoPartyV": { + "partyId": "F098B90094D547EF8D48687FB372E27A" + }, + "dkm": "7F6D6F48179765AD3B63781FA793C78D817011341BDEE4C05BCC640283A13747CA46A7BD035C5C2B953B71D84CD7F26BDFAAD10602C0B4617D136E8CB35F007CAABC0B6CF943A133BAE1F336502A1952E7A4AF472E0E18FD815FF9B102BE345FB7AE4E28487DD78859961D6CF496180FD2238CBA052C35D38E898A438F7D297A" + }, + { + "tcId": 3205, + "kdfParameter": { + "kdfType": "oneStep", + "t": "386E56FD10F2964B030C67C4E39AD561", + "z": "8E0BE09D7DF711D829C24488BFB9718E326C14F9218547FB7EB88B76964421", + "l": 1024, + "algorithmId": "4D0BDF9F91A7E5D78B1BD234C9FB1E40" + }, + "fixedInfoPartyU": { + "partyId": "EE13463E9C9F56A8C295495B706E7681", + "ephemeralData": "91EA25A53216F6DC45D7FBA582A0F73B1BE03A9365BD1A5EF4E597449E6364" + }, + "fixedInfoPartyV": { + "partyId": "6D2F2F8B40117A91E94A6C7C399E09FE", + "ephemeralData": "ACB996EA2AF1B6ADCE9EA79C8A672C2F394EB3804DC11E8DE34990A5466083" + }, + "dkm": "EAFD2708D03A4A10BA625AC5A48F4A11639F65C4A4FFFB1BC42EE9D2E9D0AF79AC02CF54117FB044998EC65A9D652E236A970A278623F8EF04B86B4B7EEFAF0550B75583925052B65AC136379DA80BEC5DC919F8F09F5A2491397DA8B999079E6EF7790329ACFD88C22FA5EB9AE736CE021079C13D72C73674DAEE43583AD3DF" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 148, + "testType": "VAL", + "tests": [ + { + "tcId": 3206, + "kdfParameter": { + "kdfType": "oneStep", + "t": "679684A6128A8BA410C9EEE772FE4411", + "z": "286D8309466C622975B8204D63479CE2DEE499CF21F37FDD2AC78F8090", + "l": 1024, + "algorithmId": "BB2D1D595FD5B0D7746DB2F92719105B" + }, + "fixedInfoPartyU": { + "partyId": "5518500AC43391658DD8CE6D1952CD5B", + "ephemeralData": "F3EDBCFEBAC41470CA4701C6CB115A2181231E67F1DE6459AE42EEC132" + }, + "fixedInfoPartyV": { + "partyId": "B9677C3BEE73ADE57FC1D7611749D96B" + }, + "dkm": "0FC00E94612BFC9E1CF7C27D1C09F794B828FA512DB7F8C30280A04A89E8D1EBE90E862105DCB598D2881CF78B16891F66EC5C5BC4D9685ACEFBE8C6DEB8FB2C1E4839570254C77B042AB74628D94615E8249D32C49C2616C5D439AFA223C0C079F550B320BD2B55CD0FB4F1E0BFB15050A137ECB81336699F3E2B7C9F5934D5" + }, + { + "tcId": 3207, + "kdfParameter": { + "kdfType": "oneStep", + "t": "82365384FF2F37F70ADE6F7D1B352583", + "z": "024757462934183F19E192AA3F5D261CC758D5ECFBFC8C8403E9D9F6C4", + "l": 1024, + "algorithmId": "B7C35EC1A37F31FE1975317E4F5108A4" + }, + "fixedInfoPartyU": { + "partyId": "9A91203999FEB3DA85CBDFFCFAAA9576" + }, + "fixedInfoPartyV": { + "partyId": "452DBCBFA4DE846955C1DABFD110DB43" + }, + "dkm": "53F5D13D6743B2D6A7192C2E467DECD3DB9511DF8E10803D9375ED89630F86D133BDF98A6878E86AAA0EC394ED81EBA244A7B7DBBF9BF810F8598CB0E70E30BE3E4C58D05D8A79F0B3B3DF763A7A0443119CF99289CB8219AB172221549501F53981A5631DAF482160B5CE443F6D93800278BA9E26D4A6C72AB830F0845C3847" + }, + { + "tcId": 3208, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DB20357A5AF248F412D82852D5D0E06", + "z": "D990995E67FEF1F9E15CF66810D70BEC002BB49987DDEDD771668AF012", + "l": 1024, + "algorithmId": "57677CEADE5B5C95B64088B528A09481" + }, + "fixedInfoPartyU": { + "partyId": "CEEBA680212EE501F1FACB0DAA925E9A", + "ephemeralData": "3BC7820FE61120F381213AEC045C3E13FF8CFF186C550CEF95D719A240" + }, + "fixedInfoPartyV": { + "partyId": "FAB3A154866F050177F61E6630055361", + "ephemeralData": "9BCBE603E547F4995BFAC40A1A456D85F108824D7FACB1B97BC4F0D201" + }, + "dkm": "A99FFDBA3FA9AF652E7E6F118977962929E9062B9A67F2EF1017EB7869031DB98AB37A6C2A8FB15344D07197D02D26D566CB0961ACF71F14E6F68319D8730CEBEFD5FCE6252A9AC3F4245F91F8279ACBE1FC88B5A6C04C43B69975844B1D7B2B81F0459AF658FDD2840576FC7C07D0F1B7382774314B8BA71888748A65403F64" + }, + { + "tcId": 3209, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D372217F1188CABEE7BA3222997977C", + "z": "AC0B087402832DD12F068AB67C74ADF45D789734D46EA03C9A99F5E0DB", + "l": 1024, + "algorithmId": "C6925414BCB6376AEAD2C498B4627E26" + }, + "fixedInfoPartyU": { + "partyId": "0BED5429F63F2BF95F34E1190048D2E1", + "ephemeralData": "0F4B8A8215791343774E61F3C19433269671B30A6D31976174A3DEB790" + }, + "fixedInfoPartyV": { + "partyId": "80D7ABCFB1716D082C51E3FF773F7D05", + "ephemeralData": "9DF086B868E24296FA738D68214CD6F18E65A44D8BBD8C6068610C0563" + }, + "dkm": "A4DDCEFB96BD92BA69329C2D448C8DFB94401101F209F352CDD5C227766ECC64BB0B70FB01A830D483A24A945381E03F32C0AF87FA39A840455089F1C8C2440E7E37229354B69BC3664C5B673B657D85034C94A7221D491DB8F384C67C3F118DE99173A288E51DD31EE18662F7EC7A88D9013E1FD80593837BFC46EEF48282CD" + }, + { + "tcId": 3210, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF56774AA27A6DFA46710D828DE47C6B", + "z": "41DF784A58C665BA77567D42A9D5F5064E76071B66C6DA8B3A4A60A81B", + "l": 1024, + "algorithmId": "1700BBB008F339EBA0C5C18BEBC68A48" + }, + "fixedInfoPartyU": { + "partyId": "D7DBEC328DA19976F8003613E3735522", + "ephemeralData": "23907691AA7624F358C2517F6AD1D8FD7088D471C8A6453A9AD7F59F3E" + }, + "fixedInfoPartyV": { + "partyId": "2CC44B3D2D1B876F285041E3630074E3", + "ephemeralData": "9436F7FAA887BC8D24D3FDE583B5C4092D7F7A4BDC15896CC8BCC99B05" + }, + "dkm": "FBAF93DFBD9ACA96E9CB477FA9F7BAD83EA3A83F09DCB8D00734E9344F12B6A3F3BC408250F4C75B0438627C4E677ED16BD5B0DB90DE5C6E428FFA5F5836AC752CE77BD4CB08CAF138D548ECA64EEB5405C8458633E519B89964CABD8B95C407EEA5A0589CB9DC1C00ED000E2D545E593DE398E900D6796F912B22E281600635" + }, + { + "tcId": 3211, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1BDEBB9D5D256B1658AD81A59ADDB4E5", + "z": "F10E8DF200E2213B44059B3B3AEC177EF16C95AB292DFDB1E9E9674EA2", + "l": 1024, + "algorithmId": "CB7A4270E63F5E3F5F2E1779A34AAE64" + }, + "fixedInfoPartyU": { + "partyId": "EBF970B0B633E290DB2243247F83C2D1" + }, + "fixedInfoPartyV": { + "partyId": "EF24F7E8842D67D6D820622238539766", + "ephemeralData": "56F5DC4EA7635FAEB9BAF58BC0F627CB944F6758A911F53BCDED11E958" + }, + "dkm": "CA8970316677ABA717951869D8A14EC2920340BD966D4A1B6CE594E1121F153BE448A41E1D7BE42832379E294574C7A1118198DD86FDC39B031801BC5BE107E470080A44324DD417F270D2A3421FD4D3A342964DC8B0E079A398DE1EF4E48991649E81710D4333D38573596251C55FD0BB934F751AB31CB4177E15EB0DFDB058" + }, + { + "tcId": 3212, + "kdfParameter": { + "kdfType": "oneStep", + "t": "737874062E0BEFE92C375D745B15C714", + "z": "619B3658A5937E165C8164F800E47F3302B59140C26D948FF335B2ADB9", + "l": 1024, + "algorithmId": "4A13F0696352A9FD26736D8B2085DDF1" + }, + "fixedInfoPartyU": { + "partyId": "CC3399A7328556DE3DBCA9DF31881F45" + }, + "fixedInfoPartyV": { + "partyId": "F9589A8F1E2EA316F6100D2D2670B62A" + }, + "dkm": "86DD027318EE644D613CDAB658A726646CE481FC19C9A555ACF7FA6661E9437E885F49AD44D86A7F22CF583EA771C096330DF612C8CAC6647E517E3B8FE03BBB7D2B63133B24175E2AAFFCC378E4E98E63023BE92CD5325460E16B2CB43C2747BF616E69D64CBCD05831EB37D59BEC1735EAB8F8D16CD1C549A165E49B725178" + }, + { + "tcId": 3213, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7267303E45152F9B00D3386404C5284B", + "z": "228822743BD8BD62DA9B791F8FD8BDA51BD097ED0A14B2BBAC03B9D52C", + "l": 1024, + "algorithmId": "3131B3162B8EE457BF6537B7BE740E10" + }, + "fixedInfoPartyU": { + "partyId": "A076FAB1758F852DFA41FF1C7D278120" + }, + "fixedInfoPartyV": { + "partyId": "2A9838C7E017C997CBB61FB53D71F5E4" + }, + "dkm": "1070B11BD4C5A1E5149B59110EF5DC5D3A3CF7E9E819A62C52BD3EA6670BE53268D33FF45E996F84D5904B43DE01758F433FC8032FB26B69FCA046502CB962CF98FEA676BD2FCE6CBD450AAD4273D8D05B7E3E6D8390CEDD9036457E26CA5FC0017DC11C6BD8966897BFD6FC55350F82F2C4A49C7F9CA71CA79DE1A868836F5B" + }, + { + "tcId": 3214, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14F2A5DD7430EA107880273550724667", + "z": "3FF9C4D95AD293B2ECC801A0EB1BFE151821532EF2BCFE1E12446D870C", + "l": 1024, + "algorithmId": "E83D19A10A221175CD586FE3D552DAF9" + }, + "fixedInfoPartyU": { + "partyId": "D3075DB54749D6F8AB1AFD0E1ECFF0E4" + }, + "fixedInfoPartyV": { + "partyId": "055A39E99BF359282AA43D8914ECFB60", + "ephemeralData": "1026A3E5F32BB35A2B0DC878FCFF8C543680B8CAF270E4170A03843E0E" + }, + "dkm": "0F709299D5CD935702FEF04BE2C9B49D8AF417E6BD0DED322BB8E854556554574070DFF45B05CC2690F447CF24A2D1FD02C47BC418EE7D19A40A0BCE984154D5554E00E8D614618340A1424E0254C16473DFA2973CE640B302DF12693BDCF3CBEF4AB29F297E570343C3CB8088447BF64F55F63B932D4E24B56E4C8E38E9AFCD" + }, + { + "tcId": 3215, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDDA92DBCDD46FDA81FBE88907773B21", + "z": "B92B30799DCB109DBAB721BB3F2A3B7A9E15738E1AFE9BAA7C8C6C92A8", + "l": 1024, + "algorithmId": "BFC8521B9BBF88B96D2B2591F0DF15A1" + }, + "fixedInfoPartyU": { + "partyId": "5FCAA951D3BCFA2B86952801AD27915D", + "ephemeralData": "E355521357621F7819612EFFD4464F67831339759323808E8EF6779207" + }, + "fixedInfoPartyV": { + "partyId": "5BB36D8AA702CF5BA98356E5598253D8" + }, + "dkm": "FCEE7BDAE685821C6515A6F14BA5ABF8E91B360C841B019AD76A523FF8AAED43929EF70FAB7024C72A50D55C57D3F579D8464EE762AB0D91BA057824EAFED1A50CE3029EE6D73C2C2F45634FA8B8B141A6E871415108BC871EA66C7BACE66C4DDF52A3098F5A04115F7A76F9A52C163F47DC7BCF69E34DDA9D60ACFAEF90400C" + }, + { + "tcId": 3216, + "kdfParameter": { + "kdfType": "oneStep", + "t": "185A756A58D01B7E1D41936F3B49BED7", + "z": "3F12F2A9EA2857A5118643339FEED27BE5F432B5B8282CE96EAC7FE9AA", + "l": 1024, + "algorithmId": "BDC79B6339B187C09B3C102D71C72CBB" + }, + "fixedInfoPartyU": { + "partyId": "60B9822191ED4F1A1B798E992C4B31E3" + }, + "fixedInfoPartyV": { + "partyId": "1AF6C4C257920507D33236B9E1480338" + }, + "dkm": "0BD0E35155FC0CFA7BC016C33C37121351FD7138682991A78634070D6D26A9A6367B17D87E618F5EFC97A587D91088CEE4056EBBF4A925A5003312AFF3E5598A35C25FFBF05BFE93B591B7172FD1D59ED2D3C0C32CED22B636992668C6108A26C29173314D2FCFFDC5EB1AFDDE572940FC21B25FA62E2D601EBF749CDC8A0F61" + }, + { + "tcId": 3217, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBE62F9B135A84D2FE411D925ABCE75F", + "z": "9BA2459786D2820AE87814646B40A42AAF6571A03B123D35F7870F7E2C", + "l": 1024, + "algorithmId": "09F0C72F13DC5CCE1800F5271795C7F0" + }, + "fixedInfoPartyU": { + "partyId": "ACF21FA9AA291268B8B1E6E0769E7DED", + "ephemeralData": "CDEA520288F343CEEFD2234E779AF060013DFB22126E1A36A71AE0A74E" + }, + "fixedInfoPartyV": { + "partyId": "B5C4CD0784474581C29D48AB2590EB3F", + "ephemeralData": "4DDC08F6D7531856176B36D3A030E3A591EC637FEBDACFD1310F39B167" + }, + "dkm": "F8B388AE99CC6BB951B145196DFADFC1C474A4DD1CC23F6140CB16DFB20B3B76441DA1DBECFA7810D5800FD4A7E3DB865AB54F8E9935D95E4C8771105B0F01D24C5E2201EE791DD36BBD7C443DFDEAD2E6246D551DD82FA346305C213D6F2DCB3A62C358815D975E66DFD845FAD8071C0A40FA6785915B3A959E584CB6C04BAF" + }, + { + "tcId": 3218, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA3CB4E1C47DDA272A14C704D21A7B01", + "z": "8A8D1BA2CF56EE8A8C77102C3D5CD048E0CFDF11499C8441C34ED9F87D", + "l": 1024, + "algorithmId": "6264E4ABA2B3585C0E16086743CDE41D" + }, + "fixedInfoPartyU": { + "partyId": "E7F2887DF7BF9E160BB325F91CA82C51", + "ephemeralData": "80508D27501D23E7B237E4F711F626217E8309F22DC4A3B4862109DE49" + }, + "fixedInfoPartyV": { + "partyId": "A932CB570578CA69843D588A6EFB010E" + }, + "dkm": "82A842B7A565C75D659F971B534BEB6DE8A8376BA339135CB2596CC56243416BB46CEB7F672C41455A6A05C4B08AF1E67D565041801CC3B930FEB42A66B3200478521580FA81D8ABD37243E39B3C5CCA72686F6F3618CCFA3789F5C2D1CF2D887138D42F9E3AFF6EFC241D150E9C29D52FAA5E61C6477A068122BC91D669165E" + }, + { + "tcId": 3219, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BEE7A97D7F4983F3C78BC1884BB3DE2D", + "z": "5DB121F650811DC1354925F90CFB08293BA0FFE3C2D25925A1C2FFA786", + "l": 1024, + "algorithmId": "D5B7A09FBC293125539EA73414BEDB43" + }, + "fixedInfoPartyU": { + "partyId": "C1A489E0840834F4A1F8366B497BD51F" + }, + "fixedInfoPartyV": { + "partyId": "A703AA727D89C4899E8383724E7AC98C" + }, + "dkm": "EF65F6CD6DAECBD334E2CF18D29816CC7A3891487BFAFF32BB8D4E2EBD468B7D4C619A1414129DEF0240980F8965358066E45535834258E930C9D7502C25F8A4029F37DBC9AE7EB416169C0E11DC6A9AD0275DF7539FED571FAA17F272AE9F11A607002D43CD6A0BE49B18680083FCAD55B02E2A17F3FF14CF113EA93DBCDBE7" + }, + { + "tcId": 3220, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E53935B0DEB8AB0A1D456A3973B6288D", + "z": "49132C9177B53411952EC7359C71FF70C770A479ED0D06473066963A5B", + "l": 1024, + "algorithmId": "DCB93A437A01B33C2DA901BE36AFBD1F" + }, + "fixedInfoPartyU": { + "partyId": "C5BF86A82246AB52A4091F1B79077DCB" + }, + "fixedInfoPartyV": { + "partyId": "F21B9FEFE00549500B6D7B4246AB9A56" + }, + "dkm": "63106FA03DD7AC6DC80D76D96B6F5CA344B27E144E890D6756C4B68EBF04F1EBB4A2387A07801589ECBCEFEF99780D6C74C1842F682B6162F71F6898F8C065B2398379AF69CD11C4436F81EBE9F5E2056DF3CD55F53E04D5BC6676F4A1F31DF0C1000ACC1662E550C5D4C954BA21F246C1CD4B6590B56A4D554D5308CD206CC9" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 149, + "testType": "VAL", + "tests": [ + { + "tcId": 3221, + "kdfParameter": { + "kdfType": "oneStep", + "t": "422FC6688BBF3557400582A708DE296F", + "z": "88F63E57E9FF3F93D752A55DE985D52902AF35F4CA4E9A8CDD26E79AA0", + "l": 1024, + "algorithmId": "A4A677A059D8C1C4BDCC472C9598EE81" + }, + "fixedInfoPartyU": { + "partyId": "4CB23D908EE3C67F9005B99592FD5541" + }, + "fixedInfoPartyV": { + "partyId": "A44E853DE85B0D6BDC210BA139602D3D", + "ephemeralData": "A8AAAB29B6DC499F4F96111A92B28C5547C4C29669F5CF706D1C379F89" + }, + "dkm": "0C44944E559FA2EDAE3C6C7781644DB6F7F548D14F8991206C71563CEE8F0CCE9BC629FA89B4EE4F949A005B628D83922FAA2865F8AAC764B597580BAC2E8F5C4C4FB347473BDED80918C0435F86639FCCBC72146729BA5ECCAA2895B8D4224CCE0D8ADEACA2B17BDD89A06E417B7080D69FB36C602980B244E0642ADF4563A5" + }, + { + "tcId": 3222, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABE60A4BED6D0292CB7FD88036E66B50", + "z": "34D6F37C227EE9DB4E72AB92E4712923F2D36E9882C22AA9AF4EFB89E2", + "l": 1024, + "algorithmId": "CEFB539659460EF50A14A2D98548A156" + }, + "fixedInfoPartyU": { + "partyId": "69E7B42340A61FAD580C779A28EABF26" + }, + "fixedInfoPartyV": { + "partyId": "53B6322B7D9F065D745FB909FCD86ED9", + "ephemeralData": "DA6D703CB48B051D38FE84A2761402272A32047236191DAC57AA83D95B" + }, + "dkm": "A958D540C6AFFF6396C4CCD0BDC7BA81CB2AFD8FDB8E158F9270CB0AD10A55C9F5133DEE918780AE91180D1453C4F43CC84EA3F33199CA4A8BCA590735923967A4B531F304D112B479EC6D04D830CC7D852FD01A3BB6552715B01997E04C2E168FD599D470A991A071B0E9F3EB3A2363A8B1CA218DCED346018DA7B087E8542C" + }, + { + "tcId": 3223, + "kdfParameter": { + "kdfType": "oneStep", + "t": "85F84BFB4E496A0D0E8A6EFB927AEADD", + "z": "EDD98E0745A9674E37906CC0A9CA4E6A5CBBB1B1DA37FE1A8BBAF4BB6D", + "l": 1024, + "algorithmId": "7524E0A72DE06DE3901B37439B15D018" + }, + "fixedInfoPartyU": { + "partyId": "BD49B742EBC3E969EBEBBF5B759795CC" + }, + "fixedInfoPartyV": { + "partyId": "258C83744B541F4D67DF3AA57F1CA2B1", + "ephemeralData": "9F96A00D0DB85A276EBCEB5577EC1D97F5A4A9D63FDF63AA0046191C0D" + }, + "dkm": "9351BF4B67C85B17A0C671E5BD0F2349A41C088ED233DB86177BDF3CA51A7F97A4EFDD6CFA00558F5AF7C3AA4D77615692E56ECC4B04E5B5C11203466740CB32AA26FF12BB71ACC6CE029286780C35FA4C3699344008A6A267813ECCA6445CCC606E5E8039100E1F1EAD53F5EFE8B138D7FE105A7599FA89EA5875665453E36D" + }, + { + "tcId": 3224, + "kdfParameter": { + "kdfType": "oneStep", + "t": "425991E8FD17F63CF9B17DF91D836F57", + "z": "CB0BA89BEF3FD8CBE9D2B3EFE6ACA81B166994F75E96274DFD168D019E", + "l": 1024, + "algorithmId": "52F2D9491AC77086C738E201E494A0BD" + }, + "fixedInfoPartyU": { + "partyId": "E802BEED480954DC4C477B8517F4DF3A", + "ephemeralData": "89AA9A0A60619F9152A01723CB1BA562264D28D25886DEF8166A4D21E2" + }, + "fixedInfoPartyV": { + "partyId": "1EA82C9016E62360BD86B9A856D50CFB" + }, + "dkm": "1D08F41F4A5032B4DAD8956132C5DB0EEFE230121E3EC5DD8D75007F01A669AA012EF43CD4155B33D90A97D3733757A31DB1A2CDEB7F3B72F5E02CA40267E804AF93BDDF8BBD6DF07F4FEFC1A03197C79335BC575E2F1EA60B2D4D7B85E4484C0683E60E1AE1EFF128B034AB93B08F05B8F838CFD5413070ED3D7CE07753FAEC" + }, + { + "tcId": 3225, + "kdfParameter": { + "kdfType": "oneStep", + "t": "42D604B9428CFFA567FDA4CA97134403", + "z": "38FED900592822B8DB143EB42B130FAD373983FB151F22C65C0DDCD7AB", + "l": 1024, + "algorithmId": "1E0C725474590A7AA3DDC5FE7F6857CC" + }, + "fixedInfoPartyU": { + "partyId": "20CE82F4223DC1FE957CC8173376EA9B" + }, + "fixedInfoPartyV": { + "partyId": "23EC5CB3B4B4F366C2C5051679F0F82F", + "ephemeralData": "E0C8D5B171B1E585BE0EE1D095075436E6F101F32D7D92E420050D1079" + }, + "dkm": "DC2B1FC02CB7B9BA0CC3438645E5EFBE7208EA42CC0A75C5881AA8D6FD0A138BB719F7980713B4FC96239126FEB1DBAA0A80E4CF3B041C7C1D2A650BDEB6771CC0EE97A28CDE0A96ABE532E2EAA93F715FFF37548DB0E12E2E47F016059B655342D786CBB6481F942B80C29BADE1EBDA18A0B1331A796574086CCB869CC43250" + }, + { + "tcId": 3226, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD6E4E2A264260A24FB15DC69E04F425", + "z": "B05002EA9CC8F481BCC0464CBD77708F3FAFB8B54450D44EAEFD86012C", + "l": 1024, + "algorithmId": "F675271F211BBBD170E3E96DCBDED527" + }, + "fixedInfoPartyU": { + "partyId": "537EB40A0EDA23A606406F5E4D8246BC" + }, + "fixedInfoPartyV": { + "partyId": "D92144AA56EF6D73B0BA513BEB4BE342" + }, + "dkm": "567AD5A00DB49A4935ECFB0036E21AD6E9B11431495B9ACB10256E7718CB3E6E4B0A15C39130C6840D576ACFA701F1B80510FE0BE83F617CDB3336F8243F093312844F2033D26B81368751F09FB2FF4A1414BB6B6E6031ADD21253591A5AD9F07F4560F69079BA420B700B130562C0C713C5006713BA8D6C053FFFE044F86323" + }, + { + "tcId": 3227, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A599D6CAF38524DDF420ABE206CF5E87", + "z": "053F01A25D8AE9CA72C0F07D9AE8E36DB32B41119E693239251C607919", + "l": 1024, + "algorithmId": "98CB0F881093B527860A8A63DE967E36" + }, + "fixedInfoPartyU": { + "partyId": "6AD067652C4D72AEAE0EF6EE1C51BB17", + "ephemeralData": "93A20AEB39D576C50EEF568764F33883BED6904F32D9E54D589C417040" + }, + "fixedInfoPartyV": { + "partyId": "7EA6BB436C6DBE68FE9061672018620C" + }, + "dkm": "977B2418FA5F13E3FB735BE23DFDFD9F97C2C48C57269705E2258D12EF562DB1B49C6197C7BEF8B44E74BCBE37946E8B18895E8C3ADC70B037B88E65209D4F4845B311E6D60DA53C8AABB35CDED5CF62348F345A692CF347F1DADABB75244194FD1D3CD6777B043BBF90A1588504B0C4736837EDCE08B82E954128DE2C085976" + }, + { + "tcId": 3228, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E601D6B2A242F6D2F1702C4914CC981", + "z": "0D34226ADBCA4B27073167193A314A809C4B911D8D6644E1182A7A3520", + "l": 1024, + "algorithmId": "BEFF9F952005D523F78F31638F99F3CC" + }, + "fixedInfoPartyU": { + "partyId": "70A703E5859FA6D5255FFFC774058B64" + }, + "fixedInfoPartyV": { + "partyId": "10BFAD4FB0E9F9362FB651F0F3E5ED92", + "ephemeralData": "74760690454F3974194F34D70E59A42322ACC773640BEA80D5D68B9129" + }, + "dkm": "DD4B97EA827AF024165767DC8A642E56315EB5C6CFBAFB56902C5F5771390B7A84CFC5E8F7D929A9DFAD28AEC3464BE93372A644255211DF6A008E437DCD4631C861646577C8C717CC4C80299649A0205187B1EE6F9AA23C35D9482AB30C7A4C1FB3D45626E3ACB52DCB12AC48161C43335946A4E491A1F3500AB408764DCFCD" + }, + { + "tcId": 3229, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E944151F3610A6A1C01BC265ADFEF752", + "z": "B32C149D5DA76D3BFD77407942E7C2611492D4D5CEA660701B2A5A9302", + "l": 1024, + "algorithmId": "35DECDB621E6F4143837C3D3B65E796A" + }, + "fixedInfoPartyU": { + "partyId": "EE8FDE5897E21AB373231EFCB0FE1800", + "ephemeralData": "E05E5F8F749F4317E2D5BCCEF3335B7DCDB226C7EBCCD4A5F428E43FAC" + }, + "fixedInfoPartyV": { + "partyId": "FC5610E429720B8A48D5F1D4B8DD5CA5", + "ephemeralData": "AC4AC268EB868BF9FA496A46EB764665B444FB94A718D2106563869CE5" + }, + "dkm": "5B4B44F424759E246E4E504BCB95E41DEA3F7ED7F8E31B0E7F702D6B1BD09955EF5DF3714D4F592CBE8105B094560EC7A14260BE2C07CA54EA5A46955B8379CD5CE7C4ECBDC8791C5ADB8BDB845B1D16832E112E261FEAA8F2B2FF36095F1216B65E30BB808D9C6A87B70D65B77E12C9EF737E32085D228A1E3FF95DACD453A6" + }, + { + "tcId": 3230, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D413C05686158E9EFF87BDE588E4A7C", + "z": "FF8B91F0D6D4E8B28CF9BBAE90D714AACBD51E1005BC6CA1BDD7B6F183", + "l": 1024, + "algorithmId": "5E9E92780EC34F77E15361E47ADFCE4F" + }, + "fixedInfoPartyU": { + "partyId": "5CCE52D1DDDBA0C7DB868A260E3BDCEA" + }, + "fixedInfoPartyV": { + "partyId": "E010CC00E209D110478056D789443F24" + }, + "dkm": "7FD871456DF0429EE3978A90F6B8A6A63A918B21FF2E77894876B3A2B482936197FA4A58188D07CE31B29F1878A5923B6BD0D0F50484DC40251B38B2D09828C4F28C03A807E825194176FD84349759210D924FC9A7B3C53A230F1CD4C7AF374EEFCFD92164920FB3BFC7347C5AA36E6279AA6D751B3F76B9DD79A4D77E99807D" + }, + { + "tcId": 3231, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F0E7805036BBE312515ADB5D6353BCF", + "z": "CC578DE8B010A4B75AD049200AFAF236914589989EFFE8DA324AFE23CC", + "l": 1024, + "algorithmId": "6A5527E35082962AC8F53815BE0DC6BE" + }, + "fixedInfoPartyU": { + "partyId": "231D373553F5380A28C0844388B1C3F1" + }, + "fixedInfoPartyV": { + "partyId": "914D4999EE7E14E43E2FE4F871CBFB93", + "ephemeralData": "3A416F5E4A81DEF85B8C9254E0EC8780257C53E8FFD132B24EBCD8D5AC" + }, + "dkm": "2F4C6B06E46B4DC45CAEE28FE1B520CAA6B579534B4B049DD10CDAE48BE74EC35DD27FB57EA8D0B07C884031FFEAEDAB540300AC247CBFCD42A77CD563A7341BB3744A454A5A324C8AFCAA68492E1AA16B623331CA8739F371E895A6C4E4546E4B65FFD0636C0567258641AD968876E2B2BF211EEB19E80C686DCB2B0687B30F" + }, + { + "tcId": 3232, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C12A2B0927CE7975CF97A6114F09160F", + "z": "2172740EFC1850F5FE0A634DB049EF5A7B59EB02082AAEC1913770E171", + "l": 1024, + "algorithmId": "696321E2CB440F71744BF0EBE9DE94BE" + }, + "fixedInfoPartyU": { + "partyId": "BA0F46DF684DD72CB1005A82E5456A23" + }, + "fixedInfoPartyV": { + "partyId": "3C4C823A57907BC320C8BC7784891A54" + }, + "dkm": "74E0B9639AFA5BF4980EDA8A3569CB12C00D51FBCC70880D1D3134CFB4CDA9249FEB9C0D453A1BD620F3EC1323CC11EA09D79ADC86E2A8E37B83425A06D05D5B17CEA8774A6737D0051DBEB19F9C9434E82362EFA36117DA01CDDBA94F3D4552AA96665F1B8DCBBD05286C1D1546D70D6CAAA65EA6B72D4E6D45A3F4AD26E5AA" + }, + { + "tcId": 3233, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF05AD97EEE790994832A5939DA45CB9", + "z": "02D0613BD93AB4416DC7A08C7646C33C561E5570E0AA9FCD37EB87E194", + "l": 1024, + "algorithmId": "B98AD47BD3F897044CB0E960FA830BDF" + }, + "fixedInfoPartyU": { + "partyId": "4F22BCFABDEB819E4C993E099156B5C2" + }, + "fixedInfoPartyV": { + "partyId": "CE6CFC124D2C53823E0C0A77A0CC5CF1", + "ephemeralData": "FE6CEB865249AA4B61030449C5EA92847209B50AD7FA29FD4D8CFFBB1D" + }, + "dkm": "07AFB859A5CED632985CB2F39FB0FC27D3202F431468844D50E04D8892FB2483BC13711FE8A05C487EFAAE11713CC545A33DC57098D0E1B88643D6550E1F6D7D7DC480537F7FF3E5966C61EE86ADDDF114E3E9DDCA5F1A0D5D2B7EC95AACDFF6A47E88576112829CDB14B01C525EF73DF089C06D59759CCBD11F8A97FD8DA7C1" + }, + { + "tcId": 3234, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5AF658C4179DB162E1001609CBAD0B3", + "z": "0E7D95A071809D5850910AA53D524ACAFB8CDF09F78C92F24331243748", + "l": 1024, + "algorithmId": "E8BC7D440B93EA54CDE28758ACCF8181" + }, + "fixedInfoPartyU": { + "partyId": "2157A42D3DC1A48A580CC3CE3AEF40A0", + "ephemeralData": "534900B2F93D072D51F0C9577E155CA3C0A499EF741E5AE70427914B33" + }, + "fixedInfoPartyV": { + "partyId": "73D45A1C94589CE6EB4A6DED5E45B423" + }, + "dkm": "0D7207BEF41AA2B32CD4C13760D49B64022492E820418C420BDFF69E5E6EAC6CB1F2620F748EFD6C7DEEC20CA971C9B584E160FFEF03ADA90A9DB9C5CADAEEBC9DC9E92F68DB48DD9C8FA0D7F40D4CEFE39073E46544546F56C439EF6C585A72DB3948A870917A2ED298494BB05531CC6FD3ECD44CE3F78A15E41E012B37F22B" + }, + { + "tcId": 3235, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3C427CFA769A5B93D59514D1CF0B9F2", + "z": "F64C3F502682157FC57EF9129E335D50C136EF52EB63BA83994CACC5F2", + "l": 1024, + "algorithmId": "8487BFE10C4D3DE6EC2866DC3E8B8C6A" + }, + "fixedInfoPartyU": { + "partyId": "E56BA7083AFA75B9CE32AA6979BF1C81" + }, + "fixedInfoPartyV": { + "partyId": "4772C19BD8E66A19533D070237B88B3A" + }, + "dkm": "77ED00D97FE9EEEB205B6384FC51633C63DB1D307AB054C1BD6862F11F7B688D6D476573C0437951974D2AD6DAFEE2B4CCEAD20D9462D2B14EB8B201F44F8775585ACB68E7191B964C8E54EE67C27198E2E990E1273F6261FF9A2D2B3E87E4C9ED95A1126EA6701A3B251FB5968B4A47D6F380E976B092889361FF8478BF848C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 150, + "testType": "VAL", + "tests": [ + { + "tcId": 3236, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B613BF6745170A8041A3347D623FFB0", + "z": "42F7B51607E45B96B1B5DF8DC9D15A7515C539548BDD1182C1CEBCF4ECCBAF1138A09048", + "l": 1024, + "algorithmId": "E09834D340E17843DAD0E7225DE4A7FC" + }, + "fixedInfoPartyU": { + "partyId": "BC20C592968259658AE1363401CF6093", + "ephemeralData": "FFCA91273AD01E1E5C346446793EE1C469F3F79B19CCAAC7D899561AF931AAD7BEEDB64C" + }, + "fixedInfoPartyV": { + "partyId": "CDF77CB6AE9DB248E019079EB6BC8309", + "ephemeralData": "E0D40D0327A2A686C694305DC7BCCB3C3B170FCDE035B05E85FBDBD476737774786AB152" + }, + "dkm": "CBFE2927D7DDC956146B77EF2EDF6B08FE78D79C6D20AE8BC64BFE032CF7BABF45364DB7B551AF025C0187E41F136EEF0585C127B7B9407E67664E5B2461D997D6B0FD3CF72478B19B1ADC93582477B4488F1022677DF0B6CF6DBFCF7853FDDE0E2579CF696140E80B79D1958CDF654F13C26DDF6D4FCC90477627BE8FEFF7A5" + }, + { + "tcId": 3237, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2BE580FF89B6F6C869C5F51E672C9C6F", + "z": "F96A175058E7CAEA470F9F7E8F17FE359C922C354F325BD416331F804BB5CC36857590F9", + "l": 1024, + "algorithmId": "0C4CDFCE6A81F8571464ECCA39C9F7D4" + }, + "fixedInfoPartyU": { + "partyId": "29759C56F3E8B9FB6AA2D2874332D871", + "ephemeralData": "A1951FEB65987D7D7778E34BA2A4E185A33CA8D2C92BF9239FEA2542BA7A428F491BB47C" + }, + "fixedInfoPartyV": { + "partyId": "F3832ABCBFD8CBB8AC4588B895E184EE", + "ephemeralData": "EC642CA4FA53BAB90B80E9F89CFCEAA6C74DDA8A6404B4848CC43D02C9ABFE79109B3286" + }, + "dkm": "7024EA2002CD0CFD995B9D462E51252000FFCDD7284C9C6464E267D3FB11192FDA9F4685583E3602560B96837D4C940E3A659C02634B56F07DA11EC80D0E0235221F888E7E473492F3079448CF39AF29FE84B9ED906A544000D3075243C207FEECE992E0F6A7A9FD6C0D69AFA1C5C7489BFFDC4C0D8AB71DABE5677847EED231" + }, + { + "tcId": 3238, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A739B6CE5C14CD93F781B66E68C455D6", + "z": "DF6AC99F79E3EF3E03C07D631C27FCE96758E56001D6EF44BF630F6D210482717E5B63E7", + "l": 1024, + "algorithmId": "22EBBF435170D830B24B53D05474E5D2" + }, + "fixedInfoPartyU": { + "partyId": "E9FB13F6A3B3C2525FFAA35054B06C63", + "ephemeralData": "0BCD1BFAF42A0C1DCAA1C9C80145160334F39DF7857B20E92B7EE301C1F41A3F3CEBBED1" + }, + "fixedInfoPartyV": { + "partyId": "76FE1D37A169337CC04F93BC5224A27E", + "ephemeralData": "C145ECB40DFF92FF60948485C67078A17954077053CD3089B8F4A42A797573EA78BB59B4" + }, + "dkm": "DA91D905A18E1FA1EF00664A1C1D3813E4B085F08EC7DBB68B214D443F9440BF8F5481B83A5338AA4474AA6189EB0DDE4574319ED811C44236D560672B04E95FCEEA51251F04DE9F2AB3F611DD513BA638E9E9BB7ABAD939DA6ED82580CAE100CD4E2714D0DF96E0736FB3DFC8C64C3C7B2C7757FF522008D3070B8762FE7B61" + }, + { + "tcId": 3239, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0DB4DB6C0261BEBB18F736D4C75E21FF", + "z": "042C978A5FC2DA6ED3534D9FFE9949F638EEAB1F5215EECEB3F8D1531B0B3AD5B6F3F3F8", + "l": 1024, + "algorithmId": "FFF85DF725A43F3B2FDDD0910F669634" + }, + "fixedInfoPartyU": { + "partyId": "C0E30EA9CD4A433D03744315C42A4169" + }, + "fixedInfoPartyV": { + "partyId": "C13728990E79AC38E68716F559AF177B", + "ephemeralData": "0525980C131BA4F4FA96DDDEA22B74AA7D800E7201F75F2986035BC096D5B2222A81DDE9" + }, + "dkm": "5C4C344EBCD581FE8E93AC680F98F57A0476D6A9915E4D9B4BBD3648487652CDB11B25BA637FFBA0F741D275E5EA0E6FEBE8EC7D35D40DA8DC00BA44C10FD793E9DE9CE5BC79A047FF6E85A09503D52EC58C8F4F0EC79014BA1117B30D9BA22C46843DE89139EAAEFDA8505A5CF606EF45DFE7B7555851F03E3C99C9DA55E69B" + }, + { + "tcId": 3240, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD74EDFD1003947C2FBF82627CEF840A", + "z": "D1F2CC9CF82E4823A174F13A9B62B69191AE1D2CB85C399443BE1826172AECE0EBAA661D", + "l": 1024, + "algorithmId": "81D652380F8A10E52B592635F121FA1D" + }, + "fixedInfoPartyU": { + "partyId": "DFE34B37439B7CC44955D85A1EA0EBA8", + "ephemeralData": "A0BAB94E64D8693156BDD71960B837907C410F8B47C7A7C6EADDF38978EEB10F04672CE2" + }, + "fixedInfoPartyV": { + "partyId": "3BACFBD3D5FD5E77E4D0A6B13999CC8A" + }, + "dkm": "0DA31531D16C5BED9AA757837DCE3434F574E2DF8A3FB256AEB12E03C909F81587D48BBD57A1FB5846BDF151C0762F60B151EFA163071676EAEA1930D52982B4E6A502FE86E38BF3019264C285583BADF35C6928F65CE6B2164BC342477ED8DDEC86F28298A224081662898A4413D63E3EE62F44AC4EFD1288B0FBFB48D4D7D4" + }, + { + "tcId": 3241, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8D91D891D3006BBF0E6E6135A4E589D8", + "z": "FB023AD49B14B46EB9CD87EBA60CF9A03ACEED1C7070A1C706EE2BAFBA2D6409F5F67D70", + "l": 1024, + "algorithmId": "530BB37972C76673A6876F258C955A08" + }, + "fixedInfoPartyU": { + "partyId": "A4B690FB1D4668720AF42A5B734A16BC", + "ephemeralData": "4E7E9270FEDEBEAF418334020476DF5BA306B3749F8D315316FB4B739782094F7076EC56" + }, + "fixedInfoPartyV": { + "partyId": "DC877EB8371FF3F9DFE7DCC70C6C8B8B", + "ephemeralData": "E46F4E023631894B140E0A96F77FDBF947E8133FB3C1A5FD6DB5E740861B6D727677AD00" + }, + "dkm": "D1264E2CCA6E686D35818191AA7ED7947A2AD3733BAF1D9B8F2B01EBAF846D732EF57DBC550E1366BD1704B8521FA72D6BD3DA95A77C061634C031CD01785EE566EEF59122E000AA0C5AD53DFB802CAD3918CF49EF624D605578DCBF3F0E8988704088439302245A5A33AE62EC219F673FAFCE677D2A984718D335C4E42DF8C4" + }, + { + "tcId": 3242, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B4F6EC79E3548AB03FE58562919AFBF", + "z": "04713499B13A0B580577911EEA5CD730FDA2B2A57046940A119CC760A0E19BECE30E25D1", + "l": 1024, + "algorithmId": "E6D0D8294280E91F01A98E4D23951C42" + }, + "fixedInfoPartyU": { + "partyId": "14F9C50117F8ECBB8EC879CD24F9EDCA", + "ephemeralData": "1946E6251293046098312ECD0FB62F7EB8B7A54223D578EB8D5547DB235BC424C9FA1B52" + }, + "fixedInfoPartyV": { + "partyId": "1FBEF42374D0017331F1019E29A63B77", + "ephemeralData": "99C8D073456B75BD5ECC9B853D7D198EFE07ABBC31056743B3D7C3C292F5FBEA64234C5C" + }, + "dkm": "F48F3D8DFCCA6492B4389FD69AD87E5D043591E8E3AA43100B8C8BBD0C491B79FFE1B53953B0197FB12DF8AB64C909E945B4E187A0057530653EAF550D67D5BC49C403011584D05AB6364CBC023EBE077590E81BED40DB48409DF0EA821CC7CAE2018F58601D91A66763FA67A1AFFE9F561BE270FE884E6CDBDD1F28A2CD3ACC" + }, + { + "tcId": 3243, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CDF68208B3BDD7812F7B34B6B371A8B", + "z": "A3D7C8F75EC56FCB07A867DE30E5A48B952CE49CDE82760E386B9EA8AE12777338451429", + "l": 1024, + "algorithmId": "C449942C557977AFA3C7B3EED998A8C9" + }, + "fixedInfoPartyU": { + "partyId": "A4B80103281A126DCA9BB4B88437BE11" + }, + "fixedInfoPartyV": { + "partyId": "31BB4DFEFE930B50A507D96C148810B3" + }, + "dkm": "AAB9932F53F68778A9DE96D1BC6FB7BB01637BCA7706D4F79BF3D21418E37D948E63E27B342BB0131ACB3A0810ECC0116A1FD97FA370538409E8C72048C9269BF82CF02C97D315F0C9D81DBCBBD26C50E04E0EAF5D5917C875445BF5A68A881141D652DFF357717C5D50A37EAAC2CDDC6B9C326830F6888EEBDFF9E460AC7F68" + }, + { + "tcId": 3244, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74889CE65FA021F80A26D12F27FB29E7", + "z": "C4496F8131BA93D08925F2BC9188B1909509DA94B62A5D449474F008102C0AE63D17DA77", + "l": 1024, + "algorithmId": "BA75069FC0E409CDA0F271AA1EFCE362" + }, + "fixedInfoPartyU": { + "partyId": "0BCAE9F69AC5925C3F1FEBFCDCD438EF" + }, + "fixedInfoPartyV": { + "partyId": "14D5124336743FA3E4F4818652C5E4F2", + "ephemeralData": "6E229186EF801809AAAC59F7DFB76872848A8F9EAEC8E6928A2C2A344892A4992C065CC7" + }, + "dkm": "06F24F728764FF3827469E1D78732797ABB0C762A31C0EA5754BC5B704792CEE24719151748B35D5200002C1A28B2CEA284F846EAB39CA3BC913684D0521E0F8144957954CCB3AA31A608055C577C588027A7D7D6F994CEFA7C1BF8862BBEA6D9AFED6633C827E4458B849DF947DFDB7E76FE7A1512916EDF8C6B349405AB25C" + }, + { + "tcId": 3245, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A63D02992BD98F869C259375EE10009B", + "z": "E6AD399FBB5D6BA8AA2E35A4A33D720CB0F9E2F56EB5698B9B2A81E6F10D29AD8CC10E34", + "l": 1024, + "algorithmId": "5A4AB8F4E2DFDDBDF7978239B5D1C937" + }, + "fixedInfoPartyU": { + "partyId": "B7356BDA1D118968F3081FF272ACBEF7" + }, + "fixedInfoPartyV": { + "partyId": "BB52FB6F237A4863FB78E71DD1C29A8D", + "ephemeralData": "FEF40A61BE8DF9CF8ED68F7734D6DA14EB9E12B3A6353DD011231A3B4969EDBD87353776" + }, + "dkm": "42B3CAA036F3DE2AAA92FC461F6C7FE9A3513AEB08B5A2F1986D81EA6485A6EDA4CC2B758FF1851EC0A6871333A4BA44879594A8A9C0A7911898A7012DD5CFE7D691B33B00B8AF971DAFCFF81F3012B27AFE2FE94EBF1A77A973F44486072D5C1C13861DBFC789688035D82A62DC36CFE5FF2B12F04675990A6D82CDEAD61B8B" + }, + { + "tcId": 3246, + "kdfParameter": { + "kdfType": "oneStep", + "t": "428D9B7A95755ADDDD5817969E2878C2", + "z": "30F804578A040586B337A04516E4457C6D514B5BAA1311BDB4F5D69240DD92FB8D8A88CC", + "l": 1024, + "algorithmId": "297C72B9C447E4267E9BFB0E147D9D2E" + }, + "fixedInfoPartyU": { + "partyId": "2E3ACA47CB1FA322C00CE89A302DEEE7" + }, + "fixedInfoPartyV": { + "partyId": "19B85D6AD18CB9295A5A4873A486C61F" + }, + "dkm": "6100AB6C65E25C6EC60EF166D5E94FF6152BD83AFA5FAF139AB0E9C6EFF86644317B634595980889805A8D0FFBC4105F6112CFD144FDE7F25CC7441623886E70E0AC0B3BE0F49DD59F25132D36DAA6C2725CB42E52F69319A08C73114C9E7435C3E495BA6B5FBF375B2DC861CEF8E8CE6F04606B7CBCED9AFF01304BB3F5B63C" + }, + { + "tcId": 3247, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6976E18AB14F652042D493F5E10FC4D1", + "z": "FCE34D3C17E8E585A82BA371240B032380A304D49385591BB4E23BAB0CEFB9913A6D0BF0", + "l": 1024, + "algorithmId": "2B4E0207D4B7B2F97297D50E4CE545B7" + }, + "fixedInfoPartyU": { + "partyId": "85DDBCE0C72620B0B93503D4179A1395" + }, + "fixedInfoPartyV": { + "partyId": "75CD77CB53C687468EEDC94800ED45F5", + "ephemeralData": "1DBE565158A8E5666F7C8D89AC4A4CFCF60846D86207C9C8647D517351CD1FAB8B6AC0FE" + }, + "dkm": "5EDADB483D6A4F6418D7FF1AAB3A25AB74BDDBE1D5A0F78C06AEB46A32F9D7DFD84C27E86894F625E31E0D12A9CA2F86872B9296CBC98660979CA66B3EB68FCE5EF07ACC29B5354AC2415C830C1339111A7EB27731461047BFC8633DAEB5D8E79FC9C78D399D79CF5D5DE616B6A5144237AD03588F5BA0CF1410A9B431AC8316" + }, + { + "tcId": 3248, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63649076B32C25D837D4274FB072B4A9", + "z": "1FFE6BBC93E361986B88BD11021EE16C6B3550CD32DBBE742B99CA35E15A33A87F5A877D", + "l": 1024, + "algorithmId": "1013C7A67BCE20245915C59061F4E629" + }, + "fixedInfoPartyU": { + "partyId": "25E5FA4A1AC2A98D857A91597567946C", + "ephemeralData": "74C438BD7C9E206EFA68749967DB12BFE839C5BBC0096E06E7D348EFAAEB6D58689BF6F8" + }, + "fixedInfoPartyV": { + "partyId": "348E59B93A879DA7496ACB7C2614B662" + }, + "dkm": "F502A6E61BF96460ABF6E99EAEBECBDC478E40BD3A61DCC91B9C828AAE901A31227CDA0F77EAB4505AB6D53EB52CE2CA2D13A4B0F005706E11DAB2ECF65303252C1BACAA1D84343659E3EA9FC16DBFFC03C628562B86FCCE7489836C82F2BE1C01A1FE65FA66601D70BD55474902F0EF9B29B9018CD598E963AB0CC7B2DEAA53" + }, + { + "tcId": 3249, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03138A5613EE581F17B16C4464F5FF8D", + "z": "7CE2400B5CCB1BC0DDCEF852CBF27CFDB05B0F1030009BDCA4AB302DFF74D2A627C0D63D", + "l": 1024, + "algorithmId": "704F9D521F441FE6212EAE35EE100438" + }, + "fixedInfoPartyU": { + "partyId": "4703BD57843B0DC01337F68ABACA28DC" + }, + "fixedInfoPartyV": { + "partyId": "B99B984F65123E9704ADD5F4E3C00662" + }, + "dkm": "D0785D21D906D80D16C209FB1869935ED4BE372350B2FB6FFD058841BE75C06F8FE98D44E3CE0F894EAD619998B7F4396390911258A37A064BDA8B4E96704564749576F57EA5D3807E3CC5C168CFF480992E20D804259ED142EAA2BE1115833E270A82999F39189289EEEAC3E6486AAA85E261065BF7D47B6929953A818DD532" + }, + { + "tcId": 3250, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F2D6B5A7D20CBA5616918B3BC167E18", + "z": "188CDBEDB588C93ECA076C1F1375BE972003A0383AE6650AD4C24574AD4615095625A0FD", + "l": 1024, + "algorithmId": "2A390BB889FA1B20E3465F95ACCD892C" + }, + "fixedInfoPartyU": { + "partyId": "BA44E6E43F5694566E4868370221E3E5" + }, + "fixedInfoPartyV": { + "partyId": "D92EE60DBCAA6F7C0E9C36112A3F870D" + }, + "dkm": "5618A0E2E29A8A74A9A9D0800ADCA20DD86D8E15E616A462EB870DC679843B394AEFEB1A719A41256936FB762DB59A64398B100EFD6BAB3A42190E5479AFC110FD26A19426E69144AA6C7FB014AC86FF5C189C8C885A9C3D8A70574D18442E9DBD8260109094F29B266D40D02B09440760B5D1AF72F11D67C410E57610B72FD6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/224" + } + }, + { + "tgId": 151, + "testType": "VAL", + "tests": [ + { + "tcId": 3251, + "kdfParameter": { + "kdfType": "oneStep", + "t": "18B8A28AF04D18E39028A58C52A7B71C", + "z": "8A93609A6D7F5EF0AC5C7E69B3C09E44D80D183B5362D23BF28E7D4CAD43BD", + "l": 1024, + "algorithmId": "6338990520349EE31583AEB2500F8695" + }, + "fixedInfoPartyU": { + "partyId": "77EC51297F6CC48DE6EBECC2631BE541", + "ephemeralData": "9F82DC12A425DAB25716A9FD5512D73FDB5721FDEDBC96619A4EEFCA510940" + }, + "fixedInfoPartyV": { + "partyId": "6CE8FE2F2B02819652C041565A970772" + }, + "dkm": "C75F1DF05737D122A39C390281C57CD1246BA44B91A1C86C438B8653A076E28AEC88F012017C7F5B2BF62B759468218F317361BBD909D19BE6E1713E3553E7CB35CA97D56DFCFF106892B5AA915AE10CED63E3115BD7FBA07ED0F9D48616DC633512DC55BD20D445EDBF4530C849029BD7889FF0EE4308014FE460DDBD0B02FA" + }, + { + "tcId": 3252, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DAAFF929C2CCF30D4A43AD659B7B7AC7", + "z": "15C25234EBF154FB37550B3EA035AC2340BF70CA740C51D2666C68B5E3209B", + "l": 1024, + "algorithmId": "AD9673B9B31C9DAD3F851F27F83B97A8" + }, + "fixedInfoPartyU": { + "partyId": "D978385849A8145B44E090991741EEB4" + }, + "fixedInfoPartyV": { + "partyId": "8E7F31817661E7E846CF7058F315A9B2", + "ephemeralData": "E2DACE7FA8B0D1727D5B21ACA9829C18DBC2DF0B622945F0CC92A7A72FDCC0" + }, + "dkm": "907BB02C5423CB04C2287193F78DB72DEBDAEB3ABEF0F12D6D483F165E02F34281F1F047ED5E1A8FB5ADD9070617AEF881F3320540D6DDF5C5D7F8049B0AA9C2C1FE25DF5BB31AEB4106683747E178202A4E246DE6F42CE54461CA640AC4CD9E4333FF672E67CAFB0AD00521727B0BDEDB0B818080492C53E9EC62D3908B46A9" + }, + { + "tcId": 3253, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E8C2A95E38EC3B3880A7C95DF18508A0", + "z": "BBAF9AB6FAD0E3E1364ABD0224A9692AA364ACD78A9FF8AEAB4B52471C9E6D", + "l": 1024, + "algorithmId": "92AFD01A333199091AE786F232518AAB" + }, + "fixedInfoPartyU": { + "partyId": "D4CF3FBEF9D65C544067B37CC549D65F", + "ephemeralData": "A27751E6A5CF680277279F63002AE34914F55181643A67232BC085B5CEC197" + }, + "fixedInfoPartyV": { + "partyId": "03BF037814A11E16DA05E0D81E27FC13", + "ephemeralData": "FFFE12FD45EA50DD693CD62A845098EFD2441BB54DCC4A703370CF15DBAFC2" + }, + "dkm": "A852138796AFF3B7250F930EA22206B083AC0B36A980E6CBF5D79FEA859A23F2E9D2116DB7AC22301102506E79ECBDEA1F49810B1BAEB2DC63A74C11F71F397D0A633410D29D89DF965DF8D887EFB3520492B2E36E36D72BDB3CF93FBD9E96DCA00A0A2231FC3F28F1432C9402569D0E7CA2ACE7670A9AC8549B957577E9CAAF" + }, + { + "tcId": 3254, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4808B075EE1FC49D9E9F6D0EB22D9B0", + "z": "36CA7C79BA45BEEF340039C6844FDF30E04710A6E80E512D3D72ED1205CD55", + "l": 1024, + "algorithmId": "009FAC98C498DB673D295D76031FA8E6" + }, + "fixedInfoPartyU": { + "partyId": "C9430EC19AF59C3E138CA6CA6FD35BDC", + "ephemeralData": "E17366442A463C528915D83C4B0CD886B1C3B7A7541599548BBA06B77FB11C" + }, + "fixedInfoPartyV": { + "partyId": "866B3891311B48A0D57E4BCB5DB97B7B" + }, + "dkm": "F2AF30344D42388915296AB85688217EA82D8BEDE0E688E17941D1A943A3F5660963B8C29EADBC2779DE4BBB2B631DFFDEE12C6F7530DA4E523E1294D5151EB395BE68D14BA46A4F039CAD9344C3A1924E3E3797DB8BB9FA625DDA3296373E98FA6A59F840E521CB6C8C88B5C3FAAAFC79157DC7667E13B3C73F12277E99F12C" + }, + { + "tcId": 3255, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B58DC2223BEC2C3BCAA9190C5883A9F5", + "z": "4291CF5F1A52C97A8F6C71BDCB70F0CBE339AAAD4C84729A25D93BE5CDEC42", + "l": 1024, + "algorithmId": "2CD265CBEB05950164CCBC8C551C7393" + }, + "fixedInfoPartyU": { + "partyId": "1FFCCC88E5E9841CF1ED98DFA950073E", + "ephemeralData": "AD06878739AE7F0332039059A50D41E1CAC5BEE81B535CD543CFF7B14A2148" + }, + "fixedInfoPartyV": { + "partyId": "5D08D14483D30D37479046AE161932CD" + }, + "dkm": "F500A9292D4DF1567F44B03E85B25BB7C4BA247BC38BDDF537079A71238E3228AB18D6D824D332F198B0892C3E4F09C98376C5356397C45B35AABE8BE8FB223DCD2910C12C65432FA7EF15F40E79518A305D88D50977E9A58B71DEEA85AA428F660679C4FF3412EA25DF48915EE29BDE9DF0829CC3B5057E3BBC8BC465F45F00" + }, + { + "tcId": 3256, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D5F9C77B82DD5287BA72116F6C208E5", + "z": "3A11C8D4BB445B81838B3CF125BEBE86DFFFC8B17C0DDA0893EFF9EC0D11AD", + "l": 1024, + "algorithmId": "E00FF1D31F166AA8D07F1282A0170ECF" + }, + "fixedInfoPartyU": { + "partyId": "69CB80E520C52BA6EB4E576C72990A0C" + }, + "fixedInfoPartyV": { + "partyId": "0F1730C5585AEB8436DB7ED3043B58B9", + "ephemeralData": "FBE092F36BE73CBD8C38558B8CF3D4329C2DFD56DCB522872E7DB01179D194" + }, + "dkm": "F3B40D89C9CED44F25B217B11FDFD8BC438076893CEC47CB0587AA6512DB878D1144842E440B67FFBFC8C31F9F538FB9B7E49E3E193C6C4B3E336B8702A28C01C51CE7C1A8FBDE610983459E12CD2DFE12EE517A048F2C375D71A3C9E1A3C15073A54096EC74CBA5345A0B4334D4A55A950E64885BF29F9202DD5B21FFEF33AD" + }, + { + "tcId": 3257, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E2AD34A75A068DE09E6E5BBD929A295D", + "z": "8EF27133BDA9AEA2CFAC2951BE9ED368233DF88D2805F1EA5D38B3048F1BFB", + "l": 1024, + "algorithmId": "D97AF9A4856891D1354C78C09D471DFD" + }, + "fixedInfoPartyU": { + "partyId": "A6E132B8A0AFCB24267669898985E39C", + "ephemeralData": "6F160C7A8599785DFE9AB372A98B76FE782A7B0A56ED4C4EB85B7608869E69" + }, + "fixedInfoPartyV": { + "partyId": "A91C1F7C3D3BCC8825866CD3C91902CD", + "ephemeralData": "3D825D78A62166F092A4616107897D35423ED5DD90299FCFEF3337A641A137" + }, + "dkm": "98C8FDF4E7421C875E5DB8906A4966A945C63DBA0F0FE83AE20C5741073F8386797CF8E6B5DAF26F25DD152C18561AFDD66D3703B49BB47951DDA83D887A1CF4CAC361F10C4BC122A41ADC592B485534B1BB038E416C9AB63CB3EBE01D416A1A5BEC784352F0D16F01967601628630B32642C0C147A2ECB506DFE50CD39FC954" + }, + { + "tcId": 3258, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B606E03041BEFD4D3C0CDD24278954C", + "z": "F66DE6E801A04C8E09990D4C5B068C14F55CFCC71295C6A560095E59D96EEE", + "l": 1024, + "algorithmId": "F1D4E75AAEB5E12717811E8963F09D80" + }, + "fixedInfoPartyU": { + "partyId": "59CE37CC9A31F9E8B5E32D472B2981B8", + "ephemeralData": "7B19797EB55F9DC59300A45070DDF22B4201D51F14072D6FDAB127B05B5AA6" + }, + "fixedInfoPartyV": { + "partyId": "1296CF261ABB4ECF916421A9F388C30D" + }, + "dkm": "C1F5030A24B337984C3D4F805260D4CA57241506CC2F65B8CD260B2BCA2575E25CC50C4E2CAB21E94E0C09F145AAAA1D016C8199503B32686A099DB5305F67DAC47601949394FEA9DC5447A99FB21D81DD8235327E5F477EB398870E6DD79AA9AD8D121EE2D501032B071C17A5904C50C581255573237031D6B89D39BDE335C1" + }, + { + "tcId": 3259, + "kdfParameter": { + "kdfType": "oneStep", + "t": "27FE363D129611F43E0E3C64E94CA3A4", + "z": "9BA7C374B14D8BF30912684424FE132A060D787F86182225568F1346D168CF", + "l": 1024, + "algorithmId": "7290F53FC89FE559D9B95986A58C9A30" + }, + "fixedInfoPartyU": { + "partyId": "C68FB64BC6274C155E4A23D7F977E623", + "ephemeralData": "3DBE4B41F70EA0C9062E130098637D7B62E1DEC6BADD5EBCBFBA123FFF6C0B" + }, + "fixedInfoPartyV": { + "partyId": "37988F45793CB82B115CA85768C987FC" + }, + "dkm": "0F17E408F9DBDFD5F70CF41320F4579B0406545EF817C58C6B3E4A090C310C5FC95A2EE453F3F509C780B9DB9F61272AEDB917CB97C1A18BA6C9CA82912B7DD070F1C36BF3E26E1DF975F864BC84840058E686E06FF4B74FC6DB11658060009DDF2587B1A199D41DB484AE33640F04AA774655EEAF798CE811B0C2D0BAE304ED" + }, + { + "tcId": 3260, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DFF79FAB9FA9DB1A7C32727201DC56AB", + "z": "7953D70FB86628D23BC9D3DD4AAC7DA67ACAA05924308E60EA3C909E83CF2D", + "l": 1024, + "algorithmId": "8E8F00458645DAE224F281EAD3E35B45" + }, + "fixedInfoPartyU": { + "partyId": "DCD94E41727B6C6EFEF07D765965E242" + }, + "fixedInfoPartyV": { + "partyId": "3A89DA842975B094630C1955FE210260" + }, + "dkm": "EF6AE2FFBFFB7D0C8030E3AFABBFDD0136E27EA8A746466E3221281C4947C31B09D75345C2FDBFD9433BE25F297FB6635D9CE6F8E52BC37F6077CFCEB3FF4348C88D8437829B37B1C97E4AA575E3836DF9EDDAD29D967588166C2A7DEEBF01AA2D41073AEE38EF9E943474331BE2AD653E55E70FEE6D2E31F4DA0993ADA5216C" + }, + { + "tcId": 3261, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2AC50A25EFF42E396AC76CC305E06B51", + "z": "FD19DBA44834BD5D9B141CCF74AA89D2DD7EE43224E04700ED61367433CDC6", + "l": 1024, + "algorithmId": "56F539F7F7031A8C2308D0D3829F85C9" + }, + "fixedInfoPartyU": { + "partyId": "869447E3BEDF7EF01F80052A30D85482", + "ephemeralData": "15B8563C51838B09CDB34D0BDEA2E22D25481801B7D631B20EF6967B652150" + }, + "fixedInfoPartyV": { + "partyId": "D81DC92FF87ECA5EEB82B3BA548DAE29", + "ephemeralData": "409DBACE4180B6607A6AF38B528DC0785BD1A412EF5B549C6E7AB6A50090BA" + }, + "dkm": "56D6CB61D298D0D990445CD175123CF681B02A57DA03084FB016EA427BF42C55E5CA4016EC93B1258E23DC55D8129EDE0DCC5A414815A7E6F6EAE111E0FD848AE5C8B714B90C238181FE52951F75C96EBEC5785FDCE761F469B106A7A565E0FCE68138CB0D9B5CCF6EB776F08841F18EF00A23F49BB8083FAB5D3B4B438DE46C" + }, + { + "tcId": 3262, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E06CC64F28347B501CDDC0542EFE53F", + "z": "4F7643621A335F68CD0AFFC6D20E7C6CAD13456D8796C99874A01C51E66C96", + "l": 1024, + "algorithmId": "D46A8A5248BCA46CB368C7A9CF342D44" + }, + "fixedInfoPartyU": { + "partyId": "BB5F546E7957719EB718A4E6B14E9DA0" + }, + "fixedInfoPartyV": { + "partyId": "53541286E9F27E9E8B6E40FA5575169A" + }, + "dkm": "AC14BF4FE4C39A3160F530257C384B294CCFA719BD4A0D9D9B3046EE4F168A1706E37017715937CC7B6D01F3F8AAE1067682B5D3390DB2BC7425615892339515DD7D856DF0C20A6EF17CF8CC777E9E65CDC8C6EA77C0F87AD64D1AF23A43F2D9F37F43BEDAF8C9FED4E40DF271751D8A8AC5CA7AD81E66F48CD7020C0F4E4644" + }, + { + "tcId": 3263, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC31592F2208C63E848BC5A15356ACAA", + "z": "B8B61026B1267B2E3E6EA9282E08115DB35DC4E7CED3A140F82EB357FCA5AB", + "l": 1024, + "algorithmId": "9AF1B686152E7210E8D819ECEFAB06F3" + }, + "fixedInfoPartyU": { + "partyId": "C0A4F6CDB215B37BE699BAE1696140B6" + }, + "fixedInfoPartyV": { + "partyId": "EA30D27D8DDCCE673C22082B2711AB13" + }, + "dkm": "C7E63311A3D7F3C47CC63231B967035CCA49A632F6F31C0379789387F1B867BFAC5E56E48E3FCB76D8DA7C66BC3B260DA183D7CCA6BFF42C010BBC667DEF0D3DCF75EE485F061EB27D0AB2CC3CDF6242827D117B7C939F6FA998B97DA7228C24EB52632DFBDEA0535FDF5848B3C28EE1D17C57C8D509857D71EC482733DEF856" + }, + { + "tcId": 3264, + "kdfParameter": { + "kdfType": "oneStep", + "t": "713D5EEE58E9CE676B7C7B715B28E875", + "z": "0DEF9DAE56506D5D14C9F00B4C09078EB00B9CE64641B3B26F79CE6E6DB260", + "l": 1024, + "algorithmId": "D72F6EE601AF398DFC48877CBDBCEAD9" + }, + "fixedInfoPartyU": { + "partyId": "CF953530A77678FC08C00034A13EFB2F" + }, + "fixedInfoPartyV": { + "partyId": "C414C0227D010F9E97803211E4515B1D", + "ephemeralData": "B7D98BBFF0950ABDC91E299D4291FA81D728E32179925000478D7C695EEA17" + }, + "dkm": "0CFC17475C9F5A4F70E97ACCC3B3A5F276D532F3A9150F32D1E07ABA19D9E5FFBBACFF3811A2A71794010FB9A77504BEEE4638AA32D97F441BE42A4642E2866E24F9CA01B5CFB197743FEDE2FABDDA1C3EA018C63D594F50790567AD5EE68D05756170E7722451357001E431097C131A5481B23C69A60B97544345B7D151C90D" + }, + { + "tcId": 3265, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46722E6D2112951C51EA0F232DF84C57", + "z": "528B46C764A0DA75B853CDBF3BA734619B9A157B3836BBC8BD52E9972E3DFB", + "l": 1024, + "algorithmId": "26456356FA1AFFA1BFAD595C81F1C584" + }, + "fixedInfoPartyU": { + "partyId": "3C6ED7ED72308E053CAE3519FFD38C72", + "ephemeralData": "9ECAE19D30366B852B819B41EFC6E42F81F6ED49BDB884A778B3F2C5EDB1F9" + }, + "fixedInfoPartyV": { + "partyId": "17F2F17C94575BD87F8C9E95CEE2636B" + }, + "dkm": "19A6D88305BEE44956658BF4F6243C594A2713114AAB9606DD4563ED0599AC4D240FBA59661A0573401D8D2EFC2947D7D0ACEFCA9E41E66747AF54DB0FEE3A1E55807847BDE6A49966ABB24F38947712D68BEBACC19FFC597A45F8D6D33C6561F96277CD8ABFCB8E69D47C8C62B59D073153A61A8BE6EDF7330DD4F72442C63F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 152, + "testType": "VAL", + "tests": [ + { + "tcId": 3266, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FFF671C562486F11881BFF9E43788B39", + "z": "D4ACA30538E260F96E3F020351C82947E065A36C43D40CCFEBB9E1EAB065076CC947E791", + "l": 1024, + "algorithmId": "3B28CC4CB8A6D09E25F292567F508F04" + }, + "fixedInfoPartyU": { + "partyId": "1BBC3D17820D92191C11B653E762BE79" + }, + "fixedInfoPartyV": { + "partyId": "7DD4AFB822A27750E311F64F9C304136" + }, + "dkm": "3F91570EE4C3C32E5628C0B6117C05521FBF7639F9DA768D4BF59885D17B6E038DC46804F02BE0CDDBD381DD64B013D083448CE1E09EDD2F0080C946F71C48C87D7F7F61B72D7B829E5B60BE78C001092C43A4891F994F6708B3C5393957D1DE63117B697C90F59CE8C520E05D536F2653BAF9C9F70FA190600D8CAE222D674B" + }, + { + "tcId": 3267, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBB75F2DA5485F79A593340D00F60F97", + "z": "3058262E9E5E8CEF2EEE13406327AEFA0BCD7059525AFCE2A1F3921C669AA49DFE1A612C", + "l": 1024, + "algorithmId": "56C2D29285F1E5FD8B32378E68B8D397" + }, + "fixedInfoPartyU": { + "partyId": "BC4BF5047CC3F2407AE48F75F2B8C4B8" + }, + "fixedInfoPartyV": { + "partyId": "A4BC7355348F776CB58ABDB63A7ED0AB" + }, + "dkm": "0FB78AD31B54C83534D12AAFD6AE7BDBE9078FA310F83AEE59B2BB7AB656763C823243083677DB9708BE3957FF460D698687E1618E3FB2F542D85EB861A9699711FF2C87769A18494681905FBF09FB896564E87F2215095619A2B3062DD4418763CDD752769054C1B2A7558DEAD8D71B3B8D305D817DC40397761C4F9C6DA5B2" + }, + { + "tcId": 3268, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F044D47719376DDF37FFD6E399C04E25", + "z": "4FEFBED68616733A00A5027DF257563A3496D1A2E603602B5FF6080B61E8A3C3C0566A96", + "l": 1024, + "algorithmId": "D24078BA86AF1B5B8D8D716D853A7CC8" + }, + "fixedInfoPartyU": { + "partyId": "A57750697F0BA0E0DA8D5F65820F8022" + }, + "fixedInfoPartyV": { + "partyId": "706D8870F29827E8FDC04264123FB610" + }, + "dkm": "6CD3885AF3916964199A92EEB19F19695C5605B33AF2CA9AC1D4C03216638B141ECD7AEEC62B40EB9320F5F88847648F682EA689C4D1FA50611CDD31DAFD7E3A5557821865B78033B44347C4237730085204CF8289F922E38D25D375D5E5801ED7FC229FBEDB7419A70A4BCEA83A65ECBE61F858E3A890DA7C7512D8DA2517D0" + }, + { + "tcId": 3269, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79397558C68D077336095CFCBEF42E63", + "z": "616FE7CD30B9020F4C31B0FE9BAC71FDB4E7F3C0A70D15466CEB34958C32DA34D7E0ABED", + "l": 1024, + "algorithmId": "CD7F500D5D6007A511C99D53A4E708F7" + }, + "fixedInfoPartyU": { + "partyId": "6405E6F95DF09D70C82868FC8899A770" + }, + "fixedInfoPartyV": { + "partyId": "A55E9EBA7A927CE6A983D944FF7C7B85" + }, + "dkm": "099DC1D0F43995FBF7C6638060E7AC402B675AB872E2E6A472663FAD1AD5CB18E0D4B20621B97B17C537CA10016C2A1084FE15399D3D25B0423F72DE26A3369932181F7DEB15833146BD4788D64608707BC2D0FE11F3BA4C198CB2D3AA1EEC516E0B207723F72DB021BC35AFF5B6EEC6198DBF3C5A2A6932F49AA478E96E9C25" + }, + { + "tcId": 3270, + "kdfParameter": { + "kdfType": "oneStep", + "t": "951B1FB3A952E2F1BF17FAD38018FAF8", + "z": "E65329F9E4688C0B9D308A53D8C256B110A8A76FB02A4A75E76E9ACF28432AA409544BBC", + "l": 1024, + "algorithmId": "894355310FBF14031B355D8021496BD3" + }, + "fixedInfoPartyU": { + "partyId": "0B3AA1B8A749308C38B1EFB7CDE53A01" + }, + "fixedInfoPartyV": { + "partyId": "F74BEE8931431DA5F91AB67B8966E40A", + "ephemeralData": "06F375B0FD4202066DD211D3CA83855DEC45EE6D5D5169E48941224B89A4C159DAC234AE" + }, + "dkm": "52F5B172DB323B5425AB6A9B87776736D1A48DEFD7E4FDB61E301B56BCCE3420FB5384A1691E14A786C5B85B4B3AE289BC3840A28762F3DAFE3F1EDE61D5C2542CA3A2B2CAFF85BDC57438D09A120FA93225932FA33DDC62AB254AF48287CEE3D9844042FB772B3E206E16CC17E01FA9FB211A35BAFE984F54E63AB35D00B3D7" + }, + { + "tcId": 3271, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1183E5E1C81F1C6482F41922CDE6304B", + "z": "16A84AC8CCA373D2169CBD0AB117EAA6C7E8A7B666E7110FB5ADFFA80B0E50B1A5761E32", + "l": 1024, + "algorithmId": "ED429035DB5C4CB2853CF132013FFFCB" + }, + "fixedInfoPartyU": { + "partyId": "3912B83453723F6C2224DB21FA3C9D1A" + }, + "fixedInfoPartyV": { + "partyId": "69C4ECE05B3438F8B4F39BC407486BBC", + "ephemeralData": "F96C63EAAE538CC7F0A229464902550E60DF0CD0696119E1494ACA45F4C5CAA5EE6A184B" + }, + "dkm": "8ECD10E76861AA0BAFC9546A0EE57A1155DE1A5F90F5ABBCC4BD7A90AED8EF52C40F115FE3F68D92C29DA735805F57738172D55B986D1BFA9C0E57C28ED31D2EEDD5B2FF1A8361BEA2DA1946E25FE7C2A26910F7832D6A16617B3AFBD408434B6E8FF238E89CC7390228CF78AB0EA30DF5C21D6443986E41A9A0BA10ACEA26EC" + }, + { + "tcId": 3272, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C83A37E5981163498DFA675464A0EFD5", + "z": "BDCE51D286CB0889A9F4F10680F978680702195097CDAA1CC6E27E410A84AEE47E048DF3", + "l": 1024, + "algorithmId": "39C8BF4AC11A0DBEB1A19A0D3E7F01E7" + }, + "fixedInfoPartyU": { + "partyId": "CC487A969F713484D522956A265549BA", + "ephemeralData": "F19F50FFBF0E13547FD2FB2355D39DDBC306DC0FDCCAF35CB23881DBBAF37883937B6033" + }, + "fixedInfoPartyV": { + "partyId": "9E86C3A7412823E9138F6C62D1372A53" + }, + "dkm": "2F6CDC977069D66C7296F2F364615BB0120B901267DA5710B545517756286BC273B63E4AEE64A38C72D54E7F53F4208D9E492EE9C358F2EF402A2152E97FAF1553387CC9F28BC0DAB321DF6CEBFC90027B410BDF5BE94174A88C0A32BA901637D184BA51DF7F5A922A1967F6D61BDCAC4D0E0A31265279CD877B7394433707B8" + }, + { + "tcId": 3273, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BA04D409F3DDC069AAFFC12A55776239", + "z": "B8CE94F138DDC697F617357F7CC27FDC7A3E77CDA40931BE29CD75E3E9E2500A3301E3E8", + "l": 1024, + "algorithmId": "577C72465AC0437DDC042C0ACE48AEF8" + }, + "fixedInfoPartyU": { + "partyId": "1C6DE2D6A37EF2736EE091D99DB72793" + }, + "fixedInfoPartyV": { + "partyId": "BF25CDA5E86296403602A6A7EDBEAE16", + "ephemeralData": "0F7B39E35925CD867EFA9867B481EC5F4858299BB6A36D72C11FBCC49DB37A1429345E66" + }, + "dkm": "B03007B77B84F462CEACAD7607BEFB18D7F7A9F49D62B57E8FCBDC0A5F24299ADC0FFC61BBE829F5EA92687FF2E742BA7BD6857AA2CB5090F79B133DC1CC6F53ACA3A0CBEFC675BCCBF7716ED6BB9D5CF9EF2478D09A60D8C09C117CFA7A45021452FDBAC184910ED0486044AF54755AC1518E0F727E73235B2858508D0CA475" + }, + { + "tcId": 3274, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A90FBB26748589300B33C7E38D28B356", + "z": "0FB8C894D49D73CB873D2CDE1366502D4674230981453AE8149BFDF91F4839489B9CE2E5", + "l": 1024, + "algorithmId": "D9B71DF19E71A390C3E850116D3712DB" + }, + "fixedInfoPartyU": { + "partyId": "026B0344F5221F2CE593086A1D901B80", + "ephemeralData": "4BCB8D9B08C7434709BFE781BD24DB5792ED003582207FC6608654C1FC1CBC887B957CC8" + }, + "fixedInfoPartyV": { + "partyId": "030E73019F65850DB4A920745EF89323", + "ephemeralData": "9D2B8AC434D4071F82FCB06F31361E8E08A15FD4B439C47D8C7DB412FDA1FAD757EDEF6F" + }, + "dkm": "5059D9EA7839F005BD6463DBC2E7E3B64D3261334B66E466F71BFB291576C0B9EA0ED6E943B40C5367437A72663DD4629575AC9823C1B45121E541AAB3A6059524FF579285018535E26DE8975AA9CCD03CE195CC519CEFA2FD5F6F6BDDABAC149099C3B6E9C1F823430C4FD773C48044FF82D9D9F0925D454162B766F57C420E" + }, + { + "tcId": 3275, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDB7FF3D51BD7C1D9BC2A4BC4BCC8F78", + "z": "3CD2303098F27C1BABEFB54EF4C83D50EA2A5BF14B46B17655A8CC35E88BCC20C6DDBEBD", + "l": 1024, + "algorithmId": "3BB2DBFB90EDE79730CED9270D501098" + }, + "fixedInfoPartyU": { + "partyId": "E25F72356C246DFBF016E304AB1BECFD" + }, + "fixedInfoPartyV": { + "partyId": "DF452510D9B8CCDFDD6B78E9F67F6CCD", + "ephemeralData": "5B242C8CDF48EA175D1724CEAF74144652C462C3101CA9758390E0F9D7276CE67E40044D" + }, + "dkm": "16CD775BB09F9A6DDCAF2874E1BEC832DB54D81991DE92A53E95DBA1213BC3740278001CB6B4276A753025FFD28AD963EBC1439C92C665EB6B961686E1ABCC4B19E439CBE52F541163265B3C05743C5CC3C71E0CC47DFC18442DC05110C75F9E1B71A1E0FEE1C3014B48905390CE0C9FF60CAD50AFDEF806801A159D6C5990C7" + }, + { + "tcId": 3276, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A56A1A6DD4B2E8DF9D40B20417DE6CD", + "z": "1D75CE454B6B3DAEAD8EE2D2A312EF54553F0BC8A49FAAF07A182377F565098B76D43404", + "l": 1024, + "algorithmId": "3CD9C4527A589BED121AF9DC1BDCA7AE" + }, + "fixedInfoPartyU": { + "partyId": "9B15A68FE3085AF2FDC98781C4B062EF" + }, + "fixedInfoPartyV": { + "partyId": "342234CCB73A47B77AA9A43122153501", + "ephemeralData": "AFF20EAEE62626458F3FCA4907BEBEFA609844E9D027071EAAD977B01425CDD37B5B66B4" + }, + "dkm": "772F01D758D77FF4EE80FAE9EA43B5E6C41B63FC696A1E0EE8C26A2F95E524C56423D2FF31BE71C24997591F06BE95AFA1BF7D5B8E71C7B58B0B6E8FD9B041A2669AE86B3DDC628E842B8843A1B30745362B3450436670BBEA6093AE398DBC9C85E8991E506EB954D85BF44ED9FED4BBF9C5FB212ED88BB4062C776767A64FC8" + }, + { + "tcId": 3277, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6CF847EB45472DA2E8C475B24AA59E1B", + "z": "FC04A6EE236022B5F0AD49BB8AD8431CF0E973E16B97349464F72A97C20B60C415B5A96C", + "l": 1024, + "algorithmId": "6AD9EEA57112E76B4C68FD1E4F3280FF" + }, + "fixedInfoPartyU": { + "partyId": "7863DB966D535F7E88B3E292BBA5C439", + "ephemeralData": "56E7C5E7BED95A3FF55B0B50903A5E2ECD1C319B2FEE75D3CA740D1BB27B592BD0294F07" + }, + "fixedInfoPartyV": { + "partyId": "AAFA3D65EAAABD3ED576082A6B0E2BDB" + }, + "dkm": "BBB74D767D1143DBC8D103C7ABE5C4A4F0893108A84100993A05C8156C2DA960A0FEC715DF15B7C238AA82F67B0DA99B21D71E6175ED9D1E84BF321DD7111F3B320544B12DFB9EAD4A8537EDB38AD74BB4D6E724EE0C68F5B7DCA70B769FFA70A1D1B12694137AEA5A41B5671CC7BAD5E22C0E415E0FEB09CCBA64F2D3427C39" + }, + { + "tcId": 3278, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A52E1FF30BE7CA122E7BCDD23DA7A113", + "z": "4C8E24350931D5EDABD155E56BCC7C5AA2C76CF895C3DB9E0D54D0C4083252E517AE0851", + "l": 1024, + "algorithmId": "F62B5355DFC9632925E1D576E3836139" + }, + "fixedInfoPartyU": { + "partyId": "87125107368F6E7901789E6EC01014A4", + "ephemeralData": "D9A9B1A9C39CA49AC576F2CA03BB33075BE4F1764D79D74A9FEE1B86819031433CD44A8B" + }, + "fixedInfoPartyV": { + "partyId": "6090E915962E618A83E73F80E2610FB9", + "ephemeralData": "617D953C13B1AFDFC36979384BC8DA028F67939F2E98F52A7EE2E6CABA5171D08E58502C" + }, + "dkm": "097C59A05B1418C1D69D3DA8843CFBB393380AEC12C1DF8B225466BE517EF6B568673C2937563EDCEC034FB5B9A1639159C18BC0BEDAB77277D3D55EACADCDC94460DAFCB04042772B31CC9CFAD32755633B722D2A6BE12861A1090F989723C474043EC633BD2179A82490D519040679BB0B49676C87E43DFEDCB436341AC8FE" + }, + { + "tcId": 3279, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A88AD57B020588D6D112EA66FB40C51F", + "z": "2291BAF2C2C7094C03A6A4884755B5EB7A2C0E62E54D6E60794AC950D2D7BF7608BE003A", + "l": 1024, + "algorithmId": "28247E23CC637D98430C528C7D759A32" + }, + "fixedInfoPartyU": { + "partyId": "6D9F203B677198A09DAB6EEE5FB11CBF", + "ephemeralData": "FCE2185A6A2CC83F32EFA6B7097C8CCC5C46252BDCA68687014685D318D28077AB85BD10" + }, + "fixedInfoPartyV": { + "partyId": "FA0F8BCA11189C64E91A46DF9B48760C" + }, + "dkm": "9BA2A1259E3CDD03CDB696BAFFBC35865E66D51855E955C118607DA967E79BB0EE311A99322888B1BA94BA30BAE19B3E785E70F928E19976016A7B32B328FBF8AC46EB31D9F2E5BA3204220428EA92DE968F328E3A7B5A0A80C6B0A205C69C00A28818B0ED71375BC9275C30C64EC671A74B605DF32098876B83807998DD840A" + }, + { + "tcId": 3280, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11B5074E383E9A5331C0C87F1009A86D", + "z": "9815FC059EF2287DD6D2E66CD0DEC6A4E4031CD9AF3FB30EEFCA7886D37F14C1D6D7B18C", + "l": 1024, + "algorithmId": "BEC5B14AA10DBAA64160BC7026172D98" + }, + "fixedInfoPartyU": { + "partyId": "325E8E5B9F22D1FD0789352958FCEED9" + }, + "fixedInfoPartyV": { + "partyId": "9E12EA2B865E55A841DA6907D3C66CD0" + }, + "dkm": "702DF52318657C6C621E72A5C94A09BE35CF390279568809BA583222D3333F0D0245CA68A58769711E2752FCD090ED3D3ED92E8A02E7A289DB5EFE921694164B2D981F262DC145332C524DD013C09282A33A87F8E8FB32EC6D6B5BA96D47921EAF118BEAEF43EC2CBC836D20CB33909A79098959AC036A5C902B0AB3FE297D0B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 153, + "testType": "VAL", + "tests": [ + { + "tcId": 3281, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0AE8ACF57A4EDEA7E42853F901B74906", + "z": "AAAEBD317AC83D4B2B3E2FE7BF9B0FC8870CBA77B7CBDCFB9F5C805DA4F4", + "l": 1024, + "algorithmId": "C3560056EB1C49BBBD24FC9BD95FF090" + }, + "fixedInfoPartyU": { + "partyId": "6DDB4136DB4D6766D5A3B1F611610FC7" + }, + "fixedInfoPartyV": { + "partyId": "2E3E6DE2B81F58C8CCB9C436DE3E1520", + "ephemeralData": "841D83582D45A84A91CB70A811A25A610AF563E18058C56C1790FA5968F0" + }, + "dkm": "D891BDDAF0E6E6DECA9F9156135EC872F240FE380DAD036093256F924D09D2CFD29BE74A08B35FD0469F4D6A8206925885D9B22627299857A237550A8F1B6F1FF1AFE536F6F5F279A7EE3C742AA553D749DC1B00025600E992A111D5CD2BED01CF9AB40FE6A8DFAA107DCB156DCB19D04D0AB5DD12694DCD997641999D474CA6" + }, + { + "tcId": 3282, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1045DE6E74E41E4F8D466356B7B167B", + "z": "CF6C2D4D84868333EE878A9F9DA82275745BB4CE30F0C8474A63BFB147C8", + "l": 1024, + "algorithmId": "1D08617BFFABB38FC8B6BB6E327D5BE9" + }, + "fixedInfoPartyU": { + "partyId": "2097057AB3CE31B949B03436D9AE31E2", + "ephemeralData": "74D4BC6DE35F71413D82059D4E215B1AFCDF392D14DA4979BE493E2CCB70" + }, + "fixedInfoPartyV": { + "partyId": "0F82205C8F347399904061DDE766EC2E" + }, + "dkm": "7078E973D8BA36925CEF9E059F1EBC867B576C4C09274DE39B60A89E2BD3BFDAD08A1A79B10481F6BE5217C8CE44C1A3A7B389D69319AB20CBC20CE1D67C3C7314298EA715D7A30C392499611BEF1AFA42B4F918ECA34F17F37BF6F740CAFE2DAA471917B9ABD1F1CD6577738E78D78ED54347F2F413454852683E2495886B34" + }, + { + "tcId": 3283, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5D362BE5C5FD468691D83BB2E024CED9", + "z": "C79E5B9EACF36D4C1EEE2E6BEE2B2555AD2737F80B0B533120DDE9A5CD4C", + "l": 1024, + "algorithmId": "FB24B8138EAEF38C448C9CA1243DCCA8" + }, + "fixedInfoPartyU": { + "partyId": "A142A6D4D19DB91E3B13464250BC605E", + "ephemeralData": "491C91B1D0F0120F6BD77A98AD44B4D58131F537812E6F07C0F699D8F0D8" + }, + "fixedInfoPartyV": { + "partyId": "45DBC514E0B5A0682DC66BC642522BA5" + }, + "dkm": "6BBE993CBFFB6FBA703D6DC7D13036CDB7CDAAE03FEC5287B34CE0208AB17B56A34CC3B494B557E88EE0FA2B8E5210640198A132E9FD9F55EA3532371A07729007A67C373CEE7081A6A0EDC866CB09BDC7AEA41CF6A5419F12DDD8F381E4D5EA287EE934E60979AA17BC8556F684C9466765F54558336016A678133B53180349" + }, + { + "tcId": 3284, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B933205D057B6EE397FEE8F6516AEA3E", + "z": "B57C564D58B88DE59A61FAC8E7E25CAB6D03E28025794F948E5628218FEC", + "l": 1024, + "algorithmId": "D917CCB1C5B2689B98BAF8C430F0B675" + }, + "fixedInfoPartyU": { + "partyId": "1B67D0D81A55AF82EEAA21D9F8347A3B", + "ephemeralData": "C247A41865F4B18A940BAE06EAC4D33E40FD7094AA5158395876221EC275" + }, + "fixedInfoPartyV": { + "partyId": "7E1676879FFA21C5925D93D8C59D2514" + }, + "dkm": "F96F898AF07112AA1F3A7EC63A52F973A821DF2FA682FA882B7B9E1B0BCCB5715F29C31F00F21071BD9E882314148EC0CB98AEA1F2F06F092B3D6E6C7CA6EE6F6D763E57F2AE8F2454E2FC407A3FCB899B0C4A10A16E56C3793F3B2703E3B93F316B2E940C326E7B3602FC948667CD1EF6BA9A10897E1F7C67AF8251ED6D0A31" + }, + { + "tcId": 3285, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6A8A7BAF70968F72B8A59D5DDA6094A", + "z": "3C4AC4FE026D4D563A85A1F69F0BAF2F81B4D1A766846F2B4DB590A7FBA4", + "l": 1024, + "algorithmId": "B94BA2715E9497AB2933542DF52EF8A6" + }, + "fixedInfoPartyU": { + "partyId": "B9B26F5936DDFC04BBFB76BAEDEE046F" + }, + "fixedInfoPartyV": { + "partyId": "24664FB2225AA5692107B11BEB593875" + }, + "dkm": "A3F7ACA53A06D56283085E6DB4C879F5D06346E022620BD8B58EED57AA9812BFCC9118957F407D99AF98DAEAE843AA1CCB61D6BAB59197D3D657A21CE761C1FE873DD1218C4CC60944E062FF11A135443B4B5B3C90FE5D15AE77363316EF732B9EF9434094466024EE2B3D71420139B4DB15CC4FF85AE8D0A2C1437D0A79C211" + }, + { + "tcId": 3286, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A23106517A5C97C8E0122D09E7790FFE", + "z": "49ADF759159747CAC3D9F5AD1ECB897094C0329CB1F7FD9DF77C36851A34", + "l": 1024, + "algorithmId": "FF6051634754D7BF82C3098E21F5A975" + }, + "fixedInfoPartyU": { + "partyId": "E09158EF7B7207832ACC4813B2A5B831", + "ephemeralData": "D35E83A59AA1BC27810D8CE380AE50A69D679F3D5071C83C5833AED32734" + }, + "fixedInfoPartyV": { + "partyId": "8B8EF8A1EA695FFD9BDACF25F5B6B671", + "ephemeralData": "DF222384821276D67871E887DE9D69B8B3980C16FFB21253ADD8412ACC6A" + }, + "dkm": "0A2ED0328A708E3A975625A7D5C59D9EEE84C509A448B02BEFC75798F09AE33E4A46727D0C82C700E1CA68F82A0BD9B5CC4200F9E92415059787D1E2505AAFFBE5B87166666D246904177CA396FCBFD4E1F871B64913D625564621A692410E578942BE1E2FC4D333475DF16E6FF9A717E61283890350C3AB845688EAECF822D0" + }, + { + "tcId": 3287, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9842734257F6C4891067C809305A924F", + "z": "2F0CA8272E3C1E3C237CF9690E94470E2D4A736C81534D5D873799C646D3", + "l": 1024, + "algorithmId": "98360F4514C6FA18B987036DB03EA4E7" + }, + "fixedInfoPartyU": { + "partyId": "F35C87DD0C35C8619C49FE402DB7A477" + }, + "fixedInfoPartyV": { + "partyId": "41B560095CA709AF1C490A33C3AEB55B", + "ephemeralData": "573FA2F491116D9A446C5DF3CB6748C2B44670C4A1ADF8FD10EC1CBCC709" + }, + "dkm": "5D48E357B27752B8E645F880331FD9FD42EC5F60F0D0AE82C5F72CD2CB94E17ABCB40F0D6F5F79574CED0AD97355D70C23DB7C33A3DB5F4D54A23275D7178F90B06EBB542E217BAE91E947EE2665E71B78C3298E1666FB5DA1E3381237119A897656841B96D096EB1105BE1F0357BAEA902BA880F08632086E96DE40916C95DD" + }, + { + "tcId": 3288, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07BAC704DC6BA85FA571793CD8A6AADE", + "z": "A5638A5C99B2888E5C019520AB93753238A827195C04CB568717696BA80B", + "l": 1024, + "algorithmId": "0539B0CF76D773A461BC4168000A11F4" + }, + "fixedInfoPartyU": { + "partyId": "07917BB01DC9A4896C2BA69AD0B8DC5C", + "ephemeralData": "4B395FF5E92492D26084B10A6447B22099162D092CDFAF912D914BAC2E64" + }, + "fixedInfoPartyV": { + "partyId": "3E227ABA2027AECA9429913C1598E980" + }, + "dkm": "F95B44F845FFDAAA77A10C2D65C46DBF0427E37B91DC278AA745FEC830D55C675475F288D6DC54EA470B096EBA2925DD09D9D4E9B4A3A2B7AC2239691C22930B4D47814EF7751D4347396B7AEE1C7F974A6F48E97EDE0CF97C7BD80ECA5710930749937B2FFC29238DABA4D1058B8180DEA725D72438611742289D4D51CCE9DE" + }, + { + "tcId": 3289, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8230A29FCFF5ACF9DECC7CB47685245", + "z": "8B5E5060D95555BB5D68572C5227CABB7276406EE3AB5BE88ACEC1003126", + "l": 1024, + "algorithmId": "594077E2D6990658E1875EAB3077421C" + }, + "fixedInfoPartyU": { + "partyId": "AB59E79B0C6ABA8A7E76B0B0E0E24EB8", + "ephemeralData": "C15BED71C7A8530AC2965D202B20FC9829F46BAB75C850CCDED6D4349F5C" + }, + "fixedInfoPartyV": { + "partyId": "13CB3AE790166FE1B62AB003B2A9FBD4", + "ephemeralData": "DA0647B04A69D1E72542C2AFA106F4DF6C0F2CE0949A904E39BB7B10D290" + }, + "dkm": "0F65A5548A8B8065A51078BF15728D06877F29A65D91F87053D138AC6B4554AA0A220B7A34D4AD5277B9E02D7934BA68140567A7F089734D3E01DDFAAF3453D81ED5B7CD7199DBAD3B7974D5B85CB14F0D237642EB9000062C24C0ED7A1BE813A739436F6DF9FE864105EFD3193B712B89D3BA126599C387C0FED9214674E293" + }, + { + "tcId": 3290, + "kdfParameter": { + "kdfType": "oneStep", + "t": "72768D1540510E9240471496FE07F88D", + "z": "87835CB0A3A947A783557F186F1DFA5071673738F3B460D7FCF1EC33EC1D", + "l": 1024, + "algorithmId": "B248F64233F92ACF95C8D56B42E4F05C" + }, + "fixedInfoPartyU": { + "partyId": "10DBA249A72191C05CC2561587B3417F", + "ephemeralData": "39AD5D86AEC037F95BE083F6732CDC7A4C4D43EB449A1DF775A62357BE21" + }, + "fixedInfoPartyV": { + "partyId": "19D6117B69BCCCD9642C9E8ECA996C05" + }, + "dkm": "4CC7738003814C69A22D07377AA4E1E1A91AEF16DD5E48312EBA7D45D1EB6EF3DFE0E582A2EC5768B6FF25882DD18B8AB767AD94A0483E693F6F01D342C2B3119CFE288AB6B3754D4C73B59A8EB407F7145B58E8C871DF00BD480AA3E257ACAB7A4A4BECE8E1E664901D7EBC5E4583B1F2161244D970E017636411E6DAD09CD2" + }, + { + "tcId": 3291, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F80A24BE43B9FFA86842F28D10A0BE3", + "z": "D068EE146738F9AF43A689541589E26DC33187197FD2F4021672D0D6259C", + "l": 1024, + "algorithmId": "D1E67811574189913BB4A48D0EEEBD29" + }, + "fixedInfoPartyU": { + "partyId": "FD16A9FF1608CC5E15A1ECBBC208EFEF" + }, + "fixedInfoPartyV": { + "partyId": "8C14020A98DC7558D9F74E355A593137" + }, + "dkm": "00A853F37D834D4F6BAC792436CFFB03F0F200B71E6152AE6672372ABB9BE7D566672E3DAAEAA511094569A62D1E0FBC57061F100CA165E9A788F84300F732AECD6D4907BC8D6A9B950AC20C75B342115886CD34E48B6234D8B417BDDD9F01F83AAD97E7408DF08FFFDDC4F8E0387CE6C1F0B844473B2617D5E6EF993C74EE8D" + }, + { + "tcId": 3292, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58786ADB55A7A29D714C0D83FD43DE37", + "z": "11D20B4F1FDE5FF1F7D3E698748F8F5BF7DE905EFE91C2D3EB6C835146F2", + "l": 1024, + "algorithmId": "927619F185254A1646667AAEEC912B6C" + }, + "fixedInfoPartyU": { + "partyId": "BCAF846C800A4B25F3C8AB92CDD1AB6A", + "ephemeralData": "8A52DB4C4F9CC6B06510BEB3937FF0C89C4CA4F255FB8492D267C61847A6" + }, + "fixedInfoPartyV": { + "partyId": "4ED65596483FD8034AB9C3A98C22AF6C" + }, + "dkm": "DDAEF58F616874E62453A77FDFB6591BDB4A0C3F9910482DE0D59414C6560F1100F828F1F750CB4E11D235877E4687DD1A1C4F651016A02BB5B0C10FCFCA0363102EC80B62D119226A2DAD3A1EF0871A3855B7E5AAED2C7EBBDF11AF9073BDA6BD0EB77E087BDB02C0537F396DAE8009D39040546B49B565328A9EFC3AFE7193" + }, + { + "tcId": 3293, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1A97F35BB426FCAA7CA2A9AA0DD3A2C", + "z": "E35F9E1014FDCD077AEFD0B030E369CF954691C1E4AC25F53480302151F8", + "l": 1024, + "algorithmId": "835424ADE9D631C0639EA10DDABBC8F7" + }, + "fixedInfoPartyU": { + "partyId": "3869B6F3B744F80324035CF10587402D" + }, + "fixedInfoPartyV": { + "partyId": "C657246B3254497EE1D9CF05D7D89F35", + "ephemeralData": "97F1AE127323AE70280C87FEDBB3C4635087378BB72DBF6673A4400A80B6" + }, + "dkm": "C293DA7F79688A2CE212425EEC86BCE69C2E74054F88A335168222EF1C5F4F8CF5E7BCE9E8A27396E75BF00F2537F2926D7A852B372FA2B1F66B7A038B72C04247469470FEBAC842EB2506497B89B381BC46798B78D7CA7FC86BF5E81F98314249019F29DB6221B3309948F20E1E32EBA39AA80664DC4D341C71CEA174981331" + }, + { + "tcId": 3294, + "kdfParameter": { + "kdfType": "oneStep", + "t": "677E6DFF0B79103D9FEDB37F4EDD57E1", + "z": "C5A9DF8EB0501FA2A71DCE190C7F9CE60800143B4987AD0746CF992DEF8A", + "l": 1024, + "algorithmId": "F3CF479C4DFE5294C7D122F0CC4F3DD2" + }, + "fixedInfoPartyU": { + "partyId": "D97736C72F4F9A243619ADC297D326C8" + }, + "fixedInfoPartyV": { + "partyId": "0428B71E480E4CE249B053F28CDC2A34", + "ephemeralData": "06ED0B60E04D23D3D539CCB45A1276A76CE0ED7F7EE74883384569401481" + }, + "dkm": "55A6BBF9AC7E06ED109CFE52547A5CCA44FDD183F0F2C263578DE25760972ACC0B9F38F3A0EC1F07EAA0131E8DDB770E6FCE4B98F4B44A362843A7D8EE91A7AA798CFE41A009C92CAE7C92577A2427D85F8FDBB98AB1495EAE98565CBDB329CB2831A9802C87035A86D76939574B72851528E6C9369599463CB948ECB3D627E8" + }, + { + "tcId": 3295, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D1D40B439149101A9CC2ECA073DFF78F", + "z": "1C795715A7374BC16E91A80B24D526694BEFCACDCBD9A5CF7B65D1BED412", + "l": 1024, + "algorithmId": "777800EA01FB0A6F19E7E81CD8C63DC7" + }, + "fixedInfoPartyU": { + "partyId": "AD8218777FE0729E89C35B59293663D5" + }, + "fixedInfoPartyV": { + "partyId": "C00C5FAE74634D833CAE72CAE929C0CD", + "ephemeralData": "EF145F0ED6ED87F10B6D754AF01DCC5729AD164526DA1E5CF4F366DE06B2" + }, + "dkm": "6DD1856468E15FA7B6BA0DC07100447A8DD2BCC67948AE253225EE8708E71E755B1F52AEB9C2EAD55BFAA2C39D9E7FE8527025C95D39F170DAD2C5B02B954338B79A45515FA1B2A5C9F71B45772B00D8662E7010E1345BEDCAB54487D842E8FA892877618880948A5718C12525BE55B2F915126E7BF77CF5E0C18631A4A957AC" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 154, + "testType": "VAL", + "tests": [ + { + "tcId": 3296, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F68A58C4E689915919FA2A5EC9EF719E", + "z": "2C0E7263BA6ECE8AAA8A510753248FF5E317DEDC51340EEF17EC847834AD3977", + "l": 1024, + "algorithmId": "C79D22EFF455E484D359EC4CC7E784D5" + }, + "fixedInfoPartyU": { + "partyId": "7A3CA8F54FD9D884194F6874B57D5E5A" + }, + "fixedInfoPartyV": { + "partyId": "007CB33116AAAA02AF25EE363435F1A6" + }, + "dkm": "1417A6749ABF447645AA897FCC48D6E654AE136525940DCD13D08D6A07A00075E63CA448E17E0FEAE630F426B8DBE43D34991AB157C20753092514FEAA7F10C731D669A887536B9A82C31D9781945373134255283253FA13BFE38DED227AED98D3D0703E84D62707ED55B68099962247A9B887F50D7FA579E9E645BC32B31589" + }, + { + "tcId": 3297, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABF9E9E7E025F663176758B87D718EEA", + "z": "0C322B15D50B2AFA3844659E616367594E74D8C190AE24E7AF3FD7865FA2DEBF", + "l": 1024, + "algorithmId": "9AE76FBB56732FF51A0C3BCC6E426290" + }, + "fixedInfoPartyU": { + "partyId": "8A56D7A99396C14E121388CDDC97C735" + }, + "fixedInfoPartyV": { + "partyId": "F2BB996ACC5C64699A590D97857F87D7" + }, + "dkm": "1F310300B39419EE996830D750242E29C186A5DA2A21811B89BAA7617BD402FCE4C1CD141591522768A36D463627A07F50E7C193850874CA8C8AA6D6DF5B9DD257708DBF0A43BA490850B13ECDE140DD1189146E437050B3995D49591CF8D9A20FF29DF817521E77685ECF389F5D808C06C1FD5D0E8E213CBCD67C136E2ACBA3" + }, + { + "tcId": 3298, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CFA4BAB42FFB067704AA35C78A12340", + "z": "D11E3CE242F127683F688500E46A31229D1215F9CDD4633961AA2ED2E3751EA0", + "l": 1024, + "algorithmId": "2D097533FA741B1CCA7FE2F25898B2E2" + }, + "fixedInfoPartyU": { + "partyId": "52767DCFF93E4079125A26001559F721", + "ephemeralData": "B1EB706F46C06B58D7FB9CFCBC01AC0244FC7E673DAA7A36B51B7C15E0792062" + }, + "fixedInfoPartyV": { + "partyId": "C111D4AFABCA5F3E7B0CF0A41C80A49F" + }, + "dkm": "E3CC0A3523A3FC1FFF483594329240A500AB3D1BE71F89B043E471F8DC1A0970F55B6F4EDE8CA33F54798455C063D4589DA0A3359E8D3AAD4331177FDA5D56E79647EE5C4007B9358B17CE933084C65F94B67F20474989EB66BAEAC5D2840A0C013254B9EE04F378C45AE893358541355C62804C7DFD02A2C6FB305692FE7383" + }, + { + "tcId": 3299, + "kdfParameter": { + "kdfType": "oneStep", + "t": "369986AB08E016E0CAD688815C4694FE", + "z": "E0ED50641401B0BD58ACCF803F73A6AC411D1E8D393CC0557A63FEF16CAA6841", + "l": 1024, + "algorithmId": "AAFED3F7CE4BAC679858442BE27A93E1" + }, + "fixedInfoPartyU": { + "partyId": "C13C9D4CC107CC3000B892288E8D1413" + }, + "fixedInfoPartyV": { + "partyId": "D205154EFC41AF52BB71B65A13045C9E", + "ephemeralData": "02B6E20377E3D6D31C5EB9CCE8F4C61C3F731F0CEAC8B40E73ED19198E907826" + }, + "dkm": "2716E13E0BAEB3D38B339DC0868688C5013D480B9C9ED28D596D4094BB503D8BF50B770CF81EDADED9EFE2FC0A23358B4DE0FEBE88F5E1995EDC9D71A4250D02633E304921EF91ECB6A1D30BFD6C5A8D0FCDCE877F807925617D57F5F0F61AA1E6F40482E6C4390673A824C4F493703FC9B70FB5679D92B6E08206035BC85E1C" + }, + { + "tcId": 3300, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CBB4F1E8E06C93A7812183A2B802E23", + "z": "D2883484584A8F0E64D1CDD86C6C57E22661A7316B0C7FAE2C08FDC3131C9B39", + "l": 1024, + "algorithmId": "C74B7DB44FDEA221A7C28A228408207C" + }, + "fixedInfoPartyU": { + "partyId": "9247A60BBB7D5426260338601915B2E6", + "ephemeralData": "486858155084464653AAC548917E8439F679A8AFB33404B8CA6B534FE2C7ABDF" + }, + "fixedInfoPartyV": { + "partyId": "AC7672CF33A74FA95E97EFC188A4F1B7", + "ephemeralData": "CFD384771EF8E820ED4A34F103BEFBEB9C60B41BCF089C7300191F00C821D1C5" + }, + "dkm": "4A6E91B3A701688DBCD74B1B15E6808979975ABDF5C7B97575C95CD96C7129EC69FC9FA87ED9F2AEE52684382B64018A44AE161ED29B3401BA7CFD6EAD2105BAB0FA90879B89F5E9694BADF7E3E429A7B7A4E396E5D2DCF5E44F12800BF59412D2C71F9BFCC4F193EA30902E2E68ED96A47FCDFD5FD06485F57CE712AD9C5F2C" + }, + { + "tcId": 3301, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F402ED20FF3C9D7267EF4B7C2C97678", + "z": "2BFE2C37A33C03F36406817C9C8B3955F98D4D83CCC1E5EC86E1F2D02218ABB9", + "l": 1024, + "algorithmId": "B90974DF799C8BB128F9B45643134636" + }, + "fixedInfoPartyU": { + "partyId": "725E7ABE2882838AA138BF9B6E4C1C4A" + }, + "fixedInfoPartyV": { + "partyId": "3856855E6A9582977BE816C906B95E87" + }, + "dkm": "3A872AF8998E62A06CCD94A3B127E2477084261CFCC5161D74A259C84DD91E266C3DC6624A540A543B3E2F804319EA11970AEC0DA6775F61B4EB24AC365B414CB7BD8ED7502966CE626C9CB9523AFC13732892BF9B660FA8273135D907F99F6AF8937696D11BACE1B410FEAC2C8C4930E678A06C3980F92EEFC109B68549B24E" + }, + { + "tcId": 3302, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2DA0FBA2A652F9B453F5CEC84E9D08C3", + "z": "EDDD8CF05365CE584445A9A785FF0B6FAF577CAA88BD0BF5AB74708E54917245", + "l": 1024, + "algorithmId": "5198798D44E889E97F32434C1A224E12" + }, + "fixedInfoPartyU": { + "partyId": "37A86C11BD58F29453C344E81BFEBBE9", + "ephemeralData": "25EC328850B5F1AB472BC73C7DEF9FCF2D69BA210ABFFB4D2C9C851BFC9736A2" + }, + "fixedInfoPartyV": { + "partyId": "37724803499AEE6235CDF146554DB12D", + "ephemeralData": "7E6344E12D4D1BBAD1DEE7136D6FDC9A0F1BA34CD029504F0BDB65BAB8CD418F" + }, + "dkm": "017DC995537265743D067A3289B2BC8096D643FFE5FD814D7B291B0382B5F86EFEF87B7EE894FCF0925C185330F8E8B0639BD644F416C293F6B617CF9A346693C51C7794AB690A9F50BF2118C5DC35CAD439CC9E1354AF39D5B9CD6B51FFBD81D3B538B87CD66392254875AEEAD4E6FEEF848ADA6FA448955E5F1A6BD177FDFD" + }, + { + "tcId": 3303, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2624B712A1DAD3DECF4ED774DC27CB9", + "z": "3379BDDD384BBF74A81DF56AFB19002540F22F99F3F8A271926ED1AC6B016326", + "l": 1024, + "algorithmId": "B0E0B5F949BCA47EEAE7FAE589AC6996" + }, + "fixedInfoPartyU": { + "partyId": "0D5301F5D4DC300EE70374B49622F942" + }, + "fixedInfoPartyV": { + "partyId": "29B4B43685ECF75845305867317004DD", + "ephemeralData": "287CD862177C5C50F1A1DB0109B9007D3D6C72B3481839EC32FCB18B5C0D9FB1" + }, + "dkm": "07A7F8F00940A03B27A33913E5BDFF98CD08CD140F0262D9EB19B4CFD8130B620CC6E7A46B974B5B67882CAF0E643AD2CAFDA72E8EF8788FBED284A3737E2A672D6601692E881069FAA8B98287949DD48A63C15E30B2FA0C2D9DABFF8A486426E293EEC85D6FCB9848C135F8814F53A7C5D6E52AEE16F1C9712B50FD29705351" + }, + { + "tcId": 3304, + "kdfParameter": { + "kdfType": "oneStep", + "t": "567B01C67F9947C1E7F3801E84EC9818", + "z": "B84E8D4252AD89513ED6C7193A04C2BDE66C4F107D3DD8AABBF6442D7880182B", + "l": 1024, + "algorithmId": "225C3E782B555FBA150DDB996E7144BE" + }, + "fixedInfoPartyU": { + "partyId": "71D7764246DA31A2D4F4E4BE5FFFFFE4" + }, + "fixedInfoPartyV": { + "partyId": "891C79A396A3264241643C40FC03C1B3" + }, + "dkm": "C26D6239D05F0535C1F5F55A509C209E102A60BAFD9D114367ADD485CD4A4E969A199080671D6DD959408DAA68E427BF4F149A579A05817A3F002769C3ABE8077DF55FD12341FDB6BBCA8AAC15F91817F65B53A819C04393A73628866E9CA283AED8FD72975B3ACAC7A5F0E9B188B6E01139C811CDBA8B8BE1BD3F889E002447" + }, + { + "tcId": 3305, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2B4FF9348266FD12727670ADD61E350", + "z": "AFFA92B551BEE382CB31788FF19B4DDB8C525CB297ABA951121ED097FB93C73F", + "l": 1024, + "algorithmId": "E2F2A6C183AACAEDC51AC059B8F0576D" + }, + "fixedInfoPartyU": { + "partyId": "5B76D253E0DD60C68E35414266E3E815" + }, + "fixedInfoPartyV": { + "partyId": "F82E6633D9E3825EE417B79D5D3F364D" + }, + "dkm": "75952ADD4A892F5CE70EA15BCF5D8601363CEB085D6F5132E192EA3C820410C703B84003117745EEA232C0E214779EAB7261CC95A739D904DD4BE0CC99FAA82A5D3487A17A722B5C38528BD4170A669841D2E5C85FAA1A6D253FCBF3305B7F3D2517A78255048F4DEF23CB1001F567010CA4C036B807B3B8D4B2588CFD0744EA" + }, + { + "tcId": 3306, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F64AD5DE9629F32FA664E81C7E1EB0DE", + "z": "04F0816A81F37E2E5B1035FCFA080341F6E0AE3071D253F39A7C3F73CE2BA50E", + "l": 1024, + "algorithmId": "8250E016910D76D9CF17947523249244" + }, + "fixedInfoPartyU": { + "partyId": "8175F316C88B84349E0F81B47182162B" + }, + "fixedInfoPartyV": { + "partyId": "63712FFA4BF5A0D094D8F950CDDB5433" + }, + "dkm": "582646759FC48D9E695B315DBD7C67CF8855EA68332B23A6A4E1D99DEE1679245C45087FFE00CF0B3A7145A7D707AE8740F7C6D409C931F4F8D5F33BBC399449F0E002B824219145C32ED2BF676093EA81C4A55C8ECEA499C5677B83825EB740F49392830E47871D1F49D3DF1F888507A0419D6B900CDD8727B0B9C29D870378" + }, + { + "tcId": 3307, + "kdfParameter": { + "kdfType": "oneStep", + "t": "792DBF2EAEE1EAC86992F19E25AFE6CC", + "z": "F883D1A773ECD118D1DD4D968A17AC8E3AC22F01742EBBDDD868AA093BB1198C", + "l": 1024, + "algorithmId": "E7422648364E40B7B27F895DB43AABC2" + }, + "fixedInfoPartyU": { + "partyId": "99671EC2E347D77D22DE06742FA9D413" + }, + "fixedInfoPartyV": { + "partyId": "380C30F5BD3723DF3B3FE3A2A88120A7", + "ephemeralData": "3BA78864A7E394F46AF1704F01B0004B536AFA0EFA06BF0CF4CE87C592862D60" + }, + "dkm": "36977E17808217E48BA20E1310930003450C1C12A4A43D01209D571989BC901C495BE6F90D7195C79228C23491C7465291A19EAB3C14630EBBAACAD1221DA06FA86E1874FD3D399B20F00027BCDD81252C57BA29075E9BF6E0B9306670B86479A391D6FA8242AC13EA0A0A1D720081984F21C1430D65C57B066DD455FDA5A267" + }, + { + "tcId": 3308, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C0DED9484D8C89516C8A97993427857", + "z": "51D1A3665477F65FB9E800C83CF62F59E8E4BE8A3A03516A9908DF4BFC09758B", + "l": 1024, + "algorithmId": "5EEF1BA89C06D23F66283E1D0D0C2763" + }, + "fixedInfoPartyU": { + "partyId": "D78B8EA62828A9707713F2123311AAC4", + "ephemeralData": "6BD013C0D71FCC7F1B66D6B1ACE075B17FC633B368549D4F8C8A93D0F6652BEF" + }, + "fixedInfoPartyV": { + "partyId": "75BC0FBE55C2A68617F35A6C7776709F" + }, + "dkm": "987EFBD0DA8ED676E735733F8A3388661EBF08D3C899D1861FDB194E37AB85A2494D3191BFA6979CC2456155A816B63AAE154F9AC711FD6F913953ADA4847F94EDFCAFCF43599ABFE96DA9FF1F4CECD1135A21351C39A07955F45510631774FDF5C60E2AAD91055D598BE72104635CD646D7E86AD49AAE5DA4787E598B87E6B3" + }, + { + "tcId": 3309, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6B7C4CA4FBB17EA57AE7C2648F5D949", + "z": "EAEA2C694FB45BEC807F54E197BF868360A48ADA48C197BB3F202C53EF31184D", + "l": 1024, + "algorithmId": "D164054F977439AFB47B25679FB39AFC" + }, + "fixedInfoPartyU": { + "partyId": "607D65BB8E8DB6B81C7E75D43649BD81", + "ephemeralData": "DE87C4F0C72BDEA2080D8B6D401CC6D6AD8ED5D178F702B198F8D5200543CB5A" + }, + "fixedInfoPartyV": { + "partyId": "E0E7A48673239E50E861E5A6600FDC54" + }, + "dkm": "1E1A15436E78CF471699A5E48A3E9D7FBDBCD5480E3F6C1DB446E8B67D38B4D84F277AEFC74C96991D4A8F1247020E65384127D39F28FCCECE91F264468ADA9793525A839700F915200651D545EBF5432E2E8B0971108A1989CBBAF79BEF19FA5A48F9F6664E697B8C9099EF1DC2E6B2C2DE96BD064EFC1F5736667E75C87529" + }, + { + "tcId": 3310, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9440E35D2D194138DA0D1FF618BBB283", + "z": "0C8311AC2B2B299ADE350EDF5B75FFCB53E2F3F39989F6581D0FC0FAFAE99B5F", + "l": 1024, + "algorithmId": "7A3CDEC918DB17F0E03EC66C6304A8FD" + }, + "fixedInfoPartyU": { + "partyId": "44E77495FFC09EA3C37F41F52DB947D6" + }, + "fixedInfoPartyV": { + "partyId": "734670E394D0600A6550B5E56D5D61C6" + }, + "dkm": "3E916A993BB4A02C912C355B642CE81CD4272A18AA19704EEF22E3BF1A7740C30AB9BB6A96B93BD1E199729F4A7FE2CE3F33BBD5B7885757854520D5C32D988939677006B47D0C290C6A500AB8E8F543143385BA14EDD13B9A2338C39A6ED6F6F11C4E688AC8DFAE79CD6B79BC8E80A18B0BD56EAD0390634A6805F156F7E047" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 155, + "testType": "VAL", + "tests": [ + { + "tcId": 3311, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1EF1D0C1123CFD9DFFA4B54DC627039A", + "z": "D321528DFFFC30F9C9769AE814A0F4C00B971301D0A7295D63DE0C4E", + "l": 1024, + "algorithmId": "2C3F46D3817CD6CF186D09D0BE5131B4" + }, + "fixedInfoPartyU": { + "partyId": "39C4575B71CEDB68C7325EE5FF575ACC", + "ephemeralData": "CB0CABD9C2612698BCA703D4070BD6DF0F1E242759262A275CA83E98" + }, + "fixedInfoPartyV": { + "partyId": "39BDA53030A4777913F4E1C26CA16D05" + }, + "dkm": "A9BB1CB79ACF2FFFE67926A9D1547DE57E34DF68071CB6F6EA49DE10091A56CFCD350570245C90D2C7F10D9BF3649027F04257D022F31B91E497304EBCD878CD3D59423D6BE258DAEC44B72CB463D7535FF38A82451C9F20B57DA71081EB838CAD213EDC06EF823ACBEA99F23A5A682EEDA58B188B81B8EBA2AC1938614FEA5C" + }, + { + "tcId": 3312, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8CD36FC59E67805AEF2335D982B2D603", + "z": "3B983DD9A6AB222104F7C776870E659FA21F64366716274E00FC2857", + "l": 1024, + "algorithmId": "93C3B9BF4FD4F758DE39E69F73FC01D8" + }, + "fixedInfoPartyU": { + "partyId": "7BA7A5EF9CC3F11F06EA4824E8189B7E" + }, + "fixedInfoPartyV": { + "partyId": "4EC2F4F7AF6F75EDCDBC9A2BEF07248F", + "ephemeralData": "7BD2361A5C00532F10E94E4B8D4E70F50546131C8968826FF4453F8E" + }, + "dkm": "77222C3E842892F44BECB0A34E17ED56A15C9DFE9CD9C023B2A5427752A3F33174AFF8C33C6470D2A8CFBBA8B97D6EEF6D49A6E526403EE6871F2C76F0A2370F0CE5AFD6BD2FCC79100F1589BD4D282BF82EF6B0F44B2AC388E8299E5DE97F3270EF5625C5201DE6D9D795C6E680BC89C3A1D29435738F6D75EC305AB675976C" + }, + { + "tcId": 3313, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB833758C141ABDC9C0854811BC112BE", + "z": "EFEE0504CED71B25B2D4B51D7AEA6E13B9C030165845C4C933B4E814", + "l": 1024, + "algorithmId": "A1237902AE3312FE0F3FC19ACAA20D23" + }, + "fixedInfoPartyU": { + "partyId": "500569CDF9D7EFC41999678EC7B77D7F" + }, + "fixedInfoPartyV": { + "partyId": "D6C42FE511F8A6D162A2A4C7C06D894F", + "ephemeralData": "A1C1BC6415D9B72E807CB43A8616BCE5DBDE2DB5D0D4AB2AF87999D8" + }, + "dkm": "E1B80B1E9057B074F877AE3DB653B137E311F277EE34760F04AAE4D739E7F63DB2315FE15AE483B0D19A0AE1B61063DD064BB6E9D4A1939142C1D47720A71624653F73162EAEC5CE55601DBEA8E7985B901C186A5C03C5945838EE194F56BFEE2BF06A8C68B34712BCF818970164B11BFDF15494AE82650BC80F309A10A4B7B4" + }, + { + "tcId": 3314, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9A740ED7224C5A4DA16FD678A818AB1", + "z": "13039F293AF25F5BBFABBC0F81207D2D0BCBD54BA46ACFE86F51FDC1", + "l": 1024, + "algorithmId": "C67620214E95B638EBFCB8D9A8794038" + }, + "fixedInfoPartyU": { + "partyId": "923EDC1FE1DD06CE238DAC0FF8FE8A93", + "ephemeralData": "DF08B2FCF081FCD3D7C01157CB4945160A628DE7953063A3A526AC0B" + }, + "fixedInfoPartyV": { + "partyId": "1E2863CD26F06EDDF21E0860207F9FC9", + "ephemeralData": "21E8EE56270DA9420E47CB515BF0A8352B0F5EBB7ECBC81594C0B819" + }, + "dkm": "A09FCD7DD66D9AAAA3C8D4D75F945F64E1845F08BD608159809057D9AAFF56E0AB4456C56FC9A605EAFC68C16AB12E842FAE13487AB25F8097EF99816B9DD2B8768704F54E7127630E6C0A1259C9468987707B2A15C7E19D03B835B732DB506CEA39E8A21A9ED82CDB03EB5123AB442CD056F743331919C33BFC770DF1E2FB76" + }, + { + "tcId": 3315, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7093102217E82506FDFE1D23CCA73DF9", + "z": "E25EE0051946CACC1BBCAF494CD95A65B34D713F945C66879177E17D", + "l": 1024, + "algorithmId": "F49256B2B603595358DF2C0865DD0337" + }, + "fixedInfoPartyU": { + "partyId": "B18D12E0926C01DFD13893C64335C844" + }, + "fixedInfoPartyV": { + "partyId": "08A78C5E9AB2A4785373CD9B4CAB974A" + }, + "dkm": "54B759D30843436ABEDFA8541D70875F61ED7EDD0A9F33E310A2443CF62D0E9A26770E757E3BA8FF29503BE924A55BC3AEF4C63B2520487F7934241373DD390050586727D98339F0F609500AFC8E8CB41366CB94BA3A60B32D70F0275159D9D4FB9E13CAD7F974E2C5F738B8AF3C6178330A32FF2E0D09D678154D73DC852449" + }, + { + "tcId": 3316, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02B7623CF65D91743A9666A5AC9BA42D", + "z": "6816D8777E744F9759B6B3730713DC045EDE6171BC5D2F4C9F0532C0", + "l": 1024, + "algorithmId": "FA2044B50C131BC93C6059FA8B120EE4" + }, + "fixedInfoPartyU": { + "partyId": "433BDF47FEAE803E824B106366FF6AFB", + "ephemeralData": "04F3C89091F3FA776206C0F418732786BE716B5EAB8982567D973538" + }, + "fixedInfoPartyV": { + "partyId": "A505BB76E7A5EB7FA33FF73014B812B8", + "ephemeralData": "1A0999CFE88F8D5DB24CF2848F8EEC05413D0FE1341F52E63B58B8C4" + }, + "dkm": "16302C79D61874084CF8B44BDBB7E493AECEAEE85384F90D221E0766E1CDD93BEC24ED55C8DB8567495D6D1FB076BA7606668514731139EF40AFE103B7103C0E1C5A7D89620BC8050D3F56C4A2B3E4695B37F2EDC3DBDE2BF38BFDCC4ECE60FAD023EB0F8A5D170C24A99F8B54FE2DC6C88BC309894DCCD9CABD006125D1A297" + }, + { + "tcId": 3317, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD61080FD078E3C401F95BB3CE0F7F03", + "z": "3279B3329F1C0D62CB4592F72D8ABE3E3B620F7612E2A5DBF76D8327", + "l": 1024, + "algorithmId": "E5F139895640A10635EF85163EB52BFA" + }, + "fixedInfoPartyU": { + "partyId": "A357FD9C5D0AF9CB062E933FFD251F0C" + }, + "fixedInfoPartyV": { + "partyId": "2C27C5CE661A4B96C37DD84B5806C2BD", + "ephemeralData": "1348A939A746C0DA73F174A679B5642EE788FD618490ABFB65EA5705" + }, + "dkm": "826DBA942E1E2F3DC3077BFE1AE3B02BF6C04490B14843B5FB19D77CC462D29281B7743E81E2A1D2C4304C2DD01180D8FC097A1FE3A56483C54379883C9912247C2914F8ECE7EC48888514B596E7C2B97860471253F7771863A1B2A71E64BA114EA4A95A0EA2009B7D3CC83291479F37D63A8AA490A58F3D7C8224E31E7D3C65" + }, + { + "tcId": 3318, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06638E412CACA0020F8B74C491AF793B", + "z": "AF834A8BF9552905F423D6422FBF856A72D7638C40BA68670F4CFE99", + "l": 1024, + "algorithmId": "5E2C4971CE21353FF45744508659166E" + }, + "fixedInfoPartyU": { + "partyId": "60056FBED3F61DFC72341AD2B1B32B98", + "ephemeralData": "DF25334C5050A026B061A80AE41D8453A970016E6A6AEA7CE07DA519" + }, + "fixedInfoPartyV": { + "partyId": "19634648401CCE06A4715CF524963650" + }, + "dkm": "0A052A33A32BFBCFA97D0D136784D1DD7001CB98BE8A0E50486A19FF3765DEE3784C43984F400D5AECA69E739CEDA183ED916DA97E3663C1E2894B89E9389062607D01244C71250B3010560D6FCA6161C79DD68D3D21C00B53F2256EC656EEFE672BF79524DA8A16BD223C2FA02B313E55E388275E0A1CF37B7B38F720FC7C54" + }, + { + "tcId": 3319, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C43D139538CE92AE8D1B48D23992F4BB", + "z": "297E571311E9FE48583A1773CBD6BBD86857E39238898D3A8B475B18", + "l": 1024, + "algorithmId": "03A12F31BBB8CD7EABCCE3BB2DE42F5A" + }, + "fixedInfoPartyU": { + "partyId": "EFA6596A2DC916E8D6A2F38F6B159415" + }, + "fixedInfoPartyV": { + "partyId": "0EE37735711A7CE5D97DC402BBF3B5B3" + }, + "dkm": "84247E36B9D418E61A79C826AB41C6224ADA6D2AF8E0C9F1DA54C2601BDD7F4C85B73C54B888482E4D4F55E27F16114CD79FF649F9718827889CCA43BF237FB0013098BB927BD1F90FDF419CAAB0E282A65F0B7300A1EE189778B28300559C43A5EC094AECDC3DC73B26F48C03D10649E26D3C84FDDC0B53132ACF7179A2B886" + }, + { + "tcId": 3320, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9050634E8ADF9AADA777F3689FD3093C", + "z": "7355430D4245377193DB84083C8D10E24F2173C19FFD0E660B9701D9", + "l": 1024, + "algorithmId": "8D8D227E8B1EB6AB2557F54AB34DEE30" + }, + "fixedInfoPartyU": { + "partyId": "133D0C0D1FCCF0BD9E988E6548D7CC16", + "ephemeralData": "258A34F4A9B03CC77D96B04D161A2628A7FD4433185B0FEC086A68D5" + }, + "fixedInfoPartyV": { + "partyId": "49312F7BBC29A79B3DA15824B73E0F2A", + "ephemeralData": "87A57ADD85CF83450624ED3684B813C0B8981C96A75BC009B2C995F6" + }, + "dkm": "71D5CB660DAB7CA6D49ABF76B792E2C1298BB62F769BC8726ABC91BC026A4B2206D3B9F386569F624376F642EB85C37FB4725A12EA146979879CF41616E89CE563B7A1F5BE7BAC5A6D61094A7EA9462C73E18821900CB62A0A94FE8F8047A262FDF0732F29F27688A03B3F49AD51085E47F04F324B9E7E5B4A3C42ACB67A6A59" + }, + { + "tcId": 3321, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D6F60BB5C62FB901AF042D9ADF4C593", + "z": "F48597AEE43C89CE10ECF5DAC282375B95285D4A0F838BBCEB68D007", + "l": 1024, + "algorithmId": "C88DC210D7A15076BF8784EF16B19F26" + }, + "fixedInfoPartyU": { + "partyId": "7B63E442080CA15940CF04E015042A21", + "ephemeralData": "E93868416857B412591FEE8F05253D83937ECE5E74C5819F7959BE5B" + }, + "fixedInfoPartyV": { + "partyId": "3582A13EA9827A2CD853CAC125EACEE3" + }, + "dkm": "087D383770D95C158B047C56A610A318EA7CE7B6B45F804B436E3F786CA295B724FF62BFF66BAA4B5BDEEA466845D14ADB76C4304D666DA0DB7467EA7B891E23D5ADB4194783AEC589D13ADB15CFCD450A54C295C34F514D3282F22D42C5BE458CB3BD8673A93DFEA50B8E034AA55589914D00C85DD5F4D75446450584DCDD14" + }, + { + "tcId": 3322, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C46CEAEBFB90B18296AD9B2267033DB8", + "z": "6AEE41CDBBE84762E41B9F8DDAD0EAC71E102151B4B726B8BF517584", + "l": 1024, + "algorithmId": "0A948BDAEC05D0DB62F43B1C70D87A57" + }, + "fixedInfoPartyU": { + "partyId": "01154F859152D53A65684164F177F9AA" + }, + "fixedInfoPartyV": { + "partyId": "3876F2958C3D6188CF4B6DB5E197CE8E", + "ephemeralData": "2BE0DC222B8BF48956723E31E731135E894DB8A06A8186BA1FA95809" + }, + "dkm": "5AD7443FBDEE7E6904AB82AEE25D4C920669101F656804DE3A336042E302D58BAB40C52CF1F9F4A968E66DF5809C81CC14C3AAE9BDB559AA49DFC2D37831AF969D361932F9B9ACA68A34D7D3D7283FF5CB38D07190AAB98929F8F15F6E304C58B4D97F04BA9BA861BC627DFE879C37165C9CB5A8838497AEA3095A1A2AB07048" + }, + { + "tcId": 3323, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53836D9AF0B5B882B1D9B33B2931866A", + "z": "1E35C4C798477901A38DC57A12DB1C21717370190578B02C497CC06E", + "l": 1024, + "algorithmId": "EA8C3BCC8389ABFD494B90D7B876A14C" + }, + "fixedInfoPartyU": { + "partyId": "CB102C0DBABE42BE0B1436278FAF5BDA" + }, + "fixedInfoPartyV": { + "partyId": "7A6781E479F551DFE0D476A2DC658F68", + "ephemeralData": "1FE447AEDBE43842D0355F577B68D596D3063754CF07EB49E3C0BE2A" + }, + "dkm": "00CC81E201DBAB4754134F2211298B25241565387C06846E87F02873756F799A55E09123644CEB4A21D41D6FF6855C88031CEB1D5B3B7254439965EF76B89671F448A1FCD7D956535F8F907DC5B539F370C620B1F3EC3D2F476F044198E7014CE53CF7AA101EC8609976ABF5F7645A7FB9C61E2F9F30B200B7A584C25C69AB44" + }, + { + "tcId": 3324, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F309665C9377CCF05475786B1D66348", + "z": "507F8BF8DAEE60263C8DF79D1ACDACBD420474D74DA4241FE218D47A", + "l": 1024, + "algorithmId": "8BE4B32107008BFF19077BCD4E903F31" + }, + "fixedInfoPartyU": { + "partyId": "11DA89BF236B029A4C8C705B69B33D44", + "ephemeralData": "8B9B8080204DE79BC1990853A594EA3EE61A69F4096E2C1CAF224704" + }, + "fixedInfoPartyV": { + "partyId": "076760451128A15C43F387DC859C7C69", + "ephemeralData": "E0B14850F6B70995CC779FE2909C2E02FA1CB75041806C7ED7185C66" + }, + "dkm": "09C1F8E743693C01775711D77AAB8BD69F0AF0A8150D293316D4C1BCC055887A258AE4BB98D02FFADC9E9F3D4AC4344158A4C144A1E2253E528BDF9B6225D5D08AFDE4207A9FE61DA138513F892AA2A562158986592564F258DD607C3D8AE85127806A4FA59F7B61B0FF31F13855126EDB1D2CD6CB6E900E9C5597485F07F632" + }, + { + "tcId": 3325, + "kdfParameter": { + "kdfType": "oneStep", + "t": "297D756F312344F38B2A4C2854D2A71A", + "z": "D15BE9B692394540C7C54FA1F5DB39E1CBA775052F062FAF4A8335AD", + "l": 1024, + "algorithmId": "DD8103C0FC7938145265E0154F75E1DE" + }, + "fixedInfoPartyU": { + "partyId": "B34EA3A1EA2D36808B4E4FBA9EE233BC" + }, + "fixedInfoPartyV": { + "partyId": "D4C593F0FB68E9B6B020902D68BAAA5E", + "ephemeralData": "E66604EEC2A28E68A13E58EE86F69C26DA216A7550EA91100892D172" + }, + "dkm": "67DBC687499A414547D52B8E4C0832AA73B555CF64DA0A4F6AAF42A89863536BE32427BDD8BFECD23978672C02D3D3D23D93C68831BB1567F88F9DEF5EA9ADDD565E4040D9434E236EB4B8F5805C65316608132299219C8AF0BD645531A3197E1C88E6ABA9AF63D916C3F188B8E7DE1AAD83CF119B4E88F3F74C8484C233AC11" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 156, + "testType": "VAL", + "tests": [ + { + "tcId": 3326, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7431B337142863C5E4883D22151D3CD9", + "z": "3FCC02B960E9D89FFDABB7462103592F6F1181294D2319C43AB3656475F6665C", + "l": 1024, + "algorithmId": "E7DF2003FEE45AF20417E1C4AFBC273B" + }, + "fixedInfoPartyU": { + "partyId": "44BA3B190950E38874836A299DA26F28" + }, + "fixedInfoPartyV": { + "partyId": "4DC280527C8BD6F8BAA52E10AFDEE5B9" + }, + "dkm": "3C111594798CFCC0AF17CD99EE624AEB25CD3A4FB3368D6BBC3CBD1DE3E018946EBAD83E42FD6E14B79B2B2F0035A4678F6169DD954F74831AF0042F1DFF5900D6E1DFA0AA782FE68C5F9A99C0BB5AC2353E0925FA44F0F286021675AB6E6C351B67001D675B5F8ED98F9EB1EE97796BDCB7AD096BAF837DB54F1FFE5FF70D0D" + }, + { + "tcId": 3327, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73E7A2AA0D532B9A81ADD9DEB051717C", + "z": "85BD828010C741BA0CB1778C57AEF6749B78947A78832577F1116E087B980667", + "l": 1024, + "algorithmId": "F577D4DB559C30286890D43B61C267E5" + }, + "fixedInfoPartyU": { + "partyId": "05073455B9385F5F0EECFB3CD5ED2849", + "ephemeralData": "3A85B6F83F2DF7A009785FA2A6512FFD67F47100A6C7C08B54F0E68FF3B499B8" + }, + "fixedInfoPartyV": { + "partyId": "EE5F67253BB081FD42B99209E9C85CC1", + "ephemeralData": "9838E33CAE21A80F756B5E0BA8A4E58D3AD55BB0B99853AB2158105FB5055851" + }, + "dkm": "275246566C8509940EE26CAEE231FFB1D3D749DDA9877DAF20FCE3A773404C1D07476F62CA4F26A72F7E90EF6680A69DAF23A65355F3AADA90E44798E512BD4C43186F1962D11697DFD973C2D0988EDE081DFD76679CAAACF0CF60C79589BF9C2CB6A7D88A0C87CC3A948C20AA610D8FC45AEF3D191811AF234BFF1F72579009" + }, + { + "tcId": 3328, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F6F5D10140B26C98156134FBC42C9E9", + "z": "ECB4042704E2969E9513B87A45D58885D9D3A3EFE223B15E3E74BFB81E1775AA", + "l": 1024, + "algorithmId": "CC3CCCB373047749C518322BAB18F5A8" + }, + "fixedInfoPartyU": { + "partyId": "259273EF9D5E035529141EB43DC9F407", + "ephemeralData": "042AA5765A76EFAB74662595DAFADA37FD59176FDD217F8262F1952A87878F31" + }, + "fixedInfoPartyV": { + "partyId": "ECE64CF29E32DBD75FDD642D75F5B1BC" + }, + "dkm": "F6CF96D4E985B548BD81377C7F5D2BF65552828C23E3DD4F2EADD585FC4A2AB735D0728C3BFADA861D582DFBB704229AE4E826020A279A77CFB895817B868937578C7B32F83BBE7E251ADDDC972B4144B43F17DCDBA946AE50AB04577306E54CFF0AD213B6D8F5C222EC2E1AECF76EA9D97A82735A487502803A4FFC5E8378BC" + }, + { + "tcId": 3329, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DAA54F06B1F982D54D3A8F22BF153254", + "z": "D1FDBAB9BE7779F840F79882B53BF2C6403B9CD851B3AE404432F79ADA17CA7E", + "l": 1024, + "algorithmId": "39070BD09E59BA20046CB3414DC632CF" + }, + "fixedInfoPartyU": { + "partyId": "3875E9DC747FD1005C9E2CF405207E15", + "ephemeralData": "040F648219B0B5DF53994B357C593CE2B1858A737F21E1D6D3E558F01314EBB9" + }, + "fixedInfoPartyV": { + "partyId": "478DDC7D4B1D313A2525BDE9CE00773F", + "ephemeralData": "2802D64E2E0441331624C7B78AFB401DD27251CBA83B34C0526D11BB1CADF9C3" + }, + "dkm": "D48A34C9AD4ED05DBBBC3B359ECA88A3A2120B385C3E7E68B912EC90E679D9C140F41E362D27698BA1053373D9975828CD8FB5C69FE55D2B97828452DA4F55FACD26FB01BBB0BE0B70FE687E37CD7E3244D273C9CF116033434B5B72FBEF1329B7D913D2E43814F4526C7E6772795880E26C598ABEF9BB1BC21690C594BD9DED" + }, + { + "tcId": 3330, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D0116011D3CF103685D860B806FC416", + "z": "96CB32BF5279F24AE3F15A491FA8F89489CDA4DBE1BAF02F7C63B531F44857ED", + "l": 1024, + "algorithmId": "0C3D36898A208AACCC50FB447D5BA769" + }, + "fixedInfoPartyU": { + "partyId": "5E8D7BCC1A51F36160DB49EE319DA289" + }, + "fixedInfoPartyV": { + "partyId": "24FCBD103B3EAA64669234E16D0889B2", + "ephemeralData": "553550259C9E89CB0A6EA728C3A90C2E1B65CE17D60856BE481D4B9A9B073958" + }, + "dkm": "0D647B6D93AB253D0FE947964396033C28A8FC4143D0562B7BB98AF5F73442C0D19693F6F8284356D0B721C081707909AC7F247F280DBCBC54FE915A29B520323F614AC302C0085E47A6448A1A860E3C063B2CCE15BC56B0A51130B2EE51BA59B48EF6396B12C03611AE34115F01441B0E9A90DE710D63A7487B6C628E1EAC44" + }, + { + "tcId": 3331, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE20E1F2D12AB4901AB81EF8D241E665", + "z": "D1B1671C0FA3A59AEBF4541259F46796F57D715BBA1C3FB696FFA9BCDB741987", + "l": 1024, + "algorithmId": "75BD5165DFBA8A321A1AFAB65958B335" + }, + "fixedInfoPartyU": { + "partyId": "DE94E1732B864F6E4BF8B4195B8FCB69", + "ephemeralData": "A818A3B6B6F2CAAB21C208D722B96D5AA4022175513F0E202712ADE7EAD85908" + }, + "fixedInfoPartyV": { + "partyId": "2DF9F9B9A6F8347D1E82654FEFC880EA" + }, + "dkm": "7781A5AF675B762CE1C9A0DD2EA07F445047EA2FDC212408EB54005CACE1ECCB0A51A6008C9CB4401AF00BD8BDC429CBC23306E5558D48C7243E47BFE0DC88CC02A9E17418F4E573622C259E3D5DAA7DDCAEC62981B05A483BCE2DAE76BDE4A80A11D4FF6A475A08F77E46479375D7CB348603A19940218765B7005528314032" + }, + { + "tcId": 3332, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5B8AD2CFC7D77A6F4501E100D0EBFCB", + "z": "DB233767FD169C23F6E8C2E152B726D844DEAC5D5338B9B418FD443E4CFF5EAD", + "l": 1024, + "algorithmId": "925C120A197691895034E475BC907415" + }, + "fixedInfoPartyU": { + "partyId": "F996FDE65758F6C287540F12AC6B80D8", + "ephemeralData": "0626109069EB9030D2C9313241DC7A5C957CB0FF2DA1280976EA1365F6052438" + }, + "fixedInfoPartyV": { + "partyId": "46C259B2E60935816D73E51E132E641D" + }, + "dkm": "C305C27B355E606A275B43C6381B59F8730855481B18D82E1B26E389FB5497DD1D04D5205681CF617C1AADA6577246BAC26928FF814D8D8C132A7DDA7DB4C3F83844C2F2CF7BAF0EE9CE41BEB6DE426B477ADFCD6F4100CAF54430E8017798480C75757D9811C1EDEF652F7773914C6B9854FFBC552A656E423069BA2A7DB35F" + }, + { + "tcId": 3333, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6565F31020F7E38291C1EF24B9D5477A", + "z": "03CB604205CCEDEB86E3DBE2C9ABF66955960738D1E46B50963E8848E8D15EB0", + "l": 1024, + "algorithmId": "16ABF61515E04BF7DB803AE94E7FAC75" + }, + "fixedInfoPartyU": { + "partyId": "7A59EF0AB9693E08F2CEC225B6647BE5", + "ephemeralData": "94FC7B2A72A3C0B927A62FDFA2BDECE0A0F05439BB5AFD4A7AD4829B481AB7A2" + }, + "fixedInfoPartyV": { + "partyId": "E9CF3674C5DA3B8FF849BBB0A99FB851" + }, + "dkm": "17E7800E4ED4843E508AF3EBC32ADE49A0DCDB172C9DA5497AA5A79F3B3628D440E23E792F9B372CE2BA600A8731BAE8501D886ED06C7EB523575C6BD310BB3C6F1818D28428900562BD2C52C5C40326565585FBA94C425B365511BD9C788F45736A98031ADF109C8CB8AAE1C36B973DC8F45729388E0D03C141B2398FF8A97F" + }, + { + "tcId": 3334, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E25E909BB709B59EE23118C540E0DAC", + "z": "12EE7D7F08CA551EC11D16F9F227BDD25CF188069D2F0BA2590E84FB51E3F7B3", + "l": 1024, + "algorithmId": "E02FA648A0D33EFBF839EFA4244341D3" + }, + "fixedInfoPartyU": { + "partyId": "D1E785E280B2B5FF28E4DEC251ED7518", + "ephemeralData": "6D98DE9C6344F3FED9F49AA09A90841D1C24D905B9A63322D99D6432C24BE813" + }, + "fixedInfoPartyV": { + "partyId": "DBF96F3DAAA0775010E550A3946B5FF8", + "ephemeralData": "FA8F9C4AF9284A809ECC798F6EA6C0399B433D39203FC371F37909375600C563" + }, + "dkm": "78590F888086FBC1C44E4E709CA89F70154C9F9B24CBF0A4FB397438C8880A007FD9EB13DCFF35BC29053DA23F17A132333686DA55FF18F6C269D471D10FA1036A771F793839A638B9C0EEFBDBDABD02D2BEEE4FEF963E6FAA2605AE6C2552E52919C0FBAB4B0469290228A2BE48139A28355DE24DCFBE6DB6250F4D8E38AEE1" + }, + { + "tcId": 3335, + "kdfParameter": { + "kdfType": "oneStep", + "t": "359DA9CCC85A9D8DAFB5924CEFA8C2EF", + "z": "8CADC14C0231E68A012B5E1D3BDB5F4C01A606457E2C34A2900761ACD2BCFABE", + "l": 1024, + "algorithmId": "26AC24E2E8B47CD15EAA8B2C695A7FAD" + }, + "fixedInfoPartyU": { + "partyId": "CE01C932BCCCFF25A685E079419D7EDE" + }, + "fixedInfoPartyV": { + "partyId": "FD42780C6DF5018F7561DAD21BF4BCF4", + "ephemeralData": "8A86193990DEEACB3BA30C0C9E253C310DA900E86F1C5BA5E7512BECFD222E0D" + }, + "dkm": "E4056A76E4A3EE2804E385BBB7886B5717717BDA3D7A38BACF5A6D12308307DED112AF558AB8CCBE2887B92190AD6321485C19FCAFF0C252BEEFB7B7809A3D3DD7049FF8EEB900C13F990EB39856CD9A9805E246664056D64852D9939ABFE20672F73B1FF4954DA07447612626A14135E40DDD236A6404D63B4971F9F874A7AC" + }, + { + "tcId": 3336, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ECF0F5C0FBA294035B2271374F611109", + "z": "516E62FA3AF4C14F8B7FB8E022EFA51BB2027D943D0E380E51C042B1609F38D1", + "l": 1024, + "algorithmId": "F225AAFCA20BEB472E5E9DCEF81D72FC" + }, + "fixedInfoPartyU": { + "partyId": "86C6E563FF401050C640C50BC4D01FFA", + "ephemeralData": "FB6A277F77D0D1286555A73EAC7542BCCAAB57864DEF1014B8190CCE061BE0EF" + }, + "fixedInfoPartyV": { + "partyId": "B9CA7950B4F60BB7132C4B52820AA96E" + }, + "dkm": "03273921A17203EE2BF553D6E4F126C7F621B0A2A965003F9A00D06FAED78370B302058CFD0C70497F9E4D6E796A85119D597DDDE9A81EE03198F3D7024E9F461CA04E18BCD31833BDB4996CDB6EBA6A68FC61B03AEC23929C8E36EBCA0E930BB06F74B7A7848F82F7426C80EDBAB49181DA9BB1830E77CD684F814E658A8E43" + }, + { + "tcId": 3337, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A8AFE051EF6382CF79EF9D61FF19EE4", + "z": "988834C5D8E9134195BCD04EA1D3CEA75B87F5BD078B6C1AE09AC72F7DB2004F", + "l": 1024, + "algorithmId": "45587B7DDF744A968E53BB11150AE08F" + }, + "fixedInfoPartyU": { + "partyId": "373A966E6A0511031D16DAC87C904AC0" + }, + "fixedInfoPartyV": { + "partyId": "E3E51BC1DE1C3C1C447EDBE82B37779B" + }, + "dkm": "21780233EB2198E4C19624CDC15B34398FABC68005257F587B2907C1564BAAA29533205C3A0AFCCF63AE3B39BB21009F148936E13E38A72B37B038DD5E6CF804841E04A2716CEF7BF3196F087F9DC0C8991408F00AF466B57555DF7E14F8E6A7666F9F10220A50D4B7FF5BBDF8E6B1C8897ED29E8865EC4A8036004B4089D5AE" + }, + { + "tcId": 3338, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BBA19B964BEC3E1F1DD61B6E319EBC30", + "z": "3B32225865775677CFC4FD0B0996F94E237B5A4134233E116E058637834C6D0E", + "l": 1024, + "algorithmId": "96E6F17B7918DBD6C96E44A496734DEA" + }, + "fixedInfoPartyU": { + "partyId": "C5DBA1F82F1F30B6A95E63A40E6A5C3A" + }, + "fixedInfoPartyV": { + "partyId": "0BEE16A00FE00B7DA811AF98059CFDC9", + "ephemeralData": "3019169A7E57276559ADA23695258EA2B27BD5D694DDDB52EC9AEB7E6DEFE4F9" + }, + "dkm": "5A644E7DCF7693A2066DABDA3927CBE123E837A1A7F5D3EA9071EFB6E9DF9900C20F3F704194C7B20C8B77602371C6E484162361CC5F91C95CCE0933DEC96D0E7055A6EA29F72A69ED6D3FBF1BF8A5A3BCBD018A02C7CA4E29237E0929C5EFE317947D2780D52F588A809EE821FCC63095CF18750E3CF09495E2383F67DF5829" + }, + { + "tcId": 3339, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADC87E0895EBE8FE248E41E85085F9A1", + "z": "B3E224333BC11539C6A21D68EDCCEA90369901385E5BE6E995504736CAD9651D", + "l": 1024, + "algorithmId": "06552D90BC181931EABA1E24C039C708" + }, + "fixedInfoPartyU": { + "partyId": "FDEC2FE60166F0A959D08A542B9F6A51", + "ephemeralData": "2809E0A1B67743721905E26E62CD0DA804C4611485219112C20045DBB21E05B4" + }, + "fixedInfoPartyV": { + "partyId": "8E95D4AFF842689F257601C41F7EECC4" + }, + "dkm": "FFF52A6DD5CFD06F62E654B834D4A35917524649155F9D9D3CFB337951DC7B4083F0AE74FBE64AE1091177F6AD4E14A76832BC4360A8D76166ACF10C5EEF830E1D3258B1AC87D97C5FF1A7F42461FBAFA88BA3D08A0FDD717604CC75EAB8D32D7615FD7714D770BAFDA6D7CBE481DD064AC600D3B561F16B5D4AEE9CB322FDB3" + }, + { + "tcId": 3340, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AD9E6A0C9F05C3A896A640A5E328C0F8", + "z": "99F232DCD8768B96BCFDAA6D13B67110475557DEC1C01FAB0A2909E7A2A414E9", + "l": 1024, + "algorithmId": "87312049CD973F04FFD2E19B1E223DFD" + }, + "fixedInfoPartyU": { + "partyId": "51B7E58085371D97EEA08E7C35E4EAA1", + "ephemeralData": "D4B13C77724F7BC7D182CB2073F41F262D782E50935B0BE7173E408AB49B8FBD" + }, + "fixedInfoPartyV": { + "partyId": "EF465B4482941EA5A917E457A31E6A24", + "ephemeralData": "346C8CFF3601CD4A0842D5D40FE66F875AAB9FCBF10FEDCA0DF14DDEC3C55957" + }, + "dkm": "6A618DB64E8ED791A07DA052D812D4D21116A4BEEA7B685A7052CAFB821AFFE6480B51A6EC6755B9359B049AA4930BD02CCFA5555DAABD95E1F14E700BE7220C90AC3C1978885F7371D5BB6C12EAB5EC87A66FB6F335EEBB3F0D4C1E3DFF3E898939D07765705BE512595B66904CD5A296DA5E65FF24846F91423E80919FEA79" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 157, + "testType": "VAL", + "tests": [ + { + "tcId": 3341, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3D0DBB4B1078BC1681EADF60ECBD28E9", + "z": "71D1359830CC9DC97FD380CFD64D82F392004A483EE2C828756DC77F1791DA80", + "l": 1024, + "algorithmId": "7FDAB808F78D962C1D4611ECE31FB35F" + }, + "fixedInfoPartyU": { + "partyId": "CC39ABFD98C347BB21FFC2262D765088", + "ephemeralData": "641D823BBC881B2B83306BD3D3F8B571F6F2DC3DFBE14E1106006D366DC81DE5" + }, + "fixedInfoPartyV": { + "partyId": "6A7E261E73152676E251030918B37400" + }, + "dkm": "C3017FBF53391E2BF34202F67978D56796757A7EDDCDF9C1AD95672CCE497DCC09B177A45B2E67345C015DCFA0E9959DA802374F47486B558BB743F8B7BF9A9200110E86209CD5C3E7602AC7676463DCB26F639028D1FD73575A72448BAFEFB58B94692FFB52DD93703E8DA45DA86CDE35D5421637F4DFFDC4CB10FA7069FAC1" + }, + { + "tcId": 3342, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7766BD997312A45D6C54EA00C61DA61B", + "z": "0641E45E6F8D9CA8FC1BB2396E8B94A3425719AA3060FACEF83703C1D1E5BD2C", + "l": 1024, + "algorithmId": "A3A77F1677FDDBC3DB577113EB09FCE6" + }, + "fixedInfoPartyU": { + "partyId": "43C2238906F8256F18E1D699594A8574" + }, + "fixedInfoPartyV": { + "partyId": "B8E999C7762429E9A17A3DF83205CFD0" + }, + "dkm": "626ECDA1924B50A6D1914BEAE70CA9C2D5B4221C196FDD0A58AE65EFBA8FD627AC08D3180F057D88AED118BDC0291BACF6681741D735CEE2F319D79E7F8927DA1216F4258BDC08A0A527C012B79A2C3389EF9CB00E500DF715E31889A8F5AFCA7454E54F2DD6FAA442E6AB8FBD308E2166B7E4FF3C0A9DC42AFE5E9414F248D0" + }, + { + "tcId": 3343, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBA2761C9C0D21869222649C2F5970EC", + "z": "69778CA873960D70D4D60643F5CDC3102A5A17544E6B6BD944028E6BEA5CC304", + "l": 1024, + "algorithmId": "6924CA7AD5C0A8E09429B6951D9F9339" + }, + "fixedInfoPartyU": { + "partyId": "6F3DD4F93156146E5EFE396DB6D0D405", + "ephemeralData": "CF9CDBA5B02E866FC5D7BDA346804801F34D9C8EF85D7A88ECFEA8ADA8598CE2" + }, + "fixedInfoPartyV": { + "partyId": "78DF66A0BEE5CAD22C58C11D00C5AC26", + "ephemeralData": "A6092518D7D87453EF40D54DD6E2D18EDEAC464E79263994B5252428BD8BF83D" + }, + "dkm": "FCFE7C0466A968236B6C9C481EB4A4B630B5454E532B2ED60B2D9C7ACAB112762547C9D83C898637F60234AB82B63D84CEAE2DC68B808A94199ED06E3E2568002036A7B832C18D9F2DCDFEF26E87BA0B551C32649A7AC373DD424AA0E44E981A9F8847CE36590CF04BA5FCE311DBC6623221171ACEAD0B824C70D5F146DEB475" + }, + { + "tcId": 3344, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0B61F7AD01EC4DC1AA003EBCF626F91", + "z": "4E857A57214D60CC52872F9085C1E0D90D92635063EB0D1F05145EAF6621BB8A", + "l": 1024, + "algorithmId": "D2AB125690A7B56E004B76E62A7B6C56" + }, + "fixedInfoPartyU": { + "partyId": "79C93C18DEAF5D5A332244F09B06F7FE" + }, + "fixedInfoPartyV": { + "partyId": "87A5AEF3114F9ACE345A20305E99F711", + "ephemeralData": "0AAE6621D3AA2166ABD7CDEFEC8346EFD396903AA87F332A8EBD951CF75D5964" + }, + "dkm": "EC91938B071C9848B15A6B0E5C16193A08637E69DE22882B7443E01F80DF42E36CB7EA980855223E0AD58ED171A4D64C3FACD0450EFCC17DF97F3910CC16EB79CED49080CFAADB7A0AA0CC288C166A22F808105D77FEC5740662897EE571C435F6F9D581FC49EC34E238C6EA92E7A6E7C16392B326F997E8C7AF8A821208EA9B" + }, + { + "tcId": 3345, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BB31B4F652DBA1B2C37B232FA6844E2", + "z": "4C8D97F55977ABBEC2E0D6C2A6DA953B6C331064A0B739D2E8B23D57753A7B59", + "l": 1024, + "algorithmId": "A47BE2D3188E0767DCFC221393D8F675" + }, + "fixedInfoPartyU": { + "partyId": "0AC897FBF8288091A54C05A858BF5253", + "ephemeralData": "E227C7E8AE4115354835C4DA51114C6AAC3AF359C5ACB6779B82790C40BA29C0" + }, + "fixedInfoPartyV": { + "partyId": "8C37E0A04F30BC3CD9470BD26D34D16D", + "ephemeralData": "DE55A8E6931E1437045EDACDBE8857C98FB0B2D437F60B71F3FCACB9B74B914B" + }, + "dkm": "291B8AE8EE765B915B138F7A63179261C72F155B718B579B4DA64BA4DBDA69A4609378DE58B9E50F087962F243B6834CC5E0270F6C1B14EBCDD045B5F52C48A82C5C3DF6A7C553E4F403C3C9777FD758A484C0B749490CF26500EDCA4A2A1DC006F3E75545A48EDE2ECCE51FE52E6FBAFEFDCDE4B3B66720057B171FF5E59F92" + }, + { + "tcId": 3346, + "kdfParameter": { + "kdfType": "oneStep", + "t": "167691CE8884AB13982263FFF0617761", + "z": "01A1E60892178F42AF78D1A55BD7587CD4FDEC9652B49289E5C9AEFE40A51CB7", + "l": 1024, + "algorithmId": "2F045B1A5C4AEC93706F8D3D2B286412" + }, + "fixedInfoPartyU": { + "partyId": "2701CFAE6D667CADB230C3B6FEA53375" + }, + "fixedInfoPartyV": { + "partyId": "F0A3DC37976EFEF5A4E5711BB9760BB0", + "ephemeralData": "C39F761BC1C5C059BFC25A472BDA58E3F08D72010A6A29AD2527B81EFF4663DC" + }, + "dkm": "FF60B1F0557CB85F5DCD257A79ECF7E9BD40D76B5DC4C87D8A701F5230F164F13227EEB31E2ABEDCC4702843B7C31A09816D0D68DAC104C383802EFB8D1A8C41045AB46EE166749E7552B402A378BC78E8A0E742FADB0F420A1954085F5421106489547532C29D9897FDCB24D677A06C1495F6D7987012F4467C92284FC7F2FA" + }, + { + "tcId": 3347, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9654517AF7A10FAF726EFFBB3ADB1B5F", + "z": "6F601FE7382C182B4FCF4D4B72503AFBE8FCCCC5D8BB645D253D5FCA218C16D3", + "l": 1024, + "algorithmId": "FF8AF816889DE1F9B7F1EAD858C34982" + }, + "fixedInfoPartyU": { + "partyId": "C0540EBC2B58F8B8CF72EEC71F62078C" + }, + "fixedInfoPartyV": { + "partyId": "53E89899E73AC1AEF312383E5CCAA90F" + }, + "dkm": "B36CF25BED4FE37CFDB6547DDC5FF2D07C1D28049FD08EF86839923D95A36F0BCBCD668F43E2595373B3EE8F487E89AE03201D942C395C27FD4B62AD1D618E40752E61C5992F30793E934291DBAF8869E15B507781B389F046D4859AA36033EC77062602D8EB409C81FFE8EDF8A1B8F29ADB7847F582C9BFF33CF25BD3DF0D77" + }, + { + "tcId": 3348, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8309A0D18353F34FB24AD71E9B9C9FFF", + "z": "E64DBEC49525427E6A786FE8D6E87B8466137A3769742263475D77C1D71CA27A", + "l": 1024, + "algorithmId": "4A4827B3549910861E42178974F5C942" + }, + "fixedInfoPartyU": { + "partyId": "D47BE162FC3754428788710A10D91606", + "ephemeralData": "C79C087B38939460F3135C03A021628ED4A483C8527F58B12A0A9B33B755FEEC" + }, + "fixedInfoPartyV": { + "partyId": "D17A35091859E5CF7AD32EF7C0D7B550" + }, + "dkm": "CFFADB3400DC410B2CA466F19D0DEA4385EBF4FA920A7CB5F25556E5C2818FB92170EE5B6E936ACF5E8E8E78A54A9D4F28B661ECB0DBF9CDA025B650E39759035BD9F851B4B7F11D2E441D83B10669D03C3E74AAECB8CF645886809FEF9B24C03CC730EA34031B8067830D350CA4B3EE1EA025CBD1907FFD1969A94E71EAB568" + }, + { + "tcId": 3349, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6AAB5414B1DDAE026411CE77B9911B9", + "z": "BA726B706DE0FDCB033A1B9C4634C4EE715268A613CE66013AECD9CAB01AE584", + "l": 1024, + "algorithmId": "CF4B39D9840BCECDDDC815ADDD25320C" + }, + "fixedInfoPartyU": { + "partyId": "98B89CF4685E6B2D949B94FBC6796423" + }, + "fixedInfoPartyV": { + "partyId": "E39F36102834C64E89A927A543D37907", + "ephemeralData": "BF351C6B66CDAD3CD03D7DD4C703F0DC634655FB210213D7DDD23E1A1DCE0881" + }, + "dkm": "1FC397817D9B77DAC69CD3D013B093018AFCCB1F48DD65A11D1D8F3F5E81A0A67B8DA34A19AD62FB51C48180D7ADF394F143CE24627C7B96521C8B7E65CFBE7B841AB61A06A5A48726A79AAFDED92B96DA9C8156955A2DC87B00A1B29F0399754E7BFDB432EC85DD4CF2383AD46C000B31093E00DBC71265132C57EFDC4A10F4" + }, + { + "tcId": 3350, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A6A8FBC9060EC692AFB0F9EB873ACA70", + "z": "DE578FE53B92554EC80CDC816B4D4E63698D188631904063DCAD2048BB9CCDEF", + "l": 1024, + "algorithmId": "EF0EF568385787D92096F3012405FEC1" + }, + "fixedInfoPartyU": { + "partyId": "79287F69AB235D1C4FA652589A49B0DE" + }, + "fixedInfoPartyV": { + "partyId": "E9D4F6728EF36CD4C112253CAE7BA3A4" + }, + "dkm": "07A6088B6401980E2AC1101A6E1F2D897FD67AEA3883F2E452811D273A373F809524C33268A0786C29ACD136726E2BF7782629FF1ACC5FB8918CBD33A8E15AF23A5607A83C253E8FF290A7593F29BD4BE92E98A6BE3321340F26CE4F3A70433153D4B7AA95486DA43A7CCAFAAD11F04CD3685EF730B7F2B68F89E06B5811178F" + }, + { + "tcId": 3351, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D6BBC7B1BE11DE62190F16A0F43790A3", + "z": "D36311EE3A0DBB8C5E17E929999EBF8AD61D2A4A095DED929835DBC6B178BAD5", + "l": 1024, + "algorithmId": "CF14AC1752EA3E9A14D0001870D49B75" + }, + "fixedInfoPartyU": { + "partyId": "38CF05B9B2619F5AC70862335D7D1382", + "ephemeralData": "EB87A56587893ED7B627A2C0AD36878A8A80A9FBCE0B2419A3EBAD2229F1343B" + }, + "fixedInfoPartyV": { + "partyId": "F55FF8FD3D19B991665FAA72DCB278D5", + "ephemeralData": "DEDEB9E988061BD027DF18A3F682F91F9D743E6423E4513A0D99008A997E2F28" + }, + "dkm": "7B96C17D0595D85AB893819F29496AFAA24FE8DE7C6E01A5DB599AB87CEB3A73B24223A092B9F4B499EC551B599F15A7630CE6B342420EB24EEF281A8F480859B8CF1B28091BBE5D258FB47228CCCCF4F863E682081DF4B5C47844FC2549D2EA36DDE449573DE9A81F1ED5DA4EA43B5CEC13C1611942D7008D66A635E325D3EA" + }, + { + "tcId": 3352, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FBF74F7B9BE7FEC9F2A248D4A5CBE851", + "z": "DF80614934F7DE2C931424F7635449B191F2983E7C54812C9D9A56A00B163FD6", + "l": 1024, + "algorithmId": "8A139B1643355A2EFBFC3032C0D0CFDC" + }, + "fixedInfoPartyU": { + "partyId": "30B326F452782D4DFAE90885D76D3962" + }, + "fixedInfoPartyV": { + "partyId": "00CB54665FC2DE822AB10494FA31E955", + "ephemeralData": "ADD8E69B272902ADBB35CDE44E77F327C72A069FC2ACCA165960A90C1A2B041A" + }, + "dkm": "A57D730BEE5423CC00780B079363687344A2A90970811348720D458A22EDD403AB9F99D498AF391A2407E17BD659B0A79630E9A88DF41C7D8919AEDC697D634507647035104BADEA8105EE7EFB499C6F0D79D0DF9F917AB517144BA81F07BE9A1AE034899C4AB26EE92F43AEF619D293D88E5DF98127F624DB9DD8EE7F731EBF" + }, + { + "tcId": 3353, + "kdfParameter": { + "kdfType": "oneStep", + "t": "812410FA6EC8574F103DFEDCFFDEA0A5", + "z": "097DDC89B1262C689502DFDA49E38AEE8DAB87E0D4DD0AAECC95FE01BD8F0573", + "l": 1024, + "algorithmId": "7B2D427B5837CF19784A5208753CA694" + }, + "fixedInfoPartyU": { + "partyId": "C72F6921D251110AA67A70B375E5B5AA", + "ephemeralData": "FDFF732F8EC83E3D107EDA36A22B29D48CD242E4D8D454F90394A6DB2D6F803B" + }, + "fixedInfoPartyV": { + "partyId": "CF26CDA51BB971500ECFDC0E5B4E055E" + }, + "dkm": "2A48B74E1C27F1A01415FEF73E5E81047874FE9E3C4DE87B987A2F284F1F24FFB23775E387370FFE33D6D28A43FF62D15F9CCB1DFBC3C87EB10C4E8911BEF26B9A8EA46772FC4856792CA1B63D132B7C682BC83B8CEAA45AF062213C441D59BC566C0C1DEE98D9C604DBC5576A72048E1E5B736F60E7395F4198D583AD5C0D92" + }, + { + "tcId": 3354, + "kdfParameter": { + "kdfType": "oneStep", + "t": "54F738886CEA4447117E46C053CB1FD5", + "z": "2226C1E9169AC62E30E18D1B202A6AA1C8FED173574768C10502C6740CA764CC", + "l": 1024, + "algorithmId": "48F6F5289190FC5AAF2ED35AE2D8AC77" + }, + "fixedInfoPartyU": { + "partyId": "769E27FF5892C51D0FD3E94DC4C43C04", + "ephemeralData": "28063188FB55021B97B77B390C36522441001BEB2BAEDE76823F38D60D1ECB21" + }, + "fixedInfoPartyV": { + "partyId": "AA31E3240BD74185032D1508F5C8D023", + "ephemeralData": "D03772ABA4F78732240F380B531A0785D744F944E2D4F28614A50B6967D5DA17" + }, + "dkm": "08B419375D85A8ECB266550AB8EBB69D986809A58E7E36C3AE09EF6DDD36ACCC7CA0B9BE3DBB52D0E661CAA0BB035A0763D682C10CBB20CF46E6DC8D4FF5DD8A1EE259D77089825684542D15FA58CFCA513D242B6265DAA3055A82DF3AD6B3DE5D1FAB3B8B98277D0D1BC8DDC41D19F4A58C35520A1B7F982727DEBC9997E12C" + }, + { + "tcId": 3355, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C99F908766DCCEDFD32839515C6591E2", + "z": "037086E7B6772F29F092DDD36243EE2C04C39C36C5413DB623544CEA9FA33938", + "l": 1024, + "algorithmId": "17996A7F15A88C94F8ECC3845602512A" + }, + "fixedInfoPartyU": { + "partyId": "429C62F814A5413D952CF9C746DDDFEC" + }, + "fixedInfoPartyV": { + "partyId": "CC303C9DD5BB76B2A75AF63D4D9839D8" + }, + "dkm": "047A624F01E14D0254B1572FE612AF8FBFC69BA05BB4FD3276B715521E305EE798030174D00A9E5632474CD787FF561D54CAB44BED6F957768F9A0184AE8290C9A30CE76F390C96975767456654EFDC450E034CEEA0AEA65B6E086555AF900F3674352E502305C8D9759A58B3B4FAF750DB67C2781C8EB3799E6C29C63BB06A7" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 158, + "testType": "VAL", + "tests": [ + { + "tcId": 3356, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B31B1CC235BAC88739F40B3E97D4D075", + "z": "42D957D616876E050211258D4CE36FEA4CBA1E0FE8E6BFF20EF6E0B2BD9A3F2985", + "l": 1024, + "algorithmId": "C1587806D0665EF6190CD050F53EF71D" + }, + "fixedInfoPartyU": { + "partyId": "AA77510E4C4B88DDF0C204BE38DD4AB2", + "ephemeralData": "DCF6B3F4C5D9046EF2ACE58E8140C535A4E69B37E05844B7972E03F86738ADD8E8" + }, + "fixedInfoPartyV": { + "partyId": "B051FD977E4C260AD9524B0A2C7EED16", + "ephemeralData": "29B3705A2E9967766772E999B91C49C97B4D04A3682AF3F84500F25A7E69B21B6A" + }, + "dkm": "5D9534EE4DC61DAAC231193320F109518A4B7C87AA153FEA341F2468617DF68CC593E157AAFB2594F7F6C1516DC1A63FAF93447A21B14EA6BC49797DC7E7C5F260D18050719AA7AF31F793AF535A6ADEBC6F88090BB9269FECC4C9048E8BC412EF8A6CD1401283E5A09F48DA09C6D5D3986845E4AF942E9F07959FA627A201F0" + }, + { + "tcId": 3357, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8C86A549B967869928DE858344EDE7F", + "z": "6C2DBAC590D84B3F6281C9E2F11223718C6D1A65BA68A13E1CA40CC0C763A5C02D", + "l": 1024, + "algorithmId": "4533E4B1A5F234970E602750B4D1EF69" + }, + "fixedInfoPartyU": { + "partyId": "5E03D724461917A9D2BE7DCF3EF0783A", + "ephemeralData": "7947673D3BAFCA474064F4BC2E29ED80FC748457143474880123F74AC6B546E20F" + }, + "fixedInfoPartyV": { + "partyId": "95C0959D49F4CE1BF92D73B6E6D7B566", + "ephemeralData": "1A09B2A21AFFEE132FBF0D458DACA1ADBA2D20C4E847807E74E1EE52FA35165627" + }, + "dkm": "AF4AAEB98E250B4F80F993849E378BC25248E053239263D6DD6AD3D3EFACAFAE50A99233D902DAEA545A3A87AA6BB063E5F0242E52385B9947DED36AA29296A18D5B6D6FA7B9C5FE5621FF5D57509447B8733E8F146DA3941FF505836DD8441A7594278A3693D0B5E7614B1EEDD52BEFA176A674D65B2680E252FFDDE2643045" + }, + { + "tcId": 3358, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B4DA6D4F904D2B26957F3347F7248D13", + "z": "E84CE7EEFBB35DB22E3AEB7449E5843E314549775B1D4FA31BB24923110CD7138D", + "l": 1024, + "algorithmId": "6E4EB76FB640C3BA367E49DF8448AD6E" + }, + "fixedInfoPartyU": { + "partyId": "E2AE3962E3A3DC7244EF5D42E05B298C" + }, + "fixedInfoPartyV": { + "partyId": "03BC2CB696C65EDE9C27186AF4E8105E", + "ephemeralData": "E0E6AFBBAD29FE6344331021F364D68FF3D0AF79CC574898D7A195E1EF65ED4ECF" + }, + "dkm": "0B19A8D8601693483D78086A7A6D23E20D5B5BAF6B0DA811B3EA11FD7E3AD9740A22A59190ABAFA09D0FB1A7BD2727F63555C1455AD46EF36F9F1DDEED73E703237CEC2A64499216733046FCBA767686A449265581A3B8E5207D5DDFD8F7A586CF97B7CFE082BC101058BB55834C1CB9E7DB0F8E86454C81F9EA3A120937FD76" + }, + { + "tcId": 3359, + "kdfParameter": { + "kdfType": "oneStep", + "t": "077FEB465418093D2E0601F5DA55820C", + "z": "CE376575528C9D898E9935C966F048924E7D4243396F938EB46515B704B65ADAD8", + "l": 1024, + "algorithmId": "A140F92972504D22ACC96B96DAB8959A" + }, + "fixedInfoPartyU": { + "partyId": "C6F9F4966D6726F06D549C8A9E4F9A49" + }, + "fixedInfoPartyV": { + "partyId": "5C283F12881A7A27C1A40EA08EA2B305", + "ephemeralData": "113EE7DDE43A2262DDAA8BA84094B26FB8C5A394F72BCDA37583F3F6C4DFF3A9EF" + }, + "dkm": "262555317EC286925EC58D2EC5C5605A0979A65A86D9FC56D899262A4A191C73A7158087CDB05B19D035FEB2C1B8198043FCB7181A1313CB0E1F393E92FBB12468337BB7F8006D1D03C519C3A345F680E5BE3785A521FE068640C65ED1416FDDC61BEF76F49D360CFE1F099ED3E179D31B82807B8A8B68FF80C653990D40D2E1" + }, + { + "tcId": 3360, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA104A6713DDE79F2984E7C086942167", + "z": "A5E9BAAE06675733A54C4C56595054F08913116BCFE5ABBBD8E60B56D2DFC8E8FE", + "l": 1024, + "algorithmId": "A411810797F0B53422C1E44EF75C2A34" + }, + "fixedInfoPartyU": { + "partyId": "D634599F3B04ADAD1510D131B81F99F6" + }, + "fixedInfoPartyV": { + "partyId": "C1002ADFA4FE9F397B9CA7A1C0F67689" + }, + "dkm": "021325A720D15F264C750C3DA46BB1F859B248BB229C2678F99AD04FD00D59A697CCD5B35A4633C1736236FA83BAB6C955F5AA69BFC0102C46B7DE16CAB0A70A6475C56C1DC34DD923DFB8FC96DFE61B96B7DAAA724ABE2C43E1271A4E941AC8937E62CF7B3B0E59EE11216EECB61551373D359D589A955A6A66CCE0744E313A" + }, + { + "tcId": 3361, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E18A827243CC2C9E7A01FD6438DED54E", + "z": "0A363BEB412273BC80B5A72A9A346EAE75C2AF2C4154DF03023EDFC28988E6081F", + "l": 1024, + "algorithmId": "A0910FA94FE195B8AD2F0E4F123682B3" + }, + "fixedInfoPartyU": { + "partyId": "7D7138AD1D61359FF68C160929A12F00" + }, + "fixedInfoPartyV": { + "partyId": "A9C816FDBC4ECC073061F5475613C3CE", + "ephemeralData": "74981FA2393E4A01F9403AB8B423771D36A40284D39846F4FA3DE2976C980DFC41" + }, + "dkm": "49D7347856AFD5C722560D13AE36C25FE021259AF2BBD26C656650785866E8A8FCE25729826D1F4B97B6F2B18B3D48FC9C4F51FA555120DFCA81DCAF182AF1ACCCCB2A112E49BD0270C615B95588F2D9C4AD2D2ECA600C1C9B7F91727D42344C8B13980153D7703FF319596A2D188E029E1F501F129F1729B8EB2C35F8812386" + }, + { + "tcId": 3362, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D377DFA8DE680900EE963A40027F106F", + "z": "6E972ED1A477167FBAF15AC866F375D323B2D7A62A24A36DBD7870F114FB5311E6", + "l": 1024, + "algorithmId": "74D0E683539AE676D7AF0D81166D512C" + }, + "fixedInfoPartyU": { + "partyId": "315AC37197D344079F7D5FD492726DC7", + "ephemeralData": "45BCBB495A87845F53F7734F20643963B60C3EECD3F8DB954061B61D6C8469D5BA" + }, + "fixedInfoPartyV": { + "partyId": "945833A6A2CA9331BC4F5AE92D5917EE" + }, + "dkm": "5F7D34782A9992FE705D1EBDA617DB429708CDD3B532E2C6F2753114939A87C60B3369DBA32999BA5B4D1A57E819384504F85D857B780F1FE722D2B9E6664BD09820B944813DF75019E18C72D6518E8DE9C149A0B2FC5E1ED716DCE3686D687CDDC0701FE40CE17562B2EAF1A3815610271B8192B5358234BE8D1324AD6BA9B9" + }, + { + "tcId": 3363, + "kdfParameter": { + "kdfType": "oneStep", + "t": "131C6809B93397D874F551B624CCFA06", + "z": "2788372EB685F67158E6604AAE95B5DDF829C7CA05895F81E524D76921C1DC5190", + "l": 1024, + "algorithmId": "AB07DB5743BE43F041E7E91DCEE64D38" + }, + "fixedInfoPartyU": { + "partyId": "D00E6F6BF1343FA7239D8946FF05B3AA", + "ephemeralData": "B5E802EDF42C0B06721753B22AC1175A62D649B76E5172AF68F5F1456586B22CC0" + }, + "fixedInfoPartyV": { + "partyId": "EA8839D12AD9DD09146D45A1D50B6DAC", + "ephemeralData": "4183CCA0ED79D421ADA914C1003E49C29C8AAD7B00C53A5E139AD80EDE0EF71509" + }, + "dkm": "0C9B9BC7A6B2B324E666649AFCE384A3EC015B2133D6D28B542CA31EC36246206A6F4AEF3447F27BDD2396A43102F6CB29FE84A98CC0173F662D8823D13EF9E529A95AE3270F89C76CEC3D8305152B04357F5757C268C9E57417DADA8A9A8CDE860658A46C837F0852BBD51B41986CAA4D0A01B21D3C018480E97A65470D6F16" + }, + { + "tcId": 3364, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D0E1F24D3F8F62E04D7227C8E5838C0", + "z": "98849592522C250587D169085D7E810EBDE99D333C19F9C0296E676723D6D78856", + "l": 1024, + "algorithmId": "6D95EA0A39F2A7A3BA654A23530A5FF3" + }, + "fixedInfoPartyU": { + "partyId": "58FAC7BE28BC65EAD05849BF1282E274" + }, + "fixedInfoPartyV": { + "partyId": "752A971B3A421D4F061E4E1F909D1616", + "ephemeralData": "B291CECF95152B6F0C64945507E77F7B43D42A3DC8A8ADA372AE29C5FDD61B51C8" + }, + "dkm": "CA3D4CCA69FE0241CD8F53DC8FD663F595C430F77F540630C2635D61C1F6330A05BDCB2EDDFEB23386BCFEBA7DFFADCF2B68FF7503A3A12B2E883497B57588FBB762A8C262EAF07D152EC6E20954FC01C213431B5628D3348D4FFA2CBE2C191F515EC6C80F9620292730B937721789E634713FE5D8DBC02664A4770D660A3396" + }, + { + "tcId": 3365, + "kdfParameter": { + "kdfType": "oneStep", + "t": "53D4B4F4C8F37362CF9DABF3F2381518", + "z": "124C91FA7FC05565355BEC42409EB6A0055BABB52F8ADCD53C704D36B6D21D53F5", + "l": 1024, + "algorithmId": "D3DADF8C1E66DA10F730F28750725CE5" + }, + "fixedInfoPartyU": { + "partyId": "38A507C582FBB48F2184E76CBFD43513", + "ephemeralData": "DB499CF9B7182B773A5F60123F6687B3D0CCF4D5A9E0A447AEE6A3084C77D0AD49" + }, + "fixedInfoPartyV": { + "partyId": "06DEE540DF9FBDD9312CC78E8C551F09" + }, + "dkm": "7C4E32522C310268DFDAE168F99ABE2ADE5AA2A8037415FC73ECADDB1CA7FCA3CB5ED7D0395439797FE9D096107577103A9C6DEB3C48A064239F2CCD8C38CE3E378888D0AC641B43EC30BA75F8F563F4117DE43E9605B6C0B3FFC52EF58AAA06050C00F5777370A272631421F8331C0128926CBDBE96DED37A4C2BBA8D39BA85" + }, + { + "tcId": 3366, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F1E9D1C510F9743FFC1A9EA0D72A6C0", + "z": "5DFF567ADAA8F5A74A0A3DEBFB0DF0D970A411237F8989D96FD3ADF5E83814E48F", + "l": 1024, + "algorithmId": "0D4821A7CFD77C9C72CCE94039A70BB3" + }, + "fixedInfoPartyU": { + "partyId": "862080371F119D9FF9CB240F0CC340A8" + }, + "fixedInfoPartyV": { + "partyId": "8983F5F9040041EE09A7A43311AC42E1" + }, + "dkm": "F0F0FCB042C7D75892373442969690A307A13ACA3C5A229751C262D295D0C51565CBBC0F7B1E6AE55C12F02439317DA51CF044E861D67CC647CC9EF225A7BF0E21A639B6A009E57FEFCC3E41554552082608DD4C9464DA7C147DF3419E08BAF9093BA01A5F05A570D19320667984781FD9C982021DDEA53D6C800EF1F726A708" + }, + { + "tcId": 3367, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B895B31C504DF4956F9A9B087396EF1", + "z": "74273A95370D8FAFA12156D69854BEF511F55D8402D402608EED5D99481C30E796", + "l": 1024, + "algorithmId": "7A656A96342BFD826C5A3CECD9069ACA" + }, + "fixedInfoPartyU": { + "partyId": "81C55424A64FF84C1157314939AE9DF0" + }, + "fixedInfoPartyV": { + "partyId": "DB26F9B65009997B0F91C0A3349C3CB4" + }, + "dkm": "3F49DCFB61587B8D771F02DBB3C74C76F23E155122C8A3A45412CFC401AD144CC03A090ED772626763092D6A0FDEB51AB8ACEC0A8E4FD689C1AE7D8D7684CB4F808C9484C12DAAE098C47182A6DD8F68428CDA64E8BE810664362DBFF0F81E20C9376DE1F4E9C1CBE38C674DCED6BAB93654F6FE437884A0E091F45276CFF69B" + }, + { + "tcId": 3368, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7E92B043B949F159AAF9EA9F724C5A2", + "z": "E84F587D9BE23E755F794761CEB4231020D6C1C0AE2EA76D4F2D19C36E9BDE4D69", + "l": 1024, + "algorithmId": "263BD14995E0D27B5DB93082530F0E18" + }, + "fixedInfoPartyU": { + "partyId": "DE54EB80F73BA8F6ACDFB79FF2FB2B18" + }, + "fixedInfoPartyV": { + "partyId": "5714D1923685F93C640608F93507F31B" + }, + "dkm": "0525A7D979399AAF6D416E591EC12AC373E98EDC0F306D99D24A4386D4779A19B0CCD9C7C4821F3EB38C00CDCF833426B724D08D5BC29FFF9573A7A50891715145E2DE92740A4C608AA590CF62F8BD8FD25F717954D0C74D5EBC87480D6C8CAEC60590784B148C4654D0FF5455C7591D57FD420497328BE53609BE52F26B8630" + }, + { + "tcId": 3369, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F354FC3BE9457D4BFACB9C098685412", + "z": "CEE6AD083D2DEE1E46CA3DCD2734B8368466DDBB1E62077C2B364643CDDEB855E9", + "l": 1024, + "algorithmId": "FD371421B2BF043670C6D284C2DEF384" + }, + "fixedInfoPartyU": { + "partyId": "7A18A04AB2446D320ECE30585CCCC840" + }, + "fixedInfoPartyV": { + "partyId": "21CF23F81855AE97ED171B5700968C39", + "ephemeralData": "90754939F57981C16EB4ADE8CE4F20CE0FB2D57DFC18F960F525E9062B0A10F2DE" + }, + "dkm": "389549689C6C9AC8812EF7C34015235E916CF03CE5C5CC3768E19A6C21B2F4C0AE3BC98B78345D0A69E04647B13B7A2B62C95A23F31F5DF1B43EA6C6685B9D88BAC6521772AED754F954CBBB7DF4555FE3ED72167EC766826E7968A1F3DC95995B2E68F3C1971738AF8E5EFE884CBD6C6657CC491111A82F52B275AECAE3EB09" + }, + { + "tcId": 3370, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D2BA5056322E9D298DC8F73A8B60F38", + "z": "0EBC647640D468D5B8AB6E740BBF30E4723E23CD7872B32079F72B87DA2F3F8A8D", + "l": 1024, + "algorithmId": "1E6A55702644F2A5760F5F7510027857" + }, + "fixedInfoPartyU": { + "partyId": "0B664462435A1815CF842A2CCB76ADF7", + "ephemeralData": "7FD7263984BF826405E869F9FD67BE5DB24BA7E464B57589A1C1DFDED35637713D" + }, + "fixedInfoPartyV": { + "partyId": "B334B1190FA18B0A97CF2371C8FF6EE3", + "ephemeralData": "0C4DB3EBD8C76EF3CFEF3A4182A77580359D63673C1F5C6F504F08435BA4A7E6AF" + }, + "dkm": "C8FE6062A530DA5D7F9226CFB596EA887B9EC6E96C4B0A735D29260922FCE792743BAAEE12EB05E7943E344F656A3133657BEDEEEF3E2C8485D1AB2362E2878B8150651D1C283AFC19078FBEDE3A517837188691596A38C48FD5F2763F13BE6E3DC60E050B781ED85AAA59CD9E7B7D9AAD26D09C7DFCDD540E031E805FAD35D2" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 159, + "testType": "VAL", + "tests": [ + { + "tcId": 3371, + "kdfParameter": { + "kdfType": "oneStep", + "t": "229AB3298C4AFCE70A625E7EA3974CF9", + "z": "68E11049999714463D830A8821C7C6F88485CCD9EC3DF103BAA4F43CAC3B23965095F8", + "l": 1024, + "algorithmId": "F2C1DCC06004AAFDC2235F42258E6DE7" + }, + "fixedInfoPartyU": { + "partyId": "C0700FA9195FA3D9AE5B9FBDCF2B8B2A", + "ephemeralData": "19F5D6A337936AABE447186A58C6B6A14DC2D50FF3710B5D2765FD9F8BC874305BA12F" + }, + "fixedInfoPartyV": { + "partyId": "D40A6C32CE503439BF309FC3B538866E", + "ephemeralData": "80E9BF603FB279C8361E068501890C9D8884571586832E6A34E0E32D17F14969ED1E23" + }, + "dkm": "06415E95AC48BCB2296C2187BB86003FB9CC1B3B82D4987947F141440E51A61EAFBC6E1342EA60DF59C15A5629348E681732D69C4BF6124EF8DE9BD996D152F8E07E5088DAE14AA09B881194176323ED355D0B45CF55FADB23E2149876E5A6D7139E81CC6C51387AA5ED1FF3021CBCDDB359E3A32D7548E080A42FBB02CA8CC7" + }, + { + "tcId": 3372, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB7D6D38877AA3ED132C90540E424C0C", + "z": "1BA1D2F3C97F9E21E7D844CB077E16E56958B300C6AE0CB9F151BEBCB13538C4EF40C4", + "l": 1024, + "algorithmId": "A0827E26E06C4F61010719C5D4EB705B" + }, + "fixedInfoPartyU": { + "partyId": "D47ADD3F06739E0350859AD668BE8FE6", + "ephemeralData": "EFE9AB2343A8D2D12C042D914A92F0F470E0926AE6FD883E1E904E5F7F233845B49804" + }, + "fixedInfoPartyV": { + "partyId": "AC9B8CA17B12660A87083F6BADD5ED39", + "ephemeralData": "1946FB36448A891A2A3F0BE7B50433BD7DAD0D9E92FB4CA68DAEF73417234E71EFE00A" + }, + "dkm": "7D6C29C1DE947548F103C53545B96C772E11F6731B935D9324700EEB63474B082CB06249822189A3FCC273F080D25982817C434D64F1573C05E2ED69BA3A2B260D31DFA586EB30FD5DF01BF5ED47925E2883334A36CDBA119AD269A8C485D9010D8DDD6BB9A9580BAF73940325253FE44C045227BE0F4472B983393A6AF8137D" + }, + { + "tcId": 3373, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5AAB4F4854A3B40AEBE7BF05C506E65", + "z": "EEA6DE5D20067D6ED1FEBBDEF91162CDB3818694D632C717CC76048E606849BFEB61D6", + "l": 1024, + "algorithmId": "98F5101063B5FA493523C132F40C71F5" + }, + "fixedInfoPartyU": { + "partyId": "09A1C4EC46E603DB1E23A4577A9047A1" + }, + "fixedInfoPartyV": { + "partyId": "6788E2D4A0B5D259BEB14E8FA9329D13" + }, + "dkm": "E7CC38CA010B0E7608FBFFFCAA8645E1E867F57EDE6C211070DCB428C819BDA80360EADB7AA477DDADB51AEBB1557A5908F1A93D4BEB79CD80D1EE0A1C9F824942A483AA50B0ADAFD96434C5D8B96572E38C1FD5562F02C1C63D3E4488A747325BF4A4D3705AF3C7EC59D7158BBCB48109445F5776690C57B05B2E9CAE82F72C" + }, + { + "tcId": 3374, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24D9797067C26EF92CFCDACAB4F7AB34", + "z": "12E1858A1F5ACC9EB35CD4C7CB6681F1F0D5B193605AF467BFAC26617E70AB3099E34B", + "l": 1024, + "algorithmId": "6287B9AD5E065E0390C18F0CAC89D0A1" + }, + "fixedInfoPartyU": { + "partyId": "B62E0D9F37941B1E8E952CC3B6561FC9", + "ephemeralData": "0284A49E9014243FABADD8ECC42C1E5A73974813E1348CCC94E0BD4F5CD217E5A2E788" + }, + "fixedInfoPartyV": { + "partyId": "5724B2E692C2004C0667FA4DB12D3E9E" + }, + "dkm": "43236BFC3BCE0BBDF37115219ABE08AF268A764F33358C497F2111D6BD4A4E6F43C7C37E60AFD8AF4AA36A47532B93E3B1694DB5A2041C823AED0140494CB7C91D2EF10A690E162846D83269F56EB9D6BEBF29AF94B6DFD0E8216BC0FBF9E32A9593247B4471120D0FA2CBAA8BCAD40FC0C1523ADC1370D9C4F48B70BD34E54D" + }, + { + "tcId": 3375, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E20F92A479ED79E13567BD52D9B0C8AD", + "z": "10B7131390A9368404019C9A0AA530095096802F714CCA7E48E735BB13B1CE308D61EF", + "l": 1024, + "algorithmId": "0BBA3019FF9A23A5352223FEE5360357" + }, + "fixedInfoPartyU": { + "partyId": "F8BD08956AE8756AA4F4B5FB3C89A2B7" + }, + "fixedInfoPartyV": { + "partyId": "126B34568C848EADCD93F3574AB10541" + }, + "dkm": "CE4002EE66846E7E75BF52703558DD96D8FD9C15992486F2AB095380A8221A0166C6C5BB7C4F212C111B23ACA3F8FEA76CDB99A694ECEC58EE710F49E4131A958839EB5DE75466E306ECE4905D37497C5368F9DA2EE7AF85D9609E9F4E6A947618DDBC66E44B9B55C0A0A5A04BF61CA0390D5B7576FBD5717AAD94A1E95063B2" + }, + { + "tcId": 3376, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6B8FD456030CD53422A65072A3BF339", + "z": "CF511440B966BA764244D4B2FDCC9DEF0E3FF950DBE51E27C19667EF593D9C57C4B874", + "l": 1024, + "algorithmId": "A2FF4ECC4348CC3EFFC6EA449686FF17" + }, + "fixedInfoPartyU": { + "partyId": "66DFF26D2302A371C24B99FB05A88913", + "ephemeralData": "51B400DA84D420D10E8C095255123951C7C716CC1380DC0135E3FA588212BBA758C9EF" + }, + "fixedInfoPartyV": { + "partyId": "5756EF2394C116B601AD26765827F94B" + }, + "dkm": "06D2C29835DAB96E6EF6E408A1AC0CCAA1E682BD02329CF789709EEE349DE5D4296935863C4EF0C0352F8C46C8A5279B662E5E6EFF93FEA55F1C7A36E44CBA17478BDA54A74D831563F130E99D15FDF59B8E6792A11888754ADCDFEC8D2A49B06D9BF9EE6B8123C77D58FC2FEED61D7130C1FABFF4131DA84C9F6A463FAB85EE" + }, + { + "tcId": 3377, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C5EA3CE271508B5B4D6AADB8780798E7", + "z": "B438F54B5883B693ECC3A79961C4817BCB56C10D934BDE5129BA1AE4EE19ED2D07A263", + "l": 1024, + "algorithmId": "B53FAA2017FDE0873AF4061F48111147" + }, + "fixedInfoPartyU": { + "partyId": "B043F80F6F1884FE5E23AACEC812A27D", + "ephemeralData": "DACDD3739BDD548E1562665DD0FD8EAF6A1597A65CDE61962D5A2C29866D419F446F70" + }, + "fixedInfoPartyV": { + "partyId": "78C8BBA59DC7F550A29F8B353C14F385" + }, + "dkm": "BEF9D0D17A0FA801A4AC334298A07FEF93B165A1DFCB63BE0EE91DC5613B91D7E377B0DA61796549C25785C7B5D43E7EC4FB518704B4059925B428EB052B47217E2B95020EEF1A42814AA4B9C46F466999AB00E655B30CC31407F0F0748EA579BE4B1DE015E0DB109BC5F29411C8A93A188437E560E01D2FD15B8AEA44A3E9A5" + }, + { + "tcId": 3378, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4A263A3B0550849EC3BA0CDE3CA1651", + "z": "CDD42F78165DB9E414560884C7008FBA288DCD2B96B2BE36FCF66FB32D17973483B731", + "l": 1024, + "algorithmId": "59223960FFA8D2DBB90E0EEC5D424425" + }, + "fixedInfoPartyU": { + "partyId": "E32972962D04A3D67416E83AC1EEB6A9", + "ephemeralData": "3D007A8F717D2804E0F08C79D1EDCCDE75EDE4E90684E011FA4903412BFFEF3044E83A" + }, + "fixedInfoPartyV": { + "partyId": "B243FD1FF6631C9E3780C2B7B99C9047", + "ephemeralData": "DBECCBE406C0F9285C33B64B1CBE334759BF46DF976BD88518271EFFA4CB164D4904B4" + }, + "dkm": "533032BCE976CF32EF3B6B9C186DF703F39830D66FAA2889CAE9CBA7BACC73D1A2E5328E4F4986CFE0B8C28125156454AA53E1ABD967B7B4665B847636CA9B55AB5106F2F44DD0B0D7674508DE121FE7FE7AE1C2999FE7A5A8FED40EA13F929767B45DDF261B478B72C8F517EC9AB6E214F2B797EFA900A48E27CE35131E494D" + }, + { + "tcId": 3379, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1FF9B28AD710281454DFD72CEF68B46B", + "z": "AABE6CCF4171C40420046207560B43C90F3B8D6B4025A94E09D5A648BB53B91A267491", + "l": 1024, + "algorithmId": "C2B944263BDE6682CB48D42D355841DF" + }, + "fixedInfoPartyU": { + "partyId": "49A4E8EFAA90CD574920F818089E1EB2" + }, + "fixedInfoPartyV": { + "partyId": "EBE23A943483B632B5B81E1D86DC30A3", + "ephemeralData": "5A73BFAE93C3149C42E653E6FF9523E23C2CF2271F1C3159D139FEC122D0F632EE4D8D" + }, + "dkm": "0C83A23DCD6CE7913302EFE603DB2AE9796B31B25A8F41EDAA9DBD9E909CDF7DFEC77F6FD8816BB135E5C7789D00C3F2C0E5DBA3FD1F38682A5617D41155A7A2E23912764C108751B76BC96D22EE67162C7909E4B2E3D529E158C7F93DE98E49FA198CBCFEC7D93C96F0B112AE545E2883CEBB739852E158C96A87CA9C626A39" + }, + { + "tcId": 3380, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB39D038A56B85D5B06FF205AB8D9581", + "z": "BB5ADA96505F368004A9A2B040F1EC78ACA3B1492103B992824B11F74E0078723F59B2", + "l": 1024, + "algorithmId": "71652C5F6D1614678804A205D95911A2" + }, + "fixedInfoPartyU": { + "partyId": "F32163D1F6DC70BA9A964681F8F2EC05", + "ephemeralData": "72BB6B141C32B2C540865656312BAABF5D1B485EB7EBFBB2C0CEFBCECF8F19C1CEC124" + }, + "fixedInfoPartyV": { + "partyId": "89982484BEE8D5788529225CECF98B18" + }, + "dkm": "0735482B1796E58A14F52C6B9276E352C1F948C66EE7492CED60743712522A6A2634DFFBA1F0873370F2D61613F96F79CF188563CBA0F3A2E99C28ADE125D229B6B8C1D1D64B75F9D73BB160EE45672B3CB2B02BD27C74CD826206890D80582FD8B8EBAFE165B2B121608CA655C57C39A2F73BA2516ABB1CA3A7CC7143298290" + }, + { + "tcId": 3381, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB90A5952E3E2FD9F401A864D9804D22", + "z": "7B16532607B69016A8742452AEA5EC089661B39FD8E261A35B46EF555F43D99C2D85FA", + "l": 1024, + "algorithmId": "EFB871ADF8786F65BABD36CDECCC9673" + }, + "fixedInfoPartyU": { + "partyId": "8B79BC0D1EBFA478D151607C9420287D", + "ephemeralData": "81EF037EE105B9D42770D35F09EACC819CF56E286243C779364F9383027C47F61A263E" + }, + "fixedInfoPartyV": { + "partyId": "9EF55D61B0571A11E9101DAB366693B8", + "ephemeralData": "A11A67C377C5BF7B45F801BB64F0BE0794A9C1D875B86D8DCA2E55D623BA1C546909DD" + }, + "dkm": "D7DE438BA2A88EFBB21446DE496AE73CCFDED7E8CB3870570CD85DE2DF59AE974AF255E098E639B320AFC06C47ECA153BD08F94CB4AD19E707553AF3F63434E2F8C3F1ECACFF69819E0C335C84EA03A0F3D34CEDC09A891EA7FEC283654A32168B4BB8C7649D96D6EC9F5A28E83843AD28F8924163743DCB9F5B47732D318616" + }, + { + "tcId": 3382, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F717366660237082D8D122B150A01D4", + "z": "13D32E5515153D8B01294521F15D727410EA39EC1BB46A431DA8FA91DAD5911175CEA0", + "l": 1024, + "algorithmId": "133B1322B3439FC97B7B40C20956D334" + }, + "fixedInfoPartyU": { + "partyId": "2D161C53C24AF4821B7826FE82299D54", + "ephemeralData": "F199E7276EAD66FB2D6E42F94D11670F4EC7A19615C893E5544FD467CC53DD42FDFC63" + }, + "fixedInfoPartyV": { + "partyId": "B12B352CEF3624D7291A5D4A77D0D631", + "ephemeralData": "5F19FC3BC6007F0BD575E74CB1044FD1C0E3D6FAFD2CE02600D0266E0003AF52141EC7" + }, + "dkm": "DFBA07C7B3F097BA9238FF1EAC9230F5849B3B8C2CE799522A64D2E5FEACA3359891DC57770F71383445F1FA02CD4037F8F681E32057E57532AB69733A5BFDE1041B8583BF7CB8A269857469B02490C362BCE163FE5BB6B47B4576C706F90D6BFADCE5760448905973ACC30C81A5DE0123677245E126BDB6C1DB39370B9580A3" + }, + { + "tcId": 3383, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6119340B7B44710330347AAF994FEEEF", + "z": "C1627DC40FFA84E3C2D98FB29CB984B76F917DF028BD3A995367D54849BA24E7BB9886", + "l": 1024, + "algorithmId": "4583E8E248C397F81B76C854C60AC42D" + }, + "fixedInfoPartyU": { + "partyId": "FD534846F69A2647C407A534209B2D4A" + }, + "fixedInfoPartyV": { + "partyId": "D71C8F57DAC365F74A5808FCCDDD62C5", + "ephemeralData": "6A4A1F7E97EFE9433F3CD543254EF4851AFF95FC309A7CE3F48C54F57C123A70E2C2DE" + }, + "dkm": "648A7BCF96433535C88B7499E48F7E9407C9594B253A1ACACD830421CF334AA28654792733F806728860C0F2359D292B01CA1D6090705A2535CD5B727ED296C553AA34A832B6A6940A40F37F75BBF708ADFC6DC4560AA042AC5508CE67C103EF67107599E18E9907F3B95BA70A17555186E4D4643C060B1A6D4C05A03F409750" + }, + { + "tcId": 3384, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B5B279A7CD82F02F512C8FC16666D76", + "z": "5C1FC96450292669C3256EFA6226F41E1FCD4F60415AEC4C3DF0426CE5C4FC447F5ABB", + "l": 1024, + "algorithmId": "5D3F6820175A258BEAA6FE98C51B80C3" + }, + "fixedInfoPartyU": { + "partyId": "2D77EDA809C58B0CD4FA87B261FAE8C6", + "ephemeralData": "5C83FCAE7C1A1CA86F5652FA976D6C54777BFDCD83D89F18457B01D6D684F795463D07" + }, + "fixedInfoPartyV": { + "partyId": "AA3C41B26CBBB40BB18A2364CEC6D88B" + }, + "dkm": "94FEF11D1EA87FDDF21EDED598B98B8C788036CD4E4B099CB30EEC73059450748DC542988650945408FA27D3649D6F9D9F72803155F9544881C86991E2A53B3ECDDE02102ECA454C5F694B2959F3C8A093EEB026B4A4D17F862C9ADE2E92ECAA382122F343169C103009382771697432F3638538E058C43C2B3022C5A1482671" + }, + { + "tcId": 3385, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEC045F6732B0489B6C20BA4BF04207B", + "z": "D516685D2020E3403CE319598A811527ADD6CADD7E43B0D0C4D85F6108F6031E0820B9", + "l": 1024, + "algorithmId": "F841A8D78F1528A217940E45C599DB65" + }, + "fixedInfoPartyU": { + "partyId": "A84D864505F247CB60A21785F4239FB6", + "ephemeralData": "C5007896BAF6DD2712BE21720F28E2A63DC76D9A6866B73E7EC7BA2004AE9538E99997" + }, + "fixedInfoPartyV": { + "partyId": "D86B89E11421244FCBD31EF1209D2DCE", + "ephemeralData": "85FB1D729D31AAFF4EBF5C0E874BA6CF6D99A1B6C6E80DC343DD9CD71676896F3D0110" + }, + "dkm": "4CDE61E47C4DBAD15CBDD6EBD69A068F56CA455C3864583F4863AACD08F0AEA06CDD06BE0C7A33F64C3794D90C43E83BEE068BD430954ADFB958E36F88BF4C0A9E7E0001B1C570942C160AA92D5D9E8AB1B9F97BACBEBBBD274E5ECCBA5B7A7C25591E856CF043A6B523111927690CA4B2F98E8B68B5E7E1CA3B2602F6FD14E6" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 160, + "testType": "VAL", + "tests": [ + { + "tcId": 3386, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1B8D0B60C53A314D3A969597AE4255D", + "z": "5BA0A7DAFB02706618A4411EF89FBBF618D8BF18CDF5D1828674E3F8B5FF", + "l": 1024, + "algorithmId": "6F073D9F004162A6DB68F44AEFCEABD9" + }, + "fixedInfoPartyU": { + "partyId": "E9518B8412A3D7FB2345E90080AAD625", + "ephemeralData": "93929E47FD7C760D17571441A79931DBAB78E1874FE71C76B1BD6C97ACFC" + }, + "fixedInfoPartyV": { + "partyId": "42BD991964342468EF08FBDEFF181FDA" + }, + "dkm": "0E59A2A2D08CAB3E74FC19E6A6A13400B1CFA0E0126F2B4A7C6C617DEB1B6F8BD53F4AB250E8611164A7007795FE4874B540B01C6EB6571595B1674DF61E9FE6AF988DF693725B6C4F2FFAB2C672F8EE510A9768F9CE0E539A23943392306A681C7735825D730CDBA6067238296AE668538E457C1C8FC5DFEB9424984F9D5D87" + }, + { + "tcId": 3387, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6450C76AF9A19BC0A296EAD665983611", + "z": "43D870F5B4EB897DB22D06443D2728808A93F5C72FA87F1C803A5F3AA130", + "l": 1024, + "algorithmId": "C70F3D013CBAEC2A873D790BB5568174" + }, + "fixedInfoPartyU": { + "partyId": "A023A7BD191A918CAF03600B569B621D" + }, + "fixedInfoPartyV": { + "partyId": "A6AC8A8674B0247E3749832CD2791A35" + }, + "dkm": "0CB118E352A1E9F8F80105B4E475F293C548E49D5448AF808BE5D6C77F3BF6129665F9BF57636A280910B2060247BE53A36FB7901246D2A12341EC6FF2443921AADEF9874669157D69CF279A25050BD37904AE46C30C5CB7A94C0ED53196FA2C883BF13F1BFE81CDBF05B560EAABF28CC237897584E994A874B16C451EDB5E3F" + }, + { + "tcId": 3388, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDAD27566B053A78E9891AFDCB75CD41", + "z": "989F25FA61D1008B2A6FA9C70E9DF4A09280A83940A664E1CE70F013BD84", + "l": 1024, + "algorithmId": "89D8FAC9658EF0B96503A560734B5B1A" + }, + "fixedInfoPartyU": { + "partyId": "E1E1BD2510EB7218E7E60CE0D043910E", + "ephemeralData": "045EBD54F5B50E94B2AF65A7310EC4BCD40E1F13325A4E046048CE119AE5" + }, + "fixedInfoPartyV": { + "partyId": "C8D2D986823F30C6C98E8B14F7EF1ECD" + }, + "dkm": "8FE0F0B526C51C100A73287391A3ED9805ADBB509750710CDA58E9059779679E1D12A6F2616F613BE282C90B0DD7D5BCF673946105A1972BC5D6151CA91B0B5ED91B1A92A2154AE27BED823218A8AA5FE3257B1581A39951C1BDE3C5CB42E9A58B7A77A44B749FFAA39A4D3EEC7C4429CA1F9AA2C8C90D565DA37B0C7A3AD7C6" + }, + { + "tcId": 3389, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA4BC64593BB70F57C16C5E8D02CCB18", + "z": "036DA821DA0961C668D6CF2DF6A3C5B78E874EC920D10CA5D4574A220EA1", + "l": 1024, + "algorithmId": "834C171D68A554C83A97291916572026" + }, + "fixedInfoPartyU": { + "partyId": "C8FBC8FF2026442B02F40EC6AA0901F4", + "ephemeralData": "68B6A9E9CAA1D1A9C7DC45C82BCD9FFCB27D40C14839237B984FEFF6B866" + }, + "fixedInfoPartyV": { + "partyId": "C132C68C868D68A51376EFBAE54165FD", + "ephemeralData": "3A55B75F86BA280CF798FF5B4AD06DD2AF844E250F9F1883339C31812A91" + }, + "dkm": "1A2C4C50ED90B841F4168BDFCB657C5DD4A85AB0DAE480660AC4AC521652F6C052FDF91D319F7EB983B3A0D87295F7F6487EE6FFDE6C4F08F0748FE8D9D14CD3B034FDCCF4F728C77FE20F4B440F9090F848E00E21D04183EAACE3BCA4831E59BF9CFA8A718AE49A71ECD2402C0A2FF24D8A32F853EFC01F20917ECFD7A93118" + }, + { + "tcId": 3390, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F4C21E75D65F7BB725ADB99198361487", + "z": "7E056DCCDE6E42B27740A0D424945331AD8BBD85928BE47C4DED53FD993A", + "l": 1024, + "algorithmId": "7CA4EA84A67C6FDAAF5564E883041CFB" + }, + "fixedInfoPartyU": { + "partyId": "F033FE0C52973A8F50EDEA6B87ADBC3A", + "ephemeralData": "6AEE089A95446546410310C9580DDF0E810FE4BAE6C3B4224951410C4909" + }, + "fixedInfoPartyV": { + "partyId": "6C3203A8D38B72E93CF924C2447E0EB4", + "ephemeralData": "982F84566FD0E6EABECA66AC3258C519AEBBFDA602C896E06AA6FF7289B8" + }, + "dkm": "5D553D547209AFF6877029FC4564F9E8FA231ED4E79D9D7B9345A65568F312AA5B67640FEAF68DD7D64D0A61FE6D1D1B272DB85041D20C67577D4DFA5102D775A86A24316BDA21C66D1B8D1F41C39C6163664CE066FE82B9C925FA0BB03F1FEC69BBFF39E56A7825887B2F7C6682289AB7D30A08699300A2AED84B204EF3FDB3" + }, + { + "tcId": 3391, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE6BEE631C159964D95AC62EE08D5B2E", + "z": "1B2711281E76F96B673AECF58563C9B9ECAFF3B8CFDA51AE87CCFEEC12B1", + "l": 1024, + "algorithmId": "94C168CCAEAFEC9FF3373DAA8CF7D1C0" + }, + "fixedInfoPartyU": { + "partyId": "670E5E063BADA6C8C37BBAFCC180B090", + "ephemeralData": "61FE3F4EBDA04EFFEFEE72073FBE2A9C5FAD87F2A649B47FF9DDB84BDF77" + }, + "fixedInfoPartyV": { + "partyId": "3C8814B30C01B7B363DC32B1F40FEB0D" + }, + "dkm": "ECD15197E9E6F8F26006873065EE227BEF44085F0235FBBBBE5CFF49A6CF43993A14BD95B073CDF049728515327E48B745CC8AAC7C7B627BEDDBA1EF889DC9BBD69AC08D4456E14124630A874161D5C0074C038E904D9C30FDCADE3B71738534FD6D91AE972211F73B4318E88668E4C63F2273F2F8BCC2C9AB41578099315C90" + }, + { + "tcId": 3392, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E81BF46CE28B21B93EAE419EE69DC2C6", + "z": "9880BE971DC155508D83A85FD5729B49B3C19687FB4B44DE32D5F8164229", + "l": 1024, + "algorithmId": "16E41244DF809352532F6EA2F55F692C" + }, + "fixedInfoPartyU": { + "partyId": "1FA18E3F7C71EBC7D572CD7E97775EE7" + }, + "fixedInfoPartyV": { + "partyId": "3DCF9F2E54B43660D6220D59C83A2165" + }, + "dkm": "F4192EF482651962D97493E4490BD59C17BC682C9CE69058156D40347A7DC016AE6A225BF319AE9872F14A1EAC082825A18F67B88EDE0AEC0F3A04E2014AEABB03FE678C1B2537FE5DDC5F224D879A9F2FF8C4440089201EC9C6DF91D461569C54837E0E7DB2A68EA6F70AE017FB9D144D46E44EBC829967ADBAC401446FC2DD" + }, + { + "tcId": 3393, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8EA8A6F4CBE321021B9C754B5214986F", + "z": "59D13E94324661E0376F5D89E22B1ADB1F7B56D6FD878D81D2373DA90B95", + "l": 1024, + "algorithmId": "22D42712EA2B4D5C1325B460974EE2D6" + }, + "fixedInfoPartyU": { + "partyId": "459E4DCA86179DEA967D06549DA5B61F" + }, + "fixedInfoPartyV": { + "partyId": "BB423D05F7482B5E1F4B1C119FC946E3", + "ephemeralData": "E59F34DBF67E5A990DB908F8B19100C2936CE845ECF7949CD5CADDB120DE" + }, + "dkm": "FCABB6B91D06EECE6A80E6E96570E2006ED78A514512DBAB8533069434FCE07AE56DE10423DE483568AA5BB262A12A0608311BDAC3D51EC484370C71531C46FF0966930B8E9FDBBD7958CA285EC3ECCB3130E6EE702A3E5EE4A2CAAEAE12C16E667630EC558A3888349B44D78450368259811C7799F90893C5E0CEDF90F00518" + }, + { + "tcId": 3394, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B521B945607963757B175C988FD5D64", + "z": "F44E3EBE505FAF6791193D1921805225D95C1D9313424DDD852EC670ACC2", + "l": 1024, + "algorithmId": "36A61334D3451802124B55D5F6A71024" + }, + "fixedInfoPartyU": { + "partyId": "93E1B545B07FDF08E0A387110AC6E67D" + }, + "fixedInfoPartyV": { + "partyId": "FE9EC6DD66C0443022140272D6B5715D", + "ephemeralData": "2A7AE242E0E8B1E40A1E99CD6155CCCDB24C68BD39199FAE9DC85257AD95" + }, + "dkm": "CBEDABC765B266C09CDC5E35FD6C4562624032F45B56DFD2C73E9A36D2D1BEB4633E334A8BC332B7C2E4B5BDB0F89D1B45980801D06E09AC1E15430F32E8F6D0E98845E941DD56F9312099C38C0C2E5A246E26A1CEB1046869C1A41358E853681937B7C460D735D58900BDC6E7641FC33AD14A37DCE5A7BE295E40C78C4387C3" + }, + { + "tcId": 3395, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D55803A34D6A9ECDC288948651F8C718", + "z": "DEF6D3A2B26ECFEE4726DB21F201CD6125386C9CF24ABCC4348D8D6E23AD", + "l": 1024, + "algorithmId": "4C4834981A014C18302C61726F74F664" + }, + "fixedInfoPartyU": { + "partyId": "1BF793063C02E3BEBBC5746D2CF3148D", + "ephemeralData": "41E9D83E334607ECB70C7988646BC5F092DA1E9E3565AE7DE2B14B9D3DA8" + }, + "fixedInfoPartyV": { + "partyId": "9C273E077D7532DB935995F92852D85A" + }, + "dkm": "DCC5653CC45E5B5C2992A26D52DD1BB2DE5E2EDD1AF4844CD249C4C347209E55110EA642E254114E68A4EB746423DDCBC0E3C42194368394828C9028C4A6235BDD7106B83E3A4EAA6C68656B3AF015CDD42D788B07558355061CA96191AE9F1B828DBCD97BF8EA754AC68BC78365A54F8C6E684A310AE376CFDF709D569C36D6" + }, + { + "tcId": 3396, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34C4F0FA69CFB4F7B1742E3DC88230A9", + "z": "28E80F66924D6F4C873F3BEC141F5F7E0422F4D0D463F6415874352EA55D", + "l": 1024, + "algorithmId": "5E1792337A3BAD087891B7C35E44C19D" + }, + "fixedInfoPartyU": { + "partyId": "7F5E69648CEF50E9E1638D1C06E8177D", + "ephemeralData": "22B24C9B2B3DFBF1E81B0BB8563B0D31F1E1E7BE58D6F48904E5496F35F3" + }, + "fixedInfoPartyV": { + "partyId": "FAA43446125F1397DF79DA7303CD11E2", + "ephemeralData": "A109ABA5BE5B94577DDE1AAD76B3423D68BA0C74440A7474A513297FBD5F" + }, + "dkm": "0241C1A8DE6BCB718B32965F36A3D3068EFCD4FC04D55C2248535587F06746DD393079D4971D0C611BD2E73F3923FD1064527BA7C9017F5275BE6B21A2647FE93A1DD30FE8B83B88D1A94867C765E889F8004437E744B6C5371549E76F423DEEFCFD4CD9DEDC5E6233B56546C49B9D1B76FB7EFD1B63F8F3249DE4241934D6AA" + }, + { + "tcId": 3397, + "kdfParameter": { + "kdfType": "oneStep", + "t": "263D99AA6FE90FE0987CCBFFC5A7C70F", + "z": "74DC53F3D78DCE2123478E1763049F5A70170613F6C570C83BEFB1E3AADF", + "l": 1024, + "algorithmId": "AAA5A2B3D7B44B47FAE3C562D46F099A" + }, + "fixedInfoPartyU": { + "partyId": "75B7080036FFD4BAF4BE09F78D0DAD50", + "ephemeralData": "23108F42A810E1517889F866A65194754717231588BCDFAE82466A49B470" + }, + "fixedInfoPartyV": { + "partyId": "D0A9813AAD5E2B0909929E8356171719", + "ephemeralData": "3EDC993B9C4701D6C4C10BFE6E99CF1E3F9D5A6863F7F77D5161AEA2898C" + }, + "dkm": "877CAB6700B0F8F550B786EE695651E1BF2E640219FED335183E961DC62AA2AB9FE4F3DE22F05887015CCB1A98FFCA97ED5A6D3A5997822426AC5A716C5AD86EFCFB60F7BAB0D89658D475A7D80F6A0344A092BE8EF6C3EAC9ADA603E9C85A9AA41454E544C78C9B59DE501A3FA52AA91842BD9A2487876A4C349C43EC11F5B8" + }, + { + "tcId": 3398, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7B96A78EBFBCC629FE959903088B5D4", + "z": "4B292AD48E91CD1BFC528BA34BBD19385515B1808DE2C3B509C3750A0655", + "l": 1024, + "algorithmId": "7B4F7A8F3C79A4AAD43724F6372E7B27" + }, + "fixedInfoPartyU": { + "partyId": "38D8024DC400CAB8D97088E6B1EB3F5C" + }, + "fixedInfoPartyV": { + "partyId": "9A8B3435E43CEB59752EC72D2DE2930D", + "ephemeralData": "83F5349C8C3CBC772E1D4696C70459F518AF8D8BD892E4A8B06F63C64131" + }, + "dkm": "87B03C1B1ADB25DBF8D40E58B86A1FFADB65DEFC0E841469D6403F1C7D98C43F031EBBE925E087EEBD7F9376361382CD19EE14C7F5F6B793783A93648E5550E7A6A49E61590B4F35C5D23121131A5D3D6B6BA9086BD75C42BEA315FD98297387B8CF01CBD3368968D361904BA5DEB1A3A3103B62838167DB40A4EB4EB8B3EA21" + }, + { + "tcId": 3399, + "kdfParameter": { + "kdfType": "oneStep", + "t": "713BBC7189462DEB09DF3E75BA5613BE", + "z": "010EE2D20C9C5ADB5031A00149B09E4F957CA765A3FA09FA77D21A22F565", + "l": 1024, + "algorithmId": "A881103ACC0EBEDB6E8B540FBE157B98" + }, + "fixedInfoPartyU": { + "partyId": "37D8D1BF4C1947D567ED44679C821EFD" + }, + "fixedInfoPartyV": { + "partyId": "FA18A5C57EC71A143F9BBA28D9A7DE56" + }, + "dkm": "420FF18E100659AA59978D5BDB2CF4AE4AE32CF8A4EB0062C48D2B45920AD13DD2C1736542757280EA715154658C90EB25990A335A4F9E3137BD0F6072E8F2C44A6C2058AACFE6E4C6C204AD58F72352078552EDEB3F8409B2FA1C328D6AE3C5FCDFA15D836ACC3BBA70D095A87761F4516AD4854A769A9A5A49F7073478E968" + }, + { + "tcId": 3400, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA0376B1FC95056EDD4006B7A0BEEA5F", + "z": "89F997C64C599A614DBB3EF22671FE3E1F1399D62006C71EF9FE3CE5CE25", + "l": 1024, + "algorithmId": "0E50AD7E37CC005E2D817241396E862D" + }, + "fixedInfoPartyU": { + "partyId": "300C9D2B633D5C71B779C7B422FDE87B", + "ephemeralData": "F2A3437C1655220ED97912129EEF7E6F370B530D1F64A2819C29EFF92EE0" + }, + "fixedInfoPartyV": { + "partyId": "636CA750807B4B5195E30DEA50151AF9" + }, + "dkm": "4F4B71F7A1774835CC850E759C6EC9877DAF96E95DC935DD35487647282E60651EAFEA13D13AA02570D14261E09E9F0F9FA5BE96E40189F2F16B19B172ED8A11156F600D7FD20A2FE2F0D623396A289B45A69D8973947F48F9A594DF5FC4C43985E378CFB29DF1F029D3F773A96B44943D95C3061A43892694D02995E44E80A8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA2-512/256" + } + }, + { + "tgId": 161, + "testType": "VAL", + "tests": [ + { + "tcId": 3401, + "kdfParameter": { + "kdfType": "oneStep", + "t": "16AA7148A60803DA4BB4DBE787B71EFA", + "z": "FC78CC0880146E89AC99F1D3CF4D15631DD24F19A8342C1A8F3E523F0387E06BD82360", + "l": 1024, + "algorithmId": "FFB632CC5C8E777AC9BA778C86E4A6AF" + }, + "fixedInfoPartyU": { + "partyId": "56EF5AA51E9A4CA834781B731F4A5AA9", + "ephemeralData": "B50BBD7F2E077A578726189D48AAB304BEFE38B44D86BD3DD07ADA477A045312004653" + }, + "fixedInfoPartyV": { + "partyId": "6C6A4CC5EBF6A7A198D7D05655E97785" + }, + "dkm": "14AA49E50F9A590FB79A7FC30E9733A177F1F0653C95D4A355AEC1629BF6EFC71E7C32E925358A8D0C2A8FD401CE3751EBF0FBA77C0AAC1F11FB2EA8D69C41D396B38A51F0C560788B97E14F3A1D29EEBCC0B7C23DEDCECDC6490767DB1FACE31989F1861E606B8E99F566844F1EE249F09E5749238E87643EBC4BA9B87841CD" + }, + { + "tcId": 3402, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79DDE480BB7C93D7C6D1EBAB666014C2", + "z": "D060CA26E6344CDFBDBFFF96613C101AE4FC43FC1F3945734A858943BED4FF599CA7B3", + "l": 1024, + "algorithmId": "078795DF83DAA80B67F0C8739486D082" + }, + "fixedInfoPartyU": { + "partyId": "777F739D805EA025DD1D56EE072DF837" + }, + "fixedInfoPartyV": { + "partyId": "E4A8239E54F6DE163F5906467669C300", + "ephemeralData": "8B349CB57C86882677D7C7D3F2F159F7072562BDCC6C1F3EA1F63C5FF2C4F5F41603E7" + }, + "dkm": "04F2583766A54C6098EC7117F167FFA2F829A661673558B7F5D72F711098B2E2F26A4D189A13DBE37DFF3E64A09793B1C0426D367355705C37BBE7B84A44DF86B84B3AC08DC36D7CBC65131BF95E8AE896F1FBF48323037B4C6D8125B9EA6099A66F4019D77A569CAD67C2AE9AD0F0D74CBF9CF73BDE93152D49D6D1CFE9A63B" + }, + { + "tcId": 3403, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EF05A1DE245AB8BDEA98D6FE8ABB375", + "z": "9A15DB0C9C657A6223D5E7E255FBAA8C7E518276EE3238E3A89BEFA45534684655CBF1", + "l": 1024, + "algorithmId": "8FCB454043869DF6BAF2C8FC94CE974A" + }, + "fixedInfoPartyU": { + "partyId": "1FF747ECD3196D0CFA6A206CDA6E490E" + }, + "fixedInfoPartyV": { + "partyId": "C2E283C6DEBE4200C56F3F64D5041C9A", + "ephemeralData": "F3411037EA451CACDD6C14FF09AA1E43910150EF8B091C1CD34FC07FCFB353F7540554" + }, + "dkm": "B218BB653E4DB2B55D95AA932569B084125215406E0908F4F3058E409B0A6CCCCE6E7496F44578A51C1CF76528B85E9A21B45D9C542BCEE082F1B4F237522643007AFDB5F9F69DD9FA69196DFDE840F83B026182EDD8669D25345F28D3A2AA29C3A412E26444B3C45417C5E315DF3BD36D9C1AF89AB50075097EF0C320915B07" + }, + { + "tcId": 3404, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A709F039E3A39A69ED88179F8276012", + "z": "89184A269F442611C6327DAFF33FC059123D583ECDE00E726A1A3085785ED268694E6D", + "l": 1024, + "algorithmId": "9ABEBFC3F752BAC6A3E3604A6CD15631" + }, + "fixedInfoPartyU": { + "partyId": "46FB6CC59066175EC7A2E8B3C7555574", + "ephemeralData": "99D9FE2AA500A2179895771E715F7602E95856F527437BEC5E6798A0EABA5B2E79168C" + }, + "fixedInfoPartyV": { + "partyId": "6E9A3ED3E2DB43811A276B9A185B9E33", + "ephemeralData": "17929107D8C4B29CDBF0444E964E40FB57F4AAA1EE34C198FDD322C5B65BA52D4F4412" + }, + "dkm": "7DE29724D084CAF8E2DF9A534FF5E19B1EBF279EBEECA6501B77210590D042C88A74EECC7675F7E3E76107ABA15708AEDCB49565DF2B3D922B08F7B810533AA9B7B81E5E09A92F06372555EE879F95643323F3C2D48E396D9AE93256F999A2A8880023790786793C65E9B03FD88F4F7E6814EB9C0253EC7B4055F5F3A94D50CF" + }, + { + "tcId": 3405, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34C1255BFB60AA59EFE91427D5EB0BE9", + "z": "C21F726063BF1F748B64016F63661D4D539CFF248B7B3AE98D20D7AF9100E3B41C076F", + "l": 1024, + "algorithmId": "785C9B2031543385BEBA7F1FE554EA84" + }, + "fixedInfoPartyU": { + "partyId": "FB3B1FDEB4FF8707FD3B7AE995A77E19", + "ephemeralData": "8DA3C3E355ADAF01E75C68E1D2690758A572B91A772CBD188F1C747FB3ADA4091674D2" + }, + "fixedInfoPartyV": { + "partyId": "249A885B4AE4AC5E7515F4D175B809FD", + "ephemeralData": "4DA78815798C11843574F3F164D3FD0011799E1955ABC7C6CFB2C548A034A168B7A396" + }, + "dkm": "23E235075A4A87AD8AF2934F62ED5A8B3281F3B4D985CD273C12E6F6F8377673741742FF6114546E38FBEBCA6F950FB7DABF0F32624A5AA9DB1045F6C8BAA5FC676D12FFEC497B9FC5A7B4C319588F32C3B3ACE95FCB990FC7C450D88600FA6E57D4991BE25162F2525907FEC44BE78213F27E1EF4EAFC7ABDF4D6BEE432BCE0" + }, + { + "tcId": 3406, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E1E1502499D025B24F14568EDD263DE1", + "z": "275921797553C57D8867A1E0314B0AEF5AB3A61D3016D5CB98A877DC55E8B6F5D10915", + "l": 1024, + "algorithmId": "8C6ABBC13D3B03CA9AEC96A33BB7B537" + }, + "fixedInfoPartyU": { + "partyId": "F2B3F49C7A49BDE66549E7F9D575E9B7", + "ephemeralData": "8304611288EBED57234BE5C00761DD313378EE7BA91F322316D8604F54F0D7CAD6F2F6" + }, + "fixedInfoPartyV": { + "partyId": "AEFE9F9EB341330F988621F8E05D822F" + }, + "dkm": "918A14B302157AA9F47A38B0582260B937E8CF33A07F6E20A2B5E762038B1A386E1F80FB6EC9431C7786DED6FDE0981C67312E58992EE6217BE9902BBAC7A02397F97973E171BD06AFD3FF4611BDE71B26202264792A7303524DB93295EF279A5CDFE3286890E78CD58F8ABC6C7CF7EAF49924E1EA42E49718464FA043C6CB5A" + }, + { + "tcId": 3407, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A5A8B3A7892CB30CAF32CA12CDCEAC2", + "z": "D36FC23C61F35D45080F32F192CA7DBFFDD1A9998398D0C95587EBC9F90989FE87F4A2", + "l": 1024, + "algorithmId": "A0078EB275F91CC89B6CF01038DA261D" + }, + "fixedInfoPartyU": { + "partyId": "CFF94897FA2AD7194112F1B9160906BD" + }, + "fixedInfoPartyV": { + "partyId": "61071826F76CB3007ACB9662D80D9A8E" + }, + "dkm": "73D1731C7E51A5BC8547F826C4472B5D2F626D3A03D59BD8A561CAE1B41B0F0E96F3578A7292244F2973951ACE8C75074B6CA4E9202DD16212FB0635E84BCF429DA8F42A10D6DB0772DF8F3AFCD4EFD682B9601FEBE75F9907C00407AA78BE3737E1D771C3B1FAC1738F476FC8BE367B366C2F5B6DF0D5B89921E3BA8E997C93" + }, + { + "tcId": 3408, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C11D71C367641D33612076E4BCADA99", + "z": "0A9FE507B516E52E291174B8959F46AB1C8A0F4884571C16BF3E65406449D6C369FE46", + "l": 1024, + "algorithmId": "75061C0F50ABF7DED14C5C6FFD4887BF" + }, + "fixedInfoPartyU": { + "partyId": "272DBC7C19FB482FE589754F9E43B210" + }, + "fixedInfoPartyV": { + "partyId": "7D30B7894F5B3620C44EB168A6C565BA" + }, + "dkm": "2BBF3CAD503E7EFA816119DC0EBD0EB056838A5998A661F643CA02E5AE10314905B7C372E2DFDD851E83B5C603E287F1BFD1E61137DEC41D846EBAE5094531F44523108CEA065EA81C5B5C96D3E349C064C91A216FCFC5FED4A22854DA7E16B850857AA237203C9071AB3859AD83273B9EEB249242C3EAF64A631574092EA128" + }, + { + "tcId": 3409, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E82526F899C91C4E38FCB9BA02C3F48C", + "z": "94B5EE3A12B9E5B507635034CE2B90371459770DF5C0A84975DC94EC20B6B15D328BD8", + "l": 1024, + "algorithmId": "A64EBFC46C9E13610B53AFD2559B4CED" + }, + "fixedInfoPartyU": { + "partyId": "22BC268E8FB243DD6DD7D4D6F5F08D39" + }, + "fixedInfoPartyV": { + "partyId": "F25B3BC9DA066AAF4D0DFDBDAC58ED12" + }, + "dkm": "2FE460D977D5EE7D921DA90D88243EC6103BF036A338E2465DB7DE3767F1C02C58A20233238665330E0D186950C9B8FBAA7443873A73F14F21E7647D32242E3F6AC85AD5A07F952344B5A30B2700F3843C52F1723437660744CEBD6A39D137AD876F6E4DD2887B9A9E71DF48C17B3BCD8547400EA621CC5146A098F2E34E8AC4" + }, + { + "tcId": 3410, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D292A20440AAD039EE0D5D6340911BCA", + "z": "AE6871417F8E981D76A60511ABCE2FD333F316CFE824F5EE1DD41EC58470803A6D881D", + "l": 1024, + "algorithmId": "CBC850BCCB3A03E483CF43EDAF95136F" + }, + "fixedInfoPartyU": { + "partyId": "2ADBE714F91F3F8E22CC965A4A8DE333" + }, + "fixedInfoPartyV": { + "partyId": "8D7DDB558F2C67F9DA345BDD4EA3BF6E" + }, + "dkm": "6772AED37D94428915B34DDACA920BE423D0290B1069EF51C653BBCDEE23EBF709495FAC6BF9B4EC5E7E69655570E52B41EBDC1B95C7D06E032991AF5843551666A68C977E64FEF5B61A0203A9FE8B10E8EEEA48F24231967BBD204EF48CC9F8723C416B4F3934B4BB5A7283E3D8B1FD99C0515A5FFA2F66B7C5FCA5789C3AD4" + }, + { + "tcId": 3411, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58FF4D3C1A47AC7EA48465CA442596EF", + "z": "F59324090C6E94D99D3A448CE7F06BC7D8CC1237C9F1ACC447BAE8DF76294AE920189A", + "l": 1024, + "algorithmId": "9DDB716E90EB23564889DB851CDEC9F1" + }, + "fixedInfoPartyU": { + "partyId": "080FE28DF8C01D0F5B451FC652F15155", + "ephemeralData": "949D6684F60F42846FD79426A7127A21E573FB199F3EAE7A4B9D8B10A59331AAEC3874" + }, + "fixedInfoPartyV": { + "partyId": "92DE20DE61E1F9813A424CBE244BA6EB" + }, + "dkm": "0F4B7DB127CD5A94118CCB6D2E9CBB951E9BACF6D5C5755DB8BAFC447022233D5A69291B7E6398F127F03F7B190D1195972BB491CA23AC2935D90250BF86F38F496164C6C7517AD3519F8C54D28BE9AD5BB8113885F08BDD3CA0DDA66CF95EFE87A58982FBD55CF9341A57005995C927B5B017DD27F95A502CD89FA8993BFB08" + }, + { + "tcId": 3412, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FFED2E687B486F90368F81EE07A01733", + "z": "00B7A85F4AB788F8515764973FEC3EEACAD632393C143CCE18EFF04672F94ADCA22F0F", + "l": 1024, + "algorithmId": "9F04EF120FB7968DB333D067E18DF418" + }, + "fixedInfoPartyU": { + "partyId": "490F327CF9C169FE1759A43A55284DE2", + "ephemeralData": "FBB96E78C5D45DA22D40D4E445908109EB59148525B9A538BD79A8F3770BF023C00263" + }, + "fixedInfoPartyV": { + "partyId": "68749CAF59DF9C2B9262B041F2DCF6A5", + "ephemeralData": "55EC6CE9067DE7F5481AFE1F58AA67378F7FBEEBCA44B4D395D4DDAF4FDBBDD30F4023" + }, + "dkm": "96A2A246BAE457349AA30F5CD0E6C5A1C63671F35673E553D3C2F7CA3AB838705571EAF14DDD083E3269A86BF7F36280AAB7C6FA2A4687C78A7465F6A8FBAD710A3ECB0840FDAE2345CD6490376D1805231E795AAD5D94CECBF1A243422F72BA10D35AFDD317291ED769D3D0C40FFD71DDCD8CC8438C1284CDD01856DC668119" + }, + { + "tcId": 3413, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E4E70840D2909D649F677FF5140DFC2", + "z": "F498B4E2D728B0E0B8A8CCF3D1D6E25BC2EF8943EA4811B3250841E8F01C7EA29FC5C5", + "l": 1024, + "algorithmId": "9DCF23E8BA0603535B36D9E98FF1C36B" + }, + "fixedInfoPartyU": { + "partyId": "83E51E8E374352F70F58EEA51E2C8423", + "ephemeralData": "3441A4CBC12A7089A1DAC68A6C1DD05DBFC65479FE433119370F63D6D5ABF3EF8CF3AD" + }, + "fixedInfoPartyV": { + "partyId": "39BE440FC6F620DE424857D82F050BC0" + }, + "dkm": "0810A6CE65FB5956EBBA97B287F8F7760866C3786E56D34FAE87245511BD33D50DF074ECDB6C056E0D82B4D3E9FF1CC5A2DB0316C353BA9A27502D62CF3E638CA179F63E655368B15CC72512BC54183087F6DE58611D76B48A54C5F457A7CDD18B0F1267FC82B4F40476B00E500A2A743C862F814DA5D35110EB459A3E242B48" + }, + { + "tcId": 3414, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8DDEF3EF26D9BC679AB44EF0C2A271B", + "z": "19E51D22AA320D9B086F02B46E1FDE5C3067DE84C7B19BA78DB4453880500F847A8167", + "l": 1024, + "algorithmId": "A6516E6881AEFB11E9247B37CFE8ADF8" + }, + "fixedInfoPartyU": { + "partyId": "13E8D415DE03B73AC6F2A6CB96CCF3E6", + "ephemeralData": "63D21E25C7F390FEFC3458ECB665D01191E097B58A6B0A122AE447A082C61247E981BE" + }, + "fixedInfoPartyV": { + "partyId": "7D28794C30B3C7C184F6492CD4D2FC9C", + "ephemeralData": "CDD3766784B004A524F4E1D9C7640CC5B8EE0737F4051D530F84C9DEEEFDCA59070157" + }, + "dkm": "A175D3EE8FA8A5C68932DABC1DE2BECBF8F3681EB62006CB88A2BEA7B99AA03BEE96E60519B546E1DE8018A2E4FA8FAA1ED04340B32F625B39617FA51B8BAB547983DE866A45E9EBF45037AB54D263E1A7F7470832501E037399B6ABE04BA57A467AF88431519E3AFA58EB01E85B7C88E1DA91106A3A8EE1CDB67DEA44579516" + }, + { + "tcId": 3415, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F5461BC79B64B9462A32CE2456153385", + "z": "911D8FB0C8468900844739E8CA7BF3A815E0965E2CA62504A80959F334E93CB3A02457", + "l": 1024, + "algorithmId": "76A2F2D4E279A5C72A23B148EF491C4C" + }, + "fixedInfoPartyU": { + "partyId": "2A20E8841A4175032BE4131248D01F79" + }, + "fixedInfoPartyV": { + "partyId": "8B91ACBDA2E48FCA0FE754FD68DC49CC" + }, + "dkm": "C681813A879349D3B5ACBAD98B018D23C4889EC1E99D0200C33E5816EA8169DC04223A266B9148C1D00106AFC1DF83EE721ED52E2E85762B24A7B2F70623807507F32FFF80960C7862DBDE3891D315B32357295F6818AB3A88F29CEE3E17F2744343F34DB7912227C9747C1AE5412F5E4C8ADEFF11BC2136FFAEB66E719000FD" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 162, + "testType": "VAL", + "tests": [ + { + "tcId": 3416, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D7A8EEFE8FAC9782F7C92F0256E5B73", + "z": "AD676C48CB51A4782CBE0BC1A52ED53EFBE3F60156B22BA0A7A9407A", + "l": 1024, + "algorithmId": "C62D5F11583C9B8E35CE6387E6823594" + }, + "fixedInfoPartyU": { + "partyId": "554BDB64D30D0E4EC667BE21FF46E569" + }, + "fixedInfoPartyV": { + "partyId": "3266650E4C8FE76AE3513FECECA8351F", + "ephemeralData": "D7D7B61BF4A57CD2C51D99BDA816BAABD7909ABE16693A3B4E53F429" + }, + "dkm": "D56181C060A8735170B0FCE9F1E7EEC74D4CDD88E47E9A5D1484BCD70DE389163C6D1E07AA45488BE75F71FA5263B03D87BC60DF129927EFBEDA7BAC366DDC24487EBB5D8A0433D727B6250E98D6E21E19B4855A49FB1D38BFF4AB137AB268CE0BB2E9B5794BAB3476BB1F3B81802BD3D19106A2020D4FC2AA738C4621C36854" + }, + { + "tcId": 3417, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FEDF3774B7B2D4100C5C45B90D2FA60A", + "z": "2CC9548C9FBE40F4F04EE585CB1A25A0FE01423BA96CEE6092C6BC22", + "l": 1024, + "algorithmId": "6867EDC700F01D02ED3A8300DA60E9E4" + }, + "fixedInfoPartyU": { + "partyId": "76D1863A1B07D4260ADDF23ECA7883D1", + "ephemeralData": "DDB1A41047AEBF36CAB8D740240C0627FEE20AEEE88F32E6B9EB6B5E" + }, + "fixedInfoPartyV": { + "partyId": "E750E1E951EA72DEE82D5B476E6DB633", + "ephemeralData": "ECCD4623D9CCB6739C38B5B18042A8A3BD9E0DAC19AFF9F6FBCDFF0B" + }, + "dkm": "A38E0BCB2E81C50DC17EA6C22DCA2E8F19DBA3F3DCA9EF271BDB0111525DFC4D9FE3E6EC0E3BC90486BB045AA789E9B78D0C53B021C933F765DA94235F447C8BA8F24D20805053BF685A4FDE7D0524DFBCBC6FAACEACDEEADECAF1B8E425C2C0FE371BD5CC1007701FC623E4668D7C9B63F43FA43F27CBA70BAEE03A8AC51E01" + }, + { + "tcId": 3418, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28AEC2D06D448056483626D0F8564F8F", + "z": "D324CF7F9A7A3ED70DA8CA7E20D2F066A64624034C5F20149732E770", + "l": 1024, + "algorithmId": "CB4B86F722DDB7399C5DE8537A18B5C0" + }, + "fixedInfoPartyU": { + "partyId": "ACF509F06EB6B45310B1B40877CBEFA4", + "ephemeralData": "13CACCC13EB19DCF5813A88BFC4418976C3151A11906EE23AD65E290" + }, + "fixedInfoPartyV": { + "partyId": "63675DC5018026BEEDEEBBCE49CD1C3A" + }, + "dkm": "63F4A0E3B8454E0A4F63A2A87BE5895165CEC51FA170F354C9A1C5A1CE307FB795039B5D021EA025E1F48142EF54BE39FD2BCEA8EDED8872F590660B7CB80800182A838023964870923478C727F711C335CA163589593E7D20957799E0B60FC00388B9FE01B048CD88B90BF6CD5DF7BEE9885BEC6A2F4A213544C8850D117AD9" + }, + { + "tcId": 3419, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09C448EF8499A691CEC5DA698F196841", + "z": "5FD39912959C82A5FC3EDA8BD3CFF520F2B4931ACB4F46C93B0BFE13", + "l": 1024, + "algorithmId": "14B5E3CFF8404B2AC2E497056568D870" + }, + "fixedInfoPartyU": { + "partyId": "D6744E19FA4A79D7D1E53786E2D260FD" + }, + "fixedInfoPartyV": { + "partyId": "72302975619163C80914F9C6D79BAED3" + }, + "dkm": "6635C90CA09DC4EC25EFA625C2BD4B88FD4A829CF9DCA2F75D6E5FAAEA16B031E0E7D2D4D126586A38387334B37190242488B31C61FE7F3A21E4188C856E00D568D5420588BC458263E55C0B425B5D9CB03898DADD603A5551BA095579939B4312EECE5C379A0849753DCA2EE9B3F1E378ABC530EF66DD4A5CA59C275CAA4155" + }, + { + "tcId": 3420, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A834A046618E87CFE66899470ABB1A0", + "z": "D5E64576DEB9BFF92ACE2A5A17769C2CDA33C1D9F0574F09B824663B", + "l": 1024, + "algorithmId": "E1843F2B33900FB2AD4433BE6243DD67" + }, + "fixedInfoPartyU": { + "partyId": "D396BA5951D8CB1AC4F8058C67A9DE1A", + "ephemeralData": "528FFDB2A4264ECB17FAD68169C44246AD7B90597BD90B0171DFD18C" + }, + "fixedInfoPartyV": { + "partyId": "7532EBCFD318630673EA89E5283ED07D" + }, + "dkm": "978175880F4B53F5974784460FC48BA6410BAC498CB1195A8EA10B9EEA041DB66C7BC1F42F70BE00D4266A68CBAF38E91876900FBE952F379F44B4B97CE1C6BFF1653BFE7A4B08ED52EFC5B365A0EC8ECCA08D8C9CA108F11885D8E2D4384A27E00CAA645A71102A7AE7AB43E0D8886CD86590A123740E62800DFEB7AC2D668C" + }, + { + "tcId": 3421, + "kdfParameter": { + "kdfType": "oneStep", + "t": "459371C7D4C25296DC6995AFA7274840", + "z": "E44A9BDAEDB0B21A3FEB4D60111B2EE506BE2096F4CB467CFC28D06C", + "l": 1024, + "algorithmId": "8B1AD9167245CBC285126437E1784482" + }, + "fixedInfoPartyU": { + "partyId": "8E11327DF90F1EB14506003751BE3DA2" + }, + "fixedInfoPartyV": { + "partyId": "FBE1213B1FB92A53857974B03768F762" + }, + "dkm": "EAA6CC6E9591F399A1D95B8C94BC3EBA28ED41F015FDDCC116A980609DA94AAB6FBCBACE799318F15B06F0D98C04080C64E1DD91C35CCB48E6794C691CDE9224EBB1C7D9148CFBBBACBF5C44E9E711335D63AEFAAC069304F4913A4ECC1F60E383F7A799A93F969871EDB9280B64FC208A6BD46B0501D5A35B2495050CFFC645" + }, + { + "tcId": 3422, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F946B0DAFE400DFB9A306599564E8B6B", + "z": "EA01E2B85B443F09683B5D7738EAAEF6CD01E62D6C61DA7A80259843", + "l": 1024, + "algorithmId": "FCD1E85D42CA8072F3A99DF8FC7DE8C0" + }, + "fixedInfoPartyU": { + "partyId": "B329E22A918150C3C5FED039C119AB5C", + "ephemeralData": "DB277524AF259340CD810F76D997C8CA5404F0DE757C8608234DA462" + }, + "fixedInfoPartyV": { + "partyId": "E05B4B9C2453C7B43E55F79015273EA9", + "ephemeralData": "BBAF245872D2C3EEC9A0CBA05F93FE9D7FCF23E6A7D2B3B8EA88F971" + }, + "dkm": "77CEBDA9B8F163269A60C6A79E8D9FEEDC5744359687B07A37A24BE7ABEA930DFFA0E04EECBF9C8415335D7569E8D46352129A32CFC6FBFFA8F1FD182749741E46A4D0CFBC9727E8B3495098DA3FE38ED25178D9D826F8F87F840D6618EC961A04289C31344FB1C37FAFA132391ED7EBA7385598093693D7E6A8497A406A8FA5" + }, + { + "tcId": 3423, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9878970ADD6FFF47E5A20A624072F743", + "z": "5EBD70F4188B18293026DC00E4DE621B59D0DC60F996926EC79103E2", + "l": 1024, + "algorithmId": "7354D18088726867DC2C745E05559723" + }, + "fixedInfoPartyU": { + "partyId": "86DF7960B0058D407CA6DAF0CFD24F04" + }, + "fixedInfoPartyV": { + "partyId": "D5FED37878C96F48702DDD8B21E4C949" + }, + "dkm": "00A1600EC64E0457AA4E5A07D96D7FF1BD586979BCA23E13EA5AD5815700DB8AEE2EEDBBD182C01DE13632FB5F3DA24B4FC30AE4DE24F3EF8E957B6CAC01B24948E294469ECE8D798858CE7C0B569FF367695DFB2E1F8A04979F4B7FC1FF9584F133CF8FD1A6007E88357328156A470F1E4B29BEF68814EB9ACAEBE8DC50BB0A" + }, + { + "tcId": 3424, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD22FFC4474BFA598D2FD8F1A580B851", + "z": "80FC3AC126E372923FCFF2DC8E88C1CA1AF234CF7BEF6D461ECB9BD1", + "l": 1024, + "algorithmId": "C22FD162338502D131570F7B56C7F1FE" + }, + "fixedInfoPartyU": { + "partyId": "BCD504C9E37B1106C761A8DFD16C0FC4", + "ephemeralData": "76CB87C15F213A20C8BFB76E700C5CA4B85E4AE330D26ABC7298C215" + }, + "fixedInfoPartyV": { + "partyId": "5EFCA09AA4070E6377AC40269D8D75EB", + "ephemeralData": "AF600C95B06491C1BC6E445B9F34B139A1DAC5F3164D5A726FB4610E" + }, + "dkm": "E50110588F426FC416D45084CC90A0FB1B2271EA1281A8AC7B62F689D1483D28DF9FFFD3C2EBEFC9A4BD18939DDB4274F25BB3AAFB0A426EF6620986E5CB9F2F215B44D3025253AF254B2672619C654E8D0662BF94DB4695F2DA736611F56DF6B28A18ACDB5D2AF0E9D4DF6B48102826B05C85B614A139A7C928E4CF17E087CE" + }, + { + "tcId": 3425, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FFC701A924E5A9A4A67DDE4455805BD", + "z": "68F2163DDC979FECACD9FD921CCDB34FCD2CF4D5D6DC5B3A7A7CFE4A", + "l": 1024, + "algorithmId": "DE6ED4089111C3609C622BC38D60A5B9" + }, + "fixedInfoPartyU": { + "partyId": "F06F822861A4F357094781C7EF82CFDC", + "ephemeralData": "589FC5C36BCD063C7206FA7369233CA066AAA34F961DFF328DE7FA99" + }, + "fixedInfoPartyV": { + "partyId": "DE785864CFAADB0B1BA42BA7306A8478", + "ephemeralData": "4F975E079875BE7A38CB1EC4606CC97B2C93747D6987B4F880B6B6A3" + }, + "dkm": "7BD45B038396ED79AADFF5106921A5D78AE328E21ED1370BA7958008218505E3B2F8409FAADB2E56910BBA8643BFF73A0E9E08AF5C3E427E19045014B82AB19A3E382BBC8F47E415FB8A39FE573366939B5AB898B926190A4B4643EC173E2BFD2BA7147ECC7AD0B2742D3CD910C11BF52E188B84CB4E3A3C5634B895F8B69765" + }, + { + "tcId": 3426, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32F35D7BA28DD975EC898B755BCDFD76", + "z": "EADC510437461E4342B543CEA75F3636305B4FB5AC56B4185B809700", + "l": 1024, + "algorithmId": "F49061AF68C16B62F2A498C4523D8DC3" + }, + "fixedInfoPartyU": { + "partyId": "26A520A7C2DC34E018688E770476010A", + "ephemeralData": "6799C647CEA7B857D8B4A26CD7C7574850E2EFB1A737D4E6793EB559" + }, + "fixedInfoPartyV": { + "partyId": "9FC65C3F2C23709E9BAA082078229BF3", + "ephemeralData": "7EFB392BAC403069CC16B4CF3A20326F0DA1D84DF17E3BEB14DC98C7" + }, + "dkm": "F1FEB7AE44D3E28FB00C08A4F2451FB5B099E6A5DA70B3E64E4A7D13DA90B78E2A5CE8450F9D37332E92E4E7A0EFE9114D9EA6FB44E23B7C3C8BCD27382191FB2EC994F3AABA16812180B7E0BF0D5534638276D3042C7544692363873BA99D1DC91EEA11657184D3BABA5A5AE9D1FD8AB9561D3B545F2BDC55C6B851D87308C6" + }, + { + "tcId": 3427, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDDEAF4A32A52883DC5F725A8A1F377C", + "z": "C0FD5FA7AB24FED4E021EFA8C40D4AAE98218163806C86BA8E7608D2", + "l": 1024, + "algorithmId": "000FB3A42E8DFA7FEAFB4BE8813C071E" + }, + "fixedInfoPartyU": { + "partyId": "D8269FCAF645813D9C5B901BCFA0C8A6" + }, + "fixedInfoPartyV": { + "partyId": "885BE6CAE4D428FD8D5A89E01A382EC6" + }, + "dkm": "7ADB00CD5D478C4CE97C42FB1B7E6C8993CB02BA0B456246A04E655C7CA95BBF2418DFFA65195989059722CCB83BF772505AFDCC01CAEAD3292ADC58C9D0775F7F799AEE934F71F4C9D696A00F407511E1AC2310B33EDEA26E6F4160723C9FA7AD36DD116E5BE0EE793532F8199657F7A8AEFA75B99A5DA6FFFF3853141D7B26" + }, + { + "tcId": 3428, + "kdfParameter": { + "kdfType": "oneStep", + "t": "806C87DCB2B67A8D93C52EDC8D3F8D19", + "z": "73634F11881259ED2E0F934F50043AEDAA0E834BADADEE896A41B959", + "l": 1024, + "algorithmId": "3DDD89FE5A51260A452826EEF0E3D7B7" + }, + "fixedInfoPartyU": { + "partyId": "594192DF2BB472484400D1BA82687570" + }, + "fixedInfoPartyV": { + "partyId": "8A3A59B8A700923E784963657652A61A", + "ephemeralData": "003E7B0A1F120AFD10A8F668B8175A4EE3DEDD08BF391CF08B1AD53C" + }, + "dkm": "0497A311B5BCF6FC4F8215FF24218999A5ACCF67176159DDC67D8F465881A4051C471BB578A494C3A2D7F59B024A7B6643501A0F9E1432E6DBF225D7D681415BB0D8CA7D882AC8BA86A64D13C32A12A647548732822E9788AC73E5E3665CE9FCFCF1BF91948EF127FA4D9810ADB7BCD12B8147F5AFE9F25D5E40A283DD157F46" + }, + { + "tcId": 3429, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11668AF3A16F38354562CC6AA91961E6", + "z": "B65368A75E055D57B5B3A5DA6944B48AD89C5622342D8A505AE3AE9C", + "l": 1024, + "algorithmId": "5A8750D86B15CB8579269DEF89AE0A2A" + }, + "fixedInfoPartyU": { + "partyId": "1386E4335C092D6C29CE0365FA86852E", + "ephemeralData": "9BACFC1AE58673A1D09D057736E7B285A83FB9B0D74EC705F480BB89" + }, + "fixedInfoPartyV": { + "partyId": "4AB42338BD29C1D2AD1E2EF2D6738157", + "ephemeralData": "DCB563399356B668462F7FB21A08DA9A34158E43E9DFBC26217AE781" + }, + "dkm": "5C8B88CC01E6D2C013AD6EED1BC04DBF8F6286AAD19C6A55D6C4E445F1FF2ED359EC59BEC48FDBF87A77E73E4623A9B2D22E72E76DD6A10C59929A4CD15E7B12015A71D152D94447899D5386DEE7E7B0995E9581A9D3C781854624BC0EB8322388FBD215302398E3C3FEA098843DD5FE016F2547FF84314C31F86D4EBBEAC5EA" + }, + { + "tcId": 3430, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CBD41677591D9915C2D67CBC19BAB921", + "z": "8199A2B7A4F2892939E905E37677988833E3F5488374C759030BEDD2", + "l": 1024, + "algorithmId": "C551E01BCCBE326136347E571DDF9EE2" + }, + "fixedInfoPartyU": { + "partyId": "22E06761B955CAB3B70AF25E4BBFDB61", + "ephemeralData": "9E0C7924C14ECA9DDA5DF2995F52BEC6E585CE2EB08282F0BD4A81AD" + }, + "fixedInfoPartyV": { + "partyId": "23309A3C597000BD9A1AD35B5C9544AB" + }, + "dkm": "D2E3F6436A6C561C32B0B057C18D45AFA5E52F9CE749E0304449E11E69EC2B65CF9441EB9EA2687424DFCB7ED6ADCB0DDBD7DF8513BB11690201AB69D120EE784743932E8468118A15C53A7C66ED7AAA5EF0C924C11A351AF50F087129A5FC0CD47B28687D48D898657E1B56A68CB6DF9B30C6BF55690BBDB5124B4123344162" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 163, + "testType": "VAL", + "tests": [ + { + "tcId": 3431, + "kdfParameter": { + "kdfType": "oneStep", + "t": "704DCF60C1452032102A5D672ACC1526", + "z": "958C1E273E89CA497A7BD54B47103E800CC7DA1EA225A0B5C3A6E1C82F6C34BCE02D7764BB", + "l": 1024, + "algorithmId": "41480DF1DA988C592A0ABF9C075B716D" + }, + "fixedInfoPartyU": { + "partyId": "F4411F1F807C4D837B9FFB60E16A601A" + }, + "fixedInfoPartyV": { + "partyId": "13979B6757FDE6F2B8E795E667253B63", + "ephemeralData": "8482968F6CE5B11B23A1146E2983CA332E67E3C3B895892A5AFB58FEC3959F85ACE670BE88" + }, + "dkm": "8A3397F4B5B18E0794CB52BD0EE1841D8364997FA5BA67ECC6D2FC96F63FDB6BBC19E368957F51BDE02A1DAF9576DF0A84B189B51B34DC34F3E02AA2516805779F40AB27B8256539A470F1943DE4D02AF602927EA91C1E7F5913692004C6DCDAA63981829DF70E359731A0FC104A3B7FD5CECEC1329057F9D75D9EBD1294BA64" + }, + { + "tcId": 3432, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BD625B0619D9B2598B17B67D1930249", + "z": "C0A73408FB683AD20750E829CC4A91EAE0F48A223F2EF558217676347A06134CA2C6B7B081", + "l": 1024, + "algorithmId": "09797757B653D18DEA34A5EB0EC27DC5" + }, + "fixedInfoPartyU": { + "partyId": "9A8D226FA5CD773A0432568DEEFC66B3", + "ephemeralData": "889D9D1ACEACB098AB1BB291455E9453068DBC8C6E4E23197B0DFAA8FEC36379FA6D1E976A" + }, + "fixedInfoPartyV": { + "partyId": "D0950156AA5EBFF738AD8E2B99EDB853" + }, + "dkm": "46774BCB6A3BAB6A2A5CC6DFC0EF9C8DDD675C44FF9C4C12830D5E070C13726B964EADAB7BE5DDE57CE7E19892D27963050BA566E88D98A08F43C318B0EA7FF007E9FBA5B146A080226EE9B1412D1D32147A26E91A129CB4024D6C93493AA793275DCB69EE5C8C126C0C18E3D9DF3A0DE0F03B8DB64FB08C833FA277EDD02CBC" + }, + { + "tcId": 3433, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A7CAA335DD21C603CBC6F8B4504B6A4", + "z": "A48451FA2120EDF1E4459304C0BE51FD97AF902F11798492F92809D71D0FB5CA843247F292", + "l": 1024, + "algorithmId": "87B2EB77E3149DCB204FB662F3417C2D" + }, + "fixedInfoPartyU": { + "partyId": "19034C5898CD439365B328F401D9037F", + "ephemeralData": "E3BC775406E9A58BACC5C12C599DD4A3ADB72C91D5FF40FF06E9EA2B2B6F377F7289A09483" + }, + "fixedInfoPartyV": { + "partyId": "D7BA82998C448C7BC9FCC891A1830D1B" + }, + "dkm": "C0133D92E1852C9778856FC5AB90191C73CB307B27FFED76EF6AC2E50FD06CA2D7580C898A6839789E6326292EE4F0C9DC4CF4CA38B6D0FA318BCD24E7602CD548124622E82301014DD6A6ABC5FA28874579F701977AA72320D00E95DD9667DCC23820FE9F5BBAF187E02F30F68B9C533D109B26EE04705D72F11CC3E96D0E43" + }, + { + "tcId": 3434, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ABD3A031B44FBA2A62671D99403781E7", + "z": "FBAEC6AA281EAFD4D1DAF94DA09AE6A987DF58D6C0FE8513B18942A8847CF360A60DCE0244", + "l": 1024, + "algorithmId": "DBB8CAB10B55FCBFE088209524B008B8" + }, + "fixedInfoPartyU": { + "partyId": "485AF3513517B1DEDAF0BBBB8D8734AB" + }, + "fixedInfoPartyV": { + "partyId": "D74C076023F9B0AB1966586D331C9A23" + }, + "dkm": "4AFD8E4F7CCC39012DA19645C6027977764742F06D97FDD3C814A1B82C7F9F1158EDA17C0234B2318FBBFFC83BADB76F8D615B0CDD30FD29504FA8E849F2779A4DC1E8178E52CC13C14F05D3F01E5022F629ECD28786DC347ACCA257CC6397A0A494206E15BBF8179085BC9DA407F8ABEE8BB841D62CA5D809B6BEAAAF77FD37" + }, + { + "tcId": 3435, + "kdfParameter": { + "kdfType": "oneStep", + "t": "762F2FF1C6D85C6F4E6061D911B8FEE9", + "z": "0FD89416A2C04D5297AC2B5A501660A63B5D9BC330E839323A716C9E2A0644405987590333", + "l": 1024, + "algorithmId": "F1AF68DCC88DD2F03E1870099AA9B178" + }, + "fixedInfoPartyU": { + "partyId": "942D96F0233C14EFF53AE6B1BAA89827" + }, + "fixedInfoPartyV": { + "partyId": "609D23CEAB51D86F9815FF3742A38D3A", + "ephemeralData": "A2018E16C29EF12049E90E42229298F0CC3407DBD02B1FBBA788EE45612125BF89A3F22B08" + }, + "dkm": "6EC5796125EDF3BECF1EF304844FD49E0D24334C6B2B160BC7DF4872C42218705C8636E771FC20AC569D6DC445B08CCA90319D335B5F10884795AEA77FE1A3DB942C1895D01F1AE9B0DA0C3B4559C93106F5E325DD0DB8804C857D9FABA772FC27B346071EBBEC0E0CB64E6EDF9E14B9EB03267363A8EF79E829572B232A315E" + }, + { + "tcId": 3436, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9417B9C2B78A65EFE81F1CB324FF3403", + "z": "CB88E2A90530E32627BF77312F2F4BC601CDE6C72F2123EDB4B75F259DA97EBA2AA995413C", + "l": 1024, + "algorithmId": "A0AA61CA1E3E1CEAA5DEB12467194F4B" + }, + "fixedInfoPartyU": { + "partyId": "D3FB876842023368BC8E8655B6487600", + "ephemeralData": "926C16BB5DE79EBE7D75FDC672BD40AC179E502F559B0B0BB22E427782BF43F87A65F67593" + }, + "fixedInfoPartyV": { + "partyId": "AA5813A6F728B68D4B0FD2F7057D8666", + "ephemeralData": "362F88283D45AAD67DD510E47130D92098D3A9EF089EF5F6D15AD8C442CEFBB3F23935E632" + }, + "dkm": "E6253F4E46874328F5FE0B207D43B9C39E7136741D30618BA2E0E83427804ED793F2F1781DBC99115FA334839E746A69265EC079BE540FC37F70CEEE09CD7EC2B29A55D6B9D41AEE6D913D4E0C56F30C966225EE9536D4863330F519F3FC0D3D3497E6A08E1E70613638B0E3CEAA3ACF531FAA37201370797A8AC2F96280BE16" + }, + { + "tcId": 3437, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A3895971D52EC39D5B38520683201FB", + "z": "0472F19598355AB4451DD56871A2976661F03D713A1632C276AFB1D0AE44702F3AA77C5163", + "l": 1024, + "algorithmId": "6C8C81C354BFD0CAF2D197090E3D2527" + }, + "fixedInfoPartyU": { + "partyId": "5725E33CB9765E04D450BAED90CB31E4" + }, + "fixedInfoPartyV": { + "partyId": "C0D1E0167B75F9FF525AD236D9BAFDC8", + "ephemeralData": "E6E58D2BF8A57DED58DBC0ED3E715FAD2BB8F4CD50DD35D008645E096DCE46AB745F714055" + }, + "dkm": "EA9B87ABC8FDA2E30904A867EE93D2F33C2FD3C012E5094F766971807B0D48CAD1982CC967066BC93B76EA3A0CF4BA418E43188458D3799A4030FD713E69CE74E299A94DED09975E63153063A80DE4E3F48A1E46FBEBD4159A6B7E45D1E419AA4B7F5A8955A3EE590F3E0F08E487BF7EEEC8683DA1D6FA88B03BC4FEA4E5C42C" + }, + { + "tcId": 3438, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71CFEBB51B0A09BF94963AD06FD5A9F2", + "z": "B6E24FB2B9CF617E33E02805DAB8CCE45316B1A54895930C2007F987C1948278B6377F6AE9", + "l": 1024, + "algorithmId": "6B112B65ABDBA78EC33D716C69FF0876" + }, + "fixedInfoPartyU": { + "partyId": "56F4A2D1F5B39397CDBAE542877076A0", + "ephemeralData": "789EA0AF4D197F966DF6D6DB6E5C7E651F244BD7F0B0989626C909682BBED88AFEA6EBD4C9" + }, + "fixedInfoPartyV": { + "partyId": "A8CAE1441BFD7003B07D17C997EBA2A2", + "ephemeralData": "483CA71B70B4B528DBD96A6AAB014D568C5F354D38FAF5767CEFE89551E1B323378F556408" + }, + "dkm": "3E30C63FC0BB125C13FA077C46DF1AEA64ABF0322E69AD5D8ED8CE1F7C68243DB987C15B6690C23B1F28E3FED9373570AEE74EC7297AC41D0994D173C5A017286C4D61610EDC5C78D2A8B7E5D23B6982654C421040BB4D40D3A7507385FFE63B2DB050D245E83460B6856E945B3E02916B18685F2AA480D501F29EC901550E8D" + }, + { + "tcId": 3439, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B07CDA15F82920DBB2C5AD5A882D066", + "z": "F4F4BC82ED00BD6EB5B2A31E5DCB79FDFE4972CE1023124AA03BB540E6BC9ED01F01064536", + "l": 1024, + "algorithmId": "1A64FB3AF3BEF5CE5ECD3744B1DA8926" + }, + "fixedInfoPartyU": { + "partyId": "5AD24E5F80C31BF0A495C1C63195FA63" + }, + "fixedInfoPartyV": { + "partyId": "1D8E1D4EB4827806EB2C01A33BCB393D" + }, + "dkm": "F2869F426C7C1BBD313DC6CA6EFCF143AA10E4460E6F8E284B514A5B68239F1BB0972C1F0FC2603795FBFA623CACE66D47099822F930432780ADA6627B4CC6153131D6F7BACA5F7E63D59EE3A272C9451A4003A86FC2265D4EE80169B1712C8BF81003A42C34C25311796BD76AF8E3A5E864B972864EA6EF7057CD8DAED93220" + }, + { + "tcId": 3440, + "kdfParameter": { + "kdfType": "oneStep", + "t": "74938EB610135C201A43A88FF65C7A19", + "z": "C8726C6A3602FFAF5DAC0C39B0918B205E84A0391D67575BF265DDD6483DF4849465E5E5FE", + "l": 1024, + "algorithmId": "F9AEAE576BDFC990B5C070092D54F439" + }, + "fixedInfoPartyU": { + "partyId": "ED7CF3AC04C527DDCAB9AE1F85956448", + "ephemeralData": "188E53271582BBB0A84612D3C6D2723EFE0BD4D59EE5EF882FDBD698E047785AB55459DD16" + }, + "fixedInfoPartyV": { + "partyId": "A81E0D1FD59FAEEFE2153E3D1C099374" + }, + "dkm": "97D75A6E1797EB18549876860D1D1ADFE60885BD8B06B9AF21D238174368F1FFA9A04AAA9EAA204DC23B64AB3C2E57E93053528D08327A8F05854413933EB09E4656CA8061A9E0ABFE31B453314FDC66DEF00FEF5789C3CF1E41221FE2CA982EEAF33FFEA2410F2D72913F1685E1E909E16F23DC3457016B52798EBEF6657139" + }, + { + "tcId": 3441, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01033DA91B3EE7F8403427A55EF3904B", + "z": "125AF2FD04EDF424BF624A4DF316227CA581A090E82B8DFE9BB3528DA25EFB6CFC0B825156", + "l": 1024, + "algorithmId": "82A587AC58105AC756510A3340596604" + }, + "fixedInfoPartyU": { + "partyId": "98ACA7BDE9A4F7970E44478B3F004C6D", + "ephemeralData": "C294AC48F1008E0E62A3219ACE847D12B7A3B006A3ABBF39478DB3E09C04021D06CB90FF63" + }, + "fixedInfoPartyV": { + "partyId": "FBA1193DE4BE4F819166EF3AFE2F6612" + }, + "dkm": "B34AACB28C82E8AE897EA09B8E04E3C18CE32FA5216D455D29A8917E2CB701B48A48074F245EA59A4D3C89C113AF7ECBAC591F5B162FB589BC2B32BF16E0586574DD3DC417E1D1381B729E724E69FDB092F3C96860A4779C93C4B5657A3C8E965F1E1594B308374A40A0508C7E9AC0547F34DE80E75392310C0F2D0F1DA5605B" + }, + { + "tcId": 3442, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A458A5CE34D23960FEB79AB0EDEB07B", + "z": "A0C8E5B02DB5E4464C79EC609B1030BC28AC27B47045B5FB084151219F0B880A04DA317BE7", + "l": 1024, + "algorithmId": "1E63D143CD3B7340412A9A9C826F868A" + }, + "fixedInfoPartyU": { + "partyId": "62A773086D9B06A928896ED227701A89" + }, + "fixedInfoPartyV": { + "partyId": "ED1557149B3D58BE0F1EA43E204A2B61", + "ephemeralData": "AA0D8C628085AE958D4B15141752754A7F7DBA4F94533DD3440B5159F1E8A74D5585B79AE7" + }, + "dkm": "D4D35FB53DD1422703F2BB44F8F02D39859365FEF807B086BC30C110DC194E1F4095CCD15BE95EB7CFB5CC935CFABD96957E704FDE026BFA854FB57800D07434E843DC7C7F147AECE16116606F4F951E3C391D32F043407260F1E97B983A89371F32E8C6F840F260E21B9BC5ADEFB9B455124A11AC7A43174194B786344D423E" + }, + { + "tcId": 3443, + "kdfParameter": { + "kdfType": "oneStep", + "t": "162F455997BFE9A4B718AB97CC7F1E9A", + "z": "D1419155D31FBB34BF2FE4056DC2ED2557176C0D5BEE35226D9EA0F83A6C86B64CB689F9CF", + "l": 1024, + "algorithmId": "1A5E5A3B616C036514CB7F1889BC866E" + }, + "fixedInfoPartyU": { + "partyId": "D94B3BD0B38149790A9F911297E3CDA7" + }, + "fixedInfoPartyV": { + "partyId": "F39017CB813C06AC56D14749C70CA9BF", + "ephemeralData": "500A87B3BFF132AE89628A654012865E0935E895BB466FF8EE7B62BBF4B74E93447F8840B4" + }, + "dkm": "09CE150EC53DCDD78B12E5223899BA5135F5FF96E18A6C4EB19A40DA65729EAE0B21A607FE336311D83B6A7C009DB3F864A4959B8AFC514A5524C7169F88C5B200F9FEE2E030248F1BFAFC611C334AD8C1336CBCA8B24A9045DA0CA41D222B52F3EA7A6F213DB94E370A9BBB7F7540C3CE62392DB3259401E8B5D8E6C644C678" + }, + { + "tcId": 3444, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08C1CDC32324F6FCCD52BE2770362DA3", + "z": "13D56E3FA8D4B0247A3B1A8FD91CBED4663394A20224DEEBD5FFAE1FBA8838B42B9ABAAFCE", + "l": 1024, + "algorithmId": "65DACE843C4869A174489F31165D2CDB" + }, + "fixedInfoPartyU": { + "partyId": "392121FF1810F8520F07B5AEF4EF3A3F" + }, + "fixedInfoPartyV": { + "partyId": "087D9557DA6F950DFC999BC19DF0F9A1", + "ephemeralData": "94B95FEE0F9363FB359820A1F7559F7E75E5749E1A9B8F037A230997860DB71EB83EA567C2" + }, + "dkm": "003AE8A77A8A5650AE2C55351AF8937D99839C79B990716099A183C97F264BC91DAEF4A38356DD375B556A423D4F2CEC802FAC0558181656CDB85B37ADDDCFAA0B2E2ED4D191BC111BFE23FE77C4EA661BB0F101C5D3F7031C7BC26055CE949639519862F89B45624E67DD307324518580F8012D5F4A4C383F21CDBB0538CE83" + }, + { + "tcId": 3445, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5DB8824644B279B9E4E7AA2AC1BB1D7A", + "z": "326C45448E5A60E81CCDC10159D3C53ED8B63954389987984A73FA8F86D904F5ADABC01AA0", + "l": 1024, + "algorithmId": "C7ADF286E5A146DDA72CCF467BE6407D" + }, + "fixedInfoPartyU": { + "partyId": "49F20B19F2209973AF9B3AE118851901", + "ephemeralData": "17E4BF8C116DDC03DAA168E5242A04F69DB43A36661A5206E5A02F9EBC3733AB52EC556184" + }, + "fixedInfoPartyV": { + "partyId": "B8D5B3D7CD938D0E6B9B25E0516EAE46" + }, + "dkm": "DAB0ED590B68FAA2229FDB6AD34EB1B56F59B92714EE8621D1BDC3520B6AE092FAE56CA3FAE382B68AEAC4EF71607636878CB467236B8E7B9E61A6B054B73E6A94C052E9F245F7525F7C76D1322D90A2796D0FE8D53299D30A67947C4E078BE293A889F9704349B7090F30137B1C3B60046CABC213C534A63950C57E5EE65E75" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 164, + "testType": "VAL", + "tests": [ + { + "tcId": 3446, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB03B7571F0577941C18018E82076689", + "z": "69605F66526A949DE77DCE8046B74AA0FC18D9E7474395EE4A55E37E7F", + "l": 1024, + "algorithmId": "4B25577C862109B049F95A6D23DDAF12" + }, + "fixedInfoPartyU": { + "partyId": "A5184B7E626E0407F2188F6506F8F1DA" + }, + "fixedInfoPartyV": { + "partyId": "0D8B858753E4BD5EF300CEDC883B6ECF", + "ephemeralData": "9E33D10612F823FDCDBA20F1EA6C67EEDEAD48843B8B2395E76562835C" + }, + "dkm": "55F294FCA401D100662A6483927968C34676EECCD1B6E2B1BCC7BC0F8D0A279CE38F18A647F551F3EA12EEFE92BA07A0B0AD8A373AFFD052F6F18362247AF94CC0262909719352E475CDAD3F34EFBBE405B99E9D7A62365D4AC79459D047F94681B8B3B72E81D91169B10CA45F964647E61324E20FBD68FA77C246C97EAECAB5" + }, + { + "tcId": 3447, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF3D719181CBCB1A249E9E0AE3DDEA1C", + "z": "0C62F96DEDA525DC8317C3196262DBB8AF357188102495D65EACD103B7", + "l": 1024, + "algorithmId": "ECFBD5130880FBEEAF1DD82D14918B43" + }, + "fixedInfoPartyU": { + "partyId": "2D82D2B954468E4F031050C1BD7C1D9B" + }, + "fixedInfoPartyV": { + "partyId": "33DCF0BE2CDDDB3C26AE781E69EF6174", + "ephemeralData": "D632758597CEA57CA27298F88577A309CAC27D8B135FCB68EE77F46A75" + }, + "dkm": "0F2509E5B54BB6A307EEF6B4A7B434884D070EFDA1EC038D84345126C8001DE66F11AB77327023783BF287076BDE06BAE849885C51CA1B1F3E81AB77AADFB279D32703B517FD353B7A9513A074010E8203B951DB716C447E704D0100C9F8AD61695F1147B936E87907B8A23B87B49F549B73F5F446AC1EEB78CDF461E1949AF5" + }, + { + "tcId": 3448, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AEF8AC1D2E6517F9FCB5FA5CC94946D0", + "z": "35AFF66A10CD75A69DA0A974AEBC220B33E1780DB775E1E474F8941870", + "l": 1024, + "algorithmId": "A1CC62930155CA0EA3A89AC7EF67C6C7" + }, + "fixedInfoPartyU": { + "partyId": "824E12D365EC2DD4CE7A91A7D1618679", + "ephemeralData": "3BBD47D9EDA87A8B1016873D4031ED09E7C6A3C9115703A880A9F4EDC9" + }, + "fixedInfoPartyV": { + "partyId": "D7C796795EDDF98CBA08A13C4B2693C9", + "ephemeralData": "B8AA43B476E468AA7B7C36471C4661A6BB4C733DC36BC6D59234FE24EC" + }, + "dkm": "D53D8848EC5D5EF07683985A24D14B5B067F90A67C6DA359A7105A0EFB886CF7826B24CA37D5D8A9795A531FE357BCFA36047176F9FF32B57360CB3ACE62F2EA0962A82C266195D8D418839BC5ACE2AC6056EFFD8D3BB87906A32DC1BF9BD01F8477BF04A6A9C6C360B2747DB30F0659BD4D62801D98239B5897D383AA81CD5A" + }, + { + "tcId": 3449, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA2202D492B9627E4E1C43372CB2C5F0", + "z": "693B945985A2CA4C3CB6CE6FCC84AAB8EA63475623725F8BFE1974C046", + "l": 1024, + "algorithmId": "0ADE20373C84587B3C0C239D12A8A1E6" + }, + "fixedInfoPartyU": { + "partyId": "FCE1083F66650CC5AB77F6AA36786879" + }, + "fixedInfoPartyV": { + "partyId": "23F7A493D2F5F99D6B3364C635B7C564" + }, + "dkm": "D3E551F527294FA1C87EF48F85247A4DE14047313E8BBE4A31DE5E642B6D666EBDECD3D572DCB7E3CC06C8EDDE16A84B67B629E833A33FBEF3E58D2E060CD3C0137B621AE9321067504B9E49F60C34AEB34161941A30D8616C17FA0F7101F4EBFDD651F40C9C9D83A9F0CD48F6EACCCE2A1DA3F4324DE464C85025B984E301EF" + }, + { + "tcId": 3450, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B692826358C190B464D7BA9CAC4E139B", + "z": "094C569E703667833A02C4B4640B3F2C1E16E1EF73A9D0DB0C59909F09", + "l": 1024, + "algorithmId": "1C0FDC03D28929AF4227CBDD0A0248F0" + }, + "fixedInfoPartyU": { + "partyId": "D8AD39A442C010B54C64C9D3962CDECE" + }, + "fixedInfoPartyV": { + "partyId": "84856DE85A37857B90BEAEF3B6508845" + }, + "dkm": "F7692B3E8AFD5B78968C2238B9A1AA50F60EDB5CB718AE99E273CD1556E54CE5538AAC43CC5702F999C9AAE762387DF2E6AA05C953F3C40FC22022987B6E317C9C6A9A24EC0DE6564374F39C28AA85BB9C42E1BDC439AA4B663E1DEF739D27756D08DD1FD22DBDE83EBACC5756A946F7867A1EB5FD9FA03B9F3DF7AAFFCE97ED" + }, + { + "tcId": 3451, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EEEFE630FD628E90930774B63268FB2C", + "z": "61BAC2A722982F4F14ABD541E88A1F338ED2F8DFC265E85BB0CD0760DE", + "l": 1024, + "algorithmId": "BDCFD3114E9B32985A73C349533A290D" + }, + "fixedInfoPartyU": { + "partyId": "7BD7700213D00C02CBB06FAC42B22A75", + "ephemeralData": "970534E5BE6FC3E18F46B44C042D9909AA6F318EDA4410EE15D76E5D05" + }, + "fixedInfoPartyV": { + "partyId": "7FE1D2FDA13B5F8A4C64A1ED1C57DE11" + }, + "dkm": "CB7BE436E40E59106767C97F338295528DEC82CD15EFF32FCF220564117DF7800E035C3EFA4A348643C70F4CB08B9A62EA0622C2C73C9864D4FB68FB993C3A4B69E247CD5344D30AC8413E1476E0CA8A2768A16E7DAB7AD5D84085AE98E2031898D9D5E693B9E94AF9EDDA1B0558F1626370EB86FF5F8D56C6DD2D730AEE0AB8" + }, + { + "tcId": 3452, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E472D51EE60CC2418FDCFC2333058BB", + "z": "0748E9046CF20EB0ADD9FA1B1BFF4FB8DE00C4757B9A986C697C71C958", + "l": 1024, + "algorithmId": "F4C099E122524798CB3767140D1D6AC2" + }, + "fixedInfoPartyU": { + "partyId": "0B4CB796BF4F8B442817C9B3FF6B7948", + "ephemeralData": "19AB90D6D737EE2A0059FB33925082640F7EBBA8F06E3235D3607D6B3A" + }, + "fixedInfoPartyV": { + "partyId": "5C21C391394375A6CA7DCA6FE7C2F817", + "ephemeralData": "1FB7BEEB860499A097F9AFD95487A5FC89467C10FDB15083036ECC2735" + }, + "dkm": "D5ADED7A322EDFD2F1EF12AC34EDB68B7826322F9E9CC7BFDDC0634D9AF932DB5D25188DA5302781D2C6B00FCB4DD7A368BDB6AE3A430819C9FDE2E6F0C6477172AC36CF0C5B385C76A83C8591544DE8C998E4A1C6E7A43F0AA3B8DB08AD471686EC3F23A3140B62D88BB6E6AACFDD9768A815BBE41C6BA5CE16C741B74A9581" + }, + { + "tcId": 3453, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00DEA05854ECBF91F585CF6E2CBBEF78", + "z": "49B76632778A23A5C7EEBA81CF75B66673508774FF55F62FBF99FB26AE", + "l": 1024, + "algorithmId": "FADD00EC88E82C72F1BF3677F827FC59" + }, + "fixedInfoPartyU": { + "partyId": "48FA2D65F8493B4305C5DAE74DD1986A", + "ephemeralData": "F570458B6FF08C8C02B5DC940B3EC88C2270020839F0E6D78477082B81" + }, + "fixedInfoPartyV": { + "partyId": "C3D1AE5DEBC0E5D2AF3BB04142297861" + }, + "dkm": "4FE8C6267B7650D9BC0BEF976738FC9F100A994009AD523991B90A473241912384FCA2C2412E06DE13086D296B5FE24A36D11B233EDA1AAC19C2CFAAE721E8381F73F28BFFBBDAFFE7D9E7A6B8A91E53444095EB37EEDE35D1FB55038F4D3758250C263FDDB5918E1A2FCEB5059A148594865179FC73975E08E75CD73C8F4C56" + }, + { + "tcId": 3454, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C111A962EC23F984ED51F963F0DF23B", + "z": "1712E9BA1A8C695FB446B9268BE8D357DF1D092C9F835A79CBF2B5B4C4", + "l": 1024, + "algorithmId": "5CC9688DECD4E15AC12CDA528108F0AB" + }, + "fixedInfoPartyU": { + "partyId": "15699F8997C291D6B3D82857D03F2BFD" + }, + "fixedInfoPartyV": { + "partyId": "489010D7284A65C8CA616FA3DA6C416E", + "ephemeralData": "8A8DC28F05DEBB5A3DA6A74C627600BF2AAFF695B434FA2E874DC901A2" + }, + "dkm": "338B3008EC277355574A11BE31660798A05D557F4A1B429357184D8C67C2B613450E52F1F816DC5A8959739564BBE6D0665C18EA91EAD645E3B78195433439F08C7C7DC272773400E65710EDF2FD7198A4250AEA2F45516EC2CB6871070D1E8565FA3ED09F3F1A3E926401BBCBFC6649108D3EC3A72027AAB9E5E88E44749F66" + }, + { + "tcId": 3455, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3029552FB4F5F1AAA2061A0481B0AC64", + "z": "78ECFCC793A87EDBA9F553E8DC3A8DB96B95BC5799CFD2BAC3C0F8DD13", + "l": 1024, + "algorithmId": "8FC3D072E26208999134B73B7E162E2E" + }, + "fixedInfoPartyU": { + "partyId": "D5F74CAE354A99DBFF9FF232DE436280", + "ephemeralData": "A1D4EAD606679B53A001A9B5402C4582BFBBF74FBC5237AB01EFEA1B1C" + }, + "fixedInfoPartyV": { + "partyId": "A7A3758C0CB67ED15FB956A03FE354C5", + "ephemeralData": "F4F3366FCD8C2B1F7C14FAF7B062C12AE9837FC9E6D44E976D0804171C" + }, + "dkm": "B8A49824D3A33D35949B879A58495B1EFD5A86055325C6A5CA0C6292B99CB49359E56908DB3B21AAF93763B88391F5EDA17CC6F909CACE9E7BD514FE9CD48507B98AEAE957C4659930E61377119F178CFF07AE8D462D3220411EC8D3592F91F9E15FA386C7563A732B1C3F6AF5E94A7608787A46D4C02402E5CCCD8925D3D838" + }, + { + "tcId": 3456, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5E19A12B3FC640F5324BF112DF20C3C", + "z": "4D29C9AF516D7521E3ACADF0958F760CDF7DF7A21D0E8A417033E474B3", + "l": 1024, + "algorithmId": "CD6F68C0E70DAD129587498ED902762C" + }, + "fixedInfoPartyU": { + "partyId": "C86E10E382FB5C3B844C3357CB7883D4" + }, + "fixedInfoPartyV": { + "partyId": "6077C1E177FF91D135ED211D6CEE0273" + }, + "dkm": "06FF7BCB4D1C525D4126620D13FDE53895D65CE7843FDA7B351DFB269D87C504D92B8CB33C756717F4829F04A28173796AF38A0153AA1E721810BA33FB0F4BA98F94836B0AD7CC503EB0A1042D90A2E27BA3FC8ADBCA04A43F297AB9A62A2D5B39D1EE2C3A98A6BB01E81976BA1990B3BA50CAA029D9AD93332697E4923CB537" + }, + { + "tcId": 3457, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28E74E8D6932BA2B6027859FF13E53CE", + "z": "CCE4A1E6B002E96B02CBE48252FD1FDE65E2BDDF2C3DACB0CF9730D816", + "l": 1024, + "algorithmId": "D67FEBC4446D4CDB67C3FE9FCD46D888" + }, + "fixedInfoPartyU": { + "partyId": "C7C0C501A71D07E7BAEC2E45658DD95A", + "ephemeralData": "24C67A6A4333B0207D3005D271C70EE8E62EEEAA251B6A0B16349B4CFA" + }, + "fixedInfoPartyV": { + "partyId": "FD831F4922CE43974954EB6B3B28A600" + }, + "dkm": "BB2A79E5DC60A750DE9454D4F3B12E782D6E0D937EB835179AD812AE5BEB746026D91773A794CF0A9BBD4C542EDF7106C0C5D4BAAFAB88BFACCCE816206A0C05CD3D5D7C82E697CDE46A85CFCC9DEEAE731DC6DF549A08D1F5D0062B1EECDA33059703C3457D8D99E4CCCF91D4E02D6CDB0868528D90255525C57F1A6B76FEDE" + }, + { + "tcId": 3458, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E5E6BA349C9C97AEEB9E330D6D9A11D", + "z": "F6279D33A7F8A67DE174138929EF95EF8BA7D37A9B5A264DEF88007B8F", + "l": 1024, + "algorithmId": "6CCA6C1ABF3D9D0ADCCBBFF0172261DB" + }, + "fixedInfoPartyU": { + "partyId": "0FB53B7E7ACF7D416B9F2FEE3E9F3882" + }, + "fixedInfoPartyV": { + "partyId": "FFB0BBE108D5116DE9571A1FD9338A63" + }, + "dkm": "082B787C7923D10E2FC3FE8E7A287ECC61CCEEE60EC6A0A927EA145F0D719254181691F66017DA3E3E36B97CCA2B8A85115DF5655BF1EE1AEB9553C938CDA113CF0A8BDA1DD204076C27B168DAA6A1F9F5529A70C201D6B413CEC58607D0B896897653B6BBCD7A67F67B1A71F4A531A8F3B9904ACB492C9E63012E44D0475E08" + }, + { + "tcId": 3459, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B61E843101A3CADE724C1FE282C1A86", + "z": "FB12CC947034403942DB42FD51CB064FF4E699D86A8657708D99C17888", + "l": 1024, + "algorithmId": "21A6D24BA58881C3261B154E7A7C94F6" + }, + "fixedInfoPartyU": { + "partyId": "2825BEA5C315940C11D21C2D20DAE30B", + "ephemeralData": "182D6944BA3432C7C6BEF45E8B44A4F8288C384E1986A545BE4E355EF3" + }, + "fixedInfoPartyV": { + "partyId": "9ACE139A349E4CACDD6EA1320C1A7B9C", + "ephemeralData": "895611DF663657F6801DD37C6E78DB7A94002B2B776A315F1A7E719BE4" + }, + "dkm": "00666E9AAAA85D4DFCF23E01132D0B4A86570F6DC82C70E02A0269E49370E97ABB047D08BCCA41B6A556AEA1555D7472BA37B47AD83C07554678B80F6C5DAF91FB72DCBAE83733844258C952ECEE29986728FDEB2D5F57A5E0FBE12B8444B387B29B2CD91448F09062F0CFC6A711EF2C6476A9B614655E226FDE6BC6B1320CB8" + }, + { + "tcId": 3460, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17B1F1AEC6B3E59A5461496A430BE143", + "z": "E02F38D721B54C6F8EA026F6BDE706167EC700F45D8AB2EFF58BE46036", + "l": 1024, + "algorithmId": "B7A76088C249E3E7A2749414D22B82FE" + }, + "fixedInfoPartyU": { + "partyId": "4875E6812F53C11C7C278C3131F5F3AD", + "ephemeralData": "71D234A16BDF894C960A00AFA982B71E6A2F14C68910CBB808CCDF84D6" + }, + "fixedInfoPartyV": { + "partyId": "12C5A8202A3AA51450B301886DD6880C", + "ephemeralData": "DFC50A9432031DE2C23E3E7C9FF8836761FFFA89033D7537D8AC9BA3B2" + }, + "dkm": "D16684314C9A10E589FD362B8072D1AA802033EA9E4007EF9C4DB2CEE7EE86B8A072778D2BC1C67BFB81C510296E201F9E8E8E8D2A435223B049BC7516F59A6022B62B75223AEB0891C01D5084E43F2A26A8BB9B8F28F79FC4EEE0EFC76E52B06BAC13FD6A1767EB2EBC01143140C5A872CC7B4B2BB5D4AC424521986E1CBCE9" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 165, + "testType": "VAL", + "tests": [ + { + "tcId": 3461, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C20600FDCFC9982E492BE6C42C78CEE5", + "z": "CDB44AEAA5A99FCA26D7E0E577B0F2D73CD01807C5C105B81C28E9D0FFC7E7320B4CEC0C", + "l": 1024, + "algorithmId": "418FEAB9C00CF1A5A66E93BF062A115D" + }, + "fixedInfoPartyU": { + "partyId": "E5C703D729910EBDDA5C7807FD0F849E" + }, + "fixedInfoPartyV": { + "partyId": "506E3183403035A0105125D53C19EACA", + "ephemeralData": "45DBE3D823DD399A2B4267EDBD5EC9909A5F2075C4D7C64FAE4ED6BAD5965F34D2098227" + }, + "dkm": "F146ADA160B5F2CEEF655DE8712912237FA6BD41D79AEC9E237B573E5971D8AD8CEBE8B5012EB75BEA756ABB23C29BF427B3BDA35B9D312315799C7ABCC0A4047652075ED2DACF1C5A885DB2B58A590C70AF0A76B2C79753F25C7C9CAC4B2C855F8684EC152C08CC06BF7F7B21D534F20D1EA5CD1D609E9E6B169330C90F86D2" + }, + { + "tcId": 3462, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17BC3070846A9B5B44F5C5D1AE54E965", + "z": "4D9AA2A5AA3C01A3880DE0CCF1BFC6F4508FF951279896F386F3A29AC0EA49AFBB458783", + "l": 1024, + "algorithmId": "7F309AD51EBA62DAAC850E246925C2B6" + }, + "fixedInfoPartyU": { + "partyId": "76324302C5516FD12F1394FE1CD07554" + }, + "fixedInfoPartyV": { + "partyId": "FB51E04866991C623CCEEE54C8BD226C", + "ephemeralData": "5670B7CAFF8F89C97A789CDF01860085DD80390AC5CE6085478F5D208FB25F517329DCD2" + }, + "dkm": "995A3C926FE06BAED23C53A284B9958BE921900E2B46C7DE2086366C68DA8D1EDCCFF14EB75F5130CAF3D96A230C1E8CA64FB41C84B7176295AFF8A22FF54C217F295A57C529F63A97E1A3F4EA7F0D906D67FABEF7275608F8B96688D3661219332669377AE07FFB1DFDCA7C9183C7D2B5C7A9DC2CD79CE9C6D97017CF654A8E" + }, + { + "tcId": 3463, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D2B7A3C82D0025476D650D6D2C800D58", + "z": "ABA2F6BD35865C12E23867C4B3EC2EF5BA66F18079D901C28C130571D303967F5DE0DA76", + "l": 1024, + "algorithmId": "BD87428519C974D94E8913087FD429C0" + }, + "fixedInfoPartyU": { + "partyId": "D6AC874B45AAD8FA68BBAD0AC13E2961" + }, + "fixedInfoPartyV": { + "partyId": "5FCBCFDD7F14C0205E18992DEE48DDFD" + }, + "dkm": "39BAB318AEA017F95562004CD11744B415A0C6425B28FC9D8F4A313BABB52EBC53222AAF7463DC83225101D35972DEA19BCA6078DAD3EA6B56EFCC19CC2377C3000A0B2A8EBE4AABB5B28199E179949CCB5041DF075849E327F857FE89044D7EE8E07FCF84A48E7B194F738BB2B3F3CD2009508FD94E8EDCD8CD85328FF2AA48" + }, + { + "tcId": 3464, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BEC31B5406AE3027E6D4D98CD19B330", + "z": "32C7AEA27E2E6D2FA8A8E7FEC2B58026AF90AE2993FA20222CE633C60895E9CCC947B443", + "l": 1024, + "algorithmId": "0F9113E60BE98FB0E4AD998BAB666B0F" + }, + "fixedInfoPartyU": { + "partyId": "0716D6E8E15B41666506111D4642C7CB", + "ephemeralData": "9965DD275658BFC68CBC5B50791591496B61C8C7587489670459D9EC41E4CB84FEC3143D" + }, + "fixedInfoPartyV": { + "partyId": "0E2088E7B7FF60AD3830055EFC463404", + "ephemeralData": "848BA0499E3EA4055CF0CCDD60430D65819353DA248ADC03802D7A580E29AD49FFAB589B" + }, + "dkm": "F68E396E7FE907F5E2F4CF5452D1432B2C6D6054D4F0FA65707E7CF3258462CA355A0DBE66A4BAC9FE700BD8DB5AE3344F31642E5E8E9569492326DCD819F93B5F7C5CD4EAB5616F4A3F3E5BF56C5B7CD31DB183EB4AFB8F9231F34071872F7B656D071178F69868F38701CD7D536AF87BBF528A9F219E196D7CB4C8A5AE1360" + }, + { + "tcId": 3465, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22D2DE59CF4BF35832DA10E7E7163065", + "z": "D5B415C2F7AE4C2D76FBC241EF521706E9E1533999E87AFEAA859CD0813E5E77DF80614E", + "l": 1024, + "algorithmId": "4F85E937033794D6071C796954F41C00" + }, + "fixedInfoPartyU": { + "partyId": "0596B10BDE33308A4B1794F206D7A669", + "ephemeralData": "F9D9FAA8B57B6A1D8E1164070072F7DA7B932F12C6E9E88DEE8354C862B59D900F371BE8" + }, + "fixedInfoPartyV": { + "partyId": "82F8184A47FD5C93402AA32208D9C67C", + "ephemeralData": "D71EB2F9720544C967AA6C32CD36598A564C49EF0E9345CDD85D44268B2B0837A8F1228A" + }, + "dkm": "D0C0EE1ECCC9847B43181543647E484A378F75238E981D1895972782DF5D860C2A75358896D2315207A86C6C52B3310CA32DAE3A62E2261ECAF0F0D2A55E83FBA9F0B50AD9235A1FF3F66B404EC66794FC34EE9700D617AAEC2F593C3A4F06546231F8C0FAA19BF5343107ED99D7CD44D5D9D5586E6DD6E627EDD24931D24E7C" + }, + { + "tcId": 3466, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0155F15970DEBFC47DADAC9CE859BABE", + "z": "48761420933E7E2139AF28E9386B53F2C87CF94FCDA37EB347F2EC9B1A5BCA147762D62B", + "l": 1024, + "algorithmId": "5E41AE1FA215758498EEFFF974A597E4" + }, + "fixedInfoPartyU": { + "partyId": "6020111B46C966B9B04C3F5EF349CA4C" + }, + "fixedInfoPartyV": { + "partyId": "089E275FAD1DF9211BEB8D296BD80E8C" + }, + "dkm": "1454B3EBF3B853871A9CD6128E046E64E07D4D092EC7D405436344723C8FF595E61EABEB9929DC3ECA1BBDFCE782E6EF0908F4B970C81B2D1595823313D2567933320CBF41DF42FA93D808FFA061E9AF9623FAECB8003AE56051EDEC83EC0BA25CB96FB1EEF28460ED76707D62C471BE9631E2AAC9DFD6EFED0B968ACE70C473" + }, + { + "tcId": 3467, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7E4AAEEB6A58FEDF23745BA829700DB", + "z": "202496E4C45DABDEF170B4C4F9DDB54C3CD3FC5B87542B004339588308B977B4B47A001A", + "l": 1024, + "algorithmId": "254D88213F5DC86F4C6284805EA7FC3E" + }, + "fixedInfoPartyU": { + "partyId": "F25A1E3AC1F2F40B62FF8E466471980D", + "ephemeralData": "1B3CED6A50C0B6AFC2CFED7AB5BDF56E8BC37933076A5E74FAD729C806FFF08123657BA7" + }, + "fixedInfoPartyV": { + "partyId": "A506B98795976828647E5D71A88CFDBE", + "ephemeralData": "8403B91AAFF53A3956128D5977101A1BED36484F228790866911563D2194A8AFBDB16867" + }, + "dkm": "5393A674368A8EFD0556D8E499BF24F0D6FB241FCD43E0665299102F17C23FC2AF9EE95E6E81C903426780B0AB6CEC9519C48A237E0B7BA0A3C6D2A952992858D2C901F2B6F94E70078EA0C1704014E7DF0F81FBF84611F069EFAB3502207B1520CE27CBFF34B3DB4830478C37ECE678D38EF25EA7098E9C7C15BA81E42FA61E" + }, + { + "tcId": 3468, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D441D35AEE84FE8D6971261FAE3EE3B4", + "z": "A0CAEF8B5E6E6F7BAC11123428B1C3C9DF25F61D2F4DDC952E74B4BD022B58198E944550", + "l": 1024, + "algorithmId": "A12E4FE61BC4CD32C95E00AB9F7CA54E" + }, + "fixedInfoPartyU": { + "partyId": "64D155B1B1D442B16BF03CB85B889FBA", + "ephemeralData": "E429B0099E26FB5F3DF27646D28D27CA6D7D74AC12A5A216464D867E4706596C948D0B62" + }, + "fixedInfoPartyV": { + "partyId": "E0059F2F9F9B25A2B5391482464D0C3C", + "ephemeralData": "CD124B45F6C00E52DA202FD8EDB5EB37269FD5C078653CAE6082E7C866F64EBA7E3AE3F7" + }, + "dkm": "00BFA1CC8C508A32D4C7DBCDFC326C32D5CF94958DA20D434B87BE9E315DD62A2964FF5F2682CD8FA5B0278EA051A3C19F2CD9FA05B75B16C47B790B4A73F06B2A6A065D23836F7BB7DC26BD1E22C73AF4EFC8B5FB53F753CF9C55899FDB40338F159C473A2E9E3FC17D85F16961FDC6109861338986B29B238A40F7982C4BE1" + }, + { + "tcId": 3469, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32354FC6ACCBCCEFA65228415EB23C3C", + "z": "18311892653A2E391C92842516F89E9D21796CA73FC313D408872D38B050A2A9098E9F95", + "l": 1024, + "algorithmId": "358625C09F1B0CABD00239B0E841266B" + }, + "fixedInfoPartyU": { + "partyId": "431FADE88B0D5C515DFD7AD5A7D48B9F", + "ephemeralData": "08DFB8C636C1FB6D8C77F21776D66804AE017E5257AF1E7BD90AC9839BC52742B920E0F7" + }, + "fixedInfoPartyV": { + "partyId": "2E96335E3DD684F2B1520B0F645CD8EB" + }, + "dkm": "831EFDD7083D4E48A0EF2AF2D9DDFC3F3748CCE3D2B2B95A9C48A502A59BFA48D6D549252C147CC49F545F6F6EE590625DBEEE10C0702C77CC2584740CA8252582832FC66896DF0BE1EF94A684F335FF0A48C91704978978D13991A878AE2C02BF4D161A3670347FCC930577AA4EE42D6D2F908AF63922B7E629AA1594CD5490" + }, + { + "tcId": 3470, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CF9DA412AC3DFDE10ADF710B20D8BDED", + "z": "B00341B67B8D9DCF1D5FF16111CCCB66C3D41FBCE5D3A57D5049CC725F8363D4ABE0775D", + "l": 1024, + "algorithmId": "F91691276111541F9F4A0D1A40FB4082" + }, + "fixedInfoPartyU": { + "partyId": "F2F057293B8D8E283FAD793A89256BB0", + "ephemeralData": "D8DCAC9BAC78F42364D2E98D1EEC894BFA503523A23B99CD3ED58F6504E249CFAA9169DA" + }, + "fixedInfoPartyV": { + "partyId": "21069951F55A01D8EAD5844221E00572" + }, + "dkm": "AEFAD96E20D30E2320EB63315785325399A33F31DB9EB9CD02ABE451BED4266DF3AB5F28E2B05789C8AE2676641F6E92DA4525F3A282FD45151E0D273082A6DB688172FBF8D0DD80740D8AC80802CD25B2A6AD6E358E431289C4D58F188DE62EA21BF80C776CF734E4A3CEA6890730788D527778593BF78731F4EF41D949B13F" + }, + { + "tcId": 3471, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DD131DF1D4B1498308D22DF6B04C6E5", + "z": "7C01D5A7B66CB5E8B7EF3D7326D975767209FAA2689CE191FBBACC746DBA4E8988F814A0", + "l": 1024, + "algorithmId": "71799C90A24278E84BD334CC886D0049" + }, + "fixedInfoPartyU": { + "partyId": "E47BE377B69F916712F6960B96E8F0A4" + }, + "fixedInfoPartyV": { + "partyId": "DFBB54045FBF85025E4C15D13A2BF65F" + }, + "dkm": "9751E27A2A1C8D7CCA3D8ABB2FFF0E244954274F43E1024869AC21C79AAD805BE0E115CD8315F349D4D75CA8CF101D752ED9E8F7C1480B2E999505AECF064666582C9D30B0A2C415315D2EB073E1D3DD00560E1BB1D3CE04C635855314AAB71EFDF53ACAE298FE57A245C446CABA4E88B59F791E7017971DF90BDFCC8306511D" + }, + { + "tcId": 3472, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F182B3E055A412C5A325F047B4806AC5", + "z": "6825E90C3F301DC9C5D65F042831354FCBAEC30BEB2D196E2BBC972C4B79F9F95111F9B9", + "l": 1024, + "algorithmId": "01CF5062DFDA8FF311726DD89B022918" + }, + "fixedInfoPartyU": { + "partyId": "1D4AB8E4AC34F933AF8835F1CC077D3F", + "ephemeralData": "47553A12D310E1292A0AF481AC19DAE1BB8EACC5F3841F7D670F82B322994DE9C884A2B6" + }, + "fixedInfoPartyV": { + "partyId": "0C1FB8AFDAB64779B33DA96E2F56A0A0", + "ephemeralData": "15B11703C1717A2F3E3A33669D374D5E5624533DC943543B71D2F96F43F446D888DB2461" + }, + "dkm": "4C3E24ADFEEA8CB7DF98BCB0D27AA2736C0DB7459A1FE67C5357661E732B4F3C86ED0EA99A7198113B755479D693E3CA1E0FED019B414E4CAF97D00FF9EA478020F0A147C1E90ACAAF1EE179748AE50C5828772E6985FB2EC56F22950A0853653C43BD8527DC64C1663BAF4FB0319A9DF4CB85A5F59CCA805355D3627A1AC2B5" + }, + { + "tcId": 3473, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D444A028CF64C3297E8B163107269295", + "z": "2FD5B23A0440B7D300EFA8EF64BD1C12CED2A8C73111C4A6E4D1A4FD43A4F0CED4C6827E", + "l": 1024, + "algorithmId": "A921C6CDE2E963AF7C2F223F0E3EF8DB" + }, + "fixedInfoPartyU": { + "partyId": "FF6003CA417B5744C601CA9366A75ADB", + "ephemeralData": "26E3B153FFB9B1A34516809E041A75DB8113851EDEED14C317A59E82484259258ED2EF3C" + }, + "fixedInfoPartyV": { + "partyId": "7EAC638D4380AE5C2B101E6501B64B36" + }, + "dkm": "F73B273DAFD5E3331BB361F25331E64183D62560F2F476D6173E9355BE712B876FCE8FBF777D7FCD45E53B77A7723B6647D9B9786FB0DB4F72F5E9F03C05D2184A44D9F7682ACD3D2475452B877A58CAB9DBB6018E9418197A9C35604E0F99403BF463F28AE984C439A89E4FB2AEA17F8D5798E4B33063EACA4ED8831A40DA9B" + }, + { + "tcId": 3474, + "kdfParameter": { + "kdfType": "oneStep", + "t": "096AD9E7FC629BCB7289FB4D79E64C61", + "z": "63F5EE76F8637863AC142B70F2F5127C88BAA899AB19B1CB265B87E730E6EB886119F74E", + "l": 1024, + "algorithmId": "5A653F5B43F8E1D24B75C648E09EF9ED" + }, + "fixedInfoPartyU": { + "partyId": "3E62B7811AA663A0C691B66675D10326" + }, + "fixedInfoPartyV": { + "partyId": "BBDDAF62236FCD39D75CF126023B8CE2" + }, + "dkm": "04AAFB1C6C7B4694CFDE15C914A014D3264EC1DE7727717FB34029F31B686C945F7FF096B2159E7392D17EA893EA4F7F34A8CB9620FA01853994E8198702223680BF293E5929633AB6DAD30340874498E07865D6390F463CB815842D10AF30905C79411A612FBD4A2D0992437C3F8C88668286E388A3C87CABDEFECAB97BEE04" + }, + { + "tcId": 3475, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7F0042E03E4725692AE562C51E47B4B4", + "z": "78EE2E62F3842CEAE8EF08518CADC02D3D1CBC2CBEFB67D58AAD84FFC66F6CBB1156D539", + "l": 1024, + "algorithmId": "CC52F04D27AD6335646A320D593236EF" + }, + "fixedInfoPartyU": { + "partyId": "2411892A01545AB5401F814448114099" + }, + "fixedInfoPartyV": { + "partyId": "79A627B900D3DB877CB2C0C9277851C2", + "ephemeralData": "2465A687AD33FC404BA5BDCC5F7FD05075DDA0CD5F1B61BDEEB3F6D76CA1ACF8D3AAEC24" + }, + "dkm": "62B26C5EB3B06617F78961A4D505A4C9C0A58F9F124810B8EC71A5EC52388D287AEF83918435EB53218CE972EFDE6ED8814637A721B755E0210612E8EE278A97CAA0C7C0E0B81FA6771A8805C1EB8093D15D5731266E7442BD115EC640EDA75D365E3AEC9BB15F383A5709DBB87602629B6A7E43D90D04F5F0E892F9F9CAC37F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 166, + "testType": "VAL", + "tests": [ + { + "tcId": 3476, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADDD1060BCE0DE0D2B1CDD59EBD2FFC1", + "z": "D988D78648916F197B3CA53611542F66E0450B1F967F7742B05DF0E53086252278DF5A", + "l": 1024, + "algorithmId": "3A5AD8D33436B597A94E50F88868C113" + }, + "fixedInfoPartyU": { + "partyId": "B1C1488DB4DA2DFBFAEDCE3B153860F3" + }, + "fixedInfoPartyV": { + "partyId": "EE6A2A145F75170BE87C42CE057E7730" + }, + "dkm": "0364A0D8B2EF6B5B077429AD33F8CEEF1EDBBD657BA4C8BD686103F1338D4F307FC012091B0E61D0A8CFB084FE20EBD7B018A376D5BEC74D4B854456F17DB2BD3A726DB14DD4031536AEE4F275304C2B6B760BC62583146BC40C9F5BBB38518F0B26209D95C387790B5709EBBE1005034B002CCCB7B3DF65FEB7B40B26132DDB" + }, + { + "tcId": 3477, + "kdfParameter": { + "kdfType": "oneStep", + "t": "344084B8E61B24E7D8630CF6380F7A7E", + "z": "639EDA9BD31081B13F0C786C5065118AFAC7F0EDDC7B0F3D4AF7C813406756BAAAC248", + "l": 1024, + "algorithmId": "EC33D045ABD31B1F8CF69DD526E5DB78" + }, + "fixedInfoPartyU": { + "partyId": "F52D476CC925C1FF6FFC3A1695792683" + }, + "fixedInfoPartyV": { + "partyId": "7062AE23B8918F2849413D72E222B689", + "ephemeralData": "ED5459C213DCB66AAAED4B37E811817C2412E21A5369D34352AA51F61550E43277C759" + }, + "dkm": "004FDED74FF3FE29E7E146B4DCAC816F2D618093DAA6B7AF664BCCBE4EE293ABF5A8CE6DC7BBAB915B0154782B22C2AB342352D571B5F177463CC15500CDAD47267C91C0D5E0E04C03E2EEEA63A95BEE14329CFFA55E35727BBCFFC466C012A706F583A54D8B2F6ED0273126A48027E43260C1D86CD6595E47AE3C1AAB08D659" + }, + { + "tcId": 3478, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43F07257F6B3D704BBF4B901F694BFC1", + "z": "A70554A0F451D729BDECF9B7384ADA9F89A5E2FFBCF34910CDA13FF523BAABF98E97F1", + "l": 1024, + "algorithmId": "DBFCF89F984844134B478A01C2A7EE71" + }, + "fixedInfoPartyU": { + "partyId": "14B31B1071E4EC60B79F9B062F026A07", + "ephemeralData": "B7423D230EAC7B14CBD8933A038275E095B44C43BB2CADEE1DF9FDBF00D65FA66850E9" + }, + "fixedInfoPartyV": { + "partyId": "C42D29BFB2C981A209700193A8019D03", + "ephemeralData": "04A6E84DEB0B25CAB9617804DE010C4BA6B7746AB1FAEB5043EB0A87122D4D663B331E" + }, + "dkm": "7D9CA33C756E93AF1EA843CAE606AF24FCE38B40D67F8210D9618495550E063B1625F27ED0C617D46805AC8BCCB95AB1724F76B9343F4D71D1F8B562849E5ED961C4071DE22F570C99302874798FF7889580DE6120863DB88A5A94A393BC90B6FF6311203434BDF983376A2A05FF21ACF1DDEA8429BECAA9128D1A1BC7DEE16A" + }, + { + "tcId": 3479, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7CC3F8F56F81B4C62106216DDC8D76C8", + "z": "4259AA473AB7C59936C048255E653A5122240D67AAACEE0D641C917F55041262562B26", + "l": 1024, + "algorithmId": "933ED15F69D66E3F3026474EFDE24E46" + }, + "fixedInfoPartyU": { + "partyId": "611A0A1A32F9BD514B0D21C481DB7A33" + }, + "fixedInfoPartyV": { + "partyId": "95621CE2D9BABBCD511A31CCC14171D5", + "ephemeralData": "93B09D96A06F715266F630C14866811839716955AB8F1C8E4E670D1A2D2F5EA232EC77" + }, + "dkm": "90929209529E68BC7DAC67803B9824D4C17FC0FF4EEF3A5903AD2DBDFBB711389FF63020A536AE702F7829EBC781CDF08D303AF4065878990BBED8E0EE2F1AB52542E18F1EA12485763B37049D67553A20AE7C3B12B4B8F037A1FA2E8A381D2A5CA1B1685863B397259E5AD624ACEC6825DDC8C7D17D59DDC9FA4CC816B202C8" + }, + { + "tcId": 3480, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F288E827F58D89D9CB36D2E6EBE2635D", + "z": "08656F5B0A2B8C1FA2F63AF868C87BC174B1D34FC9FF988D50EAF436FEBABB27141DDA", + "l": 1024, + "algorithmId": "62CE6311E257F744312119A97CC171CB" + }, + "fixedInfoPartyU": { + "partyId": "223EC0D932A982FBF7AB65A3A6A64EF3" + }, + "fixedInfoPartyV": { + "partyId": "331EF4E0C8AADE17C5EC1BB41276C674", + "ephemeralData": "EAE2FE8A8D1B2F01868CE1BA333EF5EEA8E793084D5FC9C391766CD0D05CD10A2C00D5" + }, + "dkm": "DE05D81EBC0217B4D331DCAB28518B82DB3842FC802ECEFBF23416198664D8E2010093D88BB1F061ED96AF0AB51A51AF067ACBC800D76E3398C303EA1905EE743882200026D70D9C38A4091877B0EF3AFF799A1F14A8229308229E11E8A1CD8CE54E8B0E1E953F2E0B30617EA43DFB3B261698FD79C30F0334F95AD3D020E30D" + }, + { + "tcId": 3481, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13D0E5352F0C1BFED6C320FBB4B84780", + "z": "D216DF86B97C4C48BB5A09DF89A74FB58658C868E236B2C8A76C132B336CA780A7E3C5", + "l": 1024, + "algorithmId": "84A5FD171E7AFF7352515D00B44F30AB" + }, + "fixedInfoPartyU": { + "partyId": "78B9407B76C28A9405990BC861215F27", + "ephemeralData": "3EE0A997A43902AAFF98C2860ECE9694F3B221F9D107488CCE5702AA1612C3F5F3B64F" + }, + "fixedInfoPartyV": { + "partyId": "5A7CF0834C79CBB4C5B60B4C636B7379" + }, + "dkm": "FB70A65C60002A9AED73BCFAFB1EB6267A95DAC49FC6690BBD1C7187CDA11B89A8EEDE24C4F6DF57458C00F8EB556E1B818D9CC586EAAB91331CCF7D8ABB7A2D0F3DD0F9C92C0B38E744234280E4240EF56082067E5B824F8F085D0766EE78866D88CC3B4CEEA444EA29757691B20047A570C3B9BF8C25269F5729B09E17B2ED" + }, + { + "tcId": 3482, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D10157B32C3819204B0FA689D27D9E18", + "z": "84AF3F259689B428873E60372E5CA7275D4B4500D1A6866C945CD72491EC938357BF41", + "l": 1024, + "algorithmId": "D9455E5BC580417C4AB5ED41A78970DE" + }, + "fixedInfoPartyU": { + "partyId": "E6384779C4A3122DFA580D2B46C1079B", + "ephemeralData": "2B2FA27CE00D7ABD2501624F1A320584F93622D72D6FC54E70696554221F91E429D9F9" + }, + "fixedInfoPartyV": { + "partyId": "57EC76A367ABE7A3C5F19EE8099F8665", + "ephemeralData": "3DCFB58D478199B667766C14E5102C8251C74396ABF48858DA65F99082D9BFC761623F" + }, + "dkm": "52CAA8C2FBF9A7DF6667EF1F6A809A316B22B92067B26E92D8029F7090531E32BA6BFD90FCA71C680BA3394F2E6D68E41882BC2E6124FEF83286D3A2246AD95572265F719818CA5AC3ACF8BCFD2FD317CF597674FEB81ED756AAE605738DEC898A752D69814724B94EF1891E25C4274FBBB0A1FFE3261858C5F5735DE8FA2D8A" + }, + { + "tcId": 3483, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08DE82C243337CBDB0A4703425114F7E", + "z": "4039BE10C711F8BCCF8D4172E5920D7ADFEF453D93F07FA0C6E06701BFD90A0BFCC093", + "l": 1024, + "algorithmId": "AC41C463D3419D928A552B388D3DE6E3" + }, + "fixedInfoPartyU": { + "partyId": "FEF6E8CD3004AA53BE1090A5A136C8A2" + }, + "fixedInfoPartyV": { + "partyId": "46E1B519550803097DC989DA00FA63A3" + }, + "dkm": "D5E3BCECC9B02E467065AB447A0E3B4217C760E760FFA0C98C0FA51EAA81B413C490686E0550EFAE42BEF3A7065112D8C0FD24221F25CBA05D159FDD25C7AE4BC4B441E3C1BC9079E1A19DCE415F705BDB599E4DBD62D25B66113D83E9BE0A5CC6EEC0D9655FFDD1C24121CE5BE6906738EFCF96BF1F68F01C2AA1B77A7A0D6D" + }, + { + "tcId": 3484, + "kdfParameter": { + "kdfType": "oneStep", + "t": "365053544AF2DE8EDFDEB1C949545F49", + "z": "492F03ED47FB2235548E8EBDB74E7E3A90979144CA98D0C8DF6783FD9CD08520C7431A", + "l": 1024, + "algorithmId": "3DC3CA86636654409C461413E26E6D6E" + }, + "fixedInfoPartyU": { + "partyId": "B9AD13F50F16D161C557C279B8A30342", + "ephemeralData": "2A8A4174215E7F77EB5688277717DFED41884EA0C4F22088DB677BF691098CCBB716C2" + }, + "fixedInfoPartyV": { + "partyId": "A66E52DE413D7B5BFDC111F9B67D78ED", + "ephemeralData": "0895B711250C154BAB1C191DDC47D1D127D7C7954666461D76191D35438F9EABDECB6C" + }, + "dkm": "AC0D5EC913C32E8182B407771F987D0E009B81597F631E23D0A3B261D02AB3E71FA4DC30266CB9E4EFAB5CAFAC288575ADF6B69AC4E4417D4E09B4F25A861DD6A3F82922A879CA2E399F6BBF5D9084145C5E8C38F39302C3823C48978C6F76A54FA79C454295746FA752D1B50D17986F62FAACED3493A501D80AC849007CE7CF" + }, + { + "tcId": 3485, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73DD38E63A2E583F3F889EF11D441E0C", + "z": "928276DD6F4BA0B8E5E32D055CDE7DFE46BC9A033639CD93F8604C28782D829D05AE55", + "l": 1024, + "algorithmId": "0D546B63E7F653155685CE102423B6A4" + }, + "fixedInfoPartyU": { + "partyId": "A02A210672F5A691D01BA5DE8BB665B4" + }, + "fixedInfoPartyV": { + "partyId": "4A1C1BF00188C0489F6F005276F6DEF1", + "ephemeralData": "9F5E27D88BA0CE93E496EC4665621B8C97EB44AB7697DF71385FCA0E61586731E49D81" + }, + "dkm": "0721F5C42F7A54499666BED0C97A94BAABB7087B5501E988A0F19A0053EC6CEC213A118E64B1AA3F75D4A6E2540719AF1B802BB9A93B1AF98CFDB0DC3DAD92F7022FB738B46B48073C915A76E399F38EF258F4B6979062FA91DF0B6568C36D34013C80F4850A27198944E242A8168F88FA94D2C2C67421482EA92B8B77C2B9A7" + }, + { + "tcId": 3486, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B560A7EDA1684D0FED0117831FF532A2", + "z": "B2EC3FC31B5373489A2F5256957AEA9B6F99EA3C5E4E26BC59D72C81CACF7EC78322FC", + "l": 1024, + "algorithmId": "EDB3947EAFA29F6A08F5DC95A91D536E" + }, + "fixedInfoPartyU": { + "partyId": "B72CEEC1C744BDACF27368D36EEC105B" + }, + "fixedInfoPartyV": { + "partyId": "397C96BCD90E81354F752D8C81CAC437", + "ephemeralData": "EB258EC727F01965E69E1F77E3CF30217B8BC79B4759D8670D98E98776329C2AFD2C02" + }, + "dkm": "9AD32CF016DC2B5BD0E593A2E4E7F66AE49BCE88313F92B55C3F0A5CB7AB54F33047399B33B7A2681E0AF70B46EC7DFD3AB0450350250A97BFCF9A06067EB60A7B9222FFD65848733E343923FAA4E94AD7C2B35087FD19445828DC09A4413D81DC1A0A70633D5165BC9549F459F694A26C8E29C9DF67F0A92301914337FC2104" + }, + { + "tcId": 3487, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3F34EBA789FD7D029AED9B8BFB4A1DC", + "z": "E73EB98F6F4FA5E67C74A7CF49D4D6A668AEA870D1B4C7B0C4D0C4B677504C3EE7B265", + "l": 1024, + "algorithmId": "C0BE09064C21ADDD29C744BD4D9D56A8" + }, + "fixedInfoPartyU": { + "partyId": "CF2F051C61FE15E7FAFE298C73802253" + }, + "fixedInfoPartyV": { + "partyId": "88F63461741090D3D8961868900C4DE5", + "ephemeralData": "874ED907E08685ED98B89BE90AEB56326BAA638076E06012A9BA62D9D87CDC3A284E7D" + }, + "dkm": "66A834DF349DC5F8A7088F92165B78206472B1F52710140530DB3B2879A3D773F0CA5178B1073EE7FF884B2D5DA3587D9B24623AFC8BBB824483307CA563F5672D7792D70D7A915FBD6EB5BF548826AEF18875D959CA6D119B899B415E257E3F82713A84F6FD0EC9184E58DCB9C948905A0D337A7C089A00880D494D894A37FD" + }, + { + "tcId": 3488, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5183B9207669EC2FF5E386373253942C", + "z": "A6F4FBCD53132DBBB0DFA2FB92E7F5F6043A9FD10BAD23BF4B5A779011AC5EF7D2F6B8", + "l": 1024, + "algorithmId": "F9941D2A5F457F87748A96A8E0D48682" + }, + "fixedInfoPartyU": { + "partyId": "D697E082D1233ADCBAC383809A9D4A33" + }, + "fixedInfoPartyV": { + "partyId": "2FC47E06646356FC7F54D664D15C8DB4" + }, + "dkm": "A6BF78DD3B0DB82DE1A47F02A00537349827D9146C305FCFF22CBCFE3C7275ACF8F53A05F9176A83BF43592E9B7F180FA9D7C4B1B7BAB56808AE4D286E65CF4FD5252573433DDD4D68CE2E82880375D8320E088E8A058DA84423FF12ABD74900409B127BA5D25CF23D81023B5DB31BFC6F13C75D20DE7EB20ED78B315DBACB92" + }, + { + "tcId": 3489, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91DEBD19BC418C5B914E5D187B52D06E", + "z": "70E8D03BE171608ACD682B436B8E5784BE593607287311D095370504FD47119E4FD02A", + "l": 1024, + "algorithmId": "956479DF60BE3707BE23EDE6D0B3F596" + }, + "fixedInfoPartyU": { + "partyId": "B810F03F193E48903D99FBF1D51C4B2C" + }, + "fixedInfoPartyV": { + "partyId": "4BB7CBE2D70E7B069EA0F413EEA0FAB5", + "ephemeralData": "8066CD867DAE658A7FEA367C5618548C5E94DAAE9A69360868EF0EF058E8167AE7E56F" + }, + "dkm": "4A43B9CB697812957A6E937FE5DD2C47DEFD67CB4DC8DFF7C9D0B6734633D6DC169DCD159EA14A77C7BA95EB7B9E8860918AC0712532D6CD611AE1412C1F3671A582175121D39C93943A7F4DB5A2479E9808766ABA916A1725FA04008AD0298B0724625A48B57D0083F4E6C30B4D18EB3694FD9C863DB645E70089953D7958F8" + }, + { + "tcId": 3490, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F7AF005164088243271D3049222B07B", + "z": "9849DED7D1178D1C66FCC0F0CC1F446B93E0833685CEBBB9911D38C950F24229F54A8E", + "l": 1024, + "algorithmId": "C2216466269858C8D72ECDA48A2E32C4" + }, + "fixedInfoPartyU": { + "partyId": "9309035677B842E65959608980F76E1B" + }, + "fixedInfoPartyV": { + "partyId": "71DABA4C213C348C4669057E6E0A0E5C" + }, + "dkm": "2F125CA24C9DD5ECDCC2418744550A26898E2F5049E200B8EC1D22BD2B0F556EE3C72B9CCEFDD60EF6EEFF920C05688AD05BACD342EF5325B040E45BACEB33683DCADC4FEDCA5B039C3B71B3F9EB1ACCAC3A49AEA3272C50137F6A93C37946E37209F371A74908624E82F127243E9F8C90DABAA9ADE37DF177DD10D9E7C62945" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 167, + "testType": "VAL", + "tests": [ + { + "tcId": 3491, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B2449114D06A8DDB8705E7974F6D3E0E", + "z": "FAB53D203DC0EA500600D681B49008E30ACE16DC0938A37C7EA669F0", + "l": 1024, + "algorithmId": "EF746C4E39654C0A1928018790C52625" + }, + "fixedInfoPartyU": { + "partyId": "807263056B72F6C5E448B30778045797" + }, + "fixedInfoPartyV": { + "partyId": "ED3E5D68A906613D903D4FB6FCD2A4FA" + }, + "dkm": "BD4B2C74061FC5268C7798F88BB2E8B323D0162C4D01957E4765F49AC240739E396801CE87E9572AE0958497855164292759F688A79B58A0DA7565114E91ABA018D7C6C5763BB88CA63275180CB3C27D7C9F9DD7B00BB06606FBFA0D639FBE1DA15726ED9ACEAA2F36F2D4FEC542CD116639D27829362E0480F54A8EF60167B4" + }, + { + "tcId": 3492, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C7A2233D1D6D715F99537FFBFC05CEE3", + "z": "32C0254FA97DF89E62877115234618A3317E4031DA47919A962FB9FD", + "l": 1024, + "algorithmId": "78086B01C71F66344F5CC1A41FBEA329" + }, + "fixedInfoPartyU": { + "partyId": "BACB2A8751DD723C48CA57C311113E54", + "ephemeralData": "94A3E6FE4E4B6D6C2FF38615D17546853B0529409BCB084A2B46F621" + }, + "fixedInfoPartyV": { + "partyId": "2E8375453609067A2E2DA8C32C73DB35" + }, + "dkm": "6AACD0601D95159FB4463233127F0AAEA60CC9BC30D28622CAED0FA4C23B1F5A1AB63EFD89267E04D61956A7A347E68CDBA7BD3FE3F0517F9A28889F2B4B180748F88EA0598AFE583A07A772ECB8ED8692DD00640C901305046617DC488EC30BA62659D5A0F496D6796916930EC6706121CD28832D54BF647522FB4188DC5705" + }, + { + "tcId": 3493, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E41F9FD35A2652EC4FE8ADED92B5228", + "z": "8DF7593FD42282617680A735F07FB3101A6DE145787D8711B5A3B912", + "l": 1024, + "algorithmId": "19B5A414535F7AB371F5C5F3251D3D5F" + }, + "fixedInfoPartyU": { + "partyId": "FC94B3D4A10700015B41F038B973BF23", + "ephemeralData": "9F35EF24711FE1B46D8554F090B876CE968F0DCB7956FFB1E67BB3E3" + }, + "fixedInfoPartyV": { + "partyId": "E26D401CC072A67CA55BB725EEAEA1DF", + "ephemeralData": "E24A14131A1670A05F2999B7C9C1C2099402688E0E5EE3104E8A32C4" + }, + "dkm": "8EE124F7581D96A4AA4CD6A6E09BEA9FCDCCD95B27D0FBBA37C8BECFF2243889A69396B72FA1539731D57560AC45C03A1E1FB5D9B3AAF01E283C88BB808F725EF67B6DDDAD2B6872C1664D99C2FF756A7006DFEA93BD7AC0529944873DADD8C4AE6EB3754A8E96ED4F9906562941379978B8BF374E70D153A0E847EBCB58E923" + }, + { + "tcId": 3494, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9F4A380129F48034AB2F3DE5102783FD", + "z": "674722AE0F7277DA17FA8B7628A37252D5D26445D6A59887094B1D20", + "l": 1024, + "algorithmId": "B02D3CB9D8AA0F81E18FA7E87BCDDD4C" + }, + "fixedInfoPartyU": { + "partyId": "81CA51DE652923F09BB70BC549DF65B3" + }, + "fixedInfoPartyV": { + "partyId": "51655B3CAAA9C4333D76B3CBDCC1585A", + "ephemeralData": "0D46910B69B2E78A85C953A4F1AC89389562523707BB47108884E023" + }, + "dkm": "51DA729F72BAAB7FA91B0342F1453F7403CD36BACF6280D3D624A415D1631D187E096CD2E82F7561F25712EA73FAAFD663FFEFA177DE0CA4B9FB3C58EA336A4262B2F61973C780F5D085F5B994441476164C462377C63FF45B846A335AB16B34684567C06B0A77D398481A08AD2B63E3217A253F9FC076425403D2A574CF0F54" + }, + { + "tcId": 3495, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1BDEEA3FE2C2C45ECA7623EB30782BAB", + "z": "E697B6B6427C53D3A86C2FC09D7B8FB98BBB2E36CA6EEE34C561A026", + "l": 1024, + "algorithmId": "CE5A396A17C568CC5FFB7CADBD4450E8" + }, + "fixedInfoPartyU": { + "partyId": "14D26A811DC9BB13AEEFAA89E11F18BA", + "ephemeralData": "6D2D7C4DA3FC401EB84553C02F8AC461CF39E10F2408F931C7CB23AC" + }, + "fixedInfoPartyV": { + "partyId": "C87ABD171F882194562DA1D71BCF4CA9", + "ephemeralData": "CB9E9A3497BFF81E12C37B9BCCB47927266C045B8C16C1EE3FF7B2DF" + }, + "dkm": "E4BF54FBCE99C295B7F8573CB24B08237B31BC49B0ACB696DAE54530A0DE43D0208CD08B8EB0ED43CE3813586ABE2E5C3B93D62D029D34D3F56AC3EA3726D2FB2C7190F5D1E200516F015AE072E47FB8CB62080424B7940844171D685D6A0F1E98F5F67A5CE1219C6D61183F453440B1A393A5B222E69800E0A3054715AFE034" + }, + { + "tcId": 3496, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A27270CACD1C01EE4CE24CD8296E922A", + "z": "38AB520E3453672725D3E9935607B5194927A067088DA364F2E47A94", + "l": 1024, + "algorithmId": "CE15F7314A3D7FC1DB2307399A9FF181" + }, + "fixedInfoPartyU": { + "partyId": "38C16504876A2312B7B69A0C501055EA", + "ephemeralData": "7F704350FF7E3CD790111D55F711E3B0262C7B4C9DE139C6F9383299" + }, + "fixedInfoPartyV": { + "partyId": "1FBFB22E1C243E721F750F1BA5C1204B", + "ephemeralData": "F91685F16EA10B86B92C5262C882A939B35C4DA7B047AF8F583F6290" + }, + "dkm": "F9940AD6A9225AD44681BC630D77637F91B4C37815E32DD5C276545E182675E8A07708DC9A894761E4A0CEF40EF4634C967F067BC4CA0FC763D800A26855D43FE589092E64E1E8CB2BC39DB31864B8DB2EEE523E8505D82561EAB406B9F48D04605DEBD5A7B27F5C924D9850A68A6B9E3ECDB3C5C80C3D8B2C61435E53EFD4F1" + }, + { + "tcId": 3497, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB882E6F447061465CBE627B9FFF7E97", + "z": "DC33EF7356BC89B12E3ECAC7E6A3C97AD4B746C7AD6001F5F8B83D97", + "l": 1024, + "algorithmId": "EBE4E0857675C8058ED7753E7A4C31B8" + }, + "fixedInfoPartyU": { + "partyId": "35D7511E95F6EC2748DF9A3FD71F9304" + }, + "fixedInfoPartyV": { + "partyId": "CE068561800D2959EFA57C8ABD7DE2EA", + "ephemeralData": "D170E6E77A167A1EB60D88AC86B15F10A8D4DBBE5BEAE094E02734A8" + }, + "dkm": "08A096A48A41B0689F4F0F7737882094C89181675A9E17930F1E8BEA8FC7B4818A622E201014740E6B20862D6E3B095D7992164558F51282F233065475CDEAEA242F917A4E352CB5E3FCF217326639E4024F83BEB0872E9F0E58CCCA8EA3802AC9A2AD9F8BA6963B0D87CB8BAB6F1BB888AE330B64E96E29E42973565239B23E" + }, + { + "tcId": 3498, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F20A50C433411F6594F8C3F4831487B", + "z": "C1DD04BA836E91463518864B8EC7CBCED09B72234ADFB801D2748257", + "l": 1024, + "algorithmId": "7F276DB59CA2FF49302B92D2D35D0A0F" + }, + "fixedInfoPartyU": { + "partyId": "CD25E769C37E54F8324472DFA424E85E" + }, + "fixedInfoPartyV": { + "partyId": "DAFC18F113C6E9EB8C85F7A5492B8A7E", + "ephemeralData": "7E89F4189EF0B878B2793B92A16C5FCB5508F69595865BF1F64E3AEB" + }, + "dkm": "4E2447BE3807B569D2B0A00EE7A1ACE8D884F29A425A2DA4C2D466B2BB670EF31DCBCC41D250517979DA32B080DF4900F482316D11D33FDBFD0DEE001975A866AC3A329BEEE749E9D3FC77ABCDF8961161554288D2FE8BC7EA9CC3B33F5161E5D5202F957034AC134AEF78E5A8140C7B3A8D92A2BC2E94C2ABA94FECBCDD7FDF" + }, + { + "tcId": 3499, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C9289458F145DC1944343BEABFCDAB7", + "z": "6B93D3639438A17A534078497D25A90F99DB987A6CB957AD4FF57E02", + "l": 1024, + "algorithmId": "9726A96FBCE00F32352EB2C85467A6D7" + }, + "fixedInfoPartyU": { + "partyId": "263090215FE9D6B4F1B9447CA8EF9F9D", + "ephemeralData": "8E72C834F0CB1D33A8DBCF4EC4DAEB604660213F49CD4597371784A9" + }, + "fixedInfoPartyV": { + "partyId": "233C5E225905347B4EB92D1271EA32E0", + "ephemeralData": "C919498B313334EF360D693ED3CE0227B98C337D54C0D29A0FEB54AA" + }, + "dkm": "DC06B470E5DB1F94BBED29A85084386AE714546B052A863F26B4CF0CEF0BF6A5E7F7FD4918B320E57C4F6A825AC17A82ED6C7596BF2E415C8341809D8B74400162641C74A42088C4F9EA3D552D11184F897CCDE7F1FD5C4899EF600D6E2FF9D163746AA496C4A280CF36589B90FAB7CAC47ABC8B8E9D7A60E0F179AC563351D5" + }, + { + "tcId": 3500, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BC7D80C7EB3865DC6F4CA83A47933A3", + "z": "4D800C9CB5D344E628C029AEEA16D7602FAB37F2950B02B8A6F33F87", + "l": 1024, + "algorithmId": "A103666B7EED39CD71DCC5D4DDD3907F" + }, + "fixedInfoPartyU": { + "partyId": "4BB2E427A0E85D722CF7A171F4655E12" + }, + "fixedInfoPartyV": { + "partyId": "82AC0A3E6B42659E18E3D0C86F8566C4", + "ephemeralData": "B43BD2DC828D49DEFAA5D7968792010020405178EAE0BEBEB6D29483" + }, + "dkm": "64835608BDC3D58E8C328EA697A4853E01FD9A24FCE48A44BB05A300D85A5870350FA4E5AAC5EBC10DBA88BBDBFD6B09583A937635507BB16ED2D58C4FD569D753BD97110187D35013ECB67024E33A5B61AB2855611D156F60643622B375454AA42D759E44A83919A83691BAF4AAA8BA1E75F345BB9B68A0D27F279338BA01F1" + }, + { + "tcId": 3501, + "kdfParameter": { + "kdfType": "oneStep", + "t": "495FD3293FCE74D1449D371F8BBE852F", + "z": "11B8B41E547FD269535BF47881BB2DBE0FC4DAB3F711614AEFE9F780", + "l": 1024, + "algorithmId": "AC561229692D37A0876894868AF9BB8C" + }, + "fixedInfoPartyU": { + "partyId": "44D8C674CE61672831E8E3D7CC5D28C6", + "ephemeralData": "9211588944DA37F77C8A31FFA895D09477ADE00C7835C74DB8A4868D" + }, + "fixedInfoPartyV": { + "partyId": "03CB5428617858142E90E13AFAA3DE8D", + "ephemeralData": "B8A694673FB23DB23D2DEAA3B6F42E60AB557BC84D947425CB9694B9" + }, + "dkm": "C749CC473FB7BFF652FE3DA2A0F5F77EE2793F31E4030051A42F095E58BCCD18D2E3726C4245C12F8BA99D05042B2CBD9109D167A4753D5F5DC7E4BBFCC98436483476F9C3C2EE0E96D5AABF1A4B2CF82A1D69794EDBCFAAB168616F2593579D030BA9109C8A9140C5FCA94A13AF3029DD2B7D3E9FA5C3398DFFDEB751FEA789" + }, + { + "tcId": 3502, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6C001AA5E19C1E8A056873C4F8C9F0C", + "z": "1793221307CDD06292F2F9177F4B3C35D8CAA8F6244F9BB04710011A", + "l": 1024, + "algorithmId": "F05D70A78EF820BE3220F0D97CC3698F" + }, + "fixedInfoPartyU": { + "partyId": "935868507040155FA574425FBD88C2D7" + }, + "fixedInfoPartyV": { + "partyId": "088D34083449542E0EB0479A76AC6B7E" + }, + "dkm": "04FE06A208623E4E3D667D48694E83B85BB6762EA084DEB99A5F24669CF231DBE73E472CF2DE57B1D7BAFD3A0E5D297602363322F7E6BEAE09B76AC18035639FEE1804E1655F2FFBCA2A1D961ECEB6C445F4DC86A2E0DD9530D968C665E301F3B1FA9318574AB825F6AC3A898CC77A3411F51564936860F3FB7565DD799E2DD9" + }, + { + "tcId": 3503, + "kdfParameter": { + "kdfType": "oneStep", + "t": "984442B8D4072CD4CACE2A5D22925FAA", + "z": "2331FE4006E80C76EC07236306DC46836A428DA68F2036CA80F2BA8C", + "l": 1024, + "algorithmId": "D11F67E20B1C7E009D30DD5005C90E31" + }, + "fixedInfoPartyU": { + "partyId": "D07C033E73069E75277F843ABDE55CD6" + }, + "fixedInfoPartyV": { + "partyId": "04CB3FEBD27F21573B947001508E4763", + "ephemeralData": "FF62E28250EBD5D3A3B7DC1E178F73AD931DC491B4C6FE3084A749B8" + }, + "dkm": "7FA36580CEEFBFA27ACE125E617A26638086C1275F4A947318A7E96121AB58ECDBFD244AD4CAADF08561AA3159D4C878E5BA98E146D1BBFCD2862CC5F9939B2285C0E34AFF25A4038D81C463D40380FA4902F6900D474B73048A605D6C1B83EC1C1C6A45B71F979DBFB019FCF45CE3A18E16C40A2E70D536DA79841B6591902C" + }, + { + "tcId": 3504, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FFA2ABBAABE88129925713C014A31732", + "z": "45D43AB0B06EFC043BE3D4D87B6817163292AF16C1A2BDECA52FB023", + "l": 1024, + "algorithmId": "7B541A9FBDDD60BD4349B7C6FECC08C3" + }, + "fixedInfoPartyU": { + "partyId": "11FDE275758EAEEAEF99DEBD12899DCF" + }, + "fixedInfoPartyV": { + "partyId": "E8B1F47F4127FB67C8E5D36C18127C24" + }, + "dkm": "39E7D60C857CE6D9F6965AE6EA8AC82864BE3F232DA177D582C162D0CB46FEECD66AA24B1E83429B602A2AB3C21B061D62B18C3B52F67CCA7A6AEE2C910E1F6A46EB80BBBAA50ABAC586DA780434629B1E40D5AC622B694666FA86E0EE0DD923B35B1901B798ACD0BD532241D3F204CB17FD151867351D88CB761D69964BCCA3" + }, + { + "tcId": 3505, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8BD51326DCC15054EB36596BF372FAD9", + "z": "7DB6897D3C99CC8F26C94B08FBD771D684F7EAF9737258BD13253AE7", + "l": 1024, + "algorithmId": "5EEA66910B3ADD04E5B32B30F499F4B6" + }, + "fixedInfoPartyU": { + "partyId": "87E121801AADB32A8D68AF08F1BED76A" + }, + "fixedInfoPartyV": { + "partyId": "1E0379DF81EAF87E73813D9D4F79E471" + }, + "dkm": "5FC92F348EB30C3AD4822DD1D55CBD6B09B2661BB20774940F1A94F9FEE1722F3E1C03684637C4F573095ED2ADB8D88535540BAA70017AEF07F5C53CCC03A384F421E54C13841605AA2F4D57033BE856CBCE5F6BCB3876F667A686B772E62082A11CF6266DD672DEED78543F3949FE77F78380938EE7D566284D024A248F720E" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 168, + "testType": "VAL", + "tests": [ + { + "tcId": 3506, + "kdfParameter": { + "kdfType": "oneStep", + "t": "64E6A36A823163D28EA4B20328042394", + "z": "266FDDDAB806856A297952FAE60FF9EDA83705602780D136F623BE0A6BB1861B65", + "l": 1024, + "algorithmId": "785D2EA1A9480C13475CE96957F9CE2C" + }, + "fixedInfoPartyU": { + "partyId": "5D716724E0CD31E164890CACA88543E3" + }, + "fixedInfoPartyV": { + "partyId": "62591C6BB88500870CC96A7DD6A97CDA", + "ephemeralData": "7E731475AC040C249BBCD96550C560FFBEA81403059985C905AB70E0FB8F801D43" + }, + "dkm": "0696523D3893B906E6E829B141BC908030DF39A31FDF01D6AE9A4B98A6601A7B8E756038786F855D563AD94DC0053228F2B862B992A986D16D25C1E0164F3F5D6042806037F6CD6F715B8C060954A7E20177D62FE95A3522E928DC36BB197CC21A850E74422ADFFE8B8B4B4F25C6905A83BD0DDE5EDF16F9081DCED960C2D93A" + }, + { + "tcId": 3507, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3E871EA9E97918236A7EC54002591A9D", + "z": "FBDD88F549AEE651B29945162EDAB947686BF794A3C8A190C0B6D9A5D0AB611D95", + "l": 1024, + "algorithmId": "23F84628D53683FB31DFC2C70ABB305F" + }, + "fixedInfoPartyU": { + "partyId": "218EC6B624AF42A340F7534CE50A40F8", + "ephemeralData": "8C588BFB7595D48B9AC2F41B85EC54ABCCC308CB6D2ABF7FF9C7D87E0FAC646281" + }, + "fixedInfoPartyV": { + "partyId": "A776351538D3521E32C1E84F7825743B" + }, + "dkm": "88316341D0D405976586E3B707114F3929D2A3C09A87AE5411D96CB9C2A603A16AD2575298A4611EBE1F66D080E74F73B00A468A578F1CCA5876DE2A1FCD27C19BC25A21F176C5C73B657F2A78359AD8292914333DE0E747F173E36EB61E32F1063DA8A721E8B6DF7EB9865D031E200804D15E3A79826758EA9240E2F6F389EB" + }, + { + "tcId": 3508, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D99094AD6EE666C374C25072D5E3A90", + "z": "68D86C5E1653B4A0041D29103F348121B3FE3DB99F228313243FE1A908175DFB95", + "l": 1024, + "algorithmId": "70FE91D1F65602E2B73405BA21D85143" + }, + "fixedInfoPartyU": { + "partyId": "29B3982AA1F4081E58E768E734D56108", + "ephemeralData": "290108DA7C350721DB99B8CCCA675796B9ABA7C6288EF467123FD2840D65882922" + }, + "fixedInfoPartyV": { + "partyId": "4C42F6CAF201D4F402DCFB034F433B27" + }, + "dkm": "F8313E38B7220945CB178FDB912247B1F80F7C82894CE42B2B6D4259ADB03A9290A1F1B51D091ED22DAC0955630B1B478B5664C8D8A6DD12C1B30654D21D2501F524C877D020405E09C08F6789DF9FDAE0377F922D0730C31B3F0E6DB5BD1B69BC0FA45EB75E990E967AA59423412A5A102CE29B3E2E6B84D740DBBA6335380F" + }, + { + "tcId": 3509, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1F42DB275861BF54C759D47B910DA8C6", + "z": "CF4081AFB9B70DA019C0B86CC9C48E052110C300D432F3F6CC39A541A1263EA9F2", + "l": 1024, + "algorithmId": "CFC9C56F6C09121BA9071A7661677395" + }, + "fixedInfoPartyU": { + "partyId": "FC53F226E185C4D303842DA286C579E9" + }, + "fixedInfoPartyV": { + "partyId": "B3741C80ED34010D7EF085567E4D2136", + "ephemeralData": "2E10A852154F2C9508D4F49350F2607968BBB9ADF2DE33A7F5C009D87E89FD86EA" + }, + "dkm": "89A771AF90E2DE8B45419B6307C786C5F7591ECED0047A232EB2BFADD2F1606F1921A1797FDD185D411D31D6D86359CF881A44BDE94D171481F03351280032E5389BCCB78B3596571571AE3BA31A8DA2D4BAE68EA986A857815E018759723AFA4079C2501E9FD9A6814754F899727184EA3A58CE50A7E0CFAAB36D101ACB66F4" + }, + { + "tcId": 3510, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ED758E8AFF883F15FBF1ACF2E8CEDF3B", + "z": "4FA58019D8E8751E4C3D5E31839EB4F3E381FA8A2D95DCBC21A689D5A0DE4B1A5D", + "l": 1024, + "algorithmId": "DE5E6740451C7A6BFADC485D6BE57D88" + }, + "fixedInfoPartyU": { + "partyId": "FA58F3A5D7FBB442BA6605605A28AF2E", + "ephemeralData": "23FDF5E604C302F7CCC0FD65461B0DD947F98757CB067EF0713159DFB3EE67873A" + }, + "fixedInfoPartyV": { + "partyId": "745D76B3E714EF28CFCF7A1675E8A2D8" + }, + "dkm": "AB752D5F36CFDF16D76A4D1EC1BBDF421DEB0E2E17CF4A7057C6C115976F95A53CE2B0D4C7732AC3EF9FAAA55D8F959324A9F6C36856EF002B94F69274090A36C34E8ED1E0DDFFF8046721A6D61BEEE7B39DFE1927C014874E80D170742A28DF70BA30F1814EF38DFAB2736C8B034BC292E74413370BE262C05EB7940E51C157" + }, + { + "tcId": 3511, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9709778368BFD28037BA2C92355AD156", + "z": "833CEF37B4B3F3DE8169F62E3EBA4E299FAFD46025CC4498827307968C1E42939C", + "l": 1024, + "algorithmId": "DAC8FF1DE33B447A82291125398FD8CE" + }, + "fixedInfoPartyU": { + "partyId": "A3E4F6F8D66731A099283B44EFEC07A3" + }, + "fixedInfoPartyV": { + "partyId": "532B4169E57447656D831075FB47B197" + }, + "dkm": "92737E0DFC58EE594ACC275DEEBC55E35F357CE7A321DFBF342ED09C79C4E22C2216ADBA31685DE9DE8BFDB0C65C37BE71D0AC28679091EC8968C34FBBF261ED8BDA3EC6FCDF007961906C7957AE9DA47C1361AA4DD471B09443154E3B74FF532FE7FF409EAF108FF30CC700C4EF96E248FA0D76ED30EDEED98029B9A9FCE25B" + }, + { + "tcId": 3512, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91FEB64E96EB15DF15CE2B62F36B48A1", + "z": "627496B1A9A17E444B0B49B2F2561924965293D6C278191A34E6CD300AECAE4CB8", + "l": 1024, + "algorithmId": "55FC2952D3C0602AE44895B75E5A1937" + }, + "fixedInfoPartyU": { + "partyId": "820952551247BF857A714B107B061B2E" + }, + "fixedInfoPartyV": { + "partyId": "A484823C2BB1C5A1A203059FA89D2900" + }, + "dkm": "C8581C1101A1B9A6D4808336E6A7DF9FCE4FA1C9B9027E78D6B18120AA4D2167CCD9828CEA01245AD2E0EF549679F865307664B21C0FAA1D0DC3F4F4A47E446D3479F5CD1B9AA56DB314ACFE707A1E9B1C2A0E0E0137A9CC14DA1834E20F21E60EAD86B88FE8688943A0D6DA55D6DE209AAEB319CE84CB4C2C5E1EBD1423D62A" + }, + { + "tcId": 3513, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D11AF8E4BDF4AA36593BE566FE2BD934", + "z": "112F226B974DCC8FD85E71873F5F5C0C2C011016041FA35690EF82DF8A520051C0", + "l": 1024, + "algorithmId": "25EE4690BF7A2C2706298CF802E91343" + }, + "fixedInfoPartyU": { + "partyId": "9A1F551C420F6E3C56559B9B453EFEA9" + }, + "fixedInfoPartyV": { + "partyId": "743424573413FA7AA2E03992BB9BD890", + "ephemeralData": "CDDA49E52242A021A25EC51756934ADBA4B3AC3ABC1B62190208077090BCD2185A" + }, + "dkm": "6769F9DADED2BD3B61E09FFE6FBF356A75DE6FEBEEC7FB046B2B9E4A12E57D8118C8D087854DD15F66325650D5A85E0E42CA248F1CF738C667A48E9859B1A94D695FA219FB9A1CC4AD9FC11FFFD59C66C215477C79AB2DBC3DD0885B0D62E155C7A0120C8CBE0488055D222720F48E9016F37BDBB581664612EC85706B9E5F24" + }, + { + "tcId": 3514, + "kdfParameter": { + "kdfType": "oneStep", + "t": "968744F4104C59529D489206655ED34E", + "z": "D1EBD355CCC6F52BDBDE7CC4EDA5899287DBD8BD9C113D753CB7198E4C48F58AA2", + "l": 1024, + "algorithmId": "73E3900484D25930C766192047C92470" + }, + "fixedInfoPartyU": { + "partyId": "81950136559029A6BAC0279A9A79E23C", + "ephemeralData": "455F2AA489EB9B46EBC96BED415EDA5F3F51A2E6EA5299206D170EDDA8E1BB6188" + }, + "fixedInfoPartyV": { + "partyId": "EE42BC6726062D836A0494EF3071CD5B", + "ephemeralData": "FC598A83A365C0BDF4D6CB4F2031198E0D3AF6C88E234161F6F1F69B2F22BAA1F6" + }, + "dkm": "A2D11D7B3F09177FDA1B1701C207A49CB274591828FEE69959CAA12B21A34324061BD976694FD4BD5E1E85B29B1A7D8A30C0FF223F9BD588DE73F9DAD9075AFD93127FC8D607F4A7694CE626BA4B4D80EB2B7245B86FAFDCB5907289BF398BB978B1271F2958C732C933B58BCE6D5299CA915F24CEBCBB15E956027BE9ADA477" + }, + { + "tcId": 3515, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4298B559285F8025459AC5D9D4CFFB48", + "z": "0031299237171F1A04443E2802AF44C3E77613CC8853DB3523848ECB763ABE455F", + "l": 1024, + "algorithmId": "C162F4B454C998E683BA9698445F9E09" + }, + "fixedInfoPartyU": { + "partyId": "6D59BC46E9A4B04B6C7C4A27356FF587", + "ephemeralData": "A9C65DBD5A9977B643C778C040A4D70052AA0C914C77AC5C367A07363FE8719640" + }, + "fixedInfoPartyV": { + "partyId": "981FFFF4CFEEF1BB67BE4717BF92524E", + "ephemeralData": "0157B74EF88ACE853C18B93BEB793EFECEE6FE79206DBF89A5A91D7FA8C982BCF4" + }, + "dkm": "0FBD8B088C282D7375843E6B4842464ECED3FF60CCC79B7C846EA3F262502B05B577F6CA3B9D3AA98689F76D26118806861E505C2D5753DA196350A24E2A11526F69AC8DDBA87676C872F2AFE6F01D43C0223629121FD3F98976E2A29394CEFD879FD007BB7865EF9D2EB8522179FDE6B778CFDC51DA1FEAF8BB849FCF5A5BEE" + }, + { + "tcId": 3516, + "kdfParameter": { + "kdfType": "oneStep", + "t": "519A20C371502DCCBF8622F72FAD1075", + "z": "A0D5CA077116EC2691EEA889FB8DD9BC22B568BDE64E50E256FAF3787133167CBE", + "l": 1024, + "algorithmId": "D668E1B2466B3BF68E78C144B8E61810" + }, + "fixedInfoPartyU": { + "partyId": "C40ED937D215D8B31DFD6535CA358819", + "ephemeralData": "52DD4C5A1B93B04870DC56EDEA3334CCAE7A174E89DC8C4AA128D334550D46074F" + }, + "fixedInfoPartyV": { + "partyId": "FD8A2A40711A93A26253C4938FC3B8D5" + }, + "dkm": "0709A5FCCD49AB0C84D845F4CB4847B31BF930329BE8BDCC54EC4C94C7114CEB8073F1267A600393A98528799A47C71D93119E2FA8F2E8B47BDC37279B52A08AEC9E298535B1364F042ED96958603181916EEBD1678BB3D3DD237C09EC45341095DC443AF1E22FA3B5F56743EF4B164051AE0944BE8555A3C2B39AE8AB494C32" + }, + { + "tcId": 3517, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63849F89A9A9761063B71DED6722F9B0", + "z": "CBBF8370B7F4213A73E860B29C3C3A79124B9A3557605E8E09EB9497CC82A363FF", + "l": 1024, + "algorithmId": "C257A9E989DB505E0D1A616B319E2B05" + }, + "fixedInfoPartyU": { + "partyId": "DCDB0C57BE5E5D366419F5D505858977" + }, + "fixedInfoPartyV": { + "partyId": "9F0B99349F75920EBA034DC748640F97" + }, + "dkm": "8A559E3DA83DE68B5626FDDBA431EEDCE4AC077482922292710719F30141F3AA606A56BC6144BFBE619D738EAEFCD91468E403EA71BEC006F6553E68B42381AF43684E882F08B553F314F2B319B891B3E1C2E9A13FC72E8F1D92DAE574E525411F923E76159D2B8149114DF4BFFB184739AB9AD637ACCCA230D07AD5D8066723" + }, + { + "tcId": 3518, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22906C0686CEE0A1A95308C0FCA71787", + "z": "66BCD31D8AA8BFF8EE5197C3B383F729363272ECD1C6BB6AA96343D869FDD51001", + "l": 1024, + "algorithmId": "3854AE4EA7A2F729D9A4598860A2425A" + }, + "fixedInfoPartyU": { + "partyId": "6DB4D88D4C565244D3AFCF57D83EA680", + "ephemeralData": "3B0A20610541706EAF485ADE5A3446515FFE978CD89A18710E83783D6F0D75DC50" + }, + "fixedInfoPartyV": { + "partyId": "BFC66B39965E4954C568105847F6CDEE" + }, + "dkm": "D0E9BE3AD52718824AB2564C7BF5D5EAFACE78866D15E210DE822127FF3972DF99A03D4B08FA3D4FCEF239FB74990C93CEA85DF2487CC86A2948354DC574DBD3E84399AB969BE3FD1D9A9EB7A0A17822D656E1C093EA942DFE21869629F248140D67CD179DF658C6F5C2877B56CF2127C501950E6C1B490EB98371B5336C8D7C" + }, + { + "tcId": 3519, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD60A9013A65D0DB2CFC9E0E2AC5B303", + "z": "F2D7982385C0825CA97D6E6921E63DEFFFD91A04820A00CE26F44D2AAC49D5A427", + "l": 1024, + "algorithmId": "6DA673C621DE53819A5EEA905D88A61B" + }, + "fixedInfoPartyU": { + "partyId": "B6D7AAF29D4003D165D8C05C9D21F911" + }, + "fixedInfoPartyV": { + "partyId": "2935026F8DA850A05835BEAB7A6C113B", + "ephemeralData": "740A0161D82F6FBC45EB3B65786B86E8F909AAB2B6E02E655080642FA23BF80A70" + }, + "dkm": "9505125B89ACE0A3955D6905FE03BD4FA690DC68AA01DB24DF575D6F1A22FFB9FEF8404B76F62C6A8FDF74EFCDC4796EF9870A5CBF59D2DCC8EC8EE67EE1D328EDD857A7461FEA0DCF08D93FD0FAB54E2759C94BB52C356BD6EF02C67C46C8A83006A12045C74C92E32AFCE980978BD76DF78F09478AD882F60E0F91EB1C872D" + }, + { + "tcId": 3520, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28DA07047B5A8722213CFBF61765F1CC", + "z": "75A3DFBC038C3E8C41B49F55E6CC9D45647798571C33FD1A05766A01A0B97D8A7D", + "l": 1024, + "algorithmId": "A8D2375764814FABE4375D1461AE7DB0" + }, + "fixedInfoPartyU": { + "partyId": "EFCB0509FEDC11EE86CB0718B9CCE659" + }, + "fixedInfoPartyV": { + "partyId": "593A4973DEC21377C8EA28410E6ABE16" + }, + "dkm": "D7C53B301C90CE0CC3221256E72DCDC0C4275CD46575EAF70919720E85B76F4A31271344F008D0301179FFC43D2520406AE5822D46F1359219F9E670170F1F6148E2E3506F95FC7D1104DF41878BCDC597EAC79071CFDF14B5903FE0EE94AA98DA02142A3F5CDA967FCC569A15CBDAFE400F83F321E7F64018C58350527E2760" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 169, + "testType": "VAL", + "tests": [ + { + "tcId": 3521, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E31392E529678E5A906CB284C8E0607B", + "z": "523634B7983C82B82CF36600F0C7EFA48EC7DAAD46464AA1411EDB40FBA4AB", + "l": 1024, + "algorithmId": "4309E04E1766818E37609C45F2CCEE6A" + }, + "fixedInfoPartyU": { + "partyId": "B5BE6C3D7E3F1F5D68C9E4A96B826EFB" + }, + "fixedInfoPartyV": { + "partyId": "136C89869FBE4378B87C12A21D3AC300", + "ephemeralData": "95D6C90BA031B2055B5934FB71B60586C34BEE7427E1935E26BFE45C583E4A" + }, + "dkm": "FE82C7CA455E66C2CEE9513F636EE6105F18F981BBFA643E7663EE215F3D13DA8D2BC8AF7A29939B1E66C4EB7F2A0C13CFAFFCA49DCDB86FB4F78C6FD558614FDAA7BBE9C17237A5085C9FF623F9B5C87B329E52B35C013DB962F2C99A48E29E9D80167D12831663D80448773B60E71084347FEEA97EC10110B275B3E001B00B" + }, + { + "tcId": 3522, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6FE819A68CEEF3365F0062DC6F42419", + "z": "2366372F2D39F3DBD01AF27F6CF736F61F3E1E836BA340D6347CE8E00EC94A", + "l": 1024, + "algorithmId": "7BECA731AA42623BBDCE051F619FE4E1" + }, + "fixedInfoPartyU": { + "partyId": "466D9B8A851EF09C930C99675F4B63B9", + "ephemeralData": "404694D48FD0642A5DB7DED31FB180D99F044FAEEC33F82F037E14A231D8D0" + }, + "fixedInfoPartyV": { + "partyId": "4DE41F656F3047E5A480345E5F37F385", + "ephemeralData": "0AF747AD8B390CFFA540A417BB66F2B19A2EEE443E077A1917724EE90AAC7E" + }, + "dkm": "54605157BF247BA3A5F56665DC8A6853EDD5E417B08886E7BA1A714178947E20A00BECB89CC60BE16F5BA89C84C050DD27EAC9572EB4F63BE983F976C04A6E33E96B77C263CEFBD8E737A07DD401BBFF85152967E5EF4C283FF68097A4BAD63EB2159AEDA5191097CA8BEBD06BD970B901BF4204813EC1A90E74D3D79E8A8867" + }, + { + "tcId": 3523, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BF53DC2AB3862B51D719E2BA72FBE07A", + "z": "1D78F9201FF4FA8EF4BDCA39ABAF7CD7F243B9320BF3C32BB05BB9D51D40B9", + "l": 1024, + "algorithmId": "87D80BD859294ADD482B804B71CC1370" + }, + "fixedInfoPartyU": { + "partyId": "1DE6D7C6AFD02F1FCD02EE98A06AF600", + "ephemeralData": "B72D0EF9098CE279E95AA34F3B0AD64A31903BC5DB8F4CFBF51A307B36AF38" + }, + "fixedInfoPartyV": { + "partyId": "E407275F4BA474DCCFA1414AE812D613", + "ephemeralData": "518A0FFFDA5F3A3409E6A729EEC7D71FEDFB10A498BDC5DD6ACEABCCF0649F" + }, + "dkm": "58C25CDDF1D634E884A2226171BA7A2871A58F2E0BAD86FD0BB5F7BDCD686F179C08AA258665BC73E65A602C624796CDEEE7CBB56C2D57900485A66E0DA9D2FC56168D346B9A364A982D363E7A2A73EAAD7F5E31AED02F16C0F91706F855A0A60EF6123AFBD92546AFA9541231579940BBCA175820B79F3AEBAFEB88FD71C59B" + }, + { + "tcId": 3524, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA45355CE175D6E0FE50F9ABEB6E0D93", + "z": "EE8BC574408B8863E93A69DA9C97A7A75B69733FFA2A8EF68F39DE617CD466", + "l": 1024, + "algorithmId": "403D56E0DAC71D86DB11CDFCA68B17C9" + }, + "fixedInfoPartyU": { + "partyId": "B5AB8454C73E8B0940C19261B5CDD750" + }, + "fixedInfoPartyV": { + "partyId": "F3D85BC373B4F3E8DC9296B50A25B835", + "ephemeralData": "3046CC0C9F79D93B419A740A9EF1E9D71C4B418028227510FB2A3F4D7CCD23" + }, + "dkm": "9BFA8C31ACE88D344B8707B8E51DDCFC8AE27D6B182D5B52704B77842D6EAB0255C73645D1F4EFFA022869FCB6F1AF89E7C52378BE4F16DE70CD188CFB30A292894FC07055BC7B079505F78AF204D7FA9D5521896B031823E2AEE6FD3D01F8952EEF1719E9EFFC39BBC3063643F01B535BF9DCCA57D3FEE905FA40178A67AD14" + }, + { + "tcId": 3525, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FF63DC58B0D2253760052A5C53C5F801", + "z": "E15A8FCB7748D5C7C0F388298F22DD6B4C544D3662F05BFF21B545BC423D66", + "l": 1024, + "algorithmId": "31438A251D05317A3A0A62F0AEA8DBF2" + }, + "fixedInfoPartyU": { + "partyId": "13CFC86BF7C6D64CEC8647E8B706CD9D", + "ephemeralData": "FF54FCC25242365623639C4768C40E016F563EFCE77B7C72773A4D35D366D8" + }, + "fixedInfoPartyV": { + "partyId": "0EEF9FCC6B458E9350AB8629F2933506" + }, + "dkm": "B50337AC0F10DB7F77F76BD122D648EDAD4B9936FA2BF9D6EEA2DCE10276C22F7B7C8070B09459FBB66D20B661182F7980FBE4505B2C79104AEDB941B30F8608970DC4A4D2495CF9316F77A997B295515BC1AA24F4A93DE2426904568A258AD88D3F4AC28AA40AD6ED10AE6A3FC4E0C5BEEABF6393A960ACC9B2491CB914DD86" + }, + { + "tcId": 3526, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C68B056B37D1338A4CE37ECC59A7BFD7", + "z": "C476CB78DB1EC8CE03B52BFC27B0AE4262E06857617A0E57BB33291E458CD2", + "l": 1024, + "algorithmId": "A5679B66397AC46130AE9DAC656BAB4D" + }, + "fixedInfoPartyU": { + "partyId": "E38B1D524A4F03A47B4956DA67B3395C", + "ephemeralData": "B0B06ADBF8833565EC8878B41E05B5988C42580B5676891C9B8FDDBA898ED1" + }, + "fixedInfoPartyV": { + "partyId": "4C70F2DF504A17A97E09ED3DA7313A3C" + }, + "dkm": "37771B61D13FC5282F9F4CA1DF64867637ACB37E01058CB3FB479D8994E9FD2891325D52E1C3550B38ECF13900AED9549A15BE0A700051423FF8F8E980C80201FF2081FB4D9683449952C016624B1E3E7F1F66C597A2C10AAAA5C3063C42927653FBD684DA855D8ADCFD89DD3910E3F2EA57EA433FB94C448243939FA76FAC94" + }, + { + "tcId": 3527, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7D0DCCAB3960D8D20628FA2BF51B2095", + "z": "5A7F07C65008552B125F733BFA819DBC1FD8487DD18998349541B58421A083", + "l": 1024, + "algorithmId": "4C111E0D74CED25106B8679E230F7D26" + }, + "fixedInfoPartyU": { + "partyId": "BEAA29A15CE78A53968CFC6CF151C585" + }, + "fixedInfoPartyV": { + "partyId": "192CCFF1AC2FF58D2309D2D22A9BA3B8", + "ephemeralData": "BB62EA5C07DECE47F2B230E3630D564AAA0271038CB1A6EA11BFB3E7F7B84B" + }, + "dkm": "077BE7A6E4555FD06F42DB16C0114A5199E812FCF577B8148894E0F5502C14D40A723991C29BFAC566636313C89D222FDDAD4969301BB3D9E8BEEE1099C282E8DEA9EE827CCC9593BF54194E31907E40C174A7390FE3D96E359737A3CDF731A1462D7940B07CBAD5B8AB8B5ADBE48C7E5566BCBF6EE965EA3D6F77992B353DA9" + }, + { + "tcId": 3528, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4391BBBC248193CE36CE48C3380521E4", + "z": "47A4C00C7DA4C39509A5467C074A8847EE67C2CC11F93104F20D5E3A814EF8", + "l": 1024, + "algorithmId": "057C29AE6C883D7304C842A04BDB92DD" + }, + "fixedInfoPartyU": { + "partyId": "740237CA07002ED7A641A7607444ACB8" + }, + "fixedInfoPartyV": { + "partyId": "8C43E690B976EC4452FD15B3729C3AA5", + "ephemeralData": "4847EDCABB1C21479704D50886671630C15E3F9E454D30A3479F8EF27D1F59" + }, + "dkm": "0CFBED67717B7109643EF2DCDF7EE8C4B5E64BC0054DED493CA9FCB95EFAA60ACB24CCA1AFC6A6F437A5734A95D42EFBDEECAD91C5A932594D645D0FBFCEA834ADA39655C9C1E0A5BE800CAEF7131D7BB04FC0D1D5D581E59358C6E3EF447341E45F7D0671EEB4CA6E748E8A3C0DEA70CF587C171BB3E1A67F3B2ABB0AC95135" + }, + { + "tcId": 3529, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4570AC608E8EE6DEF2C3F31C46C45E74", + "z": "1A8353D9B5049A40080C731F2077572912592F5422BB419C7C6EC0478E56C6", + "l": 1024, + "algorithmId": "CE00B1C3281F54E47A12E1C094F65D33" + }, + "fixedInfoPartyU": { + "partyId": "C26FD0610428E2050DB8226C61DAE437", + "ephemeralData": "70A6074B3C1A699F07A5F75570EBA0BD49A2B9BCAD4E4EB9D2518CE83664D4" + }, + "fixedInfoPartyV": { + "partyId": "4C510AD41EA80792AA324DEF0430412A", + "ephemeralData": "9432874F4DDD406E70599E887B83DEA7B18614727E975C2F8D6CFFE4C046DE" + }, + "dkm": "618AF8CBC37C1467D9782CD47E09FBF95F192C772334FA12EAD14D6994A214FDE5807CBAC12AC5B7578E65B30DC3F8448C2D0906993FD3682B7950FB7B834ADE1968C93108D3376B44DE9D55A493FB68DB0F8E85DFBF59B34823911759287458494CC9B9EE9C116A6E5072F513A03F0408B1ACF1CD4D21C0433D60C482147BEC" + }, + { + "tcId": 3530, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F48FB9A60E7B7875613325510FC1F53", + "z": "BD6C20C8D718DC4816A4873F37F39719363238E9304B623059CA6BB75909D9", + "l": 1024, + "algorithmId": "B1BB31A68AA7994E57CD08805E6EF07B" + }, + "fixedInfoPartyU": { + "partyId": "1E2A010AAECCC6894503D79CB0775053" + }, + "fixedInfoPartyV": { + "partyId": "F51090F353DB11F335A809C4A6C9CE80", + "ephemeralData": "3696F228C6A97BCF478E16A3514782FAB2470CF6BA78ADAD93419A82C098DD" + }, + "dkm": "D08DC743E650F557B10D583DB7664B59228C79DB7BD8CAFCC63BEFD630646F018FCFE604CCF5DBEF26A04F864DD8170DE62A3B80C486782F00437046C83430401F2AA870F284E6D939DE5180240AE80D01191872A2C7011DFABD9F463224F1F3D2EDB73BEF00739F9C4F1105293227FDE6B02F8A5B4B3B8C558432967CD2F3B8" + }, + { + "tcId": 3531, + "kdfParameter": { + "kdfType": "oneStep", + "t": "56D6D0A1A774D79142C738729513660B", + "z": "97E204C27B00EB1F37E7F54CF699E4E5CF327A89FC89F5E7EEBBEDDE2EA7C6", + "l": 1024, + "algorithmId": "BF169CCC1259267FF97313B9D1A78EC8" + }, + "fixedInfoPartyU": { + "partyId": "3A720E09FD8A28A67B6A4B2123024FAE", + "ephemeralData": "81B31E7EFB27620DBE820C05057B11CCEA5B26DFE5C0EED34EB203C32F6A34" + }, + "fixedInfoPartyV": { + "partyId": "7F9C858B324FB49CAB949C35ADDD2A54", + "ephemeralData": "873350BD5168D07C2FB4AD48B4903E3BB5CFB7DB6122ACB154346C93F830A0" + }, + "dkm": "26A15DB9A6E7CC4BCF57CA04AFF60EAFE53A5754EB504D1F432C7D2D07F1A367163C57688144AB53EA5A86D861D08054C2A94650F3B366E2CCB27C9A43C1A7091DEE1AFA8135349B463D5DD548550A8B3D5ABDA24024541E9B1D205688933B601ED82FC982E41C1FCF26FA3C40C2ECD46243AF3D37C8907B66D3C95AA847FB35" + }, + { + "tcId": 3532, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F74238BE5473BE2B6D8A79FD943750D", + "z": "848A76FDFAF2B1CD004C02D5F00E90E7A7012CC84CD2E19CCBE2C563756726", + "l": 1024, + "algorithmId": "5D572533B83643590F6FBE38DDA88974" + }, + "fixedInfoPartyU": { + "partyId": "890F5BCDF8A6A92B97F4B0CB92C7CE36", + "ephemeralData": "7233535B2BC5769B37DB6E64F9154E5726CEE7D2B2A867D96C9F327C556094" + }, + "fixedInfoPartyV": { + "partyId": "44C4410764B85A2F04073416681968A1", + "ephemeralData": "5A2F76B60AC91046221065CD6A1135338611746D06B928B9722516457EA180" + }, + "dkm": "EEBADD590516DF518D6C9B12B864E7FAA01CA04DB4433DD29B025DC744569E18458C46611C7ED66022DC8FD065DEFBDAAD4CFFBA960A171A7821695D967E52AFEF4BE2CCDCFBEE58447A5B2D288F80F87EB1793710DD93006C6A0BFF4A65C79FC489084F53C230A6C3F60CCA4046D9CBA886C4BFFBCF04C23A8FB9E3B71529F8" + }, + { + "tcId": 3533, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4210F6FF500546B1E80D16CBD3F82AC", + "z": "8F1A6F3B214F417DD4F7418240A1293D37EABE092A962E916EDC2225F0214B", + "l": 1024, + "algorithmId": "ABA3D735088F636BFE0F6F908C6EC24E" + }, + "fixedInfoPartyU": { + "partyId": "6077A6D68EAD13D0887DE613BCBA415B" + }, + "fixedInfoPartyV": { + "partyId": "142232BAD2E4734D53939ECECDCBC31D" + }, + "dkm": "3459C38D131AE193EA8E09A4DEBC83BE81AC58854A3F28B1F868472D9D3FFC96D6F5E61E66B5BB84E9252D2A16D6BEF9F2FE5401B643954198879905F7BB5F76CE2141784E1ECC296BE2372E2EBA42FE7A352A8945C706F792EEBE872A3C5B62B17B3828DE97F83C9A4F825C4BD38AACA6B01835CF27312B43A31B58C56AA2BC" + }, + { + "tcId": 3534, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DEA2B2B46137A99AD9D60A7EEB806C1", + "z": "F0112729FBF7CD2923FFE9689F3C5F76FECDFE57EE8A3A8AA24CE766123B1C", + "l": 1024, + "algorithmId": "02DD61B60F57A6DB1B573AA494A46A89" + }, + "fixedInfoPartyU": { + "partyId": "AE46721DB32E64751A774F7AF23ABCAF", + "ephemeralData": "B7054CBB032A22E72683DBC49A3E9A29637851F099E8181D33818CEEE79C7C" + }, + "fixedInfoPartyV": { + "partyId": "232ADE6662D4063A23012A8AAD2F4886", + "ephemeralData": "09BF2106BD5F1B98FED9CB21A7123112D1777E62CCFF76F8F0EAAB33838ACA" + }, + "dkm": "266093BBE4E3F7C29DB0FD5C30F5D46C54172BF1915822E84738A23CAA190B276D8EB5876EFB4EC7867A3FC63E31DDE79D49169D8FF5A118CE24C7A057B50428AD9870C8BFF40A06EB17EEEBCD83477F12C69B4CFCAAFB097A3BAAC053D853F1DF86BFC35E314AC6DE67DF74A1D813D9F7482B0551565FF6DC4B47895785B7B2" + }, + { + "tcId": 3535, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3BD0161F1E50B718674E2BE796386185", + "z": "BB33BDBCFD6E98D3C1D979805A08F406928F1B9B5B34DEC0C72C5C421FE97E", + "l": 1024, + "algorithmId": "BAFD6552C88E8CC8DB510E7315D5E6FF" + }, + "fixedInfoPartyU": { + "partyId": "4BB2CFB2B8789A585DBB46684953BCB2", + "ephemeralData": "030E2100E501AA39C02945C8DEA979AB020A2FEEA94B28A4C250BB17294A25" + }, + "fixedInfoPartyV": { + "partyId": "296F11FA3FA4916BF6A30A72977423E5", + "ephemeralData": "28C5E9A03673B2D5A08F73BACBC3471A83C16AB96CEF8AFB4383D426380C75" + }, + "dkm": "D0FE06A5BD47FC7746E8FA8286DFE3814E6E6BBA65A43B4FAC234B4AC713B67F18622FCC5A144B84CC371A6132CE3F898532FA4CDD40CE745992E6B246A16BF2BA80DC8F5B07AA082BB5F0E4846D6EB0B2F82A84DC9DC39A3853B72E4F4DB758D1E158120B640410EF9AC4A87D6AEBE1386F279BB4CE755FF9B4A4E76C33E3D3" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 170, + "testType": "VAL", + "tests": [ + { + "tcId": 3536, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93CB8F724CA872FE703EBCECF35561AB", + "z": "7B60874579E3978F412EC031DA6C602D58D76CF4330F5CE12D0C181107", + "l": 1024, + "algorithmId": "B3D7AFC274BC97BC8E9723D285B5B7A0" + }, + "fixedInfoPartyU": { + "partyId": "50F8BF4505CA86CA96B16C28CC2D1B4A", + "ephemeralData": "29F6AB0FD5AEC0300A3ED8E894FC5AE893357977519CCE40713B11D117" + }, + "fixedInfoPartyV": { + "partyId": "37F4D72F5FDAD93F4EB62D12929ECFFC", + "ephemeralData": "DFFD0F55ADA4BB81A2DAA85473D79562666211E75C111FD7B0086F9D37" + }, + "dkm": "6A078A6A495E67D41518251C08BE371D4CB6DC6C5BA85D9B8F18806A379741467E5400AFB73A6227B825AB752A1258D6E0EA4EA30B30A2F4C5DDA95300E7098003E4A4BEAF2871C50CD230ABD9F374D2270592A1EE25AD9F2219D12C777423A2F9A745F04B4E3F8CE874576B52AB5C6BA610781CE7E69D267565013329C8F125" + }, + { + "tcId": 3537, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62378E3CB409CCBC7C224A148E4F8D8D", + "z": "E450CA3F776F70FC50BB11099771E86C23255DB80777630B9840690551", + "l": 1024, + "algorithmId": "340C937483A9B7038B05ED1D87BB99BA" + }, + "fixedInfoPartyU": { + "partyId": "ED5B86D82A819CCC296E32477F754E51" + }, + "fixedInfoPartyV": { + "partyId": "124158C9FA9554117B7D331C97E45059", + "ephemeralData": "2FD9DD3604F71B354C6C7AE67A81157578918F6CCB48793ADBA5E86AB6" + }, + "dkm": "43F174AE71A429302FB16E1E2A22E07F0247294A7DCD461DD7290571D277C74866DA4E749F4A1983FF17FECE1C5CCFC9F0DCE24815C22D82EA653EE4F6F1862F228DB294CDE2FE46B4A93F3919D0A11A939BFB9AE5737600F9C9BF0A84A2919BB09B5C36CD6B31B86A3FC7F1938AF9EFBF33D18B52AEDE8E4E6AEEA64C98A139" + }, + { + "tcId": 3538, + "kdfParameter": { + "kdfType": "oneStep", + "t": "12A696858DAAA1120221CDD4136121CD", + "z": "0EE2962579984DACC94AB623CECA7706C2DC420BA9D1461F77A2B2687C", + "l": 1024, + "algorithmId": "B0C12225832C07E4E627B984A9289B66" + }, + "fixedInfoPartyU": { + "partyId": "8BC9698FDAAE381F6FBC071A614E6099", + "ephemeralData": "7008EAAE5ABAFFA87BF4AA10C263885228191BCF485BDF62BFE02A0B3F" + }, + "fixedInfoPartyV": { + "partyId": "A137D1056EFEDA2EB88BE6340D83423A", + "ephemeralData": "85AC3693ABFD6BF40C978D0EEBD6771085700B96CA971E59CD7625E6F6" + }, + "dkm": "0CF60D0C51451A4650F174335283FC641846F51CCCDC2CCD2FBA701115CE1941D2E066DBE78EC2BCD1EE28BA60D555423C403F7315CF201E5DD2663027E6F750C6152C014792165868EE845950E83B95B7EC2889BEFF33D4EDB962151F7A3E52C4F88A146FABDF92E08CB3307D31A300F9DC1CD7EA8AD785569C4787B183C42E" + }, + { + "tcId": 3539, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E03D6ACFD057A22631016EF5C4BACA2C", + "z": "EF664B32D3D9BDCAACEC160170AF71ACCEC68B7396CA26B2119BCEFC7A", + "l": 1024, + "algorithmId": "56756AE9324770C78E5048469A349103" + }, + "fixedInfoPartyU": { + "partyId": "9D0CA36358FE2A7AA1DBC366325CBF80", + "ephemeralData": "200D27C07E1E5556E97329A066CEBA296C33583C0CC45E7D9537A80D73" + }, + "fixedInfoPartyV": { + "partyId": "83875A6EFE42EAB9FB668EA9F8A98E70", + "ephemeralData": "75E6B6ACD2549AC23BAFAD9CA45156D4B88AB71DFC29E202FD8A43010E" + }, + "dkm": "62C2FCB12D589E252100E5466BF1B8CB6684A826A334EB98B389D87A1088A26D9CFA71AACACD9AB19C04295ADF83AB8A01C01F58FD4CDB0660E4EB893642E884C6EA4B4907821CA70FC111D3A93F114BFAAAD2180A078DDECF80C7C0068E6B4CBC101E9129117BED52DBB316C1B1A9C9B5A9B8D9796B820FA4AFDE4AFED4CBFD" + }, + { + "tcId": 3540, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E87922CF2A5CE37E6FF62674B1D1B9C", + "z": "106BF6008985A4D3881C7588B71E90ED739B1881B39B1A646F92D92FD4", + "l": 1024, + "algorithmId": "EAE58ED13C4B2C556B8BB6392EE688E7" + }, + "fixedInfoPartyU": { + "partyId": "49E5988100387A53B5A267FDA4C33F99", + "ephemeralData": "1C3D0E6369ED8576F75442198BAF6D6F08548A00C56B1CA33A873D4A72" + }, + "fixedInfoPartyV": { + "partyId": "18673739A79B5E892DAC8D253BBE3B06" + }, + "dkm": "A5DA7EF7BB36F3F0FFB8252217913CFA0BF5CF44F8D3AFCD935AFE898110A238AE2EFBEA28BFB30C4795C2AB811B5F6F0C302B3AEAC949AB54B1217E541C3F691A39C50A6918543C6E85A3C01F3E4428DD01B73254D3E8BD9745A2D4649C212B2226D47DAB99EE93BA62058FCC6EBC03824ABD1E7B32AB982E01B6C388DF6E72" + }, + { + "tcId": 3541, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06AB3DA0312E63DBC1B6D2B08C8B91B9", + "z": "402E7A7FC21A65F9E88A0D31F41B2138B617AE7355C2BCD5D11E5E047A", + "l": 1024, + "algorithmId": "D771E06A30E26CA5A40A6E92554178EC" + }, + "fixedInfoPartyU": { + "partyId": "233D36C9D4E306528265B5DCC16804D8" + }, + "fixedInfoPartyV": { + "partyId": "8E5B515C449F801E20306E3D1241A20B", + "ephemeralData": "3EC634BEA038959B2EECD77423F627C31FB5292BA299BC82D956466F7D" + }, + "dkm": "3E9B819C3EF2B586B40B5E5DA4836BEC8EEECCF2AC51A549F959DB869FA6ECC7105EA2C38380C1393EABB4B5EDA87AF73B69F1D2863E26D345850EE2422A3BADC18A7FD95EBCB4BAE41C41DA0FE7818C7510A665C7112F93135A1CA980956C61669937902CBCFB47DF487A1CCDC79BC6923B8D483222A494233370792C409B3B" + }, + { + "tcId": 3542, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DF1CA792C6AEF0F228F295203E2BB57C", + "z": "53E99A7CDECCFD46089E4F07424FBFDBF88E8C6EDC7C3409FAD355D418", + "l": 1024, + "algorithmId": "9C1E03E124F01781EF1001DA8DA4D062" + }, + "fixedInfoPartyU": { + "partyId": "09B161AF8072A14AAD0C0C10FBDA5D4A" + }, + "fixedInfoPartyV": { + "partyId": "4B6F7EF589D7D1D77D588A835E31172F" + }, + "dkm": "03B49828971ECA291CDB7726C9FC347824A2353F0C5AA88E3D9C75C98E26C420A601B72D88DE1C39893609C59BCD3675316C35C9AF0DCA7C72500998CBEF7043D15947382985F6255C9ADAD4AA32577F047AB4C98E25DD738666A72711DCB12AB4AF6C5F459E771E0D8CCD7698526AD48D43DCB6624018FC3F8B97D03C793DB0" + }, + { + "tcId": 3543, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA043F0D79E896D4FB42BC919C6078AB", + "z": "FFCC95C3DEAC966676D68223D2B52C9B9E3AF795BC35700791AB3E1231", + "l": 1024, + "algorithmId": "E06F7DEA89287C926683E7626ABF2069" + }, + "fixedInfoPartyU": { + "partyId": "C5FCE02A07A34EC43ED7583E7853580A", + "ephemeralData": "CEDFD40E77554360C2A33CB136A472CECC927CCA742EBCE9A63369395C" + }, + "fixedInfoPartyV": { + "partyId": "5A8DCA4A976E63CC625C66D6E69A854B" + }, + "dkm": "0829D70590D4153EF8281B9D55220AD75987FA719B02B7C2F6A216CF0D333F35B283E407292899110AEDA061EA127F64CE1240D88237C798B33124C19B633CC48ED8D515E6E6B8D1BD3D9ED523CBD23C2474699E7A6903AEEA10FC5186424184D65B25C1F828230814B7896E9938E229ACF451CEF8DC1509D0664CDA9166CFF1" + }, + { + "tcId": 3544, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0ECCFA58569EC748780EE61F4A74495F", + "z": "8A6DEEE66DF1E56429BE50788DD1A4B474087092E2F08B9CAEEBF97B4F", + "l": 1024, + "algorithmId": "5F021AFFF757476927B3B8F7DEC1D99A" + }, + "fixedInfoPartyU": { + "partyId": "34EDC404026148C4BBC37A487B6ECF5D" + }, + "fixedInfoPartyV": { + "partyId": "1768CD74A9060441ABB5DA23AB861F61", + "ephemeralData": "12BD7507CFB9F43A6EA976E70F8048B4C81DE4356E367DAECED8436228" + }, + "dkm": "B04894039CD7D1D074494BEAEA005A5E81007F1BC6D325317BB8A0AE83B6FF39FF51A1541C2CEE89107211D58597108EDBCE03109608F1BC6FFB2E8C215DBBCFDEE63EFA03E73396257280FA9023F77F8E4888DD38D46AD9AC3B236BBBD90EB568FF9EB99F30087EB508184ED0F568A762FA214D1D11A2EA35EB418D86DA8F15" + }, + { + "tcId": 3545, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0225634534486133CF1DAB2E24D8EFA", + "z": "5F6663B1AD1C6525C52BB5FCE24B3120AA90A3E97B8FD51945DC8248BA", + "l": 1024, + "algorithmId": "C50B96BA23ABC594D303A4EC76ED9EF6" + }, + "fixedInfoPartyU": { + "partyId": "37C867BDB8E07F2E147169FAA23D9EAF" + }, + "fixedInfoPartyV": { + "partyId": "6FB6942F65E295EBF7A13871F954F291", + "ephemeralData": "AE8ED40EAA9C663E6611701F4CE49DBE0773D47CB337C0B7B0EE654ACC" + }, + "dkm": "2EB826B951D504D915C3A87400970F30549CEEE5BE13A775154BE8D383987275A8960BE69AC2CDC4263BA3FF947C913433B7B06C09741B8D2F8E916B64C2C43908DC00FBB3E47FB96C48270DD72B066B6428D58199D87FC3DFA33A8D8920B09E3BD168F982BBCDC1672836401FAA88F54D3BDD679A4E21436C5F6A6093C2AD8D" + }, + { + "tcId": 3546, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E02E094B4AD6C241D08F817585EC57F5", + "z": "6CAEFDCF9868137EEB8537BD75B8CB95E2C9264B0F868AD0F95C40BDDE", + "l": 1024, + "algorithmId": "D0A6F3C0A395A069199542703FA027EA" + }, + "fixedInfoPartyU": { + "partyId": "5A2A7566CC25D64AB303C5B47260CD4B", + "ephemeralData": "B912E72B04C8CF2D57C67DC419DBD229C3D7A960F5A8D18DD41EF6ACED" + }, + "fixedInfoPartyV": { + "partyId": "5964BFC98E3F764DB751E1D30EE90884" + }, + "dkm": "E255B3DEBF90A98963722871A43AAE76AF8C12A9BA6C7BD5889F0157EA6A678F09F590D12018F4059967E9C726A61B6A505D81E7DCCD8F0BAC0B24E16CCF6E79499CE6C92411175D0E9A35269A6A272007C8CF41E7EE9D6C1F2848DE04CD8DFD0967E22149612884D35C39B8EAE9D2C42F45F2CC8C9DB38D559FB9B3F3BF2ECB" + }, + { + "tcId": 3547, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A171A520ACB6E03718B2F3E22A98528", + "z": "C158E6C349100C3CEB6652D642363899B57A7AD56075C8C00F64E41887", + "l": 1024, + "algorithmId": "139DC9D5F5D2D5F14BA28DC7EA35D540" + }, + "fixedInfoPartyU": { + "partyId": "B468C133BD670339E4BC6EB7BDD6F897", + "ephemeralData": "A8EAD309517B2AFDBCA3DDC9B46FD94B1BD30C4A2EB1C87BC795366ABC" + }, + "fixedInfoPartyV": { + "partyId": "B023890C0E7CCF2C227C07385CA37BB7" + }, + "dkm": "C44F13C40D131747EA2F0539F01DBB7386902C97B34087B6FD39E1B3F61BA6B9C56FD534505C28467E6B00F647CB727400B2511E4445D01681956ABAB72254131AE55CAF73E82AAF1A6A0F1C861AB72CD5171B1107E3F81C15488820E6A36882471E685DB6C19ACD73DA9E20B699BFEF44E08992D5809A34B09963B79830269E" + }, + { + "tcId": 3548, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8DC3959BB8FB51F49C0C971C7DA458F3", + "z": "8F218A465C278F31A2A1011259465D2BBE06742FC8FE41EC7F83776499", + "l": 1024, + "algorithmId": "F70DB0B8700FBDB54E428B727FE369BE" + }, + "fixedInfoPartyU": { + "partyId": "22EDB4A51707788A3854D781F920B28A" + }, + "fixedInfoPartyV": { + "partyId": "1F61382650D567EA2293895EB5F4C9DD" + }, + "dkm": "6F3D69FEADAF9B1FA9D12893F25A5A29E7273F191097FD1D4EAC08F523DE943F35C29398890C746B9860CF975B1664F66A34B8036CB88F1F34AF63EC75DF65D0785A8BCD45CB652DF55D746474BB76F31065BD5FC70D337445FE1064B3459A10DDA04174A0F74CF93A55BC730F344E93EBB6EDE243E12B40B4099EFE49E70901" + }, + { + "tcId": 3549, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CDC7A78DDCB7B2D635D44851CCC2A0F", + "z": "58B0BAEC24DEF34DB40BFA439E27AD65CD5BA049B03C3EA49B4C290B64", + "l": 1024, + "algorithmId": "A46ADEBC693687130735232BE74F8122" + }, + "fixedInfoPartyU": { + "partyId": "A43B6C90EB6A091DB5B104DAAB998F58", + "ephemeralData": "1F8F398171FB60F2B006B958E38DEAAF284A1817A7D07F353EA3CDC796" + }, + "fixedInfoPartyV": { + "partyId": "98ED33DA195A19B4E2F2562239B7E124" + }, + "dkm": "1972AB8FD371092E9793F80540310B6B009B136AC0946ED6BD119D17FCFBFD603E03DFC84E13D690F34F00E527B8B61EA5851D5529C51F80F3BC74CBD9F38D043977D6F45A698D06F9B7552BB263A1C2C6988B74D56D60ACD2A193B84F3144E10C16EF8CF5E012516E18DFAF520FA8E771CD5E84F65F4B6FAE7E6DF8D13F5940" + }, + { + "tcId": 3550, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F429D2D15D8AB086FD642A271AAA102D", + "z": "EE72666666D2CC44D124EA93D503CAA6BD4E82E159EF4781FB0D5B8974", + "l": 1024, + "algorithmId": "85EEC87D55872DE2EEF97922EC63CAFD" + }, + "fixedInfoPartyU": { + "partyId": "A845C1BAC9AB8AE16CF3E092030F1C9B", + "ephemeralData": "5B3E08F496D7C52B4A72C5BD00D41B95A688BD2F2304E73E8886E5DF40" + }, + "fixedInfoPartyV": { + "partyId": "36B06EFF27DD12678D8625502A878316" + }, + "dkm": "F3D41E2C9739EB02BF0B97F10092C82157FE1C09C89A82F2C639EA158E2F8CEE35E35785003CAB9B49726F8D811629D14A13E608DB07F052278AC0168B902EF71FF99DE3AFEB8087A6BAD585032A2FF2F313136CED15A7E806CCBEFA7000808E2DC854F6F2EB74FA4F6E885222848DF1AF2274664C93BA435C6FD87E18F7A2E3" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-224" + } + }, + { + "tgId": 171, + "testType": "VAL", + "tests": [ + { + "tcId": 3551, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3FEDF4571656FA047CFA4DAB4F6F9BB0", + "z": "8F1E27B681C861BD15A65C69F8904F1BB0B12DEE738FF68FE256312F1639E0279719", + "l": 1024, + "algorithmId": "647E3432D9CE0B1C0E981E5CC292A0A9" + }, + "fixedInfoPartyU": { + "partyId": "290B91ED03BDC8F83E6C9A2A9D0C9AC0", + "ephemeralData": "1C9F552C28A39FA0FF52E28085132054B200D8672CD469CD582439CB2E20AF9DD9A7" + }, + "fixedInfoPartyV": { + "partyId": "2A559C24D49E420663416BA0E0804E0E", + "ephemeralData": "3B784A04DB7D433E7FB0DFE8111F58191DB7CA772CFB962B8E205CBB58215108B7DE" + }, + "dkm": "0CAD9B3841FC10EB88F6799FDE5895A05C634A0308B9B14D4833A09314FE08BBA43EAC1DC2D6676ACB1C2A7DD87835547C78A8BFDB2DA21C0000D67549AB9D14BF5E0FC1A913FAD300A0E427CFD840D744EC55798B711ACABCAB1A8EFEE0E6F04F7E0FCCB9C06554F66CBC4808D9C45ACF3A414DAEC547C87E983DA032257D7A" + }, + { + "tcId": 3552, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22C2551C5B5A8A824DE08461232835C8", + "z": "26F9B0CF8BC76813B01259C634D5D7657D7060338BB12AA1A168CA73D52CE0C564FD", + "l": 1024, + "algorithmId": "4F6F9CEA67A11868A0FCEE88BC7ACDB5" + }, + "fixedInfoPartyU": { + "partyId": "33CAAF7AC1905687ADCFD1E94A625CD6" + }, + "fixedInfoPartyV": { + "partyId": "C8DF87FBE667BD39380896A1A97FAE06" + }, + "dkm": "AC66C93955387DC84982AADA2F6B9257F46E6E4B5B7F0C0BF6A057E02984D363DF28EA214B0B284A09A9478781411F4B979AE7952E50DBE9253F10C07CA9F661491ACC2F94AE3ECBDF78714590974571F9C9D25FED78CF4E66059A11D97D9046BF4A80A004B053263F3B0CFD44AFB6A1CAA95EA9F073A265F90C94845FF05431" + }, + { + "tcId": 3553, + "kdfParameter": { + "kdfType": "oneStep", + "t": "01030071CB7D21C4E2B34BC32A3E0AD8", + "z": "CE2B56BB1DC493CEEDE45F37F4EE60F03D245E3CEA10E44F16FF97ECBDC9565BD4D9", + "l": 1024, + "algorithmId": "B77B4C6BECCF2E562DE942B493CF97AB" + }, + "fixedInfoPartyU": { + "partyId": "1FE4DAD2CFFBAC2BA61D1BED24F09712" + }, + "fixedInfoPartyV": { + "partyId": "B8F95AE1D359EEDC72FC9CE513A20F34" + }, + "dkm": "6161635235B4D9707A17F511FE257F0DFBC5B60B7ED5811082296CDABBCEFC199668D9DF5B82BF140A4EB56E6C3A0413832C239B0BF7292BDFFA51E9875D5CB5178AE1A281CCE5FC411DF2D79F37EE306A8B3FDC1A71BE72BFCAF17E88227C5DAB0DF22C2566076F49F4BFD5214BBC1464AC5242EAD6BC653B10B4EE39E2ADC0" + }, + { + "tcId": 3554, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3C0F15B3FE303C6D93F31C956F840B2", + "z": "32CD39FBE831B3F4D59FF7A26FF45190877CABA447D49E83687E0070FBD54D4485D4", + "l": 1024, + "algorithmId": "63A847B481F68D2A572815B6BAAEDE29" + }, + "fixedInfoPartyU": { + "partyId": "385F7E04A0AD60D8F8CFB78E5A022EAD", + "ephemeralData": "24F95475D0FE494297FC81D8F921A8759AA1D04A6D96CEBD0600AE4DE365CE6F61D4" + }, + "fixedInfoPartyV": { + "partyId": "D062F3422A12B08DACB54B48635ED727" + }, + "dkm": "526863E1AA4EE5C78A415850B3959C962F8067166B921D1C96DFA57B4B585E9896E128B4876B4B7113CEB4CC3339316E864C261E25E81A6A3C923CEFBF6742985E79A3C67DAC55DC1B9C2A2C32ADBCF2C4D49C611D18A59CFF05AA2C2E9EBC8F805FEED73F2CAED11B46ABA0E8309EAAE0D971CA29B2E05CFE055584D52476F4" + }, + { + "tcId": 3555, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAE2EAF7483B9F118C2B506FEFD3C82E", + "z": "6ECE1A3755CAD4CB3EEAC8BA678327F56BC0BB57DB7575722989F3D774E8EAC25A7D", + "l": 1024, + "algorithmId": "28005A5E2638B1042F9D0673DCCB1518" + }, + "fixedInfoPartyU": { + "partyId": "80473617B6DD4665DFF0B940169804A8", + "ephemeralData": "CD4A8C942734EA7402A3373B2BAA23523207A657F1342803A9A900F99F1546BAF48B" + }, + "fixedInfoPartyV": { + "partyId": "0F865431B7EC1096159E6593271425AB" + }, + "dkm": "E63B507F651D65CEE3B48361EB565DA4FE335FA65477D07CB3887D549E5F6099738DB3ED394ED26CEF3D7967AA3C41FD983B148161D0A50FFA70B15E34EB9DF26AD77A7DF0611E1B56ABD8AE721FCFBFEB46F608C8E9F5630BE7955EF737D79627628914E13FF036A0A9B20D72D367D50F05D1BDA55D3CBF153F9A9512507A3D" + }, + { + "tcId": 3556, + "kdfParameter": { + "kdfType": "oneStep", + "t": "531035600E1BDA816416D275B6A9B504", + "z": "D398EAEC028593439E1B58067A90F901CB4E07854CD3C8F9E2D917086D301A8CEC9D", + "l": 1024, + "algorithmId": "FB4B5C00AD27A81F4D10A16EC502312A" + }, + "fixedInfoPartyU": { + "partyId": "145535904ED893DD91AD96CA30CF140F", + "ephemeralData": "42703E0E0DCD7F739DFE4B6A001D37713CFF300FF5D692742A92FF34E623C3173395" + }, + "fixedInfoPartyV": { + "partyId": "1DC89D06FF386C37319A2EEC1080B657" + }, + "dkm": "94FA7F7A2EBD241D65ACE13E517BDFB21CA8C24C4733E5523868C8D272EA5E1ACFC5FB9DC5586D57432D2E2053114C97054E1AE69832D0BB8165BE3F01244462A51D5BF4351F5E864AADDD5D8FBBCFC916A8943EEAB323FB62200E189C510D48822FE63A194881C19CCF4DD29C03711F8D9750C9D1D90B5A1542C4C7C0890371" + }, + { + "tcId": 3557, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA81CA0A4EDA1CF471C442C81FDCD12A", + "z": "7C7163B864C91C658429394A8D0E97A1C0DC8B65F983CF357B143994C578E2671C13", + "l": 1024, + "algorithmId": "4BE5ECE74157F22EC2B2A3395AF5ED7B" + }, + "fixedInfoPartyU": { + "partyId": "4FB6FBEDF40D4C0BA23D65D30284CB2E" + }, + "fixedInfoPartyV": { + "partyId": "5ED1C3B0707760F3B92ED285CCE92949" + }, + "dkm": "62E4E8F38CB7FFBAC122C17F55784FE8E856D6D31231AC1A872C29B6A859D461477AC6E22529FE37D802B8FFCEB16D957586F35CC4F15AED3B2A6898C1B5432C8536CF6B26C533F621C670D9C48258FAEB9ABB6E59CE33370FDFABB9BA53373DD9DB2EDFA813D07EB252D96126F23922C0537C507B29D1933D5F3019A4901435" + }, + { + "tcId": 3558, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A0035C5C7E989CC6ECED33F5E09BE45", + "z": "C6B3C068AD9EEE76E3A8809180B2538AE265E40824596A66BD9C2F5C31CC738FF34A", + "l": 1024, + "algorithmId": "FE7551F28C00B4F52E75887743517654" + }, + "fixedInfoPartyU": { + "partyId": "0580A714636D81C2DA62133101C2FF42" + }, + "fixedInfoPartyV": { + "partyId": "B6A555EF906EBAE9CB0E61CA88ADAAE3", + "ephemeralData": "80ADC72CD34AF3594836B39D773D0615854A996DCECE44120FBDD7F076B0632109E2" + }, + "dkm": "C292C4F06AC88BDA0946E1C949A120069056A8DF03E76C5E9872F0156DA1975D97FFCBEF5B599411C854FCC373851D45E47CF076262220865AEAFBCBC0B065B326658EF458CFB66026AC77827EA451107CC2A994B02C7F2A8F614E62D09B73E4C28FF2AE5FF60CB8FF2057DEC25DBA1E306495EA156B9A81696D3C7ABBB8C3D4" + }, + { + "tcId": 3559, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8576E9E3C2B80E6D1473CDF03806EE01", + "z": "F97CAD53849C9F8752776398EB28006058ABFAE41DCBF374B311C35A8C7A22F1FD2E", + "l": 1024, + "algorithmId": "418A8F8D407EF297364655AEF466EA31" + }, + "fixedInfoPartyU": { + "partyId": "BE294F487F593C27439374C6679D9012" + }, + "fixedInfoPartyV": { + "partyId": "77C65F8C26BB0527AB8D65425C75898B", + "ephemeralData": "770892DD9A1DD86E9FBC102ACF9C0624C86DDE75370AF80A5BC4E46CEC91435C540A" + }, + "dkm": "0EAA56BFA27134DE9268CA07034365D6730425864E65C9F9B51B5D2BA85863E3551585ABE71575B8C65C43A0DFC762ABC6D042960E20A4785631338DA2765AD7FFD2AA6431ECE6058527FD3A721D114602EC8B7EAA2D8D0E556DD1DC9F71921EC15EC977CD5EC3FC265C51F43DE049B023E2DC6E4394746AAB6367232DE0E32E" + }, + { + "tcId": 3560, + "kdfParameter": { + "kdfType": "oneStep", + "t": "05300E2FCD4D92DDCECF5AE8554788C4", + "z": "65B40E95D02EA1A9CC7B8836AC531F0490EFED3D40C197E930938CDC11431BFF59F4", + "l": 1024, + "algorithmId": "C67690AF5FBB4EA9A61B775FBF1A1DA4" + }, + "fixedInfoPartyU": { + "partyId": "2964EDD7A6C566980DC45AC0C0FBD901", + "ephemeralData": "380068F474A784115F42DC4A38F82854EE410AF90B7010F787B9674A5D66B58F6935" + }, + "fixedInfoPartyV": { + "partyId": "9BCC5A27FDCCD30658B07C9BFF8E3141", + "ephemeralData": "DF0BB7B63744107631A078D853417BC8C938108F9244C0C64B0773B21FFD1C000FFF" + }, + "dkm": "D3FB0B4226A188A322E84634DF032B5A368318406282BA8EF92B1BE72A7A7588DC762D511B930598A33F615651D768B742F011F3BCC74E3721DD4F93B507879F0B93320800471F71F55E13AF004950A045AABA391ACFA5D69CDE05D0626B2D50E0E41566B7373900600ADF8385B8BC1EF9174761ED4B8B2DFDFD060374F74F42" + }, + { + "tcId": 3561, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C73926B8E9C30D8E99CD71EE92A02AA3", + "z": "CEC8F97AFF2E4A070EDF10222C57B4D37A448A6060A52E7D275D8A4ED476BECE9BE4", + "l": 1024, + "algorithmId": "6765A6705B96011F33E8F15796A8AC82" + }, + "fixedInfoPartyU": { + "partyId": "39AC2EF49FF3C63516DBCFF0A7D8D576", + "ephemeralData": "59F59DD81A401D5BF641D804899CB18BE9D66684AC5D5B04CD67DEBD78B76F85523E" + }, + "fixedInfoPartyV": { + "partyId": "386F19D7BAD70289C81B5CBE5F42A63C", + "ephemeralData": "FC07AD421F86000200D4952F2A7623DE70046666F44D9EA01CC12EAD4EB508872045" + }, + "dkm": "34699CCD5ABD022FB9C4A0B3563DBFEAB9B95DF65CFA591FBEA9E88DC1691DF35D6884710393ACACEB23D3DD14D130A09D075B3EADF24E58946BADEC663342CBB296919A9AC8567C04ABC49EC059CBB6D0F3B2188A2898DF748AD6ACC3C732F92880F2AF4942D159FD587F0BEBE164FC218D4E425DF027A55089DCB3A758461C" + }, + { + "tcId": 3562, + "kdfParameter": { + "kdfType": "oneStep", + "t": "17BAB0647266D82D4577AF8540F06396", + "z": "F18479844D49D401DCFC508BE781130769CE2767A6590EE6F89B9317976377064E9F", + "l": 1024, + "algorithmId": "EBA0E9A234083E2AE8BFB0AD2E227400" + }, + "fixedInfoPartyU": { + "partyId": "3E7187EB69C98DA45D4CFE8829E35395", + "ephemeralData": "A90A6379F19387FE4324C608E1A543141168896C734E494296867AB5C3B795A7A9FA" + }, + "fixedInfoPartyV": { + "partyId": "DF5C195513096801AF2D8FDD5BDDD089", + "ephemeralData": "6DB42BE5ED10BD9FDFF51684330CAB9BEAA53EDF1C95E62DC57371E0A119FEFB5D75" + }, + "dkm": "0D4769A88884943F63FE4AE00AE3457346036A8F1D40861EA86772969B2BA8BE997294645EE3AE45D86ADD120538B470F5A1B049D30A54F88E057D03AEBD9CE330070379F438D3D397CF1DEA1B3546EBB7ACD0D33E3E48F6E50422483A4D0ABD551006CB804F272566CF3638E0107E67F4308E846A54E44859085D00AE35F8C3" + }, + { + "tcId": 3563, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADF48F588E18E592994A1F0CD48D86EA", + "z": "00CD8AB5887159204025C45DE5D9F65077D5FD5C5413154609334F2B40134C1A4F0A", + "l": 1024, + "algorithmId": "769DAF882AADC11A0E168A3FB2D96FE4" + }, + "fixedInfoPartyU": { + "partyId": "1B893D8534D803A13E5AAA635195391F" + }, + "fixedInfoPartyV": { + "partyId": "48BC54AADED120D32655F225D3FE3FE1", + "ephemeralData": "72EC1CAFF66088898F2A3F46FA2CCF4BD3D055D0E2BAF0EB5A439B9BA61484682335" + }, + "dkm": "9F1E9291AA1AEA1D1C3A7BAE92C500B061826529088FC316ACE272231FE5623BF9E1039985676E7D351E14A376D74F4136EF8179B6563C355FF5DACF3BDE1542B0CB580350427C62D325288D25911B0DC7254E9C8E21D678B4194E53A3DA57918350AD0EBDBCA337E9F4438660B1FE0E42C100FA97A59BEC262F066E8DE72389" + }, + { + "tcId": 3564, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A17B4B409D0F5C143E774A15CC1B199", + "z": "40F138B4EE087D523828BDEA837C3B993CF4AF588F0FBE9C12CC498DE14DA8CC9199", + "l": 1024, + "algorithmId": "C5EDBFC2EEDA09ED69F8D873137C0F32" + }, + "fixedInfoPartyU": { + "partyId": "209D313429D88F907824B77845F23054" + }, + "fixedInfoPartyV": { + "partyId": "CC635DDD400F8F14800EA7161DDC1B78" + }, + "dkm": "3CBC094D830E657529823973EEE4707972696D1B2D5EC61D5D512B16AEC270E74B6F3C2A3E28CB7B179172A9F4C217E065095312F8572E886F142FA81293048C268F75B7566623718311811DB0AA2557D5B40A71A8534594C3215C4B11FE159301FF51CE91848C79D741BE0B40D64F93294230F6695487D2352911651AF72DBD" + }, + { + "tcId": 3565, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07AC4524E0D6752B4221C44414BCBDAC", + "z": "40A1C6F1E3BC67FB1347220688C76CB9156C47C13469D900AE3420424E79C1584D98", + "l": 1024, + "algorithmId": "4BB4A7779B474E0B16C493DC265568E7" + }, + "fixedInfoPartyU": { + "partyId": "8FB3F6D947C495E09B7A5ED1F34E2903", + "ephemeralData": "6F2DB3053AFF5E70A72BF15B4479F89731283739BD5063DB526679364710403F8B0F" + }, + "fixedInfoPartyV": { + "partyId": "108AD78F379F0B6B7918E2F200613BE1" + }, + "dkm": "3DDCA55CD5AFD3CCBED72883166EAA7D5C64B6B8D680405334A9C1B4A944D7BCC8AFABDB9E97B82D08A3A92E5B888749808557488E88A43CDAB11A7C9DF3A031AA40A12D7285CD13059B641E5239321767D78746E546C8384361AD01AE69F401AE4F4729C38333EE599D6A0E2E7692BB91873EF39A9088C8641FC5AFB6C76C88" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 172, + "testType": "VAL", + "tests": [ + { + "tcId": 3566, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E583E4F771221136504C9A2A6CA27DB", + "z": "E46E05FF3B6C302E9DF77D4F3B28156D52B900FC1A0C6413ED16458B", + "l": 1024, + "algorithmId": "022B48EB525492EBFD322005816A0305" + }, + "fixedInfoPartyU": { + "partyId": "A1A9AF1A77EE3D32A5C6F539ACADBB0D", + "ephemeralData": "8E1208834F77180C53410D28F60EEEDAD95B2FBB47D227D7F8FDF7B1" + }, + "fixedInfoPartyV": { + "partyId": "C57E65DB9335EB700D4D2BCA867F8280" + }, + "dkm": "D4C490816E089EAAC314C405EC5EBE492E1A352C2B5C0D6AD4B4942FFAE5FA6182B8C0B425996518B5119516ED4CFAA74E78AE91A2A8128EB97961642797E797599E1760265DB43B2947A0ECD5B5E51A084871137E4F454B53F8795FC80404BA5B54EE139D0EE237056C66670254B95712BD10314977E820602904C4378A8640" + }, + { + "tcId": 3567, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A48B1476348BD81FFE174750C8449B23", + "z": "B819DDD10844F11B53EB8A6BBDF6B88D0E1EC59B43E5AC98B5CA07D5", + "l": 1024, + "algorithmId": "08F73D3FDF9292D990043A9038DBE94F" + }, + "fixedInfoPartyU": { + "partyId": "8A2C00B577704272370AEE06C519CFAF" + }, + "fixedInfoPartyV": { + "partyId": "93BBE3C2C3E3893828ECC8CDE1667009", + "ephemeralData": "2665CE9C2C07E1D6B26DC8DFB9C41A9D741A294ABEAE9F0759ABCB94" + }, + "dkm": "FDFECF1C518AE1A338DE7A3DB04B131D8BAC3969CDD54698150A2DE4D37130A40F33BC9BEE23DAA80FCCA140BC5AB27A246A5B31C9D6297980D7015B415E8C38646176421DD3AF9EB31621E042004FB4BD47997BCA03AE3C0EAE37951DAF3E89C9F4A92F270DA7FF1B327F9F5773EB795DA6AE4AFB483876665C82464A181606" + }, + { + "tcId": 3568, + "kdfParameter": { + "kdfType": "oneStep", + "t": "133411EDCB2E6371EA9FF28A60520629", + "z": "A3BE7FB193CCCF58D5C99DB8F8832D83A5C2F5E3D8928AB4977F0DFD", + "l": 1024, + "algorithmId": "3E910507A21FAA495C958B062F6A5086" + }, + "fixedInfoPartyU": { + "partyId": "957C79739F89F986FAA50B76376ECA5C", + "ephemeralData": "13BF718988782E8B86197CEFCC35E6EB402DBB5F47501236DF4366F9" + }, + "fixedInfoPartyV": { + "partyId": "4F16F01EB725C37A19B7633753DE612A", + "ephemeralData": "562B511B2E8708DADCFE1D3C53C456BBEECBA40E62FD84D354139AB9" + }, + "dkm": "321A317108D49C38570F4D783AF21D2BD94F1687782BE555866984F3CC6CB01A698917499EBD6ADE6795404CBC4C6954EF4105E7A3A9240196EDEBCD8445C842F0A0FD5B8300CC8A1664E3C8E5D1658DD6DEBB1C9238325699587D612DA73AA65689449E00E9D24D6CBAA2E78565CC5D7CC6B8F11A66A8B13A6D321E012DDC02" + }, + { + "tcId": 3569, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB7B748D35F323F5C9638A684DA48375", + "z": "4683380D11A81813F4B3E7E586CD436400C9B8EF178E87B0B0059AE7", + "l": 1024, + "algorithmId": "A777994683E58C0892D1986A7801709B" + }, + "fixedInfoPartyU": { + "partyId": "AF5D8DF4EEF6C794AB9C291094049BA5" + }, + "fixedInfoPartyV": { + "partyId": "0378A2F4F2CEA787C0A64F6D56B16462" + }, + "dkm": "78CCF6659FBF727C40A7515A1BB74A598CD1706B0B5038E0FF7AB11A9C1220E00D8260D6F51A0DB6246FA22DD1C35638EDC5111602B9C908E13FCC109CAC4BC075007FA892D3E90F81086230944E73BF485053B04ED546808DBC85599D5E1929380688CAC8986A1971F92F79FBE1C81C960B525A99D3DEBC2C0C262EA51587C6" + }, + { + "tcId": 3570, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0CC7D268A8220C3EB9FA3769FFECC619", + "z": "2B05FA32F6FE50108751536C97F5A6B016AD00441A41C758A0E46452", + "l": 1024, + "algorithmId": "427B931A95BD89586C317A3844B32D2E" + }, + "fixedInfoPartyU": { + "partyId": "68BAD28552EADBAFB543B0C186038857" + }, + "fixedInfoPartyV": { + "partyId": "C15D6DED6602FB4081153B8A179808E4", + "ephemeralData": "41B48005ED4DCD146DF24E6C95953E01FE6890E73F62005526FDBCC2" + }, + "dkm": "69117D2FCEBDF0D1A3015FAB8F444A301763DC8B0E753CAD3DB5C7498CD467338741D934E07E4D87A216547156AC40AAF68460717C4A5899A9BD023CFCD32FA67A0CB140775FB85155CA5B0C7F681A6F40CF0D2732741D855FD5A1A4AB4CCB899AD351762DBA615DBCCE83FE6576FBCF5523D3C13CAF1E8929FC15F64755F1F1" + }, + { + "tcId": 3571, + "kdfParameter": { + "kdfType": "oneStep", + "t": "73240F598AB352F891C0ED9B6705F1A9", + "z": "E5495DDC2174BE9EF34A3F40C48705E422A0B0C305FE3EC92DE360BE", + "l": 1024, + "algorithmId": "EC7296A307E4565B4EC94F3842EE9C0F" + }, + "fixedInfoPartyU": { + "partyId": "EBA3FFF36B2245B3434970324CF53E9B", + "ephemeralData": "1CFA1043BC74F054BB846A18F46B50C1EBFFD530C51A4AEFCBF2AC9D" + }, + "fixedInfoPartyV": { + "partyId": "9B0186DBF3AB1A57B03ED4891B9E00DE" + }, + "dkm": "6048C095FA9930EF6C05972464A7998FCECECF8A3F703A1716DC43FA4F1FE89A75E842973BAA3157FF748E45C202527BA01C0270B82ABE9392B35E3C3C937FB558B460AE7EC07D9AF6C9ADFEDD836EFCBC80A0FD77560DAA6A5B605FE50D0B9D9C2A347657B42533186C574E596D6ADD8F78BF7B89B6168FD68221C4035C7265" + }, + { + "tcId": 3572, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EFC76264CD5E4CB44C9F1ADE2A47816", + "z": "EAA11C8F6039193CA924FD184391943B325062401293692CB8E096FD", + "l": 1024, + "algorithmId": "21A1E7C2F13E4260D527E4CE6D615852" + }, + "fixedInfoPartyU": { + "partyId": "4BA191E4ACF4E9072BF31045E9AFDB0F", + "ephemeralData": "082F3C65A02BEC66B36502A9C80F287F5DE3F1535128349252370996" + }, + "fixedInfoPartyV": { + "partyId": "1EF19886A77D976913F9BFEE78ABC478", + "ephemeralData": "85115EFC2FC06F6B458FD91F0455ED96DEAA3A973B8E3BE3E5C087CE" + }, + "dkm": "E3C2713C191991E26AE84D593A0AAECD5CF3B02F616699935FBA0B2A64A49AF286C6C92CD1769F42ABCCCC4BFC28107F345A6825C09CB6965599FF158748633B530FDD8750981BEAA95B061A0027D56F3A76FBD073459BBE06A90A80F75A655CE7140B3FC23591C437925BCACBE00C6C43B39926107242EDEB7E68D88BEDEFA4" + }, + { + "tcId": 3573, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5856DE9A901E8AD8DD68E72BEC059D3A", + "z": "FFCD731203DE2D7A3E5C9967E3C7225BF8AE53825EDCAD7A688812F4", + "l": 1024, + "algorithmId": "CBF10DC9715BA0051DBFB38AA5507AEA" + }, + "fixedInfoPartyU": { + "partyId": "D769A6C18C508885B67C034A26822E95", + "ephemeralData": "48DE5E10A557AE87D153C8DCE007558434C6DD178201293BC3B6816F" + }, + "fixedInfoPartyV": { + "partyId": "2532A481055A3C16F1A2C906C4D37DCF" + }, + "dkm": "1A2C7C15657BABC43CA7D400E699E42F5D99183D9A7F53B3318E786956080746E297DB56329123FCAA9BDA6AA8A47822A1266543F7F7589B0CF74F3E4B4DCF7CF7B41281AF931B1E749600822CE6C9FF84A088FD9CD5E9683653C73DABF0261A69FD9C70BE868BDD7B38D3E19CB19935A55736FD0AA123DAE791E13056A27F7D" + }, + { + "tcId": 3574, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5FBCDF26D29D9C99163C713C48493DCD", + "z": "88E42D781E2891F6A33C7AAE1C35857388DF5F51F625BC49D564DF82", + "l": 1024, + "algorithmId": "8B5A9382BE411FA7DCD328257D43B590" + }, + "fixedInfoPartyU": { + "partyId": "DDF652171041852FA33BE263C8B5018B" + }, + "fixedInfoPartyV": { + "partyId": "D81C5C45B6F06818A3AC23806714A2B4" + }, + "dkm": "0C6B6156406B0D1CB39DAE05CD627156E56C89FA34F75BDEC671EA3166E0652C2B6F564002983EDCEDFA6E50444FB19E1494F7CDA1622A39E83413D356CC7AC10D2BDB8599F7589D054DCA29780862F221A99CA5AD990F8DDB352207BA587E654FF4D00433B8E0E3C348153BF111034B3C81DC89D757AD0E68B678548398201B" + }, + { + "tcId": 3575, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5106C87E5ABAD990ECEF2CCC044C149A", + "z": "73063347EBD92C264FB249EAC0DE419E32494E75BD83ED6D4848820E", + "l": 1024, + "algorithmId": "3B34BD04442FCF6251DC8D4D97203717" + }, + "fixedInfoPartyU": { + "partyId": "7E8F8E90ACCEEB748135DDC999D381D3", + "ephemeralData": "7AFF4C5C0CC169AF7BF3EA10E639005CA8E22BB6163570F9FB4E4EBC" + }, + "fixedInfoPartyV": { + "partyId": "B212839E11DA78B8E58B085B9D98BF05", + "ephemeralData": "0F972E5375544C4592F710BA71AD9E428C5233029BA480C595EA17D9" + }, + "dkm": "25B160E8718453AED318F947E2FDB2DCD5968A536C6D3E03E765CB2248B4078C9E1E01F1D1EF55E874F0DCE878CB55D2D822D34E87D4886540F5F5B92FF9CC716DC2ACBD7C21FAD1A5CC195906AF6F96DCA155BB3FADB33C091A1180E0F824A4AFD1BBCC312F122DB802FEF561F229DBCE2EED23C1FFF97400F86C270C857D57" + }, + { + "tcId": 3576, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DFAFA613F7DCB61B8C35EB72C4A52E2C", + "z": "EEAA82794261B84EB5823FB4A15A28E3254CB3A41C62A57077AFFE8D", + "l": 1024, + "algorithmId": "235C49F65213566D065086A5C50FAF2E" + }, + "fixedInfoPartyU": { + "partyId": "BE1F89CB86B3E599F8C533A6C6F359A9", + "ephemeralData": "8CCE086263AF7E85C04B7374FAEDFD6C9CD491FA24D3423B5BF2A80F" + }, + "fixedInfoPartyV": { + "partyId": "A2ACA11F166E92B8DA6AA3A298C5EAFB" + }, + "dkm": "0C0B6209C86D39D571E3AC4A4FD551516E1AB15924B069E92E0E73F774E588BF6ED1D83A2E05642D24DA1D234056C12B8C669A6C290FA9F22E99B501D9B408A988C5A78EE31ED0F8A70955950D3669B5EC9CA9CC41C1D9DEE34DF436D7BDB7A181E9DC640E6E480249289F1A85B5122EABED2CE434C75489B23AF3CA3FCA5DB1" + }, + { + "tcId": 3577, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19ECBFFD1B9ED7FD66CB50EFDBDA09FF", + "z": "1AF9088BCFFCC46D3EE9DF52A8F890170567B4ACC0D0F5812F47450A", + "l": 1024, + "algorithmId": "45D0908A65E4FC152E3BB7A1E0F6E56C" + }, + "fixedInfoPartyU": { + "partyId": "7775B6CCF034429EBA88CB1055302018" + }, + "fixedInfoPartyV": { + "partyId": "2C8174D5B06ED108CA6124535DA4A539" + }, + "dkm": "06D6975D5B25772B7968C39825EAFA0FEE5FCBE0BB6BC8701A53D54BAB3E37777E39C41E167E63CB518F5862BB5492F4158E4F4F10EC593EBB9486772D72373C558C66C18CC2CFBCDC4725051B99FDC1F967B266EA8C90B91ECE6D000C06DCD6E58A62144BF00A589BADF966B3B99FC3F4EEAE3058563AEF213422A98DA0A561" + }, + { + "tcId": 3578, + "kdfParameter": { + "kdfType": "oneStep", + "t": "835002961AEEB54434C27EFE813B4E89", + "z": "71F3131FF90FA9C39C8F4FF9463AF78CC8956F4E3B6796A863D82493", + "l": 1024, + "algorithmId": "BED25E09C35A9D1C3CE140273847E277" + }, + "fixedInfoPartyU": { + "partyId": "8F32FFE6F3156E85E52FD64C1AA6C752" + }, + "fixedInfoPartyV": { + "partyId": "A29544DF14EABFB3724621A77B4DA8F9", + "ephemeralData": "451799A760A5AAF6A66B25108076C4B59B3A8AC055C7B57B7BC887E8" + }, + "dkm": "188EB49881031327ED646BF53747F541923BD3D1D17448EDBE7F863641D5E1F2642E3F51790152E75E59EFCD06AC96CF79CCAD51BAD6F04BF56555231840B725FCF1341D43D6E6E540FBEE611F76A5114A1392AC463247F3880069BB46572A4BDD6FFD867432F38466C71D2D9608655B16FB10E7CE8F7CE335CF335E9BE7FBDB" + }, + { + "tcId": 3579, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1128FC384EBEAA7BD24550A2BB4B228F", + "z": "295F6BD06F785AA4771F6BD87DA3BADB06C56D0B0CE02636E625CFEB", + "l": 1024, + "algorithmId": "26A877097351C869C48D0ED4DB3D16BF" + }, + "fixedInfoPartyU": { + "partyId": "34AF3E4168EFC25239873FA06D8C3F4F" + }, + "fixedInfoPartyV": { + "partyId": "C6CB15B557916DB0DCCC754107C1F73F", + "ephemeralData": "F5D1EF91BFCA0D229E7391E443AA6536B77C162A69339B6657E1CBBD" + }, + "dkm": "035A210D45703F37BF2C068314FD92C4AC6430BA29AE9B2B3BD978F71406F52ACA8D776DF56DA6492519E6C4C550F2BA53D367B3E984A8EB3B6C3966CF3DA3EEEB12F8ED9C6E9F8A1358E2CB4F11D274DF13D6787EB592FDB7C1536B31FB2ABD5000C360F2D61C5BC6C6C123C561B9856FFADF5C40E8C00FF4DD98CDEA944E68" + }, + { + "tcId": 3580, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B787C2DBDDFC50687685105B731FD11", + "z": "CECB44B15086D493CF3BD7E55523F525BE9FF9CE11C4856E94C240BA", + "l": 1024, + "algorithmId": "B5CA305C28B70CB759B4A0036E58A4B9" + }, + "fixedInfoPartyU": { + "partyId": "1680B60335B2542409A96B943A2CF6C0" + }, + "fixedInfoPartyV": { + "partyId": "733239A4E7DB9F4F88DB6FECAA989665" + }, + "dkm": "F9E0D7E79D1D232FF2BE92BEB7ABFE7412A6B9A7F43FC0E26B401427D5AFEF9422E1E64C23E842233C7DF547ABBA12158D92DC5DFB6F0DC4EA7125B1B12457B4B0D2A7FF8886B3186764C47C9AEE08889A5C7E9EBCFBBDD803DECA7C69CF18BD053DC48EB6FA91DA5E87D7480B80FE40C37D8BBEF48BE1DDF1DF3FB743BE4405" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 173, + "testType": "VAL", + "tests": [ + { + "tcId": 3581, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4102A8E139F59E99567BC29B56F713F", + "z": "546B0B55D39EAC941AEB1F035CFED40CD3FB394A12C88A5C6089F8434595B1", + "l": 1024, + "algorithmId": "4FAABEA9A6F34ADFE37FABAEBC331451" + }, + "fixedInfoPartyU": { + "partyId": "5C1CA9602B1211B657667913F40E39B4" + }, + "fixedInfoPartyV": { + "partyId": "1F500BB55997B07BC6C50DCE903F9386" + }, + "dkm": "304A11096AED46114D4060353920FF235098868CAF018AB03727B321A45587C0E0AE81C53D44467A6F80FABE4EAD107CAA47892A588FED0EC971142F859EB6761B7531C55246EEF4A8C6FE64C4A8D572AA88AA816C5406F94CAB8F4AAF9DE3CA73AFC036ECE1574DFF4E713BF45DA67CF0CB78E5445CEE835A401B03D0EECB71" + }, + { + "tcId": 3582, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DFF6CC9930D589346153288A0331154", + "z": "C4E83E564912BF57554464C5D361C848DB6F08C05C3315B4935CED97F6757D", + "l": 1024, + "algorithmId": "FCC3FC340DC004B88D7B4BAFDD59D48A" + }, + "fixedInfoPartyU": { + "partyId": "3E55D6558A7E7DF80F2C05BE90A3054C" + }, + "fixedInfoPartyV": { + "partyId": "2D763C12DBD79F1F39B93A9868CBC57D", + "ephemeralData": "40E53354669E56E9CAB35C1C79D824D36A8100BAE547DB529B421CDF65BB10" + }, + "dkm": "C2616E6A0A98870FFA6688CDD2967DABC7206474B4AD9A9291000011D16C6A840C629F8F1C7E97254C7FB66798E90BADAB0EB544221EE6839E7857943011F4724E174615E514E4E34B0584DDEB46D890950B45505FF1F95C41060255DF81264CBF5CF8112AA5DFA1CDF2FEFDAF5B80F01EFAEDDF73C52EC775DB104634B1B058" + }, + { + "tcId": 3583, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A833A50A849C9326AFCB53D787BA895E", + "z": "7494A2086A3532C90B21DF9620D6124B677C74FA803B3A651FDAF55D603B60", + "l": 1024, + "algorithmId": "1BC4ED820B4AB9287E183F9B90E4FE1C" + }, + "fixedInfoPartyU": { + "partyId": "3AD1D29B4D556A8325668C46ABA18582", + "ephemeralData": "F66FD48A2C9CB0ABBE20D1D375FEC7A6C21670C02B97303FC99C853372512B" + }, + "fixedInfoPartyV": { + "partyId": "13643BF5166CD8E8FC402151DCC0FA61", + "ephemeralData": "70C90A65FA8C0286847139B0C6C9A1C06B3E70E982C6920BD8675CD4D3A692" + }, + "dkm": "09D0386FA6FD6368305D3B625C2708956A496D30A7309072A683D45492E0E512D3FC4374D0E41AF37B2475B716C6A193E68753370986C68BB7CD835FB3F0488C079FB43B2421F570C411DD9B1DFF3E40AEFB3A2FC41C9BDBF191B2BF81B28B016BD2FC5B66458EF12F6F86D7DBCC148D16944A8C55A0AFD8C08D3BC22DE2EEAC" + }, + { + "tcId": 3584, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B1BF6F7D33D5455318FB5689DDF3342", + "z": "ED391B4197BF5CCC72D091087131BF4B5542C221742FF4CE94441486B53EAF", + "l": 1024, + "algorithmId": "5A46D2E3BBC28101E50D5996EDF0EC81" + }, + "fixedInfoPartyU": { + "partyId": "6E6E4138A8109FFD46BF1DA40B87660A" + }, + "fixedInfoPartyV": { + "partyId": "BAB252AC552AE9CBDFA91284C614F2FF", + "ephemeralData": "4C50F19534D92CDD5385272529428550ED8A3927816974EAFF2EB0363BBA6A" + }, + "dkm": "6A676B97070BB50FD6756E3495A2901CC952D193C5D8003DDC66CCB17BAD2B91659D776F653412B282B2BA97F99F75B23362F872DEB6EA990F66735C383E81C5657927056712C3452B2A33F20B807396EAD5297468199E059B16E9470B0A45E5C4CD56D8149EBBC8EA6B41A737083F56C57C5DA1B19F4E4499AAAB3DB3D4834C" + }, + { + "tcId": 3585, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9A23A63BAC858E10DF074DF85708A60D", + "z": "E21734D19C3C5309621CB60786210838A8E4F7FF1B775F28DC7FD6CCC8C2BD", + "l": 1024, + "algorithmId": "A10C639A015BE6E41EC4BA60AC1C5B57" + }, + "fixedInfoPartyU": { + "partyId": "E7083281F8E0CA8DCB409BD744C1C23E", + "ephemeralData": "D6E124D53DF856C89DD0A0363DDC9447F30AE39978BF60A0E41B2019A44CE6" + }, + "fixedInfoPartyV": { + "partyId": "AA31C7DB77A3DCA61EC973E7EB70554B", + "ephemeralData": "00C258FC5996BECAD40C1E73442DE87F7C0EDD28C2DCAE158BB1CA55EDB0ED" + }, + "dkm": "B46B1E96878B9C96E3360079A82CC1EA875E2EF8927411E20FCD6A79C073E95FDF0149C637AA73948ECC1279639358F4A7F4014C967D7C42F4113F2C7C4CC36F917348488C3635F9A77737A93890AB98F6AE81C26B60180A5D6D411F67FA9035E6784CE9A927B633322D4B8C3625704123BBDF6D91282938DC6836EEA4F9975D" + }, + { + "tcId": 3586, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0A34B648123AF12AEAF7FFB7B1EDE267", + "z": "A88A26073F496FF952D3B1325A3FBF5A2ADDD00CCD328AD199725BD6914149", + "l": 1024, + "algorithmId": "E346ADBBED73FA79F09C61F86A3466F8" + }, + "fixedInfoPartyU": { + "partyId": "1AEB3185271B49F4876F1C7AA368C5C3" + }, + "fixedInfoPartyV": { + "partyId": "FFAB9132126697EF7658025B0852E0C6", + "ephemeralData": "B7C17409848B2D10C3679F384540F32F84C7CDAB96E966B84F3DB03A67460A" + }, + "dkm": "0329C79BCAD311E133680EF4CF6001FFD88C25D5B7E735989720B80D1596F99669625C3BF945A91295C6150A99025DAF38B9C3005BECB2CA3F073E552A378D64A42DDC9420AA983346DE3E87C63E8A9723D3F673ABEF4CF0DA282B97E3E2A69D957C7AFCE68F08A38792872D4A61B064AE451290F25A72400EB367C48484BBD7" + }, + { + "tcId": 3587, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5382540BFECBE1BA830697B4B9A9ACDD", + "z": "6DDD678436320E8199D955B9BCAE7EE781831D8F5733DDB1CAF4688062DCEA", + "l": 1024, + "algorithmId": "F56A58CB58F245BC79DB3265F1B51419" + }, + "fixedInfoPartyU": { + "partyId": "66774081DBF8E2E98CEAF5EF6E9FC367", + "ephemeralData": "4017FE5CD6D32194F292147DCBEFC6004946BD3571E14310FEC8975D80E35F" + }, + "fixedInfoPartyV": { + "partyId": "2B577813AB5DA1FACF0F5D8324FFCB97" + }, + "dkm": "F11630044597D65B10A6C7F8BAA9AAC6525691326B280947EFF19D5FEB3DE3C03774673EF4F3B79CD47F264C25EAFE4362617F3F3BE76D58BB8C7B1935AC72D9787103A5B80F5DE868F65DA450E8F2564C2206F57B9E35600A7F4BA3D27DF7E9BFD76C587E6406158E7FE2202B54E7489420A6CFD5C60C46B855B63FB85FD889" + }, + { + "tcId": 3588, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C00330D378FDA7DBAFD7BF2C60424F7", + "z": "888363B66154218599377EFA527F3D97A5E1B810A3A46DB37044B75C69B735", + "l": 1024, + "algorithmId": "A390ACF1679CDAC896BAF290DF0F1E00" + }, + "fixedInfoPartyU": { + "partyId": "01EDD84D5851B4B2EC344239326FDA95" + }, + "fixedInfoPartyV": { + "partyId": "EA4FBAE2623AE41EFEAE05E08EF9F734" + }, + "dkm": "12F8C2F437BEC2195754718890116F967E524F6D6294B36CF7E1998C88DE47241C234EC7BCE9C25971CCC1443C181C16C2ED888902560EFE8E170F91EC84878AEB9980B944CD368581FD910DD34056DF87E6C4C41D4052B76C3ECA66CC967A7993188B15134DC135FB302EA77D20F7C80C7086FEEBF5613D3761308EE4D282A5" + }, + { + "tcId": 3589, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5BB34C12F8B7931F93D0A6D4F29BEEF", + "z": "EE5888B1A173D4B3F03E7CD42B1E147C4E93D526FE36509AE53446F830B2B9", + "l": 1024, + "algorithmId": "22F6FAE8A1BF673BAF87132BD26C12BD" + }, + "fixedInfoPartyU": { + "partyId": "23160B37FF8FD9BADCFDC936E71AAB07", + "ephemeralData": "A7B93EEDFB704117B218ABBB7BF748F7123393D3237DC17B28E609A31A0E2B" + }, + "fixedInfoPartyV": { + "partyId": "2609D94C746CF1C5FD4A3E7986034FBD" + }, + "dkm": "12B4C3D8DCBFADC586EED42F3FCA59EDB78E2035D40D1269D42CDE3371644A6A8900AA96114B9C412CA4F4DF01159A90E7D8D0E67B395F177F161E8F32697FE6E7958EB6FABFDD6DA423DEA989D3ECDFCB12FD98185DF1A148FFA9D88E44F3089E8B57C262AFAA47B4DF1825B719E6F5DA6F3A4EE114B0D40995AC4A89E11CFE" + }, + { + "tcId": 3590, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B08935F0471B9F8CBCA44D021B3F6067", + "z": "C8304B6CB82ED01B1101591B72C5DA68B1B78FA3BBF2E334C02EC7C750E8FB", + "l": 1024, + "algorithmId": "D0FD41B8E3CCD30EB877670B44EA7468" + }, + "fixedInfoPartyU": { + "partyId": "2C019110380A9F380836F0CFE81C49D9" + }, + "fixedInfoPartyV": { + "partyId": "B3E8537699F735D6F9576DC22A6CB3ED", + "ephemeralData": "4CC26F3FBBF8EFC5DB179DC4987EE301CF8901C94F7B39BCA477E2CE725AE1" + }, + "dkm": "F69634AD1C478236DDDA25568A8351F7BEE034DE64B7DDA2D692FC53F63E92373989DFB03F8C23DD3238DE8D962A3D099C8879C11DEFBC0DEC0D4E09ABA7DBEAD908965D1FC0417EF87E4E5DF7B3BAD9E7DD461337E0834560EC66A92AE4F83E42E82DA03EAD3597E2EAB6211B70EB624DC215D2D4C490D9FC5E46C903E94AC5" + }, + { + "tcId": 3591, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4B6773F47A01EC38737E4DEB5A9340D", + "z": "1C36CD3F3A54048CF0320B2EBC454C0C8665872854F679D178C9BD6E4A6B54", + "l": 1024, + "algorithmId": "A315F739F2D2036C64BC074AF3F8A527" + }, + "fixedInfoPartyU": { + "partyId": "A154AE02D64B282EA447D33DDB0D4CF5", + "ephemeralData": "94765C09838FA304298737D89640B86AF6DEAE8D5FE083E36F0AB8F8FBA259" + }, + "fixedInfoPartyV": { + "partyId": "8017E7F3B9F79D413C2C7AC4D380D01A" + }, + "dkm": "0A76116936265944A3A607186EA29751364736457A7FA895315F180D5BBF51C7456E930180792AD88E97963F29F5EEB1D3A60D62FED8C16FA9289CE8DA5ACCAC4F47DCBCF3CED63C520054664D46A495B47FD02DBEA96827393A62E637044F2C022072F5D673270203DCA8DE4CDD1AA3801FD9E78F1BDD103B158CAB77F2FE0F" + }, + { + "tcId": 3592, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6F1FFC33CD6372CC8949ED3AB94EB45B", + "z": "B443D2A3C22CFFA3BA428502CE08A2CD901DC3FC6374001651BD224708613F", + "l": 1024, + "algorithmId": "E6A1F667E27D72BC9ABB80B66DCA6FF7" + }, + "fixedInfoPartyU": { + "partyId": "7395EDA5D5A1127E3C8F5715870D52BF" + }, + "fixedInfoPartyV": { + "partyId": "F58F5E3B69EC94E8886A987DE0EC4E3B" + }, + "dkm": "1623FFDFBE2C231DBC3FBB3C921116A097FCBB3F57E9AA40D0CB02381802E291B76BA735E38063EA1185C4FBA400DE81D287CDE803E4269CCDF11FCE6F011A2A8C081A66F49AFC15FD1AAA29459C612CDDD859F48D9C01216355F8F8D50F4C1C26D1A9BB682C669E1C112A426A5D27C4F528275E3A21195BA37277DFDC1B46D2" + }, + { + "tcId": 3593, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F64D651A293684B171626BE5162C8F39", + "z": "C352707AA1FE0A7D0D136BA88EA8D1616FA5CC85535FF54FE5AE300A11BE4B", + "l": 1024, + "algorithmId": "3846682825EA9962DD7CA6FF536F6CE9" + }, + "fixedInfoPartyU": { + "partyId": "A4DC188520DDAA8A073C566AD9F34CFC" + }, + "fixedInfoPartyV": { + "partyId": "A3DF6A0D31FF93B1388AA4D77158D415", + "ephemeralData": "407DD53CC2B8A168A82551FA9B6595592D6487F28EFE04A1950A04CBD83856" + }, + "dkm": "EBCBAFBF189697D40D1FD7B8AB5D7F61F18BD237862B2A1602051121CFB256838BC705205E024FCB7D78BF8A77D8D00DF94C878BF42D8200F5B8921B586FC3DA651DAAAF07DBD355B1D705D35B35F0BA068E2D3796FD4A14C82C9B2C954241DEB06EE14F799F78F6310104682699CF09826E7FF828B6757997CDABAC8356B99F" + }, + { + "tcId": 3594, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98AEBD040ED8880DAFAB78B730D34227", + "z": "70F3AACDFC8FEDB7A4C8C7AE161709406BAB2DAA055C6DDC555FA9F82C6D6A", + "l": 1024, + "algorithmId": "78C3AC939972621A74028355093E982F" + }, + "fixedInfoPartyU": { + "partyId": "8100725AC3F7EDC7CECA80252ED9B35D" + }, + "fixedInfoPartyV": { + "partyId": "793287631A0A74C8A1D100A6ED05971C" + }, + "dkm": "059D72AA6B284B40BBF9E20164B28A3FE3B1C81D9B8DCB635D8602AF2B92D6E2289272F6F727FD1213B6D2414CB091CAE3890C57359C2BD9566F4DFFB1FEEE20AEBECCF857A6545A1C1D38AEC98E5B5F83B152EF8904696C21B59A3B87BE62818F01A78DBF19E5C96A74F26DD240217BFA7070A590BCED706E48CDD2C645BC9C" + }, + { + "tcId": 3595, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A31AC7A971572CA08117AF08B677C0A9", + "z": "46CAC7AD6F7BF4EF6F9C968D0FB3D3277A55B9BBCEF4B56B68F451CB909FDC", + "l": 1024, + "algorithmId": "B818D8F012637A4CF03C1FD910FC0C9E" + }, + "fixedInfoPartyU": { + "partyId": "C75BE114000C58B5664C475136BF6084", + "ephemeralData": "0E5A9B8A345A4D86DF281FFA5B49AEEAA3BA85D6D7A02F3F0C8CB7F69E30B1" + }, + "fixedInfoPartyV": { + "partyId": "308F75A621F6B2D4CD502B97FB24B498", + "ephemeralData": "1038072847867C5DBF0CBF61223F92D4A482575CA81850882BCD0097661669" + }, + "dkm": "83065768F93E740DC13D6CCCE3399630350C1A538A8FB4B5CFD2279F2D8F982BF21759AEEAA3E34136A6AE511272E10796C828339D239670556095C5B6C63EB7F48D634DD54B08539833277489905A42C6FD35B0772CF1F6AFAF1557F4A2831B53B531337FB7EAF0FCB6C471EC8ABE5B3C4E3C7B30C6EC61947CC4D12958D87B" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 174, + "testType": "VAL", + "tests": [ + { + "tcId": 3596, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CD4E626103E73D9621643A574D7CB8D0", + "z": "9FB9BEEDF9502DB63C62DF8402C6463AEC5E0B09E693F5E138F198028C", + "l": 1024, + "algorithmId": "71387310D8A1FA6C073387F7540F5D8A" + }, + "fixedInfoPartyU": { + "partyId": "2F4D66E8C2EE3846DB0D4BD3AB0AA530", + "ephemeralData": "9FF04BBBEB38EE18B20063B6F43B234BF847D4D691EC82DD0121F75C35" + }, + "fixedInfoPartyV": { + "partyId": "397442BF87C82F7DC262B8F321DF4F53", + "ephemeralData": "799B877679C1920426F5873D4C92914536BF6D1D532EE9AFF487CBED4E" + }, + "dkm": "546E48C7FA1D9B995C47EDB43EF65C50842FA1D2A9AACE3881471FC32059E29C5033548EEE626D58C2B1727CA8CEE93F755BF1621F14B2546F0AC88F4DE499BE7288D9732951CCE19D7FE6AE10555FA8811D552C39C82DAE8CB0A8ED058AABC0FA4F58851873C7F55C09BC426B8C3BB1F46A5B85B4F905CB8FF1FF065D2FCF8A" + }, + { + "tcId": 3597, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EA6A8059BEE5242A82279E69844F17D5", + "z": "7DCF5EDFBB41FCB2B3658543FA5AA8DC71CF9FD24594D5BEC175113E4C", + "l": 1024, + "algorithmId": "5A66A2A8164DACBB815A62F38861E2DF" + }, + "fixedInfoPartyU": { + "partyId": "FE973FBA411798F1906ACA63413A279C", + "ephemeralData": "236EAB08C93E120E8D64AAA8170660E2B9D041993605FA15C48B7B4D11" + }, + "fixedInfoPartyV": { + "partyId": "28312C3C4011D8F25310CE63426473F9" + }, + "dkm": "03B7CD811BEF9AFBAE282A82AE712441422B26167492E45CA267416F7437EEEEA3CC64BD4E500D09B6497E135413FAB51C77D8A9D96FBD1E04A44754823F114FC16B8676440666A28431D7E3F6271780320F69404BB604B3F40AB66B72D72F4153DBF1E7F2B7E696320B78E054E4F14ED580779522CB685108A2B2BCCEEFD0F2" + }, + { + "tcId": 3598, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F0B8C69EA9DAC9677271A310E87C29AA", + "z": "C6F1CE0D57BADBB5A78A14BE62C647AABB3888F88680FD9B135259961B", + "l": 1024, + "algorithmId": "78840F2CB1C3CBCABEA61441772E2F2D" + }, + "fixedInfoPartyU": { + "partyId": "24680E7932B03C5D913046D3130320FD", + "ephemeralData": "3A45B98FB109FD99E27B87DCC97FEA8068F479A2CF4BD0A7BC968F2306" + }, + "fixedInfoPartyV": { + "partyId": "B6A303C7327841A3E8ECB4426419B9A7", + "ephemeralData": "490F9B2696FECB258F5FE928118AEE2CE586256C98A9E131AFB3C5BCF4" + }, + "dkm": "A7414A5D4BB0BED3BD91007C3F2D155E1DA878EE9BFA2B945059FEB0A44A66DC72B9682DAF6122B889530977541A595ED2543C2657A498E7468960F46374DA0273161389465B686496F172E7E5338A0A676B95A94CA4B946D8DBF568DF655986D5A9050D48C09F803B9304B55204E69BC268F7E9DFE277256FF8842CFA39AE3D" + }, + { + "tcId": 3599, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4BFA56C316D8C24F2098282230311207", + "z": "D911F140D4E7A9E30C9548B52CC8C899DF75636137DF75C5E7F79288BC", + "l": 1024, + "algorithmId": "F6A8590DF3E0071472B5B2D441616D10" + }, + "fixedInfoPartyU": { + "partyId": "C5C1F8529D410EB0C78437950CBDAE9F" + }, + "fixedInfoPartyV": { + "partyId": "63D3A723AADFD93F650E0DE90FFAB641", + "ephemeralData": "1CA45E55A7AFA1B5C9173BFFB122E8EAB9F806A67B0144614A68A6B297" + }, + "dkm": "B1CC8AC21799EB960E32CFC1E1CCC21D0D9F4A71DC242733F6AC54568EC86163272F6B86BD7BF66B91A9C31C01CD5D5A7A7DBBE9B4743693BE6F8CA49CCA4285A8292B86943CAC60F249D391AD2846704945BF96157FD7502C075AB10399DDEA3F1FD604CA86627B868ED4E3FCCDEEEFD4CB69A2ED69C14C50A0DEE790B49E08" + }, + { + "tcId": 3600, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E921B397DEEBB04C77C8591E3EA5F698", + "z": "A706AF1ED491C4E3D603210D3A92696391214819CAFB1FBF67764E9686", + "l": 1024, + "algorithmId": "BBE3979401FC0F9E39383806D2BE38C6" + }, + "fixedInfoPartyU": { + "partyId": "6DAF27287712B1B47C306612EDEBA259", + "ephemeralData": "190E0EB434F6F2F9E200CCBE3028FFC3BEAEB0C2B09191D6763A89F36B" + }, + "fixedInfoPartyV": { + "partyId": "80A3625C59CBE312CC92DB78FF04B111", + "ephemeralData": "A701DA1D5B6CE745AFAB119E7883C8C105920071156DE369F74E13EEF5" + }, + "dkm": "B3B75CB8F34104E8865C375176C1717787072F5BBD1D32215F2D8276FA5D5802555F7C08D39378C2F8EF2167AE697B2D499ED25B39F1CF4A514ADE9C5BFFD77A0006B2A9A6AC18145E3F1D151685EF8AFE68A7737B6D403249E1CAA7113DFFD3055C40DF532C7364A39DDFBC1A860997C670ED07D26C515F540D150F5A7A1D4E" + }, + { + "tcId": 3601, + "kdfParameter": { + "kdfType": "oneStep", + "t": "78DAE153FE96414374EA231E1D94D2EA", + "z": "8304E7A24F29039EE0B90701D7308183BF8B6E75625B6E7CD7A6156EA0", + "l": 1024, + "algorithmId": "B1620D699F49D60567C919462A173A4D" + }, + "fixedInfoPartyU": { + "partyId": "B5A8BA38636ED9BBF7FBFFD0FB2414CB", + "ephemeralData": "5598271B388684EE8F496197D86A953456EB6B019821DA512765C0BFB4" + }, + "fixedInfoPartyV": { + "partyId": "8FFE38DA49C2A31D4327EEF0735AE3A7" + }, + "dkm": "0DBD762A36D2F298ECF5ED0D461DE3F9224C453EA41631A1EBE3F56FE1B899F4D9B5BE4651314311B2CF2B67655A7B382E9774EC4135B0375A16D2F9CB79E0A1E2A892098C8CF959F117A3158D8D782A6F480B09ADD05641B86D0CD9442994076C0508EFF8BC7CBB10517286ED26FE7677C8D4F96FF383100F7E933637CC0355" + }, + { + "tcId": 3602, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C02DF5C837184FE2D3D72A1B0A64AE2", + "z": "48FA5BD48AB3A26BC96E7ADF11F21E0180C3BE99B4D5DC6931D1150E36", + "l": 1024, + "algorithmId": "E952D50AE97A6E771448B97F5A02C726" + }, + "fixedInfoPartyU": { + "partyId": "B408FCD06D79B880BFFBB3FD6B98B8C4", + "ephemeralData": "0000279032234D825826E1EF8DE10D5C47626CCAB294657C727E66FDAD" + }, + "fixedInfoPartyV": { + "partyId": "8FE94BD6333B52C9945E2711FF9A6FF8", + "ephemeralData": "F3A59CC34DAE353662D15BB9936455E14C42AF2A218E260D438C6B5B39" + }, + "dkm": "E76ADC09957A3004EE32C2B1F4599356B97A45BD0226631732C8480DC143F9FDD89F2A17826216CB92EDEA55F224D2F750AB67E91F98C5205C50F979053242FE54C2049EFFDDE2815AD1AB85BD4129ED61B730B1098B5C16523395AAF7A9221062E2F695701AA012D12E52D0B7D41F8FE71F27D6B4A6A20CAB80E0B0D61BDF04" + }, + { + "tcId": 3603, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DB2BF44231FC4C52BBD4F6C8A3B2E41B", + "z": "8050D6EE97B150072F73256AAB3A5E55DE7F8E6EFDF3BC709456A1557E", + "l": 1024, + "algorithmId": "39609C3CAFECEB43F1DC7D9C29AA6BA8" + }, + "fixedInfoPartyU": { + "partyId": "675AA6BF27ABA50AFBE63010C04EAFAB", + "ephemeralData": "4C7AC5A03E7724CDBE40BE51726C99A6BFEF0577ABB7CFD786C2EDFDDD" + }, + "fixedInfoPartyV": { + "partyId": "E1B965087ED724BE62D911414AF56070" + }, + "dkm": "3C1F7D2B26D0687F4F226AD30E864CE6609B4A5A93E5342FCF948C8288A5F6CCEEB0F1955567594597C213E54BDF6D5D854EFE5B486E701B74DC22FB1317FE1D52697FC2279FF9BA8ACEDB8738A2CACC1A8585FA51E1C19F919A1F7B89D7EB2FCEE60998BE495913699C6530EA55B365A3ECB3EE5B91BCEA6FD9B518CB26E614" + }, + { + "tcId": 3604, + "kdfParameter": { + "kdfType": "oneStep", + "t": "209BB836C1F19CD6946FCABBB86B829F", + "z": "6DC80DA93280DDC852147E81BA3E7F004D7045BC92EA4EDD57E4B0B2C3", + "l": 1024, + "algorithmId": "409B120D835BEF8FB6095F64E43EA24B" + }, + "fixedInfoPartyU": { + "partyId": "84FF268134C2E8B6615BBF3A54D77F48", + "ephemeralData": "E0BC9804DC2440121B6E3C497C86CFAEB22FD5FBCD863AB506B31CD647" + }, + "fixedInfoPartyV": { + "partyId": "85C46CCD9DCA41B9AC376233FCDEA1D1", + "ephemeralData": "D07108C2DA974B7F33F75AFBA67D1C02D6F79534E316C2DC04ADF23A03" + }, + "dkm": "88B81D88DC66700251FA38A3E409F9E24DF04182891CFC4F74BE5AFDAF01D432AFEEA566BE56A28AF6DEB309DB129677A68679BF5664E0E2090E7BA5C840515B7DE3AC45FAEA5B4829640F16FB72C404D366BAB07A73E5AA30DE3EA08068986AFEED4944D16183CE9AACD9C4559118CBA9ADE111AA3F1084D237B2DF3459E523" + }, + { + "tcId": 3605, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC06FB9FBA66A18486683438837BD427", + "z": "16BE4D0E21E88E6D52392F5AAB2A9C9983EC2EFA702D5A66F26E69B90C", + "l": 1024, + "algorithmId": "60308B0AF091D133CBD67D60D295891C" + }, + "fixedInfoPartyU": { + "partyId": "063D124E79C16DC12150E4C4CB372C1C", + "ephemeralData": "BF6EECE9084CB4BF21F6CD54169C18E44D812A9E79CCCC440F3C04EB02" + }, + "fixedInfoPartyV": { + "partyId": "25454AFE6BE70CDAB9620BA6E1515A04" + }, + "dkm": "E0745D64E252A46C5A5C8DEE29E245D3AEB1F4C32905D04A577B87F8BE54E3D40E31760344B5DAFB9FBB4E2E505B43C6AB37341D7D023C952397F9D041980E77BCABB73420640600DA70024347D45C5B783AA3B08051D3868E596BA593A8FEA68BC586080E8925F7D88157A047745B82ECE9C9E38C026998F1EFE77092EEE119" + }, + { + "tcId": 3606, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5743A8A61643F6154A4B96B7F206B03F", + "z": "10F2473279A9D6A2E91419BC41389165EB51D26083F116435EEA21EA8D", + "l": 1024, + "algorithmId": "7368B36A0DC60ED4BE0254E95D7CC540" + }, + "fixedInfoPartyU": { + "partyId": "C3566E1499FB147E927F7F6FCA2B18EC", + "ephemeralData": "7B1DA7C2A511E57B86A64897E124FC2C707713EB6E2F8EE9D40B65B05E" + }, + "fixedInfoPartyV": { + "partyId": "6C94019B9D2E17048D97D380E67F33D4", + "ephemeralData": "091A7FDC966458F09093B799B47142126653CBE2721C0ED73375FFE80E" + }, + "dkm": "CD110FBF73ADFA4EACE11F2D98F304896A20209B9B77AE210B14B2FFFC50D0D1664A3374A307A1B88A1A81DE7AB8B62D31F073C1A96B17AE35C5429B74145E5DC12FAA492B389BD2731E84E3463AB7CA13FC32CA00749B51B230662D66E80E64EB22CB9F25890720DA53781FAA0A0BF1C215489C514D32B4F8C96C8A721027BB" + }, + { + "tcId": 3607, + "kdfParameter": { + "kdfType": "oneStep", + "t": "100BC23B22F6A711DC3367A84F3CC7D1", + "z": "6D5698E51FC9B31D2D84F438765555C50AAEDA28EF13870B496B4ED29B", + "l": 1024, + "algorithmId": "B27F514BD3CD227C2DF963FEA9C15230" + }, + "fixedInfoPartyU": { + "partyId": "8D7F5F2840C56914037938BC17BAF1D7" + }, + "fixedInfoPartyV": { + "partyId": "3173634C851E7DE286CD02ABA0514BD1" + }, + "dkm": "47EAF28E875C94F5F4E9365E6C2C28AF9F1A6E2E7B5F94073C635B0C9F856476F72D23CB6136D2FACD63FFE423EF2B7C99D5E6167CDBEF2B114BA8BF8236415C165819F47745C895A892E4E4869083B48F97B7684F631C0B33F7992062080234931C6CB79FC7A59DC0992D98D7252271D4D2D3FAA315D9A5903C023376D8FECA" + }, + { + "tcId": 3608, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4768D38756149257EC6D9B54776CF74F", + "z": "DF0FC606721236AA4D8D1D769A2EB4146448B89CC557613F0CA7455E8A", + "l": 1024, + "algorithmId": "9D68F96EDD32AF0CB523F4A11DF3E0AE" + }, + "fixedInfoPartyU": { + "partyId": "E3B7B115951090C1B41053EA47392DCC", + "ephemeralData": "F70DE6D979A3C179017F6EF977527905343228E0F9DAB511BCE6DE4287" + }, + "fixedInfoPartyV": { + "partyId": "E873F16C831C0FF931837F4D2F7EF838" + }, + "dkm": "A5349D263171B3476A7B2BA65BC841D2E5A31FAB993F1B33B3679D37F476F169C3643A006C83C40E4FEE66BED979886DB9490F4527C547381E3E6AC2701130FB29B1EB460E28612DEF7CB438F5E4888D5F258993163FFD7787FABC38A45CCC379A017D228E306E511DDC935B43097FB4E577ADA98BE00AFAC89777D4A349363F" + }, + { + "tcId": 3609, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1E82F57971CD2B0A86FF1023E2E8D09", + "z": "2C3541522A957BBD0B9EA3105DE228B6AB7C7EF2B22605AFDDB36AFF3F", + "l": 1024, + "algorithmId": "2FD286A45F0853BC2E7F4808F1FA9987" + }, + "fixedInfoPartyU": { + "partyId": "73108B07885A521E1CA41F566A8DD6E8" + }, + "fixedInfoPartyV": { + "partyId": "D06E8A89D58482A64A8C473939AAFAFC" + }, + "dkm": "AF19BDAD54ADF975CBDBFE86785B9333F663CA0E588FED93E0A0CBB6A5C92DF0D9E2038577022B0F504F4C33C715A952A600064F0F610E7FB678A5D6E3811A1230B7F2E61A65CFA23691138601457A3CF0891F00AC422EF43E1D6779BD684CC5F1FA9E6430998AE7AA9EC724D789332CE86737155AE32B5898D8D8DD9A886DDF" + }, + { + "tcId": 3610, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B74C67FA485BEA479558E3F967346736", + "z": "E140526D452088316E506D15754F186CB34875EA464B0949F2AA7FF22E", + "l": 1024, + "algorithmId": "DD13D9207D519B008C523C2A99039E03" + }, + "fixedInfoPartyU": { + "partyId": "6D0E21E85DEDEB695A2D4E9A4E999209", + "ephemeralData": "F280290CF5EA1D19FADC583D6AC9F684645F6AFD48FCF9E5D30BD1DAE1" + }, + "fixedInfoPartyV": { + "partyId": "C35151529FAC36D56E788C36B2791086", + "ephemeralData": "3CAC07945A7EF72EACF0ECC20A78BBC716E6BDC71591B5E37D94F66605" + }, + "dkm": "460979DFAA1FF8629D0E8DDD499FF21F9A62C52B27348330FB3186A5D83A94E1354A4D01274AEEA4AFE1C1BD2ED022A38CD74DD0C2E2BDFD6DA284C5618E4FA9AE484CD8F64C72AAC16E79AC8DFDBD9CEFEA6422E6433B7EBDCDB7695161E2E605910CA916EDDF23294470B08D400A9020F4811CDF2B593C7B237FE19F24CBD1" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 175, + "testType": "VAL", + "tests": [ + { + "tcId": 3611, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E2C7FEAA1FF0B728C8BE673332B456E5", + "z": "34B3C802588F0E8E5C438F36406766ABF405F2A375B8D6FA828233A5D65F07FD", + "l": 1024, + "algorithmId": "6EA95F633E2C04335DE8F30FB8D74DC3" + }, + "fixedInfoPartyU": { + "partyId": "352449AE5D3732D4B1C9D3FF5B40493C", + "ephemeralData": "EA45AEE557046CB69CD8F4A9B159388422327F29A3964703C36EAC87974473FC" + }, + "fixedInfoPartyV": { + "partyId": "B2AA0D338BFC98D29DB59D6E5406A75A", + "ephemeralData": "C1A8694CF811DFBC83E6B4DD788149AB0254DD16A71AE1A79B070783CA102A3A" + }, + "dkm": "81A238ABD15DC968E787D3B31091362109F71F44BFB8F896F60F90AF0398A3F8820D78A5D014EC88D301667FDE26598C3523FA2E8E727F8CFAA5C31348909ECD5C24B1019463094A0D733BCF55CC9B701854C6550927BB4BDE89664516CAF6A2209548F886364FD990316F6B25478A7BB87896B670CD20E2B9E47A16FB29128A" + }, + { + "tcId": 3612, + "kdfParameter": { + "kdfType": "oneStep", + "t": "35FDA2F01248BF4569F9C0B92882452E", + "z": "CA36D2F277D173DBEC75F40BD81F0E9859B1B94CFD3714E7FE06A77DFEA23062", + "l": 1024, + "algorithmId": "A5EA1F5532DF036C26E43B3717DCD4AC" + }, + "fixedInfoPartyU": { + "partyId": "8C1CFB88A441843E8728EC7C25CFAA05" + }, + "fixedInfoPartyV": { + "partyId": "DE150B8ED50A23B5BB6D2A2483E17AEF", + "ephemeralData": "2C79AFB21DC8C76A6280E046555703684557DF63D1B3869A97E6ACDD8BE9A2F8" + }, + "dkm": "0232D819D559468DF31B94E857AC5CE269449DEE0D2638284DABF87FBE098B8F9EB48E1BC023ACBDC34A544855FF72A242787810B4CA123C55F780FA911E081673933B7E19C86405CCD8405D3CEB4569056F63B80530491D8B6C121C53E0EE2A60E56ED28C88FA99503FAED4892FCB5EBA5A519F603AB2AC681F75786A499689" + }, + { + "tcId": 3613, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6EC84DB9E7F4AEA552EDD2DFAE3A014E", + "z": "6CC5ED9142EB24F259C9CA2CAEC0A61527B5842C6DF29AB151344764D65C8FA4", + "l": 1024, + "algorithmId": "7A4D2802849B58C50E13326891BC5D92" + }, + "fixedInfoPartyU": { + "partyId": "5F7E5C751777EDE82F0FA268C04B2C90" + }, + "fixedInfoPartyV": { + "partyId": "720C0D5E33013A00D77677E85CAD4BDF", + "ephemeralData": "6BE089FC0E6768E8D5B5A71BA7DF5F9E8CEB134A534A09F6C2FCF9ABD3FAA700" + }, + "dkm": "6E3A0DDD99595A3A59F9DD044EFFE1A94E863619A1AB21C5DF01CD6CED8B09DD9F4A077F6FC58D7F64705D3B87CDBF126AA38A4A86AEC5E13184D6D757AED9CFE19F8A4E08B1F24E713A6E7E19115D1B3A33C1B5720B95023359F60FB096B510A077C95CA6595497AD05917A15DA1D3FE6543975ECD92FE8DD9BD085CC6E884C" + }, + { + "tcId": 3614, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8273AA95752A0973F5E05FFF62FC5B6A", + "z": "40A077281C6D709691D6A62D56D85ACA68C126BF216EE68942A31D4DFB1F4A97", + "l": 1024, + "algorithmId": "0361B8D7030AADEB35ED5325E16677F0" + }, + "fixedInfoPartyU": { + "partyId": "4C36BFF018D8BAB84CB666998D6B8839", + "ephemeralData": "3AD7A1BDCD729E8BA463CF34BA37E72D46121987AFDC648D73F0551DD23AABC2" + }, + "fixedInfoPartyV": { + "partyId": "A1309DD9020C197A331C6E65CC66D420" + }, + "dkm": "1ECCFB4C820BA12182F495238F12661AE9D4E8ABBC1D85000B9B57289F76B412638B7A9AE35034D585E547B447FC49F16A12620C21CCC01C65009B82881857716BFE2CA6FFEDB3C5FC49CCE172991A21C890F85F51BD9E82CD5E351512768342B11E5577E4B264BF2E6A81A1B8DA005D31147C5FE2F9147C60E048134373CA11" + }, + { + "tcId": 3615, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9B130C6CB3E4253276AA6838D36E968E", + "z": "D41BB97CC1E1CF6C064BAAA8E0F88E65E1B463F05BF73D30C42DAF018CA9E076", + "l": 1024, + "algorithmId": "119540102E6C38E0876C61E61346176E" + }, + "fixedInfoPartyU": { + "partyId": "CE864F70FAA3A968DF0F08962FB8D124" + }, + "fixedInfoPartyV": { + "partyId": "2177476CCD311FA394CBF23313DD4E03", + "ephemeralData": "2B62FC12DEE8F39AEDDEF1C03E6A795012491D955007FE78187E5C4A84AA1E36" + }, + "dkm": "01E7851C3FA8EF061B1602D765D6BCC5AAC65F756E1791DE60766A8BD2C62C402C9DC6DB6A7AB9C3BD63B1B7D7A3FF717A81D1082BF65F3EE8E6A0DB42EBF7500AC29B50D1FC3C65E58F153A7902FC90798BD5A67AD7E2331984B2A9B03F8FED51A5F0D80D49E4954BFA11B026F54030D6E9C98D3C3B4ECAE43F6B2C6D993F2B" + }, + { + "tcId": 3616, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA1F4C34F21563ED917C0BB9A222CD76", + "z": "46D54D3B75200AD902D7935A9F076571E990C198A5CADAFE2D45C6187EA77B9E", + "l": 1024, + "algorithmId": "1AE42CD87056B7920A4051D90E9C560E" + }, + "fixedInfoPartyU": { + "partyId": "2CF9D641DEA4F488AF0165845CD28C98", + "ephemeralData": "1102C1F9EF661757630B6433EE0B0D8404B1F2CFA50DA5A4A40B6F7F44CF812C" + }, + "fixedInfoPartyV": { + "partyId": "02B909F3C0E0B8C71D180106CC0FA2F4" + }, + "dkm": "4FD31C3DCB7CA3F9609A944FDB6BE8256A80B10022817F02C6489BFE6C637CF31DBF396C1BB9418CFC4F81E7CEBC1060A15280F07B7A1F536DE5AC438A89CF133A0F440836A2E066781FA9E88398862984D9F7CCAF8DD77C2BE0EAA0BD205F7A41E58627FDBA0A34D01980134B2EEB1AF76488F1889766E5F8F08FA9F4BEADE4" + }, + { + "tcId": 3617, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D90C54F5441D73CB047806092170D2B", + "z": "49D7649449411D69AE426E76089708A922C9B7F279126BDF1AABB7392AA1891E", + "l": 1024, + "algorithmId": "9647FE80311CC80F27B9D5217DCDB12F" + }, + "fixedInfoPartyU": { + "partyId": "84BECE6DF4B3FD62745C1C5CF613EE37" + }, + "fixedInfoPartyV": { + "partyId": "937B8661751CC1F347AFB7872E46AA1F", + "ephemeralData": "387600FF405B69AF6337AF1B91B9753ABC5E9B404DBB78A622AB8CC5D2A30341" + }, + "dkm": "58A34B1D08132A83DE957BCA58733CA73E0C86A75E5977C5C898C96DBAA4E4883E3E705B1E7030312922415007A922D921B3E8DC97C40639A4DA01A70E7337ACBBE460150A752EE53B3068E52BC4FD8A0E2D12BBBA8985BF611404A576DBC5C758910F968DA9346826FB84826C25591B9C6EECF163787DE41C56B19B82EEE6A0" + }, + { + "tcId": 3618, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AB15D690228A31B82B7D7490D906AFDD", + "z": "B9E0CD0B6CBE4073C043E67149EF30FB271EFC12FDF4F7235BED0AA9F41BC82D", + "l": 1024, + "algorithmId": "3D4EF338A5860C8F71EF959E766CF034" + }, + "fixedInfoPartyU": { + "partyId": "BB197F7F99B5AAC2D3935AD76F78DBF6", + "ephemeralData": "27F440AA30C7861B9CA050AE8437073B165550804B68805B844639CCE75F2662" + }, + "fixedInfoPartyV": { + "partyId": "5A41882BD97BEB31A12AD281A6A85903" + }, + "dkm": "AD59DA46F2F92226BEF6050B9B9F7096A2E4113B2B728ACD2DAF3160CA22BBAB6F664FE4BC1070A390D99109B008886ABD362E97823E805675D1E92A7EE8E8D83290195F4FE67201D7A4C56CA7A2D552F91CC61B621851CAFCCAEF56A32374F09AE8F0949988C25F2530BB65444051010E289782A1B5F61F939057348DB68E87" + }, + { + "tcId": 3619, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA33560718C1C155AF0B0D60B524EEDB", + "z": "B790ADE9AAA36DB0D3B449D422BD0151E2F064777EFBB144C3A74C93C60D8DF2", + "l": 1024, + "algorithmId": "DAF0463EA208270D97C5AB6BF81CBCE1" + }, + "fixedInfoPartyU": { + "partyId": "F1378D11AF7161468F472938B0B02DF4", + "ephemeralData": "3623C105D773DC2EBA27AA3FB34A89442096D9FDA926163AD9A905109806C7DF" + }, + "fixedInfoPartyV": { + "partyId": "8749E52113FED60728E41F8AE50AD8B2" + }, + "dkm": "30BD276DD490CBED270A8AF4E9DF418393A10743321C9A3755B1083EC9DB5551B4F6C8FBE80B7702F5AB4244686588E4918A16D3E3E6B5D26FDA1DDD7163435ED839B9DEC0E001BEA97773512DBFE9E5A46BC3CAB5751564B46AFE109EE7E30A826EAD1FE63EFFAFD87128154D825041CF8526526D5E014103D89D032F3F448D" + }, + { + "tcId": 3620, + "kdfParameter": { + "kdfType": "oneStep", + "t": "222327D40A6370760D8D1D81175A2BFA", + "z": "58E87D2B47417D1FBE46739BBAA2A9AA608D5A579AEC756E9724FC903D206898", + "l": 1024, + "algorithmId": "37A0FF326127BC80BD878FB7B88AADDB" + }, + "fixedInfoPartyU": { + "partyId": "1CB5F2300CA8C206FEA762DFCAC80498" + }, + "fixedInfoPartyV": { + "partyId": "8CF06BDDBA131E6121258769852A5F02", + "ephemeralData": "B856284393447DA8A27D2FD3BE1E296525C72C8D3ACAD9B4A3024881C3925202" + }, + "dkm": "56732315509B9AA00997F788D2893AC83919EB17D8786FB48D3B712BFF6E49D4A69F33EAE2D90B5E4974E96F9C3B55649E8B3FE9E9E4E60830DA154BE2E494AB79B3B1D888DCF39F9C5D307F8DDE443AA41F4F5A27D80E634DFF5DC5A4244BC8ABB384F189753E033D59FB9865F86436583F57483D749F0AD5B6503CFC169E73" + }, + { + "tcId": 3621, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A94B93B2805EACBC33DE1C172CAEE36", + "z": "7FAB0904788E03C3CF4899508E02F32BB050B7481C0904F3EB6D8F0325EADBEF", + "l": 1024, + "algorithmId": "C78BE93DEDDA1239E73209635AC601B0" + }, + "fixedInfoPartyU": { + "partyId": "147B20D7BD7FDF81A7C465FE62FDC07E" + }, + "fixedInfoPartyV": { + "partyId": "58E9E6F401FF611B9256C905B748FC54" + }, + "dkm": "07B826D7EC9B9DEE9AD8D1CC28A6C76DDC1A3215534D1D70CE776AE1AE404800963E70954F1A642D2558A591E8D590D5AC1DE3141F6EBA00EF66245E59C051518B66E159B5ADC10D0099691BE9DFA149F691E2D06C00C011C17294BEDC0F73028CEEEF5B5A14DEC11EEFCB1D7529239C2C5B333CBBBFB56760CDC99E015E584A" + }, + { + "tcId": 3622, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1250679C1B72432BD2693785B9FF48B4", + "z": "B0538800EAA4491ACB717D3E514BAE332F40C56C8B0A0F4BF98F462936ACF0AC", + "l": 1024, + "algorithmId": "9C5583CBCB13A618F0A3722ECF1B8403" + }, + "fixedInfoPartyU": { + "partyId": "6566DE2D766E05B96D731ED7DB1E0155", + "ephemeralData": "E23C9EFA0F3997DE3B145865A66A3559BBC3F9A4A1E01BE07E2FD3FF1BEDE743" + }, + "fixedInfoPartyV": { + "partyId": "0B14CC9303F65DEF2D569566A0BDE73E", + "ephemeralData": "8311A7116108B63DDFC455223CBD62FDDF4184209A673DB2D3EA9EBFFBA9D3BB" + }, + "dkm": "0062B92D38B8F5725807147FED146001C6FA491E2385F8F0CA6E4EB3EA8DA8A45690FD8DCCD8FE277FF1FA45DA3EB354E7B2FC278451906FF3A1DED0E6E19A1E5A5E2AA4466C0FF812BDED4A9CD251BDCB1E9FF83ECC7C716C72576985214F0AC7AEDB1E10CE54122522B90EF15EF315939740889EF2B423ED7E8C3A1BCE0BD9" + }, + { + "tcId": 3623, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4CC360BE0CAA9619DBF7ECDF7EDD3300", + "z": "090D70DD211ADEE70FD0D224B79BC6588B2149B1B754AAF307877BFFD648A083", + "l": 1024, + "algorithmId": "019BF69B77949469CC7D88B734B9DFFC" + }, + "fixedInfoPartyU": { + "partyId": "CF293F98358AD6AB8502C5AEFAF348D0" + }, + "fixedInfoPartyV": { + "partyId": "9C832A666021EF38CFB1270CC4F8B41F" + }, + "dkm": "07F4F331C7A6761651E004543BB9D2D2EF81FAFC622E59A8C7DC4A788F043984DFAB9C18A8E75434873CED424639720E69EDDB8536D76E067E74A72CA2DBF721202BF913D0B5B2327A3184DF9D6A4228C519CA248B9F4A7A7827B89DC8EE2E2E3A4E2A633D297D5D6245E2C6829CC26EDBA3A5C1AD87BA388A27C4DFA9EB2464" + }, + { + "tcId": 3624, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9EDEF844F14024178A03E09C9CC4A869", + "z": "A0FB5E472BE16606CE551E02E7226A7E6718EF6916A71600DFE3EFB9AC842E38", + "l": 1024, + "algorithmId": "F909BBF86FC00D7C22E58A9399DC8EB2" + }, + "fixedInfoPartyU": { + "partyId": "1A399B69DBA4BBCC976930A78779222F" + }, + "fixedInfoPartyV": { + "partyId": "E203BF6D503D4E4080AACC1181F7D1DF" + }, + "dkm": "87132070A80A19C4F57C06BBA8EA6CA6B33B25A1FA811159440AAD0D55B314C5382A097F7A10FAD2D1272318DA3F1ADD6FD95D3D435E16CD68E2686A8378157A0A1586B5568031BD9C5B79E94876F0C0EB507D74B313E7223DE2B028A3511ABD05CC41972EBEA208B60F7E395985C130F750B8E3B677699DF8F0B819757DD27D" + }, + { + "tcId": 3625, + "kdfParameter": { + "kdfType": "oneStep", + "t": "24C25F3BED5357E872DE353656D7C0CB", + "z": "A6FA9A0DDEA8472D09618326CED4D0C2BCB079087FE9DB6B33B5867FA6770E1C", + "l": 1024, + "algorithmId": "F4ACAA237F9A4F063688613590B90B3F" + }, + "fixedInfoPartyU": { + "partyId": "6F695F4C5BEBA40A457506331463758D" + }, + "fixedInfoPartyV": { + "partyId": "E0D025D6DE38796DAC99FEF38B6B2A96", + "ephemeralData": "1B7E34663D8DC568C976991B8F6F773738DDCEBD069781C38F5BBC899B1693F2" + }, + "dkm": "0D2E39FFBD9CAE4BE4291F4BFE0812ABC6284AF83A74132ED6A6FCDF6EBC3F3145369F29B839B612BD51006B1BBA4C7DC13130ABF66238C1D922685915F5F6D3B15BD58F82EF1B1E5EA319D5B60BEBA4C9668D7A8DD5351C1AD03208EFA5D0C8340532FA24B0551519E422FC8200CECD5C1CBB75DB3AB79C59FD1B172E14A8AB" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 176, + "testType": "VAL", + "tests": [ + { + "tcId": 3626, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FE40279EAE2B6B50385CC40D95DD0A1", + "z": "71AF55EB1AD9353AC05A8528860196B1238AFABEABCEEDEE5344E40F281506F5D934", + "l": 1024, + "algorithmId": "4709A228D10093576405BCECEFC3E052" + }, + "fixedInfoPartyU": { + "partyId": "E7F8093498DEED9578C0793103AD4F9D" + }, + "fixedInfoPartyV": { + "partyId": "3E9867290ADAEE55AB6FB0AE8D4E5155", + "ephemeralData": "D75A45856B6DE68ADC573E9FEEE3610495B9F23D308BC2A73BF189D537F1864D6F0E" + }, + "dkm": "A8D94C235AAF97675BE1BEF7525CE9E0C9A9467A5F31E0C36349A20CB8527A69336B764C626791CE2B818BD4B1DA8A3E97E0FE2B153014BDD5A83DFB93F175472F9BFA5582F72D988AEDC53B1BC13D6A1213EB0A3707836DC1A7B523C69D8E11D9540744C35749C91C948F3AF3F073A59443C5A82120D5E9AE9B2FDBECD7EFAA" + }, + { + "tcId": 3627, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C90D688EA57F46327120CEAF88D7BF80", + "z": "976DD0960EAB94032BA0E62FCCD0261313AB95B35D79538563A49EB37A16138218B6", + "l": 1024, + "algorithmId": "0A68A15000617A3824B32BDB359CC0B5" + }, + "fixedInfoPartyU": { + "partyId": "EA93D4F8CD484CE4390B05F4541F384A", + "ephemeralData": "15C0012E33D29DE2E8971A0D1F56767A13E1E6B5CC95F21E77EA739CE9E9F8E6557A" + }, + "fixedInfoPartyV": { + "partyId": "E7937F4F46EC8E09E1834F619E867A1B" + }, + "dkm": "178DA9D5CBB23A300C9604C384EA034F96FD1C552BE384266EC5C8D56C15E81ACB44FEDBE1DBA357C4674D2E55E3703DC01ED8F3F133C9DA2CB9879582CC31EA991F5EF7DCCECE178BF8960CC4609DAA7AF270A2BE6BF7C0EDF62DC8A7DA5EEDB0D08B3131BCF5D4FCEF6E4D1BF8ED1FDA5490C0485D3D5885D10C0144626CC7" + }, + { + "tcId": 3628, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68F600FF624874EBED36551C5B798671", + "z": "50361689BEA5FBCA63D0B3E84B6EC679C0DCB132AABFD8C879EB5C36012363A7F544", + "l": 1024, + "algorithmId": "4B481887B6B92C168820EE6FB6510609" + }, + "fixedInfoPartyU": { + "partyId": "9741412E5E8DA36F1C507028E4709172", + "ephemeralData": "390EB98934712645DB52760998F841A0386EA1B1EF2CB73B36BF93F40DF8F92F863E" + }, + "fixedInfoPartyV": { + "partyId": "BCDBB34264143A68507C847957068F4B" + }, + "dkm": "F9C45D03649F5CB7149A13E4C6624A0474101FC7C686A35FDDB78179CE84A511A007214D0ABCE73CDF766736943F7817FED7A773C063563AAD809FE851E08B3605CE0A51A7007AF4898E5D8073283B6ADA0353FCF0B65C9060BFFA5F33E9DCCADDE6FB6ACF69D3A647E5DED1890A6A3E63A55EE8C951842962C694F66160B6E4" + }, + { + "tcId": 3629, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BD1336D6E3F4B7AD5F5F9B728C423275", + "z": "96E22798811F6A8581722D762B0A97DB4354BF3ABB8356AA2D82CE69A002114CD5D5", + "l": 1024, + "algorithmId": "2942DED98454F55E6F65132132E1D2C8" + }, + "fixedInfoPartyU": { + "partyId": "347DF1DB09F1440974C8D527309103AE", + "ephemeralData": "F2EAED93A6693B312196CF061B232D360DEC74839500AFFF1B809E1F5FAAB27B5B93" + }, + "fixedInfoPartyV": { + "partyId": "946EAF08C4C9BAA69172A403E466CC04", + "ephemeralData": "B6D4CD8218D2064C7491BB9109070DB6900EC41287DA35E32D891BAC54776B0646E4" + }, + "dkm": "B65F3E171B9E04796EF35678F28A699CCF0083CDF69AE5AF5A72376C0C6F3999C7904BA998C2EB7A82110086E85200599B030EE34CDB1492458EAC45322873AB91143F4E5517F5EBD89871B76B0F025253C7E5B22D202F363CC76DE0C979240FBD6EB4704C8BF979CA95C46AB9E5778526F55EDA7FC82D96F50CA2467C40A62E" + }, + { + "tcId": 3630, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F1DC23BC727324361ACFDF9123CC1B2D", + "z": "2C74D412832C39D901EF995C09480CC9DC92E7EDC2835E346EE6F6EB2A8446E6C582", + "l": 1024, + "algorithmId": "8CFAFB22C51E51F7CEF59F5E0F1BBF79" + }, + "fixedInfoPartyU": { + "partyId": "8B36739671AB233CD62F0308B4145D43" + }, + "fixedInfoPartyV": { + "partyId": "E95F5B63CAB15082564D6978A9CF5ADF" + }, + "dkm": "3B3A02D8B43DC8D90CE302558748532D751A7F436D0E6BF03BBD1EC08682CEBCC924370485C63F2B4F3A0B6DF6D93C8F77EBF04CB9E3E41A2B079CE95A38D937E6BCFD5DE9B46255356555BCE845FEB377DD671A804963068980AA64773CCEE5F7FE4283E39EF99E43D8CB0E2A038EEA80BE15B8D6E5BDB8A69A61F315B33B53" + }, + { + "tcId": 3631, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A407C7E547BD52740919A8F02ACCEB07", + "z": "0EA3DD2F970524451FE609938AFE21EB09EBC97E7D3068A162262E841AD3F1BEFBF6", + "l": 1024, + "algorithmId": "DAD821BE0CB2ABA515DFC277B92800B1" + }, + "fixedInfoPartyU": { + "partyId": "F3D3F6D9B1078E049E67ED07E763C316" + }, + "fixedInfoPartyV": { + "partyId": "C5C3338E295FD5B40AB5676CA6E6DCDC", + "ephemeralData": "B7EB435B7574081853DDAE5BA968BD01523B11504F453502058660B9FE020366BB67" + }, + "dkm": "378A3147E1AC7CA160CA1BEC895F865BDD69122F237C756B0D4FCEF434A759A1DE34134E2282C3D9FF7F283D19803E45CF9C66D8475ED478DAAA49F6E28A3EF6B322403B83ED0FFF138BA7DF44AAE8BF8F2DF8E4D70FAFB335C336DA3116BCD434E26CB7B3CA52708A3FA6DFE5EDF9991DCB4B7DB2C89CB5CB6E758DBC869CE2" + }, + { + "tcId": 3632, + "kdfParameter": { + "kdfType": "oneStep", + "t": "77FA6E39DB6D42B48349AAFFC3C31767", + "z": "81224B4FAD058E0A160FB1AF37170F73FF9EAED4E48993D0FF4A5029068C827D6763", + "l": 1024, + "algorithmId": "5034EA1FADF91CBA898973D1BF99585C" + }, + "fixedInfoPartyU": { + "partyId": "BF6ED0F9B5D9007873EE60C4B26DB84A", + "ephemeralData": "70461F391C59D7AEBEA420123BEC411B99077185AF9D4A9AFB7673CBB72C5FEBFA3A" + }, + "fixedInfoPartyV": { + "partyId": "445450DB2953644D3EA1011D22365014", + "ephemeralData": "2B15825EE27ACDADEDAD9F1A7CE53A349B2C037BC25919F3086EBBCAE8FF507E5336" + }, + "dkm": "0388DC36224269C5E01C57014F518F243C52ACD35663DCF601A3A20B8E926FD1A837825A8438BB393BA5C141368EBEC8426F74C2DA390A4A343A50FD662230E8FE37994E0B3A48DC789B9ABE12AE992B0C3A90A89EA1CF20E0D97785B3AF3F402BAD3FD1C1A18226961057FBCF59BCCFDDF0721B48951C1253E417E6CD02B95E" + }, + { + "tcId": 3633, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBFFDA4ADE0A9708673EA1E38CCD86F3", + "z": "30B5BF2E88D81F2C10CBD9ABE2B2E8ADFC60C5A98266819EA2B1D71BA960139D3B5F", + "l": 1024, + "algorithmId": "886AD15374E5881CC57E9E4DA8A16D0E" + }, + "fixedInfoPartyU": { + "partyId": "796B80CD6559076D5BDAB37AEEB4FC67", + "ephemeralData": "1E194B1E6DCA12D67654043EB76EDC2F20905006607EDFF5A1D34BB178282C20E817" + }, + "fixedInfoPartyV": { + "partyId": "1453A7EE7BE512A7A203833EDD685963" + }, + "dkm": "302107ABBE36B012331A9992A6594A9CC929AD5D844022D5505F702F4808FABF08847FB46F2CA27EFBAA65883001101344AB62C2C9D21D2B79D21EB7960804D0182DE5CE3C74BE3762DE9A4D7AA01B4580D2F97E5A1457D78BFE7CE32E549D77EECA3143EC31BEEFA822FBE4238126E58DEDF73E0D826A5502FAF1AA6844DF48" + }, + { + "tcId": 3634, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9BE62B5B01D5E55BD965C3F5DBE4ED3", + "z": "E83F2D286356F2BFEE789D44BFC50A5ADCD106B3B29EAA81C445EDB8E0B6D386D4A8", + "l": 1024, + "algorithmId": "68D744DE19D1FD8FDD14735114AC0EF9" + }, + "fixedInfoPartyU": { + "partyId": "16ABA21FECDA7B18D095F2B204BD0970", + "ephemeralData": "843F461CCF8CC2C8A7F4746729CC49A941B56A549CE197C621C75AE98FE824B408D9" + }, + "fixedInfoPartyV": { + "partyId": "8186DF3638CFD1EAA9D37A88C48B254E" + }, + "dkm": "0CE918CB420A54435A1E1DFD8E12A2E399345E10C1CFA96C6C4C5D2D89E6D385D2A30D0DAAD73D99F705404B986D78474ECB2D4586741A5474629CC3136AAAEBDCC44379E02E2E89C9D2EF5F4AA1345A0596ED502667F801B6F3A95446894E4AB9D52E9031DFE9AC0ED9493D50500CC30000C921260167C6B035BFBB968474B0" + }, + { + "tcId": 3635, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CE970BBA4953E23752EB9F0DE2F4D5D", + "z": "EBDDD0739B0A70EF58D3A779A25692D8E150CCF2DBACB346954B849F717144BB640A", + "l": 1024, + "algorithmId": "577F04F8CE27C6412F3FA0AF12CD0261" + }, + "fixedInfoPartyU": { + "partyId": "C94C48C87B725B92AAAEECE53B4993C3" + }, + "fixedInfoPartyV": { + "partyId": "D57522B0792E81197013EB67E55797DA", + "ephemeralData": "07A5FD38E231806ACCCA36A85C05863998464124A78F57341E10ABE3ECFB15825E17" + }, + "dkm": "1FB869DE5EC5ED17A8E19DCBA8FAFC5703935536891E038354BE3898F201497A0EC87B0A212C53B7D567BBBDE8F2F7BD4F04C04BF7EB2AAE083EA001F167639A1B03DDFB90F49F9526DB39AA010A4E64AED1F7F6D52392857268EDCCF0151C4D444A35AC46DBB5B02CCCA36C193D3162040FEF31A66C51DEDC8428CF8A0BF425" + }, + { + "tcId": 3636, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03225424343A387E82D2C6F4B7834C7A", + "z": "D943A47D7E95AF132F3ECB3393EB327BC68CED7E5F7B248BBD7E4747D157A1CF8635", + "l": 1024, + "algorithmId": "C24BE4581DDC66F8A1B2CFE892B21092" + }, + "fixedInfoPartyU": { + "partyId": "4DB91E06AD3B37383B04A86BAA15D2E8" + }, + "fixedInfoPartyV": { + "partyId": "E1E74000B297BE27620353A118EFD85D" + }, + "dkm": "9EDAA9893BEE062E05A7FC4F87C99A10946148A1C61D49342767D9E5AC5D11467CDC2337B676C53EF89CB391C1A227E68AAF71CE9772C13A2C026977665075477F351DB63C35D9DA2147286985CF2F43161287BAE352D5D41BF9B029888D3A1EDB502A63CCBB44CE323C72D074F2D2B0885A826651EDB15F224049D7647F98BB" + }, + { + "tcId": 3637, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B0431A870B9112293481DC4319AC549", + "z": "F020A24DEC4EE249EF7D0E7FEFD51385DB7EFA704AA81180E19E17EC15FFFC6CE932", + "l": 1024, + "algorithmId": "6DD96317F62C24D3F65C08F46B82C62C" + }, + "fixedInfoPartyU": { + "partyId": "BFA0D7EB369CE29282D8336DDDF62EC4" + }, + "fixedInfoPartyV": { + "partyId": "F1DD94B2C909CB107E5D694266F1ACCD", + "ephemeralData": "3445BE4DE0B9CF675C5F98C4818A2FF680F98F42720446729D5D523A516EA0044286" + }, + "dkm": "94CFB5D8000C93A51F136C9857A8556141BBCB2CCCBD39EB966C1A30700756971C248F6E148FA37E0FB990DDF020BDD31FE7963D29E910C399F65777CE39B3FB8BC91672DAB7C74408B047EF4B80D490CCEB8BA32C8A8DE257BE545E6E09646B68D0861D66CDBE2ED853BD560891BC7277BEB5294FA2705A093636CB6806136B" + }, + { + "tcId": 3638, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CDE25C7D45F6AC43DC2AB77B2C12DC24", + "z": "FD848E204D07015B7F3583B3E9BBD919BC468E5620BCCCE1D9A616A3CD2E8B1163AE", + "l": 1024, + "algorithmId": "BCFCE9D6F3CB67EB9E93FDAE9F5B5F3B" + }, + "fixedInfoPartyU": { + "partyId": "6756231F5DD5A286FB38578E70D77345" + }, + "fixedInfoPartyV": { + "partyId": "4753B9580FA271AF558DB0C4110943C0" + }, + "dkm": "020CF76CD97D9B321467848996F055A5D738191C6A5A94EE601AA5B6D9841AC8C3253B53B67A2C40AA01FA2A472BF8050EB8E47171EAD8D2618F2603E0FD2846DEE3D01277EAE7101932B705A9374FAA3D68B06291738480F4B5ADD11A3581A769F535E24EC8B22B2958758857BA2B2B660D41FC212561C4612D5DB62E110597" + }, + { + "tcId": 3639, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AE98641BE86363D18EDC94C851AA8662", + "z": "A7BABAB17A0AD99C9E0E8B06A4A5C9225538665BD7042BADD0B307F010D147EDA107", + "l": 1024, + "algorithmId": "FF1FAE40C255521FCD636D3C6D2DEB20" + }, + "fixedInfoPartyU": { + "partyId": "FD07FA8AB1E6F79EA295512DD8C09FBB", + "ephemeralData": "CA0DD1A2145DA50F060334D12760A5BC1B5D70F21F39FD17743239619A6208CE41C6" + }, + "fixedInfoPartyV": { + "partyId": "40F4D864A47EDCFA9E5E05599EEC79EB", + "ephemeralData": "E71CB137A15FB5F42CC146B7C2BE8479336EF046D21EDCBC8B5C0499709E4E574BDE" + }, + "dkm": "EC13C4D07B1CE9ACAEC493D25337D572DCC9E71AE6A95525D035001749EE0789AAD10AB4CB5DB5AAACA3B2356582C9D31FD698D9AF359686B071527EE796F5FCF137D1715C5B3C7BCF9EC99A52D96AD754B10174E0FBBF9392EF8A757F81CDF925BD2E7F2F6811ED65D24DB06F3CBC686449F5E7E016A356D55EA94CB62A3E4C" + }, + { + "tcId": 3640, + "kdfParameter": { + "kdfType": "oneStep", + "t": "782EC1AA43ACADA0C5FB849A36E5CDB0", + "z": "1C79E22563DF38154B28CCD63677E699DBFCF2DA5F30D9063779F59B8C410FE3508E", + "l": 1024, + "algorithmId": "9B92BACC0FE6066C1885216E80748FE1" + }, + "fixedInfoPartyU": { + "partyId": "F004685EF6E166CFC4BCD891126C11B9", + "ephemeralData": "7684BC77519E7B459A4FE2E6AC654F977FF82CF8C624AB4FF859EBF10FEC648F026C" + }, + "fixedInfoPartyV": { + "partyId": "CAE9A0AA196DE038267B02CC0A49A801", + "ephemeralData": "EBD492A5EF357406743ED495B2EEE34FC4AE269281084D75CA5215AD1BBF66A06CE8" + }, + "dkm": "ADA8E7CC7C0CB9F57D32C4F162A53DDBA7CC222CC44C5B3515E6CE03DB6CD107EB2D2AF1470C9105264BDD9371A9E78104723BE5344FF42B0EB0CD92A8FC40F571B3BA97A949A8411DF4977DEBB99BA4A50FAE87011058942D2372806FFAB7FAB67587B8B4AB46F3D6F7F608E6DC7DB9FE64258D34DDC79C6CA988BF3CC2E11E" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 177, + "testType": "VAL", + "tests": [ + { + "tcId": 3641, + "kdfParameter": { + "kdfType": "oneStep", + "t": "33A19AF4C0BAD827D9CAAB33D7CD2679", + "z": "7058A6546227256DFC5126ED3CAEED323C260F87CD92EAF02F214D5483DB78", + "l": 1024, + "algorithmId": "70DD416DD828A3266418612D8901EF18" + }, + "fixedInfoPartyU": { + "partyId": "C942DDA1ECDDF7582388BD925FF4028B" + }, + "fixedInfoPartyV": { + "partyId": "9249DABE252F16DF270DB35D45D2879C" + }, + "dkm": "07CC78D340E19A37FAB9BF5A0EE77F01DC731FF23D34E91753E5AE74ADD636F6864A5CB1C2C72B54C69E03CD2ADA9D522FA19D442594C4A84856207F5C0136DE03EA3A3D1E7CF7989AE50B9859E3639699D5F7D5D76333002D9291E18060A6562D957BC5FD842DF05CC38A715F19B1303EB4A7D6DB7DCA962C55E73F0D63237B" + }, + { + "tcId": 3642, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C20E2E8EC68F353610283FB35D8122A5", + "z": "FCD0DADDEFF5670B10065D7E3BBF4CB5BBF1EC8B9F63BDBA57BC30B836BF08", + "l": 1024, + "algorithmId": "79A72E2EAFC47C378B96691325068F4A" + }, + "fixedInfoPartyU": { + "partyId": "249C9F509FC7CAE848EEF76EA7026E08" + }, + "fixedInfoPartyV": { + "partyId": "EDE079CD3A502BAF026590F3CF79DA7A" + }, + "dkm": "B38ABEF602B419448FDDB7A9969512AD86DBFBF9B2877626918D859EF8A9DD8C8D045F609C012C470E7403B5943A5E758317EC2872578A398AC5F82DFACAA8A9B9B6C72420145A82BC72F4EF108701D8BF06234EDA40C51055A61C12D7665ACF2868262E3DF762AB94307A4D80FB9C9CC4E0C0A2A127525AEEF8623D493F3CA5" + }, + { + "tcId": 3643, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98819423674ACCAAF4DD1648D4402ACD", + "z": "F6A7433448D42108084535B3E56EF15DCC19DAB2D79C0267A823437359EF6B", + "l": 1024, + "algorithmId": "3CEE3E79EF9DA297190E8D00F2C9FF1F" + }, + "fixedInfoPartyU": { + "partyId": "1A2B3EABD2D882AAF97BE58A84052103" + }, + "fixedInfoPartyV": { + "partyId": "5A2474DA6E5150E72562CEAEB575ED00" + }, + "dkm": "917CDC14A606214AD4AAE013D4BF8D31164B85188078BAF5DEE4E57219AE9A8A28EDA0E66F14DE773F21CE8FEBB262AE443E46A28DFBB6788C0ECCF59D416CF116B69130F962612F010F4628B8950C6322A2C309781ABF2B5DE8BAA52A5AD352D3FEFA273D93BDE14D40ED7E4DDC6A8F0FA662FD3396CFCCCFE8B02BD81ADA09" + }, + { + "tcId": 3644, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C1111D2A630CB4ACC786A5B3680723B", + "z": "797083D3969D12738F5C6030E98553EF1771228F59BED754C55CCE2283E09D", + "l": 1024, + "algorithmId": "33D842944782D0484C17B49FE1698BDE" + }, + "fixedInfoPartyU": { + "partyId": "A9E8119D5F2BACDF64B5BFB4AA55BE36" + }, + "fixedInfoPartyV": { + "partyId": "66D1F2C5300F105140CCE1274D5341B3" + }, + "dkm": "3A67D87A936758845DB894722B4DB500B00EC79DB1654E23C4C1358F14FB9811895E39096DFB965DE55F8A791C2709A49F5CADECDD66F96FB836DEFB6C7D095529BC2E737F1809693EE0AA9A143CC6450169CE6512FE06C0BB4335A39A5899C476EDEC3BBDBAD4B3D8A58C54DEB7A4C40A1022341746F282CACE31202900F0BA" + }, + { + "tcId": 3645, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8308271ED1733230D6FAE9677A9850C2", + "z": "80A334440535907DDB99BA118367FD990AA136336A4053ED5FDFC7B5E6936D", + "l": 1024, + "algorithmId": "838D91AA6E6D99F59E75A776350B8B66" + }, + "fixedInfoPartyU": { + "partyId": "9FC77E2627AAF0E3BBD7AB1600EA90CD" + }, + "fixedInfoPartyV": { + "partyId": "AFB91BD9922568B8D4C8F7A3B6D4D928", + "ephemeralData": "D50929B2425E2B219929CACF5A1B7695C9FEB4720F20A0AB26EDF3A14CA29D" + }, + "dkm": "8A8753F55340AD7AE8031FEA8F2F953B9ECE649ADE6D1379AC411D99E69DBDCF6B481B51D922B6A983B80833E951046E5520832861690202ACB1B30B7A068A52043DBADC696EF0BCF074E7317323E40F4F832DDE083545C09DDC5DEC65CD60BFFA570CE6E6F5746D5147C0A2128626099A724BCB1FAB5C08E26B9D3B07965EFB" + }, + { + "tcId": 3646, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4446B9250C5682A2E9C765513FE2E2D0", + "z": "F1055C2284115F0A65819126B469624EAA715034A329E07CDF9FD1842631A4", + "l": 1024, + "algorithmId": "21CAC119F54F03A21612B2A427FB276F" + }, + "fixedInfoPartyU": { + "partyId": "9992C2275F66033050469BE7510BBCE9", + "ephemeralData": "473D222B2384191CB3C3204478B938DA20BC1BBF241CCC22B21F04BBAA07D7" + }, + "fixedInfoPartyV": { + "partyId": "1490217E1B2E599CE4355B544A5278CD" + }, + "dkm": "EB627AC2ED602D10D7D19B5C0FD56B2E11931924A13D6B9440B60F0719DE1179CFDD6287535B4C7341F489DA7B65E546F854AE97E0A8A1AC34D63A88D31BB3D46D2B08387618FC845202494CDECAFCF357FB6CE1040A9561B21940B702F33F39FCE5DF3FFCC9F37F9DCA992E5D087F9A925566DA247C6BAE2532D6AD001A6E66" + }, + { + "tcId": 3647, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CC6DF9ABFD7C70E687844470AC1A0DCC", + "z": "91FB3844CCFD0CEB4BB5C32D18D84EFD0304A9340F2CFBEF8CA43CB7565F66", + "l": 1024, + "algorithmId": "225ED754792024DE3DF9B5B4B3859030" + }, + "fixedInfoPartyU": { + "partyId": "DE503543B12A8128E6A681F51253B7E5" + }, + "fixedInfoPartyV": { + "partyId": "FFB648D73EAB6A14B10840E1D3AE7F6D", + "ephemeralData": "3850A7FB17E0614B7704BE4DB9D7EA1FBBB5070499ACEFF1A87B0EF1557D29" + }, + "dkm": "0DE042E1FB2E26395BF26C7CAA72CF01320E70C1B953548BF3361401C383B16F314E583CFF715F142CF4419FB022E6996E81E15DF4A02C3434E17E7A37D2F8EC7B147455A862FBC5E027CCA612FE3AE944278EF4F57B13E531669BD459004FF316E55DF560240777BEBFE417F74AF91CF29AC5CC3D2B2ADEF3B01EB808EEBFB9" + }, + { + "tcId": 3648, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5CA5A1F04E8046A6C6724E787FDE98E9", + "z": "C063B87A5A0142B02C10B9EC2B3EC20151B0656F345B634FCF2524E008419D", + "l": 1024, + "algorithmId": "EEC6514F6B157D5605F1D04517404403" + }, + "fixedInfoPartyU": { + "partyId": "61092AFC5B3964709F9E8936CBB8D8B5", + "ephemeralData": "8ABAFEC538AA69B65AC735AC906E6781543407D4561362455D0786E6F99D48" + }, + "fixedInfoPartyV": { + "partyId": "68CB4775D3855AD02E2DA9B2B5CC18C8", + "ephemeralData": "6EE4F3AF51C04039D8A27E3BBB8E89A84798CEDC7D43428170B478BB94DAE4" + }, + "dkm": "75672656FD746196ADD3EE237D6F16515094D357BEEFB534386B82A551DD443400DF47427C956D1A63A0568AA5A54A010D3BCFE6829B2555A6D86D8E7465C7C64AADB85E96FCE27BE0A2A15C5DB80CFEE9BAC7051D44904061144198C07BE9B3A214532044CF20B4D864D43E4D01AD189D8227DD80C194FC0079341F080A9530" + }, + { + "tcId": 3649, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A7310BC853EA92A38B04BB4A4B9C9E61", + "z": "6BD85027D02AA0D056C2CF93B64AD9346D2A6E4E4BED047E4A4882CB4CF8A2", + "l": 1024, + "algorithmId": "50C45A22BAC15B4F06A031081FCFB175" + }, + "fixedInfoPartyU": { + "partyId": "9058A23D19B5A0A1B7E3931D791A2944", + "ephemeralData": "18B7B5E0645405003C3FECE082D4CFE5A0884454340C0F72102C150C6F1A34" + }, + "fixedInfoPartyV": { + "partyId": "5C63AF870E0709FC2E31DD2B403EB454", + "ephemeralData": "51B530E5D685A69D08744706A0DFF358BC30C7C1076EDDF550AFD6CD6E3315" + }, + "dkm": "24F71569D278714F3ACDB74C7130EE3BBC22F6130CC698C6AF746A08E14C127ACB894BAEF363F82AB12850D1831929F5F42F3E419C2C77A490A205652364902005549ADA596A927D77531844BF76C39A857FFDD976E53B3B5E5156C5E2376E2C0F19C0D3EE663BD4D4A1C62E5DFCD05961B12428A5A8ADFF8A553F2BE5FBDAF7" + }, + { + "tcId": 3650, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0D4C495F32AD2E5ED8A583F7043B51E2", + "z": "3E1A80D2089C6F18207DA682DA1A06EE137D791745D0453B17FFE1D19B5E66", + "l": 1024, + "algorithmId": "988D28EEE1119EC09E4C2D016674149B" + }, + "fixedInfoPartyU": { + "partyId": "5E8D3D27BE003AE3B6BC8D907B045277" + }, + "fixedInfoPartyV": { + "partyId": "2ABB45F74562823EE866C96E452BBE1B" + }, + "dkm": "7C5ACD728453862B00061C0C50775CEC597EE629976BBF12E54D0568C2984409BDC98FA38E213225518328E715E548395455EFE9105BABB1F1DAEEBA71DA854B02A79197D88EFA6681BF94705B4F147195BA7FEF6D21667986A50267F726347F4B88859D2A975E1915C8260868236066E6D0A5AA75207F9C363CE9CEED8A2802" + }, + { + "tcId": 3651, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C40131870264D6FF5AE5FC5060ED182", + "z": "E9CB2D07EA01DE5A760C5D63D4DB0B123E36DFCEB74875B0ECB401304F5957", + "l": 1024, + "algorithmId": "B0787B6F97B4249F013C545559F78DB9" + }, + "fixedInfoPartyU": { + "partyId": "16DFA77D905DE5CDAE482C153F37E48C" + }, + "fixedInfoPartyV": { + "partyId": "A983E4CA0051F4E24A1FDC3E3C64140E", + "ephemeralData": "0103AEF63733F517074DAC6719F8B1EBFFB2F87C007D072DC3E628F6A7EA2B" + }, + "dkm": "95DE4C170F543AAFF8D12069CEBC4D568BC7214EDDB72A1EF25EC10D7394A92F423E675FD194C2E80D892D90EE725A8986BEE97A3E34E4127F8D4E0EF4D917AA688F453BB6ACAAC5598A270B66C6AE39734D13F2D7E1A11B922445B6195A26BD8451326985556970551E5DEFF0554CE026976C52D70FEBCABD36FF38A53533D3" + }, + { + "tcId": 3652, + "kdfParameter": { + "kdfType": "oneStep", + "t": "287D0D0A5A496C43ED0573F537E94702", + "z": "1A0323EBBB8BD07F84649E2F77CCF76534FFE7DD336D32D8DEC0F34760B54E", + "l": 1024, + "algorithmId": "F49B9FF2F59F5F18245E6C57FF79D5F2" + }, + "fixedInfoPartyU": { + "partyId": "062740870410684100533E3DA777E20B" + }, + "fixedInfoPartyV": { + "partyId": "2FB5F3056877E131EA8A4E963D62E438", + "ephemeralData": "753C98DB5C0CBCEC9374DCA03EB37685A83EFC5F8DC635CCA426F65870FB28" + }, + "dkm": "D99033C68BA37BB4C1EA7B12734C50CD16DC07328E66D0FB3E0E152563599E4DAC45F8971EF3FE124B5510CC764A142CA9F1C8627CFE219BF08AAC969F708D12FBB4EB16FE3EAC1A1C96E3F61F524C63280114CE76DB6008C2EF0555AB1230F3CD57422DC05DA438BB4FF21972488F0FF2AE767AEF27459B76203CC61E2850F8" + }, + { + "tcId": 3653, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3469396F33058D16F07D40E7C8390355", + "z": "DC09B83700FC36E0E9C67DC8E4223C540E7B99A2EB796ED5CA8BC725A880CC", + "l": 1024, + "algorithmId": "E60D6A2F75A197D94C3DBDC516ECB320" + }, + "fixedInfoPartyU": { + "partyId": "56DA546D596439C91EE7C2AFA96C2DA0" + }, + "fixedInfoPartyV": { + "partyId": "651D928BCBEEC89705B7A1544DF7B07F" + }, + "dkm": "ECF77A5FAC23C8AA56E8DEA328E0A8A78D4D8567B006B1BE462E7EACC203A11E80EBC9D893FFFAEB555086622B9162BB0312CDB91B53FEE22BB3FC7EA6D20F8709AC68658A068138E0A56BE2C70CE6B8EAA82D2EBC12778F5E2E6AF8865C7593C78A8ADB4B821954D1F25923A3CED45CAEB5A59C93966C74F22E22512E91AEB1" + }, + { + "tcId": 3654, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EECDDF91BEFD9DBB11ED62E43630E6FD", + "z": "8DD7DDD9FBE304F56564D1A0DDA3CC92207891DB59FC08256765051EEB71D9", + "l": 1024, + "algorithmId": "50DF873638ADF8301E95DA77B6F5F158" + }, + "fixedInfoPartyU": { + "partyId": "801209E82E0A7F974AC19CC45FBE2B50" + }, + "fixedInfoPartyV": { + "partyId": "31488D6A211AF50B741D2D01EDF26A7C" + }, + "dkm": "D2073944BAF3CCBDC82635FDC8B1CBE2BC6F2AF6D2BDC8A1EA97603688014E5464CE7334FEBDE2BD6473333E1E12FBCB5D5D329F7DD3B3AC7B9C7E3C68967A65695090996C2D40A57422ECD0FA774F02B4B7A6744B428F3B219FCED52C81449DD1C022AA285CE0FCE5F9100C59409CFC59DA9CEEEDF857539B595FE727D67C51" + }, + { + "tcId": 3655, + "kdfParameter": { + "kdfType": "oneStep", + "t": "99791E41E422A6AD3AA06E3D128FEE10", + "z": "CD3BAB48E0A96DC81285CE1887BE94B355FC9DEC785EA9AC3D05906F32371D", + "l": 1024, + "algorithmId": "B72AC6E2CF80D7E80E20CEEF8DE30D36" + }, + "fixedInfoPartyU": { + "partyId": "9CB4F6DF69E2B10B26BA94AAB1E65EC9" + }, + "fixedInfoPartyV": { + "partyId": "6D01F424E6026A2597CB6096824F6F50" + }, + "dkm": "D33E0D69403A08C3488F2D5BDA6E061B3717A46E3B6C2A1785BB524295B9EFDD6AAF56D586F3EF81C2799A993A6D8080D7887406E1B7A049F7ADB5B76C4A79823F875D189F0A3AE21CB90B9994FD663A28E0E51B30EEEF2A4225EE04D4A3A08A481FF3D66ACC138A702FF4221C3A55051734F67F133807E1C283E6D16E05C805" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 178, + "testType": "VAL", + "tests": [ + { + "tcId": 3656, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8782EEB93F0020CC829580A90B7E9616", + "z": "A3E1683DB341D113B1F726ABF1438314035D66702708487EF85E6E92E9CE73FD3E", + "l": 1024, + "algorithmId": "845EF4454CA5646F25A3E22F03797BD7" + }, + "fixedInfoPartyU": { + "partyId": "5E7B31784F72DAE3D2C860986F32491D", + "ephemeralData": "B0BAC66E064BF0925B63758A548F08333AAFCACCB9B4182CDF2E54381153C2E41C" + }, + "fixedInfoPartyV": { + "partyId": "A80E291EB033B940DE100C8EBE8748A4" + }, + "dkm": "4E113C1ABB9F5D5BDB7205CFE22C3A9C3AEBFF5CD879B0CA879A9D55F0FB98DEE939D9AADBF699CEE8A377A1DD89E242EC7242CB9997249E09CC0E4D4E5FCE0CE32DA159AD68E37415282895B9F228E2CBDA4C08C2D8D586666C842612EF830A8653BC5EA6C7EEE2A0987011CD0935C04E617F3EA7F98991ADC697CCA5AC7A6A" + }, + { + "tcId": 3657, + "kdfParameter": { + "kdfType": "oneStep", + "t": "19B941C454ADC15E4EB0CF10AE0B9784", + "z": "F33816E041BF1E503F0D21E3B227F2DA67BF0B580662BB97CEDA4A57EB0FC836D3", + "l": 1024, + "algorithmId": "2E12AFE2BBE7AD7ADB35EF807C9EEFDC" + }, + "fixedInfoPartyU": { + "partyId": "B506474E1479DF314C2C4203E7ABE7CE" + }, + "fixedInfoPartyV": { + "partyId": "8280EE988B399BCFBA14F067924FEAED" + }, + "dkm": "F34276E96C77357D836CA4CD827F81F0DBB722A9E545857F624E8A6456EDC66CBEE2EAF22DD25D8B010EC6A3036EA72D1CDA2AC8F301CFD05BB4CDCB16B9222D4C8525AF0511236468A0AB258509E2222145D304A4ACFFDFD3B8DFD5A32F752D147766E5C6783D9EA74666ED8DD405453BBA0EA940B6ECE169C04830A1530DBE" + }, + { + "tcId": 3658, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F74511FD48D03269A3D740C14D42CAF", + "z": "E04C68C2239D808FB8BBBC62951558576A8B1126A7F69E84499EA060306BABB5D1", + "l": 1024, + "algorithmId": "C7331F857FB0549D8796B0A0A729F530" + }, + "fixedInfoPartyU": { + "partyId": "F200F246D687CA358C4E97C873D0AEA0" + }, + "fixedInfoPartyV": { + "partyId": "521C867B02E0A0B3F0F96E7A5FF8C869" + }, + "dkm": "81BD826CD67D7F06A5464DB426EE8630197673F35CA1502A664E77E632172E15E2FF5186E027AEDE65F26679CED04437041DD38F41B62772AFD42B1FF6A7E7276893266F5F52ACD689AB9A027E5A96B390A87DD1247AEA2F7D1104D81C469EA5CD085D182FE97FB7EC9DDC157EE46D3BB33621592E4C7BD8FB7A78BB29A9DC27" + }, + { + "tcId": 3659, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2AE1319D00462177241FF39C54E5B67D", + "z": "F9A22259E2D008B23F86F244CFAB6E0B0201B0F894116F80DBD694D3731498A49A", + "l": 1024, + "algorithmId": "20D9CD6F415CDBD3BF5A29F280D65F79" + }, + "fixedInfoPartyU": { + "partyId": "717F8F0E841B780E21A9ACC535CBA631" + }, + "fixedInfoPartyV": { + "partyId": "CC5E81F4C4CAC1D412B1565B36C291FD" + }, + "dkm": "A44E0EBEA9C6733758AD53A4F15123C82D96D4FCFD15C385C52A30663003487BDFC25ACBC0F6027561917BBEDD597F021629911F190B3C60192E35640C3E39B601D115034BACFC50C915EC2A08709FB1E943AE89563549A8394941CB293C6232E3D20DB3F69311A71F9CD599E17DB4454F707231C2FF610E3CFF44B5A71D8B7F" + }, + { + "tcId": 3660, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DDA0B995706E079D9B964A8AC198521F", + "z": "321A253D8F787DA2BA02FCF6938EEFFFAF49E0F618FAC33E96C39C01FB43B482FD", + "l": 1024, + "algorithmId": "405E0428C8FE025489470D44EFD56158" + }, + "fixedInfoPartyU": { + "partyId": "95187E199AF7E7DBBE4A6AEB6C1E2220" + }, + "fixedInfoPartyV": { + "partyId": "149E031E56839BA78B86C1203C19E3C2", + "ephemeralData": "8659E3BC68C6CF43E19860FF258110131FA739BBB1728BFEE1A55547C1835263FC" + }, + "dkm": "3744193858DAC1CF132043C126F1E4F2FCF4BF7106281DE6F0D9B76AEE89ACC7B632659E16EBA3A3CEFB4A218E81A923C4302091EC6F44ABD8B4DE720D6789EF10B8B857EC3B9CD456E91B3A04A9B7B12E01F81241DE3619EDDCF1AC8E6D3645D9F329C350ACBBDA7708987F6BFA8598EDC9FEF25CE5A09E75AF242602E8B85D" + }, + { + "tcId": 3661, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FB500F4B998FB8C9F7D99C4C603CB2F6", + "z": "14061898E772F45113A904FAF2DE4B054E7B6AC9EED7CC982F5C86D95A582AE4EC", + "l": 1024, + "algorithmId": "A9E48719937365166331762BBE48ED45" + }, + "fixedInfoPartyU": { + "partyId": "4EFF0802CFB330DF2B1C4F8B5D34A777", + "ephemeralData": "23F44811D951C912B22EB6C21D352276C3C580977414E4094480DFF10872C3454A" + }, + "fixedInfoPartyV": { + "partyId": "33996B17374647DC55B56FA142D24ED3", + "ephemeralData": "1D30A79BF6707B40E06C072183AD48A0F0EFC033A78E28F6BF958F87F619DD913E" + }, + "dkm": "2E4042859A2271931DB8C5EB2EDCB38FF2A0EFA4409610307B6915DBFB4086C2CAA83BF9CAD10A6F79520374496BDE2DC2CFE1F55CFF1D47A038FAFC147C71D57D034918AB5FF2E414FCFDE951C24E9C92B541EE706F691AD82AF24741AF799EA4C68A479079D0A2FA75EE268047559FA4BFB2D75545C1EA78FD35BA3DBE9737" + }, + { + "tcId": 3662, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C8D213C7C190D572DF3F5088756D7C02", + "z": "E0D6FD7CC588A62B00E12260ECB0CECBCF1400B4355FF456B6D64C3EA135D124AB", + "l": 1024, + "algorithmId": "F2EFB35889C6B2E9C53D555D190A4031" + }, + "fixedInfoPartyU": { + "partyId": "D4BEAAE05B31BF972FC351B9E234DDFD" + }, + "fixedInfoPartyV": { + "partyId": "1E583911C3977534F0014BDC2145FBF1" + }, + "dkm": "484478ED505603E0114565E3E4F3EE80F38B802FF0ADEF58960EAD88D8FEFF360E3A84A22B07260F77B510C9C50F2F899C5CC36DBE54DCD60C8C7BC2B014E3389DE968A8AC871B432B1323C2FF68FCD26CB18E91E44D4C40D0F212A6CD73A7D0A0988B58DAF4389064F5953BA9B424866DC7E3F8016B14C02894EB11B8B834FA" + }, + { + "tcId": 3663, + "kdfParameter": { + "kdfType": "oneStep", + "t": "578CFECA33643DEE065EB82B619EDD0C", + "z": "64044820DF4274C5F2878933FF63D2F9B5AFF67F00B1E8373F81B78F04B4BCDEC3", + "l": 1024, + "algorithmId": "5F0A76438F76F1021253448062CB513F" + }, + "fixedInfoPartyU": { + "partyId": "476E05ACCFF3221C257C5A55BA65CB1F", + "ephemeralData": "FB05BF45B89511E33D559E5FF591B3E04DE4EF1FA2751B3FC234549057282BD17E" + }, + "fixedInfoPartyV": { + "partyId": "03027AB0611B9385103BC83BD877A12A", + "ephemeralData": "920E698DF483CC6F817818110C787E7779157F7C7CBF7F74EAD6321FBFB5BB245F" + }, + "dkm": "05AAEA3CABAEB7672381C4DD6D9804160FA3ABF18A340A9A262002A1B32037DBE1ACC8B6271CA2DB77C0AB3A79D03B7E54DEA47BEF830B50EDA30DA476F2DB0714F390455BBED212CC5A554A29879B984051A715FB71DF0714B9F1AEBEBBEC6752EB380C461BEAF96222A7FDB697447B7E88ED272DCAC657D7062B951A54332F" + }, + { + "tcId": 3664, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3ACC03A935F6AA2AD6BFB659964B04D", + "z": "42B552DE124F0E7B8B2EFA479DB7B1BCF2F67C5147EB353CF7126E8736E3517A89", + "l": 1024, + "algorithmId": "564A2FBD0117EE768D7171BAB129F629" + }, + "fixedInfoPartyU": { + "partyId": "ED51667FC629A25141C52066DD437733" + }, + "fixedInfoPartyV": { + "partyId": "80E919001E79BA57237F4246F40F7EA0" + }, + "dkm": "0600342B89BD6C60EAB07176B240AFFE548080793BAB3636E555EF52F2D202EC35C3EB21F02DA087F94C39DC489C523C208FDE61A36E96C812F94DE12EC7EFAC6A6A53FF065CC23DCE7A205A6B33C0E497DD0B1C00F00B19C01B621F9881167DCA1D33A844B8FA3FEFF1A2F9B1A33A849C4B623D8081EF26B8135F94D3F8F3B9" + }, + { + "tcId": 3665, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE8FB745035CADE5C066ED0760E1314F", + "z": "0750C56A436361781FB0E7252A7CFA0B23303D4E2F5D98158A5423B7661A7DD102", + "l": 1024, + "algorithmId": "07543A015C8496080B6D9F114639859E" + }, + "fixedInfoPartyU": { + "partyId": "7096910855F1D68C0E97A03ABD305A95", + "ephemeralData": "F3CAE7175BF54F9D6E626AE8730DF49A56474F2011BF56EDFACCEADCC412BD3AE0" + }, + "fixedInfoPartyV": { + "partyId": "A1B67B4E41B33FF0457DD0F4928B8917", + "ephemeralData": "5398221F20B6A983C776C962B4C496F9CC8B05E371F58D26A45BD0F7B763A2F6B1" + }, + "dkm": "C05EC2FB64E7CDA7A6DD9F69080091F725158DC09583B5BB209E6C3B56D035824A9C9B6C443A7FE0ED5F992C078576B55AA06F1F555B7558711BF373AEB38B29967C46C675B0174E1D5024117914E885949005C0D0EE3224CF6357DB5712AEB16DD5EFE4637F840B9953B28905769B369EE608E6DA9DD1C0572EBEE4A1D56FBE" + }, + { + "tcId": 3666, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96C97FF8CCE516AA6823EFE7A6775C5A", + "z": "FF830ACCB0246B3420EED3CBF314130BD4A154CB55D242312B59363CCA623513F4", + "l": 1024, + "algorithmId": "D42929AF6EC6C9030398953A169D43DE" + }, + "fixedInfoPartyU": { + "partyId": "C1DE1350ACB67A1E251E09C6F49B7A2F", + "ephemeralData": "628D21D0411C50D4EFF4020DACB85125D3BE265FA812D09642474028A2B56BECF8" + }, + "fixedInfoPartyV": { + "partyId": "901B75134E7384AD5B518C4A181ED36C", + "ephemeralData": "8C355EDBA68F89FF5DFF9889A6078C3CAF4375710523D8CDC677EAEA96088DED7C" + }, + "dkm": "705853A9DC11A0BC22DF2606672AB3F85CA1B883C190316CA9A4386E71A4E80A729A644B3B2D5A30939B26A99D64AB90CD1F567F01CEF15752A607B09546A9E1F2648E67A7D1D349D0E99A123E6DD7DB7A9BFB096D8908ABB9C10FE740158BC83C32F346FD0A954039D9730174DA406EF06EC70EC9A057C1C07971476B2C1B28" + }, + { + "tcId": 3667, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AC0BC572301630D8B3DAE927D3612E35", + "z": "CB03EEDA6BB9783A21367F8B884405AB281DBF69AD0900F5815C6845D73460F6FB", + "l": 1024, + "algorithmId": "49C3C8B01F56D6C9610A82EA50EDFB1F" + }, + "fixedInfoPartyU": { + "partyId": "716E05D0E8325104C6F0728F68BA23AA", + "ephemeralData": "470A34504D4D39837E153999B50546033EFD06A7F1AECD9C122A777023C6BFC707" + }, + "fixedInfoPartyV": { + "partyId": "2BA9131722D57C3D42B386044427D271", + "ephemeralData": "218F7066F2631D77C2927C39B8DFD58067C368C2DD2A36A048A98D6E446C280292" + }, + "dkm": "957D516678EB7CB9FD3FF7D0A23A8CA9A24226F79D2B496674D178F283A4DFB5DDB770A6C3FF533957A210902C5D24AADCE07A2D98A839E0B5CDA213193CE0E9D773AEC43396BA2453FCB3BA971E1149BF9C982C87C231FCF477440F7CCFE8C8CFD9F55BB0E644D10F9FF8720C87289851A5C29557BA2B5DC2C122209DED3F39" + }, + { + "tcId": 3668, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3FFC824815198E41EC3E1F38A6723F49", + "z": "4F04B46E2F0DD03C711009E1A1EDE3614E54876383EEA086BC18B23909D61C1837", + "l": 1024, + "algorithmId": "D2B40DEC85434B86FD84499B1129B02F" + }, + "fixedInfoPartyU": { + "partyId": "07DE694F7FB1EA5A8C10C9DDF1D34D03", + "ephemeralData": "06F1D3229058F64760D2987162B3157F9F9CD14DE8A568CD640C0F569D0F9FE7C6" + }, + "fixedInfoPartyV": { + "partyId": "DF9D71E7A7FB78E5C4F7663F64CDA869", + "ephemeralData": "7859D6782B9CF87DEF1E195F3704A47F9F76FA427BB65F56AECC4F556253C8E9B0" + }, + "dkm": "007F0F58B782A9B728024C0D3478B8302D8427F148CA7A1138C49818A138AA52528693541C21B9BFA2744C8E14F3F5D4B98C447DFF309B0407982E23E8EFCF02DE8B5329C9221323C09E09FDA9B4D0F0904E451E902F8AEA18C32394E0E2B0EA3C13A1DF7EEFD02EFCBC9D06BF20FEF022205028A2A9730D0B6F21727F4C4FFC" + }, + { + "tcId": 3669, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F34C7F90538197303E765491D1411718", + "z": "468D0AF5D5CCAC097CC15D6A8C7EC81C4128EF83D7DF5BBA95047525E94151FC75", + "l": 1024, + "algorithmId": "D0388DA74F0B930D9A485764DD48F215" + }, + "fixedInfoPartyU": { + "partyId": "A8AD6796F9D73B3DA2F2E7F63CAADA18", + "ephemeralData": "24FEA2E6C7862F4FDCD6354BEC44A9BF98CDAFA02FA879DFC4909E0B66CDB67311" + }, + "fixedInfoPartyV": { + "partyId": "279B0EF9790731AB0CCEB179D696E47C" + }, + "dkm": "2C89D9512CB56574D6D9F3B246B27843E08A1B2F98BCEB987D7C592B2B064A8EF4C43E5BD43F4233D24FB55D15B10A4AB935561FE6AFCAB3ECE954FB89B84EFFF8F08B636B279E62E6006089E4D0181DBAAC658685963EBD8837D43E1B0A1E343EB11319F849F8BFA0CAB5E24D9C68B83A3EC02419945009AF96EB39EC2C2307" + }, + { + "tcId": 3670, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9AA777ADD73C8500A0AE0ED5B038C643", + "z": "5BD7BBCAB5FCDFAEA9BC9514469E987E6676C28DB5287C1DDC90FFAEC3B0B7E4B2", + "l": 1024, + "algorithmId": "15CF75AE8098024E68A2F281E04E58CB" + }, + "fixedInfoPartyU": { + "partyId": "C273EA8592B7D4A8C794521EBDC9CEFE" + }, + "fixedInfoPartyV": { + "partyId": "A46212DA02CF1406FA4F9D5308DE2E71", + "ephemeralData": "ED55C1CEC5C53D18C37A30AA53F88C58EF3A6BC3242ADD409ED7042C47B8F9BFB7" + }, + "dkm": "E7D0C7721080A6D652B39476B84402A8EB1EA33AE97C984EFC88579CCD108F544F70EEBCB2028BF32A453E58211EEA1A0A1D6F2DFFE2C8990F11CD0756445A0B9BAAF43F570DD00B17DF359AB171807CD8CBC536B211CBAB9F8FCAA0EFADA38381A7850B5E2184DD1B41AE3346D8EF1249001FFACAED6523D714AC5A608F9AA0" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 179, + "testType": "VAL", + "tests": [ + { + "tcId": 3671, + "kdfParameter": { + "kdfType": "oneStep", + "t": "63D55BBA219D426B580D2301840A6B6B", + "z": "D063A37A7F67246BA42CF8642E89EAA3A1E0F8F77E293C8F06EA6C5992", + "l": 1024, + "algorithmId": "370E607972826936F43B6EA50ED38C8A" + }, + "fixedInfoPartyU": { + "partyId": "2A0A05E12EDC3124F41FDF1E94DA3919" + }, + "fixedInfoPartyV": { + "partyId": "D9EB8B6B053426BFA96356F31357C8B6" + }, + "dkm": "9203A04E5022007E8FC45338863306C85CB6348E4325796C687B73990FAC1040C6C89263AD4726868696D1BF9553E7F61F0972764B4CE67CC48F92D1A851FDF99B482B8E7D2CFCCC779AB983A5A54C0F5A3653C9AF30E7CFBD5AD0C3B4872E048DEFACC20155B2F4539255717CF0E67BE0272069107D2D04D8538783829EFC7E" + }, + { + "tcId": 3672, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8A2792B9AC0A8CA74A9CF280FA50051C", + "z": "40DCDC3FA1C185A7FC73C2709CEFD064AA5D14C890959227B94953983B", + "l": 1024, + "algorithmId": "89CBC04902989DC5886E4A6983893DB3" + }, + "fixedInfoPartyU": { + "partyId": "DDB86ABB73F4CF826DB0C60D7633CFC2", + "ephemeralData": "00CDA019821F9D9DE6E1F9CE54B54B7AA89213948EB4CF49101ABC439F" + }, + "fixedInfoPartyV": { + "partyId": "9D327FC26385B2252098A061E3CC3D40" + }, + "dkm": "554AB26FB8A3F2292FC433A82E2BA61436DA9A1648A92B6CBB43B0A110055AD909F2A35103FA045010DFC00A2F129F3BE3A82E37400A0D08C10683A9B71331D611B8F988C3563108A415B383A34BBEF4B887BD7AC924F54392E9B62567DE2C918DE82A1BFCF33650604A3E4B673F5A8BD4BB6943F0A873DF31125F38051E5D9F" + }, + { + "tcId": 3673, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A081366D0A5FE443AD87D495AF13AC1", + "z": "28A96A8325DAF76D26A69C0AE37031857E27FAFED85777174094C133E8", + "l": 1024, + "algorithmId": "3354F4AEE19DD23DB022CEA8AFBEFD58" + }, + "fixedInfoPartyU": { + "partyId": "834B829AC3AAF3C0337AF883CA294A52" + }, + "fixedInfoPartyV": { + "partyId": "CDACBC6FE63C7AF461775BED34CCBEBC" + }, + "dkm": "ECE25E11C585568282ED6E880883650D7B7F668CDFF9890D3EB633A7E7A42EC7989902ED535A70AA077D85E87D4D9DF80507CD3E0963DCD9E60072728BA06236AE63F86E631AB4820697F9FAC66AE0C6D6645E5397DF528C87D1327ABAEC52C4B27E26932F7F0EB859AD196993C51ABD8227244EDA51CE00619415AFF09C56F3" + }, + { + "tcId": 3674, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F281E2FC4334C1D58275060AE9FA55A", + "z": "D60CB813E129BAD094C1E2E215C2C8F9681F7F016A2DDF0761B48C7C03", + "l": 1024, + "algorithmId": "AAB0A5017C30FB0F6E0C0A59D56C097A" + }, + "fixedInfoPartyU": { + "partyId": "D05F4472C65249FB198479A0D2F13F48", + "ephemeralData": "FA909819A84480C74D8EC22156D24F4DD262C232FA673B4CAE718323F0" + }, + "fixedInfoPartyV": { + "partyId": "C247A66AB6F29A64889523D9595B8C22", + "ephemeralData": "D8CF87F149BA29F90866A6D86CAAB394C93FA328BA429D221BF303FB29" + }, + "dkm": "EA4C2E281D8BA5B1D7F89CCCC9834624DD9CAAA1E7D3B97DA57E6F3B40B68215870FE4FB260E286CB8A8D22B8B1CE55A378D1071041E9246F40F78DFFAA6916D1E0BFC8730DDD9ED7C91CE3612C5F4F4A19C3BB757463C23B04FD3F40042241A19F8E8CA496054C93D0F25B57D56E04550416B7BEA6AF0ED855419E694E257EC" + }, + { + "tcId": 3675, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B3E157702AED30AED77A3CA1E7B7954B", + "z": "05485E48B9109620D69FBCFAD15AEC8DF7457BCFE47804AF73241A1768", + "l": 1024, + "algorithmId": "3978FA4281B9011FA6C8F3790D20344D" + }, + "fixedInfoPartyU": { + "partyId": "C1D1023F909BC653DF2A190520C7359D", + "ephemeralData": "0E20347D7AC173F125B49A4773BC502B6A098147DD429A7659934421E0" + }, + "fixedInfoPartyV": { + "partyId": "A9D128DE2CBF4371033C68834FC41E97" + }, + "dkm": "DC092DCC275E08AF6D9020CFE121674921D1962B7BF26C387A67084D4CFFF3795C2BFECC065E158771AFC7AA4073C934CCD5631618E9C6B264698FD424309BD697DD27573C7B3CEDEC5CE04F068731A36B0A8E19788BE48DA67FE18C150F7260BA32F84CA737DF1FC6A67DD71A7DEE12A9DA8D00EA35C4B44101F55A3CD7A866" + }, + { + "tcId": 3676, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A49114BBA6F4889E14851BD65AFC2226", + "z": "7EC5BB2C811D43E1A81EF2C59081D13C57ACD1F51783A3258E3F501A99", + "l": 1024, + "algorithmId": "DBABEE283B37AF005166724E59400639" + }, + "fixedInfoPartyU": { + "partyId": "4AE043787E004D6B9D0DA1921DEB96C0" + }, + "fixedInfoPartyV": { + "partyId": "DE6A61BE33D7B7FC7222F51573B761BC", + "ephemeralData": "6A36EA96AAC9A0AB0A0D596FA9D3629E2FA0F17725E3C39AC48FE55F56" + }, + "dkm": "08CDEAD58FF7F7765C2F07C01122F5DF570048C5EFB0D690B08B7C3A690B2AD72B4AA7FE5D58BCDD5B949E788263E6FC6B6BE3C18B0AC7138E77DBBE6238C4FE152C4DD2E97BDC7F9FBDD6AF74FD4099D4AD77422DF2660A5AC2BCD8BD2E855B1AA7B409EA91A7BD5A592E80BE3D7A9E127E14E6AE77FC13A208B7AAC3C31FF2" + }, + { + "tcId": 3677, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC4F43ED3742CA5FC6A6F5DB418B2B4A", + "z": "814034A4DF71B5C90ED7C9389A2F9C174BCA6D03EA96E6B22887D893FF", + "l": 1024, + "algorithmId": "7E65CB822EFC9B385E5FC30B936B8666" + }, + "fixedInfoPartyU": { + "partyId": "87D856F5449755DEF3EE2E404BF57027" + }, + "fixedInfoPartyV": { + "partyId": "A57E84A767DD35AE7879B59C122D487A" + }, + "dkm": "07BC2149B10DE2CE55461F1159495FB05ACEADA197B33D3E666179AF51C71858D2976B386346B13138ECC4273BECA82C640DE050113FB9A9F8C6D41BB487D69CF539295B7D109610DAC1AF92366C4A50584B6740991377E12CCDBB194AB7C3F1FD817EE43370DBA1FA8A36B68BA510F1CD9AA3D055181D95CD8F5911B83A950E" + }, + { + "tcId": 3678, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCBAC0FD97CC8A1A4A214AB55C780044", + "z": "636CBE0E649C10522320E71DA40EA906511633FFD65A716CAD47B35161", + "l": 1024, + "algorithmId": "B175ADCC9F4FB7CE96782FF7D85985E6" + }, + "fixedInfoPartyU": { + "partyId": "17B6861E8FD7042EFA7B3D83FD0E99E1", + "ephemeralData": "900F1976132EC8CE192466F4F604AD9EE217400FA89AD9DFF2BEE114F9" + }, + "fixedInfoPartyV": { + "partyId": "3A2EDA6335B9EFA58BAA1558845ACC05", + "ephemeralData": "EEAC05517803898A92E542A309C9C67CAAB24B2AF2F34F91278B29654B" + }, + "dkm": "406B30359CDA4E78D6A5F341AF7E28F3856374A9421F6212EEB83CCEE0E44CAFC8459B09107543E3687B553536E84E03BE8A6A34573DA9F5F0F6833858053ADF03C7651AEE928C34DA2B9D31C93C8135E2387124E1DD9283AA0F020028B08731D25854AD9148FC663DA0F1D6C05629432EBFB84B0A1D84521D1FAAAAF20B20BC" + }, + { + "tcId": 3679, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29FE95C14E98CD2A1DDD4D3F8AFDE028", + "z": "2BFA919109C4205028188DC43E3EFF958AE256F03578EC52D3DE42C4CA", + "l": 1024, + "algorithmId": "8BCA5A7C7A06DE4C4366C3C8BBAEE611" + }, + "fixedInfoPartyU": { + "partyId": "F64E5585F4D6B7EC18B7AFDDDFB68218", + "ephemeralData": "23B70C522647E5AD02A06E1D4DF1C142D57EA37A00E508FC0F5ACE9592" + }, + "fixedInfoPartyV": { + "partyId": "1435DCF9AD8608D12BFCFE0DCDD1FBA3", + "ephemeralData": "F3E8147CC6C543C7B1D17E5DC151EFBD3387AFE5F856E0383703147516" + }, + "dkm": "FCD7D6789745522C5B136FDB578CD264E6CE4E159BC3D9A55E1416C60A9B7A3FFB1EACB8B59BBDBE01FA1C229724E4C31D3A38C561E885A579F9BF1630E1EC92EEF79AE6CF437F1D19AE4BBA1793A3DA591619C1F4577A2DB58BA9CE0C019275F5EFB8ECB3C5DF05C17926F48642BBC377F094A097876CE2F94FCB4C8F1B0B48" + }, + { + "tcId": 3680, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1AA1BBC76E80B8A5819C002E4FD29F78", + "z": "F8D7526898C41A3AC6850C7EA12AC7BC0D180D598F13897AD13750D3A9", + "l": 1024, + "algorithmId": "3F46ABB1C81C094F926A788FF8EA34C4" + }, + "fixedInfoPartyU": { + "partyId": "F3D4C0BF16FE6E0F5BDE1F016894CBFB", + "ephemeralData": "6F0D1092CEE89D0BB0798E931AB127689E8CB96F541BAF48CC56F1E973" + }, + "fixedInfoPartyV": { + "partyId": "25AFAD4DE4832EA2E569F515D0467A06", + "ephemeralData": "940A6478CCBD7389BB72F54DABA1383A87084B68D279462CA464D70670" + }, + "dkm": "F043AB384F832BB97CAC21A5C0910BA9C0AB8BF5AD0F3BBF269D6E12A7B8F3626899A2A713B33BC80714CE9E9717A4AE8534FB10E424950296168EA29105427D7A5A5A898949B01EF457F012EBF92EC84B8A38700719D2BD2BDF7DD89999A7C1008C8A9B28855FC31E1B07F7779339E07537B487ABCD27B12E92525FD05CF189" + }, + { + "tcId": 3681, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E3EBDADA7BA0181C1E1E318CBC5BF4E", + "z": "2E99C465BDCC3AFD734BEBE4FC6D852D683F3E967C20D58F11928900BB", + "l": 1024, + "algorithmId": "DE95D61D4FC4FC6CF5A37FF651CA0B4A" + }, + "fixedInfoPartyU": { + "partyId": "2AD3AF09AE846A93BD157AA5BDAE48FB" + }, + "fixedInfoPartyV": { + "partyId": "1BFA6AD7B1C0887DC6D3E3A03295A2D9", + "ephemeralData": "0C54F128F7DB645B925E2D2FDA3D749D98C9665E73CA566442D30AFD1F" + }, + "dkm": "787249FBFA6A82F02073B7EF30D709CB9007365C77D15DE451FD8EAE0373CD61333E3F767229650F6282153752D886C7746F10BB6864E266F07054094EB74D08BB253EB526F0B64E0956952576ACFF948C49821FFC13442A486924ED597BD47E14E4DB3326A83DEA07BEA6D2ED691371D5D88E42501637DEA096B33B18C1039D" + }, + { + "tcId": 3682, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC3B6F1C53118343A665F6B0E4721159", + "z": "AEBA30CCEBCF3166A102C1C7D9C0106BCB661E046249568DF53D487C99", + "l": 1024, + "algorithmId": "4E96E04FBDCE50ABBC5FBF3D747351C5" + }, + "fixedInfoPartyU": { + "partyId": "D7AC8128BACB595997D224D2153CA00B", + "ephemeralData": "47F66E80293D47F950E263579B9C5C2852794B335A39AD54795073D8DB" + }, + "fixedInfoPartyV": { + "partyId": "87F077DC8E4C915E4758F1ECF784E479", + "ephemeralData": "5417C53D5504376582C64EE1F1B7E6F9273591E1AEF548298D1D6E3006" + }, + "dkm": "05F56FF2FA6E683DBADCBB13D5A96BA5FAB81B1E6C5F6C252A5F42885D2E4292B3E8982CFCB853DA314A16604D1B935A88BC937A60BAE5A892FCB3C80C7DE77EF23DF544117655FB2D0755F4291113A1456DADCD4A62197F3C380A79C667AD6720A656FFAEBD89C17C2034CCF3252EB131B1FD4AF7E7F66C854219BA8B5D61DF" + }, + { + "tcId": 3683, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E4EEA0570F369D457F1AE3E2ED8E632B", + "z": "84CA7164ACE5258BFB9A935AE1F81F766959CD4780674E225E58840799", + "l": 1024, + "algorithmId": "970473621448F01C52EFA333D131EB8E" + }, + "fixedInfoPartyU": { + "partyId": "8D140183692D4280F3D2EA63027BFBDF", + "ephemeralData": "8622EDF07B4B0B369CDAD20B9E6472A2B2D5E06435FE51279EC77F4FE4" + }, + "fixedInfoPartyV": { + "partyId": "F2862E0329D441A5163CCD551D9AC32C", + "ephemeralData": "B0FECAF84D35D55CB845A008782E39AE4B3443AEDFB341F5E405BA9FCD" + }, + "dkm": "C1D9DD96E1BD672F1FC68DF52BDD7EEC681969BCEA17FBBC0850C7DBE7A837DB0927792D720FFA8AC5087E8E03D0A2584417BD1F2456D448F58445DAD2080EC9265D6DD2D5CB6476179A213FBCC81C5D4AEC87428DECD832566908682F3B639F311E9884B042CF45C5D13842FAFACA25E6301A971273F9C563D592B75CB884C8" + }, + { + "tcId": 3684, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0EF51DC2988CE015EF8917E81F200B2", + "z": "CCD49C2B88E2B1053CD50CF3168679EA6135F34FF5FCD07C1FC5F43698", + "l": 1024, + "algorithmId": "8615C7AC99DDB2A26FDC54A39E898073" + }, + "fixedInfoPartyU": { + "partyId": "9E2F8CF52F356650D275012CC25192B2" + }, + "fixedInfoPartyV": { + "partyId": "FBDFF43C128592741A45E913015417FC" + }, + "dkm": "BCD475442CED04526AD7E415740158CF1CD2F0DEFD83A8FE2F009BA22FFBF57D4E4F053238B2A8224123A165D8ACBFB9209BCE577177EF5356CB1432E59FCE384AEBCEA7BEEC62B0A1B36505A0B8BF7D8FABB653A1BA8CCAFE7B84CBCA5A92F5AB32B243B76939A74C4C1280BC538A72AD5114CD11A88A5B3A48DCEAB22D0293" + }, + { + "tcId": 3685, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7474F2674336984745EE12B65BF12AE2", + "z": "9D76C94500063FA745FE18D67C47D8B59147A59CB982DFA1D3DC494A9D", + "l": 1024, + "algorithmId": "E4BFCDC5E4A78BB3AFA3D30E108BEF18" + }, + "fixedInfoPartyU": { + "partyId": "6C1AA26E4B4111E2837A463217C1475F", + "ephemeralData": "B3D7C49AC35D6E5E30E35459E569D88DDB430BF62F76D991C6EEC092B4" + }, + "fixedInfoPartyV": { + "partyId": "6F5003A0E8B699AEB5369159992404D6" + }, + "dkm": "7DC3EC9C9C65B87B22D30A0F6FDD292D0C8CA479DEC1494EF40A3A3F132FDEB9046137609CCDDDC4FB30E2914F317FA0D85AE948E1E8D3185B1A6BAB03EBD8A7577A14E8525000174580AB72DEF7C99AF3EAE51088FDBBD065B34D19ED37C13924AC18D268F49457E7203403FF33B812EF400DB247A50DF697D3FEA3A6C08644" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 180, + "testType": "VAL", + "tests": [ + { + "tcId": 3686, + "kdfParameter": { + "kdfType": "oneStep", + "t": "080982759D9AF6B9A46F7F543C3DD122", + "z": "35B8F8411BFBCCA42737FAD1849C29DE056E8EB315BAB5C4CFFF06F9EF0824FD", + "l": 1024, + "algorithmId": "8A97B5B7175997D7EBC11F5BC042E279" + }, + "fixedInfoPartyU": { + "partyId": "012FE445462638B22E84104480AE518D" + }, + "fixedInfoPartyV": { + "partyId": "97F180B9EC681478DB871A9284F1875C" + }, + "dkm": "C3B3303C084F8972898A2176386E1FC4D64457A4BA6863AF2FF77013135852B37065B0D23628BE765A618766E8EFF2E143BCA9317D3A265E0483688B56CC54B6E707F9458E5B3235199150DB5A2D3F0B83CCE3DDB35A8A6CFD893B99E9101EFD58591337E14BD88BBCAEDE8A21304A51A60C5E138B33B8AFF1F3A08B031A2810" + }, + { + "tcId": 3687, + "kdfParameter": { + "kdfType": "oneStep", + "t": "84F2D3C8294DE43839F6E21652518E7B", + "z": "E5C7AEBC3DC5B359C3360557F22402BEF813DD99B8DAC485D0EAC1B31A967346", + "l": 1024, + "algorithmId": "906668BBE98D35B88FD80A21FEEC4FA6" + }, + "fixedInfoPartyU": { + "partyId": "5BA03D0851CC80A3BADC4CD248A30943", + "ephemeralData": "121BBBE438D74E6A267225CA399075F5FDD613ADFB00C1D23C402C00AEC56A55" + }, + "fixedInfoPartyV": { + "partyId": "6CF6BEDB8B000B62DC42360144676B6A", + "ephemeralData": "58AC4BE725BFD6B332BFFB92AC4191EEA517580754B1449FF82F062110C81354" + }, + "dkm": "D550376FE0D53344EA1ADEEFCDC17863E986E9FE57E59B1EA36B4909D1F3CC1809F07CDB8DD920AEEAFD6150294F288A1068E793050FACF311D93F8DDCF783E5AD47D5BAD273B6161B221EB09E3ABA2C94E21234956D816D26125A644EB2F4B93C47293ABC1F2AF16BA9C17D49B214B7A192A943BFB8489453E3325C2BEEA0FD" + }, + { + "tcId": 3688, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0854F64FA96F377B7011CB72EEC8BD7D", + "z": "A60FA94B43B3414BA2785B53491D9748151AEFA106B14A810F1A011D11931A0D", + "l": 1024, + "algorithmId": "DCCDC09CAC35809C5F52BB7B2EB15D6D" + }, + "fixedInfoPartyU": { + "partyId": "8BCF0B19276CB8A37BBEBC2C829E2C2C", + "ephemeralData": "72408850EE9BA6A2D88CE8975074DA0B3AD8C4D64EDCC5F1A1B1B50AD8B7605A" + }, + "fixedInfoPartyV": { + "partyId": "F4CC2DE2F73AE0ED7721CE5749F12627" + }, + "dkm": "9CDA76FDF09EEC6135B2B07B372DA853B8B71C51766FB16E4137939F9792C56149B70F0E343DC6999B184F715775DD162DF046A786E1D9AF78F8A697C936F82B4BDE8E9B8065E6A579F40AEDBA93E0B8ACA001E94CFCD9838751367FEB764C4D82A6CE601BA0AC20E3BEC47373D2CE58136660B3E1AAE8D532C642E3A7752303" + }, + { + "tcId": 3689, + "kdfParameter": { + "kdfType": "oneStep", + "t": "87B9986C528FE41140F2E01E8D285A47", + "z": "E99D87AFDEFFC0B2A2CCB3059867DD8FA0D5E7B19048123ADA60B4B196B4B654", + "l": 1024, + "algorithmId": "8F226C8EF64C14810ADA3FC21001A483" + }, + "fixedInfoPartyU": { + "partyId": "298E62970C534EF993DE8BB7D7A1C45A" + }, + "fixedInfoPartyV": { + "partyId": "74B32B82B5F0E411EAA18221318EC3EE", + "ephemeralData": "A02276DDEDA6A5ED004239B70FC4C1CFD5324F0BC060B79ED4FF04E9FD45EC35" + }, + "dkm": "540086999C7692F0F7A7344942FCA7DE7CDD7564E29505E43C6304AEDB120FAD36945FC533E31043B241FE03AEE60AE340E7CE67B29DED81AD0C75990F9301C45D5C425E2FB448903E1002CEAEC2EB6A9DB27F4ECD536CE0230A68FFD41098B31496D56AAA47327A11E4A040AE3E18D443991841668E2F08554376A7F5DF7700" + }, + { + "tcId": 3690, + "kdfParameter": { + "kdfType": "oneStep", + "t": "631A8C27B9141B2D8AA54D2D0B1CBA65", + "z": "2B05FFCB3B90F7C0A19F062F8B91F6A02BA5383C8336893157CFE1535A89982A", + "l": 1024, + "algorithmId": "C96E2635E8F354B72CB9DF57BE8166EF" + }, + "fixedInfoPartyU": { + "partyId": "F54E2217A4DAC4EA8376139C9DBE9039" + }, + "fixedInfoPartyV": { + "partyId": "83328C93505C99E8F824348FFA3019E8" + }, + "dkm": "EF3FA9A5EBC40F0C8E39072A0A62CB7A4936A2F8146E26BA6B20D19351E3B0685A8660DB76D2E9CCAC0B4B9E3DF2D29263DD24C9718B2EB34CC70373607F151D7DCF7141EC1F5C32C8ACF6E9F4ABE2A78265C27F42F714E491F321ABA6BD815C55BADA4177AFC30D4B0D75EDEC15492455CFBD6722236FC03F31B68463264887" + }, + { + "tcId": 3691, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6326505F07F2809A03BBFC24E544239", + "z": "8949B84F810834AD13E45E518FCF1EFDC9403E5FB7DC342EA2E98EC2110114EA", + "l": 1024, + "algorithmId": "E5CA3B58B4673EEF4FA8CFAA12D5E8D2" + }, + "fixedInfoPartyU": { + "partyId": "CB4183E38D20B159AA22B93943CAA10C" + }, + "fixedInfoPartyV": { + "partyId": "EB755267858E64EE308B74A296E7F2B5" + }, + "dkm": "DD03BD489353247885FEBF773773D32060CF593D46E65E8AB1E5DD5362D6C2224558349904733459618179D16F29651EAAC5B7844630535975E542B256C2EFE96F7E48B4B317F4531055DD01C3A1A86C22B848858FA1084F3DFBA07E515D9BF46EB05D8A5E60AEE54F0CDA929C07758144CDF5B3C3254DF68B168F860D999FB6" + }, + { + "tcId": 3692, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3EDD630CDE04ECBFB0CC8B995A70A5E0", + "z": "DEA5F5DF71617FA5ED0B43D19C38241CE57620F0CC11317F7DF962B0ADC99564", + "l": 1024, + "algorithmId": "8DE9DEB2DA328341B1D4E45D202F7179" + }, + "fixedInfoPartyU": { + "partyId": "9EBFFF7A67DBF3AB7DDD3C151D76F3A5" + }, + "fixedInfoPartyV": { + "partyId": "8C8A9D88013007DB89206D412BE7C21F", + "ephemeralData": "5056237CAC343994558664B2BD33C0FAC2BFA673A468DDF0BA47E0CF58AAFC26" + }, + "dkm": "10080A21F692717A101AC4C7964272559FB05B0D0D0A460617A74FE16F854D653540F218F2B0D0505CA0A38277DD45E6708C7ED6BCA3F6570EE89E9939CE9B957D48304A033F0FF5BF96514A7A84578CABB89C04AC3635599989B0E3A9E9431D64FC3993A787EC71F2DDE5597E69AD1BE38E15BE63BF5E562CD332FED99B00D0" + }, + { + "tcId": 3693, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C76F62CD0213D392DC0FC1C512FE4D9C", + "z": "AE604A6840E225D041B65975171236C7F836C8B99D2F21C9F8BAE5BB96F3E6A5", + "l": 1024, + "algorithmId": "D5A10DE05A92C4102D4D7B137402E003" + }, + "fixedInfoPartyU": { + "partyId": "CA227292A4490593B6190B1AFAB4CA54" + }, + "fixedInfoPartyV": { + "partyId": "C17E90790395C5B12F4C52584F973B1A" + }, + "dkm": "C0DB8D166804BD38F9A5A9B253ED55ED54C486F6541285599D0B4E83BC767019342B5732223809BC5E5471D6F2859E480EF2CE7C3CB1B3E1686B42DB98B002CEA776D88827B95A8CF8A7A562F8C1CB7D49F5EF6C66C405C40C178BD39570E4A170087DF03BF1FF0B231BC32FFD19349CC7A736DA344167FE32221F6F9EFCB8DF" + }, + { + "tcId": 3694, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEB54C84F9BB6A04C1155C3117AD4D3C", + "z": "B7829788986D67D29D29A319D69F37BE46AB84CD57B0C1405D055811DD02E8D7", + "l": 1024, + "algorithmId": "BE076B6ECD1C5F04069044027229E8FA" + }, + "fixedInfoPartyU": { + "partyId": "80F4BDAC70D64F47E3AD296886F54DAA" + }, + "fixedInfoPartyV": { + "partyId": "3EA9D46DEBAA0B64BF33B4DEAC4C3B75" + }, + "dkm": "0B01DCB3D901137A521D55A23560FAD79AAAC398F684616E379F6684FBB183871E805CEFA8BEC28CC3A892925079A047412A720EED4B32B0E7F08E95656CDD7081905E31DD6756CC0E7FE1E9C93069944254BB99A0F7EE0759C26C4ADC5F47AEEF7245595AE02EF17033AE5C52E40D327383750A80DB9A52E109436607A220D2" + }, + { + "tcId": 3695, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B0D09C966A0488CD7832C6B222C1930", + "z": "03A3D2BA4DB0D407CB84FC00704629EDFF98FFFBC289BC5BAFA41B35B9EBEFD6", + "l": 1024, + "algorithmId": "80E4237D1A166F0C6C395A963CAC8AF8" + }, + "fixedInfoPartyU": { + "partyId": "8CDCC0A3AFC67C75144A2A388D43CA62" + }, + "fixedInfoPartyV": { + "partyId": "1988F4566B60B11F6AD94B9CC2A079A0" + }, + "dkm": "01E406E3D59B9812798A43263F8F27DDB68730B52CB1FB76B2D6BC87D00926F11E4373E12E6DF1BFE86EB84EE80F8EEE929E261D06005B9E5FF9DB9F5CC4A93F617AADE82BCFA4A9379ACAD3B47F903839D35F59BE3DBA0FF9E2F2C4CD6845ABBE6B2A717B07162722BA84113CF79608301265573D464A8C9563BABD75DDE2A6" + }, + { + "tcId": 3696, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D56F32C835D593C03D8189B226F1EF80", + "z": "3579159CC8DFABB277CAB96699294C9F88D888A62630540AF6B06A3B1EDBE9A9", + "l": 1024, + "algorithmId": "DBBEEC5DF6D88F67414A715BA0E93400" + }, + "fixedInfoPartyU": { + "partyId": "38975A595D1BFA3E159F9F10744C031F", + "ephemeralData": "13571E6D9E6B5B14ACFF77633CA207FBDBF55AE88B906C641EF06ED5087C954D" + }, + "fixedInfoPartyV": { + "partyId": "A055890F33AC555C94492CFC7F4E0CA6", + "ephemeralData": "058A9CCCCA0EDF0EBDCEDE760CDBE47C1445B151027AF3CF96D657FBF4535D81" + }, + "dkm": "BD83B41549DC1F5D665F47948A4FE6E0C757866AA1C9D9973A28A4451E5281855E12C25FADD6F709977B205DD51C03904DB777D79FF33B0B37A0F2E13E7222D6FA1B2B3A116C2391B27B3815C401B8AB97AD355C42430A9C18FB8648F4B309C0A336D8503DDBAA6C64799D19646B30435029B512F4FEF04D20B8F89ECFDF1120" + }, + { + "tcId": 3697, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA751AB3834668CA6878FC5FC90F4DA4", + "z": "6E844B57551255AC43EBC824E1A7960FC57EE024B6A8E031908AC33464EEF5E6", + "l": 1024, + "algorithmId": "17025DAF121070835B1CBBDE3C13EF48" + }, + "fixedInfoPartyU": { + "partyId": "AD2C96286B4F8F114461CF339D2E45FB" + }, + "fixedInfoPartyV": { + "partyId": "4BE10AC6ED0BBCDDF0EB5A3244C7F1DE" + }, + "dkm": "6E50A6B5E6AD2A0AD12C0D6E3C080DAEFFCFE3FF4507A40F39B44EBA6B1DB9F2C62CFBE2DE68F12E14DA847213AC808398E002A3ED897064D52EC83A5D56BB590EB94E0074F99B7621E5C0D21E56A6B108A4F5CCDD031E65ACC2FAD3CAC9B3C849DBABC5DEB1C191F599E0EC9E7CF08381BA722C22E34E959FFB8CC4476DE265" + }, + { + "tcId": 3698, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4B95487394DC044E1A67215421D4876B", + "z": "EB2C574CC9B8F8F06FF0F208F8054D72E4B9D1252E5726AAE60C537076156431", + "l": 1024, + "algorithmId": "7C4213B346108133A0EC28CD07125791" + }, + "fixedInfoPartyU": { + "partyId": "7CF438CA2D77EE7B180CCCFD4F14C5EC", + "ephemeralData": "03B7A5C27B1A7DED41A6E669BC60426CFA529A439A7786A5743E429C422521F8" + }, + "fixedInfoPartyV": { + "partyId": "53387D944657DBD5824FA80736537E3C" + }, + "dkm": "59D189E6960C335682AFF9A4609A11DDC4671147864FA0AD4F969DEF6B6ADEF5C07CFA9ABA55234C0C4E53000763C9FC0D0B3DA0A4924CA1639CE1B56E3A1FB8DA4F075F8553B1374332839BA708062A0A8703889141B85AC96EE34BB38DD678703C6BE45F073AF3243ABE92A70E96B2E89734B495467F5C1E1724EB1AB51FAC" + }, + { + "tcId": 3699, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CAACD5BCC5BE98090643FA6EDE2D291F", + "z": "622098F924F86CD7E2C0BB973B9DDDA09F56ABDD5DC5902776AA3DCB7BA0F13B", + "l": 1024, + "algorithmId": "EF995D1D9F0D8637DC5DB7BD01721ADC" + }, + "fixedInfoPartyU": { + "partyId": "5D29E635DEB6B77EE2231EBD2C6443DA" + }, + "fixedInfoPartyV": { + "partyId": "708F7C86445EA4BE3180337037DE241E", + "ephemeralData": "273AF89DC57AFEFAE40F6A2A4173DBE29B43F1ACE204DFBDBBB982E22A479A82" + }, + "dkm": "C1BF14AD98F89F5D4C17A466234769DEF6B579AABEA853F78AB79EC78A2C7F0F3E1B4E8F2085AA5D10321C05316A12115489C755B1D734819F34623284C0AC47A112FF9B57066D4FB8C92950F315A6BB5118A4B07363125525553221EF5077D69EFC2211AC718A357A533D85F30FBB858B4D8B6C2515B93968C725125254E4AC" + }, + { + "tcId": 3700, + "kdfParameter": { + "kdfType": "oneStep", + "t": "22BEC59EAA228D8129710329ECAD0274", + "z": "E786023B82DCE74201E3E27EAC7CDD8BAAD1F5010FB35F98145C82A4401B7AAB", + "l": 1024, + "algorithmId": "8F49F3CC4BEA13AD24AD5E0F5D10B404" + }, + "fixedInfoPartyU": { + "partyId": "8C27624FC95399A6F1EB09D8519FC855" + }, + "fixedInfoPartyV": { + "partyId": "D995D8D9A6BCFD1996C9A31149C01E77", + "ephemeralData": "BDC1CC4B2E0BBEBBD624439DC5E4C3C650BFE0B11A8EE5058AF182D27F5539BA" + }, + "dkm": "00A9EFCAE0C83B59E1253181AC9710E83CEE4E2F4E05B89F27C7B575443C84EF74BE45232B7841123C29B255CC5853A113152715DE196675287E4BC92F4043D407B7E604EFECD8174DDE353557CF36CB1B25CE98B6B28BE0454EBD26C2FEFA77369902E3ACCB9269B03F46A6C73F562A04B742C3EFE1E85F365F86D398CCD0C8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-256" + } + }, + { + "tgId": 181, + "testType": "VAL", + "tests": [ + { + "tcId": 3701, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36CF7FC3F0921EBE7700340F905BA98A", + "z": "A09754C1F9049F12DE1DC86023EE3C4ADF5870F9866E565CDDA24819226A6E38", + "l": 1024, + "algorithmId": "D449582C0D05AC1F5B455417C3161212" + }, + "fixedInfoPartyU": { + "partyId": "4D7E79C5B8347E0642BA27EDBDD5CEDD" + }, + "fixedInfoPartyV": { + "partyId": "BF071CA9437A108C516FD5AB9087A5B3", + "ephemeralData": "2C615DFE4016616C65F9310F10AE0E33B62199186594E21DAB8123F19A9B2AA9" + }, + "dkm": "09AC5DF43391A92B3FAAFEF558BC19EBF79028FD89373D0E3E4F8BD6191592634BD076CD4D8D87DA10814C1E3CFF1A06724EC32C5B7A879E5A539460655789B7C530EA2FC96E61A992A236EC70AA1AA161F5E347740CCF3A9FCD3213801B5105CBDEEB7A1AB2336B7DCC139350F26BA0B32154499791DD4F035FCC59D64E8F35" + }, + { + "tcId": 3702, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F030610FAA42385FE1CA6696E89EC411", + "z": "D228A99B1FCFBBC7C188AB626B4742AB357079C10F2FA1ACB65181AA64B280B1", + "l": 1024, + "algorithmId": "5A75D9E3E1EB4E343853DE572F9C9127" + }, + "fixedInfoPartyU": { + "partyId": "E51FBA37F53CE7738FB010266230FB1D" + }, + "fixedInfoPartyV": { + "partyId": "78021A32B1EF9DF1F8058DC41ACDFE0D" + }, + "dkm": "173E53F0E5D78863B5CFAACF810D44909DDB20BEAD1175768E7BAA73F6C109D44666C75DEF198ECC80F174DE545A603FB2E942CB03608DE8A62FCB5EB7BAFCFBF0009130ED199F7B38FEDEEADB434F5FF8BCA618E227D77035A5209B42FCD18D7A3C508A55C8D123208845C1184244A7AAB3C0807BE9C447799C76AB35507D5E" + }, + { + "tcId": 3703, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D88F07921AB9EB4E30EC0767BD69E95E", + "z": "76D24EA829874276843ABB437FAE2F8776571656186DF64437F05D1503FC3FCA", + "l": 1024, + "algorithmId": "DF407C92810D4B7E65696115D672628B" + }, + "fixedInfoPartyU": { + "partyId": "37D9D399707832F900CA3D7F53B634BB" + }, + "fixedInfoPartyV": { + "partyId": "24F68FC6D6D28D78050E941059629342", + "ephemeralData": "82A3322AF7AF064EA79FAB1D70BA65955068A2EBC9421186AD6549F70460215D" + }, + "dkm": "04177D54F51971320AD368D7763A924E74B878986FCC37158662AE8DD531438AA0BB3B5A9A34E61E0FEB082CD6CBD6A2309E67ACD087418E7FADF1AD7775E673192104E878BF6EC014A05575B3A067879A7BC197CE4C7AD197DAB34EB4AC3D7F6213309DA9E97C329F60FD5D3B5178723451CC83C04FC5019624006BF125CFE2" + }, + { + "tcId": 3704, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2C20D2A8358114219E50C75BF055899E", + "z": "B97F7B4599E6250F476434D4C85DCA02327D0DFCACDA054820086D34CB252AE8", + "l": 1024, + "algorithmId": "69A7B94C19BECE8C28B1C6AD08C4600F" + }, + "fixedInfoPartyU": { + "partyId": "13A1A4ED55A735813034DC93223191AE" + }, + "fixedInfoPartyV": { + "partyId": "86CCDB6E860FBBDDC5B3575874DD324F" + }, + "dkm": "0ECF71B075D5390E92B5110497A927D0D70D2A1EFF92B88D28F448F61EC0F95D8D8B7D3F44CB4C8BDD25234B6F7E4AE28B39493FB11E3111E46BEF02DA3F2E44DE0A191362650AEB64EB8E176A9FCFAFE1F37B20D9E9C3DC95A4415558616AF3B25B5CF3612219A8A83BBF6E8AED764BA85AF2F4DD060BD019B7C890F51BC1C9" + }, + { + "tcId": 3705, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88FA34A8F1EBDBD4027ECC72C84757D5", + "z": "1F6B20693F34EC0679D44C49CAA98C2DD3A06492CEFF364124B23E4E9DE6DC6F", + "l": 1024, + "algorithmId": "8E0086FC80A28D541411541A09EF8445" + }, + "fixedInfoPartyU": { + "partyId": "706FB0CC3C8722A4973F639F20111992", + "ephemeralData": "7C55AC98C52625124DCA337F53783BE0CA21BB730961976D08223F308B1BC318" + }, + "fixedInfoPartyV": { + "partyId": "67318DDECB3217EEDA6293505C5004C3", + "ephemeralData": "F4856FFF0068649ED84C7AC46A6E46E441C0705D180A79CEF8E4BB1DF775EB71" + }, + "dkm": "B84DBCE3A0BB770E210DECC0B32046EE21385D992F0B478A28DC2A8CA74133E0DFD7FCD5289A120D69C38BDCDADC32DA127B7BFA381B7C63D7356EF7D229A1F7A9AB0F88E889342D6942C85A1AD35EE4C9960A852E66C0362A3B7B25A17E4B200A468C3FD203A4003E8A6425B01CAB55F739ED2081B1C54402CBCFA40D022324" + }, + { + "tcId": 3706, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2EAA1098309B31C3980D6A34A8F58556", + "z": "BF5DA0F823D6B752C4E66F4F369DD3DEF4A10342A423D8B2C7D8B8ADFA2E9459", + "l": 1024, + "algorithmId": "64CD366F102E6ED0F6D093549A4F5F2F" + }, + "fixedInfoPartyU": { + "partyId": "BF5568465CF62DAC9DB6D207DAB600C4", + "ephemeralData": "61EA7E8A78228AFF1C0BECC64D42E0637A12CFB5E1F6A869ADEADE7373C552A6" + }, + "fixedInfoPartyV": { + "partyId": "5EF6BBC02A9E2DCB21514C984E519317" + }, + "dkm": "67D6C6749D9F0414DEA37E02EB1A93FF493BB03D1657CF49065A884C7911E2FE8A93099159965F1A52F59B0809755C76833D6951B687BE67C18E33CB32C449B3D94B9C5281D419C8472054D1FF4EA9D3946B8C5A93CED473639EB58919FBDDBE55AB79E63085A5D71D05A9B2D38921CE9CE12D734850746022DF3D2DE19E8B4F" + }, + { + "tcId": 3707, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3776A408FD9A7D3DEC23141A9259A04B", + "z": "456B3AAF8A66FB7357A3AF125F320305B10F3CBF86CC38E874CA28206608DF32", + "l": 1024, + "algorithmId": "B8388C43CB7704EA74384908A3E8976B" + }, + "fixedInfoPartyU": { + "partyId": "012C9D47E2A9E4D52298D28364993F8D" + }, + "fixedInfoPartyV": { + "partyId": "CDADC440C224F2B13C8225177104F7E8" + }, + "dkm": "3AEB98B424DCD173F3DCBAE108FC6362C7F6B8CDAFF5CBA390E6A47AC2F425D4A0B3C99ADC6FF263050E499397D7C4829E908D71A0FD9BC61ED27CE939D3DCBD673F1C144E1B079A80A06999D2A4A5442D70C135216ACD3C81CB788DFD50F9BF347AF3BE9D79585E071E854E40FD4C7AF4F3C12D705298B1AAC1EF984C7057A2" + }, + { + "tcId": 3708, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36ABA9752D5AE008DC7789B4B39D9CE6", + "z": "E8C8932EB5C4C356DAEBCCB409D4A068AE86716C1D0926965A06776CB80181EA", + "l": 1024, + "algorithmId": "0850D44119CBBF923DC18995CDA0CE63" + }, + "fixedInfoPartyU": { + "partyId": "977059808D1D43966E9C98D2C02E9513", + "ephemeralData": "52FD5A5EAF71736504CFDBC642D60A205E022B50B3A86127951E81A2D4D4C5AC" + }, + "fixedInfoPartyV": { + "partyId": "1745BBF337AB2B10137113F4CE825B2D" + }, + "dkm": "5403D47529520D54918974BB43B54B8798CF7621AC4586BF750AC62C400AD26DE2D1205331390713DD9892A1E1982F9215983E7545144130D186775666EB2DC30C06C951ED34F44A9DCFCFBB4448DAD8E616408E0791CDAEB73A9CF50A438FCA8BC5A5FD2D069B09D4247B09A2FD65AC55214675A0CD8012B8FDD0B057D40B38" + }, + { + "tcId": 3709, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4C7AD0739873DF8498460068D7492350", + "z": "06726C26D1BA95110657AFA0159DD94DC2A8F8993276BCF8E04511F8B7DAF0FB", + "l": 1024, + "algorithmId": "7F96C7A02D489FD6E50599B03E2E5706" + }, + "fixedInfoPartyU": { + "partyId": "8BFE1489ACDE69DD3F86DEEDAF31FC25" + }, + "fixedInfoPartyV": { + "partyId": "4A8CB9745662A6D3984CAC6533994BB0" + }, + "dkm": "D27C611F1E4C6FF9B5C75F7C04878D428C1F7BAFC296FC3CF78181588F6464A848A1F037C88319129D4EC530B3F8C899C38AB5CE1C76868EADF299F9986FB705088F0B020550CD6076C9D352191EEBBD9CF7F4FBEF218078441627A8131353D89529572C4CA84E16266FCE6A9E67B732929B5ADECD3867CB669231B4DB3EEACB" + }, + { + "tcId": 3710, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58E6B0243BC7C1C1C3B25B4B6CCB9477", + "z": "A9FC0D5059CA94995A93615D25700D43128A866982C36D80FBB401CB739CB2C0", + "l": 1024, + "algorithmId": "7F6300A1EB1B345A2149181A8C584CB5" + }, + "fixedInfoPartyU": { + "partyId": "3B5A3097DEEBCFDF75B4F064EE2AC34E" + }, + "fixedInfoPartyV": { + "partyId": "7072AA5B3737D9421F5EFAC14017F8B5", + "ephemeralData": "7924843D7D1622CFCCC88C69E4159B228F3A69C2B5758E45FB5953AD9C5BA533" + }, + "dkm": "D911E1574AA14C3C7FBF0D9AE227F63CEF338D79EC3199DA8B9B3C376B09612A72E2458831E541A6D015A7F4116DA43401F5C8C00340C6BE088D75CF5EC27F8967042F1497F55D67C15A204917A30AB4B69DD8861433B70D1872BD020687DF62F9B5121A8B974924FF71E96B406982ACF1A962C73AEFC606828C7286D3E0FFD9" + }, + { + "tcId": 3711, + "kdfParameter": { + "kdfType": "oneStep", + "t": "042ADCCD6EF328E5597F386E6278AA1B", + "z": "659400F3F52DC5F27766C778271C038A144DDB593FFC3F3C9538AAD235D50AF7", + "l": 1024, + "algorithmId": "8EE5E5BB8B6D2B42626FE71E121E71B0" + }, + "fixedInfoPartyU": { + "partyId": "0AFF3F3C2E26E27170BCB00FB0936900", + "ephemeralData": "C5B23B37A195B6AC47DA049C47EF3E97AB3BA1427D0C425DA32F8B02C0C9E4DE" + }, + "fixedInfoPartyV": { + "partyId": "402EF2AF6DB20C63DDFDA4CA1C141A23" + }, + "dkm": "619B96A2DF3DF2FA9DDA2A14292E23AB04ABEEDEEB76C56F652DADCA071DF0570DACCD663C10187AB00F34411D01017EF1ACA0BBE306C55D07DDF4F9D95EEE82EC8A04EA6F10A98D0F4065D0A7A698A7C2C3518FFBB801B91C8C6FB353AB110E63BED25D4F83A92CB1493AD4FF472FF1C4FA4BBA9F2728E7647F7A7E15C1976A" + }, + { + "tcId": 3712, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28F1A88E5BD42774EA000C6BF206E27E", + "z": "5F25AC16D258D7EE37DC82D986878B58447D2FB0DBA98542024D42B7EE456B0A", + "l": 1024, + "algorithmId": "A0B9C2FD04048D07B408EBFACCC1EF44" + }, + "fixedInfoPartyU": { + "partyId": "45392562E6AF03943CE9CB7C92F9DB9B" + }, + "fixedInfoPartyV": { + "partyId": "5F95EC7AE9DFFF0D8E884F6B20020390" + }, + "dkm": "050A52242FE5CE78BD1EC4E626BFA1E6E18B353E35E1511DC3CFE1CD1C1C74D4BD34DA63D641124EC5BB16186271BA5E1C625BC236AA34033958F4C7C769B5F17C67E63CE8D099E9207838C15D8DA21D26622F2070976847D12E4B78CF84C02F03C23211D2A37D8B5CE1745B1BFD46BF85B4ACCEB4DBBBA9E8BB7356994FE750" + }, + { + "tcId": 3713, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D42CD6615775402AD85ED83FACA505EC", + "z": "B9AE6DCF2C3566E27AC524BCE2121BAF35EFF2778927242BF6AB4AAD0C043EEC", + "l": 1024, + "algorithmId": "51CAD5CD5D5942900FC4456C5F3F4152" + }, + "fixedInfoPartyU": { + "partyId": "3860D5B11A80AF5AA1A4BDD08F718415" + }, + "fixedInfoPartyV": { + "partyId": "76BE267F15462A8A78C71749C445A740", + "ephemeralData": "C288DA8C5D934616AA6CCBF469C58EDBFD050CC8ABA40D887077F1646080F273" + }, + "dkm": "2599E261B8831B62109FF8F275761F5AB101F83CA7CA78ADD438EB022C8286819ECB097A73C13856D8A22007C2688F9E75F8537411A365F7255D167AD267BAEED8AA0D31055B7C2F869DB1A5BC4D2778EBFA00573D77458871422CCCCEE099D16F3149C29742942B84B34361BB243F21918264DA0A458E4D700C0359DFEAC6F4" + }, + { + "tcId": 3714, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9FC7406304E9BEA3BF15E13496E56040", + "z": "6CB5835E8AA4524ADDBDDF827FA32F38D929DAA7D5768FB3A7863EB332944436", + "l": 1024, + "algorithmId": "51394859F0760104B83D9931918C9410" + }, + "fixedInfoPartyU": { + "partyId": "15A3A4872D64F5B858072FB650F9D73A" + }, + "fixedInfoPartyV": { + "partyId": "B2F84034F97C8B63061C195A40D59680" + }, + "dkm": "BFCB82082FDDBA1CAAF939C88067232D3974AC3F5C326E3BD5E1E3F970B43C969FE245B62EC7B3B41C13D5A49DDDC469C0CBC9875A7E4338A895CA6E9891E282AD244D441810E9784B1AD3DF26854F4327B954D94CC67E9B54B54B70AA2A10241FCC5F6E060FF02B5BCAA3E489EC02EB7CCB78CD5E5259310A3CDD5E9CD13AF8" + }, + { + "tcId": 3715, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8FCB9797D8EC97CCB19CC619A9F84BFB", + "z": "55C3416AA5DD350C40206E9B1B5939283EDCD817F891415036A0368CAB0869E7", + "l": 1024, + "algorithmId": "2C937D9015B7ACEEF9A5227A8DCE7D58" + }, + "fixedInfoPartyU": { + "partyId": "40CF05C7C41BECC1AF6495BB172D28E1", + "ephemeralData": "4CDCCBDAC2FDC32632FD29C65EB9B5A7F2C1D6A78AAB1C2FD90AA646C2014407" + }, + "fixedInfoPartyV": { + "partyId": "161924B8798C3E23819A9461882E2981", + "ephemeralData": "AA0179849C883B381A129138A77E095E3F64FF47A9839CCF47DEF2E115501FD2" + }, + "dkm": "94AAE867CAC9FEF68720A6CC1B7949E4F6536749893180098C80574BFD80B75EB7FF22BF1CFC726D0433A94401507D63A9683DE81C7A43AFE9616D128028CC1EE09C619D4FFCB1313F83C5AA31F1E9452D8022CA7F21FCE382D58E9641D9B0A1D157AA4FDB447DC855A7C3F07EBAA32370A77986E0E1EA3D1E247AB51EB5E72F" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 182, + "testType": "VAL", + "tests": [ + { + "tcId": 3716, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A978AAA610D3DE69865D859EFDE53FEC", + "z": "DC1ECA07189BDBBADA5A371EDC2ED9D452E8148BCEB531659905D0E1E7CD780A0FE24499", + "l": 1024, + "algorithmId": "DE873AFBB79855AC88E7BD0D2CE3BC96" + }, + "fixedInfoPartyU": { + "partyId": "1420B8C929588D2FBA012AA423AFAB81" + }, + "fixedInfoPartyV": { + "partyId": "223FF1530026D06C05D27DA742CB06C8" + }, + "dkm": "1EB0671117172AD9A8E5569C442E5073FDB65CF3EDE5AD5CB3609AA82E1DF43AC2EB858C9FA4855EA5B14888BF4B789665EE1C459458B266EC91CA1AF05D2B6377067256AC460960DC08DBAF8AB67585FA07EFC4B6F9C093043004FDC5AC66643042C010D737E3AAF7BDE3F81C900A9A91DFF9BB8C57779DA5F305F51A04A559" + }, + { + "tcId": 3717, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E453554E81C6165592D5E0B84887B0F", + "z": "8095CBAAC35345D3674D1775057DC23D655B33B54CF26440796B42E81D10AA37075270E7", + "l": 1024, + "algorithmId": "AA5E61F07C29EFF8A72EEFC8B371A263" + }, + "fixedInfoPartyU": { + "partyId": "2033CF6E0119B3F3C89B6A6A6472560F", + "ephemeralData": "AACAE9321203F84CFEC112B526D2FAF7C05F3D72CF74CFA8EEA34AA95C20924DF22420DF" + }, + "fixedInfoPartyV": { + "partyId": "91FC31A4E44ADAF820C10752C3C18E70", + "ephemeralData": "07D23E72FC1B59DDC7DB2EB139EF6E9B7BE45ECA05BEBB9146B00F21D13A3DFD4EE5E260" + }, + "dkm": "0937EEC03DEC27284D347075AFDA9DCC4876FA94039AD196F044349E36B293BE89FD9FC3ED9127CE6E8B1A76E8C7945389768C95B782EE1BAA2148BD5B9D5D6DD2EB7AB52D83D32F916C87C389D88647735C4F3EE263E368D81BC45359F4C1ADFF6001E2F6E468C50303CF59C3343EADC839E612517110C47ABF7FF0FE08CEB7" + }, + { + "tcId": 3718, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5011615A4B8B8839A6B0FA3FB3F50EB6", + "z": "FB658D0ADAFAD794824416E6593ED2A7EFCD4E2123D6D0790D25C6968FB260162BCBCC87", + "l": 1024, + "algorithmId": "419F5DC7ECDE1B3B5523200B7DBC9753" + }, + "fixedInfoPartyU": { + "partyId": "0B2A68B2692CA2D4781C665C562A7391", + "ephemeralData": "E4E747EEAD2CD0DBE94484C6B541937724AD91DB6AEC034BCCBFFA2F1BFF44728DB4A922" + }, + "fixedInfoPartyV": { + "partyId": "D6D6FE409E89AB5D6C2C3A2A2F1F6DB0" + }, + "dkm": "1042B0EF73E9069C3E1FEFC5FD05646B86B90E738D84A50B2FA2BAF8A88DF3CE7F4A6D66ABCBFCD6CDA54B4745DC0F5018A29926D82BB24B90EB8025FDDF585587677D4AC806200BFD7CB10542E45EB1CF22FF1222B4A10F3C494C2CC4913FC4DEFEB53E727FE0F4F5A1ECA0267B0992451909772C13A6667126122B42470698" + }, + { + "tcId": 3719, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88FE24BF62BA110DBCC6DD3BBB8EF665", + "z": "FB552C664A696DAB9708255662685256CEAC5A3C879FF23CCED8E82B5AC82DAB58F29BD0", + "l": 1024, + "algorithmId": "D002819726B4646E29D065A815E11C3F" + }, + "fixedInfoPartyU": { + "partyId": "652532721A7FF7045290332D3725A98F", + "ephemeralData": "FA36D304487824EDA65E5D16C123A0753492F8A39C10688E7FBDAF3125850290327D312F" + }, + "fixedInfoPartyV": { + "partyId": "39CE7E6F8E76D3D383FC129FA7FFC9D7" + }, + "dkm": "2F9696CADD805D816238FB4EB1FDC7734DA364A27E299D4E10A1B1FBF996B94095D269F1E2F0AE18D414F26208E2818CFE90860F68A635A5416D5B2149BEA195BD93AF83B0A92FBCAA2A62F0AF2BE32F2683BA5AE7D9B13983FAEF959A25D5F29499F4190753B349E5AB0A54A979E7FCF354D2552943CCDC3297ED91FAF66739" + }, + { + "tcId": 3720, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7B5C1FA9FC75E1EA216EE98D070B6C9", + "z": "4C006FEF51D32BF551DCBC74A059C23C7FEA15C3E1F11A507A650F8A07AACD3841EC4C57", + "l": 1024, + "algorithmId": "9C16E1985846A513CDCBBCB0FB5F8A8E" + }, + "fixedInfoPartyU": { + "partyId": "E4DBE66D04529C888945680BFB64D5F4", + "ephemeralData": "D4BA7AEE500EE3D86AD717D07DD374EEB1EEECA519E18A133B5E1259F07BCC4CF2949A35" + }, + "fixedInfoPartyV": { + "partyId": "F9C8EA7111754DE756B10BE808A8596C", + "ephemeralData": "91BA62151BEDF9C6A282957DC2E3C8E6444BAC0CD0984D0E03761711F5342217C7C1E933" + }, + "dkm": "049F85998F5CB864291509516734C03515E5316209A7E5B4242A4097C00BE2E157436B2A981665E41290460E42E978A220C30EA641CAFF7847BA33A9B1C2A9898326C0F87AC9AE915A48AE9DCAC02B4BB24DDD1AE9BF7AF30F18CF296BA689EE562574305DF0409C135100DA3DD88D26867A0B75CF4D8001BF4450F954EA983C" + }, + { + "tcId": 3721, + "kdfParameter": { + "kdfType": "oneStep", + "t": "035C42F72614966A4F707716885A23E8", + "z": "F78D401B897BA742A3BCFC4A9188A0EA7D1E5A75881D94431C824ADFF5CF7C1F3F289750", + "l": 1024, + "algorithmId": "2C1BA48EDE4477CC73CD5739274BBB08" + }, + "fixedInfoPartyU": { + "partyId": "9DB18B79D60B54F5CBA864546C0CDC7C" + }, + "fixedInfoPartyV": { + "partyId": "070301F8CE38B22CBF23F4970EB019DE", + "ephemeralData": "188053CF0852FCFD70B127ACE9E7E5E8DD273C65DEF5B629E6F0F69BBCF78529B24D980B" + }, + "dkm": "D90561920F3007F813AD53C5455932F3C5514C4B602C44E8DD91D227718E19BC92EDFBD489ACAB8DD2C983FCA7E74DD5C3DEF06F03C7559465DA83607A93D35CFD5E00918C79B0BCAF5816540299D6B863EDD007949AA9A7912E7588BC4C39F37D9FEC4E0279B69739323722C0B30A3545A79A4EA616779E227022FCB300E2C0" + }, + { + "tcId": 3722, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D94670F96E104BFD0B8648336B17010A", + "z": "814FEA8030BFA436EE2AFB6E383CCBD43201EA804F5BD6B0B8EA6F33F1D3077335D34F5B", + "l": 1024, + "algorithmId": "F53DC6285CE76794A3FA54919B29BAFF" + }, + "fixedInfoPartyU": { + "partyId": "FE91718DBBD276F90734491819575B7E", + "ephemeralData": "AA9FD0ABFAD1B8E24BBDBCAF852DAD03A3812004992BEF2B82AA8AA3527FAE90B6F96280" + }, + "fixedInfoPartyV": { + "partyId": "518822A786CE858ABF75C7D7ACED03AF" + }, + "dkm": "F2D5FD31D77C42E2D464D1BAD8BE0817A7E1D211AA7ED57072DBCD01F55A35AE819ADC7177341A4DC8E573BD90657FFB7F27103733170FAAD578808F753855778958A37F78E800CF3D950EE116CC3983928BFAB8BBD4B1F6528F7D68AA5FF8F10BDA56C7FC52BFC1A3488540045165886EF8E1A31DFD5C501B01A6EE8C0D4839" + }, + { + "tcId": 3723, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E177F4B5B8E32A4F7D289135A6E941BA", + "z": "D6DEEDC41BF625D25C59930987739F4C51FF5198804D1537CF75C19CB599CA034D8856CA", + "l": 1024, + "algorithmId": "66AB8F2DA8CF3B10ACDEB587A8103119" + }, + "fixedInfoPartyU": { + "partyId": "642063DD3945591B740933A8EF635E06" + }, + "fixedInfoPartyV": { + "partyId": "37490A59CA77E33C71704301E32A9525" + }, + "dkm": "D5DDE7BAE19782654CB0AB5FF8C25331FB934CF977876219282FE12D32E00C0D0B979F09CC678D1EFC30D439721E326E3371A320E6362DA0E76567F2904CF7A142EB9A0BAF1DC84FBD4405369E23B34F09A35F81C29D57821593003A4DB6A5CEB80AC2ABC88A49CDDA6BA41E9BE61375466AE5E22CF39CC8715A343228A7A0E7" + }, + { + "tcId": 3724, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7918A65BD01AA38935516999F070653A", + "z": "6BF2940C92FDB18793BCF614534679DF1D78C451485022EE580026E1DA67B484DF775743", + "l": 1024, + "algorithmId": "8D14CFC3360E25385982A237462B66BD" + }, + "fixedInfoPartyU": { + "partyId": "977FD2536647F969730E95FE85093457", + "ephemeralData": "FA11646632B54056AE1BE9D36A491FF2BA1CF0E530594B6E282F52D4F78ECB2311C99AFA" + }, + "fixedInfoPartyV": { + "partyId": "E26D36EDADFB4BDF42298E7B69345A29" + }, + "dkm": "A9B47529C1E4060AF7BC555BD65DE99DAFFAE9F5472E9E5424E0249685755EF76BC0CE6F00332CD5881FEB4573CB5FA4D32C882F486BF3FB409F8733F27AC42DCEDAC6698558428F23FCBC4C29EA7E5209349239E0E65B18B6E3B046B086C5D92C8CBDAE0FD081F7DF3F91C7F8A0F61804DFA55F1751CF729DEAFBC1D75A9979" + }, + { + "tcId": 3725, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1094635A5AC80F7CC0725C10AA87187F", + "z": "1A3E1852ECED755CAE099FC4363E37C43A70364B92A50328700C47CB4566954456D6DD6F", + "l": 1024, + "algorithmId": "A55946F8AE29E65047D024BD865F3693" + }, + "fixedInfoPartyU": { + "partyId": "230F366A78980150C8DE41B2EA600370", + "ephemeralData": "CDF8F9C96626449107C2E67558838786D648218AC40F1E205A55E8B78BA592A09F384B59" + }, + "fixedInfoPartyV": { + "partyId": "14DFB388E2306E8959FA5EBB70D07B06", + "ephemeralData": "8C7C9E1165DD7EE0B606CF2A8D271AD7500FBE42252690EFC173FA9DCFB92ADFC8D16D4D" + }, + "dkm": "224E1E15327CD817FDC45C0EE74B1696144BED9A9B632E641BF9E584B6BFA0FA211861CDB5D936C29D627E221AE12F9F305169955EF7DC5C5919B93728A80AC38B979DE61641E21F16478ED7826713E0D37A0C947737713C25B395F987F530DE9F62910FA1B54385650E6563E862B0C515A6B670420ECEF4D866CEC6F1DCDE4E" + }, + { + "tcId": 3726, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CFF695DA6B19A9F6ABDEC6B804F79DB5", + "z": "5CFB95D42DEA8973B813768C71BC0D7E3783128A0E0FFA5CB80628A6BC493FB030BBDCA5", + "l": 1024, + "algorithmId": "FC44E138A065CAC2C5F48C620A216B38" + }, + "fixedInfoPartyU": { + "partyId": "C8E00B9AFC4F26BF8F5E3B53754B1426", + "ephemeralData": "44161C22A8671E172666B12DAF43E30EC676E7B3FFC6E4D93E1C49912B3AA3491F9750BE" + }, + "fixedInfoPartyV": { + "partyId": "23E7FC8942E65141F1C2491170DD3C63" + }, + "dkm": "586B8F8F7C28B848F1F775621191692A77DC835EA32E95D99FE9509A918505A1B7B6954AB4A262A6EE79C72011DA869FE22ACD08B072700D87C2F636CD572849F32D38B6C47199D84B88D52EF57E3182B5B3E511E8239CCB2DA3D249B18B0361F4CB5583DC6E4BA7C7F335F43CF5A7D6431AECA8DABCC41EDE43C0FB6D00F63E" + }, + { + "tcId": 3727, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7413E22709C9037953F46D308A46D2AA", + "z": "8B5BC6CEBBFF68CDCE3CD68028526AEDC9E255198893D30CB329DDE75E47F96416420FEE", + "l": 1024, + "algorithmId": "E7A3EF9A493AE29D267196D1B5297495" + }, + "fixedInfoPartyU": { + "partyId": "D2F0406FA547404353A3E78BB1838CAC", + "ephemeralData": "3F84BB2D788C5E968E3FE5FEC7063E31D18CDC077846E46EDD7E9179BC8D9619BD83864A" + }, + "fixedInfoPartyV": { + "partyId": "64672D015BD576245612F4F5F692CED8", + "ephemeralData": "ED2D1528F6698DE31088A2B02B3CDC964939A00660B2B006041A25FF5634BEBC7F0BCE00" + }, + "dkm": "A44A78D6947EF5568733CB113FC5CF0EFE05BF2DA111D36D653410119CA4686CF1EFCCE0758B36EE43D57988065E2E614B3205A9B9213596F96093A07F14928BC2C1DB5999DFA5F72F4AB5D15C3A903203EB2EF664BB224B091C8EE0D08C25C4D2553592B6C557BC22245A35EF969BB70ABE0379EA81E8AC4FDBB75DD0C14ADB" + }, + { + "tcId": 3728, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62950448CEB6A8DA40EDC445C7DEC21A", + "z": "7A1FE74BF02D17FF3D23B65E1D6378037F040CD9731EB073EE8793FFDCCF7021565CFFBA", + "l": 1024, + "algorithmId": "0EB8207AD949E1F576E6B5E5FDF64CE1" + }, + "fixedInfoPartyU": { + "partyId": "3CF5438A2ACCFF3CB2C802F2AAEC61C4" + }, + "fixedInfoPartyV": { + "partyId": "908CA29665E8DD914C6BF83F9B415E15", + "ephemeralData": "7D94E699405CA54CE025605D816884DEDD8835F0F121BBB3F9EA5EE0B1B0018D5A2077AF" + }, + "dkm": "02DB0DFA4C3250A91A46E4747F217D2883D0741A502652AFEDC37DD097C2455A74D42E07BD13184BB30ED003D0BA21DC29FBEA8E9DD6A92521B4AAB24E57FDC4BEF5C6ADD11E0117C54DA50FF68538A242648DD0F5DA27A8D4F612F00F72E32DD2BFDAD9D787D78A81003E60C15E75E731EAFFDBE65C55A28330E1D7C7A82491" + }, + { + "tcId": 3729, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B1897601EF9EB168912A5000B10E7111", + "z": "18DBEFD1D32FF1B70DE7DFEE2D2DBD4F0686A16D1A99354397F59AA4250BB82C9B576520", + "l": 1024, + "algorithmId": "B450697EFBA05B4931E156BE4F70187E" + }, + "fixedInfoPartyU": { + "partyId": "60818417324D925A660DE8665987B512", + "ephemeralData": "8D4DE4CE6F33F5B4915BD2C7AF66A02D19B808815A54C5226BB26DFDD14DAC2A38626183" + }, + "fixedInfoPartyV": { + "partyId": "7B96D8F9CD38FB5A7B68873A09E7DF78", + "ephemeralData": "2388A5B85FDC988E9ACB54EB38A5DFAE20A1E2C6773D9C4239081CBB515771B3FBE3C146" + }, + "dkm": "2836D63A7872F96878C66EC8A78B10E4B2F91C50096205CB68473C7AF3437224E5661D172C3E6BAF442841E1EAC6E406ABF54F5975751EA49F6D2D9898B2CDEF313EA7477358A4E77C712EB905CC5862356B633A4122560AF540CDCE06B7651117C9ECE57FB5A6EE35ADB830F8779665320FEADCB9D72C2F2D3DBD55BD65B781" + }, + { + "tcId": 3730, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBFD517FD87C8D11BFC09F88CFC6808C", + "z": "96669ADF2E4E02350DC17E9F4C5449D169292DF73A3A9CA4054EDD84A1E774B1E6FD118F", + "l": 1024, + "algorithmId": "DADEE4A7F585DC7FCEDBB29AD33E5FEC" + }, + "fixedInfoPartyU": { + "partyId": "52E14253741BBA51AA4B24981729F8E6" + }, + "fixedInfoPartyV": { + "partyId": "350A26208E826CD9B33247B0BC451A93" + }, + "dkm": "F890B3CC0FD0E08E23DBF5EDB45370F89EB5680D75FD6D09622BA78E8B4128FF969473DBDAC776B298C21C19FCF52092A86EEC90DC514BD65738CBE83338C565668661E84B78B040BA8D2D26E34C81335500C583093AC2F272B142BEC4D54FFD31140181E18778F0081B689A01E5CFFD2EFF1963E49EB643BBA9A915D878190C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 183, + "testType": "VAL", + "tests": [ + { + "tcId": 3731, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9E31DA5174300555F58ADE772658A5E", + "z": "A8085981615F4A483CDACD20112FFF4DA659179219AA82F9FCEC20A5073378", + "l": 1024, + "algorithmId": "4F2E9B3289814798D82EB810CC7BBFC1" + }, + "fixedInfoPartyU": { + "partyId": "CFC1B979CD9F11F84623F4003A88637B" + }, + "fixedInfoPartyV": { + "partyId": "8D5169F0ECA293A1EF4027A165F662E0" + }, + "dkm": "B6F581A3E6EAC8ECB3EFE922B40DBBB070203E8D93EDF6D8AD3241222486D47AD311A2EE5B848F9DAEB3372573DC9C1CF2B2F5E2647A60AA1AC6EC330E2010CF24D38CD61DD6340040652BB222955B9983148396745BC41DEC5C2561AB85A78E56B2CE947CF972360E1C079E53C900E1E67DCD233C5F03167A1DD6E8F224CD8B" + }, + { + "tcId": 3732, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3F8060D9124463155A737C28B5F598B3", + "z": "434B717A2C314FEAA95FF754D8A4CEF7A27F5612531238BAA672DB7A792D4A", + "l": 1024, + "algorithmId": "72262C677CDC222C1C5DB5DD428BC267" + }, + "fixedInfoPartyU": { + "partyId": "046029167D3AF14097ACB239319CA2CC" + }, + "fixedInfoPartyV": { + "partyId": "EC482C45AA2A8E83EB472C8734444CC1", + "ephemeralData": "C5FAEC8124B6465476440E0725B9952CEEC193E1BD62970D2145684DB97087" + }, + "dkm": "A6F17DE5BAE913435A47769D9CFC2BD0218C8046E6671BB3ABD617F4CF19FC708DF4847C1B4A23886A250413441409F2850BB5FBD949675E997C19D3E2852A504B03884E639A68C3EA96A4CE495780F26F24A98473FC9777A3C7599AE70D95D756E1083DAAC99685B6FC21DBE13C4952FB963ADD6CA7A4A7A39C00DF60A4E4CE" + }, + { + "tcId": 3733, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C9D33734DEBB2970ACA43B0B62DBD8A0", + "z": "8024C153D5A170EB211E1476D6867639EB11E43E9E4B77CE42C20C73ACB12E", + "l": 1024, + "algorithmId": "CCB5F1C9350279CFB5027D7D464D1426" + }, + "fixedInfoPartyU": { + "partyId": "C8669CBFEB0C96DDBF4244170639A598" + }, + "fixedInfoPartyV": { + "partyId": "520CEEEC6B02C1900FB45D60AE68823E", + "ephemeralData": "A7F0543F8387F6844838D2BB3F1577D80A4E613308DFF9C733F4D30BAB9806" + }, + "dkm": "E954FE5AB8E76A53E5DDA357EB1175943BD541F583A48B4DCE8F30DE887D3C7702F7E00014BBF3A19D719118227ECB718C998B4726959F0E4F2E8A6A586CBF1D5BAAADBA00102F76BA13B3B07D2F2B615CBEBE4C35775C44E71AF4EDDCE6EF11DEFEED5A029F32AB291BB789E8D6E8BE5E969BA62CA78C4DF67B5AEA0F6EDD1D" + }, + { + "tcId": 3734, + "kdfParameter": { + "kdfType": "oneStep", + "t": "58CDD897C6DF21969A097B11AC141F98", + "z": "5E3A3274A8CDDD21F8302ECD20492A9257E46EC82EC0A17EAFA1CE96EF51AA", + "l": 1024, + "algorithmId": "7A03CE33A783CA537B68CE97BB8E1853" + }, + "fixedInfoPartyU": { + "partyId": "886DCB8EAE67E659FA0ABDDD932AFC7B", + "ephemeralData": "0D1A8706BC5B377EC06229E79F349F5CBDC3198BEA38ACDEEA2A23653E61E1" + }, + "fixedInfoPartyV": { + "partyId": "3F6E1F8530B53FD2577D638D944C6BA1" + }, + "dkm": "46E818A6C04E9C1F8AE8A14053BD74739772B70A0B2171B7B97425DCF02F2D791C55286CB7E63EDDB2148D38989ADC22BA72F096A296C7FC2AFF2700AAC9F7A1A8C4E2A0D23A8A8F816DC9A663069101B3CE9FE906F1494BD7A042F7F63521874CE52262EB3D69A9CAFF037533244E00299B168D06FD8885F0333974EB27CBA0" + }, + { + "tcId": 3735, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F22FFE6E8F3AE776E68D2A4AD5F6250C", + "z": "2B33DF5646F8FF0DCB861923F1D6B203D88ADDC695F173CF1D402477CE3B86", + "l": 1024, + "algorithmId": "BE8D0FD75F7715E199C2193DBDDE8C38" + }, + "fixedInfoPartyU": { + "partyId": "08C79458622707CB9916409CD884E5E3" + }, + "fixedInfoPartyV": { + "partyId": "40F0C7FA2C77C07000D90B0C98DC360E" + }, + "dkm": "E7ACBCE921A7E20D0C939ED37805F7F292D513DE74BF0B333B1477FD47BE9996EFFCCA89DDD84BAE64D27E6D40E392E77A90458B077CD816D81E90670D843C822D750421D005FEF5EE6C76D6DD369D8D88C6E448F16D179B4640D6891BBF47AF3DEFAAA13B8C2E4E28FDD9D53845C9C0F3905C58D9DC081EE1E98BD2455003D9" + }, + { + "tcId": 3736, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A73E1F21A452D684A1C3D587F676F680", + "z": "09E693EAE75C0A430D3C1059CC5F07BABBC7C8E5A65752C1F01A17A465022A", + "l": 1024, + "algorithmId": "7E38B3B592D5A3D42B8BE6C16CFDCE18" + }, + "fixedInfoPartyU": { + "partyId": "D8DE2E2FA3B4056667944DB3682E65B5", + "ephemeralData": "14DE995B5366F8736C075F9A7FF14D6B2D0532BA9A22F4ED96E452C29C971A" + }, + "fixedInfoPartyV": { + "partyId": "33ACFA2BBE7A978063474AFCCF2A832B", + "ephemeralData": "794148E403FF8E0521313508366E0E16543A90EBCA292B135D3E5E3DE23787" + }, + "dkm": "FA672D4FA20463CF1ED715105B03B1ADABBCEC49057050DACEEA9D16975856BE06B59656418515B2341D7F55A00E2771E494235DA727098940DB207964B455C3EFFC8D6221887202854AFD3CE7069F2EE2AC2221C3FA301E49064351660C30688322B2A086F001CAE80C1F273F3017AE086ECEB04619B8595ACAB60E8759A892" + }, + { + "tcId": 3737, + "kdfParameter": { + "kdfType": "oneStep", + "t": "02514AD3C42C11B2F4FA2DBA89468777", + "z": "747EA83E4D7AAAAA872FB2D36A2EABFAC15D98121BCB603AE4A7B13F028F16", + "l": 1024, + "algorithmId": "A4AEF41B14648AC94742D54FFF6EA5D7" + }, + "fixedInfoPartyU": { + "partyId": "5CE811EF280BA2CFF36EF18BFE61397F" + }, + "fixedInfoPartyV": { + "partyId": "E292A65A37955808E64F7EDFA419324F", + "ephemeralData": "FB74BCD899831712BB9FCF6575EEF81DC1989706A7309A3A3C08355F36D99C" + }, + "dkm": "29D436663AB83F87070FCE84E9B482E73184DB9F64A99AA331D17890700DC889D3789CA19F7BB559B6FBAA543BBAE43D340D7C472C453C6F6745652077A3F51055BC1BEBA6BAEA368EFCC2EAE38BCA0108CB59C4E4B9C7561069C8C4C398D8CC0AA4661B5F02BE190EBACE029F9C4F783C47535F3063F62803D84EF806A197C3" + }, + { + "tcId": 3738, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1392903E971BB033D6ED4B454B1F4562", + "z": "33A65601E9A18BBF184944FEF135D3935AA988E4D41D49C43519BC8F94E36E", + "l": 1024, + "algorithmId": "6E7B1FB6690108C1723D72B11D78790B" + }, + "fixedInfoPartyU": { + "partyId": "4D097728025A1049B2EC8BD2FBED7531", + "ephemeralData": "48F046EAEDA883E60887AE9B6EA3E9A36E332F1A03D5CA25CE949E09C38855" + }, + "fixedInfoPartyV": { + "partyId": "1997E9B607D51EE1922AE2CEAB5F5482" + }, + "dkm": "6C0BF3634DD390DD5771F7CA5E4734B55CFF64AC87587FBF07FA0D18E0EDFD23B33AE07F18CDE2E8807F5E2BCF98BAC0F8ED59C09B48BB77F569168CD0FFDDD40E164E7676D588E1F900C5904BCEC88EC5F7E8FEFEDEF4923F9641C0C10598C11722B2C3E7979B4539D7788DABA57B82100873F7E847F293B84F98E1F3F6F314" + }, + { + "tcId": 3739, + "kdfParameter": { + "kdfType": "oneStep", + "t": "92B59D9F98A459514597124AF26785B9", + "z": "9B5A5CBE82C7BC0D4B6A28C9116E7B9FE6EE6D13280AB57884C544D1DACAAA", + "l": 1024, + "algorithmId": "C0AAC3D977B8DD233AF20018D30C5420" + }, + "fixedInfoPartyU": { + "partyId": "D884EA403CEE01F37CD9E90ECC252785", + "ephemeralData": "230A2E3AC81DF1A2B6D82147ECA26E5A1CC5427C14CD7F3F6AEC8C311C0573" + }, + "fixedInfoPartyV": { + "partyId": "B1FFC41B8E8DBB3AF96A3E564B1FEF38", + "ephemeralData": "DD9A49948BB1A9041CC57A238DDCA975112F246F3F794E9B41919847D1E1D1" + }, + "dkm": "1A7FBE7D29E0A6B76C7741983413BDEE075A2A8262548B6FAB15FB37B1BF57D56EE504DFAC03041D82E4477090947510C1992C93C1DD39A2E981B0CC50A185CB8743FB0B95AEEC3CA4A70367DF11C657C5043DC87EBA6B96E05CF83A746AC9EEDB7DAFD2F57B607911261570A606FEAF792686BA3B4C05A72D296D8A36DCC5A9" + }, + { + "tcId": 3740, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6FF3DF96450AD608FFE4E29359F549AA", + "z": "B4EFEA153D412265BFECDD80D27C3F6F121D776098C8CBF3E5E6E485DE94D5", + "l": 1024, + "algorithmId": "E010877BE04CD9504A34F4EB46410647" + }, + "fixedInfoPartyU": { + "partyId": "888449CA8E0163C3FC8AA8E60ADDE671", + "ephemeralData": "1BF45DDB1D0E80B4C72C129A792714DB08D0A8A36379D5E991730D19069AC4" + }, + "fixedInfoPartyV": { + "partyId": "1B58272E10214B72639AE94F5152B99E" + }, + "dkm": "A40F58C73131F2A76FD8C9FB5A54B428CDA14B57BFAD9102355170EC2E3A20D0969543BEF31F7F5D34AEF51FC3BA021134FD8537E1C1DF0686CB6210EB6A79E989CC24FDA9418C758301B8EE97338C9FD81D92348D69FC33632D94EBA98D5FD9F6430E2FD6FD7AF7DDD3F1E17A02C5917BB2F062FAE817896F096E6382B92848" + }, + { + "tcId": 3741, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4AAD642D8F0A0625DDB1FC71ED1EEFB4", + "z": "31617DCCE7CBFF77C762880B62D3B4DBE312DC47B678F897E8A95E5225739E", + "l": 1024, + "algorithmId": "0DAC6F93F1E106035EF188D30CA8B173" + }, + "fixedInfoPartyU": { + "partyId": "006A46F8F487060BAE59491F5297589E" + }, + "fixedInfoPartyV": { + "partyId": "97191CC29352AEAB3CC1A1025ADB2E22", + "ephemeralData": "EA491B069B7416D5B79CD6864EA9D4CB9530CF6E010456245A91C3BF45EE17" + }, + "dkm": "85E1D9F69F32C1ED1542960937F4D3F446C027354F555EA58ABC72D3E7919ED49C4431198EA29CC25EED87DB025E95961610076C8D0E95F55D09EB4F1D4336A105E4F1A84E97CAEB0BF8156F0236DF546F254323A29440F98A00313A11CBAAEB431E7BB58C1DE8180F7B00D39A8AF197470484388F6CD171ACE2E7E6AA33314A" + }, + { + "tcId": 3742, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13A9D9DF4D7B0B4724D0131216F10715", + "z": "6D49FB06F1F8A083ABCBD85772A7848AFFB61CF49E2AD9701D39FD1CDDBADB", + "l": 1024, + "algorithmId": "DDB53F28BDCC19C54D967712381D7096" + }, + "fixedInfoPartyU": { + "partyId": "08DB75E73D80EADBE098626EE2B870EB" + }, + "fixedInfoPartyV": { + "partyId": "90741648047C5A0F0F3B526738C8F00C", + "ephemeralData": "D393DC1C085FD27C1D8434800BFA60EFC40DC38E576D96C6EC2890D46383B2" + }, + "dkm": "0DF176B8EEE6C408E8B2B349AF28BF8B696A7FE586A10DBAD3504DB7540107C2D6F20B885A2FB335DAEBF5411BB26C24136EB21823383ACD0B8E7D77988271CE2B4A98927B5CF1670572907DDF4468622154FEAF9456D0A1185C1112FF380C3204B78968BB23AC018D133A11BB0E4E0E5F02CDB6D7AA5A0B98BDF4C123E3CF18" + }, + { + "tcId": 3743, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B5EBB172FD2A5AE624DAF9B24A4FBEDD", + "z": "B98F433B26A38968F4439BE134A8BFC2A9703F440D2B25DA5703DF2D7371CB", + "l": 1024, + "algorithmId": "DA26951FBA05FE4F2B8D6E960CC76362" + }, + "fixedInfoPartyU": { + "partyId": "E495EC86257466D9FBF922ADEF50129E", + "ephemeralData": "7B6D1E267A5AADC6A0FB81EF316E7295961CDD3CA30B7D87190A7CCA3E68B1" + }, + "fixedInfoPartyV": { + "partyId": "FCBE55163067360822EF51DA8AB0BEF4" + }, + "dkm": "EC7D08867FF0FD87C40A05E89A185E8C3E961843911E4EFBEE55E3375CB6AACA43FABC19A009A482E79543C368CFD353F5969FB09DBE613B8318AB89156DD824EA6C7DB02CF4BDBA4AAC89EFC61F170B967645956875315DC7C44B97CDE08AA94A7D7AA877C7D4BC05F640096D464A8AF969B2D99839E8427F37678FF778B2F5" + }, + { + "tcId": 3744, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3B4F0B25911F76408211E1A903E52A30", + "z": "18DBB665EF32595527BE3599FE57F26ACC326EC717B6162C84DE622F9E987F", + "l": 1024, + "algorithmId": "1E88FE703DA33B1B3D6DD5DC30B56A36" + }, + "fixedInfoPartyU": { + "partyId": "1349C9F3EDB8A552BC5860D8BE67EC10" + }, + "fixedInfoPartyV": { + "partyId": "3A761EEE2FD54971C006B60CCD9FB5AA" + }, + "dkm": "3986F09BEC1CA04E3411154FD22A2968296CCC363D1C29F763FDF6B971F087061011DA3C8D63E4F44FE8A0C13D1028CEFF764FD1893749D59D9A4CABD274DE018810CE9AE354B4F559A52548FFDC9BE69C79D22424501A7E3D92144947BC59F2628316D1A0FA0A7FC6E8C80BC397481992791CDD8E424B73D18B3D79E3839656" + }, + { + "tcId": 3745, + "kdfParameter": { + "kdfType": "oneStep", + "t": "700439933566057D4540F532EFD8C872", + "z": "913A4F6BCD9486F6C0FF2F8ADDDE7DA30E27077D4A4B990B2B1F23C299844E", + "l": 1024, + "algorithmId": "8E02E4DBF8AC6EA12470B6714ADAC6EC" + }, + "fixedInfoPartyU": { + "partyId": "3DC2AAE656CD9D536B404B56AA3C6967", + "ephemeralData": "4BDAA962EC89723C57B87CCB13E2BA5FBBC0518E3BA2C44E41795CB5B8C3F7" + }, + "fixedInfoPartyV": { + "partyId": "02DD04A9915CFBF00BDC818C737756C3", + "ephemeralData": "38AE2620CF23D7DEDE2E4CDA377856EAA5DE8CD3427B6B3FD972AEC72BF611" + }, + "dkm": "0034FE91B63E72760EBC260E5ADEF552C904585C1AFA8082CC986CBFE4B96CBC3C9943FBFE83C7846D0A98C6C90ABC8D4AA27A47A69B5A5136E2FA9FEC839A4BA9886A0FB24825F5353856C67421C3886B153C556F3325ABA136D479879FD157AD79DAB2E5604A50D0F7741DE79A9CFA51BA4CDCB884710E226E09B2DE6BDE84" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 184, + "testType": "VAL", + "tests": [ + { + "tcId": 3746, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCD1C7EF64E7055649E244E81EE7E31C", + "z": "FE843EDBC7332431EBCBBFFD2AE4E17D12180388C33E4176FB0FAE7F2D76", + "l": 1024, + "algorithmId": "D40932B2ACF44105E9626C4431111569" + }, + "fixedInfoPartyU": { + "partyId": "DEBC25E0A66C21C45BB3843628703DFA", + "ephemeralData": "0B2553DC66892DF8DCEF934AC940BC3820487B5AFB8B0011C9C47F068843" + }, + "fixedInfoPartyV": { + "partyId": "DF5889AA275E74357F7EB6979655680C" + }, + "dkm": "3EF933966EF7668D5D7D77EAAC6CCAF8EF01972D81B42CBE99765ABC23E75D13CF25A92C72AA076CBFB6BAF1A36465F6550AE9CF7F5295ED4CF307FA720450FE74452C69947EE16B659A6BCA072898CAFAECFD03D057FA681A15CB0C3D3489621B597AAB31536E42656F4AEC680762683FC72A4E80C661E76E0ECF51A9B7D910" + }, + { + "tcId": 3747, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8172ED8E6172A1999F8A0F26A53980CB", + "z": "0B15405719D942DC688EFBCB2F29F4A32AF1833C9C5EA9095E3EFFF218A6", + "l": 1024, + "algorithmId": "C34C8916F78E2FEF7481657AE8C6ABBD" + }, + "fixedInfoPartyU": { + "partyId": "6B35BFC21CE01285799862600CBC02E5" + }, + "fixedInfoPartyV": { + "partyId": "2AC76B17B143917F2C9B827D350BED4B", + "ephemeralData": "6EC754D1E1DF217F68E9E7EB0288B677625538F7588CB2CE51EDF462D781" + }, + "dkm": "0B0F11D350887938655D64FEB50AEEBB104F061E502E9B20253713E6C50D3C8461235CDAE9A035A297FF955AF93B655012AFD20A7A7C3618D8D32B02948490EBAAB4CD1C8D3E40B7A2AEF1582646858184FD44E0FD29FF77B9DBB38334579B9344F07AB10D060728DDF458BABC5505447A968AD3A3942E73076A1C5A4DC78304" + }, + { + "tcId": 3748, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BDA7528B9087DA830F91CA74BC985E28", + "z": "7D7C348B3596C017462B5CDAA38B97CADD33B29E3487D70291668DE9A58C", + "l": 1024, + "algorithmId": "FD7F442B93A2EAFDEE0D040F0E44288B" + }, + "fixedInfoPartyU": { + "partyId": "DF2C3F35C05C9697F15A8607E442AB62" + }, + "fixedInfoPartyV": { + "partyId": "5BCD0630F7298E46914A78E804F010A5", + "ephemeralData": "67FA31F8C053F83279788C24E559B693D7106B00430B993C44D64E6FF3D1" + }, + "dkm": "FA874151EC3B1C5081861E881823ED8EA4509DA6CECC4C7DBF68658D0D38762329D72FDE4E25E85F9A7493027E64CD14F19F63F773F168D6BEB837472C9E7DC158E36715898FCF006806C8EF9F6FBD6B4038D87C8A5383B0B0A06CC8DA603CED6C5BCC93193F50EE09448EC4B32F579406ACE9B90CFFE4CF8599FD26AE4FA093" + }, + { + "tcId": 3749, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26D664755ABE638EF4231FB3476562DC", + "z": "E99A1E55D172769310AF6FB5319B6F5CE2FB4F212CC39A99DA18BF55399F", + "l": 1024, + "algorithmId": "04E989DF820BB8D708445881E3C59595" + }, + "fixedInfoPartyU": { + "partyId": "D3FE8683CAC801EC2A33A6E3E5E17292", + "ephemeralData": "8CE5A6B345713CB5FE166DAE99D9007B85464DDFA68E7667AF43BE4E07AC" + }, + "fixedInfoPartyV": { + "partyId": "DD5400546E7AC34F2B4B17A9D89E780D" + }, + "dkm": "BEDE6F3E28F022C5429A6BF4EBA458968BC3AFFE420F076006971222571D4EB7920EEB7B60E15B1648E12681A3222AA66735C85FEA13F549D94FBA3794E2F0202C558B67D2B51EE945415F3472A19BD1561BF5C99DF939F5E44EC95C53CD19CE53C0B163B6FB1B0ECC1408451884FF2D463B8A8A41548E38EDA4C6211D0024BB" + }, + { + "tcId": 3750, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DA9BC35D3A6877A07722488BEBB32547", + "z": "654E0F7B981355DAC85B6F88D7CE735D73F98EED9E804D0AD3DD07A35CE3", + "l": 1024, + "algorithmId": "57D3356F088EA8BFB59FB6861C10369D" + }, + "fixedInfoPartyU": { + "partyId": "935AEC6B661B7479CC921225B30CFC57" + }, + "fixedInfoPartyV": { + "partyId": "FEFB5744F34D821A7F2B3A856BF41A2D", + "ephemeralData": "35D944900A34E0C1D2F95AF54E1A80FAED5DF554145D01E14A4D4582F046" + }, + "dkm": "444377C42FFCCF719299C9654DD119103E5574AD3F7196E5A0936E97276B782FB8A3B546517A42EEC50798E37812CFC7069C1E9157D5A4066B766BA393FB87BE009E1EFF900CE27DB26655941CFA4B0F3207A1CAC942CDFA93D3333BBF516EB6478A2F2B82CE2291334E622FD035F3F8A68716F68DBF6194738E6BA284A7E272" + }, + { + "tcId": 3751, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A5F93FDC1AC760CBC77F77DB90F61099", + "z": "E319D248236619547FE6A0017F62A958BBC6157BC4A92AD0C01950BFDF02", + "l": 1024, + "algorithmId": "037670D8F20A64AD45FDE13214EBE691" + }, + "fixedInfoPartyU": { + "partyId": "6AFB16E7CC3FD8EA26B0F9F0656B6D69", + "ephemeralData": "971A6128953BF85FCA60AA0E5BC610FE77F6E9A68A83BE583E5DB71E0710" + }, + "fixedInfoPartyV": { + "partyId": "3D0A6E6DA7122E0B2BFBCA3822FC1D3E", + "ephemeralData": "5DB997DF4F9A15333FD4ED884CEBA3F615C87B26A845A0C0EDBB21BB4061" + }, + "dkm": "4886639C1DC2FC260D4185ACF60F4EDAEF09A62D09A11DCFB09E8C1D523633D5EECACEF43EFCCAAA71F6EEFAC1085F26A7A869131001E22440FBCE475DB6DA3801B0051227B9F9765147AA02DA32980DF6DAAB658E9B2D593245DEC708BBE638B5ED49DC04E5F4686B4EA7632CAF2C836B849EA27D1F242D2BF86E254F9C19D6" + }, + { + "tcId": 3752, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D4BD42EC1B780248E2E2719948AF2EBD", + "z": "8FDB1C013AC53DB81CE17E028C24D025F7A8187294DB6696C01A13421784", + "l": 1024, + "algorithmId": "7AC5CBA8AE271562ABAA541F4A1DA8AF" + }, + "fixedInfoPartyU": { + "partyId": "CAFE046C4998FC5FB288902952571FBF", + "ephemeralData": "AF98E6052C724894CD56C053D54C8A79BEE04D055F68F33E405FF6A8DD51" + }, + "fixedInfoPartyV": { + "partyId": "658331C15F19DF5F99333FB000FB3FB3", + "ephemeralData": "0CF6A77475B256390EDF52C5ABB95A573A33845F4883E30AAA2F20BE1F3E" + }, + "dkm": "AD174CCD87C10ACFF018986B95CAD794D0086852FA8F2CA125F694650FBC0959F2D89081F42153B2195F8C33FA4F02AF81BFB7C0A9FA8AFB1650DBD30E0AD2AC91F180D221A6F5596AAB953853AE6E36038CDA527C370FED888E2568F4808320651874014019B63DC4AC58D67FE6F76BE8F3A018DDC98322BF36E57DAEB4AD99" + }, + { + "tcId": 3753, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7E92D4B18EA8CF11F0282CB344F038F", + "z": "6A9834FFF804753D8BD1022EA35963D3C417E24A38AE8F0F86655BD4F6B6", + "l": 1024, + "algorithmId": "BCC1352B14B43F5DDA8382C1F11806F7" + }, + "fixedInfoPartyU": { + "partyId": "1F389386C0F308576560345EDC55308E" + }, + "fixedInfoPartyV": { + "partyId": "F6DA866D575FB82B05E6FFA8BF86B92C", + "ephemeralData": "E90D017C33D76E31E6AB117BD2EFE43DAA04110F254CF3029E663A8C19A9" + }, + "dkm": "D2958C34D5C955C0ECB20E93C011509BB2A6D0F60A648EA664A87FF191766E139E4449C4067298A4DD0D8BEA13BEEFC6F908D04BF4D78A856F24BD8AF473EF954AE3DC2CFBCC19190D2E1A671D22CDD0C10E51112F060648FBAAC83DC9E44640A00B180A71685ACCCAE95F262BDAD1C854283FF4650CB304F2F59B7604E93A89" + }, + { + "tcId": 3754, + "kdfParameter": { + "kdfType": "oneStep", + "t": "51B3528751356305CB9717B0E736DCF4", + "z": "86AD1574494B8AC8CEA0C8C38DFC710164DAFB3877B06297B7B8471FA037", + "l": 1024, + "algorithmId": "F00329435A275B8A66D7E3787A14E2A2" + }, + "fixedInfoPartyU": { + "partyId": "9BDE3936D3443D38BB0AA323D6A738DE", + "ephemeralData": "98CD83865540665D40035400982AB581426EFC94D769B0EB8EFA54C461A1" + }, + "fixedInfoPartyV": { + "partyId": "BF76CCB926BCA9E431E9B3D357AFAC8F", + "ephemeralData": "87DD9856B4F9CBCE6F174CE847D1E26707A4145D0460ED47DEA00B1EC2FA" + }, + "dkm": "59332A551A0B41A6661BB3672035986567324295A5CD62D23C2EF0D1D01AE314F12FC423F5D04EF84788775476197E7CA9335A8F24C317CE04F6FF6395FB0E322FA1F634B318869BF0188335DF0BF0547B2D5C83E16415DFC2535B2BE942F6E5533522CF5F2DEE729EAE247245127482C0A47015DAC7208946E3DFD24767EAF2" + }, + { + "tcId": 3755, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69884085575102BBBA8E8EC259B998EE", + "z": "8C1DE6313E3F560DB92A6498A2C651C5E2247B4ABED6B2782D3CB411950B", + "l": 1024, + "algorithmId": "A6B65DF5A841DC58D5E46EE8ECF9CEE5" + }, + "fixedInfoPartyU": { + "partyId": "13430382061FC06A024C609CD854174F" + }, + "fixedInfoPartyV": { + "partyId": "9592FCFD74BA88523F23A8E390FF3CD9", + "ephemeralData": "6D8D91D84A99306F6CFC1DAA58A82C1309372445D738C30565454C27326F" + }, + "dkm": "0AAF935E2C151C5057E243AEFC49625A906F7089F73EE22253D2536216B3FFED135E6F6A936F86AF747F145B13ADCD0D93CE142BB9A9AEED99E303E783092145453D28C53D41BB2E541DB89EA3C992F7D2941B925CABC023AE2F8670F2F26376D935EDA2232E198EA0346630A94105C7EB68C414BB2E6A935BA5B1DB089500C2" + }, + { + "tcId": 3756, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1923290D0BACA59F51DA66214BCD8DE", + "z": "FEAA687DD38BD620577ACF6075F84947C2E4F69239E91FA04DDE3D88B562", + "l": 1024, + "algorithmId": "7E4B26E0CF50E0BDE04934330015AD55" + }, + "fixedInfoPartyU": { + "partyId": "4666B029C6888EAEB26F754A8F4D8A4F" + }, + "fixedInfoPartyV": { + "partyId": "7BE7A9B00807F77603776AF7FEAA0831" + }, + "dkm": "AAA8CE2DA962EC564A3CC1E822A994A2F4B69AA40A1D7F99E2500F2CEEA491FF07890E03D5BB2F996707FFD7FC813D5AB75757961BA71328376971DC427DBA528E643FAF02EC67162072CE34A75924A0FDA86B940C362CD2C320A256FC95B7FDBC49865E18B27E7F44A07A7E8011D81EF18D4067EBA99B94E612A2C48C415B3D" + }, + { + "tcId": 3757, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5E5BD168E00F2347A43DCDE343BB445A", + "z": "396178FD672804B15CF060772258DA9906C07057889C50D273E5E1EE6D0D", + "l": 1024, + "algorithmId": "47E5B5BE814CDC3E8819719C450B65D1" + }, + "fixedInfoPartyU": { + "partyId": "CD755AA66A71E66104C65073ED806C1F" + }, + "fixedInfoPartyV": { + "partyId": "EF5A757EB8EABCB16EFB594687358A41", + "ephemeralData": "E24BDC94C27E8512D8B12BEEBC835A8E56B585EE90C054134892D2EFEA69" + }, + "dkm": "9653B64375439D7E437EEAD02A2B2B0F82079E4977DEB95C469D9802C24FA95CECFF46BBCAB972B9FAA5E215135F4983990102C2F0F408737724ED6CC2D31766BF4586BE63E786D052A1ADB9D9537AADF1783A36695311C6766CB0163757A9899DD387F42E9008AE359F9554F55137AA81BC1A5212204198D453EE272DB37C9D" + }, + { + "tcId": 3758, + "kdfParameter": { + "kdfType": "oneStep", + "t": "564145768CB310AFDEA3DB05A5006121", + "z": "1F304C9727D0BB2367C717DB7D7BA9FAAA2C5B78469A74CFE544F6EA2104", + "l": 1024, + "algorithmId": "95D2A63D19ED29CDDBACE35C46057496" + }, + "fixedInfoPartyU": { + "partyId": "4762BE0B8C923C51DBBB1C1597E78864" + }, + "fixedInfoPartyV": { + "partyId": "43834E1C252FFD9D8E296AF8100A1504" + }, + "dkm": "002F1A82F7924029B5D36A0F792652C83205B2D2C81BA4EE802E9B4FF71FF0C69DE73BABF883E8E4200D4C031615E4284D51D539FF3D9BCF92AD06DA653DFA15A28D3EF7752128C48593518A9DF977499A7EBEED1353149A7DC5FD2DC7210069D712622265B057E0C72E91E4ADA840F79B8828EB197374A0C0FDAB1B51AB01B2" + }, + { + "tcId": 3759, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5195D602D7F8AAEE541559D7D324780C", + "z": "B931C689013CDCEC0EE59BCEF7B59AB5603A6620F9329C1B87222AB41F4B", + "l": 1024, + "algorithmId": "A5D12E7039D074DC2A91297177565136" + }, + "fixedInfoPartyU": { + "partyId": "AF38DEA1875C8482A77A51EE7EDF0527" + }, + "fixedInfoPartyV": { + "partyId": "6B55FE20EDD7323D6BF9080B215EF48E" + }, + "dkm": "A048D787AD4029E027EC0BF7F7D8BD1CC7B3004750579FCC7860F1977AA721B824DD3080E5D1A0F4DC0A0D746C13F9397EED2BFBA2A6BEB88DFB3078AFCEEBCA0BB04B0E97C3379DEB49169D88B5B79C8CEA24A1C64F2EE6794D8144C353AD53D0474FDDF4ABAE776D94EE67FCB0BA44B010922E998F44FBAD6E443FCE1D4DF3" + }, + { + "tcId": 3760, + "kdfParameter": { + "kdfType": "oneStep", + "t": "78851DAC0DFDA9180445518E0E907536", + "z": "89DEA1CEA2F97B2F4E660A4D129E74FD052B358D3A98AB3560E24C22BDB7", + "l": 1024, + "algorithmId": "069DFFFD77AA75239E97DC4BE7A73FCD" + }, + "fixedInfoPartyU": { + "partyId": "0FC45475E43FD62451DD3FC032F006F2" + }, + "fixedInfoPartyV": { + "partyId": "CC94913F52A68E69127BCF996F88AC13" + }, + "dkm": "2C0E652881DE7C35277B9E8FFD7659103EECBAE6651849C5990DDA7F11045B515339B9296199BD9C147BB9C64ADCCEBB28E2C6BE097326BA9CC2AF1E94950BC2D95724494DF5CBCB13C10B3C636BA4DA02588DBCB822C4338CE9B209B8DAA3EC48FFF5D58C8921B03EC6DB17BA08D44B5FBC24407FC44B08C178D358F55B7932" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 185, + "testType": "VAL", + "tests": [ + { + "tcId": 3761, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03F4C1F611E23C4B97A77188F6EE856D", + "z": "155002F828FD7E10EED6C01B94AE6FD03AA73A46BB62E708F703D9896DBE983EEDE49F", + "l": 1024, + "algorithmId": "07676E0EB554F7B91F0F604C396E678D" + }, + "fixedInfoPartyU": { + "partyId": "D69C80E9B09F79851C6518AE6F288029" + }, + "fixedInfoPartyV": { + "partyId": "9705FFDADB0A5DCFC17ED250F1942486" + }, + "dkm": "9551A29F9DCB01D84981B135E7220B1DB28C9AA08F630F4812ED9C09CCD5C4CC62DB92FC7E957F1DE770FB681BF97A04F8117AA18B5FBF097B0671FCD6770548A4622C88B6804341E7D88CD3F64A4DECD36E19603C26A73ECC2401D0FD9395F1068B232C74E7A0030A080EEEF85D1DA57D539D1C52C4348F0AB9E9A647BD9547" + }, + { + "tcId": 3762, + "kdfParameter": { + "kdfType": "oneStep", + "t": "36107D791F9A102D02E50A60DB060BCC", + "z": "263B9FC24665280CB687C0F426A8C5ABDE93BFE65FE709B6F854DE164662764F2375F4", + "l": 1024, + "algorithmId": "BD025CD10C97BD150F42361279DA5BBC" + }, + "fixedInfoPartyU": { + "partyId": "3B3C1A41217D5C97F03BDF0353C0E801" + }, + "fixedInfoPartyV": { + "partyId": "81BB1631C82F297C92CCC25920B4CE03" + }, + "dkm": "D4B65330B1792767B54C351329D46BFBE353C64CD1112BD3556D2B50172DD217193660CDF983C82FC5D206252914CCBECFBDF973542A5650038726BE6B9A80E67989F1E98DB2AB9AA4E6BF76069121AEFCC9245994BA7590C221E0A30B451396E469F4A2C9DE7A177323369F32B1B35835DEF2C9406A24749863325D361E670F" + }, + { + "tcId": 3763, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C33C494FBF856ED802158FB9D76DB110", + "z": "8C3EB6248CE75417FE8AA5045CCD17D02B0C3CD3ACA8011232CCF54F79C1F44EBE3F6D", + "l": 1024, + "algorithmId": "1F75F1F5F901F36DDBA7D986D78DBA93" + }, + "fixedInfoPartyU": { + "partyId": "83B1C22F01035DECE21D374F2A2632B6", + "ephemeralData": "064964A255CF89A1A670EAFA98DCE115A1F61CC35B0D400DFB62C26AA9BAE2A0AC6C1D" + }, + "fixedInfoPartyV": { + "partyId": "133DA74FACD421D58CC07D78D3EC9149" + }, + "dkm": "B9451558D543AF64A72AE3B9CD32F30FEC6061F662B613D2CD0C59A9C489594B3A9FAB305F463405054EFE9154598ADB1D071586742CA4547C216B6BA32EBEA902B5F293EBAB3D59929B73A6A26B4B44412A74C5E3AC0BB377F119D77946184C7663B72548C132C3487A078DBBCF4AA1C5150A6F36EDCD1923C9E1B100509234" + }, + { + "tcId": 3764, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCE939776FD74ED2658E4827F16EBF88", + "z": "4833A1453C329CE0208EDFB1FB69BCD032D1A84EDEC7F4AAA173A35C2ADFB32A62A544", + "l": 1024, + "algorithmId": "BAC52021C42C085E8AC306FA27CBC8A8" + }, + "fixedInfoPartyU": { + "partyId": "3DC9C2A6A4D49C38F9AEA2C8C8C7B3CC", + "ephemeralData": "BE5E1666E9ADC165C3DDC1E93209FA6A59BF70709B86DCA490706A8BC40D3F4E431366" + }, + "fixedInfoPartyV": { + "partyId": "363438165B541E315E3D02A68C6C0C0B", + "ephemeralData": "F6E5778D2CAD816CCB01ABBD68B332046390C77D8D2A87BCC95F49628C59E05CB8D26F" + }, + "dkm": "014C134A04AC1D235B3FC9DA9E2E508C1CFCABB463275A8B7C2BD477C59B5D93A8015D054DCCF80B7FFB36B1651EBF2E6795D77CE9DE05AC5673863600D9E59EB92C42475A98DB3E776A07116ABF1C6DF4A2F7CD67BF83061C71067FE859F9BBD75B2DEED768EB5D171B2575243C66643E219FFA7AB1E23578A9B4BBA77B3FBD" + }, + { + "tcId": 3765, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C2C86CFA7342CC80C89BE686324752C3", + "z": "5EC0AD68C654C2CEE3AAAC8C08866F8D3FC7ADA3FE58BF7E4F2B014DB1AA68BB80530E", + "l": 1024, + "algorithmId": "C6B2B7CA6C8376D5C0C7049A64734873" + }, + "fixedInfoPartyU": { + "partyId": "C59ECD28081C975A30F9A1195DF63776" + }, + "fixedInfoPartyV": { + "partyId": "FFD1E665AD8BE3C6BE0EF44B87533B2C", + "ephemeralData": "452E094BB1F5826EBE529FE8422AD76C713C938E2300BAA18FF4AD5675EB2669B66C88" + }, + "dkm": "EC56D01DDE066CC67BD667AEA76FDA27AC4EDBB51B2C0749D1509E2DF33F82972411DA3C05B7D31939C54667870635C88ACC99ABBB13D86D8FC78696E2933B90332C7D4DB6006DF315C66B5D9D0541160E10C28E91AB7C59D9C6079E3958C1002FE448CAEA9A92D56B0D00F92AF0E7D90EDD31B4D967828ADBDD538DEA87B3B7" + }, + { + "tcId": 3766, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E82872768CD9F594F459A780924F312C", + "z": "CE5B5901667CE036F275AFBFCA82D370BBF96100303879D1C4F8A1FCA6EF71EDC3D454", + "l": 1024, + "algorithmId": "24EBD1AB22448274DD08B92B86690867" + }, + "fixedInfoPartyU": { + "partyId": "2BD8C55C7A87E388F0528A3CB3FD0ED7", + "ephemeralData": "4AE951087095FB27DC419280E67E4663F2586A1E77C291251B70FDFB3E030AD114B7B7" + }, + "fixedInfoPartyV": { + "partyId": "F15C0F20F7CA371A3EB7BF0ACCFC47A2" + }, + "dkm": "ED841B317C6CFF43B877C02C689BD91AC278A8D7D96FBED520BC1B85205869967092A799B489C94E84519888438908413F92C27BDB359E3DAFCBEDBF41FD6617E2DAD5ED0223554181E24A84F91EBD0ACAA0CDD59B79429F6F9773EFA63E8DAC722E98C086EBBCDD6EDF790B79D21407573CDB015FA82967FE22C7C29045C0CB" + }, + { + "tcId": 3767, + "kdfParameter": { + "kdfType": "oneStep", + "t": "25A2FDA80568B0705A09220DA24913C6", + "z": "D6C60ADABF88B9FFA43B449D4CC156FD2F06ED788E478B8E7F30DA96A8D721A2A8AF5C", + "l": 1024, + "algorithmId": "2AA8D45132EBADD7688E22B014954EC0" + }, + "fixedInfoPartyU": { + "partyId": "17EF2229CE7BA2DDC8B26BEF08062BA1" + }, + "fixedInfoPartyV": { + "partyId": "C584A57051DCA833E65D0B629ACEA5CD" + }, + "dkm": "9D937B9E940C7944847916F9E9BDE6299438BCE517CF4AA2EA6D36B1F1F0FC296D856994C47A6218EC9720E53DA9F66BCE6E5473CA7E230321094DDB5B1456D4465058D5218E147F125AAFB31FF31BE9955FA86D27C2F9F3D05A7AAD52C6F9D79763032B3DFE0C023ACF2CDDD2941E21C0CCDFDA2365E227845A2AB86CED2A0C" + }, + { + "tcId": 3768, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD1B3D4B44247B0868A1AF0AB831F97F", + "z": "76D8F59AA6EF5ECA6786170D663A9762F549D0478FEDF05CDB3C5E857D9157BCEF2C89", + "l": 1024, + "algorithmId": "3D926144FFD511D8F13482456FEFB9BC" + }, + "fixedInfoPartyU": { + "partyId": "73DCEC1A7845D4CD59AC7BEEE5D67218", + "ephemeralData": "52A47B81DE4C0ED23898E0EBE60664FAD57777186640966E27B329D1A4E1C64F65B948" + }, + "fixedInfoPartyV": { + "partyId": "A35FDE9337EB85C8C41431905127733C" + }, + "dkm": "57D47A361AE974E8512098065F3B429D07AEEEAAD8E9ACF8F55FB1B9F7360D7E2FDFC26286E436B2A573B30DED7A07D01545C628B6855894B89F96AE1254BE811A1CBEB0B889671D1D9683BC08E9BB97FC6CB78D0E47D19182B77E047EE5DDBF3DDBF71F5A19AD982FA0BA0AEF00E77B03B8AE4FBB329C076FF834E61DD13672" + }, + { + "tcId": 3769, + "kdfParameter": { + "kdfType": "oneStep", + "t": "355DBD8CC414C7E891A5C403A51BFB89", + "z": "3E9EE1C35DD11A9B98B6C7164AF9C3134832B44AAB38E3C076394D2DC48E4FE27A0FCB", + "l": 1024, + "algorithmId": "2395760E09D33E80E9952E6380486CDA" + }, + "fixedInfoPartyU": { + "partyId": "10C91BAFAEE54DC957ED36FAD4B2FBFE", + "ephemeralData": "4E04C1517FE908E2C881A2D5DC4D5E014FACFA44DFB3DB7C1229F5981B64C4D1724974" + }, + "fixedInfoPartyV": { + "partyId": "B469059AEDDBDA0D043C97973A6C2C97" + }, + "dkm": "1F27126D8368CB29BD89ADC2A815E3ED93B9A279E3C507ABFC5068E13EF579F6CB1E64807C75623196A4DE1CDDA8F9078B415F2B4CF298FCF480105DD8314FDEB174C07162A0E4924C7FBCE32898F1E543C61EC574BB776936CD53606550B883312BCE24D951BD8B8C6253324747232072D5C25C633F999C03AD80D9D30BB6B6" + }, + { + "tcId": 3770, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45FAC06BBE6CB1C6F97E16F604633C9B", + "z": "CF937B0D871F98C0D7BF365A1B66387C18C98822EBC93CE41AB41743F831E8445E8206", + "l": 1024, + "algorithmId": "A4579A32D6D975CDF2DD05729EB9B470" + }, + "fixedInfoPartyU": { + "partyId": "3549C6FDBD99FB42ED1F4369BB123BAF", + "ephemeralData": "65E5E94FFADA029C5FD9791838AE0D76E63BFAA8690C2DF8AA375A290E0466A00D7DA7" + }, + "fixedInfoPartyV": { + "partyId": "021430EE14F5750B0F920337482E86FD" + }, + "dkm": "36B09F969EC346F484A573312A8CB9ADA033AC7E4D2748C9F1D34FB46148934802691ADE2BFFC64A0AD7C9E6ED24A1C32860899B5F01E0F2B39E0E97FC98BC6E02221E6A9EEE420BB118AC39C6A27D94D1455C823FD90DCE054850A2D65713EB56915C9FE8AF7605341934BBFDBE49EB2785A849C567B47CD767F2642EFFB944" + }, + { + "tcId": 3771, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E602D0C2BA55000BCF1ABE01872BFBC", + "z": "9D396F4D59B9B7684BDAF5DB391654FCDDA698CB401D6DD5B005501232BDBEA044CC4D", + "l": 1024, + "algorithmId": "B93DB7C7EAD8CF7B66E45DB84B96E687" + }, + "fixedInfoPartyU": { + "partyId": "93D910E24E1BFBDBC75F8CFFFA9D73FA", + "ephemeralData": "FDF425DD57688BD9E05E4EF56FDEACFA58457F336562AB975ACA72E4AB6993364A644F" + }, + "fixedInfoPartyV": { + "partyId": "621BB6982F3004C28C15F2096766EF0B" + }, + "dkm": "047F949832120A929459CB0429B5A78DCC8E6B00CE965B32A8C032103337D55281244F322EAB15AC90E61C37A82C5D1F8D5807776402E1E705B8C0FE85FE7C38CFCCC629EEA8E9FF79F4D8AEBEEEAF4DF371756539709A9ED04647D2174EF6E2FDDE79B169312379785AA8AC102208830B50BE4A616E6D5860E367B98D1D55A4" + }, + { + "tcId": 3772, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DD889A381D2BFC398E699D293FD07AAC", + "z": "7F2A264B8DCEE00E27FD5FCC0C320A3F9F9CB81C7CC1615698A81E0252C307409A1F05", + "l": 1024, + "algorithmId": "8483180F8508AEE5C5EB0B0A608BC869" + }, + "fixedInfoPartyU": { + "partyId": "640F80782D12058020CD28E87D427EF0", + "ephemeralData": "50F269D08EAFCF4DC78C113D17B71F759D8C4136304C1B5022449C0AE1CD13D2D248FA" + }, + "fixedInfoPartyV": { + "partyId": "36F7E2B865D0AAE44C7261B0DDAD58DD", + "ephemeralData": "5F9A78D86A0E274192326AAC14EDAF94DE52FC29E652B5ED3A940686C09531437BEE71" + }, + "dkm": "72F1D081FD0A1723FDA478CFB53809C5AAA1C92B42CDA4C5BC036D23587061BA84864B312E75622F930C0FBE4DC07FC6B78303C97F4E4C76F682B63587659534050D88780712A65E99358C45AC96EDBE46FD914EFA1C487B90D6E1B91FDE2DF702C006C3681B63B994999CE45D16667AC29FF68D390DBD5ECC0BCC7FF5CE1B94" + }, + { + "tcId": 3773, + "kdfParameter": { + "kdfType": "oneStep", + "t": "761873FA9BDD6A2513104789E5884EEE", + "z": "BCB79026C801281CD1F64FF61DB94082658FA5D4B35D3D66D5A12777F24BB15BD55203", + "l": 1024, + "algorithmId": "B4BE082CC02EA999C29C0587F6095F3E" + }, + "fixedInfoPartyU": { + "partyId": "F508B7C8D6A971E7BE105BA3036232DA", + "ephemeralData": "195D0B1F650920A58535FB2F27C28B42A1D9A085D5AFD8264FD57ABB0CDE354A36950D" + }, + "fixedInfoPartyV": { + "partyId": "2750D4C20E98C08528485553A57181FB", + "ephemeralData": "B787E1CFD0C226626EA19943EC4E342E04D9967B1A3070719B6759FF4F066D4ADFB267" + }, + "dkm": "0B4A928252B1B6503171CDAD83D1315C0B7F962605B7A3C6AB3CD5CFC282EA1C1F053CE0E60A35468F7B879E4CB2A5F04A4BF51CE63AEC04633C3AA2CD739368774402B578A04203C42EA3193624FDF7398675FBF9E48B433813D18214E780067D162E556F2E966F77C1C02969E322564E886CFF44E7B4E15C0D5347E97E9E38" + }, + { + "tcId": 3774, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C04926A72D07551299992AEDB56D1C4B", + "z": "78756A81BB519F84B30AB3203B81145EB2D1A82B969CF9B973CED9D8EA858E37D800CA", + "l": 1024, + "algorithmId": "F61197CE4236B3A7637FA6DAC6A44C4B" + }, + "fixedInfoPartyU": { + "partyId": "84DCBF769FDFB71FDB9432C668D9BFCD" + }, + "fixedInfoPartyV": { + "partyId": "844FF212873965D18384B7C549ACEA74" + }, + "dkm": "9745306F8754DABF7672237C7591AA57D65353B87D268EAF6C28D7FCA5F9CA2833D5A8AB00D93E1FD0839B7325293DB80DEA3659C01C0DD4E491C252585FC9A6ADB637360311839807D2EFF518A57D8CAB7D8057F7C61C5262847D39878A2FE12FDA9AEF3AADAD770508B31E2399CC3C7716129DFE7AD0E2F7DE1A7BA04E0644" + }, + { + "tcId": 3775, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D009CB83E8C8FCF5A82156B677ED2545", + "z": "1529721BF6921804436CCE992107B995FD292A51059296E581A59E810B5A8E1AFB6156", + "l": 1024, + "algorithmId": "42436C636CFA7BE67A7AE0013814EFF0" + }, + "fixedInfoPartyU": { + "partyId": "BD76F763123BD510D96B1AEAB4287101" + }, + "fixedInfoPartyV": { + "partyId": "6C7365AE0B690617224C613F4F1674CD" + }, + "dkm": "813594E758C9264550DC1DBC48923AEA25526E57634F8EE91346E213EC41640B0972DFD85C46E4A4F11F7D8F00D12E0A378E48646B75BE8670476BF3FF855315BB321DD41593E0364632ECEC0CBFA398E7D0AEDF29C029A8F8BEF493368C92DFDBC104319FDF74B057B65075E120D0597230BAADCA52F01529EF19EC0BB2ED08" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 186, + "testType": "VAL", + "tests": [ + { + "tcId": 3776, + "kdfParameter": { + "kdfType": "oneStep", + "t": "724092574CD5962F4FDFE5CF43B221B7", + "z": "1A103DD53EC9851E528D230E7A93336B07233F3CF84CC81F070D6B9F", + "l": 1024, + "algorithmId": "486642CB99307D1A3EDC96B13F8CB423" + }, + "fixedInfoPartyU": { + "partyId": "9006BAD4EF285E355FFABD3D87E68FC0", + "ephemeralData": "FAB0453438ADC99C58AD3732B7E232CEA21954ED04343D5A03FCE3D8" + }, + "fixedInfoPartyV": { + "partyId": "694F83B25166171459FC7D387F637D9E" + }, + "dkm": "FC1ACF8C0546E497038B29455D2FD1E9BAF1A8B6B400E109065FDF5BD95E6889A0A5134CD684DCFA11C7E26EC4DD488B7A94490899AC9E33B2A113C14F817C6B9A230E2925CEC34A626F7D86A59FA60D996642BC0FA3D61DF6A0FAFD8B911E22FAB8969A23B561AB360C8CB9F362C3B9D6F91AF2C52BE50FC012B210B8C2C83B" + }, + { + "tcId": 3777, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E6A222A20A6B7FC9C9758162824E0F41", + "z": "AAA363A52B5CE0CBEDF771FC6E6F2E61BBBC8AFED0532E40F67F18C9", + "l": 1024, + "algorithmId": "09B61ABD8F3C3E29EE16788F3C44E2FA" + }, + "fixedInfoPartyU": { + "partyId": "D40BEF23532CF940D216569C074B0B0D", + "ephemeralData": "54A7B011A39E154D426B52DC7A62506014A0F87C382169799A0FD4C3" + }, + "fixedInfoPartyV": { + "partyId": "5D1FCE2AA2947563A7AA4C01CDFE0295", + "ephemeralData": "BE6617BBA61313D2FA7AA2CDC1C8886B35ADDE919F9C47D9C9A8E0BE" + }, + "dkm": "66FB2F5AF6BAA6F3AB898A46606E0585500F61AED7773A81B2E88E491404E181BDCAC4FA6009ECA5CE0D89E603164DB7010683514F59D004762A5DC693AB981E80385D58741A706307E1FDBC98F843905908BF6C721100DADC4E589BCDAB08C6C15BB4E08468CC5C3C892DD0C5C84A0B97E5607DC4FD28B66E1DB01830E31840" + }, + { + "tcId": 3778, + "kdfParameter": { + "kdfType": "oneStep", + "t": "296C3F24C7EE37CC8B4ADB5D6E8D1B42", + "z": "F1DFC5521A3BE579028E576D6A9E45682065B33D6F9D80844897CE32", + "l": 1024, + "algorithmId": "C3A846F26E3B4822A034A229AC519DF6" + }, + "fixedInfoPartyU": { + "partyId": "A9301D7DC23F60AE243C12DCE37B6CB4" + }, + "fixedInfoPartyV": { + "partyId": "A0BEF57D924CAF69B1CD5A8398872329" + }, + "dkm": "8548CA415B22BB3048891B735C473F58105C346A765433A84B039756F745791570D0BFEBADA8B1F9AD01EE1E29984685DB12264122D19654EF6372ECEE56747C0B934FC7A2C38C41F270CDD44E34F223A71F25C95199A0266FA56954EAAB8B71C0895E34CEEDE599AED6E5E7620EF1D7A8603FEAACBFC3DA565EDD5FD03EB308" + }, + { + "tcId": 3779, + "kdfParameter": { + "kdfType": "oneStep", + "t": "109C11A55A8ECAB029F41E77F676125D", + "z": "CD14670FFC3151004A156F3E6EC6E617436C8368404EAB3AA8D606A6", + "l": 1024, + "algorithmId": "449304304512CC9CBB556098C490031A" + }, + "fixedInfoPartyU": { + "partyId": "F38D35C4B109EA2D2A9F022F8A15FBD1" + }, + "fixedInfoPartyV": { + "partyId": "97D399DAD5540F51FC361C2004CA12B0" + }, + "dkm": "023FAA6228322D3FA01E046D4EC443A84FFBD29B36B816BB1A878997A0EB59E0E66E134DBB252E77B17269D40316441982C1BC0C4E441D6431A1D69201B2E09B77695493BBDA23F9AACD3A7C221A585F1F2E967A7F82543A115A72A71DDBCB4F43DF5373E7A18DF5EC736CA20C6C975E9562B59BF9F386A9F58A2FE1F6477CC1" + }, + { + "tcId": 3780, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CA793B5FAEDC1555C92B758B1CA8265C", + "z": "2E6E5D779855BE841730E4F23FCB857BC9079DB3D6948E0F010E57AE", + "l": 1024, + "algorithmId": "EF777D21D0BCCC45CCD7FC62D454324B" + }, + "fixedInfoPartyU": { + "partyId": "E9E58E34F6B2BEFF70E7F2530A6C281F" + }, + "fixedInfoPartyV": { + "partyId": "E7B1B0A7C2C429BA944F975315F550EF", + "ephemeralData": "22C898751D90CB37893A185204401289B05C57888F7986E8E6350EFA" + }, + "dkm": "481943731D98C9CC24C16B1D0678D71047EEBCFFDF4590D2F976B6A8717EE2633B76572D77F12BCFA6823E0EDA799AC3BF364F82EB3B8AE796A7CB5FA0C6D242477BEFB62393C3F0319E598FCEF6BCFD9F157C9158616C747627DE3A471976EB0AAFA3AF1C4DFFE5638BAF5179F03CE6893F5548B5573637F17CA05AC3C4774A" + }, + { + "tcId": 3781, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C8325823B1B79183D8E5783F464A27C", + "z": "438FA1FB45B5DA793FA864AF278EB4B7D49322C0652859CD017AB732", + "l": 1024, + "algorithmId": "1C199455EA752DCCE55A88BCA8DE899C" + }, + "fixedInfoPartyU": { + "partyId": "6133FF7A234E18199DB7E9AAA6631E6D", + "ephemeralData": "15970EF0FCCD2AEDBEA1F8E5C92B0535015712437D1D8BF4EA6486B9" + }, + "fixedInfoPartyV": { + "partyId": "D66628459378582B1B418254A67AC584", + "ephemeralData": "7F8C9E10C3B2ADB1987DF807F4E5F967B88FD5A2920695592212E39B" + }, + "dkm": "EE48FF82D0C69CD7DEFA1E40576F113B2937A8C23C5316670D813AD6863C794CBEE979CF0C4E599202331B5BE0AC265129F7997337DB00E0505B40AA3E4989F067EE8F4E43BD5444925F6A60C95363D2420C867D7AE243A9E4BF9B43DF9CAEB6DF646DF63609DED791717A73714EBB60ED8546CF13CC65F5AEEDECAFA37B84A3" + }, + { + "tcId": 3782, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4E86D3666016AEA2A840964CDA45B3E9", + "z": "612C23173CE1E7D549144CE207DBCB71470697A5BF4F51661581BB65", + "l": 1024, + "algorithmId": "FE29017B71BD4AA91D05B50FCECB58D3" + }, + "fixedInfoPartyU": { + "partyId": "B534856398981380C00C6FC3D6B6A49E", + "ephemeralData": "B4CE871BBF018330E00020EE2443FE44D97D783DBF1A7E0ED2D636F9" + }, + "fixedInfoPartyV": { + "partyId": "F786179C26908E55EC1DAD2BB34FE57C" + }, + "dkm": "B50E8A22FF76A241661E94D7F2ECC8B136343AD7582ABE973D2FBDA489AA625A51100A74ADDCEDAB66A7B6FE0154F4B955AD3BC28B3B93FF522559E512F57C19BF5A667FDA5F03010947BFF5D7C93BC3613603931457248CFE840A12E41B1997A779AD01F7A6F72099D530F34A6321B9F12A88207E9A062AB806B455EA341AD3" + }, + { + "tcId": 3783, + "kdfParameter": { + "kdfType": "oneStep", + "t": "25B328D062248499A8005545D7FD7F7A", + "z": "010FEBCD18FC0745923C97680583D159A2C299B0AC3922A0BD070167", + "l": 1024, + "algorithmId": "EB5EAAFF059CEF764016FB85A994CD6E" + }, + "fixedInfoPartyU": { + "partyId": "AC265046584BA1A2FE9D773C4E70B3D7" + }, + "fixedInfoPartyV": { + "partyId": "13B4F0EE045FDF21EB38FA1E01C84F5E", + "ephemeralData": "3D971B6337B9B900469C6F8550E1F54CE44CC7628533E1657328FDD5" + }, + "dkm": "8A4A222F4DC2765CFCB81BC02EFF65A670D397C7A22C523B3E3465C80D1685E7F6B595FFFAA4141341BE5175EA3477FA68093566EDD5572F1B20182686F48DAF15A98760EBAE9FB8E221A914F05460638CE96ED4563B1DDE5DC6B619B68F802850A12C49D3A58F9696FB5C00BEAB68B09B8C6726CD5CB1520DBD4426C99B08C3" + }, + { + "tcId": 3784, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7AB7C0D7B21FF0D7B08653D9DE224E17", + "z": "44C7C8BD543152F3E548945A1A756D29FC0B863DC490AAE7B90724D7", + "l": 1024, + "algorithmId": "FA061039424781C8C5F9BD349E7844A8" + }, + "fixedInfoPartyU": { + "partyId": "52A15DBD6D124D08146ACCCA08EE479E" + }, + "fixedInfoPartyV": { + "partyId": "E21FFBB3F38487D1784358057A698689" + }, + "dkm": "00F018E7E658579EA43B71192C9344564DF3B6FCF558C26150A438C7EA9AF7CC178B08820E2870C32B350FB2644D6A811864EAB2BC991B3F5CC47ECC537581301720E431832CBD36DF3E31A44EE1B4D3033C87F510212498478FE15C1354021C09A2F03FC8CD4B804F2679D9CB0BAC82680F3BABA2282295E8F2202FDEBAF6C7" + }, + { + "tcId": 3785, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70DAAF5EEF8FC1AAEE09FC5E4906B6CC", + "z": "8DD8D63C9870C943675550409F326408B21BB297B112351ECE18A32E", + "l": 1024, + "algorithmId": "C1BB86D47DA83C1F8291804E82C54694" + }, + "fixedInfoPartyU": { + "partyId": "ABB255A497A2EC6D304E38627024A1F0", + "ephemeralData": "AD53310116CF50AA8EF5C0845D47928033652C725A0EAFF08E45E657" + }, + "fixedInfoPartyV": { + "partyId": "0BEF1615F200FE92F0E5B7C517EEC2BE", + "ephemeralData": "C086CA57ADC86D4E3DB09B605BBF8D2F1607361DBC9420395A59EDFD" + }, + "dkm": "AF98D8A2C67DE2CA3192ABC3E4B8FA42B299EFAC6399318DC28F008B9050173A960D6255F2EE275989B315A5B1F0A5B99A27A170E8FD04379D20A7DC876431E308DBDAA74962BE784C9211D17732B251B9E0DA8419EE7EAAC763580085400E4AB707F66D4FC38C554C0875FE8606E860BF02EB7F8DA64DDEB8D6263CDB693D63" + }, + { + "tcId": 3786, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83C6648AAA65F3EFF203F013AA6B4B84", + "z": "1C3D4503D4FA7D22B05269769D706F397070EBFB9183649EF31F0D6E", + "l": 1024, + "algorithmId": "858FE7A9332D565CA73E8E102D3807C4" + }, + "fixedInfoPartyU": { + "partyId": "28AFD9C720E69BC79BC5AA8FF81C9428" + }, + "fixedInfoPartyV": { + "partyId": "2658EF4B12F16116122133C7837FB893", + "ephemeralData": "D44879E5FB606099BE8C7053D2CE48E83182DAD6D5AA8FE077CE6768" + }, + "dkm": "9BE971E89381743185AACD0B050AA55C8A9F59175B388AA433E1F669EDD781161F11965DEC274AAE0DF568219BD94B770CF9DF1C0D3A3E0CFD8941CBB9280B21DF27D02D5DB7E7D655C00E31E2523A4786344FD09123B2A5FA254B616A896F16163F4BCFDA3624452F194900439ADA3404C57636FE0EBABE5D540ED19D4CD888" + }, + { + "tcId": 3787, + "kdfParameter": { + "kdfType": "oneStep", + "t": "257E70E7A9E8900313C588DC7BFBE1D6", + "z": "F0062BC4F7D387C3FE205DB16181E82C56E641B0B6167883553FE5F7", + "l": 1024, + "algorithmId": "51D424EE7E8E127B21645D800A3F8980" + }, + "fixedInfoPartyU": { + "partyId": "9BCA44CA5ECD7EE5088769930A3ABA75", + "ephemeralData": "8F327B7860C2C3DC06F6412671579147126F6180508AF8870E1BE66E" + }, + "fixedInfoPartyV": { + "partyId": "0812B9B0C2EEE1EB44555537BD7E33C2" + }, + "dkm": "06F3F2B700BC541DB68F2EE4141FAD08A5AF32DE44476D65684C894CE2B34D06BA8CBE258A96DA48242B01788A2E5307468F74E970AE3981FFC25FFEB91EAA05B70CDE5CF1A59720F03979CA775F02E394A81F11896A52167BAAA2550BD2B1932DFA5ACC0E3DB5BDF1C15E68AFDD08BAC9A1B53803ED7A066B070047510D07F3" + }, + { + "tcId": 3788, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BADDA5C91BAE388F8CDCE12DD890D7FA", + "z": "212AF4D23F67EA41D662762EECCA969DBB0EAF0CDF073BF0976ADA2D", + "l": 1024, + "algorithmId": "7591F907189EF533921D985ABA80AE21" + }, + "fixedInfoPartyU": { + "partyId": "7ECCB1CFBF85FA8E2DEBE3178DC901EA", + "ephemeralData": "F0345D9DABB9A380E60AF4E610FBC52A734279074253ECC26DF8EF20" + }, + "fixedInfoPartyV": { + "partyId": "6A104B751427B33204B16CE91E8F06A3" + }, + "dkm": "262BB1C485CF2A00A36F45021D6326554096E3F86850FA4679170D39894A62A64A77D282973386818EC2F44F4A5E3C61C3FA6C4419A4510C86F589A433FDBADDF7FD6DE5D47C393DD0B6427DF08B1E6C709A64A78B754FD37B260C2E64F49A40083B9FD049337D3E22279C655D5F60D1A978EAB80F74CF95ED6EF25B7A9DC243" + }, + { + "tcId": 3789, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EE86B0AA9952887FA306F75AEAA8EA82", + "z": "27119AF6B8FD6502CAD0C4AF4A5DFA72A9C3B09C065100DE51F2232E", + "l": 1024, + "algorithmId": "78EEA6360E60B6AD568CC1AF903DFCB0" + }, + "fixedInfoPartyU": { + "partyId": "A94EA29881999CB312DF7230FCACF26E", + "ephemeralData": "2B12974A1B0079C704A9972AEF445B3A26C8ECBCE0E5E9082B85305C" + }, + "fixedInfoPartyV": { + "partyId": "85731CC70965FC8B699984541760314E" + }, + "dkm": "DAC3F61EE0DD577B87A8F3D2CBB28C601405541ADECB62D8EBF39E0293190B280B21C46DB37630C39791C222730648590F9D3B66515A206535DDAC8ED182875F0B13279A9ED3DFA0599E05F6A7FCF02CAD3568E9CAB0014DA0D5828AD24223B64248DBDBF4AC4EC91964C695C8EBF3A6AB7CE873CB88B38238F4B17E87B98AEE" + }, + { + "tcId": 3790, + "kdfParameter": { + "kdfType": "oneStep", + "t": "45F4EC70590A52929D8908F9EEC1B627", + "z": "3070D83BC6983CF98ECF0880A7452AC08077E0E15D98DDE9C86F9493", + "l": 1024, + "algorithmId": "3DE1DAF9BEA648F6644A61820275C4CE" + }, + "fixedInfoPartyU": { + "partyId": "190D641D4A53196B642A60530AF4F056" + }, + "fixedInfoPartyV": { + "partyId": "6C118DA9FC574B661D68D9620D67DC08", + "ephemeralData": "D215EDED8C17F42309FB32357F2E957084B4673CE1005F2C6DECF006" + }, + "dkm": "1F64BC9E8D78F440F1914BC280E2837D63106EEE1A0C372D14A1074327DD1285DAE1D56B6552AFBCACA76FCDF00B24442C9041BF0F79AFF0EFEF290EF6A59A20363BD817BF1D2D0E92055587E11378583DFF1AD8488A5A4D72E56DC239D9185E5557A4A63393DD7BD001FD9BC312DDF6BE22D20369848062D655154975C1F716" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 187, + "testType": "VAL", + "tests": [ + { + "tcId": 3791, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83D27F13DD124B6AB8F0C95E33156F88", + "z": "B722BD61F6A2F6DEEE0FED754D7BEEBBE6B6B6C641D5A7D27187261A785B3A7CB17A8C", + "l": 1024, + "algorithmId": "F300CAFA43A690E00980082A59C7DD3E" + }, + "fixedInfoPartyU": { + "partyId": "264B0A95101D57D70DFBF72DB8831880", + "ephemeralData": "C8997CAAD459FECF1D766EF3C3B9FE32ADC01D841510908323996C2B8F3C2C10951798" + }, + "fixedInfoPartyV": { + "partyId": "778B08464689D75EC08DF4DC53A68DA5", + "ephemeralData": "0C8AE173C7D62FE41B65F9713DD16C77F77048F70778C5132CBF1FB6A1A254DF5EF39E" + }, + "dkm": "CC39CCC36555E1907E9B35409AC78DD8434CC5B015A71DFCE9DF9D1DE2B455E6A3F6B91823132F2AC03EE59E6ABF5222E3A39624540746D571AC4EFF833D5B23667E85ABD7A8DF1DD289C382092FBE9E5A07F20757DC44998A346C863CF3818DE2A747B1073FC8BC2B18F7F7D5DEAE4E837D7D30714C1E35FA9ADEE0AA65DA85" + }, + { + "tcId": 3792, + "kdfParameter": { + "kdfType": "oneStep", + "t": "09B5F6D7BCA56A697E4940EE5E43113F", + "z": "E4FFB80B21F35D79B93E976C0503D68C4611D06971938DFEAD217CD7CDC3B671A44BFD", + "l": 1024, + "algorithmId": "686B208EE1096E01F9B003E422BDE0AC" + }, + "fixedInfoPartyU": { + "partyId": "EC3CF8D6F14A92CDE26C447BB2FA7C43", + "ephemeralData": "5B5C072181E34D4CDA38216948CA5FD6ED2DAE8E46A200887A530977D93745F93329AF" + }, + "fixedInfoPartyV": { + "partyId": "276204EFCC59F1F1713A2044FEEBCB8F", + "ephemeralData": "D2B5BBEA48EA6BC878575825B5A82FC3C3B646A48159D1262A8C5D0DD7C9E0E565164E" + }, + "dkm": "B2A602900FB2C7CB2966CEB93594FFDF91C93345B8D63EB9771EE7EB6E2DAB3CFFF392E26089AAE1E01DBDF756E83E446244B7D3C471D0582766FA47B3F5C2957C86E2A78128365B3DBCE3D323703AE102620169876EC67427635A57A49E12367C7205ECFDD1B35573FC94B379230A4788307A9C476808771639F3A70D59625B" + }, + { + "tcId": 3793, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C33A9208128A8BE1D3C642091220A72F", + "z": "4F1D9CEB58BDE151E714128B40F8C7A2B74733624F15E8E2E5829E8D718F14B304DA31", + "l": 1024, + "algorithmId": "FE0FCCB481E0D77D61CF6CDCC8E7D8CE" + }, + "fixedInfoPartyU": { + "partyId": "DE283BCBEAE35D877493359FEA5CC7D9", + "ephemeralData": "0F97DEB8151C292E2EB983346D175CD79B76C6CA46FA29E0AB20A7FFA1789A39FC97DB" + }, + "fixedInfoPartyV": { + "partyId": "05209D635D93E715F8EABB4E3F162104" + }, + "dkm": "95A28DB420D7B4125EC31385D11EA4F31F93B8B3645D882FE02828342EABDF50903F75B1C7A921410D7E6AB0FD1BB8A90F911CE4CFDB3E3EEBCE8A718E2C91BA1A6B7393612464ACFA572E4D24FF58C253D96E2C3F72E40C56A2F49CEA47BC9DD9F5A8C81EE8F9F95F3D0EC77D9B6ABDB2A7675E2530C736F84145B7B1AE7855" + }, + { + "tcId": 3794, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B6B0901CBAFDE47CBAC73A856AF2060", + "z": "B2FA306FAFFB3E20127CE9E7417E564ACB1FF932D722771C956D28297D59CC9C7CADA8", + "l": 1024, + "algorithmId": "1DA8D4F75A069B79B1C7EDFE5948955B" + }, + "fixedInfoPartyU": { + "partyId": "D17C06255490DD3B2D86A206510B5749" + }, + "fixedInfoPartyV": { + "partyId": "7CEB25BD2DEB5D474FB3946C29B4203E", + "ephemeralData": "79B5D7A4B87EFF9A45BE0157C3DD88460F31CD2AC119EC28580A0551D0A8C4CDEEDA8D" + }, + "dkm": "33B31B142E85247218161EEFC2732CA8E97C0964AE7BE888373BE0E495408F1D650509AA6198DE0FAAB95058DA31FCFCF1DCA4A4EF87FBCC3A4982826027B9F03485D366E456CF537F23E0A4361533D36A64BC4048E832B861079A6215B638C104179AA49D76FD1FB318272E9523A3D466C3728BD6CE6AD22E00907D3FED158F" + }, + { + "tcId": 3795, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FA1F2B305BE76498A13878F1647463EB", + "z": "AD8D0E92AAA02411E9B115060FD80BB5094EA122EA4AA0485F14606849E534BADCEBA3", + "l": 1024, + "algorithmId": "6AB91ABA50872EBDDBFC0C7681534D7E" + }, + "fixedInfoPartyU": { + "partyId": "BAC47A4D01F018DD030B1A0536FF3DCF" + }, + "fixedInfoPartyV": { + "partyId": "1239CD69C04337FB82A5D6DCCBEE6921", + "ephemeralData": "5FAFEEB64B7342C8E30AB45A67F2E29FA470C8E55F979CB025ED32D5FF9B0318A2E41B" + }, + "dkm": "0182CD6E79843956A145339976DD45DB79F0EFCF0411B3D1E5AC3835295CE91524C5DE2E71361EBEF675BD65A8C589E3A08E99D42DFC30E712C0E26552AF93CCF425F59A16E9A462CDB401835D8A9DF21A9F9BB04DBDFF358913A21FBDB482E7ECBA105AF3DA5635791EF68F02D59BBBFCB0AE3193AFB9F92AC727166014306D" + }, + { + "tcId": 3796, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B180FFE8A816EAEC59816D24DEF8572E", + "z": "F7E5B2F945D0B1A8CF4F59177E796B7F885DA20676CC9BB0F7C3C7AF5C21CE702C653A", + "l": 1024, + "algorithmId": "85038A30319633F82D79C793BCA8DA85" + }, + "fixedInfoPartyU": { + "partyId": "060F7420BDD175611748FA0CB7935DCB" + }, + "fixedInfoPartyV": { + "partyId": "B6FDFE7DF6FEB4527E1714E7C0460176", + "ephemeralData": "C94A06D377E3204A46BA397B48E3369EB183BACAA133AF9287A11D6222847CA50FA9AB" + }, + "dkm": "8C59E2841C4FA2EFA2C0303465AF47F9461A7204BDCA6E0B20C759F370BE0E2FD7A4D8173D8535089B23D0913A2EF7194712C495B61CFAFDA85559662C6947964B263C806EAB9A85B49BDFCAC2FB08F3DC394702EB6B99B0A20687323EA0AA98D44A2212C85BD38F9F5659C35D9E33576D55C1C25BE54C82F9607C7F303DD0F1" + }, + { + "tcId": 3797, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E066BDE996458BBCE13013AC37F4F77C", + "z": "76D9C757B7AD061ADE7EA7ECC573474936509F1D0CCAD0F54F2D838CE5C12223AF0970", + "l": 1024, + "algorithmId": "1C1B96FFE6BA2E14A0434CA69A60D8FF" + }, + "fixedInfoPartyU": { + "partyId": "F6287EF1113AC37EB36812BAF9F7E7F5", + "ephemeralData": "D01DB6DE9CED6D6D2847BFDF377B56A8361654F62EF876D686CAE3A47BC343FC981C87" + }, + "fixedInfoPartyV": { + "partyId": "9D1A0CCA08DDE247D6557B24B27940AA" + }, + "dkm": "C16720B871FA77163994657848ED5A87BB6CE65BF1968C4CACF5E502274369F6A81EFA380A4F12AFD5D6B8FAF8E51922864AE817C1EC3993274274BE91AB873E951AA9A0318F72389561899BC3E4C168B1A48FA20F830CA2D94BEA14F057F011F35FDC3CCB6C10EA421F65B10A61D657362D6E1C60F59C027E2BEB005A1EC0F8" + }, + { + "tcId": 3798, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D96785469369AD9743ADF775504100C9", + "z": "4746936EFC827AC58393E7F2A99009B2CB1742C52F0A5BFC4B8B8F920BD359BE7610C7", + "l": 1024, + "algorithmId": "B5997BB910F31F5E0216D6C8D4411291" + }, + "fixedInfoPartyU": { + "partyId": "F55EB57E3D74BC400FBA23CFABB87361" + }, + "fixedInfoPartyV": { + "partyId": "EB806178BD19C1BB0B7B6DD523F94EBA", + "ephemeralData": "1F2B51F45AC752A161139F3C068CA120681FB38D0F66BFC0F0DD421725F5FB91E59795" + }, + "dkm": "AF76B82A5C00AC8D1332465EA00BD4A664BDAC00A18E35870D58FE06D31AA52E811E9BB18BC31DFD110AC7CE31ECEAC586C7EC5169A5AA77999E509073713DAF17D5946AA376D46C4E6E6AFE4EA707B5C7E0410393314C28824DA60CABA979905C75AADE1C605330D4737E1B3D195B0C882A0178A07CD3E82070406899EAD3DF" + }, + { + "tcId": 3799, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47E18BCBAB5C5A5B38416D64249C2670", + "z": "7CE445B296DC00F0D54561918C913702A0E89B1F367A2ED5AE07F6933F30DFABF96A75", + "l": 1024, + "algorithmId": "5B087F4700857A04CD4A4D38A3DD0C13" + }, + "fixedInfoPartyU": { + "partyId": "0445140FA8A859DFF99EDF977DC5FD9E", + "ephemeralData": "FC5F9AAAC839FB224C66EF515C78ACE018A77B52009B848C0D69903878DB624757A57B" + }, + "fixedInfoPartyV": { + "partyId": "9355A7BE5B6C917506444D223B88E5F3", + "ephemeralData": "7D5BA5A67A8E0B82C0E7726893F56BF36C0C9E24F262A0573D568EFC58054803F4242D" + }, + "dkm": "ED80A8B3AE40BAE72BE6D3651F41CFE6061078F35EFD74D28D9A848BA4A3F7B892F0DCD6A8E5AA277E7A89A141F425A67083A14F3DA336065A4EC83CFE0F3C1F019F5876B7E96419700524FC0319FF4D6DC69A3D0603396BBE235446D5700482778A6D653DCE3F9E9475FA112A386EA35F291CE188D35D7E0556C7E1A44123C4" + }, + { + "tcId": 3800, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EF7089CA19B9294B8344BC922C7DAE90", + "z": "C32D073FEADB3C3A32904B21B8CF40A78621FD437900D2D812D4BBC991FC598E49305E", + "l": 1024, + "algorithmId": "0F69F28F211C78C8B5F4F5637E138FDD" + }, + "fixedInfoPartyU": { + "partyId": "1B75B04BB06BAABD70B41D93B6DBA95F", + "ephemeralData": "3D40BFC689E7DFDF77FB5F8C89F36B2299193DA5D0D2EAE08D57C9C94327778EAEC902" + }, + "fixedInfoPartyV": { + "partyId": "0E0B9AD7D29027C6C9EC9782E7357E3E" + }, + "dkm": "2E5630606EAD826793E9C75FCBC3EC0B995A1AFC2CE67949A3C56AFC2E744E7200883BA47C5E29B34D1E4341105DBF154A671973F7F7D782E4844820A4FAAAA8CF2B9310FA5E2982D100DE26E074280A9B661B421D6E269FE43FA9DE648A83AD351A8211B93A7F4906C67FD45503CD22F8AB4D934C7B0309E86B521E366E80CB" + }, + { + "tcId": 3801, + "kdfParameter": { + "kdfType": "oneStep", + "t": "095E81C7F2B9029AFDD3D0E421BE211C", + "z": "94317D9160190447FC9BE5D01FCA272BD64955EF4140A287194CE9F3726C91ECD5558A", + "l": 1024, + "algorithmId": "55DCEC961E3ADC13280CBD4A9799B8A0" + }, + "fixedInfoPartyU": { + "partyId": "9DCAC1595B4BB69737CBAEAFC4F01640" + }, + "fixedInfoPartyV": { + "partyId": "700988ECD0EF2A6FF5070536BFE133AB" + }, + "dkm": "3CFA52CD5E79924D581F8624BEF643FD3DE5A595EECD126D2F0C98ACF652004E07DDB216BE3EA868AA96E483717DD89ECD99FDD28D1BE799DB208423078FCE3C541606C72864EB1BD777BECFEF9C2C532BA183E56C023B456096B4284D0A85BAE2FFBE22E532EA9182C133E9BDE36A5F3FC12F0EA0E7B45ED7B25822547C24AD" + }, + { + "tcId": 3802, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC8A294F00B6A0B8A9B84E6E1D89D702", + "z": "E6748D85330B2FE547583E08AA557BD1CD269E47AE505B7432B7D029B45C8775BF9815", + "l": 1024, + "algorithmId": "C2CF6519FC7118AE830BE586FF01F757" + }, + "fixedInfoPartyU": { + "partyId": "626EF2684D441CB64C6023A63B5AA681" + }, + "fixedInfoPartyV": { + "partyId": "E6E6AD84C4FACE152E36B7EDC081B85B", + "ephemeralData": "C4FE665D6F32876655910C23EF9326F3D42A0BA9C0F3DE0AFAECF4091AAD27EB44A12D" + }, + "dkm": "02BA1F037E06F3322A134D8A7628C686AA8DDFE84BE8CFC361859A0AB9D0428F65631FD6CB4D4B697C08693EACC2A0CF30CD9312318CF939060ABC9E355FA50CA9BCD93239B55A0AEF0FA936F507EF80016D2F647959EDF2627656C07F6D96386C1D9479FB3A3FA50ED8D1067E6CD6E598390E8A2F03CBB6737893525F7EC9EC" + }, + { + "tcId": 3803, + "kdfParameter": { + "kdfType": "oneStep", + "t": "781639F324A30BBA83A781CB557B35A2", + "z": "68B54DAB0DE29006775F48DC394350AF2441E3D9A480DB4E4F04C349BFE07D9F3A6B5A", + "l": 1024, + "algorithmId": "264F90BCC22D64E50106331232E2F05D" + }, + "fixedInfoPartyU": { + "partyId": "41C9663AA85931C6913176C2A9B05551" + }, + "fixedInfoPartyV": { + "partyId": "2600A4F6E1B9B8681E575D3116276615" + }, + "dkm": "5C4E82FD63F8484ACAF73C2FF936CE8CEC7BA09BDEE37CC6ECE464B4B92007E1B4B3EC44650D69DF722A9E9F09E392B7A607D7AFD21C5BD906C97C88CFDAFEAAA387E5B74C5FB8469A44E0C35942AD2A98D16720530DEEC9A4EB4BFC055498EE979A5436974B7B9CAF75DBACEFB502B47A299C34535A138EAFA1E35AB0908A86" + }, + { + "tcId": 3804, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CA388707224D6EF5DFFC1EECA4129CC", + "z": "7A408B17C0D5BDB6970DD74FF3DDDCE352756AA7298E380F9DEBC1B1E691237B1733DA", + "l": 1024, + "algorithmId": "603407C654DD2F9F3148E18D876BD710" + }, + "fixedInfoPartyU": { + "partyId": "077DAD6125F023030990433A3DB8F093", + "ephemeralData": "E1C5CD3F0936E8E72BEFD44CA01838B2B69513F784862AEBF32FFA15A4C83FFCC0C035" + }, + "fixedInfoPartyV": { + "partyId": "4D2D6C9DD81D9C1340271428537D7FCB", + "ephemeralData": "79F1E8BA7B8E16B6AF8DD7109D8E429578B8A5651DB426C42DBC9C5028731F1DC355C6" + }, + "dkm": "14F487CAD03741FEF471C72E05AB419AD1AD4EC9D3F6DA08EC00524BEDE53B799BF1207F1184C9CAC85508B594032B1ADC112A30BDB68BA7E71DDC2E529DB795CD702C84B1D1099B91AFD24F49296CE21CB6C4934C8E12B558E62303718ADC62A85156B703FA4928272DFF289D399ADB3625D98201662DE1844DFCC066104C51" + }, + { + "tcId": 3805, + "kdfParameter": { + "kdfType": "oneStep", + "t": "06E5550923CEB21F2112D20454AD9B0E", + "z": "511D08D33412256C435C9BE79D1B14E9AA14A3D50094AD2D6AF805DABE407956018999", + "l": 1024, + "algorithmId": "8F72CEF8EA23EE283E35F41F627EAEBA" + }, + "fixedInfoPartyU": { + "partyId": "7FF9B18A74E5680C4ED2DDCE161CCC6F", + "ephemeralData": "293F922CBBB9E8B57F90CD420CDCFE860891438F2497C3F2B452FD1CBB1AEB7DF1FBAA" + }, + "fixedInfoPartyV": { + "partyId": "47E4C0D0495B1D8BD1F961B284D42B0D" + }, + "dkm": "57D193D7C39F65A6C1197B8F2FC9BE9700F92BEF349CC671AAF02C10320A2807EA64B5C5F757FF37858B2C5562F5B200B6F11F3B96A001C23EB6E6F35CF4EB352CA406E550A27DA2B53371557E9C5C9E2CC7D0C0B0F3E65B2B64EECC12E5232E0218B81612688C174B3A724CCA76DEF38DF0F56E0F993EF65E18D92EC2EBBE47" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 188, + "testType": "VAL", + "tests": [ + { + "tcId": 3806, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E57BB12CA4394FDFF8D9AE8FB8B5B2EA", + "z": "DD07594620A684C615AD4C2E542DE2EEA993A6718B82A53D6286074930ED11", + "l": 1024, + "algorithmId": "3F7BEF9A6154FB7C0AAB9396FF9F5D75" + }, + "fixedInfoPartyU": { + "partyId": "5268230C127850643732BEAD506F7FCA", + "ephemeralData": "A3089AD3DEF0F5B02FFC4337F1C1A59EE31B6561C469D864994D5DFFC24BA6" + }, + "fixedInfoPartyV": { + "partyId": "FED66D54D5EBD6326DDE440EA0D4541C" + }, + "dkm": "CE3073B9590BA36D6796DA7B601C6DF0DF1CC586DD98052B9FA28D4AA67B1E062619D2076C19CC09E91699D3AB1D0F11EB4E2C71D9A3F391B502974A9BC49CABA2CBE03B36AC2DEF94ADB707FC86FA2FC35121099C4683DDF7C582C67BBD9CDEC4674E87AE8D0FBFF164A56401E1DDDF27D288203C53F570B05EA49B64644228" + }, + { + "tcId": 3807, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E2873A49CD5FD1B54F557BC19CC9A04", + "z": "EF9C5088AC87C68B480741B9BE327D9726C6043E6241048900C0BFA03902BA", + "l": 1024, + "algorithmId": "7C727740D9D0DE6894382586C8DCBCE3" + }, + "fixedInfoPartyU": { + "partyId": "50B7F57B14429A44BCD13E3E1E31B6F5", + "ephemeralData": "96CCF3FE1F7A75AB59E7A8D2876C516838771337DAADBAB35D6EB4711E3DD7" + }, + "fixedInfoPartyV": { + "partyId": "3085F791846AD447407D7D13B157370F" + }, + "dkm": "DB4C7C54A512C337F88CC43C5D1FFBD5EAAAC422C6C129504FB359CCB6D22CB3E9BC8C0A7F4E2BA0870017678911C37970693D17FDAA62F809D0F50B09F5897D448EABCC85ED6C3BE0D2259CC20477040E8A1C09AE3088A4ABF4F8F2E1B760B2C81A8F59D2D8CF6670397C07A93EF46B3EC9B1C799A7D2DC4851A352B968F873" + }, + { + "tcId": 3808, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03F5AE477124810B0425560D6E64176E", + "z": "123E8B6DC2F1D39A13D880A962C5FB94F48CC45B1629247B1D5A48993B9A71", + "l": 1024, + "algorithmId": "846088964434059B5AAFAFEFCEF6F9F0" + }, + "fixedInfoPartyU": { + "partyId": "3FC93FE34AE8F9133BC64DFCD23110ED" + }, + "fixedInfoPartyV": { + "partyId": "E6F0B09857C5A08799824B4B82758F8D" + }, + "dkm": "AA266EA9AFF6D33EBF50C350948EB28030ABA3888A005E2D054F05B7D478FF1313659D9219AC80558F1F7E35CCDD35F78EF7212DD1651A0ED6E79DA28A464557DF0E607A048E68EBFB000762A5D652058AED7072DF1E5C606F1BA003E804E3736634E23320152FE5F96F8B09A9801CDE5846404E04CC8FBDDF7635C74E5FA8F4" + }, + { + "tcId": 3809, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C407E950A1CFD6452972CD960145750D", + "z": "BB365FEC1895C8A34F50FC3E7BECE14D9FA0FED8F2245066C312582F52D66D", + "l": 1024, + "algorithmId": "4CBF5C7F4E015BA54841A669A26BF53D" + }, + "fixedInfoPartyU": { + "partyId": "49133FA04DFD36C823AC4D0A673C54BB", + "ephemeralData": "30B392BCDEB7ABC257FDD6A20AD2FF1370ABE7E58F9F21060BF26981322ACE" + }, + "fixedInfoPartyV": { + "partyId": "E13E1CADE960316151766EACC455F86F", + "ephemeralData": "A5A9137570A98089A5C4E791ED206E6D744F14B2D56FD3D131A7086DA13A8C" + }, + "dkm": "F7D6313B56709E6382FAFA14B4531992B5432F0832765B52E6749F1254257CE5547A844CF9455E80DBEB59E7672FC6EEB22A06CC2118B384C102AA2CFF7D88213C2949F384F077F58ED0762DA96ED3B1ACCFFD2910B945095ED9BF88ACCCDF883725202C6C8B7CFA0ED81D7A696D2E3A5ABA21C78A3398950F6852D0DD45711F" + }, + { + "tcId": 3810, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D886856C2CDB84F1329221BF91028A48", + "z": "14DE9E9140994416BF8D56AEC80FAFF4146B10AA87A03A81DB4A07E772613C", + "l": 1024, + "algorithmId": "B3E8802085F1A055800A7A1632CCD637" + }, + "fixedInfoPartyU": { + "partyId": "22E89A1E5681AFFEAB010EBE48181ACF" + }, + "fixedInfoPartyV": { + "partyId": "5BE249096EA35BA1AF82D7BC5C7DE66F", + "ephemeralData": "65F53D5DB31C99964313B861B721BA775B7CA136D4FFCA63ADE65622F790B7" + }, + "dkm": "232642704ED21B3328EB95C22DA1DD3B46961A60670C3A8710E02B749C6903D166E9CD85116FC6F4A7A92E8037C21EE26429B568B518B475623DC885D9122767A9AF8BCF3EA4B6CF8599741B29183C3824323D97CE1153CF4B9F59E2C13373DAD6D22C3DE808EDDCE736EC72B81F117599F277B66C508D4C69F838C36C7FC583" + }, + { + "tcId": 3811, + "kdfParameter": { + "kdfType": "oneStep", + "t": "04B16B17B1C24DA077AC8E2A8AFF2486", + "z": "69BDA13ECDFF8FA0ADB39AB1E55E21D48C64A23B632650967607EAD9B04FEB", + "l": 1024, + "algorithmId": "13B5A4060FD52F4C806E648B6E773C2E" + }, + "fixedInfoPartyU": { + "partyId": "D5712B043A68AD7E28DBF4B723D17DE1" + }, + "fixedInfoPartyV": { + "partyId": "92F5383AEA4910A138690086B88FEEC1" + }, + "dkm": "E0E9F9D6B05EB9C5106604FC2AD79D3F333E7DA9A4DDA5F729ACFA371A0A285881D353C0FC03FF9F6C2C8E56C308ACCBD65091DCA8EAD6F871CE652CA3576960A2567F6AE55D893F2788CD18BBE1416C2352ADBC423A78847E1BCF1848F500B7AA81A585E82B192FCF86D0DDF3DED93DF597C669D48F3BFD6BA39684E187D294" + }, + { + "tcId": 3812, + "kdfParameter": { + "kdfType": "oneStep", + "t": "852B0AECEF563C6871A090C4D9C99BBA", + "z": "11BD65D98FE79A245053451E893499DF89EE13627BFFD654177DD8896BAC2B", + "l": 1024, + "algorithmId": "B74A2210577E751CFEADBB15F7583AB5" + }, + "fixedInfoPartyU": { + "partyId": "5D3E15C40275833DDFC1B6642CF94911", + "ephemeralData": "0E8B51D09A4C55D72825C21A1869ED18EF3EEDF0EE465CD73F0D80B85577B2" + }, + "fixedInfoPartyV": { + "partyId": "4FEED3700754B93C905868ED26158A5B" + }, + "dkm": "0E4F41CB6A8FB6361BFDAA604229F4DF143617BF34B4AAD7E138D0830A80D98A80ECE4BD243D73052AD04A443346AFDABEC592D1AD59347B3BE04CF071074AFBC39981954B2B3054DF4E2B7F4F80F2901E85AD682BED2A381F871BFE0EE109F38D52FE5AD67AC87FF976C28AC77FAB434A33F3672BD4B07BECAE72EED3E7ED35" + }, + { + "tcId": 3813, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1AB6E584C0AF23F25867C69C58BB302D", + "z": "0F6D8F47476B2F2469F822213E1AB5EF54A034B25755BE19ACE0C71F6EEED9", + "l": 1024, + "algorithmId": "3A9B2BD6F332AA37942D3F6B39C497EA" + }, + "fixedInfoPartyU": { + "partyId": "24B56F4699A1834D727BBDE81A17F352", + "ephemeralData": "B4235F809DF1A83A316C861DBE0445518964995CEF4984E1F895A66A0AC0CF" + }, + "fixedInfoPartyV": { + "partyId": "B4168C7363391E5EACA562CF78F5477A", + "ephemeralData": "AEBE094DFE6057A0EEB9ECA3147594618278F7B5C2D08E62CB07F66B004818" + }, + "dkm": "EA3BC7E006C8BA9D77BE8DA881E78BD66F31C6970C64179875D0B536EE2219187D90F39431EDF0A7CD343B31D92CF1A5ECDC32C0DEBB2B115881ECF54D4102B478A8CAF4A9BAF6084CAD71992A012F797B07EF51E69000AD11A98080854F94A9AE905AC244AF6C0E2C389D1D7DBC146D94FF0F86784EF6CC594C19993B458811" + }, + { + "tcId": 3814, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E1BCE63FB72A851A1BFE334AEC3CF830", + "z": "BC4D33B8E561E0A19BF8EDA4E90F6823724216C7B3B584844167B995CB2590", + "l": 1024, + "algorithmId": "0CB8D2331BEB677C97DA1FAA4AB78DAF" + }, + "fixedInfoPartyU": { + "partyId": "3C06195F77EB53C927928BE41F0AAB95" + }, + "fixedInfoPartyV": { + "partyId": "515B80364997CB097B1BBFF2656D9193", + "ephemeralData": "D292DEFABFDAA3EEEBA3F1B56392925F8862E609D9A92BB2B70D0E5CD44C83" + }, + "dkm": "A70C82437809FA32831D90435DC6FEDBF1C5CCB1DA90BB18D2B82AA9787DA9F7B04C06C59FCBF52323B1AD389F82B0085BF1B88BFE2191407F2367C7D61195EA43482733D3B7F10F95086578E8585686651005A8C1B655D267356958CE855E6EE186E8DE9B0CF6010A63C0A180286E39458F6C977F0535C36841B2B10C9E3636" + }, + { + "tcId": 3815, + "kdfParameter": { + "kdfType": "oneStep", + "t": "933471F5CC33DEF614BD8A24E9009E62", + "z": "CBEFB6D09220A62F83810FAD135CC3E3E4CF341A515CD31DF46700F9E4024E", + "l": 1024, + "algorithmId": "B864D04D357C5297C1BCE9AE893463B9" + }, + "fixedInfoPartyU": { + "partyId": "DFA338C815E3A9FAB86AEB4AE6E91E26", + "ephemeralData": "F6BB6B2C0318A458F799E84BFB2B90E36724D4DF53B57FCD84875D990950FA" + }, + "fixedInfoPartyV": { + "partyId": "26D81636CB196496C832E666D66B4002", + "ephemeralData": "41C0CDCFE665635EFD014E699F51BEC462578445F4B058603F94A70C37327B" + }, + "dkm": "22B1D4003A12911B593EAFE22A7DECBA9503674A1C3680C1E6879B40CEFCE8F68E537F16F5B60BFDA1BC7BE6D0DA79271805203C730F7C31802B7840A1353A8F8627D84FDEE7A055C31C025385893A197A6B17310E07AAE726FDC8E3F9431AB424F99BA1721871EDC2049BEB14FF42F1F26014D657F0135E1A6253300E39BD79" + }, + { + "tcId": 3816, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E735BA1D5F1A273BC9ABEFF6F54D932F", + "z": "8B18680F9BF64A7431056FE57CBAA0CC79027366A8F77940B353B10FE8D90E", + "l": 1024, + "algorithmId": "DA5018FD79B4FABBA9778336D6C0F663" + }, + "fixedInfoPartyU": { + "partyId": "564447FF7B0CDFDB294130246ACCC401" + }, + "fixedInfoPartyV": { + "partyId": "61D8A4B8BAC574A70978503D62BF4DAE" + }, + "dkm": "D5EA26DCE269C9E9DC0FEF707127FC2B3129590D1B0D016796F176DBEFC9A9FE2FBAB7BBC81298137A293C5E8D32DCEB4D3125046ADD01495B20084B4F473554A726BD3F54FBE96F5CF2124CE6EE540E4BF2652093E29721256C239FA0CA25B12FEC677555ADBA1A5F865131039D118D7F6C5A3FF2F3A6E987E8CED76D6B947C" + }, + { + "tcId": 3817, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9E1FA91A02B8D077CECDD85BC51E509B", + "z": "E7EC76D0A366E34E2CEADCAEF2D7EA856A3D9A91DDE225973CF98FC3E47382", + "l": 1024, + "algorithmId": "871AF6BFC47FA87D01EE2EA01B34B027" + }, + "fixedInfoPartyU": { + "partyId": "333CFB789F8614A2F856124C42E089D3", + "ephemeralData": "53B44A569A50DE93731DFBBA0709FB39216B5529E0964697C170B743173265" + }, + "fixedInfoPartyV": { + "partyId": "4CCF767B06AA1E181CA4D4436A6A32A7" + }, + "dkm": "0C64934CEBEAECFF6BD6376C6B52FB153585FD7E66CBFF3C1F0FA4CA86EB8DEE9CED57BD436BCCBDC827056F9D8026EB35D5BBE067DB540907A48A596770E83F1D8CD57A728E4091A656082A67AE46AD7BA61040F18C018888C10C63CBD50581DA1DE978754F0DE21526781AAD3718470263B0DD678E13CC70671D45A5FA069A" + }, + { + "tcId": 3818, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4023E7F771A40041DD20EE2FE80A26EC", + "z": "C0D5972BC332CA4E0EA4656A42113006A5B6DB46EFE394F44391B8E01A4330", + "l": 1024, + "algorithmId": "B00B1132BE5559AFB7473B2C040FEA3D" + }, + "fixedInfoPartyU": { + "partyId": "01DAFE4C5315E25BF82AF7EE8D1536C7", + "ephemeralData": "50C1514F88E619050EB628C60F2823BF5D17CE8616CB358CDAB8A5E6419D5B" + }, + "fixedInfoPartyV": { + "partyId": "8D72142BB9013A7E21DA93F9D03731EF" + }, + "dkm": "964894EBC2EBE2A5FC1FD5F6A27EFB6FF03A30546233494CCA5ADFB69B42701A4CAF47363BC7E79257DAA1FD07937F4639E9D736988AF2B04629B63BB5880E88855A7FD8D213C946615644E81941BB0F762B00D0F11E74B5C8766D07BE49338D18AB39D822DC9957B7D108427E76AAF6B8621AF59CED7F37BA5F9D78A231BBD0" + }, + { + "tcId": 3819, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28464535BB993A7CD24F3757F7024698", + "z": "4993BBBBE62D238155CB517979AFF1A2975650C0C0779E7770DBFFB57B0A99", + "l": 1024, + "algorithmId": "CFE5E4F33F38DBA77F4F54F662FF72B8" + }, + "fixedInfoPartyU": { + "partyId": "828E77E0598AD6BCCF2F69E8A50F9461", + "ephemeralData": "097472C6A3BDDFC138AEB0402C5E2D0ABBB4F5D291F9B5CDD6CDCB86CAF6A3" + }, + "fixedInfoPartyV": { + "partyId": "C7FD9D6F32D839C795C3C9C518C0AB95", + "ephemeralData": "23C97BD80764C86940F69C3426FCF0405B0F2A0EA608BDF475416218B24FCF" + }, + "dkm": "329954D4C223CA29E4B450DFE9A3087B38499752BF2E96EA904F9EE8F74F3753D4992C6F209FD755CDD1AAD64FEA49BF7C178D558FD78764C537661D6A607202679A6D11FCE49371C46AE5D47166CDAD1BB259987BDBF669B22DF6E0F89CDCC7102AF7C9DAEEF455C3E74FCE9CD99037F21173551ACC7939600FFF04D323E9FB" + }, + { + "tcId": 3820, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C72AB1CAC751A2C5E2D3948D6C2C4147", + "z": "F0613CB6001CCD3034C72BF2D1EFB732A221C4D3CA31CDBBF733B579791E99", + "l": 1024, + "algorithmId": "34CF2B1A14E070A7BB288D59C5FFA1C5" + }, + "fixedInfoPartyU": { + "partyId": "1E00C95C9E7149147F56B1FC7A1945F5", + "ephemeralData": "67D728BAA8BD706180A5A7AB8DD4406C7F403398AB48E9D29B37E0DB0F1F00" + }, + "fixedInfoPartyV": { + "partyId": "E1E7AB6813A87D0E1515511CB65CFECD", + "ephemeralData": "B61792FF2D7EBF2B1B6289D699DDE112A9E08F226BAE9E5AFB7372F41C32F2" + }, + "dkm": "0DB50405B96F518D261A4F20F6DD63AA7BCF514DF52F5DD49D3F8A9BA6BFD110A6A119119711226F1229DF1F2E230C0CAF0D5BE945E9F425C5D23225F29E48BDA4C2DC24337B5804A798422CC45A67DE5F5A7E4DB444EA9D0C0DA3E3C21D2E45C92D3625279C86706899C2F2924304E75B30C40EB3189D423338450181894C7D" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 189, + "testType": "VAL", + "tests": [ + { + "tcId": 3821, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7C052199704C76330B3E08D25A595662", + "z": "711B78582859D267426B40017ED7135833D4EFC65C274033A80B0125", + "l": 1024, + "algorithmId": "4295BA874CCB425C72958CE74E839630" + }, + "fixedInfoPartyU": { + "partyId": "E393FC2E220EEDAE85264F3D3AD92540", + "ephemeralData": "3214CF52EC08F59A15A01BB625BB50E3A85214C3B6586ECE9E1FB30B" + }, + "fixedInfoPartyV": { + "partyId": "3A798480B772D3FBC44CF4763F6A1348", + "ephemeralData": "A9E329F703EE3213AAB06D2659FE4B33AB1599CDF3E178FD529CCBDD" + }, + "dkm": "C0A213154EADA4FB681D98C87233F1A6CB6543452CAA9EF6B74755AD2C04C7FD610196A2122E3B505ACBD5956D69A202DF101BD9F5E56BBFE80F6126B9723F9444EF9B85083BAA1DCF8527105EBFB6D0E72DF7CAA43104BC342136A688CF3252B9B1E5B82BAAAB7AF65C5C210916A005B529D8FDD5266F6D3DA8413C5E9E26F3" + }, + { + "tcId": 3822, + "kdfParameter": { + "kdfType": "oneStep", + "t": "47B757F856B8D474627B4564AAC7E07B", + "z": "928FF97A111B6327BE5043CFD9AC46AC09E67D4C699FFCF7066BD234", + "l": 1024, + "algorithmId": "2875B5E70AFF7C427446CB66035CF557" + }, + "fixedInfoPartyU": { + "partyId": "E65E5D417F306F4914D5B8C5EB7CEF12", + "ephemeralData": "12608F9770F344FB015C570D6DFD8C59B6D01FF806B587DF282DB671" + }, + "fixedInfoPartyV": { + "partyId": "99CCE4C768336A614308B23505C97DD1" + }, + "dkm": "5F35323B3E4CA1A1D33364E403CD99BCB3EE6272BEAD917FCD4495EFC8B690DE38FBB283DA20D6A6D7252DAE2D48B9969B52695EF07C7558648E72E6B0E4EC03DC9663653E4086290C658CDB15C19F45353D28064DDA30CF00DDBBFE94E46D68374DB49B561491961573BA566DFBCAE0D4254788B7DCCE5FD59229F8C538A463" + }, + { + "tcId": 3823, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C4940F4BDF8B0E68C4560CC09E04B06D", + "z": "86D8F1559E172972B3D94419CBB27E5CA32EC9FDD20F246349BEF692", + "l": 1024, + "algorithmId": "E713B1BAC9F936A9CE01899441B5ABAA" + }, + "fixedInfoPartyU": { + "partyId": "F7A131A04884CAF3C43735A29A8222FE" + }, + "fixedInfoPartyV": { + "partyId": "4B72F320DE6852E03506C5BF5CE968B3", + "ephemeralData": "CFE3C1647B5C3E2AEF88A2BF2088401391C04FD8ED4627009346DAD4" + }, + "dkm": "40D868A5CF7B050A3F8356E39F466D5067900CE8B179395B016391925AD5B955B5046D1B30652BA9D8443796BE57D7F8DED0902FD7E18ED9356698E5AB18C84AB5A195C03DCC647D848E46DC8E4CF8542FABA37A50E4525E70A393CD317246E1B2A92517B121CBA197F28D396B00103558D5E8CD0922ADB62C56F8E640986FE4" + }, + { + "tcId": 3824, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BE0343B33775CC67C448BFB9D1B0213", + "z": "88D8F90D3F52586D5D72780AE1E9182B3C245E894D519D247BC56DE5", + "l": 1024, + "algorithmId": "8545A8B66E3ED7120A8D0DE59F7551CB" + }, + "fixedInfoPartyU": { + "partyId": "9C13CEB17660C9E24888A2F6DDCF5A96", + "ephemeralData": "1741FEA18F8945468E2FB7C8C42B6E861B8D2E83C2C3299573AE5007" + }, + "fixedInfoPartyV": { + "partyId": "74721B0C3000152AA805D8B5449FABFB", + "ephemeralData": "B6B29A8269AD65488ED8C7ABE796D11EC6C2200DE317E9B2345A5C2C" + }, + "dkm": "0438E75EE0E714441ACDEF95A1E0D9CEC9E79F372270A321E08ED97135B4D1DD99C90982E015AD59EAC705982E1C45E249B9D67A369F5B759303722BD50D42AA6652E93D14F86F02D143BA6D0CE528D19DF6E5925B834DA1C79284BCE9A2689E9C4021C23F5834089DB23F9C66F35CD3D8BF97F61D69D9C943CDD43B605B4033" + }, + { + "tcId": 3825, + "kdfParameter": { + "kdfType": "oneStep", + "t": "67DEC7F53EB0C8FA9FAB62A428166DE9", + "z": "EB01ADA5554A3E34C5EAB794BC25BBF45981C6512A1ACA3E22DFDABF", + "l": 1024, + "algorithmId": "22290D873021A7EFE82082B4FC4C50B7" + }, + "fixedInfoPartyU": { + "partyId": "DED6EC521FE3062EAC71BAC827F3E1D1" + }, + "fixedInfoPartyV": { + "partyId": "C8917C8990803219DC3EAAF4A23EAB51" + }, + "dkm": "2CA37AC6F95FE4EE954ACA7BACCDE94874964CE673454E51467FE1EE386C178FD967B1C8AD714064FC496487B49743C54F05368C13600DED120DD955C20DAFCC78FAE3325B412490E966C581172CE6D58774904CA50E81F86C216EEE0E331AF6FAE2F237C56916D9997A7C420D43AD378AF5B4D6F2E9089759CC0E0635E87067" + }, + { + "tcId": 3826, + "kdfParameter": { + "kdfType": "oneStep", + "t": "23BB3C4F324FE742B67F375C964B9DA4", + "z": "A4F0F951D19651C9DE21792AB23AE0BBF1A1AE5881A654FF14EF63F8", + "l": 1024, + "algorithmId": "4C181577F1C36B20A2963B8C32B0D008" + }, + "fixedInfoPartyU": { + "partyId": "AD3EC9F6504C042513F99FAFE45264EC" + }, + "fixedInfoPartyV": { + "partyId": "6406C31ECCA659DD1AD6079DAD62FB8E", + "ephemeralData": "5245D2C97C5D4FF78DFDC33AE91300E8D12C268C26E71B41BC5CF394" + }, + "dkm": "CA156453A61C45A394316A957DB219C0CB6DD911A0FC0EE3293E1311C7FA7CC0B40DB35A0389A5868E536E0370CCEB7FDAE4BE32F7912E36E57EEF18F326B3332487C21712E99E219AEF7602C491058F2EA19D1503178D0AA4728933608F860A0B169DF8D645A1308CC980C93C4F1629C47178B0188C9BA897ABD90632C155E8" + }, + { + "tcId": 3827, + "kdfParameter": { + "kdfType": "oneStep", + "t": "856B0458E4D581B10EC02F7C9379C31C", + "z": "3BF360FC7FDBDE46770DE15E0138721233FB99707189A82EE8C848F9", + "l": 1024, + "algorithmId": "D91C0FB66246EA04952829BCA56FBDAE" + }, + "fixedInfoPartyU": { + "partyId": "E322083974AA34466D68C17FFF3C4454" + }, + "fixedInfoPartyV": { + "partyId": "B4CDEB496D1A3EF4F77685D4493FFC8C" + }, + "dkm": "5DB57C49A03A109FAC90325511080D56776B76E020AB1A81803FE0E1FEB582ED2D305FCB8028735331CD3C8B037977E4E4B003FFABD584CBCE22CC444EBD2F241FCB6F42234708C3D94D9FF9D21E070A84298CAF4D5F20637CBE916C52943BBDF1DEC4FE6665B30BF8635E83C58FC9E4753E18CCBA611282D5C2B6440841E84E" + }, + { + "tcId": 3828, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DAE8376EFC710A96D363A690E2D0454F", + "z": "0D7C4E36A00462CFB15A41DE28E8ABA3C1FD8E08EB32F7111ED58BDB", + "l": 1024, + "algorithmId": "B0981D69259B3C4376A23B1813219A46" + }, + "fixedInfoPartyU": { + "partyId": "02D9E412579E7947DD49C1540C07A6C9", + "ephemeralData": "A264E00A61E16CF1866222247AC3E73486780A36DC2C1D4922EB2FA2" + }, + "fixedInfoPartyV": { + "partyId": "B61E2FDA887FEB911E94F70188EB9E02", + "ephemeralData": "A339E9A4523D84F01F97DA8AB969188A4D35B77C77C1EDDDDB911256" + }, + "dkm": "C18F55C01EDE82E2026B8F7CD3FB123D579732B0F5DF6DA7C7F8026697FF790A0D5D7F27983620F7F5CA1F769082D90068FFDE24DBC95C8AE8A31360A0F3CB88000414237C99EEEF21EBEDBFFC6C4CB3D03A6B6D9D83B7AC3F0294AD4F692A28D89C16BE0361862F06C5DB804F4CB39E7081D8CBDCDB5992B2BEB455BC566843" + }, + { + "tcId": 3829, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AEE4195D1D4AD686A7780CF998A31841", + "z": "EF9B00B67027A393C41EF227DD0A7FA17302498146DDF730E8B5F347", + "l": 1024, + "algorithmId": "1DC1CD220AC154CDB6DCEFB76D6243A4" + }, + "fixedInfoPartyU": { + "partyId": "EAE5B7D2A9733BC641841370B358BFA5" + }, + "fixedInfoPartyV": { + "partyId": "B0EFBA6F1995776FFDE797024E239CD8" + }, + "dkm": "F3E77767B3498313EA6941B95B5889E1A25FAAD8584E177C5051CD9D40F3B4B41B86123DED1C1717FE435BCE265B0605C0C3C7E9D35385E2B4EEEDED42D6BC8BC6DECD0D62C6474EEAB69E9E453DE0E73462AB7D60EBE361BB1E9F0AD9B7DC6C71DE533261E691872404D8B0255B051BD18591F410C68E4445BC2E832184E7D9" + }, + { + "tcId": 3830, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DBED5C432156FCB98360F731E94774D5", + "z": "FDF91D4BF283A8565F079400A0ABAE99FB20202DF9A17DF9B3D48820", + "l": 1024, + "algorithmId": "AE9E3A5D1319F76D4CC9CEF9B2A1ABEA" + }, + "fixedInfoPartyU": { + "partyId": "11BB4DD257B4EB66D5F23E0A1108A877", + "ephemeralData": "DF153AD6BB5AF10F178481A384DB67E10577848E54AE20B6500BE964" + }, + "fixedInfoPartyV": { + "partyId": "B97CBC5A87C1ACED34E61B72EC098CAF", + "ephemeralData": "C0F696A781C5938A7B01A4CE0A7C79508E73C7F936CB2FD3D88384CF" + }, + "dkm": "043AA920981128AD9BCC570620982B1C1A6AC8903C88330A8AF0EA60148A7834FF293F01E9CAE28D3BD80C61EC12F4511A901976D20AAD72C228D38B2BF970084C12720903C632A8021C7AA5179CB05975EE125263A848C828BADCE4B0AAE205A32B87918B3F52BA5E38876553C5873498F5A4F039C1A15BC5A1DA1597147153" + }, + { + "tcId": 3831, + "kdfParameter": { + "kdfType": "oneStep", + "t": "234AB3F4DF7AC5AE94C4A32EB35B8F4C", + "z": "D4757B23B3B0DE87710221060073D56A26FF461AC6639931511B4AF1", + "l": 1024, + "algorithmId": "F74D2DF7326FB6006234DDAEB25D5DCE" + }, + "fixedInfoPartyU": { + "partyId": "0FA86479959CA2D965BA4C6B4D6D5562", + "ephemeralData": "51AB77184CF85F2BB1B5942DB3911228B006855D3D07912947A74FF8" + }, + "fixedInfoPartyV": { + "partyId": "C60E0F66C439A05C799F00D1C83973E0", + "ephemeralData": "5A8D56187227DF3D4BEA5CB6E5B12F5A5799005DF2CF4CE10A90B1B4" + }, + "dkm": "70B69260C3E68D61569DED2D8EDC755FE86F55109D5D9EF59BF4DD8A3BED15F686071D09826C70BE4F675832169033CEED5D657FFEEE3B196D5ABE46FE7F4B4624E6391A38D0AFB02B7FC4116DC2BF4C8B429DBD48C6C7C86E1CD1B04AC32BA34E3870746CC9A522D955349818C4861D35644A6C4CC6207CC735F0142CF5CD7A" + }, + { + "tcId": 3832, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F7497BE400AC7538AEC4A190C8FBE044", + "z": "8282E48688861DF5D053A5BB46560CEA9CFCF8404895C3AC7E15CC64", + "l": 1024, + "algorithmId": "B10A5A308D98AF4F893547F7BA934B29" + }, + "fixedInfoPartyU": { + "partyId": "9887B34A80058B446429A066D3A5349A" + }, + "fixedInfoPartyV": { + "partyId": "41C7F78D45460279273E45661E2CC428", + "ephemeralData": "E39DECAC67EE336355205EE4EE964285D39F2F01F2E24A3528520CAD" + }, + "dkm": "6C2EE11F27B7B35F60165BFC3854A71BA7BC20C66C80152636F5564E2327CDF44E0FF32107CE55B1F94B9663EF717D7318597946511A2D4C668D0D3F97E26063B3A3747543F4F78EAE88C824F99347E7A736C536BA434F1BAEA35717AA829B7B133BA2D50390375B04147D404518A2FF65BD13719B78D8FC6C0AE3CF0074E812" + }, + { + "tcId": 3833, + "kdfParameter": { + "kdfType": "oneStep", + "t": "ADF6CBB276773555D5BD96FD770B8605", + "z": "9F4ADDD47B4D7A15DA3A232E6CA07D5CACE2D0748A4AC3F3938F112C", + "l": 1024, + "algorithmId": "3AD82B74D9B1929AAC7F34D5A0B29211" + }, + "fixedInfoPartyU": { + "partyId": "2C03813C4146459C62AC039CCFFA08BD" + }, + "fixedInfoPartyV": { + "partyId": "7916BE14C3B2971B918F480B95D87811" + }, + "dkm": "D358A82D31651C9D6D165DDE104227BFFAF3BA4BCA61428E081F237774E1FB84EAEE75B94B52F9474F2340CB678493BC1565C014C40FB194E3C0E318AF2898B4B208BB27735358DD434A882FFAE5CCA49253008F4E096D45AD7520D7843967D57BA8AFCB7D2FFAA9EA4D30CF406DE1FCC89B3A1335A6539A49F98BC5E9C25FB3" + }, + { + "tcId": 3834, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3FD06001812E8264E9479EDCF524D64", + "z": "37BD4937AB09153FDF7B051EF469B01DF0116FE918F23B89C7AAD15A", + "l": 1024, + "algorithmId": "6644CC18EBBCFD0EBE7E3320E398CC25" + }, + "fixedInfoPartyU": { + "partyId": "7EE5395B28DC7C224690D9FF08BD6520", + "ephemeralData": "28A1D2221F44F109B183F8BA7D408FFFC745A31E8AFBFA1E7F7531A3" + }, + "fixedInfoPartyV": { + "partyId": "35E17DC16B02B8471794438B2F068452", + "ephemeralData": "F6023628FBBB3B159D9938D3594B5C56EDB15ECC6241A0AB9CED237F" + }, + "dkm": "83ED1255FFD55E3F42E3F73804740FE315E7B4D18B9BE4271A005ED5B79E28BD071226E80D51DCAB4CD592E7BBC1206B2620892821B0A752127B177E951678430FCA9CC151400A6E0FECEC778714E4B7748C988B421CA01704F57984DC27365097C4C00A4D3D62A16E4453E3FACD4B81A01A8FE9344AED99E610741B856345F0" + }, + { + "tcId": 3835, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DC72410D3971C49245B2B738D5B8B5B3", + "z": "47197E4FC0401C2F05C796A3B6C6A15B1645023F406C0CE163A53A35", + "l": 1024, + "algorithmId": "F77300E8EC7CFA588B03550BABC40178" + }, + "fixedInfoPartyU": { + "partyId": "35967849A7160F5BADB7A087167DCAE3" + }, + "fixedInfoPartyV": { + "partyId": "F36214E4FA18AC6C797795BBFDF1E99B" + }, + "dkm": "4CB3CA48B831C50A4891A74C63EF62AFAABDB62F64C01C6AC61EB43A14992B5D57605A46C5D557BFD75E3B045CAD9BA158C8E069B6BC6A5DB1196C94A5EAE585FD599639A5D820277DA5AE2E5426349FA9E7C39E1EADD6538F4A8A115B3B5A09C6751A407C0487BF8FA5137AE7743DB47DE814519699EF441E706353A1E2710C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 190, + "testType": "VAL", + "tests": [ + { + "tcId": 3836, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A07471AD24B8F3B61C53E798213AA82E", + "z": "4F32EB28946CEB9760F021E1FA3B11BAF090EA047BFE3C8C011B69D3CB", + "l": 1024, + "algorithmId": "841702864ABC450ADF450726A145E754" + }, + "fixedInfoPartyU": { + "partyId": "FD93A63C6CA182FC99B37E1CD0993120", + "ephemeralData": "84805EFEA25E3BD4BF50D35AAF09A1D986FDE733408450CC297CE2FC2C" + }, + "fixedInfoPartyV": { + "partyId": "CB4BDB4C4964F7D250EEFBD16E58F024", + "ephemeralData": "076F62DCB8B3DDB48F8F421C00D06E2BD983C15803ADC04C8C62FFA875" + }, + "dkm": "83ED8FB268B453918E8A19943264323449ADECA0CC963130E15AA69723FC09C71855F7FC655F34C42AC5758FFC57E83447A38B8A9D0166BD13E56C23FA5727C3FC87D2117B4A5BAB61FD2A91BA6B614957DE081E2E0A906126EB44718A852937D618CDD60B25EDF059B5D54C9C1F4E4423757DEB145B66E5E474732FDD82EA67" + }, + { + "tcId": 3837, + "kdfParameter": { + "kdfType": "oneStep", + "t": "995F550EE79C18768DBC8F6BE1DCA3AC", + "z": "1FBB7ED2B34B52043B974E61304C74734A82D49848861CB2401C75C2BA", + "l": 1024, + "algorithmId": "6AD5FB4170F0B5B9054BBBD3F55F6FDA" + }, + "fixedInfoPartyU": { + "partyId": "BAD2995686FA29B9867EB5565564F663" + }, + "fixedInfoPartyV": { + "partyId": "61336D682970B65EC806ACB650A40342" + }, + "dkm": "27F6DB69346D6CC7C6D865D1D61DB9D64EAEBDCEA7E1484F4EFDE760BC1EF614E02D2F71B12D69327C44D4F6E08BFCE92126DB85D7FC284C940675166F7A6D445B8F8A35191136BA9FDA3A086A799C61BCA51A00B2F1C173F3E76E15C54A5CA1001A64ADF203405D680360F9A7CBE8EDFA9BA9B3ED966298C44ECB405AA417B0" + }, + { + "tcId": 3838, + "kdfParameter": { + "kdfType": "oneStep", + "t": "582684B34C84E5FC03A040C70A4D6E0E", + "z": "68456D77DE7A9E8E65C4D27CD53E7FE2562FDDA75057E4C74CE665000E", + "l": 1024, + "algorithmId": "6B74AA66B98A952D5819EC2B6A7B7FBB" + }, + "fixedInfoPartyU": { + "partyId": "6220B9F589461F8E4466AA316FA8A4CC", + "ephemeralData": "3B8B5D47F9193724C0350283EF9E5AD408EB6180F361B2377745651AAD" + }, + "fixedInfoPartyV": { + "partyId": "042A3D0DF56C5522E053CA6D177ED46F", + "ephemeralData": "3F962ECCBE060A9BD3E3AB842627DA304C4CE288B12D1D3506EBEC4A85" + }, + "dkm": "59984A8646655886D0F3CB7A2AC504F7AFCA30C33EC530A16EA654033583CB36FB5ECC782526D57088ECE9A652337A25C38670AC9F9FA59566BAA61E6F3181ADA53F0EE711D60341A74C04C3393B4C8FF524A70D887B2B8C670A64B79AA21EBAAFC4DB0DF050DC2B4715A47A40060BA8131A74B3744B5DD6166A7292D6C3026E" + }, + { + "tcId": 3839, + "kdfParameter": { + "kdfType": "oneStep", + "t": "573715B2661B5167F046AAD6FF8DA0E0", + "z": "C3B763CB15B10509278F1A92A83EA1127EE2780D9B224952F94B53D5FF", + "l": 1024, + "algorithmId": "F75B1DE4FA5206D82ED6DF09CABB5B5C" + }, + "fixedInfoPartyU": { + "partyId": "32C8636A568EFE0FCA0EFAFBCFC37C70", + "ephemeralData": "388C94997393178313B4912B5E91EF2E36A2D0F52FA8FA1FBDDDAF5471" + }, + "fixedInfoPartyV": { + "partyId": "3E05CB27C95CB2E5080E59B17E3CA6BC" + }, + "dkm": "E8742F2C215B5D3F2B7D93A9051B6B3110951DB289319BAD371920D8B92B9A8EE4EA601416317F3E3F68A0DAA3A2E876039B25B1137538372CA634ADC3FF3B0C18BA614F1AADFAADB355F0FA79E56C490ED5D3790D2B1C1DA966F89DBC1CF0AC51AED92B52BF05409D660876900E9839205EEDE0C9593151CE87FB093904FE02" + }, + { + "tcId": 3840, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BB124E31EEAE3EE92F3D9E935EC362B2", + "z": "EEB7DA943B6FEC2EDBAD1106FB9C244DCD146FBBA4CAC2CC1129848708", + "l": 1024, + "algorithmId": "ACB11473302BF2842A559DF6C3C4790E" + }, + "fixedInfoPartyU": { + "partyId": "2FD7BAF8A0E69B8890EC2770E036F966" + }, + "fixedInfoPartyV": { + "partyId": "0AF27CEE149ADAE0643D2BF211199B62" + }, + "dkm": "49AB5DE719FA714D659E4708F5AEB25EAABF3C58555BE185EFAC1E0F900578E389859F47A52CE03389DB7280042D53C0035EF0D092E09566D9F6742E6CCE88354D788FF87F310557E79212CBC12E68C4851CF62E6F1EE20D0786F2A359F1B3B09634964E344DB16F24E3198AA44850063E8E343FC7E87809638A087BBA6D8FAC" + }, + { + "tcId": 3841, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DACBBBA706E7522D1E46EDE01EAF4ADA", + "z": "1475D7CBE3ED83670C928E1C5BEB7F33053B48ACBD94B015353F1AA9F3", + "l": 1024, + "algorithmId": "3F1089E4E1EBF383F52DFBC805EA29DB" + }, + "fixedInfoPartyU": { + "partyId": "A533611B99C509D16E3AED1027C74D27" + }, + "fixedInfoPartyV": { + "partyId": "3A3D695C2D268CCE382C8BABFBD3FA18" + }, + "dkm": "0355F145915251EA5B8BBEFAA6F3CE0605B4169C71F018C46FF9B4E4CE5BEFACD370350B8E605C4DD0C25B95A46441075225B4FFAA62B8E939963BAB095A379CFD5D23CF58BE73E28238B021E24173B65C1DADFE9CA4DC242CFB01A9B5A68E22F3CEC876F8AB143A133520C91AA261A074E113E4C818714EBDEB3ACBEE43D528" + }, + { + "tcId": 3842, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CEAB4C3A131C845928DC3AE6787080DA", + "z": "7C48D98A89CD8B73AC2E1CD8874B76F4D5AF18F46CB2069CA26AD94804", + "l": 1024, + "algorithmId": "88013E19356A97E2386299CD33B36508" + }, + "fixedInfoPartyU": { + "partyId": "22F20BBE7A3DE59764D0319BEB95FD4F" + }, + "fixedInfoPartyV": { + "partyId": "BDC218E10BBC90227C2F628CD10D6453", + "ephemeralData": "5814A1786E669BC3AB3B75375CAA9868EDB4DFF2F0E6A5C33AC382F61D" + }, + "dkm": "B1297C10495905F80B5A1F98E48A0E905CC55EA117B2E0E19D4A4B6952551E9C827F03C36CEF51EE7C84EFE016F0F1F8744DD6C641C593DA5F6140E8F2ED535FCEFDDF52AB984690A847A1DE8AB7F8061CD43D90862DE4BA25E31F1359EDB90CCA26B0094306187EFA2E661673E91B4BDD34AAE4FD3EEDC734C32005489B8613" + }, + { + "tcId": 3843, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0B9EAF64997D9F9822AF186B2ED94F7A", + "z": "1B009BD7669EA62C19AD89EC6BCF0631F8681501C1E4054DA67A321832", + "l": 1024, + "algorithmId": "008955B83151E5DD1461989F33F916B6" + }, + "fixedInfoPartyU": { + "partyId": "02696CF4492D5A0E22A0FF45462EAFC8" + }, + "fixedInfoPartyV": { + "partyId": "05B1CF13937205F1F125782DAD986729", + "ephemeralData": "8F2DFA535509379A6D6733AD1F9C3CC024635B925CAC6632B221E751F9" + }, + "dkm": "7674B6C80F00D23C71271E66D129287AE708CBEC425BFEF3731EFBDCE17DB8CB546C6CA09AC1DDE3FE852D0BC202EC0B39710A198CC49B45F8236217C268BED395BF9EC1184F35A4D12AF750A05714CE5D2436A7DEAC4EE086A4CE5C2A3159BED13058703B2D49E08D87E8F6B0A51628AFC7EEA6CF36F97120502D5C5BC54CFF" + }, + { + "tcId": 3844, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93DF9234C7E521943F2C0E92C89378F1", + "z": "F560A6DD460DC199C742AEB7DFA932E9426087A93AA4906CF66C43167C", + "l": 1024, + "algorithmId": "646EA51DE58ACE4ECB91DA813B1C731B" + }, + "fixedInfoPartyU": { + "partyId": "86E98EEEE8846D02610769F6EEBB96CA" + }, + "fixedInfoPartyV": { + "partyId": "2FC519253654E2CB9DE37CE83BEEABFC" + }, + "dkm": "774EBD2A53E54D641DD0D490DD1767CD319B2036624BAAB9EA79814FE7935C666E6E5AFC78D2B0AA24B53AE8805D103B1FB42F8C7C9BEDB721382E3F03456DE00CD824C2F6B29E8C1A126BA69F2A29F1D8934CC44FE380C69E3BB4FE2F5E69B86C6415DBEB2A92129F8E22F1D9FAAEDF4D0777E2ABAE7DB3840FFFBC8E4A7D6B" + }, + { + "tcId": 3845, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C3977A799AABF73CB5A5FE94F8B76B76", + "z": "366484F7F9804D18507C2CD3116F582E2CC9C5E64805375459FE92740F", + "l": 1024, + "algorithmId": "741FBAC04C11F75E97DEE25BC1AD9F7F" + }, + "fixedInfoPartyU": { + "partyId": "39ADB0B134211A20284B3C4E60E41D43", + "ephemeralData": "480AB8F1470DF1DE69E1C804CFD2D061051127F7721A4EA6883C9E0D88" + }, + "fixedInfoPartyV": { + "partyId": "2345DB469577BBFAC5776F1D479F679E" + }, + "dkm": "0E21C710DE59F25D2C70F3FD887924901CA6DA4CED6A6D0AECF8DB6D69A337F6CD2CC30434E68CD9B78977E8F292812439331C70E8679227835653F41D6920AAB8F6C94843C4C0842D006A747164306030EDBA62A015D16FB93BDE29BDE1A49F59E44225E5CD37B2DE977D463EC8CC549103737072D9FC09D59EAF0E9DDA90BB" + }, + { + "tcId": 3846, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3740D16D9E7F2BD8AADAD69356A84859", + "z": "4311D9AD06DB33EA477FA03B3F47FDDBE7EFE65B4073D13AAFE6E19221", + "l": 1024, + "algorithmId": "F038797224F11B263C9CC23CB258E0B2" + }, + "fixedInfoPartyU": { + "partyId": "EF371534771F405197E003BADB54CFFD" + }, + "fixedInfoPartyV": { + "partyId": "BF6002DF055E37EFC130315F382DFCC3" + }, + "dkm": "7EBDD9ABB987A20F4017CACD05E7D79CCA922A7B4676333B5953EFFC6AF0147F7C10EC6FDE5C72EBED288CB86E2DD881AD329A0FDA08E8F0D15CDBD05ACFAF94A19B1D0243D4328CA686370FD656A1DFF318ED522C8D77C5FBC8F168C20EA6EE9C4410C20D0D7DAE17649F5A6DA083A95AAFC5A50D06E6F8CD33B319EC290E51" + }, + { + "tcId": 3847, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A10F1431B37CC178168B47EE9D406EC", + "z": "D6787E2E4B45BFAD465C4B86FD83B12E7667CDB77A3E9FB516AF8BF54A", + "l": 1024, + "algorithmId": "33BB7C956DF81E83297B0E4496B0B3F9" + }, + "fixedInfoPartyU": { + "partyId": "E6C66F9667361C0CF09F23AE0E92E55F", + "ephemeralData": "F5146AF193110BC7583AD11B672736E86446369C03B4A5BD1DB41BE90B" + }, + "fixedInfoPartyV": { + "partyId": "6986AA5AEC2841225D9523495EF83EAF" + }, + "dkm": "565ADA4EB593B25466FD5839D0D17BDA8D45048250C56AF12F833B5391B72D388184E7A1C1D49A6C81356E3B05EDB7A9AB483170CB76C1AC35A99E66D00A32C7CB5815F3AAECA29C6E6507BC00836D57A3E3E341A928D6DC4BA79199A361530793688D7D149351889A47D92C5C0F5044889E3B8E7B64111FE598CED8E9D67D85" + }, + { + "tcId": 3848, + "kdfParameter": { + "kdfType": "oneStep", + "t": "96497FF4812683C19C7A15E88BF1B064", + "z": "1241CFBC585A0A733D5D6394A3D57A71BA9BB7E0BB36828FDA0BFFDFED", + "l": 1024, + "algorithmId": "198AF095501A3D3166DC621932A6776E" + }, + "fixedInfoPartyU": { + "partyId": "CDFC5F4813F9F73DCC50D584F3B1725B", + "ephemeralData": "4958C0E8CF4B1A1B659679D06E07FA184FCA533F71ED2D3B5A8AE7D1FC" + }, + "fixedInfoPartyV": { + "partyId": "FC961206843700B1AE9F0DDC8CF5DBDC" + }, + "dkm": "AAC5C8CE6D3DAAAD7961AC668E5CA47104AE79C803622B9488C9732934C00912A2CF5AC7D1EEF0FC9BDC0EA095328F943DE23E99399ECB7DDCA829712B338DE06BA4D012BD52178CAE7FE89378E2521FA7368035D94E5D495750F22AFCE4BFF12D145D64D9AC511380F26AD9EAB8F2EC6DE1B06B26CA1EA79AFDB449CA751363" + }, + { + "tcId": 3849, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F9DE19ABBE8B0C5239CFF646F62CCEA3", + "z": "19E7B95FA7CC152DD640A731D47DEFAB4E434F12E1AB010ECC4039314A", + "l": 1024, + "algorithmId": "A904816D1B2FE2BC2D92A5F30B9876C3" + }, + "fixedInfoPartyU": { + "partyId": "A6341480CD94DCC4483CD13604A382D3" + }, + "fixedInfoPartyV": { + "partyId": "19556D996C1C1C229D7179EA0E1CA6EB", + "ephemeralData": "DB1FB513663108E90BCA12731B25E019557312551035B3D9173FAC900E" + }, + "dkm": "4961DA903C91458AB9E70DD6277386E7259E4458231CC8357FF2A63BD7604B1656F5ABB68FC9EB4D19BBEE4868E3FAA761BC1F83116A8391FF533774504D1F0FB902CF0BF9DE13D18F2328E2288CC31C798357F2D66A0E98F4247DDEF4D1590965F97412D424405AF0BCD5A29F1EADAEB6449083728B2079598EE7A6B7BB30E6" + }, + { + "tcId": 3850, + "kdfParameter": { + "kdfType": "oneStep", + "t": "566E36CFE642EE9FA46395EBF9DAC415", + "z": "4C3F9CF66010B9711EC1C4B94E1CB69B0509666CB583081847F058E3FA", + "l": 1024, + "algorithmId": "31BB7A74370C38DFA3321CBC0E8E0230" + }, + "fixedInfoPartyU": { + "partyId": "D6E72D2DA82989EAA5BEF9B6C9A8D34B", + "ephemeralData": "1030D3D0B3A053380F163080D34E7CBE31390EFE62B4DD732BE98F53B5" + }, + "fixedInfoPartyV": { + "partyId": "AFFA5415CB601FEF3D1C3315C4BF13C6", + "ephemeralData": "4ACF60E310608B1C754FEA9BA4AD9F5B36EFFF7D7ABFB6AC5A5AACCAB8" + }, + "dkm": "4C613E3B9220EEC810CF42646AB6A8DECD0DA822E6B1B85DCF7BCAEAB6607F43415B9ABF72E7F9324662583C8E93AEFF7B56E7C3FDD495A4E849DEEDEFD593C5C3CBC6C85BD59CAE34979E19C9A055D48FD6763EC46C687D994030B5D4E0B4B32FC7D71E1082E52C3A609399F9175CBAD8CCCDB733126E6544DFA55B6CFE1420" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-384" + } + }, + { + "tgId": 191, + "testType": "VAL", + "tests": [ + { + "tcId": 3851, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BC7522F30A76340F24E477A7F6800C1C", + "z": "0F688F6033A8EACC3DD8271D19D8703B97854872773B0921667C4C1AC8E9154229A8EEAAE1", + "l": 1024, + "algorithmId": "C7B6FE12711DA9CADED6B40C3642FE50" + }, + "fixedInfoPartyU": { + "partyId": "D980923B2BEDBE682B8D2D97F7D99D0D", + "ephemeralData": "2EE83B43CE693A01AD3A5FB1ADE30DFF8E6FD46A2BA0910548A42FFBAB3D1B0C8E1539A625" + }, + "fixedInfoPartyV": { + "partyId": "AC28108A5BB81F865D31ECBABE917EF9", + "ephemeralData": "4F15E164BD11F122DEA7922686DB13D3B143EB3172A9CA05D5C6C1AA90E1ACDD6856992661" + }, + "dkm": "7826474C7C86BB9011FEEE164D09D4360B2899F290E98CC474F597B9C2CD1DAFF1367CC9A2F4B334C84107A6A0B8C280B4A52BE3D731786D50057A09B01BB2B38700970A2EE2F06DA98C7823769C5667FF7575062EEF0FCE8A1C510E24652B5FB3060B3755E2CDE10781988CFC1C01F202DE9C6B1370785847E542C2E2B16173" + }, + { + "tcId": 3852, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B219A161A34FF7D17D763F15AA0ED53", + "z": "CBE5EA9ADAD63DC471C0E5C65EC2ED037DE35F170E07DF9C3BFE66FF125B2D91E151925D01", + "l": 1024, + "algorithmId": "ED115E43ECC6FC7154DEA6BF63DE3625" + }, + "fixedInfoPartyU": { + "partyId": "3BFE0B2D1FE1DCD9FDF14744BFC10BC0" + }, + "fixedInfoPartyV": { + "partyId": "F9B2A0238FC14EEA6DAC1BF2D070FEAD", + "ephemeralData": "9DF3BDF2262E3CB56D30F85A5215F0CDFB75EBEC9C9B3EB843A004EA85C4FBBB38239D0B4E" + }, + "dkm": "CDFAC74EE54018D306B5E8FCDF122EB180A13DB3220DA05CC11BE070D307DB2E02831538FB33F7A2D59BEC2FE2E62D95E30CE039C61CCB59EC69F918F9AE02FCD3ED0CA712E7EF772A10A690BE9E206C9A2063DA9E5B2404B20639F1F5DE51772CBF638A533405A238E296BCAB7E02E51D7633FB00A2D06DE44D89F8371514AA" + }, + { + "tcId": 3853, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DE7B5806B2820166AFDDD6BE428A8948", + "z": "B2B75E9F292FBCD81676E510CE71A1203ACC5BEF5361BC203899E592D21348EE59ABFC738D", + "l": 1024, + "algorithmId": "CCC0AE2AEB7EA587C28B98784BBFAB48" + }, + "fixedInfoPartyU": { + "partyId": "FC165F2045467644F12B7076405A7314" + }, + "fixedInfoPartyV": { + "partyId": "05C2986FB6D6F9FDD10948DD8AD16CA4" + }, + "dkm": "7A688B7F53B6CE24739EAD5F39957FB6336F8CA7E54155D71E77AD61D2D6F228E1A794FA358A7E7681306B5D73D610AD45DF1FE48E97CCBD64C42388A7817DFDE4B00679C2B7F89785DB0E99FDBCAC83985F8FB6C8EE9C65865A0419B33999540DB6883F4BBAA3BEF48C35703295253E6F9298B60AD290B3C77DDF8B1548B175" + }, + { + "tcId": 3854, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0FFCF3508ACF968D093254A7F686D38A", + "z": "569A2B88D3DBDBF73E5ADB24B4EA07FB87DA5B37435D7CFF317937913CEC702F1703907815", + "l": 1024, + "algorithmId": "EFE2E7124098CFCF2C810DF0682DE63F" + }, + "fixedInfoPartyU": { + "partyId": "97194671198DD7B81C15B999635AD8DF", + "ephemeralData": "2A1200B243C1B0CC404D4CFBCDF141EE77015E6306E1D3A8A55CB645AE1653F24EA5701988" + }, + "fixedInfoPartyV": { + "partyId": "BBE26B38B92F13C05F74EB4C07E590B0" + }, + "dkm": "82C0095387AD1B8270F960C01B4D7CF0BE2016449EB4597871DDD6678581D8E433D42757BE1C19D8D089C467F7D35BF5814D6FD846DB0330B2FA9A1394776A653041D5C8E367D873D981B6B15FC80FA3211FAD7FAA6E950457982FE016305C6F5D4FB45DC88E1EF1811397560768D9BA912B3DCEA53689E2D9541FDA4A5C544E" + }, + { + "tcId": 3855, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1D6882C4762E793E16994C6624F1D4EA", + "z": "06D5FB4242CE0FC1556D9FE34E756CD6651DFB6D06C42B99479D7791EC205BECA9C4ADB4FD", + "l": 1024, + "algorithmId": "A08EB48AF860AA50D33884E7DEF9E8C1" + }, + "fixedInfoPartyU": { + "partyId": "875670694EA5CFFBD5D438D079FEF7C9" + }, + "fixedInfoPartyV": { + "partyId": "569D045BA8822ACAEE4CC575384826B8" + }, + "dkm": "25F50A70CC4E49463B52D5C8C6CEEB98EF6C5C489780DD0CF566D1FC8B02A574C504B95522E4F79A11582AD0489B1A2B51252E56A9F1D642052471389FF0784AD94EC29600909D9FE4BB432886979800D952C575A15F0CC35E1DFAF4CD9FB7A66648957678B9536E731BF319539468022972002AB35F7293EE638FCB76EFB63A" + }, + { + "tcId": 3856, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8140955CF62836ED32DD4CB1E53F7D19", + "z": "857F1FB85268A38E47BC56E1EB81445D91EFE528DC24A7212EF268030D7FED1E2BAFBD39E7", + "l": 1024, + "algorithmId": "BE2A42B9063A93FDFF856FF34414C8CE" + }, + "fixedInfoPartyU": { + "partyId": "B0341A038FCC04EAE3AED7C090FB927B", + "ephemeralData": "8A95C801B76E74432D8ADD009E9685D15EE995619F2702759F00607E3730C749C43CF589EF" + }, + "fixedInfoPartyV": { + "partyId": "9FB86467C98E4BE34D59885F3449B648" + }, + "dkm": "C905A6E65488A6224E99DB73AD6376E2465B765977F6AEC3A4263EE6BE5DAD5E6C17F1260D0A5ED41BB0175BCEFBC65B170F01E8B88709DEB85F94DD3661D5D5DB6631B459EFCE5ED05B2950654F14941CDD3A9032148FA5B4E3CA4A3038E5298B938C9910BA4E7A39421A5945843A45FF9163F42F6A7CC138181747C203779B" + }, + { + "tcId": 3857, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FD819D2DA8F2187AB54F6A12D5695A5E", + "z": "EBC8C616C960588903D1EFA031C062D4F49F7A8C271658BD7F9A8445B1B61DBCE70B274168", + "l": 1024, + "algorithmId": "3CE312092F134AFE8532F6E96956802A" + }, + "fixedInfoPartyU": { + "partyId": "22A180DCBFBC35B4E5CD23B23DA154D8", + "ephemeralData": "EA330DE83EB7082711336A7DDB94B04162D9374F2B90F769D024EC28B34CCD47D966DE9308" + }, + "fixedInfoPartyV": { + "partyId": "6931B02FC5CCE3C1E0FBFFF0D40DFF85", + "ephemeralData": "504669F54DD776E26E9E991AB4B54272052A50A6A6C35CE8E5351F8C3A99DC5C8B49E2C67E" + }, + "dkm": "846512B1BDE782A355A9E7BB4A62A405ED949C0CB8675F0F954F7687B04CFDC32F9535FB3A9AD9FADE89CA13D3285A38AF5942986425163653605A1B7666CE31FCE1BEFF8E9E7868334E46153424EEAEC4434B5A6999E8951B3D3261F35232D09E49E5EF4F30B8A4F277897BFCE25E898613635C2C84A839F367CD1DE5340873" + }, + { + "tcId": 3858, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0C9B13525F56C8B28FD55227B13014C5", + "z": "3D8ECFAE2A6B5FD97D15B20562C9AA2FDA53EDC343808CCB02588FE2AB3EC5B12AB25B2D4A", + "l": 1024, + "algorithmId": "D76399BC19BAC67EB139D3DE6595381B" + }, + "fixedInfoPartyU": { + "partyId": "258E1CD53CE78D7DC24505F14F14ACB0" + }, + "fixedInfoPartyV": { + "partyId": "FDFB532D2482D1C1AFFE255092821B31", + "ephemeralData": "4C7689923EEB394F9EC2342F9F158760AB0BB47CE246D1BDA7D8CB78E5066529E804D91792" + }, + "dkm": "01F5F1C3F05837ADA5C513B1B449A00A6172E2E9B51B72476BD4FAA8DB66EB81BB6223F4B8EC2A4293BF34E4F01E9469CA6B2ACBA55035CE950C23DCF802531A3ECECCCE70B6CC6CCE143865F2484CD4086DB27F93D01D93386679DA76B41BAFEAF543ACDF9A09444AE1319534C88F899CF3800CEB1CC4A88E43C9B25EF959EA" + }, + { + "tcId": 3859, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C898F7F24A498FE8B776FE75E60B0747", + "z": "9EEE2257E4FCFE4845FFE40DA268E4548EDACE251C7E82C13C167CAF83775B75FEE707AD63", + "l": 1024, + "algorithmId": "1FC8A59C861F7DF4F1928F8FCDC41867" + }, + "fixedInfoPartyU": { + "partyId": "29CD2ECA0D267A6081C66394ACD221E1", + "ephemeralData": "26121D26D3311A7BF2BE9242E71EF0FA2EFB033BE0939FE5317FB03A315C90F0459EC80F39" + }, + "fixedInfoPartyV": { + "partyId": "CAF2E97987952E011628624F42309B00", + "ephemeralData": "F3DD97A56727917836FC13E608C897DEB8D39FE06D8CC70AAC7F20B66AD15E03B6A91F3F8F" + }, + "dkm": "E79B3F9C53ECF390B79C95B661AE895CDEBC0592BACDC1C352F253E78676E957B704BE2ECFF8E3B24638887802A5B04ABF3506208AB8D00A88EB156970332FDBF8DC95F190C2D6A967F51D70A862E7134A9BD38B02DF99645991A5B581F0DFA8BEF1D52EEAF49FA0BBE6E4089FC17FC3CE6037058A64B56422441E65A429AE17" + }, + { + "tcId": 3860, + "kdfParameter": { + "kdfType": "oneStep", + "t": "71F6245B23AB08356A23225A0F5FFCAB", + "z": "1EC03E1C4B20BB6D3BC13DFC34358B917C7AC7EF7512A89D9ECBF1D051AC0DD09C88493087", + "l": 1024, + "algorithmId": "5D6368F0C58E42451691E6CA72675757" + }, + "fixedInfoPartyU": { + "partyId": "5D6BAE986098CC583189BDB3EFDBC1DB" + }, + "fixedInfoPartyV": { + "partyId": "E85F817FD015E4704B929F5414A5F5F5" + }, + "dkm": "7ACFF04B9DD00F00DF29210FD1992455B92731824C2F0ECE32D25E950B052A7E4074A4F73FAEA4E2D40EF8F9522422202016912114F955933DB214976070BF6F3F94410B93E074DEDDBD85D27E06A78191F62FC1FAD98CAF34972607BD9EC3F407C32BC2F090D2D31CBD17B6026A95B75C91055EF0ED611053DB1FE02FFD0169" + }, + { + "tcId": 3861, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D43799886D08AD4872B8132B73DB350", + "z": "BC699AE1CB5C9E6536D1073AEE6E9AAFE33DEC07A11905C9DED1BDAD143855D74A735559F2", + "l": 1024, + "algorithmId": "B877852F615134C43691EF1ECCC4A475" + }, + "fixedInfoPartyU": { + "partyId": "974DE073F7F69AE4A570C4C5701C8292" + }, + "fixedInfoPartyV": { + "partyId": "C12BC8579123E758AF3AF86C99B0A060", + "ephemeralData": "D185CD0D35CAD18D144DDC6CC0E18A265D2011C38DB2512AAB9B01A3944E3C4A0670C5C712" + }, + "dkm": "629737D2C869A3FAF5A06E2AB6ED0535D667F024E07F9F100157C809D7C5FC69837288C9013785017F563C1845EA9C9B742F15128FF371399DF6A4E242B26F090D625FC147C7107D0028156D93B58A1D29615836721814C775FD948EEB8493E87A841B6A5247198BE7EA46332890931496C199258A932FF00E98E4DC8F85867A" + }, + { + "tcId": 3862, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C9112EB91F0A0D84ACDB13C51B43F6A", + "z": "BAA1C64954588B9E083E43F163E363A06A796F405BFB469CB47FDDCB78AFC766F932801E5B", + "l": 1024, + "algorithmId": "6A3C3AC022D5E66B7730F9DF1C3C3195" + }, + "fixedInfoPartyU": { + "partyId": "A3AB35F5593B964DD470D80578037009" + }, + "fixedInfoPartyV": { + "partyId": "A4D66B2A843FDAA6882308CE9CBBBB21" + }, + "dkm": "3542932D47F6DBEEBF2DF15C5FEDC79B86DF4937910DA840658FCF61C12BBB10C8BCB260A498CF6A84AD29256B8968C66DFAA701D324EEC47D0FDC2F072543ED3686E235205B33DBBB3D340BA797DA2AD111AABB42282D350D8A3404E9488902D243572A7F6F5EF9E70E9B566C02643A3A9BC555462A7B89408E03505964844B" + }, + { + "tcId": 3863, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C5935C0F760BA11B2E25DE385BCE87B", + "z": "69FB9636FDC3D9FC7014DE0C04525A824020C8DBB932E144499ED454BDE4FB8A8B5B0AF619", + "l": 1024, + "algorithmId": "5C0673F1B09256F99AF4D0CFF0BEE6B0" + }, + "fixedInfoPartyU": { + "partyId": "6DE53E2ED9CD6943888FC8D8EDF1D1AB" + }, + "fixedInfoPartyV": { + "partyId": "E5AD13A0107AC174E6AB7E57B79B971B" + }, + "dkm": "0AAEBDD9DEE8C69BD4D65CB276BF21540BD488DFD06506E1C7E09B547D1D36B29963DBA0AF93E1C15F74B756C3F07EC01645BA7205E3CB7D87EBCC3E2D4B93CAC5C35E50F715615A5C1BDC22602757F8688CEF7BF4EFBE67700ABB579F6E03B0286C8FC33912746CA92C8FDEA52260D611DDC4B95170ACFBD16EF3B5E36E63B0" + }, + { + "tcId": 3864, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3DA3EDDDE6446D0D930F1E829A07FDE2", + "z": "7B317F3BA22A9B62E3E8081E517CE946D5B1BD76661BAA2E114FD07A9328DDC6912E49BE06", + "l": 1024, + "algorithmId": "A235C5F0857846187949275615B2619A" + }, + "fixedInfoPartyU": { + "partyId": "2F667F28C2DE82BF4E0807DF1F1C1007", + "ephemeralData": "5CBFD3B1FB35E2BA26299C922DE13EF692A1655F9F79AFD6ACA5DE3044F4BD72DCCDD4C067" + }, + "fixedInfoPartyV": { + "partyId": "002088492FAB12A929D69A2A5E9D2BAE" + }, + "dkm": "D930846AFDE3C9846BCECD5FED15D2D9F6EA1E3A7B4221367C6C6F481061593D6CB3A7A754B67864787E90335305F21DB602E7358592AFFD0FD05BFDC1C37B36F1A3BE86627A25C1BC620C10BF40730D415367D9CF56F2FEF06141C1D80A6979C925A6DAAAE0DEB29D4A34EF142C78A133C1E9916BF8E5DAE2D53B496AE1C216" + }, + { + "tcId": 3865, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1193301BC9B8BF64F7B035D9207F4B05", + "z": "6047A47DF548671DBCD65DB424CD2F1C7B2CE94226CE83A033F8C163C084D394C90C17FC47", + "l": 1024, + "algorithmId": "FB21F2BA4D63E4FBA9FEACD01103FE53" + }, + "fixedInfoPartyU": { + "partyId": "1588683EA0FE284D80C6D91188EEAC3E", + "ephemeralData": "27E4CA97B505CDB570AEE4009C043B78522BE6227613577D12E9851179B2694294D1E42986" + }, + "fixedInfoPartyV": { + "partyId": "A246C88CA6AA3B9741C897D5856AAA31", + "ephemeralData": "F5BD31CC6287EDE40739C505C372E17DA67C7744EB73B27A338043C441BB5E9334DFEE0D66" + }, + "dkm": "CE86605119858C75DAB626DB33B67D314BBA980E6EB2A3A9792F15748B724C5FAAA711AA644C992157EF9BFE28B5FC7F9E229B0D99F2D56DB85865AC285898FCAB50592FEBE94205EBA82AED942D8F08083A8191529CA4A7EF66BB7C8C1038C8E869495EBCA3D6CEB830BD2BA78118F153D93A1EEE9A14C0DD7CA7E0EC9F3A85" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 192, + "testType": "VAL", + "tests": [ + { + "tcId": 3866, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5B98075C6B0DE15072D541C6BBA5EFBB", + "z": "EF9E8DAB0DFE8067C0B99BFD3B53837A710E0C67CDD3984085CD79199D50", + "l": 1024, + "algorithmId": "F81CF4C6883FB3F341E530FC280F2D29" + }, + "fixedInfoPartyU": { + "partyId": "7D6D575CCD3919994D96E487E41BECE5", + "ephemeralData": "2805F23D5A888717FAFA3CE88AE3B49CC9C27677E27B886CAF6895EFE5CE" + }, + "fixedInfoPartyV": { + "partyId": "D61F020B5BAE3C7CE533340808DB79A6" + }, + "dkm": "AC86F3D7946E37E00AAD1FBCA5CAE29891F639A9BC52038E00A7F64D1038E4A0B0676AB20559DE1BD3107B197C3CE74CEDD1785F7C35BD947F3C33856437C3DB50FEF339C1BE538D77B69BC536572D5F88A11E119CA8A8CE8032CBE63D16196803B06DD1BE8EF75EFE626C54DEC1664A330DCAC68666A370EE52066D7E1CEA7A" + }, + { + "tcId": 3867, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B6B138D31CF708696F12E3CC8A6EFA6E", + "z": "D8191F4D20C9F302E839CC2659BD123B22A8B2F5FAF3F021EF40E9B28548", + "l": 1024, + "algorithmId": "BFE26FD58B02D8644AF41128B690DCD7" + }, + "fixedInfoPartyU": { + "partyId": "60EDD2977DD97E7FF9BC50434B272C77", + "ephemeralData": "51BBF3A7D9C455EBDE5C8BC9821BD701A21F20BF835F7DE4127A5EE5CC47" + }, + "fixedInfoPartyV": { + "partyId": "D8FDCDE3CE4219FD7934520659690630", + "ephemeralData": "FA8E49B085A2A2AE9CC6B6B9520DC1F16BA09A8FE1686AD4234F7BA6D7DC" + }, + "dkm": "7E44F8F697627DAAF9ACE2FB594C09E782F578BAFDE7BDFA62ABAD18395A42F477758E878AC1091743A31C972453A1F8D0C0FD0EE5430432D40EC5CFF8CB0C71E474AD27FF2AEAF6E60144B5BBB08441C0470341047898520DCCCA9217548BBDF96EAD4179CF5473CDA6745CA59CA263290190A2B7F1215B52D131EA89ACC5B7" + }, + { + "tcId": 3868, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E9F53F01619536DCD7258FF7FFAC0771", + "z": "3B09939FA0CE015CC2F2B504C368404862094BFBC53DFC917798FEDCCF06", + "l": 1024, + "algorithmId": "82D844B8B1001E4FD8ECBFAFBC7EE1BF" + }, + "fixedInfoPartyU": { + "partyId": "C7FB5CB9AF2F4BA272DC1362162910D7", + "ephemeralData": "167C3EC8AA525EAE1E623584C3BBD260453AAA38857EBD872BB49D59745C" + }, + "fixedInfoPartyV": { + "partyId": "C7A38DE358A1E423ECD0038347F534C2" + }, + "dkm": "B32B51C0C81BBF754656DAF27A53FFAB0767749A2238D6135AE62B14CC0DC3BCE241FF579459D1504C72767B5B04191D9490E16FE34A757C51F6217F25F8F6EC932875DBAD4F501E916DFC72515522DEEB960B6FCD80E19BDBF73FF60D26E2F46E7556679609AFAC0BB7DBB180FD81802A43BB9E7EC308C4F1BCC553110EC07C" + }, + { + "tcId": 3869, + "kdfParameter": { + "kdfType": "oneStep", + "t": "11C63AB510D246CB68B34D639ACE1035", + "z": "56CC0C2315D13F9BD21D761DF2AAABBA60A4A43E992AE41F1A36864BFBBD", + "l": 1024, + "algorithmId": "57FF9FA6A25FA48750679F52EE7E848C" + }, + "fixedInfoPartyU": { + "partyId": "0E0FC96FE9F01A207954ABE54EDD4C9B" + }, + "fixedInfoPartyV": { + "partyId": "1813F721B50C60EAF4501DC365278B6A" + }, + "dkm": "6054EDB640F2B9F41C6B96125B9FBE986B072B3C5AF3EA3607B0FEAA453F87C8ABB89078796ABCDA140BB7B34A40D01F677DF4761756D55D05F2CD03A9833BBDA81BB61765C506E00D4F04B4D64A3D3AFB299AAF0A9D73D3BDA3264FDA66E47EF40F7706C07D96A04133DC02C7510F22330F1841EE7229A113AFBF9CEF77BE53" + }, + { + "tcId": 3870, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0895AF6ED288D924F82F83AEBBC2CD80", + "z": "E50F560DBD50D16BF13FE8A7A6B0116BE8738FA309F6F4424A0C233AEB00", + "l": 1024, + "algorithmId": "464B8BD4529565FB23B7982F32B67F55" + }, + "fixedInfoPartyU": { + "partyId": "9FE0A5C4CE8B353A2850E9518CCF4CB5" + }, + "fixedInfoPartyV": { + "partyId": "E4EC3C4ED2697F0FC8AD08C821776E3C", + "ephemeralData": "EC56E76942C32144EDC398E8D039B0F1C62C715C716B87C08296E7BF5754" + }, + "dkm": "3C9E2063AA001C0D0E5B741F1D549455293419D027C1AB67A0404C21A347A6F4DD6EBD228625C5BA084E7B986CE462E993192421ADAF49ED6589574C32299460E7FC3EC8ED58A59222009B21CEEC8F1F3920CBAD2E880146F61D746E74E4FB6C4DEEFA2A3E7F3B36CF24CFD8381AAB6AA95302800B190EFA793081FE036B5179" + }, + { + "tcId": 3871, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1F22D29A6A6B8EAA1FD4EA0E5725DB8", + "z": "644FA32E30B2B9CE4CD630B1BD28098E3F560CBB94E774202AAD610079FD", + "l": 1024, + "algorithmId": "63F1EC7D35C62046580BF65B18D2B008" + }, + "fixedInfoPartyU": { + "partyId": "F1930BFDFD3C8EB58FEC0438052E182F", + "ephemeralData": "4ED8F32307981D890651DDA26582257DFB7CAF46ABB0EBC17B6B7E9D2AAB" + }, + "fixedInfoPartyV": { + "partyId": "E0A55888196C9DC3E6B17883E5C126C2", + "ephemeralData": "7E377105A19C73057896EE20E86212CE5863E580A0A5F913F1A57AD8BE93" + }, + "dkm": "F1EEEC5117A40FFBB33E7A066DB36388A70CCCF6F277A5DF879B235BA777F190BA3C58302E77FBD9430F31227C45FBC3E6BC4AABC8644A3D8885C276C56BC88B11C10F0CB2FC93E1DB0998B111E3438E22747431FD9D41FA6088F6E580B8A6F9DF428D22F9128F81048F3F0C60EBF9015A817E20CF54903ED3C0A0A7B6BEB639" + }, + { + "tcId": 3872, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F35ACC0CC3DCB77B645DFCD68B1D6BFC", + "z": "B3EAA7B538DEC766CC0C753BEEF7A139BA23D87659A79ACB1B7E1E5C122C", + "l": 1024, + "algorithmId": "FA7C1C641D4A4C2A8476C75E309C3CC3" + }, + "fixedInfoPartyU": { + "partyId": "85857CE3839FE17C5EBF52F156F25E77" + }, + "fixedInfoPartyV": { + "partyId": "B02466463F95AB5FE7E4901DCC3A7DC0" + }, + "dkm": "2DF89B6757D9273788B7F29695EBE64E739E443375098BD5B24F1E1DFD7C61D967E8613BE3E93377D956916132AA013EDFB02C00782ACF01899E824C2A6F3C0B752E091ACE5462AD470B627A794CDEE36CCDC1A668FAC31A0BA56046D19230505BF6AC86621E66D0E8F57AF8407D4508605B262301064E0B30AC5407A895144C" + }, + { + "tcId": 3873, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C1BDDC3C8BCC8EDDA6B08B5D0F38A8FC", + "z": "7CCD51D756CDE21B154C9580A6A265E35B102326709388AF856B4447FC69", + "l": 1024, + "algorithmId": "707F6AE86C7B45BEA5079ADFB4FD7E6D" + }, + "fixedInfoPartyU": { + "partyId": "8C65EC7CAFF977043B22EC03BA87E268", + "ephemeralData": "999C9C09A26742F758569C430717BA5EAE157765E05375285B95E867AB81" + }, + "fixedInfoPartyV": { + "partyId": "C3BD0BAF455F86D39366A555C0407C2F" + }, + "dkm": "920F9EC62079682672C52D442CE1A88E33EB022C83A2D5C8B04017D13134CAD01E1A7165E2BE2D97790152B731857175226A3D12D2A7D6F95281E9F98B223E8573C879E5B96DC8A526BBDC0E167E8B3E4A1043FDFD95BE115A5FE98F2B4EA958A9240E05FFFE8EA7DBED1FBA545EE15F3B847B10F7A039289058037ED93F3283" + }, + { + "tcId": 3874, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2F86889EFA6B803D6ABFB20A7164C3C7", + "z": "D6ED8FD56CAC1B9F07B2FB4DA33C037D98B25E3B58071F00A15697B392C7", + "l": 1024, + "algorithmId": "2076949EF8DDE9CF3DD0591013D66CCD" + }, + "fixedInfoPartyU": { + "partyId": "6176B26944C226CADEE00B30AD63479E" + }, + "fixedInfoPartyV": { + "partyId": "3270CBE9EB97F2BF7D8B3BFBBD6802A4", + "ephemeralData": "E0F348197130D70CA319848D30B34BA4ED9E6D3826D85D22716704FBF3B9" + }, + "dkm": "0F1F077B08F7A19FA0889DA76D89B8A5DAFC2E76E68ED503D0FC2DEC26FD1250811AF4928E6F8562E1B1CEBD5F96DCF5868D96EB80B86305A907C3548A15A5E83DC90AAEE1CF4DDDB3C8CAA6C9E1FC0850D0827A1282FC315ECF46A16E7AFE4596A6E563AE9EAFC46DE2A151C4D231BAE7AC48EF706D4952D229676F5573E11A" + }, + { + "tcId": 3875, + "kdfParameter": { + "kdfType": "oneStep", + "t": "70C6DB4F8DB63DE56A0742C390F245B6", + "z": "8915FF9B066AF773A7B1AD86B870EEBAD87FD0DC9075938F01677CE1D345", + "l": 1024, + "algorithmId": "46DF3089A7204545BD17CC3D8070713A" + }, + "fixedInfoPartyU": { + "partyId": "3665331A5EB6B5DF624FB562AF7F6A6E", + "ephemeralData": "8C52F6D0D90D9F0476CF517222EC7E8F656112E95F9EBF1854961DC8830C" + }, + "fixedInfoPartyV": { + "partyId": "4F6555C3EF6615D76C4C7C8E1A339240", + "ephemeralData": "B2E0EA5D4A7F3213D746DF571F116C2284BD0F297F961BE5F3102EE0264F" + }, + "dkm": "0E11B2BC4DC16232A31251C2505602A06F9B00F3107280FEC42F4E9015FBC9EA5B40C2F9DB0271B447D065A9D6F40D5B19CEE3BE773444A333D4E1DA256815664AD5E9B210AA61C86439C05FB48EEE6BE15BC893F0160D1492B37B6B9FF5C718B0FFA8BC933E23A926B4E9B0F283EAC3838709EE9A3A981604E020F653CF7FBC" + }, + { + "tcId": 3876, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC4EC1AA924F6B7EF21A05F3B4589F27", + "z": "03C93D91FB1E748382F16B32387174BC50229395E3947C7CE476E6E96602", + "l": 1024, + "algorithmId": "92056E7F204DB06BFF9518A90FEE3979" + }, + "fixedInfoPartyU": { + "partyId": "876F0F20DC23421B1E85191D5161A955" + }, + "fixedInfoPartyV": { + "partyId": "B33E537AC775E2800BE28F7121DBAF2D" + }, + "dkm": "3E0A295958FD1A7EEF26DD8123F4C28F93B4C29CC3676FD8B1414A8EB315C89A679AE6F120F92DB374FA6FCDC38349764027B13FD7117217273472A7C100F96CF51E528BBBBA6383400C18D9A4ED142488ABB85F750F335C3A4E71EDC2FF37059CC3B43E69F302174738360D3582CF8F3591C4F10504F1F3FAF20C8C841AD324" + }, + { + "tcId": 3877, + "kdfParameter": { + "kdfType": "oneStep", + "t": "34C8C9EA9B8367B3768E763F8EE2CFA2", + "z": "5012C563BC46E436ADB50CBAD732F00B136BE280718BEF7B27C98A3250F9", + "l": 1024, + "algorithmId": "348AFC886170BEBE41EB962C1733D55B" + }, + "fixedInfoPartyU": { + "partyId": "ABF5CE03F3537B6BFFC938683CF6F456" + }, + "fixedInfoPartyV": { + "partyId": "DCB5C30C434E1A4B7FBB0F1368935BA0" + }, + "dkm": "367F5A68C6F1819B23C5E21A2238747DB82B72E64DC6024B94AA0649DA63E4BF42917798A48369C693B3ED2EB5953FF79AED528D251DC1126E59A99FD71ED938B5233277ECE3ADD9E5697B032ADA5DCFBAC9CD5D0ADB531F252DDB212C619ED8CA23481A0695F8B7C300B065E4E0B2FFC091AED827185FA0F821958DFE459699" + }, + { + "tcId": 3878, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA56696CABFCF90E65082A05CAEF1EDF", + "z": "CDC0D0DC18F2A0137C0C1865F6AC9ABE802A6B248FBAFFB4C18FA4C7E205", + "l": 1024, + "algorithmId": "93DC806BBEE07B907478BDC9EB7EFACB" + }, + "fixedInfoPartyU": { + "partyId": "9C05750FEF691D0438B889B836242708", + "ephemeralData": "6C1CAE48F274E135C8F447FC87ED3EE3E576B226CE899E3E0375FE623A8D" + }, + "fixedInfoPartyV": { + "partyId": "8592BB2F97E62493CE5E954EDD559A9D" + }, + "dkm": "71E91333722A6E2214015A5036630AEAE13DBE7740B9DD8407746C543ACBD5893C69C29AA78274F006B6E1849CE4B6F7199D4FE4D549BC45E89B76648D42060E906FD74EF456FE5E9DB8F1179869CDD904DFB4887A3039D439517CAAC35005F9E5A0D1B3094E7470607FB5F1E83896473502F36F7EF2DE994DF0839CB613CBF7" + }, + { + "tcId": 3879, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1E4CEBA7180F2C6E8AFE23046F887C3B", + "z": "D681263E79B24243371E01100256653F9395A1F2B89311E269883F30D5F7", + "l": 1024, + "algorithmId": "29E1738CD02819FE78EE9053AD03B066" + }, + "fixedInfoPartyU": { + "partyId": "5D314CDB7699D2A1A142B6D90ACD13D0", + "ephemeralData": "5BA7673E60B42388B98AD4DFE7BD90BC2A0E8CEE92C0FF4BDAA5C1A9EDDB" + }, + "fixedInfoPartyV": { + "partyId": "145424190A81382B14D73962835411F7", + "ephemeralData": "A07F52A6BBA8B882C78A37DD9B6457E49C450C8665216A8952651DE6DDA8" + }, + "dkm": "0C54BB44BAA72CCA36B05B8AB5574D0EBB5A93FBD483054509E8DF804C386FA5FAF575E4C113E956ABAA0A3796322E5E5A53C62A83A06C32590D09A68D8A9C7F9D6720D47A3C0A9C75E1D3C539DB9EEEA3A388E1F61F0A258E8C5BBF737BE17AC5CB78BBFF2411A24BD8CD35C5415BFF60777AC4666DC6D2321483036AE759E2" + }, + { + "tcId": 3880, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7D7126448157582E14A889CFC18B8E0", + "z": "446F15A80011FAE396EE9592832E271A7FBDE67B1AA2E0FD0CC881078036", + "l": 1024, + "algorithmId": "BB6518E6CC445726C48D848B2BE15C82" + }, + "fixedInfoPartyU": { + "partyId": "640C825938BBD3F2E31066966C801460" + }, + "fixedInfoPartyV": { + "partyId": "70E763C86F0D9CA0E9417FE019ED5A03" + }, + "dkm": "1B71D2DF0C953A7242347AA31E79DF228CC2268301B2FA4CF178EB3DC964EDD239433C1A19F29EAF03EE3A17C425D63C957ECDB4B86A0F2752EA10ED013D082B5B9383F9E2B7A7C77BA76CE8419FBF445966A8E0B69D7E9B120F8B0236874373E640D79DE3671FC3A44311F836D7D4BDF2A36CE622462B657268CB63E55A2A6C" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 193, + "testType": "VAL", + "tests": [ + { + "tcId": 3881, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3CCE507EA8E9811BA30F46EFE21A10DD", + "z": "23BC538CA3A4607E9A20FE2EDBAD79F9CC3D9FE688CA4744ACB12032F1657F7E468415", + "l": 1024, + "algorithmId": "95C27D4338F922DC224C4A00B6C40E75" + }, + "fixedInfoPartyU": { + "partyId": "0803F8515CCB9A3EC1E71E78154436BE", + "ephemeralData": "09629C5D8649C333949DEB91DA54275BB0CAA68AF01F0D7BD173CA5F7F18A967C3D583" + }, + "fixedInfoPartyV": { + "partyId": "AAD2DB7A304615ABAEB5C51D15BCF97E" + }, + "dkm": "0A7B31442F34A8751944BFC5003611B47F87632D9ACE128A92C51941384C6EE2E800C06034AC8C21951FB8F0D1C7D8AC49E3626653DEA40441A411262C115C7B6076668848884908843B5AFB34DEA6C09FD0227A316C53EC1AAA672D98EFB2A15D747F214BE7CD3FB979D2AE30DEDF0030F10165CF2BC0883FEE221CD1C5B151" + }, + { + "tcId": 3882, + "kdfParameter": { + "kdfType": "oneStep", + "t": "32B9F84886BD86EEE6EDB6CCDD009498", + "z": "5E7AA73C7417486462024CD240ADE0DE2ED8E162BDCC4C100814CF710B1F5FBD7F6C3A", + "l": 1024, + "algorithmId": "FE4E825E99AC6035BC9D05EB51E83A88" + }, + "fixedInfoPartyU": { + "partyId": "A45AC82299DDADB70E8E88789E9002F2", + "ephemeralData": "720472ED9C3F686F24889E5256B639505FCB6ED269CC9FB729A6BD5D71AD2B8D51DAC9" + }, + "fixedInfoPartyV": { + "partyId": "B4C773E0185664E1BB401F55C6D028CC", + "ephemeralData": "F29E8AA1FB437048ED74FAF9300A059DA99C599A443C0A7DF40288A3EEFF84133554FA" + }, + "dkm": "F818400E7018F16DE6B5F30AE8A14552A4C9B1298952E37B96B660636F21977339A255E0ED89061DB96BF9C8662A35CA77F040B65E94CE67BE1FE2E8F9A73E21693691F85EB996D9EE4306B75535C0E2B5732AFAE6831751D30A29B13CFF49DB3E82EB49703F8707F64948F461B8462FDADBF95BD682B12A543E14EEEAB0C19A" + }, + { + "tcId": 3883, + "kdfParameter": { + "kdfType": "oneStep", + "t": "83797824CD632151B25FC6B016532E43", + "z": "CC0C19C8E73DE50912EAF9F10811863A0AC05E25C085F07C8EE64FA0659F2390DEE547", + "l": 1024, + "algorithmId": "92D8568B148F93410B0B492A649C58B8" + }, + "fixedInfoPartyU": { + "partyId": "6F3E60CCC1E337CAC7B2C9A46F4778A5", + "ephemeralData": "5A83CEA7A8452816B93D4AD471665017AC1BB8E462C6FF11BA5C8C3997EDDD36FC3F6D" + }, + "fixedInfoPartyV": { + "partyId": "14DD8071CAB5F76C1836AF8BC7960FDA" + }, + "dkm": "F8EC5A484940F52B993EE6E86586D2256ED0615139A6CCDFC8B7D8BF9E440B7B136A11526D1A8CC8904888D499316BD529F3F5130907DCA67882E12A5620B5C21C428C0C0F2D6FC133082C6C7486D076EA6AFE2EC8D83AB0666BCF6D361E61DC187CCEEEB3E7107CB67C67CD24F26761F2E6B778A8E9D286D38112A9350B4C3F" + }, + { + "tcId": 3884, + "kdfParameter": { + "kdfType": "oneStep", + "t": "D7D847EF8B9A244EAD20CCC9D5E2F71A", + "z": "730195D6A9D3C44FAD778258CBCB5D30BC79A88F6C1D2A8F705EEB709C793644919E70", + "l": 1024, + "algorithmId": "692E1F45E4D86D1D985F5E73FC24A224" + }, + "fixedInfoPartyU": { + "partyId": "E20BB73183915B6AEA725BA032EA8EA7" + }, + "fixedInfoPartyV": { + "partyId": "29F99AB517AB4DCCBFC138D2A579A88A", + "ephemeralData": "F2885A97C0B5D3C60ED4732855D4CE87EC4C33F1B9977CF3F0FD60E0EBD41C46BE01C5" + }, + "dkm": "2621C24A806CB8DB6569838463FAA350CA957F73C6A921C18F5FE22310109CA3992A22BFA6F422ABF23ED6DCA548D73B26F11DE9F63DDE2C97E2F4794545331A3C34B90C8314F16EF5886BAC87363BE61901357D1F144DEA9951884687ED6CCBD125C7EDBE8139B0932EC93861BB86633F94384CB1D42E9B2912BE9AEF7ECB3C" + }, + { + "tcId": 3885, + "kdfParameter": { + "kdfType": "oneStep", + "t": "787D2AC6947DF1874C2A3A3470A1971F", + "z": "C30A8C54B1741F084B15AA094297F0467BD593A082098D205124FE87CE9A7CA0F292EF", + "l": 1024, + "algorithmId": "4745CE1DB3820A7E78089DF9D261D444" + }, + "fixedInfoPartyU": { + "partyId": "01DD6F7DBF0AE910711AC884CBA5DC8A", + "ephemeralData": "A5C0734198CD56A0203226D67EF60AEDC3F7468293FD728A68C64F67F6E84F578737AE" + }, + "fixedInfoPartyV": { + "partyId": "373C76EC9DE7B1013563AFF33A6B8354", + "ephemeralData": "272196192934953E247CC1A63ED0BDDAFF3E57B216272D811056C71D31B1B9B8E61319" + }, + "dkm": "BD0D344E3946C0868D9340ECA8D8D29B3DC43109DEAE5EC9848916A7E73598755FED169688B14D9C15106CA0DE576A6801023F6EAEDF6F816525C9A20791C2315EA8CC29268DA3399EED9BE630793B0120CA96A22CB2F2D43507CCD5F7BC39642AA1A177EF11CF3AACA7439F039F8CDD002CD95A11253660ADDE3833D8EEC010" + }, + { + "tcId": 3886, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9BD00D9BDF1BA4BC28BC6495E2A306C1", + "z": "170DACF916469595CE274A4A48525AEBAB82303B841B1170A290B17D5363C217267830", + "l": 1024, + "algorithmId": "C8260862E8E830F91F418607E3DD093B" + }, + "fixedInfoPartyU": { + "partyId": "26E5471644AA46AB8AE7B8E02F92BC2C" + }, + "fixedInfoPartyV": { + "partyId": "97B13065F551EAB8E54774D94361B46A" + }, + "dkm": "91F470141AA42626E49836D2D306280FBAE594C426F1EC21F53E9DEFE589E9EB1DBF45760AB088C4FE7C6216755E1003BC864F2655446D586FC26C238DCDBAFD4AB3CF5ADAA1A9FF1A72E702B65677224FFFE929DC6CB9D42132BD8C86B3695B599EEF137CBA3E385891D2401377912A04032F678CEA680E20E1D3E524D4416A" + }, + { + "tcId": 3887, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6DAEDCF578042BF7E49652A780FF2F11", + "z": "5520B8D3CA3757E2590AC84ED7EF72A8009E38E3140FAA75CDACB60ECE78258590B65A", + "l": 1024, + "algorithmId": "1E1F07B2B08E66AFC0B05C0D50EE5FA1" + }, + "fixedInfoPartyU": { + "partyId": "3F2117E7392084FBCAF16098F89976FC", + "ephemeralData": "F772F836CB71D0A8CADC24814768A59E6C17BA8ABDFAE17EB6EC1E1BBC41DE6BFB06DB" + }, + "fixedInfoPartyV": { + "partyId": "2DAE628A194C3A747ADDDC351DE924B1", + "ephemeralData": "81CC4322453FC3D847D3EDC8C136FAD0650C026F868021AD4A1477024679BE73B2A1B5" + }, + "dkm": "D0A5024701B8B569FF1031E9ABB7D30E4F1844504AB3E913E0D983B929B9BB3841617880AD53CAA1679154A4945E5F59761484AEF8AD3718DA1BC2D31B1105D6979E4AFBCD428043CE0944E621842D4D642271429FD4BE7D41E9587549A7FC3533B8A6C13BBBE7CA2337E9C3C84D9ECF146F77CC1F58578C83364CE5FE1DFF22" + }, + { + "tcId": 3888, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C41EF408E32F638A18382F1CA1A3A81A", + "z": "AEEE5D309A57E9B2044A993E0A9954F4AAC7EDAB68BCB7AE1CD09FC985B48DDB74DDA4", + "l": 1024, + "algorithmId": "B3114F7B53B37B25A23B18158F63D16D" + }, + "fixedInfoPartyU": { + "partyId": "F683FACE6089134B01DA23662536DA9E", + "ephemeralData": "E5596165B836E90F2BBF977AD143A1B7D0CA0DC951EB3547E0D2AF434236D20B70294A" + }, + "fixedInfoPartyV": { + "partyId": "C097382715B9F950B6E2F4A4CBA37E34" + }, + "dkm": "6C95C432E2F69DC1E8B83A2DFB39396C27A6B2CEEB0BF3E4296A60E79F9B23538B9AFC250C32222B0998D9B91B2F6BCD7892D490D5F336B32B52B380D8CD6C3A99880452963FE3505E7C0A32A0EB5506EC816E579939CD0339548A7754DC58F6CC07D8615ED6001E3F0D746792454B8D9AEC3233F96A770FA4719337FE85F58A" + }, + { + "tcId": 3889, + "kdfParameter": { + "kdfType": "oneStep", + "t": "964175C38C0E1F1A73E4A02DD9755838", + "z": "56A9A49F71F6AAF03CB8F841E2BEB8FB3C80F3439FB8CFD45C791B897DFB0825B994E8", + "l": 1024, + "algorithmId": "D45901F33F40E5143483B80F572BDCE1" + }, + "fixedInfoPartyU": { + "partyId": "99CA7F61A30F43B3BDECDA3DCC33475F" + }, + "fixedInfoPartyV": { + "partyId": "2630BD0825DF8DBE502D78B12ADD4638", + "ephemeralData": "3FFF7DDF86AB980C4D7E7C05CFAD2CCB5E662E5DDF70DB14E8FE2E00CC20FFB3C0FB40" + }, + "dkm": "154DE32EE3D6470940DCFDBB5AAE7EA6C81BE1D6FB3507D74A39A76DA0E234A4A1839A56249FD054BAC2E627366A662FDB57F4E67818D75CFC8537870B8AB5C8D25D4978258EBDEF22E3DBA836C255BF5AEED0EF41108CC0CE27C0AE761E0549F71B2628A59CAFF61978D8B29F5775DE00AA7C22DF47B73EE525423CC881618D" + }, + { + "tcId": 3890, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1A50617053D3BED9BE66378737EB3F6E", + "z": "BC28DA997DEC58B1A6F12E4B4447349A6CCDF195E061E3764D90C007BDB8566DED9E91", + "l": 1024, + "algorithmId": "C60D57E2439011FBFD10E96CD2C0BACD" + }, + "fixedInfoPartyU": { + "partyId": "CFC7D8133A7E6DAEAC26D81AB153D7B9" + }, + "fixedInfoPartyV": { + "partyId": "0D27304CCEAFB85B1465E9C14CD5675A", + "ephemeralData": "AC0A2D573C61DD771FBE9DEDEDF76FA0593FB7ED4ED5E5C6D529BA8F1D10ECE931352C" + }, + "dkm": "C549CB97662B511455152595F949A533FA7F164343F02ED78113CB996D18B16189474781E8D359CB08BF76D0113B6A840869940C4212363A6490EE2CEEEA369258EA8E937796B3D1AD6980837E5F734AE243BCC77A8A3363D90DF70C63C0D920CCF0B20FB885133B6DC326E05B5C7CED4070D2017B2D8C9B7A82B16087C39109" + }, + { + "tcId": 3891, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F343F39C5499A6477DAD754B411D062", + "z": "990571353AD515295795BA7B26624156A5F36A2E0F90CFAC393151A9D2A5A60A85664A", + "l": 1024, + "algorithmId": "C325E798E355A674749A5EC4BB0D9452" + }, + "fixedInfoPartyU": { + "partyId": "5B1A8AD3A82E9E236368FDBC1D1B6232", + "ephemeralData": "9CF479FA9F83EC8CDD03FFD958E8D64FCCDDF7C93A03F67C93A84D10500A3FE80DDE99" + }, + "fixedInfoPartyV": { + "partyId": "DBDFF39A2CE6D4556F0CCA57F2B0F793", + "ephemeralData": "ADF1A80D9942D618040379C98475EB47D2A76701029809C923C42D3CE93485B16F0B4D" + }, + "dkm": "9CDC1D8D91BFDF911BAB287CBA43E0ADF659292A4DAE0D8EED41F9B72ED9111A80440F0B0BA669E9FDC3604323C43DE59E026ABC61565402A646B39DF064A4AC9A8334F3A64579050331CE1A89034319B091E3021AFC7F7825B452A7FBA7095ECC25565FADB667278D5AD821BA721B171B5039E96572CDA7D817D17784162F9F" + }, + { + "tcId": 3892, + "kdfParameter": { + "kdfType": "oneStep", + "t": "07D6FAC367AF871CA86A98888E5BE0E8", + "z": "82B1D56159B912544A21BF2532A8030C2FEEDCAFE1B443931FD0C18CC33934AE34681A", + "l": 1024, + "algorithmId": "A6EBF46D9CB9AB5B1C20C1DB67C92ABD" + }, + "fixedInfoPartyU": { + "partyId": "8AFFA56865D778B8CDCE1CAF713DBF04" + }, + "fixedInfoPartyV": { + "partyId": "91BDBE77087A6EEE13EE0F357203C9CA" + }, + "dkm": "DCB5884ED991AD35C01568148EE161D699D05BCF6B8E050483666D2393232873D062E606FB2D916A20494E30D34D33C23AC2B3AAFB2CC5B2E1A693C6409D21EF98035B5BD9D4D4D445224F653AC33F07CF00CB70917FF63C8BE4B4FDA8772DDD5853C1E2C9CAA2A107865BD23C3A8AA27F672C5EA1B3930B835DA7228C6FB207" + }, + { + "tcId": 3893, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EBD94F0639DF870632A8E4AF639EF7A2", + "z": "241A8E2A17278B9635208ADB04D834E4DF0EF95955FDD12D0D75A0960104FE452A2C83", + "l": 1024, + "algorithmId": "7F4F84A5A70668791D616A1E3C5233C0" + }, + "fixedInfoPartyU": { + "partyId": "3F853208617AD63AC208F69E810A5A79", + "ephemeralData": "B91FE805632CBE0F04CA152BEE408DEFFFDCD9B69FE35E790A6BCEDEBA4E27AAB7F570" + }, + "fixedInfoPartyV": { + "partyId": "2FAADBF3DC49FD8BCFA3500C51796399" + }, + "dkm": "9E0CC58377060476672B1B4AE99E282E3B3AB5205E442FF31A40E3429AF449C48A70B91A9F038AD50FACE8835648121663FD29A638B412CF6FC00A2B638ED06FD54FA8EBAAF432ECE28AB39DACBDF7ABCE7D18FA4E121B1AD8A14A8490698AF509103E3B3F865B3DFD3DA8266D8087C5FA6942754C39DF3121285AA067132B2B" + }, + { + "tcId": 3894, + "kdfParameter": { + "kdfType": "oneStep", + "t": "14B660C485084C95FEACD4D9BFA8FF27", + "z": "4900EA378EBDE284A3132642D1C2504308DA37A279ACD7D0DDBA78245089B933706763", + "l": 1024, + "algorithmId": "60477C3CAD14A1975343EAD03912D216" + }, + "fixedInfoPartyU": { + "partyId": "4E65D2E927DCF61E4784AF9DA6140CD4", + "ephemeralData": "DFA46F7DB1BAEB494CB37BCC946A342396A462D6E5A62CBB41CCE5A60D2E95A0C37358" + }, + "fixedInfoPartyV": { + "partyId": "8651F650F28B42E2B80006DD3FA93C77", + "ephemeralData": "AE84339A53FBC0F08AB1B2341CB865B9996EC7874BC41A2BBAC3E2E224F7DFEDB52ACF" + }, + "dkm": "71BE046C35098C2E5646D87C856B8194FD97EEA55510C0066E879CB0EFD65F6D13807848439B320B46BCE1005123F97FA9144FEBDD8CF3E0EB78AE1E6D63B515B398F4B70815409871074EC5176BE911EF6AE9E007F3E2B20024A230518468AD22C2F94CF6D35E30D5E6C75A78B0D966782FF0DA57E99B3DECCF6905E2B1C0EB" + }, + { + "tcId": 3895, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A942437D5F6BC4072D8E758C801076EA", + "z": "339A3AD0688CBE810019E75FE50DCA1FCB21831B4D5780CB92E1A2CF0A8F49490DCDAA", + "l": 1024, + "algorithmId": "D96EBA4ADE437C13E5EC2946084776D5" + }, + "fixedInfoPartyU": { + "partyId": "DC4F77B0ADC2E3ABDD406C5A9024AC7C", + "ephemeralData": "580CAF6E0A506C247B3A2F89B370915E6ED123E591C1791510888F2F61ADE79DDF2277" + }, + "fixedInfoPartyV": { + "partyId": "8CC7312132C82FE3CB60C3FF9496BA17", + "ephemeralData": "8D64C3A4F35907665AD0A5309B6F3C8D2B7A696C65A27E3EC33D31AD6E556E07CA7EE1" + }, + "dkm": "0E1B9F9F136736A25B6D02CB85C5F262A75E9EC4889B224A350E217A1D0DD415BC2549DEF77ACF1E3350026DC0F53900AAAECE0986C542A7F959F0A125A6F2D50BF6806164D1AB94606C0B15B0594A9727EF8DE9D86D195C60613BAB9D5046CB3760FC64327009C90934D60088A5E93AB9E2C2EBE40569BFBD852DE89670E210" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 194, + "testType": "VAL", + "tests": [ + { + "tcId": 3896, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B19E8656C4E3B4552EF53A7A3307DB23", + "z": "6DC8032AF2D38649A1AABDEAF108EA929CDAE59134FEF26DC95327A7F22738E83EE11D61", + "l": 1024, + "algorithmId": "8BAA1E8A2AB5C878294A2D5600ECDF2B" + }, + "fixedInfoPartyU": { + "partyId": "7033AEB663C02CE6538B14B4EAA36B3D" + }, + "fixedInfoPartyV": { + "partyId": "2A6A9E615421A8858E2A54EF14771E01" + }, + "dkm": "6265D42EDED75E04BAE2325BD64EBE5E44874A7F230E1C579A01B685FA4E3F312E24DEDA9C36AC29BC1B94249A9513ADFE0E266BC8F2106B21F0C41454C4C9805F0F5428E5E2983A5278123AAD46DEDFFBC70C331FEDF617E1FA69EF5080C86A96FFB8F4E78B7A40CB93BBE819F4D9665C27DE9B8FFAB2B490FA2F26797F7128" + }, + { + "tcId": 3897, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FC3BB0AF72950452172E26F16CD11B6F", + "z": "C69BBADA7AD96BF24EAB97E5CC7B6BF3364A9CD715994FC8AA920F0CFB62E610FF091527", + "l": 1024, + "algorithmId": "D737F8DBC2B6162B88DD8753FEAE13F3" + }, + "fixedInfoPartyU": { + "partyId": "129A7F6B024F8494E260D6B988C737EF" + }, + "fixedInfoPartyV": { + "partyId": "B40DCF1736A109133A781A3C9ABB0805", + "ephemeralData": "FA58984E41B47DABBECCA54D4E1CB22BDFB1D514C6D073E3A8486038980B1D7CC1D5A026" + }, + "dkm": "B0987189BFBE7B3E7F4F0C537771FFC0B73588CD1637D058084CD041827D6AD639FB6973A5B3AFF3FBDC1D5DC842DEAFBC4DF9FC83170345F64C4C379FC89F3E14393BAFEA65A53DBC9C5A63AB93372487EC823CF7CEFCB04C310D647594D50F86FD14F938148C8B5134B45088921597D3BA5A69095F6B793B236C35A1C0D441" + }, + { + "tcId": 3898, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8F411B5211A84EA1D5FCE840DDD79951", + "z": "AC7CCFEBDD6E7284775584A816526045C22B9E2EB44AC93D6AE8E2DF1675539539E46726", + "l": 1024, + "algorithmId": "37A88B13A25F2CF8C1842CC6F75AA5FE" + }, + "fixedInfoPartyU": { + "partyId": "B3E3F404D89892FF5DFDC124FDA16FA7", + "ephemeralData": "856CEDBB8F90737DEB1616F562849E2DFDBE0C9E4D6D7F0A736D91FEFD1190CE15C64A7E" + }, + "fixedInfoPartyV": { + "partyId": "E7668A2B13F4E9902F250090DED897B6" + }, + "dkm": "396A4066BA5AA86FB63E2E42F68F89F907F778B37A8B690AE457FFA28698FC80E3EB792A6A33F7E629AC0573F72F6416E9BB5877279B7ADC321DA9FE124E06756EAFB164AB7B64A963C3286E5955ECD8C03E6FE1F4F7280EA9E7739D67AE12F86D1E251F29CCDFEE1FF7618E62BCF2B491EF1C954A917173C72D847CDFC03B50" + }, + { + "tcId": 3899, + "kdfParameter": { + "kdfType": "oneStep", + "t": "28091E63BE176F3DB59F9C73D4102574", + "z": "999D22C41186D4D6B7A97D4C623721D6DE6E70385DD3A1F3AE0176A116A1F69762C9CE7B", + "l": 1024, + "algorithmId": "11B2A368184ACD30EA92EE26E632ECFE" + }, + "fixedInfoPartyU": { + "partyId": "F385BA9B9BC1F19AFD32F9837E7950DA", + "ephemeralData": "D09862924E1B1C0DBB5BC73AEEDC5AF0F6E8833904D1EAF0EFCC40EA4D1A15679659522B" + }, + "fixedInfoPartyV": { + "partyId": "376196F006AA0D66B999315E3A720243", + "ephemeralData": "A396B0E4BA77CA551D2D8723C0BF97AD1036C100528D5C7D24CD3F5FB99F5C6B75D0BFFC" + }, + "dkm": "0B6AF83FD3694278FC65C80389B803D7C4302B2A6C61AA6C6E3C97F1E97BD54E91802D6A4885F8C60535C275A6B69E1C1B60782923CD266CEEAA71D1FEFCBED39E5277E23BD00534331550E6894D9093B81B3F2C204A745F61C65887394C80E01B2DDA5D1627BB32136CDF662A33D892668D3825BC75D40D97B24D35977E4232" + }, + { + "tcId": 3900, + "kdfParameter": { + "kdfType": "oneStep", + "t": "52A57CDF70ACF8330381C4FE65D19172", + "z": "A35F9F672208E2DE2283D1073EE6475A92256C3A1F52C1EC73CACF0719ACF3A34FB50404", + "l": 1024, + "algorithmId": "FF5129A764F10D9FE8528B1BB7D48802" + }, + "fixedInfoPartyU": { + "partyId": "73368DA572160EF92F5DB8E47E5C0273", + "ephemeralData": "A754CB94AC507C11BAF944B6E9A2AEA61038ABAF624D0CA7C6253B8A6FD248771EBDF712" + }, + "fixedInfoPartyV": { + "partyId": "E2F610C9015268387D590F89BAFC85A1" + }, + "dkm": "26E5CC1DAAA01EA85616261E82A51CE51D027971606B95B8C04AFCE309CA160F8A6069629FD877A71C5CBED1CA23E2627753749DD6EA5EDB3535A96A6F5F7E279069357B08CA9C4A3B6DD2C7D88128D5DA021DBED70B38167721B081D940F4860DA78763F9C8EFB07F71CF89B4B35C05ECF2624FDA4EE83543E5E852CC3B32BF" + }, + { + "tcId": 3901, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DCE34DC98C4AECE61380B7A343CCED02", + "z": "00A2E1337C28DAEE5A19B81F894E882AB2529AA09D28EC39C94D423D5CFE4A84BCF6BB89", + "l": 1024, + "algorithmId": "02EAA4828B1E3685E637A4EA300F8D64" + }, + "fixedInfoPartyU": { + "partyId": "F098D881E8A6199B6E4B272414728CE7" + }, + "fixedInfoPartyV": { + "partyId": "AE2A14E5184C4BCAA394500FBA3AB8DB", + "ephemeralData": "314D00397B04B656FEDC5A70DD3CD72E148977BC2C13817C6156F3116FB6FBE4BE66668A" + }, + "dkm": "6FE2A5A33CA93BBE9B0BC26004EDD46EF4EA5F97A1CA73B58E9B4F7CFF54F1B0D90CCD57725CB04E3E7B76D7A516E66886D7E796ADD0DC9DAE87C3BC4EDA50F7629B90D3ED81A13CC4D359062D9F63516C3A2D72A2D06DCAEAA5021CA5B3FE0E74D5B4D1B1BA058122674181778CCB92E778EA9806269CBDD7D3818C84A5D752" + }, + { + "tcId": 3902, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C68E17E873B5A652881027C1FA6E1334", + "z": "1C516616FA3EE2090BAFB60E375CF66F5F700385DF14D1A160E5DE1329DA7AD98A0DFFEC", + "l": 1024, + "algorithmId": "B704DA1B3D2DA5122656BFB1023F1E5F" + }, + "fixedInfoPartyU": { + "partyId": "E5EED69181E7AF42E3E64538B9DD79CC", + "ephemeralData": "0FE75359F432792ECF5FF4790F2926B6250C12F87F3A49EAA03120CECA237CD5A3F5572F" + }, + "fixedInfoPartyV": { + "partyId": "C39901AC655843B5256AEEBAFDF6795B", + "ephemeralData": "6299126FDF2C22F99C365A04BCC76B0F1C7F242B6297463CED559C541CE129E62E08F0BF" + }, + "dkm": "0F22F2AEFFB2336656369BF9A2C87EFC27C6F91EFDB45A8C5A3F7230925409D312F77E0FF54F1BBAD4AD2835D34E4B9351FCAB0B233B6BAC33CF8F7BFF7DCCD6AAC5E427CB94F2CBF0ACD32E71A4D691101F52261FF53DAFCC0E7226CFAD2B82DF8B124DBBF92D534244C696078B8C66619C26F4A7755E9F14FAA879061C3CB0" + }, + { + "tcId": 3903, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1B11D0E157C7EFBCBD08D185680FD718", + "z": "C68F825D86458228E8CCFE78DFEA202D9C988FF78048E1CB8918BA1ED845F37D6A13C9D6", + "l": 1024, + "algorithmId": "87022F8F669D6F5726DAEFD888BC81B0" + }, + "fixedInfoPartyU": { + "partyId": "516046A7DBF27FB8CB4A36912409981C" + }, + "fixedInfoPartyV": { + "partyId": "51482B91759BB05C277EF133DEB5ED75", + "ephemeralData": "00E12589A9532756AE8535FD8BA7E8E7DA94E84EF322E141F10CF9261FD6F60A73865F64" + }, + "dkm": "692C2277EC2D19F9E0EDDA6EDFBA04D0E53A61AB6B4D2B83F1569AFBE4AC7319FFC2166F4E4AC886CA17D98E4610CA641494D56FADE1BB18EB94685D6A83478050D4CACF2099F1605FE8419F0F50C4FD1D0ADCC3426118D5E2A6E01A2BF3F314F95D27C7643A2D340B811679F3D2689FB4317E4C6D3D4955F471CF32DDCB81B6" + }, + { + "tcId": 3904, + "kdfParameter": { + "kdfType": "oneStep", + "t": "568D85FE696B2E5C78174D5850E52846", + "z": "C50EA63185B6F511B993CA0EA937D984751BF1CE0E99472D95E55F18A019BC2D0DB72538", + "l": 1024, + "algorithmId": "63529AEB47FCBE0AB55F7DE8EF4225F7" + }, + "fixedInfoPartyU": { + "partyId": "0D9A5D94144A8168F938440F893545E3" + }, + "fixedInfoPartyV": { + "partyId": "39876360A8238E5F2963FE0DEE5FD117" + }, + "dkm": "C47F8ED4EBAE4FD82F9EFBAB23D00556DD878E6D9B812FF6D88FE5AE62B8F9C48C0E5DF85A3B696B14539A7E79BF840254DB246C1FBD651324044C1290A09DC531C5E886538BFFD1221EAE2845AC94C69088659375926C9AC6BDE76621FA5EFC66B3F0605C7456E62E84C5A5373E10BE1FBD0147A5C3F5AE8BE07E63CAAC902E" + }, + { + "tcId": 3905, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FF5659A9359A433E91B667AAD3591D99", + "z": "40C817E15E3E3765E0661BFA37AEFB2520C6FE921A74B032E972A4080BDEAB56D2B5F855", + "l": 1024, + "algorithmId": "EF6E7856112169BCD2E368A465EBCC8F" + }, + "fixedInfoPartyU": { + "partyId": "0E391E2E3CE7701E7402F8EBB7E60426" + }, + "fixedInfoPartyV": { + "partyId": "5A8832E60E2291D0BCAF552BD9875B14" + }, + "dkm": "6B0D2D7D83C95C11439712BD6998CD015243094C7918F32BA2485E9229E0EBBF52CF172DF4406B3EFBAC24D779EF888A912A2EA6656D11E82C103882D8E6F3B072207311947DC37F1927896A045D2F67679CBA9CEA7B3E4376E4CFFFDFAE68DCF5EB2A80AA3D38C3F0A329D1E64DD7F234EF89550B736F0368A81133C84CFD3A" + }, + { + "tcId": 3906, + "kdfParameter": { + "kdfType": "oneStep", + "t": "278C981BF14E06C379F2B97F56EAC55D", + "z": "CB0B71C53B7CE79F035D3CC03F12C46E62D12F95951C6401977CB879CA93F93EAAE28AF3", + "l": 1024, + "algorithmId": "E18BB656FF9951D398D8EE0A21B6B2F9" + }, + "fixedInfoPartyU": { + "partyId": "EC5BB9EA5E785A3DC6DC1F3163A2E1D3", + "ephemeralData": "B89B73908BE618FEC466024CE74F306D8CB3C150598FD2413C912A909C01E9A2772EB82A" + }, + "fixedInfoPartyV": { + "partyId": "F89905E888FB8A4AF4A1C7A1F73154DD", + "ephemeralData": "1930E3EE7FF9DBDD06C19C5B8EA5EBBC90FC7BD637CDAB0644779D3D83A02B4669F95A5F" + }, + "dkm": "CC2FB8B6C73AA2897A3EFF03DC3C0D7AFC9C474C651682FCA2D21726BE4A2A33B4A1325D002FDF7B56C500A36DDA38DE475D19F45C048AE3B01BC66EC9E70FF28D1DE679B3E88B49F9A0A073C2E8FA24EED20A8FE2DA2F5F5F90771E394540DE308D06A374470AE419A36915D83AB99E9C9E68422D1BF5581A4E496D939AED45" + }, + { + "tcId": 3907, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EEB88598A38DF8C956103A9891F87A9C", + "z": "4238744347F34188F1CB3DB045E31C062501847F2FBF2224252B54776C45EE70A0910C3C", + "l": 1024, + "algorithmId": "2EC2044F7562FCCD8BE516EA9493C080" + }, + "fixedInfoPartyU": { + "partyId": "14245D38A631EB0F44198B34ADBE2272", + "ephemeralData": "8CB1C4DE1D2BB9250BC5369E037AF154C55CBD7DEAB0E1E36135E4532232EF4C2920E792" + }, + "fixedInfoPartyV": { + "partyId": "A0BBBB81092BE3E3A7E18A8B33251918", + "ephemeralData": "958F558AFD698ABB0ABB1FD20FC939299763D2242F1E8218B99AFD2729168A1C6DA12F4F" + }, + "dkm": "90A2C0D8B01C6CD8154D580B816AA4C1C38976EDFD35881AADBC2335207E5128BF4584FC58F0180D098182BAB5C1BE4DD64C62CA13636619D948DB0FEAB55225252612B97E15C8B0C980685F56B851F871E4AE784D6A31F77B925A1BEA49602749F9CD8E79ED0D31B70329C56CD35D9B6D53DE4FD910E59B484967050DECE202" + }, + { + "tcId": 3908, + "kdfParameter": { + "kdfType": "oneStep", + "t": "756C1278F3BE56D36909D2B83C040D5F", + "z": "8EB666475E87811411EA38379CF8BC878CF685978ABD3B137C64DD42AC1108B686C69558", + "l": 1024, + "algorithmId": "CF9F84230FDBB3710074D368BEA2406F" + }, + "fixedInfoPartyU": { + "partyId": "F35C339997568D6DDAFA58FB571919BE" + }, + "fixedInfoPartyV": { + "partyId": "85AC340555C097001D7D4F299C9CEDE0" + }, + "dkm": "99C4975A3FC64F2C33DCC9EC35E7EAD57C7576F0F333C0981476E98C330921516772D071AFC8B51B9A26545A4A12095E6DEA90D102385CAD80DB78AEC7A182C6793CFC1961807E23941A60F943BB6171967997D47688DA54C09439E5890FB8A430DD257EE716FA1846092CA9E62A8B6FC5B8FF54AC70EB1969F5BDE8058B4F06" + }, + { + "tcId": 3909, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0235E5D9F217AA31228CFD8C7C490DCE", + "z": "759C1C2725770F9C95259E4D959267FEA00DA5E935729141FA7017D3E293AF76793CE807", + "l": 1024, + "algorithmId": "3F4E0C5DA41E5D0B5101B33F57C0DA92" + }, + "fixedInfoPartyU": { + "partyId": "3408E137A0E1918C75A8677A1EC9D4CF" + }, + "fixedInfoPartyV": { + "partyId": "F425D34A9FC445FD89D72BA7569F0494" + }, + "dkm": "534F96017EE836AD7DE2A0B01B9F6BC95D4278B415B7E6B5267C80CD31E90B7D5CAAE385B2055D264C983D51A3BEFD65E9C32C96BF2D0FC53375E9AEFEE1D74DDB4FA0B5B25372F559E2161B425B34F0FFA6818DC5819F360ECE544974BC3FA18442842346C6A5B54CD263A2726E13F5B5C85C27D93680F86FEA4E71518EC250" + }, + { + "tcId": 3910, + "kdfParameter": { + "kdfType": "oneStep", + "t": "957EC33CF5010DD5194A9BB8272C1CE3", + "z": "8E05473DAF5FC6D65BE06BE5B1884AF654F43B9809A08FE0B5FE644E9AD54AEC0158973E", + "l": 1024, + "algorithmId": "4493CC2543DCBC739BBBD769B6852F4D" + }, + "fixedInfoPartyU": { + "partyId": "005CF86D4539949C53D8924698579173", + "ephemeralData": "A713E05F6ADEEE9A3251153471630D5BE40795128A99784F0588C37969811CA60FF39F2A" + }, + "fixedInfoPartyV": { + "partyId": "625BBB9F1C4D4E50CECD2ED674CC7F11" + }, + "dkm": "D32E6ECB1F76C5C5B7372427EA6C0AE197290C25C741A5A1ED14B9C527FDAA1D9C1D94D4F4F8F18E1444A3550581D295D9076AC71E1CF35BD174330B1DC155B7A1580004F7F5B9AE1C4F586E97015813B6CF496655C4A9E627A65715D351BFAA4640A8CF449E858C6B2162205FD8072C0832F0886F30DE34A54EC1F988BA3199" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 195, + "testType": "VAL", + "tests": [ + { + "tcId": 3911, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F58F9C67DA93893DD1798976F99959D7", + "z": "2BDC4C8CF5F7C1D4451BE05910EC296466F13E07F6601D71081430D4A09071FD1C39", + "l": 1024, + "algorithmId": "39CAEE21286298EB9763E662C65FF357" + }, + "fixedInfoPartyU": { + "partyId": "7F6E068FEA5BAD3BFD8AB03DBA6AFA78", + "ephemeralData": "20D36A82FE8F72AA81914763E6B8A920BDD485DE993549F69E6D96B5CEF266BD8843" + }, + "fixedInfoPartyV": { + "partyId": "647C1305B39311CF24B42C85054AC6EC", + "ephemeralData": "432AF5977BDDB4511793F5F438CE3B18AC14758C1B6E06422371D575255CAFD54E49" + }, + "dkm": "1C03A2DCF2037DB8E095D9301E82FF6E58E24BE859D71B463F094DA7A88839CD59A1032B5522863F55D8058BF28AFEC7DBFA360BDB74B8CF16ED82438DDF5DEDE2FA5335DC706F7DB835D9787D9D3089961CEC6EC429C8597C8880343173BC3C0B93101D1E59D1894D5C482C275B04744DA928D272D06EF9B0A0C3C4950563C7" + }, + { + "tcId": 3912, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1502280FA2987C4513B9BFF9DA2060C2", + "z": "F0BACEB57CF22F29F0E8A4B3ED32A07BE1DAB6B1AB42BD98E4B439F7CECD22CC9CA1", + "l": 1024, + "algorithmId": "28CD77B7AD05BDF7C51E8AAB6F04A263" + }, + "fixedInfoPartyU": { + "partyId": "E1CA9AD1FC271425E768F45BAAAA1A0B", + "ephemeralData": "B411648F1EEC7C9EC74B3886852F0C97A05102C92E3746C8A4DC3A28E9B3E261AD2D" + }, + "fixedInfoPartyV": { + "partyId": "FA5DE5EEA0A0507E708131570E592087", + "ephemeralData": "9FF11FB8D9AB973607BF8A664843A8A8A683356315BD4DAC4AEC962927A898D533F9" + }, + "dkm": "088BADE0AB049C213D66AD149CB5EE829FB9FE6EECFF305D293E64B41AFBBFFC0C920FEE89D0CAD9991BB8698618DA447A67AC054B87C12D696CB5D29DD0CF7B760806E35877FFA0EF64C987F8C37B67E46DC8D659A3A83BED22B6BD3F93014768FA25B01B7E46F6201479E54B2F610A5D382BD2962089FD1FFC2AE21450AC34" + }, + { + "tcId": 3913, + "kdfParameter": { + "kdfType": "oneStep", + "t": "03A8EDEBEA9C5E7D22BF358B11455C97", + "z": "5637EDE598F4A983FE9C7D5267F9DF5A97C0927994EE710A2106938A780DD1D319A2", + "l": 1024, + "algorithmId": "8D8665C4865ADFDBD083910700215BB2" + }, + "fixedInfoPartyU": { + "partyId": "09E4E8344E2B690AB1D21E80B492AAE4" + }, + "fixedInfoPartyV": { + "partyId": "3A1C3C6E9FE0F50E3556C73A0AC89353", + "ephemeralData": "9D140E2D9B12F129717F3BE3A94C6F5A916DEBC49ACA4D51E85D480D3B170B00CFB0" + }, + "dkm": "82B5CDCDCD2616CF9D2C94AC3C49857AB8F3C67452C2487AD9B48EB2899B78177F8B3F54AE42658C41A85D77EF60E40EFC3F829FE6EF069F80CCAB770C09E928E289C601ABB55D76F1FD503D8D3009AF461AE2CB5FCF281271D9F470BCCD413F5FFFAB8E0AB1D0D5DABE7859A1CF89587E625101C4321BE542D8E80711D73F70" + }, + { + "tcId": 3914, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E0891A720EE05A3D917C4239D5D0ED22", + "z": "D85BF0DC975AEE069ADB5E5DF884FDEF022CF66B83E5C8216C68707ABCB555F8D5D7", + "l": 1024, + "algorithmId": "F4CF181B5AB9E40A4EA53A48432C58A1" + }, + "fixedInfoPartyU": { + "partyId": "E9EEB9ACB321CD6C5F72663F791F4582", + "ephemeralData": "B571FF4CEE283D908B258B89C2B2D725000C6D308FD1158CB51A799978DF5B8B2A70" + }, + "fixedInfoPartyV": { + "partyId": "46F13D9B49E6B0240085CDA37DD0C66B", + "ephemeralData": "4EE14B53F0DBA4D99EB251575C8F9C6A241BA48C692C515CE75336FFA1AD2F11C9B9" + }, + "dkm": "568CB7AB40D8ACD46EDFD76EEB4F19C7BA65B2CF89D835ACC812B592B59089CDD99E8597594092FA2CA6F3F87C96432B100ECFC63671BEEC75E41EBD3DA69E84B472CB2C8359EBF86255877CFB649A51841D85C06616F63ABE333AAE1C62DD466139E5D5DD0B53D2BCB9B1063DEF2FC9C1FA280E65F3DE55E2302F166EF81B02" + }, + { + "tcId": 3915, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1C6763A6FFC92870D576FAB87C9A76B3", + "z": "FDCF0E510EF5B686954ED048658B13F510E4D434B61AC619AFDA28FB9D7D892721FF", + "l": 1024, + "algorithmId": "43428179CF1A3671F70DBFDEF76AC4CB" + }, + "fixedInfoPartyU": { + "partyId": "F4F3BABAB0E108A1717B16C5B95957CF" + }, + "fixedInfoPartyV": { + "partyId": "F60A5ECC324516E73B57D99A91546D95" + }, + "dkm": "3C94892393BDAD17B4DFBEE14A315BA63A47AE27819F027E1E695484E7448B2863330329AD65948CC731B01FDBBD59740EFA2DAFA141278A173CF015933BD6DC673010F7B630668ABB54F82938625FBD9605D94DAFE748B60156BD16D2752F6618BA2AEE97DB688FAFEB87F57F930F9C24ADA9E7FF916EBD0A2230DA93902A29" + }, + { + "tcId": 3916, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2428E9EC4A7A4A2409DE0A21D08AC48B", + "z": "140004A5FE16DBF2A172617A089298B96B55C48C7772F993D5CA128E7B32A6E77B37", + "l": 1024, + "algorithmId": "4B9AA48B2B3929ED9249902517AA506B" + }, + "fixedInfoPartyU": { + "partyId": "B5BDAD96E4774C0578351018F4BD10F4" + }, + "fixedInfoPartyV": { + "partyId": "F88E2FCBFBB388913485002E91902F81" + }, + "dkm": "C0DB60BD77173EFDF595AC2841008801B1EDB441ABD7427E7E96B70AE4FF3DCCB2208C7A6470079002DB061D53DB0303C9CE8CC7E414971540DD174DF23CB858C8B0CC8E9254254AFE1C2C5681A75E7F236F8F050E6CEE716ACF4A38539F64DDE692C8D86A5797528D4334BCB17011929F4EA74B15D2144E013BE3B4363F7DF7" + }, + { + "tcId": 3917, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9CB94211A12F7421A4050829735294BD", + "z": "76169C266F3A312EC31A140C65F2FB4DA9089AAA8F47256FE26E90470D8D34F72828", + "l": 1024, + "algorithmId": "8AD726276A13D0DF381169A65067201C" + }, + "fixedInfoPartyU": { + "partyId": "94C9925CE0994704C24DB0FDA32FFF41" + }, + "fixedInfoPartyV": { + "partyId": "0ED2BBFF5615DEC919E31CC2AABDF567" + }, + "dkm": "ACA667A0DE24D4C12A16F594CFE91F2EE0C06021E6EB15B8C77BBC61476BBA324576426D168B3B58E06A3C7AEAD2AF15AEF64EF828D0194D8569BC3E2C3B30997AD909B484BB7B21DDD95F027FD2483BB67BF03BAC45B0D807AF5DB7282C6E3DF34998190B71D5E90AEC1235B70C94B99658EFC51536A14EFE52764A0FE03BBB" + }, + { + "tcId": 3918, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E06784CE667EA72A5C45115DEF5DAA2", + "z": "1F9EA63E471FE91F434D05B456943FCF8D1A325FFC617DE950FEA2B1CFC524FB4690", + "l": 1024, + "algorithmId": "CD9599D81F8DA41E8B2E86D491E81257" + }, + "fixedInfoPartyU": { + "partyId": "348B75434768C5DF5329D307719E928E" + }, + "fixedInfoPartyV": { + "partyId": "DF4311B782C7AF82D7F59139DAC6A8BF" + }, + "dkm": "0D78A9C41D98E9CCBEA046F81E0ABA59E7C676287C95BC3FE99DC0120257A98BB94263ECE3B476703E2329DEBF9D8BB7140B291AA70581FF0D0C22F2286BE089790C45A18CB24C234E1D44555289C6E022D851ED6DA7DA25A4F0F59E8C6A30D5ADC070B176B300B01B9C3B760CBBD62BAC92F0784C888523105E4B6B339A9906" + }, + { + "tcId": 3919, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4458C51BABAEBA94C7554040A0EE6DC3", + "z": "F9C17F12138BCD2262D0DA9336F4E44CD42A0F251C68DED003FF31348D8AEB107CB9", + "l": 1024, + "algorithmId": "8035AAA0123E19452DBF3A87B629261A" + }, + "fixedInfoPartyU": { + "partyId": "9F94785E76703CA0BC3936F54A992359", + "ephemeralData": "91EC38A9035A6A569638AA16DFE07601C26F1D50F1ECA6666B281A36E98250747946" + }, + "fixedInfoPartyV": { + "partyId": "581F4BB316D3CACD2F623AD6A94D06CB", + "ephemeralData": "14014A0BE222D74B11B013C7ECC5D049255AB92DC224C0CC93EC17C96367A12892B5" + }, + "dkm": "6520B7FAB8E3012505738E39B1DCF6A274B569F6FF6830F0EA4D477BA26E1E3E99E01F93A7DB041C635667389859B14D369C582A0F0833633295C81DAEEDDED196BA34655F54ECCB7D495AE3968969B3E98D35DDB4F3A5BBEAD53AFCEBFB1740D3A2166BC74930A51869B0C5B89DBD2C02BBC4DBC2CE8AA001665629D181B71A" + }, + { + "tcId": 3920, + "kdfParameter": { + "kdfType": "oneStep", + "t": "7022472F1EF0AD5196084EDE19435964", + "z": "E7AF4104C964471F219032EC49D75C3477BE874F82BD2080337E9A168C3B8C5C8D05", + "l": 1024, + "algorithmId": "B7717D720A58D18834E854F471B89881" + }, + "fixedInfoPartyU": { + "partyId": "685DCFD9E8CDAB9BA843D87CE520E504" + }, + "fixedInfoPartyV": { + "partyId": "713F2EB436CF6D19FC2AA1BC99C613B8", + "ephemeralData": "04778E7DE672736A63E9F544484EE82E4C69FBE94F48A76440AD2E195BFAD967697D" + }, + "dkm": "C85EFFF9E1104689ED4A46F0AEC6E2A4B8CAAB5EF8818C9C08F98D78BF9EC270531DF5426A0B8C7694D33C749E7CABE9A89E8AC214F780F0372A8616395A4DB1A59CA7843C53E4249E33D7F918DE67C7F4CFF0FC9DE1113A08D43A6C00FD86EB5159E8F772530FAF28093562C3E2826E3F8E15F66B46F81A7CD67A21A8296E3C" + }, + { + "tcId": 3921, + "kdfParameter": { + "kdfType": "oneStep", + "t": "68F4AAE0F3DCBA5812275635CAD28BF3", + "z": "D761D4EA92C7A8CA66733DE25318405C752EA99CC0D42C5977C13035C65B30665A7E", + "l": 1024, + "algorithmId": "D8B578AFA67DBD0B9A56018355D03415" + }, + "fixedInfoPartyU": { + "partyId": "7A2C3CEADF65B3FD3A35E0408EFB339D" + }, + "fixedInfoPartyV": { + "partyId": "7E90C86A738D16D91ABD514AFD880344" + }, + "dkm": "D0C46EE31F64BB5975528133448D646B15DFD58D49714094BBB348C997F8EB752C455BAD5BCA318ABD5342DBA8CAE9ABFABA943A9963B0CD41793C26061C78402D1CFD96B1488C267A698C1D5BC6AF954C0D39C5CF23F375BD5B68BE86E2EF9753D29C7D8D0A5E9956925C7A7FEBA45FA6577F5181A949F2FFDF3FC0187767C5" + }, + { + "tcId": 3922, + "kdfParameter": { + "kdfType": "oneStep", + "t": "140C40839E70633DEFA7AFA165870027", + "z": "234D8902B11D444EDB0F941635CCCA0F65A6C5273C0BFE34A116B1414E4745DC219B", + "l": 1024, + "algorithmId": "D9526E3FAE3759CA864F8DA88CCAB644" + }, + "fixedInfoPartyU": { + "partyId": "AA3C01E3A87BFF4ED5BFD8910C921D13", + "ephemeralData": "B973074DF7671916E7F70B36D39A330928E7B1AB9F6594FD006B36470B654741311E" + }, + "fixedInfoPartyV": { + "partyId": "F6CF5FE841C2D826D64A12ADDC0B57E3" + }, + "dkm": "7CF0366D93C831A0D4173A27897F79A8150AA0EC9937D59B535E1476951E71EB5B0652DA8FB024FC4553A9F2870C55E434EF486EC58CDADAED75C9AEB02B288D179842D4273F026681B04747A841A87A1C636FAC549CC431AB4CD4AB3C254A997FF672085641AB34EB0DF0243B05AEC34E1E72F789BBEFC2B2081B33D253F872" + }, + { + "tcId": 3923, + "kdfParameter": { + "kdfType": "oneStep", + "t": "13680114E234B0CBDE865617DC9F3392", + "z": "6E7821B0D78D818B92E354B95BD27811AF4611CAEBB62A30554DC3A6ED88DA3703BA", + "l": 1024, + "algorithmId": "474121592382E022C4BAC131577169AB" + }, + "fixedInfoPartyU": { + "partyId": "22E5DF285B26C18EDB8DA4BF66E95668" + }, + "fixedInfoPartyV": { + "partyId": "B20FA576362562F5F6E2495F41F0EF64" + }, + "dkm": "088FC459BC197EA8DFF9DAFED94EFE247B05B536A5902A38CC40B095CFAF89227271F35815708AB1FEA69F767D40CC56C82217D8D92C5DB633590142846D36C54D2935C13C3BFAA3880AFEC17424BEF314526DFE1128AD0CF268989E023FBFDAD76011A69CB9E6FAA31DB14FF069315628277DC87DC40D78A7F1584C0AA9E21C" + }, + { + "tcId": 3924, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2FE2B62A50CDAA958658324BD492B05F", + "z": "B6D9E46F135F314CAB642FD5BADDB593F66216AA16967E1D4570538BE036047A08A7", + "l": 1024, + "algorithmId": "6CBA60177CE6BB9A99642CDBE231BD62" + }, + "fixedInfoPartyU": { + "partyId": "B6FF7FEFDA1406643F247E36B6E50FD5" + }, + "fixedInfoPartyV": { + "partyId": "A439D65CF35A948B9F4B32EC512C2333", + "ephemeralData": "0F36DB2F074BC9EAAA169ADCE864ADC03C25A931CDBB8A1ACF569E9114C0AC319B40" + }, + "dkm": "E3F126442C6598C1AB3E16CA2EDA8C58DB1EEEC26018AB6F0CC0E3157FD4B371D37D5E8F49A80CEB5BAF129679E62F417BCE310CBE74A85A45268D27097B4F5D9331F8497C6F4F12D24988D1FCD166D095D80650121EE1C681ACD5AD376A1CB325C354B65299248CE62819D9CF76E3504B728E898B94E3B5AEE4B9A7E1F3AD2C" + }, + { + "tcId": 3925, + "kdfParameter": { + "kdfType": "oneStep", + "t": "335EDDEED65EABF81032004DFC8622B6", + "z": "048A138FC632B88C222C4E5F6AE626158AFDB8233DD4D8B4B038AD975FC4A20705C3", + "l": 1024, + "algorithmId": "C6A6C0088037E9F17D9C916384325F4F" + }, + "fixedInfoPartyU": { + "partyId": "A687BA3B594C9DC4D98A560204B903BD" + }, + "fixedInfoPartyV": { + "partyId": "4EA021727ADFD3A175B8A5594D38C763" + }, + "dkm": "C8F9121B1CCC0CB04286AF964BF27FEE0A470234AE3FB0F63274DD2E03F812F4C1AA69B71C849266FB1C4D9582BBF9D900732B28136583E7EC2C17EE7D720EF7BAEE8C204010A2404E49E8C1D7D864C8527F0E2642ECAB70D9713495171234D92F2B9272940101E6297E69E8DBA4F390ABAC84A2808DD02BBEF698148A118208" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "default", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 196, + "testType": "VAL", + "tests": [ + { + "tcId": 3926, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3476F443D770BEC43F46E450DD632600", + "z": "5A2B29EFEDFBDF8BF9FA5DF9F8040EC3C3C22B3A4656BD0D5AB88C0462BE", + "l": 1024, + "algorithmId": "523097993081BC9120319BE8B32C41C3" + }, + "fixedInfoPartyU": { + "partyId": "1BA90A87A519A69AA49336714D469DDD" + }, + "fixedInfoPartyV": { + "partyId": "92E36BCA9125D6C43918FB4AD361FB00" + }, + "dkm": "72DED3AB185C85BE124742AD5C3627365058FBF62E85F1FD785A44B4DA20614350B8E84E9889EDF0C274F9BAB0C34430C6B6D2749733047CDD051E21C1F8BFFB054AFD001E9FEC1FC119446B903C23E184A1C5CC947B4AEB35739D1BDC0739907647ED63322F2B4B0BE65608796A573F99654F21CFC1B58E783DB009D361C35B" + }, + { + "tcId": 3927, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0674B09460F9874D5D44E27768CF7708", + "z": "2AFFF70031733B994754110331D411E7673C49E34B1882385A5B1BEB40CB", + "l": 1024, + "algorithmId": "DDA8BE44BA3FBE54118AF87F4D8EB71E" + }, + "fixedInfoPartyU": { + "partyId": "FAFF2C4F4C3EAD818DD304EE3849A47C" + }, + "fixedInfoPartyV": { + "partyId": "83405A2AA8B0A684B262AC638CE79FE5" + }, + "dkm": "1E9532DD57234684D32F7DB8011F895BEDB6BCD6D1F7C3F30622E4346A5C291B4E27197B164825A30ECC1F3E96B361167B20078D32F515D2D1A38E3BE8A4EE3E6904D2C2560395DE5D6997039ADE4BE21CB25C91FD161C5910A87D6BDA9CD05E5FD3481140B850576B1D3E3FBDF5BF8D35A9F66A528154C7366A20E9AF399EF9" + }, + { + "tcId": 3928, + "kdfParameter": { + "kdfType": "oneStep", + "t": "DABE0A643182032BD11563A9A6491321", + "z": "A59AF9185264F6C8CAE5BEB28F4B33C7D5878C33AC25B19E6A81F74DC9F8", + "l": 1024, + "algorithmId": "9AAB041F853BCB1B9CD61CFC43237A59" + }, + "fixedInfoPartyU": { + "partyId": "8930FD809775B618B3B7558D610D1138", + "ephemeralData": "494D49FB77987B7148267F21748017A5522E9356002EF4FF58D4E64F3B56" + }, + "fixedInfoPartyV": { + "partyId": "1F60555F6C0DB863BE4ABDC208DBC5CB", + "ephemeralData": "E9B9716911C1CCE79025B89134E4A6B55D5D4DD3CA0D230A0E88FF80CF64" + }, + "dkm": "83741583FD5381170FB9B24EB6AC393C6BD73CFCCB0B5B6D592F4750C295B6DECAFEC4325968368E1787DD67497D13E852169201D4696A8887C7AB93C7D3DF1090BD2E1B295FE227D4102B509825E982DC14612EAAF95D240C378050BEAAF7FAA94E9F571B9DA699F768C58B2010B557A96E0A895F17B24D8F34728991590CF8" + }, + { + "tcId": 3929, + "kdfParameter": { + "kdfType": "oneStep", + "t": "507929D7D14CFB326AD05C9642DFCA85", + "z": "A9A19C28AF4FBED0378E7726744E6968EDF208E25F422DBBA00EE856A03B", + "l": 1024, + "algorithmId": "D84339F6AF996B17A68B04292AF1C292" + }, + "fixedInfoPartyU": { + "partyId": "88CD8C2A4E64ABFD794F52A049F1EECF" + }, + "fixedInfoPartyV": { + "partyId": "D837E153D8B32AF1F9321E972A400782" + }, + "dkm": "B0C37BA4CAE78873480A975CA388FB35E9841951A17523C528D0DB1871B5215F79A53B00EA562EA4E1339938DE03695EA27D10CE0FD3D474698EDF8EE27D8D67DA8CF20850FD50A105E40B79F46DEE306BEA7EF3ABFB5C84F5BEB906F3928E3C9D4AD2FEE33FBE2EE6D379ACA398EED6BD097FF19A3F7EA3EA9DBC4E566810F7" + }, + { + "tcId": 3930, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2A40B53908930D46EF9C584EB975E588", + "z": "7F92E618CB057F602E726AC691BC37933F0A3BE7F09A86A93CD18343E2BE", + "l": 1024, + "algorithmId": "15EE7740B5D6330BC58825F45FBBA2D8" + }, + "fixedInfoPartyU": { + "partyId": "61715D1FEF3C4C446B335EF7ACF3558C", + "ephemeralData": "0F822D7A4D510335485E4791641AF3C323067DC3818FB8D5EFA84C5B7A07" + }, + "fixedInfoPartyV": { + "partyId": "ED70DC67F31D66E333366C11E6A40D02", + "ephemeralData": "E06A2A2A80E7BC561220D9B57F7F35A7745BFA5844BE8619E0F904FB7928" + }, + "dkm": "22B61D9C066B7BC852F5C1E06423A60FBEADDDF44B514870EB5A4737AB8EB799A4B9D8C8B08587005F861567FEFCE562356BDD0D36D56ED0C3F22B252B144F8D04174747B518AC488CE092C05476F6703FC3ACE05C8F5F98C7A5D73ABF31DE81582CD0412871E07FE7570BFF0E4C420B182B22856198C3B499722FC64BA87553" + }, + { + "tcId": 3931, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C195555297FEE44069AAC2BB647A1789", + "z": "8E66B1083B63F90AC8B0D53A4478B5191227DEF9DAD7BE6AC1D59E4AE918", + "l": 1024, + "algorithmId": "7DABD47F41813AE25225649648A40EBC" + }, + "fixedInfoPartyU": { + "partyId": "CBC8E18CBCADC8A70C899529BFA58CFF", + "ephemeralData": "3BF327729C6C2B83E967396DDA4857B8B99A3A51DE5011C01A0D1E49CB2E" + }, + "fixedInfoPartyV": { + "partyId": "D238B7D9AEE572F2701DE6DAF9983029", + "ephemeralData": "0FB854FBE8D83AD1DFA0A220B4141D98A870B11D4745D9925B064464F50E" + }, + "dkm": "01FB86BED0C86930FFD7BD31C66AE26D3984A0692EBD27FBBD8B1D13F3C0624E6B959C643AF2FC66EA12D6DA1F892C9C32768EE17B3E3AF2DF03ECE7EBF1DAFA29A5CF3913FEDECB14770437AF83B8871A0A76F1A1048C13EB206F69D447D0FE8D9FF262656819131A24705F0A27A6605C151C8C3E73EC8CADB16FB308B90786" + }, + { + "tcId": 3932, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F6BD0A01C9FA9DC3E60F7548967A49A3", + "z": "F8F36BCA630B7758C331A73489D2092E877B4ECDFF48A48824242B286055", + "l": 1024, + "algorithmId": "7AEC1A8EBE9EA98E2BC1EE088E4A1BED" + }, + "fixedInfoPartyU": { + "partyId": "C1A8494DD5C07F56C0F12E68A8EC8329", + "ephemeralData": "765BE7B5321118001ED26249D550B01D5AC120B10791C515D578F6F06E3C" + }, + "fixedInfoPartyV": { + "partyId": "A04027D7E3D6AEB10103FD8EF74ACF0F" + }, + "dkm": "C57047315FB094B284F31A7E6C2F659B0F2DD25CA2709B9B8F1B67FC48A83DD1B3A1F39E75971568E46331886A55E658BA7E7F7278EB0508F69ACB0314DF7AFEF9330DA21E05A134411AA81B308FEAE7BD192126A46E6FA20223FFF3CAFD3599C51DB3763AAC84F1C5279FF2D3917AA93C211D0EF05DD25A868E2719CBD4FD25" + }, + { + "tcId": 3933, + "kdfParameter": { + "kdfType": "oneStep", + "t": "3A5A65A09CB71A5A1072DC7A71CA1010", + "z": "AD09B25470038EA06D319CF823171233F2DB829DC49BB55049B797B8C530", + "l": 1024, + "algorithmId": "61FFA00BD43F14BE234AC0CCAE80766B" + }, + "fixedInfoPartyU": { + "partyId": "F03FB5D515C0C7A967E746A304B95982", + "ephemeralData": "971CDC3179AF2AED4ED6C84442EEAC9EF547932A24C308BE6D7C85A4E668" + }, + "fixedInfoPartyV": { + "partyId": "D3BD21E0FBFBEB062765CBEB3B134EEA" + }, + "dkm": "D96CA4A55C64352C886D4B5494EE3574A6DFEC25D5044A668F819FD138216C1C0D9B6AE444C46772FB452BF8630845BC43F454A7C96005FED4D7AAF2CB823DB6CA643D92EFEA6F6A9FD5F68A1D4A70F1EDF08679DBFB5F83AF4AEA4D2ADF7D2E9CFC8D5A3524C68443AE5A95D7A8525444B43D03BB320A707A59AF589239C653" + }, + { + "tcId": 3934, + "kdfParameter": { + "kdfType": "oneStep", + "t": "452CCBD6179DE23B930DBEFD5447C7D1", + "z": "BD684A6AC94DE35D1664A0271FE7DD0ECD508443D4A88B380B1FFDF38CBA", + "l": 1024, + "algorithmId": "2775AE91B1B4B949514956E2C1890573" + }, + "fixedInfoPartyU": { + "partyId": "66B5AEEF786497166F1A6FAF6E8D7E7B", + "ephemeralData": "48990E02F953C83BA09D198AD2321661B41B0EDEEEC933BA30C654B937EB" + }, + "fixedInfoPartyV": { + "partyId": "603C80E63AD24DB4DDFFC99A6E91FF84", + "ephemeralData": "BA63463C1E54179819AD7DDE6A8199AB2ECD00F0FB4AE94D2BDBBD6102E3" + }, + "dkm": "E9AEA02387BB0D102967ABA2CC8C783E2E98004C0487B84EBB099CD6A009593C7A5BC8AB45A8ABCD284D0FACA263F0AEC510B0B4E9196D1117F2DC9BACA188FB569D2961870B4C4CF5AEEF1B2CBFBBC3AF98EC1EB620603DE787E6FB61B5E811B16B902B5CC23DDF34EE4F4FB298654BF585EBFAE6F92C5B8581FAB6DBEB5428" + }, + { + "tcId": 3935, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F2DAA1A7AC4CB534F1F11BA61591A9D3", + "z": "E90BD21D7B8B7855F11C994C338EF4C3AA1AEF2C458D86E9B2F9E8615097", + "l": 1024, + "algorithmId": "53710D3C297B3FFD31955787516D7D93" + }, + "fixedInfoPartyU": { + "partyId": "02EE61880BC0205A88ACEB9288645C8A" + }, + "fixedInfoPartyV": { + "partyId": "7A16957D5DE9FAA5D64154731D57F18A" + }, + "dkm": "0E07C72ABAD36D3C078378E7501792554EBF27D97BE413C93FEA79C9A3CDC95B65B5BC00B9333904BA290C40D55AF34768B9E2A560A41619F5801801EEFF5E899E1391C99FFCD5CD656CB67EC60A4011340CC5AD2B20BE8D107D6CD61C73EDEC08BDD5A461C57069AE64E0FE1BE0AC536AD3D2F1D377325AF8264A2C71303611" + }, + { + "tcId": 3936, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E349F2889A4C9754CE930654B9F0CD22", + "z": "A413A605AC06239950451866D364217DA5AB4DAC2420CA222B4491BC7481", + "l": 1024, + "algorithmId": "E7329BB2276AF0F6513F5F3E5A7B9A29" + }, + "fixedInfoPartyU": { + "partyId": "4659309926AAF7A2A0DE3EA586A604C9" + }, + "fixedInfoPartyV": { + "partyId": "B67C26988A99DB319E308CB4362B1AAF", + "ephemeralData": "0A16456274E87577146EE88C5589C0C968B71F6E6E31C3423E0025A7A85B" + }, + "dkm": "6C4FB37B8070F463EDA0DFDF7C7D2F0E8F5EE1F5C888148927ABB2556EF463C5276ECFA43E2B676B99F9CC30E7E6F6BB768091E92D0821AFBAB2C5716939EA622CB1B5F6C9F63F166F892830D8E9CDBA0FF7214CC4C27ADC6F85717ADE080787E5B38FA45536B8AAFA662FB8EB46F20FEBA1BC1F8C153DBB38402088A1473380" + }, + { + "tcId": 3937, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AF43170BB724C5EDF31664DE73E2898D", + "z": "AC7850FA360F396E53FBCD99DAC965B466707EF813E07F1B6395670D8713", + "l": 1024, + "algorithmId": "F44A009A4EA4DECCDE649D15E729269D" + }, + "fixedInfoPartyU": { + "partyId": "976BCB92626D2A5FE3F3133BF59AB4D3", + "ephemeralData": "C1995F6F7BE672A02B7AE3443F3407CB685F57D318BFB3767D30EEBE1186" + }, + "fixedInfoPartyV": { + "partyId": "8C1FFA7B422437A2BDB93F74B277CDA3", + "ephemeralData": "AF38BF0C9D764D8CF4ACDF0675FE1A160EB4084C705B08B4278B5E5BA2C1" + }, + "dkm": "D4158BF3F287945B72522AE9D80477646E5E37B637A1A5E624D359B99B98628DC12D495DBA8AA85BDACB4183DC71D0AABAB637BDD196A361CA5E17801545A01582B6CFD8F6BCFAFBD3AED2ACE3F57CA9497B032093CC8C78C6AE0DDCBC170763764CFE625895EC0BCA34CBE48D6E151048C490FB691FBD2EE285F655BA54318E" + }, + { + "tcId": 3938, + "kdfParameter": { + "kdfType": "oneStep", + "t": "704C09330893968C0483ADB693E283BD", + "z": "30C288B77EC93F64660D459A41CAB821C2B55B91F92C96B6670F4A5E3B9F", + "l": 1024, + "algorithmId": "09DF8547D3537BE29C38551E44834CEC" + }, + "fixedInfoPartyU": { + "partyId": "281BBD664CCC56FA95270B33E22ED869", + "ephemeralData": "FFC07844473590158ED32CB98FFBD42EB090811FD73863076FF13DDB74CA" + }, + "fixedInfoPartyV": { + "partyId": "130733FA7E266978F2E613ED2FA123A7", + "ephemeralData": "9354054F1708ED1BC361DFFC3039A38F2AAA084A5F3B7BFB622D6B789EA5" + }, + "dkm": "02A244D121861DB45A2E0787B60687AA309E587AAF7C88C0F6F5125C957A8605F4615BD605417EEEFDCF3736AF64DBC6D2E65630CD47F42B8F0C216A89B4B65D256D20C71B9AE7B860E5726A6FC3E1BEEC860C1E2E4852DD26BD19D87E9B7AFDF92032131EAB6E2CDA3E86285388A06A32AC203974A0D5386195D8DBBEC141C3" + }, + { + "tcId": 3939, + "kdfParameter": { + "kdfType": "oneStep", + "t": "93B536EDB856A243DE351A8065324F77", + "z": "335981130CC41AEA07BC5A66787D672AABD1BC490A5B05A58DEF5E86566F", + "l": 1024, + "algorithmId": "204DA135F3D872B210ECAF2457EBFA35" + }, + "fixedInfoPartyU": { + "partyId": "79D075092CA9EA31EF1BDE8444BD7B23" + }, + "fixedInfoPartyV": { + "partyId": "AB2479E2996B6C68D75BCF743BEF7898", + "ephemeralData": "4F56AF721B6D61ABAEF86A087B004B4A75FD8FB07C468D4B4C278CFECEE7" + }, + "dkm": "5C403666AE754087DFE852D7FC779A9CDAAAE582293769C137A58928738C8658D1DB18E9AAE2DA11D50C8D79BE5769A5DF5A7337FF7DE0927CBFAAAF0AD7EF9452BE81DB84CC4ED7FCFAA1B99ED96A8860D30E6D868AD643A86776C8DF8162A21A77E9E2BCB33B67CFB4B60C8D59909D9E2715344EDDF77286CE60632BAB7E7A" + }, + { + "tcId": 3940, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDBF1092B78EBD356A75225CF64FE3B9", + "z": "3192885EB425C54E5469BF5228DB5656FB70BCF0BCF0E02E7BF2CF400C9D", + "l": 1024, + "algorithmId": "6A1FF9E7B06843038CE92146941E9AE7" + }, + "fixedInfoPartyU": { + "partyId": "B8319F056EB43D774FB9DA136B84F2F9", + "ephemeralData": "4EFB0A14B18B9D7BE80538FEC2BE4DA61D3EAA7ABE489300BE69DC38673A" + }, + "fixedInfoPartyV": { + "partyId": "A53E1CCAD883348F555A2023BA6C94AE", + "ephemeralData": "1D2CB4C93369F385F9833DE610FA97F5A9B8519BEB52F48033DD47200D20" + }, + "dkm": "08DBAC4D4CF8FE41D523B3F5884A4B019206E06CCB75CDC3BF7BB86CA8060D705F8B52640D61A54D09258EF1F3EB4919297251E8D6D149F827544C162738810CFD8C122FB1A5C6772C7AC3CBE7ACA52A4808814398A8C768C85F399D3ECE823B77C71EE2CCA63D8B2123A237BB064A2E7D6CE79189AC36128D95DAB40A1176D7" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 197, + "testType": "VAL", + "tests": [ + { + "tcId": 3941, + "kdfParameter": { + "kdfType": "oneStep", + "t": "46400CD939E30ACF0B59142F84AF9C8E", + "z": "608A816BC833184A7452185BD05B0EABF612257194ABE1261F94A42A7FDE9E", + "l": 1024, + "algorithmId": "6961201195426D9B3AC36576983F715F" + }, + "fixedInfoPartyU": { + "partyId": "E6E88083A3897CFAC436A032F7FC2C8E" + }, + "fixedInfoPartyV": { + "partyId": "56A4B3CB711235694C2DE53C7E2B3813" + }, + "dkm": "ABD986942822A1FE30C2812F196AF79FEE533C3E2F2DE993839074E73D6A666B0D06EC5536A9916CA6D106AEAB8E0E30BD8B45DDA3496BCB8299DF2655EA1568F1452877547E196B02282E897DB12511E296823A5D8B82514020B66A91754B7CDAF7F52490EFC99CF6CCF93EFC8B3A882EA4EBD12338A48E6A38920FEC22B282" + }, + { + "tcId": 3942, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C1A6A0FC6D98B4E1C83AAB45D025EA5", + "z": "2470C8423D8511AB138540EFC10EE7DD9903B7F03876F6CF0E63AD6A08734E", + "l": 1024, + "algorithmId": "703C624552ECCD303436A2CD8BA29556" + }, + "fixedInfoPartyU": { + "partyId": "6593723E66324F42C2D159D2047FB3C5" + }, + "fixedInfoPartyV": { + "partyId": "8606CC2528595C60C82C2AA801DEFCF1", + "ephemeralData": "831D9A78FD713B53881C2391CC51F2207D38D41E0DA07E4B1683C7FF373D72" + }, + "dkm": "058BD1498A15E0E242DE9E1DE3085A9D4B1D5EC9639D87458837B894374C271E1892DDDB9AD2C1845BBD24AF97C48688E40BFAB0D9DE889E9CF85EB5E8C21AAAF0214E5F093C935E25C20D7EF75969BF5AC1892ECD89DABF1CD5199BE104E0E619D35C729CA82784D64B290ADC195AC3DBA440AAED7F958A92EEF35A66D914E3" + }, + { + "tcId": 3943, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C46564B3C00B5D8C08B3B783ED12B099", + "z": "957DB5E8F04C43F0698B1FD7C90D1E307E9C013F57A4C7D7D6E52D0ACB6E49", + "l": 1024, + "algorithmId": "0DEC444A05D0C04E483EC0457C54F6A7" + }, + "fixedInfoPartyU": { + "partyId": "06735FDF263BDAB4DFE279DCBB0B5AEA" + }, + "fixedInfoPartyV": { + "partyId": "4921EDF5E1C7DB04BEA48E9AA6A2DADE" + }, + "dkm": "8AA79F3F311A3FF3C267F69E3C8DC396B6C126278969A8979C97E2FE740103A757967E7954464171E77241167A2A73FC9345E923835E4D544660F914F0FC22E5193F9D19BB29C8C9532FBF02BC11C3DB2A6CFFA3BC327CC20F495D85301040DBA745FBB2300EF85A974802CA89A821B48D8B6F98849A54F7B800422AE2303E88" + }, + { + "tcId": 3944, + "kdfParameter": { + "kdfType": "oneStep", + "t": "731843EEF198A438B3D2D3B1DFB44C64", + "z": "A411E4956C850AB93AD2091C62EE2325FBC07618122A27E90FCEFB9CFA23BC", + "l": 1024, + "algorithmId": "CA6255302E3AD15A92027C39A539DD8C" + }, + "fixedInfoPartyU": { + "partyId": "3CB9C086B7CA3C95CEC55A0C72C7B817", + "ephemeralData": "F8B41A3EE0CD1F5DCBEE4EAF60FB8616057A61759240E9EA69FBE100CD72A9" + }, + "fixedInfoPartyV": { + "partyId": "3358331923875DBD35A44371ECF54850" + }, + "dkm": "DA681984F34CB99E6AB35D933C14EF75303799E83F59ABD8DEF30E2F329E5BD503954762DA9DE58A26620346F003A985BC5B27CAFF5AA3A0964B1FB16CAD1D09C55D44D9939268CE0C3F57B05F9FA8AC85AED5583238EFD92EA0290D522D0AE76BAB0EBA578825AFB29D43CF56F846B0714A24793A76EBF998D7A30CFA832115" + }, + { + "tcId": 3945, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9D0564BD56AC5D16646DEDDA29C8FB7C", + "z": "2F233B9B2A911EB3F640B52AA142865A33FD36C1C32B388C072427F699EB1D", + "l": 1024, + "algorithmId": "318FCB43E51B4245EC7AE8F840F58CA1" + }, + "fixedInfoPartyU": { + "partyId": "2DAB29AFF03BF3580A983157C77D3CE0" + }, + "fixedInfoPartyV": { + "partyId": "14516CF995D7E5F5DDE7DBC27AD0512A", + "ephemeralData": "875E74C04B62E996611EB553E9711163738A474F7A364938ED29DB35B884E2" + }, + "dkm": "D272586162CCF72D4847A370F038306A5FBD392FB39887DB9FF7E63FBD53B6FDBD7EC753BAFF76DBB4E53DEB092822B4AF432F4A354C2B7B2E8846A392CDFEE1F752D14F034E9114F85730DC3C5E4DD041041EBC2C1AC48D33D86C069472C5C5EE5572339562445DAAE97A99D23F0A7249E83092670319495DA6DD13842D8375" + }, + { + "tcId": 3946, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8B01E836CB196DC566BD19551C345934", + "z": "94D1515CDECCFE2FB5533EAC385DB8AB008B64454D48EAEA82C6ED332022B2", + "l": 1024, + "algorithmId": "C7F6EA961D5B4085CB9C6BC9A332BB49" + }, + "fixedInfoPartyU": { + "partyId": "0177CC0C3149D76DD9C2CA746AD03F9D", + "ephemeralData": "63A821F5D5CA83F5E08B209406AFB4199926E82135F06D5F4D54AFD9126E6D" + }, + "fixedInfoPartyV": { + "partyId": "85B88DDA070B83EAEDBBBEE2EEA4CA86" + }, + "dkm": "B2833351563246E1898A2FBEB1B003415051A4382BBA337ECC4E1771A8950AC4E6440345C40841B2B9A9132E35F89B7EFE877CAFA16D5C529204BC83AB8E8FA2E04DE1748BA3DDB8161688ECF7F638AE1942923C57934ADD278688E5A50C1312A5609E69B8E7CE49C467244A103BF009DC47C1E6CD2FF681660F53C440B6ACD9" + }, + { + "tcId": 3947, + "kdfParameter": { + "kdfType": "oneStep", + "t": "88DB8DF83EAB06182644516AE26FDA73", + "z": "C858F120F013E76F630B57EB1FFA2A8C48CA45EC937B8E2551CB7B41FBEA7E", + "l": 1024, + "algorithmId": "D7A06B79E1ACB3B1C0969C27083A2CC0" + }, + "fixedInfoPartyU": { + "partyId": "E158BEEF534A88A75C5F708F6224D724" + }, + "fixedInfoPartyV": { + "partyId": "353330DB685A8C867230F06DFD141EBD", + "ephemeralData": "57CCF305E308EFF3E6B6CA44D263A1328EB174B70D62779ECA1CB96721146F" + }, + "dkm": "2A1AA4A97AFD5CB99C77AD6B5D21458F52EE24526D2074B32C275647EFF50A473F586D5936308BB6F76DB9D1D8DA9AD2D30DB0E31EBFC962D101F6751392F5C30BCAC37D512DACA68076C52AB28B9F6A27B3495F60492949501DC41DC5EAA676909410B5953373CB6C72DEFE7F478131284C86306B085B6F962BC462EBFC5D1B" + }, + { + "tcId": 3948, + "kdfParameter": { + "kdfType": "oneStep", + "t": "AA3B8545EB228A66CD7C18AE5CD940AD", + "z": "77666B2EBAAB0C0899A9A43A2D50839F92CC402632D364B52F6840B35F7872", + "l": 1024, + "algorithmId": "267428831AF5B2D128AA63FAE37D069E" + }, + "fixedInfoPartyU": { + "partyId": "75223F150A85FA130E32D7C25F4B774B", + "ephemeralData": "46068E2CFFA502F273886B0DE18CB69212D51C67B7CAA521F840CC34C6D73E" + }, + "fixedInfoPartyV": { + "partyId": "F7A67B0C1D3D52367FADF86931E13A67" + }, + "dkm": "5B2A1F72B8FE5CFAB80C340D2553470BFF84DCC2931D3D5EF120C3CD3AD0634032A76E3D8C8C1A49F65DF6159C6BB98A57E6224967F30AAF4CA251EAC140B90321A1E9DC79DFCDF8CB3728E53657F6304558A25CFFBC7E09504DC539B96DD9BF44FCE0107A1C45817825E94807033525B157D08B2E2D4910999D67D5B5E7186D" + }, + { + "tcId": 3949, + "kdfParameter": { + "kdfType": "oneStep", + "t": "69E87900E775481AF377B477AD7A7FBF", + "z": "2C7079FF59C579F7534ED916B623768C201DE8A5B506C69D4A6E6A106BF3F8", + "l": 1024, + "algorithmId": "C1CC08F2E8B6B15B2D57EF4873B9F1AC" + }, + "fixedInfoPartyU": { + "partyId": "0BD2FF70E6DC355056BC9CFEF04CC8E2", + "ephemeralData": "F8E267FCE166CCBAEF212D9BDCD3DA56234A15A59674A0AA90D2C3DD71E928" + }, + "fixedInfoPartyV": { + "partyId": "3AB125285E45BCF61E4FFE8FD75CBAA6" + }, + "dkm": "C322CCE0F5AC774E52F8F12FD033B797F3181E458AD28A7AA06CA116A1991D2C91D02F73A3E66B762458D419C323CC2246CAEA947CA23093558F5393305BAF927C532FE5C3BC63CFD05B073C45E3E88D5CFDD7B5435A7E414063D839FAE8D236A8AAC3613C2A5048902BA475392CEA7A306A34FB4BA18B383CCD98E3F476C8B6" + }, + { + "tcId": 3950, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6E99186A8E5A11F4285EB83F3007206C", + "z": "BBAB6466BE091800ACCE048872F7513070387D64ECD50B03CEBFA5B57B51E0", + "l": 1024, + "algorithmId": "C5C9B3DBE561A5052539BF78B33276B9" + }, + "fixedInfoPartyU": { + "partyId": "ABF9CC6A250352AC1F13388A04F20BEC" + }, + "fixedInfoPartyV": { + "partyId": "609F67019B9C7AA5116A11A6723C2AA1", + "ephemeralData": "EAAB8477BDE4F288FA46496E39C5015D1F3441A90035C5D73DF7E6338A59FF" + }, + "dkm": "D49C70EA91F3FD73707A8D7B1B8FD7F1E779916416FFEF549668444B6E1E50971A4090A7084E1E2F7DBBA6DE15C25D940F1D70CB23208D4587550A2317A6E5F5BC37CF52867E32FE629B454CDCC953C435D2629A0AF783425ECEF238E3AE18859D76BA555A7DB2A018E4CEF3488A70E2CFBB83E52AC64B1E6D8735ED459FAEB7" + }, + { + "tcId": 3951, + "kdfParameter": { + "kdfType": "oneStep", + "t": "9C81A94023C2BDA55E0FAB1B661A5BF5", + "z": "1AF9EFC9574BA93E689509D6739664EBD5AB92974B56986016617EB1D1FE22", + "l": 1024, + "algorithmId": "F53255FB5E18425F6B7EB8906EC49269" + }, + "fixedInfoPartyU": { + "partyId": "2266D3E00424CBC2D8FE47E04A7BC0B6" + }, + "fixedInfoPartyV": { + "partyId": "0601BD68B7B14F12F212243F59BD891E", + "ephemeralData": "0E5A214CF8CE58699C77D19D6BB491431BEA261C6691A70D67F1BE22C1E821" + }, + "dkm": "F9B2A6D0E3F1AF4F452CA49E1B1F08AB59193F3B4BE2BF1EC73E3163127C9AA89EB8ACF21BB0F644BD0D4F7669E61A5A5A0C20EE0DC94113A50B9520BAD1982978DFDDA8B60394CFF37BD7C2F46484D889A38205EBB0C8A17E452643582279086DC052B4F42B03933EAD4A1C4EB7F1DD48A70DDBAA5CECCBEC1F2ED7CF2BBA7E" + }, + { + "tcId": 3952, + "kdfParameter": { + "kdfType": "oneStep", + "t": "EEA2E9FB90D4F43031B6FC79BF6BF9A0", + "z": "1200B6D6B8E2F56BBB3B85A17F3DB46E974163CD90C148BC06A394281CEE38", + "l": 1024, + "algorithmId": "72CE07EE61ADB8300D918ACAE913AB67" + }, + "fixedInfoPartyU": { + "partyId": "CDE86BB777AEF3FDDDA6EB0028BF1647" + }, + "fixedInfoPartyV": { + "partyId": "470630EBB233B033FC680069BDDC655C", + "ephemeralData": "C2122B723BCD2C5715DD55245179C9140C0003C4D7AE81600E839718A3B649" + }, + "dkm": "007E855C0968E017BF79EDAD3E38FEAA1ED27DE0EAAC9FD86CB37F9EAAF5D0CD7C0752D78B4B5BCF2C2DBCB713009E998737A067A9CFF4E56041A8E704BE2A7EB2AD70BB41FC938642468FA1A2A5C5D50818686E9D0F2CA97EF4A4ED65668F297B62D410CE27D31E64624AF34C39F4AC55173A19DB84D7672E176BA28224DA11" + }, + { + "tcId": 3953, + "kdfParameter": { + "kdfType": "oneStep", + "t": "A4C1B80E539751956E47DDABAE39DEAE", + "z": "111B919D8FA34089F6FDB2EC94A5474F972598B8ECE83A404C41FC48BBCB14", + "l": 1024, + "algorithmId": "B61FC99BB92987231F6E28EE25118767" + }, + "fixedInfoPartyU": { + "partyId": "D68EF1C374F8916CB9D70ED0A484C66B" + }, + "fixedInfoPartyV": { + "partyId": "1EAFAFB1590832D516F2D523680B47B9" + }, + "dkm": "03828D3B0F62239AB41A60B01F7F48589873DD632B4E5DD72FE507388FC17D664AA44C4E7A486A0108BB1DAF716A99EA64DFB9397C576DD7CC1E711EC07D5A300A9A4901156456478969F4C2C373DEFB3243765F56E09A0893F45D34C3453ADD1860AD85315E6ADCCFF17FE7878AAE87939FB46A73F6A0B0A46E1476C23FA82C" + }, + { + "tcId": 3954, + "kdfParameter": { + "kdfType": "oneStep", + "t": "577CA9889074C187C75DF6F76417B448", + "z": "F7FBE06165C38A98E692ACB1AF53E2D2F4F70E3A8F5A4760C822671B9FB05B", + "l": 1024, + "algorithmId": "6B0B03EC96A9AFF6808B5422ED8AE88F" + }, + "fixedInfoPartyU": { + "partyId": "B922679D1CB6EB2503F0633B3B52324D" + }, + "fixedInfoPartyV": { + "partyId": "4C8067BCA49106CAC9AACBFA35AEA2CC" + }, + "dkm": "415B4594DE85769AD81B4026F5D11344ABC6685530ABF4951CEC1717723EE5DF734B88393EFE1F1C0365241D848E727E7A9197404CE6D32377179D868FA68BD87BE29C1C27FA919880ECED36451180EAE4E15BD8ED7D188415BED6FBEC7E6D070488EDFB94EA38C3E3E73E6D7D9CF7ACDC7CFC4EE0D56EC27807775632AAED15" + }, + { + "tcId": 3955, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8781F24DB60C936E401CB53C25C5D9F6", + "z": "A37B29319C4AD6872DE71EC4F237DE04A9AE58FB5CE2FA9B6DB70C2D4DE297", + "l": 1024, + "algorithmId": "84CEFE3FD28A763AF03235C50A8BF33D" + }, + "fixedInfoPartyU": { + "partyId": "E72159592B2A6B3E78A1B05C3A03F548", + "ephemeralData": "2ED4BBF459B3BF3C544C745505143F7E723B1BC156C6B4B068BCFF15D808EA" + }, + "fixedInfoPartyV": { + "partyId": "22B64BE9A8899B39488EA32047DD63B5" + }, + "dkm": "0AA611FE5F97E6EECC33ED0CB15D9CA1CD47EED1B5CC96DB37F95CA9396DB24B001FBE657BFD9698EE28A082202B0C12A73F5E52557736026367B9B59319295B5F6AA1F386A3FB63259294CD097D31343429DB5C8491450EDC1AFD65D2B484E90B862414CC6292E0DE313C2E84C398378AC6145910113AD80F90C1884E413784" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 198, + "testType": "VAL", + "tests": [ + { + "tcId": 3956, + "kdfParameter": { + "kdfType": "oneStep", + "t": "00B5B8D418AFC599FE35C9C19B6285F3", + "z": "172D44730DF0F9C687D713C2AECBD286F05A7F074383B724FFBFD2F644", + "l": 1024, + "algorithmId": "1C207C202C4089E30512C7F2DD7243BA" + }, + "fixedInfoPartyU": { + "partyId": "49BA57DECDCF1C60AA2AE73FD42B31F9", + "ephemeralData": "0944A54E20A79EB08554D6496B89DF8CB2E1FC7D78DDA5116AE4F3120E" + }, + "fixedInfoPartyV": { + "partyId": "2D6AC7F6851F8F333A326432A73E6FA9" + }, + "dkm": "C0AE02A8FBBF4EFEEDBB5D03FA8E28F5E83F6D1AC9F4C11740A485B5C0FB8577663C28955F465BA38005FB45BBF76B2B6CD058DA1BDE0503747A07AB40B114BD69046ACEB8EAC72ACFD321800A7C02B68395735B722CA37C6F58E43B79DA13F79830F3AC45D15156D3C47476A378F2462A0DE9AE7857BA99B14B7AD94896222A" + }, + { + "tcId": 3957, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6B1E247D731C2F94B2DA46AE46564DB4", + "z": "7F3729F77B942C57DB310E61DDBB8C84F39E09E70DA1DA42234A3EA782", + "l": 1024, + "algorithmId": "02A8F6989CA50158FCBF9C66BDA955DA" + }, + "fixedInfoPartyU": { + "partyId": "3CC739B57371DE5DB7F1193AE3347F4C", + "ephemeralData": "BE9C837F039B6AB9BAD568C121A3182CCFAA7A2A8FEC151C9660A20FBE" + }, + "fixedInfoPartyV": { + "partyId": "76EEAAF71E62B51F9419383F58641E26", + "ephemeralData": "B7050B020EFEF38F52150C692E7998175D07A40581675F7893D059B18E" + }, + "dkm": "07FE86B76D5A934D5FCC427523AE0AB51E8A36E06FA27C51B0640553E24737C5D42CCC005163E6B6DE9AB6F3501639B5FDEC268ABA93B58A793194007150FF287EBAAC345AA13FD14939621A0A497DADB6DF1C8140EC77FA7503D87EE0E2724F3CDC0ED993FDDADE2D1337E45CBBE9EB3E7C838AACF55AB82EE0EE88637CF335" + }, + { + "tcId": 3958, + "kdfParameter": { + "kdfType": "oneStep", + "t": "08F16AA4EAB9CCCBB0DA51F43E5DA097", + "z": "D84E7969D1663BE458AB51C89528D5FC39076BA992D19AE9B90F3C2991", + "l": 1024, + "algorithmId": "E0F473634B559BB49D4A921B441AACB8" + }, + "fixedInfoPartyU": { + "partyId": "E64AAB8C06AE26E5363ABA4CAA4AF95F", + "ephemeralData": "A5A3A1B0F19B41EC5D21B032F84B70503DD6EDACB04618DC5591F6CE77" + }, + "fixedInfoPartyV": { + "partyId": "4C0E9C64321D0A4657AAF2FE80F138CC" + }, + "dkm": "74381F0D7470CAD4B14F3AFD13B867DFF846AE3C3DCBC9E345BA1B166CEC03FFF4DC325820C4107E46994944BDDFFC5DC657EA12DB1A0C3B768BAB5F516000D92173AC241736E91E61D79FB5DC56BD850AD64FC507F32D56D379ABE6DAC521EEB1406962206BB75B8E0A77D9F47B5F5D5E7478F6F7E5E3572158218C594C0784" + }, + { + "tcId": 3959, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CB68068415101BC2F85BB6374356AE8C", + "z": "5C555A60BCF9794261DE4D42CD2B6B0865A0540D8B5D15464F09452445", + "l": 1024, + "algorithmId": "C43D577FE4551D8EE1196D711C5817AF" + }, + "fixedInfoPartyU": { + "partyId": "6229B7F999467533125A9F8AB5885C03" + }, + "fixedInfoPartyV": { + "partyId": "C0ECEF4D4CAB036989B84247E5B0B992", + "ephemeralData": "C6AF9C212BCF1ABB76A5A1CD02964F8A684507CD99181069DBEBCCB188" + }, + "dkm": "8964533052F1C57615C0D6959584C6217AB53694FBA97F4CE04A836AF48CC0B233DC608F8A65D516166AAAE05AAACF4A274A0FDE40AF79BE44E38494FE161E19AF14446B6145F890E9229516C86EED3468D6629C777A46EA5CBB4DFA64262127E29120A19B244BFE5FA1DFA1A80B900956D85A5DBFFFE381F00FDA72015FDF6D" + }, + { + "tcId": 3960, + "kdfParameter": { + "kdfType": "oneStep", + "t": "75994FA8C362600F4A65C0F360F354B7", + "z": "2FD7A48DCA1333921D7C63FF9F8CA5E3E67C3CD53EAC8B8842F49E6FE0", + "l": 1024, + "algorithmId": "F2121B030ED0E4F1105F9138B4D72FD4" + }, + "fixedInfoPartyU": { + "partyId": "831E2246C82FB01E7D942E5A4BA1689B", + "ephemeralData": "B3344E800E10B48B309A6CA37DB4E3B4298A3B4D571DEBA824D6BB2C63" + }, + "fixedInfoPartyV": { + "partyId": "59E0022DB6BF76591C7729E1901570D6", + "ephemeralData": "E4AC2C23976C8B48FA25DD8069B75AA4C8AA77D8B8E8B17FC9144BFBF5" + }, + "dkm": "B181F2499D8F76CE5E933FCB82DA5FD3FF687044567900AA8447EB20DA60B869F0854BE71CE3D3FE354C627147EDCC0DAD59BE2F971F1D3716DF72C67051B6E6E2E66B1161DE9F812815109523F5B77358C26047AC224370329C8EABD638485088247F717297A1741A8CC3824A2D61EA85DBD64DD242C17DFBFCADC01021EA8E" + }, + { + "tcId": 3961, + "kdfParameter": { + "kdfType": "oneStep", + "t": "F27B3FA0374F2C77FB13A9CE0395184A", + "z": "6363C764976839242514267922E1B848736E6383C00A3703959890E96C", + "l": 1024, + "algorithmId": "92F1C8724E9160099EEAB2903E60AA12" + }, + "fixedInfoPartyU": { + "partyId": "464B438AE147FD583889E19FE5CAFDB3" + }, + "fixedInfoPartyV": { + "partyId": "D33C300127AF47CC671827146D732E88", + "ephemeralData": "10D999D27EB1D69EF5EF98DCF222EEE19A33DF7BC9A92F66D38999850D" + }, + "dkm": "02582BED84A71B9D11FF74637F7B69B5BE4EEA1A9F631B4455F8ECAAE2C6EB05C5D3E66118F76347521DF08D8662F3727C8C53D6E76477CA233BC72E6C8259A348A4E6210D5150CD191052CE6CCA56437B7CE93FF7766A88556CCC29EC40177C65E77E7190DB3B5305E25274BA8317D764F26E7EC241BC2AEB8B2E9BE56DDEB0" + }, + { + "tcId": 3962, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4D5D30F48A9DD169BB862DB210197BFB", + "z": "D486BD02C786F00F0F5B5C59D9AA9A6687EDED66BD82AFB3C260A4ADFF", + "l": 1024, + "algorithmId": "2737BDAC411C20ED7C11725826BD4EB4" + }, + "fixedInfoPartyU": { + "partyId": "3F4B5397CB4765D719FF42CEC2BD8886" + }, + "fixedInfoPartyV": { + "partyId": "29F6C0981DBDF03D01D39AB1F3370233" + }, + "dkm": "5816730ED3B89CC51369C6C28D4941597FA334A2632DBC5612442BA3D656994BCF10C9476B433009952BB934CF9E856533461C51639D41A9AE59DA5718964D612D7B119222574C2BE0DE15543C32B32F9498F736279A091F4A5187C50D16B250E09168F181544970AF4B4833D1DF2A8AFAEDB016A6EDE87ECF9F9C0FCE511026" + }, + { + "tcId": 3963, + "kdfParameter": { + "kdfType": "oneStep", + "t": "26C29738169213B165B9702C4EC66BFC", + "z": "30489C775EFE68927179223C72119A530B06CEB100B3EA058B4040B199", + "l": 1024, + "algorithmId": "C7DD6B80354ABCFFD7D0C35B4DDC176F" + }, + "fixedInfoPartyU": { + "partyId": "A27A4E1380F73C9C2BCF9B23FA689EBA", + "ephemeralData": "F92BFFD6E5CAB8E70C66124582A26813E2414807B54874FCA381785D59" + }, + "fixedInfoPartyV": { + "partyId": "86946DB2F3A216AFCF3F1DAB5BED445D", + "ephemeralData": "72702ED2D329F637E65BC3584E49FCCD9BAEA572A63C680891DD8E28B9" + }, + "dkm": "588F562BE1FB0265C8CA9E89939A8470E8A27812EC90A2D78E1B502E686B4DE2673543BA3F92CA92CC3F7AE039E54ABC695A25903FDB236A50F9F41DE828A9C2572B3A7364B6C72CC5458BF5BE6EA27373C6908D2090D1F433AD1B9DDFDB0256DF20E7210FA699671BC5FA84F086DE252F01438CA2E4F9E001060FA072E2ECDE" + }, + { + "tcId": 3964, + "kdfParameter": { + "kdfType": "oneStep", + "t": "1DE5004FC32FA91FA3D74433DC8D8CE8", + "z": "42D50DB08B9073DA05F2F3193595C6C8537A995E404BD60F767A69710B", + "l": 1024, + "algorithmId": "6C3D69644D06F5FF37FA727E2D5362D5" + }, + "fixedInfoPartyU": { + "partyId": "ABD59C41B5D9F5C3FFF242E90FFFE836" + }, + "fixedInfoPartyV": { + "partyId": "0101C6EED8FE3118F30C368E99E3564F", + "ephemeralData": "26F310D01BF2B1A7A8F1B6612EE59D3EC33C1A237295D4866A6B9A750A" + }, + "dkm": "36FB763EE8C4BE740DD4811FECFC23D59BAFDF7949987DF7936094DF551E5B8BB23D5B454531AF8A6CB31330263DB6CE63A45A52D7ED72816289C22DAF9765C092EC15DB0FE657F9B790E2F0DA86DB2AABA21889B8DD41101518C08BA63A577421CB5EEC8800CEA3074C78C83E4EE1A0EFEF4CDD52443552DE3BA4DAC8CA4B4B" + }, + { + "tcId": 3965, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8E6235F7F79331E2FC411890EE1C000E", + "z": "311391E2780C535EA58043D76D7214183FCB7820072073DE65001735BC", + "l": 1024, + "algorithmId": "A41E63E4A26663988FD6C54573DEB924" + }, + "fixedInfoPartyU": { + "partyId": "9F6FE6FC8C303F1E4CAEE6D8016297DF" + }, + "fixedInfoPartyV": { + "partyId": "604D83870BE15DE8E1F11F89211DCABD", + "ephemeralData": "41CC88EF1F70775510F6C625026CE378A9F413984F26663267C9168828" + }, + "dkm": "4DD03582B0BBC728792610F32D1E20995C245628EEC667E71297D16AD5C3024EBA6FEACF5669DB012CECC560FCD77D8425E748ADF450C8B2AA10035222163413746AE743224C7F74B43A0394D357215A182E50516CFBE3046D4D06DCC0F284023FC76AA6FBFB4229013CE743F8AC2CD712AE790BFB181C3ABCF3C5A65C2D5C4F" + }, + { + "tcId": 3966, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BE43C277C736086784F8A89C1F315DA3", + "z": "73C090E5547324014CBFFA4BE8B6C8DB16B69C9C7302C947A1FC4111DA", + "l": 1024, + "algorithmId": "81DF5A55A633EF5B168CAAC8F86A4D1C" + }, + "fixedInfoPartyU": { + "partyId": "0B00AB2F945CDFE31944CC74AB999EC5" + }, + "fixedInfoPartyV": { + "partyId": "09B6BBA7CDEDD87183C82CDF7F3F8B6E" + }, + "dkm": "6D54A779A4985A14EFC28EABFCD4E244ED9720529C2EC7CA99D8B3624553B4662708C89BD7253CE9D2294591607A273F4BB3A9CC57514BE984CDE802672AB2BB4AB18A8B012DB2ABF81CE7412BA5148C4A8EF8E82BDB37F7E8A5D724B963A98540D545BC5010ABC1CF53F223CF303BD4C0977CF768BB92621F515B01C2917EB2" + }, + { + "tcId": 3967, + "kdfParameter": { + "kdfType": "oneStep", + "t": "5C31A1ECB43FE4C91D0997CA30C181F5", + "z": "8FDA45D363A9B99B6E4EE52FA01138B3292D53A0447E54EFCF491BC775", + "l": 1024, + "algorithmId": "C4D520207B5C14D503D883EDA8BC432B" + }, + "fixedInfoPartyU": { + "partyId": "440FAE2137C89045333D1E00E2341623", + "ephemeralData": "39F950E0AB4D2DF1971EA35E5C424D945557390CD6C0DF0C8E605A7D2C" + }, + "fixedInfoPartyV": { + "partyId": "03122A22540A94E4AD6173AA4F99A365", + "ephemeralData": "CA99C97794EB21AA08A0687086E6BBAEB40D503AF7266B4FC5F57AFBF0" + }, + "dkm": "FD86CCEC1D88952392BAA4B94464CA7FC2FB851BAF6E1968B0C57C34B266FD29BC4373F48D26CCEB0976F32D0B307121BEBA6DBB3D3C49357FE60530B696A4F4BA8DBEF4DCE2DA39CAC802971CDB130ABCD2CCE353D7D3F3177EFDCB4816A16B774CD177DC58388FFA83E5D181599BAD68EACBDCC09BE095629CAB7D8D4B78D3" + }, + { + "tcId": 3968, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B8B468DE8D1BA59371857CAADDB4D0A9", + "z": "A56610F42BF04160B2BAABB03F560DB52A7A33277499BE69BD47095832", + "l": 1024, + "algorithmId": "A46FA6DC590BD99F90D1F37B4184DD10" + }, + "fixedInfoPartyU": { + "partyId": "3C9F673140EE45345CCA26522537B244" + }, + "fixedInfoPartyV": { + "partyId": "B90D4BE3B663155DF94670E4251C0262" + }, + "dkm": "E9C701CF24DA50F9F78CBD068D32A10390BA7E6438437F425DD0657EF2204CA41C12006DA46DEFFA569E2BAFB01A2BBAB34552D61BBD692768ED63E67CA456000B2B99B866B83EDDFF3BB1EDA7539E6880904946C03AEE951164ABED284C3DE889BC5ABB6CB8CC147CA1ED097B1A58F9DFF4AC925F7F3A33E2F14E128345E995" + }, + { + "tcId": 3969, + "kdfParameter": { + "kdfType": "oneStep", + "t": "005A5593A3727AA9730B659C29E10F2D", + "z": "E4CAA3827F79D4BFEE2BB42ABA4DB5FA11A2273D432D790C417C4A0329", + "l": 1024, + "algorithmId": "47A63D176D1AA144511356454CF58BDE" + }, + "fixedInfoPartyU": { + "partyId": "3E5EE6B495210529F314441A47EEBD6F", + "ephemeralData": "969324905AA1B6F75A387FD449AE69BEFCD12F6A112EA169E925C4AE61" + }, + "fixedInfoPartyV": { + "partyId": "E5DA08194C5486BE06F420153A75D93A" + }, + "dkm": "DA15C06E7FE01A5D25D53DCC7CB93E3DD89C5F79094ABA69A4A50908F1BB0C7C562B50D5061F44FF8D44147ABC5D3A85602C247568B14B089F1F6D5FE09EB5641D47C190616DD7595E50FBFD69FBB0633ED6E690DFB17DBE7A0D4484DD91C6FBE43A8E5E8F6FE536A827E0887DF97EDD3E6A19E05F5C3BA83C51E190937CD049" + }, + { + "tcId": 3970, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E948CC601D346363E64364D43673B3C1", + "z": "0929ECD91286E546E070ED5230800C78154B661324C2431A0FA97C51D2", + "l": 1024, + "algorithmId": "5248EC6D792304020D6B3E8C4FBF55EB" + }, + "fixedInfoPartyU": { + "partyId": "FEC111B170A6439F701BA739BC36AC4D", + "ephemeralData": "00460F910FF0D1DB8E3066D6B8192E3697F56B8B09D8DE0EEDB456EAD0" + }, + "fixedInfoPartyV": { + "partyId": "AF1B30E4579E6054D201081A8824342F", + "ephemeralData": "D8C87663462C2D7C6C4756D9D797FF5CA46519F468CE5A3AF856780D08" + }, + "dkm": "0813348AB9C87A66E9921FD29C987D46207FA0F1240523B54FFFCD1A6A853F28CB78B241424A48CE6557E4434ABCBE1CB9077A19EFFD7EA143E026076E8838A30B1AD8628B285123DA80A653D5EE6B91E5538161FCDA7E39D03F8D79336897F7A87882B3778D5E2D58BD3477319B058D0C2DD1F5A5D8EE920CB395DB4B12BCA1" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 199, + "testType": "VAL", + "tests": [ + { + "tcId": 3971, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E13F90D014A2FED9FBDF384F07E31D97", + "z": "E09D809BF8872A746EE9CE3CE057009354BACE32CDBCCDF28369F374", + "l": 1024, + "algorithmId": "884C97092E6327428F2731DE767B7A31" + }, + "fixedInfoPartyU": { + "partyId": "81D41661C995C92E15BA82E8B2BF138F", + "ephemeralData": "3873B14246116C080F1E3EDC3072E8706C4A6CD0A602D7C2A7D8678A" + }, + "fixedInfoPartyV": { + "partyId": "15170BBC3BCD39C418107A06555E0D20", + "ephemeralData": "71A36C59D7F566F40EC386C964106492561E7571B6D7859923E1BDA8" + }, + "dkm": "D14DCC9EDCC81445F38066041021E8E61AF5070CCA15653ED1E7CCAFB8DA4B825B9B0E93C2658A1B47B3D6285231D9CE7F402E8E832B5045DCD2094D2FEA089F5E6DAAB307DDFC530E4D51EA573FC9561EDDFE5C2B678C6197B0324223DDD698750B6FB8A3059D9133813F341AF6453A73F21FC62FB49BA32C354CD922C4E87E" + }, + { + "tcId": 3972, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4A01AD95A656DFC880BC792B897EAA86", + "z": "37F15AF2E24BDDED8334B5B38C74A428885A29F0F87C126577D65CFD", + "l": 1024, + "algorithmId": "F5597B24057BB2D22693A616B9DBAE5B" + }, + "fixedInfoPartyU": { + "partyId": "0198852E738FE1A5C80731B02491EC4F", + "ephemeralData": "25D1E7AC9CF6D7359803A845210A85F410205C7D79DFF3CA6A245733" + }, + "fixedInfoPartyV": { + "partyId": "D433ABB1F985CCCC02BFC249446755C0", + "ephemeralData": "23785407C631C6DBF528B8BA22E3BE87615BE96995DDE952855CB1B7" + }, + "dkm": "452259A0E7B224856B6CF1FA3C8B72C8D0A2338D8F53068316681B49B59F9903635AD7D72BE6AD77EA13C39284446BC43399B2476F42E8328A05B9EA5546D5726D363A1CFE01E8DCCAFC68B06DFF0A9898238580C9713FA28E7A3D715005B60E7F733E965FEAC7A3C9CEC1E286A66D99D0327F643B1F7E89B1A3EA2044F7797A" + }, + { + "tcId": 3973, + "kdfParameter": { + "kdfType": "oneStep", + "t": "62F24511CA0FEF798F1593940A302AEF", + "z": "8637C740BB4F3AA6FE08FB6106416B1274D300FB6BC3917841C806D6", + "l": 1024, + "algorithmId": "898A9D6F9004D38F0A706875B056554F" + }, + "fixedInfoPartyU": { + "partyId": "930EC5675D1148D469B9A2E14AF9A658" + }, + "fixedInfoPartyV": { + "partyId": "5AB1010CB69CBBF33C156909AD0D7CA0" + }, + "dkm": "075D97D0F41AC37182C880EF8C59DCD79154A5BC9361B6562267B39808C7C5935C38E025CCD2456B871EBFAB3B296EF2F6996267D0C916BF8582D0ED02A7ABD2B8169AEC5DAD6E0DD36F136BCBB86E3132C83B5D23B8F71EFD6F4F68D391FA487AFB13BD6789F2D4BFF062D020027B3B3D22B73F0ADDA224BE1ECA2A243450AC" + }, + { + "tcId": 3974, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E5C92E53236BC8ABCE4652E25E49580C", + "z": "FC705AFEB368F85A5ABF23E26A789D9E0766E7532E4FA1BCA37A394D", + "l": 1024, + "algorithmId": "4D2FCAF1AE8FDED596D70AC41B294405" + }, + "fixedInfoPartyU": { + "partyId": "FA0A1B096A908C4FB761AA14A742B49E", + "ephemeralData": "93561BC03BF4F3BFA49F8F523061A5C6D0548A6E6F3040014F0D303E" + }, + "fixedInfoPartyV": { + "partyId": "1FA53712739DAD622ABFC76EED3E5154" + }, + "dkm": "7635BBAB7361F96FBE3AD439BB03C640AA2B6927346777748E6C0AE5A8F2C6B014E9FF71091DB797CE98E3C7CE6BD69E5518E4FBAF06B7BD5A1E89EAD67CDA3D336F945F881040E449E16AC920B7034FC4EDCC12A81A9A288204C4EA1BB9099627A306D3AB0D3D4F175981D1EDC46724566F6F417E3D5453F640AD0D04C111B1" + }, + { + "tcId": 3975, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2B9EEE8063978449850D9AC21D87088E", + "z": "D2D0712CC28DCE62B36143E4979201F54182FD9C686887FBAE50E82A", + "l": 1024, + "algorithmId": "FBF597CB0FED2BC8A39A77561AF6395D" + }, + "fixedInfoPartyU": { + "partyId": "C5801FA007FF4747E2E4C28CD92237E0" + }, + "fixedInfoPartyV": { + "partyId": "B78A818D5A5CC9EB8C3D7EFFF14890CB" + }, + "dkm": "D6584867B8511A80A118797670C047DF9B8F7E0342876E2137C54E2B2A860695998CCFA90B72AC60A9A0182E3C63A80B56279335A183E4AAAB7820CF7C9D8A43C60E72CD74315BA3360617E6A1DC26EA0170D2DE20C3C8209078E7400358EC11141AF2579345DB052FC862FF3ADC628AA2FEEE8D6BC5620BE7F52FAD1CCB9232" + }, + { + "tcId": 3976, + "kdfParameter": { + "kdfType": "oneStep", + "t": "BCDFC5C04EB5BA482C48FFB54BAB569D", + "z": "E315D7D6F311530D0DC95DE1AD9A5B4F945CF7DCF2AA2B91AA0FF0CF", + "l": 1024, + "algorithmId": "6CAC9D48F109F3033C6CC39E5E031EF2" + }, + "fixedInfoPartyU": { + "partyId": "BD6FB8AB72DA028E58214D143D7B1E0E" + }, + "fixedInfoPartyV": { + "partyId": "15BAD31CDF7CAFD2FC636C0820EDDCB3", + "ephemeralData": "A59E414118B105C328FA235053E354615782DF1F423A02801F7BBEE4" + }, + "dkm": "EF747A0D1DD7A4A9C0C6859C86A082404B2176AE1E9525872D678F91E78E3271A0B72B7578652155E334865F5E88335A59B91F2EB686B9CF29B42FABE0BD5A4253223D89B9AE5039716A1900087AF0DA480E2AF619A5136DBB81174B7D32BF4E439EE0A2451F296CAE3E8A4578BCABBAA7B212F303B2CE783B460F12922CD67B" + }, + { + "tcId": 3977, + "kdfParameter": { + "kdfType": "oneStep", + "t": "79A477484505EE979483077640F0C5F9", + "z": "D41C394402A3B817C6D58C1DD0693927B778C7E4BD41B4E6E3B6B5FB", + "l": 1024, + "algorithmId": "6FA79CD4B0B89A2F30AB59C3B3CEC809" + }, + "fixedInfoPartyU": { + "partyId": "AE5C32834589C4E61EB43EF6B7E76653" + }, + "fixedInfoPartyV": { + "partyId": "98AC9EB4114361DDA1BC2835845E6DCC", + "ephemeralData": "71DD19162B3D1E4FBDCC7873F55CE543900259E94B84E8C0C0E07E69" + }, + "dkm": "E2CC50D245F63F9745A138ADE1F615320454DA2812D898AE84E91654924721225803BFC06EC3BC4D558C91767A2E295B87033522F9091501C36690F29E2D1BFE5EDE77757061CB1783E5385EF50103DC0177210FA0CCF01DA6342FA2224BE603DC1B5F58C8AEF00FA9AB60B0BEF2AC8612F65C63AFEFE211D562910A4C7A80EE" + }, + { + "tcId": 3978, + "kdfParameter": { + "kdfType": "oneStep", + "t": "B0A0E545658419F8E89ABA002FE33362", + "z": "B7FF64E9CAA7BFCBC65AB11131C5C3E0590832316C2F93B2C927C0AF", + "l": 1024, + "algorithmId": "10CF31779164049BBF4CF34BBB93602C" + }, + "fixedInfoPartyU": { + "partyId": "DBDAD2CA28171940E875B464B67AE76F" + }, + "fixedInfoPartyV": { + "partyId": "764DF17F39065217361F3E84FAB1469F", + "ephemeralData": "6F624C805BA8EA37116426D77A3A8BBD850D0DBF36D0ED9768AA6DA2" + }, + "dkm": "7EC130548B7ED224737CFE8D8502701C2B4B84A9D0F7048B95D29CBCA15F6D521C4504D556A14F5D9192C3A55EF1FEC048F69BA14A7C2C86D7B40391A706049409C12AFEEC67434CFB47D0CED759DBA555AB74B34A269083943E004167D607516D6793D2EEE4BD574CFC10A687BFEEB9108C1DE21B84F2FF9E09787DBA2522F8" + }, + { + "tcId": 3979, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FDDC8C3C3130460CCEF0D00EC9CF737A", + "z": "8E12A03EFFFB4C75EFF969B35A90FC00B0A68C21189298B03F9E27AD", + "l": 1024, + "algorithmId": "7FC21D8372E8DBAFFD9FB1D51E6F2ED0" + }, + "fixedInfoPartyU": { + "partyId": "82A8B7E0E1CF837E5CC5EBFF22C16D80", + "ephemeralData": "9930DB343614B083CAB39703850F009E2B6087EC92D37ED6B510CD3F" + }, + "fixedInfoPartyV": { + "partyId": "631390EDEFAAD801D2FED579A3BE0F18" + }, + "dkm": "740D0D77B1F328954DFE390B9222B28B57C4740350E2AA801DC667CB0C4EDB882534C239BEE668283C321889A26AB2B5971B439DE14CEB13796566BAEC263368CBB719E4E092B889110D62F5189926DD99499EA3ABD88AE44DCADD1FF966888A19BB7B5E790A0C2618320E3BDDCE42B4F4F67247E609C30E104C2B62390C0A04" + }, + { + "tcId": 3980, + "kdfParameter": { + "kdfType": "oneStep", + "t": "80F4C95D614C1F4AADB0800F12BF2175", + "z": "E5D1E8E8569CE74F5DF15661913AA8A8FB8C83FBA13B1529A467D2DD", + "l": 1024, + "algorithmId": "1A015C4D3836A4994CFCC1041B9698D7" + }, + "fixedInfoPartyU": { + "partyId": "8C171EE55FF15CF57A5BB5B0D0EF9A75" + }, + "fixedInfoPartyV": { + "partyId": "4441BC1035F63196D80600BBE4A104B4" + }, + "dkm": "1E47E9975ED44CDDE80153FBF09EC029E2A59871B699B7A958A646CBB546F2CB69673B71FAA315FE468A3D564B6E1569A873CDAD30182907758292CCBA9A5F8C94AE05E4D7EBF486D0405D9105FA930F9E1ABF4D6CFD3BFD1F27CBFD4C31C716FCF6EE15D6C2E01DAE1E1AB9509E22E8CB486EC4D3BB4FECCB3E757675DB96ED" + }, + { + "tcId": 3981, + "kdfParameter": { + "kdfType": "oneStep", + "t": "98A5773EB3E7D4C467CF207AC6575B05", + "z": "0A3BC23213E42770801D9339C943ADBED22D07512E72902CD95492D9", + "l": 1024, + "algorithmId": "7177F3B4E5D1B74249CD7A968D781B1C" + }, + "fixedInfoPartyU": { + "partyId": "E0ED1B94349CBF448F7B3811CB0B1A92", + "ephemeralData": "B395AF4BC5AEC8268EBEA90407C36BB2B5767E976BED5EF3F88380F5" + }, + "fixedInfoPartyV": { + "partyId": "BA7A601EBB9FC9459157CE8E06FE79D7" + }, + "dkm": "38874259DDF2B5261EE32C758349803EF0DD0F56F48C9BEB7F4C1B6266CA18DBD97241D1B14CD8008175C073AC9555FB6C067E87919A14803CF3E2C540EF0C8FE6622B9D6CC54E215FE98048DFD8EA4817DD1AE8FB391F5FDC98D3461A330CE4753AE6434482020633B0D898B16172130523CB099326E605AD81580F82D4BC73" + }, + { + "tcId": 3982, + "kdfParameter": { + "kdfType": "oneStep", + "t": "FE348D0DFB632A02882B1B14DB9FA7B5", + "z": "CB11E12C86506CA4A53D00604A7302755DED7EE8B4BFBE5D3156FF4E", + "l": 1024, + "algorithmId": "8C8415DDD1ECE304A11685F5136957A1" + }, + "fixedInfoPartyU": { + "partyId": "95F3EAE8F72F53BEDE82EEAE76941A21", + "ephemeralData": "D00D8B948087AF77EACD93F3AC7B05D0AEE1598F500D9B19B7FF12CE" + }, + "fixedInfoPartyV": { + "partyId": "941E26877F081411CE5D58BB79B9BC46" + }, + "dkm": "C56CD6FB7A1B9D282C1931B64E5BC3C2C872A8EC5FC88D6E6F25E6666533510D771688600032C422C4F37C3EBB6B88D81F6CAD1AAFA46AD6669D4721B72E6E5CE6241B7EEDEF47BDE7C735899CC1088F94043E9614285EA232F2CF4B85AD6A84405711B1CD95CDF5EB1C63562D06F26E45C7BFFEC9A86FCC171F9BD36E0930B0" + }, + { + "tcId": 3983, + "kdfParameter": { + "kdfType": "oneStep", + "t": "CCDEDEBDB5725CE475836F4B6D1365AC", + "z": "1659E3CD48957D83B2A86F06DFF93A41B3B00735A08FA8DCE300C34F", + "l": 1024, + "algorithmId": "5E7B520B4CE90334B1286E733E5951B7" + }, + "fixedInfoPartyU": { + "partyId": "443773D60481975148FD1D2456F473FB" + }, + "fixedInfoPartyV": { + "partyId": "4EF915B82ED1482C354DAE9363A934CF" + }, + "dkm": "C714B26626F6554D3BD7A9C7ED1E9D50FA82CE5BE6294AA50234BD660881CB17EFF9C2FCFC6E8ADD9F1CFDBD66B19F13C65175AF9DE36FAF4673CA875B30C4F395464DB23FD342D95EB61CAE49DC3DE6065F0C129BBC219053640D1A5653843C5F9228E9A3784A1C92F5BAD2F4634BD0B0F6FBDB7085BCAA848B9B5326F56DCA" + }, + { + "tcId": 3984, + "kdfParameter": { + "kdfType": "oneStep", + "t": "646D73E56FD1A5E5B3F8F5B709B33122", + "z": "5A3B2E5A12C3EDD1E07D426A61F8EADA975BAE03196D8DCF5C466F93", + "l": 1024, + "algorithmId": "DBB57B8FB755EEEA747305FF20E25307" + }, + "fixedInfoPartyU": { + "partyId": "080699C4940C58352023F180768E0333" + }, + "fixedInfoPartyV": { + "partyId": "52A00133ABA6928DF6A2046FADFAD860", + "ephemeralData": "7C5EF380ECFEC3AC4055FA78BAE7371CE835112CD7C7E916E420FFE6" + }, + "dkm": "6287D4C293C338533E2B9697D94D69109CE9A09A4C10DE3AF722A60DC27D55AE6B68F6363CD14177647187D3A9ADCA2A811CE816C352F6C20139FB4C2DBB0DCBD7EBE0173C05D39597DFE3BBABEC1C03CFB761078803B35FC6F60901DBD37F8A96A843E599CC077C015742A050240E5A13C5DE8138CC8EDE75AE23794E73DC22" + }, + { + "tcId": 3985, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2D4417AFA6FE1E61819A284818E8C6FD", + "z": "12BEDE46D6CFAA75455BD6F22672F15869AE3E5EB89ED3814E49F87A", + "l": 1024, + "algorithmId": "0C81E2C097AC212AB02BEA312060E1FF" + }, + "fixedInfoPartyU": { + "partyId": "0AB930282A8A3298C71D7EDC130084EC" + }, + "fixedInfoPartyV": { + "partyId": "14A2087229CFB8FFBBD9B4D7AC6F2831", + "ephemeralData": "4DC6DD5727CF14664FB5145CC5F1441C314BBF8DABD4D98C9B3EDACC" + }, + "dkm": "0A6783846D645831BA6E88DFF013749FC7ABFC9273D4F272C7F69D2FA7EA770E1C914D7BED90FDC9BE1A671C86552BED2131C2294CD6E476E4EE938A5B7E091001AC86356811E4326386341C0D7ACB42AAD93DC068CE196F7C1F1204ECA84B795183E770E3A2E4A24C54B988E3EBCDB040E2DEF0D0921F3A0BDE0B3F46B714A8" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + }, + { + "tgId": 200, + "testType": "VAL", + "tests": [ + { + "tcId": 3986, + "kdfParameter": { + "kdfType": "oneStep", + "t": "8C32F3BB7D88F843E8EF81F0CF75D7DE", + "z": "EC485CB5A8A9508952D48F97B7E92F982305D3DDA72FE8DFB6FCA71156319DF02E04AF", + "l": 1024, + "algorithmId": "EBE758E49CD48FA96327D88195BC7F19" + }, + "fixedInfoPartyU": { + "partyId": "AAAA5114FF10CBF3276480AD4EF629DF", + "ephemeralData": "E5F3FFA6373DD47FCBC4C2CA1776B7DCB4C7429F820053FEC0CDDFC961974CC65C99D0" + }, + "fixedInfoPartyV": { + "partyId": "D15F8DCAA029A4B3CD8595929326EBC2" + }, + "dkm": "279707B4617D5517D665E48AEB4F846F826DF911A36BF9BA435B0BFA3225354AEC59E9DD3AE252AF17517AC4E594DA1F0D0CEFD10B8B6186B895599A18734F365813E96045EAE426177AE96D65DC3731A595A5DC607894115FFE4B4098E5D7C68101DF1309A39DFA113676B1712AD1A6245254E4C316B034069641D79877BEEA" + }, + { + "tcId": 3987, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4F7A995C60D8F31EDF4E96995C8B301C", + "z": "0F24F97DC2E49C7E7539B38178823FD4C46AB80822A19C1CC776D97BF83AE847461BB1", + "l": 1024, + "algorithmId": "8190BA83898005C5465509EE22B18538" + }, + "fixedInfoPartyU": { + "partyId": "0A6FE3D901BD0D025BF982D21667AA1F" + }, + "fixedInfoPartyV": { + "partyId": "AD055DAC0C61B34698F06E6EC548F087", + "ephemeralData": "F23054B7AF564F98CE8C7D763CB0D5E99AA4A3EAC01729D17A94F2CD0D073FFFEEBEF0" + }, + "dkm": "38F7054F9C734F1DE70AADBEBC88BDE8D3EDB2A8954F95AB0BA97938E8BD9075DA594DB165EB452A5C892F9A3BDFF7C929FDCF4B7FA89F870143BD4C46B4F6121C28F1A47F08039ACD6836A554B95CD3CEAC2DDBCBEC2551ECD5B99C8B33748AC76178FDB84F03EAFAC46BED2D3CF5264061A4DB121AB42E2ABC2FDE4623E160" + }, + { + "tcId": 3988, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0F1DF717509BEFED5664DE01EAF63843", + "z": "645467C731EDDE4403260185A762D83D38745EB342B4405083222CB8736137E4F2F103", + "l": 1024, + "algorithmId": "914C6BD6676484BF483E7934F17D6664" + }, + "fixedInfoPartyU": { + "partyId": "F2E8AD3816145ADFBE3DC5E15A6779E4" + }, + "fixedInfoPartyV": { + "partyId": "EBE9BCF03EDA2E5D10E26C4AA137DFBF" + }, + "dkm": "1361E0DBE65D6D31B2665898AB2D1D49D34AD2C4375BDB7331E2AD07427A17D39E793F09DDC9AD931D985892484B9F71777B755B0BC76DA13572CDAE61E427495857E09C08AFE247D6AA72AB97966C022DA0F5865784745DE63D8D54E371B8271C0E3D79C5CAC367D5CB634A85C90A7E2101A5445D3FD10B1A6858BEE2CF6FB2" + }, + { + "tcId": 3989, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C50268A1087E112E6247B9FB29E3C3BE", + "z": "A7073153488D0E27324EFB55D18AA040F0CC53105575F5F818DB5FD91FF5F9EEF415C7", + "l": 1024, + "algorithmId": "BD07D9AA6ECD33BCE9968C3960B0430E" + }, + "fixedInfoPartyU": { + "partyId": "B56DBCB86C4FA120CA09A3C9C319E495" + }, + "fixedInfoPartyV": { + "partyId": "EEC7C592D2CBF7C2ABF29F443C25C178" + }, + "dkm": "C3C944F883B6B5D10A1266966DAB393CB696400F7F239C0036F2538928CDABC087E99CA49AE5D83BF65AA6BE5BAC283973D73F8F80E32581AFAA45BF53246276BE2088216404E66236BD4F1AB2E94AEB8CED7FB73CE85D5763DFF867CC3EC29BB3ECE8FB84B70A5460C02C94F6825E12FE993E5E052DC9533C394B3CFE80F9A8" + }, + { + "tcId": 3990, + "kdfParameter": { + "kdfType": "oneStep", + "t": "E3A143C8E38DC95D4574E28145D6E384", + "z": "6257402D099A0CC5EBE4761C2D49FD2B26D0AB80A47D363DDA121F23792AAA90B38931", + "l": 1024, + "algorithmId": "CCBBBDC1943AE171D27D9A8E482AEBFF" + }, + "fixedInfoPartyU": { + "partyId": "380D24DF0F37076E25B36A59212A0A38" + }, + "fixedInfoPartyV": { + "partyId": "DEFCAC098516B33FC61A975BE8E5751D" + }, + "dkm": "48578D3C323222BDB48AB93060644E69744F24F69E763D37FA7E30A591468FCA74CCF95F42BA09EC77FB42D47B54C3B601CDA7FF0F47B7650646A0D40926B5A2B00D6BC7F1BB041E4EC7838AAA55A9A352BAB6D27AA62A7F2911EE24C55D1B5FD30E8DF087D916BDB6DB025F2729CEEDAAB9817CD5DBBB4A7495C560EAD08F71" + }, + { + "tcId": 3991, + "kdfParameter": { + "kdfType": "oneStep", + "t": "0483CD701132F73C83F154E4F344243C", + "z": "974325DDC932ED5F1E6EE0845BCEBC05A314DBC5336A54FEF585B357326EE462805F79", + "l": 1024, + "algorithmId": "9023D9061147A9AB3A431F575BF1D1D9" + }, + "fixedInfoPartyU": { + "partyId": "366CC4D12EF35E5F3FEDF2CDACC158A7" + }, + "fixedInfoPartyV": { + "partyId": "11D818BC816AD2507681FC03AB487D2A", + "ephemeralData": "39FE1D1A46A2BE831F7D353F5CA3ECFBA8B36CFB809B4D3FED25FC8ECE13D567196C8B" + }, + "dkm": "6C4AE92099A6581F61F9049470616F29B537890C97EB4A5DB19B2C2452DC83A1C2A1FB7C430EAE9B96668C0761CEBEB136A6C76F1936C3F84004AED37D4DA5B2F1E762C9AE66666632CBD275ADD23905647E925A7E20D197BA865B3F03F6A534EFA4F8E3F06DCC64585AD73EACA660FDD296D279367A46C15E4B4C4E260F6ADE" + }, + { + "tcId": 3992, + "kdfParameter": { + "kdfType": "oneStep", + "t": "29E400F8ED5D23147059EE64D157A804", + "z": "ABD63F2CFDDB4260067B09DB9C60DF55C0FA07C30F8E9AF7A80E57A118D54B49BFEA84", + "l": 1024, + "algorithmId": "33FBF3273000232DF5C9A0841AEC62CA" + }, + "fixedInfoPartyU": { + "partyId": "E5991486D562455579B58F2FE8B1343C", + "ephemeralData": "ECFFF5A94C7FA6A79546E629C69112568FD2E3C3B77C117C5FB7CFCF40E44E244A8E40" + }, + "fixedInfoPartyV": { + "partyId": "A211AAC944FD56D760197150EE878CB1", + "ephemeralData": "9E0BDD94FCCC01E9D2EE31F9E43FE35B3705901187B56A4F29994E073D21C7AFEB8F0A" + }, + "dkm": "0BA4CDE479A084DFBF8C59659E2DD5A1AD5ADB2828C19B09AC6F05705645661B41B0E9BC3ECA3986D84CDA79BC8FAA6BC7BB418DBFA8BE726CCFFF02B70A8D9F7AB5489D87A2C670AB0CCD091412F7AE453D3BC51F6B3F802298059F2A407EB5C89FEC4A748B40DC00FF1D1BE4082B0980F23A70EC709842467E7D551E2C4678" + }, + { + "tcId": 3993, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C32DDD794C2223C446C167FBE731645B", + "z": "8E7EB54AD5965203826E1A828B76425CEFB45C28BDA57270C0222EEF4C4293738FAFEA", + "l": 1024, + "algorithmId": "AE8D6DA47942E2284EE2742647B4DBEA" + }, + "fixedInfoPartyU": { + "partyId": "EFFA661FD350A6D8B94217191B1ADDF5", + "ephemeralData": "5D10A6589D639AC9DBB3BD0044D699414BC816F4BB754D989C49BF25590D237481D0ED" + }, + "fixedInfoPartyV": { + "partyId": "08DE95308B20A5CE59F5C1D0D11AFDE4", + "ephemeralData": "A9FF5ABB34AB279C5A767DA3807BF6FCF6D6183DF144AC5C8A8F3170B6808C172CAEAE" + }, + "dkm": "5801C9F7F00DAED44AE9650D75FC1ED3A4478FAD0F2BBADA92C0452FC6E755FC7769A9A8B1C9158067F4BFD70936023EDC883DF258BD6F259D178D51B090ACF5F30578B6FF3EF742842D5BE1F02B93C3FF6FC08921E0527ED31FEFA828C66319A96FF92D2D724FAAA859AE57800717A07EC1A0CA42452A1FEEEA7621AD04922B" + }, + { + "tcId": 3994, + "kdfParameter": { + "kdfType": "oneStep", + "t": "91CA47D21431DA856EF469CC384E9208", + "z": "CEABB66EFAC614BC43E1DF212EA137BC0F55E6FD89CFDDC202D92E583AB58A85219A5A", + "l": 1024, + "algorithmId": "23AFB522293C80B5CCDB4597C94FD38A" + }, + "fixedInfoPartyU": { + "partyId": "2D3450B5903166F309F65853992A9487", + "ephemeralData": "367C99E06C8E50ADBB3B974064BBBBBC680101320C94DF67437D71A8A5FF6CB95A0D38" + }, + "fixedInfoPartyV": { + "partyId": "B45E25D213A1B2DAE2F085951B1550A8" + }, + "dkm": "8910C233A42CC56F04B080132266F3AA357F60E7161C63D3263A252D870CA5A2ED9A56983DBC50AB1C5D751F867380CDA9F2D4C1BF4FCDD9825661F9D64D6E8D2ADC8521FA9CA06D81CFF72046BF7DE0B59739AB17EC21DD950999EA6ABBCFD39AF97108FCC9E6518C5F9EF3C1CF8DC9C2AF0FDEEEEAD95DB4CB73F20EFC42B9" + }, + { + "tcId": 3995, + "kdfParameter": { + "kdfType": "oneStep", + "t": "4DDF5C19F0A49BF2CF49772473300A1E", + "z": "95856488E597BCEF5819054D938B33DFAC0276FD6B30DDCD4CC73C7FCFBD49E2A87794", + "l": 1024, + "algorithmId": "A548CD5B29D344E5FE87618A4AE84EC4" + }, + "fixedInfoPartyU": { + "partyId": "79A730C1F17C2A5D37B13B605B6625E3" + }, + "fixedInfoPartyV": { + "partyId": "5868C4E2A4C2E0642FDD5AE4081A00B0" + }, + "dkm": "2A53A6759EC7E0D92E0A87B81792B49ABEC45947DA4602A2872E6C91660CFA0B0F549DBBAC87DCBAF88B757FA11211A4FC2099B324F99B2481976130913A47A1F4706D28AD4DE4E3468C6D2C78E8520CB75CA3F5E4AD8CFD91061E6D12A17DE14EFC522E685E5FDAE77882FA64DFDE60DDD01B01BBC88CF534A9618FC27AD163" + }, + { + "tcId": 3996, + "kdfParameter": { + "kdfType": "oneStep", + "t": "C6AF4929D1D89F7B4557685D069B5F9A", + "z": "6ADC24B9DD088FA4499B54DB8A53075401CC97B4DA8C5944540E6624BC016D23EDD590", + "l": 1024, + "algorithmId": "7730E6F9FBA3D30206DA6743C5E1AB43" + }, + "fixedInfoPartyU": { + "partyId": "3923C5EEEC13134EA076A2990A0CF923" + }, + "fixedInfoPartyV": { + "partyId": "7C1F9B315D9518B7D1CF114B3DBE5A47", + "ephemeralData": "0ECC70F3771C43E18AE1383DE8D82C1DC97181CF6BDE5BAF40C83CB291B168C28ABAB6" + }, + "dkm": "01E706F6F8C9010A76DE367F566670CFE5C61988E6A9A001907E6A0A6297A968A82588C86BBE285B89B3531B0AA899F9957ADF56FA6B6491A6C0BAB59B264E1CE004230424129AC92D07291BA435A1E654228E8C24A8CC213AED5C5F1BB8B423C5FB422126B58A3546FCE7C465979EE3D2785CE61070CBD1012A19D30EC83EEF" + }, + { + "tcId": 3997, + "kdfParameter": { + "kdfType": "oneStep", + "t": "43B1B17E481165D494C7E525876E4BDB", + "z": "84C16EB09455F2228685872703E7C41635E3F7D95F094522F01FEEE8AC9FAEFD330427", + "l": 1024, + "algorithmId": "A6B6798DE135F9BD381975DA6B65E774" + }, + "fixedInfoPartyU": { + "partyId": "CFB7361841595B07545554A254AEC973" + }, + "fixedInfoPartyV": { + "partyId": "60267D6461B583A180E7217DC3C60586", + "ephemeralData": "7C10E033DDA2F3A0D100D3C6A8F6F12B42868A01AB3D7E90C7339416265788FBCA8FBA" + }, + "dkm": "B63A09F9046BD889F56E8CE988DE73FACDB9475EBE555FC2317C9A1FD9BF9287284D582DF2E8D450DDDD9C96DB486E2F44BBAC7F457DD0B4BD9A2E3D5E17BF709FB21BACE4FEFC64090CAEE4180E71BF1CC16AD7F4A86EF55ED8F29E03063B7695CC34458DE034CAD25F6C91E13D901735A9966EF7459721448B0CF81130F33E" + }, + { + "tcId": 3998, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6C91C15ABEFEBB60E241C8A4C99EC18C", + "z": "AB39012CE812F13AC499CCFA123B6C40818ABFD1611066D64136C72667E129F7BEAF5A", + "l": 1024, + "algorithmId": "7433BEF105A692ED43D1F0F5257B0EC3" + }, + "fixedInfoPartyU": { + "partyId": "FE2D594F7B6A876E02775AAA4B3B0041" + }, + "fixedInfoPartyV": { + "partyId": "2DD5144DB4352C1D8F2AC39D1E00513F", + "ephemeralData": "39EA4E9572204D422E8DBC113CA38C39AFEC1814C4E1751E6173A339F4E5D63E84D120" + }, + "dkm": "186F49CC63221663012BFCDDC50FF3EA24ED65BA48C02979267BED9AEEC9213123D42BCB3EDF742B5DD8440CC3708E55C785A6B3570E73F606186F9DFE292C9A9C96C55C366BDBC82D935CF3B4F369C5E1AEB95F317AC105AF7707D74B38BA95D7CA3A1CDBC9987AE3A6CD196EEDD16A276BE171DAA8FFCE31C5268CDBA31461" + }, + { + "tcId": 3999, + "kdfParameter": { + "kdfType": "oneStep", + "t": "2CCA09C7427A065485F3D7BCD431C1F2", + "z": "A55A4A892D575CF500765F0CB4CF3A98E5F0D155873BFEB4D11BCBBB5AC9781ED266E2", + "l": 1024, + "algorithmId": "05949F8687871492F499D6FC54FC52E3" + }, + "fixedInfoPartyU": { + "partyId": "70257E18863E05A1087667288C75CC20", + "ephemeralData": "6555E63676E8F0200613C6C430BD635B896696A46A48EE745F65C901BFC6B113F13223" + }, + "fixedInfoPartyV": { + "partyId": "81E2D4BDB39417015F8BB6056F926818" + }, + "dkm": "0DBAD96972AA5F855C4168BDFD5C50CC4E2ED52E87445D61C2A24BAA90E600AF819623FA40A7D08F8C58A2865BEF61D8AE042DCF65FFD0A9F790EC4E3AE18B204AF59EE7386D7B4EBD51C8B3EB42F17CAAA31AAAF3EBB5CAC8B11D669188FFF8134FB5B3656F00C4673D2495D4D5690EDC2BFBCC3B84D7607B23E4CC58161A92" + }, + { + "tcId": 4000, + "kdfParameter": { + "kdfType": "oneStep", + "t": "6A0BD531FEB81FAAD0C8A32683EA4658", + "z": "43EB8D8D8C7813C427E9DAE923E21E5D797C0D0E570EAD28E8ACCEB3AB36E856EC42B8", + "l": 1024, + "algorithmId": "466D70C5FC559963BE76CBE3D1B9A28C" + }, + "fixedInfoPartyU": { + "partyId": "F1A9C89B23A0BA7AB4369A215E168482", + "ephemeralData": "30D78669FC8CC53A2EA82DE7C2571EF689D4CBC29A5A1F569FE70EFF7B021FD54BAE5C" + }, + "fixedInfoPartyV": { + "partyId": "D061065F5A5E96B3125E9B82636D9FDF", + "ephemeralData": "4808BC6434CE4ECF510F44BF5B07715D22BA2A48D036EB823941D377A763EC0496FA20" + }, + "dkm": "8F4164B2E12593CDBAF1E0F3D6D1EA94012B33E0C34F232E2B670E8EAC99BB5CAC16172023E59C077174B6839F71A27FE5C3533D27FBD65F2A704B922456B925B96AC908A36074B2BA0A81E54E5D10135D3992BC975F7DD2C673D835FC3E8A5B2AA6FCC1A0B8A3C75F5735BCE5FE6FF38DD8A732EB331DBE3C05569C1D1F96DD" + } + ], + "kdfConfiguration": { + "kdfType": "oneStep", + "l": 1024, + "saltMethod": "random", + "fixedInfoPattern": "algorithmId||uPartyInfo||vPartyInfo||t", + "fixedInfoEncoding": "concatenation", + "auxFunction": "SHA3-512" + } + } + ] + } +] \ No newline at end of file diff --git a/pointycastle/test/test_resources/kdf-56c/KDA.rsp.json b/pointycastle/test/test_resources/kdf-56c/KDA.rsp.json new file mode 100644 index 0000000..79f296f --- /dev/null +++ b/pointycastle/test/test_resources/kdf-56c/KDA.rsp.json @@ -0,0 +1,23010 @@ +[ + { + "acvVersion": "1.0" + }, + { + "vsId": 0, + "testGroups": [ + { + "tgId": 1, + "tests": [ + { + "tcId": 1, + "dkm": "293d25d4b4455ac95662eeb56f6b1ea09a5f9b0ba02c3529f25fd7ec39d5d9024ee43f043d3e949b5d037ac4e6d9f5abc51da68d5051d3cd75f9a9f07876e0359d1d17b1b4b37dd12c9a1ac80e4793297852a98ea9d9e83ae892b26f4301c18f5fc9c3dac35582971e5ff3cf9c8cddadabb9a2287ed4c8e8a3aa3a13658a1735" + }, + { + "tcId": 2, + "dkm": "b1bd06fc6a92d5b4adc82b5f74227c187d920348ddcf997e5876d259b27c96552aa6bb566784fb7a9e8ccb190623be4ae34df482865d0788dac201b05c047e91c818fe4e8109d5cb30a084469627d945849c76a6a6686835240e58d63174b7e0aa856bac1022903d4d95c9611d22758efc546e56e27405b999e83a4b79828f1f" + }, + { + "tcId": 3, + "dkm": "afb6f4955e2782ff00d146784c63d058624293d91522bf4145eb9ea0e917f9a30910a606812ccdf307c1583d5f7c3876d4b45d2f96de5e66451f8eb3c8df87f0bc82c709861b8fca4575321d42489657635567c173a2cfda33e95c01306ddefaf95d5b06f3a33914cbe87bbdd07f75fbe01fc0564883a077b7905393ed69fd9a" + }, + { + "tcId": 4, + "dkm": "55e0ab19337a18f1ee1f8bff5b0a6f1384c0be410ff49d07b00c9fca9d27d6c4ce3168327cad0cc2e34cd0e93d0d5cb62be5880f75a84e5094463caaa3e22a4a04daae2fc638b4e41deae3aa421d7841d7f0f6233b2d722def14cef1dc280d34c3dac710953506a4a102bfdce8a558c2247205db535b0d6fbdf355a694c38e18" + }, + { + "tcId": 5, + "dkm": "e2873df633dd58019f79815dcd37dd103f93c97a6400d3f43127877dab213af7aeefac1a9880c8f21725420fd4135c52d501ec8faa7b4148f66934d222e2d0e4d55f8d17903548ee6e8ca7ce6b67c028fd281a2b9cdda7a083f2492dac83c9cb4c6c759ae15703da009b7ed9917fee1b2e6b355b923438f4a1ef95f08fb7db57" + }, + { + "tcId": 6, + "dkm": "8f262dc2c4b9a4262d4df3c340be1724f8e53a98f0cb042d509582ebed4ac0c75fb8a2482ed5c39b279f470151a5dffff2d74201543f277f8ae0ba8c5dd379cedc166563cc3481d27d235bb91a9b76c7c90bb92663d6dc5019406459eda4b8744a4fe0f9115917b74be1a20c82cbec1706fa0e2b6ee33c11c9f9465e7faecaff" + }, + { + "tcId": 7, + "dkm": "697e7825dd76c85f71b90e0610b422ef4c4fa4f8d622fdecaa1fb0229f4e44da72c93445136f88f4ce5fe54deadd222626ad7fd6e3a115cf5bbef456c5215f7cf177f4398ebd86d58d00f840eef67c0bc90e2db1a119e7d68d1f722cd5ba1568924b9e15349dd78df5b105b970639c3119dfc6c1f5330e299d8bf44ef53f9a23" + }, + { + "tcId": 8, + "dkm": "ab58cf4a91fc17984a95e83b67cf898ffe63db26ed542391ba4b5ea85a4b5cc000dbbdd75763bb9f84e21c1f610680896b27773935f1e760d953c5d75445c5c8453d75d3b359edafd7e97a1f8009925e37d9a466f1455238b013fee4054d790f40fe871f1da57e9fef75802bb92abd8af6fbed0f8e8527662ad4fab19f3a3824" + }, + { + "tcId": 9, + "dkm": "9793b65c893a42a6f464bb669a76ddb4b3466209a877e60db24c19771b43afaab2d4f156bbfa83c06a843fe7720a5a4130ab614dbb7ff71f2557bcb30cba21b19f4f4c28eeb40c43d235a6c95f23c2fcbd3aac16526d2a4d22bc21f187dc45a5b01e0f97d5853ed58b31b2ef0d9b851dbd9a11edfea0785b7435d9c79279cfd7" + }, + { + "tcId": 10, + "dkm": "6716cb6421c356f9ca3b6f90792cb47b7141e60725a255364dafab4c18b01fded5bfca98b238306e103fa5dc92255d72dcb87eacbd7bd3de2f3222f169d67d45b77af68627475e5c9ce0ee56ec18ef64b5dbd144c631a9fe2222896987bf2ff1cf346fd28059b3e98da3bf38ada3579b7d7577bea8689f81a67009c083bfb36d" + }, + { + "tcId": 11, + "dkm": "7e7d099ea601ec931f0bdc6ee9f66a3b25300e17fb9afc2a2b77ce18ec65b25f8d0d34276b8d3e5fb122de333e7620a1f93407035cec714e96d1bca710cc69deb1d8d559e483db924410f7fd3e6d8895522f5951d9042d415c92a1fb6ae86ec438a6b896008f7e56f5ba341ef35c9466d8c46c6e58317e3b6dbad0a6d3ac2b96" + }, + { + "tcId": 12, + "dkm": "a64ea51b9173b6276bf6b877060441f742a67f73dc45de057a9140664c74ff8cd695548d09f5176adef0889febaaad631ab6adb83ae2810b3c2870db4213c2780b25d6f770e322957deb385aa0ca061320cb9b5e6612688b28689142dc1bc909e0df896f2292ccc8d252d0fcb3e3fdeef2457f1f9063c06071f73161761e2f0f" + }, + { + "tcId": 13, + "dkm": "a4781bb640c2b9956c36241ee2b1fe9b20648e08081237e24467b1b7f11b643bdbecea3f9428f9d07c697ff4498153782a7b21b3123474f1d08cdff48ae0fe240d7b54f027da5d8fa157aa87f276e0e2527e29c81411a495d90429bd96c22329698ad07b10a921561e170776b51600ff2d5a85eff7cb1fbcdce362e4964cb0dc" + }, + { + "tcId": 14, + "dkm": "ea9083be210c1fd97860386fe70589451d110ce4cb59cb7e957f3358d7132593f426b784cf3e26858047dc009ae6e529b08ad6d8f33da614012aff33b20c462ec5183b883bb6b4abe18aaa0b97496cfd67e7cdae4fb170d7d1757be0f57f7748cb9450e56e977049f0244b81cdb981116a7acadcc33141b9941635f08a422e57" + }, + { + "tcId": 15, + "dkm": "c53ec4d27da3b78985a27fde7cbc2f9191198581a946820bb481bd7d9cf25092d12b27218ccfe503bfaf79123aef7239b60bd52647773f475ba7465419785077037d8298a086217f7d639a979d53f5a3f2659fe362cb5892e34020b858a36ccce3140c6922c3606a62500a30681ac2d834d92fbf6a52e3b305ce00e4954ba422" + }, + { + "tcId": 16, + "dkm": "06ef1ad382e82e818aa496c71e352bcbce9592dd15de114622ef5a21ce139934758102ede4847fe9e587773fa059579de427502c504ccd5c4d173fb85ad1307e7cb34ccd11b2d1d835756ef945b459e3fb72e247a820c9540b48b11d71fc3efd4dba2c033861c67ea8dd604208ff0b7f5b50c252fad78781f4bf4413b6b2d137" + }, + { + "tcId": 17, + "dkm": "9ad91cb1936d89899f13eeea26e7807458108d77f1022030de49cd8c914b835ae1e1cf6ba552de0f2300294901e023e209d99e93daf1b87c7882634600e08c4d9838a7ffbe595f73b529b5440460f81feecb1c9052bf08854dd89d3adc9e68335b54b3bf74a3313c0ba55eecea2275f7625d528796c3e79e40f4edd02c7f2778" + }, + { + "tcId": 18, + "dkm": "52186d0577e6d10306705f1fe10c1124d2afecc2be54a029b1a926dcf4083a2c19faf078ea3f392862ca49242b8b82fb2d8e5774884c996741939cdf0748593079f63c3dbad5374b88cff83d324c4e4fc7204ab682f061bffb1dc8076f54463a16bdf7d3b8f45c9afc1bd41d9d9f1b70cb8c8e97261be6eb8da1b3b6cceda451" + }, + { + "tcId": 19, + "dkm": "f25464e05828670d0a83f1716b6eb638106f8794a03efced59eb03035ea19f8e48929abe6957266db94b7fd440d1da0eccad6d1929ac09667e4b5299d3112e9a96734b44dab569f136cda36ca290069c7d904749ce43c170a793fbc03dc655b2dd1f69d415c9c9b07285383b4f0a9fd1e0fb14e45781173317d5843046690cce" + }, + { + "tcId": 20, + "dkm": "9478fc8c769a9834f29a53b928a7e6d9bbec1003ac0bc8d941c7683a82a389f090e6210efac7559b9c3abb64458532189322d096297efa079c946d17f136a7af1b23a990172437295ecc809ddb848586424dafc5750ed0ef5055300b4a9b14d46e67efceb0f325c9b755df4b4ed874d1c88542d3a4a59fba3b201cef4c5708bd" + }, + { + "tcId": 21, + "dkm": "e543e39222f195303e8014b173de08a69a2235843004694847e245c3f04497b968b234d52728531bd07b0c9857b4456f1bdcf8ca1e092229a71d5eb2713ea26a97b112ce10d1b2b970710d45e946a74629250d714ca2c3813e087d1affe851f041268d1f1c7fefaf7b37a20e150b9b8223b4012f92bdc0ed895215ab7aba9184" + }, + { + "tcId": 22, + "dkm": "f5d61cf7460b637b8f2e18e2a020bdf3d9bcddab2126a9e7f3a15833db99547e9bcec6a44c388f4b3aa107a7b9af0cd6210cc469cc9803e6984185167dc5fb7887c116122faa6d43eeb3ae60b14e0a773e6b896839449f5e64b5eec9778e345e4801fe4eca75c5751a7d7d083916b0634a29bae357fdd40037b4998f5b759e0c" + }, + { + "tcId": 23, + "dkm": "deb36a3b1627637e71c148961507e6008149e21c46cee1aa50eb1a98a3e3ade468aae94b453aa2641261e9d4b8a8284b4a34cccfe5585e5c42799ecfa9a7e06cf41c68c8ff1dcb0d443b69362ce8145d15d3ef35d89c17dd5e412928e20bca5301f52c09ecd903a4a7439c733004bf38bca845e21ee057517f5aa2eba4fa1fca" + }, + { + "tcId": 24, + "dkm": "4489013656dcc0f8f7c87ed4635fffa0224e09504152ea096b5ea03dac0da3eeebf8a68e55233af995d78d03446933f52ccb639098f38227d54c9f68b73ef7345c85845750ba03899344cc5c5338362047d0bd741858f51c5f1bcf6aaad3d2d26084ee3be762750de84452300ca641fc6906b7667925b9e471963c210cb04fa5" + }, + { + "tcId": 25, + "dkm": "9137653d95d9caa7d01af08040e04d1e8d26e6f700897fb76bbb72f5fcce4acad435603c4253bf63e0721254375955932f883ff341aa4a788473bbc18d99e21bb83416cd99005681ec354368e633fcbc5723e5c63cc5efa123f92bd362a33fde33952d9a2999f43e91ce5d5101fc46983ca0b90b291c88aa1491f91f6c2ebb6c" + } + ] + }, + { + "tgId": 2, + "tests": [ + { + "tcId": 26, + "dkm": "aed56557516403c847ad7e3db52a45cc9ae9f891e6ada0304bce40a43e8ae98a6e90655d4a2ecc343c5940447bb69affc41424a574da580b41225a1abc3003e751163dd691661b2b209f52a9dc74713405d9463930aab8b991852ea0f3007480b8751fd0ee0661f7d2782ea50eae35a8fde99479111b119ba3a9467bdcb7ceb4" + }, + { + "tcId": 27, + "dkm": "1ebe37366aa6e3181051b68e93bf0ec32402b2bde8944dec585a2ed59f7865dedbe15eb7a91779809d29e0ebfbfce826768cd426ed3dbd4c340a48cc88fa452b1394b17d4fa92b5b9753daa27c60bc870abd4b19f60a3c93a0aa86e0c33809955acf5762432f07fd81f539e87b7a75bdb11ed0d9883f83a883824cc70984fd12" + }, + { + "tcId": 28, + "dkm": "88412fc22e67469454cc1988c98e23393834378c3e538101e295d2b158647bfa5d682f7b6b91bdd3ffdf91ed78af2e5c088160ca5f6e3af39d4481d2bf37fc113a22e7279abe99b35a1246c8b8772c4badd12dd9dc872d8c3f885e1b385b08fdb2373aaeab6d61e1972472e800008e75ae00ac42ff2ba8cedae3e8d954459fef" + }, + { + "tcId": 29, + "dkm": "1b75fd37b5c9b79bb22191ec16bb17ce2f320030b5345b149def31ecf12011c156b17b88f413967e39aff36b33457f5f85c765169b34c0da04754a77f744aa5714471429a8caf70b9c16e5dcd0caaf8de9c8a88d69d395f38d3fdaaa29095c65a51d028d109778958c49f3e504f01ff7e5b8342c2233835689999573f511a158" + }, + { + "tcId": 30, + "dkm": "6a5340be7a0def893a63d73bdd452f6b9b186d83f9b6563220b10a36151aea8516c2cc2eb5ca2cf86785f9947907dee122496b8d965c931b8a3ebfd5c3432de78f8581de490d3ff36dc9e683dc6f3742f212c1ee06ee559bbf49e0afc672ea077cbff23610dbfae3b2ef5c4e2e6ef6399c8b5629fe583acefef7706768073dea" + }, + { + "tcId": 31, + "dkm": "38da8caa0511263e0c4ddffd6f6e349de07ef868f182e244c6eb9905d84cc3f6c8b406f6c7deb786f00f6965e67feab89c53d34e26a6fafe3401d3cc62706f5258e726995d9f6d8ba0245bce36ec10694ecd5513a71536402def24a453ce684a5bb8ed9dba2cc3fa62c519c2ef0fa463391ed925249f3d5f544d6ba4b8bd04d1" + }, + { + "tcId": 32, + "dkm": "9866f28581ffdaccb59a1d9109d003a71571245723a21580826ecf43e26930371487277eebb1528fc01a30f54d98f6a3b4f68b980a8c4a8ad8c89bbe508bf728cb5f1179e67cc309859688f573b9ebf0a2dfc2993549dc5bfce81398681f6658cb55da862dcb1f46f2b48301ad9add7e790d53d1277a41f4f0894ffe365e977b" + }, + { + "tcId": 33, + "dkm": "3079bd122c1e0761113c14650d258ce66cca24946dbc68e104342a250eabf3baccc1538731e9607c92314f672358a322f8115d5af1f614a7debd4053537a5602ffe14bf82514943f6c89df674e431f4940a7e91266df37edb056a3ae030701ae2e6bb38bbaee66f462104c4ddc0e61f782b76e21a23cdc2380b49bf5a7f7738a" + }, + { + "tcId": 34, + "dkm": "71f95195563810cac64da4308de08a53ced659f77c9e60eabd9f115b915e0157b7d358452878eb1f6711aa10ffb32a1e207196f73f8510e9547c8bf41bbe44329f5f079844c85124743ace80e03ff6e799d8136c4cc8f421da8a85761246c9e28fa11819b79fd4fe65035eb1ab62595451c6463d7e65dfae37d814628a538d82" + }, + { + "tcId": 35, + "dkm": "d8770f1611db25da7ca997a9d691c34ab014539eb78d4529c5aceb38cf384ed75f481775b6d133228633ebdc0f068547ab1eee68b803978451617f607f5331f6bb31168b7d0c93c2af8f44644e4e921206ea6fccc73abbdde7530b84410fbb3024837afd77cb5a645cc838eb78da5ffe52a083e29a1f4f2376b9bebd248d6cbc" + }, + { + "tcId": 36, + "dkm": "cd8259bd324ec270b0fadb0d5a20d41be14eaeb71e3ec3ac2a1a9d19499d01e33d0c991563f8548c0a7bfd632a2555677671b3b80c76a1f30b7b2102264e2f304d6a4a351ffec1825b70b3ebf25c96a8ea5e493232b333cbc389f2ba70cbffdcb4006168f406f1e1934308ef45b41c25050c6caccf53c7debf1c41de8e74feb8" + }, + { + "tcId": 37, + "dkm": "cbf73211508e8350167a72bfad63cadf4255a2ce1cd37658e374bd119f9a74ae3afeaa0f6904291bdfbbade66d91c06b47d5f5ac0c2c665ceef492263b5628301837b7c176bb9a159861628b3f2b2de2f410b3049b161d2c61d7628757b87cd1c2abe869409bea02766996cdd2eab965644d6e03bc8d0a86bf9062e9c0048738" + }, + { + "tcId": 38, + "dkm": "d94f957bd5ff8ff6443cb011d62d4c8b0b73d898498d1d46bb98e9ea877a0a2891f471e8067a0005760f4b8af2de37e6b45a2d0dccfc54ebc1f474dd548a5c255df775019a24d9440c27ed34f9cdb91d6b1656e932fd550c60bc93eae090c306fbde40c950034a877d87e0de4fbcacc0962cae56482ca00773cdac8713adc551" + }, + { + "tcId": 39, + "dkm": "a7616f0fee049dea000eefde13414a680fd03501120752849cb9416d6f2c68b610b1d0c4d03b10c094e73582c6a5d074f399c608ec202c76362a176aa9cbd8661c3f0a009e921b44d8972661a484d37ad41404d9815b7e84bae7f2d2d18a55d98f29f04b19e410e2664536e9751659f2a8720af7ab185adfb8c92f360d4c30ab" + }, + { + "tcId": 40, + "dkm": "955e046971658c5fa4a3b154bffd07cc447be903eee684a6f4ac2730f64e289aac4b33a945d0c0e054b4f898bf96e145f9fa9fa2d125d75c13645cf9a2f7f3627f9dabc94f21c0162532ce8fd370917881a2d8a01e973ed930a96dcc9a999eaf73cce1fa7f45201e1de8074100eed75c2bf94d12ee7da75156c19420c32a9281" + }, + { + "tcId": 41, + "dkm": "bfd7c1e21daea418c1d075a54eb99b51776dfe9f7f1728ddbefd7c283fa2349febbfd501968ad69e6c36153a5155ece02dc514010e7e4c773814b37756b4b42731eb839e01a29079178294c6ee0129f4badaf789e1df73b30992a51b91feac07d62dd7df533fe00b37e4f37de9f86142e8fb9bca950d560e0aa40857da1f1817" + }, + { + "tcId": 42, + "dkm": "6cfccacf754112287944a236ae4abb25d074b8cf2ce0f9b33ebb9301778b41d73aad07afe238a6689bdafb737674cb5d55ada339a0712ce48b982d86d09dfd16224e19520a9942cde0e6bc384ca81605a2abbf3d71df90ccb4cae3e353af47c94b7ce68638db5f24575ad8df5075ca2c58d85d1f4df4ded3044dcc391e012749" + }, + { + "tcId": 43, + "dkm": "676e5c3431edd7daf2ec2ba7579394a434d0528be4642271ae48f4d81a52693c64b2257d655996f1bbcfd3504edf244bb7ad1e7719b55a8b40247abdf80a80f8e382725dee3c4f3b5162d945119fb3dd5f5663834aa64ec59f00c5493f7bcc387eb51208830634fa9c952d14cac710dccf87ab84fe90b24c4b2f4dbdc3b151b2" + }, + { + "tcId": 44, + "dkm": "b6b9a268d0cd6b4efb3d781245bde1360d44fa2eea2cac436c3199c667fc9af9390a0c6e3cd8a225a69625d512a6de712782966e5ac8b6d662cb641276c0842d80b52b52903fa827dc41292f7d21ed706f557c3ff49bbe4669adda605f8a935a01fc2607a931808416ef548e4a298078f436dc71ed51f0d637df070f4e923c09" + }, + { + "tcId": 45, + "dkm": "5f4552c403ca587a69e11aa926557fc254eb41740c87c6d6ae034f5c7a44243cf8f4c056966c57f087b0409617284c706ec2ba5ea9aa7ee8be3d95b0fab367e081ea9d532e0a4e4e1335bf6f8cea336b8321d54fbf5098c7c168a9457aac21b38e1cf17f940fa7bf916886c593a76de742e127ad6e3905be48afbf60e0a59618" + }, + { + "tcId": 46, + "dkm": "c1b4e076e6bce6205c5acef5671646ca90c40e3f2dbdffc11df8e76e74bee15048caa7697e9d3ac3c325dcb23bb637a860e5a724f6b99c5f0e70fa022028f0589ed3a8d0f7fb15cb53df05d5e157c3eb0c510e900f7cba2ecc5a9b69daa9868dc8d519397c9e41d7ac81b3f9b123d0380966665de8bf65f2581ba6153ecae2a1" + }, + { + "tcId": 47, + "dkm": "6aa0d8ff8938a2b880a881a7fcf13c03f007155acf176d453c2b62744c2d1241f00138cb3bfcabb64cc75921db08aa5126219d9075cb5ba56711b442112f9a919aa59f69e6b113bf6172e5d82e6899b2d7ad5ee01bd04e9a42f96b1046b013dedcaa233f848fbbea8d83cefdc05635e443644534393c581780c6560c207390ae" + }, + { + "tcId": 48, + "dkm": "19989f10990450c75c190760882a9e8daa0e2b55a82116a5710ae280f4c4497129a9d6be783474204797b5e610988f9adc68b1df83d95441fc44b45a95248f7ba14ce81b98c57822eb4098ab4ace68e803cb0dcb423f93080105923dcaff210bb208d996421630d5540525f88b8d0d7acdf65c0a5e2402cadeac7e89745cd99a" + }, + { + "tcId": 49, + "dkm": "29e4e7621269e8a683703e12559460c0feffedfe8de0cb9f341870128b7802b87784ef3bc27cd2cf3e1768ea1aa8671bf5ad2038728f8294a02a96a7638ad86d2469f72679dd5545b104369878a3dc38c5ac4c7eb5395a9eee1f585f3f30c9f1f879cb547839920683ebe7ac2b13f5eb09b9cad7cc0c1c7e46df7db034971cf4" + }, + { + "tcId": 50, + "dkm": "f4ce431a1ffa060eece3a59cf3d74fe3ad62e38796f8ee9464256beb2f333f4e8dd1aeda2e505eeb05d34164552bb257d173061be32d7768ed6a1fa7034da1f6c862afed78394bd00787c6820575746797d834a6da2f951a1fc7c7f96dee5730595ab0ee0016e110a3df7d7bafc1d64d84b81babf72947787b5ccde233227904" + } + ] + }, + { + "tgId": 3, + "tests": [ + { + "tcId": 51, + "dkm": "1f1d2117088edbd041793dc6adb99d87c27a81375b087bcf01955f967b8f6da7ca938b5e8097875faed1005791748c41b31bbdb6792b7dae7955c9542e3c974aea3073b79dcdaf71418cc3e690210ebaab9b62cb0b6eba7684527d0c16287b0a5cb5695c59b9431a03244333fb7806a8bf4f0d8f6f2771b1b5adc8cccbe9d6b0" + }, + { + "tcId": 52, + "dkm": "8d289816fec9f6f0a5ceee9135cea15a7a01a43ee9d9178bff737b06da2ddce966c0c7c89ff899e36e45a25e5f0d1614894661ca364afdf358e36ab6e2797251668ba64ab780c91cf1f94d555e4c03e9a23c27f672689575b68570e4c912bdaabac816915a6eb9b7748a157bb26fd731b044c9a7337d22ba993b4f84f0c94705" + }, + { + "tcId": 53, + "dkm": "be55e0fc33eeb07f4b93d88262f161fc65ed0fc29c5a9ea93dc66d82e94a38d014eba82525a0ada1b38d2b9c3bdfb7e1938abd8b3fcd94198a26a68c304a797c1733f99dbcab3b55d2f7d96671ba557525c1cffc9cc8a7813485276266d8aee0023d04e87e54a56c2f1eac643f1c3126f1261ed63990ff11ede7239a85b99555" + }, + { + "tcId": 54, + "dkm": "1d6be7ac407e74797478d8db82b3468d793f5de110b2d3f3d5cdddf8878a564f14acacd024ad89184aaf26b2a65f8c4eaebacbd4e94edaea05010c75af772ce61fd46ab6b51ef504b41261af6f69df8f7b0eed4015d2264fcb3da083a52a3b1236a44fd1cfa3e4cc2df45792b416e00d5ceebfd4e607ba37f8bb3f729b91aaf9" + }, + { + "tcId": 55, + "dkm": "e8a0b577390b0e8822937294ddf43e75cae6d227a6e381dc8af0e0469eb4997e1ac3d594369098e7117bf02e922bca556142878081c871f35fe5f8f8b4094d3bb9961017e808972e6444a52c39d0fd573eae9e277799b9740f5723a606742706ecfb68f9e98685c55c2d5ea4e19e08c0140c91a01f49a9fdecf5a7b06c288114" + }, + { + "tcId": 56, + "dkm": "1df93abc05ba09bd5cca37b4d8c117dd57946d4660b55489a79d908d5ab3b889b15b3c18d37aa241bffed6b005fdfd611047965f3d25863fc2de594393c32391eefe34c8dd7f13bc680fc31a6eac02d87d770f383bccecf848b737ea0db1d40333ec1e7e5da4216bcdbd2ea58f21f01d2830b139608ac1b8285d81d9a75387ab" + }, + { + "tcId": 57, + "dkm": "79e23791a72843c2de24d4c8ca26802045d79bbd7687f3014dbb2a13873c1fd3f661c44303c87eedf7fb9a587e622cb00e767e01ebe218281b978f38fce3e1843cd81da88b9116ff2091ee8e2d82448fb779965aae7c8458c51be55ec22e43f5ddf6d91f39d47ea9d5e5c013c9c77ac96d9a6ab744b68d4a76491f489491e9c5" + }, + { + "tcId": 58, + "dkm": "ab329fe97cd268ff37ff305bcc1b067f9e518e6b3542485b26d8be0880415114182798874421d0945e5a3f32fbea8317253a945df71b08e6902e30147426b99ca6772ffdb99d685ba11cc3aefe279d51ce4e4f28bb859650c4b992a4308ee5dde14569e4bedeb9a1bd89afbf70c186c933eee0cf872d38d0feb73e11396ef714" + }, + { + "tcId": 59, + "dkm": "24b372bd1e5d65350d9af7d1699bc1cddfbf4a0265f664e4c50c90e69bcc62eed715d72f4e2e0f99e525ca75d2884fdab0adc0bda5b8dc1c13a5988b027f0b7db2f198b04fe148c8897d7a4a0ef43d0e12408592e3c72430e6a696ff919e4815e48ec769b11ee8d80e8f429cc31f92358733ffeec751162dd224f2693c1fee6c" + }, + { + "tcId": 60, + "dkm": "2a9e8e661947a34f98e4428eeef8cca9f0f40ac72404b0f8964847a54918950103db3f202cc199d88efa3f77fa86ecfca803f3f12d100f3a1b947f73178272f943c9c040f15735b2b66d610ce62622030390c90230eece123b09c600b042674ca9845af80e77d1076bd43f8e7ee6bb2f0166a15210159f5806fe3eed42e3b459" + }, + { + "tcId": 61, + "dkm": "82a867f239610ba08ff817d9f678f4482bc6c22af31e59eebce127e31a91ccf39a0bedea1024491a83020a26c421ad45d7588e8773bbe0b225e6edef7e6485cef7ce3307be276620617f1c5fbedab0fecef83ff09950ce535ef693ec79c7011d4275d023771b81acc7fd4a4f2e0710c70cb3e44acbf85b26bdf2bf25cb078236" + }, + { + "tcId": 62, + "dkm": "2b5f74d29a251bf89c13dc37036c693ad18045701222226b7524eef6ccf86e82b8a8924fdbb4b69aa01d901db2ab403f09531c58c0cfc88fe6b1c4815dab8431967a8024425580fe8559749202d120a31f2e25a925ad809ad2b4c3fa2a143c25dc14e73c2b34c69f4e33b335098481537ee5e5d497ab3a6be462b0d80463ef15" + }, + { + "tcId": 63, + "dkm": "c296022dc396de4f30702fbde672cf0ee141b04ce47b25cd43563a59b2b8e9587394328f75e98ea50f402ab10a75b3beaf7f1e44436b66da52019ed3479df691365777195a4592d855ad276dbe18c0f901b5d1c5fdcce13beab3a7d40136d50051753af2d6443b67d82435100bbf2478e2ea08ceabd83df9a64498302214498d" + }, + { + "tcId": 64, + "dkm": "6f4e67a02cef6c9fd613e6684a7e4eae82a503ddb70ad2e8d83f0c64bebbb90a5275e6ea3e48d7a6ab5884d2f7036946ebc9827e87df49c43215e44c2782fd1e7428752f803205dc8479adaf67288df6a90230537d2d9c3c473ddb5bd62fd7a1c71705ffe5010defe261eb0efcf73a5819919c7403a9e1588fc609c70c4fb494" + }, + { + "tcId": 65, + "dkm": "173002c8a85aa45bc9a5fcdaaf951b421c74ee8413071aaafaa61726bc551452e86c3f2db9c11389a51d6d32bd8416d85dc1283e083c824b5eda3559542f0bd6e6222b2c7d62c0bed7e96ac520545f072300d36fab0ae41ac48a54cd497bcf14d7c71ac815aaeeb42951edd9ebdcce108be35866a3c654e4f33f7c24561adeaa" + }, + { + "tcId": 66, + "dkm": "c68d81140d3b68a4af975d5222aab12b1a5add8b5cef12d5755b649004e10c9c5324bd585793ca9a80b2c39de78546155a54880a2cf06067b1772eec7f76e841e98e16f5fee5d47e0b2b67d061d2957d8fd9948a852b8d333ff36e7ad11aeaeb98c16b8f7485ac36f65f7dcae6b4a9ddd7448c343acbbba8ab335f3d568eff97" + }, + { + "tcId": 67, + "dkm": "3c8aa95c7810fd2aaec98a8037deae0d5f37bafb45e25211054d14b5027ad3a16fab9d7df1907653761b4614744b605a75a2ad047b8f6de9531ae7c534212785a463d0fbf90de7697727ca1d10bc78163324abb3c80224737bb2f44d52bd895e611fc8e3d5a59026823f36b7e8c6c4d54ec18de5f16b6892fca3271c6ab37075" + }, + { + "tcId": 68, + "dkm": "6687358bd6d402f27f60f902a39ee9b3b688f28be46f46e590e33169768d82ff9ae7c15ad3b63bef00ef0ff6f68bf6c1d53d4b313c67e10861ad430d9f7a123d7cbbdf0b71a9eee3b4f41490b900bc4abafe2d1de78a9a0d0050cc4b9bc3b798326ab54ecd31864b7402a6e659f219d785fe2e214021aab8c000367a0434182b" + }, + { + "tcId": 69, + "dkm": "d5e70c92198f85bfbe6f4a1648ad07248fa528d79a4ca37506d7517f29b60c1a0b3e9ab52b49a740d9f8e0160ac975de3e7de53e6ba375e7723a2bb3f46d573327894bb1f799983c2b1ce4d5bd836175533ee2c9d994ee162116519b397116a1a80354b392f819f0814143aa0b04c904470d862e8a21037620e5aabc275d1717" + }, + { + "tcId": 70, + "dkm": "260ab9120d3778edb0d329bf570f7a4506c7b829f530bce609b4648bb982cd122b3ca08501ea4cb95bdefa85673cd50bb0cce82881c6e99f566e5cc75a6113ef77de3f5d1991d62a2ecc8ca4a8ac18771b10c7682d8f163cc30ded518a7eb36cb42ac7a5bdf75fdb82ff0ba83c8101b9a0b516a9150d829bc932c52ac49d57b8" + }, + { + "tcId": 71, + "dkm": "a4a5d843e5b7ac9001c4c7ef2ab6b6aaf63505af2866afe5b5f47d2a3a9302766588763a09a81bce8b0b73774adb5b84814ea076b84fe1325b49c974410cdb16abdaf9501f99bbc24310a8b417d57ac5c216795cbc48a7149b641f20e057c10e6d5422c0b0cd3f8ccc4df42f761de3ffbca4800351bb7e3a117f52d894e0d465" + }, + { + "tcId": 72, + "dkm": "a7aa33a229ce128be108cbb4713aeec5166888dc2bb884c7fcdcd40bc5ecfa000c6aacf28192bde100cc3f727d61228e6e207cbd71a3ccdbc6cab9515b41fe945655ba756d6157426e5d1da85fafde55383576adef97892b2c77b59ddec5fe1c3c15652dd959c3ece5577e9f79c87dc7c8bf7c05fb6dc8e6cab687a1e3ed33c0" + }, + { + "tcId": 73, + "dkm": "863441730f849a51e04178925a841cce0f86ad0c37f9ae40f56bdbfc78d645e6164e514fd74ca88af653d4a03f1e8510c35729911e3836c36336420dcce728eb9008bfcd4edec49a2830fb7b9f336681825d70f46c587e7b91fa98e0fbdd05f49f1d220e0750a37104c271b5849b578dc902e5359f5e7136175a912f105ea0ab" + }, + { + "tcId": 74, + "dkm": "ced5dcc5a7ffdfc139dc8521b47f89cb6c402871ea611b7fa2ce78952b816f696099c068b770494d59292738cfe16111aed42201d4e2a9813d76d7503148d7eec5065c90bf848c13f18d32525cb7ef6045c1e6e82e8c08feae894d3bc8ca3250269bacef97028b9f740486cd25c7118a8d6493769e167616fd61a1c8f680ce96" + }, + { + "tcId": 75, + "dkm": "a2acfd74c44ce339376740ccaffe0f7b28c58971fe672588f653174080f88cd561351d93c9c445f9ed707ad89caea7e40a8d769ce84b02ca3ac5b910df4fef26c2b7eee0fa7dd4cf9ca8a49bcee8d1e94ab306cd9d23ce8822c4a79bc0caf8cdcb260ccbf303fdbd4901a53ebb95d827690533205cf09c0e1d2c180c61944525" + } + ] + }, + { + "tgId": 4, + "tests": [ + { + "tcId": 76, + "dkm": "c6dbb76d4d92a3c79d5916e861ae2bad1147dddb41b51ab4a91538607c6d1872ef229ed2d0b1c74d0f8b1a34d94cddd3e301326908996a80b3ac3b25dfdbf990fa5a3b4455785859080194834fd67ed4975aedd3dd00e44642daa068bb90f65674221a095e8007d8caa803d257f4514d6f4720867730e629334d98b3f52c2bde" + }, + { + "tcId": 77, + "dkm": "e574a70f228d32b8e4ce1ae48247ff780c51fdec86b5277fb409c3b426513381c8f1fe1e48c45c0807e85e713461b5b9278b82f379f3afab813ad637f96135b4abf0c1f6eac48ebd81c5ebd0d6ad0f44db3f7dc36d401601cbdc2e29c6e63481bca1d8d80130fa0dc8bf1e162f6e753da317b645bf9e0051db1a80fefb794def" + }, + { + "tcId": 78, + "dkm": "a816d8202248be2c925178bd4a3d649d68d0aeaec2aa4bd1160a3e88044e340d7c76c4a595ccb7b1f3ba70a71df52c993a684235dc38e46f30e168aa72f362b5f24ab8650f0e87a67c77ef40e3a08a3088ba6cc60e69fbd07b265392f00393c269f9a486eafc35c63cd6c1c7d3df598b11c9252d86ff547d891a2627f689e005" + }, + { + "tcId": 79, + "dkm": "1091b8d1333d9d31420b51da1d4387cf47a70e77ae1e5318a03d6b626627dd57b333bdfa681576ad9abb2758bb851b829120a23d8c8564d9767f941d916395af812330c1f06ebb87d386537fd2a52e5a129375fe862eea77c5d7279175754c1d8712a8cb365a6b92f7dfac2102619a871823302a4a3d6c83cf8842cb5390054a" + }, + { + "tcId": 80, + "dkm": "823e7818565ddc8200d6835c1ccf451f2f4a231b68a47d85dffdb66069b80a69406a4fe6be707bc2cfdecf1829dddcfa13746abee61f21d3bc479344b168171dd71b2f460ef8f5b4c578338b6f676b170de667bd589c8e614aedb4105b76d898ce363552ee0df7740a3f4231e74417cf94a155d5fc54f88bbee0a6a82e5ebf16" + }, + { + "tcId": 81, + "dkm": "0b87a64b48176838b31572ec5854627a3d9306e418656e3dec5d6f8305f927f682d9a87d499a166b4f6b145d65633999359fb5b116276bfa6e3ec09aff255e824592f56a44d29dc1deb26144aff9e2bc76e5d6a5f9cba909d10c3238f04977011a016d1ec56905b58d63215621dabc37661df61aa30556dab6e2468f8a9fe304" + }, + { + "tcId": 82, + "dkm": "6302a349ef5a6b26fffb1599b7949f36d55aaf34c9f99950b6e7d6e32365dd8c19bbfe68d3f6e39dd8b84a34ffe8457077eb9f8cab26505e755f31220ce95ee5a30baef0115ef6da9b72d8f398e0107dc2c2bfb14bdb3ba28a5d8a82167bca975489595ebbe8a695378cab88a0350356ffb11927dd0992aec66d67246713fba8" + }, + { + "tcId": 83, + "dkm": "9c0f5e5eb1dbb55c9cbf3137d7d2679ab76f7d396b4cd88a07f01e7a56689e654e72dcccf58d31de2819505363126f73e1ae4df400d063ae5f4eec52d5538f4fb89701dce05fd302d91f040b3e931639f1a49a992c2b4b376bc40cf98168db659f941b3cc52a83766fc286153f3b0e40aac2b8d8e34ed4c002362d305c84180a" + }, + { + "tcId": 84, + "dkm": "ac3a6e64258d82d4ceb93f1cf5fedc83dd3574c25fa8d98831cb8c5e1291b2a82ec0ba958d3816ad691422cafd58b1a333805fc274142523cbd5e806b4568015b52a725841f2f3ba0f5bc626c06a788066e06130835e82fc9a8a4c30dec5a025c73e9ea6fe10f5ca260e809c29316bf4e0bc3fd5ae3f0828465285026d09f8e2" + }, + { + "tcId": 85, + "dkm": "c6d42f3ffaeb54b0ff7ae6267ba3a995a684bcc2478c2ab1c543f13f2f9e3ba0ad9741d44f6244b4f4b9d2b639168475b0b6f104c2525b10379fc2ad0a7b87bad2e924e95259113defc0d8a16979a7998a082dc862bf37a13391b048cce9b6aa42c706655d5feb7c1c47c696738a4c455c3b94fd9da8acc954df4944417d88d5" + }, + { + "tcId": 86, + "dkm": "ff8695e01ff4220006760094deb14462e85e1e73521b130a97981da073fb4dc5a0d7c0f4f3e0c21ee23c221fac9b156957a2b1beb1b63e1db1e37841e3c2b11193b6ed458bec99e515acee5f32c81ba8c57ad56ca2dc530ba680278bad19d1729539c9b92f73f1babeb5a93e7b96af8a6537a3dc0b481d1a55ec3026f90059b5" + }, + { + "tcId": 87, + "dkm": "a32e745f3f67335b23786ed37d3b63146acf3367a1d05254dd19a7cfc84baf7338defa915de662adc19f49813f0260fdb9029d04eb16078334da70a57b99e5a1975f582d0e1581554d9286245a2cdb296cbd89316c5fcd2c8e4e4d65a627e790cde6bf31d40bdafae5a995c82ed81f275790978600614f065b9a71ad8ab2cfea" + }, + { + "tcId": 88, + "dkm": "67e74111dd197029294095883e78a4209fc035dafb6e9d78c881ac6f7d43915ebe29baddb2ab74ce4f66ae533e7b27e38904331ec14afadd73282ad3b12468e50fe144914acf93cbd0b26d9303c5c4d9f78c86f97f08701dc220ca134e3c78af630dcc7d6be8c6f5010fd045b4cd3028481ec7db38aca3dbff9e166ae9094828" + }, + { + "tcId": 89, + "dkm": "43dc99c4f29040eaa8383155bd6fff8664850f6f50aa6cbe194035e0d5e18fbcf8cdf27ab1bb020131777998ece8afabd484dc75805b46fb096f1942a04a3144f28f844cac6b06da219b28e0990a9c8c6f7c6cd7ecfb02dc4ccfd06cf15cd5a101744dde54d81b50e3d32b90a31b1ac2833d472129e4668bb76fe8e92fc23322" + }, + { + "tcId": 90, + "dkm": "bfddef0d404dd8cd2524110aa382023dc70cc22c8ffd15822171410e457e2aad89e38831171c9a8a2a8cd6dbd0a1ca3f1b839213732c34a0dbee2b92a930be88448e0bf5a39d958ff8ecd799e30a9599bc3fdbc74bb62490f182e085343f18a4e22ba39d2fd414d15d5fa324847fde3a3fcdf78132f47d3c00e72686b71c4799" + }, + { + "tcId": 91, + "dkm": "39cf0950d623f02135fb76a63b5894cef3fcfb17d910ebb484fff7e9a0a96197f7a69a35ee67b0c68c6ec5af127c78a63b095049fbe671e4df132e764b87cb0f9fd56eba7745e51bb27250d86f4102c6f130827fbbb22cdeabcb6094514ee0bb618e121675dc62a50661020be4ee88fe365cc2062d378193b00d06353c41d41a" + }, + { + "tcId": 92, + "dkm": "cf6b23873292ac08632e58f1a2593be90b46708f24279c65d30244b4996d21f7dac62aa8c3433f03ba868319cf71016180221b22621318953dda70ef730a68b05eb622db4e59f0a2ba008c236a5d7ae2055a3b46329b021e91fc7fc0a0fdb71722fda492a0c5f1cb584c627e2d0de8f0d4e2f1dad23eab24efced04fe06198cd" + }, + { + "tcId": 93, + "dkm": "6d43380fe6138c565f996a88357a4ddf6f610d84e089e4374b310dd85746e0627c9aa1841eb6a9e8826057815ba474141d0eb758b454db2012b9ce18e6d0fd552994760a4bb7dfb42dca5c5ceacea2d5103adb3dc8d6e7df6765a7872af2dd3ebde45ce31986cd238083597117b3afd68f9e266cbad7c14d66047585fa46c2a2" + }, + { + "tcId": 94, + "dkm": "a0bd83355930736181655ef53c3d0e717a131a38fcee3d366e0f84530e09749506e813de7a42e52b17a669f24b8e7ccafb97ecd797a008d0b5f3b0764f5489d40f5b9aa319e6e1d9866dbf107fc8394fe98d702cf485b36aaaea932ac9a292c68ba2aa79144894c144aa868384a0b36370f7a6e613aaa11490ad59aca426368d" + }, + { + "tcId": 95, + "dkm": "b3b80438f3b8698e346f7b4186055e6719de1455acac22f0b28e3da892bf6ca01bcdf54f195b4b4a443d8b3e493d97d061df0c823ac846b7a51ef846d2de586fa2d7dfa7146f89ff881948cfb0dfc2b05f59983fc9a10530f3ddb126df427cb5da1125e9bdf72d75b4c9228c97289a5a2f0c3984103b0b2564216eabee355be6" + }, + { + "tcId": 96, + "dkm": "c2a99d0bdaa251c16e07f909d3e15a9258e4ace3e66125555e26c61bb32625bbda504118894c3f22c2e0466c97111a1ed95cd9ee4aca19e33378cf6f58ee29681c6eaafb3c6817d0de130b28169e0a9604171fce10c58c4c150e81abd260b8be056481f8ade4706ba2817c1065ec184cbf42941e6ea954a4aa6c9087b6a99c11" + }, + { + "tcId": 97, + "dkm": "5140b2fb646b30e0206bfad05e8fd7c3ffe91ebba9b94f1506d29d480428862685e03b9ee349a01c2927383ccd10ac592c31b66f820e27a3caaf7cd9f68d2ff609055832770ef9c6b211f4ff96d5a67d53cea28049bac89478c5121151d9ee31691519b6fc1e5a2d6a71792d1e17ee9030d5a448d02783281d95a03ede27fcfb" + }, + { + "tcId": 98, + "dkm": "37754307ba9dc04dbb95b68d3852bc17d11c83cc152b90bab7a91d163cd26ffdc4acef9cec52be860e08b8809891a151dd8ffed72607d099e41634e5de3c1aba2b0404618950eb90ee698f129fd419fa8a19d46e341176dbbf44ccb32d5291fea5accfa40f543cfe89bd712ccc99d332cf3166c9931362dfa0bcc11be250671b" + }, + { + "tcId": 99, + "dkm": "da4a4587a600559a1e16f2ce3d977d4a137a7148f564836d4365c7d18d794e291716c7c9883b7bc3afb0ffb854c8462a295e3c8010e05227ae9b3684ccc26bb324e3627c8de0ac5532c529e1e196a79b242cb6237b68b9b18ab88b70c7ac3daadf9910974f2ae21ffae1a45ef282e8507ff2aba2d4d7cb7dd515068194b986b6" + }, + { + "tcId": 100, + "dkm": "95dfaa545a8a3805f7459f424ec44583bdce3cdc7bf5e8800d8bfc79ffedf68f7755fbfcb39aa94314cd14ae9228d37a7e096763069aa8a95f5b0e567709f7d1198bb7f18ed63df2ebcaf6f008db3f2c1eeaf58805d1d1ae17f1ad4e8eb3da79f1a8b0b61e3fd4dffb9cb1f6a98fb6ef313efc9a7b98bccd035b49bab43c0e3e" + } + ] + }, + { + "tgId": 5, + "tests": [ + { + "tcId": 101, + "dkm": "871043afc2c8e48b2f7a866693ea074fcd99963fb28e9130cac89b7d6b83b5c2b4e9e712c0d704c3e11168d45a80c64712cfdd4a8a3921ff46dced6db66801e3bb909c5ab91476fefd9cfa71cc1b5b22ccd5964d658fca13126b30c3778fcf277f0e776a7e9afdf12cf483093c2233fb6ee4b2f6acc101b4896d5eeef5d19d2b" + }, + { + "tcId": 102, + "dkm": "6ea546b3c32d520e84819bffb72c41aeac0703f4a6806a4bbcf5e566a71fae19a06a2eaf2daa9dd98bc89a83c1168b7c20606117661e502389d3f76d1bc476bb817314a4ecbc1db9d59046f718d3a0e073f0f65658ade2366886c49fa1ff5a3563e17d7c5b9004c0474860035817ffcce95b2cd303e636e469ec48dea61ebbc4" + }, + { + "tcId": 103, + "dkm": "a4a878e0751f98924e19aa43e8d4535cfd292094c40271def1d5a915abdf416c34881717e681a90cc8a1647bc78eff5d4ba9a05407c03249401b0d72e0dc6104a97b69b9c8fc58507fd1d014ef5753327d628e475b90d5e08d6218cd2a7a991929eee2ddc397a8290ac794355902868388f7e8a6f5cf7166b3cc9cf287691e1e" + }, + { + "tcId": 104, + "dkm": "041ed76c27bf0a95fc387cc1925ee65c83daa277b6b76605484b66d70898c7b7207fa01d0585afbb7cbcb3d10c381eaa83a4797c8031dd45ac7cb71281978e340563119d3099e5fe72fd8de9fccdac467773b3ab3cdd936eba16c2fe13eb272db712b947ba7a5b485b17ee16319c65861105a090ae0bc7b8fda6590186938a40" + }, + { + "tcId": 105, + "dkm": "7e20c5b5a84ef6c95c1247ae7466f6e79bb56dbf8231dd1e5c86d99724f0d7e8e48f4b4681ba8394945b98494177e4b253388aee4b1038b0cbf497395b403e1c4b660f75acf20c2dde64718e47a953e71cf7756f6f65fea34752786044266e262b3d5bbec6c3445044ad713090e34c64cf7251b2502434b05f50bec0c704a533" + }, + { + "tcId": 106, + "dkm": "0ac6324e014afef0852e0a3991d8d60e1db2f070a8c6f279a3b29536e92a655db1d855f9cd29957c2260226ce9cc31a67afa7681cea44b0ae1a4bf3f94b02c0ddd494d6975bc22afc5d59815fa1e546448d4c461dbde0844310c9df003db398d4c6400dd05ab6e539ede60bcc202e0037c5285ac30fd8546634a353c39c8c1a0" + }, + { + "tcId": 107, + "dkm": "a1a5f68265c4ece2e53160de6e75923f40e8dbfd52c2d2dab7fbdd00d903cce5f95504d28226a37298be70bb07ad80b0110911a78fe1ba036257ee129ba63b923393ef63d6366496abecf6f7af1ace3d955cd8b03754c89e0a2869258c7d7894133b49a47f0bea5eb5706e507159b0574839de7a3b7c3178adf24872e1150ee3" + }, + { + "tcId": 108, + "dkm": "91abec4908b9548305b1621170481ac8ab50686ddb4b7ce551de562664dfa547bca68ae97d25e64cfe13f1fb93091e4b4f990c346ae86814387e991d8420993c1f3a24e00c30439df5acd90d44cab247ae91f6f9073d17831f36a33ec2ea07208bdd9ab9648e71a0df0d05506da309ce8b0e08473b0df79870c27770cd09b5e3" + }, + { + "tcId": 109, + "dkm": "6284d692315f3eddbb0fecb3bafd88812df8118a4d6175bb68966bfee8a3a2b1cec19df5fb65920917a49f4e01e5bc236a826177ef35ba0c5d50a79e5b477ab6a9f8f9f91ab1be2395022435c33ed2615b4eaf3dc7cadbc96591f7802b66df52caa0508d11ce04cf71de4f5102343bf96b17c6f1d5cab70dec5564d45fa14f6b" + }, + { + "tcId": 110, + "dkm": "bb58995fbfcfe499aa7e58620cdc0d1af16a4337bf26b4dc0f62dfa488d201b43d373ee443b58486b560ade4a7017d3ea57a0efb4b15d698696eb440c3df199ba746ede0dc3033ac217a641eae06a63acfc2440bc64c1c3e4fff976914cd5dd228f8eae2cf27109d2a8d69236d094e49343dff2115be13ca98f9ba7567b7fd4e" + }, + { + "tcId": 111, + "dkm": "6eeb925ccec3e3e05503cc2139b9548d03cf7a76f6f4f70cab43f7192e2d484421a28b7b2dc605512098b5354a99d090ab22b6bb5d5a5f4e71e45ec2025f86627c3123954bd48b03b6be1c7e8dfc1086e834d21cbcac154787f9a270c70f9325a8fb9ba6b96167f7c05fb4ff1b9d3e229e8e6bb1e9d2890aa9f64ca1d6027f07" + }, + { + "tcId": 112, + "dkm": "da2861fc7360a63ccd21893463b3afd8e2dc746408454f445cb31dd0ca46d6f78faf73032598649b057760280d6a9eff28fe3e957de136cf046e8440d7790ee4535b8a3f5fe04812b43e1dd191e11df96d9da68a0c34e43fa6625eefcdc5af6e49442e1f126a8986ea8cccd52073a93efa60fa5944446bd65218bdfebc1c0d8f" + }, + { + "tcId": 113, + "dkm": "c6f88dc7393cb596ac0bef89e09a46531ae8a5cdf47189cd3c384f90d1bf0e46229630a4df14c8500b49fa6b50e2a6f6f446333c2ab369b2c1eccc1382bf2891c60f0beaa8d3680fffc6bc33ef5779a89cd938f8669cb11332c1152b827b0188c658619f340afe40b2f526df196ca6780f74e3b85da7eb808a9f3b3f2a7b69ee" + }, + { + "tcId": 114, + "dkm": "1951eb0cc4a968be9c72c0671a879156b9b846b4ce9278945c0cfa6b0e89589442cbe292c4247008dce9ace7bbdaeb3d9b4a740e52e90675239bd92f760042ebf2b11ee614274265fa07db1b8a3aa79ec0423e3a722d4128b7354e5e5ac5c77a0defc79c460ee98c5cdfda2b32429a3aded90ef3d8524e7acd75a4b15163c849" + }, + { + "tcId": 115, + "dkm": "394f1ecc9667c2f975f1e5d427dc0d8a950a6f73bd5833f90779be03b06fce520421d8a4fa0ba7e770a0dd5ef8a840bf758f4fdf4302bfe528f4a1ae18129d39624d0d6c2da360ae01cb7c8308b64654e904f8c57684f1e2f629791267212cea7326e8a795447feef2fe95ca188224855340ebd23e2ee3c359328da1402e772e" + }, + { + "tcId": 116, + "dkm": "7047ba7eb9508439b2b4f9c8f224168824b2324d11bf7f0b265b10729dae0b97a27bebfa487c60b0956b84e3540a2fb5027fd0738bb70e0cfd9e2c3a134b9e09e81dd4644adc5330104718bc9a397b0b598d224e8f06030f4d83d8f7b8c333dbe978cd17a0d1cf795302acfd6ddf11c8d7ebd71da75ae0c737c7f937ff6bf4e7" + }, + { + "tcId": 117, + "dkm": "5b4cc9d441da0fbb9148bf09735bb242a549465a241322c09dce9ce7dcdd8f225613005e01e693f34b843a315f129924ef108520a6ba667d5cd77d809f6de60376c215cf1e8d9d7369dee41475239fa972c719a651b937d66d3b613f8314f396b6c4388ee508016c80a2fa2aec0dab75ccd2c46e2672fd2b9cbdca2b392cee0a" + }, + { + "tcId": 118, + "dkm": "7d265b85fe184bdbf9853fab954ca324e942db6b20294dad0ed6eaaf0807012d8e75245329de7bf00ef8ef6fba015a1ab5f091037ebb3169a47cb722f9a3a5e96fb6b4c01af5eb62f4b8aa9a0b168b274b23232b6458f9d111535b7819876b5e61a1fbee95f12e7178efea842cd5e49f37d85d005e95f256683c71b07f798ba6" + }, + { + "tcId": 119, + "dkm": "533d0db8b2a0125190c3facba950c855d7d36603f46e2a21a7886ce404ecc66984e76209380f95a6edae5d2c8a128c4b4668989b0e41d85e478c7ead5570263204ebcb92f03887be9e0a97c67997532e5ba6b47c9e5d2aa47f6ac063cdb94cebd9bc42b33f3d5e1f87626a37616cfacd17d16b59d56c8965cb959d06c9eb1b6b" + }, + { + "tcId": 120, + "dkm": "0f12f57f7356f40fa068b1962a4e7e22a74cfd3c97cda27fb9481b92c82e97fbe2480f40642c98eb30c131b30d7236ac50f757225e5ea0af724ec502577c135889327f1c4ea0cef8ce709446bf005ae13362229a805af602424f8688c4cf4cfc74b974dadae5dde16bbc2cc0c3680d8f0446dd5caef2cc510570172e6cd277b1" + }, + { + "tcId": 121, + "dkm": "ec18713d7068a22ce520f3835acc6f9433f64e378a0408fcb3c1e6da3c578fc1736a3235e2c89bb60596503cfee79461828ba4842659bc974933d31c3322c0b16a9101bf7d6fcb70079c0144dafef662daa846064611525e69c9efc364d76cb46d81b03ad4d6fc601dae4c9c051186f8b83487e02a8d0be4416e9e2efd544bc6" + }, + { + "tcId": 122, + "dkm": "13d62df7b67f9ee2697c87bb5773cdbe27047c8d441bc41ee825451d1f0d8cf3550d7ebbefd18f5af6231ce3bfc32866ec181102e17a9f7fa71fc834feb9aa9fbd54eb2ec79baa968efd3da3bf474ec3aa26d1da35796e129a556f85f0c57d81c9c9ffbe49a9659a4ae8e22f9fc6d6af738c66ba9d42595dcfc44aed0602b9dc" + }, + { + "tcId": 123, + "dkm": "4b73d18e054d3e7404e4b579e6c713c92fc1a717e52d8167a243224832682ed4393d91eb6a2cb5b94cce9bdfafca193fc3174274673d0ef308b5d20836bf48610f6de00fd16061a1cf92473ccf415ddd05d6a7de05637be62feb2b1e8693cbdf11b6c289b0c4c0c052050ead45f8c5654a3f0d119916581f8398d3d7314c935d" + }, + { + "tcId": 124, + "dkm": "29d2b5c66606d34350dc1fd01ff5c42e62c9e589b3a0adffe213bd4ba84b45a9ad2c3a89949e560a6aa05a0bc912385ac4b53dc8cf6467bb04060c0555cab6938d2a125947f43ef10284b790497aafc763050701cf76b838976e9a2d8bc0c55345e9ddd8d918769780e1a9067988e5effb854c5ed0361e7e381e04565e4a82fc" + }, + { + "tcId": 125, + "dkm": "ed387660282dbe24d9e08e90779cb476df6a0d21d35274a85799f9680630b5a1dba8653c84424da45ce9c70f2f461647d8a74d925982d19685462362a03eb59bd9ad1cd031d105463e343e1d04fa7a316755917b36487029c39357938000916f5b66580f71322368089796fc607bcb68bd921ce08f5fbca40f410e091b45267d" + } + ] + }, + { + "tgId": 6, + "tests": [ + { + "tcId": 126, + "dkm": "ba16b9d652c304a6d49d2f7a18aee7b4e2249a13ec190c08f471b3b5c08fdcda2c3dd2288bd49a62009d0ae112e968e99e257899b974a28229eb53690bbb199b35f43347ceb56db1303663e77c6225f5dad7fa61cbcf139b8c56b74fbaacfaf2a777474e57f1ca81cd7db157e69bbee16b39b4259a7ccefda6da2bc70a0a0971" + }, + { + "tcId": 127, + "dkm": "bc9698706ce7f6024a8b8d924850b8fe2193061636ba622b8eedce9f6c972e55401d5cf10f70bbb6eca8b5df850496e14e46284d81d741000d71373621864806797abfa4457611ecd53dfec34ddca7bb4f6c8126f7836a5857f4540b62d050bc7da24dd77925e4118d2e6896005943f6f747a50f39a299771a02b7ffe1694a45" + }, + { + "tcId": 128, + "dkm": "10ea13d1d7383cac9b1a9101230f65a84f5a67959ca410ec38b867bd8f4c952f62b45a42fe49f042a365bd006506f820f75fd2949abe92dcbad7a7219d9a20fc3005c51946200a8688293b354e909e261cf6eb90aca470f5bb8d3d01764ad4124d8569d251f3127e77611c6100f2a78c6387550393dfd15cb9de240d71714202" + }, + { + "tcId": 129, + "dkm": "f6d05a4f7b8d4ec55b0596b8893f97354c2f9371d2fbb3d07ff94f44f28ed235747554ee69395969430b8a9335b7be3d3b6509ecdc24968262c6c910e0fe54b3869a609f6b59a49158909e1e79b416778a778eb535de7d5d1d5a265dd7199d7a1098ef02a4adc9049affdf46207d8a64376215b76dfabe5990f4e93f76832d3f" + }, + { + "tcId": 130, + "dkm": "cf0173f622a90ada2a0573df8330e76b2116cbfa23b07ff32bd95f9d9b57e37bbc8c51f8630f92516ab74ff67a31928b99152bb6c1796ccb74af817772ec91c6aad623bf6375e4cdb162ee5830b976273212d8804041af4e752157eda1e176edd0763c1138613af35ef2fbe20f917e3265d56df953891ed1df00c0fcb85d50e7" + }, + { + "tcId": 131, + "dkm": "83b478ba21d9c05c6a865910235aaa190104c9725355a4eea56fbf02ee95cc9f7bb0c2eb037c739a309ffe1294f6a8caeb593b378c27b63fa63264c67f20ed96a9961a6e1779319d1712919d85ba2c6077511112cd01615b360ce958200acc1463235c3afbafa0c8139be32b9391518e48c237f391229409a9a48e8966cdb775" + }, + { + "tcId": 132, + "dkm": "d3ccc2edc2aa3c61d29b63e26724b0912e143fdc901e7631fc7d5f938e43220dcf8d4a1ec571883d267143e46b29225817b9c4e5e7aa73665204081fdf331a1ecbc5d3cae3a6ec3af8d75e11abd844c8c60dff2ff6a680f638529aaf7896da7d872737367f292b90b0b28ff8465051427d8e1e1f8a7324ed1982722c98d7e9b9" + }, + { + "tcId": 133, + "dkm": "979153bf81fd9d1e1d91f0f7504eef1f75753e671474b0ebcae82d3ef7fb847b688f7f427d7bc3dfbfdbff44a918099c25ae1add9b43737db78e097e3073bbf2f8534d23f4ea5b9645960bc4eb785df86881e34f4c4403fde0208d9ce213fcc799870abad6abf03ed2db524aadaa2f5022d0f0828aeb228cdfe2a724f69d5358" + }, + { + "tcId": 134, + "dkm": "44c9eeb4e9103feab726d08c77d705a9baec525c49ebf219c8035ab28fa822a19f076a6109ee9e88bad666dc7ded9e96b749ef8bca0d724345a1f00242618a63e1961fd04bb85dec1ebbab1b5a84f6b5f7ab1c37a124ab25cbc78df93e2d61de004399f2280746f3f1cb750ae5f245bbb4a65e8f035af728fc19d6bf03c12802" + }, + { + "tcId": 135, + "dkm": "49ba9ebb827e4543f3d8dde698e09e1c4561f697a7da387562e1da57800eb4e86673335fe9a6046a3813c5c88bfa6a68893d286e3eacb4373c8853cc5d6ba191b6e4a4448ddaa9bccd855976c30cab5680dba2b2c26dcc6771a8d5c61dbe6e88a8b233f1576ba8b6d05eacc9cc131a8ca63c1cde7c2c7a8e49d14825b5fd0476" + }, + { + "tcId": 136, + "dkm": "46e7d7579f767bb7e3eba5ffd4838eab57bd6365e4471196dbcde1a2c55ecba4b32392a9f8b186f1509f42b6445d3b3a37c017908dce85abff7913382c644a7acd86ca089c0109127343540dd0741ec3021236c8b700d746b65c7182145ffb3da32fb396d58f3211fb11f7135c6d0dae6b53db897dba25bc623f12292bb42d41" + }, + { + "tcId": 137, + "dkm": "a3ea3b9e854367c3ae648f6d7ba53f20bf6ae04ba0051bffaef76e3396832277e7895a414392979ed2248ffd9636a7498a69925161d0f29fb9c5962cd01f2bd4712e52d5beaf3661fe49680787ad10d55527c4a6856226cd999779e3518d809188cf097469190e5ab011b49c44e781595c92c7bb3ee38e66daa53b009e0b0066" + }, + { + "tcId": 138, + "dkm": "c9dc71d23d9e219a00b487f260885e8ec5d9de0bffc6f8eb277f9a2efd8a530d0c7c912a36ceedb6e0be47f01c878b431b1edd787ada941e70f04d37c893c0c1cb69b6d43ad9be42a1ac15fa165e600ae9b637583999a74cba2690fcb2f70e5bbd02c0e5f17fa278b58a7b2a37f0e4646b0897a81fdb18a56d4c8aa6e1553650" + }, + { + "tcId": 139, + "dkm": "940305ba86e18f5e60122b64f6d0f24739a38e6a120885db1443aebbfc92ef972b295045162252d8e0bcad1b455227fe57385d14d26e39aaa62982b21cf8cfa54342b4d4be26f41d9eacfb646914e4112357af0d0d73b6cc96d732b89ddf41720a7ffa47feff3bd7624335c083db8130d6cc451b4aa6b5ea83e9bf48ef05d00b" + }, + { + "tcId": 140, + "dkm": "fe01ea9f4eb245ac31275b5dd06360dcef8433fc87af93226ce3dcda0d340156d987fe8705d7cb093e14e2846053d755024849888eb5b6447899ebc7dbf37255dbe8fad5594ab8a85a3cec4ceee776b1a752bd54ec333259b53ea694f053f863cc75815337f05bd5aa9bb81a964ef60f4a40e6a4c493d9500e70e875da336da1" + }, + { + "tcId": 141, + "dkm": "ac381759deed543841af81d60c03531b06abb37eefd2803f06309f65868ad20c376d98e6803c6f991ac52ef4bab92b36ed8fa85dce2aaff5eb741d61442900cf0cc410f60edb46297c55da92bd432769e0d33faded16cc7cf9c5f5795990d906b47414e4d513a63686b0427b412a8abe40cade4b9394a3b053e34cb248665264" + }, + { + "tcId": 142, + "dkm": "39e78296a6a4a4c7a74f157b82827d738dd2e850e37085955b5e3e5ddcb552cde5b4a1c171cc07366384372d53bf2d8c18509d38d85f19f5adea6d6d029d3e0ce5bcf1fc679ef31219ebdd466b96ea782ddd753d6a74abed9053e50960a6dd434bee05803de57123168be225a39788e5b7294a86ebe11b27bfa6761afefc37ce" + }, + { + "tcId": 143, + "dkm": "5474164eb9f857c908d57b8d313c098bfd7195a44633ffe3394e2c2001d55df4b1fc1a6ae4f28ac794c482257048967711531060f6f64425e01ebf63d8cbcc66e4c345061ba88d7ac793d52ca6be52f089e8cc0b9c217fdcb3c90da49afe2cb9bf7b2c3f6e20006d5ee63e7ac0b862233b12117ace82ee96bec06fe4b02e09ff" + }, + { + "tcId": 144, + "dkm": "58ebe775d9fe5586e3f4daedb597e37ca588cdf4716403ead5fd845f41b973b784b71cad3bffa24496a85d516add8d141173d08c78a713cc4345e9118cbdb13eece7c0c38b17f236e5dff1a4ec3af87f66c668db741950914a41e6b82b1f02813fe4a96cd847a0f16bedf98f1dff69d00424852bf224eb436a2824cce5f90902" + }, + { + "tcId": 145, + "dkm": "17d1f5471a8d5403fc29803f040e82fc5b7b09ea7afc5bc8c99fe1f0b0e50266dcdcbef773f319044d58dbf7edebd214dc8ce140bf3ab04cbc3fe13a2f1fce80322eec43494cb2007d557ed3ee9da254800dd7095b68de9524449cc9702a53b64682c9f8fc380cab8688877f43821ac4d879e5dc7fda713fdb92e98ac2d9db44" + }, + { + "tcId": 146, + "dkm": "c48306879010c12a91f713150e1412971565a118871db6a23084a2c95c33a02b65ff433b1a7f04e010122bdc62b324ac68f296e3619bade319cc8d20a12f593d299451ea7613c3e9c90e1cf6a442dc6c6cc97bdc30a98cab52066070d8aff0b967a5ed2e9890a5d5c498e66d6ac7a25d1fb08be3005d2d64ffea9fba662aa22c" + }, + { + "tcId": 147, + "dkm": "1616c8a2dd2227119095685623859b13d8e0b027117a1779fa32b6e15725d07eb114879c66a34ae0652e6fca8fff455b59a824cbb1e2c447fc08fcaa609ccc92e025190c4a3128fd1ca89053e286bc984fceca65bd6441d0d07c65520c3d58ba14061bd652f1bb682a7254b026819d32bbb619ee435c8d3344ea577bb84bd7a3" + }, + { + "tcId": 148, + "dkm": "02d33982d639b8ae840375ae2da2365a046597af9c4e0a0312015222f4fe6ff3f2539cc231dda02418d55fb7af332f237e60e40ed7cc4a6bceb75d36da3f2a0678c5f5b377bec8c0554b0766a859e1f1e46b6014950fee35044c4d447b1b99ab76c2cf09581d57647727615445dd4f7b9deb2f3b63c071a05a6419d05cf9b4d8" + }, + { + "tcId": 149, + "dkm": "3d65e41d14a5a76a4c355b4458900b1cb0b0764ffe5c832a0fa23c6fb6afd5340d78d42e29244ba58e4a873bd97fc937c8b3d3fd7212dbdd8f3587ce66944a2f89ef64fae24b814ac405a242fe2cda32efd537b7c2d26b6e9a69057d8d5faf9722da48c4768488e451a42d345e6c73b2cc817c71cc9aec3474892818a6d92c99" + }, + { + "tcId": 150, + "dkm": "fa2ceaccec5cac603892b46175aac276294e8f0ea4b38595e3672cbed5e71f2433f7cf474a671f9da098384181aa82d2f28906e2ecc126414fe6f609cad5ec19f53accd4195c7f1ee52eb456b358676b82cfd3496028fa851a0ea6a762cc8d813b6eb16e718a83469c3de525402789d82f3844d233d210aa271152b331eb7725" + } + ] + }, + { + "tgId": 7, + "tests": [ + { + "tcId": 151, + "dkm": "6ac5db3494f02a7584f59e5ba09c6e5178973d86ab835be8655f7ed195dc6a29bb5d30de713b7022f92049f6846ba92059e7c2bba20421118adcf175a189000ad57c368d144f83f11f906f3c202d61a04197a1f5af942e686942b126f01f066104258ebe0c16a119b228e9a2f1b4705bbd7595b352064090eaf23129580bb899" + }, + { + "tcId": 152, + "dkm": "f0a06dc9363855a3cc64c017abf9714486f734dd9fb9a580690270f247bc8cf5a9b4dded2bcc6641e03065f280ebd105ba91e6011d2453be75fc0ec041c2bd9dfc96e902c92c1e2e74baa36c51553d8b36742ae0177cff5da9e65ca5e2c8ad01abd4f7187645a339d1eb4030d3f646d95fe23684d2d05fb18e41f09186cecd47" + }, + { + "tcId": 153, + "dkm": "80f0be425fbf4972ab9b5726893006d7e2599cc4855e048a951f398fd764f45f5aa53cace88d66b1151c4123434959a060d9de9641d3e04e5d24858566b3ab45553a46c856eb6f0265745ee35bba946e5b418404881d43570900862a917ae099d22b78d27297e889ec9bee4c37fd94c21e37b3b219834013e98d199fe7a45829" + }, + { + "tcId": 154, + "dkm": "40860fd9713ce160e605296a16257f450c61f08354aa93f96421a20834a57da82c4a36a8fbed0a2a3c77ca045ae53e45622cf2de8806f2ec64d5e9fc1d9567e9f74c8e747dbcfe2579e5c84a33c38b6900c6672a3c259d0252671f802d6a4e8b4b78c00f091136eadbba9aaff89f388cb6376494d9d0d5f40bb88344d8ddeb08" + }, + { + "tcId": 155, + "dkm": "99c51c8273bd2cf46a048a665acb0bec22ac7d10550e3a661272ae9741bd69cb9dfe3624a3fe6f6ad89e05e615252a0ca8fee9c633ac41330521df3e654682d814cb8021a5af890a0471c348308a3241fbaacc0f72465a8fab18553af9765ec11eea41b736c17dd361312561f09643a9f4f4678096d2d4c2c75610d04aba7976" + }, + { + "tcId": 156, + "dkm": "f90c3cbaab41ec5960553fb9e41125111b6a4d622602b772bc881d2ad14aa27f8b98335f73e06858e96aeafed6817c9a7f3818fc77f4eae24777ddeca6f5896806f6d834cd8be4f5d70e412ca3d779630b18c705fe26a4efa05e4b0cb2534657a6db041fecd3d1417308c6464f56fd8bc05f4919823ee80c882066041e5a33de" + }, + { + "tcId": 157, + "dkm": "11d4bd718a84691cd1ff946ba37c9572b2f319c9fa0294097161b77c46375223239e8ebb90719d65f5864bb358a74cf028b4845548a6dd776e56e9a124821b89412f458dbdd615a4439418fcfd82b86d9b7b7e7fa41c1f5280cdeb218bd7015699ea906c8a2946d2a3cde22dceb906dbdc7ece8013e60a6d5b79c19c325b7cb4" + }, + { + "tcId": 158, + "dkm": "5cf3a81564cfbe9c04c860c428a63f07997a0ab013709d9a79ae9b508ea88f3a310d3167c98ef45f660d035d5408117b02f25c975dccd9fdd2e5bea01a70afcad5a09c36188b068f24d82a262139780762db46327b097e78b3dca6e62713805ce3b5b9d554890560515f42551763d5e079c98dbfcca23353b653c389b32a453e" + }, + { + "tcId": 159, + "dkm": "a1c80a986ddbe904118d27b3c3f63e6e498e038ab7b3718b1878c6daee594ad875aaf0d7be20bdb14ada93ee7af8153ade4829fde22d59f1cc24feb88af5a03b91e4d5098bb1653f69de28673eaecf57b338c741cce5db7ef30275e8f0e8c8108b1cce7f2e20da1bdc6efffe0c34a5fa1c2e4631c98f41f5ce16601a43fe5327" + }, + { + "tcId": 160, + "dkm": "904246ced7c296bfb34964da67fcbf5990b0724dfa989b03b70ab99e7458174402ff06e3e101502a6d1329de40bc253f802a0cca309b413e5d33a1393c06fb190593b6d1748d4f40c1c8283c62c5115224daf2cebe96bce0cd8c10c549f43500dc66dd054d955821e32df26a39178a97622ef72ad98a625aacd12abe79083390" + }, + { + "tcId": 161, + "dkm": "c3375324a3326b1842cbc33329bad977e2dac9306d5d6e3de98220ffcbbbbe583e80b95f62f08608e9add205b93245ad0c49064a6d0086e73c972e5121b6c80e84179f7aa2cad5f254bf6578e04880b02470d3b4583a99f7aba3962327b5263683ce6c00d3566854e915764045651ad12ce1c174bae720f062aa13caeab53db1" + }, + { + "tcId": 162, + "dkm": "63c0bcc034677473b639d988bd42f46c21e5deb7923b0b5297af9c5c61fbbe60d638ff34242c1770f2302a37b2cffd4ed42b69da3e0b46758e3e59d07afaaa186bcc8041828a730ef857281b4b372fa749ba72be60d057c399821a1b6b6323ea830ea6225774fe9203dcd093df2b67baa1649fabd73d5e90bd0a43c38bf6e6c2" + }, + { + "tcId": 163, + "dkm": "e241dc614f6bfabe207ebf8ff973507678e62d618c56ea33a139bd8c7c7561dcdf1664ae73e77e884d970ca5768b0f833f624e57a3a6392c8843d983656b69702609665fe5e3fae23ee692b4cca9f68657ce6fe5888b6e642a5fd189e622dbdc52e44f26c254fcb1b2c3a04cf9c61cc61f8754d6d72c1a3e261be40160cdff95" + }, + { + "tcId": 164, + "dkm": "b55ff34d2f520ba94c674d9b1d7d57c0d9ef75c2c0765f4d3682666a454921ff4f3288cad59182d41364af4b48ef19a4c899aaf22733ee2fa346b7644f485f489b54c7c5e3bad56d289ff289490924eafc4c6506f21b740a14203375b08a9bdb03103fa01be176e39d21df2a0671b02c52115342c6ae105030e5a357123f21de" + }, + { + "tcId": 165, + "dkm": "b594cfb39005bff2456531a1bf81f8beacf9d2fd03488a4ec0feee145a0b4519af208c8b2e50c17cdf6ae40237d4264ff53d308be40bc2332e529c981f5fec811b48edd9fc5367c3b9b9e9d15eede5657e5f27e49baabff6e86c94057adb503dd367015cdb1b42521dcb5a13d3cc5825bde142ee27a5772276de26692e4a33fb" + }, + { + "tcId": 166, + "dkm": "f348bc7c299d8ec8a0cd834cea2f565417e41c334fa8949a3bbff20a8315f65ac390f1cd1e3b56aa24b9a12d3ba08c215fcb0341306d474edfd61df79b0d5f322db8fa5b30f30e19ee145a1a7024312fa9961d4e4d0fd7dbc9e0531060663901406d991251e73752188d005658636e508814c8038e8a7ed920be8b89e8bb8b10" + }, + { + "tcId": 167, + "dkm": "fca71055c1378da46384f58d2bd33c1d7949f247e6d25d2e938d6a83e34145cacba1ff937a8e303023ea41335bcaeaf97081759d2313821d484d0d0b719591e75eb0a9f1f5d29a6c9aee490b44848be9509952267661e16d7120d6498a90d33f66d7e007bab59e33ab27a04a9279f8774fad87ee7e1d2fed40e673f1845be1ca" + }, + { + "tcId": 168, + "dkm": "788f959ae14f6c19ba51237aa50f9ce2ca6a3acccdfacd9ffc55c328265d20e47b2dc0a81ee9cebe0ad4ab57cf341bf1ea9c84fe71e6d612d835597cf55bc0000cf0cff91bea2046581216bc767a8b5c716f1afc2960b094fe7edfe8146db60817446c56e0d926eb42e68e7cb21d0d27a8f8757607294228c9d1e260c3cc90d8" + }, + { + "tcId": 169, + "dkm": "10c65b1e5fc247d385e0eff7ec828a8260c77403df04acb4e6dfcbc5ab1d63f96dfbb8368a778590d8db6e1523ab63bc660f3c11bf8745e8285139e1052b8b48a9f5cf0aacf8e9d615a36193cabc46ba31f372f5bdc43de5047d5df2a4d9e6478892a25387ad24be6644d537688b83f36d7a7beb9a2a4484f4b271f103ba76d0" + }, + { + "tcId": 170, + "dkm": "135f7d49a3e452aa94fb23c8eb968f77e42bab42d7ca32c9807141b6dd2961b42b6d0e4ff82f335de229788570e222e196fa8c711a3335ce2209ccbecebed2ebd7147024393a0cbd3cb198339cd8fc639d35d748803003a323864256e6c847879108a3495ca4fa429099f704820a52643d4b0b21299ae0ed8aab35bb9053d3ca" + }, + { + "tcId": 171, + "dkm": "b2a8fae4eab705d162a7d676f0c533086d65cb9cf5c7e204706c4b5b90fe016e47cbc079dba2d8d6251d5694c8455a7636fbbf77710df95bb720263613c7013d26ad1f9c20713668175a0b8a461c550316b82a76e52ccd56d775c8d801b5ad5fa03f6e4b4dd4d052d28306b3e10eef5f5f016f88d89589596d2a6e60fe7568a2" + }, + { + "tcId": 172, + "dkm": "78da1197efdf1c16dbed310268a730b83591f0d0d34ecd30df9c686effce47ab8be4d97e7e772eb71567caf06f35b0bf17918e4936e9361651eb3b8001a0d1da97cfd67fdcf71b60e1a86a23bb742d487dc6f9bdc7e3bfcfb42141918bdcfdfd55db1db13a05a4b4c419a5facec5bc1df5ce7456d831f5a3f55082d75dc01467" + }, + { + "tcId": 173, + "dkm": "c7efcf63f96da73eebc9ce6bc1f054cbe3590d7f75718fd7cfa836147d4ff2be441fbe8fad9a909d5d1ed26100e33bc32c765e1de0305880f7159c6d614b8067cf20b0d8a290322a8c12106d6784b2a40724ad682dfdeda95996828a5ea6da4dcbf35c0c60073cea97e88bf691f7d61d1af6342c13b224c037a4d1ef5a450462" + }, + { + "tcId": 174, + "dkm": "667a6e4bcbea5deaceeb7120ac9e2b574ea554097cff9394a14cacefd527d8744c8858f5973fda1fc6bd0375d54db0c56701c450d7e62eb48b0e25df118131df8deaad968ebdbdce44e6cf5237ebc6a80dada814b4eb5da314281383b7daad4f6e8685a96d721bf2cf74dc1671bb74e774434bc40ef61c710f518d848505e302" + }, + { + "tcId": 175, + "dkm": "04e8e7a39ef05656da8e604178e71782c0c9fece3d6b68084fb0b44375d13e6fbb43eed014dc73a6eb15a2ad9e4943f81777ffc15fa781970eb76689e43134d687a6005f532b2d766fc8b68a8dcd054a05e4df5f9474dce98929715eddbc744c8401a811cd64b1c9aa2b38069870466ab59e26c2a96536d7571377013ec9873d" + } + ] + }, + { + "tgId": 8, + "tests": [ + { + "tcId": 176, + "dkm": "1f332751aea4a058177ed37bd81f9f97b4e95907464197a7b4f931dbc56d76d293e64d430b4b5a710d2c2c1338657bc7c34d22e55fdb4edd168f70fee12eb878b854f2a0fde3cfdb5765d756fd5434882a118ccb2b6c162d175aa42a17224d57c5bc72bad9704c49129276cddab599ddb59e55c1a4c12426ac4562f25281e9d9" + }, + { + "tcId": 177, + "dkm": "4ccac9e6f7b2bb4dbfec0640ac5f808daf4e7d4983f8660b5edfa4040cec8a02cdfbdaa563ff1c8021cbe3903f285c575ee2e3cf78693eeceb8e6a6546ee2e97ef3b94f53841b1c1d1f2e738806b58dfa0863b042cc402132fd7610fe19fa8b9caeec0eda298e55cd3ef36ec823224fc1dd650abe6129fa1786f5ebaeced815b" + }, + { + "tcId": 178, + "dkm": "6092e294ee345125ab3c3adab026732399037c7d51c345a98966d7e75fa2a5746f87b91509d6bfce214015dd38318eeb7c097ceef77cdb104bd915d5edcee44ca187c2ec0bf538968f0fcf5bcaacc86f9812cb49b22a5a8c2c64072f6c83b5c7b78d553e44a43957d4362ef9eca841158f72e0af8ea20bfc6c8d20b649c68762" + }, + { + "tcId": 179, + "dkm": "a9b48c5d737770090997dc8eb09af73b12f6ddcb863fdb2751c1b60331194a8fe36425e9e4c130b6116dd911f6929e13bb5d3eb1987b55787beba734b2b46a2509189d7b241d4b8dff7f0e5902ed3243150089957959123a2a4465c9218b7b7266167fb772bf3c1c6de9b3bc4714bec3b8f7a052084e31daf7dfdc52ccc6fa86" + }, + { + "tcId": 180, + "dkm": "aad67769f6ec0bf066f54c9e236b194d105222dbfc09b86c715fb5bd40306b3aba5b5365dedaa241cd53f19190e6c42ad41279a727ed3b722f410bcf0890b79a7fea87a376cfd078846a2b4b0883d1aa27f197a9ed30d32e73a68beb0f11b5471ef45f1de19014fb217ba203b8e05ade22caad8efeef54be422fd32cc1364775" + }, + { + "tcId": 181, + "dkm": "9d627f58d3380625446b970b09a344cc870607ce1e7731a8b97984068e8c2527a855af9b7ef50b8f6e8991bd921feb5e7a0555bc9bbee6b90fcdfdf723d211bd6d2247213ef7db7f4e56de0233f0bebfad1bed0cc378d07b484256a02497d9af062a8dfd8986cb40d6c6f6f5309ad7ed4ad9e5c5b0eaebb91cb8d9e28320f30b" + }, + { + "tcId": 182, + "dkm": "fbf281327ea8e33fb9026e561ab457128173b139d7f410d905e0b0266d35c3b712eb82a69383791b235a51fcff8f618e2a58312602866586b1d7599b4ee2a3f1ec27e2a54500fbe6b092cba423b057b470747ed3e1915c13cd25aca76f06ff9265747366b52875f61db7ac522ab24a9fd038fe8babaebb8f381f4dbc0209f356" + }, + { + "tcId": 183, + "dkm": "3fc8c76fbc3afb331363f20af2b882463e59379d8254c0d5f1c1e24f3481b76e0573fac9528b65c860c56e688b19d8d1bb35d1c1907659b91a2c8043239a0fd89d808551d0f1d9996b8b552a469f223753872f8f5d0fd22c57260a76b01dd7b03b7836d5189a656da21e2a40b5b99f5590ed519837a7497dc09192350156b69a" + }, + { + "tcId": 184, + "dkm": "2dfea1f592d71562a075832b145af6902cede8287c2da552635e32a226105eb4a60649ddd14c535600d4cbb00864416a7ac4831de9da6d6d3f02ef966097a695abc2e8236097feb8d3d39da6fa03cd373f3e54d5cb1f3a3c6ab9ba14e9ac2e033cabd4ce9d05385b3f353033b05789f629eab1b1a6cebe145f16ace1fe5d2ae9" + }, + { + "tcId": 185, + "dkm": "45e0129ce3827f32dcd8e2b4756ee5ff8a9745c3b763862a3c716f1af5c380dd51630872b602ea891ce0825b8e36079b6197332296a9ba172bd960a010450b9d5797d7891f7dc65e0d7638b7085cb4dd76555c0da8ea8dfbd9211120e5e0735750a3f2cd2c70cf316ebf1236fefceb9209a35e3e361dcade7d91c5ecc2ce3525" + }, + { + "tcId": 186, + "dkm": "079a88ad7252b18ac263d6394b54e14d7447c074bc4681222c2a883a77317fd0e2d2d4e84a5c6ec8d448b9b31ba015775389a19f02b6232b8aa8572a2bc006704535aff87c9753e356ed38fff7dcd2785093683206d716ab9f9371ae7f24cf17ec7f4de8be6f149618b7f7068dd830d5456a644908abd4b7b7e2a43c6af7b7a4" + }, + { + "tcId": 187, + "dkm": "ebafe520ddb374b1ab17e6bc680db6d7a3dd08608e6c1ddc3e06b230493923f89235c592171eccc9c78c802f33ddb5bf1a0209fe13f7170920437985ad3713111332a308206fe6776a6e3b0478bc2ef55187a43d8a2d66733e52982e45eed2fdfe819e3b609c6810ce61b5aafc59552fc4d487aea711864fcdc3cdf94d538c20" + }, + { + "tcId": 188, + "dkm": "8d07cb313346f60ffb99e185780dca23e4cdabd14489d650c79ff874a6ca3e38728be80dc1e54fa90eb250232ba5786604c388424d2be9d5ad274cc38f744ab02f5a25eba7459b79b14192447039a8c7dcd0608d6e656ca41ebd131f63e4fca4d98ba4dd183f028bb462b18d100a402f90861417fbd0485cb6a168d61a9aba50" + }, + { + "tcId": 189, + "dkm": "1a00a2a4549a686f3af1c2fefcd2f57e768b48e6bdfc84123abe867d05435f5aa5be12b4475f57b3b1205838f25cc1579d0abe02afd04114f023572b40e04b4c197f709d13d9236bbaca492e6e22a62ab3328e2f1bcc439f1d3a1d932d858c05955d154e5d42c3956f31ad43a6c6b0d01e3379120fb998779f2a760b3e76caec" + }, + { + "tcId": 190, + "dkm": "d3461d835ea0819133862f1351504b83664fda9a8fc54c9a5147d42282dc0222c6e22699b811d1a4e7b8735de9f8e19d167e3d18eb04b16d36a4d7ed688ea366da302b5a392c88eca23099fa56c1cf3c4bf2313d735bb99ffc3d6db191ca30ebd47ea82c72ea7147262939b890df941910edc553c0b58e884d7205ed566044e7" + }, + { + "tcId": 191, + "dkm": "37982e1def979e86fa35f28ce955e41829445a0bd4d38f69d361c2961816759d48c9c5a4aae3b20b3b545a8b009f3152a13282c5fd6fcdc98291360c71fb9656391bda46026831b1235996e5da45a99536507c8c4966cf6bd6418b68dbdc6485af86f97a51be8884c1b2cafd1ce5c5e4d670b6026d470b3ae6555f53ead3c5ab" + }, + { + "tcId": 192, + "dkm": "23b6782ac7446ca10f2ca08c4e91d0246f2bfe8d9a4cde3d4e793726c75572c3d89f02d17e627bb5a91f23c4bb27958570556b8b9c815140df2ed3dda9d72ec76966f580c2704ca455d007e755c3ac623c6d4f1b9c89609c73215c28093c1e53c1ff3ccb9dd66a9dbe1536590de6e2e9edb9bea020384bae5e44861452b0d453" + }, + { + "tcId": 193, + "dkm": "8e29c254e8403f5706ae41bba9232e3a9a7f80337822e442b306f2045aa270a90925ed8e262b18e424512baffb4351b69b615d47df9bbca269cca8cf7937a0b4038c5b82560dd7ee565c65511955cf10a9356ff9ae7c3c2408f573fd56b7adc79efa869f2d2d83290e271bb158a9d04acdc020eb4e195e0e9e26f7bbb30229e2" + }, + { + "tcId": 194, + "dkm": "e5d37f44c466b291eafc64a50dd22e480465f7352884e941ffe1f72c1814b2b350baf0306beb658b6848358f1f7960d1272393235e33e806eacbf4897230d8e5f2862ba43dace7e025f8d7b8c8e215ba965a5f90e988bcbec4fabf82b025b37b28d0a94e00ca7d2447dd16bf57708c51c76a711ea3e840642c041c3405d2e520" + }, + { + "tcId": 195, + "dkm": "be1f8e05bb3a7691e1a176e81ca39c739b8157401b4aa47a4edfd9acdd780e72834be5b89aac22b223a30fcea122b286c74c3b0ae5844d72b77e7a72c14c989f3a8897adf9ab9a25389e77db856f8a9c21b1feb78e5a9c086583de787ecc72a10ff95056545e4e99658d706015e8ab71c589310d18f4f06993601cceea692f2e" + }, + { + "tcId": 196, + "dkm": "9428258fd57551e27d315f2dc7d27e41c39e9fdbf3438b24331eb4dec71a598a1f3530917b6df501b1a7455d08abb751517c74c2ccde87997263c01f494469cd287d6987db93627e43d892e4c160052ac5e66a3a16eb8eda356616979ed45f51295161e31d4d6b38c605de7d118c21724495aeae6b0954411c8d6491b1dd30ee" + }, + { + "tcId": 197, + "dkm": "13eaaf92ab145468ca53958f061c0aa9ea10b99a99c3981332f305cf9578fb4b99f609f3732edd7310484a6ad63983b8f0df735322d47bc52a99489871992c80d4db5fb900d815db8959888d8f5e2139a03706debf4f9377a1db55a06fa32710207844840228052216e2941c794126859b6403f9c86040f8d12f0bd2be0a0d3d" + }, + { + "tcId": 198, + "dkm": "a63d7a277ed1012ff6dd0f97392204efca0a21859901254a7ede6e3c2482ce82bf9cc3a531fcae8c11c8fd533f88ae6c234f378d223d92c810ce08efeae657cf5c14caf79d5b43f1940c6c95c033caddc2880fd812376fcd9190bcaa83215df8b712ee3eaf011d65058f050e3062a5062bead29a784e7a0c975b3efba6978445" + }, + { + "tcId": 199, + "dkm": "4937ad74f134f4e58d68dbe78a48a39e97e0873e430b3763802356d67bdb46accceb8d9130e317d96ab0c3bd239fe116c1b3776e8bbf7599994cccb6375dfab382d36be10da13d17ce08d9bd1b4923972e15d4435a074539e5dd004d99f4056f5e0b002261ea354c5ca38a51e64f070d15ba874ccdf76c2da33b8d8c20031fdc" + }, + { + "tcId": 200, + "dkm": "dfe7c0a0e452cf05082b3a8480fe20b4a4d5efccea33a4e39235ea6b0b3196c3bb4a9a7d7306cf52461493f0a41df92ad82807e56467c3782262ab127afab248d6d75bc1b81b49385c89c7ab94907493b89b1e94b316a913d1d79ce8ee0fc6c552be5217ff03b8f2cf090f25deaed8e658c88883ec2d7a23f3359d0f5c3fc06f" + } + ] + }, + { + "tgId": 9, + "tests": [ + { + "tcId": 201, + "dkm": "44463094ea9f5b30d86f26bf5ef445337094b5d1a3b780cd8b179f2067937bb2150d66d87f18ac8ea366734bb898f965f8547960e150992fb7b8aa91c453aae84ebe28169de2dda442ee2f72e87c26775a88c1031e70d2c3537efc1f1f6bdc9821a3bb42f370fdcb3f203c8fa78a50c8f94e8a88e433f93dbf38b7efacb85a26" + }, + { + "tcId": 202, + "dkm": "84c41099f9d6e90e8f470a5a01a7d7c8f9e180576704ca954dff7ec2d7a609abff1eaca7fd29afc1be0a3d846833eb4ee3d30c8a5b671127db87b48eb82b98b22de82cd6819578648350b35caa1aff667c9a8b997bc147dceb03bdb873f4ee3fc6915a122f39cf43e78f38e36ebd26150b87a89d42b4233237c210502530109d" + }, + { + "tcId": 203, + "dkm": "a1ee5925ec6b4329b10e081cef886203ccbf70cf3e419c558b842fabf65f5b5b9e64f9063cebbcf1ca677879f6de34ac0907fecd0f3c2205dd48aedb89502ae10e05e881f8a0fdc07b87a2e016178722708de547b827f86d4faf31c191ee5d9876a665b42f042f732fd215a15b81b1f3684a2d5d58291e63f7c5328b713eabf4" + }, + { + "tcId": 204, + "dkm": "82b35a5e090870fcdc33e21b1935b6a3646ade8be37a552368f495ecbcade906a69d85ffd94538392ad7ddb92048bace9b913037584d489af5c13e1903ef21dd3d6200631531e5bb256eab58dad874093123e89500a0e956db2f20629d97c3308c363a3c2e57e7d802185e29ef115bae7079c9cbbc1009bc414c93f960ae6374" + }, + { + "tcId": 205, + "dkm": "77d47774d950cad947535acf4c2c395bb162f5a7b8336c00505731bf720e027fe7dd1274751bc32fecedd8fdaf4629b9cfb3b305436931a48d443e5b80f849074010e4cefd45bd66722712edc212a91c54d8e1a3d8df1412da95ae34e1dcd6b96f337cfc70c752ce7406e1b679e70f858a4b3f1f41f23e78bc6027dd7f64865f" + }, + { + "tcId": 206, + "dkm": "20e37fc61983554a0646021339bf2efb688f6deeffa3efc8309cf542ef1b238c338817250d46565c5bd151c555ddc3fc9f2f183fd4a72b1174f1011d937922917b0274a93dac71f5d00f66fab70d37b6ed4bbc6c4aaaedbbe2fbd89b4856951bcb3a6c4beba009932610c9ee5049a2d9a7188c586ed544f9cafc6d1fba56b38b" + }, + { + "tcId": 207, + "dkm": "4500a6f581534a5e51ef4c8acf0e2d039ab6474ad78c19dd33a61b23dfa5fb0b09c52c97996bf711873c2effc557a825d323ea425c71e2ac235edcb31563e8c767521a020ed4412755ea3224c155c51be7b6ccde3281c1039d5aaaa9e75a4539d74cecf7737bb0a6c0117daa82c2fd297dff2ef10d28b8800868a88154c7084d" + }, + { + "tcId": 208, + "dkm": "2b0d3a1348839e4ed864fad1b165f97fbb1aad877fd77ffa2abacb22be1c7fc7192145259811e7c24a1a5e706ce801f178c1c997ee173fdf3e4c814d0410e1f10bbdccebbc60c9461df8124da9324a792a54a10ed837cb27d5fbcccb4c11627de84820e9e7b122e2ef79541eb891eddcdb2cd2460225281101c3a9a2d94d90d1" + }, + { + "tcId": 209, + "dkm": "334fe57fe179a189ffdf4faa62306f6a8bd34c5b6e62a61508c28960b6359e6525b47b932124e037b5199b2b0c4411027a3a4e760f1eede91b4edda681b893b22afc0410f520a77db7ae940a0811fbc427bcac60c97c394b608c2a75acdfea9816f6347c94fff3cf91d5b3ae6e292d4c61b45cc84d2822778832c222ebc8a17c" + }, + { + "tcId": 210, + "dkm": "2b1df3881ec372525f3232d37bf53a59223b15ff2b29fe05361c52e207cc47f0c9583e40e0d8af1ae36d1f94cde55cbc4f862c676ea8a47038de1b753e016445cbdc1fa786488a56c5a263cf3ab99324398bcbe7b60ac642007920355b5492957cdba18314275cb9dd607136ff9fcfe22116e2af68a0d047294f233c425e9eaf" + }, + { + "tcId": 211, + "dkm": "446bc74235a47fd7c8daca81e30aad960944d3b3bb32d0fe2d77c4e5d0697fe921e76c35c2523e3b663963fa1e939a0f02f84e51087681439183d54731583683f98255086ab47fc5405b9d7542172c17b84a2b759345cb10c7ccde751ab4a45512527e8acbf042df55d01e01c8699f8a00555ea9ce8e0044e3fbab7733ae9a1e" + }, + { + "tcId": 212, + "dkm": "466a93430c3fd9966e8d230b43f7f7894e99de670cdc6d69bd1a23e94d519c03613cb80e78b24009bd8f1f725b0f8b105a06826aee1815ac83543c05274a08c736f5734cc4dacbab04e63dfde92cca92f5d82b51dfe6be51776a559e53a9b6f0c5fcd3f1569adbfa3641fb1a5b87ccf345b2e6894fa2d09a469dafb00f178fcf" + }, + { + "tcId": 213, + "dkm": "baa914c664dd715c00607c4c5a20bd1331e1dd20242ca7001de32c506735123aefa504f6a499067011c6755630f534816356cb9d002a219387ace8c7378e0e3abd6870c973bbb299430b148fe9f104d45d226a3b901e6239f9203277359731fc645a5fe0cd891fbcab6c6fb36948ac1cc2c41861a7fbb10939aab0e48f7785e7" + }, + { + "tcId": 214, + "dkm": "8b948f92f0202a8fdfe46a674e02d9ff93daed1564a88e728f9d495f44e806eadbf3c38baddad07af00e1c52aabe6acfe9bae624383d3b1827a8a1d46f04cdc3ebd2d7b274d456c90f136898bbca21f4600517dcf4672fa50451916f7f1fc8adf395f65d8d4db08c765be082d1b91c477c58dd03cbe8ff8ca5e7bf994ebeefd0" + }, + { + "tcId": 215, + "dkm": "11bf7981769c795f0463fc45bf54fb60439a5a5c624621e16ce24894921277f4cdd19d9df7e897facf9de2aa3eeb398813ad3c71ece5f49cc66e90072689fc0c6f5188c69f5484a006af3fe7e1c12985a6b7952c8a7d6df34399ba74791769bee978e4c6396a32638f29a1a15f5acced52fa71af90ff1614de328b36d0309cab" + }, + { + "tcId": 216, + "dkm": "5b38a4950438a4a4d21d749f3fe35457ad6d84288a38eb68f16bb30080ba06e00e6a982438a9d16da92ac262053010d795676f3c6daece56da41a6b4a9c39b284674e0b39dcb60d8324471bcbfeff8bfe9751e9b4cdea75923606054fd0b91a877e1eadf9afcb51bb5ae42f221ea2f4c8bdf14f416c514e20d4a06d4d284021b" + }, + { + "tcId": 217, + "dkm": "d6b7ca710d94e7702bc4a37ebbbad63b2df6c74b66a369bf062bf65d6edbd49ee3d735d0ec9cbc80532caa33f6933a9cb202905cba1d9da5bfd00c62ff6e1004fdfbe82d490d8fd68ec34b374fbcf8ff28e13279834ec2d385a305ca9df38abcc747f40bcb058ce56171491d245f7e97335b6a80aa8549a50587200bf0bab58b" + }, + { + "tcId": 218, + "dkm": "39653b67d259232c77f8907fd06e3aa95f1f1da9ef2005a0ae965331515fdc8c513ef269deb8efa6055ac0802e2bbe091ee25eef261204de33e05b1bea74251d97b1d305b779a4098a11831886625a396175519f40a11b0dbb55cdeab564a5450acb69ddc6b9bd070038fb9d3194aea6ac2ed4634db1042da823a791856207bb" + }, + { + "tcId": 219, + "dkm": "8f5d7031708be6a971073233fbd9cdf3b95d7f36dd26f2f3178a7f8778650326de19924d7a87dae6ceb9e1a97a7fe113f22fab50974a35f246fa464a11740327ccd76b990142adf08efd4e1ed0f67f61059ef5271b6b218f3245e372173f375c1d6cab9b617cd90406b227f5365e31418d9bed1ca9e57683e9281c062c4d236b" + }, + { + "tcId": 220, + "dkm": "240141b71ddbbbf109013c749c94d1da76d0a86746a55a309e99f1e68094c6332d8f6bc12a8f9bab2a223de4b9248a59e28b92fd16f8e2504323c39a3616927e1b5a0d192de726b0f71ee188e9b8b4c24df92613cddd2c51e9a56427aec3b43ea6b2682c593897328c4105fbb4648f9d59e6063b6a9d3c30364e66c18a813150" + }, + { + "tcId": 221, + "dkm": "4276aac37c4224e89b0cac256e11a6c9f8e8dd93d7e196791c419c953512bfa450a5807e89f6ac3b0b41fdb1ec77e958dcab52602579e1026a0ecd764bafc0e09ba3d5219929e924740dbaf8de1c796f2b7564c4a621733c2e351c1f018e027fc5a755e5e9f43269b0d82c7f4dff2087f29f88c2fb3cd442006d82ae9e0225d2" + }, + { + "tcId": 222, + "dkm": "4689d4af101d3c6eb66ad9a2d58eb75fd50d237711e6f4891b52dca97cd098ffa14cf98d3c8beee0943035f28d9b57c95d015f896cb927fa812f6e0715c6b3b8496946245191674f74fccd3799683cf1e4bcd8d398e82f73bc3c18f62fefb13f1bffb6658a2d5b63af6dd69f71e159639d892fd2343afed724a882ec4516c810" + }, + { + "tcId": 223, + "dkm": "4f5c85fe14e15ef50b10675ebef4962f5c84549eb2b6d21f9fc4ae2ce20a4bed30966ffe66b76a2e30e50db14249d1c93adb940d948623e72baada2e85b69780b875be798bca8fb84810c1bb53f048433f695d9e2ad6e89413b64ad8304e825a6f76ae68a2ff257b5fc99a8a87715e47c4c647c8c70fd5bb14a3bb7c97a1712c" + }, + { + "tcId": 224, + "dkm": "0ef1c275b0d76da9d114331de49cad9b9cea3c60125fdb74d4a87563694771723dd998cc8b7c7545f6b7665e18e89e993759d4fa64e6166126baac0e10a2ad8b536736caeea80ed0367864d0285be774a4a108abf2084862772d40f37e84aa472b8d114c4f65298c5ebb2177306dbe26cb9a723aaef9060594e18992ea4365b2" + }, + { + "tcId": 225, + "dkm": "e347d40766e1a0616c5d56ac66fc72fa88cc3d4d6bdc806489cf70a030b1af2837bcbbda535636af9de0dd5030b26f2f4fcc550f63e56530b8004e7117c57f47d87130b13c4ab792cd8462feb3838738fa3babbf04ca79a018118136fc600d19a9b5ba4bf76f91aabc8a0ddae7ad87121267a314f520d0eb2e432838e6d0cfb9" + } + ] + }, + { + "tgId": 10, + "tests": [ + { + "tcId": 226, + "dkm": "8b2e1033913cfdd6395edb6fd033ed6c30720ceef8cb8961beb40f5c893eee91f3b0d86fd9cb06fd95c1b10c9215a6168c9b9703c2dfdcd0e9558abec0e72ab52943414ca2804c2a167d6099b9fdb519dcba1d824dfe46f172b044845615e0e7ad03ae4fd9224dbad0420d9c26397f41167ee41a402c3e2fbfc7e334a567370e" + }, + { + "tcId": 227, + "dkm": "e6ed7f18baa7a5da5a2218126995ca3e8945efc920b69401daf3a3fb7347a6c6e8941126256f17f296f7180d994a20df6707434c3f8da9fb6691ef665783ce7d05817baa3662ce2e6196e5419aea5ed8d6692f7ce7e68e380f488a914c41a540e86a52cea354695cd78152828f41e0b9f7d9c6ceaa1ff86babc2ecf7b919faeb" + }, + { + "tcId": 228, + "dkm": "d40c7bbd9c63a8b81db36af708c4a54edaaa35de01cbe08eca1c581b5713a0f79cefa3e06e29af820be421ad18f8a7b667b45b53e5b4117e836d8fcc5a7e5ad433c1df080b1754fa0b25621feaf7b6bd4be96039acccbe6ca402ac1dc542c9ff7f03e2621289087f5fec2051b0819c4c9c35fc3ac44877a2f1caa7f87a2af09c" + }, + { + "tcId": 229, + "dkm": "7308a90673ffb477c68dbcb7becfab3c6d784277bb50b7ec9b5a34dc06aab75694172954734a4b0ffab181f96ff57c824552bb9970139894318d3af08524735282c8346a692b688e1de147b4b0b2fb28a0b982ad79ed8c66e5e5b1f278180fbbd9e8eee0226ccb7be67d6dedc319f1930dfa4c814297c766f2325d7f12b2f86d" + }, + { + "tcId": 230, + "dkm": "44b642be979a6485f12435738bfd3e3f968aae768f749e131544f587bc75f5210e5c7d014d30e1836b2ada7bb7fa69d8b6b23cbf50d980e7cd91acf0c6a6d78021f4fc512d11b88928c475f46461da30993d32b2cb15f3e2f0ee9d221601cae2c93e03df56cf2842f1d36d63ca9b8c46d826610eaad255d71f139311cc2932c0" + }, + { + "tcId": 231, + "dkm": "401808245b416e6af61b5d411d7ff00fcc108eb317982bb7ec0f94ae92d08cc9c5950259a50dfc818e61b3108b43bc822af24fe86cf7ae38ed237c080dbea7e9c8aef0f6a5510d20634d7a75c3e66e239534e24ac29b1fa70f0850d13be0a7eb246410bbe99863fac23c50f89353922c5dea1c61bc899457bccaf352e7dd7e44" + }, + { + "tcId": 232, + "dkm": "c297b4c90ae06b47925d8cba040aa15d06fb43f7700eb04cb65f639121dc6a012972ab437904ec9fc2b92d0648d18b5cf5102cef74b0a7fb37a3287df95bc19303ede3b4712a0b9047b86259014b2d235afeda22b62486f61efc758ea5bf42531c677eddcbd0e378c45fc8fda03026ce6793aaf2d9c358ea7aed057fcc4f8f05" + }, + { + "tcId": 233, + "dkm": "334883f76d805284ef21380782d646963eaba14a33a2a3e50d2eca1e14e5ec85425e9f79fcd9091403931d573d369e0fd6032e6d10e73e95afeadd5b8015db4e519fd9a6c6e9c6f55a69df62c2be91d90c161669420959a62bf67a5de0679891cfefb6f8a94bc48f85b9e5fea3d5deb4412bc6ce8d3a9878c3ef69003085af81" + }, + { + "tcId": 234, + "dkm": "45e91293dbb4b7928ed08401ec437b9e837cd4063dcae7548124573fd0f85aa07de27a415fed232e363b40426adf16313f316ee687692381e05f7c5d8dcac8c788080c42c25aec6dfd92278d1952f91f938a7945a2406297500b069a310d253ce4ab775031767952e8cad6f35467f643c6779b8eae6ae7569ed4ace3d25d6dfc" + }, + { + "tcId": 235, + "dkm": "9f0646b04d53af555591df8df76f897e604886b65a94e7692480ee60727835b12f54ba2222c1fae5de09cb3388842b8e8448a0555d7fe3f03827fe754a5b56638353b69500eb89b1ce9fdd97005ae506aa2e20c158e331b2f4f10f8a0b7f21301d7ffdf7afca0b42dfcd24d627bdf50efeec0252f285519c7aa492ec5d829e7b" + }, + { + "tcId": 236, + "dkm": "6e83234b2f38a58f400631d5ff341a9540f2ace4d9826130e4eb12ef786ec33343e2e34b65e543fced8399727482c3476a634edb1918a1a42f0593520505ae691a2afb383496362c25783937fd3a140c978cf9631ef7c5550c38bfcdc512db5a8525a9f4b8a43ce8fcf0fd52be6787717f22d472d0d8e1b41c3d0aac9be750bb" + }, + { + "tcId": 237, + "dkm": "6e2976c0be7450e9771c5c63c2326bb9e328508b08a54787960a23ea50917a85ea16954931741ee9468dcd7ff9d1509532c8954606afcbfe1bb7f4dad268943c83c45d982afd88324e5727ccd93e717d8083ddb371f65735ca3ddc75077871f3a57a91a27814137dd3ef2b27aa0d0bc1a27bdbb6440f5d843dd753a5c16bc530" + }, + { + "tcId": 238, + "dkm": "c847d3d22865693146ca1ce1efd5bec7a2f877c9cbe2483595249de588bbab71382de257365abd39a259487cf6182def1af6f4416d3af449887d31754d2d7f9cbee8fbe6467c8223d17c2b034cb30cecf6ede8605cb28e97aa709622253860050ff228fd7764f96ca46803ddd6172f4bee7fba918d6ad56260a287530dce7375" + }, + { + "tcId": 239, + "dkm": "667c3d08a5fbcabf8e4bf0fe896abfc1279badb1cdb29c9d5b9869b8f09eee87ed3953b79fb11579820d8c528c7432f93e1523a6aaa3a7ee5d80a48ca419ded892322c7b7bd26a896445bde463379cb8b9808e39c7c45b5773f820f35998a06e176945cd6eca979232e80b7cac89082a67787c12869ec10c4afd0f0d0b8668a1" + }, + { + "tcId": 240, + "dkm": "1f1bf3afd9e9e309ae24c8107b09ad18460e915b64b79f89447bc8dd1002c5b3dbda93385cbd7ee00c26c8eda9a1c26828a2708cf08226cf2d75568b6c8b4063e50883ce46837372b17a73c6460e798a4c4cb2043a1aa4a874243521f146367fa71e65d24b2146c7e2990ac320c9bf0e7a32f6fa7040b2ce02d8f2e1db4f6475" + }, + { + "tcId": 241, + "dkm": "1e2f08a2f649f288a1a78d0449f09298d020b584d649721dcbe7f773ed485a4ba3d0f453901cbb19bb2c3860e2391dada65359ae58eecfedf4f71f8d904740f4fa625438a9134c7612e4c441e011db1c2e63f2d3aefe184c1060227d5722d87cf2b1b0bfc32e6826d407908f2b9836a60416a06edb0bc67d9c78aa9c915e3522" + }, + { + "tcId": 242, + "dkm": "481868eb019d56bb2c98634fb276fd46b7471bb71360f59e7a017e06193a05d1b78614bfe56253498b4889f723b41f944f3961ca284173242441cbcb8a932299c285f6db0e485af78096bbdd848cc16b5a83edb15c8119ae263f4256e46d666b52c4700d98941bf0715f513bba6e3d7571fa322ab70e571a52f833ab1bdf9f00" + }, + { + "tcId": 243, + "dkm": "d0d1b96e4e78e1d88caca4b0a076349be686ec4ab3cb0b4215b183665c930579ee2b177e7fa903656a7a313e048ac9f034239b841089e77c3e484ac2614bb9dc4469e7f35e7a3461b12dac1998eaec8d599b2536b45693d17d545023483ab8fdb0470e327bc1dc5553db57a753eb42c468a7981d19fb315d451e103adea52175" + }, + { + "tcId": 244, + "dkm": "032e343a01981214a9674b0b8fadfd61b89c34004d7326c49c4d8da7e398d177e5352ec2bc3de9edbc7eb94f1b7cb9f3b378ca3f8ba050c5ad700544db3a1b31053a5411311efa63714f356c77a50b61fae8d853cf53c413cfdc3c5bc1c331d72ea6985ad7af586be8d784e6b993827e710950c075de3c03437b0c026bbc3864" + }, + { + "tcId": 245, + "dkm": "5559f4fc4c0843a4a286f849a66bd1e75c030b84121e0be86d3704dfea3f4406bfe06bf24195b0d943edc132eba1124d89adad2be83cffed5232413c8a34aecbbebdee0d5086b3abfddfa9be797d78ce600ebecb4800f02911327e973781dead3a4629b6746ef549120a84a5207399cecc8aab05d4dfae5ef59c98a500ad5052" + }, + { + "tcId": 246, + "dkm": "592b56c368efa6cdd2ba7873e2170ff300984d788aa3f0498b10fb4dad525ed953055653f33d72cf4cae12cb028f3a774f00df15544123d7b67644426e7924cfe253967e3157babd3a4dbfb31e9434dbd4d6222ca2d1da3b421f73c964c0d5af5237dab6ef0909e94015b7f68cdf699422eaa4c3ea76eb278cec5cdc4fb7d7b1" + }, + { + "tcId": 247, + "dkm": "12d53fb101923d19b9f792040cb18eb70db84a78fe7de7433eab270747508688a1f689de1ad8c2eb15bdec0b040829ce04446d9f3115229dc737df95bbbcb89d407b015dfcc95376dc67638a7cf4077f021f247d6839b6fb816b1bbc7eb0442608ab32b114b06da479bf11fe72f766f589bf9fb9d078a735951dfa33fad6f876" + }, + { + "tcId": 248, + "dkm": "12b2a8a959d32e37b8f99902340a0e55521ba2e730df75f861a6a6dc330dbd6993cf3a08a8e10deaaf8540c6ff9b305c3a6f48727aa04e3be606507f3edc31dc3f8969599d49c524dcb67449bd1feaf05f0e218c7e9dbe757084cd65b64bdfd004992b01c660051d9761db0a655a011195af402f3840c103ad7ff4ba3e427b03" + }, + { + "tcId": 249, + "dkm": "5939eff4ea095d4d156050593c0c871b6edd6797fed24ed5bd5e24bfbfec5bae53ee6c672dc82d52c04f70a161e4d12688c432ae445dacd2c2d34997fe016337f7343d376aeab372e184f33c13a6def8435864a01f629935dff18cc4eefd748fd83ad2749505f7ec4df3547c29e1ba39f4de1e29619e4bc9b2bcf30a3bd13b7d" + }, + { + "tcId": 250, + "dkm": "c6c8174c0e3d283052ec4316fb8d935066d66d104a765d40a9c439a176722fdb46d9c6ac2d3ba4f17985a33ec599860a75639da117b4e51c8ca0ded8c3316ed3fb89507ff1c1a2dc68d2f075fc74ad8d2e0efe5fc743741cc30d935366138c23846150d7223dd300f4b428b65996851b88b55d9a6cf8410e793a957c1adf66e3" + } + ] + }, + { + "tgId": 11, + "tests": [ + { + "tcId": 251, + "dkm": "f6e401a5384a9abd7115a8269df729a271c1433a934d41be2d765420bc4c9d09469d77971cc0696b4190be4860f1036835b374d900b4cd69b1c2ff6b0649ac8ceccbbd29f4512fa84df7c66745acab9670563cb03bba2b0330b426f2fe1f05ceb48a6b1f43a60c802439c34ac0867bca3f49946831160c28d7a04cd93e9f5cec" + }, + { + "tcId": 252, + "dkm": "903b9ac769285f0d93c3d5b729f1db9d9a64a89a22bb9bd6db209a614accf49daf2d06f25bdc8b02316862fe26f8c7779dad65ec3d6ca7fc753f884731c99784c43bc7eaca46b170e88392a59ad6a40ab430a5220268de5ba588b77e5f9b0d5f4cd33800cfa4fa86bf0a87f3958e136c28ec6dfa4e6dda2eb1492e2403959e44" + }, + { + "tcId": 253, + "dkm": "a94871537cab6b78b22453b4242c426087530e6014cefdd75e0bc52f99aa4892cefe27c5fbc520212bc34b0ec0d2d7709dccf817177f082ebc30172e0925c78fdbc53f630f5636b68d456d20a1d3ceb6496bcd9e71669ff7e1eee913517637b56a4c8b3bfd38ddae310a96162eabb810fe3d2c3b401bed4828d38d37430a59d6" + }, + { + "tcId": 254, + "dkm": "95946cd8994b59c5197de9458f76466c67a53a4f1edaac0363d7542c1be12367818bef5885207b18793569416904c8bf672197f67facbe5f7bd5f3078beabb96372376ef25bd1a01e79275a13684b9411d63eb905bcd01e16dd6eedf88bd3db38c34ce50ff919736c0c8477fc53417d98af45ad89b91f2e327efa2f218ee02e0" + }, + { + "tcId": 255, + "dkm": "cdffa3d065251c46664e7dbab8dba088c4ff87036bfafc1cfb4b01d9e0022aac7c950c1702a6c154b70f43f6dc7afe9e47ef9f846433f038f86e2b3b6cbc4a2f18079b47bd8daf3ebbd257ea894373739e31fbd540c6d4619777082caa5f81d68ae5f7c9921501995733e8b4db54f078f0e0d21a8ca15d117754efadb18d39cf" + }, + { + "tcId": 256, + "dkm": "44f987f5289a612021daf8b0a75ca6fb79ad9f466ccd2e1b69ad6d3e587352099d8a2823ba9a7b20ce341ca4a0c3bd9afc696730af652a24e089c2b230b39ed16b4922e97612632cd67aa6b3fef93a08c85489edac2c8e2aa2083cf7a8e1a5d882d2fd89065e5b4092fef1b9f692d29e5ebe7226055ae38b7031f6ca254acc1f" + }, + { + "tcId": 257, + "dkm": "cb5143535808a3f96d8203a4e687f97f351654d3d4cd85e25054f7ea4c3ef9b2545566cf47ed428d8709d60cc9a30ca81288847a8935d8fc8287ae872fab4247230e621b105819303cb13839c1ff147b1c3103cf5bc09c7cad0baff2159cafd04e44fcd0b18606d0451a6dc1bb9d944a220a926736e3b4d1140dee5092755017" + }, + { + "tcId": 258, + "dkm": "6791cfcac438163a1f3936526ab355ca54f5904d1bf89d77f997eef1e7be618229961c104966a595be068b5c7973317bfa9491a6423e3c8f6daf21773e67b21536e9859b9c0b00b7b5e7169c4ab188f57dbd9e2091da1ea4a63b4e14b7bc6561149ac3bb313a73860b429ad9c064094efdbc22bfe8029974f2be62f37f083273" + }, + { + "tcId": 259, + "dkm": "5f71df0b969df600540feceffc1a9834dc07a2aa350dd4271dc2ea19e6bd5c132f4757de09ba20d9de3fc19e1cd4941c36a4ec28109d08eb1b9090f7a40398e431eb5f108afacec5f5b902e19af4d4cb84b459bd55e79075f98284653baa63ddace04f0fa78d28d4074fc701fb6a85ab24e6fc90c3fb9efe6c806ab6cd7bab6e" + }, + { + "tcId": 260, + "dkm": "92e0d88d9a1dc1dc3617bb372fd902479feca1a2d4ff1e0e9bfa9126f9aef4491d8a0f09c373d034886135e23fb08d8c17bcb548dc4e892d3023d521fcd347b3923097f3615d362fe8c616eeda48a29917d59fd2d299f897a2d44eaf3eb5134deb1aa7a6bfbd8d6b92d3cc9b899f0c83d79fb11f7ed7e42ec413c242a45b7c2c" + }, + { + "tcId": 261, + "dkm": "1bd1d9933fb2cda20f0e20ea56a79016a5455fb068d989d23555d021df8df0b60663d1eb766d80debe88f3e58887021cf7a016b90be9d6c5bcab0e3e89602da16031b3cf19fa71998fe9ea75abbf43cc41a11e603c946ce5a834e2d5ea4afb92edc75161881eaab9c461b1faaeaaad000461b800f03b025ef02e41f6784fac9c" + }, + { + "tcId": 262, + "dkm": "aec62b7e5d7a38f446afae2e94990e8a7e03c6e539086c9d68a4798bf25791ea63e92fd5a1fa7c0a705beaa732b0b9b329fc3a4b75bee753cbe081d115d3f778c28c633ec8b6683c1c16ffa1648d5c603568463741b2cb6dcac87c7746f212caade0e174c34de2b81645d495bd8ec7398d233539964a8b5ce2f90df1b2a6477b" + }, + { + "tcId": 263, + "dkm": "00534e5ef7661817337c1dca044152a376322a20f5e5204f6c1e28bcd75644cb245a794c12c10fe6be141140d711b900c07b71014f23196a3aa1831270bbecbafcf45ea783be5309b7ae1756fe58d0e29743bd7d10dd340b0f699899d917e738078ae1c8e5f9c8f05e841ad2995efb48921a0bc3b497d817af10f4c794b1fe5c" + }, + { + "tcId": 264, + "dkm": "86968d23c007fffa9b9f6ffebda7dbd7914ad5584ce6f51c7d48e4b72c671f12aadd14542540aa7f29bc3cd098233ab507d3057d20fb2af6a5c3631bdc8cc0b549ce47611894229078f525bd57fbd290eb3a46462ce3a1c119a2a02821ce495921169e3a7de293f9d3c6b6c0b8fba036a54372ec1da7285663c00692f11f152a" + }, + { + "tcId": 265, + "dkm": "a815012a2d6139acd375c6c7611a9e694a55320efb349ee316c449d0cea197fca2e314c33a4e36824dfe23a19b60bc88788145acb64a7f9b3c979ef40eeec9d939008ca6a21e2fba3e372c38bb8540b4afc10cfaa3293bd96c89bfe64556657f5164fa3fcd40344469824a9820cfca1853c9245212c24ae1fc82c8549ae95c6e" + }, + { + "tcId": 266, + "dkm": "5d98cdf0514cff5663c6e7592d3db35e1d6beb335871ddc52511771b99bfc7cd2de2a5e42e7e228f1a591bdcda0b74c516de1a6fe80ed3d2807b18e0dd703c02ad38ff9c2c962371e22ac3817e9cdadec9d299d678ffb7d78c96545dccd5b2cda541eb371235dccdc695d4e59ea5fc7f49ead742b5cc8aa1ab4c92e00e171a33" + }, + { + "tcId": 267, + "dkm": "49fff8bd1d11a18a23ade880dc75e87e5e89f83dd88e44bfd90998c5c8e56764215d97cf8bd7c44cbe0ac73f333454ee8b74f86371adc3bbd27c359f00445b572b6522e286208c1540dac593ec16a913a07af4ab0cd0320445f79c74fdaef7ca14c7429ac2c493a5974901076f726c75c0449b84b43bda0adf8eba65f91c6abb" + }, + { + "tcId": 268, + "dkm": "5678d2c918d3249258eb07eb851209ae2bdba5a10d6f387193a5e64811c2d604e82911fd6840d85ffbeb657064d01a5d2769b924d9b0d42c3c4e928fbbf33757eb8f1a7a2f2f044dbaf089ee000371dd1922f3f1e5d04ec837bddee3be7a2126e3c87d89ece160dcef9a132995e26247ac082d82c9f0d44ac5dc538a8285f440" + }, + { + "tcId": 269, + "dkm": "49be4731b4544ccc01a5c271a537e39009959223883d6c99221c09556c24089ef735f7637b5408d8b303406b8b02c17fe749fe8e66109071bc5b1ae93ce9efe8e428ae4e62eb18aad15c39f0b266ca00b0868b3b28250d642ec6f7178c294d1bc177b2eca70ed1b0d5ead0c26f0b9b6fbe8afd03f6990824ef375f07ed37b380" + }, + { + "tcId": 270, + "dkm": "f2110d0f66f8294c971590ab5ca854945d8b0ebd00d1bb8ed5aa8f490ea60280e48065116c5dc84ec3d9d75436ee97c772c004ba3cefc4c6dd1e0d8be2c4db1226851843466e505b6fa377e537b7c08bc2b6f83f2fcde39a883f3c890cccb9db98b35994d4339b39615e7ab1a4b956db5cd417b10fc781f85f9fd0aca08dae55" + }, + { + "tcId": 271, + "dkm": "779aacea34830c50f9f3a7c44539aa8c6660146efdca01b6fa4cd2f2707bdf6ba15a6eb9c726b18f4270db1a3614ad0e234c6b017347fb3f8d58220cefa7589aa48f4eb87ab25878c98e7390e0ae2b011d9677862c65014243bd8fba0aba59cafe8f32e29c5cee6e655c29cae939f906eb50053c745c2244df356e7f7f74eccb" + }, + { + "tcId": 272, + "dkm": "744eeef68d79c96ed8559d3a2834041d70dd113a2be32bbbd548efd6c55118e0d8e91cdbc2b51cbf33635582438e725608ddf3d4b57f462945f0c54e57df7769ab422faa99501465f1a1cd5a97a8729fb07013826d41306b11230aa8b12ec7bcc9d9cc843bb729555ed9cc321805b3b4b57261aae16890c4f38fc3c71c9cdc13" + }, + { + "tcId": 273, + "dkm": "62f195ae5ecf122aa6bbf3a30c89d803be3eeaa476707253c40905794f7f21ad9967187992184e3c617b93b2a50576dc66ce565a7369de726aea521c50b79d5b7d751c9103336ddbb6a8830774a4f18f3324d2180c943124840b2a9a515b39c3ecba9ee38f504aade8031e1ef8d03a251ade9ff238d675a0578b645ec5b79d1e" + }, + { + "tcId": 274, + "dkm": "a1ec2b5f248e68659deed73ca69c5830be08fb74d0e21dd30be01324c09865cd759446b89d04c6f7bec1c655b0f27aa371b50c206187d052c76b18020ccb477c015a4a5b4124a096f0774a08ef152d5eb889e9ac6f6a00ca57bf96d78cb085537165bb9d8d3afd79723777c73faeed452def15f655df594d7be4ae4707b77ad5" + }, + { + "tcId": 275, + "dkm": "3bab5d42bc1fd28c1263ce43e3e3c35357ece6258a30ea56272748f2a878cde45aeddafd355cc10c15ec2ba8ddfb54fe9ec57aca358e1745398f447268a646e2fb2a50d2571a69b1cceface030338211f5fb2953ad88f1e967a159c7ca40b54a8aa0a3bd350ee38d63b52e5797619db57b0ad8c8f1283813779b2ce5004f5347" + } + ] + }, + { + "tgId": 12, + "tests": [ + { + "tcId": 276, + "dkm": "35d08067b1ed20981f78e2b6948bb57f11c236da7420666e9eac6ea0f4737476b3e270085f7c14e2009f2a9143ebf68c8e094e52c1b32df87af13124f518e519dcc4fbd225a9912194ba7a089728d597736140db336d2fdcbf50ac4884bf9ce97bd873fa1648f254d780b7884d9b6d70b786ac2a63aa7f24a37ba88b5a6adc51" + }, + { + "tcId": 277, + "dkm": "6058c351c2a5ce9e3d51c8e003cfd5509cdb0ccf0089e5bcda1690967535c34b6f3d2017a6574dfc9d5ad96c6119a0c8700b518b11581c4263358c70b5c1a7be3f42be350cb891600ed792454d16de06c88e355c0fbd46aecd984204c65a9bc915dd3a457a0ab77da4857e600a77f3906d67f62efd14ee5c3c76443762de43a3" + }, + { + "tcId": 278, + "dkm": "ead40f0c847c0423bd2e540119f1ca5e605bac93e209613eb0a0221aacd1579423aee128ff3cfc146edc0cadb84e5350bb0687f8c4c5f10cc737d83c2e12438b4b70891ccd205e5cb52bfaef576278bb648dbb9aa2756b6df6280c976694ff2caf4b3bb81402b9eea44430b18eaf1d4eef0eb61472d72c521f86fd507a932ab9" + }, + { + "tcId": 279, + "dkm": "b60674944c34f64fb6c48565de12c5d7e61d78f39cf822e013941f7ec9029d5cebdd6868fed45665e71f9ac0e1e52fcc6b955ead13aeb44d5a667c20341f1061a549dd003792d06797a46bf0f5848c90828219e4eb111ab297213fe49dea7ac4c083f5a68b251c6e4eb718a5752b8154f8a8b5f45bbed747f296df63432df82c" + }, + { + "tcId": 280, + "dkm": "31e2cf026dd9762273b2bdba72f5d8ecaa59cc24f6c23f8eec7d262712982f781e5b3a46c1dd79ef721b6fc21e113da4bb5e5a9d5a47e27b0f174ec7f77e153f1811e35e9851779d8d7c55f52744965ae9e68e1b44f56be5607edbd7345d8ca618979deed0f3905347a42c3f21e3bbf05641ad1782ea290776afc27daf25b342" + }, + { + "tcId": 281, + "dkm": "bf062177cb280529bd98780ce041951f6261ab34a0dcbdc22888458e0955133c9acc0d5b07c2aadc530c709dee0de6b79718466a83b9fd7a28705071e1574984f5ae33c60e99447cb83044fbe078409332fcbe0ced0b1378eefe0648994bc3a4b38a6c06e2aee6b0335eed04696cb66a0ac98dbb8b90ee5daca2c38239eecf20" + }, + { + "tcId": 282, + "dkm": "4ae79e6fc6ebc07707b2a75433701fffc9da4e4baa36e9a3fe2ef6125bc1288c5a6b0144b151164532543c3414ea351620f9e5a52dcd3dfcbe43464a0bc6fed44008b85ea5bc4eb32ff4a77d385256604ca49a97570f888b68eef860bf3ef1d95e5f9fa91634ccabd45ce341f167313340c9422174f469555029fe8954dd3310" + }, + { + "tcId": 283, + "dkm": "6eca20e01f5f72b81a2b37fc0da175be81165a976ff411dd28cbcc823812aff97a6cee1b6f34aefe75bbe928d844a80bcfd4a8b0a70db1f8c2eea8c9fcd55e56af64e3ea2913e59f530b5834baef6cc6ea10c18d7009f063743dd7dbbba8c399dde76cafa32c1aad2db72e894ad0955fede07bb6a01983b9c13cbf5b9db9a684" + }, + { + "tcId": 284, + "dkm": "901759ef47142b2d4769b59d474ade4af9738de0a0aefcf1f04258d6a23a3810a798d58b2eb82325c8c1a063c1e9bc84289b0e2706d8f21453556aae4cfaf233ffdd859192da9ff10f6ae39a4793ac363a5e0e34f60778b1aed4e72a84bbb9a5ddee0ed5edf0680ac9f657536a313647d833ae6c50f16f37747ffc66a941af82" + }, + { + "tcId": 285, + "dkm": "6f87344bc55e371e20ad0639b5fc5874688063b681ad4093ea6a57a32eacd258d7123a316112ea400907d807db4780551848f11d250f585dbbef0e7e1b9a077ef9d28b22561e0742e011e77e8f4c65f0b1e2ba0ecd055b5c518ec4b571bb8cf1f171de2251db93b990e0bf5b7b38227aa9465768cc30a06757e7d08d6e5818f2" + }, + { + "tcId": 286, + "dkm": "6cbc29a776d2d01e05408032c1371851db1eb05ab4fb6c73e701d11df8a0e607cf1aa2d17a41fcce4f18c50b2d2581c383ea0fa07eb96119a29bc5190c1b5fbe9b76400f3cee98e8c32193bb50a1bd2c4fbcfc21f0f3b32bf4f8b6f08e65abd121f52319aa335b0a6a29a6312ec1b3056677f325ad1151d04353138d59ab53b3" + }, + { + "tcId": 287, + "dkm": "05ca01664658022eafdfb7e8c2e01dd7d457d6ec0ff2979a910755f83e024d9e97a75593fc20bd45875a43cbec424e3c7cfdb9023058876a8d200ad209c64fcc1f132f183b94ec3f8aa6270424c19180a38cc1046899f33b6d141bec71748a70009401bf8c6856615c303add70714b956ef93809611d7d2444546e09ee90460a" + }, + { + "tcId": 288, + "dkm": "da65a522767ed3605b3a852b5184630b3425c6140f454bc8124f6eb8949acd5aa632708968f96c3b1cabf6e6ae772215deae5ec2ae2d8beda8f9f470436e431fdde25dfe2d0c51d24aade4f0626c793846c7ab7372ca103366890304ad92cef5485e7474d6c94f1b09d83f3069a1894d09bfe87d22df7fc8792c8cfb4085fbfc" + }, + { + "tcId": 289, + "dkm": "0f269b9a94e7a59904ffda2b2ac2a5a0ca08a6cb1839730f72b73b85029fdc7ffc438d43f1b858fdb441c8b62587c8546da7ac07fb1763755f4b25912352e4c919b0a642c37b0200aa6f55823ef91eb4602157f3de4671c60caf03855766a92605df453850c963e37afa5a13fc39ceac9677c73cb22af8ec90ee4a3985233ee7" + }, + { + "tcId": 290, + "dkm": "401aeb59a14aa61e23cdcb93cd652c68d6da2acdf856daed261c9c2af8f766e3cf4f5770bf8ae0d3cf508a10148b87fbc16c544e53a63b8bb1bcf0b840b74d5464d7bd86054ab539726fc0474043ec9f94e19887cac0fa8f1d85e770e85486fe6a663e12345fd9fdc10bbeb89a67f481c0e377a41ca7d8381c1fdd8c41e2f753" + }, + { + "tcId": 291, + "dkm": "84f643fcec647e434eff6afbcf7cbef34da70092765d19dd0758b71ddf48b761730f38db51f2b767de51acb52e73261b77937aea8b73b5f49c7661ec83ab3cf3665f847a64fb4a6a544af6c5bcd8c0bd68fc3b633e92bfd27996659ef13cf3bece6e58318702ef7e5b4401ce1fbd9828d39668ee9676aac8987dc98a14f919c3" + }, + { + "tcId": 292, + "dkm": "77b85eff90809a16a018af3f64d5a30ec78d3581cd9f3a6d1839b0e08771b0dae332d45e0223fb033779ec52d2217a7cc5f94fbf29d882affd3687534c931f7a5756f5e289b979ec3e2180412aaa024b0837454315d09a94b17d4ef2da46ed6a041c09fb7493df8e80f23608a027079cbf7a15abd088bdac3ccd9e1758f58b3e" + }, + { + "tcId": 293, + "dkm": "05d809d425b5a48897e95a58c45aa342ccc9ebac7afbd6e81de227cada7a36377e8fe76a038aae9339044efe7928071b3ea238b7147c107ae2285dd2b1c80363482fce5139a29e419f0f9aa91db4863b6e1ed7f35a30fd84194abdd5e358df4495b0d6268384745ed099d329c28f96794839cfc3e86dbcc890526826c4f945e3" + }, + { + "tcId": 294, + "dkm": "5c5bacf0357d3f4cd128dd58f7e0ffcfbb934b35a0fb59c3a6a0e179197fc40998dbe44fb9f6d82b593be69d5347c2525aea48f66106824f58aa072cac15b05eb053d8a4cfcc8f82621cb2a192c2409a13bf430916ace2eeca48471a31d328d1ac0b990159d60629fff02abad34720cfb0a77c21a889b0778f5a0f2f3970e01b" + }, + { + "tcId": 295, + "dkm": "8421c2790eeb14c63fa066f175242bb5dd1c75de3e573ff534328d63f209b1ce6bc5c8e9d0ef5a3b1d9cabd5bc7b22f04cfd8174fb645c301437dcde893f6b8bf47c0e975b3d8f9647d48f357046a573644fef66fde1447635932ac1edc2523ce4829f6194f81620a418f144ec5d08c645e5d5c5be9b91ab8e1077acff45cbbb" + }, + { + "tcId": 296, + "dkm": "1ecb43ea7563a63c684832c747d6853b3b4fa4ed5607e09af09e47ff9a1eda0ee6bec60771da4e50cf2d950811f9cb2bdc31272a58c6b336bc5390ae045d8f1facf0d2cb871252f439080dcfe7e9eb657461ff3c00339b81aab564d9126664dbf23f820803d0c7529daaee90df0ae102e48d94635f6f27f4b0bfe53ac615b65a" + }, + { + "tcId": 297, + "dkm": "848b678f9d1524749dbfabf5ada3c3c44ffe731c205dc219b7a41a9e96361910d73c4ad4484a4ec15ca0569e97394577a54b96c1594e5777a8186720d6881f9c5e9c5bae40680a34b47aa2c7a5bc89a8dd1b1fae29a58676914c5703af099efb46907eb21aef0cae19be25633434d853a00d7793905aa20a8a991c9e095feb58" + }, + { + "tcId": 298, + "dkm": "ae2e350c60457c0e18daa3f9bc7f00f633f831f17da5810bdf9fc1d41f74dd02f1507dfedf729054d3e4a7f78103ba54e9666f7b6f768900948a090182c36427fa2e65b9cd027df351de9cf75f1a46a2999ada98277436ba65bbd9fdeb84a192c5292a50a777d0f81df48b37b0641478f15382bb00e997a93a1c1f55fe668ad6" + }, + { + "tcId": 299, + "dkm": "56529c5910a7b04248b89b8f560c58582d8fb536a4718e49a437232e819ddcf03fa6d2f0f0ab139be807f24b49ac64af981b7c350b021cad952974ab9a723d4c7be3fd71d80ba0d55ba68804f89694e308586cfd7c54f265f050f0dc29ae08dea90038ea1e4922a99f72743dee9e4728da9a3847139f6a3981534a1ef84bb242" + }, + { + "tcId": 300, + "dkm": "ba80aec54c3f75e115e972055999d8ff272acdb27e0b41dfb81ca254e98a870fb1417a460c181e06661278ebd3752bb837e6295f515974c828d8fd4e5f45a2cdd783608c41ac8b79bf4cd1773d6d1e33312c138669525cc832cc96871f355fd3b4ac11345112c9f4f19345e4c4f8b1533726cd5e644c25dce7351ce40f77becb" + } + ] + }, + { + "tgId": 13, + "tests": [ + { + "tcId": 301, + "dkm": "0f07ca12f61c0b5f61c3311f738a31a429f657f14604ed54e79e8c66cc727d7de65dcb542ba0be83860f0da0773a8d7225aa87165df9d70682619fcc4284b5ffd1a26039b735409453d8f5b2bbfd168939cd442fdd8566834f225009b5679407609dbad8b0e233b43f9d41005e04d2aaff09132a20fd3d09685af8a830627858" + }, + { + "tcId": 302, + "dkm": "4a5d0f3f8d5bbf2c0740a1c4cde6068e0a89806a0800930973481858ce8aec11b6212b42b86fdb72c66432ed27be1bba07f7135fa31b1fdcc6183c969183935a2c34107ed7ef4563dc089f571c4af7e1932d5b9f64fdcb4149fb2a13fad08a51880986e52b813502ea79ad441ee61c336a4d7bc2da8e72af9e1e996f75bd6c64" + }, + { + "tcId": 303, + "dkm": "802b6f76a0e7bd578a664a364531c0499c1bc182971060cba797f1382aeba390338c5f3584d450a9f4e79350f23b6a7386c9903fdb7cee0ef1393c53d2e24cd94ef4eee5c2e9c772ccb8a2ea085618126047997d2aca60f568a8be0d512140c2821435a90ad8b026cb8f0e67f80a9df08d6b52feec700a2bb7a16f9b5897d922" + }, + { + "tcId": 304, + "dkm": "5302125b2ae698246515aa952f514ea1d43289430245bb7175b6848988a893b4d892a5e89924893dca881e0fa3cf61e37e81f7bf71c624dbcc116c588bf08efef555b54696036eaa8677b77aff258b5f329ec9d9fecba8f7ef897ba95ca597316a44bda61099afbe403f13a04eabf1f703b0c5c6c2d89a8bc6863337f641353a" + }, + { + "tcId": 305, + "dkm": "2914343624d249d94e89e5dd7d581d26b4fd9655ae208a4304444cc5e3a99c8303f66545b3aabec923750ea97f3e365f10b5e9f0c588a159d1cc46c17db9eb8ecac6950b2b08a3e8bfffa1279893fc347d21d4da8c6c70a3d19239209f668f80ae759bbbe5b6b5f25a3eb9c1c6c49ae2ccc93790dfa7aebee15610c3f66be3a5" + }, + { + "tcId": 306, + "dkm": "3e58be939052fdac321092d71a1d42938369f4bbd67d7b0ef3d32ca3d49a34ae3a88c27d3b6009d2120a6209b15a14d07e02cba497c5df8a5376c993c38a18333b226786a4ab32b3f5bf47820d6b83e3bd23c35fb0dd815dbb30874750cb1c0c0908621328f41cc6a1cea0fc94cf067474f5245019f49dd35e57728474e96879" + }, + { + "tcId": 307, + "dkm": "80e338b36697a192d6ae0e053b5758ed6d64f9a62aa2c9276bc49b0f34680a4f4755ab44e593d212a14b4bef456e7c379847ccb93d79611d406efc3549a177e132cc04a2261d8ae5fc58ba89339cbb35ec1b990491d62d8457a6f8c8c47e8737b79b78cea7baaa5301f7f139de944cd7d00037973033eee6a644c9f1fbeb683c" + }, + { + "tcId": 308, + "dkm": "5b57511b1e7e8a0ce731963d6d8c69949d7b3ec866c0ececece691caca28f5627fa80556acd5859e29ccc0ccba023c12e4b952d1b6e0fb02b1f84d76ade9b30b1b29ad9ffb76131aea69bf9c3b600f535f85d423e86abc0bb4d6151aa995c8688ad520004fdd78f5ee909cb9edf78c8067dd0d46d5103978b41fb8db269229a5" + }, + { + "tcId": 309, + "dkm": "0ad79392feccfde8f75f6b6885570a4e4693028870ad78f1c79090a2c8eb0aa1c8a24e94487021646725f6697a8ccae5a600c29a27d5ee6107f305c51f830f71979aa30965bf38eefb2149d0fff92b5d03c06980be5d5b1eff1d939b309522f0ec8ebbf6a48bb4abd8efb9c788461c338abad9e42a0a717d7e59e487d2627764" + }, + { + "tcId": 310, + "dkm": "1174e6c6fcfe27642e9149d24a81236cc16d5291d321e7606b621446f3779eb90593cc37e206703e6af8e68d5a26e27ba9a445753fe41e9b9c52ed1827a1c933a7a63a618bf8b7b6794e632df05bbc41bd6c3f27a0c5404f5b7eb47c3aefdcc7922c4eaea9421ac3b225349e504539850baec7dd5c7be77ce054ef4b2a80826d" + }, + { + "tcId": 311, + "dkm": "f7c5988b661449417fc4cc838ade6f2659507966984dad5705d279d59ebe232157a398e4e0501055ec330498beeb9abee2705265ce9f0897a31bc607823f74348e65ae1476ef78a29acf3b33e64db3349ef9d6423b330a965397f317a883f71f4fb85995f4c9070e4639eadda8d964c025f58bcbc48f0316bede80ddf076c895" + }, + { + "tcId": 312, + "dkm": "43d455d94921e0e8bd2577e1f755474c08b28ab4afc0b926ce5e96f9148f3c2250068367a6999ef27757abef18ac83344038e9db900a48a3e92724d5280908980f0a8dcf0255f0f2a570bffd277769327faffe2612e4813a4588f0fc8fc168fab15cae5a088701dbffaed85c67390c8b636ee22585e0412442820d20ddf6ada3" + }, + { + "tcId": 313, + "dkm": "f14880c178c974e0e45087b3db579f4a4f05a1c9b268f5fbd1511dab3f6bf265d4c2b04febccd83228d8759da70023d60286ae30311598b47e105374db58b3ad5aa017f53fd1c2f32e6b9d1be2df0b0fe3e6305d53c077a246b0e05dd874920093bd314c53e8ff0100b9bc0dec5b4f1030e55632a581f920a4acee2a9bd5b81c" + }, + { + "tcId": 314, + "dkm": "116c9cec24137b9f7f56fa34e57e14eb60048d385345cebe15bcf2e60e3ca5bb75034008fc3e039cd900d66b0a388e884653289ffbd498de76d1c984ccf54f224994eb0d0618a0ac157bbbac6bc0856eb2f15c018b5a797dec6daddfc8451bf41d22dd58ada20d763526cf28b8ac88a92f23661917e96e59ad38f0d3e531eb39" + }, + { + "tcId": 315, + "dkm": "db75b2e6b898dce20c177235d6a301b516024c343f02c6d2f6f0742e91b83cb525690df8eb2fc3a36bba41a70a16dcb6e8ac73d05ecbe6df44fa5fceee902c47b78f94f502cfb8984fd75779f16ca0ba2dd68aad023bc7b3cf363d134ef234beb3c11184d3a00864971160d8d5df6cea563458eeaa8c758dc0524c33a48ed3c0" + }, + { + "tcId": 316, + "dkm": "5154e9be75999e0dbba836c5294c926059ff425076b12d2cc40cbf8b910d0ce4cf55575f20fc59af2fc4369bcfc32844aed9ba996bb7b7c19df7b274a2c48ce57d0acc50760bc46cdb3348a31a71156f5cf449d7e1316745aa6cdcdf568501279d1ddeafbedadb7b1c8a378f18649567a7d97b3d5925e0cbb32c0dc91e30ae89" + }, + { + "tcId": 317, + "dkm": "36b1d17be6e01cad9fb18277e668893ef4be0a5580d129b05deec59823432f2a0ba79dca4c0332e65e31992a8c6f991fc76463cbb43d201769be6d6b2d79ffaa4a46120959b4d43ed710ccbef7bfc0b6a0a19dec7273218b568a4939cdb2d57f3e6428758be1ab89aa2c35dc98620c3e85d7a217e80848441030bcfc012c9630" + }, + { + "tcId": 318, + "dkm": "b1c5bbfcae933fde80e93f721b66e3f98d418776e649f41e0c0d9dc4f3e69b3bd6338c232191f5be5d001e025f688ae303fc52665118474ec2963388f00116cff0ad66643ec0c296c056035e7f30fae4c5dad48197edb7faea8b491f43c30f38b3b2ccd318a781cf28d4d3eb240971693c9cf8e5ef5511f15590fb3fb72b3682" + }, + { + "tcId": 319, + "dkm": "89cd09b5d980322820538f30a0997e0c89a3f2bfb9c1e707b90782af4eec1b145fa5b8b44cfd942b8a3515841e82ce204436efd0e9669a82b9b58e143c90f180924e8c2a424f73f3da43aa7c0b7a71022116e4be7a44c7c716e7f07417704f2458f205018510f7c360d8eac649cb89916d38267283f5daf966aaebb737df37cd" + }, + { + "tcId": 320, + "dkm": "d3dcbe36f52fcba9ba40fad9690f58de4f85af42bce32e7d80c88724732c2d7f24017a364214e26916bd7b7851e627366952a0d9b95c85e28e75bb3e1fb05368f50216df603e97496f847135ca879a28c95462a298ea440a6ec0916eb51bdd77064d116a5dcb72dbc6a145dc45ced6f766e10cd5ab88368738d827ca6ef7be56" + }, + { + "tcId": 321, + "dkm": "e523b9b3fcb75a2a27ba28632d3630d063ef2088eee7518e5092573399c2b8e311a09f254411bc1a0168e4ef4229daa5925971ae2103f99aa33466f0356869c402ea13e933b4334e968cdcaaf59822895b1a8ec6bae756b4c3ac0d03f485bfde405e75a667719d3966431b824a5acd47c273fcef90930d48b96ea5c3bf905cfc" + }, + { + "tcId": 322, + "dkm": "c19ad333fb21ce837c989691d7b03fa993488915b73852b09b451ae9a88306940099b39b9efc04bee202848baf4fa4e2339f8b04682336021a077a7eb307f94c2765b98aa2ec89b92118bd065305cf53ff6667dc91b81606009dd1ceb233494afd3678935eaec7cb366947ce6a907a9bf8b7f16b0335a64acfc42fce0ea7b5bb" + }, + { + "tcId": 323, + "dkm": "ff5099bd85815d4beb899361d59e820e2694c1c8eae4a01a4e91ccc36df83a243a4fe5a1fd0bacca2979f66fe0e9e877cae5bc62c72a2e75b6fccb535381296485bc7ebc7bbd83e0fdf49c42c0480e9cb9242c9949ea8b9f2e743c4771a004e04483c36e0482e32f63ec48c7947e12b850d4d39d441e40117394d272c2a9863e" + }, + { + "tcId": 324, + "dkm": "c873be0de8223fa05d200d38135319467791ff2373a25899c62cdb4b201bb7946e944dbe20e5f18087377904d6fe520820d74698d6183ccdbbe6f93ec62cf5c3fb13b3168542b861e312e4ae10e59b4fb14f88b3961f8fd32fb0150d526d2da4b90cd6b59753b20646faa948fb5b01f52ac5fdecce6865c394487f19147d75af" + }, + { + "tcId": 325, + "dkm": "62f417ef046e28c23f8e6bba5461ea13ed9e507f402ba994fc646e7228962a647e8c0e984b83519d0c1a714fb1ba9bb8f68788d83d5010cb1ccac37ede5e158a1b98f6b04f596986a3166f56918164db68e42e030422891589d4bf639447918d7665e7191194ba8df557050e7d84eb8efddffce44e098794cfcdd19d00f826eb" + } + ] + }, + { + "tgId": 14, + "tests": [ + { + "tcId": 326, + "dkm": "9289856e49821887bf234dfccd231e75cafc34cbd8368ba0c1c09e7609909882719209b94005b1266d5d851b2d0e2d011c6c0172a82ea4cfc5b184a48797b2ec4f7d6fc720dbe36951d59894044bc545d36b6b06f312801f0165d4f6dfb0c23f2833c35ff8f521711f15021e5c59bdd8605d5971861cd8652a033cddf80b086c" + }, + { + "tcId": 327, + "dkm": "b7a686a5b6ba9d4825b07525a7b92aeba4e85fb04b77c5661093703e6b904a229d703df1a250dabf212e5664aae23925fe0dfffe4d6803b534f2e6d2940a26ddb0762ef95ec37735aedc091bb6bdb1d7dedd3e6336cecb568e51e074b4c749a45704eeb1b92a1bbb3217921c451e9e4a750ccd5256195ac065248bd3e33f17f3" + }, + { + "tcId": 328, + "dkm": "1995d62f4f5944a920cfaab5058ca12e01d1b3dc16417b5922f8eba0c07f1d835a9ff66195cfbc2cd0ba9bcba1573481df0bac6936fb6cc90a2a7b7bc9627e2a653264180a5f7fc329a05b8c65358753d4316e1b4f06d0c36361e97a1e3937fedf01fc4ec51972b9dbeda25ab3c427ea2a7d7092c38dbce13de665f02c36a0c0" + }, + { + "tcId": 329, + "dkm": "991879841cfbd223eedb8f19213bd32dcc5c456de8774cefbdbe5839411875e49f7558a5bc7f19217f3d546429b0595da85fad50dc7ad10e2dc2fd8a3d3bbffbc88d3a01e16f27216f35853431c65bf5a706e96218ec195262b52015b16be4f73b6eb47f94f811de08dba052ad5efe43fd413afc844ec5f1ed46a325e40dd2a0" + }, + { + "tcId": 330, + "dkm": "6478baa880ed2b927f9db72767d8cd138e03571647ee7e14e6cfb03e27067fc31fa3b9e6619b1bf38ff1e749ebe308dcdefe7b55833392497e102aa989ee5752717d358f100463fbfe18f44c982ab61c0ebf9a6d6338a5c05020d9814d2d8eb8642e4114e127bc2ee468ca116b38e008e1cd057cc09a28fa4afe92e82a2fa189" + }, + { + "tcId": 331, + "dkm": "50f9bf250fcd365426b3524600b62903e6dcd27d733f7e5d1e24350460e0b9a12274c1b8394c95095657c246f67c2cc6cd87f2f28c2d222a053112b4514d442f0b4c4bc47f6a6a02e410ae4092f323b2b4c39d114951b617f55ac9d616e73d8a381f1d04e7cabdaa42ae6725c3174e0da7f6bf6f1f3ce1dc457c6c5d1ea1cd7b" + }, + { + "tcId": 332, + "dkm": "9f609f9a79dc49a422ef8384cef8b15809d4d81a0ad547481d25b8836d7ec00acad2a220e708baccddaadbc953500bba0b628d26ed33f8d88bb0d6dedc9aba6c7c9a70887b72b45ff2f0b5f4a99dcf009ee1086c57483d21ab5b81a6c5d5c927f96c849504383c743286956c769bbfe0fea4c78c45b73ab4b5afd8b131d51c83" + }, + { + "tcId": 333, + "dkm": "e7f70c8776c7da43c666e2abaf8b6af96342ff8afb8597b12ec3ad8673c13595d8f818bc5969bc8ae6414075a2868db8d46f34e44ebfb4b549fe049b2799bf5bdf4bc4cfb853fd5949ac90c2b7379004bcf308fa52605fccab97797e50c6ce2a5c0d54f9df8784490910e14237bb31ddc95844de6f5002efb8ab3da4170720e6" + }, + { + "tcId": 334, + "dkm": "11db0c69b4d5b86fa0e5c4d71d66787ef5329517d88aa8a142106d293242c25c07751b0b9e5976a28991f5e35b62555bb528c9b62b9b1bbfb6ccebd73cc8d6deeca519b0c3cafcf799a90f6ba17346f31317991fde3d1b5d831775dc26b3009da763ffd405c7c347090b9cc98ae2425007857abe1a362fd5ed9539d5f239e08c" + }, + { + "tcId": 335, + "dkm": "626022c2da89034fbbbf2fb75be60aacbdf7f7ba377ce4523faa7c7dc2183699a25494de063c720fb6c01770be219cd429b2f77727c99c864ee5e20341e4b1cf52f43582d6ed53436e37b4786af041b8765fc692225250a438f20a1a68f6a0cab75b67a6c5cdaf9d6952eb08e530ac44871c5d12fe04a596ff1d0a82939c299e" + }, + { + "tcId": 336, + "dkm": "c92e174cb11cfaeccc9d4d4e43607fbb5fb0607732571c15744913ac9312e7c56958fa1ae0792bb55b69dbd162c767c42849d11607aa8bfc44fb019d39b1e761b6ba30251504f1ed183c2d11c7abb5b4232af191443dbb1f7eebadf12ec3079508b401fc3450847da7e726d5a77a776c86643a36c241e8dc39511228083b7943" + }, + { + "tcId": 337, + "dkm": "5563ea1f838152dd8c7286a52079cd97d2bee2729acdaba1d93d42a4f3cd3974f2a3fadd84d6aa0098352271221ad186c56f9538ff58cd5b6ff4b0914a235a4da1fa5d25d3e411e11b41f27afad634ab30168f78a050720f8ed2b95c5d44b1520102cbae956e18df4946f543b19a5811a93f0ccd95236a5ef3143f522f43037c" + }, + { + "tcId": 338, + "dkm": "1a6d60da2ce0e3d28bcae5a219adec980ee7781bd2048a93ce75ede6b03db5b1d97e29788aa94b5cc1508fa9a8017863d84fe0ea27ea635363536424aabc41647bfe34523978b2ec1668b97a021a319c8b1291bf0444af0afe9445e5885cba614bf6316a4fb72bef1420422baeaa416f23a519790ff41029a748f3bd31068701" + }, + { + "tcId": 339, + "dkm": "44332194cd2919ddc1706401eac3be34b1b3f855f9f080a88f63063252127d64cfafb9889f08e016f89f22d47ae877ad657e97111ce715978d85a96fc8e07db0dc1abdc20ee25833a0cfc66ad8c6fdd90cc5b1c41e2569c91084134d19957ac97597a8c7da36a4a9d26760a902b4d7f8783b8db7aa6798d05758b1f27aad0965" + }, + { + "tcId": 340, + "dkm": "317b57092251d695321035a75137857405d420679fe44beeeeec4a0792ef66372a156f5bc9104ed5d7a30662e8cff3de34bbd7bddbe4671e4c63681b2cc36ec7473f35d329165abc5d6b76328d1d3dadfb4570313cd1b4d4cb006a66b0f9a6bf62ccc30a40733f2e43c73c686c6ae7697935b5c338ae4edda87f1e73dd874005" + }, + { + "tcId": 341, + "dkm": "837e738096da54e96d282af967145122677a6e90c66151533ba29656cbd75455c79c2b32e68885284f3fbe35f4623f469fed8c0585f11ba53bd5fc42e18615184d89f42f1712ee26f2dffd7263d1b3f3b69683dc8250e4eaa1fffe11e50beb721c6535cb10f6a33703435b81289673c87856ce10851dc3b88d3b1b1864b9865b" + }, + { + "tcId": 342, + "dkm": "8dc8c5efa656e078b67f528df442ac5ea22c35257b12641b1a8b9e2fccecb0cb198073f668fa12bb44e5a658cdd099583c719714a82e219cebacdde44f21691217c67305568c7456cccc7103a89a526fc4d9431bc88a328cb67e94ccb6f368cc81da1630ff5f30f6d252a8cdabed49aaed9b219f87eba30527939b0f3bb18e22" + }, + { + "tcId": 343, + "dkm": "3ffaffb14714e95b021efdb46646cdc1a69bf20b26eaeb4c028e556ddb3ed1653144f402d4ad5bce6df7efcebd0530470003b3f2993d3ee3245c786cb43fafdce1f3688a96cd658bb16b70df4ea2611679455dffd1712e5e4c7d9022b6665b8ffc205a0900f4c12685328287ed822ffa44384f20d3813745053fae8297f140ee" + }, + { + "tcId": 344, + "dkm": "68646a475bd4c416abf86968bbc4841ecd4f5401728e5246379302b995de478d68abcbc99b7fb6bfe963ddd817a2797431b0c714bb5d0227f58827d6daebf34bb5333e137e91cfb2cf6c9cddf9b2781cd67442a1be6301026e81e85e4e19e025d094ae071add96027f988124f2a6fdeb5025974aa4a93cdbf9305648bf3007d9" + }, + { + "tcId": 345, + "dkm": "4b4038e091f0be3420c32fea01888b8769a05446b39eea3b2ab0847e7946df8fcc1e11a95a2d374fc2c77da83863ccad30cf167795f3c97e85821d81b582336f14193260b4ec3ca570434bf3af548d66633cf257fe9190fcfd21730418127c5ce585f7d4e3231c16a1321d4b9c900cfde1db9c7a261cb9c447f4e7c0b4d7d356" + }, + { + "tcId": 346, + "dkm": "208167da9c74063cff8d00731dd3f8c52132c3b55eedce908ea7485517867073b27876098441dc4055b6719e3b61eea730b23dc8b5ff6494a58dcf3e053bc898aad511e0817ad661e90d676f7ef222115e01a944d6c4c9f65cd67682f857fe91a303a019255d20366335b07c04abe189e97a318343eb96dd98d69ce890b18688" + }, + { + "tcId": 347, + "dkm": "c2c08cb9144de6425ba326b12d090b526ff5f55b9e86ded2d71c10dee711fe2b0932e97ff0835ad23f7a37f3a5998ca422e0acccf82fcaf35af10403505913cddac12f1c8c0032f3838f07a4674efdba3f787c529417b8265754e9f33f77cc0286c033fe1cae1d6a583d7f9db6f96e3f4a9974f0fb6281dacf97c77490456f05" + }, + { + "tcId": 348, + "dkm": "91a1cdb2d4eb414798d538b1fb7b62aef3e6aeb4e3abac92b1babeb1bdacbbd82affbb11de5ea5591893a9ccb7103e4ba9f651fe5b133af6833ee5021d49ef3377d61be20a9a751074c8ee7b2c75582c558ced200d133925f669c48bbb3dc68592d105a86cc6822ac3125e5eb2107946e01ac04e4f7aa4061dda83fe92a4c622" + }, + { + "tcId": 349, + "dkm": "be979d2dc65ef45dbfd2333fd4976219daab6002fb33f8e172c7ecfc5c80f29215ee9389def8671dccff2728e8ede1b5085e80129142d1cfdeef37a1521d9113e516d4d5918fd1f8335e5fa05df25f2b2d18dc56d29d079fa4ed618437c0762af6968a939d811738c4329248685718feec842e381711106cbeea9e8ba6771044" + }, + { + "tcId": 350, + "dkm": "2b8213d8a86e08e16a3adbcff7a48b92eb9954b03f2bb347c8f6e7c2220dff727d37e28d47042b4876158d5a06bf019e087f343bac2964dea2514a88087b75a4dab60bb859b7cd5177a57a91e0ca1d1d78c03bcf34b2c752c6fa681807f313bcccd6ad7f48b04f01e7d5478aa9c1941a29e44963e9e0ccd6cdc1c2982ff1ffeb" + } + ] + }, + { + "tgId": 15, + "tests": [ + { + "tcId": 351, + "dkm": "5e9ff8e8e330c1262ca5990b592dd5491492afab431a96103c7c6a06765cfbdf36c3a507c468f2777a4df3e02b50fd0ea8093a130256b5c9e8c53e40e2eb5331071e2363689aa548ff04cfb530a94f4b2a54f481d759f92f00e819239a39cb45b0aee90d218ef03b5806015e89961dd1b94c1faff6c46d3c2c9dadbb491d11ba" + }, + { + "tcId": 352, + "dkm": "690a520c6b6c6dcdba1d03f8ea7e362f10187f3c5cc2303ef42d2c14918585528df5fa555ff14120f67631e92b269afd3849786a106f6e4d7b0e5319d26e36f5004137d6fbf37f417bae9b9feb6fa1b64de20f34473d45f312daf8e4e1a4728831ea1a1911113c5cf2269e29017b73d218efe201ce50dd1b86a22db6404fa14d" + }, + { + "tcId": 353, + "dkm": "d426916b45f59f9133de53b82ed951e98d3025652f3485375cebfbd4e32be3400e184b3b78f6c77a0609f8e2e4fbe66fc91eed970b334c34ffaf60785ab0cf40790bbba42786fb60bdc8003bfef5749e509b91e7d41830732d366526a9872c5bcdcd9eb06d6f660c238c38c26a8c23e544975e8d9814e4f79aa91e53d5670585" + }, + { + "tcId": 354, + "dkm": "e810d152d9adb5b1f5318b2703767a5dcbd37ae5ca616e26f0c17f6add7f2373b4467b652494185af67129ba78d3124db606ea21ce08bf8f6504a106c21798ca1fb5a45494fc3ae7a6d640e7f23cce74d086b72abd8260b94e6f9a3c15540f746937af87e6bcf7f0b7cce0a9bc21af82f39fad0dd0406e2f2dc35b9809ad5c36" + }, + { + "tcId": 355, + "dkm": "a60de2915af405a7f1ca0b119eff38df2b9ea5f3f2da18b67e042c710451297a62685b311eb31774affeb51971bba71fb4676ee53912de00cc275be9feeece305b2ea0cec5dedb9a4d97ca1f5dfb7f9a9fad6449397f351eadf91d4f69fdfdd526353bb72b30e62c846c59693bbfd088469a6bbf080950430f40fcf35763df9b" + }, + { + "tcId": 356, + "dkm": "0467ff302c1fd982895884a48aaa63a9a8126d779b1201fc1758bd07872d5cc6d8d3607bb657b7c4dc9c38f6805039eb3185dbeef87a3b162f882590580a7388593f65892f149185e4948c470478f024de67f8b97dc632b29894e01c8675517684d3c92c244e4481631d3cb657758927d58ead8c0418b1a9c1a990f55f1d631b" + }, + { + "tcId": 357, + "dkm": "cd05b9248847e81c52691dcc76625d6fb60db4720cb111a99d04f5bcdd8bdd7d3c987108027c57e6c25f0d8ff6305fc68ffde70bb6a04f39824f424f0f731e6a9835c988c453b7c838dc7391d60d8c0cdb294c7226b7ff7c609f753ae3551113796eafa65933d6dbaa4920199e3b15f9970313769004e372dce385801f08a712" + }, + { + "tcId": 358, + "dkm": "f4567f371ca42f230b80821a8745015042058228750731dcb9f02c4aeb4fd31f2f66fb8294c5debd5a99d896425b2257db2c4a6a436bc830f5c55605a86b6d385a6ff63a3b3812db4d07abe04e0d8fafc84ee1d4f4753a32fefc074d28ca7e1a859140d763328ac99be05f6e0c6a665ff42e5c08af0ad77526c8be73217953f0" + }, + { + "tcId": 359, + "dkm": "cd5ec306c62e76983f219546c15b94c1abb3a22cc18e7dbfcc8bf0692118dad027ea439cf66ec017108a16a38e29aff75d13d74c9f76c8c925fa4b2514718cee058aa8e93cfeb0f6512df0d2c675719332cde2d94a8e97d9ffb88411ec20104a2a5e87fdf51ac79853976c78da501e87bad73f06dbc5adf88905d51a9b50f6af" + }, + { + "tcId": 360, + "dkm": "ff200905645ec275fee0decd547ad166bc5939505cc3b210af15f3218b31c11f89127c6ea9ba72cbe0c4f35849fe10f3ee2fb600c97c218e7b0c561087adb5dc1de8ba808993e92ad900f7b6e3f36afeca6b4634b1d7f31b46e957bf35685d1e94f4b32575ab0ec66017c244b6b61f2394abbcee938189b0ec43df9cd6773389" + }, + { + "tcId": 361, + "dkm": "331c6da76db27f7ecc1a8243530a25c87a15b57373a73ceb1178d2fb95df14cdbcbc5118af7fcbca1d6f85db8d152e7a58e54067ad044e6ed01acaa17ddc90595202c6fa1ec756708f13a58ae55b7c3c8383924daff12cce1df085025045c93d6b0e653e3146254e759d7a83b5deac17dc8eda7f3f5e1c24cff6248f9bcb2a85" + }, + { + "tcId": 362, + "dkm": "40b8a0b11b1e9b4a1b25c316fbf080132d2fb742bf9a7deee2b54ee74f6f2fdb8d5c1597a525e5507bc991f7e77bb4251dc311600267367bdfbf8cc325566e6160b8a417629be09179d682f4c68ced7eef946ac1db3082dcb773d0f07c8750c1a0726411aa9fdbcbf5965d20bcfa75df6e87a3f90330290e6d23ee8151dbbc18" + }, + { + "tcId": 363, + "dkm": "448e683f57686b61503aa45145fb64b8f330103d789f9d68f96b1a2e64830061301512b2fe6ac729c8c16619c4e1dc4632f8a6a127fb69fd51dd5181e0680d2698984c237ffeee293d364b71822166d6959c01246301920438d3d56cb4805a4be70aecf08eb2acf244af9adef5cf3b622691f3587b94ac95ded55316dc5c9cdd" + }, + { + "tcId": 364, + "dkm": "0f3c2c37df195126dd8ddadc6e3938ecb6556738644b45db2f51f1a2a3b1abe4192abbd28e05195606a59ba17364b3d63e248f9fdf113762c851e82b01dc376f63b83540ae1186c9f56479d8a05d61607cf75935c75eba034c8e040d69ee39e82dd6cb5b06607f774ca97ca31202708a800953beaed324ca7af876bf3315eb90" + }, + { + "tcId": 365, + "dkm": "2b01a1c851ab079b2268bbe86f23ef0c7b31affd28cbaeef2133994453461db50b31116a16a52c11ab30ff7179d86d6683b69577aabbf495dac55158045fe7056375be82194132c2243d6b956618eee2ca2b15847eef5b56684d73131fee1eb9fb795135f48e8388bebd939b7d513df86a5be7d177ed3086280673f379c11c54" + }, + { + "tcId": 366, + "dkm": "4b1de0e1c091e1d0fa5b333258300816f6c36be9777ed6f4900ac7204aab61ea5b3cbafba2798426051cc13449c1217940d70c317f207e3e8028fee93c42e1f178b6d4127a2212c8327ab703d4081b86d859250226ba6a9bfe4839dd3f5b05b9f47b14cb7f4d062b006251f0dce9efd4617d2e9c2571908db2ac1d7090cf5f31" + }, + { + "tcId": 367, + "dkm": "e48f3e231d3d6428569a2fcfd13eb21899ebb7b99f18c900bc46c170b17baaf905eea366ca6f964fe38597384f274fceefb62b1d7244a68e6bd45a163bc8727b8532da81f0f01df30904697dc4e9c673f3a403e0134eef2d5374c42e31aa8d46b86cb5ecebbe53c5bc425476252f06a7aa4489a1229cb15d44a48434965cdd7e" + }, + { + "tcId": 368, + "dkm": "1b1b0d4d10447966a1fc211a030510c90922ccd50b99537d01d8c377db8c402a5718c5db95a55eff19121fc8a2f5289b9f27686fb9ddb37a51f5caa29bd2971df3184b341a24b64874fe601fdd6654a6eaea84cc5afdfaabf40e6f134a12d90b299b60802892c22d1bbcf3b0ae6d081e1a262f8db9b7545eb91f57ac0d9a9c5f" + }, + { + "tcId": 369, + "dkm": "7c1089c0f07968ce42e40fc57fb34162a840f604b44b9a7d54d2356da8bb8ffc459ae18058a03eff3c69398ed8d1928160da17cc0a0af3a6ed1b5c0b5a3deaf705563c7df71ed86f45f2d40b6d0a327a83a0e8841bc8d8da02c029d5cd599a3769b2552a0d4bb8a93516ca62ef60f6f4824efa9922bf8a592ddd13feb3c646ce" + }, + { + "tcId": 370, + "dkm": "4cbc14a260e1ebb7ab91ca81b5d337418ad2ff6f609d575e5f3a0cf5cabd54306cae8081161a3667d50dbdc8a04d68889a3dc91f7d4d48599c2d3af05a8950255014f058df932942cc756ed3f4e21ecc13192ed3691adb2f44ed90ed27caf80fbdfe061b86d08572ea5a786c27d30e11116bfccb71a1eac0ab2b132fa8529268" + }, + { + "tcId": 371, + "dkm": "82c235fd26bc83679b9127324bbc0f8d540a8f8c0d7f70c464269172eeca161b0c19205ccc736ab59378829156ca5ccae41a98ba7d04cc7c8538b4717d9a124bb9481d8aa16a73abbadb440b5658e084209fa11ca29ffdea3b89397fd7a7351d53b1276c6429e88a3e5e028b656c90ee83f2cec1b50655068861868e7376e4dc" + }, + { + "tcId": 372, + "dkm": "92f0dbe2ef56ee1b0755fc623cfa9bfa51db178bce58b35c121ad52227a9830c29acf0e412a17edb4e0dfcd078b541fffdd412b1e537ac4966c887e7ced6bda6224843814b3ab09e070bfbcf0a0c4f52a0d7d97711be8b56e75eb0ccae257455e47cd024cbcdabb86469e85848e5f8b8a3981e6711e4e1e6f19587399f4e2752" + }, + { + "tcId": 373, + "dkm": "0efb9a649ca8cce5ab18a9ece74535f1928303a085c831f785ab11cbd043b1b8788be218db19dd6a0d02facbbce28e1fced22f08d570262f7dab01c87b32f27cca3a0fe0f362ee007ac440dcbfb47ea0125b1e82bf243d85c7ecd1a6274557505d1f059924ddb7a4e076df2eb411561a0b196ac3092903d5612f9ee22a570f51" + }, + { + "tcId": 374, + "dkm": "69d358a745f5e8aa97bf9af2f4d0203ce0340543c56dc6da3c8b8c2722b81da0ccff2c7e3a371d6fbb9faabad550126761caaf2a4f6a3d7816732b64d6a60d815683d7ad80926b09d610e00bfb3423dbe88d56c28c1fa1b373890c84cf8e401675016c1cc4b30b2a3817459927385d0e9d117e5d021a15009817a3c68dcfe643" + }, + { + "tcId": 375, + "dkm": "17ac14969f9beb83b360d681bb53f1052b06855f68793f2d71c1a919e293794531fc6b679cf7fcda0eeeb04aa9e0154a55e2188368f0b22dab8ae31856057dffef909c41e718d89ffdefd4bd4c27c1a7523344e443be343f86148dfb87e12dd0d151a63a0e8170cebc6a2ac996e3a44ae80d789902e213f1598c024d71c98040" + } + ] + }, + { + "tgId": 16, + "tests": [ + { + "tcId": 376, + "dkm": "c63227f4ce70cae01b5fa936146b13f15d71e15c362c482e36f2232fe78156a104004695853940f393d3e54952796cf796ff000aae4a55ed29210d6b5e0cd7c5ff9686acd0a3870f859e6e182e2a2a2bb8989ac0b52073aa8f3fec0e7f187481288f820b0d361b1ea692dfa49787760ed1699f620c17dfea386db9ab8544c6b2" + }, + { + "tcId": 377, + "dkm": "5123f204e88ea006536e1a20599a469e432efba64d1c5586f2a26c1ed682e147fdf34816a5fbf5236e74d489c2c07a1decb82493b86900ad75497fafff174ea6129f7bc32b390deafab8d1ed95699b90e3d107ba1ef42291c3877f83d48cd5c24d606c52aecfde46db52005c1966abb2d39df970dc6d302f9081b5f4f675226e" + }, + { + "tcId": 378, + "dkm": "3c61af78ac758538850b291a3eb7937e07284bb62ddfe74ca35571419511479596afe4341fd74704e59c0388c1a9f3bf0fa720d8837933b66521227e2117e4a61d7a727c0f4828b0291dc50e8ad1ad79a4423fa74ef872e3399d83e6c3926a687935106ab530e9938ae1ed68426278e843b9ae481141342eed2fabad1c928e5d" + }, + { + "tcId": 379, + "dkm": "75755567f39c387a77b09b2f84dfe7003218f3b467cab8631ba3ed54abe381cdf0a140e7df4bfcc6b2a8f80e93007f00b6e9f540cb45a38831cd841bdaa8d2a5f8f5c5711b086e73293225a9dfc9e3bec713c1ce399ff2e379ddb81a7e1ac30c5ece91b6cdbcf5ee5a4b19449f72577477163339cf97a3aaed19105e9a612625" + }, + { + "tcId": 380, + "dkm": "f7820796bc2ca52505ec647cbd3a8324bb679f4cff094b63e440893ffe3e927eff08cc457cb0b318adf8f60bb4fdbb33b3fb46616e5b11a37d165f49fc6919983051f7597aa304ee55d7e8a8c67b548de15546be32bfbde59745c3fde2f880d5a7cab6428e793e64dbef314558e44667a1e2d43b0ea9bf568de9675d23bac4a5" + }, + { + "tcId": 381, + "dkm": "5b269bd8b1100d2b02289867b3f38996aa4bb4f91d477ce9a8aa4901d9e3119a8058e9ded32b780d288e1bef374aad99e3c04d9b090608b58388217752485c1a59c0f06bb668967a73f58452b059a53cc93836e31f862696020682b26ec695359d691193000e60d8d56e2f77f1b325a5fd808b8a56ba4268183ddd37f211a8c6" + }, + { + "tcId": 382, + "dkm": "96712f80b0fb8523be1060a357ceb5891c7b19372d14c3668994232bcdaed75caed5625fad49aac7424fdee543d103cf7d22e9cf605fdf4c3e64c902b9ce1162ca5f7385f76f3d454352256651f1b422bb8ea37c2aa49a51c6040913c4a03551409732d0320be12bf50aebfa97e5552be9cb477890ad23a4327f220cf6d3e9f3" + }, + { + "tcId": 383, + "dkm": "9742cb4ccd55dee26facf23c765020f45439638aa7db80d6a056c5df6e3c4ca186b14ace76098e77d5304726050c157e513353d5df2fd36899935fac7f0f7ec2be26a03bf966613a9aa1a271d353443328cdb3d2b6e27043a2ea4a2adc2335237d1094a7547bd7121ed0056e328a5fa2cfc867b07638d606235f41832ec20267" + }, + { + "tcId": 384, + "dkm": "977b0601104b934edc1014e36ff9dfcb89736cf7efdb0e22913e992f047c2374b09f3ed79ab48dc9e0767652d36479637140502dcf6b0ac25ba77858926304333ca8d0c153774ba13907b7283113e8a73f17102a702e3a3785223931dfca316da8064410cb50f17e9b401bffa990f2d00f0d7e63bdcb26b58d2567b59f086485" + }, + { + "tcId": 385, + "dkm": "7b4dbef074c736b4449fcc843737b7fe7d85d986cc4bccb7f6c18677c87e03974879644a378f3438a3cbfb3ca10c959b6131baaf981a186e9e5d1b42640cf7953c1510de45726674a8110ab37dee1f354d8da196c410ac82da3e077e3a60629e613d8656e0a350c2c8b970f5e5ca4b23d70b02bd87bb0a28d913b468714fdb23" + }, + { + "tcId": 386, + "dkm": "cc4f7691f21e309f0cdd621cc31b3bbb02a84ec6b5437989646665be29a5d204ec0abcb5fa166e9b78bd877f597cc5e24ff841a547acbff9c2bb6516ea812dcea4d89c91b154acd8c7446b9e43e3fafe9c6a2ae9f0a4011d81fb41a4a6d46c404e507c440c3ea0022e95d4e6bcecaf30f4e270dffca52d27b2d6c003ff8c9a1a" + }, + { + "tcId": 387, + "dkm": "00048f4f626fae33820d740ac571a890885969a296aa143a072dac2f195b9fb28eda93b5ba28f596c63e771cdb47eb2144880a80439823f638fb31c6a775a8ee688769c7877444174784fece7e7b2978ae07938c28dddd431bb66f5dd075d8d5f956478ecf60078bb73101acb71383d4657e82b884252d98baf4d294600e664a" + }, + { + "tcId": 388, + "dkm": "d62d2c5d76f0126b14afafbf8d86aa51983777c43788e77ec911459e670f452bb5f89287c29b62724253df5009ddf546df4145355ea23e17f38bd08198c81a2a00379d6b050b0269fba953d66f7c8986df0936c9f40da6e95be9d99599a14f61f0c54b6cfbd5784b2166d87d208895c661bf4044280aa80c1a41053b4aa367b8" + }, + { + "tcId": 389, + "dkm": "270b3740ca41a4274a80cfc4d240c94af9ac17f4a7c0c9d254d1c15cd9c42af58eddbf4009ccf012727b095e65248e2a1de1255cf8ba2ed1a49abb78c6801e4d3dbf04653c3337d658504b02e4ddd4628baa4e66e69f05ea9f7d217e14f827a555bfdb251e1e559e5f790a9eb888ded76b665f2180c998a90e9bc500a787a8a8" + }, + { + "tcId": 390, + "dkm": "bf005a70f645863a0901000a64f212ed6f607081ddb7f9756855ebb438a0db33a24c6b9f3edb8c52af716be0c5e4d426ac93149d6f9503f990865f567c04e8887250dd605600926bd8a02d8be9974b2286a91fcadd604be1657ee8b4dd91b5fe8be6af94d054a13e7df494b770bde53d3b5bb38df76500fe5ba3a5b3924a86b3" + }, + { + "tcId": 391, + "dkm": "71ff60d56753ecd408e48cc48cf25dba0b977d8f109e8806c9bdac9f14cfcdc01b758341820bd68280b2cc5173b4f232f8fd9ab1f6f050c172c9d826ffa00c48076ca5537b5838415c86f0f668e0bda482ef0ede093a2ace65f722fd5c55911387a8918b11f77335dabdf8d2c497c6b1e2afdaf8ae426f466b492a36f5b8488c" + }, + { + "tcId": 392, + "dkm": "94de774d8a909eeeb36f0e5435bd39972ed83fa890ef614c0b31dafad083fc91c5d325548bf552666567e0aceccbf4c36b235786aedb338492db37cff337ab06f0d8dea251a115022bb5ee50bf7cdbf54c5f31b52ba32f35070517413c1836f2b5c516109c978af9af67aebef5cc8a704ccac8da51185cfc6b7a1622fa68b374" + }, + { + "tcId": 393, + "dkm": "ac8ba40c626e0cf7b6c0257f5751149904688fbb19536885156b6216103dee0c179b59d5d79f1bb9e5339fedaa2b0c3ef061388d0178b061daa39a19bcb163e6a5d83d7ad456bbb1bca9eecdb1142f742eef12d619bf5fa080cfde443329a109a1df1f60a0916d0586a65e73f941a0178f0cc2a3a39fb405f9938dfa8529b9b1" + }, + { + "tcId": 394, + "dkm": "99d35b9125b6436b90566bd9ad8fbbacb58d74f36f6b7f5142f485ee3ddd0bbd6fffda2bf2dd3282396e8dc99ed276cc74b54d99a01d88c5a3b53b73a976a9e06438f8c1f66a3c0cd1a2a227b8481171a705018451ae5cc7be1fc5be65796013bd35e7af9d3a1307bc4e12a3fb730f09fd1ad1450d0c081dc1adc22eca109553" + }, + { + "tcId": 395, + "dkm": "9ffa19ec8d555758a86886cd5ddf8408dad91ee764a24e26d117719b33be979024f906225c15ffcc21bf4c2d66270148c71edb2a2209ea11a5f53596de7204ea2b38bfbda9c3adc53abaa22cf8dca3391676e62423b556ec0f18786b19d827571d5d1e31315039e2b4517ed04cc04156c4baad2e01a103e7e7c8dfcd7d57112f" + }, + { + "tcId": 396, + "dkm": "bf6f573ccb1e99580883e45679185d6b38c6b4a66c54b36523410c8f61fb8626e492041d31e34c897bc54f993a5fc65c52174fb41b3d1c13296b471b2c08d3aca5ffb20e3f70b515364efe4ad112769d649c3b8772ed7cb2a62b257d1e4f4e34b80665aa7a844dbec477e740a5d5028ee758553e5b78fcb116b365a63b3fb772" + }, + { + "tcId": 397, + "dkm": "ea613e690715e3d3eaf339976449008a3e340859cb4ad70f78afc16a29548d3d3da72b8d842b1d2f3b05f9a262406b54c29bc023d0fda55f6c09b441efd0d6dd34addab9bcf148daba628163ae85eb57d341f14cd08314e2c73b7fb6a3abb6d2bbb6f6fa9603c44a71d94bedca5150e7a5d5f1cead309cf0587336f81e6f6e6c" + }, + { + "tcId": 398, + "dkm": "9cf93788dbd1d404ca3890c65a5dcb66e357bdb74f14961655d1dbb31fa9cfabed89439edf3a5bf2a2c1a0598e410e64329499541b1ed698674db3c550798aa5a64211a2aa12ecc20dc87287160352b06a1041d0a34bc9683ca4cd4c40fd8e1afac7f5a8f1d4c33e232775132ac40784ae9312dc746109620c3954f4f2ab24db" + }, + { + "tcId": 399, + "dkm": "12071a92494d7f222acb2f70a64da449f7283e496b55852710a86262435242ed6009e7f6100587d6f43034821d530d54305570908a39c258f05982b684c2c79698c9260bb4ea27e9d93650b275a583a796c54870ac7d5b4f330a1babe36ff4187c17fc2ca7bec9069c452a870b387ba07bd5e4e733c46ab14c7f1c548a531bb0" + }, + { + "tcId": 400, + "dkm": "3cc06ae47c6155058fe0caac408ecb433f4fbdf1c7c31f2d2b7473bfaf4df42c1bdd99d8430506adb93686a6bea534862ff3dd4c41291d18247d05a5d11c44bc42efe970573f534c8c35f7728788fb62ca4caad286be4c02a2ad971ee5ca2cf747c2113c4d65b8582c7972aced722a3b93e77875c54e457e8f8b1d9532621340" + } + ] + }, + { + "tgId": 17, + "tests": [ + { + "tcId": 401, + "dkm": "8a7f7e5c3b5fd644db364952483b48f23f0e7a419a432a8a2fce821f79f1c8c0acf597995f30c59f1263997a8b04c22652e1d09b245ab6fec7492ce0ed7faa0247e36503731e90a84a64e820a45d3ccc27f62b405bf4df2724705d6de8a43ff279773fe3b15742bf24e22e584d67e0402a3fce1089bc0e32b8ca7e98760c54e9" + }, + { + "tcId": 402, + "dkm": "17e8490b142c0cf1e8729b45fc18178d467922df68bdc034f4776a6d07d2918f83ee987a963a9555819471a7101a81f6c2443122bfb34d8191f41116058a8e07f92fcb5380923378b2f1b6a3011175045d970e796c50162d6637a9535e6c5a346b80eb0661b41d4cd894751226ea1bc5ad059389c2a8549115c0c9150a18bba6" + }, + { + "tcId": 403, + "dkm": "b96bfcbada81d4e34a45e89ab436051b6f70e763371d9371aefa87b43aa2ef3d899d02511a51c583bb464ad89b01457d1bf1c7929d9f327e686dc66f7d1657e9d14ea2ef5e9d9dc14941d6725e9147fa7d63487940b572979e1da256a6ef066c6c532c77ec2a616c9a26ad498b2a8cd590d6019643544dc0bdd12218c0c99cf1" + }, + { + "tcId": 404, + "dkm": "6c57fd0f76810a4353b816e173051d699950118ada3204f17b128a85003a9834f05c29c3396b26f98deeca83b19405790e627f2a7c9c5c60d4fefcaca4057ec57d7fd9f90b60bbf7d517228aac9c4540d336677cb434580d4a97240bf1d2e4bc44d0f4995911f1e33de8522a4e8692f23dea813d862fcbc5002b211c0a0a25e8" + }, + { + "tcId": 405, + "dkm": "d61a31c99a74fa07d0182a8371fb7c108e3d2f945116b72a78dd3682a2f5dcad87118c0aa0fa0c0e5f9b49dda420d86ef77ab274c1e6188db44f2c7372c3a2aa6bfc08682889d931e7a818f68783383e70ce40ac70ec20b70469e32a57a39f2e9070629b42e1c32946712aadc4c9d4acecaead20429e595076b8de98ebe97d33" + }, + { + "tcId": 406, + "dkm": "d7440cd8539a69f50b25595202df7d38b6f435c071b928806be69105e1e354db678e8191cd0dfe67a620ec1e4fee5ab3071952e834e677c3586e172bd6c386996f4900a98dd97804a752b5b9f39a2edb680f7a90a5abcf665f3cc422be421d11c612fbf912e153e539173309932ba9d1b5bdbb560e527c820ffc51850bcfe590" + }, + { + "tcId": 407, + "dkm": "54c1b5222aa5a38d81cef48c7889cb57ce7914e894a0a6bc3607e15480ce2ff1a079ab14770217829e893f79e18f4750900d308bbb46a8a41ba871a33d4a993b2488dab117b59a3e44663baee78dcad96fc3c7fd238ac37395c5bc45bea24f822ff6f7708b7061e9fb9bd6362fb89e9ac092e637151d38684d1b59fd99a2f5c1" + }, + { + "tcId": 408, + "dkm": "042c6c879e14b27daf19905f31fb4b86fa8ed812f849c138b3b345a850d57f838a4bc963dbce34caacb179d3ab4d436c708cdedc87ec78098d5d2c366f3471cc29e679174eed0198d7e2b68e215fcf4f8ac71fa6bbcf35891063d7b51ca7c1d75a9184c81c236c72cc45ca5c6e9f266e87a05831845fe8d745f5db771d6c8030" + }, + { + "tcId": 409, + "dkm": "e5638f558dfd5aff9f7c0f18c7edf655a92d8b578618727ed5cf9209bf7d0220e03015781f6c6bbde7ca32bfdca035a2c7a78fa8937200bf0d119a9310ac5ad47dd4bbec680baa872feea8eefa0e4728f3deaf2fea868052fafca61eeb2f2679a112819cb9a1e7d2223f64bfe0bec9b6fd492ffb07950c7ef242972d9dda14c9" + }, + { + "tcId": 410, + "dkm": "df16426e66a3e6abaf6cfbdbc06cdb710f71bfd9acda974135b06ed4ead59de760944c0da30947fd3da33499cbb47f93b7471494a1f68b259c0cbbb9b0f97400eeb0d42c57d09ba087da7cdddf0416271563bebb4623d9ae654176c1e6a7a8da1715c561ae6bd2bf2cda9127b2d4d10a4e46f2fc3393602d8f7c16b51e7b609c" + }, + { + "tcId": 411, + "dkm": "c522ebf9b5a841ede033f071dcb953a1d4e445672ad77992719ab74ee92a31ae65f8b95b962b4f9745b38a674472173b1c9a9883e5f7e5ef06a4fc18933c117364ec8772f5ebde178c5d7dae7f08f71fb1fa64021a2832222e590003c4042e82703b2dcc1be0be8db63bdb9c278f71426ac41efcd9d0f18edd4f0cf5cd138a20" + }, + { + "tcId": 412, + "dkm": "15074902c4711bd60908d1bad666129fae8955b3ee5e9452a65a52cb4ad2053263665e6f74cf9a7abeaa58a00afcdd9a85eef75f02f86d4bf41695dc67afd047b6a242d01d834a0d7de5e4861e410c5ecfa77662a6d916cb7e7074ede5873f345344f3e88303b0969fc71b8f52e5786e7964837b269b07b31a62fd6808c7668e" + }, + { + "tcId": 413, + "dkm": "890e3cc6a8a567aa6044072e4bca97b765f8f6d62066286da13789c80efe5534218ced4a1ae716f43ab8ee6786ca8b5e28782bd54719272f3ff68878dc245cfba55206815649201e932e3e9d9b152119eece4135cfd509823a142a899291ec3ba97d5894224571f9607aff27082285e97e86fa7ce7044c1cb997565d2b7793f9" + }, + { + "tcId": 414, + "dkm": "a1a4146331592a535cbc1fa28177fe9269bfb980f67380d6c5df5bad06f7949ad8b3151b4fa66d66c85c208cd827b61646f4252a993f27461aba406eb0376b73a3983d70769fb9542751a5d0b838ca5857d549f1153858198da0a91886a8d3eb17e24f056bfa0c762bb17dbde36069eddd0d76f01c15a5020ab0d2356ce604ae" + }, + { + "tcId": 415, + "dkm": "4b738bf53d98d576e25162463b9a11c9a2bd0a2f658be1f477cf4232404c31ed130f692c9520440e78d471f11c2c2986b0e5ffeb3f4a9c2f3ec2c7698e62745545666cf4f19d065dd5d2b138c0ae724d01834aec023e2834740200fc63ef824cb88e0a86c2415588e33787c1411834f7ef713549feb6626a1e60b00545988670" + }, + { + "tcId": 416, + "dkm": "edd5d5cebb8f017bbc2ed4efc2155420af5cde87b6f87082f868ceaa733e4fd26b23b03673d8de83112dd654b35e0d9bd99b8030b5caac2aee740eeb1e0143a4003aefabf620e1774e57ca183584307ecec5b3b4a386888ae0d738146e821709116a4b2b071321c6480599824d760c0f2832358393c1a061973d1e3630ad954b" + }, + { + "tcId": 417, + "dkm": "32a350d9adcd039e4eb9564a98d20dce40bebc1ea1815b0550e778912f24f714e30f9cc290cc6b4e219ccbb017319373050630dc77c5e43ff8e1ae97a93424f2b08635e664e10e15f70b9227de731ab7558a4eb243400c101cdee0d3f4d41ccac56d921f807e22fc9f2086460237e63bd0616624333866cc3b34ebddb07f109f" + }, + { + "tcId": 418, + "dkm": "89b01817c40067c0b73bb020e6e82272499d86c5426c5dea3459a0869094ce1a4dbf1db1cd182c36419716ff97f9fab7fcf87ad36df7470c69dc793a8f1b4ef46a8fde0553969a7ada63d99556acda2553659fd9d376f433aa566a58a4ad902b921b909ddb0a9417f7dbceeacde8d27e4396f15bc283096b454f17fbc23eec7e" + }, + { + "tcId": 419, + "dkm": "1168f18c42076456842bb2cb12839855e598b8c3097a7c7b91d30c48d1b0e53defa71f3e5fd037f6466b15e38f37b3d5dfad81275da27e8476c4d32c01190753501311d6d0137d28092f75bf586d499ae5fa3da01b93d3aa1db77d80a6710994c79b99c9fc52f85b49163a1e59a494ec3129526fee3db3a593211091d7f34897" + }, + { + "tcId": 420, + "dkm": "081f76564694ca8100a9021972d268b40b28226a6d691054e59c8c59d50a7d4b7cf5a6fa3af982814edde23f60bfd8d7ea1ce1bc779a7937b151e5c64bbe1b69c72e6fe48aa2870e4cd6b908489954bbb683eadb087b75060f22ec8cc96942a8f62064bbdd2069f462a0a1bfb915d92443de2cc5762b2c84e76e7dd27e4af321" + }, + { + "tcId": 421, + "dkm": "5e43c838d06e8c69225c1b84074d59ba61ee14e2a0a262cd060c177aba639cb0de767f0103c313e41a20eeda1b3c50ab718084f7ee4b55a7d88cde1007cc8de0a42b41477ca203f0dad7ab78ee9cc67ee89aa928f17cd6a6791032b9a00220d31ec0281e19d671d974b4f0149683cab61601b3c051d0b439842b0b7709389740" + }, + { + "tcId": 422, + "dkm": "dd58624c7e06068854624f24be16cde61df5f4ac8161d58c406549d002f8820a05a7e467abbd7d91757d143d2821258b48af8d02046f2d8c7ecf4bf1f59f44e706a74c5baab95adf65a6fa4e5b57b353911344bfb7ab925bcdbd3f9818a51f628bfafbd0155093051e4227c7ce11d10a72fb18635b1379f77cdd33c98ccdf725" + }, + { + "tcId": 423, + "dkm": "815eef53b9838f60bb19ee06a3b3d340e58fe360293421106f7b80bab8e7413322b5a6f457b0119abfa4b59910956d02019f83ab8c4fe661ae78e825db7bf6db9b622706e9ae3888ea7e4eaa3b5786f9fbcabf43fc64c10244fc6d333bee8c0cecb4bcd425c24f1ec05ce665dab4e991b4c7ed6ff6b897eaabc9f7cd2b87defa" + }, + { + "tcId": 424, + "dkm": "6c73a2482a7a96569968acccc261c50b1213755eec1106d4046297c0a99a395a04c9fb247e424f7201d3468558a0252f8e1c2f0f55f78623ee4b47cce2fd34fb0e9da2c6cdbcaf7f00b749f88abd5c3990ee90d299d28b5f1c1658391f5df5a12256ba1421e54abe149f30b8a03ef19f1b2e53eab4659b30f5e2804425690d47" + }, + { + "tcId": 425, + "dkm": "0335ddc7efeeda8be6f03c7c814a2e62c57ac9c37597b249122c036c7e978035d69fbe28bb125c6e8bb2d0706b67548049c9ad6288ab01bb40ab8321f9937f21c284a8222e77eeb3a24a791fc1320df5cc667a5b5d14fe455ddaba0e84e44a83693975a9b31fa8bd1fdd43a3e767f54f0dd49579c01fe012e6955f1d2d5139c9" + } + ] + }, + { + "tgId": 18, + "tests": [ + { + "tcId": 426, + "dkm": "94e50844462924fd0c9e545d777be5306f3ceb8966df34351b0d674d994bb9dcb4448a9536586a183bddbf83681442648f866ea3f5208d29a1296e811967cb95352c432185d3556028fdad9da81e04fb5c8f3523b42aa52dc8bff1368df3325b81dc16c6a0746bc3d137723b573e694171315c9a7d1b2ea602d3c0e162f74783" + }, + { + "tcId": 427, + "dkm": "ed0153398684c103ff13f162da7ead997702eb593f785ef86149358f52b9d940f61dfb69326ec2472d7e2e2d9fc7ef9cd6d4d7970d7d7d2ae70a7c1d9320ec91fcfbc9db79212fc85c702585852231631b7ac7d0c04da874ca6b02dd5fc769538f2d2171cfaedc6f78d7d4c0e726268ffc4f0bb5b847ddfb87a3e16360ad67dd" + }, + { + "tcId": 428, + "dkm": "dbb69369ec0c14a16330160adeae7dc224cfb408661b3b7ab6e3d4a3043d095628430da1868754f069371d48c89c1e30bccb3a85982bb0240379e816bfdee42cefd3791b73bac06886d391c0ee5088ea754cd148a1e9437d685c678efa0d4dec8ee6c33c2b0802489f644dbdfa8f45b1224444d466b840a3b1f33c4a2c50e761" + }, + { + "tcId": 429, + "dkm": "d405699513ca951dca428de79fbfc7fe5aedb5a940ac53718281b66cfb24c58bb18a575a9e81ec0b39c8b68c7451559eb009408b5b620a063c22f1cde371a2fbd4d412037f85caa3a7f94b3c3fe442ec949c4d8fcae18a63dca20717eee89a0b44389fabde2fa2bd2771577925f43154fb3f0698849fa4d6786c947f859bde9c" + }, + { + "tcId": 430, + "dkm": "70d6e7f68a71a9b6bf79fc4fc4858369a7075acca96db007289be5a8a2be4820bb83f5470461cebf60b7d8b94becc85b11a76f5aab86dbd2cdc1c269ad2d186c0b15da8b561ba660d1ca678252d4432d8f2b5a3eefdd25c7d0cd59279d0c50709328bacf5e41531a7d4c4462103af6db78c8a5a843a74e561f1e3b59e9a3eae3" + }, + { + "tcId": 431, + "dkm": "29f90ad577c7ea004d829f432c01801b0d9a0abdd5d8e6cb6b958c8c4b27b792a40f8854c6c6338fb99b246693e39a1ccd54971c092439845fb2e9055ffe6c235c2c1ccf0ebdfbe6821b31f5a0f2bbdd621a2c63ce998ac3b39527d80e4942244f02db142477f2a1455fe3a6b7f19c41f60799f13f07fa4aafc920bfc12bf778" + }, + { + "tcId": 432, + "dkm": "a8efcdac2008e3746cc641f6b6018321fcf4b3c21059022c5384088d8af6ede7f0fd230e2134669bff2360b53b0aeaf71494e13c3601208ce14353f17c6773ff4b67865fdfed51d8ea22ef75f5cb0c613d5828a6b1feb711934ee90bf93f20569bafb7a8e8ac56f3f179160d2437cbbee1b62717a3b7ae4d19a4493ab0fb41ed" + }, + { + "tcId": 433, + "dkm": "4788765aa8db9d3422437fa0d110b6a9fe0cab4e420abffbb38b98ad8b53e3c5181cc67b329bf1d5338564e5704be28f35c22e2663111dbf7df932db8ed06c4c4f3bff30b8bf91a5feb8ca7002098360ee407c5f6c34e625c9131970e50e6c74e5c29c679d1ddeaa60b0f96f89c58f725486a0535cb75621fc2a48ca24d503cc" + }, + { + "tcId": 434, + "dkm": "45c28e24e3fb66498e4d3e2ceebbd1afd84fa4e95ce8b083d0d5f47ed0085927bcfb19207f890deb50eb40504453ecae47beddc08ae775afb034f2e40f972b22cb6976aeecf86a22d6ad4a7799d061647a5eeab148dff39bdc53989186bb22ebc986a0d0b9a12f5795e4a27993ae99c229f06308f64cc5ca9e94b580993ceb89" + }, + { + "tcId": 435, + "dkm": "7b81d1b0c51ee68ec74ef373577bde689fb3b710218aa2739f194a1e78138325b8704ac9948853b085ffe4661bcdce042f58f1ed59da0d199f690bd85613f6dcbf25ca88548d6f717b04a7a0ca8d4004dfcab8b49be71cd4722b27aed6b17c49ed3a4bf650405b072e5436fcfaf31b825c547b208a968d193974405c493a0939" + }, + { + "tcId": 436, + "dkm": "702b83d9936ccd13bdb74e3bae7d16a7d849626737e01ddb38f2396ef243e88986e9514040ec0bd8e47d1f468d94e0ca902fe603816f97e4355e05f90d0483d9286b6f56445f1e8cc2454b5a9dd25928b0052068f318265277c405f7b5912d470dd5947fc270600dc1dc6321471ada8d3136729c78a029e407669692e5990d7a" + }, + { + "tcId": 437, + "dkm": "917fbbf9a7747ca11a322deca4589b5fd10a5cb9566fd35ad282f47e86d293f63e038cb5df49643bfafb38704abd3551a3f4a1ae1f70905a41bd5355a9831842c1b4ec91052b47e50546e45c2b9f906577eb5a17aa96464019c00b0e6b2235e2b19e60d165880e25f8cf44afb6be93aeac6835302bcb9938b7db3fdd0ee9fcc0" + }, + { + "tcId": 438, + "dkm": "04648a047a0c32f91480e569cade0181c74e0251c0ed01baa04df4191706f94a6b2b7bb858a46041b2bc5cb6591ac42daa896c8753e3c8f903be97c3b651e55adad06633f3f38573947049adb64482becc21e67d391ab6a18079686f2ccfd5636354c46bb9dbad9b3cbb51fdd9b14a88f6309b0c6a11ad753f86b51c9b9b0448" + }, + { + "tcId": 439, + "dkm": "517b0c505dabf25e319525082cca2c25c6c5a53556daaf62d583090020d394eb2f28f77fca74fc4344db092e356ca57b9acbc905b5d6869e82e59d0ebcb4c87b4ace67bc9ec81adad6e289fc54cb98e16df67cfcd99df34e237fa465602fe55d433773ef828700a7e635c7f54ee2ad9bc84d2068a026aa041b7be95d9f82a6da" + }, + { + "tcId": 440, + "dkm": "fc619f660dc18cc286d86094ff073c644ccb2a7381639ba1c594a144a4ac777bfdebd1932bd38997e07bfc0aecb8a48fbb76d836682fa3d723a502f7bee3a059ac721aa89c4aa084938a339e724b29200531356c112f360f0cea62f417a8813749ee3f399b4d9364b8337995360f5da28575112c3d5bac42c8aaf94b79ef45e9" + }, + { + "tcId": 441, + "dkm": "ca1a42de24f3b8c7626bc13c9331ade5dc8bae617b96826a10fd4e99b3feac6c49e7550dec4a6cba96e4cbebdb99743e09ede76b09ec162a27667195f3faee8ce6d84f25da0190fca4512bb163cc20aef2ae87a9415d26ff740301b163c0fffcd3f606fce2c77722190a75b26c91821b49abd3e3cba6b78445aab61b19d6cb4f" + }, + { + "tcId": 442, + "dkm": "b85ceed26db9fda94c6f95fc931bcc9bceb0c2c9fceeba80cdd2f32d1e49fac0fe64d5ebd9b1d9864bea174c00959d9a86095f087a4a416b2d82d37b2f80433f0cfe2f010611c57bc7fbb8057a49551a911859b02a9fe10a28c9d1d2565daf9cb2bfc4fc340bfd47891a0e4dc4a8fe94a1b5e0bbc16aed89aba672a0638ef42b" + }, + { + "tcId": 443, + "dkm": "a688d00371d2edea4b7c4ce5831ea6a41eb93f1ce4ef14259008185ffddd54b787663c4b3039aac575c0d26ae6a8b53d8d27ff3dcfc21e725dc02c3b4b8dbaee71dcd8588726a7f1a7aaf1eb517a26b98596040b75d76eae2be285d303b7eb19e1c95480dbc717d707af5ea654a2342a22c02dab8d6c482840816c6a9097851f" + }, + { + "tcId": 444, + "dkm": "93e211462456bd9b03cea3a2b35d7a48d1009b32cc0f5685cf3941f2b313b3b383f88b981d409044ff8337bdb7389e345a18d0f18809d883b5ea25f1206aaf21a76f3f20ba858751a3c62c133d30eb39c087087bf0f3f38cf272e1631aa8f01c135c2f2cd745bd3a36bdadfd4f2fccca5b214f7a5e5e2c515722aa7639f64ca9" + }, + { + "tcId": 445, + "dkm": "4363a4de57141a0ee0a5395b8c53dec78cf1d3fd3deca628b573b31da4892f6ae415cf29be9a24b280308100d2c4122b96ae553accc4f7d52f4f3c2e724b0a96574ca90fb146edf40f323ac0387f3caaeace0322e9c8a45bc46d39c5fee2e9e7fd23861e75cbac41bea4d6e00d11f8810251489d04db718218f1b2419c169af8" + }, + { + "tcId": 446, + "dkm": "bc44eaa4f7f7046bce75cdc98b5a9a75b18a4c05c3da1782f475a3c04aa28fa9cc3a982a11c08afda72d660d784a22ad4117ef95cd8f74080a89d148c217fdeaab3e9378b8c48c9796aa0f94b084aaaee8b6bd3afdab07d5ede2070f27cdfb57f2e3b29736e525900191a694ffac591a8fdaf2c59446a280abb9d04d04ca126a" + }, + { + "tcId": 447, + "dkm": "a0fbac31b8335561a0ce483f5a39c76afeb16bd1f1975ec389b137b888dde400c412a59c80e232a1c9a8b14e3bc9b3b35d4bafac71d473b3a69e7e669ad7fb7756b1754c5eb22bf3781e7e9908b76e2724b367443925d60d67febdf41ee941656a7fd15eaafb33eab9e92340fb9d41f14b28f4ecc26611b64bcb706e622ef32c" + }, + { + "tcId": 448, + "dkm": "0747212b22632638f936a521c3a37c626378195514b5a2b96818ad662a8614d8c365db5a9bc4135f5bf90345fed62165164e270aa04e1dc7cc01e6fb610ee6d7278f9a5831cef3c4bf5e824914441953f55c26f7804b724db0644aa4ae59fcd941135dcfbd455e4bf72edd0e157814cf8af5aeff54a3b999ad76c44556e93b92" + }, + { + "tcId": 449, + "dkm": "5b417d32ab4686624c8973fb33a43d1997e078db73fb18b102ea9b6cc7fe582ab01c0638bd6f59128f06881feb7ee9556a692b10648e0d37cff7fedec3b471515584371fe917fd5a48867da2aec59f0e9484ea66c0c4c89115a2237e33825d13fd26de2ce7848653d616b44cf759d6b7a2b2b5678603d7f63cd7fd34680cda13" + }, + { + "tcId": 450, + "dkm": "e02036341776cf246c802735c5f603478c2dd931665c90f7c06b627fcb8ddc78d359ddbd129c969b6b29c57291b2577ddf495502c819a9b000527cc50a9d51d2cd20d485c6ac6849663a5ab1b873d61cd8754e7244733510794ccdc182336b397e74ec8116e841fbd3b6f82a4c84d59f7f8a556ef5383d5450d3c04112235a83" + } + ] + }, + { + "tgId": 19, + "tests": [ + { + "tcId": 451, + "dkm": "45baa30978ed3940af7fbabf66faf629712e26b0a49b6ab46552a75f7c6bd2ae2610abd07f77ee113424bc52bfac6325b2c96d02482ed5464d6d9f640b17095f566d21d1dbcd79b61ab89cf0626bececdce870f4ee82d736afb504a67e4e3670da88ae7af39231f190c1712af651dcfaac6108f4ca2373ec15377024ab1d3338" + }, + { + "tcId": 452, + "dkm": "3316682f227f34024ae332fcb7ac050741692b1d6f7c322cead3a5f9ce549d9b22fcb96a793f5fdcc7065be2d764b9903cf0d919dd86fd988e0cbc565176e900ff05ee33daf7dd7e877f1bcf6c2f427b7d707a16c0fc7740d720979b48d05d3c6636732f7d90faabe5b0f7aebd7ddfb6bf526ba8af0128af2540c4b90d678a1f" + }, + { + "tcId": 453, + "dkm": "1acbb26c3490e865fae147e8cc3247d46786bcf3881b9fc0cf973677dfb7c58ff169a9d465d2092fefd3064e41d75f43edc6dc4beb969cefcc62cb2591f6e6f629952139de488d0498b3d8eecf8cf5d2ea8048158037645c4fcd2afadc155cb66845dfd214fecb1f5d1d6db05142f87b73953916f77ea77f55a3b0e7f641c2c9" + }, + { + "tcId": 454, + "dkm": "8e46c0dfa750fab543065dd63960c3f78a47e55e5619d944c75b255bbf89c63791a56f5e2c5eb018462bcd05f857682e2f5bab79514eb66e93e7156c99c64ef1bc901796bd1d3793ee4bf6ded3d475119945cc47359c5666745e42348cf34a31b7f2e9c9855bfefedd4bec3eddaa6a0a1f389645d673edb2b4ff23cb04ff55cf" + }, + { + "tcId": 455, + "dkm": "545b06e7ce2e1bdd5a92aed634d3f65cfa87b1194a9b07a4bb8e4da78ecfb2ac94214cab3db44015f2baa4ab794d5654a2783041349a95fab8804c041fa06a7603b0284ba1831be8dcdfec3bb07884c9001c6454002f421b82322d392733ef71c87e37ac349d0ab5218a449d4dd71a382889d15d7a04e5067e21ea8ac728030c" + }, + { + "tcId": 456, + "dkm": "d15061e4f22a03a2427e446625a8a57fe6d9cda0cc1f30964e6d43898fe12f1d0a6c934e32cb0dd6f63c39688cb73c76d8818449f6e67e75a4d0ad17924c734958171e64b48280ad5a4a2190e23dac3a4acbc6e736cd61be85a68b0679fd9b35ec8775872cec91823fc8c98976374607a0420ba517a0867147413ac500e1cba4" + }, + { + "tcId": 457, + "dkm": "20ef523c5d0ee08a94d1ae0e0f9e34448fe46c76bc12f5fde1d50e80d4507c2c10dfe61a7c602546f0bad5c081a5bb0bca7a0faaf512bbd3916f25ecd0c9c056bac6f077050cc3337bc471e359f74e3d395cad4f35dc57f8e198faac565d131bab39ed4274ee08e5ba2b5374f5817c3ba9535bbafbddf54be1bef3526a072eaf" + }, + { + "tcId": 458, + "dkm": "b987a6544c9b86709af07ccec544204bdf4f6ab2386b1c74a91606117aff710f9e632337e6fd78d78f853c745bf2aa95a498bdbe24be8cd87cf41a65c9aae2898b100a5329b803cb6ca64d412e9b0aed92b6483d00168533c151618edd55c9f23f9d92e48017b3fabf11bb9d90328d5626609e4cc43b8e73c2e0e0b4b47b24f3" + }, + { + "tcId": 459, + "dkm": "6a970bb130f8c10e52485c5d70b906cdc98fdebe9bada48d0ad92b161973f53070314582ee2e338137027374d3c631acd8fc512d1c602e210f8636aa3802caddfa32dc4237062577409ad392651be8200ea6a2520fd2aaf73782504d3129ac480480d9557625ed54a875e438c7362ba4425383a4122ce70d820df10897cdb67d" + }, + { + "tcId": 460, + "dkm": "5352d8a2f31b0ed81d9d214f8ce14024d276a170219f600568aba267226bcd33f2aaf63f59aaff07868536a47d7b5bdcaa86c9791e75d037244dcbf98859e12048133be769fb51a34fb4b463be5b36cdaad310c6319a8a1d8c2fbbc492acee1d4f45e7da492783dee8d8a2de806bae4aa63418b801ffbcc3197a2b3c6e41ad7a" + }, + { + "tcId": 461, + "dkm": "765e8167e2c68e2694b51581aa574db4115e13950debd270c2bf20cebd4d25fe384af415555620f3b406f46d6488fbf3852dd1f21f94520c6522e463d795916ae498671162e3a8dd6529ac0c523c64926122c2d700a58867f7eb0e4358b10687f1b036bec1b9b943bc1f6db54620d07b78eecf356a7c943885bff4bdc3739cbd" + }, + { + "tcId": 462, + "dkm": "875c8cf8d74e42c31b3143491b3e75d39b3f689f890100cd810a03349752a2febf334d8ca7cb85d3b45338e86956a92352ef092afb03d33477f2f06e2387433a7840f81efe2d80f77f9885f4a4426f2b4a280574a9b0dd4015e71b9650961ef766ebe21e16e1f4450b2ad480438f0f0fdbdf989ea07379e86fc86ed77baa7182" + }, + { + "tcId": 463, + "dkm": "96c257dea515037bf1fdafb5d616bedc7fea040ff95fb3cbd62ad7f174c50d04470a7cdc0ef2da81af6f8f2c0d9beaf6c671648f65c300a064a08d7e6cfa52122f02bdcf1c78c9432d1ca735e62a14f7d37bdaa1d860016bda27e32b303447a880ae0c881f9782ec07479c24cfdcf56ec66e5f50f6de8ca2bc9aaae52c1c73fa" + }, + { + "tcId": 464, + "dkm": "68bcfc3699047f174193427b711b218ee55cc1acceac1f28c8963dfc4b8f688d1f1ebb7099775351d65b2be431646526991d50663619eba61a84a0a6cb210de0ebcf86feebdd56d50c656f4f684614574dc7b02d8207bbef7f51db187edb51b984e057e0a7b714010629d78f8dbd2c25a0cf3d768bc748c835e5768e0c6f95e1" + }, + { + "tcId": 465, + "dkm": "8c16a522902b7920a3c74022bbfff3b3d2f59305aa04612599d51c2babbf124e52af8ae6ec6d61a371b5f8c88fe128a608944037a483e18455cbcde4afdfe74218d7911aa8830703f681fff082d2f93714bf84483db16374c9b25df543b3d507ac2280a57b148642041de2dc587411b11b356405dac5062597aa5ee63024e8ee" + }, + { + "tcId": 466, + "dkm": "c8c97ae8fb896a27f65a707c08669e82d25bfd1c3125005af7b5673f970fc516b284b4c3134c2bc267cb0f0500a7dae499892c9a40890f30868b630757b7270888364d36b457a43da212b74dcccb68d82a78134cf90e9cc4aa8686a60dbaf0b1d5b8bc2f6fc1c646febfe3cb71190ef4d35a1dbf83386921a0f891617516d29c" + }, + { + "tcId": 467, + "dkm": "0b1016e6ee695ed272d3504551ac091b6e8aba222ea68948f8f2aff4c838d147810ceb10cc299b77b6971c204da2e02e21d4f11f1c6962a0e5a646b520696f53e5fde5a6f1c5fd6c4ab0d042a07655e0f98c76561e1d2fdb85e734e1335a148add25d76eb80121f1f23d0750dc5e032795899b7b871e8f64c5e7a7d7567dfb14" + }, + { + "tcId": 468, + "dkm": "55e8a7f14bd610f18b29fb8ce81361dcbe4aa35de85e11d64a632afb2e69c22d18bbaf0bcb0a5cf40d6a7161fa391721b9e3c57321377ef116dd88e5f53d6f8d6a248c78c190111f5d61fcfb6fa19950a2f09ccb60057c36e4412467a758743c04a031530a8cc9db09ae034d74125766f35c283732de14652163b2bf76b69c9f" + }, + { + "tcId": 469, + "dkm": "6d351db94332aeaa8f0d138d0cf36dc638ffe1be55f98f3cc2596a63d849572465c5758ca2f3cdb37d348b5e7f733987c3eb28f84fbcc3302a0c3dd5ed453e759620963b44b2d6f97c85a6efe066965494899c1902714655aea0117728a42913e8dd80d4ed23f4161a8a32bd25dadb7732e79534e08ad863e101ac9640a16007" + }, + { + "tcId": 470, + "dkm": "aa60be9ba80326db4d19729b2505c853f1bd5f5b7511685ae671f8403ed4678e9c5e903cdd25e5e2f1b13c4c506666d2fcda4506ca56d9fd607a3e4173a90aba4bc08a72d60c4b5db9c6270a60a82a3ecfe5fc12c8f59315a590d569646796aaaf05e309f276334ef9a96a039ff4b4ceb10d8055cbff5fac125c388ccdde3b38" + }, + { + "tcId": 471, + "dkm": "7fd7099df0f9414e51a07358a0b2f820373c55949579b7d5997fdcda7126038cc8fac881a8d5d97e0b386df755719eb3c4c0bcc78133049e98b5c9a96607a015924dfb41341fe28486d01269a885a2ecb6e66a99fe15818ab53bc9be47105fb376c41794885594e59a4e34f438137bc991d9b917c26313f6e601ec7ef1eb096e" + }, + { + "tcId": 472, + "dkm": "6ac6e6ed6f8ec041e8466b3f26dfec22c9dd6c9757a519c0344167947ca6a491318a5afa743368e720b7d71abf7e3fb48b65b7e7dd8dca227341282388f7350afca276c1b9f80de35785f37d8228c14061a70d4c93990d67ab79509bd6adb1ea27d73237d8a5d5782ff2899430119eacf52677f3363b0fbfe620b1bc8703298b" + }, + { + "tcId": 473, + "dkm": "6b1ba2dbdf47adc5e46b157b624f6a08e1e6125b8a59b7b5adc2b83f1ce2911bc305eae401c6840d2e3c0cf3fe7f004973346bfcc5ff2282a0d7737a67e24b742d34ef9ea2d32c3cf527af0e513907147c60706620a8ce7b658ddc985c99e522c05bc4b3474fda52c8353e893f76534d4345b7ae29641b066d071accd6c5c2b9" + }, + { + "tcId": 474, + "dkm": "96b9ae1de29e8794d53217a12c28e674c668ae6936100cad6edad2badd53de4e908ccf4f731c18357d8e2c5ab7f4f6d9c172686a884fa64a82c278229736f9966b86922f0ed798f56a908c1839999d733d66648fb4f20799c78e484a8bb1c56c70500b86b40573f562a68a325f02b6dc9fc6e85d876cba8ef97507ec686f7779" + }, + { + "tcId": 475, + "dkm": "2a9f1fcfed88ad552436bc7778eb3fea8b27a9bd2263ce01a0141dbd2b64f3c3a5450ace7b5e0c82aeb37cd8d1f4a035f0206f7d368513871ce4f910b5dd9cd263d20e074b10506c62534575de40f8121184d8fe6843bdcef0db8fa51650ee585991e376dd944e5ea0279fa8f5ce31833aec0952d8490a3a9858d6a0f1d6876c" + } + ] + }, + { + "tgId": 20, + "tests": [ + { + "tcId": 476, + "dkm": "1927659e40142a0fad6a3fce310622d99445603978c3c1921d3231043fc5e386428b90709991512840d3d491a64b8dcf2a8193b5d3f1ae15ea8ba1fdc11b544811e19acae5d47ba3fd563ee8c6efe34ddd7d12d1bb234baa518386924f38a28714df6c02bd08c88c902b15d9f1fb95fa0fae75e04dced83bdf6eb3e19584b7f9" + }, + { + "tcId": 477, + "dkm": "d517e30d9c62c9d1e8b4ad28385050f80280d16014c47a1ea8acc2a44011190f068371e2717570f069a41ca517994b9330a44594f1854f4d853516a225d287f9d80af32b3752e2365d510f45b82263c32b930177185cd188e71cec7568362b6209d66e0b0e3fe6a2c9ec210142533759c805f3ddbb988f3a34e3f560e4642d01" + }, + { + "tcId": 478, + "dkm": "5c3f8d9c2c4128550f19fca7f76a3c69ab8991136a2caecdd90f41f60dd00d48e0c7d3ac55f6231623f05dbf129c46a45c9a9f5070115a13e4906bff2aecbb853c4b7905a5196352144e0b6ec7b8490d8d60f1c88cfee6785559960af00c488aa4fdbd4817a1ddd1f489fde987d49693f290611e829d2da8aa80db5941c43caf" + }, + { + "tcId": 479, + "dkm": "359e9cf0c1cf58262ef5c3964cad955110179538b6e3837125e81403b84bb078a26e10c69e6389ca94cf26ba448f56a890bb6567e1eae06f219a40662a54b6fca646ff890c45615b2b815fcb7b2bd98e118e341ab191b28a9e568e5405b09acba1ac9dc741e74bf279267399e3893699e676ff77f34b933855ee110b1d64546d" + }, + { + "tcId": 480, + "dkm": "fa83a9302d6fa6f092f417bbd72260733df1209a465c96d579feea99a55f3ba2e7682994f4cceff2eae348de5155e40a10c6743d766794200aceb2b59d3b6e2516bef6eee046ddf2b65251edd376e504646873bf8d64d7988e734698e6ea8b86868c8075dc8d10f72032f89a9493475e38885dd5d28c49ddda94fb526e5f4557" + }, + { + "tcId": 481, + "dkm": "5dc13b877a459a68105ee49d3c59d2da445c81ddbb030e303cfcea5f210ad40dfeffcd350cad5ad4ef345833a2b49bbad7520f09c3abc47c6dea6ac5ee6e15efd50db65ab602eb543d92dd96efa60808aa81fea0b88f35839bd4fbfd033309f8dd5caea9e470c037a592501909a61359126d287b176885158f20efb6c0a91b61" + }, + { + "tcId": 482, + "dkm": "f300e1ea7be7c4ca9b0785d0b130f8dd35a5e8d9b2f3088dde0c4e86cdba4de05ce125a1b4e349b85e269925c658d18749a1fda1ebd466ba57ccbf214af4cb44cae55bb273cf59545b2bf39484f8e6719445860ece70f3a53bfa7fd8955b1bd9b4938f9a9400dad4877c48a72d09505d4b3b017f3bedb9b5298c1c42a5bd375c" + }, + { + "tcId": 483, + "dkm": "43868d884786d044434546c67aff91ff433cd453e09b10ab6344b1fc35d2f3f4f709947d3cca5673b622ef16a2cfbdce25e207620c49026be62e34ab45c42914c42c6704f1b02eff4e4fbc8a669a8ddc7ee41d832e9ff58a102f0535e8070c83f43afdfbb22fbebdbf438e75da3160ad075b2ee2b1f44c2589055b630db79069" + }, + { + "tcId": 484, + "dkm": "617d819700b08b718fe8d81b6b98e3539a73891d330852f1800fd7eca01bb87972dbf09e9ddb6d6b9df7736a578982980505ad19c392b6cd86f59a8050c68eb26699a7b7cfe988464ea78ef7ec2646e7bceca527546d19595ab5351b49abe7f862e7520132c0b139aab452c064fb65abc016cc28387a0a8b74646a4970d87be1" + }, + { + "tcId": 485, + "dkm": "6e9bf67e44142ea4bbc3f21ad5d7f65d6cebe00d18d928b097645d0eda19022442d0a08d4520a3927ec16097b25321f2d022f527c787ecec6a2378a2d8529471bd56ce28c770aaf095bbb7de6201083cc28e804560dbfd4b374069fcee7bbc40a424e645fb7c06c27f94ef23ff2601e221c6d77a9dc534712984cf4912e45717" + }, + { + "tcId": 486, + "dkm": "4378e1f97f3dc15f8594ed74eb229e58d0639a11e377edd7292d0a4ec10f3de4f156747522eb996f1604ff735d01360e78a0e2f10ca6d182855b87a6f578514a6e4578e563556cd1efb081a3539a97d4ba92ba93ada6f65ea33aa4ea44897b0047e35ae56153d17379da192f7a18b737c7eefa70dee374b40c623d62fd46949e" + }, + { + "tcId": 487, + "dkm": "8a0f146021a4d846b36ece79a811f857fecaa354a89ba0576b2e6d92d7e5ffb0382b948cf5bf87465b930bc576e286a5c2517a78f670e4490e2a6b691cc91f47f6906d20f8f1bd72fa637cbe69a3f85d4fc3a4aad96f6ff063038a9c18047dd180681f7c1c3c862d77ceaa804cf81ac935c0c54c5ee4631d8965e43ceae7ad9a" + }, + { + "tcId": 488, + "dkm": "fd5804fc54daaea1bfab02314679d5035cb62da88dfe186d5f497a42046c9244eaa84cfb4800d2ba9856e659ba91fe19e1b1eaa2350d820638b65e308bc1358d2e27914326a58adcb022040c503137cbcfec73dfa38ddf6b93fb2e3edcd234e59e2bf59f427322aa6385c1862a46e6ef1b654bdf09c090b22b3942466a1da720" + }, + { + "tcId": 489, + "dkm": "22e64737b63dbfd46ea12346b3d1541582e66653e5e399b1528414664917728dff48e41f4f5f8183625c9ac4132c4cabb0b2a13b9b1bf9a8d8da54b86f204a6d723c7ef67573399c72994054cf22aeb5a70ab1ad54da5d83a37b93e120633400804b8e2a3e2483def8c08510fe984cdb4c6cdc02d9a82f4e290b67747be8c473" + }, + { + "tcId": 490, + "dkm": "208c05b40bdd06237c322b46de037860957960e9a3c2e35b264c3d342169ff23aa0346eb4fb28597b0151fb3aa2a03afec5c02bdc98dec92ab021f5441a21600fac8171a82b425b2807f5451603eb8489bd2e1e304989799ff3b41dfdc0c9fb4376f3c21d2082e6361543ac287f859979f2be64d5ab2b27c572a89b643bac17f" + }, + { + "tcId": 491, + "dkm": "226fb241b3bd5632f0eae5efbd91537e86f6aca3d561487766fca48c194a09630e3d823d4bf79ce9d5c573337fec9f57100f0b4c0f50f6e36e1f43b42a8045b4e0f0c662fa1fa59e5e500069a3150b8964c3fd4652c48de033665af91a3e80bd74bd3c8288574efa9435c16d5edc6ac099d4b1e797d77ef8b470d7f0fe23db19" + }, + { + "tcId": 492, + "dkm": "52a6889c893e6df8d62cb8fe3bcfee858bf851527fe64e2c0551d90fa9ea421af1db9a1931c10a0bbfb62b72acb7e48ab30b36e1f597d37b6c8d22fe89872a975731fcfa53265c0093478aa58fff9ac35ea1d44c8c3eaf1dd8f6ce06546f9464b843a470c4e849f41cc6de23b4f1ef5662438b0fa70e446178d8ab626ba063c4" + }, + { + "tcId": 493, + "dkm": "3a44fcd1e00d4cdb2c11bb4ef4e8389f903164a10242bd0cc040a73853dedbcaf04e47c74724418d55f98815ffb05031c316f0b12c940a690abc1b3cf65869abeef98a8f2db7bbff5412982a6d7eef5454e27ca1b58c71dfa2fda2fded41335ef581839f8045628388466b920adc353ddcea6b18df3c3f6833b6c349d60ee037" + }, + { + "tcId": 494, + "dkm": "1b3bce90032a8e22ed5858fc06f559b966958097a5570972f068c91b4fce206f3bf8b189cd37cf329367e2ad7dccf8d7cdaa5e13e41f7dd97d57fafe6b6f4122b727c27df0a57d53617fee511828822363cf385a1b9b91c21ea7574119d478e24dd310eda9f4cdc08f70c615327085cefee968762ef3d404082f15f7d97cd848" + }, + { + "tcId": 495, + "dkm": "6a04f9f2d0a7fa34993c726220afb75db6ca003eacf810a78124dc4f15c30d2199b5c4eec0f579dc4c52ce5bff48db36afceb7b6cfe4fb7689b7454a96a1cf395f9415f97c753655b82c8b84ea15b8fb1cba73a05fbb4fb841cf6712df0c1962fedad9345d977f844e195cae1ae3468872b4380de28bf090c67b3b643b9a34ea" + }, + { + "tcId": 496, + "dkm": "926bf3abe6270cc05ac018ec8a001a96661249646d584a15e4e7a23cd0cb77c0c3e1e80db4e68e349cc9457df51c581438baf232cfab3054380f7d807b840e640874b8c079b038c000c55574bfff986f23fae9eca471b475e9a6e7704fb58409b512277fabc48dec5e588c0eeaebc758a5f4ea43859095291e702c43a85991b7" + }, + { + "tcId": 497, + "dkm": "6fd3e17f026caca81d07c201556e42b041bebef90fd5554c603babcbc0b0316c2a24cc8cdfcce7f1e926a6d10d3da90ebf285045ce7f7d58ade0ece0d769c190a1a6773ac8a96124eafaee8dc238fd92206d455674ff178b1911b5e70f0b5d93d0fe4f9cfa295e78de22dd9eb797518b58e9c9b3c173a0807e143e580988a7fe" + }, + { + "tcId": 498, + "dkm": "699972dda7b34f7b6436e5234841ae00818224c1232afb044afc529123c5d061d5bb09ad3c61ad827a6643c400df1cd1e8be7bfdba39f6dc4f3ed27c8aba989e6fe15a769e591144e12d7c3ffaca7b0eb2badc659117c38737e3f95aa57c0622e7fdedd6cc89f53d6eb76c0472ce9f5287a9cfb81f606064c48aed66e9933fbc" + }, + { + "tcId": 499, + "dkm": "ae08399b2eb7d6a8f2c9e4b67240dbc01e73fce180e1401d740476f690164024915fa482533228402e49c9571bdbb37b80e90d21cbf79f3480ece442eeb44a3068745a84ee805625271b3ae6625e5bee51b5af7aaa42459ab25c92536af8de41684ad5bc0811c7efae07970cd5ead39b16338b3485c3103617841aa28e9fa4df" + }, + { + "tcId": 500, + "dkm": "63f8c59a9f6b4a7ea4de6c6a4a28fb29c11880d7befa28e245f91c34474905ac7e0289a80536db89ea275de43f3bc28d562665209eca2be8b94ce838d619114c907b6db5f2d20eba6c1fc440050a2b9d91cf9955ffba18e37e4b3338f3aa7e1a5367701cfbccd049a445e1042c38e16df1fe7c52cb1a7c64e416a4943524c225" + } + ] + }, + { + "tgId": 21, + "tests": [ + { + "tcId": 501, + "dkm": "7d111352711fb3e7626805596843dc219da575651ad21e5c2259152305f38923affe61a43aa2a3653381b314a3f3431ca11917de8d1c2538eed63ee30f7ec5c95db9072a7a95cf26a3511feffbf0760be791627208b1149e6915929a38ec808a1dd02e43799783ea3ab61f6c431068482302f4c726c90e6f64440fac47754f1f" + }, + { + "tcId": 502, + "dkm": "1161999913cb46c9e961a170196a7a0171b924ba09a49728fb0d96377449e54b9449d1af72d42d0b6547f7fef8a9df4797867cc83591f89c3736a08d88aa8343ab61f2b1aa23ebcb70d0681dd0216ec9193622bfca45e3883029d0a5f0eae0218a6d648b40df30d244cd3d4a82065fb0f755738c92a2d3fce9ccb22220b91216" + }, + { + "tcId": 503, + "dkm": "e2107520ca5db05f5eba20edfdab215338fb1b1198c53d997e18df27f6602dee6a8d456189e62ab0d5c56ec73b3ab6496a5950e64916f7337a462f555b71bd2a73826650b570a7f90896b76297c88717f53229863914c3a6aa9025bd21cbb88920e9a81a2a5f30081836dfbc3df0727ce7a2296e918cb32243af0207613370c0" + }, + { + "tcId": 504, + "dkm": "66c4051e6b0ee5f505e37952c75946861120b5a6477b90c86364dec7c8a785a279092280572d5f2549e76e28680b2d724c68281ff59867b53ecb55853de015ee8d2da5f8920c463fc8ea66a8fa1bf8d10245054dd93f56959397e170c7082ab362893c6301329063df4d5f7e386c358a53a8c847ce74e2b5db2835080d2ef11b" + }, + { + "tcId": 505, + "dkm": "0dc44e3b0f261ac29e1b58cba0937595f9a782f140f29994d52190d4e50cf2a5c45e530f8185a2cb0cf2b1aea63f00d6588f38e58298aa4aaff6f5dd4ff352b9fd9b49f8ad485b24f5f018acd45f50ce2fd63ce5059ecf106a2fdc4b096d2fada37d648eae5e3ea569473533b1dac355dac711ab0cfa57d4c70f2d7878c210c4" + }, + { + "tcId": 506, + "dkm": "7a5eeb4390272c9f5ca8fb0c693f68a18126066c54f12e0b66974c2d9f29f15c9e00932cf6c1b1a6eb40f4162fe6fe4432255d69b6f90f2b688d334dd882bf1911a2ce002410ec81230e61d347c31ab5b1beadfda8665d2d45d55270eaabbeebda97acfdb5ecd7b3aa92f21b55bbae8e3ad9956a6323e935292f71ef456e5c41" + }, + { + "tcId": 507, + "dkm": "d899eea6868824d3ed35b4c830f3df26be9f5dc794053b46a89409994824e33a109aae09f6e17f2d33d1911ef6ddfe6358eca3c502d6d6ad28cc0f257ccd51b87ff89c06a7e828cb936797a5fafbaa5236c099316c4402aec465717b174c8b26a60ed98483d53a5fa8f4bd47707589f1436e6680a57e336cde848cc6185e0013" + }, + { + "tcId": 508, + "dkm": "c9f786184129c237fcf1d441ba1f8ce124d99019342588ff54613beb30eb27d9bfe3178d955e2376c6cb3ad38c346f2c0d9725a3b46a7e2feacfd6e6f30aef638418de8cadde956520ec317e702bc87c3cba8e74917f1ae2c7e76607a31bcda586d0e4c665f5a0afcbeb4e58ecfd423d8de06c668e29771cbabd64227e81a635" + }, + { + "tcId": 509, + "dkm": "36a63d79a05438bd72d989d870282132b52b8ba689e95fadbfa879530f51677da400dc3dadc9ad0de5340003fea768ee9eb23439eb01aa0e77be776210d1eb7ccd2827739712c05cadab2dde2e8651fad99ad0ff6529ab51f9f147e2d40e0cf46623eff08312e8ba6ce8efe08ad67cbd6a8ac68e219a7852d0e0f08d414a4c36" + }, + { + "tcId": 510, + "dkm": "9c53ddfcf265cfc6cd0eafc2e278c3a743d8082adea4cc4d52882dbf1a7dc1a071f8d97d39c34f6ceca9aa4c87a6a484e855563f3863e5992158a86256eb12d40273da5f2e1acd75707b86005699763489d519507a67599bf285fbd043f68505c5869ca535e96eea78b23e94747b626d778b0c0369f432f4f392194e132b4718" + }, + { + "tcId": 511, + "dkm": "559c3add881c7b758d724672fbf7a98066539f50966978192c7442d83b30f8ff541534a73ad5eeadfc92b18bd09aa316e74c7cca5666fca7e81487d6c37f5e13fb6823a52e30bec063ead89c39958b321d46713f8fd489351bd5dd68fac641b3ebbc2509a2bf5f9255f847135f6cf3b3612faf9c798207268d101e8913eb1e25" + }, + { + "tcId": 512, + "dkm": "08660827a5117e3e029650074b55139a1fe92fad1cbe93b7291f2e7c4cc12ca9f7c8abcbdf2bf19043326d3e65ea02394ae790d3daa278a76bde703866f7f75185b8ea23f1d4cb71c81977c3ffcfa12e1aa11ee7a087657690dbc0a39a7ec6b5cdf4b0cf188211a3917102d2a813cb163d33ff41299cce0daa0fc748467d648f" + }, + { + "tcId": 513, + "dkm": "a12b96d3d99265ba6254fa58a2b5c47370cf7dd2774e0f98d0c2faac6e3174de17715de96210f0c2c2e6b02cfe75fbff6aa71bd3fc53f1b6d8ea07111703052fdbdd12c80154913b309d936e52962874bca47597cfc62e09238d7444180211c41775e60e8be6cebc606df3b17fff5f4d03c18079942077abba7f6b1f5336429f" + }, + { + "tcId": 514, + "dkm": "44103a30386f494f584f385a2b692f1107d07185618edf0846c090903a31975f1912d77dbf8b3bfb77a8e5547f66935b91c6844a1f717a372c3c5203582c05672af2265c67705efd060273493f4cc88c41768dfdd69ccb1c8232eaaa6eeba7bc31bb5597705c6deb909a5e55ceea48175e1803a6c8c5086828c02a635a700d56" + }, + { + "tcId": 515, + "dkm": "b4180c620903f60dae9cb9ef882e82dc2cef1c9859d7c9cf55ec8b8155aafc8c2f80535a8c541c2a86c45ffa8de98113fd98dd4c9f4ecc685a80b7a42c481591b5e769690c92499bad3d55c6f25739ee8325c54ff6b27801e3ae2b43bbb619b0049647d8da45faca6a3fad9bf16e78f75f8f17f03a7e6850d6393b091f6557e7" + }, + { + "tcId": 516, + "dkm": "060b812e2e9607000d0b077225cdd27d9cb3ee29eb54ce83701d88db0e32b32442e7148a2b1e5f68f59d03d9bd0012b44493516beddefa202c4fae01889b6b784d16081aafac2df2e98f9f8056aa8e670278939bf45958244eb106987fb49710174f8577db96fddb09d7bd056a51c33e87964aa687bd0b82d2d91284e0047144" + }, + { + "tcId": 517, + "dkm": "99b1c500d53f34004a9e54a76860e0ad9b0f9e7f39fe04d511f22d1282da40c060c30a3bcd6f23e28606fb735a4a60533e805caa2c523b3ef80dbe40b6257d1b5154d66f4a422b4c6d068966a427f5f99bad2b8597eaac853ce9b335cef903ac619b7d3e654c0cb124232c4659a63d9f99f1307bcd1cc2241774348541692f11" + }, + { + "tcId": 518, + "dkm": "9ccf24d6e47f37242b646970a7881853111a87d7377e5630b7437288286c3e7442f1a86182c4a360768ee30d020f93e9546f55b8eb4e0fd0d360d3a59ac579624e0970be5dcfba0f23c60cbfccb330f611609b4886b5753b1e7e6ecbc71af18f204fead32dc2d372682eb4c0385097de3757f277d8e2707d9ed9e485b80eecd6" + }, + { + "tcId": 519, + "dkm": "6819359fe1c6e1155b674191c3c1923ff6d426a98b3f2d4c35403c073b77ade30610cc7585e1219e03ab14992eb8fa6e5a6b3cac562c9cbfc7ded4e9f5caf0a75b97f277192f898d6625a1c4679f9a9a2a44cfff176a58be575f6a5f59e44478d0fbc227d985ba83b1e0947f5275da484af8cf41963eccad583401a15e891a2a" + }, + { + "tcId": 520, + "dkm": "0eb02a890cf2f8316ad3341e59af653aaaa3b410da82f687a8809c38b7c14998800bab9ea8148151e3acefe190086c3562166fa39248a8a09fb1387cf17ca4533014cd6ec5e9ecf9af2fa7af345f7646d21b9032d8e3f2845c6a3ef5d459cb3c5c711fe4b1d31208a765315fe68e76bf3273a7f2e145a8bc66424d50cba68b9e" + }, + { + "tcId": 521, + "dkm": "b7bddd881cdc813d2fa6c315b18cabf624c06cc62fff6598f80085ac6b9ac6ef4f48655e5c809969d5e6b2a86d2b3a56efbdfb41e2159024b87dbc8aabc5251d8cb54bc43b7ae88f476ef29866de3620001fcf855d806eb0388579685e6223f44ad20946f9c0b5954a4d850be5ddd27a894d29d47769c987d3e9eb52d2e4be65" + }, + { + "tcId": 522, + "dkm": "04c9ac793a379364aaeab52f3dadaa49e01fba6519045832e496027fbb2d1e47764c62699c9eab5fd403813dc88485f2f2844ff7a9755d6a60fa67db6df1608ba2ca397557b7d1dd6cf271d316eb5fc8d7b67b7aba1ca1ac32188cd75c813b5c75fd2cac5ee7871f15fdb9f6a9ca194e384b19a600c4c26e7ba9dc4f52dba7b0" + }, + { + "tcId": 523, + "dkm": "4a6fbe7d241ead6dffad3e43b1883ec798953f7c2c2df5e81e6907ad9b2b5e48b318837d5dce965d6faf9bdb1f009aa274b777fe1ea43a7dff4f7ee96df27427d41047c29cf2ab58a79245d74eeec24ceb0f1c15e707e9595161b6c05b122b62bf97256717a8abf069f24fedeeb62f6d5e57de0b8ed78f0f1b66f4d7e4ab06b2" + }, + { + "tcId": 524, + "dkm": "a2809808a8a021f20f9297724d4dd0a54b70c04401e4c66378bbf50661976607c1a5befbe4764e7472e9c98a2aaf0f29d346dab5fc1d7e53393d17fc24c664f6e4940dd9212f5f81567f9fe71094aa89ca7c39ecb5ec4d6b4728437915f5eaee47063961a05ea960bf21c21fc4d25f840d2a617d6c9cb39c0ee24ab04cc59cc3" + }, + { + "tcId": 525, + "dkm": "0ee806f76a89b9eba69984b75f1834bd5ad79bfca488ea1ead8244d77ccd39a4e5334a0f2f631129da0eb8cf4f7c0dcf6edc49c39eda654318b097b305313e02f034eb7e4e4f9e31e67ee54239c9fa66d63e976a75d298fcbeda21830a6c9cbfa1f94e83c84b9c6cb56e3bebf005000d11424fc3c150bddf39a6d19ec6ed16e1" + } + ] + }, + { + "tgId": 22, + "tests": [ + { + "tcId": 526, + "dkm": "d84529a947c85269b42f4ade0345a54d789dbcf51f6845b21ceeb1b4aecb91efa51e0f2bcf0d31fbf24293c2a5e4210539e2e93183b5dfe569a0d5b85090a3a7434e96e81a451e10e8454ba24d6009ec1aada3a571db79c60f65d3beb19ed514239b3bb0ed8b23b3bcbdaf6878643e25b6cda0e758bd1293d484d7f6145a9942" + }, + { + "tcId": 527, + "dkm": "4224816945a68c752c54628fb6cad6775c546651ece5de3aa4e706e342ce4914e5b47f6e321f012ce1ac3674b861a87d060b222e4ee587e779bcfcd132c28bfe2db8d1788964f59d7af9ca1701e8488aca74c7417f0096d6f981e1f3567a91d14f587474ffb294b0bccb202ef80de85b60d95ba751be485349063c05382e90ce" + }, + { + "tcId": 528, + "dkm": "51f2168289de810b59141ddbdc7319bd84d5db7d40d3b0271f2dd0de36c0f0770d268a3800edd674af49a6e286bfa51488e3376931af2b5be29f7bb5b1c8d9f7a9ca71a4a2f1194f4214ba69d4e83309996d172949aeb8539e96b1b5b805f5cbb1ebd0886b75d064d28b7aece3a81d9e720cf8562636ef6eaeb4f899024530f5" + }, + { + "tcId": 529, + "dkm": "c0a590c7b217fdda9c00291f436df1069ab66d62f33181e644b874a609edb353822798b838629c509baf0ced38f49625fcd64545c3d6b3ab66013ac9b9ea8004c86fff59896405e17630ada7a0d5383a92a33d63633ac97316ef14544332e9323d9c4cc52e5dc7fa01ecfe2574b5d9d3de82cf141ff0811c03004847b222aed7" + }, + { + "tcId": 530, + "dkm": "308cfe8f899e62b49eb38cf8e225e368e4f3f738eb8b03062701ca3915940bd5de0b341e59d8eb58efff534842504b40afbcfc4d59a964e57dddd8e8e844861966c3ca1bddb1cbd68d6ea947514e2a5a8aec05116eb700ed7856fb011242fd50f09d1d2b746049b58a68c79b0efbe0f8a7296bb5c53857713e3fe46d2c292fa7" + }, + { + "tcId": 531, + "dkm": "683ac6ea71b727cf401a4678df1e27bc34a338e62bd55684f1a8615f2467fa07f24d6e6210bfa8e947c2f35767a637074730fc836cf11b81ab22b8750199b4d1dfccbf7622fe1117960c354569ea1f76b154c8b44e60960d94dd1ddaa9549e59e240c1e2628ec9a8e730b91e3b7702c2cd120d8465285a9b3bc451f8814294cb" + }, + { + "tcId": 532, + "dkm": "3929f9d3df74dd84bff54cf3d86789aec17bfb6753b4663347d01990a281324736e86d60e4efd4d3c8817597284ec12e051c6302c221b3d3a84dca96a3c4699ef4b2b6d4a4c07289be64718a6a15efe031c6a81ae0964a9b636f21a7fc115b052386501b5d57d47e3cd1813cc76beb6acccf3708ba8a34957cdd82bd63975809" + }, + { + "tcId": 533, + "dkm": "65ea5353823f7cbfc447a2719afda957e1396f04becfddf838a144d2127d43719f93bb3cef5a1a085b6e4dcbb2d711600a1fff27f5e494f05a6ab51f4382b39139dae08be6bf9bc4e986c6171ea2bc57f2d1496a9358501176cd2f6984a75d00b1a9351dc22adfa2713ec0a2476fdc19599a35158ddca01a72a42b3121f1f59c" + }, + { + "tcId": 534, + "dkm": "b6deb1df9e0d7ed924b0e326a5769ee5ad692cb52a2a12bec23fc9681a2d68751765156cf091f8097bd0e074dd7bccbc14e793b61def2cb615e2070375442e4d24d709328ba0820666428450c303f61b35db70f387435f6d58bf1d6837622d4ec842eb9750f295bd28d434af4bf1f193d16557037c80caf040881536cce28748" + }, + { + "tcId": 535, + "dkm": "bb7f4adfb602c5872a145cd9ae5146c4af6ba745e2d3b02f222427fa114c4230b9dded2ef70b8810f203ec9ad908f95ae68ec98e90d07e567b5c79319cdf563bde362d1ebbb8c5942c3c763f3775ed7fbf9f0bb93c065021509d57d7f9da17934a3069c538fd074be296188c192b63f452a5d4eab495da2d4a71323876cd9a85" + }, + { + "tcId": 536, + "dkm": "bba532a4fc208f893db6c430982cc267cb49575d10328329a6a996edcd77b7dd874a24d5fc370d080ae6a0bad0f9f0cf4e72e4e76106f7b9341de7bdd7afa28cd3439b0790faee69797480c1fe31001ca14a2e90ed71f40f690a75ed72e721bbe2beb44306dcfb44bae0177e09a8df84db47ce6b10d12f89f4de977703fae842" + }, + { + "tcId": 537, + "dkm": "6aee2f71bdd56f2a0d87a28db2a4e37234dffe1f86cd358ef97746834ca3c58fb7c8165f92ead24c8c1ddbb415938f4dc96af958a2330819a190762ec737bc1d9a999378e4c4668fb5f6dbd1bc7b7b490ab8fe0aae65a4ad349aabc5ef146c30255398d30d036aa74f1df7b08c87b6bcd198e2ef1eeab9b2f40d38b7e5b8c712" + }, + { + "tcId": 538, + "dkm": "da7473450f20eb9d1020b98d323386c42947d494886b209d1185c2a269621326c7f9d66d007867051ef2ba57d1e3d05362b59e801a1761347cb874a9ecd3042adbfe8f3fb9218d664d7f058a99f3aecd4a6d412d22b3b0b0d798fc8eae30e7b4116a2f14037cb578082237299bd8dc493571ecab2f5c41974838d5ab03e22e87" + }, + { + "tcId": 539, + "dkm": "3fc4c75b245d7dd97301ea749343c16850f2d6a5f794cc2f52c23494b4301568767c35a09a4c44c6baf90acde6d096f22dee047d2c6fb135e53acc82fc52a8b22fb4bef00b34c708440e830a65ae07fadb7f58af5751437fd954707696ae8f4dac281e9835e7a5a9f3bae9e31183a48b1337d3c39cf997d65535519ddbdfc9db" + }, + { + "tcId": 540, + "dkm": "f7d8ec17e457f8f479c80996b9a4535118ec586a8c54ed458d09b89c9e3e73d6acecf22421a1a188434c5af4997ccdec23056ce9264a90295ff8b4a389ff0ff822314e90329c1921ad8d1412f34bba86ce2f9f44b9d7e3f517716cd3db2614bead5c882dd69ff864bbbd5fb8ad01a79ee1519adcf6495bd1fa7883a96eeac47a" + }, + { + "tcId": 541, + "dkm": "a72bcc54774e1c27c540529ab4088b18409c08b390ca482615175759e8d50945a5075c39dc4407e9666b0bdf36b59bd05b8996d12d3dd460872228af0d38299a646af27f4cfe206ac691a47d03cb4efb37332a80f63f372fbbe5ec8e9cceab4549f8bcd56f065ac5db523a006dd32ea2212f7004ab1c8bec8cf05c7c9ba18c52" + }, + { + "tcId": 542, + "dkm": "f2438ea7d213bae1d564154fdf58ffa0b4ec3e661b81ffd03b79666c1d2d4e95a12cf2de8919d3d7727aa93305c09adcfbc7918e59d1dc5578ec387512162aa49138b070ce795397a457e726289143b71c9181087eacc4fe2074c96ae87f4e0ade424984b15abe5f4d6a0568ee854e2cbcba8290ef36a1e50d6ff4683bd15b38" + }, + { + "tcId": 543, + "dkm": "d2d0478f971e9817f2e2d0c7b1b28fd67553a6610eef2306f23b90de1fde9e6b74162a5b8bb002f95ec5b047ed4a8335d8cc1fbc8833453ce4b10e4b433b92125c2bd1c3b7ba94e7532e172c08b2995f086a677f5ee5b29cee4e1588827ec7ef04f5aa59497ead5ccf4665cd0c3fab91f7a100cfcd436c0f6e4904246788f456" + }, + { + "tcId": 544, + "dkm": "d1a9332af7a777f2b627a01759fe55217df1064f40b316be0ad0c68dc60f37e5071039141717fec13f7d0c2f6088993229054c20127ebc5f65169da4be6b42050dd95c0a3d3d936c5468fe0a338967fed67eb30060d59591d5f4ff909fcdc2e9f863a8d709e0ff1c95ab4dd049536c99cf594cb111bb625a5d6cb07a98827ff6" + }, + { + "tcId": 545, + "dkm": "5c6d8de3d0528f2d4165625c4f3ff56f7cd740dc97ce04c3e8c32f50c540dc790efa9eb246f143e55ef87c9646481a8989faf35079b5173325d70470f0fa8f776635de687590c6c9cb94a911cadf8d6719cbb0b02902ce701d86ee2f15ca18b24630be8319a2485d58089a440b65284a82855ebc01f06fd5e9865ff2ee795b23" + }, + { + "tcId": 546, + "dkm": "41b0a1fee84834dce04e3ee6673c73c45d8273d8a6cab1b57714546a57ea0a52c29dbc80202e8409c745dc034c9874300c23d86d60becc965d723b781d5150d5d0d986aed9d6d5926b475df5250e58f40e14d4d1541fc53ccb33d8b7366e0e693e62bf63af9652213975fc465af13a582a9f837419be3ab0c94f57ecb7e1cf2b" + }, + { + "tcId": 547, + "dkm": "1a5f472be7346e6d7686fd1df4750c934862fcc9abd39304ed01d028e292089fb92f2b342b2fd18dd25043264e1bc19997eb043003a848eaeac9b3fb068a8bc1862dc95bf89d49643c85017c811f19fbe70293e524c7d428fce8d25a330617af28c62cb1b4cd4685abf72e179a61512615649367e8326547df22e554d8735a95" + }, + { + "tcId": 548, + "dkm": "4121bae7d2205d37fd28f71b61a534b689ec69b287b2c177eff6115267dcb6b23fd1a30512e14de4a2f2c88655f672354110bd9ae35b15ec10540877c54fc999336a1dde6ee6d263d9cf6d2e4aaa39733aa111e69ed6597f62b78a6c09fc9ab7d52639220727abae72051050ef99b784fd3cccc5c9daef7423df6e8125ac98c7" + }, + { + "tcId": 549, + "dkm": "07b29b0456c41ae1d1d7553e9c76cdd833afc361ca6a6678a52f5ab18755a86af798baaa62833adea61081cb4ac1f479b76ecf40e1ca0fe8b194a3b68ab45a356a769923e0da58d9fc864512af88e87e2d545f059e04897ed07630b6b52f88f73fec8066e7b1ccbd49a964f97763b9073520afd188576cb78bbcfadbecc97747" + }, + { + "tcId": 550, + "dkm": "f300c6531b0fed8c822961434d4f549788f5135c729537c588d9bcd8bcd70e60a57135d7eed619fcc4338f1984c1d3e0b0c24c741a66e2fb867070b6a053ca935da3f0d36c80c491404afc4f6c0c3aa0526608a460397865450e5573ca6cf873cafd62c3b4a7cf8a22376162e671d57de7d148a8e37c8ac2ac3afd73c080492a" + } + ] + }, + { + "tgId": 23, + "tests": [ + { + "tcId": 551, + "dkm": "5ee23041054e5d766949451b16a00d136b8d8777a9ecea9443e0a17f54b483e9ea54c3bbc68d1b933710ed1097b31fa5a5c908695d233491b511c92cae52a1fcb69ce05feb9161fceae01887d9a3ea18deebebb02b0af7cfb0ec7ff4d79c849277223a770f1fc361f4f25ff11fa797efe8bb2dbadaaf72169bd482eb5d53fe27" + }, + { + "tcId": 552, + "dkm": "1e2d32fcf43c801503c93381fcb0cd38851a3688cbb3d53c5882d963ba2398f3a70c8e87d9e0096a2a2d99d3dbda90583606b248917f7fbf0262ba0e5297a58373adcaaf6c39e2b27a958d1ba1f6ecf281f3eb4ce54053878d2784e5c609f12fe4d455b461ac48fbc66ca2e95a73e4e9dc3d40dcb9c8e9153671218619f26fba" + }, + { + "tcId": 553, + "dkm": "bf52dccb60c7f3d12041feb485597c974f7d6cde4f961b519af6ca1725b7f0c49a74fb4fe5cad08c9d0425718d1b0bea5ef669e2c9099cabcc293852c16e4006f1e2ac14a5a245e3c3d855fb05845dd4cc9118c7bd88a21d764a0361f0b1d603452db670c7182e2697b9ea36e4b2949c01ee803163a1ddbbdb05001b6839a191" + }, + { + "tcId": 554, + "dkm": "e504b66db9e93df873ac50ba7930c88625acfdb28bceecc55f72b558813eb8ed8c770dd660dad63a2ad3f4f020c32ac2c81f40e872085c259659ede8b68a035f3eb69c7c76791401af85cbfcfd83bfd9c74a91d593b6c994a75db508cd83c9337d1415d8df9f220e3930e1a93cbfb9994e821f5def966f38d274537603e0671c" + }, + { + "tcId": 555, + "dkm": "6dece1fdc951a13d1d50c63bd0b74a6d061c4133858bc96d751ae6854d1b23bde358f5c5928111926e1895aa374b409ecf7c634fe8f2dd2117fb4f0fd58d1f3abf2bfee891e8391510107abd04db1799ade5577e93efc8c21a536139202febc7718ef06bbe2a2eb313f80648d75f4efa219ae238d09c74dbe49d3f8b61fdea8d" + }, + { + "tcId": 556, + "dkm": "779fff11a8a304a6f04ff4d1dc75dd2bb351f962093fbb5677fd49d84490bc58f19cfad75cfd3fdd5d9b78790f5218e82d8f6e59083238f3e511961f0ffb9316e2a07e88383011dcfdaa50b04d44bbeaa4d44f71509c98d855944d66aecb7b3135941bb44c2bb03127a3e9d814ca5bb3a51145985076b567455f5f40e2fd2752" + }, + { + "tcId": 557, + "dkm": "ec800cdbdf9182bd41580336a834e6a8f653ebcc86c9610bca89ede1b7a39d29587a0b69e62758c9937d9b2eb17512d37cee7a14cfe694c209479716863b9740348733762b9f8b8d7cad5792949493ab303074ecfaf4eb00ecbb950e320e5cf8c89bb0e885c52541d806e0fa94d73a6055b5ad68e6810af08f3b67202f78386e" + }, + { + "tcId": 558, + "dkm": "3636740c5bff9a1b11dad97ac5b9a4d55b1667ddf3d726f643a56531d624112fc5097ba278647b90020ded070e8e7928cdc78f01895921c29739ea5b69abfbe1d982f6ecbccf992abf90595a6cf0092e365a81a5ff54c84bc824fceb3b832e276d9c8fa1df3e7a12a53046adfebb9044d6cf397f2f29da229e642398de30cf61" + }, + { + "tcId": 559, + "dkm": "ace91279dfb0fbac65a9e3c283b0e40a9e8688fb937321ff4877f373dd66b498f500a73e724020c3b73e455f79293d902f6f6596dbb424ead6dadeff74041ec2fe95f588ccbbf33da51bb179d125e8a039ec90ed3da74b17c882b52343960ab9550e23932d6f1d3c10ed81584696cfe706ee6048d139c1ccd45559e8ccd60d70" + }, + { + "tcId": 560, + "dkm": "930ed9949c86ee31f79784c78883d3a2532d281f1617a05b56d6438e624b7686bf69a1d4175583892317879b327f5ee76a7b48e8caa28fb5c73754ca9afee3bbbddb7ee9ba4f8b378c727cb39c4b6514c723927cb079e14d58643ea3814bf7dc5a5cf37d2a8fe83dbeb959ad86daaea82ecbe4f9ae77e37632192eb81620264c" + }, + { + "tcId": 561, + "dkm": "3ed3378d1d3e9e18534d30533f28c86f38abdecf5c18c9806d415310528f637f28226a1dffbaa25f9a6e44d17796aefead489e6430f00b8a5c70de3ec15e9ce896084b8e7a97d58b028061fd889cc9d10c7e7b8e0f0156a5e20c26a7a49a46a06a9e5679efabe16cc79f9a4f95200be7ac47c827160198e3734bbca216cb4af1" + }, + { + "tcId": 562, + "dkm": "c1d989dc16d0a17146d36854987f6cc00b395f2ef82f1bf9925d7f94feec71ca70b2b01e640c01ed5e28ec4314df3d6f54baab48025a2d50fe6c28f62bc4f7928021e6c4b32fbd49b4307c7eba5cc4ff4c50d4bab211ccfe9b0ee3e612cdf9481f6922e00d5855861ce17b0020ba7fb63aba9c039eddc25282d344eb55a1a2b5" + }, + { + "tcId": 563, + "dkm": "fe17872996360f82c19676b430d255061f7c5dbdad08cb29e90e342d9c0ea6cf0fd1e42531d786209fadd9604d22ef2c546a5cf4039ad67c696a2f098d65283136711b0ef59aa192d6a217e13b039cf8dd0d473987231a4f7efd8d9c55ced7b55a37dc7aaa4299c29a7606125f3007e4f2413b28b1ccd0e567be1ca1b5a2bfb9" + }, + { + "tcId": 564, + "dkm": "79dfcaa15c5b24a1f63cf874e01d2ed4035f2c401bcc4721e2480765a768c1b2a32afe3f4d62b78b42ad7a1f40f755c73168c3062f51b257b5d7e07fae0e89a966cc8750e2b0fc6998bcb67bff47ab4bff12a41ab0de1314dd61100427c6a4ec4a51dfdf6e0c3f8b53f1391c1ac85741d1189b17a9c5539076f7f06352384e7a" + }, + { + "tcId": 565, + "dkm": "ccc942a1683a9221d574cd5f39d73ec95854a1734589bb0e0a2829d2da46eee83f58a41e1239f5e85a7078ab5b643d2b0e005fd7d1859823683bb8e52bf8fde25e1f831cf099f708d7c419dd43227816ded83850691015055a2ec41dce811210e512db52b6d04813d62d0257a04bd925d880c20bc1082f3770852b5f9cc22c74" + }, + { + "tcId": 566, + "dkm": "ce3fccb69fb203497bf2390cfb7807a0d4aede51043eb62e0b3fd7060392f0521bf7d165f72af2bcc614bf961afb05078a38953a0edc59669c1c2286f10201fd094b6264b5e3746a750e704d7ac3854710bd9faed6581a48e947ea6e808ffb2def3ac16d6bb5fc02da88bc62cce7c26ac8f5ccd4dec43c161a0a22ede0b7492c" + }, + { + "tcId": 567, + "dkm": "bea587cf0bacd678ab90cb2aec5284737c47efc9eaa735de4374403d027c97aee1e17e11980419931b639d30cae4b4dca6bbd9c181bcd9b53c59168b18934906ce1a05974e7d10db45023b32810c0395fbad3569c9da14c0e57d04873ac70337f8c75647f794cb440583e37702f6d5b6e44aa74302e9f5c071467d68d9ad98b1" + }, + { + "tcId": 568, + "dkm": "7c6e9dd21239dae255a9615042949431709fb8cf22bf041b567dd608dc3aa02be0d0f16a67e069ac9950cf3089ac1b7e09e700eb9d64e77361b0fb8f23aab013b8a546edae7308ff3a35604431e42b5d56430c7a1d2e2eea76ca123febef3386a34b354f0df97f8f9e40daa9154805f1108ae36b3371ae59ec0d0e1e1a062834" + }, + { + "tcId": 569, + "dkm": "9833f323f56f4b6435bb3c23509711bd4ce0c156876c6fa233a83270f0a1074a679575d48c94612f79dbd29159b0670694dacc3be8bdf0b31d78751fcb9d1c0500ebc0a46152c7d3d8c563cc320d347bedf755c8da35980883d77579465e853a87c732a260255244d549001b5231267602f3cf09de444f10aecae45bd8bd1421" + }, + { + "tcId": 570, + "dkm": "aa2c1d2101eb58807f49899433c3a5edc27fd527f8f9a6a937428a546ed70990b4348d4b0922186bfc4986c7c48fe22d38d05662f8f12660f6f678729ecaa1b538bca2fb0ba858cfa5fbd83befb20a8fb664279da5cc89c241d3f0fdcc17fd3204e38c2519d46de435354d1c5f6e16d3a8eaabc4a7b7f15c75da231c2b25c41f" + }, + { + "tcId": 571, + "dkm": "510514188eca2f98a207be16a5e8168e66be2fb814ead15cb3d05c6bd5465982da63523c72dd0ab0cf3ee22199eb1ad3ccebe5351101cbeda25f2a64c7b9e8b2cc92d54898bcfa64fdef9bf96fe60fe4079ea1973055cddcfe4320aa31fae9633dd67a31165a79d16aea391e53ce7d80b76043a497d66c161ddc592102f3ee1d" + }, + { + "tcId": 572, + "dkm": "be15866e1e2f71c165f4fc518432c6163fdfe28f218420b8c3f844dada0ec78192c1bc2841ff4c9ddbff1449819de02c7b6d62371ef3908ed0a7937e295d648a40c62fe431f12202da1a2d89f0917f6bfe1eb5371b2c63e49911676d61282f50aac9eab67929bb0f8de80b11ffe1cb3744dafe763b3ae6d692610f08638443ed" + }, + { + "tcId": 573, + "dkm": "8b600b90fff7d1521c8292f2c6a82876753f428d7ce202039f22fc58f1bfbccb73f40db240dfc16958aab9b51829864bd37c72e78b2f2a23a302aba2cacfeb9428bb97af6ed56c097e6e22a6cf33eb22cdce6b90e8bb3906c330751ff304358ef4df9c1e4408896bef3c6562eb33aa694cbdfa09ede5cd9ce45454cdb7f70df3" + }, + { + "tcId": 574, + "dkm": "16c26cf4a5603baf83336e104dc30f2bd2de15c53fc470af46a300876a935408b24921e054c3b677253c52e515289ec2d80b1d82a56be70a50e40f8248988624b651fef79b2de6531fd1010be8dc2156c1df20f42ffe3ddfbcb8bd52945daf0f9da77c4cccd20ff32f0873c768e288ef804d98c7924d77e0b660faf31dc8821b" + }, + { + "tcId": 575, + "dkm": "71a4b415aa8a2be8643ec6ca4bde62a3c00d6d743c43218ee32199a59b74ccd3de4b0d7c57655981e6fd8b07e33c06f5f18d28aa48f57393239cc352169907966ab148fb5b5103df531a7721a849b0353fe3cc186e85cf6adfb8fe27161d828a9a009d59b273c2731500d4a007835513f0b1a67a3618ea486f13511ad1c45d24" + } + ] + }, + { + "tgId": 24, + "tests": [ + { + "tcId": 576, + "dkm": "142bca9b3df3df3af41c60199da69e332658216ff4c25a520babd5261a5e1db7e3720b189fc2206c8934152c288d87eb4222fde62caf3dbf591f915b09e49fbf92804626aa0448507f5b44f51d8ccbbe02be5c44955cafa83155542b1c629e92306b4d0a85b43288897b2a14dc4511d326635b0d232503f893abaf9edfe33745" + }, + { + "tcId": 577, + "dkm": "60fba8701b2b37a2cbf18f34f741e65bc6ac399a855a20ce2e08422718f7491abf230438547d8f21962698ed8b640ec214e695c48d49239f6911f88ae0a231e3f6ca6322f7ec3499c02f0b5be0303ba21d92b8df9e8fd8c602d9c3f761e764ba2dfbf556b6e2fc087804f2856c104dfc98a4abcc2eab38126b31a0e30c29f5fb" + }, + { + "tcId": 578, + "dkm": "0ae16488a99abbf28c858febc037f27beb553a205fc4885efbf1157f69b10300f9d8793adb8f1755daadbde79eb9a0071f9d660f580b9bc27941d223f0c7a3f620622127204900b7a1229aafbc5b61532c1ae98c4cf35cf82a9365f60393ba4de0d9ebabb814354996ae8b363e951ddbc2ffa37c408a5bb1eeed3c7e171fb51d" + }, + { + "tcId": 579, + "dkm": "246e173e73eb89c388d9d1cbd0a1141f049ac0b6fa3e7558080c7f2acc0b7c25c8e49c950bc4d78fc0dd72af96eb8611c088b13e0e6f0d8d691f874595114e4e73997cdcc682b29be180a7086d2ac296783bb7a7f8d6c5bd3fa224bd049607c976c6eb30e396648de2ef13b8140473c79f059979aefdc52aa80c44880616c283" + }, + { + "tcId": 580, + "dkm": "cdb74fcf8d1dde65d278f12fb49f6d66a943619dce3dce5f5ca1151351652bb032f6c68a570bae18348f036c09bd8816a316a452be5757372cc72172bc6e2a26e56e459796b229c1680fd151d18237937620dc6ff4e6687dcb8075f0eb07b3b6246e7005372951a9abaf22c1dee83c99297713140de1e19c8608a794b55880b3" + }, + { + "tcId": 581, + "dkm": "df3ee8386b04b0ce6b0d141327c140a5ca6156379acae4b025282b91b4fbb86df8ff6bd2c1c04bb9d0ec742e22434f18ad530f4a991649ff78cf5038b0f5454070b1566359453c53cc9f5e775fb6e916b3ec3b6ca669f588a46cd4556076b716038dfd0760d045cef85499db6d23beee766b99c053814d60b858ed65397c0fa5" + }, + { + "tcId": 582, + "dkm": "458feb1693f7a321709ed32692a00eb282ce161d78aad0703e5dbb3037073f26fc502890726307876003420d1b56f84bf1b53af07c0797670e072451608c4a999da080a7004c4076759ba21dd8d16833edcc10bef9cd34164ed21225a639dab45c5daa0286b4d2e119ea841aff1a5c3e9d4a455c1d4c58e75921c39b590e6fca" + }, + { + "tcId": 583, + "dkm": "17c3f1aa183fcbecdb20fa1a482c9c407c0c4ed9ca4ca357e91eac30e3155dc56cf460823b7b07925508b664a51ef3178ef3c9f201c6206f90c9bdd8218820b36dd299daff98097fa204ef56a16af7832dbdc57dde7f4181248601eaf709998a04e3fd445c22bf4183e90f4a03b10bf6865d0591ad9db58d02102435a151c2ac" + }, + { + "tcId": 584, + "dkm": "b0d7397a2b58a63d01184373cf025adfdedd7208ed3e74df3dc3b79c648c7bf31071ef51c5deba450de84949f06aedc496035ec025a9405eac250d1bb771d36cddce9b176119a6f56843175f442efd80b2b2c5886980678f9dd0e96c4785cf3ac4f0e603f7e412ce614953c93489c7f569bb41d0e72008b3574fbf509f86daa6" + }, + { + "tcId": 585, + "dkm": "7fbae9183826a0db72a653820199e56441d9a9f3c3f70d309c887a35ac058d94e579845eacd457ae73c40d16922feda619c1a407e49f490269833d9856f6bd95d2b45fee0cf496604ace06fc3b3076c6a015f9f884cc8923c1ede7d958984c190b84994e60352edf718d114097be1aa8cb6af900f9d2df5660db73ece99ad227" + }, + { + "tcId": 586, + "dkm": "b0aa6dd1e21dfb43558f0e51c4e995812389792fc1c38264c369a3d5a53edd72e3d0dd2a3129bc705f4143200ada26945efb59e46c320657f7828270db717dd37d94f1a126e486408eb928209987e723714b065fdd821ef7a3bc162094cb099131848212d8979123becae5818a256fd5bb19ac09e4c873d13c74c52887cfc7c2" + }, + { + "tcId": 587, + "dkm": "77977958cb2b8241300ee5ccc6abfcde5751ba0403d64afc4dc892537c25ac65eafd79648c26602f70d1a57c390218b1516cc46fe87c81bbafee63bfab1dcce0f1a0aedc6f167bccebd236708b01ca76faa2f706ea02434a29f8a0ab3cb82586029f825b45d3dbd089dcf8b6c718705a0507511369694c17cd289cf8f5771a95" + }, + { + "tcId": 588, + "dkm": "c35a5e4f016e8913383053f6d5c0326bc48ae56c90c7d608d01a6f03cdcc3487e3309ffb4fcb7301a4a21b996a8af3ceaef1db1858ff1c7f7d5e25555f1e46ad523d3c946817de8829aeefa567b82e7f6c27c765c4159f35df874e22b1a8431f7b658ef10e344822569b81cdf9f88f7300860396c2ff24f949e1fa5265314012" + }, + { + "tcId": 589, + "dkm": "2d79fa15fff8d49f605b036ec6ac617783f45af3f6b12acbfb25e355beaa9a6e72f449a4998a5505028062e89ca5da37b437fa059d6636f5bb7e8fc13b4989f492d72a3d210ee25b2f1d2b762bbf4126bf0cd6a0342659bf78e6d253f36c90ad6cb6e014cc210cba70a5499497143812d69105de2caccb6fbc1db3c1e91b916e" + }, + { + "tcId": 590, + "dkm": "9902eba778454168c7d2453618cbdef3722ce58028c6fa9d80acd8e6208151487e33f948bc14b9efa87bff68a22cbb9ae13d15d4495050770139c3bf09070261c16d7e45bb117173eeaf08b4f64f846531193dc13a0a297dd6eafed9687088f461e43bc50223ce0a75fd2993407cb9b9f564368015d423e6f1f68d7ceb04777a" + }, + { + "tcId": 591, + "dkm": "9f869d3549afb355118a120e8b6997d2537ef1ff2ec7b5a94c8e99ebb6b23500c7fc13d7b952027f2e1ea60336c15a85c0749343b8fcc878ce23c1a49c00db11110edfa9de77ac248b95f5813f6b35dab2acf411929220242c24d6feea32aff13a78261befe10a903644cf671a0855613cb9a46b2ca8b18f96af20a7b95ae8ec" + }, + { + "tcId": 592, + "dkm": "610b0684184770ea7662e935ab708c95e954b2ed31d46abc11bbf774cfc10994ae6f7d023ce3c1bc827e26f19481759a4b1b834284074d1474cf6e3d056ad6bcecdd7aa904e047de00dbe66047953ccefc8cfcc4cc64c1b85e57e93d4167447f50af47df7debff4c87d588016fd69ea756be83319ec31712fd82499d4fb94aff" + }, + { + "tcId": 593, + "dkm": "f8dc79cb674e34b6bf85cee61266d417488df4aa47ed3bbc7d2d423c694b941ac4fa9810d27de376513faba57691d265fcd3a0b68b43b5e4f25915773add148b210be2d2c3a7367ab25a0855193feb19916ed091ad8ab3442c851878ee97ed8306e37b5b9b95ecb4e0c7be589b041528d2b1bbda24b0d1d853ed4055680a5dde" + }, + { + "tcId": 594, + "dkm": "bf6c98dde41c340240f7e0704a3fad667d11d82969a1bd60e89e63cd7b8171635cc78c87e374be27c3526669657115b7d14473ad330ee1be440ff79ba627be16b41b8507077c5d99e2fe68a8631f9b62e92316fc4d3e63a3aabea919846163e889660aa0bcf8511c31ed111e22d47f6069f6f32c9f8f01d28ca42bd5e085a6d5" + }, + { + "tcId": 595, + "dkm": "273bb1b60cc9587840037b609dade52ad9fa52e19d64b75b2395a124d1cfed0c7ce910b0728897864bd8a4af0927ec85cd64b1bfc659648cc090f4e31a2c9d50373231128fb32bc94ffd2e0ce18a729788e3cf5c2023924a1cacfa63be82c362043ea235ca111fa9088370325fc23df3e685a2121386b39bb5803c38beac1542" + }, + { + "tcId": 596, + "dkm": "677576cedac1162598af23a1772cb6bf17bbc4aac5a6f1c67264a7dd680926477bad49cf3a34fd109f17ad2b5b1dd099118e5e3d7a9c0bdc978ae27f35959e91de3a948c7c7c53271165bf9c07868604f55a5b4d482ba097f27df66f3453aeb4a45e5b6db3ca26517f0d5cdc0723764b652e446652e835b8703fc8c629388e0f" + }, + { + "tcId": 597, + "dkm": "750cb9351c9ed82342acb5b7a01a1fd7bb4961994ace3d5e2e2feaaedcdba5b53387ccf5ecce98b870783dcadc423f7f28ae68f90b827f82a9e6a7810837c965471ac4962ebea801c2019e384d7d5c99241e36331c02ac085dbd7c3e344124e6cffe2dc67463f69f58e61ae0f582e1ba13f3a0873483cfdedc8f1c49fd4a8866" + }, + { + "tcId": 598, + "dkm": "bc842f5ea305682ef4333153464699ec78109a5dfe4c9672603db0ed9e304be2288fbaa657b5aaaa5d9418cfb046ba82b9a0d2096987f72dbddd86eeb35514a6bdb59d69b0124e072218d2d626c9205c8abd0e9771a33f88bb1838080a212a4776b1b19a0f658f1fa15bcaa4769d45f91e033e6da03c4c8dba315f5e54ad5c97" + }, + { + "tcId": 599, + "dkm": "f25047fc3bee86ae12c3362dd9240e81fd6e74d4ce32c3f708b467985fb6e4b24a7fd417abb1411a530532c7dd856711a28a97486dbd34be38515526d561f2eb360d6b6bf68974e13087a88dc99312b8856385a75d2f99cd0ee37f8a77ca512933ec55bcd5980cc1a9aff20a9b6a7b162b017365374f0647d760ac68958bcf30" + }, + { + "tcId": 600, + "dkm": "87d2bd290912d59ba6119dfb3d478f2d183f4361506b184315d89739d724bb49469f59c3c8092c3289b37c063e279c9dd825f536b279146ef2f10dc88d27feb23c0aacaac26e647283fb68782e20fa326e144cb320d80ef15f5dcb020fde849e882dc723d4c2bc9da49379c7ff01620ec5288aeb2e8a043cc9751849e27c6259" + } + ] + }, + { + "tgId": 25, + "tests": [ + { + "tcId": 601, + "dkm": "579d3a2a1f50f3bef5559427c5571926ffec24ca12912080dfe42625e6235273978b582f3c64a77a15a371954116132f2f38efa4f833c6f6d92a0ef8d2dc240ec6659de0bba08e7345a3fba4106be17549efa791dfb1651ce94219af1567cfe9f31af3b07f0920f47cbb659a61fbeec03903bd045753b333dcfd1c6b9305f6e2" + }, + { + "tcId": 602, + "dkm": "72b00cda0c268380550bbd2937acb9ea34d648d268dd4bafff2f6520f033514be21fd67bbcf2a4d8905f0df45294279a8be93ec07d64ebda7d863c4e32dafa86a87cf89b87fc443911bb077db4b587ecfda082dc6f136db00fd42392b02ac31b4bd2f423945a8a7fda7999589d50c2c585a4c37a551319a83ac2f6d7af8269f0" + }, + { + "tcId": 603, + "dkm": "1890ce90b88a6cd64b2d9eb2194c97efc4de195ece0c94ad5aa821b4845ed720fbf8862ec1a07158bea4a97bfc07e0b2994d62d3a68f42c8fbce1ee7d52dac416e3ac83f19de70d5dfc6e232675055cd23012e20d92dd812481d29d5672d59e045bee2b24084f470b6a4a3106b4b0b5c5bc90e1e70436e1ef3bf98f4551af7e2" + }, + { + "tcId": 604, + "dkm": "bf25a7070775590a7ab4d540c5ea17e98796d96b2f861dca61c5b17bc2a2056bac97b3540fc47245f9b82ceaf80a52c06999db32ac76dfaf3b169decd9625ba4436172be8c561ac94196e01fb690e6f954f6f3a803be62d3e81063267fae7bc87ba39996c6877dc95e1fc4f620a2c475fe25da6832ab0b9056504df053e6a9d8" + }, + { + "tcId": 605, + "dkm": "d603a3dd8a23bc256dbfc1b1d74ad041dadd67ea0d3bf14a5f24530a64cbb987dd18c188e7e7efb3ac27cccd2fbef8cffebd838efbfad01399f450b4fc1b175cd7b1d9b2994174ffea583c36f72269ce48cb3d377b87072f093150a13a1d7ad1c1bdfa2f8c3e7b7f566f1dcadff6c8f75acf4028b36493a1a19067cdc396f450" + }, + { + "tcId": 606, + "dkm": "03baacad605f6fe18e0909c4dcda504cd4da508993560ea442be268e1c0abc364a887d778d862a1d88041b000f258e3f734cede801cd785a44eaf3b55ed32075134d3e7f9c8f2a3bc71ac66b5c386b96fdfbf5887314021c33f9c6400ce45224d941a4e0abcc02f38f4d755693d249e691b69a3fed1aca404e7935aba2728ab1" + }, + { + "tcId": 607, + "dkm": "5a1e4f492483ca514cb13c2f5a556ac98cd9b2cca372d7f6d3c51cb94370b00cc7359e50183dde48ee900c55b63ab46d09c1098bcbcef542e2f6449b2dc2ab7196848647cd206a227b772a68abe409cfc63379541c0cc5cfdb795406d4c86ec5f9f6cb2ca817ddf6dd68de4803855d9f34713bfa6ae6454a26f4381d714bf31f" + }, + { + "tcId": 608, + "dkm": "103ba1f72189e0b49b37dbf19d70b03e2bec78be89a01b68e19265edfb8c22171ac9cbf702b0479089c8f781ba56d7647deca03850fc5db1dca733c75263b7fc3c30c7d6fbaef0eaa5bbc7ca1f58394c7c08009fe02ef9921c996e2b6fb76f1b7c7014a0db1390a46d2e905fad16e138b5efb4d608bd0921c2077194ae8ac884" + }, + { + "tcId": 609, + "dkm": "ff26ad76a68ef30328c11a830dfa6f5e1f2c13a49c15516e9214113e447b5a175695b086d3edbdb629906a577f8259e8bac0b5fac586b028f746a72b13088e73a9c8df7b14f87e544b50f4a84493bed762637b94f020ed17656d35189ae9d779dd95f0ef7d2345a43672ac055252c72ccb830ee5a2f625d91a90bc782d000e63" + }, + { + "tcId": 610, + "dkm": "00b48129c2250e8cd12e4773901e578fed45547fd215565f6329a71734f79a4e59dc22d309315f9c9888ad4fef20361700dbe8348e914985f0f2e5ff35a2bd87f43d607161ca7ed28eef544913287c60fca219fc26c2662aadc7d03516106e183d62611c2c674da07dc2e5935ceb68c6f391ab166ae196dab7c4a334cab314f2" + }, + { + "tcId": 611, + "dkm": "e2184a53a823d5bef1a6df4377a6d451f248a7d5e93d3bef9c43e8d0176af1c78fb16dd366a6db10824ca35ec96d61c608bb229f1bf0b374fbb0341ab1ba7275ceb8e3728be47055d9b611aa71dc17e9670200f67d299721f566785c7ff40fe871b8c9a7e7e61199887d67568e96e02b82e2f8d88b8cd19881b575f928832cb1" + }, + { + "tcId": 612, + "dkm": "94057d68da61851b3e41c63c317171e0880fe08bfff79f6138145114e5a8c889503d0768b074d28531ce61847fc3f43dc9c4d58f5ff07d61e06bcea4c1d12cb76731535831a4a88f49d5c0892682f2f47768f62515248046cb570869c7eff4e67ec34a603fdb96a3d0ff61dfbda2faa33fa4bf6a9ac301e2a81d4e6877a38077" + }, + { + "tcId": 613, + "dkm": "b61055e842c9a6944b3ea7f225019028799fd51f5ef1b9d03396e456f14681b58da31e0db4b58882037e0ad5418c1128cd5cf80debc9b75649ff8a094cb0bd5ddb0d82a24e0cdaf2af5aa6183c4d4011f1e82a1f9e546272d30e36c7993a99ca6cb0236db3511bc260696808de3a5bdd8d60c7b3aa83443353988eff8fb377f6" + }, + { + "tcId": 614, + "dkm": "ab7cf0988a615d9920a727626e69c0f6f12e06831655b9d7e3d1b7d15bca2a172c4e46a36ff156d4120381d67cb70479f081603aad3262cc9116a03c162ffaec5eae3fa5141f5495ca5a4e2e681892b34fe72bc57944a60e21e384b4c841336c80224f1346c8032ae66725a16600c3db673bd2c6a009d00f6810c22cf7c373e5" + }, + { + "tcId": 615, + "dkm": "3ad9964f54c71945a9dc63c1cad32ea81170778b850bcf07a1dc5f80a2bd0143e349311aeda103d62d65d90fb3fd3488b6c61be175eb302bdb8a5ed04be2881a4352fcbc67fee914cf4d3d0c5919cc795c0e61b7379b7efb426f19cefd311c7aa9f7bcda084cf93670f172fcc7ab90a6558813338754959cb908c039f5f50e37" + }, + { + "tcId": 616, + "dkm": "0d3a2197b5644b988667229501fe8bb77c738c144ea31690561f7e5a4fea8d061ec16d5247bc01e5c4b2c9799122e722877e2cd4437476e52a9a068d62b23bf594b4f5ff3624c8eef60486a9070f1315408186a3e00e449e85f7c539977665490bc2d89d17e589228243046972a5dc4e5c7742b62e7010874fc34c9ad8468865" + }, + { + "tcId": 617, + "dkm": "930447255fb87c62f449594a805710f5032f71bcffb83605ec0d64666499be6bebd320b6ba01d8750eefe7d3322d5696a0117c9ef1dbc5e5b5322d5d21033cf6d6fccf9be410924cb260a8fb214e99d0ca15f8dff80d6aeeda829857d2940723dc931a6abdc18f9c2bd76966948b24cd3b887e1bc5463f5babf7add2369d8783" + }, + { + "tcId": 618, + "dkm": "dd1eb1dfb9b212f4995f0c64ab0b507925bfe896b1c461f07be2d96811a119c1f9f115bd8404ecf93f066abdd785bc07a328838529bb43654627f2b044d154c11a43327d0dca8d22070ccccd7eccdc711168e1c36240b83b1b4caf85c04da9392d71aecb94e69a418deebba712d0e076df13c8d7b14f4b9adfacb880d75ff0fa" + }, + { + "tcId": 619, + "dkm": "8e092465b2acc169e3b23b70e66a38090cfddbd299d83eb0307653f563d35b2975678c4c502229847a4acd1907a08d1de6f5708e0074495bac656e20e90c3539e7bc97b8ef3988056a7d72f441ba7816f64dc0478600157ddcae8efc8990ca1ca1ff6fd14e02be0fc1c3251c103c8c3a856ca691f2cfb4ab1b9428ab853f683b" + }, + { + "tcId": 620, + "dkm": "c32bab97fe11f189e2275df9cd4a70da2ef54c3371c2705d0a1bfff6a850ee4acb6a0ebd3a319dbd933c5e6c6c41e7fd8d4742a00391d7414f89a62678039abaa37f2f9d947acb69d8e26faea7dc7a26c2c6c552ce0ab1fa134dae13f94ebb97c4ec849884fce74e7f99a1f89d635fa25aaf76dd3daa991c382edfff3af2bc36" + }, + { + "tcId": 621, + "dkm": "16779a03bd94b0e708d0e48a98b40f00d3eb76a0781accb6307b527af78c06404a49b634298914a29c4d4658e1c7accc524e0a940ca94d2ed8f5fce45b796a23d9f4fd888af94462a7b702c84f7308f45f6df71f1b6ea1d036c9005eabddd626077971309be57cb817bbd77e6ad52d45358c747889e634cd1a178e16a732825b" + }, + { + "tcId": 622, + "dkm": "ebc538b6204e96f7bfa5fa226b3c528be4f124b64d2322b688b25bbb4784eae2a47836357b08ee0b13243763057957e19cbcc65e18136e10c244c34ba32c0d0f484fe56ea4dab1c311a678f68ca94fdaa48c2f037dc1bc820097020d68bbbe98f4f4d21285ee9f6767e85981782df7bd2429308bf44939dbbf00c82023382fd9" + }, + { + "tcId": 623, + "dkm": "678798ca6e44962a8dc90a5b0f955ee4a119cd6b89b4c55704fcc22c1c731322e1a37b06239ed1a0139355a2efc7b10cad686707be4ea5be74feec327c7b024e5a99bd5dd2e16de5fd9d13d9e734176e7be851163554ed17d9c34cd9f772813ee2728e7c9ff88cb3451d6234e1c0b13864478dfc558cc56ba25ba23e43f2e169" + }, + { + "tcId": 624, + "dkm": "2bf8ac5f81038d83ee7df2f554cff66293d0a697175e1fa62183d3514bd9eba69d71a7d032b6b510226500f98b89ed0157745d0ac49db6c3110ce47e3bda38a21e594bb81fc5e19c55e20ed9ad9f8825a4a44aa3b9e1e84c0c34156dc22ed33efb0f547278af52d6f4c82135ad928c4327a0c875eba1d68b0da570cb64500f8a" + }, + { + "tcId": 625, + "dkm": "9186fdfa4f4b031790c3fb15af63115c22711c9f11dbe4baa8e21961118c6fe6688fd7b81b16ab261396b0009dc45bc19c63c973da426ad3507d48942f955544064d0c2b58dae2c6b796a8f4a5b1763a33427d0e34bb26d917ddaa8e8cd2bac0b193f59ae8f452357f519c121efb9432119cbd352d06757d94e1b91e577c6017" + } + ] + }, + { + "tgId": 26, + "tests": [ + { + "tcId": 626, + "dkm": "e3976313b9f439689017205d388c7359b5f3e99c94d535007a15cfe79161cedf620711ded4b07bdf517cdab50d1fc2718c5d77ed058835f06bbf13a803e0799322b3131ae42fbbe94f1d412c073b241ebf7d15c242e2e4846dbd9b96045ccb569c4ff52d41c539973fcac7bf403d80acdaac28e02dc9798e0c2148dace9d6695" + }, + { + "tcId": 627, + "dkm": "278cc1d4200b48f144bac0859448c85c63ccf5027c3a86c66ec5dcc531b34e9d1559c27b6af92873a3c09dc6f5f111882bb1ab20d271f55dfb367029518921f67aca4798cd70bb5ee984dfc8bf5e855ff3916edf1f52da0351a82f4d941eddd9b5fcb98448a2c01b420b78797523699d5548e754f1056b0a21cb04f831042d55" + }, + { + "tcId": 628, + "dkm": "ada0ce43dfe8f1ed00d69d2b38211f7cd6e3bf74bdac682e607b6172712b41baf2ed0f8a868b33f694a2769df805fca80cdab553879b262445feb252798815c82632bd5611811651b4730974801beca03722f4bc7aa8fbe5c1c2d0145c1ccfe5c0fbad0e73ee972f465739fc143cce04281bdbced1cc6494e6d834e5ac34f5d0" + }, + { + "tcId": 629, + "dkm": "74795e2a2d16e33f5d9b471c1205a8ba1979199aa97398ab528da21ad2627812f08c31e0cae99f997d3f5031fd312555869618484063b7e4b8d7f13f14e1dfd2d8b7bb0e2ddd0dd9d1dcd84b406d748eed21888ec2a57e3b17ed675dde92c16773cee8c7990903c06ff2899fb26ffc1d218bb112c204979e3e327f92b4636199" + }, + { + "tcId": 630, + "dkm": "97ff692798a27b1f2f9d80f5199e6e60add3e7a322e7230ef45608e427b057b3c3158b3e4bd581d8f8019f1cea9ee5706d7628ae5ea8f02da88c021eea9a28b6c6ed29aab8818498cc5f39d87d2f6ba7c2365e97c6a21d850e3848b7d355d000903fa16404e804bf459604f4f20a46e56e7fc0b23bf66889c60fc11174162638" + }, + { + "tcId": 631, + "dkm": "c8c14a6cbb87411c54fe9a75fbb7b39d355c0fa5f0c1053c0727abb5890870af9920d7ab6ae47f1aa2fc36cddbafd0fc42ab58eba4a47d8d97eabef6cc172a68d9c17c361b30e2b48a5b09402c20e946f8935fa1638e35f982c9095003ace972b5142d8494352f42d14a74441c9ce9bc506c52e811720be7961b205d46f388d4" + }, + { + "tcId": 632, + "dkm": "201fc0de69f4e0d3a39c3f9109057210750648ebd52647db79086e4c466896f800a70510bbb48efc9207af36ce65d44b9cc2e5460ebb6ed584c6e60203e394e5982485fb4a9a4731ef887441b4b32b4c2e53fd16b6dc0f43c6c7d0ab80a0baec1c7d7ac8b0c01b20528d2ffa3c5ae4b6ed809f2bbf1137e6766410b5c8afa3ca" + }, + { + "tcId": 633, + "dkm": "94239bb2ff307093b6fc1dbe6a3e211a4eb90ceee7cc04b5c8b0bbaa8c98a4ba5f23184678100763eb70cd68aee67c9862f2e0c829e0e8a9b54b16d3d6154acff9662142787697e3d90ce3d9f1d5db58fa86c62d0c3db6c27d83e7c1fd63ecf912cfc2dadb2be78977cf602ef8be8861aeb58f1df9dfc592d82cde2fc12d47c9" + }, + { + "tcId": 634, + "dkm": "47ab94ed72828c2afe738371e002fdac93b83d1fbb9e4ed714ece495866ca9677a5a788c85b990fa926f0c6ab0736cdbcb31b23b594248a99d440fb9113935bd952d129340fb91764bd8e95f05b19188d154ac222e0cd5defb3fce9d85ae222635d4b76221987de44ce4016dd0f7ac29bc7249aaf8d44872dcabbb7d10723cfc" + }, + { + "tcId": 635, + "dkm": "ad5c0592a39f35f330dea959ea4bf31cbfc4b65e53e2f5367d2aae347ddfed372e3a4ae1f7538f67981bbb9281a53c7d942c74744f7fe1a16cc316b186cd6293f41e3f9092e1fd04efcf8481a0402720ea6da5447b24f77625d9ac8826177c071a9bfe3fe8e944927750f398b673a44b5297b85b01d043c0a83c41095fba7c31" + }, + { + "tcId": 636, + "dkm": "ad76140e20ef0b24fb99e062fe409ec0339adfc4aab157e5ef120c5ddc4e9f0964f701b63c9a31f1c628a2c11142b7dab17ccbc572e8083bcd487702a39c19eb04b4fc85b0924a6ed00aa8118216d48938f407ef754dc3afc55ec111d387b18348764bb4001cf58eeba1c52247efdb71003fde46fa67146e87f77e4f67614b66" + }, + { + "tcId": 637, + "dkm": "dc431ac454e2d2f61faa1537c874cbf77ffc0790b1b45e284d1ab66c50ef0cbbe9f39d37c239b8d1440f45028d1378dae4f73f907aa4de783153406acf66daa5f28d1dc7313b9fa6c5bbe61d7b3b8781f62d3c82e2acf877b9dbbb02c5423aa847ba8f25865417e976f5f60b9839abedc59aa1adc4beba2e007448ccd66fca6a" + }, + { + "tcId": 638, + "dkm": "a417b82c4e07c2d010b055acf134cd6a3d35b53cded62b21729e37724efadbd92cf83d7b0f45b59f8bad19acbde7be9b2de20f22f330bda74835c3780218c426474d3346ad81b2796a0e9fcc51b4bcad2e5b11e092c0b4f3a9f598d988a5801b85523c2fc8a920539b3610a978626b41719a48330b8bb8b4275fc7a61ddb3fef" + }, + { + "tcId": 639, + "dkm": "ddb815675e5c80f5219ffee925534f72ff5cb00dddaa63be79d7dac1f2c1cb14425522e7154fbb9ebcb412afe5e8f569cf2016412618400b78453883e9662b9419bcdc639bbdc11d464cfcd1a8270b9eb2a02e683af5339588c955827371a9cb0a1a6a06313b8c2a744231824bdcaac43e68dbf69a680ae974f476ecdfedd723" + }, + { + "tcId": 640, + "dkm": "05d0d15412ef99ec125f443c48a401a26de7714efc8d0da88f721c554edb226a9feaff8e4eaaab1a5e41ad8d7e09a8b0e0b773109d24361c8f5ccca0f23d61f8ac4d99fca61643a56cf0920bf0d98926c32f36e7b984fb23c5524c197ffb48c595c56b159ef24bf00c79523243794c5b89aafb8cfebb9fa5b3bb1cb96b46a154" + }, + { + "tcId": 641, + "dkm": "92550dccbdaa65f525f6620573670756fc21593102971a45e80d15b21cb490eee62c942c9424491508a4166c786344f739b5316fb7f6a1e994e73d9574447a5a86574b951bc85161e348d8ab0a8fbb947c080cc700f62d08c9cf02e31820ede1cb63a5893bfc6487601c2235948c4b5c0a504040e953c11c03ebaac0d53163e0" + }, + { + "tcId": 642, + "dkm": "5aef27a21f2474af05b44cd955a5eba005e1cea797b589229adc5a75a582bbc74698c9392daff4ccab3423fe90f92e6f01659d334351fd36ce8381e83390cf0522181f42c2b88def357a5b5f05f1c4817c2385c0a799a1527b9cc88d2f5c3407a6722ebf7ff3b6f4ce67e3ce4c31fd7ea80029becac63d42e419200a901abcdf" + }, + { + "tcId": 643, + "dkm": "22caf5b94ba394956df7d76e43961d31f906f424b2aa96a2a09f75037723e4481c045d34736ac682076d4b2766d6743567db55563c194ad1c0a0bff1d5e0ce1ce95dbca79949a292a034bfe5c1e56bb4fb9958c7b23b4cd11b39604067827876018c61e6d75d4338478f6e6ec0698d6942f4d80e4494f810a1e112b906480df3" + }, + { + "tcId": 644, + "dkm": "25898c873fe9a1d236604c1025c22b16346ac519aee63a82797067cd0bf25cb9c5df632171c07ccd0c44b29d01c96c88ac208d65dfed9d9f79a9a927e52daad71e56e7f785f5082113ea481c4f7d2654bb7217d465c09330b3882547d5ccaf5fa6b26ebe40a25e74d16e4025ced267a5e39529345665956098a26f312ba40bbf" + }, + { + "tcId": 645, + "dkm": "bd2591ce0eebf8b0b6ef59c53b684a78271654e3e8e69f2bbc664f7e32fc05157574c74dc32e637527c30ef6e2fe6b50eff41c44c52405c2c56ddd3c88917461e07418d7c95a77532fd0f627f218336b52b64028e1ad47f511de149b589d85479eb8a7e8338b8e24bd67ff840a248fed72e7173792c9a06f408e4a5e7d93b016" + }, + { + "tcId": 646, + "dkm": "f4f609682797c5a71f75878d5900d35745a5e9fa84ccbac4ad81e23767a342e68bee4d9231cc21a47172c0f46915fb2f20fe3431fe4db8a4886ce11741bac268e2c575de1689877e1ebeffdcdbf8fa01ef0d215b56cb4e9bea6cba99ffec8b10efe0500d28b8308d42098681da5a105b8bb9f1e40a790822f47396134c7cc759" + }, + { + "tcId": 647, + "dkm": "ef155f711892868523a5238e9a060e8ff1636c20fc5cda60df3301e8add89459cfde9bb8f019c565c830535fda87b8d3f5dee6c2372b32d654978423734f0e8c4d02b5d16919e366fcfe9cf597201d6b5ce16e46b5279b7a92262f050d3c4298bacba6343ab7a8104854be991dc8f5c91ba986fdf4501366559ca0ce0ea7b4b4" + }, + { + "tcId": 648, + "dkm": "8171420f0c147500f0c32f1d31abbd9cd7d0bbe48c111239fc0a48ec5283ab4b5d8429727b0eac2029702cfb62226da18def89c347475ef49573e5bf1fa8c38cfa92c62ea9b0cf3f6e6d86b6af3f61dc5bec375aadef7dec6261771ea95b5452d46ec0f1c6166460130a4ea6f3eb50e70361757ad8ad44aa142da3bddf9592cb" + }, + { + "tcId": 649, + "dkm": "92d891c1f95ad73649367ee5fc4fe583509f85fcc3c821795a5214db2ad0e69352d18402bbd0937f953e9c9d4c00d97038781e8e21af17f0bf264ec3b6ebfc02176580ae7f24dad4acdda2d17ae94236b487cf3bbec228a0542f72731d0c2ae372c1dd2f45938bef8b746352917595d60ad91b5b577e4811ff12ffc3a4db87ad" + }, + { + "tcId": 650, + "dkm": "1ff445965e290243491a617f4aeaeaee5166c5a369a45a5ef62409dfbf9be1cae0fd3d8d94d8b3645215ff19045ca9659980211c71bc1e32e1737d6dd1b64aef503f97d90923ca6be15c69fb2bdc1b9a035c816dcfe59b3efd14b7a18c7e936de95f1e60e66977edeffd28876a946e6476455b3e66b3b88bcdb95492164c5367" + } + ] + }, + { + "tgId": 27, + "tests": [ + { + "tcId": 651, + "dkm": "364829bb45fc475c57cd1d8112ce5fa87f8612b30fe5843b01d684af957795db35397631f193300f659f5c8afa416c1a39f0f148b9fb8ceb9a3a174e94f9ac4867203cb468ca9917fde32b7d3a8679ae5b2497940223d0d95481cc948606e85e2c206093eae3a424643b33fa7fdfc6747a2b8536552bd2658bab0e1735e7ca50" + }, + { + "tcId": 652, + "dkm": "de8ecf8bb363cb30c876f85b2eda4fe1046414bae9b3bde49e15ba2f0c3f74f47cfbbc39de56133644423c266b77810b7e65e435867552601229d59c196f7184ef74d0fd28325a8565ad81ffe530ef0b2387660cac2b9d23549213f60ec493f0909f9c5718ed1c5c6cbedc07e4e2942e543c4a1afba9357b549dce5b726eab18" + }, + { + "tcId": 653, + "dkm": "a034b193bb5460d03ac85a718dc16fd63118bec1e4abad72829f3ac4b0bd8442c42a98c3c260b3cbf06ef596e31ea1ead7114a477e443be33572f1c08919b1df808e60bdbe9adcfd300e25672de74a0741f214dbc53ec3d5392fa577f6b777c8322597c57f0dd4bc4d4172068f89e3daf3eb90371d966b3b5eae49abda014b61" + }, + { + "tcId": 654, + "dkm": "8208fb735d8d08ad1eb6fe41d046625a3dcf719fc22ef3b9f98f7da553faa7672327ffe02b41d97d623ce1b6c3b7006bff67ad5ca2a81862ca1b90c731b74d183ab0054c281dd08cdf7efdcf5f229cc45fd45ff94e772012370c8d7568c06ad87296e6ebeef56b6a9d338250933ec3bbdb5eb2429abe2781cc8e2f1864175e75" + }, + { + "tcId": 655, + "dkm": "a39d9404674a606c8aab3dfada3fdef9d2bf2e15d0a37d2b54e07996b6d077a3f0f171d015aab76b7bfa04838cf1cc1f6d4590f3b065143153cf7928470dda54d574f208c630c14da1734179d4d67c2b6b6d0d6f726c94d7349d79e6941230b3e3157e306bec3f04bf6db82b35e7f26bb70a65360df13e7928a2e7a8cd72162f" + }, + { + "tcId": 656, + "dkm": "9d0ad039745815b6aee5dbece219efb80c49ca5b0eeddba919773ac4b0898b609df9118dfce964cbce8035a03b9a990fac8eb81620a8b0076a07a6a1d8e36c7bc87f16b382dc4a65afec1dddff6931284d4445800a48467dc7142d3e92b4e87ebca5136f0eead536ebe3196740cfbdc8b801f8fb2829937485d370f8c787880a" + }, + { + "tcId": 657, + "dkm": "7ba5a581ff18a9fcc094a3065a0186a76a9f6af2f2103021e5891fbf6e2cf7899117b0b0c604f13ccb8373100ba65e2acb90caeef799752c86c4acd7ec4efdf9c536c80cb12b2e32bac5d26a60649e804cd3e7c0ebb858dd26139be8773574160fc95538db6efc88ab56045ace61b06b832dbece6d47714723603636a6ea84ef" + }, + { + "tcId": 658, + "dkm": "274ec4a3f1e4e2823a052061019ead5c50260c01cc7214873c61aa65b43fb50fad397a1bf35a26e0e1381f363fe8b4efcd491b1a73eeec5f77fbcc718d22578800808cd6dd3df70b1a5b0512a8711981994b930eb092b92ecf6949839976cb756bb6c443906b3bdb154bf1d099c0c235c4154b4f83339576050a5ada873777b8" + }, + { + "tcId": 659, + "dkm": "f12585bb98c4376ecd093cf1184a6d15dedc568872b50e5e0e8094b7c4c90cc8a74570cb60ab558640525dadcf35c56f6ef4645aa0b7eeb5fa41fc3d88c43a24842d46eccef8325078bdfe7838906e3bf61073f473cdb2ca7485ebb1f4d746e6a9cdbba158c6e96a1e1bfdca59bb0e4ae36fac20571b360cd84c51cf4d16c488" + }, + { + "tcId": 660, + "dkm": "cee50d9d223073c6eb8d036e84c7b2ccd58c2e81e3ce8b688352472f6d8211197ce3eead2e718fe73bb7d6fb6fcb85ca10b64a02cdf8a40714f7181fcd168e809c0981d4f7c3d6af0ae05613c405a1a22f0f5cc11bf2ebcc444544da249f3afdbd72b47b163227de1f4eb870f99c52509cdbb12238c6cb8ee35a8f604ba51068" + }, + { + "tcId": 661, + "dkm": "e55857b44cb9a0540a574e118e5555f1a023e6dcfb0450a105160764307cbb104c94398119d0be035dd57b98de9212b002cdda7652033621d3618c672c0bfd7fd467d3da650a56420e7e1f6c8a67bc748e704b6017cd352cddc4cfd68ab9ceeb4a466dee247e85e42e4f5e9b78188917dd398016db23a67295f7a583d227283f" + }, + { + "tcId": 662, + "dkm": "427f3f0a01094a0f2ca0eccbf0228f47d4c94d0a41877923a41981f563711c30bb7236e3b64e81d439cfc00a5e01d6f31b1ae891bda2cfdcda7a35d17ce0ef408ee5be7426d03f1bb56f1bf66d891d9a7879e6b989bcb0f7a5cd87de58b38d9e06b9bb538c1aa2690258bef60bb4c7b9b0969aef6f2821bbb28047abb2c6e5aa" + }, + { + "tcId": 663, + "dkm": "c5a286932b1399cf2879d18e5e46b9dc51348d9996a3a3372e842a16dab78b6735e1d65553b3377edee9d1ce250064b0fe2b68c1af5c4bc0fb6cff766e878275acbed680d394c4d84994e8ebcf5b69b818cf2d2fb89f97100809ffb5046e0c10f1a29858dcc1920010bbb345bc152a1635c8fa7fce59e2d8b47e3598016758e9" + }, + { + "tcId": 664, + "dkm": "7d14056186f244e6411a3ea8c43988fd08128bb2a327c57ea8f732230f2f1fac5c74e291a9b7e509d0195990725f40f65ea1e6451d505052fc3d614f97762f8509c84cf297dd5f651a0588337eb9e7aa4707d28df8557e24f5f34063c49ad43133fed73ad9ffd19c20e41a77950ca38a7f57075a0e0cc0945c82cf2c40c04a79" + }, + { + "tcId": 665, + "dkm": "2d12a35872b6db9f35581854786c70275e0ca9cb3cfd9205e2e8a912197992a7a170dba450b71a13a5d7a5fe868b13fe026b1c4495f3dcdaef38e01cebeb8bde954e4fad0657b18e08eac076e2a86223e22b2916d87697cd4ba16f9a9b5fc50fcf5b0b021ee592497f2092d6e43a2c749eed0fb4cd64fbfc280b98f05d8fdc4f" + }, + { + "tcId": 666, + "dkm": "7719d2d789c34260c64b0121dc6573eae416e657cefd50bfa453c1bcb72fbf72bdc2b263dada842c13c69cd5a1e81d20b4dc1f76b4bf4f23efa2fd52034d0a4e72054daa62272842d803dad60ddc3946cd36397ecda30dfb0de3a164ca32027b076a3a5806bff70a68c76b73be80e73a76029633c92b4798148baef43acf94d2" + }, + { + "tcId": 667, + "dkm": "8f45fdd423c51de41ee13c2918ffbd28d5e8f028be00241a6d26ac3065fe363b0f374cdc66dbfbcde4b902de5d8468120e186291aebdda38045a5bf23a5dbbac26c9a9bfa6be629ec364f1cef76a71ff5128dcc230034e053db0ec53b61692f4a1a438fac7929602bc1a628f3a72aea994d4e419b70d3bfda2ab4db41e77c082" + }, + { + "tcId": 668, + "dkm": "21226c262b3b70dc419ba567f357850177e896b779fd02858dd347a86e67a6f8649bf8d8dcb1d22a273976cd592ebb7a26dfa0756e8b43a01964af08ca6889ed4bd481279daa35cc58245cd735f1830d285c06e9e05a8aac085b997a06865dd8628ab45b73e4516ae201520e3384cfcae93c415a679f38f38d54b4e3fcba5ac8" + }, + { + "tcId": 669, + "dkm": "40bc4a3854bc359559900a594a33e7b9d969c257388f9b465f3a842b6a4d503ebd7177925cafa553e679052598c7cc90e6baa34dfef80641fdc07d14996aa0ab8f249f619fcc6a62e29462d79891f6e27dd9c6bca1756a47717c7efb27b2554be367715d1fcd2e0e0693a45d041e05057c21fe7c64a863bd2d560a3123010c61" + }, + { + "tcId": 670, + "dkm": "e87952d4c7a8f995c649b82732f5ba1d82d8fec71d87a8d06cfe08e9bfc9d9e12eac389615e9c7937c763afc9da968a3036276dfa06bb1c88cbb488d3fe771a3305a1684abb4126e7309c74d9c1813763aa0a3723defaecf043b6edb376aa31f1c4c2337289698824724f9373bb89c65dd056ab0ce9a6e7c16cfbcfaa47160da" + }, + { + "tcId": 671, + "dkm": "25269674196c2d235e42ffea78063456ad7cb0f4c338e923a2c29aeeae83bca8314a71f71bb9d159eb23126e21d00390d18c57c745a0fcc30e75121b64127fbc82ed214683676a5cbfb543e0aeeee9571db019bf595351dc68812eeaa599ea90465a1ccdd6fe03a3b88845fcbcd2b3fc5778eef9fe96017f4b7232c64e06a755" + }, + { + "tcId": 672, + "dkm": "ee5245d7e0f39ab3988682b8bfc3f5a7863b1be909a5fcb790680ddf3a617d9f4b9b0c3c3795554fda383b2ba1b92683779c637cf56346ee3f04bfc47a5f9cb3a2872d67d0edc010726dd278bef7176130da3a8399074bb83e2ca7d2ece04d8b47c90dc169fc928074cb7958b92117cb9c4aee07ce5a05b3f16c139617bbe93b" + }, + { + "tcId": 673, + "dkm": "4ceb817489a18414efd68a78dbffdcad580006ecf2fb41b168b65f0be92d98410674a0e4cbfe630c5dd2096317304ec35aa1a6b519cbd7c32bc64941cb9fae7b407f9f7d5275c3e1976e86fc69906a1bf9aa29e1607a2265f9c824d3cdbd7e40560cfa6a659c36cc598114daabed6a948ca0b8979ffcbc4e4a998fdca47c992c" + }, + { + "tcId": 674, + "dkm": "7a5ce780d3c83dc1cf7cca1c9b471888bba896ae08330c5ff445de646062aca10e089cfde6c663706e209eede8a8c1ea617b95a662ef5d46ccd1a280fe72c2ea1ebc49fc6729a65949ee312818e41cea0c27959a4bdd8ebb03403a5532c000786386ffc3eca4bc83c323d026fba6857856df75ff3da4cfe845f2d883ac719543" + }, + { + "tcId": 675, + "dkm": "0c09b573e68ee5bd381ddab48ca1a60d8481e16ab640be391fcfdc5c2b8d8767fbfccb7444fccfb43099d5b84bcbb403befd336b4396e4d055330876605808c6966d8b99b71bf55119782f9120caf6e8cb1b6f41ea3ce2ad4c8de590bc0f823e42dee55b192587e3e020406cb503bd0770a212ea836f285a7eae73136dff43b8" + } + ] + }, + { + "tgId": 28, + "tests": [ + { + "tcId": 676, + "dkm": "421a78373c6bf7094830ab27d9094e531d253ea762ae4bd3fbe6adb71a44c7ecb233350e362684ea80ede08dea556724173b33f7f94d3365e26339c99e97ab1600c8c7c6140eeb0463a6e6f5b0b9fed98440a1fb3003d1a4743c2d7fafa1255bc46bc046fb9fae8d90f8dda5f7f81733e2440362dc71d338fedf406de3df4ae8" + }, + { + "tcId": 677, + "dkm": "a6d0c70e6046966ee8806bf3ab9820e833a4262bccca351a78b8b0659e341eb11d9c6355b54e565863442ea8c96043bfe63a3cbd2d76a41246946de80d01716d63872926895f1d790e91bb981734a980ff16d40d1efe4a4263bec3674cff706c45111496ffe8520e497bbadc2ae5f76342ee3f806a4a01948e45f0449fd61c8c" + }, + { + "tcId": 678, + "dkm": "beb661f295d0351aad2a3ba29a6f94a458a1423d5064a298dc5a30f1db72d58c39346722ba0abd60766040c7e9740ff4b1262dc9d2d4a7d82b06556e1f5b5f5f57041d927320704e6615a2729d84d80fbacf5d0ee888b26e845b4e875c55c1e780e7283716c1855c9998dce2296edffa9e6a4d7be4b267c4ef3a1fda161d1e2f" + }, + { + "tcId": 679, + "dkm": "c8dcbd423ed930fe798a09988a3fcca2eaa1c30b0466ef84373d4a4c13fc39c85baa466b0224c1e84d87199c0cbccc0455fdf4240cb7e9830716dad251314511037bffcc4d3c5302452d65b88d869901463043454b001ebb461d6dea5d410a06de6561a8e857011e77b077f0fd509b22456e40dadd856fb3d053b6f03f66b06e" + }, + { + "tcId": 680, + "dkm": "6f6882e9fbc5c857b1d5faca35193225a32e639ef83e96dabaf0a224fafeecf8c45920e473d3dbbd2041646b1f2ce0240ca99a20106290581e9e367d9070988ee17b549971fd2d7c681169f236ec1920552853ef8cf1211af251e95dae7528ddf133845631c4b9c4efbe315af008d5b2cd7a6e4f3ef1a9bb42370a4a4e3967bd" + }, + { + "tcId": 681, + "dkm": "9090c196771f1b01fbc208287673407b9afdd8fe5da04b0c42157955f25beed92e0c59f2190a3a58104f0d91bf5b364e163997c6dbc13b9a959c6c7b41d4e3bba15d6ba67b1bf920cffef1123daad77c3091977b3c521f3ecdd744a0f573421f7eec341f4bf52b38abfa62eb4a6393bb278a4ed2ab896f91321568ad614aebe1" + }, + { + "tcId": 682, + "dkm": "be4eb147457246be2341cfe18ffe1822356f2b17d0930ab856530db1ce0123cd3c1dcbbc37988e005426416c8a1525efe7dd53076f01348cfe85c691bd2523c60a0436c4633043a8dc097ca372c29d28a5980571091636929c910a8bfed5fb6ddd892424f180090adb35a6a343f0ca9286c6c952759df5844d67c94958836035" + }, + { + "tcId": 683, + "dkm": "9396086c7a5d18b6dbc7b28d634cc2948636c404efebbb9555d53f301389439e2644fbf3e2cf8a4a6b5e203945e852b27c83984edd125cc91b812c0831cbc8755b0e4c07d15016956bd73d72df827ec1570d93f8f52e23bcd5fbade664abac47bf6c8ca95f3dcfb8085334efc0e82072111ebc20dbf0f0c16ae80afe1c897e45" + }, + { + "tcId": 684, + "dkm": "f69d7ae9d1eacddf4c594f2121d4030748fd7b16d205feea73b085d24b6d5595bb71b03dcb4b89499bbe370430a2b9c556acfb4af5061d0a204ce325c90d66fa42da83cfefe7cc0236dec93c7a5e00e2b6e0af09dadee97e3d2a81577b0c6cf81de2a4c0283257858c7af9e8263d328b413ebfded5e975413ebce4e004443611" + }, + { + "tcId": 685, + "dkm": "1534c3d1a15ca07e5c98374ba99ad577144516c5eebdb6f5ada93a74edcfc87c5d96739e776ae3dd4597a8181633eff880c1688d27b1832f0113ee1cf5cd0acbc3ecbe61848ee2d7d5d41da4ee1e1d351dc7830f8f07c75374d4dd318f723e708c18404d2c19d913ef61ed85c6d3e522e26f35afa1a5572459413e999669669b" + }, + { + "tcId": 686, + "dkm": "7e5d3d59af55b5b0f1eabaf1729be66ce51014ace2267779c0fbbb2f7e7cccb915ef9dde7f57e4f1b75848f6df6e07f2999d96b884403b63e891abe434742bc1f4af17cef7ced3ce685c1456f9f9b31f2336124e9abda1b4d9e58cca8388f8209aaf536e61afc39fad62003368d98b5a687f33d5f3a27f562560af2d02cfe733" + }, + { + "tcId": 687, + "dkm": "175083a3f0df267f6de429daae476ed90be19d4ed142870f034c1eabf7a760a9c8a2a3700b69199a1574d43448406a10470952a2233381de0737f4a77e6f1094e43974ab64a10476695e46e50b0adf90c3c2bea5b57c001f9472964cb57fbdedbefa8d3b56f07453c56b736685b0307f7c0b6a6875dd0dd0a957b0daabf3a7b0" + }, + { + "tcId": 688, + "dkm": "38b7d096c65ab9d2945c98cd405325f005e0e102eecc968f26c07aa404954408be6f6c0c559287d288d777b003ddcf305e449abb0e6fb47b9f335079954d4a7226c2c0bdf05449798a6245cfa7560d6710682f0e56b272243d0bad49573e9ae28a259ec72781bfaee6832ed575cf8ac1be3a6f01b55e4291a18cd26320ea3d4a" + }, + { + "tcId": 689, + "dkm": "f56c9ae8da0d805c3b5bb1f0f3b5f81bf5eced26d73f22bee8167ddb5535e6d47a40364a3e0c00a76c7ffd818a3ff9e11a79e8e46d4eea09b1cd35fee9100574dbe6d849011de1aea0dc3a3a751c227375ae806a2b1cc7690b8829e14bff873f95f07987c65d18ace011a6d54741a2fd67ed1fcf56e9221a19d2b4d66568f9bb" + }, + { + "tcId": 690, + "dkm": "a2b1b51b15843c166157fc2444a85ac561145608fcad465432336c6aa85a9b14610da0666e7af9158224da91c2c336cf56651929c931df43b2e4a1bb18c0f4981d106b1bf5290b34ab5550968cd34d2bfe9bd58c6a76d63ce1aea15f155a3dd1646b1549d353a1da308d3c7cbc9b4bf2c430d9a5fc112b879f3ef3bdbceeaf13" + }, + { + "tcId": 691, + "dkm": "d1855dcc7735fd4aaa9ec6250067959a2bfcf7b36ee4f7bd5c0294af3afbe53f97dfb16f712a01370f44e7695babb686c740113da056c2b280c82b427ac90f192250df141c805149d6aa77f82e3a45eeefc321eb6731f2818bac223273b87da66c85895ce38e8246dc0e1966e2879a6947537e2e2ccc351cd9ab5d0f824dab8a" + }, + { + "tcId": 692, + "dkm": "c48da66924ed0b3ddb346d14a1fc4cb9e4fab1dc51ce1e8754bf85583d6319790056539c8f797f31798169156dcec9de938d43a954eb1809ba4c33dd41b8a4920f64a0bf268969a9e2ec2f40dc837540522f44a1e24ec8b8b4a7356b719b4e30a7c7003131ee8872564d028cc93af6bc24f26faae837b66b4156e8dd3b9b73a2" + }, + { + "tcId": 693, + "dkm": "9d48078b76949caaec7133c9dd3cf898dbdfd5d019d68f3f69dec530e32cbc841bc8bf4d4ebd00d7376c5575f11c08be53e1733d62f7807755f9f70e27aee165b204039702e382522542a950b2dcd662fd2c85923cfa068cc85edf72e7933dae46fd2d6c296ced8e92bfc637ce7afa95b077318e04c1274cbd2b2dacb1ea6254" + }, + { + "tcId": 694, + "dkm": "5cbf3e0a8a37f235e98264ea500381b2bc0e440dd167e61e4a7421c2ab9c7f47b67837003cd9a7b7cfdd94e90ed7bf1f9eeba729bc9728c9764e2966a904cd27c97d803cebae8f96b6f4f91ff5a49c9e40a759e49c2b932f830e9dce9ef4e6c14fe49c93b13df637ab857bea981c9c1f2fca79e25677dd25a29121729a2bbd3a" + }, + { + "tcId": 695, + "dkm": "a3c755325ba8060a22d695f5e352228330bcbb599ee5665ed611679fbe48e28124992910d3851a190c33e090e3f7c9d513d07da0de145681d805cbc97af30f1efc482518f29c7cb44e7f102db5b16a9d6a3c607046a60f5f81f44fb0539148f297897acaf7dd877b76d90751f83b133ba270c255efc01e2754507c6728ad09f1" + }, + { + "tcId": 696, + "dkm": "3bcf7a7e8052ff2004bbd59df3eb579ec52d6530135d2044cae9490dfadc7b60a50c24dfd37f162959cd0f5b185136567d9450967f79072c1cf517769d8c3404e0bac43f695ab928eb6198b9809ab0d46336e912481493c7422603cbb533909779731cef4f54e5cf8a481f8eb760388275c4c397e09eed409be7eed3f19247b8" + }, + { + "tcId": 697, + "dkm": "0811dbc5b19453fb77371ee2a2893394a26a54e15aed131bbfcac67dac1fbbd1ca965e07be1015c51b995ea55e128d7cbfd4f2406a1a9558256092fffedaeccefaba65345bcd66b699c3e69052fa6f43b9d5b6f6a09f1de09aa4e74d0bec5e7228a6cd6b80b1b928528b27b35c662dc5ed01225995694010c2e0a0b8824771ff" + }, + { + "tcId": 698, + "dkm": "7f8901dace267bcd929835d1e33028abe6534799cb7391e794febb6a1fe6010635fcca233f61877b5b7319d036f89c0d8c5d40ae7dff4f6f06d6eed862b93397982a97bb894131f798c773c32f70de2d282527efcdf37ba6cb895561a95768e0be684bed384b8b2cb96e7d757ee71218df20b297a1edb6c424ec55c8e7bf6243" + }, + { + "tcId": 699, + "dkm": "c1fcb51fd14914b67655449f65a9f71e26b46c48553d32158815b9772155e728ab1288dac84b86c14b3e0fe4fea4e8e33fe438a611a1dceb99c627a3712fe330e32da10222ce558cbdbd23d490ddc3c9c5e74cfbadcdae8f3c7987051b2c20225b3d060540befc354b8f65c533f1fdbc6c28755916b5ec821ef14a26885d6137" + }, + { + "tcId": 700, + "dkm": "541cc65dd7cefb36122eefb5618ceaf6fc51fd9ed0c11e24f6b4e83fdfbed914d3e57f89df81f218cf5fb7c6668b38fcb11e8dd7ee36fe689e80ebea7a6bb330d5f85e1bdca792a51e528335c31840be3bbbf3f8f1c8989ecd41a8deb6e958edb563d0906a13ec86a828d3b9f925b4dc2483f27ec8a2d4dba2b829e528c0a349" + } + ] + }, + { + "tgId": 29, + "tests": [ + { + "tcId": 701, + "dkm": "882d06264edc80d534ddddf664478537d50cc203625e2d94816e0cb703b90dbf17f1ba91fa4d8b660078a3cdb56d507e5a3c61fc76b5654077d262ffbac09140fb346c1c2dc143aa9d185c786b30e945019b9d972939e98eff934f6d5006982ae866102622a392bd1dbcb27554deb3c1366703b53bac9f71f7a58dc872d66fd4" + }, + { + "tcId": 702, + "dkm": "6e1ae65ae476ddc6794c44b2dac65202a8a93cde63ddaf39f094fe78e18bf9645c0459779842e11d07ddd1d366bc070ce84483131a19600ea689bd80c45ba3d8e487cdddae394a953168fb558cd31ffeefd0d80dd90ce8344b2df59cf9a568e58d3b87bc217d8d005a562a8727cd6e724e9fd53d47348ce676d30f5f62e7bc40" + }, + { + "tcId": 703, + "dkm": "b56c3c06b5ec59f22bb2efbcadc896d83632a7db2adf12579682f15c6de163ad8437b207ca5cedee7b3e9dac8bf2fc2bfa93ef50f9c20f6c02f1e97789abd4c50c37d8bbc407c6240404aef4c338e8ba05d9259ba4cea5d75184eb8bd54a346e16020dbcfe872747c4644fefe814ab85fb049ba2f79250b7151e0d1140d2f69f" + }, + { + "tcId": 704, + "dkm": "a20aa04bebdb6b09b356528475d978ac1e3623e149d0a8bd45f2687daa3558eff776b739ec3976eed0c24422abb775ea41052c9795f55a8f9887d7b8df6f3b13018759213d53c1aaf3ec91828e0caa9fbbe9c53c6cfffdcc9243622d98e7109da924c39f8f6845c4441ce9817dce59f47657c49214f2c55234734b30ec7c9e7c" + }, + { + "tcId": 705, + "dkm": "bc1530792eb7a0cee859109dc19c0c21c6c79d9a634817da9d7e1c0c816673bb8689505241b7853f0f21c8c27e1f238ccda0b08e5e94a7b480d6774ab0446eef66a68d75eb785f26e76d8960a35330eec0eedac973fd99d704f9ba8d1dbc6eb79fbdc268cd159b3260fcf22a5992a054c1def1b05feaafc557c93a161d4e4db8" + }, + { + "tcId": 706, + "dkm": "c1b4adb075d6d63e05e93b7d57ad10003ba11723d851b5b8d5c841b79b3ecf8a79c201f526ab31bde961a8767941f1aac9bfe717a8f2ba213a09356a997ff54aca01c051a21bd3a63963962986f86bed1511f75dbe17c7fc114fd51bdff744bb049e6aae7ae29a90540583f62e5d22d59d4c1d9eb3ab0b764d5461bae8f81adf" + }, + { + "tcId": 707, + "dkm": "0715939b58ece30eb633f97034c8a6940f6e780827da9cc496af53f98c7018226ba8ff81b007f0fb614cb9a808bc9f03c1050ae9bfabddf53a92a1bf6d69dc250c59a547e13e8935607fc8c5435557db735c3a9f4395369bf1f64d091e6299019e997af7729393829af44629833be11ed32f9df69efda46f5bc6c2396c69f75c" + }, + { + "tcId": 708, + "dkm": "43d39914d1beab669dbda02bcd1ab02a41f54c78efde610c17aa8ba8dbd6f384a1d52a952dae61bae57ab780db59561823f0fc107ad4d446850f4d1c62a7c6515a5cf745429552f9eebb87fdde0eb2d8a2822e16332111884306e18b3df074d2e6e01a35313cc37a9f93c0b6d8105dfabb055d7c9e08aef2f3ab985c58e97965" + }, + { + "tcId": 709, + "dkm": "a3c307ffabf42470163953d08df2e2fb6f874e376f6533c67a7f5a455db4c815cdaca3acd4a0d93a59dda6924d92afb1a8912a26e5f71e570916a72c5c421c4834b375162c3b7bb814fbce0e5f0fc794f09ab7f7f315f45dc1985b5f4fb369b08101247ba201f6f1db9ac13a3e3cdc8801dbf213288c23b2f35f7b325fa1e369" + }, + { + "tcId": 710, + "dkm": "1ed6c7b7ec2d03925240281497e6b9aa8591c643eea69fa35a7a03335f97721024da70165f133c76031ef8faba173e6e32e79cb8dd1a8edd41ebea2aa71db74b1d4993e42883be40b90ae1560cffb58e51d18d5ca333632671e342459fa7ed5b54d2012c2c1f25b0d166ded13a10ad2284004f3e47cd59fc7589f1e8405f7f5c" + }, + { + "tcId": 711, + "dkm": "742e57a78c6190e2d24d3792e81eee0bdd6e6c57f7b80cc7f4b516f98bfa56b423ae77e4be0a9033346e615faa7a076b9c08bf989618be5c6b5dc2e3b5370830bdcec0590fe7ecef07d8bb80169a519c19190389f99e49ce764312192acd6e452a625281917a7570c98efb73af126b79c53ce4c67da3c9cce3c57d94781e7203" + }, + { + "tcId": 712, + "dkm": "fb95c9f856925edefec36bb1df2fd7ddbea7d9757e41ca32f51d2abbc70e3c604b8408cf2496a51eaf535f74a55c0d13993885b08de60334cb273584205a6fa761e09987c3e1f5e90bddee2cdfca4cb3848938764184ba18f90ff4261feea980bec883ae3be5f4493813078fd09cd2a9fd3bcbd78081f755486d875948742274" + }, + { + "tcId": 713, + "dkm": "6dd931b978471850391ceb64767970f329b11a2f2d3d46ca4b0db53ef01afc98b027f58e9636a01c7d4bae200676e2ae092f3bd0061059584147370b6a0d5d58fe519cd57bbbdbdb9f7220f7d906bf2c605c169c1c9c2bdd5bc7391db6ebed69243107cdfbbcbb8f221520101b1292afa12a74539e9d4ba733a519df025d02d5" + }, + { + "tcId": 714, + "dkm": "87e98a9c088430e3528bee15d7ffa5e14e79d5f15e4b241429dcafc676ad81fc79b880f3b6f5a56fa6e6a9ddb8b389bd1e4f8abbad8585fc0d90c8d8604805f264779f2d161c749d518251e255e53d5588d33354cca182f6ae336158cf8a774e7750a6fcd664d8735a173140afd9c98d6f8fab6bfc39288a6bced20bc60ca430" + }, + { + "tcId": 715, + "dkm": "81cdda0e3c82f8a4dddfd9c2cd1b664bf2b5556c1f6267be07215b43f43dc7578482ec68e742228335dc6312e0723b0b8ab59bc9c45aad1259ebd2f4df334124ee3a2df00fdc0dcf083852f64f63e3ca2a1786a52480d26e926e39b46dd7f15aca256d06cef95e7cf369671e72d30ea68bd3915e9990e16a43e61d990debca70" + }, + { + "tcId": 716, + "dkm": "7c2b8a0b0d718145ad561d4e3918281ae639402ac67b7cd3e100739d7fbf1fb1e6f86de8fc4e7a587a3b75804beb627bd4989643c00a76e7f4f35cb22d5ae6261ba87cd8b92be69c63ece35b774a400cb53a0259959ce0fb86c376eb87438d0fb277c7b5e21ba234b30231e9bbcc1a63ccce0ce4d821de353825a1158b140e7d" + }, + { + "tcId": 717, + "dkm": "01273b6ceb8f160dea7d471599458f71117556b30d697a3dca4e2732353bcdfe8a74dfa7e28ad00cfae03597f4063ae783ebe79f34f6a3e7f5e5ba593a4c164c0540710543093d4741904761bd74faa4b571059ebcf3d8b79904baa4083051cee90becac60e4b21b80e1c43fcc32d5e1b95a37f9b4e7548e001249d38a538f5a" + }, + { + "tcId": 718, + "dkm": "fcc3763d6c09afe8cea7df5afacee408c47f2019d354aaa7f03bc72f47470a51b323d448c6c383d67667735f71a5ac294c2852539be3bbc4f52f878120292ee18fc2850c9f7c7e1da061ef0287c4a42b09e1278849eba40d39b088257e6e77068fc5b7e8d388e7e0509bef2fa5894b86b3dc0d35c889370b0c60b9b43dd7b01b" + }, + { + "tcId": 719, + "dkm": "de2d27de899acf55faaee1bbaa0e23f43e980a1c8d00db3ccffefa452daa8a46781aaecf3633a9d60bbba0d77afb1bba3b83826eb9171c2290937702c8ef06c3697f7a6f0f3c7cea4eff681523d8bc1af0ed9ee0f07ded74aeafee22e7e5496a9b28b55d419dfc1db1a71ddf0703b184763808e8b86a61a416dc6e7f0200c2ae" + }, + { + "tcId": 720, + "dkm": "844e024c22ef70df4a733bf5f10c3a783d2d0fc363254f360fd2599e9153f8a2b17ec02770a56c061c80322a9380f7039492a2f958bd81d1366f321932b9450fd5548d07713e7cada07b38649aeb491eb6d7fc73e29aefe061511e56ed90e80f08e459117402de3656a0777d8915e473dc228dc5d0659c869963dc2ec17f75c5" + }, + { + "tcId": 721, + "dkm": "2bc760fb396037aa5da2b6e9a514760643d75d4b2c06d6284b85a97341fcf9b0a10f299d77803c7df581422e9d974ec224322a8b9a24b35d2a71a3b17e419d66a3b1c2095adfe0885ffaacac48fdb9878dcabe1c8710c0d39a8da83d35a151c0bb17b31646dadb0f23d8dd4fdcdd0071f0d3eb48d4486d0b963ec2bc2d558b46" + }, + { + "tcId": 722, + "dkm": "a36ab240cf010b2da73b9e6e220f0da904adb374fe2d8992c9d2a191c06141cdf35f5d7c523064a9eeb88497e29746ecf2673942e674896c01dbefa4fd02c7d7680da0e3639ddcbe5084034fbff54889158a6c670bc5f7f84a71269cb08bddd96b9a4df737455436f4de98d6ad088445ba80422c3ae2088d78b574f65141956c" + }, + { + "tcId": 723, + "dkm": "535a6720ab6063e4ff86795a33e7af84c4bd60e07a9e3fbe3f283a586c2c642e07280da40400a3e061423a098bb73c6d1bc6e04bb019cf0b98db5860a7c9bbbb0d87b3bd7bc45d88804e8a00d08f1e5325a1bf618962f4a21dba82a0868878af32165a60365b33ce91541bdc172e9921ef0a152de2e34d63b028570c688ba55d" + }, + { + "tcId": 724, + "dkm": "87a03ddd7c36ae1b843e3905b92cd804a934dcc6be3b500b93c72c3b5f4ecf0d48737a8542656c584afb3f3f6fdcf44b43ff396bde73b1e39a43bc86670d8d8f37ed9aa17943551a9cac4226ecc3141674ea7019465dba700713eb7b865cf08945bac66f8ec975fc3ff5af3114c3f4ff85b2e1b8fb5ef74e813ccc571280eb91" + }, + { + "tcId": 725, + "dkm": "8c01dd57accda7fa9ed80cbce396c35c36c5627c8512d492dc54e627df1be4ecb098222d8a075065c94f33dd6fb8bb361b411a6eaf957c7c716269a030770d445670364804171fc1567454c5489891a8eb13c4a053776a479fa9fa92edc079239e9a1a48e765b43396a23396d8559d587be8e8e92372d19cf334f7ee2c370265" + } + ] + }, + { + "tgId": 30, + "tests": [ + { + "tcId": 726, + "dkm": "1eeae1bf2d1a171c7f9df1faed00e263d19fd2569b7823a72521ddae6f08d236bdb0dd84587811074036c9077459e7dc05a15c9822ddf65d8bb659a39c222cbfa0e638a2aec8f282f1b6a9b5fdb9744aed65d509539ff5bf2fc38dad97121f3915cc55f231bc6e7fc519d45d784c4f1ded27ff0cafa7df5088dc0b7de9587f8f" + }, + { + "tcId": 727, + "dkm": "9afa4539591e8bf3a841db5a25791f2d7d99e192a93b430137b60d8c38325ec6908220d3bfe2d5a2dc8bc60e3e1b4a964dae5ec4239e6775280ce0078214d5a677e4f15b66f1c14ee3545d65fdf9a83b67a65e94ff448adcbe56823573712433c17e3b7ea391b0bca946cd807b61bee4b5de44143d6ee31f7fb9fe7f0f7f75f4" + }, + { + "tcId": 728, + "dkm": "61f3cd6822bc719c6c875eb8c583a4a7b24fba6dad2290de531ac954887555bece30dc1300a0d0c00716ba67b9b7152bb8ac313fe88bf0854ea6ccdb5ce94ad0b41258acd82eb580bc5ad9570fa51f832b139c89db91c1f09cc699fbbd1542c946ff4450fc0b4f6a04c425282688af70d4e14f75b38b1c3d1fc96fd54acb56a8" + }, + { + "tcId": 729, + "dkm": "46f24cb2c4cf6885f7b6bea7974f3f94e8fd02fd57525d58c15daa1dffadc601d8785e6ca2d7f39188e27b81b1af645f54a6b3322c5698d4a08ef8b715a7f1d2339d7bed3333ffc43375d945f9ef556a37c5e127f10369f9a72a88745c60c1d30ffb88668850030b9f11aaa9e05776a367f5aab347eb398037b96245ddc16fe6" + }, + { + "tcId": 730, + "dkm": "a09422af7f6eb57b05d9b921308289d62d4f600d3ff4a0f726427be4569c9b5cbf93764603fac038cc4338fa14bdcfd992952837a432d811304647f61871ffd3f622126c0f6040b3f9da75d6b2f5d87656d788adca667fa7eb09df253a9da01aa2aff800d17c0674558bba7c6cc845b8ef6225dd73f5529a059c40a813e08cb7" + }, + { + "tcId": 731, + "dkm": "1990565227811b4f47b77d7b6a8e2a97eb8d3bfe95f6540f3bf239c587f7d6a1dbbe40ae170a87f48cce77ff42be9992bbff6ea2be7700db7a6a3028530e9ecd717d78c7d36c25e794e44afd26a07647ac66cfb2e02b28b9176494bcc8b327903fb0180501a7f2e6c0d7c9d55317d381925714c03a5ce8f4442d99bb89abf292" + }, + { + "tcId": 732, + "dkm": "85ad4a67f7afd52e32397a1416d496d75397b534b49a2ae025650034deea5686f6de60537ea027c584ab1743792d043a52ac09fd3ac38416d42759a1e829d63de3b1cf2c50a80d860866f29644fa38330f84e006840ff5f33d271b97677aeb38aca28115cebf1af5689a369a8c0c3e1901bdfe21cb89cffded1de77cb65d62fe" + }, + { + "tcId": 733, + "dkm": "847eee11ba787f53c74033b482f061fdfd02bd0917947ada292eb4e1b3a45f1ef58889e435374762a46e88861ffae9b38b5fa8406c5fa12371fd6b06180fa8b0b201c31207daa9066956b0a3eeecaf0af86481a4bd205b5ad80d64f4035e48e005a4fd0fec339fab7dc4a93c0d075390caa90c6fff97875dd22ed434cc4b796c" + }, + { + "tcId": 734, + "dkm": "241d9609f7c17a84fb97ab368328b5536301fd90f96a0dc5a9b10043e286e2c20b5dcd6d062eaab8320f4b60c5c65199dd5e4dce229e5fb2a53e529d487e683d16e77f0b6d2dc22760329b9340148baefab1bdc9800fa5d2adba548e5022a7baf207e2674af71eba940bc823e178596c276552320f0da10f536313d26b693be4" + }, + { + "tcId": 735, + "dkm": "3abe561e1022bedeffbb74758e3fcffc55a46332b7e5246904704281c0c84807767393940e62a45ffe1b443cb7281bd8ff33e9dd1bc0e462768c75868d5bd6957c2b292b9114c7abda9a55d2ca0f893cd9b0dc189591faa8b5b9e4169987258563b81667d882199523e1bc61c20e20adf6f73cdf2f768360f410da10637e43f8" + }, + { + "tcId": 736, + "dkm": "b8c31ba2406626aa8de63c31dd5a2336b125ee34ef1e30bd9e6f02fc14b947fd88aa39c75df2098b7fa89a5407a6da3cc15d354343cbc906a97455ba0bbeea03aecdfa766f9ca4e6af5ceb6e50caa717470bad096fb177bd2e163a2c6962caa48c1993b8fe8140dc08ed68a248fa3c315245a10cae9b56f5a73e11cf70030a91" + }, + { + "tcId": 737, + "dkm": "bb7370f071d6410043851c8422d75e25296c2edce2ca788beb995a6f6c0cef382b9683c89c94583b7cae1949becab07fefe858c909c65198b3a1fbdb1ddaafa25d3b4c64947841ffe14672cf30a23c719f2d384ed2dc3cd4adfc2ab39d6b49fc62a8eac9667342eaa9dbbd446dd2dee657d51228c918ac5cb6f69321f2daabb5" + }, + { + "tcId": 738, + "dkm": "6ee10c484b183d74766714945c50468675cd5d02fd79c7afeed27302125800a33e88e59d72517341c4c64683405a8c8fff5cddad8426583b3fa7326ad06f5bc59804d4c228fbe40425b2b33f226359e3a42461fbe1b71a962c1067c16ccda400122d9e21eaf02bb8d325e9863b78c2b536268fd6fcc79a7e27b318f73b5d80c1" + }, + { + "tcId": 739, + "dkm": "536dae06cfcafe54ac8126789c140a2a7ebe1b21980317ca4522060f0b6c3d6ecf83e4831a1c58d91d978fb9e93c7646e5abfc7de1014d8e1e51bae484043ffb7b8738a00d597cdf707021d166b7d35d5142cf2e8907bd31e3e09d789c77c1a09d5630ffcba09b409371a4997259bf8f4058bb6509ab5b34ef2018df047fd2d0" + }, + { + "tcId": 740, + "dkm": "d976a8b6cae2bbedf2ecd4f3a41b42de1aa4adb03a1c62b9fe88609dd69268394780fd93b6331b16862c594d81f1ec4a2f6fb1a5bd0ec665e9b60c9afa7703d781ed10604ab404714ebc30243d32cdeff9e11364de8269152e216c710457c9baedc4ecc7fcfe3d1d05fb4c8f0ddfb1b3047cac7d37401a1e355326f445b01f37" + }, + { + "tcId": 741, + "dkm": "a83def59c227783c48d6b68e5a95a6aeed3cb2b94dda6d799e659798505841b93f8a5f1dcbe248b5e002ffb8804e1413cf9b5212141b4b24bb84d7351c564aeba72838c16a3fe904ca3af225d85d80f508d5be97c30b6aa989f08d16df885c4c3c492a3eb2db9f532b3bc00665709667a9b554078cdb4b713d5f1337ca0bf747" + }, + { + "tcId": 742, + "dkm": "210f1f316903e483060601ae1ac018f2e72b79fcce281c600394c9d920a555200d61f9b2546c0ed0154ec31f2ca5ae45b7d379bfb6791fba203cc38e16c9033f471e9782bf8ee50e6390d2ca2487a00133ad5b72528b689d47126b1fee64f9c3aee147d932001229ee6dd08fd5e474170b08bb739eb98d83105e25a927586e3f" + }, + { + "tcId": 743, + "dkm": "2ccd435e26a4bdaeda095aaaa212b761f700c44fc829f83e438cebced31c63aaba8927772f77ae1ccf6f711b09eccac1ddd67aeec436c4fc6df8b517fc5e887befb082d06eba3733345741819e86e3914c07e6b24b0df2269c4fe7b702afbe94c2db17c9bd3d0d6bd36ce7e7fd5821a57dd9db74bc9bf35576ee6c313eb8f15c" + }, + { + "tcId": 744, + "dkm": "3f4c81082b440de49acc640e345b27b1c61f4775210d4f9441834d221d15810b484b25e9c54ebe6b71cdcefc52dd1b4daaffde843d70a6cb82b83e5ec2981d41c3091a5883d68b549338d77a730385550cebf1052f957519064eb967a871c1b6467cfbba1b3c62c6f9a05ffb7cb24b70831760b9e39a88dc9f991b8b6f37f63f" + }, + { + "tcId": 745, + "dkm": "6154678bb124c1830e411f76c810b4d656d339908ebf5f18cf4b2b8582e3fda3049c362e5e690efcde1f942634adf2b04be065ace45d39b1c2f5db8e59dc687c17ab9081e8a6d22fde7178fa9113933236c00a13b230f2456458f5e47c1c9b2634763ea3d23e0303e17cdcc620c2c92b7a86e9cbf9c252e4d2a030864b013a77" + }, + { + "tcId": 746, + "dkm": "f1657cf32872ed78d2586c63a9ede61b99fe74436e96369ed4616ecd8d15ad22642c982de174b391dcd87e2a02bf7f8e02188448f0c15bf66f36352bd832e68d6dfaa0e1e690bc43135dc4dbd72e5ff25678f50f8d377dac4ed5637cff3afa9e5308afdda7e2904069051bfe1fe6355a4ee4b029cd9b861ad7e6112d1f4a70b0" + }, + { + "tcId": 747, + "dkm": "dd2bdad12f69f817ac77c66de1d6f6b80819f45dd6227c6c9502d3fb0b7f0b9454fcbe0d1a3e16e19aca55af49c3fda7317f6255dba09a9164cbccf45858f0a35b298e21926e80c6a43c5b656bdae4b53d2556bc79530a1abb5244b64be3cccd5649345368fcefd8935375c8fa79418c86c91026a75b277e29e077853718a039" + }, + { + "tcId": 748, + "dkm": "659fdacd659ecccd52764bcf6d3f66355966bf81971eb63e6e8eef4acc50246f619b1019abec0a6b83c44ccb6eb02d5796f6a5001122923f25be16ec24f4707cc7edaf87c4356b5ce2b6f1a2d0cbbbd38d98b3f17976670c1e418c0e85c7d257bfdb56561843f2a5cc7819b8c007ca99d60e115870712d20a41d07f0c853cc2c" + }, + { + "tcId": 749, + "dkm": "a01d7d2a228c460ef911fb672771d486bf0d82b154a5308d38462532a343760eb47b0605970e388c76d448c4cfb3207c705d3d34db54bbeb015debe823381acd74935e479cbe906caf651af22fe58ee741e58c3451285bd6992bf72817031209264c6a41fdc69706c0c6ad5f1626adf8f506e91fd63ad8388ae58c20fa092e4d" + }, + { + "tcId": 750, + "dkm": "9ea4fbd00a4356ac0dbec482dd23ca448ce6889a12ba5686cb5ef4fdf685a95efa398b49367ac8900d19966ae7d6e0328ef693d81921b7f19897b98eb57a8c70a24438b2eaecad322bb0fb896dfe96a9f866cef2fb4da85c566993e51c641f84f553df657a1e24b57f49155d7499dd33152d4c8f851c7ccb3fb9993a3d35d530" + } + ] + }, + { + "tgId": 31, + "tests": [ + { + "tcId": 751, + "dkm": "e0d71811eb739ad44184e487cf05c6ea35cb2988f8056610a61c333da73f954213f00d191f353674bf9d5f644b5803be4da4d8718a6c8db7ab6d2310aecfbae2fa28e9b60ba06bf8790680d6cd799bc3abd7c27d81f3fed815503a3da5bff507d952aaacdba55570f096d3f0fd5bbff3c2c0c8c9b57ad41c50d5f2ff098700ad" + }, + { + "tcId": 752, + "dkm": "079d53da700b7e40fe1c596ebd7f6bcc9eea8748ce48629e6754a1b5e249a9639c95844a677d477e1498ce031b3ea3d0c39503a6907e556ef53fc3dc8528fe6de76ea53517a685505b759dbd493cb1618d53f0b1875a719648a86ffb7cc77cf9c2ab49a4dcf9ac75e6a0914a281f8d2f9c05749712c07ff1cfcafd411834dbfb" + }, + { + "tcId": 753, + "dkm": "5f5e520d1cc976af4d1a6f2cac06d4f86e570b2a6c33dce4c89616f9a793834c1bfc77837db1249f9502b38591e6d9bbf6ef740b6a0a3473e3db42e4a6251c25afa8f866d19b59060bc36c4fb20196a057e576184589fccb9c3c1d4bce30b2eee2717d70ff3cc609654b74dbe9bb2bb4a2777f3069fa313855aa0b1132c95b89" + }, + { + "tcId": 754, + "dkm": "e5c6da593f18862fb4ca3f2716ff327543c8aca133c07e68d4dd3f1b8da925202c884e1dffdfb8b41a5a1400d63777c85d90f640f36047ffac36ded29be78ea60089cc14fbaf464be053cc4e8de3f9ec0041a4768d0caaa05c03358bed548c0f4aaf0ff6bfd830c24635ce0df9edaa2bc1a8b416c2b4e06299ea4d90f7c66fb2" + }, + { + "tcId": 755, + "dkm": "1a80c7f5d1c4504e32e3934588d75cb74d5f0e287b95bce0902d8b09aed25788627649ec9eb2b166f1409fc398bebf067be4e1238568b76b5f34d68d8d4318b859a1cd3f845abcd1d6b95e1e5d83492208e2d74f2d706d9a5e18bde52ed5243481ae4a6b8a47a457a53b67cd2340fa17a7bdf38a37a3d3b9256ec0860ae886f0" + }, + { + "tcId": 756, + "dkm": "2a7e7d57e86e3ae2fb52da5aec9f2fffcdf9678ab8021915870bd1c9132c11d48fea2e33d93c7f6d6f607b49ad40dfec2d7e46ea5f163effae9eb3c55fe32d444c6999428f614443adc8e9f9dd164e95a732d63f3381325186687505f22269196b452f3bef968ec0de133a40fbd37279c52f13ff8f9f1c698d5658a99d13d9a7" + }, + { + "tcId": 757, + "dkm": "6a9e65c9a198fa4b240e022a4ef43aea3c5a77a426f00170cda2f8684b6385e0fd9bf32e6c9df5e2a832b78cd72647ac183259885193d17789aafdf0275350981c986eb767ce93041e0f68356981000926e8d0a13321bd5338f69a854b641c0ee4bfe32858599c1a72eca73d8f2315a55ae2d793bc8f8a2d91d900d65f77f6d5" + }, + { + "tcId": 758, + "dkm": "8f7e20671d08758ed0e11d296aec619fe9de6fcc3a68a87ef8cba71e30a35c2bbd611614a9dd6b3d035c21c88ccc0cc966f1463fadc323683f7fcf5a8e405490649b23eb590b0ee28be17a805a927f123e7831de0ecd1205edb46c9240b1ac01e2323ffc388a7e9a997b89756afa67f5fe37f2ce190b1bffcf447f279c6f5e51" + }, + { + "tcId": 759, + "dkm": "f97de3c385cd1dea7e13a82a18db9e3443f9bc2277ef22ac354cc8e4c08edea8b21c2fdb879b930f52f915075ef575acb0d75ce56dafa4a81f99913e0de3c34f6667d4a39cca530dbbbfa807061da8bd5791bff086e1f4f686d6097cca678daf720334fecf8919f3f54fffbe521f359a17ff581b9575852b0c516f38f928dcd5" + }, + { + "tcId": 760, + "dkm": "537b4e8c2d01452616c10473b3adbe9f0a1f28b21c08ff25478eca80bf0384cbfde103ddae96de205d18109c7472dabd8618a8440e78e4091d2049d58b864d575189639eccd063887aebacf15d575a56a91def7ae3754297b045fa88b660737abdf412b9ba0ab8cf41c0e432b845b045a059411cda16b198ea59defff4034df6" + }, + { + "tcId": 761, + "dkm": "cbe83d92b148dd57395376b11a26b0547ef7f4556fbcdf1101514a41e2318ab1d8cbae8549d0decde00b1e08f212ba43449bde3daac53ccf936a4bc7d3c150830a321918aae864fe15ff900cef62fff852ab911b20cb652efac33abb21c73b1bb2d80506d7a2ae32287ef9fa7ee0ce9f48b6eca0b344741547409be312cdcfbf" + }, + { + "tcId": 762, + "dkm": "e86f5232132c21a76d4784e10199569ddc0835df97002f61ba910c101370346f9c9949f340fa04e108db0b0abd81e6d6a3b4f05c05fe46a8b7119876ed6febb866fef15050f2d2dfb9d5317355a916199f365db68c672f85af43866c8911eb5c2228cad28b5f9257ea4ec88b972c8e622ffc66f1997da08679e332ecca62dfa8" + }, + { + "tcId": 763, + "dkm": "575dc5735c0d2909973b93ab04e66213c84d538ca3866947239640d4e0ab6bdaf5b6372ec4348a5d986026965676762a8c584a1f804aea145852c145ade7de6f6cfd2b52605b4a7d1a91351ccfbd9a15948adcc722e315aab0d94347308bc1821abc610203ebec1d1273ab81ed89d5b62d0517bf4467a3bdc99c967f82ab0fb4" + }, + { + "tcId": 764, + "dkm": "f990a01e838a7bd4fa02ba65375b4e7cd8a9a26fc428da84fa1db80591285993f3bf8157f0ba17c1a029168f4163294ec44f3f91461b8a8c7512945c1d5dfdad94d01bba08339c3542faf2065beff56ddc0279b6026c1ffb80ea86b9758cf30d23493b18f9f13e224191e9fe99ad47c6e13ff429c583414b54193c7009be6f46" + }, + { + "tcId": 765, + "dkm": "4270c5cc815963e00b7b8db439c62965cfbb6510b1055bf889fd1bd50df75ca8edfad2af22a063a9ab0dfb3d50aa01f930ce90878c71605716ea3993a46624bf79be4d09f94924fe3af701119e4d75f5fc2dd6146a43974a89e06bd8fee1846a02b53a117d0c6f5a4016f1ba998fb067d35f5f4175229ae9984974f88baec5e8" + }, + { + "tcId": 766, + "dkm": "a9a9c0ac9da28168c709cdf5ae0a763a0502b632c206db035a0f8dd750ecb066ea9c6c45f2e8893405401b6dd9ec5de82d0813bd89a9f09cc82173d20ae2319db23482832b7e8256df0cc62855bd1e452053e3e1088825b675dd620b2e73f1c07cd69ab3aab86b6d065d23fd2b5a178ca021e9e59ea0401cbdf4ad5dbeaf161e" + }, + { + "tcId": 767, + "dkm": "d84fe8e12aee245a21d9dfa59a86c2939c150daa77ccf12b95707a597cf84bd1835785fd84ad3c390ee8ab19a8f2d7e8c844cbff57241ee10f976cfcd0277cac08a753c3452297ba05ff9d1c1b4a5133a4d9ba2a0a0087add326eecf6d1e371d4c2f97600a58fb7c8aa95ce9703a139e8005f5b3bc3a6fcfb2695bf721be3abf" + }, + { + "tcId": 768, + "dkm": "e1412305c13c65bb81afd32c6bc310b2240ad6718a93ceeaf61550a2a34b27b072f318abec25c8263a3cbe8ae4818496d502e992887f8b50aea64070ee5093c063adc35d3e6609e100d9d7c3dfa335f22bdbc6f68eceef18671cc34ad9be951f02549f0062492e5f705f50464d5a3d55765073b59e5bb3d581d6e5fedc1801cc" + }, + { + "tcId": 769, + "dkm": "1daf5350b2ec934eddb1db136fe238e356672ee81e0263a083fa826534372a555230c43f4c33e61402c4b6d45d9c8a7a5a8e5bfe48c1156f9f9c18950ae5f021775aac86ed4abafe157db41a0186974d1d9435d5134bb4f63ae10f96bbdda3d8498889a4c4629fe23d3000a3494e430a7d643972245b961614ffe4bc36c3b541" + }, + { + "tcId": 770, + "dkm": "f7da18b181d7ee1dcc3e6bcb0a2145fdaa26864c568b150129f43fcd12a417fc9b2912ea47987840dae6a113a6c180b5fc65a18f31f56458a6836cbc46e2ee5114913e413d504fb676d751bdafedb4a6b2f628475cb19c93e2d39c2a1d11944eea9b1321b7e057f74396760622b97afbf8af93bd9cf2067fa81e967c262948f3" + }, + { + "tcId": 771, + "dkm": "429714632a9dac43af930496b05c3d5b9388b13568d653206e81645efb2627b71dac0febdb7383bbc2c2728cc38dd6bcc192d972d58d404eb989e9e0486540e049d2e9ae405c934b27225ba55a6caf74aee023cad3f195d91ce7a9dd330fdd3e2f8332b605b4da55ce12e2954a6d81ac4664770829da7711818c4ec3ed9bf364" + }, + { + "tcId": 772, + "dkm": "5374c533bbeed7929f738918211cc5659f9ede891f20fb6c329d1ebb7b4bbc6f47b56e4bd6f66318a46a6d7ab2189680b33fdaf195960b7d3adc801bc275f14b0182d12c4238196dd2778f8b348439dac23fb13f2e267116723f0a55329430d3dc8884d84fde2af275dd62f1d9984e354178ea59dc1bb33869588a0c74e8dea8" + }, + { + "tcId": 773, + "dkm": "f6da6947c8adb2659ded1fa60f757827704d780af3c7bbaa22b07d591286638085eb51d354fc8af1f1ffebf541f5e886d325d5310875fbafdb4955b041ab5d56f9cede1714fd1d75f3e503491ae8a9d9fe6f86bb17e7e151f7701d518605c175d1ecc869272bbdee459c8447fcf005ff4e5e374a7bc766b4eec97ba1af48b72b" + }, + { + "tcId": 774, + "dkm": "6b91c0e4ae24b35000807e47daefd0f0bccf81a6b8eac9f69974b07735b4d29caff6adae15f463ecb41219730e7ae26d4d150a395462860deaed83e824b3bc3ad0b028a249c51e29a25d0365cddbb83a7dd5ccf25c8e0bfe79d9cda526fdf0d7976bea5b853659bb90a5efaf649527d993ef2a2818db51ad1afb03658c5a9fa7" + }, + { + "tcId": 775, + "dkm": "566920e87090b5ea618cfda52467afc79f36ab37bb8cfc6d3c0e58ba2d69d9748a10d3504035de3106b07717ec74d6d4ee04f56e867215bba57ed0a0199bcdabf1852e113c2cc58fec4e6a27e3211ce4563ce043ac9ae7065606983ece68f043e79185a8f93d0cd3d2cd7679fe711f1acfbcb6880ec3039c359b2b5d7d814c2d" + } + ] + }, + { + "tgId": 32, + "tests": [ + { + "tcId": 776, + "dkm": "7257f1e0eb3f8fdc3a2308c7f9f068e5e402e3ba14992ac73d8f03b39bc3189a651deb297b9fc5ffb9c3221490f4cd2b6fb12a81c342f36a7b553a0bbf2897dc9c0c465f9358cb6e4257bbed0b81960a0ae30afc47512272e16f36af553a12850bc2e6210462038220f6c194111763c157ca3f180e573ddd8cb93e6a5616e158" + }, + { + "tcId": 777, + "dkm": "beed02b7e45b3b25d8288f85ee162caf5530b801da524f6925fbcecc5a835f2185baa6a39f8470581f32859b676851d3b43c32cd4ec5bad95ccd19b6fce66458ca165531fe3ea723df9c9699bb546e91907f14dfe475f1a68486486a0fa255795cb6999c21c63292d8b5bbbb0e5bedda138b00301b74cdc121be20c5f7aa1510" + }, + { + "tcId": 778, + "dkm": "a2c693e2aed4fe4c85e7a87c20dcdebe8d604f7007683db7d559ac85293143d1afdd62a57f4fd2709d9046b8182c269584f4e8d2dbed9a14464f541a9935f733db7b55d7fb985750b4f05db5a77b5afdde5774ee77b3732ee6e998c4dd1b40ba5c9d22dc064daa8109207fc6ce55a93a4b50ab48e01722c23c86e6633055d3f0" + }, + { + "tcId": 779, + "dkm": "23f05c751b57a1aaaed07a69bcf0377b73d401401ca5ce2101abc610113df820983908c150b9a04cecfcf27580df543d14af26d28f539074f5214cd39cb99e2a245bcc54fc3c162201e7fcf9849ff322c3f987f732cf32c03885c74ada29851c4f3d8756643b49ba2215eb7875401e0b872c1d43e3364ed753777cac80634dc2" + }, + { + "tcId": 780, + "dkm": "e0bb65ce5233a6240b857914d0d1744079b9b7484369b72065f2ca5fcbaf498e557cebda069e261f00b5bf704be99dea982f186af91dd7fcc83879467e3b595f2a730871e88de303be02e74200bd1f59006f74d9668c692153524da7d2a45ac43e6aeed0ffa2beb0e6deae755dabd431c670f0ebe629da297b8b4f6735329bd4" + }, + { + "tcId": 781, + "dkm": "f077a3ae4d2470090ba7fe22f68d1ffc5f134f1980cbd140cd17413725180b1f6a5b4008d7373be11c4da4d89fa25554b97defb5c3ab5f7106c898076f84b33c9994ce0095b5d083a3f7c3ef85801aae452199fc7cfe797eb912e5ce175078102d2620d09bbe6ee96239ca3ebcf2f4ecda2486117a40a3de1f765ecf745be42a" + }, + { + "tcId": 782, + "dkm": "21be8d4da4ce53493b9c4b48f757afc13214de8f7c4b86c855c995009dadf42b773a3b59f033259a32d4a299fedba43e0a61e370496f8c4113d800c6ec7d4a4c0ae74eeea94451034a6d18b77f8810bee3754610578e33f564bd877db1896761d21744c2806ac51641da87bd84ac5722038b64bbbd552481ee1d983b0b9811c6" + }, + { + "tcId": 783, + "dkm": "bd58cc921049870e4d80ceaf54a7266ebc01141d3d6e474b1710b8627d0f94125686732f930d9b0ce509e07cc7848a3d0cb755a96e5b9bc80a558c132c8f3adeee3c8f8dec05bec94860ccad7b684808c838df40396237cc8ca57af6ed526c073c370e6e9bcbe6361a7562fac09b1420b63fca1066adb1d5d241116aae6226c0" + }, + { + "tcId": 784, + "dkm": "f6f962a1c30a272b9159164cdfeb8858c57b9cd6ee94214843f57cfb4eea44e6d3fedaa1846f6e38578ffd000074c2bbe3613779f9aa84c17d4b512c063df2b6545ccd62b5b07ac308e6abaaf27ee4b5231bc12919e24b0489b30c53f94735ba0ab5189e5bc160823fe769975ac343184cedaccc1c2f3f47dc8f1effed71443d" + }, + { + "tcId": 785, + "dkm": "e65a92654bbf6e9048ae4bb93351e8cdaf1800782a6714bbe9c34f826e07168ef29f44e8009f4e44789a6c16b4c5752594c1c085ee448091a865944b4901bc69dfa188d20e972e69abfb20a712f44749150993b018ac03432d9b05f6f83d253ef0dcb11bbc89b6047452d87cbf0ac7a4d13f47de47a3e1793742dad2a4b95720" + }, + { + "tcId": 786, + "dkm": "65c27d23f726bbd1553b5ab18828764749c10f6ec2584f4febe4b32c08c2467df7a667c7742b0c8ce8bdcda12a76f869e1c4620ea5afa4c97a2a22f4c4c3f67b6efa112a776e114e8cab7ddf434c072920f7fb47cc242c3b85240f0452415a20e1f008ad81b6e9689f2c7e7984d1c422055074d9bc3f5d7c744112ba782067d3" + }, + { + "tcId": 787, + "dkm": "752b77be30d209c1c8a04984e02bd35e599a800abc5115795d031b45e00cd8ac49daaf6f0d1d03fbea4b2795d0644c13cc871e0f9126753e1fca6ee2ce988f13814234c93cdfd779635c15e46c5ee63820fdf251880541be5fd91630a4493d83aec6b7b41fead30e971738f12892df18e08a68afca4b6ed4addbc435aa06f1ba" + }, + { + "tcId": 788, + "dkm": "a3921bd9d0e6c64aa46874fcac9a83ceab2558dc69a6dd336df8bac9081ffe3991065472714294e91383fe4fe57cd3ff3f8f773131e2bf0f368a4a24468ce736442b4df2d7913fbe88b45fcbf0b9bd8e2a3b3717a7c9bc74e4fc704e1c006b20f0b9227f7e7e88ea8a6f08b73ae8c50b1b49946a32656d9dce97af8c501782b5" + }, + { + "tcId": 789, + "dkm": "2e10b8261259bb74f1158884000205b15dd7df9c09838c11af9e0b66cf725c0e6fa5b45050549eda8cb25343c551cc16f3ebd0dc9fce0958f07e7992e251e317cebbdc7424c66bd18ce858f98f25562274632dd3a71375210e97eab4a749f977f936de1b578490f79abf49d3d4fc4e559f81625db9e622431c2f239f9f55195c" + }, + { + "tcId": 790, + "dkm": "274eb8543806579534a8ebd68a535a6ba74d766c2ce6a478ffe65269405001ae82a54c67448e5ceb9047c81a1e03c40ed9d01abda756ed4e05d228d995109a53f1a9621f6041c9b49ceb5116dec17e9ea8c0e77a8d8d717fbf6fbe821ebde1c930598ea68e1e5a1098dbfd3bbe4826a60fa2d3fc607938b47d17483abf9c5164" + }, + { + "tcId": 791, + "dkm": "64c728012de57c179c232c7799d7f08af59d70f92511ded9d6740d982712750264699ca6869cc091fe7c8115f999e2d9d704f0edfe3b54700cc55f7ea5e9300fac0e218167a5c95d03b56e2a5131ac5649b7287d06018facee74c8eb179708e9d78580dab3d04516b7cee35b852413be1e084e38b2c0edb95b6562e5bc476376" + }, + { + "tcId": 792, + "dkm": "17f18424889bf39b40fdf117b8772977c121a4a1f1756c622f9596ce0db3f555a23bd514290ac7d18477f528c34247410d6847dd679c6bac42c73a08d44dc3cabeb38fa703e149715da9665611438281c1f11c17426d92bf3d75edca206d4396c1a2f8931ec605dce7ecc83964bb4fbf2f61b235c445f1261e6169cafec71ebb" + }, + { + "tcId": 793, + "dkm": "2d9a2a95cdb671ffcb6ac4bb54397e35f3d8baaae34cbc2b398a96fc7836d1ed27cb629074c2e96cb3d7f2e8a2f4c4d2bfb76c830d7171b3e48e77229f8741d772b4ca41be0743f37db5a68dd872989351508d16a7cb13f6536c94a13a129f906ff78264fb282421f326c35c129d85ec4deb11e18d0832a20869e3100428c08d" + }, + { + "tcId": 794, + "dkm": "d890dc1a7a6a390cced64c81d8f9dc90e00bdf5b5551c9b4bbe59e987bda473db568e16a7cf5a295950f72e6689630d02ea95ee47b77cb1b88fa621b8fab28acf6c5285dc5cbe4bccf3073f446701fc8351e1896b40dcf234fa96ec9fb191574d2a132b2a495dfe436a6789093b3cf4b14824be935f9d192d4c9866a45179a37" + }, + { + "tcId": 795, + "dkm": "beeb2090b7de4d53209052946c93d366cd3697aea8eef5de7240aa0904cd9cf3094d4cd2852d566b820d17364070febe93c01489213fd61a44b2642de866fcc9b15d316b54c0a6af56f5b5e04470ba6d6cde02ccbe4c4e63261dd6af90577424ecb81ec5973cefcb2e3d3d9d07e9be8769caff3fdbb4a1c23589f5818ce1d50f" + }, + { + "tcId": 796, + "dkm": "409c1d9410b172512e9823209c0f9d1a6512c8c9c104dec0e41c4d79891a240434f2cc42aa28ddef90e613805df68f01dc8a7290ef58b4f07e6577c8ef57ce98da3bcb0c384251ff3ad7495ed8879dc125be6a3b225e07a9d0d3ce9440827824f1e002b9d99ebc9bc686f0059b57580af89f1726d82acb92ebc66d487b0f1653" + }, + { + "tcId": 797, + "dkm": "e69dc7d5337db17c94214868decb5d6246523deda528d04e0e3a0b262df2b16efd2c8f885a1dbc2761e5780f0dea0982e9c271b9664495372e237a3676feb914f93f82cd27b5902150c4dc8ca39b1df8ec23c46e0636faf27880311813767916d0903f105de68d92d96b1f403e3ded48b15764d5c8772195e8609fd9b92423a6" + }, + { + "tcId": 798, + "dkm": "637058e979129904e418e869da018533c40bdb9a8b884c456951dbed1476139df482a96c2f7e593ecde65e403b754abf23a116aadb3a7fa2246947663df47f31b6b861785d9069bace96740da874104934a9dee8eb33bee9e53ebf6e4f2e43e67511a015e4f3aa78d0abb937ba2e7952290057610afa144e5ca2c0ecd10f02df" + }, + { + "tcId": 799, + "dkm": "862faf249b7354bee7b01ae9a5eb07081c6b68ba67503669a9a918ebecd38c633e5ebb6e8cdb9091621f195b7db4ef190dbb42f54c9e9bf56c498bf5261858373b63e55029776f318662cf3476cdd0badcdeeea7086f6758b21789b58ca5fbacae0de148c3047d6d05e33c705d5fa0c425534810871073e1df9964ddaffa0b21" + }, + { + "tcId": 800, + "dkm": "cb90d0991a181ff33617e3a3680ea700bd07929a45a8cfb37af2c2f38f75139412e85ed901d12ede5f19de6c11d6f0b0cceb1dea883547315831eaf98b3ffd3b411dc415ed76c862ad47ad2a6e858a879a8e636113c54018cbc3bba0fc5b1dedda80ad67342ee651b30e651ee9aa96edba23a1ddf35be837b3d2519318a4503b" + } + ] + }, + { + "tgId": 33, + "tests": [ + { + "tcId": 801, + "dkm": "39c0b623987d2156ed553f7e741a1ed86cc2831d8b626454f5e7e0680b3ed8cbce8fc3490c769314b5b6c5842b68aa67e3a4e68c30e7712454c91f462ab33edf043fb1e77a2eebe5898a41f879a008e39be21f5e06112da0ce71327053cefecbecc123299f810bc0d3dcb5036ff693b68014be8e46ee7132f4e4827146249a93" + }, + { + "tcId": 802, + "dkm": "a7280e085036b86dc430ad37a14d7147ccc1a806bb91c186280dce86ade02a34a7e25b396d7304ad506fbe705158b16259404d4d98a3fa7eaa8a4b9621146317504cc6ca927f009aa94e7db04e562ffcc2e624955ab982f12e4ebced15bbaed3103c6eca8b94ffaeb8f83e7b9530399cb70c6b3140a58e697d0a3577de92c932" + }, + { + "tcId": 803, + "dkm": "f43d9df026305e29bd7d02bfc8ddff4c37e62b3b6ae22bfa17002279df590c8aba564e0de96c2d51661e79c8a666916a951383a1b408221c02e672f1c68ff4e2c38b1502917c6277b9c570058c9882b632a4692704d60178eab420177c01b2694abfc04eed0e55f1292b6b2b50b35a49e5a6fabd8085db57c6f907b76cb9342a" + }, + { + "tcId": 804, + "dkm": "bbe84d4fc38a4230aff1c3dac7149b915a84da8078f2b26e0e517bffc2a08124c4b1fdebb0298b48ccfb8392b2378dc6196d04d5c3ca45efcc46a754e49c0bfa8ee403ed530413828e9e87d0c7a66f6109620422691f038788907130eddb163c3aa0239a98026ad021267e69de2a9d7eb12e33869d02761d08d295a1d50fab2c" + }, + { + "tcId": 805, + "dkm": "7ecebc6f166168b1a374ae58e29d2079adab61e08f45834433e895517cef1e40644ee0a73f5286e9ba32e2f6ee4a23fcf6c5597aec928043ce9aa114d9c3d8e1a46a664cfad4ee0bba77bb4c37112f0feb017365b1e83315ce2154f7673d2346e16f48fa03a8d51116265216dbd6dbd574fc5437948b8ae50b62cfb7c3564906" + }, + { + "tcId": 806, + "dkm": "1de9d0e0937a9301a759dc592d3931ad3b0872b93696a953fbde6396452e8704198f7de6d4ba58da0291abbb13e4e1dd0c841bbb05e65e600bbce1a0b234662f82176bfdc5c87a49eb4fc3508e1816fbc5f17ba4f4d0c453c26f724bb6e1a61b461d9e634f1ac3e50f300ec91c98a120e8a45f7c2bf21f0651d729bc9a49b84e" + }, + { + "tcId": 807, + "dkm": "26fd37daa3223df5e2296ba67072eeb4cc3940b1e85237d77a940353737c2dd5deadd4339e14b335f0159ca1584ae9d4919710f1a89233e31219a38b5bfad8b5c553dcab62e035bf82284a7d603e995ae483b13b4e2b21f36363d65b1e138823c8d2c80cbbec1db8b3cd587bb96b29f3c00e5dfc96b5a5d316824f0f4e51cded" + }, + { + "tcId": 808, + "dkm": "ab1530253ef1c31b0b4ad5c3190e23a4ced12698e3dcb340f9ccd1780284811bac8cb60aaf873fb933db47f18c47cd0af2f54ed10415102253d4d2e1d2366dfb8fcf79a076059b0827f3a194b6e5bad9e6cb8bce705eb63c9c1ddb6ee036f6541afd4186e6bc9c08af3898bbe3878fb55fb3c422279256f4cdd544d8f05ec520" + }, + { + "tcId": 809, + "dkm": "0a92dd4204b351f86cccb27d62030f2d56ba402f780d6a1236e6831200513ee860c2893d47c2fa88997766a9da2c8428bcc2a2c894d29930ffdf808b91434c9ac7fc54041a258a9dfdde69a18374d45854236982a6c48712cd87511089a9cece32f9b4fbd46b878347ffc50d05b3706209d806b4469d8f2a38b510f7e1ff1a4a" + }, + { + "tcId": 810, + "dkm": "2f2ab1b3444df50ec7203d8cf876cb97e20b9193acb95b547d392297f6a8ac061ded6d60b4299297e8d1aac765a0e14514d6757d80c72a902fb15fc753adcf7ef202d8f47353fb5cf1aeb7ffbf5704099cb3fd8277901479b22eeef47cbe5b5d50776f44b48cc2ef5dcc75c90500e256a5f10f99c9eaa4d9c254d5e1a5971a9a" + }, + { + "tcId": 811, + "dkm": "77b2b9b2703f3167bc42820ce3fa6a8206c6fae86af4abbd14bdf588bf47134df83b7cbd54698cc47efced369a9cdc8de8424242d099b1dc3b22c5e43a0ecd597b0c50b116b5e9a956d1d6c1a13cc3d860a0ba7779f88fd9f04066bfbce39e664b0a3e8eb321db6fba59160aa19142800a83afa926157d36b3b0510db776f150" + }, + { + "tcId": 812, + "dkm": "2f1deceea7b4db6f1e33c4b5b1b4647972baee709d8e51b94a62e26b719d573d2e01ea3402d8042d5c0363169229cc00ff9b4388315f7f22baf919ef28cd5aae157818f442853592d28d39f3f8456b74ae048c18cecb12ae47f45a102b251c00b5971f69726962a86167cb1fd726bf7bbbebd0c6a203dd3240a4c664bf245bda" + }, + { + "tcId": 813, + "dkm": "e1661cf67b29a35e208f60789866c24218229b1f59793d97a93d616bd4ea27e99dadc35e34825072a2d92a1f647b13121d0e177ec139faf95488bfab022e33b6a1ac07f15f7932bd891dc62c37145912e6d1ae499aebf8c2caf6926384dc21bc49c5603c3371825a6901b15589f488b352804e6414f392eee7356c75cfd2f990" + }, + { + "tcId": 814, + "dkm": "25aa4b499d44dc812f4c526c6026f3813e79a258887cd3488c4603e2fb1b2a1be17d7cf8ebd7c77a8a8d65e4e918783b64cdbed4dcde753683e12fa984f6d2b71e4ff818507262260d5ceb8254ed152f10bf1816e5c5109506cc3eff698479cd025b2fc11e56f47f2f0413279275430c146a063be854d1c71e6b836cfa557fa2" + }, + { + "tcId": 815, + "dkm": "6ddb209bd71caf8c85abbe6c4c39dc1768064f4c369909a4e2f110453775033d8582289f643e57281d33020b56f6eea0e163cd4c3867b68cef2604f1ff56c6708f8e2bbc06c6bb31a10e480a8e0be8199318f2b31544cb42c34aa15254b2440bda18bfecfce8b63426bc451e448dc54a1561a6a6d9536b6de8e85c15d17cb458" + }, + { + "tcId": 816, + "dkm": "9c47c81b6909772764df915348bec0767915f317a8e22e1c15190f1eed9b4c7c270488a5e8a13d9e8bd4ff7b81699a8c43f2875b8a2baa61ec7bf26aaa768fd3b11ecd75227fe4dd063e00d4e254549bf117390e054f70561594ee8d2c34a7b8e1eaaed80d7ec535da7df3de63017486d318093aa7bf2b2f2ceab9553b9c814f" + }, + { + "tcId": 817, + "dkm": "c3b570a26e2ebcef1b3a3c206db7d409dc2254a1a7961ad5a5a48100420dd0c5ae06586fec4d90f6487ca90f499eee1ed9dc700ea30b4dc941723bb08d39d0cf3286d8e82d55e0c2a39c1e589a162e1c5b06498703d9a4d9e2ffab2efb44a5c666380c902a7f8bf5e017d75a96d09b1f169026ce0dfde21619ea9167ddd193ae" + }, + { + "tcId": 818, + "dkm": "ac3c68afc2c3581a5f6d4a225e7c26e030c266b23e580b6ff7e2bcecf93ff024ead77b5d9106e708abc990ddc4efc30ead3fb2a9266b9b2e9473877f847e9309fc961079251732d11aea99e3f67b26f5d864b0956a46e999fe620522eb205144484b0e9e537d09ac382e6fb1892211df174f6a8b5aede1354956c1cd90b0d123" + }, + { + "tcId": 819, + "dkm": "9e5ee0b9f5f335a36754a344e3afa9dae714ffb938af64012c7376b8eca5952e208858e974d3dbf1ed705d0bd6fd63021de2b5f35c4f59c58329168200812783c75ca0bdf7bb850d46ca081ae6e90a0dc69b24d8ec701e5fc3b508d61dc7082c1156c02217ac94f88774fc0b20670280b7f467e05ae359057b427a2ce7e769be" + }, + { + "tcId": 820, + "dkm": "5796095103bfa36f6e0f692313b0ed8a5008d16ae16f9ecae620e662750147b664ca6c5c062956dc57f7eac7610a1a5aec4631245d3d48900747331ed9c5e012d0301dee572c493b51a8d58f302833af8e9aca53000bce3e4e4b0ab6b94840f7c5e9e8f2b348792bfeb18f1d9b5636a25084cb8ca51b69f938030909a500e889" + }, + { + "tcId": 821, + "dkm": "994934341e286ba9e2d69a7b2877e42b24af4582dd48742c549ab51fdf6d2c29198a33d4be52ac171eb3dffe97eb8ab6ebb663cb7dba23f641f6a229b996ea6b5a9245eb4babed7cb2cebab8f368971c29d28ef3a5117b522c0543ed52cbca65592b284cb4eb645ee0aaec311fb8de25419627114f549e954f4007f8aa9eb65d" + }, + { + "tcId": 822, + "dkm": "db70ef69f5bd0e4fc9f08e1ce8c020d292a60cdc869a435b60797d44050e88fe796b817444620c46b03e5b453de9355c469a6628de82be17d4e42d45afc9e64d13222722df57138071c806f36fbeb6249cef00f75ce238c80c1f68ee0e6090c70a48bd33605d501617786ea16939d3b120069011663f20097744712023970dd9" + }, + { + "tcId": 823, + "dkm": "585bd0a6c2b410ba42fa79877d371483e9bbf3bd63c22627bf628a03ec6a1f6434ac83e672e9590a92592d1d4d2bcdcbc5b5d626e56391d76ae174a9f53fb80146f954c700ff81e851e45c1e29b9c57308ac86c9efbd8f2bcc3dd89d91c785bb3c0067cd88c53399d9be642ec956c5e36e95888c2340f13b57e1fafe640c6405" + }, + { + "tcId": 824, + "dkm": "a98acf52103ba7b97fcee16d2b692bc44eaa046290f138b621c840d777dfa05e9816a2c94b8aa718ffc6ead2d60e94ed437da5ce7a9611b33d1968dadd43ca0be4d8d39831ed70ef376b18c53aa09cdc48eeb4a229679bfc01b8a7271e9d5a20e83920bd45aaf99a3a170c4b7e2978a3141a47e38285d46f4d5d578cbffbe411" + }, + { + "tcId": 825, + "dkm": "c7920653889fe62b42ec7bb94040937b71d63a50f5b1ff5caf0fa99103a57e7e3b2ce5a5162be5499563921ce963238d55dce028ea7cfa2ec22092ea30cb00a9db4e6d1f07bb694224fdd2d40e3579058fec113a69e02e2b3f2f2f6ab1086486a6ac506a9f13b96d509641292b8a1cc66de91372e6de725048e62439dd1adb0c" + } + ] + }, + { + "tgId": 34, + "tests": [ + { + "tcId": 826, + "dkm": "4a402250c0396ddcaf17a5ac92881e38ceba1466e6a0d0f5ee957ae3d021fc3acd966eb9bf7c73bd5a3dd09cf020a8489d6a8373da517c51efec56db592599b0bb89a7c767ecc1ecb59e0c2d4ea2a4b247fbf4738ba5be6a8329ced9a9a6422ac9e260f9812d7dac4a0fc42839fede26ac263866ca53b8e26922ace76efd4c92" + }, + { + "tcId": 827, + "dkm": "d2d85c93e78ab0c8fc9da7777dd8f328dc31ef2d0bd28be0e6ea7f7c28f318c58707c875ef9fb470ab204805e191832ebbece9d4eddea54e7b60f04ba4b2cd63817b258402d03a90251ade5bbdfa4241a220800168055108f8883f7f82bbde6317aeafb4da637f113e777f7076021aa20df498f8f0ab4f3842bc7f2e4562d5d2" + }, + { + "tcId": 828, + "dkm": "09b746b8d9c925edebb9399c0151dfa2fbd79fd486aef82940f2e9d8c80d0440ebdf28100d1a8a35f3aea873c85a11568c564ab6fb58ca09afa71753b959f928bb70c5934c0ed3986ba0d6842f03ed1c66d87f522ce18c72bb1b4f3973bc7d2e7b186dd95f33c877b2742abdbaec6508c517ec76e0de9e83e63967c9bf30b2d2" + }, + { + "tcId": 829, + "dkm": "a672554f97cb79ca54612b95abe7ffc02e0546d96e9a1f91bb06a84f6ccd1e91294e507b602a478759f47ce51b3162849d2c1ef330ba80086b36da3d7f94c08f1274ace1e3b2afb37d9d22235184d3501d9bbc22ce06e72f671123413c65fd73e3a972e34393e2d156232108403ae74398ba2d4f5f1ec02f933c20fd7d4a1d77" + }, + { + "tcId": 830, + "dkm": "a700000107aa0fd8c346174f15af2e874e97251de36966ce2ead383d36f7180d08ae7d35e7fc86d54fa4b57b74e25b30ccea5874fff1900270bcd225715d35f6b1ec8de5bc4131a853c54ef9b9b480a0ad1a4b06d604ba0419a421e6ef3363db7b4061bed3a4379fce408aa75fb16b9cd1681f3b3ad6f4c3a361c69d9a5f93fc" + }, + { + "tcId": 831, + "dkm": "f53461f1f8a5f6358d8a3a3c136416e322339f55c74400b0edeb1b23dae5fd45b09d9d12a35caff02531483b2aaae005619d0177dba28a6fac8009d1961608af71f0032851e52ff3dad1d8c2ffccfd26590f26e1e58a13cae5deec3dfa79909a36482359c2fa3ff045356b2dd8324065f94193217c30a98aab57fa4338170a5c" + }, + { + "tcId": 832, + "dkm": "52b8f01b8f708fad54ff611ae7a03ce2a7f054d9ba231abc9d6d193cc5493013d5a8596d109cabb424240dff60cdf79907b84aacd9024e16064380cb9b538518ce1dc7d4215e23a22b73e83d314a9b2605436634a140746bb63e339f5ee0251ac4e3d83344e1604d4ba46b5f24f2da570b47281090f1bdce265a6befbb7cf8e4" + }, + { + "tcId": 833, + "dkm": "1c764a35472162a471eb1d0ffe21558a13a82d9d3aeca569984faa4932f85cdb6aa07d82051d162dfe727d45f3ef811fc067cfcf41339a897932e7d70f6f5ada59055f2a38dba60451fb99925eb307946859c7dfad471bc2f6726b1a5c66da80b7650c85e89d6a36088cdc4201fe816bdcd3473f53a2fd08392749cb008f8fa3" + }, + { + "tcId": 834, + "dkm": "eaa1af7af261673d41fbf1a045b56453359c83e31839585b932d77ef2e81df331d9199479bc9854e6c9152e0c99a2c08b5e6c0115735f040bf9d1e57cdbf594da4620fe1482a584151ef3b0f183e47ec0a06a1ffc0f5245573e4325eacfe5a52e86d87881735ea88503ba92af4c6faa81d9cc14d0fb1d3eee231ac8f668fef66" + }, + { + "tcId": 835, + "dkm": "47befe28f3691262101aca09a9df72a1388e7169da1fdab27ea087f0e4bc074f372932d51b170b92652d83d59f24dc3272d8d94b7b2e52d91373336350b36b12464997ebef08ab961ce3a5b1c1fcba8104e18a5c2d926ce24c99e4257f09099cba2e0e86e5c938bc565c16ef3c4ab1ddb710f781ccb193476a7e48f7ad7619f0" + }, + { + "tcId": 836, + "dkm": "309f0713842906d88cacd198673cbf77b6e5dd65f450201c0060d03c66ea0ee97284e025c516aa80169d7bba55ec4ed4df5dd10569f43d8bdb9d815a00303d4157ef065711a7e887598dfda15772efaba2de5ea9bc74b925fbbb29cc5a68790b00df96dddf444a851e4177550cdbd05dad4b62d12a508f8833d43e022d108614" + }, + { + "tcId": 837, + "dkm": "805d5fd17706357f12f9016ebc97bbf7c7e509512f4ea156bf034d4c12bb706b8be29406e6504ff5848426247b047298112170e5bbaa59426b5e52189982701d808f4926006b25bf8fe4c231217484c40d6303a12fc75ee76dc37e94938a8568126813ce2dee7936ba6d56007f863de7f76fb3b3eeb4b59df078490919d0919c" + }, + { + "tcId": 838, + "dkm": "9ceae3ab55326c336d0d0cbb825af043fedc0b6779235d95a1668b71598a760a1b259dd57239e8b1a1cc0f98ba63fe57600d27dfd897aa13bee1d058fd4ebb22f415f7654a89d18273c55ab869a5b88f2bf16baf431999e7eccfce23cd85d415135dc3d23ac39888ee3dd7672587bc8e4db9f36536e9f77868d0a00200ceed43" + }, + { + "tcId": 839, + "dkm": "0a255527d7daa435a11bcaa8e282dc63d7485c7c645c69e1b71f09a2c057373da35fbf65d72d333cc4349281b1ef08d1afe84a8e7f100a447cd7bc6b4e7bc63c093f0fac1d1e5ab1f31096ddb543672f8ed59f22ffc22459fa6d96e57de8d34aa9b8a417963ec1c2f5b4d19e0b1c70a28379a9a78bea23c1e40a1a3931272654" + }, + { + "tcId": 840, + "dkm": "c4dbc9467ce55ffa04ba2be539ee423fcae69e43a7e1f871c04b4cb75bae07707b0adcdd1e7b0be99c04d40ad52c81b9a243c174701eb771c75093fae2cb20e9ad30ed97ee72e8d2238d1ff811a09eee6cbdbc145f8033a495f81c9aad45800632bedc174d3a8259ee4839ee7197de2a7b0fa8320f1724d80704bab95b15b817" + }, + { + "tcId": 841, + "dkm": "608a93ed43b0bb871b3b85ef271cc11d41d0cc81b196f2b0735ff6114ae53da9e5ace49a6f264825bb4b5c64d82d0c2df7322f43688badb46b0a4fa5f47f2cfb47a27cdb87d2dbd541ddf7198b8dad3864cdfcac61284903786a93f24752fd3e2bbb77507e7a64f94d425823dd3897f486a06f2ca7078c1e6bddba1898a7c101" + }, + { + "tcId": 842, + "dkm": "7f7b09c6412c7ff2959c330b0c0260b257294b21d0b5b05d25e2ab03850a4c6a1f37e5d47af5f7593f583da6946cb9241ad1f3f5aa44e6c4d886d9a5a927370bca72bf3cde125a68c2c2013061cc2556d7b9aa739ccfeafb0aa0bf3e040d9acf71a0651f51a5183ac81224d3f6ae03543d569acef8d57017c3bb4baf8d46e665" + }, + { + "tcId": 843, + "dkm": "fece4703b4ad9971269c0096e2557cd77ab87c68be40b8d03bff4b1b63f5d9ff07844ec705f1657edf3e2c7f782665ac6778fa56f84e5d1f73e9aa75427be88405dcb438dde3ebbd041d71f15036f180d398333b385740eca691f66b3b074c1c1fa3adf2cef0cc13ed7314a620d6edc3e7976ac46b4dbdc4bd7826ba8cac5772" + }, + { + "tcId": 844, + "dkm": "2f94e58a8bc1e4925b88c186158b5523b7b75a5d38f88bcc89b51e1b458c85e3ab0cbe23a5c75b4bf8e6264cef19973d2bc9448e3e4297f26a214319255bbb28197e79804e4fac1112ecc91e283731d43b03b1907263d888c661c7cd3a604b154741ad58cf70d2fd6b6ac8ca4376c423aa143d1735d20f8639dc10aca3e2fe89" + }, + { + "tcId": 845, + "dkm": "e94ca9b0d6ca3c3d7563d28751510178319386810d2623d8b6c930cfe488cfcaf330cbdabe854484e8a995fad7821058e396e5efcaa1c691feeb7c7360ed3e244b23ba71810391f2513a2df03663502c2f4ef2ac9d25742afa9054e059ea7bd7988c5c4718aa8c54e31611766939128a68444010d12e2fbb02e73f0fe7bc29a2" + }, + { + "tcId": 846, + "dkm": "762448b85303382fd0671b670d5c4f8c1a84de2d2e14ed68072815351fee9438e1a49b631cb955aa4b60f6b9b56354c21d14944919b1c1206570f265fea933990ed9978bd4b8acf82f8ce795d7314057187e42b8862a8e19880ded65a0352901fbe6e9d1ce30241603635b73e925f65b5aa3a3efd79cdf34c01c0ce208aa2435" + }, + { + "tcId": 847, + "dkm": "db99abe9fa24bff7798aac463ccf2c3e7d600f7e0b87167fb04bb2be8b4af66d5786baaf2c241e8327d7320590a8eabc233dbd4cf396d5ef2542de53593dc7414d51292a2c10c5006b8ea1033bac569af02783ec000a2b2e41c3677c8f561fbfd3da94117fca769fd771a6ef114ae2a9188ee1023455ff73f894a8a4f696a9a4" + }, + { + "tcId": 848, + "dkm": "d41fcd9ffd0d9a83f9fcabcb41a4ddb36f0302ab656c8c046dde18e992de8ad6a895cc13e2c46ac02ca7e9cb5a89a9dbad41f8d52a4b8710a945e7bb37919463cbd8e4dd3acf27911f08a58a46d1c3eaf11bd73912618612bdb2e66ac4b5e87f8201424200d779431d37eb6cc8c329a48cdc73438db7ed8d06329ca6f36a677d" + }, + { + "tcId": 849, + "dkm": "feab810e0375dc1ce94251355efed62b0587dec206a31bde8c3bdff1d755e0ca98bf532efdde6a5d833d421f050e36df2a936ce4e754d68849abde64802c3dbee7988e6a2809b6205ab1d6d73e09370c51a2285245e7a24d8e819035f6c891a866bc20ebc3b94858aa9fdf86734281a4d3081008341afddbf2dc7159c2a8efc0" + }, + { + "tcId": 850, + "dkm": "2123067d141ef353cd8d065a0565d1009a96a4fb19c031f3b0a99dbad919692f888781e86955b8cd0612fca80678deb13ad08fd697c90790407d3b2e3b711eaf88b0ba61dcdfa37af6cb8b45dffcf56cd240a9c5a63449cf38ae733b60c29435e9c65f5f11ee4c07c4981e5801520330d9e5c98e214867c4fd13a1b7069f651f" + } + ] + }, + { + "tgId": 35, + "tests": [ + { + "tcId": 851, + "dkm": "859e840e8290ec0b85a791aeea7bc089b5af84b4ad257ba690971e633142d1c7eb00834c033f3b48197a5feca3daad51a204d9160e9d38af00afce9bf6ba0f0df624058797a3e67de497f08afc2c5783e53e79b2fd73c9bdea2f84f06a0cac2d4301ac95dd45fcbd41f8be2c6aed417259b20658b8b89fabdccd6c886501d74a" + }, + { + "tcId": 852, + "dkm": "83b5e04eb2dec510812cbf50ae2e6f32fa9b5adc8b9a1670ae9668a0698153e1cdc50fe90fe73888ed3373774dda197a7513e45d06a6bc941de0dd766089590425e95e288e200d54125fee32725ff18637693ef736779ef110ddbdbbc192bb461cd68d8b4d5f2c2ae1196926b4e558b4ceb190ab5c136f1eefc411a674c806a8" + }, + { + "tcId": 853, + "dkm": "3ba024cd7810bfb7b928741c4264bd8eb45893017e0c2adfa362fe3ea2a6c2b51625075b4dcc6ef5c0b4ebc3231dcf33c824b6eded1cc4971cccaee41371f68a352957a846cf17df255e422b64089861aa2ec9655b287bd838c4257d00572c7878d8d410dcd7f4b6ea33738e67ba3dfaa25696dfd0affc248cd715ff2547b61a" + }, + { + "tcId": 854, + "dkm": "59266b477fba5a7d9125202e9e12397375c0ec45626bc45abccdba7c91c57b19c3c546139ebaf4bfc34393b3ced89f74730e0397d2affbe8db3855daf5f4edff0b91d52d37cb2873a2095e66ae3e686205e2a51cdf152ed957ecf00654b5cd5e9f923972f9d9a8fd40e33550a206d85694dd539c81a9bcec34c5d945d61cbc2e" + }, + { + "tcId": 855, + "dkm": "df24dea9fc24824b03753e07f2b4572420af655f29d00ef22945737afa57dbe3f45a4d3d211d04954ff7c2dd488492aa7a3d3368bb88df4a73eb38908bf1c13f100e2862fece21565b5ca0cdd3406b5a77baf08de2d4d7de2a304d44159026b0b4db2b33f065fd159b94a056712abae7d065eeb39f43c46973e7d9e8fc1a787d" + }, + { + "tcId": 856, + "dkm": "25dc677b6addafbf20feccda0358f36b59f1ab48bbb38b2a21c49a72e1941c107cd652359e88501bc06f00c8284ab9e871eca96a2b1bf6d13fee8b5357ae666090ad82c368b6ac116b051feb1c09bad2ce2a5095df9ff18529cfa72dfc1e066367dff373521d415153627051aa9e86d642498df82eee35fdda254edd2f396f50" + }, + { + "tcId": 857, + "dkm": "b0a8bf81aec6de9ab79e33ae32c3c4d93a8c7f6c9a7352de9faed4f7ea83424ad7cf8608e996c181e5c0e8ea2a6981ad1ed01b69c31ae5d34dce76d5f8f67464d10bae68fde23a7b8a7313a2d1b949ce339dd0807d0c94155f62ff104785ad95697ccd64883a77f08bf9a9fbd1f5628f5b31330aa024a718eedb077889bf8c3b" + }, + { + "tcId": 858, + "dkm": "659e9d388723a89b80d5231c1428840ec608da0355cbcc5990b958d98b6216fb02434d1b4fad711d9ef59ba8de702dd62dbc93d4af077b4914fa6a3d43cf3600fec6fbd8dca58a15ea7273696fd249afa3f38aa988dc32bcd6ebbb8f90f9f0da7b7433aebc3eb4b1208a049b98551fb2dbf31f67e74f467f326165489f8d7e97" + }, + { + "tcId": 859, + "dkm": "55c3f1159da261705b43311087589ef83ce4a5d814ceda651f1f0c10689e877dd3f85c71b5195aef5f65c3f44597eb0b8d5b0cf20429f992fefaec886fd55fb01e11381fed762c83d11d22359667e160b0a1e8346ac7228bcfc586b52a9ce8a6182d97a25cee11b650e2655287b9b4ffaf7603c4d4caf9b992bb30fecf5680ef" + }, + { + "tcId": 860, + "dkm": "4988d09d65289789f66dabcb4a875a8f6ed2ea8bf809d6d3791b7a8bbee8f012305faa81637f24cd78f0c5f4cfcebb8fe611b9d2f48fd9945c390ce82c207641db88119368de8c556eb56962f7f29c75bfdf4dd5962a63b49da628e85a5ca22219b494d74bc8440fa5766f0ceb0f3fb704d041689f7c035c8b4c3fb132d45b8f" + }, + { + "tcId": 861, + "dkm": "03b6985d3586f9e72dc6b83b48dad4e1e53d2aab02dcda5a6492bacdc8046ad6c9343e0b42fc7bffa38f5739ec05110c8dd6cd97b5e1911fbe8eaf857e4644481efc0ead2f63a773b6de9f08b6899f9cf908b79c45f9b7cbb5c8474b9df426df7e9cdb7b1151d4247183c1479014707d4ffe6df397e0766087c2d76b3d8677fb" + }, + { + "tcId": 862, + "dkm": "f7792a9da55093b15fcadc202c1091a0e679df0adf1e3ce9f0ac207855dd7edd6648cd3da54bcf17dd45727ccb0efcf1777b6280049f5b5a1aa5bd6c6170f57e0002cad985393ca963010232634b3b57531122bad164e80bd71bc7827d27361f6097efbe56975c1cbc9be8b98294a1819eb39dd28714a87346f8d3c10f98a869" + }, + { + "tcId": 863, + "dkm": "3ea8b8ffbb29c3ce9bcf09df4108668cb46bc9cfac344a8b35fb8f168cc6b3810b6b864cbac9ff562097ebcf9599c27255337f6bfb0de3342dfdf5827b007809bd73f40cc9ca376ba9a41513afe41165ea787a849baf6fe9be29b725d146836aae39a939d457af6309c0837f764098f212fbd364036da3cd8a95c1023967e7d3" + }, + { + "tcId": 864, + "dkm": "520807aa71d36118cdb84573eb1b140da6660ecd20746b8f2ff9f03713896a0708b118260879322656f47c7ebac60d2f47f0956ad2164017d7f994101745abb8b8e784b03d966f85545b3bf58277fe350151b7ff2ea57db8dd8ce2fd74e8dfc6f7400385d61c0cdaffbe08ffa83a70cebd3c44bba1eba9624031c3c508baaac7" + }, + { + "tcId": 865, + "dkm": "dfc33ef577143036626db3cc8fa82d09dcbf348b16c9b575c9baa6292dc9212324697173f9053feb43ff72b0284ace73e23c2406f7cc5c3549940b382ac55ee4a9e3cdb70a3c58774344755e77c5486b15f806e96e498b19609834fe71e792dc76974926d788ddaa896fb210a95a2606b5f0e50da4db472ebeb618049754afaa" + }, + { + "tcId": 866, + "dkm": "1b20a2d67f0219fef67a0027d3db90b60287d81c9bb7ebe97f2e7febfaa0a34db8ba00c5dd3b7ee9ef254c58f97bd7c43c47f872192bab8835b9bc062206b79e6dc41c7f1c7304b08c1f2eb330059b4a83d9ca858c8e1a4a8c6ab58f870bcfd9eccce4dd2eb07d8869a432c65f8e7761922190cbbd59e44ca79f63b81ca25bd1" + }, + { + "tcId": 867, + "dkm": "ddcc936340aed49892d7a429c91d046e42e102c2764eacfd4e0074f7ae6c2912bc93ffb6050faae499589b3b96e1cc5236b0d8f2af6890f0ef2b5d771ace3204a0565558ec0543432d49c31241282a52f133d89143128b95ed9bc9194f1c59c3a9c14bf3d90b03ea366a4909d7c3e64c13f9aaf276878c896a5a45880f857e8e" + }, + { + "tcId": 868, + "dkm": "1227255b1f370deebe06f8d1744b4069a261059ae6ed9068eab9d63577e9c5ba9c6b537a8667b0417b7e1bf8e4fd40f4dd4e9b485a4f3dc2d72665413d3d979e364094bf6684438c4f76cf46d03292c818b3e29d9fa2ed24a282a6d724e8c09f8a62e8f23bc61e1016448b93758b97943b96653a1857426e43945f924b371e9b" + }, + { + "tcId": 869, + "dkm": "7be4fe503bb15ed80e47b8c409d755a4c01d7ff1ac605d73b66f9cd1f661adb5c780b520036f49e676be05fa8888a547ccc80441f8a70db4beed7b80b5944da47f5df6fd720bd8cb7e64d3462cfe33c66f74d3b43093bcd9bc04f7f237ac1d96be9efeb88f55a85b93dad774601a6c8127bd96dfdbed7ca50f18fb4f92481d23" + }, + { + "tcId": 870, + "dkm": "20f3ead20da81cdaca7ebec3793a37d12b56cd3a1030c86e59abe80959c6c6a258e648530a265617755cc59e8a716db0ca01f84ece157e7d2f9df89091bca4d79cd6b1d8daadcce5591b2d2e6072d6f8b18b09064e7cc6b25895334e51df1fe8714930aac799f7713c7f656e8d8f60f9e6daa9e0b4ce49355b56e98ac23fa531" + }, + { + "tcId": 871, + "dkm": "182fe791a00607736ab22d734a4dce0060ba06c18b93e768067ac9ee17494c46fe598c29c788d158fdcd2c5aafbfee3d630a8519a9142a5bda5f5ef87f5afc1bd98f845349ac0665ccfd8cd922ae5a5ae68ddaa96a9197886e5a4fc722b116781c02efa5e6346a14dcb0da3be471267fb52023c3ca35654b0cadd1846ac41942" + }, + { + "tcId": 872, + "dkm": "af18a5939cefdc3711c60c9b497520cc20335c3773a9de8e64854cdcdcbda0c6b3ac4c34d3f954f49e5394b7d03f5b8b3196d3b32b5ed6b37d73994feaa9f515e14f88d3a9b019c8e26ea7a5d6b90a399b2c5748aac3909e64fdcb8c0b4d7bcc67815824b191764c71600d847748628a33997638e316581af74d97227fe5b0ce" + }, + { + "tcId": 873, + "dkm": "2983cbe058eb7d9f478693b1ee58aae83f011d5cce5f0da942dbeaeca3f0a3974c6b6d1bcacf510c23f8cb335465355f95db86bef12be4d105b3b4bb97adf80a1f73b89da58707a70ec2fb67f5a6d1ce897d01a02e7c897640542340d28dd3a08bed92944ca3d11b477efb0e5fe4e9f27f04efad4484c0d0c99396bed5ff005d" + }, + { + "tcId": 874, + "dkm": "06a376724e5386ad55204760ffdb7c82802e23b54af903af7c7443c9a738b4b25eeb67ddd11216c8b57c4f582d0a545e5470e65a2aa1973bd8f53962614db51be42a1447d5f8c60e2f985a50560b887ca4f3ce86758cc04a5b57e66dfec3b7dc004a676d8852096e021c935a73146fd474b2faa90d3efe059098422d7d2711e8" + }, + { + "tcId": 875, + "dkm": "e18ed9c1eed285b7f4395a5d44ce81c6b2b9defc5609cb7f8f240c124701c218c0ffe3c1ae0cd2a6e9fcec16f2c97295eafe88311bc0c93fe7821c69708d3e1d8d616d2503b0c08099c38b299cf883b2efc3b788ce0065a5367494a24fe3cbb2ee15bd3275164f16600243fc1924efc618eeee34352b8a8d41a4be21e7d60ddd" + } + ] + }, + { + "tgId": 36, + "tests": [ + { + "tcId": 876, + "dkm": "1a406e3342383a14031d5209580ef74405b01e9b391ad1f0344519c12ad38f4973c0a68b59506831a7cc5259d971d0ca3361515d412063938dc63ba1bed4e5abc7aa907c736c8a6ef5f0e1d3c56b47e58ae5eafb4471d6ac760b0b9e909a72c091283f2216e88b10559d7163c2e7479ff4159ddfe59d25ea8bf302e11967bb4d" + }, + { + "tcId": 877, + "dkm": "e8c369f65d2d8f7e752c3a4b489af5db4cffcf507f7824334a4a199675ff2bd7f3605f5e76769d3db8b96fdec10dfd14f3ffe4a4bf716a91b97cf402ba921b726a3d015759507d287aa7e3eb1e9834d3178dc4c8d9398909478ac2bbc8b84956695dc66694f6e7e9a776a4a22cfb1715e232a5eb0f68b96ec72afc12a48671a6" + }, + { + "tcId": 878, + "dkm": "f8141f19538419732d111f9c67b28dad6f186989dc469a85a1790e9db0d7c31ca443553167a7a866f7b27884debc5d1a0d8a105b174b32862961d40cc57922dcfaa2e825ecba29336e6ed294c396574026af14f17044862b7dbb7b3215de5c0477b7d9a07450a1529df83ece04fea2b09a6de12e66e189e937f3ac2a4416a97c" + }, + { + "tcId": 879, + "dkm": "8a6ef2ec627539543a5022d79e693c91da01d4d617a34cd7dd68dd5db59cbe9da51e29255a4047af00c58eb87e31cf6ea4f64a39dcf13f60fa9bfecc8843509fc96a7ff0e69444ece7c2ee48aa70d2eb9b60461ac5a7437881d4e2d978d1822551d7e234604075701a57ced6a972bcc24c323f05d9b5f164937ba54ff803fe26" + }, + { + "tcId": 880, + "dkm": "9d9b3585fd4ee985ff4a86099845bd867c3a167ebce1d426a8f06828667ba849a6737f615834dd79e441c45773b01aec42df1f3c7e965228a1e86630e6872235efc90a939644870cf3ec5be96a20b3f3a6f7126359899df18c8a6f7a982456293d8fd5f2a77f17b361ca672fde31c18a62ed67aa8f85c8c9f748f91d9b16b21f" + }, + { + "tcId": 881, + "dkm": "8ce2b04eded27d57b8b46b70dd549623b114bb6be22372ebb46cdc8e86aacfa784d2a6faebf299a109cd5caaa0f2715db2e31001b0d03f21b161c322ce19d81c8badee72b65f11f44a978cc9efdf94c2318caa68e4d381c8c2c5522495a3c0055bbfb3dea9b83d789b48c3fe7b10bdfa3331801b175f211e3f7d98779b612348" + }, + { + "tcId": 882, + "dkm": "3579b7508bd64ac136f4ff4e60f0c70b360891313790e6cae3bc302eda81739f89e1a88e0b5da41749a3eac60c506957fcf7847ffaf82059fd9d2958fce90aa0578037223b4446852d70daf4c28c57790935726ffd6d32bd9fac91dd700479e17065c848cef69dbb9f569378d9768430b811856fc68b9435e400879a346c1641" + }, + { + "tcId": 883, + "dkm": "8e86c9f22fc7c19a740b6259dcb67a55f483c1ba2b296e89cfc5e3b5609539390088c5f90f875129586140b05bde51b7b347564dc7c69357d3d93eba0fb5c7159194642ad021cf5102d5253cdbecf6e7e8c88eb24b410181aaa8b71fd629edf1727e3a1be40ca63e60e3d68fe6bb3fec4b704fb3a6d8e25b69e98b52dd8b69a1" + }, + { + "tcId": 884, + "dkm": "69947b57cb6096884f2af2c5320a47e6154daeff0e6e099d2282b8f149208bf9aa843e35b85370c640ee0a20ef243018311e7856718bad9efd3ffc1570f903752e4bb2745aac665fa263790dfae89f52d53a1914d6d7763a5df0822b9cdc5995b47b7f4d076bfd01d6b67409a4ae2a0623e28605129bd165da9468118238e342" + }, + { + "tcId": 885, + "dkm": "2e68e83002cf3cca7343736f834fa069f043f94e742c36edd440918470f3dcbd5537b276e8a0b6ab52bda68f3c6e739d23a1888e79c687e660aa0192ef39d6f02e30954006b2ef22d288ff89c9239397da12a48a8e1365595e41a91c3134964e87e21631fa48a3a94ce08ccfb8676b44c7c79dfddd788ddd4f49dfa352bbe7ef" + }, + { + "tcId": 886, + "dkm": "e4547c40fd9470e2df702af8af27990f015d1bd718e4758a81af3123485cbe055e06a163e4bf7a066bd57f212cfe0303831f5e076dd726c3a2e2f1feb8d51e67b8aac1598196ee91ac8c87285a10e7c3993a610a11369869fa7979aa832eeafa46a73e98b6ac312c9bfcfc3d5ec5bde9f102955f6919fdb4fb3d534249bf3dc2" + }, + { + "tcId": 887, + "dkm": "9ba956e689a8e6e2a7e717665da2e66cc6c44f36563fb829eaa574f681e216a8d03efc40b7d03028f55904f563a0f8d00d09403030ee1648dd82e7d4e63e9ff183a621f98146055ba4d5f4362522c2a84115c7822c99f54711f0deff9a9534ce9158d4b6d5a91a4c1025c4019da1907844d74bbccd1b3c1e1a67f85426cc23eb" + }, + { + "tcId": 888, + "dkm": "f3df97db4e5a3b479fa1cf553f8d18589ab08a9a66e4cdd7a38c283d4388dc81814cb5754d28ea3249a65742a1d6aeddf653cb37e1c2a73533c3c8f7a9534c34bfa6b4755d8a20a11820fc8e65ac58527c59004912dca041e81be8d8a5dd23882659626b4509d9eabafb3c2304633445f5fd190d3c4478d846bd0a6009ef325d" + }, + { + "tcId": 889, + "dkm": "5221f0dfde242b2a1f7102e615259d70305f6a837dacee5953abcd2dae7d7766dc321730e949920c1fd6c53e6b243121f806a7a9443795c918f934c81fbc994887ab078effab34bf3fddee59300cb55caa9dd0d8e8cb8f85fd4e8dd8251474f81fca9c4083906542f80746c5aab8b49a164eec1c9a3075f0903afdf08be43e78" + }, + { + "tcId": 890, + "dkm": "6e69376dffaf00d7fd3118b3647066e60193139e5ffd03bdfe7913a729b3bb72493b7cff94f3f1dbfe6557e60509d178543648f416ca41cc9014b637802878ff02d603a240f081a16147db67c5799a27138f59217747b91af25cfb8f6b6bb3f3a4e8cf873d25bc50bc6080ba07d13713bd127d0cae27c09f8395e7b099c682db" + }, + { + "tcId": 891, + "dkm": "a07f92f6496e65ce47ba45ffa6957db9bfd2d1ff85d4d7c8ce2ec0ced215acde5a08d6cbb848523679a169c0be08acf9b971d30629cf79e70bb83b99e9d9ec952fa66e2ac42b62aada6b071d118e2ea5ae21a1b1ab85d2289f4b94a623762b4b0f6512d8c29f779575e570057c0aa2db0d827b65813b203956726e17a0fd475a" + }, + { + "tcId": 892, + "dkm": "609a8d0965a0b30789429f89d0a41226063c95f721be60b5613af800690f0cdf3b99e7f836620538146e4055a7a9c8a0081cc18f721a911ce2127b7610eef9490b8c6f6c09290057b40c3decd8c93edeb62770c5b23a65796e7642129d8f66ba308fb6c8b8146bd517bcf70fedd2feedd8a8a3d669f44b20b43cf28b509c7bc4" + }, + { + "tcId": 893, + "dkm": "3cc8e102552ba91d6ff693074e3494b537185deefcf765079cea4284c92215afc57bb292358ea0575634b4a28be002bbb0d894df96cfac76e54586706eeaa97649f69b18223921fce995a0f514866888aafe0c740ae9d77773add5847ffd91e0216b116f99dbb28a9803b2c94d66d937f24617b21c6a625d9c98fe4562639399" + }, + { + "tcId": 894, + "dkm": "d80888e8d8ac329fa682e090532ac4aa8e2028fbb3d11beaedeae7d6d9a3cb6cdabbd00a4d58fcb64956a9d0efc0a0178f43f26b4439051dc7467c61d1ee3b6539daca46c44c0675fff8e8e452bbd36f61647474ff3b9e5d4d75bd0196e29a1c909f893e2f9c8da4e423382fabca936ed6508395769130270b2f5a4b7e2cce16" + }, + { + "tcId": 895, + "dkm": "78bdfe7172782af4c227d7f77c86eabea33119560a8178fb48be064814bd3d4a81ee6a5008b1bb233ff2b54f64c69dfc9af203cad2d30789d784922f41b0e8dc6dfd02c5d520dc69589ac9723106a151f00c0900e09035adfbac7aa8f57530b8055ea994ffb577cd5b22cc70ba5f9f768ef87b74dd23162115605dbbae77ceff" + }, + { + "tcId": 896, + "dkm": "f1ea084854b8f6b49a9fa8417618f9b48d7ed4697d268b332777b3e6e738df28979e2bb8ca98056782e3abcb4052100a13faed77eceaf8d01f0c70fe592217d72c659e88b0c6a974bedf806273b98d272fd79bbdf30b60c087eb908efbbf99b0fa0da305bdb8f4f32c2b09d3330ea0d8c2969ae1a9388fadd603061c185ed556" + }, + { + "tcId": 897, + "dkm": "a296bf3d279df085241542eebfd1fae92b15caaefcd28254684add1b86bb19af38f0d5936f567ac23e33c81c2d984ba23947b8e9d54bfab79f9e10f9c30f2f7eeb9efc4c8c9b801d171045edbd38abeafb09b5f0bad3cef6c1069f5ee7826d48517dae8de41a407d5366d78800ec461d442f0c415a2dd573de183731c16414ca" + }, + { + "tcId": 898, + "dkm": "af044ff538faca3e8c0013e749678dfbb061342a8d0322c0875550a0fc4ab719022f361353ae01afbb60b73ff247c742975f070eaefe73f9cd1aacbd6a9f60f902188e6931bcfc0a90bc469d487146c99e26c6d4934de625b89ff76bd17abff4a7d1740909d2211265e3d26e357d9599569372add458cab3aeaee864faa1845b" + }, + { + "tcId": 899, + "dkm": "5bfec2e9f7c75f620a605e24e6be457de67c26d37bb829017eaa18d09ae384bfb56e6be6fecde61438b05c07e4a20f24997710ee5c6401250cc86ecb951d187596fb647734c70600bc7bce5d38edfae763015592cb085ff1f966a17b4790643434094788fb591cb4a4751658920692afdf465714dfa73f0bb5f6881e82e4ea39" + }, + { + "tcId": 900, + "dkm": "661b0fbd5f47676cc598f0efbf97d73c0e8d0c4dec0e2b76d751733342efe1d790029135a0d209291c13375b29fbab5ee19e8188bb90c8170c2112c31a069e1689421a9d739a574545f36ff273564177275743048a300bd15311eb9fb37a2e7171db9d8ecfded7a08d025fae024dd955a36b7367831ee6660072c32a84870bc5" + } + ] + }, + { + "tgId": 37, + "tests": [ + { + "tcId": 901, + "dkm": "beaaa40e7363a53bd1bec6853c177b293b77748775c72799d58edabdd69d2f3eb8cdda7a30de937c10d445f34fd80090e361636c726e3c6c5f80d2888fa7438a2ea94a3ddc6f1d863ca4bb79942db81f72b05f497033f77c765cf56b6e3a03e67105802d7ef5bc4c64803d62896b5198d842b1bea8ce04cfac44a3e61040d766" + }, + { + "tcId": 902, + "dkm": "628093981e29da18568078507103456cdf60bf5bc2db69b1505d535d51decb6946f099cbe94d093c1670bdb92ac24427bd1657523643607b51216b7d76cfb2115960b3eb5e998a23d554fdeb83ff2d5beaa6d57800c80883788bc76756811ce16480d997c83cb30aab52abdd344243a3e0d2c9023353e6424f4f77024338f294" + }, + { + "tcId": 903, + "dkm": "9abfc779c3eb711d4ccaabed64f97111dee8248685cebd1716b4c37b8ca0325f15501440db6851ef10b3f4fbd64a4fa2c4b4598931b42bce69341744cb488a65321a3a5ff9d5d442bba3a95dce757c062d71f2469194275a2f5d329d3a209c9b2e12429204a3ff7683c4f8dd2ac360adafdd81823300a3cd83b70bbace6bf92c" + }, + { + "tcId": 904, + "dkm": "869419a026c2b1aa28c2e9322067af8ba0e96b714ae0cb43bd7dc41f6a4679e38dafde393cdba45c0cbb272b23c1e719229520cb00593cd61074618c270b97be8197869e7eb7fbe3c51c50053478b70ebfff940dd49447f541343028e8390d7a5640cf9e532b1daecef833c8d82cc4bff3ba863d57201e63590a9e0488b0cbd8" + }, + { + "tcId": 905, + "dkm": "3f3df90f2b42cfda9c81abc044996793e7fa81c7b4dd30d45dcdad618ea718b9385a886556944166c5d71218ac51d8b29ca31d18c1d4d7a0ce98f6ce49954f93315f7ce069cf842a59c6a422040aab6a400a7150ef577767ad1f00f6f9a17b12e2aef520082978ca336be2aa71bbc9cb5f70564e554da423f166e634f3ae504e" + }, + { + "tcId": 906, + "dkm": "e1b8eb199c5b8d7d89f5ea9ae2cd9758d964b68e7bc48d77a74a3766e079934997b0db4cf33438128751d5745ab162523797fbefd99839bdce9dd249b53a811d0ae6b75364906c7cfd06eeac33f035628bcf25a8b486e7529d5238fbfa53cdef926f07dbdbdb1f00e8aa9daed504ba902ecf8f539908b306fd60a883b3a47bf9" + }, + { + "tcId": 907, + "dkm": "c6abacf34f7d01aebb5c0583a49f3662e325772ab7f8588e198dd4894e12aaaed8f306f084f66b5c3543fd6de6991bebcde67eaaea7c4892bae4e734fabfa53efe95ba09344b7832c9ce6b71e8b0ebee20adc7d27481f5cfe6d25ec109f6be684453e8753cab06645e939abf654c0840a1015e0d36f8de08ca249eeac867d4fc" + }, + { + "tcId": 908, + "dkm": "07e0f2c8bda5b035913f02618548dddd70e674e1a7750719ff4c8453ac691d61bc3f2d76ee3ae5b4f69758a343192f222ec2750708a5c53c589a4a897c80a9c770cc009631966789c294e75aa867cc170ff0e2c9cc0ebfca31e2e991e8799ef7e6fe68d3de443c5011630e1b088dd1a69db9006d1dd43dcaba32002bfc2aba6d" + }, + { + "tcId": 909, + "dkm": "4290b8413fc1000097034dbbd44162d4c0c1b1e0fa93a08de437d83c34ed09c3d0fa32791f6d2d789c539f8bedfbc1d41b6293baee5de54aefe95bf94672d45110434fb2a169aff180541c4b2d73b3f38b47683361c717b9d784ae9eb3d5de78728bd6d4155c3b875a223df1bf4f0164d93605434063de9b93bd4efd7487e66e" + }, + { + "tcId": 910, + "dkm": "25992daf587da1cda47935b8473d171a3a016da2b43acd4f0773cfa72257863c22e4e204ffe0dc6273cac661d888b8101124b664f39937f26f5c3e5d855c9e3d075df78613be656bb0b8455015800196244d30116a78e98913a31030041c39c862b874b23ae47e7886957ebc20ffde1226d8b4df6833e66ad975b82e423ea403" + }, + { + "tcId": 911, + "dkm": "6b46be36ee7f4a70887f66b7069dafc12afec6c464df4fa3ccbaaf6cdce2acd972d90c4f5201e3f0ea865262dd7979984569cb1baa580468661a5d9804e2e88e29e4c25f2d3875f8468de5a13bae5d73cc66b452e739881e00928af5559b388793ac15018841dce8bc95788de1c99f5e2a3920492283849eb3deb5a774667668" + }, + { + "tcId": 912, + "dkm": "31269f2a20889ebf0eefeed38c0dc0a07658fda04a10aaafb4ce5efcc453e2beb5f421e0d888c76ad35f855bb9d60596c40dd0347b78f4aebedb0c7eae295a2a103f8647afec1195983c4f8869189ea90ff6d18785b8ba43898e78192b41a8d175830f5a313d85fd99608f3f1b1a352d454372f263a899afd217500b7b96780b" + }, + { + "tcId": 913, + "dkm": "b88eb94bcb37bb1e9c9c00865d106709c91c666e709871fce474b6dd52280621df4a3790c1def4cea311d429c56039f37d62312e08bb6ef14c6b33b109ef46cd8346c657a868f136a7fb7ac4964e788de67a3c587e286dd46d672704b55cab595065892e5333ba1cee3a48f51d32265a52854a34a4d27188cd4caae39742ce33" + }, + { + "tcId": 914, + "dkm": "5ac923eead26700c7ba1e77c0337fcc9e6a2dbb2b5e926c9999792216a9ee372d079886dee4fd5e697ca2241a3d607a46ee12986faba746daf959ab2ca02e8d0cf363e800f54ef5a7b14432b1cdb7099b56190644a084c0e4a35d49ee6abeb77ead92840a7388641997b760dcd80d4fce0eee3ec2daffa7557ee3f0dfef9042e" + }, + { + "tcId": 915, + "dkm": "6ccc9a5c705830f8b7304b13b706b9c695026cd386fb86e0f9918d172327a57f7ff95d0c4e4d5381302d66af5f7543aff6b3819c5de81fc94c16700663ec0b35e697ecdbd3a7d6adf72f7b3b779feff83804a4eb03a942e4ed2b550874954adb817b5130a0c2cc7e8d01dbce214eb2664ff4ddd02497715fce3e7998c9a37b8b" + }, + { + "tcId": 916, + "dkm": "4ee9d3eceb9486a38bb89358b0c949515cdde355a3fdf6fef7d48f51f765e00737875f46ea64a2f3da5764e98abf702efc741c0cefc01cadb964bae47d1fcd8fbbfe060bf9957ffaea1af203db11977c7739a54944e48b969afd85c16e1985e72782ca28c42aeeede0e83b36dcfce5562e7f7bfa8ec0d423b54caf95d1efc0b4" + }, + { + "tcId": 917, + "dkm": "fdfb06a15d786ae143fc3c5dbc2011629cbf6fc46f57a741556d38aab7097e3b56560a668898392a167bb7246e9a49ba2a83813568c93c5c7738fa4384bcae286929fd6ec53f4802e788e6bf1b61766d83ffe4ce25025c278de93bba1eaccd1689237be1073981dfc2014667ff0beb734b094e72cedd0cf175fceeeb33585129" + }, + { + "tcId": 918, + "dkm": "baefba68a4f3f8c13017eab141d90d09b3a0516531e6a5458e2e60aae7af13554876b5b607045a5771a692f34118a8a4b85a10ab2abffe83ea77a620f9914c7148a4304a8c9846ce2ef40d4eb478485027c9a1947d785454c509f8e347fa92cec0f1e1e54aa9d0a6a23d1ca1050c0c5f2887a6f8bfcff3940651017b739406db" + }, + { + "tcId": 919, + "dkm": "dc8b369a23719710966e04740a4f84878569254f01af68de1494a1ba188f14cd2119041f245804998b4722055120ce00a8d2ea057c886ebbe3b5eaf6751fd12849a3613ed06324319b46d2cc4248efe76cc4ded72c4265a361e156603a3ad349a04a3f26ddd22850366c0138abb11076393fcd5bc4ebc6205773c4e8596c5c76" + }, + { + "tcId": 920, + "dkm": "a7275da415aea77c66b35b9528165c188e00912ab3d8996f6168663a1868e354e9a987f79dae278f9033b348771224f2da51884ff87ddc90e28f91862322c39be160bca7484d8076ef2ccffe2f13fc2ac99d3555c0fb0fbb4503f181082ec6197a3ab752602d786826d91e4deb9db1b8256d2211c4639fdc304d0032e26d4b43" + }, + { + "tcId": 921, + "dkm": "1fe7cd4283a8832c55bae3e6a6e7f34ae991c5f19f9fa8f105b8884caa0d98b3715c04d045ae0e728f03d7aa1e104deb7fe57d4f90e698b67ac77cc411dd8551e5e8169694095ff07138ef6993518e44bf93765e4af1d9e1b50c454400e3c48671cb15de52135f4eac6b74c1fa594388c097ffb0c0eafa8dc60ba29afe7ce399" + }, + { + "tcId": 922, + "dkm": "44236a5c6d69f20ab159f8298ac459625320a917d3e311c3c633a41bb3a6827796335ae9061ddf177a3c1e51ec140ac4ef00a78c87f263d1ddac62cf214ea5d53c59c4677af55f79d7699d35fc543409326067134b8fad44f6670e059530d395c59d4382b856ab5de088564e4213cdaccf4c47e63d2bf6cf53e40e110a3943a5" + }, + { + "tcId": 923, + "dkm": "cde1cc756bfd00e9297efaa8c0ba1fb4bd69f7d3b7219e5f9d11571789c5a7fa567e9804f25c8a931ceba28ad83833d689e0f369bf5755be807043c7e0006ae1e52f310702a5d47359f3079a67fbbbdcdfa1157fa397df153c633746cbb243e2e223a77315a20b0d9215706ad7d3b9dd17a79cd919c3a4dcee97e011a8b911ae" + }, + { + "tcId": 924, + "dkm": "76b1e5412d035858fe2ae8a16ef81fa05b8d65c4c0a9bafcef4cf715c329af5e89b5b90c2ab9bc733fa27519c37483e8be0339bbebd2167f5951d9533a3bb5a01bb4eb55b4437c694bccbd11177dd057234d32e79ae17c75c49f392125a0ea782fd52ab3b7d6f4ba7bb23b254447fe19e4c1856ffcdfabe75db34e046ac50089" + }, + { + "tcId": 925, + "dkm": "7332e53866a0e37c20246f399daff2b97b30eff5edf8f05eeb7e881306307ca4b334c3e44e4066225659de381945ad3a1f403c661dce2aa890fa5ec610f5a8e90d9ba7c27f948f78b4c0829e0f04e53f3d79df426cebe7c0430d91ec6548aff3418f39c9ba9f7b6a9bae1cab40779161f130f48c31bed5ed099f7dc13737fc0d" + } + ] + }, + { + "tgId": 38, + "tests": [ + { + "tcId": 926, + "dkm": "891c306e98086cf8cec2441ab96281d29123a4d5703bc3deb147a96ebfc2f08a403e31265a4331ce9add04efffd14a7896cc81411b0d35492acbc5d742ef67560831913c40d3df95dd4a2b68a32768b9488d4157fc1b79d6390d53b85f4726d668832a8786c6c4b34c0dbe2bc5aa02146ee63e4bd23cf91e69633af9315a47b5" + }, + { + "tcId": 927, + "dkm": "15f2b9f53c0b577d3ebceb0dd9c060a3ef94e58d83e1486c6164897d323b4e3069eb519d91b3b8e3f5acb2e57e6d7f0a0136b0d913edf3fdb15d72b4bf343d0ad1d9848ac01cd3221f3010cf90bf714f687123bdacbc4cc1f0f728191e4fb56e38e18ccb015b370205c202afaa9c77183aaaafc2b2b993c85fd0b9f07a1de2ad" + }, + { + "tcId": 928, + "dkm": "1b2896d690ce618cd0fa6e08614004dbab465fcca20548e1e90ec16e40d1ba73e8e6acc0247a8070eac8f56b839dc75b948a8078077d001c8b4536fb1ab6937b171b6011e424330c4863c74dee98f6a0b09a736876f5086569fb8378c6f14d5ed2cb845bbf0b1826e559c1c52c503227cad185cec0a8b7913cb0b9c8da574174" + }, + { + "tcId": 929, + "dkm": "dcbb1f37c65ebff2ee7584a93fd34fde4bc9cb806412515ed41d51749db7c403b9ba0ffb09c6a4ccba3605789760358f3842365342d9bd60fbbe34d48dd02f2b7a2ca991596bf0051cfc037a9ac5843efbf861e9965c1b09617d8f412c4e4e1af6b1f65e1f26f8b216507e49b8cf5c88ee83326fd751900cf3d384315c17c4fb" + }, + { + "tcId": 930, + "dkm": "b67efbc123a246300c0ed30bbb04bcf9c8adcb7be8779139f37b732f33f76d0538013541857f52ccd8c7d885fcb96bb380cf0b3801253905ac5493efc14e30790c1e5c959a9bbc40cedd0e2127b134825930d03e88b0702e0efdcab78c99c15cf878e283fd3de1d17b65a822a34950afa7b92ef74359cb84aa20ca56b76a35d0" + }, + { + "tcId": 931, + "dkm": "026a2969ff2dc1e88262dbf3773108e33da57305bd47a35f6687c9ef9639343f7af00eaa3ab14ce6a5d3420d18e0ac868dbb990ab291b37768dadd24956b6454d2a7595f876982a6d53f7145d85e3db0a4d4059daf4dfeb8ed1dbaaeb973cafa793fc262c383d12754183ce80ca2d248c462aa4ed5798fd47b83d7913a234991" + }, + { + "tcId": 932, + "dkm": "36d42825695d30e9e1337184cb8185e4580c6b9e219347224b0de50c7c6e5f0f953fe8abb0abc2769dd16ae6d59a7f2153b10c15a42ffa732406759e9c4ab088800ae5b4b1b3122f23836a0d2af1c495bccfba716ae69c34b2ead815787107d988871921644a45642997771e94a4f65439d8b5e44af813e68eb617d66978185e" + }, + { + "tcId": 933, + "dkm": "7ed06ec1531d81a1c8c209de1e2e3a0bbdb6b3d923ea960db3648a0ce0bb418cf02c46a3c7acf0963287ae0d5b33929c88765e3c3057e05cd8bd88e9d1d1edf46149d907af42888074ffefd023fd7909120e2611ca3c1e023e9448b2b4eea197d8227f448c7defd150a23e9dd8a0180e59e13d2cff6beb306084f48a107f6f69" + }, + { + "tcId": 934, + "dkm": "b4ee614d354e97c31bcc6986b0d43a82df3b50643bfb54c31478af3483798e240c2ae3fcfa02597d0a682aca0226d16babfb9277aab2ab5f3a00bd1c79ebb77c1224b136db026b4f66a57861c5a1b2cdeadba88ed506d003929797fd8d3d126dd74f64526330359203fd1d13dc439f9414501020af1ba8ff69afc099ab05c2c2" + }, + { + "tcId": 935, + "dkm": "5eafbfb586e556f7452b70665f2cd9a51d7b38cc47789ac9c495a1271f136c56ddf2794eece6e6b70e7d2571f64f261e6e1f89b4b72aaf204c301488d26b993e244a7e77f507a0505a25d6af668be85e9729ed7e68a300284dfa411894c97c6c2d095081d17cff11daf40f3c4fc71c863c7111da28b2dc6c9bc5abb2a9a0c15a" + }, + { + "tcId": 936, + "dkm": "28f2568ddb8410e39df2d019838f78531fa9cd60da54b4694bac1805b503abcb442b91af33741d0ec51ecac1794f7b924f3488ab6d2bf4bf320b24788f21568652f3dec814c2a9e5ccfa7549e65fec85551b8c97f2c4607c0d254a0aeb3d89fc81332f91c479ff9a262186d2efaccd84de5fde9349e206aa7f941c9c1460013e" + }, + { + "tcId": 937, + "dkm": "7f3e9cc21c8eb1573c831f65e922889f1dc661349658b76d619a25a11a9e4304f61b6889ee31aa9da09cd5e2dec804cfcdeb27422049e5b41569bb0256ab2158c7c12c1c35428711cdf4ae2e4ea405ba99d9fb31095c9a05d0ab6e8a3ae35def8267089fd7e459412989caa8f4d9f7837fde6556b24add1d61c0af79185cce41" + }, + { + "tcId": 938, + "dkm": "9cabfd3f7b31b3016e3c371f6ef0fc8d471af01064b594f92ab7f61d2feb26c07d361587daa283bef6072543b78d6b74c0e56af8c8ecadc18a9ad7cd2e5f611995af812929d5e3ddf81e28967553cd14e42ba250bf1b33371b74bbad342f4cf9c86d0f375f6b478246a380cad402c0b643d427eb9a65d19179a3019b2c7a4aeb" + }, + { + "tcId": 939, + "dkm": "867ae8fa12786e7abef70d55d6f4463380fc794d2da8dc67a3d8e7694a0572b937d4a13f8125f5e3925e637a06cb68ec8320962a96b8fcc58731cb4e09ed138d2d9f79f36ed62acdde2c252958feec04768c5f201f8eb65605b9963bf6239563c328cc9540aa4ea5180639f73f9beac262afe022154a1569e1a18ee1a7bca1bf" + }, + { + "tcId": 940, + "dkm": "f976bf08c1cab2c291ba60fab92d288ac177710d253308e668cdfa1879f548268b5ca43d17230202ac21faf1114732fdecfbb25ead61b875a9a30827440cb8992d3e6c1f27574fd425d4955932ede3c2120b7d441ff8d22ae22b8780dac501e380532222a18dcc3d0621390c030bdd77bac806a5cffd5f8c85d49674da92bb96" + }, + { + "tcId": 941, + "dkm": "11f98a878ff3f4cf8ad1b487621cfafd718d3bc3be3eeece1b1011427786096269ba81c23879c0fd7fcf9d6e76017300f97ebe3ff15e7f138c3e1527981a05ee2d174836547fb682445ee1a4bcf1f89ccde571d386b0b7a080be7b21df020099b867cab2de544953e911a8e90cf6c84d5d5d4c85cc048df6f0de66406f470005" + }, + { + "tcId": 942, + "dkm": "3bbcec520a1b0356c4386470b21abd67d7d4fc75390fafc3c4323a4b3ce01f3b8f52633ab97b671c81c750c56122bf2340fb2bb4753f25bcc55ebeab45cef4f64d120911238a009bd46c68db9dcd0ec3612828aa202ef15ec5c040a1d005e4c967b13c227a703a19d96061f455e80daf837e014e9fca98329fd826fd053e27bf" + }, + { + "tcId": 943, + "dkm": "b45041e242f420955be9da1cdc96de95d8f3f7770f6d5d2296b7c51c8c5a4f613235a39b705220ae462e72b98aba82f5ce3c043e4c450199568609dd6c92b462fff705ad257cf59a36667a14ff89d4e9495d4bf65a94f4beb92f3621a25c4f75bf70de435167f0901f9e177fe62c0d3b44b9500dd6b268bc641f480bde376506" + }, + { + "tcId": 944, + "dkm": "e7844fb155d0ff29e9308ad9bf41eb20ee185a2741b9f4ac73364284afe95ffeff4438a6608ec6694450633ff9e7284f6e477486ca81c8fd567b70808f85ada6059f008d7c53b41fbc024dcd46403a6a45f270141aa9ac6111d4651a30169fd14db975d7e45100f8c690ca57b3000cc6406054f5e15a3376e05307c5243744ff" + }, + { + "tcId": 945, + "dkm": "936d116912a09acaf4842455b827e7f2fea477c6d69a923ab88c1a02acb942cad6defd4bb1b9abd3c5293e2a44cbca8bae7d87982a9b01468ac10810ac1f21f8e2ad9fd88e36013da2687343515146bb54eebe678098400c627a68bdd4850fdbdad0d0536faf28979a3d7717fd6f6dc2728bcdbfe7c5ba04698cbb38a4f3f4b5" + }, + { + "tcId": 946, + "dkm": "43cc0c3fd42b096f63db3612548af095cb26e219d811a8220b3e2f954513ae92940f804705fe304018fef6e2673478e84f9934029b55c85f8c7b33dfa496e0949a33a9b9dcc97353e5eb97bdbe41279d07dab617594c9aeca17e32cf956d729de30f1f11d029238b13ccc5798f793b13c4f9819df2e5a82ee2d9e1cebbac8ae5" + }, + { + "tcId": 947, + "dkm": "593543dc3217ceb97efad6106a1b39e851d76eb735f55c3f3eb14ddf1e433e13015ea4e19c83a12ad399ec5bdd78b0bb582b39ce3659a72f3c24ca97acaef7ac65316b05d719a6e6fb4df306e9281a90a43b87dd9fc6eb74d10b8b27ace4f0d152028ad965a7ea98c9250c84639a24f0743e649ede8affd9049a57d4223d22ec" + }, + { + "tcId": 948, + "dkm": "f46fa410b1d3c7aad35ef4ffa57585edef03dfd7f8a35eae3204360ca6483053d684f5f717056751dae3c168f7403929626aa051e491a4246c59763f2047766a42fda9c6ef56b9dd7c02e8ac21925b2dafe628cedc6c599b69ad8d97bc696dc7fe41efae001dbbb58ea0e29284a505ce2d9be1be987a61f830639b57f6df6a75" + }, + { + "tcId": 949, + "dkm": "3a15f4820dbd84a4b365773ab072c6dc61cbac48db21cad7bffa64b41b500d6e923dc19925f0790fd4eaa6bc9bfc1b723d351c1f45f57ffddd1900e59a7cd0ebadf83fe1324e263169cfd0bd18cf243bcd46bcc0b62301bf293c17e45f04fdbfdb5ad2bf21cbd8ddc1345197b9aa9ec42137e68c99bc815acb58d057e2674954" + }, + { + "tcId": 950, + "dkm": "34f8307669b70e712278eba56e27f96347debe868326aaebe803b3123bb6b76de8c47cafd6030b7dadcf66e36385e3aa45c520b91d09fc2d41458f7fc6d6f9062b28e601bee87987d8abd3bc97b69ca49b26c0de37e0f4711959cea45c3b0ccfafcc5376a11ed3b5ca11345ed3d42740e7b41a89a5d8ea5a1124975e5280860b" + } + ] + }, + { + "tgId": 39, + "tests": [ + { + "tcId": 951, + "dkm": "1f5168a47d39cd2bbc37da3a1d418bf0152cdec5d3cc5b67b88deb71a21fada200c6697ef77671c371afbfa986035f6307392ace6d64f528f31b09a8e346eb67c29e28c6ca9591837764b78cc3c6fcd04425305a9b9e35edd6829503487cff9546afbbb0d076ad346d3102b1a08e5136fc7b7ace8b56edb48e71fa9dc01d0780" + }, + { + "tcId": 952, + "dkm": "9798cac5772d8cf0656e8016bb65f5e055c7732bcf43d2e4785a224e1af4a402f83766d829082c4106319e434bb20336c965fd1cf5ce30792b7c4e208f81be37d6ce61529f1081a165cf7fde068e2b00b816dfbb8d20b581a53467839c68d2132050e42139603d7c5db6e1204ad13e77feecc16011c1f001309c9d50def04dea" + }, + { + "tcId": 953, + "dkm": "a85fa6563e783298e53e77d0de132d0910da98600fad4ec199a132ce5b887811d0471b0e6281b77fe44294a68084ae59ecd62d4c582587c2636738f1fb6ca560667a9a49d8c19c0a2e4e3cfe361668be80d5e8564cb573a75d683a674bf183a2bfcf39fd6126f39be21fc2602ef871bef42851a26b64cd4ea8d4b96ded57341b" + }, + { + "tcId": 954, + "dkm": "0bd8b5a3a31334c66ab85a64aefad07db9d28a401faa936d162f8c79213b38b797accc2a51496d37ffd945d1899bfd3dea096d2e5717527038540613965c4c3c4079f8f9bd1b01a6f30340eafb0af716080829b2679bba999f5c85b601ab018e1e88b6c909f13ff63b98869c8cc843a3fe8355e1bbe511cb1dff47f6c117e4ea" + }, + { + "tcId": 955, + "dkm": "3ee42be74bdd6bd351a12c3a25810eb81f1ded1c655ff264aa0f6aa34f462dc262b10e3240cb8aac486d210c6c2e56490af8451cbbf9bd20cd99f05a3cd17eac92efbb5ddc21765e8ddb0710e8481a6709416242bc6fa02824465defef4b416fcd668ee51b1cfdd4bcd62187c5466b72f1470669f372d00c5acf11aef879cb14" + }, + { + "tcId": 956, + "dkm": "4a4ddecfc7e07d31ab56be378ec595ab3a7a00e06cebbc2b5bf034e57b2c9b90f60e59e14e90039939306a91258326d584334a9859fcca2cd0e4197d46153494a8307373b2dc3385aee0363fa2649404a6c38b63b57b16975211a7b61af2dace31e4c0b35f361e44c7cbe5e32fd48eb92370907179088745a0c5b122253ffec9" + }, + { + "tcId": 957, + "dkm": "aba3afb212d4af631b5676da16b15d49c394b9d5ef9a41d98790409dc69d76c525bad208bef4519d579dc671451c0cff163362dc1db0fe9e63ac9f971e5ffc5d72e57794119326db1238f312f0a10e130367aeac3a1d256503528514b7d8d0050b699216a53be20e39114ab237c18a457082773d46c9000eef0895552b040b8d" + }, + { + "tcId": 958, + "dkm": "ca8a6092cf8154546c0a373842e66c8511a33515306206f8e372dd5230d521534efb0157324134f1a4635036e81abd9410cd5e05115f39a192d0b676b7c9bc9a1316af93cd347be3daa9b3b0195ca93526614ada316b47f2f22e47ede734165bf606ad740f03a7e944cea27e9f05dea9f2d57526249cdca6c8c55fa58f5eeb49" + }, + { + "tcId": 959, + "dkm": "1c36c9906d146eaa2e747fd23bb53b1e523993543ce6b77c081075510a8f587a7a19c52adab437a1b108ca24f4d50d800111d153b4f01294692c8f6d132d54cfc0d65206c29a5930bdf6ae6c0d7ddfe213b4fd41c0d3c28b76be725a5b6b59479984a5d06c6d4dde26a7aa8ec329e685af8dff66e2883976686ad5ba4a341811" + }, + { + "tcId": 960, + "dkm": "ebdcece669ec7801d1fc3206152b5c52d4ac34b22ae36de020d8645b2727e503cc0fa3e59bfb4d42b0510a9788a47b75eac260782b09bf8079bf57744525a17773e99b0d8723e3fd3df92593f31742a0a03af62ffc37804d032825cc8d78d7a81f56ecaa7d923324e1dde21147454227b8f5fe62536f46ee42dc34fa2a780ec1" + }, + { + "tcId": 961, + "dkm": "38ac430d38de892b8a72ee850d0f6efff4fbcaf73638bb6c898759d9094d04cda9ef2707500f58da2cf32d5231dafab29c19b6988fdcb03d74765c24e29bc05e7a25842a2dee252658f8abe33e13c4593ceccb233e4138c4a5fc27fbd0d11f1e8bb0a5c758db079be159e058bfd3b60b60f4ab7536da9d7b9aeef73c64abbe1d" + }, + { + "tcId": 962, + "dkm": "e4bf7ac62971bafc871bb11c9c392eca701d7a60b3d62664e32ec17e95241dfb275033d69af52b6d5d5a6dc0ca757641518453ca3c38ee8eb8ddbe4b01d4170fc774113cdc48a4d5cfe9381c15146422701e0b9e0665b6c417d99bb85369dbfdc835975f6fbc1e9b183dd06be00992231f9772fc21a0262f6dc7d64dbeba0306" + }, + { + "tcId": 963, + "dkm": "660c3d4b543193abe9890ad5c26ff2783b69bc7971846841841262cdc6ee6478673ef9954ee27a108865674af097fe55aea09891e36b5c079bfdcc3b45cfcddc58e16139571fb82622f750b019e91c52bc07a15543bd2909cefc3e792907ce06b6df0eaa26a3ff20ac9f589a2bd7435da24e9ee3def1d5fac7230c840ef98070" + }, + { + "tcId": 964, + "dkm": "4df601afcd8843582fa02dbde4adbd5b220b4915bddf743b3269cc4558846541d1e29a9b57812716b97e3cb3fba20a9cf0748b2064e92867826b07a6bc63893807c2a38c51f35fb4e9f6a98e23ff0349c79b02e8a83b4edad2c7dc4099c27b36110c259c7dae05fc794e36e0d4da01e6b3f8c89ea041ec9079f8c9d1fd6dfda2" + }, + { + "tcId": 965, + "dkm": "83958e2a1c69097124f53d0374bd1e01b62b025a5dac58b38cb8f0fca5d55297c2e9162711b61fc07ba63efff4a991c58a69b3a80fc7ce996ff035390efadef780615ce56a6979fecb88dee4e7ecee5a3148dfd811213493c2d42fa4843083a002383d13baa9dbcdbd2c4f975af4de16a27a6ee0262e3d0ad96332f675d963ab" + }, + { + "tcId": 966, + "dkm": "2d1322e4d455d7fdf2f74cbf3801741cd4cd0b5322b7283f450e15ff3082b08dd906f55d881e4eeed00a9408f885da2d9c5f76151493eca57d9f57d06cb2c1d2a84452c28cad5091abee27bd49544b4ce005b6b71783a2c7b819d52c00a83166012b70e6dd5713ea7b031682dea67e0922ecd3b18a24326f64218e7fdbc8b910" + }, + { + "tcId": 967, + "dkm": "514afa8fe8acbf456ab5f36c95e967f9c570d6fbf32bfb24967d248ab86cc4cb48a99051ecb2b7b0fab94edb5b63d933f9a192ac083340c25a7aa22405642f6e088281b1f755aaed88d420a7cf98b368f425d76cbb985511461f15748019dc95b9fdd8b9aee997ca86ffb7471b2718506dea1134b7bd9ab37a5b92ef257d8592" + }, + { + "tcId": 968, + "dkm": "7e1e14d87b95d70d0f2d471ce63f24e089f6da979caeb9ed0564547aca02c31733aadef89358d6f842448556ac79acfa03dd9b93bafec3eda66be53cb43a130b449db4e8fbf0208fd77a9647cd77ac7a5e27d63e566170cf3294f59e8aa8373e47a23f6b52602a6524e8ec7370944d333db2b127f6c848444fd918d5327cdc7c" + }, + { + "tcId": 969, + "dkm": "1f7a76221f8dc434bd8ac662b5dc23df9130f63799fcedfb4f81f5b704e84577189228b8947f93d8dbadf223af7e6a39457d3dcbcdc4c736dd7f2765d37521f7e55cc52919d522e9049fb826251b3cfef765f764a98fc808ce1ec6fe579f922eb86938a29ddb656e9bf1575ac58f5d6c8ded99e715067860adb2fb0dcf4075dc" + }, + { + "tcId": 970, + "dkm": "662d02da91c06309918e00284f3452ce2d4779c790a4ba6cf1206a7dbd8268e2e7a26f20549678aa04ecc192d51ac5f07ad0233e46c45f1f79d1348a2ea7117d38b6f8d132343c2def36cf8823d2609a1615c8879eba38007e4b662b1b6a472f9a29bdebf718958b6ae9421ed2c857df9d34a52334eb8a07917e97895666910a" + }, + { + "tcId": 971, + "dkm": "d9ccb9c19025b61d498e8d7b30374d8af39ab3e2e885883b70dbb22dc5cff74b04aaaac001a41f37c23aa9a131d7a9d7dcebd6196c96cb92aa091eeb861ea3953b4164ca4d20308816ae9d34c395b1661e07a9458d69d351d3ae255ba8c3fac08ef8ae4a6ad811c9acc35ab162aa6a0219d5faa6eafa6d616d2beb08529c2d50" + }, + { + "tcId": 972, + "dkm": "739d67054d88057198800ec15abb56f7eed34718db5a749e3250cf84e5fad026248db0e3151a19449633c00e6a3f9684a040c8880b6d93f26fa6637489c281ad11fcc75d92198d85ae664bf693353da4f5f56c09af36bf42eae13b0fa61bf0067f4789d77a52e6300e13a5004c4502f3f1515ac79b8fda298de8937a24b0d52f" + }, + { + "tcId": 973, + "dkm": "d3daa59bbe96568b058f838cb9cc3fbe77630a897fcdc59679367f7d1f5b44944d8eae8394741ce383aa15fd4e0bf42e0727a9b2a5d6d0f539ad7cf739349cd30f5c4a074132b03c43d875c6c425024b6ef639f832c86dbeb2188a150d5eecc92251a951be8e630f980aa074ec6c72023871485c903b7be6979a8675ce51838c" + }, + { + "tcId": 974, + "dkm": "927819da05a6513d3d62bd547714f90261e422edab45a1c830d76d526710bba43992f09dec2eb84b1f1ad0af78e8eebd6f4714715f3bff777b670576aa464ae357ca8a2bd884257b943bba65f62ec9d7231a188edd20db2fd793422d8ad6b3ac51ebe9b15259bd45c8338ad84c15d3ec37831a88ad38dc3590f67860496221a9" + }, + { + "tcId": 975, + "dkm": "4d9503f60791c4eb9a6ec6610f16eee8498c01057879f81f8d7232629ee4afaaa86c3a9329f79268364a2719e9bdd7dcac727ff6e18e9cfda6e15dbaa6ece87ecea3e4c2fea324744594361085f2b4aa8b503cc5d57f46950f5201c4174fa894f0522e4df7f232990d8716023a7e0aa58873c99bad6432f37aa96efafa5354fa" + } + ] + }, + { + "tgId": 40, + "tests": [ + { + "tcId": 976, + "dkm": "507d1e7b79ccdf274738c5e6ced96cd9e8340f68c2ff9c6fb0f3a4b37e2b78b512d95ae772d54f32a9a0c1cfa86985e241a981e736258c376e2e96e572b1517f89426ef6192366765b3be229be238c118ed6dd94cff78951db473edc817038960e4473150c2bec6e05729e52c9703837b32735685a5270dc54663474dacb9fb3" + }, + { + "tcId": 977, + "dkm": "7c1638ec7675858f8cc21512a572ef1b7c09c5f5d07c330fb2386bbb45a8390752f3c1fc60eb4e6471892792be80e2e31c9f43817533b53b2f97f11bfcebee38143668779f8a706c15734b2582b11a3f83339dcf6d343869ee4b235042fa9851cabdf78dd0800f4c02472066a2ef8cf968835ec8a71d8eacab7e418a984d2121" + }, + { + "tcId": 978, + "dkm": "2108ad5873da39d16987b2ed69ef42b7f51222aab68d764f848523c8d9c7ff35a2ec6edf68b674f32f2d504f397c6cba827eae097cd25ed3b150191f7d5b7b37f1c06722ef830114fd8e22dd9b8ad3dbf23b419cd1d067964d05486ed2b70e998005ac9042b60693ca3eed85a8617cb3b30571635efdb5f37b9e83023e2ea200" + }, + { + "tcId": 979, + "dkm": "1645795e2a2be8d7d66e50b4a0fe212a4caefca6962c7d873febe5cf928f445ffcfd4596b98ffe6cf0a1752ec23f314620c02a4cfd89017c3a8fe7649106704f856d4190fc85ddb003937919a32103bb77a8be24cdd70f31de8ac9cfaf3de379b3d224a54a8615f1c4285eb7ad45aea773ccf386aae251b44f01e0c33a789734" + }, + { + "tcId": 980, + "dkm": "27892acc354de37695ddd45b4c778e639dccb9a5647296572aa854b446c88bd039259f9e736866cbab61bc3730673b201d11522c61541dcf0741411bfdb316ece3390228ab083ba8d956291aaa48701c8180aa0201996ddbb77695ad1f4122e9dfcccf1b2ffc00f1ec705edca0b178e1176d396eb28ea700b79f013994434fde" + }, + { + "tcId": 981, + "dkm": "53eebef7e2232c76c9ed0e08c395a556fe259fc8c9d88b5405a0f28925e6b5d1eda68a167dfb89fb865fd10a236cdfb1c009383333ac47f37b244a399c9bb3d4235c446337a9adf881ab4c82d625d0fdbcf31b5d7b29ac9492a2d881ac1b1ca3f074f7d7d422dad5971668fc9fa3c61ae273b553e4e5e4bdb70c960d71a26dc3" + }, + { + "tcId": 982, + "dkm": "e0e44c83828a0901bbc26c653e4bd8899161f720dd1006e00057c795c848a68011728f78f17833454eb0a1cdcdc3fdfb0db0f8e6fb8051ed8bc4789f058f05a2f89f73ccb1c0cfc3177834a4fd94366d8d32afca6449aff0ebeeacc972ed5964670e705f46870a1e6647bfeae18b604fc16e48124402a301165c780a9feaea94" + }, + { + "tcId": 983, + "dkm": "3e5a028f1860e3a7f8a3288eb0d6e888a04819253d9faa6afef6fa1d5e92452cc88a7cd817e9688513bb20c1c517a81ad73204ca9221d8dae5778388cc70628eef3ff4e013173bc1e447f550c730a4037dd00ce8e2030bcc92a8895edf95d487235f4c7517f01139315a337d090925c377b6b94f3a60d4927dbac06628e67393" + }, + { + "tcId": 984, + "dkm": "340374cb585bfe9bed676dc16dd18d4d9f48bdf259ec51d7866c6729b4205895f67f3dc60875f0b91e04682c2b21df120c744d32d294daea8b95d13347037b24be56c568980a9628cd0cb8c61d5eeef4b6e739891ad2464a575833a4d07803da510a32568ad5fd674eed571b207abac83353ae82f7d8abcbf50f4d0cb6ef6546" + }, + { + "tcId": 985, + "dkm": "285a4428ca478f0c0f4699667046e30d4a2d12a445c154eab369d8b34fdb3b52a16f19c92d11854a44d5c88d6afa02671ae9d25105b350530d85eaa11a9c83b6080dd7ee4a884a5ec2682795ef592d90dbb8b1b62875c13a7790091868608f8fadb9fac2f7b4a1ebe34a9eb0be92a20e2ae1fbf294429e4658a406b55a4d97e0" + }, + { + "tcId": 986, + "dkm": "516014f14b1ca6b3b91ed719a4700e87ba90922122516f07fc1464ff1d5c87c82c85cc4aa24b00bc87013f3b3383d3827dfd7ae9a3fe69d117824a86e7cf3ced13a46fbc2515c935ef4fbf44534876e80bb32023a8cf884a8f107569cae3a3efac3315ab31a57a0f522ace40a248b354491389fc562fe26a5f8cffd064fba521" + }, + { + "tcId": 987, + "dkm": "8660bf78373956fc024f2cda8f2a209dab73c6125032cf1db32ce3e6405eabfb61c1ae3cb8cfb3277e8e3223ddf75f332970a729052906f539d028a9e2e3228009da29d815779489349b975dfc8e4aeb1cfb4046a2c0bf09bb3a5679b25d093040a3f2bdae0ed324ac2947f32c5f6978f4f25c47c020ca8fc9b1795d5ba39669" + }, + { + "tcId": 988, + "dkm": "fb601c3698082ca9b6163382aa287add6d6ee9ff7d71d9f04ef630ba82c37020d4526bee52042befa9e5943c2dd61500d0a2db97065ad037486a70d5957ce1d07a598ba2d5bdea5901da0651773ecc10d2895b68145c2b6d462650351398f591abb43315635e5b47884ae973936109f640bcf1a28e9a2730101e09fc2930db98" + }, + { + "tcId": 989, + "dkm": "98ad6aceea325f8d719d6e02a9a589074717c2e410255509adf7eb9d5beb66099c8f48b8350cd951fdd03ddb0152b0bec7a69f4ca23d8668a26caaadef81590b17ab66ec8b3617826ec49fef82e4b7809e60d609f3b21880f4dcbfc0915a5d04520168fb107af4877dbc218115bded4c5b63f7e20c89a6e291fab75906deac4b" + }, + { + "tcId": 990, + "dkm": "4e2ec0ca91b4fc3b6d989c4e80faf3b491d70558681da5ea9acebb2fb9bcb5385c7e6414011a761c8faef468c97471ab5b9de03d917269d03ca1ac0e4e0984a40c0bc75327c1ef0bfd50c0faeadcd9089169b995a490c430f46f2de702bf94616c55641242d83372657464ea5b994fcab65377524e4839ed89cba3879ca0c734" + }, + { + "tcId": 991, + "dkm": "525faf89183e0dec368e1660dce6bfbb9b987935fca04e163cb1615c617c40ddae6269599747d8f8dadfbfb656110234f976ec554bf8bedaedc136c624e12ff6ed140c290e7b84f55416661d33ba96a1e750fa2b4aa5062bb751036c51bba5564cf103b0d82aa59ec0d7cc690fbaef1a8957275f29db11b9217aa46cd3d59d26" + }, + { + "tcId": 992, + "dkm": "7b717e47d594c8c1425d8437eacaf0df2715b842f2da412361f0d6b0ccd94a04ef4a15d151efd2a474a4fdac4a3472f51c66fc0252fc357e1674cbd762350006281b9b593ba0cad5ea644d687347e7ffdc96b7562191da51478ecca0cebd893e8000c7b86493942d8bf41b2b198e3f01b80ab405b770f65d379514a08fd1b220" + }, + { + "tcId": 993, + "dkm": "0a3f3508e304e8a2bc5efaf445747e972e183b468fcb926e40c5a93569e514a45498547d8d37dd5192222938df89267974474ac5d46b646fbf8fe0451c2f38e0e196ccadacfb1ec1374e24fd614f5b24abbb05c078e29e81e66162da37fba92e7422c01be38d2ec19fb182e56fdde831b78ae8a389ff8710a08553b6c1fc186f" + }, + { + "tcId": 994, + "dkm": "8b15502172599520b1b1010e3d8187cdfcd5818f1947d01d4848ca831f0977f7735b65afabab6e5bb5d32c41d30440a67c0e136a0cc4a21081d48711e9deecb0af71e2424b2ad8c7a4c365698689b4cf8164a033964f25d8d997084d332ac976d254540e83d2c6b4fa3325fcf7bafa946072f22f86a99bcf6b6ff842bcdcc140" + }, + { + "tcId": 995, + "dkm": "0e8e5c9c75f5f116d348277d9de21739be5356c72d1764dfba2cc3a537dde48765a5645155d10b88574229e7f3f5b86d6ed5c4a857ae9c7694648a058c06c92ddd53cf026b243fbf2d3142551b4c8be859027d852f54f3b0532ab3c2059065cf98c61abbe94d987f734996e927cf6d4e2f388ca5080ba97dc2093fb4a68e67b2" + }, + { + "tcId": 996, + "dkm": "ac0b176787f1a876a0aa5077623202aa492b6fefd9aaa1793763494e661d1c5a10f685b7bb60029a098807ce7e7054c9a08f32dfe2dcc1d02fd26068f8264e5714fe6cc65681cf5bf69cd702c3459efa0b3da8a4677e9e015990e56799957fffe37ff201fad57a6b3e05d6526b8a092273373f66e59b9e1b98ca89b0ce0586f0" + }, + { + "tcId": 997, + "dkm": "72f0b607f509d8206fb2614c010637c577359031525402d44a7a5a9e26e5fa2101191ffca4a8f21233a289f3e5b5c8efcbd054c929da7e82e018ce4ddb154ad57df4c8cd9f036a46d1cdd7940e416f49f4dc8ebc4bd773af53b7083d7ac10bd2c4620b5755964c92d57da8fed89eedaf79554a1bbd2c391991154545085e2c6d" + }, + { + "tcId": 998, + "dkm": "6e354bf0437091e492aa953c431a760314e042b62189b040995e98b1b81500e9a168061e030f7038a6bc7457f8679038a6ad412565ab66c7e4ff595fa6d54c1425f50951270386e87748aae755a345d2c84afad6044a24c1fd7870e0a3611233e92577559f77c86bec0fd854a0b610690c65c71e235e5267c3aba92cea666ee7" + }, + { + "tcId": 999, + "dkm": "96571701da83aa52deb1b4c135160f3347e79a86db1b6c61c81e35557bc098ab22b8cd73fb46bbb9061a6df8a4a2c4cd2265215b3d744d02725b58e944dd8a4013b295b894f4932afbbc32aac840fceff2442548e3bca70361e86b124321f5ab8a5364f12c8601e55dc90a6f3e9c4b0b6c1e03e4f3a3b91bcf47fa82f72f6acc" + }, + { + "tcId": 1000, + "dkm": "b7699fa915d73e302ab4b1e39134c6c426876b892acf56b0bcdc5594629b1f541107a6ad5a88b47fe688490a2e56cb6430c3f67a7213715eb8039a184c2b38705afbceb5d53abc0aea0c80a8dc6ca6c9a90d87ca8d0060c578fde56a299afa0c0454d2555a6411987f8de21a7f23a16d3e85142c501019de5e954e974a0eb651" + } + ] + }, + { + "tgId": 41, + "tests": [ + { + "tcId": 1001, + "dkm": "480aeec486d569ba9b920671505c8941d2c7ca00e6538c3a5f400346de512f6c48aac7b6e7896fe59742b7bde2481e89c7f3eb99923ce14d6fdef2bd084abead610cda2ee925a9c00680fe4e5c3f23b1d41391daf51967dc2b8458186d0a9a251811ba5ce5b3a0cfa5ffc97929b96627d5fef9d589dd9c2803fb91c5b41f4440" + }, + { + "tcId": 1002, + "dkm": "f36c23e0a1e6a7e2d49118702a54dab17bbdfb05a5bf3b08174394468c871e49932700d8262d30bb9c78456f12a6d36d66f2a95a7ac8b7864b9cd6d15766f774517c5e3e4136459edaa5879507ed3f3eb85832616e5f0f6111f2911e28fa21ef5c6904befe9a465091307582ab963808846824468b1578ac57d556fac961e611" + }, + { + "tcId": 1003, + "dkm": "e6912edb80ac2fffc130bf6fe567a014991aebaefc5f98f15724471918b68a84aca1825ea35b135077ba980741a035b111012804de8ed8b3656d80294363d79bae87a4d0bfe47c886e2b4c048b057ada5313017c900751a135a566c2ee454f94f4459121a8de3d2fa65642f3d92e9bc76cdec12341597ec136efdfad2dc66bf7" + }, + { + "tcId": 1004, + "dkm": "158c336372ef0bf91807287714cf05eae777ba2636b7a046948aaca24a0472b08ab63a109625943c75d50a0f9b5e54ca38a3879ab69e22763ff4146bbe36f642c48b817d5296b9361e874c9881e5725cd8233cec0b2e294300d31f2c1019ee983700e99de36bf6ec0d2759725d90d58d1ca74da76064a8a313143ed4cab3be4d" + }, + { + "tcId": 1005, + "dkm": "6638503f5201fa1a22f7a5377cc1302b3bfe6ffd8d5ea0d2133ec975584298598b16bef87fc580f24a2031ad18e964a790b4ffc379f7b983f9e8ef0c8c2d600752b35dd96bbf447944058a1d07ccfcaa45a76ff7020a68dbd1fc516c62ce834c111b43d1f90cf14038f43973b480be95f77f04cb0e785b6f3c72f89e27f66d70" + }, + { + "tcId": 1006, + "dkm": "d76318804811f141caffff52892860cb83866414bd08e24c7ee4d2eda969300a61756d23588755de0daa056ee65f3515dee52124b1c474efa86c2bdeb72e49a2a17918f7b2935ae2f50f324c4011e4c31126063c3d1c2e314854fadc0e6ad17a2dea52a7de5a71fc4c4c449f268edfe2aebe1d94a719384958d1f52d44acf1ea" + }, + { + "tcId": 1007, + "dkm": "d75c2f0cf54b88904c0bcd8e72a0df424721388f47e05297864e502bd2c6f621d6abd4f7df22c18797ecd6c9e9796b03abc2d757c1b9ee9dba01c546579d49afef1f3a0601ff5cb8a63e64fcd9e2675c0c646ac34d45214407abe5d27524e9c089f1972a567608b7d24a29e812aa8faaec139108696f442dbb73816f342cf287" + }, + { + "tcId": 1008, + "dkm": "23c0323c4d3b41f67c3ef4ba32ce1c3aa697477267edbf384aeff53fbd0170c1d0645ee3518bdcaedd76e6af39d580e9e11776b690f68ab59defa70e3a4385c53d616e5bad2323f2949ce5240f3c9d6b7e4bfad35ff82a974a3e9930fd0cfca88dc5b2b5b4ed3b7adc8cfd511c11d3d97d7576676a8a9d7b00221d2c9b1c3bb5" + }, + { + "tcId": 1009, + "dkm": "ad3f9bbdceb2c362dac677b1df12b4f85bcb3fe4e87ff530b9d718e56135886c46a6c2654ec32072b5f9f685615d62ad8957f8f91bb1e6e7b9d1f9870d9cf86c0e5ad0b19146bd5420a45adca853a78187c5ed366060b466b71a0192587611de978d253e43c3e41a0d1e829624f50eef010038929ae0fdd557b724650c38d02e" + }, + { + "tcId": 1010, + "dkm": "181dbb2957ff1f133433125998c6ae5e38c642ca18765e6e1dbf2039ef55834bbe5ab8cb427409afd826587e48718a2ec5400746c83b9cbcc8f298badba38018e49dbea65ea78c27ec8f80e069c81155807f3ce579ae90b3253598771d66d694b4de97aab39b45d9e5bc14d2430f560640f29fcffc33ec07992ea2a3d4394b5a" + }, + { + "tcId": 1011, + "dkm": "6c6f3f6f2bfe592b8cc722780240c71edf55032ed3894ae4e92c6a4d97eed238613b06e6a1d5bdc69a3f4c00e68e4d9dc23b921b00f5eb26aff7a721f4df11eaa74686807fb3fdc2ee62104e3548929e80c19014713e3b2393cbb63a8dce80d99ae4eb533afa676f3df9174eb8ff15921cf8880e67bf626f5103a11ef3361370" + }, + { + "tcId": 1012, + "dkm": "812db818ad41b7d2cc4d033cab7830b3768c34112032f7550483fe7aab8d83eb1e524667f2632bedd99ab9616f845136b618bd7b27333bc5fe04b89bf23104209976cb44fc8c7d06296c15f0592a6097dff82ef11cb29052ff1bb6742c409df863732ae90eb579f13f5aadeacc2f787ebc27c1cb892b9a66d1ff726cf3d736d6" + }, + { + "tcId": 1013, + "dkm": "734f8b57f8a354fbba4f0d90a81939c743076f68e0a8637ce52f64c5768cf83cd7f636e70fefd96c127ba786ca0fc0ab88e7cdad07c296be0b9e74de63574315e4d8263efffac70361000bec9f2094a2b72aa040abc409da0108bc88d3f5c25c9406537a9123448c4289327de96148082e683bb58e6f5f4021d38e0c4f8211c9" + }, + { + "tcId": 1014, + "dkm": "97fb0fee1f81afd99ccfbe3908586e42fb329cd0a435fdc5b59c21575ebe4ee4ffbddc85eb9da25ed70695cc86cd4b25773a9017861deda75e4b02277445d7f8f50d736c4002cff752aa88f861bfff31bf4fc23f6f9de6bdba5f0055d2b9727674bd8033c9e06c1b4bb773d0723911b91ea6b9bc523c0e27cae6447f56377c8f" + }, + { + "tcId": 1015, + "dkm": "a3af49dd526f61a59050747e292f73d26bc6d419b69ac20a1b2f80d84460eaf556b1089327d6e569182b0dec4e8bc7753f5b9fbb359f654101c888d39a144b5fe759008161bc23c1ba00038fa53d0a88fac41bb845fe6e0b658a577eeb8250ceef5402f4885cdcfe5076a5e1ec65ce5750bb0c67f85a63f2f4db4edf4b5f4c29" + }, + { + "tcId": 1016, + "dkm": "25b15ba3507e4d0760925d2815231ef0ced0096d56d1935b64ba12097b7b28596fe644ba02411038404305620b33287bf0dbe28c4c23f789dad48b4088cd9f7ee7f58d605e68dc80c4f23e2f7d12868b17c0a640f0b53ba7eec47da0c410b46642b55ee8a6377735faa2b66032d64552a8cac23165ec1be3bb634de9ad1a4b8a" + }, + { + "tcId": 1017, + "dkm": "49835eac0feb16a6c39329e20320db41d96090f184d71a3c91056bdde80daec81808a0d07840350627e97ce95286e7e4531e1be511ca5bd82efaf62aab0e4a1fae9c902f409ce862a40b9c89c88b7ede6d7d7d594291484c4807249221eefca2f2a43b871899741d25100b02fd99a9c21a94ae7e1f7bfa46942cdb694fcbacd0" + }, + { + "tcId": 1018, + "dkm": "ea822b2eeeed45cd865a5685cb7cd0e86de78145827e59499a233b8d868f7205a8260aa07cbe4dff04d048bd69966752316d29c7b9ccd3cb7fb92c2e1430afbcf90e3e23197fe2ac26f3b6497abd53f6ac4e022ecd5608c33b9676517c97c02833e15c40a45781d166c6b2e8636d9dabc04bf497567d5d376b23bfb7239541f2" + }, + { + "tcId": 1019, + "dkm": "b297a987bece4f32780ff6bccd56b44d12bb481c277989b1a65f01b7ada1f9bdf25d59026fd9c75693b37a9950c469c87f96fe18091c69c2930f5c226a9a29d9a21038a5a30879285f3e43d6290cd5b513303f5ba856035a3002692c15849dcb2e442a3680e91ca5e02d8a232744b580b6b1160055eea016cb31380253b3ef8a" + }, + { + "tcId": 1020, + "dkm": "0f2bf9cb7a3eb4c0d22a5da82901eab08dfcd196da2673be214df26e955fb58800e103ca794a01b4836bd66d65fe071a8c1cb196ffe7fe5df9fe312fc227f457ce2fee7d9a0fc6cea9adf0499fe441996d8610ef3fc76248c34e9ce84d024be1249e24fa9fe73926bc6925dadacea9b8eaff4d07557e7d6eb16c30897c7bbc9c" + }, + { + "tcId": 1021, + "dkm": "d67c226f27a923d702c1efd417432615429ee98918c0d10c78cbcd78c1d6bd9e5f7d6db863ea59c2f8a31e1b8c996362ed200bfcbff9ea68adedb3ff8e61830fee556c74b7c1c5af7533c88278b1d5e09c22e1578754e5a0bb570f6c420ff34cf6347c2242d5588953010b34db3a80bf91c884de6af83144c3d242f0a7f26810" + }, + { + "tcId": 1022, + "dkm": "4d59486461c09e72274dfaf00aa87ca86abd70b109eca9ddd008a6390700cf3003100fc3952977bc3bd005465e225a4e8e36b739157037b6eedc844e2e41e7e57097fdc9c4206ab147f4d799fb190655f2e6f9edd9c4bef0a4692035ee6e6618cd5013e742884a68bd7242a2c443e4056e88bbaa8c928f1c06581b16c9210a11" + }, + { + "tcId": 1023, + "dkm": "20171dc531b47e59faac05d8a72471dad5dba50049b45af9ee5f8fe4a420e17d690bc51076712ce192d7c670f49373ba7b4f3910f9c411040c7ea321accfb9cee3355e29bd0c278952961a7fc85efc44f24bb9d358a8f4052f1635461f2fd7eebe6a8d78e429f9e29828b45c88be0ee8283b04d21391623f44df97e22efe58c1" + }, + { + "tcId": 1024, + "dkm": "6a7e4c5cc83462fa84d327ff403b7a0b94a892cc16a17cc888c02d9fdc5ff6109dcd6eecce97a067f79ae0da656366c100cf35894a986e3e8efae47db74fbb83fb0fb9b0444db4858e87fdfa0b667f0d103266697f613993115e794b82ec4998ab769fbb9a90857672fbd58b380de74293f16d6d4c9a08f74a0d194abe2bf219" + }, + { + "tcId": 1025, + "dkm": "c478723a5f7d73ce7f38da44e1bfcb4e23f081484f80f662785fa002a89784fae12daa592c8cf69521778a6265f8320571c91a7441b9c4e233657d8a459642de811d9efb740db778f63ac01b2645792d9527279ba230e1ecf7251a49e5dc9b41f75ef27f1a6169792ccdd937db936b93a03992e56d42a4f9bc9c0df32987794b" + } + ] + }, + { + "tgId": 42, + "tests": [ + { + "tcId": 1026, + "dkm": "04418fcafea1b7ed4cb6477c2a18284c6d1fcc2a484f27b926e2716172b2a59e547ab9313809df23f7ad417ba6b1d9044970bd29333c20dc8e90b8720948e207b3fba19eb9e2167c470ff75a025e41307ddc681feec86391aab88f718e66c7dd9f2e2c940fbd65531dbbbade4e86da9dde1a6e9d00aeffd6ca8afb0f3190a828" + }, + { + "tcId": 1027, + "dkm": "92de333759b1804d9a41eda001e2e0a4e3304872479ea031fb017b39c8a7caba21bd34ded394a4ef00cf312a9066f5a4d08e00797cc7543f99a6f1d97a882c7ac488c8771160d5c4fa6338681db549e6873d7feae04d4fff1030dc846278f42059c060e4b36c4c8c8aeef4ce45155d055686d9df619f621d4446cc2e5d48e2cf" + }, + { + "tcId": 1028, + "dkm": "e50d9e08d9516f429685714e448d523750e20346aa999f8b6bb992eaf5265f85cbbea0b47851cdae27c87f059eb0b5a8e8634eda5082ca9d7b384ff5519c7c105abdc86952ed5adc9bc97cd4e3ef3284c01b8b0585978f802ad8779a9067b29c1a4a8d30ad4580b98fbc6691f5dee38dd05dd96961ea84ba175ad06104ad1fe9" + }, + { + "tcId": 1029, + "dkm": "e683cb08520b3ef34641f02cb89d3098b4019e7a567cd1aaeb746629b56e8b40dd6e1d03b812b180db7a908652d79ee3a2892c20b232eb03329b1c9827521c91dc2cb20687e72605720b62e6675a70ca51fcf1a6af2ddd11b2172b698105a3b49d3b301c278ecc03dda88bed63b462faffab17350984e047661c97a7999e3813" + }, + { + "tcId": 1030, + "dkm": "de1a609834152d04b5b9469543c7e48f9a4a15a1960a969169cdb2a01c95ca165d70bf4016dd341f5a6b5110b4d1fdcfe6104d50b05a8b0b6d2fab3d5c31d561c01a5121297091108f03ba8f45386be936ec1bb25b442862cc33d9382cc8753c64b2350c68c1344c4f524534e05e48c989f0213a5542f6d0343c1fe305786fd4" + }, + { + "tcId": 1031, + "dkm": "3e46315fc66b712911678883455efb343af7d41c601e0c7558d0cff0ed64691e77ca5d7778d0370c030f107a4d572cbf937771b8f1fa7f904c97f8a6d71bc25826c0be50e9e4c26638c1241c238a38172d1a41f4290372d3676d2cc3f9436864323141983779cec09f278c3015c115f2631a70868e2f0b7d526efbfe07ba7ccb" + }, + { + "tcId": 1032, + "dkm": "d3da83e8905a3c39efad76afdc8246f240cefdddedf87a0a9c966fa34ae79422da8c93f9a96f8c47d70a752c02a4a38fd87fd3e2b3dd0426cd8d04599b6b89a68e6d4df0163e934fcac28c10e6e795fd72533b445a7dd590b6ff7f1ad068d55f4ee2fb566d85c25b5d85427ebe94002ea0675994d4f090bd6fc424908dd3e365" + }, + { + "tcId": 1033, + "dkm": "c867c99e6c9265e6677edf02c24264f0f353619ff17247fd0d19856a41ff331812f7d2c81242c63ccc1f985d24beed70c58e1a4ec899cdb02fdc98d0a286ca05d33a137fd92b33819b55ed88e5f249760656256ca49010d24bfb6db4640b2c2aa0a56dcfb37cf371b75e1d279e43b1a0d805bb062de6e66204e4d3a9f0604982" + }, + { + "tcId": 1034, + "dkm": "3c44a25fae890fba295378714a0024ed1aa541313bd2fc678a89eb4e6cbd8fabf4b797a305d16354e6265ecb70ad6f645fd1db30a8b1abf3f252fdd86612835ccbbe29a9da2d9579670e3cf72bef32c37092e2395abbb9bd093bb4dfbe9e7591068c2851476492037927f362c3268e004fe654c09f7fe23541084e1e4e73f103" + }, + { + "tcId": 1035, + "dkm": "d6c40d1ab3330b73f8ff84573f4563395ef8b3c5161dd9202f8c6a8fa7b2ce369fe046297777a9603c94a7b5aaedf460b3b2a2f1d467afa77043cd098db8130df8999c603dfc43c11176c5d17565f6cc44f010b4a72adb2cd1ec1479a6c0704ad903b98a56a730fb3932cc95a89bc51464bc36564fb79e89cc486f4969374df6" + }, + { + "tcId": 1036, + "dkm": "1a1765ba393f34e62307ef3ed0e2b23f6606be15cbfbfe6196d91dd0d7f8d3a0795ac9da8a30924e58f9e268800ebdc36fa3487caf346b03724ce5d789044a4116220a438b56c3d1a507d46bc7df649fb4c8f73f989edf2deb5cc2a8cedc98490da15f880c2922cb24a40ca13a9afd1f109f2b41daf90b150558ef790d4ba1dd" + }, + { + "tcId": 1037, + "dkm": "ce47908a2b10343b4967c2b162f0a31a656d1c6bfc5fef6d53f7de39eb9e8343960456ca052593fe05dc3d4e3156ebf8b2f3ee5cd45e429708236c0ab2d82d9acb681fea47e358571ca9048a4e30e91466f1ad14e3675f064843e1aa595a8e9074eaa9ce4931da3550da50a8c6887f5aa7602012ac339453b3d1f891d82ea1d9" + }, + { + "tcId": 1038, + "dkm": "c03e228db3712a28cf52d82420be43b84dc2bfc2a12ef1188cee549d07bd4ff3d83950e5282a24e18a38ec86aed6c49422d548309006b9a66d953802652cf32106de61754674d2dc32b02ec144fc90345fbf6e38b9d63208f26745483686db979eea7abde585254c749bb49a272b912c004ccacd23b349012fee78dd35a82b6d" + }, + { + "tcId": 1039, + "dkm": "bebed59c4d559d196189f2151b0a350c7f793fc54a14c627ca222cbedc03ca54523f91db6eab485b50babbf3ef75764f5dc65cddb7509121087e962bd87fbe6dde0a254370776412990572e9c301bc0fdd0444cef8b603875d3ef618de9cc66c4f1ba5623dd73eec38b4c3c37a92095c4876869e6842c4260ac8d9cb7821b9bb" + }, + { + "tcId": 1040, + "dkm": "69e6fdd0b16ef043180fe4a0e4699a7bdfb95e0f83044a8344566f609335fee2a13e05d279f5fce1b19213c5d086bbe87187928131eb572598ed6dbb0058a852210e51f660ca2ef3ad41a069795c47d9210179e8128a6782a0ad713f9a594662fdbeca031cbbc73b2fc79034bc9177084d11afcef16fb5ad599a70c93610de69" + }, + { + "tcId": 1041, + "dkm": "bb7cf354b3aed60a1eb9a1c2a30d55f95462dea79cec5bd517b3b2e0d92958608b54f42cbae6e20c86f1a805f67fa6401e52d0d6a720ec9a043748e362e8ee4cc8c08d0e8df70c044746287a5a41e678e1713e25251d0e3f3a5d1630f9ad0e8d03560822dc0ae3600592601ce739f4b2e6602f7a3e2306d829f33bad3b48b824" + }, + { + "tcId": 1042, + "dkm": "3b85da1cca1aa068af30299dffec17aa6352f3191e8d371afb9d01ea1a152b93caf300526e61d3dd2ff3943f6d81b46dd9cf71e1ebe146a7db91b2bae988dbdb1a2c10937e3c773f4f3c9b023bf67eb00935ef4294c984d627a93f4ad186174d0e5b761d709bdf606518c39685399f26007b00e3e9b5c889e895a125101ccce4" + }, + { + "tcId": 1043, + "dkm": "d649ff2dd9359476672785cd91d8f73725f2ce1f02da7f2464fff4516aff937c158b41a643718b659f67c1a21574a548a1d087f3c391b916c103655c3ad19d97329d1ec0f8a82a2141686133e33277a354fc780f0bee68106fd9cbfb5be633f834d93ffd1507adb37f9e5c9baafce96810ac866385ac08121273aeba14d09783" + }, + { + "tcId": 1044, + "dkm": "de4d906061fb6995a93dd3d10ec2a4a8f9e17dabab99d778dff32e68d1db2ba818f5242865349d810499cb4a2b2f46503777171cc99753380971cdb0c7463cca17665af4177c348a9e31b1d09ca16453792705279d47d26285b1073c60b50b572b1ba2003c3416a7c85520eb5b0541d7279f5a7ca1b5603d6516107d4989cbb8" + }, + { + "tcId": 1045, + "dkm": "35254ebd6f2850e32f2c103946fafe187dc2b9b5e1f229a7e4b712893dbc6fb0dc14da6f832d7678087acab83e1fbcc2b00dc90c203136e4a91fd2e7c84a91f62b312f225512fa455851df3683b9ecb4e8d0d51432609de819436b80b433890c86060858754131c4698ca2a87600d5b3a24eb375b2005100db0eb0ad6578c378" + }, + { + "tcId": 1046, + "dkm": "16df79a44af38b0c77bd38ff1ea17673328b3c5ee8ad0070c1c27959a8775da9d0665d9fa2e5da8ae29d382b008556968927069c4d9debcf4011716bfbbc37e10d539f90405f06297dce635d57669840651382848a72dd87bd1765491a979bc2509362025d29414f1c4cd6e787f6324c80ddff79082c958d5c14ca4727cd0e35" + }, + { + "tcId": 1047, + "dkm": "ef6473ab779b47a7326f6b3caea21ec60787a3019f746c63015f0d3908a613399319d7121e9d4befd4eee5d9ec9dfd6bcdc29d0fa73308ccf2e499c8b2631aed282078594d475ea2f69dda4554930ea5cd46de04b4451bfc07759b53dda550a309b83dd47d3a8cebaa329b421c1c68404191e655cb2d142fe825727ff4e814ce" + }, + { + "tcId": 1048, + "dkm": "829c6f84a207f29b4c11a221913ac92a1fd8e349526c56ed1522e8d236370211e03fbfcce6ea92bb49be5462ca9d28b26e2b9656c2ff193335e4b3cbef626dd09f0206c981f1983e930b3f5b335ee00784b025148ab2bce0435c9f2e006498e55e425ccb4901b44134d47c031c63e7516c40b6c5e3d2586c564848cb36876977" + }, + { + "tcId": 1049, + "dkm": "3495a6d760a9c1dc16ad7562427de1f9db767ff9753bbe3a7a2505a183e81b795238d409b1d1b7918855a29e9e8bfe703ecf54939d6440fe3e8a53dbf084942764e2b034139163bd11ebe7c2ba8437582971897db7a0080168842257675ba50689c456a3a59280c390c9a8999e11e1fe1b7e616fca80d90b3effeeaa713f0a90" + }, + { + "tcId": 1050, + "dkm": "c88fb63db45eb1f2248161059fc09303ce0a14b04f9181853a210cbc88c6b475f9d5e9dfb2c6d886e264e4185dbec6e4882e0df462f09839eaa0fd0efe60ffd6a2e74e69549c30e9c6e48f1f1cc2c7a986f7972493b5b5b3ceb440ffcb346e2bfd87884609e51f591f3644aeb4faa926220d8e43deef31e9f5d90c6f12216631" + } + ] + }, + { + "tgId": 43, + "tests": [ + { + "tcId": 1051, + "dkm": "e7616c5876d083aa4f3212718bcc2cb08e31c56f78c048c44461b26d0e80000fb22f7b60e489c45b3eac56a2ec3db29794f4448c962b889005aac16b43bcc1f69c2a147a3716cc317756bdbd23e6976c97cdf6b00e146ac3636a34a484bff27f58c2c9ba62bc3ccec8b6e1b307175678561c0507c66c1b9d59d1c2b3a45fc649" + }, + { + "tcId": 1052, + "dkm": "baa7abd58cfcd495dabd4ecfd0eff362b57333aed65a3e0ffe18985f21317054b9d6ede9c9dbbb7bf29ad6c4a634fba3e6fef6381443942427fcbfcc2e3892b5380049e584c1608dda8889bf05beefac76c60b2fd987280fac80a7acd77ff225d920f4505345b724f9658dd247849378ba90feefe6ae8666eaed47c41a70716a" + }, + { + "tcId": 1053, + "dkm": "c921f4c21386db53bc72e3fbb079d3d52f6f257cc26ada837fdeada2da1fc1267b6c64b121069873d70ae77647ad66a6d5d370ce4bb1a5a6f3a5f9846d83b6432416a2000194ffa6442f2acdc6772486a17503e792c8b856f8b8d6bf2905aa884b6e82d011ca9617f1aef00aa9f4b29d77dd4a3605b7b4cfe1d6a1b2f3f5e8e9" + }, + { + "tcId": 1054, + "dkm": "02a477fb5563ae228fc82802b7ff1d40749a1f7a424d474b0f048b692d250773176e4f95da4ec14d0dd2f50197795b478ce988d25d83f4094c9a878eba14d1d4f27afd9428ddb534019dca7cb66ec99a6790c57b7c670c4f23074d52ae97ec1942554644b8112e7875dbb72adaa0d0154a5b6cc0dd9fd95528e96a7ecad3fb0a" + }, + { + "tcId": 1055, + "dkm": "de2701d55b2181fbcb21163913a442020929ee659f1904b75c55a6a15dd55ba197d402fbece41e0b15f3414e33d4892a9f99d602997a03487c1bc38284ce775035c9806422805b7cf6d4b07e05338bceea91a5e0045285ef3deb7cc63a5b6b294b62f7a9fb59f155df20f29ca68165eea5222dde6b87c5956c2593c79da740a5" + }, + { + "tcId": 1056, + "dkm": "a85a35ddeb159130f3ab3c34a35767184516fc8c98e27e79594632146a731898c69aa3a5bdcb59544b5366123f334591382cf9a82820e146dce2e27710e856be85141d0fb08575fa86ee5de0e5b8d8e52fa14f75a73917204e8bd0abb403ad56bb3d4bf5ae3f504b5119420c31c39f630e045aa6774e45906016829740bf7017" + }, + { + "tcId": 1057, + "dkm": "6cbc63b4375186726c920eee0286cf518336dbdb034404db4c1a1482fc22e90603ec3dcf95dcc56902f534f01bb6155ba6b0dce73e8d5e72539349e940c8d06bf494fd5f188edf3e6c319f812e47de468c579ed2823f8b4603ac82898621653997ba3b4f7e1614face6f8524f55ef4d47c1ce13834d7ec79348c1939c4bf6c42" + }, + { + "tcId": 1058, + "dkm": "283ffbe5b208ba80218b4af87b3709c410843922ce1ba1fefc3057349d2c2667f73e82bbc54178628b8f69b94a0f02967232e509cf0b479065aad97cb0ee9847a1af068f6c3bcd0e8829ebfe7228c2c368f4947d7b0d7800c5a18f1361654c5f3cc31ad0903282b2a67b32512d65b5afc5e1f812d13056cda3f92e6d4c0dc538" + }, + { + "tcId": 1059, + "dkm": "062410dd2a6f966051d1c807d41b82cc2cfc23453f7f58cd4eff4d55f4a8d636147ae2764f1dd7b70fbdc3615b84e1f11f54be2ad78c626464b2fc649c9d3988b3deefa52b9fed5389fe785f8f8579a3f7c50ded71716fd9e7d8a3ed0ec599e18706cfd20cb47d76a15ffe9e16c26f3257f0cacb6851d7ff76c66fec22d38e7e" + }, + { + "tcId": 1060, + "dkm": "a34f3decaae228f7ee453efb00f17019d9b2398b216850e77ca2e6e498ab12f79b68eba1bda6c5c561ca532154d3f5f9beebc52df9998f2bf13ec45bda57814ed734099dabd952961d8beefaee8ad8e37e019371ead3489d7c61eb1904a1c33ba5c34fa837a48e309fe0583ad97cf2847c978729bc98d30147190db9eee845cd" + }, + { + "tcId": 1061, + "dkm": "29ea4427cf5c8c79e7814fccee04ca03b1139cca7664149a97392fedc9a009c3977d41a63edfb1c2467330a6056dd8eb9059e43118a1ad8a4082a5084e9f7938afae1d5da7dc4513f2add109f5c9f8ab8199736abf96616072fe75c66e936b367526c8e4b7d73681019f114859057d34b4a1993737f37b0318e747eaab9d9c56" + }, + { + "tcId": 1062, + "dkm": "d009030360af4619e7f31d03d000ee9c6c46d142ed40e89c66d4e5c6b844fad232fdb22cd12b46ce5cb137048a509365a1a778d172f2cab1d0f48a9ed5929b261485199c51ce3afdd568a58780b46a89817d45cc6f6a5d773c068850b7647e798ce9a5c8bf5af7fe86e4a283057e78c90328a5dbf83410d7d86402d0049b0042" + }, + { + "tcId": 1063, + "dkm": "233d36eb9e55ae14deb4dc05ab992a29c547e844ae6a2d6e18e68c5115b853cf4c802b8daa3d111a6d45c37942bd40351747963446160b528691789594229d54a6bcc6cff6853725d52c645c23bc77789fa23e1328060737efb2aa9bdeed7f440700a0bde84a5de2157916637a4c8bc95cd060982fca15d37170bde35ee45c67" + }, + { + "tcId": 1064, + "dkm": "7f1e8887a54efa50660d29ac3c2f3aa9288c2a71a67c9e7d4cc14c7c7105e44a94abaf42f667d5d4ef2bb4a2b88608738ce9055a81b151f71fe747a82e785e461deb729689e6b76021b8c7da053a44d8219fbd80cd1cab90f60ab9219383b337c5d717e08acda564e580f3d3782f2bf7266abaa56d4a22f1170a383165f5432a" + }, + { + "tcId": 1065, + "dkm": "15c0e56f236c2fb511b74caabc156b4c5171c59b0ffec23141fddc6420e4a88273e1aa5c4085561658f4d995244bef7e08688cc05393e1ca7408e3685adafe46a842d9c37b2107c4c19088ba2ac15086023f9af338a106c8f71d31ae69f7fde0e17047e9148d141ee2cb5657f3d7b6f78b97effd568745e4e103ea7b4092eab0" + }, + { + "tcId": 1066, + "dkm": "865b0bea5fb9814f53378ee950f4237e7c3c7ecd099a9a331889bb71efe01a723fa2e66e0c47e2476f649eced9dac4f267c1a0625e7124fe6babd59ab7f98b520cebfdbaa00172b1f778fffe2537265f098487e7daea8df262d3f4775ece2b83ec343ee8f8c1af27c8150652c2a63d7f9f0482d1b9b3eeb54878afb6bebf2609" + }, + { + "tcId": 1067, + "dkm": "0c6ae0e3a5693eb8400f6e556cba69ce298d5f2079e0dcdf8540fdd926b314cf97fea4ec12ec01e9a1c90e7688483299a73a652d99bf49c1dab9ed0592925146073a72dc26c5650236f5d38e34b0bd9a016d047d305c4dc1dd2674451801e22b9eb2c1288e9e995ddb40c7ed29143ee7b3ae2fdf74b2a781897b6f921a7e36aa" + }, + { + "tcId": 1068, + "dkm": "37e9e0228bf33a911e844e6efe01af792165226a170f33407b753efc35bd1b30424f365dd052ba470516ac82d5b0376ae312ba64c8a540a8c28c175440c6495c0e57a4ef4b136ecdb41a10e9b46254ecb8d25209482bd561c4384012ba10f0397847dd26c6877fc5c20d556ca869052793840217eb038ccc6969f9ccd9eb85a2" + }, + { + "tcId": 1069, + "dkm": "8a4fb8678a3d598150315d601eefad4d9136c04b0cf230e0fc97ac363e51af25285305a321f45dad1ff83f653247a2d2e086d9270fb3a258e5f971d236103e6cf259c2654cd663627019dce3918d9ba5d5e9472f3a586e260e86932eea3f958dedf24c536c175f39cbbc0c4955ff706277cf934cd769417b6a4262f92e629a3e" + }, + { + "tcId": 1070, + "dkm": "a423766d27da074e8a1cc459a07aba1c8ce3ce4472525a9af4859f9b61e42b99173898f4d4cd382782e5e1ac1c3b8556944bebd69168517e62d39814d5522fbe41b04a43e7fa16f674b70ffe074078c3d087ba217c904053949d78d7e24d8111c1c72c2fae8b963607d99ff49f9d25f18031c3e8621956c053b52b48899f43fb" + }, + { + "tcId": 1071, + "dkm": "51cb526e16f3344f5c931baa0553326e8063e889a32c18d0feead783ecc129a6c26a04e4c6c8e525f23682951062616c3988c551456a1acf20ab92f0994c47387e2efd909967df1719b44be207285148c16b3e3a78e9e98095a550a50b97c67f4743e16a2a57eb34d785831715609fe93a8a782d9e5e9987cce0baec19ed4084" + }, + { + "tcId": 1072, + "dkm": "bc7e1933d1de9c9449c1c8d9721734f01d6175daa2f2857e3b7181b1a6ef3005d9f6f3361608c1d80bb00d5bc5800e01503b3783ac76d89e63fef032df22ebb4cb14863da1e7ff594e31488f4c264722862b328f978b53a8056b3b1d197b2b3eaba2c64aa06051a39e12723d08c11615a8a9baf4d045614cbc3f7d33ef1915ea" + }, + { + "tcId": 1073, + "dkm": "7720ae31cb87d16b6d5e2ec5585decaaad82e6bd32e2baa765b574822c54f4e543ceaa0c2fed945c4f138d2bfd08e45c55cbc0daa4b7ad01cc2f915ebf44374b7af22fa1c277edc292724d9657bfe705b0f08083846d838d4bf9a02403573550455cf7aef0f2aeaf77481427b4da181a48a522c39a1b028da707ae840ab39a5e" + }, + { + "tcId": 1074, + "dkm": "3d658b678f121905f8adedbd65da4c0a3238e8090a8a06356b18f16a11fec08cf58422188b492486c8cad651249e07135a4f789e1ab2bb510778e2529431885710c758d20b22fe8f826458c2485b0adcb2f31e08354a17f37b8b6e5e86f6be19d26cdfee55927b852afefd942895f498236b82dc751e84db69b3d467f300c1ec" + }, + { + "tcId": 1075, + "dkm": "07708a4be85fed5151cb2e383e688a2d4c3700c151a713d1cdd2fa52f64614b117cf1a01bd8673fce4070b11a442f4308594682a61cd6363a1e0debac36fd6226ba38dfdeb4ebe9a852248e6379bf99240563a716a277abc2f3baab939260c5698264e817a0d0396b9ab550c8d5e66ab212b26f4cfb87eeea130440c17bc8b05" + } + ] + }, + { + "tgId": 44, + "tests": [ + { + "tcId": 1076, + "dkm": "1fa6b3725cb04dc9b7b7b95e6d11eb58ec24b1a335f858ca30ad4a58386c93660c101caaa69233168acc2a71895e87c3f296c833203db546ca36e2c63c8be7a44a812fdc4982752e8d7367aaf6f0e63f046ae1d5c712f944e35e6c1da67e700396059fce19886dd03f0b6480f130899f1645dac71e999b906ce442971a60ca5d" + }, + { + "tcId": 1077, + "dkm": "8f4a0855e00194fb9e1745f5a21e5ee21824a997fc5a80f7654e82919444653caf6a0517e654e610f64872fb59b499834022a14b578fa7f890544ad0b1acdcf1f3bb41960f98e703e7e89789f3c8bb38b7f045bdfc34a405cd12b214400fd0d62f392ac24290819ce1696e9a122f83293347c206f2575623ea224e5576884405" + }, + { + "tcId": 1078, + "dkm": "3ced88369384f2df3d01855fa9ee6c9e86042aad59bb136eacc93016c7df5993f7d095ac39e83abd3845494101f4285a61eef9c68d7f68319f2efa706355a0b79fd7a790485d4f1181d71826055ab8d38b0bd34b8a06754285e8560b99b4779fa6131c777b1a3f1dcf9f187ba5828bf0ed4dda271d43a3c55fc3c989674cf841" + }, + { + "tcId": 1079, + "dkm": "00da8bcc4243c665e513d12eaf356a7cf076f5f13e11c00bc2faa8abfd9e704e5c20ae4ce08695a6d0a273e54649ba71fd84acb33ba9d34bef625442fcf212a20b1256048705464d17525df3987404dbd4762d052ac11a996f3fa889a83d87008b003b3063c8297b37662a9c2ac261a4dd8876f783756035d464522f583c61e1" + }, + { + "tcId": 1080, + "dkm": "a158adf518b99dded929d36644d32838554182b761cd8c36d892050a240406ad2cf5065b1b2030bd6da9fe0b05568b0bb303d7b4227fb2b6c8238adf7d3bca36885fde976574d38ef3fbf2b72b7e33fedb17463586b93e95eb2f2f82ac33778f35a9c86733c351933468e8f623c3164b44986b43393d44b57104fed43e5b9622" + }, + { + "tcId": 1081, + "dkm": "276bad7050230d2baad9d918a1e99641ef2286e9e91cd6afd80a9291e1e70dbbe8e3e159f71973d2644d1dc4a2a0618beb62d2c208ba841c638083ff3fabde761eede077b4d760ee2b99e451fa1aced60acf50c8305b2be1df2d38c5eaf598abcb927f7cde3a15719b1160d88386791a257027e136c72f614d9feb4161fe1506" + }, + { + "tcId": 1082, + "dkm": "f3ce070e7a4f6ff212a8a29d1ed323721cf93c1891f29f81aeaf4d1f4b0f9eee56a5c35d6335645dcf1d08dbafc0d17022a6ddb5b949ea85a512996eeb8df07f5488e96a4a33a08cd5ce755b6a17d8732c95a1f3e9f0a7fed91691b09dcecbdf853f9b301aa05453d3f53327272324628acd24c1f5e00b473fd5ea782ceb0c64" + }, + { + "tcId": 1083, + "dkm": "72a7840c7c57b9b84d4c8f649924afb4f65b54d25d0ab4f5b4df614d3da12526ea96082dd2056e727239473811c9fb9f8d3a4597c5680c99da50b46417a181856bfc6819ba0ed4fde2c59db343742cacee08b78b75f8fbcda8c03a058d21e3cc7178823030e3f33b549c2e07571c3fc7761a286706b6cae9e446886390ffc817" + }, + { + "tcId": 1084, + "dkm": "797198f5fc3571101a964a2f777cb3db3e4e7305b09aa0fc5ad7929a296c76ec7bdd30cc1055ed1daa6c9eb7a649a2e906693724346e3c70f8f9818492664c0f767e9284e923b07ab617f796e10519bcc42f310ef821dd113d8260f067cb3ae65438a735d25f499f9385576b991caa5f313f72115d2661dd6e7387c5b48a1c53" + }, + { + "tcId": 1085, + "dkm": "852f7b5a2b9baed86952466df0c5958ad23270bf3a5f9f6ed62bf8edf81b45d55f3c45627bc7e2e641747093b09f91cd9e17799093fc3f950d081f62e64f201bf4c78d0cfa25e38029f6d57b72387e15cda746ca374b551335bea84e0ec7567cc17a423e63a3eaa9ea58132c016194181756e66730bf30438ccb96768734943f" + }, + { + "tcId": 1086, + "dkm": "73c18a82ff38d20f60f0c54cd0a11efd7c2f050a8218e3a340b9d79717dc93bcd9cf0085d58a874acb6e5c14b82dcc43e3ba67a509945c5b9e87ec3a76f7ff257b97e8ec478f5a3db1a59e696df4fd3993ddf27639a5bb1010addee17b369ea0b68af031a307f8f5f6d84e77983afb68bd2f4f3431259d9c30d88c8cd88fdd6b" + }, + { + "tcId": 1087, + "dkm": "17b3e24a46d340175113089ce094def81750c31be7db44dedfa6f703061703e281a4e4b96462917ba983c561d61ee479baa97ebe35efc8da59af05da2d827ce3c050f0cd0b5b44775aa5faea9a33a498a5f192279c254229476d089b31cd6f9618e08891b78ecccfe74714c857d8cbd2f56ae951882e962e63faa370e0af307c" + }, + { + "tcId": 1088, + "dkm": "86074e606ca003a6a27aff62090bd6d9c14294363d8a31299e839d656a6f8ba11428bd2413d718a53b9cb2299a013d2431e5d36773bf5db69301d52a3f80532b3cfe85af6c97a2f7cb9d3fa644c0c052aecbf33b0c1db89b94f33325a218d3bcf67a3a08769de9d8d86c116b95f6f63938c60e26603ec9c8dab4a2b22e3e22cc" + }, + { + "tcId": 1089, + "dkm": "91eecd85524cdcea48ee47880b3b4371a3d634245dd1772c546d839db746e69cd950dce607aaba415d98492e89f54c3f6469bbf19dcecc8570df0ce26c7edeaaf7803a03ec22c9b50546ddba8ce6c30e3f31180bb9bc76549ddcc00799767e3c2c2a5c86750f616714f9f4a7d898511e07ce304e9008f99deaf8f0ea64f1bdff" + }, + { + "tcId": 1090, + "dkm": "f0ec10b09b65e7579d1e023cc0578c4ad0eba0f4754f75feb6a72a5b8adbc7ed12d72de46a1c9cd844d70bbe7cacbc3aee30005a9a40791df2c032fb352ab205a6cb637dac58089a5325f50b46dcb15502dcfd187bb5c416447a8c1713f859e5ceda7469b4cc5ab916e18afbf21a6b54e6c17a19c327f6b23f92b3bef7e46f0e" + }, + { + "tcId": 1091, + "dkm": "793e75a7e77ae9db6b3522b2a7d7259c87903fdb395cf6f9f55f8f9cd3e5f7667660d6e021beec667110420f3c2769f3bd7f64b5e4bf80ec11b4def3adf226f5d3b3b6671074c7025fa0f09faba109c6117be600a2c5e625b39369939dd8d87d528405081711c35f49c3f69a55e134e8c6f6948e2504c5c7071f05565487f42c" + }, + { + "tcId": 1092, + "dkm": "591a54e1b21b63bc5ed97b2433b4e94613e8e8a7183ab2b7e29bb3e344e02fad69f9ce159e1ab4ff9bceb65ec2dc5cb76f034b8a9957dfca66ddbfcb4d53cf6670331b65c27086f1482a47dc99936521d9276c91d2ccddb8099c5f8afb664fd51ba9e0f9d9ff30b986041766625da1aa3d44fe6a08a09e89d032129b84df170a" + }, + { + "tcId": 1093, + "dkm": "1cee434ee0a3c730cd878a6437d2d0f47aa65435a7563a743adc750e99a1b992045da6275d508badd975241054414ae48921cfb80af1f2c004fa8ab281b396ad95adc237bddcf47bf3bbf2854a47120d334c9bde5ed2cfa670eb061eacfdf58072f90af497094ac215183d1507a1f5de4c70ec45748e97f062afc433848a339a" + }, + { + "tcId": 1094, + "dkm": "2c227834a3b3d6c3099d51067dfdd9d95773adb9eef369e0f7be8ccc3c0b1f6d631d599708207a0e327f86b79700874c50b19ee6b12af8266345f151cd33825a25e3fc0330ab8858a3c60299adfb9caf5e9d6683597037dfb80b1c5e38877c84fb8f89b7268f1a1735aa9fba70516c5c5e904460625539d1300e7d4a11f90cb8" + }, + { + "tcId": 1095, + "dkm": "ecbe6dc60d6fe939088871e464dc11d195fe3e3e3c320061b9b904c2d4b252eb747743f111efc5c846773e98d3182cfc19091f03c75179a68cfc0cc3152027bf30ba4d4dc20ed7b6fc236fac40f7077c5f15d206086f1588e75191aee375b8903fe0e31919c592340140dfa130c92ca6d43094a1e6c41051e79d201319dfccec" + }, + { + "tcId": 1096, + "dkm": "8ba6a1fb34ace298d28911f7cf9843ad5b276905002f5f04d79e349405ebff2fb7cdaf9368191ae92e3b91c59f4673043691d70fd5a75ab16ddf4d0a5e37e8f8cdc2cb4bed1fcf63e071c7d66a7428815d0401df8fddebcf14ee6c9e945218568c3a0e02f6d1ff183ad8965abb7420365f45f4f3e55cc5af9f2b2fbff7886df9" + }, + { + "tcId": 1097, + "dkm": "ae7d85ebbd1676977b11c6acee0ce21e5b9cb92edc68b1b4610341fa1792a5ab3cc9ab01100e90e80abe23c7e347bea190b86d402a8431c8051a358cc8546d9bd04c5908422a5a8b8dcce2ee3db2f5b73563b6848e3714374716822ce9f24553078d97eff6643384d567efb2077eff8330b8da49b82dea7b38f17d9877239556" + }, + { + "tcId": 1098, + "dkm": "4a97a4b040c1242ac20ed4ba7c828cad6fc8f158a32614e4b789ac499ca06e04ab845b91222cb7b70b2acc01cad7fc1dbeecd144e5317bca27a7e3efbc89a8bc83991a6ca8a0176de25af60755d66055db695580ab55bb0b791121c4edc76c2a78f8ff9ad0936235e0d2e24b0dba398730a0c4371a80fa094bb700031e5f613c" + }, + { + "tcId": 1099, + "dkm": "cce539b8063bdf5c9c7279d3914600bb40515cecd6079f9fee95f74fc57632957fbc2bf646ecc667f07830ee4ae3a2604f3c37dc4e64f6f94fce6b4f3275c18d2d52b7406cbb9f41e264afb5d90b6bac4f3d8e050852940905153c5b0e46e7b2a1fef7d5e6ebd607d6ca064bcc61437f0b9ad9fd14ec391ab0726900feac141a" + }, + { + "tcId": 1100, + "dkm": "967f7a99447c74ff59cb367440b8a3a7ddc44b84bc067ec15d496c6da4b0b4dde924d5f4b1ddb68df825fbe991ebf02b883bcf33030c2dbed88d03fe8cada94bca5e3b4c6bdeb1da8973b8607f4aa739fc70a9b991745b93d96d00277c21218fbcf99c4a1f3ef1da2903500ea3c79fb3d8b1f8295c05175b6e82d6f34f0fce74" + } + ] + }, + { + "tgId": 45, + "tests": [ + { + "tcId": 1101, + "dkm": "0fc7d96bee2d122c5e085f26fb52b348c9a1be9bdd9e79893e10bd970ac16337cd1022020e8d368e893fa576092bb8900f0fa0933f0627c017391fb7f26b1268458591a30178bc9fe4dd6df55b7c8af5ed4a7a7a7d8a70f1190987bdb477583bdd9cdcf4d70994669fd6f46d2d6389a5daec9f2f8d9e73097d2a7293bcd03cb5" + }, + { + "tcId": 1102, + "dkm": "044e77f469ced3463dd8048e1c815c8050b11f07f2ff57fbbf30bdf930dc08a5dd4950674ffdb49ae9d1ca7e3bd8e48e8e48b665d8a412e39cc0e290ad1a7ac997104a16a08c8f81ec161daae305d00b8a50a5c82ce3aab6d4b20a8c0c5c9a8e0cad5749bcea4d841fb3e9e0b3e41eba9c1592641b9d9427e37ebd88e5d794e9" + }, + { + "tcId": 1103, + "dkm": "19ef7bf702092fff7dd3684bb67ea03abfe4e99050c19bcf7d3e9a90744f70bb8bb30e8cc5713ca5a51fe2cf2b4d5263ffb14856f6ff3e4c3d7ef547865549137925ff9ffd563a9297f662d65cf2cea80db1e0e387deeab7691a1f09be9f15d06241fe9d619ef8188736a41c46d6ac28c248727c9e92d97ba6dd4522169add63" + }, + { + "tcId": 1104, + "dkm": "658a9fdbbd34d766b92777c70f319d5dfe56f3649840aa36bc01ed698e16a274e9fc6a1e2bdff6548ba7aa7bca2d20da4cb4f021479d16450ed2b02f8c46fbb804279b323877a00161ce8db18e51c1406214437a2a4655871a2ef4e23b1726b973c9fb37ce0125e581de1c5a22c3bef95b7adb816bb9f82d6792056b42d2f742" + }, + { + "tcId": 1105, + "dkm": "03db2f5f8adb8934e00675459985a72e679ae329ed2ef3dd76c470e5c311b3ff246bb96b5c827a5bf38438e43d45a926a61078d6614bc3266ed08961a4d1a35232bf701dcc2ef9ca53c3c2effc4d15f140f4ff25981d5df26b5ecd92ab5454666a07958760d14fde85d9bf2f095bc1593a53cc37cda30ff525a0485ad1d648b9" + }, + { + "tcId": 1106, + "dkm": "80d93d7e000624b04e8d54836c498bc8d64e29d062e5791ee4705ed1a5509733bd11fb475deb6b2a6dcc2cfda5780c7dc59bae86ede5aaa7b12bfe3ee061c468e7109e67e433a30decd772d0d364ddee5067726ca537a3d7e94d4cec0517ebf78a23bd6736aaa42f3c3ddc3d00880fdc843759e43a47401140202bc48d41ea48" + }, + { + "tcId": 1107, + "dkm": "18456926e5e1c5e121ca48aac8f0de392b01dd4797a98763dad73f7d29a487dc0f714c7e7eb92f17861cc1d253e950034711a52548337e3dbcfdecb3db6b2ea7b96908180cbef540431723552c2dc9cbb9a4122ddb7a37f7113d8628adabb7c423acad8bcb92fe5d81b97982ef50352e138f75e35b74eeefce2b3fc473cbf42e" + }, + { + "tcId": 1108, + "dkm": "98a58b1becfe53de06be1f3fc2bc41bc7e320f372ee8cd43b18c6890cbe9d370029966f62b1445a79b9550339403bf3f7d7c5a1229ed8c6ceed989ef3d05b31109f3d2bd71313ec58bd825ee4d6e0e83bde3f5f4a01884c81e7e04880ac581bcaa5f41b990d68a973eb835316901afc68e61cdf975d65ea23d7cf0825f99158e" + }, + { + "tcId": 1109, + "dkm": "0a9ce99d006e52cf3980c67164274f757eb49f51f79ad9f439f7fb041cd840a4eb898e563047556145d27c1c48cdc7f7094026e9859674c1bb3dcb99919289984407b58d6a623f2c981e8f8944f1dd8ec8e62e63b2e8bbe559b51477e5309bcd1941bc0dcdf12758e926d2877fd871c299fde2cac2bebe3705440aa41c136b2b" + }, + { + "tcId": 1110, + "dkm": "ccd1e31937ab88fdaf03c2544bb53298913b8b1a8460e999f796c2115b9f9208a8e28e264dab322fe5e1e7de4bbb41152b29e13fb9cd1e78541053ef5731c11dc5f4e9c8809c6eda4983b8f2fb7e0fa91b4598e2ffca6e4f47fe1f139537bdf6e81e72da1affbaf7bb52de8a7412f07f3f651dd48003dc098a1e9d8a98906b43" + }, + { + "tcId": 1111, + "dkm": "5c4836c47e6ed2b6a5c730652dee23b6d072f2bf5377be44de3a9941b0c29588fd8286501fd08cdc21e8b2855726040f2ed0e44bddbadb258cb33e8029083be5c5ec998fa03a417cbdd89989013dc69e7712481117b3652be3d9ef27d80cc0e1b955c73654b9de27c80134331540b507f31d255c0013b73b216af609f8f6dcf6" + }, + { + "tcId": 1112, + "dkm": "2baed1a5155ec94f58012fe9b540a0cb2a142daa2f8114aa2b42507c7ee3c3f82b320a333aad79b7c9b14d1d6704412f0839f13dd1db8a772708208a111ed776372ab93df1180906613291439e6100ee61d8b1bf43ab79ee6f8ec3851f15d0f0a22dc5970de3bc87e64d742c1958ab4f06c69874d03697a72bff79f02db5d59d" + }, + { + "tcId": 1113, + "dkm": "74d2c48a9960e0873d512fa28a8da65ede650463568bdd4d67e1c7cded18e2cb1a4126df06dd0c50d9aae0d47437f477eb62521ed3615e1c1fad54dab52c294b5feb2f3bb9577d9b28489e39c85adc5d53cf16168d4f450019d1bb18babf15e40014d9ce6d9a69bd1c127c273c299241f200c164d9ef315eeaf22b502d14a835" + }, + { + "tcId": 1114, + "dkm": "1d82626271b3dbe3d385e25a48446d4135c7afbea799ea54c60bae50093ee095d737d6b80110da92bea179c43e995b3d07b67ae47f225d4127cf699823347f7f9ed45710b09ca623dc2096c438d6a69b3e80b20496c7852f811351e8b99990585b1f3ec00d93d0f2ce2d049fbe548c98ec258ad7c411705daa557f61a6729ae7" + }, + { + "tcId": 1115, + "dkm": "5c29856c4f33186a4da9eb73d94a7dd1efe6d9d8c2eb5ce985217fe726aee677efa9627b2e29962a1321b69aa8865d2daee5028e6aeaa9182bce893c2945db4502de7156866e59d8a436ed1aadf88643380120caa9881828b8e4920128b112ce44015e5f3f441f4eaa2a1289771de39dff3b39bc56b40e55cfda01773b3db94f" + }, + { + "tcId": 1116, + "dkm": "457216eea1fa0b2c09121a481e4f4e013aa502b15c22819997d0729346f6257115b2395aafb06e75bb7926bcdd8b453bda1fcce348014788c471ad1772511d8c0566f5973c7deca7359f485b5e8a49428561cffa5109e6ffe8b82a36502c3ad421ff99e2f9f35a507b05b7ef4505f8513ebd03c764321a732d6b116fdf8f2e7d" + }, + { + "tcId": 1117, + "dkm": "ccad9c5c5448b9d82e734b23fb56c545b63b99bd02ef038f895c76720a30dc0d2d5b7f42e8ef212728cf2f06a980fb00a48fc6a7b15d96ab8881903ea007ce234284a1c54789c30532061b3283b659672c885468a6a9e887642a5fa0fc2b3d37053266c86ad8647535bf46cdbb54049d619520099ee98d6c02da9d0b894b8fa4" + }, + { + "tcId": 1118, + "dkm": "2432c8cdee42cf8f4a00f482153e49734b4312fce5ed2006738f64983941afef729e76bfbd596757caacff5880da15a6d9f483d30bd844916ea0fdc8d6433ea1e5d72ef5371428f1dc356e7428bcb816d3b684d3f65d4e6b4a40b5c1980acb0e4f3b38e49d5b46820191549d058cb81b8be8516f67eb1fa2d7fefef311390d27" + }, + { + "tcId": 1119, + "dkm": "ba3a62ea8ebe5bf2543e4673bbfe464f11235049d88834640c227ea2a3e2e89c281d6d19c9d03f98879dc58b8d7b1bd116203ee940f27e6bb83c7f72ff30051077e3e99346061f1a01c7890357ff9326ccba0a25beff964784ee3cee30408d8f43e53e71f9a193f1e6194c77efac394685e63e40be8316a9ce3dc705c073564f" + }, + { + "tcId": 1120, + "dkm": "65609e0d1f7231ec78c65bb8e4c2e8af115c0523185987354d7575952b04786ce1c4f7078be6d057ee696d6f9e8621eaaaab810adcf0039f69c6426c03b1a47a0ed607b69445ac051a7fab4ca2998bd9d986453ae3d8da5d55189ce86e46535f611475d9af38512445877e8d2d41c9a65d3b7831d50e28a41cfd020b43820961" + }, + { + "tcId": 1121, + "dkm": "c4da99ccb5df2e6f599f81725147748cf41ee05e7997350ec49f1574776c287dbfcd7e0846939eb94776df8e21b1308a7556448791b9bfe615fe3e62813a3e6d55d5a68265babf2dd08e2cc613947a2a16ce2884af2d3985b9dc0ffe73cd71f17d00717cae2bd78698ab99a44d7f6055b8e46a6143360b278cb01a4b123b523c" + }, + { + "tcId": 1122, + "dkm": "4d4f5a81ca6106e226ccb88404b05ce12578ae6b98f52066be6836bcce6d97d3fad7c26dc85f47fdf35d485f0cd4ec630e54db93e1f38b18dd3a2fb8857540afded14d018b3ba83395d1953444ffe6e91b99930d332fb0b8ac25cb1e09202868a21daa6d710b64169a887cd8a48680358d0a050d700765216b16b37cb668a379" + }, + { + "tcId": 1123, + "dkm": "71ab82d62cf24b9ce4b61374d0e31b58f4a0c38bdae6502873df9eca37837e6ad0c8a1dbe113eb63c3bf6ecf0fa5e4d187cadef682220a0c18f225214c63ee8f139fa00fd0354242f277f40dbd4de3b88cfcc7643b8e4f1fc73942a91cadeb6659c9724fa7684533ffa7c817e4f9ea00d6bd8fe0d4e0c0cec904ee213e506159" + }, + { + "tcId": 1124, + "dkm": "4fee68c37648ef83a34c618a958ef6fcc764d0747184db7b8e8dced10cf9cbb9f555a984d356a2f0c0e24c2cddb44092276e4122848605879e69ab3a967f89316e95ccc02ba72dfdf867c72af36c90c7a8c4f5cb4b7c312ccd7870f87ec07c69d6a026d8677ce89e9fd6e7c386d73579bd025b5305ba07176e1e195dc05b364c" + }, + { + "tcId": 1125, + "dkm": "1e784caf8a04d725ec6c7398e472998e44124cb505f609ccb7129d83a526ec3175f1c29bc15b92929a9e7ca97478106dfe78a81de8d02b70b00d02b7cf0301a5ad09e2d2afd95e808a27b717982ff536bf1ba5648b6ad5b0f32159e1ce6080d304a4434db546d02402159d597b986336d4019d011b6cb0984875caad1e5350d0" + } + ] + }, + { + "tgId": 46, + "tests": [ + { + "tcId": 1126, + "dkm": "67dab051a53cf925a2917adbe9a69fc33c3ada07d9f3ded31b43cea7cf46edef8e55632c0c480af70f955e914437036cf777fa3d0af1b6a2291f17eacdb7c267e2fc09f58fc8cd7fb0f6bd102326363c71b9acb9afabad5d8b1c6510998927355c0d6e7fdd464deb3679b5b62cbda8857cbe467eafe15158aad4bc871cb850ef" + }, + { + "tcId": 1127, + "dkm": "2411bef6f4f54824be7a46ef75669dcb01a2c65366c1e2b3dca4b84e69bf1f1855c50c7abf3eba34a4b2ed1058af19b69059ce9833098b78024ed5ade93678e173ee6fbb288d96997eb98f46e8507717378cb48b28797cf2d85cc5ac63187b4b22c431fb6fcf9a0c38b688f1e2b3159c6db792a2254e30406389cbed7106ad1e" + }, + { + "tcId": 1128, + "dkm": "b855df9c885497e04c86a4f2554a50d97470560b16798e015e2198e9e18bde276f5ea0cef08beda150502226c75f5bec30dee8a3784374d1af5edfa9b88d715b37b92e5d72a62ca7cc72a2aaa4d0155ad585491383f9b1d6853bd9d691b9d2e46b8b34f34fd7022704105ed2040162ad3fe8086e9eb159670b7f2b812cc19e83" + }, + { + "tcId": 1129, + "dkm": "fdc62b177f53390808d097ad9374a04c301db02225d5b874ae91df094a2add769a5b8d4877a0904f388aeead9b601234536c78f818093e13549331eb9a75625a09eeccb8854728a75c94a75afaacd8cd9e4ff18eed7a358893fe2c2c04ec29dbf749f347cdb3579adf58126477531953004d62df0357cff8321c04525a5b84f0" + }, + { + "tcId": 1130, + "dkm": "fec17cd7188de785f63d6258d707dd69fa27c433b3fba75df74baea22980543ee87ead667687611a4671aba9dd1f0fbb5946a39631defbaaa0097019d849695bab20e4a2045fd1c139a36f5b013a5a8c29fbea4c6157f99ddf87f6b8913574488d1d9ac48963f8f8ccfeeac76e82da888169091d680fb6fcd8a0b2974aef4b6d" + }, + { + "tcId": 1131, + "dkm": "6a0b43b89dfecf99b4e9745eabd46f3895d9d0d02c83595821946a525d71ca0d52bd7d5ee05743c9403d796a4b2ed3d584c04ed59bc5fa5d699fb8eb18353f1dfc249467729cadc26ec4efe2c2b4772c782ad7bc4b112bb8a283bc9d34a84c12206632b983f9c185a9e7d2d8032032dadb397e1f9077b165603cbb7782f77cfc" + }, + { + "tcId": 1132, + "dkm": "8a2a4dc3bbf2b15427b83533151b150c4678327a62e7bc457f00952d3e3acd483733a976b441aeb034f6f525fd6563c309f92478fb84b2f0578ccd1ef3a0a791a800259a3eafcf4d1608d1560deb57f65b940d090c83c71b536b46199bc4bf5570860c0f36983c9c8deaeb010ac81ce8268f884a465a5edfe4e468f69fcadcf5" + }, + { + "tcId": 1133, + "dkm": "92497eb5747570e36fa324f819b5e7603d9fc8349d424228f309ada2840dd3cd3e4165b5eb3703baa8c78cc6c2d24e065b73ce804f4ed446c7af613e1e6ed3e93826f9a4ea8b4eca0468e985a11a71ff4cd305ebd0e4a4720c8728cc9b849c8e84dcb3b5439eabda694ca48893ff155ac1f1abd6c097ec5da8d1271cebb3f830" + }, + { + "tcId": 1134, + "dkm": "3d83d7760c586a229cd67f28c164f5c945800da81f954783dbc7fee19cae381c8ac1e53b3357e415c9ae80801e6a58b75c3fda908e8d5850136b492665a038836c50e38383edeae037e8a20810337d3b1c11ff4f2d117cf15fef6159e54b218e14ee56c01995ee82c224c3563250313c432718a62b1f1c0d447e8bad9704c810" + }, + { + "tcId": 1135, + "dkm": "f81e8145da47067afd22462f7b9c35a5d7b1c07e1061c4ae9585bbfbe1e5bb39ec278670dc52bc84207d6e079d1225fcc01708f450d7e6ea5c9f560815a552ff1074aaec9a32c0079485bb78a3f4693a116149c08c8cee8e0162c70d0b1e4bfaa9e3b52e6c3c59a99aa54590a133208d9a3e1738e1a8844c42676225bfbbc512" + }, + { + "tcId": 1136, + "dkm": "5a83e40707b1f1ebae96da37f571632ec87bf0a59f858db3a5116a35a982ae26c6af305883a1538b299c43d9c397f408e9022730f5d9060a0ee468a0a8a19e40e85aa102560bf0e56c2fecbd9be659655469ff387282e84c405663bf871c531ed357488d1078f9a5de93649d62361d38e06813fdbca584d545082959005a93e6" + }, + { + "tcId": 1137, + "dkm": "b2852e7dc2a93e16476339551610bff87d042257c599786d9d5f864cbfd25d52fbb216294260fe06a0a471a494d004081c24023698ff3bd9145448f023c076f40acef4613d3027034389161945cf05ba4f0aadf8d7fcccc5b30cca2d2d8fc2bb89d15529b93476f9f4288cfd98f99d63b3e63d93887c9efab33a18dda32427ba" + }, + { + "tcId": 1138, + "dkm": "05b3c4d1726935c2a20b60f684d42285555eabc147d310e69954561d2f70efb945a81afde875efdb94d169b715a7a89a3abc005bcc9ac91c1a525490139d0cc52e3e65709c4ee25c394e119d4229594202380243556d19c817ee7fcf454ee3b963a40b00ac3f18276bb72ef764aed9e0a88e2e0df472825f46493056b1eb04a6" + }, + { + "tcId": 1139, + "dkm": "ae2b07d0ad8682b99dfed1d227a6e02b0f7b5ed4c4213d40ef417a97cf23769d34703e84ae5526c23a04e1e0492b21c69446d31be1748b42bdeb34a9951a988a0d3bf9b7461babd53caf0b25dfc2462d1ff8232daa509e0108bcccf2ba4766fdb3579d6a9954283796ec00a2956ad7b58f47c3f53adc3a464dfdaa67ec48250d" + }, + { + "tcId": 1140, + "dkm": "11b3431dd9192f0609e3ce37ec1891ad0a226c217ecd7355eec89f0ba1babea385a8db65c0dd87f7ee02a145dc311e66e0468f199ee45720f23bad20d64df7866597d5fab29f3d506ba354f976c25875192a91f0abf6e1d71b6588f96663eb50ea8aa1ecbdd791264acae290107f626f55322ea0554d47f36fe736f0766bcac3" + }, + { + "tcId": 1141, + "dkm": "a6441a042f7a197594d22fc9b48e7ef47e49d4372a2f56b58d436420c81b1a6755f4eade7b972cd590082ae369222a46fe726ca30d2572a6ec7da542cc5f1cc94b49a7a3ad63591991598b6262a408db4743d8dbf30ae97539b2d0fd8e5b9900c54b1f254910a5af2b90cf85111783c4117fa9057040e787fc4ae9928e2e5126" + }, + { + "tcId": 1142, + "dkm": "2cc70c0f9f380ddb33bc573f70f95cca2db43c2a2e95a35756557e86eb899bb25c5a8cd2dfebf38b27a3678001759655baaab2f8e6c7e60c6c23ecbe82e4d6c0d27021f9efbb04513ae0ae5bf76c233ebbd3d3559f4eab938a8bb2f11be6afd629b5ece30461b9ce7f2ba208421233caa61c2ebc71edd9d59dbb88d27ebafdc6" + }, + { + "tcId": 1143, + "dkm": "edd60b51ae8f8e23e48303bf47af0b440c6f394d859014b55ec960d3fa887230ee6d658d3218383d26aa34194015ae68614cfc197169d6fd117e58d246d416e25c3d6fa96ac21a2d594523a01a823f7058bcc0cbbcbcd23c884e69232652a89f66e435ef2bac44f3e33d06a81761a3dd004c4f81393a614a4d50099b807c6e05" + }, + { + "tcId": 1144, + "dkm": "bbea0902b54baf02a413af2a6c263c9e01d58eb48d4ca3cafbe1d6058b5571703c380c201c098d0dd3e03b368ca91f4662f00ccdf5d855f46e3574fcb63e689428fcfaa6cbda75c86f1dbb8b559bf031eca1d5a8cb38df3b4ee27ac2d96042b12281318f7734a71384f398b2bdeb0e482898011e19b4555c765ba93cdf354ad6" + }, + { + "tcId": 1145, + "dkm": "6826708644d76c6a95836fa82274702dda7170cee980ce547c8051a258cd2423d46163c3f1e32d0de20465939b32222fadae15bff97728b3bdbdc1953a6fc375d2a47f9d5db9a212f35d5f9a5a8452ccbb174e9d1190fde6c3fb9acf2ecdc544e915764b7e635666447eb770623740d3ce40eee7071d1d59d5e0f1c5ac0fceb2" + }, + { + "tcId": 1146, + "dkm": "58791d0062325c11257522b14764cbe69b5127984dad40171a7811aaec41e5210bd0c03d55d02f079366347142ed22a1eed25b27528f699431f7ccfcec249c5b419d435538b6df7d3719cdbf801b04e23ee15a10c9332128e23f75406157a0860227e0c452813311e004d18c6b033cbb9fccb22faa7a12d066454e058ddef216" + }, + { + "tcId": 1147, + "dkm": "73eb39c3dc609fc13c7ca66c0707cf9f05693ce5bc71cdbb5900017784336616016e3a5be19a613266375c86166c12d6487a71801481207265ee53fd530a72c0a82211ecca6ee932b5515b8db9bbc57df28bd54e7f5d316247e1c66b6151e34e74473782ad23d8facb6c62c11c23afecbe46c4fb909a810e8f2b2cd024053692" + }, + { + "tcId": 1148, + "dkm": "240ffc3f03b1030ce4787dc26bf7a1330db2b11eba516cab3acfc709df872b48ebb461fcbd08aa65adf4d8a0a9eec4ec9fb6962c9cd01cfe6eac70afff2d44aa0216a093bff68902b50573698cd36dced420ceff0ce17790d4151e09436bd1f5191d4a17ef03b1a2eb474d5bdad7e6b8f5d5faedf385be4cb12f0043ab2c8ad5" + }, + { + "tcId": 1149, + "dkm": "82d99bab9f4f23bf4b249f96e87fceb38515d3958d313c331e2688af6b959e069ba23102a713b9fd6ca7d1da2cb77da61a14234026ef46d391c86f70e216c7e65bc9ceb3de49aca37a100ca1369bbc471b939e28e0ea84bc95634e3dc297118e81ad774c6435c5f58c878e09112ed4e9462f7b1ab77d687cb2aa7151af71be93" + }, + { + "tcId": 1150, + "dkm": "f85fb4edb106140e64acab6c560897c66967105c0b421a325769b428267b9c4be36868e40511a87eafa40797a035e24d5116fd352a8a8e8c65359d4e01eee9dc7cfc9f89db623e59d1f95b6017a469b4559afb3d2ba2c6e189fef3a7979c8513c4b9d3404678c6f4941b0a93d4892e6b73be88d372f43909607c4046c6fc96fb" + } + ] + }, + { + "tgId": 47, + "tests": [ + { + "tcId": 1151, + "dkm": "e6c91585eb33140f70735bdcf07607746cd1c9f3caf25c64b68cb175f70622a670288d8e41e56b5f26c1e846b54b3ddfc8efabca2d6126a24d4f79c07151e641fc4b1ef04e2d86d1e1c3f64a36dc456e287b670ed05b7e9fff4a8639bcbfd9cb7b5a8ef48fa70e7e17bf0aac4c2b1c979da6ccd0c277709138c99e15ba4e9447" + }, + { + "tcId": 1152, + "dkm": "8929a97b931e1b75ba4a34221eab4c94d89798fa926e5476652f73d0d0f9551100afa6fc7c8409a1f50dac7ed7458d79a6f2b991a2d1f5db1bfd5ace1f311d04a6fe9f8d7b58e7c5b4cab9cb28dd12a50f9b591f9473cd476938ba8e3c62d96efd53c1f66409f90c0ec70a3e4df4a4170d825cee78d43064cd620ca1160ed905" + }, + { + "tcId": 1153, + "dkm": "8271713b7eabb6844df862390d1a8212f8a07bc8e5dac3fc8c00bbec051cdd33a85a27d70df1b408af96140a2cd9a10fa3ddbefb27f6e05b6e1a56b31333a1b994fdca11ad16a8e71567259f04093e03ced3147c490a34806c6d22c9ec8949d1183907c10499f2d95ccb8686ce7df81baf114c40ea1557e1afe952372baebd48" + }, + { + "tcId": 1154, + "dkm": "4198f312922ffb4c892e4ab014ac0e644c37d77ef84f48e4d6029ef7a08bc7c9951f2befeb25d7eb3130078d1b7cc9456d709393926ac49fdb5bde1e670e7bac3c9e665540780d3e94408e27a1439eb2d245281fbf1cd734afdb0e9e8bb5231d2ccf56d7a57a9601f3ae99e54fe91ab96ca0128d758ea3ddce1b2a19ce77b28d" + }, + { + "tcId": 1155, + "dkm": "73b8c5544fe28f9509589c1e6c3643b5323ddde4613207969f575f480bc03f006ea94cc3e858c0649ecedcdc3768e732ff29a673ad745a8f9e2101e9e0b4a60de3881c4c8bab11cba91d147bd7f5c3e316a2fc66e93630a894f8bb12968fe3a375a20eeca1f395a29b7130a687180f1697ef8b3ac02d35b83f6fbd2fcf7cf515" + }, + { + "tcId": 1156, + "dkm": "118b0c444780efbe51d9db1a1a225b423b17a71e6c40be13ac16a49180299fee3a3d723ba550624746c79ec0f4fda5713d1ea31adaf8cd7a923dee2b69d23010dc957d07bc5bc5f4381c25a9c5b3f1689168cb19809fed6d50122d8e48be82042b13f3e181a55eef3adfcf8864154795ea7163310a5c2e9abc410c61da3f9364" + }, + { + "tcId": 1157, + "dkm": "97d5704174b12ff7c8dc6ef026ede9e80aea5ccb6d8f0c70d4d877c37746154d8a5fff10682dd7eef107ca9995e04803029ea49ef5688119f20639d1a487d2daf922d22b95ab1d4c0beab353063bfb50a73a7f4ea747855ba2ff70831e9f6866a45a313e0a0f1dcd6ed3e5c0e96d0c1b192d74d69852838d6d802d8e8ccd3ed1" + }, + { + "tcId": 1158, + "dkm": "a1e6635dd5d9c42c889e31cf0119d82363d51c8128afbe34666fbc57b754ecfc324cef5dd0a8d2e515af17f57fbd7f308624a0e2b59c716e59f377f87084e455e4e8f24c17102aca8a00c3510a6e56c650ee7c8cd8d31d9f169817089b154d15bc2b276b76a247301bff936ff78391e2fe96455215652208e622068bbf3d4e23" + }, + { + "tcId": 1159, + "dkm": "859096b8acde53f4089dfabc6f776e4f7972dce7c911ef2e9aeded4ce8dac5be264cdac68963ea942ec67dd9d2f8f4c47faaffb9e98fad0fed512c8ab387e528be7e64fc4d81f557e836eb08cc30ecd5334c3c73fb93b73ab1f82192a7ac117e633a4bbd6fd2d2a3f24ca4798e755aecaa8c2dd84d7bd9cd4043af93ce440448" + }, + { + "tcId": 1160, + "dkm": "cd929de62a196fb1ca061acba14edbba5e3523f21798d47026bcc390a34864047487ff011e2c62df5c94a830e7ddc52af1ff619083b755e303d6821ae40e042798b7638010ac278fbe4a4871f806a8a5a22ebb14b573c058c507567f5fb22f39b3073484d5ecb3c401d8673ea48e450c9c7aba811abdae28562007723be27169" + }, + { + "tcId": 1161, + "dkm": "15a0cbccfd1e3b55eeb00ee52b6b066c66dfb8eb3199c379081c2c5d728c582ae849763f7b8508fa1f276790c02dddc8b2e829eb28b2b9af9be014d0e9ced3df2df4ff0810fc7e7479c2f51443663e1efdfccbc4cc154c2365ef3657489559cf57f3f04a48ed83d4f7f54d5da107cdb0001c8ec2ff848e25eb13700a6639bfae" + }, + { + "tcId": 1162, + "dkm": "cb79ccb39ba4088a957616127e85425593455b0b57c759f0cf33638dc2f9906548842350b8393d3e8dec7fbe4b48a7b613fd83eb5499f15b556cb2fe31d48e7846d726df5e780a804c6142bea94a5c075ec8eeb0922bd4704e04de5369371ac70c753a01f40c8d35c93fe228fcd3f6e604f6836956f60f50b2294a8a9ea430e9" + }, + { + "tcId": 1163, + "dkm": "3cac45a4a23e96e34170c2594613211d9112f9f9ece60e9e503db3acea69a9796cf3fac99aaa6c79cfef546f7d46a2c2b97661bf4bc0fb28071ea5698f6db3c82c31c84bdd89223bd431501baaeb581fb8e776ed2d85ec9668d217a8a2af343e9f6f415b6fe6d3b756bec0755d5fe522c04403403ac7af94970292500c2270cd" + }, + { + "tcId": 1164, + "dkm": "c817951dc812d7222b932fff6c434adea22243e48ad24ae7e416c18824e7146786a45c61103990c8bb298d74dbaf2a43457a431f3c588274bc1b8111640a9ea9c8555505945aaf5f56e7b351709d8652c34b5df98f8da010bd67905c01384a0f6ffda6d82aed4edbd51a47fa25a3e2e7f731c902c4ef3469813fe0f7ec080635" + }, + { + "tcId": 1165, + "dkm": "175c4b4b47f2f4c1f3b138f894282e7faa9ab20f088b028fe13f4969214737c043a491341f88f2d18f5b5dc901e18b7eb69d0d4f107fe4c8ec3bbb67396a6f8677692369b588b8d408ec125834b6c4b9ed2fb42f91587ae8057d0381c73126932d4dcc700438df9f3f8164201205ef3e7dfa1dbab4830994f4b943ad079a13fa" + }, + { + "tcId": 1166, + "dkm": "1c2eae7b3d627b20f74b3e0c7753d0521b9fa8f5db0067a56b6f0dd0080b9d2392658bc60c36df1d169dfdc6b6055ae845eb905553cf9d71e392463a73fe7648441ef5fe7b918c9c3fb04170c4cdd3cc719faf3fbee0352117b088b5df5a5704b0a21ccf10792357335ae57695d86178978a0a835a7c7a1d16cb8c502a799d14" + }, + { + "tcId": 1167, + "dkm": "e93bd20196d195cf9bbbf20be738ff89f5b3ffa592cdc354249cf62ca5b5cd27e11a7659edcffcd5fc807fa82482b6641798ac9193fb08db6f88e2f9f67a28b509802891e28d33b3af11fa3261c613cbb6d28c987db4ba47bedcdee62ae2d7bef74a10bf2c860934b789a5b1ebc88f27440f91a6844a560a30b84e6e6ccb376f" + }, + { + "tcId": 1168, + "dkm": "380cfae7ec69e28dc1d49e4404ecba5fb0e901912b67019626fb0498cfa783b3b23ca46bae914eea348116f1a2dc5cd6f383d7a3fb52d6e6ce6e17537e86ec3efc3ed889d8f937808f8d7351d0ebc69912c777eebb9b9aa1c98aa082b7bae348458c71d0e885e0d8ab756f38e6f5d6adf9bd1a65f58e9c95e808f9140830fe89" + }, + { + "tcId": 1169, + "dkm": "cbae2921166af9f1d0b15bf1de2228eab34bef84ce74e994753befa0ef30581bbe9e76a743f5f9000414e181c9783691b6c11b5c6aa5b17555806095018cc12139024dd43a938c5beb3c191f3c65f87dafaf187f08e40a8033e77c1a5376dc9d15c79cd8b51f780b3832f27250b36e91e19bad2e67948204863c7545225b51a2" + }, + { + "tcId": 1170, + "dkm": "eff06cf8d4621611705aa7fa65888241fd291d3bb61627877376b93b05a76e4deaabedca1cbb2d825d53eeefb3c9a8ae7d1ce51e5f87fec43ec2d6527eb93a28bb36d5dc649c2dd4aea43ee9213d926066c4efe63d988b6427cc682191f2fdd423937a0408db7ed755dc835712cde8b6666190ea40e5b907387f4b611c37fa03" + }, + { + "tcId": 1171, + "dkm": "8dbb6d4029330cfa86ca5b06eca9b8cbb65cf7b0e6783fa87e2c217e62f383903a69d29e7f073bf825d62bc33a255f966f559c96834d9ca133cfcb7b8c68ccfe2c7b024057b99c5c513c478ec35e743ada89b46490d6f483f38f8d54c89de69c48e3575e4f527898c2da75b974960a89543f1468fb23b87fe243a64be4987403" + }, + { + "tcId": 1172, + "dkm": "a7b4bceda55543cc133af668ba6141cddfc5cd1886d5488d63d625b76881f5ae96402875294f57d1d1ba749f9b74cf093fff6d5d84cd684625fa1284fc6efed88a4245329bd23f0341356bd3e1544816267ecfdb28cbc9c6dd8638cd5e2c7d3b129fca44bdf74e62a5fc6807aa67276245a0c17ff3cdd9a4ac8be3c1881bf4f4" + }, + { + "tcId": 1173, + "dkm": "e9944bd36885ccb50caa0017ab0b6924911aa7eb9d48bcde60cb51b22ff672fdbff261acc1853ae77ce992791efa48b3aed4e9f40bde1e4c4c90ae09897a392d8b4d048689a48075952f20c4523fe17edcc3634e9582433f288899489ace9e7a93b334b8ceee070d8661bad11cc04587c13203bcdb17df2d40016491ed08cf8e" + }, + { + "tcId": 1174, + "dkm": "ff5db130183380dc3b0be80ba88ec73aa9cd75da23f5edcd4aaff75648996216b81b1bd484f3c86083b49f8cf6781beab15a0d4fc2bc3f1ce157657aac2fdc8f5a1e321893291cf6b51e085d83240398c1c7d02bc78d277a5a14586a6b0cb8fe09610890d762a9e2ab36ac2f9eb04bdade95a8ee5bc6be06c6030ede90a3af97" + }, + { + "tcId": 1175, + "dkm": "fb225de8af4ae22b5d0f6394d71300f9022a6f34e81d431798dc5a7530b3fe718540d3dbc9d140be97c4cd7eb6e3e749a314304d7378b6e617b45783298d209846ede31e5ca31f119b6223380b01da28b358d4fe8dc160276f4632c99b46e1c06a2931448e7c591d1162820c54aa36537a8b721bcedcc46402eacf958f1fd8be" + } + ] + }, + { + "tgId": 48, + "tests": [ + { + "tcId": 1176, + "dkm": "36beac8dd54f343db3cc8d27c9fec5347aeabee362308773bab400bed463a86578433e8d7422ddb157915063a5a43a08f39631cb7ccda81451b30a904831ffeb1f562852af6b94a7a53e8449a75dbd04b7d75332aec8e9bce18ddfbf663e26d3566bfb2c6c5b5102ff1dc8b33d9ba1b39248082a5ede1d540630f9b3ef650915" + }, + { + "tcId": 1177, + "dkm": "c9aeb89bf734613da5e00c79c577648adefcf6c8fada6b7a657890ca5107bbf0502c04e5ec87ef3fdd0fb73c90fd56446dbc7808046723d086605d2c424dce9e2e8ed0c74dd5e47986eb8df924622cdb544edf0022a611dbe2c61e105d38cbd37c34c5b42628420752f1377d5ae84dd7b2dcaf43eba46e8348ad4bbd356058c2" + }, + { + "tcId": 1178, + "dkm": "f07dca9a297be0e321499c9df0de50992fe53243a4e62df08eb7fc9b9a2b97dbf8b3bbb2e20115d36751b554b27b0f9305001656ed34f41be1bd0e8b3d1c4627f31dbd17cd5a01d650a2f46e20317e41a2c7fe225901113c74e89ec67b66562d5626c620c0b0279606aad70dd43111594411714adb68996735c83c40a2cc9937" + }, + { + "tcId": 1179, + "dkm": "f001aa92dccdecce12fc2db342007b2174dcf34afeb4d2c51807da06f387a4235e02f5f9cc95c1f8f96f540322bc0ccc6ae1b318eccefeeb9544aae111205c4039e458a8792efcc22ab58fafbef13fbe787019ee8e98e79b2b06d6b2be03637395643fd4c45c52787e6394c63ae7d9f0d96b017ab58cffa48232ebc1cb7b5d89" + }, + { + "tcId": 1180, + "dkm": "d52dc08646e6e355c3f3b5b025c69c39db8d1cfedbea5aa70d964ba66126cf5f86ad23d1d1afe4df403199abbec46e70899bd0cf67a31a60f40b12c093aa4150e18bf8ac5a2bf5d47a31c0f880703d4532a27f5b5abe12fd94d67daf5e39d3ec011089a38b6e8918f2efd1de3c9dc38c56a4cf60ebe79ee1ef5be9666ed0f6f4" + }, + { + "tcId": 1181, + "dkm": "187089575d2e24a7db726f5de9f4036befa60008bff8c18c56f241966c85ab0f1ff3c50fe84c757beb390fb8d6a74d8dbc9765e2ded1b35f9e72a87709b1af531a0e3154b2335bb74b863439528067c6cce12ed1026e7e0e4e990cc7e080c6f42bc52350272f61b88f0ab9ca2328405d1869b497624130fc7a580d97690db2b3" + }, + { + "tcId": 1182, + "dkm": "938ea87b71d9901aa445e49a19ef01cd761f265f661103eeb76718213408b166f1732104218e08e6274e3406e69c3b43c6552ea8b54b34e091ed0d44399cb31a76fa31cf64e9722c5718319a81349d54d03f77d06b90718b12ebe0af47464bf16e070be24e77d3db4f1be9ab2b481778a701ce8a8310917949b0950598ee4aac" + }, + { + "tcId": 1183, + "dkm": "8ff92edb0803577326438211326e69e38ecf06d30ef773c5affded3d5ed47c949c53ebca7578e563719b1d923fcd9f68bff7dd4e946cf74e3235866863681070c6c1fc31dc0f28924117030340285cda17831ed831b8a982c00b60c9b69a52c04b7053de3caaf9883ee99bc0df1edb83ce2bf9f96b9ed90097956a01013c5e12" + }, + { + "tcId": 1184, + "dkm": "fe2821f17cf7fd859e59f13949862f45fcb5fe8aa1ae2c93eb29e40a6164b1d697a68bf3259df0d8fe50964ba0dd21d42972a6d78ae9937797a07d1c576e157da76a705f742b49e3ddff6d29b95164f747a16bb6ad6149bd07002b527b0fb3133113b4b82e1acdd07f5fc6c8dbba2c5ce3fd4a461fde242d2fdebea51c85e189" + }, + { + "tcId": 1185, + "dkm": "4265c8305112eaa10ccce731986241da6ea56bf1d3994dbb7ab4d2bec7359c84e939d8891ed19d3ff90ff2370c0f87a25282a3234baf0c9f271b92c93a2bd227ced4538e618cc473fbc0ffe8b9163f69b80870cad6101ca0ea4340215ed23d52f1ae7358a85a06de026a3cc251d21e720e7378300f154e551f0d5e7a24cbff68" + }, + { + "tcId": 1186, + "dkm": "8438c434c30c5141816d0507c6e646c61ad8ecb35b01d71f338eda799fe6a7cb97678c5f93dac75f948ea7d4a9a8a813a7b571c75782759512f56d44cbff1932f3fc77690e1d932ac08c10ff0151b07a12a836d0d79adf78eb6f7ba6d08dff99a2252fc4ad272b5f69599803a11702c1ed2c38a1232029174e20c13947f7d3ef" + }, + { + "tcId": 1187, + "dkm": "55be6d26bd16f886eadafe3c14e6b51f51462d2f717ac7171b50a7fc10b06ba5b6c26d86175d7b5ce1f6feab7516435078d027510be3fd1f4f03f7d0fb7fba2e47c428a6a74b4459c2ba4b33cfe17c6a2b994a5b2b737a71488e4820fee0b58cab3967029437f2061375b7668c9a074ce8a2a2b6d4a9093509cbd3824b521fa7" + }, + { + "tcId": 1188, + "dkm": "67141d357cdcc4ab708f1b1e23939edff409eb284351cf8395483353e0e7cd75bc581041ce4be7566a010f0f6dcc1475c0bd6b07dcc644bd8155a0087bc83e3d34606006e38de64bfa81521157fc5563fb4b9632a220168a6d60e545e13991a3f2f931c15c286cff25f716ef3ea8d931b43aecc4efa60db1a83019617218f9b6" + }, + { + "tcId": 1189, + "dkm": "b96f86b604ab55e6aa2ce9123267ddf5051ac820f98622697ede3c658105693320f7d69a1dd0c6e344c83fc564a8ede9acba6133ae9835c865bb071f3e25445621bf84d44676dc72126e09b8e18310bae81cdd8f263c77f88f20c4a255ed94f36622aa191dcc954647f911f22d3cdcde49991436e7f5f56e8ba50a09caa8aa8f" + }, + { + "tcId": 1190, + "dkm": "f87062de4de48ae1d87afee2358c215fb27560649eddf9cb794470f12ef3b5d3c8a1a7fd27635fb03399eb432eaf37d32e05256ff099f304c4db72077db2634e8acddacdb494dab181590bc70a6105a6880bada41124360e403e6d2a5ffc3bfa689b519c86cd3f076ecab611baebd9ad6d16e1e582255cafa7143b4baa7cc9ee" + }, + { + "tcId": 1191, + "dkm": "9c6cb006b06185307fba7eeb96ca435f67cf896c4e12663128419104d9995e3b2b241fd83a7b3ae0f351c8c3d86f3dd1a37912d9b98773145701ee74dc95499a49e2217622fc58896289b6d42e3a465fe44695eb400860b536cd630ab86a312e63cdfe66fb0d563f141cc129c81e013ed19c3144b337535b54945e39d1acdcb1" + }, + { + "tcId": 1192, + "dkm": "7098318c6e2521315ec7509155add8351367fc56bcdbe5ad1c6dfe1c6f3cfe100dbaa0b2034161264548c01b20035adc9a6b95418e3af33bf50f329762bdbbee89bb69afb96401cbb8cd43bc47abb7738946d819b3b0d47f0961236b98fc875f72d9e672710f4588f10aaed13f6402e5e70247c4367b2ef17ecc21c8cba1c296" + }, + { + "tcId": 1193, + "dkm": "0b97d1feaa92309262458e12041aad04ee4c5b27f7739d216d92c5d3690c77367f5d6cade300e7f07b40f42b7eaa0666cec68471c40536ab22c24256aa15d987e7b02a63e31cfb3a0f56526d8a7708c2be4ba9d934fe990c8baf3a27aaabbd6eb5da1f0ae29dc2136937d7c57162dceb0e1ed741fd9b8c93c07f44f1b5646ef5" + }, + { + "tcId": 1194, + "dkm": "18635358288ca4d0a74318a4a5503efd341a3bf8cb884e1331e0e670588c8e7ff535f7f6aaa279992fd2fe3cb7f297f8a3f32f3bd596515215516327abc34aacb998e7bc53cc3baf66889eea111f33eb80e5f7de40021004698b1e2affa6e577e7f4da30c081840be8bb268db5999662ec37800e76cb52f57fdbe2952a07a27a" + }, + { + "tcId": 1195, + "dkm": "5b1383119458788f924028f2ee34ea341638e85f4222bff03d8c4b993ec16731b7f151cdc01c549d290bce6aadaba27c0092e94197e068718471af5ff682e62fb93259a1449f4a197f308ae2eea4b2b77450e57639335bfbefa243746303fa9cf1b70cc69a7e82504c622acc00b18eddd13f40202bef6309d370c65bc8e955c0" + }, + { + "tcId": 1196, + "dkm": "b12704880147eabc110808228c4df12a5e4009460b0167acb2ef884113aa4f8e257c04a3b097d80555e69eeb3ad30813c73ed06aa83b8b6a23b64d29baaa20f879645470bdc1315d3bd1cd9fc11b17ccc7f5b33ee3a487423c823925f44028aa38d137c49882e33e56b142b60248b250f67d512467cf068cc83e0aae7a27634e" + }, + { + "tcId": 1197, + "dkm": "129603c84bd512784df4a52b9047e1168eb61ea360b1a6685b2446a3d1ee7af6e61072e5afc8d72d92bb7a3754446df7dd70fba1b492f832f3fd1df6c76dda4bceb25b092949f11afd23d34272f43f529862b4a02ba5f2cf8c83cf0ac98f6c781988c32d10ab680142e8100f8a45d6071f77b1845358a799def5fb20db36cd10" + }, + { + "tcId": 1198, + "dkm": "16d3fa5d2950429e480e04007b92936ac4fe8abde2b098d60d4ab8a2f0bd91e5423ed474bf1a5719307b5a59973f8bfef98a126d37fa27cfac916a285be36457c8a659bc68cd374efaa9d01440fc36145b1de981c4f2ec516c05f66ff10cee593a18633026abd52c4563968813358cc46586d3b4d264a14a212bc8793838a395" + }, + { + "tcId": 1199, + "dkm": "689a3e805230253e9f08a22de1734740a6ca63b31327eecbaca4a7d0a90fa876233e040745708b8ad9b1bb284627594c90153b3c637a9ccfa52bd03110945130ebed626f9a705bb2bb25c25dfb50bc5d66dd8a4111b5385235e1d4bcb32b1c588b0f9791421a09b06baeb28c067563a85db478a0b46a6bd77d8447dd1cb004da" + }, + { + "tcId": 1200, + "dkm": "5e422eb4e6595513ab805aca1dc09092803fb89f9c63efaad491587da8ed4dff331ca683b2dc11d98f6e76f0ae0eae87aa1e4b616111cbf964c41b362af9f0d4afa46098322d3d1566ce368c1618c90780c4bb0a75e1cb207934528ad98defeccdd0573c90b1034a0658b33b8c6fd8ca5b8013dad5e7f39962375f289329e113" + } + ] + }, + { + "tgId": 49, + "tests": [ + { + "tcId": 1201, + "dkm": "728254179fad9f4435781f5af5118d27ec24edf6b4af6ca99783a4a19ee525013e1b48ecb0ab01ad8984eb4cb38a415a24d97579ac25c7d07f40de846be8ed8bb6a70411b119712f1b14c49eb10341edf2116a87b7ac4ebbe7285851c6aeef834c964485346e1992807a053071a9f26af4ff79c8d4071d2b251df455879165dd" + }, + { + "tcId": 1202, + "dkm": "1142d3c78ccd63eb99a859f13629cbba3ffbf92cd3ef5b400e2b1cc88c816f700de2d0abae3b94b57d096586444b829ccc519b2043d944a0349f706be9022b03f1fa0aad4e4dae9a280eaeea2b8c51118c6d576f70ca58e8bd50e49521dae7ebb82d2d1dcb1267545d21e68219e44214b69e65bc429b7d153cdb7d5a35523110" + }, + { + "tcId": 1203, + "dkm": "bbd5353fd578d5c5221541fa532f6025954a7ba1a288ce471c6a6e92af0cdd605b8d73b6edb04cd6056e8d4710ce64428c75e0602f76056c06e33163ae1616c6d3bf38cad651d0f8cf7bd588c7b775b6b2b93e06ee0a7e4f07b0ef3468c7913a653756fb862d167063ba987c6e74f0b8c55aa3206d980a05fae488a9fde34f19" + }, + { + "tcId": 1204, + "dkm": "7de9d772ba0198085bcb71d25790de656c83cc8b38409ef0a3e95a8902bd83197e1467f92fc2bbcd431f2f03800d0e2c5bfc17cfdf7cfa23bfab04293b978643ee75bb522c8b4284f0c53f02586a766f1fbe28415d3edd149e4ca68cd89833806bbf017fe16496cb62829444c3cc6a51bdf0299c01b50b119885120c58b68791" + }, + { + "tcId": 1205, + "dkm": "760a40752d2da8cc7a8c9ce20d102a31beee6c711a6a7ea182e5a4513a115ff07300e6e6f1b834e1b42de4b28b338a52f9459f28620302b44fb87ad33306db762c32103e25cc0641c531988579aa0fa763a34535ff4dd7460a14972e6cbb2f68205ef3d87d2dd95b1ffd01bea68c01c7d9b8ce51c24f2f18bc8fabd0dd5ff3af" + }, + { + "tcId": 1206, + "dkm": "d0f31b0e26a5853f2d61620620f33692eca50ce24b5912f9708df4cb288b4c7c5dbea8f5b3012793f94e4b206ad89c71c93cfed35bd724ebabfcee4bba38b0692d37cb5e56a7d144f7502125d3a190e338d8db66d9e2a8dbea06085a82802c350a702d845dd9e852cb3ee9e7c1bf9f143b30e0398242d067a22deee63385f4da" + }, + { + "tcId": 1207, + "dkm": "58bdd253a08588a36462d566fb5d472f48334b1b90a2c4d6d288d11771465985d7ab9030d14b39d9fec8b0256b849b3062791904a9ae049d2599474b497202074fd042d1889339f30b5a85d7fc62887d303c684e7d2e99b93a78a5303e09ca72b8c7f6e45242eaa4344baf4cbdcab91b08e2096bc0adf21986aaa542cf35c792" + }, + { + "tcId": 1208, + "dkm": "18a15534c4b904baea5ade8e024693319a01247838ee6af0a9022d8bc3ac62ffdafc30659f512f8fb5408c68182c4891904f92ec3029d17e6da390fcf0840f02d74bc76f1100fd4a38a426d3292989825bfcc8f3daa1ddc14a8e11e330d9e45a9deb6cd9225e1ab6a61febdcbf0f29a94fe8f84eef0e526b8c55123f697d8cfa" + }, + { + "tcId": 1209, + "dkm": "ac508e924d2b0abcfd20fc4d9e5a4a9e0dd6687c282050a3b7c851644f56955c54d69b6da6ac8417786e0ffff5808683165753c68888c8f670c057958ac0107cbe1c3bcb544c8209fa9ae388bf5c05840b6de62bad1a777220da784cb54acd9872a1c445a014858806d5dab9aa3081e100ef1865bc21d590450275fb83b083ef" + }, + { + "tcId": 1210, + "dkm": "80ee9dcf17921304a28de058d160c029ce6c1ef17bbaab1d1218d4319dacb5347ca7ced9e9461188708adb7b9ebfcc8a59c9790a5e392f0f2751fb4b4747d5f37a15886ea91ee5b8a1946fa5ec8862e59641c3ef15f7bb82aed062b6b893b80f0a5b5de938c50295e291a2e338bffc20cd6af0b3ce488b1260dc48c3a5afd7c4" + }, + { + "tcId": 1211, + "dkm": "757a29618f5d87aa2e038d49e344dec5b35a85c84ede8a7f5711007a31507538e5b313038b2834cd48623413f5e520cf41f35d1c1750fdedd0ef9f2348b942ad7f9eddd840e3194506f1ee45e541ab0bcb3a4ee981156c3201d5f8bc477497f2c16c08b5d850a04d1edb07fed1f1a7f53013b9501641d788f2b3ad52966ed523" + }, + { + "tcId": 1212, + "dkm": "daff4c787f27c62212f670664a7d5bfc4f1cd7d929cb3cf0e46ad5d69a8dcccb4d70106e81793fcbbe7a60dbc0229a37a8e9dacc058557e100a9493d86dfce899d6b2d56a491c9ab081783684ae243d7f65f096a264d461d924ccc4da901105295678236b696f45003a89181e923dad131be055205e3f3e0dad9aa0131040b0e" + }, + { + "tcId": 1213, + "dkm": "d4f1fe92fd017dc0dc7b6830c19c2353bc0adffcb88e8859df4aba2f3ed2590172de352fd6234bcad2574d9d9a23ba03b5d81d8544e986108b8c9668984e12406245dfe411dbc85868e727345d7be856fb9c418f4bf886976f11d3035a652f8608b13ae1923dca8b11da40e353e6e065e7a4d242524cce315fccc65598d30682" + }, + { + "tcId": 1214, + "dkm": "58959f55c79c4c74e951be0be65906def3a268abfce4408a3b3c4e80911a8ff71b6ef43ab6ae85780ba1bfc7527a3f9e438828604b14a67292368490bcdb3e1cb1b70f5252db6440aac0160bae62ecaf4d816e4acbe927dfe73faec7c85ad1ffd7b9a3c2a7b279d38bdf03360b9f6b5fae209e81a6c64d8069b01a8a585183c8" + }, + { + "tcId": 1215, + "dkm": "679ab78d53ccd0ad679886fb7ef73e7315375c71745459c33570534f0240c890ce3d0450a0cc09d5d3cb2398b29953066a5f948516f8825028c5c4599281b7c5516c428665a4becedf7af6d7b3f8a6bff96bad526c86263e0b2236786ff933ccaf0a5fd6ba9d9e543edefbf6eda61d6baf454b9f657231b3e6523b3940227794" + }, + { + "tcId": 1216, + "dkm": "8ae295f07fb5ac1441fe2ddfc76c0f163c981d7274e79d353a28546aa50490f30634b243a8127764779edc98885080e03692483c5cd950e0778e49accf6a63b51c37e26089f0c3d7dfc2cd09cd99a6c5c79562132f40d9549baa949b8c955f9b5291c0d9cc7a944c087b6e98097ce587cb6f74f4bdb15892a6b49d66cf5febaf" + }, + { + "tcId": 1217, + "dkm": "a3155c8b845f4f548fbd28f24510c9444f22b564e38f8953f59990eaa4fd17e123f3c9f0680e259ed6fe04f7c0a9c9474e4d99aa1d67e2d59fd08d5fa7b6a43a55dcd5fc7d10607ee1d6caa1acf9220a6b346c4c5bbfca696281ffd7df41ff989134c1373fcbe780aff56bb47848201f6f089ccc9c185a45ecb29944ae198a06" + }, + { + "tcId": 1218, + "dkm": "ffb0f59769f09295e377a191a61534ac2b94600105140c763c4039846df65f2ec4c22a567fabb3e94397ce545588da6a0518c80413fcdacacd5525e3bb0d8eb3d34e993e90267a9701fe7aacacc0f7d8c5f903789a2ebb68259ae3c5d79095b682e1f283c7fd546512610843c24c0bb05e64d47b96ff50a8b538d65f6e0c89c3" + }, + { + "tcId": 1219, + "dkm": "84a0b299f7cac041f98d5f90761b0b0de7a1ee2a4085e88aab1d4ac91939ecefb0969acc78b23d6632c5d81d075a56aa6f04192aec413c247edd7d8ee6c03cf8bd23350fbd27e9a0b002c7204059e14454a3067eb1adb89bd47dfb0a4a287c46010ecdd6a50cadddf269e987257e6c4fc78335056d654ebacf5b8cf3544a4d12" + }, + { + "tcId": 1220, + "dkm": "efbccf2cacbab165f160e45d7739f4e91126ea2eedf1d68c4c705ddcb040f297730872ebeea0380133559486f865becdd10a0ac0c0f818ffbe16e9c87045c21df4fc74c2094d52d61b696d57279ae41b45e39b809fa18d01bf2a793a4e98309ceca94de6ec80b0097cedace0a71aeab31d45d38a00115dba625735809063191a" + }, + { + "tcId": 1221, + "dkm": "2dafb08e31eb088ca4fd063eea635a984103ca14ff9309d7b0b3ed665aa4d84f1f3a4aca6f358eb4c92807f04c964063e1e5b1fa55d952ed19c711ca0a5104ba51819e414053122f244cbcd35e510b8e28bb15ee553d6baf73b6f5b203fc1c7c854065b6df8415297c269e85c6626a10661e3ac477628b9249a837c62df1097d" + }, + { + "tcId": 1222, + "dkm": "98441da58ed8c836eb553c7a5d99e4fddd41d85a2ad304fbc8bed13ab7109e4adee38cf90f1615e2720f9c207c697fc690464cf11290c99742cb826d3b18647047ab5e46a86426e7c9bc04f58bfefe782232a91bf9e6c1655f0d604d09cded14b124b728e6b1d35eaf47a2e4b911684de66944d02dedb71ed45ba811ae1568d6" + }, + { + "tcId": 1223, + "dkm": "4e81a7ec95b4ffd66c376ec5e0d269f1b1f4afa9e983c443a8f41054c931b9f65f9975eeada6ca715c9f27d660953dee4a9cf4ae90cd507bfa529096ba54c00ae86f19ebd9ebca1e370d9370e3d73e20d9eb1fadf314fc77539101953bbebf297bcd3b9da55893fe7cd64895267d967f7525535b2e0f564d4c3ed066bb67ed57" + }, + { + "tcId": 1224, + "dkm": "d7528d63aed88172a614d44bb0ea77d078c9bca3c8c29317a09aab7d61973ebd64ce5566aa1761db7ad0ede2bacd3a5481dcb3baec23155fdfaefabab4f75272bc43693718d816ba8cfadea342f69f79e626aa38c6ef22c530727030637919332a6d43196c1f5141ca63146273d84d0c387151d6137d8450396c80a0522e34b4" + }, + { + "tcId": 1225, + "dkm": "a60e976ab54b219f069a1a55ff5186c8196c2899fda1dcaf566883d84f605c4cdafbd4d8d03827577464ac108443571c4e1a76bfa316b5934d4f915a3742887a2e9a2417ed3522b5f9bce8e34220f2620a36fe775ca199bd2b4fb6f1e7074e928889ccf9774f3f7b5550c668555b173a0f9b71926cd4b35985ed7ea095720b43" + } + ] + }, + { + "tgId": 50, + "tests": [ + { + "tcId": 1226, + "dkm": "e3df6887d5a3e8385b2dd1022eca395138231bcc8f19d847e1390d2c2a2b28e06f54cb66a23db0e018e1436cf3bbb1c52203bb929c405303342f9b59c6c4e0b1979ee76d981493485b1eca55b6080a5e193267a88448bf559efd938b22ad978fa090c4268c291cddcafbec7761540f794ef4b1d0910cc5cbbe9ffac2e62b5f45" + }, + { + "tcId": 1227, + "dkm": "db27dad60154316d377ef30aa187d6130e790b7ff0524ed2e780b365309449b1eda561e82b363eb35644b2ad755273d528f3e173397dc0ec7a027d7867f54f4558982a9c8d01d4102f20df6e37ca519a443c598d7cea5dbc89d0d4fff8ef178ffddc589c135af86bedd3f37aada6eab210c0a3bb75e1166be573945a84361d9d" + }, + { + "tcId": 1228, + "dkm": "98eb963dc3d4e8f36f4c61564a3e25dfbcad3a806e75dc34e4384006a145df1634525280532074917b1f51474b6700cc2d748367ecd4a5ebc5ccdcaf5368f37d3b854fea4a0f4a4a2ed87022e572200cc859feef3f8355658ec9f92d94fffef68e5a9063debb4015a8e8e53825edbff2824bbcda3ae36f2649c45366fe94cff5" + }, + { + "tcId": 1229, + "dkm": "35d213fef356d6bc245e6cd8c6ecce5754b05648a288c53ade42183d76f32d233de393fd5adbc7a980e188ec3e18185947a3d8dc153e8b0f73cb6152c9de0e31481477f97443b40a22918e899b87104ca27e41514d0db2be12d083e029927812df1d4a60881e627feed3305fdec584ca4f7b29ca429f6ca2289f872d38b8987b" + }, + { + "tcId": 1230, + "dkm": "c19765bf9eea0738e75c8ab6055dad628cb375c43e2eb02cbfab3b44ac7153cd772087e91d1273c34ed74d232a831ab7136ebe6719bb7164b177215686f3f2f1481d676fe5fd810a77c253b6aaa6b8ab917fdb3c50b86e88dec0d42d120005099a26208433296647df718efee47bce7399f433b03cc6e758e330e1652f95c10a" + }, + { + "tcId": 1231, + "dkm": "f4f328391af7fb90178bf51753a878ad3f421084933cc05211607bfe8e48a66f9fa7527cb05d5e4d9c05ce900e4bdb951d5781b1f5284d182c85fa5e785cf20d201175e0ec0ed5a39544d08099a6f7938339ed0addc80cf7e215b46e63c19ef2b84aff8fe646a108e22c9b4364131f02e0a06674627fc51ed9387c0ad60ac015" + }, + { + "tcId": 1232, + "dkm": "f095b0087f16d653657dc056c836fb1bc62d968a2c10bba9ea3c664340077ba22a6c43b0bb0b1ce2dc93034507b9107840da14e1c57d499f54ea6380f731e02611efce27f096b305b8424f1ac5e9150dc579c09d04555e6795826a239baa0a8467bd4e9f4dcea087d5eb09f148fe9a5d78c79d936a6faf68ffc4eb22834a5088" + }, + { + "tcId": 1233, + "dkm": "b263e9a1630f5e17b0453864fd74f2bdd7e253e765a89bc848944e818648d356e600780ca169dee008b69f107656ae1bb4f6df596b5a2e2a01aef6309f560508849b4e7caee846f4a48ef820e473a0e68f8e5b7b1006fb1ecbbf786b78c5fa2c54eb1d339f38397c8956b258eebf15759c3b3c428a4214e3bdb97ca4309b774c" + }, + { + "tcId": 1234, + "dkm": "cb27b9f665192e91f80af80fa648a62ed9ba7c3e5469b3e0811954e57dc9d6eac38d18fbb9436e5ef93e2316b216fb1f14871f019e1b6fa969f36201949386c53cc909b915951ef023b2837330b5c519e3eaa9b7a355c6db2ec78a0b16f0035dba4f10790e8395d90452fea03ea3f2f1cbb18f0b86189b832f4702d81f2cac94" + }, + { + "tcId": 1235, + "dkm": "6e2f277d1cd0d9a4d5fb3d051ea8aa0c79a42e3f1160cca66a31e287ec7aec4d3f0e4c393a170b045ef05cfb262f0d54e81dace2a765f5f43c1f97fbe0e48d3a95d2a345fa9ff0222f06e0dee082d28427b494a2720f579e06024783eea06080d12318bf62a6a555a22138defa9c337b3d928f321ce1e16ea2ee0acfececf2ab" + }, + { + "tcId": 1236, + "dkm": "fdf5b0692a15db16810078702a5171d0e743f8437aa2dec7943fee92c53cc6943bff39f82658dd7d7422ef53613ecd2b772efc49c80d61f19aa72fef82a1c9e3e1557f69ba104f275197db83b48958a0b1f26c8e7263a046dc70239f78ccfe1524715fa25242226cd1d754dc3270f6ce1ec08b4d67f614c037d7668f7f375942" + }, + { + "tcId": 1237, + "dkm": "d81e1f096c235e77b44fb472538bbf200cc83eeac135a91c635057f1a039ad616b5147ba45d78434c712b97f001c5badce21e5b78c3021c476c8c8ed91519923412e1835139a0ff9b9ce7d3ab82eb2acfa754fcd991379b96ab20e82ac0dc3bdc03a9ecf403f082c531fb53988a45694bd9190c90f405f89f8df592d42e431f7" + }, + { + "tcId": 1238, + "dkm": "f1ec66c72c059f57491918ec1447277d04329b68d861cdb962e116f455ee8b4950af37b34fcd31d5ade77037fc95a329242acca863e6c943c9bbd55a90796f2ba4afeff117fc945866a6e1b61ebf462e1f10cc07701c80455c62b9109eb8674954bac2be976a3ace4cb50c36f8ba07f648ba4345701cec2e66168eaf6b88a36b" + }, + { + "tcId": 1239, + "dkm": "33ffba33595ca0099b14703468ce56b78e27497a3ab71a867162a769b5fc563389379f22d7c52f5d60a5e9f5c58a9d58e13f279fe6afe7c1a34e698f7d41d22ce5221dd6a408314221c8d9dad636c1f764c0e38629f3ca424e70f28d2a931c5fbaa7ce3faf1420319ba0aa1ac137583cc818c9e5032cbd68bd84617a3e307828" + }, + { + "tcId": 1240, + "dkm": "fde9280a85b3785e4de5bb7a9ffe7dc65fa7de01feb8fc109a9e55d59157338ec2166c7c3ba6968733cbf472a78b613e51165f8fd99e7a7cb3187819deb8c4e9a7dc93fb3cf7cab1a844f8fccd3dde70929583918ae18cced965430edbbaa9f4502128e779f7580d40dadf04e242481d03a421ff84abf810f0e3b0727a20ce0d" + }, + { + "tcId": 1241, + "dkm": "6128e16d0c184e6c840ea578cde031dfd494e08540a65a2c171a544380a63c8a3b95a9367b0498d9049a9128552e888a9bf0cb241d2d8c6d50df82a443383965a942cc67d85c148aee7bc8b6cef6b9a6885705450de2f0d0e060fd6a3b25667a817fabda11342e9f3dfb424908f0cc60ff90c4605e831726ee04236490a24337" + }, + { + "tcId": 1242, + "dkm": "b6ca26618079773a3780c9debac988499532c990c046fc69c78473f6263f857631fdb999c33c32ddc51bb1398b083961a723bd16fd3bcb2986c0448dfdf357ee43fde717dc2724172a78a8e64c221e9c7979e7cf2a029d09b2224c8d5a5a5be508bd0d7cf4a61750273e5259be49a085e2f3ef9b7c3f00ed86affebb8846a6a7" + }, + { + "tcId": 1243, + "dkm": "8c44c8ec77ffd41234595c3bd92b8197aa35d0f64c767b7963cfba4abe8d02408e992d9c77d250e952a38adbfab718558a21c4cd69a384175b1179b4106187c525e973488af39537af9f205d3d5c7c9818b7100d03f2c2db261c96bda081ef08b7a5fbab8fa6fa293996064cf5396bfecc2e11eb875a2f163b1bec2a5aea08a8" + }, + { + "tcId": 1244, + "dkm": "1bcdf361b8b50f8f797a8cb24e572dfd04e6b3a413139caf94489c6d2d9194480dccf3a2080bd4bae1d8701840889f02e16ef2509dc795041c0a2bd3e6521d7a9ef0daf208cab0452d6046b8ad888821eacc62fad9071558799c8dba27de0880d18b77a0aad42b6bdc8045ff3d893334f9eeecb02aa40aa659093441b2d74650" + }, + { + "tcId": 1245, + "dkm": "ddb1a8796f67366a6ad73ba157b8d9af4666b122905f0aeda649e8f7bd63d0f32fd4d5775f0c4217f07934a2988109980a23d5488d8d21823692896d88315cd55fb6a6405fb2c6ae5069d93d3697764f1d59e6bbb3ea25f017f865f33d49a275c815fcdb2573425492dffdf25afc26461c2d120558e285baa0dab0f57a18a790" + }, + { + "tcId": 1246, + "dkm": "2787353cf561fdda2f05a551c7caaac7f278a26d963f1a85808df105b2ae6cf049664d024dce777e42d7b42d26262263859f240536618ab580877243159da48f4b807aea5aeb56e2761a8732295410bde65b868810724b66217298e11f50162403ab22952fed3f8b6fc58da03eb6f94a5eabb3a8b5ad2461c773e8ddda332e68" + }, + { + "tcId": 1247, + "dkm": "d24692db92a3c1b4f3c3994907058aeadf5f53e94f40cb9af541e95f632bbc90b97e2077ee50d51aba1fda65fc03873e4d93717a4f3d3fbf19efa3bc98474cb7e163a8c9d96d6a9b96d2f84b53cab87ae60fff0b3f425595930a42c6229fe0afc621fc35ae01affb9bcefd5be07ce32fedb466396db01f1bdbf187b7aafd0789" + }, + { + "tcId": 1248, + "dkm": "6b14c9accdd7be0dcd4018ebea3f73c5d18bd89c1e1c594a62f39a8ec03c4ff37be18c066f05d2d1f10168ea61de89060d78d6208033c044313524eee758aabcad0dfea0d951b0da8f577851b4abbb9e7a5219925a0f5ed32eb1cf5ce4f3ca3557eeafef71a5f30365cd7698ddec1836e2e62921939f35cde5215cb605501bb0" + }, + { + "tcId": 1249, + "dkm": "0f71fb0857f89e6bab68a73574b39529c9b43757a10891ccecfe6b2ce66d156724be85d589dae43ce57021804df8058b2cf8a09aac0595a88a138182833d7c5399033386558ee717142ab1c214ed378b914b50bc629b53e7dc195c2532ebf5aa3b814a476f093110bfc16a8cee0fb15db13c22d1c0da880c01581dffc28d70ac" + }, + { + "tcId": 1250, + "dkm": "89caa3d7595dc94dfb869f9279b3250278e220a7a43ad5740582d7cd978be18d87c09a3e2e496b95e283e1802adc0926ac6a3ece09857f35ed886215abf0e37a9f4552757862182fbd3d112948d5fc09257cc90baabb6f2d55341057745218ceee69e893e62465204ffb40fdb1d58c410afd1d5cdab0b330a5fae3d694223b64" + } + ] + }, + { + "tgId": 51, + "tests": [ + { + "tcId": 1251, + "dkm": "d9aaf9a9301f3176b003885533713372257ecb139832254ee875bf2fa83f1050a03194315666910b08b7eaefcddafe6ac5f0558b67ea42a56ccd1f7aea7173015aa08a79f58375e22fc8949061a6b36bd642152e9619affa8618b4abc122a94f49cc7eee8befa79d5035ce3855f85c56086eb64514a017c424f2a27a7c8a87d4" + }, + { + "tcId": 1252, + "dkm": "f9edb14ee04111c33a19de529b76b231cea104ceb402455ec3311f9989f03baf0ea8ea66150731b1b49c1b51530374976ab6c03d14b97215dccc310cfffbf5ae71bcab59ff6889230eb1dbddb96dd66921161f37da667b68eeff5d785bbc14b09bbbfa1b77c8d1ad81d5b0c9197ed0bfb116af6766016db11a3cc86fdc140e91" + }, + { + "tcId": 1253, + "dkm": "62e6d610cf61365aa6ce748ff33d3e488ced5306eb7a99fe52f2061f8d249914176c2d577b39e10dc3ac5eea3251285a54aef7db0395445246a2e50b8df9aa6beb541d5e382460d5bb790da77cca3062f6852c7bf518f22a7090562b5cb4eb66b025c20f306887d84cb092650bca891a20202c930e76149c61f143bb0c9c05a4" + }, + { + "tcId": 1254, + "dkm": "ec36242f9bde87946dab50cea6063a844eabd59b44148aeef24174a8cf342144fd62ac570a2b24f227eb3da50e64c907b4c6a1c3257aeb79ef7ad433287e8a6bd3b5f102f5ee8fafc07cceaaf2e5d5f5402ba8aa2c265aed7c30061c929b21fd792308ce51bb92501c6a1413c7c4b2517d58ab2341cca518bec30616706d729b" + }, + { + "tcId": 1255, + "dkm": "dd0438ffaf1003c69fa5463cf9039372b4b4bf259c5d408f9bc9b76622dee7bccaf3f733393a8cef3a7152ab0cddf75345ef984f23ebdd2026befdd5f0356f0270677ea7593ace0b9ce8d847427e250b7f7a4b64de9e4930999a8ae2c2f6953ab70e6839b971672271ce0c0ba139617082d90c829b5b1a79edab92ce4f6b01b4" + }, + { + "tcId": 1256, + "dkm": "877c5601e419561c00667513b29e4c03de07e43db71a091abc058010abec341ef69a565f97042fe00bfe79fb2866bdb168edd2d25c4ca8778149a693fa588220989408e4ada5ffa29caec45a65271c73e4db0a6dae673f288f1074b73036b2a882bf6890554da52ad5a202e32aacfe8d3999afdd4f05611aa9f44b447e46048a" + }, + { + "tcId": 1257, + "dkm": "5882cee4f4a6c792db5588cf5c0391462891d80a752c804d6455042abb1744b2178175546c1fc6a6b74dc6e2b68786bcb4d8b2b89ef4bf0637fc4518aa90bb7ee004bd32c8abadcde1530699aadc6f43038c03dce9d0c004598b0c36aa8365eca22aed11ceb8ff846f540130dd748de3c719b2e45224f5390d3f2e14517c2b16" + }, + { + "tcId": 1258, + "dkm": "9a3f0c2c4afc0875e6015cc7ec5b4bc657900fde6a671b605422a5ccb0062e65301040f8443a755d04d9068139a341cda0161215592c1806d7c3b111048f6636a1db4f78cf2f6791f6851228b5abef531bf6fd0b29031a00fd6f559848730c4b7db8459b6b55eb0c0c59a6f15a4ec79f0b75fd0512db73637f4a04726d604c42" + }, + { + "tcId": 1259, + "dkm": "6e1c5ec940e3439673bfdd40b24a125faf2de71230952600cd0c82a0d7e5a26a2d923d80c1263a68aedbb9d80732bb8c206bd3ad8920c75d7aca5aae343f2365a8b65e41e224efabed8346c4b9a0889e8264711c4651cb8675ae46b37cb63882cf32fd2c7c4b9f419ab58f9304ed0cd99a6674b6d9b9d3f13beb54ab1ed04bae" + }, + { + "tcId": 1260, + "dkm": "994d8a6279ef9c3887a0afb2ccd49e1934743381caa6561faffe083108283de93fab5d6919caa6bb67c8f1e360847c67ffedc5eff8cc4703257332368c0fb4282c2fd6066a13d3379213dbcf02df8755be9aae3afe7a495f1b1771bd8bb54884175408a9d855757ca3d468cf1c8543f417ed45169d5313175c94cdcc15c3be6a" + }, + { + "tcId": 1261, + "dkm": "801a48ab5fdcf35c82d85d0c79791cc366c83e133b2dbef644912bc194a6d587d4a1811e7c9c52e1affdc8a9e269ee1a30ab8c8b7e54b7cd4eba533b46ebeacf2fc9087a1c4277d90f5939cf4f9b056303a541365464d010c38f92920fd1d7eff403f64e784d4804d0ee9b9e5927a6c83aff8c36e730964fb7d9a27979c8ac0d" + }, + { + "tcId": 1262, + "dkm": "a47d59197d7ed14f0d5bd624cb374997519fae50b22b9a181fba46f1a8af9dcc2293144b037da74fea7ebb397a502bd59e85ba130fda4c8e520bb2439c17786e45a1b2afb290f16ae26d6b07703f7c1aa32987930af6648135bc166f44a17360905782840cd08f6fffb35404017f089a887cfd954d515967c5144a0d36518b07" + }, + { + "tcId": 1263, + "dkm": "eb9256d478ea4036d55f5e9ba25267d45f4d9a2b3d84d8536426a0baf4a58ebff20b2c7ac6e954cd7cf68b509e69fb8e66e11796a21f71c180b51073b71ca0f6f8758d84933a97a2778200332fc76d7d10c697d4b043f18a43f4ebad974ea72fb021e6d2426f864abd7e428f2a7914f893f4015878e47fc81fc3277a79488d50" + }, + { + "tcId": 1264, + "dkm": "e4c148f3e1fd62e3e360f447731183871d5a340388f4a4aaf4503407f11e576eefa304ceeeb66fef03a512df431271c3cd136990b61db83dccbb734f1cb8f9d6c53a4af50913011d7374d6f420b3ace4177de1a62233b373d7fbbc7e0682aee9e5238c84ccfd212f9e36ebc33abf9ffecf8cdd6f7df0a5b5fb6475c2fe9bedb0" + }, + { + "tcId": 1265, + "dkm": "699d5832871903fd643921ad4f1b97b4d4d35781f33fde0b08b89f451892b98532d524dc4acb0d0d28143ed25bd77fff203980bac95b1aea81efc00cb9153bc520381f3da71ba74df813878c77b3785e878edf7fb993895e6571ddf4215c9d15f51d5762f7380b79741d1c30164139439288ed3c0921d8f401568c285d0fa6c1" + }, + { + "tcId": 1266, + "dkm": "4b87b845cf145cf15c545565615d7e562268c346ab90c746e53a6563b89d1f737de7e8e9c4d2b388a4a5a6e1645002782623b738ade72c6bcb14aefc24cac3bb5c7ae185ffe8d075f845b612ad468d8acbb7648c42d3d4089163da4932a9d731e1b6dda79141010b99419cee215b2aec01198ddb8ef42f56c793c97dae3558d2" + }, + { + "tcId": 1267, + "dkm": "554e90165f02a73c311025bf23eb400e24a75c374a410ecdcc0c048fc02e41f5c2e09ff61bf099078e56ba05c2be64be91e34d5b24968317e7f41c86624083f9dac789617921d8c74bb9eaba5ac5374519cf9e3ac1c28879fa47aea63311f4a00b3d4ddec243f66ec4f937f83e1c4ff4aab5328e00a3c026b00427eed88b533b" + }, + { + "tcId": 1268, + "dkm": "38c6ebdfbd2416326b9496502ab0ff4024e04b9ed92130b59275c574483cb0590246b670c3ea672740d1345ccac963ed69bc9f2475d7a44a12e1b0dc238e7c4df51795f396f361d9943e6cd580a919a4cf2ff8742b2b3ff9e0ceb4adecc3d3902fe230c2823328c31cf9ddfc9f5ce8b4627f80d7079bd1673a80b30d068a96f1" + }, + { + "tcId": 1269, + "dkm": "233d5615e9e25e3505395dd1597fd145bbe2be76dd5aff519d2ce04a2ec27973fa4be2f100a157bcfab88c17b6394ba12c93160218ba6a33e7d43d8b3ef00235c72621b31a9179ccfd345ed509603135726ce1e773e238b97c7e65432bce527d878f5abf4b071b7a330aca8a5e7f3a8d86f1fcc0fa3d2c8b8e2aa599a1713514" + }, + { + "tcId": 1270, + "dkm": "3b1183bfd96a0f9d766d0558be4f5c803296b59673f3dc384aa0d55a841b7076d28a660c00ecea0bc55cacc47fc4165d18c38163099eb995cda304f5992ff9543630f3781bf3dc4ff92c145d1799ce99ad45431082df534adbf9b352a5cee1b7b18c0d054aac0588874663bbc51f069a85547d8376ebddb451efd58ed7552f5f" + }, + { + "tcId": 1271, + "dkm": "97e65732a056caf39ab23f49418b244d8eac6b99f842fcccec17b3060ff113ec492e32ad208a1974253c66b92d6d4ebc3adc78fa0c976b98b39c71766ff0ef024dde9023815bddcb03cd2052f9fd30ec895108a377c70b45299d966bc70416768ef3e531b2577732ddfd19e3f7a1f7858c0526555387a8c72fde427b95498eb9" + }, + { + "tcId": 1272, + "dkm": "a155050404413a177af2929dbdd66d9a8a334021502c786145f3ccacc65d3842008abe0019e2de456456005365be7c1f17347be970e30749a10dee4d1d41a98081fa2b0b38c4e6301aef4040f815dd6c805a29973e646b3345ce1fe421735a08845be92809d23edeef7e8684c5f6efc237731d06ac5f4bc3d9d92da96f76f099" + }, + { + "tcId": 1273, + "dkm": "70d33642eb2a248ca38b5fdcfb18fe1cad1f36ca8f73523fcd4876b9ee4505a5067bdcf8fd160d62c7274b0511b98e6b3d62b98c1800bb39d3bfbdf2f505ed070fa1835e395cbf91224095cb836f3b5f686b4dbc08d34b39c566d154da0942689b2c528b08d47c3c16fcd4a984e9a1e70d5a9a6b4b19be21fca652fc17cd2e17" + }, + { + "tcId": 1274, + "dkm": "0d4c9ec4f2c86eb85cb52620fa1b9ab7ce3aa224400a04128820065b47ce44e568f44a94d43db0b1434baa239d8df0a2d767a708a0f8b39a2e0486f229f92a6ba05f006f167998cd209813e43750546524831540e2809056461fb78ec48a0ca2dc4e441784e42d274bffd2e2432a229cda70892c6e808b40ca1da3994c0667c8" + }, + { + "tcId": 1275, + "dkm": "00e3dfde6ce9e5074f079c2863cbe6c080b74cd5d3298e84f8390c741232e8f3c45005286588914b708164e469bae3c29d866ab98fa32870117c027f05d275fe51c9b2abd70f1c20aeb95ad351428f2ec1b67013ffb0f81968d8629c29a6c0a6065dbe99d75a061dba4f3ecbd516582f1547b55b99e92a105d23da0a741aa12b" + } + ] + }, + { + "tgId": 52, + "tests": [ + { + "tcId": 1276, + "dkm": "7e82cbd62364e81bb3a6841e76d2487e604001ff598fa76fb7cb6a0d4e7c1cf6c69c45f00d844445c19bb053acfa982a20cad062406c9359f178d5b197cdb845298bd577a34b26162705508942f8b6bd6627ad6cad96ac3005365999e016df02f81b25b987a54151f32a035e346e3830a4073312edf10a4c3c6bc6dc917d0a97" + }, + { + "tcId": 1277, + "dkm": "a94f08ad67c3229191d370964f02881a9e0fd0696e6684d097fedd3b1d0d6b671b54cde0969557449c9f53580a43c0e7c7dd61b2a0cea1492cfda4b96b705d36b5ddc1eb6e00f254dbd65d66e73586388e7498e42df2f1140ca7c7af882ba5efd79ed0b218c1efa63c4b9ad6d527d4f7ac4c7a12d4316ac3e7b1b9db170b4f1d" + }, + { + "tcId": 1278, + "dkm": "04964a940498c6bde59d7b86ea1e33a38dbc6642d044706316822a1f4bbaac141ad64535bc5be65f52dda9ff992ac2ee0f62508bb5fa87231b8a95c0d555f492f10d03118f8213148ce34f1160a667165b7f88f9f63840c9e4092d3bb8b66fecb41748fe7da33f8e9408e55b46447d6f3e1239775cf76881c1b6f826b66c1c2a" + }, + { + "tcId": 1279, + "dkm": "7615f5a63f340e09a756028347eed20621753fa2df60fa87f2c6a55204b0a4ad18d106dc68dc6340299e4eeccf90de1d816c0fe12dea8960f0d372538b8d7779cadd48efb81a7fd7ca137f16af2e73705b4844b6a1ba500445b366995c29e2f0ce4c9cbb6d4025b7b2cffe453f2d98f0bf7988ad08c587606b47bbea1c36bc43" + }, + { + "tcId": 1280, + "dkm": "0858da5b7b253bf60a8fccf6dc529cf35a197c27117bc2b756a53786f9bab298f857d71c91b63e4c4e9c5ebc9c826badc52ac2ba5ca68fa13721c6fece1450a4bdf82e8fdd2ee752add12a105fa7a30e25b8716c73000a70ddc26d13e98eca6d5cd3e3c4377ff98a1505d1e880c7f9944c36cca6ddf12786ebf800402486232e" + }, + { + "tcId": 1281, + "dkm": "dbeb922cc833e01ecb117af7c62bb478bbf6700670c5c87866f2b756573e5adb03c92050eb182e4befd27ddaf299bf1d1343d09816571aae27ee87cb1e9588da0dc67091aa1351f2079a59e695799c5ce3120a9d4508546b16cd99c8b7039dcd200a5c357d8f2ef0c509ce6489cc60660894c54aef9f8b0945b264c274415d5b" + }, + { + "tcId": 1282, + "dkm": "cc4f057cbc53a568d002ed0f23f57fd4373e3bd18397b59a4653bc00907c5c5e508c0786bd5be54cb5f37fcb5305dd73377b5185c43430b43bec36dbd3acbe3c6d8cc1a26a38534ed793eb4e3aa2ec709218ab00ac88e33110d6f7866e05553575489d987b2d41ac9767265f515908763507e76b8b8be3364cd21ec3832d651e" + }, + { + "tcId": 1283, + "dkm": "b8a780109818650741d8340ff8c2e77c3e6fe999b8e7ba95945fbe1183aadf3824b0ee1cb206809167f9d3219387fb5bf78dea442c018194dfbe6942ddb1b895180bc787006fde198edb9a1aa8020fa9d413b3306a9afce7d2a467ab73558de566793f3b31673fa555b9a98d840fe0ca06874b4d1420bf9e77d837e25efdbc81" + }, + { + "tcId": 1284, + "dkm": "b6625683231fc3e943d9d35670aacd650c273d3c0cda2184a5fd7483cccf31988197140dd68a520893dc9eb340e47d29c8ccd1a650830b9e65cd8bf7e05fb9f003a8b69e696515614087869c40ba236eed2a63dc34e2b6c64712e3efef1b65efc800c898275a3534b7cb81d1eeadaff53de6335803b4226cb987c55da2fd758b" + }, + { + "tcId": 1285, + "dkm": "40841b0ff7d59bdf7ad004eb7c15130a821151b17dee08c4158cb06fac5de530489dd8a95f4e5a1d8c6466fc8cef7513219f5f6ee96f2fc53b682c06bf2521cc390712bb20529a8451935841e9e35ba4f7f0db952f0dfbd50f82353e263d73a41d99fda5ccc0caf49a023a995beb825a7d6247fffe77f3cc4deef8072b04e202" + }, + { + "tcId": 1286, + "dkm": "60decf0c10446f500b9748cf74bab9f1608c9b0263625107f93f6750ab359494f7bf53aeb324813a4b69695bd939766fbfaa48a101aae3a0090f5ef58ae3fbef5ca3c3992804433346f737b760751379f96e56a7ffeb598fbb8a5a59edb510d50efca421817249ce4146c8d614c2e436106105bfc9d9ea2049c9c0b6134b91b1" + }, + { + "tcId": 1287, + "dkm": "88324c6f0315d1508c7a92b8cc4f72e5861d4238254b6af13128f571c53d5e26dabd10a08c804eafac60aa649b077ce44c7b0950e7b02d9517cdaadd9fd3e6d4d92f7e090780ae910dc2443fd6bf58f10056d0badb90fc169453d302717d3f486efd2b5eabb49f3372e146b0dfb8a5792f6c599e91a0694357478dca4326e0d5" + }, + { + "tcId": 1288, + "dkm": "015190f694801470644b51aa58b623cf760baf2678c485acbf087400b892e2440e6a0fd5a73bad8f27067dbf0fb3fb9e48967f77cf54ad68c8136565e92df82ceebedb61a4fbe154329fc941a7888964cdf3bbe28183a92b68aed91d0d68dc433797bb28edb2406dba98c5a3ad3b174ad1df3b0c7a5e8b5e23db7e084d92fca0" + }, + { + "tcId": 1289, + "dkm": "a01b513fdfe253dfae82363ab87db036cb947af8d226c0ba6459c40801c6f3d63fb193908a90a54adc6dc980bbecd3de8ed0ae9fae1bbe8b37f1d94a25275f0a8714fe3224cae00e0a257c59d45476d21b92a8b8ede4cb5e48eeb038cad0be188dd7d33325e99fb5c2c20237187d316a032e548acb2bcac952d78fd281210cb9" + }, + { + "tcId": 1290, + "dkm": "fe7a6d87cd989e00d600d0d75e23d5d3b9e11b6db4603795c707a2bb8c01231a996c41780c195dc9edae998390077357e8edc9e9e4cd7c4e0d4d392edce69750f4b54dad2e21d4400e373d230300b141479d32af7045df6a8791796b5f838ae4ce0aecb5c75664031627aba43e3a099a2779423f6490a2fd84a87cebccaf5926" + }, + { + "tcId": 1291, + "dkm": "1f633f9ba332e4586e15ec98bfa26cb5557e6b8ac7a28958e20cbcad91acc196f042d63b1b89a98ec0acd3ebfe892fa88749e4cc02489028e0b642fa396f8d44e981f00328e7587bd47a0efb2be4ace260ba911e434fee6a2682d7f44eca2e46c6f0d8f5c087be43d942f3db41e25a5a1fc9d56a6e285989571270bd443b91b1" + }, + { + "tcId": 1292, + "dkm": "c5e55bc112c184df6008ebafe74d33d8cf9bbe1a3a6f7afcf953da6dd8c3a9f1fa3fcdd13ca39c86b3c7df6599044127da15ebde501c8220ceddf46739520b55999e141b3b53199784482c4537f8ffac0a3d35567e43dc8f79f4c8d30523291a49700b9e92b45236aaff0dc501a2407d341105ab514d27135b9864f8c919b1a5" + }, + { + "tcId": 1293, + "dkm": "710de92ea2154a91b69935a130ce452e2bd62bc9651b455079c9374bf1b24aae6751ab328347e2e9481ef1ec2979d9e8f50d0c852b089cbb06863bdf5d4aa4b6e949b0807bbf494291c2cdd330808463c3be60dc6a6fafac9bd8a073d5d3f421f738d27c7014ffa0755dff682ac4a46e20d690a51ed68be4c4027e406fa2f5f8" + }, + { + "tcId": 1294, + "dkm": "dd15964c63873f90f5956c37a154c06cd43f7a15fb79ab1178a9907a827973cb224b302d6c38541c800622a12955fcbea5bec814024e5e14c4b2ff4f8225dacd0c12f5bee08843db4ccb5bea3c48f61a0639fe3fce95560ec5f013155b763464d4b563bd0df40bce51125cbf0db83b6ea80867f4ab44b8f292f72062f6214dbb" + }, + { + "tcId": 1295, + "dkm": "27ddefcf9c6616eba688ffc01ab66f0713630e5f4133f11c41c4e6821cd4b146bbda783fbc05ded49467fcb4ecd29c6f1b3433cc16f6ded04c19103f8565abf019e107d74a8c2012418aa8384fb7a9e55e37681720c293faea7f42b38e9ae7d0905fe8cecd2649741e20445695eeab680a11a44fa1fa7d991c9414181ebdafbc" + }, + { + "tcId": 1296, + "dkm": "51b927b599a88276e1de777ca035e81135a1d5ffa017e72292b2fd38d090839bf7aa87854f4a52b7b4819ef9dda1d3d1be43d1d7b04214d8f2552a803c6b8e0a6044a203185742111ef2fee0e0e12f96332c2ffbaf82e07128cb91d1f6a1551c21fff0710f833de2f1fa58f428b339875f67c0e0fff02bb9c4c3a462e0bd8c85" + }, + { + "tcId": 1297, + "dkm": "0161bab6d92acce42dd5cca1d309bd3cf742c46e3f5d25954973946044090478f6924929fe55ff6dbc6831a965365c564348e4049ef1fec772b327576a0cd0d883e0f740559cfc844ee8cfe046b51deb263d247b354190ced1aae443d0864b149dea1459b2fcdb6d1ac40837769bab7c4ffb9ca1f7d6c512f61efbd3efab0c2f" + }, + { + "tcId": 1298, + "dkm": "8e1aa27d60f927157ca930c952ec200e1742adbb653d4f3a486f5b511dde673b1b8deaf506f2345e5b169742b9a83993a403f974a3380469c8f71712d70e0c767c7a9c4443607d30d2b87e8cd9c76248005eeaeb3ebe06a8b42e8579814a9cf9d6375ceead2ec7a520a85292fd30baff6df74c5c3a4506baa8bb41d586c38f3b" + }, + { + "tcId": 1299, + "dkm": "689f5c24b0227e94536bee9b85ced68c5c6295fb0b270261ce477277efc675862d7126f0e85e396a4f8e1128296dc2359c1c79636422eb1e2374e9f67e8e3cf2b2646e354d011f2d3f1bf6fb75c7ae99b725f34eae73355cf15e8ac227bcf1dbdce52c7404eaff2627ea43f2cf0365758bf498f774193f88b695d3179721e071" + }, + { + "tcId": 1300, + "dkm": "2496ed85c0772fa181ac6cbd3eee4fb9184054b337e41c5932703a5e55f57e890f05d1924a02986cc7ac0201a34fb0e8800c2daa786dc2c74eb3166ab8251d41eb5aa2f0b9e17900778d382aa3b7a042453571ba11e3bc6b76a39747a567b5690706c355cb69ca17a378cdcdd6bf0605212f0e948545d9ec2f308c9e81718729" + } + ] + }, + { + "tgId": 53, + "tests": [ + { + "tcId": 1301, + "dkm": "f1498e47e10e1c2972c040572de8900577b100fb52e8d79f523db7c06778b8435842ee1ab4f040c5ce024c4679c9aa22d9634909cfa3def9de7923c43811d53063c7b3f76b76b65b1d72c11432a092122195aad6f604fd56655b05f6f817f8a4e40da163dace9b20ddc0881f868823e9b3a13286bfe4388ebca81a93909c13b9" + }, + { + "tcId": 1302, + "dkm": "e9e64ea9f4acd8bff42d3fc9e073bd817d0f134f6e67ed182541d8523037abf25dba9176b670012cf94d5224e5a1ee457020118f190ae7a267d48f887d4f104ddc3f6352f4365d4e6c38ce5f8a9a6fff3270d51e64039519ea8c8299cbaf4f9e759ef4cff408b4da3fe6d7933baeb70c3bd04f31c4d24d4e8a7803492c505dfa" + }, + { + "tcId": 1303, + "dkm": "93d81eb84cd76380ceb6d04db9c33a554338146803edd96ad5396ea91ac1d4586abdcd7eda3987344efe9c7fa48430b0f6332be5ed75be6f5118c2846d81afb4c2b6c098a9c28a91295d7201b51d626e76bc3b6616827b50c44da5cc383cad2eedbe990795158741bd1c68b83573ff5371ffb90c94950e0389fe9d6a49761d64" + }, + { + "tcId": 1304, + "dkm": "bc03fbda8507d52e44c097ee24b25b7d281638c144665eb51e4fe815d61daf5393aadf350d696d2f1d3bf0d056d34e8f0958524e08b6c41b611a629b9a4db9a8e1b694bc88044b10d25fc852d5364f6ecf9161b0becd2fd36f2e16be3fb1610fc7572fd06f3ec47f1d9efd03f6ba966cef75a6d9bbaa2a4c1ecdfebe7682cb84" + }, + { + "tcId": 1305, + "dkm": "965a84c7b5a9d0eb82b17991d38c14e73b70c6c008fbf76168cbb28927c74fa6d53e2f9295bd37c7842ed02d01dcf87aa87953ecc35f92578646f3a2140c439b356b7d36febbf000c8a0ad2b510696f75efef996a60294cf15f2f570bdbfc81491cd9c329d6fc1a299bd639ff07abc4c39414d1ac9586227ffa053f683e9c289" + }, + { + "tcId": 1306, + "dkm": "7c8a3d431e490a6d71957213f2853a44868bb27ebd4d2da8a406715a070c8efdd534b5a3719872c76bee96abdd012c87dd6202cf3126df97cce825d32994949830b77afa39897c660d7cb29473d9978d38b7e44d8151acc930f26fd22b1e5fb6cc60d0e9673e5a6d7992ba17dc05f473520b354e050f2cdf617f8f23af108b69" + }, + { + "tcId": 1307, + "dkm": "d4cb1eeb8ddf627d4f43d5960ad8b97b78e468872e46ed8a01534e855ec9550257cf6dbbcb0e06b6ae204cf0e8729ff09547cd64cd0d869f3551bbf02e5d57e44b051262cffcfafe5f84430d99886d1a90ea8d0369effbeba3b90b2ef41c2bc339617da25bc162363e9e7f9e3ce6ac37c2020fdb2e206b8e15548953ab79b452" + }, + { + "tcId": 1308, + "dkm": "8e6c1a69af56fb7c33e7bfc2bcee2c9b8c58f94994a8260cc15a0f78a460f811e8705045f01f813832d782de8e35256b4f4d8d1a38ac1eb7e884bd2905515240bf26ca317993cea4ffaab158ea7a07a76a61787ddd66c4c88923b037f52a34aff892f472a1b71cb7eabc747c23ba02949925ffa8613d5c08adb754345ba29cf9" + }, + { + "tcId": 1309, + "dkm": "c05d38d2b7b88b27c35e8270015481f6d82cf0340a180c67ab5bf3356f634fe67ec2ccace47e5ddd6315f0957448bfe94cd3025a32adba3a1c6e0f3798ea8d7345f3b4331f5d6be9670756a27e1e134794d86b1940d2460036a8b39362b1ee523b271040ff6024da9b5101c979d038b8e8db3faf2b938124174bab3aee34f021" + }, + { + "tcId": 1310, + "dkm": "dc7a5169739e5331045d109332de1a945732c0b5eb4071e8de65f93bb6f5c6fafdb1ac524d9d2b90047bfbf59babac2202f1a6659c025992657f1a442eb0a9e5b48404f3273686a0f60d1316a8c5e50fffa47796c0d970abc6f2433b2763bba34cb67678b389e56d4210c22259737bce23b2d525bad313555a6a2f6cc85e2760" + }, + { + "tcId": 1311, + "dkm": "ebebe550e49171161fb14f1ca27641e3a6b8cf489cb4fcce60eb13330bb5b559857ea38edd7d2edf11b440619658e9b366c7963370f87991266f6f1338cf642a479e687605b2eed78829c2dc28bbd1d77dc500031fde37ebfdc130ebc6d4288e3e131dc0870891c87281c0eeca9d881d083b97a76749befac9f5c499774ee357" + }, + { + "tcId": 1312, + "dkm": "dcc573970f81fc7453948f2d2ce178580bfdd34d44f28b59161413d90a427ec8e4a186635e738e048e4445196ad0e6fe9f7c284efaeab0a20b0fab1fbc10ac48e5764608a630d6532a3f9395c7c50bb19b05324baf3ef1efdd8db94229ada02717967e793b9b52d573a3bad88d8c37c507c8be9d5595891590735b94e611cf50" + }, + { + "tcId": 1313, + "dkm": "c094e37cbf9f69fb980b8926b46a355b3e2f5f0e8dc93e612e88d4202e490cbc37a0f7d9b4d0f846cc362509d298f5f91fdb975ba9ae658a411ed77843151e832862ad0cc3cb35712932ada28dffbb18465e093a3fc923226d9b35565cf0f4981f09246a0e2990a1c93409e975d52a7ccaa2065e94554bd39723086e36a8be7e" + }, + { + "tcId": 1314, + "dkm": "053a2bd0a768bf8814b66617b49a6a5d6f73143e78f10ebc916100765744379336dfad85a462aeece50c95d7fe51bacce5a5ad25edb408228e478b9427e4519d88ad78120d2ae6a88be913fd68c6b92defd73e38cfd35f36446bb5627c6ddb83532e035bd1912b25b9d0b82165f553c71106ad5d985bb8677568060a9ae88d12" + }, + { + "tcId": 1315, + "dkm": "f8a6c65e528c74ea41f143b9ec8b0b94c5a573f19ebf0bd537789c2190c72981d2a9894aaf150f2709a6c901e983ae652e7fa5a03725f8e51c42d41c085e0ec408ee1c28c3c97bb0b05096e5802a559cf64811e1163646261b795593c2698b87e9eca5340d236041e7d7a389921664454e28d2ad5e299b55e1bd133e15a97646" + }, + { + "tcId": 1316, + "dkm": "9938a242c8e258cdfdfba26ace1bd109d12cef7216a3b730350293d17a035edf22927d616fd6239b4d05b9eda865b2dab5db19e254f1d782212138b15b7e3fb33a3df98602e2245bdc8866131bec4ccf7840df8003b1010c5c3809c4367eb0d64c9913809aa8db7cc5656eef6117629d7433823a0a23c4099d0458c0d65f19d2" + }, + { + "tcId": 1317, + "dkm": "244e2605c1ce9431ada6c74d4211aa37814e36509f7a6f21b85f0c13715ac021412bde6cf381cd9a4f7edd6ead53e3150225d38a47fb097c7c056f7fc71c4f2f8bb8c3690375825db4038b8632d0c529b338c4e30ad5650143c4a7a1d5bb5392a8db3fa532fb7167b6d79ccbd9b96d47b222276288016f96796d28dd0666fdf1" + }, + { + "tcId": 1318, + "dkm": "9ef1113b08cf858ca8e50bd071f2db6d810e7d87ac9f203cff6701b28d521df3046f3bf476e56a94512a9fe04b628dbbabca4ab99119bc4de6ed3b5a1821e46bb3ce4805403197246203c996f996c66b231c00f30c33d041d508664d23530ca02bd7517b9727c171567cb3db073526c680a2299d2e679f65c59061dafa0844a8" + }, + { + "tcId": 1319, + "dkm": "59ff876b14b4a8ac9ba6303c9b62cbf48ce9c5f9cbe79fb4683919a44ab60d02d1053f8899109dff200a06d40c5c2bd88995b6459356ebc3851c886eceeac6dcf2426cb725d9da0e78f3df31325cf8bfd689d996c2020f9fc0d447f7d80cce8762cc6d14ee64ef5b790cfaf5ff2fad79bf27a63502fb23524e92f04673f51ed9" + }, + { + "tcId": 1320, + "dkm": "57a3dc95e1ead0ab1f1ea669026c8a6cc1def7c19f121bc9f334d8b2a71392b440dd738d383ae40b73408f5bc36bfef9de67916fba6f686e5f6832e1ac777cc47a1389e13916c6fff5ecc909930040ea76f925496550c661f6e15a7f551268082c2ee1240db984b5e7cae74383e448093d03d0a7c0d3dd1bc0ebc05b32b40387" + }, + { + "tcId": 1321, + "dkm": "ca567ff295411ae9269408c98381f47f4f826c65fecb7efd7088577e7de1abc804673ce33994cc81405fce3f224eca036e2ed926b5dbfeff916b5caf74fa8cb075cf703514c084af0a9a3e0f837ed3d869bee726d04053f9ac9ae439c90f8d81b7350eb89c39dcc4ed04492139e881efc2c887ed4f514809432a60593ead482c" + }, + { + "tcId": 1322, + "dkm": "75b0cbad0f7567ae54e113910fbb0b90cd8c3447efffa535d3a2e1573752999907c9e9ad75523ee5b17b1dd8c400a0bde7ed76f26df156eaf0b3d7509841831025cf3ea255ffa5dd57ca6b414eab1737a210f0271d5805b15d66a9c96ff2f104dcdd7dbe449ea2f6675269eed1fcf31c1b225e6ff4e1b88711d937f5cb987da4" + }, + { + "tcId": 1323, + "dkm": "ce1f6b08c240254ad476d2207167cdf1a157b7d6c628594fd5b7ac4e059fc059411a29e63cb33cda77c7c37a34b2d87700e4f01d4d2be39a4d8c0442c87a8c796f4bb1772a9b23f268e0491b51c976039f7431a557bfc91f406e17f184575ca9fa39ec841d79c624127e72d0411dddf325996175dddd9d46ccaa77d4f15e53a4" + }, + { + "tcId": 1324, + "dkm": "ce85a268c5b2be9586762d80ccde3ebad30c3bbe898595b834a21dc5456364b8867e43eb5b5f0616873a3a730d635e9a229c8e2d62e7355b3189f8d2f37859d18404613feabe3209fab31195b10feb224e8371037c0570d426bc5d745fb3ce224f0a6a614b7f6da20ff732fa14af44b3c020dc41817fbd0139639621607f13cd" + }, + { + "tcId": 1325, + "dkm": "3ab408711b074a9933bf678a866e787fca99b451928dea1199c381ea9c091e497b9a1ddcb4e4748616f01849d73412d4c55c3ad04008e8e3902fdb8393acefcaed9ae180a1f49f60e962ed10c4cd72a1350d22a561c14d954faf5d4a8e62d054da4a8f651a61b0c372d5905dc3d1dbfc73cc098ddb1c32574ad421fdcb72aec0" + } + ] + }, + { + "tgId": 54, + "tests": [ + { + "tcId": 1326, + "dkm": "7d86d2121dc6fdba527e4814fbffbb55578e81e04112bdf4a2015c6071c9ef1d43a845ac413b755559fa485e6c803fbbc7a20507dca3baf793f95b2d0ceb033455e9549e7d277d61c1cf75fff109a2d90379625cb40206cc4713624d2b704a9b54a94a2268e78f5b7f4b64f06b7041f0c2956727bd6a7cc139c8933a5e7c5d18" + }, + { + "tcId": 1327, + "dkm": "71e75eb5c7f7932a5f25efaa4fd3c9b30f845a952392a6bbaf4d596fa79564ddc62431e3404e83866a538880e9d0311174a687768382ec7e362532d25342c17a466eae5471144300a68d8c2473024eace9c3bc30c7212d4537ac422b24e19a99400a3f2e15e31de9893c1dbc4c2212d08ccaeba0f497d65365fb468d84bd3a24" + }, + { + "tcId": 1328, + "dkm": "c0fe6a90045969ccac8eeb21c1faabc525f4c82dfb6858cbbe74c6069a4b38ed9929d4eb12dd211a8bad2bdf59912bd26898a109984c86db729c7d8f16eec8a91c899691c8d198118384115bc1da0b8d20bf34376f9912efa7040b1cdf3b51a2938553301cb5be7224fb73618efbc42af5db572924f1893ce4d396ac06c79515" + }, + { + "tcId": 1329, + "dkm": "2a4d2852462d76ec428595dcb7e52886f92b69c45445bbace0c5adbeee5fc693d95d43440ebb9c9905584efde4484f8b723ab148047f45342e05fba45bf59e23e0629fe6752ca54730007e296f9a930c3c7924859c2b464debfdca1cc3a27a841d1510e4fa839a3923463062d4b1bae24e837110c1ed74c1d9a503438ed39c2a" + }, + { + "tcId": 1330, + "dkm": "413453517e51f6de34baa497c0dbd50cbb50825a586fea1ac19c16f649e9fc9aa61840ec6c2b96c71765ffb8a2a94d2e575eefc0633375374f7d7ebca36b51678461caf36718660ecdb4deca34fb0a91a2112c3b7014e74a240307f5d93f5b0c3edd3dd44aec0006062d75322728ec8e72a253ff4fb4cf1b4271d96805938121" + }, + { + "tcId": 1331, + "dkm": "d3d6113ef7b04a0da639f56957b0eb3e31161535813ea30b64e8ec17897929d879aff093dbb0e8b9ae05fb48b4894db59b375a8fec54ac35c41baf2ba3624ec1d993cbfb940410e13e0904bcc5b3f55c14699a6a74c21ce7d518e8570a615950d7ebd25d5911f4afbb237e41a6debfdd6a9017b8f22c03f2ced4a63a4df1934b" + }, + { + "tcId": 1332, + "dkm": "db1dafddc558506ea171ce33b0c14bff99e0d1f61bd062e64a0e8ba41bddf5c768609dfdda1ef03e3ca27e59c878953223d5c9e97c6ab77c8816c6268a86e0bd1251440a69e55696f9e4938f78daf3e7d217c58a121980ef34a192ba5436ba076e99b510153b1bc5efcc115cb4b769a439011343085dcfd9560098b8ea09220f" + }, + { + "tcId": 1333, + "dkm": "9b3bc2114795720c3c838f38e6aad9209af3c3ae5287b01e8d43ac762a304e6b6e22c5729d8802db90b0d45e1bd5f1c4bc5778a392a4037a9d40afacae6c1569dcdedcac3fe463b285023002904ad4dd9bf4506247ddc52c70b052e4f56e7217b81618f2c462ae368fd672b5676f2096495a2bec4225ecb868a1c8fb2c7ba443" + }, + { + "tcId": 1334, + "dkm": "07158d31fefdbe212de4af8182a580f8ab2b1119695d9310436ff3ec9740b5bd4a7bd818fcdcc64fefaeb7fbb94efd26ac2c9a52409c0c8a9d79a28886d781fcafc488b1bfbcba3ba2cf68752df38922149674fac0159ad601df1a714c5aac57019fa73da8166d32ccdb3f923ae80bedf53a0cd6c35364f951aabb0228641bcc" + }, + { + "tcId": 1335, + "dkm": "694dc20993220c3c492f0ebe3e5a4fb23bc0343eaf2ee6fef9b8f104277de00c275838ec2d157e1a03619e6b6bdf457c7aa43ad8a448de2a02115130f30fa336f5e8acd9676c2959b152eeaacda932d65bce9c41bbed75fe83c46494b3265fda2ed3730a539295e9d6442fd2953a3ff7070e8c9071b2089bf58d290ede5bca06" + }, + { + "tcId": 1336, + "dkm": "84f7734eda5983422917b3223626c10c16675273e43862a916678503e975dcf71e25caaabd5fe24f1ca67dc023ca90ef9a9a7ddba1a8aff2fbb42afebc35b38d012bd33c6af9b605873239293fb055c53d7da82db31988f297fb60245b0e2a4de0bfcc95e217a8ef80d4575c2f684b8600692e421b053ba6fb7d4da15a1a63f6" + }, + { + "tcId": 1337, + "dkm": "d3fa73f6e709b869e1ee1a12a029be3f82819d07be7a764eb8cac9345c82870dbcb692750ab5be6b2a848ce22967cfdd719571da99abd9a4af8a186a1247f50ec3f07170f1f27f78247950337b8ae362eb17dddf604f2d0270a68326db6c48bd95a277ca8c582fdd0ea221456bba3ba82bacfc79e7c72e50e042aaf8b6eddec5" + }, + { + "tcId": 1338, + "dkm": "940a029c9d2a5860af1ef68881ecf852add0dfd13f19fabe15f64c9534c283edc5160acd902e0482068d265025b3e43a46b5974b8c34f30ed0d4ba394152f7d097bad6000e81cdf984af72e86f697499300bdf08d7bd8b158464b66d408550620b70d55a897d223a36ad8b4614a4ddf486c3eeaf115b76df6a7d35630fe00508" + }, + { + "tcId": 1339, + "dkm": "786aa89690641f6fc146ce495b2bd9f7fa5a4e7f2d7575b2e1e79bb8a9efff51811957b77791fe301c81ee792e8c70e79f30a8d9aed80d4c8b7d3f66616c6bf37aa9cd3dcdb9e7d57ff18f0780196abc8faf65619629601b6cf057dc38f9b54e077ee49a535f7ef4736b0a83374d235c3bc58b62590d91351de773fe56ad3f39" + }, + { + "tcId": 1340, + "dkm": "7f4a1f14c14b67084cc72afe118413980bb3037ccb7e18e5c1e46a8159d08c5b007b8a59f06aa1da3f22129649052f5de5bf1ff31598c73166049e9a20f89e725731e28ad1d9d2b64c690446226138730fcda0c9fa8adb99a143e3064501f66fe9d45deca39104d1d1229082e1576c7be65278e130f60d66d5e74c10164b7e26" + }, + { + "tcId": 1341, + "dkm": "4ca933a4ec7f9596be54bbfc262d01174fa36a9befd0b13701c2bc7ec4dbf6ad573a8a343bfed855dbd0a97d5c495cf615a038e9f4a103724c0adc0f8a31d45e8e88766299d13045197d6045026bbf59ec1bf6a7d745aa0ef879c289065bc5c351c78aafef5b79b27e9c66cfcacf4b5283e19b7e3c0ee5366f59774d29e24f0a" + }, + { + "tcId": 1342, + "dkm": "48ca6caec23ec426e03da801aa5ca40400d032ecb62176b3731fadb94031fa551c5f62324b0ad42c2caec9fb6bc5c886925daa139d6e3376c3481354b17dce0cd3e0a06da018a8cec1a49f73afd7840a9dec8807383ff8a4018be19e3ed1f360aec7773dfa86f587b26c48cdd08e304823c9c139b24080fff39749d7b54a1fdc" + }, + { + "tcId": 1343, + "dkm": "d0d75bfbcd46a92d21fc4615ca2ec9e1432fcec24256dc2d09163c02d413ec099244ac166ee2b6367903a949078406566d10543900130e8a8585c62f8129c4018768c8037d0cbc719e268432c386721bb6099c04654d8e5ab07e86475bc6022a0f792c96ed20576c5a02b09bea5ddee7d7b2a01c9ec9cd644f8ae6517597bd18" + }, + { + "tcId": 1344, + "dkm": "65640a9ddc6bf52097fddd54ce352acf77b8c14f3a6e5a1852953e2bd2b3c172824e1de84449aaee8c642a5dba4ddf3725748e3d59052518b1a1384b58f872d7cf1228c367eb69cbd8e0eed408064368216d18742b76ac75a8fd62788e2ad3d9575e7717d818d231dbb1f76c56afdb1629890881a59f72b71f3a0ee8fb1fe56a" + }, + { + "tcId": 1345, + "dkm": "b111ad6891a036177ffd6e8036c1bd8c73ef86d6191634f5bd6289f0256fd04397a58756dc9c22bf8aad81dbb04fb0be4c613a0de162bdd754456fe725ca3efb485e38e953b91aebca5ca13c4e57c447cd37cf5b53518e85814a3cf6b52da3781d9e937aad15f98fb3fb3820d797fc5e42b2d82eba525e6012456335dd635d21" + }, + { + "tcId": 1346, + "dkm": "245d273065bd4b649af9a9c972ecd66012b0d36f932843cc7ca9905f0dbb2529ea9d9a3fd71e71bc8d4208798dd9ea80988f977fb704ad6c035c21630641fb6d9b4cda04cf8535b5124661ad9953d523004ed1a3c0aac8ffbfa2007d09060e0342016a28df7c4638ba952dec6f04c53ed7d526283e4a5bd691c1c8f2cd72bac5" + }, + { + "tcId": 1347, + "dkm": "f10c6ca605652d59e0508daeffe9c49b47a1e48a47cf120248d18061c408b3ff179c14833f65309f614e55097c97c00d4aba8b7e89e7609e72aae1049fd9bcf79c3ce32d451b7cbea19a48e70479aced5360ca55e98e4b4b9713e4729fd479448f834c34d3db8e9dd133909faed0f8feeac40082220eccc640b4d2b329525ffc" + }, + { + "tcId": 1348, + "dkm": "35bf8b2d267b531426470b7b8d49452241a9a25ae097a287e64be1f8d6b01d009f2619aa70beb0c6718b252ebf210fa80a9470ae8cd42cd5ca26ad555b0e447c5c7e1556c6f4f731da8ed37071bbf87a5dc40e4982d48a0ac9d3dcef2b075c2b38b56036e36eca22e3db4443c528680728513ba45e5e427faec2c5bab940a4ea" + }, + { + "tcId": 1349, + "dkm": "21eb8e9ad494b15df05c46b1920acb94a8106eb9555a82e58727ad76d648f7043ae114936c63bb73d680cfca9d9393bb7c8bde47954f0df06490c5235a1c76df4e6c41114d267c9219d1d1825cafb7d0abdafb8925e1d814cce0edd2b474564c86ca7242027201ae89eb03870a420e968a64620b7b27598c932f71c7098b1435" + }, + { + "tcId": 1350, + "dkm": "5c2174f9363bfae0b8ce0f9605641d24a37b0e6f8829cb15a2615b4322266ff6f61df3e1e2b55824355fa4005d0d12fbce809f8de3a6157036167809c2610f5a8d921c09d6975318cb7fb183b6a9ac6b225a2345201e6d1501993da350432cbae3f74126766423c28e8898b4604db8e9339f7f19ee4d8e623c1ceedc3c7bd10d" + } + ] + }, + { + "tgId": 55, + "tests": [ + { + "tcId": 1351, + "dkm": "567ac03fb29ba436220f3973b86d188b5356f11f43400886f13a5f366fac577d85d042958d7cef18cca16bf0a5fddac7aedb223863d163ac6d1ea9fd483cdc4f3af3fc3cbfa6e7cbde9adb818d683d281177aaee98adebbe6bc24dab934e0c8a1beb3317ef72748752744fe93395ac845b3f56ff0a28c9274f0cc86b7105387b" + }, + { + "tcId": 1352, + "dkm": "c9f046e3d344a1b5af751368eda4665e4de4324e96367d23168305b77850c231d00a585c8e9761219bf8188303135428856d11df1b8c811d447702f5911d7c6b7b37614017789432b4ebd44ce8737a6f9504344743ced72fcb8b9e1d132985a9489afe254b7e194d62d5b463083eae20b988e60d67c63a70807296cbacf5e565" + }, + { + "tcId": 1353, + "dkm": "cb650f159ff51c33db00f4628e9d35d743fa2dda3983a2fc64ead08a9d924b9542f0eae242f4a7f91d58773c071989d2a9d5cc32a35d0aad5e1344fd207068923c088d14e7ed97bd9ec64f220b07a0b60bc2c298f5356dc94064d08f314cc35b89dc845716f53c24ed05097ae42c5ad8bfa75f2720eec03bc285e8f509128872" + }, + { + "tcId": 1354, + "dkm": "12e467c0c55922f5a8bcc17847b451bfaba26516051434f94e6494cba4e14151eae10c02e1e93e24fef259a8ddd48143f221c1cdcfb17304236a826f99fc5b80c65047c6f9d54cc3fa9c3f1988a91161146046dbd55d33e6f6d61bacd09d37b26c62d28a244da5511db4be085941441e39ecf091ce70c22c66b21977ddb7eedb" + }, + { + "tcId": 1355, + "dkm": "0f6fdce7f52492c5af7fc4b576f9a0e9bb2d3d6c3607885ac53c8ab559cdef2d0438aecb366a87e382402883d6594a4488ad35965a1eec5638efda942e84af1fc18a879fe50ba0ab811c67c5c2aa728c72fc9b25df3b369bec9c42206279b478a7ee5c4f0da1c9a926207f233f8e3bc10f18c5235cec587709e8f0b095a2d7ae" + }, + { + "tcId": 1356, + "dkm": "5d6ff99b085ff12a28f4cf9aa1e3e22191b1d0d8e8129b594d58b36c9e6ed4823c5303161a0fe125e80bed3e4482a8cbe30f696f4094987a251b9ad2503c6ff5e7eaee8f54e064b4280ff86c4149a7000bf6421425809852b7f5796037c1cb2533c32f5e43a30b2ef2e680cd7c6a52e490045d040efa22d34c65717698c017ab" + }, + { + "tcId": 1357, + "dkm": "0da616ae7362dd17238793fe02eb3f837905eea14713ffd946f2bccaf599041abd4c4ae8e89ac3f99cb1f3e17237dc1af6f93655ec7379938945de740f11464723b3b1a2d5f1a2f94b15191f81d2457cdd5e0395c8bffa3f6aaca9decf0b6c049bbb624985d9d196f4fb0362bbd8d13a20fac30f5999411eba548289c646fa7f" + }, + { + "tcId": 1358, + "dkm": "f596392121bf9b5ecdd87e6a68a9d99a01560a8073cfe64409f6caa8c5219943be7c50188265c1d697756003e6e6b622cf4ee0e4e0cbca2303fbaf6c7fa7c389b82b4cac67db9a6cc8da9864d04e3cce3a5f92f1f9dff647782dbbb9579c03243bb31d4763a6b20200bf4c8deafa60b61d47025e37a8bcae080fbbdf0136aec7" + }, + { + "tcId": 1359, + "dkm": "e4308d6a3d007daf49223f955d0dd4855b220b42d73d743e082073349ce0c541aed66cb35be08bbb39eba7641b97581798c3d4b2f89fd21b1fa4f6c250f965fec4818b3d827d4105a7fccf95076f31abc1f9fcb770ebd6dc41168746748170c5c9fc140a265b32cff849a51b00d7fe44a403ad343f3fbba3cb67ce03262e1289" + }, + { + "tcId": 1360, + "dkm": "6b5b9bb8b57b185aefe533d4006fef1cc5060f5855a81a77c64b7f7362c8d1d8ba9e6664a4e02fe3f5aeeec6ea2ee169f3d8d9d72b0e5b4f354f317d345fc942854e9aa993d3282fdd30a87b57a06c96f5506f1852b350949dd43dee72c33afd1c0ed50c573e7cd648864b8900c8e23f10af99d4aab8a6b97971dd5b980a7d7d" + }, + { + "tcId": 1361, + "dkm": "07b2d5e663a618523833a52a5740a530d15fbbeae3a9d5ecfac22eccea3834ade22eafcad3131158c8a7df0e394487f7cadfef3dffcf5ca9fe54fd91f2d8571649b86bcff75fa626354ea9e705830bafedc8ac2e10028e81d9d15920b22b6d6ff287c729271d905a49a0438f707c2315481e402691e1a2a1cf47f084c5cf6506" + }, + { + "tcId": 1362, + "dkm": "3569e6589628f1ed1cb19cfe8cf31d51e1b33efbf9d64251ddbcbf9f236c7d30ae19615ca68d4367caf3a74a77a353c84f8899b8a0516af518c782f214abba186a88c182b52de7cae81864108bc750490574980b89dd50c8e6079a6cb4850a81a60db78f436ddd0fc28cae441aeb6a68f5891933d75e91fcb37c3eec2019f34b" + }, + { + "tcId": 1363, + "dkm": "be211bd193322c181c37ddb0391eeced9643aeebce8f408eebfff57d98778a41a074dcf842c74d78231e44cc2c3c85f1c2eb81f832d6ab73972ca14c3e6a353e8ce67f2ecc113f60714bb461428a6a2b8118bf1733c182e0fb7ab564b501168b65704301a67d978e7e8d66c2ae5b2317c014bb0687294226adb68d10bf99facf" + }, + { + "tcId": 1364, + "dkm": "521218a3b7307043f3c9b573700054f1e13c81a6e3ac7e2629702202d2ed1d600256bda27b617c208e5f075480d9554a896569444ca46c3f269d3a6b9c72845978dc2c7b5b819cb7128ca3f2c4a034d270d8e564d46ebd72a14343e360a3b0b3ca613787c11ddebb012b1a3b4f01577a593ce3d4100f3f95d1951ad88014c9b1" + }, + { + "tcId": 1365, + "dkm": "1fdafe51b045ac3f69116789124f2c505798dd5775c17644bb5e7e829958bc470abda8179d1b5e076b6628a8f8e1dd6ef481c0c12be74a73f2bbae0a9066dc9adf5f1122bcd13022e4baf4b83b5636cbb8bcc330cef6cdd4fa39158505931242259a2fa36da6d752c1dc7140d94338507c906bda6d43cd657826e2bdcbff5cd4" + }, + { + "tcId": 1366, + "dkm": "0012644336f567e28ade0c35675e833f77b8d9c2a6cfda0b07c8165334e11cc10bfca0732beb9f9051d74ed0a8cd09ad39c9dd219591f2cd7f8a3673d761b6e1d2f23a90ca66291d87146e60d62a4348e350d2a42195c9ba88645862adaaca04b31dd332358943267b4456b2de1c5c5f7172b9b4b71cc25581a1e5a1817b3700" + }, + { + "tcId": 1367, + "dkm": "8f0f596f849bf50d468212569f3acf70051de3cd9fcc892888b377ff3fa3b27951aa7265824439423caade557bf684d29c870fa6e5a88a5c29977a983ca41c9957b7984d6cd5ce436c551db8ce905264436bb534572b5ddbbc0e4a37d575b8758358bf42134c34f9781d42280dae94d6151fd80edfef582cfb417aa9049d3f6d" + }, + { + "tcId": 1368, + "dkm": "a850f527892029f3c8767819d9bff3e6ef7dbd4e70afa28eb44a0cd4db0dab99fed8081b0904f791f09e2cca2d218378a9dc69988cfd1b601a9b5b5f6e0f2cace41db2db96a495932201739fed95469cc348eb5948c601b4d3ed176f723efd8e8886d9e48ddd870ab1154e51ba90e108a08bd96afed12d062d4d1608bf43788a" + }, + { + "tcId": 1369, + "dkm": "59b14b0fc6f58338acbc4d2fa5094a9133a7a46fb21f07cd3991de00588e321f12bb97ad60c8c09f5e8dc7753d3df748f6a8280a3f030a2f7d9e862b3d8b055463325426c92950d9087f7e7baa126200dfcd501635b305c84bb817558c78682a0954e9d05ed513e858c28b081c79a23ee4ce2f7b01664b85caadedfc93d7b351" + }, + { + "tcId": 1370, + "dkm": "0748d293b6428e97a4f5730a1c50df8d41714d60df9e79eff892ef21566871f39e57b155a7e2e9b3dbdc8b19e3289adb3c179131ccf4c939b0125727463b873f80e142bcf340a71d8c6ae10a6beb76026909695faf8260f623633cd6390e4aa3fc13f59a05ccde7ebfc8621380fa9f2b8b39fd10eeb9de60b0aa369c118c292e" + }, + { + "tcId": 1371, + "dkm": "d47f62aed07356c9b43887e115f82a527cea61e67b2fa8ef18573146659d873eab6cc70cb46fdd3921c0f209322bc382ed737f322c750ffc93935f1377f6eaaf88c5129118933139223588ed1e2db225b15f8b6bac117c4f48c8c58b258065bcbc75c2f6860786ac19ec0ee2f266247e418a3dec6a91b1d91cbc657f7a8c8a52" + }, + { + "tcId": 1372, + "dkm": "585e0b79fdb06fab6a196ec2b59a5b7db7cf49cad66f6edba3730d92082040c71742765a42b93689323ac75cc7211a77491c81ced9e49cb811624d4e850247ca3efde38b6022633aaccf995b95cda1274aac5e60ecc093b52fadf1a8bbcf9b274bd55445bb538113c522870f1b7480bac42df92e2d0cfd25a8c006f7106d33ef" + }, + { + "tcId": 1373, + "dkm": "c6850ff7b39a780cb78c08a6915490901b2faef53cfcbdd91667cbd7d037d7ae1256028254c53580a1f8e18696f97f1f333236494b6d932d8b988b7f2ec302cf5382fb09eb720bfef5cf1ac57c3774b31c6cd510129265d1bc73a581ed9bae2cd38a3993c4f29f88e41f808c6e5c05c0b203c89e6e9bee53c940f8dc08fb7567" + }, + { + "tcId": 1374, + "dkm": "c8f4031924973e2911ae39d3b3cc774be559e44c640630bbb444a0ad7b2889b1f7c3d388622af355d586ab645e865d1ffde1f8d2d069221b4b25e22077dffc357de2ec70de02d9cfc7fe95ebf4e1adac52590839079fdc7271c5887c7183bc746720a9a570cedccc4f422b919a81f16f45c8ba2c5a682f952dc59bd1aa88ddfa" + }, + { + "tcId": 1375, + "dkm": "efc54ef9c7d08734fccf81a37572c3fe1fe5730dfe023129473d7eec5115231cbf2b2f1abff8a692ace95ea2ab6e3bcff215e81ec4a64919fd5fcd615b75add0af03ee070bf51d45a79215dcc5c8e6fddf959cf7f7ae3bcabc7ddd1508e52900a6c90fd7d743ffa1b7a169462061eacda43a07a4a03cf2975c6c83a4884094b8" + } + ] + }, + { + "tgId": 56, + "tests": [ + { + "tcId": 1376, + "dkm": "b73e1c846102f0a0f7eb17a4d696176f1ba5770467f5e9a59b8f28940f86b6c0316bde27ca75b32e344398951630fd8597d1d8598bdfe76d7bf007d2fec0cb8a1a50a95e72425273568552b553c2f06c1f5d5f48d6fd37787ca34e22c50360a17f6f82a3eeac5fe68a3c2e5abe7749fd4c9b6771e08b144bc914bac1d652128e" + }, + { + "tcId": 1377, + "dkm": "4ce650deda67be43c97951046e3d8fef718adf0b3b936bcc3cfc511c425cb48a670b8426c5cccad3b29cbce6afc9206ec257679d66e093178ff17588fa0aa2b6200cdfbef9c3403017393808e28e6750f2298558a51def54fd8aeb9dd5265f6eda9205c2b59fc308ce2a64081c6fd05107d96c0750fc8e3e95a732c6694aa377" + }, + { + "tcId": 1378, + "dkm": "e16930084b52a5b4c1a932e99cd751b3eba323a94514f3711739fa8e85593a203c6d33f8f68fdb2121a480ed743b7162c6defccdf9da283977df9223a19e0202307e7fb3da97ac236806dbf5396d5a2f4334b2edb45ae67e68dce70d9d9877be2c1cbc605cbe49ed6630cd1947d51790da796d6ef2338c7e5a9b6c251b35dcc4" + }, + { + "tcId": 1379, + "dkm": "d04c503ce67ef90a40d04d7103a59720b51d88035196ea3a59d3923ab4d10b5c20cdc228a004300f3dc019f106bf3f1113875d24f7fa5e44f7f54ec8eb89ebaf15fbc0c6c60a9c5f80247c6ade62fb29fb7bed3096264204dfae2e2f2afe73f96a744cf7c1344f88c0a087f2999d69076762b00a81d0c9d751020ed38f11a5db" + }, + { + "tcId": 1380, + "dkm": "0ae251d7a6d60be785caec4ea557e2b94c047fe08029d4eb4d4efc4bdf178e57c9bd11bd759a69fb7817a7fc1881c7fd07cfe1fd9cb6c5946f2410bb93fe5284cbb2727027641b85691642a51aa400df12d67156c65952b89626f09ffc96f9f01ab0e2a13bda19125fe05fabbb039f8a4151dccc1c112235d1f3c4a17fdc8c6c" + }, + { + "tcId": 1381, + "dkm": "e2fed439a9aad1a9810feb3937b86f7352dccacd099a7b5be2c44510369bad4417acaf6b6770c25e23a2744bb28e16abe789215680455a1bf201327598f2b7fb0450aed2b6a44f18953cb0ad042dd2c6839269132bc8b67ad8f47e5dc249b2b97e89cc4e7d3ad7be1a003fc35b22842b4ca563ecaee58f888564dc4d63913dd0" + }, + { + "tcId": 1382, + "dkm": "048250721698074cdafd7828f9117b62a0cc2378342cee459d01cf676464a460ddad63a83e37968d2187119a466e65fca3be1708a50385a4acf961bdbcf319043412e469f8ae628a21fdf1e110bbf08e79d19687701c56b701fee80370ac392d6a4e832fe9f771a99b9054fffeab3e34177c423f9ffce9d57dc8e3394497be50" + }, + { + "tcId": 1383, + "dkm": "45ac8df2ce673d6d6a9f03f7c24a673ebb2335b9548a8998700f5f6be8309d6f2ee666fc2720eb9c813a65a64ab1fd4faf0f7bda493ec36fa2f29b3b5da5991b8de84b18fc7137c4b4b9026611d2b8f0240c84d4ea5798371e972b1f50910be252e7422d58b553e906be249889df2a0d61d264b9d1a2eece5d11c1ff93108342" + }, + { + "tcId": 1384, + "dkm": "af2a90fe997d58dd90e323bd5f57e7b7d4bfe66a27e209fdc4a2168157d1ad06a643b0d6d2d0213d13dd890fd9bf570435d59905852ed8c8ddf9b2a35305375aabbbcec49c46bada52a6c2b54bba9728d9a1bd7a7ade0d6e96a35c47e6629c16ef050c1b08c62bcecc3295270dd321c43a95b849d74ad59528cf4cd36fedbff2" + }, + { + "tcId": 1385, + "dkm": "59fe1634dbca1cbdecd4d165a046f0bc9c7748692b688c3785fe842f8591592b61f3d93045f85809f7ff78cb29677789a0ca488fd3813fa16811dac2620ad7cac01b6e4de0df258e32907c490122c8a854fdbd55686fb5a333a802b0fc015c2ff68133ce88e878340079195a84bb98f651229a1cb3472d03e96d0a075ebe14c8" + }, + { + "tcId": 1386, + "dkm": "5130c26b08054dc85f54ecb1b988c1e3215b5a19f2f6b5637a10274b47e329ddf46ea35c5268078206cd13c03732269fd857742cd2a065bae8e66f03825b56cebeb4f70b2c14e38398b183b4315847054e735d17a07749d7300c29f69b2fe046a8ab9ff4548c8b56c1ebe11414251e47e420cdfc48f7b72471bdfd514b391274" + }, + { + "tcId": 1387, + "dkm": "e884183ac2b918c8c15f846d64024eafb04473cb4241854997545567012e1ce6f10dad40fcb59fca29f2ad79d803642239e26742c9855c94d0d906aead19c95398e315de4b9fb0c3ab1f7265bbf066c234537649ae9260a67467dcf041bcfe8fcd949ceeca9821a4f1a03a95dd31623f9de5ed0aa83471b790a89ba671a4bd7f" + }, + { + "tcId": 1388, + "dkm": "aaf5b3be853a953ad9ae9ea3882160f32aff4eb33876f42a2f68eabb3884b023580c1dd64f21efdf7c6aa29c44443590451d1298195e34d34422abab9a9495ac1a80087982c5452305ba267e8532b5a432c4057a8f8f4724e5143c5b4af6febb37cdb4844f0a99ef0e2946c091257121f45e05e853b161832cc2d2701ece8e17" + }, + { + "tcId": 1389, + "dkm": "314aa1f00d3b6efb729d92d04af6c235b69ef57420dc437c0ee0d6ebc2e20c391d9c31b1eb8c330ab40dcc6b6182067d8af86093b51212d4dfc6231bc4c3a5b63781b8e0a0398b295856b1a6faa4bd6f6d588de624b64c0f1a0cdc4ac21aab66f11b53291d7ed9c7ac75991c38453ccf908035660a2bdf48c1c5b8174c3b5c19" + }, + { + "tcId": 1390, + "dkm": "5e26f689a92478653a0c7c46211dc1f18312aa6e6aaa961fee1423e82ed75de65528dddfe8d94a78b5bb43004153b45123b2022e895494c411ad19b77ab5fe7bc5b051f137b049979210cf3c73d93848caf92b3995b7ad74f6591b71f8395dd7ab9f786154436ad525f3d5f6505a66a9f3afbc907b644f988ccdebff82743389" + }, + { + "tcId": 1391, + "dkm": "1ce9d9359482dcb2923b5b9c723a08ff8d39b67be7ab19960e1078cf86834829248abbea94f41540c525ed6ec5bc59df9f80bd624797428591e40391ead16e07bf46276cb79581ac4c90567f46d25f970db66121bd6edcb3e8d7b80a9222e9524f958e5121002faf7294eadff80f8fe297b12448fa1575a7f56f8aaa2d4b80a4" + }, + { + "tcId": 1392, + "dkm": "dba2bf68b74b01e0efb9debc0a5d827adbe221200a89c96172b01cc44e7f4e8514e383430751a52a8b2454ded119b1c75a95725bbe78f794e7d6674a6dc563dd115a463f67aceb3ac21f3ae206f636e2e230ca97fe3b99248fea7ead1b5be5a6477509413d512f390372d35b3a66bd539c97269fc85eda35a85da27d1d60d9e7" + }, + { + "tcId": 1393, + "dkm": "989ea69b0c1f6d51c17130d4136ed684dc43663718d52eb9a5c63f424a293fc9b446e543f02a7dc5e808ed369ea622251f8a1eae5b96d316acae828b395b3c7aa805193b02b90c9b50839b6c87d4f625bd5b151f3019cd507777a1de275c3df6b3f0e07dbbdfb7e3f619b777255891e35b05f31c6c5442952e1f025b4451b808" + }, + { + "tcId": 1394, + "dkm": "eaab854a8ce1089aa8846e1662fbfd18496e5c1f8140ea327fabd85e237acbb0a62852bc1b22179b98e802fe3911fe25e2e4671a75073fafcd3771d13b628adbf96b61684c85542e53c148b950375d55a5e04ec37a5f76e7b46f0703853e9dc730a76d8e3b0764aecf4a22fd48ed956a551f05fe14e766f1c8f9b9992ab46899" + }, + { + "tcId": 1395, + "dkm": "607bccfabc4eda8b52e0ea487d0f5d4ac01de27129ce4738e3b0b12d1623c33ff4d5ed97bcd95e907e7eec26882e0b139f4b3dd4c51c09fca5836f9158cacacd75b8370c35deb190a97f5c769c56ea0eaa1c8ffddba7708a3493c2d0a46122a117df8e7c20befe083573d77c1abc1c7101a31c501e05f2786ec133fc6fd471ac" + }, + { + "tcId": 1396, + "dkm": "9d006f6f749123173fadb429d715ebefba95bd4c03f07db418cddffc45806bf8af00e2e10163f7f72ac50d1bb7a1196df255ba2699cb029e3ed0f0d43d1bec8ab20685fe668929d62a02c96aff18474879e74fb19307d4eb76b583e7c3de72f8a51e90e5aa25526533234873f316d7eed57b854d388ee6df9f475ed67d876f96" + }, + { + "tcId": 1397, + "dkm": "27d6aa2d95051a31a8e1281b9ecdb455ca1b7725b01c1b6be063f046a75abb3e60cf3d9d56c0ac42f7628818b731ee84283e83440a276d5b189e0d91996e4b2dcc55ff23f7a1aabaf623308373bc4940342e7f65e608a159d8754f55b79bedadd3269897899b75b0057480d7c825fb9278836020cdc753df60427f937397714c" + }, + { + "tcId": 1398, + "dkm": "271fc2fb786c5594b502ad8f69d44eb914192dcf44279bb79afbf2c79878ed6a50fd3242d3201cb6eebb5a8375456bddc4a8b2b48ad67626745329b61806c9f15b6e8657d15ad19eec020c7d72d2f545c012364f6846a6d68a33b788d3f98cabd78925cbe75fa3b606d4af621193a38b6b243ab447c23dbd0da6429541281072" + }, + { + "tcId": 1399, + "dkm": "53f542d88984233fc8ca3d804c5a2d403837db8a4ef9b8cdf976df86600fe89d74c90ecbb5ec841032fb5d514a7f4c3c55c566047fe2dea4ebafe19c5bad755835ada21e99e1b4e04f1a23b9a1f155244c5155262a1db95610ca152bdd8918874691a2397e17b778feb25418b650e1b02a5ef7a1a189e4bbd782289184b9b7b6" + }, + { + "tcId": 1400, + "dkm": "7c6630c5360f67bc73a467d57d48544e74629146e1375127549d4de3ca4f3d61b72b5d271a6d65349fe78a08a3395e0ee170519f41b8a39e59e004b10db4ed0cb6054240e13f7ce48a75a90a373f1e7fac59cd44259704922f86ed14433a22c882c1ce863832e885a85a7067f7a4a54318b1a2f23fc37654de0685312fafc65d" + } + ] + }, + { + "tgId": 57, + "tests": [ + { + "tcId": 1401, + "dkm": "81d5eb5fff2428eba0789a7c70adacf11dac6d859a2864ca8a029a63095625233f2029aebf0dd297fc19281356cb42de0bfa7d1c1930c775e0f4e37d0e2aaaab331ff6d398c6faa8f98f89ebf825f7b19b0df4d7aec9ae5b3c00c508c412349d14b362787ecff80a9397e3e5284dd743ada07491a423d49e552d9bba6d9f4d50" + }, + { + "tcId": 1402, + "dkm": "a9c5ee5ebfdee7f3f5ab823d5e181f7c03da579c93f632dc2b0446dd1b54bc024e127c35cc9cb062ca5502e33314824daf147a1450bb4cd229cc38a631c01d51d218d01fffcbbeb88f2c004add44bf5b96e13e07457104b6d01f61d4fd86054611841714e4a0dd8776cb517f54d615b6bcf8fea1f68c34cd66500ee0a2b2dffa" + }, + { + "tcId": 1403, + "dkm": "eeddc5e39d39051509eaeffea90feb089258322a44fcb5dfd726f4b9d35409f2fd610e9546d7507302be5f3deff6e09c2fea43971a0c4304d3c65ee8d33bda6b438946dfbed2c0e90939f7cbd8941e371d5f7b8ad37cf24e83313de7eb573d93d2528cda09f6ce98def63787628e412fd62859a4167dc68a72f15e857705779d" + }, + { + "tcId": 1404, + "dkm": "f8f204b8dd2c3db10a0cbea49f4edf62ba8a4d65f7bfd23146f40e5d90fe789edc10af5d0e9a0c4ce5fdbf03b6f14b66bcbe55f4e8248f4c39c9fb8cb8b909a80321c9799f43a43b5184d101c4edcf0549256d23d264503edc3eb82501fe574386582d658174f734d2f06231124c2e5d83889f3c34ac0089d31c7377fdd410c6" + }, + { + "tcId": 1405, + "dkm": "5552607ae5ac98fec95691f030e2d2912da23e0b1b0646777d20e7b39317f6e0391e74c549ae95456d16b01d2cb5a1898f3d3bdedacbc0ff9b5ba917dff36ec08e8173aa7c069ae5623bf85e5a118adb6e6bb8a6d0f039107485ee75500bc1246055f1b0a9a094be0ad81bd7184794bd8b81b89eecf02b1fc229a8ded988a2df" + }, + { + "tcId": 1406, + "dkm": "f6d9b7af3c771427fd81b06e455dc695130a126346cdef3a54d7874d8a27bd4fec883d74d49c4c9881b5d4da87f702bbf3b68cb71fd621675869b3c854511c883990582b752c98d469ccabfd189bcc3621f7b7a67ff3ef7d5bfab4cb48593fb1b9a47dff1a0f5355a8c2f458ba57fdd762484e9a1d9c776500e8c4ce8a14e24f" + }, + { + "tcId": 1407, + "dkm": "44e2e184d7fe2bbd8c63c5a4af2e4081ce027c84a0f12a918f0972750729183bcbce403d2f93bd1ef512c9b6e023518c3c61ab3a8a348e5a1a3021f5e03ed48c8e48ab8ff5e6827aedfd094dceca5504d34dd84cfbe66b4f38e840f13276bc05601053cec1150bf777a4e397cb7c23c56b0bd6df0d392f59ee95afc5b89ace6f" + }, + { + "tcId": 1408, + "dkm": "0d5376dcaa6426b2d6dbfba83c6543f45ec2943b9e29c73fe3ab42e11ea4f914494a18a55f4e565eb21b093444e74d3a27811df50f17afc5b1573405a06e4303ae5d8f45826b276cea82d953e11e2a0c5a06b9c601e61e783d31f3d8cf32956a00749efb3d4113aed9a7037ee368b5d8a34feda4251022e52b6fd96e3d75bc35" + }, + { + "tcId": 1409, + "dkm": "4432e6c9e4224ab40a82148146bf0668b98ed856d151b010abdd4d435c41584d16a133e0d67512a6c57d7272e9582871b813b3f1b295d339926255079cd6e7c802ffab197133f52e2a19ff5c4c9487d73b5f7ba94aed01763d41a7ee7911561cfcdc345768b4ff6b11bf19cc2cab49c2002d3bdc3558236e44680698fcc30af0" + }, + { + "tcId": 1410, + "dkm": "50f31442c170d462a1685caa622c4546bab28f8b214d3f4f269aaef71a737a40cfdb6924c1ef34e4dfab5f32ae8b8aba2fcd9ff44ccdc5cbad37790641fae41e3d0b4775dbcf33bc6344e118554a54e8bb5ae786f6b8aebb09b3641e5c2c299e14e0558f3bd1f9536d0950e3735623ab7f9129703f9ab85d0221324c4f35b5d3" + }, + { + "tcId": 1411, + "dkm": "192099219b8d9690987422fc8647535c1ed1caa8aec3ac13d4dc7609774cbb293a50da18ab8830049ad1309c09adfdf2f4ee8bc3c3d8a6005bd89060bfed7cf07ca60ba5d9ca0baa1b8fe5bb2aa7402c85dd380dd6342e3273526ec55e4c80a8d3c20aeb0e8de0b8cdac7a5f387e476377b7573702ed6dc064cf4ca14bc17156" + }, + { + "tcId": 1412, + "dkm": "f60f8e4c2d3e4533cdf5800b687c76d144d9fdbaea45cc2753c5fa9aac52d6cffaa71e7bc367d9ce16c7bd37f8304809256b59dbb966e275123f5354e3b574f1d45424d836d8f6b07ea2d5a53f34707a842c1d765ce5f7830593a5ce98e7f899a3e9a5b61237664a6f5c29cf98f2917ab99ba11b52b8a866e6274ae609de1bbe" + }, + { + "tcId": 1413, + "dkm": "bc56799b7bd6b97d6fc1f2df6ee100282b4e2003b973b12565e5a90cc9bef08c2d0b073895118a8ff6a189204d8d6d53f1ac5802a91450c66fb22658baac9af15104b48e5e5ee65f7cdd3f18a959c2313c1dec557511336078e1838381a785abf3c8026000890a51bce3af12a55b100a723150927d972b23ee1e46ceaa2c33d8" + }, + { + "tcId": 1414, + "dkm": "642be257da51cfb6a46d7aa13356b43be1b436fa924fa536da03f8ccffe661a061b5035869445121e257befe02d1a109f01c0adf3084ffd3f18a0d9a3702eecee2f3078ab62b8bab9c4ae269b063805d10b3f81e1f97a432a42c7fa4a487c1c50a39d7dc6e061df2b23faca34fa79842b67d4fdaa945a7427732f728a70c6649" + }, + { + "tcId": 1415, + "dkm": "21128a9da64fc0acb6382d0026e986475481f37fa632d357d31c2f8f210c5d2d45738bda6f3f2f95c86b7bb243f8b1998c39b28586ef35872761ae5cafa94f373fd9d0f7141baa4f89143a4cb4a2c08c89c3a9cf8d44e9351870bfa372340c071b4db76285d92d8a4dbb69e04aef963f59df590fc60033b3723a5bd0412e9f80" + }, + { + "tcId": 1416, + "dkm": "d6e577e0e3ac35a19e4ec29d6e505dcd0354e9e69907f47febff3a66612db3ad2cac76f4c940bab530b2eda36ec50f94002b3f08bb5dffbcc59ddaadf724700d594d090532cc2408a960c2dc4011063b9097faa84fa9c6ddfc3797108980533f2ad4125c483ded51f982023c7c453897a3b424bed7f66feae55593e4351f104a" + }, + { + "tcId": 1417, + "dkm": "6c04cfadabfa9cf73817855a05d414a55b76b183eeabdbd60f0f50864698d8cdaa74b73f4b64ec59a6f94704a3bb90a26246537c249bde30eefaa98859e9fea1e689e900b99da2927c5adced493e21ba36d523f911a861251ff4c0e995c1354fcbcbf9d39531314af7ce447bf68c0da656ca0008152286143efd777556af494a" + }, + { + "tcId": 1418, + "dkm": "971a35ec11536ac7d70229ae10eeb89a3a0a32c3267ac68a9af9bee425037e2c256475773e3c66b98ee45801972b59d014a414d999cdb97eea0d8157aa9950f07d8fe7792ff68c1c83085335b8c0b5d03a9fe153e2f3613ee1cf8390c765ca98a74af604f858504251021e4b08957594e07a46260f50748a2b6db9f6e2b3f864" + }, + { + "tcId": 1419, + "dkm": "c1256e7093f14187823fa271b8c64de34894111630a5faa2e284653b90c4cd374f6c992a366de6def2fbd0b46c3aa11c723f38c19537da4a999b763838f4f66a49c379c8cb2f4de389a44ef3211f09b9c71629ca5ca19d3ab5e577a491409530e81763a1810dd417543f59ab2fd449b6ddba0296eb5a86d0786cc1e0c0ebaddf" + }, + { + "tcId": 1420, + "dkm": "cdc73fd24d6a6cbf07133c5aed748da299526d29cab978c287c65c6325bc44219e334fe78ec52c0e1ad8a6d4c03171f5f524ed2f0e33bfc8e04c3948d40284f73cd9401e4958b1202c5762a17dc57e4ee8cea3ec28e25f2c7f9c8445323cb3ff62dd0a1c0d78e7225404486aa9fb193e82e176736712164a76b002c0fce62753" + }, + { + "tcId": 1421, + "dkm": "2c034a99c7f2b29968bab57d3d01d0d92807b6b790a8cdf353d998de7f5112af39a810307be00c64beaeaab374c4207ffefd8a4079fe543e764e600490e97118e6a47aac71797abcd43afda3ff9ff1797948fb5b90b3e63c25ae4e40493598b42a169d856c316f7b4225ac84f2b4668ee6860f3c0dca085aca23f5f9b84df290" + }, + { + "tcId": 1422, + "dkm": "f3a182bdcf311e7a61ed5afcdf6bc965956082b3968dd687322fb7c8c183dc7d81211b2f4d59238c2b06aa492602b78f1d4a8cb43bd9ebaf16fda8055ef88b1bd95f7d289a3b9770196b81199c30ce64b49ae3c7b86e8c350b502cc4e686d8b52ef64a91f59218a24172908f40e490af892b0dd60c0bd01bff2f422c7b2db447" + }, + { + "tcId": 1423, + "dkm": "796d598e98af57e31cc88a920dd9af4cb21bd5526d9bd2dbee043cf9907cd54b3d8a7c8548d25810ceb1d6bd24dcca8eb443a6075b94457f6f51b6d15a2e5a6ec7ff23335d146ac0d898a605cdeb5604908fdb2a497abcf0b6d962bc147c5f1c7b498309ca9e3dda3d9279148810bec45d4f6b6feb6d3d17a4acd62adcf7d999" + }, + { + "tcId": 1424, + "dkm": "68f8326b51de63ffeccad60edfa68553dcffce0af17cce171bf8a53ad5a995919049b39292d76eb6b8ee46bd1932df60f7fd99eee3c4705d65587b6d8c9e219dadfb08ebea895789eebdaa97be7c0a75e013a71cfe4bd4a5acea9b213fe29cf169f9b252fee67f78ab2b2bf62baffb66b4718f4b4a82a7e9ef5b4fc355d84382" + }, + { + "tcId": 1425, + "dkm": "72ad08e016f28353d9378b4765a088f832686bea5625c4243e438ae3b44032f7c3e8acb3c553736f019a3bd9deed9edf4c350b5ae5cf29746d32739942afa6e3cf02d94b09a0e4bd79cebc08af8738adddf1d4bfd93c3a51a77b600fac148593e52f08e487aa459afe5022c42d2ed0fcbf58d0ae88666237e67c6146adb4dbc9" + } + ] + }, + { + "tgId": 58, + "tests": [ + { + "tcId": 1426, + "dkm": "b773e5b4764123dcaaa1e3b7da550e47b69b6c6e389846302f7ddc53c3313ac23f4e651eadcf0c063ba91e63c66f648fe893c374940f64eedbcfb5d5ea21ded67d7421844c618419eb3c1b39742db4f97c84ab6028d9e5ce6bbf06c3b3ca2ff7b55529fe309887b37e2710e007901ed2cd8cb8a06fa68b1aa489e87404a6b5f0" + }, + { + "tcId": 1427, + "dkm": "fd7b3464087a10b93188587018aaf091f9423cbcd2a260bcec27257264a33efb34131e387ee3aea0d34c27c91796fda0981cc9bae2bdeb7c38a1893f043cbfd7ba60301d6d4d74f3fce887e8c4c7b6b36eb9db9573bdea76c46ae63fbe63d02799cb086e4c77a096837f8c4e26e9834e049d0448cdbc1dd5eb003df9fd8a5f80" + }, + { + "tcId": 1428, + "dkm": "7b8b1c3faa8da14888f834916a1cb10aa0f781d249d078694178e54bbe4c2ad485b7cdd66d598510656a356d55538d3bb58f9a3cb080dc406bf198cad30e9b5333055d2cedb3a293dddcd4e43cca0ce842e01bf2a2c481ee95ae5a16a84d522d1df7b324271cd90ef864da212ecf2424974cf63e762fd08f4634ffa59dc9b03a" + }, + { + "tcId": 1429, + "dkm": "a903f6177c48bc039ef1d1670465836616b90ae20c56a7204589d0d96408c024aa00e73ed70b5714d426a39dad3641b1000a8e0f62b6b8ee3afe62a4f27018c98144622a69117fc5446cabc4708e71bf9d9af64a5fe25391ec7352bdd17447c06283648324f2caa52015b62c4dcde0e2d2c59edc8bdc7aa79648577dad5be094" + }, + { + "tcId": 1430, + "dkm": "fadbae142d937bece35da41abbb3f079565c8249d622ea6c1c4be7b67f9acdb38c13709d48009abb60ff611c491695968bed10516613ffe19636558f2779c7aa515cff64538cfe96d44df898aa6f8cbed2339413f169182dae78e90d94a64ebac4f7bc95e47c8c0a84b414cc439e45acd3c346dfbb815d2df59da3148cb9b262" + }, + { + "tcId": 1431, + "dkm": "11b4597eb65d4200f1efdba36432006c9d9472e0ee3f464df1b9e8df537950e65ae155d58d0ba2a4061ac414c47b375abe6178853fd84a46e1ffda9740cd0459802e6a24b70659958a0455f1e6532343066fc6c09ca2129f9eb77c391902afcd08c03273a447b3e00e9bff2bbac3ef6505eb8b68a537f39cd43a0974ac6774fa" + }, + { + "tcId": 1432, + "dkm": "a8a2900a50fb7b940258bbb0c6ef27043140efd78672938a12fade03da55cf598c2af0558fcca083e86a09902992dc09e9c7eca8785cba8713d38aee4d722871d9da48dd804a7a4b6ff6ac5c2440b52b67f95f8281b9fe87c54986767e7c78eb73dbc09c31f4c2017d7a25fe7e6ebc429fc3f7311018a9e011ca0a985c391b83" + }, + { + "tcId": 1433, + "dkm": "5b559f1e00ef971727ff927eab25fde2901733b31618913c18e21295fb5455572b579d64252fe01749c78737b85b4fde1be141a356e57b0a2be07eeaaef24db09297ce89a0758eb98d97694ea93bfe57f3906812431416ace5a76681bdde7ffddc55cfc5de8aa649d84056182885085963cfdb4a18e79e85248f9b37a3b2459a" + }, + { + "tcId": 1434, + "dkm": "ccd5da00646b3c83a24ab3256864604528ee46a2b775b0aae68321ffd7e5a51055ddd19d98327b46bc9a69b2f83e77708ed251cb01ce4766f3a79676b254d5203f55862859099ededf721dacdcd9c4b3a23fcf5d0eaf4bc8841e0dcb90b5dcffefb0053268fe22e60621265bd355974a407ac1cbf18ac2a6b2ffe285179eb050" + }, + { + "tcId": 1435, + "dkm": "83596299d4aa9a8350933ebd549acf30c284102c14b72f3f5ef479caea6070b6b63ddf99f855515ced05d605dc6a85490a6d8f5c577c6aacc63dbb4aa29421590229ebf001b72a2e1727496fc4c9cf18fead3ef9931bf53448501dc43aa460239c262ba5d940f9a3bad895f0b2e46579abfc7473184a047929841efc83991f4d" + }, + { + "tcId": 1436, + "dkm": "edc8db85ae7b34ed83b19a3aed46b0ca2dea70009e4ea596d99f4e368807e6bda8e464d2f22020bdb7edb51f0c04016fa077e8a0ce3000d1ef0a8d106a7ecc5158826abce7c42a15de2f5f75679598bbf8e686502956f42d47e5d4f346566ad4b3db0ec840447ec55db991586ca9175d270717616033c41352a107f3183a3de4" + }, + { + "tcId": 1437, + "dkm": "c6ba207a003fd12681d61f1ecbf77a4244db5d2423ce12bf07139d0e998c8924d6934326a2c43459756bc1aabe4193f471364b3a24018e53cc8a510593c81e9e7155e349ed3897831226343727882ce229a708afd01dc3b556edf92db112edcbcd56d816c88c9a3847d447b372b4d1f8c7593f5bf7d936df64d88b1356cf2e2b" + }, + { + "tcId": 1438, + "dkm": "6ba662980b3ccbf259363f3e23fb92f03bda50443f86468c681a4fc7097da6ed955712df20af869bd97d135696e87c29f263d194409b86c725f67134990c5fac2104619d677fbc5376b8705ed58f30ecfbe37bd76d0837641f8e61dcec611c76e57eb156bf89e7e4bc4ae0163e9dd1d8da45e739363715cddd93095311453b1d" + }, + { + "tcId": 1439, + "dkm": "da7e03262a4d065e9930b0200de21d21febfab5ce1130901373cd166e2291bfe6e21f69a1f108965a940f18490838f2780c4f9bd0f77228789866df51f10e409aa97514acaa48c5f6cc31508397d180c1e05c25432707e2086e12069e68be8fe0798763d52b0c6e588f9e42db53a14a5ed299c3624d28f8108f309672317098b" + }, + { + "tcId": 1440, + "dkm": "411f4313248ac630c5829d9678f19209eb65d79d19961ce1223791550673d43fa50591e20567b2f480b46c879601bb8715168a9c385d65702420045c6694a14cf8240d288dcec6c4fab079ad05a44cd05bd6600417db6e39add68561b0ce043749cf1a23723cb829c554035f31d6f02f08cc9d4aac7ecfaf9b504b1e944ca976" + }, + { + "tcId": 1441, + "dkm": "46a545196c45413cd6589d384cdf7b6e231fe72dae54bd87d0af922d7f76d91b212d842e75636b0d519ebf65ac358a8bae72c8b50a476d01bded88e8e37f8540584280897d3eceb3bc76c1e8da8557105f6f1f581c61cc942abdf1afbf7136515635e375972ef2499fd928dec433c3ee7f4ee12150d355560f0273b0b2d96793" + }, + { + "tcId": 1442, + "dkm": "059adb28ee984d1e43d4c0816ed2f0d23b99453b86f8d6a0bd3168e6d5f7e2b3d11afaf74d4045d81d63a6c7740c7dd9a3924b60205204ff92e35909e76983fa1b1b3b2d3642181414c116de7f2466d9fc211fcc19030d7cd1fededf68b734ae503d01d067e6017fa563493aef6e4db29f3493ddc832a4e28d76969d73283857" + }, + { + "tcId": 1443, + "dkm": "2b6263798e6f9c6837a9b982040c8dcc470dbec95ab67c2f99f4a345901f35833ad837dfe7640a45f5382a122ce9bcf3ad4f32562703c1a9eb8b9d0f5929edfa280ed335e235ee9f7750d471e1e96d543822525c9288e6af2eca7148fad6a3e9598fe9ed7b45ba95c0a0c0eb93bd80664aced156a7d8eab0038fb67cbd9f8621" + }, + { + "tcId": 1444, + "dkm": "98c8996a9d4613acc831319b294a2375599c462ccaccee0ad34a358fb8bdf03b1000a4f963d763938979fb1faf89c217e618d8cbaf533b4546d624d34047c39c47749bd78997d6faa2cafec23cf999f9706fa5a0ae42d60e6361122c42eb1d2ec0b705c042582b09007be961fe14fccc6a26bc218163f53b3af735a2a06ad728" + }, + { + "tcId": 1445, + "dkm": "6fc16b2b83f6435a980f8659e6653b8feca680b3150dcca4ea93f720e24673045b349ee5d9d353b7851590d55b46d0b6805a5eabb7e12c329462b807c051d0027949ece2aa05952dc0f6580a152357927bd22754e43af7a71656f30be55915ec259c5d582e9951224e62fbb4e724edba4eee86adc422a1dd213f6842a8fb2027" + }, + { + "tcId": 1446, + "dkm": "1e7493855c0bf5843c96bab8250f6a47246b0abf0d486280fdff443cb36f052635843e6ca24f813fb659510beb3b6ee20b954ce1450b40917aef4692bbe086014df48f228883b6b1d5592481f7ec7d83af8294ddfc930d3984a92be787ab3031614e43ba9d3bacd497c9f0e22d2092d6a0831594b9ac8126b98f15b2c6f16a55" + }, + { + "tcId": 1447, + "dkm": "96e2d53d99007c4f88b71a15fcd636134887c033b3ff361712a750f689e79c815b35cb2d6d4c8e994d28bf9b494e2f29ab18a54bd6d6fc195fed085edad516890f116c8ed88c59b72c3bebf628c27326356e2d4fe392de10ccbb33096cc3d43574f332d5e519329f2113679a51b2d47f40b9c17ae1154785ff3e4a4147f36575" + }, + { + "tcId": 1448, + "dkm": "ccae6f5dba42644ae52761858b6eea558a7f76f1bb1ac4110c4751c0d03602b46b5313dba971cc606126a665dca9cecee6ad62a6dfd3fbcb9e1b5a953085c9d8d8bad2e9ca86c8f7910dd9772772c59eaacdeab0d6cc61cc525623ee1a885b83d2f6e11877b27da4748516d6eed88f5dd8b024eff70114681bb5b74e7dc9b190" + }, + { + "tcId": 1449, + "dkm": "b34780ffc91e0ad2c597e905f5c44d30c61c95996a35c4d5856d6e0f3f1b743c59153e4287ded67462cc3bb2c22e2bd2ea0fc8cb67191604ec489ca7ab03dc8811715715c66dc00a5af7f28e1d807d292784dcc41aeaec2232692fee5e51fdd9e46b183ace6c293b0f0ccefe72ebb14db54d37adc86b7b0a9794b35dbd4b3cd8" + }, + { + "tcId": 1450, + "dkm": "de37c4e4b8974cd08dc6b2cddf168188739c043ce707ff1b04a21b1cc6c459cd5ae1213104f403584452e98bbd43269f19677476ba6a0808d919f5ea4672f1617062c8065d266dce1d01f495f496c741df7350068d5293c08512e3c2f1a83a1bbdbf1bab5d744a8eb970de4416d00fd4c4df6608204840d314aa81269f7e49c0" + } + ] + }, + { + "tgId": 59, + "tests": [ + { + "tcId": 1451, + "dkm": "988f17dfb85bf87b36d921b2bc52958ed1b385c8cd3a0739138ee25033e37b06f59672436e121b6c542a2182f2d1782bec3f453e8364d1ca15987b1bcd9aac2f277aa90bac5282fb87b9c8b69a8fd9a4d459bdd0e98ffa62f9cef588b82fc844269e63fdd2c6968c84d1f51f00f8c7d59508743654cd2cf58f5b7ee0fb5140c6" + }, + { + "tcId": 1452, + "dkm": "afee02c652af3ea09b41b11442a6033e4ebc6f5272addfdba81d37e4d0b6afb9633b85d966d2c9daf75daf2a95f27d92653405c801124ca5673aef6e8508857f6b07f1c6cea8247ff1c410bd74653bb2463cb2070eeebbdd5107307e1f098208cbf98f8ba269bd44f134ea4eb88e73fc5efe65f5d019e60727f66de1b645394b" + }, + { + "tcId": 1453, + "dkm": "25cca56a5293cd349a318252201b6e93e33eab22eb16bd33ca99d0af5729d43cbf81b2a3fb4ea7d27daa99d449571a29020989a001b7de0efdeddc17e3547a4c88287a9243ddb7c78f9334685555650fa74bfb927f527507bc48025a47fa5198e877c36ec69e326737cf21698875bc01c8ae000580af5a455edc234b70192a1e" + }, + { + "tcId": 1454, + "dkm": "f12c91aeb4e33e03739e40b9d0772cb9f49de19b9ae1500b7a20340c7c1b5e207f8da01f97ec293a0098817815c7c81cfa56f6d9b60f639784d875b0bc99d6dde7c53e0d6b2c2dd6a1a18ccda5f440936068df8464e298a51724bb65e3a844f3db69ffdb052f4c35e52aec0f8373dd1ec7893016cd862371b485b6e0b86a38aa" + }, + { + "tcId": 1455, + "dkm": "1e0f884781431b8c850cf97d394f592d01715eafe59b2fa8a61512ea084e88ff098e7d2b94b9cca2879c6438ab432461bb6ae1af76681262c34d8aa00380896e4d431cb273c9d8e6ab186d03d578afd7fcec05515d1b4aa2dfae6ae1fec22d2826690837a6ee5f41ff1493dd4e3124905245d33ac657996e2ffe85d576f612fb" + }, + { + "tcId": 1456, + "dkm": "39ca2790c9b9b46d2b23672008a0746920d5a10a66ca50b951114f5fd7503803ee84f48bc84e1cda2054ee10f5eb4e8552f2f59543bd40c8ecafb34b44cc81af13b748422d22e108dc5fc63b96cd8ce06f0ef4c0cb2293c2ed39ccbd0d1273c24cb81427772637bfc48fc624154a506cbfcbe557c43dc942d9846f912004e56b" + }, + { + "tcId": 1457, + "dkm": "d1c51617ecf9e38eeef14d87e6b93e6e12aa58b7a02a107af24927b209ec530b9c0101ed0dbbcd50d6024c6904d21882d8e8888b6cedaddeb146cf3c1a773e77c4956fbbaf17f0e62dc204f6bfeb31412e3d141c0afab976f5ddeb8e3742ab96e8c47a194b341df7db4a73f78e57975a37fa2e86c26468c292995c6ab2890ba1" + }, + { + "tcId": 1458, + "dkm": "4e64e025eac9ce748fa092615ea1e9c18f5607ebcd8a081d6ee9cfa575e983b1e2b37c1e26244286879a2e3d884614d475c28f989ac79e063240dd51ce8e2470900ab4593223a61bb65b883da0c38439bc15a343e3e8b6166f9483d0b249ce90a2d90533492e9c5d397db1e7870caf121f03f142185ab13fa3e303c4250fa08e" + }, + { + "tcId": 1459, + "dkm": "cb9795f7a919d91badf0cfadc28aa911373da28573a988b0992f4d77fb11cae9f627bd3584fd116dd6adf84dccc5ad90ccd3aa6fd3fd73394e0830b6ba0cab73cabaf5a356c534606488ac131eeffddc4c9634d15068b0fbcb88bd1d864edbfdb7712271aa3a8cb46b25eaa2a1237e9b64a6042d9f7378f0da51b3d31af4e371" + }, + { + "tcId": 1460, + "dkm": "059809a6578349c3d1f4709b0704c9f869373e1a4d88a0e2e3b224be82677d62c4a9c4a1beef9124ee05b630dc95dc5110b347b2b50c0e552361ba924a9d4efb22b644bcb553d97b4e895bb86a13fcbcc2f0c1b9cf04ceab224001e47171b6e243eb36ee386dc79d665f16a377cd4d4d8d3e18490a9faf09d16f63e927531763" + }, + { + "tcId": 1461, + "dkm": "964faf814dac1e3c989b2495d6851ab30337e063b907572348e971ec5d46ac174af47951f6524a340f06f37e5eb4157f6a630ab6c2ac72dc14fd7c244bfde3c986d9875c9e7228c93cc37d1830efd6dfef63b893370d008c1c074c743e6eb95f0eb7bb78379bdf413eaba2cc30b7bf07083967d76186fcaad865f132c2e64556" + }, + { + "tcId": 1462, + "dkm": "c1a54995ff5f0af84244a8e48eba1d17314c9ae2c9edb89b2c9e7edfe27bd49c6d23a59e93b25ce982042e971131d7cdabd6a51393167e9095d58746ef8579ded7012b2edb440f3064ae5173c00716f45996a2e441c1ae81b187639723464169f24da1f9dfb8825cb9b1733d06e3a660db31b409876d9fd31c0b29058a449365" + }, + { + "tcId": 1463, + "dkm": "ff4b402e5ed3c4096c4ead7aa8373d263a58fdc8111d2d12b0bebc236cba958f188fe9d41315915c5046fa5bd6d81bff14ee4cadfce7de450c365e217f0470d4bda36b6a7d3ebe4437f9e1534fa79c0c8a67bdb1a78437fc918ca5679258693ef568267aa2e9f5a1c8fc7e7e421c709c09542205af837bb2a26d9c913ce7ebb1" + }, + { + "tcId": 1464, + "dkm": "25c2e3ad1ef856d909e114e6a4de44dd7731d5a12f1455db28b308482cab732772342e39c36ffdc8c2de5eeebc3ce015e7caa69aa8cd9c9f0769bb586a003f9b792800d6306a45905268975433413ea5750bdf183e7286dbf4eba25dcf973fc2196edb94306892062f3256943cb0aa7987ac4eb5c10119ddf3aa90310b939cce" + }, + { + "tcId": 1465, + "dkm": "d4b50bc91411e9da449d333426a712a3ca8f3a76069bbe5be8e228d6c5cc0ae74fe39602ddac0f0774884a407936180b89c7b25894064dd26327ddb08a4e38bd9785fe6751ab05e30b552b204c9cde1a641637120f1d348e84b53bde701f160880a8673630cbf71e216ba867604762b4e91f29f76bb8da683a88954621df45f8" + }, + { + "tcId": 1466, + "dkm": "ec6442bb20830873347d91c212f9e2f6ead138363c38d87691a50ca37a420aa507b313b6537e25875f7ec17b0ddb0f214fd0e2f861e327af3b4f47f6310b4c884c67db20c54a6a72d4479d770140bca8677cded7a3bc9dfb57ef030ec6b9ab8cefc313fe244a8a23b22857db0a9d45e3ba7905853926ff333693ec209c6a7cb8" + }, + { + "tcId": 1467, + "dkm": "aa0184aba5a046446dcebecde37490010d5ff092f7a687103884e565c340a33ed0754a83e74fa4604e8025ba2d9a3944cce81b2f8c63a706d67c9e99b2bf5dfe30b56f4adb6bbeb7648677e68bd0f0bd1c611faee0d9956ea76802d18b76b4d135fd5268c057afd86d263c94c6640fd8bddb4df918046bcfaf708922212cce32" + }, + { + "tcId": 1468, + "dkm": "ccfa1475aeade69034406e36b56603076ce4a22d0b5fd0df59046f5cafe98dfcfdc5bf452840eb77566c89e40619315446af647027e829ec0e9de6797523421400d3e886982d8efee3c5f09935f8ba821f9d098a7d33b5d8600fd625d2b5287b95205573f8a379389d607028e676c74508c7530957ebe4287d7d01ea26f17eb6" + }, + { + "tcId": 1469, + "dkm": "6637e2cc0241f95e062f4cfb10de5a6f346587023d5a333af02427c3c01efe1a90170f06829b10a8da685af5162493d29e91311c1aafe8923a4106943bf94f19bb0e0294bfc46e0baeff32445c9913f89c5ffb061c3614ab44db68123725db29edc954af000a4dedbe7e3e88a055619cc1e32bfe1281c090d697a96da58caae6" + }, + { + "tcId": 1470, + "dkm": "ab54a922638b76afad4a72e102f1b5cb25b6337d82cee7dd58618f0ffbb69e986ff8be3c0d034659e8711873f015716f4306090117c982d05f6c251d939df9c24b9c31f73cda580e7c617e01b62a66c6ebefe76963fab257bcfcf507f7242e87dab855f861baa6270bb1d6472790a7edabbd318b5918530d4c7d813709cb81c5" + }, + { + "tcId": 1471, + "dkm": "2df7b846b2d3dcf383fbdff16f742aa19de76e28823b259c73a0976f57cc7a911a3a0f1b913e6ef3c0d2977ccdbdf55adb98b42ab5b7873c183123d0095d5cdd7bcf92462e1001b49dec32c182731adf78eed91bc58ac1b9bb6e3e45ea480a636a27f6b77851532eee8bb14a39199b2eab0cc28012dde358ad0a593b0ed92578" + }, + { + "tcId": 1472, + "dkm": "4d58adeb40336ad13de13ab110eb08ddefd6bae43a9ae6c68eeb24a67afeb4d9e22f3aa85dfa4ff7f72a26443b1583c3234a112e1e3e747b2efd7b7b9cde19174f1c28e69993ef40914e0228e53c77d42a0ed001c1a759fea76cd5fb6bfcd1e8eeb483e37e4ab6cbc5415c6ad92401f37b7af86ea5baf0205a1928c2a5226115" + }, + { + "tcId": 1473, + "dkm": "53ab3b6be7080c1aa1cc303a45a3e60ce6a5729f96e1ada70675d6ed32dec74ad6fdbab7ceab821ff98ce7b52d7f4450ebc9e5274d6b973ca2f7012f54dbf35d21bab33c0c8bc7503736ec95a05ed43df607d0e481acc978fba321b4e620b752832e3d6f3c4e85a619c0ea7cd5cdfd3cc284e7a2ae313b91ce7c71ae257cbc5f" + }, + { + "tcId": 1474, + "dkm": "0c72a870e5467cc1229f036f5df0b9f15020640885dc854bbfe322a8549e78ce2852ded24f3f0f21f864c9a9fbbdb32fcc72137de7cd273e06e168192e5daf00ebd7bd4faf3e0dd205d346922d52d60b02267bc16e50a1047eb08260ff974dc9267e31c271633f197e2729d45e9e183493f2d0307b5f485756bc31a5af2a328a" + }, + { + "tcId": 1475, + "dkm": "562da6b9159a0511a1d18cb736efcc5d9494454021e861b28415e9f4a0647197270a8ddecbf06f6420c02dd304fed6d680ba73d5870ebfe1554ace5fc57b9c6312d77a8ead539e2dcea9d4cd581dfd39495adb63a02890e3e0e78075647abcfa74a9326274e9ab007513cb9bc956bbe28cebcdba15c016edc2391243fcbeb2b3" + } + ] + }, + { + "tgId": 60, + "tests": [ + { + "tcId": 1476, + "dkm": "706f38a445a4dd824bec407c8d1c90a8c3de915bb7ee8b835dc31f110bbaf4caaa879c216d6bd741b9de5196d5eef947f0bfd5f4ffc3865fbc8f1cfb09333bdb241b9cda911547bec4eb13cc610d637c01d692c2f79ec44732fb46377b94e7935ceafa763b17aaa258372e054bbe884eb896c0c164cbe34f10fcce56e04fa85e" + }, + { + "tcId": 1477, + "dkm": "80d69830d40de5904571acbdcb67d0b99e6eac909c7f18590fe79321a040023a34467ffebb5db00b1bd66b4624b06998870423d9d12443409f9811c94b527c175124767b8a8926e1973ac548c5a0155e99861e862fb808776d14716cc03237c79e3a2677fa0c3df70e7eb57e159687d691b55a9115325545956ede448f993673" + }, + { + "tcId": 1478, + "dkm": "d5ea725a7c77c163e54502285908b0f22ff7dd18b44ff0caf60108311e1fe3a6f08a39408a0ff05b1b0f5c075f1969d25e8d6d7d3c076203b70e4907d138d8a59e7472a49d3cee89d3311e2fcb21e03ea1af1098f4cd043bbdf8cd9adad0635cfe7f478ccc68df7ea252f5cbc89b247abdbc57d1e9ec8b15e6cc92d44dd38aca" + }, + { + "tcId": 1479, + "dkm": "3b74998276bfa4eaaee51660b5263840a7ad4e357466fa4e7df898f49c5e0047cfc0065bf2db084d2a626031955e6c76497a307ebd52a49336015eb95c9586c2f5210187ac7962d3de70fcbbb7d6802be08f8294fd573ddd579187a65a713f740c611de26eb0744987b1754a145860dba1b8e17259bf8c599e6b0784e5c0b5e6" + }, + { + "tcId": 1480, + "dkm": "fc2efef8bce99606d7a3c7b590591c30d4f71368a0d2d6ec1fac645481012b59e5437e857c4b09c639003c17a1306e540637305595192cbd9bfeeeaeef338edcb90700c844dd762151b24504e5639bfe9a290679fc7392c5935dd241402004756db12b1f9ed0c37cfa6e00415b102dd4a15cbfc68a2e17764f6e83437a887b76" + }, + { + "tcId": 1481, + "dkm": "18c4c53a0331da07ff9702a33e44c10b2ddb0f7584f7b7aaef81f36c0536e24e2ec9cdee383d289a360319584a850b4428db2c17dbc1fd9cc40fb7461073c95cf46c084b880da0d464df3c6c02fd39c66500e8d6f1a6f0bbfe4e725087ddae4754e158b29a1fba4d2bd02e0b4d0ba9add263821df0f596780c982ccc797cad24" + }, + { + "tcId": 1482, + "dkm": "54451053d923ddba39a0a7dea6768084a978adead3471d4c09d0889a38761a3569595dfd9b401fe08d2878260c25952eb4b2f91af13a446b74550ca3279ab2478a604dafc738222f83407ea48c1ccc766ad267a91dbe957e8411e49217cf10f3381706a1182a8b91d07a6b3aa0da52c8a412ccfdedc9a3da79f7684e8b711d98" + }, + { + "tcId": 1483, + "dkm": "0907898738e1bdc882b34126a091546e2a4cbac11625d646332a2670c3bd31c70f1d0f746ecc20f636cc50f31f55abf4d6e2fdf72f87db19bc08cf08aba42d4da2b705c2aa513f340da2626ac23c6fc6a14eee27b7e07d4b0db75045db2bc1b7eb323127dfdcbc3824f29b0022cbeb4eda706302f6319e70b4b1a6eba5e7bbc4" + }, + { + "tcId": 1484, + "dkm": "a004061f946ea1de88883b72042ff66432025bff958351c694f0bfd8d611374318bb998f521333f3fad34c8d97866655076788c6c583afaf7b6b47f03745fe5497c75d608be6eec3ad4e53a16910f595d173d928d078b0cf09532bb072ff756d8bdf754a2c34fcbc090e2c1829ca584257b6401c2302a68e090ac50c0cff4bb8" + }, + { + "tcId": 1485, + "dkm": "207be7e4afd1f8fd912ae06073cd32b37e1b71e8babfb646a44a271dab07855b45f77dd45030840133e82171ee7cffe3144db8967e570d597e17659dcfa61932db881c2ab7c3f2faa72ccecbc3b784652e0960528755c3692246cb294b3aef9154ef8104ead06f0b7cdca4030a1a954ada1c1371850e07211a1c30f76a94991e" + }, + { + "tcId": 1486, + "dkm": "b1a25fa5c13bbf995b40aaf8662c6acd807f00f88afee7e880125425cbb6eabcdb4495f4b2117d0735074a4a61bdd40c25520dfe0e13d88029e67b59affbee64e1f1006a15965af229e819590b0c9f5289b441caec7a289dec9fda37709283765ec756fe799b4ad1983f03997ff606c8d68d1bddbae6f4471b8a569426003ffc" + }, + { + "tcId": 1487, + "dkm": "a0d014506d5fe17698d6dd57c57eb0a1b3ef0e464d29ab4c86d77f9143a7b3e8ff130a977349e8fba4570f5ab046e53435d23c9f22ec07087b711f218b9ca8d1214c9a6bdabcf9a6631fb554a5655c3a9c5b4d4f9b69dfced744540a57109cd0fc7e8bc482ed95025b30dac8e37081c3fccf45830e462c6aed4683e89b6e5ed2" + }, + { + "tcId": 1488, + "dkm": "e8e7eb3e0031b551bc0c5f9222d80b91e479392004c3dd0dd912b546e67f6eaa11f4e17dc35853719760d232af9a34e7f9ad20dd9e726978cc8183999caf6644115c283a1cca843f519e20ae64d05c72ef4f501cfb4302b89418afa83cc0a0c7c06ffbd05667855a5b0c49972ac8a67b1fba5930e75a4e6a674bcbb13ecee958" + }, + { + "tcId": 1489, + "dkm": "6ec42207fe214d503a4d457dd981eb690ff701ccf75ac820858b7d89d8dc0f59e5461aa030b9520398fb6c191b5d9b217c81f306b21b0a966c519e6f49cfde2678f64d6ee9fc40d6c17adf7799edc1933ccdaff9f67153d4fd3ef23b40c7644371a8398f88e1c4d5f6d271516f7f179471f773572877a197177d959e953c95b0" + }, + { + "tcId": 1490, + "dkm": "7a7f255686ea3d4a4592d241b4b1dde12243c71c27c588fd6d047decb2700585719274dee753469e2ebaec40d0453d19f8c74455f8ce77cc35baa3604de96cd7cc8bb23b99e8200dd00840bda3e564c9ad3f3caa80958faab30ece430292c736b2c05d2213630ce2e536d21c59b277ef3c159e514b9594702cc38dfb5daaca69" + }, + { + "tcId": 1491, + "dkm": "5180c86160c0dc713d0c622d156d1fa05cc1a122c01cd9f708c5a0442428b0cbdc883b5a55f18be7ee8c83a2af5c6f182178cf7004f5c00d48d37cc0c58fd990042058647e16962613d4347f02c833bb98e2eb6abe2d23bb194e62f4ce9ffdc31f6c598d73336f14e8ddb2ab65e16ffdde59f79159504a31038a8267664b29a2" + }, + { + "tcId": 1492, + "dkm": "3a39fd9affa77381a28e3e7040a2976982bab45ffaed6cd00c760d4bb28d8732b5eafffc3521c1027bc9090b39cd73c6487f767ba2ffe77c8a9263992057293f9817d44054fa3e8888500e356850eb9f157f740c983d534893fb4f2f592cfaa9d91261925ca8295088cea21ff80bed23995cbabd87df9c165f99b932a8780b5b" + }, + { + "tcId": 1493, + "dkm": "53f4f2fcbd7ef2ee1ba2b0d205df703ace832d60e2c488673c91161dbf1350e2883e4a4d283b5da3e1cd6ca3e7084535b8a1b0607d84a2917f170df07a0d0491ea3bcb29709a39a79ce397ef3cd8632844b7ddaebea25082f71c8898c4634d5ca36c47eb3e60474cbcbd7a939ea9ded12efc3930b6ed43a3c989f2bc18229d5a" + }, + { + "tcId": 1494, + "dkm": "4b2fc7e9d5001785dd97f6b3afe56ed92481e562070d2210aa709726bcb5a8a0cd309c0ab392c4f6b6b3c626b8848d188621588fb1984d217a21baa7b27b4c6ac9c0cc2bcec25ee01ce82896e99c8b99610f1c169ae035c489f0d8fe84339faac0f06a1e24709851b393b65aa27479359c8607d483d342b0a6f782579bbfd403" + }, + { + "tcId": 1495, + "dkm": "9dc8900748fe86f6104dc5f86d2c4654c6a46f316d20aafca0fa6625b3bb8f5e6d7630da64962ed62eaf3cbd7ee320d1c425d4da5eb2507cd1bd34469be3fc96b74996deb4318194aafc3bd82e2e3d313d30661bba5bafd4f507744a12fcafdaf46bde615aa37848346d44c08b731b51caa50101bae54112b9fc3b9c62e7a560" + }, + { + "tcId": 1496, + "dkm": "fa7d588e218a42e5998da57823edac570bbc2d895fead27fbddb1a86703b5b2fca31ff3e1048f8fcc567f49d652c99e9bb4b54cbd14decd345c1a75a316bc093db862d26c097030b29f26e9fb12f52016e83a1df864cadbbc88957d64890ef413e2d58dac0af196d7acf3c473bf994acfa85c8bf11a5316bac37b7d920d38e1c" + }, + { + "tcId": 1497, + "dkm": "6aa5ce1883c5ee1ce61188e7d421f349c1e39d3841fc4709dced63d4e45b2cfd4e74c103c2f59169344df8ee46775bd1ef8b0c19d2f3c70a83efd6e1bbca9f4b9946ac12755b2b1d439dbedc8279b450191215f1f5528a3620f828f38970fd170f726d8e568f5398566368042928ecff654df2f92f5bc9b43f87da9d190aeca1" + }, + { + "tcId": 1498, + "dkm": "69a402959795eae4ade08eb98fd2e5c2d4f9eb5e155017f794afdda35c4d3f2f015a2d271945639dc82f5212d9f2cd7dd1460ece43eb4a8520f3778b28e054a8e00e7870f155c3cad2a470b8bc4b6f227152749da3d478a23a277c00fabd10d6d7eb7a68b54ca3410722a567d57b3a6172c905dd999897e23380d79d0d1e3034" + }, + { + "tcId": 1499, + "dkm": "a8648c25c61986d76972a05e95d8ee0b5b467aed016b59d7d499349392f1ea3c25d2cd41d7bd6327430a3e6e5f7fe1090d4ecc04bfabde09911fd8b5d1e9635771cd3df393a27b86e04601896f93edaf7b261931e8857c39ee89e36645cf8e42bb1c3d4f9551e1a62c35fe18a39d3a5de33e6b5bc364e75be2ce26bb289a8118" + }, + { + "tcId": 1500, + "dkm": "0b325f1668ebc03d7fe72d3c6fa21d422f882eb6343a8ffa291d01f411f92b75156a3497c0341ee278cef5579f4c0b5dc5dd03dda9833182bc1d3847bb2bfde55394fd0b9f886e22694766b4964bd2fe2111eee42ebf3d8c225585587590a35e949947e38ce5de692746817867a5782367d2ee2e67ff01dc76532bfcd7749c34" + } + ] + }, + { + "tgId": 61, + "tests": [ + { + "tcId": 1501, + "dkm": "68e33a147724d78cff38a6527fb052973f5acce7fd44e4c4a9e8752f3ba9fa4d394c37e2764e563ba2f221dd25926697a73b4210193bdeb6f3d9d9509155be542ae70847dabda796c325b1c306eaeb16098b21ed66c31482ccf2c199b638adad0388d0c01df48313b0bde003e168e3b32f428ff4c1e8f59fa2c9fa11a33910ad" + }, + { + "tcId": 1502, + "dkm": "94e95f5fa1de0066a059a3e2ca6ad4e15309a402cce3e0abe05073225032012db96c96cbd0ba11465536719741734be42fee8ba0aa6147d6ba7ac67105c17a4aef9fffdccd89a4eec5bedb18ede26c19509647af40ed7a05a6eefe4b64964619d744a6f3eca5f18a49c220099d45729e1ead8167975eb64e914fc68ab28cf8cf" + }, + { + "tcId": 1503, + "dkm": "7a7401e343f409fb9a8d0fadf94e7c5081921dc7cfc3f2124aaaba1bbb16fc986d45d4599efc4b20391513b45a2ba52eea8e40564726ed2294d9ce2177c850a21a8c4332edf19a03d07fe26850f776f1b532fee9498144ed62b3cbada5ce35b05001ae12a3790e39403288cf31d516db987bfcc9de1c93cbfccb411c5a08d792" + }, + { + "tcId": 1504, + "dkm": "92ab5ef10025f8a224203d2f9cdc4769144bac8e9679faf750dafe7ae9d9911ffba7e8c6858314b605cbcd32ef9e4f189cb574d6e4ab267d7835dca7933400a6fa226dc34315b37caa7bd149b76267b39b59065ea88e7177c09a0b2e8db9fbf93a336c3066a3875ed46634065e7e3174dc623906c3ab79126a0411d491eca5b3" + }, + { + "tcId": 1505, + "dkm": "fce68c7f4d7393db2e8ed1469eaa85964421c93b44ef32375127ef3e9230c6dfa69c45c4c6a25aceba5f4e2d9e3a65be46c2d6a2737325863718269a230adb3777fc48d36499c6aa64ce589eda052cc495b088f2b5ee3787b1043c2a431ac86aff66fcc93ad0dfb0fb3babda34e7b9f542046a049aeca555127374c5c7e565d0" + }, + { + "tcId": 1506, + "dkm": "606a57348435778f99778d0098849faa0bf643456ae2439a84c24361ae4250a6eb7116ac41409b774def12d27d350cb96ac75a19fd681437e84c7d5b45a4264b8073897e1ae4816cc320ce48f9e3391a93fbdbe19383918d3fe8b91d94a9af7e242fdf5a336990239653e636a99299180ffe2d2b3e1ecad09139bd73444b1719" + }, + { + "tcId": 1507, + "dkm": "20031ca8c627c64bf3be3a3bbe8df8134d2d99e5770f8cecb8b97d660887b5cbf0ae1b025fe2facedb0a70b0601ef4c3c3592b7e8336bfabafcd7cf781cb7c92f7b44a8fb8fa126f1e77560b068e0756a4c4830d59d20ca86fa3bb77f573f6b5db2d0187f23d2d2e80dd518abbe5f66afdda99e12687bbe7e5a21a1eff1bc323" + }, + { + "tcId": 1508, + "dkm": "6cd490b40401318bebec4e78a1716565cfc16dc7b976efe33c4ff75374c94da63a4061df456416be3ea7db2fed9d212bd991de17da2b39bd387d9bafc07065469185ac47907615cf8fc3e9e1a423a6c2973edd1ee425edf16b781fd75e49ff6fd76abb40ee46887f3d842489948984f81d70db5641f0d7575b23e48e29367cc3" + }, + { + "tcId": 1509, + "dkm": "7ff46433057e361215f19816f78dab6206e90e6ef33f2ab11dc2ed538e4551cd96059b424fd82843600a919b11ffaa827be1845dbfcf1eb14ef90b62e682f61fe42fcce1816b3afe72acf53f252b2d4e79bcae07eb5b80833d120afb8894be63aa528a5050e03f6a3981cf45515a0439dbeceba05e810b953fbdc83019f67eba" + }, + { + "tcId": 1510, + "dkm": "f7716813accb5500047cc78bf422c28930178c9f6a544773149624e396dd9668b3e468271564b87723ceaab8413ce0316d2ca5f6f02c5bf60ca0178228dae566584c817e959aeead2099b3d1d08695a875dea3fd3f9dc328832293a8ec058a74fd98bff25924de4825040b69a6af016d1531872401178e6280e50e341baa87c1" + }, + { + "tcId": 1511, + "dkm": "0f60843744126ef77269bf858c5b485510082f4a392c1a644aa669e23df6402d5da75faf7aa3d79a506f5027232d64c28b3097d6dfbac72c69c1bfc58b0bd47d19a62e749927752e40634cea6b7fa6751c5d453c9d25782d6ad90f0b96a8cb1d7e764d199c679722d4516d820580278d1fc6c12099606558035b5b7cf19ad0d8" + }, + { + "tcId": 1512, + "dkm": "a9c2fb1fb0d221c9bf80fbe1409775be614ed2776460eaf639135e59fe8aba8ce61a1a6597e4bce6156a1aa3df5eb3eb7cc638e26e550f86c4a862d0addb8f21efb997a78bec01f7136ef51d7fc8c0f6479f95cdd3bf12637dae0bc50c8d4e122528700a05bf70860829363415eed30cbc85f9406dd392d906c17fd77da0db2a" + }, + { + "tcId": 1513, + "dkm": "e2f3a9e200714e4223680d5c05f48fd32b599c4d3d3abe0ebac2583342dcfe26d3936ee62145d1899c1ce7ca8dbc229b7f592f94e58d59a869deec1a27d0797e22280582070469573379fd35ba105c956d9b977dc3ee3efa790713905c20bff77e24b2a2ab2bdbde62aecba97fae2113b3a9ee2cf25e4386bbefb38c6aec10e6" + }, + { + "tcId": 1514, + "dkm": "9ff6cc911e21d9cc3f06b147f6a90fa1259809f57415f324346324475a8fb1b50b7bc730931e68220f59d8853bb28a5d8123ce615b14e28137570eb984006fc94eb0f3775275a31eafd3f6d8549c4805f1059b0887211f2933ebf066d439a2d20a7827496f17a453c61830a823d16d7452fa462bf425aecb763aa0122b53792c" + }, + { + "tcId": 1515, + "dkm": "beb2def22b9a2d37cc430b312c0684bccee403ef0ae9f7c632689c74bf2527b65553538429eab661657ba1eb8fe03b90c8cd2d2dc27e02c182a0bae5885d253edaa5daccef5731430f1910ea897bea82324f920634ffe0dd61032b7ba39d611539affe10fc28928088cf81a5fc7a79127bf1292fb961fcf412f4ed82fcdfbd38" + }, + { + "tcId": 1516, + "dkm": "2d210c3a59c6543c3aeb1aafb97528e8a89b37dc9fe6c2ec47d31ed4652bd9a5247d80f94b85ceae14c671100c4c2802024f6e3ae88d3a719a6b56e1b4fda4bdbbd3cc9f6d7ea7df1b50af9547ef0aeb02bb299b2973c06d0f293e3dd0a458eb5c0aa577b302103fc5b043610ace6049793b45c9844bab5df66d63c8624a3f04" + }, + { + "tcId": 1517, + "dkm": "c1a69d04f6b223c71080fb415bf360948a17fdad93307d17d2234009698609338298c6fe994cea3ed70e9f701c8384dc0e55428c02045d84251add174a13f8932283613ef9409e1ff742763e631bee4b90695fce364ebe9b14e4c34d8b9cbb4fd06c4d9b386366c881c12e75ee7816b43595e7639808361965509523fdbdec5b" + }, + { + "tcId": 1518, + "dkm": "4967638eaaaec8c3a6ba8703c7711190576b7ae2dd5cee7ef55d7fc2ee798d2aa4d0458b153d39550e23b1a4dea1cdfc6870d68d6e7c0aeb09f886be1597bab45f18136d03ea72c589bbf30557330774730bc5ad869eca42370942f64e49d6ab481a83d8a9c6ad5329b87f3e39618b3d407660bf1e93f8f2a38862575d0915df" + }, + { + "tcId": 1519, + "dkm": "036eacff7c96a757e4a386ecc9ceecabfbc93b00663429ca8ab1631834402f838f5e922afcc50e04f4d51dfb1ed81f0b72761303c517ada2a2c4e604b0517a7aad618b7ede9dc8b20f8738aacd82b561704b2b71c96221a5b1eb34b150590be44e9df315ff085dc449c925e5715de00adb625f33b598d1a1b3d38a9e82e7902f" + }, + { + "tcId": 1520, + "dkm": "710ad3aeec914bd6e8e654b7283eadf9050b83869638c1360fb11c84ecb6b2ec6ae8b4b3010ab4512a363a01ef741f0cc8229739e55238b22da7574036ad8cc36d5265021303ef09871bdf3ee662a518b903c9a5fdb67b7b3783cdb0b2983dc3314c90d8e47795121ae49a96380ab832a609cabc8c8b6d287bf0527f4bacb771" + }, + { + "tcId": 1521, + "dkm": "d46f7d27e08f05aa4d98d1ad5b54f633ce35c31a480067fa7763a48e582f5b8a0262ee9936d4a8c2746f6a40cfab0ff456e1b703e8873eab63acf224df9fff1f4bde6229a2f5b9b95f0847ebad0249ff18be31f9c314f125f1c524240dc8b2518ce9d2789bcd1617b33c4d8d1196da61f11c9210c7f22a94be8b12dcc256f7ee" + }, + { + "tcId": 1522, + "dkm": "f66eba61e75626057bb3e8678c9a3457c59dc7efcf5739d16e8304fe6eec6ffe1d8160ebfe220173f5fa2d4d436ff4aee81a385680e1d147fdc5a76d818360b7d06ec667d44af88b042649ee28e2047de97aa33b142d147bb8ada54c98d73e2f2486669a4f5e8f3a806687af253519af2df6e1eefa5b592163d2966439a0d44d" + }, + { + "tcId": 1523, + "dkm": "d02ddfb3d78fa140becf1f0e47c4c7ad3f0f439321b081a7277b5d3c9e0ea78ab8438259f322daae091381565ea4750e15d46856152b2c02a13cab3f180b6bfb77c10bbded136ab5f0afdd65a69e0a00705ae88c4e93cf2d3885c08271956be7e55090176071fd63bc75c7f6d96d5b619c73b455c6f0ce30e09f0c90e15195e8" + }, + { + "tcId": 1524, + "dkm": "01be25ba4fa7d0c32de902dd86963bc4b0c283c2617890fd509062ee882526f9f7a3e3e075247d07d107f549ba314ab7fe9347eaa18339452b7cfcdbbf399c50372c0a206287c466b9dd337e870cbde07dee833f8554a262b2a65a5ac96faff7c98b2244890f9528e76999591f55950197ebabe27f4e6b401aa5dfed435ae3c9" + }, + { + "tcId": 1525, + "dkm": "a2012b9b08d71cf7dcde6e8f064df05876cbf126a5357ac1bf19dad96426b885cc90184b3f3e643f5154e1eeb573da392d12c8924f34361352c08f344fcf09f05611f544bab8d65da46b19517dc679a1cb0681445715650f15b93e0f1db1c16143b714ec49812f0a9de7c60c66be22f0425989bd6a5b1294be14151ca149321c" + } + ] + }, + { + "tgId": 62, + "tests": [ + { + "tcId": 1526, + "dkm": "04d7954a04075f37f2818398ab1188dd0084badd98d7ecc76b3225f1ac5a2c5ecad8a9c6bbd62ff0988f4b9d2e698fa684333d49996f0bb13e832534a468fd10179a1498542365fb85a780d5af695e1eb4355e14a3978649d77e13add68727a53998312348a3ce303b44805f3ec15241d9f96f6e70ed94d38b7d32a1be6b7836" + }, + { + "tcId": 1527, + "dkm": "0423d7216da7504e460aad25d40bc6191ad2bf731910f5830f7c81833eef94cf38f428975fe1ccceb9466bd06cef97ecffcdf35077b9d1b0bf64b90c028d6485bbbe2691ac02c6465fd68b61a0848fec7501024ead79733d9434000eced05c12e19dd3d67975b121e641e289bdc55b06251fe90f65c42cde841a5035bd80f2e9" + }, + { + "tcId": 1528, + "dkm": "c62ddc1e122eadcd816d3ff53c252fcb1fcc260a746f23e8f583e49ff9d88690a86edaf95979c0732e75a4cfff0d295d99bc55a90e045e3a10ccb778824a557c9b0340ed34ee22059662c92bf92ddb71d1ca3e6db0db0194ddff26553be51b6e208b4589d899edad8205c6e13929e7722a4cb046af88060c3202fd97ef4b9ecd" + }, + { + "tcId": 1529, + "dkm": "d7305cdc5cff40d007d14898d0bda7bbd83435f7a903f4ff9f6796cc9326ee4caf4d745f9f2a5a47bab33452a0ff2ff00a91607c687f49e04696e7cb0782ee3a14236aceebd27cb48abe25a91a6be273a3d56ca36b3acf751d463c05c988baad693ce2fc3ddf1cbaa3cbd9a352fbf0a05a1fdf9c4012716bc5754acaba6aa8d3" + }, + { + "tcId": 1530, + "dkm": "9ed0116043fdc9f9e8074733381f3550636dcfa57c88f6063eda13e0eb2d719622ea726351cee11dbe518e5d1311ca68f5adf6cdf093646f44f74a35546ecfe12a0791b7825b7b183df5f627f1a8dbf88d76c244c96e90060b6d7778d172f85bbbfe5665b33ee20822801ccd45b4852d8b2c6d81d620ddbd81add4e5acd1258d" + }, + { + "tcId": 1531, + "dkm": "4c7fa92b67d60b28a6efa8746067e7735d6dc92405c1a27737a1a4eb8e3b9592fb886a9e3463bf619e247e0f37d40b05682391a53c90263fca5f1de4dd21e867ff24aea4836f091d4088211ec666383b16cdc48381df61005873b443acacc7e0247f6f4f5565efe401583533cb13b837a7438761281382de546f3fd79e3b08b7" + }, + { + "tcId": 1532, + "dkm": "8be366cb8330dd0bda44b22e5aba91769f2dc626b2e1c94d8d2fbf2e9cebba898c190ced145353fd75e9af29a07d8d6a417aedfeddf88fe93eaf7c2c49b566069473587c76ccc0f713daa430d132595202d7d558a2b0c4cb0728643a1c9091cddc68084d827f8f32e2d0ae0ee8764c963b77ef5652c80b724920ec70e8ecb424" + }, + { + "tcId": 1533, + "dkm": "220bc02f6c12ee35d6d99910fc76294ca0b4cb2335dea8432c0492d5c0383625548a03d175b5bf498cb9a1d2110586e912085b48568e23967959920349d8aad5645845466b944792e13bbaec2608301160f94af9d7c0475d182f0b2164c34e035db34a889f0d14d4fca155fc13e61e7ba2529a903b8103863fbf0683dea3d951" + }, + { + "tcId": 1534, + "dkm": "79550f13f559c354a757f6c56c7ef70aba1b40f5a9c09bf13b439eb2ebb40e4db4f21582661d49bba8e0fcac2870f93c1065e96fc65a5df9aba51fe21260f523c0b0a040e8ded8e6e8ca464bd58800505433741d51f590bfe42ae943a019a508fbc99b7fa9e49d4a19a2f29195b507bff49b56348db0e4af8ce5b64b5f8e161b" + }, + { + "tcId": 1535, + "dkm": "5edb975f6043df38f2681bda2c0854db68f8b053486cea124cdb27428431b7c5c5a79adcf4e1d5bc45ecdca2c7cf51764d6638b67d21af97ea0fbd5d0cbb935f1dc4cb5a2ce5d335d3a5ca796bc01736fe310e7cc0544651b59935f7ddc9570b6a920fd0b44d37fabfcd17136046a0da0d261eab54e403ded7f014e0f5ae2e0a" + }, + { + "tcId": 1536, + "dkm": "03aea3305e2559958ce6620dd1f2b5256348e4c3e005b93981f21aba863b09d39d49397815454019fc68e5581967542e2de04b58ee37408ac2acfca66779c0e4432378251a78a5f9a8649bde5d537f58c5421a46005cee36a7bbf5e935cc71b5087cc01a464e0e73dcfc10ec5a146cd25d58a10e076398844022389228b752cf" + }, + { + "tcId": 1537, + "dkm": "a740d5557c762539ee3b90f6489a986b53d459024496f47ab209906e53c441c0944775483d2d07ab014ce2760459440907f8366a8b2aa4aee0fd787bc6a26f15b0cbd1b7daafb433e1c590ef22aa96196cff5b21f2b81900c0bb747e0a8debc9b04a247ed1c34a75f329cd566e649be9dace38fd76adebdf6b8cceb72fdfa29d" + }, + { + "tcId": 1538, + "dkm": "b6e2a971fce5c70c9a12059c550e092da3264a2c14190da122346df3edfed16fa8fba33ad520bf154e18ec09d17bded8769831583fa82f7815e2788a06e4d82b128d72f4779f24847bec3dff11b5099e3ec6e2e5924dcc0cc460551434d0f7b613dcd449c62d15e20a3f23ff5446f6f40fe296e4ef320808f378d999aae5f032" + }, + { + "tcId": 1539, + "dkm": "925b8dc812d53bacd8c6b3d66f99ecdb07f5cecdb1f397e4da71d8d86b457434872e795c5ca981e794f904dc9f03ef7ec6da6bfbf1bf8ba4a97350a4aeefbe45c8ffee8e30ddfdba9fe76fa0df639b36ab0fae76156a0156eba38172aaed6594e7b27a38f0d2f5ea276057822c133a7a8ec9aa27d766326c5ff5d2fad5ba0786" + }, + { + "tcId": 1540, + "dkm": "0619c3d47a1b1a5697eb9e99e534ce06f9ce0f94a2a3f8438e30f943dab50c092d448314b7b5c067599f2d3dcbc9f4cf2c3d36c1ce3020cfe0663409d4e664e5a2905d168b233ff6a684a701d852519e1fa74b5f4091cb2edbfaf0979d12d7e82b6ee147dd8a650f9e28b7366d99546007165c97daa663031457d4a3b7c4d731" + }, + { + "tcId": 1541, + "dkm": "e96400f932df205cf33157b213465445bb8aca5e76023af959395507044dfb97155949709018552592d579872067fa4b895f923baa8513f4c00d3d916aeab0acee37eb17c6237c69789422cb17eab325b6e91e30ff1662fb7895dfa187bb843b67508d1850c2f1a227e51eef9635c86319c7a0b167f5c67dd7516010e6e8e6ba" + }, + { + "tcId": 1542, + "dkm": "cbf047926f49a9da2504fcfe1606c0fec89d8f303d192e06c877ac4eae1ac7be8328deedf5c417c1941597421cd7ed21cd1ae398a9698baf793e5d7b6bbe5de2b145273c8f177344ad9e43c0c33d3214315273f56fb5429e133e6fc5de037a4a01d730819ab12ccbcf5f6a24e5565252677ec32eadee595a0088c6de67b36088" + }, + { + "tcId": 1543, + "dkm": "a5c8a1c85eca05da990bb0c893abd3e4799f97ed787649a0ed5ff74b1167616535b4e2fbf7f89e8d877fedbad3608758a20923dc204673bae4820c199ee11098256892a3c6c036dad313905a7b10c9ed841a9aea0d94d88454db516b3a4f3e3ecec4d5f26ca2d86ec70586b2332e396bafcf4b0c3ba59a209912a2ddeea18867" + }, + { + "tcId": 1544, + "dkm": "71676912a07eee536a325f4703c2135de3682cf26ed75aebc01f1964d9fa9691a1a625e9f5e9a734976902d048d61ab08b5e7dc8b26883635cdb1113d1635e83cd186dddb8a57a802f6d889c6bde3b0201471fd5286d86f5837f989d9a0f86a55f69e68c131868252a235584ba3578b7b79df23d91b4f9a9829b5f0ef76925e6" + }, + { + "tcId": 1545, + "dkm": "ba85f3595963c1f0926190e737a7b7fd9a417927d25daae5f97a6fcd86f4efda7c802c54d9e64e750088bdd56be6e64f5c93e1b931fba67809e61899b864c23903479a9a2287bc6bf223a9573b20dec765efc53683c29563431e0a1a6250fa709e9eeadac01229262f52bdf888e601bf3dbe718ca7fe9543d9d4573772c5f4f7" + }, + { + "tcId": 1546, + "dkm": "5f345b14089a01651dd76beeb4171255e871853031228837f5f8cd0a1c1fb3d4a330d117b93fc6dc0f3a77c6c63a6a0450f7d97bd469a2aa6dd65d28859ff17e827ced1e04d3365b999aebb8592605d4474614ac300eb582941ab2f87ffb0be99180577150c60729fa142f5277300565b013b9746f430afce871d4811948ae3b" + }, + { + "tcId": 1547, + "dkm": "5c30bee43a3e72a4319cef983a082248e04136ce18b87444889a924ba33b43a6eabec04667749f3962982a18b03979e83cfea7cf62bd63f39c8bfc390fbaec047f06bf1d0287298109f4a041f178fe07e6ff0be911aa663e22d1f39fe82e675802c8b2bc94ff34d02ca6deb926fe4c13ed842c95b3a887af439f864bfc792450" + }, + { + "tcId": 1548, + "dkm": "ef4cc61b1f7e5996a25a2fc1202fec12337001b18f181d330bbd44c017f447e580004e1fd02744df96f47f6565ee6e167179af7afca118cc9d818ca7425fdba69f15f9d2a283a801d09ff26af95dee71917ea339f7f3e3a778d655babd72a605bf2e68768ad71a6b902bb48422b082b5630de980be2919a9392fa21f4da2f59e" + }, + { + "tcId": 1549, + "dkm": "703cc27309e42661830dcf4870d9487a8dd2969796b6ebc1608f7c659f185e6f3adadb24d4087844ca7d6484c0b60458f827bba5f37f28ed4cee12422e501f408c2eb7e9972f8bd3188fb425e6c077438f66df54e7fe0fec6231952dcc8c8e7664f98a6d72912bf36b5aa52381a2e6606adb4582ab81b6e3998629b0e5940c1b" + }, + { + "tcId": 1550, + "dkm": "5c04e4722be239a8c9c03d910f82e3fc56374fd2fb67586e6f6034453c41cccbdf7e7b684a873d720db6b9fff1c20ff2b23712d05920e442fbebe30c349d90b53be8f1a193df68c5c64a4ce4f54b3492c9b15700fdd119bf3f329fdc432bf44049f7171de76e6248f2bb736a674e67599b5606366cf613c45e6a9bbb999c2a1d" + } + ] + }, + { + "tgId": 63, + "tests": [ + { + "tcId": 1551, + "dkm": "e5055fc75ab40d31549bfa8f196dce9355d3dcaee34a21301f26ac9077f7ec3cac39c5f8bfe1bf271ca463f9466d3fe429d6b2bc75ffadf467576a0b26f7f3be50bd194e536ea4aed9f68950c40f7ace9d056ca308a72f56af1dbde0b0970ae34e71724f5c3b9958cde7c5a7e8de6393ae7feba40b7c83d2b7cef5f208447a69" + }, + { + "tcId": 1552, + "dkm": "21fb07e80b5b273d711b97fd38a365fcd64357a3a8380441a9b3921a8bc205ff5fd6e3b6c8e872dd14f9aeac5a78d397b25bcaec106e1c3df85b0f32bbdfb6be466a6323b64fb637bea6fa5e23df43e8004636500ad20d72c6da5c57fdc1e58b3e7e49be0567f52341552adbe6b378cdf248f36864cfc7b7b3abf3b67ef1bb55" + }, + { + "tcId": 1553, + "dkm": "353af1fa770f093b2d85113d0b77d218f5e4c1cfe065ebc041eed54edb41ea40c07171baad8a7b2dab0bed88902fc76bd0cc34d258312b1e2d3226d89bdbdc73d14d7a201037d011d3440dfbe9e0d874f117ad2188bef0fdf7068cb35f0701d9c31a633e823783126feebee33f1f62f5b614e29bf5c35ceba50e47b1068eadfa" + }, + { + "tcId": 1554, + "dkm": "8d0bf803e664a3eaf8043b9f15402041b704a8684e525da6446e97e6bc5132fb228df88aaec51ba7afa0410a006b6915f3ceab0fe7e67566686d939504e1fbfd463475123f7aa975499c130634b798a2638c4ebdeb9f61fb788a0ef682f009c7d7c4fbbbd67e481da1076953f564c49af49e7602bc0c631efe32ad9a471589e1" + }, + { + "tcId": 1555, + "dkm": "df6b94e1ce8916f57105300210a9bd599dc4dca5bde5d85aa5aba630a29d1bbbc6fb03477116e5acbfb97e8833c1916aba02e50eea44aca3f84026f1928a605af32b009f01467a59a61c36c58bee19314603bd7f29f645aa7dfbfef8e151b86282a3f232794760127deeb20d14b3a24e38eaf11c8e31fd39876b958b46c4f8bd" + }, + { + "tcId": 1556, + "dkm": "fb456856d387f4d855ab0bef7a87063841b6be5da541472eacd8a2a49156130227bc9a547e2023f28973b6195901525a62b086380513cececeb9ab483a6460496a577354e30789751e9dc5469ab5c7243560514ab1c59f5a8f88e783bf1ecdf3e9c9e8770d2d54f099d49b67008f5a46cd49c3cb033022275c961015fa397583" + }, + { + "tcId": 1557, + "dkm": "e4038fe86ea4a2aa7ef7504f495aef94ee4f55aa5abfaaf3def74cd5c28a12fbf5b0e72f580e8a43ab3d31c8b92086d0979a12348e69290a02d756c5de9826a4f03f741611cd3e015e2ffdaa0ab6d99f9ebe3bce4972f6b51a147f2c038f01c3156dc9ee2c20a03538ba5cd3fb31d5038ceaf10f18ada57f8d0225f664b1bc4e" + }, + { + "tcId": 1558, + "dkm": "7e4441d060dc9c7b756b69d8f3fcdb599575dda061c28ad5545b089bead0229bf48604dea1d2a0affe7c511f31d386071e0b3c354e9067e5c1c58572b2486f3eba4db51008c514a384ef47364ad0b66f8a8b50b25331eeab217550e51991889f4d96cba80a286aa2d2cf67b16c0840a04d7929e67a77793a04cb1fa14d10c4e2" + }, + { + "tcId": 1559, + "dkm": "43f0a643d5eb8b982ce9c2c8c5dfca5c7f8e3721552a7443b8445bd95ef736eb74888abbd7e948cc10ec913d80cc87aebf5b193033bbe885670707e22aadbf8d41ae03eb44107af1082d89d108108d5081f47ba5eee37b1ebfd7a848db6f851197408cf030854b2911170c4c9a53b3db189f00df935ca7112c7edfc52881c811" + }, + { + "tcId": 1560, + "dkm": "5bfe04b00e55b4b40845b316448ae00207ea44ad1a51e71e1e774ce4b650988423efa40b9e350f16690c382a7e594ed4e37166a369091720463177b6799b44d1738a98eeac5ecdb16796e751eeb9ce16bb6637998f72521aebc75d05f0076c5a52275c80638f66dd3d60a9c0a3f81c89703e6fc40cad846252bd7ca7c326b484" + }, + { + "tcId": 1561, + "dkm": "5542ef23e217e7f007138e2030ef083dcf883289b615fb526630a7ed8108eb537710f09e86dd71a3686e7e412c78c60b0ee15bdf89bb589593ba4ae98c9e438084a1d1efb389af1e628a8c8a30df89be48b220d74ad864139bdb7e1d622c3ca321ba38b6666ffc95e6fc3b82902e4ebe934e487a19963349eab68fe9e4b3f3e7" + }, + { + "tcId": 1562, + "dkm": "08a870f32bab3cab27137a0b4d0e339a1ddf0c9f9f423321595536f385b3c1fc29163ef6147e5625dfb4b838909d03072dd9de2428be9446fabb7f04de79d2a5cfed12c27b33e5c9865ecc75886508741518bca66ab4589ad57f41f025f943f083dbf16c798e86a3eb559bac866957dec0c9e37beba48d7fc08e95e94ff90e75" + }, + { + "tcId": 1563, + "dkm": "4969bfe4cdebab051f57973d7cedb4d80ae1093958cfae535dee0c40e62dd6f710b5cd23098fd28101294f9ca9c70e2f9443a26fb10d6252e98c3d0e8edb262e2289df49f11404813d5afe974cbbd93411fe2ac105792f5709c4a86b9307f2c285cb6fb712e7f8f6069fd639cc2753e9eda583725da84a5b9490754294abe36e" + }, + { + "tcId": 1564, + "dkm": "6d3f4aa5571d504d2a804c2fba22d914c2b48dc055a5558c17cf668cb4957782ec43a7a131bdff7cf698c2935a175a409129490b987b144e90544c8b0266390699acb185f7bc01f7eef3949d1bea05329bcf20beea0f384b222cba2b9aa77ec6334fce7398e5f0351988a1954fe627cc06ea86a4050e1bbfd45286b39d6fbe49" + }, + { + "tcId": 1565, + "dkm": "8bffc53338411becf645828e58dc9a9b71dfc4c10d1608566fe31204df7a478fd4a4e2ec39b2a4fa1ad61047c1e7c722aa0b4ec915afcb631d0e560227e577e12f71fe8a695b89341ae854301328a16a9ecb3cc21053bdcbd8576f9fa15fb8804eeb57c255320a3de4f98c5fa1ce8bb18a4b7c366bd7db810ca9204ef796c04f" + }, + { + "tcId": 1566, + "dkm": "2c80d06d3a2cc982f2b1b264f720de22823a449a508c4c957f3f4094916511a83afcdada8ce7de8f2783463501ff06912385ef562b0031cbc5adf2cd4290402e8b87ed2644d59aea7a3f57d6f79b1d8ce9bc16f31a1a7995c3b2807f26897280c18b33c341d70a87e9c50268aff9593a66d9342b7aa400a5394318c8734d4c0a" + }, + { + "tcId": 1567, + "dkm": "a7fb4ac6f092ab1fb47aa7d3dcde659ecb860fa507f4e5088d8fba48a0e7398e1cf8e14563e8ea59fd16c174fa86e00c5b2d270aa5c8e5f70c95d56f7703b4f3085c8f88daf2cd19491436315c89100bfaee7171c7d4f59af52a237362070695ffb3d0c6d4cfe88079795bc9549125ed24a88939db6c30fdf57627358039478b" + }, + { + "tcId": 1568, + "dkm": "49beb0f6fcbe8e3b0eaee5e815a580e05456b3600bb5d5af16d61d0237a846ae185b598ca8c894a738b7ec3b058b6534c69da9bac7436939aefa223fb329561a8a5ac67ee701ba63fe5074c27daeda02a29c6af5dc6da3e41226e4f8d19062cca676fc467045c1238a207bf597c4e95c88688cd826068dace8965ef93aa8ceea" + }, + { + "tcId": 1569, + "dkm": "7225f095c6609b46db5240402afc579df0e293e08983ca6b006f44cd7c9938f8933c8d2e14bf0594c46250ccf757b3abc0ed24a04dafa9602f36b9891435d4a98e3468fba22c7f742bbfa908c76f8b0fb3ed5dcd9426ef4b32c8fb7b5c383db31547066b3a1b8f1b9b737d7011735dd9a02ec7bd374fcfd264c0a314a2cab9c4" + }, + { + "tcId": 1570, + "dkm": "6af37db0d82478a19a4c090c78aa0a64a5da62e93f1deed320dd2a30e05d56bc286736672955aed433fc14a6116f7a40c88f22ab9b278dbf42b3e891f5175436786358062c813fd13793318cb9c0fe646639e30c8ab564c57fc8f66d876ba3046180eb95176d51ff84541dc12113ea7e62070959453c64c43c28be21d57636f7" + }, + { + "tcId": 1571, + "dkm": "7994dc08dea1ec9a294e009e9fe22860c3ace87885361c8cc5d3a0827234e6a74eb1e98eabdf22bfd9ab6f2d18e7803cbdf7eee46869a9113fb03c1f27f363ad63d37b421338a8aa40acfde8a3b9b72ec1475d9cd5bf9adad7c18d4dc21d9e01eaee88c3361d5e3a310dc49f4423ecc07ad2714717f35079f0f8cb800ab442ca" + }, + { + "tcId": 1572, + "dkm": "0d9ad4f3d13b437ff0151e3b1aaefd84bc1153e888f1ce8f08dc1dd165fa519bc2cb10c33826ec70e9fa2b9d8f2afd5311e7404358da1d5c2c9829d96c396ef8aa8b417221e732eca2cccf89bc82c1e78ee9ca89c30aa5c6b9c54646cfcf43de63b485d273eb3286c3c02dee73fb8ccd83f2175c8207b81b731ee123a89b883f" + }, + { + "tcId": 1573, + "dkm": "65df712b6cf3c87a6024b8e94dc4a4eed57e18766ffc3af99c250f0aa42121adb1287de74d3c26ec3572f76fe0f7bc8e3deaedd2fbe8b7715546d54308ea05b74751b568890fb14f4e81e153c7106ab646d896c596b1e949e1dd5716efe5e23d7cd1875ace03e0747b48f2d87db62043c5b629439f1b1e1b7451abfa37553908" + }, + { + "tcId": 1574, + "dkm": "3a8f733a6db3bba8c40450eb530dbe55990e28160e29c031bd84c68a87fa6e46ef7fc7f68446ef8327cb6023db6ed506d77ee64334e6a22b17db823175224e35ad6c306e51766bc4dfede83026dc8d60787c6ee9ceaad8fa9e7e0aff72046d02308088324b95370a420bc7046d8f863945bd09737c99d968349a1b683c0acab0" + }, + { + "tcId": 1575, + "dkm": "2bf97d7b13e2b263552fc293db90945b418855dbf50db46bfba9ff7000049007fa4a1f8471903925feca438530edcdbfff6ca97bd952abf445bda5f142984f34481922a73ecbcf215ccd42350ffee6aacd33021f51692456a0c58e75b5dd6f25db59ed01ba97b142a3c3bd37d017e419339b6b6afd67559212275f8147695906" + } + ] + }, + { + "tgId": 64, + "tests": [ + { + "tcId": 1576, + "dkm": "a2a3489ee975246b039a35a0797311edce3e3ba7f9d3286e768841142dc1b42c91085c4043cc9e4d1045687ca7ecdd7a66cc2a67a281e0316d6829e543e539698b89c6d98b15ecaac534213c568b47e819cfb23febc14fe80be129f9b38ae7a537f6c7aa6aac9f8a63f817e380959990399bc6938063ef4bdaf1d23ed683d636" + }, + { + "tcId": 1577, + "dkm": "b1d33daf89f4d14ac8990f0dec29193330e86f3b43a8a121c1978aa82f904cf80dca0a08430dfa3e305ea5dba05ee3bca1b9b6350f07f6b5622e14838bebc0089ddb9b1a036ff520693aae463a5420da75757e46f21e51bd5b35c0a961e6e8dce7873c3b8fb9f4b59daee391cc67552391bfc1894aaf32b62c482634c48a143a" + }, + { + "tcId": 1578, + "dkm": "41b581df19bdfa90c946a7aa10942ec8a279c6a205c5b5847eeb5f173f3d9d4fa2a8c887e043fbc5c443335bdb563e647e564fc81b469dbb90e35b9997293281d316abe2cfd5b46b933ac59ee01d6ffbdddd4f3df56354c6b2061297660d650d1335a0fb23ca834e01665d15dc5141091e6508472eb33f33abc340753d04a453" + }, + { + "tcId": 1579, + "dkm": "bcb6579d0c25e821ccf4b4ea131575a442f0b15d756933232a49871ddfc1c1f7bd22b22d7ba0cc673492ab2ea1c7e31a9debd4dc1190e71ccd2239710cf18c4916be6ed746d300d23872cf674b896bca9c23b8d4c79b17b2e31693751b4f395e4126b6761d9e7d51cbf6ad19db70962932dbefaa858834fb27b36ff1003af3f7" + }, + { + "tcId": 1580, + "dkm": "8ce554d682f0ba34bd5a03e8908b633a41d79fccc895fa115cc1ca0341f2e91de86da5f2035b2381deecefd8ca9154fd0107c402236120fe67f6c81d4e2b846c05ff4914414d2b502ebaa60433d5a5e9a0e0f1806af94ba386b26fb7eb612bd0adcb404bf901475f3069654cbbe2a84cf8ee285b1f78f4b55c286c36ab3303e1" + }, + { + "tcId": 1581, + "dkm": "96ab0dac94f93199aab2817feefc4c8b26370fa23124918b4a0f9f9df9af2370ee278b84abb45c563985db2736b6e85d8184df7dfb17396a6c08a3836474c14a8a3ebd78ee3161360f59b7ae3a89ac8b8eb4d7f4d19885be56f66e1a470e8bc70332bbd5fc598baa7646eed91875dfc5693366193289c2610fbf55fc9ea652d7" + }, + { + "tcId": 1582, + "dkm": "65406b84fc3e18b77b130d9fbfba6d5636777080e281890b92647f8f266b6b68d0eb8af1b839e795cfa544b25a29f2b60396f84b5f00de5f3182500ebf560ea4cb9c19e7c6eefe0cfedd786ef1e240fa845200d3ba295852dc23dfc61114c3313cf49bdf1fff30adff3cd036d59773fcbba121651e92605248bf0552d455aebd" + }, + { + "tcId": 1583, + "dkm": "1ac2e9a64a86367ad43a0c4e44fa49fd0f88de705099bc6364192b7dfb84d923a606a3717151e4b75c8e6de608e02bbffe9fd532339f99616072ebf3c204d456366ab0aade12b654651b8a5238d42b06b597297ea3fc81e4de847be538a2dcd504be094e69bd0a3233f0e437d1b72457efaed88e6337386023e51816d66f2743" + }, + { + "tcId": 1584, + "dkm": "8265b0cd51cd6c0e8e144f3f44d355cf3cc23e5c3e8cbd9215391f62f49a009ffdf16863ec6c6b5ddbff90d0a17f69dc0ca0e9844fd0fbb19a276292cefbf35d16fbc96daf170cf357d645648f4789c2ad28fa5129c040e6f8acbab05bd2bc69f5b435b577ab920600a61b8b1e3bd0d51b39e2314f51165c2f024df2a013ccff" + }, + { + "tcId": 1585, + "dkm": "202322031beedf49a079da6c7b97c30259fb8e9b6c4dd1bea084a1fc9ea5adbc9628098f1b5daf2cbb189b09bae5ce8636f4b4045b4fa325cc848f0e2246948aef7f78ac17aec8e67f5c2fc9ea1072f795948c95b34c0a408b79c7ba6c3b115af3b621af46bddce753268fbe64839b5633b8053d4281e997ca4c830d08226f96" + }, + { + "tcId": 1586, + "dkm": "d7c43473d0df459011915a75226567bc6c0d377403912e2b1ca501cef2733535d1e0a9acd5f248132ee2e2f562c17239bd7944682ff5e394f0b37281b71fbc17e071a44ecdbaa0712d1401840915c2e844f07fc126edf3e1f30c706f222042923d45d5796b5c0cf81dae55ed6efd106235c04484fa073b1ce462bf8b3efc1dca" + }, + { + "tcId": 1587, + "dkm": "5b6ba259f8190bf9e2240f8656bdecb53e29422801e0728ad30e140f90141676bcc75529545b83d96252dd1313059a745baf431d070e8e9057fd6914d3d3e598873e75fac29b8fa9aedeb90f2132b99f82675d43b397eb313c086a02953cf4b80d8442196271249fe250f6b9d8ba4aa78f0d7ad252c796a0baf768aa2ee9f18d" + }, + { + "tcId": 1588, + "dkm": "7aa0b0f367d93fc77bc4bf0ae9b1c9b7544bf13a10aedb734fce5db821d039c02db3b3323e8c3cb732cdbee16402c14744d81a18a4b7a5db5f049b6173e3697cb272771e9c9b8abd1cec8ef2b3df9ace2af6a2c7faf3818fedbe9ddd4615b231ecb405b672b9f69db527051b40dfd1125ef36f3ae12db8d77ca5cd74e13df8d8" + }, + { + "tcId": 1589, + "dkm": "431ab2302e75840f9bb8a716dab3414b3f8d69d7f559c14b1e5fffcc53ec881a6f59ab196fd5798ac4e661f35e4ec8d161fb1442304ee62ed3acd37f166ec5f3f0fec872374f6a703e5c2751676004ef8571767d904edcdf7cc6108f7e107dab81ab3c223699329b3e21cf20c01de8cd24fe6a924d2d38076e27602ddc53270e" + }, + { + "tcId": 1590, + "dkm": "4a8109727a6612fa61a0c73976bd8f09cdbb83e7254f7b8de2ef9d646d5e8f408d2eae846465cc890c7f80515efb816c3030bc457d961805be6e5ad6c75b8815ad131ae0d476aadd48ed84deed469116b183c89697af128db6fe1ab9b3b1100396cf7074a0118fb7f730bb8cb266b6fa1d8bd8ec8c482caa08470f8d45dc449d" + }, + { + "tcId": 1591, + "dkm": "5b73ea87181400634fdaccee7fc6c250edb0e0d540fe34a0df680ac6ca594edec62840330f338cab67faf526688c8b03a3519998bd63467fb691f0fddc6f597aa5b13e360a40622e27f31a79f2fb4a58eecf965bcfbc88cb12317f20c2640bbed05e42c28330d6cc5a425e725e2944c556b3b23fe26b8cedc639c1b9ed7a274c" + }, + { + "tcId": 1592, + "dkm": "860edd092c387c5270d7680b4f17f13d2c82a5414538617c15ed1d9633751fcff9790fd33a961dff851b2cc7c2b3d07ff26eaf7058fc6645840e33deebb39749a92c55641a7b6fe0b9c3d49f6812fdde65ef9dc9c062053361d2a439d6fd9d78af55772533cab9c4c5deef8dddd14538853bbc0e12b57dca9b859b37b4ae46da" + }, + { + "tcId": 1593, + "dkm": "10507d4bdb813946ba889e48812081f660a4dab364a54ce7b0d88b3b692d7c8c8e12863a13dc1dcfdf748975c55b111a833bad9360841d3e6978217fdfa1cbce88a8e72d4509fc4f8c81599a7e1bcdd731dc15f47d1b79cac0c644494de0a30e521851d543a563a2c0afcde104ff6539f829573d4bfde1b6e372af550bc479f3" + }, + { + "tcId": 1594, + "dkm": "a7b32b2323b6c8ef4d677509c2032d3da50f7296c9cb82ae099c001dd020c2d6ef7ab4d3f59dfbdd1c7a7dfb36f6baf5b40e62165f46e8ec9a5d797f0bf2c21a37eec04cbded3edc4724c6ecc0333cb705109b1c22a288757168202e4285ec89efec7a8b7145e4d7334902e253b5f87155f2d5229dc6c55e8f4d29e6b0080abd" + }, + { + "tcId": 1595, + "dkm": "b41ccd7e193e5b7970d58498dafa792cfaddd6351242e772053197ad438ebfa12f12db0199ca3979d71ad2ce30eed8f11cf5e6a1f4bc16180d9132b116f023bdd997331388b9b4f700961933f51394c47b75a6b2b9a296d15be18539027b967e4818196c3c590fac447cf07afeb7b7ecbbb0b46158808dbdf4119410b4c5d027" + }, + { + "tcId": 1596, + "dkm": "bbe3cc7b74872213514768f9bd2a6c61a025aeb47cfd933bf7d959a0ac8d7ba810a0c616092562ff16756bca8e474939e00851db2c748b3514a8e0f027b7cf72efedd8fe1163ff0dc6102d0a5e579c8260f8e7f69c53fa24c7c8aa394b66eef6e3d1a577eb4bc95db08da219d379f75aaf9dba00c9ea57b43e7a0765f606a71c" + }, + { + "tcId": 1597, + "dkm": "91b417fcc30ec75e42940b4ee34c4fb85e2771a34b1c3ba16f9d21e305fca4ab46c3c91fd77e77f24d7b5649c945709be6e2cac2206688cd24f9c6fcf3eabdd6fc82ee7163e829a289fd743507c42d285938b9651388411f09d60f995846b4bcf1143b77e0e74e89da72794ee28b0d6e9a47d0d6384b73edb755fe8127e516bf" + }, + { + "tcId": 1598, + "dkm": "190041d145890a1d0f3d51f12583711939356470d26070a8857ff5412c4cb575e6deb91a804411854c40c3452d17033716bba2df7eda1c7cac1f4a02a8d6e804e556c3ad7fe78fed17d60123d217169ebd65475b5f4fbb4de13c9cfc4197ece2cf7b7298d39857a02c6779974ef3dd530fbbc91a60e4fbd8ffb127f084820079" + }, + { + "tcId": 1599, + "dkm": "554d39a5efd8ab9ad0ebfa21be69e6ff54051579b8d62e91460c2ae54f6fab3a556d7f60211d912011acfca30ac6e9f351997a625b47e7f618474b4a2ae8abad7951a291f2c292cfed455a7807a604894678931d0453d708a09bfb1f7d3e8db6a23d7287674c33c512a8dd9f171b8b5917f5a66d6d7219a0e39071783cc026ad" + }, + { + "tcId": 1600, + "dkm": "0871059850154529b6dfffef92c1c8b0d125ca2d484edafb7c98d3e0fd86984214e6411596280e0f639c3096de4d2a5e81e30cfdd0b0e8515ef9fe89e158d31f0939ce6cbfe995ead943069dcf185204cb9ddb368bff9f464b378a165bbf121ceda11e0b8c5272e5ef76ee749781560c8d26c0d0daa5a0e155ff8cc2591a98bf" + } + ] + }, + { + "tgId": 65, + "tests": [ + { + "tcId": 1601, + "dkm": "59e4de08c26dd8b3519678a8674acfff690bdf337207ddfffc60cb9bcbf5ecf5abe91fd2b866802c66edb29ec0c746649e03db6cdd361d00c9061e16a59d706c8cac66fab7be2d542a49ee38671004e4c7081465f0d2ec9d4f05902aef28b1aa9d13cf1a2d07cae9a89600fa395354a48c7ff7c7600a8db56491eec3aa66c84e" + }, + { + "tcId": 1602, + "dkm": "cc3f23928459031c4814d9abef99a3da88414ec0b85b2612f5f73fe7fc2e9496004db62a38570c6470e680e84b99e16dfcca1120f69408991cf0fd17e0121f7f171dc34697590dad4e10dce8f01fcfa9bf09ae9d11f8bd40fe826a2f1e79d8b1f1c37f9f3a9618cb50e389afb5c4d3092c45d976d832b1ee4e679203578c4e8b" + }, + { + "tcId": 1603, + "dkm": "8187cce5b72fa3d8f534a36f193e9ca954fb241db6fc92f8888e29b98508318fae1c64ae096d2b7d4cdee97ef97e9ad36e7619403bf22b580d4df804bdfc9fcd60dfdfb69cb04b1bf3e7a8cfa1cbfb4b00b1395896c1969b7d51d6047a092fd0ac2a18c3e58bd1348116f0b872bf2acbcc9817e7d6e8f06204fd05a4d0a5695c" + }, + { + "tcId": 1604, + "dkm": "58abe665022c84209aab8525d937272768ad2d0e359d7e0a9249d12fa690731164182cdf24e7d67ff64ee2b19133a0c012c1ee1f58ecd28c381d71714b81eedf07f1a0848288410dc9190909da595df3eab55a9d055807927f72ee037a8af316a600d16f31f1641d14d7425dd0c35cfb2612f0e9f7d3380727d6621ccb1ca949" + }, + { + "tcId": 1605, + "dkm": "184e731d8820eb197d1fa87c6c211ebc66eaf98a9e604bb17adaaaaacd3db63d7e2427d495b0cd509a0ffa034aa70270248b4864d83465e31630190c3f1bad21e168c0cc39d1b0a4853864bf0d81248d211add74d0ca315578337cd2c86b6351a6927f520db8964dd9d30000147d43fedf295b376fba9a7310149c89cf5b0775" + }, + { + "tcId": 1606, + "dkm": "82cdb778f40a195e078420f2627dfea6fcd6157d36bc304860ce4d59333af93e0d10cb41186a111f14c5e6ffbe676c84a08abfc7d43b55efd01998009e67bdf3b7b54e5dbb238f7c853cf28078b68df94a8b9d7bf206e92bf35ba9062e2717f17a2efff4eebc9e50b8f8bfe886e74935ae85ad9f394960a5c81ef3f45af1b941" + }, + { + "tcId": 1607, + "dkm": "86fd4dd28e31411a5e4045a14033150f83171579a031be12589b8ff5ab554e927b6549a130fb6452da5775caa52bd85f3cd8491c86b159d184adc8d934040db34c5b2461cd5e213778b65a03e52bcff7bff93b61527350e680170340d99446a774b518f92bb93c46127d0181c85afecace96408d310f8ebf87ef8a512ddb2829" + }, + { + "tcId": 1608, + "dkm": "5ec27ff4bac5325446935e251470b0af6498e3b36e9c88783e6242564577d78ce0695ca43395405416c04827f77565c35b00a85a35d14f4112b857b9ac75b7c91631707a57d3385c7a7036101c32985e5bc8c25861b5fcb16190f41c80f3612aac6028bf16d0b3715d8c33d131d94ee623a14d204f04569fa940dc726a45a2ef" + }, + { + "tcId": 1609, + "dkm": "7fc4534609fd21f885661f2c8e301530208fd6ac42f132a6d9486b245380dbd41b6da8353789bd188886c273db3a8664186b291befa43209fc493d039733740b3ca40a18e6f5430876661cc39df4c36d6fb36cb2148e205807a32f125a1a28966eb082cc39882c6f7d502001100b4ba2f2a0aae3bc8bfd056debfec38e24cde1" + }, + { + "tcId": 1610, + "dkm": "7c6e5b276ae2f7825b36a31b5918efade124f6ea368ea72df93858ffec810c63d5e185f37d3c0cb0c3114a5f15ba1b13e9d00dbe56891da43dd591f1d83a7888db970a7c6a24d9596178a0afc508e6ba1cc552a0d12c8ae0eeb526b49bcd8360c45045097fcd55f48940af756ead2baf54153b2bf36ff42d47d9e4de39534a8a" + }, + { + "tcId": 1611, + "dkm": "0a38b6010f27d5bfabae48e4f2c10ba90950a024eae9ff33f9fe7519641f6a653448fd1f75e3835a3da0a9f2b8e550d3c67dc16b4bb23d950d7fd0948ce1c2b967d25583da367a64b383f7532f98e4abd1710e3720cbe165ecbf91a873e0410e82021caae726ae2d51a2f5c104323255cd024a55b49f17f6d03d9e08e46a6751" + }, + { + "tcId": 1612, + "dkm": "521dffe9351fb73d61dee65874bc0ae8f5575932fdc82b78c110a0e1ecd86fadb1d33c88ebf213cfe41bf9871ecd6328a0fbe196b1e21d575e4887d5c5cbf9ad50382eb05e7faebaadefc5406e37f8a28d222bc41a03541a8a52ff23305d733c2ebddbf0bec16725559fb7a09ec3ada5946758bdd64830fc0454b8d2f6d2b271" + }, + { + "tcId": 1613, + "dkm": "4d270e523a8020fbb8c50cbcf981cd5edbfd9a68791190dff6b75fed97beb5e46fe3adef1ac6ecfc1f99bb052dac38da03255d9870176d26e37f466ff7a831abb15a166ee07ac8ecf62ab715670bb0ee1fa81837f36bc51a52a96f22c39415efd64a33bf53dd8de91cc0a84bcd6378df97713366f2f26ad2e43ac64d0936f3c2" + }, + { + "tcId": 1614, + "dkm": "bb54560b4acdacc2b5637e47c488b3acb9b393bda690cb4bec65d4c2b1a51cac45e0801e9e2fe9d9ed30374323bb4648786af66fc0c3bf5b0cbfcf7ece8a9b28cec3fcc156c7ee9ecb0fcf35139632179452651898b86c4c0ab36d0267b242cb53a78ad15df551f175f1bb40e2c24aa362cb15443db126d123bbc4ac4ee7db26" + }, + { + "tcId": 1615, + "dkm": "5d64d6f8f513e891f89c337591a9dcfbfd22aa4ec2ffd3914688a6ae7d192151fa7f0dabecfda3d0df8cf9e8bdb317043853a214aeccc0ad44bfe3a8faa91076408225269f9827cc942db2648ca6aab71aa659d7a50f6819b2d07bfbeaf759cddf77d7ecd8453ef0fd90782dd2ab740736dcc0dc960e368bd6aba06549126c54" + }, + { + "tcId": 1616, + "dkm": "8d6fe37ccbd85328e00c7cce3da9b8e4a69bf1739e7227de52b4189d384b16e8fd561de2b4ddcc4c06474073ddcddd704088d2ee570ed5dfca4275b3378da8009e6c028ffa3100218a1a188bfcdee33298e6b1e5c7a86a25acc298d10cf4d97d08b7ccc4950e77b48cdb97d395c6c773003bb482e31d4ab0feb51f2dadeb6c2e" + }, + { + "tcId": 1617, + "dkm": "8d432938cb3df0ec64a7e39d19c863c3f823c02a1ab2a786ba14e48c3799e07f034b63be5b895a5482ad23d0819a1f2ef95cdc09f4640719178befa05a06905c773391d5eab08d1f2ec086ecdce683ddf48644a45699ddf1cddaef8b942790435860273c716c33479a90d287ac6f28479ed7a80f4f85e14841f9da394eccbc8d" + }, + { + "tcId": 1618, + "dkm": "be198ad1b41f51fac58e743d572e2f5d460b34129b0aeb5893e743cfb9f4853cd34398f9df9be5aee65a4b5a69bffa8af28b325c47bebf2b706f9782f27f85bb2d441c0cc7e6b3152b2bb40808772c2c471e09d77642d4fe57b0b8e25baa73f6703215fd489189345aa9f0e80640256fc78de0f23441d69b94417399e988d1a5" + }, + { + "tcId": 1619, + "dkm": "b9ac67e9f2c2b03f89d413e7cc211a745f16b4625cd01b6ef02668ed31e6708c21c0eb25e45eb924b03d65f1aee611879191e777d106ea162ab6b486210896596b08db1a657f42a4229dec79a4f0645c1ad86675c482358604423085fa7bfa551974a480fff9b58bf8a0c0a304a2af33b7a2e308b731dc37646ce9c79c69c588" + }, + { + "tcId": 1620, + "dkm": "591ee833c780401b1359afb14c3abc9615f2247d01a08b28b73d2dccc5e69280652524336ed00aa9332ba7a3eb52a287f385c1280984335621b9c30093bc4da89d298b4f3b93d5d4768bac71cca2c7f431006e8ad05bb27adcea9849bdfbd55858408c223292fa4816a695ec09add944eac22ed4aedf7b0203109007498f794b" + }, + { + "tcId": 1621, + "dkm": "fe0ab1bf8802f673909fbc0c0fc64fc1b4dd8a704610eddd3ea7b79aeab2946534e90a0a2833d4db9ffbcb4ed74fed97f61aedcad495b42791cc11009cdbd5660abd2c1f3272440ab4d7854d5945274d9d71d1e95a2866b72e71685d7357cf7e334355bc7097dbf686c8e31bd9681580a5938dfebbcb6f3c01b114af8fd1ec51" + }, + { + "tcId": 1622, + "dkm": "dcb4c533d38ea38c30d88662f9ff110642d947e3b1ef889bb086b1b0ab00a473cdf6f4de62dfc85846f961240f4446ea7e919d4e93c04c4729ffbbe54291ba422841c9eea0274d0a7f0d40ab634a0ca4ba01b72f29fd23206867854ea636fbeb0f6712c6f543af6dab7cdfb79d61c18d68bb7a30a4c8c307948bb638d08d074e" + }, + { + "tcId": 1623, + "dkm": "262e73bc80feb2cb3456ec9eabf91b6bd0f4473b471fa7567ac91440ecd56e5b3eb6227d0a25381e7f43923d88a30a4ee12976ee31b5d20b34ca386ba2f2a02c3908cdb493458e6d155e2579bdac151f1c761fcb81814615175b3cab55f78b48653fa9e3e6b99b21f7e3bdb2d1bbcd8c57445e23d33da88e97a4dcc1cf4ab7a8" + }, + { + "tcId": 1624, + "dkm": "06b1b05a059d2b838748950a7c8930d1279944cd7687858f02c0cb31d536ffa61cdff31ec420c48aca14070eb146ca5cc61359b0809940600efbb55d0dc8ff580c3419050d64026deb0cad84500f6304ff3dc1b8a1684936782b17d0a686bce079cd372526ece2cdad8649bd2ae130892cde100e122fd50b6e7d29f00d7e7dda" + }, + { + "tcId": 1625, + "dkm": "ab95cba19e3efd837543c323fa02c2d6539c53e5d574049f498361a0eabe3b2d7027cbd73027983c79e5164d780bd10bccdb5dca87d0807abeafe8fc851530b99126ce0822320ec112b8ed2c85cd23cf97b141e220ae77375d840245c7955370d656152b07e0112511e5b9a00b1b75eed364205230bab2b89de9dc17053b12aa" + } + ] + }, + { + "tgId": 66, + "tests": [ + { + "tcId": 1626, + "dkm": "6e699040483c3fbc2a6dc738035bdf544a07d1a5a00811d39178c1bcd26b55968a00cfada7109a115232c724b830f4129218810f2a5ce19935383e77acab7cedba1e6ff0a3978d30ff68e717655f7beeff6d3a157f9d2443f405507390891740d4161026d53d35b2a19a87532d4114fb92b9fb806ec731cc48226db4254d4c01" + }, + { + "tcId": 1627, + "dkm": "98ac43a7a330e3b9daa5ef6d201749a30c17847c019aee5bb2ad07b0fb81bf1180f0abeb421245bb16804213c19364761174792987dd9577fd583b78cb9aa3c215f1ee79c31fecf11678adf72785d1151e33a5004acb37b3b6d6208af2e28f9c3665f438753d7061c5e28a01c1c67656c16ff3ddbe94ce39ad7395221756a56b" + }, + { + "tcId": 1628, + "dkm": "2d429755bfca4f802e86db061170ed56bc44e025cac009110621ec19c08244753b84bf877570e449d8ea084c368311ad3a36b5f683702dcfddca5a0471742808341498bad97f8c427f29b13af747aed90648b35665a4b28091ad8f19885f355cc213b6183d77dc82e20c65bc925900cc82de852d9156545fd493ea56d9166a2d" + }, + { + "tcId": 1629, + "dkm": "f595bf0776d64dd76ef093750f48e3334667020bb02edb352fef22b13a0980a5b6aa9188c948a1ef6ee3bd131ae9115c4b749caa4a13281425472a6df3c67c7de2a99f669bfe5a99c6920af4ee6345b2e3c6288552b81c3e5d2d7cef53c8669e781be651a564a98b0712404a1428cb1a07de7af2f9188bc050ae4110f2cc0cb7" + }, + { + "tcId": 1630, + "dkm": "2e29269941013862fb193584776fb2cc958058e83cc05f2ebcb7d46937ef777d1eeeb78160a90f36324599cabb77c99ad586f00877fa6db41e7564308a5c8f1e3b6a93b78257cd1d62cad4f270db1813f4ea2391501624b67b97e202432a4805a75948eeb3a189aa81f73359d6e88c5313b32e3330470a5c3a47c65e17eb65d0" + }, + { + "tcId": 1631, + "dkm": "1f74f237bbfe79d88e420caa3427cef4aeb757ac09b82bcc8952ddcbc7374e6437e758b54719cb5fa777227599217af04611596dfa74971f122d7398514956a2440e2852a64acb5a1e78ecf403efab4136e1f5847d1851cbdf0f449c76b0e33a761501f1e7be71ec0c29945e80089b049cd411936eba32dd25f7893b64265d05" + }, + { + "tcId": 1632, + "dkm": "a5fc51195712a0cc5d3b1190769c4b4588c34ca66faecc6c8372c68bc33b00b7cc2102b03698f322114f5928760310ce50d44c9429a0b5172dc1464e43f3e4fdd48bcbdeb890b1b7bf28b70c801fc76872dd76d4619d5d3b0b2a0b4174e1ae8b8da295029400f6812ac5c87a5b3d83b29fe13b5828bdc113f8e5a4a0bfe7849f" + }, + { + "tcId": 1633, + "dkm": "b96e4bd289f2b9e5fda7f62982bd343556de60a270960c1e984d077d5501311de0a9aae97a27eb9171f14814c5e8bc9d77f592936bf7c112e85339a2d991db8a74d39fbd4bfd2a437f3c4249de274a5d93e46d3c14f64fbe426defba1cb796ae3aa9492aec6c739cd5b498607be3b98da39bde1b303b5079cfa072bbd05a14ed" + }, + { + "tcId": 1634, + "dkm": "54251a679420d4c3eb2f37f38b7f21b8002a00d7a33803b5b047b49f2ef0f9fdeeac8d1b3a9679ba6e57cfb3043f2c0f3f41a995b1c766aa198c12ee75c8887b08289750a2a56fb6e2077e3f1ee3f9e267381b7fee6ce2632651e1f8714b9f23c1400e3cc981b4898d574fa537a602840aed464a4238c366e4dfb865ee42918e" + }, + { + "tcId": 1635, + "dkm": "69aaea3eb78068c5cbd7472f31e69a31e1cbb31e13a474fdd7499a7e075a17ec088fbcf56d65839d7b88c66f58d7074567752c7de64c8ae0921869d004377a3894cd016b9cb296744756e5789bdcaa35feac394f225e4f864f188495f8e74048d90ac1e4e81ac6bb4a4c23d7b43530ad5aedf3f40e4b98c754431f6a09642570" + }, + { + "tcId": 1636, + "dkm": "ec10546e4966876e3bd184df8034a150adc924065a2bce53c2f30f6a9313c57140e7547ca63e434f8e49bb70f50b34bb60170837079eccaaa1b18ab5dc8765383f1d74b21d9ca82f0b884e00ad097b7d919c3a4d1d8537a56ae1ff13d4290f4256870903d69ff51de152e88112820b8ce3045203536d30b9c9ab46de0fb5a4db" + }, + { + "tcId": 1637, + "dkm": "860e82abe4eca481fd0e55ad141a2bd86732488937f1b91e7c8ac71f052ac4b21e05309824a756a35e88523d2f47b08bf81f381fad94fa3cc4a4561e306ef3a8340a66893dfa559a6d307ba07262a51333256b56333b60c579c563a67f178d4075d01c98ef5a3c01761b9f3baa02b86250074676ebe600af183639b6af209519" + }, + { + "tcId": 1638, + "dkm": "e2e477cb70e36da9f1c038398cf6ad485e30927463d4001dee1bef5abeb8d1e4ed0da3a8d6a5bbdc9c1b0aac39995a7676ac112cae4e3d6787001b910879f6470d6d0097cb686e14b897c89acdffb48e9099b208a6294850ae88e342ae35f6c828217cd4c813e5dd6841a713d651384db04d244c6fbaad844662aad9a0e76774" + }, + { + "tcId": 1639, + "dkm": "ccbd3824caad8c9eb45398bdb1bb1fcc34ec8673d5013762525661149c5e43c388dc3a15ec882705e655ac4437790d7ff0617cdac3e60ac73f0c14c7d5bad3cdc7cee777cbeb24ae8934b30bf33931d0f976b4691be3a49d427223e105e8cc1a8c474cd585f7c441ebc9b212f341e4ab05b675476cbf7c77bf5e9668b2261035" + }, + { + "tcId": 1640, + "dkm": "251f786feaf2dea1d00cbd75c572980398c96fd7a679fb24bfc819f930b716778eeaa77dcc9f065679cfcc3ac31bdaa6708d18cbca7e88490937279edeea4cd99a3f94118bdf5b18a83742b10784794b70271600cd4f6440c79e3eb4b0266b5bf6bc1966820ac540e88674f67cfe0be0d2e24125000da84ec671da91447357e2" + }, + { + "tcId": 1641, + "dkm": "cc4a013a5b5ba8329f114e4bfcfa16f7823005366c10451edf7b725d6da95bef91c587f601d72d52a18bf3d8fe573ef7dfec573fcd107b427af97327d1e1b2b61c65e734856a2e5de1142e7e87fd36c07bd1395ddafda093e610261a8683e75e03f584d5d6e038325e54a3645a790f15c021efa4e572ee244045460ecd69be23" + }, + { + "tcId": 1642, + "dkm": "6d5ef09de36f4ebb9c74b3e534297abc18e8eb56a4a99899351174cb3c07f84904e7eb2c8a8adcf31e94a78ae33592506080bf19ad9ea9fd0aea16cfc86164d20a12a1ba8505f88246f522c08893c9796867e3e68da17a24540326e1e013e0d8d17e5bea8da8dea33615776e73c4d3942699a1584e666c9e010e7e911be2a163" + }, + { + "tcId": 1643, + "dkm": "4f6489aaedb8565a1be218180fdfd361a021684f95cd6d3e009cbe1963c25a2f193de90509b54b347646b3210c1f89bc28783a8f226a8ad471180cbf5136e3e2ffeb6c01d3cdd43af03b64416fa0286681bd00dc829920e60fbc5e508d9af32e36f5739f0b0335d42948ae14f61baf0b02c5fe6413f792b3f095300c25df9f09" + }, + { + "tcId": 1644, + "dkm": "7c0603893184ddd94241577e3c3ea6e54c0821f30a3ea940e2ecc0829d93ffbb2128d08f75ce4df2a1813ff0ea11dbb26665f901a096a503e812623ea1c69f3a8753d3dfcaa573a1d4a07ce4f653e04238b1ea5188bc06159fc3cb26b817a69d6d87bb264739ee13218c46926733104db9a6ba4e6afa931851c5ba483c75b3ec" + }, + { + "tcId": 1645, + "dkm": "9f5f94be1ef2a1d36e74c246a466c9022b743b60d6c6a94b6af4ea3c134c570aa209061f4f0345df9a7f8e838610ac97ecb883af874fe299ebf91b1eb4ff13aa6c6b8202c2028f329b8f5829b5223d1b1d410b60129746c46c44b2ee969d7a55549248d5c6d603cda3c6b73353538858a4ef7db031cfdc8909665e3695b5c8d6" + }, + { + "tcId": 1646, + "dkm": "c4dc81f2317788fa630feeee5524a39c337d98dbda02409ae7fbfcc467523370ac86985bbdbe9fcb02f78259392312d108fd1a5a2a2984d830acfc055ed74a97a625aabfb285328e6b4da58076e626aad0f48cce9f1dc3f404533858e8699a8c2b8491a309a270976ca06ebc26a9b42463049649fbac5936df00e9fc4c673887" + }, + { + "tcId": 1647, + "dkm": "5473ebaab4f0e5b3a2b91b1cb8fea9b7e5abf5c24611af14efe3cf851f45ce1781d0ef710e13e1c1952e81432b9663e4c4a2a7980332d50fb3f2539d01f0d49963b322f597910095f690482864a02ed5ea02ec19e0bcc423588098a855eeec8e52045abfa4eacb4d989b24ee5a38947082c04dadcd447da51dd401d14ed02894" + }, + { + "tcId": 1648, + "dkm": "ae8fe51b813c535508cd8a0a96e3727c0851e898b74693c3151c05066f9a65492d92fa0ecf8c8e86326f85b4b066444a76eb38df1c88ee9df81e22777da719dd4a959051e091ee3e56dddf55da68d8dd13f9f3b17dafc1bb50b7a4a6937aad7755b95efa527d195fc6f81be9cf7dcf82c7873c09cc9fcc9c611b21f7ed2cefea" + }, + { + "tcId": 1649, + "dkm": "c92f8a32dec7a6881373ec1c46270448ad786401cb3fd4dd0eea608a054c2c26c2480b25f845911edf1a4d4161834fa92063eaae4528b05eda1e5ad81b89170f547d6ea2c137a062c5099d2096aefa7fb57852f3f934d0782a5382433779e377ae139b46e1c8bfed06313d926f9c71cc13c9430149329d01517a1abe84e6876d" + }, + { + "tcId": 1650, + "dkm": "0e6d2542649ee5d43df1d9f19b0a9318c590f5f0117844f02abb6feedd680f1e31cc7017fc454bd13f80b168895582198c227a9fb1da06b2a46aa19677de95942c79a8e9ce3c75765c9e059e711e740f8a6068197e1c93d21d958692b44fa068f41d27e4195f588b1b1c96919daea97446457af25b557a5ce519db6fba19f2f2" + } + ] + }, + { + "tgId": 67, + "tests": [ + { + "tcId": 1651, + "dkm": "7bb58cbe8ad8ccf3314204ffdbd69d5970ea28f5b30a38601aab12d763ebed1126d1a2a4e993a4bd331f9ac786348762af43c4d02e0449da8345935b7b4a1cbf48f1a32da7a771c27052bf3d6796fe47992d8f87c5313791d672f440a3b0e52b52a8fe94b0f51ad7cf6b5b5492e9fec21846da4557ebd860381738627dbd287f" + }, + { + "tcId": 1652, + "dkm": "c08dfd88711d057e00d0e2b1d9e41576cc4902cd14ccf6a842dab2e233126b1492620598d138d38923de3d875c7d5641b5aaad769d8788fb17777d1ad33689072b9d608d4dba92ef860498d9fd15cb3e54ee308364decd4b5ccb06bd7e0235dd06a73b44ca2c511dba8cc5f42598d754d7b7c7e51b56ec385d078600eec1267e" + }, + { + "tcId": 1653, + "dkm": "ef9c5859fe30d90a404dc5ab8fb773f20ee015014d0f852877177b1a1ccdaa74c52bb70c28c5bf0c630d12223f1b9635dc8890de827e92dd304f66d3e77f583d73fb1317a4f5e483e05b9f73021159c3fd2147259fc499439f7fde8f90259e51d64f185da47f371a2a07a55c1ad9993f561442f711ddd670f9a342452a911b99" + }, + { + "tcId": 1654, + "dkm": "53da402f1c2dc0a684b9acda4b05246236c5ae7b7b04b6e4231ac034a8fdc37a836c3f211a3644cf92e639b0da8a7acde5944c53ad3d478268bc31b4e4cd903e63165742f0b04a248e80498701c1195bfebc235e905804427efd5626bf7f12c5041aca99a77eb6ee3dda61c8263ff8e4ea373aa679f42f0e9bbebab0cda2150d" + }, + { + "tcId": 1655, + "dkm": "32c4139f564da05a11832e8a873902b0aa513b2a97b50a38095f2b5e8d78a555cd7036c00d048d679cc0bb1dcbc09f58eb0922600b476f1a6af4bc91a4968661c67d270bb80bd25db9355b36555ce3dd877b22e266766ddd9ce9a13e66126dcefa5d2b57066f024e17d984c5bef3912df2ac3890908e634d6ebbc2c4c59517c8" + }, + { + "tcId": 1656, + "dkm": "a689cbbea1443940d51b1b34cb9f95c293d05dbfd6a1e39554d94685cb65204a5db022449b12aa40a71fa7b51640a204faca2b60352553fa6e03b318551ad8bc0477d620d056e49853f31f43990b82d3a791378ed8227854dbad50976375ea226642c5a5a6ee3633687695ff3dcb0cb6f0b20171ad77d514b149bbda72d84447" + }, + { + "tcId": 1657, + "dkm": "0d8e432d65546174fc5ab9e2efe485e0334f0d0904559fde8deca936d66246dd554e3ab9247bcd1ddff5ef19368b3794de891e9d1cdd6a6286f0a3df9bb287cb58695e083524181f8ad30923b006887e8b3bb1f1f71d312d0a68b81f112a9180d278a73842f3c7961d4f3f382319ecc11cdb30709c3b01449d208018a3fdc95f" + }, + { + "tcId": 1658, + "dkm": "4abe94bca296624eb63da510172f42dbab587b1e25965a5055022225ec229c792e3086ee7737759b7a5fb8c6f7fb0e3c487daabc9b56cca2ad01bc5d1784bc3ce6c0c52c1ec91f0f51b698e9a0185314171348b379e4bd0da8331643ad99e3f0cc72cc385a648647a3e65827e3ad2bcb560819e8bf48a82feea186123f0708bc" + }, + { + "tcId": 1659, + "dkm": "13cc4dc4ec563435cc4bef2b6909db313249ca3a81fa5c556289f77aaad199286dc92879a25ba8479201a6a4651dfe497135cedfb7a1903273900a9ff7a25830684810b56c2fa08aeb2d657b6fda7e67cef87640bd1ddb88f815b9028ddc5f87e9c2c2611917ddc6183367733a605a87f3c184f95647bcb1e417883fbe0da12d" + }, + { + "tcId": 1660, + "dkm": "e08aeb74ed6a9623def57cb10622d4a5efaba41fd8842b7d7f6aa15c3fa7b6742c8aeec42322673c9921812a85e97179835e8720d7810f55a28f5558d6257d41367f3d53d5e5c158704a03d2b6bee49b1a1358b83a5b99ddaeb2979a1dc585f1ac89a167cfb72b21335150f6825084d867bbe2c656de514d082626e46d029de1" + }, + { + "tcId": 1661, + "dkm": "84c9bc9ccf1de7edebc2ced6cf6e63a8b1f76d7de1c8848e9f82a6b26b2504f69873ee4dc74c6391e4769b2857b49c23897bafa654917db51a8fdaf2cb0e4dcdb2c050f78833eee94c1a48db560a06892b32c0e32007f81b11c30e1d995aaad719e6962bce555384b8112ae7ab443070b96f34edc407efca094b39b81a72eff7" + }, + { + "tcId": 1662, + "dkm": "d288a63c42329800adeac4806dfe7411ef1043f4659feab17a1e01dc8071233e9fc60c4a69eacf35dec3650c579970bcce922e4667c92bf7670875b4ebcb11fb3ad3f0c44b3bdf18a8ddbac5a858f163770563054bf4ae5b36607ed2a830370c3e4008d1cab252bb23362349c6c44f35433fa8cffb478c5bd2ca562be03760ce" + }, + { + "tcId": 1663, + "dkm": "12e0f420dad4b6fb790b84500c455b48aa4eb1f0f54876ef55560dbb6267dd20ebf5778dd3faeaba9c5c1658af34cbfc7baea27927614df19dcd00980e5a59b3547218a8f32d0564e3007097ed1364f28452b47411f0acbfe1f1797b94854afb02ba9b4182697f5e0b65c96892cad74ce1174f5aad81a07e7175519c2d00efd9" + }, + { + "tcId": 1664, + "dkm": "37f6c451271e4103b047113d68ae83dea025027e9110c44b0580817020bef2d58a545832f0bad7286bd532084037544b83e81c3e18536dc6a11c60820b7cca7de4c1e917be8bc27c630e6ed021bdccf1071ae02295813066e3b1b583c3bd1c905fd30fe9ab9dde6e39148db9e9d2ef1ffda5ac237c5f39e894ef44c091b68a5a" + }, + { + "tcId": 1665, + "dkm": "f79526e24a9ffe5f2a18e5699cd204bf6ac7e13350131c4018784ff3302dcc4f7d13229de29ade338a7399a52cb6a940eea9914d0144936cfa8bab2a248e30b6b58cededd355513dbf3da3463fd9b812e57d5e42afcfaee864f4578bafd1f1f85ddee2d706e535ecb4c539bb40c5d7ca238d8aff5e33a25cf680fa0df7d47ec0" + }, + { + "tcId": 1666, + "dkm": "51ecaba9f9f3e69bd5e696f0263695bab3675ebfc922de933d7a8a87bfb3ad1890ec4c8aac1c7c9187efd6cbdf322b2e73cbe5366750c85c777792e9f6c6a3747d9565f3435dd8b55a68761dff7493b696d34ffd5511854200f38e9251ddbc0eae304e85134146bafc14a60ae0fea59aeed021498444e7e91f2044dd49c178e0" + }, + { + "tcId": 1667, + "dkm": "b196adbdeab1274ca95b6d0ef83d1ff5609ea4263b368eac9fb7dd706af34807a4d7c2691eafc035e91e01fa97f29cf5dc8e211efe18571cd1e153ad986fe7189ff7171b742e493bb413a61c6f8241d9d3da10ad3d5ae078c5aee7732aa0e9991e5fcc0f02e316c81071eb106570f51e43510e04373f7a92e3c51a20fbb04ffe" + }, + { + "tcId": 1668, + "dkm": "31170ee3f21b4636f69e7e9b060732dcf28e0887ae91bdc26277e26a6ccdf7fe6ca5b5a3c45cd7ba05de02127366114facb635a580e8f9be25444c330b1279211df9a3de6d28bfb1ddfec7edde8343cd7eaad49e804f1493e972daa8abfa31a061431dc70b735ff9dbb0532bd95b10fcd112ef997a5938fece670c0f6e0ab851" + }, + { + "tcId": 1669, + "dkm": "c76b1c33cc7b536923ca1b7794243e704774a6fffb6c7d8f2551eec3f200cd70f32eed06754ebf34fcea7e4e65909ecd1260d6c2316e2f17fa16f3507157388e1482ea26d97d5a7aa35fa8bc8cdb33c47913582f47430238ac242f4ebbd090963d75969b53fd4bfd4519fc6089ec7c7d4391681c2f41e379eb768e161e101d1e" + }, + { + "tcId": 1670, + "dkm": "50409707bbf8dc4944ddcf2f1d3bbf3c1adc2803a186dd0e67cb8df9bd6e0640fae54b613aecd50d74c0505539434e73ffc7291a66a8c2a8c3d24c49195535932a1539c778f5e5c91cb8f762b66828f133f825a2417e36d7e0141243ab7ae614daf9504bfc2931dea92ae7e77d55375700bc9c5733e753ad4cbcb4892f4c413b" + }, + { + "tcId": 1671, + "dkm": "36c8c5f2c1ae58b8cc8846b91ac123e4561db27403b819b0abfbee0998b14b249d77118d8dc842a5ebd632022a3a789bec503864c115696301772fd5dc2909e67f7d84ecdfe915a415af9a1fd8054bb8892dd932c2b612b0e3c6acd49e62641efb7a39474c22837171d554e950904f82d082f8838052d7cdf94f7f050b780028" + }, + { + "tcId": 1672, + "dkm": "a6ca747a60807569ceb52b761848d4a653a31691ddcec5e07f8634282334b9102d9ec135263a390f3fa1377f1e2395b0576404c9621dba3e78e2e2f6fd9e7aad2567edf945ff6c89a75bd139e79b031f0a0e3090729233529de1dd264cafbf9f7e585decea9d113815b38bd2c975af4820921f55692dd3f0a958cfa16ceb87c6" + }, + { + "tcId": 1673, + "dkm": "2832ff69d118403b864f2f0895932f3aef914f1e81dd9f5f6092f134b4eaf3d53e7b94f00300cb61fb2a56f5994d93726680dfa825c4ae5e57dd9de91c2fa75988ead63831b0f90eabc8703967faf179130f909ac081d201c0c65ef844f85d5444044daeb9104a194d6578d9b38d79f94b689aedb9bc91527ba14034069fa10e" + }, + { + "tcId": 1674, + "dkm": "0650036b5bc55da22a43ff57a0a921924888f3f64412e05a3e36642103f63d8e1c5d9079745c503a4fea7f4542691a2dca039f25a233097a06646465f347b784c900d2f4417df0393831ab0f5a95e827258f6432802d8aade1536baa67e9da6a66b6533c9c596bc022f30d8c0d2216797e6b3b62e1b835fa55b9ed98eff26c4c" + }, + { + "tcId": 1675, + "dkm": "78bbe7a7bf2172ae321b1489f634206151c75b0e298e499cc4a6184e696e3a120a28d00282ad4ed1f0d93d7366a4dd55191f0ba500ff1755f64bb15a64304919ed7a5fb69bbf11eb15c969eb821cb758bb1901da35946e35b3504fc4bf3294ed6422ea66500b763dcf544f5127b6a84eb98ded44009564a1732289660b0be676" + } + ] + }, + { + "tgId": 68, + "tests": [ + { + "tcId": 1676, + "dkm": "72766be27b56a4cfb690e0aeac9324e9045643cf1f3dab5dfe0aad9246ba56fe62472b3f6d445a51b17ffd7468112b810c17dda3f402e4744d3bac53d3502e6ce6b669d0d45c2f2c159689d1dea1ddabf10e76ff66612aa72839ede1b99ba380b38d620da245a7fb456d262218a8528bbb4f21e585c9111572eaa4c0b4b2c941" + }, + { + "tcId": 1677, + "dkm": "f8ceefa337dcae21fe57aaa8797201c6c00eaa79c01acc1d3545d7c9c46d7a2d85f2da8b2fd60d549266198d7ddeeea489fced5eb3a2800e7e8afa3cbc27bb2da7c370dfe215aac3f78327503a6903d75c3912361929e21470121040ed0701ed5e717f0de3b67e12b690d6e921cee75dd7363dfad095732d48da1c818752bc04" + }, + { + "tcId": 1678, + "dkm": "748d91fb17900c29f20905eed2aba9e5b8a6ab69efea08668ba0f4613bf12020d23883cd3548721d5d39eaea666d5bae6111cd287fa24e9c5745ee56225ac3224e35faf97a013c21b7db4a79a390969058c0c0aa4b39dbcc32760dd0a7932d1bf3efc59336985cb0dc4e148899ca83f8ad3283743b3e49793433ec6e1c172451" + }, + { + "tcId": 1679, + "dkm": "1cefbc52cd677059393a9547052340ecfd82eff17a2468dbae27dd5d94cf310dd71d15dbbfab1df6541f36af22bb6dca67061f65c2b686ac1bc9ab9270632c637b65fe2a5906c345307e4de91521d52317cbc83a5a067eff27580cd148517cd95f53c505e2a5d2e01bbe6ac5da772bb8bb9d24b67bb1615e8f31b80f13bc0008" + }, + { + "tcId": 1680, + "dkm": "92a52d1e366664e09eddb08cde146b4128fddf7dc1deadbcfe23157de03fce4dfecf93ad254dd6b9d5bea276b48b93ac9277241e9f76e1684a21fc3f062886be6e5df98377d8ed8f6da69c99a17d75958c7763ff027863e7b8ed8703846303477824b17c07c2bda2678b6fc29bd7eb876725d483a15fc473bed6179ef7f1fd43" + }, + { + "tcId": 1681, + "dkm": "0d0b772c1f468a90da51ca00ae2bef0022ca7b99812074150492f98266b191ea1b73a69a7b5bb21a72a8c6e2ed9084ff60ed428315bb0123bbb9a3502857d02f24fac2593c4767c558e0b3d4905bb765b39f132d8eabe1be4da3f04abca0a18ac72b45d47723f24a991f9e5846ca3101910489a6990ab1fe31a2a0d09d71dd84" + }, + { + "tcId": 1682, + "dkm": "14b7ce4cdf5a10526bd19ec426bc61159b805cbdd3f5033deb5f7d41781d11c75b2ce26575ede916a9d16c55ca546211aa1bf0a55551b3e8c36749cde8b860f0f58a3eb81aaf279a782a954515b6c52e2c3ab3b3edf9cf988a87a0afc9b80b159c272d5883900e7fd7c7d26fe4055dd7e96b359cd4ae76112ebbaca4a18a1492" + }, + { + "tcId": 1683, + "dkm": "2135639b7db3af60cd39073cad658db8dfc332a9ae0757e594bd28419a07b681d1f23bcf26d35f191f8b2ae2711fe8d6ad0bc1c876328d531eda1d7ddc32f9df89a20c745323589d48a42a34ebe1340ac37763dc9742fb15c923a4b35922c1eb25576c3802c151083086d811b5bf94c747c9c3d412e9c333319d351629e091ea" + }, + { + "tcId": 1684, + "dkm": "7162d5a33251ca5a26f979a6d6f7c62c9a40f70074b8be4929431e0e024155cf342e91da5be2c2e630dbad185e8717467d470e2c722a3395790d6ac54900358f9cb7976cb3b868fcedbd31091a293ddcfce6926917f603bb5e0e3136488c598ad4e796b8c331884fc4686481643938a951eb613b9a8679bcb46ccef4c6ae0640" + }, + { + "tcId": 1685, + "dkm": "d24ac3437e142761af3013378050884cd79de588dc7069e3b37feccfc9f4c8ffaaaf70ce564db652a2567c6d6cfb14f998582d07b50abe911c629a4e410acc0db4725ab849b256d9daec829cfa0c15f4079a500b10ac9e6f58ee459a999e2e65510738aa038da38c2e56a0f08533168d81d79a0753d1e3a2fae72df3152b7a08" + }, + { + "tcId": 1686, + "dkm": "7b7313ff8cb578d0b1dbe6cb12ec0c9d662e11f3926205487623e4b59db6681da0c9b10f5a09ebfb4d382b0299919a3cee4fdc14a70dabeccc2853bdab35b17866cf4b6984f397f8c3b49041ba3baaba882ed6294ab9ef2a8a76ebc3f8cb98dd64126541e7b5b11cba74e98d93904b2cc34f47217b5c5c98e08ba8337567eec2" + }, + { + "tcId": 1687, + "dkm": "7c0f359488434bbb6210543b634f274e299c180d684e075632179426f755deda48afc495ebc6a57122bf365e838a0941e233ed7b64dd17b93ab4575da5500f34cea538f12f9cd62c9cf77292cbd2c817b2ed34f582ea924f5334ba458b862625182c5a7b31f8b45c80086e434e212fa0c2f6e7482799fc75e95214bded7b9cbf" + }, + { + "tcId": 1688, + "dkm": "70dfd6469554e356bd27ff50bdbfe925b1a212599ab58d34e322ab558203ce35010b0cf313f19e125b331ceccc5a326a736db325c6ca7a1fabe450320d078e22bac7a2180b5f7c7a57222c101dc2b734cb9f9dd595b9af8dd732378fb6899393b7f37b0725bff424d6e3070b9d2aaf9eed0168bf283476232e66948e752c3713" + }, + { + "tcId": 1689, + "dkm": "75217037469b23713b1dbba0e1159f20fa227529913571d337c4f5fb41868164af9afdc6b9247135308e5f62953d56bedd97a6acafc783d936fc85cface1c278a90459bed8c910e13c5a4d387515c15ee5a9d3f1c451dc5eb7a612528ead60a94bd10224ad9b4ab059b0a85209e27122a3ea7708e562ff4b5e794137584dbec2" + }, + { + "tcId": 1690, + "dkm": "898ffb2ac9cc7e57f43d47b6e33b3f809ebe002b76a5ab81391ab3f2fb99cbfe965c4ec9efe7f9dc10994179ecc96d30ea6f3f26164c4013d4a8276398b1d1d122b7bae60c22ba47671aa897ddfa848177fd244e8f3d6ff66e40f2f9f4192501b722e4cc86398ed55f89b2344eef504ef037210e695ea8599821be74158d3332" + }, + { + "tcId": 1691, + "dkm": "24f2243ba93606578e36d0faad11f2ff66e8174216402435af928fbdb1326eedd96e696787d6114254e346f65665396e5199a16c88d37ae2353549c5c31a97f1052a00a8540fcbe2c575c83bdf2b0c3cb87fdd0c01728ff1b083099a627ac3de1a312fe15806c307462f44dd476100747de35304382689fe557f8825225bf968" + }, + { + "tcId": 1692, + "dkm": "81af138ec41da52f93841fa10479b43825e890e56f08160ba25eb83b9d6e403a80d9a05db10b31b068bba94478c69ff6285ec8fd9f47db5274c33e94ced287222ac985b7353579d5531cf23f288a531651d1cf7c4bce888be6bb639a05a5c6537a895b90a9136b0113e4e83555ac9f8162e05eb6d0d91d7cf5b2d01fec8b8c4e" + }, + { + "tcId": 1693, + "dkm": "686a1e061f5e4234be381e5992c54effc49dc262332e7832be5800c1449e8a279e11901106275c30287e1e0fb9661c2727d848db1fcaf533af7cab19d6e4f0eda9b4f9e28fc00c4eb95df847fbc34da112229d35e7e0ff24c63a32600ce19cf836512dfe5b376ffa91505b8ff127778fbb84c9b54e9e9fec726dba48ad502040" + }, + { + "tcId": 1694, + "dkm": "6eb50f73168abf81bbb8c18cff75fb2c449156a278d6484b1935a3fa3fd10362b6a00598472218493f28e21349162b7ceafffa246a8075088d5ef1dddc970794d0a63c8ddc7a684ab00b488a07603f1ae1762e01e3f5bee986f3ed7dd79f85c39070307cf8e68ffd6056297519b30b73e4f4a8ee35daf6a49103f557bd619f3f" + }, + { + "tcId": 1695, + "dkm": "e61b988176ba61211a185ae6b787b911c5f6844bf2efe03e36ff8633e4211cbca856f8a8d65a4114f1c6451a6fc620364a08ad89ffab66c005c63592a92baaa029789423a28f39ba778ba3cb1b77d460ac6a29a472e098439d1d93739c083bb232fcb1b76a166186921c327c1d2d7cf52e9a98827121b486e02c1b9c312f1a12" + }, + { + "tcId": 1696, + "dkm": "64c4fd570b812514606bd9cabae09e3833528055d2851d998b8095ecbe4746701785f7a8428f14d464bcd138506d814e588c5a27196f1468e038572d4920f361a4ec19c3dd502232d24752612e545ba52671c3a5da4f792f5b116af181e5eba57ba9817b767f015bef54df7cab49b01c7b2fa2764403f7fd99a19249d2342283" + }, + { + "tcId": 1697, + "dkm": "27fdbfc3e33620803c34aad1a4dc99b8791dcaf85e1eedd088a2049baa7fa2cbc400d1be34b65bf4e79e3e9374ae80b016a20e213f86eacc55089313542a5a5e85f710d795da8c86ca103d072662081ab185958fff9519f147940ee274611315ba92bde9603471cb3c7a5cbed76d389ccc4b65f58449258c9f16146b71857d89" + }, + { + "tcId": 1698, + "dkm": "756eb5a5aaa29ec5948ccf146ee3ab8aaf76f6374a10e5b9196bb7ff719ef7b5b858e09ae95344b3736884bd34128146c6daaca5065867856a6ead4aaf65cfec2846b5fcc115c8e80ce368cbc2dddb426b0ac1f19db9f91e9d89989fccc22633cec537ea12ada1d5ec9b2558d96eeec52e2116218756589c9d035d8a6e5f2799" + }, + { + "tcId": 1699, + "dkm": "63dff650aa89728853a79d7a6c45f66a4d4ede2a662cfe6d8797ad9afc6ddf09a4b9ab043acac7eedb575709fbc9cc868de8ae703b8daef9f066af576793ab61600c92def8fba8841353e6443fcc821f4d7ccb1b8482ed46978865f90b9f3037794613b5b3fd1ec9fff09c53c8da67c1340ff3ffa813bec6258e150bf108fc3d" + }, + { + "tcId": 1700, + "dkm": "bf50016d3b54a47fdaed24d057d85e90bb5a9895bf69cea90c27acbe8c0871ed918bca2ded891c29beed974fd167ab0c4ac80315b7ea2569bfc11b70e0cb83064ab198011d299318e0a98b550aa9d957fb462e6b4b9e46a063e6e13dbbefcbaf134de84091222f962674300f3af3a69daa15c96691a1f5d2db20903026b3ece4" + } + ] + }, + { + "tgId": 69, + "tests": [ + { + "tcId": 1701, + "dkm": "2955dae7f0e2a81434efd4652097fbea84519ceb1ea0788bfb6b0bfec229e6e35879a1ceec2055061aad52ecde316dfb2a8098aec03709e55bdf28cdccc6d96902a0d6a7f691f234ad803568104c169ab9afa324fd1b89c6ffaaba2b4f7c04ae74a6ff5ebd078fc4dca02ed2ac65bbdfe480d6b79ebc241e496b07657794fcb6" + }, + { + "tcId": 1702, + "dkm": "51a0122aa2a97a2f822cd2130a763753a9f01d1b06575e4e9a17529ebc9adae8585be2efd7272fa2fa3d37010fd751ff9744fa27420e37975bc464118989d99e330cd807b366c078dd5799895b221c718c3732b035615fcf6ab623bbca0ef4cd9ea1e773f9157a6e659b1b187cd019d798088b99bfac6cdf7014d242faa3df09" + }, + { + "tcId": 1703, + "dkm": "d06d8b47af03f9b37f5231cd812130c6a9df650268865c3e423bdb1afa8252867b87a94b6eb90b38698655c5127dc79c58ba58d2c39b9087e1fcc9a7936456e89bd7fa5a21e18c9b7050133f2971655742d4c8e2f76aeeb8a5951ea39d24b84d186a19e0205fba42124162d8332d7b43fa45b333cfc2a7298a261f818a9835a9" + }, + { + "tcId": 1704, + "dkm": "f5bcb3282b6b96cbc3bb15f7722e7785d47b40f68495605be1b86e11b7a52e1d3dd5637d55735584e2a166f2f10f3f540ac73d6e72d906736d57751c8c70bf097a945e9581962760efbfa8df0b0c18a10d27a1f9362515a7562c07fc4767f38ce278723ec345281e013f73cd626a091ca911efd30c17d0d6561c1ce7f67284ca" + }, + { + "tcId": 1705, + "dkm": "429f8f896df9751020b3f465dd3542e5c8952ed62699a0b71c7bb94a6c7c79e6a4029014cbfe1590850420f62c87e92d4825ce37866b7e905e5ea41e093822e6fee3a36522a5e055b2fdb4c7bf172ae99625e0a260b72f9edfc960714e4f209fb06b0b33c07b3835f0cf03812542d86feed19311e2d46426860215ea569438ac" + }, + { + "tcId": 1706, + "dkm": "5e652ea1b7645c98814e5d0ae088aa5dfed4b323139123d4b0d122b54d9cdbcb67cf84bfc2c28cb9964da1ce13aefc8fa83ef1841756c69f4b66d64cb89841a76081b65463f5278866e132a9002ce280179f5e0cb2661e83c0af2057e3573e3dfdb4a99c3dc0941a195f1b9b331681e850b885d8c21711380d47103e7bfc1f71" + }, + { + "tcId": 1707, + "dkm": "ae36ee68685df213dc69de4ec2b22409dc8db266da031684b98f0966530c75f81c872426a41baa27457654be6a8c55ea3b1307c172a403acb22d22550de391a6c2ff97fe578d1ed7bdafd75e8c8b33473d422a660ea0245dffe8887b92a414fdc013d44517229f3645cb0e7a3e124a9e28f40dbcf3784e4816edef711ecb1377" + }, + { + "tcId": 1708, + "dkm": "40fe27666d4bc31147ec98337932b86679620778c0164e5b8eabf5bc2b722daf1e7d571af441bf756fc19c535b1c7b27710ab44dbaefd857325eeae37b4b3c2f339a5c66cd3e0fd9fa8036d83f4001f172392f98cd55544a1b59fa17697e6fb9ef616709b624f808ce85c0703c409ceb83c766b71c8423cdb65576452befe4f8" + }, + { + "tcId": 1709, + "dkm": "787a0845a37552dc92d4f5f81d2ee4341a1e0166240dfd4b4f1f4295aeeae819f7630c0477ed7f7e7c183e51ce792ca5f99a1be634f82f97016f5c4356ba2f9f2ec2448ddff41c2178ad45b2621cf1e321ee16b0e18ceea25568f1790f3475e385f0ccd8ebe19a839913d7fc54beb5def806dba52490401910098122da190ed4" + }, + { + "tcId": 1710, + "dkm": "3eda743b12b94b0225bae330ac4b36cf9441ea4a2251ba43685930cd311e8bcbe58313880414098f10e15513dfd639585ced43ef5c157b34a0262719f7d5882f26bddc8cf31a3fe90369e115e930c6df387f58820858afa4a0426f95056577bdc08f79ee111799e68f00d71e283ba1405d16f4c6fecda22292f438b950c8a76c" + }, + { + "tcId": 1711, + "dkm": "270d8e0d6d1440c0642241461065bf6f3360e86726c5e0df53988cf3462a41244ed413794f0fe1e9536e3b11336295dbdfc85b2d48c90cc9eb0ba1ee54b9c1c10eeea0134535e3bf7bc5c286dc3db4d87062a4f2f1be7d3584dc8ba95c0e89059d574748a2094475de135a69317d4dbdd7c4a5103e9b4213bdffd0f0c57a3648" + }, + { + "tcId": 1712, + "dkm": "76e01e83dd5fdcc97f577a9cb667fa13883c5fac5e91d855fd19593683f6a5ddc3fb48d6301a149e2db867f83557c8e6637c2725b0d980343c9025b45f20bbaf6ab4242419f729373e7674880b46a45f78a51cc5d41201664696028df36657a0363801feedba0b677588213db7259983eeadadfd509e27331306077f349268b3" + }, + { + "tcId": 1713, + "dkm": "ece901ed759cc7fdb29b330c4cfcfac479749dfe1d97a43c01082edb71048343a42119218ff31754dd8f5211ec8e41e64a124425bd4c78b4af221d405a641b36fe959a82061b53da74f96e6a5efe0af742c0d63a34821d45ade59ff904ce5d98710f2f14315fca077f1dd318f4204d62a9b5988fbb8d63d892794f59c1db7449" + }, + { + "tcId": 1714, + "dkm": "5d3aa4bf4808b47909c2d7c51238ed95304f76a2ffbfbe279ee41b6fbf39e3f18c6b125afdad26cb5f941de3f1c7afba36debc301b6eb341eec2d4ff6d5a1c6676707aaa7168ed8a86e77c93f3651130ae6c5d56d238e6a4feb6f9e40872842ece89d730ab2f9538ed91e71a593d06a1658d7e95bfb70f527410934ded91e7d7" + }, + { + "tcId": 1715, + "dkm": "0cfa67bbd88b878158b3352916b8684dc0cc86ed37ee8ae194fe990037927b36e6da9272bb80b924a79e0a38061de4b80f2a66b48e364c2b249223279ae48486bd7eca30ad56e1a21c0b066839e8bdab41eea92e2d416385e3622f0101b1af25993069ddc91a471effe254e50525fc4bf22edd03394da47b546b796123ca4cc6" + }, + { + "tcId": 1716, + "dkm": "185225c84cfe4f0e1abd1f997528e74faa6591e4f8f2dd5edb3b9da63e8cc8aec0d08186aabfffbed1bc21d35d8944f30464a62db09455645a79e050152333a6b914538cf6edea036281934671d227562a5b2925ca9686b08674fc56ce23f4d10d466f695ef5b2e056788478634e7250753736f0aa56531d4cccb8820a728021" + }, + { + "tcId": 1717, + "dkm": "a4345d742cc3646b77f822bfb373d1b9912566cd94fcf562a0b3795f2cc18b36097278a516982ddc91b42d60612b7425ae772474e2fd2e7745487f6e8bf4e952e47733db6e283be0c4aa31b4f70c2e4fa8e59fa4ee61cad4c07f3ca709ced434047e69c258991d7f6ae15f00a2b792a4c3edd0a77f1934251e643c4f3d74b1b7" + }, + { + "tcId": 1718, + "dkm": "e5d5bb1cf18f6df62bf73f97b833987530a170f0990fc8a17b7f4dab214f48d3c407d1ea254ed08620617ddf8ab019c6b724bb8bbb1402e4e2348798e71c1b7ff26c54cecb4d9651fe46afb1f75c8f08562cf626b130ad7474aef605e0190ac7fd820c16e920eb4953cadf9e2dddc98c7395e9b253efe310f62af564e829522f" + }, + { + "tcId": 1719, + "dkm": "0b0de0233a8fad65fd4e4d80b9bc731a4326964cdda4b746a82835382254f46629ee2593972be9a1f88ac2b7392d49214445ea4c80b5e31a730c1a189fa1dac937623e3183f62a6151c27dd52ad17bd8794a988200f1cc79d6aca3885bd669324766c93f3c361ca8650ec1ea9a012afa7dbe80cd8f6391f0503b8a379e956115" + }, + { + "tcId": 1720, + "dkm": "0706792ffec68f183a6f0b672abf5c05905821c9e3574840b058654d541cdfc688aee29ef74357f3e9b2e9511dd601e81818c2106517f341b8b576da01abf4fcfff8adb7d500e7355dfd9965eea00e560161105e8177131f5f97a08eac94c20bfed8c2a635dae84c1a3ad4375556d1edb00ec70454c2e3bc5029af809f11783a" + }, + { + "tcId": 1721, + "dkm": "e10ad8c5f86a683c6e14147fc6a71eb7ee4ab792feed827d08e968952d82dbf0ce65bcc62383d10fc4b54cdc6a79a7b77af50c676bdb9abf84521d91686dc392934d84c4d444b19ceb021686e504a3728ca0b9844dc6ef4f38c33f65fd45209a109385fc1976dec7de87611829448e56982759ff28d7bc676bbcf945ea215c17" + }, + { + "tcId": 1722, + "dkm": "27e219957819cd4ce31696874283ba5998bf9e7bda170a27923b6a52ee668b4e480b1d0826de0a3b4468267aba5a550becf1f47cc7ba3785a0544a5c03525c02b0e43936d9b6f8af0dd4ad748240f499c5a05953994a42dcb98e6e4e3fbee3bb83dbb3d45ae60a98fc8225a9506b10b3627d3d1d5bdba8e650f402bc5ec26b2c" + }, + { + "tcId": 1723, + "dkm": "0c2189e6c2b90f58161bc5c96af6e05d221dc656004e336694676b39e23a76e758fb36c02016c5f5817a8a61f5a84c7d7f2d93dbc1c80aecb6f5d4b2d7073ca5110b0fc4255af47bce6d10ff858b7b875944802313602be68b1e2badbd649a29d0a1abe3b39e8293786852a9b062de602365b3083837ce3ce02d065990610f63" + }, + { + "tcId": 1724, + "dkm": "d250aad6caa971517613d3363bcfb5b2228ba985d2727138e26dce029ffd7bcb2be548f29cd0209ea0fec758596b43570fa4610d2257375524567f365be77d61b0250088b303396dd470d958d2a447e4cd656f3dea49454e9baa74df0de5e11b12b1d44883a58ad7b8ba2d28b2e9382057e02acf09d04ace3fe1bbdc9158576a" + }, + { + "tcId": 1725, + "dkm": "08c6d81e59d4117236a4eb26ee407b9f1b68cfd25b24b421afbbb6b4bb8fec27867eb8f9c488402df1a560355b49510d46401c96994da0cbfd3981e47ad45ee198d609abaa6b24628e44a7bdad49145f5a75132c26416cc2f082ffa65bfc96561f545c9558f19cb8bb5d286a838fde86a0c292fba6847739f60ce910ba643293" + } + ] + }, + { + "tgId": 70, + "tests": [ + { + "tcId": 1726, + "dkm": "01859ad0e2f1c088e5fb1f4444e2a0acce2890ce5fdc39dda6628b43b85d26871a0b5eac3377ab21242575bf8b2997e1fe02235b0c2d001c7ee59adf51935ec9442bb54b5e91f37ec366f54774b9f3a883078e7023f55abdd8ccd8014a82f87373d4d440093c21f34e3d8e6beabca51e97a2d59f921608bc3e0c71f7a31f04bc" + }, + { + "tcId": 1727, + "dkm": "ca2c4a7c9b72a5edb16c25f20fa273ae3ee5efa1d71fe981fc5d8d5e9e97b8e8189259ba5198b7dd28b1b158f0977c2d12158831baf09de8e7d5fdd82cf3ce0ce22c0929a510d0f7ce4b4e8e4473976ac6e268bf4bf8e939ef7d7228902ecac47947697ed1ab9b54703b485ed1752fd857acfa8a16abe3babca06986afb30779" + }, + { + "tcId": 1728, + "dkm": "33cce3740fee6bb25dc76e66234505be5df557bf7d11c16b439b1358c761d07dc8bb7328b1dba6367a345a0facbb91016a1e663c2555f683ccb388327bd93afe85be0e3a9dd40bd87fb17288cb60732a32ec9ed9e996ecdbc25e819b86b12dda0117eb9c3b0638ef9878ebebe8b355d892eb41eb550311a9d3dd2f2a272738db" + }, + { + "tcId": 1729, + "dkm": "1584b9b03dc052ecb07ae39bcf5149f15ceb7829e71621ab69ea9dc14b29be4475710995c2b4dfcfd3af92715f413347bf8ba72aacee1a8a2d091e8887a57c88625faa6844a6493c7f93c640e4ddcb654b515c07931c79fb0552aef01b70534bdec0f9f4c3fdf63f18efbe97224f0545905a4c0a5a10c8474e63eb52eb450b96" + }, + { + "tcId": 1730, + "dkm": "c2f889c0ad2d5cf37ed8386104c763bd63737113012422cf6925a15ac05a94c91d106dd0bd36fe69559b953b7c77a55f76a1271744f661dec9c0fd032e15468d9ba08613e5a649fb369ac1d739514e1e674edf54b34886b8ec96014205d7309ce631d47d8bc0d4782912fb46e80540cf2b0bbd92adbcf3715d55e48397196e22" + }, + { + "tcId": 1731, + "dkm": "48969f26d204a882f75e793b6e8f8adde8f4aea82822cafc9dda8fda14b0c8175221afbb8272fdb2dfb6a0051fb1d28ec260804acef55f61e85a77b21fb406a9d32d4de43af6f5262e7a2d22af24848abb81229ac0075f57985779a5a09b44dfaf50e8737c55bac4e5d787b8ef67d019f7365b9569d5988d1c5bdb6f45206872" + }, + { + "tcId": 1732, + "dkm": "3543fd39660a42a8555063ce4228d3e0521d402f59c1e104c2dcfc2a165b889f6ab3e0bda48eacb4f6fda1d1fbf0a9087631195e88f98cd71bb3fa9a381c9750d888ffd655c984cf97604316a1cc1daabeb1b70d5e45095a016a23ba1e8149a7cfe70159b61f32439f6b37583cfe4d01db7ea5edd40a16407c8a24e1275390bd" + }, + { + "tcId": 1733, + "dkm": "49081957ba01a743ea71985f83262f1b773988879e83570f77a4f296d3af0f166964aaa83d60c63d9c8e6df8f1b82b907676737b691285a794d6876090fb4ab718d6581c0366a80a6e3805bd989d0d08469bc41f0f01c52ebb0cc8e8c369143a7e294d1ba4392a83579a5d39f4eec2106767132a9f5aa96d45b85ee5bf43141b" + }, + { + "tcId": 1734, + "dkm": "f1ceeb523237796ee8ff6103d3dcad2a97af56ce3e43aeca844f669d8cd151a2c7e7baa7295a13706b81c7dc090dc3df2066819d35fa53d147832fa220f02f9710be5a0c8f11a61ea9991798962b5679b6af222b60591f40dc18ef24eb8787b6c40227233b83113a156003cf8a277380041c02489c21d5da7c239819d5f4a053" + }, + { + "tcId": 1735, + "dkm": "391f59f2f77296a936f5c585e88452b965ff7eb1139770b5b895c1ef73fe2522a89d1370a5fec1b006fb4493d3995bca4ce91b5422530df3152298cccf27c6b2ac98f15007f8176917262294f87bb17f76f9d8c48a245fce04301a6622b6088cd89080476cae7699f165c968ec543cc9343d7ea053bc03c57aba0e100efbd7b5" + }, + { + "tcId": 1736, + "dkm": "d07737e55bf3969ee57c857844a7791c0042b42a9c6ab77f6f87878675db761f4a51592bfa17a9551642e0ef6ca2473d1f92653d3e30669460af9d77a09bc77935b7037bd37c292ebeb8143053f1150cec7a235dfd10b36da451aa989328a4574464caf1204a9ac7d247603f6b5a0e6e97815a6d133260cd8ab7ca9d1db2be48" + }, + { + "tcId": 1737, + "dkm": "18e86164984f55291ca4fac02b38495735e5c88df58318bc4808fb4aabec7e368a7ad17f6a049b679a6c765911d9c1c77c007059e9c9bc0d7fd2bb546be2ecd8485c2ed9730e1820dd5587b277705a52ef925ff129accb268d43985b5e5517d36a48dc812b757d2e53d8e0f82e31f9a5de23d373b96bdd375cb5514edcd01e93" + }, + { + "tcId": 1738, + "dkm": "81429d110946c3fc106ae7b79a83399bb34e15ca3b37bfc19c265f85ea5a00f0ab1a59391b8e8d6a9877c901f2a34fcef9c95eaf24d8825cd15e4648dabc467b8c144b28435208e9fdc07f560f78efb7344f1bf0ed1b263bd038dee8a4c295bbb3886f9a14dbf9328c87875ea99e6fbd81eea97bbe605c9f73f71b6aacaa6533" + }, + { + "tcId": 1739, + "dkm": "134392a381cdde2673b1913d73693b2571e1283dfa4a38d5ec0d5bb7424e322e00058b4a0297cb3b374dec1ef8b121f2a40290d2dd98cfb5ab0431fe3d8922da56c310988f715d5ad5fa26205f3abcf81e1a19d48f7efff5a62a4a7b890432cffe28d982ba82b27eb252da046a6eb6ec2caf1a0466b0b0d48ef56ebbdad06efe" + }, + { + "tcId": 1740, + "dkm": "db5da78b5edbef3d160590f762a4d122b2007bbd83aaacaf48eaff098c5141fa3a1f88cd30dab0db65f33e25c48b26a74f6b3b96a4ed21c9f008e09b16fcfaa16fcebb5aa0b9fa3ea397edc164a6645c90234c1f378725184b079efe98d058e3ef264022cfe5b929ca20452eeaf8aabfd2ce51958a24f2095feb6f5aaa5f258c" + }, + { + "tcId": 1741, + "dkm": "9190f771ba41c81290e2364296dba7970e2806b127e7e3412429bb74f7360121e1b59957799b0132f21c8d6ac5d55496c5c757a13146f87a2f0ad7cfc9175e9c67bbf4f4f6cf3d3abbfa729254ad7b9625cd7f1910ebf87aa07f3cf80eae00dd56369553170ae1e2e5edb8e6005158e008e8791ebf85f9249f06771af7b3ee93" + }, + { + "tcId": 1742, + "dkm": "30323dc8a26492a919ecb4249cdbdfad04a77f4bd68e3de8918c1732efc6a5325a993cbe108f35492cb2e9981ee00aded5fa11d0e2bbcb12d778dfea2c71930b86971579aaa1a76717460a51423e6b340876efbb5571e5a8266317ead1864be108b12511978d339d6604627f0746266c655568fc2b70a7bd3098830aaddd5ea4" + }, + { + "tcId": 1743, + "dkm": "129351d76c000f7e03cc3431e4a61cba2d8db6a3725f53189d27718495115b2286126f99bc3dd2d258f165be9cf24b2bdda7cdcd4e9337b4505e2db49a60824fcab7b4b2751dbb9654c41d5d6eb540dd1e5c53e4067f0a4d7c76eb96492f2f82ac72e59840cd838f86a8d4630912d2b37fc89836cb4d75723263282c10aa2574" + }, + { + "tcId": 1744, + "dkm": "0501bb4966a9671f00cd4a5071e1d7401ae3747de855a0b532b02b1d3235c035a71b4520ab18e5247885339f6c5d4d16cab3fe4e0037515e132733a6ab7dd4fb1207381cc209d03dd9c8f105466960cb6bbce788b4b71fe3b68a514513a18c075fc0b2e01e9e0c5dcbf4de3bca1619704def18abafccd36bf63c93c830401d49" + }, + { + "tcId": 1745, + "dkm": "b1d5109cc107d7358cf186c1cf4605225e5605f49001ec8e809d04649bc6a6fb14a5c2aed603b3a3fa2388d637623ac9cfd79342867b537856235355bb60ea5f37e24f0c10138da1f69ac1be76caea3a6f8a86e85cb536c5815389fefea9e87b263de7669bbafa1cf298445d0c8c86e499aca443690f58d8bc180981b618430d" + }, + { + "tcId": 1746, + "dkm": "8adf5129360347285950e6632a7d9a79a1e1b2841efb91fc150bd22584ee12a4bb6b530abaa26d766353f23f33ea6cbd14b8675ed15e626be9c999b4cec7e46d6b1045f580eca4111db7b19116ca28ae396ebcc9125a5d2744c2c4807a377a23b78c3cf529b75c3415737fe0c8e2fcc9f58386a40dd50dc942ae5076fb6591a5" + }, + { + "tcId": 1747, + "dkm": "e524f7a8120d6bf50b199c49dc8fcdaa4941d32864754eaa288beb83615179a225c038af6f377edc6d326033c7c00f1159bf6539f857687bdd6a8cf380056a898889d2dd49768a31f6cbc92f03f230dba5fa55ada128dc8e30731fbb7b00b447f2fdfc4073a8cf4f41dfe5313aa904d6460635d73f4cc9168df2ddbef293d080" + }, + { + "tcId": 1748, + "dkm": "cec8f299955f1d4a01bc9547dfdcbc56367ffe8682a00b88126cc9f279504e62a063a231370c8d7b91dc32e03e560329d1e0bb30891c9dd470570a5471ba87da8f29f543a6db660ae6009d213b13ae09ea02bcac438b3a19a522f7e2bbf294bee7643de5b25eef3cd16f0d0f64272905be7cf8514b9fe9aec302eae693401346" + }, + { + "tcId": 1749, + "dkm": "bc75cb6bfeead0c065f3181530ccfc3d3be217f3dcb055918a8f45e7098cf48f379d54038413ddaa82dc48b2112093a299f1b4fd1e961eef6251ff2d14bfa937e08145a74ef91a0efacd5521a17b5d9fd8c38af6b13f83a252388ea0984b641528952f01607fedef922c544a0b9cbea57ba7c657a4468ab76af0669813c201bb" + }, + { + "tcId": 1750, + "dkm": "edda571e922dda840c861653e6848f4c1a49b7730adc61eebba26919c1258eb70077bd0534735ba89ad7933e4e56ab54e1d0efc0dd78aff863fb31d4e80f59eb7f5454a501f202d0251da48631a8c5de9ec4208a6e2c7d8fd87ed237eabb669ec8ed132dcfdd27016c4852363582df679fe7c19981e20e3fd06062f97f462259" + } + ] + }, + { + "tgId": 71, + "tests": [ + { + "tcId": 1751, + "dkm": "30fb33af8a171f9af570eca10ad24b1619ed23af600f6074e7b7356578c335b931105703067ddab710c6d4b89b047900cd2b3eb4097698a500145495301bb83cd55d963caaff0b61a0cee5e2958b770327297b38c2c0450f4140afa73f0e050300b02d08f9aefd3a8e11c8c2357af3443d06d24a783fd4fdcd3630758e7640eb" + }, + { + "tcId": 1752, + "dkm": "a463dc90062275253690bb9eb9c592ac5f21221bd796e93f73066ad814fe0294127e194bbae552b8c0c0427b56d14e9e6e91b000d99014e45a5d7398880b40bbcfed655762720353083e3bf962cf92cfc340db0c993d303dd07f954d83e6da90f93d7a0a42fbc04cba7ba54f635925f37fc2cfa394805500b5f0804f58bfea04" + }, + { + "tcId": 1753, + "dkm": "1cd49a6d788fc7f3b8928c961fe646ac86eb21785e1c47b60488336b7e9e00f124c7f25a3a12c4e0857a99624b1df8467721cb17e8ff3d7a29889da1d84fd24c3f21b524fb74b7d8a088ecbd173a8f054f382c9208634f2afab5f449a360372d7d604c6461b56dc8cd7553feb336c8be4321188139a188363cd6eab46543ee76" + }, + { + "tcId": 1754, + "dkm": "a9497e9f6536cfa94552cab7eaaa261aa82e30683b6716ecba614da0fc44b43b41234395d4e5ced0c599835663dfd31be9c02c19493efa301cb977395df5de6b8dc1da2294d00da8c3d5f47e041147f9e70ec7ddbf48cdcf1a0a36a62e66cbc7b7cad2647cf00b8d4da54875f36d6b4a07ba3450dde4c3a7ca2d7b012d73d7d3" + }, + { + "tcId": 1755, + "dkm": "5099c8259e9035300d4a4a4fab9166ac9787a3ab35260969256500925f5c1268666000c82f57143470514bd8b204533faf91e267dcfecadad5eb2e0283baf28d9451513c6a00b39b4d09b4c6aacbd10bb999405d7d52bd2bf4edd6edf5a1a607ddf5e5682276f0db6928f347c8242ede5391b91d96119d8073149219edad56aa" + }, + { + "tcId": 1756, + "dkm": "9b69dc721d5826e4a111168e8157e57b4dc67285d3f478420c4396f4f2d4d4b8e5fd58ce44111ddc6ce25e9490798fd8c041c673a5b3358e00051c6b96a32b09d7c2d298894c070170fa6aae9274bc99340776fe8eecb2ed27a815e161a7be8920ca76f2361622c8106538e935e44b64208c7261216f984bf6c28378a25604d8" + }, + { + "tcId": 1757, + "dkm": "3600454f6f496a04d6e83ef7c5636a5d126723d4e3829cce38e8154dd28c4251ca367465a8dbc9596bde5f2a310753ce60e5281e88f8197798a198d8d388c1ddc9b8cdda3f74e18e77642e9895947cccab559b4555bc2ec2191adcb33e5803e88d104e1560c741cf624a7e8f81103833ca4be97dd5482e128fb15d1c1bb2fa27" + }, + { + "tcId": 1758, + "dkm": "b707269f57e1975eccf4c41c925d416c3ca4e17261bafc73744c345e988ecffb3cb6f671f23db1624f440b42ea490e65da1db4ab46dd2d13e6ff80a694fa27d02387290d2b2401b0b562a1e578ce5b0d209ca49d5b56050439ce04c55539ba5433f365ed999683ed33d18414841cbdaebada3f41576723ecada2531dc884cdbe" + }, + { + "tcId": 1759, + "dkm": "2ec780442d5076453d1c8284418835249e18174bc3827590820aebfa47d0a105bcdeea1966854ff419eb920bf21caaa94e1ecd11d4f06acd87a4ff876ed0cf6c3dfce19ceeb705a807efe1392e089d399fa8d8f8d02f1d6fb04aab21dab03c4fc4a602275e2c022d6b0740ee09b9fcf98f76d60df834a8f3a5e055c1fda66948" + }, + { + "tcId": 1760, + "dkm": "cdb50cd2f43b2f788d7c0259d1ca3356aaf7ee3520cde876f2b53ce859b8ef2faead39055e772a61e1d8fff85d9a018a18155989b8e1aa4e694e525dc63eea2b24f30b0482c8b29dbe60038283396e627dceaadc0a0ddcd5d372e375ab61352fdd88c895f5ded737881b58e19735860038891cf678fa932b5c248fbc96591d81" + }, + { + "tcId": 1761, + "dkm": "f02395fed5ae302569158bc286f0ddc727c7e72e13506b858128054fb9c4f130f384606fdf2aaeb2ab055dbdc253fda0020639eb2f35b304c3b34c1db12573aeb07f30659c68a9ca7eb604fa1a46f23e3da8f4fc081caf70dc67a297353f10e723c052382a32b87aad26144d6d84a5a315b925b4318882066d7781b761c52715" + }, + { + "tcId": 1762, + "dkm": "650188e440c1ce58d5188b076bbd886048ac096ff39be7abdbdd11da33f03808abc5ec3ae501c9110ae53e81fc5b965bae61271ada8f8bc3cdb624366c0b9d110f1288ee530b0145e1c72233ab360bbb01f1af8dba86dcc34f7ff49e63bda133ab4266bb1c82419e1dc7f6b3eaa4cfe3f07b2deef70852fb355971f9ecd9109f" + }, + { + "tcId": 1763, + "dkm": "b2b019fa30f5e6badd0beed53b76bbdc64893a3185f366bb54c29f3da09c6ae4cead7b4f7754f5e69feecd151acf62d3b5437e5b2ef406c791633b3a9c407239f0168239a5f73ba83fe7c1689bc3b952d84f4aec65a76c04a8b91f36e1e462402088680c84de6504495847a48d4d94f2894c68f193f75d3a69eb393f82686987" + }, + { + "tcId": 1764, + "dkm": "1a20f695de660020e757cd050333936a65bffbce743cff01da05986ea0e6211db9facd0080d99f79e17e7a62b24fc7f456fa9f64eb47cd2134a9cec8be53d02f91dc86bc5c221b2ca8f64c57828ba4c523b55a8f0b932ce3d4dd736b3878743b6734905462e33ae6c134183e62c3a969d866aadbc067402440ca86c0d192f4d5" + }, + { + "tcId": 1765, + "dkm": "85b29c23ffed3c5c820324e8c5632430d7b677e75a73bf1e0510a46a33364810296e6812416253e57b43793c8fa5fdde9ba70a4e93d4ee33d18a4f8b83adb1347c9669adc172bd62433a6fe911cfd15f613a198c3e8d2acd64e18049f3c3af69ec6b1aa6fbab02b5d74e4dd0aef92add43bfb9f646aa7f744c3e157b07e40197" + }, + { + "tcId": 1766, + "dkm": "25637e3ca06013c50de5ad78b8a0f64c3a46fa222a44071c77eb7060aedbb7fa6be97c5a6cb167b71d1eb87a54989a6f2b6b1520eb235f7542ee57e7673a3c328d24a4386e0b729f3fce249366078d7d6ed7dc6b4b4ce483b1cc048af4310887bd2ab85d2dae4cb4f4ba10b1360d17d8d711854cd600cbd0256637552723e7f2" + }, + { + "tcId": 1767, + "dkm": "f564ddd96bb9e725e008cacfd5ac37fbebaf1fc0894c7f7744a57aa9d2a77b0eb5fe268011753e3aaf7cf31438e022cb036d2a9a0d656b3eac12115b6bf26d63e813763e03622cd0501589d66d467022538bb1a4d993a11056b7e3c9358ea1e3aecebaf6d4f2bde1aff4fb450390b29746efd8495efcc68a22ed143af42e4fcc" + }, + { + "tcId": 1768, + "dkm": "5cd312ed37198ac8062432c0646f112ab306d975d45aa6aaa5ac86197930ba156952a6a18450a65960bdc73beeac0db46ea80dc3747575e25a26b8686548f97e12c25fdd09f2e42670235c9920134f76c23d4cf82899cb13aee07f7618758426039188861338b9b636adb433b535155230abecaa931d9b78a797bb186e1272ab" + }, + { + "tcId": 1769, + "dkm": "93de22479c2a6cee30d02d984dabd03770f9efd669ebdd6fdac288dfb6e60765c9cb0017b081b0c9d5102aebccfa1e1f80240f7fc3e05022d7df1efddfbde9ba39b9110c511f08f6879841fd3a5b0ee002291b9e945f2365924a3ac2144a8315d4581c0f994e4468ecc52d06bbda3194f5dbf69d3217f6c1e96c96c552697b17" + }, + { + "tcId": 1770, + "dkm": "2c92c0a99f27ec46559e19f15503bc382cf4cf7739fdf998a1dc88f7b43633a63f3b628c35c2c5ec26b36f138dc1e19a233aecb43bff06b8dacdfe1edd801612c8664ce9419e28880a38b07a700f08790ca574cfe32c0e144ab4004b5cac9a4cf781e1dc768c73c048b936e2bb260fa6b5fe96f6cf51d8f5f1c60ac932556ae8" + }, + { + "tcId": 1771, + "dkm": "771d30e045ff95aeb652f7949f627f0d96c6b781ab6355d5b0eae1d62a875b731fe44707c29b835d8a73ccb3099c6b4abed98619b3ca7fa9f6def4014c6b943fd6f06b85cd9994b364e4e825f36f92e8272897e313005da6b7bc0f2535ef0d41359bb3a5b1bc488dbee3f8440a43c394fc2e117e0ab143507d510d674e3b0751" + }, + { + "tcId": 1772, + "dkm": "a8a5ed3f27d687e960e74db5cafc923196473b665a0859e53a7cf02fb616871a64847633dcc3566ec0faf3a768c8442546726f9f20e74cf20691f344010e0d1ffc7d8958165c3cae8b20b0c13495f1ca17f1cbc5646bb6a670eec03ab153718fde484ee69a8cb5b4f5a99ea1177678e26b744df6f0566f4ca4660fd350f41cc8" + }, + { + "tcId": 1773, + "dkm": "fdad1a5d2a3227e0f227691ec66fda0b6f0c0669c9e0f68305c50e25bea44780ab3f8fd40f4775b714a190dd2c414de383cf6d8f36f7140ff0a42af9adcb1436830ab259461fa7daf0baddbf324a603a898818c33c0d86955fc44c81a73e97cfca032d3bc233a09b0e5e6866aade9f5f233b5cdadcd8b439b98d96a0fa044ae7" + }, + { + "tcId": 1774, + "dkm": "4282455ecfc6d13e802223d8b6f2e2d1b626a71c69131f0656c2f0d95192815cb39601d77d65a8521e2e8bd979d19708b6cd312582221481a4c99619871f1ce8d3151ad1e0b60caa4cac549e880fa568a07e8c46e4116a2f44b564f66e59690944b02c621fea4617567a0e801fa2a2ccfe3f382f19aaa68f39b035e06b7c0d2a" + }, + { + "tcId": 1775, + "dkm": "2bd956cde4c4ac9ad0eb36d9a026a342933925a50be4e6cf0a76f500a4e79ea7aa8654e0845795d10dad99c1748b7acea4c782b859c7e2d5f50f726d4c4d3342224cb0b935f6e6b1b2bc5d15bc8238c752eb273042119eb9a4eb46d639c524b5c018d1251a7a36372c44b0cd8258d896de644b9d2d0775bf0f8d88d7a9cbe01f" + } + ] + }, + { + "tgId": 72, + "tests": [ + { + "tcId": 1776, + "dkm": "551fe22cea1e3e54a24370c0ddd74e55f0b2275725e64a5c3d374933d78be90f58414d9b7ca49530c9dc538e85e85ebe1173c07ef8752fca489b21bd35e7b9f51a352dd034022f02b497b5691b62eb2f92655fb909680ec92755d8afdb1aa15da1b9412f5a40f568aed510a5acc2c3802f6c62b916e3104b795ab385f3ee3c92" + }, + { + "tcId": 1777, + "dkm": "1f280a7a9f7c64b5bf9c1a13892b4909e36885d85bb224d9c4f1a3be58f7bbe8df3e540cd3dd14b45a9c060fdd9a019f7221538ad90d173f34b1d475d4f4fd7b0c5ceeabd519c8a46055d8d372bbfebcdbffea9b45b274027535dd34f02c160d1e288d9cdc9a6fd157e1fac88bef7a5298fa8c2efd2951b370c6bb1ab574d6c6" + }, + { + "tcId": 1778, + "dkm": "1164078462302592fe62a7eb2264976d7f6aea56049e09e283243c66dfa2ae1f04fd85540bce57a2a9daf02f823578512031c77b848b58f8820329e9987686a690f3ea1c97afa319af6b04c031dc7da70d5b6f4059e4aaa64b08d46c15974f96c1321fe292fe7d6abf94f490d38b4081cff0d78c6f6c8bd332c81933182be1a9" + }, + { + "tcId": 1779, + "dkm": "ad398661e7184d5787c7cdfdb98aa11f09675f2608e5d4a61057dbed8f7f503390956457fd89b52ac1b116d60673f554abf5cff7db6f1d261fdca883ae8e97314ac1735a569d19a0568072f85e77379919a834471c75dbf01a51c985e21d2f83fe024ee9f1fa461cc7f522c4d13b7c670bf471ab00a2bca77a6362ca4ea8ddee" + }, + { + "tcId": 1780, + "dkm": "949e1298cd3bb8537db223f1b0ec291585b9ecd8e281234901672fa2ce90a600a5b12f34769daf195ccc0a293df6eb407b864a82db2bc873e719c2b835275f1555f4dfbf467934654b3a39a925789a5ee2de69e6a0d7a2d309bb6f20d2795bdf0826befb68d0028336e26310f8f922d56c7bd789cc1fafe3d41a9652683aa8a6" + }, + { + "tcId": 1781, + "dkm": "af043547b837a82c91a98d0b4d00eba873565136c4d7e3f8e37608a72464b4162b6293584d3ff3164f9ed9ef5cd43d5be67144e5f8340a605ff149e7d52cfb73e217faa1bd5e4633bd8efe7ed856fc1874880b75514a88ffb4680d237d981fc684094c41a77701de355486e0d7da3ff7d361ca91dbf81e7eaf3b1e401e654be8" + }, + { + "tcId": 1782, + "dkm": "7e105b3c287bf88e49f34867439d29f0508225975e096925e0ead1b4adcbb7ee1706b79dda27ccd4c926fbb27591c84370cd8f8254689cb7987c3171d9ede551a89ee0b0c8152f59d09e12d7161d0d72c628c5b6cb24a092cdf7c30aa3a4f6c164e5fff773d1b08ed3e311b06b096797a3f37e3b35b6121d70d3fb56bea0d141" + }, + { + "tcId": 1783, + "dkm": "75fa6abb48a3a2300c123342066c8635d989345c30e27776726ed21947e0d13163fa310c9573552c5d22b7ea4997cd69598f29894f53681a359d81ef619f92e6554c47d5aa1982a14f7cc10cedefa099aed2954331c46ba92e2a626d4226cd7c182a35fbdff220d28259685394252df35b739d5738fc8f4f46024acaaf868016" + }, + { + "tcId": 1784, + "dkm": "94b4b5ece4612b8209b3b840d0320692675f8dada96e506eee0978af97d0335e0eb745570e690abe6e84d8790039321ecaa64bbf3a6d6212163aee3b22f478ec3d32466afb6f0c167123f2ce0564717bf712eb7ea838c3a8c5beaafc06c8fca2e9af446a0053ee7388330bd84781f81c198cbf9863d818e91867071d3ee87bf8" + }, + { + "tcId": 1785, + "dkm": "9ddc5de30294569f05bc6980a9367f9fd192c7d4a68ea06d276ce82d00b3ee0eadab2ad673a375958354af20755fe97e88b36f02ee69e3161f7fa78af8461abc944fbf565a10c32c2a177aee86dcdf4b813b9d0f1a849cc407e4fa26cf39193534e92e333ce41c5fa952b05c6826026efae37c91d9f99429b051b902671f08dc" + }, + { + "tcId": 1786, + "dkm": "02541047f3336b17ffc15819ae6fc98fc3a98ada19d2fd7a26e9765b5e29e083b4de20125021cbf2e7129f0a53af9da76bccfc17de2d98e39c41dc47aa0b0999226f7eeb9ad595f57ad0c595a172a8adf8f9f2a829d24f9dd6d847e36657085c14666ec9616a72c20ccacfecf1cfdbd0ca1acb2c354d66d9226e88f1091da94e" + }, + { + "tcId": 1787, + "dkm": "5a7cdb44514ba45f22c1651fda660c75f80d3d1291e17f14bb763a36f5280e0fea5056f2c97bb39035a89a198742560f0fd99d227aff4c18bc79fc4f7aaf8d45c362b75699c6fd743158bd7efd4a4eb656897e645748f1561e9a3f1427559b55a761395d93a48ad9b0b5a55a4dc2e4e27155e36d94799669169aa2f5040b779c" + }, + { + "tcId": 1788, + "dkm": "b726c3c3cc274734c8fe06606ed17164e0d728f703b04f96244cee7cb65b3d799ba85dc6a80ac2c14a85675645f4baa8c87db0ed3304b228a0008deea147aa1dc93c2bced5e698a1badd2c14d2925e6a1d09ddfd70efc0ac1e76055eaca4baca490c8b31e2e827dc8bf748d07df0f9033362161f2c7a3eb6fc444db8e101f0ad" + }, + { + "tcId": 1789, + "dkm": "8a9baba9eac1776f6d74f8b5a5e3484259eb3767dba8bbbac7150c943801d644c700cea9ed1c5e0020e6c1e4530ae1fb30bde67df169c748b3d62386d87236a164b2211d06611ee1c89a3896ec1cc3b45b337ea9325731e0cd1cb781e89e9c85c8a09bc6f0215e7425a9edd9528f0af2416cb69733b42e3b6af2629a8a86d807" + }, + { + "tcId": 1790, + "dkm": "6b88cb0bb9b3c517d37d7c461ca06dadcf7f4f873844b2bdecd07201271131220052be96b142173eb303b72c14a5eecd46f15b0255f772b3a0ee047008d83ecabf8a42d2de8b711c56558ec9a3128c1b414f8cf64ab24bdc85e3c4000f3db0c061769f02e51b28065db01c8ce905c0d9c0163020e10309c6781a34b5ac96d640" + }, + { + "tcId": 1791, + "dkm": "4f680fa8d19d5b1b70e0edf2b29d7878f09619143c538e3c47483f93af21a1f7e2cac60f9de60cfe78f5c91acd11aadeb81845f60240ebe92f10ad9c573c46f2d3a14cb3e6931cac289817f3ba1792d6c849a2ccdf5d7ae28590a1ba67cfeecb590edc1ba409857d4a908c7e19cb8fff4944a7a448db0af3e5f68295bcf32fd1" + }, + { + "tcId": 1792, + "dkm": "acf6b5aacaa70a6a1c6923d378ac696c1b34ca73f7ad529e4385243ef63f4ebcb402822c0e51773b896178e38b68d7495404c2b83ab5de7a6abac52387ade34bed42e279fe676ce682ad9c296622d4a29ea25447e6e8f8998613b35cf93673a833aac48ecd96f000a55c807024cdace355eb826042a420c6a8dca2b626b95a15" + }, + { + "tcId": 1793, + "dkm": "fdd38941cfa3eedbdead6deff93c4af6bb9cd379196268d9ac081d9eea80496f9af0b09f426f46a4ff3bd18fd84ca30c00e9d196e98326f3934a950192c51e8401d836ce516cdfe742b0d00503912fdfc6930503c18d05f89a261c694d28e9f3e5bfa3a9a72ed34e15f2f0690b291a0910ac59620bbdf7ca576bc1b0a69a1238" + }, + { + "tcId": 1794, + "dkm": "09b3ebe918fb0807a396c89c1c39e46492114fe9ce14fb2fee1140dad29e70750d57281f07642e09cfb102afc1d032e363df6e48220dbad14878bde7d21d90b6287ab1ad547a84887049eeb67e96773cc48d5de41550241e7236a3e2190ed73fbd69c59340e6cdc01aa18ff69d8d951a458023f89a3921220c601689b08e46a7" + }, + { + "tcId": 1795, + "dkm": "8f85f55809b7bea34ba1789f3fcff1a27d8154f6152799719d7d98dbee522ea922fed949b17728e6b07b7b17bbc7197353d70b9529096fbf83341d5268993bd5c8229744e895a4639518a080600a2b08561452bdcb9f41c38f0b696787e39fe2929b8c4f4dc5fd72ad744312080348ff75bef9f880ef86936c824823e3422e6b" + }, + { + "tcId": 1796, + "dkm": "e36a8e251199bd886a3aec893ba8653f382adba4b765b3ba664c16e0b937a72d5e2467ee1e8aad6511d7c31125d3c15c8b168cc6e566d7fce060ea5e76b2cc0ea6e379cb7bd5330703eb59d5b5cb50442f1dd178be03a458322fc62ebbbc986dc9f31ffa18003be17e4cea5f5e575db30b6a130f216a384b146264f13d59c1cb" + }, + { + "tcId": 1797, + "dkm": "4223260177a513c219aeb8e8f5d874620cd67a7ec02751f48114d725ae99814bdff5b0f9fc3f5e24e8a2c17f558971f86ea67b43494ea2ad6b5b69a281d7b8cff82c7038c9c8b6f531d25c7afef542e33e717ba001ea4e467203b621a77fb6d9439e07c454601a29140b47e78a9c3a039cac10fc59ee808776d38926f971fba0" + }, + { + "tcId": 1798, + "dkm": "18da15f7851f8efce67a3f40668653c68d92506bdfa3fe10cd07e57f00cc3dcd9eab68bae46ccb46ceb6d3edc3266e637986c720ad54da1dfded4b27c0d6c706d8e3cb7f092d761a28321114d8686d97715f632d41498e61deb0e44781f42c8f39ba8e51e960b4f0def78e50bc44e3bd9e8f6e6069c233aeae243332fa41c1ae" + }, + { + "tcId": 1799, + "dkm": "873093d058b9916352446a245d89aaa41b640bda909316e3065f660314e007bf86c84c80c216a2c6542296cea498e6639e503c696cdd533256d6bdbfce93c5267435339b247f03330be2580c41d8aa52923226501442373c422cf239e26acdb4b72e33d0ebf5f92eea1b95fc73692fb38c360a9dfd4db0aafd7461d194e3783a" + }, + { + "tcId": 1800, + "dkm": "478a0f059c88f68ac3968bb6a5e8049095f2086a0dab21b2c2ce1a0b7a9e59b1eaa8630cab63c75fb43b613e766937600ed34b5b6e53836bef86168b2539001a811753e5e9752c11b8dea604c3e4fe9b9434ec742500d7007da5dbef221bf6a61c6b55c664dce04ba0a493402b002fd03eeb79f0daea4fd3a555dd911200a269" + } + ] + }, + { + "tgId": 73, + "tests": [ + { + "tcId": 1801, + "dkm": "e8685ebd1f7b8ae4bd68a557202dbad0d7336b0f8dd3c6b8f14d8ce3696281c62885a709a69b52620c741ff4bab0df069da98688c92a12de70bdf1b881fd9327a2bee0c0b8251b90cbb9c40ad63388c8d470af74c5392e3ea57f362d20ad22e1273022facaa2b2ae4b7e4d35f0bbfdd88d356322a8b758ed171047132c7a3528" + }, + { + "tcId": 1802, + "dkm": "f8edf51eafed0dd3fb9f202f6a2e6a1c749c1af8c6f144597231052a21bfbd11eb48e40870a5c59ea86003a890a4af1d1dbe8d00fdcea9ed8f9d331aa171d1212feb58c98f2d9ec9cc6e4073dff6866eea2a0212ae63d6c8c5dc0859761d68d43ca69b9066fdd7714a3fc0f5b0d3f6ffb7fdd191b96f325dda89714d1ee2faf5" + }, + { + "tcId": 1803, + "dkm": "cc97b4f0c6eef0eeebb289afbd8956df6991f7b6ffb45b5de62d51c7d6fd7d4cce38ae0e6347f0cf2018ce9843d8edb70161b714aeda07ee25ad5689a9359a3e8ce9e3df1b0f2ae5d44cb6f88fa751be1ba1fcc830ea0fbb0920cdd4946f1188992044ce7ad29597c1fcc3db5133adc21839cd6d4c1ce50587422225ab36871c" + }, + { + "tcId": 1804, + "dkm": "702a88c9f491fbe945d6261a578348bbfe95b0b9b24a365e618e669fe5e7941029e4f484c3a693f4728165c524de1d15e796275ca3f57cd3a8497d341b48f726171efc97b1bbc53361b2ed141be8e76a63b42bb3f883588decab1dba26d4e8d44dd489bf0fb2aff0d2ebcce4e5b502f162c227efb8bea4eebed1ed35559fddcd" + }, + { + "tcId": 1805, + "dkm": "e901df374d4c4bb392cb68af69e43d94698642057b9e810dfa5d2ac4505eb29f26c84ba64c13704f520df239f884db70a94936bcb37d5a7d2bc92ee6c04b2fb17a47debb313487db76dddd93e1fb6e192fec7fe7a32092e9c4583ae5583f90da38c63be2de71747b79d26342ac18a4fb271bcc84b115d49e74478cb9f69d487b" + }, + { + "tcId": 1806, + "dkm": "facdb448636ea98afdcc58150e8222e6effeea143a3297faabda89298f6fc86011abf549ed9d65f186c2ccbe823a9b49a02261e88cff56e9dd9d949eda99ef780ca8e92730ddcc7fe548ef11e1cba50064208dc62e530491f757a081a35cf4be22fa2dedac80a44679c67b81e5823800d0e30327c0bd67e84e5ebcda7d1678f4" + }, + { + "tcId": 1807, + "dkm": "57747461d35b27f56bff9bd05dd997e2c29b45176630bae9a6ef1b989fc28f9465d4e5c3cc62f2e09d3d3a3cbad915b99802a09089636357884d07565a023cbf87459af219eb53878be9cee6a9b9f21c7f815c5f69f3ad20cb6a03bafc15a40fff00940bafcac7f6b30c82dc7ce3f303eb169f6f29668a770567cfaabdac8cbd" + }, + { + "tcId": 1808, + "dkm": "a16e1b4bfacecbba16c724a1beb4c6f2b0ea6c76a35a9421715da1bfb3b33a6533fbd8b45ca8af857cc94f736e2baeb86d4fb247c3f721fad1bb1d334a736a8a3b72d49a24850d3be7eac1725f51ab8fcffeba5fbdcb08ff299a894654a6a4d761c04da99018584adfe43084ae6671dc248018e6dcb5245f255d63c875ab555a" + }, + { + "tcId": 1809, + "dkm": "0ee9551d1439d1ca50d1ddfea1c5e2c3e32ce39b8083ea7d414f47b1daa1ed28e2c1ecc5e1df2c84ffec1614053b08b9bef1a2f841e0f2211f9d6ec749d8eca36bcbb1f4f9e42e279db2e433cc617ccfb0043362051de020c0385509cdf75a3a16820cde98fc34832659780785addf9f2ea10df28e1e0592bd90f53e85e6ead8" + }, + { + "tcId": 1810, + "dkm": "3efcb48df505e1099b7da844b46f6f95500742a33ecc68dc48577830ce8a674ceef572f2ba3b2b274c7d0de719b0e4cccff69afceca9dfd0d7d0bfae1e47d3890749b0984b3c3ca8241b9784c720471f6156042710451b622922c6a7ea7e29cd5c7ba04f9e7c95539e95bbe9f9dd9c04713559344297ff57c2c96d6a4f93ebe3" + }, + { + "tcId": 1811, + "dkm": "65962d9582c440f4442be631362026b058c054c378205caf0d0c3e758ba76ec36f4090e92b9725d018907a61f7c417bfa61c3d6f7a057bf4efc0d4be75fb7c7ee9775e73f69c8f457e0302e4659ffc0f0bb24c1c840b003da78338e13c87140252c19c70b940ca8e6d2c94be8a59cce847a61d474cefa262a7352be142bc50ca" + }, + { + "tcId": 1812, + "dkm": "25ef0b904d8abd5f244ec3b24279e20cf6d01a656942f16577a3c282a6c60466c9bb843cd61f67f5830060129994700a832d50655dd346cbdd9b4b44fc400d366bce76a6285536b863659312465e7eae44631fa2eed330b94d3741efd39a502bb23517b6e4a6c40c0f506ae0806dcc121efe3931d84bb1d5ae0fe7901a24ad2a" + }, + { + "tcId": 1813, + "dkm": "9c6f8fd4f197fb21c6d555a8055fcc5410d1f01102c66846210e37dbab3bbab3f11205b92fc418cd7caa5a726840ca99ce24f2b751ed2e82396a6f4d141f4ee50741cd397d8a86f6c52b3c0a9c498a65479be831c9ce983a43dcb948400dd88aeb3120f3f6fcfa6618acf5ed04907c5e85b2e308346107604f77cb63f60fec14" + }, + { + "tcId": 1814, + "dkm": "1b6d1d7ad348cd7f6b4f8ce4bea9506b2237d54d39ff2e3f761e40f7f5665542e58453fc2b4488c9b49a43892d4ec28b3e4803b90e46684c095691e2cb889e97f98d97aea0a57656e85c2727a14b187241e9dcb1f05e3fb7214e9a740f989a96dd70054c4999abde2fc4b920aacd51fa0242cd698df11fcf10cf428748dd74b0" + }, + { + "tcId": 1815, + "dkm": "50466a8a8a16889424614265692b8b92adb5ad6b2a8e126337783f4931b959b08bc5528c66d8424167a52c462db15b43a291edf3cc634a83c4df93a6c44b27236e54a69670f821606e4cf494a6f8e5fe947cb2f3805a484084286271805fb1e0a26aad9e212505c6d1204fd91c6a3c85763eb28290efe47d34f73510ada7e655" + }, + { + "tcId": 1816, + "dkm": "cd5ead187ba1d31284831275a2279797049eab2ec85c3adcf4a7a030adb404e4b776202a775968a5d0de9ce773768a97c8dc84456f490ef5f92403f01aac7250f84a0c1665ddd3a7e3ad32a1a3be80f64b4f25145b1f872c1c532bdbdcdcb2b3cd14b562eb30a19cab3c6eb17c90dba33799335bc9cd8374e3b24dc6cd054cdb" + }, + { + "tcId": 1817, + "dkm": "0417fb9c91ce1d4a8393862a8db55a8c0f203ceeb2b04b6977f698dda648b35d626a41e655368457fe9c6f8a870f7c60ecbd5d691b8ee8e75eb424f7703a15b343bfae76aaafb2570a21756e2290daf8706eafe79f971b2df40c974121a080e3ab64e94df426875d1c5745c86b6c4b0772ce353568328762d9f7def0caa43d67" + }, + { + "tcId": 1818, + "dkm": "2a6a96f5505a1af5cb32edca9f0eb19b73a22d14b2a3fe14def88e9564aafd8aa3c6714e53d60b63882e536f845167b6ebdcd1c352c4325917a7ac3a062087abbee5370021d3297c777c29fe9cf581397330cca42953ff445bb6140ae0b31bb4791b197bd61cb4989a48bd8ccc9d5f80533699468f59d29c108c531fcfde1907" + }, + { + "tcId": 1819, + "dkm": "788530445f6100bd8851dc1dd5e14508293d76381a702d86d24ed3b2184750ae99e46e208851aed2feff7e8a6fc09e8db8ffb901108906095c47eda19e681c20650032cda51264d34d3878d89a2cf48e5daf74f8a325cca8be683d40c845884dfc762377f72c96c3c3c43ed0888521e91f152762a8dff810f4a70ed10c028b51" + }, + { + "tcId": 1820, + "dkm": "86af40e9a7ea73ee8fa31f3ba4daf17c19537fc5022658ef8f11d9ce61b274f6be32af9c578592d0b260cef16dd8867e4413ac89caeff7cc07405e6d1a59d42bf6dfbced455de81efac3b9535940ef8aeea1c6ef3080c8c253ea0c41885455c16c1fe18d53d17c38c2b41330d8dac1d44af247b8015267f71c64b98b9af21556" + }, + { + "tcId": 1821, + "dkm": "112a16ee65843242d25f27cbcd16431a9458c6778572ce7b8b3aeb90536d1342a436a5bdf14f8a513f77bff8b125a741b39c2120ce87f1a4690d5407662ef9ce252614d6e659a6aced9e5fc46798dfb7a020acb8e63df72c1ee3c1f06bae7b4c130d23a6527422b1564e2b1714b7cd50d0d57104f86d26dce1eb34997b776c9f" + }, + { + "tcId": 1822, + "dkm": "cccc19e67615ddf173e7daf54ac74d3a718b2d0c1db059e3688ead91403dc7c0b9aa0f129bf7dc483a5ea5775912bae30ccddbde9e2279dd2949bfddee3858a44d32adb119a507f4777d1ed9db5f45ad7867eced253acc0077eab05672232a7a755b6624e2538563959e4ab695b951c647d380d8fa8fd795a920d11c61337bdb" + }, + { + "tcId": 1823, + "dkm": "41373d92ec0e3a59c7b40408e528052527b76a4a6aa36aa095f9673b52fea98c6d8303d3d73c990ee81e7affe6879c57069b34f06bd450fe9cf4f00bfce2f80278e45d60d84bcae96f2f1d9899ca7e6d5d1509fc24390409a1150bb9090462290a6bd88fa38f03cb0bafea144f7d40e1ab4ad872c2895aab925a3e4675ccd9c8" + }, + { + "tcId": 1824, + "dkm": "3a4102613e1017f9ea2bfda4386db83d764d3e07bdd97cda688d9dcdfb05e1512cf14f39842b85034c4bb3a1ca26eced2ddd7070b9d94219b494e1deffff61aece3590e15e89f1348dab61b08f5c64f6173fe45033a80e3e62200ba984c243a687bf805ed7fbe0c12243cb706817a483ef8b63c4ff0eee40878681e4482ae71e" + }, + { + "tcId": 1825, + "dkm": "9448fe0041d44fd41e2d6212a126450cd310163bf1ae84bfb3c2b8ee29d06360bff61679af01b2b35d432d43a31ab1b250b0db172042c1894dc8e7d32c0904e251edf95743dfc29cfa12b8fa3a7e9ce7a76c58c2bfe34cdcc41bb93ac3f7a007f77e7270adb315c84154f19e7fe3ccf2b8d531671f6203ae5f2e97c3c07475c7" + } + ] + }, + { + "tgId": 74, + "tests": [ + { + "tcId": 1826, + "dkm": "22a0e7b6b854c734420f0d6f867b74efb243d12ed5eaf91ef993c8f29017656652b4ad39f7d4bba770673116973890415675b4f2f6b7084125dd647829ed0ec630778f77bf1cb157ab5b1c97535cd31686e68624abe6b35626a45bf93cfbe23075e0543d476fc7b59a986efc4973a8d9d849c30d93fa4ab4809a8c85769c92e8" + }, + { + "tcId": 1827, + "dkm": "0c6324aa28fcbb7d8e7608b99a9c4894e25fcf41a436cfa190f22a67f55370ef937d8b9db84f4f36a6116eade035da8709918fb9bed3461b22b6b747a1ce6c4a9c5ad3b2ea25dfdc92a2381c95ecd527e78b5daf6da5123444a2b807cc904ae9a1d51d572c357249e0990998458eb4694fed04115aa11cbc6de6b8f3201cc57b" + }, + { + "tcId": 1828, + "dkm": "5ec0b6f1c89d17758a4e61b670ed98240b9272cbe8a671168967700874e949e5116d14b5ea56f9f16f2564e251de64c0ad99cb03d59cbbe66029f4cbd667af032e7997514949b53b023e8ec03c73b9271eae10622b61ecbe5e18e2b62cc74f5167a808b06700bb75d40da659e8d982fe603070a51ac9554f3b4b0b860bb98b50" + }, + { + "tcId": 1829, + "dkm": "e84834307677f166358fd2bb6e1cf2c95468667b7acd56cedab4b044923e1b0963a072fc634adfd417521e16e511b3b8ba2bc192066659fe0443dfef66902a53f35c8b624bc61dde933c32935af346fe3b5affdb2584cf92abaf6a908a0e6a055252d899505c1acd18213d0b727d1cfca9f2e7d1d66c1abd10072055ff4aca48" + }, + { + "tcId": 1830, + "dkm": "22229e3fd3a6326f5ddd50efe49cf3ac052507e3286282317048a8c8d54c6d4b03cb69bdbc828423ee9fa094920c589c2c66643b44a055020a856ef87e0564aaf1799bea06be2a1e539ae59212b9b82ba4f84f27458ad567b0b0afa07a19aa262f7fe1431534db0137521c12f3a613c34ebd0b8003d9d884131dc76448f424a2" + }, + { + "tcId": 1831, + "dkm": "8481e74634003c6b44225a2a386adfbe439e0acc88937c3128cfba1b49b6f8b4f1c0c7cf989259e2d494d5dc52ba8440ec0a04088fcedd33d44f9e4b8c8b56bfde4033cf2dec33ecb02a777b61d07e847689fb1e6bd7b3dd4f90c3c4345d0e4e712dd012cc7e30f2650253f33da771f0ec25c4d900f75d5dbfa482aac007b8fa" + }, + { + "tcId": 1832, + "dkm": "1b6666ee9c19d151b92f92a7f01f9088d32f0152530d5e5d45d20bebd9f8ab7bdbe9a87c01c2c847b0ba9afa20cc5333771a0272c7ba1c0a7a92f6c473a391eb145047b13af1af5a592dc5daad6929d2922676b7fb61371e5474d3a3ae34a6e5ddb91284d550f9e259712245afd1d87259db6c1595716493e3452329c18f15ff" + }, + { + "tcId": 1833, + "dkm": "7f3e101666037b785c3b1c719fc13a79f264a7eba39b7dc6a24da859260a2a8c4f4e08957fdb3155b63f262c133e841adb20354cf46898a07c3942d6e00836968e789bb341366a093fdce0aa52023224c00956edc777db4d12f51c74a223737830b695e3346c246f6e7ec104225b2500ded05f6de92fae21c7e44982b00a80d4" + }, + { + "tcId": 1834, + "dkm": "b1183f081a4e34db7c99f3cad0a7464ea2ed9a44a7070bbfba50b5533a74fe3ecfa5d1129bd23c4b24a4d99db90caa6abb033b0afab5d05ddb0c0e9411fed13f8a06930632a80c3712606133cfd94d9ddf0ba9dffb515a747f7b2f92708c21988d9781d3eec323a6d83fa1436177afb2cd740b91585d94586dcc9b39366e3f29" + }, + { + "tcId": 1835, + "dkm": "1da1910a3dce344dfeda232e49c450208ff964dbaa165edc82d828cd91e2f95762c4783e3ba9bc5b909c2ae33a3611599b86dbd78df82673de5248e09e5b8144876e2194a00a6f51b6ca41337798859f7f241823ae8b72b48291dcca8a0b24d9d8ea67bf1cfc4cf3293cea85fd06a6ed7f9e7cf3673454ab4a22bc1f2ecdf40a" + }, + { + "tcId": 1836, + "dkm": "b8c2d45c7a2b3e3e113c6867df1d14062576c56647e0d2d6f1029eab0fafcabccc6af8030244171cda7b86ce9d86c571122970892bf3fa3df96e8a3ba77c79995b584c4d95649bbbb3486971964c884efaf0e1a44ff47ffdd6e28e0804fef7dc9534dacf4121e2d53c15673bd80a808a2bf9f407976d1269f396c4f8cea669d2" + }, + { + "tcId": 1837, + "dkm": "fd1453564bacaca82927dd69491c1b59e240174aadf6fd3e9672d153a0f29208f31a1ee5950a3f29525210865d8db292c15667e5784aee68ce1c564682e1ce3f8ef46cfef18686780611049d1c026285f51ab30c96328af5fed98ef9850ae4572c8eb13a50e769079371ca52a0080c5150301ce76d694784fc0a55696e419b68" + }, + { + "tcId": 1838, + "dkm": "c1ba4eba90df3a59f5e0a0de5ead67d3b9d0877d7bfad148bc0b81c17ee6f6b281eaebffed77548dae3b36fd9c43991dc378efb5a42f36adce17c1dc544220a3c3d114622f78ee26eb0284f50c13f3e88a172304c4916273e4278a6da90315dbda09b499683fc2f6c91ec9f35ec57e7b64563c8cdb499e588e39f732d15f2671" + }, + { + "tcId": 1839, + "dkm": "553e018521e235f671b17bc46e613867f70bd1c16e77d9a08ee30755e69d79ba7feae2088645945f0afdc1bfde4bb328e2d70ff2dbdd28e3614bc10cc1733f3970e1f6266c7cabe6de8ebd3dee1598e0de7e68e069b108ac308817acf7eb3fa9e4e759a503d74015c04f16a8db85044bdd0d14a3804e542ccd069b2510540b20" + }, + { + "tcId": 1840, + "dkm": "45f5590f73cbc57e03e3dda2741121af2c0f38c52f010e9cf2b298c2612a99b975be4ccf7664b414494cc727cf97e86a440781df2af23fc8f1d2aaf709b7adbf47a9650b43e58b435cd556b04fa4f3bfda33476acad55eefe5610940121d2a6a9238f1593397b95e370a30ce8d28fccdc459bd931043a41163df73660a13e958" + }, + { + "tcId": 1841, + "dkm": "a79a970e672b32b23791e4285d9631f19cc25ad079957d39b49c81be2787d7a4ac5724cb311e3d3e9e68f91dce585af18992ff4c59f89771ae93c38bd8a471084a393b248d0b52f68063565eddcc27646dd1b638a210894cc683a727ddc8a149c067d9b375eaa39906134e5ceddbbf56a338df39295657427572d993e4cb1f21" + }, + { + "tcId": 1842, + "dkm": "a99aed227ad17ac1f643510d8fd99b955ed597d34513ff3a11cf8e6070cdd846416f22a53354080287f7a627da333d1404277a41dd7b8ac126085cc760afe7ccdc8af5bd2dea9bafaa59be38080568ff039c232110f03f31dfd95f0174202445868dcfc97bb91c8b5b130d3bbd732adb1b57a62341c7a6c8a0d1c6516344ffa8" + }, + { + "tcId": 1843, + "dkm": "06205644df928196a7155fe238b03d07053ce45db1afe78be2a0ebb1077f6e343dcd16069a866c23943b03ddacac4c6048a0fa93c29385137b80f31fce6feefef91ac514fbc5f350afd9a389d9e67fe4362ea6778fd3b3fa566e4adbaf76365c889eb8df7e8c76836ce433450269948252f73b9ba139d8da761d4f2520dfb8b4" + }, + { + "tcId": 1844, + "dkm": "921514102b0ed07ce3459eee45216e6af92f82927350d27c4f50d7c1283ea6e2fcb1dbf555fe9af19c0d11512d17db6873e719eba980e7057ebb498666ef6d1ed2c73753c44ad3701f4afe287a8622a9f4c569be467567377a1c967735a3a2eff7c96731ea3d2d041a21a5d46d4345db849711665041b00226f0fa60d94f20eb" + }, + { + "tcId": 1845, + "dkm": "9f77f9d3c2395fab04fbc8792c01ac8f4812e43c0a711cdff78140554827512a2448df85e2e9652bc49623294d57e5b28dd67011763485f52786d622a7fcaa3a1eb63d54f428cad1e1f19d28805f53db8d8aa5622a4d75ceb5d765f94182272d0ded95ac22a451402b65c0a71edbbab10abf3fdab5a812fda57d9fa0330a1c08" + }, + { + "tcId": 1846, + "dkm": "9e2b1126a8e7b468513b02232ee29bd9b5aaa197d1bd2051176873a4dfb231e4fef791668bca37cc7fec61903c34262d0f14fef77ad3e20a8302234123b93027dd4d42be323709ffcd9aa5281de75ddf4e84a68d862dfe755539c7e57db282297b06b30d2fa2d1633aa640df4f1df4225205a793d723dbb5ec324d0dbb9e9c3f" + }, + { + "tcId": 1847, + "dkm": "0986f791a1124e0ef2b069490d78fd278aa70d62aa2ef9df97ada23dca8b1ea8811f20daae30fca13a925cc0e1dc9b00d0d03a7210ff3212e5ebdf067424d051f7bda911bee45373f65061058968689b514a3a21c6f90669470ecf13316460d709467e31b04075ce1a37ec129283f1f5892e804f7d3eb52a44e9083bcbc8273e" + }, + { + "tcId": 1848, + "dkm": "dd068b0131d5653c6bee60f5aceac6ee17d7a0c7e39d652787792ae108305fda60c6641895a4edb5bda311f7a19d7b9b69d86720ac99b87659a36f89ce05940f9a704d34c1533d5672ff40e7a7e85aa5a2ea34eb9b0e294bb732aa907b19fcc555d46a6788c90be1205f36efa41f154cb2ed9a92715f41d06f22f67c87e56403" + }, + { + "tcId": 1849, + "dkm": "de7fcccab6f3f4d6b07fae2e9515c241e0cd75dc78795f17bd81ca44c56660f96dc55920b08386049406059cf26f0618660f62b8d3a5d8d0e9d03ff788cf66caa0573baa6c33fff0e29d61e95e355b6b962bae79d97088832be2825c5d7fbf2643888537092ec482b2c9cc6b36fe434e64ed6422be4f9147a1b5ac7540c3b852" + }, + { + "tcId": 1850, + "dkm": "1d5ffa19037fcae0953a25a52ddbc2ec293b77e1e07ca6b8b133f7444b9b57c4cfdfa4623657f80dcedf6e062ab57ee15a622b72825d1434dd46e4817f42619d40fc0537c7e1285745f2244f3b46426aaa11442edae4368ecbb627c932365d1b4a1f856c3f98e7d0594117f6de88db1bb0d97b1fe57da274d7da4f31c7d841c8" + } + ] + }, + { + "tgId": 75, + "tests": [ + { + "tcId": 1851, + "dkm": "5f8a5d2a458ec599b02f5c28e0df3b72c4be6bb83b22c7f6251639d71a4f0aded83141c85dd66bbd3e2f11a7f7e0a48873f5a7fcd26cae04477c3bec9e18c2785fec9860979ad5852a81240697b27aedaede61e62136016239bc742189fac4edb7b8a1bb6b2bd238c3975a4a6f801a48370d6975a3dc9ed60a7288a6aebf61ef" + }, + { + "tcId": 1852, + "dkm": "b3a4502b889a59c39e50cda49d6357b8aa2723e5a9cb85a35fac9eb1428566a553e513c2633de96d20fa33fe1e20217707db2e1ce93a0a05c620a51fa18bf350556f4d1e394c020a4adef83eeccf70d2e35e68afd0602c2ed0a9dd5a4b206b01154f0c6a6791c4e4963c3d939abd1d8b6fe656b7a0c6237531dcf7ed1396f664" + }, + { + "tcId": 1853, + "dkm": "5086a4640508f5b1d3068ce072d079c56833c7bb60d0f07e5c1a96c3a9113ba5c237e1eec3fbbdb7b9cdc67ca15a0d0087a41710320b014e259d6da22f79e3994bfc3a94b04990ec7c7b2a0b0d7502462d2d8bab02b395305677e0cb5ed2066ed3cabf205b128725eb34042261f2d104b425041fc1e48e446af3a171d3a28d69" + }, + { + "tcId": 1854, + "dkm": "a943d612896294380efa0747697ffa35a2c62d5b9b4b89abf1b36556dff82e87e8d8aac82e6348067bb0dfcd4a860815d38cee1ab92184e7d1a37ac459971ddf3bde582a653c1e8356711a9f688d14f6e879dfb7b34cb953818aea6cd9e696be4dbb2bb8eed7c5921a18d41feb8cb21de64da2197de454089ebca4defda51fb9" + }, + { + "tcId": 1855, + "dkm": "e61599c84b493f05e9d31ad7272ceb32fca7fb393f8243d373a2ccf163c6af98792f041995c7d123dcc4bfa02248d426a6c9c6a18f08724f3cea8da5d5eaa86303f7dfb1f378f1787db9bd2c22c81d3017ceccff8319c757f5a9225cdba2552cd342988985694feb7d8a66fad8fa0fb091bd35b334073f575a53d5b8b81f3d73" + }, + { + "tcId": 1856, + "dkm": "5bcb0e0f3e91b25f33eeb618c009c1fe15192e5944afc79f06e3b8ae981f6fce8eb72aaeee29dd09f0782b5a6a380e2965d28342f39cd17081e4250b8954f7b3a933ab80573f6b7d716c6225e5c66783ecce4fc0c0564e2d07fd14c51cbd05a929adca6e2d70e0dbd46b433d0f939c4211329dd97f33025617984ccdfe6fd45d" + }, + { + "tcId": 1857, + "dkm": "b8af09820e051afc5891e897d2a1e5766f91c0740ae55e5996cf16e3dac3b535dfc11d73200cf650fca776883a8988e26ae9eca59a483a502d96b57bdfd4dc14c8330ee06cbbd63e6b97fe058e0f96f6acd8a39792ccb0c7bb3ce23621b44b6812671b46eab722937c9d0fe2c2b5f8adbd2ceab18f9f86785fc2dcac66dccbc5" + }, + { + "tcId": 1858, + "dkm": "e1886d93d6f681896b62c05beba62d16aba487ca43ca191e44323321d0e0f62445e57bdc7145ea78297acc6d64748b395c83b4cbccca4378c2c4669abbc9d521aa244e198d8d9e2f81076491df8e9946c96123ba9bddeda6966ccdb80e1bb9acf8df52f3b9e4839bb38a13824683bfc357f8093e4ec473d7c40f149e5d96e5c7" + }, + { + "tcId": 1859, + "dkm": "f067fa22d655ff45b9592fc1d0b34df039ed110e5308bea17b64b5ab2deaa224c1aa800235e42d976b6ce3d114aa7fd29ea36acabc6528e5a3ca0445e9cf6cf87be3a2ac3c4e2ada5d787a509b6ef89a32316a07c14d66379b870ded9b88a663be7d4715a9c5b75d2510b5e2ef3b40a5b4c79939156992d9fdde21476ea883e5" + }, + { + "tcId": 1860, + "dkm": "706eeeb37d00d2d766188fe7dde0ee7cb70aa0775fc352071e52ac8246cb04bcbccca1ff33d689ea967689f03a1b49e35dca5200bbca8e83920220988be4e0843f8d0b7db30e4310236021db971dfa5352ecad0463ca87136e1287dfaa111112277da04d510ed97d6b22786463720c707e4be8811f63d125a066846d90189bc8" + }, + { + "tcId": 1861, + "dkm": "9e12c4eb1a9a652ff1692666f5b609376cda2f29e2928ce47efd8455b4ec2ff77c129613fbf5b609720fb198d9c70ac46512f336e99bf15bfb22257ef84a915ecab4fe2aa3d30fcdc56d16c7d9b0620c21e94ac982df618b75ebdd440660c2991ec7412b136e25bf92bc93775347b60eab99a970929343059cae596f2186ac13" + }, + { + "tcId": 1862, + "dkm": "b1c3e0da1c90c31a8b0602aba9c49c55826b99e101670730c457866395e8529b4197bd8352b157ce4bbf6d54c36a44bee58fe75acbc6de043e717c219301fa885617a79925b007963ba25b936be758b46dadaf4a70ee80785704d4f559d9830ac81de73b9c57736228456e34c82ac50e929991d26e7275ab4e46bc80c1accf07" + }, + { + "tcId": 1863, + "dkm": "b56deabea2535d24cb2dcb06f078602380cda4f3dcab78f87c883ca6ab583288354e706369c87b929e1565b0227cf59892939a226d777692bfb425dcd646875a00e46e2e4fed1a53c5dbf1eaecc72e9d5ff4da937437547aad6af3591deec29ad14064e949303639ea95e361adcfbf2091ca47f34e7d9c0347ab11bfefcc72a2" + }, + { + "tcId": 1864, + "dkm": "18f9d2681b60cd6a1f24c6bf59614b32cacc5ef6eff5203681fa78395ad1803d1a5fdfb28a4a3e3d2d6d3736af12b86afe5c049e5b984acf6ec2fa959d79e839745b4ebe29d96a92a714968cfb2c87a41b8a59b65c090b41ffa6bdb8d3ba67646dfa1cb82d5cfca78f8b8956eb0c90142f4935cb22e8bfd5430386bb0f6001d2" + }, + { + "tcId": 1865, + "dkm": "aed0d31ce245cd20c6e75c32a9b636ec55e2463c3c1e482b5922f5806f47e44b60497ed7dc4c42c08772ede03204231c2d7db6415a2f2edbdd2ef7ffb2d2737eeedb7a4fa30349429d196a697ecfeb45cf471bfbf68e6f4010336849480d872f9bd2f22024b3402040403bf220b6924e9f13369b1e8e10e71179a5df307d2a81" + }, + { + "tcId": 1866, + "dkm": "c13bfed62dffb43cf327b653625a8572793fd0e58485db09a702a6f94f6a8da9d67e33c7aac1d838e5d95e921c435883c5f0f3e2709cf9ede109344f174b6a615bf356a688461c2e96dab6cda6304aa89673158946eb2c82186c62b2395db404274f9411446b8ccdbba4fa46a496e6559ce8d191be3a20be86cd3fac4ef05b0b" + }, + { + "tcId": 1867, + "dkm": "cddd440ebc5507800ddc61a94d04fe0518f434b5f89b2617b3fe6fd0c38f42efde549d91253569ef69d86f97b4afc05e23b6fc16dc08406b269bc12c562f764ab78c475724efcb9295beded955ad4886257f3486eb444db8bad5bd8005b0621f4c1e5842396c3ff7ed92fa9073de76a842f21fa0652c51fec7cab0a561ba75e9" + }, + { + "tcId": 1868, + "dkm": "c71606419608481468e7ccab8f7a3f3e9ff0c0100385b8dd93b4ac01f9796047c4bbe2ba71e1a4e702044047f39c0b98d6f965deee38a787acc6f0ca164dc11f3ae4b1ac9c3c8e186044840d9508680dd2501323ec02f97b0b4879e6eed72d35a4a0dc3172d2b677ad72963fca2cbbfa23215152547c749f95279dffe06eb316" + }, + { + "tcId": 1869, + "dkm": "f5e01a0b342888a2c26f958ccff1d9500665fc621a6084cd9a6b8bc57aa3893ef01acaf9eaacd9a5993b656cd9410f80eb495bcabb255d70274558ec192d0b401235965b13de242eb63996cee9a43ec5b5b012953ba471bd03739bf1cd97de77978a62181c082d6a1bc1d9b8b02b01e1e3c236a5cfd7fe11c9a5d442d259dc4b" + }, + { + "tcId": 1870, + "dkm": "daddf226c0c20e2f5ecbc3b268c7804d12671d43c91d74c6f072c0dbbda36e48f2db81cdcae77aad1a13835918bd424322e05d616e50de392ecab31e5cf5b1c187df731233218f6a3b98ea5eb98e9d472f4442e21f8e5de28a4ba956a06ea66a7c2f1e40354bf9aa97368637c1d4286437f25b5e8788c5125e180874a4275c7d" + }, + { + "tcId": 1871, + "dkm": "51eee8786321652fefc5565215b4a59382ec5aa165b5b83af5b47e5db466769585604384b5b17c1c04c8361f1fa3677262f8a1f82de9426efaf44a9dcbd5b46da7a36f013e55e77a55bb4fa0d23b26ac7893f6c33d99b506e2d13f039c2556079f39c28e0c2f9acd47aa73aa1ca614a796bf51bd73625bc817dd36aee034cc2e" + }, + { + "tcId": 1872, + "dkm": "26a401160552678492a3ad41ea0554862b73c37933901a3d6ea5538249572d5beee7a4561803e54d0b913a832d10d8174ccb5032e53825b34b35b173c7929331fc0ab271c6cf5cc6db1adccb5a5fae296687807c6885dc047b958f20e65acc608eb14d08f9f98867eba514ca7310cffab456f25337b197e3a6c9d462922a2172" + }, + { + "tcId": 1873, + "dkm": "991c22ff4bde49f3ec1fb651a579a1d05c712e49cb104a7462d28fc24c5618981ea8bebe849baaee8d4126a28ddc2b6725d0c7ca3a93b2fd19a20322102884d9414e8d7a0ff0442050c49ef2356185b38fa9f9fe1733b5d0893014b5a5ff2960fb27b8f097ed125aaeccde5dbba76ac6f719af46e47c3e27e75291dd3830c4e8" + }, + { + "tcId": 1874, + "dkm": "1bb6057d821006e394206b58a6dc99975197ceb4bbe4a038625fc8aabc069db5ea29f84fe018eb55fe8ceb79d40843eb681859afafbf8963ca9223b27680315feb35635b4aaaddac3c5319c9cee6da0d72ab866d6fc2b3dbb0ae8f62b7af37dbdecda5b1b120c94caf2bef76123b7156c129d08ae7b6be741b2d1ccad7de3071" + }, + { + "tcId": 1875, + "dkm": "5b0abb087a6ea747c31a3807926e35c2ea4de25dd3cdf7c73ac43193719ef028f0837fd724a200a2ddb75dfa5f490036070c781d03f10688475c2c8072490cd510f0c17e187802b97b6a1395d03353cceae3087adb94755f355effd43507ec3e6b5edf314c814f4d0765635ed54ba59d722091b1ccb80414c3b8315a57ae1f54" + } + ] + }, + { + "tgId": 76, + "tests": [ + { + "tcId": 1876, + "dkm": "8770cd57a791959145160af93eb26fcd6938eab7defdc5123f00adbc7e5ad1eb66fb341a9c06746d6b2f452e678c7a161eb21d8f6ca20964f0289bd687a7f62abcc86c192f7805ea7669f1a01c1e559dc895aa36c178c11de67dae445f09f59ff27e88aaf3465b39d233fd82a75d3f14d755d976f6e1c61e2bcc3a85d8dd57b0" + }, + { + "tcId": 1877, + "dkm": "02e6966ab8469497efc2fb452997cbd37405d05e73aa84cfa9fd6178ca9fd3d723b0e6b16618a2d0302c7a9b47fb8b6f8ce9e9d4685e1a01de221dc5dec91f3a840eb6e8733e9d5ee0826f5cd02400129ecc9363053b4c19735cbcf46dea0bde2fcc4d63cc941badc7312186433fc1ca206573a778afd24b1217bf9d2fbbd721" + }, + { + "tcId": 1878, + "dkm": "3958b479ed8e9544fc3a9108924ea38ef76ddeea3a4bbbf9de21e4bde3a4f5169f803221a8e71ea73bfabf1b8552847262fcec5cbd03621f6bce0e0b97951861a90d2b518b30240b6dc571f229a31f78bb49b2eff5ecebadf6a28aae028220ce80c2ae8afe48676b2470d0880acf5a0f02fdbc10094df42d30414ef2456370c6" + }, + { + "tcId": 1879, + "dkm": "24f2d690893aaf34ea53a552ef4abf871f788b41ff4fa53d78baa0738e436e400301d716e33b1c3b48bc2cb284a8d43e7c53823a85ee528a546440a08fec087dd312b7136819afbd735ff3c663edaca8edb6585d1688b7f89f5f5270349c5b5c595331d59160fea4b08365e970690f86a444ddb923a8f9989f96c40d7b1535c2" + }, + { + "tcId": 1880, + "dkm": "917036cd5061a051adbbaa66f88f8c98448ac32faa919081e594f57b7f233682ab9289e7b9519443919dad67d5f6dfb55566c53f70d92814390d7787708add47785a99ff8d844a07d39b1d4df054bda5b8099661947835177d36f8a974647108863646e2bd9fc83d48087057e603bdec31ec50e0c08409558ce40f7531f7a1f6" + }, + { + "tcId": 1881, + "dkm": "bf351d98899c749190fc8d20770d64e63d7acfd7711fec8ee5b5aa88a5cc3e3bf424741ee0fae6341a6dfb3c1c81bd98719669f9433959bae8da5ddc7dd424ca3b9aad9f256dcde2666cd64c4fa4e6446a95e7962504500f895f4ce73bcb22e684f6e44d7d1eba7b28140f12b69045ae0eb54b7edc602b54ecf2890f190798d0" + }, + { + "tcId": 1882, + "dkm": "97647a25a8c1025155d93e4536c227be9401acef5fd273ca82c42d7bb863277fe9c7e88a0200ddf2c23524c0813620897332aa9459101a4529cab6b420f50b9f4253aff4bf39668a7ef2fc2e3adfe2ac90fb90734f5affbffc3ddcfee8b8f02fc5c105bbdb35e299980057c0459ab8413e7db21f032035682f804dd8685901b3" + }, + { + "tcId": 1883, + "dkm": "f8edc75a30323b161efcf40cd736fe592c373711112e1e4461716a8a048a83c09c9c0cefcfe4d2840b819dbc5ea68f5fa1b93462ac542918a08aba230eef3a5607b877979655318c2a55bf11025e42522d55245641a761d7ce0fcce101528e8bc459cbe11390deb94018c259f34be51b0963b905edfa2252168790d8310b76c0" + }, + { + "tcId": 1884, + "dkm": "27e5f30c9249e3925f281cdae54c3f19a83aafd9d8f8dbf900e7807f9a48c2767500b6b6bca8176830a38ea477a3719f5d3ff6f9bb7ebd065de932222771537bf074b708bfee929ed2332b7136b9897bf285dd1761888a87377753cc5f1bca25f09cdc6242e4c21d06cfb9672547d49cf274e7703b35c715be14756430b6cbec" + }, + { + "tcId": 1885, + "dkm": "a733221541f1f73cc40c92e48cac9c464c32dbebc81355f65ff1282a3cd2982e96ac8696ec300613a54a1228d81a0a65ec972dca2d47ce498e2563bc679638c99e090cc84c372a2fd12e5ba9d7e7f06b57af4b91ede0fc489a8a2911535317d810ed81746284270695a5108ac1fcf71a661505a398faffc90edf1c5fb4d4f9fa" + }, + { + "tcId": 1886, + "dkm": "802f03173a45cde33f817f3d98dd8a8ae8305950118f787e4d84e7cb1223af0b240e716731fb885e7d9f000819995cb53df5bc80fa9eb1ce582f74d4c289f7fc1ba33f8c1112f4f655e8570bc13c37a4076c674ee624e44f9f75311a137c8da062c3cb44d386f476f79309155b2b2dcb778b126b71846cb68efcea488ad1e274" + }, + { + "tcId": 1887, + "dkm": "c03ce885e4836c848d9de09b43dc188a32c0ee67239fc466248b78af63d065c11bcbf561818e3f87bc658c51a0892b1d688db15939627e418f35ffdea219de530d2b164a3b011f21229ae2a18b056cd9e0b8971207f6c1d60e880173c2375e92a4e78c4ea877079a2320a6443ae2dc522f723432fd132012021072ad2a5aeab0" + }, + { + "tcId": 1888, + "dkm": "81436c2ccba7f1481fb22e79e98057a911771e45b890a05e876cc21895991ca2e1b1c682f372f2eb01eb654d4b7ed23b7a27995a2fbf46bdc69f274ffa74d8694720517727904c575eb43743458f8892c70ed2267fef28b6091d26122f51a898a4a42f39b42de00290384f139c19847525ac1edb45d11a7c949dd7cbcb51dd65" + }, + { + "tcId": 1889, + "dkm": "6f66b7628cbda3ff375151f1fad92d7568f27fa9e77dd51418a4a557377ff4dfe677b190ec2ff673b79c9a451208dff9c9c4f006eeabacc720dd75aace46bda2556b92f3a442bfe7b21933ae3a284992d4e45462797547e76352af94ccc6f554504e60d77aad9a8578d47b36887f6f548e085a1e39f03f5ee8a5d95a2e5a0db9" + }, + { + "tcId": 1890, + "dkm": "48509514658e457d3f36ca6534ad639c9dbed8f8e7a0609c84b9eef0a451ecbbe7f7d829287fa35422f4277932dba3514249e1702601788f0a30fd357458555de358f8f64b554d468724907b05a2f57ec10474bc7c3f0573dc878d03312eabaf7d37a6f81ebec4aabff27ecc1dc8eebbefecb31fc10abdaa846bdd4daf3f65b8" + }, + { + "tcId": 1891, + "dkm": "054d7b121e6f6eb30e90a6598cc1648e053692801d94edc0d5b8d416c38a587d861d2162bd06d04e1c2fe548c2e36da6845034a5a71fcff6ed7cc17a36b85e58c2f83df5ce12c5382ab7381c537815e360d10038ec3541ab913db4c2110853bc2e04731426c69460b2af1860eed943bba22175b36c05d666c54a1bf3cb91cda0" + }, + { + "tcId": 1892, + "dkm": "35fef686bf7fcf0eec2c2cded88913ee958f1531e0a310e427af555d803ada594f714e59727f4bc48025b17515346e2da0d2ce3065325bfc2c7e4dcf474a5d80eaec0cc7628ff8f2853c269e19a778e85c1aae5317f24a74c0d8fb3ecc6ca23e83ccaf66eb41643b5c41f963d70b6830339f19fdf9aed4b78ca0c6f2c84ddf0c" + }, + { + "tcId": 1893, + "dkm": "29eedec92b4e1982d96ae726934893483c3dbec2294ba678fc7fd90743180efc08d75e9fb6b505de4cf7b77b3b9a1039cbda64128adece262ae0df6e78b9bb5ce66c2b15b6731963710a5d1538a27dc0aa907c7b0d3fda5d86a9299350623f3bbd2a54b92d4986954079331933b5356499ae4c692c393b76b1da909f8dadbec1" + }, + { + "tcId": 1894, + "dkm": "c8eb5435b49bbee856ffdc0d61e61cd97b63511518c1db9b0880fbf7cac02fbdf42aa6b544d14eb383a885c67bad29300b79bbb9537498cb76aed7c10a6fa09301f7e5b38b74f7120f65e77f2f685d18c286eb6fcbe618c722096f3a3f765d28a50757d522c81e5eef52f705eb735a6c69409ab436867078d85eb76c646a8972" + }, + { + "tcId": 1895, + "dkm": "f9492f525e10799b678872147442b0fe1fdc5e71399288661016adb1fa6e0c2a675d2bf3731a9b825b2b97578149a42e0de827167cfd3e82dbc36a327d508ab53b7dc9d4faa54d8e0b8fb7eb593cc8a5ef2d6777ab71f4e6aa52acc4a1da731a9cc72f70632d8078ae4c93015bc2a8ce4fea8da3b8795b26c646ff7d3ecb5356" + }, + { + "tcId": 1896, + "dkm": "186069f56a81efa89d0cc5a7fd11ec7e4efa6f9af6e5f5b8252ef7f60b6bc193152547b533f94bd4c468974deb2652808f3ea8e8ed41cfb25dd2989189a13badaee89abbae73c79d3f8ac69ff946c91e2e9f0021b140de3003c4019ba9467e8b171c538daaae6e7f5264d55e9813005061d94658305aa3d83e71bab9c9d15a33" + }, + { + "tcId": 1897, + "dkm": "c445b48eda5c46272649666b3f83c48a6f3bfb32f810e27b17b5a4af2a31542def8895e5f6376e0ad7fbc0d6fd6b932540547a7656249a9019307cb4a037e081a8833c9fe771efe72b25d0dc4b3d1ad0664856514ee5ed9df65e10500fd5912f38cab79a03d238f2179bdddc735b90ebe3196b1c9a12f73b01ab197379e1265c" + }, + { + "tcId": 1898, + "dkm": "0e82c407455874a151708cf2a26d92f798bfcc7b08fc44f07b7891eb4586ccdf837403c8136505116399c644c6402a8821aed834d2894bcaf0cd0a43acc422d42ec6ed339b1f0b7a65daaaee63318b2d5c55b4218325ebda9b3f38224623ac9c60062e491e02cc967cbdd9ac04c56e74c0be54140de8f448fdb9460b6300077a" + }, + { + "tcId": 1899, + "dkm": "ca76afdb4d40425cd8b7c69fee716304333bdcedeb435ad49ac3883bfbe26579f1b262b5d20dcb233346c7aa610a48f6ecffcceedd25d7d0a5c2f88a97f4d39574e8bd8f89875aaac8c8e568609f2fcb7ad091b837163835b2bf3d9987d276a5524852f60499f40dfae8f69fe6d3185b3f203956904c73fde24f413b36eb4f10" + }, + { + "tcId": 1900, + "dkm": "26841d9524240169325fbc032599ef19a9fba96d959c85959f59273d7c618ae99c11de9f8d8a3377ff7c1a2a44ae5faff7d0dfa743cdf5b3237a4e9b1ef3d99e250dae16cc8d4fb4d44c4f1498d5082adce9ea48df3e879f8a83b01e04741a926ff64f1c7e388f418516c29b650de3840aa6dec42f3eaeb53a19985a24d6d6a8" + } + ] + }, + { + "tgId": 77, + "tests": [ + { + "tcId": 1901, + "dkm": "bf19a2a7ff89b4580569d4491340b7058e663e7e36ce5d96130b9c20adfa758262b0bc1c3ae7424733481dd1e90a4b5b36af16562deb338851d97e2e141dce93bab6a959fe650a984f00cda9a8fdfca58d0511e19ec2c4d08e6670c2b5f892723f85495f7815605357edebae744bb151cf11649831577901b4ca9fd2d99c4645" + }, + { + "tcId": 1902, + "dkm": "2db5cbdc4459999b6b08f84f0d08a5a1adbfe3ed93b8463a53ebaed0b705089670838b203dad1318c2626e866674c71b99fbdd80d4f2fa71f01b06c7a7ca80cf28ef6a4b5c3e08978ace7c8a2bd87f14619603835d8453c3d4fbab09ad517888aba7c1aa74ff9a0c31e43f5efd8029cd58fa44e3e8544455354f1630883a0c61" + }, + { + "tcId": 1903, + "dkm": "1d732c04d5c2c37828479529bce86372fd2a4a3b3e292afef568ec7c33498aa8c5333dbcdb6bc146c73f3302c2ac6f4bf4c22c1b2f83d5812cd0fc32c7fee1f51082daaf8a5f4b23109e84692df7208b85c7f83872b93c26191721b5204ddd3bc7d2bb1cf20e6c6310d78dd20a776daf70ef9284b833d3ec3ae3f39528ca5cc1" + }, + { + "tcId": 1904, + "dkm": "56a2ec3a10e392823add19185b6f76ca56e2dea88e33b0164ba627deb99e9547d002fcd7a32c0d4bddb6d849759ad483edc8893e27c96408e4c30d08bfdc72a77e9ef2114ea75a2199bfa0eaf660831d110f189ad232046d91d2cc4641b0e6cdef590d44cb4356d280cc8c64a16685978275e3fdece47cfd94181c8f2d959f2e" + }, + { + "tcId": 1905, + "dkm": "e3f6484c9d6bf7d6fec188dd312d639f7f80db34b5b4eb9c1dc66ca23a347c6e8697dd5bdb930590d7987ddeac8ef5ce8a25a07fb2f6ec350dd0b50bad4e36cab01d798ee63ed810a4099c2990918ac8f2c88c96ca2f9ecd6e56e8b7d8fe2703509054baaa5afcb5b5ca73e7b3e65dce43bd447dcc4ee85906a06a183b2e442a" + }, + { + "tcId": 1906, + "dkm": "889471f9c0a35da26fa190bbade4a74ef2a6c9906ccdbe3c90dacd13308f226a1c7df4b25e1a3a0e0fcdb2af3689b00bc7022440daefeaf34e9b1f865adeeeadf343269a2b6c573f9f42896060ad8a947acd1e42c28bb2aa6b1c7008dd15164f9d8853e95facef635798e0b2fdf589dec55ccce1fbb20e06305cc8bf9a1b7fc0" + }, + { + "tcId": 1907, + "dkm": "c9d65a1c2852b31e3139f5ad6d67c7e59a60982be08932c9f0e0a3aede8186aa63be8a1bcf31061ab3c8f6073e1b1e965211cc3149f93793cf73c0cc60bd1f8d1adcc8bb6197d78b994fd78ebf2ff4bd4705f9485cc6cfa98d5c75c61a4b03ce624ea0b49724377cbf1c72f24232ce39c18f09ece60c1286ef39efc079b6de20" + }, + { + "tcId": 1908, + "dkm": "7ebca33551ebac1464afd4dd43abf1c57e66671791a4521b32236842e9fa409c7d5805440b5e645fabd1016b158d6b746ff2e2d78668cde0cdfe030a984a825f2d10d5d27c69a15321ba302dde38cf1ed476a8202a45f3a58bb9829ec37e35dc9cd30a09f291644133cc87d66280eabd9b0b55af9c306c078ea1f90d9e5b6a08" + }, + { + "tcId": 1909, + "dkm": "29f527d77cbfc0d8cbc3f97bb97c89407a189f922672b3990b29d1e84ac4bb83869d6924a7bc03dafdda68d8143b2ad3be5c6d64ea2be40d32583cba9c11077053920d92372a3a01f9533d79add7142c851a5578037a3847e4d92df98425027c2d741b748780cdca93f7543e4b9b8326635e38ebda4f9a940944894a4ef36842" + }, + { + "tcId": 1910, + "dkm": "82122686a11dc01b15fe85016016494231d6238691d7caa3a274acb3941d6eb03503a19e261cff79a3c095a4ec89fc70f51c60d6841f700866fa21f23fdf10eac5bcc349e8ba5c2b24be97c9528dd9fb2806008c7a376a7d14c7bf5731e1bc8a1dbc6e5c855cb140e0176ac2e83fe592574b1e20e8b85b22cb7d3ba406cb78e9" + }, + { + "tcId": 1911, + "dkm": "3ed5d7dcb15fa54de0c2d888e1d3bc8a2abdc26b3ec6ddfffcd0a572710c833ac6443ac228e632acff74423258e110ae1ab1f41f3d74a628d7b3b7b3ab749853526749cd0613dedf8a1e3912caa5e4624ae99025c2f0e477712ff196743aa01f8d15ba8688dcaeae661a2f09d485504de4ab78454220d50fbac4252766e45621" + }, + { + "tcId": 1912, + "dkm": "57c28c4829dd9e7511b767bb37c74bf9cc3b737efc9c43b6d1240bda83424d0e899b9da55206a2aa22abbf05a459f240fcab4b2c9fd45a13000aaf268241c7acfa8dfadbf349d3169f87781f3bab9e0dac03280c39ab5f79e073eb8fe9090a8f0dbc91b717d7005a2d1025c7c256db023b970245af9ad9dde86d14e2231e7d96" + }, + { + "tcId": 1913, + "dkm": "c00e1cbcb079d5794d6eab9ac1c72e1760d479de5c65c20e927c254f87d54636ef7f9a18c3082dad075c1f4fd2806c486619b77151bb71fe8a617f53cf05b4528b6f7b5b001dd898cde236514c0a0b984712fab2edaab7fbc98fb2c1853957f0e1d6e032367dd66529f304de495d73a35bb36c633bd52d98e00bb1a64d39f212" + }, + { + "tcId": 1914, + "dkm": "abcca8acd69cc90d8d9b3bf1ef91349912a49a894925fd84467d5819907326bcc514e70358ad48c5a40f99fc9a35926f8ad93572b5f81469398daeaa395a119ffaae7f184b4377ab1ba65c0994890dc4d16109b867a0d6e9f4cd8cd8bdbeab89611c27d12efe7d4ea6741402125ed0de9108bf808a367cca0599131e613e4073" + }, + { + "tcId": 1915, + "dkm": "bfcee237b91892e378d90ae8693d05b84a83c100fdfa4b5a71ac086b1ea222de704b37d0499b49aa8c9cb30a11a31633d40effdaebd3515e449aa9eeee104325a4e6c897b00480ac43f0bf419fb7688dd89c02a3a924012dba54f7de129b5f826bb93c3229e56e0184b78db6965613bc682e03cc1e5de3de80a8f24827be47eb" + }, + { + "tcId": 1916, + "dkm": "532f32f21310a6e36bdd8c1bbc413552397c459cc9fcbc85df8fecebc708601f8c44f7c14f409d8823912c9a0bdb49cf8a1a3d090999a64aba9d96595d938b000b28e2780b746c6ec992d6bb8721cbb80a2840eec743c14dd8209031bf3b19f0ded6ee396307b7c5a888f7e0b51bd672d5ffb278a6a6db2fc8d1e9f377264b23" + }, + { + "tcId": 1917, + "dkm": "bca733390e6bb814c0c0ff9e8ac71660a3c2ac1b17624dfad15856fbc6a0e4bc478cbc22c37eeaac8fae10c56baeda426c5037852631d89e1160596dfd4c124da9b2e09e4ad5b038c786bdb0fc83d5f0a83607e7920fb3e451a26c146015df315b88a74bc30dde078e2ec6e11486c1cb549434716951261346fb36cb216bca0d" + }, + { + "tcId": 1918, + "dkm": "f6c7800adc8f3557414d83dbab500ba87336e4433808482da309b79ab09761a7fb322df78743122851ea1852f903e18e14914d18f51e4d502e9ab19e1af7e269f4f69492dd3d30ad0afcb8c5c793eee16a02ea8219052359fdacfb6738803a784242771c28839e15bd16bb2eb841cbe1102ed94a3eb730106ac137faffaa5a49" + }, + { + "tcId": 1919, + "dkm": "694ca4217ae43fa3a6ea13606812452aa6bc9c4c8b287386bfb33b13ce7a12167bece4afc34a9d3aaa1b402aef65fe71964c75ac8d2f30f02d7a3181b8e7195766edd08ee4654008f9e71e56d8eed883a8fbc7fd18a5f0fc99d9b93ae41a03b01f65bb59582d26552cb6c1f771754884d21df3213b0a628e8a11e3faeba981a4" + }, + { + "tcId": 1920, + "dkm": "f7b3305f2002675f1e05f3c79cf30e2f07151bc2bad5d2b09d3d7330eed8eb779451954986f39adb5bc5999a9ba6bc0eb06c9831fe03cbf01fd2868ec2b0c79979f93610969fdb55bce112f596ee9eec925d66f892053ca67a5148628c21b0036f20522278a3c114c669071535c1a3c443adf2144b07c2cc70c2a97031c1f6d2" + }, + { + "tcId": 1921, + "dkm": "1dbca98d21b42b6411a9209e52497c84d8b1838e58f0d54a971a4cebe7303cf0c8c275958dbd0d57ff13d3c46254e7ceacc16062aeb9e97f5a512e1b137639d6663cfc47c562c136fdbeae5d93d4a26863d9790f5c1e724266bc92aa989c6f244efbc687500d6e32a983623eaff45659f0baf56616b939925199f9595a7e5ea9" + }, + { + "tcId": 1922, + "dkm": "8e2e919cf26bab891dcce5ff2b0f925ee43f6626a83dcf8327308c90a68e8650354522803dac048648e3cec49210ae0f4abf504da8d340a22082d505cee463f3eedf47ab3c252e26ce570eca722e65d62a856f1e7020a989c7997867754ae35be45f156ee83b3d091aed30450125f447e1aa22ced4d36cf4ff4d879e6cf94e4f" + }, + { + "tcId": 1923, + "dkm": "ed687f56c932dae892d26ed83e8550614fdbb222b1c4cfe45d9b26f3701e02a47725ad14e2758fb2ac936937815933c887499c958cd22435bb6ba9194b02a010ec7ac114df3d438868561277d5432ded47809ca2d62af4d7f5b74fee1e0496b8041568d8847ab34b5c62698e7bd56a3ac9d92e7835b8d956b2d777e073e621e9" + }, + { + "tcId": 1924, + "dkm": "c90dcdf41b0abfce9d1d7e847a787d6025678ddc11999d845759f6aede56432ef0abf4fd957e2fbe5f52a4b461c2a700067d1799c0bb722794dcaeebabeec362652a2d5e6f3ffbb85d7ca92efd932a3f7b6d939368fe0f829f03daebfbc1a866744f3fc412c138682de49df489bf1f7c088e281ed821252f5431991ad69e5f3d" + }, + { + "tcId": 1925, + "dkm": "a19cfb4ce1f8e0a593318d88c955bec11f7d733c41b71a751534610a2d51852dc0f3875a9aab8217b4ae37b413e10f90beab6ffaf6cf871eab36aaef0011ca0cd2d297bf8605d04a52b16a983237ed65b626c67ea85d92ec0dfc50d7951136faaeb641e2434d5211fcd0da51659925b7791100ab36e70aa8896b8ac97c94b6c4" + } + ] + }, + { + "tgId": 78, + "tests": [ + { + "tcId": 1926, + "dkm": "0a245d55ef120cabb80444b82f8f3fba23361727ec6e5d54c12e46347a2590c0f3306c27993d1dd58ec7004575b14bfbcc81b3e591ee825c583e911a79913d96d7c6eed3fe956e3795b541027c943e081c451e5ddf9e9b7217867c61d0a50bad11f975e5aa42d0e3eefd2dfd22b20b5acca18a83e7bf725d97d7c9a5137a33fb" + }, + { + "tcId": 1927, + "dkm": "dbfa94416553e38b0ee82f10236bacc36874bab227ec7a4871dac5f9f415e19b7cb4048a10c48f6bb33a02f789dc6f9477b6cb9b8157adf2e11a1918ab9e8d3b2031e0600a8ed080892ff0c4004e26246633837f4a5b62b36d3f286c00386f67e107d93d7063f7bbc4eebe098d1d05ec249bd3a1ed14c3256df91595d4e66bd2" + }, + { + "tcId": 1928, + "dkm": "27b303d4b9eb6183cda288a02200ca3746026e2e0eefc07b8b5cc34c11bf6a217e7869098d558ba4c43c178d4f7c1fb8c11bbd093642696d4d21793faa411b50451c97691cc37c00c7fba271d28d3d9cd0c5fb301fd17d8e7da8e7be2164d03fd04975ff4c42d4d1de3b968a1bdd4c294fc962b4f2d710ac34e2864a03880d7d" + }, + { + "tcId": 1929, + "dkm": "7d4f9e0d8b7b1daa4563c91b32142fc0804fa27bfebdcdde7b75bd6a2feaa87d73d358ffc583ff104ea60baf3cf9019c526a201fb029593ce1689638f2371033a4df714a4223f16cac79aa9c2edee7e7b96b832ed00c64a29348981a0630b683f6730312298b4f91a63122871ea1a98c4d18d93473ed25965a0a5ed63e9af131" + }, + { + "tcId": 1930, + "dkm": "73cbff6295951e5b9e57c461414f69566cc6a000c63b537b3c4fee3f6a6198e2969e5b432d53bff51497d2cc47cff62fa5cf9bf4d59c46103a8c9b4df2729ea2309b4b1e3f8fb81e1a37f8224a9b5a889100dfa0b2af8a1cf1981d90ac7d2359010a1d3b74fd6912e04226811ded406d8f45076fff77c031e6696e784c589ce1" + }, + { + "tcId": 1931, + "dkm": "1580cbd72eb65eb82802c5a6f98d16ae7915959e2fd5cfa31fa09c96df2cd28bb1b3f8273767238fa191c6c56cc005945dedefb4578a266953c1c9065c433c16f3287146c551938afd37f9894cbe8a4047babf6aab6685013e79dd493178264becca751694bbe5148e085db7a2d34482c6a1c016c4993f41964c20b3731f65c8" + }, + { + "tcId": 1932, + "dkm": "de4883f3a0aed909857b62b9f648a77c70b80f25733b5a06332d407aee1df40112438b49c380f8dd637efc1a29b731617d08f94e67f36d82fea11c6330fc9247fd66cefc54b069876255a3fbbd06bb7efab700edf4eb405ed23dc6f97113ee867de1cae411b2f5042030fdcff74dcd9e5693736bab3b980b78761df06a08f85e" + }, + { + "tcId": 1933, + "dkm": "b0964003afb4f812df0e6d810db322a96d3c8f1634542983de0d41fc6c8b7e0dd972260df3637707be46869bd5963a383a99f04f1391e3a9485dcd8e56103a3beb9df6bdef79f3a6963e656504ccec29036b87f0244bb3bd3dbc2e80d2c3c544760d689f94db020388605199064bc18411bc2578b89726e2a229fc248ed60a88" + }, + { + "tcId": 1934, + "dkm": "c30d1e84a5424b4de1c42f74745b5eb8cb6e8cbbce0bbbef4bd55076b5746dbb24026ca540f3a5f78ac94ffe4281ee0c4f354880bf8a081b16d56409fc57492f9516bf7dd0b4e8c930cd125e9ce257d19722e0dfadb424924a6563c6ce7c3dee00fe1a20920440ee5b30d727fa805e79449bb1a8cc756e6c96a7fff9213e889f" + }, + { + "tcId": 1935, + "dkm": "7ef5bd9bbf1cdb535aaaf9b8bc592ecc7e998c78fa938d6313766665e41eaa29ceb4a67c46683aa0a9232b07169db3380c6030777763c961d74e6efcc6f470d73b4d6e99d3f2f82aa711e34a2d744107d1845576258f5632aaee0b11fc08f3a279078dc0a638968242f4815e82c235fcb76f86e3a76431bbd8ae63344587599f" + }, + { + "tcId": 1936, + "dkm": "47a460a1ea98619d5f9da9e91b6d66b3f8b09a60dbf10c7dbc58aca4ba49749a68a159bed4d055b5b835ec71cbef7162e47a01ce96e018598983228c8047837bb3c230c36cb440651f2fdca3a8aa4ec3db20152d7ba249cec4dfcdea8b42d14f3ba24d22a90ea83e412c793741118d6fb2405e48ecc239110f9d878bb84250c7" + }, + { + "tcId": 1937, + "dkm": "1f9f985afd94eaa32c52b144877078fa660f0f82b211cf68d4e1071c418985cd434ed3509fc5a248aedcd6a34025954dcafb65d23363e78026478b7bfd3d37928e5addaaf8b6ed9ac4823d26b77767f8dc498a2289c41e63845f2939a3b3971275f2758dbfada5ecfee5b853618eefa546114d235e7f48d641e92ce95673041c" + }, + { + "tcId": 1938, + "dkm": "b21e3dde065f5c92f7a86c8e3df7068e093ace0f82b918e546ae8db50fe8be2bdd4b0230e792accb400028456e29d85f8456793c941379ded40ae5dd0d407883a2bed69e8e2c5b5f692d7e29a5329d0c1140176941c6ca2f206ca034e9375d373f573a11dcfa2b0bbc3688fef9f327be97ede5069589b165a0e525d9a331893a" + }, + { + "tcId": 1939, + "dkm": "627236328ca23b4432c0349112dfaac1908e7014597332a67dd8787fca2804d25cf3c4188182065cf2f1b4a34b870961d56f7f367f3f2cf8d6ab4144e1dcef01a495ee2eaa2196bf9c4dd076126685dc565b9b33ccb9c771d62b0687eef1194307b755873299ddfacfe36f37c7b22c039d08c046e0cbe832ca95d070f3e24b58" + }, + { + "tcId": 1940, + "dkm": "65c7d603f6da8fcac2c9e68d201689f9023b64ed2e54c4d6f34282833cfbeaa6b3d0423a8440486384e8b99a0d4ca7dc2c0624da623960e25d5fd125734ca42ed507f9574ee3fac6440d4c0295d15b885690755cb879432ca2980df13a8701db7fd8d5d4d80906c8fa64fffde1ac4188145a5f1854e76e3d806301d07b9bdbe5" + }, + { + "tcId": 1941, + "dkm": "420a9c04f34458cd013b80b112d281603266142502214d2e708039888dda62f40486979914df2d517b7d8a55a210cbf532e16fd877f88d9b8c770022e1bf8a89217df2ebef1a15204ae0132c3589d7b5e1959af3531272bf9a5c0cb41354f571c84ab7ce47eeb5b10605051601f2881d0f35ea88d439ffb2f39a7b454dc5c836" + }, + { + "tcId": 1942, + "dkm": "6fa2e247c34afc229bde177a61c2041a3678ac7b41da1a3d9e79e6d2c91a570b2233e3fb0bdabed4a479ebb6995358b32fd4137d2560a99400de82f36709e8ce5863704ba198cd0e06bbd562c9de25b4a8fe65bceccc64d22d2834893c7521ed929495151085240e07b33b1d4fc07db838b5d639568196a7fd95489554018951" + }, + { + "tcId": 1943, + "dkm": "6a042d5f0c05ceece6bc41e162f18689d951e8fc1d14be59b8116c0c19a5d3ad1c1957e45d75e2b5b4a78250278c7afec71c6b0f72c3b29c9146fcb932b19761256d50450fcf7b5d8c9fe3ffbd729f0448ffd32c2df32dbd9caf73e7d2f27bfe08d5d6ba6d0d0a2539741094ef7e42884c45c6548ba638b531348e56f8402fb4" + }, + { + "tcId": 1944, + "dkm": "6e0a25f017f358b81d1f0e0a0e0bfbd306b0c0a2e4b83dba5473ca3974e472e1d1d7b5a67803c6b23cb4c5c5ca9c9eea8b167a2441883ff6f0c0b277d680f8361dfc2b9ca7fcc33ac2f60d89d6d33c61a71a67662943555d859c701672fda6d1b6cafe6bbf2bbdd9b6fe69de2a1bc5a25c24909d54a80d164d3b269aa0fa446d" + }, + { + "tcId": 1945, + "dkm": "13c2761d56797b6e6a68dab36ff1f9d534c74b37a5b4fb5a6efa9df32a1e0fedd5a4053336ebd34706478934ae122da0a4997071291d1cda44edcd431059c8d20bf294f8b47f7c8c550b32495caced7ca3f7f11f149beab9768926e553939f7a0a5ad8c5902506c522ed0f6aca63d0e840c91c7b52da516a7e7db445b0eb4a1f" + }, + { + "tcId": 1946, + "dkm": "c1d384076b10d90cf846b2e6875bbfae1e3a936315032bc8bcda8f71b30472141693889749f038074458c6ea9273eabcb904876bd660c772be49bb749a36171603ac1d06de0eb04e6945628832a686e55ee63cf6a8f6b884f980fa0867d83492c4073fd9bedbb91c7e5bcba1def24de9a001e33a0d37b99258838d65b1ee6b1d" + }, + { + "tcId": 1947, + "dkm": "2823b6ac68caf7864ebe61a917afc0fdaa833dd089f0c0d380997de62ae1cf9082dd839f636b17dfdc809c8b827306e057f7f430a99cd7a779f6a2bf00ee263e1c6f340895876b05ce0c469a9e1d24b70a281b3bc1903fa4cb1acbb6bdfe9d8e4d39c90ed77718948d7a166d4090f851e745b7e4f794e62c1f47620032635b13" + }, + { + "tcId": 1948, + "dkm": "f6019981fc2239b5f460f2ae617fbc9dccfaffbd2631f1f64f2059e09d5969c3dc4974f36ad8204d9f4ac4a1a9f4e9409cf916de84f0809383db78cceaa1c514f37a4ff9d45b4fa1f876ba4d4ad9c07ca04defb5182ef4007c32b8ba0e5726fc66ae6ce21cc20afed5182c1b3a8c2b6fdfb44cc9ceada840263667d6349c0cd8" + }, + { + "tcId": 1949, + "dkm": "27c15a9fae1481d9ad8b61c4e43be25e88f39c1d7681c5bb23a5aa47df72692930376d98d0c6e6be3a54461c554178d1e1e78842e4e429d75e5d4ffa994737d0fdeac294daf742468b2da9a93ca2b1d833f10fa83fa09cd882ad33ce26a8456c507989140a4051796e0a681704019ab521bc05798b7bb80055586bb45ca71f2f" + }, + { + "tcId": 1950, + "dkm": "f543fd32fb63479abaeeb5839a41e7bf1333600e868a6d0e9afcb4ceb9c5455527164e5a8d450837b7efb0d414fcac9dceb413a828957d4bd265739e3c5aab685a3f1a5554bcd396bd323ae17c3b01ee1f1742de298ea2acf0eb57512325db43891d0665d3b07082e9833ed04607446bec53758e11546cd4554d0e29f61b82a5" + } + ] + }, + { + "tgId": 79, + "tests": [ + { + "tcId": 1951, + "dkm": "13eda55dd8c76dce140ba65b5a3cf4c2741e2ea7f9d67034b22d130c42fe50b9ddb7a74b2c7c37fddc06fa966f7c16c5982866ecbc0fe24421e176654850ad34823548d75f60ee7e855eeac0ccd58722b256cafccc44e8473a84e55cb79b420a9a952f80856ed33c7c5cb8e0c09efcc4d27aa37984bb336a00b336829f75ed09" + }, + { + "tcId": 1952, + "dkm": "c6ef1a75bf208c8c1872de3f192fad7d4da93b6d28cf4ca905a5fa43a70d1fb221cb59a3966cdf3f5cea29d0679ae77e043a732f4cc434dd86473f0f761ed475c3839d252bc4f272f5d9b60e37ab6fe89ff8898bb62a1183a996a9307d21da2dcdcd0b3578236df8195bce9df01809da2e0816ade4e9620f70624f3ea5614cb9" + }, + { + "tcId": 1953, + "dkm": "d3c9a1da5dcfefb479118e98be731f8f05ed1cd54a02ff7afb55f506bcf138b270951b8e518e83e97bc653baee428daed312e89d96b128379ac74988353e03c0511e3fa00793d0f44b9bfae9858aea5bcf499ba93ef909b56886ee3f3f1167ef40ec3eac6490e41aaea07915fbdb6d7061a5232da540319980e80a2f7b9c0c3b" + }, + { + "tcId": 1954, + "dkm": "e1e465423be0e10674ca3228fc33749bc4c28f8c210bf49310414219485177d1a76aad4f0bca293ca24a6cde697d90ec3c264f2447b9a37b7d6d3b9bae4254d80cd3d44f75a0617749ba56f4a8b6c13502e4d4fd193067383f520edcb5c53594b5cd9cf6e5e3d1b851c34617abcda75abd26afdb7eeff45284bc4689c7091953" + }, + { + "tcId": 1955, + "dkm": "c9cc7ad52bed240f6d3cb7698fc7eaa77fa4b0c8adddd022abd7c0429bdfc2cb2cee3ef1e494d76d9e5a9d5dc232e24d075066ca65b10224517bacbe882c1d60b0bbf032ca7a4e1cab152e20a2a72bd6ee810019ce9e638f47c0584b30dccac7d4fa70a75f474c31d64de74ac0a2228ee0d93e20e3f2d8c3c3d65b15378798c7" + }, + { + "tcId": 1956, + "dkm": "aa68749bf14561129ccafedc7e6940014b75cedcd3e8977c26ffa0fab57087b3a658ee0b6d5ccfac9a2c94f186b9f9bad1733e3a1d6635262f7c219e225ef6973f4187f8eec33886d44ca615cbb0b48d165be276734073670f5728bceaf6a4811c9a5bfdec3b1794dfefa3cd01de00c865008610878b1385745eaa8aa451e583" + }, + { + "tcId": 1957, + "dkm": "8c1382d7fc7d5f4e80113dfe46f9195c8ee4cce271d7494673ad257a025ae36a35a753a93b1a1340cd3ed4e306a6f23a35a5598062a596aecb42749a04e9b40f93f6d11eb185ba4dddb74c0dc99c4f80572eff468de0fc74727d38f0b32e0826a8ad7b63ccb1ee164eda439adc7d63afa80765d311be41bbba8402dbd79a4108" + }, + { + "tcId": 1958, + "dkm": "5282edf71956c1494afb2df8973f89e0eb7ff4960bdcb447a207e3dde2c9de494ed9aa0c18a71c6c85b97c6af3fe9bf21bafb102434b80fb35f6074575fe525a5e48d19f23c39b0043835e5a241a87d1b67e57fec393572c88aa74a46a2e7c579eb26843c55639139068d71b30b209c4293b61519c62f0a4dbab5b05464952b6" + }, + { + "tcId": 1959, + "dkm": "1d6fba7377b3f9e92af86ae93d1d914327b477b1c515a2e6b99cba611b2fb86df245ee8fd4676bde6b96caf2c23dc92c87afd8b05cbbd40799f8458490eb8045f02c05ca324ee6fe88545d746b363579def6535ac6177a5e9c71f647ad97475853bf7b1f55c41de7087f4b0a7e06716fd18d74da1603d12c9d324757eca4e213" + }, + { + "tcId": 1960, + "dkm": "b471066324fae94e4cdc8286750990f356b70ea8f56b4e45f3fc76f2464ccb438179a7cf3ba297180923aa6d50f11b2ba9f10fdd1fa4bf14adff72989d9cfe18ed23a499ca2e7e736fffb7beb01b842270cd21e2872cf16f6aa7f90bcbf0edcac0def5f3ebadce9a3ff8cc218eb8f37638b7f07475e335959f0b3795751f4a66" + }, + { + "tcId": 1961, + "dkm": "abe2dc8edb4d09e176420d555ed1c2b7e1568fdef054aa051fe8a203b2b8626c109f00ab4f06fe6104c639723bcf209da5e4c244877718e7619fe3b7a5fed2955b0527db319cd50a278f64fc38d2f93d6aefb0ade8a36ae3eff706e3b22ece3959833e6871f7ee97692dcb0571a9a1c149cefb377415ef43198f29b577499e31" + }, + { + "tcId": 1962, + "dkm": "7e1bb050e9e198af595c9a89f011c7d9c50be042f127562945d1156403784c912f945a84e521267438d46329d39970e7d7d9150a962f15a87e24175f1e4e88ad9f00bd906cddd62e0a003517992d5b0c80399046e1d5efeec4859d23b09ef561b50310e0eec0c46c5f42f46d21e8d68c089db64c110a3ee167ec2667c8305e51" + }, + { + "tcId": 1963, + "dkm": "0e7200bdd490895c2e0403f89db3b979685f19f0838e01eeaee603c0c9b6cf24895bcfe6adf54df274caaf1298e76664f9ca6cdc0751b00693ce291d4831941dc6695ee60e67ad0c08c243e2cdd2718a6a96e21a899201496516aaeb35f6ebfb261c0f3e7f0bc17f86d645bc63f180b552b97b10019e5211963828018dc34d72" + }, + { + "tcId": 1964, + "dkm": "1031477f88d57a180f8a348e7317093cbe20a841c727eaeb221e18eec99670e36c32796185c683c78efb6e19f0c65bdaebca9e3432b2c50c18345b503ffa75482fb8f972306fb9c6c37227e11d480b0f6ed2722565c6f95b0874b2d083998f8d09dfcfbbc4e011e6ce5ad8731595cfb08959e96c771117150dd2a4cae5092d15" + }, + { + "tcId": 1965, + "dkm": "9316eb099aa49b3a8b70a80652e37ee031bda739ec1c0f30deb543c39fa649aabc381e38d1287c389345700335b6d55a8775884ca34786265699ceedf4219261909f3264fb598bcf62a3445602c0cb238ba05addb8bb2a97bdbc755553e3c07e93d08800584db2b14f4f80d431f189275eb7e546d81d3b37140a4440be9b3142" + }, + { + "tcId": 1966, + "dkm": "41f7bc454a4c5d12fa5bfb9ff09f9c281b31c11451a12bdc83aa6bee2d7ebd6a09a042506343ae260aa1260a64e288a4ba7a578af5e3a4a6ced845efe19134baac20b63eb9a93b75f15d65356bc73c78bd2317da7281eb1bb13c4c8415850bfbdf0a90512f598241c5894a398089316bcf2fdea214c608753b4dd1ef474fcdd9" + }, + { + "tcId": 1967, + "dkm": "394834c44fd13e10888d2b645c2cf07c1a5bbdfb7d71e6c53eaa728c5dfe47f02e29859727744331a0fe1ab799e5fcdfa39f6378753288055dcb47a5cae06bae363489b88ac6481593b7a5c8d9f18dacb686bbec50d0e6c9d409530dc69f6991164befe085d1d25a03d2e8b061be75874be7fb68d16da729a384326d396c5ef2" + }, + { + "tcId": 1968, + "dkm": "df1790fdcaba5c36cdea400c8e05197deb9a704475c000dcd694b6fc68dcc979d4fe53f5ab7d222c6a8e13852143d5026b5f13950d0f52873e7830728aaa02b9a61d4fd32c075f1d99d46be7dbbe1a2aa4eff1913710d021a26a8fd5ec1cecf1c84a9379dfd0f968a75f82ea5d1d153d6ca723182bab2451be403d09ebe702b4" + }, + { + "tcId": 1969, + "dkm": "126bc5452816adceae1e0c69b30ecb48b4aa9d08a6859609d23f07a0bff252fea85a2b7d2260afef6f74001212c3e49a4f8efcfe419bbc9851f424dddeb0bfffa9211de85f8d401563589493bf63eb968b315a09196eb347533f5237df294f2307bdd8c7d01f375e4586841d75185458f47653309603f577a9b7dff865ef5881" + }, + { + "tcId": 1970, + "dkm": "7340f45b78c1612d32b2678e4c4b654cad0f81f46688b82ac7f597b4a0876bc52be05efc16b4425b84dd748733c244b34567b39f0019530a31149929f0181e2ae4de2bd76183136122b61127073a88d92d2f505fe7d7abecbf26b57e2cb79740b2508625f9810e0881240a83589aca044b5307c17227662dd2160bf790e496a1" + }, + { + "tcId": 1971, + "dkm": "4a76f09d74c2c39e3dcc8384bbaa87f5d80c2020eccc81466a96c580e2d8b57a9d2b0615aa75674df6d84ad14592ec78e8f5d613322edc6070578ea10411843c87278bdcc4594a411f607f9c00cfa8e35ffe0204b39470deb2771fa8e89177188566187f9afed90bfaa8b6377c6ac4b7c94dd074a34fc7def2cb638edb280f4c" + }, + { + "tcId": 1972, + "dkm": "be0e0f7c518835e09d665c9191a72c9f49c6587a81b6ac19a87676148b916008fd0c4719cffa84ebf02a648854172708a0308d355fb99815ce5355e7127f70c7c8dc8ca6d0397f8c3e11e5c30b4042b3e3fee24c2ebb6aca94705d7436e0b00789ce504348c4400457a40543b4b584287f584252804a5060057af1ca7fb0c66e" + }, + { + "tcId": 1973, + "dkm": "6bc07056a872ac022a144b4a2235f0556d397d77a007e7678cbee14b77f6d7e625704529ad9b275771bf766dfb5db7b1ffcd06cd6f1f2504be764a0c980fed3c6eb0fd7ccb2c8d5737e2c7d1b5b6b7d335f267e8e0a5e9688ee212197044473c3745f8f09753f843bda86ea87f456a1b96bd726038646ca5ee5e796826054c57" + }, + { + "tcId": 1974, + "dkm": "22455ec797f47994dc3835b29d4d51265f4648dd52c0cb2ddb79f6756409a59b5a0326260334e853cdec07307891004509f481856a6f177a144043f1233e809d339351b631d9daab3a929c83e6c3c9451982b323ff54f2bd6e0f97a534c77d1ba5f9b649273e94d1d8b641ca45bb9ac603cbaa27c56c5633fb5f0214711a6dcc" + }, + { + "tcId": 1975, + "dkm": "540beb9bb6713e77e74a78631ee094b8bc669c0947dd391e55c7f0c32caaced7ea33966cd8d9367e6675a5d2d25e0193f324a964387878ef9c0462a6aa38791708a364e6b25be19ab832dd107da0919ae7c81e7d27babad01c6bf763cef525c7b2900aac4be0d8e6ccfa617e5d980eacb5e2f20c0c5d3249e13d2de4ad4bbd47" + } + ] + }, + { + "tgId": 80, + "tests": [ + { + "tcId": 1976, + "dkm": "184a2ed4a3f9cfa4cfc66d37972a3b3f7f71389b8a9436ef2adca1baff03da0db86b1ffe258e3280dc5d8495b216d1c77feef3d49261c8eac713af196c65e03b09a5a9b57e89b1c530d34c0ba528c0d82a5adfa1bddb0cefac9ae5f675a6284838fbb9cd31d382a0aacf8d4e6a5ea4d1ba0a3f9ba7a4cfe321dbc499ec43d55b" + }, + { + "tcId": 1977, + "dkm": "42381c35d97140c96ef94fe7cdaccb748da3c68fe5e987ea455651d9c53e1f6d61cc52dca0c9a7924c4abc1f6ce4be748e778520ffebd38aff948d10b36ec4e92ca2cfd8acd732c2d55cb62ca50675060544f2c947bef2971e6746f7ec8a55797e3163b14f97b448b315615fdd6e8d25211355aad4315fbc08cf5db4de674c5e" + }, + { + "tcId": 1978, + "dkm": "590996e732c8bc998b2ef20590f6a2ca862ef6cabaecc8833642294af659db04fdbce7bf3db738612918b970a769156f42b15330b6ec7b93056dc9b12bf4a2e3380ee912ac4c4bf06a1ab76f371785a852444b7f1e1e35d83c4e2b142da8413191bd430f4066601a1c56077fd440ad9d1e1df557a0d90cb788abc8c82164e603" + }, + { + "tcId": 1979, + "dkm": "6754d7d9a296373bb0b9fd9520a901da3fb6a4fd2a9d17deb36217b4644a62f1a26cc8f672f17db76d240bbe22431fb74b051159561f9e730dfb086592f6a03687e51eecea07deac37f993b801053c851c780f40912790b8f250410fcbb875803b66cde1d666948354c3a8c801f315968f58ee0a30fa4160de8e0a65c8dc7102" + }, + { + "tcId": 1980, + "dkm": "eb80c760ee774f989e3e51b8372837ad8e06a96f34567951369dc8fddf1de5e1098b2ab23f72fb4cb8a5dcdde066e8a92431a22751a7c90e60f8383fdd53d1d9004fc38ec2f29592d82c5f91354f029e47220eb2f30688659512221e59c4b440eaed8b6b924c5956bab5cf2ff3a54c74c663d5d2b4844ad86fc827985c13ed13" + }, + { + "tcId": 1981, + "dkm": "b8f627ea13c1633725eae3f0c78e19bdce07dc77afd54eea535dbeae1d6c8e81af88a009f1ea7ec87bfe807790b53b123005c56bd0abe50699525d8802f691c408352376db633613eedfe44af03b0ad4d9322f57967ea9c27254c94da37d1727952a32e1366c83bb39046ee5e7907284da0dfe2585709b878bf0e322b0806efc" + }, + { + "tcId": 1982, + "dkm": "7861ce80995bb9040691ef8ea6a6fe04848afdcf27d97ff56e3bb48d6bb8833767f616aea2fb4b173b3f55ccf8148b35a2a36494235208578f98939ec5754f521bd23aa9d0ca827da18641fd4fc119975af41a228b186811c943742973350681bb0368ace1533916c517dbaf0f0e694d6c61d9246aab5590ce44cdb5ebe22b0a" + }, + { + "tcId": 1983, + "dkm": "5db0e11e04dc635b902ed02b664ca2b7fa659a3372f83c936393d8df2b3ade08746a8858d0f4871a9daf789734de0658cf08a193fb02265a7accfbefb6b8bdf9d8b32b616a02b39d2594394fde7d8e67394af1cfd90145d862012a1f9050b88db135f5ac2771f2cd3a7c4ab414755a58f4906f4240bf4cb87207f538023235af" + }, + { + "tcId": 1984, + "dkm": "0a06ca4a6b9a229aa48f0eb02b61822cc9760be64d66427f212b98500f2876d32ce947eef5fc3791155ba00aa4c17876da9dd9824d3d4871c175221110f77a28857e9418e3e6880e1e3cfa9580aa2ddd0d814427e87446a95f15f96cbc99902b8df4a3a5f5d97965629ecbda3bbf8705e788d856b700853499b66db83c5bd502" + }, + { + "tcId": 1985, + "dkm": "37352300734c6d494a3489cdcc47f0845e294e2fa28381da45132d06574bf85bfc2c5b3d3664c3a9843046670b2f7fa05dea83109caa14c1cf926831c2f58c5d2962a6e92a837fa68d0cd26f5e08223da40ef3cc7f8526017c206215b4b03bba666e642b68440d86e41e88a255a3e7bed62f4e37382939b2f8128f1d6317775d" + }, + { + "tcId": 1986, + "dkm": "61be8c90b6c368b5462d06d2aaa7fa70d01109ba39bcc4dcdfe5d078290e95a66c4bade5847057bacac89b7e99c78b2789747cda9f9defdb58eb625a555709e80c3ef64d10ad9aa7aa2a3928aa8f8434918aa5f1e42f3c194c76a3c99e25a05e5c9ee2500bed76ed498ef84587a0acce66733b4e02bb56ddc824c09df38e800d" + }, + { + "tcId": 1987, + "dkm": "b1c9e08f5e443f5dd7e57d4a86296fc00e6e209af6b875245805b57ace3ad67cca262300f36feac04ed8bf56176606ee99b9fde23664eccb92d724710ad4a0a5785ca185646eaedf85dfa2af2a3ddbddb4f3550727f483866dfcf171a0f25f3f9f0022af83918dcc6dab95865700e66b6b2313435508cb90c17eaff9f90da168" + }, + { + "tcId": 1988, + "dkm": "4ca6bd72dafbe2a23b059a1a37037154ce423c66c3dbac7d5487acde71cea360cdf3e8e812529d91d4febbd7aa89c38ccb41ebcd1e6b619dfd6fbcb13b458ec407e98ae973a5c3d15f10c93ca8de44f6d2f92ea05317164e7d865a92987025f9a6f3542e61e8b7cb06cc90d303e80d2bd3a53a231611b789264aa2cdff075e67" + }, + { + "tcId": 1989, + "dkm": "da5aad8b445fadb119821aacc87f485358753ec9c588c96a67a04410861a6418efb011678d143babbfbd5f18f1785a08b2b410376aad737b9a61c0fc8164f3133a243dd813fdd11fdcd3d69bfd755b8930855f97354269e951c3858e674fcd67c77284a5d265e6569cea87155b7752e4677802bbb1208d2dedc48c4cffb09c80" + }, + { + "tcId": 1990, + "dkm": "0ca21d003f2baa467ccf3e1b8e9e72ff4543863cecfbe7e6a824192209f75ef88592487f32f0ca4a5ae28556468dd43b99933009a26203ebb47a5bf24f429ea978443162e17342cc29fcbcbd049f1cc46e6be0c9ff147f380d012088523e880cd094bde87eb5d92d4aec6145295db5ccea0ac68e3f7a3ed0806a859bae5d8cf0" + }, + { + "tcId": 1991, + "dkm": "125f4b8801b6b55d71588349a7b93a9c9a3e72692b81adb4556fcf45956b40f1832c4a2c9ecf1ee0c5391417080826c05bd1766670a818272c75a5a8248b9d884b5b71c0f6759f38248e4b7845031b92c00ec4557db53924c517b75275cfd962110f43d160839fd085a25a659a2c077e86dee31008c330028388139212271f87" + }, + { + "tcId": 1992, + "dkm": "70a63b577965b5395e966f16a18a5514921c251715fc76f79aaf01ff24f515c7c2a6bfc2bc25e971ccbeca2f0735026c45e64b93db1821e53c8c0a1265d67440f808ed2035712a03b715452a8979494b2eed9bb1ff93fef3419b985f008f7d49aa53639a5e2d03009a11e4556ea5fc88cac884c145e4e52588d8bec67b173cda" + }, + { + "tcId": 1993, + "dkm": "996d56e5bd07a8c180ac166ff66cc9e7b35a6c911a17e6be6ac1438135fa371c59da7fc028b9f417d017a81b2b92fca14eb647710cd099bdbd1ecf3fc9bfe228917c93d1439feebed0f50c062f8ac73d907cddcf46f8f1e172ece644a9f568abf83457601ea9fd5f7cc9212e10daa47e01ca0e04061a0811a6200b06ca1940d7" + }, + { + "tcId": 1994, + "dkm": "4e6dbe312f24f977d36288244cad5667b6c4ff98bb3bfcc03e3e160e79cd5885c29454e4b26029df84bb8a36893d15f521b557e22f8d0c3bbd7eb562a818c4796b27c716742d6ce69e40e1f88661482a1744b594bbeb751762ecb65ad79f60defda72f9840eb613c97dd0d41d7955959fe750d40df65eb7fd840b3ba237b8396" + }, + { + "tcId": 1995, + "dkm": "d463cf31be06fedc50e3d7eefcd897ab1f9c7642468cfc8cde06ce1de38698979b8c101684e6086af154f120c72a7395dda9d875de1f0cb4adc33fb6d4a911b90bd79cd588f5237b93566ed70543bcc9c766ee64a20b6439b863c2cde5efdd3f266ab4328836ccf0994ff16ef8d02d99fc972592eb51900e2cc7a509a34f52e7" + }, + { + "tcId": 1996, + "dkm": "ae6aca2fea6394295041caf01bea449e69432f74102de17fd75ad7e299b77f1b69c9d146802e256b5a8b19fa0a74003ea1058df00f32047c8f369380a447e9b2877d6ee90d0dc09cde00f8b90c4697a07844d5a4a04953cc70ebad705f82a740fefda74772cc252d5adeb5453b2f6e8944cd732c627a3316d233f960df834d42" + }, + { + "tcId": 1997, + "dkm": "91f2d125874085312d9744141683e5ae0b986f8d108dff397fe2d807d6cf189a47d5dab4b536f7e5080b6e11f26982ca2bb10b750e455f3677952d215115d34aa605f8549b4290e2bb52e2edee95deb3ae4f316251ded7b0cce3b08b70c9ed428ee37dd84511858265142d7730662988d39acd972b28543c708a127231bd4914" + }, + { + "tcId": 1998, + "dkm": "9b728b55b532b4cbd60d47d1238f68eca4356e6649520f7750f9ae3459937a903dfc3caeca66a18f2d615d2b438d17ad9817840ccb1de8a8b382aa13689fbe568f1dcd4c1330a7fc2525e7bffa076457aa5eeeda1048752841ad4996cd495947955dc4a0ef471267b00567a659c4b93a69a263cacacf0d278f3ddf4a54481d53" + }, + { + "tcId": 1999, + "dkm": "7f88360fa7c124b078745a6d70714f7113dcea226e1360d0b5d8b6b896bce1dfd0eb9fbcc894a7c0c5d48c1b174e3f8b909b43c13b3061884182888b65a623b1cc021ff35bdf575f87e6c33247a1bca24cfc26322e12e2c80805f6c49b62ce6adde9eb2d22b742e666393fc707af23344ff337da04ce1ac9740820c263d02315" + }, + { + "tcId": 2000, + "dkm": "605bfb2485c97f7568a7dd3d33f67f2f5f3f7e61086e344a516e56bbba2c172815de08c8b506c59743f976a5a58ddaf06c7be96d844591a29c1b401e76ccf77bf58f32c32fd88f6bce854916d59e7f3400cb6c1f31ad3c4eed24d37166f197c9f8bed47d3300e68d235d204322c83964c28e2e02142a80037d5e72338c20bbb0" + } + ] + }, + { + "tgId": 81, + "tests": [ + { + "tcId": 2001, + "dkm": "f867bf613dbbf4236f0702a9b6821f66265723bf8c6871e4109666c6085042d865303c2a9168f7240dd916adf7e1b668d819150ca1ea7ab501b6fa2bc4c7e0de7a047ff4affaef54ae420721f506d4be43afd0baafca3a286343f09d4cd69887e2d5171dfa4be0084cd8f7ef5ce2551e31078c1d4265029abd29106059470fe9" + }, + { + "tcId": 2002, + "dkm": "24362d09e1e89702be50f0b156b9d9795c1bf2fcbe6caf99db54eb88a1fbd2eed323fd396b94eb8fa786b3533e3fa2b9bcfb705068b465fe7d2639187e7b7512b3a49609bb9030fefca42962a436ae032c27bab147254cfc7f3615ae96d8d6d71ffa6875c6f10251d636ba97d2fb9ffe74de5c8dad389e03b0f4f7ed7896eeec" + }, + { + "tcId": 2003, + "dkm": "e9fef5e7eee22b2124516dcf26913af50c667fb3ed1ce0fd513a18b5c6c3703c78ab2cfbbcca3ef0cef9b2c582d09a6c763e1f1993331e47afa8057a90d81c0649bfd0be1b4da63481cf88fb70f4f4d9c8b007bbb940e95fa904f86c596636ef221d0808e01ce961e09361e4998b9184e62308960580b3952b0ae0c1e80fe1c6" + }, + { + "tcId": 2004, + "dkm": "a4aeb2e4b79de89bcc0b8be53439d6f381c72c4b11d7848b1bbb53b5d7a2d961c5c63bd5d6c923881e018f476a03a9522bf281e0d696dc28f4db6e6d3b12b58a5b09354c29fea16c17afb6be1bc8917e6e6fad4d5265e0db14efb8f371f1f25707ce87782ccb4aed030018e4944863a80385a24ba542039f510c46bb1fa26a81" + }, + { + "tcId": 2005, + "dkm": "1ae9ccdd64a6483eb494587a7e05f85b642898b41c8d2c3b468596733423fcffb03ade7e169a732e451665d111427c7211b4fd00d8cdd430af249f1d91d29f206613a062eb9bc6adec2767a507b23ad417ac7368710ead49056e6ca1e07138a2e8657fb8bc2d03eb09993907fdc9a6c1de3fffa56d57b7f2232931788d363423" + }, + { + "tcId": 2006, + "dkm": "ecead770b7cf8cd98456b03f50b20ad8f2ae79e12a19cb30bb31425cbf0d2cccc329c65399f18b9a34439e4eb219da3c5c049297c3a14212c1b24e5d3312f3f06f78d99d691fa56d8e69687369ae8abe1fd03d8c5c164b89821f63dd495bc6abd87fcd0cbf11cde1432d3b86d2999b868dfbeda0be6cb34c33c8c793b22c35b0" + }, + { + "tcId": 2007, + "dkm": "13472463bb09aad6a09fd03f0c1f56bb2cc259c3069cb137dd3f463cd647f5ab1899d1d2364bbc62a1abbb1750686bd6ffa3606917daf2894feb0a0e37322207a3e836dd351d9ea86abfd6b060bcd5888e4382ee81708645e7b12f08321581f68fba98b91e5f56581042f192dfd8d75dbb9c84dbaeb1f723938e6f9f9a5532b3" + }, + { + "tcId": 2008, + "dkm": "3cc96f37cd1a8c9c928f8a9adcf3ff4f440d0db4231ad744b9fc49054c83bebf19c1d96f4ddd54d9f8802888720bbc1ba32c3b80e116e5ba93589e8b9825de0078691e23150d4c94b9f4117d743859465aa0b085bef8e6e63bcfb1a1f6d6673351cb4646c6cc9f5527f4846e3cef6f20c48ba5363a14f313a681f7b6942d02a6" + }, + { + "tcId": 2009, + "dkm": "06d7095b82e433ff8107d2e82d6b13de8a4ab5dde4d7d4ef973fc8eb185d21301d4ae72594076656747a8440d0a8222c88fc12fae8e0f0baee074ff8a58185457007c7475ff432ec01ab9e1f9f0c932c3fa804e09540a8167d5f3a65652123b1ede7fa6381f7332e259c5558c05042f756a413e2b6dc61ce062daabecb455fee" + }, + { + "tcId": 2010, + "dkm": "af7beb71121fa6a9bd38a9d2fb69e5914a42177b5f207062e7d51a84ebcd8b0bfed47120c5f4b628c6acfab18d2f8ed184a77da3788572d0be6e2dc64e8547ad2f72d464ed0b6cdeb3a6994661cd49bb2e0ce361b6cba4e4ce8c68b1e4b81915fddfe88e5e4e2d552b31e44db1b4a1282933ddf66941ebae5ef300aa9ff8f7d5" + }, + { + "tcId": 2011, + "dkm": "87f8127655297da0ed275f3c65cebc3485745f98499ed5ff94167b61ecdd11c2dcc7ed4891d1a55bf158bbbb8f5d494a00b4b64ed5b7bac21ddbcd5ba0368a137d09f47827d4a7f372e7a56e444f744699feca83edb534ecfe533cab51a21a9fac8fa5b19fb96d2c752f0a4fac0aadc51bdc10484d723e518b6b52ecd3f5c5d1" + }, + { + "tcId": 2012, + "dkm": "2bf50059e6fd186980256239b7cbfcb5d900e61e8f357ff5ea72db2093c37f03f6d01747c7fa93b2473eef83e0e33a8aab23193fb91f67231a2a819ce5f4b7b52c70afc64422b76b72f45c5ff4e26ce45c2b584f8958b4bcb7088c40bfafb740dc7a9fe7c9f93f2aa8d9f5c9605637613070baead2561fbcc10741e772aa4e04" + }, + { + "tcId": 2013, + "dkm": "fdf2e3aff02ac08bf5e6c2612df00a8a0c5c57e081d981550944defb1968dc39b39b28023f8b9e32e5a4d79351d3c0b947f09357e500c58e37bf7895f245ed523353bf1fd42233efcae0bd5ff66722245a584ef72772301a5d2e7e018718a8da717a7eebb049bfc3b858889412ab57006ddf1b434f150f38caf1c2814f52fb2f" + }, + { + "tcId": 2014, + "dkm": "6ab3e7dcbcc95d39cae6b6412981b87563cef782b5909c9107e3f65fab2512f34c0114d894f38ba3c37805108a4c4dc6a2cd10c1cb719570fcc062cd5391b150319bd127247b6ef7a686c992842cc8da0ce2e3523cc507ea7bcbee8641ee15b01125ef8108b05b352464349eee27774c5d5a778399a6fecb7e126266863442e9" + }, + { + "tcId": 2015, + "dkm": "fd1e329f43c062255617241707704333e39dfe986ced604429986e197af88696dd00e9aba018072f97256507795ff14242c0d194378bdb557a1c72dd26f5fab3b0adca3d48e7e88dfcc3aaa8c4b187ba10bb36f0cacc5535636b4f4c956a933652342be90ea8fd04025177e81f7b28d8df8625071844940daf555951378444a0" + }, + { + "tcId": 2016, + "dkm": "44223a1a47bb0af3267f6469fa74a7c29f64388418aba2cad2e2c3ef11dda7b7688ede3dab0b6cb63ec992b60ccc6ffdb083d1812a7dfbfaee192708cd5cdceb6f75460c1a6893d7595d491f31193ea0b524c3485f49c34a6a38230e98ca7ccb39dcb59fe93bc52d33c9d2cc4bd917a59b881dadb01b0077ec5a9b8a6ec1f838" + }, + { + "tcId": 2017, + "dkm": "743d6ea5961eeede6f5a750f832414cf477e0cfea3c54e053e1f6484f23f72cfe90f6faef0220e666e5fab5c69ee298376a052629f2cc06b538fd008d2eefa719be5ed9278d9527310aa209d5c0b8ea4179e1db8b4c4990bf13270dea91f4e2497a7d099233a06a6eb485a46052f6e8cb56eb394454f1e02e204843e734ae2d1" + }, + { + "tcId": 2018, + "dkm": "cb68e215ee89aaa1f4e44989588bcc3a5d8ccc60412bb56d81c8abc4cf2c54a6fd924fbfd44e4e9df517496498f553bc33bac31cbeaf6c03624b2b3d1794b5d95023f55696eec89aa0965f1c699bf20d03decb6fe190e81f1e78eb26e2d22db4b29f58220d6f1c5305099262d7630edbcab971157b36ca1d8381fb7d7939cc00" + }, + { + "tcId": 2019, + "dkm": "c8432703abfcd7be42abc8ac4791857021231402db35a53c6386b36364c15ae5612ed76f7b4411a6063d0806252b25341a6a42330301e72bd4d989f99701cfd41c3e9a3f7d021db0d326bbb8e59d33316366f84fb71552903e8e29b8292ba8ec1f1a6eefe6d674e11b597877786aa5a31ad01aac48189ac786c71488a4a108fe" + }, + { + "tcId": 2020, + "dkm": "e5a355b88e500b39539eb6d8ea18c9f1dad4e5bcc8c1c2f078fab4ecbce5a5d590ca6da16f81c0686379e143abe651908e107d7936fdf8fbb311bf0974729da4d62902b5f866f40dff4237862d8e6ae8566f714ea4d4b2c2ef0a604f9249a2582a8c484fd19fb27d1179de95b154d9a1ea70aa191f8e3b357bb1e56b439921d8" + }, + { + "tcId": 2021, + "dkm": "e2e36ba977890726a2a78c29c55aa055418fec4ac6ce3162eaee2a74f3c9f3e0d42f4d051134e46b2cdbb03a82516854ad0a1800685b0092d386edca8fc6a0308e08d85106af07342221e2950fda04986387a226543240381fe0562872fa3fe442e8dafd2c2a758846a3935198ccba96d744ebb2f8731d9c878b10060aee3b39" + }, + { + "tcId": 2022, + "dkm": "db59068cac4f1926fb11f0a3a76d345ceaecce9d20b273ed74835e087bf3d533218801b51eb4784c7b8c2231070dfa7830925e3cd9078f1aebe9e7cfd8a874f5001da7a25c3229f095ae5f068eeeb8aa79aef2f136e719a54e974bf238c756e3aa64fe1e7cc47c149c03ea10b5cb672bcf2589f00371f2824c79be2e26eb2073" + }, + { + "tcId": 2023, + "dkm": "5a6eacae91e9db5b6614ad3c7ec0624a14a5042a899452acfbe07da3cd9859f475cd29be91494eea152d1f55d9539d4b46d092182f6490a201e9091de7b1ec087ec17548b5f8486e715abd02991089ea63350c342f1082a6d5a57eeda2f7d16fb9fad5a7245ea6046736edca84704ba5579ec5c3b02df6e56e1a8f36b63ce617" + }, + { + "tcId": 2024, + "dkm": "8cd4bfeec799cc7992ec99a0476f4121a78d7400e4052c5bbce99843df899eb1e464adb28d33f8604ab55972700dd8ad9a598f56cc45fadad0ce6fd33b59a52464054ec71ecc1bea19f8885e10e5e14ae9865e629993b173023dc6a6927852fb5e8b1e87118f3defb2bbd21e69122d87aca2e521a3638cde110525598eac538a" + }, + { + "tcId": 2025, + "dkm": "a18eeb9351235a51ba685499f1ef253079be2539b475886b9f3026cff1c882f4655949d3398cdac61339e4d6ebb04d378d52699c625b0255ec156ddf9e46ea4069c5cfc3d2b9fc8823ab54b0f37c85f5bf084e363ddab0221c24da639dfe317243b7f70995efd7391f6f57d0334d63cae6afb47a05e4136cf043a9b6f5f01bfe" + } + ] + }, + { + "tgId": 82, + "tests": [ + { + "tcId": 2026, + "dkm": "2277046c8043126ed9efba39ac73ca024d21ac2944a0251949558fcdc54236f7dd12a5007cedf47985de86dee142e3fd1ffea360eb09a68e847d0f622222ba29b013c075d22869af03859c179a36bf6c637759d82a1034091f1b6912170c1834f8d8352ceea73bc4e1adda73cb794ddfa95053835bb114b430a8956a1257464d" + }, + { + "tcId": 2027, + "dkm": "97528d8821418b4a3a2db60404c7038b324b91ec961637b3d6e4f408654a1b2a83958fc93ae1b841bd3945f73b99ce1319117943d553d688f2df15456234ad100d31a41a0a7651639033100d71a2e2d429e887a25f40954a00f021c293ed432883985896aa313df0456bdb618da78fb796ff00c899e0388328dd0527d8fd3f93" + }, + { + "tcId": 2028, + "dkm": "780d780b128a20b1fb28103820114bebff737bd2d206950cc893edf7910672aa0057aaf870713f2af82357aecc9b1d4144a3fe24b1d2c82a68b45d010b268f59a30c03137745ed3ecc43d8d0936e8ff4facdaa0821fbd57e9400089bb21f7fda4822bfce42fe979913052c493436bf0840301768a3d2b9ccd3b55b60d852adc8" + }, + { + "tcId": 2029, + "dkm": "91547596afdc802881f18c85678bb4c00b51aef78edb142d861f1be4eddd811357b2ee5c732dae57e8acd54baed65fbc7c15d9d0b83c26bf7b2355561b5a38f7dde2127f07d4e394b5c64fcf30af77bcab06ce17c70de825d1d961b65430a24c1c62debea5369cb9875dd2e90362301f3ff7e73237734949d758ad3226921968" + }, + { + "tcId": 2030, + "dkm": "a3b98229d2bd76631e102630aa92bf70adce265d7fd726338d1dd2f87c649dbd2505d4c10444e9b7f43057f456a08d9be1684eb61173a33d5d12c1f07d7edcb62c165b918f53f9cfa05294a5448be316e311158ad817d664ccebb8f2143d17a7a192649db9d971134cacc11c2b657674dd50b3d21f27e068b4d16b09cb7ce854" + }, + { + "tcId": 2031, + "dkm": "bd61509c1279db5cc6f332a255afdd84eb1d123e6b435d749413255ef2334a52e528065415b3794beaccba06310fad21e95e069271e27247c9653109d262a4f1e5346af254547b39ca230fdb1abcfbeb77b526e0258a9db36ea42e003f7bc4b2eaa3a32290b367c9482ac1676aee874e54a271f81104dc22077c76100e364b45" + }, + { + "tcId": 2032, + "dkm": "1f750ccfdaaa379ed23d9a82688baadb8d28f593a28719242bdf1ac9b474b0fa075e14690c0fadf9aa6decfee6de6c356b8a088263e664848e58291b6daaa3c2f6feeb229b8caf72b703111273000773bc8074abb3985b69f45644d4b64a6715821caaa1234c12bb0e2b9c749c7b9ced1a956ab6464dfb916ac61365a1b751e2" + }, + { + "tcId": 2033, + "dkm": "0661db5a1942e9d724e4a403e9b42586f6b562f2ba38c2fe4c88da356fcecd5fe47cafc882b6fc1d49a9730f3d0571b50557c2db784cf27c22b741e677d5710d08e968ab7df210800f6893a845e8c32eb571132a0dc11ab49a56ce38a53ae4057723940d3fb1d333daadbb92028f15f9a8164fd94aa3da66418b0780cbbb7818" + }, + { + "tcId": 2034, + "dkm": "ebf0d12a0301a7a11c19e9ccd6605f9e47afd2b85c2278bf69aa8a7f80bbf3dbbaf47c359b29f2a8a7eeb893cb211b809d9c13e389f551d068325f06f836ead120df4a1b4dcfc787a6035ae5d51de4b1e0337d23c83fcd7a3081fbe85e47fa1297573214c0c46afd5f4cfb04c58fd41d188c8e3a981c92e4ea4868b50f481096" + }, + { + "tcId": 2035, + "dkm": "66c40faaea24a0cea20060683d0d7b8771e9d9be9fc14b8541fc15547a8aeb718c05fa961a1eeb48900a9f63251ef9fa081cb821b22008086fa4830f62c1279a12a141db95f0a060c378755eaeb0206a1e4f321055366f4817c02424fc92fc12754583d90179bf998c4db9fcb3fc33110a7ff355084481ce0097bb3876a08c4a" + }, + { + "tcId": 2036, + "dkm": "0acde0495b8af48656b207ffb922a44c8c88cc9636746126c45bd934b914282f9d9a8bfaa8946ac389be1f47f01f7495ad470500daa5ba79ddf5c7594ecbc944522a82ccaaf3ef2574977524ecde93323fdbbba4529b6278d56c65171ee4936605600f192f4257c771a47420cdef82e7aae8f5d878245a40540cc56c92a7f0bc" + }, + { + "tcId": 2037, + "dkm": "debe11e577ffb262694458e8c9836411edcb90fa64fdd79771de69e9b85b62704bed1d1f7b64286793058c6d528eb25dfea0c7a8c1fa4954c6d014ab6749c451a64efcef7807b4bd67df52587012bada12458d0a07160d3052b163e1e97b078041e3ad477dd0284e867a7338a09109109682bc7ac2f72e369d9eaa17e1923d8e" + }, + { + "tcId": 2038, + "dkm": "4af49a50c6abb86e7a1b1d96e92c4eba8d5726388e957cad35f44e1996a93353583a9fccdbd6b027890af279654dd95433a49c03a9874cb92a4d7e86a8f8befb5403f4f1356bb5173d3ebe2ab62cafa5512b88378952c70d58483a3da0ebc612a24ac93640a0c1d1b8b77b530a0f680bb11f4ab852dd841f9ea9c613cbdec8c7" + }, + { + "tcId": 2039, + "dkm": "ef6d31abbe4dde616ba2ea9a5cc9c2320da370254afcef4585ff57b2686c3c21a534687735c7addbd3af5c1a914682884edcc170be4f3d74f7968cb54a9df833cdb089cfacdc4930d93b7be71226152d66f306ba807a2979de9989c7e0dbe1fe4cb4a8719b92c293f4a49a1d02608664813ee594bd41e683cbd575c9b2aa2def" + }, + { + "tcId": 2040, + "dkm": "efbe5022cc21ce8fc152d258363eaf00215d2c9142ff807fc17303ef0f071011d570c27690d0a2886a94175be3844bc00ddf4843c743cc05b4eceaf1dc70c890441efd6d3c4bca98a4d4adc37ba1e17e3f2f681c086c52f5fbc2a09f2755b56075ca4dcb7bf747ce3ab09effdc1bea0e14abd84a9ea93268cecc6d3e7a2ae959" + }, + { + "tcId": 2041, + "dkm": "35c606e1f040179508aa759cb4ddfe3006b0e231efff3071dd5ac5738faf105090cc997166530b08221747b9fc887a4a5779e3d0f9eade12b9515cd3e327fa0aff6a1e748fd4dedebd64a31588e21cab47fcccd67a7967dc49449c858f6c3064dbfbe180852bc12e7dda83ab078b6f9f4968aca763a3dab8f294aef500727e76" + }, + { + "tcId": 2042, + "dkm": "b5d8e91f779a3ca4bef8e45a7740d3767fc617675aa59fa62ce76edad12a55f45363b8b856bb51c2ba0744c3d750562f91484744ff54de21dd3acd4a4ca683a66643e6921adcd54239598d3dc163e6c67257983c09478a695539c1416e5b19432124080ec78523be91837af00f0f8b57c64f9a76d387cae279c3665646f1a1af" + }, + { + "tcId": 2043, + "dkm": "93e0063c30570bef82797d904e0680930b02ddb4de4f47af7dd5f6ebe382c0e7016f726464ec5e9c955978768abf422168ab95bb10cfc81aab0364e5eee7c8a4b9e3702c624a01b5865aef02ebb5351204c55aa013fd082eaf86801adc5053da57a9fcd3a0366781321a3aadaed4a54a7915ad7609a55464eb3eaefbc815d726" + }, + { + "tcId": 2044, + "dkm": "6a7fec82ed7c06420b743ef615ade67de6a61410b9d2a5f45ea0d165c558f30becdb269b95650bd9b415c86c253b2238a2620cdbfefa40041c5fdba6bb1e8d9fd306537f71792e2824576e1a4f16db633451916d1359f3ac169b300183e8809b08c486bbc3854091249cb5496ae064f123a8b19a19d90835ad4759c668301718" + }, + { + "tcId": 2045, + "dkm": "a341ccc3fa4c84f83b014c23fcdd88b68737d900474ac70f19134831b1f60e6e7fe68f4b9fdc40dbf34ac4de92ee4013f112f9128478a9749a95c1b8df040c0adbb8aed3ea780dbbbc49af0747398a6335180e62a8dd0f97bd1e99e62ebe9618784ee4be0ace802a90190f36251abdebf96a9004aa9070dbd19f43fc0e06ae9d" + }, + { + "tcId": 2046, + "dkm": "797c7a8839e33bc71284d4f37ec8ba43b0a81826abfebc63ae0c48034462bd0a285b0dcc0451977a7f03109f9d36302640022bfce7e4bf5870c43a2971e07547ca5c5556b63eda8eef13dc900974d1134088852b9b34158c959fb89746d276004892debaada65afde93fa4f1426c72bf69d9c3fa203e3991a2760a5930fdf2d2" + }, + { + "tcId": 2047, + "dkm": "aca2ed5e3037294894c6fdff38732f9918cf056d4c58ec7d2e9faaae17f95ca4e052f78aa3ad17b606934e2b586bc83790ec2c3030fa1631a90b4aa2f7f55da64b32a5e4a9e632f9120d8fe9c231d419dcf9f049bdcee35ab07e5cd5e2dbcc423401fe850667c0039748286bf7d6ed1df81c049f14cd040dd07f66360a264196" + }, + { + "tcId": 2048, + "dkm": "8dd8c1e80824039726c7a837c539c2ecf40808db272da892768775135bc990e86f19cb2613d0b411595fcfa21cd5692ed66be397138abc78f222e44ae6389cb8d598fd99db137d528657d666c30768cf8202c86521411a51875ed4fed52015b2c825a1e4ae9dfcaa1b57b59fcef86c79f6b7bd3241c5de272ac61153a681ed2a" + }, + { + "tcId": 2049, + "dkm": "af8b77a9ac5b1db45483e2ef880bf6d31f8860cc0e11353b5cb76556cf4863b8685f76dfe6a7beb09e3fe040e29ab73cfb93769456c26d45a315ff584b39c8a0065ff695d6c8384e453200bcc7014baef963a9b18cd2875f8107fcb365acdf15d15a5c8b7f2225f5a77ac51d43618b9d0be1bfbf9e7f81f3a92c4914ad7ef446" + }, + { + "tcId": 2050, + "dkm": "69bbf9af84a58d24b5085cc382d3c245778dc095aa5cb24500f3ea130dab2c2234936fc94854a15c3f07e13f04aa95df76675dcdf9f01dc083328476bd9900e17718ee81949964c1a1a82ea54b1deab1d7ec4538544b5aa9c4c717e624a9d133b6ab78a3b063c51ad5f355c2a1fcc0c3f2b3e0246bf7c7216fdedf771b386f44" + } + ] + }, + { + "tgId": 83, + "tests": [ + { + "tcId": 2051, + "dkm": "ab7cab30b59644e925abc570431526c5bfcd20ac1fdeb755745c19671ef0689f1538da49c6c2233a6343554579a8bd2211d9d9cd7539bdee53031b97016e5603620c877c401f865b313b68f4551a7e0d92e3611f02521033c91fc7475c585e3d0db4de70314c2803bc68e1cc3354493437f0b1619a40ea028cafcf6fdb4f501d" + }, + { + "tcId": 2052, + "dkm": "7a788c9d1aa121eee153683c8a2bed040dc0410590457da81103ef1105e98ada2590b389c9e553f74d228d8eb51e57c25ca9cbb4cf4a6d7e375f220cc1f4e6de7d30009839399a375fe461795187aeeb66cc4898bab726c0b7a33f813af1362fc47f7423b1c7d6f3b1f005f1b97e0c09f1f1d6fb80032c43b85cc75aef952a76" + }, + { + "tcId": 2053, + "dkm": "7fab36611eb32edec4367e563345803f05c35001d39cd751618bde3582a0c770e00fa011b38e67774c8590bb60a22b38ca1722f111791df8e22853441bb9ba7adffa945527feb4a160bcc516ef341b78a22e1c50ace05502aeca4ec7490076f57f1243e08a6b4ea190ffe83ea0e8253b11022cc62855151a3533e684dac6e43f" + }, + { + "tcId": 2054, + "dkm": "2988399a7e1828f33a61cf1cc31c632c7c3452085ef2ed5a9eb7e47a8a27d29d985db8b30bf1a7d2e09e04c4f428b97a1d15dff96ee81a850c8c0d3c8aaad7281135e32107edb1076273b9e99090f1524ab924d74a2c9ec5ea9354d33b28b121c3fc5dba3ce9d630f29b873b8222ed131809e9af841900de799b782d09e0b035" + }, + { + "tcId": 2055, + "dkm": "03920a4cfbbd19acd5a201eb80c78aa295ec9fce0b4ad55a707989f5d10dd46cbe11a860cec14e4b860e35d999a9deeac2fde432c3b5c1e2c8c56ee801e45577746e6baf68193545c17b0327b561e1b13102ffb84ca297606b8583af9b5ca98cf1ff6eafe565e54f2912572c7c9ad4ca0ec11a76d7b4ec25e20096c8e8339096" + }, + { + "tcId": 2056, + "dkm": "5d839ef731a91295b05c8eca198856741b958e9fdca7faf37a8797403071245789dfde2463c16dd7b0f04f6db9496992c4cbb2381fa6109a3d17cd74d44ced66cbc744a258044fcab987455a4fe3fd0bcf498f08b48b2766deb050cdd2b95435e2502b3daf470de44ca4a273371919b77bb46f126f8c238bfe2c0cea96995b2c" + }, + { + "tcId": 2057, + "dkm": "30f9c4047381ea075fd0bf1b8cf3e4032028482aced6779852041d3707d6570e36517f7f75c5055dd890fe12210ec0aad8c42aa178ad660f5e83b0db2e1d1b36472db1bc578b0f7a40f0ccd07fd03cbb0d0844b9fa505c0ff8fc069c25573462d514494a7f532bdd7f9f03b34c7ed22759fde9c7d95fef63c4e5ab80b88c9ce5" + }, + { + "tcId": 2058, + "dkm": "599943bc366fe2716f172200f7818715484a8b9deca644fa38c8ba52e2e003fe5a1de0ed47c53b431dc25b8b822b9e835b1fa3eb72cbe5c37acda3c3c04ec49c582dae9f607d1f69de6653d1f4096319abe72668bcb263fcdc050516318ec39481bf72b8812e7617f5840f89f91bdb11429b6739ab391b0e654a1e0029803535" + }, + { + "tcId": 2059, + "dkm": "3b971814a6327f8922daad61cd3965cbec353c29a7232badb7bbf5adfca2066f28a11eef0b9827ec3ff9126c743e6230c923ffc0982d501dba283e664b33b9bfa4c0902edeee15f3ce558cda862c7aeb6a15514944e71a51858f765df17f7cc3750eb64753165749561737dbac99a299b01bc7bc5f61802dfa1db04c568c8b42" + }, + { + "tcId": 2060, + "dkm": "1a2e12ab28621b71e524e67dcda9476bbbc583adeed9d909f2a717a6a1951538f6b92827355c06dacbe6ba2561230f0c609fa1cd8daaa03270288cfd4df93db13a270352891cecc7edb8c58c2146405a01fa26374f4ab6fd236f2bf5206a726424961d272fdfdfed379c75691a993c1f0d800861ac4cb83be448950daa672166" + }, + { + "tcId": 2061, + "dkm": "11de576f5bfb90400eface0fc566ef2fb9858af6c1402f64974254a9311bb82916912da4363377f2aa1bf175d5b461049069ded88f6f3119c22afc0847cf085b34d55a7e0469268930e9bc5c02468e726dad300d25c0a20cce9feebe38bcb55cac1f762aef6b031f2a8e555510fd6d348df5a959fa60298fe8bf9c5b0aee2410" + }, + { + "tcId": 2062, + "dkm": "38f06098557d141fcc23b0e9c35ee66707f725169f37e11cf6d0f7ace78852f2e2911eba473f9aa555519b7878e2802e7a3b3edde0b702809eaa9292c780174fb885986ec36b775cf818dac2d5eb01f9a0208cbd327b10655887fed3f63c58db47fcf924a2687412d35b625c14e83dc51bd8309736a7eb8274f1a9f4185323e1" + }, + { + "tcId": 2063, + "dkm": "a243bb03780eefe08d7c47fc17a6a0de250a5d713a3ecf3b68c4b199180dba9a9f33a6276977db13971ea8a644f41d778149b88613f07e397393ee08aa93a20889f72000973d64de268bcd09bb15295f0a3893507f662bec38918084b2521ff299c1ece384953601f87f891b552ad84cacc63dd9594f1b0fbf34851abc260638" + }, + { + "tcId": 2064, + "dkm": "dbabdf41b48f3f821653bd8fd14238d696272f6e39c5449cad4cf623ab0165b6426b22869e759b08871087c314b62ea31541f9f4d1cd5114635712bb6d8cb006a07fd02b3b2a8d19a88c5049ba483b5e9451380793fafb3b6ae74bf97042831c68a6e383baecb7743af3948cefa5418fb0e302cdf6fb910a5396b90ced10a36b" + }, + { + "tcId": 2065, + "dkm": "bc254fc2975132cf2bfae77c909e3d05994957e8a6d5812c029f6154a2312a2e3576df5c95413e918ead17c7af46e2d126722afe73854d99367c02219885c0377d4d34b6d9e447b1502d6dc57660b4b2b5887dd40cd3e46a3abf034cb2d5fbdbb3f2e41ae6afbc713952c4e8174442fb3720889bc7eb48fbaf46f734811cb901" + }, + { + "tcId": 2066, + "dkm": "be6c4cfb467b3399e2f2d642fee74fd5de18b28cc08318a06e91300fbf5cd2ed7f5e9bc9d5dfa59e42db0e8ced27b79a52cbacc4fe10c5fba2ccc4f28f0782ee4901afc72d4faa20879f4674cbf677106c324d188cdb10d892f9ecef9c22a0039e89eb92e846ded1e064d4711c467bdecd0c1b1d72f5e0a286bf0b71adadd355" + }, + { + "tcId": 2067, + "dkm": "bead243b809da6b9cd93c72e0da9388759e1bc9d0a55e694574cc6c733d6da979da87988ea7e701e430097d508d4fcadc26fb19a1f0544e752eed95a7fd82767543c13d2881d4698c2b699c638d63752054e789c8093f903de93a78fea027ac688cf989edba842d6c8bfa29f81b84486975087fa626e19134d6cde4f7489fb11" + }, + { + "tcId": 2068, + "dkm": "c42cad2705fcac116687c383964fa0a5e82603ee27eee83f9b312d8f726dbbe6399d46edc4db25d462cfd208c38449bbf46ffb743d453065599f1ecad9f7144e33b86a228ae59ea8d17aa3b49fdce6c8524958e07c1b5334f18ab3a0457a68cd6d4f66ac51dcc74dfc98a023e310a6c73126f87992b9982217f575c439aacb55" + }, + { + "tcId": 2069, + "dkm": "0ce7b52e24f4f4db97ce91f41bff195d5dc4bbc3e23e02f71a6641ef711c9049736493e0c065340a3e72151d856b9a1ea757a51436a8abeaec8fdc69269550e8020da08c951a196be48f0e3bc21278b36a7a8d3b41af4ea509e17dfbeebdc8bfcbea74cc9b3471185cba7d2261fe9663fc198fc2c708d32951fa078539416676" + }, + { + "tcId": 2070, + "dkm": "2738f7b6e53363ee48196992d62724c7f1d2fd2e0638c077275ccecbc6e386a8b2e0338ba59c801fa3e26acb23d37f72914d72e8ab8c12cecdc4e69294fcbd61bd7428c6a6a3ee920339423d806e9da829778561b4c8b65ce2ecbd3be672f44ef2c7f136afa91c83311d9e4d9bfa45c98fd287076c97ad9318eca347cbf25656" + }, + { + "tcId": 2071, + "dkm": "edb3264814ebb649c1eb4dc79fa111c114e879340134700e1bbb3d8fa3a1d152d2bcc7b410ca6a6b2f8e10eddeee11cc71a12fd9aba509327369384245860b0c9dcea9e55b174960af29b16c76f54ef8d87edb276c6de8816d9bb5fee5d4ef16aec4434f394090d6e95ee5a6b4c81fdaad458a23749bcfe1b4d8e3b992805406" + }, + { + "tcId": 2072, + "dkm": "2fdcba4e94526667741d7b79f5a9762c43eb787934c42d03439a72c06e19a13b8a3bf513ed47f88921ad199f56d6ab31b709597ca9852afb4672697b93e72e89806154c8bd04f2780061d85b8cd04b894ded696155a9427346c20770913f35be0ab24f80c5cc5ba5f77e3d86801aeab9b1f938d082a6c596ceec0436a8bc3123" + }, + { + "tcId": 2073, + "dkm": "d1f5285a21225b3c4bf4bfe56e524283f9a969154662839202474673c10f69142cb67908ed127642adc61b28b397ae5188689dca369bf2c136d2501618385638c9cf28c6172380064fca70b4e215e17b334c6c58f90a1035aa45f70238d1def0fe07c155a82ff0610428ab48e8ef22117af01278f016fedebdf0ac12fb500bb8" + }, + { + "tcId": 2074, + "dkm": "d695f921150aad7fd2b1150061a6b6ada26e1f0194376707501df2a7395d8f25969c909800e07c7e85394c52de222eb239305749149f9df256582805c3d1c5b69604719f916a193b223cd12e9af02469c32fd135208cc1b6ea20531944780bf2f04d10273f8411d3eec2c9c967e68736e8dd763d37d5aa8ffae31addaff9bdd4" + }, + { + "tcId": 2075, + "dkm": "02ba3ab94ef29b15932329ef506d9ce5b2744187f4eed90ad230c7610fe93794051afb7ba316cce02d6feaf543ea3b1ce700ab78c4cb5824d6284a1859d94df55292381796dd48e98ce10530afef3b79d8ad0b216527ff0dc8a21bfa8c9b999282673b64a9e6297eca05415453c230c28b8c2d722f3fb7a22c0defdaa6fc27d4" + } + ] + }, + { + "tgId": 84, + "tests": [ + { + "tcId": 2076, + "dkm": "8a1b8b6c1981df21bb71c05f0670723eb4cf17006c0053ec7208191ba9581119c733849c3da87782777fd576491f854f35c670f4476ab30b4331cfe34dcfea5e32d40df61aa7d1919cd47379a67f3c54b5cbd3d3a3c07dfc2a9f8e103611b8dd9cbe287fe9b32a1dc5a42918a2ba71a51a5b21a28e261f940d183c5e07a8807a" + }, + { + "tcId": 2077, + "dkm": "516e145bdb7aa6858ef731f9019c9f458e1777c6a9a37c2a5d2b07077eb3d8626e2f15229ddc3777fc39be4e20a83ee18c263d38913afac383b190b444614f134e38de5e4448348986884e236efe8cf5cb43c2e989bce5564bdbd13d6c2cf3b120c4a33dfc64feac4ecf0f5bbe260a11c680730a5ab1e45113236ebc70c1b8b7" + }, + { + "tcId": 2078, + "dkm": "e7c069d729b322355016ef86437945e0ad3337dc70141269c39e12c4c24b55ffe1787b1444cd20d2dd9e8be97c0b0c9a27bde052922b9e732daf5f2affe1cb912ba0b79ca635e580da7a2681bf234fb214b586855bad6afe1a17d1c446f75429cb522303e28e7b1923e3be64015d30764cc64e3328439440d5e4b38f9232a88f" + }, + { + "tcId": 2079, + "dkm": "178bf98f82826e74af58aa70bc48c3c8f959ea4a64d8d570822925307b7bd663f8b6522adbec3f6da86b85b91c4af38e2aeec604726c502cb8121230919660f3f2fda5a0f37d9bd1c5fadc911587059fd53675efa64549d0c657eaaa9e5d25e52f74da5b1c86deda4247cc616458cc01bee6d8bac6be2d4d550a4f052e5ab535" + }, + { + "tcId": 2080, + "dkm": "b8c43d987fca8459c553ff32f0c2ba83bb4b93c5fc24e518f4077bc9cae52bb987aebeb7369f288bf8d9a25bcd469ba6a3def642be0b502e0c6bc2599b751451072f65687c9f8268257b06c2cc9725ce657e0fc81b3c9e8293234fa3fa90b128a00890fcb285cd11835ba884c393f03d38926243b9114be279a90bbf6d375951" + }, + { + "tcId": 2081, + "dkm": "813cbd2dee371ed69cc7304a5cf1117e2491c1fec9b03de6baaa64c2c1aa4c6a69d190b1b4c11e91145a709d38b31edaf85c31be71820d1e8cc7f2b708b7a10adfda5da7ebd9a49bf9d2791419c1ccdbdb504061d854a69b96f51a7c53be9d1ceb85489009502d9a805670c4309908e255f63ae95bd52e2e9df187271aecfbb7" + }, + { + "tcId": 2082, + "dkm": "454c01f47ce39388162998b0c56ac69638b4d82a0f69a78b441a4ab7edf21f9c0112ad3e38a1edfbeea3cd241c845146104da3c7c182c3ff0756353c2bccc0c2c18b60ba56ef91fd0b057d8fa41ea58109a76073bebe61d78862f2670d76f1ba21e9ef158e0786d0716735fb1f660bbb09de4e253e7124a8aaf6df8aa3d5a3e0" + }, + { + "tcId": 2083, + "dkm": "027bb1fc9917947283103d4213e74293554f838b2ca9d308a7675bf9420e804dbbc6beafd9e58984fe3e7ba8ff3004c372abaf5e565f1b7a3a7d83a3f549badc1ee50da72b3ce16b98ac8f4599ce90b312ea230100af9b36a1704efeadbb2d4503977ab29e379543e847a6421856ebf3d5503d5f4fa836f19e291896b482bf01" + }, + { + "tcId": 2084, + "dkm": "7e51400270e7f057a879acfade272201a6da0079658351de98b49dc813d9f96f5c2e9b6614eeb19a7ac1e49b32dbaa3c911e4406ab7535272d6ed0b35c9fe5d62ecd63dd23ebb57acfd00cb76a69f56e5e29bf61acc1afa99faa7fc65b3149f455409b8e48803402bb37bda42c02dd0be98c8885fc88690cf062823737f71dab" + }, + { + "tcId": 2085, + "dkm": "1be4948e925a8af2361598c9cf1edc03ff701e9419a4f5eae48d20c47fbde545332c854d8742f0d9694f931aacdcb42cb5993d839cb00565abb22dfed00ffc6f5dd3b3d36c15e1c659f1e32d09463495341d92400567300922f9a3652e12ac61acde7b2ffd1d8dc658e41b7a7eed37e71e2b49b094eeccedbb0ae7003804f335" + }, + { + "tcId": 2086, + "dkm": "9dbe2977309af8a5d891478c546895c23043ec25959aaaa7eaebfe6bf4b313af83fb10b01d9cf65d64fc5602e7d54de1eaab3a2b6cd52d80251d4c862d83a504ce42af9f27aa225165a51b16c5a88302bc49ce290a884558e8eb54b9a717861e55431af182615fbdbfcda9a6de6f2573ac0a399268c9ded6006065a4b39f7ffb" + }, + { + "tcId": 2087, + "dkm": "6722318ab4c11da0aa171203d0d5273d13fca7e5f84d6b173f4b400a7a6073e9270ebea106a4bc83a890b7bbda84cc13e607be13e7108885b3651f5b50a234acd9c90850ae2ae5113948fa58daa4d1b00a6eb9e2e043009d58b9e4a18a0ba02a18b9fea7bfeeb5caff8591f4182bc0420e39ea2a342a2ea1113af14753e7c30a" + }, + { + "tcId": 2088, + "dkm": "819d1d7619218a70aa6870a184f3467c16a1932efe0c0d095b78ecef7aa9495056ac904353d47961dd8024b01789719dce3c8cdc48b5d73eb6457e04e95680759a8d2da75340cbb6f44c6eeb28b27512415100284977cc7dfcecf1bccb7a0b69ead082e9b688b5c0249cb784948c09633bb30f67d2908edbcf00f5ca1c2cfc04" + }, + { + "tcId": 2089, + "dkm": "ac01770d7729d7dbe2eaf7081dbc4d3161b3edc53eef3e4ffe467f098750384e54cdf865f5a102a7e53e0fd9c17d9b7f0e4f19bcaddac469b60cd84dc17445b490e482b5c8d87db336ddb03952d46a788a5ed5a55aa9d32cdaf644147f236fdf4afb91aee64f487acbdc3bb0a1a5e1de5563ab54963e4de85675037e3e74a52e" + }, + { + "tcId": 2090, + "dkm": "558475141300fe10d2c5d594244b8ae118f95862daa43f0d79076996f74ebe5cc7509ed68a33ecdb60d4e90caa52e3a6fd634fa0512133f8f78e436280a6a11bfc28f885fc630f9290bbb0979d63af454cd6ca5006ac8577a61315f753111cd23752b61c296c99f17b5845913d99e59859bc9602abb91b0302a5a9b03af951b7" + }, + { + "tcId": 2091, + "dkm": "d173fe42afc7d569a93874ce45becc404b2cd8dd7c7e5fe1ecf5e433d4cfb029c120b186d7447330315eab591b5f57a0dde13924554cff7df1ec71ec62bee9182ded7817f2f89bf3c8c018ab489281f801838e193395418e3ed73d59d1e156d4fcd32e6d0c9d626f11bc0aefe8dde131ee3b1d2b9c1b33ff9844c74d74ba2cf6" + }, + { + "tcId": 2092, + "dkm": "1c12a34b6611e7fd27126a2c759f68f8723ef54be40455f40566e87c7abfdeff9f673bc657584bdf83cd7f5da35202fb2c4e0f06745ec92815aa272fe081959dd06aabd9b93f3f76797b9ffe9d66ab755d2fd2a735a13037cbae0945b2cbc947e4bb40ade06464c260068f5e8ed54bd6ce104e7085a4a598190342443506a606" + }, + { + "tcId": 2093, + "dkm": "acabc3e98d1f1fd425b2b28dd2b7014c38bb7650797b2db829bef6ded8cec5874b5a240ba09ae7a567124212489e74a73ef5ee3524386e74f55f46d63b47e798aff277da4535e39e3fc0a7d0949cb51aa124f5e3c7fa478aff20d2ac76c2a73ac64a5e6a2953af02983fbbfe0a7577d2e451d5da3ef0103fb6061496fc7d5430" + }, + { + "tcId": 2094, + "dkm": "90e4c599fa0ac620de8fff4319779039e373a0c514bc9729412ab7d9cbeb4c3a027ab67423978a5e4f427dd2cd123ae48804d32a145dc1a538bcd281370359abc69d148f370352668b2c1dfbc5614b6d93d1e11c70e588656fe941949cad5e4cea91fe6918b9958050b172341fe7aa2133546b9fd91658463c4ca56c1d8d3188" + }, + { + "tcId": 2095, + "dkm": "d458d7b5adbef5520274d42fddafe3e9699b7628bbc8be23b77be8c29e38bf8e3bfb84957ed0ee0b164c415f365f746a36c7adb6d8516a737e9c0de017c9394412ac13f20457081882289275834606c42e010cd95c8b491aec582e44c076c7c07f30cc26570baf3458eec48ebcbc435ddc183e10438b45800525d35f7d56626e" + }, + { + "tcId": 2096, + "dkm": "537c8992b1a801fec4428385eb78bccbbf6d79cec991045df617baccb955eb15ad2e645647e714f3bf2842be9c177e88cb0b7eae1ae0ab4d843cad471f8982e190609d592813dc19b1b009816a967da58d55de5be8b0047f521a3194a7fb1d3863ec1eed8368104d2512d32a18abc91f9511a5f264c4941503bda8d2bf6dee28" + }, + { + "tcId": 2097, + "dkm": "66789e2a63d1ae946ff97ed64003873fb00526e4e9cb48588f4a728bc80d093200c2a01706c38fabc35b5a97f5f6ebd7d28f6f18c07fd1b07ff725bb115fec78e6aa18c76796454a6a08e67012b45fe3fc95c6de06bda5b73a2b77bd5001e544991babf9801c4c3e5cb956a9bc4c22e909343257cf4ce95bd7c4d9a3461261a3" + }, + { + "tcId": 2098, + "dkm": "8c433be173aa19d0fe030c76ded6a1898e2190e877fb23bcaa3f94d20426f5b46abcc402e775393b66a2b66c251ace0ffc27d683cbba32533fe513f35e57fe75dd4285b29f362ba0de7142dffb9b0aca6fa72ca496ce915bd467f576b3d81a9e1c4fd2de60068837a43abcb168bb3d4612b25ef32ea355287b3a0ad012a4c647" + }, + { + "tcId": 2099, + "dkm": "7d7cf4fce27c926f5783013e45a9f652a4e0fd84cf92a9798cb0d812d3d10ee9213b231181f12ed5046389a775a3d594b8d7a9c678acb4cc0ed43e7133e822ca19ed20acc0294ddf246504b8fb91c69ce2ef9dcd2419e0e26b5b0a60fa8afe6d2390353806b14658154d165fe4b50c5f36265d522f063ec819e647fd27be0ec6" + }, + { + "tcId": 2100, + "dkm": "6b68050acbf4e41b13b533aba1ebffd6dc8b23d2a7125f0ac3e14e45431b2487d2ee92305e0d2f5b11063b66b617faeff40c7ea94708d8b5352ca0c20fde1f458502a351c683d6fe15b8145e6aecbafb8f68da125f2621c47818a4e75dabe38d473c75386bdf4368c6604770a92072d73b494b0c1c3aec86dc1b6e2e4ebce05e" + } + ] + }, + { + "tgId": 85, + "tests": [ + { + "tcId": 2101, + "dkm": "97e0e85814e7e89a504b8f7ec950ae7d96f347b9c32430961941cb08d4f1e76ba104ba9d96d65849c8b402752f654c55a963f57b33133d53316c22d85060646f8b8cd07f174830bbf12dcf2f3297ffbb7e4dc2db526bb1d51b2493f50980fdd4ad308742e537abad916dc30eae152c74185321bb35b7b61e20cadd67bf88d366" + }, + { + "tcId": 2102, + "dkm": "85e59b75d04b75da10db05400ad30bf66a1980d6d42585be48dde301eaffa4f1b3196d3147907428168e15272e23c80e1ddfdb0e6256cd882ff1f552375f2adf2978b93277fa4e394267ca98d9eac235898fc8ccc2a2c8f7312bcbd0cc7e72e5bf89e33e3ff6cd86b3e5421f0d945daf4b8d9d01ceb6c161b25a9635ee5e3356" + }, + { + "tcId": 2103, + "dkm": "7f476f3330dad06138b549eb8333233f2c3ecfe2872c3c9b0ce52335822bdf0ce031c5a049d55159e22f4f9e723c9e07fa470b29ca2504e16d1bbe96144320ecec9360049d40c08c320e3a9a60ea509513475e4791bee26fa2d995476790d69366d2009958bf7438085e88c738ec96abd679afb8507f588e35dd8fb1095b98a5" + }, + { + "tcId": 2104, + "dkm": "9c456002139edad348763ed61787e8ff00c77b5858cf0cab605012ae0a203efdab601921c48ac7d9d9b24303418f1503ef3c88032aa2ad26b79b45a8e32de19f51aadab0fe7065fb485aacedf53003489421bdf1160b3b04e804e8d3672ea7799134c706a5c3ea4abfc30278600333cd0fbbc26c9e1e6ec05fa00c8faea5f799" + }, + { + "tcId": 2105, + "dkm": "bea5630633831f837f79f1e45eae52dccd02e4e2f39d4e315db542e0103bcdf75445a9a5b7aa6e3cd6b39cb2946c498a6156d843ae62e72ffcfe3de0270f12a22becb2f669bf0c7b001e69ab3028cffcd7125edcd1870e60017ffe399138fc6df0d81cd361b032a328c003f8efd6432eb4677bc1dabef4f771d5752c79ef7eb2" + }, + { + "tcId": 2106, + "dkm": "af1a62a46987b846c958060a13e420981cedbf9681253e759c97b1e21b3e2d1c8527f587bf2c505f2ad76fb262941e892120087848db147b9e06feb5c144dfa28143aa36441a4e7ab70531ba30957d94ebb9aebc1bab4ee135d0efeb714c6f8e8686e29720ab32012ed2525978a1926300e41d7349380d33665ea108f17d26d7" + }, + { + "tcId": 2107, + "dkm": "84a94b0b08157ae9040f78d281da528c48561f9120e4ddd6feb7d030667cacd207f96151d625d501680bc6ab51d41525f2ac0fc0198d2081b5cf3779739a0891603a8530ed767b547b09d0f70394f6bfaaba1068902d92dd23909659418fab5e5d5d744988cdb7f471f54618d2dfd85d285ca489d70f9b139532b6104f051aa9" + }, + { + "tcId": 2108, + "dkm": "b647e54dee1d185aae5b595955d38d3f395a2957b30ebf850c77e94a9802f995709c709de24ff8ab345a4631d93c7645c44b352488d5704ea5e2040d0f8233e9e27c49520c324317abda7855b8f506d0ea2ae61a90340e3917830b50e1d434bbd024d402c84e5f9d78d27a26915cee3b56ac2f77e7a418c7eb690cb837ae565f" + }, + { + "tcId": 2109, + "dkm": "73cd9bee44a0b175b2bc754a2cc7ac0536afd995d529b5394a2bc44d7ff51a759b63e5cbf0eb6aec75dc292dce66c82fde25e8f8d8bd140b06ff525f184553edb5423c4a3dd4d0ede7a048b77d0002da294ad95e4ed8155f8ffc1814e0484d0603e491de4e96de77ad00ceb4ebf0f27aba76e3135538c2aaa54bcc2ab34f11a3" + }, + { + "tcId": 2110, + "dkm": "fac2f0879008a39c2d78288552766c1af987c3cf661966390d1b9ee34c601996d28b8f39a14d3c5d5c5ebd310d72d1627f51e982b1e7f4d46daa4a7cac69bed16fbdf2a844fd820c13c53446c917090dbea78ceb7ecdb3cf1fef8f3081f1c95f40d62ceeacf7949bbe6cc204894da18fb6b6c33f1428547d63181dca488dde4b" + }, + { + "tcId": 2111, + "dkm": "17f80903f4f51c8b0981fc9f6fd69b0ed11d3cb1111d6fbe08f7141f0c41dd57aaaa56fa376d2994f7c05073e512e809ae52d9693ec4c0f64a65965a01dca74fc40c39d73b4f3c2188ad302f7ad7372acab0e201e43abb0234d8a61f1298f38f2363f8bf8ba864491a4013f68a1857874d6f4abd479fe395f9db98322781566d" + }, + { + "tcId": 2112, + "dkm": "df051c332253544b14fbc0aa35be64f0ae3857d071c57c99725cdcefe08e918c1e3be86702ff8526806c9772e6312c60a0d6ea60334161d459ff9567f091e313390cda2ab57190dc6245ee58be78fe8ade66c3032151809c9275094e44d37c3094cf47be97dd87718c295981d516eff0a2e6e4a221e40e7439b8585428cade1c" + }, + { + "tcId": 2113, + "dkm": "ecd21b3971983493c41c9e849cf60b1ecb0b9c2e76a48ecb04d044772aaff333feef70883575e3889b6c8b94113c256e99209319e6a10a82c1f67002f09753fa86fe5d737f50bb08d1b3bfee0202c6313b75ce3ae55d8f1bdf6e63f535fbb71aa2e0bd0b37e3991921e1ac8f0bf27bece3056339272fa44128afa8de55c8b2c9" + }, + { + "tcId": 2114, + "dkm": "1b7fd6edf35774a807c3fc558861743a85bd1af189417a43aa6980aeb60d218036ea54991dbe95c8433e337d6381ca2765170f60300aaf9225a2a4a7928038e7b25d20e98944ce3a9ff282f1a4ff6742727ce824eff460e3c995fe9da23a8e381fba70ce5755be40a57cde65356f65f359b162d0f4da100b935ce75350d38652" + }, + { + "tcId": 2115, + "dkm": "d4b3bb01fa62d9df4070835986eca664d62d94e4e397955ae37b203ee11df2a700a474d70c1f26c027eeb670cb3e252562ab810e417499752dfaf2831f9261dece2d5fcfd66c889b00d23d03e4c126e7ff1df0fd9bddf2e9c34a8f2c0c6da50b2fd5d9ed734e04b337762cf3c8fa2063e36182d5bf559e163f739105cb71c3ba" + }, + { + "tcId": 2116, + "dkm": "4a9c7e840d240b6be8185f88903a966c380a2c3f8de159450e153a433e705ab9a81d9041cfcc3b05ad8bf5eec7fc30958f8a1ed4bf826d864bd4208ca8c8e33ccf207e3ae36d9fcbee71a27576ddcbad53146453d472e7e7fdc80aafa9b4ae3b2576ae8f5219d298ca3b9864a34b22dd4e5ab1a6040427417ef75df5291b451e" + }, + { + "tcId": 2117, + "dkm": "e70427eedcea1624d0516376db6a714872995dbdc3d1222df0e3de9e286bb23bc942535be7ab074aff860b9c2bdcb64c092d26cbedce495f271aea2dc6f4992e0e5a8785fcd8b8f0bde35865e6578f063f912fe7adce16bdf958d5e72b3007261381efbab04d3c98036e20274137e3ea14e1018ac477b6f4840fd0772c06a7a4" + }, + { + "tcId": 2118, + "dkm": "bfaedd798cb3412464c06386aa0318af2382b2bf74f2c227f900b56e51dae4adb74aec6e0f511efcd62e535a2ec118eae14212b46418d29dd41548c9601773d588efe941d88b3cdb734f5ae5266083f777c61b3d6b70028e9096f79945ea198a2d25ef0e7e367fd1d9e4a317d053d64e7759a9365b21a4a58cada6d2f74cc00b" + }, + { + "tcId": 2119, + "dkm": "97aef3e53723f5e952b0bb028af63c5d791d738ae624fd6724e737ec9d15182a8ee5cad86fa854a4461ee6ef5395b60cfb38ad5a2ade7d3040aec0ed8077c9ecd332cf279d18b70cc5d96fff6d72735d51386d9121e28bc45c90e17a0bedf58cef98d72f8e90a578d64ff171f7698305f69c4591343d75ccb09c10698605bcf7" + }, + { + "tcId": 2120, + "dkm": "14595c526bdf8b3369522965d73264e03cd7b0d9b74d519ff7f8fad9578691e0f04c6d93c3ad95894b110898740415649f1695b80c58c739f45d6786cea561f21a9bb4ec7c6d4c12cc51c0d87157d58160f48c5ee9a6ba55bf832288913aed00c6756be85fab4fc8b6e03c4fe80e2c3dc21cf28e0ccbcf25366ea82e3bd0a9e8" + }, + { + "tcId": 2121, + "dkm": "a49e231da4d39cd406dbe06da8e4b1aa3daba9e772ef11c4a0f9adaab36102ac72eba1a08d910a851a509cb301883d919f82df3d826ce2364660978df7c9c89eb616482de2182dba2ba4e8f6a9219f552b8197637fe1dc979d61e6774cc39b9bbb059e274cc74ab22c98689c788f56751473b75b854012f7e1f8c060452048c7" + }, + { + "tcId": 2122, + "dkm": "37fbe3586bfe21abc59c4aaf4cdfc0c847f9a6b363e6d340c130ae8a09ccda258441cc0f9451fa6dab4eb37aaf0edf1f66e88176848c16e03f5422b3b67a4d039df5c843de79aee5f46ceba597660eaf6ff3f5b26d4061c86e9a80e7be9a78baf3886a253aa62f0c6d82b0e0cfe0f61d0babb40ad53b2c41297009902ed7c021" + }, + { + "tcId": 2123, + "dkm": "01679784c2f6c44f0d34384b5679c98f109a733ee876dc9c7b5e043a0b8c1eb73466ad41777df4dca6cc1b4c17d17363746f4c4a551092268314e90db6c3025833aebe58588cb74ace17387d49c14920cdbc9c7a460c621407fbd5260db47871f908665dd9328fd534e045784b9310a13a1366a5d30a84328ba1cfdc7a9c3484" + }, + { + "tcId": 2124, + "dkm": "3ebd635fe45ddf38c843a64d3de7600e493c557ccc1f5e9acce0324c68d041523eacba218bc2db2c45c576808451dbacf215bc5d9b719b752dc16bcb3a6e8fdf43a2375ae84956ac3fc7d538f22459bfdf814c983c1f1ddaed254fefca2f315beb9fb93d887c3b58dcb4868a6df3150959702081def15dfc949b364b8ec69ab2" + }, + { + "tcId": 2125, + "dkm": "900b7cb1b499e29167a67f7670f0ae146500103c2d00127c9e0f83b06fdeefbccf742e4d1b05579da7fc6881c1995de49f6d4325ec785073dd6ceabda7331c0dbda00c22ec690c8abbb4abc1e3b1f4bfb0f0f04a9a00d1bfa0873be37c7b8fd35fa243c84374c52ee0718db1600c9833f7d1422a0109d361dda42de1d1213984" + } + ] + }, + { + "tgId": 86, + "tests": [ + { + "tcId": 2126, + "dkm": "4edf4835217603f708cf117485f8abedf464cd586f658d9ef91155062d58d06937e0d16592fecd57d978914aa06476d99af6894e894c1f11853c999068dc7e62feae246ec56efa3256875e01d90661cc589bbfa3c04a45fc249f22a4714c74a4a8ded36f890c0d86192d1bcd89c5b59afde96f4c3e27db96a4410b3cfc83e6c8" + }, + { + "tcId": 2127, + "dkm": "156f18b1bf8f52b4ff05a91441d5c217a8fe228b6ce5b75fdfa4e5dcb3a34f93d73760c105b21979a80cd1cafb235c3b0acd261f8a4d59aa0e5a366658b471c1fcad613a25a0363e1abdc481ac34230daf34a4beee6dc3a42afa334543e34559fed8262d69f11516df2ecf35a45f38ce5727be2a3c750c69979ac8bcad50c0cf" + }, + { + "tcId": 2128, + "dkm": "ccaffd48cc40fbf03ef1607183ab1ab14c81075c52bf586651f73ae9e0490967376ca03b42f9fca72c9ecb28b8ced3466987a54e9de7c76875ce0e1f7511673b082ea70402c0dcb825ee386c1fbb0a1b17f539b7229811d6d0ac2bb99c153df3f7a319e714d23d61bad5093e1328ced0d312ffc6381f18591a3b3b04755e7b24" + }, + { + "tcId": 2129, + "dkm": "dca173955b5466e4612d53399529c3323d4d6b258e0991b409180fbc304403b36886a4405dd83ecb419586752644ee0b05cf049c35ea3acf784e37b1fc943a25a7aefa3761d60c1627205f19780a85b557afb849f20e03dc0068bed07a3e94aabaca67afd121b1bda233cc944892e577417128a509bd537e8c314a984330bb75" + }, + { + "tcId": 2130, + "dkm": "5ab0870beb4af2eb63d7634486f5eb9ead1cde7dac3ce75ddd0b0df292a17ef964f3179e82a960bf7c4e7de7dee779330a455dafc524473c37d60a4ec2c2044ac8109a68fd85cb791e9e5537601f716045017f0384a035ff30a8267d51c98c280af6c5afaa9145b50c1496ced318c4e253e21d112f3b2ca3bf33002dac8dbf8f" + }, + { + "tcId": 2131, + "dkm": "138aaa99e0749f00ccb3d35e410625a93b981bc8435e5f61be3d88a83faee517b99e85bbd2dcacc491e3db858333117a32fa468ce4e5fefefe06e2c1ff3fb4ec4f5fdfe06c2f44f519ad80f63371c810dbb103d4f161dd9d0845770d2ad5234f68cb93c41a0c8c63bab54e6743a067fcc2fa5e3e239c482af8f9e7733f271a68" + }, + { + "tcId": 2132, + "dkm": "d80fcfdc6d2cf026c5ff841e2a1892354a6c48008e13a4f77e59454239cd92c98e5def31ff542826fe7179a83902ee06a65c14e20d632535bb471f1e6c8b19880a84855984a9c40985ee641515a3d8ccb15ca725dc12ca9003344eb944d3ead3ea812db5871ce8ecda55c6b52552550362d5dc3a9d8f7f34c0bd5af1eee7084f" + }, + { + "tcId": 2133, + "dkm": "d15433c2d3d280b236198f01df95eacfc86cc11e9a21b87b357fc27ad7a58d3b223cce996990a8faef6dec23bdd2126e35d2182fa5908b296650d51d3d799b4df4209157bd12f692edd94b0a7bd4eaf188c896a23fca0c6fb36af0c7408dd9a87153ff9e2b101c924c53be94439f9ae0e32881f79a39879cfe14a7575e95f62a" + }, + { + "tcId": 2134, + "dkm": "f8c19cc455fd5e26b1e22deacf5c276f6a3c42af67d55f757bcc38cfe8d829246919bfac8835bd79aa0f0640731a1ef7de46cc42667a863954849f1be902fad488cad81d00f3b7fade0142571ac4b1e3cbc4926113a6e26008d551ab647850b2bcb9b5f9f62bfd7ca9e468d526634841b421534861c875407f26e112f239d692" + }, + { + "tcId": 2135, + "dkm": "95146d392eabd3e0114263beaec7d65264fc710f0461b89ff119a4c21c20e9657e792f97c526d781dcd764d200b35f49336ad2a49e044ab8aa7f31fa2916dc51c03dcb32d4761d12896bd4f797183fdb095d1e0c9c2ef8f116f7c0e1c9cb3b5087350b02ba62b48d1c5e9bebbc3f64b70e582099989fcdd2f494b2bf41c49ac0" + }, + { + "tcId": 2136, + "dkm": "2661b5386e4b6e503f9cb33f7bc828aa1053124e2f4e5e2bacbc72c6b4818a77b24e62578111559fb7da89934a0441bb47576bb8d728099277b59394d6a04fe2984d638f47c82ee801813b12ce0b0ace2fd4b76b61c601017ba9d4aacfc2c7b68286613dfd60885f9ac080f18e4770ac528bd188561af8d24870b33317461653" + }, + { + "tcId": 2137, + "dkm": "8b45e71f779c64fa5e041546f1c476637e3621de53d203f03a8e4756340d4282174f98a6fa6d3f4bbad4fbceacee387c4c3a6d60114642d487ad6b995bed0cf10d18b8eae480804b51de527b79b71d3bde578109ec379a9594fef41df227abc83279c29f6ddca43dc038135df308f2cfa5178a8c22199c3fab418a28919ac5d7" + }, + { + "tcId": 2138, + "dkm": "6e43cba67da02d05ed46cee31bed8c532a75df01ba2a1a0c9d9d2c5ee38d294b14171bba9cf1c8a0dd81e6e53cc6992fcad9db5f4fa480ab38de7f874b8414f064c8fc6ede988efed74d494225a484b9ef16c21b995544fc6788320c031e43fdd3d7169b252929b90f1ec23e3b2b3da5f16aba85a6183f26a448ed05d9462546" + }, + { + "tcId": 2139, + "dkm": "e267722ffa1f83820aacff91f595d45eca28a09f63f1d9966f57d26156c987c0a4a9b10f1a0aab96ca93434f05e6196c9477bc693a65797390019ef8365a3b25c77f707ca3c065f6d8fe8ecc316ed664173a29fe26d10a0b35ea024df0c4f9e69b9c1daa833e1d6f94050ad150f7d12a24ab58d2b66826b356ee8fed43405e67" + }, + { + "tcId": 2140, + "dkm": "997f70145b1d53ebb1b61addf21fb4cace88e092ece220b03b719529bfb33fda5496bd414b492c3adab46f513ae7b95f563244963e7ed5dcd31f90902df3512150d8ac0ebc1741427e648fc580aea5c23132d40080bce1264c5c5a5468e7cb4cc3193e54953d4ac4fd08d4031804962c622bccaf6f403b454378ec89b8e97da9" + }, + { + "tcId": 2141, + "dkm": "86326316b3c7a01473535e046203bbe8f32cc834792d3baeb3d4742d71515d41eab307299cb8143f96493fe78e3750ed0ae1bd9e4ceb5bdf9402ac4b815f2171df238f1bdb5098c29fff5482be62a4bc10f8b94f483798a5ab9a30aab687ca2dcc03a32d649fb58e3a31ce1b2d1fcd9231c320699812d37670d8f670312cd355" + }, + { + "tcId": 2142, + "dkm": "2e9e53a63bc0966e97f2b178e3ae3917b88e43165910ded50344167aa797c4048f81b895ab0a37c9afe3e903db191888efa80c08e3b00acd65ab25f80853dd3a6edb8537fe0dbcf5716022e3d8b404c0d5aeafd0d9dd07e97b0d9287f51bbe797db3cc457b10b6a2a0ac9af97eface4faf410445e6d2d01220d69eea819067d9" + }, + { + "tcId": 2143, + "dkm": "4959e6d6a67f3d9bb725b5e2c955308fc8e3a06feaa0b85a7adc2d5ae31786edc8249bf85d6bc7874f7d7a63727ab184c207d714be007a2eeab9fc4305805c949d1c8d138ea5eb21a8cd6fccac8f621a9841eb2714863cf8a2673ae552abf1bef8ca70cc932bd4fce21a145ecb5ca4857a5a374d519f6caff7d45349d3c04f58" + }, + { + "tcId": 2144, + "dkm": "e5eee888408a6d1e31a06fb5d55e761f93096495523522f545619b558f0e17cfeb657f3147c18ff5f1bdc08a768b5fd0641ae39ff373576f5e02c6c66b79ccaebd40d637ca6e5f57dd7634451b1b1762ac0fde51b2d25c0bdb27919bce2008952b6a8f499aa1a68b003a65dae9575d2cdfa2405a45c59858f562e5606156c6fe" + }, + { + "tcId": 2145, + "dkm": "4513dde325cd0c4c0a44b3db563727e96235860b8f1fb0b8afcaf0f1ac3ed0e62d50db8c2be8589357ac42ae67256c9a2a85cd1d01376c765fcbc7f254bdf981d0968e0cc6695f99dae2af741d68c64c472ad818424eeac8fd99e321862bd02ad5e41be8ddd291ff9fa536ff2a9f36f7f9446e0c8e0b8045e2d569fd45a10855" + }, + { + "tcId": 2146, + "dkm": "6c828c4a3b16a0572e7cecba9cf6f32aff22012725602ea43393d4f604ed50e8983f0edb61a7c518e3c65bf4d6dd1d29306604d2d18913524d8162f5759a88831c3e61cd7c00774c027e99cf6aa7170151531a2e332dc28213808f68ffa070d8a7794a7aa2c107195fbb9a339ede1e9d4abad75b8d02b0ab60971d2a338ea807" + }, + { + "tcId": 2147, + "dkm": "1acae1eec59b03b5fe60d0a068a796ebad8c394fb5bdf3105edd7453725aaa6c8e956353094cf11802bd4e5baa7ccf9f71af2541266b616b7b1d2b9fa26e04846c30cd5e1d43fd8b33416ac507e8eefa0ad0ea193b8e93d8e6b1a1409259ecbe81879f1c5a2d25a420c2c7b191d949b437ed761e426315474742ce9f2d2328d8" + }, + { + "tcId": 2148, + "dkm": "dd64d8f16cc588e03429225093ecaa2bef134922c8b8dff9d1558bd9a6254c1901abe6cba3741df36801c774dbc73467f3f71ee6f30f35e2562131c235af0defe1d3bbc6ae7efc54c37118b74e55d91dec45ea68d9bca2daafab20d17e53e760de24aa1110bff00876d646414492c92ca21dd9a2667c55000edd63d0b753d9fb" + }, + { + "tcId": 2149, + "dkm": "8f7351f667547b846fc707fde41efc24762685f474257d3498f4e02ec37647d5854c57ac92f686735cab00ccc8c1aeba7fd2a94a9c564303c3282aa817ee9fcc91e2bb209a03f1876dafa525d3a9c05f3f1bd4b3d7d05532f1ef647c06b3eb8361401ad4ea22a248d411cdd7f11c11e26a007a0b4fdf63f935f18c8c2d529161" + }, + { + "tcId": 2150, + "dkm": "4c25a9f5ee0f6a67b3379a82a2916b3807ccf88255c12f92e125c19419323b7f3a07c761015c199769655d1974757543b983376717a58f6c4c82da67fcb4b6fc9370ad9bac872758ff4471bb259ed66958f4248ef9900ae7230da8257e64d1ea5ab355c401c89592c20a49f244f41e9b07dabcbbda5e67cc1a00d9fa5bca4ae3" + } + ] + }, + { + "tgId": 87, + "tests": [ + { + "tcId": 2151, + "dkm": "597fbedbd6658e0b457f6bea62e1f7d8ac39d8536bba2ae6831b60b011bafafdd8b3bc6ba2e8a06a2f12524941ce198e22f1ed0fece36371132ba414523c6d4d1f328e03b953c1cbff0675cc0af439ecb08c3830b12437582de19acf7ed75f5c851bb50c8550482500145d18cafaebec0b2d755231cddb383993d8efc4dc2026" + }, + { + "tcId": 2152, + "dkm": "3ac6d4015ba89625e320281f56fa5e0a0450d6823fa7384cea4de34a66585aefedf98d0bf76ab0ae7467202a6b6c739daf121e1ce246c5ba0a6275dd3cee206d785624f3ea03bd05878c1a8f5ce3c1b83f2e8c4058e96f483c2b7ba403fd0b76dae5c365923286f4c8afdb0a42c805eb78e118fc7c6bd807c43c75c56caa639c" + }, + { + "tcId": 2153, + "dkm": "2e11a70733c67155321646bb1a72063eceee9d8b226bae4aa62df6338c00bcf477b3a2d53f7205a460de3cc18bad4b51364df66685376b74b440e7c6fa03e6fd8feabbcca59f593eebace872ab2059b62b656e612bb1d0b832d109ab9ed2efccefe0eebe73e55825d2b0d18755f439ddeb7e15ec843fe12928e4d8ef70a3b9cc" + }, + { + "tcId": 2154, + "dkm": "fc06960805e08a8130c83989dd3d27faf866c682dd2627f6e3035594fbe7580238f5f52c4c8612bc6f44f0c1cc7317cd5c015ca8beb8696f42037cd17d6b909e4cc81a8a574e6186b688ad573c0d02c60863058d5c1fab133c65b76955243957fbd5c1eb7ab7e1c4c96158d04ba4360ff8f2b0948808a4f52f9786342261d543" + }, + { + "tcId": 2155, + "dkm": "2db9f5886ab96efd987a32e25509cf0393b1d97dd09e5c9b71d7bc6dfb48e1e5f5ba34feac09f77f91d3fba0fc82ac63136ae35261bb9ec08d85d7d65063fd35cf796404af4428d782e07f4a87bbe578d9fc9d92f3d86ac84abf1c0648e61d935773a1fe71fbbdbe472e164fc897b82414c40d14fc66802e7dbbb36d69be16b0" + }, + { + "tcId": 2156, + "dkm": "07c1a2e732d5afdc7da623617ef914e232897bfbaa9585ad4b98509603ab1fa864c9794bf033633850cd57f8007a238c095ae0608f9d78a21f7479e54564e7a2584b66792927439bac0e005ff1512e81fbb7bf7a4501362fe4e01296a2ea448c3308da681f7b5bd8f17b6fe959eefb9108991bd4159c4bef2b229b422b9b6126" + }, + { + "tcId": 2157, + "dkm": "7267648cbd701c27de9055142f203d9f8c3b05e2c7d55c1f4a8c75dbce0fba2c32aa7ca20ed3ec2f7440851bb4d1ab583afb2c046914beda33170afe392ea29e8de86649538bdf8dc56bfe81f27cb77fb9ff28ecce088eb9495d6115aad1d1b7f3f64122a96a3b57daf2976304fd45c58f13a163f6b6f052fa8a8e35ed3f7a06" + }, + { + "tcId": 2158, + "dkm": "e83e7b0c91e4f6f88f1ee9dc70878c24a0777bfd50f908a45c3a072f85b3a364b7c856836882d34b86d2cb8b5a22f5d48be20e4c23ba79f7a5535da8b0ebc91eba3d8ea4ab9ed925c7fb6abc9d68a9c38805edbde6a9bfe074cf83f4e467edafdfb06cbd5d648112f9fe797fd75d5b51a5d38a42c8a3d0940e6cb6bff44883df" + }, + { + "tcId": 2159, + "dkm": "c3551e826859f03e91fc4223a39c2bc2ca5f623e1cfc053d0d94c04fd84b30adff4a34b81755129d203cb01b9a9988af9e2c8843acfff6f58cda45737559f2d07db998c4cc8eeb62f099ef53ddd0b2618e91faec20d42305c099e0f63c7d05ac11ebb056f815153195dcc9bbc4e7121c02d3ee196b7ebfce28fc0fbce4963722" + }, + { + "tcId": 2160, + "dkm": "38f2d4c380a9d18f51f7fe051dc44276e54010c73300f4122ac11747a7222369ecc7b5b0739ef2f14bf6a5240da1409ee6de246130251a277e3ef4c9bf5c1e96c994ecff44a1e3fa6e4ebd210de7dd6d9b820bcac5f82a28c65de605133b993c79a8a296df89ba315b7fe8eef202fd5c1717b5a040f0b62605593a4724395acc" + }, + { + "tcId": 2161, + "dkm": "de245ac5c3288c40e74c35e78a7e38740e5acfe3b1de392231e3b351a610bbcd8b48d1f79d1a67c3b074474f98aeca989df7edd0553c4b57ff0527db3f8d745da596b25edc9490ef90c0b1f411d199f975c38d8af9d318421bb5c294c853312c6f1e33a29d34a59387fbbba590052d3df0aa978db01e329bdcaff56d6b00fc98" + }, + { + "tcId": 2162, + "dkm": "bd281fd966d699f3b0162f6eb505ef6cbbe553a1da8accda78d26f77761ecee2cfeaaa1ad0a55e7dc48efa69cdd69242d060acdd622c3ee9646dd869219f457bceb6a618cda75ebec6e98f837ecd0c1afdeafb21c194fc7033f97c808568742cad42d5199148d9b9fca78105255f3b25c40919068c8cf3e9bd3dd0fae8060c55" + }, + { + "tcId": 2163, + "dkm": "50a8c14ef636267fbab6454a17372f9fe77c39d5874972149b3add766ac4d1286de52e3cf5d1b215258257ed525ee33d31a7c0a56a9fb3089492419367515d33d22e94cdabbe6dc185e041e7e0648e22bd7bd9b46233c66d15d3d676d1104023cc869e4416f3521e27913fa2d2c12e6d75be0e69afad272d619b1eba232230cd" + }, + { + "tcId": 2164, + "dkm": "1cf5625242bdb275a313d634f6e35ff18d446bb96521a6074c4dfbc1da77f02fda51d73064336968e6ed84370c156e2cb44fc7eaf626dd112642e0830921ee481b549a0a28918a1decba4840affe48dda6c09e91bdc443fffd8e4f2293211a1d6a4a86a0a0bbe222237dd7e509334310667a386997394d5293c332e9a049e80a" + }, + { + "tcId": 2165, + "dkm": "3c90474f7c2bde43c2915d8b178ef005f5fff0486ffc949d8e1435a6048ca52610793fd9ba83417a11385c1fcf441b4b1bea9b52424f4f0f9fabff9644f46d3887b4be2b0d4facd3927848d693198d1a1d636fb274a20ae8a7a253ab7f40ecc0579da7c5110234c9d108573c8785b26bd3a4f768058aadb5056c8660f70e8ade" + }, + { + "tcId": 2166, + "dkm": "cd8b40ae281bbbfac402c241d8efc1b843ecadac2423ca34c86b3d1d2ed3ae90d584be69315c0a6f8abfc42dc9b84769cea841acca0368b2ce2a4206dc4be1f1715e076d45b5209cc8cc505dd74dbf1d2e9a191276807f1b098956a783caff5f86fa3773f601cea08c83be784e239b9399d7c2e0467dbf5580542cd56a540358" + }, + { + "tcId": 2167, + "dkm": "b696c20597dd8b79f2356afaf3aba1b6b18235e6f0e29911ae0c2c653d5b7fd5ad645f5b1464d6a58386ce74be5b9d30536e0ee61ef909c1adfc45b88959d503b3ab17bad2850d6be5eac3b0ec71c62dbc3bf77470464c2e0ea5effdf5f99faa78a20b7b5592e1884f57ff31d66122894cba161a65ea82ab246e09b11ad21f4b" + }, + { + "tcId": 2168, + "dkm": "b617da840209cc8cf67326ea9737bb249ded684f0972e4b4839710c11c57edf101156a82feb9251a4e9d696266e590f4bcd7b7b88e127dfae2a94af2a26c536644bbbe3957bf30c7ea727e502f17d3d5fc9665082f97bf41a020dce06a7689aec56c50aa525b1577bedec6dd609fcc5ad6cf33505b77e880bb30e07673aa4b4a" + }, + { + "tcId": 2169, + "dkm": "00c63091666e1ffcc9e42e143228a95ef6cdc9cd2239dada617b585fcb7434dad538c79715931c6b4ef2dcba27be0180dc54517452dd21d7b35413192ab786668157144e5598f8f6cf3144f0fed3979f479ea6be9cc28662832ab64a24b187e5f7f7a9d9927b78ed399d38c836fc4bd4fd5a98b7749b830117ae52deafe48e02" + }, + { + "tcId": 2170, + "dkm": "7c1dd627e86880ba4625761bba3220de8a06484e74ca942f4fc2b9fd33c49658b9f16781663095fc6551125cf8cb83c439299d2baaf103d4492c544de573a2bc0e795792d565515b9e139397aaaed3e6846847d99e2d3b54aee403c86b2584628f7cf2990948c40aa3e99acd1b073c101f761f46411e7cadf0e96357b715fc40" + }, + { + "tcId": 2171, + "dkm": "8e06940bad6ca35fa7c648006261a444d6768a274427d2b72cd138ca740e6b41673a8163c5d08c6d88b00b99bc5a19a8f21a84eb42c5521470159262888d870c6f31810b66e0063b28934920f5d508ffe5a368d47236a7f90dc8cacdfb2e00f626c048cbec8fe89f006a640ddbd794e9010820fd1e0350f00574757aa9dd9415" + }, + { + "tcId": 2172, + "dkm": "86412d5126bee4ee18610e4450aebb48c560de9be5e02117ca54e61b0bfaeec64b8b90e204d93eb715c0e785b600d6a97d696537fb98124856154447f912057f2e256eedcd250ca87524415aacb580d63f86414e3cac1cfe45341266d323c8a2b0a187da26653b9dd5bdbd883312a7cb9c15cafbf8230944a3f8d2f7f12ad9cc" + }, + { + "tcId": 2173, + "dkm": "c966bca456a9bdaf36ad1aea95847beadd2569eb020a964a5f9c89ca638d700bf7a4df6683c9dc5f1959ee61ee6f366dbcc13ab93fa2f05fc45f6e605a21cfe4aa8cefaa89a29467a79af27d874f8fb9187a24f16a2b022a4f6aa011167f7c33326ad024638bd7654084f2d3edacc2e81d9724c8400283cf4a3d32e69a1aaaaa" + }, + { + "tcId": 2174, + "dkm": "e11e904ce07053baac2df3e44e3fa62f2885fd2d61236ff3a745fc7986423826f5cca3b9db4964e008f3e6af74a05b0e447d7f2ee8d3bc4c863da97bfbebc150a1575211ccf6ed2044099be06727863d44a3a7f3a7c10392ea0173200dcfc112e1ce2e11b947833a9321b8381b0d6b4ea3ee55f58c2df23460c2566b357485b4" + }, + { + "tcId": 2175, + "dkm": "cafe0abc703c6777ff27b72d4bef3ca08393ae8a1ffd0dd7be09719ad280983204a34ec85174f3b721b2460e13c08c97e9070e64b2540923b25e4f4c628293cc1829668985eaa1c20f53bfd10c4c3c889c6111bc6483896841a6964482a0d86cd2b18531a06832c467a4f986200250ceaa01898397312edda7120546144b7b2b" + } + ] + }, + { + "tgId": 88, + "tests": [ + { + "tcId": 2176, + "dkm": "b13de09ce33b246954d0ec0ebad999c61cd9de55a6342c42b01e1298d0fa59f073ef8ad3c00b50f8e2ce103ef0aa647ab02a2694199f305ad3448ad66d8cfed840966f64bab4fdc99b0880eb2f6a837f2a0fd64d29806f40728f7dbaa755b502a04e86a55f9e568102dcb646977cbea5c000a318875b7778a792a7a763957100" + }, + { + "tcId": 2177, + "dkm": "2ffab541f0e5ca6c75fccef3f2b1adc2cb659f7eea5c4e6c1bad6934d52705ae270e2b7235ab6403dca0725868f94e4ae2308b1bc88a445611ef4e74e551c6c1b7afc57bb55d174a38264379d9bc8e0e3deebacc7de760679f42c80184197a132bda7bfa54385e20a3ca5fa1089889ddd9a6131f0626027ea081d936d328e5f0" + }, + { + "tcId": 2178, + "dkm": "3c4154829c955686fe6ff9f73e181e11a464d9a72818055211096bc7070c715ddb95ba3d7f7b56aa822d7eed92a8035c8b588febf10de48379346f674c917cb5d6402fc00315db0467a1bf9017e978a8ae2ca87a134e65fde9a5fc5ae3bfc8b2be7a05b952cd1a279a9348c840ea1f8b4679a695c79e5b6d520c9272f536790a" + }, + { + "tcId": 2179, + "dkm": "10f8179e7302d8f1caca8de645f3446041f67740f1c4ab60e59fa9fcaa5dd29e37b91205260011e51510c8d6badc25f9170c928f328fdd683a0eac926da5ea7075ba2204c2d589f4d7c1b391a8f88bc9eb5171e19b197734824b3e1e67c3f6b95cc3fb5c51f445f71f70d1bddad3e43c63554d5a824bf72f14e17809331608ac" + }, + { + "tcId": 2180, + "dkm": "6e0186ae56519e656849c214cef2cf41a118992aee34ecc261e437297d81f8cee96a67452f188a5c50d17f7bf08e9ac0c5d5a8d3a6d6553e5755b40dc23ee85e92958b0b292c3e34c630e441d22330976fc27886ce1e62d323a1779e43ba2efaaa026a1399183003c30ab6d53cd18153831377b23736f27cfbcae7f83458d4a9" + }, + { + "tcId": 2181, + "dkm": "d38df895038852a5a77e8633fdbeb3193740631b21257c2c5f2278799286edf2d6a7bd31bcbefb837d53cb8b8d99ff7a647e5250ef981ec073304b1774b50e8047aaa91496428587583e5b35b479260ba02542a9a2ec0f0806815fd6d6a3196eee6711ccde8f8431abb80b5d8af335aa1161cad4b25660ed50ac8ba4d6d04e34" + }, + { + "tcId": 2182, + "dkm": "f21a87aeb78227ee5e0f253fa41854ce9b2f1165e4ada62a4784e45dae37644dc2d24e3501953e1613d0da6deb67d5c9f5667d9853e1a3a83ef2080dd127f0d8f4b09e11fd8345d8f2132ca6436f140cdf90857037eb89f86b36460973e22388bd3213c5d03af53b870598cd629cc142eb6776c738a9ca087d5535cdedea1a09" + }, + { + "tcId": 2183, + "dkm": "9ffbe0c51680fb44a47fde61984264d635cc5ea52cce7eb14802765f756a4147fd1d8b3abff7b0042367782e831125e775f37db0bfd76ddb49465d309b5cd6c8675eae5aec953e1679786989b1bab3aff1ecb2b1b8a3b51e56bef6c9a80d9d6c5d1b1156225a9e1edca99ab1d877ad117082968577c176e9e841b4b31b9f228b" + }, + { + "tcId": 2184, + "dkm": "795137186f551e4fbde47a34a09723a8a0976c5b8a39bf17108a281b2b73dc68f2e71a2be3ead7240f346c7bad7f1dc5ac4ce807a690cd753eee231424ed306b9e690975a972e8293ad0cfab80afe932c9805292697c1110a2735f1b760d37ca8fc17a0f3e04684767fa48ff7193199bffa939b35c6a7d533687dbb59a826ff1" + }, + { + "tcId": 2185, + "dkm": "34022cd8c23f03564a74259431950246e55fe05f153b707c7a338b85a047a72e06c357b12a6a25b5aac28af5586d0658e41c75c76aab9db9f6a83c801702efc2f02eba529cf10071342bc8882d15f360a1342ccaf753e5816d256d1496ed6e9a97dfbf226cbb95e31b195707bd02ab142ff97841149e949a2674583e281d13bc" + }, + { + "tcId": 2186, + "dkm": "d79487c3249b3449169140328a876ed8c05d75881b9d7c6dd583d82f785dd4646f38a99d46595d8bebc6ca250b199e58628667767df92148a6fccc9833ae76fd292894d52b096fcca8e241d38976f681ce186bd2e23a458f4cf176679d61da61c41c9b42d0218751bf2d3bc8fc89a2a26f6d048fa692625237ebd20a21545c25" + }, + { + "tcId": 2187, + "dkm": "cdc7e02b9144364b8315391572968bcd82c5ec1fe34a0bdf083fcf6a6155495be7f54a3e9a29567d36f8bf1b0267ef871262d3d3cc09e349bed75b79459229493c55b5c4a5ea0abb1ccf6a3b4ae3a6a33a6ae889944d2a86d31aa3a140b157fc72f6fa5e63db0f54502ddfcc91b0b5c023091dba8fc8fb681edd947f9289046e" + }, + { + "tcId": 2188, + "dkm": "c643c13c147e4aee25c2d8cab4ea50b248f487cbb0f6d8d9c6c5e7ec7f1937f3a92af0df09597eabf6521c2af24334eec0b3a50a353b683b58a3169b6444a01262fd985187ef66333bf8a7b2ef683fc9ea9725eda68fb0aed3e14644d30b24e3a71f0d505ee5e6c14b95c28a20dd1f2adad2212f7cb7a47f5c35847fc1a290e7" + }, + { + "tcId": 2189, + "dkm": "bc4cb276df3699d6232e51f9433f1bc525e7b949f64e0ebbdabbb1ac27e377b39f9c029e67c32c7bc25d1a675237723d6fbda5ef6b7965100eafdf523c7d80f72f90e7779e50cd5da04a7b103a89473a5817c809e647c0c7a20e3d8993f59122cadb46a797a592f96526f4cd02e6cbe6d0ad5796ed7d7097b41cbc53d2986e48" + }, + { + "tcId": 2190, + "dkm": "afbf7e12f400527db4b31f7bb5f86ef42dfd94a0eb09f861f147a84fd0be9f407c7d74964d1f6c4453ef3839787ccfbab13c96e913eb93dbed568a38e7fc638c3381e1b7d4a6d77acd8e6e33ff3eda229439faec7f3f3a0763f7bc82c910b5b724c1a24bfacdfc08674f15d203a1e32b3da498ee1f9cfac6e7527bacf5df7d78" + }, + { + "tcId": 2191, + "dkm": "7f0dae50582f804a5a75be30ab1958da1fb065ad407988854c1d708002e3685d89d189138f62e397e2683e27093c4ddfb81d9925e447ed8472393e1e6d79d1f651c821c09c0b4508d839ba10443d67a8070a522c9bccbab78d2b201fe1cd6ae9843e530febaf22def6ea30284852a659bb1e7d2600d73dd6ee8e74cf2827d73f" + }, + { + "tcId": 2192, + "dkm": "0b3f96ae0728570eec97d9444e4d6ca52fa4a93c309599a6c40de9e62ae632cac8b81ab40f6c59508e567dc1ef334230ab0d240be3c6e8ee563547838b23498434cedfbf73754a7deee5a53393d7222c3e76476e88ff610d4dba8454f12d590d8337386dd949f0ef6d0020fbadbb97e2bb3e176c6ae640f8611fa4cf6b8c073e" + }, + { + "tcId": 2193, + "dkm": "ab8c1a180b4aae841665288c3782ebf74b6f4b7a8a25224d9b514837bf5580ee5d72b963a4edb48d983463acdd554b372e1a498b45267123661f6fdecba0f3b16f719774d7042434395173161e0e15cc61135edeb32b1942a1776d64f33e1a513dc607379fd26bf86b119c838dd75a5bac6bb03603255e677a7607bde9c633bc" + }, + { + "tcId": 2194, + "dkm": "10abac6d376ca15f4aae7bc32e43f6423f1bfac5bdf0ea58ca074eefed0cae91f0b1d7f4fcdff85172c08c0ed35262482897a56b2ea2b917a6825221ddf50bd0d6cbbba253bf7f0d6a519ad0b48ef69272e07ab0c87124cfae3fd2972959ecf6cb268e08425244af9169ad06ffc6fec3c0a14162f4e3cc33bccb773582855a37" + }, + { + "tcId": 2195, + "dkm": "ef8a1147eabb0bc1b1fceed071c087b13acbabb22d23ab41433b161b5b6b2f5fd89bedf4813bf2fa91684a564d9d86642429edf058679d4c421ce0d98a31593d3913cc97b618f61712efb99db75f66899b759ea618f4333adb83fea6936f0edeb1713b7e15f17b242663ed88003d61e52be3c8695a0f8b2df96f39cc91a65712" + }, + { + "tcId": 2196, + "dkm": "76bc124043b6c98844cb28c147397e1440d56707d26f35df741346ba66d2843ddf327847b7a239d35d3d9cba044c318a0dbc1e08b49e6a6a2ccdeb03188518a213f4a40097dd2b3e521cdcb741a95625b3f8399e150b8c29c28eb531499c5277d56c4e5fa842e61f02a4eb266a792ab5f31e65a61bcab60b77bd73426ad4c519" + }, + { + "tcId": 2197, + "dkm": "361680f394d045ee95d8772907ab347331ec8bbca4e6caf24cf5b6ad7391f2c2fe002bedc113f5f6927f876878014c2134ad0bf1a24dc1371a910b3fbef6274976332f705afa9a7fe57aef39d2aad8ff4cc17228254a538c4a4512ed429c756b2e76c79a2550f33f180d429138edb2e2708ad9e11293bc73d9f6a84a456b4974" + }, + { + "tcId": 2198, + "dkm": "1c775bc554081009233d2b50f60d287233c83c9e164115f0e9f44f1cb7863f07bd2de9c97db9634fd59db276ba25175b4e9b5d340095bcb27d9bdb1847acdd3f3b711606a23e0cc8d2719daf1102c0cc6329ed73bd7e8548d387b0ebaa92c943b34719676035c0990eab17a52272e07dfd6d8140381aa6194bc71c4dba7acf10" + }, + { + "tcId": 2199, + "dkm": "41b803f270ee6f1622072f77ce8f7fc3780dc532cba981074d39c30b2db4329f2751b4560da3012cea10147757b7518adaecc7bcaf143f5fa60e2214b8e6f1893036e4dbc4a60f8d3cbb9c63cf604ba470403e99b32695bb98a586c04745a4536f1dc52356496d1842592b3ce8a57fa1b5744fb63fc2ecfed79cdcce8033a5b8" + }, + { + "tcId": 2200, + "dkm": "dc5ca3b28acbef9da5f3136e96c090932d28c456479fa341d698b763fd584c1e2f76d1f429a7c7df108ee90e6cf123fe79cfe3b6c45c3020e0dd3df67457bb9c58089c1e284dbf192c493366c9642fc57d3a1abbbaf69a6b2377dd3b0750d77eda70ee41ed3208e70118ffc30e35de35c20e2aaaefa29fa69b6cebed78ede209" + } + ] + }, + { + "tgId": 89, + "tests": [ + { + "tcId": 2201, + "dkm": "efaa5134d0159649fcf26908cdf89ef9508f5a0ae42b09d5b37312aac12d7f03702ffccf060777785157d61dc059002feeedbf5726de55d8f7d99c795dad60bdf062c65608beea375c14e1f61fcf808243f2b8d7dd20bfdea354c9da8e3e81ed5e20d77eb73fa62c5d42cb7f4bcc14f237db6ae6ba7a348c270624a4353632d7" + }, + { + "tcId": 2202, + "dkm": "4e32d01cbd3562af0ae04ea0e6eb84f9a421131792d5cb8ae4310086c7a29e70c63dfe867023b27ff7909cfc6bf5987b691fb99d1d659ef3a9946ff5c035b94fa4354dd05752e0eac9a8c8578838b8830cdbcf256dc4f12bebf01dbf4d9eea99e0fafc00f52f9f9f2d851257cb889dc3d0d3297e2bb1d40ced126204dc92e270" + }, + { + "tcId": 2203, + "dkm": "ae95c980874800676176141e564914c95c7eb23462f4549e5c6f69bb4aa3086e70d185d64e06fc9f780023ec20ed543cb304e7f3b3ebc82f625820f25fc1a03c5c33c0c2ebf5709315dd807aec44bc9d1d25116ea0bd7202a59301255891d0304fdee38d5ac762f095342e0f775dbe8e21b6f9b38e5f2278743bb80f0052f9f8" + }, + { + "tcId": 2204, + "dkm": "0e144f20180330462f78792f697d2bf3821f10b81f8235bf522c7b7d33594573ca4d6db8b5844518daedf72aeb5e40d80a2be50ba8987c5817c0de0d33353ccfbf5a74d984121da27218a0c6300fdc71ec71558148b5869e764d20d476b3029ea4dfe0fde9139f6da75456bfa7c2d0ec30588987e54ad5b5afaa9d65aa62aa5c" + }, + { + "tcId": 2205, + "dkm": "7b65f0ece6b542849bab639f707a699d17dcc3957ce78ec243e0dc55782b088d0da7618e5fce859c24c09848633b6c0b5fb5c1a2c6533c9bdf7ccbc4db3d84fb8e20d8604a326414bcf201c5cb79aac742b7f105fba870106ad5c02ccffa42ac5366e827d02ea77474e03ea925e066174505c781446a637fd9b8dd099e308f9c" + }, + { + "tcId": 2206, + "dkm": "2e1310c7adcbf42caec5950bbd8b4096498754c38be752ebeedb32ea4bd61396b37598d04180207283902af619380ea5c7db16534d63fffff440e01ba8893cec5706c3528222ac277e9b342f3be3a8141885547f438394414e8688610c12773533c44f43f340678f4d329356ef0e05d789c929de2473d4573edcd006e48eded9" + }, + { + "tcId": 2207, + "dkm": "c9d84dc7fa4e52ecec2e8a0bd55fe81807d56f89eab68cca28cf42724d5637cfd21ce8e73b0e73f955c3a16b0c485551cda2934d546db493e8934e851114f18cbac10f53b0dda3945f8fb112bd231a41cc82982697f745a53bc1ef303f5ed55e8e966a34d3527e28682d7c1d4bc18ebcdbab88e82b094b2a88f939f4367e7306" + }, + { + "tcId": 2208, + "dkm": "b4cb38dc22098b14cd64b8b1c43da1ea9d1bd203a33ef34f236486f7e1ed6b66e2a1aa3dda1a62b04551f3d8c70f7fb003d71e83bb6af5dfa27be917d2dcfc120e2b79c29813e770f7eeca5102eb0d020e58d47c210694d8856f9b12fde0342b7a15089a47ff4b802d010485fd1e9fbc02183032d39bb590a08fa2cb1e64f7b8" + }, + { + "tcId": 2209, + "dkm": "f8805f66305eacf3479fa30e473befb150228e94ac7f732cdf18857c75ab43a07ae43d88bca61e2609471d2019bc5f324d3bc84d54bffad6c79007610cff8a4a8b5fabea6cc7c567cbceeed6fb290cb31bacd37aeb7dcfe86ee88149dfa0ea9dbcd5faaad112f8125230d863a506b2f889d19fc6548ce70fd7f1c9322e9e3f98" + }, + { + "tcId": 2210, + "dkm": "60539271ff09a9bcfc98e0f3549443742cbf43017718d701e99a29f40332f7169363be382c4af8d14132f293005c9e3ebeceadb32aba9b4fb3fee849b7aadb3abd159ed6e7e6a31202e45ec4842bf3ab4098838b1ff2e4c13af9b659df6b299826a64ec90b4a2b2ee4ccb8ebe67ba92187ab8b0aee9266e97dcaef3946cd2880" + }, + { + "tcId": 2211, + "dkm": "a3ab6472ff156966568cf0c8afa0e4a7e1236e185d05fbedfa6ef6eefe26afbbf4d296b177e58b1644bc2d4963d2db1e465a5c7da394f2e984e1619a24416dff7dfd51056b9c91cb44556e5c0db5f22a433e766cbeed2ee345b973d934b3315616ab411d7f9d25cf6783569bcad33504e1a448e05ad135962053953f0d623cd8" + }, + { + "tcId": 2212, + "dkm": "7dc3d6d01abdd3bfaca48abca6679ae1f5c964a44d52d4444f9ac1ee3cccb508e56b9a3bbfb03ece7a67919376e707afe83ee0c257e487655e3eed484a3cc3eca12a24b65ff54d9a1f414f4e310e49028fe6a4c29e26b5a098e9c79cf2aeccb050524b209e6b14d85860fb6e8cbf6f1e952a9bb50e71bbed939fd27426deb56f" + }, + { + "tcId": 2213, + "dkm": "60454c282098f0bc3a98a3b2e68c38787c6165c2a498472b0e06caeef67e59e88bf92370356493b1ede9ee656c94e4c2369ba8ce8caa66d3b2cddabbec2731d0723b649f7f4e85bf1b7c9620203a8fd736651843693c1e74dda8b31d149d222c26dfea32182f399ddb039fed78a7a4df015c2d3faa6a3249045cb5553cf39c2f" + }, + { + "tcId": 2214, + "dkm": "51aa9cef5ea79268620de77b85df6e3d0327c3bcbcb81ad022185aafd070c9de5e889e4e13f97dcb2b23e19d24d7624b9499bceb6a980e112162dbd0c5d8394a311003d75084377e32abc8ec0f50cb51224b1aeb4d996f2ab6f028279131c3403835a59be9eb795bb9a79e68402af744ff58491829c89eeee55054c38f8aef48" + }, + { + "tcId": 2215, + "dkm": "7b09818d10e4eecf9fae07d2df1a1ee198880a00a4c2b14856e2ea01fc31eff2504b0a03534e2824fc617001facc880a44ca8c95cb05302802998dd58117b71082bcbe3d5178a53dcf379644bbd10bea63a32c5c9200846bf35329a1640befb8d1cd413e2f68cfacdc16219d2a364deb962781a770a075dfe6760c717180a72c" + }, + { + "tcId": 2216, + "dkm": "1762f95dbbea09ffb61e91d4bfcc90890ecfefdedcf3cb81b0c50fec4b327d5425457bb7ba911a85ffd4b1c3accd7cc61b57dfb5692c6705e83a0a541083a1a9048b21dea340406b085b727494f5dbdb1d128a37568da737537676b509adafb26bc08878d907d8e800fc76db23cfbe4ebf374650daa83f2ba39c0db78205977d" + }, + { + "tcId": 2217, + "dkm": "e4a393b63bdbecce5f136f38d2459222cd7ea2365da53b4458126b43b19d498551ca9413c8133021d43aed703b883844c16563fec74e31ba31d49f04290e23c1c6c893c2d11f228d435c4fbaa6f44a5e0fbf7b9878fcb7dba4b2276441423d0a06c8715dd8e7f4749f2bb9b4854371023708891f7ff6df55d6e7aa1e6893e89b" + }, + { + "tcId": 2218, + "dkm": "74cf5ef33cb47bbab889a300fd8a189c42558e23b6f3cc016aa3af4e9f2319dfd71b0ecc76184a46e7bde5ff7b6ba496ab43281e1bf2d4606c83275e0567efa50a87149983fa54724e1969e3578e27f9594a4cb3738129478ee77bee971260fb285ec8280b40498c921a31368549f896551aa682aec8323c92d0391fb2fbda9c" + }, + { + "tcId": 2219, + "dkm": "2ff3ef847e4021e483690d99f455e96d76714be35704f12aa8a7f3eaa425698428fc0a9c649ea151615fcaae728b6db3018d591614ea696401d4f6cea8f48b7e02e9d0bd8c8c2cda728517962fb9d25cf9720a0cb419213ecb390a3281703056e25455d45a49aab406836d36bdb2065308faa5a09437e3fc704882eae41a8c1e" + }, + { + "tcId": 2220, + "dkm": "6265230ca3471cbc95c7e829c95039eccf2c9799ce1103e37985117e77fd70e465cb9de8ff8f231e1305dad10cab51bd2a5845b7a788f38cfd52d1af2a3f5f2da0d0d8a2cb68769c0c85260e37936d180104368be67aedf2871e64ea5d68b20e6247dfede3597151763def12f64bd6d993478e6d2b22556fd073345fa7e67295" + }, + { + "tcId": 2221, + "dkm": "14632af2b130104a8264c55e76a525044af53a8c7f09346db9b9c23ad9a0eabb21121c3c09881503085e1683d343aeae6516ebb73fe2fc6c719172f7af9bb38674a3f39e119d105e69a6d66b0107d722a7863464a26b507885f5328263f9f0b0c46d4196359f001f43b80dda485be799a93965e283cd7a92282d319064e4346d" + }, + { + "tcId": 2222, + "dkm": "b5626a9dcc6fb1c26294835e28b5940eca5356ef0b73681dfbf40e6149648a4a291281658b805789fdebb83699df99bd120a0bb2c7d73be04c5d3432ad3c21ea8c1640f43331ac243594b971363909c2774ec5985555aec95e5046b5f4ac1b198854ef48e0982be2c1d5279a5d3b6c1ca661a5dce3f0ff9e1c25783ce539b1e0" + }, + { + "tcId": 2223, + "dkm": "38e5376b650a909ddb478d1193de1b0ca2dcfaee1dff57dbd3a190e1ce9671b333f64d954d8664fe263121096e330b833c1f601da371034d4f8339b8e0d3ca1fb2983eb275bebb4febf98e435f7e1ad25f530d800baae985d1d1706fb97bddbf5a4717fbfb974d1ef25f61ddd7c79e94f3367584fca99a013d1d38a02311c894" + }, + { + "tcId": 2224, + "dkm": "a9d2cd4305f918b5f0c9a66072dd0b697bb46f35bb6888d94fcb2b5406554ce5108d9a3370a3690a22bb4be5349f1f54ad816f2600d310e2e9e00ec62270275640461568decf6edfe39836790e7f736151a5cfff5006cb0e74a77f181c76dcade96cf81796c18c4e88c4e9ea3f9db96e9d31c810ebae04a1451bab4fb8e9e797" + }, + { + "tcId": 2225, + "dkm": "ba40ded011458b658756c1fd4ca1f15d6c4352614f4686dcc6fe7da328ec91b8c8d7c13bcbb5f26d85391a0650e37826a3cb2514aec00083e0bad1e0d504285819d8807d1c0cd70095bb4dbeb1bfd264404cd8629ea6f2ecfe61c195c031f978e9a5b6be6e69b60831bc568a9345676ac97f829890488f8df68a8cb485a32db4" + } + ] + }, + { + "tgId": 90, + "tests": [ + { + "tcId": 2226, + "dkm": "3119ba82953560ac44220b8c800be5d972b8f6d79992eb113b67bbcce2ebe2a4382a0c7ba2672566599f623b29a154c9ab9ca25fc0879b37064b57924f0c35a0b5d6bc0417dd417059156e3afbc265077dd059f8a67de131046aa50c9c745a992f37d03389ef0d966845ac8696108f9ccb43f30d0be222a81b44fcfa9a87a34b" + }, + { + "tcId": 2227, + "dkm": "6a0dfb4e8ff9022b27335933a9fad149b689d9fe0bdf912a1775f719df086faa9bf4266533923bd7e0e8da4182a0fdfdb5f3c9b9b50c866f2df9614c633ab068f6f8cd536922910296b67946512aa55365cd4df2c8446ba3e72f2388c08f726899876672c1f7dc536473d2787cdfccb01c55376ad2e92c663d60ff385a40a780" + }, + { + "tcId": 2228, + "dkm": "9c553ca3260af6f233569be5a93a37550937c254b21b83fe6815d073c8e51ab83f73802c851129fa9424147d5df55dddb7303633179fb4f2312fb5a5edcbee4f0005dd63776fda05de8037dc36296a7ba1d8b23450b6aa577cc39dba4c7c125aea8ca103c51e1df6990c1ce79d2dd26ce6b0118dfec887eb29551cbd1e7d3204" + }, + { + "tcId": 2229, + "dkm": "684d8ec10538ea0b34f0408cb815f1b99f36a799f75fd50f5233bb41f3538b3efa180ee3c2910e77f46d84f9f7d8f6d01b45bb684f5a0de66646b83326f16b3a95c262596bab9d0682d1ba84998366ee526f4a678c3153cdcd363112bb53a5f6c36112e6906c415e45385e5883690b4b7cf08a5f4256f85abb40eb37463c5de5" + }, + { + "tcId": 2230, + "dkm": "ecd419b98478afc30833b965840592f9febe4782890b3a2cf0f90ccb9a55f72e7a5f1c07bef117e339a9ba940d051780a22393c1d4638738b3f90f3e6120a834118893262c45951da43deed67508ec05b47bdc1c4c0689ba26ec781b5d9f637c75d317d152bd6bdf0d75407413dc903f2ecc192e36b121a6335ec0366a6e8321" + }, + { + "tcId": 2231, + "dkm": "1f5522acf31fb72eed95ef34086c52ffb3fa4c4060a517c217189b9d2b8676ba876a45651731ada51b4779d787dee2687b8fef6ac0819db71d2301a248985e74cc7f2113b1363cb4fff61781c2d421a0924f2acb48d99541d782ecffaf87b3b1a36b5a96fe58278d70725ca30fc5aa6047f6386e44162d04b150da4b6330ee37" + }, + { + "tcId": 2232, + "dkm": "b80b3a1ef7f7f7b63f0de571c649e190e1692048db89c63dcdecf6e4508eecd027aff940d63cbeae2f13325a40bcb0b4ca39b8f89ee3a7b3ae521ab5f000d3a9a8be37a1a073af65823570eb090bace0b0ffa4de67ba361d55a0c5a39f6445e199b5c1adc3651924a035eedc9f31684603a37a7e5f86e688fb79dc5113d971ce" + }, + { + "tcId": 2233, + "dkm": "5a2b852beb07dabc8ccf62560c674286f244fd442b813f4cc097a5ce82bab614716db5f9d557bc529e9bc4dfbbf3c50ef75ca9f985046006f63f6abe46254e171a4467837b9eefaa9476de50cff89e100eaaadbcb3984d8be76aa98584e26ae7c99b19d2650f341d47179bc09c7998288cea798fa7c0edceae494bb4162d3a60" + }, + { + "tcId": 2234, + "dkm": "b66154a0262282dbe549f349756067112eeccf9d67f8521b47293ea755c3322fa1ac1d8c0bb5514a9827a9bad9ded4c43df9c548b5512fe689485f7461d5c64bf30d3fbbabe948e60a99c42217411d0dc6b6131670a34aef35c758b2a6a296694eadbf9d9683d1b40392da12e04b45008ecef8228c562e898641e7cde1cf6955" + }, + { + "tcId": 2235, + "dkm": "e2003d933226f1b7ae3b6efa4116b0475114c24588d91ade7fc5c9630ccb2af0d30f721b735a6724af48f5ac7bd8a3b75293127ca505c6f588992f7b7cd315c555712b0257e739ff223a0ad2989547df3e278756a7200a779d322d1ed19edbfc648e9a90739254c8e2a9b037cefabb3ae75c1da756147584bd1a0338988dd425" + }, + { + "tcId": 2236, + "dkm": "f01477e75665cb78f613eb26c54b8f7da5bcc59ef493bffe3ff885391ad25d0554b051e66874a8fb4e21ed59357a953a9c30561de2c85fa0bbe7d0f4df3323fa5b34da26af4a23f9b392e7f9a215f76d999c04e28a935eb259a792b26952a1f70a80cf22ef7c0e09b210db5bf2090edf6616b7c15b67f1b6bda0e6707bbed682" + }, + { + "tcId": 2237, + "dkm": "e79750d48c273e9bc8d1e1fdf8c2441aafa8c9ca687043bc68595115099650251110a0ca1c4f5afaf0541f3f0c134ecf8890d9e6497964ce62340b5555095ae061266cacbf777b612e6dd5f9e78ba415c87b80d36b7f7f537fd6dad6471c35ba0fcadbdfc35a5ac461e6ae58f44dff53b6dcb0e91ebdb28624a9081d7e3385ca" + }, + { + "tcId": 2238, + "dkm": "280f9b4246f449e6774617811a2b3ba31f6769c22ebccc510a5057754df06e11e30cd292423fcdeb958bd1c65837a3867aa2a3ad43d3f0744589ee107d0c7f035d51595d49e59f6a2f822240cd4c0544d907add8ecfe64e34a883c763fe3ae0a8975157464d7aa1c14315c95c6713b9292d7d3dbfbadc93512410aa0abdb8dfa" + }, + { + "tcId": 2239, + "dkm": "5af83c2e7927c998c8b4dd7486b366b92ebc256eb8b85233cbb6b85da820b8eb5b6cb5f95c4ff038c6c2a8f2343812f13d3446bca9a7fbdbb93bcacb27af95b83ef3ed1aae3125d13f2e6dace49166049cdf85e3a1550c460b5d8bb5ab5db68e60f59e3edb2cde06f312a1194a0f5b9e4471f7f25d5852074bea219d0ff9f30b" + }, + { + "tcId": 2240, + "dkm": "1075d5bb0c3dd5ee44d162680a004e27d5e97ebf7577318f4a8248204ac37d9bd340976ef325e28f8afec7b90e305af03a7c4096e4d6b1cfa6beb630729c903c731b355ab80688fd863caaaf952071fdd69289f31e3568f4b153bc745938f76e20bfded588efb0f749d23845f03991bf4804960877882661f4d2a5a0aff88ad5" + }, + { + "tcId": 2241, + "dkm": "b460b0a6ad262681870d4bc073d8e2d8e4b6189f70447ad9fbc185be5fa7f16a3336c5e42f641e5d84b09009f92fc5ba3abff69fc13ddb49a2d7cc9dadc0cd6185e26ae27b45a2fe717f1e60ddb431344fcf5e5d071178132e4fe0b8db6f7862902d2831f544234f544adbbd3fdf216f65ee7a09895b2571bd7f8b37c17653ca" + }, + { + "tcId": 2242, + "dkm": "bff10b47f327cde7c05685fee6edb13096442dc81197d6ce31d5c9d4990fdfbc59177e30d36438ccb3c5b751f12f57471c7a42f78bb77b9a25d45db241b02730c83ece0d2e8b83e0a3cc9cdf05a85f01c036fe4139715e2a8fc13f3f957006efd0ebb211e7c0954f30378daa47151c78145501bff8712cbc494b560a43afd7cd" + }, + { + "tcId": 2243, + "dkm": "3d840d8b02340586c310063a1da387dbdbdb9d55e52f6f1e6c30143ed699fa6c2066b43ac9203f7a19af8aed323ef1576169d42862834e86e6123563928c9fc2ed840d5d43523718096201d5947323a63d407fd921c0fa07c40c191ffcb5a50fbc4993408380e2811c6f0126052495bea4f4e88667fc1352fd9d00ea6141f361" + }, + { + "tcId": 2244, + "dkm": "decb028b786377f946fc3344799f78cfc1e9ec3cc607d4d7909e2d16b0b76b2643e97844d1cf51c2eb2b672e92de48916854aa175e6035ae317296337a3c6d331cad857ee84f9888ec2fa503629846f4e44cc9ad91107d13b4bc1b5abfb357509c6d8fcaddd3d743a241e2441457236a20cc8b3e5b1cd8e5af0536b97b5459df" + }, + { + "tcId": 2245, + "dkm": "1e746256f566c62d61544f78ed81692b01af41f9d89defeb46c5df78b8dd59df612cb390258726c2ee1f248cf7daa16be052db0a7530623e8f592a1ce23a94d084ca96d0bb2021357886e7ba0088b09f7cf8156b6aa4375a08a11f92d241e1e44e0e70124438e2e64083e34ca3f142be72e5d4be70d407456b87441f922b4890" + }, + { + "tcId": 2246, + "dkm": "bc3acd599611352e7c1fa2e83ac06c36b2496744e9f42d9a45f06baf155d13d263358be011ac5c142f71650b94170ed993e04cc846a7baafc694063961f1822ebc7088d79d68de78781ff467ea882c06c934f2340a5aa7a3fc95913e4c32a1dd2a3d1c36ecb8c4491aa551d7d670ccc97ef356606568f18d879631bba2c5a93b" + }, + { + "tcId": 2247, + "dkm": "da15b9d697a4d40ae8a7302914ab429656f0ba5cd7b59a2de8d34c30bc773ba2301e3b4b4743493dfdc3d576823219d3e6a432b833fec3e0c7de4ed4ce70e1480dc790b5f603e0061f4e6efeb8ef9485834e9538567dce9596b9fd2ddba17ffb40e6e68fd254076219ea38cd7e34e9b101c0deb23789802c9c946d585a13a3fc" + }, + { + "tcId": 2248, + "dkm": "c5f48b853e8ec024ee6fa0cf8a273653b045ad12e2cb3900d7ec764550cce049d6e8a3beeaa2cdded46ad5182c5eb4f8efabe3fcb6093ace49e6ea83d18f311821488499be3a5a2a93ed34f8b55d2bec0fa61d5aafc75e8a0bc73c9927d9d8bb3ce139d62b5d4ee3424b8bc3cb0be3fb91804ca83bc7b3b252efea391cda16c7" + }, + { + "tcId": 2249, + "dkm": "2782f1214746ccfc4f71ee0adf202efaf5c866c9b9cb04b2710462876cc661159a6af6ed11de1d9208c70b11d4e8bf4657c8e62c1f146338b95885b4473e1dd63e587b316264421cc7063d284556470e40687e006ab1672befaaa8b63998aefcf8538f72d25a6b98c9744c588140e1119d80de9892feecb81f17dab065855eed" + }, + { + "tcId": 2250, + "dkm": "7b675d81309adb9682e723441491fce51ecef9bab0c479b7b08bd75b1487370c459c7b6ccea320b761a1f69cb59117746741548ab7746355d502945c117c9607fff29832522590f5f9ef163b3a99b9851d6864c9686da35866b35ede144204e040fbb10c6bb6e2fdbeda55f71072a88dea3b3e456abaeb9efc6a616678ebe37c" + } + ] + }, + { + "tgId": 91, + "tests": [ + { + "tcId": 2251, + "dkm": "88d1652cdf56a4f1ca98f4f85160e2127fd76ab43a965a0714d28acf9a4540a2ef04e93a1595a0519ffed64f09809b7cc62a2389c37189d35cd105c0bcd9d854a888f6349590f6488d6eece789983290f5b710259a9d43ef78a36e40aa313b1690181747accf38baa3d516b56ea51384cac18e7c9640f06d30c3b4a9cbb9316d" + }, + { + "tcId": 2252, + "dkm": "16b52908edbfbc7cc9aa62da1a8c47536599412f060253ff2e7662dddb71bfc86e6802e590cb8d64f82d9ac053dc7806f374cfd30b20dcd1d8fbd7e7f19161b1b2cd1e31a2768608e9be710dc9b0af7ae01dfb354fe2e305af3fe6e2d5760736ce2a51b807940d8fb447b3ee8183d52af825604063a5b4812035c695bffe1814" + }, + { + "tcId": 2253, + "dkm": "bdd0c15b17d25de942901805d39ed27592d93489b15030c99195d44a71e8776b2a6538349b0d8fba7a96f1d5f6206b99fa34741bd19965c98a4f08b374fec45441bebc97787a7e0c7d0ce584812068f32871201a5873a975e1c531ee45184f49e3158329f89da199be3f6f555170c714b9b492428348a86aa742337737af4459" + }, + { + "tcId": 2254, + "dkm": "0392fe7594a6d5179abfa4acf57d223273603d666d9c9074b6322553239be95fe43280e6243db1281cc148f37d77a4b6443626ad96388c3d6541eaeb04026f3db60ac9d0a8a81849e111d3f40e3a8d8cb4477cb407dab3167603a607342cd2d2051066890fba3c7f9f8ec5c491701ee806da76a0f07cd1c68e420c83b9689c20" + }, + { + "tcId": 2255, + "dkm": "1def6926cbf82d60acd8a941fecadb4109bcf05163d54019f0a97f3922c95bf63553970330d3cd96d7144c49ac3745bb8c6759c34370db9cd4079727ff702fbfb18867dae5757e5b04c80af534ae6f3dbf540a1f541ef7f7c859ffeb5f71081a732269bae93a0c809c5ae3e7d868abf916eee6f6dc82455aaa322dddf82a8d48" + }, + { + "tcId": 2256, + "dkm": "5501b31df09311c87c3a2f9786c41e504125f1a3ac4eea74bb629d5b91bcc36254aa37dacac5cdfad164022f92241ba07d668214baef45a8db7bf22bb7bea4c411aad3ee292b7cbb1226e6dadedc43fa383430a3948ab78546e6ef53eeed48f932476755656e8613a9f60780a90e2adeb286803e6033dee165d34b7066cfa40d" + }, + { + "tcId": 2257, + "dkm": "31cc489d9245132b8ac5e7960fc13cdfeb0f3998a719e844abd7539b0fc594615341531d4af2f45a8553f399fe7ad61402effe34bb9bdcaa02e543074c7d110f30c9ae9413c7d5edbd44bbdb9f95f7dc1e49f228cb5b51b5cb163a0d81524b32092e92a2a9524b5a65577e138f0902e41f83dfa1c63298581575483f9dc9d39a" + }, + { + "tcId": 2258, + "dkm": "d8131473b3c2e2c76426b855769e74887ed42e6a99a9326274a31b92e590133b68a1e579bb9e78f7a8293fc92a2d2c1d4bba373c700f52e9340e987a7f00c2c00317a9ad41d2d12eb01a056f8408da40405e9a3eb5aed631d01c4367193a2c88cd73d3797da9292a2624b29c709ecc9791976af346a788469501689632f9f493" + }, + { + "tcId": 2259, + "dkm": "1b917c29a4bedfe516c2c9ba1892067b180bbcc50a92e00278511aad2f370a6a6578f25b8ef13effa833107d478a7e2c9140a8a41c8c1e5e9e49fa8b26252caf1b17a9ad110f87cea123fdfe8b081a320b7ee1d6e3a841c678995670ad4d2ed81861e8285483461c388e7a2399cb699f5eda945e637506b9badd451c6090536e" + }, + { + "tcId": 2260, + "dkm": "704fc0a051f44fe0238518412f978f2996b1583c8fcb5ac008889d60c4aeb37e08ce70bc5898fddab47dbd33bcb8be731d00bd69ec2479a161e1332352dbb07a3a6d7be7c2c4f3434b4c4039ec73a712c83d3e7e9a069cd6803b9c439beefc4d87a958c931488263bf4c1e519cc15a37b2f084cae2037fe50eacb8709f534a5d" + }, + { + "tcId": 2261, + "dkm": "8b5194dea312d3aa644c47c8a4c58b9402a690ecec55a6a4d98f78a88c817fd5636a782d8bb177709116a25a3e13442f0106194714d6889e93d0d92053743bce1f891a0fedee8fbf33d3a9e726f885f462d0db0fa54a6c02d01efd16ed4d75350f9d365b77dbc7665b67b976a08ec9c61835f7764b135c99068105636653b6f5" + }, + { + "tcId": 2262, + "dkm": "9a63ea7f483abcce508a7c6d7a0cf4e0199ac7d91c5a709760e55df4bfe56dc9e1ccea4cad71580ef4df602939a55198200e08e907bc627bc0b07c06acf2470205cbf31e02f80a62b242ff97f1d916d2a00fc4e36540e0657fe6d92b8daa1d3dd4b6f5592ee17e2839420308efc8e39f922bb8f68c8ea1df42c2a9576f3d9231" + }, + { + "tcId": 2263, + "dkm": "3cb41870bee5a871e155fc01813f0aaca5d8385d7a0247e45a6bcd8e6e0d0880d96cdee6d2fd719222d7cbda802fda3596f070c4d36aec4a34f6b1eb8562c8575b0bacc07f54585cef83ddf7be25c3ccd0959763e2f46184ff958e554226e3a40ba8ddcfb9c315f41cd07a74323d65f27110ed7fffeccf039e86569964f28f5e" + }, + { + "tcId": 2264, + "dkm": "8311b36b2347a307990638cf8073c33c607a3a20bc62662effbcb692aa265738b68ce0d02be54ab7550d25073950f9b34886c1e5d1e010280decb8c257337c6594f9a3555b5397b2d5ceaea15384c9bc8fba493b420a451255909c729e1e18e429cd93dbdb4aebd8dc0f96495d9b7abbb3b932583a6864ee39ff3ceb4293c49e" + }, + { + "tcId": 2265, + "dkm": "2b79ba0d56b795595a6cf3c24a859d85afb6a3fe76ddece5ae25977986158dc758b6a6a22a9fe6f95d8f53e21be31b3b56ce29b8f5b4f034eaf2fd8250c3d44e04d98a1406cd96939ec8d5d8f2c3aff8cf7b38debfb1f7e44a84cd247aa0dfc3487c1369786486f6e5549c75acadb761ed7a9fd3832ebe9717af0a65ff414fc2" + }, + { + "tcId": 2266, + "dkm": "b4e6bdfc2bdc3517056cb342b62aefadaeb34f4bca10d0efd8d644704cdfe89ac9e117b333c266e11ae1ec62506f9dfde8bb4855ec6e2466a83180fd44200f5576f8cbb103a2584d8c7f439f44021875337e9459fda7b62746c35110101b8b6bab5f383fa058221f798a37c0a72cf4c2145c2b23d7cee8617deb1ce8ecae484d" + }, + { + "tcId": 2267, + "dkm": "eda25544369151ca8b27b8c80763e5bfcce03a8c98f9fa9df20805e715d98c95bc24d43ace0e7f1ca2dbf56c01187a3dd451bb7b0c8e49299ff3bc10106f1ac916869468c611e812ceb1f0da8f7e14c95ebd825787f1452be2aea6371d7a22a0ca733b2e5ec7b342d7ab531ec7c6f064e6c74771ebd3a07edbcf624a14e70853" + }, + { + "tcId": 2268, + "dkm": "9e03394089de0c1bdaeb24c9f6aee0efbe59783a34345f44bd3b41e8a177cae884b4805c3590c97cec7fe1f0b2a9338aac05ede5e264a91a036f8cba5c3c9c6c52da105e080f1cf3c1d8c69a67e584ac0514f134ac901b3acdc5689b25dcdfe8a08e4b1ad6fa9a8e917cba796549ddb1f930961719f22fca6f2c8a8f626b84fc" + }, + { + "tcId": 2269, + "dkm": "f5b7e6ccfe62beb14d40b644b58ebcf90651d451c4f6719dc69eecb7a0c6b4c59c590e2bcd0810d96bb3747b89c9e83c2188e6f43987c9377a6f0192cbda29ce2ef13113de511caa4dafe6889831ffdfd222822d130abc14237ff85d81e652211afbbe9f9d0c252a34a5098a579da965cd5b2a813b7b9de72d9f7a298810134a" + }, + { + "tcId": 2270, + "dkm": "5092679dc3311c90fed62afddc61912e47821c79215fe1f31094deea40100a9b2b4e61b86b1e349c7fda82e7cdc7fd411ccf814f80262d333eae0f4ac5e991c9251dea5e862c27d1a54bf35635509da4611608f27dd620cc06e9aaa2813caabe8ff267bc8ae19522cc26129bd16b2e45b287f05d6f5927abb9e7fb649549a045" + }, + { + "tcId": 2271, + "dkm": "7319ba629a314fe6a8182d96e9f576402741ff1c19536cbc7454943374d225901411ce8070af7fb94a0e60cc01c37c29a8d38e82f3812d9a8d318b9fe6dbf2d9a105940606401016c0422ef32d8d1ea948cf65fb7fe2523d54308f4a2874f66b767ff129858b142c1007f101338b0471baecf2583297db5e56bcf957a143295b" + }, + { + "tcId": 2272, + "dkm": "ca4b61e61bfa1f7d02c15d76401721ced63093864fb0f36bc93f6900954d171155eed291020c257942ecc6f60230ed326063d8915c348c2088676087538fcc5245badadc2edbc3376e0e120f3a39083dcee40d082572f1f15554302aaacb43c2ac07969d88575973588ebbad1e79eb4c9ce39bf473922c9ab15289cb5e158106" + }, + { + "tcId": 2273, + "dkm": "844ecf0318ee90ba6f2c903f92ed35945a3a3c29110b43467d1e628c78fc1a61b0bb0251e9354e9eb2db6805f77641a282ac46fb141e2ce0fc3635f5582275feaca69b40a3fa0567210c1011d18c59279ba38d0a7f1287f668611b0600d27d9aa0c9eb4e9979daca7c408a5defdfa7be57659e4861771400b2accf47b56ad4ea" + }, + { + "tcId": 2274, + "dkm": "86664985e745e6f0ba5c7842b69e3e4193c08a3824dc22780ebb3cd72bd584e9d64ffdee52ebc913093953426d080d8cb56f3510a6715105cdcecf60182d133bb1187412895fd0c16ea9ac3e95b38b2acb09b75548b68c2fbea9d6b2e577ea25ac97c9d5dc5eb29acb6ae38a9930f27e129d68b1e2781692dc475866230f134f" + }, + { + "tcId": 2275, + "dkm": "db7776275330fcb3fc6c015573518622895da2312c193f44d78dca9ddda4a37d4876f699fff8c45a5182efcfa069e117bea8ac13ba7e0a675e11f54fc9455de43cabb2a7dcfcc0e892eda7a1e4eea51c276eac237c1996d2766fcd70086193ffc5c9d67f186670f58ee7ffe68a35fb57cae10b7db527f8a600118163dde4832a" + } + ] + }, + { + "tgId": 92, + "tests": [ + { + "tcId": 2276, + "dkm": "dca1b9d099005deeb416a64c00f81574e9800997750933078b1db4218936b03e8d5087f19fcaf0f0abe4ae0e44011e4c2e50562b21cbc0b2b515948c5fd91bc923238608cad36f0a8a51a6dec0571346b513e8d6655385937f144ecf00deb44627c7d136df59e1ba2afa06814ee0306227652df81330ada984790ad2bec12dfa" + }, + { + "tcId": 2277, + "dkm": "cfebea03da44d2f27cd8e06d55719b3541076b7d9ae980628725e1879f5b0a5cab10be0f3a250290691d028d03de22d80a2e97cb3023398139b6f18884c6d9b78dffc0cedad434cca1be8b4b04983f9d67c51271c56d1fe2c00693a7a000eeef3af67fef31cea3224d5b4e51e454dc06cf0cde27bd2a08f61d0a3180ea3e2360" + }, + { + "tcId": 2278, + "dkm": "8bbfc74c1787904df4c4f757bb48ad8f729a23e3e85ab25011ae09534cf2b26ee5e75b1da89a1842e95a9c59d8f9eed453d510904351da956c03c43345b4cce2376fdd3cdc8790a06aee47e0cde8a9c15894ed2318ade3649afe6bcaf9ead7ce7642e65966a3a013a5ff4083255d4aee8c1652e41306076cb6a79c984b2f1f4a" + }, + { + "tcId": 2279, + "dkm": "ca8eb577c81de4cdea47e5a2e9fe423680e524412554691699b9318722871fa24c4d4d6fad9fd7e8a333061fc3092e34b44814d2bd412a99125db32bf9c7c800ea67f7590e839085e879f6c4cf89a7ba009c394b425e4fa901e4048750b4d0087cbc1ba67ebf72aea6a3fbdd1c09bdd8ac92281afae9004f56fba2d2b31e5a86" + }, + { + "tcId": 2280, + "dkm": "759eea52f57f43603790e40fea1584acc48e87d734e3add404547f6a3bd1eea1ac90b5c137695ba6a9dfcc57782cce643fbe8f09692da6478732270aa4d5901122ffdfd01a911646bb47030db60f512c3a3dfab6ecee40953c215f9f7f887540be0b1588c2fd0a21644aa2e13354bb0ec371e65bc2989b6784bcdbf7cd717c66" + }, + { + "tcId": 2281, + "dkm": "b4d3c88813fd657c3a276e9b21580b4705bcd01d0990c461a7a12065e81c695ec0b0fc9149681d1357b6d3d394bf1dc7ff77236a9aae1cc7d0a84003fcb3bd43b63a6e59e703a80fd20d4d20c2ed72bcb17bf2c71e60c37faf6c22bcdce1f1bf03b24a55a5253998fdc8500cee5dcd244107f6a841bd93d36175d6f5d60ea6fb" + }, + { + "tcId": 2282, + "dkm": "1ca5954822a38166e66b8cfe5d6d75e9d673a470e979940a4eaff7900bf0fad82d2848001ad19f25fac0640a6fac126aa627da6d75464ed316edee8563691cefd7af9a5d71e55c7111d614859bad73c3ee6fe48b59c5de02b7a3dca17020948b83e2451deb8b73c84007377f8bf1493dbbc117eb7f289fb08f9674b265a71deb" + }, + { + "tcId": 2283, + "dkm": "a106da21026f531ecae5e00e8bec1be853c20d9f6c9c82698d670f2d49f2ba91f0d759a2082ebfd0f7017577081fd3a20c9c6dbfe0de9e62ec1b14cee4932e2641de561bf449b98c2a42fbd5fce61439415b7aa4fd57a5b4949f58f1507af40530656571b56ffa2dade31c32ef5d2290f2c50ccfcbfc7630c04a60e66cca6e90" + }, + { + "tcId": 2284, + "dkm": "9fc31b5953851bb6c1ec99208e745775805fb42b7965baea582152750b7639fb567f1a803c2b2ed4ae09509c06ba99b22683004cadd9496746d06246d2edfbcf8c3d6220a0a69f60a633a8afd7c8d0ea4a760929e7ec6cb2acddedefbd06f7073b4bb75d897011ce088fc3bb346eff1c688b4cb08ae4916f2e8583cde32f4dbe" + }, + { + "tcId": 2285, + "dkm": "da083b5ef522ff0ece7ae47e4cef22edc827cfed0756c7ce2310c834bb4054b12c816e2d9481a2ebb817241445b58b4a3d78b82201123b003f6303dfb650bdb5fb888ad34df147554ffc8ab173401d96a3e0c16c41b840dce4f6274beb2854b0bce6a02dafcf608c585833e12bb6ed4a12681a15b92760b3f4378e367d2c001d" + }, + { + "tcId": 2286, + "dkm": "70aab0587f7d431255960a2284181184be9565ef531771a0248bc8a2ff13b9d7f793521ba7ac62f314bd27ca13dabf4a837064dfadd6e68dd8bb7491a79914e26d2c906db75c5742c218e8d243f9dda03326ab002c3fa28e8b0b14e92f4e2579875fd05565747de09e082e5bc6ed44c8d7c9b7fefc1151d195f5d24e03be287f" + }, + { + "tcId": 2287, + "dkm": "8b869e203afd25aa94dd675152b1cf7c2dbc25224bec66be16b5c89ab5de1276c64543b2a3c8c29576ecb60daae844568cf0c05550d572ac5ae493bc9160dc9e8081f3ac16b7999808867dadd8a119e50ce4f47dd21dfbdf6f9a47d3e9985444e3877f4e4cce23f23b36f63373acdcfdfec9f2343d5a8d76e98421ebce6867ad" + }, + { + "tcId": 2288, + "dkm": "2ff2306f6fba63b13a98f4a0b6201dd6b40f6e818ab8d3f9a71af10c45ff4b033c4e89a8ddb5756c0f6f099ca63052d140aa0c3d4559e2c40b84688c68ccdb00852ec4a545e2fa277937185d12ac95ce13e8b9678d707384948626297f25b9ec47705fab090124d99d9ce6b804ccea99229b2da9a59590de2f266e16f596427b" + }, + { + "tcId": 2289, + "dkm": "bb8937f50c465cdb508eed105bb7ed6fb8fb477fd0b3bd73740c012834161bb41aa368eb3e142174374f3d3d5e883aa52c6dea3626ef99d2eee8bb3c973f1348418599b0eb2b125a099e977bfa0b1a44e6c632d7e101a5d904aee82a939674aee077e6783f62d0493e5f79cdac9f73c16ec21cecf18e76c70f46a7519f6f574a" + }, + { + "tcId": 2290, + "dkm": "b5e370988c78542ebd744c6b802515c3eff58318c19023628a33a2530c84d64089331d022cf5dd19bb5971ecddd7cf79c479928fb62e16061354330cd56ae5e8ee53d9039e14997d16fb177f5efd6a8c996a166be7786fe343e984cdd8f3f8b4d619212b64935cd4d82c157db699987e5c3562401ebe591b1ab4a8c530457ecf" + }, + { + "tcId": 2291, + "dkm": "5a9c5bc1d090851e420f853b2d75de9dd4c04ad1efe2d8c2a8837044d5f7219a8b484bd5e0f85db53dfad3e4a8c602a17def1f0801565de9249858ac9e83e9d89c274f195053db4a178c117aa0405d53cf79d61786315cf89ea85db9143a2ae9c81e49fdaf3adc6cee663a4d568d2fd107f9d663fb94e1f16d6415deee6d26e4" + }, + { + "tcId": 2292, + "dkm": "c94fcd2e89d71a099680c5452c32560c9236554299730f7c4fd8b97889a1ac8a484d066df1d637985949a2a97a1b088eb1c3430e9bc3086e3184c545f66939d1336196179c82fe3f73e3f084f267533594c99033266f791e02ee3316f673c445cef6e776b6576f9804d7e6938ed0bc80745662f805378283cd73fe8aa066f707" + }, + { + "tcId": 2293, + "dkm": "3a3fdfa1b4f8ce08002b07c8a55c234e547a6f5aae44cdb4cb7f9ac88e8048c47e5ebe671263bf8841709e35d5c3c2ae44cca41255a6b398e82ccf77da021624bee44285be96042ef25cfa3372ba22b08b3bd19edff9a4219b58aaffcc59504d68f0e869b0569492e6c8c2bebeb20c0066e29ec7945ea4afde2bc66c3ce8a578" + }, + { + "tcId": 2294, + "dkm": "96291791f508aa549e7000684a642e2cf2dd1f9d0495f9d9c5d2c88b0520cdb7683b8d363373848a956cd81daa0c1188f523c6d8d0111fe13bab127dd6e767187e9c9d52c6431dfbf490b6874b0e52fb23aa1f6bf22a1b7ee8bf9f286b95febc6ce544a856ccc035b80c142b57b6b0ebc5048fd8e767f3ea70e7f9bf64c9e794" + }, + { + "tcId": 2295, + "dkm": "d84bb9846e9e76032613372944e57e18e58a06fb74634d8a0ed51322a630752080d88270785db8fb2a1f4de33a6ebd5177c8bc90c617f1269e36213adfbff4567eedc36208abac8209e88ea1274fb2113fe0dfa27cdf8073ceba07a27122c2df72c492df4745a9f34bc7aa764dd1c4a0c4763379dfcb3b009efd4fcc8a28a8e6" + }, + { + "tcId": 2296, + "dkm": "fa2a3cab847758559b0df979c9280f5cb313fb648b83d5eb4008cf763e67dcf72e4eb8336ff92c2d05a332914af48f796e8c49ed9b91b9d9496c47631a471e624709ea4f2a00178a339bcfba2caae34a75a99c42068ae01dacf961885f38a7686d6a3d41c1c0659be08165036e08a487a2d75dcd82de3a9e6bc37771fafba306" + }, + { + "tcId": 2297, + "dkm": "f3310d22f5ce1be234c512e841b5434b4cc011c63f6a4aabfb78eb5684923e6aa09e66699e2505a82ac0faea35573e5dc32dd220b98a85157492cbf5ede8b0c9af2a77acf2b535629f97e2661bbf193bd2211f9e0b7b8652ef37ce9f84a9d26d56f2211ea32413358ed48a41ebc2846e11d9720b50a8a0c5f5a25d55fa2bbead" + }, + { + "tcId": 2298, + "dkm": "c7fe1ec8e0257bfeddbb9356f5d19315aed7dd7ea3d5354c0c985354bc694251df8e24c36e840d965300c13acb35cce712439485e151bc4a461c9795cd68c28d3d051c27c4110ab1fd5b3765426f9bda86a5dc6e6676c1c8d04cc259fdb77089cf0f9953c77399743d03f6adc30de0febfe14d376f15408da680ac1305d9a0ed" + }, + { + "tcId": 2299, + "dkm": "52b993551ef00e0e5952e7c2570a3c32ef4b02d3b07127a645d6bf923eaf1aeb5d18f913158439d036b37fadedb6520bf43e4ae3317837f17dbf1cb60d69e33b64132d0f63754a4741083e69760019a073b013069be2f9f9d8a26014fedbe7cdbba1c8bebd3089f2bf1f57415792f68809cd2790b1a76fe80dc7809d31a3a0fd" + }, + { + "tcId": 2300, + "dkm": "2a0069dc87f48518a20e46c5716ab5e3ceca1efb22180100609e031be3b34766b376f77a4994f8855e55b0f063ee52bc190c6984f2e5cade9241e35ed6edc1d1ac20a3b3ec0689ce048d96f04e6d577903be76bdcb8379c1e809e8fca71053c5619455c7ba4c62fc1ce802b494b4e589a76c2fbb0bde6531faf98160e06f831e" + } + ] + }, + { + "tgId": 93, + "tests": [ + { + "tcId": 2301, + "dkm": "4ff24a1da70a3e825a5a6f5285d9d7d66b1fab90109a335c7eae87e0eb5e2188f5c65ac2c9103fb500748c5d3b48f658f67643d5d023a1644ee3799828165c175f16d479b2d71dd1877ec4c2963b077a05d6278c9591c50aa7467278a924b40531bd95389b60306c78da9dfc5d954448154d052becd9c97aaf0e4c0f84edecfe" + }, + { + "tcId": 2302, + "dkm": "da3efacc7f6ccaa39c18ce99dba894a9c7c998f32532e03b7a4c346f7454dd459a5ca7ed8fe8b5b48ae2287350e065431364fc218ac3b2f49fc95b2edd6d2c35e338eedf442589197a753ad076e1ae09441b0de4ecf2a88288674e324c77593f1441eb1262d2c3d472c03fba621983e701a51c545a07a6567f2bfe99e4e278cb" + }, + { + "tcId": 2303, + "dkm": "de33da971eb4b77534c96662f1fd8e35c7f33242fa7907ac2cdd850d19297fedaf921d6ebb5856e18f590c75ce67df794566f38314a8661baaf2c6d1d68787e248ffcf9a6768f3ec1747c9d2a46dcc5dd3ddc55bef4e401a66857310493c70c4124b2ddd8690758c7b03ca1b6520f26963264c5f9b358e2d0b823d931a6bea7d" + }, + { + "tcId": 2304, + "dkm": "e42454fdaa0c79a42645e16a7b970efe696cc42defa6a475100e7486b39d17c4d2c725cb1e95ed1add6b14c491ad2a69392e139ddd9ce63c1934e3b9879e21491b3db9efc202d3dcf5bbff56d5ee41f46c4a597f8588713344d39a476aeb7b13d63d6c0deba2f793aba417dc430f1bc1196ed48781f13b46a79dc4209a152298" + }, + { + "tcId": 2305, + "dkm": "469a1d431e25538a8c1e79f70846ea3426d0cadb2d1f99014a24b68ffbb08e5933938ca9de90c553f38129efd5695e51ef6223aa409775c17a17a90aa01f390d52c1e7b08aa7446d85e92e3f8f38095e8f2cc06c7059138b17f64dbdbf303c28d07d66fdcf13ac6f8b5e9c3975433c73d9ce2f344b1f0cd4e4a4c5880175a1a1" + }, + { + "tcId": 2306, + "dkm": "cff4348324a8f69bad0aa03910e95a96eac39bd074c33784888e6d4cf8613b1656977f8754d3ed0a6c70d27d80418d834b9bd96c0049026f92d17bb68606278eeff67b428948e5ba889667e65d14af71c3f5ba395623401080bb6ad310909e5c37bc1741c459a1e59675d396bf6345c75c5d7b49967836017cbb2967ed801b24" + }, + { + "tcId": 2307, + "dkm": "e0eeede197fd8b8ac423b4947beaa3d0f274fa8a1506a89213425f712c98c2b8dd2251312a0b6d6dfe2c7014185e942722238fcf0ff6adb953693c28665c61305539a35b9db66ce06585db3311082dc8f1572f1e92c44a9556cd420e88e990338b0beeb3071e006eaf855cd482d21707d7641daada04b4cf632e4ffcce406ca7" + }, + { + "tcId": 2308, + "dkm": "f4b7d5e04f301e596d7e1570d2cb279e4a4475427f659b8896adcf486276fd820559997800192dc47489ba0221601883f3c70195b6272ee34735f7c07fa9b16f363a65ea9c6d7d626b2038d8cb53c388495b2565857eecf59583f7a0bdb31d2638cc6a923ea9537fe4e48d2459c00e734306261861b498d129c5947374f61abb" + }, + { + "tcId": 2309, + "dkm": "94d66f400ed11038c67725edf0563bcd0d0eb97821e714b3240c352e79593d25849fb91883400064ecd876bbcbbfff458a50363c4a0dfa9796ead0d905f5fcbe35cc1ab9ca7a82ec9ab354c11518b2f338d27a0fa4660db29a608915bafb44e47f2a2a212ec048f0de2370ec06d9ac25e9a46f4fd557f5183a4995886f4c92ec" + }, + { + "tcId": 2310, + "dkm": "6d4e5dcd41a71fbaed6114dab52530a2f88e788e150ea0bfcdd1f7c4643a6e5de663dd8bdcd10c974e80d8de63625ebca80f63c32e2bcef69cb777653b47408d383b30f7cab2e0ba90965da030e6adedffcc5e9e23b82bcb65608115c4dfc4bcba87a8fa72989cca9ce47a7779ecedfa0ab60c25d7033b40294029150ce6e184" + }, + { + "tcId": 2311, + "dkm": "3148e390654b7935098fe2a689543507113c4fe3a6edc48283eea8f1c263f23f2869977e56240dba5eb5dcc6c12ff7afc52dfb5f5c6d36bc1f04285030325a8d03e75761098dcd2054bb5d04545102831cccb92bd00dbd93df4953e227745b91a5057c509342abb60d23a1ea8d868d64c2426bc7bfebb7e229d78da6f22a2011" + }, + { + "tcId": 2312, + "dkm": "caf650ac7ebb06ac8bfbbbc9798798f61d84f8a4b56fed8e933e1c507b08e7bdfbe9c1c75a108f7aa7ec782a89c01ed5e2c6577647df0e861438e53c20fcfd0ea078595f211e2d096f2f3fe71dde8f7650f3e27908666ab1519e219ff0b1075d427c7795a07c1c77c5c7567f562461fa62ede601b5a52c1de8f7ececa4f7685e" + }, + { + "tcId": 2313, + "dkm": "8f2c035a6323e268a0435cda27c03aeaa302270d96d163b7c6852f713a94cd670eba5828fc8ca634fdd4ca8ef8d483330c6c9334d91310792ba135577734bd848a0be6d14ca12e2cba8f4c84165524c0318f66c2fdfcebd8f9c8a8f070df2578df7cca08f2637e6179d837069d16ac88a81aa084162bcc1e04c948e2d3e0316a" + }, + { + "tcId": 2314, + "dkm": "49d0f4be22efca2fea8436d7466683b36bd458d67eba5a53057033229ccd9f7046390877d15569a2944c4c29cfdd1add042ebf57b8553286aacd9892af5d7158fe108df68947d14be736b19e0d201c4e2ddb3933e860fac32d07e68cb8d4c230bf21828683623237161d01a077fd4561aaf8fcb220377a66e594c6c8b8ddbb9e" + }, + { + "tcId": 2315, + "dkm": "87c86918c4a35d0922fb1efbd38e6ed4647f250d8ed80db9f14ab52bb7c9fedff2a5134be185fce40802a80c64b6679ab27e06ea71357446282e25da0a07e5c6832475a00a79b76e42befa2b0c40b484132a69edb4a991ad21612742527414237522e311950034e6eae3878c3da9c609676739b5bc4712839946f8c7f4a662a4" + }, + { + "tcId": 2316, + "dkm": "3026388e00b56ef1478fcd58feb67bedf4a3f35932787d714a6f43da812a4ff1b449ec123fc09b07930c925730a6a994506eb244b838e53a25e72b9c7eb04256d9b8435fa891c208171b554d42a3dfdbc445e9cf7fc718bd4847fcd86ec8eb4ebff522d3206251fd1997e46456f9e0df9f63d1730ad26159e73bcf59f9b149f0" + }, + { + "tcId": 2317, + "dkm": "4a2f2aaced73722790ec3b16fe9d23b9a50ad6ccc22fe8f84f1c053b83ac1be7914774100400a0132981946b23a1584afb2d368e76c17b676eaf88e6b106d0c01d9950dbc56ec9000bf75c1358c096710d6725cb918690e2a508ab4533f8ebd437ddc4d427c7647f8dcb8178c25dc99af00ffd24154d0eeafea4169dd9d673d5" + }, + { + "tcId": 2318, + "dkm": "90e77f321cf3c99ad78ba829bcf16d60390a4464e1fc78f54002d30dec4532b83be8d49b0324975c202385071d83e259a76261a3c5e1ca45eb59e93ed097a66ff94e23243d97e945373b3369385f02aaf955ed1fd032408b1d5fa804775c0440ba011da8cef6467f5500554beb521236e2bbf3941470a7dc0a57be78daf785a4" + }, + { + "tcId": 2319, + "dkm": "e2f5bdc71ca111376a234e31b40be92856027896c76fe0932dd1ed091b30d454d77316c37a609b8dda8f1cc3f0ddc6b39457b9659206bc04373241f6f3b27d76fd7c3a4e99b9b6f362914e94fd96ffe64f36f338c1d271afd905da544b7388d0dd336688e1f10d2309bb34878c52606618aa1170a792bab81b4f107b29e8a5e5" + }, + { + "tcId": 2320, + "dkm": "548c23b0875c43af3d65ab9e73a1fc1f3b01b3f44d44da50191f6b090455a2df7ac15caf62a1b58bc9b9332b95813fa5f17b11f9f0a6f301d803c52da5e41f8d3f66e3af7d8905de64c452a140c2ea755b0f551a4bac92e1b002e4268fd58381cad1ac5398fe6b532fc43414e15dff10ac17998f1bc2a00814ae89a8c5ea1d09" + }, + { + "tcId": 2321, + "dkm": "e5d93ee36fff6a9cd4ca760627f62ce02cb79820bacf22ac007e6824a39e1c4539d577b864d87b6462ce0ad6767a8f73eb7e0695422bcd3caed2945e9b058389ddd3b44c63c7b9e0087647c911fe90518deb52f1b7c12cb1d0f98f5f99ed370d5d1e1eeb1fa6e3a3f645e06114528dab097556877ced5b1021d639b9e5f73a50" + }, + { + "tcId": 2322, + "dkm": "625b8889a8f350d871645ed2079ea0c17276e499bd2a3f100597b7e2e60b9dae0ae4ad7aa5abbd82a9d38230bc9df8aef0ef97fbc647bb9853158e6f3c49a98de452abee309912c73264e3a04f7762c366fedee8cb21ae3ae520ebb6fd9ba466902d093842d67fda838a421337cc1fb938963e05a8a978fc3542254759fe42eb" + }, + { + "tcId": 2323, + "dkm": "549f2129bee557d7631dbd369c09c246f6380df8c449ae53e3b0c97753d306b112f1ce054bafd1e644640bbca5b2a02849bb0c482b7a231d1cbf7466f7fcdfe2a9c38df70742a1953ba42217b31e6ef56c5531368197a7b9da3464b21eeefeadb0bf7232ab69bf984159d1af9242043b1b37a8501537a5207ef90091ccef641d" + }, + { + "tcId": 2324, + "dkm": "f48d196431a190ba7cf4ccf8453cb86c4b931cfd5d9755dab31ca43e7fb8cc72bd656f62987cadf12e43155a61c5526e368fd4bedce170d07c1f05aedb7eead81e19f2601eb222e954b89590d9685dbddfafc6bb1074439375978a70b215c58a6a99af4154660750ddf636cb3f5af4a7dc952bfb519ff4bccb1d604df840ef1d" + }, + { + "tcId": 2325, + "dkm": "c78d4afd3e6bf21d4804d951f8f8d5226a9f464ae4c714e74f400580ecc3efa02f02d9042d0702b19170cddd146b23fcdaafc9f078720fab6ea8af2845ac100684eb4f7630e9809c92d7cd51e11537a1c620b621672d9aa7cd4639aedc59276a4ed890a7ca71a733c02005a25a0dc791690cfce1cf30209fe2f8838d390b9d18" + } + ] + }, + { + "tgId": 94, + "tests": [ + { + "tcId": 2326, + "dkm": "10d760e47112f78fc4eca672c6f94b320cb2b7b79607e587947bcd634aac216e8ba35c5664d34326291d7804228839d8332fa7945e5655c66ffbec40c2cc4a49f191294a4c44364f2b9d8c27fe7681878928ff9e29337768610e445e8b964e6bd78a0a07712c4b7220bdebacd6e1f43801828ee62c26c906c0d736d467e0b360" + }, + { + "tcId": 2327, + "dkm": "f97e0869d223c17d9450304e4ffe43f1d7f679e4a691b8197236c04625f968373375495bb243946c6d76f304b7bc9f60d176498b9eac30327beeb969d2d24eda6783581bdb8cf73c0c408f4dfd7acbe3bdfaa57380dad5767acadf62801b2c8db468e0e4afe69f4d5c737f7c40937fca54b4db297ed3e3d7d853caad3d26992e" + }, + { + "tcId": 2328, + "dkm": "4d17ec324e19fd3def3159aec60798d5be36c5d3109ba9420b179c16a128686db83226944bb537e2c0625adb01b827563e5f83073a804cc7a87bb0ad635802df02de7ca34b789f6486395209a307396482422ed6b247c70c6e5d418c7a35d2adc5064b83d4c5a8501ff4acd5882f55d9f26ddb78ed47fc98efba0781f0337145" + }, + { + "tcId": 2329, + "dkm": "ba11e94ac683a670c02225a9f3226e821c7ca1295da12ca42939cdccfef13eedbd3498c3ada2ca79576178fea76f23454531272436926f907056469d4f247876389950d1970e1af0450070a772fbaea2179b6a5ccdbed6b246b5564ff0864e0c9e060cb5ac3e45cf1be74da1769eb2be1cf59a409cd9adadfebb0bd788290ed0" + }, + { + "tcId": 2330, + "dkm": "8ab68ee878412143393e9151f5f35fea1707c3eaa2a8b7cff99e73dd65460c80688277bc4cacff203e5b3c9d9797c3ed8ca1116d1af7c1e015b54cabc1b373982090d3a9aa564e611bc27490fce6d02baccd3a92e797f41e84c89b2426dead5c8f2112f5dbd18b40ea50b97f8de6c48da8f1eddc57eb8d3a99a6de29c37804ac" + }, + { + "tcId": 2331, + "dkm": "bb748a8bca8cc308521c92ace2065341027a91f8a440532d2c9004544272c755f47ddb6ea930a8859bd3b9d55a4ca4688cf55b26668f8235aa5f87b803e04612af8c855f2b9c7fe64d9129a4392398f49003987207066faf7a8e01f79114a54ac81050d27a90142c5e63d07d4b3d0733a6a0242fe168270d0e650b4a65277033" + }, + { + "tcId": 2332, + "dkm": "7452ff30eb6397c9808b4694e96212e7c7ffd31a07807593cbf20a5aae883feb28b4292b41c6499a47e53b46f940d7057b7405e9d7e6f4d91bbef974d1699ccd123056adeabaf496d7fdd2836b00961f2ab6c32a574e6b8393601cd59535dcf080ffbfba911c5e464620c73c602b0e1247861ebd7904edd7110ab2cc004e73a0" + }, + { + "tcId": 2333, + "dkm": "afd58a0db598f8cef790e74ee773b61e0bd02baa20a4633089a1074f26571fd3f58b37857d84ba1d9dca7362ada6e858b7b09b02dfe6ec28748afc6067518bae2043366378c5a1bfee122d68dffc832c3017006f496cfee3e5e88d57ef5b6c3b294f8396df4491a6de9839461be73dd371794fb3a5b11c960e30ee0bd1d8b994" + }, + { + "tcId": 2334, + "dkm": "d60eb4e6822a3d17e6998dbbbb548ccbb9039b27ab84870bf14cb99a833a83e9aa69311c16859f7b22d30aece2171f7d5ebeba30fdd3543db4f4f54beabce6bf53b9748235692aee6caa0c2ae55e1557dbcb5e5b2fb97d9e8095819b001da093b857875d6fcdbf989210d99978b13b4972a49cb0fb0d40a84b8728d302d999db" + }, + { + "tcId": 2335, + "dkm": "6bb040cd490079b5b52a7f110822aafc1c5008efa41b4405557a56170aa7c369651ce3c04b7552e7c5bf915f8c83e87cdbbdb1f5af23be3001ba71f794ed7c8bb9293bb484f13bd19d498e1037980a05db600a66bb7eb552a8e4821e4b3d88b5278417bfb922cdf9f111d737814acb267fb05f9fc6dc9a495ece139845879b74" + }, + { + "tcId": 2336, + "dkm": "dc001a285edefa2129073517a98f2c9bd428a73ef2de1d238d18dacb4a79d68df0dae9dcb188a0f8dde967b675ec7c8e0ee8456db31460024cbcbe48a9d4bc7cedec4eb967cf66966f8c2cab414b3e97d7cd44bab22a1d796447f7d411a5bc198d7cf9e2be512d9a5205f91dc2f856e8cb57e5866930e870a6322507cbddca7e" + }, + { + "tcId": 2337, + "dkm": "4c42bf0b6cfa9fb7fa1e47537f2a9cf96155fb9d911e12ff3f2db5e8859d46e2d455df5e02133fc4d1fc88ff22ed7e9dd50ade526a2d0b9e1ef8149e588f469bc12d96b0cd27b15914506e8b092e2f6d6826dc77404d8241112375d74a1f728d94aaefb2aa107f5b7a7253f9f8b69148159ce01fbc5a669fddb4b1403624e4ee" + }, + { + "tcId": 2338, + "dkm": "0e098d84f5ec47c98cff4e94f6e00419a66174c5aa49bf9cf44665480a97203f7a7e97b03edc1d7e900cb037beeb04d5ec2edb19bc35a1e5dcce08cea26f7d7148c6ed7c7d0c80605b64ad48ad0e8be00c5f6413fd07ede1a25288d29043ebf6ef23b010a13d075bfb59cfcf29067eeb5eff7a89a4b1d44c5cae6a7ddad756e8" + }, + { + "tcId": 2339, + "dkm": "08e6cc5d181cb557591525b8ccbc7977ad4f2d6239f8f01597c9cde4069b6cdb526564c7ca0295f7e3611964b077bfccdecc18c8aa571920c4068e72b77fe58086ce978eb53f57a9bf23dc2cb9153a28bbab22619ee92ebdfa5b87ba7c77c800c12c78bf0139a7d509dc127512b2dde08b51875276d3262e7140df896aa57aff" + }, + { + "tcId": 2340, + "dkm": "83b939ac0eb072fb8d587daeeba9d9a587df41238e91423d3b286c2aee1f591781cf3c1912eacba9bd9fceb8fae5266ccc2b9e070dac740489e47b0af4da6f41851f13d1508f9722ee653bef6438d326b61cc0bebb5a23b733db33215d2d9009c9d71b1db9cbbee42771c6f10a4f7584114a0a4fc76c2c8bb9326294b78202d3" + }, + { + "tcId": 2341, + "dkm": "c2d69748191a887ecc117ffb563a3193a0187fcc10e8e13fa6b2fccf09c7c23d1c4f08a70a44a7e08a79744ca9c9a5b50d6427c098cd44a4358137d708f6ee683acf1494c2c6c1768b47736dae4ee13904897403fa971827901c8d86e010c4e012026dbdfffcb71df163875bc3cc87c0c358d9964405390652d243613fcd9e6e" + }, + { + "tcId": 2342, + "dkm": "8f56769a28c7d70324d8f064029f351406ca1d656ed56e00d6a11ecaae7030dcfa668eba4c5d20f0c88f31f7a994a4bb0103b10ea917f1057bfac1f94c48adfb38725eef7992962225c1985dac8fd3f65dca25633ebd98f6c75690a1ff90bc221db4e16ae0cdf2a1dc3a560272251e52d90076edae3cdda323e73765fee82943" + }, + { + "tcId": 2343, + "dkm": "3b419dab16c5bde7a4769b434f8a1057158765e1e47a34f64c01eec08d3a256216e1e2d39594c14093ded82ea0f83f3a738e4fc923799e1f13eddd896ffce52d8edeeeb6ef9593119197004b9c5eeafbf2c986532e41ec98054dd71d9136693f87ce26869dccedf9525322e161e4482969615ee729d115640505c4aff5a373f5" + }, + { + "tcId": 2344, + "dkm": "9a4ca3d75a978df30e997c857d5b8e6ab2967b16d554b29d219443d94e915244d5d1dbe27bd96a6c148c9437125f94c730c6aefccd07cd927c75c4751d5948272051dd1fab42a3fc39f534fcb5698a15c70c086ef976321e2b581131245865825642d6075dd1903aa4388e0941fb7618247777717be0166b36e2587a462db43d" + }, + { + "tcId": 2345, + "dkm": "e6f2a5ba67fdc711c3887e2fb324fb721ae845e2b91dba52107da77bb35c3a121484b5ef2f90b8a437063554d2017f8cda1454a7b9aeb4f7034d77dbb3b6639ba49acb07918bae7170d06c2b017ca4c199c1f5d5476941299124f3a3f6d3f3566eabded7af0332d629199c390bcd7dda03a412d5f1f49f93e62d792bd639abf4" + }, + { + "tcId": 2346, + "dkm": "688faa283f008da3fa7df4231ddd4e44193f27212b23b5c15bf4c8b86173e958d1885064b5c65df0f0a3d20645b280e9f9436cdf8e310d0eff680de5136f825beae6b182f66970835a216620e02b9d8405089861a72b5521c07f2bc9f6e5ed7ef844eb095509d85d3160e5a0055224c9ca613eb0a379754bc529f1b81ba41771" + }, + { + "tcId": 2347, + "dkm": "9a0ed752591fb89a912c3936d1b34314c7a65d8e28f7618b7aeccbcbb165f1c6f96636bc34eea8f7f153ecfbf984688b89f4ec12502b75b0b3309066771de35a4c930d222cf6aa7c5cb62acc4653167f8eb57305b48af389e60371a181233d196f1290c5b3fef0e8ab0572c0387eff895c8c397155e1247c1bb937a168533db5" + }, + { + "tcId": 2348, + "dkm": "0dd94cfa29d445c7d6184bcf547cba5a19e0df5507f6413a68d3cb786ce8adb63ea35c33b3ae679ec806ac984cba863b84b0f292233143a48cc252bba4d6f5cc4039fceb1242d3f0af4cb2562fb852157d5a25ef992eba9482f41679c844f4d7a87e1af46944f8e7e0443680c4e5f77ee234b5d937c2dbc3e75fe767b94f447f" + }, + { + "tcId": 2349, + "dkm": "006ecee7b446eaacee77edec07c6f287d45303cf7abb724cc6bf53b784d9e4272c01ca2c913e0fcefe14058fa1536c731c0748e2e9b3eb6886123ee2d980c9c4f0a2168c509ad81afb4847e93405e68694249aab48212e19ddef10301c4004578259cab1d378027dfa6b2b094c1459d6d3b74f29b367fc08e00d0bf82c9fd5ae" + }, + { + "tcId": 2350, + "dkm": "9a5b1083d142380c31d169093968bbd98999f9e95b248e61e683be3df44ab180462c7b21f7aa429c3c5847eca0987793ea36f5289dc627f6ba244abf35eea7a7e3c2283870c92b3cf486f7f522c498967d52b694beb163bd3d9ce252d9c88ae780c30ca66b3b6e5a03b19e491d86e72fb79b1d1b9f458cc646014cc20cae4854" + } + ] + }, + { + "tgId": 95, + "tests": [ + { + "tcId": 2351, + "dkm": "20580a650e06172b5041c5a759b2ac041d06b05f644f64bf395fb764887083c237e2d5637fb7439f2d6a6f60271d6f3ced3501510940985bc8f886d904ccb5b58d8947c3929e83a7298ec7aa4856443b9b2ebe3a2eb0b9e59a923d12402dbcecd7166d87ee217dbc7ff0cd95eb4aec3893975c469ba30ca836ba62188ac5d27f" + }, + { + "tcId": 2352, + "dkm": "9f2502e36517216dd167a568684f140b78f55f2429981071090d8c6e6b12c1bfd37d725fc4571ed70cd095866cdb6c5494e1d15957796b05261de1e841d094dfe7ad462eb3dc03898ae283c976d4e786584538e4ec37ffbfb75f5b3b60494727c2ae434984849de188a20e086fe2ed8b87021348810d9eb7c3a41f4573072813" + }, + { + "tcId": 2353, + "dkm": "c749e8d78002b81adaf4084102c578b9d93aeb0484f38da76042aea1016b4cd2b9b3a225a549d389e1f874582bdd696eb454bc1d2b84373f118054699c8c05837b9d5eccfa34d988c60befbbf3e7126a416dce6febebc874ffe805e5a6c22a6c309f8d99a105e7d562f4a0b5678a9bdf3d945d0ab819f91139cc998325c87a88" + }, + { + "tcId": 2354, + "dkm": "e5bb7f4d5ed7c19941bf80a2dd538cb42841a3b6859371c4ae382c86b81acd365aeec18eb47edf9ee31ad15493b151f18198f07921957065f8d5aebb9c38eac900fecfd45ca113367d8a97fd538b33081ae62963abf1a55b346766f59545ffe1e0f85a61f5108c1b9a4c52709a2a432686eed1dbe410365a50f5d2f115cfdf0e" + }, + { + "tcId": 2355, + "dkm": "2ecc8b6c284223598801c8d14c0d86d5174055dbe18f76c0dd7c8621a5a737a4a16876543c82ee6b1f1ad81723628dc8d3dd1d11334fcc4c8e3a43839b3b9532db7d2f5aad9641421091e599f14a08e056db410d49256570338cc3c0cd7948391171131511132477f8a2549873d2eb6ac5d8d5cd3c61407fa87389c1843babe3" + }, + { + "tcId": 2356, + "dkm": "72ad6362a0c0aa7ae9a61a52bfc5960d42bb1a50bed335c0bd28c95fa1701dd3e3e58fe696831b5c3e9b90de3cc35c1085a229a3b628caa4607389cc4492bbf9f984cb8504525fb0eea419e99facd5fb510bf5e26f07d5c5a8623aa00e1bfc67f5e6790489ff8ce69ee7dac23e22cbb3a759f3ce6816623df34128005dbe88f8" + }, + { + "tcId": 2357, + "dkm": "5af2b4ebcaa01c053b2e8aa8fba8e8a7524a8b308a578f90a000680c4753e425682ce96ee58bbe631935b9e9cd072893fa8d4e16978e9bc72ff4c499496113fa1ed77340ddb8f34c7ea98bc9395cc5278046b10869ccc580b69b1d469197906e945d5f3965f7912d71528b0a3d2dc553b591006b4a4b280e3eed87ead49481c9" + }, + { + "tcId": 2358, + "dkm": "39b92d147a49f53607aa05031b077a6fa0b688c7da78d8c40ae15ecb0e5d3a17b859d98c58ffb89f0978395ff6f059eebe86090ca9f2b3b863d0a60dc1d2065e8a7d9527b237864ae0ec64376488f5507d73ec953c5efaeccbc12d03da2e10c0c7dd37233b5fef7606936b97e8b889f82cf0f4c95e75b0c7c7d3035286791464" + }, + { + "tcId": 2359, + "dkm": "7afda58c7b1f0d1547cb5ec35a0a9c1f315bde5f82d1269df6e44607f3d3055de3ad92a832157dc878ee65a9da3ea96d53cd97f7ffc4327e1d5b4b1cc288b1d498bec5654790c8e0348dfd4c12d3ca959963c92095e8a00c92ab1748f7a9ccfdef49dcec644cf3ffe926d219b8211df962a5833d5d085a5a2068fe95e4fc9be7" + }, + { + "tcId": 2360, + "dkm": "eb7b3e7545798fce309f3c3f17c8393fd9243e360e4afd3830990b3200e09866e613c581d55943faff55d062098e405ac6da576e8d1e1ad64e7583bf3441cf03b87948989cd456e861297ab84dd9da778bb3992cd38ca5a3217e53150372d72d0e522c4fac8a7feecb5586256869ba624986df6a6f3006a5a8bc854941cb717d" + }, + { + "tcId": 2361, + "dkm": "2f4f92139a1408d0adc9ff3c0dbb05de79300ee8869d792faf8be952a264265fc96c6ab94ce6b05c12584a9751d60fd774a073986dc3e5acd3d4cc07b2a83903b08b5866bd2985eec1d2436055c812a9c69f455c7fa7a226f9ecb28f2263392b14a36682f074182e9175a599d46f65f3b58789aa3cf3c8a6661f7385efdab5bb" + }, + { + "tcId": 2362, + "dkm": "b9d78cff490441ff2c84bbbfd22881619680d08fbd746fb9d72d1dcff6aa49f6d74afafe7d52568822609565313a070ee33c91c248379891ff2290c3da0e5f7ab67bfe5d27b161bfdfe598099fae2bae75e811a371e39ec2369ca669179a1355d270fc3c67c7253a005b47319dedc635e42bf387dc47a98be3bb5e50a9899f1b" + }, + { + "tcId": 2363, + "dkm": "f1ec46d64b195c567da31e0fb87ea7ea841362fff699d8cf80c4af203a49199556d15ba5875ad2db48d075f8f2ad5e453cc0874ef9fa223dd8191957a2b44f5296062d6a0fd85989c21550be92e3d6b3242d413906151b43b6e787092fb69c84d57aa57c0b60d9e2313c9a14925ec22aae0fabd381fc959e05cc954621f79850" + }, + { + "tcId": 2364, + "dkm": "8163cac18557bdb9d6ec8b49713788ba42e5369dcf1c0497a6c02cbcb1e28333f2da32a6a219124add00941c931609324dbcee1abc3c32ab8824aec9702bdc1371fb3fd7bc06d191effcc6e09958cce2023b8a51df347693f0845b6d6691d1a876bf3d50e8056afbd1d3404103cabdaf6257d1e90e24db709eb566f3a01c543f" + }, + { + "tcId": 2365, + "dkm": "49e3b0dac287307a1aa133e990bf4c16c74686830bbc1546a56e84c26d21ffa417604745cf20384a5c6c3ff838643f21d438874b882b665b64b059b700865f0edd335545c20eb52d46a46855a6dfc1fcd5b39b55497ccf83d0ee554a97cdf11ebb35c77dcaee52adf1f9d83b1e4e0d872c18df4ff3a70fb2a7fcbe56eac756dc" + }, + { + "tcId": 2366, + "dkm": "e6282da3cb207a44e9542c1fbc31eba1c094a945e311240348d58afb59fb13431e1600dc0f5fb16be756ef6459e242bde0a7179f12c1d64eb8fe4597861db3ec2baabc3620bf7310a9049cdfc530d43e3c1b39e70d486df9bd3e20349668e6962b16ce8ce0ccdf9f1f888e86a85d4d7a92b6f2b2501cbfc5867de6b3a80197b9" + }, + { + "tcId": 2367, + "dkm": "45894ed40c6a5e428ce4e4dd1c19633325d886cc85af71e43c6cd39f83a8fcf7b08f4f9dd08fc631b23ca878a8dffda1b394922f1dda76c8938d34e9e0d07e5ad5a0ba65ad6a1a43bfb940185cb42b16c3c00b15480f7ef5c72ace7fcd07b9651eb0a26b5ac8f4e8c0682d80ce41bf974dec624b8e17431b361b63e7985654e9" + }, + { + "tcId": 2368, + "dkm": "dad5a77fa13c4a6ee53ae0167f2135f8dbeb5801599c33a07b1e5656accecb5b540415de456885df56849fbee3e8f5bb87e19a702112ae5920308ad3e7c61c1d934b154a26c1fc499a1564dfca845ae302638a62f0e1a5777ff8d87843c6cbb01ae043afaf171bfc144bdc0ef96f422400cf4b5701045bda159ad053ac45dd65" + }, + { + "tcId": 2369, + "dkm": "4afdc4ac3d951376c0737fcacb34eda75ac3406a72e0cbc67858b5afda8fd0ac8d10d42792299549b5fa56fdf43fe07611279e1027d011b7af7472815dff4147fe9ec79582f8c325f449ddfbc8b20716aafc979060f7077b8266182f7fc2e0d831da436b0949c018d0e0b849c6c45dd52ddfcda62500449c4e5c701e961c1a71" + }, + { + "tcId": 2370, + "dkm": "504203f2c5c58d7827be94c38edbe185128aa0b1351deeeb99a6772ae26a4b2a1954aedf7c4c92d828657c8c7d993746ff9eebe2f1a094fe4d121e6100a9642d11d85b481152549fe762db38e131cf8b2718f812971edbc29213b743f6b750000592c854124e9c01fd8e8f6f016ca03fa3d446dc92f976582b3a4b2bd8656f8f" + }, + { + "tcId": 2371, + "dkm": "a3a92520d8bcb3804e52d54595706b285cee4d9a7b14993ad4145d7de064378af7c197e1a777a6623a9132d5a509098a069335a2f75383b4c392727f42d8040d46ed8363da9dcd118d4841c51ada294ff919effaf4570faa6f7aa6a506ad34f7174cd49322e0f4314967d8e67d6651dd4ddbcddba08a39d642b9e625bd2106ea" + }, + { + "tcId": 2372, + "dkm": "0b8e06f6309cc9719128a2e1ebbfafbacb0a80da55afb12169257f26d40b8f0818a614ba396165c01127022fcaeab5638c762fa78228d5ad3b32cc08cd0a31b69783683c78683712cbb5d9c1374869659e41e325b3cb315789f1ee63fa0b870b291ead5b43413a25eae9faa0a4faf703d9a948f639186d1422c93eef8c612630" + }, + { + "tcId": 2373, + "dkm": "48726418e447278bc287d38135012e09ece24aa442f0751ab3f45285180a8af6a5f228f2d8f589ac7a551c7908fff15930c3c96adb9ca31c5c851e91fe7f91b0dfafb6bfe27623f4943b22892da3e965f3b7918ef61813a81d2e592dcfe9d7aeae0a7eea046826c14efa346b165b060f423abc05f3671c3d513b3fada3c9f98e" + }, + { + "tcId": 2374, + "dkm": "cdfd0b3984b29bdf9185ac49e532468ea60f7712d11526b73d2bca0e759fb5ef1a5a3fa4be12f407443434236b6ee4bde27a3af49afdb04a8aafabf1394e3ba10e58266896794bd41b23d3aa09a08425d890e7e78a78e89297fcc9d3b94adf831a25f130cf74894759d75cce73fc141df8cbfac2ba04e16c5222434be6806e13" + }, + { + "tcId": 2375, + "dkm": "3632525ac0c26067965f50542258ba404fb2b927d11294b00276a948bb3f29b2300a4724a29d84b53613ad943b7197c51443a0347ba423a206f007f3c059baefd562fe719b72ceb9b01d975f5f41e405180140acb62b7ac900e2ee38a6cdbe8a42928438e0a1f843eb46002cdb4a4461d630c10d9fe25d16ec9459ab3ea34af0" + } + ] + }, + { + "tgId": 96, + "tests": [ + { + "tcId": 2376, + "dkm": "baccea9458b086835cd2e4b66c09f44f75cb5fd03ab54d80124f5b981a88af1b7f9a679fa3adb3e42c335efc8fd41a36c834fece8801ad0becd1ed586d487ea66cc74d073c5cb6ac34ce3878c61d0d22294bdcf7576830cb854e88271f63c6e70b2fdb36c717bbdf8f4383fcc0e5029f4f01c1a42b4abe3720aff9306595170c" + }, + { + "tcId": 2377, + "dkm": "1d65f3db446755eb40c0a0541d5fefafc8281b240f2c52b5b6736cf65432a5fbdd8758aca3802c37d54b661248072e983bc49e7a69534f7e5be70785be8fcb8f27e79f43be3d57550dbc55acf7975c0ffa3808218d7b9512d8eacd2045a7bcf4d4d8b918b3cbc420941ea27a596d9995bf14303e4fc2721cb3c810f86bcbf29d" + }, + { + "tcId": 2378, + "dkm": "9354322259bc89675df521255e3cf4fdf2e7318fd3d5a4994dcc1e51c2a9f8df892ad528df42f8e2532e01d0a1d8cb870ab2644178d21fc179fc1f8201495eca1d85b7671baf4c18e495cd99c9fe8403e54321bbe24269c3a7ab0c41154e5aa2bc8bf9160e922b69d2eb8d1a33c57b93441d0af39a2d7dc72316c94bb3d58526" + }, + { + "tcId": 2379, + "dkm": "c69b64bef28585e381afd2f8db6e0f6b65c6217b2b3bf828562d2f3d64e39e4d5b4aaa1fdfbf302dd0c35e4b6b70c206217516288c09f553bef9237267198d89ad3f3ce1406e2953e178b1e8b7012788f795e6ebc78e0c017118c4da5f68fcc9e8957085a33d0814dbd2e59f6d75621a2be76a4aca0753ba8afcd82743ad34db" + }, + { + "tcId": 2380, + "dkm": "da4b99058fcbeb11709cd286d117108a65f0f9e567fa92b49592a0a4755ca62ec581c3f488a92192cf8475ecef4942e5c96dff55e7c39b2a44b321c3079ac2ad35febd8fef5950718377944254474272dd209267bdf36146cff2d0ff38588c10a6bcd42cdb8bf63e319cc95845bb2194d26f9fc577cafb40745b4c9e4406f298" + }, + { + "tcId": 2381, + "dkm": "04e6a54039548dba132c58a43e550bc28462c477ca98a40b9a9596ad800ba1b847517e1f7b9e462e2c0f4cc745e03fea55b484492a1e0ae8409c9225cd67c53f26a866c7a1c6986cc0cce7048533a8b1744cb72616e4b031e2bc2cf93922a99bb3ff20f1e3d2e66394ad2ce74b5f9da0a033169f7a4b8fce91344ad79abbf2ca" + }, + { + "tcId": 2382, + "dkm": "1a2ac3e2cebadc6380b354dd711094894c1b4d86c9af3fa441b5b81cac9fad1e91b15301cb5be20ecd2d33326a475b1c794aad78b220b25aac7f6a7271f5e7a65c450ef052e4fd9df63729033b66a259249c2a334737dbd32878fad29d58dd3a973a2eac76251662cef1d04510ecdc0f0a69da1580aab2020df4d674b0117129" + }, + { + "tcId": 2383, + "dkm": "f7ed9eda890f530809267eb17e8378ebb14b2356bd3864b8f68df29728985eb0ade57dd9d1526aae65351e9b11585a35ea535fd3154efd778563d2dde436398aeb2d6bb2738c7b7d131aeb953ed3cca95b2c0b8c7e5f623fa36076204c8714679655160894206d984917bfeb1e3f7024a3144ea1d9363d85fe0e67216483fb67" + }, + { + "tcId": 2384, + "dkm": "677bc4a1d6b386afcf177a1136ee8e66161dbd42359cc6b71966713960a3789b9da5364c6a199fbca12595aaaefe62adc8c1cde7bb9fb6d89d10aeddbc549ef5804df595e95943d9352f972cf8b3cadcb0aad4c7886a76285c84bd655d61da73205c9e5c8aea71283e91eae91cd1edcefa61d79b93747e54f32a873646a8f200" + }, + { + "tcId": 2385, + "dkm": "4d785d703c06e496035747aeecb13c61dd9fa958306e410f5fc3a7d675e8764755e9d69bfce12e44350e4cbe4d782d7db1f2f13847f89fb562187c62bf3afa45a70ef1c8d2cb734d906be670811cdf8147b8b6dfba26831f1238eb088f802541ce316e99eebb0eb12c228252dbf6e410094c35f211e5f402322e8d2cf3c30b2f" + }, + { + "tcId": 2386, + "dkm": "14d64ab249814affd3f8b7becc61948471668b0b4b026db73ab0228fae5673a28bc3ed1bb84b6ecab83b96c6564e589f0b511aac71ba0f38da456022aa569ff77e2bf5bd57306c8fec03b64e925d911bdd9a0c497e9a0ad87757244f32251128f65ba02392ba1f406dbcfacb7f34035f4596dbb32fbcb50ff036bd0dd3dd90d7" + }, + { + "tcId": 2387, + "dkm": "ed40ed832dc8c0c06284497f5e7e3fd32791bcab2aa13cee13350da0e47cc575f307299332c6c968cec30ec74b5a6ecf7b239071e0be79c91d1b1470f4440372ae8642e92b5d8e84b5970f33d26c283cad5aaf512d2d314ddc9a296dd259384e9a8b42bc4eac9c9fcc7365587b00de4a82aca1367526880be47b73a6131cd046" + }, + { + "tcId": 2388, + "dkm": "7e05e3090a941a5d830148358609aadd34d5dd9923a15f3a38dbab6326bf96f7ee29fd84ce2157083e648e73855e376db47dcb3719bdef10bd0d669d633b96387b21cef5efde673b7ceb68c8b2aef45993d88c113199a074aae7ec62996ed94960d8f9a0d9d503c4a92206fe8b63fa4032d18a8dbcd62ea3ed45ca7f1a1dd9b4" + }, + { + "tcId": 2389, + "dkm": "2b5c76fa4e6269933d16a6965e13bd289908856cee80c67af44bbb2106d17b2a6ef1e0eea8231c7179f7659bdf6d1a91bc2cfb33a2bf1a2c5238bfe45c63a9e1598258cbe9e9aa044f045bf3355ddf942e344eb6b98905b5803199988dfbc2ead8f58edc2df8774416560f1b0e76af0b299042f0a4a73debd5f0a2b00bdbab4e" + }, + { + "tcId": 2390, + "dkm": "8d2a97b2f2e5db9586a63b5a62c626857f0272abc330608082da964ecdd15b571ea4f7c71b38a4afcfa834837d7dad764b4bf070fe6efcf1d8f34d56a48a2839bb762b02c30b456a5da0d94bc77b0c7d07b47fee7325c9360b36eefe3c7123a24977ca091306bcf8996e2d70972ba6431aa2bfdbedb65a709ea65043d489b43a" + }, + { + "tcId": 2391, + "dkm": "e8eb5adccef6aac7e01137ae396c79701e63fab447e92fc12a247e76818a813c8eec2d408960958aa935b375471b647d9e69744dcdb30bd98511c16930d13fd0f8459f01757626e7c0b292bac6dcd6f54798449dc9ea950ec1418d2a543660c30c080f5a6c52f08bb69da76e89d06535772deac087420560f7a07aa6948df31f" + }, + { + "tcId": 2392, + "dkm": "22ade5e7b68e515af8759d40603206306e662c568bfd71e72d6679ed594c46392316b87dc153a15f965a810c9d3fd6a66d767ac83c5159e95bfdba6b5b83d8199f5c6b465e4f2d41d7afc3ec12acfe189857370ca47d7f1953361667522fa6d3348526d243d2e497817d425a1cf794ac893cd4182f47de1284bfcd1cd523195c" + }, + { + "tcId": 2393, + "dkm": "e94703fc7a850a4d351c3a332da35ef7d0a80c0b0ae00c71c20f8e5ea70cbc3ce27f44b59495bb6ae3b7f7136604627667e8096b4071ccb8329b884ca2c51206dd5e28a345316194343241f8a0685369da545e68c1b97d4cf1a9e929b0b2a740ae42e05abf9054f4d10f24a1baa7ebaad3028cc74149e5d41b4bbc34a0abd4c5" + }, + { + "tcId": 2394, + "dkm": "31f7955c943493d2a6f3bca242060a12ac2a5b641777ae356c28bd2600b84a9041d4d29e35b3400b80008e12191513a4332d8c2d0e87535436a21df2c350d447260b1bd3c17b459a17bf48f14b6619bbbda3dea012f32e5490a86a37e141f1d20d4ddf3d27d0b800fa618ec70cbd8e8714fe6697217b08fbb06c371d5db1ce45" + }, + { + "tcId": 2395, + "dkm": "066fe0f5ccf5903df3c6f588cb845226fee24913fad6eb351acb79d7486a58ad20c31e39503d13c2200af7339e64b695f57b3fd23254ec4cd6e9d701f02906187e6f00c8e63f28b8773dac8a5dc9642815ca4a615d24b57eb85c21eb62e736c19b18948e494b4f39f1a441b52f4ac31c1a2979eb00a1b9efa7762008f4d31ee6" + }, + { + "tcId": 2396, + "dkm": "35e5953db3e2005dc19f7282089d6d3682b5a30e1b1beb91c755a7a2650b29c0b7e5c2db0d9b673b07dd63a9a7d6b60442328cba7e59964d644cce6ca3a6dd221f1b2ee6629b2647c212c82dfedacf794c68367649e9b8b2b1fedab28765852d6b223e7ddc3a4b0f59de3631c2a0d49a6e21897f98a6b2b4b7dcc2e88d6b1ae5" + }, + { + "tcId": 2397, + "dkm": "1fcb1c74795dd9fbbbec69a7bc341a8b23bfcdee96433e44f8c007923f0897da2f7a2684fb1d84bb54ceb0b78084c6ff6afe848a482cae2303bb225d974a3d264b20163a67a2ead755dfff48a1d420a266f146ecd2e4d355d5b5fe445956936d877bb8a48dd7c3d69b46558dbacee8b06f1095d380d1e6ca9cd2340d6ed3225f" + }, + { + "tcId": 2398, + "dkm": "ca6532f5d7384f72baf8f9154dc3b6a7280331f2e833827f5c1416beb660febfd0410b591e02b309236cd161242b9764dd6ffc9b591d7e9a4183168b3ea6a0d1331c963ed9b66dd113ee8f8e21b505bf3f7c3cd3e4e791eed013509e6915a07592e5a0b133952f02f2bfc017c05f23589c6f296eeb92df6dd190d0e467866c00" + }, + { + "tcId": 2399, + "dkm": "78dc5b226b92d2154aa9f127cb9a40dc00f956dc5ad382df369d02064acb3f0da86266c52a551f3120c7089bf290f4c0b81758e4f44e9e04826a21fc96a903f28fb2ff345b28cf6ed5ab1c444672c11d736d958b8a9dcb41e44a24a52dd32e52e45c8b0447663c7c9dd20885b16c4a251e3768cec10d0bb120de4591d5449d4e" + }, + { + "tcId": 2400, + "dkm": "a600748871960afb73f99760ef8925ca7fcf313b3a2c66fe638f156284a5e513d4a4bf1207a8bd7357ba653c08b53920370f7c39f84e7c7a2b2f575b2405d782a764a1ad799ea640da37d56f384b18c52a5dbee2ba76167720ef3ca415d990b8f41b2339183eba448b96ebfc7c2f1033f7049e1d2962dff1ecaf888d6c3bef71" + } + ] + }, + { + "tgId": 97, + "tests": [ + { + "tcId": 2401, + "dkm": "1feeb9bbc67bdd1460d7c3a2e66c9123ad1f4761d4e14eb9371c458eee9e7322ca0f21cf060d4e4cf7bd8838547bacb4f7aad54656208911120ebd1296a4bbe06a39a60e74ffd890061b1cea579e5c399bf2e51c91d6502e71c03645bc31ee782e06cf25db957ebd0f99a2b06b461dbdad9e826a05f655dc45e0cd9c39e04609" + }, + { + "tcId": 2402, + "dkm": "8fd3808ec4b80bcd88d4efe54e1736e9ac19e43b18e473732f98d0e4df26e7f67d918f84c9e322f7fa4fa73cccaf1ce9b4d9fb9c5e0c0d30a501502f0ac9e1203bb88b9f8dfb5ba414d4c6a60a1675053b5a1bcc8e7e326f481b46555c4c3867793e8de65922b6a5d420d93efafb20e698260e9b759c87833addebb9cc33e34b" + }, + { + "tcId": 2403, + "dkm": "98e9614c39fc42c17645935918f7df927f02f560ea87a240f08f7b05de31b57da9bc73ecaedfb009661254e131a946f9f38dccefa5f2457967258a02968ee8474978963c4410c994b3a63770e4caa5de06cb54a8058d510a1f31a5a5082b6729034862aaf234f0e869a0f79c132afd996e2117ae0689b69391e63bf521b157e9" + }, + { + "tcId": 2404, + "dkm": "e701e8d3e8dbbf1fb5aff5ea3bf41c03ca08208caa8c8e673504fee06adc00d48a2853bfd8e74314c3e8d4ffef211e4b6916a758b5f80fc79886a90a1496d2c4cabd61d7a7c1bcbf6b48792edfec7eb8460efa59b22ac1f15b5ccdd844feeddd6e1bdd54fb0a0ecb28442294b5e452545ecccb0cf5603c59b06e8c6f8577da25" + }, + { + "tcId": 2405, + "dkm": "8441b4173b03d38af4080e7c3000b690f37bb97b151b390706fcf2218885ccd2f903444feb6cb5b53d18280f1b1fef65cec6aebca5f34052697e1b064d7e83f087674a6d0fd2bbefb33fc56ea920b8553b0d6f17464e661486a0ac70371b6718055718acccdda1eab7bc321ac799b743734405ea1b2352a2fb82f056691b7492" + }, + { + "tcId": 2406, + "dkm": "17a5dc62c4898660e7a45ebe12321d84cb207b1a98065c200984cf2d94dad522481e2078077fbee2df0255e056dc3b62c727a1d101c50d9f592bcf71a2ceb5c1500c7a500f57d71dcf2f5fbf769a2bf5888b402c890f4a4130ca7c9aa2d24ed0ac12e5f1964eb61cf54c9eea783356fdcfb4e917ee09aad53890cad57888d4f1" + }, + { + "tcId": 2407, + "dkm": "713cdb569e277d3cd5140032476aee61cb2e8829a33ba0de1e4a51ce75083850f027660fd8739889bc059b1933f7ef02ea2a295146ad47381c7d551bffd7a52141d204787c5e44ce64e13fec8eaaceed2bf9a1ee7353665e8759a33f3fdf87f1537c3d55dbc6453b6982fa5f2427aad83f579fddc12fa77e14209cb5cd80cef9" + }, + { + "tcId": 2408, + "dkm": "e2de1b4f6b188dcbe49e4857c28b982959b5bf34c387ae562c60094256db6212cc3e773de0291ed5dcdccca32ee1d29f0f5633bc27762e76157771583ef0340b7d3d034beae744755e8cc5aa3fae29bb26751968e516762beff28398f2869807466006c80c5e03e2eff969d492533ece8d6fdff31a6ca264d8157f05b6a9780d" + }, + { + "tcId": 2409, + "dkm": "37244545a86551a28e0af36828e6beda284e5974d6e20def11202b972dcd20421e2756683c4ffab17b9035b70624d9a2883b5a299b8aca4dfe42b2a51ee8c9568cbba77fd2250e40c6b6cb81556adb6859597265c36a9e00110002d4fc31549c66a8e34b3082f0ca5d805f82378a8b804c7046b073683a9f37ce4b363aad718b" + }, + { + "tcId": 2410, + "dkm": "31b5500350f268c79532ba419d520d5d01f9bcbc3f642b379ef863c31fe28a745cf6c20143513a7becc3e9eeea62ab92b4cd72b72fa8067f6137c72a96386e86c658f5a2d396ddee20605ffd13411f473d6c867ea5ee1d24d4ebf9f71f70e1850ee5bea797e6cd2e893c890510c6f5d6c919aadd2f09535e6c2599b3c525c340" + }, + { + "tcId": 2411, + "dkm": "6a3fc2133f0daaedddab74296b696d67a3d5a2ff0635f74bff1dea03a29c6e4594ce59f228857ab8cce7412157b8c7166cfe71c1b2411d3fd1f1ab14e420ade36bc23276bf2c187ea19e8c729b92cea47a763f31ff8b6442674cef17708d4db0c45030d154f6dae3100578f3791e9853a116b631cfd6ec8a80bbbd26a55392b2" + }, + { + "tcId": 2412, + "dkm": "506d45c32ba378e1044d66ab73c68372fa9b2d2059ecdf1be04ce8fe663a0f7cfabaf7f441ecdbd23c47a2375579a2688d739dc82a235040fd337ce4e099db32ca4ec9507fb102b7e75e67721f8f82d86b7109ad9fb080af6986db0488af47e63d9bf6de22319fffc5e5877dfe52d351f8f08f35c205198a20284e59e1f8e839" + }, + { + "tcId": 2413, + "dkm": "2c4a4c2d55f73679a9f1e0b1d38948a96aafd545f838fea2b3ebb88344aded2ff622c05abbcdad57082af6d29b84c32431fde5f08fad200b88c4bcf2da465a32793d9193f7355ad3a882f5ffdfbb1d4bc97551d5a1530f905baed58f24b6a6af55b25fc70a26d7238aaa4eb2a4e27501b7a5f49b59bf9d1b95f79babbaeca231" + }, + { + "tcId": 2414, + "dkm": "05ac034508491a1882debdeda024f5ce33ac4e29ecfb0e14a6404debd0f7bfdbb7d4690c2d5af0f7e5e427b45732c983369ff11e4451fca1c464fb95673ffb58a1b4acc57f3fe0b2e960c72f3027434911a787c44983c811f00f909634fbdba8230ccd62d9a2510d55a180f59bb8cf62115a6660b823aa8b1ea2d0c55b092e14" + }, + { + "tcId": 2415, + "dkm": "e74a5ee6df43ab6eac249715bb81bf9217d08503e528ecbd6b7285a07b9d58718478ca421080ea893fab90d59bf820baa7acfdfc2e07ea1227280b8b8ae1d1fb3fca141a61c6b74fd4f7a36d9f540925e1e205fcc0e32b8916d31c4c62fe1393c6b069efd38fbdafa42cf82942abdf46d7e74a4203eb2653eca65134a50f4f60" + }, + { + "tcId": 2416, + "dkm": "70694e2991faabd6843f6fdd693e19f2d3fd0f5de5ac9971ade2a1b99ee23abf8dabfd04020c478ec48df45cb15a8f06b05403c373bac6ab9a54214cd5a6edebdefc9d97ee50bf5bd58782cd167a2839e6e4a5cfea45b4ad0889dac91e6db13e50d62bfbb893b8b5edadf9cc009149f681334e72e1b308741de31aab59b807f6" + }, + { + "tcId": 2417, + "dkm": "33c29c207b95967a99e800581d6bb3f1a821dec5ecaebe8a60eed38a735caa65278a79ca77636b8508ea49cb66445f116380dfc337d728f47cf318465d1c7949a226976276712cef965eda3e6fda7521f533141682b3987001113f550687aaee4fad6ce6defc5345337659f66cb8d9c5374d3f77b7987445227bef6368140878" + }, + { + "tcId": 2418, + "dkm": "ccdb681ab6ce36e1323fac7f95b08a35995fbf066871c6960c1c9ab2a6afa193587a6ce8351118b2eb72a4d10d99f888765600894940cea27aa6f66f80bb4996155af01755d2436960007011cbe89e7d5b04562f4159c16bb6e6a3c85736545f740d8344534b45d160fd235c2019430c7f93a7e462d31eafe96736ea4091e810" + }, + { + "tcId": 2419, + "dkm": "9c299d533d653713c0b8c5afe7fc6667fc8294d96d0356868859038c7b63f51a7821b7528f6abded58bee36948d9457ae335eacdb5e44219927f558f99b23cf29e8790421f4c10e83992be1b4b80c97187028e224117867dbb761df37f7bb5ea92d453e36d236aada1ec5202028e1b19707b3dff9c2c842d428c1df9e3229174" + }, + { + "tcId": 2420, + "dkm": "b7ae86c8aec931baf49d5a172df868c12d7795035067adf875f36d4f070c511c439ed7715ebee5243f6d0f95bb1cbe3f39f4bafea5acce8cf9621a96434a69f6f4cf93b1841a36f5d2651a72d77489a5eb29695e9463b2a085bd745fd4fd1e8f92695eea35ea06fb9a058d15ed7b18a3c621c01d2abdf9076ed0e639f61c942f" + }, + { + "tcId": 2421, + "dkm": "5a6239e29d7926e1b0492ad43eacbdffda58e4b83c941024d157fc58c154f7380158e1a87a4c6159cac6336fb36ce2eef67a183481c4250e8879604340bce8d4f7eec269c49f2f9719bc52f390f16673013d9754256711e0cd4bef81fe0c8e425a6e035f954add95e0b0b117da07028b44ae9218941c4bc3d65faa508346319d" + }, + { + "tcId": 2422, + "dkm": "eed947e0001c9f62ffaa643bb5d3f754eb0f18d289b3468f57dc0ba531bb80a5a9bb640ae9bd70dba30b959c7fb9991af91fb7cd0146a4eda3a993e16f8d981a9bc9e90877651b33665de4a5384e7b613f9801a16a8f6caa9538a64b9a7232eb398b2a1941d625450ff1dffdd9684e7e34c137976b49a937a9089b858803bc01" + }, + { + "tcId": 2423, + "dkm": "95a9841eb1626d5f174a6eae1e12b8d7c8e3de7d1985e0bc08c35d8948867c9241d4a4d8efa54ce461ed188ba35134dc70e038ae10eb91ebd4303f25d271e356093533de6d6077a63349a9438174cefc26ec2cb041ac591cbc4af9877392977423b3595eade5aba97c65b1a94aeef90e64393cfa47ef0f23a38a152aee474901" + }, + { + "tcId": 2424, + "dkm": "ddd0384767286e113cefe1b04aca963c236309b67be80f039e503b7f79cfdf802f4743e4e09686cf94a1c439b9dca73f5784ba71c20121d778fce27f8600de973a1591816d4f23ffd71b7c3dddc3cc78b2b58901a7f0cd21127af2edb3aee7b837da8d905bf36bfea712b98bba10a9971d5b36b6baa27501965559bdb290b5ac" + }, + { + "tcId": 2425, + "dkm": "b87f2a5c669c251e3e08ead64f9704125aa9a26a32a7b25623497a083fc3d525cf5b6097a98a14843bd0c882c28ddde46db1bea4afac2862fb6e88c06a6daac1c07562b3bad30642e6d70a94e6ace51cdf9f01ecd366873912b76380794d04b9e77443c674d37086f5c0832038f1946a1259dc9718831e6a39dfea2b014e32f9" + } + ] + }, + { + "tgId": 98, + "tests": [ + { + "tcId": 2426, + "dkm": "aec0a06f9169599f77ec46157554eae01a8cafe7bbf96d482286e197d1b2b21f86c991698f4aeae0883897c03c7c632156ed2adefdcafc4a714535220b6840379c349d236da56ed0516b1bcaf79febb61fb4ccba18b152618d765ef490cc1329bcab7c823cac69bd5dd5b2a46e13ec096bbca51599047d2e626c520a2f29910a" + }, + { + "tcId": 2427, + "dkm": "235664e691e3dad387823debfc722b6ccb7e73e176f9b4590917f1f67e366684f47d4c5df1b9e27346adb0aec1ed91d58384b4402640f4cd781f2601d88888724836ee851cd14c4ca002848b08eada6c05513fa6050f47194d5c8d4eaa9d8f87cb081a7cbef32a1534571a787f06a25c500cf3250ac613eebc81d4b22544f4a0" + }, + { + "tcId": 2428, + "dkm": "aae12660d9ed3128981e405b9c8138b001850a910ef8463ce4533074a648940c7cec2f5010a473e3081fe476cb381c011cf25106340bb3fc7e420b3f512d4b41bdfd42910cb9c306a68b0bac863ba3ba69e5d8d8ce7e4f763806ad0da7135c0bac44586e1b08585903ce86e7d2d3e2975851ee54a3e0b12c55e20a56d859286a" + }, + { + "tcId": 2429, + "dkm": "37aee1b006e04122a313a6a8093eb15d4204f854f570144d27cb653e8206a7de4cac7dd106366949eee8548ea0d12628d2c2fe1f271604049751abd9423f72ffa422bf1fe680e38b33edfbbab8adbd6335b43e90407cde6f13f559f70d10d3e1dc2b6edf53ae3abb178c27829db82d632d3956963b0c756b46bbf1d1060f7f92" + }, + { + "tcId": 2430, + "dkm": "bea5c6fca71ad53322961977cb4d113d4ded82ad16c67205e76031f00d77ba119a897a05c5d12b0ae558009f95b6f179c17a928e1a4038679ded929987407b504332758c41a098b61a3677a8ffc8305dbf315fc0cdb1862c3ab1af8ea90a7344a082c121039dc5e00957c8c01b8107c7fa820c85eb4f12ae3e7d47bf629328ae" + }, + { + "tcId": 2431, + "dkm": "1a001c6fa19e02166053482f0790427ec2121ce8544e30792d2f56eda6c1c966508969ec9c250594e07c4289b10cb58ab85abe87d9d21dae1bcf314675b11ad37fc5aac8e7b687f790c550bb252d8dd35dca0e85e531ddb10b3858712b0eafa0ed82b2e2261b1cf0926f9fc90e7febc72a6f6b86c967d77c3cd160b1b39f8649" + }, + { + "tcId": 2432, + "dkm": "dfe2d844a1b34fae3ab488c27e6e821e721e762ae44171432e211f57a2d9741d9a9d7de8341368ca8f69727fcd0111ba5c009b08a96cbcc187a9d2d9e83bc4f0a7c836620b5018e0f9094b74dbf6627ed4e689949e23e3853f8df60c3f551b6764a5f752556bda40fe5e62b10df9f419be39796d001fada494f8e1bc494dfbfa" + }, + { + "tcId": 2433, + "dkm": "022aa3b1965e294bca7dcc14e97b29897a4dae4ebf3b10995c12d3c93e357c04a94b9ed0c59b8a2054a3f37e2224cd875c51eb792d4278a50e41f691dc261069c1946cfbcae11cf50a90440d9d4cf4bd4f0d3772a0ef61209e9f9e281cd06c8d12af7332b48f015f6a1de4975bc120774a22d3b2787018746de1eb1a089e1d52" + }, + { + "tcId": 2434, + "dkm": "96ae0d1f88543d6831c876774a2993a66afac4828354ea371de0157a2384dd813599228e9236fdc2a4d9b77d60fb5c9688869fddf6cc6508c30683343c91b2c8ddc277641962d25bf7948a81d909e84a66ad1f0c70a1409cc72968a3674255185fd96c98397e9585d42f4cded84a048b8724f2e0b38e39ead5a4442415925ce1" + }, + { + "tcId": 2435, + "dkm": "6e269731da1bbbdb2190ab2d274c20ac1623ef909d6c5d909b2bcf06dbf41fc4401b6d4c0df35144d7cc1be622cb2abff2d4d21e241c7840f62bed3decd17e48f24a50f78410a976cdfa63aee807e1468089aca1ad5983a6fc8cccad396992887768a027d77adf0dcb2bbbdd1497aff4fc0c4ab89569abca3187c692b323f6cd" + }, + { + "tcId": 2436, + "dkm": "cf5c9a31283b7715d3d7037636fdbdb61fd78eb261155c81a31ddf0de5d7bf0c283dc19562810019a249bd53af040ed90bb12c381d54301ce4b27d9e2ed92c73bd001d50a0dfba569ac0dc02ad4192e241483d7f04f2e1eb0e4f09aa314da3264342f31a944dc7a25b85b8501f43327cbec8ec65f6d3d73f60529d3a648a5122" + }, + { + "tcId": 2437, + "dkm": "a43bc4fccaf5c6916a1b09f0b2edbc89f4f191c18d95f541f5aad6093d1758f9fef84387963ac0f426cc38ae3c5da34ac0ea4a5267efbd446e5abd6a6e2e665b9019b3b0942137f2a98261912d71f898495576b23797179b07ebe1bccdeb7432a45c40bcf83ce6d26d7127a1ee58bea9d674c67b7b3d12f3b4a6f0632baaaf26" + }, + { + "tcId": 2438, + "dkm": "353a6ba0bf0ef1447b8b1791e32490767ad5d4e8e01b2f195b55ba785b3ce7d694060042f4c7c78b8fdff081c332b5a5c04092479e444049a1c5b318b1affcf2127690f2bcdc049c1342d12e9a685fc60a625b771fca03e32591a006f52385ed23d329e5ce490567e73683a7f56a1fabbd1dfda3cdb862be9a309ca2edf98106" + }, + { + "tcId": 2439, + "dkm": "3e8704b7f9178153cabd76432dbced700159b410df0368bb7f85abb63176cf090d2e2becfd2a0cadfa6bc30115c81e644f4f1d01a64b7eef737bdaba5ff0152d8616df0d0328e1fb1f1c39e1c014276a2445befa20e64cebf3ff9fc11b37a0d896315d7fc57948571f759aef4133240f1c6876453bc50c3755d28255323c0bcd" + }, + { + "tcId": 2440, + "dkm": "38ac62b3af93c80f86e58ea8a00ce31a7064fe567f4db45ab45717a7d816a0c4067ad97d88009dca59a125d91f71fdb497f83fa2e99afa31d678ed0eb93dcd47737d6162e7ea46f199e692f138c9f4def28d01cda1209ee135b312099cfae9820bdb7d3a3eece704b6ca1280e745f8dfbfa5372fb3d4a3c1be28b0de565ec5f0" + }, + { + "tcId": 2441, + "dkm": "c319ac4a66e9d72398be5ce034e8c793fa73b66534381d0403a90d8cd42c91e86283aad35890273a480fd39c87181eb47e8964c3f62babe958c14de068037a27a65e355b82ee18f000dbcde91e2918f24e5de9d0b7f1efdfb8b124cdcb4cbafb0617c39edb0db604d8dd718661954b4fb1ce46ed5090ef6915ced035d275a39a" + }, + { + "tcId": 2442, + "dkm": "488e39e95db54920625902b178f55d7aec66ab522784bb096f1fea291f9c966bbd4c2780e600bb6b76e801fa1bcbf01aa3dd3b88312e6a0c010faf3489ff1cc944f7a8d4e11c63f22e1498fe7836e50aa177de5e45ecd4a50c873f33d6126ed68b22e863bf51dd69af08ace53bc44adeb30ef72db27e5541525f65b8cdcf702a" + }, + { + "tcId": 2443, + "dkm": "c5eba43fac07ba9d6fe94796dbb0f86893e4ec88185b6e7150c241aabf9b257a6b5df5d5915a90d0964f0a884efd38b0cbed5c70a0207d2fd640e206901425fdbb79b2c96fd19abfa07d6dd5005b30996d589847732c44713ad5825366b6012eb06cb45b4b0f57491011e7cab5952c2bc68b9d86d1483f686880d8bdf65f267e" + }, + { + "tcId": 2444, + "dkm": "48598bd6b37640a49bf4e9f6c597e4ed7ecd4fe2f30cd3b826c64d2867175b262bde6a18cd2feb0cc47ac4a5584c5e4921b221a37d9108124dede272125b45bf573a31291c53ee3216301d540809138f285d8e571a59272fb2149a79d410cde0ab3c4291c7038d997185900cf79eb2a9bcc26c88f295c0d3cdbdf61e8261e83b" + }, + { + "tcId": 2445, + "dkm": "b705975010274d9fa92a6511885ca606dc0287ce5e894845061dd0093f4cdff1596c8453974a7b4e644d3995a73946150366269a24ecabe67ca58cbaf0bcee50d71b244b67a37209cd1c01f4fe4891068cee9b73b709363a5864a388a017eb02f132a045ebb37713f3930a38100d7280e238e840c5e4a142849217830067c217" + }, + { + "tcId": 2446, + "dkm": "4b2cde86096c6dff83a4b3c182970d6bdc2959e0c1e9cb482cbfbe920c8060a2e10845e18a3160bbb682aa48f9a7702754d09f0fe74bf111558d673a1115a5d8b006fb5a3d70521743379a527be0b7c4e7d5c3064a2af3b1afb2ccc25f4baa3322659cc761aa481af6f86cb80d816b617494113589690651288500ba80e65958" + }, + { + "tcId": 2447, + "dkm": "05967d58635bc88ab0cafea673e558a2048e8999442982ea37fea8594858c2734a7421cf2b07937317e4ced891de23c4a366682f6b182b887725225ee665e971cd3cb347e6717925fd67493815687621b2d22a80ec8ce86569b81397ff3c5b50190c4586ee9c9844dcd54cad0d221f2c6ec78eb890514a173783e5c7681b53c0" + }, + { + "tcId": 2448, + "dkm": "d036ad3a4c7d7b9491e48e2972fcb69c58b59c325e15a1e4eedb005015e0b8fde9a73285b095163382d9e2f56b585dbda13775c80e47b66d173a9ffea5c1ec756085f4fd579d88baad0a639a55bf817179fd312cf2d32aa4db16b771c02c20ac757e330f98d122cdb944e14c672c99c71d92f8aa91e62d6f687e7bd8ff0b280d" + }, + { + "tcId": 2449, + "dkm": "02163b1bf8d6f92e8ca4b67e20938c1c020b4671622695c1458ca40efd0e20358855851f264ee7305a3e0cabfa80cc6707b5c53897d761757cad63a75783d3437f035b6c86b03470dda24e7a9c15d28e4462ed1cccb25bc0a8faf99025e2a397df577560abed443a921ff3ea10df9286f02fec8412a9161509d727c883a97098" + }, + { + "tcId": 2450, + "dkm": "48499776ae8d761b185d4ba87da4eddc2fa85e650f5f123e977cc7c6f71f35b3c8a8b32fbd03b8e2cf3d81cd23e6e20272981198a8a8498380cb87d023ecec20a877932af5fc0ecb9df623fae201196b9aac658950c3a1dcf429e9e872e019c39fafec2b49461edb37538db923806371eb558242d7c7cecdba46bad3ef3175f0" + } + ] + }, + { + "tgId": 99, + "tests": [ + { + "tcId": 2451, + "dkm": "a4b118a293e88ad0d3a12d60d49894373fb7bb802851305cab73445a9aac78e964f8913e7a320f70e00c37f38b901cc06c85aeb4af6422680083dc914fd18da6390e37606b4e1000aed289533f694751867646399a34d1c2db07743c2ced3474b20a3df1cc000309ada6e037887eead6207c9fd3eea500eec2e5846f734ba6ac" + }, + { + "tcId": 2452, + "dkm": "ab2bcbe49da99a3da09122fff7020833ad548671da58973e94b713df3a0eb6a74fce87b4853f7286ecc58d61700fe85dc93b02f5965ffb8cb70d130bbe374dfddb9d85bccf6b21308f1efceba60b54c1b779511bcbf0a0324692023f9ec28fa6c8bc08936972d45069846ee7148be406982ed257fa5923684f4315fadc08726f" + }, + { + "tcId": 2453, + "dkm": "7ae783959c93d2cd26699f2e7bbc20751fc11400e864d3f475aeee7a7474d129c029533ca0e0b4f13c77840618f13a8c996579abd07b92ca92b6eb0af6529bc1f9df46a8f56d8e4dec972207285e2489296ce6136cd2dc9423cc2a88a7e83898374599a9f1bf0bbdc42bcceae36ac99bec8982af966702bc2389add8ff6962c6" + }, + { + "tcId": 2454, + "dkm": "7ac7c17c2f3a077bdaf5c745430b0119690bd50dc572c7ff53d5abd7704646a3e0a29d20b556899a26ee4545331d23e05f50fa5793bc659944737b00ffeb6705f3003dea4677e917313c7a1982fb1f378bd776ed1eef6c09d6aad4d9f253f527e360994018a32dd2591af9318661453422516f120decbb02fb7c6813abc2ce72" + }, + { + "tcId": 2455, + "dkm": "d6316aa5d64c2157e78b1a89e3b2ea202ab30fa680fe920313a42ad4dca09f1feedc9c442081c7b5cd3860e044f207608e012dd81789f9ec9bbf8f5ad416bf51f6f1174b1afdda6bf7c53744b8a128fa80d2e5460cf18b52bd977b40f20d74f6e7ddace38b046c99c058f87a697fbb483e0ea9ac8ccbb461a9e66cc7efd7497d" + }, + { + "tcId": 2456, + "dkm": "ee39e705d9108ac9278df35675f9cee0793aa8f2c05f972f2628c1cfcd19e85c0b489b7787979714382a2ea7a95918a4bdffac6ea0feeff2c5d0b1f0dc42168df08900280cdcff1160bbd2a51f2ef1a3fa0eb8a8376d5688f59ebc916f97bd7aa7aed51031bed50243df1f95d6aee987fdf5e3093edf28326b7acb5cbf445ca1" + }, + { + "tcId": 2457, + "dkm": "89968c98c725e297c12e7f08a6ce5873435bf9aab2f0c89e8594dc66a784eb6fb002deceab41f26a225c44d2fe5c0dd1d5447e12af35fedafe887de5a9cf20e5b606f7b3d1d9ea9036f13ba9abc3998bc946b233c56e3b98830ec7c6dd186cb8daa3b418db05eadd46173e2bc3a0eda7d6c50d2ea07f4637b60ee3708ed1ef7b" + }, + { + "tcId": 2458, + "dkm": "efeabdc4caf2ddc3466a8c6826be3869f4b2530eba0e80f3915f7df7d298c8b51e649570ac4ff1a12fb2446bde5419d45377a406b6ecf8fb7f1409a5cf63eed13fb092e1873de55e65b2431208e4e0a2b17127de42f2d26eef60cec49ae6f20e4257d0c0db168ec5f18f3ac19ac3dd9f929229534402c1676ea21be5d964442c" + }, + { + "tcId": 2459, + "dkm": "d16ff745349af28de17f4c271c7cb150d123888b32086c7c66bec80e0771d5f38dc53b88eb34f35832c7c3101ab07ebfe85c02cd579290e6f0231e6c5e44b7fe570df168f444619beed964fc7cf7ab4efbbf5414e4a4ea39ef32311443628213c1675f1c02d74546c87f59142804b94905972f4f366886aecb4fd49bf87e0a21" + }, + { + "tcId": 2460, + "dkm": "8c27d73a6392894fdce64e5446da31170ed213293a484d6abcc8aa6cda078f08fe058ed691f510e325b86201b3ff19aea629d536fbd89435fb2fd2c638175172bdac22c19a22fd628ad7fb81556a3d649de978c3702db03d70a3f968dde1c43102652d3ccf8eaa174e6a8b0a35d829ad86a46ae95c169374ec957dd498ef0173" + }, + { + "tcId": 2461, + "dkm": "bed192cfff386e043e807ad6c84e468c788dc9e6a8c14e222d14a3d0a6539477ca2ea5b5c867e2e24eac60ba6daadbf0a048c5df7a88223c81f0282c970f7aaabee60b40cea2d9602179aea67e711fa2fbab63c03054706dc649811d0fa94008c4f546ea2cc7186a88c20f033fdd1daf925f65ef2e9724d41e31fe8e209f8da7" + }, + { + "tcId": 2462, + "dkm": "88cac60ebd44d0cbe7614485450f63c47e13232ea139e9b9cbe8dec6910b034103ef0bea6794f53567771f44e9fd90dc0ca069f7c9eec1498ebe2a69fcc6fa71c623a3ea39692ce54436b68d61d2e6c0b5b7451efaa95b4d9d4b273c349456e85e8150dd5ca8507c7bbfc02cbe7d62eb3de8ac512d17271d56002cd1ffc3daa1" + }, + { + "tcId": 2463, + "dkm": "b07a34c1993224d691b11a0636c816b41fe7305568374fa737a19e6e65d61f18ff4590e6c6fdd1e6159da65af65dc67d017f85a74ae250cc184d09a71638f0dae1a54b976a91311e2d89fe891ab08d422fa80d028ced38b8297fe51222fefa758886d012a01a71c9eb48c60e5fa23960a316dbae20e51b58299b781f70295f74" + }, + { + "tcId": 2464, + "dkm": "eb210d4eacdc680c7979231f6c011d8a32e4d6e26496ea95953bc505649fde259c388f41eec0aff21bc1f5beecbf27f1a0483154c40ce1d02330162f9b594e02e0760f6e16509118dfad8c4eb04b897b42393ade86c73ba3b2cb0385542ba4a46ad440c441ed5582f471c9180983a1fb8a54a0d108ad81a9707aa78aef746f6c" + }, + { + "tcId": 2465, + "dkm": "bdf7d49af5231c8b40162dbff3be6ed791ebda97e92f1beaeacfd1bb5c916ff870b8d3b10dfeb85030c9720ccf94bcc23d43a6c71217bee72800bcb9fb7cf8aca4dfcd198b0009e6c5c9c2706aef2d3be97ec8ad71d85d7a02cd87ed19cac25025aef397ed733697569aff1695c54e58fce5d23a09cad855c462b11d852082f9" + }, + { + "tcId": 2466, + "dkm": "216e01d7e7158f70fe4d9c13ed2651596ffdd053b987f06f50b3ba3e6096fb2996e247b160ec7c69fb67b7afbde3fc689b34c5ac3b0144b82f29140f4576f41301b6b52785eea509a025989906e4d079a0c136492749433fcc54c5fc46d1b2fb2eb5ffb4e6333cbe745dfa40af93675c3f7eedd99648a295483ed5e5140515e6" + }, + { + "tcId": 2467, + "dkm": "71068666d56008e01c89eac51d4b1a4eeb2ab509af4e4d1f45c176b00356f3ab7ac3669746a781a02f55574dafd2c4b6a3f9949773c78df4c669e9531727e5a9f56e97fd2a84932cb6306746651b522623e6f56987c0bf3523ebca0e973c80ef45470789ad82c9d38c50f559224d17139e0940412ac95a586b071d32265577cd" + }, + { + "tcId": 2468, + "dkm": "7fd51f760e2398ab59fea83af08a4090bf87db2ddbfa661c361c4c361281b30230bee54a9cbe0fcd3883b09b347383cfdc9ff0f34de46b142f8e94a18ef350432bd0535390308c77605747054cdbabc6051bcdbaf61104ccf967793a0f4f9c696db6ea34c7e92b8a796f3e9a14ebc9aa92a6bd904d4ddedc569fd3a192f85f6a" + }, + { + "tcId": 2469, + "dkm": "c65206e3746be063c008f98869cbf7a9c211b69ccd429e45289f2af897df6f4cc7d0c37c1ff99da4d14df89ba6c737d5e455c4723a6af428cea76bcc65bd78f8634475f2cf6d3278b2a1dbe398ac487b715fffc0ba70f7875c7266ba56bc73a76093dca846dc1444a5e490df7d038f727394bdf8d7444d2d658b3999047b7ffa" + }, + { + "tcId": 2470, + "dkm": "f1242a71ccfd434a28746f0a7b7b7387a69623417cf65e645a5dcae91345200ac5fef19c6087f374673721a33d483fff563cf5fec2c9bd69eb126debbd4f0252fe90ad3416ec23c8602b0133ffb7d62f8feb5e3f145df896d2a4a2964368eb719b111ef3c2b52ada08c85374ef173be2332ad86bc66d74c01b7a582b83f19959" + }, + { + "tcId": 2471, + "dkm": "7c228212f2515d5ce96818a78de767c34951f625f002dfc6f8509ef202194033fb77ec9989e79c01aa7bf1df66e8bde4d925b26ef2ab486d4dd2b23fbe639d37954f2eaf3f9e76ba620cb5fb02c12f6f30a872110387d5715e33087543461d9b5db1b33b895c9041913eeebe875380c80ad5fa13fa9e6a78259571bc1d9575d3" + }, + { + "tcId": 2472, + "dkm": "f1a16eaeb2e9b9737155807303949cbb5385dda76913ca65a5070a02aa24ef5c3186dcdde20e920fbd204536300197c7c4386e4e101a3eaaafc151d0709acfc735b4eef9d41d4f7aec6716bf7b0af2d2a98904c5cb49dd0841c1f3363053111c657412f990786d363073f0fafab9ea9369e1272d5ff584cbdec68eb1bb941617" + }, + { + "tcId": 2473, + "dkm": "1140042570bf36298b0c9a4814357bbd4fa69a9e5a6b2ee1f9bd927b8d45d6dc8db812722e25270bc79148d10a6a291ee91bb3cf3f73da0f2f687b7fcf88aca9ca4d5edbd46381637eefb8880961512f4f8ccc1093e63dd76f9cd695def49fd8145ffb1c9fd1d74d000758f6289b668b0ef0eaac0d70bfdcf82307d0e3162b14" + }, + { + "tcId": 2474, + "dkm": "e2adc39e46b69a1bd45d16528ae777e4d121432808b5306b15bd94f31e87a57de1aecc428119ab89d471a84ca9a576ef7c6b57804187d7ed536f279a3522f331c521bb22d09718046146bedb94eaffa7793f5f2dd2e434bf72245d69031ffa67d9603e8ac00bb87135ac8b7c25e1c60340fef53278ac4b8a5b2af6d3fb55191f" + }, + { + "tcId": 2475, + "dkm": "93177f04543f431cdb6b5f5bf4edded1f8b3419099986d5475d741916d6ee8592d15b5702e82fdadbb10be34dbafe3bb4683e08c00a9ec48338a99e14e49ff8cadc9dffcae9d79af1f39a6fdd5b3ae799d9af7a40fa3c8f7d7fd26ac6a1b95c18e70b096391b5a77776dc1f2f575ce353d2d259a498b08fc3b63d8bbb31f521d" + } + ] + }, + { + "tgId": 100, + "tests": [ + { + "tcId": 2476, + "dkm": "29a4e0f80299c7c65123415d87d4517272273ae404f0767db9598f8cf558c99d22df706a8e88cd244a3013a83189f158b78a8ec78f420f7eef2a8c7640d93cccd0fbfc8ce970d678ca513482d1f36488f89223363ad51d4eb174e0d9984a35be1462303472776542a551097fb97010d27d67a884ff025fda9efc93da4822e4da" + }, + { + "tcId": 2477, + "dkm": "da6da8649ec4d1d90c609523678df50f0e8cb6da3467f7e3ef626958ed6d38ea0fa840671583738b1a4b76fc7c76b623e3d7f622a45edd93c5826a9d7eb9a5227278ce543d1581fdc4bf1745e6d119b041977df79b33dba49f142ed117556f17c57a4f2cdb05e7a99924db29e23f9f9779f832d30bc022c126124ba28810408e" + }, + { + "tcId": 2478, + "dkm": "977d83d1e290c9b80b9b3e56121860fc8f965aacbfc45221c329eaabaa37e627303fefc3213708a031bd010886e72cb03f83c52bd952999b3072056e42c27551f9956654211fbf491dd0d9199c6bb8473614b949c8ce567962c9993384f0c9c77636b85b503081b6c88ee5224d7d489d91a7d22ca0a54c1fbfd8b4b7728d64a1" + }, + { + "tcId": 2479, + "dkm": "a5a78281a5974f51d232300811bab72b7284e26dc3ad2af2ed2524f49da5960ff44c0bf8893e92b4a22d70add879dd68daccdbe2d8c4f9c6072fc0bce78609c48d910c4430d63a108deb21f443d0aeb245441a3611b994592e919651bb2afb3f69d05709099aab050232af1c58d23cfb905ca1922e3e69e8c322c8f90a136f47" + }, + { + "tcId": 2480, + "dkm": "8983d287965e7121202f54990fb06eee825afe073652cb1502bddfb231feb6fb401782fddd05fb7ae4d6ea8a21205714ce766625b90d75b13625d86adb6edf8b4f62508eb38f5e3633caff71d92b3bd8eeed3e0584ef6896f7238e8a7d0cd0ee82816885540f95c1c5c85ecf8da57390741b1a10b1ab69b5b6f2adbb5b1ca4d5" + }, + { + "tcId": 2481, + "dkm": "e0939541b960e41dcc0040b6115758c4745851d1502359e69c00c4c8479375ac9ee293194f733c3fe59c655fd343dbbdfb0d0e801a8447255d4ddaa54011a49d35b53d21be7f68453673e0cb22cf1c10c0d340f2868ea350039ef3fae8ae25ea0399870600536fcdadba61b6b1b83f3dd747de74bae03ffeeb65b815ad7c28c3" + }, + { + "tcId": 2482, + "dkm": "dd6e9295e28ae102af63116106a2aa3a7dcd91cbd5745691d66110c7d3d2729cac39c074302d5091f59399578dc0dfb6400d3d81c5c2252ab20878eeda132cd9fee2fe9071c716759c5d4941a3038f84c31746a233e7cd0c2945a7ecbcd60c9612ccfaa8fb53efd236a94dd4d171a1369ed8f68b7ea37d589391b534b8716988" + }, + { + "tcId": 2483, + "dkm": "e0eb80b2ccddcbaf46f7adc81c28c154edc6b29805d273ab3390c30b1663a2bd4ebe1e8fc3d5a7b6ce387cb79071fb5a6ef0edf5b5526fddcc1f0740bc4fc2288a6b83668ac5eef89ddc5cd24eb7a08399b6a59f36504eb3093510d23e43d9f163889e15c55f426bb96d0cc216ed9da0055784e7d7483f63e8d5d1a9804710b0" + }, + { + "tcId": 2484, + "dkm": "46a49fe9ff78df0ec86edb7b32ab40740ba5d766a990edb66155da7725e5bc45fbc97e51fbe2a59cb02f504dc216a1a0a5312ce5c1d698f2f8cdfc3035d4a5780fa7c63cef92277f9681576346e5d45734e387a671754cd84b054d17a51da5842a79806947f4bfb1217d0e3bff72df2ad473a6b461f984142428610a09f08bcf" + }, + { + "tcId": 2485, + "dkm": "c26394dcc11169d81703cbd7f0cd4d9b9af9adcb30d9273f3934b0084ad68531bc6c0e0b34964a8d4c999ff14a6b1e78f0e51656e97399bcd24f86be93b7860800a101020c6c46549b586ea37ce7475bb47cecdf0a15240423023ff5fddd7f7032a6715b0bc0de9f201e0178eb2e901a66e3eaf862edc7bf752e7a7c9d17e162" + }, + { + "tcId": 2486, + "dkm": "af9e0681f1ff63002b71a5959d522c9574354428847366935929ac28d0b228a0e4924c20eafc5f310b9302067f03f786e0c601fb3c2dd64eb02b81ec0f18c1c0d10e0d73c4a3ef0f3d09d8a40c829bfb3abe1e7cbd41029b45d679dc93b23a86494887d0de06f8dd741297ca80552e53cf57fcbfc45a994b5053a0cf1f448cc9" + }, + { + "tcId": 2487, + "dkm": "a380b5e7eb1ecb4e3d67c1f9beac6b377e7a33be1ad873cab6ee3359946873a401a1b909f0d47f112ac55d0ec0d4001b71cb9bff9a609990af233bbf843e1d45f5381d01f9bd03486d11aa0b831cdc2247e01f2954c1b4223d2561a5c9b4c58ffcf845b25654da817849bd7a3b244acc814f8e5ce9f4f9d32e60bc5d1066165d" + }, + { + "tcId": 2488, + "dkm": "5ea4345cdb66f59028af252793bfaf0da42653d197fc1b1c42f00d64753ca1dff79651034d9ee6d8d2c47521fac286886a97aee4e4d5bc171517a0f3cf029304d1bef74b9ece7a0148734c98f18f2213edeaec27b1a5f5980fe96e91e7db5ffa5634575212b2365bbb170a3221d2299b5ae3614a6441b6d6127831222c2e6881" + }, + { + "tcId": 2489, + "dkm": "794a1d2dbf52d3328c71afc030dc0acad63af4f85ff843b2619a9c64968cfe10666e85fdf173698d3537fea52e817b84094a5dd114c889d4623227cce00cd91d92066589d3af86430c21fa3061988ce342e5cec73f7ee3ed11058041f8939be02e6d0d23365e82c3c636059cb49c840ae66348cd7532ab87e264d4a89d4f63e6" + }, + { + "tcId": 2490, + "dkm": "aeb009ab84f9aab268aa370868f105cef613d5dfc478e9152e7b4309bb0f9222b8779af38b494267b98e4d46ede969977dbe9c4f1105c0dec50801bbc565b2174f5f1796b21c380146a87e45cf7367892a15fd41f32859ae55ebb2a33e51854d539497fa66f4bba46914e64bcb194836a9ed8739ce10e310bd308cea0c201c48" + }, + { + "tcId": 2491, + "dkm": "119b3b23ec918899d30ebef4c9e70285f51d4915d8c18c22e1cfa1efaf2ee9fe23e0c2e268187fb75e31a09094dccf5f28678252c6fcdce510749a47f2b39f0acc26c81f6b9c5570f86bc579aa12a8b7f77c9e16ecb590640d8abec00388abe1d4250bf8748fda92ecfc85e2b7670fffb4e3cbaea4a4eeabacea822ffba7c87a" + }, + { + "tcId": 2492, + "dkm": "fb3ad123189e679a125cdf5af968dd34e92c19ba173f850982321b0848a3d033ed3592438f0b53049881f300b6e366d349f09982eec308bcfcca1787d273d3f0192f7388634ab27a4a6397d487609f12a98e85dd980dbc0e1ad609bbf1cac6dc742ae06fe5a1da0b344225d4b8520c9f17112c10c736a20e19eee536ece8ffff" + }, + { + "tcId": 2493, + "dkm": "7db81a94d60dd3071c2e479ec62af9413f7ce1b66024497409b22e8be21dfb84db1c2ba21f37589616e01baec5fef1e690790c15496ad5eb93fc2a8777e7ad79c33addd370456ff4002f57878e7a5a2470fa082774f07e06ba71d7aab12529abb9470201fb450f021253ac6e1295d4611379a3f1656caf56faa6a3094deafedb" + }, + { + "tcId": 2494, + "dkm": "364836da6f27b27b3bd246471121387533181e11b39f94d6fb4178f11425fc76c3b21e35514b80bdbce10351619da3439fd4306251829fb85433b1a173e2ffb96a4ce7c21f84f8ae262bb3af1380098975f9e3147c7384504cb3c1cdfe7367988dcbec73657b406e3f62e63c5ed789391fc24e6e25e9e75a26a2360817b977f3" + }, + { + "tcId": 2495, + "dkm": "27caa5913a90474afdc3e2e1fbde2ddf97444f2dc72926e1d1d07f43f93b963e46aebfc769757773dc06f15e7d9b10d9114178b0471e2ae3aaec7df897da594002321ac3e7c728be3d171442441f4996529a15a991df0693410bf4595b0c22f3602d8c7b37e06a55fb5691be8f4caab20de410794c13f5a4d427f024c6d43a83" + }, + { + "tcId": 2496, + "dkm": "87a9550060f1c7a2aa0709ac708d3af6da33571ade52ee8f36a03c74f077efa2344f97bc8e3b483def57d897cdaf57996e7d5bd9f79f300b7fb62b8a09f80698bc41d52e56ad6a7a80f8c5f50b6e30c7c52bed1aa7f81c5255653893cb6fbb751cbd58487929be25d1d00187080f57defb4e193673db1bea3b38c90a503cd588" + }, + { + "tcId": 2497, + "dkm": "8ebbb901693edfda264d622e497b7bb72d17bdb143896a7140d719fcee922e41367279c20285df2cd78a78496d13f128e52dcf07e60151f4f8d63b2faa70ac74dd9728eb1cd7d2777a1f8c52fc9f7ca3cfd6a46f2ae95bb6545901cd3b0e457f5a1db769d8a222b00c377cd92df22bdf121ec2165498d8a048748bd272112f14" + }, + { + "tcId": 2498, + "dkm": "7d78a99925f0c6d4f947418ccc4e03134ebbb633170bcf0639bbc8d36c8aa10ae3263ce3d59ab078becab90fbd666c6c55bac6d034142b569d643a9a79e2d584ef82d15ba01f54dcfefcff5104c4c3ae65c2664611c0222fa010b8fb41fa45d0513fcde922945a6440f988897bb21f5a2a33c8cedfd8a56da0634cb7d2033ac4" + }, + { + "tcId": 2499, + "dkm": "14cda3f6c252000ecd2244d3ca40249d42b75f008e39a057922cb5c0f3f56dc1e27d7b496a3de6bc68b70553f0dabf907621de58572b2ae4f2dd6e97cbd37a764361c7b358a377720be81f8676dc89e2ac2e5e105a19edf242d54315e1bea096749509b6d08f9380a4dcf25f3a523e2f29b4b97108934eb3f7b9e87b4acf942c" + }, + { + "tcId": 2500, + "dkm": "1030ce110aa845fd32bdbdc421cb03b3ba39a3d174fb6047039e161194c6e965a4e5233326f3c9195d1f7f26dcdaf00d5d14a94ea6afcb7819afae4946ce782eaef99c9f766795e1ff43d2ccfb6713ebecfc01e8ff89ab240a8f1f0ccad8f6bd3569b3ec2e4d3f0d8e46bfdc9ad2731176bc3410d99da9dd042636f3ffad9bb2" + } + ] + }, + { + "tgId": 101, + "tests": [ + { + "tcId": 2501, + "testPassed": false + }, + { + "tcId": 2501, + "testPassed": false + }, + { + "tcId": 2502, + "testPassed": true + }, + { + "tcId": 2502, + "testPassed": true + }, + { + "tcId": 2503, + "testPassed": true + }, + { + "tcId": 2503, + "testPassed": true + }, + { + "tcId": 2504, + "testPassed": true + }, + { + "tcId": 2504, + "testPassed": true + }, + { + "tcId": 2505, + "testPassed": true + }, + { + "tcId": 2505, + "testPassed": true + }, + { + "tcId": 2506, + "testPassed": true + }, + { + "tcId": 2506, + "testPassed": true + }, + { + "tcId": 2507, + "testPassed": true + }, + { + "tcId": 2507, + "testPassed": true + }, + { + "tcId": 2508, + "testPassed": true + }, + { + "tcId": 2508, + "testPassed": true + }, + { + "tcId": 2509, + "testPassed": false + }, + { + "tcId": 2509, + "testPassed": false + }, + { + "tcId": 2510, + "testPassed": true + }, + { + "tcId": 2510, + "testPassed": true + }, + { + "tcId": 2511, + "testPassed": true + }, + { + "tcId": 2511, + "testPassed": true + }, + { + "tcId": 2512, + "testPassed": true + }, + { + "tcId": 2512, + "testPassed": true + }, + { + "tcId": 2513, + "testPassed": true + }, + { + "tcId": 2513, + "testPassed": true + }, + { + "tcId": 2514, + "testPassed": true + }, + { + "tcId": 2514, + "testPassed": true + }, + { + "tcId": 2515, + "testPassed": true + }, + { + "tcId": 2515, + "testPassed": true + } + ] + }, + { + "tgId": 102, + "tests": [ + { + "tcId": 2516, + "testPassed": true + }, + { + "tcId": 2516, + "testPassed": true + }, + { + "tcId": 2517, + "testPassed": true + }, + { + "tcId": 2517, + "testPassed": true + }, + { + "tcId": 2518, + "testPassed": true + }, + { + "tcId": 2518, + "testPassed": true + }, + { + "tcId": 2519, + "testPassed": true + }, + { + "tcId": 2519, + "testPassed": true + }, + { + "tcId": 2520, + "testPassed": true + }, + { + "tcId": 2520, + "testPassed": true + }, + { + "tcId": 2521, + "testPassed": true + }, + { + "tcId": 2521, + "testPassed": true + }, + { + "tcId": 2522, + "testPassed": false + }, + { + "tcId": 2522, + "testPassed": false + }, + { + "tcId": 2523, + "testPassed": true + }, + { + "tcId": 2523, + "testPassed": true + }, + { + "tcId": 2524, + "testPassed": true + }, + { + "tcId": 2524, + "testPassed": true + }, + { + "tcId": 2525, + "testPassed": false + }, + { + "tcId": 2525, + "testPassed": false + }, + { + "tcId": 2526, + "testPassed": true + }, + { + "tcId": 2526, + "testPassed": true + }, + { + "tcId": 2527, + "testPassed": true + }, + { + "tcId": 2527, + "testPassed": true + }, + { + "tcId": 2528, + "testPassed": true + }, + { + "tcId": 2528, + "testPassed": true + }, + { + "tcId": 2529, + "testPassed": true + }, + { + "tcId": 2529, + "testPassed": true + }, + { + "tcId": 2530, + "testPassed": true + }, + { + "tcId": 2530, + "testPassed": true + } + ] + }, + { + "tgId": 103, + "tests": [ + { + "tcId": 2531, + "testPassed": true + }, + { + "tcId": 2531, + "testPassed": true + }, + { + "tcId": 2532, + "testPassed": true + }, + { + "tcId": 2532, + "testPassed": true + }, + { + "tcId": 2533, + "testPassed": true + }, + { + "tcId": 2533, + "testPassed": true + }, + { + "tcId": 2534, + "testPassed": true + }, + { + "tcId": 2534, + "testPassed": true + }, + { + "tcId": 2535, + "testPassed": true + }, + { + "tcId": 2535, + "testPassed": true + }, + { + "tcId": 2536, + "testPassed": true + }, + { + "tcId": 2536, + "testPassed": true + }, + { + "tcId": 2537, + "testPassed": true + }, + { + "tcId": 2537, + "testPassed": true + }, + { + "tcId": 2538, + "testPassed": true + }, + { + "tcId": 2538, + "testPassed": true + }, + { + "tcId": 2539, + "testPassed": false + }, + { + "tcId": 2539, + "testPassed": false + }, + { + "tcId": 2540, + "testPassed": false + }, + { + "tcId": 2540, + "testPassed": false + }, + { + "tcId": 2541, + "testPassed": true + }, + { + "tcId": 2541, + "testPassed": true + }, + { + "tcId": 2542, + "testPassed": true + }, + { + "tcId": 2542, + "testPassed": true + }, + { + "tcId": 2543, + "testPassed": true + }, + { + "tcId": 2543, + "testPassed": true + }, + { + "tcId": 2544, + "testPassed": true + }, + { + "tcId": 2544, + "testPassed": true + }, + { + "tcId": 2545, + "testPassed": true + }, + { + "tcId": 2545, + "testPassed": true + } + ] + }, + { + "tgId": 104, + "tests": [ + { + "tcId": 2546, + "testPassed": true + }, + { + "tcId": 2546, + "testPassed": true + }, + { + "tcId": 2547, + "testPassed": true + }, + { + "tcId": 2547, + "testPassed": true + }, + { + "tcId": 2548, + "testPassed": true + }, + { + "tcId": 2548, + "testPassed": true + }, + { + "tcId": 2549, + "testPassed": true + }, + { + "tcId": 2549, + "testPassed": true + }, + { + "tcId": 2550, + "testPassed": true + }, + { + "tcId": 2550, + "testPassed": true + }, + { + "tcId": 2551, + "testPassed": true + }, + { + "tcId": 2551, + "testPassed": true + }, + { + "tcId": 2552, + "testPassed": true + }, + { + "tcId": 2552, + "testPassed": true + }, + { + "tcId": 2553, + "testPassed": false + }, + { + "tcId": 2553, + "testPassed": false + }, + { + "tcId": 2554, + "testPassed": false + }, + { + "tcId": 2554, + "testPassed": false + }, + { + "tcId": 2555, + "testPassed": true + }, + { + "tcId": 2555, + "testPassed": true + }, + { + "tcId": 2556, + "testPassed": true + }, + { + "tcId": 2556, + "testPassed": true + }, + { + "tcId": 2557, + "testPassed": true + }, + { + "tcId": 2557, + "testPassed": true + }, + { + "tcId": 2558, + "testPassed": true + }, + { + "tcId": 2558, + "testPassed": true + }, + { + "tcId": 2559, + "testPassed": true + }, + { + "tcId": 2559, + "testPassed": true + }, + { + "tcId": 2560, + "testPassed": true + }, + { + "tcId": 2560, + "testPassed": true + } + ] + }, + { + "tgId": 105, + "tests": [ + { + "tcId": 2561, + "testPassed": true + }, + { + "tcId": 2561, + "testPassed": true + }, + { + "tcId": 2562, + "testPassed": true + }, + { + "tcId": 2562, + "testPassed": true + }, + { + "tcId": 2563, + "testPassed": false + }, + { + "tcId": 2563, + "testPassed": false + }, + { + "tcId": 2564, + "testPassed": true + }, + { + "tcId": 2564, + "testPassed": true + }, + { + "tcId": 2565, + "testPassed": true + }, + { + "tcId": 2565, + "testPassed": true + }, + { + "tcId": 2566, + "testPassed": true + }, + { + "tcId": 2566, + "testPassed": true + }, + { + "tcId": 2567, + "testPassed": true + }, + { + "tcId": 2567, + "testPassed": true + }, + { + "tcId": 2568, + "testPassed": true + }, + { + "tcId": 2568, + "testPassed": true + }, + { + "tcId": 2569, + "testPassed": true + }, + { + "tcId": 2569, + "testPassed": true + }, + { + "tcId": 2570, + "testPassed": false + }, + { + "tcId": 2570, + "testPassed": false + }, + { + "tcId": 2571, + "testPassed": true + }, + { + "tcId": 2571, + "testPassed": true + }, + { + "tcId": 2572, + "testPassed": true + }, + { + "tcId": 2572, + "testPassed": true + }, + { + "tcId": 2573, + "testPassed": true + }, + { + "tcId": 2573, + "testPassed": true + }, + { + "tcId": 2574, + "testPassed": true + }, + { + "tcId": 2574, + "testPassed": true + }, + { + "tcId": 2575, + "testPassed": true + }, + { + "tcId": 2575, + "testPassed": true + } + ] + }, + { + "tgId": 106, + "tests": [ + { + "tcId": 2576, + "testPassed": false + }, + { + "tcId": 2576, + "testPassed": false + }, + { + "tcId": 2577, + "testPassed": true + }, + { + "tcId": 2577, + "testPassed": true + }, + { + "tcId": 2578, + "testPassed": true + }, + { + "tcId": 2578, + "testPassed": true + }, + { + "tcId": 2579, + "testPassed": true + }, + { + "tcId": 2579, + "testPassed": true + }, + { + "tcId": 2580, + "testPassed": true + }, + { + "tcId": 2580, + "testPassed": true + }, + { + "tcId": 2581, + "testPassed": true + }, + { + "tcId": 2581, + "testPassed": true + }, + { + "tcId": 2582, + "testPassed": true + }, + { + "tcId": 2582, + "testPassed": true + }, + { + "tcId": 2583, + "testPassed": true + }, + { + "tcId": 2583, + "testPassed": true + }, + { + "tcId": 2584, + "testPassed": false + }, + { + "tcId": 2584, + "testPassed": false + }, + { + "tcId": 2585, + "testPassed": true + }, + { + "tcId": 2585, + "testPassed": true + }, + { + "tcId": 2586, + "testPassed": true + }, + { + "tcId": 2586, + "testPassed": true + }, + { + "tcId": 2587, + "testPassed": true + }, + { + "tcId": 2587, + "testPassed": true + }, + { + "tcId": 2588, + "testPassed": true + }, + { + "tcId": 2588, + "testPassed": true + }, + { + "tcId": 2589, + "testPassed": true + }, + { + "tcId": 2589, + "testPassed": true + }, + { + "tcId": 2590, + "testPassed": true + }, + { + "tcId": 2590, + "testPassed": true + } + ] + }, + { + "tgId": 107, + "tests": [ + { + "tcId": 2591, + "testPassed": true + }, + { + "tcId": 2591, + "testPassed": true + }, + { + "tcId": 2592, + "testPassed": true + }, + { + "tcId": 2592, + "testPassed": true + }, + { + "tcId": 2593, + "testPassed": true + }, + { + "tcId": 2593, + "testPassed": true + }, + { + "tcId": 2594, + "testPassed": false + }, + { + "tcId": 2594, + "testPassed": false + }, + { + "tcId": 2595, + "testPassed": true + }, + { + "tcId": 2595, + "testPassed": true + }, + { + "tcId": 2596, + "testPassed": true + }, + { + "tcId": 2596, + "testPassed": true + }, + { + "tcId": 2597, + "testPassed": true + }, + { + "tcId": 2597, + "testPassed": true + }, + { + "tcId": 2598, + "testPassed": true + }, + { + "tcId": 2598, + "testPassed": true + }, + { + "tcId": 2599, + "testPassed": true + }, + { + "tcId": 2599, + "testPassed": true + }, + { + "tcId": 2600, + "testPassed": true + }, + { + "tcId": 2600, + "testPassed": true + }, + { + "tcId": 2601, + "testPassed": true + }, + { + "tcId": 2601, + "testPassed": true + }, + { + "tcId": 2602, + "testPassed": false + }, + { + "tcId": 2602, + "testPassed": false + }, + { + "tcId": 2603, + "testPassed": true + }, + { + "tcId": 2603, + "testPassed": true + }, + { + "tcId": 2604, + "testPassed": true + }, + { + "tcId": 2604, + "testPassed": true + }, + { + "tcId": 2605, + "testPassed": true + }, + { + "tcId": 2605, + "testPassed": true + } + ] + }, + { + "tgId": 108, + "tests": [ + { + "tcId": 2606, + "testPassed": true + }, + { + "tcId": 2606, + "testPassed": true + }, + { + "tcId": 2607, + "testPassed": true + }, + { + "tcId": 2607, + "testPassed": true + }, + { + "tcId": 2608, + "testPassed": true + }, + { + "tcId": 2608, + "testPassed": true + }, + { + "tcId": 2609, + "testPassed": true + }, + { + "tcId": 2609, + "testPassed": true + }, + { + "tcId": 2610, + "testPassed": true + }, + { + "tcId": 2610, + "testPassed": true + }, + { + "tcId": 2611, + "testPassed": true + }, + { + "tcId": 2611, + "testPassed": true + }, + { + "tcId": 2612, + "testPassed": true + }, + { + "tcId": 2612, + "testPassed": true + }, + { + "tcId": 2613, + "testPassed": false + }, + { + "tcId": 2613, + "testPassed": false + }, + { + "tcId": 2614, + "testPassed": true + }, + { + "tcId": 2614, + "testPassed": true + }, + { + "tcId": 2615, + "testPassed": true + }, + { + "tcId": 2615, + "testPassed": true + }, + { + "tcId": 2616, + "testPassed": true + }, + { + "tcId": 2616, + "testPassed": true + }, + { + "tcId": 2617, + "testPassed": false + }, + { + "tcId": 2617, + "testPassed": false + }, + { + "tcId": 2618, + "testPassed": true + }, + { + "tcId": 2618, + "testPassed": true + }, + { + "tcId": 2619, + "testPassed": true + }, + { + "tcId": 2619, + "testPassed": true + }, + { + "tcId": 2620, + "testPassed": true + }, + { + "tcId": 2620, + "testPassed": true + } + ] + }, + { + "tgId": 109, + "tests": [ + { + "tcId": 2621, + "testPassed": true + }, + { + "tcId": 2621, + "testPassed": true + }, + { + "tcId": 2622, + "testPassed": false + }, + { + "tcId": 2622, + "testPassed": false + }, + { + "tcId": 2623, + "testPassed": true + }, + { + "tcId": 2623, + "testPassed": true + }, + { + "tcId": 2624, + "testPassed": true + }, + { + "tcId": 2624, + "testPassed": true + }, + { + "tcId": 2625, + "testPassed": false + }, + { + "tcId": 2625, + "testPassed": false + }, + { + "tcId": 2626, + "testPassed": true + }, + { + "tcId": 2626, + "testPassed": true + }, + { + "tcId": 2627, + "testPassed": true + }, + { + "tcId": 2627, + "testPassed": true + }, + { + "tcId": 2628, + "testPassed": true + }, + { + "tcId": 2628, + "testPassed": true + }, + { + "tcId": 2629, + "testPassed": true + }, + { + "tcId": 2629, + "testPassed": true + }, + { + "tcId": 2630, + "testPassed": true + }, + { + "tcId": 2630, + "testPassed": true + }, + { + "tcId": 2631, + "testPassed": true + }, + { + "tcId": 2631, + "testPassed": true + }, + { + "tcId": 2632, + "testPassed": true + }, + { + "tcId": 2632, + "testPassed": true + }, + { + "tcId": 2633, + "testPassed": true + }, + { + "tcId": 2633, + "testPassed": true + }, + { + "tcId": 2634, + "testPassed": true + }, + { + "tcId": 2634, + "testPassed": true + }, + { + "tcId": 2635, + "testPassed": true + }, + { + "tcId": 2635, + "testPassed": true + } + ] + }, + { + "tgId": 110, + "tests": [ + { + "tcId": 2636, + "testPassed": true + }, + { + "tcId": 2636, + "testPassed": true + }, + { + "tcId": 2637, + "testPassed": true + }, + { + "tcId": 2637, + "testPassed": true + }, + { + "tcId": 2638, + "testPassed": true + }, + { + "tcId": 2638, + "testPassed": true + }, + { + "tcId": 2639, + "testPassed": false + }, + { + "tcId": 2639, + "testPassed": false + }, + { + "tcId": 2640, + "testPassed": true + }, + { + "tcId": 2640, + "testPassed": true + }, + { + "tcId": 2641, + "testPassed": false + }, + { + "tcId": 2641, + "testPassed": false + }, + { + "tcId": 2642, + "testPassed": true + }, + { + "tcId": 2642, + "testPassed": true + }, + { + "tcId": 2643, + "testPassed": true + }, + { + "tcId": 2643, + "testPassed": true + }, + { + "tcId": 2644, + "testPassed": true + }, + { + "tcId": 2644, + "testPassed": true + }, + { + "tcId": 2645, + "testPassed": true + }, + { + "tcId": 2645, + "testPassed": true + }, + { + "tcId": 2646, + "testPassed": true + }, + { + "tcId": 2646, + "testPassed": true + }, + { + "tcId": 2647, + "testPassed": true + }, + { + "tcId": 2647, + "testPassed": true + }, + { + "tcId": 2648, + "testPassed": true + }, + { + "tcId": 2648, + "testPassed": true + }, + { + "tcId": 2649, + "testPassed": true + }, + { + "tcId": 2649, + "testPassed": true + }, + { + "tcId": 2650, + "testPassed": true + }, + { + "tcId": 2650, + "testPassed": true + } + ] + }, + { + "tgId": 111, + "tests": [ + { + "tcId": 2651, + "testPassed": true + }, + { + "tcId": 2651, + "testPassed": true + }, + { + "tcId": 2652, + "testPassed": true + }, + { + "tcId": 2652, + "testPassed": true + }, + { + "tcId": 2653, + "testPassed": false + }, + { + "tcId": 2653, + "testPassed": false + }, + { + "tcId": 2654, + "testPassed": true + }, + { + "tcId": 2654, + "testPassed": true + }, + { + "tcId": 2655, + "testPassed": true + }, + { + "tcId": 2655, + "testPassed": true + }, + { + "tcId": 2656, + "testPassed": true + }, + { + "tcId": 2656, + "testPassed": true + }, + { + "tcId": 2657, + "testPassed": true + }, + { + "tcId": 2657, + "testPassed": true + }, + { + "tcId": 2658, + "testPassed": true + }, + { + "tcId": 2658, + "testPassed": true + }, + { + "tcId": 2659, + "testPassed": true + }, + { + "tcId": 2659, + "testPassed": true + }, + { + "tcId": 2660, + "testPassed": true + }, + { + "tcId": 2660, + "testPassed": true + }, + { + "tcId": 2661, + "testPassed": true + }, + { + "tcId": 2661, + "testPassed": true + }, + { + "tcId": 2662, + "testPassed": true + }, + { + "tcId": 2662, + "testPassed": true + }, + { + "tcId": 2663, + "testPassed": true + }, + { + "tcId": 2663, + "testPassed": true + }, + { + "tcId": 2664, + "testPassed": true + }, + { + "tcId": 2664, + "testPassed": true + }, + { + "tcId": 2665, + "testPassed": false + }, + { + "tcId": 2665, + "testPassed": false + } + ] + }, + { + "tgId": 112, + "tests": [ + { + "tcId": 2666, + "testPassed": true + }, + { + "tcId": 2666, + "testPassed": true + }, + { + "tcId": 2667, + "testPassed": true + }, + { + "tcId": 2667, + "testPassed": true + }, + { + "tcId": 2668, + "testPassed": true + }, + { + "tcId": 2668, + "testPassed": true + }, + { + "tcId": 2669, + "testPassed": true + }, + { + "tcId": 2669, + "testPassed": true + }, + { + "tcId": 2670, + "testPassed": true + }, + { + "tcId": 2670, + "testPassed": true + }, + { + "tcId": 2671, + "testPassed": true + }, + { + "tcId": 2671, + "testPassed": true + }, + { + "tcId": 2672, + "testPassed": true + }, + { + "tcId": 2672, + "testPassed": true + }, + { + "tcId": 2673, + "testPassed": false + }, + { + "tcId": 2673, + "testPassed": false + }, + { + "tcId": 2674, + "testPassed": true + }, + { + "tcId": 2674, + "testPassed": true + }, + { + "tcId": 2675, + "testPassed": false + }, + { + "tcId": 2675, + "testPassed": false + }, + { + "tcId": 2676, + "testPassed": true + }, + { + "tcId": 2676, + "testPassed": true + }, + { + "tcId": 2677, + "testPassed": true + }, + { + "tcId": 2677, + "testPassed": true + }, + { + "tcId": 2678, + "testPassed": true + }, + { + "tcId": 2678, + "testPassed": true + }, + { + "tcId": 2679, + "testPassed": true + }, + { + "tcId": 2679, + "testPassed": true + }, + { + "tcId": 2680, + "testPassed": true + }, + { + "tcId": 2680, + "testPassed": true + } + ] + }, + { + "tgId": 113, + "tests": [ + { + "tcId": 2681, + "testPassed": true + }, + { + "tcId": 2681, + "testPassed": true + }, + { + "tcId": 2682, + "testPassed": true + }, + { + "tcId": 2682, + "testPassed": true + }, + { + "tcId": 2683, + "testPassed": false + }, + { + "tcId": 2683, + "testPassed": false + }, + { + "tcId": 2684, + "testPassed": true + }, + { + "tcId": 2684, + "testPassed": true + }, + { + "tcId": 2685, + "testPassed": true + }, + { + "tcId": 2685, + "testPassed": true + }, + { + "tcId": 2686, + "testPassed": true + }, + { + "tcId": 2686, + "testPassed": true + }, + { + "tcId": 2687, + "testPassed": false + }, + { + "tcId": 2687, + "testPassed": false + }, + { + "tcId": 2688, + "testPassed": true + }, + { + "tcId": 2688, + "testPassed": true + }, + { + "tcId": 2689, + "testPassed": true + }, + { + "tcId": 2689, + "testPassed": true + }, + { + "tcId": 2690, + "testPassed": true + }, + { + "tcId": 2690, + "testPassed": true + }, + { + "tcId": 2691, + "testPassed": true + }, + { + "tcId": 2691, + "testPassed": true + }, + { + "tcId": 2692, + "testPassed": true + }, + { + "tcId": 2692, + "testPassed": true + }, + { + "tcId": 2693, + "testPassed": true + }, + { + "tcId": 2693, + "testPassed": true + }, + { + "tcId": 2694, + "testPassed": true + }, + { + "tcId": 2694, + "testPassed": true + }, + { + "tcId": 2695, + "testPassed": true + }, + { + "tcId": 2695, + "testPassed": true + } + ] + }, + { + "tgId": 114, + "tests": [ + { + "tcId": 2696, + "testPassed": true + }, + { + "tcId": 2696, + "testPassed": true + }, + { + "tcId": 2697, + "testPassed": true + }, + { + "tcId": 2697, + "testPassed": true + }, + { + "tcId": 2698, + "testPassed": false + }, + { + "tcId": 2698, + "testPassed": false + }, + { + "tcId": 2699, + "testPassed": true + }, + { + "tcId": 2699, + "testPassed": true + }, + { + "tcId": 2700, + "testPassed": true + }, + { + "tcId": 2700, + "testPassed": true + }, + { + "tcId": 2701, + "testPassed": true + }, + { + "tcId": 2701, + "testPassed": true + }, + { + "tcId": 2702, + "testPassed": true + }, + { + "tcId": 2702, + "testPassed": true + }, + { + "tcId": 2703, + "testPassed": true + }, + { + "tcId": 2703, + "testPassed": true + }, + { + "tcId": 2704, + "testPassed": false + }, + { + "tcId": 2704, + "testPassed": false + }, + { + "tcId": 2705, + "testPassed": true + }, + { + "tcId": 2705, + "testPassed": true + }, + { + "tcId": 2706, + "testPassed": true + }, + { + "tcId": 2706, + "testPassed": true + }, + { + "tcId": 2707, + "testPassed": true + }, + { + "tcId": 2707, + "testPassed": true + }, + { + "tcId": 2708, + "testPassed": true + }, + { + "tcId": 2708, + "testPassed": true + }, + { + "tcId": 2709, + "testPassed": true + }, + { + "tcId": 2709, + "testPassed": true + }, + { + "tcId": 2710, + "testPassed": true + }, + { + "tcId": 2710, + "testPassed": true + } + ] + }, + { + "tgId": 115, + "tests": [ + { + "tcId": 2711, + "testPassed": true + }, + { + "tcId": 2711, + "testPassed": true + }, + { + "tcId": 2712, + "testPassed": false + }, + { + "tcId": 2712, + "testPassed": false + }, + { + "tcId": 2713, + "testPassed": true + }, + { + "tcId": 2713, + "testPassed": true + }, + { + "tcId": 2714, + "testPassed": true + }, + { + "tcId": 2714, + "testPassed": true + }, + { + "tcId": 2715, + "testPassed": true + }, + { + "tcId": 2715, + "testPassed": true + }, + { + "tcId": 2716, + "testPassed": true + }, + { + "tcId": 2716, + "testPassed": true + }, + { + "tcId": 2717, + "testPassed": true + }, + { + "tcId": 2717, + "testPassed": true + }, + { + "tcId": 2718, + "testPassed": true + }, + { + "tcId": 2718, + "testPassed": true + }, + { + "tcId": 2719, + "testPassed": true + }, + { + "tcId": 2719, + "testPassed": true + }, + { + "tcId": 2720, + "testPassed": true + }, + { + "tcId": 2720, + "testPassed": true + }, + { + "tcId": 2721, + "testPassed": true + }, + { + "tcId": 2721, + "testPassed": true + }, + { + "tcId": 2722, + "testPassed": true + }, + { + "tcId": 2722, + "testPassed": true + }, + { + "tcId": 2723, + "testPassed": true + }, + { + "tcId": 2723, + "testPassed": true + }, + { + "tcId": 2724, + "testPassed": true + }, + { + "tcId": 2724, + "testPassed": true + }, + { + "tcId": 2725, + "testPassed": false + }, + { + "tcId": 2725, + "testPassed": false + } + ] + }, + { + "tgId": 116, + "tests": [ + { + "tcId": 2726, + "testPassed": true + }, + { + "tcId": 2726, + "testPassed": true + }, + { + "tcId": 2727, + "testPassed": true + }, + { + "tcId": 2727, + "testPassed": true + }, + { + "tcId": 2728, + "testPassed": true + }, + { + "tcId": 2728, + "testPassed": true + }, + { + "tcId": 2729, + "testPassed": true + }, + { + "tcId": 2729, + "testPassed": true + }, + { + "tcId": 2730, + "testPassed": true + }, + { + "tcId": 2730, + "testPassed": true + }, + { + "tcId": 2731, + "testPassed": true + }, + { + "tcId": 2731, + "testPassed": true + }, + { + "tcId": 2732, + "testPassed": true + }, + { + "tcId": 2732, + "testPassed": true + }, + { + "tcId": 2733, + "testPassed": false + }, + { + "tcId": 2733, + "testPassed": false + }, + { + "tcId": 2734, + "testPassed": true + }, + { + "tcId": 2734, + "testPassed": true + }, + { + "tcId": 2735, + "testPassed": false + }, + { + "tcId": 2735, + "testPassed": false + }, + { + "tcId": 2736, + "testPassed": true + }, + { + "tcId": 2736, + "testPassed": true + }, + { + "tcId": 2737, + "testPassed": true + }, + { + "tcId": 2737, + "testPassed": true + }, + { + "tcId": 2738, + "testPassed": true + }, + { + "tcId": 2738, + "testPassed": true + }, + { + "tcId": 2739, + "testPassed": true + }, + { + "tcId": 2739, + "testPassed": true + }, + { + "tcId": 2740, + "testPassed": true + }, + { + "tcId": 2740, + "testPassed": true + } + ] + }, + { + "tgId": 117, + "tests": [ + { + "tcId": 2741, + "testPassed": true + }, + { + "tcId": 2741, + "testPassed": true + }, + { + "tcId": 2742, + "testPassed": false + }, + { + "tcId": 2742, + "testPassed": false + }, + { + "tcId": 2743, + "testPassed": true + }, + { + "tcId": 2743, + "testPassed": true + }, + { + "tcId": 2744, + "testPassed": true + }, + { + "tcId": 2744, + "testPassed": true + }, + { + "tcId": 2745, + "testPassed": true + }, + { + "tcId": 2745, + "testPassed": true + }, + { + "tcId": 2746, + "testPassed": true + }, + { + "tcId": 2746, + "testPassed": true + }, + { + "tcId": 2747, + "testPassed": true + }, + { + "tcId": 2747, + "testPassed": true + }, + { + "tcId": 2748, + "testPassed": true + }, + { + "tcId": 2748, + "testPassed": true + }, + { + "tcId": 2749, + "testPassed": true + }, + { + "tcId": 2749, + "testPassed": true + }, + { + "tcId": 2750, + "testPassed": true + }, + { + "tcId": 2750, + "testPassed": true + }, + { + "tcId": 2751, + "testPassed": true + }, + { + "tcId": 2751, + "testPassed": true + }, + { + "tcId": 2752, + "testPassed": true + }, + { + "tcId": 2752, + "testPassed": true + }, + { + "tcId": 2753, + "testPassed": true + }, + { + "tcId": 2753, + "testPassed": true + }, + { + "tcId": 2754, + "testPassed": true + }, + { + "tcId": 2754, + "testPassed": true + }, + { + "tcId": 2755, + "testPassed": false + }, + { + "tcId": 2755, + "testPassed": false + } + ] + }, + { + "tgId": 118, + "tests": [ + { + "tcId": 2756, + "testPassed": true + }, + { + "tcId": 2756, + "testPassed": true + }, + { + "tcId": 2757, + "testPassed": true + }, + { + "tcId": 2757, + "testPassed": true + }, + { + "tcId": 2758, + "testPassed": true + }, + { + "tcId": 2758, + "testPassed": true + }, + { + "tcId": 2759, + "testPassed": true + }, + { + "tcId": 2759, + "testPassed": true + }, + { + "tcId": 2760, + "testPassed": true + }, + { + "tcId": 2760, + "testPassed": true + }, + { + "tcId": 2761, + "testPassed": true + }, + { + "tcId": 2761, + "testPassed": true + }, + { + "tcId": 2762, + "testPassed": true + }, + { + "tcId": 2762, + "testPassed": true + }, + { + "tcId": 2763, + "testPassed": false + }, + { + "tcId": 2763, + "testPassed": false + }, + { + "tcId": 2764, + "testPassed": true + }, + { + "tcId": 2764, + "testPassed": true + }, + { + "tcId": 2765, + "testPassed": true + }, + { + "tcId": 2765, + "testPassed": true + }, + { + "tcId": 2766, + "testPassed": false + }, + { + "tcId": 2766, + "testPassed": false + }, + { + "tcId": 2767, + "testPassed": true + }, + { + "tcId": 2767, + "testPassed": true + }, + { + "tcId": 2768, + "testPassed": true + }, + { + "tcId": 2768, + "testPassed": true + }, + { + "tcId": 2769, + "testPassed": true + }, + { + "tcId": 2769, + "testPassed": true + }, + { + "tcId": 2770, + "testPassed": true + }, + { + "tcId": 2770, + "testPassed": true + } + ] + }, + { + "tgId": 119, + "tests": [ + { + "tcId": 2771, + "testPassed": true + }, + { + "tcId": 2771, + "testPassed": true + }, + { + "tcId": 2772, + "testPassed": true + }, + { + "tcId": 2772, + "testPassed": true + }, + { + "tcId": 2773, + "testPassed": true + }, + { + "tcId": 2773, + "testPassed": true + }, + { + "tcId": 2774, + "testPassed": false + }, + { + "tcId": 2774, + "testPassed": false + }, + { + "tcId": 2775, + "testPassed": true + }, + { + "tcId": 2775, + "testPassed": true + }, + { + "tcId": 2776, + "testPassed": false + }, + { + "tcId": 2776, + "testPassed": false + }, + { + "tcId": 2777, + "testPassed": true + }, + { + "tcId": 2777, + "testPassed": true + }, + { + "tcId": 2778, + "testPassed": true + }, + { + "tcId": 2778, + "testPassed": true + }, + { + "tcId": 2779, + "testPassed": true + }, + { + "tcId": 2779, + "testPassed": true + }, + { + "tcId": 2780, + "testPassed": true + }, + { + "tcId": 2780, + "testPassed": true + }, + { + "tcId": 2781, + "testPassed": true + }, + { + "tcId": 2781, + "testPassed": true + }, + { + "tcId": 2782, + "testPassed": true + }, + { + "tcId": 2782, + "testPassed": true + }, + { + "tcId": 2783, + "testPassed": true + }, + { + "tcId": 2783, + "testPassed": true + }, + { + "tcId": 2784, + "testPassed": true + }, + { + "tcId": 2784, + "testPassed": true + }, + { + "tcId": 2785, + "testPassed": true + }, + { + "tcId": 2785, + "testPassed": true + } + ] + }, + { + "tgId": 120, + "tests": [ + { + "tcId": 2786, + "testPassed": true + }, + { + "tcId": 2786, + "testPassed": true + }, + { + "tcId": 2787, + "testPassed": true + }, + { + "tcId": 2787, + "testPassed": true + }, + { + "tcId": 2788, + "testPassed": false + }, + { + "tcId": 2788, + "testPassed": false + }, + { + "tcId": 2789, + "testPassed": true + }, + { + "tcId": 2789, + "testPassed": true + }, + { + "tcId": 2790, + "testPassed": true + }, + { + "tcId": 2790, + "testPassed": true + }, + { + "tcId": 2791, + "testPassed": true + }, + { + "tcId": 2791, + "testPassed": true + }, + { + "tcId": 2792, + "testPassed": true + }, + { + "tcId": 2792, + "testPassed": true + }, + { + "tcId": 2793, + "testPassed": true + }, + { + "tcId": 2793, + "testPassed": true + }, + { + "tcId": 2794, + "testPassed": true + }, + { + "tcId": 2794, + "testPassed": true + }, + { + "tcId": 2795, + "testPassed": true + }, + { + "tcId": 2795, + "testPassed": true + }, + { + "tcId": 2796, + "testPassed": true + }, + { + "tcId": 2796, + "testPassed": true + }, + { + "tcId": 2797, + "testPassed": true + }, + { + "tcId": 2797, + "testPassed": true + }, + { + "tcId": 2798, + "testPassed": true + }, + { + "tcId": 2798, + "testPassed": true + }, + { + "tcId": 2799, + "testPassed": false + }, + { + "tcId": 2799, + "testPassed": false + }, + { + "tcId": 2800, + "testPassed": true + }, + { + "tcId": 2800, + "testPassed": true + } + ] + }, + { + "tgId": 121, + "tests": [ + { + "tcId": 2801, + "testPassed": true + }, + { + "tcId": 2801, + "testPassed": true + }, + { + "tcId": 2802, + "testPassed": false + }, + { + "tcId": 2802, + "testPassed": false + }, + { + "tcId": 2803, + "testPassed": true + }, + { + "tcId": 2803, + "testPassed": true + }, + { + "tcId": 2804, + "testPassed": true + }, + { + "tcId": 2804, + "testPassed": true + }, + { + "tcId": 2805, + "testPassed": true + }, + { + "tcId": 2805, + "testPassed": true + }, + { + "tcId": 2806, + "testPassed": true + }, + { + "tcId": 2806, + "testPassed": true + }, + { + "tcId": 2807, + "testPassed": true + }, + { + "tcId": 2807, + "testPassed": true + }, + { + "tcId": 2808, + "testPassed": true + }, + { + "tcId": 2808, + "testPassed": true + }, + { + "tcId": 2809, + "testPassed": true + }, + { + "tcId": 2809, + "testPassed": true + }, + { + "tcId": 2810, + "testPassed": true + }, + { + "tcId": 2810, + "testPassed": true + }, + { + "tcId": 2811, + "testPassed": true + }, + { + "tcId": 2811, + "testPassed": true + }, + { + "tcId": 2812, + "testPassed": true + }, + { + "tcId": 2812, + "testPassed": true + }, + { + "tcId": 2813, + "testPassed": true + }, + { + "tcId": 2813, + "testPassed": true + }, + { + "tcId": 2814, + "testPassed": false + }, + { + "tcId": 2814, + "testPassed": false + }, + { + "tcId": 2815, + "testPassed": true + }, + { + "tcId": 2815, + "testPassed": true + } + ] + }, + { + "tgId": 122, + "tests": [ + { + "tcId": 2816, + "testPassed": true + }, + { + "tcId": 2816, + "testPassed": true + }, + { + "tcId": 2817, + "testPassed": true + }, + { + "tcId": 2817, + "testPassed": true + }, + { + "tcId": 2818, + "testPassed": true + }, + { + "tcId": 2818, + "testPassed": true + }, + { + "tcId": 2819, + "testPassed": true + }, + { + "tcId": 2819, + "testPassed": true + }, + { + "tcId": 2820, + "testPassed": false + }, + { + "tcId": 2820, + "testPassed": false + }, + { + "tcId": 2821, + "testPassed": true + }, + { + "tcId": 2821, + "testPassed": true + }, + { + "tcId": 2822, + "testPassed": true + }, + { + "tcId": 2822, + "testPassed": true + }, + { + "tcId": 2823, + "testPassed": true + }, + { + "tcId": 2823, + "testPassed": true + }, + { + "tcId": 2824, + "testPassed": true + }, + { + "tcId": 2824, + "testPassed": true + }, + { + "tcId": 2825, + "testPassed": true + }, + { + "tcId": 2825, + "testPassed": true + }, + { + "tcId": 2826, + "testPassed": false + }, + { + "tcId": 2826, + "testPassed": false + }, + { + "tcId": 2827, + "testPassed": true + }, + { + "tcId": 2827, + "testPassed": true + }, + { + "tcId": 2828, + "testPassed": true + }, + { + "tcId": 2828, + "testPassed": true + }, + { + "tcId": 2829, + "testPassed": true + }, + { + "tcId": 2829, + "testPassed": true + }, + { + "tcId": 2830, + "testPassed": true + }, + { + "tcId": 2830, + "testPassed": true + } + ] + }, + { + "tgId": 123, + "tests": [ + { + "tcId": 2831, + "testPassed": true + }, + { + "tcId": 2831, + "testPassed": true + }, + { + "tcId": 2832, + "testPassed": true + }, + { + "tcId": 2832, + "testPassed": true + }, + { + "tcId": 2833, + "testPassed": true + }, + { + "tcId": 2833, + "testPassed": true + }, + { + "tcId": 2834, + "testPassed": false + }, + { + "tcId": 2834, + "testPassed": false + }, + { + "tcId": 2835, + "testPassed": true + }, + { + "tcId": 2835, + "testPassed": true + }, + { + "tcId": 2836, + "testPassed": true + }, + { + "tcId": 2836, + "testPassed": true + }, + { + "tcId": 2837, + "testPassed": false + }, + { + "tcId": 2837, + "testPassed": false + }, + { + "tcId": 2838, + "testPassed": true + }, + { + "tcId": 2838, + "testPassed": true + }, + { + "tcId": 2839, + "testPassed": true + }, + { + "tcId": 2839, + "testPassed": true + }, + { + "tcId": 2840, + "testPassed": true + }, + { + "tcId": 2840, + "testPassed": true + }, + { + "tcId": 2841, + "testPassed": true + }, + { + "tcId": 2841, + "testPassed": true + }, + { + "tcId": 2842, + "testPassed": true + }, + { + "tcId": 2842, + "testPassed": true + }, + { + "tcId": 2843, + "testPassed": true + }, + { + "tcId": 2843, + "testPassed": true + }, + { + "tcId": 2844, + "testPassed": true + }, + { + "tcId": 2844, + "testPassed": true + }, + { + "tcId": 2845, + "testPassed": true + }, + { + "tcId": 2845, + "testPassed": true + } + ] + }, + { + "tgId": 124, + "tests": [ + { + "tcId": 2846, + "testPassed": true + }, + { + "tcId": 2846, + "testPassed": true + }, + { + "tcId": 2847, + "testPassed": true + }, + { + "tcId": 2847, + "testPassed": true + }, + { + "tcId": 2848, + "testPassed": true + }, + { + "tcId": 2848, + "testPassed": true + }, + { + "tcId": 2849, + "testPassed": true + }, + { + "tcId": 2849, + "testPassed": true + }, + { + "tcId": 2850, + "testPassed": false + }, + { + "tcId": 2850, + "testPassed": false + }, + { + "tcId": 2851, + "testPassed": true + }, + { + "tcId": 2851, + "testPassed": true + }, + { + "tcId": 2852, + "testPassed": true + }, + { + "tcId": 2852, + "testPassed": true + }, + { + "tcId": 2853, + "testPassed": false + }, + { + "tcId": 2853, + "testPassed": false + }, + { + "tcId": 2854, + "testPassed": true + }, + { + "tcId": 2854, + "testPassed": true + }, + { + "tcId": 2855, + "testPassed": true + }, + { + "tcId": 2855, + "testPassed": true + }, + { + "tcId": 2856, + "testPassed": true + }, + { + "tcId": 2856, + "testPassed": true + }, + { + "tcId": 2857, + "testPassed": true + }, + { + "tcId": 2857, + "testPassed": true + }, + { + "tcId": 2858, + "testPassed": true + }, + { + "tcId": 2858, + "testPassed": true + }, + { + "tcId": 2859, + "testPassed": true + }, + { + "tcId": 2859, + "testPassed": true + }, + { + "tcId": 2860, + "testPassed": true + }, + { + "tcId": 2860, + "testPassed": true + } + ] + }, + { + "tgId": 125, + "tests": [ + { + "tcId": 2861, + "testPassed": true + }, + { + "tcId": 2861, + "testPassed": true + }, + { + "tcId": 2862, + "testPassed": true + }, + { + "tcId": 2862, + "testPassed": true + }, + { + "tcId": 2863, + "testPassed": true + }, + { + "tcId": 2863, + "testPassed": true + }, + { + "tcId": 2864, + "testPassed": true + }, + { + "tcId": 2864, + "testPassed": true + }, + { + "tcId": 2865, + "testPassed": true + }, + { + "tcId": 2865, + "testPassed": true + }, + { + "tcId": 2866, + "testPassed": true + }, + { + "tcId": 2866, + "testPassed": true + }, + { + "tcId": 2867, + "testPassed": false + }, + { + "tcId": 2867, + "testPassed": false + }, + { + "tcId": 2868, + "testPassed": true + }, + { + "tcId": 2868, + "testPassed": true + }, + { + "tcId": 2869, + "testPassed": false + }, + { + "tcId": 2869, + "testPassed": false + }, + { + "tcId": 2870, + "testPassed": true + }, + { + "tcId": 2870, + "testPassed": true + }, + { + "tcId": 2871, + "testPassed": true + }, + { + "tcId": 2871, + "testPassed": true + }, + { + "tcId": 2872, + "testPassed": true + }, + { + "tcId": 2872, + "testPassed": true + }, + { + "tcId": 2873, + "testPassed": true + }, + { + "tcId": 2873, + "testPassed": true + }, + { + "tcId": 2874, + "testPassed": true + }, + { + "tcId": 2874, + "testPassed": true + }, + { + "tcId": 2875, + "testPassed": true + }, + { + "tcId": 2875, + "testPassed": true + } + ] + }, + { + "tgId": 126, + "tests": [ + { + "tcId": 2876, + "testPassed": true + }, + { + "tcId": 2876, + "testPassed": true + }, + { + "tcId": 2877, + "testPassed": true + }, + { + "tcId": 2877, + "testPassed": true + }, + { + "tcId": 2878, + "testPassed": true + }, + { + "tcId": 2878, + "testPassed": true + }, + { + "tcId": 2879, + "testPassed": true + }, + { + "tcId": 2879, + "testPassed": true + }, + { + "tcId": 2880, + "testPassed": true + }, + { + "tcId": 2880, + "testPassed": true + }, + { + "tcId": 2881, + "testPassed": false + }, + { + "tcId": 2881, + "testPassed": false + }, + { + "tcId": 2882, + "testPassed": true + }, + { + "tcId": 2882, + "testPassed": true + }, + { + "tcId": 2883, + "testPassed": true + }, + { + "tcId": 2883, + "testPassed": true + }, + { + "tcId": 2884, + "testPassed": true + }, + { + "tcId": 2884, + "testPassed": true + }, + { + "tcId": 2885, + "testPassed": false + }, + { + "tcId": 2885, + "testPassed": false + }, + { + "tcId": 2886, + "testPassed": true + }, + { + "tcId": 2886, + "testPassed": true + }, + { + "tcId": 2887, + "testPassed": true + }, + { + "tcId": 2887, + "testPassed": true + }, + { + "tcId": 2888, + "testPassed": true + }, + { + "tcId": 2888, + "testPassed": true + }, + { + "tcId": 2889, + "testPassed": true + }, + { + "tcId": 2889, + "testPassed": true + }, + { + "tcId": 2890, + "testPassed": true + }, + { + "tcId": 2890, + "testPassed": true + } + ] + }, + { + "tgId": 127, + "tests": [ + { + "tcId": 2891, + "testPassed": true + }, + { + "tcId": 2891, + "testPassed": true + }, + { + "tcId": 2892, + "testPassed": true + }, + { + "tcId": 2892, + "testPassed": true + }, + { + "tcId": 2893, + "testPassed": true + }, + { + "tcId": 2893, + "testPassed": true + }, + { + "tcId": 2894, + "testPassed": true + }, + { + "tcId": 2894, + "testPassed": true + }, + { + "tcId": 2895, + "testPassed": true + }, + { + "tcId": 2895, + "testPassed": true + }, + { + "tcId": 2896, + "testPassed": true + }, + { + "tcId": 2896, + "testPassed": true + }, + { + "tcId": 2897, + "testPassed": true + }, + { + "tcId": 2897, + "testPassed": true + }, + { + "tcId": 2898, + "testPassed": true + }, + { + "tcId": 2898, + "testPassed": true + }, + { + "tcId": 2899, + "testPassed": false + }, + { + "tcId": 2899, + "testPassed": false + }, + { + "tcId": 2900, + "testPassed": true + }, + { + "tcId": 2900, + "testPassed": true + }, + { + "tcId": 2901, + "testPassed": true + }, + { + "tcId": 2901, + "testPassed": true + }, + { + "tcId": 2902, + "testPassed": true + }, + { + "tcId": 2902, + "testPassed": true + }, + { + "tcId": 2903, + "testPassed": true + }, + { + "tcId": 2903, + "testPassed": true + }, + { + "tcId": 2904, + "testPassed": false + }, + { + "tcId": 2904, + "testPassed": false + }, + { + "tcId": 2905, + "testPassed": true + }, + { + "tcId": 2905, + "testPassed": true + } + ] + }, + { + "tgId": 128, + "tests": [ + { + "tcId": 2906, + "testPassed": true + }, + { + "tcId": 2906, + "testPassed": true + }, + { + "tcId": 2907, + "testPassed": true + }, + { + "tcId": 2907, + "testPassed": true + }, + { + "tcId": 2908, + "testPassed": true + }, + { + "tcId": 2908, + "testPassed": true + }, + { + "tcId": 2909, + "testPassed": true + }, + { + "tcId": 2909, + "testPassed": true + }, + { + "tcId": 2910, + "testPassed": true + }, + { + "tcId": 2910, + "testPassed": true + }, + { + "tcId": 2911, + "testPassed": false + }, + { + "tcId": 2911, + "testPassed": false + }, + { + "tcId": 2912, + "testPassed": true + }, + { + "tcId": 2912, + "testPassed": true + }, + { + "tcId": 2913, + "testPassed": true + }, + { + "tcId": 2913, + "testPassed": true + }, + { + "tcId": 2914, + "testPassed": true + }, + { + "tcId": 2914, + "testPassed": true + }, + { + "tcId": 2915, + "testPassed": true + }, + { + "tcId": 2915, + "testPassed": true + }, + { + "tcId": 2916, + "testPassed": true + }, + { + "tcId": 2916, + "testPassed": true + }, + { + "tcId": 2917, + "testPassed": true + }, + { + "tcId": 2917, + "testPassed": true + }, + { + "tcId": 2918, + "testPassed": true + }, + { + "tcId": 2918, + "testPassed": true + }, + { + "tcId": 2919, + "testPassed": false + }, + { + "tcId": 2919, + "testPassed": false + }, + { + "tcId": 2920, + "testPassed": true + }, + { + "tcId": 2920, + "testPassed": true + } + ] + }, + { + "tgId": 129, + "tests": [ + { + "tcId": 2921, + "testPassed": true + }, + { + "tcId": 2921, + "testPassed": true + }, + { + "tcId": 2922, + "testPassed": true + }, + { + "tcId": 2922, + "testPassed": true + }, + { + "tcId": 2923, + "testPassed": true + }, + { + "tcId": 2923, + "testPassed": true + }, + { + "tcId": 2924, + "testPassed": true + }, + { + "tcId": 2924, + "testPassed": true + }, + { + "tcId": 2925, + "testPassed": true + }, + { + "tcId": 2925, + "testPassed": true + }, + { + "tcId": 2926, + "testPassed": true + }, + { + "tcId": 2926, + "testPassed": true + }, + { + "tcId": 2927, + "testPassed": true + }, + { + "tcId": 2927, + "testPassed": true + }, + { + "tcId": 2928, + "testPassed": true + }, + { + "tcId": 2928, + "testPassed": true + }, + { + "tcId": 2929, + "testPassed": true + }, + { + "tcId": 2929, + "testPassed": true + }, + { + "tcId": 2930, + "testPassed": false + }, + { + "tcId": 2930, + "testPassed": false + }, + { + "tcId": 2931, + "testPassed": false + }, + { + "tcId": 2931, + "testPassed": false + }, + { + "tcId": 2932, + "testPassed": true + }, + { + "tcId": 2932, + "testPassed": true + }, + { + "tcId": 2933, + "testPassed": true + }, + { + "tcId": 2933, + "testPassed": true + }, + { + "tcId": 2934, + "testPassed": true + }, + { + "tcId": 2934, + "testPassed": true + }, + { + "tcId": 2935, + "testPassed": true + }, + { + "tcId": 2935, + "testPassed": true + } + ] + }, + { + "tgId": 130, + "tests": [ + { + "tcId": 2936, + "testPassed": false + }, + { + "tcId": 2936, + "testPassed": false + }, + { + "tcId": 2937, + "testPassed": true + }, + { + "tcId": 2937, + "testPassed": true + }, + { + "tcId": 2938, + "testPassed": true + }, + { + "tcId": 2938, + "testPassed": true + }, + { + "tcId": 2939, + "testPassed": true + }, + { + "tcId": 2939, + "testPassed": true + }, + { + "tcId": 2940, + "testPassed": true + }, + { + "tcId": 2940, + "testPassed": true + }, + { + "tcId": 2941, + "testPassed": true + }, + { + "tcId": 2941, + "testPassed": true + }, + { + "tcId": 2942, + "testPassed": true + }, + { + "tcId": 2942, + "testPassed": true + }, + { + "tcId": 2943, + "testPassed": true + }, + { + "tcId": 2943, + "testPassed": true + }, + { + "tcId": 2944, + "testPassed": true + }, + { + "tcId": 2944, + "testPassed": true + }, + { + "tcId": 2945, + "testPassed": true + }, + { + "tcId": 2945, + "testPassed": true + }, + { + "tcId": 2946, + "testPassed": true + }, + { + "tcId": 2946, + "testPassed": true + }, + { + "tcId": 2947, + "testPassed": true + }, + { + "tcId": 2947, + "testPassed": true + }, + { + "tcId": 2948, + "testPassed": false + }, + { + "tcId": 2948, + "testPassed": false + }, + { + "tcId": 2949, + "testPassed": true + }, + { + "tcId": 2949, + "testPassed": true + }, + { + "tcId": 2950, + "testPassed": true + }, + { + "tcId": 2950, + "testPassed": true + } + ] + }, + { + "tgId": 131, + "tests": [ + { + "tcId": 2951, + "testPassed": true + }, + { + "tcId": 2951, + "testPassed": true + }, + { + "tcId": 2952, + "testPassed": true + }, + { + "tcId": 2952, + "testPassed": true + }, + { + "tcId": 2953, + "testPassed": true + }, + { + "tcId": 2953, + "testPassed": true + }, + { + "tcId": 2954, + "testPassed": false + }, + { + "tcId": 2954, + "testPassed": false + }, + { + "tcId": 2955, + "testPassed": true + }, + { + "tcId": 2955, + "testPassed": true + }, + { + "tcId": 2956, + "testPassed": true + }, + { + "tcId": 2956, + "testPassed": true + }, + { + "tcId": 2957, + "testPassed": true + }, + { + "tcId": 2957, + "testPassed": true + }, + { + "tcId": 2958, + "testPassed": false + }, + { + "tcId": 2958, + "testPassed": false + }, + { + "tcId": 2959, + "testPassed": true + }, + { + "tcId": 2959, + "testPassed": true + }, + { + "tcId": 2960, + "testPassed": true + }, + { + "tcId": 2960, + "testPassed": true + }, + { + "tcId": 2961, + "testPassed": true + }, + { + "tcId": 2961, + "testPassed": true + }, + { + "tcId": 2962, + "testPassed": true + }, + { + "tcId": 2962, + "testPassed": true + }, + { + "tcId": 2963, + "testPassed": true + }, + { + "tcId": 2963, + "testPassed": true + }, + { + "tcId": 2964, + "testPassed": true + }, + { + "tcId": 2964, + "testPassed": true + }, + { + "tcId": 2965, + "testPassed": true + }, + { + "tcId": 2965, + "testPassed": true + } + ] + }, + { + "tgId": 132, + "tests": [ + { + "tcId": 2966, + "testPassed": true + }, + { + "tcId": 2966, + "testPassed": true + }, + { + "tcId": 2967, + "testPassed": true + }, + { + "tcId": 2967, + "testPassed": true + }, + { + "tcId": 2968, + "testPassed": true + }, + { + "tcId": 2968, + "testPassed": true + }, + { + "tcId": 2969, + "testPassed": true + }, + { + "tcId": 2969, + "testPassed": true + }, + { + "tcId": 2970, + "testPassed": true + }, + { + "tcId": 2970, + "testPassed": true + }, + { + "tcId": 2971, + "testPassed": true + }, + { + "tcId": 2971, + "testPassed": true + }, + { + "tcId": 2972, + "testPassed": false + }, + { + "tcId": 2972, + "testPassed": false + }, + { + "tcId": 2973, + "testPassed": true + }, + { + "tcId": 2973, + "testPassed": true + }, + { + "tcId": 2974, + "testPassed": true + }, + { + "tcId": 2974, + "testPassed": true + }, + { + "tcId": 2975, + "testPassed": true + }, + { + "tcId": 2975, + "testPassed": true + }, + { + "tcId": 2976, + "testPassed": false + }, + { + "tcId": 2976, + "testPassed": false + }, + { + "tcId": 2977, + "testPassed": true + }, + { + "tcId": 2977, + "testPassed": true + }, + { + "tcId": 2978, + "testPassed": true + }, + { + "tcId": 2978, + "testPassed": true + }, + { + "tcId": 2979, + "testPassed": true + }, + { + "tcId": 2979, + "testPassed": true + }, + { + "tcId": 2980, + "testPassed": true + }, + { + "tcId": 2980, + "testPassed": true + } + ] + }, + { + "tgId": 133, + "tests": [ + { + "tcId": 2981, + "testPassed": true + }, + { + "tcId": 2981, + "testPassed": true + }, + { + "tcId": 2982, + "testPassed": true + }, + { + "tcId": 2982, + "testPassed": true + }, + { + "tcId": 2983, + "testPassed": false + }, + { + "tcId": 2983, + "testPassed": false + }, + { + "tcId": 2984, + "testPassed": true + }, + { + "tcId": 2984, + "testPassed": true + }, + { + "tcId": 2985, + "testPassed": true + }, + { + "tcId": 2985, + "testPassed": true + }, + { + "tcId": 2986, + "testPassed": true + }, + { + "tcId": 2986, + "testPassed": true + }, + { + "tcId": 2987, + "testPassed": false + }, + { + "tcId": 2987, + "testPassed": false + }, + { + "tcId": 2988, + "testPassed": true + }, + { + "tcId": 2988, + "testPassed": true + }, + { + "tcId": 2989, + "testPassed": true + }, + { + "tcId": 2989, + "testPassed": true + }, + { + "tcId": 2990, + "testPassed": true + }, + { + "tcId": 2990, + "testPassed": true + }, + { + "tcId": 2991, + "testPassed": true + }, + { + "tcId": 2991, + "testPassed": true + }, + { + "tcId": 2992, + "testPassed": true + }, + { + "tcId": 2992, + "testPassed": true + }, + { + "tcId": 2993, + "testPassed": true + }, + { + "tcId": 2993, + "testPassed": true + }, + { + "tcId": 2994, + "testPassed": true + }, + { + "tcId": 2994, + "testPassed": true + }, + { + "tcId": 2995, + "testPassed": true + }, + { + "tcId": 2995, + "testPassed": true + } + ] + }, + { + "tgId": 134, + "tests": [ + { + "tcId": 2996, + "testPassed": true + }, + { + "tcId": 2996, + "testPassed": true + }, + { + "tcId": 2997, + "testPassed": true + }, + { + "tcId": 2997, + "testPassed": true + }, + { + "tcId": 2998, + "testPassed": true + }, + { + "tcId": 2998, + "testPassed": true + }, + { + "tcId": 2999, + "testPassed": false + }, + { + "tcId": 2999, + "testPassed": false + }, + { + "tcId": 3000, + "testPassed": true + }, + { + "tcId": 3000, + "testPassed": true + }, + { + "tcId": 3001, + "testPassed": true + }, + { + "tcId": 3001, + "testPassed": true + }, + { + "tcId": 3002, + "testPassed": true + }, + { + "tcId": 3002, + "testPassed": true + }, + { + "tcId": 3003, + "testPassed": true + }, + { + "tcId": 3003, + "testPassed": true + }, + { + "tcId": 3004, + "testPassed": true + }, + { + "tcId": 3004, + "testPassed": true + }, + { + "tcId": 3005, + "testPassed": true + }, + { + "tcId": 3005, + "testPassed": true + }, + { + "tcId": 3006, + "testPassed": false + }, + { + "tcId": 3006, + "testPassed": false + }, + { + "tcId": 3007, + "testPassed": true + }, + { + "tcId": 3007, + "testPassed": true + }, + { + "tcId": 3008, + "testPassed": true + }, + { + "tcId": 3008, + "testPassed": true + }, + { + "tcId": 3009, + "testPassed": true + }, + { + "tcId": 3009, + "testPassed": true + }, + { + "tcId": 3010, + "testPassed": true + }, + { + "tcId": 3010, + "testPassed": true + } + ] + }, + { + "tgId": 135, + "tests": [ + { + "tcId": 3011, + "testPassed": true + }, + { + "tcId": 3011, + "testPassed": true + }, + { + "tcId": 3012, + "testPassed": true + }, + { + "tcId": 3012, + "testPassed": true + }, + { + "tcId": 3013, + "testPassed": true + }, + { + "tcId": 3013, + "testPassed": true + }, + { + "tcId": 3014, + "testPassed": false + }, + { + "tcId": 3014, + "testPassed": false + }, + { + "tcId": 3015, + "testPassed": true + }, + { + "tcId": 3015, + "testPassed": true + }, + { + "tcId": 3016, + "testPassed": true + }, + { + "tcId": 3016, + "testPassed": true + }, + { + "tcId": 3017, + "testPassed": true + }, + { + "tcId": 3017, + "testPassed": true + }, + { + "tcId": 3018, + "testPassed": false + }, + { + "tcId": 3018, + "testPassed": false + }, + { + "tcId": 3019, + "testPassed": true + }, + { + "tcId": 3019, + "testPassed": true + }, + { + "tcId": 3020, + "testPassed": true + }, + { + "tcId": 3020, + "testPassed": true + }, + { + "tcId": 3021, + "testPassed": true + }, + { + "tcId": 3021, + "testPassed": true + }, + { + "tcId": 3022, + "testPassed": true + }, + { + "tcId": 3022, + "testPassed": true + }, + { + "tcId": 3023, + "testPassed": true + }, + { + "tcId": 3023, + "testPassed": true + }, + { + "tcId": 3024, + "testPassed": true + }, + { + "tcId": 3024, + "testPassed": true + }, + { + "tcId": 3025, + "testPassed": true + }, + { + "tcId": 3025, + "testPassed": true + } + ] + }, + { + "tgId": 136, + "tests": [ + { + "tcId": 3026, + "testPassed": true + }, + { + "tcId": 3026, + "testPassed": true + }, + { + "tcId": 3027, + "testPassed": false + }, + { + "tcId": 3027, + "testPassed": false + }, + { + "tcId": 3028, + "testPassed": true + }, + { + "tcId": 3028, + "testPassed": true + }, + { + "tcId": 3029, + "testPassed": true + }, + { + "tcId": 3029, + "testPassed": true + }, + { + "tcId": 3030, + "testPassed": true + }, + { + "tcId": 3030, + "testPassed": true + }, + { + "tcId": 3031, + "testPassed": true + }, + { + "tcId": 3031, + "testPassed": true + }, + { + "tcId": 3032, + "testPassed": true + }, + { + "tcId": 3032, + "testPassed": true + }, + { + "tcId": 3033, + "testPassed": true + }, + { + "tcId": 3033, + "testPassed": true + }, + { + "tcId": 3034, + "testPassed": true + }, + { + "tcId": 3034, + "testPassed": true + }, + { + "tcId": 3035, + "testPassed": false + }, + { + "tcId": 3035, + "testPassed": false + }, + { + "tcId": 3036, + "testPassed": true + }, + { + "tcId": 3036, + "testPassed": true + }, + { + "tcId": 3037, + "testPassed": true + }, + { + "tcId": 3037, + "testPassed": true + }, + { + "tcId": 3038, + "testPassed": true + }, + { + "tcId": 3038, + "testPassed": true + }, + { + "tcId": 3039, + "testPassed": true + }, + { + "tcId": 3039, + "testPassed": true + }, + { + "tcId": 3040, + "testPassed": true + }, + { + "tcId": 3040, + "testPassed": true + } + ] + }, + { + "tgId": 137, + "tests": [ + { + "tcId": 3041, + "testPassed": true + }, + { + "tcId": 3041, + "testPassed": true + }, + { + "tcId": 3042, + "testPassed": true + }, + { + "tcId": 3042, + "testPassed": true + }, + { + "tcId": 3043, + "testPassed": false + }, + { + "tcId": 3043, + "testPassed": false + }, + { + "tcId": 3044, + "testPassed": true + }, + { + "tcId": 3044, + "testPassed": true + }, + { + "tcId": 3045, + "testPassed": true + }, + { + "tcId": 3045, + "testPassed": true + }, + { + "tcId": 3046, + "testPassed": true + }, + { + "tcId": 3046, + "testPassed": true + }, + { + "tcId": 3047, + "testPassed": true + }, + { + "tcId": 3047, + "testPassed": true + }, + { + "tcId": 3048, + "testPassed": true + }, + { + "tcId": 3048, + "testPassed": true + }, + { + "tcId": 3049, + "testPassed": true + }, + { + "tcId": 3049, + "testPassed": true + }, + { + "tcId": 3050, + "testPassed": false + }, + { + "tcId": 3050, + "testPassed": false + }, + { + "tcId": 3051, + "testPassed": true + }, + { + "tcId": 3051, + "testPassed": true + }, + { + "tcId": 3052, + "testPassed": true + }, + { + "tcId": 3052, + "testPassed": true + }, + { + "tcId": 3053, + "testPassed": true + }, + { + "tcId": 3053, + "testPassed": true + }, + { + "tcId": 3054, + "testPassed": true + }, + { + "tcId": 3054, + "testPassed": true + }, + { + "tcId": 3055, + "testPassed": true + }, + { + "tcId": 3055, + "testPassed": true + } + ] + }, + { + "tgId": 138, + "tests": [ + { + "tcId": 3056, + "testPassed": false + }, + { + "tcId": 3056, + "testPassed": false + }, + { + "tcId": 3057, + "testPassed": true + }, + { + "tcId": 3057, + "testPassed": true + }, + { + "tcId": 3058, + "testPassed": true + }, + { + "tcId": 3058, + "testPassed": true + }, + { + "tcId": 3059, + "testPassed": true + }, + { + "tcId": 3059, + "testPassed": true + }, + { + "tcId": 3060, + "testPassed": true + }, + { + "tcId": 3060, + "testPassed": true + }, + { + "tcId": 3061, + "testPassed": false + }, + { + "tcId": 3061, + "testPassed": false + }, + { + "tcId": 3062, + "testPassed": true + }, + { + "tcId": 3062, + "testPassed": true + }, + { + "tcId": 3063, + "testPassed": true + }, + { + "tcId": 3063, + "testPassed": true + }, + { + "tcId": 3064, + "testPassed": true + }, + { + "tcId": 3064, + "testPassed": true + }, + { + "tcId": 3065, + "testPassed": true + }, + { + "tcId": 3065, + "testPassed": true + }, + { + "tcId": 3066, + "testPassed": true + }, + { + "tcId": 3066, + "testPassed": true + }, + { + "tcId": 3067, + "testPassed": true + }, + { + "tcId": 3067, + "testPassed": true + }, + { + "tcId": 3068, + "testPassed": true + }, + { + "tcId": 3068, + "testPassed": true + }, + { + "tcId": 3069, + "testPassed": true + }, + { + "tcId": 3069, + "testPassed": true + }, + { + "tcId": 3070, + "testPassed": true + }, + { + "tcId": 3070, + "testPassed": true + } + ] + }, + { + "tgId": 139, + "tests": [ + { + "tcId": 3071, + "testPassed": false + }, + { + "tcId": 3071, + "testPassed": false + }, + { + "tcId": 3072, + "testPassed": true + }, + { + "tcId": 3072, + "testPassed": true + }, + { + "tcId": 3073, + "testPassed": true + }, + { + "tcId": 3073, + "testPassed": true + }, + { + "tcId": 3074, + "testPassed": true + }, + { + "tcId": 3074, + "testPassed": true + }, + { + "tcId": 3075, + "testPassed": true + }, + { + "tcId": 3075, + "testPassed": true + }, + { + "tcId": 3076, + "testPassed": true + }, + { + "tcId": 3076, + "testPassed": true + }, + { + "tcId": 3077, + "testPassed": false + }, + { + "tcId": 3077, + "testPassed": false + }, + { + "tcId": 3078, + "testPassed": true + }, + { + "tcId": 3078, + "testPassed": true + }, + { + "tcId": 3079, + "testPassed": true + }, + { + "tcId": 3079, + "testPassed": true + }, + { + "tcId": 3080, + "testPassed": true + }, + { + "tcId": 3080, + "testPassed": true + }, + { + "tcId": 3081, + "testPassed": true + }, + { + "tcId": 3081, + "testPassed": true + }, + { + "tcId": 3082, + "testPassed": true + }, + { + "tcId": 3082, + "testPassed": true + }, + { + "tcId": 3083, + "testPassed": true + }, + { + "tcId": 3083, + "testPassed": true + }, + { + "tcId": 3084, + "testPassed": true + }, + { + "tcId": 3084, + "testPassed": true + }, + { + "tcId": 3085, + "testPassed": true + }, + { + "tcId": 3085, + "testPassed": true + } + ] + }, + { + "tgId": 140, + "tests": [ + { + "tcId": 3086, + "testPassed": true + }, + { + "tcId": 3086, + "testPassed": true + }, + { + "tcId": 3087, + "testPassed": false + }, + { + "tcId": 3087, + "testPassed": false + }, + { + "tcId": 3088, + "testPassed": true + }, + { + "tcId": 3088, + "testPassed": true + }, + { + "tcId": 3089, + "testPassed": true + }, + { + "tcId": 3089, + "testPassed": true + }, + { + "tcId": 3090, + "testPassed": true + }, + { + "tcId": 3090, + "testPassed": true + }, + { + "tcId": 3091, + "testPassed": true + }, + { + "tcId": 3091, + "testPassed": true + }, + { + "tcId": 3092, + "testPassed": true + }, + { + "tcId": 3092, + "testPassed": true + }, + { + "tcId": 3093, + "testPassed": true + }, + { + "tcId": 3093, + "testPassed": true + }, + { + "tcId": 3094, + "testPassed": false + }, + { + "tcId": 3094, + "testPassed": false + }, + { + "tcId": 3095, + "testPassed": true + }, + { + "tcId": 3095, + "testPassed": true + }, + { + "tcId": 3096, + "testPassed": true + }, + { + "tcId": 3096, + "testPassed": true + }, + { + "tcId": 3097, + "testPassed": true + }, + { + "tcId": 3097, + "testPassed": true + }, + { + "tcId": 3098, + "testPassed": true + }, + { + "tcId": 3098, + "testPassed": true + }, + { + "tcId": 3099, + "testPassed": true + }, + { + "tcId": 3099, + "testPassed": true + }, + { + "tcId": 3100, + "testPassed": true + }, + { + "tcId": 3100, + "testPassed": true + } + ] + }, + { + "tgId": 141, + "tests": [ + { + "tcId": 3101, + "testPassed": true + }, + { + "tcId": 3101, + "testPassed": true + }, + { + "tcId": 3102, + "testPassed": true + }, + { + "tcId": 3102, + "testPassed": true + }, + { + "tcId": 3103, + "testPassed": true + }, + { + "tcId": 3103, + "testPassed": true + }, + { + "tcId": 3104, + "testPassed": true + }, + { + "tcId": 3104, + "testPassed": true + }, + { + "tcId": 3105, + "testPassed": true + }, + { + "tcId": 3105, + "testPassed": true + }, + { + "tcId": 3106, + "testPassed": true + }, + { + "tcId": 3106, + "testPassed": true + }, + { + "tcId": 3107, + "testPassed": true + }, + { + "tcId": 3107, + "testPassed": true + }, + { + "tcId": 3108, + "testPassed": true + }, + { + "tcId": 3108, + "testPassed": true + }, + { + "tcId": 3109, + "testPassed": true + }, + { + "tcId": 3109, + "testPassed": true + }, + { + "tcId": 3110, + "testPassed": true + }, + { + "tcId": 3110, + "testPassed": true + }, + { + "tcId": 3111, + "testPassed": true + }, + { + "tcId": 3111, + "testPassed": true + }, + { + "tcId": 3112, + "testPassed": true + }, + { + "tcId": 3112, + "testPassed": true + }, + { + "tcId": 3113, + "testPassed": false + }, + { + "tcId": 3113, + "testPassed": false + }, + { + "tcId": 3114, + "testPassed": true + }, + { + "tcId": 3114, + "testPassed": true + }, + { + "tcId": 3115, + "testPassed": false + }, + { + "tcId": 3115, + "testPassed": false + } + ] + }, + { + "tgId": 142, + "tests": [ + { + "tcId": 3116, + "testPassed": true + }, + { + "tcId": 3116, + "testPassed": true + }, + { + "tcId": 3117, + "testPassed": true + }, + { + "tcId": 3117, + "testPassed": true + }, + { + "tcId": 3118, + "testPassed": true + }, + { + "tcId": 3118, + "testPassed": true + }, + { + "tcId": 3119, + "testPassed": true + }, + { + "tcId": 3119, + "testPassed": true + }, + { + "tcId": 3120, + "testPassed": true + }, + { + "tcId": 3120, + "testPassed": true + }, + { + "tcId": 3121, + "testPassed": true + }, + { + "tcId": 3121, + "testPassed": true + }, + { + "tcId": 3122, + "testPassed": true + }, + { + "tcId": 3122, + "testPassed": true + }, + { + "tcId": 3123, + "testPassed": false + }, + { + "tcId": 3123, + "testPassed": false + }, + { + "tcId": 3124, + "testPassed": true + }, + { + "tcId": 3124, + "testPassed": true + }, + { + "tcId": 3125, + "testPassed": true + }, + { + "tcId": 3125, + "testPassed": true + }, + { + "tcId": 3126, + "testPassed": true + }, + { + "tcId": 3126, + "testPassed": true + }, + { + "tcId": 3127, + "testPassed": true + }, + { + "tcId": 3127, + "testPassed": true + }, + { + "tcId": 3128, + "testPassed": false + }, + { + "tcId": 3128, + "testPassed": false + }, + { + "tcId": 3129, + "testPassed": true + }, + { + "tcId": 3129, + "testPassed": true + }, + { + "tcId": 3130, + "testPassed": true + }, + { + "tcId": 3130, + "testPassed": true + } + ] + }, + { + "tgId": 143, + "tests": [ + { + "tcId": 3131, + "testPassed": true + }, + { + "tcId": 3131, + "testPassed": true + }, + { + "tcId": 3132, + "testPassed": true + }, + { + "tcId": 3132, + "testPassed": true + }, + { + "tcId": 3133, + "testPassed": true + }, + { + "tcId": 3133, + "testPassed": true + }, + { + "tcId": 3134, + "testPassed": true + }, + { + "tcId": 3134, + "testPassed": true + }, + { + "tcId": 3135, + "testPassed": true + }, + { + "tcId": 3135, + "testPassed": true + }, + { + "tcId": 3136, + "testPassed": false + }, + { + "tcId": 3136, + "testPassed": false + }, + { + "tcId": 3137, + "testPassed": true + }, + { + "tcId": 3137, + "testPassed": true + }, + { + "tcId": 3138, + "testPassed": true + }, + { + "tcId": 3138, + "testPassed": true + }, + { + "tcId": 3139, + "testPassed": true + }, + { + "tcId": 3139, + "testPassed": true + }, + { + "tcId": 3140, + "testPassed": true + }, + { + "tcId": 3140, + "testPassed": true + }, + { + "tcId": 3141, + "testPassed": true + }, + { + "tcId": 3141, + "testPassed": true + }, + { + "tcId": 3142, + "testPassed": true + }, + { + "tcId": 3142, + "testPassed": true + }, + { + "tcId": 3143, + "testPassed": true + }, + { + "tcId": 3143, + "testPassed": true + }, + { + "tcId": 3144, + "testPassed": true + }, + { + "tcId": 3144, + "testPassed": true + }, + { + "tcId": 3145, + "testPassed": false + }, + { + "tcId": 3145, + "testPassed": false + } + ] + }, + { + "tgId": 144, + "tests": [ + { + "tcId": 3146, + "testPassed": true + }, + { + "tcId": 3146, + "testPassed": true + }, + { + "tcId": 3147, + "testPassed": true + }, + { + "tcId": 3147, + "testPassed": true + }, + { + "tcId": 3148, + "testPassed": true + }, + { + "tcId": 3148, + "testPassed": true + }, + { + "tcId": 3149, + "testPassed": false + }, + { + "tcId": 3149, + "testPassed": false + }, + { + "tcId": 3150, + "testPassed": false + }, + { + "tcId": 3150, + "testPassed": false + }, + { + "tcId": 3151, + "testPassed": true + }, + { + "tcId": 3151, + "testPassed": true + }, + { + "tcId": 3152, + "testPassed": true + }, + { + "tcId": 3152, + "testPassed": true + }, + { + "tcId": 3153, + "testPassed": true + }, + { + "tcId": 3153, + "testPassed": true + }, + { + "tcId": 3154, + "testPassed": true + }, + { + "tcId": 3154, + "testPassed": true + }, + { + "tcId": 3155, + "testPassed": true + }, + { + "tcId": 3155, + "testPassed": true + }, + { + "tcId": 3156, + "testPassed": true + }, + { + "tcId": 3156, + "testPassed": true + }, + { + "tcId": 3157, + "testPassed": true + }, + { + "tcId": 3157, + "testPassed": true + }, + { + "tcId": 3158, + "testPassed": true + }, + { + "tcId": 3158, + "testPassed": true + }, + { + "tcId": 3159, + "testPassed": true + }, + { + "tcId": 3159, + "testPassed": true + }, + { + "tcId": 3160, + "testPassed": true + }, + { + "tcId": 3160, + "testPassed": true + } + ] + }, + { + "tgId": 145, + "tests": [ + { + "tcId": 3161, + "testPassed": true + }, + { + "tcId": 3161, + "testPassed": true + }, + { + "tcId": 3162, + "testPassed": true + }, + { + "tcId": 3162, + "testPassed": true + }, + { + "tcId": 3163, + "testPassed": false + }, + { + "tcId": 3163, + "testPassed": false + }, + { + "tcId": 3164, + "testPassed": false + }, + { + "tcId": 3164, + "testPassed": false + }, + { + "tcId": 3165, + "testPassed": true + }, + { + "tcId": 3165, + "testPassed": true + }, + { + "tcId": 3166, + "testPassed": true + }, + { + "tcId": 3166, + "testPassed": true + }, + { + "tcId": 3167, + "testPassed": true + }, + { + "tcId": 3167, + "testPassed": true + }, + { + "tcId": 3168, + "testPassed": true + }, + { + "tcId": 3168, + "testPassed": true + }, + { + "tcId": 3169, + "testPassed": true + }, + { + "tcId": 3169, + "testPassed": true + }, + { + "tcId": 3170, + "testPassed": true + }, + { + "tcId": 3170, + "testPassed": true + }, + { + "tcId": 3171, + "testPassed": true + }, + { + "tcId": 3171, + "testPassed": true + }, + { + "tcId": 3172, + "testPassed": true + }, + { + "tcId": 3172, + "testPassed": true + }, + { + "tcId": 3173, + "testPassed": true + }, + { + "tcId": 3173, + "testPassed": true + }, + { + "tcId": 3174, + "testPassed": true + }, + { + "tcId": 3174, + "testPassed": true + }, + { + "tcId": 3175, + "testPassed": true + }, + { + "tcId": 3175, + "testPassed": true + } + ] + }, + { + "tgId": 146, + "tests": [ + { + "tcId": 3176, + "testPassed": true + }, + { + "tcId": 3176, + "testPassed": true + }, + { + "tcId": 3177, + "testPassed": true + }, + { + "tcId": 3177, + "testPassed": true + }, + { + "tcId": 3178, + "testPassed": true + }, + { + "tcId": 3178, + "testPassed": true + }, + { + "tcId": 3179, + "testPassed": true + }, + { + "tcId": 3179, + "testPassed": true + }, + { + "tcId": 3180, + "testPassed": true + }, + { + "tcId": 3180, + "testPassed": true + }, + { + "tcId": 3181, + "testPassed": true + }, + { + "tcId": 3181, + "testPassed": true + }, + { + "tcId": 3182, + "testPassed": false + }, + { + "tcId": 3182, + "testPassed": false + }, + { + "tcId": 3183, + "testPassed": true + }, + { + "tcId": 3183, + "testPassed": true + }, + { + "tcId": 3184, + "testPassed": true + }, + { + "tcId": 3184, + "testPassed": true + }, + { + "tcId": 3185, + "testPassed": true + }, + { + "tcId": 3185, + "testPassed": true + }, + { + "tcId": 3186, + "testPassed": true + }, + { + "tcId": 3186, + "testPassed": true + }, + { + "tcId": 3187, + "testPassed": true + }, + { + "tcId": 3187, + "testPassed": true + }, + { + "tcId": 3188, + "testPassed": false + }, + { + "tcId": 3188, + "testPassed": false + }, + { + "tcId": 3189, + "testPassed": true + }, + { + "tcId": 3189, + "testPassed": true + }, + { + "tcId": 3190, + "testPassed": true + }, + { + "tcId": 3190, + "testPassed": true + } + ] + }, + { + "tgId": 147, + "tests": [ + { + "tcId": 3191, + "testPassed": true + }, + { + "tcId": 3191, + "testPassed": true + }, + { + "tcId": 3192, + "testPassed": true + }, + { + "tcId": 3192, + "testPassed": true + }, + { + "tcId": 3193, + "testPassed": true + }, + { + "tcId": 3193, + "testPassed": true + }, + { + "tcId": 3194, + "testPassed": true + }, + { + "tcId": 3194, + "testPassed": true + }, + { + "tcId": 3195, + "testPassed": true + }, + { + "tcId": 3195, + "testPassed": true + }, + { + "tcId": 3196, + "testPassed": true + }, + { + "tcId": 3196, + "testPassed": true + }, + { + "tcId": 3197, + "testPassed": true + }, + { + "tcId": 3197, + "testPassed": true + }, + { + "tcId": 3198, + "testPassed": true + }, + { + "tcId": 3198, + "testPassed": true + }, + { + "tcId": 3199, + "testPassed": true + }, + { + "tcId": 3199, + "testPassed": true + }, + { + "tcId": 3200, + "testPassed": false + }, + { + "tcId": 3200, + "testPassed": false + }, + { + "tcId": 3201, + "testPassed": true + }, + { + "tcId": 3201, + "testPassed": true + }, + { + "tcId": 3202, + "testPassed": true + }, + { + "tcId": 3202, + "testPassed": true + }, + { + "tcId": 3203, + "testPassed": true + }, + { + "tcId": 3203, + "testPassed": true + }, + { + "tcId": 3204, + "testPassed": false + }, + { + "tcId": 3204, + "testPassed": false + }, + { + "tcId": 3205, + "testPassed": true + }, + { + "tcId": 3205, + "testPassed": true + } + ] + }, + { + "tgId": 148, + "tests": [ + { + "tcId": 3206, + "testPassed": true + }, + { + "tcId": 3206, + "testPassed": true + }, + { + "tcId": 3207, + "testPassed": true + }, + { + "tcId": 3207, + "testPassed": true + }, + { + "tcId": 3208, + "testPassed": true + }, + { + "tcId": 3208, + "testPassed": true + }, + { + "tcId": 3209, + "testPassed": true + }, + { + "tcId": 3209, + "testPassed": true + }, + { + "tcId": 3210, + "testPassed": false + }, + { + "tcId": 3210, + "testPassed": false + }, + { + "tcId": 3211, + "testPassed": true + }, + { + "tcId": 3211, + "testPassed": true + }, + { + "tcId": 3212, + "testPassed": true + }, + { + "tcId": 3212, + "testPassed": true + }, + { + "tcId": 3213, + "testPassed": true + }, + { + "tcId": 3213, + "testPassed": true + }, + { + "tcId": 3214, + "testPassed": true + }, + { + "tcId": 3214, + "testPassed": true + }, + { + "tcId": 3215, + "testPassed": false + }, + { + "tcId": 3215, + "testPassed": false + }, + { + "tcId": 3216, + "testPassed": true + }, + { + "tcId": 3216, + "testPassed": true + }, + { + "tcId": 3217, + "testPassed": true + }, + { + "tcId": 3217, + "testPassed": true + }, + { + "tcId": 3218, + "testPassed": true + }, + { + "tcId": 3218, + "testPassed": true + }, + { + "tcId": 3219, + "testPassed": true + }, + { + "tcId": 3219, + "testPassed": true + }, + { + "tcId": 3220, + "testPassed": true + }, + { + "tcId": 3220, + "testPassed": true + } + ] + }, + { + "tgId": 149, + "tests": [ + { + "tcId": 3221, + "testPassed": true + }, + { + "tcId": 3221, + "testPassed": true + }, + { + "tcId": 3222, + "testPassed": true + }, + { + "tcId": 3222, + "testPassed": true + }, + { + "tcId": 3223, + "testPassed": true + }, + { + "tcId": 3223, + "testPassed": true + }, + { + "tcId": 3224, + "testPassed": true + }, + { + "tcId": 3224, + "testPassed": true + }, + { + "tcId": 3225, + "testPassed": true + }, + { + "tcId": 3225, + "testPassed": true + }, + { + "tcId": 3226, + "testPassed": false + }, + { + "tcId": 3226, + "testPassed": false + }, + { + "tcId": 3227, + "testPassed": true + }, + { + "tcId": 3227, + "testPassed": true + }, + { + "tcId": 3228, + "testPassed": true + }, + { + "tcId": 3228, + "testPassed": true + }, + { + "tcId": 3229, + "testPassed": true + }, + { + "tcId": 3229, + "testPassed": true + }, + { + "tcId": 3230, + "testPassed": true + }, + { + "tcId": 3230, + "testPassed": true + }, + { + "tcId": 3231, + "testPassed": true + }, + { + "tcId": 3231, + "testPassed": true + }, + { + "tcId": 3232, + "testPassed": true + }, + { + "tcId": 3232, + "testPassed": true + }, + { + "tcId": 3233, + "testPassed": true + }, + { + "tcId": 3233, + "testPassed": true + }, + { + "tcId": 3234, + "testPassed": true + }, + { + "tcId": 3234, + "testPassed": true + }, + { + "tcId": 3235, + "testPassed": false + }, + { + "tcId": 3235, + "testPassed": false + } + ] + }, + { + "tgId": 150, + "tests": [ + { + "tcId": 3236, + "testPassed": true + }, + { + "tcId": 3236, + "testPassed": true + }, + { + "tcId": 3237, + "testPassed": false + }, + { + "tcId": 3237, + "testPassed": false + }, + { + "tcId": 3238, + "testPassed": true + }, + { + "tcId": 3238, + "testPassed": true + }, + { + "tcId": 3239, + "testPassed": true + }, + { + "tcId": 3239, + "testPassed": true + }, + { + "tcId": 3240, + "testPassed": true + }, + { + "tcId": 3240, + "testPassed": true + }, + { + "tcId": 3241, + "testPassed": true + }, + { + "tcId": 3241, + "testPassed": true + }, + { + "tcId": 3242, + "testPassed": true + }, + { + "tcId": 3242, + "testPassed": true + }, + { + "tcId": 3243, + "testPassed": false + }, + { + "tcId": 3243, + "testPassed": false + }, + { + "tcId": 3244, + "testPassed": true + }, + { + "tcId": 3244, + "testPassed": true + }, + { + "tcId": 3245, + "testPassed": true + }, + { + "tcId": 3245, + "testPassed": true + }, + { + "tcId": 3246, + "testPassed": true + }, + { + "tcId": 3246, + "testPassed": true + }, + { + "tcId": 3247, + "testPassed": true + }, + { + "tcId": 3247, + "testPassed": true + }, + { + "tcId": 3248, + "testPassed": true + }, + { + "tcId": 3248, + "testPassed": true + }, + { + "tcId": 3249, + "testPassed": true + }, + { + "tcId": 3249, + "testPassed": true + }, + { + "tcId": 3250, + "testPassed": true + }, + { + "tcId": 3250, + "testPassed": true + } + ] + }, + { + "tgId": 151, + "tests": [ + { + "tcId": 3251, + "testPassed": true + }, + { + "tcId": 3251, + "testPassed": true + }, + { + "tcId": 3252, + "testPassed": true + }, + { + "tcId": 3252, + "testPassed": true + }, + { + "tcId": 3253, + "testPassed": true + }, + { + "tcId": 3253, + "testPassed": true + }, + { + "tcId": 3254, + "testPassed": true + }, + { + "tcId": 3254, + "testPassed": true + }, + { + "tcId": 3255, + "testPassed": true + }, + { + "tcId": 3255, + "testPassed": true + }, + { + "tcId": 3256, + "testPassed": false + }, + { + "tcId": 3256, + "testPassed": false + }, + { + "tcId": 3257, + "testPassed": true + }, + { + "tcId": 3257, + "testPassed": true + }, + { + "tcId": 3258, + "testPassed": false + }, + { + "tcId": 3258, + "testPassed": false + }, + { + "tcId": 3259, + "testPassed": true + }, + { + "tcId": 3259, + "testPassed": true + }, + { + "tcId": 3260, + "testPassed": true + }, + { + "tcId": 3260, + "testPassed": true + }, + { + "tcId": 3261, + "testPassed": true + }, + { + "tcId": 3261, + "testPassed": true + }, + { + "tcId": 3262, + "testPassed": true + }, + { + "tcId": 3262, + "testPassed": true + }, + { + "tcId": 3263, + "testPassed": true + }, + { + "tcId": 3263, + "testPassed": true + }, + { + "tcId": 3264, + "testPassed": true + }, + { + "tcId": 3264, + "testPassed": true + }, + { + "tcId": 3265, + "testPassed": true + }, + { + "tcId": 3265, + "testPassed": true + } + ] + }, + { + "tgId": 152, + "tests": [ + { + "tcId": 3266, + "testPassed": false + }, + { + "tcId": 3266, + "testPassed": false + }, + { + "tcId": 3267, + "testPassed": true + }, + { + "tcId": 3267, + "testPassed": true + }, + { + "tcId": 3268, + "testPassed": true + }, + { + "tcId": 3268, + "testPassed": true + }, + { + "tcId": 3269, + "testPassed": true + }, + { + "tcId": 3269, + "testPassed": true + }, + { + "tcId": 3270, + "testPassed": true + }, + { + "tcId": 3270, + "testPassed": true + }, + { + "tcId": 3271, + "testPassed": true + }, + { + "tcId": 3271, + "testPassed": true + }, + { + "tcId": 3272, + "testPassed": true + }, + { + "tcId": 3272, + "testPassed": true + }, + { + "tcId": 3273, + "testPassed": false + }, + { + "tcId": 3273, + "testPassed": false + }, + { + "tcId": 3274, + "testPassed": true + }, + { + "tcId": 3274, + "testPassed": true + }, + { + "tcId": 3275, + "testPassed": true + }, + { + "tcId": 3275, + "testPassed": true + }, + { + "tcId": 3276, + "testPassed": true + }, + { + "tcId": 3276, + "testPassed": true + }, + { + "tcId": 3277, + "testPassed": true + }, + { + "tcId": 3277, + "testPassed": true + }, + { + "tcId": 3278, + "testPassed": true + }, + { + "tcId": 3278, + "testPassed": true + }, + { + "tcId": 3279, + "testPassed": true + }, + { + "tcId": 3279, + "testPassed": true + }, + { + "tcId": 3280, + "testPassed": true + }, + { + "tcId": 3280, + "testPassed": true + } + ] + }, + { + "tgId": 153, + "tests": [ + { + "tcId": 3281, + "testPassed": true + }, + { + "tcId": 3281, + "testPassed": true + }, + { + "tcId": 3282, + "testPassed": true + }, + { + "tcId": 3282, + "testPassed": true + }, + { + "tcId": 3283, + "testPassed": true + }, + { + "tcId": 3283, + "testPassed": true + }, + { + "tcId": 3284, + "testPassed": true + }, + { + "tcId": 3284, + "testPassed": true + }, + { + "tcId": 3285, + "testPassed": true + }, + { + "tcId": 3285, + "testPassed": true + }, + { + "tcId": 3286, + "testPassed": true + }, + { + "tcId": 3286, + "testPassed": true + }, + { + "tcId": 3287, + "testPassed": true + }, + { + "tcId": 3287, + "testPassed": true + }, + { + "tcId": 3288, + "testPassed": false + }, + { + "tcId": 3288, + "testPassed": false + }, + { + "tcId": 3289, + "testPassed": true + }, + { + "tcId": 3289, + "testPassed": true + }, + { + "tcId": 3290, + "testPassed": true + }, + { + "tcId": 3290, + "testPassed": true + }, + { + "tcId": 3291, + "testPassed": true + }, + { + "tcId": 3291, + "testPassed": true + }, + { + "tcId": 3292, + "testPassed": true + }, + { + "tcId": 3292, + "testPassed": true + }, + { + "tcId": 3293, + "testPassed": true + }, + { + "tcId": 3293, + "testPassed": true + }, + { + "tcId": 3294, + "testPassed": true + }, + { + "tcId": 3294, + "testPassed": true + }, + { + "tcId": 3295, + "testPassed": false + }, + { + "tcId": 3295, + "testPassed": false + } + ] + }, + { + "tgId": 154, + "tests": [ + { + "tcId": 3296, + "testPassed": true + }, + { + "tcId": 3296, + "testPassed": true + }, + { + "tcId": 3297, + "testPassed": true + }, + { + "tcId": 3297, + "testPassed": true + }, + { + "tcId": 3298, + "testPassed": true + }, + { + "tcId": 3298, + "testPassed": true + }, + { + "tcId": 3299, + "testPassed": true + }, + { + "tcId": 3299, + "testPassed": true + }, + { + "tcId": 3300, + "testPassed": true + }, + { + "tcId": 3300, + "testPassed": true + }, + { + "tcId": 3301, + "testPassed": false + }, + { + "tcId": 3301, + "testPassed": false + }, + { + "tcId": 3302, + "testPassed": true + }, + { + "tcId": 3302, + "testPassed": true + }, + { + "tcId": 3303, + "testPassed": true + }, + { + "tcId": 3303, + "testPassed": true + }, + { + "tcId": 3304, + "testPassed": true + }, + { + "tcId": 3304, + "testPassed": true + }, + { + "tcId": 3305, + "testPassed": false + }, + { + "tcId": 3305, + "testPassed": false + }, + { + "tcId": 3306, + "testPassed": true + }, + { + "tcId": 3306, + "testPassed": true + }, + { + "tcId": 3307, + "testPassed": true + }, + { + "tcId": 3307, + "testPassed": true + }, + { + "tcId": 3308, + "testPassed": true + }, + { + "tcId": 3308, + "testPassed": true + }, + { + "tcId": 3309, + "testPassed": true + }, + { + "tcId": 3309, + "testPassed": true + }, + { + "tcId": 3310, + "testPassed": true + }, + { + "tcId": 3310, + "testPassed": true + } + ] + }, + { + "tgId": 155, + "tests": [ + { + "tcId": 3311, + "testPassed": true + }, + { + "tcId": 3311, + "testPassed": true + }, + { + "tcId": 3312, + "testPassed": false + }, + { + "tcId": 3312, + "testPassed": false + }, + { + "tcId": 3313, + "testPassed": true + }, + { + "tcId": 3313, + "testPassed": true + }, + { + "tcId": 3314, + "testPassed": true + }, + { + "tcId": 3314, + "testPassed": true + }, + { + "tcId": 3315, + "testPassed": true + }, + { + "tcId": 3315, + "testPassed": true + }, + { + "tcId": 3316, + "testPassed": true + }, + { + "tcId": 3316, + "testPassed": true + }, + { + "tcId": 3317, + "testPassed": true + }, + { + "tcId": 3317, + "testPassed": true + }, + { + "tcId": 3318, + "testPassed": true + }, + { + "tcId": 3318, + "testPassed": true + }, + { + "tcId": 3319, + "testPassed": true + }, + { + "tcId": 3319, + "testPassed": true + }, + { + "tcId": 3320, + "testPassed": false + }, + { + "tcId": 3320, + "testPassed": false + }, + { + "tcId": 3321, + "testPassed": true + }, + { + "tcId": 3321, + "testPassed": true + }, + { + "tcId": 3322, + "testPassed": true + }, + { + "tcId": 3322, + "testPassed": true + }, + { + "tcId": 3323, + "testPassed": true + }, + { + "tcId": 3323, + "testPassed": true + }, + { + "tcId": 3324, + "testPassed": true + }, + { + "tcId": 3324, + "testPassed": true + }, + { + "tcId": 3325, + "testPassed": true + }, + { + "tcId": 3325, + "testPassed": true + } + ] + }, + { + "tgId": 156, + "tests": [ + { + "tcId": 3326, + "testPassed": true + }, + { + "tcId": 3326, + "testPassed": true + }, + { + "tcId": 3327, + "testPassed": true + }, + { + "tcId": 3327, + "testPassed": true + }, + { + "tcId": 3328, + "testPassed": true + }, + { + "tcId": 3328, + "testPassed": true + }, + { + "tcId": 3329, + "testPassed": true + }, + { + "tcId": 3329, + "testPassed": true + }, + { + "tcId": 3330, + "testPassed": true + }, + { + "tcId": 3330, + "testPassed": true + }, + { + "tcId": 3331, + "testPassed": false + }, + { + "tcId": 3331, + "testPassed": false + }, + { + "tcId": 3332, + "testPassed": true + }, + { + "tcId": 3332, + "testPassed": true + }, + { + "tcId": 3333, + "testPassed": true + }, + { + "tcId": 3333, + "testPassed": true + }, + { + "tcId": 3334, + "testPassed": true + }, + { + "tcId": 3334, + "testPassed": true + }, + { + "tcId": 3335, + "testPassed": false + }, + { + "tcId": 3335, + "testPassed": false + }, + { + "tcId": 3336, + "testPassed": true + }, + { + "tcId": 3336, + "testPassed": true + }, + { + "tcId": 3337, + "testPassed": true + }, + { + "tcId": 3337, + "testPassed": true + }, + { + "tcId": 3338, + "testPassed": true + }, + { + "tcId": 3338, + "testPassed": true + }, + { + "tcId": 3339, + "testPassed": true + }, + { + "tcId": 3339, + "testPassed": true + }, + { + "tcId": 3340, + "testPassed": true + }, + { + "tcId": 3340, + "testPassed": true + } + ] + }, + { + "tgId": 157, + "tests": [ + { + "tcId": 3341, + "testPassed": true + }, + { + "tcId": 3341, + "testPassed": true + }, + { + "tcId": 3342, + "testPassed": true + }, + { + "tcId": 3342, + "testPassed": true + }, + { + "tcId": 3343, + "testPassed": true + }, + { + "tcId": 3343, + "testPassed": true + }, + { + "tcId": 3344, + "testPassed": true + }, + { + "tcId": 3344, + "testPassed": true + }, + { + "tcId": 3345, + "testPassed": true + }, + { + "tcId": 3345, + "testPassed": true + }, + { + "tcId": 3346, + "testPassed": true + }, + { + "tcId": 3346, + "testPassed": true + }, + { + "tcId": 3347, + "testPassed": false + }, + { + "tcId": 3347, + "testPassed": false + }, + { + "tcId": 3348, + "testPassed": true + }, + { + "tcId": 3348, + "testPassed": true + }, + { + "tcId": 3349, + "testPassed": false + }, + { + "tcId": 3349, + "testPassed": false + }, + { + "tcId": 3350, + "testPassed": true + }, + { + "tcId": 3350, + "testPassed": true + }, + { + "tcId": 3351, + "testPassed": true + }, + { + "tcId": 3351, + "testPassed": true + }, + { + "tcId": 3352, + "testPassed": true + }, + { + "tcId": 3352, + "testPassed": true + }, + { + "tcId": 3353, + "testPassed": true + }, + { + "tcId": 3353, + "testPassed": true + }, + { + "tcId": 3354, + "testPassed": true + }, + { + "tcId": 3354, + "testPassed": true + }, + { + "tcId": 3355, + "testPassed": true + }, + { + "tcId": 3355, + "testPassed": true + } + ] + }, + { + "tgId": 158, + "tests": [ + { + "tcId": 3356, + "testPassed": true + }, + { + "tcId": 3356, + "testPassed": true + }, + { + "tcId": 3357, + "testPassed": true + }, + { + "tcId": 3357, + "testPassed": true + }, + { + "tcId": 3358, + "testPassed": true + }, + { + "tcId": 3358, + "testPassed": true + }, + { + "tcId": 3359, + "testPassed": true + }, + { + "tcId": 3359, + "testPassed": true + }, + { + "tcId": 3360, + "testPassed": true + }, + { + "tcId": 3360, + "testPassed": true + }, + { + "tcId": 3361, + "testPassed": true + }, + { + "tcId": 3361, + "testPassed": true + }, + { + "tcId": 3362, + "testPassed": true + }, + { + "tcId": 3362, + "testPassed": true + }, + { + "tcId": 3363, + "testPassed": true + }, + { + "tcId": 3363, + "testPassed": true + }, + { + "tcId": 3364, + "testPassed": true + }, + { + "tcId": 3364, + "testPassed": true + }, + { + "tcId": 3365, + "testPassed": false + }, + { + "tcId": 3365, + "testPassed": false + }, + { + "tcId": 3366, + "testPassed": true + }, + { + "tcId": 3366, + "testPassed": true + }, + { + "tcId": 3367, + "testPassed": true + }, + { + "tcId": 3367, + "testPassed": true + }, + { + "tcId": 3368, + "testPassed": true + }, + { + "tcId": 3368, + "testPassed": true + }, + { + "tcId": 3369, + "testPassed": true + }, + { + "tcId": 3369, + "testPassed": true + }, + { + "tcId": 3370, + "testPassed": false + }, + { + "tcId": 3370, + "testPassed": false + } + ] + }, + { + "tgId": 159, + "tests": [ + { + "tcId": 3371, + "testPassed": true + }, + { + "tcId": 3371, + "testPassed": true + }, + { + "tcId": 3372, + "testPassed": true + }, + { + "tcId": 3372, + "testPassed": true + }, + { + "tcId": 3373, + "testPassed": false + }, + { + "tcId": 3373, + "testPassed": false + }, + { + "tcId": 3374, + "testPassed": true + }, + { + "tcId": 3374, + "testPassed": true + }, + { + "tcId": 3375, + "testPassed": true + }, + { + "tcId": 3375, + "testPassed": true + }, + { + "tcId": 3376, + "testPassed": true + }, + { + "tcId": 3376, + "testPassed": true + }, + { + "tcId": 3377, + "testPassed": true + }, + { + "tcId": 3377, + "testPassed": true + }, + { + "tcId": 3378, + "testPassed": true + }, + { + "tcId": 3378, + "testPassed": true + }, + { + "tcId": 3379, + "testPassed": true + }, + { + "tcId": 3379, + "testPassed": true + }, + { + "tcId": 3380, + "testPassed": true + }, + { + "tcId": 3380, + "testPassed": true + }, + { + "tcId": 3381, + "testPassed": false + }, + { + "tcId": 3381, + "testPassed": false + }, + { + "tcId": 3382, + "testPassed": true + }, + { + "tcId": 3382, + "testPassed": true + }, + { + "tcId": 3383, + "testPassed": true + }, + { + "tcId": 3383, + "testPassed": true + }, + { + "tcId": 3384, + "testPassed": true + }, + { + "tcId": 3384, + "testPassed": true + }, + { + "tcId": 3385, + "testPassed": true + }, + { + "tcId": 3385, + "testPassed": true + } + ] + }, + { + "tgId": 160, + "tests": [ + { + "tcId": 3386, + "testPassed": true + }, + { + "tcId": 3386, + "testPassed": true + }, + { + "tcId": 3387, + "testPassed": true + }, + { + "tcId": 3387, + "testPassed": true + }, + { + "tcId": 3388, + "testPassed": true + }, + { + "tcId": 3388, + "testPassed": true + }, + { + "tcId": 3389, + "testPassed": true + }, + { + "tcId": 3389, + "testPassed": true + }, + { + "tcId": 3390, + "testPassed": true + }, + { + "tcId": 3390, + "testPassed": true + }, + { + "tcId": 3391, + "testPassed": true + }, + { + "tcId": 3391, + "testPassed": true + }, + { + "tcId": 3392, + "testPassed": false + }, + { + "tcId": 3392, + "testPassed": false + }, + { + "tcId": 3393, + "testPassed": true + }, + { + "tcId": 3393, + "testPassed": true + }, + { + "tcId": 3394, + "testPassed": true + }, + { + "tcId": 3394, + "testPassed": true + }, + { + "tcId": 3395, + "testPassed": true + }, + { + "tcId": 3395, + "testPassed": true + }, + { + "tcId": 3396, + "testPassed": true + }, + { + "tcId": 3396, + "testPassed": true + }, + { + "tcId": 3397, + "testPassed": true + }, + { + "tcId": 3397, + "testPassed": true + }, + { + "tcId": 3398, + "testPassed": true + }, + { + "tcId": 3398, + "testPassed": true + }, + { + "tcId": 3399, + "testPassed": true + }, + { + "tcId": 3399, + "testPassed": true + }, + { + "tcId": 3400, + "testPassed": false + }, + { + "tcId": 3400, + "testPassed": false + } + ] + }, + { + "tgId": 161, + "tests": [ + { + "tcId": 3401, + "testPassed": true + }, + { + "tcId": 3401, + "testPassed": true + }, + { + "tcId": 3402, + "testPassed": true + }, + { + "tcId": 3402, + "testPassed": true + }, + { + "tcId": 3403, + "testPassed": false + }, + { + "tcId": 3403, + "testPassed": false + }, + { + "tcId": 3404, + "testPassed": true + }, + { + "tcId": 3404, + "testPassed": true + }, + { + "tcId": 3405, + "testPassed": true + }, + { + "tcId": 3405, + "testPassed": true + }, + { + "tcId": 3406, + "testPassed": true + }, + { + "tcId": 3406, + "testPassed": true + }, + { + "tcId": 3407, + "testPassed": true + }, + { + "tcId": 3407, + "testPassed": true + }, + { + "tcId": 3408, + "testPassed": true + }, + { + "tcId": 3408, + "testPassed": true + }, + { + "tcId": 3409, + "testPassed": true + }, + { + "tcId": 3409, + "testPassed": true + }, + { + "tcId": 3410, + "testPassed": true + }, + { + "tcId": 3410, + "testPassed": true + }, + { + "tcId": 3411, + "testPassed": true + }, + { + "tcId": 3411, + "testPassed": true + }, + { + "tcId": 3412, + "testPassed": true + }, + { + "tcId": 3412, + "testPassed": true + }, + { + "tcId": 3413, + "testPassed": true + }, + { + "tcId": 3413, + "testPassed": true + }, + { + "tcId": 3414, + "testPassed": true + }, + { + "tcId": 3414, + "testPassed": true + }, + { + "tcId": 3415, + "testPassed": false + }, + { + "tcId": 3415, + "testPassed": false + } + ] + }, + { + "tgId": 162, + "tests": [ + { + "tcId": 3416, + "testPassed": false + }, + { + "tcId": 3416, + "testPassed": false + }, + { + "tcId": 3417, + "testPassed": true + }, + { + "tcId": 3417, + "testPassed": true + }, + { + "tcId": 3418, + "testPassed": true + }, + { + "tcId": 3418, + "testPassed": true + }, + { + "tcId": 3419, + "testPassed": true + }, + { + "tcId": 3419, + "testPassed": true + }, + { + "tcId": 3420, + "testPassed": true + }, + { + "tcId": 3420, + "testPassed": true + }, + { + "tcId": 3421, + "testPassed": true + }, + { + "tcId": 3421, + "testPassed": true + }, + { + "tcId": 3422, + "testPassed": true + }, + { + "tcId": 3422, + "testPassed": true + }, + { + "tcId": 3423, + "testPassed": true + }, + { + "tcId": 3423, + "testPassed": true + }, + { + "tcId": 3424, + "testPassed": true + }, + { + "tcId": 3424, + "testPassed": true + }, + { + "tcId": 3425, + "testPassed": true + }, + { + "tcId": 3425, + "testPassed": true + }, + { + "tcId": 3426, + "testPassed": true + }, + { + "tcId": 3426, + "testPassed": true + }, + { + "tcId": 3427, + "testPassed": true + }, + { + "tcId": 3427, + "testPassed": true + }, + { + "tcId": 3428, + "testPassed": true + }, + { + "tcId": 3428, + "testPassed": true + }, + { + "tcId": 3429, + "testPassed": true + }, + { + "tcId": 3429, + "testPassed": true + }, + { + "tcId": 3430, + "testPassed": false + }, + { + "tcId": 3430, + "testPassed": false + } + ] + }, + { + "tgId": 163, + "tests": [ + { + "tcId": 3431, + "testPassed": true + }, + { + "tcId": 3431, + "testPassed": true + }, + { + "tcId": 3432, + "testPassed": true + }, + { + "tcId": 3432, + "testPassed": true + }, + { + "tcId": 3433, + "testPassed": true + }, + { + "tcId": 3433, + "testPassed": true + }, + { + "tcId": 3434, + "testPassed": true + }, + { + "tcId": 3434, + "testPassed": true + }, + { + "tcId": 3435, + "testPassed": true + }, + { + "tcId": 3435, + "testPassed": true + }, + { + "tcId": 3436, + "testPassed": true + }, + { + "tcId": 3436, + "testPassed": true + }, + { + "tcId": 3437, + "testPassed": true + }, + { + "tcId": 3437, + "testPassed": true + }, + { + "tcId": 3438, + "testPassed": false + }, + { + "tcId": 3438, + "testPassed": false + }, + { + "tcId": 3439, + "testPassed": true + }, + { + "tcId": 3439, + "testPassed": true + }, + { + "tcId": 3440, + "testPassed": true + }, + { + "tcId": 3440, + "testPassed": true + }, + { + "tcId": 3441, + "testPassed": false + }, + { + "tcId": 3441, + "testPassed": false + }, + { + "tcId": 3442, + "testPassed": true + }, + { + "tcId": 3442, + "testPassed": true + }, + { + "tcId": 3443, + "testPassed": true + }, + { + "tcId": 3443, + "testPassed": true + }, + { + "tcId": 3444, + "testPassed": true + }, + { + "tcId": 3444, + "testPassed": true + }, + { + "tcId": 3445, + "testPassed": true + }, + { + "tcId": 3445, + "testPassed": true + } + ] + }, + { + "tgId": 164, + "tests": [ + { + "tcId": 3446, + "testPassed": false + }, + { + "tcId": 3446, + "testPassed": false + }, + { + "tcId": 3447, + "testPassed": true + }, + { + "tcId": 3447, + "testPassed": true + }, + { + "tcId": 3448, + "testPassed": true + }, + { + "tcId": 3448, + "testPassed": true + }, + { + "tcId": 3449, + "testPassed": true + }, + { + "tcId": 3449, + "testPassed": true + }, + { + "tcId": 3450, + "testPassed": true + }, + { + "tcId": 3450, + "testPassed": true + }, + { + "tcId": 3451, + "testPassed": true + }, + { + "tcId": 3451, + "testPassed": true + }, + { + "tcId": 3452, + "testPassed": true + }, + { + "tcId": 3452, + "testPassed": true + }, + { + "tcId": 3453, + "testPassed": true + }, + { + "tcId": 3453, + "testPassed": true + }, + { + "tcId": 3454, + "testPassed": true + }, + { + "tcId": 3454, + "testPassed": true + }, + { + "tcId": 3455, + "testPassed": false + }, + { + "tcId": 3455, + "testPassed": false + }, + { + "tcId": 3456, + "testPassed": true + }, + { + "tcId": 3456, + "testPassed": true + }, + { + "tcId": 3457, + "testPassed": true + }, + { + "tcId": 3457, + "testPassed": true + }, + { + "tcId": 3458, + "testPassed": true + }, + { + "tcId": 3458, + "testPassed": true + }, + { + "tcId": 3459, + "testPassed": true + }, + { + "tcId": 3459, + "testPassed": true + }, + { + "tcId": 3460, + "testPassed": true + }, + { + "tcId": 3460, + "testPassed": true + } + ] + }, + { + "tgId": 165, + "tests": [ + { + "tcId": 3461, + "testPassed": true + }, + { + "tcId": 3461, + "testPassed": true + }, + { + "tcId": 3462, + "testPassed": true + }, + { + "tcId": 3462, + "testPassed": true + }, + { + "tcId": 3463, + "testPassed": true + }, + { + "tcId": 3463, + "testPassed": true + }, + { + "tcId": 3464, + "testPassed": true + }, + { + "tcId": 3464, + "testPassed": true + }, + { + "tcId": 3465, + "testPassed": true + }, + { + "tcId": 3465, + "testPassed": true + }, + { + "tcId": 3466, + "testPassed": true + }, + { + "tcId": 3466, + "testPassed": true + }, + { + "tcId": 3467, + "testPassed": true + }, + { + "tcId": 3467, + "testPassed": true + }, + { + "tcId": 3468, + "testPassed": true + }, + { + "tcId": 3468, + "testPassed": true + }, + { + "tcId": 3469, + "testPassed": false + }, + { + "tcId": 3469, + "testPassed": false + }, + { + "tcId": 3470, + "testPassed": true + }, + { + "tcId": 3470, + "testPassed": true + }, + { + "tcId": 3471, + "testPassed": true + }, + { + "tcId": 3471, + "testPassed": true + }, + { + "tcId": 3472, + "testPassed": true + }, + { + "tcId": 3472, + "testPassed": true + }, + { + "tcId": 3473, + "testPassed": false + }, + { + "tcId": 3473, + "testPassed": false + }, + { + "tcId": 3474, + "testPassed": true + }, + { + "tcId": 3474, + "testPassed": true + }, + { + "tcId": 3475, + "testPassed": true + }, + { + "tcId": 3475, + "testPassed": true + } + ] + }, + { + "tgId": 166, + "tests": [ + { + "tcId": 3476, + "testPassed": true + }, + { + "tcId": 3476, + "testPassed": true + }, + { + "tcId": 3477, + "testPassed": true + }, + { + "tcId": 3477, + "testPassed": true + }, + { + "tcId": 3478, + "testPassed": true + }, + { + "tcId": 3478, + "testPassed": true + }, + { + "tcId": 3479, + "testPassed": true + }, + { + "tcId": 3479, + "testPassed": true + }, + { + "tcId": 3480, + "testPassed": true + }, + { + "tcId": 3480, + "testPassed": true + }, + { + "tcId": 3481, + "testPassed": false + }, + { + "tcId": 3481, + "testPassed": false + }, + { + "tcId": 3482, + "testPassed": true + }, + { + "tcId": 3482, + "testPassed": true + }, + { + "tcId": 3483, + "testPassed": true + }, + { + "tcId": 3483, + "testPassed": true + }, + { + "tcId": 3484, + "testPassed": true + }, + { + "tcId": 3484, + "testPassed": true + }, + { + "tcId": 3485, + "testPassed": true + }, + { + "tcId": 3485, + "testPassed": true + }, + { + "tcId": 3486, + "testPassed": true + }, + { + "tcId": 3486, + "testPassed": true + }, + { + "tcId": 3487, + "testPassed": true + }, + { + "tcId": 3487, + "testPassed": true + }, + { + "tcId": 3488, + "testPassed": true + }, + { + "tcId": 3488, + "testPassed": true + }, + { + "tcId": 3489, + "testPassed": false + }, + { + "tcId": 3489, + "testPassed": false + }, + { + "tcId": 3490, + "testPassed": true + }, + { + "tcId": 3490, + "testPassed": true + } + ] + }, + { + "tgId": 167, + "tests": [ + { + "tcId": 3491, + "testPassed": true + }, + { + "tcId": 3491, + "testPassed": true + }, + { + "tcId": 3492, + "testPassed": true + }, + { + "tcId": 3492, + "testPassed": true + }, + { + "tcId": 3493, + "testPassed": true + }, + { + "tcId": 3493, + "testPassed": true + }, + { + "tcId": 3494, + "testPassed": true + }, + { + "tcId": 3494, + "testPassed": true + }, + { + "tcId": 3495, + "testPassed": false + }, + { + "tcId": 3495, + "testPassed": false + }, + { + "tcId": 3496, + "testPassed": true + }, + { + "tcId": 3496, + "testPassed": true + }, + { + "tcId": 3497, + "testPassed": true + }, + { + "tcId": 3497, + "testPassed": true + }, + { + "tcId": 3498, + "testPassed": true + }, + { + "tcId": 3498, + "testPassed": true + }, + { + "tcId": 3499, + "testPassed": true + }, + { + "tcId": 3499, + "testPassed": true + }, + { + "tcId": 3500, + "testPassed": true + }, + { + "tcId": 3500, + "testPassed": true + }, + { + "tcId": 3501, + "testPassed": true + }, + { + "tcId": 3501, + "testPassed": true + }, + { + "tcId": 3502, + "testPassed": true + }, + { + "tcId": 3502, + "testPassed": true + }, + { + "tcId": 3503, + "testPassed": true + }, + { + "tcId": 3503, + "testPassed": true + }, + { + "tcId": 3504, + "testPassed": true + }, + { + "tcId": 3504, + "testPassed": true + }, + { + "tcId": 3505, + "testPassed": false + }, + { + "tcId": 3505, + "testPassed": false + } + ] + }, + { + "tgId": 168, + "tests": [ + { + "tcId": 3506, + "testPassed": true + }, + { + "tcId": 3506, + "testPassed": true + }, + { + "tcId": 3507, + "testPassed": true + }, + { + "tcId": 3507, + "testPassed": true + }, + { + "tcId": 3508, + "testPassed": true + }, + { + "tcId": 3508, + "testPassed": true + }, + { + "tcId": 3509, + "testPassed": true + }, + { + "tcId": 3509, + "testPassed": true + }, + { + "tcId": 3510, + "testPassed": false + }, + { + "tcId": 3510, + "testPassed": false + }, + { + "tcId": 3511, + "testPassed": false + }, + { + "tcId": 3511, + "testPassed": false + }, + { + "tcId": 3512, + "testPassed": true + }, + { + "tcId": 3512, + "testPassed": true + }, + { + "tcId": 3513, + "testPassed": true + }, + { + "tcId": 3513, + "testPassed": true + }, + { + "tcId": 3514, + "testPassed": true + }, + { + "tcId": 3514, + "testPassed": true + }, + { + "tcId": 3515, + "testPassed": true + }, + { + "tcId": 3515, + "testPassed": true + }, + { + "tcId": 3516, + "testPassed": true + }, + { + "tcId": 3516, + "testPassed": true + }, + { + "tcId": 3517, + "testPassed": true + }, + { + "tcId": 3517, + "testPassed": true + }, + { + "tcId": 3518, + "testPassed": true + }, + { + "tcId": 3518, + "testPassed": true + }, + { + "tcId": 3519, + "testPassed": true + }, + { + "tcId": 3519, + "testPassed": true + }, + { + "tcId": 3520, + "testPassed": true + }, + { + "tcId": 3520, + "testPassed": true + } + ] + }, + { + "tgId": 169, + "tests": [ + { + "tcId": 3521, + "testPassed": true + }, + { + "tcId": 3521, + "testPassed": true + }, + { + "tcId": 3522, + "testPassed": true + }, + { + "tcId": 3522, + "testPassed": true + }, + { + "tcId": 3523, + "testPassed": true + }, + { + "tcId": 3523, + "testPassed": true + }, + { + "tcId": 3524, + "testPassed": false + }, + { + "tcId": 3524, + "testPassed": false + }, + { + "tcId": 3525, + "testPassed": true + }, + { + "tcId": 3525, + "testPassed": true + }, + { + "tcId": 3526, + "testPassed": true + }, + { + "tcId": 3526, + "testPassed": true + }, + { + "tcId": 3527, + "testPassed": true + }, + { + "tcId": 3527, + "testPassed": true + }, + { + "tcId": 3528, + "testPassed": true + }, + { + "tcId": 3528, + "testPassed": true + }, + { + "tcId": 3529, + "testPassed": true + }, + { + "tcId": 3529, + "testPassed": true + }, + { + "tcId": 3530, + "testPassed": true + }, + { + "tcId": 3530, + "testPassed": true + }, + { + "tcId": 3531, + "testPassed": false + }, + { + "tcId": 3531, + "testPassed": false + }, + { + "tcId": 3532, + "testPassed": true + }, + { + "tcId": 3532, + "testPassed": true + }, + { + "tcId": 3533, + "testPassed": true + }, + { + "tcId": 3533, + "testPassed": true + }, + { + "tcId": 3534, + "testPassed": true + }, + { + "tcId": 3534, + "testPassed": true + }, + { + "tcId": 3535, + "testPassed": true + }, + { + "tcId": 3535, + "testPassed": true + } + ] + }, + { + "tgId": 170, + "tests": [ + { + "tcId": 3536, + "testPassed": true + }, + { + "tcId": 3536, + "testPassed": true + }, + { + "tcId": 3537, + "testPassed": true + }, + { + "tcId": 3537, + "testPassed": true + }, + { + "tcId": 3538, + "testPassed": true + }, + { + "tcId": 3538, + "testPassed": true + }, + { + "tcId": 3539, + "testPassed": false + }, + { + "tcId": 3539, + "testPassed": false + }, + { + "tcId": 3540, + "testPassed": true + }, + { + "tcId": 3540, + "testPassed": true + }, + { + "tcId": 3541, + "testPassed": true + }, + { + "tcId": 3541, + "testPassed": true + }, + { + "tcId": 3542, + "testPassed": true + }, + { + "tcId": 3542, + "testPassed": true + }, + { + "tcId": 3543, + "testPassed": true + }, + { + "tcId": 3543, + "testPassed": true + }, + { + "tcId": 3544, + "testPassed": false + }, + { + "tcId": 3544, + "testPassed": false + }, + { + "tcId": 3545, + "testPassed": true + }, + { + "tcId": 3545, + "testPassed": true + }, + { + "tcId": 3546, + "testPassed": true + }, + { + "tcId": 3546, + "testPassed": true + }, + { + "tcId": 3547, + "testPassed": true + }, + { + "tcId": 3547, + "testPassed": true + }, + { + "tcId": 3548, + "testPassed": true + }, + { + "tcId": 3548, + "testPassed": true + }, + { + "tcId": 3549, + "testPassed": true + }, + { + "tcId": 3549, + "testPassed": true + }, + { + "tcId": 3550, + "testPassed": true + }, + { + "tcId": 3550, + "testPassed": true + } + ] + }, + { + "tgId": 171, + "tests": [ + { + "tcId": 3551, + "testPassed": true + }, + { + "tcId": 3551, + "testPassed": true + }, + { + "tcId": 3552, + "testPassed": false + }, + { + "tcId": 3552, + "testPassed": false + }, + { + "tcId": 3553, + "testPassed": true + }, + { + "tcId": 3553, + "testPassed": true + }, + { + "tcId": 3554, + "testPassed": true + }, + { + "tcId": 3554, + "testPassed": true + }, + { + "tcId": 3555, + "testPassed": true + }, + { + "tcId": 3555, + "testPassed": true + }, + { + "tcId": 3556, + "testPassed": true + }, + { + "tcId": 3556, + "testPassed": true + }, + { + "tcId": 3557, + "testPassed": true + }, + { + "tcId": 3557, + "testPassed": true + }, + { + "tcId": 3558, + "testPassed": true + }, + { + "tcId": 3558, + "testPassed": true + }, + { + "tcId": 3559, + "testPassed": true + }, + { + "tcId": 3559, + "testPassed": true + }, + { + "tcId": 3560, + "testPassed": false + }, + { + "tcId": 3560, + "testPassed": false + }, + { + "tcId": 3561, + "testPassed": true + }, + { + "tcId": 3561, + "testPassed": true + }, + { + "tcId": 3562, + "testPassed": true + }, + { + "tcId": 3562, + "testPassed": true + }, + { + "tcId": 3563, + "testPassed": true + }, + { + "tcId": 3563, + "testPassed": true + }, + { + "tcId": 3564, + "testPassed": true + }, + { + "tcId": 3564, + "testPassed": true + }, + { + "tcId": 3565, + "testPassed": true + }, + { + "tcId": 3565, + "testPassed": true + } + ] + }, + { + "tgId": 172, + "tests": [ + { + "tcId": 3566, + "testPassed": true + }, + { + "tcId": 3566, + "testPassed": true + }, + { + "tcId": 3567, + "testPassed": true + }, + { + "tcId": 3567, + "testPassed": true + }, + { + "tcId": 3568, + "testPassed": true + }, + { + "tcId": 3568, + "testPassed": true + }, + { + "tcId": 3569, + "testPassed": true + }, + { + "tcId": 3569, + "testPassed": true + }, + { + "tcId": 3570, + "testPassed": true + }, + { + "tcId": 3570, + "testPassed": true + }, + { + "tcId": 3571, + "testPassed": true + }, + { + "tcId": 3571, + "testPassed": true + }, + { + "tcId": 3572, + "testPassed": true + }, + { + "tcId": 3572, + "testPassed": true + }, + { + "tcId": 3573, + "testPassed": true + }, + { + "tcId": 3573, + "testPassed": true + }, + { + "tcId": 3574, + "testPassed": true + }, + { + "tcId": 3574, + "testPassed": true + }, + { + "tcId": 3575, + "testPassed": true + }, + { + "tcId": 3575, + "testPassed": true + }, + { + "tcId": 3576, + "testPassed": true + }, + { + "tcId": 3576, + "testPassed": true + }, + { + "tcId": 3577, + "testPassed": false + }, + { + "tcId": 3577, + "testPassed": false + }, + { + "tcId": 3578, + "testPassed": true + }, + { + "tcId": 3578, + "testPassed": true + }, + { + "tcId": 3579, + "testPassed": true + }, + { + "tcId": 3579, + "testPassed": true + }, + { + "tcId": 3580, + "testPassed": false + }, + { + "tcId": 3580, + "testPassed": false + } + ] + }, + { + "tgId": 173, + "tests": [ + { + "tcId": 3581, + "testPassed": true + }, + { + "tcId": 3581, + "testPassed": true + }, + { + "tcId": 3582, + "testPassed": true + }, + { + "tcId": 3582, + "testPassed": true + }, + { + "tcId": 3583, + "testPassed": true + }, + { + "tcId": 3583, + "testPassed": true + }, + { + "tcId": 3584, + "testPassed": true + }, + { + "tcId": 3584, + "testPassed": true + }, + { + "tcId": 3585, + "testPassed": true + }, + { + "tcId": 3585, + "testPassed": true + }, + { + "tcId": 3586, + "testPassed": true + }, + { + "tcId": 3586, + "testPassed": true + }, + { + "tcId": 3587, + "testPassed": true + }, + { + "tcId": 3587, + "testPassed": true + }, + { + "tcId": 3588, + "testPassed": true + }, + { + "tcId": 3588, + "testPassed": true + }, + { + "tcId": 3589, + "testPassed": true + }, + { + "tcId": 3589, + "testPassed": true + }, + { + "tcId": 3590, + "testPassed": true + }, + { + "tcId": 3590, + "testPassed": true + }, + { + "tcId": 3591, + "testPassed": false + }, + { + "tcId": 3591, + "testPassed": false + }, + { + "tcId": 3592, + "testPassed": false + }, + { + "tcId": 3592, + "testPassed": false + }, + { + "tcId": 3593, + "testPassed": true + }, + { + "tcId": 3593, + "testPassed": true + }, + { + "tcId": 3594, + "testPassed": true + }, + { + "tcId": 3594, + "testPassed": true + }, + { + "tcId": 3595, + "testPassed": true + }, + { + "tcId": 3595, + "testPassed": true + } + ] + }, + { + "tgId": 174, + "tests": [ + { + "tcId": 3596, + "testPassed": true + }, + { + "tcId": 3596, + "testPassed": true + }, + { + "tcId": 3597, + "testPassed": true + }, + { + "tcId": 3597, + "testPassed": true + }, + { + "tcId": 3598, + "testPassed": false + }, + { + "tcId": 3598, + "testPassed": false + }, + { + "tcId": 3599, + "testPassed": true + }, + { + "tcId": 3599, + "testPassed": true + }, + { + "tcId": 3600, + "testPassed": false + }, + { + "tcId": 3600, + "testPassed": false + }, + { + "tcId": 3601, + "testPassed": true + }, + { + "tcId": 3601, + "testPassed": true + }, + { + "tcId": 3602, + "testPassed": true + }, + { + "tcId": 3602, + "testPassed": true + }, + { + "tcId": 3603, + "testPassed": true + }, + { + "tcId": 3603, + "testPassed": true + }, + { + "tcId": 3604, + "testPassed": true + }, + { + "tcId": 3604, + "testPassed": true + }, + { + "tcId": 3605, + "testPassed": true + }, + { + "tcId": 3605, + "testPassed": true + }, + { + "tcId": 3606, + "testPassed": true + }, + { + "tcId": 3606, + "testPassed": true + }, + { + "tcId": 3607, + "testPassed": true + }, + { + "tcId": 3607, + "testPassed": true + }, + { + "tcId": 3608, + "testPassed": true + }, + { + "tcId": 3608, + "testPassed": true + }, + { + "tcId": 3609, + "testPassed": true + }, + { + "tcId": 3609, + "testPassed": true + }, + { + "tcId": 3610, + "testPassed": true + }, + { + "tcId": 3610, + "testPassed": true + } + ] + }, + { + "tgId": 175, + "tests": [ + { + "tcId": 3611, + "testPassed": true + }, + { + "tcId": 3611, + "testPassed": true + }, + { + "tcId": 3612, + "testPassed": true + }, + { + "tcId": 3612, + "testPassed": true + }, + { + "tcId": 3613, + "testPassed": false + }, + { + "tcId": 3613, + "testPassed": false + }, + { + "tcId": 3614, + "testPassed": true + }, + { + "tcId": 3614, + "testPassed": true + }, + { + "tcId": 3615, + "testPassed": true + }, + { + "tcId": 3615, + "testPassed": true + }, + { + "tcId": 3616, + "testPassed": true + }, + { + "tcId": 3616, + "testPassed": true + }, + { + "tcId": 3617, + "testPassed": true + }, + { + "tcId": 3617, + "testPassed": true + }, + { + "tcId": 3618, + "testPassed": true + }, + { + "tcId": 3618, + "testPassed": true + }, + { + "tcId": 3619, + "testPassed": true + }, + { + "tcId": 3619, + "testPassed": true + }, + { + "tcId": 3620, + "testPassed": true + }, + { + "tcId": 3620, + "testPassed": true + }, + { + "tcId": 3621, + "testPassed": true + }, + { + "tcId": 3621, + "testPassed": true + }, + { + "tcId": 3622, + "testPassed": true + }, + { + "tcId": 3622, + "testPassed": true + }, + { + "tcId": 3623, + "testPassed": true + }, + { + "tcId": 3623, + "testPassed": true + }, + { + "tcId": 3624, + "testPassed": false + }, + { + "tcId": 3624, + "testPassed": false + }, + { + "tcId": 3625, + "testPassed": true + }, + { + "tcId": 3625, + "testPassed": true + } + ] + }, + { + "tgId": 176, + "tests": [ + { + "tcId": 3626, + "testPassed": true + }, + { + "tcId": 3626, + "testPassed": true + }, + { + "tcId": 3627, + "testPassed": true + }, + { + "tcId": 3627, + "testPassed": true + }, + { + "tcId": 3628, + "testPassed": true + }, + { + "tcId": 3628, + "testPassed": true + }, + { + "tcId": 3629, + "testPassed": true + }, + { + "tcId": 3629, + "testPassed": true + }, + { + "tcId": 3630, + "testPassed": true + }, + { + "tcId": 3630, + "testPassed": true + }, + { + "tcId": 3631, + "testPassed": true + }, + { + "tcId": 3631, + "testPassed": true + }, + { + "tcId": 3632, + "testPassed": true + }, + { + "tcId": 3632, + "testPassed": true + }, + { + "tcId": 3633, + "testPassed": false + }, + { + "tcId": 3633, + "testPassed": false + }, + { + "tcId": 3634, + "testPassed": true + }, + { + "tcId": 3634, + "testPassed": true + }, + { + "tcId": 3635, + "testPassed": true + }, + { + "tcId": 3635, + "testPassed": true + }, + { + "tcId": 3636, + "testPassed": true + }, + { + "tcId": 3636, + "testPassed": true + }, + { + "tcId": 3637, + "testPassed": true + }, + { + "tcId": 3637, + "testPassed": true + }, + { + "tcId": 3638, + "testPassed": true + }, + { + "tcId": 3638, + "testPassed": true + }, + { + "tcId": 3639, + "testPassed": true + }, + { + "tcId": 3639, + "testPassed": true + }, + { + "tcId": 3640, + "testPassed": false + }, + { + "tcId": 3640, + "testPassed": false + } + ] + }, + { + "tgId": 177, + "tests": [ + { + "tcId": 3641, + "testPassed": true + }, + { + "tcId": 3641, + "testPassed": true + }, + { + "tcId": 3642, + "testPassed": true + }, + { + "tcId": 3642, + "testPassed": true + }, + { + "tcId": 3643, + "testPassed": true + }, + { + "tcId": 3643, + "testPassed": true + }, + { + "tcId": 3644, + "testPassed": true + }, + { + "tcId": 3644, + "testPassed": true + }, + { + "tcId": 3645, + "testPassed": true + }, + { + "tcId": 3645, + "testPassed": true + }, + { + "tcId": 3646, + "testPassed": true + }, + { + "tcId": 3646, + "testPassed": true + }, + { + "tcId": 3647, + "testPassed": true + }, + { + "tcId": 3647, + "testPassed": true + }, + { + "tcId": 3648, + "testPassed": false + }, + { + "tcId": 3648, + "testPassed": false + }, + { + "tcId": 3649, + "testPassed": false + }, + { + "tcId": 3649, + "testPassed": false + }, + { + "tcId": 3650, + "testPassed": true + }, + { + "tcId": 3650, + "testPassed": true + }, + { + "tcId": 3651, + "testPassed": true + }, + { + "tcId": 3651, + "testPassed": true + }, + { + "tcId": 3652, + "testPassed": true + }, + { + "tcId": 3652, + "testPassed": true + }, + { + "tcId": 3653, + "testPassed": true + }, + { + "tcId": 3653, + "testPassed": true + }, + { + "tcId": 3654, + "testPassed": true + }, + { + "tcId": 3654, + "testPassed": true + }, + { + "tcId": 3655, + "testPassed": true + }, + { + "tcId": 3655, + "testPassed": true + } + ] + }, + { + "tgId": 178, + "tests": [ + { + "tcId": 3656, + "testPassed": false + }, + { + "tcId": 3656, + "testPassed": false + }, + { + "tcId": 3657, + "testPassed": true + }, + { + "tcId": 3657, + "testPassed": true + }, + { + "tcId": 3658, + "testPassed": true + }, + { + "tcId": 3658, + "testPassed": true + }, + { + "tcId": 3659, + "testPassed": true + }, + { + "tcId": 3659, + "testPassed": true + }, + { + "tcId": 3660, + "testPassed": false + }, + { + "tcId": 3660, + "testPassed": false + }, + { + "tcId": 3661, + "testPassed": true + }, + { + "tcId": 3661, + "testPassed": true + }, + { + "tcId": 3662, + "testPassed": true + }, + { + "tcId": 3662, + "testPassed": true + }, + { + "tcId": 3663, + "testPassed": true + }, + { + "tcId": 3663, + "testPassed": true + }, + { + "tcId": 3664, + "testPassed": true + }, + { + "tcId": 3664, + "testPassed": true + }, + { + "tcId": 3665, + "testPassed": true + }, + { + "tcId": 3665, + "testPassed": true + }, + { + "tcId": 3666, + "testPassed": true + }, + { + "tcId": 3666, + "testPassed": true + }, + { + "tcId": 3667, + "testPassed": true + }, + { + "tcId": 3667, + "testPassed": true + }, + { + "tcId": 3668, + "testPassed": true + }, + { + "tcId": 3668, + "testPassed": true + }, + { + "tcId": 3669, + "testPassed": true + }, + { + "tcId": 3669, + "testPassed": true + }, + { + "tcId": 3670, + "testPassed": true + }, + { + "tcId": 3670, + "testPassed": true + } + ] + }, + { + "tgId": 179, + "tests": [ + { + "tcId": 3671, + "testPassed": true + }, + { + "tcId": 3671, + "testPassed": true + }, + { + "tcId": 3672, + "testPassed": true + }, + { + "tcId": 3672, + "testPassed": true + }, + { + "tcId": 3673, + "testPassed": true + }, + { + "tcId": 3673, + "testPassed": true + }, + { + "tcId": 3674, + "testPassed": true + }, + { + "tcId": 3674, + "testPassed": true + }, + { + "tcId": 3675, + "testPassed": true + }, + { + "tcId": 3675, + "testPassed": true + }, + { + "tcId": 3676, + "testPassed": true + }, + { + "tcId": 3676, + "testPassed": true + }, + { + "tcId": 3677, + "testPassed": true + }, + { + "tcId": 3677, + "testPassed": true + }, + { + "tcId": 3678, + "testPassed": true + }, + { + "tcId": 3678, + "testPassed": true + }, + { + "tcId": 3679, + "testPassed": true + }, + { + "tcId": 3679, + "testPassed": true + }, + { + "tcId": 3680, + "testPassed": true + }, + { + "tcId": 3680, + "testPassed": true + }, + { + "tcId": 3681, + "testPassed": false + }, + { + "tcId": 3681, + "testPassed": false + }, + { + "tcId": 3682, + "testPassed": true + }, + { + "tcId": 3682, + "testPassed": true + }, + { + "tcId": 3683, + "testPassed": false + }, + { + "tcId": 3683, + "testPassed": false + }, + { + "tcId": 3684, + "testPassed": true + }, + { + "tcId": 3684, + "testPassed": true + }, + { + "tcId": 3685, + "testPassed": true + }, + { + "tcId": 3685, + "testPassed": true + } + ] + }, + { + "tgId": 180, + "tests": [ + { + "tcId": 3686, + "testPassed": false + }, + { + "tcId": 3686, + "testPassed": false + }, + { + "tcId": 3687, + "testPassed": true + }, + { + "tcId": 3687, + "testPassed": true + }, + { + "tcId": 3688, + "testPassed": true + }, + { + "tcId": 3688, + "testPassed": true + }, + { + "tcId": 3689, + "testPassed": true + }, + { + "tcId": 3689, + "testPassed": true + }, + { + "tcId": 3690, + "testPassed": true + }, + { + "tcId": 3690, + "testPassed": true + }, + { + "tcId": 3691, + "testPassed": true + }, + { + "tcId": 3691, + "testPassed": true + }, + { + "tcId": 3692, + "testPassed": true + }, + { + "tcId": 3692, + "testPassed": true + }, + { + "tcId": 3693, + "testPassed": true + }, + { + "tcId": 3693, + "testPassed": true + }, + { + "tcId": 3694, + "testPassed": true + }, + { + "tcId": 3694, + "testPassed": true + }, + { + "tcId": 3695, + "testPassed": true + }, + { + "tcId": 3695, + "testPassed": true + }, + { + "tcId": 3696, + "testPassed": true + }, + { + "tcId": 3696, + "testPassed": true + }, + { + "tcId": 3697, + "testPassed": false + }, + { + "tcId": 3697, + "testPassed": false + }, + { + "tcId": 3698, + "testPassed": true + }, + { + "tcId": 3698, + "testPassed": true + }, + { + "tcId": 3699, + "testPassed": true + }, + { + "tcId": 3699, + "testPassed": true + }, + { + "tcId": 3700, + "testPassed": true + }, + { + "tcId": 3700, + "testPassed": true + } + ] + }, + { + "tgId": 181, + "tests": [ + { + "tcId": 3701, + "testPassed": true + }, + { + "tcId": 3701, + "testPassed": true + }, + { + "tcId": 3702, + "testPassed": true + }, + { + "tcId": 3702, + "testPassed": true + }, + { + "tcId": 3703, + "testPassed": true + }, + { + "tcId": 3703, + "testPassed": true + }, + { + "tcId": 3704, + "testPassed": true + }, + { + "tcId": 3704, + "testPassed": true + }, + { + "tcId": 3705, + "testPassed": true + }, + { + "tcId": 3705, + "testPassed": true + }, + { + "tcId": 3706, + "testPassed": true + }, + { + "tcId": 3706, + "testPassed": true + }, + { + "tcId": 3707, + "testPassed": true + }, + { + "tcId": 3707, + "testPassed": true + }, + { + "tcId": 3708, + "testPassed": true + }, + { + "tcId": 3708, + "testPassed": true + }, + { + "tcId": 3709, + "testPassed": true + }, + { + "tcId": 3709, + "testPassed": true + }, + { + "tcId": 3710, + "testPassed": true + }, + { + "tcId": 3710, + "testPassed": true + }, + { + "tcId": 3711, + "testPassed": true + }, + { + "tcId": 3711, + "testPassed": true + }, + { + "tcId": 3712, + "testPassed": true + }, + { + "tcId": 3712, + "testPassed": true + }, + { + "tcId": 3713, + "testPassed": true + }, + { + "tcId": 3713, + "testPassed": true + }, + { + "tcId": 3714, + "testPassed": false + }, + { + "tcId": 3714, + "testPassed": false + }, + { + "tcId": 3715, + "testPassed": false + }, + { + "tcId": 3715, + "testPassed": false + } + ] + }, + { + "tgId": 182, + "tests": [ + { + "tcId": 3716, + "testPassed": false + }, + { + "tcId": 3716, + "testPassed": false + }, + { + "tcId": 3717, + "testPassed": true + }, + { + "tcId": 3717, + "testPassed": true + }, + { + "tcId": 3718, + "testPassed": true + }, + { + "tcId": 3718, + "testPassed": true + }, + { + "tcId": 3719, + "testPassed": true + }, + { + "tcId": 3719, + "testPassed": true + }, + { + "tcId": 3720, + "testPassed": true + }, + { + "tcId": 3720, + "testPassed": true + }, + { + "tcId": 3721, + "testPassed": true + }, + { + "tcId": 3721, + "testPassed": true + }, + { + "tcId": 3722, + "testPassed": false + }, + { + "tcId": 3722, + "testPassed": false + }, + { + "tcId": 3723, + "testPassed": true + }, + { + "tcId": 3723, + "testPassed": true + }, + { + "tcId": 3724, + "testPassed": true + }, + { + "tcId": 3724, + "testPassed": true + }, + { + "tcId": 3725, + "testPassed": true + }, + { + "tcId": 3725, + "testPassed": true + }, + { + "tcId": 3726, + "testPassed": true + }, + { + "tcId": 3726, + "testPassed": true + }, + { + "tcId": 3727, + "testPassed": true + }, + { + "tcId": 3727, + "testPassed": true + }, + { + "tcId": 3728, + "testPassed": true + }, + { + "tcId": 3728, + "testPassed": true + }, + { + "tcId": 3729, + "testPassed": true + }, + { + "tcId": 3729, + "testPassed": true + }, + { + "tcId": 3730, + "testPassed": true + }, + { + "tcId": 3730, + "testPassed": true + } + ] + }, + { + "tgId": 183, + "tests": [ + { + "tcId": 3731, + "testPassed": false + }, + { + "tcId": 3731, + "testPassed": false + }, + { + "tcId": 3732, + "testPassed": true + }, + { + "tcId": 3732, + "testPassed": true + }, + { + "tcId": 3733, + "testPassed": true + }, + { + "tcId": 3733, + "testPassed": true + }, + { + "tcId": 3734, + "testPassed": false + }, + { + "tcId": 3734, + "testPassed": false + }, + { + "tcId": 3735, + "testPassed": true + }, + { + "tcId": 3735, + "testPassed": true + }, + { + "tcId": 3736, + "testPassed": true + }, + { + "tcId": 3736, + "testPassed": true + }, + { + "tcId": 3737, + "testPassed": true + }, + { + "tcId": 3737, + "testPassed": true + }, + { + "tcId": 3738, + "testPassed": true + }, + { + "tcId": 3738, + "testPassed": true + }, + { + "tcId": 3739, + "testPassed": true + }, + { + "tcId": 3739, + "testPassed": true + }, + { + "tcId": 3740, + "testPassed": true + }, + { + "tcId": 3740, + "testPassed": true + }, + { + "tcId": 3741, + "testPassed": true + }, + { + "tcId": 3741, + "testPassed": true + }, + { + "tcId": 3742, + "testPassed": true + }, + { + "tcId": 3742, + "testPassed": true + }, + { + "tcId": 3743, + "testPassed": true + }, + { + "tcId": 3743, + "testPassed": true + }, + { + "tcId": 3744, + "testPassed": true + }, + { + "tcId": 3744, + "testPassed": true + }, + { + "tcId": 3745, + "testPassed": true + }, + { + "tcId": 3745, + "testPassed": true + } + ] + }, + { + "tgId": 184, + "tests": [ + { + "tcId": 3746, + "testPassed": true + }, + { + "tcId": 3746, + "testPassed": true + }, + { + "tcId": 3747, + "testPassed": false + }, + { + "tcId": 3747, + "testPassed": false + }, + { + "tcId": 3748, + "testPassed": true + }, + { + "tcId": 3748, + "testPassed": true + }, + { + "tcId": 3749, + "testPassed": true + }, + { + "tcId": 3749, + "testPassed": true + }, + { + "tcId": 3750, + "testPassed": true + }, + { + "tcId": 3750, + "testPassed": true + }, + { + "tcId": 3751, + "testPassed": true + }, + { + "tcId": 3751, + "testPassed": true + }, + { + "tcId": 3752, + "testPassed": true + }, + { + "tcId": 3752, + "testPassed": true + }, + { + "tcId": 3753, + "testPassed": true + }, + { + "tcId": 3753, + "testPassed": true + }, + { + "tcId": 3754, + "testPassed": true + }, + { + "tcId": 3754, + "testPassed": true + }, + { + "tcId": 3755, + "testPassed": true + }, + { + "tcId": 3755, + "testPassed": true + }, + { + "tcId": 3756, + "testPassed": false + }, + { + "tcId": 3756, + "testPassed": false + }, + { + "tcId": 3757, + "testPassed": true + }, + { + "tcId": 3757, + "testPassed": true + }, + { + "tcId": 3758, + "testPassed": true + }, + { + "tcId": 3758, + "testPassed": true + }, + { + "tcId": 3759, + "testPassed": true + }, + { + "tcId": 3759, + "testPassed": true + }, + { + "tcId": 3760, + "testPassed": true + }, + { + "tcId": 3760, + "testPassed": true + } + ] + }, + { + "tgId": 185, + "tests": [ + { + "tcId": 3761, + "testPassed": true + }, + { + "tcId": 3761, + "testPassed": true + }, + { + "tcId": 3762, + "testPassed": false + }, + { + "tcId": 3762, + "testPassed": false + }, + { + "tcId": 3763, + "testPassed": true + }, + { + "tcId": 3763, + "testPassed": true + }, + { + "tcId": 3764, + "testPassed": false + }, + { + "tcId": 3764, + "testPassed": false + }, + { + "tcId": 3765, + "testPassed": true + }, + { + "tcId": 3765, + "testPassed": true + }, + { + "tcId": 3766, + "testPassed": true + }, + { + "tcId": 3766, + "testPassed": true + }, + { + "tcId": 3767, + "testPassed": true + }, + { + "tcId": 3767, + "testPassed": true + }, + { + "tcId": 3768, + "testPassed": true + }, + { + "tcId": 3768, + "testPassed": true + }, + { + "tcId": 3769, + "testPassed": true + }, + { + "tcId": 3769, + "testPassed": true + }, + { + "tcId": 3770, + "testPassed": true + }, + { + "tcId": 3770, + "testPassed": true + }, + { + "tcId": 3771, + "testPassed": true + }, + { + "tcId": 3771, + "testPassed": true + }, + { + "tcId": 3772, + "testPassed": true + }, + { + "tcId": 3772, + "testPassed": true + }, + { + "tcId": 3773, + "testPassed": true + }, + { + "tcId": 3773, + "testPassed": true + }, + { + "tcId": 3774, + "testPassed": true + }, + { + "tcId": 3774, + "testPassed": true + }, + { + "tcId": 3775, + "testPassed": true + }, + { + "tcId": 3775, + "testPassed": true + } + ] + }, + { + "tgId": 186, + "tests": [ + { + "tcId": 3776, + "testPassed": true + }, + { + "tcId": 3776, + "testPassed": true + }, + { + "tcId": 3777, + "testPassed": false + }, + { + "tcId": 3777, + "testPassed": false + }, + { + "tcId": 3778, + "testPassed": true + }, + { + "tcId": 3778, + "testPassed": true + }, + { + "tcId": 3779, + "testPassed": true + }, + { + "tcId": 3779, + "testPassed": true + }, + { + "tcId": 3780, + "testPassed": false + }, + { + "tcId": 3780, + "testPassed": false + }, + { + "tcId": 3781, + "testPassed": true + }, + { + "tcId": 3781, + "testPassed": true + }, + { + "tcId": 3782, + "testPassed": true + }, + { + "tcId": 3782, + "testPassed": true + }, + { + "tcId": 3783, + "testPassed": true + }, + { + "tcId": 3783, + "testPassed": true + }, + { + "tcId": 3784, + "testPassed": true + }, + { + "tcId": 3784, + "testPassed": true + }, + { + "tcId": 3785, + "testPassed": true + }, + { + "tcId": 3785, + "testPassed": true + }, + { + "tcId": 3786, + "testPassed": true + }, + { + "tcId": 3786, + "testPassed": true + }, + { + "tcId": 3787, + "testPassed": true + }, + { + "tcId": 3787, + "testPassed": true + }, + { + "tcId": 3788, + "testPassed": true + }, + { + "tcId": 3788, + "testPassed": true + }, + { + "tcId": 3789, + "testPassed": true + }, + { + "tcId": 3789, + "testPassed": true + }, + { + "tcId": 3790, + "testPassed": true + }, + { + "tcId": 3790, + "testPassed": true + } + ] + }, + { + "tgId": 187, + "tests": [ + { + "tcId": 3791, + "testPassed": true + }, + { + "tcId": 3791, + "testPassed": true + }, + { + "tcId": 3792, + "testPassed": true + }, + { + "tcId": 3792, + "testPassed": true + }, + { + "tcId": 3793, + "testPassed": true + }, + { + "tcId": 3793, + "testPassed": true + }, + { + "tcId": 3794, + "testPassed": true + }, + { + "tcId": 3794, + "testPassed": true + }, + { + "tcId": 3795, + "testPassed": true + }, + { + "tcId": 3795, + "testPassed": true + }, + { + "tcId": 3796, + "testPassed": true + }, + { + "tcId": 3796, + "testPassed": true + }, + { + "tcId": 3797, + "testPassed": true + }, + { + "tcId": 3797, + "testPassed": true + }, + { + "tcId": 3798, + "testPassed": false + }, + { + "tcId": 3798, + "testPassed": false + }, + { + "tcId": 3799, + "testPassed": false + }, + { + "tcId": 3799, + "testPassed": false + }, + { + "tcId": 3800, + "testPassed": true + }, + { + "tcId": 3800, + "testPassed": true + }, + { + "tcId": 3801, + "testPassed": true + }, + { + "tcId": 3801, + "testPassed": true + }, + { + "tcId": 3802, + "testPassed": true + }, + { + "tcId": 3802, + "testPassed": true + }, + { + "tcId": 3803, + "testPassed": true + }, + { + "tcId": 3803, + "testPassed": true + }, + { + "tcId": 3804, + "testPassed": true + }, + { + "tcId": 3804, + "testPassed": true + }, + { + "tcId": 3805, + "testPassed": true + }, + { + "tcId": 3805, + "testPassed": true + } + ] + }, + { + "tgId": 188, + "tests": [ + { + "tcId": 3806, + "testPassed": true + }, + { + "tcId": 3806, + "testPassed": true + }, + { + "tcId": 3807, + "testPassed": true + }, + { + "tcId": 3807, + "testPassed": true + }, + { + "tcId": 3808, + "testPassed": true + }, + { + "tcId": 3808, + "testPassed": true + }, + { + "tcId": 3809, + "testPassed": false + }, + { + "tcId": 3809, + "testPassed": false + }, + { + "tcId": 3810, + "testPassed": true + }, + { + "tcId": 3810, + "testPassed": true + }, + { + "tcId": 3811, + "testPassed": true + }, + { + "tcId": 3811, + "testPassed": true + }, + { + "tcId": 3812, + "testPassed": true + }, + { + "tcId": 3812, + "testPassed": true + }, + { + "tcId": 3813, + "testPassed": true + }, + { + "tcId": 3813, + "testPassed": true + }, + { + "tcId": 3814, + "testPassed": false + }, + { + "tcId": 3814, + "testPassed": false + }, + { + "tcId": 3815, + "testPassed": true + }, + { + "tcId": 3815, + "testPassed": true + }, + { + "tcId": 3816, + "testPassed": true + }, + { + "tcId": 3816, + "testPassed": true + }, + { + "tcId": 3817, + "testPassed": true + }, + { + "tcId": 3817, + "testPassed": true + }, + { + "tcId": 3818, + "testPassed": true + }, + { + "tcId": 3818, + "testPassed": true + }, + { + "tcId": 3819, + "testPassed": true + }, + { + "tcId": 3819, + "testPassed": true + }, + { + "tcId": 3820, + "testPassed": true + }, + { + "tcId": 3820, + "testPassed": true + } + ] + }, + { + "tgId": 189, + "tests": [ + { + "tcId": 3821, + "testPassed": true + }, + { + "tcId": 3821, + "testPassed": true + }, + { + "tcId": 3822, + "testPassed": true + }, + { + "tcId": 3822, + "testPassed": true + }, + { + "tcId": 3823, + "testPassed": true + }, + { + "tcId": 3823, + "testPassed": true + }, + { + "tcId": 3824, + "testPassed": true + }, + { + "tcId": 3824, + "testPassed": true + }, + { + "tcId": 3825, + "testPassed": true + }, + { + "tcId": 3825, + "testPassed": true + }, + { + "tcId": 3826, + "testPassed": true + }, + { + "tcId": 3826, + "testPassed": true + }, + { + "tcId": 3827, + "testPassed": true + }, + { + "tcId": 3827, + "testPassed": true + }, + { + "tcId": 3828, + "testPassed": true + }, + { + "tcId": 3828, + "testPassed": true + }, + { + "tcId": 3829, + "testPassed": false + }, + { + "tcId": 3829, + "testPassed": false + }, + { + "tcId": 3830, + "testPassed": true + }, + { + "tcId": 3830, + "testPassed": true + }, + { + "tcId": 3831, + "testPassed": false + }, + { + "tcId": 3831, + "testPassed": false + }, + { + "tcId": 3832, + "testPassed": true + }, + { + "tcId": 3832, + "testPassed": true + }, + { + "tcId": 3833, + "testPassed": true + }, + { + "tcId": 3833, + "testPassed": true + }, + { + "tcId": 3834, + "testPassed": true + }, + { + "tcId": 3834, + "testPassed": true + }, + { + "tcId": 3835, + "testPassed": true + }, + { + "tcId": 3835, + "testPassed": true + } + ] + }, + { + "tgId": 190, + "tests": [ + { + "tcId": 3836, + "testPassed": true + }, + { + "tcId": 3836, + "testPassed": true + }, + { + "tcId": 3837, + "testPassed": true + }, + { + "tcId": 3837, + "testPassed": true + }, + { + "tcId": 3838, + "testPassed": true + }, + { + "tcId": 3838, + "testPassed": true + }, + { + "tcId": 3839, + "testPassed": true + }, + { + "tcId": 3839, + "testPassed": true + }, + { + "tcId": 3840, + "testPassed": true + }, + { + "tcId": 3840, + "testPassed": true + }, + { + "tcId": 3841, + "testPassed": true + }, + { + "tcId": 3841, + "testPassed": true + }, + { + "tcId": 3842, + "testPassed": true + }, + { + "tcId": 3842, + "testPassed": true + }, + { + "tcId": 3843, + "testPassed": true + }, + { + "tcId": 3843, + "testPassed": true + }, + { + "tcId": 3844, + "testPassed": true + }, + { + "tcId": 3844, + "testPassed": true + }, + { + "tcId": 3845, + "testPassed": true + }, + { + "tcId": 3845, + "testPassed": true + }, + { + "tcId": 3846, + "testPassed": true + }, + { + "tcId": 3846, + "testPassed": true + }, + { + "tcId": 3847, + "testPassed": true + }, + { + "tcId": 3847, + "testPassed": true + }, + { + "tcId": 3848, + "testPassed": false + }, + { + "tcId": 3848, + "testPassed": false + }, + { + "tcId": 3849, + "testPassed": true + }, + { + "tcId": 3849, + "testPassed": true + }, + { + "tcId": 3850, + "testPassed": false + }, + { + "tcId": 3850, + "testPassed": false + } + ] + }, + { + "tgId": 191, + "tests": [ + { + "tcId": 3851, + "testPassed": true + }, + { + "tcId": 3851, + "testPassed": true + }, + { + "tcId": 3852, + "testPassed": true + }, + { + "tcId": 3852, + "testPassed": true + }, + { + "tcId": 3853, + "testPassed": true + }, + { + "tcId": 3853, + "testPassed": true + }, + { + "tcId": 3854, + "testPassed": true + }, + { + "tcId": 3854, + "testPassed": true + }, + { + "tcId": 3855, + "testPassed": true + }, + { + "tcId": 3855, + "testPassed": true + }, + { + "tcId": 3856, + "testPassed": true + }, + { + "tcId": 3856, + "testPassed": true + }, + { + "tcId": 3857, + "testPassed": true + }, + { + "tcId": 3857, + "testPassed": true + }, + { + "tcId": 3858, + "testPassed": true + }, + { + "tcId": 3858, + "testPassed": true + }, + { + "tcId": 3859, + "testPassed": true + }, + { + "tcId": 3859, + "testPassed": true + }, + { + "tcId": 3860, + "testPassed": true + }, + { + "tcId": 3860, + "testPassed": true + }, + { + "tcId": 3861, + "testPassed": false + }, + { + "tcId": 3861, + "testPassed": false + }, + { + "tcId": 3862, + "testPassed": true + }, + { + "tcId": 3862, + "testPassed": true + }, + { + "tcId": 3863, + "testPassed": true + }, + { + "tcId": 3863, + "testPassed": true + }, + { + "tcId": 3864, + "testPassed": true + }, + { + "tcId": 3864, + "testPassed": true + }, + { + "tcId": 3865, + "testPassed": false + }, + { + "tcId": 3865, + "testPassed": false + } + ] + }, + { + "tgId": 192, + "tests": [ + { + "tcId": 3866, + "testPassed": false + }, + { + "tcId": 3866, + "testPassed": false + }, + { + "tcId": 3867, + "testPassed": true + }, + { + "tcId": 3867, + "testPassed": true + }, + { + "tcId": 3868, + "testPassed": false + }, + { + "tcId": 3868, + "testPassed": false + }, + { + "tcId": 3869, + "testPassed": true + }, + { + "tcId": 3869, + "testPassed": true + }, + { + "tcId": 3870, + "testPassed": true + }, + { + "tcId": 3870, + "testPassed": true + }, + { + "tcId": 3871, + "testPassed": true + }, + { + "tcId": 3871, + "testPassed": true + }, + { + "tcId": 3872, + "testPassed": true + }, + { + "tcId": 3872, + "testPassed": true + }, + { + "tcId": 3873, + "testPassed": true + }, + { + "tcId": 3873, + "testPassed": true + }, + { + "tcId": 3874, + "testPassed": true + }, + { + "tcId": 3874, + "testPassed": true + }, + { + "tcId": 3875, + "testPassed": true + }, + { + "tcId": 3875, + "testPassed": true + }, + { + "tcId": 3876, + "testPassed": true + }, + { + "tcId": 3876, + "testPassed": true + }, + { + "tcId": 3877, + "testPassed": true + }, + { + "tcId": 3877, + "testPassed": true + }, + { + "tcId": 3878, + "testPassed": true + }, + { + "tcId": 3878, + "testPassed": true + }, + { + "tcId": 3879, + "testPassed": true + }, + { + "tcId": 3879, + "testPassed": true + }, + { + "tcId": 3880, + "testPassed": true + }, + { + "tcId": 3880, + "testPassed": true + } + ] + }, + { + "tgId": 193, + "tests": [ + { + "tcId": 3881, + "testPassed": true + }, + { + "tcId": 3881, + "testPassed": true + }, + { + "tcId": 3882, + "testPassed": true + }, + { + "tcId": 3882, + "testPassed": true + }, + { + "tcId": 3883, + "testPassed": true + }, + { + "tcId": 3883, + "testPassed": true + }, + { + "tcId": 3884, + "testPassed": true + }, + { + "tcId": 3884, + "testPassed": true + }, + { + "tcId": 3885, + "testPassed": true + }, + { + "tcId": 3885, + "testPassed": true + }, + { + "tcId": 3886, + "testPassed": false + }, + { + "tcId": 3886, + "testPassed": false + }, + { + "tcId": 3887, + "testPassed": true + }, + { + "tcId": 3887, + "testPassed": true + }, + { + "tcId": 3888, + "testPassed": true + }, + { + "tcId": 3888, + "testPassed": true + }, + { + "tcId": 3889, + "testPassed": true + }, + { + "tcId": 3889, + "testPassed": true + }, + { + "tcId": 3890, + "testPassed": false + }, + { + "tcId": 3890, + "testPassed": false + }, + { + "tcId": 3891, + "testPassed": true + }, + { + "tcId": 3891, + "testPassed": true + }, + { + "tcId": 3892, + "testPassed": true + }, + { + "tcId": 3892, + "testPassed": true + }, + { + "tcId": 3893, + "testPassed": true + }, + { + "tcId": 3893, + "testPassed": true + }, + { + "tcId": 3894, + "testPassed": true + }, + { + "tcId": 3894, + "testPassed": true + }, + { + "tcId": 3895, + "testPassed": true + }, + { + "tcId": 3895, + "testPassed": true + } + ] + }, + { + "tgId": 194, + "tests": [ + { + "tcId": 3896, + "testPassed": true + }, + { + "tcId": 3896, + "testPassed": true + }, + { + "tcId": 3897, + "testPassed": true + }, + { + "tcId": 3897, + "testPassed": true + }, + { + "tcId": 3898, + "testPassed": true + }, + { + "tcId": 3898, + "testPassed": true + }, + { + "tcId": 3899, + "testPassed": true + }, + { + "tcId": 3899, + "testPassed": true + }, + { + "tcId": 3900, + "testPassed": true + }, + { + "tcId": 3900, + "testPassed": true + }, + { + "tcId": 3901, + "testPassed": false + }, + { + "tcId": 3901, + "testPassed": false + }, + { + "tcId": 3902, + "testPassed": true + }, + { + "tcId": 3902, + "testPassed": true + }, + { + "tcId": 3903, + "testPassed": true + }, + { + "tcId": 3903, + "testPassed": true + }, + { + "tcId": 3904, + "testPassed": true + }, + { + "tcId": 3904, + "testPassed": true + }, + { + "tcId": 3905, + "testPassed": false + }, + { + "tcId": 3905, + "testPassed": false + }, + { + "tcId": 3906, + "testPassed": true + }, + { + "tcId": 3906, + "testPassed": true + }, + { + "tcId": 3907, + "testPassed": true + }, + { + "tcId": 3907, + "testPassed": true + }, + { + "tcId": 3908, + "testPassed": true + }, + { + "tcId": 3908, + "testPassed": true + }, + { + "tcId": 3909, + "testPassed": true + }, + { + "tcId": 3909, + "testPassed": true + }, + { + "tcId": 3910, + "testPassed": true + }, + { + "tcId": 3910, + "testPassed": true + } + ] + }, + { + "tgId": 195, + "tests": [ + { + "tcId": 3911, + "testPassed": false + }, + { + "tcId": 3911, + "testPassed": false + }, + { + "tcId": 3912, + "testPassed": true + }, + { + "tcId": 3912, + "testPassed": true + }, + { + "tcId": 3913, + "testPassed": true + }, + { + "tcId": 3913, + "testPassed": true + }, + { + "tcId": 3914, + "testPassed": true + }, + { + "tcId": 3914, + "testPassed": true + }, + { + "tcId": 3915, + "testPassed": true + }, + { + "tcId": 3915, + "testPassed": true + }, + { + "tcId": 3916, + "testPassed": true + }, + { + "tcId": 3916, + "testPassed": true + }, + { + "tcId": 3917, + "testPassed": true + }, + { + "tcId": 3917, + "testPassed": true + }, + { + "tcId": 3918, + "testPassed": true + }, + { + "tcId": 3918, + "testPassed": true + }, + { + "tcId": 3919, + "testPassed": true + }, + { + "tcId": 3919, + "testPassed": true + }, + { + "tcId": 3920, + "testPassed": true + }, + { + "tcId": 3920, + "testPassed": true + }, + { + "tcId": 3921, + "testPassed": false + }, + { + "tcId": 3921, + "testPassed": false + }, + { + "tcId": 3922, + "testPassed": true + }, + { + "tcId": 3922, + "testPassed": true + }, + { + "tcId": 3923, + "testPassed": true + }, + { + "tcId": 3923, + "testPassed": true + }, + { + "tcId": 3924, + "testPassed": true + }, + { + "tcId": 3924, + "testPassed": true + }, + { + "tcId": 3925, + "testPassed": true + }, + { + "tcId": 3925, + "testPassed": true + } + ] + }, + { + "tgId": 196, + "tests": [ + { + "tcId": 3926, + "testPassed": true + }, + { + "tcId": 3926, + "testPassed": true + }, + { + "tcId": 3927, + "testPassed": true + }, + { + "tcId": 3927, + "testPassed": true + }, + { + "tcId": 3928, + "testPassed": true + }, + { + "tcId": 3928, + "testPassed": true + }, + { + "tcId": 3929, + "testPassed": false + }, + { + "tcId": 3929, + "testPassed": false + }, + { + "tcId": 3930, + "testPassed": true + }, + { + "tcId": 3930, + "testPassed": true + }, + { + "tcId": 3931, + "testPassed": true + }, + { + "tcId": 3931, + "testPassed": true + }, + { + "tcId": 3932, + "testPassed": true + }, + { + "tcId": 3932, + "testPassed": true + }, + { + "tcId": 3933, + "testPassed": true + }, + { + "tcId": 3933, + "testPassed": true + }, + { + "tcId": 3934, + "testPassed": false + }, + { + "tcId": 3934, + "testPassed": false + }, + { + "tcId": 3935, + "testPassed": true + }, + { + "tcId": 3935, + "testPassed": true + }, + { + "tcId": 3936, + "testPassed": true + }, + { + "tcId": 3936, + "testPassed": true + }, + { + "tcId": 3937, + "testPassed": true + }, + { + "tcId": 3937, + "testPassed": true + }, + { + "tcId": 3938, + "testPassed": true + }, + { + "tcId": 3938, + "testPassed": true + }, + { + "tcId": 3939, + "testPassed": true + }, + { + "tcId": 3939, + "testPassed": true + }, + { + "tcId": 3940, + "testPassed": true + }, + { + "tcId": 3940, + "testPassed": true + } + ] + }, + { + "tgId": 197, + "tests": [ + { + "tcId": 3941, + "testPassed": true + }, + { + "tcId": 3941, + "testPassed": true + }, + { + "tcId": 3942, + "testPassed": true + }, + { + "tcId": 3942, + "testPassed": true + }, + { + "tcId": 3943, + "testPassed": true + }, + { + "tcId": 3943, + "testPassed": true + }, + { + "tcId": 3944, + "testPassed": true + }, + { + "tcId": 3944, + "testPassed": true + }, + { + "tcId": 3945, + "testPassed": true + }, + { + "tcId": 3945, + "testPassed": true + }, + { + "tcId": 3946, + "testPassed": true + }, + { + "tcId": 3946, + "testPassed": true + }, + { + "tcId": 3947, + "testPassed": true + }, + { + "tcId": 3947, + "testPassed": true + }, + { + "tcId": 3948, + "testPassed": false + }, + { + "tcId": 3948, + "testPassed": false + }, + { + "tcId": 3949, + "testPassed": true + }, + { + "tcId": 3949, + "testPassed": true + }, + { + "tcId": 3950, + "testPassed": true + }, + { + "tcId": 3950, + "testPassed": true + }, + { + "tcId": 3951, + "testPassed": false + }, + { + "tcId": 3951, + "testPassed": false + }, + { + "tcId": 3952, + "testPassed": true + }, + { + "tcId": 3952, + "testPassed": true + }, + { + "tcId": 3953, + "testPassed": true + }, + { + "tcId": 3953, + "testPassed": true + }, + { + "tcId": 3954, + "testPassed": true + }, + { + "tcId": 3954, + "testPassed": true + }, + { + "tcId": 3955, + "testPassed": true + }, + { + "tcId": 3955, + "testPassed": true + } + ] + }, + { + "tgId": 198, + "tests": [ + { + "tcId": 3956, + "testPassed": true + }, + { + "tcId": 3956, + "testPassed": true + }, + { + "tcId": 3957, + "testPassed": true + }, + { + "tcId": 3957, + "testPassed": true + }, + { + "tcId": 3958, + "testPassed": true + }, + { + "tcId": 3958, + "testPassed": true + }, + { + "tcId": 3959, + "testPassed": true + }, + { + "tcId": 3959, + "testPassed": true + }, + { + "tcId": 3960, + "testPassed": true + }, + { + "tcId": 3960, + "testPassed": true + }, + { + "tcId": 3961, + "testPassed": true + }, + { + "tcId": 3961, + "testPassed": true + }, + { + "tcId": 3962, + "testPassed": true + }, + { + "tcId": 3962, + "testPassed": true + }, + { + "tcId": 3963, + "testPassed": true + }, + { + "tcId": 3963, + "testPassed": true + }, + { + "tcId": 3964, + "testPassed": true + }, + { + "tcId": 3964, + "testPassed": true + }, + { + "tcId": 3965, + "testPassed": true + }, + { + "tcId": 3965, + "testPassed": true + }, + { + "tcId": 3966, + "testPassed": true + }, + { + "tcId": 3966, + "testPassed": true + }, + { + "tcId": 3967, + "testPassed": false + }, + { + "tcId": 3967, + "testPassed": false + }, + { + "tcId": 3968, + "testPassed": false + }, + { + "tcId": 3968, + "testPassed": false + }, + { + "tcId": 3969, + "testPassed": true + }, + { + "tcId": 3969, + "testPassed": true + }, + { + "tcId": 3970, + "testPassed": true + }, + { + "tcId": 3970, + "testPassed": true + } + ] + }, + { + "tgId": 199, + "tests": [ + { + "tcId": 3971, + "testPassed": true + }, + { + "tcId": 3971, + "testPassed": true + }, + { + "tcId": 3972, + "testPassed": true + }, + { + "tcId": 3972, + "testPassed": true + }, + { + "tcId": 3973, + "testPassed": true + }, + { + "tcId": 3973, + "testPassed": true + }, + { + "tcId": 3974, + "testPassed": true + }, + { + "tcId": 3974, + "testPassed": true + }, + { + "tcId": 3975, + "testPassed": true + }, + { + "tcId": 3975, + "testPassed": true + }, + { + "tcId": 3976, + "testPassed": true + }, + { + "tcId": 3976, + "testPassed": true + }, + { + "tcId": 3977, + "testPassed": true + }, + { + "tcId": 3977, + "testPassed": true + }, + { + "tcId": 3978, + "testPassed": false + }, + { + "tcId": 3978, + "testPassed": false + }, + { + "tcId": 3979, + "testPassed": true + }, + { + "tcId": 3979, + "testPassed": true + }, + { + "tcId": 3980, + "testPassed": true + }, + { + "tcId": 3980, + "testPassed": true + }, + { + "tcId": 3981, + "testPassed": false + }, + { + "tcId": 3981, + "testPassed": false + }, + { + "tcId": 3982, + "testPassed": true + }, + { + "tcId": 3982, + "testPassed": true + }, + { + "tcId": 3983, + "testPassed": true + }, + { + "tcId": 3983, + "testPassed": true + }, + { + "tcId": 3984, + "testPassed": true + }, + { + "tcId": 3984, + "testPassed": true + }, + { + "tcId": 3985, + "testPassed": true + }, + { + "tcId": 3985, + "testPassed": true + } + ] + }, + { + "tgId": 200, + "tests": [ + { + "tcId": 3986, + "testPassed": true + }, + { + "tcId": 3986, + "testPassed": true + }, + { + "tcId": 3987, + "testPassed": false + }, + { + "tcId": 3987, + "testPassed": false + }, + { + "tcId": 3988, + "testPassed": true + }, + { + "tcId": 3988, + "testPassed": true + }, + { + "tcId": 3989, + "testPassed": true + }, + { + "tcId": 3989, + "testPassed": true + }, + { + "tcId": 3990, + "testPassed": true + }, + { + "tcId": 3990, + "testPassed": true + }, + { + "tcId": 3991, + "testPassed": true + }, + { + "tcId": 3991, + "testPassed": true + }, + { + "tcId": 3992, + "testPassed": true + }, + { + "tcId": 3992, + "testPassed": true + }, + { + "tcId": 3993, + "testPassed": true + }, + { + "tcId": 3993, + "testPassed": true + }, + { + "tcId": 3994, + "testPassed": true + }, + { + "tcId": 3994, + "testPassed": true + }, + { + "tcId": 3995, + "testPassed": true + }, + { + "tcId": 3995, + "testPassed": true + }, + { + "tcId": 3996, + "testPassed": true + }, + { + "tcId": 3996, + "testPassed": true + }, + { + "tcId": 3997, + "testPassed": false + }, + { + "tcId": 3997, + "testPassed": false + }, + { + "tcId": 3998, + "testPassed": true + }, + { + "tcId": 3998, + "testPassed": true + }, + { + "tcId": 3999, + "testPassed": true + }, + { + "tcId": 3999, + "testPassed": true + }, + { + "tcId": 4000, + "testPassed": true + }, + { + "tcId": 4000, + "testPassed": true + } + ] + } + ] + } +] \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..fcecc71 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,30 @@ +dependencies: + dots_indicator: + path: ./dependencies/dots_indicator + hashlib: + path: ./dependencies/hashlib + introduction_screen: + path: ./dependencies/introduction_screen + libsignal_protocol_dart: + path: ./dependencies/libsignal_protocol_dart + lottie: + path: ./dependencies/lottie + mutex: + path: ./dependencies/mutex + photo_view: + path: ./dependencies/photo_view + qr_dart: + path: ./dependencies/qr_dart +dependency_overrides: + adaptive_number: + path: ./dependencies/adaptive_number + ed25519_edwards: + path: ./dependencies/ed25519_edwards + hashlib_codecs: + path: ./dependencies/hashlib_codecs + optional: + path: ./dependencies/optional + pointycastle: + path: ./dependencies/pointycastle + x25519: + path: ./dependencies/x25519 diff --git a/qr_dart/LICENSE b/qr_dart/LICENSE new file mode 100644 index 0000000..4dfadcc --- /dev/null +++ b/qr_dart/LICENSE @@ -0,0 +1,26 @@ +Copyright 2014, the Dart QR project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/qr_dart/lib/qr.dart b/qr_dart/lib/qr.dart new file mode 100644 index 0000000..0565eb5 --- /dev/null +++ b/qr_dart/lib/qr.dart @@ -0,0 +1,5 @@ +export 'src/bit_buffer.dart'; +export 'src/error_correct_level.dart'; +export 'src/input_too_long_exception.dart'; +export 'src/qr_code.dart'; +export 'src/qr_image.dart'; diff --git a/qr_dart/lib/src/bit_buffer.dart b/qr_dart/lib/src/bit_buffer.dart new file mode 100644 index 0000000..3848f4e --- /dev/null +++ b/qr_dart/lib/src/bit_buffer.dart @@ -0,0 +1,46 @@ +import 'dart:collection'; + +class QrBitBuffer extends Object with ListMixin { + final List _buffer; + int _length = 0; + + QrBitBuffer() : _buffer = []; + + @override + void operator []=(int index, bool value) => + throw UnsupportedError('cannot change'); + + @override + bool operator [](int index) { + final bufIndex = index ~/ 8; + return ((_buffer[bufIndex] >> (7 - index % 8)) & 1) == 1; + } + + @override + int get length => _length; + + @override + set length(int value) => throw UnsupportedError('Cannot change'); + + int getByte(int index) => _buffer[index]; + + void put(int number, int length) { + for (var i = 0; i < length; i++) { + final bit = ((number >> (length - i - 1)) & 1) == 1; + putBit(bit); + } + } + + void putBit(bool bit) { + final bufIndex = _length ~/ 8; + if (_buffer.length <= bufIndex) { + _buffer.add(0); + } + + if (bit) { + _buffer[bufIndex] |= 0x80 >> (_length % 8); + } + + _length++; + } +} diff --git a/qr_dart/lib/src/byte.dart b/qr_dart/lib/src/byte.dart new file mode 100644 index 0000000..560644a --- /dev/null +++ b/qr_dart/lib/src/byte.dart @@ -0,0 +1,140 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'bit_buffer.dart'; +import 'mode.dart' as qr_mode; + +abstract class QrDatum { + int get mode; + int get length; + void write(QrBitBuffer buffer); +} + +class QrByte implements QrDatum { + @override + final int mode = qr_mode.mode8bitByte; + final Uint8List _data; + + factory QrByte(String input) => + QrByte.fromUint8List(utf8.encoder.convert(input)); + + QrByte.fromUint8List(Uint8List input) : _data = input; + + factory QrByte.fromByteData(ByteData input) => + QrByte.fromUint8List(input.buffer.asUint8List()); + + @override + int get length => _data.length; + + @override + void write(QrBitBuffer buffer) { + for (final v in _data) { + buffer.put(v, 8); + } + } +} + +/// Encodes numbers (0-9) 10 bits per 3 digits. +class QrNumeric implements QrDatum { + static final RegExp validationRegex = RegExp(r'^[0-9]+$'); + + factory QrNumeric.fromString(String numberString) { + if (!validationRegex.hasMatch(numberString)) { + throw ArgumentError('string can only contain digits 0-9'); + } + final newList = Uint8List(numberString.length); + var count = 0; + for (var char in numberString.codeUnits) { + newList[count++] = char - 0x30; + } + return QrNumeric._(newList); + } + + QrNumeric._(this._data); + + final Uint8List _data; + + @override + final int mode = qr_mode.modeNumber; + + @override + void write(QrBitBuffer buffer) { + // Walk through the list of number; attempting to encode up to 3 at a time. + // Write (N *3 + 1) bits. + final leftOver = _data.length % 3; + + final efficientGrab = _data.length - leftOver; + for (var i = 0; i < efficientGrab; i += 3) { + final encoded = _data[i] * 100 + _data[i + 1] * 10 + _data[i + 2]; + buffer.put(encoded, 10); + } + if (leftOver > 1) { + // 2 bytes + buffer.put(_data[_data.length - 2] * 10 + _data[_data.length - 1], 7); + } else if (leftOver > 0) { + // 1 byte + buffer.put(_data.last, 4); + } + } + + // This is still the *number of characters to encode*, not encoded length. + @override + int get length => _data.length; +} + +/// Encodes numbers (0-9) 10 bits per 3 digits. +class QrAlphaNumeric implements QrDatum { + static const alphaNumTable = r'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'; + // Note: '-' anywhere in this string is a range character. + static final validationRegex = RegExp( + r'^[-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+./:]+$', + ); + static final encodeArray = () { + final array = List.filled(91, null); + for (var i = 0; i < alphaNumTable.length; i++) { + final char = alphaNumTable.codeUnitAt(i); + array[char] = i; + } + return array; + }(); + + final String _string; + + factory QrAlphaNumeric.fromString(String alphaNumeric) { + if (!alphaNumeric.contains(validationRegex)) { + throw ArgumentError( + 'String does not contain valid ALPHA-NUM ' + 'character set: $alphaNumeric', + ); + } + return QrAlphaNumeric._(alphaNumeric); + } + + QrAlphaNumeric._(this._string); + + @override + final int mode = qr_mode.modeAlphaNum; + + @override + void write(QrBitBuffer buffer) { + // Walk through the list of number; attempting to encode up to 2 at a time. + // Write (N *5 + 1) bits. + final leftOver = _string.length % 2; + + final efficientGrab = _string.length - leftOver; + for (var i = 0; i < efficientGrab; i += 2) { + final encoded = + encodeArray[_string.codeUnitAt(i)]! * 45 + + encodeArray[_string.codeUnitAt(i + 1)]!; + buffer.put(encoded, 11); + } + if (leftOver > 0) { + // N*5 + 1 = 6 + buffer.put(encodeArray[_string.codeUnitAt(_string.length - 1)]!, 6); + } + } + + // This is still the *number of characters to encode*, not encoded length. + @override + int get length => _string.length; +} diff --git a/qr_dart/lib/src/error_correct_level.dart b/qr_dart/lib/src/error_correct_level.dart new file mode 100644 index 0000000..79c6f11 --- /dev/null +++ b/qr_dart/lib/src/error_correct_level.dart @@ -0,0 +1,20 @@ +// ignore: avoid_classes_with_only_static_members +class QrErrorCorrectLevel { + static const int L = 1; + static const int M = 0; + static const int Q = 3; + static const int H = 2; + + // thesee *are* in order of lowest to highest quality...I think + // all I know for sure: you can create longer messages w/ item N than N+1 + // I assume this correcsponds to more error correction for N+1 + static const List levels = [L, M, Q, H]; + + static String getName(int level) => switch (level) { + L => 'Low', + M => 'Medium', + Q => 'Quartile', + H => 'High', + _ => throw ArgumentError('level $level not supported'), + }; +} diff --git a/qr_dart/lib/src/input_too_long_exception.dart b/qr_dart/lib/src/input_too_long_exception.dart new file mode 100644 index 0000000..ba33e65 --- /dev/null +++ b/qr_dart/lib/src/input_too_long_exception.dart @@ -0,0 +1,20 @@ +class InputTooLongException implements Exception { + final int providedInput; + final int inputLimit; + final String message; + + factory InputTooLongException(int providedInput, int inputLimit) { + final message = 'Input too long. $providedInput > $inputLimit'; + + return InputTooLongException._internal(providedInput, inputLimit, message); + } + + InputTooLongException._internal( + this.providedInput, + this.inputLimit, + this.message, + ); + + @override + String toString() => 'QrInputTooLongException: $message'; +} diff --git a/qr_dart/lib/src/mask_pattern.dart b/qr_dart/lib/src/mask_pattern.dart new file mode 100644 index 0000000..f6a42f8 --- /dev/null +++ b/qr_dart/lib/src/mask_pattern.dart @@ -0,0 +1,8 @@ +const int pattern000 = 0; +const int pattern001 = 1; +const int pattern010 = 2; +const int pattern011 = 3; +const int pattern100 = 4; +const int pattern101 = 5; +const int pattern110 = 6; +const int pattern111 = 7; diff --git a/qr_dart/lib/src/math.dart b/qr_dart/lib/src/math.dart new file mode 100644 index 0000000..a5ab7bc --- /dev/null +++ b/qr_dart/lib/src/math.dart @@ -0,0 +1,27 @@ +import 'dart:typed_data'; + +final Uint8List _logTable = _createLogTable(); +final Uint8List _expTable = _createExpTable(); + +int glog(int n) => (n >= 1) ? _logTable[n] : throw ArgumentError('glog($n)'); + +int gexp(int n) => _expTable[n % 255]; + +Uint8List _createExpTable() { + final list = Uint8List(256); + for (var i = 0; i < 8; i++) { + list[i] = 1 << i; + } + for (var i = 8; i < 256; i++) { + list[i] = list[i - 4] ^ list[i - 5] ^ list[i - 6] ^ list[i - 8]; + } + return list; +} + +Uint8List _createLogTable() { + final list = Uint8List(256); + for (var i = 0; i < 255; i++) { + list[_expTable[i]] = i; + } + return list; +} diff --git a/qr_dart/lib/src/mode.dart b/qr_dart/lib/src/mode.dart new file mode 100644 index 0000000..00efc50 --- /dev/null +++ b/qr_dart/lib/src/mode.dart @@ -0,0 +1,4 @@ +const int modeNumber = 1 << 0; +const int modeAlphaNum = 1 << 1; +const int mode8bitByte = 1 << 2; +const int modeKanji = 1 << 3; diff --git a/qr_dart/lib/src/polynomial.dart b/qr_dart/lib/src/polynomial.dart new file mode 100644 index 0000000..282ede9 --- /dev/null +++ b/qr_dart/lib/src/polynomial.dart @@ -0,0 +1,63 @@ +import 'dart:typed_data'; + +import 'math.dart' as qr_math; + +class QrPolynomial { + final Uint8List _values; + + factory QrPolynomial(List thing, int shift) { + var offset = 0; + + while (offset < thing.length && thing[offset] == 0) { + offset++; + } + + final values = Uint8List(thing.length - offset + shift); + + for (var i = 0; i < thing.length - offset; i++) { + values[i] = thing[i + offset]; + } + + return QrPolynomial._internal(values); + } + + QrPolynomial._internal(this._values); + + int operator [](int index) => _values[index]; + + int get length => _values.length; + + QrPolynomial multiply(QrPolynomial e) { + final List foo = Uint8List(length + e.length - 1); + + for (var i = 0; i < length; i++) { + for (var j = 0; j < e.length; j++) { + foo[i + j] ^= qr_math.gexp(qr_math.glog(this[i]) + qr_math.glog(e[j])); + } + } + + return QrPolynomial(foo, 0); + } + + QrPolynomial mod(QrPolynomial e) { + if (length - e.length < 0) { + // ignore: avoid_returning_this + return this; + } + + final ratio = qr_math.glog(this[0]) - qr_math.glog(e[0]); + + final value = Uint8List(length); + + for (var i = 0; i < length; i++) { + value[i] = this[i]; + } + + for (var i = 0; i < e.length; i++) { + value[i] ^= qr_math.gexp(qr_math.glog(e[i]) + ratio); + } + + // recursive call + return QrPolynomial(value, 0).mod(e); + } +} diff --git a/qr_dart/lib/src/qr_code.dart b/qr_dart/lib/src/qr_code.dart new file mode 100644 index 0000000..3449a65 --- /dev/null +++ b/qr_dart/lib/src/qr_code.dart @@ -0,0 +1,288 @@ +import 'dart:math' as math; +import 'dart:typed_data'; + +import 'package:meta/meta.dart'; + +import 'bit_buffer.dart'; +import 'byte.dart'; +import 'error_correct_level.dart'; +import 'input_too_long_exception.dart'; +import 'math.dart' as qr_math; +import 'mode.dart' as qr_mode; +import 'polynomial.dart'; +import 'rs_block.dart'; + +class QrCode { + final int typeNumber; + final int errorCorrectLevel; + final int moduleCount; + List? _dataCache; + final _dataList = []; + + QrCode(this.typeNumber, this.errorCorrectLevel) + : moduleCount = typeNumber * 4 + 17 { + RangeError.checkValueInInterval(typeNumber, 1, 40, 'typeNumber'); + RangeError.checkValidIndex( + errorCorrectLevel, + QrErrorCorrectLevel.levels, + 'errorCorrectLevel', + ); + } + + factory QrCode.fromData({ + required String data, + required int errorCorrectLevel, + }) { + final QrDatum datum; + // Automatically determine mode here + if (QrNumeric.validationRegex.hasMatch(data)) { + // Numeric mode for numbers only + datum = QrNumeric.fromString(data); + } else if (QrAlphaNumeric.validationRegex.hasMatch(data)) { + // Alphanumeric mode for alphanumeric characters only + datum = QrAlphaNumeric.fromString(data); + } else { + // Default to byte mode for other characters + datum = QrByte(data); + } + + final typeNumber = _calculateTypeNumberFromData(errorCorrectLevel, datum); + + final qrCode = QrCode(typeNumber, errorCorrectLevel).._addToList(datum); + return qrCode; + } + + factory QrCode.fromUint8List({ + required Uint8List data, + required int errorCorrectLevel, + }) { + final typeNumber = _calculateTypeNumberFromData( + errorCorrectLevel, + QrByte.fromUint8List(data), + ); + return QrCode(typeNumber, errorCorrectLevel) + .._addToList(QrByte.fromUint8List(data)); + } + + static int _calculateTotalDataBits(int typeNumber, int errorCorrectLevel) { + final rsBlocks = QrRsBlock.getRSBlocks(typeNumber, errorCorrectLevel); + var totalDataBits = 0; + for (var rsBlock in rsBlocks) { + totalDataBits += rsBlock.dataCount * 8; + } + return totalDataBits; + } + + static int _calculateTypeNumberFromData(int errorCorrectLevel, QrDatum data) { + for (var typeNumber = 1; typeNumber <= 40; typeNumber++) { + final totalDataBits = _calculateTotalDataBits( + typeNumber, + errorCorrectLevel, + ); + + final buffer = QrBitBuffer() + ..put(data.mode, 4) + ..put(data.length, _lengthInBits(data.mode, typeNumber)); + data.write(buffer); + + if (buffer.length <= totalDataBits) return typeNumber; + } + + // If we reach here, the data is too long for any QR Code version. + final buffer = QrBitBuffer() + ..put(data.mode, 4) + ..put(data.length, _lengthInBits(data.mode, 40)); + data.write(buffer); + + final maxBits = _calculateTotalDataBits(40, errorCorrectLevel); + + throw InputTooLongException(buffer.length, maxBits); + } + + void addData(String data) { + final QrDatum datum; + // Automatically determine mode here, just like QrCode.fromData + if (QrNumeric.validationRegex.hasMatch(data)) { + // Numeric mode for numbers only + datum = QrNumeric.fromString(data); + } else if (QrAlphaNumeric.validationRegex.hasMatch(data)) { + // Alphanumeric mode for alphanumeric characters only + datum = QrAlphaNumeric.fromString(data); + } else { + // Default to byte mode for other characters + datum = QrByte(data); + } + _addToList(datum); + } + + void addByteData(ByteData data) => _addToList(QrByte.fromByteData(data)); + + /// Add QR Numeric Mode data from a string of digits. + /// + /// It is an error if the [numberString] contains anything other than the + /// digits 0 through 9. + void addNumeric(String numberString) => + _addToList(QrNumeric.fromString(numberString)); + + void addAlphaNumeric(String alphaNumeric) => + _addToList(QrAlphaNumeric.fromString(alphaNumeric)); + + void _addToList(QrDatum data) { + _dataList.add(data); + _dataCache = null; + } + + @internal + List get dataCache => + _dataCache ??= _createData(typeNumber, errorCorrectLevel, _dataList); +} + +const int _pad0 = 0xEC; +const int _pad1 = 0x11; + +List _createData( + int typeNumber, + int errorCorrectLevel, + List dataList, +) { + final rsBlocks = QrRsBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + final buffer = QrBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + final data = dataList[i]; + buffer + ..put(data.mode, 4) + ..put(data.length, _lengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // HUH? + // ç≈ëÂÉfÅ[É^êîÇåvéZ + final totalDataBits = QrCode._calculateTotalDataBits( + typeNumber, + errorCorrectLevel, + ); + + // HUH? + // èIí[ÉRÅ[Éh + if (buffer.length + 4 <= totalDataBits) { + buffer.put(0, 4); + } + + // padding + while (buffer.length % 8 != 0) { + buffer.putBit(false); + } + + // padding + final bitDataCount = totalDataBits; + var count = 0; + for (;;) { + if (buffer.length >= bitDataCount) { + break; + } + buffer.put((count++).isEven ? _pad0 : _pad1, 8); + } + + return _createBytes(buffer, rsBlocks); +} + +List _createBytes(QrBitBuffer buffer, List rsBlocks) { + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + final dcData = List?>.filled(rsBlocks.length, null); + final ecData = List?>.filled(rsBlocks.length, null); + + for (var r = 0; r < rsBlocks.length; r++) { + final dcCount = rsBlocks[r].dataCount; + final ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = math.max(maxDcCount, dcCount); + maxEcCount = math.max(maxEcCount, ecCount); + + final dcItem = dcData[r] = Uint8List(dcCount); + + for (var i = 0; i < dcItem.length; i++) { + dcItem[i] = 0xff & buffer.getByte(i + offset); + } + offset += dcCount; + + final rsPoly = _errorCorrectPolynomial(ecCount); + final rawPoly = QrPolynomial(dcItem, rsPoly.length - 1); + + final modPoly = rawPoly.mod(rsPoly); + final ecItem = ecData[r] = Uint8List(rsPoly.length - 1); + + for (var i = 0; i < ecItem.length; i++) { + final modIndex = i + modPoly.length - ecItem.length; + ecItem[i] = (modIndex >= 0) ? modPoly[modIndex] : 0; + } + } + + final data = []; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcData[r]!.length) { + data.add(dcData[r]![i]); + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecData[r]!.length) { + data.add(ecData[r]![i]); + } + } + } + + return data; +} + +int _lengthInBits(int mode, int type) { + if (1 <= type && type < 10) { + // 1 - 9 + return switch (mode) { + qr_mode.modeNumber => 10, + qr_mode.modeAlphaNum => 9, + qr_mode.mode8bitByte => 8, + qr_mode.modeKanji => 8, + _ => throw ArgumentError('mode:$mode'), + }; + } else if (type < 27) { + // 10 - 26 + return switch (mode) { + qr_mode.modeNumber => 12, + qr_mode.modeAlphaNum => 11, + qr_mode.mode8bitByte => 16, + qr_mode.modeKanji => 10, + _ => throw ArgumentError('mode:$mode'), + }; + } else if (type < 41) { + // 27 - 40 + return switch (mode) { + qr_mode.modeNumber => 14, + qr_mode.modeAlphaNum => 13, + qr_mode.mode8bitByte => 16, + qr_mode.modeKanji => 12, + _ => throw ArgumentError('mode:$mode'), + }; + } else { + throw ArgumentError('type:$type'); + } +} + +QrPolynomial _errorCorrectPolynomial(int errorCorrectLength) { + var a = QrPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(QrPolynomial([1, qr_math.gexp(i)], 0)); + } + + return a; +} diff --git a/qr_dart/lib/src/qr_image.dart b/qr_dart/lib/src/qr_image.dart new file mode 100644 index 0000000..beb09e2 --- /dev/null +++ b/qr_dart/lib/src/qr_image.dart @@ -0,0 +1,345 @@ +import 'package:meta/meta.dart'; + +import 'mask_pattern.dart' as qr_mask_pattern; +import 'qr_code.dart'; +import 'util.dart' as qr_util; + +/// Renders the encoded data from a [QrCode] in a portable format. +class QrImage { + final int moduleCount; + final int typeNumber; + final int errorCorrectLevel; + final int maskPattern; + + final _modules = >[]; + + /// Generates a QrImage with the best mask pattern encoding [qrCode]. + factory QrImage(QrCode qrCode) { + var minLostPoint = 0.0; + QrImage? bestImage; + + for (var i = 0; i < 8; i++) { + final testImage = QrImage._test(qrCode, i); + final lostPoint = _lostPoint(testImage); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + bestImage = testImage; + } + } + + return QrImage.withMaskPattern(qrCode, bestImage!.maskPattern); + } + + /// Generates a specific image for the [qrCode] and [maskPattern]. + QrImage.withMaskPattern(QrCode qrCode, this.maskPattern) + : assert(maskPattern >= 0 && maskPattern <= 7), + moduleCount = qrCode.moduleCount, + typeNumber = qrCode.typeNumber, + errorCorrectLevel = qrCode.errorCorrectLevel { + _makeImpl(maskPattern, qrCode.dataCache, false); + } + + QrImage._test(QrCode qrCode, this.maskPattern) + : moduleCount = qrCode.moduleCount, + typeNumber = qrCode.typeNumber, + errorCorrectLevel = qrCode.errorCorrectLevel { + _makeImpl(maskPattern, qrCode.dataCache, true); + } + + @visibleForTesting + List> get qrModules => _modules; + + void _resetModules() { + _modules.clear(); + for (var row = 0; row < moduleCount; row++) { + _modules.add(List.filled(moduleCount, null)); + } + } + + bool isDark(int row, int col) { + if (row < 0 || moduleCount <= row || col < 0 || moduleCount <= col) { + throw ArgumentError('$row , $col'); + } + return _modules[row][col]!; + } + + void _makeImpl(int maskPattern, List dataCache, bool test) { + _resetModules(); + _setupPositionProbePattern(0, 0); + _setupPositionProbePattern(moduleCount - 7, 0); + _setupPositionProbePattern(0, moduleCount - 7); + _setupPositionAdjustPattern(); + _setupTimingPattern(); + _setupTypeInfo(maskPattern, test); + + if (typeNumber >= 7) { + _setupTypeNumber(test); + } + + _mapData(dataCache, maskPattern); + } + + void _setupPositionProbePattern(int row, int col) { + for (var r = -1; r <= 7; r++) { + if (row + r <= -1 || moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + if (col + c <= -1 || moduleCount <= col + c) continue; + + if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4)) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + } + + void _setupPositionAdjustPattern() { + final pos = qr_util.patternPosition(typeNumber); + + for (var i = 0; i < pos.length; i++) { + for (var j = 0; j < pos.length; j++) { + final row = pos[i]; + final col = pos[j]; + + if (_modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + for (var c = -2; c <= 2; c++) { + if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + } + } + } + + void _setupTimingPattern() { + for (var r = 8; r < moduleCount - 8; r++) { + if (_modules[r][6] != null) { + continue; + } + _modules[r][6] = r.isEven; + } + + for (var c = 8; c < moduleCount - 8; c++) { + if (_modules[6][c] != null) { + continue; + } + _modules[6][c] = c.isEven; + } + } + + void _setupTypeInfo(int maskPattern, bool test) { + final data = (errorCorrectLevel << 3) | maskPattern; + final bits = qr_util.bchTypeInfo(data); + + int i; + bool mod; + + // vertical + for (i = 0; i < 15; i++) { + mod = !test && ((bits >> i) & 1) == 1; + + if (i < 6) { + _modules[i][8] = mod; + } else if (i < 8) { + _modules[i + 1][8] = mod; + } else { + _modules[moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (i = 0; i < 15; i++) { + mod = !test && ((bits >> i) & 1) == 1; + + if (i < 8) { + _modules[8][moduleCount - i - 1] = mod; + } else if (i < 9) { + _modules[8][15 - i - 1 + 1] = mod; + } else { + _modules[8][15 - i - 1] = mod; + } + } + + // fixed module + _modules[moduleCount - 8][8] = !test; + } + + void _setupTypeNumber(bool test) { + final bits = qr_util.bchTypeNumber(typeNumber); + + for (var i = 0; i < 18; i++) { + final mod = !test && ((bits >> i) & 1) == 1; + _modules[i ~/ 3][i % 3 + moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + final mod = !test && ((bits >> i) & 1) == 1; + _modules[i % 3 + moduleCount - 8 - 3][i ~/ 3] = mod; + } + } + + void _mapData(List data, int maskPattern) { + var inc = -1; + var row = moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = moduleCount - 1; col > 0; col -= 2) { + if (col == 6) col--; + + for (;;) { + for (var c = 0; c < 2; c++) { + if (_modules[row][col - c] == null) { + var dark = false; + + if (byteIndex < data.length) { + dark = ((data[byteIndex] >> bitIndex) & 1) == 1; + } + + final mask = _mask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + _modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + } +} + +bool _mask(int maskPattern, int i, int j) => switch (maskPattern) { + qr_mask_pattern.pattern000 => (i + j).isEven, + qr_mask_pattern.pattern001 => i.isEven, + qr_mask_pattern.pattern010 => j % 3 == 0, + qr_mask_pattern.pattern011 => (i + j) % 3 == 0, + qr_mask_pattern.pattern100 => ((i ~/ 2) + (j ~/ 3)).isEven, + qr_mask_pattern.pattern101 => (i * j) % 2 + (i * j) % 3 == 0, + qr_mask_pattern.pattern110 => ((i * j) % 2 + (i * j) % 3).isEven, + qr_mask_pattern.pattern111 => ((i * j) % 3 + (i + j) % 2).isEven, + _ => throw ArgumentError('bad maskPattern:$maskPattern'), +}; + +double _lostPoint(QrImage qrImage) { + final moduleCount = qrImage.moduleCount; + + var lostPoint = 0.0; + int row, col; + + // LEVEL1 + for (row = 0; row < moduleCount; row++) { + for (col = 0; col < moduleCount; col++) { + var sameCount = 0; + final dark = qrImage.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrImage.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += 3 + sameCount - 5; + } + } + } + + // LEVEL2 + for (row = 0; row < moduleCount - 1; row++) { + for (col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrImage.isDark(row, col)) count++; + if (qrImage.isDark(row + 1, col)) count++; + if (qrImage.isDark(row, col + 1)) count++; + if (qrImage.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + for (row = 0; row < moduleCount; row++) { + for (col = 0; col < moduleCount - 6; col++) { + if (qrImage.isDark(row, col) && + !qrImage.isDark(row, col + 1) && + qrImage.isDark(row, col + 2) && + qrImage.isDark(row, col + 3) && + qrImage.isDark(row, col + 4) && + !qrImage.isDark(row, col + 5) && + qrImage.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (col = 0; col < moduleCount; col++) { + for (row = 0; row < moduleCount - 6; row++) { + if (qrImage.isDark(row, col) && + !qrImage.isDark(row + 1, col) && + qrImage.isDark(row + 2, col) && + qrImage.isDark(row + 3, col) && + qrImage.isDark(row + 4, col) && + !qrImage.isDark(row + 5, col) && + qrImage.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + var darkCount = 0; + + for (col = 0; col < moduleCount; col++) { + for (row = 0; row < moduleCount; row++) { + if (qrImage.isDark(row, col)) { + darkCount++; + } + } + } + + final ratio = (100 * darkCount / moduleCount / moduleCount - 50).abs() / 5; + return lostPoint + ratio * 10; +} diff --git a/qr_dart/lib/src/readme.md b/qr_dart/lib/src/readme.md new file mode 100644 index 0000000..1a82e2d --- /dev/null +++ b/qr_dart/lib/src/readme.md @@ -0,0 +1,27 @@ +# Original License # + + QRCode for ActionScript + version 1.0.1 + Copyright (C) Kazuhiko Arase all rights reserved. + +# The MIT License # + +Copyright (c) 2010-2011 Pixel Lab + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/qr_dart/lib/src/rs_block.dart b/qr_dart/lib/src/rs_block.dart new file mode 100644 index 0000000..206a016 --- /dev/null +++ b/qr_dart/lib/src/rs_block.dart @@ -0,0 +1,287 @@ +import 'error_correct_level.dart'; + +class QrRsBlock { + final int totalCount; + final int dataCount; + + QrRsBlock._(this.totalCount, this.dataCount); + + static List getRSBlocks(int typeNumber, int errorCorrectLevel) { + final rsBlock = _getRsBlockTable(typeNumber, errorCorrectLevel); + + final length = rsBlock.length ~/ 3; + + final list = []; + + for (var i = 0; i < length; i++) { + final count = rsBlock[i * 3 + 0]; + final totalCount = rsBlock[i * 3 + 1]; + final dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.add(QrRsBlock._(totalCount, dataCount)); + } + } + + return list; + } +} + +List _getRsBlockTable( + int typeNumber, + int errorCorrectLevel, +) => switch (errorCorrectLevel) { + QrErrorCorrectLevel.L => _rsBlockTable[(typeNumber - 1) * 4 + 0], + QrErrorCorrectLevel.M => _rsBlockTable[(typeNumber - 1) * 4 + 1], + QrErrorCorrectLevel.Q => _rsBlockTable[(typeNumber - 1) * 4 + 2], + QrErrorCorrectLevel.H => _rsBlockTable[(typeNumber - 1) * 4 + 3], + _ => throw ArgumentError( + 'bad rs block @ typeNumber: $typeNumber/errorCorrectLevel:$errorCorrectLevel', + ), +}; + +const List> _rsBlockTable = [ + // L + // M + // Q + // H + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16], +]; diff --git a/qr_dart/lib/src/util.dart b/qr_dart/lib/src/util.dart new file mode 100644 index 0000000..22a6fab --- /dev/null +++ b/qr_dart/lib/src/util.dart @@ -0,0 +1,85 @@ +const List> _patternPositionTable = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170], +]; + +const int _g15 = + (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); +const int _g18 = + (1 << 12) | + (1 << 11) | + (1 << 10) | + (1 << 9) | + (1 << 8) | + (1 << 5) | + (1 << 2) | + (1 << 0); +const _g15Mask = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); + +int bchTypeInfo(int data) { + var d = data << 10; + while (_bchDigit(d) - _bchDigit(_g15) >= 0) { + d ^= _g15 << (_bchDigit(d) - _bchDigit(_g15)); + } + return ((data << 10) | d) ^ _g15Mask; +} + +int bchTypeNumber(int data) { + var d = data << 12; + while (_bchDigit(d) - _bchDigit(_g18) >= 0) { + d ^= _g18 << (_bchDigit(d) - _bchDigit(_g18)); + } + return (data << 12) | d; +} + +int _bchDigit(int data) { + var digit = 0; + + while (data != 0) { + digit++; + data >>= 1; + } + + return digit; +} + +List patternPosition(int typeNumber) => + _patternPositionTable[typeNumber - 1]; diff --git a/qr_dart/pubspec.yaml b/qr_dart/pubspec.yaml new file mode 100644 index 0000000..48a112e --- /dev/null +++ b/qr_dart/pubspec.yaml @@ -0,0 +1,20 @@ +name: qr +version: 3.1.0-wip +description: >- + A QR code generation library for Dart and Flutter. + Supports QR code version 1 through 40, error correction and redundancy. +repository: https://github.com/kevmoo/qr.dart + +environment: + sdk: ^3.8.0 + +dependencies: + meta: ^1.7.0 + +dev_dependencies: + build_runner: ^2.2.1 + build_web_compilers: ^4.1.4 + dart_flutter_team_lints: ^3.0.0 + stream_transform: ^2.0.0 + test: ^1.21.6 + web: ^1.1.0 diff --git a/qr_dart/test/qr_alphanumeric_test.dart b/qr_dart/test/qr_alphanumeric_test.dart new file mode 100644 index 0000000..68da9de --- /dev/null +++ b/qr_dart/test/qr_alphanumeric_test.dart @@ -0,0 +1,89 @@ +import 'package:qr/qr.dart'; +import 'package:qr/src/byte.dart'; +import 'package:test/test.dart'; + +void main() { + test('full character map', () { + final qr = QrAlphaNumeric.fromString( + r'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:', + ); + expect(qr.mode, 2); + expect(qr.length, 45); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 248); + expect( + buffer.map((e) => e ? '1' : '0').join(), + '00000000001' + '00001011101' + '00010111001' + '00100010101' + '00101110001' + '00111001101' + '01000101001' + '01010000101' + '01011100001' + '01100111101' + '01110011001' + '01111110101' + '10001010001' + '10010101101' + '10100001001' + '10101100101' + '10111000001' + '11000011101' + '11001111001' + '11011010101' + '11100110001' + '11110001101' + '101100', + ); + }); + + test('single alphanumeric', () { + final qr = QrAlphaNumeric.fromString(r'$'); + expect(qr.mode, 2); + expect(qr.length, 1); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 6); + expect(buffer.map((e) => e ? '1' : '0').join(), '100101'); + }); + + test('double (even) alphanumeric', () { + final qr = QrAlphaNumeric.fromString('3Z'); + expect(qr.mode, 2); + expect(qr.length, 2); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 11, reason: 'n*5+1 = 11'); + expect( + buffer + .getRange(0, 11) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 170, + ); + }); + + test('throws on invalid input', () { + for (var character in 'abcdefghijklmnopqrstuvwxyz'.split('')) { + expect( + () => QrAlphaNumeric.fromString(character), + throwsArgumentError, + reason: 'lower case $character is invalid', + ); + } + + for (var character in '!@#^&()_=[]{}\'";?<>,|~`'.split('')) { + expect( + () => QrAlphaNumeric.fromString(character), + throwsArgumentError, + reason: 'special character $character is invalid', + ); + } + }); +} diff --git a/qr_dart/test/qr_bit_buffer_test.dart b/qr_dart/test/qr_bit_buffer_test.dart new file mode 100644 index 0000000..2abe5e3 --- /dev/null +++ b/qr_dart/test/qr_bit_buffer_test.dart @@ -0,0 +1,75 @@ +import 'dart:math' as math; + +import 'package:qr/qr.dart'; +import 'package:test/test.dart'; + +void main() { + test('simple', _testSimple); + test('complex', _testComplex); + test('getByte', _testGetByte); +} + +void _testGetByte() { + var bb = QrBitBuffer()..put(12, 8); + expect(bb.getByte(0), equals(12)); + + bb = QrBitBuffer()..put(42, 8); + expect(bb.getByte(0), equals(42)); + + bb.put(19, 8); + expect(bb.getByte(1), equals(19)); +} + +void _testComplex() { + var bb = QrBitBuffer()..put(0, 8); + expect( + bb, + orderedEquals([false, false, false, false, false, false, false, false]), + ); + + bb = QrBitBuffer()..put(1, 8); + expect( + bb, + orderedEquals([false, false, false, false, false, false, false, true]), + ); + + bb = QrBitBuffer()..put(255, 8); + expect(bb, orderedEquals([true, true, true, true, true, true, true, true])); + + bb = QrBitBuffer()..put(256, 8); + expect( + bb, + orderedEquals([false, false, false, false, false, false, false, false]), + ); + + bb = QrBitBuffer()..put(256, 9); + expect( + bb, + orderedEquals([ + true, + false, + false, + false, + false, + false, + false, + false, + false, + ]), + ); +} + +final _rnd = math.Random(); + +void _testSimple() { + final bb = QrBitBuffer(); + final sampleBits = []; + + for (var i = 0; i < 100; i++) { + final b = _rnd.nextBool(); + sampleBits.add(b); + bb.putBit(b); + } + + expect(bb, orderedEquals(sampleBits)); +} diff --git a/qr_dart/test/qr_byte_test.dart b/qr_dart/test/qr_byte_test.dart new file mode 100644 index 0000000..9c922cd --- /dev/null +++ b/qr_dart/test/qr_byte_test.dart @@ -0,0 +1,21 @@ +import 'dart:typed_data'; + +import 'package:qr/qr.dart'; +import 'package:qr/src/byte.dart'; +import 'package:test/test.dart'; + +void main() { + test('fromByteData', () { + final data = ByteData(256); + for (var i = 0; i < 256; i++) { + data.setUint8(i, i); + } + final qr = QrByte.fromByteData(data); + expect(qr.length, 256); + final buffer = QrBitBuffer(); + qr.write(buffer); + for (var i = 0; i < 256; i++) { + expect(buffer.getByte(i), equals(i)); + } + }); +} diff --git a/qr_dart/test/qr_code_test.dart b/qr_dart/test/qr_code_test.dart new file mode 100644 index 0000000..b75b7e0 --- /dev/null +++ b/qr_dart/test/qr_code_test.dart @@ -0,0 +1,194 @@ +// ignore_for_file: avoid_dynamic_calls + +import 'dart:typed_data'; + +import 'package:qr/qr.dart'; +import 'package:test/test.dart'; + +import 'qr_code_test_data.dart'; +import 'qr_code_test_data_with_mask.dart'; + +void main() { + test('simple', () { + for (var typeNumber = 1; typeNumber <= 40; typeNumber++) { + for (var quality in QrErrorCorrectLevel.levels) { + final qr = QrImage(QrCode(typeNumber, quality)..addData('shanna!')); + final modules = qr.qrModules; + for (var i = 0; i < modules.length; i++) { + expect( + _encodeBoolListToString(modules[i]), + qrCodeTestData[typeNumber.toString()][quality.toString()][i], + ); + } + } + } + }); + + test('fromData', () { + for (var quality in QrErrorCorrectLevel.levels) { + final qr = QrImage( + QrCode.fromData(data: 'shanna!', errorCorrectLevel: quality), + ); + final modules = qr.qrModules; + for (var i = 0; i < modules.length; i++) { + expect( + _encodeBoolListToString(modules[i]), + qrCodeTestData['1'][quality.toString()][i], + ); + } + } + }); + + test('fromUint8List', () { + for (var quality in QrErrorCorrectLevel.levels) { + final qr = QrImage( + QrCode.fromUint8List( + data: Uint8List.fromList([115, 104, 97, 110, 110, 97, 33]), + errorCorrectLevel: quality, + ), + ); + final modules = qr.qrModules; + for (var i = 0; i < modules.length; i++) { + expect( + _encodeBoolListToString(modules[i]), + qrCodeTestData['1'][quality.toString()][i], + ); + } + } + }); + + test('WHEN mask pattern is provided, SHOULD make a masked QR Code', () { + for (var mask = 0; mask <= 7; mask++) { + final qr = QrImage.withMaskPattern( + QrCode(1, QrErrorCorrectLevel.L)..addData('shanna!'), + mask, + ); + final modules = qr.qrModules; + for (var i = 0; i < modules.length; i++) { + expect( + _encodeBoolListToString(modules[i]), + qrCodeTestDataWithMask[mask.toString()][i], + ); + } + } + }); + + test( + ''' + WHEN provided mask pattern is smaller than 0, + SHOULD throw an AssertionError + ''', + () { + expect(() { + QrImage.withMaskPattern( + QrCode(1, QrErrorCorrectLevel.L)..addData('shanna!'), + -1, + ); + }, throwsA(isA())); + }, + ); + + test( + ''' + WHEN provided mask pattern is bigger than 7, + SHOULD throw an AssertionError + ''', + () { + expect(() { + QrImage.withMaskPattern( + QrCode(1, QrErrorCorrectLevel.L)..addData('shanna!'), + 8, + ); + }, throwsA(isA())); + }, + ); + group('QrCode.fromData Automatic Mode Detection', () { + // Numeric Mode + test('should use Numeric Mode for numbers', () { + // 9 numeric chars fit version 1 (H level). + final qr = QrCode.fromData( + data: '123456789', + errorCorrectLevel: QrErrorCorrectLevel.H, + ); + expect(qr.typeNumber, 1); + }); + + // Alphanumeric Mode + test('should use Alphanumeric Mode', () { + // 13 alphanumeric chars exceed version 1 (7 chars) but fit + // version 2 (H level, 16 chars). + final qr = QrCode.fromData( + data: 'HELLO WORLD A', + errorCorrectLevel: QrErrorCorrectLevel.H, + ); + expect(qr.typeNumber, 2); + }); + + // Byte Mode + test('should use Byte Mode for non-alphanumeric chars', () { + // Kanji characters are UTF-8 encoded. + // '機械学習' (12 bytes) fits version 2 (H level, 16 bytes). + final qr = QrCode.fromData( + data: '機械学習', + errorCorrectLevel: QrErrorCorrectLevel.H, + ); + expect(qr.typeNumber, 2); + }); + }); + + group('QrCode.addData Automatic Mode Detection', () { + // Numeric Mode + test('should use Numeric Mode for numbers', () { + // 9 numeric characters fit version 1 (H level). + final qr = QrCode(1, QrErrorCorrectLevel.H)..addData('123456789'); + expect(qr.typeNumber, 1); + }); + + // Alphanumeric Mode + test('should use Alphanumeric Mode', () { + // 13 alphanumeric characters exceed version 1 (7 chars) but fit + // version 2 (H level, 16 chars). + final qr = QrCode(2, QrErrorCorrectLevel.H)..addData('HELLO WORLD A'); + expect(qr.typeNumber, 2); + }); + + // Byte Mode + test('should use Byte Mode for non-alphanumeric characters', () { + // Kanji characters are UTF-8 encoded. + // '機械学習' (12 bytes) fits version 2 (H level, 16 bytes). + final qr = QrCode(2, QrErrorCorrectLevel.H)..addData('機械学習'); + expect(qr.typeNumber, 2); + }); + }); + + group('_calculateTypeNumberFromData - Version 40 Boundary Handling', () { + test('generate v40 for data exceeding v39 capacity', () { + // 2952 bytes exceeds v39 (L) capacity of 2951. + final largeData = '|' * 2952; + + final qrCode = QrCode.fromData( + data: largeData, + errorCorrectLevel: QrErrorCorrectLevel.L, + ); + + expect(qrCode.typeNumber, 40); + }); + + test('throw InputTooLongException for data exceeding v40 capacity', () { + // Data size (2954 bytes) exceeds v40 capacity (2953 bytes). + final excessivelyLargeData = '|' * 2954; + + // An exception should be thrown for data exceeding the capacity + expect( + () => QrCode.fromData( + data: excessivelyLargeData, + errorCorrectLevel: QrErrorCorrectLevel.L, + ), + throwsA(isA()), + ); + }); + }); +} + +String _encodeBoolListToString(List source) => + source.cast().map((e) => e ? '1' : '0').join(); diff --git a/qr_dart/test/qr_code_test_data.dart b/qr_dart/test/qr_code_test_data.dart new file mode 100644 index 0000000..5107737 --- /dev/null +++ b/qr_dart/test/qr_code_test_data.dart @@ -0,0 +1,16248 @@ +import 'dart:convert'; + +final qrCodeTestData = + jsonDecode(r''' +{ + "1": { + "0": [ + "111111100110101111111", + "100000100111101000001", + "101110100000001011101", + "101110100001101011101", + "101110100000101011101", + "100000101111101000001", + "111111101010101111111", + "000000000001100000000", + "100101101110010100000", + "011001000010001101111", + "000000101010110000101", + "001001011111000001000", + "111111100100101010001", + "000000001101000101011", + "111111100110010010110", + "100000101101110000001", + "101110100011001000001", + "101110101101000111111", + "101110100100100110001", + "100000100010011100000", + "111111101111100101010" + ], + "1": [ + "111111100101101111111", + "100000101101001000001", + "101110101100101011101", + "101110100101001011101", + "101110101000101011101", + "100000101001101000001", + "111111101010101111111", + "000000001111100000000", + "110100110110001110110", + "001110001010001101111", + "111111100010110000101", + "101111001111000001000", + "101100111110101010001", + "000000001001000101011", + "111111101110010010110", + "100000100101110000001", + "101110100011001000001", + "101110101011000111111", + "101110100100100110001", + "100000101110011100000", + "111111101001100101010" + ], + "2": [ + "111111101111101111111", + "100000101101101000001", + "101110100100101011101", + "101110101111001011101", + "101110101100001011101", + "100000101110101000001", + "111111101010101111111", + "000000000001100000000", + "000100100110100111011", + "110000010100010101111", + "111011110000111000101", + "100011011001111001000", + "110101101111110010001", + "000000001101000101011", + "111111100001011010110", + "100000100110011000001", + "101110100111001000001", + "101110101101000111111", + "101110100000101110001", + "100000100010100100000", + "111111100011100101010" + ], + "3": [ + "111111101101001111111", + "100000100000101000001", + "101110101010001011101", + "101110101010001011101", + "101110100110001011101", + "100000101011001000001", + "111111101010101111111", + "000000001111100000000", + "010101111011011101101", + "010011010110001101111", + "100110100000110000101", + "111000010101000001000", + "001101101100001010001", + "000000001001000101011", + "111111101110110010110", + "100000101100110000001", + "101110100100001000001", + "101110101011000111111", + "101110100010100110001", + "100000101100011100000", + "111111100001100101010" + ] + }, + "2": { + "0": [ + "1111111010100111001111111", + "1000001011111100101000001", + "1011101001000000101011101", + "1011101011000011001011101", + "1011101000110010101011101", + "1000001000111101101000001", + "1111111010101010101111111", + "0000000011010001100000000", + "1011011100010101001001011", + "1001010101001111011001000", + "0111101010011100101111000", + "0100100001100000101101100", + "1110011000011011010001100", + "0001010100111010110101111", + "0110111000010101100110010", + "1000110100010010111110010", + "0000101101101011111110110", + "0000000011000011100011011", + "1111111010100111101011111", + "1000001010010110100011001", + "1011101001100110111110010", + "1011101011000000001001001", + "1011101011100010000011010", + "1000001000111110111000100", + "1111111011010000100001111" + ], + "1": [ + "1111111010101111001111111", + "1000001001111100101000001", + "1011101011100000101011101", + "1011101011101011001011101", + "1011101010011010101011101", + "1000001000110101101000001", + "1111111010101010101111111", + "0000000000101001100000000", + "1111001010111101010011101", + "1010010110101111011001000", + "0100001001111100101111000", + "1001000101100000101101100", + "1100111001101011010001100", + "0111100001011010110101111", + "0111001000110101100110010", + "1011000000010010111110010", + "0010111100101011111110110", + "0000000011000011100011011", + "1111111001100111101011111", + "1000001000110110100011001", + "1011101001100110111110010", + "1011101011100000001001001", + "1011101011100010000011010", + "1000001011011110111000100", + "1111111011010000100001111" + ], + "2": [ + "1111111000111001101111111", + "1000001000100001001000001", + "1011101010011101001011101", + "1011101011011100101011101", + "1011101001011111001011101", + "1000001001011001101000001", + "1111111010101010101111111", + "0000000000000101000000000", + "0001101101101110000001100", + "0101010001110111111010100", + "0010101001101110000110001", + "1000110101100001110001111", + "1100111011001001100111010", + "1011100001101000101001100", + "1110011001100100101111011", + "1000110011001111011101110", + "1001101111111000111111111", + "0000000011000101100011000", + "1111111010100011101011001", + "1000001000110110100011010", + "1011101010010011111111011", + "1011101011100001101010101", + "1011101000100001001010011", + "1000001000011010100100111", + "1111111001110100010111001" + ], + "3": [ + "1111111001010111001111111", + "1000001011110100101000001", + "1011101011011000101011101", + "1011101001010011001011101", + "1011101000000010101011101", + "1000001000011101101000001", + "1111111010101010101111111", + "0000000001010001100000000", + "0111011000111101000000110", + "1000010001000111011001000", + "0111011111100100101111000", + "0111010010110000101101100", + "0011101000000011010001100", + "0100010111001110110101111", + "0111011110001011100110010", + "1010100101001010111110010", + "0001111110001011111110110", + "0000000010101101100011011", + "1111111001000011101011111", + "1000001011111110100011001", + "1011101001110100111110010", + "1011101010101100001001001", + "1011101010111010000011010", + "1000001010111000111000100", + "1111111000110010100001111" + ] + }, + "3": { + "0": [ + "11111110101010011010101111111", + "10000010101010110101101000001", + "10111010001011110010101011101", + "10111010101110001011101011101", + "10111010001011000010101011101", + "10000010011010100111101000001", + "11111110101010101010101111111", + "00000000101111100000100000000", + "10110111010011101011001001011", + "10000101001000011010110101111", + "01110110111010110101100110010", + "11111100110101110010111110011", + "11101010011010001011110110110", + "00101001100101000010110101001", + "10010010100110100111110101111", + "10111000000111010110011011010", + "00101111101110000110111100001", + "00011101001001000001101111000", + "10110011010110000011010001000", + "00001000101100011111010010111", + "01000011100001010000111111101", + "00000000101111110101100010001", + "11111110110111001010101011110", + "10000010100010001101100011010", + "10111010010100110000111110000", + "10111010111111101101100001000", + "10111010100100011001011001101", + "10000010001000101000001111110", + "11111110111001111101001100110" + ], + "1": [ + "11111110100001101011001111111", + "10000010100111110010101000001", + "10111010110010100111101011101", + "10111010111010000101101011101", + "10111010011010000101101011101", + "10000010111000001101001000001", + "11111110101010101010101111111", + "00000000001101011000000000000", + "11001110001011000001100101111", + "00110100100001101011000100001", + "10111010111000001101011110101", + "11101001110010100111101011001", + "10000110100101111010000111000", + "11010000011010000101110010001", + "01111110101111110010100000101", + "11101001000101011000010101011", + "11110110100011000001111011001", + "11100101011001101011000101101", + "00001010000000001101011111001", + "00101001110010100111101010000", + "11110010100101111010111111000", + "00000000101010000100100011111", + "11111110011111110010101011001", + "10000010110101011000100010000", + "10111010110011000001111111110", + "10111010011001101010100110000", + "10111010011000001100001100111", + "10000010110010100110000001111", + "11111110110101111010001011110" + ], + "2": [ + "11111110111001000000101111111", + "10000010010110001101101000001", + "10111010011100011000101011101", + "10111010101001101101001011101", + "10111010001101010100001011101", + "10000010000111100010001000001", + "11111110101010101010101111111", + "00000000011011110000100000000", + "00101110110011111001110001001", + "11111101111000110101110010111", + "11101111100101111111101000011", + "10110001010010100000100010101", + "10110111001001110001001000101", + "11001100010000101101011001100", + "01010111001111111110001000101", + "10101101010110000011000010000", + "10011110011101101010001110001", + "01100001111001111011000101001", + "10100011001000100110001111111", + "01001000001111000101000101001", + "10001110111101111100111111111", + "00000000100001100011100011010", + "11111110001000111110101011110", + "10000010111110001010100010011", + "10111010111111110001111110010", + "10111010010010101001110110110", + "10111010100010101101001110001", + "10000010010001100101001110110", + "11111110000100111001000100111" + ], + "3": [ + "11111110011111010000001111111", + "10000010110011100100001000001", + "10111010110111111011001011101", + "10111010011000111010001011101", + "10111010001111111010001011101", + "10000010011101111110001000001", + "11111110101010101010101111111", + "00000000010010000001000000000", + "01110110011110100010000000110", + "00010001001001010110110101111", + "10011111110100110011100110010", + "01011100011010110100111110110", + "00110011000110110001110000010", + "01100100101001100100101000010", + "00111011100110001001101011001", + "10000100001010011000000101000", + "11101011101111000100000000000", + "00010100001000000011011001010", + "10110010101111000010110111000", + "00000100010001011110110100111", + "01110011011100110001111110011", + "00000000110000010100100010010", + "11111110011010101010101011111", + "10000010110011101100100010000", + "10111010011010111001111110101", + "10111010100101000000000111000", + "10111010110000000110101101101", + "10000010100011010110001001110", + "11111110000110000111001010110" + ] + }, + "4": { + "0": [ + "111111100100101100000110101111111", + "100000100111000110101100001000001", + "101110101000001100000110101011101", + "101110101100000100100100101011101", + "101110101101111111001010001011101", + "100000101110011001010011101000001", + "111111101010101010101010101111111", + "000000001001110011111001000000000", + "101111100000001000010111101111100", + "010000011101010111101000000100010", + "001000110011111001010011100000100", + "101101010010010011111001010101110", + "111001110100001010011111000100000", + "000001001000100100100100110011001", + "000100111101000110101100011110010", + "101101011011011100000110101011011", + "110100101011110110101100011110100", + "101101011101001100000110100100100", + "111011100011011110101100011001111", + "011101000010001100000110101101101", + "000010111010000100100100111000011", + "101101010100010111001010000100111", + "100011100011001001010011100001110", + "100100010111110011111001010100111", + "100001110110000000010111111111110", + "000000001001010111101000100011010", + "111111100011001001010010101010000", + "100000101000011011111001100011110", + "101110101100001010011111111110000", + "101110101100011100100100000111000", + "101110101011111110101101010000000", + "100000100100111100000111100111000", + "111111101001010110101100110010110" + ], + "1": [ + "111111101110100001011110101111111", + "100000101110000011010110001000001", + "101110101011010110000011001011101", + "101110101101001111100101001011101", + "101110100000011010110000001011101", + "100000101001111100101001101000001", + "111111101010101010101010101111111", + "000000000100101001111100100000000", + "110011100001011110100001000101111", + "111110000110100001011110101001010", + "000111100001111100101001111011110", + "001101011011010110000011001110001", + "001111111010110000011010100000000", + "001101001000011010110000011110110", + "001001111100000011010110000100010", + "000101011100101001111100110001010", + "011001111101011110100001011100011", + "001111000000100001011110101000110", + "111110101001111100101001111010010", + "100011001101010110000011001111000", + "110010100110110000011010100000110", + "101100010100011010110000011111010", + "000111110000000011010110000101110", + "000111000000101001111100110000111", + "110101110101011110100001111110111", + "000000001010100001011111100010100", + "111111100001111100101001101010010", + "100000101101010110000011100011011", + "101110101100110000011010111111101", + "101110100100011010110001111101011", + "101110100110000011010111010111100", + "100000101100101001111101011010100", + "111111101001011110100001010000101" + ], + "2": [ + "111111100000010100010110101111111", + "100000100111010000101000001000001", + "101110101010110000101100101011101", + "101110101000101011111010101011101", + "101110100011011010001011001011101", + "100000100110000011000100101000001", + "111111101010101010101010101111111", + "000000000100010000000101000000000", + "000110110011011011110101000001100", + "101001001110001111100010100111011", + "011011100011000101100101010001001", + "011001001110100111100001101010010", + "000011101100111110111111100011111", + "010111001110001110011010011000100", + "001000111101001110010111110011100", + "101100011010000010110001011010110", + "110010111110001011000100101100111", + "110001011011000001111110010101100", + "001001101010100001110001100100000", + "001110011010001100000101010111110", + "001010110100001110010101001010001", + "100111011011111111000010101011011", + "100010100111101010100101010001001", + "100101010001000110011001101010010", + "110000100011100111111111111111111", + "000000001001110100000110100010111", + "111111101011001000110000101011101", + "100000100000011010000111100010100", + "101110101110010001011110111110110", + "101110101110100111001111010000000", + "101110100111111001110000010011011", + "100000100110010100000001111001011", + "111111100000011100110000100100100" + ], + "3": [ + "111111100011010000000110101111111", + "100000101110101101000001101000001", + "101110101001001110110000001011101", + "101110100100111010100100101011101", + "101110100110011110100111101011101", + "100000100011101011100101001000001", + "111111101010101010101010101111111", + "000000000100011010010100100000000", + "011101100110100000100001000000110", + "001000000010001111101000000100010", + "011001111010010010111110001101001", + "101010000011011001001111100011000", + "111100101010111000011111000100000", + "011010011000100110001001011110100", + "000101110010001111011010101000100", + "101101010111010110100110101011011", + "101101101001100101100001110011001", + "110101010101111011110000010010010", + "000100100111010101101100011001111", + "101110010101110000101011000000000", + "010011101111111101110010001110101", + "111100000011010110001010000100111", + "000111111011000010011110001100011", + "011001011010011100101111100010001", + "101000110000111001010111111111110", + "000000001111100110000101100010111", + "111111100010011110100100101010110", + "100000101110001100111001100011110", + "101110100101101010010010111111101", + "101110101110101001110010110001110", + "101110101001110110001101010000000", + "100000101100001000001010001010101", + "111111100100110001111010000100000" + ] + }, + "5": { + "0": [ + "1111111010111010111100101010101111111", + "1000001001110010010010000001001000001", + "1011101000011100000111010100001011101", + "1011101010001111011111110010001011101", + "1011101011010000101111100110001011101", + "1000001011000111101101111110101000001", + "1111111010101010101010101010101111111", + "0000000010000010111000101011100000000", + "1000101111100110001100111110111111001", + "0111010100001110100111000100011110000", + "1010011110111100110010000001010100100", + "1000110101011010011000101011100001110", + "0101011111010001101110110110001111000", + "1100100111010010010100001000111000001", + "0100111100011111001101111110101010101", + "1101100011100011100111010100011110111", + "0011011011111100100010000101010110110", + "1110100100000100011100101010101001100", + "0001001011011011001101111110101011000", + "1101100001000101100111010100011110001", + "1011101001110110000000001101110110001", + "0111110110010000101111100110001111111", + "1000011001101000110010000001010101010", + "0100010010010110011000101011100000100", + "0100001110001011001100111110101010101", + "1000100111010010100111000100011110010", + "0000111001000110110010000001010100100", + "0011010101010000011000101011100001101", + "1100101100100001101110110110111111011", + "0000000011010110010100001000100011101", + "1111111010011011001101111111101011001", + "1000001000100011100111010100100010111", + "1011101010011110100010000101111110110", + "1011101001100010011100101010101101101", + "1011101000011011001101111110000001010", + "1000001000001111100111010101101100010", + "1111111010111010000000001101100110011" + ], + "1": [ + "1111111010000110101100000110101111111", + "1000001010011111001010011111001000001", + "1011101011001010011111001010001011101", + "1011101011101000010111101000001011101", + "1011101001101000010111101000001011101", + "1000001011100000110101100000101000001", + "1111111010101010101010101010101111111", + "0000000000110101100000110101100000000", + "1100111000101100000110101100000101111", + "0100110010000110101100000110101000000", + "0101001101000000110101100000110010100", + "0001010111101010011111001010000111111", + "0001101111110111101000010111101010110", + "0111100101101000010111101000011110000", + "0101111101011111001010011111001100100", + "0100100101010101100000110101111001111", + "1110111000001100000110101100010110010", + "0110010001000110101100000110101001100", + "1100001010100000110101100000110011000", + "0010110001001010011111001010000110000", + "0010111010110111101000010111101010001", + "1011010111001000010111101000011110000", + "1101011111011111001010011111001100100", + "1111110110110101100000110101111001110", + "1100101101001100000110101100010111000", + "1111110011000110101100000110101001100", + "0001001010100000110101100000110011000", + "0000000100101010011111001010000110001", + "1111111101010111101000010111111110001", + "0000000010001000010111101001100010010", + "1111111000111111001010011111101010100", + "1000001011110101100000110101100011101", + "1011101010101100000110101100111111011", + "1011101001100110101100000111001011101", + "1011101000000000110101100001100001010", + "1000001011101010011111001011101100010", + "1111111011110111101000010111100110011" + ], + "2": [ + "1111111001100011111011010111001111111", + "1000001011101101101001100001001000001", + "1011101010100011010101001100001011101", + "1011101010000110001001011001001011101", + "1011101010100010000011011101101011101", + "1000001011101101001001101000101000001", + "1111111010101010101010101010101111111", + "0000000001111100000010110010000000000", + "0010011110011001100100100111110111110", + "1110110001101100010010111110110001100", + "1100101101100000010011010000100011000", + "1000010110101100110101100101101001101", + "0010101101000001101110010100101011100", + "1110110111001100011011111000101000010", + "0100101111100010010110010110111010011", + "0000010100111110110010000011110001010", + "1010101001010011101000010110011111011", + "1010010110001110101010010110010111111", + "1010011011010011001001001001000101001", + "0100000101110010110110010100001111111", + "0001001001000011010101000101100101101", + "1100000111001100101010010101000100010", + "1010101011110010100001011001000010111", + "0110100100110010011110001100001000010", + "0010101000000011010101011101000110111", + "0110110100001100111000001000000110010", + "1110001010100101000101101111000100111", + "0011010011010100110110011010001110010", + "1100011111011101001010001111111110111", + "0000000010000000111100101111100010100", + "1111111010111101000110001001101011100", + "1000001011010110110011011100100011001", + "1011101001000111001101000101111111000", + "1011101000001110111011100001010000000", + "1011101010011001001100010111110000111", + "1000001000011000110110100010011010000", + "1111111001000100111001010110010000101" + ], + "3": [ + "1111111011100011100100101001101111111", + "1000001001011111010010100000001000001", + "1011101001000111111000001010101011101", + "1011101001110000000111100000001011101", + "1011101010100000101101001011001011101", + "1000001010011111101011000001101000001", + "1111111010101010101010101010101111111", + "0000000000100111001001101011000000000", + "0111111100111000010101001001000110001", + "0100010010000100101010100111111000101", + "1111101111101111101110111110010101110", + "1011100000111101001000010100100000100", + "1110011100111010010111110010011101010", + "0000000100001100100110001001100001011", + "1111101011110001101010100000001100101", + "0111100100100111001000001010111000011", + "0011011100100110010111101000101001101", + "1101100000000111010111000111011110110", + "1100011101000100001001011111110011111", + "1100110000011111011001110101000110110", + "1011111000110001110111011011010011011", + "1011100001100100111110100100001101011", + "1101111100100101010000111111110100001", + "1111100000111110011000010101000001011", + "1010101010111001011111110011110000001", + "1001010110100001001011001001001111011", + "1000011100100001011001000001110010001", + "1000010111000001011101101011000111011", + "1000001100110100001011001001111110001", + "0000000010111111000011100110100011101", + "1111111010110111011111011111101011010", + "1000001011000011011011110101100010000", + "1011101010100110001001010011111111110", + "1011101011100010010010101000011001001", + "1011101010101101010100100001000110001", + "1000001011011001110110001011010011001", + "1111111001000010111101100000100110011" + ] + }, + "6": { + "0": [ + "11111110000011101100010001110010101111111", + "10000010010001010100110111111011001000001", + "10111010111000110110011101010001101011101", + "10111010110001010000010100110011101011101", + "10111010101011000110111011011000001011101", + "10000010111001111101010001100010101000001", + "11111110101010101010101010101010101111111", + "00000000100010100111111011001000000000000", + "10111110001110100001110010101010001111100", + "01111001110100010010001000010100110100000", + "01111111001010000010101110011101010001110", + "00001000110111000000000100110111100101000", + "10110111101010110010111110011001010110110", + "10011100111101111100010001110010100011110", + "00110111001011000100110111111011001110101", + "11101001110101001110011101010001111011111", + "01111111001010011000010100110011100000001", + "10001000110010001010101010011100011110000", + "01111010101000011011001000000100101001010", + "00110101010111011001100010101110011100000", + "00000110101110110011111010001000001011010", + "01001001001100111000000000110110110101101", + "01110010000010100010101110011101010000100", + "00100101100101101000000100110111100101101", + "01111111000001010010011100010001010110000", + "11111001001100011100110011111010000010110", + "01101011111101111101010001100010101110001", + "00100100110000111111111011001000011011011", + "00000110100011001001010000100010101010101", + "11001001000011101010101010011100010100000", + "10110010011110101011001000000100110001010", + "10101101100010100001100010101110000100000", + "10110011011011110011111010001000111111010", + "00000000101000110100010001110010100011110", + "11111110011001110100110111111010101010101", + "10000010110100100110011101010001100011111", + "10111010100011001000010100110011111110001", + "10111010110010101010111011011000110000010", + "10111010111111101101010001100011111111010", + "10000010001010000011111011001001010110010", + "11111110110001111101110010101010000011000" + ], + "1": [ + "11111110011001011110100001011110101111111", + "10000010111111100101001111100101001000001", + "10111010001001001111100101001111101011101", + "10111010110000101001111100101001101011101", + "10111010010110010010010010010010001011101", + "10000010110000011010110000011010101000001", + "11111110101010101010101010101010101111111", + "00000000001010110000011010110000000000000", + "11111011100100011010110000011010110101010", + "00110101100110110000011010110000010100010", + "01011010011110011010110000011010101001001", + "10000001001000110000011010110000011101011", + "00010010111010010010010010010010001110101", + "10011100110001111100101001111100110010011", + "11001011010111100101001111100101010111000", + "11101001010101001111100101001111100010010", + "11000111110110100001011110100001010111011", + "10000001111001011110100001011110100011100", + "10101111011111100101001111100101010110110", + "00001100011101001111100101001111100011000", + "00000010101100101001111100101001110010110", + "11001000101010010010010010010010000101111", + "01101011101000011010110000011010101000100", + "10110001010010110000011010110000011101101", + "11110111001000011010110000011010101010010", + "11110000001010110000011010110000010101110", + "00101010000000011010110000011010101000101", + "11100000101010110000011010110000011101011", + "01100111100010010010010010010010001110101", + "10001101111001111100101001111100110010001", + "10110011111111100101001111100101010111000", + "10011101000101001111100101001111100010001", + "10000011010110100001011110100001111111000", + "00000000111001011110100001011110100010000", + "11111110100111100101001111100100101011010", + "10000010011101001111100101001111100010000", + "10111010101100101001111100101001111110110", + "10111010101010010010010010010010110011110", + "10111010110000011010110000011011100010110", + "10000010101010110000011010110001010111110", + "11111110111000011010110000011010000010000" + ], + "2": [ + "11111110111111010010000111110010101111111", + "10000010100010001111000111111011001000001", + "10111010111111010111101101010001101011101", + "10111010000000000011101000110011101011101", + "10111010001111010000011101011000001011101", + "10000010100000100111011100000010101000001", + "11111110101010101010101010101010101111111", + "00000000101111010001011111001000000000000", + "00111010100011000110000110001010011100111", + "00110100100110100000010010010100110100000", + "00000011010110100010101111011101010001110", + "01101100000111111110101010010111100101000", + "10101010011111100010100011111001010110110", + "11010001011111001100000101110010100011110", + "11101011111001100010010000011011001110101", + "00110100000001001111101110010001111011111", + "00111010001101000000011111010011100000001", + "00111000101100101010110110111100011110000", + "00110111110010100010001011000100101001010", + "00000101100111111111101010001110011100000", + "10000011011011100011100111101000001011010", + "00100000111111001000010101110110110101101", + "10100110001000100000011001111101010000100", + "10101001001001001001111111110111100101101", + "10010110000111001100001101010001010110000", + "01001101101101100000110001111010000010110", + "00000110001011010101111111000010101110001", + "00010100111001000110000000101000011011011", + "10000011011100100101101100100010101010101", + "10101000110000101111110011011100010100000", + "10100010001001000110010011000100110001010", + "10100101001111010101000011101110000100000", + "10010110110101101100010001001000111111010", + "00000000101011001001111101010010100011110", + "11111110001011001100011111011010101010101", + "10000010011011011110000010110001100011111", + "10111010111000100101101100110011111110001", + "10111010110001101011100011011000110000010", + "10111010100001000100011010100011111111010", + "10000010010110010111000011001001010110010", + "11111110001101001100000001001010000011000" + ], + "3": [ + "11111110001100001011000101110010101111111", + "10000010101011000010110111001101101000001", + "10111010110101010010000110001010101011101", + "10111010010100010110001110110011101011101", + "10111010001101100001100011101110101011101", + "10000010001111001011110010111001101000001", + "11111110101010101010101010101010101111111", + "00000000010111111001010001111110100000000", + "01110110000110101101011101110001000000110", + "11001101101110001100001100010100110100000", + "10101111000101000101000110101011100111000", + "11101001000101100101000111101100111110011", + "00110011010111000011101010011001010110110", + "10000100110000011010010111000100010101000", + "10101111010111000010101100100000010101110", + "11111101001100010101000101010001111011111", + "10101111000101000111011010000101010110111", + "01011001010111001111011001000111000101011", + "11110011010111100010010000000100101001010", + "00001101001000001000101100011000101010110", + "10001110101000001000110001010011010000001", + "01110001110110101000110000110110110101101", + "10001111111010001101000000101011100110010", + "11100100011111001110000111101100111110110", + "01001010011000111101001100010001010110000", + "00000101100110000111100101001100110100000", + "00001011010110101011000010111001110101010", + "10111001001111010000100011001000011011011", + "11100011000101000010101110010100011100011", + "00100000100111000000011001000111001111011", + "10110011011000100010110000000100110001010", + "00001001110011010000001100011000110010110", + "01011011011111101111011001010011111110001", + "00000000110100010000011001110010100011110", + "11111110011111001111101001001100101010011", + "10000010110110010011011110001010100010100", + "10111010010111100100011100110011111110001", + "10111010101010101101100101101110000110100", + "10111010110011011101111010111000100100001", + "10000010110101000100101011001001010110010", + "11111110011001100100100100011100110101110" + ] + }, + "7": { + "0": [ + "111111100001101111100100100001001100101111111", + "100000100000101111010001010100111001001000001", + "101110101111000100000100011100100101001011101", + "101110101101100111000001001011111101101011101", + "101110101110100100111111111110101111101011101", + "100000101011101100111000100011111000001000001", + "111111101010101010101010101010101010101111111", + "000000001100001101101000111001010100100000000", + "101111100001110110111111101100000000101111100", + "000000010001001111111010111001010101010111001", + "000101111110011110100111000100100000001010010", + "011000000010010101111010000000100011011001011", + "101010101101100110101101010101111111101100100", + "010001010101001101111101100000101010111000110", + "010100100001101101010000110101111101100101100", + "101111010101101010000101111100110100100100110", + "110101110101110101010000101011100000110011100", + "000011011111001000100100111110110101000111000", + "011101101010011010100001000011100000010010011", + "110011010100000011111100000001010011011001001", + "001111111101101100101111110100000110111110111", + "111110001101100011111000100001010010100010010", + "101010101001000101011010110100100101101010100", + "011110001101101010011000100100100011100011110", + "110111111101111101011111110011111110111110000", + "000010011111010000100001000110101011001100111", + "101110110100111010101011110011111101011001110", + "010001001010011011000110111101010100100100111", + "011001111100011101101011101010000000000111110", + "011111011101000010100100111111010100110001000", + "100000101101100010101101100010100000100110011", + "011101010101101100100000100001000010001011001", + "110011110111111110000101110100011111100100111", + "001110011111010001001000100001001011010010110", + "000010110110111000010010110100111101100111100", + "011110001100011101111111011100100100110010110", + "100110111010001010011111101011111000111111100", + "000000001111110000011000111110101101100010100", + "111111100100011000101010100011111000101011111", + "100000101101100110101000111001010100100011101", + "101110101111011110001111101100000000111110011", + "101110101111011001010010011001010101111001000", + "101110101100100000000101000100100000101100000", + "100000100111010100000011100000100011111001000", + "111111101010101000011110110101111110100100110" + ], + "1": [ + "111111100111000011100101111110110000101111111", + "100000101010100111010000100011100101001000001", + "101110100010010010000101111000100001001011101", + "101110101011100101010000101101111001101011101", + "101110100001110010101111111000101111101011101", + "100000101100100111001000100101111100001000001", + "111111101010101010101010101010101010101111111", + "000000000011010010011000100001000101000000000", + "111110111010100001001111110100011000110101010", + "011110011101010100100010100001001101000000101", + "101011111010011000100111010100111000010101110", + "110101000101101101111010000101010101000100110", + "010110110101011000101101010010000001110011100", + "100101011000000101111010100111010100100111000", + "000010101011111000100111010010100001110010011", + "000001001110001101111010011100110010111101101", + "010010101101111100101101001011100111101010011", + "101011010000100011111101111110110010111111001", + "110110100110000111010000100011100101100010010", + "100110001001110010000101111000100010111001000", + "011111111101000101011111101101111110111110101", + "110110001000110010101000111000101010100011010", + "000010101110100111001010100101111101101010000", + "001010001010010010001000100001000101100011110", + "001111111000100001011111110100011000111110000", + "010010010101010100100000100001001101001100101", + "000100100100011000101101110100111001111001110", + "011001001101001101100000100101010100000100111", + "110000111000111000100101110010000001100001100", + "010000001111000101101000100111010101010100100", + "111001110100011000110010110010100001000001111", + "010001011111001101111111011100110010110100101", + "100111110101111100110010001011100110000100011", + "101001010000100011101101011110110010110011011", + "000010111001100111010010100011100100000110010", + "011110000110110010011111011000100010110011011", + "100110111011100101011111101101111110111110110", + "000000001000110010111000111000101011100010110", + "111111101001100111001010100101111100101011100", + "100000100000110010001000100001000100100010110", + "101110101010100001001111110100011000111110100", + "101110101001010100110010000001001100111100100", + "101110101010011000100101010100111001001011100", + "100000101111001101110101100101010100011110100", + "111111101000111000100000110010000001000011110" + ], + "2": [ + "111111101001110100000010001110111100101111111", + "100000100101000000111100111100010101001000001", + "101110100010101010001111110111001101001011101", + "101110101100101110011100001011101001101011101", + "101110100110101100011111111001000011101011101", + "100000100000011101011000101111001100001000001", + "111111101010101010101010101010101010101111111", + "000000000000000011101000110101000100100000000", + "001011101001001100001111111001101111110001001", + "010000011110001011100010110111000101010000100", + "000010110010010110100111000101101011111010001", + "101110010100110100110110110110110011001100100", + "001011110011110011001111101110010000100100101", + "010010011001001111110110000100111010100111010", + "010010110100000011010110101000110010000101010", + "101011010011001110000000101111000100110000011", + "101011100011011101110011101001101111111010010", + "010011001000010101001010111101000101010000100", + "110000110110010111101111001101101111111010001", + "011101011010110011110110100110110011001100100", + "101111111011010000101111101110010000111110101", + "001010001101101000111000110100111010100011001", + "111110101111111111101010111000110010101011111", + "011010001001111100001000100110100101100011001", + "100011111110001011011111110110101111111111111", + "000001011000100100101000001001100101011010100", + "111001101110111011100011111010001110010000001", + "011000011101101001101100100011110011010010100", + "101110111001000000111101101110010000001000101", + "001011011011010000110100010011011011000001010", + "100001110111111111111111011010010010101111110", + "010100011001010101101100110101100101100101011", + "100011111110010001010110011101001111110011110", + "101110010000101111110110110110000100111011100", + "000010111001100101000110000111101111010000101", + "011110011000100011110011110101110011010010000", + "100110111001011101011111111100010000111110001", + "000000001001010110111000101111011010100011010", + "111111100101111100111010101110010010101011110", + "100000101001010000111000110100100101100011011", + "101110101011010101111111111100001110111111110", + "101110100111101000101110011111100101001000110", + "101110101000110101111000100111101111000010001", + "100000100011110101110110100000010011100000110", + "111111100000001111110110010000010001000010111" + ], + "3": [ + "111111101010100011011010100101101000101111111", + "100000101100000110100111000111100001001000001", + "101110100001000010111010000000110001001011101", + "101110100010011010111100011011101101101011101", + "101110100111000000011111100000110111101011101", + "100000100100011001101000110001100000001000001", + "111111101010101010101010101010101010101111111", + "000000000110011000101000100000100001000000000", + "010000111010010111101111110011111001110000011", + "101001000101010011111010101000100010111110101", + "011101100001001111101011010011111001101101111", + "101111010100011001100011111001010110100100101", + "010000100110100110111101010001011100101110100", + "101110010011101000011001011011010110100101000", + "011110101000000010110101000010100101110100011", + "000101011101001100111111001010101010101011000", + "010111110010010010000111110011111000010010111", + "010011011111000110110000100010101001100010111", + "110101100100000010101000001000100101001000101", + "101111010000000011110011111001000111011100111", + "101011111101111111111111101010011111111111110", + "100110001101100010001000110001000100100010101", + "011110101000011110111010100010111100101011011", + "001110001101010000111000110101000110100011101", + "100111111110001001001111100111000100111111000", + "011101011010000110100010000101001110101000110", + "101001110000111001011101010100111100111001100", + "100101000101101000001011001011001010001010111", + "101011110000011110000001010010011001100101100", + "100111010100001001010011100011001001010110100", + "000100100000000100101001101001100010011100100", + "001010011010110001111000000101010110110110101", + "111011110010110001111110100100000110011101111", + "011111011101101010000110100111011100100101011", + "000010111000011001001100100100100100111110000", + "011110010110000111101111100100100000000111010", + "100110110010011111101111110110100010111111111", + "000000001100000101101000110100101000100010110", + "111111101010111101011010110101111001101011100", + "100000100001101100101000101111011011100010111", + "101110100010111001111111100100000001111111100", + "101110100111101101101011001101010000111011000", + "101110100001001110000101011111111110010011011", + "100000101000000111110111100100110000010001000", + "111111100101001000110001101101100001001110110" + ] + }, + "8": { + "0": [ + "1111111000111101011000100111110010100100101111111", + "1000001000000110010101010000101111010011101000001", + "1011101011100011001110101110010100111101101011101", + "1011101010000101110001110011000001101101001011101", + "1011101010100010100110111110010100111000001011101", + "1000001010100010001010100011001001001010001000001", + "1111111010101010101010101010101010101010101111111", + "0000000010100000100111100010010100111110100000000", + "1011111001011101011101111111000001101011001111100", + "1110110001001011100000100110010100111110110011011", + "1100001100100000001101110001001001001001101110001", + "1011000001100100001000111110010100111110101101011", + "1101101010011100101101001011000001101010011000001", + "0000000100100100110001011110010100111111001100100", + "0010111000110100100100001001001001001000000001111", + "0000100000111011001001011110001101011001010100110", + "1011001101000111010000001011011000001100000001001", + "0110010011111110101111011110001101011001010101111", + "0000001001101010010010001001011000001100001001001", + "0110010010110000100111011001001001001001010010011", + "0110011011010011111000001100111110010100000101101", + "1001010110100110110111011001101011000001010010101", + "1111111111111100011011111110111110010100111111110", + "1101100010100101001110100011001001001001100010100", + "1011101010111110101001101010111110010101101011010", + "1011100010111101101111100011101011000001100010101", + "0000111111100000111011111110111110010100111111110", + "0001100000010010111111101101001001001001001110100", + "1010001011010010001001011000111110010101101101010", + "1110010001111110010111101101101011000001011001010", + "0000111000001101000011011000111110010101001100011", + "1100010000010101011110101101010000101111111001010", + "1010111111000101111100101000100111110010001000011", + "0010100000000111111000010101110010100110111111001", + "0110001111000101001101100000101111010000001010010", + "1011010110110101101000010100010100111111101110000", + "1110011000111000001100101001000001101010001001110", + "0000110000100110101000010100010100111110111111011", + "0100011110101110100101100001001001001000001010001", + "0111000100011010101000010100010100111111111111011", + "1110001110010110000100111111000001101010111110001", + "0000000010001101111000100010010100111111100011011", + "1111111000111010110101101011001001001000101010001", + "1000001010000101001000100010010100111110100011011", + "1011101011001101100100111111000001101010111110001", + "1011101010101011101001001110010100111111001010101", + "1011101011010000010100110011001001001000111101101", + "1000001000000100010001100110001101011001101010101", + "1111111011001110110000110001011000001100111111011" + ], + "1": [ + "1111111001010000101111011000001101011000101111111", + "1000001010100001101010001101011000001111101000001", + "1011101001111100111110111001001001001001101011101", + "1011101010111001001001101100111110010001001011101", + "1011101000001100111110111111101011000000001011101", + "1000001011000001101010100010111110010110001000001", + "1111111010101010101010101010101010101010101111111", + "0000000001011100111111100011010000101111000000000", + "1111101111111000001101111110100111110010010101010", + "0011000010111101011000111001110010100111001100101", + "0010101110001110010101101100101111010000011001110", + "0001010110000011000000101110010100111111001000000", + "1110011100100110010101010011000001101011011111110", + "0001010111101001001001000110010100111110101011000", + "1001111110110110010100010001001001001001111110011", + "1011100100011011000001001110001101011000110001011", + "0111011111010111010000010011011000001101000110001", + "0011110101010000101111000110001101011000110010111", + "1111001011000001101010010001011000001101101111101", + "1010000011000100111111011001001001001000110100011", + "0010111110111001001000001100111110010100000001101", + "1000110001101100111110111001101011000001010100100", + "0110111111010001101010111110111110010100111111111", + "0111100011111100111111100011010000101111100010101", + "1001101010100000001100101010100111110011101011000", + "0101100010011101011000100011110010100111100011001", + "0100111111011110010101111110101111010000111110010", + "0110010000001011000000001100010100111111001001000", + "0011101010001110010100111001000001101011101101110", + "0001010101100001001000001100010100111111011001000", + "1001111010110110010101111001001001001001001100011", + "0000000000101011000001001100001101011001111001010", + "0010011110100111010001001111011000001100001000001", + "1000110010111000101111110010001101011000111111011", + "1101101100100001101011000111011000001100001010001", + "1110010010111100111111110001001001001001111111011", + "0101111100101001001001001110111110010100010001001", + "0001110111110100111111110011101011000000100110110", + "0100011110000001101011000110111110010100110011111", + "0111000101010100111110110001010000101111001110110", + "1110001001111000001100111110100111110011111111011", + "0000000011001101011000100011110010100110100010101", + "1111111011011110010101101010101111010001101011110", + "1000001001001011000000100010010100111111100010100", + "1011101011111110010100111111000001101011111111010", + "1011101011001001001001011000010100111110010101001", + "1011101011111110010100101101001001001001000000001", + "1000001011001011000001111000001101011000010101001", + "1111111010001111010000101101011000001101001000011" + ], + "2": [ + "1111111000001101000110110010011000100100101111111", + "1000001001101110100000001111110110001011101000001", + "1011101001011111101000100011101001000001101011101", + "1011101001011000010011110101111011110101001011101", + "1011101011010110011100111111110101111000001011101", + "1000001000011000011110100010001000111110001000001", + "1111111010101010101010101010101010101010101111111", + "0000000011101111000111100010110111110101100000000", + "0011001110110011100101111110111110011110111010000", + "0101100011110000110011001000011010100110101100101", + "1001111110000001011110010010001100001010100010101", + "0011010001101011100111000010000001010011000001001", + "1101101101001110001011110011010011101011111001010", + "0000000001111111110010110101000001100100010110010", + "1011111001100111110111100010111010100101110101111", + "0011100100100010000111001111101101011001010101000", + "1010001110011001101001001000001001010110011011001", + "0010100111010010000010000011110110110101011000100", + "1010101101100111011110001111010110001101101000110", + "0000010001001010101100001101111010000011101001011", + "0100101100011100101111101110011011100001101000011", + "0111010110001010110111111110001001011001011101010", + "0001111110100100000100111111110101010011111111000", + "0110100011110101111101100011111100110100100010111", + "1010101011110001000011101011111110001101101010011", + "1110100011010001101100100011011000000010100010010", + "0100111110010010110010111111001011100001111111111", + "1001000110011000010001110110011101011001000001000", + "0011101110101010011000111011000011010110101111001", + "1001100001100111011010101111101000110100101100110", + "0000011010011011010110001010110000001101110100001", + "0101110000000101000010000110001110000010010010000", + "1000011011001110110111011111101101100000011101100", + "1111000011010011011001111001000101011001000111011", + "1001001110100101101100101100010011010110101001010", + "0100000110100001111111011100111100100100100010110", + "0111111010011001000011000100000110010101110000001", + "1111010000100100010010101000011000011010011101100", + "0100011101100000000110010110100011111000111110000", + "0111000011010000011011111101010000101110101110111", + "1110001000101101010010111111011100101000111110010", + "0000000010101110010100100010101111001010100010010", + "1111111011111011110011101011001111010000101011001", + "1000001000000010100100100010000011110101100011000", + "1011101000001011000110111110110010011111111110000", + "1011101011110011010001100100010010100110010000101", + "1011101010110001001010001111011100001010011100110", + "1000001000101101010100110011101101000011111111000", + "1111111001100110101011011010000111110011001111011" + ], + "3": [ + "1111111001100001111110110010110010100100101111111", + "1000001011111111100101100100010100001011101000001", + "1011101010011011111000100111111101000001101011101", + "1011101001100011010100000100100111110101001011101", + "1011101000111010100101111111001001111000001011101", + "1000001000001111001011100011000010111110001000001", + "1111111010101010101010101010101010101010101111111", + "0000000000001001011110100010101011110101100000000", + "0111011001011110111000111110001010011110100000110", + "1001000111001000110101011100010010100110101100101", + "1001011100111110100001000000010100001010100010101", + "0100110100100000000111100010011001010011000001001", + "0100011001001100000011000001100001101011111001010", + "1010110101000000000101000111001111100100010110010", + "0010111010101111011101110100100100100101110101111", + "0101100001101100000011101111101101011001010101000", + "1111001011000010010011111010100011010110011011001", + "0100110011111011010101110001100000110101011000100", + "0011101111001000110100011001011000001101101000110", + "0110010110110110101100101101010110000011101001011", + "0101001011001101110001011100010101100001101000011", + "1101000010000011001100011100001101011001011101010", + "1000111110011010101100111110100011010011111111000", + "0000100010011001111111100010100000110100100010111", + "1010101010100000011100101010111000001101101010011", + "0111100011011000010110100010110110000010100010010", + "1111111110101100011011111111010101100001111111111", + "1100010011110100010011100000001101011001000001000", + "0010101011111011000111110000000011010110101111001", + "0000010011101110100000010101100000110100101100110", + "0101001011000101100111100001011000001101110100001", + "1110000101101001011000111111010110000010010010000", + "0000011001100000101101100100110101100000011101100", + "0010110111001100101110110110001101011001000111011", + "0111011111001000110011011110000011010110101001010", + "0111110100100110100111001000100100100100100010110", + "0100111001001010001001001010111110010101110000001", + "0110100111011010101111111010110000011010011101100", + "0100011100100110000001011111010011111000111110000", + "0111000101000111001111100011010000101110101110111", + "1110001010110000011101111111111100101000111110010", + "0000000011001011111001100010011111001010100010010", + "1111111000011011011001101010101111010000101011001", + "1000001010011001001111100010001011110101100011000", + "1011101001101111110010111111001010011111111110000", + "1011101011000010011010101011110010100110010000101", + "1011101011011001100001011101110100001010011100110", + "1000001010101111111000011110111101000011111111000", + "1111111000000010011111100000100111110011001111011" + ] + }, + "9": { + "0": [ + "11111110111000111110100010010100110111111010001111111", + "10000010101100100011100001111101010100111011001000001", + "10111010010000010011011001000111001100111001001011101", + "10111010101001010101110011001001100010110010101011101", + "10111010000110101110010011111010000001010110001011101", + "10000010000000101010101110001000111001001110001000001", + "11111110101010101010101010101010101010101010101111111", + "00000000111000101011010110001010100101010100100000000", + "10110111010011001000101111111010111111101101001001011", + "00111101010111001010100100010100110001100011100000011", + "11001111111011001111000101111101010010100000001011110", + "11110001110011000000111111000000001000111000101101010", + "00001011010100010110010001001110000100110110000011010", + "10111000010001111001010010100101100111010101000000110", + "10110010001001100011101000010101011111001101111000001", + "01001001110100011011000100011011001011100011110010000", + "01100011111011001001000111111000101010000000110011100", + "11101101110100001100111111001000010010111000101011001", + "00001110110010100101101011001110010100010110100101001", + "00011101101011001101001010101101111100110101000100101", + "01110010101010100101110010010101000110001101011110010", + "11110101001000100000010100010011001000000011110001110", + "00100011000111010100111101111000100011100000010010011", + "00011101011000001101000111000000010001001110110000100", + "10001111101000011000001011111110011101001000111110001", + "00101000101100010000100010001101111110101010100010000", + "00011010101001111010010110101101001110010000101011010", + "11001000100011110001111110001011001110010101100011011", + "01111111111111100000111011111000101101111110111110011", + "01001000100010110101001000010000010101000110100110110", + "11001011000000100001001001100110010011001011101000100", + "01111101010101010111001100000010111000100010100011011", + "00111111001100001101010010111010100000010011101011011", + "10001101111001101001010010010100101110011100000111110", + "10110111101111110110111111010101000101111100000110011", + "11101000101110111011100001101111001101001111000110100", + "11110110011110001110001001100001100011001000101010001", + "01001000100110001110000100100010000000101010101011010", + "10111011110011110000001010111000111000010001110011101", + "11100000110100111000100010110100010111110100010101100", + "10111111011101110111000111010111010100011110011000100", + "10001000101100010100011001001111101100100111000001011", + "11011111100001110001010001100011100010001010001111010", + "01100000000100011000010100000010100001010100100100110", + "00010010011101111001101011111010111001101101111110001", + "00000000101100110001000110001100110111100011100010000", + "11111110110000011010011110101101010100100000101011100", + "10000010101111111010000010001111001000111001100010011", + "10111010000010111100101011111001100100110110111110110", + "10111010111001010101100001010010000111010101111000100", + "10111010101101100101110001001000111111001101000000001", + "10000010000000100001010011100011010011100011001110010", + "11111110101010001001011010000000110010000000100101110" + ], + "1": [ + "11111110010001010011100010000100110111111010001111111", + "10000010110101100010101111010011100010001111001000001", + "10111010000100110111111010000101010011100001001011101", + "10111010101011100010001111010000000100110010101011101", + "10111010001100010111110011111101010001100010001011101", + "10000010101101100010101010001010000100010110001000001", + "11111110101010101010101010101010101010101010101111111", + "00000000001100110111111110001011001010000100000000000", + "11111011111011110011001011111110011101010001010101010", + "00110000001000001110010011110011001000000100001001111", + "00000110110000011101010010101110010101010011010100100", + "11111100011111001000000101111010001110010100001111111", + "11011011010000010101010000001111111011001000011010001", + "10001001010011001010000101110010101110011101101111100", + "01010110010010011101010010101111110011001010110010110", + "10100100100001001000000101111100010111110011110111000", + "10111110111110000100010000001001100010101110000010110", + "01001001000111010011100100000100110111111011110110011", + "01111011100111100010101111010011100010001110100011000", + "11110101111110110111111010000101010011100011110010000", + "01101110000001100010001111010000000100110111000101010", + "11101101101110010111110010000101010001100010010000010", + "01110011101011100010101111010010000100010111000101001", + "10100100110010110111111010000011001010000100001010011", + "10011111100111110011001111111110011101010001111110101", + "00011000100110001110010010001011001000000100100011111", + "01001010111110011101010010101110010101010010101010100", + "00001000101011001000000010001010001110010100100011110", + "10011111110010010101010011111111111011001001111110011", + "01000101110111001010000001010010101110011100011100000", + "01110110100010011101010111110111110011001010001001010", + "10101100101111001000000100101100010111110010110100000", + "10101011000110000100010111111001100010101111001110010", + "11110001110011010011100000001100110111111011111010011", + "10101011101011100010101111110011100010001111001111000", + "10001101100000110111111100101101010011100010110010001", + "00111110010101100010001101111000000100110111010111010", + "01011101011010010111110010001101010001100011100011110", + "10001011101101100010101000000010000100010111110110101", + "10110101110010110111111011010011001010000100000011111", + "01010110110111110011001000000110011101010000110010001", + "01111100111010001110010011010011001000000100000101101", + "11011111011111011101010000000110010101010010110000100", + "01100001110111001000000011010010001110010100000101101", + "00010011101000010101010011111111111011001000111110000", + "00000000101010101010000010001010101110011101100010000", + "11111110110011011101010010101111110011001010101011010", + "10000010010110101000000110001100010111110010100010000", + "10111010111000100100010111111001100010101110111111010", + "10111010110100110011100000000100110111111010001010010", + "10111010100011000010101101010011100010001111111101010", + "10000010110111110111111011110101010011100010101000010", + "11111110101110000010001100101000000100110111110101000" + ], + "2": [ + "11111110101110100111010100011101010011111010001111111", + "10000010110011000110001101000100111110001111001000001", + "10111010101011000101000000011001100011110001001011101", + "10111010000101011101111101101111100100101010101011101", + "10111010000110110000101011111101010001111010001011101", + "10000010111011001100011110001100110100001110001000001", + "11111110101010101010101010101010101010101010101111111", + "00000000111011000100001110001100000111110010000000000", + "00111010111101010111001011111111100010101110111100111", + "10010000001110111111010100001101110111111011001001110", + "11000111010010101100000001000000110010001110110100101", + "00000101001011010101001010000111100010010011110111111", + "00100010100011110111101001101011000101001111000010001", + "01111001100100010110110100001100010000011010010111110", + "10101011011010000100010001011110010101001111000010101", + "00110100011111011100001010001101111111100010010011111", + "00010011111011110110111001110110011010110110000100001", + "10011000001110111110000101101100101111100011100000001", + "10001011010000101010110001100000000010010110111101000", + "00000101000011010000101010000111101110010101110010001", + "00100010100001110110111000001011011011001001000101000", + "10111001110110010110000101001100010110011100010001110", + "10101011010010000110110111111110011011001011000100101", + "00110100000111011110101101001111111010000010010011111", + "00001111101011111110111111111100011101010110111110001", + "10011000100110111000000110001110101000000010100010000", + "00001010110000010010101010101100000101010111101011010", + "01011000100011001000111110001101001110000101100010000", + "11001111101001011111011011111010011011010000111111010", + "00011101100111011110000110110000110110000101100100010", + "10001110010010110110001101110011011011010011010001101", + "11011101000110101111000101110101011010000010100101011", + "10001010001011011111110110010010011101010111010010101", + "10011000100011011000101000000000101000000011100100000", + "00001111011110110010001101010011001101010001010001010", + "01011001011100101011011111110101010010000100100100000", + "11100110000011001110011011010010001101010001010001010", + "00011100110011001110100110100000101000000101100110000", + "10111111000110111001101101110011010101010011010011010", + "11101101001100111000100101010111110010010100100000000", + "10111010000011010011110111110000001101010001001011010", + "10101000101011011010101000000000001000000101111100000", + "11011111011111110000011100010111110101010011001001010", + "01100001011101111001001110111010010011100101110100000", + "00010011000000000010001011111111001100110000111111010", + "00000000110101100010101010001001101001100100100010000", + "11111110000001101001110010101100010100010011101011010", + "10000010001001100000100110001111101010010101100010000", + "10111010100111010011010111111000100101001001111111010", + "10111010101111011010000001111001011000011100010111110", + "10111010100101110111010010000111101101001011100010110", + "10000010010101111100000010001010010011100010110111110", + "11111110011100000111010100111111001100110111100010000" + ], + "3": [ + "11111110001000011111010010110100110111111010001111111", + "10000010100010000101101111001101010100111011001000001", + "10111010101111000111000011010000010100101001001011101", + "10111010001100111010101000010110011010101010101011101", + "10111010010110101111001011111101111001001110001011101", + "10000010000111100100000110001101001001010110001000001", + "11111110101010101010101010101010101010101010101111111", + "00000000011010111010101110001100100001000100100000000", + "01110110000111111010001111111100111001110101100000110", + "10011001100000011111010000100010110111111011001001110", + "11000111000010011001101001001001010100111000000010011", + "11110001001111001111011101001111010101001000101100100", + "01001111101000110000110100011001111011001111000010001", + "11111101010001100001011100011010011000101100100001000", + "00101010000001100100000100100000101000010100011001110", + "00111001001111110100001110001010001111100010010011111", + "10101011001000110110101010101001001100000000110010111", + "01000000011100000101001000111001110100111000111011010", + "11110011101110101011011110111111110010010110111101000", + "10011100110110100010011000100010111000100011000100111", + "11010110101001101001000111100010100000010010011110011", + "10001001100111010000010010001100101110011100010001110", + "01000111111100001101101111101101000101111101110010011", + "11101000010100101101110000010011010001011001001000100", + "00111111101110000110011111111101111101010110111110001", + "00011000110001111110100010001000011110110100100010110", + "01011010110100010000000110101000101110001100101010001", + "00001000101000100100101010001000001110000101100010000", + "11001111111101010100101111111011001101100110111111100", + "10111000111101010011101110100011110101011110111111001", + "11001011001011101011011111111001110011010011010001101", + "10110101011001110000100010000111111100110100010011101", + "01101011010111111100111001010111000110001100001001110", + "10100101100001101000111010111001001000000011100100000", + "00110011100101011000101000101110100011100111100111100", + "11010000000000011001110000001011001001011111111111011", + "01110010010100111001011011001101100101010001010001010", + "11000101011111001101000011001110000110110011010000110", + "00110010010000101001000101100010111110001000001000001", + "00010001011011000011010100110101001010010100100000000", + "00000110111010001101010101111000101011100111111101100", + "01011100100010111101100001000100010011011110100111011", + "11011111010011010010011111110000010101010011001001010", + "01100001101100110100011100000111100101010011000010110", + "00010011101101111000000011111011011111101011111110001", + "00000000101001100111101010001001010001100100100010000", + "11111110011100111100100010101100110010100101101011100", + "10000010100011010000001110001110001001001110100011011", + "10111010001100011011011011111110000101001001111111010", + "10111010101101010000010111110001100110101010100001000", + "10111010110000001111001111100011011110010000111001101", + "10000010110010000100010001110001010011100010110111110", + "11111110011010010001101000001110110010000001010100110" + ] + }, + "10": { + "0": [ + "111111100101101000010101011110110101100000110011001111111", + "100000100000011110000100000011100000110101100101001000001", + "101110101101111100111001000001000010111101000011001011101", + "101110101000100001001101110100011111001010011001001011101", + "101110101111010101001000101111101010011111001101001011101", + "100000101100111011010011101000111101000010111110001000001", + "111111101010101010101010101010101010101010101010101111111", + "000000001011001011111110101000110101100000110101000000000", + "101111100000101001011010111111100000110101100001101111100", + "100010010100011000100101011001010101100000110100100001010", + "010010100001100011011100001100100000110101100001110100000", + "010100011100100010100001011100100010111101000010111101010", + "010000110000111110101101100011111111001010011110101010100", + "010001010110000101101000100110101010011111001011011110111", + "001110110000011011010011110011111101000010111100000011110", + "011111010110011011111100100001010101100000110101011000111", + "000011110000101011011100110100000000110101100001101101110", + "111011010010001010100101011001010101100000110100110001010", + "011101100001101110011000001100100000110101100001101100000", + "011011001010111001000111011100100010111101000010111111010", + "010110110100101000100101100011111111001010011110101000100", + "010111010001000111111110100110101010011111001011011110100", + "111111100101011001110011110011111101000010111100000011011", + "100010001010111111001010100001010101100000110101000001101", + "010010101000001011001100110100000000110101100001110100011", + "101011010110001010011011011001010101100000110100100001010", + "011111111110010110101000011111100000110101100001111110000", + "001010001010011001010111001000100010111101000010100011010", + "011010101100110111010101111010111111001010011110101010100", + "110010001001101000001110111000101010011111001010100010100", + "000111111100100101110101101111111101000010111100111111111", + "011110011011101011101100100100110101100000110100010100101", + "101011110000101000001000100100100000110101100001111101111", + "010010010111100001011111001011110101100000110101001011000", + "010111100111101010101010000110100000110101100001011110000", + "110011010110111111010011011011100010111101000010100011000", + "000011100000101111000101111001011111001010011110000000100", + "001010001101100100000110110100001010011111001010110100100", + "001001111100101000110001101001011101000010111100100001111", + "011011001001111000110010100100110101100000110100010100101", + "101101110010000000001010100100100000110101100001100101111", + "010010010000111001111111001011110101100000110101010010010", + "111111100011101000110110000110100000110101100001100110100", + "000101010011111100111101011011100010111101000010101011110", + "100011110110001111001101111001011111001010011110000110000", + "001011011101100101110000110100001010011111001010110000100", + "101001111100110001001001101001011101000010111100100001111", + "111110000111101001111010100100110101100000110100010100101", + "000000100010110011100010101111100000110101100001111111111", + "000000001011011011100111001000110101100000110100100011010", + "111111100010000111011000011010100000110101100001101010000", + "100000101011001011011001001000100010111101000011100011010", + "101110101111000100001011101111111111001010011111111110100", + "101110101101101001010100110100101010011111001011111100100", + "101110101000111001001111111011111101000010111100101011100", + "100000100111101111111000101110110101100000110101111110100", + "111111101110111001100110111011100000110101100000100011110" + ], + "1": [ + "111111101001110100111000111110110010000001001111001111111", + "100000100110001100100000001110001000111001010101001000001", + "101110101101100010101110010010000100010111110011001011101", + "101110101101000001000101110011100111010100011101001011101", + "101110101101111001010101001111111111101100100001001011101", + "100000100101110111111011011000110011100010001110001000001", + "111111101010101010101010101010101010101010101010101111111", + "000000000001011001110101001000111001010101001111000000000", + "111100101110010011100010001111110111111011001001010011101", + "001010011000010010100001000110110100011000101010111110110", + "010110100110010011011111111110001100101000010000001110101", + "111111001000011101010001110011110011001010000100001001000", + "000111100011111100110010110010011000101011100111101100000", + "110010000001001110001000101010100000010011011111010101001", + "101100110110001000000100100100001110010101010011010011001", + "100111000011101011100111000101000101111100110010100100101", + "111111111100110001011111011111110101000110001010011110010", + "110011010100010101010011110001111011001000000100010000010", + "111011111100000110110010010010111000100011100101110011111", + "001010011100011110001010101100101000010001011111001101000", + "101110100101110010000100000010101110011101010000000011001", + "011010010000010011100101011001001101111110110011000001011", + "101111101000100011011111100001010101001110001001101001111", + "101010011000000101010001101111110101010011100011110111101", + "110010101000001000100011100100011110110010000000110100110", + "001100001000100000010001010100100110001010111000101101101", + "010111111000100111111011001111101010000100010110111110001", + "001010001101110100011000101000110010100001000101100011101", + "001010101010111100101000011010101010111001110100101011110", + "110110001010111010001110001000100100110111111011100011100", + "001011111011000001001101101111100101010100111000111110000", + "100100001000000001110101011001011111001100101001111000111", + "000010110011000111110011001110010001100010101111010000010", + "100001011010111100111000110101110010000001001101010001010", + "110010111110001100100000000101001000111001010100001011101", + "001101010010100010101110000011000100010111110010100101100", + "110111111001100001000101111000100111010100011001111000100", + "011100010101011001010101011000011111101100100000100001001", + "110011111001001111111011011110010011100010001111101111010", + "000001011101111100011000100101110100111000100010100100100", + "010110101000010000111001001001001100100000010011110000001", + "110001010100010100010111111101000010101110011100011100000", + "011000111000001110110010000110100001000101111100011111100", + "101000010100110110001010100110001000010001011111001110011", + "101100100011001010000100010010001110011101010000101010110", + "011011011011111011100101001011101101111110110010101010100", + "101001100110111011011111101011010101001110001001110010010", + "111110011000101101010001111101010011001010000100010100011", + "000000101100010100110010101111111000101011100110111111111", + "000000001010100110001000101000100000010011011110100011001", + "111111100111100000000100101010101110010101010010101011001", + "100000100110001011100111001000100101111100110010100010101", + "101110100110110001011111001111110101000110001011111110010", + "101110101110001101010011100011111011001000000101001001110", + "101110101101101110110010000010011000100011100100101000000", + "100000101110010110001010111010101110001000111000010010101", + "111111101110001110010101010100001000000100110110010100000" + ], + "2": [ + "111111100001110111001100010000001100100101101011001111111", + "100000100101011100101010010000110010011111111001001000001", + "101110101001111001110001101111111010010011010011001011101", + "101110101011111101101101000011000010011010010101001011101", + "101110100011010001000010001111110010101000000101001011101", + "100000100010011001010110011000110001010011111010001000001", + "111111101010101010101010101010101010101010101010101111111", + "000000000111101000010010011000111010011000101111000000000", + "000110110110110110110000011111101110000001110101100001100", + "101001001011100000100001111110011101001000111100101110101", + "111011111010001110001111000111000011011010101100111100110", + "110110000010001111001101100011011011111110010101111001101", + "111000111010101111011000101110100110110111011101110010100", + "111010001010000011010110000101000001000101001101000001001", + "111010101111010011100101011100111010010110110100010100010", + "010111011001100001100110111001111000001010101101001111011", + "100110110001111100001110101000001101011010110110111101101", + "000101000010110001001101010011110100000001101101100111100", + "100011101000011010011100010100001001001000100110101110100", + "111110011001010010010100111111101000100101001000100100110", + "110010110011100010010100100011010111111110010010111111101", + "001000011000011011000101010000111011010111011011010110101", + "110010110100010100111011100100011001001101101001001100101", + "111111010000110010101001010001001001000010000100000011100", + "100101100011001010001110111010110111001001000100101000111", + "111110011000110100010110011001010111011011010110111011111", + "101011111001110001010000101111100000000000101111111111001", + "101110001011100000001110101000110000010010111010100011100", + "101010101000101001011011101010110101000010101001101010010", + "000010001001111010011100011000111111111001110011100011100", + "100011111010111110000101111111110110011000111011111110100", + "100100001001000000100000011010110011011101011111001110110", + "100000110101110010000001100000111110000110001100101011101", + "101001000110110111110000001110100110101111000101000011011", + "110010111000101010010011100111011101111101110100010001001", + "101000001010001001111111110010111100011011100011100010010", + "110111100100011011010001100100100101010000111011000111111", + "011110000101000001100111001100100010100010101000110110111", + "001000110110110110010100111111011100110001110010001101101", + "110010010111110011110010011000000001010111001010101100100", + "010111110010101011000010110011100101100101010001001000110", + "000100011110011111011001010011101011111110001011110010010", + "000000111111111001110000111001001101011111100011101011011", + "100011000000010100000100011011101011011000111000010001001", + "000110100001010001011000100001101001100001101011101110110", + "000000010111010010010101011010101110001000100011000100101", + "101001101101111001001010101110011111111010110110010110110", + "111110000110101001011001011111000000000110010011100101101", + "000000110100110000010111101111100111101111011011111110100", + "000000001011010001100001001000100000111101001001100011001", + "111111101110100010111001111010101100000110110010101010010", + "100000100010000000010000011000101001000010101100100011011", + "101110101010000110000101101111110010111010110111111111101", + "101110101110001101011011000101111111000001101101100000000", + "101110100111110101011011011111100101100000100110001011011", + "100000100101111000000001010010010011010100101000011111011", + "111111100100000011011101111011110110110111110011000110100" + ], + "3": [ + "111111100100001110100111100111000010011110110011001111111", + "100000101011001110100000010101100000101110001001001000001", + "101110101010111110101011011000111011010111110111001011101", + "101110100110011110101011000111110000110100011001001011101", + "101110100001100111011110101111111000001100100001001011101", + "100000100100000000011110011000111110000010001010001000001", + "111111101010101010101010101010101010101010101010101111111", + "000000000000010000111101001000100111001001011110100000000", + "011101100001011110010110101111101001100101010001000000110", + "101001011110001000100111001011100010000110110010100000100", + "010000101010101101000000110111100000111110001000011000010", + "110100010001011010000010001000111010001111100100001000011", + "011101111100011001101010010110110001001100000110101001111", + "000001001011100011111110100110101001110100111100110000111", + "010110110010000111011010110100100111110010010000110000110", + "000010001111111111010011100101010011100100100011000001010", + "111100100110001101001001111010110011011110010010011001001", + "010110001100111001110001111010000101010000011100010110010", + "110000100111010000101100011100111100110011111101110101111", + "011001001010010011011110010010111001010100111001010101000", + "101010101010110101011011000011101111111010110110011011001", + "111111000110001000010111001000110100011001010101011000100", + "101110101001000110000000001101010100101001001101101000001", + "010110011001011101100001110010111011010011110101110010010", + "000001101011100110101001110110110000110010011111110011100", + "111101010111110100110001100001110000001010100111001010001", + "000111111001011100001100001111101110000100001011111111101", + "110110001111111010101010001000101010111100110100100011101", + "110010101001110110000000001010111010100110001101101010110", + "001010001001001110101011111000101100101000000010100010010", + "000011111001111010100101111111101101000011100000111111111", + "001110001011011111111010110001100000001100101110111111000", + "111110111010111000111101000000100110000010101000001111001", + "010101000111110000011100000101111101100001001011001101010", + "011100111100000111001111011101010101011001010000110101101", + "001111000000001100100100101111111100001010010010010011100", + "011100101101111010000101101101110111001011100000011100100", + "010000010011110101100000110011010111110011011001000111001", + "111110111001101100010011001011111011110101010110101001001", + "100011010101010010110111000100101101111001000100100010101", + "010001100101000010100110111101111101000001110101101100010", + "011011001000000011000011110111001011001111111010000011100", + "001001101111101001110010010000111000100100111000110000000", + "001100011101110110001110001000101110001001001001100000111", + "001110101101001011110011101011011000000101001111001010010", + "100101011010011010101100001000111011100110101101001010100", + "101001111010111100001011011000100001011110010010110010010", + "111110011001111100100001010000000010001111100010010100011", + "000000100100111101001111001111100001001100000000111111111", + "000000001001001111111111111000111001110100111000100010111", + "111111100001000111000000011010110111110010010110101010110", + "100000101000001011100111101000110011100100100010100011010", + "101110100110010000101011101111101011011110010011111111001", + "101110101100110100011100011010100101010000011100010001110", + "101110101111010001100010010001100100110011111101010000000", + "100000101010111101111101010001001111010101011001101110101", + "111111100011111001100100110001101001111011010111100010000" + ] + }, + "11": { + "0": [ + "1111111000110111101010100000101101011000001101011101101111111", + "1000001000001100100011100111111000001101011000001001101000001", + "1011101010100010011100111010101100101111010000101111101011101", + "1011101010110100000010000110011001110010100111110110101011101", + "1011101010010111001001000001111110100111110010100011001011101", + "1000001010010100000110001111100011010000101111010010001000001", + "1111111010101010101010101010101010101010101010101010101111111", + "0000000011100101000101001010100010111110010100111110100000000", + "1011111000100001010010011111111111101011000001101010001111100", + "0011000100000101111110011001001000111110010100111111001100111", + "1111001000000100100011110001011111001001001001001000011001101", + "1010000100110011111010110100101010111110010100111111010010111", + "0001011000110100000010000001111111101011000001101011000101001", + "0100000110010111001001000100110100111110010100111110110011001", + "1011011100010100000110001110000001001001001001001001101110010", + "1000000111100101000101001011010101011000001101011000101101000", + "0111111100100001010010011110001000001101011000001100011000010", + "0011110100000101111110011001001001011000001101011001001101010", + "1011001010100010111011110000011110001101011000001100011000111", + "1010000100110001111010010101001010101111010000101111010000010", + "0101011000100011001101001000011111110010100111110010000111111", + "0100000110111000101011101101010000100111110010100111010011001", + "1011011101110101010001101000000111010000101111010000001110010", + "1000000111100110010000110101010011011000001101011001001101000", + "0101111101000101010101111000001110001101011000001100011000010", + "0010110101010001010010001101010001011000001101011001001100111", + "1000001011111011010100011001000110001101011000001100000001101", + "1001010000111001100001001100110011001001001001001001010000111", + "0111111111001000010101001001111110010100111110010101111111001", + "0111100011111011100111110100100011000001101011000001100011001", + "1011101011111100110011100110101010010100111110010100101010010", + "0010100011100111010110110010100011001001001001001000100011000", + "1011111111000101010101111110111110010100111110010101111110010", + "0100010001010001010010001001001111000001101011000000100110111", + "0100101101111011010100011001110100010100111110010100110011101", + "1100110000111001100001001101000000101111010000101111001110111", + "0111001111001000010101001001010101110010100111110011101011001", + "1011100111111011100111110101101000100111110010100111011101101", + "1011111101011000111011100110001001010000101111010001001011001", + "1110010000100111010110110010111111011000001101011001111110001", + "0011001101110011001001101110001010001101011000001100010001101", + "0100100100011001111111110001111111011000001101011000100110111", + "0100011011101011000110100110010100001101011000001100010011101", + "1100000100001101110011010010100000101111010000101111101110111", + "0111001110010001011000011110010101110010100111110010001101001", + "1011100110111001100110101001101000100111110010100110111001001", + "1000111101001111011111011110001101010000101111010000001100010", + "1110010001101011100111001010111000111110010100111111111001000", + "0001001100100010111100001110101101101011000001101010001000010", + "0100100101001011011100110001011000111110010100111110111110111", + "0011111011100011000110100001101101001001001001001000101011101", + "1110100100011101010111010101011000111110010100111111001110111", + "1111001010010001011000011001111111101011000001101011111111001", + "0000000010111001100110101101100010111110010100111110100011001", + "1111111001001111011111011111101011001001001001001001101010010", + "1000001011101011100111001010100011011000001101011001100011000", + "1011101010100010111100011110111110001101011000001101111110010", + "1011101011001011011100101001101101011000001101011001001101001", + "1011101010000001001111111000111000001101011000001100111000001", + "1000001001011001001111101100001000101111010000101111101100001", + "1111111011101010001011011001011111110010100111110010111001111" + ], + "1": [ + "1111111000010000111000001000110100100000001100100001101111111", + "1000001011010111110101011001100001010101011001010101101000001", + "1011101000011010100000001100110101011110010001001011101011101", + "1011101010001110010001001000001000001011000110010010101011101", + "1011101001001001001110010101111111011110010011000011001011101", + "1000001010010000001010100111100010001001001110010110001000001", + "1111111010101010101010101010101010101010101010101010101111111", + "0000000000100101011111110010100011001001010100111001000000000", + "1111101110101001001000111111111110010100100001101101010101010", + "0110000000001100111111001001001101000001110100111000101100100", + "0110001000000111101011011110011000010100101001001101101001111", + "1001100010001010111110001011001100101110001101001110110100110", + "1100101101111110001101001110011001110011011000010010000001001", + "1111100100110001011000010001010000100110001101000111010101011", + "1010011100000000010100100001000111010001011000010000001000001", + "0100100111110101000001110100110011011111010001011001001001011", + "0101001111101000010000101001101110001010100110001101011110001", + "0101010111101101001111010100110101011111110011011000101010101", + "0100101101100100001010100110000000001000101110001101111111110", + "0001010100101101011111110011010100101001001100111110110100100", + "1000111101110011001100111110001001110100111001101011000001010", + "0011110000001010111001001001001000100001101100111110110101111", + "1100111010011111110101011001011111010100111001001001101001001", + "0101000011100000100000001100101010111110001001001110110010011", + "0001011101111010010101001001111111101011011110010010000001101", + "0101000111100011001000010100110000111110001011000111010101010", + "0000001010100110010100100001000111001001011110010000001000011", + "1001010101010011000001110100110011011001010000111001001001010", + "0101111110010111010000111001111110001100100111101101111110011", + "1110100010101100101111001100100011011001110010111001100010101", + "1111101011010111101011011110101010001100101111001100101011110", + "0110100011111000111110001010100010101000001100101110100010100", + "0010111110011011001101011110111111110101011001110011111111010", + "0101110101000010111000001001001110100000001100100110111111011", + "1111111001000001110101011001101101010101011001010000101010001", + "1000110010110100100000001101011001011110010001001001011111011", + "1010111011100110010001001001001100001011000110010101110100001", + "1110010000010111001110010101111001011110010011000001000001001", + "1010011111000110001010100110001000001001001110010101110100010", + "1011000011110001011111110010111111001001010100111001001000000", + "0110001100000001001000111110101010010100100001101101101001110", + "1001000101011110111111001001011111000001110100111001011110101", + "0011001001010111101011011111110100010100101001001101001011101", + "1100010100010010111110001011000000101110001101001111111110101", + "1010101101010100001101001111110101110011011000010010001011001", + "1010000111100001011000010001001000100110001101000110111101011", + "1011101111100110010100100001101101010001011000010000101010001", + "1011010100100001000001110101011001011111010001011001011111011", + "0100001101100000010000101001001100001010100110001101110100001", + "1001000100111111001111010101111001011111110011011001000000101", + "0011111001110100001010100110010000001000101110001101010101110", + "1110100100110111011111110010100110101001001100111111101000100", + "1111001110000011001100111110111111110100111001101010111111010", + "0000000010110110111001001000100010100001101100111111100010111", + "1111111011101011110101011001101011010100111001001000101011101", + "1000001000101110100000001101100010111110001001001110100010011", + "1011101011110000010101001001111111101011011110010010111111101", + "1011101010101111001000010100010010111110001011000111001001001", + "1011101010110110010100100001001111001001011110010000111110001", + "1000001010100011000001110101010101011001010000111001101011001", + "1111111011110001010000111000100000001100100111101100111110011" + ], + "2": [ + "1111111001001011011011100011101001101000101010011001101111111", + "1000001010101001100000101101010011011010111110101101101000001", + "1011101001100110010100000101011100011111001000010111101011101", + "1011101001000001011001010111001110101011111111001110101011101", + "1011101001011001101100000011111111111110110101100111001011101", + "1000001010110000111110010100100010110101101000010110001000001", + "1111111010101010101010101010101010101010101010101010101111111", + "0000000011110110101010011111100010100010110100000000000000000", + "0000111100110010111011010001111110010101111110101011001100010", + "1111110011000011111011100111100001101000101011111110001010011", + "0010011100111111011110010111110010100101000001110100100000110", + "1001100100011110110100100100011110010001010000010111101101100", + "1101111011011110100110101101100111011010011000110101000111001", + "1000110111111001001101000000010001111000101101100000010010001", + "0010001111001111100000001011001101011100000111101000110000110", + "1011010101010111001010111111000100110000110101100001110101110", + "1110101011010010011010110001111000011011111111001011011111001", + "1010110110000011111011000111110001111110101010011110001011111", + "0000011110111110101110110111101010111001000000110100100001010", + "0100100100011111000011100100000110011001010000010111101010000", + "1101111101011110101011001101111111000010011000110100100010001", + "1100110111111001110011000000011001101110101101100001010000001", + "1010001011001110101111101011001101000000000111101000110000101", + "1111010001010111100011111111000100101001010001100001110101111", + "1010101001010010001010110001100001101000111001001011011111010", + "0110110110000011111101100111110000000011101100011110001011111", + "0000011100111110101010110111101010110000000110110100100001010", + "0100100100011111000111100100010110001111001000010111101000000", + "1101111111011110101011011101111111011010100000110100111110001", + "1100100011111001111011011001100010001101110101100000100010001", + "1010101011001100110011100011101011110110010111101000101010101", + "1111100011010001101001110111100010001000110001100110100011111", + "1010111111010000000100111000111111001000111001001100111111010", + "0110110100000111101011111111001110000010101100011011100001111", + "0000001110111000111100100110000111110001100110110010001011010", + "0100000100011101000101110100001101101110101000000111110110000", + "1101101111000010101011001101011011011010000000101100101010001", + "1100100001101001101011010000100000101101010101111000011110001", + "1010001001001000110011110110001110010111110111110001110100101", + "1111010101010101101001101010101110101001110101100111000001111", + "1010011011000010000100111110001000101001111111001101010111010", + "0110110100001001101011100001001010100010101010011001100001111", + "0000001110001000111100111110000110110000000000110000001011010", + "0100000100010011000101101010001111101110101001111111110110000", + "1110001110011010101011010101111001011010000001011100100010001", + "1110000000101111101011001110100010101101010100000000001111001", + "1000101001001100110011100110001100010111110111101001100100001", + "1100100100011001101001101011101110101001110101100001011000111", + "1010011011000011000100111101101010101001111111001011010111110", + "0110010100011100001011100110101010100010101010011111100001101", + "0011111111010001111100011110000100110000000000110100001011001", + "1110100100000010100101101101101011101110101001110111110110011", + "1111001111001011001011110111111111011010000001010100111110010", + "0000000010011110001011101001100010101101010100000001100011101", + "1111111010111101110011100110101010010111110110101001101011001", + "1000001010010000101001101011100010111011101101100001100010011", + "1011101010100011100100111101111110110011100111001010111110010", + "1011101001011101101010100010111100100100110010011110010011101", + "1011101000110000011101111110111100110010010000110100011001010", + "1000001001100011100101101101101111111000110000010111001100010", + "1111111001101010001100110110010101010100011000110101101110011" + ], + "3": [ + "1111111001001110000100001101110110100111110011011001101111111", + "1000001010101111100001011101111010001011110101010101101000001", + "1011101011001101100000001011010010110100100000110111101011101", + "1011101001001010110010000011010000001100111000001010101011101", + "1011101000000101011101000111111110000010110110000011001011101", + "1000001000010111010101010010100011100001010101100010001000001", + "1111111010101010101010101010101010101010101010101010101111111", + "0000000001111111011110011101100010010100010010010010000000000", + "0111011000111101010000110111111111011111010011111001100000110", + "1110010111010000000101001101010011100111101011000001010010111", + "0000101110010111101011111100011111101011100101001111010100110", + "0000000010111101100100101011010001000100100100110010100101010", + "0000111010101011110101000111110110010100111110001010011111001", + "0100000100101101100110000110001111111010110000000100010000000", + "0101011000100111000101010100101010111001010011100101110011100", + "0001010000001101011001000100011100111001001001001001010001011", + "1111001101101011110110010000101001010111100101001110111101010", + "0010100111011101011000101111010111010100000110101101111111010", + "1010011011001101001000101111001101001100111110010101101111101", + "0110100110001010000011101101101111110010010011110101110011100", + "1001011111000100000001000010010011111001010010011111110010100", + "0111100101110111010001000101000100100001101010100111001010011", + "0101011010010011110001110010001100001111100100001011000101110", + "1000110001100111110111111001100001010101100100100100100111110", + "1000011010100110101000001011110011001101011110010101011100101", + "0100010001100001101110011001100000000011010000011011100011110", + "0011111101010100111111000000000111100000110011111110001110000", + "0101110100011011000000110101010101011001010000101110101000101", + "0010111111011100110001101011111110010111111100101001111110010", + "0010100010010110101010110110100011110100011111001010100011010", + "1110101011011000101110110101101011101100101111010001101011101", + "1101100011000001000101011000100011100011010111110100100011100", + "0110111111001010101101100100111110100000110100011111111110100", + "1110110011011010000101000110011101011000001100100111011110101", + "1001111110000111101000111110111001010110000010001010010000101", + "0110100101110000101101101110111110110011111101000010010011001", + "1110011100100111001011000001001101001011000111110010001101010", + "1000000000000101011101011101001111000101001001111101100011100", + "1110001110110011000011000000000110000100100010111101100000000", + "0111100000000111011111100011000011111000010100111111111000111", + "0100101001111010011111110010011110010110011010110001010010010", + "0011110010101101101010001011100000110101111001010011010010100", + "0010111101101100101100100111101100001101001001001000001010010", + "0000000100001110000010111010011011000101001111110010100100011", + "0011011111101010001001001111100100100110101100011001100001111", + "0011010111110110011111100001101100111110010100100000111000101", + "1000101110011101111111110000010010010010010010001111010110101", + "1010110010101011101100001111101111100011111001010010010101001", + "1100111010100001001100100010101011010011000001101010010101010", + "0101000100011011111100111100110001111101001111100101111010010", + "0011111000000010101001001010000010111100100100100101111001111", + "1110100111010100000000111001100100011110010101011000101001000", + "1111001101011000010101111000111110010000011011010110111111001", + "0000000010011000101110001100100011010011111000110100100010100", + "1111111001000001000110000011101011001001001000001100101010110", + "1000001010011011111001000001100011110100001111100011100011011", + "1011101001010000100110001110111111011111001100000001111110011", + "1011101011011100100011100111101110000111110100111001001101001", + "1011101010010010001111111100110101101011110010010011100011010", + "1000001010000101100001010011110100000011100000110100000000100", + "1111111000011101001010111010011011110011011000001100111000011" + ] + }, + "12": { + "0": [ + "11111110100110110010011000001011001001111100101001111001001111111", + "10000010111110110101001100101000100010111101000010111000101000001", + "10111010000110001111001010010000010100111110010100111010101011101", + "10111010100110011010011000010110011010110000011010110011001011101", + "10111010010000000100101111111111111001010011111001010000101011101", + "10000010000010111000110001000010001001001001001001001010001000001", + "11111110101010101010101010101010101010101010101010101010101111111", + "00000000100011100000101111111110001001010011111001010010100000000", + "10110111000100100101010011001111111001101011000001101011001001011", + "00100100110111010000011001001011001111100101001111100101110110000", + "01011011110110010101000100101000100100100100100100100100010101100", + "10011101111110001101011010010001010100111110010100111110101001011", + "01110010110111011110011000010111111010110000011010110001000101010", + "10010101101000100110110111111100011001010011111001010010110111010", + "11110110010010011110101001000100101001001001001001001000000111101", + "10001000010100110110011001001010001111100101001111100100010011100", + "00000110001110000010001100100001001100000110101100000111110010100", + "00110101011010011010100110010001110100111110010100111111001010011", + "01100010100001100001000100011111110010010010010010010011000101110", + "11111100101101110101000001111100111001010011111001010010100101110", + "00101011100101100100001011001100100001101011000001101010011110101", + "00101100010010010110000011001010101111100101001111100100010001100", + "01010110010011011111010100101001000100100100100100100101110010000", + "11010001000110011000001000010001010100111110010100111111001000111", + "00100010111100100111010100010111111010110000011010110001000100010", + "01111000100010110001010011111100011001010011111001010010100111010", + "11011011111000100011011111000100101001001001001001001000011111101", + "11011000011011011011110101001010001111100101001111100100010011100", + "10010110001000001001100000100001001100000110101100000111110010100", + "01100101001101001100011000010111110100111110010100111111001010101", + "00011111100111110001000000011111111010010010010010010011111110110", + "01111000101001100100000101111110001000110101100000110100100011000", + "11001010100101100100001101011110101000001101011000001101101011001", + "10111000110110010111000011010110001110000011010110000010100011100", + "10111111110001000111110111010111111101100000110101100001111110000", + "00111001100100001001101001101100101001001001001001001001011110111", + "00111010011110111111010111100100001101001111100101001110110010010", + "00100100000000100001110100100001001110101100000110101100110011000", + "11000111000101001110001010111011110110010100111110010001001011110", + "11000000101110010010100010110111110010010010010010010011100101111", + "10001010111000101111101001010010100011111001010011111000100110111", + "01000101110101101010011001001100111011000001101011000000111100101", + "00011011110110010001001000000000110101001111100101001111110010101", + "01111100110000000100000101100001010100100100100100100100110111001", + "11100010000101100010011101011111001110010100111110010101110001010", + "10010001100110110011011011010111100000011010110000011010011100010", + "11100111110000100111100111110110000011111001010011111000111111111", + "00011100110101001111111000001100111001001001001001001001101111000", + "00111111111110001110001011100101010101001111100101001111001111001", + "11100101101000001000110010100000110110101100000110101101001100100", + "11000111100110000001011110111010001110010100111110010100011100110", + "00000100110100001100110011110110000010010010010010010010111011011", + "01000010101110010101100011110011100011111001010011111001111000011", + "00001001101100010111100101101101011011000001101011000000100001001", + "00110110011101010010100111100001010101001111100101001111001111001", + "10010000000110101010100111000000110100100100100100100100000100101", + "01101011000011100001101000011111111110010100111110010100111110010", + "00000000110001001100011000110110001000011010110000011010100010010", + "11111110101101111101110001010110101011111001010011111001101011111", + "10000010101101000111101010101110001001001001001001001000100011000", + "10111010011110101010110001000111111101001111100101001111111111001", + "10111010100111100010101000000101100110101100000110101100111000100", + "10111010100000010001011110111111011110010100111110010100100000001", + "10000010010110010101010101110001010011110100001011110100101110010", + "11111110101000011100000111100010110010011111001010011111000101110" + ], + "1": [ + "11111110110101000110000011010100101001111100101001111101001111111", + "10000010001100101011111001010101000010111101000010111100101000001", + "10111010101010101011000001101111010100111110010100111110101011101", + "10111010110111101101001111100001111010110000011010110111001011101", + "10111010100101100100100100100011111001010011111001010100101011101", + "10000010001010111110010100111110001001001001001001001010001000001", + "11111110101010101010101010101010101010101010101010101010101111111", + "00000000011000111110101100000110001001010011111001010011000000000", + "11110010110001010110010100111011111001101011000001101011010011101", + "10111000100100000010010010010100101111100101001111100101101000000", + "10011010101000101011111001010111000100100100100100100100000011100", + "01101000100000001011000001101110010100111110010100111110110101011", + "00001110010100110101001111100010011010110000011010110001011011010", + "10010101111010100100100100100101111001010011111001010010111001001", + "00010011010000010110010100111101001001001001001001001000001001111", + "00111000000001111000011010110011001110000011010110000010001111101", + "11110011110001110010111101000000101101100000110101100001101100100", + "10111000110010111000101111010000010101011000001101011001010101111", + "11000110000101000010110000011110010011010110000011010111010010010", + "11000001001000001001010011111101100100100100100100100100111101110", + "01001011001110111001001001001101011110010100111110010100000001101", + "11010000110001010111100101001011010000011010110000011010001111110", + "11001110011000110100000110101000110011111001010011111001100100011", + "10011100101001101100111110010000001001001001001001001001001100100", + "01101010100100010010010010010110000101001111100101001111000010001", + "01101000100110011001010011111101100110101100000110101100100001000", + "01110011001000000001101011000101011110010100111110010100011001110", + "10110101011001001111100101001010010010010010010010010010010011111", + "11111110001000000100100100100001010011111001010011111000110010111", + "10110000111000110100111110010111101011000001101011000000101011010", + "00101111111011011010110000011111111101001111100101001110111111000", + "11011000100011111001010011111110001101000010111101000011100010111", + "00001010110000011000001101011110101111110010100111110010101010011", + "10011000101101010110000011010110001001111100101001111101100010010", + "01101111100101010011111001010111111010111101000010111100111111111", + "01100101001101001011000001101100111100111110010100111111111110000", + "01000011000100100101001111100100010010110000011010110001010010101", + "00011001010000000100100100100001010001010011111001010011010010110", + "10001011111111111110010100111011101001001001001001001000001010001", + "10011000001000110000011010110111100111100101001111100100100100000", + "00100011011000010011111001010010111100000110101100000111100111100", + "00100101111111101001001001001100100100111110010100111110111001011", + "01100010100010100101001111100000101010010010010010010011010111010", + "11101000010101100110101100000001000001010011111001010010010100110", + "01111010100000111110010100111111010001101011000001101010010000001", + "10100000111000010010010010010111111111100101001111100101111101110", + "10100111001100010011111001010110011100100100100100100101011110000", + "01011001010000101011000001101000101101011000001101011001001110101", + "11110011010001110100001011110011001011010110000011010110101110010", + "10001000011001011101000010111110101000110101100000110100101101010", + "11101011111010100001101011000000010000001101011000001101110101101", + "01011101011000101111100101001000010010010010010010010010010011000", + "10011010010000100100100100100101111011111001010011111000011000000", + "11111101011100010100111110010011000011000001101011000001000000101", + "00110111111101111010110000011011001101001111100101001110101110101", + "10010000101000111001010011111110100100100100100100100100100101001", + "01101010100111001001001001001011111110010100111110010101111111010", + "00000000101011001111100101001010001000011010110000011011100011110", + "11111110000000001100000110101010101011111001010011111000101010011", + "10000010001001110100111110010010001001001001001001001001100010100", + "10111010010000110010010010010011111101001111100101001110111110001", + "10111010101011111001010011111001100110101100000110101101111110100", + "10111010110110100001101011000001011110010100111110010101000100001", + "10000010110000101111100101001111010011110100001011110101001000010", + "11111110111110010101100000110100110010011111001010011110100011110" + ], + "2": [ + "11111110001111110001111100001101001111010001010111111001001111111", + "10000010000010111110011111000010100110010000010100111000101000001", + "10111010000001101011001110000000110010010010001101001010101011101", + "10111010000100011101001001100111101000001111000011001011001011101", + "10111010100001001001001010001011111011100110100000101100101011101", + "10000010010111010001100000101110001101000101111000010110001000001", + "11111110101010101010101010101010101010101010101010101010101111111", + "00000000100101000110010010100010001101110111111001000010100000000", + "00110011111111000111010011101111111111001101000001110011011010000", + "11010101011111111001010100101011000111010001001111111101110110000", + "01011111100010111001101111000000110110100000100100111100010101100", + "10110100000001101010100111000111011010010011001101001110101101011", + "10110011100100011000011000100100101000001111100011001001000011010", + "00111000100001001111100000001101001011100110000000101000100000110", + "10110010010111110000000000101101110101000100111000010010011000001", + "00001100010011010111111100010100100001000001001110010100001110000", + "01110110110010001110101110011011111000100000101101111111101101100", + "11000100000100100000001101100001000100001010010101000111010101001", + "01101011110101101011011011100110101110010110010010001011010011010", + "10011001110100000001001010101011010111101110111000100010100000100", + "00101010111111000011000011110110010101010100100000010010011000001", + "00001100011111111011010110111110111111010000101110011100010110000", + "11011111111011011101101101010110111000110001000101111101110101100", + "11010101011001101100100111000001111010000001010101001111010101011", + "11000010000110011000011000101111001110001001111011001001011011010", + "10001001111001001101100000001010101001100000011000101010111000100", + "10100010110100110000000000111011110101011110101000010000001000010", + "00011100100010110111111100011111100000111001001110011100011110011", + "01110111010000101110101110011101111001011100101101100111100101111", + "11100100010010110000001101100101100100001000010101011111011100111", + "01111111101101111011011011000111111110100100010011010011111110110", + "10101000110000000001001010001110001110001100111100100010100011010", + "00011010111001010011000010110010101101010010100110010011101011001", + "00111000101111100010010110111010001110010110101000011100100010010", + "11001111111011001101001100010111111000010011000011111101111111111", + "11000001111111101101101110100111010011100010010101011111000001000", + "11001110100110011001111001101101000111101010011011010000101001001", + "10000101011111000100000011001100011001100101111000110010101001000", + "00100110010110111011100110011010000101111111001000001001110111110", + "11011000100110101101100100111111001110111101001010010100010011111", + "01111110010100111000001011011111110100111000101011111110011000111", + "01100100110100111100101111111001101001001010010011000111000000001", + "11111111001100111011011110101101001110100100010101001010001111101", + "00101000010010100101100011011101101111100001111100110101000101101", + "01011011111000100000100010101100001010010111000110001101110000110", + "00111001101101010110110101111100110001010011001000000010011101110", + "01001111100111110110001100001111101001111100100011100000011110011", + "00001001111001010110111011010010011111100100010000111111001110100", + "11111010111011111110111100000111000100011100011100110000101110001", + "00001001001011001001000011101010000011111101111111010010101101000", + "00010110001011100000000101100010010010000001001111001001010101110", + "10001100110010001011000101010001011000110111010010000010110011111", + "00100110011101001101010110100001100110110010110011100001111100111", + "11100000111110000100111111100111101010010000001011011000100110101", + "00110111010001011110001010111001011111011010000101010111101000101", + "10010000010100111001000111111111110010001001111101010010100011001", + "01101011100000100100110011011011111111000111000111101011111111010", + "00000000111101111111101010111110001101001011001001100111100011110", + "11111110100110001010111000001010101111101100100010100110101010011", + "10000010001000010010101010001110001101101100001000111001100010100", + "10111010001011011001101000000111111110000100000100110110111110001", + "10111010110011001111011100011001101101111101100111010100111101000", + "10111010110011000111010101110001100010000001011111001100100111101", + "10000010010010101001110001010101010110110111010011100010101001110", + "11111110010101001111011110110011111000100010110010000001000010110" + ], + "3": [ + "11111110010011110011101011100001011100000100110111111101001111111", + "10000010111000010001011011001100111001100101010100111100101000001", + "10111010101010100111011111110001010011011110010001011110101011101", + "10111010010011010111001101001110100011010000011101010111001011101", + "10111010000000110001110011010011111000110011111110110100101011101", + "10000010010111010000110111000010001110001001001110001010001000001", + "11111110101010101010101010101010101010101010101010101010101111111", + "00000000000010001011111111011110001010110010100001010101000000000", + "01110110001000110111001111011011111010001010111001101101000000110", + "10001000110001110011101100011001010100000100110111100011101000000", + "10010011111100010001011010010000101001100101010100100000000011100", + "01100101001011100111011010110110011011001110001001011110100101011", + "11100011010011110110001100000011001011001000000101010000010011010", + "11111100100001110000010010000011101000101011100110110011010001010", + "11001010110111110110110111001101110110010001011110001001100001101", + "01111000110100111000101001111110000001100100010011100011101011100", + "00100011100101011100100100111110011110000111010010000000101010100", + "10010001100010001111110011011011000100111111101010111000110011011", + "10100111001010100101101010100110111010010011100100010110110101010", + "00000100100110001110010101010010011110100011100101000011011000110", + "11110110010000101101010011011000100010010011011111101011100000001", + "01001100010111000100100000110101100110011101010001100101001111110", + "00100111011010110011011100100001100101111100110010100100000100000", + "01101001001111000011101110100101010010111000001000111000110000101", + "00010110010010110110011110001000111000110110000100110110011100010", + "11111000001111010010111100110110110001010101100111010101011110110", + "01111110110001111110101011111101101001001101011111001101101110001", + "10110000010000011001000101100100101110010101010011110101101110000", + "10000010111110100001101110110101001001111110110010011111101101100", + "10010101101011111111101011101110111011000110001010100101010100101", + "10111111101110000100010010010011111011001010000100001001111110101", + "11111000100110101101110010101010001001000101111101010100100011001", + "01101010101011101011100101110010101011110101000111101101101011010", + "11001000111001101011010010100110001001111011001001100010100011000", + "00001111111000000011000110110011111110111000100010100000111111000", + "01011100101011010000111111111000001110101110001100101001101000011", + "10110010001000011011011001010100001100101000000010101111010111110", + "11110000100110001100000111111000011111001011100001001101010101000", + "01100111110101000111001001000011010011010001011001010100101101110", + "01000101100000000011001100110010111110010011001010000010000011111", + "00110011010100010110001001100100001111111000101011100000011000111", + "00111001011000100000010000010100110011000000010011011001000000111", + "10100110111100100101101000011001111001001110010101010110001110110", + "00110001011000111101010010000101110011000100100001000100000101010", + "01011111000001000000011010001001110111110100111001110100001101001", + "01100000000010111010101111001110001001111010110111111011100011110", + "00101011101000101010100101001111011110111001010100111001000000011", + "10011100110110011000010110001000100101001000010001001111011000100", + "10000111011010000000111001000010111001001110011101001000101000001", + "01110100010000001101111001100000111110101101111110101010101001000", + "01001110100000111110110000011010100010010101001110010001110111110", + "10000100001010101011100101111011100101100010001111110010010011111", + "00110010101100101100010111011000011010000001001100011000000000111", + "10111001011000100001010101001001010010111001110100100001011001001", + "00110111010111111101110011100101101000010111110010001110110111001", + "10010001011010010111111011101001001010100101111000100010110100101", + "01101010000001011001100010000011111010010101000000010011111110010", + "00000000100111111100001111000010001100011011001110011101100011110", + "11111110011101010111011101101010101001111000100101111100101010011", + "10000010111001110010011110101010001110111001010101000001100010100", + "10111010010010010000100011101011111001110111111011010110111110001", + "10111010100101001100111010100010001011110100011000110101100100100", + "10111010101101000010101110111000110101001100101000001101011110001", + "10000010101100011001001111011000111101010100001110010101000000010", + "11111110001101100111000001101001010111011111001101111110101011110" + ] + }, + "13": { + "0": [ + "111111100110110010001000010101100100111111001010011111001111101111111", + "100000100011100110000011111001010001000010111101000010111000001000001", + "101110101101101000111100101100000100000000110101100000110110001011101", + "101110101000101100000000011101000001010101100000110101100100101011101", + "101110101100001110101111100010111111100000110101100000110110101011101", + "100000101110100001000100100110111000110101100000110101100010001000001", + "111111101010101010101010101010101010101010101010101010101010101111111", + "000000001010000000101001010011101000111101000010111101000010100000000", + "101111100110000100000111100000111111101010011111001010011110101111100", + "000010001100101000011000010101111011111111001010011111001011011110100", + "001011111101100000001011101001010110100010111101000010111100000011111", + "101010000001101110110100111100000011100000110101100000110101000000101", + "100000110110101000000000000101010100110101100000110101100001110101111", + "110100001000001010110111110010100100100000110101100000110100100001010", + "010101101110100001011010101110100001010101100000110101100001110100000", + "011111011010000010100011010011111100011101000010111101000100111101010", + "111111101010000100001011010000101001001010011111001010011000101010100", + "000010001010101000010001111101111011111111001010011111001101011110100", + "011010110101100000010000001001010110100010111101000010111110000011111", + "011010001001101110100011110100000011100000110101100000110101000000101", + "100000101110101000001010101101010100110101100000110101100001110101111", + "000100010000001010110000000010100100100000110101100000110100110001110", + "100101110110100001110101001110100001010101100000110101100001101101000", + "111111011010000011000111110011111100011101000010111101000010111101110", + "111111101010000100001111110000101001001010011111001010011110101011000", + "010010001010101000010000011101111011111111001010011111001011011110100", + "001010110101100000010111101001010110100010111101000010111100000011111", + "001010001001101111000000110100000011100000110101100000110101000000101", + "111000101111001000001100001101010100110101100000110101100000010101111", + "111000010001001010010111000010100100100000110101100000110101100001000", + "011101110111100000010100001110100001010101100000110101100000010100000", + "111011011010110010100111010011111100011101000010111101000011011111000", + "001111111011001101001111110000101111101010011111001010011110111110100", + "010010001011100001110000011101111000111111001010011111001010100010100", + "000110101100101000010111101001011010100010111101000010111101101011111", + "000110001001110111000000110100011000100000110101100000110101100010101", + "111011111111101001001100001101011111110101100000110101100000111111111", + "111111001000110000010111000010100001000000110101100000110101001001010", + "010110101111001010010100001110101011110101100000110101100001011100000", + "110010010001011110100111010011100110111101000010111101000010100111010", + "000110101011010001001111110000100011101010011111001010011110000000100", + "011100001111001101110000011101101100111111001010011111001010110100100", + "000000110000110000010111111001010100100010111101000010111100100001111", + "001001010110100101000000100100011001000000110101100000110100010100101", + "111000111111101111000100011101011100010101100000110101100001111101111", + "111110001010101100011111011010100001000000110101100000110101001011010", + "010111101011001010010100011110101011110101100000110101100001011110000", + "110011010001011000111111000011100110111101000010111101000010100011010", + "000110110011010001001111101000100011101010011111001010011110000000100", + "011111010001001001101000011101101100111111001010011111001010110100100", + "000000111110110110010111100001010100100010111101000010111100100001111", + "001000011110100111001010100100011001000000110101100000110100010100101", + "111001101001101111010101100101011100010101100000110101100001111101111", + "111100011010101100000010101010100001000000110101100000110101001011010", + "100110100011001010011001111110101011110101100000110101100101011110000", + "100011011001011000110101011011100110111101000010111101000010100011010", + "000111110011010001010001011000100011101010011111001010011110000000100", + "001101011001001001111001111101101100111111001010011111001010110100100", + "101011110110110111000000100001010100100010111101000010111100100001011", + "100000011110100110111010100100011001000000110101100000110100010101101", + "100110111001101111010100000101011111110101100000110101100001111110011", + "000000001010101101000000101010111000100000110101100000110100100011010", + "111111100011001010111010111110101010110101100000110101100001101010000", + "100000101001011001010100111011101000111101000010111101000011100011010", + "101110101011110001010011011000101111101010011111001010011111111110100", + "101110101000001000011001011101110100011111001010011111001011111100100", + "101110101111111111100001000001000001000010111101000010111100101011100", + "100000100111110111011011000100000011100000110101100000110101110110100", + "111111101000111110110100000101011110110101100000110101100000101011110" + ], + "1": [ + "111111100110010110111101010101100011100000110010011110110011101111111", + "100000101011010011001100000001010110110101100101000011100100001000001", + "101110100011011110011001010100000011111101010101100101000010001011101", + "101110101101011011010101100101000100101010000000110010011000101011101", + "101110100101001110100000110010111111111111010101100111001110101011101", + "100000101100001110110011111110111000100010100000110010111110001000001", + "111111101010101010101010101010101010101010101010101010101010101111111", + "000000000111111101100110101011101000111000100100111001010101000000000", + "111110111100001010100011111000111111101101111001001100000001110101010", + "110111000000010001111100100101111101111000101100011001010100111111010", + "100100100011000111001011100000100000100101111001000100100001100010000", + "011000001111011000011110110101111101100001010010100100110010100001010", + "000011111001101101010010100100101000110100000111010011100111110100100", + "101111011010110110100101010011111010100001010010000110110010100000000", + "011000101100110010110100011111010111010100100101010011100101110100111", + "011110010111110111100001001010000010011101000101100001000010100101101", + "000001111100111010110101111101010101001010011000110100011110110010011", + "110110001000001001100000100010100011111111001101100001001011000110101", + "100111101000101110110011111110100110100010111000110100111100010011110", + "101000001100100001100110101011111011100000100010111000110101011100111", + "101111111010100110100010111000101100110101111111001101100001101011100", + "100111011010101101111101000101111100100000101010011000110100111111010", + "010000101110110001001100000001010001010101111101000101100001100010000", + "010100010101010110011001010100000100000101010011100100100010100001010", + "001011101100111001010100100101010001010010000110110011111110110100100", + "111010001010001100100001010010100010100111010011100110101011000000100", + "001110110100110000110100011111010111010010100100110011111100010101111", + "100010010100101101100001001010000010011100100101111001000101011100101", + "011010110111101100100101111001010101001011111000101100011000101011111", + "111000000001101011111000100100100101111110101101111001001101011110110", + "111000101111111111001011100000100000100011111000100100111000000011100", + "000011000100001010011110110101111101100000110010111100110101011101110", + "001011111100001001000010100000101111110101100111001011100001111110000", + "001010001011001100111101010101111000100000110010011110110100100011011", + "101110101100110001001100000001011010110101100101000011100000101010010", + "100010001011101100011001010100011000111101010101100101000010100011011", + "101011111111000101010101100101011111101010000000110010011111111110110", + "110001011101001010100000110010100000111111010101100111001010101100100", + "111101101011111110110011111110101100100010100000110010111100111001111", + "001001001111101011100110101011100001011000100100111001010100000100101", + "001110110110001100100011111000100100001101111001001100000001100001111", + "001110010111001011111100100101101001011000101100011001010101010101010", + "000000100000100111001011100000110011100101111001000100100001000000000", + "100000001011111010011110110101111110100001010010100100110010110101010", + "111111100110011001010010100100110011110100000111010011100110011100100", + "001111000111010100100101010011101100100001010010000110110010101011000", + "101111100011101000110100011111010101110100100101010011100100011110011", + "000000011111100101100001001010011000111101000101100001000010100011101", + "111110110111110100110101111101011101101010011000110100011110000000011", + "101101011110011011100000100010100000111111001101100001001010110100100", + "110001111010110110110011111110101010100010111000110100111100100001100", + "000011000011111011100110101011100111000000100010111000110100010100100", + "101110111101110000100010111000100010010101111111001101100001100111100", + "101100011010110101111101000101101101000000101010011000110101010101010", + "101000110111001001001100000001010011110101111101000101100001000000000", + "001100011010100100011001010100011110100101010011100100100010110101010", + "111010110011110001010100100101011011110010000110110011111110011100100", + "100001011010011100100001010010100100100111010011100110101010101010100", + "101011111110110000110100011111001100110010100100110011111100111111111", + "100000000101101101100001001010000001011100100101111001000100000010101", + "100110100101011100100101111001001111101011111000101100011001111111111", + "000000001010010011111000100100111000111110101101111001001100100011010", + "111111101111001111001011100000101010100011111000100100111001101010000", + "100000100010000010011110110101101000100000110010111100110101100011110", + "101110101011100001000010100000101111110101100111001011100001111110000", + "101110101010110100111101010101110100000000110010011110110100100001000", + "101110101000110001001100000001000001010101100101000011100001010100000", + "100000101000000100011001010100000010111101010101100101000010000001000", + "111111101101101101010101100101011111001010000000110010011111010100110" + ], + "2": [ + "111111100100100111110101011100001011111111101010011111001111101111111", + "100000100100101001111011111110011010111100000000101111010100001000001", + "101110100100010010111101100001111010110000101011010110000010001011101", + "101110100110101101110111010101010100101111000000110101100100101011101", + "101110101101001011110111101100011111100011010000001101011010101011101", + "100000100111110010101101111110101000111011111110000011010110001000001", + "111111101010101010101010101010101010101010101010101010101010101111111", + "000000001011001001101011110100011000101101111111010000101111000000000", + "001100111110011011000100010100101111100100100001111100101000011010000", + "111111001000100010010101011100010100111111101010011111001011011111000", + "010001101100101111111001111110000011010100000000101111010001101111110", + "000010001100000010111011100001111100110000101101010110000011110111111", + "000101100100100011110001010101010001010111000110110101100001110100111", + "000010011101001111110101101100000110010011010110001101011001001101001", + "010110100111101100101011111110100001101011111010000011010111000010001", + "000000010110100010000100011001111100000001010010111101000010111100101", + "101100110100110000011101001111110001011110011010100111110011000111010", + "001001010110111100100111101010100110001000111100101001111101101001110", + "111100110001101011010100000011101000111001001101000010111100000010011", + "011001010111111001100000110010100011101010110110010101011000110100100", + "110111110011100101100111101011100101100001010000011011010111011010001", + "101011010000001011111000011001101001111110011011111000110100111000110", + "001101111101010110010000101101110100110000100001001000001100001000001", + "110101000001010101110010101111011000100111100010001011111100001010000", + "000011111001011100010000111010000010111011110001001010010110001011100", + "010110001101100110111100110001110101011011100001110010100110010010101", + "000110100111011101100010110101100110000111111111110100001010010100101", + "110100011010010101101101011110000110011111011101111001010100011001001", + "101111101000111110111110110101101110101010001101000001101100000001010", + "011101000110111100001100101110101111000000101011001111100010001110000", + "100010110000111011111101000111010001000101001000100100100001100101100", + "101000011010001110101111110001101011110100111001001010111111001001011", + "110111111111101010100110001110111111101101101111100010110001111111010", + "111010001000001011010001011010001000100111011100000001010010100011000", + "011110101100000110111101111100111010111101101100101001001001101011110", + "000010001100100011011111100000101000101000010011001111100100100011111", + "000011111101010011010110000000011111100111101000101100000111111110111", + "000111010101100111010100110111101111011010000000010100111111010111011", + "010110110110001101001011001111110000010010000110010010010010100001010", + "000111010111100011000011010110001010111101000000100001010010101010110", + "100001110100110001111100100101110011110101100100111001101011110100001", + "001100010110111101100111101100110111110001011000110111000100011011110", + "101111110001101011010001010000100111010000010101010100000100011000011", + "011011011111111000000101111011100010010101001110010100101111001000100", + "111111100011100101100001111110001110010011011110011010101000110010001", + "010110011000001010101001000010111011110111101011111001001010110010110", + "000001101101010110000000110101101111001111011011001001010001001010001", + "000101000001010101111100100000100010101111110001010110000010100100000", + "001100111001011100011001001001010001011100001110110101100001111001100", + "110111001101100110101100110110010010001010000010001101011100100000101", + "011001100101011101110111100001110000000100100100000011010001101110101", + "110110010000010101101000010111101110011000101011111101000010100101001", + "100100111100111100110010100100010100101000010101000111110011101111010", + "100000001000111010010111110111001101000001000101001001111100000110000", + "101100100010111001100101011000000010100010111110100010111100100011100", + "011110011100001110100111111111111001110100110010001101011001111101011", + "111010101111101110101111111111100111101010111000000011010111001111010", + "011010000110001011000000011011111111100111101111100000110101001101000", + "101011111110001000101100011010101011011111100111011000001100110101110", + "100000000110101001011111100001011000101010011100001011110100010011111", + "100110101001011001011110101001111111100001111001001010011110111110111", + "000000001011000111001101101100011000111100011111110010100110100011011", + "111111101100010011010011001110101010110010001001110100001010101011010", + "100000100000011111001011110010011000111111011111100000110100100010110", + "101110100101110101111100100100101111110101100011011000001101111110001", + "101110101001111101100110101101011111110001011001010110000010010110010", + "101110101001000100011001110111001011110010001010110101100001010101100", + "100000100011010011001100111010000111010001000111010000101111101101001", + "111111100000101111100000011111000011010111001111111100101001100011000" + ], + "3": [ + "111111100110101001010100101101000111000000110010000001001011101111111", + "100000101001100001010111101111100001011000001000111001010000001000001", + "101110101111001010100001101010111111101010000100010111110110001011101", + "101110100110011110101100100110111100101011100111010100011000101011101", + "101110100101000110010000100000101111110011011111101100100010101011101", + "100000100110110100100101110100111000110101010011100010001010001000001", + "111111101010101010101010101010101010101010101010101010101010101111111", + "000000000000001010011011110001101000110101001111001100101000100000000", + "011101100010100010101010010000001111111011001001100010101111000000110", + "000110010110101011110101101101001110011000101010000001001100100000110", + "111000101001100011110111001110110000001000010000111001010100011000001", + "001011001111000111000000001011010110010110000100010110010100010110000", + "000011111110010100001100100101101101110101100111010101111111110101100", + "001111001101000110010000000100000010101101011111101101000111001101011", + "111000101110110000100101010001101011000011010011100011001011000011010", + "101001001101110001110111011000100000011000100011100001000010100000110", + "010010101001111001101001001110100001100000010011011001110010011000001", + "010000001000011101001011011101111000101110011101010111111110010110010", + "000110100010000110010010101011011101100101111100110100111111110101100", + "000000010100011100010011010010001101001101001111010101001111010101001", + "000101101010100010110010001111011011000011001001111011001001011011010", + "100010000010101011111101111111101111000000101010011000101010111000110", + "100011110101101011111110000010111000011000010000101000010000001000001", + "011111011001000111001001111100001110101110010101010010011100010110000", + "110111100010010100000100011011011100011101111110110011100111110101100", + "000111010011000110010000100110111011000101000110001011011111001101001", + "111000110110110000100100011101110010001011001010000100010011000011001", + "100001000111110001111101111110100001011000100101111000100010111000101", + "011010101110111001101011110101010000111000010101000000010010000000010", + "011100011000111101001011101000101000001110011011001110011100001110000", + "001110110000000110010110101111110100110101111000100101111101100101100", + "001100001011011100010010000111000100110101001110010001011111000011011", + "000011111100100010110100101000101111100011001000011101010001111111010", + "101010001110001011111101001011001000111000101011111110110010100011000", + "100010101100101011011111010010011010111000010001001110001001101011110", + "010110001001000111101011011110001000101111110011001010010100100011111", + "110111111011010100000110001110001111110100011000101011111111111110111", + "000110001011000010110000101110101000110100100000010011000111001101001", + "111000111111010111000000011001011000000010001110010101001010100101001", + "100010010111110101111111101000111000111000100101111100110010101100101", + "011000101111111011101111100011110100111000010101000110001011110100010", + "011101010000111100101011101101110111101110011011001000000100011011110", + "001110101001011110110110101111111010110101111000100011100100111000011", + "111111011010001000110100000101000101010100101000010001011110101000100", + "010000110101110110101010111000100001100010101110011101010000101010001", + "101011000110101001010101011011010011011001001101111110110010101011100", + "110011100100010100010001000010010011011001010101001110001001110010110", + "110111000001010111011001011110001110001011110011001010000100010101011", + "100110100010100110000110001110010001010010011000101011100110011001011", + "110101001011110111101010110110111100110010100000010011011111000000101", + "111000111100001001001010011001001100000100001110010101010010001110101", + "010011010000000101001111101000111000111001000101111100110100000101001", + "001011101101001101001010100011111010111001110101000110001100010001010", + "011001010100111111100001001101100101101111111011001000000011111101110", + "011010101100111001101100101111111110110100111000100011100001011110011", + "100000011111101100100011000101010011000000111000010001011111001110100", + "011100110110010000010000111000100111110100110110011101010000101010001", + "011100000000011100000110011011010011000111010101111110110010101011000", + "101011100111011110010001100011010111000111001101001110001001010011110", + "100000000110111111111000111111001100100011110011001011100010110101111", + "100110110000100110100110101110011111100010011000101010000001111110111", + "000000001111110001111011110000001000111010100000010010111001100010101", + "111111100010011101011011011000101010101100001110010100010111101010101", + "100000101010000001001110001000101000101101010100111100110011100011001", + "101110100101000011000011100010011111101111101100100110001010111111010", + "101110101110110010111000101110101000010001100010101000000110001011110", + "101110101110101011101100001100111110001010100001000011100111001010000", + "100000101001101100101011111010000110111000111000001000111001110010101", + "111111100110011000011000011110111101010100110110000100110111110100000" + ] + }, + "14": { + "0": [ + "1111111010110011101011101101110010100111110011000100111110010010101111111", + "1000001010001101100101101110010100001011110100110001111100101010001000001", + "1011101001001100111010100011100100100100100100101100100100100000001011101", + "1011101011110110110100110110011110010100111111101001101011000011001011101", + "1011101001111101100101101111110000011010110011111000011010110001101011101", + "1000001000011100111010111000110011111001010010001100100100100110001000001", + "1111111010101010101010101010101010101010101010101010101010101010101111111", + "0000000011111101001101111000101011110100001110001100101001111000000000000", + "1011011101010110101100101111101010011111001011111011111001010100001001011", + "1001010100101011001101110111110010100111110001000100111110010010000110111", + "0100001100011100000011110110010100001011110100110001111100101111101110110", + "1010110101001100111110100001100100100100100110101000110101100001000101010", + "1100111111111111010000101000011110010100111111101111110010100111001101001", + "0110010101110100000111111110110000011010110010011110000011010110100010010", + "1111101110001000101100100000110011111001010011000110001110001110110101111", + "0010000011000011001011001110010000101111010010101101011000001101000111000", + "0001011001100000010011110101111100101001111101011100101001111100110001001", + "0110000000000110110000101011111111001010011100010000110101100001110011110", + "1110011110100101001000001101001111010000101111010011100011100010101100101", + "1101100010110000101001110111110110000011010000001110000011010111100011000", + "0011101010000111101011100101010101100000110010000010011111001010100001000", + "1111100110111000011111100100101101011000001101000101011000001101111000111", + "1001001001100100111011011111100011010110000011110000111000111000010010110", + "1111010110010110011011000010000100100100100001000000110101100000010011010", + "0010111111100011000110001111111110010100111011111111110010100111111111001", + "1100100011101011100000101000110000011010110010001110000011010110100011100", + "0000101011011010001111101010110011111001010110101110001110001110101010000", + "1001100011111010010010101000101101011000001010001001001001001000100010111", + "1100111110110000111111001111100011010110000111111010110000011010111110010", + "1000100111001100110110000010100000110101100001101110101100000110100111010", + "0100101101110011110101001111111000001101011111111001001001001000011111101", + "0011000000010011100100011001010010010010010100001100101001111100010011100", + "1000011010001000101010100010010011111001010100111011111001010011110010100", + "0111000101110000101010101100101011000001101011101100111110010101001010101", + "1111011111001000110001111001100101001111100010011001111100101001000100110", + "0111010111110111111111111011000000110101100101000100100100100100100101000", + "0101101111001001111100000001111000001101011010101001101011000000011111001", + "1110000111011110011001010010010110000011010111011000011010110000001000010", + "1001111000011100011000100000010101100000110010010100100100100100001011111", + "1000000011001000111111000110010100111110010110010111110010100110010001000", + "1110011100111110011100010010111010110000011011100101001111100100110101001", + "1110110000011101000111000101011001010011111111101001010011111001000111010", + "0000001100010011101010100100101001001001001001111010100111110011011111101", + "0101100011001001001011001101110110000011010001001010010010010011110001100", + "0100111110101101110111101111110101100000110111111100000110101100111110100", + "0001100010011101000010011000101101011000001010001011000001101010100011001", + "1011101010111011101010011010100011010110000010101010010010010011101011001", + "1101100010111101110100101000111001010011111010001110001110001101100010101", + "0001111111100100000011001111100001101011000011111000001101011000111110010", + "1001110010100010010001110010101111100101001011100001111100101000000111100", + "1110111001101011010101010100000100100100100001101101100000110100011100000", + "1110010111010100011000010101001101011000001001111011100011100011000010111", + "0011011110111011000001101000100011010110000111001011010110000010001110010", + "1111100111110100110110001111000000110101100101010111001010011110000100100", + "0011011011000100100001101111111000001101011100000000001101011000001100110", + "1001010110001001000011101000001011110100001010100000111000111001100011011", + "1101011001011010100001111010001010011111001001111101100000110101000100011", + "0010100100010110110111000110110010100111110000111010100111110011011111001", + "1000101010000110111000010100110100001011110111011011010110000010101001001", + "0011000110110111010101011010100001010011111100010110001110001110101010101", + "1000101100110111101000010011111001101011000101010000001101011001011100010", + "0001100001011101101000011001110111100101001010001001111100101000111010010", + "1101011110110001001010101011110100100100100100000101100000110101111001111", + "0001100101010010111000111011010000101111010111000111110010100110100001000", + "1000101111110101110111011111111100101001111011111101001111100101111111001", + "0000000011101011111000101000111111001010011010001001010011111000100010100", + "1111111010000101010101001010101111010000101110101010100111110011101010010", + "1000001010100110101011111000110111100101001110001010010010010011100010011", + "1011101000011110011100001111110100000110101011111100000110101101111111111", + "1011101010000110100011000110101100111110010000101011000001101011110001001", + "1011101010100111111100001100100010010010010001110010010010010011110101010", + "1000001000111111000101101010111101000010111101101010011111001010111110100", + "1111111010001010111100000110100111110010100001111110010100111110100110011" + ], + "1": [ + "1111111001010101000101000101010011011111101101000100100000010110101111111", + "1000001011001000001110101110001110001000111000101010101001110110001000001", + "1011101000100110001110101011001100101000010000101001010011001000001011101", + "1011101010101011100000000111011001110101000110000001110101000111001011101", + "1011101001111010101011111111101100100000010011111011011111101101101011101", + "1000001011111010100000001000111001010101001110001001000111001010001000001", + "1111111010101010101010101010101010101010101010101010101010101010101111111", + "0000000001001001101000111000101000111001010110001011111001100100100000000", + "1111101110011011000010011111111111101100100111111000010011011111010101010", + "1111010011001011001101110000101010111001110101111010111001110101111001101", + "1000001101000111010111001001111111001100101001010000000011011011001101010", + "0010110001110010010101000100110001011111001101011111101000100001011000000", + "0101011011011111111011101001000110001010111001100110001010111001110101110", + "0010000101001101100101000100110011011111101101011100100000010010000001011", + "0011011100010100001110101001101110001000111001110010101001110000110000001", + "0111010001110010101110100100101100101000010101010001010011001110101111011", + "0011111011010110000000001000011001110101000001101001110101000111001010001", + "0010010010110100101011101101001100100000010001000011011111101101111110101", + "0000011000111110010001000110011001010101001110101001000111001011001101110", + "0100010000010011010001011011010001011111001010101111101000100001111000100", + "1011101100111000111011110111000110001010111110000110001010111001010101010", + "1010100001100111000101010000110011011111101101111100100000010011100001000", + "0000001010010001111111101001101110001000111001010010101001110001010000011", + "1001010111111010110111000100110101001110001101010101000010001011001111010", + "0010111110100011011001101111100000010011011011111111101100100001111110001", + "1101100010000011100011001000110101000110001010001101000110001010100011011", + "1010101011010011101000101010101000010001011010101011101101100000101010001", + "1001100010100011101010101000101100101000010010001001010011001111100010011", + "1100111110101101000000001111111001110101000111111001110101000110111111101", + "0100100101001000101011110000001100100000010101101011011111101100110010101", + "0111101101010000110001000101011001010101001111000001000111001010000111110", + "1101010010000110110001010110010001011111001100101111101000100001010000100", + "1100011111100000111011101011000110001010111010100110001010111000001111010", + "0111100110101011100101010110010011011111101100001100100000010011001011011", + "0001001000110001101110100001001110001000111111100010101001110001011110001", + "0100100001111010001110110110001100101000010110001001010011001110101101011", + "1110001001010011000000011011011001110101000000101001110101000111111000001", + "0100110101111110101011101111001100100000010010000011011111101100110100110", + "0001101110011000000000011000111001010101001001111001000111001011000001111", + "1010010000100111001000101001101000111001010001010011111001100100110000110", + "0100111000100100100010001100111111101100100011010000010011011111101111011", + "1101010101101000001101110000001010111001110101101010111001110100101010101", + "1010101100100101110111000101011111001100101111000000000011011010011111110", + "0001100111011011010101010110010001011111001110101111101000100001001000000", + "0001111110111010011011111111100110001010111011111110001010111000111111110", + "0101100011100000100101001000110011011111101010001100100000010011100011011", + "1100101011010111001110101010101110001000111010101010101001110001101010001", + "1110100011111110101110101000101100101000010110001001010011001111100011011", + "0110111110010000000000011111111001110101000011111001110101000111111110001", + "0000100011010000001011101011001100100000010000101011011111101101111000101", + "0101101011101110010001000111011001010101001100000001000111001010001101110", + "1111100111000101010001001000110001011111001001111111101000100000111000100", + "0111011000100110011011100001100110001010111101010110001010111000101101010", + "1101110010011101000101001100110011011111101001011100100000010011011001001", + "0101111100011101111111101001001110001000111001100010101001110001110100001", + "1001010010100110010111000100110101001110001111011101000010001011000001001", + "1011111011101110011001111001100000010011011011110111101100100001110000001", + "1010110100010000000011010100110101000110001111010101000110001011001110111", + "0000111001101000101000110000001000010001011101101011101101100001101011101", + "0111100110000111101010101101001100101000010001000001010011001111011110011", + "1100111010010011000000000110011001110101000100101001110101000111001101101", + "1010010000001000001011101011001100100000010000101011011111101101111000101", + "1101011001100111110001001111011001010101001000000001000111001010010101110", + "0001100100100011110001000000110001011111001111111111101000100000100000100", + "1000101011110001011011111111100110001010111011111110001010111000111111010", + "0000000011001010100101001000110011011111101110001100100000010010100011011", + "1111111010110100001110111010101110001000111110101010101001110001101010001", + "1000001001010010001110111000101100101000010110001001010011001111100011011", + "1011101010101100100000011111111001110101000011111001110101000111111110001", + "1011101011111010101011101001101100100000010011010011011111101100010010101", + "1011101011000101010000010100111001010101001101010001000111001011001001101", + "1000001011010111010000100000001000111001010111101011111001100101010100101", + "1111111011111111111010010101011111101100100111000000010011011110100001011" + ], + "2": [ + "1111111000100111101001100101100010111010010011111011000000010110101111111", + "1000001001101000011001100101010101011100011011100010110010100110001000001", + "1011101001100100001111111001011100011001100111010110111111101100001011101", + "1011101001000010101001101010000010000011100111011001110100111111001011101", + "1011101010110100110010101111111001111000101011111000000101001101101011101", + "1000001000110110101111001000100011110001101010001100001010010110001000001", + "1111111010101010101010101010101010101010101010101010101010101010101111111", + "0000000011101110111001001000101010111011110010001000010010011111000000000", + "0011001110011101000100011111101111110000000111111100000110110010011010000", + "1001010010100011101001111101100010110010011010001011000001110100011001001", + "0100101001101010011001101101010101000100001101001010010010000001110010001", + "1101110101001110001111101001011100000000100111110110000111001001110010101", + "1001111011101000101001100010000010001101000000011000001100111111110011010", + "0010110101000100110010111110111001101101010000101001111101001111011100000", + "0010011111100100101111001011100011111001011011011101000000010111011101100", + "0000110000010101100010001100110001100101001010111011000011000100001111011", + "0010001000110011110010100001011001000100010010000010110110000100110001010", + "0100110010010110000100000000001111011011110111111110101010011001110010100", + "1101111010001001000010110110001110011110110111010001001101011010101000010", + "1001000011001000111001011111101100110110010000000000111001111111000100011", + "0110011110000101000010001111001101100010101101010101100001010010011111111", + "1001100111111111101111100100000010110110001011110010100110010100000111011", + "0110101001010010011111111101110101001101101100101011110110100001101011010", + "1100010101111000000101100000111100001000100110110110101111101101100010110", + "1011111111101000110001111111111110011111001011111001101100111001111110001", + "0001100010100000101100111000110101101101000010001000011100001001100010010", + "0011101011100000110001001010111111110011011110101100100001010101101011111", + "0000100010010101101000001000110111111101011110001011100011000111100011000", + "0001111110110001101010101111111001000100010111111011010110000101111111001", + "0100110110010100001110010111001001011011101000010111001010011001000110100", + "1101011110001011001000111101111110010110100101010000001101011011010110010", + "1010100001001110110111000100001010100110011010001000111000111011100010011", + "0110111100000111011100001001110011110010110010110101100000110100001011111", + "1010010011111101110111100011001110110110011101111010100111110010101011001", + "0101011101010010000111110110101001001101110110001011010110000010100101001", + "1101000111111000100101100001011010010000101100111110001110001011100100101", + "1010101001101011110001100001100010011111011111011000001101011111011110010", + "0010110000100111011000111111111111101101000110100001111100101110110000010", + "0000001011100100000101000000010011111011000000111101100000110111110011111", + "0001000010010101101101001001010000111101000001010111100011110001001001000", + "0000011010110000101011011011000101100100000110000101010110010011000101001", + "1110000110010000011010101110100010011011110010010001001010011110100110100", + "1001101110001000111101001111110011110110101001010010001101010111011110010", + "0010010001001111110001110111101110000110011110001010111000110011110010011", + "0110111110000111100100001111100011010010110111111101100000101100111111111", + "0111100011111101110011111000110100110110011110001010100111101010100011001", + "1110101011010011110001111010110000001101110010101011010110010011101011001", + "0100100011111001011010111000100001010000101010001010001110001111100010101", + "1111111111101011111000001111111110111111011111111110001101011000111110010", + "1000010010100110101000010010100110101101000010000111111100101000000100010", + "0100001111100101000110100001010110011011000010010111100000111100000111111", + "1001100110010100110110111101101101011100000011010001100011101011011111000", + "0000011000110001000010100010000101100100000110001011010110011010010011001", + "1010100100000000011110000101110001011011010010110111001010000110010010100", + "0101101011000000101010101010011011010110001001111000001101001000001010010", + "0010110101111111101100000101010111100101011110001100101110111001100100011", + "0010101111010110010101110001110011010001010010111011111110110101000101111", + "0011000001011101110011001001011101110101011001011100111001110011011110101", + "0010111000100011110001010111000000101101010100100001011000001010110000101", + "0100000010011001111010010001100001010100001110111100000100000110110011001", + "1011001000000010111001111110011111111110111101010000001011000001101001010", + "0000010110111111001001010010000111001001000100001001111010110000000100010", + "1101011100110101000111000011110110011011000100000101100100101100000111111", + "0001100110100101010111111110001101111110000101011111110011101011011111000", + "1000101011100001100010101111100101000111100111111101001110011010111111001", + "0000000010110001111110101000110001011000110010001001010010000111100011000", + "1111111011111000101010101010111010010110001010101010000111000001101011110", + "1000001000101110001100111000110110111010111010001010110010110000100011111", + "1011101001101111010100001111110011101011010111111101100110101100111110111", + "1011101011100100010011000000011100101010011001011010100001101010001111001", + "1011101010000111110001111010000001011101110000010011010010011010000111010", + "1000001001001000111010000111100000011011110100001010011111000111100010100", + "1111111000111100111001101010011110011100101001011110010100100001011100011" + ], + "3": [ + "1111111000111000101011001011101010100011101101000011000000010110101111111", + "1000001010001011011110010010101101101010100010110010110010100110001000001", + "1011101011111000110110100110111011001010011100101110111111101100001011101", + "1011101001011111000001000011100001110100000111101001110100111111001011101", + "1011101001010011110000001111110001111111001011111000000101001101101011101", + "1000001001010001101000111000111011011111000010001100001010010110001000001", + "1111111010101010101010101010101010101010101010101010101010101010101111111", + "0000000001110010000000001000101101101000010110001000010010011111000000000", + "0111011001111110101100111111101100010110010011111100000110110010000000110", + "0111100000111010101011011011101010111011101101000011000001110100011001001", + "0111111111001001011110001010101101110010100010110010010010000001110010001", + "0001100001010110110110101110111011001110000000100110000111001001110010101", + "0010011010101001000001001011100001101010011001100000001100111111110011010", + "1100010010110001110000010000110001111010110010000001111101001111011100000", + "0001101001110001101000110100011011011110010010011101000000010111011101100", + "1100010101111001011011000011010110110111101011010011000011000100001111011", + "1001011000110000011010000000111010100101000100110010110110000100110001010", + "1011000101000111000110100110000111010110000100101110101010011001110010100", + "1110101100011010000101010001110110101001111111101001001101011010101000010", + "0100010110100000000000011000001011111100110000010000111001111111000100011", + "1111111110000100101110100111101000000011110010001101100001010010011111111", + "0111000000101010101111001010001010100011101001011010100110010100000111011", + "0110011111000111001110000010001111101010100100101011110110100001101011010", + "0001110000010100110010101111001101011010000110111110101111101101100010110", + "0000111111101011000001011111101001111110011111111001101100111001111110001", + "1100100011110001110100011000100001100000110110001000011100001001100010010", + "0010101011110011111000101010101111000100010110101100100001010101101011111", + "1110100011111101001001001000100010100111101010001011100011000111100011000", + "1011111110110000000010001111101100100101000111111011010110000101111111001", + "1000100111000101000100110111001111001110000000000111001010011001000110100", + "1101101000011110010101011011101010101001111111000000001101011011010110010", + "0111110110100100000000010010011011111100110110110000111000111011100010011", + "1101101000000100101100111110000100010011110110100101100000110100001011111", + "0111110010101000101111011010011010100011101101100010100111110010101011001", + "0100001011000111001110010001111001110010100100000011010110000010100101001", + "0011000000010010100100100100101111001010000000011110001110001011100100101", + "0000011101101000111001010100010111111110011011011000001101011111011110010", + "1110010001110011110010000111111001111000110110111001111100101110110000010", + "0000101101110000011000100000000111000100010010110101100000110111110011111", + "1100110101111110111011101001000000000111101101110111100011110001001001000", + "1011101110110011011010001110110010100101000000000101010110010011000101001", + "0111110111000100100011010011110111001110000000001001001010011110100110100", + "1110001000011101010100001010100011101001111111011010001101010111011110010", + "0001100110100100111001110010011110011100110110101010111000110011110010011", + "0100111110000101100110011111100100110011110111111101100000101100111111111", + "1000100010101000011111111000110101100011101110001010100111101010100011001", + "1101101011000110111000101010101010010010100110101011010110010011101011001", + "1011100010010010010010001000101001101010000110001010001110001111100010101", + "0101111111101000000011001111111001111110011111111110001101011000111110010", + "0011100111110010010101110111011111111000110100000111111100101000000100010", + "0011111111110000101111101001001100000100010100001111100000111100000111111", + "1010000001110111111110110101100101000111101111011001100011101011011111000", + "0010101110111011011000110010000010000100000000101011010110011010010011001", + "0101010001010101100010000000001000001111100010110111001010000110010010100", + "0110011011000101100011100111100001001001111001100000001101001000001010010", + "1101010011101100100100101000111111011000001100000100101110111001100100011", + "1000011001000101101110100101110100010101001111011011111110110101000101111", + "1000110101110001001110101101100100100011110110111100111001110011011110101", + "0101001001000110011000011110111010110111110011011001011000001010110000101", + "0111100110011010010010111000001000101111100010010000000100000110110011001", + "1001111110100001000011001010011001011111011011010110001011000001101001010", + "0011100100100010110101010100111111111001010100000111111010110000000100010", + "1101011100000001101111001110001100000010110100001111100100101100000111111", + "0001100000100111111111110011100101000011010111011101110011101011011111000", + "1000101001110010011001111111100011000011111011111101001110011010111111001", + "0000000010011100000010001000101000101110011010001001010010000111100011000", + "1111111000011100000010101010100000001100101110101010000111000001101011110", + "1000001010101100100100111000111110000001010110001110110010110000100011111", + "1011101001001100101111001111110101101010110011111011100110101100111110111", + "1011101011111001101111110000000101001010001000110100100001101010001111001", + "1011101010110111011001100010111011001100000001100001010010011010000111010", + "1000001011001000010010000000001000110110111101101000011111000111100010100", + "1111111000101111000010101111111000000000100001111110010100100001011100011" + ] + }, + "15": { + "0": [ + "11111110111000100010101011101011010110000100100000110000000101001100001111111", + "10000010111110110101111100011000110101100101011000101100001010011010101000001", + "10111010000111111110110001110001001101011000011111101011001001001000101011101", + "10111010111000000110110111111111100011010110011100011010110000011100101011101", + "10111010001111101111111011111100000000110101101111100110101100000011101011101", + "10000010010011011110111010001100111000001101011000100001101011001010001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101111111", + "00000000101010100000111010001101100001010011111000100010111101001001100000000", + "10110111011010011011001011111101011001101011011111100111110010111111101001011", + "00101101101000011010001100101011010111100101000010110110000011001111000011110", + "00101010111110010001010010001000110100100100101110100110001110011111000000011", + "01000001111111101101010001100001001001011000011001100001001000001100111000100", + "01110111110000000010010011101111100101010110001010000010110001111100010110001", + "10000001010111101101111101111100000110110101110110011110101101100000010101000", + "01101011000011011111011101110100111110001101000101010001101011100011001101110", + "10110000110100010111001110101011001111100101000100110100001011010110000011111", + "11110011001011110100100001001000101100000110111010101010011111001010000000111", + "11011000100011000000010110001000010100111110011001101101011000001100011000111", + "10101110000100100100000110110110010010010010011000010000011000111001110010110", + "00111100010100100001111000010010100100100011110101001100010101100101010011010", + "10001110101110111001001010110010111110010011010000111000010010100001001011001", + "00010101100101011011001001010100110000011101000001001001100011010000100101010", + "00000110101010110010100010001101010011111100101000011101001110001000110001011", + "01101001101011001100000101100111010100111110001111001111011000001001000000000", + "11001111111101101010000111111001111010110000011111111100101001111010111111101", + "10111000101111111101111010001010011001010011101000100000110101100111100010110", + "10111010101111001111001110101000101001001001011010101011000001100000101010001", + "11001000101010001111000110001100010011110100011000111110100001010100100010000", + "00101111111011001100110011111111010010011111001111110011111001001011111111100", + "11011100110110000000011110110111101010100111111111010100111110001100110100101", + "00010011110100001100010001010011100100001011101010100001111100111000111010101", + "10001000111110100011011010001010111101010011101110101000110100100101111101001", + "11110011110100110110000111100010100111101011010000111111110011000001101111010", + "00101101101011001001110101101100101001100101010001101110000010110001110000010", + "10001111000010100101000111100101000010100100100101110110101100100101110011100", + "00001101110011010000011110000111010000101111011011100101111010100111001101001", + "10111010101111111110000100011001111100101001110010000101001111100101000011010", + "10111000011101101010010010011010011111001010010110111001010011111000111001010", + "11100010001010010110101011001000101111010000110001111010000111110010000001101", + "00010101101000011101101101111000001011110011011000011110110010010010001001100", + "10001110111001111011101010001111001010011000111101010011100110101101100000100", + "11010100110000111010101111010101110010100000001010110100100001101011001001011", + "00111011110001111001100000010101110100001110010011000001010010010011000001010", + "01100000011110010101111010001111111101000010110110001000011111001110100100110", + "11100011110101111101000011000101000111110010101000011110010100111000011110001", + "11001100101010000100100100001001001001111100100001101111100101001000001000000", + "00001111100111001011011011111100100010111101001111110111101000011101111111100", + "01001000100010011110110010001011010001001001001000100001101011001011100011011", + "00111010111110100100111010101101111101001111111010100011010110011010101011010", + "01111000111101010111110010001010011110101100011000111111001010000110100010110", + "01101111101010000110110111111110101110010100101111110000001101001000111110001", + "10011001010000100011101000101001001111110100010011010100101000111000011100000", + "10000011010000010001001101011000101100011111001110001011111000110100011101100", + "00000001011001011110111111111010010100100111101000001100111111110011001111011", + "10001111100001111101001010000010010010001011111001110001011110000010101001010", + "00111101001101110101011010100110100100100100100101101100000110001110101010110", + "11001110100011111100100111111110111110010100100011111000001101011001010000001", + "11111000000101100101100010000100110000011010110011001001111100101000110100010", + "00110011101010101011111010111011010011111001001101011101000000110101111111111", + "01110100001100111000110011110100010100111001001010001111000011100010100111000", + "00011011000011100111111010001010011010110111111110111100110110000011101011001", + "01100101110111110011010010110001111001010100000011100000101010011110100010110", + "01011110011111100110010010111111001001001100100110101011001101011001110010101", + "10000000011011101011101000010111010010010010010011011010111000111110011101000", + "00101011101111000001011110110100110011111001001110010101100000110010111100000", + "01101100011110010110100011011100001011000001101000010010100111110101101110101", + "01001111011100111101001111100100000101001111111011101011110100000001001000101", + "00001000110001010101010110111001111000110101100111100110101100001101001011001", + "01111010011000100100100111111001000000001101011111100001101011011000111111010", + "00000000100001010101100010001111001110000011001000110000011010101001100010000", + "11111110100010001111101110101010100101100000111010101100100100110100101011100", + "10000010111000110000100010001100001101001001011000101011100010100111100011011", + "10111010000111110101111011111010000011001111111111111011010111100100111111010", + "10111010110111111000011100101001100000101100011000000111001011111001111001000", + "10111010101111100101110111011111011000010100101111000000101111110011001001101", + "10000010000101100000100011101111010110000011010100010000011010010010101111110", + "11111110110001001101101100110100110101100000110100001100000110101101101100110" + ], + "1": [ + "11111110011110100010110001010100101000000011001011001111100100110100001111111", + "10000010101011110100001011100011110101010110001000101001111100010110101000001", + "10111010011011001100001010110011010110010100000011010010010010111000101011101", + "10111010111010011110100001100110000011001001111011111010110000000100101011101", + "10111010010110001001011111111011010110011100111111110000011010101111101011101", + "10000010100111100011110010001110000011001011111000110010010000001010001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001101101011110110001100001111100011011000111100101011110011100000000", + "11111011101100111000011111111001111010110110011111100101001001111010010101010", + "01011001100010100010110110010100101111100011011001001111100011010000111100010", + "11111111100100010000001000000011110010010110010110101001111010110010001111001", + "10000000011001101010001111010101010010010010011100010110010000011000010010011", + "00110010011001011000100100010000000101001111110100011100110110000010110111001", + "00110000010010101011011101001101010000011010111010110110011100101001000010000", + "01010010000111000101110011111010000101001111110000010000110100001011110011110", + "10001101101000101101010000101011001111100100001011111010001011110101111101000", + "00101110101100011110111011100110011010110001101011100010101001111100010000110", + "10011001000011010001010010010011001111100100100001001000000011010110100101110", + "00111111010100011011111000000110010010010011111110101010011010110000010110101", + "01000000011001111011110111010100001010010011010100010100100000011010000011111", + "00111010100001011000011100010001111101001110010110011101001110000010101110001", + "10111001011010110010110101001100101000011011011000110111100100101001011010000", + "11010111011111000100001011111011110101001110010110011001111100000011101011010", + "01110001110010111100001000101011010111110100001101110010010011111101010100000", + "10101111111100011110100011111110000010101001101111111010110001100100111111010", + "10101000110111010001011010001011010111111100101000110000011011001111100011101", + "00001010111101010011110010101110000010001011111010110010010010101001101010100", + "11011000101010011011110010001100001011100011001000111100101001010010100011101", + "01011111100111101000011011111001111100110110001111100101001111111011111110000", + "10100000110110111010110101100100101001100011010101101111100101010001110000010", + "11110110111100110100001000010011110100010110010011001001111110110011000101001", + "01100100100100111100001101100011010010010100000000110010010000011100010000011", + "10111111000101011110100110110110000101001001110010011010110110000101000111001", + "10001000100011010001011011110011010000011100100010010000011100101110001001100", + "00011010011100110111110110001110000101001011101000110010010100001000011100110", + "11101001001010111101110010011010001111100101011110011000101011110111101111100", + "11111011100011101110011111001111111010110000001100100011001001111100110010010", + "01101000110111011000110010010010101111100101010100001001100011010111110110110", + "01110010111011010010001111001111110010010010001010101011011010110001000010001", + "00100000100000110010101011111100010010010011011000010100110000011010010011011", + "11111011000101101000000010101001100101001110001011111101010110000011000100101", + "00001100100011010010111101100100110000011011010011110111111100101000010000000", + "00011010011100101100000000010011100101001110010001010001110100001010000101010", + "11101001011010101100001100000011010111100100000110111010011011110101110110000", + "00111011010011101110100111010110000010110001110100000010110001111100110011010", + "11101001110111001001011010010011010111100100100100001000011011010111101111110", + "11011111101011011011110111111110000010010011101111100010010010111001111110101", + "11011000101000100011110010001100001010000011001000111100101000010010100011111", + "01101010100001111000011010101001111101010110001010100101001110011010101010001", + "10011000111101000010110010001100101000000011011000101111100100110000100010010", + "10111111101101101100001011111011110101010110001111101001111100010011111111010", + "10110001011011001100001001001011010110010100011010110010010010111100011010010", + "01000010010110010110100111111110000011001001110000011010110000000100101011010", + "11101000001001110001011100101011010110011100110011110000011010101110010101100", + "11010110111000100011110101100110000011001011111001110010010000001000110000110", + "11100001000110010011110010010100001111100011010011011100101011110010000101100", + "01110010011101011000011000000001111010110110001000100101001001111010010110010", + "10011001101100000010110011010100101111100011001010001111100011010000100010010", + "10011011101101001100001010010011110010010110000010001001111010110011001111001", + "10100001111111001100001001001101010010010010011000110110010000011001111010011", + "11100010010110010110100110011000000101001111110110011100110110000011101001001", + "10101101001001110001011101001101010000011010110101110110011100101000010110000", + "10011010111001000011110110000010000101001111111101110000110100001010110001010", + "00101100000011010001010001010011001111100100010011011010001011110100000101000", + "10111110011100000000111111100110011010110001111000100010101001111100010010110", + "10010001101101100011010100110011001111100100110011001000000011010110100101110", + "01001111111101100111111101100110010010010011111011101010011010110001001000101", + "00001001101111010101110010010100001010010011010001010100100000011011111101111", + "01111010000110000110011011111001111101001110001111111101001110000011111110001", + "00000000101001100100110110001100101000011011001000110111100100101001100010000", + "11111110110001011100001010101011110101001110001010111001111100000010101011010", + "10000010000011000110001010001011010111110100001000110010010011111100100010000", + "10111010111110011000100011111110000010101001111111111010110001100100111111010", + "10111010110111111001011010000011010111111100101110110000011011001111001111110", + "10111010110010100111110101010110000010001011110100010010010010101000010010110", + "10000010111001101101110000010100001011100011010100011100101001010010001111110", + "11111110100100001110011101001001111100110110000010100101001111111011111010000" + ], + "2": [ + "11111110010010010010010010010010000011000011001011110101111011001100001111111", + "10000010000100100100100100100100110011000001001010011010000100010010101000001", + "10111010001001001001001001001001010101110110010010100010101000000000101011101", + "10111010010010010010010010010010010111100110010100001101110001100100101011101", + "10111010100100100100100111111100110100110101111111100011001101111011101011101", + "10000010001001001001001010001001011110001100111000110111101001111010001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101111111", + "00000000100100100100100110001100111000111011111000101110000101101001100000000", + "00110011101001001001001011111001001100111101001111110110101010111111111010000", + "10010000010010010010010010010010000010000011001011110100111011001011011100000", + "00100110100100100100100100100100110010000001000010011010100100010011011101100", + "01001001001001001001001001001001010101010110010010100011011000000000001111011", + "10010010010010010010010010010010010111100110011100001100110001100010101001010", + "00100100100100100100100100100100110100110101111011000010011101111111101010110", + "01001011001001001001001001001001011111101100101011110110011001110000110000001", + "10010000010010010010010010010010001110001101001111111000010011010001010100000", + "00100110100100100100100100100100100111010000101110111010010111001100011111100", + "01001001001001001001001001001001011001011000010010101111111000001010000111011", + "10010010010010010010010010010010000000110111110000101101001010111011101001010", + "00100100100100100100100100100100111100111011011101001110100101100111100000110", + "01001011001001001001001001001001001100111101000010110111111010100001110000001", + "10010000010010010010010010010010000100000011001000010100100011010001011000000", + "00100110100100100100100100100100110110000001000111111011111100001101011001100", + "01001001001001001001001001001001010001010000010000100011001000001010001001011", + "10011111110010010010010011111010010111100101001111101100100001111010111111010", + "00101000100100100100100110001100110010110011001000100010010101100111100010110", + "01001010101001001001001010101001011011101111111010111110010001100000101010001", + "10011000110010010010010010001010010010001111001000101000010011010000100010000", + "00101111100100100100100111111100100001010101101111100010010111001101111111100", + "01001001001001001001001001001001000111011000111010110111111000001010110100001", + "10010010010010010010010010010010011000110110101001001101001000111010011011110", + "00100100100100100100100100100100101100111001110110101110100110100111011001100", + "01001011001001001001001001001001000100111000000000010111111111000001101000101", + "10010000010010010010010010010010010100000011100001110100100010110001101111110", + "00100110100100100100100100100100100110000000011111111011111100101100101100011", + "01001001001001001001001001001001000001010100011011000111001101101010110100100", + "10010010010010010010010010010010011111100011011011001010100100011010110010001", + "00100100100100100100100100100100100010110101010111000000010010000111011001000", + "01001011001001001001001001001001001011101101110010010100010101000001000001110", + "10010000010010010010010010010010111010010111010000011110010110110001101111111", + "00100110100100100100100100100100101001011101111101111010010010101100000100111", + "01001001001001001001001001001000001111001000110010101011111111101010110100101", + "10010010010010010010010010010010010000100110110001001001001110011010011010101", + "00100100100100100100100100100100001100101001100110101010100000000111011001001", + "01001011001001001001001001001001000100110000000000010111111111000001101001010", + "10010000010010010010010010010011010100011011111001110000100100110001110111110", + "00101111100100100100100111111100100110010000001111111111111000101100111110011", + "01001000101001001001001010001001100000000100001000100111001101101010100010100", + "10011010110010010010010010101010011110001011011010101100100100011011101010001", + "00101000100100100100100110001101100010101101001000100110010010000110100011000", + "01001111101001001001001011111001001010011101111111110010110101000001111111110", + "10010000010010010010010010010010111010111111000001011100010110110001100011111", + "00100110100100100100100100100100101000111101100110111010010010101101010000111", + "01001001001001001001001001001000001111100000101000001010111111101011000000101", + "10010010010010010010010010010010010001000110100001101000001110010110110110101", + "00100100100100100100100100100100001100001001110111101010000000000000110101001", + "01001011001001001001001001001001000101010000001011010111100111000111101101010", + "10010000010010010010010010010011010100111011110011010000000100110110000011110", + "00100110100100100100100100100100100111110000010111011111110000100110000000011", + "01001001001001001001001001001001100011100100011010000111111101100101011000100", + "10010010010010010010010010010010011010001011010000001100110100000100110110001", + "00100100100100100100100100100101100010001101000101100110101010011000110101000", + "01001011001001001001001001001001001110011101111010110010000101011011101101110", + "10010000010010010010010010010010111110111111000001011100100110111110000011111", + "00100110100100100100100100100100101110111100000110111010000010110010000000111", + "01001001001001001001001001001000001001100001101000001011000111110101011000101", + "01001110010010010010010010010010010001000111100011101001011110000000110110101", + "00001000100100100100100100100100001000001110010111101010010000001000110101001", + "01111011001001001001001011111001000011010001101111110111101111011111111111010", + "00000000110010010010010010001011010010111110011000110000011100101111100011110", + "11111110100100100100100110101100100111110110101010111111101000110110101010011", + "10000010001001001001001010001001101101100101101000111111111101100101100010100", + "10111010010010010010010011111010001000001000111111100100110100000100111110001", + "10111010100100100100100100100101101100001010101000111110101010011001100000100", + "10111010101001001001001001001001001010011011000010000010000111011011011000101", + "10000010010010010010010010010010110110111110110111111100100010111111010111010", + "11111110000100100100100100100100110110111110000101101010000001110010110100010" + ], + "3": [ + "11111110000010101111101010010000010001000011011011001000000100110100001111111", + "10000010111111111100100100001100111101001000100110011100101010101010101000001", + "10111010111100110011011001010001010101010111000001001111101000101000101011101", + "10111010000100100001110001000010100000111001110000011101010001111100101011101", + "10111010010011101010001111111110110100001010011111100001001101100011101011101", + "10000010011110110001101010001001011100101000101000101010101001100010001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101111111", + "00000000010101010100100010001101011001111101101000101100111110100001100000000", + "01110110011110000110001011111000111011011101001111111001110101000111100000110", + "01110001100001101111101001010001100010100011011010101000000100110111000010000", + "11001110110101011100100010111100010001101000100110111100101000101111000101100", + "11100001111001110011011110100011010101110111010001101111101010101000011111011", + "01000111100101000001110011110110100000011001101000011101010111111010111001010", + "01011000010011001010001011000001110101001010010100000001001011100111100011010", + "11101110011110010001101111000100011100101000100011001010101101100000111101101", + "00100001000010100010010101101111101110101101010010111110001000010101011011100", + "10011010110011101000100101010111110110110100100110110010011000101010011000100", + "10101000111010110111010110101000111000111110000001110101011111101100000001011", + "01111010000011001111010100001010000111111100010000001000111110010001101011010", + "10001100011100011101110011001110110000011010111100000000100111000101100010110", + "00011110110110011101001000101101111011000110110001000111101100100000110010001", + "10101100001101111000011101110111001011111100100000110110011101010000011101100", + "00000011110011111011110010101001100001000101001000100110000000000101011000000", + "11111001000001111000000110110100111101110110001111100101000011000110101000111", + "10101111111101010110010011111001010000010100011111100100110110000100111110010", + "00001000100111001110100110001101010101010011101000111000101010011000100010100", + "01101010111000001110000110101001001100111001011010111011101101010011101010001", + "00111000101010110011001110001000000110001100011000111110011001110011100010010", + "00111111111011000000110111111000010110100011001111110010000001001100111111100", + "01101101110110000011000100111100010001111111111111010101000110001011010100101", + "10100110000101010101010001110111010110000011101010100000110100110010011010101", + "10110001101111000101011111011001010111111011101110101000101101101011011101001", + "01100011000111001100011010000010001100101111010001111111101010111111101111010", + "10111100110111111001011100110011100011100101010010001110011011001111101000000", + "00010010110011000010000100100100100000110100100110010110000100011111101011100", + "11011000010011101101110010000011011011010111011101000001000010001101010101011", + "00110010001101110111100110001110100110010111110101100010110111111101010011010", + "00001000011001101001001001101001111100010100010011011110101011100100111001100", + "00111111011110001000001000110100001101011010110000011001001111101111000000110", + "11000001011001111100001011110110100001011101011000111100111011011011101111011", + "01000110101010101110110111100111000001010110111100110011100111010100000101011", + "10100101101100111010000111100010111000100010001001010100100000010010101100111", + "01100110100101110101110010001100110110011000001000100001110010101011000010110", + "10110100111110001001010111100110010110100011101000101100111111100110100001010", + "10101011010110100100100101001000111101000101010110111001110100100000011001001", + "10101101101111001111100111011011101010110011010101101000000101010000001111110", + "01101111100011100101101111111000000000101110111111111100101010000100111110011", + "00111000111010111111010010001011100100011110011000101111101000000011100010100", + "11011010101100011000011010101011110001101000001010111101010001100011101010001", + "11101000101101010111111110001101011101010111101000100001001101111111100011010", + "10001111110000110110101011111101100011001011011111101010101001111001111111101", + "00100100001000111111100101101000111000010101011011011010001000011001111011100", + "11110111011101001001001001000101010110101000110110010100011000110101011000100", + "01011000010100010100111000001000100011101000010001010011011111110011001000101", + "11010111101010010011011100111110110100011000000010001010011100000010110110101", + "01000001011011010010111110111110101011010011101110000010000101001110110101001", + "00100111010110100011000000001000011101010011011101000110001010111001101101010", + "01010000001000000001001010010011011100000001001101110111111011001000000011110", + "11100111011110011011000101100001100110000110110001000111000110010100011000011", + "11110000010111000100111110111001000010101110000010000001010001000111000000100", + "01001011101010011111111111100100000000111110000110100010101000000100101000001", + "00110101111000111001010101101101101111000101111010111110110100011000100000100", + "00001110110001001100000111101000101111000011011101010001000011011011101110010", + "11110101101100000000001000010010011101100110011000110000110011111010000010011", + "01001010111010101010001100111010110000011011000000101101100111010100000101111", + "01001001010011011001010100001000100110111101101110101010100000010011011110101", + "01001111101000001011010101000111010000010111111111110011010000100010101000101", + "00001001111010101110110111100100111111000101100111101110011100110010101011001", + "01111010111001000111100011111111011011100101011111111000010011000111111111010", + "00000000101110001100000010001011010001110011001000101001100010110111100010010", + "11111110010100100101101010101101000010101010111010111101101110101110101011111", + "10000010110111011011001010001001011110110001011000101011111000101001100011000", + "10111010010100001100111111111100001110110111111111111011001001111010111111001", + "10111010100110111010110000011101000011010100011000000111010101100111111001000", + "10111010110010000000001101101100001011001110101110000000000011101001001001101", + "10000010101100010000000001010010001001101011010111110000100010011100110111110", + "11111110010101111010000111100010110110000000110111101101111110110011110100110" + ] + }, + "16": { + "0": [ + "111111100001011100000101101000101101100000110101101001111001010011111100001111111", + "100000100100101011101110110011011000110101100000100010010111101000010111101000001", + "101110101110101010000011110100101101100000110101100010101100000110101010101011101", + "101110101110010001001011100110110000110101100000101100110101100000110110101011101", + "101110101110010000011001111111100101100000110101111110011111001010011100001011101", + "100000101100011110101001100010000000110101100000100010110101100000110101001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001100111110010101100011011100100100100100100011001010011111001010100000000", + "101111100011100010101001111111000001010011111000111111010011111001010011101111100", + "001111000001011100000100000010001100000110101100100111111001010011111000010101000", + "110110101100101011101110100000011001010011111001011100010111101000010110110000011", + "100110011110001010000011110001001011111001010010011100101100000110101100101101001", + "100000111110110011000010110111010110101100000111010110110101100000110100011000111", + "110111000110110010001001011010000011111001010011101000011111001010011111101101010", + "100110100101101111100101010000000100100100100100110010111101000010111101011000000", + "100010011010110100010110110001011100100100100101111011000010111101000011100101010", + "001100101010000110100111100111000001010011111000110101001010011111001010000000100", + "001111010100111100010010000010001100000110101100101111100000110101100001110101100", + "100110101110001101010111100000011001010011111001010100000110101100000111000001011", + "110110011011110100010111010001011011111001010010011100101100000110101101110101101", + "010000111010000110100111010100011110101100000111010110110101100000110100011001011", + "000111000100111100010011011010100011111001010011101000011111001010011111101100110", + "100111100110001101010111110011100100100100100100110010111101000010111101011101100", + "110010011011110100010111010001011100100100100101111011000010111101000011000010110", + "011111111010000110100111111111010001010011111000111111001010011111001010111111100", + "001010001100111100010011100011011100000110101100100011100000110101100000100011000", + "100110101010001101010111101011101001010011111000101010000110101100000110101010011", + "110110001101010101010101100010111011111001010010100010101100000110101101100011001", + "011111111111010100101101111110110110101100000111111110110101100000110100111110111", + "011000001001110100101100000101111011111001010011110100011111001010011110100110110", + "110000110011010010011001000000001100100100100101001110111101000010111100110011100", + "101011001011011010000101000101011100100100100101000100000110101100000111000000110", + "011010111101011110011101110001010001010011111000100110101100000110101100010101100", + "000011011101111111101100110101011100000110101100001100000110101100000111011001000", + "110000100110111000011010111011101001010011111000100110100100100100100101101100011", + "001001000000000101010100011010111010111101000010111100001110001110001110111101001", + "111011111111010101001101110000100111001010011110011110110101100000110101100010111", + "110001001011100101101001000101101010011111001011110100011111001010011110100110100", + "010000111011010010111000011000001101000010111101001110111101000010111100110011100", + "111011011011011010000101011101000010111101000011100100000110101100000111000000100", + "011010110101011110011101110001001111001010011110000110101100000110101100010101100", + "000011001101111111101100100101010010011111001011101100000110101100000111011001010", + "110100110110111000011010111011100101000010111101000110101100000110101101101100000", + "000001001000000101010100011010111010111101000011111101000010111101000000111101010", + "110111100111010101001101110000100111001010011110011101001010011111001011100010100", + "111001000011100101101001000101101010011111001011110111100000110101100000111110110", + "011100100011010010111000011000001101000010111101001000001110001110001110101011100", + "110011001011011010000101011100100011111001010011100010100100100100100101011000110", + "011011111101011110011101111111001110101100000110111110101100000110101100111111100", + "001010001101111111101100100010010011111001010011100010000110101100000111100010110", + "110110101110111000011010101011100100100100100101101010101100000110101101101011100", + "000010001000000101011100100010111100100100100100100011000010111101000011100010110", + "110111111110010011010100111111000001010011111001111111001010011111001010111111100", + "111010000011000011100000101000001100000110101101000011100000110101100001000100100", + "011111100111110001110101001011101001010011111001101100000110101100000110111001111", + "110000000010000111001000010110100011111001010010100110101100000110101101001100101", + "111001101001111001100001110101001110101100000111111100110101100000110101011111111", + "111011000010110111100001011010010011111001010010111100011111001010011110100000110", + "100101100101110101010101000101100100100100100100110110111101000010111100011101000", + "000011000011000011001000110000010100100100100101001001000010111101000010101111110", + "110110101001111001100000010010110001010011111000000011001010011111001010010100000", + "111000011010110111100000010110011100000110101101000011100000110101100000101011000", + "101100110101110101010101101100110001010011111001101100000110101100000110000110011", + "000011011011000011001001010001000011111001010010100110101100000110101100110011001", + "111010100001111001100000010010111110101100000111101100110101100000110100000100111", + "111000011010110111100000011111101011111001010010100100011111001010011110110010110", + "100000110101100100010100100100011100100100100100101110111101000010111100011111100", + "000011010111110001100101010000000100100100100101000001000010111101000010101010110", + "110010101011010111101000010011011001010011111000001011001010011111001010111101100", + "100100011101010100100010010111001100000110101101000011100000110101100000000011000", + "011100110001111101110000101100111001010011111001101100000110101100000111100110011", + "010001011001010011001001010011000011111001010010100111101000010111101001010011001", + "011100100011001011110010111110111110101100000111111111010011111001010011111110111", + "000000001100011001011001100011101011111001010010100011111001010011111001100010110", + "111111100011111011010110101010011100100100100100101010011111001010011110101011100", + "100000101001110000110001100010010101100000110100100011100000110101100000100010110", + "101110101011011110101100111111000000110101100000111111001010011111001010111111100", + "101110101111011100000111110011010101100000110100001101100000110101100001100001000", + "101110101001110101110000011110100000110101100001100100000110101100000110110100000", + "100000100001010011001001100111010101100000110101001111101000010111101000111001000", + "111111101011001011110011110000100000110101100001000001010011111001010011001100110" + ], + "1": [ + "111111101000011110010100010101001101111111001101100111111110110011111100001111111", + "100000100010111010010011010101010101001111010101010001110001100101110011101000001", + "101110101100011111101010111011100011001011100011001001010000000001010110101011101", + "101110101110001011100110111000000000101010000000110101001100011001001110101011101", + "101110101100110011100001111110111000010010111000111110001011011110001000001011101", + "100000100001010001010001100010010110010100010110100010111010111110111001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000110110100100001100010111000001000111001100010001011001010001011100000000", + "111100101001111101010000111110110110000100110110111111111010110111111010010011101", + "101111011000001110001100000101010101100111010101101111100110101011100110001010100", + "101000101011100010001011010101001101011111001101011001100001001101100001010000110", + "011010000101110111111010111011100010010011100011001001010000111001010000110101011", + "000111100110110011100110111000000001010010000000110101001101100001001100111110011", + "000000010100011111100001001000111001101010111001000010001010100110001011100111001", + "110011110000111011010100101110010111100100010111100010111011010110111010001001001", + "101111010000010101001011101101010010100101010010011111100010001111100010000100101", + "001001101011000110001100110101101010111111101010111000100110001100100111010100010", + "111111001111011110111001010011100100110001100100011001010111111101010110111010010", + "101001100100000111100000011000100101010010100101010100001111100010001110111001111", + "000011011001111110100110000000111111001100111111110010001101100000001101001001000", + "011010110110011011010111101110110001100010110001100011111101010001111100101111001", + "011101011111101000001111100101010010000001010010101111100001001101100001101100100", + "000000101101101001001101110101001000111001001000111001100010001011100010110100010", + "001000000010100100011101011010000100010110000100101000010110111010010111010010011", + "100011111000101100000001111111100111010101100111111110101011100110101010111111111", + "101110001100000101000010100011011111101101011110100011101100100001101100100011001", + "101110101110110010110111101011010011100011010010101010010001010000010001101011001", + "011010001100010010100010100010100010100000100010100010001000001100001000100010101", + "000111111101000001100101111110010010111000010010111111011110001011011110111110010", + "110110010110011110000001101110011100110110011101000010101111111010101111110110001", + "011001111000110100011000000101111101010101111101001110110111100110110110110101110", + "110100001001110111011110110101001111010101001110011001100101110001100100101101010", + "011100110111100010111110011011001001111011001000101010000101001000000100110011000", + "000000001001101000110111011100101010011000101011110110011001010100011001000000010", + "110100101100000001110101101110010000101000010000100101011010100011011011011001001", + "101111001011010100000101110000010101001110010101010100111110000010111111110111000", + "101010110000100100001000110011111110101101111110000000110010011110110010010100000", + "101111001100111001011010101001000110010101000110000011110101011001110100101100111", + "101110101110011100101010100101001010010011001011110110000000111000000000000010110", + "011001011110101010110101000110100101111000100101001010001100110100001101000001010", + "000111100011001011100010011110010101000000010101001101011001110011011001111001001", + "000110010011100000000010010010011011001110011010111000101000000010101001110111100", + "010100111100100010011111110011111000100101111000100000110100001100110100110100000", + "101101010101000111011001001011001000010001001001100111100011011011100010101010111", + "010011111100010000111001000101001110011101001110010110000010101110000010100110010", + "101100000111010000110100100100101101111110101100001110011110110010011111000111010", + "110110110111001110110010011110010101001110010101001101011001100101011000011111101", + "000001001110011001100010010001110011001011110010111101111000000001111000010011100", + "000111111000100111101111111110011000101010011000111111010100011001010101111110100", + "111010001100111101111001100010100000010010100001100010010011011110010011100010111", + "101110101100010101001000101010001110010100001110101010101010111110101010101010110", + "111110001000101111111100100011010101111101010101100011100110110111100110100011010", + "101111111100101011101010111111101101000111101101111110100001110100100000111111001", + "101010011110000111111010000101100011001001100010010111010000000101010000000101110", + "011001100010000010100110000100100000100010100001101110001100001000001100000110000", + "010010010100011011000001011110111000001000111001001100001011001010001011011110101", + "110101101111010000010000110000110110000100110111011101111010110111111010110010010", + "011100001001011001001100110011010101100111010100100001100110101011100110110010100", + "110100101111111111101011101001001101011111001100000011100001001101100001110010010", + "001001001110010000011010000101100010010011100010010111010000111001010000011101011", + "000011111001100110100110000110000001010010000001101011001101100001001100011100011", + "110001001101010100100001011110111001101010111001001110001010100110001011001111001", + "101111101000001010110100110110010111100100010111011010111011010110111010101001001", + "111111010100101010101010110101010010100101010010100111100010001111100010101010101", + "001110110000000111001101110101101010111111101010010000100110001100100111110000010", + "011010010000000111111000011011100100110001100100001001010111111101010110010100010", + "100001101100111110000000111000100101010010100100110100001111100010001110011111111", + "100010010001000011000111101000111111001100111110100010001101100000001101000111000", + "011010101011011000010111001110110001100010110000100011111101010001111100101011001", + "101000001100110111001111001101010010000001010011011111100001001101100000100010100", + "011100100001010111101100010101001000111001001001011001100010001011100011110010010", + "010001011000011100111100110010000100010110000101111000010110111010010110011100011", + "011100111111101110000001111111100111010101100110111110101011100110101010111111111", + "000000001111011010100011100011011111101101011110100011101100100001101101100011001", + "111111100000001101110111101011010011100011010011101010010001010000010000101011001", + "100000100110001010100011100010100010100000100011100010001000001100001001100010101", + "101110100010000011000100111110010010111000010011111111011110001011011110111110010", + "101110101101000001100000001110011100110110011100100010101111111010101110101000010", + "101110101110101011011001001101111101010101111101111110110111100110110111000001100", + "100000101010011110111111110101001111010101001110111001100101110001100101010011001", + "111111101001111000111111110011001001111011001001011000000101001000000101111101000" + ], + "2": [ + "111111100100100010110101010110000010100100110101100101111110110011111000001111111", + "100000100101000111010011101110111110110010011011001001110001100101111111101000001", + "101110100011001001110000101011001011111100000010110011010000010001011010101011101", + "101110100101011101101010101000101001000101100000100101001100000001010010101011101", + "101110101000001111010000111111101001001001011000111110001011000110010100001011101", + "100000100110111100000001100011100001101000000000100010111010110110100001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001000110010111011100010010100100110011001100010001011010010000000000000000", + "001100111011001011001101111110011011110010010110111111111010101111100011111010000", + "101000011100000010111100010110000010100101010100000101100110110011111110010100100", + "010100100100000111001011001110111100110011111011001001100001100101111001001000010", + "001011011010001001111001101011001111111101100011010011010000010001011100100100011", + "101011100100111101100010001000101011000101100000100101001100000001010010111111111", + "001001010001101111000001111011101011001000011001101000001011000110010101100110101", + "011111111110011100000000010101100001101001100000010010111010110110100000001000110", + "001101001101011111010111011101111001001010110101100101100110101111101000000001000", + "111110101000010000011111100101000010101001101101001000100001101100111111010111001", + "011010001011010100000010100000110100010010100010110011010000011101001110111011100", + "101001101000011010110010100011010011011111110110100100001100000000010110111000000", + "000000010001110010111010110000001100100111011000001000001011000010000101101000111", + "110101100011001011000010111110011001110010110110010001111010110111100100001110010", + "101100000101100010110010010110011010100110010100100011100110101011111000001101010", + "000100111101101111011001001110110110110100011011001011100001001101110011010101101", + "011011001010101001100001101011000111111110000011010101010000111001010110110011100", + "000011111101101101110010111110110111000000000000111111001101100001001010111110100", + "000010001000011111011000100011100111001111111000100010001010100110001101100010111", + "011110101110110100000010101011100101101101000001101010111011110110110000101010110", + "101110001100010111010011100011110001001000110101100011100110101111101001100011010", + "101111111000001000011101111111011010101011101100111110100001101100111111111111001", + "011001011011001100000100111110110100010110100011010111010000011101001110001111100", + "101000111000011010110011110111010011011101110111000010001100100000010111101100000", + "000000010001111010111000001110001100100111011000001110001011100011010101010100111", + "110111111011001011000001000010000001110100110110010001111011010110010101010010010", + "101111010101101010110010010000000010100100010101000101100111001010011000111001010", + "000101111101111111011100000010101110110110011011001001100000001100010010000001101", + "011011011010100001100011011100110111110100000011110011010100111000010110001111100", + "000001100101111111110111110100010111001010000101000101001011100000101011100100100", + "000010010000000001011111110101101111000001111000101110001100100111101101010100111", + "011110110110100100000111001001110101100101000011110100111001010110011001011010110", + "101101001100010111010101110011000001000010110010000001100100001111000000111001010", + "101100101000010110011011111001111010110111101010101100100000001100100110001001001", + "011001001011011000000101001110010100011010100001110101010001111101010110001111100", + "101000100000010110110000010010100011011011110001000010001101100000001111101100000", + "000000000001111000111001101110101100110111011001101100001111100011001101010100111", + "110111110011001111000000101010100001101100110101110111111101010110011101010010010", + "101111011101101000110010110100000010100100010111000011100001001010000000111001010", + "000101101101111111011101111000001110101110011010101111100010001101000010000001101", + "011011011010100011100010110000110111101100000100110111010110111000110110001111100", + "000011111101111011110111111110010111001010000001111111001011100000101011111110100", + "000010001000000101011110100010101111001001111010100010001100100111101101100010111", + "011110101010100111000110101010010101100101000101101010111001010110011000101010110", + "101110001000010101010101100010000000111010111011100010100000001110000000100011010", + "101111111000010111111011111111111011100111100100111111000110001101000110111111001", + "011011010011011110100100101011110101010010111001011111010111111100110110010011100", + "101011111000010000110000010000100010010011101011000010100111100010101110011000000", + "000001001111111000111001111011101100110111001110100111100101100001101101000000111", + "110111111001001100000000110010100001111100101111110111000101010000011100101110010", + "101101000011101001110011111011000010100100001111100001011001001100000000100101010", + "000110110111111101011101111001001110111110000110101110110010001001000011110101101", + "011010010100100010000010100100110110001100011101110101110110111000110110011011100", + "000001101101111010110110000110010110001010010001011001001011100000101010011000100", + "000000001100000101111110010010101110101001110010001100001100100111101101001000111", + "011111101010100110100110100010010100000101000101101101110001010110011000101110110", + "101111000010010101110100010010000001111010111011000011001000001100000000101101010", + "101101100000010110011011101011111011000111100100100100011110001011000111110101001", + "011000010001011111100101001001110100110010100001001111101111111010110010010011000", + "100101111100010000110000010100100011010011111011011011010111100110101010011001000", + "001010001111111000010001111111101000010110010110110110000101110001101001000000011", + "011101111011101101010000110000100110011100011111111111000101001000011010001111110", + "100000000110001001000011111111000110000101110111111001011001010100000110000100100", + "011100110001111101000101111001001010111111110110110110111010000011000000010100010", + "010001010100100011010010100100110001001101001101101101011110110010110101111010011", + "011100101101011011111110111110010000101010001001111111110011100110101011111111111", + "000000001010000100110110100010101001101001111010100010110100100001101100100010111", + "111111101011000110000111101010010101100101001101101011100001010000011000101010110", + "100000100010010101110100100010000011111011011010100011101000011100000100100011010", + "101110100001010110011011111111111101000111100100111110011110010011000001111111001", + "101110101001111111111101010001110100110011000001111111101111100010110001001110010", + "101110101101110000101001111110100011010010111011011001010111101110101100100101100", + "100000100110011000001000111001101000010110110110110110000101111001101011100101001", + "111111100010101101001000000100100010011100011110101101000101001000011011010011000" + ], + "3": [ + "111111100100100011010111000100111011100001110010000111111001010011111100001111111", + "100000101100000111011001111011010100100101100000110001110010100111111011101000001", + "101110101011111011110100011110010001110010111011001010010010010010001110101011101", + "101110100011010001010001010110011101000110111000110110101100000110100110101011101", + "101110100110111100010110111110100011100000101000111111101011000001110000001011101", + "100000100100010001001010100010010111010010111110100010010010010010001001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000100010011101010100010101110111011100111100010100111110010101111000000000", + "011101100010001010001101111111110111000011000000111111100101001111111100100000110", + "110110001100100011010110101000111011100001110010101001111001010011100001110101000", + "000111111100000010111001111011010100000101100000101111111010100111100010101101101", + "101000010011111000110101111110010001110010111010110100011110010010010011100011110", + "011100110011010100110000000100011101110110111001001100110010000110101100100000100", + "100011001110111100110111001000100010001000101001001011110101000001101011110001011", + "110110100100010011101011100000010111001010111111101010000000010010010010000011010", + "011010010001111011100111101001000010000110001010011101001000011111001110101010110", + "001000111001010001010110111010101101011000011010111010111110010100111001110010001", + "000000011010010111000000011110001101110111000100011111001111100101001001011101100", + "101110110001101101010100010110111001111000001101000010011111001010011101011000000", + "111111001000100100001110100101001011111001100001101101001001001001001010101000111", + "100010100101100011100110110010101010011000001111111000011010110000011010010110010", + "001110000011010111011010100101001110000101000101100000000110101100000110010100100", + "100001111111001000110000111011001101010001100101010111001001001001001111001000010", + "100100000111001100110001011111110100111000111101001111111100101001111110000100011", + "100111111100111101011011111111000000100101110110111111010011111001010010111111111", + "010010001001001111011010100011010110101100001111100010010100111110010100100010111", + "011010101111011101100010101010001111000110100010101010101001111110101001101010110", + "011110001011001001100010100010100110001100001100100010100100100100100100100011010", + "110011111100111000111101111111111001010011010100111111000001101011000000111111001", + "110111000011100001101101100001111000101011101011000000110000011010110001101000010", + "000010101010100101011101101000100000110100010001001000100100100110100101101011111", + "111011011110010111101010011010011111100011100110101110100111110000100111010101000", + "011000110111101011101011011111100110010011001000010101100101001001100101010011001", + "111100010100100010110001000100100011000001111010001101111001010101111000100001010", + "000011101011000110111001001001101100011101111001001011110010100011110011011001101", + "101010000001111111010000000001000000111011111010001010010010000010010011110011100", + "011110110110010101010100110001010100111111110000011100101100011110101100010010100", + "101100011101111010110101110011001011110001110000011011101011011001101010110011001", + "110100111010010011101111010110110110000011111111111110010010011010010011011101001", + "010110010000011010000111110111001010001111001011000011001010010111001010111000101", + "000011101111110000110011011100011101001000011011001110111110010100111110001000010", + "001000000110110100000110101001100101110110101100111011001111100101001110010111100", + "101100101100101011010001100011110001110001011100100110011111001010011110110100000", + "110010010001100100001110001110010011100001100001010001001001001001001000101000111", + "101011100111100011100001101000001010001000000110101010011010110000011010100100010", + "000011000111110111011010100110000110011100011101110110000110101100000111011110100", + "101101100000001000110110101101001101011001100100100101001001001001001000000110010", + "100001010110001100110101010010011100111110111101110101111100101001111100001110011", + "101111111011111101011110111111110000100001110110111111010011111001010011111111111", + "010010001101001111011110100010011110101101010111100010010100111110010101100010111", + "011010101011001101100111101010100111000011101010101010101001111100101000101010110", + "011110001101010001101010100011111110001101101101100010100100100100100100100011010", + "110011111100110000100011111111010001010101011101111111000001101011000001111111001", + "110111010001010001111100010010110000101001101010010100110000011010110000110010010", + "000011110101110101000010010110100000110100101000101100100100000100100101100001111", + "111010010101011111101110000101000001100001100000101011100111010010100110111001000", + "011010110101001011110000100011000000010111000110101010000100101111100101110011001", + "111110000000100010101011011101110011000110111101011100011000110011111000110011010", + "000010111000011110111101001011111100011000110100011011010011100111110011110011101", + "101000000011111111010101101111001010111011011100011110110010010011010010011101100", + "111100101001010101000110100000111110111010110111100010101100000111001100111000100", + "111100011010011010100111001001101111110000110111001111101011000000001010101001001", + "010111110011000011100100100010010110000110011010011010010010010010110010010111001", + "010110000000110010000011101110101100001010001011000111001010011110101010110100101", + "000011111110001000110011111000011111001000011011100000111110010101011110001000010", + "101000001110000100011101101111000101110110001101110011001111100100101110100101100", + "101110110101100011011000100110010111110111011101101110011111001011111111111110000", + "110011001000111100010110110100010001100000000011001101001001001001001000100110111", + "011010111111100011101000010110001010001100000101011100011010110000011011001110010", + "100001010111111111001010100100000010011101011110100010000110101100000110000101000", + "011100101000010000110111111001001111011101000001000001001001001001001000001101110", + "010001010110000100100101011000011110111100111101110001111100101001101101100011111", + "011100110011100101011110111111110001000101110010111111010011111001000011111110111", + "000000001101011111000110100010011100001101010100100010010100111110010100100010011", + "111111100011010100101111101010100001100001101001101010101001111100100000101011110", + "100000101101010011011011100011111101101101101111100010100100100100101100100011110", + "101110100100111101010011111111010000110111011110111111000001101011011001111110101", + "101110101001001100011100100010110100001011101110001010110000011010101001010010010", + "101110101101111110111011111000100011110000101110011100101100100100110100110011100", + "100000101101011000111111001011000100011111100111011010101011110010100111010011001", + "111111100101010010001000001111000111110011000100011111111011001111100101111101000" + ] + }, + "17": { + "0": [ + "1111111011000110110010110111101010100000001101011000000101101011000001101010101111111", + "1000001010001001100011000101100110001110000011010110000100010010110000011011001000001", + "1011101001000010010011110011010001000100100000110101111000001110101100000010001011101", + "1011101011101110101100101010100001110100111000001101011011011001101011000001001011101", + "1011101000011101100111110100111111111010110110000011111110101000011010110010001011101", + "1000001000111111010001110011100010111001010101100000100010110100000110101101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011110010110101011101100010010010010110000010100010111000011010110000100000000", + "1011011100000001010001001111111111111001010101100000111110110100000110101100101001011", + "0110000101000100110100110110101111000001101101011000000101110011000001101011100111011", + "0110101010001011101111001101100011001111100011010110000100000010010000011010001011010", + "0101100011000000000011111010010100100100100100110101111000001110001100000110000010110", + "0110101001101000111100111010100010010100111110001101011011011000001011000001010010001", + "1101100110011011101111110101010000011010110000000011011110101001111010110000111100000", + "0000011100111101011001111010110111111001010011100000110010110101100110101000111101100", + "1000110110101101101110010110111111001001001001011000010101100011100001101101101111011", + "1101011010110001100111100000011111001111100101010110000000000011010000011100010001010", + "1011000001001101011001000010100010101100000110110101101000011111001100000000010010110", + "1101011000010000110100010110111000010100111110001101011111011000001001000011011000001", + "0011100101110110110101001101000110010010010010010101001110111000111001110110111100000", + "1011011100000111010001010110101001111001010011111110110110110101100001001010100111100", + "0110000101000000110100101110101111000001101011000110000101110010100110001101111110011", + "0110001010101011101111001100000011001111100101001010000100000011010110111000010011110", + "0101010010100000000011111010110000100100100100100011111010001110001111100000010011110", + "1110101001101010111100111011000100010100111110010011011001011000001100100111001010101", + "0101010111101011101111110101110100011010110000011101011000101001111101010110100101100", + "1000111100100101011001111110110101111001010011111100110100110101100000000110100100000", + "1100110111000101101110010011011101001001001000101110010011100011110010000101111110111", + "1101111110101001100111100000111111001111100100101000111110000011001111100100111110010", + "1110100011011101011001000110100010101100000111001010100010011111010011111000100011010", + "1000101011010000110100010100101010010100111111010001101011011000000101111011101011101", + "0000100010011110110101001011100010010010010011110100100010111000100001011111100011100", + "1010111110010110110001010110111111111001010010011111111110110101111001010010111110100", + "0101100000101000010100101111000101000001101010100110011001110010111110010101001010111", + "0100011110000011101110001100010101001111100100001011111000000011011110100001000100110", + "0101110100101001100011011110010100100100111101000011100100001010010111101000100101010", + "0010111111111011011101111110011100010100100111110011101011011110010100111110011111001", + "1101110011110011001110110100011110011010101001111101011010101111100101001110010001110", + "0010101000110101111001011000100011111001000010111101000110110111101000010111110010000", + "1010010001000101001101010011111001011001010000101110000001100101111010000101001000101", + "1011101100100001100001000101000111010111111100101000110000000101001111100101000100010", + "1001000101000101011001100010101000110100011111001011101100011001010011111000100111000", + "1111001101011001000100010101001110001100101111010000101011011010000101111011111111110", + "0001000010011111001110101000100010000100001011110101011011111110100001011111010011111", + "1101011010010111000001010011101001100111001010011110000111010011111001010010010010111", + "0100100000101000111000101111001101011111110010100110000000010100111110010100101010101", + "0100011110000010011011001110010101010011110100001011110000101001011110100000000100101", + "0111110100101001101100011110000100110011111101000011101101100000010111101001000111001", + "0000111101111010101010100110000100001011000111110011101010100110010100111111111101010", + "1111110111110011111001110100000110000101001001111101011011010111100101001111110011110", + "0010101000110100101111100000110011100100100010111101000110001111101000010110110110011", + "1010010011000000000001100011110000111110010000101110000000001101111010000100101100100", + "1011111110100001110001101101111110110000011100101000111111111101001111100100111110001", + "1001100011000011001111011010100011010011111111001011100011100001010011111001100011000", + "1111101011011011000010001101101011001001001111010000101011100010100101111010101011110", + "0001100010011011011010111000100011100101001111110100100011010110000001011011100011111", + "1101111110010001000111001010111111100110101100011111111111001010011001010100111110111", + "0100110000101100100010100111001100111110010100100110101010001101011110010011111000101", + "0100111010000110011001000111100111110010010010001010011010111000111110100011010110101", + "0111100000001111101100001110110010010011111001000011000111100000110111101101010101001", + "0000011001011010101010100111010000001011000001110011100000100111110100111000001101010", + "1111100010110101111001111100010110000101001111111101110001010110000101001000100011110", + "0010001101110010101111110001110111100100100100111100101100001110001010010101100000011", + "1010000101000010000001100011011001111110010100111000101010001101011001000010111000100", + "1011001010000001110001111100101011010000011010110110111011111100101000000011010110001", + "1001010101000011001111001011000110110011111001010101000111100000110100011110010100100", + "1111101000011111000010011100011100001001001001001101000001100011100011011000001100110", + "0001110110011001011010111001000000100101001111100011110001010110000010111001100011011", + "1101001100101111000111001011011111100110101100000000001101001010011110110101100000011", + "1100110001011110100010100111101011011110010100111000101010001101011001110011111001001", + "1000001011000100011001000111100111010010010010010110011010111000111000001011001111001", + "1011110000100111101100001010010100010011111000110101000111100000100100000111001100101", + "1000011001001010101010100101010100001011000000001101100000100111101011000000011100010", + "0010100010011101111001111000110000000101001110000011110001010110011010110000111010010", + "1110101101101010101111110101010001100100100101100000101100001110000110101101111001111", + "0101010101010010000001100001111001111110010101011000101010001101000001101010100001000", + "1000001010001001010001111100111111010000011011010110111111111100110000011011111111001", + "0000000010101011101111001110100010110011111000110101100011100000101100000110100010100", + "1111111010000111100010011001101010001001001000001100101011100011101011000001101010010", + "1000001010001000011010011111100010100101010110000011100011010010011010110001100010011", + "1011101000111111100110001111111111100110110101100001111111001100000110101101111111111", + "1011101011000111100011000010010101011110001101011001000000001011000001101011110101001", + "1011101011011101011001000001010001010010000011010110110010111010110000011011110011010", + "1000001000111110001111001000110000000011100000110100101111100110101100000110111000100", + "1111111011010011101110000010111000010011011000001101101100100001101011000000100000011" + ], + "1": [ + "1111111010111010111101111001111001011111101100100000001011101100100000010010101111111", + "1000001001110011011101001000010111010011100010001110011010010001110010101011001000001", + "1011101010111000111111011100110100100011100101010100100110001000101111100010001011101", + "1011101010010111111100001011101100010011011111101100100001011111101100100001001011101", + "1011101011100001100110111011111110011101010001100010111110101110011101010010001011101", + "1000001001000101101011100110100011111100110010100001100010110110000000001101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000000110101001111011100010010101010011100011100010111110011001010000100000000", + "1111001011101011010001100111111111111110110010000001111110110010000001001100110011101", + "1111110000111010011101100000011001000110001010111001001011110101000110001011111000100", + "0000111101111010111111010000110111001010000100010111111010000000110110111010010110100", + "1100010000110001111101001101110100100011100101010100000100001000101111100110110101011", + "0000001110001110111010001010101000010011011111101100100011011111101100100001101101001", + "0100100011110000100110111011000100011101010001100010010110101110011101010001000011100", + "0100001100011000001011100110000111111100110010100001001010110110000000001101000000000", + "0000110100011101001100100000011111001110001000111001101101100101000010001010001000111", + "1010011111010001100001010001110011001000000100110111111000000100110111111010101110010", + "0000010100000110010000001101110010101011100111010100100000011000101011100111101101010", + "1001101101010111110110001011101010010001011111001100100111011011101101100000110101101", + "1000100010100100001111111011000100010101010011100010110110111110011001010001010011100", + "1110101001000111010111100111000101111110110010000001001110110010000001001100011000100", + "1111110100101011111101100000011111000110001010111001001101110101000110001010000000111", + "0010111110101100100100010100101001001010000100010111101100000000110110111011101110110", + "1110010100010010111000101011101011000101111100110010011001001100111110100011100101010", + "0011101100101010111011101100110001110101000110001010111010111001110101000111110101001", + "1100010111110000100110011001010101111011001000000100011111001000000100110111011011100", + "1100011000011010010010000000011110111000100011100101010010011100101010100111011110000", + "0111110001111111010101001110000110111001010101001111110100001011111001100100001000111", + "0100111111110001100000111111111110110111111011001001111111111011001000000100111110010", + "1110100011000110010000110111100011010100011000101011100011100111010100011001100010010", + "1001101011110111111111110100101011001100101000010000101011100000000011011010101011001", + "1100100010100100001100000101100011100010001110010100100011010000100010111110100011000", + "0010111111000110010100001000111110000001001101111110111111001101111110110011111110000", + "0011100100100010111011011011010000111001110101000111111010001010111001110100110101010", + "0010111110100101000010101111010100010111110011001010011110111011011000000000011011000", + "1010000000011010011110110010111111010100111000100010010011100110010100001001011100111", + "1111001000101010011001100100000111101100100000010011010100100000010011011111101110011", + "1000100111111001100000000000001011100010101110011100100001010001100010101111101000010", + "0110001001010110100100011001100010100001000101111100101000001101101110110111101011111", + "0101100100100110101011011111010010111001010101001111111110001011111001100101010001000", + "0110011010110011000010111111011100110111111011001000001101111011001000000101010101001", + "1101010001101101011110110110111001010100011000101010010101100111010100011000111110100", + "1010101100111101000001110100001001001100101000010001000011100000000011011010000110010", + "1110110000111001101000000100001111100010001110010100100011010000100010111110001010011", + "0011101101000001111100001001101100000001001101111110111111001101111110110011100011111", + "0000110100100010101011011011010100111001110101000111111000001010111001110101001011001", + "0001111011000100010011101011010010010111110011001010011000111011011000000001000101001", + "1000000000001111011111010100111000110010100001000100010100100010000101001100100100101", + "1110001110101100010000000010000000001010111001110101010011000110001010111000011110010", + "0111100101111001110000100010001110000100110111111010100010110111111011001000010000010", + "1111001101110010100101111111100101100101010100111000101110100111000100011101110011111", + "1001100101100010110000110001001101001110001000111001101001100101000010001011001001000", + "0101111111110111001001010001111111001000000100110110111110000100110111111011111111001", + "1001100011001111000000001100100010101011100111010100100010011000101011100110100010100", + "1110101010011111001110001011101010010001011111001101101011011011101101100001101010010", + "1010100010111001101111111010100010010101010011100011100010111110011001010000100011011", + "0011111111011000011111100111111111111110110010000000111110110010000001001101111110011", + "0100000110110011001101100001011001000110001010111001001011110101000110001011011110101", + "0101101101011101110101010000010111001010000100010110011010000000110110111010110000110", + "1100100100011110111001001100010100100011100101010101000110001000101111100110110011000", + "1110011100100100110010001010001100010011011111101101100001011111101100100001101011001", + "1110110101101001010110111011100010011101010001100011110000101110011101010000000111100", + "0011001011110111010011100111100001111100110010100000101100110110000000001100000110000", + "0000010001000101010100100001111001001110001000111000101011100101000010001011011110111", + "0110111110011011110001010001010111001000000100110110111010000100110111111010010110010", + "1011110010111101111000001101010100101011100111010101000110011000101011100110010101010", + "1100111111111100110110001010001100010001011111001101000001011011101101100000001101101", + "1000000011111000010111111010100010010101010011100011110000111110011001010001100011100", + "0001001000101001011111100111100001111110110010000000001100110010000001001101100000100", + "0110010111010010011101100000111001000110001010111000101001110101000110001011111000111", + "0111101100100111100100010101010011001010000100010110011000000000110110111011010110110", + "1110110101001110100000101010010011000101111100110011000001001100111110100011010101010", + "1100101001000100110011101100001011110101000110001011100110111001110101000110001101001", + "0001000010001001000110011001100101111011001000000101110111001000000100110110100011100", + "1110101000010001010010000001100100111000100011100100101110011100101010100111111000000", + "0101010010100011001111001111111110111001010101001110101100001011111001100100100000111", + "1000001010011111101010111111111110110111111011001000111111111011001000000101111110010", + "0000000010111111110110110110100011010100011000101011100011100111010100011000100011010", + "1111111001111100111001110100101011001100101000010000101011100000000011011011101011101", + "1000001001110000110000000101100011100010001110010101100011010000100010111111100011000", + "1011101000101001011100001001111110000001001101111110111111001101111110110011111110000", + "1011101011001010011011011011001010111001110101000111100110001010111001110101110101001", + "1011101010101110100010101111100100010111110011001011010110111011011000000001110011010", + "1000001011010111100110110010000101010100111000100011001111100110010100001000111000100", + "1111111011000100010001100100111111101100100000010010101100100000010011011110100000011" + ], + "2": [ + "1111111001001110001111100110110001011111000110000111101111011101110111011010101111111", + "1000001000101001100011001010010000110011000011100010000110001110101110001011001000001", + "1011101011101011111110101100101010100011101000100110011010000011110110000110001011101", + "1011101011011000000110011100111000010001101000000011001101011100010111011101001011101", + "1011101000000001101001101010111110101111110011110101111110000111001100000110001011101", + "1000001000111001010100000101100010000001001000001110100010000010010110000001001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000000001111100000110100010111011011100110110100010001110001110001111100000000", + "0001101100100011101001100001111110000111101010010100111111100101001111100101100001100", + "1000100000011011011010111011100101001010010011010011110010001000100010001000011010101", + "1011001101111100110110101111000010111110010110110111000111011011011011011011011011000", + "1010100110111110101011101001110011111110111101110010111011010110011011010110101110110", + "0001111000001101010011000101100001000110111101010111111010001000111010001001000101100", + "0101110111010100111100111101000001101010100110100000111111010011100001010011000000011", + "0101011111101100000001011011110001000110011101011010000101010110001011010110010000101", + "1001010000100101011010100001001100011011111000010010111100101010100010101011001010111", + "0010001010010101011111010111000000110101011100100010011101010011111001010011011110011", + "1010110010001001001110101111110111011110000001000000100000011010110000011010001000111", + "1111101001011000010010001101100110011010110010010010000011110111111111111111111110100", + "1111010000001000011111011101000101001110001011000100001101101000110101100000011000000", + "0011101010011111000011010011110011010110101111000100001000000010110000011011010110110", + "0001010011110000011110011101100101001000000010000100111011101111011101110111100101011", + "0011101000011010110111101111000111110110101011101100010011110000110101100000100111111", + "1011000010010111001000110111011110001111101010000001001110111000111001111001011001001", + "0101101111110001111011110011100100010101111000000111011001110111011100010111111011111", + "1100000101111111111100011011000001101100110111110110110110101100000110001100110110001", + "1111111010101010000110011111110100001100100000000001010001101101101100001101111100110", + "1011110100101100111101111001100001101010100111111001001001000100010000100100100100100", + "0100111110101001110101100101111111100000010001101011111110101100000111001101111110000", + "0011100011000010001000001110100011011010011000011111100011100101001110000101100011001", + "0111101010111110010011001010101011010010000111010001101011000100010001100100101011011", + "1101100010100001011110000000100010111001011100111110100010001110001110101110100011111", + "0111111111000011001001100001111110000111111010011100111111100101001111100100111111101", + "1000100100111011111000111110010101001000000011011010001010001000100010001001001000101", + "1001101011011100010000101000010100111010001110101110001101011011011011011010001100000", + "1001000010011110001111101010000101111000111101110011110001010110000011010110111100110", + "0000001100101100010001000001111001000100110101001110101000001000100010001000101110100", + "0101010110110100111110111000110101101100111110110001101101010011111001010010001011111", + "0101101110001101100001011001100011000000010101000010110101010110000011010111111101001", + "1001110100000011011010100100010010011101100000000011110010101010101010101011001011011", + "0001001101110001111111010111010000110001011100111011111111010011111001010011101101011", + "1010110110101011101010101100000111011010001001011000011010011010110000011011000010111", + "1101001111111101110100001100110000011110110010010010101011111111111111111001110000100", + "1111110100101011111001011100110011001110001001000101000001100000110101100111110010000", + "0010011110111110000011010011101011010110100111111100111010011010110000011101001100110", + "0001010010010101111010011100010001001000011100110101001011110111011101110001001111011", + "0011111000111001110111101111010101110110100110010100000001100000110101101011101011111", + "1011110110010100001000110110000000001111110101110001100000111000111000110011111001001", + "0101101001000111011011110011110100010101111010111111011111110111011101101111101001111", + "1100010000000101011100011010110001101100111001001110101100101100000110110100110100001", + "1111101111100001100110011110100010001100100011000000111001101101101101111100100010110", + "1011110000011001011101111000010111101010101001100001100101000100010001010100110110100", + "0100111110000010110101100101111111100000010000101010111110101100000110111100111110000", + "0011100010010111101000001110100011011010001110000110100011100101001111100100100011001", + "0111101010011111000011001011101011010010000011010000101011000100010001000101101011011", + "1101100010101010101110000001100010111001000110100111100010001110001110001110100011111", + "0111111111000101010001100001111110000111101010101100111111100101001111100101111111101", + "1000010110101001111000111110101101001000011111001010011100001000100010001000001010101", + "1001111001001111000000101000000000111010010001010111011011011011011011011010011110000", + "1001010110011011000111101010110111111001011011110101100011010110000011010111001000110", + "0000001110100110011001000000000111000100010100001110000110001000100010001000011110100", + "0101000000101001011110111000000101101101011000110010100111010011111001010010011001111", + "0101011110000101010001011000110011000001110001000111010111010110000001010111010111001", + "1001010010011110001010100100100100011100100010000110011110101010101000101010100101011", + "0001001011110011101111010110000110110001111100011010110101010011111111010011000111011", + "1010010010111011110010101100111111011011001101011100000110011010110110011010011000111", + "1101011101101011110100001100100100011111010101110111110111111111111011111110111010100", + "1111100000101101100001011100000001001111101101000101001101100000110011100001111110000", + "0010011110110100011011010010110101010110100110011010011100011010110110011010001100110", + "0001100110001101110010011101100001001000011100010110011011110111011011110110111101011", + "0011101000110011100111101110000101110111000111110001110001100000110001100001100001111", + "1011000000001100011000010110010110001110010000010010010100111100111000111000110111001", + "1101101111010111001011010010000011110100111000111110001001110001011101110111100111111", + "1100100100001101000100111010001000001100011011101110111000101010000110101100101000001", + "1110101111111001100110011110110110101101000111100111110101101111101101101100101110110", + "0101010100001001000101011001000100010011001001100001111001000110010001000101011100100", + "1000001000000010101100010100111110010000010000101100111110101100000110101100111110000", + "0000000010011111100001110110100010101010001110000101100011100101001111100101100011011", + "1111111010010111000010110010101011010011100011010101101011000100110001000101101011000", + "1000001000111010101110111001100010110000100110100101100010001110101110001110100011100", + "1011101011000101011001001000111111111110101010101101111111100100101111100101111111110", + "1011101010101001100001100110010011010000111111001011111010001001000010001001101100101", + "1011101001001111010001001000110001100011110001010000101011011010011011011011001110011", + "1000001000011011010111101010100111001001011011110011110011010110000011010110100110111", + "1111111000100110001001100000010000110100110100001000110010001000100010001000010010101" + ], + "3": [ + "1111111000111001001100010100001000100000111010110000101100101100011000101010101111111", + "1000001001001100101111101011010001100110000001101111110110001110000000001011001000001", + "1011101011110000111111010111100110010111111100010000101000011111010001011010001011101", + "1011101001101101000101100110000001111010100111101101100010000110110011100101001011101", + "1011101011101101011010001001111110101010110010000111111111010011100110110010001011101", + "1000001010001010010100010111100010010111111101010010100010110101101111010101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000100011010001000100100010001001101011100111100011110001101010110000000000000", + "0100101010000011100111011111111111100101111010001100111110000110110011100110010110100", + "0110110101111001001100110101001010100000111011011000000010101100011001001100111110001", + "1010001111010011010000110101001100111001111111010000010111110001011111010001110000101", + "1101100010110000111111010111101111010111111100010001010100011111110001111111100111111", + "1000011101010010111010011001010110000101011000010011100101111000101100011000110101010", + "1010010100001101011010001000001000101010110010000111001011010010000110110011000001111", + "1010101011010101101011101000001111001000000010101101101111001011110001101010001101010", + "0010000001100011110001000100000111001001001011100110101110110001001010010000010000000", + "1010011011100011100111011111111010100100011010001100011111100111010011100110001010001", + "0010110010011000101100110101001010100001011011011000000101001101111001001100111110001", + "1110001101010011110000110101001011111001011111010000010001010000011111010001110000110", + "1001100000110000111111010111101101010110111100010001010001111111110001111111100111110", + "1100011011010011111010011001010100000101011000010011100100011000101100011000110101001", + "1010010010001101011010001000001010101011010010000110001010110010000110110011000001101", + "1010101011010100111011101000001101001000100010101100001111101011110001101010001101001", + "0010000011100010111001000100000011001001110011100111001110010001001010010000010000011", + "1010011001100011001111011111111010100101010010001101111111100111010011100110001010010", + "0010110010011001011100110101101110100000101011011001000101001101111001001100111110011", + "1110001101010011011000110100101011111001001111010001110001010000011111010001110010110", + "1001100000110000111111010110001011010110100100010000110001111111110001111111100101100", + "1100111111010011110010011001111110000101001000010010111110011000101100011001111111001", + "1010100010001101010010001000100010101011010010000110100010110010000110110011100011101", + "1010101011010100101011101000101011001000100010101101101011101011110001101011101011001", + "0010100011100010101001000101100011001001111011100111100010010001011010010000100010011", + "1010111111100011000111011111111110100101010010001101111111100111001011100110111110010", + "0010010010011001001100110101110100100000101011011001000101001101100001001100010000011", + "1110101101010011010000110100010101111001001111010000010101010000010101010001111000110", + "1001100010110000111111010110001101010110100100010000001111111111101011111110001001100", + "1100111101010011110010011000111100000101001000010010010000011000110010011000101001001", + "1010010000001101010010001000111010101011010010000110111110110010011000110011101101101", + "1010001101010100101011101100110001001000100010101101111011101011111111101010100111001", + "0010000101100010101001000100101011001001111101100111110000010001010000010001110100011", + "1010011111100011000001011110110100100101010110001100101111100111001101100111011110010", + "0010010010011001001000110111110100100000101111011001000101001101100111001100010010011", + "1110101101010011010100110010010101111001001101010000010101010000010001010001111000110", + "1001100010110000111001010010001101010110100110010000001111111111101011111110001001100", + "1100111101010011110010011010111100000101001010010010010000011000110010011000101001001", + "1010010000001101010100001000111010101011010000000110111110110010011000110111101101101", + "1010001101010100101111101000110001001000100110101101111011101011111111101110100111001", + "0010000101100000101011000110101011001001111001100001110000010001010000010101110100011", + "1010011111100101000001011110110100100001010100001010101111100111001101100001011110010", + "0010010010011101001010110001110100100010101101011111000101001101100111001010010010011", + "1110101101010001010000110000010101111001001011010100010101011000010001010011111000110", + "1001100010110000111001010010001101010110100110010110001111110111101011111000001001100", + "1100111111010011110010011010111110000001001010010100111110000000110010011110111111001", + "1010100010001001010100001001100010101001010000000000100010101010011000110101100011101", + "1010101011010000101111101001101011001100100110101001101011110011111111101000101011001", + "0010100011100000101011000110100011011001111001100000100010011101010000010110100010011", + "1010111111110001000001011111111110101011010100001010111111111001001101100001111110010", + "0010110100000001001010110000111100111100101101011110010001010011100111001010001000011", + "1110101111011011010000110001100101100011001011010101100001001010010001010011010010110", + "1001000100100000111001010010010001000110100110010110011011110001101011101001100111100", + "1100111011010011110010011011110100010001001010010100101110000110110010001110001011001", + "1010010110011001010100001001110100110001010000000001101110101100011000110100111111001", + "1010101101010000101111101000101011001100100110101000111011110001111111100000111100001", + "0010100101111000101010001110110101011001111001000001110100011111010000011110010000111", + "1010011101110001000000100111100010100011010100001011010001111001001101111001111111110", + "0010110100010001001011111000111100111100101100011110010001010011100111010010000001111", + "1110101111010011010001111001110101110011001010110101100001001010010001001011001011010", + "1001000100110000111000000010000001000110100110010110011011110001101011110001111110000", + "1100111011010011110010110011110100010001001011110100101110000110110010000110010010001", + "1010010110011001010101011001110100110001010001000001101110101100011000101100101110001", + "1000101100010000101111111000101011001100100110001000111011110001111111110000110100101", + "0000100100111000101011110110111101011001111001000001110100011111010001111110000001111", + "1001011101010001000001010111111011100011010100101011000001111001001100011001101111010", + "1101110100110001001011101000111101011100101100111110001001010011100110110010011001111", + "1110101110110011010001001001111100010011001011110101111001001010110001101011001011010", + "0101010100110000111000010010011001000110100110010110010011110001001010010001111110000", + "1000001010010011110010110011111111010001001011110100111110000111010011100110111110001", + "0000000011011001010101011001100011010001010001000001100010101101111001001100100010001", + "1111111000110000101111111000101011001100100110001000101011110000011111010001101010101", + "1000001000011000001011110110100011011001111001000000100011011111110001111110100011111", + "1011101010110000000001010111111110100010110100101011111110011000101100011001111111010", + "1011101000110001101011101000110100011100101100111110010110110010000110110010110011101", + "1011101000110011010001001001001010110011101011110101001001101011110001101010010001010", + "1000001010110000011000010010101011000110100110010111100010010001001010010000110100010", + "1111111000010011110010110011000011010001101011110100000011100111010011100110011110011" + ] + }, + "18": { + "0": [ + "11111110110101011011110101100100101001111100101001111010100101001111100101001111101111111", + "10000010100000111001101100000001000010111101000010111101101000011111001010011001001000001", + "10111010000110111100110111000101110000101000001100111010111011001001011001001000001011101", + "10111010110000000001000101001011110100101110000010110011101110011010101000011010101011101", + "10111010001100001000011001011111100111001101100001010011111010000110110100000001001011101", + "10000010010011010010010111101000101111010101011001001110001101001001100001001101001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110100010001100100101000110101000010111001000010001111001010110111001001000000000", + "10110111010001011101010110001111100111110010100001110111111100111111110100111111001001011", + "01111101110101111111110011111010110001111100101111111110000101001110000101001110111101100", + "10011010100000111101101110000001001010111101000100111110001010011110001010011110111000000", + "01010100100110011100110110101011110001011000001100111001011001001001011001001001101000111", + "00100010010000100111000101111101101101010110000010110010001000011010101000011010010110010", + "11110100101100001000011101010110000110110101100001010110010100000110110100000110010100100", + "11110110110011010000010011000010110110001101011001001000000001001001100001001001001000010", + "10100001100000100111010101001110100111110010001111110001110000111100000001111100100100011", + "10011011011110100000111011001111001100011001001100011101000000110010011001010010111111111", + "10100100001110111100101000110101101100100001110100100011000111110101011110010101100110111", + "00101111110110000011011000010111111010001111110010001010110100001000111100100000001110110", + "00111001010101110001011010000110011000110101100000110110111100000100100100101100000101010", + "11111011000001101100011110100111010000001101011000001001010011000001101011011001001101001", + "01000001001110101110101011000000010110000011010110000000100010110000011010101000100011110", + "10011011001100100101111110001111011101100000110101100101101100100100100100110100100110011", + "01111001111101101100001110010100111100101001010000101010101011100111110011100111011100100", + "00101111011010010010001101111000111010101111111100101011110110000101001110000100101010001", + "01001001111001010001000101011001100001001100011111001110101010011001010010011001101111010", + "10110110100001011100010011001101100001010100101111010001101111011010100111011010110001101", + "01001100100111000101001100110001101110000010010110000000001010111010010010111011110101100", + "00011111101100000000110111001111111101100001010101100111111110110100000110110100111110100", + "10011000110101110010000010011000101101011001101101011010001001110011000001110011100010101", + "11101010111010010011001010101010101011010111100011010110101010000010010010000010101010101", + "10011000110000000110111101101000110101000010111101000110001111001010011110001011100011001", + "10111111100001001001111100101111100111110010100111110011111100111110010101011111111111010", + "01110001001111100100111001101100010001111100101001111110001101001111100100101110010001010", + "00010111101100110011111110110110101010111101000010111010010010010111001010111110110011000", + "00010100101110011110010011110010110101011001010101011010000001000101001001101000101000001", + "11100010111100110110100001100111101011010111111011010101110000000100110000011010100101110", + "11111001111000011110001111100110000000110100011000110101100100011000101100000111000110110", + "00111010001100001000010001101100010000001100101000001001100001011011001011001000011110001", + "00100101110010110001001011001110110011110100001011100111010001111110101011111100010010000", + "11011010001101100100010001000111000010011111001010000101011001010011111111010011110011100", + "10100100000111111111100010110111011010100111110010111100010110010100111000010101001010111", + "10010011111101000101001000000000000100001011110100010100100100101001111000101000000100110", + "01000000001010010011111110011111000000110101111000110111101100100000100100100001000101010", + "00100110100110001101100010110100101000001101000000001110101011000111101011000111111111001", + "01001100101110101000111001001000100110000011001110000011010010110110011010110111110000000", + "01010110001001100101111100000001110101100000100101100100001110100110100110100111110011100", + "11011100101001101010010000000111101001011111010000111100001000100101110000100101001101011", + "01001111111011011010011111110111110101010001111100110011101001100101001001100101000011010", + "11111000001010011011000110101110110110110010011111010001111101111001010101111000100001010", + "01111010100110011110000011011001011110001000101111001111111011110010100011110011011001101", + "11000100111100110101000001011101110110000011010110000001011010010010010010010111100011100", + "01111011001011111001100111000001000101100000110101100011000110101100000110101010001010100", + "10011101110101110010110011000011111101011000001101011000101001101011000001101100110011001", + "11101111111110001011100010001111100011010110000011010011111000010010010010010001111111001", + "10111000100101010111111101101000111100110010111100100110001101001010001111001100100010101", + "10011010100001110001000100101010110110001010100110010010101010111110001100111001101010010", + "01001000111100001101110000001000110000000100101000011110001011001111111101001000100011100", + "00011111101010011111101110101111101011100101000011111111111110011111100010011001111110000", + "00011101100110011010011010001000011101011000001001011001000001001001100001001001000110111", + "11001011111100101001010101101100101011010110000101010100110000011011010000011010001110010", + "10101101011001011101011000100001011000110101100110110010101100000111001100000111000100100", + "11000111100100010000111111011011000000001101011110001101001001001000001001001001001100010", + "01000101110011000001001110010010111011110100001010010000111001111100111001111101100010011", + "01101010001100011110101011111011100010011111001011111101100001010011100001010011100101111", + "11100100100111010000101111101101101010100111110011000000100110010100100110010101111110111", + "00101010111100101011011011101001000100001011110101001001110100101001010100100001001000110", + "11010100001011110111110100010100110100110011100100110100101101100100001100100101001011010", + "00011110100011100010001111100000110110001011011110001111101010100000001011000000010101001", + "00110001101101111011101100100101001000000101010000000100011011010001111010110000110010010", + "10101110011101100101010101000101101011100100110011100000100100000101100100101101100001111", + "10011100110010001010010000111111000000101111010000101011100010000111110010101110111001000", + "11011110101000111000011101101101110100101001111100101111010111100101001111111101010011001", + "10001001001000100101000011101001100111001010011111001011001011111001010011100000010010110", + "11110011111111100000000000110010011111010000101111010100101111110010100111100010010010001", + "01100000101101010001000010100000000010000101010110000000011011010010010011010011111100000", + "01110011011110001111100010001101011011100110110101100000000111001100000111001101111001100", + "01101000100100100100110111111110010011011110001101011111010000001011000000001011101001001", + "10010010100101010011100011110011011101010010000011010110001010111010010010111011010111001", + "11001101111011100111100111010010101101000011111101000110010111100010011111100011010100101", + "10010010110011100001110100111111101111110011000111110011111100100110010100100110111110010", + "00000000111110010001011101001000110001111101001001111110001101010111100101010111100010000", + "11111110110010001100111011001010110010111100100010111010101010001111001010001110101011100", + "10000010110110001001101111111000111101011000001101011110001001001001001000001001100011011", + "10111010001000111000101000101111101011010110000011010011111000011010110001111010111111010", + "10111010101001001111001110011011011000110101100000110011101100000110101101100111100100100", + "10111010111110001001010010101100000000001101011000001000101001000001001001101001011110101", + "10000010001101010001110101101001011011110101010011110101110001110000101001011100001001010", + "11111110111100001100011001000110100010011110110010011110101001001101111001010011001010010" + ], + "1": [ + "11111110110110010111010000100011110111111011010111111000011011001000011011001011101111111", + "10000010001111110011001101111010010100111000110100111100000110010100100110010101001000001", + "10111010100010010111101010111010101100101001001100101011000000000011100000000100001011101", + "10111010100010000011111011011100000010101111100010101010110001100011010001100010101011101", + "10111010100000101101000110011111100001001100000001001011111101111111001101111101001011101", + "10000010010010000001010000001000111001010100111001010010001011111000001011111001001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000010111101011011111011000111001000100111001000110001101101110011101101110000000000", + "11110010101001001010111000011111100001110100100001110011111010111000010010111001010011101", + "01111001111110011101111000100011101111111010101111111000011011001001100011001000100010000", + "10100010010111100110110101101010000100111001000100111100000110011101101110011100100001100", + "11111101000010000110110010111010110100111001010100111011010000001011111000001011011001011", + "00011011011110011001100011001101011010110111111010110010101001111011001001111010110111010", + "11100001000100110011001110011100111001010100011001010110110101100111010101100111110100101", + "11000111110100000011011001001110001001001100101001001001100011100000000011100000101000011", + "00010000010101111101101000011000001110000010001110000100000010010000100010010001000010001", + "10111111101010101111010100000011101101100001001101100010111110101101111110101100000001100", + "10100100100100011110100011000001010101011001110101011101111001101010111001101010011001001", + "00011110100110011000000010110101010011010111110011010001011010011011011010011011110011001", + "10001100100110101011011100101110111100110100111100110001010110000110010110000111110010101", + "11010010000010000011111011101110000110001100100110001110010101000000010101000001101010010", + "01111101111000100101111110011010001000000010101000000110100100110001100100110001000100010", + "10101010010010101110110010000101100011100001000011100111101000101101101000101101000101111", + "11100001001111100101010101000101010001011111010001011100111011101111111011101110011111000", + "00001011011000011110100000110011011101010001111101010101001110011101001110011100101001001", + "11001001001110110101101000101000111110110010011110110000010010000001010010000001101010000", + "01000111011111000100111111101000001110001000101110001010000101000010100101000010110001010", + "01111000010100111101101110011110001010000101001010000111100000110110000000110111010101011", + "01111111101110110100110110001111101011100110101011100011111000101010011000101010111110011", + "01101000100011010001100101001000110011011110010011011110001111101101011111101100100010101", + "01011010110100010010010100111010110101010010010101010010101110011000111110011001101010101", + "11001000100010010100000000111000100100110011100100110010001110000000100110000000100011001", + "10011111110011010011000011101111111110001011011110001111111101000111101101000110111111010", + "01101000011000011000110110010011010000000101010000000011001100110110011100110111101001110", + "10001011110010111100101010010000110011100100110011100010010000100110000000100110101010011", + "01100101001101110001101101001000001001001110001001001010000011100101000011100100110000100", + "01011010010110001000011000100110000101001000000101001101100110000100110110000100110100001", + "11010101111110111110000000100101100110101011100110101101111010011000101010011001011111011", + "11100011000110001001000110111101011110010001011110010111111101011011101101011010000111111", + "10001001100010011010110111110011010011110101010011110001011001111110011001111110001011101", + "11011010000111011110101111100000110010011110110010011011000001010010000001010011100010110", + "10100100100011110011101101110001001010100110001010100000001110010101000110010101010010111", + "00001010010101110010011101011111100100001010000100001010111100100000110100100001011100110", + "00110001010011101100000011011100000001000011100001000001100101101000101101101000111111010", + "10011011101111010011000000001100111001110011011001110000100010111111101010111110001001001", + "01111001111111001000110000101010010111111101010111111111110011001110011011001110001111100", + "10110110100000000100101101101001010100111100110100111100101110010110000110010111101100000", + "01011100111010000001101010110001101100101000001100101101101000000001000000000001010100111", + "01001110110101101000011011010111100010101110000010101010011001100010110001100011010010010", + "11001101001001111000000110011100100001001101100001001000000101111110101101111110111000110", + "01011011001101101111000000000100111001010101011001010001000011111001001011111000000000001", + "11000101100001011110010001101100110111110010010111110110110011011000111011011000001111000", + "11111010000011001010001101100111010100011001010100011100101111010101100111010101100100000", + "10100000100100001100001011110111001100100001101100100101101000010010100000010011001101011", + "11001111110110101101101011011111100010001111100010001011111000100011010000100011111111010", + "10111000110111101101111111011000111001000100111001000110001101101110011101101110100010110", + "00011010101110101111111000011010100001110100100001110010101010111000010010111001101010001", + "00101000101111011101011000101000101111111010101111111110001011001001100011001000100010000", + "11101111111000010011010101101111100100111001000100111111111110011101101110011101111111100", + "00101001111000011000010010100000110100111001010100111001000000001011111000001011011001011", + "10000110010101101100100011000100111010110111111010110000110001111011001001111010110111010", + "10001000101011101011101110011111011001010100011001010100101101100111010101100110110100100", + "10110010100001100110111001011111001001001100101001001011101011100000000011100001101100001", + "11010001110101100011001000011011101110000010001110000010011010010000100010010000000010010", + "00000010111001011010010100010010001101100001001101100110000110101101111110101100100001100", + "11100100111111100110000011010010110101011001110101011001000001101010111001101011111001001", + "01001010111100111101100010101100010011010111110011010000110010011011011010011011010111001", + "01010101000101110101111100100101011100110100111100110100101110000110010110000111010100101", + "01011110010101110111111011100111100110001100100110001111101101000000010101000000001100010", + "00010101000011111101011110010001101000000010101000000100001100110001100100110000100010010", + "11110110101000001111010010001011100011100001000011100000011000101101101000101101100001111", + "00111101101100111010010101001001010001011111010001011011011011101111111011101110111001000", + "10000011001111001100100000111101011101010001111101010110111110011101001110011101010001001", + "11101101110101001011101000100110111110110010011110110010110010000001010010000000010001000", + "11011111000101000000111111100110001110001000101110001101010101000010100101000010001011110", + "00100100110111101101101110010010001010000101001010000000100000110110000000110111100101011", + "01111011111001111000110110001011101011100110101011100001101000101010011000101011100100011", + "01001100011000111001100101001011010011011110010011011110111111101101011111101101111110101", + "10010010011110010000010100111101010101010010010101010111001110011000111110011001010000101", + "11001100010001001100000000100100100100110011100100110110010110000000100110000001010011001", + "10010010001100000001000011101111111110001011011110001011111101000111101101000110111111010", + "00000000111011100110110110001000110000000101010000000110001100110110011100110110100011110", + "11111110011000111110101010001010110011100100110011100010101000100110000000100110101010011", + "10000010001110110001101101001000101001001110001001001110001011100101000011100100100010100", + "10111010000111000010011000111111100101001000000101001011111110000100110110000101111110001", + "10111010100111000000000000110101100110101011100110101011101010011000101010011000000101000", + "10111010100011001011000110101101011110010001011110010000111101011011101101011010111111101", + "10000010110000111010110111100011010011110101010011110101001001111110011001111110001001110", + "11111110110001110100101111100000110010011110110010011110010001010010000001010011001010110" + ], + "2": [ + "11111110100100111110111001101001101000111110111101001110100101001111100101001011101111111", + "10000010110010001001011111011100011111010100011110111110111100101001111100101001001000001", + "10111010110001101110110101111001111101110000111010111101010010010010010010010100001011101", + "10111010000001110011010011000100101100111011000100010111010000011010110000011010101011101", + "10111010011110001110010011001111101100111110001110010011111010110000011010110001001011101", + "10000010111011101001001010111000101000001000110000111110001010010010010010010001001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110011110110100000101000100000000011100000111010001001111100101001111100000000000", + "00111010101110111001011001101111111100111001001001100111111111100101001111100100111100111", + "00101100000100111110111001100001101000111110111101001001011101001111100101001111011101100", + "00011110100010001001011111001100111111010100011110111001110100101001111100101001101110110", + "10011100111001101110110101101011111101110000111010111111001010010010010010010011110011100", + "00010110010001110011010011011100110100111011000100010111001000011010110000011010010110010", + "10110000101110001110010011011001110100111110001110010100100010110000011010110000100010010", + "10010111100011101001001010100100000000001000110000111110111010010010010010010010010010001", + "10110101110011110110100000100001111000000011100000111111000001111100101001111100000100011", + "01110011101110111001011001101100100100111001001001100111010111100101001111100100101000001", + "00101100001100111110111001100001110000111110111101001001010101001111100101001111011100000", + "00011110100010001001011111001100111111010100011110111001111100101001111100101001101111010", + "10101100111000001110110101101011111101110000111010111111001010010010010010010011110010000", + "00000110011000110011010011011100110101111011000100010111010000011010110000011010010111010", + "10110000110110101110010011011001101101011110001110010100101010110000011010110000100010010", + "10010111110010101001001010100100011001101000110000111110110010010010010010010010010011001", + "10000101111011010110100000100001101000100011100000111111011001111100101001111100000100011", + "01110011100110111001011001101100100101011001001001100111000111100101001111100100101001001", + "00101100011101111110111001100001101000111110111101001001010101001111100101001111011101100", + "00011110101010101101011111001000101111110100011110111001101100101001111100100001101110110", + "10101100111001001010110101101111111100010000111010111111001010010010010010011011010011100", + "00111111111000010101010011011111110100011101000100010011111000011010110000000010111110010", + "10111000110110101110010011001000101100111000001110010110001010110000011010101001100010010", + "10111010110011001101001010111010111001001010110000111110101010010010010010000011101011001", + "10001000111010110100100000101000101000100011100000111110001000111100101001101100100010011", + "01101111100110011011011001101111100100011111001001100011111110000101001111110101111111001", + "00100100011101111110111001111100101001111100111101001001010100101111100101001111110111100", + "00010010101010001101011111011011101110010100011110111000110100001001111110101000100010110", + "10100101111001001010111101101000011100010110101010110100100010110010010000010011010011100", + "00110111111000010111011011011001110100011001001100000111011000011010110110011010000100010", + "10110001110110101000011011001000101100111010000110010011000010110000011100110000101000010", + "10111110010011001001001010100011111001001110100000100001010010010010010110010011011101001", + "10001100111010110000101000100000101000100101100000111101101001111000101111111100001110011", + "01101110100110011111000001101011100100011001001001100001001111100011001001100101010011001", + "00101100011101111100100001101000101001111110111101010001010101001001100011001110010111100", + "00011010101010001101000111010011101110010010001110100000110100101011011000101000001010110", + "10100001111001001010111111001000011100010110100001000100100010010000110010010011100011100", + "00110111111000010111011010100111110100011001010111010111011000011011010000011010111100010", + "10110101110110101000000100000000101100111010001111010011000010110001111010110001110000010", + "10110010010011001001010011000011111001001110111111010100010010010011010010010011000101001", + "10000100111010110000100010111000101000100101110110101010101001111100110001111100010110011", + "01101110100110011111010110110011100100011001010010001101101111100101010111100101000011001", + "00101000011101111100101110111000101001111110111011010010110101001111111101001110010111100", + "00011010101010001101001101010011101110010010000111011111010100100001110100101000000010110", + "10101101111001001010011001011000011100010111000100100011100010011010011011010011110011100", + "00110011111000010111011001010111110100011000110101110100111000000010110001111010100100010", + "10111101110110101001100110111000101100111011001101110001100010101000011010010001101000010", + "10111111110011001001010110101111111001001111011001110011111010000010010011110011111111001", + "10001000111010110000000111011000101000100101110001001010001001111100101000011100100010011", + "01101010100110011111110101011010100100011000010000101010101111100101001110000100101011001", + "00101000111101111101001111101000101001111110111000110010001101001111100100101110100011100", + "00011111101010001101001111011111101110010010100110111011111100101001111100001001111110110", + "10101100011001000010011001010011111100000110100100100011110010010010010010110010011101100", + "00110110111000011111011001000000110100001001110101110100001000011010110000011010001110010", + "10111000110110100000100110110011101100101010001101110011001010110000011010110000110010010", + "10111010010011000000110110100000111001010111011001110110110010010010010010010101010111001", + "10001000111010111001100111010011101000111101010001001101010001111100101001111011100010011", + "01101111100110001111110101001000000100000000110000101000000111100101001111100011110011001", + "00100001111101111100001111110111101001110110011000110010011101001111100101001000000101100", + "00011111101010010101001111000000101110001010000110111011100100101001111100101010101000110", + "10101100111001001010011001010011111000000110100100100011110010010010010010010000011101100", + "00110110111100011111011001000000110000010001110101110100001000011010110000011010001010010", + "10111001010000100000100110110011101010111010001101110011001010110000011010110000110100010", + "10111010110001010000110110100000111101000111011001110110110010010010010010010011010001001", + "10001001111110101001100111010011001000110101010001001101010001111100101001111101100100011", + "01101110000100001111110101001000000100000000110000101000000111100101001111100101110101001", + "00100001111001100100001111110111101111111110011000110010011101001111100101001110000111100", + "00011110101010011101001111000000101100001010000110111011100100101001111100101000101100110", + "10101100011011011010011001010011111110000110100100100011110010010010010010010010011111100", + "10110110011000011111011001000001110000010001110101110100001000011010110000011010001110010", + "10111000110010100000100110110011101010111010001101110011001010110000011010110000110010010", + "10010010110111010000110110100000111011000111011001110110110010010010010010010011010111001", + "11001101111010101001100111010011101010110101010001001101010001111100101001111101100010011", + "10010010100100001111110101001111100100000000110000101111111111100101001111100101111111001", + "00000000111011100100001111101000101011111110011000110010001101001111100101001111100011110", + "11111110001000011101001111011010101000001010000110111010101100101001111100101000101010101", + "10000010011111011010011001011000111110000110100100100010001010010010010010010010100011111", + "10111010111000011111011001001111110000010001110101110011111000011010110000011010111110001", + "10111010110010100000100110110000001010111010001101110010000010110000011010110001010010010", + "10111010110111010000110110111110111011000111011001110110011010010010010010010010000101010", + "10000010011010101001100111010001101010110101010001001001100001111100101001111100001000010", + "11111110000100001111110101011011100100000000110000101011110111100101001111100101111101000" + ], + "3": [ + "11111110001101111101000010110001111010101010101010000000011011001111111010110011101111111", + "10000010110110101101110000000010000011111100100001100100000110010111100110101101001000001", + "10111010100101101101011101000010110000111001011001011011000000000101100001101100001011101", + "10111010001100101111110110011100110001111000010101010010110001100101010000011010101011101", + "10111010011011001011110100001111101100011100011100110011111101111001001100000101001011101", + "10000010011011000000011101101000101110010001001100001010001011111010001011000001001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001000000000101000101000111101010100111100110110001101101000011100000110100000000", + "01110110010111110100101101001111101010100011010110001011111010111110010011000000100000110", + "00101101001101111101010010111001111010101010100010000000011011001111100010110000100010000", + "01011111010110101101100000001010000011111100111001100100000110010111101110101100100001100", + "11100100000111101101010101001010110110111001011001011011000000000101111001101011011001011", + "00111011101100101111111110010100110111111000010101010010110001100101001000011010110111010", + "10101001111101001011111100001111001010011100000100110110101101111001010100000111110100100", + "00110010111101000000001101100111101010010001011100001001101011111010000011000000101010001", + "00011101011010010110000110010001101001100010000010000000011010011110100010110001000110010", + "10001111011011111001001000100010000111001110110011100100100110110011111110101100000011100", + "11000100010001100110000001100010100000110001100001011011100001110100111001101010011001001", + "11101011100011011011010110111100110001001010011111010011010010000001011000011011110011001", + "10111001101000100000010000100111011111110100110100110111001110001000010100000111110010101", + "11100010110011110100000101001111101010000011111110001000001101011110010011000001101010010", + "00011101001100111100011010111001111000001010111010000000111100101111100010110001000100010", + "01011111010101101100000000001010000000011100101001100101100000110111101110101101000101111", + "11010100000000001101111101001010110010011000011001011010100011100101111001101010011111000", + "00111011101000101111011110010100110000111001100101010011010110000101001000011010110001001", + "10101001011010101011101100001111001110111100101100110110001010011001010100000111110010100", + "00110011111000000001101101100111101100110000000100001000001101011010100011000000101000010", + "00001100011011010110100110010001101001000011100010000001111000111110000010110001000100011", + "10001111111110011001001000101111100110001111110011100111111000110010011110101100111111111", + "11001000110111000111100001101000100011010001100001011010001111110101011001101010100011001", + "11101010100011011011110110111010110111101011111111010110101110000000111000010011101011001", + "10111000101101100000010000111000111111110101010100110110001110001000110100011110100010101", + "11101111110011110100100101001111101011100010011110001011111101011111110011001000111110010", + "00011001001100011100111010110101011000001010111010000111010100101110000010101001110000010", + "01011011110101101101000000001110100001011101001001100100001000110110001110110100110011111", + "11010000000000001101111101000110010010011000111001001100001011100101011001100010101001000", + "00111110001000101111111110011000110000111001000101001011111110000100101000000010100101001", + "10101101111010101010001100011010101110111100001100101001100010011000110100011111000110100", + "00110110111000000000101101110010101100110000100100010001100101011011100011011001011110010", + "00001001011011010110100110101101101001000011100011110111010000111110000010111001110010011", + "10001011011110011001001001110111000110001111110010011101001000110010011110110100010011111", + "11000000110111000111100000110111000011010001100000100100001111110101011001110010101011001", + "11101110100011011011110111000000010111101011111110001010111110000000111001000010000101001", + "10111101101101100000010000000010111111110101010100100001100110001000110101101111000100101", + "11100110110011110100100100011010101011100010011110110000100101011111110010111001111110010", + "00011001101100011100111010101100011000001010111010111111010100101110000011001001110000010", + "01011010010101101101000000010110100001011101001001011100001000110110001110010100110011111", + "11010000000000001011111101001111010010011100111000101100001011100001011000000010101001000", + "00111111101000101101111110100001110000111111000101001011111110000010101001100010100101001", + "10101101011010101010001101111010101110111000001101001001100010011110110101111111000110100", + "00110111111000000110101101111011001100110100100101010001100101011001100011111001011110010", + "00001001011011010000100110010100001001010001100011110111010000111000000011011001110010011", + "10001011011110011011001000010011000110010001110011111101001000110100011111010100010011111", + "11000000110111000001100000010111000011010001100000100100001111110011011000010010101011001", + "11101111110011010001110110101111110111110001111110001011111110000010111000100010111111001", + "10111000110101110100010000101000101111100101010101000110001110001110110101101110100010101", + "11101010111011110000100101101010111011111100011110010010101101011001110010111000101010010", + "00011000110100000000111011011000100000011010111011111110001100101000000011001001100010010", + "01011111111101110111000000011111101001011111001000111111111000111100001110010100111111111", + "11010101111000010001111111000011011010000000111100101001100011101011011000000010111111000", + "00111011000000111011111010101000011000110111000011001001010110011010101001100011010011001", + "10101001001010100110001011100011010110110100001101001101001010000110110101111110010010100", + "00110010101000001010101001100011011100101010100011010010001101000001100001111000001010010", + "00001100101011011010100010011100001001011011100111110010111000110000000011011001100100011", + "10001111111110001101001000011100100110000001110101111111100000101100011111010101100101111", + "11000100111111001011100000001100101011011001100000100000100111101011011000010011111111001", + "11100011111011010001110100111100010111110001111100001001010110011010111010100011010001001", + "10110000011101101100010010101000111111101101010101000100001110000110110111101111010010101", + "11101110010011100000100101110001001011101100011110010110001101000001110100111000001000010", + "00011101100100010000111001010111110000000010111111111101101100110000000101001000100100010", + "01011011001101100111000100001010100001000111001010111001111000101100001000010101100111111", + "11010101110000000001111011000101010010000000111000101011111011101011011010000110111111000", + "10110111001000111011111110101010010000110111000101001111011110011010101111100101010011001", + "01100001010010100110001111100001000110110100001001001011010010000110110011111100010011100", + "11111010100000001010101001100111001100101010100111010100010101000001100101111110001010110", + "10001000101011011010100000011110001001011011100011110000100000110000000001011111100101011", + "01000011111110001101001000011100100110000001110011111001101000101100011001010011100101011", + "01000100111111001011100010001100101011011001100100100110111111101011011110010101111110101", + "10010011111011010001110010111100010111110001111100001111001110011010111110100001010000101", + "11001100011101101100011110101000111111101101001101000110010110000110100111101001010011001", + "10010010010011100000100101111111101011101100011110010011111101000001101100111110111111010", + "00000000100100010000100001001000110000000010101111111110001100110000011101001110100011110", + "11111110001101100111000100001010100001000111010010111010101000101100000000010110101010011", + "10000010110000000001111011001000110100000000101000101110001011101011000010000100100010100", + "10111010001100111011101110111111110000110111001101001011111110011010110111100101111110001", + "10111010110110100110011111110100100010110100000001001011101010000110101011111000000101000", + "10111010100011001010101001110100101110101010110111010000111101000001101101111010111111101", + "10000010101110011010101000000100001011111011101011110101001001110000011001011110111001110", + "11111110011011101101001000000000100110100001101011111110010001001100000001010011100010110" + ] + }, + "19": { + "0": [ + "111111100110111101110001000001101001111111001101111111001111101100000001001101111101001111111", + "100000100010001011001000001111000001100010111000100010111001000110100111000100010101101000001", + "101110101101111110110011100000110100111100110010100100110011111101001100111111101000101011101", + "101110101011010011010101101100000010001011100111010011100000011111010100011001010101001011101", + "101110101011000101111000100111111111011110110010000110111111110101111110110011111111001011101", + "100000101000101011100001010010001100100011100101010011101000101110011100101010011101001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001111001111111111101110001001111001000101111100101000100101100010000101100010100000000", + "101111100100011001110011110111111001101100011000101011101111100111001011100111001010001111100", + "100011011110100011110001000110101001111001001101111110100111101101100001001101100001101010100", + "000001101010000110001000001101100001100100111000100011111101000110000111000110000111011101111", + "101000000101111000010011100000111100100100110010100100101101111101101100111100101001000010101", + "011110110011010100110101101100010010010011100111010011111110011111010100011110110010100111111", + "001010011011000111011000100111101111000110110010000110110101110101111110110100011100010011010", + "010100110000101100100001010101000100110011100101010011100011001100011100101110111010100100000", + "111101010111101100011111101000110001111000100101111000110011000111100010000101000100110011010", + "110111100101111010110011110100000001101101111000101101100000100001001011100111001100011110100", + "100011011111000101010001000100101001111000101101111000100110001011100001001101100111101010100", + "000001110010000101101000001001100001100101111000100101111100100010000111000110000101011111111", + "101000010101111101110011100100111100100100110011100101001100111100101100111100101111000000101", + "011110100011110100110101101100010010010011100110110010011110011110110100011110110100100101111", + "001010011011000110011000100001101111000110110011100111010101110100011110110100011110010111010", + "010100100000001101000001010111000100110011100100110010100011001100111100101100111100100000000", + "111101011111001101011101101110110000011000100101111000110011000111000110000111000110110101010", + "010111100101111010110111110110000001101101111000101101100000100001001101100001001100011000100", + "010011011111100100010110000010111110111000101101111000100110001011100111001011100111101100110", + "110001101010100101101001001001110100100101111000100101111100100010000101100010000101011101100", + "111000011100111101110011100100101000000101010011100101001100111100101110011100101011000010110", + "011111111011010100110001101111111001110010000110110010011111111110110101111110110010111111100", + "101010001010100110011000000010001010100111010011100111011000110100011111010100011000100011010", + "110110101100001101000011010010101100110010100100110010111010101100111101101100111110101010000", + "101110001110001101011011001110001000011000100010111000101000100111000110000111000101100011010", + "010111111010111010110000010111111000101101111111001101101111100001001101100001001100111110100", + "100010010111100100010001000000000010111000101010011000101110001011100111001011100110100110100", + "110010110100100101101110101001111100100101111101000101100101100010000101100010000100110011100", + "101000000101111101110101100010010010100101000011100101000011011100101010011100101011000000100", + "111101111001010100110010001011001011010010011110110010001011011110110011111110110010010101100", + "111111000100100110011001100101100000000111001011100111010000110100011001010100011001011001100", + "010011101110001101000010100101100011010010111100110010111110001100111111001100111111101101011", + "001101001100001101011111101011010001111000100010111000111100100111000100110111000100111101101", + "010100111000111010111110100100110110101101111111001101100100100001001100011001001101100011011", + "011110010101100100000010101001101101111000101010011000101110001011100110110011100110100111010", + "000010110010100101111111010000001100100101111101000101100101100010001100101010000100110010000", + "111100000101111101101100100011000010100101000101100101000011011100100010010100101011000001010", + "100101111101010100111010001010100011010010011000110010001011011110101011111110110010010100100", + "111011000110100110000001101101110000000111001101100111010000110100000001010100011001011001000", + "010111101010001101011010110100000011010010111000110010111110001100101111001100111110101100011", + "001101001000001101000111100010000001111000110010100000110100110111000100110111000101011101001", + "010000111100111010111110101100101110101101100111010101101100111001001100011001001100000010111", + "010110010011110100011010101000101101111000110010000000110110010011100110110011100111000111010", + "001110110010111101100111010000001100100101100101010101111101101010001100101010001100110010000", + "110000000101110101110100100011100010100001000101100101010011010100100010000100100011000001010", + "101001111101000100110010000011000011010100011000110010001011011110101011100110101010010100100", + "111001000110101110000001100101010000000001001101100111010000110100000001001100000001011000100", + "010010101010010101011010110101100011010100111000110010111110001100100111000100101110001101111", + "000100001000010101001111111010000001100000110010100000110100110111001100111110000101111100101", + "011011111100100110111110110111111110110101100111010101101111111001010100011000101100111111111", + "010110001011101000001010100110001101100000110010000000111000110011111110110010000111100011010", + "001110101010110111101111010010101100110101100101010101111010101000011100101010100101101010000", + "110010001101110001110100100110001010100001000101111001001000100110100010000100000011100011010", + "101011111101010110110010000011111011010100011000101100011111100000101011100110101011111110100", + "111010011110111000000001100110101000000001001101111001011100101010000001001100000000100010100", + "010000110010010111011010110010101011010100111000100100110110000000100111000100100110000111111", + "000101010000010001001111111000001001100100110010100001000101111110001100111110001100110010101", + "011011100100111011011110110101100110110011100111010100010111011000110100011000110100110001111", + "010110011011110101001010100111000101100110110010000001000101010010011110110010011110001101010", + "001100100010110101101111010001010100110011100101010100100110101000111100101000111101100000000", + "110001001101110101110100100111100010111001000101111001011100000110000010000111000111010101010", + "101011101101010101110010000110000011001100011000101100001110100000101011100001001101000100100", + "111010011110111001100001100110101000011001001101111001011100001010000001001011100110110010100", + "010010110010010101111010110010101011000100111000100100110110100010100111000000000000000111111", + "000111010000110101101111111100001001100101010010100101000100011100001100111110101000110010101", + "011001100100111101111110110111100110110010000111010010010110111110110100011000110010100001111", + "010110011011110101101010100001000101100111010010000111000100010100011110110010011000010101010", + "001100100011010100101111010011010100110010100101010010100110101100111100101000111111100000000", + "110011001100110100110100100101100010111001000100111000111100000111000010000111000001010101010", + "101000101100110101110010000110000011001100011001001101101010100001001011100001001011000000100", + "111001011111111000100001100000101000011001001100011000111010001011100001001011100000110100100", + "010011110011010100111110110000101011000100111001000101110000100010000111000010000110011001111", + "000111011000110100101011011100001101100101010010100101000110011100101000111100101000101100101", + "111001110100011100111010010101100100110010000111010010010100111110110010011110110010111001111", + "100110011011110100101010000101000011100111010010000111000100110100011000110100011000000101000", + "000010101010010100101111110001010010110010100101010010100110001100111110001100111111100000011", + "110111011101110100110011000001100010111000100100111000111101100111000000100111000101010101001", + "011000110101010101110110000111111001001101111001001101101111100001001010000001001101111110111", + "000000001111111000100010000110001010011000101100011000111000101011100000101011100111100010100", + "111111100011110100111101110110101111000101111001000101111010100010000110000010000100101011111", + "100000101011110100101011111110001011100101010101100101011000111100101000111100101010100010101", + "101110101111111100111110010011111000110010000000110010011111111110110010011110110010111111111", + "101110101001010100101011100000000011100111010101100111000011010100011000110100011001100111000", + "101110101011110100101100010010101110110010100000110010101011001100111110001100111110110000000", + "100000100111110100110011100010101100111000110100111000100000100111000100100111000100111011000", + "111111101011010101110100100000001101001101100001001101100110000001001100000001001101001100110" + ], + "1": [ + "111111101100000100010100000111100101100001001101100001001111101101111110101100000001001111111", + "100000100001101110011011010001011101011001010101011001010000101001111001001011001101101000001", + "101110101100011111000010101011010011001011110101010011110011111001011100111011111000101011101", + "101110101100110111101110110110110000101010011110110010011110100001010011100111010001001011101", + "101110101011110111111001100111111000010010100110001010101111100110010100100000010111001011101", + "100000100100110101000000010010001110010100001010000100001000110100100001110000100001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000001000111111001101110001000001000111000001101011000100001000101000001000100000000000", + "111100101000000111011000011111111110000100110110000011001111110000000100110000000100110011101", + "100000000000011011010100000001100101100111010101100000100100001100011000101100011001110100110", + "011110110011101011011111000011011101011111001101011000010011001001011011101001011010101000101", + "001001001100011010000100010111010100010011110101010011111010011001111110001000111111000101000", + "101000100100110001101000001010100111010010011110110010011110000001010010011000110010000110000", + "000101001011110110001010001100010111101010100110001010101000000110010101011111110100011110111", + "000001110110110110011011111000011011100100001010000100001001110110101000111100000001110110110", + "110011011010101100011101000001111101100100110011100100101101101110100000100100001101010101010", + "000101111011011100110011000111011101011110001011011110010011101101000111101011011001001101001", + "010010001010001100101010110111010011010000000101010000000011011100110110011010101000100010000", + "111011101011100001100010101111010000110011100100110011100111000000100110000100110100100111100", + "010010010111100001011111001101101111001000111111010001011000010011100101010011100111011001011", + "010100101001010111101110111101110001100100110001111101010000101110000100101110000100110111010", + "101000000100000010011111100000111010000111010010011110100101110010011000110010011001110101010", + "011000111110100100011100100011000000111111001000101110010010100101010011100101010010101001101", + "001101010100000010010101010111001100010110000101010010011011010000110010000000110011100101100", + "101100100110011001011000001010100111010101100110110011111110000000101100011000101100100110100", + "101101010001010111100010001110010111101101011110001011011000000111101011011111101011111110101", + "010001110100011111011111101011111011100011010010000101010101110110011010011110010010010010101", + "001000000011001110110011111110011010111100110010111100110011111110000010010111001110000011001", + "000011111010001000110101111011111010100110001010100110001111110101000110010100111001111111010", + "100110001011110110111001011010001100101000000100101000011000100100110111100101001000100011100", + "100110101010101111101001000110101101000011100101000011111010101010101111001000011100101010000", + "000110001100100001011110001010001111001101011001010101001000111001101001011011001010100010111", + "101011111101001101101110111011111001100011010111111011011111101000011010101110011010111110010", + "110000001111010110001111100011000010000000110100011000101000010100000110110010000110111111011", + "111010110101000000000100110011010000111000001100101000001010000001000001000101000000000111111", + "001101010001111110000101001101111100001110010100001011111011100001110000100001110000001011101", + "111110100101111110011000010000011111001101111111001010000101011001001101111001001101100010110", + "001010000110111000000010000000101111110101000111110010100011011110001010111110001011001011101", + "010000101110011000011011100110001011110011001011110100010010111100111011011100111011000100001", + "000110000101001110111101011101001101111000110100111000101010110100100110000101100110100101101", + "011011101110010010011011011101110101000000001100100000001111010011000000001010100000011111110", + "011101011111100110001010111011110011001110000010101110011110100010110001111011010000001000010", + "101010111100101110001010110000111000100101100001000101100111101110100101100100001101101011111", + "101011001100000111011111010000100111010100101001010100100100111000100011110010001111010101000", + "000000110000101001000110100110101001111010101111111010110101101001100011001111111101010011001", + "101111001110010001011111101101010010011001001100011001001000110101111111010011100000111001000", + "000011110010110011110000111101001000101001010100101001001011100011110000000111100011000001110", + "111100000111011101101011101011100011001110010011010111110110010011010000110011010011101011111", + "110110101111101111010110110000000000101101111000110100001010000111001101100111001100000010111", + "000110010010000101100001100000101000010101000000001100111101000000001010100000001010110011001", + "011100111000001000000000000110001110010011001110000010001000110000110011010000110011011101001", + "001110001001010011000100011100101101111101000100111001011000111101101010001101101010111110101", + "111011111010111010100011011100010101000111110100100001101111110010111110001010111110001100010", + "100101000001100110100010111010000011001001111010101111111110000011001111111011001110001000000", + "111000111111110110111110100001100000100010111001000100100110001110010111000110011110101011100", + "110011000101110100111001101000111000001100101000001100101101001000000001000001001100110101011", + "000011111000100111111000011011111110000010101110000010111111110001100010110000011100111111010", + "100010001111011000010100000110001101100001001101100001011000101101111110101100000001100010100", + "110110101011101111010011010110101101011001010101011001011010101001111001001011001010101010010", + "011010001011100111100010101110001011001011110101010011111000111001011100111011111111100010011", + "000111111110011101001110110111111000101010011110110010011111100001010011100111010010111111111", + "011101000010100111111001100111101000010010100110001010110111100110010100100000010101101001001", + "101100110000111000001000010101100110010100001010000100010110010100100001110000100001001111010", + "101111001101010011010100000100100101100101010101100000111110001100101000101100101001001100100", + "011001110011110101000011000011011101011111101101011000000001001011011111101011011110010100001", + "100110011001111111100010110011010011010001100011010110001010111010101110011010101110110010000", + "001110101110001011111010101100110000110010100000110101100110100100110110000100110111100001100", + "000011010100111111010111001010001111001000101110001000110001100010100101010011100100111000011", + "011011101010101110010110111110000001100100101000000100111100010111100100101110000101010110110", + "011000001111001111101111100011100010000111001011100111011010101011111000110010011000010101010", + "101000100101100110001000100101011000111111010001011111001101101101110011100111011010010101101", + "010101001111100101111011110001010011010010000101010010001001011000010110010010111011111011100", + "101111111000111000100110101000110000110011100110110011101101000000101010000110110101111000100", + "110001000001100010000001101110001000001011011110001011010000100111101101000001110011101001011", + "111111111110011100110100011110000110000101010010000101010000010110010000110010000011010111010", + "101111011001010010001010100111100010100101010010111100111100011110001000111110001011010100110", + "000010110101011101101101100101011010111111101010100110000011010101011111110101011110101000001", + "101110011011010001111001010101010100110001100100101000001010000100101110000100101110000101100", + "000101101001100010000001001000100101010010100101000011110110001000111110001000111110000110000", + "000110010100010111100110001010010111001101011110001001001000001011101001011011101001011110111", + "011101110110111110110110111110011001100011010000000101000001110110011010101110011010010110010", + "100000001100111111001111100011111010000000110011100110100101101010000110110010000110010101000", + "000010100101001111101100110101011000111000001001011110001011101101000001000101001000001101110", + "110111010110100110110101001001010100001010000100001010001011001000110100100001111001100011111", + "011000101000000000001000010011111111001011100111001011101111111000101011111001010101111110111", + "000000001001101000111010000010001111110011011111110011011000111111101100111110010010100010111", + "111111100111100010101111110110101011110101010011110101001010111100011001111110101010101010110", + "100000100101011000011011100010001010100000110100111000111000110100000100110110100110100011010", + "101110100001100111101101100111111010111000001100100000011111110011000001110101000001111111001", + "101110101100111011111001010111100100110110000010101110010001100010110000000100110001010001110", + "101110101001011101000001011100000101010101100001000101101101101100101100101000101100110000000", + "100000101100110000001110010100101111010101001111010000101011111010101011111010101010001010101", + "111111101010111101011110100010001001111011001001111100111011001111111011001111111010000100000" + ], + "2": [ + "111111100111100011101000101001000010000100011011000000001111110010000110110011111001001111111", + "100000100000110001100101111010111010000001111110000001010011100111001001000101111101101000001", + "101110100101010100111001011011001110110000110111010001110101100011111100100001011000101011101", + "101110100100111100010101111110111111000101111010110100001000111111010011111001010001001011101", + "101110101010001110000101010111111111101000111000101101101111111000010100111110010111001011101", + "100000100001101010111110100010001001011010011111011010001000111000101001111110100001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001110001111100010011010001101111010011100101100111000111001001101011010000100000000000", + "001100111010101010100011011111111001101011111101100010101111101000011100101111100100111010000", + "101101011111100011101000101101000010010100001011000100000111110100000000110011111001110100110", + "000011101010110001100101111010111010010001101110000101000000100011001011000101111010101000001", + "110010000101010100111001011111001110101000110111010111111101100011111110100001011111000100000", + "000111101100111100010101110110101111001101111000110010011000111111010011111001010010000111100", + "000000010010001110000101010000111111111000101110101111101010011000010100111110010100011111011", + "011000110001101010111110101001100001011010010001011110011011111000101001111100100001110111010", + "000100010011100010001111110001100000000111100001000001001011010100100000110101101001110100110", + "001000100001110011111000000011001010100000110100111001110101010011000111110010111111101100001", + "011011001001010001011110011011110100111010110101110010110001000010110110000011001111000010000", + "101110100111011110001100010111000111101100000111101000101101001110101110101100010111000101100", + "101011011110001011100110000100011101110011101100001100100110111000101101111010000100011111011", + "000001111010001110100101000000011001111011001110000100101110001001111101001111100010110001010", + "101101011111100001101110111101010010010101000011000010000111110101100001010011111101110010110", + "000010101010110011100101110010111010000001001010000101000000100011100010100111111110101100001", + "110010000101010000111001000111010000110001010111110111111101100011010110000011011011000010000", + "110100101100011110010011101110100111001101011001110100011000111111001010011111010100000001100", + "000000010010001010000111000000101101100001101111101001100010011000001101011000010010011001011", + "011001110001101000111010100001110111011010110000111110000011111000111000011010100011110010010", + "000100010011100110001101101001110000011110000001000001000011010101100000010111101011110010110", + "011011111001010101111010011011111010100000010100111111101111110010100110010100111111111111001", + "011010001001010111011110001110001110100010010100110100101000100011010111100101001111100011100", + "101110101111011110001010011110101001101101100111001000101010101110001111101010011111101010000", + "101010001110001011100010011010001001101011101100101100111000111000001101011000001001100010111", + "000011111011101000101101011011111101111011001111100010111111101001111100101001111011111110010", + "101110001110100111100010101010101000001100100010000100010000110101100000110101100111000110110", + "001100110011010011110001111000111110000000001010100101000010000011100011100001101001011110001", + "110101010100010000001011011111100110101000110111110111100011100011010110000001011101110110000", + "110100110101111001000111110101100111001101111001010010011011011111001010011001010010010101100", + "000001000010001101001101010111001101111001001111101111101101011000001101011111010100101100111", + "010111101000001000100100111011110111011011010001111110010001011000111000111101101000000010110", + "000011000011100110001111111001000100000110000001000011010101010101100000110100100101000101010", + "010101111000010010110110001000011110100000010100111011111110110010100111110011000001111111001", + "010000011001010001010100010100011110111010010100110100100110000011010110000010110001110000000", + "100001111110111110111100001101010011101101100111001010101111101110001110001100100100110011100", + "101110001110001011010000010100111100101011101100101000111000111000001101011010100110101101011", + "001110100011001110010001010011010000001011001111100111101111101001111100101111100100100011010", + "100100001111100000100000100010100000011100100010000101000110110101100000110011111001000001010", + "001100110011010011111111100000101100000000001010100000101110000011100011100101110011011001101", + "110101010101010000111001101111110011110000110111110011100001100011010110000100010011110101100", + "111000110101111011011011000101110011011101111001010001010001011111001010011100101100010000100", + "001011000010001110001110001111010100010001001111101000011011011000001101011111101010101111011", + "010111101000011110001010111011110101011011010001111011111101011000111000111100010010000111010", + "000011000011110010111100111001000001000110000001000100110111010101100000100101001011000100110", + "010101111000001001001011101000011011010000010100111100010100110010100111101010111111111110001", + "010010011001000000010110110100001110101010010100110010010000000011010110011011001111110001100", + "100001111110111010010010101101001001101101100111001100000011101110001110010110011110110010000", + "101110001110001111100000110100110000101011101100101000111010111000001101001001001000101000111", + "001111111011011011101111110011111101101011001111100111101111101001111100110000011010111110010", + "100110001111100111100011100110001001111100100010000101101000110101100000101100000111100010100", + "001110101011010111010101100110101110000000001010100000111010100011100011101011001000101010010", + "110110001101000100001010001110001111110100110111100010011000100011010110001011111001100010011", + "111011111101111100100000000111111010111001111001001001101111111111001010011111010101111111111", + "001001011010001011001111101010011011110111001111110001010100111000001101011000010011011110111", + "010110111000001100100110011010001101011101010001100010101000011000111000111000100010110000110", + "000011011011100010000101011111001001000100000001010101000011100101100000100100111110110011010", + "010100101000000000110100101100110110110000010100110100100010101010100111101011000001001001001", + "010011000001010001011101010001000001001010010100111011001111100011010110011010110000100101110", + "100000101010111010101000001100111011101111100111011101011110101100001110000110101101100110011", + "101110010110011111001001010010100100101111101100101001011110011010001101010000101010111110100", + "001111110101001010001110110111101100001111001111100111001001100111111100101001111011110010001", + "100101010111100110110010000111110110011010100010001100100001001011100000110101100110110011010", + "001101100111010110101101000011010110000110001010100001110011000111100011100011100001101011101", + "110101001111010101100011101101111111110010110111100011100101001011010010010010010000000101100", + "111001100111101100011001000011111011011101111001011001011111010111001100000110101100100100100", + "001000011010001011011110001001111010010001001111100000001100101000001011000001101011111110101", + "010110111000001101110110111010001101011001010001101011101000000010111010110000011011010000101", + "000011010101110011010100111011101001100010010001000100110011110111100010111100000111010011001", + "010100110110010001110101101100110110110100000010111100010010111100100111110011000000101001010", + "010011001101010000000100110000000000001100000110111010010111111101010110000010110000000101100", + "100000100000111011000000101011011010101011111001001100011110101010001110001110101100000110000", + "101110000100001110111000010111100101101001101010111001011110010000001001001001101011011110111", + "001111111001011010101111110100001101101011000111101110001001100001111010110000011010010010010", + "100101001111100110110010100101110111011100110000001101100001100101100110101100000110010011000", + "000010111011010110101101100000110111000010000000110001010010011001101001101011000000001011110", + "110111000011000101100010101101111110110100100101110010000100000001011100001010110001101101111", + "011000111011111100011000100011111011011001101001010000111111110001010010011110101101111110111", + "000000001110001011011111001010001010110111011011100000011000100110010101011001101010100010111", + "111111101110001101110111111010101100011101001111111010011010111100101000111000011010101010110", + "100000100001100011010100011010001000000100000111010100101000111100100100100100000110100011010", + "101110100010011001110101001111111110110000011100110101011111111011000001101011000001111111001", + "101110101001000000000100010101101001101010000110111011001001010010110000011010110001000011110", + "101110101110110011000001001010110010101111101101011100101001010100100100000110101100101010000", + "100000100000001110111001110100110101101000111111101001011011111010100111000001101011010010101", + "111111100101000010101110010010111101101100011110100110011100100111100100110000011011111100000" + ], + "3": [ + "111111100000010011111101111100000010110101001111000010101011110000011010110000011101001111111", + "100000100000001110111101010101010011001110110011000011111001011000111000111010111101101000001", + "101110101010100011011101010100010001111010101100001010100110111100101001101110101100101011101", + "101110100001010110010001010110011101010100010001101101111101011010110000000100110001001011101", + "101110101001011101101000111111111001010101101011010011011111101111100101010001100111001011101", + "100000101111101001011010010010001101101110000100001010101000110110000011011010000001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000101011011000001010010001001011001100001101001011000100111000111001111000110100000000", + "010010101010110010101101001011111001101101100111010111101111111010110000011010110000110110100", + "111000001000010011111100111001010010110101001111000010101000010000011010110000011010001000101", + "001101110111110001000010001001001101010011001100111100000001000111000111100111000111000111000", + "100000010010100011011100000100111001011011101100001010110001011100101001010101101001010001010", + "100010111110101001101111011110000011111001001110010010011100000101001110000100101110011010111", + "011100001001011101101000110111010000110001001011010011011011101111100100101110000101101111001", + "011101111100010110100100000110101011011101011011110101011110101001111101101001011100100011100", + "100101010001011011000000011010011001001001100001101001001110100111000111000111100110110110110", + "111010111110110010101101010011100001100101000111010111100010111010110000011010110000111100111", + "111100001110010011111100110001010010111101001111000010101000010000011010110000011010001000101", + "001101110101110001000010001001001101001011001100111100000001000111000111100111000111000110000", + "100100010000100011011100010100111001000011101100001010110001011100101001011101101001010001010", + "101110111110101001110111000110000011100001001110010010011100000101001110000100101110011011111", + "011000001111011101111000110111010000111001001011010011011011101111100100101110000101101111001", + "011001111100010110101100000110101011000101011011110101011110101001111101101001011100100011100", + "100001010001011011010000011010011000001001100001101011001110100111000111000110100110110110110", + "111010111110110010111100110011100001100101000111010111100010111010110000011011010000111100111", + "110000001110010011110101110001011011111101001111000100101000010000011010110000111010000000111", + "001001110101110001010011101001011100101011001100111110000001000111001111000110100111010110011", + "100000010000100011000100010100111001000010101110001110110001011100100001111100001101001001001", + "101011111110101001111110100111111011000000101100010110011111100101010111100101001000111111100", + "010010001111011101110000110110001001011000001111010011011000101111111101001111100011100011001", + "011010101100000110110101100010101010000101011001110001011010101001101100101001111110101011100", + "100010001111001011000000011010001000001001100111101111001000110111000111000111000101100010110", + "111011111100110010111100110011111001100101100101010111111111100010110000011010110001111110111", + "110010011010010011110101110010001011111100101111000010110100001000011010110000011011000010111", + "001011110101101001010011101110111100101010101000111000000100001111001111000111000110001000011", + "100001011000101011000100010010110001000011001110001110101110110100100001111100101101011011001", + "101010101000110111111110100011100011000000001100010110011001000101010111100101001001111001100", + "010010011111010111110000110101100001011001101111010011010010101111111101001111100010111101001", + "010111110010001010110101100000100010000101111001110001000111101001101100101001111111010111100", + "101011010101001001001000011001011000001001100111001111001001010111000111000111000100100110110", + "110101101000110110101100110101000001100101100100110111111110100010110000011010110000001110111", + "111111011010010101110101110010001011111100101110100010110100001000011010110000011011000010111", + "001111110111101111000011101110111100101010101001111000000100001101000111000111000000001000011", + "101111011000101101010100010010110001000011001001100010101010110110101001111100101011011011001", + "101101101000110111110110100011100011000000001110000000011111000011001111100101001111111001100", + "011011011111010101110000110101100001011001101101110101010100101001100101001111100100111101001", + "010111110010011111110101100000100010000101111011010111000101101101111100101001111101010111100", + "101011010101001101011000011001011000001001100101100010100011000110000111000111000110100110110", + "110101101000101110101100110101000001100101100000000000010110011011010000011010110000001110111", + "111111011010001100110101110010001011111100101011110101001100110001111010110000011011000010111", + "001111110111111111000011101110111100101010101111010111011101100101100111000111000110001000011", + "101111011000001101010100010010110001000011001011100010111011011110001001111100101001011011001", + "101101101001101110110110100011100011000000001110000000011110000011001111100101001111111001100", + "011011011110110100110000110101100001011001101111110101010100101001100101001111100100111101001", + "010101110010110111010101100000100010000101111101010111000101101101111100101001111101110111100", + "101000000100101111011000011001011000001001100101100010100011000110000111000111000110000110110", + "110111111001111010101100110111111001100101111000000000011111111011010000011010110000111110111", + "111110001010101000110101110010001011111100100011110101001000110001111010110000011010100010111", + "001110101111110111000011101110101100101010100111010111011010100111100111000111000111101010011", + "101110001000101111010100010010001001000011011011111110101000111100001001111100111000100011001", + "101111111001101000110110100011111011000000000110110110001111100101001111100101011110111111100", + "011001001110110010110000110011000001011001101111110011000110001111100101001111100100001111001", + "010111101011110100010101100111110010000101111100100001010011001001111100101001110100011101100", + "101010001100101010011110011000111100001001111100110011000101100111000011000111001110101000110", + "110110110001111010101000110011001011100101100000000001101000111010110110011010101001100100111", + "011110000010101000010011110111100001111100101011010100111000010000011100110000000010011000111", + "001110100111110110000111101000011000101010111110011110000101000111000101000111010110000010011", + "011100001000101111110110010110100101000011011011111110111111111100101011111100101000110111001", + "101111110001101000010000100100100011000000000110101110010110100101001111100101001111111001100", + "011000000110110010110010110011000001011001101111111011000110101111100101001111100100001111001", + "000111100011110101010111100111110000000101111100101001010011101001111100101001110100011101100", + "011010001100001011011110011000111100001001111100110011000100000111000011000111001110101000110", + "100110110001111010101000110011001011100001100000000001101001011010110110011010101001100100111", + "011110000010101000010011110111100001111000101011010100111001010000011100110000000010011000111", + "001110100111110110000111101000011000101010111110011110000101000111000101000111010110000010011", + "011100001000001111110110010110100101000001001011111110111111111100101011111010101000110111001", + "101111110000001000010000100100100011000000000110101110010110100101001111100011001111011001100", + "011000000111110010110010110011000001011101100111111011000110101111100101001001100100101111001", + "000111100011110101010111110101110000000001110100101001010011101001111100101111111101111101100", + "011010000100001011011110000110111100010001100100110011000100000111000111010101000111001000110", + "100110110001111010101000100101101001100001110000000001101001011010110000000100110000100100111", + "111110011010101000010101101111000011101100111011010100111001010000011010101110011010011001011", + "000010101111110110000011110100111010111000101110011110000101000111000111001011000110000011111", + "110111010000001111110010000000100001010001001011111110111111111100101001110100101000110110101", + "011000100000001000010010100111111101000000000110101110011111100101001111100101001111111110100", + "000000001111110010110010101110001111001101100111111011001000101111100101001111100101100011001", + "111111100011110101010011110010101010011001110100101001011010101001111100101011111101101011100", + "100000100100001011011110000010001001010001100100110011011000100111000111010101000111100010110", + "101110101001111010101010000011111110100001110000000001101111111010110000000100110000111110111", + "101110100010101000010100001111100001001100111011010100111110110000011010101110011011111111011", + "101110100111110110000000010000111001011000101110011110001001000111000111001011000111010011100", + "100000101000001111110010000000110000110101001011111110100011111100101001110100101001011000100", + "111111100000001000010011100101000101100100000110101110011011100101001111100101001111010100101" + ] + }, + "20": { + "0": [ + "1111111011110110110010000000100100111111101100100000010011011010011111101100100000010001101111111", + "1000001010000101100110101110001000110011100010001110010101010111111110011001010000100000101000001", + "1011101000010000001101011111110010101010100001000101111100110011110110000000001101101001101011101", + "1011101010100100101111111101011010010010111001110101000110001101110101000110001010111000101011101", + "1011101001001011110001111001100111111100110111111011001000001111100100110111111011001000101011101", + "1000001000010101001001111010100110001101010100111000100011101000101010100111000100011101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011100010110010001101011010001100010111110011001010011000100010111110011001010000100000000", + "1011011100001001011010110010110011111111010100011000101011101111111110110010000001001100101001011", + "0000100101010010100010100100111110111111101100100000010011011010011001110101000110001011100110101", + "0011001010100101111110001010010000110011100010001110010101010011111010001000010100110010001010101", + "0000100110010110001101011011111000101010100001000101111100110101110110000000001101101110000011001", + "1111101100000100101110011001001010010010111001110101000110001011110101000110001010111001010011010", + "1011110110101001111001111111110101100100110111111011001000000011000100110111111011001000111101110", + "0101111100010001011001011010100110000101010100111000100011100011001010100111000100010100111100011", + "1101000011011101100000110110000101000111001100101000010001011110011001100101000010001011001110100", + "0100111110011001110101000010001001001001100010101110011101010110101000000100110111111010111000001", + "1101000000011011011110001101000011010010000001001101111110110111110100011000101011100111100011000", + "1000011001011100111100110111001011101000111001010101001110001000100011011011101101100000111001110", + "0110010000000110111011101101011110011000010111110011001010000011000010111110011001010001111101111", + "0010001000101111000011110100111111110001010100011000101011100110011110110010000001001100100110111", + "0100100101110110110011100000101110111111101100100000010011011000011001110101000110001011111110111", + "0011001010000111100111101100010000111001100010001110010101010001111000000000110110111010010010110", + "0000100110110000001101011011101000110000100101010100111000110101110100001000101111100110110011010", + "0111101101000010101110011001010010000110111111101100100000001011110011011111101100100000110011001", + "1011110110101101101000111011110101101100110001100010101110010011000010101110011101010000011101110", + "0101111100110001010001011010100110011001010010100001000101111111001110110110000000001101011100011", + "1001000011011101100000110110000101011011001100101000010001000000011001100101000010001010001110100", + "0000111110011001110101000010001001000111100010101110011101001000101000000100110111111010110000001", + "1101000000011011011110001101000011010110000001001101111110110101110100011000101011100111110011000", + "1000011001011100111100110111001011110000111001010101001110001010100011011011101101100000101001101", + "0010010000000110111011101101011110001100010011100010001110000011000010111110011001010001000101110", + "1110111110101111000011110100111111111011010010000001001101101111111110110010000001001100111110100", + "0100100011110110110011100000101110001001101010111001110101001000111001110101000110001010100010111", + "1011101010000111100111101100010110101011100100010111110011011010111000000000110110111011101010110", + "1100100010110000001101011011101010001011111100110010100001001000110100001000101111100110100011010", + "0111111111000010101110011001010011111111000110001010111001111111110011011111101100100000111111001", + "1111110110101101101000111011110101011011001000000100110111100000100010101110011101010001110001100", + "1101001010110001010001011010100101000100100011100101010100111101101110110110000000001100110010000", + "0001010001011101100000110110000111100110001000111001010101011010111001100101000010001010101000111", + "1100011010011001110101000010001110001100000100110111111011011011001000000100110111111010100100010", + "1001100010011011011110001101000011101101100111010100011000110110010100011000101011100111000111010", + "0000111111011100111100110111001000101001011111001100101000010000000011011011101101100001011111101", + "1010000000000110111011101101011100111101001010000100010111100001100010111110011001010001110011100", + "1010001110101111000011110100111000111010101011100111010100001101111110110010000001001100010010100", + "0100010001110110110011100000101110000000010011011111101100111011111001110101000110001010101010111", + "1011011010000111100111101100010011110010010101010011100010001011011000000000110110111010000100110", + "1100110110110000001101011011101011101011111100110010100001010111010100001000101111100011000101010", + "0111001001000010101110011001010100110111000110001010111001100000010011011111101100100111111111001", + "1110000110101101101000111011110101111011001000000100110111100000100010101110011101010011110001000", + "1110011010110001010001011010100101100100100011100101010100111101101110110110000000001010110011000", + "0001010101011101000000110110100111000110010001011111001100111010101000100001010011001100101000011", + "1101011110001001110111000010101111001100011101010001100010111011010001100010101110011100100101110", + "1010110100001010011100011100100011001101111110110010000001010110001101111110110010000001000110110", + "0010011111001101111110100111101001101001001110001000111001010000001011111001100101000011011110001", + "1000110110000111011011111100011101011101001010000100010111100001101010011100010001110011110010000", + "1011011000100111000101111100111110011010101011100111010100001101111110110010000001001100010011100", + "0111000001111111010111101000001010000000010011011111101100111011111001110101000110001010101010111", + "1001001100001110100011101100010000010010010101010011100010001011011000000000110110111010000100110", + "1101000000101000001111001011101011101011111100110010100001010111000101001100111110100011000001010", + "0111111111001011001110000001110111111111000110001010111001101111101010111001110101000111111111001", + "1110100010110100001110111010110110001011001000000100110111101000111011001000000100110111100010000", + "1111101010111000110011001010000110101100100011100101010100111010100110010100001000101111101011100", + "0011100011010101000110100111000110001110010001011111001100101000100000000011011011101100100011011", + "1111111110000000010101010010001111111100011101010001100010101111110001100010101110011100111111010", + "1000010000000011111110010100000100011101111110110010000001011101001101111110110010000000010100110", + "0010001001000100011001111111011010000001001110001000111001001011001011111001100101000010001100001", + "1000000101001000011001101001010111010101001010000100010111101010111011011000000000110111100010000", + "1001001001110110101011100110100001101010101011100111010100001110100111010100011000101011100101100", + "0101110101001000000011011101111011110000010011011111101100110001000000010011011111101101111111011", + "1001011011111111010011100010010101011010010101010011100010010000110010101010011100010001010001010", + "1110110011011000111111011111100111100011111100110010100001011101101111100110010100001001010010110", + "0100101101111001010111101001001000000111000110001010111001100010101100100000010011011110001010001", + "1110100111110111000000100010100100101011001000000100110111101011111101010001100010101110100110000", + "1111101100101101110100110110101111101100100011100101010100100110100010000101001100111111100011100", + "0011010110110001010010010010000010001110010001011111001100110001100000000011011011101100111001011", + "1111111111000000010101110000010011011100011101010001100010111000010001100010101110011101010111010", + "1000010000000011101111110110000010011101111110110010000001011100001101111110110010000000010100110", + "0010001000000100000001111111010010000001001110001000111001001011001001110001000111001010001100001", + "1000000100001000000000001111010001010101001010000100010111101010111001010000100010100111100010000", + "1001001001110100110010000000101101101010101011100111010100001110100001001101111110101011100001100", + "0101110100001100001010111001101111110000010011011111101100110001100110001010111001101101111001011", + "1001011011111101010010100100000001011010010101010011100010010000010110111011011000010001010111010", + "1110110010111110110110111001100111100011111100110010100001011100001111100110010100001001010100110", + "1100101100011001011111101101000000000011000110001010111001100111001100100000010011011110101100001", + "0010100111010111010001100010110100101011001000000100110111101100111101010001100010101110000010010", + "0000001101001011100100010010110111101110100011100101010100100000100000001101101110110110000001111", + "1010010111010011011011010100001010001101010101001110001000110011100010001011111001100101011001000", + "1111101111000010000100110110011011111011111011001000000100111111110111111011001000000100111111001", + "0000000011100001100111010100000110001110011000101011100111011000101011100111010100011000100010110", + "1111111010100110001001111111011110101110101000010001011111011010101101100000000011011011101010001", + "1000001010001000000000001111010110001101001010000100010111101000111001010000100010111111100010000", + "1011101001110100110010000000101111111110101011100111010100001111100001001101111110110011111111100", + "1011101010001100001010111001101100000010010011011111101100100001000110001010111001110101101101001", + "1011101011111101010010100100000110101110010101010011100010000010110110111011011000000001100011010", + "1000001000111110110110111001100111101010111000100011100101011110101111100110010100001000000000100", + "1111111010011001011111101101000100001010100000010011011111110001101100100000010011011110011000011" + ], + "1": [ + "1111111010110010011111111010000100001000001101011000001101011010000001101011000001101001101111111", + "1000001001111000100011001111100100000110000011010110000011010111110000011010110000011000101000001", + "1011101011001001001001010011111001100011111001010011111001010011101100000110101100000001101011101", + "1011101011110001111100000101111011001011000001101011000001101101101011000001101011000000101011101", + "1011101011001011001100100001011111111101001111100101001111101111111010110000011010110000101011101", + "1000001001001000001101111001010110001100100100100100100100101000100100100100100100100101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000111011110111101101101110001011010110000011010110011000111000111000111000111000100000000", + "1111001010011100011001100000110011111000110101100000110101101111100000110101100000110100110011101", + "1111000001110010010111100011100110010000001101011000001101011010000111110010100111110011100111011", + "0000001100011100100011010110000010011110000011010110000011010011110100001011110100001010001011010", + "1100010011001001010001000010111111111011111001010011111001010101101100000110101100000110000010110", + "0000001000110011101100000101111001011011000001101011000001101011101011000001101011000001010010001", + "0100100111101111010100100001011011010101001111100101001111100011011010110000011010110000111100000", + "0110011011101000001101111001010110110100100100100100100100100011000100100100100100100100111101100", + "0001100101100010110100110110110100001110010100111110010100111110000011100011100011100011001111011", + "1011111101101110100111010110000100010000011010110000011010110110110110000011010110000010110001010", + "0010000101011111111010001110001011111011111001010011111001010111101010011111001010011111110010110", + "1010101110000101101001001001001001000001001001001001001001001000101101011000001101011000101000101", + "1001010110111001001100011010110001001101001111100101001111100011001001111100101001111101111101000", + "1100011011011001010010000110101100100110101100000110101100000110011001010011111001010010100110000", + "0110100000111011010011000001101010010110010100111110010100111000011110010100111110010101111110101", + "1010111101010111010011110100001010011010010010010010010010010001111110100001011110100000010110101", + "1000100000000110011011001010011111111010111101000010111101010101000110101100000110101100110101001", + "1110111110101100111100001101011001001010100111110010100111101011001101011000001101011001110101010", + "0010110011100001001000111000111001001100101001111100101001110010111100101001111100101001011010000", + "1100001011100001000000100100100101001101000010111101000010111110100000110101100000110101011101100", + "1000000101101011010111000001101011110110010100111110010100100001010010100111110010100110001111011", + "1010101101111110000100110000011011110000011010110000011010101000101111100101001111100100110001010", + "1000000101010110111100101100000110111011111001010011111001010101110011111001010011111001110011011", + "1101101110011100101111101011000001000001001001001001001001001010100101111010000101111010101011111", + "0100010110111000101110011010110001001100001011110100001011100011100001011110100001011111000111101", + "0110111111011000010100000110101111111111001010011111001010001111111001010011111001010010111110110", + "0011100010111011110111000001101010001111110010100111110010101000111110010100111110010100100010101", + "0010101011010111110100110000011010101011110100001011110100011010111110100001011110100001101010101", + "1010100010111011011100101100000010001100100100100100100100101000110111101000010111101000100011001", + "1111111111010001101001101011000011111100111110010100111110011111110100111110010100111110111111010", + "1000100100000000111100011010110010010010110000011010110000000000000101001111100101001111110001110", + "0100001110000101001010000110101001111001010011111001010011111100001010011111001010011110110010011", + "0111100110110100100001001001001000100111010000101111010000111011011000001101011000001100101100100", + "0100011010001100100010111000111110101001111100101001111100111010101001111100101001111100100010001", + "1110010100010100011010110101100101000010011111001010011111010110110101100000110101100001000001000", + "1001001010001110111111110010100101010000101111010000101111010001100001101011000001101011011001110", + "1100000100001101100010001011110011111010010010010010010010000000000001011110100001011111110111111", + "0010001101111110001100000110101100011001010011111001010011101100011001010011111001010010010100111", + "0011000110011001110111000001101110111001101011000001101011011011011110010100111110010100101100101", + "0010001010010011101101110000011000010111100101001111100101001010111100101001111100101000000010101", + "1010010101011001000101000100100011010100100100100100100100110010110101100000110101100001000001001", + "1111011101010111110000000011100101101100111110010100111110000111110010100111110010100111111001010", + "1001010110000000100100100011010011110010110000011010110000000110000011010110000011010111110110110", + "0100001100000111011011111011011000111001010011111001010011111110001110001110001110001111110100111", + "0101110100111100001010111110010000100001001001001001001001011001001001001001001001001001001100000", + "0100011010000101001001011110100010101111100101001111100101011010110000011010110000011011000010101", + "0001010000111111110010010111101011010100000110101100000110110110101100000110101100000110100000110", + "0000011101111011110010010000101011001100111110010100111110010001101011000001101011000001011000001", + "0011110111101110110111100011010101100011010110000011010110000100001011110100001011110101110110000", + "1000111100100011011001101110001100000000110101100000110101101010011111001010011111001010000101100", + "0101110101001010111111111000001110111000001101011000001101011101011000001101011000001100110100101", + "0000001110111001101101001101101000010110000011010110000011001000111000111000111000111001011010101", + "1000000001000001000011010011111011010100100100100100100100111000100100100100100100100100111101001", + "0001111111000111110110000101111011111100111110010100111110001111101011000001101011000000111111010", + "0111100010000000100110100001011010001010110000011010110000011000111010110000011010110000100010010", + "0011101010001111111101111001010010101001010011111001010011101010100110101100000110101100101011100", + "0001100010111100001000111110010110001000001101011000001101011000100001101011000001101011100011001", + "0001111110010100101111011110100011111110000011010110000011011111110000011010110000011011111111010", + "1001110100100111010000010111101010000101100000110101100000100010101100000110101100000110100010110", + "1110111101110110000111010100111100111101011000001101011000001101101011000001101011000001101010001", + "1010000111000000000111000101001000010101001111100101001111101001011010110000011010110000000100000", + "0011001000100010011001101000010000110110101100000110101100001001000110101100000110101100000001100", + "0100010001001110100100011010000110001110010100111110010100110110100001101011000001101011011001011", + "0101101111001101000101101111100110000010010010010010010010000110010010010010010010010010101111010", + "1100110000110010110000011011011111100101100000110101100000100110001110001110001110001110101100110", + "1110101101101111110100001101011100111101011000001101011000011101001101011000001101011001110010001", + "1111000010010011111110011000111100110011010110000011010110010100011100101001111100101000010110000", + "0011011001011111101011000000110001010000110101100000110101110000000010111101000010111100011111100", + "0001010110011011000101101111010011001110010100111110010100101010000001101011000001101011000111011", + "0101111101110100100110011110100110000000011010110000011010100111110000011010110000011010101011010", + "1001110010000011010000110111101011100011111001010011111001000011101100000110101100000110100010110", + "1110111101110010001111010100111111011001001001001001001001011101101001001001001001001001110010001", + "1010010111100110011111101101101011010101001111100101001111110001011000111000111000111000011100000", + "0011111111000110001001100000110110110110101100000110101100010001000000110101100000110100011101100", + "0101110110001000110100000011100000001110010100111110010100101110000111110010100111110011001111011", + "0101111100001001010100110010010010010010010010010010010010000110110110000011010110000010101001010", + "1101110101010000101001001100000111111011111001010011111001000111111111001010011111001010101011110", + "1111011010110011100010001011000101000011000001101011000001111000110100111110010100111111010001101", + "0010100011010010001101011010110101001101001111100101001111110011000101001111100101001110110101110", + "0000001000111111100110000010111010110100100100100100100100110110001000010111101000010111111110011", + "1010010000100101000000100111110000001111010000101111010000101000001011000001101011000000100110100", + "1111101111110001111101010110000011111001111100101001111100101111110110000011010110000011111110001", + "0000000011110101011111101110001010001010011111001010011111001000101010011111001010011111100010110", + "1111111001010010101101101001001010101000101111010000101111001010101101011000001101011001101010001", + "1000001001110111111101111010110010001101001111100101001111111000101001111100101001111100100010000", + "1011101001000111001001100110101111111110101100000110101100011111111001010011111001010010111111100", + "1011101010000000010100000001101101011110010100111110010100101110111110010100111110010100010000101", + "1011101010000000110010110000011011010010010010010010010010011101011110100001011110100000010100110", + "1000001011011001101111001100000000100010111101000010111101000000010111101000010111101000111111000", + "1111111010101010100100001011000000010010100111110010100111101010010100111110010100111110100111011" + ], + "2": [ + "1111111001111111010100101110001111111111100010000010111110010010011110010100111110010001101111111", + "1000001001111010101001100111000010011001000011110001011000011111111100100001011110100000101000001", + "1011101000000001100110000000000000000111011100001110101110001011110101101000010111101001101011101", + "1011101001101001111011111101111000000110100011011100101000100101110010111110010100111000101011101", + "1011101010011000011111011001010111111101111001010101010011101111100011001111100101001000101011101", + "1000001000101001101100101111100110001010000010001100001111011000101100010111101000010101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010101000011101001111001010001110110110001110111000111000100001011110100001011100000000000", + "0011001111101101010010111001011111111111001110010010011001011111111001010011111001010011011010000", + "0010100111111111010100101110010101111111100010000010111110101010011110010100111111010101000111011", + "1010001011111010101001100111011010011001000011110001011001100111111100101001011111100000001111010", + "0100100110000001100110000000011010000111011100001110111110011101110101100000010110101101100100110", + "0001111101101001111011111101110000000110100011011100110000100011110010100110010101011001101100001", + "0000110100001000011111011001001110100101111001010101011011111111000011010111100100101001000010000", + "0100111100100001101100101011101101101010000010001100011111001011001100000111101000110101000101100", + "1011000011110011000110010010010101001101101101010101110011110000011010000101101010100110011111011", + "1100101111000011100100001001101010111001011000100100101111111010101111100101010111100100101001010", + "1111000010011010111001000001111000010010001111101111001011000001110011111001001011111001101010110", + "0001011000100001110010111100000000100011011000101010010010111010100111110010111101111010110100001", + "0010010000101111010000110000101100010001001010111110001000101111000011010110010000011011010010000", + "1100011000010100110110010110011101001011001110110111011101001100011111001010000000110100000001100", + "1011100111010011100100000100010101111110100010001000000000100110011000001101000111110010011001011", + "0010001010011111011010011111011011111100110100111100101001111101111010110000010110000011110010010", + "0110100110011110101011111111111000000001100100111000011110011101110111101000011111001011110010110", + "0111111100011001111110010010110000100010100111111011110100100001110100111110010100111111101011001", + "1001110100101100001110010111001110100101111001011011111101110111000101001111100101001111000101100", + "1100111101001100011110010001101101001110010011000011111111010111001010011111001010010111000000000", + "1001000011110100001000001011110111001010010111100101010011110100011000001001001001000000011000111", + "1010001110100010100101000000101011111101111001100001101011111010101001111010110000000010110110010", + "0111010010111110101100101001111000010011001001000101101101001011110101100110101100011111110100110", + "1001011111000101110001100100000000100111101101000111110010100110100001101001001001011000101000001", + "0011110100101001001101001001001110110111010100101110101000101011000001011100101001111101000100000", + "1010111111110100001111111111011111111111001111000110011001001111111001010011111001010010111111100", + "0000100011110111001111001100010010001110100100110000100110111000111110010100111110010100100010111", + "1001101011111010101010100111011110101000100110011101001001111010111100101001111100101001101010110", + "0111100010011001111111100110011110001111110010011000111110001000110100100100100100100100100011010", + "0000111111111001100010001011110011111110111010101010110000111111110011000001101011000000111111001", + "0001110100001000010100000111001001111101100111111011011011111010100010110000011010110001110000010", + "0111011100101100011100011001101000010010000000110010011111010001101100100100100100100100110011111", + "1010010011110100010010001010010010100100011111110100110011111010111010100111110010100110101101000", + "1111111001000010111001000001101010010001100001110001101111100111001111100101001111100100100011001", + "1111000100011100100010110001111111001011010001001101001011011100010011111001010011111001000001010", + "0010101010100001110001111100000001110011101101011111110010111110000111110010100111110011011001101", + "0001100100101111001001010000001001110001000100101110001001000101110010010010010010010011110011100", + "1101101010010100001111110111111100001101010111000111011100101101000110101100000110101100010010100", + "1010110111010001001111011100110010110110111100100000100000100001000001101011000001101010101011001", + "0101101010011010101010100110001110101000110110000101101000100110110010010010010010010010000101001", + "0011110110011001111111100111110111010111110010011000111110010110111111001010011111001011000000101", + "0100101011111001100010011010101001010000111010101010110011011101110100111110010100111111111000010", + "0001110011001010010100000111010001111101100111111011111001101010000101001111100101001111110111100", + "0011001110101100011100010001110100011110000000110011011011010010001010011111001010011110110100000", + "1110110111110100010010001010010010101010011111110101011011011111001001001001001001001000101000111", + "1111011100100010111001000001100010111011100001110001110010011010110000011010110000011010100100010", + "0111010011111100100010110001110111011011010001001101011100101100101100000110101100000111000110100", + "1110111001000001110001111000000101110011101101011110111110011101101001001001001001001000011110010", + "0101000000100111001001010101011001100001000100101110000000100000001001111100101001111100010110011", + "1001001110010100001111110111011000111101010111000111001100110000011001010011111001010011110101111", + "1010100000010001001111011110010010100110111100100000100000110001011110010100111110010101001100111", + "0101111000010010101010100001000010101000110110000101111101100100111100101001111100101000000010110", + "0011010010001001111111100101111101000111110010011110101110110010100100100100100100100101000011010", + "0100111111100001100010011000111011111001111010101100110001011111101011000001101011000001111111001", + "0001100011000010010100000011000110001100000111111101101010011000111010110000011010110001100010010", + "0011101010100100011101010011101010101110100000110101011011111010100110100100100100100101101011111", + "1110100011101100010011101100000010001011011111110001011011101000110000100111110010100010100011000", + "1111111110100010111000100001101011111011100001110011111010011111101001100101001111100011111111001", + "0111100011111100000011010111111010001010110001001111001101011100010101111001010011111110110001010", + "1110111111001000110001011010011000110011101101011100100110101001000011110010100111110001101111101", + "0101100010111111101001010011001100101001000110001110011000010110110010010010010010010000000111100", + "1001111110001100101110110101010101010100010101000101011100100110100110101100000110101100100100100", + "1010100010011000101110011000011111010111011011100110110001010101100001101011000001101011111111001", + "0101111010010011111010100101011011111000010110100001101101010010010000011010010010010011010001001", + "0011000110000000101111100001101010011110110101011100110110000010011101000010011110001111011010101", + "0100111111111001100101111010110000101000111101101000100001001111010010100110010101011000111000010", + "0001010101001010100001000001001100111100000001011001111011101010100011010111100100101000011101100", + "0000011010100101000000010111110101011110000010110001001011000100101110001111101010111100011110000", + "1110110001100100110010001000010111110010000100000101000011001101101001001001001001101011000110111", + "1100001000111010001110000011100011100010100010101011101010010000010000011010110000011010001010010", + "0110000111110101000101110101110010111010101110100011011100111000001100000110101100000110000010100", + "1111101001001000110101111110000000100011011100011010110110001001001011000001101001001000001010010", + "0111110000110010001001011111011100101000011011100010000000110100101011110100011000111001100100011", + "1011011010010010001000001111011101000101000000001101001100100010111111001010000000110101000101111", + "1010000110010011100010000010010111100111010010001010100000110011111000001101000111110011011110111", + "0110101100010001110110100001000011101000110100010111111101110010011000111000110110001010101000110", + "0011010100001101011111111101111010011011100001101001001110100100000100100100101010000110101011010", + "1111011011100101010101001000111000011011101001110000110001001101001011000001101001000001010001001", + "0000110001000001110011010011000100101010011000010101101010001000111010110000011100110000110101110", + "0000001100100111011000000011101101101010110001110110011011100100100110101100000010100101100110011", + "1010010011101001010010000100000111110111000000111001111011101001110000101011000001100010111110100", + "1111101100000100111110111001101011111111110110111010111010011111101001111010110000000011111110001", + "0000000011011000001111101111011110001010111111100110001101001000110101100110101100011111100011010", + "1111111011101000101101111011111110101111101111001100000110111010100011100001101011011001101011101", + "1000001000011011101001001010101110001001010111011111111110001000110010010000011010101000100011100", + "1011101000001000111000100101110111111100000100011101011100101111100110101100000110101100111110100", + "1011101011111010101000001000011010001111000011001110110001001101000001101011000001101010001000101", + "1011101010010001101110110101111110111000000111000000101011010000010000011010110000011010000100110", + "1000001001000100111111101001101111111010101101010100010010001100011100000110101100000110111111000", + "1111111000111111100101100010110101110100101101100001100111011000010011000001101011000000100111011" + ], + "3": [ + "1111111000110000001010100010000001110010011100100011001101011001100000010100111111101001101111111", + "1000001011101100010010011011101110010011000100001010100011010000010010100001011100011000101000001", + "1011101011011111100100100010110010100111011001000101000000110100001111101000000100000001101011101", + "1011101000110011000000011101101010100110011101110101011000001011001100111110001011000000101011101", + "1011101001101100010001101001011011111101100111111101010110001111111101001111111010110000101011101", + "1000001001011010100101100101011110001010110010111000110101101000100010010111100110101101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001101010010010010100000110001010001111110001110110011000111011011110101010110000000000000", + "0111011001011000101101111000000111111100010000011100110101101111100111010011111110101101000000110", + "1000010110110001001011100010000111110010011100100010001101011001100000010100111001101011111001011", + "0000011011101100010011111011101000010011000100001010000011010000010010100001011000011010010111010", + "1111100101011110100100100010110100100101011001001101000000110100001111101000000100000110110100110", + "1010111010100011000000011101101100101000011101101101011000001011001100111110001011000001101100001", + "0000000101101100010000101001011100100001100111110101010110000010111101001111111010110001000010010", + "0110101101010010100101000101011110110100110010111000110101100110100010010111100110101101000111100", + "0011000000101001001001001101011011000001011100101010110101011001100001000101110001101010111101001", + "0011101001101110011011001000110011110010100110111010011011010000010000000101001000011010010101010", + "0111110011011100100110001001101100000111111001000111111000110100001100011001010100000110010100100", + "1011001000110011001000100010110001010000001111001001001000001011001001011010100011000001001000010", + "1001010011100010010010010100000100010010100111110001110110000010011001111110000010110000000100011", + "0111011111000100101101100110000111010101000000011110110101100110000001010010011110101100000111111", + "1011010110100111001011101110000111101010111100110100001101001000000110010101011001101010011111011", + "0000011011111000010011100011101100001010110100000000000011001001110110100000011000011011110111010", + "1110100101010010100100110000110100100100010001000001011000101101001110101000010100000111010100110", + "1000111010110101000000001011101010101000111101100101000000010011001101011110010011000001001100001", + "0001000101101100010000110111011010110001101111110011001110000010111100101111100010110000100010010", + "0110101001011110100101010111011100111100000010100010100101100110100000110111001110101100100101111", + "0010000010111111001011011111011111001001111100101100101101011001000010100101011001101011011111000", + "0001101001110110011001010000110001100011110110101110000011010000110111100100101000011010110001001", + "0110110111001010100000000011101010000111010001011101100000100101101011111000110100000111110010110", + "1011001000100011011000111000110111010001101111011111011000010010101101111011000011001000101100001", + "1000010001100100001000000110000010010010100111110111101110011011111000011110100011101001000010000", + "0101111111011000101111100110000111111101010000001000101101111111100000110011111111000100111111100", + "1011100010110111011111101100000110001010110100101000010101011000100111110100111000010010100011001", + "0001101011101000001011100001101010101010110100010100010011001010110110000001111000100011101011001", + "1101100011010010111000110100110110001100001001011001000000101000101110001000110100101110100010101", + "1011111110111101010010001011101011111000101101110101011000001111101101011111110011011000111110010", + "0000100101100100011110110111011001110001101111110011010110011000011100101110000010101001110110010", + "0111111111010110110011010101011000000100001010101010110101100100000000110110001110111100110101111", + "0000000100111111010011011101011111010001100100110100110101001011000011100101011000101010101001000", + "0000011111100110011001010010110100010011100110101110011011011010010110000100101001111010100101001", + "0110010101010010110010000111101011010111001001000101111000110110001010011000110101100111000110100", + "1010011110111011010000111000110111101001101111000111001000010000001101011011100011101001011110010", + "1011010011100100001110000110100010010010111101101111110110000001111000111110000010011001110010011", + "0110101111010000111111100100100010101101010100011000110101101101100000110010011110110100010011111", + "1011110110111111000101101011000110111010100010101000001101011011100111110101011001110010101011001", + "0001001001100000000101100010101100110010110010011100000011001011010110000000111000001010000101001", + "1101100001010010111110110001100100100100001001011001011001010111001110001100110100000111000100101", + "1011001100011101000010001001111111000000111011110101000001100000001101011001110011000001111110010", + "0000100011100100000100110000001101100001111010110011001111100000111100101000000010110001110000010", + "0111111011110110111101010101100010000100000000001010100100111101100000111100001111100100110011111", + "0000000000111111010101011101001001001001100101110100110001011010100011101111011000000010101001000", + "0000011000000110000101010011110100011011100001101110010101011011010110011100101001100010100101001", + "0110110010110010111010000110101011010111001101100101111110110110001010000000110101111111000110100", + "1010011000111011010010111001010111101001101100100111010110010000001101001011100011111001011110010", + "1011100111100100011010000110010010010010111111101111101111100001111000111010000011011001110010011", + "0110101101110000110011100100010010101101010110011000111100001101100000110100011111010100010011111", + "1011000010111111010111101011010110111010100001101000010100111011100111110011011000010010101011001", + "0001111011000000000001100011010100110010110110111100010010001011010110001010111000100010000101001", + "1101000001010010001100110000100101000100001000011001111100110011001110000010110101101111000100101", + "1011111111011101011110001000101111111000111010110100010110001111101101000111110010111001111110010", + "0000100010000101101100110000011110001001111011010011101000001000111100110110000011001001100010010", + "0111101011010111010111010100111010101100000001001011100011111010100000100110001100010101101011111", + "0000100010111111000000011101001110001011100100110101110100101000110011100001011000000110100011000", + "1000111111000111000101010010100111111111100000101110001010101111101110000010101001100100111111001", + "0110100101010011011011100110111000001001001100000101111001011011110010011110110101111000010011000", + "1110011011011011111011011000011011011101101101100110101001001101100101010001100001111010001011110", + "0111000011100101111011100110100100010110111000101110101011101001010000110000000001011011100101111", + "0010011000110001010010000101000010000111010000111000011010001101000000101100011001010101100100111", + "0111000001011111010111101010100100100000100001101001110010110000000111101011011110010011111111001", + "1101011000100001100001100010001000000010110111011101110100010000110110011010111100100011010001001", + "1101000100010011101101110001000011100110001111111000011101011101111110000110110101101011010010101", + "0111101101011100011110001000110110101100111101010101010111100110110101000001110010111110001000010", + "0000010011000101101101010001101110111111111011010011001001101101000100110000000011001110100101110", + "0011111110110110010110110100111110110000000000001011000010100000001000101100001100010111111110011", + "1100010001111110100000110100101111001101000010010101110000110010001011101011011010000000100110100", + "0100101110000111100100100011101100110001000110001110101100111011110110011010101111100011001010001", + "1010100101110010111010010111011001001101101101100100011111011101101010000110110011111110000010100", + "0110001011011010111010100001010011011000001101100110101111001011101101000001100111111000001010010", + "1011010010100101011011011111110101010000011001001010101011101011001000110000010011011101100100011", + "1010011000110011110011111101011011000000110000111110111010001011011000101100000111010011100101111", + "1011000000011110110110010010110101100100000000001010010010110110011111101011000000010001111110001", + "0101101000000010100001000010001000000111110110111101110100010110111100011010110010100101001001101", + "0001000100010101101100000001000010100000101111111110111101011111110100000110111111101001001011101", + "1111011101011010111110101000110111101011011101010100110111100100110011000001110100111110010000110", + "0000100011000101001100000001101110011001111011010111101001101101000010110000000101001110110101110", + "0000001110110100010110111100111111110011100000001011000010100000001100101100001000010111100110011", + "1010010001111110000001110100101110001011000010010001010000110010011011101011001010000100111110100", + "1111101110000101100101101011101111111010000110001001101100111111101110011010110111100101111110001", + "0000000011110011111011011111011010001101101101100111011111011000110010000110101011111000100011000", + "1111111001011001111011011001010110101100101101100110101111011010100111000001101101111011101011110", + "1000001010101011011010110111110010001000011001000000001011101000100010110000001001011111100011111", + "1011101000110111010011000101011111111100110000101001011010001111111110101100011001010011111110111", + "1011101010001110010110111010110111001000100000001100110010100100111001101011011110010101101000101", + "1011101010011010100000001010001101111111010110100101110100000101011010011010111110100001100100110", + "1000001010010011101100011001000011010110111111111100111101011000010111000110100111101000001111000", + "1111111001010110111110110110110000101001011101000010110111111010010100100001101100111110001111011" + ] + }, + "21": { + "0": [ + "11111110110001001010001110010011101100100110011100101110011101010001111101010001100010101111001111111", + "10000010100101110010011010111001010100001101111101000101111100110010111000110010100001000000001000001", + "10111010001000011010110110101110001101100101001111010101001110001000101000001000111001010101001011101", + "10111010111011100010000100010100001101011011001001111011001000000100101110000100110110011011001011101", + "10111010000111111100111000111111011010010000101011111000101011100111011111100111010101111010101011101", + "10000010001000011111110111100010111001100000010110001000010001011111001000111111001101001101001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000100101110111011010100011100000001000100110001000100011100101011000100101010100111100000000000", + "10110111000000111001011111111111010110000000010011111000010011011111111111111111110101000110001001011", + "11110000110001001010001111110011101100100110011100101110011101010001110011010001111011001000110110000", + "01111111000101110010011010111001010100001101111111000101111100110010111000110010111000100011010101100", + "00010100001110011010110111001110001101100101001111010101001110001000100000001000101000010000001101011", + "00000110011011100010000100010100001101011011001011111011001000000100101110000010101110011100000011010", + "01000100000001111100111001000101011010010000101010011000101011100111000101100001001101111111100000110", + "00010010101010010111110111010100111001100000010010101000010001011111010101011001010101001111011000001", + "11001101010101001001101100010101010110111110010100001110010101010011111011010111110011001011010110000", + "10110010101111001100110010100010111011101101111101001101111110110100011000110100011000101010110101100", + "00101001101010010001010100101000110111111101000111110101000110001100101000001100100000010010001101011", + "11001011110001001101101100001111100010111011001001100011001010000010001110000010001110010100000011010", + "01111001100011100110111010100011100000001000100010100000100011100001001101100001000101111101100000110", + "11011111000010111001111111001111010110000000010000111000010010111001110100111001110101000111011000001", + "01110000110001011011101111110011101100100110011100110110011100110111110010110111111011001001010110000", + "00111111000111111011111000111000010100001101111111010101111101010100111001010100111000100010110101100", + "11010100001110001011110111001110101101100101001111001101001111001100100001001100101000010000001101011", + "11000110011001100010000100010101101101011011001011100011010001100010101111100010101110011100000011010", + "01000100000111101100011001000101111010010000101010000000110010000001000100000001001101111111101000110", + "00011111101010010110010001111110111101100000010011111000001000111001011111111001010101001111111110001", + "10001000110101010000101000100010010100111110010110001110000100010111101000110111110011001010100010000", + "01111010101111010100110000101010111101101101100010101011100111010100011010110100011000101011101011100", + "00101000101010000001110101100010010111111101011110001011011111101100101000101100100000010011100011001", + "11001111110001001101001010111111100100101011010011111101010011100010001111100010001110010100111111010", + "00111101000011100110011111111000100100011000110111010100110010100001001001000001000101111100000100100", + "00010110000010111001011101101111010100000110001101001110001010111001111001011001110101000111011100001", + "11110100010001011010101111110101001000100000000101100000000100110111101111110111111011001000111010010", + "01110110000111111011111100000101010010010011100000000011100101010100110100010100111000100010111001111", + "01010000101110001011110011010101001001101001011010111001011111001100100100101100101000010001100001000", + "11001111011001100010000111110100001111000101010110010101010001100010100010000010101110011100001111001", + "01001100100111101100011001000011111111100110110011010110110010000001011001000001001101111110000100100", + "00011011101010010110010000001000111111011111001101101110001000111001011001111001010101001111010100010", + "10001101110101010000101001101110010011010011100001100010000100010111111111110111110011001010111010011", + "01110011101111010100110001000010110001110010000000100011100111010100010100110100011000101010111001111", + "00100101001010000001110100101110000011101010111110111011011111101100110100101100100000010011101001001", + "11001010110001001101001011010011100100100100010110110100010011100010000010100010001110010100001111001", + "00110101000011100110011111011000101101000101010111010101010010100001001001000001000101111100001100101", + "00011110000010111001000100101111000100011111101101001111101010111001111001011001110101000111010100010", + "11111100010001011010101111110101001000110001100101100001100100110111101111110111111011001000110010010", + "01111110000111111011101101100101001010010010100010000010100001010100110100010100111000100010111001111", + "01011000101110001011101010110101010000101000111000111000111001001100100100101100101000010001100001000", + "11001111111001100100000111111110011111000100110011111100110111100010111111100010101110011100111111001", + "01001000100111101100011001100011111110000111010010001111010100000001011000100001001101111110100010100", + "00011010101010010000011000101010100111111111001010101111001100101001011010111001010101001111101010010", + "10001000110101010010110001100010001011110011100010001011100010001111101000110111110011001011100010011", + "01111111101110010100110000111110101001110010000111111010000001001100001111110100011000101010111111111", + "00101100001011100111110100111110010011101010111101001010111001110100110001001100100000010011010100001", + "11001110010000101111000011101101111100100100010011100100010111110011010111110010001110010101010011101", + "00111100000011000100000111000100111101000101010000000101010100111000111100011001000101111100111001101", + "00011010111010111001011101101101000100011111101000111111101100100000000100100001110101000110000000110", + "11110101001000111100101111110101001000110001100110010001100010101110001010001111111011001000001111110", + "01111010111110011001110101000101001010010010100101010010100001000101100001000101111000100011100100011", + "01010001101110001001101010110101010000101000111101101000111001010101010001110101001000010001010100100", + "11000011100001100010000110110000011111000100110011100100110111111011011111111011001110011101011010001", + "01000000111110001010011001000001111110000111010000100111010100011000111100111000101101111110111001000", + "00100111110011110100011000101110100111111111001000111111001100101000001100101000010001000110001001110", + "10111000111101010010110001101010001011110011100110110011100010001110001010101110010101010010001111111", + "01000110010111010100110000000100101001110010000101010010000001001101101001001101111110110011101100111", + "00111101110011100111110100101000010011101010111101001010111001110101010001010101000110001011010100101", + "11011111101000101111000011110101111100100100010011100100010111110011010111110011001010000101010010101", + "00001101001011100100000111011100111101000101010000000101010100111000111100011000100011100100111111001", + "00111010011010111001011101101001000100011111101000111111101100100000000100100000010011011110000101010", + "11000100101000111100101111110011001000110001100110010001100010101110001010001110011101010000001101110", + "01101111111110011001110101111111001010010010100111111010100001000101101111100101111100110001111110011", + "01101000100110001001101010100011010000101000111010001000111001010101001000110101001110001011100010100", + "11101010100001100010000111101010011111000100110110101100110111111011001010111011001001100010101010001", + "01111000111110001010011001100011111110000111010110001111010100011000111000111000101010000000100011000", + "00001111110011110100011000111110100111111111001011111111001100101000011111101000010000111000111111110", + "10111101111101010010110001010100001011110011100000000011100010001110000111101110010100010110010011111", + "01011111010111010100110001011100101001110010000101100010000001001101101100001101100111010100011100111", + "00011000010011100111110100101000010011101010111011011010111001110101001100110101011111101101000110101", + "11010110101110101111000011110011111100100100010011010100010111110011010010010011010011100010101000101", + "00001001001011100100000111100010111101000101010110110101010100111000101001011000110010100000100011001", + "00110010111110111001011100110001000100011111101000001111101100100000001001100110001010111001110001010", + "11000001001010111100101111110011001000110001100000000001100010101110011111101000000100110110011101110", + "01100010011000011001110101000101001010010010100101100010100001000101100100100011100101010100111110011", + "01100100100010000001101010001111010000101000111011011000111001010101000100110001011111001100101110100", + "11101011100001101010000111101010011111000100110011010100110111111101010010111101010001100010101010001", + "01110101111010001010011001000101111110000111010110110111010100011110101001011110110010000000101011000", + "00001111110101101100011000101000100111111111001000001111001100101110001001001110001000111001010011110", + "10111101111001000011110001010100001011110011100000000011100010001010011111101010000100010110110101111", + "00011111010111011101010001011100101001110010000101100010000000101011100100001011100111010101111100111", + "01011000010111101110110100101000010011101010111011011010111000010011000000110011011111101100100110101", + "10011010101110110110000101110011011100100100010011010100010110010101010100010101010011100011001000101", + "10110101001111110101100011100010111101000101010110110101010101111100101111011100110010100000000011001", + "00001010111010110000111100111110000100011111101011111111110101000110001111100110001010111000111111010", + "00000000101100110101001101100011101000110001100010001001111011001000011000101000000100110110100011110", + "11111110111000000000110011101011001010010010100110101010111000100011111010100011100101010101101010011", + "10000010100010011000001110100011110110101000111110001000101000010001001000110001011111001100100010100", + "10111010000001101011100001111111111111000100101011111010101110011101011111111101010001100011111110001", + "10111010111010000011111010011100011100000111001101100001001101111110110010011110110010000000111101000", + "10111010110101101101011110101000100111111111010101011001010101001110001000101110001000111000100111101", + "10000010011001000011010101110010101001110011110011010111110011001010000100001010000100010110101001110", + "11111110110111011101010111000011001111110100011000110100011000101011100111001011100111010101000010110" + ], + "1": [ + "11111110111001010001000011010001111100101001100011010110000011010001111101010110000011010011001111111", + "10000010000010001101000000110011111101000010100100100101100100100010111100100101100000110100001000001", + "10111010111111100000111000001001001111010000111110010101011110010000101110010101011000001001001011101", + "10111010101011100111010111100011010001111100101001111011010001111100110001111101010110000111001011101", + "10111010100010000110110101111110110010011111001011111000110010011111001111111110110101100110101011101", + "10000010010000100000101101100011001000101110010110001000001100101111011000111110001101001001001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000011010101100110101100011010010111100100010001000110100111101001000100100110101111000100000000", + "11110010100100011100010100111111110010100110010011111000001101000001101111111000001101000000110011101", + "00000101111101110000111010010111111100101000011010101110000011001111100100110110000011001110110010010", + "00000111100100101101111000110100111101000010111001000100100100100100111101010101100000110101010011111", + "00010101011110101000101000001100101111010000101001010100111110010100100111001101011000001100001011000", + "00001110011111101000010110000010110000011100101110011010110000011100101001100101001110000010011101001", + "10100001001010010011110101100001010011111111001101111001010011111111000010000110101101100001111000110", + "01101111101000111000101100111001001001011110010101001000001001001111001000111110010001001001000000101", + "01001100011100001100000010110111100101010010010011001110000101001011100100010010010101001110001111000", + "01110110001001101101111001010100000111010011111000101011100110101100000111010011100110101101000100000", + "11000100111110100011100001001100111111101011000000010011011110010100111111101011011110010101110001001", + "10110011000100011001001011100010010011110101001110010100010010010011010011100101010110010011111101001", + "01111000110011011001000010000001010010111100100101111101010011111000110010100100110101111000111110101", + "11011011000110011011010010111001101011000000010101000001101011000000001010111110010100100000101110010", + "00011101100011101101011100010111100101001110011011001111100101001110000100110000011010101110101110010", + "00110110010111010101011001010100100000110101111000100100100100100100100101010010111101000101001101111", + "10100100111000110111001001101100111000001101001000010100111110010100111111001000101111010101010101000", + "11110010011001111010001111100010110110000101001110011100101000011010110001100100101000011011110011001", + "00011001110111001110101100100001010101100110101101111111001011111001010010000111001011111000011000100", + "00011111111101000010110000111111001001011110010111111111010001011000001111111110010001001000111110010", + "10001000100001001110010101100011100101010010010010001011110101010110011000110010010101001111100010011", + "11111010111001010000111111101010000110110101100110101010000110110101101010110011111111001010101011111", + "10011000111110110001000111100010111110001101011010001010111110001101011000101011000111110011100011001", + "00011111100000011101101011111111010110000011010111111100010010010011011111110100001011110101111111001", + "10100101100101110000100010000100110101100000110100100101010011111000100001011101000010111101101100101", + "10100110100010110101010010010100001101011000010010010111110010100000000001000111110010100000110100010", + "01001000000001111000011101111010000011010110011010011001111100101110010111101001111100101111010011101", + "10111111111000101110111101111000100000110101111101111010111001010101101100010010111101000100000000010", + "11011000010010011000101111111000111000001101001011011000101001001101001000101000101111010100011000110", + "01000011101110101110101001010110101110000011010111010100101110000011011100000010101001111101110110000", + "11110100110011101111101011010011001101100000110010110111001101100000100110100001001010011111110100100", + "11001010011101000011110000001010010101011001001110001111010001011000000110001001010000111111110100010", + "00010001010100000011110100110100010011010111100010010011110101010110010110001111110100010011011010011", + "01001010101001011000000110111101100000110100000111111010011111010011111101101010011111010011011001111", + "11010000111010000010111111000001011000001100111000100010100111101011010100110010100111101010101000111", + "11011011001111100001110010101111010110000011010010101101001111100101000010110100001011110100010000110", + "10110100011011001101110010100100110101100000110111010100100100100100101001011101000010111100010001010", + "01111011111101111110010010110100010100111000001101001110010100111000001001000001101010100111001011001", + "10100000100001001001111101111100011010110110000100000000011010110110010110001111100100101000000100110", + "01100111110000110100011101111111111001000100100001100010111001010101101101100100100001010010000000111", + "00011000111111010000101111101111001001010100111011011000101001001101001101010100111001001000011000000", + "11101111111111111010110000111111001110011010110111111010101111100101001111111010101111100101111110101", + "10011000101111111001010010100010101101111001010110001001001100000110111000111001001100000111100011010", + "00001010111100111110101101101010010101011001001110101000010100111111011010101001010000111110101011101", + "00001000100111110111000010100010010011010111100110001110010010010011101000101111110100010011100011100", + "00011111101100111011100001111111111001010010000011111011111001010010001111101100000110110010111110100", + "01111000000110110010111001010001000001101010111000001011000001101010110000010100111110001011001100111", + "11000011000111100011110011011101001011110100010101100101001111100101010110010011010110000101010010110", + "01011101010101011101010010111110100010111101010110000100100100100100111101111000110101100100100101010", + "00111011100001000001001010001110010010100001101110111000001100111110000101000000001100111110011111001", + "00011000111011001110100100001010011100101111100010010110000010110000001011001110000010110000010001100", + "10111110010101110011000001101011111001000100100011010101100001000010100000100100100001010011110010000", + "10011000011110101100111001010011001001010100111011101101011001010000110000010100111001001001001100111", + "00101111101010001010010111010101001111111100101101100011001111111100111110011010110110000011000010010", + "00111101100111111110010100111100101100011111001100100000101100011111011101111001010101100000100001010", + "00010010001100001100101100000111010000101111010110111000010100111111001101011000001101011000011001101", + "11000001111011111011100010001001110100001011110000110110010010010011101011010110000011010110010011100", + "10011010000100111000100001100010011111001010000011010101100000110010001000110101100000110011110010100", + "01100001101000001101111001010000100111110010111001001101011000001010110000001101011000001011001011001", + "11001011100011010110110111011101001011110100010101100011010010010100010110010011010110000101000101010", + "01110100100011001000010100111110100010111101010110000000110011111101011101111000110101100100100100100", + "11110110110001010100101100011110001010100111110110111000001010100111100001000110001101011000011110001", + "10000100110000110110000010010010000100101001111110010110000100101001101101001000000011010110010001100", + "01111111100011100000000000111110100101000011111111111101100001000010101111110011100000100101111110000", + "00011000100001000100111000100010111111010001001010001101011001010000101000101001011000010101100010111", + "01101010110010101111101110101010101001111101001110101011010110011010101010100011010110011010101010010", + "00001000100001000000101100100011001010011110101110001000110101111001011000100000110101111000100010100", + "00011111111110010100110101111111010000101111010011111001001001001001011111111000001101011000111110010", + "10000101110010010111010010100101110100001011110011100111100101001111100000010110000011010110000100011", + "10100010101100111111100000100110000110101010011110000100000110101010001011110011111000110100011101111", + "00111100110101100110111000101110111110010010100100101100111110010010101101001011000000001101000111011", + "11000110100101000110110111101010010010000101001100001011010010010100010011000101001010010010001001010", + "11111101010100110011010101101101010011100100100011001000110011111101001001000100100011111000000011110", + "10000111001001111000110101110101101010111110010001110110001011000001101001111110001011000000001001101", + "10100101101111111000011010000011100100110000011001100000000101001111101011110000000101001111100100010", + "01110011101001110101011100100000100101000011111100100010100100100101111010110011100000100101000111111", + "01011100100111000100001111111110111111010001001011011000111110010101011011001001011000010101011111000", + "00010111010000010001001000010000110000011011001011010010110000011011011101000101001111111010101001001", + "01010001011000000011001011010011010011111000101110100001010011111000100100100110101100011000101000100", + "00101110100011111101110100101001001101011000010000010001001001001001001110011111010000101001010010010", + "01111001111011100101010011000011100011010110010001111111100101001111111001110011110100001110110100011", + "00111010000110010100000000000000000000110011111100011010011110101100000010010010011110101101111101111", + "01011100010101000011011000011000111000001011000010101010100110010100100000101010100110010100100111001", + "10011011111000100010110011110110010010000101001010001100001010000011010100000101001010010011001001001", + "10110101001110101001110011110101010011100100100110101101000011100000101111000100100011111000000010101", + "00001011111001101101110010111111101011011000001011111111101011011000001111111110010010100110111110010", + "00000000111000010000011100100011100101010110000010001001100101010110011000110000011100101000100010010", + "11111110011110011110011100101011100000110101100110101010100100100101111010100010111101000011101011111", + "10000010010001001010001110100011011000001101011110001000111110010101001000110000101111010000100011000", + "10111010000000111000110001111111010110000011001011111100101001111011011111111100101001111011111111001", + "10111010101000101110110010000000110101100000101101111111001010011000110010011111001010011000111001000", + "10111010110011110000101000111001001101011000010101001111010100111000001000111111010000101000100001101", + "10000010101000010101100100010111100011010110010011001011110010010110000100010011110100001110101111110", + "11111110110100001110010111010100011000110101100000101010011000110101100111010100011111001011000100110" + ], + "2": [ + "11111110010000111111101001011010100001011101000100000011000011001110000010101001111100101111001111111", + "10000010000011111011111000111110111001010011100000101000110110010101100001000010111101000000001000001", + "10111010011110010100110010101001111110010100111001000000000100000101011001010000101111010101001011101", + "10111010011110100100111110100000011110100111101111001110010111100011010111111100101001111011001011101", + "10111010100000000001111000111110010111101011110011111101110101111000101111111111001010011010101011101", + "10000010001100011110010000100011010100111110001110001101011011111000011000101111010010100101001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110011100000011000100010010011111001010010001101101001101000101000111101000100110100100000000", + "00110011100001111111100111111111000101111100110011111101001100111000001111100111110100100110111010000", + "10001000110010111111101101111010100001011101000010011011000011001110000010101001111010101000101011100", + "10011111000011111010011010011110111001010011100001100000110110010101100001000010111101000011001010000", + "10100100011100000100110100001001111110010100111110010000000100000101011001010000101111010001010010111", + "11010011011100101101111100000000011111100111100111001110010111100011010111111100101001111101110100010", + "00110000000110011000011011001100001110001011101100100101110101111000110100011111001010011110011100100", + "11111110101100011110010001110011010100011010010100000101011011111000001100111110010100111110100110010", + "01111001000101010110101111010010111100001001110101011011011111011110000010010010010010010010101000011", + "01101111101100010010001010110100110000010011011001111000100001010101100001010011111001010011100011111", + "01011001101001100100110110100011100011100000001001000000011000010101011001101011000001101011010001011", + "00100011110101001100101100110010000111100001011111010110000000100011010111110100001011110100111100010", + "11001001110001101001011001111100001010111001000011111101101001101000110100111101000010111100111110110", + "00001010000111110110100111011001000100111100111100010101001100111000001100100111110010100110101111001", + "10000100110000101110101101101110111000111101011010010011000011001110000010101001111100101000101010010", + "10010011000001110011111100000110111001110111111001101000010110000101111001010011111001010011001011111", + "10100000011110001101110100001111100111010010101110000001000100010101000001001001001001001000010011000", + "11011011011010100100111100001010000110100101101111001110010111101011001111100101001111100100010101001", + "00110100000100001001011011001110001110001101100100101101010111110000100100000110101100000111111100100", + "11101111101110010111110110111111011100111010000111111101011011111000001111101111010000101111111110010", + "01011000100111011111101110100010111100001111110010001010111011010110011000101011110100001010100010011", + "01001010101010011011001010101010101001010001010010101001000111001101101010101010011111001010101011111", + "01101000101011110101110110100011100011100110000110001001011010001101011000110010100111110011100011001", + "00001111110001010100101000111110001111000001001111111110100110110011011111100101001111100101111111001", + "11010101010011110001011111100100001010111111000101100100101011100000100001000100100100100101101010101", + "00000110000011100111000110101001011101111110110010010100101110111110010001011110010100111110110010010", + "10100001010110100111001000010010111000111011010001001011000001000000001111110000011010110001110100010", + "10010010000111100010011110011000110001010111101010100000110110010011110100010011111001010010111101111", + "10001100111110011100110010001011100111010100101000011001100000001001000100101001001001001001100111000", + "11001011011000111100011101110100011110000011110001011111110001111011010010000101001111100100001001001", + "00111101100000010001111110111100000111001111101111101100110111100000100001000110101100000110100010100", + "11011011101010001111110011100011011100111100011111001101111101101000000001111110010100111111101000010", + "01100001100101000111101001010010110100001011111011000010011101010110010111110010010010010011000100011", + "01101011101110001010101011000100101001110101011111101001000011010011111100110011111001010011000111111", + "01111000001101111100010011001001100010100010011010000000011010011011010100101011000001101010111111001", + "00100010110001010100101000101110001111100101000100010110000000100101000010100101001111100100001011001", + "11101001010011110001011111100110011010111111011101110100001101100100101001000100100100100100001010101", + "00011010000011100111000110101111000100011000110010000100101010100000011001011110010100111111010010010", + "10000001010110100111001000001100111001111001000001011010000001010110001111110000011010110000110100010", + "10110110000111100010011110001010111001010011110010100000010000000101110100010011111001010010100101111", + "10111000111110011100110010001111110111010010110000011001000110001101000100101001001001001001111111000", + "11011111111000111100011101111110011111000011101011111111110101100101011111100101001111100100111111001", + "00011000100000010001111111100010001111001111110010001101110111110110111000100110101100000110100010100", + "11111010101010001111110011101011010100111110011010101100111111110110011010111110010100111111101010010", + "01011000100101000111101000100010101100001001101110001011011011011010001000110010010010010011100010011", + "01111111101110001010101011111110101001110101011011111000000110100011101111110011111001010010111111111", + "01011000001101111100010011001011100010100010011100000111011100110011010001001011000001101011001011001", + "00010011010001010100101001110010001111100101000011011111110100001100010111100101001111100101000101001", + "11100100010011110001011110011110011010111111011000100111100100101101011100000100100100100100111100101", + "00001010100011100111000110010111000100011000110110011011110010001001100100111110010100111110000110010", + "10010001010110100111001000001100111001111001000111011000011111001111101010010000011010110000001000010", + "10100111100111100010011111001100111001010011110101101011011010011101100001010011111001010011100011111", + "10001001111110011100110011101011110111010010110101001000011000000101010001101001001001001001001001000", + "11010011111000111100011101001100011111000011101101000110110000010101011111100101001111100101000101001", + "00100101100000010001111110111010001111001111110001101010110001011110111100100110101100000110100110100", + "11001010001010001111110010100000010100101110111000000100101111010111001100111110010100111110011110010", + "01010000100101000111101000110001001110011000001110010001010010011011101010110010010010010010010010011", + "11100111001110001010101011111011101111100101011011110110011111100100001001010011111001010011111011111", + "10001000001101111100010011010111000010100011011100000011000100010100110001001011000001101011011011001", + "10010011010001010100101001111011101111110100100011011101101100101011010111100101001111100101011101001", + "01100100010011110001011110000111011000100110111000100101110101101000111100000100100100100100100100101", + "10001010100011100111000111110110100110001001010110011101101011001110000100111110010100111110011110010", + "11010001010110100111001000101100111001101000100111011100000111101000001010010000011010110000010000010", + "01101111100111100010011111111111011111001010010111111001000010111010101111110011111001010011111111111", + "00001000111110011100110011100010110011010011110010001010001001000000101000101001001001001001100011000", + "01011010111001011010000100101011111011010011001110101000101001010010101010100011010110000010101011001", + "11101000101001110011100110100010101111000110010110001110101001111001011000100000110101100000100010100", + "01001111100010101001100010111110110100101111111111111110110111110001011111111000001101011000111110010", + "11010001000100100101111000111011101110010000001011011011000011011111100111110110000011010110000100011", + "11100110010110101010110011100111001011100100111110100010001111100100001100010011111001010010000011111", + "00001000100100111110001010110111100010110011111100011011001101110010111100101011000001101011011101001", + "11010011011001010000101001001101101001111100100011011011101101101100001010000101001111100100110101001", + "01100101100010010011011111101101011110111110011101101101100100001111010001000100100100100100110000101", + "10001011100010000001011110001010100000001000010111001001101010001111100001111000001101011001101000010", + "01010001111111000101010000001100011001110000100101000000011110101011100111110110000011010110000100010", + "00100111101111000100001111111011011001000010010001101111010010111110111100110101100000110100000111111", + "00001000011111111110100011100000110101001011010000000100010000100110111100101101011000001101011111000", + "01010010100000011100000101010001111101010010001000010010110001010100111010100101001111100100110111001", + "01100101001001010011100111011010001111011110010001110110101000011101010101000110101100000110110100100", + "00001010000010001011110010010110110010100111111000000010111111010011010111011110010100111111101100010", + "11010001010100100101101001011011101000001000101011011111001011111101100001110010010010010010000010011", + "00100110001111101100110011100111001101100101111010100100000111100010001010010101100000110100000101111", + "01001000100100011110001011010111000010101011111110011011000101110000111100101101011000001101011111001", + "10011011011001110010111001001101101011111101100111011001100100001000001010000011010110000010110001001", + "10110101110010010011001110001101011010111111111101101001111101001011010000100000110101100000110010101", + "00001011111011000111011111111111100110000000010011111001101010001111111111111000001100111001111110010", + "00000000111111100101010001100010111111110001100110001000011110101011111000110110000010110111100010010", + "11111110101111100110011111101011011101001011010010101111010010111110101010110101100001110000101011111", + "10000010001111111110110010100010110111010010010010001100010000100110111000101101001001101011100011000", + "10111010001001111010001101111110111101011011001011111010110001010100101111100011010110000010111111001", + "10111010111001110101110111000110001001000111010100100110101000011101001101100000110101100001100001000", + "10111010100011101101110010010110110000100110111010011010111111010011010001011000001101011001011001101", + "10000010011100100101100000001101101100001001001101011111001011111101110101010110000011010111010111110", + "11111110011111101000110010001100001011101101111010101100000111100010011111010101100000110100110100110" + ], + "3": [ + "11111110000101111010001110111010011100001110011001110011000011010001100011010110000010101111001111111", + "10000010111110100001110010101001111110000111110000101010100000110011100100110100100101000000001000001", + "10111010100111001100010101101100000111000010101100111000111000001001011110001100111111010101001011101", + "10111010010110101010000100111010001001110111100111100110010110000011001000000010101001111011001011101", + "10111010001011001100111001111110101010111001010011111101110101100000111111100001001010011010101011101", + "10000010000011001100011111100010010011101001111010001110001101001001001000111000010000101101001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000010010100001111000100011101010101110010110001100110101111001011000100000100010111100100000000", + "01110110001101110001011111111111010010101100000011111101001101000111111111111000001010100110100000110", + "01001100100101111010001110111010011100001000011010101010100011001001110101010110000100101000110010000", + "00110011001110100001110010001001111110011101110111110010000000110010100100110100100101000011010010100", + "00000101111111001100010101101100000111011110101000110000011000001000111110001100111111010001001011011", + "11100111110110101010000100011010001001101111100011100110010110000010110000000010101001111101100100010", + "11111000001011001100111000001100101010101111010100001100110101100001010011100001001010011110011100100", + "01011110100011001100011011111100010011101001111010000110001101001001010001011000010000101110100110010", + "11011100100100010111001100111111011100011100100011100010000011001111111101010110010100001010001000011", + "01010011000000011100110010110100111111001001101101010000100000101100011110110101100110101011000011111", + "10010101111110100001010001101001000111000011000001110000111000010100101110001101011110010011101001011", + "10100111111000010111000100111111001000111011000001000100110110000010010010010010010010010101100101010", + "01011000010010100001111010001001101010101011000101011101110101100001010011111001010011111100100110110", + "00011110101101010001011001011001010010101100100000111101001101011001101011000001101010100110111110001", + "01011100111100011010001010110010011100011001100010111010000011010111100101001111100100101000101010010", + "00110011001111000001110110001001111110000101100111101011100100100100100100110100100101000011001011111", + "00110101111111101100010001101100000111000111100000111001011110010100111110001100101111010001010011000", + "11110111110110001010000100011010001001111111110011100110010000011010110000000010110000011101110101001", + "11101000010011101100111000011100101010101111010100011101010011111001010011100001010011111110000100110", + "01011111100010101100011110111110010101100000001011111111101101001001001111101001001001001110111110001", + "11111000100101110111001100100011011010011100111110001011000011001111111000101111100101001011100010000", + "01111010101000111100110101101010111001000001000110101000100000101100001010101100000111001010101011100", + "10001000100111000001010001100011000011000010111010001001011000010100111000110100111111110011100011001", + "10001111101001110111000000111111001010110011010011111101010010010010011111100010010011110101111111001", + "01010001000010000000011101101001101000101010001101110100110011111001000100100001010010111101110010101", + "00100011111101010000011110000101010100100100101000110101001011000001100110011001101011000000101010010", + "01011001101101011011101111000110011100011001100111100011100101001111110000010111100101001111000100010", + "00111110001111000000110010100101111100001101100100001010100000100100101011100100100100100100000101111", + "00100100110110101101010110000110000111000111100000000000111000010100101001010100111110010100010111000", + "11001010100110001001100011010000001101110111110011111111010110011010111101011010110001111101100001001", + "11101001011010101111011101101000101010101111010001010101010101111001000110111001010010011111101010100", + "01010111100010101110111011010010010001100000001001111111001001001001000110001001001000001111101000010", + "11101001101100110001101011011111011110011100111011011011100101001111110010001111100100101011000100011", + "01001110010000111011110011101110111001001001000101001001100110101100001011101100000110101101000111111", + "10000000110110000000010100011101010111011010111100111000111110010100101011010100111110010100011111001", + "10001010111001110000000010010011001010111011010010100100010010010010011101010010010010010010110011001", + "01001001011011000110111001101010101010101010001101101101010011111001000100111001010011111001110010101", + "00010011111100110010111110001011111110100100101000100100001011000001100110000001101011000110101010010", + "01011101101101011001101011011110100100000001100111100011100101001111110000001111100101001001000100010", + "00111010001111100011010100111110101100001101100100010010100100100100101011100100100100100010000101111", + "00100000110111111010110100010100000101000111100000000000111110010100101001010100111110010000011111000", + "11101111100110000101000100111110101111111111110011111111010000011010101111111010110000011011111111001", + "11101000111011101101111101100010111010110111010110001101010011111001001000111001010011111001100010100", + "01011010100010110011011001101011110001100000001110101111001001001001001010101001001001001000101010010", + "11111000101100001000001111100011111100011100111010001011100101001111111000101111100101001110100010011", + "01011111110000100111010010111111010011001001000111111001100110101100011111101100000110101101111111111", + "10000001110110010010101001001010111111011010111000100000111110010100101110010100111110010100001011001", + "10001011111001110101111010100110011010111011010011100100010010010010000000010010010010011110000101001", + "01001100011010111111011000000101101100101010001110010101010011111001000011111001010011110110000100101", + "00110110111101001110000111110111110001100100101000000100010011000001111001000001101011000001011110010", + "01011000101101010011000010010000001101000001100011111011111101001111110101001111100101001111110000010", + "00111011001111011110000100010000011101101101100101010010111100100100110110100100100100100100010011111", + "00100101110111010010101101101010100001100111100011111000101110010100101110010100111110010100101001000", + "11101011100110010000100100101111100010111111110011011101010000011010100010011010110000011011000101001", + "11101000011011111000100100100111010010010111010101001011010011111001000011111001010011111000100110100", + "01010110100110101101100001111111000001000000001000111101001001001001011011001001001001011000011110010", + "11111000101110001001101111110011011011011100111000100101100101001111110101001111100101010110010010011", + "10010111010110100000001010111010001100001001000101101111111110101100010100101100000110110100110011111", + "01001000010000001101011001001101010110011010111000100010100110010100101110010100111110001100101011001", + "11001111011011101110110010000010111011011011010011100000001010010010000000010010010010010010100101001", + "10001100011010111111000001100001011100001010001110010101000011111001000011111001010011111001000100101", + "11111111111001001101111111010000101001100100101000000110001011000001111001000001101011000000011110010", + "01010000001011001110010011110101100100100001100011111101100101001111110101001111100101001110010000010", + "01111111101111000000001100111111111100101101100111111000100100100100101111100100100110110101111111111", + "00101000110101010010110101100010111000000111100010001110111110010100111000110100111000001101100011000", + "00101010100010010110111101101011010010111101110010101001001001111010111010111010110110000010101011001", + "00101000111111100000110101100010110011110101010010001111001010011001001000111001010101100000100010100", + "00011111100000100101101001111110010000000010001011111011010000101001001111101001001001001001111110010", + "00111101001100000001110110000011100010111010111011100011110100001111111000001111100101001110100100011", + "10011111010100110000010010100001100100001111000100010011111110101100000011101010000110101101100101111", + "10001100110000011101001001010001011111111010111000000110100110010100100001010010111110010100111111001", + "11000010111001111110110010110101001010011001010111111110001010010010010101010100010110000011110001001", + "01001000111000110111011001110101010101101010001101010011000011111001001111011101010101100000110010101", + "11110011111001011101101111101100001000000110101001111010001010100001101111100001101101011001101000010", + "10010100101001000110011011001010000100100011100111011001100100101111111011101111100011010110000101110", + "01110110101101001000011100000011111101101111100001001110100101000101100010100100100100110100000110011", + "11100100010111011010100101011000111000000001100010111000111111010101000011010100111110001101011110100", + "00101011100010000110110100010111010011111001110110100111001000011011010101011100110000000010110010001", + "11100001011101110000101100111100110010110111010111101101001011111000101100111111010011100000110010100", + "00011011100010100101110001101110010001000011001100100001010001001001001110001111001101011001101010010", + "11111100001110000001111111000011100010011101011101000111110101001111111001101011100011010110000100011", + "00011110010100110000000010000001100101001011011110110001100111001010000010001100000000110100000101111", + "01001101110010011101000001010001011111011001000100100100111111110010100000110100111000001101011110101", + "10011010011011111110101011110101001010011000000001011000010011110101010100010010010010000010110000101", + "10110101111010110111001000010101010100101101000110010111010010111100101110111001010011100000110011001", + "00001010111101011101101110111110001000100011101111111100010010100000001111100111110011011001111111010", + "00000000101011000110011011100010000100000000011010001111111100101110011000101001111101010111100010010", + "11111110001101001000011100101011111100101110111110101110111101000100111010100011111000110100101011111", + "10000010110111011010100101100010111001000110001110001010101111010100101000110001001000001101100011000", + "10111010011110000110110100111111010011111100101111111111010001111100111111111101010110000010111111001", + "10111010101101110000101101000000110010110011001111010001010010011111010011111110110101100001100011000", + "10111010101000100101110000010000010001000011011101000010101000111110001001001111001101011001011101101", + "10000010111100000001111110010101100010011111110101111000100100010010000101001011100011010111010101110", + "11111110011000110000000010110101100101001000000101110001000111010101100111001010011000110100110000110" + ] + }, + "22": { + "0": [ + "111111101000110011101110010011000100000000011000101010011111010100011000110100011000101011100010001111111", + "100000101101111110100010110010011000010100101000010000111111001100101000001100101000010001011110001000001", + "101110100001001110101100111101000110000100001110010100010011100010001110000010001110010101010111001011101", + "101110101101111000010110011000111110110101001101111111010100000001001101100001001101111110110100101011101", + "101110100101011110000011111110101001101101110101111111101100111001110101111111110101000110001101101011101", + "100000100110100101111001100011000011001111110010100011100010010111110010100011110011001010000101001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001010010101110110100010011101011111010100100011001100111001010100100011010101001110001001000000000", + "101101110001001110100001111110001000000011111010111111100010101111111010111111111011001000000101101001011", + "011010010100110011101110010011000100000000011000101010000001001100011000110100011000101011100110000000110", + "000000100101111110100011110010011000010100101000010000111001010100101000001100101000010001011110111000001", + "110011011001001110101100111101000110000100001110010100010111110010001110000010001110010101010010010110000", + "011010110111100000010111011000111110110101001101111111010100011000101101100001001101111110110011010101100", + "110111011001000110000011111110101001101101110101000111101100100000010101011001110101000110001011100101011", + "011011111010101101111000101001000011001111110011001011100010001110010011010111110011001010000101110011010", + "000101001101110000011010001111110000110010111000100010100001000101111000110100111000100011100100110000110", + "110111111010001100111010110001010011011000100000010010111001110101000110001100100000010011011110100000001", + "101100000010011100111000100001110010110110101110011100110111111011001000000010101110011101010000101110000", + "101101101100000010001110011111110101111001000101111101010100111000100011100001000101111100110011001101100", + "101000000000010100010111100110011101011111010101001111001100101000010001011001010101001110001001010101011", + "101100100001010111000001101100001000000011111010001001100010101110011101010111111011001000000101110011010", + "011010010100101011001110010111000100000000011001001010000001001101111110110100011000101011100110011000110", + "000000100001101110100001110010011000010010111001110000111001010101001110001000101000010001001110100000001", + "110011011011001111101000111101000110000010010111110100010111110011001010000100001110010101010010001110000", + "111011111111100001110111111110111110110101010100111111010100011000101011111111001101111110110011111111100", + "010110001001000110100000100010101001101011101101100011101100100000010011100011110101000110001010100011011", + "011010101010110101111100101011000010001111100011101011100010001110010100101011110011001010010100101011010", + "000110001101111001011011100011110000110100100001100010100001000101111100100010111000100011111101100010110", + "110111111010001100011011111111010010111100111001111110111001110101000110111110100000010011000110111110001", + "101100000010011101111011001101110011110000110111110000110111111011001000010000101110011101001001010010000", + "101110110100000011001011010111100101111001010101110011010100111000100010010011000101111000100011011001100", + "001000000000010100110110010010010100011001001101101001001100101000010001001001010101001000010001000001011", + "101111111001010111000001011100000000000111100011000101100010101110011100100100011011001110011101101111010", + "011010010100101011001101111011000101000110000001000110000001001101111110100111111000101101111111000100100", + "000011111001101110100110111010000000010100111000011110111001010101001111111111001001010101001111010100001", + "010011011011001111101101001001001111000010010110110010010111110011001010010011001111110011001010111010010", + "011001101111100001110111101010110110110001010101110011010100011000101010010010101010011000101010111001100", + "110111011001000110100000010111010000101011101100101011101100100000010011001010010010100000010011101001001", + "011000100010110101111101100001011011001111100011000101100010001110010100100100000100001110010100001111001", + "100101001101111001011011111111111001110100100000000100100001000101111100100101100101000101111100001100101", + "110100100010001100011010000110111001011100111000011110111001110101000111111111011111101101000111010100010", + "101100000010011101111011001100101111110000110111110000110111111011001000010001010001100011001000110010010", + "101110110100000011001011010110101111111001010101110011010100111000100010010010110010100000100010111001111", + "001000000000010100110110010010110000011001001101101001001100101000010001001000001000111000010001100001000", + "101111101001010111000001011101100100010111100011000101100010101110011100100100000100110111111100001111001", + "011010010100101011001101111010011011000110000001000110000001001101111110100111100111010100011110000100100", + "000011110001101110100110111011000100010100111000011110111001010101001111111111011111001100101111010100010", + "010011010011001111101101001001101101010010010110110010010111110011001010010011010011100010001010111010011", + "011011111111100001110111111111010010110000110101111111010100011000101010111110110010000001001010111111111", + "110110001001000110100001100011110110111010001101100011101100100000010010100010001010111001110011100010001", + "011010101010110101111101101010011111011110000011101011100010001110010100101010000100010111110110101011101", + "100110001101111001001010100011011011100101100001100010100001000101111100100011100101010100111111100011101", + "110111111010001100001010111110111111011101011110111110111001110101000111111111011111101100100001111110110", + "101100010010011101100010011100101101100001010000000100110111111011001001000101010001100010101110001111110", + "101110101100000111010011011010101001101000110011000111010100111000100010100110110010100001000101100100011", + "001011011000010010111111111010110110001000001001111111001100101000010000011110001000111001010101010100100", + "101111111001010011010000101001100100000110000101110011100010101110011100010010000100110111111011011010001", + "011010000100101101010100101010011011010111100110110010000001001101111111110011100111010100011000111001000", + "001011100000001000111110010111000100000101011110101010111001010101011111001011011111001100101000001001110", + "011111000010001011100101000001101101010011010010100100010111110011010011000101010011100010001110001111111", + "010011101111000011100111111111010010110000110011000101010100011000110010100100110010000001001101101100111", + "111011001000100000111001000111110110111010001011011111101100100000001011011110001010111001110101010100101", + "011100111010010011100101001100011111011110000101110001100010001010000101110000000100010111110011010010101", + "100001010100111101010011110111011011100101100100010010100001000011100100010011100101010100111000111001001", + "110010100010101110001010010010111111011101011110101100111001110011011110101001011111101100100000000001010", + "101000010011011011100010011100101101100001010000000010110111111101010000000101010001100010101110001111110", + "101010101100100101010011111010101001101000110011000001010101111100110011011110110010100001000101100100011", + "001100011001010000111110011010110110001000001001111001001101001110001001100110001000111001010101010100100", + "101001111001110101010001001001100100000110000101110110000011001000000101101010000100110111111011011010001", + "011110000101101101010100101010011011010111100110110101100000101011100110100011100111010100011000111001000", + "000111100001001000111110010111000100000101011110101101001000010001011110110011011111001100101000001001110", + "010111000010001011100101011001101101010011010010100011001110010101010010111101010011100010001110001111111", + "011111111111000011100111111111010010110000110011111110101011111110110011111110110010000001001101111110111", + "110010001000000000111001100011110110111010001010100010010011000110001010100010001010111001110101100010101", + "011110101010010011100100101010011111011110000100101010010101001010000100101010000100010111110010101010101", + "100010001100111101010010100011011011100101100100100011111100100011100100100011100101010100111000100011001", + "110011111010101110001010111110111111011101011110111111000110001011011110111111011111101100100000111111010", + "101001011001011011100010101000101101100001010001010111001000000101010001001011010001100010101110011011110", + "101010100110100101010010011010101001101000110011010100100011100100110011000010110010100001000100011000011", + "001111000001010000111111011110110110001000001000001100010001011110001000010010001000111001010101001000100", + "101011100001110101010000100001100100000110000100100010011101010001100100111100000100110111111010101110001", + "011111001001110101010100010110011011010111100111100001111110110010000111111101100111010100011000101101000", + "000111101011000000111111101111000100000101011110111001001110001000111110101111011111001100101001110101110", + "010100011010010011100100000101101101010011010011010111001010000100010011001001010011100010001110010011111", + "011101110111010010100110010111010010110000110010010100101011100111010100001010110010000001001100011110111", + "110010000100010001111001111011110110111010001010001100010011011111101100010000001010111001110101000100101", + "011100110000010010000100110100011111011110000101100010010101010011100011110100000100010111110010101100101", + "100010001100100100110010110011011011100101100101100001111100110010100001111111100101010100111000100101001", + "110000111010111111001101111010111111011101011111111001000110001010111001100111011111101100100001110001010", + "101001011111001011100010100000101101100001010001010111001000000100110111001011010001100010101110011101110", + "101010100110100100110000000010101001101010100011010100100011100101010101000010110010100001001100011110011", + "001111000001001001011101011110110110001110010000001100010001011111001100010010001000111001001101001110100", + "011011100001100100010110100001100100000110011100100010011101010001100010111100000100110111100010101010001", + "101111001001111101010100010110011011010011111111100001111110110010000001111101100111010100000000101011000", + "111000101011001001011101101111000100000101001110111001001110001000111000101111011111001100111001110011110", + "001011011010010010000110000101101101010011001011110111001010000100010111001001010011100010010110010101111", + "000110110111010010100000111111010010010000101010111110101011100111010100111110110010000001010100111110111", + "000000001100010000111000100011110111011000010011100010010011011111101100100010001010111001101100100010101", + "111111101000010010000110101010001110011110010100101010010101010011100011101010000100010011100010101010101", + "100000101100100100110001100011010010000101111101100011111100110010100000100011100101010010100000100011001", + "101110100010111111001101111110111110011101000111111111000110001010111000111110111111101010111001111111010", + "101110101111001011100011000000111101000011001000000011001000000100110111111100110001100100110111010011110", + "101110101110100100110000110100111000101000100011100000100011100101010100111101010011100101010100110010000", + "100000100001001001011100001000111111101000010001011000010001011111001100101111001001011111001100011010101", + "111111101001100100010111000000001101000110011101010110011101010001100010101001100011010001100010011100000" + ], + "1": [ + "111111101000001101000111010101100000110101100000101010011111001010011111010101100000110101100010001111111", + "100000100100001011010111001001001001001101011000010100111110010000101111001001001001001101011110001000001", + "101110101111011011110011100101001111100011010110010010010010010100001011100101001111100011010111001011101", + "101110101111100111111100011111001100000000110011100000110011111111001100011111001100000000110100101011101", + "101110101101100001001100111111110100111000001011111110001011000111110100111111110100111000001101101011101", + "100000100111010001001011100011110011010110000100100010000100001011110011100011110011010110000101001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000100000001101101100011010101011000001000100010001000101111010101100011010101011000001000000000000", + "111100101001010001001010111110011011010110000010111111100100101001111100111110011011010110000010010011101", + "111111010000001100000001001011111000110101100000110100000111001010011111001011111000110101100001100001000", + "110100100101101011110001110101001001001001011000001000111110010100101111110101001001001001011001011001110", + "101111011111011011110111110011001111100101010110000100010010010010001011110011001111100101010111010111111", + "000010111110111111111100111000101100000111010011100111010011111000101100111000101100000111010010110100111", + "010010011100110001101100100000010100111111101011011111101011000000010100100000010100111111101010001100101", + "101111111110100001101010101110010010010111100101010011100101001010010010101110010010010111100100000010101", + "011001000001111100000001000101111001010100100100110010100100100011111001000101111001010100100101100001001", + "101111110010100010010001010101000001101101011110001010111110010010100001010101000001101101011111011001010", + "001001001110111010110111111011001111100011010000000100110000011100101111111011001111100011010001010011110", + "011001111001010101011100011000100100100100100011100101010011111001010100011000100100100100100010110010011", + "110100010100001111101100101000010100111110010001011111001001001001001100101000010100111110010000001010100", + "100100110010010101001010001110011010101001111101010001100101010110000010001110011010101001111100000100001", + "011111001100010000000001001101111001001010011110110010000110110101100001001101111001001010011111100110100", + "010100101100101010110001110101001001010000111110001000111110001101001001110101001001010000111111011100110", + "011111011101011110110111110011001111110100010010000100010010000011001111110011001111110100010011010001011", + "010011111100100101111100111110101100000111010011111111010011111000101100111110101100000111010010111110011", + "110010001111111111101101100010010100111111101011100011101011000000010101100010010100111111101011100010111", + "100110101011110101111011101010010010010011110100101011100101001110000011101010010010010011110101101010110", + "111010001011101110010001100011111001010010111100100010100100100101100001100011111001010010111100100011010", + "011111111011001100000001111111000111110010100110111110111000001101011001111111000111110010100111111111001", + "110000011000100110100111101111001001111100101000010000110110000011010111101111001001111100101000100100001", + "110111100011000011011101001100110010111101000010110011000101100000110101001100110010111101000010100101110", + "100000010000000011100101010100001000101111010001101001010101011000001101010100001000101111010001111111010", + "001111111000010111010000110010000010101001111101000101111101010110000010110010000010101001111100010001000", + "000010001110010000011100111001100001001010011111000110011110110101100000111001100001001010011110010010110", + "011010101110101110100111000001001001010000101110111110111110001101011001000001001001010000101111001000001", + "110011001011011000111000101111001111110100001010010010010010000011010110101111001111110100001010100100000", + "111010101110100001101001100101001010011111001010010010110101100000110101100101001010011111001010100111100", + "100110000011111101100110110101110010100111110011001010001101011000001100110101110010100111110011000111011", + "000010110101110101111111111011100101001011110100000100010010010110000011111011100101001011110100110011010", + "000100011101101110001100111000100100100010111100000101111001010101100000111000100100100010111101110010110", + "010111100011001101000111101001011110010010100000011110100001101101011111101001011110010010100000101010001", + "111101011000100111011110010111010000011100101111101000101111100011010000010111010000011100101111100100000", + "110110100011000011001100010100110010111101000101101011000101100000110010010100110010111101000100111101100", + "101001010000000010000101001000001000101111010101110101010101011000001001001000001000101111010101100111011", + "001111111000010111011100100101100100101001111101010010011011010110000010100101100100101001111100001001010", + "001000001110010000101000111110000111001010011111000001111000110101100000111110000111001010011110100010110", + "011011101111001110100001100110111110010100101110011001001001001001011001100110111110010100101111110000001", + "110001001010011001011110001110010010010010001010110011001111100101010110001110010010010010001011011100000", + "111011111110010000101010111111010011111000101101111110101100000111010010111111010011111000101101111111100", + "100110001010001101100100100011101011000000010101100010010100111111101010100011101011000000010100100011011", + "000010101101010101011010101011100101001010010011101010010010010111100100101011100101001010010011101011010", + "000110001100000110101000100010100100100011111001100011111001010100100100100010100100100011111000100010110", + "010111111010111101000111111110111110010010100000111111000001101101011111111110111110010010100001111110001", + "111111011000101110111111010010110000011100101110000101001111100011010001010010110000011100101111101000000", + "110100101011111101101100100001010011111001010101011110100100100100100010100001010011111001010100000011100", + "101011001000011111000100011001001001001001001101100110010100111110010000011001001001001001001100110001011", + "101101101111110010011100010011100101010110000011101110011010101001111100010011100101010110000010011101010", + "011001001011010110001001110010000110110101100000100101111001001010011111110010000110110101100001011110010", + "101001100000000010000001001010111110001101001000110101001001010000111111001010111110001101001001101111001", + "010000010101001100011111000100010010000011001110111011001111110100010011000100010010000011001111101011000", + "011011111001000110101010100101010011111000101101011000101100000111010010100101010011111000101100101010000", + "110100001000111111100100011111101011000000010101001000010100111111101010011111101011000000010100110011001", + "000110101101011101000010010001100101001110000011101110010010010011110100010001100101001110000010110101001", + "110110011111111110100001110010100100100101100000001101111001010010111101110010100100100101100001011000101", + "101010110100101101001111001000111000001101011000110101000111110010100111001000111000001101011001000000010", + "111011000001100100111111000100110110000011010110010011001001111100101001000100110110000011010111101111110", + "000100111111101011110100100111000101100000110101011000110010111101000010100111000101100000110100000100000", + "011111000000010011010100011111010101011000001101100000001000101111010000011111010101011000001100110010101", + "111101100111110110010000010011111101010110000011101110000010101001111100010011111101010110000010011110010", + "001101001111010010011110110010011110110101100001100101100001001010011110110010011110110101100001011111000", + "101101100010000110001010101010111110001101011001010101001001010000101110101010111110001101011001101111110", + "001000001011001000001010100100010010000011010111011011001111110100001010100100010010000011010111101111111", + "000111111001000000100011111110110101100000110100111111001010011111001011111110110101100000110100111110111", + "101110001010111111101000100010001101011000001101100011110010100111110010100010001101011000001101100010101", + "110110101001011101010011101010010010010110000010101011100101001011110101101010010010010110000011101010101", + "111110001101111110111100100011111001010101100000100010100100100010111100100011111001010101100001100011001", + "101011111100101100001111111110100001101101011110111111011110010010100001111110100001101101011111111111010", + "110101000001100100110010110010101111100011010001001111010000011100101110110010101111100011010001111011110", + "000001101111101010000010110011000101100000110011000100110010111101000100110011000101100000110011011000011", + "010001000000010010010011001011010101011000001000110100001000101111010101001011010101011000001001001000100", + "110000101111110111010100100100011011010110000010011011100100101001111100100100011011010110000010110110001", + "000011010111010011000101100101111000110101100000011000000111001010011111100101111000110101100000110101000", + "101101100011000110001110111111001001001001011001001000111110010100101110111111001001001001011001001101110", + "001000011010001001101001010001001111100101010110101110010010010010001011010001001111100101010110110011111", + "000100111000011000100010010010101100000111010010101101010011111000101100010010101100000111010011111000111", + "101100011011010111001000001000010100111111101011110101101011000000010100001000010100111111101010100000101", + "110100111000010101110101100100010010010111100100010011100101001010010011100100010010010111100101101110101", + "111111001101001111111111111111111001010100100100000000100100100011111001111111111001010100100100100101001", + "101001110100010101001111100111000001101101011111011000111110010010100001100111000001101101011111101101010", + "110101000000011100010011001111001111100011010000110010110000011100101111001111001111100011010000000011110", + "000001101110001111000011000100100100100100100010110011010011111001010101000100100100100100100010000000011", + "010001000001101000010010001100010100111110010001110011001001001001001100001100010100111110010001011000100", + "010000101111110110010100100010011010101001111100011101100101010110000010100010011010101001111100110110001", + "100001010010111010100101100101111001001010011110011000000110110101100001100101111001001010011110110100100", + "111000100011100000101110111111001001010000111111001000111110001101001000111111001001010000111111101100010", + "001011011110111001001001001001001111110100010010110110010010000011001111001001001111110100010010000011011", + "000110111001000010100010111110101100000111010010111111010011111000101100111110101100000111010010111110011", + "000000001111010001001000100010010100111111101011100011101011000000010100100010010100111111101010100010111", + "111111100110111111110101101010010010010011110100101011100101001110000011101010010010010011110100101010110", + "100000100000001011111110100011111001010010111101100010100100100101100000100011111001010010111100100011010", + "101110100100101001011110111111000111110010100111111110111000001101011000111111000111110010100111111111001", + "101110101100001010010011111101001001111100101000000010110110000011010111111101001001111100101001010110010", + "101110101110001001001010111000110010111101000011100101000101100000110100111000110010111101000010110101100", + "100000101011100110000010101000001000101111010001011111010101011000001100101000001000101111010000001101001", + "111111101111110010010100101110000010101001111101010001111101010110000010101110000010101001111100000011000" + ], + "2": [ + "111111101011111000000011010111010110111110011010111000001101111100011000110100011111010101100110001111111", + "100000101110110101101001011111100000001010011010010101110010010010110100100101010011100100100110001000001", + "101110101001011000110000100011101001100111100100001100001001000110011001010010100100110011111111001011101", + "101110100000101111100011000000000001110101010011011010101011111000001010011110110101111111001000101011101", + "101110100101101110110011111110101001100001111011111111010001010010001111111111100000101010011101101011101", + "100000101011110011100101100010010001101100110111100010011011101101001011100010100100111001010101001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001100000000010011100010110111111111001110100011001111011001100101100011111001000100100000100000000", + "001110101001010010101010111111111100001011001100111111010000110011001100111111001010000000110011011100111", + "011100001001111000000011110101010110111110011011011011100101100100011000101010011111010101100110011001010", + "110100101010110101101001011101100000001010011011000111110010000010110101111001010011100100100011001100000", + "000110011101011000110001001011101001100111100100100001001001001110011000100100100100110011111101111001010", + "100011110110101111100011001000000001110101010010010010101011100000001010100000110101111111001100100100100", + "110110011011101110110010110110101001100001111010011001010001001010001111010101100000101010011001110100100", + "101111110011110011100101011010010001101100110111010100011011100101001010000100100100111001010100111011111", + "100001000010000000010011000000110111111111001111001101001111011001100101010011111001000100100000110110101", + "001001100001010011101011100011111100001011001100111011010000100011001011111111001010000000110011011011111", + "011100001001111000000011110101010110111110011011011011100101100100011110101010011111010101100110000001010", + "110100101010110101001001011101100000001010001011000111110010010010110011111001010011100100100011010100000", + "000110011001011001110001001101101001100111101100100001001001011110011100100100100100110011111101100001010", + "100011110110101110100011001000000001110101000010010010101011100000001100100000110101111111001100110100100", + "110110011011101111010010110110101001100001101010011001010001001010001001010101100000101010011001111100100", + "101111110011110011100101011100010001101100111111010100011011100101001100000100100100111001010100101011111", + "100001000010000001110011000110110111111111001111001101001111011001100001010011111001000100100000111110101", + "001011111001010010001011111111111100001011010100111111010000100011001011111111001010000000110011111111111", + "011110001001111000000010100011010110111110011010100011100101100100011110100010011111010101100111100011010", + "110110101010110100001001101011100000101010000011101011110010010010110010101011010011100110100010101010000", + "000110001001011001010000100011101000100111111101100011001001011110011100100010100100110001111101100011010", + "100011111110101110100011111110000001110101011011111110101011100000001101111110110101111111001101111110100", + "110101000011101111010011000010101001100001101011111011010001001010001000111111100000101010011001100010100", + "101100101011110011100101010100010001001100111110111010011011100101001100101010100100111101010101000001111", + "100000001010000001110011111100110110011111001111100111001111011001100000011001111001000010100000010100101", + "001010111001010010001010001101111100101011010101000001010000100011001011100101001010000110110011100001111", + "011111010001111000000011001001010110111110011011010011100101100100011111000000011111010011100110010101010", + "110110111010110100001001010111100001101010000011111001110010010010110011010101000011100000100010111100000", + "000111010001011001010000011101101001100111111100010101001001011110011100100100100100110101111100001011010", + "100001100110101110100010000111000000110101011011001100101011100000001100010010110101111001001100111110100", + "110101000011101111010011000010001001100001101011111011010001001010001000111111100000101100011000100010100", + "101100101011110011100101010101110001001100111110111010011011100101001100101010110100111101010100000001111", + "100000001010000001110011111100010110011111001111100111001111011001100000011001100111000010100001110100101", + "001010111001010010001010001100011100101011010101000001010000100011001011100101010100000110110011000001111", + "011111010001111000000011001001110110111110011011010011100101100100011111000000000001010011100111010101010", + "110110111010110100001001010110100001101010000011111001110010010010110011010101000101100000100010111100000", + "000111010001011001010000011100101001100111111100010101001001011110011100100100111000110101111100001011010", + "100001101110101110100010000110100000110101011011001100101011100000001100010010101011111000101100111110100", + "110101001011101111010011000011001001111001101011111011010001001010001000111111111110101101111000100010100", + "101100110011110011100101010100010001001100111110111010011011100101001100101010110010111101110100000001111", + "100000011010000001110011111100110110011111001111100111001111011001100000011001100101000010000001110100101", + "001011111001010010001010111110011100100011010101111111010000100011001011111111010100000111010011111111111", + "011110001001111000000011100011110110100110011011100011100101100100011110100010000001010010000111100010110", + "110110101010110100001001101010100001101010000011101011110010010010110011101011000101100001000011101010100", + "000110001001011001010001100010101001111111111101100011001001011110011101100010111000110100111101100010110", + "100011111110101110100011111110100000110101011011111110101011100000001101111110101011111000101100111110100", + "110110011011101111010011001101001001100001101110100001010001001010001001100101111110101101111000100001000", + "101111111011110011100101101000010001010100111011010010011011100101001100100000110010111100110101110100011", + "100010011010000101110011010110110110010111001011011001001111011001100001110101100101000011100000111101001", + "001011101001010110001010011100011100100011010010110101010000100011011010100101010100000111010010101010111", + "011101010001111010000010100111110110100110011000001101100101100100001110110010000001010010000111011110110", + "110101111010110000001001000010100001101010000110011011110010010010110011011111000101100001000010000011100", + "000000010001011001010001110100101001111111111011011011001001011110000100001010111000110100111101000000110", + "100000110110101010100010011100100000110101011111000100101011100000010101011000101011111000101101110101100", + "110010011011101101010010001101001001100001101010100111010001001010000001100101111110101101111000100001000", + "101011111011110011100101001000010001010100111011010010011010000101000100100000110010111100110101110100011", + "101110011010000111110011110110110110010111001101011011001110111001111001110101100101000011100000111101001", + "001011101001010110001010111100011100100011010010110011010000100011001010100101010100000111010010101010111", + "011101010001111110000010100111110110100110011000001111100101000100011110110010000001010010000111011110110", + "110101111010110000001001000010100001101010000110011011110011010010110011000111000101100001000010000011100", + "000100010001011001010001110100101001111111111011011101001000111110000100010010111000110100111101000000110", + "100000110110101010100010011100100000110101011111000010101010000000010101000000101011111000101101110101100", + "110010011011101101010010001101001001100001101010100001010000101010000001110101111110101101111000100001000", + "101011111011110011100101001000010001010100111011010000011011000101000100111000110010111100110101110100011", + "101110011010000111110011110110110110010111001101011011001111111001111001101101100101000011100000111101001", + "001011111001010110001010111110011100100011010010111111010110100011001010111111010100000111010010111110111", + "011110001001111110000010100011110110100110011000100011100110100100011110100010000001010010000110100010110", + "110110101010110000001000101010100001101010000110101011110011010010110010101011000101100001000011101011100", + "000110001001011001010000100010101001111111111011100011001000111110000100100010111000110100111101100010110", + "100011111110101010100011111110100000110101011110111110101000000000010101111110101011111000101100111111100", + "110011001011101101010011011101001001100001101011010011010110101010000001111101111110101101111001001011000", + "101001110011110011100100100110010001010100111011001110011111000101000101000010110010111100110101011110011", + "101101011010000111110011100010110110010111001101111011001001111001111001000111100101000011100000100011001", + "001000110001011110001011010100011100100011010010011101010100100011101010110011010100000111010010000000111", + "011100010001110110000011011101110110100110011001000011100000100100011110000000000001010010000110110100110", + "110110111010100000001000101100100001101010000111100001110111010010110010110101000101100001000010100001100", + "000111011001000001010000101000101001111111111010110001001010111110100100111000111000110100111100010100110", + "100010111110110010100010010110100000110101011111111010101000000001010100001100101011111000101101111101100", + "110011001011100101010011011101001001100001101011010011010110101011100001111101111110101101111001001011000", + "101001110011111011100100100110010001010100111011001110011111000100000101000010110010111100110101011110011", + "101101011010000111110011100010110110010111001101111011001001111001011001000111100101000011100000100011001", + "001000110001010110001001010100011100100011010010011101010100100010101010110011010100000111010010000000111", + "011100010001111110000011011101110110100110011001000011100000100101011110000000000001010010000110110100110", + "110110111010101000001000101100100001101000000111100001110111010011110010110101000101100001001010100001100", + "000111011001010001010100101000101001111011111010110001001010111110100100111000111000110100110100010100110", + "100010111110110010100000010110100000110011011110111010101000000001010100001100101011111000100101111101100", + "100011001011100101010101011101001001100001101010010011010110101011100001111101111110101101101001001011000", + "111000110011111011100000100110010001010000111010001110011111000100000101000010110010111100100101011110011", + "001011011010000111110111100010110110010111001101111011001001111001011001000111100101000011111000100011001", + "000110110001010110001101111110011100100111010010111111010100100010101010111111010100000111001010111110111", + "000000001001111110000111100011110110100010011000100011100000100101011110100010000001010010011111100010110", + "111111100010101000001001101010101001101010000110101011110111010011110010101011000100000001010010101011100", + "100000100001010001010101100010100001111101111011100011001010111110100101100010111001110100100100100010110", + "101110101110110010100000111110101000110001011111111110101000000001010100111111001010011000110100111111100", + "101110101011100101010100110101001001100011101011011101010110101011100000110010011111001101100000100001000", + "101110101011111011100000111100010001010000111010000010011111000100000100100001010011111100100101010100000", + "100000100010000111110111001100110110010111001101100001001001111001011001010100100100100011111000000001000", + "111111100001010110001101101000001100100111010011010001010100100010101010011000110101100111001011010100110" + ], + "3": [ + "111111100111001001011011111100000001011101001101100100101111001011100000101010011111010100011110001111111", + "100000101110010110110101110000000010101100101010000001111110010001001001010100111110001100111010001000001", + "101110101000001100010110101000000011010010100110110100001010010101001111110010010010000010010011001011101", + "101110100010010111011110011110100000100100010000110010110101111111001010000000110101100000110000101011101", + "101110100010100101110011111111001000010010111000111110001101000111110010111110001101011000001001101011101", + "100000100010101101110001100011010110010111110000100011110010001011100101100010010010010110010001001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000100110110110010100011111111111001101100100010000100101111001000100010010100111000010101000000000", + "011101100100100001101110111110011101010010101110111110110100101000000010111111111100110111111101100000110", + "100101010111011000111011101010000001011111010100011000001111001011100000110100011111010100011110011000100", + "001101111110010110110100100110000010101100101011010000011110010001001000001000111110001100011110100000001", + "000010000000011100110111010100000011010010110111010000101010010101001110000100010010000010110011001110010", + "100101101010000111011110000010100000100100010001111101110101111111001010111110110101100000110100100101100", + "001000000010111101010011110001001000010010110001101000001101000111110010100110001101011000001100001001011", + "011100110010100101110000101011010110010111110000010010010010001111100100101110010011010010010010000101010", + "110010000001001010011110011110010010010100000001101011001001000100100101000101111000110101111000100110110", + "000111100111111010110100010010100110001001110100010110001111110100111000001100100110010101000110111110001", + "011111000001101110001101011100010111101001100010111111011001111010110110000010101000011011001000110110010", + "101000110011011011011001001010101111000001000110111100110011111101000101100101010011111000110011011101111", + "011101011010100101101100001110011000001001101100001010110001001111010101011111001001001000001000011101000", + "011111110101110011101000100101010110010010100011001011000011001001111100001000000011010110000010011011001", + "101001000111010100111110000100000101111111011110001101100000101010011111001011100000110101100001100100110", + "001111110000111110101011100000101101001100101001010001001001010100111111110101001000001001001001011110001", + "000100000111111110101000101000000100100010110101010101111111110010010011110011001110000101001110010000000", + "100111111011010001011001111111101011100101111011111111100010000001010101111111001011111110101011111111100", + "000110001010110111010111100011101100110010011101100010000010111001101101100011110011000110010010100011001", + "011110101101101111101111101011111001110100110110101010000101010011110010101011100101001110000100101011001", + "110010001111001110000000100010110101000110100001100011011100110010111000100010100100100101100101100010101", + "010111111110101000110110111110001100101011011111111110011000010010100110111110111000001101011000111110010", + "111100010001100000001111111000110010001111101110101101010110011100101000010110110110000011010111100100000", + "000001100101010011000110101011000001000101100000001000100100111001010010010101000101100100100100100001100", + "101101010100100101110000001111011110111000101101010000100100101001001001001001010101011110010101111001011", + "110010100101100111101111010101011101110001001101010001010100110111100010100101111101001000011010010111010", + "011001000111011011111001101010000000111001110000011101101101010100000000111110011110101011111000110100100", + "010100101110110101110110100000100010101101101101100001011111001000101001100110111110010101011101101000010", + "100100001001111000110000110010000011110110010110001011101101100100001110001110010010010011010001000100011", + "111010110011000101011000000111100001000000110011100010110010011111001010000101010101100000110101000111111", + "100111001010111011110100100011101001010010110101110111101110100111110011010101101101011000001100111110111", + "110111110011100101010100011101110111110011010110111110110101001111100100111011100011010010010010010110110", + "000000011001001001011111100010110011010101000000111101001100100100100100111100100000110011111000010101010", + "101001111110111100110100001110000000101010010110001011101110001100111111101110111110010010100001001101001", + "101111010001101101001111011100110110001111000110101011011100000010110000001000110000011100101110000010010", + "111001100011111000011011001101001001000000000000001101110010100101000010001011010011111001010100000101111", + "111111010010100011101011101001011100101101001101010000110000111111010001010101001001001001001100011111000", + "001100100101110011101111010000010001110110000101010100000100101001111100110011100011010110000011110001001", + "001010000110110110011000101111000110111111011000011010000011001010011110111000000000110101100001110011010", + "101100101001011110001110100111001100101000001101100101101110010100111111100000111001001001001001101101101", + "110110001110011111101000110101100111100011110110011011111010010010010010001110010111100101001111000011100", + "000111111001110001011001111111101111000111111001111110000011100000110010111111010010011111001101111110100", + "110110001010110110010101100010101011010100011101100010000111011000001010100011101010100111110100100011001", + "001110101010101110101100101011001111010110110100101011000100010010000100101011100101001111100011101011001", + "010010001001001110000110100010011001100000100101100011011101010011100100100010100100100100100000100010101", + "010111111100101000110100111111011011001101011101111111011111110010111111111110111110001101011001111110010", + "111110001011100000101111010101111000101001101010111000110101111100110001010010110000000011010111110111100", + "000001100100110011100011001010111001100101100001101100000011111001010010111001010010100100100100010100000", + "101100011011000100110011000000110101011000101001010000100001001001001000000001001000111110010100101000111", + "110000100111000111101000110011000001110001001111000010110101010110000100001111100100101001111010000100010", + "011010011101011011111001100111001110011001110000011011101010110101100111100100000111001010011001000110100", + "010111100001110101110110111010010101001101101110010110010111001001011111010100111110010100101001111110010", + "100111010001111000110110000100101110010110010010011111110011100101010011011010010010010010001111101110011", + "111000101001000101011000010010110110000000110001101100110010011111010010111000110011100000101100101101111", + "100101011000111011110010000110100010110010110001100011101100100111101010001000001011011000010100110100111", + "110111110010000101010101110100001111010011010111011010101011001111100100001110000100010010010010110010110", + "000001011110101001000100110101011000110101000100111101000110100100100101101101100101010011111001000101010", + "101011111100011100111011100000011010100010010100011001111110001101011111010100111111110010100111011111001", + "101100001011101101010111011111111000100111000110101101010000000011010000010010110001111100101001110000010", + "111010101100011000000011010111111000110000000011111011111110100100110011011001010011111001000010010011111", + "111100001010100011101101011001110101001101001001000100101010111110001001100001001001001001010000110101000", + "001110111111110011100110100010000000110110000111011010000100101001100101101110000101010110011010011011001", + "001000010101010110000110001001001101000111011100001110000001001010000111100101100110110101111001011001010", + "101100101001011110001110101011010110010000001100000001110000010100111111010101001111001001001001101001101", + "110111001000011111110010000011101000011011111010001011110000010010010011011011001011100101001111110011100", + "000111111001111001010110111111110101000111110001111110010011100000110100111111001010011111001010111110100", + "110110001000101110001101100010100001101100000101100010001011011000001101100011110010100111110010100011001", + "001110101010110110110100101011000110001110110100101011001000010110000010101011100101001111110101101011001", + "010010001111011110000001100010010000101000101101100011000111010101100000100010100100100100111100100010101", + "010111111100100000111101111111000011101101011100111111011111110100111110111111011110010101000001111110010", + "111100000101111000110001111011111011110001111010000100110111111010110001001111010000011011001110000101110", + "000000111100101011100010101000110011111101100000011010011101111001010011000100100010111100100101100110011", + "101111000101000100101001011010111011000000100001110000101011001001001000101100010000101110010101111110100", + "110011110001011111100001100011010011110001000110011000100101010110000010000011111100101001111101001010001", + "011010001101001011100000010101000100000001101001101011100110110101100000000000011111001010011111001010100", + "011100111011100101101111100100000101010101101111000110011011001101001001011000111110010000100110110010010", + "101001010101111000110110010000101110011110011011111011100001100011001110001110010010010100000010010100011", + "111010111001001101010001110100100110000000110001011110111010000001001010001100110101111110101100000101111", + "101100011110100011101010100000100000101010100001111111111100111001110010010100001101000110010101011110101", + "110111101010011011000100011110000101001011010111001100111011010111100101110010010010001010010010010000101", + "001111001000101101011100110111010110101101001101111101001110110100100101000001111001000011111000010011001", + "100111101010000000101010111000001000101011111100000011100110001101011001011000100111110010100110010001010", + "100111011011111011010110100011110010110111111111011101001000000011010110110010101001111100101001111100010", + "110001110110001100000010001001101000111001000011001011101110100000100100110011010011111101010011011111111", + "110010001110100001110101001011110101000100100000100000101010111000010101010011001001001111001001001111000", + "011100101111111011111111000010010000101110000111101000000100110111111100111100000011001000000010110011001", + "100001010011001100010111001111001101001110101100010010011001010100011111111001100000101011100000110011000", + "111000110001000000011111000001011110001001100100010111100000001100111110101001001001010001001001001011110", + "001011011110011011101010000111100000010000001011001011111000000010010011110111001111110101001110100101111", + "000110100111101101110111111111100101001100100001111110001011100000110100111111001010011111001011111110111", + "000000001000100000100100100010101001110001000101100010010011011000001101100011110010100111110011100010001", + "111111100000111010110100101011011110010010110101101011011001010110010010101011100101001011100101101011101", + "100000101011001101111001100010011000110110110100100011000110110101111001100010100100100010100101100011101", + "101110100100110001000101111111001011110001001100111110011110001100100111111111011000010011011000111110110", + "101110101101101010000001000011111011111010000011111000001110000010101000000011010110011101010111001011110", + "101110101100111100110010010110110011100100000001001010001101100001010010100100100100111100100100101010000", + "100000101101000001010001100100111011001011010000000110000011011001001000111110010100101111110100010010101", + "111111100001001010000001010101010011111010000111111010111101010110000010101001111100101001111100010100000" + ] + }, + "23": { + "0": [ + "1111111011110101110100100100001100111110000110001010111000001010111001110101000111110101000110001100101111111", + "1000001010000011110000010010100101011011001010000100010010000100010111110011001011100010001110010110101000001", + "1011101001100010101100100110111000010000100011100101010011100101010100111000100010100001000101111011101011101", + "1011101010000100000111010100011000010100110011011111110011011111101100100000010010111001110101000011001011101", + "1011101001101000101110011111111111100101011101010001111111010001100010101110111110110111111011001111101011101", + "1000001000010101001111000100100011101101111100110011100010110010100001000100100011000101111100110001001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011110110011010010110100010100110010101010010100011010011100010001111100010001110010101010010000000000", + "1011011100001001101011111111111111111001011110110010111110110010000001001100111111001101111110110011001001011", + "0010000011110001100101100001001100111110000110001010100110001010111001110101000111110101000110001011101101011", + "0101111111100101100000110011000101011011001010000100101110000100010111110011001011100010001110010101100011010", + "1001000000100100111100100001111000010000100011100101000101100101010100111000100010100001000101111101100000110", + "0111011001100100001110010011111000010100110011011111001101011111101100100000001010111001110101000111011000001", + "1001010000001100110110111110010111100101011101010001100011010001100010101110000100110111111011001001010110000", + "0011001001110011001110100101110011101101111100110010000000100011100101010101100101000101111100100010110101100", + "0100100101001111000000101000010101111101001110001000111000010001011111001101011111010101001110001001001101011", + "1100001010111111011101001000100010101111101000000100001110011101010001100010001001111011001000000101100011010", + "1111100110011100001000001100100001110011101011100111001101111110110010000001001010011000101011100110001000110", + "1110101100111110111011101000011111100010010001011111110101011111001100101001110000111001010101001110101000001", + "1111110110010010001010010111001110100100010101010011110011010011100010001111110100010111110011001011000110000", + "1010111100101101101011111000010100111011011110110010111000110010000001001101100111010100011000101010101101100", + "0010000010010011101101000011001100111110000110001010100000001010111001110101011111101100100000010010001101001", + "0101111111100011100000010111000100111101001010000100101110010101010011100011010011100010001110010100000011001", + "1001000001000100110101100011111010110000100011100101000101111100110010100000110010100001000101111100000000101", + "1011011001000000000110010101111010010100110011011111010101000110001010111001010010111001110101000110011000010", + "1001010001001000110110011000010101000001011101010001111011001000000100110111111100110111111011001000101110000", + "0011001001010101010110100001110011101101111000100010011000110010100001000100011101010100111000100011001101100", + "0100100100101001011000001110010111011001001000010000101000001000111001010100101111001100101000010000010101011", + "0000111110011011011101001110111110001101101110011101111110000100110111111011111111100010101110011100111111010", + "0111100011111110000000101111100011010011101101111110100011100111010100011000100010000001001101111110100010100", + "0110101010111000111011001101101011100110010001011111101011001110001000111001101010111001010101001110101010010", + "1111100011110010000011010100100010000110010101010010100011001010000100010110100010010111110011001010100010011", + "1010111110101101101011111001111110111011000111010101111110101011100111010101111111010100011000101010111111111", + "1010010000010011101101000011111101111010011111101101010100010011011111101101001011101100100000010011101001001", + "1101011001100011100000010110010010011111010111110010011010010101010011100010000101100010001110010100010111010", + "0001000001000100110101100011110010010110110100111000011001111100110010100000000100100001000101111100010100100", + "1011101111000000000110010101110111010110101101000110001001000110001010111000011110111001110101000111001100001", + "0001000101001000110110011000100000100001000011001001101111001000000100110111110000110111111011001000100010010", + "1011101101010101010110100000100010101001100100110011001100100011100101010101110011010100111000100010111001111", + "0100100100101001011000001110011001111011011110001001010100010001011111001101101001001100101000010001100001000", + "0000111100011011011101001110101010001101110001100010110010011101010001100011000101100010101110011100001111001", + "0111110011111110000000101110010100010111110010000000111001111110110010000001000110000001001101111110000100100", + "1010001010111000111011001101001001001101101100101001000001001110001000111000011110111001010101001111010100010", + "1011110001110010000011010101000100110001000010001110101111001010000100010110110010010111110011001010111010011", + "0110001010101101101011111000011100111010100000101011100101001101111110110011110011010100011000101010111001111", + "1010010110010011101101000011111111101010111000010010110101110101000110001010101011101100100000010011101001001", + "0001011011100011100000010110010010011110110110010101111011110011001010000101000101100010001110010100001111001", + "1101000001000100110101100011110010011110010101111100111000111000100011100100000100100001000101111100001100101", + "1011011111000000000110010101110001001111101100100001101001000110001010111000011110111001110101000111010100010", + "0001110111001000110110011000101100111001100010101110001111001000000100110111110000110111111011001000110010010", + "0100101001010101010110100000100100100000000001000100001100100011100101010101110011010100111000100010111001111", + "0001110110101001011000001110000111101010011001010101010100010001011111001101101001001100101000010001100001000", + "0010111110011011011101001110111110001100010111111010111111111011001000000101111111100010101110011100111111001", + "0101100011111110000000101111100010000111010100011001100010011000101011100110100010000001001101111110100011100", + "1011101010111000011101000101101011011101101100101001101010101000010001011110101010111001010101001111101010110", + "1001100011101010100111001101100010111000100010001110100010001110010101010011100010010111110011001011100011011", + "0110111110101100101011111000111110101011000001001100111110101011100111010101111110110010000001001010111111011", + "1011100110001010001011001011110001111011111001110100001000010011011111101101011110001010111001110011010101001", + "0010111111110010000010011110001100000111110111110010001110010101010011100011110000000100010111110111010011001", + "1100010011010100110111110011111100010110010100111001101101111100110010100000010011100101010100111110111000101", + "1001111101001000000010011100011111001111101100100001010100100000010011011110101000111001110101000110000000010", + "0011100101000001110010011001110010100000000010101111010010101110011101010000000100110111111011001000001111110", + "0111011001010101110000101000011010110001000001000100111001000101111100110011000111010100111000100011100100011", + "0000000110110001111100010111010001111011111001010100000001010101001110001001111111001100101000010001010100100", + "0001001110011010011101001110001100010100110111111010001111111011001000000101110110000100110111111011011010001", + "0110000011100111100110100111110100010110110100011001100100011000101011100110110101100111010100011000111000100", + "1001101100101000011101011100010111011100101100101001010100101000010001011110101101011111001100101000001000010", + "1011100101111010000111001101101010100000100010001111011010001110010101010010100011010011100010001110001010011", + "0111011000111101101001101001110010100010000001001100111001001101111110110011000101010100011000101011101011111", + "1000010110001010001101000010101001111011011001110100001001110101000110001011011111101100100000010011010010101", + "0010101111100011100110000110101100000111110111110010001111110011001010000101110001100010001110010101010100101", + "1101110011010101010001101010100100010110010100111001101100111000100011100100010010100001000101111100111001001", + "1010001101010001100100011101011111001111101100100001010100100000010011011110101101011111101100100000000001010", + "0011000101011000010000010001100010100000000010101111010010101110011101010000000011010001100010101110001111110", + "0100011001010101010000110000111010110001000001000100111001000101111100110011000000100011100101010101100100011", + "0000010110111000111100000110101001111011111001010100000001010101001110001001111000010001011111001101010000100", + "0001111111101000101110000010111110010100110111111010111111111011001000000101111110011101010001100011111110001", + "0101100010101100111110100010100010010110110100011000100010011000101011100111100011111110110010000000100011000", + "1001101010111110111100111100101011011100101100101000101010101000010001011111101011011111001100101001101011110", + "1011100011000101111110111010100010100000100010001110100010001110010101010010100011010011100010001110100011111", + "0111111111011000011000010001111110100010000001001100111111001101111110110011111110110010000001001101111110111", + "1000000100000101001010001001011111111011011001110101110001110101000110001010001000001010111001110101000110101", + "0010001101000001101110000010100010000111110111110010010101110011001010000101100100010101010011100010101000101", + "1101010000110101011001101011011010010110010100111000011110111000100011100101100111111100110010100000100011001", + "1010011110110101101101011001101001001111101100100001000110100000010011011111111111000110001010111001110011010", + "0011010111111100000001110010000100100000000010101110101110101110011101010001010111001000000100110110011111110", + "0100111011010001010000110100010100110001000001000100100101010100111000100011010100110010100001001100011010011", + "0000110101111010110101100010110111111011111001010101101101001100101000010000001100001000111001001101001000100", + "0001001101101110101110100110110011110000110111111010000011100010101110011100100010000100110111100010101010001", + "0101100001101000100111100100110010010100110100011000000100000001001101111111100001100111010100000000101011000", + "1001011110011010110101011001111000111010111100101001011110101000010001011110111001001110001000111001010011110", + "1011100110000011101111011101101101100000111010001110101000001110010101010011010111001010000100010110110101111", + "0111111011111110000000010100000101100100011001001100101011001101111110110010010100101011100111010101111100111", + "1000000100100111000010001101011111011001001001110101110101110101000110001010001100010011011111101100100110111", + "0010001101000111101111000000100010000011110111110010010011100010001110010101100010010101010011100011101000110", + "1101010001010001011001101001011010010010010100111000000000100001000101111101000001111100110010100000100011010", + "1010011110010011101101111001101000101111100100100001011000111001110101000111011001000110001010111001110001001", + "0011010111111100011001010110000100100110011010101110110010110111111011001000110111001000000100110110011101110", + "0111101011110001011001110110010101010111001101010100110011000101111100110010110100100011100101010100111110011", + "0011110100111100110100000100110111011011111111001101110011010101001110001001010100010001011111001101101110100", + "1110101101001000110110100010111111010010101001100010111111111011001000000100111110011101010001100011111110001", + "0000000011001010101111100001100010110100100010000000100010011000101011100111100011111110110010000000100011010", + "1111111010011100110100011011101011011000101100101001101010111001010101001110101011001110001000111000101011101", + "1000001011100111101111011110100010100100100010001111100010010111110011001010100011001010000100010111100011100", + "1011101001111110000000010100111110100000000000101010111111010100011000101011111110101011100111010101111110100", + "1011101010100111000010001100101000111001000000010011000111101100100000010010100000010011011111101101110000101", + "1011101011000111101111000001000100000111111010000101001011100010001110010101001110010101010011100011011100110", + "1000001001010001011001101001110101010000011011100100100010100001000101111100100101111100110010100001111111000", + "1111111010010011101101111001010111001101101010111000001010111001110101000110001101000110001010111001001111011" + ], + "1": [ + "1111111011001000111110001101000111110010100111110010111001110010100111110010111001110010100111110100101111111", + "1000001001110010100000000010001111100101001111100101010011110100001011110100010111100101001111100110101000001", + "1011101010111110101001100001000100100100100100100100110010111101000010111101010100100100100100100011101011101", + "1011101010101001010101011001110101011000001101011000010010100111110010100111101100111110010100111011001011101", + "1011101010010001100100010111111111010110000011010110111110101001111100101001111110110000011010110111101011101", + "1000001001100110001111010101100010100100100100100100100011000010111101000011100011000010111101000001001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000001110010111110111100011001111100101001110100010001011110100001010100010001011110100001010000000000", + "1111001010100000101001110100111111001010011111001010111110101100000110101100111111001010011111001011010011101", + "0110000110001100100111001101000001110010100111110010100110010100111110010100111001110010100111110011101100101", + "1011111101110110110001100011001011110100001011110100101110010010010010010010110111100101001111100101100010101", + "0010010110011100101001000000100010111101000010111101000101111001010011111001010100100100100100100101100001001", + "0110001011001101010100011001010011000001101011000001001100100111110010100111010100111110010100111111011001010", + "1101100100110101101100110111111101001111100101001111100010101001111100101001111010110000011010110001010111110", + "1111111111100110010110010100011000100100100100100100000001010011111001010010011001000010111101000010110100011", + "1100010010010111000100101100101000010100111110010100111001001001001001001000101001010000101111010001001100100", + "1111111000010110011111000011001110011010110000011010001110000011010110000011010111111100101001111101100010001", + "1010000011100001001010100000101101111001010011111001001101100000110101100000110100011111001010011110000000100", + "0010001010110100001110101000010001001001001001001001110101001001001001001000001000111110010100111110111000110", + "0100100000101011011001101110010101001111100101001111110011001111100101001110000100010010010010010011010111011", + "1001101111001100001000101010111110101100000110101100111001001010011111001010111110110101100000110100101100011", + "0110110111001000001101010010100110010100111110010100100001110010100111110010100110001101011000001100001000111", + "1001001001001111110111110100101110010010010010010010101111100101001111100100101110000011010110000010000100110", + "0001000111110110011100011101000101111001010011111001000100100100100100100101000101100000110101100000100111010", + "1000001010100001000111000001001101000001101011000001010101011000001101011000001100111110010100111110111111001", + "1100100100010011010000001111100011001111100101001111111011010110000011010110000010110000011010110000101110010", + "1001111111111001100011000100000000110101100000110100011000100100100100100101100101010011111001010011001101111", + "0011100010010010010011110100111000001101011000001100101000010100111110010101011111001001001001001000010101000", + "1111111111111010111110011100111110000011010110000011111110011010110000011010111110000011010110000010111111001", + "0111100010100101100000111110100011100000110101100000100011111001010011111000100011100000110101100000100011010", + "0100101010000100101010101110101011001001001001001001101011011000001101011000101011011000001101011000101011101", + "1101100011001000001010101011100011001111100101001110100011010110000011010111100011010110000011010110100011100", + "1010111111011101001100101100111111001010011111001011111110110101100000110100111111010011111001010010111110100", + "1100000011010000001111010100110101110010100111110011010100001101011000001100110011101011000001101011101001010", + "1011101101001110010101110011011011100101001111100100011010000011010110000011111101100101001111100100010011000", + "1111110111101110111010011000011000100100100100100100011101100000110101100000111000100100100100100100010010111", + "0111101110100001100101000110001001011000001101011000001111011000001101011001101001011000001101011001001010011", + "0011010110000010010010001001110111010110000011010111101001010110000011010110001111010110000011010110100100000", + "1001011111111000100011010011110100100100100100100101001010110101100000110100001100100100100100100100111111100", + "0110010100000011010111101001101100010100111110010101010100001101011000001101010000010100111110010101100101011", + "1000111101011110100110100101000011111100101001111100110010000011010110000010110100011010110000011010001001010", + "1101100010010000111101000111011000011111001010011110100001100000110101100000111111111001010011111000000010110", + "0000111011010101001111101110100000111110010100111111011001011000001101011001100111011000001101011001010000001", + "0001000010011010000101101010001110010010010010010010110011010110000011010110001011010110000011010110111100000", + "1110001010001100000000101010000100110101100000110101110011010011111001010010000010110101100000110100111111100", + "0000000101011101000000110011001100001101011000001100110011101011000001101011010010001101011000001101101111011", + "1011101000101010011101000100000010000011010110000011111101100101001111100100111100010010010010010010001011010", + "0111110001101110100010000100000101100000110101100000111000100100100100100100111101111001010011111000001010110", + "0011001110100111101101011110011110111110010100111111101001011000001101011001101111000001101011000001010010001", + "1011110101000100000010110001110000110000011010110000010111010110000011010110001001001111100101001110010100000", + "1111011010011000100010000011010011010011111001010010010100100100100100100100001010110101100000110100011101100", + "1000010010000001011111010001001101001001001001001001001000010100111110010101010000001101011000001100000111011", + "1000111110111010110110011100111111100101001111100100111111111100101001111100111110000011010110000011111111010", + "1110100010110000101101011111100010000110101100000111100010011111001010011111100011100000110101100001100010010", + "0001101011101001000010011111101010111110010100111111101010111110010100111111101011001001001001001000101011001", + "0010100011010001110000110010100010010010010010010010100010010010010010010010100011001111100101001111100011000", + "1100111111111000000110110100111111010011111001010010111110110101100000110100111111001010011111001010111110000", + "0010000010001111001110101101011001101011000001101010011110001101011000001101001111110010100111110011010011001", + "1001101011110011000110100011110111100101001111100100001000010010010010010011110001110100001011110101010101001", + "0101010110011001001010000000010100100100100100100101101011111001010011111000010010111101000010111100111100101", + "1111101000011100101011011110101000111110010100111111010000100111110010100110101001000001101011000001000110010", + "0000000001010101010101110001000100110000011010110001010100101001111100101001000101001111100101001111101001100", + "1110111101000100110110010010100111000010111101000010100111010011111001010010111110100100100100100100000010000", + "1110100011101100100011101000011111010000101111010000011111001001001001001000000110010100111110010100101000111", + "0110001011001110110000000010010111111100101001111100010011100101001111100100001111111100101001111101000100010", + "1111100111100010100011000001110100011111001010011111110010000110101100000110100100011111001010011110100110100", + "1100111000101000111011111001001100111110010100111111001010101111010000101110101100101111010000101110001110010", + "1001100000100111011110110111000010010010010010010011000100001011110100001010100010001011110100001010001110011", + "1101001101100000100110110010100100110101100000110100100101001010011111001011000100101100000110101100101101111", + "1111110010011111001010101010011110001101011000001101011111110010100111110010011110010100111110010100110100101", + "0111111011111011100100100100001000010010010010010011110001110100001011110100001000010010010010010010110010110", + "1011000110001001101110000101101011111001010011111000010010111101000010111101101011111001010011111001000101000", + "1100111000011100001001011001010000100111110010100110101000100111110010100111010100100111110010100111011111001", + "1000100001011100110001110111010100101001111100101001000100101001111100101000010010101001111100101001110001110", + "0001001101001101010010000100100111010011111001010010100111000010111101000011000001010011111001010010010010011", + "0010100011100100000011110100011111001001001001001000011111010000101111010001111001001001001001001000110100100", + "0011111111100001010011111010111110000011010110000010111111111100101001111101111111100101001111100100111110001", + "1010100011101010010110011000100011100000110101100000100010011111001010011111100010000110101100000110100011000", + "1100101010000100110110011000101011001001001001001001101010101111010000101111101010101111010000101110101011110", + "1001100011011001011000010110100011001111100101001110100010001011110100001010100010001011110100001011100011111", + "0101111110010101111100110100111111001010011111001011111110101100000110101101111111001010011111001010111110111", + "0111110000100111100010101101101001110010100111110010001100010100111110010100001001110010100111110010100000101", + "0111101000111101101100010010000101110100001011110101100010010010010010010011100101100101001111100101001110101", + "1111000101001001100110011000111110111101000010111101000001111001010011111001100110100100100100100100000101001", + "1000101101011000010001000001100111000001101011000001011000100111110010100111111110111110010100111110001011010", + "1100100110111000111001001111001011001111100101001110110010101001111100101001010110110000011010110001100111110", + "0000011100101011000010110101000010100100100100100100110011010011111001010011010101000010111101000011100110011", + "0000100101000110000010101100101010010100111110010101010011001001001001001000001101010000101111010001111110100", + "0000111100100011001010000010000100011010110000011010111100000011010110000010100011111100101001111101010110001", + "1011010111001010001111000000000101111001010011111001111001100000110101100001100000011111001010011111010100100", + "1110111011101111110011001001011111001001001001001000101001001001001001001000111000111110010100111110101100010", + "1010110011111111010000101110001001001111100101001111010111001111100101001111010110010010010010010010000011011", + "0111001000001001100101001010001010101100000110101100010101001010011111001010010100110101100000110100000000011", + "0110110100101011111101010010010100010100111110010100001001110010100111110010001100001101011000001101011000111", + "0110011010010101010001110101110010010010010010010011100101100101001111100101100010000011010110000010010110110", + "1101110001010101001011111101011001111001010011111001111110100100100100100101000001100000110101100000010101010", + "1011001101100100001100100001000001000001101011000001100111011000001101011001011000111110010100111110001101001", + "0001000111111000100110001110101011001111100101001111001111010110000011010110110110110000011010110001100010010", + "0111101010100010000111000100100010110101100000110101000100100100100100100100110101010011111001010011000001111", + "0011110000100000000010010101010010001101011000001100001100010100111110010101010101001001001001001001011001000", + "1110101100111111010011111100111110000011010110000010111110011010110000011010111110000011010110000010111111001", + "0000000011000110010000111111100011100000110101100001100011111001010011111001100011100000110101100001100011010", + "1111111001010110001100101110101011001001001001001000101011011000001101011000101011011000001101011001101011101", + "1000001001101010111111001010100011001111100101001110100011010110000011010110100011010110000011010110100011100", + "1011101000011000000001001101111111001010011111001011111110110101100000110101111111010011111001010010111110100", + "1011101010101011011111010100100111110010100111110010111000001101011000001100100001101011000001101011001101001", + "1011101010010100110111110010001111100101001111100100010110000011010110000011001111100101001111100101100011010", + "1000001011011100101011111001000100100100100100100101010101100000110101100000100100100100100100100100000000100", + "1111111011100100001000100111110101011000001101011001110101011000001101011000001101011000001101011000111000011" + ], + "2": [ + "1111111000110011111110100111100000011010111110111100100101011101001000101101000111110101011000001000101111111", + "1000001001011111001111101101001101101000001101100011011011010110110111101010001111110010010010010010101000001", + "1011101001000001110011011110111011111000111101111000110000110111110111011001000100111001010011111111101011101", + "1011101000100011110100110101001011111111100100010110010010001000000100100111110100100111110011000111001011101", + "1011101010101000100101111011111111011001100001100111111110000010000000101001111110101001111101001011101011101", + "1000001000111001011001111100100011001101100011010101100011100100001001011011100011000011111000110101001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010100111100100001110100011100010101101001111100010000011000011101011100010001010010011010111000000000", + "0011001111011110011001111111111111110010001001111010111111100011100100111100111110101101100000110100111010000", + "1001100010110011011111100110100000001010111110111101000111011011001000101101000000010101011000001100010100101", + "0010111101011111101110001101101101101000001101100011000111010000110111101011001010010010010010010010011010101", + "1010010001000001110010011110011011111000110101111001000110110001110111011000100011111001010011111001111001001", + "1111011100100010010101010100001011100111100100010110011010001000000100100110010010100111110011000001001001010", + "1011110000101001000100011010011011011001100001100110011110000100000000101000011100101001111101001111010011110", + "1111001010111001011001111100111011011101111011010101101101100110001001011011111001000010111000110100110010011", + "1001110101111100111110010100010110110001111110010100111101011010011000110001001001010001001000001100001010100", + "0010001111101000101111001000110001011100111111001011001001010101010010001011001110011011010110000010000100001", + "0100000111011110110010001011001101101111010011010110101010110110100101000000101101111000110101100001111001000", + "1001101110000100110101010110110110110011010110110010011100001011101000110000010001001001001001001001000001110", + "1100110111110111000100101000101101001110000011001111110000000111000111101110010101001111100101001111001111111", + "0010111000001111111000111000000110001010001001100101110111100101101101001011111111001010011110101100100100111", + "0000000011010010011111000001000000000010111010110111000101011111011101010011000111110010100110010100001000101", + "1001101100001111101111001011001001101011001101110001011011010000111110101101001111110100001110000010000100101", + "0100000001110001010011111001111101011100010011101011010000110111110111011100100100111101000101100001100111001", + "1001111101110011110100010010101010000111100100011110011010001110001100110000010101000001101101011001011111010", + "0010000000001000000100111100011001011001100101111100010100000000010100010110011011001111100011010111001111110", + "0100001010101001011000111011111111011110111011011101110001100110000000011101111100100100100100100100101100011", + "0111100100001100011111110011110100010101011000010000111011011100011010110101001110010100111110010100010100100", + "0100111110111001001110001111111110111100111111010011111110010011011111111101111111111100110000011010111110001", + "1101100010111111111010101101100011101111010111011010100011110010110010111110100010011111010011111000100010100", + "0010101011010100100110010001101010110000110110101011101011001011100101110111101010101111001101011000101011010", + "0010100011000111110111001110100011101010100101011100100010001001000001101010100010001011100011010110100010011", + "0100111110011110010001111111111111101110001001110011111111101011100001011101111110101100000000110110111110111", + "1001010101010011010101100111001010000101111110100111111011000011001111001101010010010100111000001001101000101", + "0010011000011111110110001101111001101100001101101011110111101000110110101010111100010010010010010110010010101", + "1010100011100001101000011111111111111001010101111100110100001001110111011000111001111001010011111110010011001", + "1111101101100010001011010101110001100010100100001001111100100000000100100111101000100111101011000001001011010", + "1011100110001001011110011010010001011111000001101100100001011100000100001000001110101001100101001110000100010", + "1111111110111001010011111101001111011010111011000111000011100110001000011010001101000010100110110100011001111", + "1010100110011100110100010100010010110100111110000111011100110010011010110001010001010000111100001100000001000", + "0111111110101000100111001000101111011001111110000100100001011101010111101010110100011010110000000101101111001", + "0110110000111110111000001010100111101001110011101010010110101110100010100000111111111001010011100111000101000", + "0001001011001100101101010110100010110111010111010000101100110011101101111001100111001001001001001111010001110", + "1110010101010111011110101001001001001111100010101010000010111111000001111110001111001111100101001010111101111", + "0000001000001111100110111110011100001111001001100100010001001101110001000010000101001010000110101100111110111", + "1001110101001010000101000111001010000100011011010111111010000111000111001011010101110010111110010101001111011", + "1010001000011111100101001001111001101100001101110001110101010000110110100100111011110100010010000010101111010", + "1000000011111001011001111111111111011001010011101010010001011111111111000100111100111101010011100001101100110", + "1101101101100011111100010011110100000010100100011111111010000110011100111001101111000001101011011110110100001", + "0010000110000000001110111100001001011111000101111101100000011000011100010110001001001111100101010001110011110", + "1100101110101001000000111111000111011010111010011101000001011110000000010100001010110100100100100010111010011", + "0101000110010100000101110010011010010100111001110000011011100100010010101101010100001100111110010001100100100", + "0110111110111001010000001000111110111001111111010010111111111011000111100100111111100010110000011010111110001", + "0100100010110001101000101011100011101001110110111010100011101010101010100111100010000001010011111000100010110", + "0001101011000000111110000011101010110111010010101010101010001010101101111111101010101001001001011001101010001", + "1110100011001011101111001000100011101111100001011101100011101001101001110010100010001111100101010110100010000", + "0000111110001100010001110111111110001111001001110010111111101010010001010100111110101100000111010010111111100", + "1001100101011111010101101110100001000100011000100110011101000010100111001100001000010100111111101010110110101", + "1010101110011011110110010000000000101100001000101011000011101000010110100010001110000010010011010100110110101", + "1000110111111011101000011111110110111001010010011101000000001000111111000001101101100001010010011101011001001", + "1101101111100110001011010011100011100010100010001000111100100000011100111111010000111001101011000000000001010", + "0010110110000011011110011101110110011111000010001101100001011100111100010001010100110111100101001110001110000", + "1100111000101011010011101110110110011010111111000110110111100111000000010010111111000100100100101101100101100", + "0101000010010010110100010010000011010100111110000111101000110010110010101000000111010100111110011101010101011", + "0110011100111010100111000000101000111001100001000101000111011100100111100100001110011010110001100100011011010", + "0100000110110010111000000011011100101001100101001011110110101111001010100111100101111001010010000111011001000", + "0001111011000000001101001011011011101111011011110000011010110011001101111111010101011001001000101111101001110", + "1110000111001100111110101001000000010111100100101011110010111110001001110011011011010111100100001011101111111", + "0000001010001011000111111110001110001111010111100101010001001101110001010010111101010100000110101101101100111", + "1001100101011001100101000110101101001100000001010110111010000011100111001011001111101100111110010101010101011", + "1010001100011100000101111000000000100100000001110000000001010111110110100101110001110010010010010011010011010", + "1000100011111111111000011111101110111001010011101010000101011011011111000100010010111001010011111000111000110", + "1101001001100001111100011011110011110010110010011110011100000001111100111110101101000001101010100111000000001", + "0010110000000101001110010101101010010111001011111101000000011001111100010001000011001111100100101001101111110", + "1100011110101100100001000110110110000010101110011101110111011000100000010010111000110101100101000010000100011", + "0101010100010110000101110010011011001100101111110000101001100111010010101000000000001101011111010000110100100", + "0110111110111100110001001000111110111001100001010011111111111011000110000100111110000011010000011011111110001", + "0100100011010101101000101011100010100001101100111011100011101110001010100110100011100000110011111000100010110", + "0001101010000111011110100010101011111111011010101010101010001100101111011111101011001001001001001001101010001", + "1110100011101001001110101001100010001111100101011101100011101101101001010010100011001111100101001110100010000", + "0000111111001100010001110110111110011111011111111010111111101100010011110011111110101100000111001011111111100", + "1001100110011110010101001111100011001100010000101101011101000010100100101010010000010100111111110011000000101", + "1010111110111010010111110000010110110100011000101111100001101110010010100101110100000011010011110100001110101", + "1000110010011011101000011111010110100001000010010010010110001010111011000101000111100000101010111100000101001", + "1101001111000111101010010010000011100010111010011111101000100000011100111111011111011000001011000000010101010", + "0010010011100011011110011100101000010111011010001110100111011000111101010000110111010110000101001111111010000", + "1100001111001010110011001110111100010010110111011001010111100001000011010010110100100100100100100101011001100", + "0101110010010010010101110010011011010100111110011110111010110110110011001001010100010100111110010101001001011", + "0110001111111010100111000000000000101101101001000101010011011010100101000100111010011010101001111100101111010", + "0100000011110011111000100011001110100101111101011000110000101111001001000111111001111001001010011110101101000", + "0001101101100001001010101011101101101010000011110100111010100101001001111110101001011000010000101111010101110", + "1110000100101101011000101000100000010111010100100100100000100100001101110011110111010110010100001010110011111", + "0000101010101010010111111111001110001100010111110010000100111101110001010010110100110101100110101101111000111", + "1001000000111000000101000110010011001010000001010101111101111011100110001011101100001101011110010100100001011", + "1010111001111100000001111001101010100010000001101111100000101111110101100100000010010010010010010011101111010", + "1000010111111111100010011110110110111100010011110011000111110011011110100100111001111001010011111000100100110", + "1001011100100001111000011011011011110000110010011110011001000001111110011111100001000001110010100111110100001", + "0010110101000101011110010101111100010101101011101110011110110001111111110001001111001111111100101000011010010", + "0111101000001100110111000110000110000011101110011001010110011000100100010011000100110101111001000010111001111", + "0011110111110110001111110011111001001100001111111111110010011111010110101000101100001101001001010001101001000", + "1110101100011100100011001001111110111010100001000100111110011011011111100100111110000011010110011101111111001", + "0000000011010101101000101011100010100111101100111001100010000110010011100110100011100000110101111110100010110", + "1111111010110111011010100000101011111001011010110101101011110100100110101111101011001001001001001110101010001", + "1000001001010001010100101110100010001010100101000101100011000101110000001011100011001111100101001011100010000", + "1011101001011100010101110101111110011101011110110011111110101100011011101010111110101010011111001011111111100", + "1011101010001110000101001100000101001110110001110100110001101010100100110011011000010010100111110011110101001", + "1011101010111010000001110100001010110101011001101111100110101110001010110100010110000101001111110101011011010", + "1000001000011011100010011110011110100001100010010010110111110010111011011101010101100100100100111101011000100", + "1111111001001111111000010010011001100001111011011111111011000000000100100111110101011000001101000111001000011" + ], + "3": [ + "1111111001110101001110011000000101100001010001011111100000010101011000001010111000001101011000001100101111111", + "1000001010011110101001111000001011000100100011010110111100011011010110000101010110000010010010010110101000001", + "1011101011111111001010011010000011110111011110111010011000001000110101100100110101100001010011111011101011101", + "1011101000100100110000011011111011100001000100011111100100100000001101011000001101011001110010100011001011101", + "1011101000101101010101000001111110111010001111000001111110101110000011010110111111010111111100101111101011101", + "1000001001010011011111001101100011110010011011000111100010001101100000100100100010110101111001010001001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000110001111100101011100011000001101110000001100010110110000011001110100011010110010010010011000000000", + "0111011001001100011101110111111110001100100011100111111111110101100000101010111110110101100000110100100000110", + "1001010011110100001110011010100101100001001001011110011010110101011000010010111000001101011000001100001001011", + "0011111010011111101001111011101011000100011011010111100101011011010110000100110110000010010010010010000100010", + "0000000101111111001010011100100011110111100110111010011111101000110101100101010101100001010011111000100110110", + "1001101010100101110000011011011011100000001100011111101011000000001101011000001101011001110010100110111111001", + "0010000110101101000101000000111110111010110111000000111011001110000011010110000011010111111100101000101110010", + "0101101001010011001111000100011101110011101011000110001010101101100000100101100100110101111001010011001101111", + "1101000101101010100111100000101110011011001101011010110100101101011000010101011110001101001001001001010101000", + "0010001011111010101011000001100000111011110101010001111110000101010110011010010000000011010110000011110011001", + "0100110100011001101011111111001000101100100100110011110111111110110101111001010011100000110101100000000100110", + "1010101111000100111010111000110000111111000000001100111111000110001101011001101101001001001001001000111110001", + "0111110111001001101100100010010100100000010000001100101001111010000011010111100011001111100101001110010000000", + "0111001101001000011101111110110110101101000000010010010110101101100000110101100000101100000111001011010011100", + "1010010001110110011110011011100101000001001101011011101000010101011000001101011000010100111111110011110101001", + "0001011101101101111001111010101111000101011101110000111100011011010010010011010010000011010111110101111011001", + "0001100000011111001010001101000101110110100000010111010001000000110011111000110011100000100100111100111000101", + "1010011000110001110000000010111001100000101111101011000101011110001011000001001011011000001101000000101000010", + "0001000010101111011101011001111100011010010011000101110001001000000101001111100101010110000011001110110010000", + "0101001010111001010111010101011111010010101100000000011010101011100000110100000000100100100100100101010011100", + "1100100100010010110111111001001101111011001011010110110010100001011000001100111000010100111110010101001011011", + "0010111111101110101010101000111110000011110110100100111110011011010110000011111110011010110001111101111111010", + "0111100010011011110011110110100010100100100001110110100011111000110101100000100011111001010010011111100010100", + "1010101010110110100110100001101010010110000111101010101011000000001001001001101011011000001100101111101010010", + "0111100010101001111101011011100011000000010110000001100011110110000101001110100011010110000010001011100010011", + "0111111111011100011111101110111110000011000010000110111110110011111110101101111110110101100000101101111111111", + "1010100001110100000111100010101001011011001000011110100010010011000110010101001100001101011000010100011111011", + "0011001010001111100011100011101011110010011010110111010010011101001110000010000010010010010010010010110111010", + "0001100011111111011010110101000100001100100110111010011011001100100101100000000101111001010011111001111100110", + "1001001100010101110111110010110101011010101101111010010101000000001101011000011110100001101010100110111100001", + "0001000010101101000101000001000000001100010111000011111111001110000011010111110000101111100100101001011010010", + "0111111100111011001011001100111101111101101010010111100110101100100100100101010011010101100101100010000101111", + "1100100110010010100000000001011010011101001101011101110110101100111110010101001101001101011111110000011111000", + "0101111111001010101101011001011110110101110100100111001000000100101000011010100010000011010000011011110001001", + "1111000100111001101010001111000100110110100101111101001111111111001011111000100001100000110011111001110010110", + "0000011001010100111000111000110000101001000001111100001001000110010101011001011001001001001001001001101100001", + "1011010100101001101100000011110010111010010000000000101101111010010011010110110011001111100101001111000010000", + "1100101001111000011010011001011000110111000000010001111000101101100000110101110011001100000110101011000001100", + "0110010001010110011110011100011011010111001100010000100100010101011000001100101011110100111110010010011001001", + "0101001010001101111101111110001011001011011100100111010000011010010010010011000101100011010010010100110011001", + "1001000010011111101101101110110111110000100000110110011011000001010011111000000000100000110011111101110010101", + "1110101100010001010110000000000101101110100111111100010011011111110010100000011001011000001011000000101010010", + "1001110010001110011100111111110010000000000011001011111001001001111100101111110111010110000101001111000100000", + "1101111100111001010101010111011101000100110100010001100100100011111001010101110100100100100100100100000101100", + "0000000111110010010111011010101001100001011011011011110110110001001001001101101000010100111110010100011111011", + "1010111111001101001100101111111110000001100110100111111110101011010110000011111111111100110000011011111111010", + "1011100010111101010011110001100010111010101001111100100010111000110101100000100010011111010011111001100010100", + "1110101011010000000110100100101010010000001011111100101011101001001001001000101010111111001001001100101010010", + "1111100010101100111011011000100011000110010100000001100010001111100101001111100010010011100101001000100010011", + "0011111111111110111011101100111110000011001010010001111110111010011111001101111110110100000110101100111111111", + "0010000101010011100111100101010101011011011010010001010000010010100111110101011110001100111110010100101010111", + "1011001010001001100011100000100001110010000000100111111111110101001111110011101000010010010010010010100100110", + "1101110100011111111010110110011100001100110010110110000001111100100100111000001011111001010011111001000101010", + "0001101110010010010111110100111011011010111111111100110111110000001101000000110100100111101011000001111111001", + "1101110110001001100101000111111110001100011001001010001010001110000011001110010010101001100101001111010000010", + "0011001100110111101011001001000101111101100110010001001000000100100100100101000001010010100100101100110011111", + "0100010001110011100000000010110000011101001111011011101101010100111110010101111001001000111110011101101001000", + "0101011101001000001101011010010010110101111101100111101100001100101001111101110010000010110000011010000101001", + "1111100010100110001010001000111000110110110111111100111101111111001010011110110011100001010011111001000111000", + "0000011001001010111000111010011010101001011011011100100100101110010100101110110011001001001001001001111111110", + "1011000110110001001100000000101010111010000100000000110111001010010010001010111101001111100101001111110011111", + "1100001001110111110010011000110110110111010011110001011010011011100000101101011001001010011110101101110010111", + "0110000111010010110110011101000101010111000010110001110001010011011000010101001001110010100110010101001011001", + "0101111000011001011101111111010011001011010000000110011110110100010010010011110111110100001010000011000101001", + "1001110100011110010101101110011101110000100010110110100000111101010011111000010100111101000011100000100100101", + "1110101010010011001110000001001001101111000110111100110111010001110010100110101001000001101011011001011110010", + "1001000110001000110100111110001110100000100001001010001011001111111100101000000101001111100101010111110001110", + "1101011100100111000101010111110111100101110110110001000001000101111101000011011110100100100100100100010010011", + "0000100111101010001111010011110000000001011111011010101100010101001111010001100110010100111110010100101000100", + "1010111111000001010100110110111110100000000101000111111110101101010000011011111111111100101000011011111110001", + "1011100010111111000011101000100011111010001111011100100010111110110011111001100010011111001011111000100010100", + "1100101011000010001110111101101010110000001011010101101011101111001001001001101010101111010011011001101010010", + "1100100010101000110011001000100011100110010100010000100010001011100101001110100010001011110011010110100010011", + "0011111111111110100011100101111110000010101011001000111110111100011111001011111110101100000000110101111111111", + "0000010100110011101111100101011010011011111010001000000110010100100111110010010000010100111000001101011110101", + "1011001100010001110011100001011111110011000000000000010011110011001011110101110100010010010010010010010000101", + "1110010111100111100010111110100101001100110010101000110001111000100010111101100111111001010011111000010011001", + "0010101001111010001111001101110001111011011110001101110101110110010011000001111110100111110010100000001001010", + "1111000000001001110100011110010011001100111001100011101100001000011101001111010010101001111100101111100100010", + "0001111000001111100011010001111001011101100110110111000100000010111100100101010011000010111001010101000111111", + "0111110000110011101000010011011010110101001111000101001101010000101110010100010011010000101001001101011111000", + "0101111101001000010100010010101010101000011101110110010110001010101001111100111101111010110110000010110011001", + "1101110001011110000011101000110111100100010111110101101011111001001010011111111100011001010101100000110011000", + "0000011111001010101001011010000100110100011011011011001000110001010000101110101110101001001001001001001011110", + "1000100001010001010010001000010011101110000100011110000111001111110100001011010000001111100101001110100101111", + "1111001100010111100000100000011100011100110011100000011000000010011110101100010011001010011111001101111100111", + "0100010011010010101000000101001000001111100010111000110111010010100110010100001001110010100111110100100111001", + "0111001110111001010010000111001111101101010010000001110010100100001010010011100101110100001111100011101001001", + "1010010101011110000100111110110111011010100000101000100000100101000011111001111110111101000100100000100010101", + "1010101110010111001101001001110001110001000100101101001101011001110010100111100110100001101101011001101000010", + "0011000111101100110011011110000101010100100111000011011101010111111100101001001010101111100011010110000101110", + "0111101010100011000100110111101011011011110100110110100101000100111101000011000011000100100100100100100110011", + "0011110010001010001001010011001100110111011001000101011100010100101111010000101011010100111110010101111110100", + "1110101010100101010110010010111110101010000101010110111110111100101001111010111111111100101001111101111110001", + "0000000010111001000101101101100011100010001001010101100010111111001010011000100010011111001010011110100010100", + "1111111001100000001001011111101010110110001001011010101011111111010000101001101010101110010100111110101010010", + "1000001011101010110010001000100011101100010010011111100010010011110100001111100010001010010010010011100010011", + "1011101001111010100000100111111110011100110001000001111110110100011111001010111111001011100000110101111111111", + "1011101010110111101000000001011010001111100110011000010100001100100111110011011111110011011000001100010110101", + "1011101010010100010010000100010101101101011010000000001001110010001011100100010011110100010010010010011110110", + "1000001011100110100100111001101011011010111100101000000001111001000010100101010010111101010011111001111011000", + "1111111001111111001101001011101101110001000110001101001011100111110010111001110010100111110010100111001101011" + ] + }, + "24": { + "0": [ + "11111110110000110101010001101010101110001110100010101001100011010001100010101110000010101110000010101000101111111", + "10000010100000111011011011100100100001110101100001000010100000100011100001000100100001010100100001000100001000001", + "10111010001010101110110111111101011010011101011001010000111000010001011001010100111001001100111001010011001011101", + "10111010111100011111111011001000001111110001010111111100110111111101010111111100110110000100110111111111101011101", + "10111010000110000011100110111110110000111000010100011111110100011110110100011011111101100111010100011100001011101", + "10000010001001010110110110100010110100011000001100111000101100111111001100101010001101001110001100101011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000100011000011011010100010101101110000110100101000110100100101010100111010001101111100110100111001100000000", + "10110111000111000100101000111111110110101010001100101111110101011111101100100111111100100110001100100001001001011", + "01101001010000110101011000000011100110001110100010101001111011010001100010101011100010101000000010101111010110010", + "00000010000000111011001011101101011001110101100001001010111000100011100001000101100001000010100001000100110101111", + "11001101101010101110101110011011000010011101011001010000101000010001011001010101011001010000111001010100001101000", + "01101011011100011111101011001000101111110001010111110100110111111101010111111011010110011100110111111100000011001", + "11011101100110000011101110111101010000111000010100011111010100011110110100011000110101111111010100011111100000110", + "01101111101001010110110110001000110100000000001100100110001100101111001100101110001101001110001000101101011000001", + "00010100110101110101101101000110011011000110000010001010000010001011100010001000000011001010000100001001010110000", + "11011111101010101001001101111110011011000111100001000011111000101010000001001011111001001011100111001100110101100", + "10110000001011101110001011011000111101010101111001110011000000010010111001110001000001110011011111110100001101001", + "10110110110110001101100101011011101111010011010111111100001110010101010011110011001111110100010111110010000011001", + "10100000000111011011000011110110101111111000110100111101000101111100110010111000100100111101010100111001100000101", + "10110010000111001100110000010011110010110010001101001111101101000110001010100000001101000111101100100111011000010", + "01101001010000110101011000001011100100011110100011001001100011001000000100101110000011001001100010101001010110000", + "00000010000100111011011011111101011011101101100100101011100000100010100001000011100000100011100101000010110101100", + "11001101101010110110110110001101000100011101011110010001011000010000111001010011011000010001011111010000001101011", + "11101011011110011011111011011000101101110001010001110101001110011100110110011101001110011101010001111010000011010", + "11011101100000011111100110100011010010111000010010011110101101111111010101111100101101111110110010011001100000100", + "01101111101011010010111111111110110110001000001100101111110101001110001001001111111101001110001100101001111110010", + "01011000110111101001110101100010011111001110000010001000110011001010000101001110001011001010000010001110100010011", + "10011010101000100011011100101010011011011101100000111010100000101011100111001010101000101011100000101011101011111", + "11111000101001101110000010100010111111000001111000011000111000010011011111110010001000010011011000010011100011001", + "01111111110000001101101100111111101101011100010010011111110110010101010111110111111110010101010010000100111111010", + "10100000000001011011011010001010101001110010010011101010110101111100110100111111111101111100110010100100010100100", + "00111111100101000010111001010011110110101110001010111000110101000110001101000101001101000110001010111001001100001", + "01101001010010101011010000100001100100001000000100101100111011001000000011001101010011001000000100110110100010010", + "00001111100110111111010010011011011011100101000001010111011000100011100100110000110000100011100001000100100001111", + "10001101101100110000011111100111000100000111011001000110001000010001011110001010001000010001011001010101111001000", + "00101010111110010100100010001000101101110010101110000010001110011101010001100110000110011101010110011100010111001", + "10011101100100000011000110010111010010101100001101111011101101111110110010000011111101111110110101111110010100100", + "10100010001011011110111111110110110110001101010001011011010101001110001100101101000101001110001001011111001100010", + "00011000110111101100100100111100011111011000110101011100010011001010000010001001001011001010000101010010100010011", + "01011010001000111110110100111110011011010011100111010101011000101011111000101000100000101011100111010010100001111", + "10110100001001101000001011111010111111011011011111110111100000010011000000010110001000010011011111101011111001001", + "10110011010000001001100100101101101101010011110111101001101110010101001010000110000110010101010011110100011011001", + "11101000000001110101110010001010101001101010110100100011100101111100100011100111100101111100110010111100000010101", + "10111111100101011111111001010011110110111001110101000001010101000110001010111101011101000110010011000111011010010", + "01101001010011001101110000100001100100000010111011010101011011001000000100110101001011001000011101001000111100010", + "00000111100110011011010010011011011010000000111100100110111000100011100101000000101100100011111100110010100001111", + "01000001101101111111111111100111000100100011101110000110001000010001011111010010010110010001001110001001111001000", + "01101111111111000010000010001000101101000101010000000010001110011101001000011110010000011101010001100100010111001", + "11011000000101111011100110010111010010110110110011111011101101111110101011111011111011111110110010000110010100100", + "01101010001010010000111111110110110110001000001001010011010001001110010001011101000101001110001000100111010000010", + "10011100010110000011000010111100011110011101000101010101010101001010010101010001001011001010000100010010111100011", + "11011111101000110100010000111110011011110001011110101111111110101011100110110111111000101011111110110010111111111", + "10111000101000010110101101100010111110111000000110011000100110010011011110001110001000010011000110001011100011001", + "10011010110000101011100001101011101101110101001010011010101110010101010010010110101010010101001010000100101011001", + "00101000100000010101010110100010101000101000100011101000100101111100110011111010001011111100100011100101100010101", + "10111111110100011000011110111111110110011100001011001111110101000000010011000011111011000110001011011111111110010", + "01000101110011001101010111001001100100000010000101010010011011001110011101001100010101001000000101010000001000010", + "00101111111111111100010010110111011011100011100100111011111100100101111100110101111000100011100100110011100011111", + "01001000010101011000111000010111000101000101011110000011001110010101001110001111000000010001011110001001001101000", + "01011010101110000011000111011100101101000111001000001101001000011101010000000001001110011011001000000100000011001", + "11001001010101111010000001111111010011010100101011110100101011111110110011100010100101111000101011100111000000100", + "01000111100011110001111011011010001110101110010001001000010101001110001001011000010001011000010001011111111000010", + "10010001010110100011100001001100100110011110010101000110010011001010000101010100011101010110010101010011101010011", + "11011010110001110101110011101010111011110001111110100101111000101101111110110111111110110011100110110011101011111", + "10010000110000110111101100010011100111011001000110001101000000010101000110001111001110001011011110001011010010001", + "10011011001000001010100100000000101101010101001010001101001010000011001010000011001110010101010010000101010101101", + "00100001100000110101010100011010010000101000100011101110100011100000100011100010101101111100110011100100100111101", + "10000111110100011000011100000110100111111100010011010110010011011110010011011010010101000000010011011111011100110", + "01111001100011101100110110001001010100000010011101000010011101010000011101010100010011001110011101010001110100010", + "00101110001110111100010000110111100010100011111100100101111000100011111100110101111100110101111100110010010101111", + "01001100001101011000111000010111111100000101001110011101001000010001001110001111000110001101001110001000110001000", + "01101110000111000011000000011100001100100111001000010011001111111011001000000001001000000101001000000101011101001", + "11111100011101011010000011111110001010110100101011110000101100011000101011100010100011100110101011100110111111000", + "01100011110011010001111111011011110111001110010001001110010000111000010001011000010001001110010001011110001111110", + "10010101110110000011100001101100100111011110010101000000010100010110010101010100011101001010010101010010001011111", + "11111011111001110101110111101011001010010001111110100011111110110011111110110110111111001101111110110010101010111", + "10010001011000110111101010110010001111011001000110011001000110001011000110001110101111110101000110001010110011001", + "10101111111000001010100100111111010010010101001010011111101010010101001010000011111011100010001010000100111111001", + "00111000100000110101010110100010010101101000100011101000100011111100100011100110001010100001000011100101100010101", + "10101010100100011000011011101011010101111100010011011010110010100000010011011110101011011111110011011110101010010", + "01111000100011101100110001100010111110000010011101011000111100101110011101010110001101010001111101010001100011110", + "00011111101000111100010010111111011010100011111100101111111101010100111100110011111100100011111100110010111110011", + "01010001101001011000111011011010011100000101001110000000001111001100101110001101110110010001001110001000101110100", + "01110111011001000011000000101100110110100111001000010110001000000010101000000001111001111011001000000100101010001", + "11001000010011011010000111101010111100110100101011101101101011100001001011100101111010011000101011100110101010100", + "01110011000111010001111111110010011001001110010001001101010001001000010001011001001000111001010001011111010010010", + "10001000110110000011100001100001000011011110010101011101010101001110010101010001001100010111110101010010110100011", + "11000011101011110101100110011011000000010001111110100110100111001101111110110100101110110100011110110011111101111", + "10100101111000110111110011000111010101011001000110000110011111110101000110001111010110001100100110001010100110111", + "10101010011110001010101100101001000100010101001010010010010011100010001010000101110010000011001010000101001000110", + "00111100000100110101001110110111110001101000100011101101110010100001000011100000011011100000100011100100000011010", + "10101110000010011000001011110110101101111100010011001101010011011001110011011010100010111000010011011110010001001", + "01111100100101101100101001011100001010000010011101011011011101010111111101010011001100110110011101010001111101110", + "00011110101010111100010011111111110100110011111100100000111100110101111100110100100101010100111000110001111110011", + "01010001101101011000111010011000011000010101001110000000001110001101001110001010010111001100101000001011101110100", + "01110111011101000011001001001011110110101111001000010110010001100011001000000010011000000010101110000101001010001", + "11001000010101011010001111011010111000111100101011101101110010000000101011100010111011100001001101100111001011010", + "01110011000101010001101110000010011011000110010001001101001000111001010101011110101001011000010001011110010011101", + "10001000110010000011110001001001000111000110010101011011000100010111110011010110101101010110010101010010110101100", + "00000011101111111101100111101011000010000001111111000000111111010100011000110111001111010101111110110101111100100", + "01100101111110100111110010101011010001001001000111100000000111101100100000001000010111101101000110001100100110101", + "00110110011100011010100101000101000110000101001111110110001011100011001010000010010011100010001110000011001000101", + "00110100000100111101010111101101110101111000100100101101100010100000100011100111111010100001000101100000000011001", + "10010010000100010000010011111110101001110100010101001111101010111000010010111011111010111001110101011110111111010", + "00000000100001111000111001100010001000001010011011011000100100110110011100110010001100110111111011010000100011100", + "11111110101100111110000011101011110000101011111100101010100101010100111001010010101101010100111100110011101010000", + "10000010101001011110101010100010011000011101001110011000111111001100101001001110001111001100101110001000100010111", + "10111010011101001001010000111111110010110101001001111111101001100010101110000111111001100010101001100011111110010", + "10111010110001001010011110000110111110100110101010000000101010000001001101100110101010000001001010000000111101000", + "10111010100001000101111111110100011101011001010100111000010000111001010001011111010000111001010100101000100111101", + "10000010010010001101100001111011000011001111110010010110010100010111110101010011110100010111110010001110101001110", + "11111110101011111111101110011111000100011010011000110101100111010100011111010100011111010100011000101011000010110" + ], + "1": [ + "11111110101111101010110101010001100011010001111100101001100010101001100011010110000011010110011100101000101111111", + "10000010011101010001101010110011100000100010111001010010100001010011100100100100100000100100111101010100001000001", + "10111010100011010010110010001001011000010000101001001000111001001001011110010100111000010100101111001011001011101", + "10111010100001001111101011100011001111111100110110000100110110000101001001111100110111111100110000000111101011101", + "10111010111011110011100011111110101100011111010101101111110101100110101010011011111100011111010011100100001011101", + "10000010010000111111100111100011010100111110001001001000101101001111010000111010001000111110001001001011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001001111001111111100011000100100100110011101000110101111101000010100010001010100100110011111001100000000", + "11110010111100110001001000111111101101011110010011001111110100100111101011011111111011011110010010100001010011101", + "11001000101000000110100100010111100011010000011101001001111010101001100101010011100101010000011100101111001111100", + "10101110111100010001101110110101100000100010111100101010111101010011100100100101100000110010111101010100101100000", + "01100100100010110010101110001101011000010000101110010000101111001001011110010101011000001000101111001100010100111", + "11001110100001001011100010000011001111111010110000000010110000000101001000011011010111100100110000000100010010010", + "01110001011011110001110111100000101100011001010011100001010011100110101011111000110100000111010011100111100101000", + "11110110110000111100110100111001010000111000001001011000001101011111010001011110001000111110001101001111011111110", + "10001001011111001001001010110111110100010110000101010110000011010011110101010000000100010010000011001010010001111", + "01011111100001011101011101010100000111010011111110100011111001010100000110110011111110110011111000101101010010111", + "00011001110011011101001111001100111111101011000110010011000001101100111110001001000110001011000000010101110010111", + "00010110010010110111000000010011010111100100001010011100001011100011010110010011001110000100001010010011111110110", + "00101101001111011110111011111000110100100101000011111101000010100000110101111000100101100101000011111001111111010", + "10010011101010000001111001000000010100111001101010111001101010111110010101000000001100111001101011000111001111001", + "11110001111101001110100001001110011010110111100100110111100100110000011011001110000010110111100101001001010011110", + "01010011000011010001111001010100111101010101100001010101100001010010111100100011100101000101100000100010110010011", + "10010001001010010011010001101100101111001101011001001101011001001000101110010011011111010101011000010001001010100", + "11101010011100100110101011100100110001100101010110010101001111100010110001111101001001111101001110011011100100001", + "11110100000011001100000010100111010010000110110101111110101100000001010010011100101010011110101101111000000100110", + "01001111101001101000011011111111001100111111001001001111110000101000001100101111111100111110010001001000111110101", + "11011000101001101110001100100011100010010011100101001000110100001110000010001110001010010010010101001111100011000", + "00111010100000001110010100101010011000110100000111011010100111001011100000101010101001010101100111001011101010000", + "01101000100010110101111010100010100000001100111111111000111111110011011000010010001001101101011111110011100010110", + "10101111110010100011001000111110001010010011010111111111110111100101010010010111111011110011010111100100111110100", + "00110000100111011010111100100011000011111000110100101010110100100100110011111110111010111000110100100100010011011", + "00110010000101111001111010110001110010100110001101011000110101011000001010100100101010100110001101011001001011011", + "01001000010001111100100111111011111100101000000011001010111011010110000100101100110100101000000011010110000100000", + "00010111100100000101111101111000111001010011100100110001011100100101100001010001010101010011100100100100000101100", + "00011100010010110111000101111000101001001001011110000000001110010101011001001010001111001001011110010100011111011", + "10011011010110111000100111010110101110000011001001100110001001111101010110000110000000000011010001111101110001010", + "00101000101111011000110111010011001101100000101010011011101010011110110101100011111011100000110010011111010011010", + "01110010001001101001110000001010010001001000010100111011010000111110001001001101000001001001001100111111001001101", + "10001101010001101100011110110100010101001110010010011100010100010010000101001000001101001111100010010010100101100", + "01010011111000010100010001111101111111001101100000110101011110110101111111001101000111001010000000110010100110100", + "10000001010010010111111010100001000111110101011000010001100110001101000111110001101111110010111000001011011111011", + "10100111000111000011001011001110001011100011010010001111101010010010001111100001100011100101010110010100110111010", + "01111101101110101010101000010101000010100000110011100101100011111001000100100101100010100100110101111101110100110", + "00110110010001110011111100001101101011011000010010100101010010100001101101011111011011011000010100100110101100001", + "11010000001011101110000001100101100101010110011100110011011100101111100011010101001101010110011010101001011011100", + "10010011110101010100011101100111100100100100111001000000111101010101100000100000101000100100111001010010000100000", + "00011000000110100111000101101111011110010100101001000000001111001101011000010011010000010100101001001000011110111", + "11100110101000001010100110001011001001111010110111100110010000000011001111111011110111111010110110000101110000010", + "01101100011101111110011110101100101010011001010100011101110011100000101100011100011100011001010101100111110010100", + "11111111111100111000011001110101010000111000001100110101001101001001010100111010100000101000001101001111110100010", + "11001001011000011110010100010011110100010110000010010011000011001111110010010011001100001110000011001011011010011", + "01011111111100011100000011111110000110110011111001001111111001001100000001010011111110101101111001001101111111111", + "00001000110000110011010010100010111110001011000001111000100001110100111001101110001110010101000001110100100011011", + "00101010100011100011111011101011010110010100001111111010101011110011010111110110101110010010001011100011101011010", + "01101000101011001001001011100010110101111101000100101000100010111000110100111010001101111001000010100000100010110", + "00111111111011010001010011111110010101000001101100101111101011000110010100100011111100100001101010111111111110001", + "11001101001011001001000001101110011011001111100010110110000101001000011010101100010010101111100100110001101110010", + "10110110111001001100000100101010111100100101100001011101100000100010111101010101111101000101100001010010000101111", + "00101101100011000100001111010010101110010101011001000101011000010000101111001001000111010101011001001000101001000", + "00110011111010110010110101010100110000011101001110001011001110011010110001100110001000011101001111100011000101001", + "11100000001101011110111110111101010011111110101101110000101101111001010010000101000011111110101100000000100110110", + "11110011101010101001100000000110001101001111010001001110010001001000001100111101110101011111010000111000011110001", + "10010100100111110111011101101000000011001011110101000000010101001110000010010101111011010011110100010110001110000", + "01011111111010101000011110000011111000101100011111000010100110101011111000110110111000110100000111010010101101100", + "00011100011000010111011010110001000000010100100111101000111110010011000000001110101000001100111111101010110101101", + "01000110000001111110110010011101001010010011001111101010110110000100001010000010110010010010010111100100110010001", + "11001000010000101101100010111110100011111000100100101001010101100101000011100101010011111001010100100101000111101", + "01101110100001001101101110011110001010100110010101010000010101011001110010111101001011000111110101011000011101110", + "01010100111001001000001000010010000100101000011011000110011011010111111100110011100101001001111011010110010000010", + "01010010000111000110001001110011100001010010111100100011111100100100111001010000011000110010111100100101110011100", + "11000101111101001100000100101011011001001000101110011011001110010100101001001000100000001000101110010101010101001", + "11100111001010011110110010110101010110000010101001110100010001111100101110000110001110000010101001111100011011010", + "01110000110111111000101001011100110101100001001010010101010010011111001101100101000101100001001010011111011001000", + "10001111011010100001001101000000001001001001010100101001101100111111010001001101101101001001010100111111101001110", + "01001101100110011000110010001110000101001111110010000111100010010011110101001011100011001111110010010011101111111", + "00000011001100100000100001110101100111001010000000100101100000110100011111001001100001001010011000110101101100111", + "10011100100010010011100001001101011111110010111000011101011000001100100111110001011001110010100000001101010101001", + "11011111110001110001110110111110010111100100010010011111110110010010001111100011111111100101001010010011111111001", + "10111000110000101000000101100011010100100101010011101000110101111001000100100010001100100100100011111000100010101", + "00001010100001101101001101101011101101011111110010111010101100100111101101011010101101011000010010100001101010010", + "11111000100001000110011010100011100011010001111100111000100010101001100011010010001011010110011100101110100011110", + "11101111100001001100100000111111100000100010111001001111100001010011100100100111111000100100111101010100111110011", + "10011100000110111011101001111111011000010000101001000110011001001001011110010010010000010100101111001101101000100", + "00011111111001001110010110010001001111111100110110010000010110000101001001111010011111111100110000000011001110001", + "00000001010010101110001100000010101100011111010101101010110101100110101010011010111100011111010011100001001100100", + "10000010101010000010101101010001010100111110001001001000101101001111010000111110101000111110001001001000110100010", + "11001001011100100110110010111011110010010010000101010010100011001011110100010110110100010010000101001110010010011", + "10100011001100111100111000111000000000110011111110101001011001001010000110110111010110110011111111001100011001111", + "01101000111001000111000001111000111000001011000110011000000001110010111110001000001110001011000111110101000000111", + "01010111110110011000010010010111010110010100001010001110001011100101010010010010000110000100001011100010101110110", + "01110001101010010100011010010010110101111101000011111011100010100100110011111111111101100101000010100000100101010", + "11000110100010010001001011001010010100100001101011001011001011011110010011000001000100111111101011011111101001001", + "10110101100100011100101101110100011010101111100101011100000101010000011101001100001010110001100101010000000101110", + "11110011000111101111001101011100111101010101100100100101000000110010111100110011000101010011100000100010000110011", + "00110100000111111000001110000000101111001101011110001111111000001000101110001101101111001001011000010001001110100", + "00001011101010001010100000101110110001100101001000011001101111100010110000000001100000000101001110011010101110001", + "00110101000100101010001010110101010010000110101011110010101100000001010011100101100011100110101101111000101101010", + "10001111011101001010001001001100001100111111010001010000110000111000001101001001011101011111010001001001110101101", + "11110101000100111011010100100100000010010011110101001100110100010110000011001001010011010011110101001110010011100", + "00011011101111111101100110100111111001010100000111000111000111010011111000101100110001010100000110101010000100100", + "01011101111111011110010110111111000001101100111111100111011111101011000000010111001001101100111110010011011110101", + "00110110100001000001011011110010001011100011010111110011110111100100001010010101100011110011010110010100010000101", + "00110100000100011101100011110101000010100000110100100010010100100101000011111000000010111000110101111100010011001", + "10010011110100100100011010111111101010111110001101001111110100111001101010100111111010100110010101000000111111010", + "00000000111111101011011100100011100100110000000011001000111010110111100100101010001100101000011011001110100010000", + "11111110001001100001100000101010100001010010100100111010111101000101100001000110101001010011111100100101101011100", + "10000010000100000010001001100010111001001000111110001000101111010101011001010010001001001001001110010100100010011", + "10111010011101101111010110111110101110000010110001101111110001111101010110011011111111100011010001111101111110110", + "10111010110011010011111101100001001101100001010010011111010010011110110101111001010100000000110010011111111001000", + "10111010111100011010000001011001010001001000001100111111001100111110001001001000001000101000001100111111000001101", + "10000010110111001011010101010111110101001110000010010011100010010010000101001110000100001110000010010011001111110", + "11111110111011001011110111010100011111001011100000110100011000110101100111001011100111001011100000110100100100110" + ], + "2": [ + "11111110010000111100010111111110110001011110111011001100011010110001000101010110011100101001100011010000101111111", + "10000010000001110101111110001101001101010011111111111011101001111101001000110101111101000010100000110100001000001", + "10111010011000011110100111100111001010010100100110111010011010111111011010001101001111010000111000001011001011101", + "10111010011010111101000010101001011010100101010001100010010000011110101110000011001001111100110110000111101011101", + "10111010100110001011000001111110000111101110001101111111101100000111110011100111111010011111010101100100001011101", + "10000010001100011010010010100010100000111100010010011000100100010000100101011110001000101111001101011011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110101110011001011100010100111111101001011011000110111010010110111100110001010111101010101100001100000000", + "00110011100001100000011001111110000001111010001010111111101011000011110101011011111010100001101101011001011010000", + "10000100010000111011110110111110110001011000111011000011011010110101000101010110011100101111100011010111001011110", + "10010011000001110001111110001101001101010011111111110011101001111011001000110101111101000100100000110100101010011", + "10100000011000011110100110100111001010010000100110110000011010111101011010001101001111010100111000001100010010100", + "11011011011010111111000010101001011010100011010001101110010000011000101110000011001001111010110110000010010100001", + "00110100000110001111000000001000000111101010001101110001101100000111110011100000101010011001010101100001111101000", + "11111010101100011100010011100000100000111110010010011000000100010000100001011000010000101001001101011001000111110", + "01111101000011000011111101111100010001001011111101101111000001100000000101010110010100001011100011010111001001111", + "01100111101100001001110100011111101100010001100111011010100110101110011010110101111111001100000000110100100010111", + "01011001101011100010101101100101101010000111100000011100000001101100011100001101000111110100111000001100010000101", + "00101111110111000111001000111010011011100101001011000011011111001111111110000011001011110010010000000010011100101", + "11000101110101110101001011001011000111111101001001011001110111010110110101100000100010111001010001100001111111001", + "00001010000001100100011001110010000001111100001010110111001011000001110011011000010010100001101011011001001111010", + "10000000110000111001110110111111110001011100111011000111011010110111000011010110011100101111100101010111001011110", + "10010111000001110001111000001100101101010011111001110101101001111001001100110101111101000100100000110100101010011", + "10101000011000011000100110100111001010010000100010110100011010111011011000001101001111010100111000001100010010100", + "11010011011010111111000110101001111010100111010011101100010000011010101110000011001001111010110110000010010100001", + "00110100000110001111000010001000000111101010001011110001101100000001110001100000101010011001010101100001111101000", + "11111111101100011100010110111111000000111110010010011111100100010100100111011111111000101001001001011001111111110", + "01111000100011000011111100100010010001001011111001111000100001100000000001010110001100001111100101010110100011111", + "01101010101100001001110101101010101100010001100011011010100110101100011100110010101111001100000110110101101010111", + "01011000101011100010101100100010101010000111100100011000100001101100011110001010001111110100111110001101100011001", + "00101111110111000111001001111111111011100101001111001111111111001111111100000111111011110010010010000010111111001", + "11000101010101110101001111101101000111111101001011011101110111010110110111100111111010111001010011100000001010101", + "00001010000000000100011000000111100001111100001110100100001011000001110001011101001010100001101011011001010010010", + "10000001010001011001110111001000010001011100111111011100011010110111000101010101001100101111100101010110110100010", + "10010110000001010001111011001001001101010011111001111001101001111001001010110000101101000100100100110100111100111", + "10101000111001111000100110000000101010010000100110110000011010111011011010001010010111010100111110001101100111000", + "11010011011010011111000101011100111010100111010101111111010000011010101010000110010001111010110000000010001000001", + "00110101100111001111000111111110100110001010001001101010101100000001110011100011111010011001010011100000000010100", + "11111011101100011100010110100100100000111110010100010100000100010100100111011101000000101001001001011001010000010", + "01110001100010100011111101011011110000101011111101101011000001100000000001010001001100001111100101010110111100011", + "01100111101101001001110011101010001101110001100011001001100111101100011100110000100110101100000110110010111111111", + "01011000001010000010101010010011001011100111100100000111000000101100011110001110010110010100111110001011101111001", + "00110010110110100111001101111111111011000101001111001111011110001111111100000110011010010010010010000100001011001", + "11100101010100010101001011101101000110011101001011011101110110010110110111100111111011111001010011100100001010101", + "00101010000000000100011110000111100001111100001110100100001011000001110001011101001011000001101011011011010010010", + "10110001010000111001110001001000010000011100111111011100011011110111000101010101001101001111100101010010110100010", + "10110110000001010001111011001001001101110011111001111001101100011001001010110000101100100100100100110000111011111", + "10111000111001111000100110000000101011010000100110110000011001011011011010001010010110010100111110001011100101000", + "11010011011011011111000101011100111010100111010101111111010001111010101010000110010000011010110000000100001101001", + "00010101100110001111000111111110100110001010001001101010101010100001110011100011111011111001010011100110000000100", + "11111011101100111100010110100100100100111110010100010100000001010100100111011101000001001001001001000111010000010", + "01010001100010100011111101011011110111101011111101101011000100100000000001010001001101001111100101000010111100011", + "01111111101101101001110010111110001000010001100011001111100111101100011100110111111110101100000110110010111111111", + "01011000101011100010101010100011001001100111100100011000100011001100011110001110001110010100111110001011100011001", + "00011010110101100111001100101011111101100101001111011010111001001111111100000110101010010010010010000100101011001", + "11101000110010010101001011100011000011011101001011011000110000110110110111100010001011111001010011100101100010101", + "00001111100100000100011110111111100111111100001110111111101110000001110001011011111011000001101011011111111110010", + "10010001010110111001110000111100010000111100111111011111011110010111000101010100010101001111100101010000001000010", + "10100111100001010001111010011111001011010011111001110010101101111001001010110101111000100100100100100011100011111", + "10001001111111111000100110100100101110110000100110100100011101011011011010001111000000010100111110010001010101000", + "11010011111011011111000101111010111100100111010101110011010011011010101010000001001110011010110000011101011011001", + "00100101100100001111000111101010100100001010001001100001101000100001110011100010100101111001010011111110111000100", + "11001010001110111100010110110010100110111110010100000111000000010100100111001000010101001001001001001110001000010", + "01010000100110100011111101111111110101101011111101110111000110000000000001001100011011001111100101001010001110011", + "01100111001011101001110011001100001110010001100011011101100101101100011100101111111000101100000110101011101101111", + "01001000000011100010101010000111001011100111100100001100000101001100011110010111001000010100111110010011010101001", + "00010011011001100111001100001001111101100101001111001100011011001111111100010011001110010010010010010101010011001", + "11100100010010010101001011101001000011011101001011001001110000110110110111111010101101111001010011111100111000101", + "00001010111010000100011110000001101011111100001111111000001000000001110000100010010101000001101011000110000000010", + "10010001011110111001110000111100011000111100111111000111011110010111000100101100010011001111100101001000001110010", + "10100111101111010001111011111111000011010011111000000010101101111001001011000101111000100100100100100011100101111", + "10001001101111111000100111100100101110110000100111111100011101011011011011010111000000010100111110010001010101000", + "11010011101001011111000101111010110000100111010100101011010011011010101011111001001110011010110001111101011011001", + "00100101111000001111000111001010110110001010001000110001111000100001110010011010100101111001010010011110111000100", + "11001010000010111100010110110010100110111110010101001111010000010100100110101000010101001001001000101110001000010", + "01010000111100100011111100111111101101101011111100100111010110000000000000001100011011001111100100001010001110011", + "01100111011111101001110011001100011110010001100010111101101101101100011100101111111000101100000111001011101101111", + "01001000000101100010101010100111010011100111100100111100010101001100011110010111001000010100111111110011010101001", + "00011111100001100111001101111111101101100101001110011111111011010111111100010011111110010010010011010101111111001", + "11101000110010010101001011100011001011011101001011001000101000111110110111111110001101111001010010011100100010101", + "00001010110010000100011110101011101011111100001110011010111000001001110001000110101101000001101010100111101010010", + "10011000111110111001110000100010011000111100111111111000110110011111000100101110001011001111100100101000100010010", + "10101111110111010001111011111111011011010011111001011111100101110001001011000011111000100100100101000011111111111", + "10001000011111111000100110110010110110111000100110010111001101010011011011110100010000010100111111010001001001000", + "11010010101001011111000101111110110000111111010101010111000011011010101011111000011110011010110001111100101111001", + "00100101001000001111000111000100101110001010001001001101100000111001110010111001111101111001010010011110101100100", + "11001010011010110100010110011110110110111110010100100100011000001100100111101111001101001001001000101111110100010", + "01010001000100101011111101101001101101100011111101001100000110010000000001101111001011001111100100001010010010011", + "01100110011111110001110011011000000110011001100011100001110101110100011101001110101000101100000111001010011001111", + "01001000100101101010101010110001000011100111100100100000001101001100011111010100010000010100111111110011000001001", + "00010011000001100111001101010101101101111101001111111111000011011111111100110100010110000010010011110100101111001", + "11100101110010000101001011011111011011001101001011111010110000110110110111011001100101100001010010111100100100101", + "10001011110010011100011110101101101011101100001110001100011000011001110000100011011101011001101010100111110100010", + "01010001111110111001110001111010011000111100111111111011010110010111000100001111010011010111100100101000011010010", + "00100111110111011001111011101011011011000011111001001001110101101001001010000010110000110100100101000010011001111", + "00001000011111100000100110100010110110110000100110010111011101011011011010110100001000001100111111010001001001000", + "01010010101001001111011101111110110000101111010101010111000011000010101011111000000110000010110001111100101111001", + "01100101001000011111011111011100101110010010001001001101100000100001110010111001100101100001010010011110101100100", + "00001010011010101100010110001110110110101110010100100100011000000100100111101111011101011001001000101111010100010", + "11010001000100100011111101100001101101101011111101001100000110000000000001101111010011010111100100001011110010011", + "00100110011111101001111011001000000110011001100011100001110101110100011101001110110000110100000111001010011001111", + "01001000100101111010100010110001000011111111101100100000001101001100011111010100001000001100111111110010000001001", + "00110111000001110111011101010101101101110101001111111111000011011111111100110100000110000010010011110100101111001", + "00110101110010010101010011010111011011011101001011111010110000110110110111011001100101100001010010111100100100101", + "10010011110010000100011110111111101011110100010110001111111000011001101000100111111101011001110010100111111110010", + "00000000111110100001111001100010011000100100110111111000110110010111001100001010001011010111111100101001100010010", + "11111110110111000001111011101011011011000011100001001010110101101001000010000110101000110100111101000010101011111", + "10000010011111111000111110100010110110110000101110011000111101011011001010110110001000001100101111010001100011000", + "10111010001001011111001100111110110000101111011101011111100011000010100011111111111110000010110001111100111111001", + "10111010101000010111010111001000101110010010000001011001100000100001110010111110110101100001010010011110111000100", + "10111010111010101100010110110000110110101110000100111000011000000101100111101110001101011001001000101110100000001", + "10000010000100100011100101110101101101101011110101010111000110000001100001101010000011010111111100001010101110010", + "11111110011111101001111010010110000110011001101011110010110101110100010101001011100000110100011111001011000101110" + ], + "3": [ + "11111110011101100111100001010101010011111001001110000010011000101110011100101001111100101001111100101100101111111", + "10000010111001001111011100001001010110100101100100010110110001010100111101000010111001010011111001000000001000001", + "10111010100001111010011111111011011110001000001000000000100111001100101111010000101001001001001001010111001011101", + "10111010001000000100100001000011111011111001001111010111100110000100101001111100110110000011010110011011101011101", + "10111010001011100111001000111110100110011000010010111111110101100111001010011011111101100000110101111000001011101", + "10000010001010000101110100100011110101011101001001101000101001001111010000101010001001001001001001001111001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000010010011010000010100011101000100000100101111000111111111101000010111010001011111001010011111100100000000", + "01110110010010010110000100111110101001110101111110001111111000100001101010100111111010100111110010100110100000110", + "10010101011101100111100000100111010011111001001110011101000000001111100100101011100100101001111100101000101110010", + "00110111111001001111011100101101010110100101100100000010100001010100100101000010100001010011111101000011001101111", + "00001000000001111010011110000011011110001000001000011001110110101100111111010010111001001001001111010001010101000", + "10010110101000000100100000100011111011111001001111000010000111100100101001111100101110000011010000011011110011001", + "00100000001011100111001000000110101110011000010010101100110101000111001010011101001101100000110011111000000100110", + "01010011001010000101110100000101111101011101001001101011001000101111010000101001010001001001001001001000111111001", + "11011000000100101100110101000011000110010110010011000011101000001011110100001111110101001111100101001110010000000", + "00101110011111111011101001110101001100011000010011110001010101001100000110101100000111001010011111001011010010100", + "01001100000110111100111011111010011000100010010101000110011010110100111110010100111111110010100111110011110101001", + "10000011001111111001101000011111101000010011010010110100010111100010010010010100010111100100001011110101111011001", + "01100101101100010111110011101100111011100101100101110100011010100001010011111111010100100101000010111100111000101", + "01001111110011011111111101111000100001100010010100011111011100111111110010100111110101011001101011000000101000010", + "10010100111101010001111110110000000000001110100100011010000011110001111100101011111011010111100101001110110010000", + "00011110100111101000011111101000011001110000100100000100100101000010111101000100111100100100100100100101010011100", + "00010001011111110111101110011000010100001101001000011010110011010000101111010100101110010100111110010101001011011", + "10101010100001001101011111000011111010001110100101011101100011111010110000011010110001111100101001111101100101010", + "00010001101011010001010000010111110101001111111000110111110111011001010011111001010010011111001010011110011000100", + "01111111101100100011110011111110110010101000001001101111101100111001001001001111111100101111010000101110111110010", + "11001000100010100001100100100010001101110011010011011000101100010111100101001110001010001011110100001011100010011", + "00011010110110110010110000101011001100101001111001111010110001010010011111001010101000101100000110101100101011111", + "01111000101110001010100100100011011010110011111111001000111000101010100111110010001000010100111110010101100011011", + "10001111110001011110101001111110101111100000010010111111110011110100001011110111111010010010010010010011111111010", + "01110101101010011011000011100001111001000010100111111010111110111101000010111110100011111001010011111001101100110", + "01001010011010110111000101001000100001010011111100001001111000100001101011000000111010100111110010100110110100001", + "10100100010100000111100110111011000011111011001000011100000001101111100101001010101100101001111100101001010010010", + "00010010100000111110011110001111011111000101100100000110100001010100100100100111001101000010111101000010000101111", + "00010000100000110010111110101101010110101100001010010111010111001100111110010001010111010000101111010000011111000", + "11101011000000111100000110010011111010011001000111010011100111100100101001111101110000011010110000011011110001001", + "10011100100010010111001000101100110111011100010110101011010101000111001010011010000011111001010011111001110010110", + "11011111001011110101110010100011110100111001011001101010001000101111010000111100111001001001001001001001110100001", + "00000001111100101101110101010111001111110110110001001100001000001011110100010000010101001111100101001111011010000", + "10100111110110001000101000100101001100111110101001100100010101001100000110110101010110101010011111001011011001100", + "10111101001111111110111101100000011000100001010011000111011010110100111110001001101110010010100111110010001001001", + "11100110010100101000101000111001101001110010001010110000010111100010010010010001100010010100001011111100110011001", + "11111101001010011001010011000000111011000000001111111010111010100001010011111100100011111101000010110101110010101", + "00110010011111100001011101001000100001000011000101001000101100111111110010100110111011000001101011000000101010010", + "00101000010100100011111110011010000001101010001000111101111011110001111100101100110101001111100101001111000100000", + "10110010100010011100011111001110011001001100111100100111101101000010111001010001010100100100100100100101000101100", + "11011000100111110000101110001100010100110101100010110111010011010000101001001011001110010100111110010101010111011", + "00010011000100111010010110010011111010010000011111110010111011111010110110000011100000011010101001111100000001010", + "11010000100010010101000000101101110101000100111111101010110111011001010101100100000011111001001010011111101010100", + "00111111001111110001110010000010110010100001010000001011011100111001001001001010111001001001010010111111101000010", + "01001001111100101011100101110110001101101110111001001100001100010111100101001011010101001111110010010011000100011", + "01011111110010001100100000111111001100100110101001001111100001010010011111001011111110101100000000110101111111111", + "11111000101111111000111100100011011010101001010010001000100000001010100111110110001110010100111000001100100011011", + "00001010110100101010110000101010101111111010001011011010111010010101001111100110101010010010010010010011101011010", + "10111000101010011101000010100011111001011000001111111000111110011100100100100010001011111001010011111001100010110", + "11001111111111100001001101111110101011001011000100101111100000100000001101011011111011000001101010100111111110001", + "01101001010100100011100111110011011001110010001001011011100000101110000011010100000101001111100100101000010000010", + "01011110100010011100000101101101010001001100111101110011010000000100100100100101100100100100100001010011110011111", + "10011101000111110000101011100011001100110101100010001010010111110100111110010001011110010100101001001001001001000", + "11100011100100111010010110010111110000010000011111100100010111111010101001111110010000011010110110000010000101001", + "10010101100010010101010011000100100111000100111111101100001101111001001010011101010011111001010101100001000111010", + "11011111001111110001101100000001011100100001010000011111000001011000010100111101101001001001001001001001111111101", + "00000100011100101011110110111101111111101110111001010000001000110110010010010101100101001111100101001111110011100", + "10101111010010001100100010100010000111000110101001010011001101010101100000110111100110101100000111001011110010100", + "10111000001111111000111100101110000010001001010010000000111011101101011000001111011110010100111111110011001011001", + "11101010010100101011110001011100000110111010001011000100000100110010010010010011010010010011010111000101000101001", + "11110000101010011101000110001111000000111000001111100110011100011001010011111100110011111000110100000100100100101", + "00110010111111100001101011001011101010001011000100111110101100100001101010100101001011000000001101011001011110010", + "00100101001100100011100001110011010000010010001001000011111011001111100100101011100101001110000011010111110001110", + "10111010100010011100100001101100110001101100111111101010101010110101100001010000000100100100100100100100010010011", + "11010001011111110000101101100110100100110101100110001011110001101101011001001110111110010100111110010100101000100", + "00010111111100111011110100010100110001110010011011111101111111100011010110000001010000011010110000011011000100001", + "11010001100010010101010001000011101111100010111111111101010100000000110101100010110011111001010011111000100110100", + "00110111000111110000101010000111011101100001010000011111011111101001001001001000001001011000001101011100011110010", + "01001000001100100010010000111001110110001010111111001000101010101111100101001010000101010110000011010000010010011", + "01010011010011000101000110111110000111100100101101001111000001001100000110101000100110110101100000110100110011111", + "11111100110110101000111010100000001011001111010100000010100000010100111110010000111110001101011000001100101010101", + "00001111110101101010010110111110000111011011101011011111111100000011010110000011111010010010010010010010111110101", + "10111000110010010101000001100011001001011001001011111000111100000000110101100010001011111001010011111001100011001", + "11001010100110111000101110101011101010101000111100101010100100111000001101011010101011000001101011000000101011010", + "01101000110101001011100110100011011001010100100111001000100010110110000011010010001101001111100101001111100010010", + "01011111101000110101000110111110110000001101001101111111110010000100100100100111111000110101100000110101111111111", + "10010101010111000001001010001000101101010000001100010011010001110100111110010011101000001101011000001101011111000", + "11101011000101110001110000100100110001010011110011101100110111111010110000011011100110000011010110000010110011001", + "10010001111101001101010111000011100110100010111001101001001101111001010011111111100101100000110101100000110011000", + "11011110101000110011001101000111011100001001011000011110100111011000001101011001011001001001001001001001001011110", + "00001100100010100111110111011101111111100110101101000100001010110110000011010001010101001111100101001110100101111", + "10101110101001010011000010011110000111010101110001110110001001010101100000110100110111001100000110101101100100111", + "10111101101110010100111100110010000010000110011100011010111001101101011000001011001111110100111110010100111111001", + "11000111011000000111110000001010000110100011111011101001100100110010010010010011100111100011010110000011110001001", + "11001000111010101010100111111101000000100101100000111110111100011001010011111110000100100000110101100000110010101", + "00110010111110101010110011101111101010010000101000010111101100100001101011000000111101011000001101011001101000010", + "00000101001101111011101001110101010000010100001110011111111011001111100101001001010011010110000011010110000101110", + "10110011000101011110100000101010110001100100110101110011001010110101100000110100110100100100100100100100100110011", + "11100101111001111100110100000110100100101101110111011111010001101101011000001010001110010100111110010101111110100", + "00101010011111100101101100101000110111101011000111000000111111100011010110000010000001111100110000011011010100001", + "11110000000011111001011001011111101101100011110001110111010100000000110101100110100010011111010011111001010000100", + "00011110000011011100110010010001011111111000100000110010111111101001001001011000111100111110001101011000101110010", + "01111100001100011100010001001011110110010011010110001000001010101111100101010000101010010010000011010110000110011", + "00011111010011000111011111100010000101111101000101111010000001001100000110110101001000110101100000110100000101111", + "01011100010110100000110011001110001101001111010101000100100000010100111110001010010000001101011000001101011110101", + "00110111110011101000010111111101000011010010000011000101111100000011010110000010010010010010010010010010010000101", + "00110100010100010001011000001010101111000000011010110010111100000000110101100111100011111001010011111000010011001", + "10010011000100111110110110111111001100110000011100011111100100111000001101011011111010100111110011000000111111010", + "00000000110101001111101110100011111101010101000111011000100010110110000011010010001100101001111101001110100010010", + "11111110001110110001011111101010010010010101001101011010110000000100100000110010101001010011111000110101101011111", + "10000010110111000111001010100010001101001000001101001000110101110100111000001010001001001001001000001100100011000", + "10111010000101110001101000111110010011001011110011001111100101111100110110000011111110000011010110000011111111001", + "10111010111011001101011110011110100000100010111000111110000001111111010101100000110101100000110101100001111001000", + "10111010101000110011001101110011011000001001011000010010100011011110001101011001001001001001001001011001000001101", + "10000010100010100111101110101011011001110110101100000001100000110010000011010111100101001111100101010111001111110", + "11111110001001010011011011111100000001011101110001111110101111010101100000110100011111001010011111010100100100110" + ] + }, + "25": { + "0": [ + "111111101110001100101000000100111010100000000000101010011000110100011000110100011000110100011111001010011110001111111", + "100000101111001000011001101110011000111101110000010100111000001100101000001000101000001100101110010100101000101000001", + "101110100011010011000111111011000100000111111110010010010110000010001110000100001110000010001010010010001011101011101", + "101110101100100110000100110101000101010100001101100000110011100001001011111111001101100001001101100001001000001011101", + "101110100101100001000111001101111111001100101101011000001111111001110011000111110011111001110101011001110010001011101", + "100000100100010011000011010000100011100110101011010010011000110111110101001111100110001111110010010011110011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001110101000011011010001100011011101100101011110001000111001010001001001001010001001010100111111010100000000000", + "101101110010110000110000010011111111100011111011001001111111110111111011010111100011111111111100110001111010001001011", + "001000001000001100101001110101111010100000100000101010011110110100011000110100000000110100011111010010011001100000100", + "010111111111001000011000000110111001111100010000010000100110001000101000001000101000001100101110001100101001011000010", + "100100000101010011000110000010000100000110111110010100001010000100001110000100001110000010001010000010001111010110011", + "011101100100100110000100100101100100110101001101100111010101100111001011111111001101100000101101100001001100110101111", + "100101000101100001000110011100010110001101101101011111101101011111110011000111110101011000010101011001110100001100111", + "001100100100010011000011011001100010000110101011010011100011010111110101001111100011010110010011010011110010000010110", + "010010010011000101110110110100110011010000001000110010100000110100111100100100100000110101111000110010111001100001010", + "110000101001101010101011001000001001111000100110010010101110001100100000001100111000001100100110001010100111011001001", + "111110011110111011111111000011001101110110010000011100101000000010101110000010110110000010101000000100101001010110010", + "111010110010100101110101101011010100010001111011111101001011100101000101100101000011100001000011100001010000110101111", + "111111011110001111111101011001011111011101100001001111010001011111010101011111010011011001010001011001001010001101000", + "011011110010010011110010010011010010000011111011010001100011010001111101010001111101010110011011010111100010000011001", + "001000001000001000101011110001111011100000000000110010000000110010011110110010011100110101111000110100000001100000110", + "010111111111001110111000000000111001011101110000001000111000001100101110001000111000001001001000001000101001011000001", + "100100000101110101100000000110000101100110111110000100010110000010001010000100010110000101001110000100001111010110000", + "101101100100000010100110100011100100010101001011111111000011100000101101100111010101100111001011100111001010110101100", + "000101000101100100000100011000010110100101001011000111110011011000010101011111101101011111110011011111110010001101001", + "101100100101110011000011011101100010111111001101001011111101010010010011010011110101010111110101010111100100000011001", + "010010010010000011010000110000110010110000001100100010111100110011111000110010111110110100111100110100100101100000101", + "110000101000101000101011001010001001001000100000001010111000001010100110001010100110001101000110001100111001011000010", + "011110011111011110011111000111001101001110110110000100110110000100101000000100101010000011001000000010110111010010010", + "011011111011100011010001101010111110100010011101100101011111100001010011100101010111111100100011100101000100111111100", + "011110001111001110111101011101100010101001100101011111001000111001001001011111001010001110010001011111010101100011001", + "011010101010110100010000010001101010111011111101010001111010110110000011010001100010101001111101010001111101101011010", + "101010001001001001101001110001100011000100100110110010001000110101100000110010000010001010011110110010011110100010100", + "110111111110001000011100000111111111110010010110001000111111101001001000001000101011111100101110001000111111111110010", + "100100000100010101100110000111010010011000111010000100010011000101001110000100001011010010001010000100010010100100011", + "011101110100001101000110100110010010100001101101100111001000100111001011100111001010110000101011100110110100100111111", + "000111001100101101000100011101010000010110101101011111101110011111110011011111110110001000010011011110001101111111001", + "101110111101001101101111011101001101110100001010010011111000010111100101010011100110000010010101010010010010010111001", + "110011010010111011010000110001110101000101101001010010100011110100100100110010100111100011111100110010111000010100101", + "000011111001111111000011001011110111100000000111101010100001001101011110001010111001011010100110001010100111001100010", + "011100010111100111011111000111101011110011110001100100110011000011010000000100110011001100101000000100101000100010010", + "011011101011101101101001101010011010011110111011100101001000100100100011100101010110101001010011100101010010100101111", + "111110011111001110100101011101101001000010000001011111001000011110010001011111001000010001001001011111001001111111000", + "101001101010100011110000010000100100110111011011010001111110001001111101010001100100010110000101010000000010010001001", + "101011011001011000100001110000111100111011000000110010000011101010011110110010000011100101100110110011100000010010100", + "110101101110011100110100000110010111101111010001001000100011010000111110001000111101011001001110001001000001000100010", + "000111000100011011100110000111000010010011011111100100010101010100010010000100010000010101001010000101010110110010011", + "101110111100010110101110100110011010001101101010000111001100100110110011100110110101010110101011100111010010110001111", + "000111010100111101100100011100110001001000101010111111101110011110001011011110001001110110010011011111101011000001001", + "100001111101011101111111011100101100101000000101010011111000010010010100010010000001111110000101010011100100110011001", + "010111001010100101001000110000000100101111100100110010100011110011111101010011100101111101100100110010100101110010101", + "001010110001111101001011001011111111101100001110001010100001010010100111101010111111001101011110001011011110101010010", + "010101001111101000110111000110001010001101101000000100110101011100101001100100110101010011010000000101010001100100010", + "101100100011110011011001101011111100000010110010100101001110111101010011100101010000110100100011100100110010111001111", + "100100011111000000111101011100011001001000000000111111001110001111001001011111001011001110010001011110001001100001000", + "011011111100100110011000010001111110100011011100110001111111110000000101010000000011111000011101001001100100111111001", + "101110001101010110001001110000100010111101001111010010011000110011100110110011100010001011111110101010000110100010100", + "001010101110000110100101000110101011111011011110001100101010101001001111001001011110101001011110010000111111101010010", + "110010001110010011111110100111100010011001010010000010011000100101001011100101010110001101010010010100010010100010011", + "100111111010010000100110001111111110010101100011100000101111111110101010000111010111111110110011100110110010111111111", + "001111010100110011101100000100010001010010110011011000011001000110010010111111101110111110001011011110001010110101001", + "011000101111000101101111101101001100100000000100010010010101001010000101010011100010101010010100010010000100110011001", + "001011001100101101010000110000111110101001101101010011110110100011100100110010100011001011111101010011100101000100101", + "000010100111111101000011101011001111111010000111101010101111001011011110001011011010010011000111110010111110011110010", + "011001001101100000111111001110100100001101111001100100100011100101010000000101010100010101001001111100110000010000010", + "100111111011101011001000111011011100010110110011100001000010000100110010100100110101100100110011111101010011110011111", + "101001001011001000100101100100010101000100001001011001011010111110001000111110001111011110001001001111001001010011000", + "010011100100111110001000111001001100100001010101010110010101001000000100101001100000010000000101010000000100011111001", + "100010011001011110001001110000101010111011011110110101110100101011100111001010000011010011100110110011100111011011100", + "000011110100011110100100111111101111111011011111001001001110010001011110010100111001110001001111001001011111101000110", + "111101011010000011110110011111001000011111011011100101000000010101010010010010010101111101001011100101010011110011011", + "101111101010001000111110000111111010010111101010000111000010100110110011100000110111111110101010011110110011110011011", + "000000010110110011111100010101011111010110100010111111111000111110001011011000001111001110010010100110001011001011001", + "010001101101000101111110001100110010100000000100010111110100110010000100010010000011010010000101001010000101000101001", + "000101000110110101000000001001110000101001100101010100110111010011100101010011100010110011100100100011100100111100101", + "001001111111100101010011100010010111111010001111101101001110010011011111110010111011001011011000001011011111000110010", + "010111001111101000100111000110000100001101101001100011000010011101010001111100110101100101010110000101010001101001110", + "101011110001110011001001010000000010010110101010100100100011111100110011111001010100011100110100100100110010000010011", + "101100011001011000101101000000011011000100011000111110011011001110001001001001001110100110001100111110001000101000100", + "011110101100111110001110110011001100100001000100101001110100001000000101010110000001001000000100101000000100100100001", + "101101011011011110010001111110110010111011000111001010010101001011100110110101100010100011100111001011100111100110100", + "001011111110011110100101010000111111111011011111010100101111110001011111001001011011111001011110010101011110111110010", + "110110001001100011110110111010100010011111010011110010011000110101010011100101010010001101010010010011010010100010011", + "101010101010001000111110001000101010010111110010000000111010111110110010011110110010101110110101100000110010101011111", + "001110001101010011111110011010100011010110101010111000001000100110001010100110001110001110001101011000001011100010111", + "010011111110000101111110000110111110100000000100010010011111101010000100001110000111111010000010010010000100111110110", + "000011010101110101000001001100000100101001100101010011100010000011100101000101100001111011100001010011100100010011010", + "000100110101000101010001001000011101111010011111110010100010110011011001101101011011000011011111110011011110010001001", + "010110000101001000100000001000001100001101110001111100100101011101010111100011010110001101010001111101010001111100010", + "100101111001110011001110111100010010010110010010111001011100111100110100100100100011000100110011111000110011111111111", + "101110011110111000101001000001101111000100101000101001010110001110001100111110010101110110001001001000001001101111000", + "011111101110111110001001111111000000100001100100110110010000001000000100101000011001111000000011001110000101001011001", + "100000010010111110010010011110111010111011000111010101101010101011100111001011111000111011100000101101100111001011010", + "001000110101011110100101001101111111011010111111001101001000110101011111010101011110101001011001010001011110010011101", + "110101000101000011110110010010110110111111010011100011010100110011010011110011010110101101010111110101010010110101100", + "101001111000101000111101001101110101010111110010011000101111011000110100000000110111001111010010011110110011111100100", + "001101011110010011111011110011010101010111101010100000011110000000001100111000001101010111101010100110001010100111001", + "010011101111000101111000010010100100000000000100001110001010001010000010010010010101110011100100001110000101001001001", + "000011010011010101000100100100000001101000100101000101111011100011100001010011111000011010100101000101100100000010101", + "000100110101100100010010100100011000011010111001101101001011010011011111110011000010100011011001110101011110010000010", + "010110000100001001000100101000001111001101110111100011011100011101010001111101001110001101010111111011010001111101100", + "100101111000110000101000100000010010110111010100100000100101011000110010111000110011000100110100111100100001111110000", + "101110011110011010001101001001101101100100001100111000001111101000001000101000001101110110001100101110010011101110111", + "011111101110011011001011111011000011100001000010101110011001101110000010101110000001111001100100101000011101001010010", + "100000010011111000110110011110111000111010000001001101110010101101100001001101100000111010000111001011111111001011000", + "101011110100011001100011001101111111011011011001010101010000110001011001010101001110101100111111010101011110010011110", + "001001000101100011010010010010110111011110010111110011001010110101010111110011001110101010010011110011010010110101111", + "011000111000001001011111001000111111101111010100000000101111111111010010011000101011111000110100011000110101111110111", + "000000001111010110011111110100100010011110101100111000001000100111101010100000010010001000001100100000001101100010111", + "111111101110000110011110010000101010011001100010010110011010101111100100001110000010101010000010001010010011101010110", + "100000101010010110100000100100100010001001100001010101111000100100100101000101100110001011100001000011111001100011010", + "101110100100100000010100100100111110101010011001110101001111110101011001110101011011111010111001110011000110111111001", + "101110101100001110000100101111000010001100110111111011010111111011010111111011010111111100110111111101001000001011110", + "101110101001110100001100100110111000101000110100111000100100111100100100111000100100111001010100111000110011001010000", + "100000100110011000001011001001111110001111001100101000010100101110010100101000010100101001001100101000001001110010101", + "111111101111111111101111111111010111000101100010101110011100101001111100101110011100101110000010101110000011110100000" + ], + "1": [ + "111111101100101000000010010100011111010101100111010100011111001011100111010101100111001011100111010101100010001111111", + "100000100101001001000100101100101111001001011111001100101111010001011111001101001111010001011111001001011100101000001", + "101110101100110010110101000010001011100101010011100010001011110101010011100011001011110101010011100101010111101011101", + "101110101100110110101001000001001100011110110010000001001010011110110010000001001010011110110100011110110100001011101", + "101110101000000101101111111000111110100110001010111001111111100110001010111001110111111110001100100110001110001011101", + "100000100111010010011101110110100010001110010100010111101000101010000100010111110010001010000010001110010111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000110001001101010011000100010101000010000111001001000101110001000111001010110001110001100101000010001000000000", + "111100101010000000011001110111111110101110011100110111111111101000000100101110011111111000000100101110011101110011101", + "110000010100001000000010010100111001001101111111010100011111001011100111001101111101001011100111001101111110011101000", + "101101111101001101000010101000101001010101011111001100100111010101011111010101001111010001011111010101011110100111110", + "011000010101110000110111000100101111110011010011100010001011110011010011110011001001110101010011110011010010001001111", + "101010100100010110101001000111001010011000110010000000100010011000110010000000101010011111010100011000110011000010111", + "010101011001100110101111111111010010100000001010111000010010100000001010111000010000100111101100100000001011110000101", + "010010100111010110011101110110010100001110010101010110011100001010000100010110010100001011100010001110010101111100101", + "010110000011100101100111110101111101000101111100110101111101000011100101010101111111000010100001000101111100111111001", + "001011101001011010000010101101000001110101000110001100101111110011011001110101000111110011011001110101000110101111010", + "000010000010111010010100100011001111111011001000000010101001111101010111111011001011111101010111111011001000101011101", + "100000110000100010011111000101000100111000100010100001001010111000100100111000100011111100110100111000100011001010010", + "110011011110101100011100011111110100101000010000111001010000101000010100101000010011001110001100101000010001010010110", + "011100111010110000000001110001111010101110011100101110010010101110011100101110011101001001100010101110011101110100000", + "111000001100000011010100010010111001001101111111001101111001001101111111001101111100101010000001001101111110011111000", + "001001111101100101011110101001001001010101001110010001000001010101011111010101001111010100111001010101001110100101110", + "100000001101100011010111000101001111110011001010010101001111110011010011110011001001110010010111110011001011001001111", + "100110101101001111100001000110101100011000101011100110100010011001010100011000101010000001010100011000101010100010111", + "011001000000001001000111111110010100100000010011011110010010100001101100100000010000111001101100100000010010010000111", + "010110100110110100100011110010010010001110010101010110011100001111110011001110010101010011100010001110010100011100110", + "011101000011011001101110110011111001000101111100110101111101000100111000100101111110110010100001000101111100111111010", + "000011101010101011101100001011000001110101000000010101001001110101000000010101000110010010111001110101000000101111001", + "001100010001010100100100100101001111111011001110011011001111111011001110011011001010011100110111111011001110110111110", + "100011111010001011110101000100111110111000100101111100101111111000100100111000100111111001000100111000100101111110011", + "110010001100111100101010011111100010101000010101001110011000101000010100101000010010001001010100101000010100100010100", + "011010101001111000110110101000101010101110011101001000001010110111111010101110011010101111111010101110011101101010001", + "111010001011100010101011101011100011001101111110101011111000110100011001001101111010001100011001001101111110100010110", + "001111111111101110011001010001111111010101001110010001011111101100101000010001001011111100111001010101001111111110001", + "101000000001101111011000110100010011110011001010010101010011000010001110010101001011001010010111110011001010100010000", + "101101111111000110000001000110011000011001001101111110101000111001001101111110101010100001010100011001001100100001100", + "010100000010000111011111111111000000100001110101000110001000000001110101000110010110001001101100100001110101111000111", + "010100111100111101000011110010101111001111110011001010010110001111110011001110010110000111110011001111110010001010110", + "011110010001000001110111110010110100100100111000100011101100100100111000100101111111100100111000100100111000001011010", + "000000101010101011111101110011101100010101000000010011011100101100100000010101000001011100100000010101000001010011001", + "011100010101001100000101011100000010011011001110011101001010100010101110011011001011010010101110011011001110110100000", + "100010100010011011110100111100000000111000100101111100111001000001000101111100110110110001000100111000100100100001100", + "010011011010100100011011101111001000101000010101001110001000011001010101001110001000001001010100101000010101111001011", + "001011100011110000100111101000101110110111111011001000011110010111111011001000000000000111111010110111111010010111010", + "001001011101111010110010001010101101010100011000101011100101110100011000101011100101100100011001010100011000010100110", + "101111110111110110011000010001110100001000101000010001000101001100101000010001001011011100101000001000101001010100101", + "111000010011111111000000110100000010000100001110010101010011000010001110010101001011010010001110000100001110111011000", + "101110110111000110010001011110000001111111001101111110101000100001001101111111001110110001001101111111001100110000000", + "000111010000010111011111000111011001000111110101000110001000011001110101000111110000001001110101000111110101100001011", + "010111101111001101000011001010110111001111110011001010011110010111110011001011100000000111110011001111110010010111010", + "111111000101001001110110000010110100100100111000100011100101110100111000100010100101100100111000100100111000010100110", + "010001111011101011111010110011101100001100100000010011000101001100100000010011011011011100100110001100100001001100001", + "111101001010001100000010011100000010000010101110011101010011000010101110011101010011010010101000000010101110100010000", + "000000111001111011110101111100000001100101010101111100101000100001000101111100110110110001000011100101010100100001100", + "101100001000100100011011101111011001011111001101001110001000011001010101001110001000001001010001011111001101111001011", + "000011111001110000100111101001111111010001100011001000011111110111111011010001100111111111111011010001100010111111010", + "101010001100111010110000101010100010110010000000101011111000110100011000110010000110001100011000110010000000100010110", + "111110101100110100011110010101101010001000101000010001001010101000101000001000111010101100101000001000101001101010001", + "100010001011111001000000110010100010000100001110010101011000100100001110000100010010001010001110000100001111100010000", + "100111111111100001110111011001111111100111001101111111001111100111001101111111010011111000101011100111001100111111100", + "110101011000110100011001000001001101011111110101000111111101011111110101000111101001011000010011011111110101001101011", + "000101101111001001100011001011000011010011100010001011110011010111110011001011100111010110010101010011100011000011010", + "001100011101001111010110000010100000110010100001000010110000110100111000100010100100110101111100110010100000100000110", + "000100101010101110011100110010011000001010111001110011001000001100100110001010111100001100100110001010111000011000001", + "101010000010001100000110011100010110000100110111111101000110000010101000000100110010000010101000000100110110010110010", + "110011111001011011001011111001110011100101010101111100100101100101010011100101010001100001000011100101010101110101100", + "101001010000100111100011101000101011011111001101001110011101011111001001011111001001011001010001011111001101001101001", + "010011110001000001010011101110100101010001100011010001110011010001100011010001100111010110011101010001100010000011010", + "011000010101011001100000101101000100110010000000110010010000110010000000110010000100110101111110110010000000100000110", + "011110110101100010110100010101011000001000111001001100101000001000101000001000111100001001001110001000111000011000001", + "111010001010111001100110110010010110000100010111100010000110000100001110000100010010000101001010000100010110010110000", + "101001100111111011100101011001110101100111010100011001000101100110101011100111010001100110101011100111010101110101100", + "110001011000100111000111000001001101011111101100100001111101011110010011011111101001011110010011011111101101001101001", + "000001101110111101100001101111000101010011100010001011110011010010000100010011100111010110010101010011100011000011001", + "000000011100001010010011000101000110110010100001000010110000110011100101010010100100110101111100110010100000100000101", + "001100101100011010110000110101111110001010111111101010101000001010111111101010111101001101000110001010111111011000010", + "100110001001101111000100011011110010000100110001100100100110000100110001100100110011100011001000000100110001110110000", + "110111110000001010011111111000110011100101010010100001000011100101010011100101010000000100110011100101010010010101100", + "101101011111100001011111001000101011011111001000111001011011011111001001011111001000111110001001011111001000101011011", + "010111101011001000110011010110100101010001100010110111110101001000000101010001100111010000000101010001100011000111010", + "010000000011001010001010110101000100110010000001010100010100101011100110110010000100110011100110110010000000100001000", + "011011111111100110111011001101111110001000111001001100101111110001011111001100111011111001001110001000111000111111110", + "110110001010111010100101100010100010000100010111100010011000110101010011100010010110001101001010000100010110100011111", + "100010101001101110011100011001101011100110110010000001011010100110110010000001010010101110101011100110110010101010111", + "111110001010110111111110100000100011011110001010111001101000111110001010111001101110001110010011011110001011100011001", + "000011111110111101100001001111111110010010000100010111111111110010000100010011100111111010000100010010000100111111001", + "000011000010011100000010100101110011010011100101010100100101110011100101010010100001111011100101010011100100010100101", + "011101111000000011111000001101101011101010111111101100100101010011011111101010111011000011011111101010111110001100010", + "110111000101101100110100000011000101100100110001100010100011011101010001100100110010001101010001100100110001100011110", + "100101101010001011010110100001000101100101010010100001011000111100110010100001000101000100110011100101010011100000011", + "001110000001101001101110111000011111011111001000111001010110001110001000111001010011101110001001011111001001111000100", + "010101111011011000100010110110110001001000000100110111110000001000000100110111111011100000000101001000000101001010001", + "000011011001011010000011010101110010101011100111010100001010101011100111010100011010100011100110101011100111001010000", + "011000101111100110111011001100101001010101011111001100101000110001011111001100111110111001011111010101011110010011010", + "010100010000110010110101100011000101110011010011100010010100110101010011100010010110101101010011110011010010110101011", + "110011110111101110010100000000000110000000110010000001001111011110110010000000110111001110110010000000110011100000011", + "101110011000110111101110111000001110111000001010111001111110000110001010111000001101010110001010111000001010111000101", + "010011111000111101100001010111101010010010000100010111101010001010000100010110010101110010000100010010000101010110101", + "100011001000000100000010110101101011010011100101010100110011100011100101010101111000011011100101010011100100010101001", + "001110100010000011111100001101110011110011011111101100100011010011011111101100100010100011011001110011011110010001010", + "110101001011001100110000000011000101111101010001100010100100011101010001100010101110001101010111111101010001111101110", + "111001110111001011010100100001000100111000100010100001011101011100110010100001000011000100110100111000100011111110011", + "001111000100101001101010111000011110101000010000111001011111101110001000111001010101110110001100101000010001101110100", + "010001110001111000100100110110110000101110011100110111111001101000000100101110011001111000000100101110011101010010001", + "100011001100011010000111010101100011001101111111010100010010101011100111001101111000111011100111001101111111010011000", + "101011111010100100111010001000110001010101011111001100110000110101011111010101001110101001011111010101011110001011110", + "001001011110010110110000000101011101110011010011100010000100110011010011110011001110101101010011110011010010111101111", + "011000100110101101010001100111111110011000110010000000101111111000110010000000101011111111010100011000110011111110111", + "000000001001110001001011011111100010100000001010111000011000100000001010111000010010001111101100100000001011100010101", + "111111100001111010000011010110101010001110010101010110001010101010000100010110010010101011100010001110010101101010101", + "100000100001000110100110110101100011000101111100110101101000100011100101010101111010001010100001000101111101100011001", + "101110100010100001011110001100111111110101000110001100111111110011011001110101000111111011011001110101000110111111010", + "101110101010101010010000000010101001111011001000000010101001111101010111111011001001111101010111111011001000001011110", + "101110101111001100010111100101000010111000100010100001000010111000100100111000100010111100110100111000100011001010000", + "100000101101001001001011011111010000101000010000111001010000101000010100101000010000101110001100101000010001110010101", + "111111101000011011110011010001111100101110011100101110011100101110011100101110011100101001100010101110011101110100000" + ], + "2": [ + "111111100011001110000101111110010110001101010001010111111111000000011100100010011111010100011111001010011110001111111", + "100000100101111100000111100010101001101100101110100111011100011001100000000110101110001100111110010000111000101000001", + "101110100100000111110000011001111001010100001100010101010010110111011110101000001010000010010010010100010011101011101", + "101110100110001111111000001011110110000011111111111101010000010100111001111101001101100000110101111110110000001011101", + "101110101000100010111000010011111111110000111101101110011111101100101011101111110011111000001101000110001010001011101", + "100000100011100110001101010001100010101011110011101010001000100010100011011101100110001110010010001010010011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001100011101111010011010100011011001010110110010011000101101100111010011001010001000010100101110010101000000000", + "001100111001111000011110010100111110110001001101011111111111100011111110010011100011111111111100101001111101111010000", + "000001011101010110000100110110110110001101010001010111100111100000011110100010000000110100011111001010011110011001000", + "100111111001101100000111110010010100101100101110100111011011011001100000001110101111001100111110010000111110100001110", + "010000001110010111110000011000101000110100001100010101001111010111011100100000001001100010010010010100010011001111111", + "100101100110000111111000001011001110100011111111111101010010000100111001110101001010000000110101111110110100100100111", + "001001000000110010111000010010111010010000111101101110001010111100101011110111110000111000001101000110001100001000101", + "010010100011110110001101001001010010001011110010101010000111010010100011011101100011010110010010001010010010000100101", + "011110010001111000010111100111101110010100111010011111111100000000001010111110100000110101111001000011111000100111001", + "010010111010110011000101001111111011001010010110000100111101111000100101010000111000001100100111110010100110111111010", + "110111011011110000110010000000000000111011100110000001010001010110101000000100110110000010101001111100101000101111110", + "001010111100011001101010011111111000100001000010001010110110111100001101111011000010100001010011111101001011001100011", + "001011011101000100101011000011110011101111010110101110010100000100000111101011010010111001001001001111011000010100100", + "010011100000110001001110111101111000010101001000101011100100101010001111000011111100110110000011001000000010010010001", + "100100001101011111010101111111010110011101010000100011100111010001000110011010011101010101100000101011100001100101000", + "001001110000101101010110010010001001010000111001110001011100011001111000000110111001001001011001010001001001011111110", + "101000000111001110100001010001011000100010000101101001001010101110111100001000010111100101010111110101001110010001111", + "111111110111011110101000100010010110100111101010010001010000010101001000111101010100000111010010011111001101010010111", + "101100000000101011101001011011011011100000111101010010001010001101110011011111101100111111101010100111110101110100101", + "111100101010101111011100101001001110010111110100101100000000001010111011001101110100010111100101001111110011111010101", + "100110010000101001000110101110011110000010101011010011111001101001101010000110111111010100100100100100111001111001001", + "001000111011101010010101100110100011000110010011111001011111110001010100011000100111101101011110010101000001001001010", + "010010011011101001100011001001100000111011101110001100100001100111110000101100101011100011010000011011001111010101100", + "100111111101000000111011111110111110111101010100011100011111110100010101101011010111111100110010110100100100111110000", + "110010001100010101111010001010100011110001011110111010011000110101100111010011001010001110001000100110010101100010111", + "001010101001101000011110010100101010011000111100100110001010100011111110001011100010101001100100101001111010101010010", + "000010001101000110000100110111100010001100010000111111011000100000011110110010000010001010000111001010011000100011000", + "100111111001110100000111110010111111010101101111110111111111110001101000010110101011111100111110010100101000111111110", + "010010001110011111110000011000010010101101111101100101100111011111010100110000001010010010010010010010001111000111111", + "100110110110000111111000001011101110101011011110010101000100011100100001110101001011010000110011100000101101000010111", + "001010011000110010111000010011011011100001110101010110110101111100101011110111110111101000001011011000010100111100111", + "010011111011110110010101001000100000001010000010101010011001000010111011011101100111100010000100010010010010001110110", + "011110011001111000001111100111111000011100110011010110101110111000010010111110100110100011100101010011111000001101010", + "010011111010110011010101001110110011000010100111111101000100011000111101010000111000111010111111110010100001010101001", + "110111000011110000101010000000011000111010100110001001101110110110110000000100110010101100110001111100101110010010010", + "001000101100011001110010011110010110111000000010011010011101011100001101111011000111001001010011111001000100000000111", + "001001010101000100110011000010001001110110000110111110111100000110011111101011010001010001001001001001010100011001000", + "010000100000110001000110111101111000011101101000100011110110101000000111000011111101110110000101010110011011110110001", + "100111010101011111011101111110110110001100011000111011011000010111000110011010011010000101100110110101111001010101010", + "001000100000101111011110010011111011010001011001110001000000011111100000000110111100111001011111001001001001010101101", + "101000001111001100101001010001001110101010000101100000011110001000100100001100010000010101010011100101001110111011100", + "111110110111011111110000100011011110101111001010010000101001110111010000111010110101010111010010011111001100111000100", + "101100011000101001110001011011000011100001111101010010110101101011101011011000001001110111101010100111110101001001001", + "111110111010101101000100101000100000001110110100101100101011101010111011001100010001111111100101001111110010110111001", + "101000011000101000111110101011100100011011101011010011010001101011110010000011111100111100100100100100111001110100101", + "011111111011101100011101100110100011000110110011111000101101110011011100011011000110101101011110001101000000101100010", + "011001000011101110101001001000000000111010101110001101101110100000110000101101001100110011010000000011001111100011100", + "000101101101000011110111111000010110111100110100011100101101110011101101101010110001010100110010100100100100111000000", + "111011010100010111010010001000010101110001011110111011000101010010111111010110001011001110001000111110010101100000111", + "000011111001101001000110010011111110011001111100100110011111100000000000001100000011111001100100101001111010111110010", + "100110001011000100011000110001100010001100010000111111011000100110000000110101100110001010000111001010011000100010100", + "101010101101110110011101110011101011010101101111110111111010110000000010010111001010101100111110010100101001101010010", + "100010001100011110001100011100100010101001011101100101101000111101100010110101001010001010010010010010001110100010011", + "110111111010000001110000001011111110101101011110010101011111111110110011110110101011111000110011100000101100111111111", + "001011011100110101110010010011010011100111110101010110110100011011101011110110010000111000001011011000010100110100111", + "110011100001110101000111001111111000001110000010101010010110100101011101011100000110101010000100110010010010110010110", + "010100001111111010111001100100010110011010110011010110101101011111010010111011100011001011100100110011111001000001010", + "011001110000110010011101001000001001000100100111111111011100011011011011010111011011010010111110010010100000011001001", + "010000000101110010101110000110011000111000100110001011100110110000110110000011010101110100110000011100101110010110010", + "000111110010011011110000011111010111011000000010011010010000011101101101111010100100000001010011111001000101110101111", + "111000000101000101010111000111111010110110000110111100110000000110111001101110010000111001001001001001010101010101000", + "000000101100110111000110111101011111011111101000100111101110101000000101000000011110010110000101010110011010011011001", + "100110010001011000011111111110110110001110011000111011011001110110000110011011111101010101100110110101111001011001010", + "101000111010101110011100010100101010010101011000010111001101011110000110000111011101110001001110001001001001101001101", + "100010011001001100001111010010101001101100000101100110011011001001100100001101010101111101001010000101001111110111100", + "110100111101011111110000100101111101101001001110110000110001110110110110111010110110111111001011111110101111110100100", + "001011011110101001110101011101010010000011111100010110111101101011101101011000001110101111110011000110010001001101001", + "110001100100101101000110101001111001101110110100101100100110101011011011001100010010110111100101001110000111000011001", + "010101001000101000111010101010000111011011101000010001011100101011010100000011111101010100100100100101100110111000101", + "011011110111101100011101100110010100000100110010101100110100010011011110011011000101001100111000001101011001000000010", + "010000011111101110101001001000001000111000101111000101101110100000110000101101001011100010110110000011010111101111100", + "000101101111000011110001111001001111111000110011100010100000010011101011101010110000011101000101100100100100000100000", + "111001011010010111010100001001101010110111011100100101000001010010111111010110001110100111010001011110010100101100111", + "000010101011101001000110010011001011010111111000000110000111000000000000001100000001001001111101001000011100100010010", + "100110010011000100011000110000111111110110010001100011010000000110000000110101100010100010011110101011111111100000100", + "101011111111010110011101110010111110111101101111110111111111110000000001010111001011111100111110010101011110111110010", + "100010001110011110001100011101100011111101011110100111111000111101100011010101001010001010010010010011010011100010011", + "110110101010000001110000001011101011101001011111010001011010111110110010110110101110101001010101100000110100101011111", + "001010001101010101110010010011100011111011110100010110111000111011101010010110010010001001101101011000001101100010111", + "110011111000110101000110001110111111001110000101011100001111100101011101011100000011111011110011010010010010111110110", + "010111011111011010111001100100001111011010110001001000111000011111010010011011100111100010111000110011111000010101010", + "011000110001110010011100101000001010011100100011011101011001011011011010010111011001011010100110010011000110010101001", + "010000010101010010101111100111101111000000100111010101110111010000110111100011010000010100101000011101001001111010010", + "000110101010011011110001011110111111011000000010011010011000011101111101111010100101010001010011111000110011111001111", + "111000000100100101010110100111100010111110000101111100100101100110110001101110010011110001001001001000001001101001000", + "000010100100110111000111111101010001011111101001100111111010001000011101000000011011111111100011010110000011001111001", + "100100011001111000011110011110011100010110011001111011001001110110011111011011111111111100000000110101100001001101010", + "101011111011101110010100110101110010010101011110000111010101111110001110000111011001001000101000001001001000010101101", + "100001001001101100000111101010111011101100000111111110001110101001110100101101010001010100001110000101001110110011100", + "110101111100010111110001001101100111110001001110110000110100110110110111111010110100110111001011111110101011111000100", + "001011001110000001111101110100010110011011111100001110101100001011100100111000001011001111110011000110010010100001001", + "110000111100101101000111101001001101101110110100101100101110101011001011011100000011100111100101001110000101001111001", + "010101001001001000110011011011001101010011101000010001001000001011011100010011100110011100100100100101100100000100101", + "011001111111111101100100100110101010000100110010111100100001001011000110010011011000100100111000001101011000010000010", + "010010001111011111100000101000001100100000101111001101111111011000101001100100010001001010110110000011010111111101100", + "000110110110011010011001011000011011111000110011101010111000001011100011101010010100100101000101100100100101111110000", + "111010010010100110011100110001000000110111011100100101010001111010101111111110001010001111010101011110010101101110111", + "010011101010100000000111111010010001000111111000000110000110010001000001001100000010000001111101001000011101001110010", + "100110000011101100010000011001011011110110010001100011000111101111001001010101000110100010011110101011111111001100100", + "101011100111110110111100110010010110110101111111110111110101100000010000000110111000111100111110010101011110010100010", + "001001011111111111100101101101111011100101000110100111111100100100101010100101110000101010010010010011010010110010011", + "011000110010010001101001001011111111101001000111010001001111100110001011111111010111111001010101100000110101111111111", + "000000001100000100011011110010100011111011111100010110111000100011110010111111101010001001101101011000001101100010111", + "111111101000101101001111101110101011001110000101011100011010111101110101011101100110101011110011010000010011101010110", + "100000100111001011010001011100100011011010111001001000111000110110100010010011000110001010111000110001111001100011010", + "101110100001111011011100100000111110011100111011011101011111101011111010010111011011111010100110010011000110111111001", + "101110101101011010100110101110010001000000111111010101101100011000111111100011110111111100101000011101001000001010010", + "101110101010011011010001011110111011011100010010011010011001101100011101101011010101111101010011111000110011001011100", + "100000100100100100111110110110010110111000010101111100101101111110110001111110101101001111001001001000001001110011001", + "111111100100100111011111111100111011011001100001100111111110110000111101001001100011010001100011010110000011110101000" + ], + "3": [ + "111111100111010100011111110101100100100001000010100001001110110010011111001010011000101010011111001010011010001111111", + "100000101001111010000110000011000101011001001101011000000010101010111110010100111001010000101111010000101100101000001", + "101110101111111101111011111110100001001001010100110101111101011000010010010010010111110100001011110100001111101011101", + "101110100010010011010111110000111100011000111001110001001111111110110101100000110010011111001010011111001100001011101", + "101110100010110100010101111100111111011110101100011101111111100110001101011000001111111111110010100111110110001011101", + "100000100101001000101100000000100010111100000001101010101000111000010010010010010010001011110100001011110111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000011000101111100100011100010001101001000001101111000100000010100111110010110001111010000101111010001000000000", + "011101100100110111111110110111111110000010001011100010101111100111111100101001111111111000011010110000011011100000110", + "100101001111010100011111110100110110100001000010100001010000011010011111001010011101001011111001010011111000000101010", + "001111101001111010000110000011010101011001001101011000010100111010111110010100111000010001001001001001001000111111101", + "000000010111111101111011111110110011001001010100110101111100100000010010010010010110010101001111100101001110010001100", + "100110101000011011110101100001111100011000111001110001001100000110110101100000110101100111001010011111001011010010100", + "001000011010101100110001101101001001011110101100011101100011011110001101011000001101011111110010100111110011110101001", + "010110100011010000101100001000011110111100000001101010111001110000010010010010010100010011110100001011110101111011001", + "110100010000111001110001001110010111100000100101100000011011111101111001010011111111010010111101000010111100111000101", + "011000100101100101000001100100010001011001010000111001110010001100100111110010100111110011000001101011000000101000010", + "110011011011111010001111010010000000010111110100010111100110100100101001111100101011111101001111100101001110110010000", + "000010100100001110101101111110111000110100100000110101111001000111010011111001010101111100100100100100100101010010100", + "101011001010100111000000111101101000010010001111101110100111110011001001001001001101001110010100111110010101001011011", + "110000111110111100000011011111001010101110001111000111111010110000000011010110000011010001111100101001111101100100010", + "010101010101001000111000000000100100110011000001110000001110110011100000110101100000110010011111001010011110011000100", + "011101111000000011010001010011000100100111011011110101100010101011001001001001001111001000101111010010100110100000010", + "100010000000011110000011100000100001110100010011110110101101001011001111100101001001100100001011110010000010001110011", + "110101101000001000101100001001111101110010100101010000000111100001001010011111001010011110101100000000101101000101111", + "101000000000100001010100001001011011101000100111101110110101111111110010100111110000100110010100111000010101101001011", + "111100110010111000011011001000001111100100000110100111011111110001100101001111100101001010010010010010010011100101010", + "000010000111001010101101010000000101011011100011000001011010011110100100100100100110100011111001010011111000100110110", + "100111100101100111011000000100010000010111001100111100101001101011011000001101011110001010100111110010100110111110001", + "101111000011111110001110110110010010100011111110100100101000000101010110000011010010000100101001111100101000101110010", + "111011111101101110111100111110111111001010110110011000001111100110100100100100100011111001010011111001010011111111111", + "111110001011000101011000111011100010101111001000101101111000110000010100111110010110001001001001001001001000100011000", + "001110101110111110011010111111101011000100010011100110101010110111111100101001111110101110000011010110000010101011001", + "001010001101001100111001100101100010000101001010000011011000110010011111001010011110001101100000110101100001100010110", + "101111111001100011000000010010111110111111011101111100001111101010111110010100111111111001001001001001001000111110001", + "110110000001111100011011100111111111101101010101110111111001101000010010010010010000010101001111100101001110011010000", + "000100110000001010110101101001010111111010100001010001010011101111010011111001010001010111001010011111001010111001100", + "110100000000100101010101101100110001111000100101111111110010001111101011000001101111110111110010100111110010001001001", + "001111111011011000001010001001000001111100000000101110100110111001110100001011110111111111100101001111100100110011001", + "010010000110101000110101010110111001000010100101000000001001000100111101000010111111111100100100100100100101110010101", + "010111101101110101100111100101001000011111001000111101111111101101000111110010100101001101011000001101011000101010010", + "111100011101101010001101011011001010110011111100110101101110100101001001111100101101010011010110000011010111100100000", + "000001110100011110001101101111000101010010110000010001110100111110110011111001010000110100100100100100100100111001100", + "101101011100100110000110100100100100110110001110101100100010111010001001001001001011001110010100111110010101100001011", + "110010100000101101100101000111100001001100010111100111100111011001100101001111100111100001111100101001111100001111010", + "011001001101010001111010011001011100010101001000010010011111100010000110101100000010011010011111001010011110100100100", + "010100100010001010010111011010011010000101010011010111111001100010101111010000101100100100111110010100111111101000010", + "100100010100010111100011100000001111010110011011010010111101110010001011110100001001001010010010010010010011000100011", + "111010100000011000001010001000100100010100101101110110010010000000101010011111001000100000110101100000110101000111111", + "100111000110110001010110000000010001101010111110001000110011111110010010100111110110001000001101011000001100111110111", + "110111100010101000111011011001110011000110010110000111000010001000000101001111100110000010010010010010010010001110110", + "000000010001001011101011001001001001111101100010100111010011010111100100100100100110100011111001010011111000001101010", + "101001111011110110111110011100111011010111000100111000101110000010111110010100111100111010100111110010100111010101001", + "101111011011100111001100101111101010000001100111000110111001010100110000011010110100101100101001111100101000010010010", + "111001101111100111111010110111110110001100110110111000010100001111010011111001010001001001010011111001010010000101111", + "111111001111001100111000111011010100101001011001001011100110101001001001001001001010010001001001001001001000011111000", + "001111111110101110111100111110111110000000000011000010101111110110000101001111100011111110000011010110000011111111001", + "001010001011011100111011101100100010000011001011000001011000110011100110101100000010001101100000110101100001100011010", + "101110101001110011100000000011101010011101001101011100011010110011011110010100111110101001001001001001001000101011101", + "110110001111111101011101111111100011001011010100010001101000100001010010010010010110001101001111100101001111100011100", + "000111111110011011010011110001111110111010101001010101001111101111010011111001010111111111001010011111001010111110100", + "110101001000111100010111110100101001011010111100011101101111101111101011000001101111001111110010100111110011001011001", + "001100111001010001001100000001101010111010000000001110111000111001100101001111100011010111100101001111100101000101001", + "010001010010100001010101010111000101000100110100100110000100100100100100100100100100110100100100100100100100100100101", + "010111111101110101100111100101100101011011011000011001101110101101011110010100111101001101011000001101011001010110010", + "111111000101101010001101011010100000110101111101110111110101000101010000011010110011100011010110000011010111100001100", + "000011100100011110001101101110111101110000100000110001111111111110110011111001010000011100100100100100100100001010000", + "101111001100100110000110100101011010010000001111001010110001111010001001001001001110100110010100111110010100101000111", + "110011101000101101100101000111101110010100111001111010100101111001100011010110000001001001111100101001111101000100010", + "011001010101010001111010011001000100110111110011100000100010000010000000110101100010100010011111001010011110100110100", + "010110101010001010010111011010110001111000011111010101100011100010111000001101011000001100111110010100111110011110010", + "100100010100010111100011100001110011100010000100011001010010010010010110000011010010000010010010010010010010010010011", + "111001111000011000001010001000001000101110110101101101100011000000110011111001010000100000110101100000110100110011111", + "100100011110110001010110000001111011100111000000111101001111011110001011000001101000111000001101011000001100101010111", + "110101110010101000111011011000001011000111110000011111001011001000000101001111100110101010010010010010010010100100110", + "000010000001001011101011001000110111110100000100100110011101110111100100100100100011001011111001010011111001000101010", + "101000110011110110111110011100110101000111000000100000011010100010111000001101011010010010100111110010100110011111001", + "101111000011100111001100101111110010011000000011000110010010010100110110000011010100010100101001111100101000010000010", + "111011100111000011101010010101011100010101010110101001101001101111010101100000110101100001010011111001010011110011111", + "111111001110101110110000111000101000111001111001001011101110001001001101011000001001011001001001001001001001001001000", + "001111101111101000110101011000111110011000000011011011010101110110000101001111100111010110000011010110000010000101001", + "001001010011011000111011101110010110001010101101010000100100110011100110101100000100110101100000110101100001000111010", + "101111111000110111100001100001111110011100101011000100011111110001011110010100111011111001001001001001001001111111101", + "110110001111111101001101111010100011000010110010010000101000100101010010010010010110001101001111100101001111100011100", + "000110101111011111000011110110101010101010101101001101111010101011010101100000110010101111001010011111001011101010100", + "110110001000111100010110010011100011000011011000011101011000101111101101011000001110001111110010100111110010100011001", + "001111111001110101011100100011111110100011100000011111001111111011110010010010010111111111100101001111100101111111001", + "010011000011000011011101010101011011010100010100100110000101100010111001010011111001111100100100100100100100110010101", + "010111101100110011101110000010111001000011011000000000001000001111000111110010100011000101011000001101011001101000010", + "111111001101101110001101011001101010111100011011100110000001100101001001111100101011001011010110000011010110000101110", + "000001110101011010001100001101000001110001000110101001100100111100110011111001010100100100100100100100100100100110011", + "101110001100100110010110100000010100011001101001001011101100011110001001001001001010001110010100111110010101111110100", + "110000110001101001110101000000010000011100011011111011011101011101100011010110000010000000011010110001111011010100001", + "011001011101010001111011111110101010101110110101110000111011000010000000110101100011100011111001010010011001010000100", + "010110110010101110000111111000011001111000111011000100010001000000101001001001001111011101011000001100011100101110010", + "100110010101110101101011100011101111100010100010010000110011010100001111100101001111001011010110010010110000000110011", + "111001110001011110000011101111010110101111010111111101100101100010101010011111001110101000110101100000110100000101111", + "100100011110110101010110000010110111101111100100111101011010111110010010100111110000010000001101011000001101011110101", + "110101101011101100111010111011110011001110010110010110110010001010000101001111100010010010010010010010010010010000101", + "000011001001001011111011001101111001101100100000100111100001110011100100100100100111100011111001010011111000010011001", + "101000101010110010101110011011001011001111100100111000000110000110111000001101011001011011000001101011000000010101010", + "101101011011100111001101001000011100010001100001001110001100110100110110000011010101010101001111100101001111111010010", + "111011110111100011111010110011110100010100110100100000011101101101000100100100100010110000110101100000110101011001111", + "111101001110101100110001111010110100111000011001001010001001101111010100111110010100010000001101011000001101001001000", + "011111101111101010111101011011100000011001100001001011010010110100011100101001111000011110000011010110000010110011001", + "101001010010111100111011001001011010000010001001010000110111110011111111001010011101111101100000110101100000110011000", + "101011110001010111101000000000101000010101001101001101101000110111011110010100111001001001001001001001001001001011110", + "001001011110011111001101011001001111011010010110010001010111000101010010010010010001010101001111100101001110100101111", + "011000100111111001011011010110111110100010001001010101101111101101010101100000110111111110101100000110101101111110111", + "000000001000111110010110010111100011001010111010010101011000101111101101011000001010001110010100111110010101100011001", + "111111100000110111001100100100101010100010000010010110101010111111110010010010010110101110000011010110000011101011001", + "100000101011000111000100010010100011010101110100100111111000100100111001010011111010001101100000110101100001100010101", + "101110100100110001110111100111111111000010111010010000011111101101000111110010100111111101011000001101011000111110010", + "101110101101101000001100111011110000110100111111100110000100000011001001111100101000000011010110000011010111001111110", + "101110101100111010000101101101000011111000100000100000000010111100110011111001010011100000110101100000110100101100000", + "100000101101000100010110000010110000000001001101001010000001111110001001001001001001011000001101011000001100010100101", + "111111100001001111101101100001111110010100111111100011010010011001100011010110000011010110000011010110000010010010000" + ] + }, + "26": { + "0": [ + "1111111011000101010001011011101000101101011101110101000111110010111000001010111000001010100111110101000111110011001111111", + "1000001010010000010011000001111111000000011011100011001011110100010110010100010110000101001011100011001011110010101000001", + "1011101000100101000101110010011001110100100110100000100010111101010101111101010101100100100010100000100010111101101011101", + "1011101011101101001111001011100111010110111100111000010010100111101101000111101101011000010010111000010010100111101011101", + "1011101000011101001011100000111111110100000110110110011111111001100011001001100011011111111100110110011100101001001011101", + "1000001000100101000100110111100011110000001101000101111010001010100000110010100000101000111101000101111101000111001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010010011110010100101100011000101110000001110010010001011100011010011100011001000110100001110010100001111000000000", + "1011011100000001000010000111111110111010110000101101111111111010000000110010000000101111111111001101111111001100101001011", + "0011110001000110010000011011101100101111111100010101000111110010111000001010111000001101000111110101000111110100001101011", + "1110101110010010010010000000111101000110011010000011001001110100010110010100010110000010001011100011001011111010000011010", + "1100110010100101000101110010001111110010100111100000100010111101010101111101010101100001000010100000100010100001100000110", + "1101011111101101001111001010110001010110111100111000001000100111101101000111110101011001110010111000001010111001011000001", + "0011100000011101001011100000100011110100000110110110000100101001100011001001111011010111111100110110000100110111010110000", + "0110011110100101000100110110011001110000001101010101100111000010100000100010111000110100111101010101100101000100110101100", + "1010100011001000101001111111100100011110101011001101011111010000111000010000101000001100101111001101011111010100001101011", + "0100011110110111110100110000001100001100000110000011001011111100110110011100110110000010101001100011001001111010000011010", + "0010010000101011111101110111010001000010010001100000101010011111010101111111010101100001001010000000101010011001100000110", + "1011111011001000101001011011110010011100000001011000010010101111001101001111001101011001010000111000010000111001011000001", + "1010110000010010010011000100111101000100010001010110010100001011100011001011100011010111110100010110010100010111010110000", + "1011001000000000000011100111011010111010110001010101100101001010000000101010011000100100011111010101100111010100110101100", + "0110100101000111010001011011011010001111111100001101011111110010111000010010100000010100100111101101011111101100001101011", + "0000001001010011110010100000001001100111011011100011010001110101010110010100001110011010001011100011010011110010000011010", + "0100000110100100100100010011101011010010100111000000110010111100110101111101000101111001000010100000110010111001100000110", + "0110101101101101101111101011110110110111011101111000001000100110001101000111110101011001110010111000001010100001011000001", + "1101000110111100001011000000000000110100100111010110000100101000000011001001111011010111111100110110000100101111010110010", + "0110011111000101000101010110111111010001101100110101100111000010100000100010111000110100111101010101100101010100110101100", + "1001100011001001001001111111000110111111001010001101011111010000111000010000101000001100101111001101011111001100001101001", + "1101111110110110110100110001111110001100000110100011010011111100101110011100101110011111110001100011010001100010111111010", + "1011100010101010111101110111100011100010010001100000110110001111001101111111001101101000110010000000110010000000100010110", + "1011101010001000101000111011101010111100000001011000001110101110010101001111010101011010101000111000001000111000101010001", + "0010100010010010010010100100100011100100010001010110000110001010010011001011110011001000100100010110000100010110100010000", + "1011111110000000000010000110111111011010110000010101100111111011100000101010011000101111111111010101100111010010111111100", + "0110100101100111010000011011110111101111111100001101011110100011011000010010100000010001100111101101011111101011111001001", + "0000001111110011110011100000000001100111011010000011010110101101010110010100001110000111101011100011010011100100010111001", + "0100010110100100100100010011111111010010100011100000110111000100110101111101000101101100100010100000110010100100010100101", + "0110101011101101101011101011000111010111011001111000001101010110010101000111110101011100101010111000001010111001001100010", + "1101110110111100001011000000001100010100100011010110000101111000011011001001111011001010100100110110000100110110100010000", + "0110111000000101000011010110110111110001101110110100100000011011111000100011111000110001000101010100100101010100100001100", + "1001110011001001001101111111110010011111001100001100111010101001001000010001001000000001011111001100111111001101111001011", + "1101111000110110110000110000111101101100000010100010110110001101001110011101001110000111110001100010110001100100010111010", + "1011000001101010110111110110011010000010001011100001010010101110101101111110101101111100010010000001010010000110010100100", + "1011011101101000111010111011011011011100001011011000001100010110010101001111010101011100101000111000001000111111001100010", + "0010100000010010001000100100101001100100010001010110000000010010010011001011110011011010000100010110000100010010100010011", + "1011001110000000011100000110001011011010111110010101100001111011111000101010011000110001000111010101100111010010100001111", + "0110100100000111001000011011110111101111110110001101011110100011000000010010100000010001111111101101011111101011111001001", + "0000001110110011101101100000000000000111001000000010010110101101001110010101001110000111110011100010010011100110010111001", + "0100010110100100111000010010011111010010110001100001010111000100100101111100100101101100110010100001010010100110010100101", + "0110101011101101101011101011100110110111011001111111101101010110010101000000010101011100101010111111101010111111001100010", + "1101110111011100000001000000101100110100111101010001100100011000011011001110011011001010100100110001100100110000100010010", + "0110111000000101010111010110110110110001100110110010100001111011111000100101111000110001000101010010100101010010100111111", + "1001110011001001010011111111110010111111001010001000111011001001001000010101001000000001011111001000111111001001111101000", + "1101111000110110101010110000111101101100001000100010110111001101001110011101001110000111110001100010110001100100010101001", + "1011000001101010100101110110011010000010011011100001010010101110101101111110101101111100010010000001010010000110010100100", + "1011011101100000110110111011011011001100010101011001001100010110010101001110010101011100101000111001001000111111010100010", + "0010100000000010001100100100101001101100000101010111100000010010010011001010010011011010000100010111100100010010111010011", + "1011111110000000000010000110111111010010100100010010000011111011111000101101111000111111100111010010000111010010111111111", + "0110100010000111001100011010100011101111100100001010111010001011000000010101000000001000111111101010111111101011100011001", + "0000101010100011111101100000101010011111000110000100010110101101001010010011001110001010110111100100010011100100101011001", + "0100100010111100101010010011100011000010110011100101010010001100100011111000100101111000110100100101010010100100100010101", + "0110111111100101110111101011111110101111010001111111101111111110010011000000010101011111101100111111101010111110111110010", + "1101110001010100000111000110011100100100110111010001100011001000011101001110011011010111100010110001100100110001001110010", + "0110001000000101010011010001111010100001110000110010100010101011111000100101111000111100000101010010100101010011100101111", + "1001010101011001010111111010011010110111011110001000111010010001001000010101001000000100111111001000111111001001001001000", + "1101101000110110101100110011001001111100001010100100110100010011001110011011001110001010010001100100110001100101000101001", + "1011000111110010110001110010101010011010000001100111010101111000101101111000101101100001010010000111010010000110100110100", + "1011101101111000111110111110010111000100011101011111001111000000010001001000010101010001101100111111001000111110011110010", + "0010000110001010001100100001000001110100000101010011100001001110010101001110010011011111100010010011100100010010001110011", + "1011011110001000011010000111111111000010111100010010000010110011111110101101111001011100100001010010000110110010101101111", + "0110100010001111011100011101000111111111101100001010111000001011000110010101000001101100111001101010111110001010110100101", + "0000111110110011100101100111001100010111000110000100010100000101001010010011001111101010110111100100010010000100110010101", + "0100110000110100111010010111110111011010110011100101010111100100100011111000100100101001010100100101010011100101001101001", + "0110111011101101110111101000010010100111010001111111101111001000010011000000010101010001001100111111101010111110001111010", + "1101110001000100000111000100011100101100110111010001100011001110011101001110011011010111100010110001100100110000000000010", + "0110001000001101010011000011111010101001110000110010100010101101111100100101111100111100000001010010100001010011101011111", + "1001010101011001010111100010011010110111011110001000111010010101001110010101001110000100111001001000111001001001010001000", + "1101101000100110101100111001001001100110001010100100110100000011001000011011001001101010010111100100110110000100011101001", + "1011000111100010110001110110101010011000000001100111010101100000101011111000101010000001010100000111010101100111011111000", + "1011101101100100111110110000010111000100011101011111001111011000010001001000010100110001101100111111001001011111101111110", + "0010000110000000001100110001000001101010000101010011100001010110010101001110010010011111100010010011100101010011101011111", + "1011011110010000011010001111111111010100111100010010000010110101111110101101111001011100100001010010000110110010101010111", + "0110100010001101011100011001000111110111101100001010111100001101000110010101000001101100111001101010111110001010110010001", + "0000111110111001100101110101001100011001000110000100010010000011001010010011001011101010110111100100010110000100110101101", + "0100110000110100111010001011110111011100110011100101010001100000100011111000100010101001010100100101010100100101011101101", + "0110111111111101110111100010111110111101010001111111101011111000010010100000010010111111101101011111101101011111111110110", + "1101100011010100000111000010100010101110110111010001100010001110011100101110011100101000100011010001100011010000100011110", + "0110101010001001010011011010101010101001110000110010100110101101111101000101111101001010100000110010100000110011101010011", + "1001100011011011010111101111100010110001011110001000111010001101001111010101001111001000111000001000111000001000100010100", + "1101111110100110101100111001111111100010001010100100110111111011001000011011001001101111110111100100110110000100111110001", + "1011010111100000110001110100011110011010000001100111010000110000101011111000101010010100110100000111010101100111001011000", + "1001101011100010011110110111100111000011011101011111001110001000010001001000010000110100101100111111001101011110010011110", + "0001110110000011101100101100001101101010000101010011100100000110010101001110010100000010100010010011100011010010110101111", + "1001111000010010011010000110010111010111011100010010000101100101111111001101111111001001000000110010000000110011111100111", + "1001110010001111011100000001110011110100101100001010111011011101000111110101000111111001011000001010111000001010100110101", + "1101111000111011000101101100111100011111100110010100010011010011001011100011001011101111110110010100010110000101001000101", + "0011000000110000011010011010111011011010110011111101010110110000100010100000100010110100010101111101010101100100000011001", + "1011011101111001010111001011111010111111010001100111101000001000010010111000010010100100101101000111101101011110010001010", + "0000100001010111000110111010101000101110010110101001100000000110011100110110011100100010000011001001100011010001111101110", + "1001001110001000110010011010001010101010010000010010100101100101111101000101111101011001000000110010100000110011111110011", + "0101100101011011010111010111000110110011111110001000111011011101001111010101001111011001111000001000111000001001101110100", + "1101001110100011001100110000100001100101001011100100110011010011001001111011001001111111110110000100110110000101001010001", + "0111010111100001010001001100000110011001000000100111010110110000101010011000101010010100110101100111010101100111001011000", + "0110101111100100011110010111101111000110111101001111001000001000010000111000010000110100101101001111001101000110010011110", + "0101110110000000101101001100011101101000000101001011100000000110010100010110010100000010100011001011100011000010110101111", + "0110111010010100111010100110000111010010111100001010011101100101111111010101100111001001000000101010011000101011111100111", + "1011110000001100011101100001101001110101001101110010100011011101000111101101011111111001011000010010100000010010100110101", + "1111111010111110000100101100100010011100100110110100001011010011001011100011010011101111110110010100001110000101001000101", + "1000000000110110111010111010101111011110010011111101000110110000100010100000110010110010010101111101000101100100000011001", + "1010011101111000010111101011111000111110010000100111101000001000010010111000010010100010101101000111101101011110010001010", + "0001100101010111100111111010110010101111110110001001100000000110011100110110011100100101000011001001100011010001111101110", + "1101011110001001010011111010000000101011110000100010100101100101111101010101111101011100100000100010100000100011111110011", + "1011110111011010010110010111000110110010011110010000111011011101001111001101001111011000011000010000111000010001101110100", + "0111001101100011001101110000111111100100001010111100101011111011001001100011010001111111110110011100101110011101111110001", + "0000000011000001010000001101100011011001000000111111001110001000101010000000110010011000110101111111001101111110100011000", + "1111111010100100111111110111101010100110011101001111010010101001010000111000001000111010101101001111010101011110101011110", + "1000001010100001001101001101100011001001000100101011110110001111110100010110000100011000100011001011110011010011100011111", + "1011101001010101111011100110111111010010111101101010011111111100011111010101100111011111100000101010011000110011111110111", + "1011101010001100111100100000001110110100101101010010100000001100100111101101011111110101011000010010100000001011010000101", + "1011101011011111100101101101110111011101000111110100001110000011001011100011010011110010010110010100001110010101111100110", + "1000001000110111111011011011010010111111110011111101000101100000100010100000110010111001010101111101000101111100011111000", + "1111111010111000010110001011110110111111010000000111110101011000001010111000001010100111110101000111110101000110101111011" + ], + "1": [ + "1111111011100111000011101101011000001010111001110101000110001101000110001010111001110010111001110101000110001111001111111", + "1000001000100101000100011011010110000100010111110011001010000011001010000100010111110100010111110011001010000110101000001", + "1011101011101001011000000000110101100101010100111000100011100000100011100101010100111101010100111000100011100001101011101", + "1011101011100000100011000110001101011111101100100000010010111000010011011111101100100111101100100000010011011011101011101", + "1011101010111100011000110000111111010001100010101110011111111110011101010001100010101111100010101110011101010101001011101", + "1000001000010011110010101010100010110010100001000101111010001101111100110010100001011000100001000101111100110011001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001011111101110110011100011010011100010001110010010001110010101010011100010011000100010001110010101010010000000000", + "1111001010101001010110101010111110110010000001001101111111111101111110110010000001001111100001001101111110110011010011101", + "0111100000100111001010001011011000001010111001110101000111101101000110001010111001110010111001110101000110001011110000101", + "0010101100100001011100011101010110010101010011100010001001100011001010000100010111111100010111110011001010000101111100101", + "1111010101001101010001100100110101111100110010100001000010100000100011100101010100111101010100111000100011100100111111001", + "1111001001000000101010100110001101000110001010111001110100111000010011011111101100101111101100100000010011011110101111010", + "1010000110011010001001010000000011001000000100110111111010110110011101010001100010101001100010101110011101010000101011110", + "0101011101110101101011001011100000100011100101010100111001010101111100110010100001001011100001000101111100110011001010011", + "1000110101100010111100001001011000010001011111001100101001001101001110001000111001010001011001010101001110001001010010100", + "0001011010111011101001111101010110011101010001100010101111100011001000000100110111110101001110011101010001100011110100001", + "0101110111001100111110100110110101111110110010000001001100000000101011100111010100011110101101111110110010000000011101000", + "1100111110011000001111000110001101001110001000111001010100111000010001011111001100100110010101001110001000111000100111110", + "0111100000111111101111010010000011001010000100010111110010010110010101010011100010001010010011001010000100010110001001111", + "0111101001001101001110101011111000101011100111010100011001010101111110110010000001000011111000101011100111010101000010111", + "1000010110000111001010101011000000010011011111101100100001101101000110001010111001110011000000010011011111101101110000110", + "0111101010000011000100111101001110010101010011100010001111100010001110010101010011111101001110010101010011100011111100100", + "0001010110001001010000100100100101111100110010100001000100100001000101111100110010111100100101111100110010100000111111011", + "1010001100100000100011000110010101000110001010111001110100111001110101000110001010111110010101000110001010111000101111011", + "0011000101011100010001110000011011001000000100110111111010110111111011001000000100110000011011001000000100110110110011110", + "0001011100110101110010001011111000100011100101010100111001010100111000100011100101010011111000100011100101010101010010011", + "1100110011100100111101001001001000010001011111001100101001001100101000010001011111001001001000010001011111001101001010100", + "0001111111111011111000011101111110011101010001100010101111111100110111111011001000001111101110011101010001100011111110001", + "0101100011101010100111000110100011111110110010000001001110001111010100011000101011101000101101111110110010000001100011010", + "1100101011000000011101111111101011001110001000111001010010101111001100101000010001001010110101001110001000111001101011101", + "0111100010101111000100001010100011001010000100010111110010001011100010001110010101011000110011001010000100010111100011100", + "0111111111001101001000100011111110101011100111010100011011111010000001001101111110111111111000101011100111010101111110100", + "1000000100001111001100101011010100010011011111101100100000111010111001110101000110001110000000010011011111101100011110111", + "0111001100011011000000100100111010010101010011100010001000110100010111110011001010011000001010000100010111110010101010110", + "0001010100001000010100111100111001111100110010100001000101010101010100111000100011100011100011100101010100111001101011010", + "1010111010100001100111000111101001000110001010111001110011001111101100100000010011000001010011011111101100100000111011001", + "0011010111001100110111110000001111001000000100110111111011100001100010101110011101010101011101010001100010101111011100000", + "0001111010100100110010010010001100100011100101010100111110000010100001000101111100101110111100110010100001000100000111100", + "1100110001101100111101011001010100010001011111001100101000111000111001010101001110001110001110001000111001010100011101011", + "0001101001111010011010001100110011111011001000000100110000010100110111111011001000011010001000000100110111111011110001010", + "0101100001101011100101011110111000011000101011100111010101010111010100011000101011100011101011100111010100011001110010110", + "1100011111011000011001101111100000101000010001011111001011101111001100101000010001000011010001011111001100101001101000101", + "0111100010100111100000011010001010001110010101010011100011100011100010001110010101010101010101010011100010001111000101000", + "0111011111010101001010100010000011001101111110110010000110100010000001001101111110101100111110110010000001001101000110000", + "1000000100011111001100100011010011110101000110001010111000111010111001110101000110001110000110001010111001110100111111011", + "0111001100000011000010110100111101110011001010000100010000110100010111110011001010011000001010000100010111110010010111010", + "0001010100010001010110101100111100111000100011100101010101010101010100111000100011100011100011100101010100111000010100110", + "1010111010111000100111001111101110100000010011011111101011001111101100100000010011000001010011011111101100100001001100001", + "0011010111000100010111111000001000101110011101010001100011100001100010101110011101010011011101010001100010101110100010000", + "0011111010110101110100000010101011000101111100110010100110000010100001000101111100101000111100110010100001000100100001100", + "1101110001111100111011000001110001010101001110001000111000111000111001010101001110001000001110001000111001010101111001011", + "1010111001100011111100010011010101111011001000000100110000010100110111111011001000011110001000000100110111111010010111010", + "1000010001110010100001001001011110011000101011100111010101010111010100011000101011100101101011100111010100011000010100110", + "1100001111011000011001101000000110101000010001011111001011101111001100101000010001000101010001011111001100101001001100001", + "0101110010100111100000011110101010001110010101010011100011110011100010001110010101010011010101010011100010001110100010000", + "0000111111010101010010100101111111001101111110110010000111111010000001001101111110101111111110110010000001001100111111100", + "1101100010011101001100100101100011110101000110001010111110001010111001110101000110011000100110001010111001110101100011011", + "1000101011100001011011110011101011100010001110010101010010101100010111110011001010011010101010000100010111110010101011010", + "0111100010110011010111101001100010100001000101111100110110001101010100111000100011101000100011100101010100111001100010110", + "1000111111011000111110101000111110111001110101000110001011111111101100100000010011001111110011011111101100100001111110001", + "1001010001000110011111011110010100110111111011001000000110001001100010101110011101000110011101010001100010101110010110000", + "0100101000110011110101000101011111010100111000100011100101001010100001000101111100100101111100110010100001000101110101100", + "1111000110011100100010000101100111001100101000010001011101110000111001010101001110011101001110001000111001010101001101011", + "1100011010000011101101110011101011100010101110011101010011110100110111111011001000010011010001100010101110011101000011010", + "0110100100010000111001001000100010000001001101111110110100111111010100011000101011110000110010000001001101111110100000110", + "1101111110011110001001001000110010111001010101001110001111000111001100101000010001001000001000111001010101001110011000001", + "0000110111100111110000011110111100010111110011001010000001001011100010001110010101000110000100010111110011001010010110000", + "1010111001110001011010100101011101010100011000101011100010100010000001001101111110100101100111010100011000101011110101100", + "1011000100011011010100100101001111101100100000010011011000010010111001110101000110011101011111101100100000010011001101001", + "0110011101100011010011010011101001100010001110010101010100011101010011100010001110010011010011100010001110010101000011010", + "0110100100010001011111001000001010100001000101111100110111111100110010100001000101110000110010100001000101111100100000100", + "0111011100011100110111001000110000111001110101000110001111001110001010111001110101001001001010111001110101000110011000001", + "0000010011000000001111111110010100110111111011001000000011001000000100110111111011000111100100110111111011001000010110000", + "0000101011010101100101100101011111010100111000100011100010101011100101010100111000100100000101010100111000100011110101100", + "1011000001111100110010100101100111001100101000010001011010010001011111001100101000011100111111001100101000010001001101011", + "1100001101000111101100010011101011100010101110011101010100010011001000000100110111110010010001100010101110011101000011010", + "0110100011110110111001001000100010000001001101111110110101111000101011100111010100000001010010000001001101111110100000100", + "1101001100111000101010011000101010111001010101001110001111000000010001011111001100110001101000111001010101001110011000010", + "0000010010111111101111110110100100010111110011001010000001001110010101010011100010011111100100010111110011001010010110011", + "1010111101111001111110101101000101010100011000101011100010100101111110110010000001011100100111010100011000101011110101111", + "1011000110010011010110110101011111101100100000010011011000010101000110001010111001101100111111101100100000010011001101001", + "0110011111111010010001010011110001100010001110010101010100011011001010000100010111101010110111110011001010000101000011001", + "0110100100001001011101011000010010100001000101111100110111111000100011100101010100101001010100111000100011100100111000101", + "0111111110000100010011000000111110111001110101000110001111111000010011011111101100111111101100100000010011011110111110010", + "0000100011000000101111100111100010110111111011001000000110001110011101010001100010101000100010101110011101010000100011110", + "0000101011011101000001100100101011010100111000100011100110101101111100110010100001001010100001000101111100110010101010011", + "1011100011111100010010111101100011001100101000010001011010001101001110001000111001001000111001010101001110001001100010100", + "1100111111010111001010001011111110000100110111111011001111111011001000000100110111101111110111111011001000000101111110001", + "0110110101100110111001011001100101100111010100011000101000100000101011100111010100010100110100011000101011100110101100000", + "1101001110101000101010001000111111011111001100101000010110010000010001011111001100110100101100101000010001011111010101010", + "0000010110110111001101101111010001010011100010001110010110011110010101010011100010000010100010001110010101010010010011011", + "1010101101100000011010110100010010110010000001001101111111111101111110110010000001001001000001001101111110110010000000011", + "1011010000010011110110100100001000001010111001110101000101001101000110001010111001111001011001110101000110001011011000101", + "0110011101110011110001010011100100000100010111110011001101001011001010000100010111101111110111110011001010000100110110101", + "0110100000000001111011011001100111100101010100111000100000101000100011100101010100110100010100111000100011100100101101001", + "0111001000001101110111011001111111011111101100100000010010010000010011011111101100100100101100100000010011011111110011010", + "0000000011001000101101111111010011010001100010101110011110010110011101010001100010100010000010101110011101010000011111110", + "0000101011000101000111100101010010110010100001000101111011111101111100110010100001011001000001000101111100110010111000011", + "1001000101101100010110110100001010001000111001010101001101000101001110001000111001011001111001010101001110001001101000100", + "1001011011010110101100000100100100000100110111111011001001001011001000000100110111111111110111111011001000000101001110001", + "1100110101111110011011001111100001100111010100011000101000100000101011100111010100010100110100011000101011100111001101000", + "0100001110101000101010001110111001011111001100101000010110010000010001011111001100110100101100101000010001011110010101110", + "0110010110110111001101101011110111010011100010001110010110011110010101010011100010000010100010001110010101010010110011111", + "1111101101100110000011110010110100110010000001001101111111111101111110110010000001001001000001001101111110110011111100111", + "0000010001010001110111000011101100001010111001110101000101001101000110001010111001111001011001110101000110001010100110101", + "0100011100110001111001110100000010010101010011100010001101001011001010000100010111101111110111110011001010000101001000101", + "0110100001100011110011111100000001111100110010100001000000101000100011100101010100110010010100111000100011100100000011001", + "1010001001101001101111111001011001000110001010111001110010010000010011011111101100100010101100100000010011011110010001010", + "0010000011101110100100011110110111001000000100110111111110010110011101010001100010100100000010101110011101010001111101110", + "1101011010000101010111000100110100100011100101010100111011111101111100110010100001011101000001000101111100110011111110011", + "1011110100001110011111010101101100010001011111001100101101000101001110001000111001011111111001010101001110001001101110100", + "0111001011110000101100000010111110011101010001100010101011111011001000000100110111111111101110011101010001100011111110001", + "0000000010111000011011101110100011111110110010000001001010001000101011100111010100011000101101111110110010000000100011000", + "1111111001001110110010001111101011001110001000111001010110101000010001011111001100111010110101001110001000111000101011110", + "1000001000110101010100101111100011001010000100010111110010001110010101010011100010011000110011001010000100010111100011111", + "1011101000100010001011010110111110101011100111010100011011111101111110110010000001011111111000101011100111010101111110111", + "1011101011010001100110100101011000010011011111101100100110010101000110001010111001110010100000010011011111101101010000101", + "1011101011010011100001110101010110010101010011100010001110000010001110010101010011110100001110010101010011100011111100110", + "1000001011000101111010011100110101111100110010100001000101100001000101111100110010111101000101111100110010100000011111000", + "1111111011001111100110111010001101000110001010111001110101011001110101000110001010100111110101000110001010111000101111011" + ], + "2": [ + "1111111001000010000101011111111011101011111010000110011111011011000000001100100111110101011001110010100110001011001111111", + "1000001000000100100011111101110101101101101111100101000101000001000101011001001011110011010111100100001010000010101000001", + "1011101001100110000000011011011101011011010011111001011001110000011000010000000010111000110100100101000011100101101011101", + "1011101001101100011010001010100101000011100101111100110100001001101011011110001010100000001101011111110011011111101011101", + "1011101010011001111110000100111110110000100001011101000111111000011011010111100100101111100011010001111101010001001011101", + "1000001000110010010101001011100011011011011001010011110010001111110011101111100001011000100000110010111100101111001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011010001010110101101100011101101100101001111101110001110101110100110100010011000100011010011110101000111000000000", + "0011001110000001010111100111111110101110001000010001011011111100000110110011111001001111100001010010011110110100111010000", + "1000000001000011000101011110111011101011111010000110011101011011000000001100100001110101011001101010100110001100010000101", + "1001011010000100100011111101110101101101101111100001000111000001000101011001001011111010010111100100001010000010011100101", + "1010100101100111000000011010011101011011010001111111011011110000011000010000000010111001010100100101000011100001111111001", + "1101001001101100011010001010100101000011100011111110110111001001101011011110001010101001101100111111110011011001001111010", + "0011010010011001011110000101100000110000100001011011000111100000011011010111100100101111100010110001111101010111001011110", + "1111101100110010010101001011000011011011011001010111110001010111110011101111100001001101100001010010111100100100101010011", + "0111000110001010001101110111110000110110111100010100110111111101110101111101111001010101011001001000101110010100010010100", + "0110011010110111100000110001111110011000111100100111101100010010110000000101010111110011010111100100101000011010010100001", + "0101100100101110101001010011010110000110010111101011110000110110101101100001001100011000110100000111001011111001111101000", + "0010001111011111111000100110101110110110110010111010011100111010011110000010010100100001001100111111010001011001000111110", + "1100010011010001110110101100101011101101100001001001101100000110101110100110111010001111100010010011110101010111001001111", + "0000101100000001110111000111001000101110001100010011011010100100010110110011111001000100000001010010011110110100100010111", + "1000000101000010000101111110100011101011111010000000011100111011010000000100101001110100111001101010100110001100010000101", + "1001011110000101000010111101111101101101101111100001000111100001010101011001011111111010010111100100001010010010011100101", + "1010100111100111100001111010001101011011010001111001011010010000001000000000011100111001010100100101000011111001111111001", + "1101001011101101111011101010001101000011100111111000110111001001101011000110010100101001101100111111110011000001001111010", + "0011010010011000111111100100101000110000100001011001000110000000001011011111110010101111100010110001111101001111001101110", + "1111101010110011110101001011100011011011011111010001110001010111101011110111101001001100100001010010111100100100101000011", + "0111000000001010001101110110010000110110111010010000110111011101101101110101110001010100111001001000101110010100010110100", + "0110111110110110100001110000111110011010111010100011101111111010100000001101001111111111110111100100101000011010111110001", + "0101100010101110001000010010100010000010010111101111110010001110111101101001000100001000110100000111001011111000100011000", + "0010101011011110011001100110101010110110110000111110011110101010001110000010000100111010101100111111010001001000101011110", + "1100100011010001010111001100100011101101100101001001101010001110111110110110101010001000100010010011110101001110100011111", + "0000111110000000010111100111111110101110001010010101011011111100000110101011111001001111100001010010011110101100111110111", + "1000000001000011100101111110100101101111111100000010011010001011010000000100101001110001111001101010100110010101101101001", + "1001011110000101000011111101111001101101101011100101000111000001011101000001011111100111110111100100001010010010001011001", + "1010100001100111100001111011001011011011010011111111011010110000000000011000011100101100110100100101000011111000001010101", + "1101001011101101111010101011100001000001100111111000110000011001110011010110010100111100101100111111101011000001010010010", + "0011010000111000111111000101110110110100100111011001000111110000010011011111110010101010100010110001100101001110110101110", + "1111101100010011110101001011111111011011011101010011110101110111100011111111101001010001000001010010100100100100111000011", + "0111000110001010001100010111101110110110111110010010110001011101100101101101110001000001011001001000111110010101100000100", + "0110011111010110100001110000101010011000111100100011101111000010100000011101001111100111110111100100101000011010001110001", + "0101100000001110001001110011011000000010010001101111110111000110100101110001000100011100010100000111001011111000000100100", + "0010001011111110011000100110110010110110110000111110011100011010011110010010000100111100101100111111110001001001010000010", + "1100010100010001010111001101100101101101100101001001101000000110110110110110101010011010000010010010010101001110111100011", + "0000101000000000010111000110000100101100001010010101011001110100010110101011111001010001000001010011100110101100111111111", + "1000000101100011100100011110100101101101111100000010011110101011001000011100101001110001111001101011011110010101101111001", + "1001011000100101000011111101001001111111101011100101000011000001000101001001011111100111110111100100010010010010001110001", + "1010100011100111100001111011101011011001010011111111011100110000000000000000011100101100110100100101010011111000001100101", + "1101001100001101111010101010100001010011100111111000110100011001111011000110010100111100101100111111110011000001010101010", + "0011010110111000111111000101011110101010100111011001000001110000010011000111110010101010100010110001111101001110110010010", + "1111101110010011110101001011111111011111011101010011110001110111110011111111101001010001000001010011110100100100111001111", + "0111000111001010001100010110000110100000111110010010110011011101101101101101110001000001011001001001000110010101100001000", + "0110011111110110100001110001111010000000111100100011101111000010100000011101001111100111110111100101010000011010001111001", + "0101100001001110001001110011101000000100010001101111110011000110100101110001000100011100010100000110110011111000000100100", + "0011001011111110011000100110010010101010110000111110011010011011011110010010000100111100101100111111001001001001010100010", + "1110010100110001010111001101011101110011100101001001101010000110010110110110101010011010000010010011100101001110111010011", + "0010111111000000010111000111111110101110001010010101011111111100010110101101111001011111111001010010000110101100111111111", + "1011100011100011100100011110100011101001111100000010011110001010101000011110101001101000100001101010111110010101100011001", + "1011101011000101000101111101101011101001101011100101000010101000000101001011011111101010101111100101010010010010101011001", + "1011100011100111100001111010100011001101010011111111011010001001000000000100011100111000100100100100110011111001100010101", + "1101111110101101111000101010111111011011100111111000110111111001111011000100010100111111101100111110001011000001111110010", + "0001010110111000111011000100111010110010100111011001000111000000110011000111110010110111100010110000000101001110001110010", + "1111101001110011110011001010001001000111011101010011110101000110010011111111101001011100000001010011100100100101100101111", + "0101000010001010001010010110110010101000111110010010110100011100001101101101110001000100111001001001011110010101010101000", + "0111011101110110100101110000111100011000111101100011101100000011100000011011001111101010001111100101010000011011011011001", + "0101100000001110001011110010001100000100010000001111110001110111100101110011000100000001001100000110110011111000111000100", + "0000001100011110011110100111100100101010110000001110011000101011011110010000000100110001110100111110001001001000001000010", + "1101010001010001010011001101101001111011100100011001101111000111110110110010101010011111110010010010000101001110001110011", + "0000101011000000010011000110001010100110001010000101011010110100010110101001111001011100111001010011100110101101101101111", + "1010000101100011100000011111100001100001111101100010011100011011101000011100101001111100100001101011011110010101010101001", + "1001011111000101000101111100111111110001101011110101000011110000100101001001011111110010101111100101010010010011010011001", + "1000100111100111100111111011011111001101010010100111011001110001100000000000011100110001000100100100110011111000111000101", + "1100001110101101110110101011100111001011100110101000110111011000111011000100010100101001010100111110001011000110000000010", + "0011010110111000101101000100111010111010100110101001000111000001010011000001110010110111111010110000000101001000001110010", + "1100101001110011101011001010001001000111011101101011110101000110110011111010101001011100011001010011100100100011100101111", + "0101000010001010010000010110110010100000111111010010110100011100001101101010110001000100101001001001011110010001010101000", + "0110011101110110111101110000111100010000111100110011101100000010000000011111101111101010001111100101010000011010111011001", + "0100100000001110010101110010001100001100010000000111110001110011100101110111100100010001001100000110110011111001111000100", + "0001001100011110001100100111100100101010110000101110011000101111011110010000000100101001110100111110001001001000101000010", + "1110010001010001000101001101101001111011100100010001101111000011010110110100001010000111110010010010000101001110001110011", + "0000101011000000011001000110001010100110001010100101011010110110110110101000011000100100111001010011100110101011101101111", + "1001000101100011110110011111100001100001111100110010011100011110001000011011001000011100100001101011011110010011010101001", + "1010011111000101011111111100111111110001101011111101000011110000000101001010011110010010101111100101010010010101010011001", + "1000100111100111111011111011011111001101010010111111011001110111100000000010111101110001000100100100110011111100111000101", + "1101111110101101100100101011111110101011100110001000110111111001011011000100010100101111110100111110001011000011111110010", + "0010100010111000100101000101100010011010100111110001000110001101010011000001010010111000111010110000000101001010100010010", + "1100101011110011100001001010101010100111011101001011110010101010110011111101101001011010111101010011100100100001101011111", + "0101100010001010011110010110100011000000111111010010110010001000001101101111010001001000101111001001011110010010100011000", + "0110111111110110110111110000111110110000111101011011101011111000000000011110101110011111101001100101010000011100111111001", + "0100100010001110010011110011001011001100010001000111110110110011100101110110100101101100101010000110110011111111001100100", + "0001001100011110010100100110000001001010110000100110011010011011011110010001000101001100110100111110001001001110110100010", + "1110010111010001001101001101011110011011100100001001101101110001010110110100001011011010110010010010000101001010010010011", + "1000101111000000001001000111111111000110001011101101011101110000110110101001111000100001011001010101100110101010011001111", + "0101000111100011100110011110100111000001111100101010011011011000001000011010001000000001000001101101011110010011000001001", + "0010011111001101000111111101011010010001101011111101000001000010000101001011111110010111101011100011010010010100001111001", + "0000100001111111110011111011101000101101010010111111011011000101100000000010011101101100000010100000110011111100000100101", + "0101001010111101100100101010010011101011100110000000110000011101011011000101010101001100110010111110001011000110010100010", + "0110010100100000111101000101111101111010100111110001000000000011010011000001110011011010011100110000000101001001111010010", + "0000101001110011110001001011101100100111011101001011110111110000110011111101001000100001011101010011100110100011111001111", + "1101000100010010011110010110000101000000111111010010110110101100001101101111110000000001101111001001011100010001101001000", + "1110011001110110111111110001001001110000111101011011111011000110000000011110001110010111101001100011010000011101001111001", + "1000100010000110001011110011001011101100010001000111110110110101100101110111000101101100101010000000110011111111001100100", + "1001001100010110011100100110000000101011010000100110000010011101011110010000100101001100110000111000001001001110010100010", + "0110010111000001000101001101011110011011000100001001111101110111010110110100101011011010110100010110000101001010110010011", + "1000101111011000001001000111111110000110101011101101001101110000110110101000111000100001011111010101100110101011111001111", + "1101000111100011100110011110100110000001111100101010001011011000001000011010101000000001000111101101011110010010100001001", + "0110011111000101000111111101011010010000101011111101010001000110000101001011111110010111101011100011010110010101001111001", + "0000100001111111110011111011101001001101110010111111001011000001100000000010011101101100000010100100110101111100000100101", + "1001001010101101100100101100010011101011100110000000100000011101011011000101010101001100110010111000001101000110010100010", + "0010010100110000111101000011111101011011000111110001000000000011010011000001110011011010011100110110000011001001111010010", + "1101011001111011110001001111101100100110011101001011101111110000110101111101001000100001011101010101100100100011111001111", + "1011110100011010011110010010000100100000111111010010100110101100001111101111110000000001101111001101011110010001101001000", + "0111001001101110111111110111111110110000111101011011111011111110000010011110001110011111101001100011010000011101111111001", + "0000000010001110001011110100100011101100010001000111100110001101100111110111000101101000101010000000110011111110100010100", + "1111111010000110011100111110101011001011110000100110001010101101011101010000100101001010110000111000001101001110101010010", + "1000001001001001000101001101100011111011000100001001111110001111010100010100101011001000110100010110000011001011100010011", + "1011101001001000001001010001111110000110001011101101000111111000110111001000111000101111111111010101100000101011111111111", + "1011101011111011100110010001110010000000011100101010010110011000001111111010101000001100100111101101011000010011010101001", + "1011101011011101000111101000111100010000101011111101010110000110000011101011111110000010001011100011010110010101111011010", + "1000001001111111110011111110001101001101010010111111011101110001100101100010011101100001000010100000110101111100011000100", + "1111111000100101100100101100100101101011100110000000111100101101011101000101010101011001110010111000001101000110101000011" + ], + "3": [ + "1111111000111101001001001110000010001101001111100010011001011100011111110101011000001010100111110101011000001011001111111", + "1000001010101100001001000111110000001101010010111011110001101000101011100011010110000100001011110010010110000010101000001", + "1011101011001101000001110011101101000001000100101010101101100110000010100000110101100101000010111000110101100101101011101", + "1011101000010000010101001100110011011000010001101101101101110100010101011000001101011111110010100000001101011111101011101", + "1011101001100110010110010101111111010110010100011001000011111111000101010110000011011111111100101110000011010001001011101", + "1000001000011010111111110000100010111011100100000101000110001110011100100101100000101000111101000101100000110111001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001111011101111011101100011110111110010111100011010001000110101001110000011001000110100001110000011010111000000000", + "0111011001111101100000110001111110110101111100001000000011111001111000101101100000101111111110101101100000110100100000110", + "0100100100111101001101010110001010001101001111100010011000100100011110010101011000001010100110010101011000001100010000101", + "0011101110101100001001010111110000001101010010111011110110000000101010000011010110000100001010010010010110000010011100101", + "0000000001001101000001100011100101000001000100101010101101011110000011100000110101100101000011111001010101100001111111001", + "1110111110010000010101010100111011011000010001101101101010001100010101011000001101011111110010100001101101011001001111010", + "1111100101100110010110001101010001010110010101111001000010000111000101010110000011010001111100101111100011010111001010010", + "0101001000011010111111111001011110111011100101101101000001011110011100100101100000110010111101000101100000110100101011111", + "1101100110100000110100010110001000101100101000100111000000011011101110010101011000001000101111010101011000001100010011000", + "0101111111001011010110000111101000000011001011111110110000111111001110011011010110000100101000011011010110000100010101001", + "1001000001010000100000110011100111100000100010110111110101011001110011111000110101100111001011111000110101100111111101000", + "1000111101110111010010001100101011010110001001100001101101010011110001001000001101011111010001001001001101011111000111110", + "0110110001111011110111010101010011110111110010011100011011100000110101001110000011010011110101001111100011010011001001111", + "0011011011111101111000111001010110110101111101001001100110101001111000101101100000110010011111001100000000110100100010111", + "0100110010111101001101010110001010001101010111011010011001110100011110010101011000001010100111110100111000001100010001001", + "0011111100101100001001001111101000001101001010111010110110101000101010010011010110000100001011110011010110000010011101001", + "0000010111001101011001111011100101000001000100101010001100110110000011111000110101100101000010111000110101100001111110101", + "1110111110010000000101011100110011011000010000100100001011000100010101000000001101011111110011000000001101011111001110010", + "1111110001100110000110000101010001010110000100000000000010101111000101001110000011010001111101001110000011010001001011110", + "0101101010011010110111100001000110110011110100001101100000111110011100100101100000110010111100100100100000110010101010011", + "1101000010100000101100001110001000110100101001000110100001011011101110010101011000001000101110010100111000001000010010100", + "0101111111001011011110001111111110010011001011111111110011111111001110011011010111101111101000011010110110000010111110001", + "1001100011010000111000111011100011111000111010110111010010001001110011111000110100001000101011111001010101100000100010100", + "1000101011110111001010010100101011000110010001100001101010101011110001001001001100101010110001001001001101011000101010010", + "0110100011111011110111001100100011100111110010011100111010001000110101001111100010011000110101001111100011010110100010011", + "0011111111111111101000110001111110101101111101001001100011111001111000101100000000111111111110101100000000110010111111111", + "0100110110111001010101011110111010011101011111011011011001000100011110010100111000001111100110010100111000001011101111001", + "0011111000101110010001011110110000011101000010111011010010101000101010010011010110011001101010010010010000000100001010001", + "0000110011001111000001111011011111011001000100101011001000111110000011111000110101100011100011111001010001100100001010101", + "1110001010010000000101000101101001001000010000100100101011011100010101000000001100100001010011000001101011011011010011010", + "1111100101100010001110010101100001000110001100000001100010011111000101001110000010110101011101001111100101010010110100010", + "0101001110011010100111101000011110101011111100001100000100011111111100100100100001001110111100100100100000110000111101111", + "1101010110100000101100010110111010111100101001000111100101010011001110010100111001001111001110010100111000001011100111000", + "0101011001001001011110011110111010011011001011111111010000000110001110011010110110011011110000011010110110000100001001001", + "1001010011010100111000100011000111110000110010110110110100101001100011111001010101100010010011111001010101100110000010100", + "1010101011110101001010000101010011000110011001100000001001110011001001001000001101000010101001001001001001011111010000010", + "0101000101111001110111001101100001101111110010011101111110001000100101001110000011010101000101001111100101010010111100011", + "0001101111111101101000101001000100100101101101001001000110110000000000101101100001001100111110101100000110110010111111111", + "0101110110111001010101001110001010011101011111011010111001000101101110010101011001101110000110010100111110001011101111001", + "0011111000110100010001011110101000011101010010111011010010101001100010010010010111111000001010010010010110000100001011001", + "0011110011011101000001111011010111010001010100101010001000111111101011111001010100100010100011111001010101100100001010101", + "1111001010000010000101000100001001000000010000100100101011011100110101000001101100100000101011000001101100111111010010010", + "1110100101111010001110010100010001000110011100000001100010011111110101001111100010110100100101001111100010110000110100010", + "0101001110010000100111101000111110101011111100001101100100011110100100100100100001001111000100100100100101010010111101111", + "1111010110100010101100010110011010110100100001000111100101010011111110010100111001001110011110010100111111001001100111000", + "0111011001000011011110011110110010010101001011111111110000000110110110011010110111111010001000011010110000000100001001001", + "1000010011000100111000100011000111110010101010110111010100101000000011111001010100000011101011111001010011100110000010100", + "1000101011111111001010000101110011011110010001100000001001110010111001001001001100100011010001001001001101011111010110010", + "0101000101111011110111001101100001100001111010011100111110001001011101001111100010010101010101001111100011010010111110011", + "0010111111101101101000101001111110100101111101001001000111111001011000101100000001001111100110101100000001010010111111111", + "0101100010101011010101001111100010001011000111011010111110001100101110010100111001111000111110010100111001101011100011001", + "0011101010100110010001011110101010000111101010111011010010101000010010010010010111111010110010010010010011100100101011001", + "0010100011001011000001111010100011010100001100101010001110001110010011111001010100101000110011111001010010100101100010101", + "1100111110011110000101000101111111001110110000100100110111111101101101000001110100101111101011000001101011011111111110010", + "1110010001110110001110010100110011010100111100000001111010000110110101001111111010100010000101001111100101010000001100010", + "0101011010010010100111101000100110110010011100001101110000101111010100100100111101000011100100100100100100110011100001111", + "1110100010100010101100010110110010111011100001000111101011110010000110010100101111011011011110010100111110001001010001000", + "0100001100111101011110011111000000010011001011111111110000001111111110011010110001110101010000011010110001100101011101001", + "1000100110000000111000100011000101100111101010110111001000110001000011111001010010010100110011111001010010000110111110100", + "1000111111011111001010000100101011011101110001100000010101000011001001001001001100101110001001001001001000100110001110010", + "0100110000111001110111001100001001100011111010011100110110101001100101001111100010000000000101001111100100000010001110011", + "0001111011010011101000101000110110100011011101001001011000111000110000101100011001000011100110101100000111010011101101111", + "0101000010101101010101001111101000001110100111011010100001011100001110010100100001111001011110010100111111101011010101001", + "0011101101000100010001011110010000000100101010111011000110011000001100010010001011110101010010010010010011000101010011001", + "0010000110101111000001111011011111010110001100101010000110011111000111111001000010110110110011111001010010000100111100101", + "1110011111100110000101000100011011001000010000100100101011010011011111000001101010101110001011000001101010111110000110010", + "1110010000110110001110010010010011010001011100000001111110000111010011001111100100100010000101001111100100110000001000010", + "0101011010101010100111101111100110110000011100001101111000101010111000100100100001000011100100100100100101000011100011111", + "1111100011110010101100010110110010111000100001000111101101110100101000010100111001011011011110010100111111010001010101000", + "0101001101100101011110011000000000010001101011111111101110001100000110011010101111110101010000011010110001111101011011001", + "1000100111011000111000100000100101100111001010110111001100110001100101111001001100010100110011111001010010011110111000100", + "1000111110000111101010000000001011011001110001100000011101000101010001001001010000101110001001001001001000111110001000010", + "0100110000001001010111001011101001100110111010011100110000101001110101001111110100000000000101001111100100010010001010011", + "0011111010010011101000101000110110100101111101001001000110111110110110101100011111000011100110101100011111010011101011111", + "0101000011110100110101001001001000001000000111011010100101011100001110010100100111111001011110010100100111101011010011001", + "0011101100011101110001011001010000000110101010111011001110011100001110010010001011110101010110010010001011110101010101001", + "0010000110011111000001111011011111010001001100101010000000011001000101111001000010110110110101111001000010111100111000101", + "0010111110111110000101000011111110101000110000100100101111111111011101000001110010101111101101000001101010100110111110010", + "0010100011101110001110010110100010110011111100000001101010001111010011001111111100111000100011001111100100101000100010010", + "0001101011101010000111101100101010110000011100001101110110101000111100100100111101011010100100100100100101010010101011111", + "0011100011010010101100010001100011111100100001000111101010001010101110010100101111001000111110010100111111001001100011000", + "1001111110100100011110011111111110010010101011111111101011111000000000011010101001111111110000011010101001100101111111001", + "1000110010011000111000100100010111100101001010110111011100111001100011111001001010001011110011111001001010000110101100100", + "1100001010000110101010000010001001111101110101100000000101011111010101001001010000101001001101001001010000101111110100010", + "0100100101001001110111001100010000100111111110011100100010011111110011001111110100011101000011001111110100001010010010011", + "1111001111010011101000101110011111000100011111001011011100011010110000101010011111000110100000101100000111001010011001111", + "1001010111110101010101001101111011101000100101011000110001010100001000010010100111100110011000010100111111110011000001001", + "0111011001111100110001011011010010000110101110111001011110000110001010010100001011110010010010010010010011110100101111001", + "1110010010011111000001111100100110010001001100101100010100101111000011111101000010101011110011111001010010111100100100101", + "0010101010111111000101000101110011001001110010100010110001110001011011000001110010101011001011000001110010100111101100010", + "1110000100101110001110010010100001010011111000000001101010001101010101001111111100111101000101001111111100101000000010010", + "0001101111001011000111101101100100010000011110001111101000110100111100100100111101000100100000100100111101000010000001111", + "1111110111110010101100010111001011111100100101000111111001000110101110010100101111000110011000010100101111010001011001000", + "1001111001100101011110011010101001110010101111111101101010101100000000011100101001110000010110011010110001111100101111001", + "0100110010011000111000100110010110000101001110110101011100111111100011111111001010001011110101111001010010011110101100100", + "1100001010100111101010000110001001011101110101100010000101011101010101001111010000101001001101001001001000101111110100010", + "1000100100101001110111001000010000100111111010011010100010011101110011001011110100010101000011001111111100001010010010011", + "1111001111010010101000001100011110100100011111001111011100011010110000101100011111001110100000101100011111001010000001111", + "0101010111110101010101101011111010001000100011011010110001010010001000010100100111111110011000010100100111110011011001001", + "0111011001111100010001111101010010100110101000111001011110000110001010010010001011101010010110010010001011110100110111001", + "0010010010011110100000011110100110010001001000101010010100101011000011111001000010111011110101111001000010111100110100101", + "1010101010111110100100100001110011001001110100100110110001110111011011000111110010101011001101000001110010100111110100010", + "0010000100101110101110010000100001010011111000000011101010001001010101001001111100111101000011001111111100101000011010010", + "1101011111001010100110001011100100010000011000001111101000110000111000100010111101000100100000100100111101000010011001111", + "1011110111110011001101110011001010011100100001000001111001000110101000010000101111001110011000010100101111010001001001000", + "0111001001100101111110111010111110110010101001111001101011111100000110011100101001111111110110011100101001111100111111001", + "0000000010011000011110000111100010000101001110110111011110001111100101111111001010011000110101111111001010011111100010100", + "1111111000100111001010100111101011011101110011100010000010101101010001001111010000111010101101011111010000101111101010010", + "1000001010101000010000101001100010100111111110011100100010001101110101001011110100011000100011010011110100001010100010011", + "1011101001010011001101001101111110000100011001001011011011111010110110101010011111011111100000110100011111001010111111111", + "1011101011110101110111001011010011101000100011011110110001110010001110010010100111110011011000001100100111110011101101001", + "1011101011111100010000111100000000000110101010111001011010001110001110010100001011100101010110010010001011110101000011010", + "1000001010011110100010011111100100010001001110101000010100110011000101111101000010100100110101111001000010111101000000100", + "1111111000111110100011100000101011101001110000100100110011000111011101000111110010111000001101000111110010100111011000011" + ] + }, + "27": { + "0": [ + "11111110001001010100011100111100101111000011111100101001111101010110000011010110000011010110011100101001111100101001101111111", + "10000010011010110011110110101000011110100110010001100101001110010010010110010010010010010011001111100101001111100010001000001", + "10111010100100100011110111111101011001010001101110010010010011001111100011001111100101001110010010010010010010010001001011101", + "10111010111101000011110100111010111011001001110010000011010111111100101111111100101001111011010110000011010110000100001011101", + "10111010110001000101101010111000111111100100110011010110000011111001111010101001111100101111100011010110000011010011001011101", + "10000010110111011010000010110110100010000100100100010010010010001101001111100100001111101000110010010010010010010011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110000011010100011100011100011011011011011001111100010001010010010010011110010001000100101001111100101001110000000000", + "10111110011100000010001001110001111111011100001001111100101011111011010110000010110110011111101001111100101001111101101111100", + "01101001010001010100111100100100110001001011111100101001111100101110000011010111100011010110011100101001111100101000101110010", + "10111011010010110011110110010001111000101110010101100101001001100010010010010010010010000010001111100101001111100101111011001", + "00011100110100100011110111001100100001000001101100010010010100010111100101001111100101010111110010010010010010010011001110011", + "01101111011101000011110101000010000101001001110010000011001110000100101001111100101001100100110110000011010110000010010011001", + "01100001010001000001101011001001001111101100110011010110011011010001111100101001111100110001100011010110000011010111010011100", + "10111110110111011000000010010110111110001100100110010010001110010101001111100101001111100101010010010010010010010010000100110", + "00010100110000011100100011100010011001000011011011001111110011001010010010010010010010010010000101001111100101001110010001100", + "11101011001100000000001001010001111011001100001110011100101011111011010110000011010110000011001001111100101000011101100100010", + "01100001010001010100111101100100110001001011111001001001111100101110000011010110000011010110011100101001111101001000101110010", + "10011010101010110111110110110001111000101110010110000101001001100010010010010010010010000010001111100101001110000101111011001", + "01011100101100100101110110101100100001000001101011010010010100010111100101001111100101010111110010010010010011010011001110011", + "00101111001101000001110101000010000101001001110110000011010110000100101001111100101001110100110110000101010110000010010011001", + "00000001000001000101101011001001001111101100110001010110000011010001111100101001111100101001100011010000000011010111010011110", + "01011110111111011100000010010110111110010100100110010010010110010101001111100101001111111101010010010100010010010010000100110", + "00010101110000011000100011100010011001010011011011001111100011001010010010010010010010001010000101001011100101001110010001110", + "11011010100100000000001001010001111011000100001111111100101011111011010110000011010110000011010001111100101000011101100100010", + "01110001001001010100111101100100110001000011111000101001111100101110000011010110000011010110000100101001111101001000101110010", + "10011010001010110111110110110001111000101110010011100101001001100010010010010010010010000010010111110101001110000101111011001", + "01011101110100100101110110101100100001000001101000010010010100010111100101001111100101010111100010001010010010110011001110011", + "00101111001101000001110101000010000101000101110110000011010111100100101001111100101001110100110110011011010110000010010011001", + "00000001000001000101101011001001001111110010110011010110000010110001111100101001111100101001100011001110000011010111010011110", + "01011110111111011100000010010110111110010110100100010010010111110101001111100101001111111101010010010010010110010010000100101", + "00010101110000011000100011100010011001010111011011001111100010001010010010010010010010001010000101001111100011001110010001111", + "11011111100100000000001001010001111111000100001001111100101011111011010110000011010110001111101001111100101111111101111110001", + "01111000101001010100111101100101100011000011111000101001111010001110000011010110000011011000111100101001111010101001100010010", + "10011010101010100111110110110000101010101110010011100100001110101010010010010010010010011010101111100101001111100100101011001", + "01011000110100110101110110101101100011000111101000010011110110001111100101001111100101011000110010010010010010010011100010011", + "00101111101101011001110101000011111111000101110110000010110011111100101001111100101001101111110110000011010110000011111111001", + "00001000100001010101101011001001011011110010110011010111100101111001111100101001111100110011000011010110000011010111000101100", + "01010011011111001100000000010111010000010110100100010010010100101101001111100101001111110110010010010010010010010011101000110", + "00011000010000010000100101100010111101010111011011001111100011100010010010010010010010011010000101001111100101001110111111100", + "11011111100100011000001101010000000111000100001001111100101000010011010110000011001110000111101001111100101001111100001100010", + "01111101001001010100111011100101000001000011111000101001111010000110000011010110011011001100111100101001111100101000010010010", + "10010011001010101111110110110000101010101000010011100101001011010010010010010010001010001001101111100101001111100100110011001", + "01011100110100110101110110101101011111000101101000010010010000010111100101001111110101010101010010010010010010010011000100011", + "00100111101101011001110011000101111111000111110110000011010111001100101000011100101001111010010110000011010110000011110001001", + "00001000100001010101101111001111011101110010110011010110000101111001111101001001111100110011000011010110000011010111000101100", + "01010011011111001100000110010101010010010110100100010010010100101101001110000101001111110110010010010010010010010010101010110", + "00011000010000010000100111100001111111010011011011001111100011100010010011010010010010011010000101001111100101001111011101100", + "11011111100100011000011011010101000111000110001001111100101000010101010110000011010110000111101001111100101001111101101000010", + "01111101001001010100100111100110000101000101111000101001111010000000000011010110000011001100111100101001111100101001010100010", + "10010011001010101111101110110100001010101100010011100101001011010101010010010010010010001001101111100101001111100100110011001", + "01011100110100101101111110101001111111000011101000010010010000010010000101001111100101010101010010010010010010010011000100011", + "00100111101101010001111011000101111111000111110110000011010111001101001001111100101001111010010110000011010110000011110001001", + "00001000100001110101100111001111011101110010110011010110000101111000011100101001111100110011000011010110000011010111100101100", + "01010011011110001100001100010101010010010110100100010010010100101101001111110101001111110110010010010010010010010010001110110", + "00011000010000001000111101100001111111010011011011001111100011100010010010001010010010011010000101001111100101001110111011100", + "11011111100101011000011001010011100101000110001001111100101000010011010110011011010110000111101001111100101001111100001110010", + "01111101001001101100100101100001000001000101111000101001111010000110000011001110000011001100111100101001111100101000010010010", + "10010011001010001111101010110011001100101100010011100101001011010010010010010010010110001001101111100101001111100100110011001", + "01011100110100001101111110101101111111000010101000010010010000010111100101001111100011010101010010010010010010010011000100011", + "00101111101101010001100011000101111111000110010110000011010111111100101001111100101111111111110110000011010110000011111111001", + "00001000100001110101100001001101100011110010110011010110000010001001111100101001111010101000100011010110000011010111100011100", + "01011010111110001100001100010111101010010110000100010010010110101101001111100101001111111010110010010010010010010011101010110", + "00011000110000001000101101100000100011010010111011001111100110001010010010010010010010011000100101001111100101001111100011100", + "11011111100100111000001001010111111111000111001001111010101111111011010110000011010110011111101001111100101001111010111110010", + "01110101101001001100111101100101011011000101011000101111111111001110000011010110000011010010011100101001111100101110010000010", + "10011010101010001111100010110110011010101100010011100011001011111010010010010010010010001011001111100101001111100011000101001", + "01010001010101101101101110101010010001000010101000010110010110101111100101001111100101011110010010010010010010010110001110011", + "00101010001101110001100011000100111111000111010110000011010011100100101001111100101001101010010110000011001110000010011011001", + "00001101100000110101110001001100100101110011010011010110000010010001111100101001111100100111100011010110011011010111101111100", + "01011111011110001100011100010110001000010110000100010010010100000101001111100101001111110100110010010010001010010010110010110", + "00010001010001001000101101100000011101010010111011001111100001010010010010010010010010000001100101001111110101001111110011100", + "11011110100100011000001001010110110111000111001001111100101100010011010110000011010110010101001000011100101001111101000100010", + "01110101101001101100111101100101001011000101011000101001111111001110000011010110000011010010011101001001111100101000010000010", + "10011010101011001111100010110110001010101101010011100101001011111010010010010010010010001011001010000101001111111111000101001", + "01010001010101101101101110101010011001000011101000010010010110101111100101001111100101011110010101010010010010000000001110011", + "00101010001101110001100011000100110111000111100110000011010011100100101001111100101001101010010000000011010110011010011011001", + "00001101100000110101110001001100101101110011110011010110000010010001111100101001111100100111100101010110000011001111101111100", + "01011111011110001100011100010110001000010110101100010010010100000101001111100101001111110100110010010011010010010010110010110", + "00010001010001001000101101100000011101010011000011001111100001010010010010010010010010000001100101001110000101001111110011100", + "11011110100100011000001001010110110111100110000001111100101100010011010110000011010110010101001001111101001001111101000100010", + "01110101101001101100111101100101001011000100010000101001111111001110000011010110000011010010011100101000011100101000010000010", + "10011010101011001111100010110110010011101101001011110101001011111010010010010010010010001011001111100101001111110101000101001", + "01010001010001101101101110101010010000100011100000001010010110101111100101001111100101011110010010010010010010001010010110011", + "00101010001111110001100011000100110111100111100110011011010011100100101001111100101001101010010110000011010110011010000011001", + "00001101100110110101110001001100110101010011110011001110000010010001111100101001111100100111100011010110000011001111110110000", + "01011111011000001100111100010110011001110110101100010010010100000101001111100101001111110100110010010010010010010010100011010", + "00010001010111001000101101100000010100110011000011001111100001010010010010010010010010000001100101001111100101001111110010000", + "11011111100110011000101001010110111111100110001001111100101111111011010110000011010111111111101001111100101001111101111111010", + "01111000101011101100011101100101100011000100011000101001111110001110000011010110000010111000111100101001111100101000100010010", + "10011010101001001111100010110111101011101101010011100101001110101010010010010010010011111010101111100101001111100100101011001", + "01011000110111101101101110110010100010100011100000010010010010001111100101001111100100011000110010010010010010010010100010011", + "00101111101111110001100011000100111111100111101110000011010011111100101001111010101001101111110110000011010110000011111111001", + "00001100100010110101010001011100010111010011101011010110000000000001111100101111111100100101000011010110000011010110000101000", + "01010111111000001101111100010110000010010110101100010010010011010101001111100011001111101010010010010010010010010010010001110", + "00011000110111001001101101100001011011010011000011001111100001100010010010010110010010001011000101001111100101001110100101000", + "11010011000110011001101000100111010001100110010001111100101010110011001110000011010110010110001001111100101001111101011111110", + "01111000001011101101011100000100010110100100010000101001111001100110011011010110000011011010011100101001111100101001110010010", + "10011111101111001111100011110110011101101101000011100101001010010010001010010010010010010111101111100101001111100101100111001", + "01011101010011101101101111100011111001000011111000010010010000000111110101001111100101010100110010010010010010010010011010011", + "01100011001001110101100010100100010100100111101110000011010011010100101001111100101001111001110110000011010110000010110011001", + "01001100100100110111010000000100010110010011101011010110000000010001111100101001111100100101000011010110000011010110000101100", + "10110111111100001111111101110110000010010110101100010010010011001101001011100101001111101010010010010010010010010010010000110", + "10011000110111001101001101100001011011010011000011001111100011111010010100010010010010001011000101001111100101001110100101100", + "01000011011100011100101000100111010001100110010001111100101000101011010000000011010110010110001001111100101001111101001110010", + "01001000000011101111111100000100010110100100010000101001111111100110000101010110000011011010011100101001111100101001111010010", + "10101111111111001111100011111110011101111101000011100101001100010010010010010011010010010111101111100101001111100101101111001", + "10001101010011101100101111100011111001000011111000010010010100000111100101001110000101010100110010010010010010010010010010011", + "01110011011001110100000010001100010100101111101110000011010011010100101001111101001001111001110110000011010110000010110011001", + "01111100100100110111010000101100010110010011101011010110000000010001111100101000011100100101000011010110000011010110000101100", + "10101011111100001111111100110110000010000110101110010010010011001101001111100101001111101010010010010010010010010010010000110", + "10001000110111001101001100000001011011010011000111001111100011111010010010010010010010001011000101001111100101001110100101100", + "10110111011100011010101001101111010001110110010101111100110000101011010110000011010110010110001001111100101001111101001110010", + "10111100000011101101111100100100010110111100010110101001100111100110000011010110000011011010011100101001111100101001111010010", + "01001111111111001101100011111110011101100101000111100101010100010010010010010010010010010111101111100101001111100101101111001", + "10101101010011101110101111100011111001010011111010010010000100000111100101001111100101010100110010010010010010010010010010011", + "10000011000001110010000010101100111110110111101111100011010011111100101001111100101001111111110110000011010111100010111111001", + "00000000101100110011010000001100100010011011101010110110000010001001111100101001111100101000100011010110000010110111100011100", + "11111110011100001101111101010110101010000110101111110010010010101101001111100101001111101010110010010010010011110010101010110", + "10000010111111001101001100000000100011010011000010001111100110001010010010010010010010011000100101001111100100001110100011100", + "10111010110100011100101001101110111111110110010111111100101011111011010110000011010110001111101001111010101001111100111110010", + "10111010100011101001111100100100110100111100010010101001111011010110000011010110000011001001111100101111111100101000010010010", + "10111010111111001101100011111110110111110101000111100101001010010010010010010010010010010100001111100011001011100101100101010", + "10000010001011101100101111100010000011000011111010010010010101001111100101001111100101001011110010010110010010010010110000010", + "11111110111001110010000010101100011010110111101110000011010001111100101001111100101001111100101110000011010110000011100101000" + ], + "1": [ + "11111110100110100100110111010001100010101110011101010001111100101001111101010001100010101110011101010001100010101001101111111", + "10000010011111000000001100100011100001000101111100110010111001000011111100110010100001010101111000110010100001000110001000001", + "10111010100111000111101110010001011001010101001110001000101001010001001110001000111001001101001000001000111001010001001011101", + "10111010100111010001011110011011010110011011001000000100110111111011001000000100110111100011010111100100110111111100001011101", + "10111010110000010001010111111000111111111000101011100111010111111000101011100111010100001111110100000111010100011111001011101", + "10000010010010110000110111011001100011001000010001011110001010001000010001011111001100101000101000111111001100101011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001010101101100111100001100011111000100011100100110110001000100011100101010100101000110010100101010100111001100000000", + "11110010111100000010111001011111111110100000010011011110001011111110001011011111101100101111101011011111101100100001010011101", + "01101101000110100110110001010000000010101110011101010000000100101000000101010001100010101110000101010001100010101111001111110", + "11100110111111010000001010100011100001000101111100110010100111000011100100110010100101001101100100110010100001000100101100011", + "11000000100101010111101010010001011001010101001110001000111111010001011110001000111111010101011110001000111001010100010100100", + "10100111100011011001011010011101010110011101001000000100110011111101001000000100110001100011010001100010110111111010010010001", + "11101000010010000001000111111110110101111110101011100111010010011110101011100111010010000000110010000001010100011001100101000", + "01100110010110110101100111001110001101001110010001001110001010101110010001011111001100111000001000111001001100111001011111110", + "10100000111010011100010001001010000011001010010101001010000100001010010101010011100010010110000100010111100010010110010001111", + "00011111010001101111100100101011100000101101111110101011100101001011100111010010000001010011100111010010000001010101010010111", + "01110101011001111101011010010011011000010101000110010011011111110011011111101010111001101011011111101010111001101101110000101", + "10000011001101100110101100010101010110010011001010000101010001110101010011100101010011100101010011100100010111110011111100101", + "10001100001010111010111111111100110101111000100011100100110010111100110010100100110010100100110010100101010100111001110111001", + "11111010100110000010001001000110001101000110001011011110001001000110001011011110001010111000001010111001110100100001000111010", + "00101000000010110110000001001000000011001000000101010000000101001000000101010000000100110110000100110111111010101111010011110", + "10111011110011010000011010100011100000100011100000100011100110100011100100110010100101010101100101010100111101010100110010011", + "01100101101001001111010010010001011000010001011000010001011110010001011110001000111111001101011111001100101111001101001010100", + "00101011101111001001010010011101001110011101001110011101010011111101010001100010110001100101010001100010110001100011100100001", + "10011100111100010000110111111110101101111110101101111110110010011110110010000001010010000110110010000001010010000000000100111", + "11010110010110111101110111001110010001001110010001001110001010101110001000101000001000111110001000111001001100111000111110011", + "10111100100100010100001001001010010101001010010101001010000100001010000100001110000100010010000100010111100010010110010000001", + "10011111001011111111100100101011100110101011100111001011100100101011100111001011100111010011100111010100011000110101010011110", + "11110001011001011101011010010011011110010011011111110011011110010011011111110011011111101011011111101100100000001101101000101", + "00001111000111000110101100010101010110010100010111110101010000000101010011100101010011100101010011100011001010000011100100101", + "00001000000000100010111111111100110101111101010100111100110011100100110010100100110010100100110010100000100011100000100111001", + "11111111110000010010001001000110111111000111101101000110001011111110001010111000010010111111101010111000010010111000111111010", + "00101000101101100110000001001000100011001001100011001000000010001000000100110110011100111000100100110110011100110111100010000", + "10111010111001110000011010100010101010100011100000100011100010101011100001000101111101001010100101010100111101010100101011100", + "01101000111101001111010010010001100010010001011000010001011110001001011001010101001111001000111111001100101111001100100011011", + "00101111111011001111010110011101111110011101010111111011010011111101010111111011010001101111110001100010101000000101111111010", + "10011101010010110010110111111110111001111110110100011000110010110110110100011000110010000011110010000001001011100111110010100", + "11010011011100011101110011001111100001011111001100101000001100001110001000101000001000100011001000101000010001011111101000110", + "10111101000110010010001111001010001011010011100010001110000000010010000100001110000100010100000100001110010101010011000101011", + "10011010001101111101100001001010000010110010000001001011100001111011100111001101111110101101000111001101111110110101000110011", + "11110000110110111011011111110011010010001010111001110011011111000011011111110101000110001111111111110101000110001100011111011", + "00001010010111000101101101110100111100010100010111110101010111001100010111110011001010011001110011100011001010000010110011010", + "00001001111000100101011000111100111101111101010100111100110110110101010100111000100011100011110010100000100011100001110010110", + "11110111100000010101000011000111101111000111101100100000010100001111101100100000010010100001010010111000010011011110101010001", + "00101001101101100101010001001000001001001001100010101110011100000001100010101110011100110101011100110110011101010001000100000", + "10001110100001010000001110100010101010110010100001000101111001100011100001000101111101001110111001000101111100110010000101100", + "01100100010101001000110100010001110000001000111001010101001011011001011001010101001111001111001001010101001110001000011111011", + "11011111011010101011101111111011010100000100110111111011010111010011010111111011001000011011110111111011001000000101110001010", + "01011100111011110110000010011001011111100111010100011000110010110000110100011000101011100010010100011000101011100111110010110", + "11110011001101111111010110111000100111011111001100101000001110001001001100101000010001000010101000101000010001011111101010001", + "10011100001110101010111110010110001011010011100010001110000010000111100010001110010101010100000100001110010101010011000110000", + "10111010101100000101001111010010000011010010000001001101111111100010000001001101111110101101011110101101111110110011000111100", + "01010001110110010100101011101011010011101010111001110101000001011010111001110101000110001111100110010101000110001010011111011", + "00001010010110100100111111110100011101100100010111110010001011010100010111110011001010010001101110010011001010000100110011010", + "11011001011000000001011010111100011100100101010100111001000110110101010100111000100011101010100101111000100011100101110010110", + "00000111100001101000110001000000001111011111101100100001110100001001110100100000010011011000110100100000010011011110101010001", + "11000001001101011000110101001111101001010001100010101111111100000111111010101110011101001100111010101110011101010001000100000", + "10011011100010010100111000110101101010110010100001000101111011100100111001000101111000111111011001000101111100110010011001100", + "01000001110001101001100110001101110000001000111001010101001001011100101001010101001000001111001001010101001110001000000001011", + "00001111111010110011111011100011111111100010110111111011001011111010110111111011001110011111101110011101001000000101111111010", + "00111000111001101111011010000000100010000001010100011000101010001001010100011000101101111000101101111110101011100111100010110", + "11011010101101111001101100111000101010111001001100111001010010101001001100101000010001001010110101001110010001001110101010001", + "01101000101010110011010100010111100010010111100010010111110010001111100010001110010101011000110011001010010101001010100010000", + "00101111101100000100111100110101111111010010000001010100011111111100011000101101111110101111111000101101111110101010111111100", + "01010101010000000011011110001101001111101010111001101100100100001100100000010101000110001000100000010101000110010010110101011", + "10001110110000100010100110000011101001100100010111110010001010000010001110010010001110001100101110010011001010000100110011010", + "01010000111100000101101011100000001010100101010100111001000001100001000101111001000101101111000101111000100011100101000100110", + "01101110111001101001010000011000110000111001110100100001110001011001110100100001110101010111010101000110001011011110011110001", + "01001100101111011000000101010110010100110111111010101111111111010111111010101111111011010011111011001000000101010000010000000", + "01110111111000001100010001110101011111010100111101010100111100110100111001000101111000111010011000100011100000100011110011100", + "11110100011001111000000111101101100111001100101111001100101100001100101001010101001000000010101000010001011000010001010101011", + "10111010110010110010001010000011101011100010110001100010101010000010101110011101001110001100001110011101001110011100011011010", + "11111000000101100110110010100000100010000001010010000001001001100001001101111110101101100101001101111110101101111111011001000", + "00010111111011100001111100111000110010111001001100111001010001011001010101011111010101010001110101001110010001001111101001101", + "00100101110010100011011100110110111100010111100010010111110111010111110011010011110011011111110011001010010101001011110111110", + "00000010010101000100111100110101011101010100011000110100011100110100011000110100011000111100111000101011100111001011110100100", + "10011101110101001011011111001101001111101100100000001100100100001100100000001100100000001100100000010011011111110011001101011", + "11000010101011011010100111100011101001100011001010000010001011100010001110010010001110001100101110010100010111110101011011010", + "10011101010011010101101010000000001010100000100011100001000000000001000101111001000101101111000101111101010100111100111000110", + "01100111101000101001010001011000110000111000010010111001110000111001110101000111101101010111010101000111101101000110000000001", + "01001000110011110000000100010110010100110110011100110111111110010111111011001001100011010011111011001001100011001000001111110", + "01110010010100101100010101010101000111010100111101010100111100110100111100110010100000111100011000100011100000100011100100011", + "11110100101110011000000001101101111111001100101111001100101100001100101110001000111000000100101000010001011000010001010100100", + "10110110101011110110001110000011110111100010101000000100101010000010101000000100101110001010001110011101010111111011011010001", + "11111100001100100110110110100000110100000001001011100111001001100001001011100111001101100001001101111110110100011000111000010", + "00011111110000000101111110111000110100101000010001011111010000111001010101011111010101010001110101011111001100101000001001001", + "00101101110101100111011110110110111010001110010101010011110110110111110011010011110011011111110011010011100010001110001111000", + "00001111100101000000111000110101111111001101111110110100011111111100011000110010000001011111111000110010000001001011111110000", + "10011000100000101011011111001100100011110101000110001100100010001100100000001010111001111000100000001010111001110011100010101", + "11001010110010011000100001100010101011100011001010000010001110101011001010000100010111111010101110010100010111110100101010101", + "10011000101011110011101110000000100010100000100011100001000110001000100011100101010100101000100101111101010100111100100011001", + "01101111101001001100010001011000111110111000010011011111101011111000010011011111101101011111101101000111101100100000111111010", + "01000100111011110000011110010111001010110110011101010001100001110110011101010001100011000010000011001001100010101110011011110", + "01101110000100001001110011010101000011000101111100110010100100111100111100110010100000111001000100110010100001000100011000011", + "11101101100110011100011101101100001011010101001110001000111010100100101110001000111000011001111110001000111001010101001000100", + "11101111110011010110110110000100100101111011001000000100101010101100101000000100110111111111101000000100110111111010101110001", + "11100000001100000111011010100111100000011000101011100111001111010111001011100111010100010101101011100111010100011000101101000", + "11010011101001111011001010101110111000101000010001011111010001001110010001011111001100110101010101011111001100101001110101110", + "10010100111101101101111000101011110110001110010101010011110001100010010101010011100010000011010011010011100010001110010011111", + "10111011000101101111111101101100110100101101111110110010000100000101111110110010000001001000100001010010000001001100011000111", + "01101101100001110100000100110101101100010101000110001010111010101101000110001010111001111001011001101010111001110101000000101", + "11101010110010100111000001000010000010010011001010000101010010001011001010000100010111101111110011100100010111110010101110101", + "00100000001011010111110111100000100001111000100011100100110101001000100011100101010100110100010010100101010100111000100101001", + "00000110101000000111101110011111111000100000010011011110001011110110001011011111101100100100101011011111101100100001110101010", + "01100100111010111011101011110001010110101110011101010000000111110000000101010001100010100011000101010001100010101110011011110", + "10111110000110011100100111100011010101000101111100110010100010111011100100110010100101011000100100110010100001000100011000011", + "01001100000000111010100010110000101101010101001110001000111110100001011110001000111111010000011110001000111001010101001000100", + "00001110010101001101000101011100000010011101001000000100110010101101001000000100110001110110010001100010110111111010101000001", + "00000000101010000101111101011110000001111110101011100111010111000110101011100111010010001101110010000001010100011000101001000", + "00110011101011111000101010001111011001001110010001001110001001010110010001011111001100101101001000111001001100111001010101110", + "10010101111001100000010001001010110111001010010101001010000011111010010101010011100010010011000100010111100010010110010011111", + "00101010000001101010101011101010110100101101111110101011100110011011100111010010000001001000100111010010000001010100011000111", + "01111101100111100001101000110011101100010101000110010011011100101011011111101010111001111000011111101010111001101101000000101", + "01001110110000101011110001010100000010010011001010000101010100001101010011100101010011101110010011100100010111110010101110101", + "10101101001101010110111111011100000001111000100011100100110001001100110010100100110010111101110010100101010100111000100101001", + "10000010000100010111000110100111111111000110001011011110001011111110001011011110001010101111101010111001110100100001111111010", + "00000000100000110010110011001000100011001000000101010000000110001000000101010000000100111000100100110111111010101111100011110", + "11111110011110001101000110100010101010100011100000100011100010101011100100110010100101001010100101010100111101010100101010011", + "10000010000010101011010011110000100010010001011000010001011010001001011110001000111111011000111111001100101111001101100010100", + "10111010011111010100011100011100111110011101001110011101010111111101010001100010110001111111110001100010110001100010111110001", + "10111010101010011100000101011110110101111110101101111110110010011110110010000001010010000000110010000001010010000000100100100", + "10111010110011100000101011101110001101001110010001001110001000101110001000101000001000111000001000111001001100111000111110001", + "10000010111011110000001000101010000011001010010101001010000100001010000100001110000100010110000100010111100010010110110000010", + "11111110101000000010101010101011100000101011100111001011100111001011100111001011100111010101100111010100011000110101010011110" + ], + "2": [ + "11111110010001110001000111111100111010011110101100110110100100100011011100100101000011010001100011010110011100101001101111111", + "10000010000000101000110001011010011010011011101001001111000000000000101110111110100000110010100100110101111101000110001000001", + "10111010011000110000010100110011010111010100101101110000111000011000011010101110111000001000111110001101001111010001001011101", + "10111010011011110110100000101111010000100001000000011100001111111110010101011101010110000100101000000011001001111100001011101", + "10111010100110111111101001001101111110101000001000000101010011111101101100010001010101101111101011100000101010011111001011101", + "10000010001100110101011110110001100011111110011000100111001110001101011101010110101101001000110101011000010000101011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110100000101110001011001100010111001010110011010010010001101111111000100010101111000100101100000100010111001100000000", + "00110011100001010101111101110010111111111010010111000010010011111101001010000100101101001111101101011000010010100001011010000", + "10000101110001110001000111111100011010000110101100110110100010101011011100100101000011010001100011010110011100101111001111110", + "10011111100000101000110001011011111010011011101001001111000001110000110110111110100000110010100100110101111101000100101100011", + "10100001011000110000010100110011110111010100101101110000111111000000010010101110111000001000111110001011001111010101010100100", + "11010110011011010110100000101111110000100001000000011100001111011110010101011101010110000100101000000011001001111011110010001", + "00110100000110011111101001001100101100101000001000000101010100010101101100010001010101100111001011100000101010011000000011000", + "11111010001100110101011110110000010111111110011000100111001101101101011101010110101101011111010001011000010000101000111101110", + "01111001000010110011000111101110101100001111100000101100100101000011001001110010100011010011110101010110010100001111010101111", + "01101010001101111000010000011111000110010111110010101111011001101000100111101001000000110010000110110011111111001100110000111", + "01011100101011101010011100100111000001011101110111101101011001010000000111111110011000001010111110001011000111110100010100101", + "00011011010111111110000001101101001100101101001111111001110111000110000000001000010110000100010010000101001111110010011010101", + "11001100110100011101111111011110011010111001000000011101110011101101111111000011010101100101010011100100100100111000111001001", + "00101111000000001101111011110100101011111010011011000110010100000101001110000110001101011111110011011000010100100000101001010", + "10000000110000101001011111111010011010011110101110110011100010000011011010100111100011010001111101010110011010101110110111110", + "10010111100001011000110111011101111010010011111101001011000001100000110000111111000000110010111100110101111101000101010100011", + "10000000011001101000011110110101110111010100101011110110011110011000010010101101111000001000101110001101001111010100001100100", + "11011110111011001110100010101001110000100001000100011001001111011110010001011101110110000100110000000101001000011010000010001", + "00100001000110000111110001001010101100110000011010000001010100111101101010010001110101100111010011100110101011111001111001000", + "11000010001100100101011010110110010111110110010100100010101100011101011011010010001101011111001001011110010100001001000001110", + "01111001100010101011001101101000101100001111110110101011000101011011001001110110000011010011100101010010010010101110001111111", + "01000010101101100000011100011001000110010111110110101011111001101100100011101010100000110010011110110101111001001101000100111", + "01011001101011110010011100100001000001000101110101101000111001011100000001111101011000001010100110001101000001110101101100101", + "00100011010111101110001001101011001100100101001111111101110111010010000110001001110110000101001010000011001011110011100010101", + "11101101110100000101110011011000011010111001000000011011110011110101111111000000010101100100100011100000100010111001100001001", + "00001111100000010101110001110010111111111010011001000100010111111101001010000111001101011111101011011110010011000001111111010", + "10011000110000110001000111111101100010000110101110110101100010001011011100100111100011011000100101010000011101001110100011110", + "10101010100001000000111111011010101010011011111001001011000110101010110110111111000000101010100100100011111000100101101010011", + "10101000111001101000011110110011100011010100101111110100011010001010010010101101111000001000111110010001001000010101100010100", + "11111111111011000110101010101111111110100001000110011111001111111100010101011100010111101111101000011011001111111010111110001", + "00111001111110001111110001001100100110101000011110000011010111101001101100010001010100000011101011111000101100011000110101000", + "11111111111100111101010010110000100001111110010100100110101111010101011101010010101100100011010001011000010000101001110101110", + "01011001101010100011000101101111001100001111110100101111000011000101001001110110100010010100010101010110010100001111011011111", + "01100111111101101000011100011110011010010011110000101001111111101000100111101010100000101101000110110011111110101101011000111", + "01001000011011100010011100100111001011011001110011101110111010000000000111111100111000001111111110001011000110010100101000101", + "00010010111111100110001001101101111010101001001111111101110100000100000010001001110110011001110010010101001110010010010110101", + "11000101001100010101110011011111111010111001000010011001110101101111111101000000010101100011110011111100100101111000010101001", + "00101010001000000101110001110011110111111000011101000100010010011111001001100111001100100001001011000000010100100001001101010", + "10000001001000111001000111111100010000011000101000110101100001010111011011000111100010110101000101001110011010101110000011110", + "10010110011001010000111111001111001100001101111001001011000010110000110110011111000001001110100100110101111101000100011000011", + "10001000111001111000011110110010010111011000101111110100011010011110010101001101111001001111011110001101001111010100000000100", + "11010011001011011110101010100000101100100011000110011111001001011110010111111100010110011011110000000101001000011011101110001", + "00100101110110001111110001000010100110100010011110000011010011101101101100010001010101100010010011100110101011111001000101000", + "11001011100100111101010010101010100001110110010100100110101111001111011010110010101101000010101001001110010101001001001101110", + "01110001111010100011000101101001001100001111110100101111000111000001001111110110100011010101000101001010010011001110100011111", + "01000111100101101110011100011110011010001101110000101001111101101010100000001010100001001100100110101101111001001100100000111", + "01011000010011100110011100100111001011000011110011101110111110000100000000011100111001101110011110010101000001110101011001001", + "00100010101111100000001001111001111010101011001111111101110000010110000000001001110011111000010010000011001011110010101110001", + "11100101010100010001110011011111111010111101000010011001110111110011111000100000010010100010110011100000100010111001101100101", + "00001010010000000001110001111011110111100000011101000100010010000101001100100111001011000000101011011110010011000000110101010", + "10010001000000111001000111110100001000011100101001010101100101011011011010100111100101010100100101010000011101001111010011110", + "10100110001001010010111111000111000100011011111000010011000010100010110111011111000100101111000100100011111000100101011000011", + "10101000100001111110011110110010011111010100101111110100011100011010010100101101111110001110011110010001001000010101100000100", + "11111111110011011110101010101000111110111011000110110111001011111100010110111100010001111111110000011101001111111011111110001", + "00111000111110001001110001001011100010101110011111110011010110001001101101110001000010011000110011111110101100011000100010100", + "11111010110100111101110010100011101011110000010101000110101110101101011011010010100000101010101001011110010010101001101010010", + "01101000100010100100000101101000100010001011110101111111000110001101001110010110100100011000100101010010010110001110100010011", + "01111111111101101101011100010111111110001101110001011001111111111000100001001010100110101111100110110011111110101100111111111", + "01101000011011100010011100101110100111000111110010011110111100000000000001111100110110011001011110001011000110010100110100101", + "00010011011111100101101001110000000000101101001111100101110111011100000001101001101010010101010010010101001110010010110010101", + "11100100001100010011110011011111110100111001000011011001110010100111111001000000011011110110110011111100100101111001011001001", + "00001010101000000101110000110011100111100000011101101100010110011111001101100111010010101111001011000110010100100001000001010", + "10010001001000111110000111111101110100011000101001000101100101011111011011000111111100100011100101001000011010101111101110010", + "10100111111001010000011111101110110110011101111000101011000101101000110110110111011101000010000100110011111001000100000101111", + "10001001111001111111011111010010000001010000101110100100011011001110010101001101110111011010111110001001001001010100110101000", + "11010011101011011011101011000000101100111011000111101111010111000110010111110100010000010101010000000101001110011010011011001", + "00100101110110001111110000000011011010101010011111110011001001101101101100000001011011110100110011100110101101111001011001000", + "11001010000100111110110011001011011011110111010100111110100100000111011010111010110001001110001001001110010101001001101001110", + "01010000111010100101000100101001000010001110010101101111000100010001001111111110101101000000000101001010010011001111101111111", + "01100111000101101000011100111110001010001100010000000001100011110100100000010010111111000010100110101011111000101100101100111", + "01001000010011100101011101000110101111000010110010011110110110000010000000000100100111111000111110010011000000010100110101011", + "00010011001101100110101001011000000000101011001110011101111011011000000000000001101011110100110010010101001110010010110011010", + "11100100010000010010110011111111101100111100000011001001111110100001111000100000011010110111010011100100100101111001011000110", + "00001010110110000000110000011011110011100001111100110100010100011001001100101111001011001110001010111110010101000001000000001", + "10010001000100111001000110110101101010011101101001000101101111011001011010110111101101000010000100110000011011001111101111110", + "10100111101111010011011110100110110110011010111001010011000001101110110111010111011100100011100101000011111000100100000100011", + "10001001100001111110011111110010011011010101001110110100001111001100010100100101110110011011011111010001001000010100110100100", + "11010011101001011110101010001000111000111010100110110111010101000010010110100100001001110100010000011101001110011010011010001", + "00100101101010001000110000101011000000101111011111110011011011101111101101101001001010000101010011111110101101111001011000110", + "11001010011110111101110010000011011011110000010101000110100000000011011011011010110000110111101001001110010101001001101000001", + "01010000100110100100000101001001011000001010110101111111001000010111101110010110101100011001100101001010010011001111101110000", + "01101111111011101101011101110110111110001110010001011001111011111100000001000010100111011111100111001011111000101100111111100", + "01001000100111100010011101101110100011000010110010011110110010001011100001101100110111111000111111110011000000010101100010101", + "00011010100001100101101000000001101010101100001111100101110110101001100001100001101011101010110011110101001110000011101010101", + "11101000110100010011110010000111100010111010100011011001100110001000011001001000011010101000110010111100100101100001100011001", + "00001111110010000101110001010011111111100011111101101100001111111001101101011111010010101111101011000110010101011001111111010", + "10010001111100111110000110011100101000011001101001000101101001000000111011011111111100111101000101001000011011010111111010000", + "10100111110011010000011111101110111100011011111000101011001011101110110111110111011101000100100100100011111000100101111001100", + "10001000011101111111011110000010111011010111101110100100010110000100110101101101110111001110011110010001001000010101101001011", + "11010010101101011011101011001001000000111000100111101111001010010010110110010100010001111000010001111101001110011011001111010", + "00100101001010001111110000001010001110101111011111110011011011110110001101100001011010010011110010011110101101111001001101000", + "11001010011010111110110011000011001101110111010100111110101000000010111010011010110000110001001000101110011101011000010101110", + "01010001000010100101000100111001100000001100010101101111010001011110101110111110101100001101000100001010011011010110110011111", + "01100110011111101110011100111111101110001110010000000001100110100100000000110010111111000110100110101011111000110101111000111", + "01001000100111100011011101000111110011000010110010011110110000011011100000000100100111100110011110010011000000001100100001011", + "00010011000101100110101001011000001010101101001110011101111001011000000001000001101011110010010010010101001110010011001111010", + "11100101110000010000110011101111010110111010000011000001111111101001011000000000011010100011110011111100100101111000000100110", + "00001011110110000010110000010010011011100011111101111100010011001001101101001111001010100011001010100110001101000000010100001", + "10010001111100111001000110111100111000011001101001010101101011000000111011010111101100100101000100101000000011001111111010010", + "10100111110111010000111110101110100000011010111001010011000111101111010111110111011101011100100101000010100000110101111001111", + "10001000011001111101111111100010111011010111001110010100001010000101110101100101110111010000011111010000111000001101101001000", + "11010010101001011001101010001001011000111000100110101111010000010010110110000100001001110110010000011100101110000011001111001", + "00100101001010001111010000101010011110101111011111110011011101110110001101101001000010001101110011111111001101100001001100110", + "11001010011110111100010010000011010001110110010100111110100010000011011010011010100000101101001001001110010101001000010100001", + "01010001000110100111100101011001100000001100110101001111001001011111101110110110101100010101000101001010010011001110110010000", + "00100110011011101111111101111111110111101110010000011001111110100100000000100010111111001110100111001011100000101111111001100", + "01001000100111100010111101100111100011000010110010011110110000011011100000001100101111111110011111110011011000010000100001001", + "01001111000001100111001000011000010110101100001111100101110001011001100001010001111011101010010011110100010110000111001111001", + "10101101110100010001010010001111001111011010100011111001100111101000011000010000011010111101110010111101010101100110000100101", + "10000011110010000010010000010010111111100011111101110100001011111001111101001111010010101111101011000111110101011000111110010", + "00000000111100111001100110011100100010111001101001000101101110001000101011000111110100111000100101001001111011010110100010000", + "11111110110011010001111111001110101010111011011001010011001110101110110111110111001101001010100100100011111000100101101011100", + "10000010011101111100111111100010100011110111101110010100010010001100100101100101110111011000111110010001001000010100100011011", + "10111010001101011001001011001000111110111000100110101111001011111010111110000100001001111111110001111101010110011101111111010", + "10111010101010001111010000101010010110001110011111110011010000100110001101111001000010000000110010011110110101111110111000100", + "10111010111000111100010010100010101010010111010100111110111100011010110010011010100000101000001100101111001101011110100000001", + "10000010000010100111100100111000001010101101110101001111001111011110110110111110101100001110000010001011100011010010101110010", + "11111110011110101111111101111111101110001111010000011001111101101100001000110010111111001011100000101010011000110101000101110" + ], + "3": [ + "11111110011010111010000010011111111110111100110001111111111100110110000011010110000011010001100011010110000011010001101111111", + "10000010110000001100100101010011011101110100000111001001111101101101000000110101100100100010100100100101100000110110001000001", + "10111010110101100001001000010101001110011100111001110100001111111111011000001101011110010000111110010101011000001001001011101", + "10111010000100111010010110110100100000111010111110101101001000100011010110000011001001111100101001111011010110000100001011101", + "10111010000110001100110100101111111110001110100011001001001011111000110101100000101010011111101010011000110101100111001011101", + "10000010001111100001001000111000100010011111001110100100010110001000101101011000010100111000110000111000001101011011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001000001100100101111011100011110110110010011001100110001010110101100000100100111000100010100000110101100001100000000", + "01110110011011100001001101101111111111100010000101110110010011111000001101011000001100101111101011011000001101011001000000110", + "10010000010010111010000010011111111110111100010001111111111100010110000011010110000010110001100101010110000011010111001011110", + "00011111000000001100100101010011111101110100000111001001111111001101000000110101100001010010100100100101100000110100101010011", + "00000100000101100001001000010100101110011100111001110100001110111111011000001101011001001000111110010101011000001100010010100", + "10100010000100111010010110010101100000111010011110101101001010111011010110000011001111110100101000011011010110000010010100001", + "00110100100110001100110100101110001000001110100011001001001010100000110101100000101100011111001011111000110101100001111101000", + "01100010101111100001001000111001010000011111101110100100010010100000101101011000010100100111010001011000001101011001000111110", + "11011101011110111010010011001101110101000001100100101111010101100100000011010110010010001011110101010110000011010111001001111", + "00010110110110001100100001100010110111101110101000011011111100010101100000110101100001010010000110110101100000110110100010111", + "01001001001001100001011000100100000101000111001010100100100111001101011000001101011001101010111110001101011000001000010000101", + "10101011110110111010010011100100101010000010110001111111001001111011110110000011010111100100010010010010010110000110011100101", + "01101001101000001100100100111000100010110001010100011001100011010010110101100000110100100101010011111001010101100111111111001", + "01111011011111100001001101101011011010100001000101110110010001100000001101011110010100101111110011000001101101011001001111010", + "10000000010000111010000010111001011111111000010101111111111100010110000011010000011010101001111101001111100011010111001011110", + "00001111000010001100100101010100011101110010000011001001111111001101000000110011111001001010111100110101100000110100101010011", + "00000100000101101001001001110001001111111010111111110100001110111111011000001001001001010000101110001101011000001100010010100", + "10100010000000101010010111010000000001111010011110101101001010100011010110000011010111100100110000000011010110000100010100001", + "00100100100100011100110101001111101001101010100111001001001010100000110101100000110100000111010011100000110101100111111101000", + "01110010101111101001001000111001110000111111101010100100010010100000101101011000001100111111001001001001001101011111000111110", + "11011101011000110010010010001010010100100101100010110111010101100100000011010110000010010011100101001111100011010011001001111", + "00010110110000011100100000000110110111001100101000010011111100001101100000110011111001000010011110101100000000110100100010111", + "01011001001001111001011001100010000100100111001110111100100111001101011000001011000001110010100110010100111000001100010001001", + "10111011110100111010010011100010101011000100110101110111001001110011110110000101001111111100001010010011010110000010011100001", + "01101001101010000100100100011100100010010011010110000001100011001010110101100100100100111101000011111000110101100001111110101", + "01111111111111110001001100001011111110100001000111111110010011111000001101011000010100111111101011000000001101011111111111010", + "10011000110100101010000011111000100011011100010101111111111010001110000011010110011010111000100101001110000011010000100011110", + "00011010100010000100100101010101101011010010000101001001110010101101000000110101111001001010100100100100100000110011101010011", + "00001000100111101001001001010001100011111110111011101100001110001111011000001101001001001000111110010100111000001001100010100", + "10101111100100101010001110110000111111111010011010100101000011111011000110000101001111101111110000011010110110000010111110001", + "00110100100010010100100100001111110111001010100101010001010010001000100101100110101100000010010011111001010101100000000010100", + "01011011001111100001011000111001000100011111101000101100010101000000101101011110010100100010101001001000001101011001010100010", + "11111001111100110010010010101010101010100101100000110111011001101100000011010010010010010100000101001110000011010110111010011", + "00000111110010011100101001100110100011001100101100010011101001000101101000110101111001001101000110101101100001010010111001111", + "01111101001111110001000000100010011010000111001000100100100111111101000000001101000001101111111110010101011001101011101000101", + "10000010010100110010001011100010011111100100110011111111000110000011101110000011001111111001110010010010010011000100001010101", + "01000001001010000100111100111100011100010011010110000001101111011010100101100000100100100010110011111001010010000100001011001", + "01110110011111110001010100001011001110100001000001111110011100101000001100111110010100100000101011000001101011011001010011010", + "10000100010100100010000011011001000001111100010011100111100100100110010010110000011010110100100101001111100101010110110100010", + "00110110100010001100100101010100101001110010000101000001111000110101111001010011111001001111000100100100100000110100111001111", + "00101000100111101001011001110001110001111110111011101100000010110111010001001001001001001111011110010101011000001101100001000", + "10100011000100101011111111010000010100111010011010100101011111110011111110000011001111111011110000011011010111100100001111001", + "00111000100010011101101101101111110111101010100101001001001010010000001101100000101100000010010011111000110100000110000101000", + "01011111001111101000010000111001000100111111101000100101011101011000010101011000010100100010101001001001001000111111010001110", + "11111001111100100011101010101010101001100101100000110111111001101100010011010110010010010100000101001111100100010010111101111", + "00011011110010001101111001100110100000001100101100010010010001000101100001010011111001001101000110101100000110110010111110111", + "01011101001111100001111000000010011000000111001000111101111111111101001001101011000001101111111110010100111110001011101111001", + "10000010010100101010010011100010011101100100110011100110101110000011001111100101001111111001110010010010010110000100001111001", + "01000101001010011100110100011100011101010011010110010001001111011010111100100100100100100010110011111001010101100100001100101", + "01111010011111100000100100001011001011100001000001101111100100101000100101011110010100100000101011000001101100111111010100010", + "10001100010100100011011011011001000001011100010011100110011100100110111011010000011010110010100101001111100010110000110011110", + "00110010100010011101111101010100101011010010000101000100110000110101111000110011111001001001000100100100100101010010111100011", + "00100000100111110000110001110001110010111110111011100000100010110111001000001001001001001001011110010100111111001001100110100", + "10101111100100111011001111010000111110111010011010100000100111111101010111100101001111111111110000011010110000000100111110001", + "00111000100010010110010101101110100011101010100101001010010110001110100100000110101100011000110011111001010011100110100010100", + "01011010101111110001001000111000101010111111101000101101110110101100010100101110010100101010101001001001001101011111101010010", + "11111000111100101010000010101010100011100101100000111101111110001110001010001010010010011000100101001111100011010011100010011", + "00011111110010001111001001100110111110001100101100010010010011111111001000101011111001001111100110101100000001010010111111111", + "01010100001111111110000000000011001100000111001000100101001000101001100000010011000001111100111110010100111001101011010011001", + "10000110010100101111001011100011000011100100110011110110000100100111001110000101001111110100110010010010010011110101010101001", + "01000100101010011101011100011100001011010011010110001101001110110110100101100100100100110111010011111001001010111100111000101", + "01111010111111100110010100001011010001100001000001111011111110110000010100111110010100101111001011000001101011000110000000010", + "10000001010100100100110011011000010001011100010011111100110011110000001010110000011010100011100101001111100101001000001110010", + "00111010100010011000111101010101110111010010000101000000010010010001111101000011111001000100000100100100100110110011100101111", + "00101101000111110111000001110001100110111110111011100110100011011101001111010001001001011100111110010100111100001001010111000", + "10101011100100111001101111010000001000111010011010100100100101101001101000011101001111110011010000011010101001100101011111001", + "00111001100010010011100001101110100001101010100101001000100101000100011011111110101100010000110011111001001010000110111010100", + "01011111001111110101110100111000011000111111101000101101011111111100010001011110010100101110001001001001010000101110001100010", + "11110000011100101010111100101010111101100101100000111011111000000001110101010010010010000000000101001111110100001010001110011", + "00010111010010001011011101100110111100001100101100010110010011011100011111010011111001000010100110101100000111001011101101111", + "01011100001111111110001100000011001010000111001000100111101000101011010111101011000001111000111110010100111111110011010101001", + "10001110010100101110101011100011011001100100110011110111100100100110001011110101001111110010110010010010010011100101010011001", + "01001100101010011011001100011100000011010011010110001011001110110001000010111100100100110001010011111001010010100100111000101", + "01111110111111100011010100001011000011100001000000011110011110110010110010100110010100101000001011000001110010111110000000010", + "10000101010100100101110111011000011111011100010011011111010001110011101100101000011010100110000101001111111100110000001110010", + "00111010100010011000011001010101101101010010000100000000010010010000111101010011111001000011100100100100111101000011100101111", + "00100001000111110000100111110001100110111110111010000000000111011010101111001001001001011011011110010100101111010001010101000", + "10100111100101111100001011010000010010111010011011100000000001101011101001100101001111110100010000011010110001111101011011001", + "00110001100010110011000001101110111101101010100101101011100111000111011010000110101100010101010011111001010010011110111000100", + "01010111001110010101110000111000011100111111101000101101111001111101010000101111010100101001101001001001001000111110001000010", + "11111000011100101101111010101010100101100101100000011101011100000111110100001011110010000111100101001111100100010010001110011", + "00011111110010101110111001100110111110001100101101010110110111111111011111001010011001001111100110101010011111010011111111111", + "01011000101111111110101100000011100010000111001000000100001110001000110111110010100001101000111110010010100111101011100011001", + "10001010110100001110101111100010101011110100110010110000100010101110001011100101001111101010110010010100001011110100101011001", + "01001000101010011101001010011100100011000011010110101101101010001111000010100100100100101000110011111101000010111100100010101", + "01111111111110100101010000001010111111100001000000111011011111111100110010111110010100101111101011000001101010100110111110010", + "10000101110100000001110111011000000101010100010011011111010101101111101100110000011010111011000101001111100100101000011010000", + "00110011100011011010011101010101100011001010000101000110010001000100111101000010111001000000100100100100100101001010011001100", + "00100101000110110110100001110001000100111110111011000000000101111110101111010000101001000110011110010100111111011001001001011", + "10101010000100011110001111011000111000110010011011100000000110000111101001111100101111110000010000011100101001100100101111010", + "00110001000010010111000001111110100011101010100101101001100111011001011010011111001100001010110011111111001010000110101100100", + "01011110001111010111110110100000010110101111101001101011111100101001010000101110010100101000101001001111010000101111110100010", + "11111100011100101101111000100010000111110101100000011011011110100101110100001010010010011010100101001011110100001010010010011", + "00011110110011001000111001110110010110001100101101010110110010110001011111001011111001000001000110101100011111001010011001111", + "01011100101111011010101100000011011110001111001000000100001110110100110111110011000001100000011110010100100111110011000001011", + "10000110110101101100101001100011010101111100110011110000100111110010001011110100001111110110010010010010001011110100101111010", + "01001000001011011011001010011100101001010011010110101101101000010011000010111101000100101101110011111001000010111100100100110", + "01110011011111000101010100000011100011101001000000111011011101011100110010100111110100101101001011000111110010100111101100001", + "10000101010100100001110111001000010101011100011011011111010001101111101100101001111010111010000101001001111100101000001010010", + "00110010100010111010011111001101111011000010011100000110010001000100111101000011111001000001000000100010111101000010110001111", + "00100101000111110110100111111001011100101110111011000000000101111110101111010001001001000001111000010000101111010001100001000", + "10101011010101111110001111000000100000111010001011100000000100000111101001111101001110010111110110011010101001111101001111001", + "00110000001010110111000001101110110011100010111101101001100011011001011010011110101101101101110101111001001010011111001100110", + "01011111100110110111110010111000001110100111101000101011111100101001010000101111010001001101001001001001010000101110110100001", + "11111100101101101101111100101010011111100101111000011011011110100101110100001011110101011011000101001111110100001010010010000", + "00011110110010101000111001101110001110000100111100110110110000110001011111001010011111000000100111001010011111001010000001100", + "01011100001111111010101100010011001110000111000001000100001110110100110111110010100111100000011111110010100111110011011001001", + "01001110011100001100101001111011001101110100101010110000100011110010001011110101001111110110010111110100001011110100010111001", + "10101100101010011011001010010100100001000010111110101101101110010011000010111100100100101101110100111101000010111100010100101", + "10000010000110100101010100011011111111100000110001011011011111111100110010100110010101001111101101000001110010100110111110010", + "00000000100101100001110111011001100011010101101010011111010110001111101100101000011011011000100011001111111100101000100010000", + "11111110000011011010011111010100101011010011000100000110010010101100111101000010111100101010100100100100111101000011101011100", + "10000010101110110110100111110001100010101110100011000000000010001110101111010000101110011000111110010100101111010000100011011", + "10111010000101111110001111011001111110100010101010000000000011111111101001111100101001111111110001111100101001111101111111010", + "10111010100011010111000001111110101111100011001100101001100110110001011010011111001010000000110010011111001010011111111000100", + "10111010100110110111110010110001011110110111110001101011111110110001010000101111010100111000001100101111010000101111000000001", + "10000010111101101101111100111011010101101100001000011011011101110101110100001011110010010110000010001011110100001011001110010", + "11111110001011001000111001110010000000011101011100110110110100010001011111001010011000110101100000101010011111001010100101110" + ] + }, + "28": { + "0": [ + "111111101110100011110110101110101011101000110110001001101110101101101000000010100101100001000010110110101100011011010101001111111", + "100000101001000110111001010111100100011101110110111110111001101010111110010010010101011001110010110101101011011000000111001000001", + "101110100010001001010010001100111111000111111101101111001000011011001111111100011011010111111100100100011010111000100100001011101", + "101110101100011100010100001110000001010111100110010110011100000110010111111101111000110100111101001001000110100101111001101011101", + "101110100011001110110011111111000110000101011011111110001011000000000101111110111000001000101111111110100001101000111000101011101", + "100000100110011101110010100010111111000111101101100011111010110001100101100010110110000100101000100011010000011001011111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001011010010011001100011100100011101000110100010001011000000010100100010111000001010100110100011100001101101111011100000000", + "101101110110101011100010111110110111100000110001111110110010110000100000111110010110000100001011111110010000011101001111001001011", + "001010001010100011011110101110101011101001010111001001101110101101101001000011010101100001000010010110101100000001010011000011000", + "001110110111000110001001110111100100011100010111111110111001101010111110010011101101011001110010110101101011000010000100010011110", + "000010001000001001000010001100111111000110011100101111001000011011001110111101100011010111111100000100011010110110100000111101111", + "011101101010011100110100101110000001010111100111010110011100000100010111111100100000110100111101001011000110101011111001111100111", + "110101000001001110010011000011000110000101011010100100001011000010000100101110111000001000101111111000100001101100111110101110111", + "000111111010011101110010101100111011000111001100100101111010110111100101001000110110000100101001101001010000011001011111101000110", + "100111000010111111110100111010001101110001001010011001100110101011111000001011010101100111001011110100001100000000010110101011010", + "110010101111110001011001000011101000111010101010111011100001101111111010010001001101011111010001000000001011000110010101110001001", + "111111000000010101001000011000011011011110000001111111010000011011011111110101100011010011110101000001111010110111100100010101110", + "110001111100101011000100011010001111110001111010010011001100000111010011111110000000110010011110111001100110101111101000111110011", + "101010001111010010011001010111100000011100000111110100001011000000010101100110111000001010100111011111100001101101111011100110100", + "001001110110101010000010011000110011100001110001100000111010110010100001001110010110000100001011111101010000011101001111001110001", + "111001010000100011111110101110101001101000010111001001100110101111101001000101010101100101000010010101001100000001010011000101000", + "111100110001000110101001110111100010011100010111111110100001101100111110110101101101011111110010110010001011000010000100010101101", + "000001010100001001000010001100111011000111011100101111010000011101001110011011100011010001111101000010111010110110100001111011110", + "111111111000011100110100111110000101010111000111111110001100000000010110111110100000110010111100111111100110101011111000111110100", + "010110001101001110010011100011011010000101111010100010001011000010000100100010111000001000101111100010100001101100111110100010111", + "010110101010011101110010101010101011000111001101101011111010110111100100101010110110000100101001101011010000011001011110101010110", + "000110001010111111110100100010010111110001101011100011100110101011111000100011010101100111001010100010001100000000010110100011010", + "010011111101110001011001111111100010111010101011111111100001101101111011111111001101011111010001111110001011000110010101111111001", + "001101010110010101001001011000000001011110100001000001010000011000011110001011100011010011110100111001111010110111100101001011100", + "100001110100101011000100101110011101110001111011001001001100000000110011000010000000110010011110110101100110101111101000100010000", + "101000010111010010011001010111110010011100000110111110001011000111110101110010111000001010100111110011100001101101111010010010111", + "001001110110101010000010001100101001100111110001001110111010110110000001111100010110000100001010000011010000011101001110011100010", + "111011000000100011111111101110100111101110010111110111100110101111001001111001010101100101000010001111001100000001010011111111010", + "001100111001000110101001000011100000011100010110100100100001101100111111001001101101011111110011011000001011000010000101001101101", + "110011001100001001000010001100110001000111011101100101010000011101001111001111100011010001111100101000111010110110100001001101100", + "111111100000011100110100111010010111010001000111111000001100000000010110101100100000110010111100110101100110101011111000101100100", + "010110001101001110010010000011001010000001111010011010001111000011000100010100111000001001001111100010100001101100111110010100111", + "010111100010011101110010011000111011000101001101111111111100110110000100010010110110000101001000000011010000011001011110010010110", + "000101011010111101110100111010000111110001101011010011100000101010011001111001010101100110101010011110001100000000010111111001010", + "010010101101110011011001010111111010111100101010010101100011101101011011000001001101011110010001011000001011000111010101000001001", + "001101010110010001001001011000010001011000100001000001010010011000111111001111100011010011110100111001111010110110000101001111100", + "100001110100101111000100101110001101110111111011001001001100000000110010100100000000110010011110110101100110101110001000100100000", + "101000010111010000011001010111101010011110000110111110001011000111110100010100111000001010100111110011100001101100011010010100111", + "001001110110101110000010001100100001100101110001001100111010110110000000011010010110000100001010000011010000011100001110011010010", + "111011000000100011111111101110100111101100010111010101100010101110001001111001010011100100100010001111001100100000110011111001010", + "001100111001000000101001000011100000011100010111000010100111101101011111001001101011011110010011011000001011100011100101001001101", + "110011001100001001000000001100110001000101011100000011010110011100101111001111100101010000011100101000111011010110000001001111100", + "111111111000011100110010111110010111010011000110111110001110000000110110111110100100110011111100111111100111001011011000111110100", + "010110001101001000010111100011001010000001111010100010001101000011100101100010111000001001001111100010100000101100111111100010111", + "010110101010011111110101101010111011000111001101101011111100110110000101101010110110000101001000101011010000011001011111101010110", + "000110001010111101110010100010000111110011101010100011100000101010011000100011010101100110101011100010001100000000010110100011010", + "010011111101110011011001111111111010111110101011111111100011101101011011111111001101011110010001111110001111000111010101111111001", + "001101010110010011001100001100010001011010100000101001010110011000111110111011100100010010010100000011111100010110001100111011100", + "100011100100111111000110101110001101110001111011010101001010000000110010111000000111010011111111101111100000001110000000111000000", + "101000011111001100011011000011101010011110000010100010001101000111110101101000111111101011000111011001100010001101000011101000111", + "001011101110111000000110001100100001100101110011100010111000110110000000001110010011100101001011001001010011111100110110001110010", + "111011000000110101111001011110100111101100010000111111100000101110001000001101010011100100100010110101001101100000100010001101010", + "001110101001010010101010100011100000011100010111011000100111101101011111010101101011011110010010000010001011100011100101010101101", + "110011000100001111000110111100110001000101011101111001010110011100101110110011100101010000011100000010111011010110000000110011100", + "111101111000000110110100011000010111010011000011110100001110100000110110111000100100110011111101111111100011001010011000111000100", + "010110001101001000010110010111001010000001111100110010001101100011100101100000111111001001011111011000100110001101011111100000111", + "010101110010011001110000011010111011001111001010100011111101010110000100001110110001100101010001011001010110111000101110001110110", + "000101010010110001110001001000000111110011101101001111100001001010011000000101010010000110110010110100001111100000100110000101010", + "010000110101100011011000110101111010101110101100011001100010101101011011010101001000111110001000010010001100100111110101010101001", + "001101010110001011001101010110010001000010100001101001010110011000111110111011100100010010010100000011111101010110001100111011100", + "100011100100101111000110001100001101111001111100010101001010000000110010111000000111010011111111101111100000001110000000111000000", + "101000011111010100011100000011101010000110000110100010001101000111110101101000111111101011000111011001100010001101000011101000111", + "001011101110100000000010110100100001101101110001000010111000010110001000001110010011100101001011001001010111111100110110001110010", + "111011000000111101111010111000100111110100010001011111100000001110000000001101010010100100110010110101001011100000101010001101010", + "001110101001001010101010100101100000000100010001111000100110001101000111010101101010111110001010000010001101100011101101010101101", + "110011000100001111000111001011010001010101011101111001010111111100110110110011100100110000000100000010111001010110011000110011100", + "111111111000010110110100111110110111000011000111111110001111100000100110111110100101010011100101111111100001001010000000111110100", + "010110001101010000010110100011001010011001111101100010001101100011100101100010111111001001011111100010100110001101000111100010111", + "010110101010010001110000101011011011001111001011101011111101010110000100101010110001100101010000101011010110111000110110101010110", + "000110001010111001110000100010100111111011101011100011100001001010011001100011010010000110110010100010001111100000101111100011010", + "010011111101111011011000111110011010100110101011111111100010001101010011111111001000111110001000111110001100100111101101111111001", + "001111001110001011001101101100010001001010100111110011010110111000110010001111100100010010000100001001111101010110011100001111100", + "100011100100100111000110101001001101111001111101011111001011100000101101101100000111010011100110010101100000001110000001101100000", + "101010001111010100011100001100001010010110000111100000001100100111101011010100111111101011011111000011100010001101000011010100111", + "001011100110100000000010100011100000111101110001011000111001010110011011010010010011100101010010100011010111111100110111010010010", + "111001011000111101111011000010100110011100010001001101100000001110000010111001010010100100110010111111001011100000101010111001010", + "001110101001001010101011000100100000110100010000101010100110001101000110000001101010111110001011111000001101100011101100000001101", + "110001010100001111000111000110010001001101011100101011010111111100110110001111100100110000000100011000111001010110011000001111100", + "111101110000010110110100000101110111101011000111100110001111100000101111100100100101010011100100010101100001001010000001100100100", + "010100010101010000010110110110001011110001111100111000001101110011101001010100111111001001011001010010100110001101000111010100111", + "010101110010010001110000011111111010001111001011100001111101001110011011011010110001100101010110100011010110111000110111011010110", + "000111000010111001110001110000100110011011101010000101100001010010000110111001010010000110110100101110001111100000101110111001010", + "010000111101111011011001101000011010100110101010011011100010000101000000001001001000111110001101111000001100100111101100001001001", + "001111001111101011001101101101010001001010101111101011010110110000110000001111100100010010000100001001111101010110011100001111100", + "100011100101100111000110101001001100011001111101010111001011100000101101101100000111010011100110010101100000001110000101101100000", + "101010001110110100011100011101001011010110000111100000001100100111101011010100111111101011011111000011100010001101000111010100111", + "001011100110000000000010110011000001111101111001001000111001010110011011010010010011100101010010100011010111111100110011010010010", + "111001011001011101111011011011100110011100010001011100100000011110000110111001010010111100110100111111000011100000101100111001010", + "001110101000001010101011000100100000110100001000111011000110010101000000000001101010100110001101111000000101100011101010000001101", + "110001010101001111000111000110010001101101001100111010110111100100110000001111100100101000000010011000100001010110011010001111100", + "111111111000110110100100111111110111001011000111111110101111101000101101111110100101000011100000111111111001001010000011111110100", + "010010001100110000011110100010001011110001100101100010101101111011101011100010111111001001011000100010110110001101000111100010011", + "010010101010110001110001101011111011101111010011101011111101001110011010101010110001100101010110101011010110111000110110101011110", + "000110001010111001111001100010100111011011101011100011100001010010000110100011010010000110110100100010001111100000101110100011110", + "011111111100111011010001111110011010100110111010111111100010000101000000111111001000111110001101111110001100110111101000111110101", + "000011000111001011001100110011010000101010111111001000010110100000110000010010010100001010000011000011110101001100011010010010000", + "100101111101000110011110111011001101011001111101011100101011111000101100011001111111001011100000111111101000010100000110011001100", + "101110001111010100011100100101001010110110001111111011101100111111101011000001000111110011011000011001111010000011000001000001011", + "001001110111100001100011000111000001111101100001111010011001011110011010101111001011110101010110011001001111110010110000101111010", + "111001010001111100010010000101100110011100001001111110000000010110000110100101010010111100110101110101010011100100101100100101010", + "001000110000101011111011010110100000110100010000110001000110010101000001101101101010100110001101010010000101100011101011110101101", + "110001010100001110011111111110010001101101010100100000110111100100110000000011100100101000000011000010100001010110011010011011100", + "111111100001010111111101110001110111001011010111001100100111101000101100000000100101000011100000101110111001011010000110011000100", + "010100011100010000101111101000001011110001100100010011100101111011101011011001001111010101011000011001011110010101000001001001011", + "010111101011110001100000001101111011101110001011101010000101001110011010101111001001111011010110001000111110100010110000111111010", + "001011000010111001001001001000100111011011000010010110011001010010000110101100101010011000110101110100110111101110101100100100110", + "010110101110111010010000011100011010100110011010100001010010000101000001110100010000101000001101000010110100111001101011111100001", + "000111000111001011110100110011010000101010111111001000110110100000110000010010010100001010000011010011100101001000011010011010000", + "100001111101000111010110111011001101011001111101011100101011111000101100000001111111001011100000100111101000010100000110000001100", + "100110001001010101100100100101001010110110001111111011101100111111101011011001000111110011011000000001111010000011000001011001011", + "001101110101100000001011000111000001111100000001111010010001011100011010110111001011110101010110010000001111100010110000110111010", + "100001010001111100000010000101100110011100101001111110001000010100000110110100100010111000110101111100110011111110101100110100100", + "010001110110101010011011010110100000110101010000110001011110010011000001101100010010100000001101010011100101111001101011110100010", + "110101010010001110111111111110010011101101010100100000101111100010110000000010011100101110000011000010000001011000011010011010011", + "000110100111010110111101111111110011001011110111111110110111101100101100111111111101000101100000111110011001010100000110111111111", + "000000001110010001101111100010001011110000100100100011100101111011101010100011001111010101011001100011011110010011000000100011011", + "111111101001110001000000101011111001101111101011101010000101001110011010101011001001111011010111101010111110100010110000101011010", + "100000101010111000001001100010100011011011100010100010011001010010000110100010101010011000110100100010110111101110101100100010110", + "101110100100111011010001111110011010100111011010111111011010000111000001111110010000101000001101111111110100111001101011111110001", + "101110101011001010110100100111010100101011111111011010111110100010110001010110010100001110000010111000000101001000011011001110010", + "101110101101000111110111000101001101011001011101011110110011111110101100110101111111001101100000100100001000010100000110100101100", + "100000100111010101100101010111001010110110001110110001110100111001101010001101000111110101011001101011011010000011000000001101001", + "111111101111100000001011011111010111111100000000100000000001011000011010000011001011110011010110011010101111100010110000000011000" + ], + "1": [ + "111111101000110111000101100111100101010100111000100110000000001101101110110101010011100001000101101101010011011011011001001111111", + "100000100000010101000001000101011111101100100000000001000110001010111001101101101011011001110101001010000101011000001011001000001", + "101110101110010001110011111011010001100010101110010000110111111011001000000011100101010111111011011010100000111000111000001011101", + "101110101101111001001001000010110010100001000101101100100111100110010100000000100100110100111000100110111100100101100101101011101", + "101110101101010011010101111110001000111001010101111111100101100000000011111111001111001000101000111111011001101000101100101011101", + "100000100011011111000100100010000100110111111010100010000101010001100010100011001001100100101110100010111000011001011011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000111000010101110100010001010111001110100100011110100100000010011100011000111101010100001100011011001101101111001000000000", + "111100101101010111011000111110000100010111110010111110001001110000100011111111001011100100001110111111101100011101001000110011101", + "111000011010111110011011111111100101010100111000100110000000101101101110110100100011100001010101101101010010000001011100110100110", + "000010101100001101111110100101011111101100100000000001000111101010111001101100010011011001101101001010000101000010001011101100001", + "110011001110010000010101001011010001100010101110010000110110011011001000000010011101010111100011011010100000110110111010000010000", + "010010111101100001101111100010100010100001000101101100100110100100010100000001111100110100100000100100111000101011100110000001100", + "110101000001011011110110001010010000111001010101001011100101100010000011011001001110001000101000000011011111101100100001011001001", + "111000101101000110000101100110011100110111111011011010000101010111100010110111001000000100101110010110111110011001010000010111001", + "000110000110110110100011111101111111010100011000100110011001001011111110110100101011100111001100101010110110000000001100010100101", + "111111111010001100000010001111011110001100101000000001011010101111110001101100010001011111010100101111110101000110001010001100010", + "111100001000001000101101001001010010000010001110010000111110011011010000000010010101010011100010111010000100110111111011100010000", + "111111110111110000110011011000110011100001001011101100110010000111001100000001111110110010000001000110001000101111100111000001100", + "101011001011011011001110010000001011011001110011001011110101000000001011011001000110001010111000000001011011101101100001011001011", + "010100100101010111011001010100010100010011110101011010000000110010110010110011001010000100010110010010101110011101010000110011010", + "101010011110111110011011111111111101010010111100100110001000101111101110110010100011100101010101101110110010000001001100110010111", + "000010111010011101011110110101000111101011000000000001011111101100111001001010010011011111101101001101100101000010001011001010011", + "010000010000000000010101001011001001100101001110010000101110011101001000100100011101010001100010011100000000110110111010100100001", + "100011111011100001101111111110100011100000110101111110110110000000011101111111111100110010100001111110011000101011100111111111110", + "110110001011010011110111100010010001011000001101100011100101000010001111100011001110001000111000100011011111101100100001100011001", + "011010101001000110000101101010011101001111100100101010000100110111111101101011001000000100110110101010111110011001010001101011001", + "100110001110110110100010100011111110101100000110100010011000101011100001100010101011100111010101100010110110000000001101100010101", + "001111111110001100000010111111001110010000101110111111011011101101100010111110010001011111001100111111110101000110001010111110010", + "101100000000001000101101110101001010010100001010011010111110011000010011010110010101010011100011010110000100110111111010010110010", + "101110111111110000110010011110101101100110101010000110110010000000101100110101111110110010000000001110001000101111100111010101111", + "001010011011011011001111110100010101011110010011010001110101000111101010001101000110001010111000001101011011101101100001101101000", + "010100110101010111011000101010010011010010000100001010000000110110011010000011001010000100010111111100101110011101010001100011001", + "011010010110111110011011000011111000110011100100010110001000111111000010100100100011100101010011100000110010000001001100100110100", + "000011110010011101011111110010100110010011011110000101011111110100100110111110010011011111101011100011100101000010001010111100010", + "010001000000100000010100101110101000011101010001110100101110000101010110110000011101010001100101010110000000110110111010110000011", + "100010100011100001101110011101000011111100110011000010110110001000001111010011111100110010100101001010011000101011100111010011111", + "110111011011010011110110101111010001001110001001000001100001001011001101001001001110001001011000001101011111101100100001001001001", + "011000101000000110000100101000011011001000000100110000000010110110011101100101001000000101010110111000111110011001010001100101001", + "100111010111110100100010011001111000101011100110111100011110101010000000011110101011100110110101100000110110000000001100000110101", + "001111101111001010000011110001001000010001011111010001011001101101000010100110010001011110001100100111110101000110001110111110010", + "101100000000001100101101110101001110010101010010100001111100001000110110001010010101001011100101010110001100110111111100010010010", + "101110111111110100110010011111001101111110110011101001010010011000101011000011111110101010000110001110000000101111100001010011111", + "001010011011011011001111110101110101000110001010111110010101011111101101101011000110010010111110001101000011101101100011110011000", + "010100110101010101000000101011110011001010000101001110100000111110011001100101001010010100010011111100110110011100010011111101001", + "011110010110011010001011000010111000100011100100010110101100110110000000100100100101100100110011100000100010100000101100110100100", + "001011110010011101000011110010100000010011011110000101011001110101000110111110010101011110001011110011100101100011101010100110110", + "010001000000100110011000101110101110011101010001100100101000000100110110101000011011010000000101001110000001010110011010101001011", + "101011111011100111100000111111000101111100110011111110110100001000101111111111111000110011100101111110011001011011000011111110011", + "111110001011010011111110100011010101001110001001100010100011011011101100100010111110010001011110100011010110110110100110100010101", + "011010101001000010001001101011111011001000000100101011100010101110011100101010110000011101010001101010110110000011010110101010101", + "101010001110010000000001100010011000101011100111100011111110110010000000100011010011111110110010100010101110001110001110100011001", + "000011111110001100000001111110101000010001011110111111111001100101000010111111001001001110001001111111101001001001001100111111010", + "101100010000001110011011001010001110010101010010101111011000000000110111011100010010001010000101100100011010010010010101011100010", + "101110110111100011111011100011001101111110110011010111010100011000101011011101111001001011100110001000000110001110001001011101111", + "000011010011100101101101010011110101000110001011000100010011011111101100001111000001110011011110101011000000001101011010001111000", + "010001100101011111011010001111110011001010000101100100101010111110011000101001001111110101010010010111110101101100101110110001001", + "010010000110110001100001011100111000100011100100011001100110110110000001101011010101111000110011001011001011111010111011110011000", + "001011111110011110010101001110100000010011011110111010100001110101000110110001101101000000001011101100001101111001101100101001110", + "010100001000101111110010001000101110011101010000011111010000000100110111010101100011001110000101101000111001011000011001000101111", + "101011110101110000101001011111000101111100110011010010000100101000101110011110100000100101100100111000100101010100000000011110111", + "110111001011000101001110010001010101001110001001110100000011111011101100000110111001010001001110111111000000010011001110000110101", + "010000100101011100001110110101111011001000000101100001100011001110011101101010110111111101001000111110110000100010111111101010101", + "100010011100000001000101111010011000101011100110101001111111010010000001100011010100011110101011010110101101101110110111100011001", + "000100111010011100000101010010111000010001011110111111110000100111000011110011001100101110010001010100101010111001110101110011010", + "101111011000001110010101110110010110010101010010101111010000000010110111011101100010001110000101100101111011001000000101011101100", + "110111101001110010111001010001010101111110110011010111001100011110101011011100000001001101100110001001100110010100001001011100000", + "011101001111100100101000000001101101000110001011000100001011011001101100001110111001110101011110111011100000000011011010001110111", + "111100100111011111011111010111110010001010000101100100111010011010010000101000010111110011010010001111010001100010101110101000010", + "001010001000100000100011010100111001000011100100011001100110010110001001101011010100111000100011010011001101111110110011101011000", + "101011111100011111010101111110100001110011011000111010100000010101011110110001101100100000010011100100001011111001100100110001110", + "100101001100111111110011001000101111111101010110011111010001100100101111010101100010101110011101100000111011011000000001110101111", + "111011111011101001101001111111010101111000110101111110001101101010111110111110100001000101111101111111100111010100011000111110111", + "100110001111001101001111100011001101001000001100100010001011111001101100100010111001010101001111100010100000010011011111100010101", + "100010101101000100001111101011100011001111100100101011111011001000011101101010110111111011001000101011010000100010111110101010110", + "100010001010001001000101100010000000101100000111100011100111010100000000100011010100011000101010100010001101101110110111100011000", + "110111111110000100000101111110111001010000101110111111100000000011001010111111001100101000010000111110001010111001110101111111001", + "101100001100010110010101101100010111110100001011000101010000100010111011101001100010001110010100001111111011001000000100001001100", + "010110110011110010111000011101010100000110101100011001001101111110110100101010000001001101111110110011100110010100001000101010000", + "101100001111100100101001101111101100111110010100011010001010111001110010110000111001110101000111100111100000000011011010110000111", + "101111110101011111011111000001100010010110000011111110111011011000000010110100010111110011001011000011010001100010101110110100010", + "011010010010100000100011011010100001010101100001110011100110010101001011011111010100111000100011011111001101111110110011011111010", + "111001101110011111010101101000111111110100111001110100100000010010111110000111101100100000010010111000001011111001100101000111101", + "110111000100111111110010101100110001111010110111000001010001100011001110001011100010101110011100011010111011011000000000001011100", + "011001100011101001101001110111010010111001000101001000001101101110010111100010100001000101111100010111100111010100011001100010100", + "110110011111001101001110101111001000101001010100011110001011101001000001010010111001010101001001010100100000010011011111010010111", + "100010100101000100001110110010000010110111111010101111111011010000000010011100110111111011001110100101010000100010111111011100110", + "000001010010101001000100011011100001010100011001110111100111001100011111011001010100011000101100101010001101101110110110111001010", + "110100101111100100000100011011011001001100101000100101100000001011011001101001001100101000010101111000001010111001110100001001001", + "101101000100110110010101110101010111100010001111100101010100101011111001101111100010001111110100001001111011001000000100001111100", + "010100110010110010111000000101010010000001001100111001001011111111010101101100000001001100011110010101100110010100001001101100000", + "101100011110000110101001110111101010111001110101111010001100111000010011010000111001110100100111000011100000000011011011010000111", + "101111110100011111011111000001100100010111110010011110111001011000100011010100010111110010001010100011010001100010101011010100010", + "011011010011100000100011000010100101010100111000100010100100000101101110111111010100100000100100111111000101111110110100111111010", + "111001111110111011010101101001011111101100100001101111000000001010111000000111101100111000010101111000000011111001100010000111101", + "110111000101111101111010101101010001100010101111011010110001111011001000001111100010110110011010011000100011011000000010001001100", + "011011111011101111110001111110110010100001000101111110101101100110010101111110100001010101111000111111111111010101011011111110100", + "110010001110101111000111100010001000111001010100100010101111100000000011100010111111010100101000100010110000110010111111100011111", + "101110101101100000000011101010000100110111111011101011111101010001100010101010110001111010101110101011010000000011011110101010010", + "000010001011101101001001100011100111010100011001100011100001001101111110100011010010011001001100100010001100001110010110100011110", + "111011111111000010011011111111011111001100101001111111100010001011111000111111001000101001010101111110001011001001010000111111101", + "100111010101110100011101000001010011100010001110010000010110111011011000010010010010010111110011000011110010010010000010010110000", + "011111110011010011100111000010110010000001001101111100101011100111010100011001111001010100011000111111101110001110001110011001100", + "101101011111000111110111101000001010111001110101010001101100100000010011000001000001101100100000011001111000001101011001000001011", + "101011100100011011110101001100000100010111110011000000011001010000100010101111001111100010001110011001001101101101101000101111010", + "011101000011000000000111110111100101010100111000101000000000001101101110100101010011100001000101110101010011011011011100100101010", + "111010111110101010000110101111011111101100100000001111000110001010111001101101101011011001110101010010000101011000001011110101101", + "111110000100000101110010110011010001100010101110010100110111111011001000000011100101010111111011000010100000111000111010011011100", + "010101110010101101100101111010110010100001000101101100100111100110010100000000100100110100111000101110111100100101100110011000100", + "110100001110110101110110011010001000111001010101001011100101100000000011011001001111001000101000011001011001101000101001001001011", + "100101100101110001011011110100000100110111111011011010000101010001100010101111001001100100101110001000111000011001011000110111010", + "000000010010100010100110100101100111010100011000100110011001001101111110101100101010000111001101110100110100000000010100110100110", + "111000111011011000101111010111011111001100101000000001010010101011111001110100010000111111010101000010110111000110010011101100001", + "101111010011110110101010100001010011100010001110010000110110011011011000010010010101010111100011010011100100110111101010011010000", + "010011110101001111001100000010110010000001001101101100101010000111010100000001111110110100000000100111101000101111100110000001100", + "101101011111011111101010001000001010111001110101001011101101000000010011011001000110001100111000000001111011101101100001011001011", + "000011100110000011010101001100010100010111110011011010010000010010100010110111001010000010010110010000001110011101010000110111010", + "101001000001001000111101010111111101010100111000100110001000001111101110110100100011100101000101111100110010000001001100110100100", + "010001111100101010100000001111000111101100100000000001011110001100111001101100010011011111110101010011100101000010001011110100010", + "110101000100001100110000010111001001100010101110010000101111111101001000000010011101010001111011000010000000110110111010011010011", + "000110110100111101100010111110110011100001000101111110110111000010011100111111111100110010111000111110011000101011100110111111111", + "000000001000101101010000100010001001011001010101100011100101000000001010100011001110001000111001100011011111101100100000100011011", + "111111100101110001111010101010000101010111111100101010000100110001111010101011001000000100110111101010111110011001010000101011010", + "100000100000111010000111100011100110110100011110100010011000101101100110100010101011100111010100100010110110000000001100100010110", + "101110100001010000001110111111001111001000101110111111011011101001101001111110010001011111001101111111110101000110001011111110001", + "101110101111110110001011001011001011100100001010011010111110011001011001010110010101010011100010111000000100110111111011001110010", + "101110101001000111001100110000101010000110101100000110110010000001010100110101111110110010000000100100001000101111100110100101100", + "100000101101010111101010001000010010111110010101000001110101000110010010001101000110001010111001101011011011101101100000001101001", + "111111101010001011010101110110010101010110000010110000000000110110101010000011001010000100010110011010101110011101010000000011000" + ], + "2": [ + "111111100110100100011101000110001011010001111010001101011010111010000011101101110110000001000010101101010011111010101001001111111", + "100000100000111000011010100101100101101111010101001001111111000100011010101100100110111001110010101010000101111001101111001000001", + "101110100100010111000100110010111111001010110011010011011011100001000100100011100101110111111100111010100001011000011100001011101", + "101110100100000101001010100000001110110000100111000111011101011010101001000111001110010100111101000111111001000100000001101011101", + "101110101011001001110000111111100001111101001111111111110111010111101110111110011011101100101111111110110110001001000000101011101", + "100000100011100011000001100010111111010100011111100010000100011111000000100011110101100010101000100011010110111000110111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001111001100011110100011100010010000101001100011100000111010011110100010101110101100100110100011100010001101000011000000000", + "001100111010110011111101111110111101100111100000111111001011101100011111111111110000100010001011111111010111111100110010111010000", + "101100011110100100011100010010001011010001111011101100111010111010000010001101110110011001000010001101000011100010101100100010110", + "001000110000111000011011111111100101101111010100101001111111000100011010101100100110100001110010101010000101100001101011011010001", + "010001010100010111000100000010111111001010110010110011011011100001000101000011100101101111111100011010100001010000011010101100000", + "000100100100000101001011001110001110110000100110100110011101011010101001000111001110000100111101000111111001001100000011110101100", + "000001001011001001110001101011100001111101001110000001110111000111101111100000011011110100101111100000110110001001000110110111011", + "010010101011100011000001111110111111010100011111110011100100010111000001110111110101111010101001110001010110111000110111110001010", + "100111001010100001110010000100001111111101000100000111001101011111110011110101000011011001001010101100001111100000101110110010110", + "101010101001101110100111101011100110111100111011001110010000101111000100101010101011101001010000101010001100100111101101101000001", + "011010001000010110101010100000111101100111011101011100001100001100110100111011000000101111110100111011110101010100011100000100000", + "100101111101010111110110010000001110000010100001000110010010111001110111000001001011001100011111000111101000001100000000111111100", + "001010001111001110011111011001100100010001110001101110000000100010011110011000111110110100100111000001111010001011000011100111011", + "110010110010110111111101111000111110000110010000010110101011111100011111110001111000110010001011110001001111111010110111001011010", + "101100000110100110011100000110001110010000111011101110011010101010000110001101110110011001000100001101011011100100101011000010110", + "001011110100111100011010100101100010001111000100101000111111010100011110101100101110100001110100101010001101100011101100101010001", + "010011011110010011000100110010111111001011111010110101111011110001000001000011110101101111111010011010111001010110011000000100000", + "000111111110000011001010111110001000010001000110111111111101010010101011111111000110000100111001111111100001001010000000111111100", + "000110001111001101110000100011100010011100010111100011010111010111110100100010011011110100101110100010101110001111000110100011011", + "011010101101100001000000101010111000010100011111101010100100001111011110101011111101111010101000101011011110111010110110101011010", + "100110001110100011110011100010001001011101001100100011101101001111101001100011010011011001001011100010010111100110101110100010110", + "101011111111101100100111111111100100011101101010111111110000100111011010111110100011101001010000111110010100100001101101111110001", + "010000010110010000101011010000111000100111001101010100101100011100101111110001000000101111100011010001101101010010011100010010000", + "100011111101010001110110010110001111100010101001101011010010111001110000001101000011001100000000001101100000001110000001010011100", + "001111010101001000011110011101100100010000100001101010100000101010000100001100101110110100111000001011100010001101000011110011011", + "110011110100110101111101100010111111000110110000110101001011000100011111100011110000110010010111111011010111111100110111111101010", + "101010000110100000111101101110001110010001111011100000111010111010011011000111110110011001000011100111000011100010101011111100110", + "000010101110111011111010001011100010001111000100000011111111110100000101100000100110100001110011100000000101100001101101001110001", + "010000001000010101000101011110111111001011111010110011011011111001011111010111100101101111111101010000100001010000011001010000000", + "000101101010000001101011100100001001110000000110000010011101001010110111010101001110000100111101001101111001001100000000110011100", + "001011001101001010110000001011100011111100010110001111110110000111110100101010011011110100111000001010110110001001000111001001011", + "010101101011100110100000100000111001010100011111011101100101101111000110111011110101111010110110111011010110111100110111100101010", + "100010011000100100010011110000001001111101001100000111001101100111101001100001000011011001010101100110001111100100101110011110110", + "101000100111101111100110111001100100011101101011101110010001011111000100111000101011101001001100100000001000100111101100100110001", + "011100000000010111101011011000111000100111001101010110001100001100101101110001010000101111110101010001110011010110011100101010000", + "101111100011010110010111100110001111100010101001101110010010011001101000001101010011001100011110001101101110001110000001100011100", + "001011010011001110011110000101100100010000100001101000000000100010000100001100101110110100100110001011111100001101000010101011011", + "110011111100110111011101010010111111000110110000110100101011111100000001100011100000110010001011111011001011111100110110000101010", + "100110001000100111011101100110001110010001111011100010011011101010011001000111100100011001010101100111010101100000101011100100110", + "001110100000111101111011111011100010001111000100000110111110110100011101100000101000100001101101100000001011100011101101011110001", + "010100010110010010100101000110111111001011111010110001111011010001011111010111110011101111100011010000111011010110011001001000000", + "000111111010000010001011111110001001110000000110111111111100110010101001111111000000000100100001111111100011001010000000111111100", + "000110001011001100110000100011100011111100010110100011010111010111110110100010001101110100101110100010100110001101000111100011011", + "011010101101100000100001101010111001010100011111101011100100101111011111101011110101111010101001101011010110111000110111101011010", + "100110001110100011110010100010001001111101001100100011101101001111101001100011000111011001001010100010001111100001001110100010110", + "101011111111101100000110111111100100011101101010111110110000100111011011111110101111101001010001111110001000100110001101111110001", + "010011001110010001101010110010111000100111001100010100101101011100101111100011010100101111100011111011111011010111111100111100000", + "100010101101010000010110101110001111100010101001100001010011011001110000000111000001001100000000000111100110001111100000111101100", + "001110000101001001111110010010100100010000100000100010000000001010000100100000101110110100111000100001100000001101100011101111011", + "110000110100110010111101011110011111000110110000110011101010000100011111010111110010110010010110010001010101111100010110010001010", + "101001011110100111011101000101101110010001111010100010011010111010011011010101100000011001000011001101001011100000101010010010110", + "000011100110111001111011000011000010001111000100001110111111101100000101101010101110100001110011101010001101100011101101001001001", + "010001011000010101000101101001011111001011111011111101011011110001011111111011110001101111111101111010111001010110011000100100000", + "000110100010000001101011101001001001110000000110000111011101010010110111100001000010000100111100100111100101001011000000111110100", + "001000010101001100110000001001100011111100010111001111110110010111110100111000001111110100111000100000100000001100100111100110111", + "010100111011100000100000011000111001000100011111010111100101110111000110110001110111111010110110110001010000111001010110001010110", + "100011001000100110010011011111001001100101001100101111101101100111101001001101000011011001010101001100001101100000001110000011010", + "101011101111101101100110000100100100000101101011101000110001011111001100001100101001101001001101001010001110100111001101001011001", + "011111001000010111101011010010011000101101001101110110101100001100110001100011010110101111110011111011111101010110011100100100000", + "101010101011010110010110101110101111101000101001000001010010000001101110000111000011001100011000000111100000001110000000100101100", + "000010000001001010011110110010000100000100100000000110000000101010001010100000101010110100100000100001100010001101000011111111011", + "111100110000110111011101011111111111010100110001010011101011100100011011010111110100110010001110010001010011111101110110010001010", + "100101011110100001011101100100001110001011111010000110011011111010000111010101100010011001010101001101001101100001001010010011010", + "000111100110111011111011000011100010000101000010001110111110101100000011101010101100100001101101101010001011100010001101001001101", + "011001011010010000100101101001111111011001111000011111011011010001011001111011110101101111100011111010111011010110111000100101100", + "000011111110000000001011111111010001110000000110111111011100010010101101111111000100000100100000111111100011001010100000111110100", + "000010001011001100110001100011001011100110010110100011110111010111101011100010001101110100111001100010100110001101000111100011011", + "011110101101100000100001101010010001011110011101101011100101010111011001101011110101111010110111101011010110111000110110101011010", + "101110001100100110010010100011110001101001001111100011101101100111101111100011000111011001010101100010001111100000101111100010110", + "101111111011101100000111111110100100001111101000111110110001111111000001111110101111101001001101111110001000100110101101111110001", + "011000010000010111001010111110101000111101001011110100101101001100110001110111010100101111100011110001111011010111110100010001100", + "101001111011010110010111000100011111101000101010000111010010100001101111010101000001001100000001101101100110001111101001110010000", + "000011000001001011111111100010100100000010100011001110000001001010000011101000101110110100111001101011100000001101111011001000111", + "110101111000110111011100001001100111000110110001111111101011100100011011011011110010110010010111011011010101111100001111000100010", + "101110000110100001111100001000100110001011111000100010011011111010000111000001100001011001010101000111001011100000111010100110110", + "000100110110111011111010101001001010000101000111001010111111001100000010111010101110100001101100000000001101100011101100011110001", + "011000011010010000100100111001000111011111111001110101011010010001011000110101110000101111100010110010111001010110011000010010000", + "000011101110000001101010111111001001100010000101001001011101010010101101101011000011000100100001111111100101001011000001110011100", + "000011001011001100010001100101110011100110010000101111110110010111101010101010001110110100111000110100100000101100101111001010101", + "011111101101100000100001110010101001011110011100110001100100010111011001110101110111111010110111000101010000011001011111000100101", + "101110001100100110010010001111001001101111001110100011101100100111101110000101000011011001010100001010001100000000010110100101001", + "101110100011101100000111010010111100011101101010100100110000111111000000001000101001001001001100001000001011000111010100011111010", + "011000010000010111001010111110010000111101001110010100101101001100110001101111010011101111100011110001111010010110001100010000000", + "101001111011010110010111000100100111101000101010100111010010100001101111001111000101001100000001101101100110001110000001110011100", + "000011000001001011111111100010011100000100100010101110000001001010000011100110101001110100111001101001100000001101000011001001011", + "110101111000110111011100001001111111010100110011111111101011100100011011000101110011110010010111001001010001111101110111000101010", + "101110000110100001111100001000011110001011111101000010011111111010000111000111100101011001010101011001001101000001000010100111000", + "000100110110111011111010101001110010000101000111101010111101001100000010110110101000100001101100011110001011000010000100011111110", + "011000011010010000101100111001111111011001111000010101011100010001011000111011110011101111100010111100111010110110100000010011111", + "000011111110000001111010111111010001110000000111111111011101010010101101111111000100100100100001111111100110101011111001111110111", + "000010001011001100001001100011001011100110010100100011110100010111101011100010001000110100111001100010100001001100110111100011011", + "011110101101100000100000101011010001011110011100101011100000010111011001101011110011111010110111101011010000111001010110101011010", + "101110001100100110000011100010010001101001001110100011101000100111101111100011000100011001010101100010001101100000001110100010110", + "101111111011101100011110111111100100001111101001111110110110111111000000111110101000101001001100111110001010100110001100111110001", + "011001011000010111011011001000001000111101001010111110101101001100110001011011010011101110000010010011111011110111110100000101110", + "101010100011010110011111101001111111101000101011000011010100100000001111011001000101001101100001000111100110101111101000000110011", + "000000010001001011100111001001100100000010100010101010000111001011000011100010101000110101011001100001100001101101111011011110100", + "110100111001010111001101111000100111000000110001010101101011100101111011111101110010010011010111110011010000011101001110110010001", + "101111001110100001100101111110100110001001111001101000011001111010100111110011100101011001010100111111001100100001011010110011010", + "000111101110111011111010000100001010011101000111101110111011001100100010101010101000100001101100110100001011100010001101101011101", + "011011001011110000110100010010100111000011111001010001011110010001011000101101110010101111100010100100111011010110111000000101100", + "000010101111000001110011001110001001101000000101100011011011010010101101001101000101000100100001001011100111001011100000000100100", + "000010000011101100000000010011010011111010010000000101110110010110101010000000001000110101011001001000100000101100101111011110101", + "011100110101110000101001011111001001000100011100010101100010010111111001101111110011111011010111110001010000011001011110110000101", + "101101011101110110001010100100001001110101001111100111101010100110101110001111000101011000110100001100001100000000010110110011001", + "101111100010001100010110100011100100000101101011001110110000111101100000100110101001001000001100101000001011000110010101101001010", + "011001011000010111010011001000010000100001001111011110101111001000010001000101010011101111100010001001111010010111101100000101100", + "101010100011010110010111101001110111110010101110100011010110100101001111000111000101001100000001011001100110001111100000000110000", + "000000010000110011101111001001111100011000100011001010000101001110000011110110101001110100111001111111100000001101100011011110111", + "010100111001111111000101111000111111011110110100010101101101100100011011011011110011110010010111111101010001111101010110110010010", + "101111001110011001101101111110110110010111111101101000011011111101000111101101100101011100110100100101001101000001000010110011000", + "010001101110110011110110000100011010011111000011001110111001001100100010110100101000100110001100101010001011000010010101101011110", + "110101001011001000111100010010111111000011111000010001011100010100011001011001110011101000000010111010111010110110110000000101111", + "000110101111100001111011111110001001101000000010111111010101010100001100111111000100100011100001111111100110101011100000111110111", + "000000001011011100001000100011011011111010010001100011101100010011001010100010001000010100111000100010100001001100111110100010111", + "111111101101100000100011101011000001000100011001101011101000010011111000101011110010111010110111101011010000111001011110101010110", + "100000100101011110000010100010001001110101001110100011100000100011101110100011000100111001010100100010001101100000010110100011010", + "101110100010100100011010111111100100000101101111111110110110111111000000111110101001001001001101111111001010100110010101111111001", + "101110101000101111011110011000000000100001001010010100101101001011110000111100110010001010000010110010011011010111100101010011110", + "101110101011011110011100011111110111110010101110101001010100100001001111010011100101001011100000111110000111001111101000110010000", + "100000100000010011100100100101100100011000100011101110000111001111000011101011101001110011011001010101000001001101111010001010101", + "111111100001010111001010110010111111011110110100010001100011100010111010101100010011110101010110100101110001101101001110000100000" + ], + "3": [ + "111111101100011010110000011000001111110000101100111111100110100111001010100011010011111001000011100111011011011011011101001111111", + "100000100011010011000011010111110101001101110101001000001111100010111010000110000110101100011110100001100000110101100111001000001", + "101110100100001000011011110101100011100100111010101100011000010011100000110011010011111001001011101010001110001110001100001011101", + "101110100001101100011010001011101101011111111101111100100100000100100110100000100100100100111100100010100100100100100101101011101", + "101110101001100111001111111110010010101011011000111110100110100100100100111110100100100100100100111110101100100100100000101011101", + "100000101110110111001001100010110001001101011100100011001111111000110101100011111001010011111000100010000110001110001111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000011011000111011100011110010101111100011100010001000011101000111100010101100000110101101100010101101100000110100000000000", + "011111110110111011100111111110001000010000011101111110110100001100011100111111111001010011111001111111000011011011011011100110001", + "101000011100011010110001011110001111110000111100100011100110100111001011010101010011111001000010011101001011011011011011010101010", + "111100101011010011000011100001110101001101111100100110011111100010111011011000000110101100011111011111100000110101100001011000000", + "111010001100001000011010001001100011110100100010110110000000010011100000101101010011111001001011110100001110001110001110101101010", + "111010100001101100011011010011101101011111111101001010110100000100100110011100100100100100111100101100100100100100100100011100100", + "010000010001100111001111111000010010111011011000111110100110100100100100100010100100111100100101100110101100100100100100100010100", + "010001110110110111001000010110110001001101011101101001011111111000110100100111111001001011111000100000000110001110001110100111111", + "000001000011011000111011010101110010110111100010101100000000011101000110010010101100011110101100101010101101100000110100010010101", + "010111100110111011100111001010001000011000010101011100110100001100011101100001111001000011111001000011000011011011011011100001111", + "101000011100011010110001011110001111111000110100100011100110100111001011010101010011111001010010011101001011011011011011010101010", + "111100101011010011000011100001110101001101100100100110011111100010111011011000000110101100000111011111100000110101100001011000000", + "111010001100101000011010001001100011110100101010110110000000010011100000101101010011111001010011110100001110001110001110101101010", + "111010100001101100011011010011101101011111100101001010110100000100100110011000100100100100100100101100100100100100100100011100100", + "010000010000100111001111111000010010111011000000111110111110100100100000100100100100111100100101100110100100100100100100100010100", + "010001110110010111001000010110110001000101001101101001010111111000110110100001111001001011111000100000001110001110001110100111111", + "000001000010111000111011010111110010101111111010101100000000011101000000010100101100011110101100101010110101100000110100010010101", + "010111111111111011100111111110001000010000010101111110110100001100011011111111111001000011111001111111011011011011011011111111111", + "101110001100111010110001100010001111100000100101100011101110100111001010100011010011111001010011100011011011011011011100100011010", + "111110101010010011000011101011110101000101111100101010011111100010111011101010000110101100000110101011100000110101100101101010000", + "110110001100101000011011100011100011100100101010100010001000010011100011100011010011111001010011100010001110001110001011100011010", + "110111111001101100011011111111101101010111100100111110100100000100100111111110100100100100100101111110100100100100100001111110100", + "010111000000100111001110101010010010101011000000111100101110100100100001100000100100100100100101100010100100000100100011100000100", + "011100111110010111001001011000110101000101001100000011000111111000110010110101111001010011111000011100001110101110001000110100111", + "000100001010011000111011000001110000101111111011100110001000011101000011111000101100000110101101111110110100000000110111111000101", + "010110101110111011100110101110001100010000010100010110100100101100011110101101111001010011111001010101011010111011011000101100111", + "100110000100111010110001010010001111100000100100101011101111000111001000111001010011111001010011101101011010011011011010111100110", + "111100110011010011000011011001110101000101111100111110011110100010111011000100000110101100000110000111100000110101100001000011100", + "110101010100101000011011010001100111100100101010101000001000010011100010000001010011111001010011100000001110001110001110000110110", + "110101100001001100011001010111101001010111100101001100100100100100100111010100100100100100100101001010100100100100100001010011100", + "010011000001100111001010101010010100101011000000111100101111000100100001100000100010100100100101100010100100000100100011100000100", + "011100111111010111001011011000110101000101001100100011000110111000110110110101111111010011111000011100001110101110001000110101111", + "001000001011011000111111000001110110101111111010110110001000011101000111111000101010000110101101111110110100000000110111111000101", + "011000101110111011100000101100001000010000010101010110100100101100011000101101111101010011111001010101011010111011011000101101111", + "101111000100111010110011010110001101100000100100111011101111000111001000111101010011111001010011101101011010111011011010111100110", + "111100110011010011000001011001110101000101111100111110011110100010111011000010000110101100000110000111100000110101100001000011100", + "111111010101101000011111010011100111100100101010101000001000010011100000000111010011111001010011100000001110001110001110000110110", + "110010100001001000011001010111101001010111100101000100100100000100100001010010100100100100100101001010100100100100100101010011100", + "011001000001100001001010101110010100101011000001110100101110100101100001100000100010100100100101000010100100100100100101100000100", + "011111111111010001001001011110110101000101001101100011000111111001110110110101111111010011111000101100001110001110001110110101111", + "001010001011011000111111000111110010101111111011000110001000111100100111111000101010000110101100000110110101100000110101111000101", + "011011111110111001100000111110001010010000010100111110100101101101011000111111111101010011111000111111011011011011011010111111111", + "101110001100111000110010100010001011100000100101100011101111100110101000100011010011111001010010100011011011011011011010100011010", + "111110101011010001000001101011110011000101111100101010011111100010011010101010000110101100000110101011100000110100100000101010000", + "111110001101101000011111100011100111100100101011100010001001010010000000100011010011111001010010100010001110001111001110100011010", + "110011111001001000011011111111101111010111100100111110100101000101100001111110100100100100100100111110100100100101100101111110100", + "011010001001100001001001001000010100101011000001100110101111000100000001101100100100100100100101001100100100100111000101101100100", + "011101100111010001001001010000110101000101001100010011000110011000010111011101111001010011111000000100001110001101101111011101111", + "001011010011011010111011111010110010101111111010100110001001111100000111000010101100000110101101001110110101100110010101000010101", + "011010110110111001100100010001001010010000010100100000100101101111111000100111111001010011111001100001011011011101111010100111111", + "101110000100111100110011010110001011100000100100000101101111100010001000010011010011111001010010101011011011011111011010010011010", + "111101100011010110000011101110010011000101111101110100011111100000011010100000000110101100000111100011100000110101100000100100000", + "111111011101101000111110011110100111100100101011100010001001010100000000110101010011111001010010101100001110001110001110110011010", + "110010101001001010111011000111001111010111100101110110100101000011100000011000100100100100100100100110100100100101100100011110100", + "011001001001100011001001001001110100101011000001100110101111000010000001101101000100100100100101001100100100100111000101101010100", + "011110100111010010001001010000010101000101001100001011000110011001110111011100011001010011111000000100001110001101101111011101111", + "001010010011011101011011111010110010101111111010101110001001111101100111000011001100000110101101001110110101100110010101000010101", + "011010110110111011100100010001001010010000010100101000100101101011111000100110111001010011111001100001011011011101111010100111111", + "101111000100111111010011010111101011100000100100011101101111100011001000010011010011111001010010101011011011011101011010010011010", + "111111100011010100000011101110010011000101111101100100011111100000111010100000000110101100000111100011100000110011100000100100000", + "111110011101101101010110011110100111100100101011100010001001010100000000110101010011111001010010111100001110001100001110110011010", + "110011101001001011100011000111001111010111100101110110100101000011000000011000100100100100100100111110100100100010100100011110100", + "011001001001100011000001001001110100101011000001100110101111010100000001101101010100100100100101010100100100100000100101101010100", + "011110100111010010000001010000010101000101001100001011000110001001110111011100000001010011111000001100001110001110001111011011111", + "001010010011011101000011111010010010101111111010101110001001100111100111000011010100000110101101000110110101100000110101000000101", + "011011111110111011100100111110000010010000010100111110100101110111111000111110100001010011111001111111011011001011011010111111111", + "101110001100111111000011100010000011100000100100100011101111110001001000100011010011111001010010100011011011000011011010100011010", + "111110101011010100000011101011101011000101111100101010011111111000111010101010000110101100000110101011100000101101100000101010000", + "111110001101101101000111100011001111100100101011100010001001010000000001100011010011111001010010100010001110010110001111100011010", + "110011111001001011000011111111100111010111100101111110100101001111000000111110100100100100100101111110100100110100100100111110100", + "011010010001100011000000110001100100101011000000001000101111010010000000100110110100100100100100100000100100111100101100100010100", + "011111100111010010100001010110001101000101001100011101000110011111110110110011100001010011111000101010001110010110000110110001111", + "001011000011011100101011001110001010101111111010000100001001110101100111000000110100000110101100000010110101101000101101000000101", + "011010111110111010000101011110000010010000010100100010100101101011111000010101100001010011111001111101011011010011000010010101111", + "101111001100111111011011000110000011100000100101110111101111110001010001011001010011111001010011011111011011011011001011011001010", + "111101101011000100111010101001101011000101111100100110011111111000101011101100000110101100000111010101100000110101100001101100000", + "111110000101110101000111010001001111100100101010101010001001010000000000111101010011111001010010101100001110001110001110111101010", + "110010110001011011010011011011111111010111100101001110100101001111001001100010100100100100100100000110100100110100100101100010100", + "011010010001101011011000110001101100101011000000001000101111010010010000100110100100100100100100100000100100111100101100100110100", + "011111100111011010101001010110000101000101001100011101000110011111101110110011111001010011111000101010001110010110000110110011111", + "001011000011011100111011001110010010101111111010000100001001110101100111000000101100000110101100000010110101101000101101000000101", + "011010111110111010011101011110011010010000010100100010100101110011101000010101111001010011111001111101011011010011000010010101111", + "101111001100111111000011000110011011100000100101110111101111110001010001011001010011111001010011011111011011011011000011011001010", + "111101101011011100111010101001111011000101111100100110011111110000101011101100000110101100000111010101100000110101111001101100000", + "111110000101111101010111010001000111100100101010101010001001001000000000111101010011111001010010101100001110001110001110111101010", + "110010110001011011010011011011100111010111100101001110100101011111001001100010100100100100100100000110100100100100100101100010100", + "011010010001111011011000110001101100101011000000001000101111011010001000100110100101100100100100100000100100100100100100100110100", + "011111100111011010101001010110001101000101001100011101000000011111101110110011111000110011111000101010001110001110001110110011111", + "001011000011011100111011001110011010101111111010000100001101110101111111000000101101100110101100000010110101100000110101000000101", + "011011111110111010011101111110011010110000010100111110100001110011100000111111111000110011111001111111011011011011011010111111111", + "101110001100111111000011100010011011000000100100100011101011110001010001100011010011111001010010100011011011011011011011100011010", + "111110101011011100111011101011111010000101111111101010011111110000101011101010000110101100000111101011100000110101100001101010000", + "111110001101111101010111100011000111100100101000100010001111001000001001100011010011111001010011100010001110001110001111100011010", + "110011111001010011010010111111100110110111100000111110100111011111010001111110100100100100100101111110100000100100100101111110100", + "011010011001111011011000011111101101001011000100100010101011011010010000110100100101100100100101111100100010100100100100110100100", + "011111101111010010101001000110001100000101001100010111000110011111110110011001111000110011111000111110001000001110001110011001111", + "001001001011011100111011101000011011101111111101100110001111110101111110101100101101100110101101110100110111100000110100101100101", + "011010100110100010011100110000011010110000010011101010100111110011110000111101111000110011111000101101011001011011011010111101111", + "101110010100100111000010011010011011000000100111101111101011110001010000000011010011111001010100100111011011011011011010000011010", + "111110110111011100111010110001111010000101111101101000011111110000101011100110000110101100000001000001100000110101100001100110000", + "111111000111111101010110110111000111100100101100011100001111001000001001010011010011111001010100001010001110001110001111010011010", + "110011100111010011010010101111100111110111100010100100100111011111010001000000100100100100100001000010100000100100100101000000100", + "011010011001111011011000011111101100101011000110100010101111011010010000110100100100100100100101111100100010100100100100110100100", + "011111101011010010101000100110001100100101001100010111000110011111110110011001111001010011111000111110001000001110001110011001111", + "001001001111011100111010101000011011001111111101100110001011110101111110101100101100000110101101110100110111100000110100101100101", + "011010100100100010011100110000011010110000010011101010100111110011110000111101111001010011111000101101011001011011011010111101111", + "101110010100100111000010011010011011100000100111101111101101110001010000000011010011111001010100100111011011011011011010000011000", + "111110110011011100111010110001111010000101111011101000011111110000101011100110000110101100000001000001100000110101100001100110011", + "111111000111111101010110010111000110100100101110011100001101001000001001010011010011111001010100001010001110001110001111011011001", + "110011100101010011010010001111100110010111100100100100100111011111010001000000100100100100100001000000100100100100100101010000111", + "101010011101111011011001111111101101101011000100100010101101011010010000110100100100100000100101111110100100100100100100101100100", + "010001101011010010101000100110001100100101001110010110000110011111110110011001111001010101111000111000001110001110001110000001111", + "110101001111011100111010001000011010101111111011100100001011110101111110101100101100000000101101110010110101100000110100110100101", + "000110100100100010011100111110011010110000010101111110000111110011110000111111111001010101111000111111011011011011011010111111111", + "000000001100100111000011100010011011100000100000100011101101110001010000100011010011111001010010100011011011011011011011100011000", + "111111101111011100111011101011111010000110111011101011111111110000101010101010000110101100000110101011100000110101100000101010011", + "100000101111111101010111100011000110100111101110100011001101001000001001100011010011111001010010100010001110001110001110100011001", + "101110101011010011010010111111100110010001100101111111000111011111010001111110100100100100100101111111100100100100100100111110111", + "101110101101111011011000010001101101101001100100101011101101011010010000011100100100100000100101101001000100100100100101100100100", + "101110101101010010101000111010001100100110001111101011100110011111110111000011111001010101111001000111101110001110001110110011100", + "100000101001011100111011010000011010101110011010101001001011110101111111100110101100000000101101000000010101100000110101100110100", + "111111100000100010011100010110011010110001110100111001000111110011110000110011111001010101111000101011111011011011011010110011110" + ] + }, + "29": { + "0": [ + "1111111011010000110010101101111110001100100110010001100100101111001011000101101110101110010101011001010001001001010110110111101111111", + "1000001010011001101110101000110110110000100110001001010101111100110110000101001000101000011011010111101000111000100011010011101000001", + "1011101001010010110000011010101110101101010000111110100011100000101010011001001011001011111000110100010100110101101110001100101011101", + "1011101010100111110110010110000101000000010010000000100001101011101111010010010001010001001000001100100000110110101001001010001011101", + "1011101000101010101101001111111110110110011100100100111110011010001011110110111111110010010010000101111111101101010010010110101011101", + "1000001001111110010001001001100010000010110001000100100010110100011111001011100010011001010011100110100011100000001110001111001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010110100000101110101100010011000100111110110100010101000000011010111100011111010110000000100100010111001010110000100000000000", + "1011011101000011101010101001111110110011111111010111111110111100001100000110111110111001010011100100111110100101011011011000001001011", + "0110000011010000110010101101100110001100100110010001101010101111001011000000101110101110010101001000001011001000010110110111011000111", + "0111101010011000001110110101010100110000110110001000001011111100110110000011010000101000011011001110010110111000100011010110101110110", + "0100010011011010110000000010001100101101011000111110011101100000101010011110010011001011111000101100101010110101101110001110101101010", + "0111011100110111110110000101100101000000011010000000011011101011101111010000001001010001001000010100101110110110111001001001110001001", + "1001110000100010101101010110011100110110011100100100011110011010011011110101100101110010010010000100101011101101001010010010010100010", + "0001011011101110010001000011100000100010110001000101000010110100000111001011111110011001010011100111011111100000010110001110000111111", + "0001000111111111011110101110100011100011111100101101001111110011000000001101100110100001101011011110011001100010000101011001011111000", + "0100001011111101011100011111111110100101010001100000111010001010110010110001001010001111100101010010011010010011100101101100110001001", + "0011100110100101011111000000001010000001000011111100000111000010101110101101000010110011111000100101100110100101111011011010110001000", + "0100111001001011010101101110001111001011101101010011010000100111101101011000001010001011000000010101001101100011111000001101110111101", + "0110100101110100000110110100111010111011100110001000101011010110011100101000100100000101001110011010011100000011011000111000011011110", + "1010111001001010011011101000001000001101110101101101110110000110000010111101100101100100100101111001000011011011010100100100011000100", + "0010100011101001110110001101000111101101010111111111000101000001000000101110111110101001001101011111110000110110010001001001001001011", + "0111101101010000100111110101010110010100000100010011010100000010110001111101001000101111100011010001101001010110100000111000110111010", + "1100100010000010110011000011001110001110010001000001100010011110101101100000001011001100000000110011110100001111101000110100110100110", + "1111011010100110000111000100100101111110001001111010100001010001101001101010010001010100111000001001000001001000111110110111101100001", + "0101010000010011101001110110111100110111110111001011010001110100011000011011110100000101001111110011010000010011001101101100000011100", + "1001011110100010111000000011100010100110000100111110111101001010000000110101000111100110101100011000100000001110010101100000011000000", + "1101110000101001011101101111100001100000111100110010110000001101000111110011011111011110010100100001000111011000000011100011000000111", + "1100111111111000101101011110111110111011000010111010111110110000110100001010111111010010010010001111111111101101100010010010111110010", + "1111100010000000011011100001100010000000111011110011100010101100101101000011100011000010100000110011100011011011111100100101100010110", + "1100101010001111111100101111101011001110011111001000101011011001101010100111101011110010111000001011101010001101111011100011101010001", + "1010100010110100000101110100100010111001100111110111100010101000011011010110100011111100110110000101100010111001011110000010100010000", + "0010111111001101101010101001111110010010000100010110111110111100100100000110111110111101010101100101111110100101010011011010111111100", + "1110010001001000110010101101100101101100001100010001111010101111100011000001001001011110010100101000101111001000110110111110010100111", + "1111111110010000001110110001111100010001010010001001011111111101010110000011100101010000011010101110001010111000000011001110010010110", + "0000010011000000110000000001100000001101110001011111000011100001001010011110011110110011111001001100011110110100001110000111100001010", + "0111001000100011110110001100100011100001111001100000001111101010101111011000100110001001001001010101011000110111011001010001011001001", + "1000000010110100101101010010011110110111001101000100111010011010011011111101001111110100010110000010011011101100001010001010010110000", + "0000101001100010010001011001101010100011110010100101100110110100000111010010100100011111010101100000000111100000010110000111010101100", + "0001110111101111011110110110001111100010011100101100110001110011000000010100001100100111101101011000001101100010000101000001110101011", + "0111101011111011010100011110111010100100110010100001001010001010010010100000000010001011100011010111111100010011110101110101111011010", + "0000110100100101010111001010010000000001100001111100010111000010011110101100100100110011111001000101000010100101000011001011111001010", + "0101101101001011010101111110101111001010001001010010000100100110010101011000111110001011000001110101000001100011000000001101001001101", + "0111100101110110000100110011010110011011000111101001100101010111100100101000101000000101001111111010110000000010110000111001010111100", + "1010101101001110000001100101010111001100010100001101111010001111001010110101001011100100100100111000101100011010111100100100110100100", + "0011010001110111111100001011001101101100010110011111111000001001001000100110010100101111001101011001001001011111010001000001001101011", + "0110011111000100101111101111000100110101000100010011011001111010110001100100010010101001100011010110111000111110100000110001100011010", + "1100010010011010110101011011100011001111110001000001010101100110101101111001100001001010000000110101100000110111101000101100011000110", + "1100111000101000001101000101110001111111101001111010010001100001001001111011011001010000111000001100100111110000101110101110100000001", + "0110000010001011100101111100100111110111010111001010100001010100101000011010010010000101001011110011110100000011110101111101001111110", + "1000001000110110111100010011011010100111100100011111101001001011111000110101010011100110101010011000101100001110101101100000100100011", + "1100110110111101011101101000001101100000011101010010111110001100111111110011110011011110010010100001101011011001101011100010001100100", + "1100111111111000110111010011111111011010100010111011111110111001111100000011111111010010010100001110111110101100001011010010111110001", + "1110100010011010010011100111100010100001111010110010100011100100100100001011100011000010100000110100100010110010111101001100100010110", + "1101101010011111110000110101101011101110011110101001101010100001101011011110101011110010111000001101101011100101111010001011101010001", + "1010100010101100000111101100100011111101000110010111100011010000011010101110100011111100110110000010100010000001011110111010100010000", + "0001111111000101100000101001111110010110000101110111111110001100100100110110111110111101010101100000111110011101000011100011111111100", + "1101000001010000111110100111111010101110001101110001110110001111110011100001100111011000010000101000100001011000101110100110011000101", + "1110001010000000001010100100010110010101010010101001100011111101001110000010001111010110011100101110110010111000011011010111110010101", + "0001100001010000110000000101110010001011110001011111101111100001010010011110100100110101111111001101001110110100000110001111010011001", + "0111111110100011101100001000101110000010011000111001011001100010100111011001101100001101001111010101001101110111010000001001010011010", + "1000100010101100100101010001101010010100101100010101001011010010010010111101000011110101010110000011111100000100001011111010111100000", + "0000111101110010011101011000010000000011110011001110110111001100000110110011000100011110110101100000000010001000010111100110111001100", + "0001100101110111011100110110010110100110011101010110000100001011000001110100111110100110001101011000100001011010000101100001001001011", + "0111101101110011010110011110110110100001010011011110000100111010010010001000001000001010000011010110010000101011110101010100110111010", + "0000100110111101010011001010010111000010100000001011111011100010011110000100001010110101111101000011001100110101000011000011110101000", + "0101011111011011000001111111001101001110101001110011011000100110010101000001010100001101000111110011101001100011000000000100101001110", + "0111010001100110000110110011000100111101000111101101011001010111100100110000010010000011001001111101111000000010110000100001100101111", + "1010011101001110011001100101000011100111110101001000110100001111001010100100000001100000100010111100100000011010111101111100111110111", + "0011110111110111100110001010110001001111110111000110010010001001001001100110011000101110010101011000100111011111010000110001100111011", + "0110001110000100111011101110100110110101000101101000000011111010110000000101110010101000011011010110110110111110100001010000001111010", + "1100000011011010100001011011111011000011110000111011101111100110101100011001010011001011111000110101001110110111101000001100100100110", + "1100111000001000011101000101101101110010001000000101011001101001001001010011010011010001001000001101001100110000101110001111101100001", + "0110010001001011101101111100100001100100010110111101001000011100101000110010111100000011001011110101111101101011110111110101000011110", + "1000111010110110111100010010100000110011000100011110110100110011111000101100111001100000101010011110000001100110101101101001000100011", + "1100000010111101010101101000011111111110011100110110000011110100111111101011001001011000010010100110110011100001101011111010111110100", + "1100111111011000100011010011111111001001000011111110111110001001111110010010111111010110010100001010111110010100001010001010111110001", + "1110100011111010011001100111100010110010011010101010100011000100100110001011100011000011111000110100100010100010111110111100100010110", + "1101101011011111100001110100101011111110011110110010101010100001101101011110101011110011000000001100101011100101111001101011101010001", + "1010100011101100010101001101100011100101000110001100100011010000011100101110100011111101001110000011100010000001011001011011100010000", + "0001111111100101110010101000111110011111100101101000111110000100100000111111111110111100100101100000111111011101000100100010111111100", + "1101110000010000110110100110101110111111001101100111101001000111110010101000101101011000010000101110110100110000101011001111010010101", + "1110101100000000001100100100001010000011110010101000010000000101001111111011000011010110011100101001000101010000011010111110011100101", + "0001110001010000011001100101110000010111110001011010001100011001010011100110100100110101111111001010001000001100000110110111011001001", + "0111101110000011011001001000010110010100011000100101001011010010100101101000011110001101001111010000001011001011010000110001101001010", + "1000100011001100001111110001010110000100101100011100101011110110010000011100001001110101001110000011110110010010001001101011110111100", + "0000101110110011101100011000110110010111110011011110111111001010000000110010101010011110101101100001101010001110010101100111110100000", + "0001010110110111001110010111101100111000011101010111111000001101000111110100110100100110010101011001101101011000000011100001001000111", + "0111011001010010100100011111100100101001010011011110011000110000010110001000110010001010010011010111001001101001110010010101000100010", + "0000110101111100111011001011100011010000100000001010100100101000011111000101000000110100111101000011011001011101000110100010111111000", + "0101111111011011110111111110010001011100101001110001101011011110010100100000011000001100100111110010111110001011000001100101000111110", + "0111100111100111001111010010000110100101000111101011011010101111100101010000010010000010101001111100011110111010110000000001101111111", + "0010111011101110010100100101011011111111110101001011000110111111001000000101110011100001000010111100000110100110111101011000000100111", + "1111010000010111010100101010001101011011110111011110110000101101001011000011010010101110010101001001001101001001010010110110101100111", + "0010101000000100111010101111000000100001001101110100001001111100110110000010011100101000011011001110011100111000100011010111000010110", + "1100010011011011100011111010100001010101110000100110010101100000101010011111011001001011111000101100000000110101101110001110100101010", + "1100011010001001111111000100111111110010001000010001000011101011001101010001101001010001001000010100010010110010101001001100011111001", + "0110000011001010001101111101010101100110001110110100010010011110101001110001110110000010010011110101101111101011110000010100001001110", + "0100011010110110011010010011111010110001011100001100000110110011111001001101110101100001010010011111010011100110101100001000101010011", + "0000110100111100010100001001011001111110011100110000000001110100111110001011001001011001101010100111000101100001101011011010110100100", + "0100111111111000100010010011111111011001010101111111111110001001111110110011111111010111100100001010111110010000001011101110111110001", + "0010100011111010111001000111100010101110011110110111100011000000100110101110100010110011111000100101100010100100111111011011100011010", + "1001101011011111100001110100101011110010010000101110101010100111101101011001101010001011000000010101101011100011111000001100101011101", + "1010100010001101010101001100100011100011000100010001100011010110011100101000100010000101001110011010100010000011011000111001100011100", + "0001111111000100010010101001111110010111100101111100111110000110100010111100111111100100100101111000111111011111000100100001111110100", + "1101010110010001010110100111010010100101010101101111001011000101110000101011111111011001001000101111001010110000101001001111001000101", + "0010001011100000101100100100110010010111101100111011001010000101001001111011001001010111100100101001110111010000011000111110101110101", + "1101010110110001111001100101010000001011110111011100111100011001010101100111001010110100000111001010001010001100000000110110101101001", + "1111111111100011111000001001101000000010001000100101011011010010100001101000110100001100111111010000101111001011010110110101010001010", + "0100000001101100001111010000000000011000101110000001111111110110010000011000010010000101001111110011001010010010001101101100110101000", + "0100111100010110001101111000000100011111111011000010000011001010000000110100000001100110101100011000111110001110010101100001111111000", + "0001110111010110001110110110110100111000011011001010101110001101000111110011011001011110010100100000011001011000000011100010100110011", + "0111101111110110100101111110100010100001010011001011011010110000010100001010010011010010010010001110011011101101110010010111101111110", + "0000110011111010111011001010111111001000111000000010100110101100011101000110010010110100100101000010100111011011000100100010100100100", + "1001011000111001110110111111101001001100110111100000010001011000010010100000001010001100111111110010101100001101000011100101110100010", + "1011100000000101101110010011100110111101000001101010001010101001100011010001100100000010110001111100111100111000110110000000011010011", + "0010011010001001010101111100000101101111100101001000110110111101101100000101000001100001010010111101000010100100111011011000111101111", + "1110010010110110010101010011011011000011110101011010100100101111101011000011011001011110010100101000010001001001110110110111101110111", + "0010001010100011111011000110110010101001001101110100110101111101010110000010110111010000011010101110001000111000000011010011001000110", + "1100010010111011000011001101111001010101110110100111000011100001001010011110110100110011111001001101110100110100001110001011001011010", + "1111111100101100111110111011111001111010001000010000000001101010001111010001101000001001001001010101000000110111001001001000110101001", + "0001000101001101001101111111101001111110001110110100010000011010101011110100000100000010010011100100010001101100110010010010010010010", + "1101111101010100111011000010000100100001011010001101111100110101111111001010000111100001010010000111000001100000101110001110011001111", + "1100010011011111110101010000011101100110000010110001010001110010111000001101011111011001101010111111100111100011101101011001000001000", + "1110101100110111100011000000111111011001011011111110111110001011011010110000111111010111100100010011111110010010011101101100111111001", + "0000000011011011111000101001100010101110010000110110100011000010010110101101100010110011111001000101100010100100000011011010100011010", + "1111111011100000100000001111101011010010011110101110101010100110010101011001101010001011000001110100101011100011000000001100101011101", + "1000001010010101110101101010100010100011001000010001100011010111100100101000100010000101001111111010100010000010110000111001100011100", + "1011101001011001010011010110111110110111100101111100111110000111101010111100111111100100100100111000111111011010101100100100111110100", + "1011101010011110010110100100001000000101011101101110111011000001111000101110001100101001001000111111101110110111101001001001010001001", + "1011101011101010001101110100000000010111100100111011111110000011001001111100000010101111100100110000001011010110011000111000110101010", + "1000001000100010011000111101000100001011110111011100100010011111010101100001100001001100000111010010111110001110000000110100111110100", + "1111111011110100111000011010010101000010000000100101101111010000000001101011011001010100111111001001111001001001000110110110100110011" + ], + "1": [ + "1111111011110101000100011100001101010101001111010101000100101101100000101001111001001000010001001110001010110110001010110111101111111", + "1000001001101010011100100110000010011011001000011101010101111101010001111011001111001110011101001000010111010110111011010111101000001", + "1011101011011110111001101101111101111000101011111110100011100001001101100111001100101101111110101011101010001111100110001000101011101", + "1011101010100001110000010100000111011001010001011111000001101010101011101000110000010101001110010001001111001100100001001110001011101", + "1011101010101100110101001111111111010111110101010011111110011110011010011100111111100010001011100010111110010101110000010010101011101", + "1000001001011100010010001000100011010100011111010101100010110010000110110010100010000001001010000000100010001000101100001011001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001101011001001011000100010110111111100110110100010101110011010101110100011100010101001100011100010000000110000000000000000000", + "1111001011001100010111110100111111000101111101010101111110111110100110110111111110100001000010100001111111011000101101011000010011101", + "0001010101110101100100011000010011010101001111001100101010101101100000100101001111001000010001011001100000110111001010111111001110101", + "1110101001101010111100110101010100011011001000000011011011111101010001100100001001001110011101010111110001010110111011011110001000101", + "0100110011011111110001100101111001111000101011100000100101100001001101111000001010101101111110110101101100001111100110010110001011001", + "1010101010111001101000001101000001011001010001011000000011101010101011111010010100010101001110001101001001001100110001010100010001010", + "1111000110101100100101000101001111010111110101010110010110011110001010011111110011100010010011100011011000010101101000000101110101110", + "0010011111011100010010000001100101010100000111010100101010110010011110110011011000000001010010000000100000001000110100001001011110011", + "0010010111110000001010010010010001101100111111101100101111110101011001110101000000111001101010111001000111011011100011011011000110100", + "0100111000100010110001000010011101100011010011100010111010000000011000000000101010010111100100010111110100101110010011101110101000001", + "1010110000000000011001110101111110100000110010100001000110001000000101001000100011010101111100110100001100110010100111010010100001011", + "1101111010101001111111101110001110111000010011011000000001011110001010111111010011101101000110001100101011100101100000000101010011111", + "1010000101000001010111010011001110110110011101010110010010101111111011001110111101100011001000000011011010000001010000100000111101101", + "0011001110100100000101100000101101010100111000110101101110110111000100010111111000100000100011100000100100011001011100111001111000110", + "0100000101001111110110011110110101001100101000001101001101100101010011000100101000111001001100111000000011011110110001011110101000111", + "0100111001100010100111110111010011100010110111100010011100000100101110000101101110110111100010110110010110111110000000111111101110110", + "1111100000001101100001111110111100000001010100000001000010011000110010011000101101010100000001010100101010110110001000110110101101010", + "1111111011111001101001011000000110111000001000111001100001011011000111011011110001001100111001001100101111110101001111110101110001001", + "1100010110110110101101000010001000010110000100010111110000111110110010111110010101100011001011100010111010000100010100000100010101110", + "0000011111000000010000100010000011010101111111010100101100110011100110110010011110000000101010000001000110001000001100001000111110011", + "0001010110011010001100001000010101101101000111101100101001110100100001110101000110111000010010111001000001011010001011011011100110100", + "0101111110010010010010010111111111100010001111100010111110000001110010000000111110010110010100010111111110101011101010101111111110001", + "1001100010100010111010110010100010100001000100100001100010001100111110001001100011010010100001010101100010110101011100110010100010110", + "1111101010111101011100101100101010111111101100111000101011011001110101011111101011101010111001101101101011100011011011100100101010001", + "1001100010111011010111001000100010110001100010110111100010101000000100101110100011100100110111100011100010000010111110000001100010000", + "0010111110010100000100110100111111010010100101010100111110110100001010110110111110100101010100100001111110011010100010011001111111100", + "0111100011101010110110011000100001001000111111001101100011100111001001100100010100111001010000111000001001011111101111011110010100101", + "0110011011110110000110010001101111100010101001100011010110000100110000000100010010110111111100110110111000111110011010111110010010101", + "1100000001110100000001100010000100000001001010000001001010011000101100011001111001010100011111010101100000110110000110110111100001001", + "1110001011001000101001010101010100111001010100101000001101011011101001010011000001001100101111001100100111110001010001110001011001010", + "0011100110010001101100000111111010010111110010001110111000111010001000110011001111100100010111110101010110000010101010001011010010000", + "0111101011010001110001001000011001010010000001001011100000110100011000101100100100000111010100011110001110001110110110000110110011100", + "1011110111100000010100011111101001101010111001110010100111110011011111101010010100111111101100100110001101011001100101000000010011011", + "1001001100100010110010001110001111100100010011100101010110000010111100010010011010010011100010001011111100101100000100110100011101010", + "1101000110000111000011110101001100100101010010100100001110001010110100001011111001010100100101010101100000110010011010100011111001000", + "1110001001101101011101000100110100111001101010111000001101011111110011011111001001101100111111101101110011100101011001100101001001110", + "1000110111000010111101000100110010110111100100110111101100101110000010101111010111100010110001100011001110000000111000000001010111111", + "0111101111100101010100111000100001000100100001000101111000111110001100111110110100100001010010100001010011011100110100011100110100111", + "1000110100111010111111011000111001010100111001010101111010101001011011101000001101001111001100101110000100110001110001010000001001011", + "0001011101010111000011111110110110011100110111111101011111111010101110011010000011001001100010101000110001010000000000110000000101010", + "0110010010010101111101110010010101111111010100011111000011100110110010000111111000101010000001001011100000001100001000101101111110110", + "0010011111101001101101010101010101011111001100111110001101101001100101001001000000010000111001010000100111001111011111101111000110001", + "1011110001000001110001000011111011010011100010010010111000011100000000111101001111100010010111100011010110010100101110010101001111100", + "0011101101100000110110101001011001010100000001010101100000110010011000110010100100000001010100000000011110001000110110001000100100000", + "0011100101111001100010111111101001101100111001101100110111110101011111110100001100111001101100111000010101011011100101011010001100111", + "0001111110110011100010101110111111110010010111110011111110001000111110001000111110010111100010010111111111101010000101101010111110010", + "0101100011110111010000010100100010111001010100111000100011000100110111000100100010100010100000100011100011011100011001011100100010110", + "1010101010001000011111100100101011000111101101000111101010100001110100100000101010010010111000010010101010001011011010001010101010101", + "0000100010100011001011000101100011001001100011001001100011010000000101010000100010011100110110011100100010111010111110111010100011000", + "1111111110000000000000011000111110110010100000110011111110000100001000000100111111111101010101111100111110100110110010100010111110000", + "0000000010011110101011011000001100001000111000001001110101000011011011000111111000111111001100111000111111001001110101001111111001011", + "0101001111010110000000011111000011100100110111100011100000000010101110000100010110110001100010110110111110111000000000111110010111010", + "1110100010010010001111110011000000000111010100000001101000011110110010011000110101010010000001010101000110110100001000110110010100110", + "1010101111101101111001100101111000101110001100101001001111010001000101010011110101001000111001001100001100110011011110110001010100001", + "0011100101000000100110001010001110001010000010001111010111110000100001110011011010010101010110010100011101101010001111101010111010000", + "0100001111100110110010111001101100101011100000101010101111001101111001001101011001111110110101111111100001100110010111100110111001100", + "1001010001111000110000001010110100010011011000010011001100001010111110001010101001000110001101000111010011100000000101100001001001011", + "0010111110110110110110110010110010000100010110010101101100110011111110111010010111001010000011001010001110010001100100010000001111010", + "0100010111110010000110100010100001100101010101111100011000101110110110100110010101010010100001000011010010100101011000101100001100110", + "1010101110001101011011010010011000111111101100100110111011011001110101000001001101101010111001110011100101100011011011101011011100001", + "0011000110100101101001010001110110110001100010101001011110101000000100110000000011100100110111111101110000000010111110011010011010000", + "0000001110011000011100000010010101000011100001000010100010111100101000101100011000100101010100111101100001011110100011000110000001100", + "0000110110001011111101010111010001010001011001010000001110101011101010101010000001001110010101001111000110110001001100100000011001011", + "1100111101000000011100000101011100011101001110011100011011111011010111111011101011001000011011001001010101010000111001010001110111010", + "1001110001010101001101100111011111111110101101111110100111100111001011100111000010101011111000101010111100001101100000001101010100110", + "1111101010000101110101101001101111001111010101001110110001100000101101100001001010010001001000010001010010001010110111001011001100001", + "1000100101011100110000010100010111001011110011001010101011010000001000010000100100010100010111110101100011111011101110011010100010010", + "1011001011100000101110111111110100101010000001001011010111001100011000101100100001111111010100011110001101100110110110000110100001100", + "0100010101011110100000001010101100010010111001110010000100001011011111101011011001000111101100100110111011100001100101000001011001001", + "0110111110110110101000110100111110010101010011110100111110111010011100011010111111001011100010001011111111010000010101110000111111010", + "1101100010010110000010111011100011111100110010111100100011100110000101000111100010100011111100100010100011001100100011001101100010100", + "0111101010010011000100011111101011000110010011000110101010100000001010100000101010010011000110010011101010001011100000001010101010010", + "1111100011100011111110010000100011001000011101001000100011010001111011010000100010011101001000011100100010111011010000111010100010011", + "0010111111101000011110100101111110100010111000100010111110001101000100001101111111111100100011111101111111100111011101100111111111111", + "0011100010000111101110101111111000010000101000010001011110001011010010001010101101001111001101001111010100100000110000100000101101011", + "1101101101010110011110001001010010011100110110011100101101111010101111111011000011001001100011001000000101010000000001010001000011010", + "1001000010110101001001000111110011111111010101111111110101100110110011100110100100101010000000101010001010001100001000001100100000110", + "1101011101101111110010101111101011001110001001001110100011100001000111100000011110010000111000010000011000001111001110001010011000001", + "1011110000100101010100101100100101001010000101001011100011010100110011010000010000010011001010010101101001111100010101111010010111110", + "1010011011111100001001010010000000101101111110101010111101001011100111001100110011111000101011111111010101100000001101100110110100011", + "0100100110111010100101001010111000010101000110010011111010001100100000001010101101000000010011000111000001100010001011100000101010100", + "0100001111011011001000010010010110010011001110010100011110111001010010111010100011001110010101001010100001010011101011010000100110001", + "1110000111101001100011000010110101111000100101111100010011100100011111100111000000100011100000100010111001001101111101001101000000110", + "0110101110001001100101010110101001000110001101000111010110100000010100100001011000010011011000010011111110001011111010001010011000001", + "1111000100000001111111110100100101001000000011001000100011010001100101010001110010011101010110011100011100111011011110111010010010000", + "0000111000000100011111011001000110100011100100110010101110001101101010000100010011111100110101111100010101100011000011100011110011100", + "0001100011111100101111100010011110010001011110001001111000001111101000000110101011001000010001011001010010100110001110101111001010101", + "1100111111001010101111100010010110011011001000000010001011111101010001100100000101001110011101010110100011010110111011011110000100101", + "0111000101010110000000110111110101111000101011100000010111100001001101111001000000101101111110110100101100001111100110010111000001001", + "0101111100000000010011010011001101001000010101001001000101100010001001110011111000010101001110001101111010001000100000010001111001010", + "1010110111011111011101111000000011001110010011001110100101010010111001010011110110010101001110010100001111111011010011101011110110000", + "1110001010100100011000110101000100101011111000101010111011001101100001001100110101111110101101111110010011100110001111100110110101100", + "0110010000010010110100111011111110010011000000010011111000001010100110001010101001000110010101000111000111100000001101100000101001011", + "0110111111011010100011101001111110000101001010000100111110110011010100110010111111001010010011001010111110010101111101010100111111010", + "1100100011100001001000001111100011100100100011100100100010101010001101101011100011010101111100110101100010100011100011000011100011000", + "0111101010001001111110111000101010111000010011011001101011011110001010111110101011101101000110001101101011100101100000000100101011110", + "0001100011111000110100000000100010110110011101010111100010101111111011001111100011100011001000000010100010000001010000100001100011111", + "1000111110101101111000111110111111000101111100100100111110111111100110011110111110100000100011100000111111011101001101111100111110111", + "0001010000101100000010100011101011010101001110010101000010101001100000001001111111001110010001001110011000110000001010110001111111001", + "1000111101110010101111000010000100011101001000011101000011111011010001111011010001001000011101001000001001010000111011010001001001001", + "1011000001001111011111010110100101111110101011111110111111100111001101100111010010101011111110101011110100001101100110001101001010101", + "1101101101000001111100110011111111011110010001011110011001101000001011101000001000010001001110010001000011001110100001001110010100010", + "1010100111110111111001011001010001010010010101010010011000011100111010011100100101100011001011100011000010010101010000010100110010110", + "1010001011000100010100110101010011010101111111010101110100110011100110110011100110000000101010000000111110001000001100001001100000111", + "1010100010100101101110111010101001101101000111101101010011110100100001110100111110111000010010111000011001011010001011011010111000000", + "1110001010011111001110001000000101110011001011110011000010001001010000001001010010010110010100010110011001101111111011101011010010101", + "1100110101000111101111101110000110111000100010111000101111000000001101000100010010100101111100100011100101011011100111011100010011000", + "0011101110101001110101011001011111000000010011000110001000100110001010100000010010010101000110010011001010001101100000001010010011110", + "1101110111111011101001101000001011001110011101001000010001010111111011010001111100011011001000011101011010111001010000111011111101111", + "0000001000101001010000111110001010110100111100110011101100000111000110000101111101111000100011111100100110100001001100100011111000111", + "0000110100101000000010010010010010001100101110001001001011000101000001000111101110111001010000111000010001001110101011001111101000101", + "1101111101110001100010001111110101100010101001100011001010000100110000000101010000110111111100110110001000111110011010111111010110101", + "0100000111001000000011010111000100000001001010000000111110011000101100011001010011010100011111010101110100110110000110110111010101001", + "1100011001000100110101001011011110101000010000111001011001010011001011011010101001001100101111001101000010110101000000110100001001010", + "0000000011110001011001011010110000001110010100010111111001110110111011111110000100010011001010000010010011101100010001100100100101110", + "1101111011000101011000101100110010101101111110110100000101001011100111010010011111111000101011100001000111100000001101101001111110011", + "1100010100101001110010111101010000010101000110001100101010001100100000010101000111000000010011011001100001100010001011111010100110100", + "1110101110001111111110000100111110000010001010000011111110110001110000100000111111001110010101010111111110010111101010001111111110001", + "0000000011011101110111111001100011100001000011100000100010101000111100101000100011010100100101010101100010100011011110110010100011000", + "1111111000111010100001011100101010111001101010111001101011011111110011011111101011101100111111101100101011100101011001100100101011110", + "1000001001110110101101110000100010110111100100110110100010101110000010101111100011100010110001100010100010000000111000000000100011111", + "1011101000101001010000100111111111010101100101010101111110110110101110110111111110100001010010100000111110011000100101011000111110111", + "1011101011011010010010000000100111001101011111001101000001100101101000100101110000111000010001011001101011011111001010111110010000101", + "1011101010100011111110011011001001100011001000000010010000000101010001100101110100110110011101010110001010111110111011011110010100110", + "1000001011001100011101010000100010000000101011100000011100011001001101111001100111010101111110110100111110110111100110010111100111000", + "1111111010001100111101011110001000111001010101011000010011011010101001111011011111001101001110001101111001110100110001010101011111011" + ], + "2": [ + "1111111001101001010101010011000011111010011011001000010100110110001011101011010111001110101001011111010001000110001001000111101111111", + "1000001000001110011110101000011000100000110101111010011100000010001010111111011000010001100101010001101000110110111100110111101000001", + "1011101001000101101111001010101111101110011100011100111111001100110010001011010010100011000110110010010100101111100100101000101011101", + "1011101001000001000000101000000010000001100101111101011111011100101111000100001001001111011110001000100001101100110111101110001011101", + "1011101010110010001100001110111110100000000001011011111111010101001010110111111110010011110110000100111110011101001110011010101011101", + "1000001001111000101000011100100010010110000011001100100010011100111000001010100010100011010101100110100010000000010110000011001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011010011000111111011100011011000101010101010100011010010010100111111100010010100110110000101100010011001011110011000000000000", + "0011001110001100110111000101111111101000001000100000111111011001001100101101111110100011010101100101111110000001000010000100011010000", + "1010000000101001010111010011100011111010011011001001010100110110001011101010001001001110101001011111101011000110001101000001001111011", + "0100011101101110011110101000111000100000110101111010011100000010001010111110101110010001100101010001110110110110111000110000001001010", + "0000010110000101101001001010101111101110011100011101111111001100110010001010101110100011000110110010101010101111100000101100001010110", + "1001111000100001000010101001000010000001100101111101011111011100101111000100010111001111011110001000101110001100110111101110010000001", + "0010010101010010001100001110011000100000000001011010001111010101001010110111101100010011110111100100101011111101101110011101110100000", + "0101111010111000101000011101101110010110000011001100101010011100111000001011101110100011010100000111011111100000110110000001011111100", + "0000110000001000011100100001000010000011110001110000010000001001001111100100011111001111101100111110011001100011100101000011000111011", + "1110011011111011100001110011111001011111111110010110000111101111111010011011110010010101100010010010011010010110010100110010101011010", + "0111100100000101111010111110101110010110010110100100111011011011100110000111100110100011000100110011100110101010100000101100100010110", + "1011001110110101100101110011100011111011001110100001000111011001010001100101110101001010111110001011001101101101100011101011010010001", + "0010100000110011111111111100111001011001001010101011001001111010000100111100011000010101110000000100011100011001010110011010111100000", + "1100011101001101101111000101001111101101101000010000110110110001000010101001111010100010110011100101000011000001011010000011111101100", + "1001000110001001110111010100000011111010011010000001010100001110010001101100110111001010101100111111110000100110110101000110101111011", + "0011001100001111011110101010011000100001110101111010011000101010001110111001011100010101100010110001101001010110000000110111000001010", + "0101010101100100110001001101101111101110111100011101111101100100100010001011110000100010000001010011110100001110001000101111011010110", + "0001001000100000111010101000100010000100000101001101011100110100100001000100101111001010111001001001000001001101001111101001111000001", + "0001010010110011001100001000011000100001000000010010001101101101010000110101010100010001110010000101010000011100010110010011001100000", + "0110101011011000001000011110101110010111000011001100101010110100111100001110011010100011010011100110100000000000001110001110000111100", + "1001110011101000100100100110000010000011010001110000010010100001011111100111000101001110101011011111000111000010001101011001011111011", + "1010111111111011011001111011111111001011011110101110111110000111110100011111111110010000000101010011111111110111101100101100111111010", + "0100100011100100011010100001100010011111110111101100100011100011111100000010100010100111000001010011100011001011011000111011100010110", + "1000101011010100000101110001101011100010101110100001101011110001010101100010101011001110111001101011101010001101011011101101101010001", + "0011100011010010000111111010100011000000001010111010100011000010010100111101100010010100110111100101100010111000111110011000100010000", + "1100111111001101010111011100111111100001101000111000111111001001001100101001111110100111010100100101111110100000100010000100111111100", + "1010110001101000010111000011110011100010011011000001111010101110011011101111110111001010101001011110101111000111001101001000001001011", + "0000011101101110111110111000110000100001110101110010001110010010011010111000101100010101100101010000001010110110111000111000000101010", + "0100110010000101001001001011110111110110111100010100101111011100110010001011001010100011000110110010011110101111100000110101111110110", + "0001111000100000000010100001001010010000000101110101010001010100110111000101011101001011011110001001011000101100110111110111000110001", + "0010010011010010101100010110100000101001000001011010100111010101001010110101010100010001110111100100011011111101101110001101001010000", + "0101101100111001101000011100011110001111000011000100111010000100101000001110000010100011010100000110000111100000110110000000100011100", + "1000000110001001011100100000000010011011010001111001000110010001011111100111110111001111101100111110001101100011100101000010001011011", + "1010101001111011100001101010011001010111011110001110001001101111101010011111111110010001100010010011111100010110010100110010000101010", + "0111010100000101111010101110011110001111110010101100010111000011111010000010011011100111000100110011000010101010100000100101100100110", + "1011001110110101100101100011110011111010101110101001010101001001000001000011110111001110111110001011000001101101100011100011011110001", + "0010000100110011111111111101010001000000001010100010011001101010000000111101111101010101110000000100110000011001010110000011001000000", + "1100011101001101101111001100100111111101101100011000111100111001011110101000110000100110110011100100101101000001011010011010101011100", + "1001000000001001110111001101111011110010011000000001111100001110010001001110001111001010101100111111001000100110110101010110010001011", + "0011011010001111011110101010101000111001110000110010001100110010011110111000110100010101100010110000111001010110000000110110010101010", + "0101000011100100110001001101101111110110111100010100101011111100110001101010011010100010000001010011100000001110001000101111100110110", + "0001011010100000111010110001000010001100000100110101010010110100110010100100100100001010111001001000100111001101001111101001011110001", + "0001110010110011001100011000101000111001000100011010100001110101001011010100101100110001110010000101110100011100010110010011010010000", + "0110011011011000001000001110011110010111000010000100111000000100101000001110011011100011010011100110101100000000001110001110110011100", + "1001100111101000100100100110001010011011010001111001000010010001011101100110100111101110101011011111101011000010001101011000010011011", + "1010111111111011011001111010111111001011011011101110111111101111101001111110111111010000000101010010111111110111101100101100111111010", + "0100100011100100011010100000100010011111110100101100100011000111111100000010100010100111100001010010100011001011011000111010100010110", + "1000101011010100000101110001101011100010101011101101101011101101000101100010101011001111111001101011101010001101011011101100101010001", + "0011100011010010000111111011100011000000001010100011100011001111100111011100100010010100010111100100100010111000111110011000100010000", + "1100111111001101010111011100111111100001101001011000111111011100011111001000111111100110110100100100111110100000100010000100111111100", + "1010010011101000010111000010101011100010011111000101010000101011110000001110011101101011001001011110100001000111001101001001100111001", + "0000111111101110111110111000000000100111110100110110000110110110111110111001110101010101100101010000110010110110111000111000001011001", + "0100010100000101001001001000111111110000111100010111011011111011010000001011100010000010000110110011001110101111100000110100000010101", + "0001101110100000000010100100000010010010000000110100100110110100110010100101010110001010111110001000001100101100110111110111001010010", + "0010000001010010101100010101111000101111000010011111001001110101001010110100011110010000010111100100011101111101101110001100100100000", + "0101001110111001101000011100111110001001000110000011010110000010101000001110111010100011010100000111100001100000110110000000100101100", + "1000110010001001011100100101010010011101010001111110110100010010111100000111010111001111101100111111000011100011100101000011111111011", + "1010111011111011100001101111010001010001011111101000011001101010101001111111011101010001100010010010010110010110010100110110001001010", + "0111110010000101111010101011000110001001110010101101111101000100011101110010010000000110100100110011001010101010100000100010001010100", + "1011101010110101100101100001011011111100101111101101111101101101100101111011001110010110111110001011101101101101100011100101010001010", + "0010100000110011111111111110001001000110000010100001101101001101100110100100010100100100110000000101111000011001010110000000110100011", + "1100001101001101101111001001101111111111110101011001001011011001011111010001111011111111010011100101100001000001011010011000100110111", + "1001010110001001110111001110100011110100000001000100010010101110010001100111100101010011001100111111000110100110110101010111111110111", + "0011111000001111011110101010001000111111111000110101100000110100011110100000001100011101100010110001010111010110000000110110010010110", + "0101010111100100101001001000111111110000110100010011011001111111010001110010111010111010000001010010101110001110001000101110010011010", + "0001101000100000111010110100001010001010010100110011000010110001110010110100000110011010111001001001001101001101001111101101010011001", + "0001000100110011000100011101110000111111001100011011001011110010101011000100100110110000010010000101111100011100010110010100111100010", + "0111001111011000001000001100110110010001010010000000010000000000001000010110100011111011010011100110000000000000001110001000111101111", + "1011110011101000100100100101010010011101011001111010110110010110111101111111001111111111101011011110100011000010001101011011101111000", + "1001111111111011000001111111111111001001001011101111111111101111101001100111111111001001100101010011111111110111111100101110111111001", + "0100100011100100010010100010100010011001110100101001100011000011111100001010100010111110100101010010100011001011000000111010100011010", + "1010101011010100000100110000101010000100100011101110101011101111000101111011101011000110111111101011101010001101000011101101101011101", + "0000100011010010011111111111100011000110000010100100100011001001100111000101100010001100110001100100100010111000110110011001100011100", + "1101111111001101010111011000111110100111111001011111111111011100011111011000111111110111010010100101111110100000101010000000111110100", + "1011100001101000011111000111000011100100010111000000100110101001110000011111001111101011001001011111001101000111001101001111001011001", + "0001001101101110111110011010111000100111100100110111001000110110111110100000100111001101100101010000011100110110111000111111000101001", + "0110000110100101001001001000011111010000110100010110010111111011010000010010100010010010000110110010000000101111100001010110100100101", + "0000111011100000011011100100010010110010010000110101010100110100110010111100000110010010111110001000000010101100100110010100011110010", + "0000110010110010100101010100010000101111000010011111111001110101001010111100010100001000010011100101110111111101010111101100001001100", + "0111111011011001101000111100000111101001001110000011011100000010101000010110010000101011010010000111001011100001001111100001101010000", + "1011100011001001000100000101111011011101011001111110111100010010111100011111001111010111101010111111001101100011001101100011010000111", + "1011101000111010000000001111001000010001001111101000101101101010101001101111011101000001100100010010111001010111111100010111010100010", + "0110000100000100010011001010101111101001111010101101001011000100011101110010100010000110100101010010100001001011000000100010100110100", + "1010011110110001000101100001100011111100111111101100010011101101100101111011111100010110111111101011000110001101000011100100011110010", + "0000110000010111111111111110101001100110000010100000100001001101100110100100010100100100110001100100110110111000110110000000010010011", + "1101011110001101110110001001111111011111111101011000111001011001011111010001101011111111010010100101101111100100101011011001110011111", + "1011100001101000011110001111001011110100011001000100100010101110010001100111001111010011001000111110101100100001101100110111010010111", + "0001001101101110111110001010110001011111111000110101101010110100011110100000100110011101100100110001111101010000011001010111011100110", + "0110000110100010001001101000010110110000110100010011010001111111010001110010100010111010000111010010100000001000000000001110111101010", + "0000111011100010011011010100010011001010010100110011110110110001110010110100000110011010111111001001100010001001000111001100001111001", + "0000110010110101000101111100011001011111001100011011111101110010101011000100010100110000010011110010010111110010110110010100010000010", + "0111111011011010001000001100001110010001010010000001111110000000001000010110010001111011010010011000001011101110101110011001110011111", + "1011100011001111100100101101110010111101011001111011111010010110111101111111001111111111101010100001001101111001101101001011001001000", + "1011111110100011000000100111111111111001001011101110111111101111101001100111111111001001100100001110111111001100011101110111111111001", + "0110100010000001110011110010100010010001110100101000100011000011111100001010100010111110100101010011100011011010000001010010100011010", + "1010101010110101100101010001101010001100100011101110101011101111000101111011101011000110111111101011101010001101000010000101101011101", + "0000100010001100111111010110100010001110000010100101100011001001100111000100100010001100110001100100100010111000110110100000100011100", + "1101111110011111110110111000111110110111111001011111111111011100011111011000111111110111010010100100111111100100101010111001111110100", + "1011110011100110011110111110010010000100010111000000110100101001110000011110000111101011010000101000000010101001101101011111011111001", + "0001111011101100111110100011110000100111100100110111011000110110111110100000110101001101111100101110010111011000011000111110101001001", + "0110110010110010001001000000100001010000110100010111011101111011010000010010110000010010011111001101101010010100000000110110101010101", + "0000101011111000011011110101011000111010010000110100111100110100110010111101001110010010101111010101001100010111000110110101110000010", + "0000100000110111000101000101001010111111000010011110001001110101001010111101011100001000001011100101011001101100110101100100010101100", + "0111001101011000001000110101001001110001001110000011101100000010101000010110000010101011001010000110100001100000101101101000000110000", + "1011010111010111100110001101000011011101011001111111110010010010111100011111011101010111110010111110000111100011101011111011011110111", + "1011111000101001000100001110001100000001001111101001100101101010101001101110010101000001110100010010010111010010011010001110110010010", + "0110010110001011110101010011111011101001111110101101011001000100011101110011101010000110111101000101101111000100000100110010110010100", + "1010101000110111100101111000101011111100111001101100000011101101100101111011101110010110100111110101001100000011000011100101110010010", + "0000000100000100111011110110010111100110000100100001101101001101100110100100000110100100101001111011011100100010110110000000011100011", + "1101001110010101110000011000110101010111111101011001010011011001011111010000100011111111000010111000100001111010101011011000011101111", + "1011110011101100011010011110010001100100011111000101010100101110010001100110000110010011010000111110000010110111101110111111001110111", + "0001111011101110111100000011111111000111111000110101011000110100011111000000110101111101111100110000010111010110011011011110110000110", + "0110110010111010001111100000101110110000110110010010000011111111010001110010110001011010011111010011101010001110000110010110110011010", + "1000101011110010011111010101010111011010010000110010110110110001110011010101001110111010101111001001001100001001000001010101101101001", + "0000100000111101000011100101001101011111001100011011100111110010101010100101011101010000001011110011011001110010110010000100000010010", + "1101111101011010001000010101000110010001010110000001110110000000001001110110000011011011001010011000100001101110101110001000000001111", + "1100010111011111100000101101011100111101011011111010101110010110111100011111011100111111110010100000000111111001101101011011011001000", + "1110101000100011000110101110111111100001001011101111111111101111101000000110111111101001110100001110111111001100011101101110111111001", + "0000000010000001110111110010100010001001010010101001100011000010111100001110100011111100111101010010100011011010000011010011100011010", + "1111111010110101100111011000101010011100000011101111101011101110100100011110101010100000100111101010101010001101000000000101101011101", + "1000001000001100111001010110100010000111000000100100100011001000000111000000100011101010101001100100100010111000110000100000100011100", + "1011101000011111110010111001111110110111011101011111111111011100011110111010111111010001000010100100111111100100101100111000111110100", + "1011101011100110011000111110000000000100110111000001000110101100110001111100001110001101010000101001101100101001101001011110001001001", + "1011101011101100111110100010011010100111000000110111100110110101011111000110011101101101111100101110011001011000011000111110000101010", + "1000001000110010001101000000000001010000010110010101011111111100010001110000000011010110011111001100000000010100000000110111100110100", + "1111111001111000011101110101111010111010010000110010100110110000110011011011011100110110101111010101000110010111000110110101011110011" + ], + "3": [ + "1111111001000111011100110110100100100111111010011011001000001101100000100101111001011000010000101111000001000001110100111011101111111", + "1000001011000011011010100010101100100101110011001000001010010000110110100101010111010110011100101001110000110000000001011111101000001", + "1011101011110000100111101110101111101011010011010100000010100110010101101001010100110101111111001010001100101100001000010000101011101", + "1011101001101000111100110110101101110010101100011001101001011010001001110010001100001101001111010000101011101011011110010110001011101", + "1011101000011100000111101101111111111100100001000000111111010110111011111110111110000011001011110100111110011010101111100010101011101", + "1000001001110101101100010101100010010011001101111110100010100110000000010011100011100000101010011110100010000110110111101011001000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001000110010001011000100011011101101101100010100010010000100111011111100010000011001001111101100010011010111110100000100000000", + "0111011000000101010001011011111110011111000001110100111110110111100000011110111111100000100010111101111110000110110011111001100000110", + "0101110111000111011100110111000010100111100010011011101000001101100010100100111001011000010100101111100001000001110100111110111001011", + "1001001101000011011010100011101000100101111011001000101010010000110110100101010111010110011010101001110000110000000001011111010111010", + "1010010111110000110111101111001111101011011011010100100010100110010101101000010100110101111001001010101100101100001000010110010100110", + "1010111111101000101100110111101101110010101100011001001011011010001101110010001100001101001001010000101011101011011110010100001100001", + "1110100100011100010111101100011001111100111001000000110011010110111001111111100010000011001111110100111010011010101111100101100010000", + "1111111011110101110100010101011110010011001101111110011110100110000000010011100001100000101100011111000110000110110111101001100001100", + "0111110010011101001010000010100010000110110110111001001011001011111000000101111001011000010100100111000001000001100101111011111001011", + "0001101100110011110111101100110110101001110111000010010100000001010110101001010011010110010010001011110000110000000101001111010111010", + "1000010010101010101001011010101111001010001111110110000111100000001111001001010010110101111001000010001100101100011001010011010100110", + "0010011110011000010001111000110011111110100000010011110111001011101101111110001010001101000001110010101011101011011110000100001100001", + "1100100001000110010001011001111001011101101101100010010100010000100011011110100100000011001111111100011010011010111010100000100010000", + "0111011010000101000001011010000000011111000001110100100010110111100000011111100101100000100100111101000110000110110011111001100001100", + "0101110111000111000100110111000010100111100010011011101010001101100010100100111111011000010100101111100001000001110110111110111001011", + "1001001101000011001010100011101000100101111011001000101100010000110110100101010001010110011010101001110000110000000011011111010111010", + "1010000111110000100111101111001111101011011011010100100010100110010101101000010010110101111001001010101100101100001110010110010100110", + "1010001111101000101100110111101101110010101100011001001111011010001101110010001000001101001001010000101001101101011000010100001100001", + "1110110100011100011111101100011001111100111001000000110001010110111001111111100100000011001111110100111000011100101001100101100010000", + "1111001011110101111100010101011110010011001101111110011010100110000000010011100111100000101100011111000000000000110101101001100001100", + "0111100010011101001010001010100010000110110110111001001111001011111000000101111111011000010100100111000111000011100011111011111001011", + "0001111110110011110111111100111110101001110111000010111110000001010110101001111111010110010010001011111110110110000011001111111111010", + "1000100010101010101001000011100011001010001111110110100011100000001111001000100010110101111001000011100010101010011111010010100010110", + "0010101010011000010001100001101011111110100000010011101011001011101101111110101010001101000001110011101011101101011000000100101010001", + "1100100011000110010001001000100011011101101101100011100010010000100011011111100010000011001111111101100010011000111000100001100010000", + "0111111110000101000001010011111110011111000001110100111110110111100000011111111111100000100100111101111110000000110101111001111111100", + "0101010111000111000100110110101100100111100010011010001110001101100010100101001001011110010100101110001101000111110010111111001101011", + "1001001101000011001010111011011000100101111011001000010000010100110110100101100101010000011010101000111000110110000011011111100011010", + "1010000011110000100111101111111111101011011011010100111010100100010101101000000110110011111001001011100000101110001110010110000000110", + "1010101011101000101100111111100011110010101100011000001111011010001101110010111110001001001001010000100111101101011000010100111000001", + "1110000100011100011111101101110111111100111001001001010101010110111001111110010010000101001111110101010110011100101001100100010110000", + "1111111011110101111100001101101110010011001101101110100110100010000000010011010011100110101100011110001110000000110101101001010100100", + "0111100110011101001010000010010010000110110110100001010111001001111000000101101011011110010100100110001101000011100011111011101101011", + "0001111000110011110111100100111000101001110111011011010100000101010110101001100101010010010010001011111100110110000011001111100010010", + "1000110010101010101001011011000001001010001111101111100011100000001111001000100100110011111001000011100000101010011111010010100001010", + "0010011110011000010001100000000011111110100000001011001011001111101101111110111110001011000001110011100011101101011000000100111001101", + "1100110101000110010001011001001001011111101101110010001100010010100011011110110000000101001111111101010110011000111000100000110111100", + "0111001110000101000001010010001110011101000001101101100010110011100000011111010011100100100100111101001010000000110101111001010100100", + "0101010111000111000100110110101100100001100010000010001110001101100010100101001001011110010100101110001101000111110010111111001100111", + "1001001101000011001010111011011000100101111011010000010000010100110110100101100101010000011010101000111000110110000011011111100010110", + "1001000011110000100111101111111111101011011011000100111010100100010101110000000110110011111001001011100000101110001110010110000001010", + "1000101011101000101100111111100011110110101100000000001111011110001101101010111110001001001001010000100111101101011000010100111001001", + "1100000100011100011111101101110111111100111001011001010101010110111001100110010010000101001111100101010110011100101001100100010111100", + "1101111011110001111100001101101110010011001101100110100110100010000000001011010011100110101100000110001110000000110101101001010100000", + "0100100110011011001010000010010010000110110110101001010111001001111000001101101011011110010100111110001101000011100011111011101100111", + "0000111110110011110111100100111110101101110111011011111110000101010110100001111111010010010010010011111110110110000011001111111110010", + "1010100010101010101001011011100011001010001111101110100011100000001111010001100010110011111001010011100010101010011111010101100011010", + "0000101010011100010001100000101011111110100000001010101011001111101101100111101010001011000001101010101011101101011000000001101011101", + "1111100011000110010001011001100011011101101101110010100010010010100011010110100010000101001111100100100010011000111000100100100011100", + "0110111110000001000001010011111110011011000001101100111110110011100000010111111111100100100100100100111110000000110101111101111110100", + "0111100011000011000100110111100010100111100010000011001110001101100010111100011111011110010100111110100111000111110010111000011000111", + "1011001101000101001010111010010110100101111011010000110100010100110110111101110011010000011010110000110110110110000011001001110100110", + "1001110011111000100111101111001111101011011011000100000110100100010101100001110010110011111001010011001110101110001110001101110001010", + "1011101111111100101100111110110011110110101100000001010111011110001101111011101010001001001001001001001101101101011000001011101111001", + "1100110000001000011111101100111001111100111001011000010101010110111001100111000100000101001111100101111100011100101001111011000111100", + "1101111011100011111100001100100000010011001101100110000010100010000000001011000101100110101100000110000000000000110101100111000100000", + "0100010110000101001010000010100010000110110110101001101011001001111000001100011111011110010100111110100011000011100011100000011110111", + "0000111100111111110111100101101000101101110111011010001100000101010110100000110001010010010010010010010111110110000011010000110000010", + "1010000110110110101001011010001111001010001111101110100011100000001111010101110010110011111001010101001011001010011111001101110011010", + "0000011110011110010001100001001101111110100000001011101111001111101101100010101000001011000001101101101100001101011000001010101001101", + "1111000101001110010001011001111001011101101101110010110000010010100011010011000100000101001111100011111000111000111000111011000101100", + "0110001010001001000001010011011110001011000001101100111010110011100000010100000111100100100100100000100001100000110101100110000110100", + "0111100011011011000100110111100010100111100010000011001110001101100010111110011111011110010100111000100110100111110010100000011110111", + "1011001101000101001010111010010110110101111011010000110100010100110110111011110011010000011010110110110111010110000011010001110010110", + "1001110011111000100111101111001111101011011011000100000110100100010101100111110010110011111001010101001110001110001110001101110011010", + "1011101111100100101100111110110011110110101100000001010111011110001101111101101010001001001001001101001100001101011000001011101011001", + "1100110000000000011111101100111001101100111001011000010101010110111001100111000101100101001111100011111101111100101001111011000101100", + "1101111011110011111100001100000000011011001101100010000010000010000000001101000100000110101100000000000001100000110101100111000100000", + "0100010110010101001010000011100010010110110110101111101011101001111000001010011110111110010100111000100011100011100011100000011110111", + "0000111110111111110111100101111110101101110111011000111110001101010110100110111110010010010010010110111111010110000011010000111110010", + "1010100010110110101001011010100011011010001111101010100011111000001111010001100011010011111001010100100011001010011111001101100011010", + "0000101010011110010001100001101011110110100000001001101010110111101101100000101011101011000001101100101010001101011000001010101011101", + "1111100011001110010001011000100011001101101101110010100010111010100011010000100011100101001111100011100010111000111000111010100011100", + "0110111110001001000001010010111110011011000001101110111111000011100000010001111110100100100100100000111111100000110101100111111110100", + "0111100111011011000100110110110010110111100010000010010110110101100010111100101010101110010100111000101100100111110010100000101010111", + "1011111001000101001010111010111001101101111011010011010101110100110110111010000100101000011010110111011101010110000011010000000100110", + "1001110011111000100111101110100000111011011011000100100010011100010101100111000101001011111001010100000000001110001110001101000101010", + "1011011111100100101100111111100011110110101100000011001010111110001101111101111111010001001001001100000010001101011000001011111111001", + "1100110100000000011111101111101001101100111001011001101101101110111001100111110001110101001111100011110111111100101001111011110001100", + "1101001111110011111100001110001110011011001101100100100011000010000000001100110010011110101100000001101011100000110101100110110010000", + "0100010110010101001010000011001101110110110110101000101111110001111000001010101000100110010100111001101101100011100011100000101000111", + "0000001100111111110111100100111001001101110111011000110001100101010110100110100100001010010010010111011001010110000011010000100100010", + "1010000010110110101001011001011110011010001111101110011011011000001111010001000111000011111001010101000001000010011111001101000111010", + "0000101011011110010001100011100011110110100000001001001110101111101101100001011111110011000001101100000110000101011000001011011111101", + "1111000101001110010001011000010110101101101101110010010100101010100011010001110011111101001111100010110110100000111000111011110011100", + "0110111011101001000001010010001111111011000001101110100111010011100000010000010010111100100100100001101111111000110101100110010010100", + "0111100110011011000100110100110011110111100010000010110110110101100010111100101010101110010100111000101100111111110010100000101010111", + "1011111000100101001010111000111000101101111011010010010101110100110110111011000100101000011010110111011101011110000010010000000100110", + "1001110011011000100111101110100000011011011011000100100010011100010101100110100101001011111001010100000000010110001111001101000101010", + "1011011110100100101100111111100010010110101100000011001010111110001101111100011111010001001001001100000010010101011001001011111111001", + "1100110101100000011111101111101000101100111001011001101101101110111001100110010001110101001111100011110111100100101000011011110001100", + "1101001110010011111100001110001110011011001101100100100011000010000000001101110010011110101100000001001011101000110100000110110010000", + "0100010110110101001010000011001101110110110110101001001111110001111000001011001000100110010100111001001101111011100011000000101000111", + "0000111111111110110111100100111111001101110111011000111111100101010110100111111110001010010010010110111111001110000010110000111110010", + "1010100011010110101001011001100010011010001111101110100011011000001111010000100011000011111001010101100011010010011110101101100011010", + "0000101011111110010001100010101011110110100000001000101010101111101101100001101011110011000001101101101010000101011001101010101011101", + "1111100011101111110001011001100010101101101101110011100010101010100011010000100011111101001111100010100010100000111000011011100011100", + "0110111111001000000001010010111111111011000001101110111111010011100000010001111110111100100100100000111111111000110100000110111110100", + "0111010110111011000100110100000011110111100010000011001010110101100010111101011110101110010101011000000010111111110011000001111110111", + "1011111100100100001010111000001000101101111011010010001101110100110111111010110000101000011011010110010111011110000010110001010000110", + "1001000111011001000111101111001110011011011011000100000010011100010100100110110011001011111000110101101010010110001110101101010011010", + "1011011110100101101100111110001100010111001100000010001110111110001101111101101001010001001000001101001100010101011001101010001001001", + "1100000101100000011111101111011000101100011001011000010001101110111001100110000101110101001110000011011001100100101000011010100101100", + "1101001010010010111100001110111110011010101101100100111011000010000000101100000110011110101101100000100001101000110100000111100110000", + "0100100010110100101010000010100011110110010110101001101111110001111000001011011110100110010101011000000111111011100011000000111110111", + "0000001101111110110111100101010111001100110111011001010101100101010110100110110010001010010011010110010111001110000010110001010010010", + "1010110011010110101001011001101110011010101111101110100111011000001111110000110011000011111000110101101111010010011110101100010011010", + "0000101111111111010001100011010011110110100001001001010110101111101101000001101011110011000000001101001100000101011001101010001011101", + "1111110001101111110001011001111000101100101101010010110100101010100011010000000101111101001110000011011100100000111000011011100101100", + "0110111011001000000001010011100001111010000000101111100011010011100000010000000100111100100101100000100001111000110100000111100100100", + "0111010110111011000100110100000011110111000011000011001010110100000010011101011110101110010101011000000010111111110011000000111110111", + "1011111100100100001010111000001000101101111011110010001101110101110110011010110000101000011011010110010111011110000010110000110000110", + "1001000111011001000111101111001110011010011010100100000010011100110101100110110011001011111000110101101010010110001110101101110011010", + "1011011110100101101100111110001100010111101101100010001110111111101101111101101001010001001000001101001100010101011001101011101001001", + "0000000101100000011111101111011000101100011001011000010001101110011001000110000101110100001110000011011001100100101000011010000101100", + "1101111010010010111100001110111110011011001101000100111011000011100000101100000110011111001101100000100001101000110100000110000110000", + "1100010010110100101010100010100011110111110111001001101111110001011000001011011110100111110101011000000111111011100011000001011110111", + "1110101101111110110111100101111111001100110110111001111111100100110110100110111110001011110011010110111111001110000010110000111110010", + "0000000011010110101001111000100010011010101111101110100011011000101111110001100011000010111000110100100011010010011110101101100011010", + "1111111001111111010001000010101011110110100000101001101010101110001101000001101011110010100000001100101010000101011001101011101011101", + "1000001011101111110000011000100010101100101100010010100010101010000011010000100011111100101110000010100010100000111000011010100011100", + "1011101001001000000001110010111111111010000000001110111111010010000000010000111110111101000101100000111111111000110100000110111110100", + "1011101010111011000100010101101101110111000010000011001110110101000010011100001000101111010101011001101100111111010011000000001000101", + "1011101010100100001010111001111000101101111011110011110001110101010110011010000100101001111011010110011001011111000010110000000100110", + "1000001011011001000110101110011110011010011010100100111010011100110101100111100111001010011000110100000000010110001110101101100111000", + "1111111000100101101100011111000010010111101101100011001110111111101101111101011111010000101000001101000110010101001001101011011111011" + ] + }, + "30": { + "0": [ + "11111110111000111010100110000111110011101010110011000110101011110000001011110011101111110101001110000010110001101101001101101110101111111", + "10000010110111100100010101101100011000101110100110111011111111001100011111001100001100011110101101100010101101100000010101100101101000001", + "10111010010101011010111011000111111110010101100100101100111000001011011000001100110100100110010101011111001011100010000011100010101011101", + "10111010101100111110010101110101110111101000011110110001011010110010111010110011010010001010010011010110111010010011100010010001101011101", + "10111010011010001101111111111111000001011110000010111110000110101110100110101111100101000100100100110011111100100101111100100001101011101", + "10000010011110001111100010001011110110111001001111100010001101011001101101011000111111110100111110001010001011100011111011100011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000101000110110100010001000010000000010001010100011001010011110101010011000100111001100000110110110001000110101101000110010100000000", + "10110111000011100011011011111100101110110011000001111110001111010001101111001111111111010100111110001011111110110110111110110101101001011", + "10001000111000111010100110001001110001101010110011111110101011110000001011101110001111110101001110000011010101101101001101101100000011100", + "11000111010111100100010000000100011100101000100111111011111111001100011111011011101100011110101101100111001101100000010101100000011000000", + "11001100110111011010111111111111111000010101100100001100111000001011011000001011010100100110010101011000101011100010000011100011000000111", + "11011111101000111110010111010101110111101110011110000001011010110010111010111100010010001010010011010100011010010011100010010010101010010", + "00111001011000001101111010110111000001011100000011010000010110101110100110100101000101000100100000100010000100100101111100100100100010100", + "11100111111010001111100000000011110110111001001111110110010101011001101101001001111111110100111000010101000011100011111011100011101010010", + "01011100011110000000010000011110100110110100111100010111100100101000011100111111110001111010110110011000010110000011011110000010000100011", + "11100011101100011110110011011001000011011110101100100111101010111100000010110101110010111001010101111100001011011011010011011010000111111", + "00010001100001100001111111001010101010110001101000100001111000101111000000110101010000111110010101011000001110110110010110110111011100101", + "00110011100111001010100010110010101010011110010001001011001001111100110001101101011100110000011011010001111011010110100011010110101100110", + "11100001011100100111010110000010010101111000001001100111010101100000101101100110111111010011111000110101000110001111101110001110101101000", + "01000110110001101101001110001110101100110101000101011000000001101011101001100111001111001001001000001011000001001000111001001001110101001", + "10001101101010101011001100000001110111101010110101100100100000011010011000010011110011110010010110010010110010010011001010010010010010000", + "10001010010001101010001101110110011011010100100010011011111000110100000000100100010010011001010101111110101110001110010110001110000001100", + "10000101100001001011001011001101111101101111100111001100111111110011000111100100101010100001101101000001001101011000000101011001011001011", + "01011111111010101000000111111111110101101000011010111111011100001010110100001111100100001111100011001111111101101101100101101100111111010", + "01111000101100001100010010001111000111011100000100100010010101000010101101001000111101010011111000110110001011011011111011011011100011010", + "11101010111101010001111110101001110001000101001010101010010010100111101010111010100111101011000000001010101000001101111000001101101011101", + "01011000101011010001100110001100100011001110111111100011100011010110011011001000101001100101001110000010001000111001011000111000100011100", + "00101111111101000110100111111011000001011000101000111111101100001110100100011111100010100100100101100011111100100101010100100100111110100", + "01011100010001010000010000101010101100110001101111101011111011001001100011001000001001001111001101001001100001001000010001001000001101011", + "00111010100110011000111100000000101101100010010100111011001110011011010110001110000101001001100011001111010000111000100000111000000011010", + "11100100101101100110100010010000010000000010001011111101010010000111001010001011100110101010000000101101001000110101101000110101111000110", + "10001110100000010011011101101100101110110011000001101010100111000000101111010011011110010000111000010100101110110110111110110111000000001", + "11001101111010111010100011010001110001101010110010100010000011110100011011110100001011100101001111100010011101101101001101100101001111100", + "10001011010000011110010010110100011100101000100110010010011111001010000111011101001010000110101100000000000101100000010101111000100100000", + "10000100110001101010111110011111111000010101100101010111011000001101000000000001110010111110010100111001000011100010000011101010001100111", + "10011110101010010000010110010101110111110110011110110110011010111000010010101111110100010010010010010110010010010011100010001010000010010", + "00110001011100011101111101000111000001000100000010000110010110100100001110100100100100100010100000100100001100100101111100111101100000110", + "11100010111101000011100111011011111110101001001111100000010101000000001101010100111110010010111000010100001011100011111011101011011000001", + "01010001111011010000010100100110100111110100111100001011100100110001111100111100110000011100110110011011111110000011011110011011001110000", + "11100010001101111110110000000001000010110110001100000111001010101101000010111111010011111101010101111001000010011011010011000010101101100", + "00010100100001100001111000001010111010100000101001111001011000101111000000101111010000111110010100111001000111011110110110100110010100111", + "00111111100110101000100100000010111011110110011000100100101001111100110001101011111100110000011010110110110010111110000011010110010010110", + "11101001011100000111010011110010000101001000000000111010110101100000101101101100011111010011111001010100101110110110001110001111100001010", + "01000111110001001011001101001111101101011101000101101101000001100011001001110100101111001001001001001101001001110001001000001001011001001", + "10000101101010101011001011110000000111111010011100110000100000010010111000010010010010010100010110010010111010000010010011111011010110000", + "10001111010000101110001010110110101011000101000010001101111000101101100000111001010011111111010101111001100110001110001111100110110101100", + "10001000100000001011101111111101011100100111001111010000111111101010100111100111101011000111101101000000100101011000001101100000010101011", + "01010110111011001000000110110111110100000000110010110001111100011011110100001001100101001011100011001111110100101101101101010100011011010", + "01111001001100001100010101100110100111001101011100010100110101000010101101000010111101010011111001010100111010110011011011001010111001010", + "11011111111101110011111111111001000000101101010010111111110010100111101010111111100111101011000001101011111001100101011000001100111111101", + "01101000101010110000000110001101010011111110100110100010000011010110011011001000101001100101001111100110001000000000111000111001100011100", + "00111010111100100111000010101010000000110000101000101010101100001110100100001010100010100100100100100110101100011100100101100100101010100", + "01001000110001110001010110001011011100100001000111100011101010001001100011011000101001001110001001001010001001011001001000100000100011011", + "00011111100110011001011111111000011101110011110101111111010111111011010110001111100101001000000101001011111000111000111001010001111111010", + "11101001001101100110100100110000110001001010100011110011001011100111001010010101000110101011100110101110011000110101100000001101000100110", + "10000110100010010010111010011100101111011011101000010110101111100000101111000001111110010001011110010001011111110110110110001111001100001", + "11101100111010111010000100010000010001111011101010010110001011010100001010100111101111100101001111100000011100000101101101111100100011100", + "10110011010100011111110001000100101101000000111111100110011111001010011110111100101100000110101100000100000100001000110101100000100000000", + "10110000110101101011011001011110001000100101111100000001011000001101011001111100110100111110010100111010001011011011100011100011011000111", + "10000011101000010001110110100100110110000110011111000010011010111000011010011100110010010010010010010011111010101010010011010010101110010", + "00100000011000011100111000000110110001001100101010111110000111100100000110010111000100100011100100100111000100110100100101001101101100100", + "11000110111101000010000010001011000110101000101110000000001100100000001101010111011110010011011110010001010011100011100010001010110100010", + "01011101111111010000010000000110000111111100010101010101111101010001111100100011110000011101010000011000101110000011010110111011110010011", + "11101011001111111111010111110001000010110110000101100011000010001101000000101100010011111100110011111100110010011011011011100010100001111", + "00110101101001100001011101001011001010100000110001000101010000001111010011111100101100111110010100111111000111011110110110100111111000111", + "00000111101010101001000111110010011011110110001001000000101001111100101110001010000010110000011010110100110010111110000011010110010110110", + "11011101001000000010111100110011100101001000010001111100110101100000110010010001000001010011111001010001100110110110001110001110110101010", + "01011010100011001000110101111111101101011101000100011001000011101011000101000001111001001001001001001010100001110001001000001001110101001", + "10010100110110101010000110101000000111111010011100011000110011011010110000100111110010010011001010010011110010000010010011111011011010010", + "10101011011000101111110111100110101011000101000011110101100111010101100000111100110011111000101011111100111110001110001111100111011101111", + "10000100100100001011010011000101011100100111001110010110100000010010100111110100101011000000010011000011110101011000001101100000101111000", + "01011111111001001111101001000111110100000000110101000101110000101011110110010010100101001110010101001010000100101101101101010100010001001", + "01011000000100001110110000100110100111001101011110101000111101100010111110001001000001010011111001010010101010110011011001001010010011010", + "11011110110001110000011100100101000000101101010110011011110010100111110101001001011001101011000001101111101001100101011000001101001101101", + "01101001111110110100001010011001010011111110100111001010000011010110000100110111110111100101001111100111010000000000111000111000000011100", + "00111111101110100011011011111100000010110000101001111110101110000110101000101111110100100100100100100011111100011100100101100100111110100", + "01001000101101110111011010001101011000100001000100100011101000000001101011111000101001001000010001001010001001011001001010101000100010101", + "00011010101110011001000110101110011101110101110000101011010001100011010110001010100101001110011101001010101000111000111011011001101010101", + "11101000101001100110111110001110110100101110100111100011001101111111001010001000100110101101111110101110001000110101100110010100100011001", + "10001111100010010100110011111000101011101111101101111110101011110000101101011111111110010101001110010011111110110010110001010110111111010", + "11100001110010111000000110100110010101101101101111100010001011010100001000101010110111100101001111100111111111101011101000001101101111100", + "10111110011100011101110001011000101101001010111110101110011111001010011000110001010100000110101100000101100111100110110100000001101100000", + "10111000100101101111010110001010001010110011111010011001011000001101011111101001001100111110010100111101110101100001100010000011010000111", + "10000011011000010101101000111010110001011100011110101100011000110000011110000111100010010010010010010101001100010000010010010111010100010", + "00100101100000011010110101110000110010100010101001010010000101101100000110000100000100100101111100100111010000100100100110100010100111000", + "00000010110101000010011010101101000000101110101011100100001010111000001101001100111110010101000110010110000011100011100001100101011111110", + "11010001111111011000001001011000000001100000010000100001111011001001111100101011010000011011001000011010110110000011010000000001110111111", + "01100111101111111001011100001101000111000010000000011101000110011101000000101000110011111000100011111101100011011111011101011000010100111", + "01111001101001111011011100011101001110010110110100111001010000001111010011110000001100111110010100101100100100110000110010110110110100111", + "11001010101010110011000111101110011011111100001000011000101001111100101110000110000010110000011010101011010001010000000011010111011010110", + "01010101001000010010011011100111100111011110010111110100110101100000110010000100100001010011111001001000011000001100001110001110111101010", + "00011010000011011110110011100001101010000111000101110111000011101011000101011100111001001001001001010110010111001011001001001100001111001", + "10010001010110110100100011000110000100010100011111100100110010011110110000110010110010000010001010010001100110010010010000010100001001110", + "01101111011000101110110111000000101101000011000110001001100110110011100000100001010011100001001011111011101110001110001100001000101010011", + "00001000100100001011110010000011011010111011001011111010100001110100100111110000001011011001110011000001101101011000001011011010110100100", + "11010011011001000111101010111011110001110100110110101011110000001001110110011110000101010111110101001011010101101001101011101110110010001", + "00010100000100000111110001110000100011111011011001010100111101000000111111011101100001010011111001000001001001011101011111011011011001010", + "00010011110001100001111100110101000000100111010011000011110010100111110100111101011001101011000001110000001010001011011000001100000001101", + "11100001111110110101101101010001010001101000100001000010000011010110000101010010010111100101001111111110101110111010111000111000001011100", + "01110111101110110011011110001100000111101010101000011010101110000110101000010001010100100100100100111011111010100110100100100001100010100", + "01001000001101101111111000011101011111001111000100111111101001000101101011001001101001011001010001001010111101001001001011001111010010101", + "11011111101110011000000011111110011011110101110001111111010000000101010110011111100101010111111101001111111000111000111010111110111110101", + "01101000101000000110011010001110110111010110100110100011001100011001001010001000100110110100011110101010001000110101100110110110100011001", + "00001010100010111100110010101000101010101111101100101010101011010010001111011010111110001100101110010010101110110010110000110100101011010", + "10101000101011110001000110001110010101001101101110100010001011110110101011101000101110000101001111110010001111101011101001101101100011100", + "01111111101100101100010111111000101101001010111111111110011111001011111111001111101101100110101100011111111111100110110101100000111110000", + "00110000100101101110110010101010001010110011111010000101011000001100111000010100110101011110010100100000000101100001100011100010100110111", + "11000011100001100101111001011010110001011100011110100000111010110001011010101011010011010010010010001000110100010000010010010111101110010", + "00100101111001000010011110001000110010100010101000111100100110101000000110100000100100110100100101000101100000100100100110100010100101000", + "00001011110101000011011100011101000000101110101010111001101101011110001101000000011110001100111111110110100011100011100001100101110101110", + "11011000100110110000111111101000000001100000010001011000011100101111111100110110010000000010110001111101010110000011010000000000011011111", + "01100111010111010001010101100101000111000011100001010100000010111111100010100100110011100001010010111000011011011111011101011000111100111", + "01111000010000101010010101100101001110010111110100010011010000101101110000100100110101011110010100101010010100110000110010110111101110011", + "11000011011010011010111111000010011011111100101001001010101001111101001001100010111011010000011010101011100001010000000011010111001001110", + "01011101001000000011000111000101111111011111110111100110110101100001010101111001011000110011111001001101101000001100001110001111001011110", + "00011010111010111110100010000111001010000111000011100001100001101010000001110000001000001001001001010011101111001011001001001100110100101", + "10010001001111110100101000111011000100010101111000010000010000011110110000010110010010000010010011110011010110010010110010010100010010010", + "01100110011000101110111001110001001101000011111111001100000000110011100000101011110011100001010010011011001110001110101110001000011001111", + "00000001111101101011100100110011010010111010111110001011000111110100100111101011001011011001101010100110001101011001101101011011000001000", + "11010011100001100111100011010001010111110100001001111010110100001001010100010100000101010111100100001110101101101100011101101110001011001", + "00010101111101000111111000001100110011111011000001100110111101000000011101001101011000110011111001000111111011011010000011011010000011010", + "00101010000001000001100100011100100110100100010000000001110010100110010010111001100000001011000001110000111000001101000000001000010011101", + "11101001111110110101110001110000101101101011100101010000000011010111100011001111101110000101001111111011011000111000110000111101111101100", + "01010111010111010011001111101101100101101100111110001100001100000111101100011101100101100100100100111110000100100100101100100101011000100", + "01001000010100101111110011100111011101001010101011001011001011000101101011001101001001011001001000101000001001001001101001001001001001001", + "10100110101110011000001111000111111101110101001001111010110110000101010110011101000101010111100100101101111000111000011000111000101111001", + "01011100010010000110001001111110011011010111010011100110101010011001001010000110100110110100000111001011000000110100000000110100101100101", + "11111010111100111100111011111010001100101111010010111111101111010010001111001111111110001100111111010011111110110111000110110111111110010", + "00000000101101110001001010001010000101001011110111100010011011110110101011111000101110000101001011100110001101101100110101101100100011100", + "11111110101010101100001010101001001011001001111100101010000111001011111111001010101101100110101010000010101101100000101101100001101010000", + "10000010100001100110101010001011110110110000111110100011000000001100111000011000110101011110010010111010001011100011101011100010100010111", + "10111010000101101101111111111011010011011010001000111110110010110001011010101111110011010010010100010011111010010010011010010010111110010", + "10111010111011011010011101100010110000100111000110001100101110101100010110101010100000100100100101000100111100100100000100100100111100100", + "10111010110011010011010100000100100110101110010010101011101101011000010101010000111000010100111111110101110011100011000011100011101110001", + "10000010000010110000111111000000101101100001100100011010011100101001100100100010110110011010110001111010000110000010110110000010001000010", + "11111110110011001001010010000111100001000010111111100110000010111101101010100001010101111001010010111000101011011010101011011011001011110" + ], + "1": [ + "11111110101010101000110111001110000010001110000010110000001011011100011011110011101111110101010111100001001101100101110001101010101111111", + "10000010001110100101010010101101111001001011100000100100011111010010000111001100001100011110110100000001010101101000101101100001101000001", + "10111010100011110111000001010101000001110011011001100011011000010101000000001100110100100110001100111110000011111011101011100110101011101", + "10111010110101011000111011111011001011110100010110000010111010100000010000110011010010001010000010010110110011001010011010010101101011101", + "10111010111100111110000011111000100010111101010101111110100111101100001100101111100101000100100000100011111101010100100110100101101011101", + "10000010000011110000110010001000001010100001101101100011101100111000001011011000111111110100111000010010001010000011100001100111001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001110111010111010001000110010011001010100100010101011111111001100011000100111001100000000101110001000010101100110110110000000000", + "11110010101110100011101111111000001100101000001101111111101111111000101011001111111111010100111000010111111110010110100000110100010011101", + "01000001101011001000110010101110000010001110000010101000011011011100011011101110010111110101010111110101010101100101110001100101110101100", + "10110010001110111101011101000101100001001011100000111100000111010010000111010101110100011110110100011001001101101000101101101001111110000", + "10111101100011110111111101100101011001110011011001101011000000010101000000000101001100100110001100100010001011111011101011111011100110111", + "11101110010101011000001101100011010011110101010110011010110010100000110000100010000010001010000010001110111011001110011010001111000010010", + "11110101011100111110110101100000110010111100110100000110101111101000101100111001000101000011100000100011100101010010000110110011001010111", + "11001111100011110000111001010110001010100110001101001001101100111111101011011001111111110011011000010100100010000101000001100100001010011", + "10010100111000001100101110100000000100101000000010111000011101001110011010111111110001111101010110011001010110100000110000000000100100001", + "01111010100001001110000010100011100101000011100000110100000000010110000110110101110010111100110101111100001011111000101100011001100101110", + "10111000110000010011001001011001011111010001011001110011000010000101000001110101001000101110001101001000001100111111101011011110111110101", + "00010110111001001011101011000101010001111101010110001010110111100100110000000011000100101000000011001001111001011110011010111111001000101", + "11100000101001011011010000010110110010011110110100000110101011111000101100001000100111001011100000101101100000010110000110110110001011001", + "00010110101101100011010111001110001000101110001001000001101101111011101001011001011111010001011000010111100111010101000001110100010001010", + "01100000001011001000000010000010000100001010000100110100011000011110011000101111110010010101010010010101010110000100110010000101110100010", + "10100010101111011101010101110011100110101011100110100010000000110010000000110100010011111110110011111001001110001000101110001001100111111", + "01001101000010110111110101111011011110010011011111100101000111110101000111100100101011000110001011000010001101011011101101011011111111000", + "01001111110110111000101111111101010010000101010110111110110110001000110100001111100101001010000101001011111101101110001100101111111111001", + "01011000111101111110100010001100110011100100110100100010101111000000111100001000100101010011111000100110001001011010011010110010100010100", + "01001010100010110000111010101110001010111110010100101011101100100111110011011010111111101011000000010010101010001101011001100100101010010", + "00011000110111101101001010001000000100110000011010100010011101010110000010101000110001100101001110011010001110111000111000000001100010011", + "10111111101000001111011111111010100101000011111100111110100000000110001100111111110010100100100101111011111010100000100100011101111111111", + "00110101100000010010001011001000111111010001001110011011100011000101001011101001001001001110001001001001100101001111101001011000001001001", + "10010011101001101111000000000100110000011101010000001011010110000100110110001111100101001000000101001111010000111110011000111000000101001", + "10100001001111011010011001110111010011111110110011110101001010011000101010001100000110101011100110101011001000110110000000110101111110101", + "11011111000001100011110001111110001001011110001101000010101101010011101111010100111110010001011110010010001110110101010111110111000110010", + "11101101111011001110010000010010000101010010000011000010011001110110001010110010010011100101001110010100111111101100101100000100001010010", + "00100110110001011010010110110011100111010011111000111010000001001010011110111001010010000110101101111101100111100000110100001001000011111", + "11001101011000110100110100011011011111101011000000011111000110001101011001100001101010111110010101000000100101100011100011011011101011000", + "00000110010000111100101010100100010011110101001010011110010110110000111010001111100100010010010011001111010100010110010010101011100101001", + "01011000001011111010100110100101010010111100100011110110001110101000100110000100100100100011100100100100001000100010000100110101100100100", + "01001010111100110111111011011111101011000110001011010000001101011111101101010100111110010011011110010100001011100101000011100011011110010", + "00010101111111101101101111000001100101001000000101000011111100101110011100111010110000011101010000011011111110000000110110000011010000011", + "10110010001110001100011100010011100100110011100100101111000000111110000000111001010011111100110011111001000010011000111010011010110011111", + "00110101000110010101001011001001011110001001011110011001000011101101010011101001001001011110010001001001000101010111110101011111001001001", + "10010011000111101100100000000101010000000101001000001100110110011100101110001111100101010000011101001110110000110110000000111111100101001", + "10100001110001010001011001110110110011100110101011110010101010000000110010001100000110110011111110101100101000101110001000110110000110101", + "11010111001011100111110011111111001001011110010001000101001101000011100101010100111110001001001110010101001111101101011111110000111110010", + "11100100011101010100010110010011100101010010010101000000111000110110000000110010010010000101001010010010111110011100101110000010010010010", + "00100110110001001010010000110010000110110011111110111001100000101010011000111001010011100110101011111001100110000000110110001110110011111", + "11000000011100110110110100011010111110001011000110011110100111101101011111100001101011011110010011000000100101000011100101011000001011000", + "00000111011000101010101010100100010010000101001011111111010110011000111110001111100101010010010101001111110100110110000100101000000101001", + "01010100101011101000100000100101010011100100100010010110011110000000110110000100111100110011111100110100101000101010011000111101100100100", + "01001111111100111111111011111111110011011110010010111110010101000111110101011111100110001011000110001011111011101101011011101011111110010", + "00011000100111110001101110001001111101010000011101100011100100110110000100101000101000000101001000000110001110011000111110011010100010011", + "10111010101110001100011010101010111100110010111100101011101000101110101000101010100011100100100011100110101010000100110010000111101011111", + "00101000100110001101001010001000101110001000101111100011101011101001111011111000101001011001010001001010001101000001010101001001100011001", + "10011111100111111110100011111010110000000010101000111111010110011011001110001111100101010111111101001011111000110000100000111000111111001", + "10001100110001011111011010110001010011100001001010111001001010000111010010011001000110110100011110101110000000101101101000110100010010101", + "11001110000011110001110010011111001101011000010001111110001111000000100101001001111110001100101110010001000111101110111110110011001010010", + "11010101011101011110010000100001100011010110010100011110101010110100000001111111101110000101001011100000010100011101101111101010100100000", + "00010110110000010000010100100110011000110011111111010111111110101010011001000100101101100110101010000100001100000000110111100110100001100", + "11100101011100001010110011011110100000001011000110110100111001101101011110001100110101011110010010111010001011000011100101100001111001011", + "00111011011001010010101011000000001010000100001011000101011010011000011110111100110011010010010100010011111010110010000100010000010111010", + "01000001101011111000100010010001000011100101000010001000000110000100010110110111000100110100111100100111000100101100111000100100010100100", + "01001011011101110101101001001101101011011001110011011010001101000000010101010111011110001100100110010001010011101011111011100011001000110", + "00111000000111110001101010000011100101010111111100001111111100110001100100101011110000000010101000011000101110011011011110000010100101011", + "10100011101110010100001001110110100000110101111100010011100010101101001000100100010011100001000011111100110010000011010011011110100110011", + "10001100000111010101001010011100111000001101001111000101110001101111011010100100110101011110010000111011100111000110110100110001111110111", + "11100010000111111110101001111000101110000101001001100001001000011100101111110010011011010000011100110010010010110110000001010000010110110", + "01001000110000110111001111011011001101100110101011011001010100000000110011100001011000110011111111010110000110101110001000001100010101010", + "10101010000010111001101011010011010001011111010000011110000001000011000101100111101000001001001111001001000001101001011111001011001101001", + "00111101011100101110011000101111110101010011110100111110100000110010100000000001101010000010001010000000110010011010001110011010100010010", + "11010110110000101000010110010000011110110100011111110111111000101101111000111010101011100001001011100100111110000110010110000110100101111", + "00101101011100111010000011011000100110001100100110110100111111101010111111110000110011011001110011011011110101000000000101000001111111000", + "01110111011000100011000000101000001110000010001011000101011100011011011110010010110101010111110101010010000100110001100101110000010001001", + "01011001101010111000001111110001000101100001000010001000010100000110010111001001011000110100111101010110001010101101111001001100010011000", + "10101011011100100100111010100101110101011001110010011010010011000000010100101000000000001100100111101001001001101011111010001011001011101", + "10010100000110000001011001001001111011010111111101101111100010110001100101011110001110000010101001100000110000011011011110111010100111110", + "10111111101111010101000111111110111000110100111100111111101110101101101000001111100101100001000010100111111100000111010011100110111110100", + "11111000100111110100100110001010101000001100101110100011111001101011111010001000110101011001010000111010001011000000010100100001100011011", + "01111010100100011110000010101110101110000010101001101011001000011011001111111010111011010111111100110110101010110000100001010000101011010", + "01101000110100110110101010001111001101100001001010100011010100000111010011111000111000110100011111010110001110101101101000001101100010110", + "10011111100001111000011011111011010101011001010101111110000011000000000111101111101000001100101111001011111000101010111110001011111110001", + "11100101011010101110111111001001110011010111110011101100100011110000100011010101001111100010001111100110011001111011001101111010010111100", + "11001011110000101001010000011000011001010100011000000001111111001101111111010110101100000001001100000100000101100110010101100111110100000", + "01001001011101011010010101111010100001101100100000100010111000001010111000001111010100111001110100111101010011100000000011100001001100111", + "10000110011000100011101110000000001111110010001010010111011000110011011010100011110010010111110010010100101010010001110011010001000010010", + "00010001101010011001010000011111000100111001000011000010010100101110000111100010011000100100100101010110110110100101100101001100111001010", + "11100110011111000101010100001101110101000001101011100100010011011000001100111010100000010100111111101111100001100011100010001010000001101", + "01010000010010000000101111111001111011001111100101100001100010101001111101010101001110011010110001100010000000000011010110111010000111100", + "01110010110100010100011001111111111000110100100000111001001110111101100010010100100101111001010010100100011101011111011011100011101100100", + "01111100001001110100011100001011001000001100111000110111011000101011110000001110010100111001010100111101011010110000010110100111010100111", + "00111111001110011011001110011111001111100010101110110110101001111011001001100000011010110111111010110010111011010000100011010111011010110", + "11100100110010110000011001111110101100000001001101001110110101100111010101100010111001010100011001010000110110001101101110001110111001010", + "00011111000001111101010100001011010100101001010001001101000011101000000001111000101001001100101001001111110001001010101000001000001001001", + "10100101001010101011100111000001110010001111110101110100100010011000110001010100101110010010010011100000000000010011010011111010010111100", + "10001011001000101110111000101000011000101100000110001001111110110101100001010111001101111001010010000010001100001110001111100110110100000", + "10001001111101011001110100010010100000010100111110111010111001110010100110001110010101000001101010111001011011011000001101100000101100111", + "11000111000100100100001111010001001110000010010110001011111000001011010100100010010011001111100100010010101011101001101101010100100010010", + "00010000010110011101010001110110100101100001010101011100110101000110011101100011111001010100111001010000110111011101111011001011011001010", + "11100110111011000001010101000100010100111001110101101011110010100000010010111011000001101100100001101001100000001011111000001100000001101", + "01010000100110000100101111001000011010110111111011111010000011010001100011010101001111100010101111100110000000111011011000111000001111100", + "01110011001010010010111001100110111001000100111000100010101110000101101110010100100100100001000100100010011101100111000101100101100100100", + "01111100010011110010111100011010101001010100101000100111111000000011101000001110010100101001001100111011011010101000001010100001001100111", + "00111111111000011000001111111110101111111010110111111111001001100011010001101111111010101111100010110111111011011000111011010000111110110", + "11101000110000110100011110001111001100011001010100100011010101111111001101101000111001001100000001010010001110010101100110001100100011010", + "00011010111111100111010110101010010100101001001100101010100011111000001011101010101001010100111001001010101000010010100000001110101011001", + "10101000100000101011100010001000010010001111100011100010000011011000111011011000101111110010010111100010001001100011010001111101100011100", + "10001111110110110100111011111001111001001100000000111110011111010101100111011111101100011001010100000011111101101110001101100000111110000", + "10000100111101010111110011000011000001110100111000001101011000010010100000001011010100100001101100111111100011111000001011100010111000111", + "11000010111100101100001001001001001111110010010111111000111000100011010000111101010010001111100010010110000011001001111011010111110110010", + "00010001111110000111010111100110100100111001010101100100100101101110001101100100100001000100100001000110011111010101100111000010110101010", + "11101111110011000011010010011100001100100001101101100001101010111000001010100110011001110100111001110101011000000011100000000101110101101", + "01011101100110000010101010011000000010101111100011010000011011001001111011010000010111111010110111111100111000100011010000100000011011100", + "01110110001010001000111011111111100001000101100001001100000110010101000110001011110100111001010100111000110101111011001101111000111000100", + "01101100110011110000111000001011011001010101011000001111010000000111000000001001010100101110001100111011110010111110101010110110001000111", + "00000111001000000010001001000101001111111101010110111100101001100100110001111101011010101000000010110110000011011110011011010110101110110", + "11011001010000111100011010101100101100011110110100100000110101111000101101100110111001001011100001010010101110010110000110001110101101010", + "00001010100111110101010100010000010000101111001101000011100001111011001011100110001001010001011001001101111000010001000001001101010101001", + "10100101101000110011100101010000010100001011100010110010010001011010111010010010010011110010010110010001001011100010010000010100110011110", + "10001010011111101100111111110101100111001100000000101100000001010101100110101011110010011001010101111001010111101110001100001001111000011", + "10100000111101011001110101000011011111110100111000101011000110010010100001101011001010100001101101000110100101111000001011011010100000100", + "11110111111100010110001101001001010111110011010111111010110100100011110000010101000100001111100011001110000101001101111011101111001110001", + "00000000011110000101010101100010110100111000110101100110111101101010101101001100111001000011100001010110011011010011000111011010000100010", + "11010110010010100001010010011010010100100110001101100001110010111111101010111110000001110011011001101101011000000101000000001100010101001", + "01101001100110010010111100011110011010101000000010010000000011001110011011001000001111111101010111100100011000100000110000111001111011000", + "01101111001011100000110001111111111101000010100000101100001100010110100110011011100100111100110100100000010101111100101100100001111000000", + "01110001110011111000101110001011001111010000111001101011001010000001100001001001001000101001001101001010010000111001001011001111101001001", + "10100111001000110010001001000011010001111010110110011010110111100011010000011101000100101111100011001111100001011000111010111111001111001", + "01011101010001100100011000101110110010011001010101000110101011111111001100000110100111001100000000101011001000010101100110110111001100101", + "11111010100111101101001111111010001100101000001100111111101111111000101011001111111111010100111000010011111110010110100000110100111110010", + "00000000101000000011101010001100000010001110000011100010011011011100011011111000110111110101010111110110001101100101110001100100100011100", + "11111110011111000100101010101111100001001011100000101010000111010010000111001010110100011110110100011010101101101000101101101000101010000", + "10000010011101001001100110001101011001110011011000100011000000010101000000011000101100100110001100100010001011111011101011111010100010111", + "10111010011101010111110011111001010011110101010111111110110010100000110000101111100010001010000010001011111011001110011010001111111110010", + "10111010111110010100111011111110110010111100110100101100101111101000101100101011100101000011100000100010110101010010000110110010011100100", + "10111010110011101001110100001100001010100110001101001011101100111111101011010001011111110011011000010011110010000101000001100100101110001", + "10000010100101010010101111000010000100101000000011011010011101001110011010100011010001111101010110011100000110100000110000000000001000010", + "11111110101100000001000000101011100101000011100000100110000000010110000110100000110010111100110101111100101011111000101100011001001011110" + ], + "2": [ + "11111110011100010100110101111011111111011111110101101101101100010101111011100000000101010100001010000001001100011010001111101010101111111", + "10000010011001100110001010000101001001110111101110111101001001101111110001110101111011011111001011100101010100000110010111100001101000001", + "10111010000001011101110011000101111010011100000011000011111010110101111100011101010111111111110011011000100011000000000101100110101011101", + "10111010001110010111101010101100100000100101101011110111101101001101110000100010101111101011110101010000010010110101100100010101101011101", + "10111010110010100011100011111111001001101011000010111111111011010111001101101111110011011010111100110111111100101011011000100101101011101", + "10000010001010001010000110001010000100011100000011100011100100110000011100011000110110000010100110001010001011101101011011100111001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000110010110110011010001010110111110000001111100010110110010010010001111000111011011010011110110010001000101110001000110111000000000", + "00110011110111001010110111111111011011100110010001111110110111001000101010001111110101011000101110001111111111101001011110110001111010000", + "10100001111000010100110001111011111111000111110101101101101100010101111011100000000101010100001010000100110100011010001111101011010100000", + "01000011011001100110001100000101001001101111101111000111001001101011110001111101111011011111001011100000101100000110010111100110011111100", + "00000101000101011101110111000101111010000100000010101111111010110011111100011101010111111111110011011011001011000000000101100001000111011", + "10010010001000010111101100101100100000111101101010001101101101001001110000100010101111101011110101010010101010110101100100010100101011010", + "00100100110100100011100111001111001001100011000010111011111011010111001101110110110011011010100100100101111100101011011000100010100010110", + "01011010101110001010000001101010011100000100000010110001100100110110011100011000010110000010111110010010111011101101011011100101110010001", + "00001100100010000000101100011100000001011110111000011000000000100010100111011010001101101100110000011011111110011000111110000000011100000", + "11101010111110100111011010011010100110001010011100000001011010100001000111110100011000110101010011111010100010000100110010011100011101100", + "01111000100001001111101010100000100100011100001110110110110110001110100110111001011110001111010001011111101101000001010101010001001111011", + "11110111101101010000111010110011111111011001011001110001111111111101000001001101001101101001111101010110011000110000100000110000101001010", + "01101000101100110000011010101000011111101000101111000010010110111110010111110110111010010010011110110110100000101101101000101100101010110", + "01001011010011001100110111110111110011100110010001010110110111010010101101111011110100110000101110001001110111101110111111101111110000001", + "10010000000010010101010001111001111111010100110100001101001101100001111101000110000101101100010010010011001110011101101110010100010100000", + "00110111000011100111101100000111110001101001001111011100001001011011110001110101111011101111010011111111010110000000110110001000011111100", + "11010101111001011011110111000111001010000101000011000011011011011001111010000111010110110111101011000000100101000011100101011011000111011", + "01011111101000010001101111111100010000111101001011111111101100010111110001001111101110000011100101001111111100110010000100101010111111010", + "00011000101100100010000010001101010001110000000010100011011011000011001011001000110011100010111100110010001000101100111000111101100010110", + "01101010110110001011100010101100100100000010100010101010100100100110011010011010110110110010100110001110101011101011111011101011101010001", + "10011000111010000110101110001000101001011110011001100010100000001000100001011000101100100100101000000110001110011011011110011010100010000", + "10101111111110100001011111111110011110001011111101111111011010111111000000011111111001011101000011100111111010000011010010000010111111100", + "01000101011001001110001011110000100100001111101110101100010110111010100110000011111110110001001001001111001101000110110101001110010001011", + "10000011110101010001011101111111000111011111111000101100111111101101000111000000001101011011100101001010110000110110000000111110010101010", + "00110001010100110110011000000110100111101000101110100110110110110100010111111011111011011110000110101100101000101110001000110111111110110", + "11000111010011010010110101000011001011100110010000001110110111001100101010011011010101011100111110010101001111101001011111110001000110001", + "10100000011010000100110000101011100111000110110100001101101101110101111101101000100101010010001010000010101110011010001110001011001010000", + "00000110111011101110001011001001001001101111001110011011001001001011110111101000111011011011001011100001111110000110000110000110100011100", + "01001000100001010101110101101011110010000101000010110001111011010011111010011000010111111111110011011110111101000000010101000000010011011", + "00011110101000000111101110000000101000111101001011011001101100001001110110101100001111101101110101010001111100110101110100110100011101010", + "00101000110100101011100110010101001001100010000010100001101011010111001011111110010011011010100100100010100000100011000000100011111100110", + "01011010101110011010010110101100011100000100100011110111101100110110011100000011010110000010111110010001101011100101000011100101001110001", + "10000101100010010000101110110000010001011110011001110000011000000010100001000101001101101100110000011010011110000000110110000001000000000", + "10101010111110111110111000101110100110001011111001100011110010100001000111111110111000110011010011111000100010011100111010011100111011100", + "01111001000001011110101011101000111100011101101011010110001110101110100110110011111101001001010001011001110101010001010101010000011001011", + "10110010001101011001010101111111111111011001111000101101111111111101000001011110001000001101111101010111001000110000100000110000001101010", + "00100101001100111001111000010110011111101000101011011100110110111110010111110101111000110010011110110011010000101101101000101101100110110", + "11000111110011011101100101011011110011100110010000000011100111010010101101110111010011010110101110001010100111101110101111101111011110001", + "10011100000010011101100000100011111111010100110010010111111101100001111101001000100110001100010010010100010110010101010110010101010010010", + "00110111000011110111100011000001110001101001001110011011111001011011110001101110111100101111010011111100000110001001001110001000110011111", + "01011100111001001010011101101011001010000101000110101010110011011001111010011110010001010111101011000001000101011011001101011010010011000", + "00011110001000001000110110011000010000111101001111010100100100010111110001001000001010000101100101001110110100101111101100101010011101001", + "00010100101100110011011110000101010001110000000110111011000011000011001011011110010000110100111100110100111000111011011000111101111100110", + "01101111110110000010000111111100100100000010100010111110000100100110011010001111110011001110100110001011111011101101011011101011111110001", + "10011000111010001001001110001000101001011110011100100011100000001000100001001000101110010100101000000110001110011000111110011010100010000", + "10101010111110110000001010101110011110001011111101101010001010111111000000011010111110100011000011100010101010000000100010000011101011100", + "01001000111001000100111010001000100100001111101000100010100110111010100110001000111101000111001001001110001101001111101101001111100011001", + "10001111110101000001010111111111000111011111111000111111001111101101000111001111101010001001100101001111111000111110011000111110111111001", + "00110100110100100111110101001110100111101000101010011011011110110100010111111000111100111010000110101000011000110110000000110110000010101", + "11000010110011010101101111111011001011100110010100010001111111001100101010011000010001000110111110010011011111110101010111110001001010010", + "10100100111010000111101100000011100111000110110001011001110101110101111101101100000110011010001010000010111110001100101110001010100100000", + "00001110111011101111101110010001001001101111001110000001101001001011110111101110011110111011001011100100100110000000110110000110100101100", + "01000100100001010010010000101011110010000101000111110110111011010011111010010011010101010111110011011011101101000011100101000001111111011", + "00011011101000000110111100110000101000111101001011010000111100001001110110100101001000011101110101010010011100110110010100110100001001010", + "00100000110100101001010010101101001001100010000101100011001011010111001011111110101000101010100100100010000000100010000000100010001010100", + "01010011001110011010001011101100011100000100110011110110010100110110011100000011111001010010111110010111010011100101000011100101010000010", + "10001100000010010001000011111000010001011110010100101001101000000010100001001110011010001100110000011110101110000000110110000000110100011", + "10101111011110111000000010010111100110001011101001111100010000100001000111110101100100101011010011111110110010011000111010011100100111111", + "01111101100001011100110111011001011100011101111010000000101000101110100111110111010101000001010001011101100101010111110101010001111111011", + "10111010001101011001011000100111111111011001110000110001011101111101000000111000111000001101111101010100010000110110000000110000010011010", + "00101001001100111111111101000110011111101000101010011101010100111110010110011110111000111010011110110000000000101110001000101100010010110", + "11000010110011011101100111101011110011100110001000001001100111010010101101011110010011000110101110001011000110001101001111101111010010001", + "10010100100010011111100100011010111111010100110011010011111101100001111100101000011110011100010010010110110111110100110100010100111100010", + "00111111100010110111100110000000010001101001000110011111111001011011110000001110010100111111010011111010111111101000101100001000111101111", + "01010101011000001010011010100011101010000101010111110000110011011001111011110101001001010111101011000101110101111011101011011011101111000", + "00011011101000001110110010100000110000111101001111001010100110011111110000000011010010011101100101001000000100001110001010101010010001001", + "00010000001100110001011010110100010001110000010111101101000101000011001010011010111000101101111100110000001000111010011100111100010010110", + "01100011110110000010000011111101100100000000101011101010000110111110011011100011100011010111000110001111001011101101011011101011001001001", + "10011100111011101001001101110000101001011100011100101011100010000000100000101000001110001101001000000110110110011000111110011010100100000", + "10101111111110010000001111111110011110001001100100111110001010101111000000111111111110101010100011100011111011000000100010000010111110100", + "01001000111000100100111110001001100100001101101000100010100110111010100111101000100101000110001001001010001100101111101111001111100010101", + "10001010110101100001010010101110100111011011110000101011001111110101000110101010100010001000000101001010101001011110011010101110101010101", + "00111000110101000111110010001110000111101010111011100011011110100100010110011000100100111011100110101010001000010110000110100111100011001", + "11001111110011010101101011111011101011100100010100111111111101010100101011001111101001000111011110010111111111010101010001101001111111010", + "10101000011011000111101110110010100111000110100001011011110011100101111100101101001110011011001010000000011110001100101010000010001000000", + "00010011011011101111101000101000001001101101000110101101101011000011110110011110101110111010101011100010000110000000110110001111101011100", + "01100001101000110010010011101011110010000111000111101010111001001011111011100011110101010110010011011001010101000011100101011001010001011", + "00101110111000100110111111111000101000111111010011111010111100001001110110000110001000011100010101010100101101110110010100101101010101010", + "00101100101101001001010010010100001001100000000101100101001011010111001010011101101000101011100100100110110001000010000010110010100111000", + "01111110110110111010001101011101111100000000101011000000010100101110000101110111011001010011011110010111100010000101000001100100011111110", + "10111000110011110001000110100000110001011100001100110001101000010010110000111000110010001101010000011010010110100000110000000000010011111", + "10111010001110111000000001000110000010001001111001000100010000111001011110110110100100101010110011111010000010111000111100011101110010111", + "01100001000000011100110101101001111110011101111010001000101000111110101111110110010101000000010001011011000101010111110001011001010011011", + "10100111101101011001011110011110111001011011110000011011011101110101001000101000011000001100011101010100110000110110000000111001011101010", + "00001100000101011111111110000110011001101010101010000111010100100110010110001110011000111011111110110100111000101110001000110100111100110", + "11010111100011111101100100100011110001100100001000101001100111010010101101011101010011000111001110001111110110101101001111110110001110001", + "10111000011011111111100100100010111001010110110011010011111101100001101100101011011110011101010111110000000111110100110100000100010001110", + "00010011011011010111100001110000010001001101000110101101111001000011111000011010110100111110110100011010001111101000101100001001110010011", + "01100001101000101010011101111011101101000111010111101010110011001001101011100011101001010110001100100001001101111011101011011011001000100", + "00001110111000001110110110110000110101001111001111110010100110001111011000000000010010011100000010001100110100001110001010101111000100001", + "00001100101101110001011000000100010010001000010111100101000101010010000010011011111000101101111100110110101000111010011100110010111110110", + "01111110110110000010000100000101100010001000101011000000000110101001010011110011000011010111000110001111101011101101011011100100000110001", + "10111000110011101001001001010000101111000100011100110001100010010011100000111000101110001101001000000010011110011000111110000000001110000", + "10111010001110010000001001101110011100010001100101000100001010111001000000110000111110101010100011100010000011000000100010011001100101100", + "01100001000000100100111110111001100011011101101000001000100110111111010111110000000101000110001100101011000100101111101111011111001100101", + "10101111101101100001010111111110100111001011110000111111001111110011001110101111100010001000000010101111111001011110011010111111111110101", + "00001000100101000111110110001110000000000010111010100011011110100101000110011000100100111011100001001010001000010110000110110110100011001", + "11011010100011010101101110101011101110111100010100101011111101010101000001001010101001000111011001010010101111010101010001110101101011010", + "10111000111011000111101010001010100101100110100000100011110011100100110010101000101110011011010010010010001110001100101010000100100010000", + "00011111111011101111101011111000001111111101000111111111101011000100111110011111101110111010110011111011111110000000110110001001111111100", + "01101100101000110010010010011011100100001111000111100000111001001000111001100111010101010110001011000111101101000011100101011011011001011", + "00001010111000100110111000100000111010100111010010110000111100001111110000001000101000011100000101001110011101110110010100101110110011010", + "00001000001101001001010101100100001110110000000101100101001011010010111100010110101000101011100001000110000001000010000010110010110011000", + "01110011010110111010001110001101100100010000101010001000010100101000010011110110011001010011011001110101000010000101000001100101110011110", + "10110101110011110001000001011000111110110100001100111011101000010011110000111000010010001101010111111100110110100000110000000000011101111", + "10111110001000111000000011100110001011010001111000000110010000111000101110111110000100101010110100111000101010111000111100011000011000111", + "01100101100000011100110010000001100110111101111010001000101000111111101001111101010101000000001001001011101101010111110001011111001001011", + "10101010001101011001011001100110111001001011110001010011011101110010001000101011011000001100000101001110011000110110000000111110110111010", + "00000001000011011111111111110110001001100010101010001101010100100101010110001010111000111011100110101010000000101110001001010110110100110", + "11010011100111111101100011111011100001111100001001101011100111010100101011010011010011000111011110010101000110101101001110010101101000001", + "10111100111001111111100011010010111000000110110011010011111100100100001010100000011110011101010111110000110101110100110101100100000101110", + "00011110111011010111100011100000001001111101000111100101111001100101111110011011110100111110110100011000101101101000101101101000011110011", + "01101100101100101010011010000011100101101111010111100000110010101000101011100011101001010110001100100111101011111011101011111011000110100", + "00001010111110010110110101010000111101100111001110110000100110001110011000001001110010011100000010001110011010001110001010001110001110001", + "00001000001101101001011111101100001011010001010111100101000101110010000100010001011000101111100100100110000100111010011100110010000100110", + "01110011010110001010000010111101100010010000101010001000000111101001010011110001100011010111011110010101000011101101011011100100001100001", + "10110101110101101001001001000000111111010100011100111011100011010011100000111101101110001101010000011100110110011000111110000001100010000", + "00111110001010010000001110010110001100010000100100000110001011011001000110111110111110101110110011111000101011000000100011011001000101100", + "01100101100010111100111000001001100011011101001000001000100110111111010001111011000101000010001100101011101110101111101110111111011110101", + "10100110001101111001010101010100111111001010110001010011001110010011001000101101000010001100000010101110011011000110011011011110101000101", + "01011101000001001111110111101010001000000010111010001101011111000101000110001000000100111011100001001010000110001110000110010110101011001", + "11111011100101011101101111111101100110111100010110111111111101010101000011011111101001000011011001010011111001001101000001010101111111010", + "00000000111011000111101110001010111101100111100000100011110011000100110010101000101010011001010010010110001010010100110010000100100010000", + "11111110111011101111111110101000001111111101000110101011111010000100111110011010101000111010110011111010101110001000101110001000101011100", + "10000010001110100010011110001011100100001111000010100010111000001000111011101000110001010110001011000010001101011011101101011010100011011", + "10111010011100100110101011111010111010100110010100111110101101101111110000001111101110011000000101001011111101101110011101101111111111010", + "10111010101111010001001001100110001110110000100111000111001011010010111100010111001100101111100001000010101011010010000011010010011001000", + "10111010110110100010011100000001100100010001101000001000010101001000010011110110111001010111011001110011101000000101000000000100101001101", + "10000010010111111001000111100010111110110100001110010011100001110011110000101100110010001101010111111100011000100000110000100001010111110", + "11111110001000110000011111110000001011010001111010001100011000111000101110101001000100101110110100111100000100111000101100111000110100110" + ], + "3": [ + "11111110000110011101001111100111010001010111000011001001110000001010101001011110001111110010010010000010101110010010001110011010101111111", + "10000010101101101111010111101111000111100110011011101110001100000101000011011101101100011001010011100010110110001110000110000101101000001", + "10111010110110111111100100001010010111110011100010100110010011000100111000110101010100100001101011011111000101011000010101000010101011101", + "10111010011011101111101100101000101101110111010010011010011011110010010010100011010010001111100101010110100101101101110100110001101011101", + "10111010000111011011110011111110011010110001100100111110110110111100100101101111100101000011111000110011111001010011000010101001101011101", + "10000010010110010010111010001101110110000011100011100010101111101110001100111000111111110011000000001010001010000101000001101011001000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000000110010010011110001010001100000110011010100010010110101010111101011000100111001011111000110110001000010110000110101100000000000", + "01110110011101101100101111111100000000100100001101111111110000101011000111111111111111010001001000001011111111010001000001101110000000110", + "10010001100110011100001111111111110000000111000011110011100000001010101001001110001111110010010010010011001110000010010010011101110100010", + "00000110001101101110111010110110100111100110011010110000000100000101000011010011101100011001010011111111010110001110001110000001011111111", + "11000001110110111111100101111011110111101001100011001010010011000100111000100011010100100001101011000000100101011000001101000011000111000", + "10011010011011101110001001001001001101110101010010010100010011110010010010101101010010001111100101001100000101101101111100110010101011001", + "00100101100111011011110001010111011010110111100101011110110110111100100101111100100101000010111000110010011001010011000010101100100011010", + "01101110010110010011011110000101010110000001100011000010101111101110001100111000011111110010100000001101011010000101000001101011010011101", + "00010100010010100101101110010100111010110010101100011100101000011100001011111110010001111100101110000000111110100000110000011010111101100", + "00101010110000000001000110111001101101001001100000101100000101000110101010011101110010111101000101100100110010111100101101000011111100100", + "01001000111001000111110100100100101011011100011000101000111011010001110010010101010100101001001001001001110111011001001000100110101111001", + "10110010111001011000101101000000010001010000101100000110110010110011110101100101011010101111100101001000000010111000111001010111101001001", + "10100100011101010011001000110110011010000100001110100111111111101001010101001110111001001100000110101100001110110101100000001110101010101", + "01000111000100110101010010010010010110101110001001001111001001001001001001110110001001010100111110010111011000110110100111001001110000010", + "10010001010011101101000110000001101100000001010011101000000000101010000011001010010011110100001110000100101011100101110100011010010101100", + "00001011111111111110110010101000111011101100001110101111000010000011110001010101110010011111001101100000110111101000101100000110111110000", + "11000001001001111110110101001111100001101001110111000111110010000111001000100101001010100111110101011011100101111011101011000001100110111", + "00011111100110110111110011111111011011111111010110111110110010010000001100101111100100001011110011010011111100001010011011110101111110010", + "00101000110100101010011010001001000110110001110100100011010110011100000111111000111001010100100100100110001010110100100101001010100010100", + "00101010100010000011110110101011001010001011110110101011101001101000100110111010100001101100111110010010101001100011100010001100101010010", + "11011000101011100101111010001000101100110010111001100011001001011111111011101000101111100010110000011010001000000011010110111001100010011", + "01101111101001011000111011111111111011000011100100111110100100100100110100011111100100100001010011111011111101011011001010100101111111111", + "10001101001000110110011110010010110111011010001001000001011011110001000000010000010000101111010101011001011000111110101111000000010000111", + "01111111101001001000000010011110001101011010111000010011110100110101011111101110011100101001111011010110101001011110011010110000010100110", + "10101100000100010011011010110010001100000100011011110000011111101010101101000011111111001010011000110010110000010110000110101101111111010", + "10000011111101101100101011011100000000100100001101101011101001001011111111110011001111010000101000001011100111010001000000101111000111001", + "10010100000010011100101101001111110000000111000010010101100000101011111001010101001111100010010010010100000100000010010011111100001010010", + "01001011101111101110011100110110100111100110011010111110000100000101101010011100101100000001010011111100011100001110001111100001000011111", + "00000000010000111110100111000011110111101001100010000010010010000101000001100000010100111001101011000001011011011000001101100011110011000", + "11011010011111101110001000010001001101110101010010111100010010010011100011001110010010010111100101001110111011101101111100010011111101001", + "11100000100101011011110011111111011010110111100100101100110110011101001101110101111101000010111000110100110101010011000010101101111101010", + "10100110110011010011011001000101010110000001100011001000101111101110000100101101000111110010100000001101110010000101000001101011001111101", + "00011000110011000101101100000100111010110010101101000110101001011100011011000101001001111100101110000100000110100000110000011011010001100", + "11101110010001000001000110110001101101001001100110000110000100101111010011100110100010111101000101100110001010111100101101000010110010100", + "01001101011001100111110110010100101011011100011111001110111011101000100010001110010101011001001001001111011111011001001000100111001001001", + "11111111011001111000101010000000010001010000101010001000110010100011011100101010011011010111100101001010101010111000111001010111100100001", + "01101101111101010011001010101110011010000100001101101111111111100000101100001101111000110100000110101100110110110101100000001110011110101", + "00000011000100110101010011001010010110101110001011100111001001011000111000010101001000001100111110010101100000110110100111001000100111010", + "01010100010011101101000101001001101100000001010100011010000000100011111011000011001011110100010110000010000011100101110100010011001010000", + "11001011011111011110110100101000110011101100001100100101000010010011101001000000101010011111010101100000011111101000101100011110100011100", + "11000001101000111110110111011111101001101001110000011101110010010111000000011110010010100111101101011111011101111011101011000000001011011", + "01011010100111110111110000000111011011111111010000110000010010001001100101010000010100001011100011010000111100001010011011110100000101010", + "00110000110101001010011011111001011110110001110010100011010110011101001111100011111000110100100100100010110010110100100101000011100010100", + "00101111100010100011110011111011000010001010010001111110101001100000000111111111100000001100111110010011111001100011100010000101111110010", + "11101000101011100101111010001000111100110010011010100011001001000110011010101000101110000010110000011010001000000011010110100000100010011", + "01011010101001011010111010101111100011000010100110101011100100110101010101101010100101100001010011111110101101011101001010111101101011111", + "10101000101000110110011110001010101111011011101110100010111011111000100000011000110000101111001101011010001000111000001111010001100011011", + "01111111101001101010000011111110011101011011011011111111110100100101011111101111111100101001100011010011111001011000111010110000111111010", + "10001001100101010101011010110010001100000101011100111111111111111010101101111100111111001010000000110110011000010101100110101100010000110", + "10010010011100101010101101000100001000100100101011000010001001010010111110001000001111010000111000001001011111010010100000101111010110001", + "10101000000011111100101000010111110110000111000100011101100000101011111001011110001110000010010011110100111100000011010011110100111110010", + "01000010101111001100011001111110101110100110111101001101000100001101101010000101101101100001010010011010110100001110001111101000111001111", + "00110100110000111110100111000011100000101000000001001000010010011101000001101101010101011001101010100101110011011000001101111011101001000", + "11101010111111101100001110000001010010010100010000000111010010000011100011011101010011010111100100001000000011101001111100001010010111001", + "11001100000101011011110110110111000001010110000010100111010110010101001101110110111101000010100100110100001101010101100010111100010100110", + "10101111010010110001011110010101000010000000000000101110101111111110000100110110000111110010111110001001001010000011100001101011001000001", + "00111101010011100011101100000100111011110011110010001001001001001100011011001010001001111100110000000000110110100011010000011010100100000", + "11111111110001010111000000101000000101101001010110101111100100111111010011100101100010111101010011100100101010111111011101000010111111100", + "01110001011000111111110111001100101101111100011111000110111011110000100010000101010101011001001000101111101111010000010000101001100111001", + "11110110011001100010101101001000011000010000010010111011111010111011011100110011011011010111100100101100001010110000100001011010001111001", + "01011001011101010011001000101110101101000101111101100001101111110000101100000000111000110100000111001000011110101101101000010010000100101", + "00110011100100111111010011011011101001001111010011111100001001011000111000000110001000001100111111010011011000101010101111010101001100010", + "01111000110011100101000100000001010111100000101100010101110000100111111011000000001011110100010010000010111011110011010100001100100010000", + "11000010111111010100110001111001101111101101100100100011011010010111101001011011101010011111010011100100100111101110001100000000100101100", + "11100100001010111000110011011110000000101000110000010010000010010001000000010001010010100111101011011011101101111000001011000011111111011", + "01001011000011100001110100011110110011011111101000111011010010001111100101010011010100001011100101010010011100001001101011110110001001010", + "00011100110101010010011010100000000000010001111010101001010110011001001111101000111000110101100101000010000010111101111101000010001010100", + "00101111000110111001110110010010000011001011001001100000100001100110000111101001000000001101011111110111010001101011111010000101010100010", + "11101101101011100101111110011000011011110011001011010011011001000110011010110111101110000011010001111110101000011011011110100000110010011", + "01011111101011010010111111111110000100100010111111111111100100110111010101101111100101100000110010111011111101000111000010111000111111111", + "10101000101100111110011110001010001100111011110111100010101011111100100000011000110100101111001001011010001000101000001111010111100011001", + "01111010101101100010000110101111011001011011010010101011101100100101011111101010111010101001100101010010101001011000111010110110101011001", + "10001000100011010101011010001011101101000101011100100011101111111000101101101000111001001010000110110110001000010101100110101111100010101", + "10011111111000111010101111111101101000000100110011111110001001010010111110011111101001010000111110001011111111010010110000101101111110010", + "10101000100011100100101010000110110110100111001100000011100000101111111111001100101110000011010011110110000100001011001011110100010110010", + "01001110001011010100011010110111101110100110100101000001001100001011110110010111001101100000110010011100001100000110010111101001110101111", + "00111101010100111110100110010011000000101000010001001000000010011101011001101110010101011000001010100101001011000000000101111011001001000", + "11101111011101100100001100000000110010010100001001001011010010000001100001000010010011010110000100001100110011110001110100001111000101001", + "11001101100001010011110010101111100001010110011010101101000110010001011001100101111001000010100100110110101101000101100010111010111110100", + "10100011000110111001011001001100000010000000001000100100110111111110001010101101000001110010111110001111101010000011100001101100000110010", + "00110100011101100011101101001101011011110011101010011011011001001110011011001010001111111100110000000010001110100011010000011000001110011", + "11111011001101010111000010101000000101101001011110100101100100111111011111101001000100111101010011100100011010111111011101000001100101111", + "01110001111000111111110001011101101101111100010111011000111011110101000100010111101101011000001000101101011111010000010000101111001101001", + "11111010101101100010101101100001011000010000010011110111111010111101000000100001100011010110000100101010011010110000100001011111000011001", + "01010000101001010011001011011110101101000101111100100101101111110000010100000011100000110101100111001000000110101101101000010110100100101", + "00110110001110111111010111011011101001001111010010010000001001011011111010011001011000001101011111010110001000101010101111010100011110010", + "01111001010111100101000101111001010111100000101100011011110000100111001111010011001111110010010010000001111011110011010100001100001000010", + "11000010111011010100110101000011101111101101100101001001011010010011100111000000101100011001010011100011000111101110001100000001101011111", + "11100001000110111000110110110100000000101000110001000000000010010100000000010001010100100001101011011001010101111000001011000011010101000", + "01001011110011100001110101111000110011011111101010010011010000001000101001011111110010001111100101010010101100001001101011110111010011001", + "00011100000101010010011100110100000000010001111000110101010110011001001001111010000000110101100101000000110010111101111101000010100000100", + "00100111110110111001110110111100000011001011001100101100100011100111111011111010111000001101011111110001000001101011111010000100011000010", + "11101100011111100101111101101110011011110011001000010011011001000110000010110101010110000011010001111110110000011011011110100000010010011", + "01011111100011110010111010110010000100100010111101111101100010110111010111110100110101100000110010111011100100000111000010111001110011111", + "10100100001100111110011110100010001100111011110001000000101011111100010100001000010100101001001001011010100001001000001101010111010011001", + "01111111101101000010010011111111011001011011010101111111101000100101010001111111111010101111100101010111111000111000111000110111111111001", + "10001000101011010101011110001001101101000101011101100011101111111001101101101000111001001100000110110010001000110101100000101110100010101", + "10011010101001011010110110101111101000010100110101101010001111010011110010011010101001010100111110001010101111110010110110101101101010010", + "10101000110010000100110110001000110110101111001010100010100000101111111111001000110110000011001011110010001100001011001111110100100011110", + "01001111111011010100001011111001110110110110100010111110001110001010010110001111110101100000101010011011111100000110010111101001111110011", + "00111101000100111110101100101101011000100000010001000101100010011101011001110101001101011000010010100110101011000000000101111011000110100", + "11101010010101000100010001101100100010001100001011011010010100000001100001001010000011010110010100001110001010110001110100001110101110001", + "11001101000001010011100011001111101001011110011100000100100110010001111001100001011001000100100100100110011100100101100000111010100100100", + "10100011110110011001001111011100001010011010001111011001110011111110001010100111100001110100111110010101011011100010000011101101101100010", + "00111100111101100011010101100111000011111001101010110110111001001111011011010001101111111010110000011100011110000010110110011000000010011", + "11111010100100110110100001011010001111111001011001100101100010111110011111100011100100111001010011111000000010011010111011000000100101111", + "01110000001001011111001011011011100001110100010001110001011011110100100100000001001101011000010000101010001111010111110100101110111110101", + "11111111001101100010010101111111000110000000010100011010111000111100100000100011000011010110011100101111111010110110000000011110101000101", + "01010000101001010010100001001000110101001001111100101001001111110000110100011000100000110101111111001011000110101110001001010111101011001", + "00110011001110011111001010110111111111010111010000000001001111011010111010010001011000001101001111010101010001101001001110010101010101010", + "01111001110111100100010101100001011011101100101010110010010000100111001111010111101111110010010010010000101000010010010111101100110010010", + "11001110011011110100100010110001100011110111100010110100011111110011100111001010001100011001010011111000110100001110001111100001100001111", + "11100101100110110001001110100100011000100100110001101101100011010100000000001010110100100001101011000111000011011000001101100010111001000", + "01001110010010000000010111101100111001001101101111010011010101001000101001010101010010001111100101001110110010101101101101010111110011001", + "00011100100100100010100110110110001000011011111100011100110111011001001001101100100000110101111001000111100110111011011001000010110011000", + "00100111110110100001001110111100011111011011010111000001100011100111111011111000011000001101000001110100100001101101011010000101110011110", + "11100101111111100100010111111110000111111111000010011111111000100110000010101110010110000011001111111101110000011000111110100000011101111", + "01011110100011111010100111011010010010111010101101101100100010010111010111111100110101100000100100111000111100000100100011111000111000111", + "01100001001100110111001110111010000000110111101001101001001010111100010100001100110100111001001001001011110011001001001100110111101001001", + "10100110101101001010010100000111010101000001000100000010101000100101010001111100111010110111100101001110000010111000111001010111010111001", + "01011101001011000100100011001001110101001001000100000000001110011001101101100111011001010100000110101010101110110101100000001111010100101", + "11111011001001010011001111111111100010010110111101111110001111110011110010001111101001001100111110010011111001110110110110001000111110010", + "00000000110010011100010010001000111110101101001011100010000001101111111111011000110110000011001111110110001000001101101111110011100011110", + "11111110011011000100100110101001110010110110111011101010001110001010010110001010110101100000101100011010101100000000110111101110101010011", + "10000010100100101111001110001101011100100100011001100010100011111101011001111000101101011000010100100010001011000011100101111001100010100", + "10111010010101001100010111111100100100001100011010111110010100100111100001001111100011010110010010001011111010110010010101001100111110001", + "10111010100001011010100011011111101101011010000100110100100111010001111000101011111001010100100100100010000110100100100001011011100100100", + "10111010110110010001001001011100001110011010011111001001110011111100001010110001000001101100111110010010001001100011100010001101011110001", + "10000010111101110010010101100111000011111111110011110010111000101001011010100011001111100010110000011101111000000011010110111000001000010", + "11111110000100111110100011001010001111111011010000100001100010011010011110000000100100100001010011111101000100011011011011100101001011110" + ] + }, + "31": { + "0": [ + "111111100011000110110010100111110000111100110110001111111100010110101100000110101000100000100100100101000111100100100100100100101000001111111", + "100000100001001011001111101100001110111110110101111110011101111000110101100000110011110101111001010010011101001110001110001110000001001000001", + "101110101111100000000101110000101000011011010101000010100111010010011111001010011110100000101100000111001101000000110101100000101010001011101", + "101110101110001010000001101001011100111000000101010110101101001010111101000010111011110101111001010010111110111011011011011011000010001011101", + "101110101110011110101001110111111100110000101010101001111110110101000010111100001111111001010011111001010111111001011011011011000111101011101", + "100000101000000010101000110010001111111101111010111100100010011111001010011110101000101100000110101100000110001111100000110101111011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001011101100011000000010001100011101100000101010100010110101100000110100001000111001010011111001010010001000001110001110000110100000000", + "101111100011000101100101001111111101110011100110001110111110101100000110101100111111100100100100100100100011111010100100100100111100001111100", + "011011011011001010110010100111011000100010110110001111000010000110101100000110000100100100100100100100100010011000100100100100110100100010110", + "110111101001000111001111101100000110111000110101111111000011100000110101100000100101110011111001010011111000110110001110001110001110100111100", + "100111000111110100000101110110001000011101010101000011101001001010011111001010001000100110101100000110101110101000110101100000110100011010110", + "001101110110010010000001101101110100111010000101010110010111000010111101000010110101110011111001010011111100000011011011011011011011110001100", + "111010001110001110101001110001110100110010101010101000111100111101000010111101011000111001010011111001010101100011011011011011011011001101000", + "000000111000001010101000110000001111111111111010111100111100011111001010011111011011101100000110101100000111001101100000110101100001000000000", + "011001011011101100011000000110101100011011100000101010000110110101100000110101100110111001010011111001010101000110001110001110001110110101000", + "100011111011000101100101001001011101110011100110001110101100101100000110101100001010100100100100100100100010111100100100100100100100000100100", + "100111011011001010110010100111011000100010110110001111000010000110101100000110100101000100100100100100100010011100100100100100100100110010100", + "000111101001000111001111101100000110111000110101111111000011100000110101100000100100010011111001010011111000110110001110001110001110100111111", + "010111000111110100000101110110001000011101010101000011101001001010011111001010001001000110101100000110101110101000110101100000110100010010101", + "010101110110010010000001101101110100111010000101010110010111000010111101000010110101110011111001010011111000000011011011011011011011100001111", + "111010001110001110101001110001110100110010101010101000111100111101000010111101011000111001010011111001010011100011011011011011011011010101010", + "000000111000001010101000110000001111111111111010111100111100011111001010011111011011101100000110101100000001001101100000110101100001011000000", + "011001011011101100011000000110101100011011100000101010000110110101100000110101100110111001010011111001010111000110001110001110001110101101010", + "100011111011000101100101001001011101110011100110001110101100101100000110101110001010100100100100100100100000111101100100100100100100011100100", + "100111011011001010110010100111011000100010110110001111000010000110101100000100100101000100100100100100100010011101000100100100100100100010100", + "000111101001000111001111101110000110111000010101111111000011100000110101100110100100010011111001010011111000110111101110001110001110100111111", + "010111000111110100000101110100001000011101110101000011101001001010011111001100001001000110101100000110101110101000010101100000110010010010101", + "010111111110110010000001101111111100111011100101010001111111100010111101000110111111110011111001010011111111111011111011011011011101111111111", + "111010001111001110101001110010001100110011001010101010100010011101000010111101001000111000110011111101010110001011011011011011011100100011010", + "000010101000101010101000110110101111111111011010111100101011111111001010011111011010101101100110101010000110101101100000110101100111101010000", + "011010001011101101111000000010001100011011100000101000100011010101100000110101111000111000110011111111010110001110001110001110001101100011010", + "100011111010100101100101001111111100010011000110001110111111101100000110101100011111100101100100100010100011111100100100100100100111111110100", + "100101010011101010010010100001110001000010010110001101110110000111101100000110110101100100100100100100100100000100100100100110100101100000100", + "000110101001100110001111101101110111111001010101111100111101100001010101100000100000110011111001010011111001100110001110001100001110110101111", + "010100011111110101100101110000001001011100010101000111111101001011111111001010010011100110101100000110101011001000110101100110110101111000101", + "010101111110010010100001101010101100011011000101010001000111000010011101000010100110110011111001010011111111000011011011011101011010101101111", + "111011010110101111101001110101011100010010101010101110001100111101100010111101000010111001010011111001010010111011011011011101011010111101010", + "000011111000101010001000110111011110111111111010111111000010011111001010011111011101001100000110101100000100011101100000110101100001000010000", + "011011001011101101011000000000000100011010100000101110100010110101100000110101101100011001010011111001010100110110001110001110001110000111010", + "100011100010000101000101001100001101110010100110001000101000101100000110101100011001000100100100100100100000101100100100100100100101010010100", + "100101011011101011010010100111110001100010010110001101110110000110101100000110110101100100100100100100100100000100100100100100100101100000100", + "000110101001100110001111101111110111011001010101111100111101100000110101100000100000110011111001010011111001100110001110001110001110110101111", + "010100001111110100000101110000001001111100010101000011111101001010011111001010010011100110101100000110101011001000110101100000110101111000101", + "010101101110010011100001101010111101011011000101010001000111000010111101000010100110110011111001010011111111000011011011011011011010101101111", + "111011011110101110001001110101001100010010101010101110001100111101000010111101000010111001010011111001010010111011011011011011011010111101010", + "000011110000101010101000110111001110111111111010111111000010011111001010011111011101001100000110101100000100011101100000110101100001000010000", + "011011010011101101011000000000001100111010100000101110100010110101100000110101101100011001010011111001010100110110001110001110001110000111010", + "100011111010000101000101001100000101110010100110001000101000101100000110101100011001000100100100100100100000101100100100100100100101010010100", + "100101011011101011010010100111111001100010010110001101110110000110101100000110110101100100100100100100100100000100100100100100100101100000100", + "000110110001100110001111101111101111011001010101111100111101100000110101100000100000110011111001010011111001100110001110001110001110110101111", + "010100001111110100000101110000001001111100010101000011111101001010011111001010010011100110101100000110101011001000110101100000110101111000101", + "010101101110010011100001101010101101011011000101010001000111000010111101000010100110110011111001010011111111000011011011011011011010101101111", + "111011011110101110001001110101000100010010101010101110001100111101000010111101000010111001010011111001010010111011011011011011011010111101010", + "000011111000101010101000110111111110111111111010111111111110011111001010011111011111101100000110101100000111111101100000110101100001111110000", + "011010001011101101011000000010001100111010100000101111100010110101100000110101111000111001010011111001010110001110001110001110001111100011010", + "100010101010000101000101001010101101110010100110001000101010101100000110001100001010100100100100100100100110101100100000100100100100101010100", + "100110001011101011010011000110001001100010010110001100100010000110101100100110111000100100100100100100100110001100100010100100100101100010100", + "000111111001100110001111001111111111011001010011111100111111100000110100000000111111110011111001010011111111111110001000001110001111111111111", + "010111010111110100000100010101000001111100010011000010100011001010011110101010011101000110101100000110101110011000110111100000110101000010101", + "010111110110010011100000101000000101011011000101110000000011000010111100000010100100010011111001010011111100110011011001011011011010100111111", + "111011011110101110001001110010011100010010101101101110101000111101000010111101001001011001010100111001010010101011011011011011011010010011010", + "000001111000101010101101010111100110111111111110111111010110011111001010011111000101101100000001001100000010000101100000110101100000100000000", + "011010010011101101011001100001100100111010100101001111011100110101100000110101100000111001010100011001010001100110001110001110001110110101010", + "100000101010000101000100101100010101110010100101101001111100101100000110101100001011100100100001000100100111001100100100100100100100011000100", + "100101001011101011010101100010101001100010010001101100000110000110101000000110110110100100100100100100100101000100100100000100100101101100100", + "000111111001100110001101101101000111011001010110011100101101100000110011100000111010110011111001010011111100111110001110101110001111011101111", + "010111010111110100000000010101000001111100010100100010100011001010011001001010011101000110101100000110101110011000110100000000110101000010101", + "010111110110010011100110001000000101011011000010110000000011000010111111000010100100010011111001010011111100110011011010111011011010100111111", + "111011011110101110001100010010011100010010101110101110101000111101000000111101001001011001010011111001010010101011011010011011011010010011010", + "000001111000101010101101110111100110111111111100011111010110011111001010011111000101101100000110101100000010000101100000110101100000100000000", + "011010010011101101011101100001100100111010100011101111011100110101100000110101100000111001010011111001010001100110001110001110001110110101010", + "100000101010000101000110101100010101110010100101101001111100101100000110101100001011100100100100100100100111001100100100100100100100011000100", + "100101001011101011010011100010101001100010010101001100000110000110101100000110110110100100100100100100100101000100100100100100100101101100100", + "000111111001100110001011101101000111011001010111011100101101100000110101100000111010110011111001010011111100111110001110001110001111011101111", + "010111010111110100000110010101000001111100010101000010100011001010011111001010011101000110101100000110101110011000110101100000110101000010101", + "010111110110010011100000001000000101011011000010110000000011000010111101000010100100010011111001010011111100110011011011011011011010100111111", + "111011011110101110001010010010011100010010101110101110101000111101000010111101001001011001010011111001010010101011011011011011011010010011010", + "000001111000101010101111110111100110111111111100011111010110011111001010011111000101101100000110101100000010000101100000110101100000100000000", + "011010010011101101011101100001100100111010100011101111011100110101100000110101100000111001010011111001010001100110001110001110001110110101010", + "100011111010000101000110101111111101110010100101101000111110101100000110101100001111100100100100100100100011111100100100100100100100111110100", + "100110001011101011010011100110001001100010010101001101100010000110101100000110111000100100100100100100100110001100100100100100100101100010100", + "000110101001100110001011101010101111011001010111011101101011100000110101100000111010110011111001010011111110101110001110001110001111101011111", + "010110001111110100000110010010001001111100010101000010100011001010011111001010001000100110101100000110101110001000110101100000110100100010101", + "010111111110010011100000001111111101011011000010110000111111000010111101000010111111110011111001010011111111111011011011011011011011111111111", + "111000001110101110001010010100010100010010101110101110111100111101000010111101011011111001010011111001010001001011011011011011011011011001010", + "000001101000101010101111110110101010111111111100011111100110011111001010011111010110101100000110101100000101000101100000110101100001101100000", + "011011011011101101011101100111000110111010100011101110101100110101100000110101100010111001010011111001010000111110001110001110001110111101010", + "100011110010000101011110101001000011110010100101101001100010101100001110101100010101000100100100100100100010011100100100110100100101100010100", + "100111010011101011001011100010000011100010010101001101000010000110100100000110100100000100100100100100100110110100100100111100100100100110100", + "000111111101100110001011101100011001011001010111000100001001100000101101100000100001010011111001010011111010101110001110010110001110110011111", + "010101011001110100010110010111100001111100010101000011010111001010000111001010011101100110101100000110101100000000110101101000110101000000101", + "010110110110010011110000001001100001011011011010111000111101000010101101000010101000110011111001010011111101100011011011010011011010010101111", + "111000001010101110010010010100010100010010110110100110111100111101000010111101011011111001000011100001010001001011011011011011011011011001010", + "000001101010101010100111100110101100111111111100010111100110011111001010011111010110101100011110110100000101000101100000110101100001101100000", + "011011011101101101001101101111000100111010111011110110101100110101100000110101100010111001001011100001010000111110001110001110001110111101010", + "100011110110000101011110110001000101110010100101101001100010101100000110101100010101000100111100110100100010011100100100100100100101100010100", + "100111010011101011001011110010000111100010001101000101000010000110101100010110100100000100100100100100100110110100101100100100100100100110100", + "000111111001100110000011110100011001011001010111010100001001100000110101111000100001010011111001010011111010101110000110001110001110110011111", + "010101011001110100001110000111100101111100000101001011010111001010011111010010011101100110101100000110101100000000101101100000110101000000101", + "010110110000010011111000011001100101011011001010100000111101000010111101001010101000110011111001010011111101100011000011011011011010010101111", + "111000001010101110010010011100010010010010111110100110111100111101000010110101011011111001010011111001010001001011001011011011011011011001010", + "000001101110101010101111100110001100111111100100011111100110011111001010011111010110101100000110101100000101000101100000110101100001101100000", + "011011011111101101011101110110000100111010101011111110101100110101100000110101100010111001010011111001010000111110001110001110001110111101010", + "100011110000000101011110110000100101110010100101111001100010101100000110101100010101000100100100100100100010011100100100100100100101100010100", + "100111010011101011001011100010000111100010000101010101000010000110101100000110100100000100100100100100100110110100100100100100100100100110100", + "000111111011100110000011110111111001011001011111010101111111100000110101100000101111110011111001010011111011111110001110001110001110111111111", + "010110001001110100001110010110001101111100000101001010100011001010011111001010001000100110101100000110101010001000110101100000110100100010101", + "010110101000010011111000001110101101011011001010100001101011000010111101000010111010110011111001010011111110101011011011011011011011101011111", + "111010001010101110010010001010001010010010111110100111100010111101000010111101011000111001010011111001010110001011011011011011011011100011010", + "000011111110101010101111101011111100111111100100011110111110011111001010011111001111101100000110101100000111111101100000110101100000111110000", + "011011011111101101011101110100011100111010101011111110101000110101100000110101111001011001010011111001010100101110001110001110001111010011010", + "100001111000000101011110110100100101110010100101111000110110101100000110101100011101100100100100100100100110000100100100100100100101100000100", + "100110010011101011001011100001000111100010000101010100011100000110101100000110100000100100100100100100100101100100100100100100100100010100100", + "000100101011100110000011110011010001011001011111010100111101100000110101100000101011110011111001010011111011001110001110001110001111111001111", + "010101001001110100001110010111101101111100000101001011000111001010011111001010000110100110101100000110101011000000110101100000110101001100101", + "010111111000010011111000001000000101011011001010100001001101000010111101000010100010110011111001010011111000111011011011011010011011111101111", + "111011010010101110010010001100100010010010111110100111100110111101000010111101001101011001010011111001010110011011011011011010111011000011010", + "000011110110101010101111101011000100100111100100011110000100011111001010011111010100001100000110101100000100110101100000110100000000100110000", + "011011011111101101011101110101111100101010101011111111101110110101100000110101111001011001010011111001010100101110001110001111101110110011010", + "100001111000000101011110110100000101100010100101111000010100101110000110101100011101100100100100100100100110000100100100100101100101000000100", + "100110010011101111001011100000000111100010000101010101011110000100101100000110100000111100100100100100110101100100100100100101000100110100100", + "000100101011110010000011110010110001001001011111010101011101100110110101100000101011101011111001010011100011001110001110001111101110011001111", + "010110001001100100001110010111101101111100000101001011000111001100011111001010000110111110101100000110110011000000110101100000010100101100101", + "010110111000000101111000001000000101011001001010100000101101000110111101000010100010100011111001010011100000111011011011011011111010111101111", + "111001010010111010010010001100100010001000111110100110000010101101000010111101001101011101010011111000110110011011011011011011010010000011110", + "000010110110110100101111101011000100110011100100011110100010000111001010011111010100001010000110101101100100110101100000110101101001100111000", + "011011011111100111011101110101111100111100101011111111001000101101100000110101111001011111010011111000110100001110001110001110010111010011110", + "100001111000000011011110110100000101110100100101111001110110100100000110101100010101100010100100100101100110100100100100100100111101000001000", + "100000010011100011001011100000000111110010000101010101111100001110101100000111101000100100100100100100100100000110100100100100110100110101000", + "001111101011110010000011110010110001000001011111010100111101100000110101100001010011110011111001010011111010101100001110001110011110011000011", + "010011001001100100001110010111101101100100000101001011000111001010011111001011111110100110101100000110101010000110110101100000100100101101001", + "000010111000000111111000001011111101001101001010100001111111000010111101000010011111110011111001010011111111111101011011011011011010111110111", + "000000001010101000010010001110001010011010111110100110100010111101000010111101101000111001010011111001010010001111011011011011011010100011000", + "111111100110110110101111101110101100110111100100011110101010011111001010011111001010101100000110101100000010101101100000110101100000101010011", + "100000101111110111011101110110001100111010101011111110100010110101100000110101111000111001010011111001010110001110001110001110001111100011001", + "101110101000010011011110110011111101110110100101111000111110101100000110101100011111100100100100100100100111111100100100100100100101111110111", + "101110101011101011001011100000000111110100000101010101101100000110101100000110101010100100100100100100100100111100100100100100100100011100100", + "101110101011110010000011110100100001000101011111010100000011100000110101100000111101010011111001010011111000011110001110001110001111000011100", + "100000100001100100001110010111000101100000000101001010000011001010011111001010010100000110101100000110101100110000110101100000110101100110100", + "111111101000000111111000001111111101001101001010100000001001000010111101000010100001010011111001010011111000101011011011011011011010110011110" + ], + "1": [ + "111111100010100001011100110010110000100010111000110100000010111101000100000111101000100101000011111000100111111010100100100101011100001111111", + "100000101110001111010011011001100101100110101011111000100010011111001101100001010011110010011110101101111101010100001110001111100101001000001", + "101110100110000101011001110100100000110011111110101101001000110101100111001011111110100111001011111000101101001110110101100000001110001011101", + "101110101101111000110011101111111101100000110010111101010110101100001101000010010010110010111100100101111110100100011011011010100110001011101", + "101110100010110011101001001111111000110101100101000010111110000110100010111101101111111001000100100100110111111100111011011000100011101011101", + "100000101110000101011001100010001101111001010010000111100011100000101010011111011000101100011001010011100110001110000000110110001111001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000111101111110011010010001000101100000111010011100011001010000000110101111000111001001100000110110010001000101110001000110100000000000", + "111110111101110101001010111111111100111101000011100000111111000010101110101100001111100100111001010011100011111010000100100011011011110101010", + "010011000010100001001100110010101001000010111100110100111000111101000100000110111101000100110011111000100010000010100100100001011011010100111", + "001000100110001111011001011001111010000110101011111000111010011111001101100000111100010011100110101101111000101100001110001111100001011001110", + "101111000100000101000011110010110111010011111110101100000000110101100111001010000001000110110011111000101110100110110101100000001110101100111", + "111011101111111000101011101001100011100000100010111100101110101100001101000010101101110011100100100101111100011100011011011011100100011101110", + "010001011110110011101101001100110100110101111101000011000000000110100110111101000000111001000100100000110101111110111011011001000100100011000", + "000000111010000101011001100111100101111001001010000111000011100000101100011111000011101100011001010101100111010100000000110111101110111110011", + "011000000111101111100011010111000000101100011111010011101001001010000110110101101110111001001100000000110101001110101110001000010100001011001", + "111000111111110101001010111000011100111101000011100000010111000010100100101100010010100100111001010101100110100101000100100011111011111000111", + "010011000110100001001100110011001001000010111100110100111000111101001110000110111101000100110011111001000100000111000100100011011011000100100", + "000100100000001111011101011000111010000110101101111000111010011111010101100000111100010011100110101100011110101101101110001101100001011001111", + "100101000000000101001011110011010111010011111000101100000000110101111111001010000001000110110011111001001100100110010101100110001110101100101", + "110011101101111000100111101000000011100000100100111100101110101100011101000000101100110011100100100100111110011100111011011101100100011101111", + "011000011110110011100101001101010100110101111001000011000100000110100110111111000001011101000010100000110101111110111011011101000100100011000", + "000101111000010101011011100010100101100001001010000111001101100000101100011001000010001010011111010101100111010100000000110111101110111110011", + "010101000111111111101111010101000000110100011111010011100111001010000110110011101111011111001010000000110101001110101110001000010100001011001", + "110011111111101101001100111110011100100101010011100000001101000010100100101000010010100010111101010101100110100101000100100010111011110000111", + "011000000110110001000110110011001001010010100100110100100010111101001010000110111101000100110011111101000100000101000100100010111011001100110", + "000101100000011111011001011100111010000110110101111000101010011111010011100000111100010011100110101010011110101111101110001100000001100001100", + "100101000000011101011111110110110111010011100000101100000000110101111001001010000001000110110011111111001100100000010101100110101110110100110", + "110011111101101110100001101111111011100000100100111000111110101110011111000000101111110011100100100010111011111010111111011101000100111111100", + "011110001110110011100111001010001100110101111001000100100010010100100100111111011000111101000010100000110010001010111101111101000101100011000", + "000110101000011101011001110110101101100001001010011001101011111110101100011001001010101010011111010101100010101100000110010111101110101010011", + "011110001111111011101111000010001000110100011111001101100011010100000110110011101000111111001010000000110010001110101101101000010100100011001", + "110111111111101111001100100111111100100101010011111001111111001110100100101010001111100010111101010101100111111101000111000010111010111110111", + "010111001110110011000110100101100001010010100100100100001110110101001010000100100100100000110101111101000010011101000101100010111011100100110", + "001000111000001011011001011001010010011110110101111001000100011111010011100110111001010101100000101010011101111111101110001100000000110011100", + "101101011000010011011111100000000111001011100000101100101100110101111001001100001010000000110101111111001101010000010101100110101111111110110", + "111111100101110110100001100000000011111100100100111000100110101110011111000100111111010101100000100010111001001010111111011101000000101011100", + "011101011110110011100111000101011100100011111001000101101100010100100100101111010011100101000011100000110100100010111101111101000011111001000", + "000100100000001011011001111000001101100111001010011000100011111110101100000001000100110010011110110101100000000100000110010111101000100100011", + "011110000111111011101111000001111000110010011111001101100011010100000110101011110101100111001011100000110010101110101101101000010111100001001", + "110101100111101111001100100001110100100101010011111101001001001100100100100010000000110010111100110101100110100101000011000010111000110100111", + "010100001110100011000110100110100001010010100100100010010110100111001010001100100100100000110101111101000010011101000011000010111011100100110", + "001010111000011011011001001010010010011110110101100111011100000001010011100110111001010101100000101010011101111111101000101100000000110011100", + "101101011000000001011111011011100111001011100000110010111100101011111001001100001010000000110101111111001101010000010110000110101111111110110", + "111101100101111110100000111010000011111100100100100001000110100010011111100100111111010101100000100010111001001010111100111101000000101011100", + "011100011110101101100110001001011100100011111001010100001100011100100100001111010011100101000011111000110100100010111100111101001010111001000", + "000111100000000111011000010000001101100110101010011001000011111110101101100001000100110010011110101101100000000100000110010111100001000100011", + "011110000111111010001111110011111000110011111111001100100011010100000111001011110101100111001011111000110010101110101101101000001110000001001", + "110101100111101010101100100001110100100000110011111101001001001100100101100010000000110010111100100101100110100101000011000010100101010100111", + "010100001110100111100111110110100001010101100100100010010110100111001010011100100100111000110100111101000010011101000011000010101101100100110", + "001010111000011001111001000010010010011000110101100111011100000001010011111110111001001101100001001010011101111111101000101100000110110011100", + "101101011000000100011110111011100111001101100000110010111100101011111001010100001100011000110100011111001101010000010110000110101101111110110", + "011101101100111110100000101010000011111100100101100001000110000010011111101100111001000101100001000010111001101010111100101101000010101011100", + "111100000110101101100111101001011100100011111000110100001100111101100100000111010101100101000011111000100100010010110100100101001010111001000", + "100111111001100111111001011011111101100110101011111001111110011111001101100001001111110010011110101101111111111100001110001111100001111110011", + "001110001110111010001110110110001000110011111110101101100010110101100111001011101000100111001011111000101010001110110101100000001111100011001", + "000110101110001010101100100010101100100000110011111100101010001100000101000010011010110010111100100101111010101101011011001010100100101010111", + "110110001111000111100111110010001001010101100100100010100010100111101010111100101000111000110100100101000010001101010011000010100101100010110", + "101011111001111000111001000011111010011001010101100110111110000001010010011110101111101101100001010010011011111111101000101100001111111111100", + "001111010001100101111110111100001111001100000000110010100010101011111000110100000000111000110100000111001001111000010110000110110101000100110", + "001110110100011111100001001011111010111101000101100000000010000010011110101100101101100101100001010010111111010010111100101101011010100001100", + "111101000111001100100110001011110101000010111000110100101000111101100100000110010000100100110011111000100101101010110100100101011010010100100", + "100100100001100110011000011010100010000110101011111001010110011111001101100000111100110011100110101101111100010100001110001111100000100101111", + "001110000001111010101110110010010111010011111110101101011100110101100111001010011001000110110011111000101111111110110101100000001110110010101", + "000101110110001011001100000111100010100000110010111101111100101100000101000010100100010011100100100101111101010101011011011010100100011111111", + "010101010111000110100110110110000101010101100101000010000110000110101010111100001001011000110100100101010011101101011011011010100101101010110", + "111000100001111000111001000011011010011001010100000110101101100000110010011110100101101101100001010010000010010111100000110100001111011111100", + "111111000001100101010110111100001111001100000001010010100011001010011000110100001000111000110100000111010001111000001110001110110101000000110", + "011110110110011111011001001011111010111101000101100000000011000010110110101100100011100101100001010010100111010011100100100101011010100001100", + "001101010111001100010110001011100101000010111000110100101000111101001100000110001110100100110011111001000101001011000100100111011010010100100", + "010100100001000110010000011010111010000110101101111001010110011111010101100000100010110011100110101100011100100101101110001101100000100001011", + "111110000000111010101010110010001111010011111000101101011100110101111111001010001101000110110011111001001110000110010101100110001110110101101", + "010101110110101011001010000111111011100000110100111101111100101100010101000010100100010011100100100100111100101101111011011100100100011000011", + "110101011110100110100000110110000100110101100001000010000110000110101010111101001001011001000100100101010010100101011011011110100101101101000", + "011000101001111000101011000011011101111001010100000110101101100000110010011111000101101100011001010010000010011111100000110100001111011000000", + "101111010101100101011010111100001000101100000001010010100011001010011000110101101000111001001100000111010001111000001110001110110101000101000", + "001110101000011111001011001011111100111101010101100000000011000010110110101100000011100100111001010010100111010011100100100100011010100000100", + "001101011101001100000000001011100001000010100000110100101000111101001000000110101110100100110011111101000101001001000100100110111010010100110", + "011000101011000110001010011010111010000110110101111001010110011111010011100000100010110011100110101010011100100111101110001100000000100001100", + "111110011000111010111010110010001111010011100000101101011100110101111001001010000101000110110011111111001110000000010101100110101110110100110", + "011111111110101011001010000111111011100000110100111100111110101100011111000010101111110011100100100010111111111010111011011100000100111111100", + "111010001010100110100000110010001100110101100001000011100010000110100000111101011000111001000100100100110110001000111011011100100101100011010", + "011110101111111000101011000110101101111001010010000111101011100000101010011111011010101100011001010011100010101110000000110110001111101010000", + "100110001001100101010110111010001000101100000111010010100011001010000000110101101000111001001100000110110010001000101110001000110100100011010", + "000011111000011111010001001011111100111101010011100000111111000010100110101110011111100100111001010011100011111011000100100010011011111110100", + "001001010001001100001100001001111001000010100100110100111100111101001000000100111100000000110101111101000110101001000100100010111011011000110", + "011101111001000110011010011110010010011110110101111001100110011111010011100110110001010101100000101010011010100111101110001100000001101101100", + "110100001000100010110010110011000111001011100000101100101100110101111001001100000101100000110101111111001100011000010101100110101110111100110", + "010011110110101011011100000010010011111000100100111101100110101100011111000110110000110101100000100010111011111010111011011101000101100011100", + "111010001010101110111010110011100100100101111001000011000100000110100100111101000011111001000100100000110111010010111011011101000100100111000", + "011101111111100000100111000001100101111001001010000110001111100000101100011111000110101100011001010101100011001100000000110111101110110010011", + "100100001001100101000110111000111000101100011111010011010101001010000110110101111010111001001100000000110100100110101110001000010101000001001", + "000010111000001101010101001010001100111101010011100100111111000000100100101110001101000100111001010101100010000101000000100010111010010100111", + "001101010001001010001010001101111001000010100100110010111100101111001010000100111100000000110101111101000110101101000010000010111011000000110", + "010001111001000010011010001111110010011110110101100111100110000001010011100110110001010101100000101010011010100111101000101100000001110101100", + "111000001000100100110010100010000111001011100000110010101100101011111001001100000101100000110101111111001100011000010110000110101110100100110", + "010111110110101001011100001100010011111000100100100101100110100000011111000100110000110101100000100010111011111010111000111101000101110011100", + "111000001010101010111010101110000100100101111001010011000100001110100100111111000011111101000010100000110111010010111010011101000100100111000", + "011111111111110110100111001011100101100001001010000110001111100000101100011001000110101010011111010101100011001100000000110111101110010010011", + "101100001001100001000110100100011000110100011111010011010101001010000110110011111011111111001010000000110100100110101110001000010100100001001", + "001101111000000001010101001000001100100001010011100100111011000000100100101010001100100010111101010101100100000101000000100010111111110100111", + "001101010001001010001010001110011001010100100100110010110010101111001010010100111101111000110100111101000000101101000010000010111100111000110", + "010011111001011110011010001011110010011000110101100111101000000001010011111110110000101101100001001010011100100111101000101100000110101101100", + "111000001000100000110010100100000111001101100000110010110110101011111001010100000101111000110100011111001000011000010110000110101101010100110", + "010101110110110001011100001000010011111000100100100001111100100010011111001100110000100101100001000010111011111010111100111101000110001011100", + "111001001010101010111010101110000100100101111001010101010100011100100100110111000011111101000010100000110111010010111100111101000101011111000", + "011111111111101110100111011011111101100001001010011001111111111110101100011001001111101010011111010101100011111100000110010111101110111110011", + "101110001001110001000110101010001000110100011111001100100011010100000110110011101000111111001010000000110010001110101101101000010100100011001", + "001110101000001111010100111110101100100001010011111101101011001100100100001010011010100010111101010101100110101101000011000010111111101010111", + "001110001001000010001011110110001001010100100100100011100010100111001010110100111000111000110100100101000110001101000011000010110101100010110", + "010011111001011000011010010011111010011001010101100110111110000001010010011110101111101101100001010010011111111111101000101100001110111111100", + "111011011000100010110010001101000111001100000000110010101110101011111000110100011110111000110100000111001101001000010110000110110101001010110", + "010100101110110011111100011000111011111101000100100000110100100010011110001100111011100101100001010010111110100010111100111101011011111001100", + "111001011010101100111010010010101100100010111001010100011010011100100100100111000100100101000011100000110100000010111100111101010010000101000", + "011111110111101110100110011100011101100111001010011000110011111110101100000001001101110010011110110101100010101100000110010111101001100000011", + "101110011001010000100110001010110000110010011111001100001001010100000110101011100000100111001011100000110010100110101101101000010111010101001", + "101101101000101111110100000000000100100001010010111100110111101100100100000010000100110010111100110101100000011101000011010010111101000100111", + "101101010000100010101010011000010001010100100101000010011100000110001010111100101001011000110100100101010111111101001011011010110100110010110", + "000011101001111000111010010001000010011001010100000110111101100000110010011110110010001101100001010010000101010111100000110100001110011111100", + "011010011001100010110010001100000111001100000001010010000111001010011000110100011111011000110100000111010101001000001110001110110100101010110", + "110110101111010011111100011001111011111101000100100000101101100010111110101100111011100101100001010010100110100010100100110101011010111001100", + "101010011010001100111010010010001100100010111001010100000010011100000100000111000100100101000011111000110100000010101100111101011010000101000", + "001111110110001110100110011100011101100110101010011000100011111110101101100001001101110010011110101101100010101100000110010111100001100000011", + "011100011001110000000110101010110000110011111111001100001001010100000111001011100000100111001011111000110010100110101101101000001111010101001", + "111111101001001110110101000000000101100000110010111100110111101100100101000010000100110010111100100101100000011101000011010010100101000100111", + "101101010000000010101010111000010000110101100101000010011100000110001010111101101001011001000100100101010111111101001011011010100100110011010", + "000010101000011001111010010001000101111001010100000110111101100000110010011111010010001100011001010010000101010111100000110100001110011110000", + "011010011001100010010011001100000000101100000001010011000111001010011000110101111111011001001100000111010101001000001110001110110100101011010", + "110110101111010010111101111001111101111101000101100001001101000010111110101100011011100100111001010010100110100010100100100101011010111000100", + "101010011010001101011011010010001000100010111000110101100010111101000100000111100100100101000011111000100100000010100100100101011010000101000", + "001111110010001111000110011100011101100110101011111000000010011111001101100001001011110010011110101101111010101100001110001111100001100000011", + "010011011001010001101111101010110000110011111110101100101000110101100111001011100110100111001011111000101010000110110101100000001111010101001", + "000010111110101111001101000011111101100000110010111100111110101100001101000010001111110010111100100101111111111100011011011010100101111110111", + "000000001010000010010010111110001000110101100101000010100010000110100010111101101000111001000100100100110010001100111011011000100101100010010", + "111111101011111001110110010010101101111001010010000111101011100000101010011111001010101100011001010011100010101110000000110110001110101010100", + "100000100000000010001101001110001000101100000111010010100011001010000000110101111000111001001100000110110110001000101110001000110100100011110", + "101110101110010010100011111011111100111101000011100000111111000010101110101100011111100100111001010011100111111010000100100011011010111110000", + "101110101011101101011101010100000001000010111100110101110110111101000100000110101010100100110011111000100100101010100100100001011011100100100", + "101110101010101111000110011110010010000110101011111001011100011111001101100000111101010011100110101101111000000100001110001111100000110011100", + "100000101111010001101101101111000111010011111110101100011100110101100111001010000010000110110011111000101100101110110101100000001110111110100", + "111111101010101111000011000000000011100000100010111101000110101100001101000010111111010011100100100101111000000100011011011011100101001011110" + ], + "2": [ + "111111100111000101010101011000001000110111110001011110100101101101010100001101010011001000001101111100100100011000100100111000100000001111111", + "100000100110011001111000101101011011011101010000111001100010111001001111000011110011111000110101000110010011011011100011111011100001001000001", + "101110100000010110111101100011010101000111110000010110001111101100010111111001111111111011101011001000011010111110000011011110000010001011101", + "101110100011100100011110110010001010001001110100101010111110000011111101000111111100110100001000100011111110110011011011010011011110001011101", + "101110101100101000100100110111111010111010011001010011111111111000111111000000111111101101100000010000111011111100110110010100110111101011101", + "100000100010100010111011110010001111100110001010100010100011011010010101011000111000110001101110011100110010001001010111100001010011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001100101100000101111110001001111100101111001100100011111111001000100010111000101100110000010010111110001101100011000101100001000000000", + "001100111100110011001010000011111011011111000101011100111110001101001000010001001111100000111110010100010011111100010011100100010000111010000", + "101000000111000101010011011100001000110111110001011110101111111101010100001101001100101000001101111100100100011000100101011000100100100010110", + "010001110110011001111010101111011011011101010000111001010110101001001111000011110110011000110101000110010011011011100011011011100011110010001", + "000001011000010110111100100111010101000111110000010110000101101100010111111001100000111011101011001000011010111110000010111110000010011100000", + "100111100011100100011110110000011010001001110100101010001000000011111101000111111011010100001000100011111110110010011010110011011110011101100", + "001001010100101000100100110001110010111010010001010011001001111000111111000000100110101101100000010000111001110101010111110100110001001111011", + "010111101010100010111011110100011111100110000010100010001001011010010101011000100000110001101110011100110000000000110110000001010000101001010", + "000011000001000000001000010001101100010001010010100000111000010010100101001111010001000001011101111111010100001000101110001000001100101010110", + "111001101111101000010001011101110000000100010110000111110011010110010011001010010001011011100101001111001011011111101001011111001011110000001", + "011110010001110011000101101010100110000001001111101000011001001011100010111011100010011110111101001010010010101110010010101110010110010100000", + "101100111011110100010111000010100110110000110101010100111011000100100010101110001011110101011110101011111110110110001110110110001110011111100", + "001010000011001101100111111100001110011100100011001101011110110111001100100010101011100000110110010011000001100101011001100101011111000111011", + "110001110101010011001000000110101100111111000010011100111110110101001011110001000101100010111010010101001000000100101100000101101110101011010", + "100100011001000101101001011100011111010111111100111110100100010101010010101101011011000100001011111001010100011000111010011001011010100010110", + "001100110001111001100000101111000100111101011001111001010110000001001110000011111011101100110011000001101011011011101101011010001101110010001", + "010101010111110110111110100111011010100111100100010110001110100100010011111001100111110011101101001111100010111110011000111110111000011100000", + "000100100011000101111100110000011101101001111011101010011010111011111110100111111100110000001100100100100110110010000100110010100100011101100", + "000101001011101000011110110001111101011010010101110011000010010000111001100000111001000001100110010001001001110101001001110101001001001111011", + "011010101101000010100001110100010000001110000010000010001101110010010100010000111011000011101000011101001000000000111000000000111000101001010", + "100111001111100000001010010001100011100001001111000000110001011010100001001111000000001101011011111110101100001000110100001000110100101010110", + "101011111111101000010011011111111111111100011001000110111111101110010000101010011111111001100001001110010111111111110111011110110111111110001", + "010010001110010011011111101010001001111001001011101000100010100011100100010011111000110010111101001111100010001110001100101111101101100010000", + "100010101101010100001101000110101001010000110100010100101011101100100011101110011010100101011110101100000110101110000000110111100000101011100", + "001110001101001101100101111010001001111100111111101101100011111111001000111010111000101000110110010100111010001101000011100101100011100011011", + "110011111100110011001010000111111011011111001100011100111110001101001000001001001111100010111010010010010111111100110010000100010010111111010", + "101011000110100101110011011010011000100111111001011110101011111101010100010101001101001100001011111100100100110000100100011000100101111100110", + "000001110110111001111010101011110011011101011001111000001010101001001111000011100010111000110011000110010101110011100011011011100011001110001", + "010011001000010110111100100010011101011111111000110110001101101100010111111001101010111011101101001000011100000110000010111110000011001000000", + "000111100010000101111110110111101010011001110100101010111000000011111101011111100001010100001100100011111110001010011010110010011010101011100", + "001001001101001000000100110111110010110010010000110011010111111000111111000000111001001001100110010100101111011101010111110101010110010001011", + "010110110011100010111011110000100111100110000010100011011001011010010101011000111000010011101000011010101010101000110110000000110110010101010", + "100010011000100000001000010100100100010001010010000000111010010010111101010111001101100101011011111001001100110000101110001000101111111110110", + "101000100111101000010001011010001000000100010111000111011101010110000011010010010101111001100001001001010101100111101001011111101001000110001", + "011100010000010011000101101100101110010001001111101000011101001011111110100011111011111010111101001010010010000110010010101110010011001010000", + "101111111011010100010111000110011110110000110100010101100111000100101110101110001111010101011110101011111000011110001110110110001110100011100", + "001011010011001101100111111001000010000100100011101101010110110111010100100010110001100000110110010011000111011101011001100101011000010011011", + "110011110100110011001000000111011000101111000010011100001110110101001101101001010111100010111010010101001000111100101100000100101100011101010", + "100110000000100101101001011000011111011111111101011110111010010101010010101101010100100100001011111001000010110000111010011010111011111100110", + "001110101000111001100000101001111010111101011001111000000010000001001010000011100011001000110011000001110001110011101101011001101101001110001", + "010100001110010110111110100010010000100111100100110110001100100100001111100001111011010011101101001111111010000110011000111000011001001000000", + "000101101010000101111100110111100110001001111010101010110000111011101010111111111000010100001100100100111000001010000100110100000100101011100", + "000111001011001000011110110001110011001010010100110011000110010000100110111000100000100001100110010001001001011101001001110001001000010001001", + "011001101101110010100001110000101001000110000010111011010001110010011000011000111001100011101000011101001110101000111000000000111000010101001", + "100110011110110000001010010000101111101001001110001000111011011010111000001111011100001101011011111110101010110000110100001000110101110110101", + "101000101111101000010011011100000011110100011001000111010101101110010111110010001100111001100001001110010011100111110111011111110111010110010", + "010000010110010011011111101110101001001001001011101000001100100011100100011011100010010010011101001111110100000110001100101100001101000010000", + "100011111101010100001101000111111111110000110100011100111111101100100111101110001111100100111110101100011111111110000000110100000000111111100", + "001110001101010101100101111010001011111100111111100100100011111111010100011010111000101001010110010100100010001101000011100011000011100011011", + "110010101100111011001010000010101000111111001100010100101010001101011100101001011010100011011010010010001010101100110010000010110011101011010", + "101010001110111101110011011110001111100111111001000110100011111101001010110101011000101101101011111100100110001000100100011100100100100010100", + "000011111110110001111010101011111010011101011001110001111110101001000010000011111111111000110011000110010011111011100011011011110011111110010", + "010001010000001110111100100110100000111111111000111110011001101100001111011001100000011010101101001000011000101110000010111110010010101100011", + "000110111010000101111110110100100110011001110100101010111010000011111010011111110101110101001100100011111100110010011010110010000010100111111", + "001000000101011000000100110110001010010010010000111011111101111000111111000000110101101000110110010101001111100101010111110111011111111111011", + "010100110011100010111011110000101001000110000010101010011101011010010001011000100011110011001000011011001100010000110110000010111110010011010", + "100011011000111000001000010110011110010001010010001000100110010010111001110111001111000101001011111000101000000000101110001110110110010010110", + "101011110111100110010001011001000011100100010111001001010111010110000111110010001001111001010001001000010011000111101001011001110001010010001", + "011111010000001111000101101011011001010001001111110000101111001011111100000011100111111011001101001010010010110110010010101010000010111100010", + "101110100011011110010111000100011111110000110100011010111011000100101111101110011100110101011110101011111100111110001110110110001110111101111", + "001010001001010111100111111101111011100100100111100111000010110111010100000010111011000001110110010011000011110101011001100101011001101111000", + "110000101000110111001000000010010000101111000000011110001100110101001100101001000011000011110010010101001010000100101100000100101100010001001", + "100101001110110111101001011011100111111111111001010000010000010101010010101101011000010101011011111000100010001010111010011010110010010010110", + "001111101110111101100000101011110010011101011001110011000110000001001010000011111000110000010011000000010111001001101101001001100101001000001", + "010101001010001010111110100000101000100111100100111110010000100100001111000001111001101011111101001110011110110000011000101000000000100100000", + "000110111110001011111100110100101110001001111110100100111010111011101010011111100100011100111100100101111110101100000100100100011100111111100", + "000100001011010100011110110000000010001010010100101011110100010000100111011000111100111000010110010001001001101001001001101001011001100111001", + "011000110101101000100001110010101001000110000010101100001100110010011001011000101010001011101000011101001010001000111000011000111000001011001", + "100111000100111010001010011000010110001001001010001010101110111010111001101111010110111100011011111110101110011000110100000000110100000010101", + "101011110011101100001011011001001011110100011011000101010111101110010111110010011000010000101001001110010001011111110111010111110111001010010", + "010011011000000001001111100101010001001001001111100110100111100010100100011011101110100011101101001110010100111100001100101100000100100100000", + "100010100011010000010101000110011111110000110100011110101011101101100111101110010101011101111110101101111010100100000000110100001000100101100", + "001110010001010001111101100011110011111100111111100101001011111110010100011010100010110000100110010101000101101011000011100011011011111111011", + "110011111000111101011010011011111000111111001000010010111111101100011100101001011111101010001010010011001111111010110010010010101010111111010", + "101010001110111001111011011110001111100111111001000110100011011100001010110101001000110101111011111100100110001100100100000100110100100010100", + "000010101110110011111010100010101010011101011001110110101010001000000010000011111010110000110011000110010010101011111011000011100011101011010", + "010010001010001100100100101010001000111111111100111100100010101101101111011001111000101010101101001000011010001110011010110110000011100010011", + "000111111110000001101110100111111110011001110110101000111111000011111010011111111111111101000100100011111111111010000010111010011010111110111", + "001011010011011010010100100011000010010010010100111101010110111000111111000000110001111000110110010101001101000111001111110111011111010010111", + "010111111101100110100011111011011001000110000010101000001111011011110001011000111111101011001000011011001010110010111110000010111111011100110", + "100010010100111100010000001110011110010001010010001001111010010010011001110111001100111101001011111000101000111110110110001110110110111101010", + "101010101011100110000001000101111011100010010011001001000010110111000111110010010011110001010001001000010111110001110101001001110000001111001", + "011100001000001111001101101110010001010111001111110000001101101010011100000111110011000011001101001010010000000010000100110010000010010000010", + "101001101011011110010011001001100111110110110100011010110001100101101111101000010000011101011110101011111010001110001000101110001111110011111", + "000011000001010111111101110001110011100010100111100110000111110110110100000100100000110001110110010011000001001101011011101101011001001001000", + "111101111000110111011100010010101000101001000000011110010001110101001100101111011001101011110010010101001010110100101110001100101101000101001", + "100110000110110111111111001110101111111101111001010000111011010101010010101111011101010101011011111000100000101010110010011010110010111111010", + "000100110110111101111100100000000010011011011001110011010100000000101010000101100100010000010011000000010001101001100101011001100100000111101", + "011000011010001010100110111000101000100001100100111111001100100100101111000111111011101011111101001110011110001000000000111000000000001011100", + "000011101110001011101010101000010110001111111110100100101111011010101010011011111111011100111100100101111010011100011000100100011101100010100", + "000011001011010100010010110101001010001100010100101011010110110001000111011100101000111000010111001001001011011001011111101001011001001011001", + "011111101101101000100111111111010001000000000010101100000111011011011001011110100111001011101001100101001100111000111110011000111001000101001", + "101110001100111010010000011100011110001111001010001011101010010011011001101001001101011100011010000110101100100000110110000000110100100000101", + "101110100011101100000111001001110011110010000011000101001010110110010111110100000010110000101000111110010001101111110101010111110110011000010", + "011000010000000001001001111000011001001011000111100110001101101011100100011000101011100011101101001110010110011100000100101100000100001111100", + "101001111011010000010001001101101111110111110100011110111001101101000111101001001001111101111110101101111100000100001000110100001001101100000", + "000011000001010001111101100011110011111011001111100100010111111111110100011101100000110000100110010101000101010011011011100011011011010000111", + "110101111000111101011100011110100000111000100000010010011001101100011100101101101001101010001010010011001100101010101110010010101011010100010", + "101110000110111001111111011000100111100001001001000110111011011100101010110001100101010101111010100100100110110100110010000100110100100110100", + "000111111110110011111100100111111010011011110001110111111110000000000010000100011111110000110010111110010111111011100101000011100010111110010", + "011010001010001100100110101010001000111000110100111100100010100101101111011111011000101010101100110000011110001110000000110110000010100010011", + "000010101110000001101010100110101110011110110110101000101011011011111010011000001010111101000101010011111110101010011000111010011010101011111", + "000010001011011010010010100010001010010001100100111100100010110000111111000010011000111000110110010101001010001111011111110111011111100010111", + "011111111101100110100111111011111001000000101010101000111111011011110001011111011111101011001000011011001011111010111110000010111111111110110", + "101101011100111100010000001101100110010110000010001000110000010010011001110001111001111101001011111000101100101110110110001110110110110011010", + "101111100011100110000111000101110011100010011011001001000110110101000111110110011000110001010001001000010011101001110101001001110101101101001", + "011001011000001111001001101010101001010110111111110000010001101010011100000111110001100011001100010110010011010010000100110010000100000010010", + "101010100011011110010001001010101111110110011100011010010011101111101111101001100101011101011111010101111011001110001000101110001000011001111", + "000000010001010111111101110010000011100011101111100111011101111110110100000100001100010001110111101101000110101101011011101101011011000001000", + "110100111000110111011100110000101000101000000000011110001101101101001100101110110011101011110011100011001110001100101110001100101110001011001", + "101111001110110111111110101100010111111100001001010000100111011001010010101111110111010101011011111000100110011010110010011010110010000011010", + "000111101110111101111100100001001010000011110001110011100110000110101010011100000000110000010011000000010001011001100101011001100100001011101", + "011011001010001010100110111011000000100000110100111110001110100110101111000111010111001011111101001110011010011000000000111000000001100101100", + "000010101110001011101011001000000110010111110110100100110011011100101010000011100101011100111100100101111110000100011000100100011001000000100", + "000010000011010100010011110001110010000101100100101011010010110001000111000100111010111000010111001101001000001001011111001001011111011001001", + "011100110101101000100110111100011001011000101010101100111101011001011001000111011011101011101001100011001101111000111110111000111110101111001", + "101101011100111010010000011111101110010110000010001010111000010011011001110001100001111100011010000000101011000000110111100000110110101100101", + "101111100011101100000111101011100011111011011011000101111110110110010111101101101000110000101000111000010101010110010100110111110101010000010", + "011001011000000001001000011010111001011010111111100110001001101111110100011001000001100011101101001110010000101101100101101100000100110101100", + "101010100011010001010001001100101111101110011100011110001011101011011111110001101101011101111110101101111100110101101000110100001001100110000", + "000000010001010001011101100000000011111011101111100101110101111101101100011100001100010000100110010101000001000011111011100011011010111110111", + "010100111000111100111101111110111000100001000000010011100101101010011100110101010011101010001010010011001000110010001110010010101111110110010", + "101111001110111000111110011100001111101000001001000110111111011100111010101001010111010101111100100000100101100100110010100100110010110100100", + "001111101110110011011101100111000010000011110001110111100110000010011010011100000000110000110000111000010110100011100101100011100101110100010", + "010011001010001101000110101001111000100000110100111101101110100101111111000111010111001010101000110110011101110110000001010110000000011010011", + "000010101110000000001010000111111110010110110110101001111111011011111010000000001111111101000001010101111111111011011001011010011000111111111", + "000000001011011010010011000110001010000001100100111100100010110100110111000010001000111000110000010101001110001110111110110101011111100010111", + "111111101101100111100111111010101001011000101010101001101011011101100001000111001010101011001100011011001110101011011110000100111110101010110", + "100000100100111100010000001110001110010110000010001001100010010000001001110001101000111101001011111000101110001110010110001110110111100011010", + "101110100011100110000110100011111011111010011011001001111110110001010111101110001111110001010111001000010011111001010101001001110100111111001", + "101110101000001111101000101011111001011110111111110000000101101010001100011111100011100011001100010110010100001010000100010000000100101010010", + "101110101011011110110000001111101111101110011100011011111111101111110111110001100111011011011111010101111110011110001000001100001001000011100", + "100000100001010110011101110001000011111011101111100111100111111110100100011100000000110101110111101101000111011101011010001011011010001011001", + "111111100001010110111100110001011000100000000001011111001111101101001100110110110111001101110101100011001010011101101111101010101110000101000" + ], + "3": [ + "111111100000110001010011100111000100100010011011010101100000111111101010101000000101011100110101111101000111100110101011111000101000001111111", + "100000101001111101110101101000000011111011101000100001001000100010111000001011000111100110001101000111110100100001101101111011101001001000001", + "101110101000001111111001010010100000111110111100010000010100011001001110111010110001101000000011001001111101010000011001011110011010001011101", + "101110100101111001111001001100111100111101110011000000110101101010010010010110101010100011100000100010111000001101000001010010000110001011101", + "101110100101010100111110001011111001001110011110111001111111010010000110000101101111110001011000010000101111111010100110010101000111101011101", + "100000100010110110101110110110001000100000111011111011100011111001100011010000011000111101010110011100101010001011010110100000110011001000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000011011100100010001010001011100100000111001011100011000010010100000001101000110011011000010010100010001011100010000101000001000000000", + "011101100011001111001111111011111010001011100101110110111111011100100100100000001111110101010110010100001111111011010111100100110000100000110", + "100100011000101001010011100101000100100011010011010100100000111111101011101000000101000100110101111101000011100111001011111000101100100011000", + "000010101001110101110101101000000011111011100000100001001000100010111001101011000111111110001101000111110100100000001101111011101011110011110", + "110000010000001111111001010000100000111111011100010001010100011001001110111010110001110000000011001001111001010000111001011110011010011101111", + "100101100101111001111001001100111100111101010011000000110101101010010010010110101010110011100000100010111000001101100001010010000110011100111", + "001010010101010100111110001010101001001110111110111001001101010010000110000101101000101001011000010100101110001010100110010101001001001110101", + "011000111010101110101110110001011000100000111011111010010011111001100010110000011100100101010110011010101111111011010110100000101000101000101", + "000110001110111001001111100000010110001001101010100111100010101111111000001100000111000110110101111001001111100110001111101000101100101011001", + "001000101000010100010100100001010001010000111110101101011000000111111111111011000111011110001101001001010101100000001100111111101011110001010", + "010001010110001111100101010001110010010101100101100010010110001001011101011110110011110010000011001111110101010001111101001110010010010101110", + "101110101100011000011000000111101110010110001101001100100111001111010100000110101010010011100000101100011001001101100000010110001110011110011", + "101011010011010100100010001111111011100100000111001010001011000010010101100001101010101011011000010100100010001011100010000101011001000110100", + "010011110011001111001111111010001010001011100101110110000011011100100100100000011100000101010110010010001010111011010111100100101000101010001", + "100111000000111001010011100001000100100011010011010100100100111111101011101000000101000100110101111001000101100111001011111000110100100011000", + "000011100001110101110101101110000011111011100000100001001010100010111001101011000111111110001101000001110010100000001101111011100011110011110", + "110000001000001111111001010100100000111111011100010001010000011001001110111010110001110000000011001111111011010000111001011110000010011101111", + "100101100101111001111001001110111100111101010011000000110111101010010010010110101010110011100000100100111110001101100001010010011110011100111", + "001010001101010100111110001000101001001110111110111001001101010010000110000101101000101001011000010100101000001010100110010101011001001110101", + "011000111010101110101110110101011000100000111011111010010111111001100010110000011100100101010110011010101001111011010110100000111000101000101", + "000110011110111001001111100010010110001001101010100111100010101111111000001100000111000110110101111001001101100110001111101000110100101011001", + "001011111000010100010100100011111001010000111110101101111110000111111111111011001111111110001101001001010111111000001100111111110011111111010", + "010010001110001111100101010110001010010101100101100010100010001001011101011110101000110010000011001111110010001001111101001110000011100011110", + "101110101100011000011000000110101110010110001101001100101011001111010100000110101010110011100000101100011110101101100000010110001110101010011", + "101010001011010100100010001010001011100100000111001011100011000010010101100001101000101011011000010100100010001011100010000101011001100010100", + "010011111011001111001111111111111010001011100101110110111111011100100100100000011111100101010110010010001111111011010111100100101000111110001", + "100101000000111001010011100010111100100011010011010100110010111111101011101000010010100100110101111001000100001111001011111000110101111101000", + "000010101001110101110101101100101011111011100000100001101100100010111001101011001000111110001101000001110100001000001101111011100011001111110", + "110000011000001111111001010111011000111111011100010000010110011001001110111010100100110000000011001111111011111000111001011110000011001001111", + "100110111101111001111001001110010100111101010011000000100011101010010010010110100111010011100000100100111001100101100001010010011110101010111", + "001000001101010100111110001111010001001110111110111001011111010010000110000100111111001001011000010100101001100010100110010101011000010110101", + "011001110010101110101110110111110000100000111011111010110111111001100010110001110011100101010110011010101111010011010110100000111000010110101", + "000110001110111001001111100001101110001001101010100110101000101111111000001101110010000110110101111001001101001110001111101000110101111011001", + "001011110000010100010100100011111000110000111110101101010110000111111111111011101010111110001101001001010100001000001100111111110011000101010", + "010011010110001111100101010100001010110101100101100010001100001001011101011111000100010010000011001111110010111001111101001110000011001111110", + "101111100100011000011000000001000110110110001101000100010001001111010100000110000101010011100000101100011001100101100000010110001110100100011", + "101011000011010100100010001100000010000100000111010011011101000010010101100000011111101011011000010100100000100011100010000101011000010100100", + "010000101011001111001111111000100011101011100101110110010101011100100100100001110001100101010110010010001111010011010111100100101000011010001", + "100101000000111001010011100010111101000011010011000100111010111001101011101001010010100100110101111001000100001111001011111000110101111001000", + "000010101001110101110101101100101010111011100000100001100100100000111001101010101000111110001101000001110100001000001101111011100011001001110", + "110000011000001111111001010111011000011111011100000000010110011111001110111011100100110000000011001111111011111000111001011110000011001111111", + "100110111101111001111011001110010100111101010011010000111011101110010010010110000111010011100000100100111001100101100001010010011110101100111", + "001000001101010100111100001111010000001110111110101001010111010000000110000100011111001001011000010100101001100010100110010101011000010101001", + "011001110010101110101010110111110000100000111011110010100111111111100010110001110011100101010110011010101111010011010110110000111000010010001", + "000110001110111001001011100001101110101001101010100110110000101111111000001101010010000110110101111001001101001110001111111000110101111000101", + "001011110000010100010110100011111001010000111110110101010110000001111111111011101010111110001101001001010100001000001100101111110011000001010", + "010011010110001111100011010100001011010101100101111010001100001101011101011111000100010010000101001111110010111001111101010110000011001110010", + "101111111100011000011110000011111110010110001101000101111111001101010100000111001111110011100110101100011111111101100000001110001110111111111", + "101010001011010100100000001010001011000100000111001011100011000010010101100000101000101011011110010100100110001011100010001101011001100011000", + "010010101011001111001011111110101010001011100101101110101011011010100100100000101010100101010010010010001010101011010111111100101001101011001", + "100010001000111001000101100110001101100011010011001100100010111011101011101001101000100100100011111001000110001111001011100000110100100010100", + "000011111001110101101001101011111011111011100000101001111110100000111001101010101111111110010011000001110011111000001100000011100011111110010", + "111101010000001111111011010101110000011111011100010000000110011001001110111011111011110000011101001111111001010000111000110110000010110010011", + "101010101101111001100101001011101100111101010011111001110001101101110010010110000010010011111100100100111101001101100000101010011110111001111", + "000011010101010100111000001011111000001110111110000001010111010110000110000100000010101001001110010100101010001010100111101101011001100001001", + "011011110010101110110010110010101000110000111010010010001101111010000010110001110100000101001000011010101010111011010110011000111000001111001", + "001111000110111001010101100010000110111001101010000110110000101111111000001101001101000110101011111001001111100110001110000000110100000100101", + "001111100000010100001000100111100001001000111111010100011100000001011111111011101111111110010001001001010000100000001101000111110011010100010", + "011000001110001111110011010001100011001101100100011010001100001100111101011001011001110010010101001111110001010001111100110110000010111010010", + "101001100100011000000100000101111110000110001100000100111011001100010100000111000010110011111110101100011100001101100000101110001110111001111", + "101110001111010100101000001111101011011100000110101011011101000011010101100110100000101011000110010100100010001011100011101101011001101001000", + "011000111001001111010011111100011010010011100100101111000111011011100100100010110100100101001010010010001011111011010110011100101000001111001", + "101110011100111001000101100111110101101011010011001100111010111010101011101001101111000100100011111001000111100111001010000000110100001100100", + "000100101011110101101001101000010011101011100001001001010110100001111001101010101111011110010011000001110001100000001101000011100011010100010", + "110101010000001111110011010101110000011111011100010000000110011000001110111001111011110000011101001111111001010000111000110110000010110010011", + "101110101111111001100101001010001100110101010010011001110001101101010010010000000010010011111100100100111101001101100000101010011110111001111", + "000011010101010100101000001010011000001110111110100001010111010111000110000010000010101001001110010100101010001010100111101101011001100001001", + "011111110100101110110010110011001000110000111010010010001101111010100010110101110100000101001000011010101010111011010110011000111000001111001", + "000011000110111001000101100011000110101001101010100110110000101110111000001011001101000110101011111001001111100110001110000000110100000100101", + "000011100000010100001000100111100001011000111111110100011100000000111111111101101111111110010001001001010000100000001101000111110011010100010", + "011000001010001111110011010001000011010101100101111010001100001100011101011001011001110010010101001111100001010001111100110110000010111010010", + "101001100010011000000100000101111110000110001100100100111011001100010100000011000010110011111110101100000100001101100000101110001110111001111", + "101110001011010100101000001110101011000100000111001011011101000011010101100110100000101011000110010100111010001011100011101101011001101001000", + "011011111011001111010011111111111010000011100100101110111111011011100100100110111111100101001010010010010011111011010110011100101000111111001", + "101110001100111001000101100010001101100011010011001101100010111010101011101111101000100100100011111001010110001111001010000000110100100010100", + "000110101111110101101001101010101011101011100001001001101010100001111001101110101010111110010011000001101110101000001101000011100011101010010", + "110110001000001111110011010110001000011111011100010000100010011000001110111101101000110000011101001111100010001000111000110110000011100010011", + "101111111101111001100101001111111100110101010010011000111111101101010010010000001111110011111100100100100111111101100000101010011110111111111", + "000011000001010100101000001011100000001110111110100001011101010111000110000010001111101001001110010100111100100010100111101101011001010101001", + "011100101100101110110010110101000000110000111010010010001101111010100010110101100001100101001000011010110011010011010110011000111001011011001", + "000001000110111001000101100001111110101001101010100110011010101110111000001011000010100110101011111001010000011110001110000000110100111000101", + "000010101000010100001000100100101001011000111111110101011100000000111111111101111000111110010001001001001000010000001101000111110010001000010", + "011000011010001111110011010000111011010101100101111010000110001100011101011001010100110010010101001111100111100001111100110110000010001110010", + "101010111010011000000100000011110110000110001100100100111011001100010100000011010111010011111110101100000101101101100000101110001111101101111", + "101100001011010100101000001100010011000100000111001011110111000011010101100110101110001011000110010100111101111011100011101101011001010101000", + "011001110011001111010011111111110010000011100100101110000111011011100100100110100010000101001010010010010011001011010110011100101101010011001", + "101110001100111001000101100110001101100011010011001100110000111010101011101111100011100100100011111001010001010111001010000000110100111000100", + "000111110111110101101001101110011011101011100001001001010110100001111001101110111011011110010011000001101000000000001101000011100001100000010", + "110111010000001111110011010111001000011111011100010000101100011000001110111101110101010000011101001111100110100000111000110110000101001110011", + "101111100101111001100101001001000100110101010010011000110001101101010010010000010100110011111100100100100101111101100000101010011001000101111", + "000011000001010100101000001011100000001110111110100001011101010111000110000010001110001001001110010101011100111010100111101101011111010101001", + "011100101100101110110010110101000000110000111010010010001101111010100010110101100000000101001000011011010011011011010110011000111110011011001", + "000001000110011001000101100001111110101001101010100110011010101110111000001011000011100110101011111000110000010110001110000000110111011000101", + "000010101001010100001000100100101001011000111111110101011100000000111111111101111001011110010001001000001000010000001101000111110101101000010", + "011000011010001111110011010000111011010101100101111010000110001100011101001001010101010010010101001110000111100001111100110110000101101110010", + "101010111011011000000100000011110110000110001100100100111011001100010100000011010110110011111110101101100101101101100000101110001000101101111", + "101100001011010100101000001100010011000100000111001011110111000011010101111110101110001011000110010101011101111011100011101101011010110101000", + "011001110011101111010011111111110010000111100100101110000111011011100100110110100010000101001010010011010011001011010110011100101110110011001", + "101110001101111001000101100110001101100101010011001100110000111010101011110111100011100100100011111000110001010101001010000000110011011000100", + "000111111110110101101001101111111011101001100111001001111110100001111001111110111111111110010011000000001011111010001101000011100101111110010", + "110110001001101111110011010110001000011101011110010000100010011000001110110101111000110000011101001110000010001110111000110110000000100010011", + "101110101101011001100101001010101100110101010110011001101011101101010010011000001010110011111100100101100110101011100000101010011001101011111", + "000010001000110100101000001010001000001100111000100001100011010111011110001010001000101001001110010101011110001100100111101101011110100011001", + "011111111101101110110010110111111000110000111010010010111111111010110010111101101111100101001000011011010011111001010110011000111110111111001", + "000010011111011001000101100101110110101101101000100110111010101110101000001011000110100110101011111000110101101000001110000000110111001100101", + "000000101000110100101000100110010001011110111101110101010110000000111111111101100110011110010001001000001011111110001001000111110100010100010", + "011001010011101111110011010101110011010101100111111011000110001100010101011001010010010010010101001110000011001111111010110110000100110010010", + "101010101011011001100100000110001110000000001110100100110001001100010100001011001011110011111110101101100111010111100110101110001001111001111", + "101111010010110101101000001000011011000010000011001011010111000011001101100110101011001011000110010101011000000101100001101101011010100001000", + "011011110011101110010011111101001010000101100110101110001101011011111100100110111101000101001010010011010000100101010010011100101111001111001", + "101111000101011001100101100011000101100011010001001101110000111010111011101111100100100101000011111000110101111001001100000000110010000100100", + "000111100110110100101001101011100011101101100011001001011100100001111001100110100110011111110011000000001010111010001011000011100100010100010", + "110100001001101111010011110011000000011001011000010000001100011000010110111101110000010001111101001110000011011110111010110110000001111010011", + "101101100101011001100101001011111100110011010000011000111011101101011010010000001011110010111100100101100110010011100110101010011001111001111", + "000010001000110100001000001110101000001110111100100000011101000111010110000010001001001000101111010101011000010100100001101101011111101001001", + "011100111101101111010011110000111000110110111000010010000111111010100010111101111101000100101001111011010001100001010000011100111111001111001", + "000010011111011001100101000101110110101111101110100110111010111110100000001011000110100111001010011000110101101000001100000100110111001100101", + "100000101000110100001000000110010001011110111101110111010110000000110111111101100110011111010000101000001011111110001011000111110100010100010", + "011001010011101111010010110101110011010101100111111001000110000100001101011001010010010011110100001110000011001111111010110100000100110010010", + "111010101011011001100101000110001000000000001110100110110001000100010100001011001101110010011111001101100111010111100110101100001001111001111", + "011111010010110100001000001000011101000010000011001101010111011011001101100110101101001010100111110101011000000101100001101011011010100001000", + "001011110011101111010010011101001110000101100110101110001101001011101100100110111011000100001011110011010000100101010000011010101111001111001", + "101111000101011001100100000011000111100011010001001001110000110010111011101111100000100101000010111000110101111001001100000110110010000100100", + "001111100110110100001001001011100001101101100011001101011100101001111001100110100000011111110010100000001010111010001011000001100100010100010", + "010011001001101111010010010011000010011001011000010000001100001000010110111101110110010001111100101110000011011110111010110000000001111010011", + "000010100101011001100100101011111010110011010000011100111111100101011010010000001111110010111101000101100011111011100110101100011001111111111", + "000000001000110100001001101110001010001110111100100011100011011111010110000010011000101000101111010101011010001100100001101011011111100011001", + "111111100101101111010010010110101000110110111000010010101011110010100010111101111010100100101001111011010010101001010000011010111110101011001", + "100000101111011001100100100010001100101111101110100101100010111110100000001011001000100111001010011000110110001000001100000110110111100010101", + "101110100000110100001001000011111111011110111101110001111110001000110111111101101111111111010000101000001111111110001011000001110100111110010", + "101110101011101111010010110111001111010101100111111000001100000100001101011001000011010011110100001110000010100111111010110000000100101110010", + "101110101011011001100100100111000110000000001110100100110001000100010100001011000000110010011111001101100001111111100110101100001001000101100", + "100000101010110100001001001111100001000010000011001001011101010011001101100110111000001010100111110101011000111101100001101011011011010101001", + "111111100011101111010010011111000100000101100110101010101101010011101100100110110110000100001011110011010111011101010000011010101111111011000" + ] + }, + "32": { + "0": [ + "1111111011100111111000011101110011001100101111110001111001101111010000101101111010101000110000111110010100111001110110110001101000110010101111111", + "1000001011011010011111010111010011011101100000010111001110010100101001111101001111111100111100110000011010110100000011010000011011010001001000001", + "1011101001010100110111101100010000000011000011001001101101001000110101100001010011100111011111010011111001010010001110001100000110001111101011101", + "1011101010110010101011010011010110001101001011011011010000111011000001101010000101101111001111001001001001001101001001001011000001001000101011101", + "1011101001101100100111110010101111111011011010010010110100111110110000011010100000011111101010010010010010010111111010010010110010010100001011101", + "1000001001111100101000010110110010001011011100000001111111100011100000110101111000111000101011111001010011111110001110001110101110001100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010100010000010000111010110001101111110011111000101100011111100101001100100101000101000011010110000011010001110000010110110000010100000000", + "1011011100001111000101110111101111111011111101010110111000111111000010111101101000101111100011111001010011111111111011011110101011011011101001011", + "0111100011100111111010011101110001011100101111101001110001010001010000101111111010110000110000111110010100111001101110110001101110110110111001001", + "0110011101011010011001010111010100011101100000010111011110001010101001111101001111101100111100110000011010110000011011010000011011010111101111010", + "0101110011010110110011101100010110010011000011001001110100000110110101100001010011100111011111010011111001010100000110001100000110001110101100100", + "0010111100110000101001010011010001001101001011011011001001000001000001101010000101100111001111001001001001001111010001001011000001001001110000001", + "1101100101101000100111110010101110010011011010010010100101110100110000011010100001010011101011110010010010000100101010011010110010010010010100010", + "0000011111111100101110010110110011101011011100000001101111000011100000110101111001000010001010011001010011100000110110000110101110001110100111111", + "1001110011111101011001011100001111101110100101000100011110000100100111110010111110000010110010100001101011011011100101000001101101011001111111000", + "1000001110110111110011000001011111010101001011100000010110100001110100001011011100100101010100001111100101010010010101110100011101101101010111001", + "1011000010011110010111110000011100110001000010000101010100111100111101000010010101111100111001010011111001010100000011001010000011011011010100110", + "1100001010001011000011001100001111000110111011001101000101010001110010100110010010110110000001101011000001101011000000001101000000001100110100001", + "0001000001100000000101011010100000100101110101111110000010110000000011010111100011010000001111100101001111100010110000111000110000111000011010000", + "1101011001000101000100111110111100100000100110110110000100101100101100000111101100001010100100100100100100100010111100100100101101100100011101100", + "0101110110110011111101001001110101001000000001001001111110101111101011000001111010001000110000101001001001011111110001000001101000101001001111001", + "0110101001010010011000000000000101011101101010110110111001110101010110000011001111110100111100101111100101010110000000110000011000011000010001001", + "0100010110010000110101110001100010000011001000101111010011101001001010011111010011101111011111001100000110110110001000101100000001010100011010101", + "0001011101101100101001111010000100001110010000111001101101111010101111011000000111111110001111010100111110001001001110101111000111010110011100010", + "1101110100101000100000000110101010000111110100110011000010001010001011111100100011001010001111100101001111100010110101111100110100001101111010000", + "0001101111100110101110100001100010101011010110100010101000111100011111010011111111011011101100000110101100000110101101100000101100000001000001100", + "1010010010111011111110000001111011111110101110100110111001101011011000010100111000001011010100111110010100111001101011100011101011000011011001011", + "1011101111110010010010101000001010010110010000000100110010011010011010100001011010111100010010010010010010010100001010010010011010110010110011010", + "1000010011011110010000100100011010100101101010100000010011000110000110101100000111100101000101000100100100110010011100101100100100100100110010100", + "1101111010001000100011011011011100000110110101101101100010101000001101011000001100101111111111110100111110001101011011101011100011100011001010010", + "0010100000100111000011000111010110110101111100011001100101011001111100101001111101011001110001111010110000000000111110011011010110000010100100011", + "1100111110000001000100010111101011111011111111010100000001111111000010110101100010011111110010111001010011100111111011000011001010011011111111111", + "0110100011110011111011011101110010001100101111101000011001100011010000100111110000001000110100111110010100111010001110100110101111010111100011011", + "0111101011010001111000010111010110101101100110010100011110101010101001100101001001101010111010110000011010110010101011010110011010110111101011010", + "0111100011010110111011101100010010001011000011001011010100100010110101111001010101111000111001010011111001010110001110001110000110101111100010110", + "0000111110101001010001110011010111111101001011011111101001111111000001111010000001111111101001001001001001001111111001001001000001101000111110001", + "1110000111101001101110010010101001010011011100010110100101000010110000011010110001000101010011110100010110000010010000011010010010010011010110010", + "0000001011100100001110110110110110110011011000000000001110111111100000110101100001000100110010011111010101100000000100000110001110001110110101111", + "1001000011111101000000011100001011000110100111000010111110010000100111110010100110011110001010100111101101011111000011000000001101011000001101000", + "1010001000110111100010100001011100100101001001110010110111110001110100000011110100110000000100001011100011010000110011110101101100101100000011001", + "0011010000011110001110110000011110100001000010000101110100001100111101001010111101100010111001010011111001010010111111001011011010111010100100110", + "0000111110001010101011001000001011001000111101010111000100101011110010111111110010110000100001101011000001101001110000001101011001101100111110001", + "1101100001100000001101011000100001011001110101101101100010010010000011001110000011011010101111100101001111100010000000111000111000011000110000000", + "0101011111000100111100011000111010000100100110101010000100101110101100010110101100011001000100100100100100100000001100100100100100000101010011100", + "1001010100110010110101001101110010001000000111000101111110011001101011000001101010011000001000101111001101011001001011000001001001001000001101001", + "1010111101010010111000000110000000000001101110100110111000001001010110000011010111110110000100101001100011010110110010110000111000111000000011001", + "1000100110010000101101110101100110101011001010111111001011110101001010011111001011110011100111001010000000110010101110101101100000110011100000101", + "0101011011101100111001111110000111111110010010110001100100100010101101011000101111101011011111010000111000001011101000101110110111110001011000010", + "0101100110101000111000000100101000010001110100110011000010100010011001111100001011010100001111100101001111100100001001111101101100001010010011100", + "1101011011100111000110100001100110100111010000100010111001011110000001010010011111011101001100000110101100000100011101100000110100000111010010000", + "0110110010111011010110000001111010000110101110101110101001011001000110010101011000000001110100111110010100111001011011100011100011000001101010111", + "0011101011110010001010101100101100110101110000011100110010011000010110100000011010101111110010010010010010010110011010010010010010110001100100010", + "0100110011010111011000100010111111100110101010101000010011110100001110101100000110110101100100100010100000100100000110100100100100100101100000100", + "0001101010011001100011011101111011011011110101111101100011010010001101011000001101001101011110010010111000010100001001100011100011100011011000010", + "1110010000100110011011000010110000011101111100001001111101000011111100101001111100100101010000011100110110011101111000000011010110000011010110011", + "1000111110001001010100010010001011001011011111011100001001001111000000110101000010100110110011111101010101111111000101011011011010011110110101111", + "1110110111101011100011011111010011110011001111101000011001111001000010100111010000101111010100111110010100111111010010110110110111010001001000111", + "1011111111010001110000010110110011111000100110010100001111111110110111100100101001101111111010110000011010110011111011010110000010110001111110110", + "1011100011010110111010101100010010001011000011000011000101100010101011111000110101111000111001010011111001010110001110001110001110101101100011010", + "1000101010100001010001110111110010101110101011000111101001101011001101111011000001101010101001001001001001001010101001001001001001101011101011001", + "0010100011100001101111110100001110001000011100011110100100100010111000011010110000001000110010010101001110010010001000010010010010010011100010010", + "1100111111110100001111010000010011111110011000010000001110111111100000110101100000111111110011111110101101111111111100001110001110001111111111111", + "0101110101111101000001111001101100111110100111010010100111010010100111110010100111110000101011000110010101000011110011011000001101011000011111000", + "1110101110111111100011000100111111101101101101101010111110100011110110001011110100010010100101001010010011001010000011101101101101101000110001001", + "0011010010000110001111010010111001101110100000000101110100101110101111000010111101001001011001010011111001010010101111011011011011011101110011010", + "0000011110001010101011101101111110010011101101001111010101111001101100100111110010101000000001101011000001101111101000001101011000001010101101101", + "1101110111100000001100011010100111000101100001110101110010001000011101010110000011010110001111100101001111100111010000111000111000111011000011100", + "0101101111001100111100011010000000111011011100101010000100010100100000000110101100001011100100100100100100100111001100100100100100100110000000100", + "1001010010111010110100101111011100000011001101000101111111000011100011000001101011011011001001001110010101001000101011001001001001001000011001001", + "1010101101000010111001100110100111001000110110100110111000100011010110000011010110001100000101001000011011001010001010111000111000111001110011001", + "1000010000010000101100010100000111110011011000111111001010111111001010011111001010011101000110101011111000101110011110110101100000110101110010101", + "0101111101100100111000011111111101010110111000110001100101111000001101010000101111001001111110010001001000010001011000110110110110110011101010010", + "0101100100110000111001100100001111011000000000110011000010011000111000110100001011111111101111100101001111100100011001101101101101100011000101100", + "1101111011100111000110000000011001111110000010100010111000010101100000101010011111000101101100000110101100000010010101100000110101101111000000000", + "0110100100111011010111000001101100011110110000101110101001010010100111101101011000001101010100111110010100111100010011100011100011111000011000111", + "0011011001111010001010101100100010001101100010011100110010100011010110010000011010111101010010010010010010010001100010010010010010001000101110010", + "0100110111010111011001011010111101101110110000101000010010101110001110001100000110110110100100100101111100100101001100100100100100110101101100100", + "0001111111011001100010110101110010010011101101111101100011111000001101011000001101010111011110010101000110010001011011100011100011100010110000010", + "1110100111000110011010111010110111000101101110001001111100001101111100101001111100101011110000011011001000011000101110000011010110000011010100011", + "1000011000001001010101111010010100111011010101011100001000010011100000111101000010100100010011111000100011111100110011011011011011011110000111111", + "1110110110101011100010110111010010000011011011101000011001000101100011101111010000100100110100111110010100111111000110110110110110111000011110111", + "1011001101110001110000101010101011001110110100010100001110100001010110011100101001110011011010110000011010110100100011010110000011011001110110110", + "1011000000110110111010101000000001110011011101000011000100111101001010000000110101100000111001010011111001010001111110001110001110010101110101010", + "1000111111100001010001110101111011111100111001000111101000111110001101001011000001101111101001001001001001001111111000001001001001010011111111001", + "0010100011100001101111101010001010001110000110011110100100100010111000111010110000001000110010000011001011110010001011110010010010000011100010010", + "1100101011110100001111011000011110101100000000010000001110101011100000110101100000111010110011100000101010011110101111101110001110001111101011111", + "0101100011011101000001100101101010001000110101010010100111100010100111110010100111101000101011011000010010100010001101111000001101011001100011000", + "1110111110111111100011001000100011111001000011101010111111111111010100001011110100001111100101010110010100001011111101001101101101101101111111001", + "0011100111000110001111011110111010111011110110000101110100110100011100000010111101011011111001010011111001010001010011011011011011010011011001010", + "0000011010001010101011110011110000000101001111001111010100000010010011000111110010111011000001101011000001101000100000001101011000000101000001101", + "1101100100000000001100011110110011001100001011010101110010000011100010110110000011010100001111100101001111100110000000111000111000100001101011100", + "0101011000001100111100011001110001110001010100001010000101111011101100100110101100010101000100100100100100100010011101100100100100111100000010100", + "1001110100111010110100110001010011010100111101000101111111011111101011100001101011001001101001011000010000101011011000101001001001011000101011001", + "1010101101000010111001101111101011011011010111100110111001011111010110000011010110000111100101010110011100101100011001011000111000111000000101001", + "1000110010110000101100001000100101111100111001011111001010110111001010011111001010000101100110110101111111001100010000010101100000110101000000101", + "0101101101100100111000010011011000011010111000010001100100010000001111010000101111011101011110001101001111010000010110010110110110110111111000010", + "0101010001110000111001101001001100001101100001110011000010001010101010110000001011110101001111100101001111100111100101101101101111100101101111100", + "1101111111100111000110011111011101101000000011000010111001100111111110101100011111010110101100000110101100000101001101100000110111101000101100000", + "0110110111011011010111000101101000010110110000101110101001000000111001101011011000001111010100111110010100111101011011100011100101111010110000111", + "0011101110111010001100101111000111000111100011011100110011010101011010010010011010100011110010010010010010010100101011010010010100001010110100010", + "0100010001010111011111011100111110111001010001001000010010100010000110001110000110100100000100110100100101000110110101000100100000110101000110100", + "0001111110011101100010110100110000000000001100111101100010000100001101011000001101011100111110001100111111110111000010000011100011100011111110010", + "1110000100000010011100111110010011011010001111101001111100000001111100101001111100110011010000000010110001111010100110100011010110000011010010011", + "1000001000001101010011111110110101100111010101111100001001111101100010111101000010110000110011100001010010111011111011111011011011011010110011111", + "1110000010101111100010110010010111000110111010101000011001010001110001101011010000101110010100111110010100111010111110110110110100111111110010101", + "1011001001010111110000101001111010000110110101110100001111010001001000011010101001100000011010110000011010110101111011010110000001011111011100101", + "1011010010110100111010101000011100110011010101000011000100101101010100000110110101100010111001010011111001010100110110001110001000010110111101001", + "1000111101100001010111110100001101010100110000000111101000001110000001001001000011111000101001001001001001001111110000001101001111010000001111010", + "0011100111100011101001101010000000100111101111111110100101110100110000111000110010010010110110000010010011110000000011110100010110000010010000010", + "1100111111110000001111011001001111111101111001010000001111111111100000110101100110111111110101100001010010011011111111101000001110011110111111111", + "0100100011011001000111100101010010001001000100110010100111100010100111110010100001101000101101011001101010100110001101111010001101001001100011000", + "1101101010111011100101010000000010101001101011001011011111101011110100001011110000011010100011010111100100001010101101001111101101101101101011001", + "0011100011000100001111010111100110001011011111000101010101100010111101000110111101001000111001010011111001010110001011011011011001011011100011000", + "0001111110001100101011110010101011111101101110101001010101111111110010100001110010111111100001101011000001101111111000001101011010001101111111110", + "1111100100000010001100000110101001001101100011110001010010011110000011010000000011010111101111100101001111100100011000111000111110111001100101111", + "0111111010001100111010000001100000101001011101101001100100110110101100000100101110001101100100100100100100100000010101100000100010100101000100111", + "1010100100111000110010111001011001001100110100100100111111110001101011000011101001001101001101011001001000101010010000101111001101001001011111001", + "1010011001000110111001100111111001110011001111100100011000001011010110000011010000011101000011010111100100101111100001011110111000111000101001001", + "1001000111110100101010001000111100110100101001011101101011000111001010011111001100000110100000110100000111001011001000010111100000110100101010101", + "0110101110000000111110000011011101011010110000010100000100100000101111010000101011000111011000001100111111010101011110010100110110110111010000010", + "0101000111110010111001111001010010001101101001110111100011010100001011110000011011110011110111100101001111100000101101101101001111101100110101110", + "1100001000000001000110010111000100010000000011000010111000000010011111001100000111001100010100000110101100000000110101100000010111100001100110011", + "0100110111111001010111011101110010010110111000101000001001000101011000001011000000001100101100111110010100111111000011100010000101100010111110100", + "0001001101011010001100110111010110011111101011011111010010000000011010110010010000111011000010010010010010010110110010010111110100010011110010001", + "0111100001010100011111010100110100100001011001001001010010011100000110101110001100100000100000100100100100100111100100100011100000100100110010100", + "0001111010111100100010111100100010101000010100111111000011010000001101011000001011000110011000010100111110010100100011100101100011100011110010010", + "1111100001000010010100111110001010000010011111101011011101110001111100101001111010110000010110011010110000011101110110000001010110000010011100011", + "1011111011101100111011101110110000110111011101111001101001001101000010111101000110101011110101111001010011111000111011011001011011011010111101111", + "1110000100101001101010100010001001010110110010101100111000001111010000101011000000101001001100111110010100111011110110110110010100110111101110101", + "1010101110110111110000100001110010100110110101010100001110110100101001111010110001111011000010110000011010110110000011010110100001010111010000101", + "1001010010010100111010110000011111111011010101100101100100101000110101100110101101100000100001010011111001010010101110001111101000001111010011001", + "1010011110000001000111101100001101000100110000000100001001011011000001101001101011100000011001001001001001001101101001001100111111001000101001010", + "0001010111100010110001100010000010010111101110011111100100101010110000011000011010010110010110010010010010010001010010010101001110010010000100010", + "1010001111010001000111010001001111000101111000110010101110111101100000110100000110101011110101111001010011111001001110001000010000001110011111111", + "0110000010011001010101100101010001011001000100110000000110101010100111110011000001101011001101000001101011000110101101011010000011011001000111000", + "1011011101011010011111011000000111111001101010100111011111111111110100001010110000011111100011001111100101001011111101101111100011101100111111001", + "0000000011000100000001001111100110001011011110110001010101100010111101000010101101001000100001010011111001010010001011011011111111011010100011100", + "1111111011101100101001111010101010101101101110001111000101101011110010100111101010101010111001101011000001101110101000001101111000001101101010110", + "1000001010100010001000000110101010001101100011001011010011100010000011010110011011001000110111100101001111100010001000111001011000111001100011011", + "1011101001101100101010000001100111111001011101110001100101111110101100000110000110011111110100100100100100100111111100100001010100100101111111011", + "1011101010111001101010111001011001011100110101011100100111000001101011000001000001000110001101001001001001001111010001001110010001001001110000101", + "1011101011100111110011100111111100001011001110010100000000010101010110000010110000001010000011001111100101001000101000111110100000111001110100110", + "1000001001110100111110001000111100010100101001011101100011100011001010011110101100010101100000101100000110101010110000110111101000110101100111000", + "1111111010000001000110000011011000010010110001111100010101000100101111010001101011001101011000010100111110010001000110110100111110110111011111011" + ], + "1": [ + "1111111001100100111001111011101010100101011000001101011001101111010000101111010000101000110100111110010100111001110110110110110110110010101111111", + "1000001010000001010110000110110001010110010100111110010101001111110010100111110010100001100001101011000001101111011000001101011000001001001000001", + "1011101000010011111111111101010001011011000001101011000000100101011000001101011000001100110100111110010100111111000011100011100011100011101011101", + "1011101011000101010111000000011010001111010000101111010000111011000001101011000001101000001001001001001001001101101001001001001001001000101011101", + "1011101001100000010111101101000111111000101111010000101111111111101011000001101011001111101001001001001001001111111001001001001001001100001011101", + "1000001010001011110100000000001010001001101011000001101010100010001101011000001101011000111110010100111110010010001011100011100011100000101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001100001010111111110001110001100111110010100111110100010100111110010100111111000101011000001101011000010001101011000001101011001100000000", + "1111101111111110001100000011110111111000001101011000001101111110101111010000101111001111111110010100111110010011111110110110110110110110010101010", + "0100010111101100111001111010110111011101011000001101011001010001010000101111010000110101010100111110010100111000001110110110110110110110111000011", + "0001001110000001010110000110111000001110010100111110010101010001110010100111110010110110000001101011000001101010100000001101011000001100010100101", + "0111000000011101111111111101011010101011000001101011000001101011011000001101011000001011010100111110010100111000101011100011100011100011000000011", + "1110001111011101010111000001110001110111010000101111010001000001000001101011000001100111001001001001001001001111010001001001001001001001110000101", + "0100110001101100010111101101101000100000101111010000101110101111101011000001101011001000101001001001001001001111110001001001001001001001001111001", + "0010001000000011110100000000000011010001101011000001101010101110001101011000001101001001111110010100111110010101011011100011100011100011001010010", + "1011110001100111010111111110100101011100111110010100111110000100100111110010100111100100101011000001101011000011000101011000001101011001111111000", + "1110111011111010001100000010011110001000001101011000001101111010101111010000101111011000011110010100111110010001101110110110110110110110001100010", + "0100010111101000111001111010101111011101011000001101011001010001010000101111010000110101010100111110010100111000001110110110110110110110111000111", + "0000001110000111010110000110010000001110010100111110010101010001110010100111110010110110000001101011000001101010100000001101011000001100110101101", + "0110000000011001111111111101011010101011000001101011000001101011011000001101011000001011010100111110010100111000101011100011100011100011000000111", + "1110001111011111010111000001110001110111010000101111010001000001000001101011000001100111001001001001001001001111010001001001001001001001110001001", + "0101110001101010010111101101101000100000101111010000101110101111101011000001101011001000101001001001001001001111110001001001001001001001001111001", + "0001001000000001110100000000000011010001101011000001101010101110001101011000001101001001111110010100111110010101011011100011100011100011001010010", + "1011110001100111010111110110100101011100111110010100111110000100100111110010100111100100101011000001101011000011000101011000001101011001111111000", + "1101011011111010001100001010011110001000001101011000001101111010101111010000101111011000011110010100111110010001101110110110110110110110001100010", + "0101000111101000111001100010101111011101011000001101011001010001010000101111010000110101010100111110010100111000001110110110110110110110111000111", + "0010101110000111000110010110010000001110010100111110010101010001110010100111110010110110000001101011000001101010100000001101011000001100110101101", + "0111010000011001111111101101011010101011000001101011000001101011011000001101011000001011010100111110010100111000101011100011100011100011000000111", + "1111001111011111011111011001110001110111010000101111010001000001000001101011000001100111001001001001001001001111010001001001001001001001110001001", + "0111100001101010001111110101101000100000101111010000101110101111101011000001101011001000101001001001001001001111110001001001001001001001001111001", + "0001011000000001100100011000000011010001101011000001101010101110001101011000001101001001111110010100111110010101011011100011100011100011001010010", + "1011010001100111001111110110100101011100111110010100111110000100100111110010100111100100101011000001101011000011000101011000001101011001111111000", + "1101111111111010010100001010011111111000001101011000001100111110101111010000101111011111111110010100111110010011111110110110110110110110111110010", + "0101100011101000101001101010101110001101011000001101011001100011010000101111010000101000110100111110010100111010001110110110110110110111100010111", + "0010101010000111001110010110010110101110010100111110010101101011110010100111110010111010100001101011000001101010101000001101011000001100101011101", + "0111100010011001110111111101011110001011000001101011000001100011011000001101011000011000110100111110010100111010001011100011100011100010100010111", + "1111111111011111010111011001110011111111010000101111010001111111000001101011000001111111101001001001001001001111111001001001001001001000111111001", + "0111000011101010000111110101101000001000101111010000101110011011101011000001101011011000001001001001001001001001101001001001001001001000001101001", + "0001111110000001100100011000000101011001101011000001101011010000001101011000001101001101011110010100111110010100001011100011100011100011011000010", + "1011100111100111001111110110100000001100111110010100111110010000100111110010100111111110001011000001101011000110100101011000001101011000010101000", + "1101011001111010010100001010011000101000001101011000001100101010101111010000101111001011011110010100111110010010101110110110110110110111000000010", + "0101000111101000101011101010101111110101011000001101011001100001010000101111010000101111010100111110010100111111010110110110110110110111011000111", + "0010101000000111001110010110010010100110010100111110010100101111110010100111110010110000100001101011000001101001110000001101011000001100100111101", + "0111010000011001110111111101011111010011000001101011000001001111011000001101011000000001110100111110010100111001011011100011100011100011101010111", + "1111011001011111010000011001110101011111010000101111010001000101000001101011000001110100101001001001001001001101000001001001001001001000111111001", + "0111000011101010000001010101101000001000101111010000101110011011101011000001101011011000001001001001001001001001101001001001001001001000001101001", + "0001111110000001100110111000000101011001101011000001101011010000001101011000001101001101011110010100111110010100001011100011100011100011011000010", + "1011100111100111001010110110100000001100111110010100111110010000100111110010100111111110001011000001101011000110100101011000001101011000010101000", + "1101011001111010010011001010011000101000001101011000001100101010101111010000101111001011011110010100111110010010101110110110110110110111000000010", + "0101000111101000101000101010101111110101011000001101011001100001010000101111010000101111010100111110010100111111010110110110110110110111010000111", + "0010101000000111001111110110010010100110010100111110010100101111110010100111110010110000100001101011000001101001110000001101011000001100101111101", + "0111010000011001110111111101011111010011000001101011000001001111011000001101011000000001110100111110010100111001011011100011100011100011101010111", + "1111011001011111010001011001110101011111010000101111010001000101000001101011000001110100101001001001001001001101000001001001001001001000111111001", + "0111000011101010000000110101101000001000101111010000101110011011101011000001101011011000001001001001001001001001101001001001001001001000001011001", + "0001111110000001100110111000000101011001101011000001101011010000001101011000001101001101011110010100111110010100001011100011100011100011011100010", + "1011100111100111001010110110100000001100111110010100111110010000100111110010100111111110001011000001101011000110100101011000001101011000010101000", + "1101011001111011110011001010011000101000001101011000001100101010101111010000101111001011011110010100111110010010101110110110110110110111000000010", + "0101000111101000101000101010101111110101011000001101011001100001010000101111010000101111010100111110010100111111010110110110110110110111010000111", + "0010111110000111001111110110010011111110010100111110010100111111110010100111110010111111100001101011000001101011111000001101011000001100111111101", + "0111100010011000010111111011011110001011000001101011000000100011011000001101011000011000110100111110010100111010001011100011100011100010100010111", + "1111101011011111110001011111110110101111010000101111010001101011000001101011000001101010101001001001001001001010101001001001001001001001101011001", + "0111100011101011000000110101101110001000101111010000101111100011101011000001101011011000101001001001001001001010001001001001001001001000100011001", + "0001111110000001100110111100000111111001101011000001101011111110001101011000001101011111111110010100111110010011111011100011100011100010111110010", + "1011100001000110101010110010100000100100111110010100111111001110100111110010100111110000101011000001101011000011110101011000001101011000101111000", + "0101011000011010110011001110011011010000001101011000001101101110101111010000101111001001111110010100111110010001011110110110110110110111001010010", + "0101010001001001101000101100101001011101011000001101011001000101010000101111010000100100110100111110010100111111000110110110110110110111111110111", + "1110001010100110001111110110010000001110010100111110010100111011110010100111110010101000000001101011000001101111101000001101011000001101001101101", + "1111110110011001010111111011011011011011000001101011000000110001011000001101011000001101010100111110010100111100001011100011100011100011011000111", + "0111101111111111110001011001110100001111010000101111010000010001000001101011000001100110001001001001001001001010100001001001001001001001110101001", + "0011010010101011000000110111101110101000101111010000101111101011101011000001101011011011001001001001001001001000101001001001001001001000000001001", + "0101001001100001100110111100000111110001101011000001101011000000001101011000001101010111011110010100111110010001010011100011100011100010110000010", + "1111100100000110101010110010100000100100111110010100111111001110100111110010100111110000101011000001101011000011110101011000001101011000101111000", + "0101011100001010110011001110011011010000001101011000001101101110101111010000101111001001111110010100111110010001011110110110110110110111001010010", + "1101010010001001101000101100101001011101011000001101011001000101010000101111010000100100110100111110010100111111000110110110110110110111111110101", + "0110001010011110001111110110010000001110010100111110010100111011110010100111110010101000000001101011000001101111101000001101011000001101001101101", + "1011110100001001010111111011000011011011000001101011000000110001011000001101011000001101010100111110010100111100001011100011100011100011011000101", + "0011101011100111110001011000101100001111010000101111010000010001000001101011000001100110001001001001001001001010100001001001001001001001110101001", + "0011010110110011000000110111011110101000101111010000101111101011101011000001101011011011001001001001001001001000101001001001001001001000000001001", + "0101001011110101100110111101101111110001101011000001101011000000001101011000001101010111011110010100111110010001010011100011100011100010110000110", + "1111100110001000101010110010111000100100111110010100111111001110100111110010100111110000101011000001101011000011110101011000001101011000101110000", + "0101011100001000110011001111011011010000001101011000001101101110101111010000101111001001111110010100111110010001011110110110110110110111001011110", + "1101010110001011101000101100111001011101011000001101011001000101010000101111010000100100110100111110010100111111000110110110110110110111111110111", + "0110001010011110001111110110110000001110010100111110010100111011110010100111110010101000000001101011000001101111101000001101011000001101001101101", + "1011110100011001010111111010101011011011000001101011000000110001011000001101011000001101010100111110010100111100001011100011100011100011011000111", + "0011111111100101110001011000110111111111010000101111010001111111000001101011000001101111101001001001001001001111111001001001001001001000111111001", + "0011100010110011000000110111111010001000101111010000101110100011101011000001101011011000101001001001001001001010001001001001001001001001100011001", + "0110101011110011100110111101101110101001101011000001101010101010001101011000001101011010111110010100111110010010101011100011100011100011101010010", + "1111100010001100101010110010111110001100111110010100111111100010100111110010100111101000101011000001101011000010001101011000001101011000100011000", + "0111111110001010110011001111011111111000001101011000001101111110101111010000101111011111111110010100111110010011111110110110110110110111111110010", + "1111100010001001101000101100111100001101011000001101011001010001010000101111010000110110010100111110010100111100100110110110110110110111010100111", + "0100011110011110001111110110110000101110010100111110010100001011110010100111110010111011000001101011000001101000101000001101011000001100000001101", + "1010000010011001010111110010101101110011000001101011000001000001011000001101011000001111010100111110010100111101010011100011100011100011010000111", + "0001101111100101110001001000110000100111010000101111010000001111000001101011000001111000101001001001001001001111110001001001001001001000001111001", + "0010010100110011000000100111111001010000101111010000101110101111101011000001101011001001101001001001001001001011011001001001001001001001001011001", + "0111011111110011100110100101101111011001101011000001101011100100001101011000001101001100111110010100111110010111000011100011100011100011011110010", + "1111000010001100100010111010111010001100111110010100111110111010100111110010100111110000001011000001101011000001101101011000001101011000101101000", + "0111111100001010101011010111011111011000001101011000001101010000101111010000101111000101011110010100111110010000001110110110110110110111111000010", + "1111100010001001101000100100111100001101011000001101011001010001010000101111010000110110010100111110010100111100100110110110110110110110110100111", + "0100011110011110011111100110110000101110010100111110010100001011110010100111110010111011000001101011000001101000101000001101011000001100000001101", + "1010000010011001000111101010101101110011000001101011000001000001011000001101011000001111010100111110010100111101010011100011100011100011010000111", + "0001101111100101101001000000110000100111010000101111010000001111000001101011000001111000101001001001001001001111110001001001001001001000001111001", + "0010010100110011010000101111111001010000101111010000101110101111101011000001101011001001101001001001001001001011011001001001001001001001001011001", + "0111011111110011110110110101101111011001101011000001101011100100001101011000001101001100111110010100111110010111000011100011100011100011011110010", + "1111000010001100111010101010111010001100111110010100111110111010100111110010100111110000001011000001101011000001101101011000001101011000101101000", + "0111111100001010110011010111011111011000001101011000001101010000101111010000101111000101011110010100111110010000001110110110110110110111111000010", + "1111100010001001100000100100111100001101011000001101011001010001010000101111010000110110010100111110010100111100100110110110110110110110110100111", + "0100101110011110011111100110110000101110010100111110010100001011110010100111110010111011000001101011000001101000101000001101011000001100000001101", + "1010010010011001000101101010101101110011000001101011000001000001011000001101011000001111010100111110010100111101010011100011100011100011010000111", + "0001011111100101101111000000110000100111010000101111010000001111000001101011000001111000101001001001001001001111110001001001001001001000001111001", + "0010110100110011010100101111111001010000101111010000101110101111101011000001101011001001101001001001001001001011011001001001001001001001001011001", + "0111111111110011110101110101101111111001101011000001101010111110001101011000001101001111111110010100111110010111111011100011100011100011111110010", + "1111100010001100111000001010111110001100111110010100111111100010100111110010100111101000101011000001101011000110001101011000001101011001100011000", + "0111101010001010110100010111011010101000001101011000001100101010101111010000101111011010111110010100111110010010101110110110110110110110101010010", + "1111100010001001100011100100111110001101011000001101011000100011010000101111010000111000110100111110010100111010001110110110110110110110100010111", + "0100111110011110011111100110110111111110010100111110010101111111110010100111110010101111100001101011000001101011111000001101011000001101111111101", + "1010100110011001000101001010101111011011000001101011000001000101011000001101011000010100110100111110010100111001000011100011100011100010111110111", + "0001101011100101101110100000110000001111010000101111010001011011000001101011000001110000001001001001001001001011101001001001001001001000101101001", + "0010100100110011010110101111111011011000101111010000101111110001101011000001101011001101001001001001001001001000001001001001001001001001011001001", + "0111111011110011110000010101101000001001101011000001101011010000001101011000001101000110011110010100111110010110100011100011100011100011110100010", + "1111000110001100111000101010111000101100111110010100111110101010100111110010100111101011001011000001101011000110101101011000001101011001000001000", + "0111111010001010110101110111011011110000001101011000001100100000101111010000101111001111011110010100111110010101010110110110110110110111010000010", + "1111010110001001100010000100111100100101011000001101011000001111010000101111010000100000110100111110010100111011110110110110110110110111101110111", + "0100101100011110011111000110110111010110010100111110010101101111110010100111110010111001100001101011000001101001011000001101011000001100010011101", + "1010100110011001000101001010101111011011000001101011000001000101011000001101011000010100110100111110010100111001000011100011100011100010100110111", + "0001101011100101001110100000110000001111010000101111010001011011000001101011000001110000001001001001001001001011101001001001001001001000111101001", + "0010100100110010110110101111111011011000101111010000101111110001101011000001101011001101001001001001001001001000001001001001001001001001000001001", + "0111111011110010110000010001101000001001101011000001101011010000001101011000001101000110011110010100111110010110100011100011100011100011110100010", + "1111000110001101011000101010111000101100111110010100111110101010100111110010100111101011001011000001101011000110101101011000001101011001000001000", + "0111111010001011110101110101011011110000001101011000001100100000101111010000101111001111011110010100111110010101010110110110110110110111010000010", + "1111010110001000100010000000111100100101011000001101011000001111010000101111010000100000110100111110010100111011110110110110110110110111101110111", + "0100101100011110011111000000110111010110010100111110010101101111110010100111110010111001100001101011000001101001011000001101011000001100001011101", + "1010100111111000100101001110101111011011000001101011000001000101011000001101011000010100110100111110010100111001000011100011100011100010111110111", + "1001101010100100101110100000110000001111010000101111010001011011000001101011000001110000001001001001001001001011101001001001001001001000101101001", + "1010100100110011010110101011111011011000101111010000101111110001101011000001101011001101001001001001001001001000001001001001001001001001011001001", + "1010001010110011110000010001101000001001101011000001101011010000001101011000001101000110011110010100111110010110100011100011100011100011110100010", + "0110000110001100011000101010111000101100111110010100111110101010100111110010100111101011001011000001101011000110101101011000001101011001000001000", + "1011011010101011110101110011011011111000001101011000001100111110101111010000101111001111111110010100111110010011111110110110110110110111111110010", + "0000000011101000100010000110111110001101011000001101011000100011010000101111010000101000110100111110010100111110001110110110110110110111100010111", + "1111111010111110011111000000110110101110010100111110010101101011110010100111110010101010100001101011000001101110101000001101011000001101101011101", + "1000001001110000100101001110101010001011000001101011000000100011011000001101011000011000110100111110010100111010001011100011100011100010100010111", + "1011101010001100101110100000110111111111010000101111010000111111000001101011000001111111101001001001001001001011111001001001001001001000111111001", + "1011101011101011010110101011111111110000101111010000101111000001101011000001101011000111001001001001001001001001010001001001001001001001110011001", + "1011101010111011110000010001101100100001101011000001101011001110001101011000001101010000111110010100111110010101110011100011100011100010101100001", + "1000001010010100011000101010011001010100111110010100111110001110100111110010100111111001101011000001101011000001011101011000001101011000001001001", + "1111111010101011110101110011010101011000001101011000001101000100101111010000101111001100111110010100111110010101000110110110110110110111011010011" + ], + "2": [ + "1111111001110001011100101110001101100110111100000101101100010110101000110011010101011110101001010000001000101001110100110001110100110110101111111", + "1000001001100110011000100011010100111110110100001100110011111001000000100111000110011111110011101110000100101000000001010000000001010001001000001", + "1011101000000101101111000000111100001001111101000111000100011000011011101001110000000011100101001101100111001100001000001100001000001111101011101", + "1011101000111001011101111100111001100011011101111001011000111110111110110001100100001110101000110101011111010011011111001011011111001000101011101", + "1011101011001010000111011101010111111010100111011010010110111111101111101000000000001111110011101011001111110011111110010010101110010100001011101", + "1000001000101000101110111101100110001001100010111010000101100011111010010001110000101000100100011000101100011110001110001110110110001100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011001011011001011110001110001001001011110001110011100010111111011111000110111000110011101011001111111110001110000010111110000010000000000", + "0011001111001100110000111001010011111011010000010111110101111111000101011100010011111111100101000000100100111111111011011110110011011110011010000", + "1011110101110001011100101110001001100110111100000101101101110110101000110011010101001110101001010000001000101001110100110001110100110001001111011", + "0010111001100110011000100011010010111110110100001100110011111001000000100111000110010111110011101110000100101000000001010000000001010000101001010", + "0100110000000101101111000000111000001001111101000111000101111000011011101001110000010011100101001101100111001100001000001100001000001100101010110", + "0001101000111001011101111100111111100011011101111001011000111110111110110001100100000110101000110101011111010011011111001011011111001011110000001", + "0000100011001010000111011101010010111010100111011010010110101101101111101000000000010101110011101011001111110010101110010010101110010010010100000", + "0100001010101000101110111101100100001001100010111010000101001111111010010001110000100001000100011000101100011110110110001110110110001110011111100", + "1001010010010000000010000101010101111010010000101010101000010101100100000100011101111110001000110000010100100001100101011001100101011001000111011", + "1010111011111010000110001111100100110101100110100001000011100101110011101010100101011101110011110110010010001000000101101000000101101000101011010", + "0110010010011100110001000011100100000011010001101000000000011011000101011110111000100011000100111101100101000100011001011100011001011100100010110", + "1001101110111101000011111000001001111101101111010111101000100010011011111100011101001100101000110101011111110011011010001011011010001011110010001", + "0010000010110011011001110110001110111111001011110001110011001110101101011111000110100101010011111011010001111010111110111010111110111010011100000", + "1100001101010100110000010001010010011110110000010100110101010011010011011100001001101011000101011000110010111110110010100110110010100110011101100", + "1011110000010001011100000110001001110001111100000001001101110110110100110011011011001110101000110000010100101001110101001001110101001001001111011", + "0010111100011110011000001011010010111111010100001100110011111001001100100111000110010111110010101110011010101000000000111000000000111000101001010", + "0100110111111101101111101000111000010111111101000111000101111000001001101001110000010011100101011101111001001100001000110100001000110100101010110", + "0001101000100001011101010100111111101110111101111010011000111110101000110001111110000110101000101101001001010011011110110011011110110011110000001", + "0001100100101010000111110101010010110101100111011110110110101101110011101000001110010101110010001011010011110010101111101010101111101010010100000", + "0110001011010000101110010101100100010000000010111010000101001111110110010001110000100001000101011000110010011110110111100110110111100110011111100", + "1001010001101000000010101101010101100100010000101010101000010101110110000100011101111110001000100000001010100001100101100001100101100001000111011", + "1010111011100010000110100111100100101000000110100010000011100101100101101010111111011101110011101110000100001000000100010000000100010000101011010", + "0100010101111100110001101011100100011100010001101100100000011011011000011110110110100011000101011101111001000100011000100100011000100100100010110", + "1000101111000001000011010000001001100100011111010111111000100010010111011100011101001100101001110101000001110011011011100011011011100011110010001", + "0011000001001111011001011100001110100001010011110001110011001110111111111111000110000101010011101011001111111010111110000010111110000010011100000", + "1100111111001100110000111001010011111011001000010111110101111111000100111100010010101111100101000000100100111011111011011010110011011110111111100", + "1010100011110001011100101100001110001110110100000101111100100010111000110011000100011000101001110000001000101010001100110111110100110100100011011", + "0000101011100110011001100011010010101000111100001000100011101011001001100111011111111010110011101110000100101010101001010010000001010000101011010", + "0100100010100011101111100110111110001001101101000111001100100010000010001001101001101000100101001101100111001110001000001010001000001010100010110", + "0001111111111011011100111010111011111101001101111111011000111110101111110001101101001111101001110101011111010111111111001101011111001101111110001", + "0010110010101100000110111101010000110000111111011010000110100101101110101000011000111101110010101010001110010010000100010100101100010101001010000", + "0101011011001010101111111111100110000111101010111110011101011011111011010001101001100011000101011001001101111000011100010000110100011000100011100", + "1000100111010110000010001111010101111100000000101010110000100011101101000100000100111100101000110001110101000001011011000011100011001010010011011", + "1010001010101010000101110011100010111110100110100101111011001111010001001010110111010101010010110111110011001110111010110010000010110010011101010", + "0111000100001000110110011111100110011111101001111100000000010010111101011111001011101011000100010101111001000100110100100100011100110101111100110", + "1011111000111101000010010010001011110011000111010011111000110110110100111101100010101110101110100101000001110101110011100011011011100011001110001", + "0010110100000101011001001000001110111111111011110000111011111000010110111110111101000111110111110011001111111010000110000010111110000011001000000", + "1100111110001110110011000111010100010001100000000011010101111001000110011101100110100011100010000000100100111000001010011010110010011010101011100", + "1001100001101111011101110110001111101011100100001001111101111110110101110010100101100110101111101001010101001001011111011111110111011110010001011", + "0011101101101100011111001001010100110001011100011000001011101101001011100111011101010101110001101111111011001110101010111110000010111110010101010", + "0101000010100011101111101010111110010001101101000111111101001110000100101000001111010001000011001100011000101100110110110110001110110111111110110", + "0001011001100001011110101000111011100100011101111110100000010100001110010001101110001110001101110100101000010101100001110001011001110001000110001", + "0001110010110110000000101001010100101000111111001010110110100100001111101001111111011101110010110011001111110010000010000010101010000011001010000", + "0110011101011000101111111111100000011111101010111110110101011011011101010000001011000011000011011000101100011000011110001110110110001110100011100", + "1001100111001110000010000011010001100100000000101010000000100011001001100101100010011100101100100000010100100001011101011001100101011000010011011", + "1010001000111000000101110001100010100111010110110101100011001111110100101011010100010101010100101110010010001110111100101100000100101100011101010", + "0100000100000010110000011011100010000110001001100100010000010011011000011111001000001011000010000100111000100100110010110010011010110011111100110", + "1000111110110111000100010010001111101010000111000011010000110110010000111100000110001110101010110100100000010101110001100101011001100101001110001", + "0011110100010101011001011100001000100111011011110001001011111000110010011110111001100111110101111010101110011010000000000000111000000001001000000", + "1100111100001100110011000101010110001001110000010011001101111001100011111100000011100011100000011001000101111000001100011100110100011100101011100", + "1010100001101101011011110010001111110011100100010001101101111111010100110010100100000110101001101000010100101001011001011001110001011000010001011", + "0000111111101110011001001001010111111001011100001000000011111111101011100110111101111111110101101110011010101011111000111000000000111000111111010", + "0100100010100011101111101110111110001001101101000111101101100010100100001000001111101000100001001101111001001010001000110100001000110100100010110", + "0001101011100011011110101010111010101100001101101110111000101010101111110000001111011010101111110101001001010010101111110111011111110110101010001", + "0010100010110100000110101101010010001000111111010010100111100011101110101001111110111000110100110010001110010010001100000100101100000100100010000", + "0101111111011010101001111111100111111111101010101110111100111111111101010001101011101111100111011001001101111111111100001000110100001000111111100", + "1000110001001110000010000111010011110100000000101010010000110111101001000101100010101110101110100001110101000011110011011011100011011011101111011", + "1010111100111010000101110011100100111111000110100101111011011001010101001010110101000111110110101111110011001010000010101010000010101010001001010", + "0111110110000000110110011111100000010110001001111100000001011000111001011111001001101011100100000101111001000110101100110100011100110100001010110", + "1011101000110101000010010010001101101010000111010011011001111110110000111101100110101110101110110101000001110001111011100011011011100011010000001", + "0010100100010101011001011000001100110111011011110001011011101100010010111110111001010101110111111011001111111001001110000010111110000010110100000", + "1100001010001110110011000111010010010001100000000011010101100111000010011101100010110001000010011000100100111101010010011010110010011010110111100", + "1001010001101111011101110110001001100011100100001001111100111100110101110010100101100110001111101001010101001010100111011111110111011111110111001", + "0011111011101100011111001001010010101001011100011000001010101101001011100111011101010101110001101111111011001010000010111110000010111110000011001", + "0101010100100011101111101010111110011001101101000111111101011010000100101000001111000011000011001100011000101110011110110110001110110110011010101", + "0001101111100001011110101000111111100100011101111110100000000010001110010001101110011010101101110100101000010001011001110001011001110001001010010", + "0001000000110110000000101001010110100000111111001010110111111110001111101001111111011111010010110011001111110000011010000010101010000010100100000", + "0110001101011000101111111111100000000111101010111110110100010011011101010000001011000111000011011000101100011100010110001110110110001110100101100", + "1001110111001110000010000011010111101100000000101010000000100111001001100101100010001000101100100000010100100010010101011001100101011001111111011", + "1010111100111000000101110001100100100111010110110101100011010001110100101011010100000101110100101110010010001011100100101100000100101100001001010", + "0100110100000010110000011011100100001110001001100100010001010001011000011111001000001111100010000100111000100111001010110010011010110010001010100", + "1000101000110111000100010010001001110010000111000011010001110110010000111100000110001110101010110100100000010001011001100101011001100101010000010", + "0011100010010101011001011100001000101111011011110001001011101100110010011110111001110101110101111010101110011000101000000000111000000000110100011", + "1100001010001100110011000101010010001001110000010011001101101111100011111100000011110111000000011001000101111100110100011100110100011100100111111", + "1010010011101101011011110010001101111011100100010001101100100101010100110010100100000100001001101000010100101011000001011001110001011001111111011", + "0000111011101110011001001001010110110001011100001000000010100101101011100110111101110011110101101110011010101010100000111000000000111000010011010", + "0100010010100011101111101110111010000001101101000111101101001010100100001000001111100101000001001101111001001111111000110100001000110100010010110", + "0001111111100011011110101010111111111100001101101110111001111110101111110000001111011111101111110101001001010011111111110111011111110111111110001", + "0010100010110100000110101101010110001000111111010010100111100011101110101001111110111000110100110010001110010010001100000100101100000100100010010", + "0101101011011010101001111111100110101111101010101110111101101011111101010001101011101010100111011001001101111010101100001000110100001000101011111", + "1000100011001110000010000111010010001100000000101010010000100011101001000101100010111000101110100001110101000010001011011011100011011010100011000", + "1010111110111010000101110011100011111111000110100101111011111111010101001010110101011111110110101111110011001011111010101010000010101010111111001", + "0111000010000000110110011111100100010110001001111100000001100110111001011111001001100011000100000101111001000001010100110100011100110100111110110", + "1011011000110101000010010010001111100010000111010011011001111100110000111101100110100010001110110101000001110000100011100011011011100010000111001", + "0010110010010101011001011000001100101111011011110001011011101100010010111110111001010101110111111011001111111110000110000010111110000010001010000", + "1100011100001110110011000111010110011001100000000011010101011011000010011101100010110011000010011000100100111100011010011010110010011011100010100", + "1001100111101111011101110110001011100011100100001001111100000010110101110010100101101010101111101001010101001101011111011111110111011111001010101", + "0011001001101100011111001001010100100001011100011000001010111111001011100111011101011111010001101111111011001010011010111110000010111111000100101", + "0101000100100011101111101010111000000001101101000111111101010010000100101000001111000101000011001100011000101000010110110110001110110110100101001", + "0001111111100001011110101000111001101100011101111110100000100110001110010001101110011000101101110100101000010000010001110001011001110000011111010", + "0001110100110110000000101001010010100000111111001010110110010000001111101001111111010101110010110011001111110111100010000010101010000010001000000", + "0111111111011000101111111111100010001111101010111110110101110001011101010000001011001111100011011000101100011101001110001110110110001111101011100", + "1011100101001110000010000011010111110100000000101010000001110111001001100101100010001110101100100000010100100101011101011001100101011001010001011", + "1001101010111000000101110001100000101111010110110101100010101101110100101011010100000101110100101110010010001010101100101100000100101101010101010", + "0100000010000010110000011011100110001110001001100100010000001111011000011111001000000111010010000100111000100000110010110010011010110010100111000", + "1010011010110111010100010010011111100010000111000011010000000100010000111010000110000100001010110100100000010001000001100101011001100100011111110", + "0000110000010101010001011100001110110111011011010001001010000100110010011010111001110011000101111010101110011110100000000000111000000000010011111", + "1101011110001100101011000101001100010001110001110011001101001011100011111010000011110100000000011001000101111011111100011100110100011101110010111", + "1011100001101101001011110010000001111011100101110001101100101011010100110000100100001110001001101110010100101010111001011001110001011001010011011", + "0001001101101010010001001001010100111001000100101000000011000111101010000100111100111000110101101000011010101101111000111000010000111001011101010", + "0110000110100011110111101010111010010001110101100111100101011010100100101000001111000011100001001011111001001100110000110100011000110100111100110", + "0000111011100001000110101110101011111100000100101110100000110110101110010000001110011111011111110001001001010001110111110111001111110110001110001", + "0000110010110000000110101011000000111000100111110010101110111001101111101101111111110000011100110100001110000110000110000100010110000100010001110", + "0111111111011100111001111111100011111111110011101110110100111111111100110011101010001111110111011111001101100111111100001000001010001001111110011", + "1011100011001110000010000111101110001100011000001010001000100011101001000001100010111000100110100111110101011010001011011010001011011011100010100", + "1011101010111011100011110100110110101111011111100101111100101011010101000000010101011010100110101011110011010010101010101111101010101110101010001", + "0110100010000111111010011100101110001110010011101100011010100010111001001100101001001000100000000010111000100010001110110011011110110010100010110", + "1010111110110001101100010011000011111010011101101011011100111110110001001111100111111111101000110010100000010111111001100101011001100100111110001", + "0000000100010101100111011100001010111111000111001001010101111111010010001110011001110110010011111100101110011100011000000000111000000000000100000", + "1101001110001101101111000011100110010001101011000011001010010010000011111100000011100101110100011101000101111000010100011000100100011000000101100", + "1011110011101011111111110001011111111011111110110001110000100111010100101111000100111001100011101111010101011010010011011111001011011111011110101", + "0001111011101011001111001001110110111001000111011000000111110000001010000100111100111101000101101001111011010011100010111110111010111110101000101", + "0110110010100010101001101010000000001001110111101111100111010001000100111100001111000110001011001010011000110101001110110111100110110110101011001", + "0000101011100000111010101111101111111100000100101110100111010110101110001011101110001110011011110000101000001011011001110100110001110101110101010", + "0000100000110001001100101010011100100000100101001010101100101100001111111010011111100100010000110100001110010010101000000101101000000100010010000", + "0111001101011100000001111110101100001111110000001110110001101110111100100010001010001110100011011111001101111010110100001000110100001000000001100", + "1011010111001110111100000111010011100100011100000010001110100100101001010101100010101101001110100111110101000111000011011011100011011011011001011", + "1011111000111011011001110101010010100111011101110101111100100101110101001010110101010011000000101011110011001110100010101110010010101110110011010", + "0110010110000110010010011100110110010110010011011100011101001110111001000010101001000100001110000010111000110111111110110010100110110010110011000", + "1010101000110000010100010010101101100010011100000011011100101001010001011111100111100110011110110010100000001000111001100101100001100101110011110", + "0000000100010100011111011100110110111111000001011001010001100001110010001010111001110000111101111100101110000011111000000001010000000000011101111", + "1101001110001101010111000010000000010001101001000011001010111001000011100110000011111011110110011101000101100110110100011001011100011000111000111", + "1011110011101010010111110001000101111011111110010001110111110001010100100001000100110111001011101111010101001001110011011110110011011111101001011", + "0001111011101010110111001000011110111001000110111000000111011000001010010100111100100000010101101001111011001100000010111110000010111111010111010", + "0110110010100011010001101010111000001001110001101111100011001001000100111000001111011000100011001010011000101010101110110110001110110111010100110", + "1000101011100000000010101110001101111100000110101110100111111010101110010001101110011000011011110000101000010101101001110101001001110100101000001", + "0000100000110000100100101010000110100000100101101010101011111000001111110100011111110010111000110100001110000001010000000100010000000100000101110", + "1010001101011101111001111111000000001111110001101110110001000010111100110010001010001011110011011111001101100101001100001000001100001000011110011", + "0110000111001111000100000111101101100100011010000010001010111110101001010001100010101011100110100111110101011000101011011010001011011011000110100", + "1011011000111011100001110100110111111111011111110101111100111111110101010000110101001111100000101011110011010111111010101111101010101110111110001", + "0000000010000111111010011100101110001110010011111100011010100010111001001100101001011000100110000010111000100110001110110011011110110010100010110", + "1111111010110001101100010011000110101010011101100011011100101011010001001111100111111010101110110010100000010010101001100101011001100101101010001", + "1000001000010101100111011100001010001111000111011001010100100011110010001110111001101000110101111100101110011010001000000000111000000001100010000", + "1011101000001101101111000011100011111001101011000011001010111111000011111100000011111111110110011101000101111011111100011000100100011001111111100", + "1011101011101011111111110001011011111011111110110001110000110101010100101111000100100110000011101111010101011111010011011111001011011111110100101", + "1011101011101011001111001001110000100001000111011000000111101010001010000100111100101100000101101001111011010000101010111110111010111111110010110", + "1000001000100010101001101010000110001001110111101111100111101111000100111100001111000110101011001010011000110010110110110111100110110111100001000", + "1111111001100000111010101111101011100100000100101110100110100100101110001011101110001101011011110000101000001001000001110100110001110101011001011" + ], + "3": [ + "1111111001000110110010101101111100011010001101000010101001110001101111000111111100101000110101011110010100101001110110110110010111001010101111111", + "1000001011101101110011101101110110100011110001000010011000010001111010001011101001111100111011010000011010101100000011010110100010101001001000001", + "1011101010101011011100010011111010101011100100111100110001100100000111111000110111100111011000110011111001001010101110001111101110101111101011101", + "1011101000011111110110111111000010000000111110010111011101100011010011001001011101101111001000001001001001010101101001001000101001101000101011101", + "1011101001000101101101001000111011111100011101100001000111111110110010010010000000011111110010010010010010010111111010010011010010010100001011101", + "1000001000000011100011101000111010001001000001000101110000100010101001010101101010111000110011111001010011111110001110001110001110001100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001101100010011101100000110001100011001000010111000100010110011110100011100101000110000011010110000011010001110000011010110000010100000000", + "0111011000000011001010111110110011111000010010000010100100111110111000000111010000101111110011111001010011111111111011011011011010011011100000110", + "1010110011000110110010101101111001111010001111000011001001000001101101000111111010110000110101011110010100101000001110110110010111010110101110111", + "0100111111101101110011101100010110110011110111000011111001100001111110001011101101101100111011010000011010101001111011010110100010110111101000110", + "0011000010101011111100010010111001101011100110111100110000000010000011111000110011100111011000110011111001001101000110001111101110101110101011010", + "1110011000011111010110111111000100011000111110010110011101000011010111001001011101100111001000001001001001010111010001001000101001101001110001001", + "1111100101000100101101001000111101000100011101100000000111001010110100010010000000010011110010010010010010010100101010010011010010010010010100010", + "1001001100000010000011101000111110010001000001000101010000000110101111010101101010100010010011111001010011111000110110001110001110001110111111111", + "0000100000110110001000110111011011001111000010011001000011101001101100101111000111100010101011000001101011000011000101011000001101011001100111000", + "1110001010110101111100001000000101010110100100110100010010011000001110110001100110000101000101001111100101001010110101101101101100101101001011001", + "0111010010101011011111000000010100001111100010101110100100101100000000101010010111011100111000110011111001000101100011011011111010111011000011010", + "1111101010110110101000110111001101100000101100011000100011111010100101010000110110110110000000001011000001110010100000001101111001101100110011101", + "0101110000011101001010100100001111010101010000001010000110110100110101001110000101010000001110000101001111111011110000111001011000011000011101100", + "0011111101110010111011010010101001100101010011111011110000001110111010100100110000001010100101100100100100111010111100100101000100000100011100100", + "0100110100011111110110010011100110000111000110111011011100010001101111001001011011001000101001001001001001001111110001001000001001001001001111001", + "1111111110110100110101011110001000111111110111110011100111010000011001100011011100010100100101001111100101001110000000111000111000111000001001001", + "1101000101011011100101011010110110100010101111110100101111000100000001000010101010001111000110101100000110101110101000110101100000110100001010101", + "0101011001101110100111010011011110001101111111101111001000100011010101101010111101011110011110010100111110010001101110110110110111110110010000010", + "0000100100011101101001110110100010111001010100011000010011011010110110011100100001101010001110000101001111110011010101101101001100001101110101100", + "0010001111011011000101011010100000001101000001110101001111110111001000111101011011011011101101100110101100011111001101100000010100000001011110000", + "1101100011000110010001111111010100001110001011010001011100101111101110010101011110001011010101011110010100100000101011100010000011000011000110111", + "0110001011000100001101100100011111010011100101001101000111111000001100010010000110111100010011010010010010001100001010010011110010110010101100010", + "1000010001110010011011111110001011101010101011010110110001111100000010100000110110100101000100100100100100100010011100100101100100100100100000100", + "0111101101101111101111000101010011100000101100101000111100001011000010111100000111001111111110010100111110010101011011100011100011100011001110010", + "1010110011101101010011101100000000010110011001000010011001110010110111110010011100111001110000011010110000011000011110000011010110000010100110011", + "1000111110000011001011011110110011111100010010000010100101111110111000000011010000111111110011111001010011111111111011011011011010011011111111111", + "1001100011000110110011001101111110001010001111000011001000100011101101000001111010101000110101011110010100101010001110110110010111010111100010111", + "0100101011101101110010101100010010101011110111000101111000101011111110001001101101101010111011010000011010101010101011010110100010110111101010110", + "0000100010101011111100110010111110001111100110111110110001100010010011111110110011111000111000110011111001001110001110001111101110101111100011010", + "1101111110011101010111011111000111111100111110010000011101111111001111001101011101111111101000001001001001010111111000001000101001101000111111001", + "1110000011000100101100001000111001010010011101100010000111111000111100010000000000000101010010010011001010010010110001110011010010010011010110010", + "1010011010000000000010101000111110001101000001000111010001001100101111010111101010100100110011111000101011111001100101101111101110001110110101111", + "0001100010110110001011010111111011100011000010011111000011111011111100101011000111111110001011000000010011000110100011111001101101011000010101000", + "1110111000110011111100001000100111010110100110110010010010110100010110111111100100010000000101001110010101001001110011001100001101101100011011001", + "0100110100101101011000100001110001100101100000101000100111001110001000111110010011010010111001010011111001010010111111011010011011011010111101010", + "1111111100110110101111010111001110000000101010011110100000110000100101011010110100101000100001101011000001101001110000001101011000001100101111101", + "0110110110011101001000000100101110111001010000001000000010110000100101010000000001000010101111100101001111100010000000111000111000111000110001100", + "0000001101110000111010110010001110100001010111111101110100000100100010111000110000000001000100100100100100100000101101100100100100100101010010100", + "0101010000011111110101010010100010001001000110111001011010100011100111010011011011011000001001001000010001001001101010101001001001001000001101001", + "1100101100110110110100011110001000111011110011110001100011111010011001100001011110010110000101001110011101001111010011011000111000111000000011001", + "1100000111011011100110111011110110001110101111110010101100010110010001000110101010010011100110101101111110101011001110010101100000110101111000101", + "0101011011101000100111010011111100001101111101101001001001101111001101110100111111001011011110010101001110010010101000010110110110110111000000010", + "0010110010011011101110010111000111010011010110011110010001111000111110001000100011100100001111100101001111100100001001101101101101101101001011100", + "0010001001011011000010111011000011101101000101110011001101011101001000110111011111000101001100000110101100000100011101100000110101100000100010000", + "1101100101000110010011011111110101100010001001010011011001101011111110001011011000011001110100111110010100111001011011100011100011100010001010111", + "0110101011000110001100000100111000010111100001001011000010110010010100001110000010110111110010010010010010010110011011010010010010010010000100010", + "1000010101110010011000111111001111100100101011010100110111001110001010111110110110110101100100100101111100100100000111000100100100100101100000100", + "0111101111101101101111000101010011100000101000101010111000100001000010111010000101001101011110010101000110010100001000000011100011100011011001010", + "1010100001101101010000001101000000111000011001000100011010100000100111110000011100100101010000011011001000011101111000100011010110000011001110011", + "1000111110000101001010111110010001111000010000000100100100000010100000011001010010100110110011111000100011111111000101111011011011011010101100111", + "1001100001000000110101001100011100000000001101000101001010100011100101010011111000111111010100111110010100111111010010110110110110110110010001011", + "0100111111101101110100001101110111111011110011000101111011111111111110000001101001111111111010110000011010110011111011010110000011010110111111010", + "0000100010101011111110110010011010001111100100111110110101100010010011100110110101101000111001010011111001010110001110001110001110001110100010110", + "1101101010011101010111011111100110101100111010010000011000101011001111010101011001111010101001001001001001001010101000001001001001001000101010001", + "1111100011000100101110001001111010001010011101100010000000100010111100001000000000011000110010010011001010010010001001110010010010010010100010010", + "1010111110000000000010101000111111111101000101000111010100111110101111010111101000101111110011111000101011111111111101101110001110001110111111111", + "0010100100110110001011010110011100001011000010011111000001110001111100101011000111100000101011000000010011000011110011111000001101011001101111000", + "1101111110110011111100001000100110100110100110110010010011110000010110101111100100010010100101001110010101001010000011001101101101101100010001001", + "0110010100101101011000100001110000111101100000101000100110100100001000111110010101001001011001010011111001010110101111011011011011011010010010110", + "1111111001110110101111010110111110010000101001011110100001000010100101011010110010101000000001101011000001101001101000001101011000001101001100001", + "0100110100111101001000000100111000101001010011001000000011011010100101010000000011011110001111100101001111100001010000111000111000111000100010000", + "0001011110010000111010110010011110000001010111111101110100010110100010111000110100000011100100100100100100100101001101100100110100100100111001100", + "0110010010011111110101010010101110001001000110011001011010101111100111010011011011000011001001001000010001001010101010101001010001001001100001001", + "1100111011110110110101011110010011011011110010110001100010111000011001100111011110010100000101001110011101001010001011011000110000111000001011001", + "1111000000011011100110111011101001101010101110010010101100011100010001000000101010001101000110101101111110101110011110010101111000110100000010101", + "0110101101001000100110010011110101110111111100001001001000101011001101110100111111001001111110010101001110010001011000010110101110110111001010010", + "0000100010011011101110010111001110001101010111011110010000010010111110001100100011111111110011100101001111100000011001101101110111101100100100000", + "0010011101011011000011011011000011111011000100010011001100101111001000110101011111000101110010000110101100000100000101100000101111100000100001100", + "1111100111101110010011111111100011110010001001110011011000000001111110001011011000000101001010111110010100111010001011100011101101100011111001011", + "0111101000000110001100100100101000110001100001001011000100100000110100001100000010110101000100010010010010010011111010010010011100010010001111010", + "1011110110100010011101011111011011100100101011111100110011000010001010100110110110101110100100100100100100100111000100100100100000100100001100100", + "0111101000100101101000100101001000000000101001110010111111100011100010111100000101001111011110010100111110010001010011100011100011100011010000010", + "1001110110110101010000001101011111011100011000110100011000101110100111111110011100111011110000011010110000011000101110000011010110000010110100011", + "1011001000110101001101111110011000011010010001111100100101000101000000001001010010100100010011111001010011111100110011011011001011011010100111111", + "1011110001001000110101001100010101010110001100010101001011001101100101011111111000100100101000111110010100111011000110110110101100110111111111011", + "0100101011111101110011101101110101001101110010101101111110011100111110000011101001110011000100110000011010110010110011010110011001010110010111010", + "0010000010000011111010010010001110011111100100000110110001101000010011110110110101100000100111010011111001010111100110001110000000001110010100110", + "1100111111011101010111111111110111111010111010010000011110111110101111000111011001101111111111001001001001001011111001001001000111001001111110001", + "1101100010010100101001101001101010001010011101001010000110100010111100001000000000001000110010010010010010010010001010010010010110010010100010010", + "1010101011001000000111001000100110101101000100011111010011101010001111001001101000111010110011111001010011111010101110001110001110001110101011111", + "0010100011101110001111010110000010001111000011101111000000100011111100101101000111101000101011000001101011000010001101011000001101011000100011000", + "1101111110000011111011001000101111111100100111001010010011111111110110101111100100001111100101001111100101001011111101101101111101101100111111001", + "0110010110100101011000100001111000000011100001111000100111110100001000110010010101011011100101010011111001010001001011011011000001011010111000110", + "1111011010100110101000110110101110001110101001110110100100001111100101011000110010111011011111101011000001101000101000001101000010001101100000001", + "0100110010110101001100100100111011011001010010110000000110111010100101000000000011010100010001100101001111100110001000111000110110111001001010000", + "0001001000110000111010010010011111101111010111111101110010111001000010101010110100010101010010100100100100100100011100100100101010100101000011100", + "0110100101001111110010110010110101110001000110010001011101001001100111010011011011001001101001001001001001001101011001001001001101001001001011001", + "1100101011111110110001111110010100001011110010101001100101110100111001111111011110010111100101001111100101001010011000111000111000111000000101001", + "1111010100000011100010111011101101111010101110000010101101101100010001000000101010011101100110101100000110101000000000110101100000110101000000101", + "0110101111011000100000010011110011110111111100010001001000100100101101110100111111000101011110010100111110010000001110110110100110110111111000010", + "0000100000010011101110010111001110110101010111001110010001000010111110000100100011101101010011100101001111100111111101101101110111101101101111100", + "0010111111001011000101011011000011100011000100011011001001100010001000110101011111010110110010000110101100000101000101100000101111100001101100000", + "1111100001101110010111111111100000000010001001101011011101100001111110011011011000001111001010111110010100111101010011100011101101100011010000111", + "0111111110000110001100100100101001011001100001001011000100001111110100011100000010100011100100010010010010010010101010010010011100010011010100010", + "1011000000100010011111011111011000011100101011111100110000100100001011111110110110100100000100100100100100100000110100100100100000100100100110100", + "0111111000100101111010100101001111010000101001110010111110101111100011100100000101001100111110010100111110010001000011100011100011100011011110010", + "1001100010110101011100001101011011001100011000110100011011011010100110010110011100101011010000011010110000011110110110000011010110000011110110011", + "1011001010110101000101111110011110011010010001111100101101001001000001111001010010101000110011111001010011111101100011011011001011011010010101111", + "1011110011001000111101001100010101101110001100010101010010011001100100011111111000110110001000111110010100111100100110110110101100110000110100101", + "0100001000111101101011101101100101010101110010101101111111010100111111100011101001100000000100110000011010110011010011010110011001010011011010101", + "0010000100000011110010010010000101101111100100100110100000001100010011110110110101100010100111010011111001010000011110001110000000001010111101001", + "1100101100111101011111111111110010000010111010110000001111010100101111100111011001111000111111001001001001001110010001001001000111001100001111010", + "1101110110010100100001101001111110101010011100101010000110010010111101001000000000010010110010010100010110010001100010011010010110010100010000010", + "1010111110101000010111001000101011111101000100111111001011111110001111001001101000101111110011111111010101111011111110000110001010001000111111111", + "0010100010000110011111011110010110001111000011001111001000100011111100001101000111101000101011000111101101000110001101000000001001011011100011000", + "1101101011010011100011001000100010101100000111000010010010101011110110101111100100001010100101001011100011001010101101110101101101101111101011001", + "0110100010100101010000110001101110001011000001110000110111100011101001110011110101011000111001010011111001010110001011001011011011011011100011000", + "1111111111110110111000100110111011111111101001101110100100111111000100111001110010101111100001101011000001101011111000001101011000001101111111110", + "0100100010110101000100100100110100001001010010011000010110110101000101000000000011001111101111100101001111100011011000111000111000111001100101111", + "0001011101011000110010011010011111111110110111000101100010001100000010001010010100011101100100100100100100100110000100100100100100100001000000111", + "0110100111011111111010111010100101110000100111101001011100100101000110010010011011001101001001001111001101001000001001000001001001001111011001001", + "1100101000001110100001111110011010110010110010011001111100000011011001111110111110011101000101001001100011001101111000110000111000111110101111001", + "1111110111111011110010110011111011100011101110111010100100100010010001100000101010000110100110101010000000101011100000101101100000110110101100101", + "0110101000001000111000010011111010000111011100011001001000000001101101110101111111001111011110010000111000010101110110101110110110110101010000010", + "0000110110010011100110000111011111011101110111010110000000101110011111000101000011111011101111100101001111100001001101111101101101101100110101110", + "0010001000011011010101001011010100011010000100011011001001000101101001010100011111010100001100000110101100000101010101100000110101100001100110011", + "1111110001111110011111111111101101010010001001000011001101101111111110011011011000010100110100111110010100111000000011100011100011100010111110100", + "0111101011101110000100101100101101001000000001110011010100111010110100111100100010101011010010010010010010010000110010010010010010010111110110001", + "1011000010110010010111010111001000011101001010000100110001001000101011111111110110100000100100100010100000100101100100101100100100100010110100100", + "0111111011010101111010100101000001101001101001000010100111011000000010100101100101000110011110010010111000010110100011101011100011100101110100010", + "1001000001001101000100000101001011010101011000001100010010010100100111010110011100110000010000011100110110011101010110011011010110000000011010011", + "1011001101100101010101111110010011101010110001110100100101101100000000011000010010100010110011111101010101111000011011000011011011011000111101111", + "1011100101001000111101011100000010000110101100001101011011110101000100011110011000100000110100111110010100111010010110100110110110110111101110101", + "0100111110101101100011111101100000101100110010101101111111110001011111100010101001100010111010110000011010110011100011010110000011010111010000101", + "0010010100010011110010010010000100111111100100101110100000000110010011110110110101111001011001010011111001010101101110001110001110001111010011001", + "1100111000110101011111110111110100010011011010101000001111100001101111100111111001110000001001001001001001001011111001001001001001001100101101010", + "0001110100000100100001100001111100101011111100110010000111111010011101001001000000010110010010010100010110010011001010011010010010010100000010010", + "1010001110111000010111001000101100000100000100101111001010110011101111001000001000101011110011111111010101111011010110000110001110001000011001111", + "0110000010010110011111011110010000001110000011010111001001001011111100001101000111101011001011000111101101000110000101000000001101011011000001000", + "1011011011010011100011001000100111111100000111000010010010111110110110101110100100011111100101001011100011001011111101110101101101101110111111001", + "0000000010100101010000110001101010001011000001100000110111100010101001110011100101001000111001010011111001010010001011001011011011011010100011000", + "1111111001110110111000100110111010101111110001110110100100101010000100111001110010101010100001101011000001101110101000001101011000001101101011110", + "1000001010100101000100100100110110001001010010011000010110100010100101000000011011001000101111100101001111100010001000111000111000111001100011111", + "1011101001011000110010011000011111111110100111000101100011111110000010001010001100011111100100100100100100100111111100100100100100100001111110111", + "1011101011011111111010111110100100000000111111101001011100100001000110010010000011000111001001001111001101001001111001000001001001001111110001001", + "1011101010001110100001111100011001011010100010011001110101001111011001111110110110001011100101001001100011001111001000110000111000111111110101010", + "1000001011111011111010110111111110011011101110111010111101100110010001100000101010010100000110101010000000101101010000101101100000110111100110100", + "1111111000001000110000010101111101010111010100011001001001101011101100010101111111001100111110010000111000010100000110101000110110110101011110011" + ] + }, + "33": { + "0": [ + "11111110101100110110010001101100010110101111010001001110010000011010110000110000011011010011010110000011010010010000010000010010010010010100001111111", + "10000010110010101111100001100010010000011101011001111110111100110101100000101100000110110000110101100000110011111100001100001110001110001001101000001", + "10111010000100001101111001011010111100100111010001110010110001110010100111101011000000001000001101011000001011000011001011011000001101011111001011101", + "10111010111001001011011011101011100011111111000000010001000000001011110100011010110000000110000011010110000101001010011010101101101101101111001011101", + "10111010001110001000100111011111100000011001111010100000111111000010111100000110101111111011100000110101111001011111100110111011011011011110001011101", + "10000010011011101010001100011000101101110000110000100110100010100111110011000001101010001011011000001101000001101000100001101101011000001100101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000111000000000010100101000100001001010111111010100100011100000110100000110101110001011100000110101111001001000100110101110001110001110100000000", + "10110111010111010000000000101111101000100100011000111000111111101011000011000001101111111001011000001101001001001111100001101001001001001001101001011", + "01111001101100111110010001100100011110101111001011001110111110011010110010110000011011010011010110000010010010000000110000010010010010010010010100010", + "01101010010010100111100001110010010000011101011011111111100010110101100110101100000110110000110101100001010011100101101100001110001110001110100110111", + "01010101100100001101111001011010101100100111010001110011001111110010100001101011000000001000001101011001101011001010101011011000001101011001111111000", + "00100111011001001011011011111011110011111111000000010000011010001011110000011010110000000110000011010111100101001011111010101101101101101101010110001", + "11001101001110001000100111000010111000011001111010100001000111000010111101000110101101100011100000110101100001001110100110111011011011011011010100110", + "00001011111011101010001100011111101101110000110001000110010000100111110010100001101011011011011000001101011001110001100001101101011000001100110100001", + "10000100101110110100100010011001110111111100001000100010101011010110000011010000011011010101010110000011010111100000010000011000111000111000011010000", + "10011011111010111011101101010101000101001000110101110100010110000110101110001100000110110100110101100000110100100100101100000100100100100100011101100", + "10110100110111100111001010100111000101110100110000010101100101000001101001001011000000001000001101011001001001011011101001001001001001001001001111001", + "11011110100100010001010111010100100110101011001101101001010100000011010000011010110010000110000011010111100101010011011000111000111000111000010001001", + "00101000001001100110010100101111000001001010111100111110100010011111001100000110101111100101100000110100000110100111000000110101100000110100010010101", + "11101110000000010100000000101000101000100101011010001011000001010000101011000001101101011101011000001100111110010000100111110010110110110110001100010", + "01101001111100111000010001100100001110101111101101010111110001110100001011110000011101010101001110000011010111111000010100001011101101101101100010000", + "01110110010100000101100001110010000001111100011101001011111101001010011111001100000011010110101101100000110100011100001100000110110101100001011001100", + "01111101110101101111111001000100101100100110110011011001110000001101011000001011000001101110010101011000001100111011001011000001100011100011000001011", + "00001111001010001101011011100001110011011110100011000010100000110000111000111010110001100010010011010110000010010010011010110000010010010010101011010", + "11101001011010001010100101001100101001111000111101111000001000101100100100100110101100100101100000100100100100110110000100100100100100100100100010100", + "00000111111001001010001100001111111101010001010110110010001111011001101011000001101001011101011000010100111110001000000011100011100011100011001010010", + "10011100111111010000100010011111110110011101001010001000010100101000011010110000011001010011010110011010110000010001110110000011010110000010100100011", + "10101111101101111001101001001111100100001000110111100110111110111100000110101100000011111000110101111001010011111111101010011111011011011011111111111", + "10111000100111100011001100101000110100110100110110001101100010101111010000101111000010001110010101011000001101011000101111010000110110110111100011011", + "11001010100010110011010011001010110111001010101011111001101011111100101001111100110110101000011011010110000011011010111010110000000011010111101011010", + "00011000111000000010000110101000100001001011011110110101100011100000110101100000101010001011111000110101100000111000100110101100001110001111100010110", + "11011111110001010110000110111111101000001101111000011000111111101011100011100011001111111001001000001101011000011111100001101011001001001000111110001", + "01010101001100111100001011110001111111010110001011001000011010011010010010010010111110000011010110010010010010001011110010010010010010010010010110010", + "01101111010100100111111001111110110000101100111011011001100110110100000110101101100101100000110101111001010011100110101110001110001110001111010101111", + "01001001100100001011100101001001101101001110010001010000010001110011000001101010100100111000001101000001101011000001101101011000001101011001110101000", + "00010110111011001111000111100111110010100110000001010101101000001010110000011011110010110110000011001111100101010000011100101001110101101101111011001", + "11011001101010001110111001000111011001011001011011100000110101000010111101000010101101010011111001010101100000100100100010111101000011010010111100110", + "00010110111001101000000000011001001100010001110000100101000010100111110010100111101111001011000001101101011000000011100001101011000000000100101110001", + "10101100101110110100110000011100110111101111101000000010110011010110000011010110011000000101001111100011010110000011010000011010110000100000110000000", + "10111010011100111010001011001001000101100010010101110011000110001110001110001110100011100100100100100000110101111111001100000110101100111101011011100", + "10001100010111100110010000101010100100011111010000010101000001001001001001001001100101011000001001001001001001010000101001001001001001011001011101001", + "11011011100010010001001111001000000110001100001101101111010000011010110000011011010011010110000101001111100101010000011000111000111000111001111011001", + "00100100001001100110101000100100000000111111111100111101111100000110101100000111001001010101100110101100000110101100000000110101100000110100000000101", + "11001111100000010101011100111101101001111111011010001110110011000001101011000000101001101101011110010100111110001011010111110010100110110110111000010", + "01101101011100111000101111110000001111101101101101010110000011110100001011110100001011100101001111100011010110010010001100001011110101100100010010000", + "01111011010100000100001100110100000001111100011101001000101111001010011111001010011010100110101100000000110101101110010100000110101101101001010011100", + "01110101110101101110101010000111101100110100110011011001101000001101011000001101011011011110010100111000001101011000000011000001101011111011101011011", + "00001110101010001100011101011110110101010100100011000101110000111000111000110000011101010010010010010110000011001001110010110000011011001011100101010", + "11100001111010001011111100100111101011110010111101111000101101100100100100101100000000110101100100100100100100111101000100100100100101010100100000100", + "00000010111001001011110100010010011011010111010110110100001010100001101011011000001000001101011110010100111110001011000011100011100011000010111000010", + "10010000111111010000011111010010110100001001001010001011001011010000011010101001111111100011010000011010110000011010110110000011010111100010110110011", + "10100010001101111000110000010000000100010010110111100011011110001100000110111101000100000000110011111001010011100110111010011111001010111011010101111", + "00110100000111100011110101101010110000110110110110001101011000001111010000101111010000101110010100111110001101001001010111010000101101011111001001011", + "00001111100010110010111010100011110111001010100011111110011001111100101001111100101100001000011010110000000011011000100010110000011000111111100101010", + "11011000011000001011000111101010100111011001010110110100000101100000110101100000110110101011111001010011100000110101101110101100000000110110000110110", + "01011111110001001111000110001111101100001111111000011110111111100011100011101011000111111001001001001001011000011111101001101011000111110000111110001", + "10011000101100111101001010001000111011000100010011001111100011010010010010011010110110001010010010010010010010001000110010010010010110000011100010010", + "10101010110100111110011001101010110100111010100011011000101011001100000110110101100010101001010011111001010011111010101110001110001110001110101011111", + "10001000100100011011000100001000101011010010010001010001100010001011000001110010100010001001101011000001101011011000101101011000001101011001100011000", + "01011111111011001110000110101111110010100100011001010101111110111010110000001011110011111111100101001111100101011111101101101001111100101101111111001", + "01011000001010001110011000010000011101011011000011100000000111100010111101000010111111111011111001010011100000100111011011011101000000110011110010110", + "11011110011001110001100001100010001100010001111000100101100000100111110010100111110001011011000001101011011000011000111000001011000011100100101100001", + "01101001101110110101110001010001010001101111100000000011010001010110000011010110000011010101001111100101010110010000011000111010110110000001000010000", + "00110110011100100010101011101100000001100010010101110010111100001110001100000110101111010100100100100100110101100100000100100110101010011100000001100", + "01001101110111110110010001001101100000011111001000010100010010001101001011000001101101101001001001001001001001010011001001001001001101011000011001001", + "00011111010010011000101111000001100010001100010101101110100011111100110110000011010101110111100101001111100101011010011000111000111000111001110011001", + "11101001010001100110101001110101000110111111111100111101101111100000101010011111001010111100000110101100000110111110000000110101100000110011110010101", + "10000111100000010101011101100111001001111111000010001111001001100011101111010000101001000100111110010100111110001000010110110010100111110001101010010", + "11101100001100111000101110100110101011101101110101010111010001010110001011110100001001001101001111100101001110001001101101101011010110000011000101100", + "10110011011100011100001100001111100001111100010101001000001101001010011111001010011100110110101100000110101101101101010101100110001110001111000000000", + "10110001101101101110101010001010001010110100111010011000001010001101011000001101011000001110010100111110010101010111000011100000001101011000011000111", + "10000010111010010100011101011010110111010100100010110100001010111000111010110000011001100010010010010010010011010100110010010001111100101000110110010", + "00100000011000011011111100100000001101110010100100001001111111100000100110101100000000000100100100100100100100111000100100100101100000110101110100100", + "11000110111101000011110100011010111001010111001111011101111000100111101101011000001110101100111110010100111110000011000011100011100011100010101000010", + "01011101010111010000011111000011110000001001001010000011011001010110011100101001111100001010110000011010110000001010110110000011010110000011000100011", + "11101011101111111000110000001010100100010010101110100010100100001110000010111101000100101001010011111001010011100101111011011011001010011110000111111", + "00110100110001100011110101111101110000110110101110100100001010001101010000101111010010010110010100111110010001010010110110110110001101011000011110111", + "00000111100010101010111010111001010111001010100011100110111011111100101001111100101010000000011010110000011101011011100011010110111000111001110010110", + "11011101100000000011000111100111100111011001010111110101100111100000110101100000110101100011111001010011111110111010101110001111100000110101110011010", + "01011011100011001111000110000001101100001111111001101111010001100011000001101011000010111001001001001001001110001111101001001000100111110011101011001", + "10010100101110101101001010010110111011000100010010111111001001010110100000011010110110110010010010010010010010001110010010010011010110000011000100010", + "10101011010001101110011001110111010100111010100010110000010101001011111000110101100011000001010011111001010011101110101110001110001110001111000101111", + "10000100001101001011000100011000101011010010010001011000000010001100111111110010100111010001101011000001101011010001101101011000001101011000011111000", + "01011111111000001110000110111111110010100100011000010100111110111001111100001011110011111111100101001111100101011111101101101101111100101000111111001", + "01011000111101001110011000011000111101011011000011001000100011100000110101000010111110001011111001010011111101001000111011010011100000110101100011010", + "11011010111000010001100001111010101100010001111000111110101010100111110010100111110010101011000001101011000111111010111000000101100011100010101011101", + "01101000110110010101110001011000110001101111100001000000100011010110000011010110000110001101001111100101001001101000111000100001010110000010100011100", + "00111111101110100010101011101111100001100010010000000110111110001110101100000110101111111100100100100100100010101111100100111101001010011111111110100", + "01000100010101010110010001011111000000011111001001100010101000001101111011000001101001000111001001001001001001010000001001011000001101011000101011001", + "00011111100111011000101111010110111010001100010010000100010001111101001110000011010011001001100101001111100101000001111000111000111000101000100101001", + "11100001000000100110101001110111101110111111111110110100001101100001010010011111001010110010000110101100000110101101000000110101100000100101100100101", + "10000010000011010101011101100010010001111111000101001101001011100010100111010000101010001000111110010100111110011111010110110110110111110011011110010", + "11100000101010011000101110111010110011101101110011111001101011010110000011110100001101100101001111100100001011101100101101100101001110001010110001110", + "10110010010101111100001100000000001001111100010101010010111111001010011111001010011000000110101100000111001010010000110101101000010110000111110010011", + "10110100101101001110101010010010100010110100111010011011111000001101011000001101011000101110010100111111110010100011000011111010000101000001001000100", + "10001111011000010100011101010011111111010100100110110000011000110000011010110000011110001010010010010011110100000010110010001011110100110001000100001", + "00101001111000111011111100110010111101110010100100001111000101101000010111101100000100101010100100100100100100111101100100110101100000100100100110100", + "11000110111100000011110100001101100001010111001001011111001010111110010100111000001000010010111110010100111110011010100011100011100011100011011110010", + "01010101110110010010011111000001011000001001001000000010111011001111100101001001111100000100110000011010110000011011110110000011010110000011110010011", + "11101111101110111010110000001111101100010010101000100000100110011111001010011101000111100101010011111001010011110010111011011011011010011110010011111", + "00111001110001000001110101100001110000110110101000100010110000001101011000001111010110111110010100111111010000110111110100111110010101010000101010101", + "00000110100011001010111010110110111111001010100011100100001011111100101001111100101110110000011010110001111100100110000001011110100000110001000100101", + "11011001000000100011000111111111001111011001010111110110010111100000110101100000110101000011111001010010011111001110101000010111101000101100100101001", + "01010110000011001011000110001000100100001111111101101011000101101011000001101011000101010001001001001000101111011001101111010000101111101010011111010", + "10001101001110001011001010000100001011000101110010111001110100011110100001011010110010011100001010010010010010001011010110000011010110010010010000010", + "10101011010001101100011001110000001100011011100100110010100010110011111001010101100101111111001011111001010011110111001110001110001000001110110011111", + "10011100101101001111000100001010000011010010110011011001100001110100111110010010100111011111110011000001101011000000001101011000001011011000101001000", + "01101011011000001000000110100001011010100100111110010110010000001001111100101011110001010011110101001111100101000100101101101101101011101000100101001", + "01010100011100101100011000010100011100011011000101001111011101000000110101100010111011010011111001000010111101011011111001010011111111011101011111000", + "11000011111000010001100001111101100100110000011000111111010000100111110010100111110001101011000001110010100111111100111010000101111000001010000111110", + "01001001110110010101110001010001111001001111100001000000100001010110000011010110000101110101001111111100101001111001011110100001011000111010001011111", + "00011111101110100110101011111111101001000010010000000110111110000110101100000110101111111100100100111101000010111111100010111101000100100111111110111", + "01111000110101010000010111001000110001111110101001100011100011000101111010000101101110001111010001001001001001001000101101011000001001001001100011001", + "00011010100111011010111101001010111011101101010010000101101010000101001111100101010110101001111101001111100101001010111000111000111000111000101011001", + "11111000100000100010100111101000101111111111011110110101100010011001010011111001001010001010011110101100000110111000100000110101100000110100100010101", + "10111111100011010011011111111111100000111111100101001101111111010010100111110010001011111000101110010100111110011111110110110110110110110011111110010", + "11100101001010011010100100110011101010101101110011111000011111110110000011010110101000001101001111110100001011110010101111100101001101101010110101110", + "10101111110101111100010010001010101001011101110101010011100011001010011111001011111000101110101100011111001010011101110111101000010101100111100110011", + "10010100101101001110100010000101100010010100111010011011101110001101011000001100111110010110010100100111110010100010100101111010000011100000111110100", + "10100111111000010000011101011001011111101100100110110001111010110000011010110001011110000010010010001011110100001011010100001011110010010001110010001", + "00010101111000111101111010100111111100000011000100001111000110101100010111101000000111100010111101000100100100100010000000110101100100100100110010100", + "11000111111100000001110110000001100000100000001001011110010001011000010100111110001100111010100111110100111110010110000011100011100011100011110010010", + "01001100100110010100011001011110111001001011101000000011101010101001100101001111111100110100101001111010110000011111110110000011010110000010011100011", + "11010011010110111110101010001111001101011000001000100000110110111101001010011111100001000101000010111001010011111111111011011011011011011010111101111", + "00111000010001000001110111101000110001101100101000110010100100101111011000001101110011010110010000101111010000101001110100111110110110110111101110101", + "00011111011011001010101100111100011111111101000011110100110101111100101001111101001111111000011100101001111100101011000001011110000011010111010000101", + "11111001001000100011001111101000001111111111010111100111000011100000110101100001010010011011111111001010011111001111001000010110001110001111010011001", + "01111110111011001010100110000000000100110001111101100010000001101011000001101010000100111001001111010000101111010000011111010001001001001000101001010", + "10100001001110001010101100010111001010110101110010111000010000011010100001011110100000010100001011110010010010000100101110000010010010010010000100010", + "10101010011001101100011011101000001101001011100100101011111100110101111001010011111001010111001010011001010011100011110110001110001110001110011111111", + "10010101111101001110100010100101100010010010110011010001010001110010111110010100111111101111110010100001101011011100100101011000001101011001000111000", + "01100111100000001001111101011011111011101010111110011110000000001011111100100001011111110011110100001111100101010001000101101101101101101100001011001", + "01010101111100101100011010100001011100000011000101010111001001000010110101101000010110111011111101000010111001000100011001010011011011011010000011000", + "11000110000000010001110111100101000100100110011000101111101110100111110010111110010100100011000111110010100001110000011010000101011000001100001011110", + "01001101111110010101111001111110111001001001100001001001110101010110000011001111100100101101001001111100101111111001111110100000111000111001100101111", + "00010011010110100111001011001101101111011100010000001111101100000110101100010111101001010100100010111101000100111101110010111100100100100101000100111", + "01111000010101010001110110101100010111101110101001100011001011000001101010000101111011001111010000101111001001011111110101011001001001001001011111001", + "00111010101111011010101100111110111111111101011010011101001010000011010111100101001111100001111100101001100101010101000000111000111000111000101001001", + "01110000010000100011001111001000001011111111010110111100111100011111001011111001010010000010011111001010000110110001001000110101100000110100101010101", + "01000110111011010010100110101111100010110001111001000101111111010000101111111010000111111000101111010000111110001111111110110110110110110111111110010", + "00000000101010111010101101101000101100110101101011100000100011110100001011011110100010001100001011110100001111111000101111101101101101101100100011110", + "11111110101101111100011010001010101001001011111011000011101011001010011111010011111110101111001010011111001100001010110111100000110101100000101010011", + "10000010100100001110100010101000100110010010111110010010100010001101011000010100111110001111110010100111110100101000100101100011100011100010100010100", + "10111010000001010001111101111111111001101010101000111000111110110000011010100001011111111011110100001011110010001111100101010010010010010011111110001", + "10111010111000001100011011010101011010000011001110001111010110101100000111101000010111000100111101000010100100110111111001000100100100100100011010100", + "10111010110100010001110111111100100100100110010101000110100101011000001100111110010111010100100111110010111110010001111010000011100011100010101100001", + "10000010000110010101111001100110000101001001100100001010010100101001111101001111100011111010101001111100110000001011011110100011010110000011010100010", + "11111110110110100111001011000000010111011100011010101000000010111101000000010111101010011001000010111101010011100111010011111011011011011010110001110" + ], + "1": [ + "11111110011000011011100101010001010100001011110100001011110000011010110000011010110001010101001110010010010010010010101101101101101100010100001111111", + "10000010100001101010001100000000110000011010110000011010101010000011010110000011010111100000011011001111100101001011000011010110000010111101101000001", + "10111010000110010100111111101011100101001111100101001111101010101001111100101001111100110101001110011010110000011001111000111000111000000111001011101", + "10111010110001111100000000111000110110000011010110000011000000001011110100001011110101110010010011001111100101001011110010010010010010101111001011101", + "10111010011010101001010110111111100011010110000011010110111110110100001011110100001011111010010110000101001111101111110010010010010000001010001011101", + "10000010100110010001001000101000101111100101001111100100100010011100101001111100101010001111100011010000011010111000111000111000111010110100101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000011111101010001110001000111010110000011010110001100010110110000011010110000010001010110110000101001111111000110110000011010000011000000000000", + "11111011111000110101010000101111101011110100001011110100111110010000011010110000011111111111100011010010010010011111101101101101101011110010110101010", + "01001100011000011010001010110000110100001011110100001010011111111010110000011010110010001101001011110010010010000100001101101101101011110010000011100", + "00100010000001101010111001100100010000011010110000011010010101100011010110000011010010011000011100101111100101010100100011010110000001011000001110110", + "10110100000110011101111110110000100101001111100101001111110101001001111100101001111001001101001001111010110000010110011000111000111110100010111011100", + "11101110110001100101010001100110110110000011010110000010111010101011110100001011110110000010010100001111100101001000110010010010010100001001001010010", + "01000001111010100000001111001001000011010110000011010111110000010000001011110100001101010011010110000011001111111010010010010010110100001011110101010", + "00010111100110000001101001011000101111100101001111100100001010011010101001111100101100000110000011010110011010101010111000111000011010110001110001101", + "01111100011111111011101110111011111010110000011010110001101010110000000011010110000011010011010110000011001111100000010110000010110000011010000101011", + "11100111111000100101110001101000101011110100001011110100100000010010011010110000011000010110000011010110010010010010001101101100001011110110110111101", + "01000000011000011011101011010000110100001011110100001011111111111100110000011010110011001100001011110100010010000100101101101100001011110100000010000", + "00101010000001101011011001100100010000011010110000011011010101100101010110000011010011111001111100101001100101010101000011010110100001011110001111010", + "10110100000100000101111110110000100101001111100101001110010101001111111100101001111000101100101001111100110000010111111000111001011110100000111010000", + "11100010110001100101010000000110110110000011010110010011011010101001110100001011110111100011110100001011100101001001110010010011110100001011001011010", + "01001001111000101000001111101001000011010110000011001110010000010010011011110100001100010011010110000011010111111010010010011011110100001011110101110", + "00000111100010010001101001011000110111100101001111111100001010011010110001111100101100000110000011010110000010101010111000110000011010110001110000101", + "01100100011001111011101110111011100010110000011010101001101010110000011011010110000011010011010110000011010111100000010110011010110000011010000101111", + "11100011111100110101110001101000110011110100001011100100100000010010010010110000011000010110000011010110000010010010001101110100001011110100110110001", + "01001100011010000011101011010000100100001011110100010011111111111100101000011010110011001100001011110100001010000100101101110100001011110100000010000", + "00011010000001111011011001100100001000011010110000000011010101100101001110000011010011111001111100101001111101010101000011011110100001011110001111010", + "10010100000000010101111110110000111101001111100101010110010101001111100100101001111000101100101001111100101000010111111000100001011110100000111010000", + "11001111110111100101010000001111101110000011010010010011111110101001111100001011110111111011110100001011110101001111110010001011110100001011111111010", + "01111000111010101000001111111000110011010110000101001110100010010010010010110100001010001011010110000011010110001000110000001011110100001010100011110", + "00011010100000010001101001001010110110000101001001111100101010011010110000011100101110101110000011010110000011011010111010110000011010110001101010101", + "01111000111111111011101110101000100011010000011100101000100010110000011010110110000110001011010110000011010110001000110000011010110000011011100011111", + "11011111111110110101110001111111110010010100001111100100111110010010010010010000011111111110000011010110000011001111101011110100001011110101111110001", + "01010000111010000011101011000110000101001011110010010010111011111100101001111010110011100100001011110100001011101001101011110100001011110101001010000", + "00101011100001111011011001101000001001111010110110000011010001100101001111100011010100010001111100101001111100110010000001011110100001011110010101010", + "10110101100000010101111110100001111100101111100011010111111011001111100101001001111000000100101001111100101001111010111110100001011110100001010000000", + "11110110010111100101010000011010101111100010010010010011110010101001111100101011010101010011110100001011110100010000010100001011110100001010000101010", + "01110001111010101000001111110000110010010111100101001110011000010010010010010000101110010011010110000011010110010010010100001011110100001010010111110", + "00011110000000010001101001011000110110000010101001111100110110011010110000011011001011001110000011010110000011011100111010110000011010110001100010101", + "01111000011111111011101110111101000011010111111100101000001100110000011010110001100111111011010110000011010110000101010000011010110000011010101111111", + "11010110011110110101110001100001010010010011001111100100001100010010010010010011111010101110000011010110000011001111101011110100001011110101111010001", + "01010000111010000011101011000110100101001110010010010010100011111100101001111100010011100100001011110100001011101001101011110100001011110101001010000", + "00101011100001111011011001101000001001111101010110000011011001100101001111100100110100010001111100101001111100110010000001011110100001011110010101010", + "10110101100000010101111110100001011100101000000011010111110011001111100101001110011000000100101001111100101001111010111110100001011110100001010000000", + "11110110010111100101010000011011001111110100010010010011110010101001111100100000010101010011110100001011110100010000000100001011110100001010000101010", + "01110001111010101000001111110000110010001011100101001110011000010010010010011010111110010011010110000011010110010010001100001011110100001010010001110", + "00011110000000010001101001011001110110011010110001111100110110011010110000000011010011001110000011010110000011011100100010110000011010110001100110101", + "01111000000111111011101110111100100011001111100100101000001100110000011010101001111111111011010110000011010110000101011000011010110000011010101111111", + "11010110011110110101110001100001010010000011010111100100001100010010010010001011110010101110000011010110000011001111110011110100001011110101111010001", + "01010000111010000011101011000110100101010110000010010010100011111100101001110100001011100100001011110100001011100001110011110100001011110101001110000", + "00101011100001111011011001101000001001100101001110000011011001100101001111111100101100010001111100101001111100111010011001011110100001011110010011010", + "10110101110000010101111110100001011100110000011011010111110011001111100101010110000000000100101001111100101001100010110110100001011110100001001110000", + "11110110000111100101010000011111001011110100001010010011110010101001111110110000011101010011110100001011110100001000001101001011110100001010011011010", + "01110001110010101000001111110010110100001011110101001110011000010010010000011010110110010011010110000011010010001010001101101011110100001010000011110", + "00011110001000010001101001011101110000011010110000011100110110011010110110000011010011001110000011010110000101010100100011010000011010110001111100101", + "01111000000110011011101110111000100101001111100101001000001100110000011100101001111111111011010110000011010000011101011000111010110000011010110001111", + "11011111111110110101110001101111110110000011010110000100111110010010010100001011110011111110000011010110000101011111110010010100001011110101111110001", + "01011000101010100011101011011000100011010110000011010010100011111100101011110100001010001100001011110100001111111000110010010100001011110101100010000", + "00101010111001011011011001101010101111100101001111100010101011100101001001111100101010101001111100101001111010111010111000111110100001011111101011010", + "10111000100000010101111110111000111010110000011010110111100011001111100011010110000010001100101001111100101111111000110110000001011110100000100010000", + "01111111100110000101010000001111101011110100001011110011111110101001011010110000011111111011110100001011110010011111101101101111110100001010111111010", + "11110100000010101000001111101011010100001011110100001110101110010010110000011010110110101101010110000010010010001111101101101101110100001010100101110", + "10010010100001110001101001010100110000011010110000011011100000011011010110000011010101100000000011010111100101011001100011010110011010110000010110101", + "00111001100110011011101110100000000101001111100101001111011110110001111100101001111100010101010110000010110000001010011000111000110000011010000011111", + "00010111111111010111110001110011010110000011010110000010010100010011110100001011110010000010000011010111100101000010110010010010001011110100101110001", + "01010100001010100011101011000101000011010110000011010111010101111100001011110100001001010010001011110101001111110000010010010010001011110101011010000", + "11100011111000111011011001100110101111100101001111100100011011100100101001111100101010010111111100101000011010100010011000111000100001011111101011010", + "11111100000001010001111100111111111010110000011010110000010001001110000011010110000011001010101001111101001111110100110110000011011110100001110100000", + "01111010000110100011010010001100101011110100001011110101101010100000011010110000011001111111110100001010010010010101001101101101100100001010010001010", + "00110100000010001010001001101101010100001011110100001010101010011010110000011010110110101101001110010010010010001111101101101101101100000010100101110", + "01010010100001110111111101011100110000011010110000011011100000000011010110000011010101100000011011001111100101011001100011010110000010111000010110101", + "11111001100110011001110010110000000101001111100101001111011110101001111100101001111100010101001110011010110000001010011000111000111000000010000011111", + "01010111111111010011101011110111010110000011010110000010010100001011110100001011110010000010010011001111100101000010110010010010010011101101001110001", + "11010100001010100101110101010101000011010110000011010111010101110100001011110100001001010010010011100101001111110000010010010010010011101100111010010", + "01100011111000111101011101100110101111100101001111100100011011111100101001111100101010010111100100110000011010100010011000111000111001010110001011010", + "10111100000001010111100110111111111010110000011010110000010001010110000011010110000011001010110001100101001111110100110110000011010110111000010100010", + "00111010000110100101000110011100101011110100001011110101101010110000011010110000011001111111100100010010010010010101001101101101101101010010110001010", + "00110100000010001000111101100101010100001011110100001010101011011010110000011010110110101101001011110010010010001111101101101101101111110011000101100", + "01010010100001110111111110001100110000011010110000011011100001100011010110000011010101110000011100101111100101011001100011010110000001011001110110110", + "11111001100110011001010100100000000101001111100101001111011111001001111100101001111100001101001001111010110000001110011000111000111110100011100011100", + "01010111111111010010101010101111010110000011010110000010010100101011110100001011110010011010010100001111100101000100110010010010010100001100001110010", + "11010100101010100100101010100101000011010110000011010111010100010100001011110100001001001010010110000101001111110110010010010010010100001100111010010", + "01100010011000111101100100110110101111100101001111100100011010011100101001111100101010000111100011010000011010100000011000111000111010110110001011001", + "10111101000001010110101110111111111010110000011010110000010000110110000011010110000011010010110110000101001111110010110110000011010000011000010100011", + "00111111100110111100011111011111101011110100001011110101111110010000011010110000011011111111100011010010010010011111101101101101101011110110111111001", + "00111000100010001000000100001000110100001011110100001011100011111110110000011010110110001100001011110100010010011000101101101101001011110101100010000", + "01011010100001110111110110001010110000011010110000011010101011100101010110000011010110101001111100101001100101001010100011010110100001011111101011110", + "11111000100110001000110101111000100101001111100101001111100011001111111100101001111010001100101001111100110000001000111000111001011110100000100011000", + "01011111111111011010101010001111110110000011010110000011111110101001110100001011110111111011110100001011100101011111110010010011110100001011111110110", + "11011001001010101100001010101100100011010110000011010111101010010010001011110100001101100011010110000011001111101011010010010011110100001011110001110", + "01100110011000101101100100011101001111100101001111100100001010011010101001111100101110110110000011010110011010101001111000111000011010110001000100101", + "10110000000001000111101110101100111010110000011010110000100000110000000011010110000011110011010110000011001111110011110110000010110000011010010111111", + "00111010000010111100011110110000001011110100001011100100011110010010011010110000011110001110000011010110010010011100001101101100001011110101000010001", + "00110101000010010000000101110111010100001011110100010010110101111100100000011010110010011100001011110100001010010100101101100100001011110100001110000", + "01100111100111111111110110000101001000011010110000000010010101100101001110000011010011001001111100101001111101010110000011011110100001011110011011010", + "11110000100010001000110101101110111101001111100101010110111011001111100100101001111100000100101001111100101000011000011000100001011110100001101010000", + "01111111011001001010101010011111101110000011010110010010010000101001111100001011110001010011110100001011110101000010110010001011110100001010110101010", + "11100000101100111100001010101100110011010110000011001110001010010010010011110100001101100011010110000011010111101011010010001011110100001011110001110", + "01111111111110100101100100011101010111100101001111111100101010011010110001111100101110110110000011010110000010101001111000110000011010110001000100101", + "10010000100111010111101110101100100010110000011010101001000000110000011011010110000011110011010110000011010111110011010110011010110000011010010111111", + "00000111100000111100011110110000010011110100001111100101111110010010010010110000011110001110000011010110000010011100101101110100001011110101000010001", + "00111101000100010000000101110111000100001011110010010011110101111100101001011010110011111100001011110100001011110101001111110100001011110100001110000", + "01001011100101111111110110000101001001111010110110000010010101100101001111100011010010101001111100101001111100110111100001011110100001011110011011010", + "11100100100010001000110101101110111100101111100011010110111011001111100101001001111101100100101001111100101001111001111110100001011110100001101010000", + "01010111011011001010101010011111101111100011010010010010010000101001111100101011110000010011110100001011110100000010010100001011110100001010110101010", + "11101100101010111100001010101100110010010110000101001110001010010010010010010100001100000011010110000011010110001010110100001011110100001011110001110", + "01111011111110100101100100011101010110000101001001111100101010011010110000011100101111010110000011010110000011001000011010110000011010110001000100101", + "10111000100111010111101110101100100011010000011100101001000000110000011010110110000010010011010110000011010110010010010000011010110000011010010111111", + "00111011100000111100011110110000010010010101001111100101111110010010010010010000111111001110000011010110000011011100101011110100001011110101000010001", + "00111101000100010000000101110111000101001010010010010011110101111100101001111110010011111100001011110100001011110101001011110100001011110100001110000", + "01000011100101111111110110000101001001111101010110000010010101100101001111100100110110101001111100101001111100110111100001011110100001011110011011010", + "11101100100010001000110101101110111100101000000011010110111011001111100101001110011011100100101001111100101001111001111110100001011110100001101010000", + "01011111111011001010101010011111101111100100010010010010111110101001111100101000010111111011110100001011110100001111110100001011110100001010111111010", + "11101000101010111100001010101000110010010011100101001110100010010010010010010010101010001011010110000011010110011000110100001011110100001011100011110", + "01111010111110100101100100001010110110000010101001111100101010011010110000011011001010101110000011010110000011001010111010110000011010110001101010101", + "10111000100111010111101110101000100011010111111100101000100010110000011010110001100010001011010110000011010110001000110000011010110000011011100011111", + "00111111100000111100011110111111110010000011001111100100111110010010010010011011111011111110000011010110000011001111111011110100001011110101111110001", + "00110101000100010000000101101111100101010110010010010011110001111100101001110100000000010100001011110100001011100010010011110100001011110100010100000", + "01001010100101111111110110000100101001100101001110000010101011100101001111111100101110000001111100101001111100110010111001011110100001011110110001010", + "11101001100010001000110101110100111100110000011011010111101011001111100101010110000101010100101001111100101001100000010110100001011110100000000100000", + "01011010111011001010101010011101101111110100001010010011000000101001111100110000011100010011110100001011110100010010001100001011110100001010010111010", + "11101001101010111100001010111001010010001011110101001110011110010010010010011010110011001011010110000011010110010100101100001011110100001010100011110", + "01111111001110100101100100000110010110011010110001111101000100011010110000000011010001111110000011010110000011001101000010110000011010110001001110101", + "10110001111111010111101110101100000011001111100100101000001100110000011010101001111010101011010110000011010110011111111000011010110000011011111011111", + "00111110101000111100011110100111110110000011010111100100000010010010010000001011110011100110000011010110000011001001110010110100001011110101101010001", + "00110101001100010000000101101110100011010110000010010011111001111100101011110100001000010100001011110100001111100010010010010100001011110100010100000", + "01001010101101111111110110000101101111100101001111100010110011100101001001111100101110000001111100101001111010110010111000111110100001011110110001010", + "11101001100010101000110101110101011010110000011010110111110011001111100011010110000101010100101001111100101111100000010110000001011110100000000100000", + "01011010101010101010101010011100001011110100001011110011011000101001111010110000011100010011110100001011110010010010001101101011110100001010010111010", + "11101001111011111100001010111001010100001011110100001110010110010010010000011010110011001011010110000011010010000100101101101011110100001010100011110", + "01111111001111000101100100000110010000011010110000011101001100011010110110000011010001111110000011010110000101010101000011010000011010110001001110101", + "10110001111111010111101110101100000101001111100101001000001100110000011100101001111010101011010110000011010000000111111000111010110000011011111011111", + "10111110100000011100011110100111110110000011010110000100000010010010110100001011110011100110000011010110000101010001110010010000001011110101101000001", + "10110101011100010000000101101110100011010110000011010011111001111100001011110100001000010010001011110101001111110010010010010010001011110100010110000", + "00001010101101111111110110000101101111100101001111100100110011100100101001111100101110000111111100101000011010101010111000111000100001011110110011010", + "01101001100011001000110101110101011010110000011010110001110011001110000011010110000101010010101001111101001111111000010110000011011110100000000000000", + "11011010101010001100101010011100001011110100001011110101011000101000011010110000011100010111110100001010010010001010001101101101110100001010010011010", + "10101001111010011110001010111001010100001011110100001010010110010010110000011010110011001101010110000010010010000100101101101101110100001010100101110", + "00111011001110000011100100000110010000011010110000011011001100011011010110000011010001111000000011010111100101010101000011010110011010110001001000101", + "01110001111111110101101100101110000101001111100101001110001100110001111100101001111010101101010110000010110000000111111000111000110000011011111101111", + "01000110100001111100011010101111110110000011010110000010111110011011110100001011110011111010000011010111100101011111110010010010011011110101111110001", + "00000000111100110010000001111000100011010110000011010110100011110100001011110100001010001010010011100101001111111000110010010010010011111101100010000", + "11111110101101011011100000001010101111100101001111100101101011111100101001111100101010101111100100110000011010111010111000111000111001010110101011010", + "10000010000011001110111111101000111010110000011010110001100011010110000011010110000110001010110001100101001111111000110110000011010110111000100010000", + "10111010101010001000110010001111101011110100001011110100111110110000011010110000011111111111100100010010010010001111101101101101101100010010111111010", + "10111010111010011100011110110111110100001011110100001011100010011010110000011010110001100101001110010010010010000001101101101101101100010011000111110", + "10111010101110000101111100011010110000011010110000011011111000000011010110000011010100010000011011001111100101001010000011010110000010111000011010110", + "10000010111111110001000010100111100101001111100101001110010010101001111100101001111110000101001110011010110000001010111000111000111000000010001111110", + "11111110100001111011100100110101010110000011010110000010110000001011110100001011110011010010010011001111100101010000010010010010010010101101111010000" + ], + "2": [ + "11111110011000010111011101111000111000100001000000001100101100000100001110011000001110110111111001110010010111110000001111100010101110010100001111111", + "10000010011101100110010000001101101110010000000010001000101110001010100101000110001010110011011010011001010100011100010111101110110110001101101000001", + "10111010001111011011111100100101000010000101110001100000001110001000101000010011110010001110110110100001101100100011000101111001100101011011001011101", + "10111010011000010111001000011000111001011000111111110001110110111011100100001010100100011101011000001111100010001010100100001000000101101011001011101", + "10111010101110100001101010001111101110010000110110111010111110011010111001000110111011111001001111000011100001001111111000110100011001011010001011101", + "10000010010000001011111101101000100011111101101111100100100010111111001000111011100010001110110111110011011001101000111011100011011010001000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000100010110110010000011000101111101000011100001100100011001101000100111110011010001011011011001011100001011000101001110100001000001100100000000", + "00110011100011001100010011111111100010000011100100101011111110010000111111101001111111111110000011010001011001011111111111010011011111001011111010000", + "10111101011000010111011101111000111000100111000000001101011000001100001110011000001000110111111001110010010111111000001110000010101110010010010100000", + "00101110011100100110010000011101101110010000000010001001000100010010100101000110001010110011011010011001010100011100010110001110110110001110011111100", + "01001100001110011011111100100101000010000101110001100001101110000000101000010011110100001110110110100001101100101011000101011001100101011001000111011", + "00011011111000010111001000011000111001011000111111110000010100101011100100001010100100011101011000001111100010001010100101101000000101101000101011010", + "00001001101110100001101010000110001110010000110110111011101010011010111001000110111110000001100111000101100001001110111001010100011001011100100010110", + "01000011110000001011111101111000000011111101101111100100101010111111001000111011100111011111101111110101011001110001111010000011011010001011110010001", + "10010101010101100000100110100100011001011110101010111010110101111011110010001000101111010101010101111011010111110000011110100010111110111010011100000", + "10101111001110000001111110011010001111101110001001000110100001111101010010000100010010101010010110111000110100111100010010111110110010100110011101100", + "01100100000110101100000110101101100011111100011011010110000011010111010100000011010011101100011010101001001100100011010101011001110101001001001111011", + "10011010101111110000100110101011011000100110110100111111110010100100010010110000111100000100001100101111100010101010100000111000000000101000101001010", + "00100001100101010110010001010000101111101000011100001100000011101101000101111110011001100010101011001100000001000110101000110100001000100100101010110", + "11000010100101001100010011011011100010000011100100101011001111110000111110110001111111000111010011010100111001010001111110110011011110101011110000001", + "10111101011101010111011100110010111000100110000000001101011100101100001111110000001000110111001001110011010111111000001101100010101111100010010100000", + "00101110011111100110010000011111101110010000000010001001000111010010100100010110001010110010010010011000110100011100010101101110110111101110011111100", + "01001100001110111011111101111001000010000101110001100001101110100000101000010011110100001110010110100000001100101011000011111001100101111001000111011", + "00011011111000110111001000100010111001011000111111110000010111001011100101110010100100011100110000001110000010001010100010001000000100001000101011010", + "00001001101011000001101011000000001110010001110110111011101110111010111001011110111110000001110111000100100001001110111100110100011000110100100010110", + "01000011110100101011111101110100000011111101101111100101001001111111001001101011100111011111010111110100111001110001111011100011011011100011110010001", + "10010101010011100000100111100110011001011110100010111010110101011011110011011000101111010100011101111010110111110000011110000010111110000010011100000", + "10101111101000100001111110111111101111101110010001000111111110011101010011001100010011111010111110111001010100111111110011011110110010011110111111100", + "01101000100110001100000111101000100011111101000011010110100011110111010100101011010110001100010010101000001100111000110110111001110101011000100011011", + "10011010101001010000100110111010111000100110111100111111101011100100010010100000111010101100100100101110000010111010100011011000000000111000101011010", + "00101000100011010110010001001000101111101000010100001101100011001101000101110110011010001011111011001101100001011000101110010100001000110100100010110", + "11001111100011101100010010111111100010000011110100101010111110010000111110100001111111111111101011010101011001011111111001010011011111110011111110001", + "10111001111101110111011100001000111000100111001000001100110100001100001111110000001100011111000001110010010111100010101010000010101110000011001010000", + "00101011111001000110010000001100001110010000010010001000101010010010100100010110001110000010111010011001010100001110110110001110110110001110100011100", + "01000001101000111011111100101010000010000101111001100000101010000000101000011011110101011111000110100001101100111001100101011001100101011000010011011", + "00010111011110010111001001111010011001011000101111110000010100101011100101111010100101010100001000001111100010001000000101101000000100101000011101010", + "00001101001011100001101010111100001110010000110110111010100000011010111001000110111010101001111111000100111001010100011011010100011000110101111100110", + "01000110010010001011111101100101100011111101100111100100100010111111001001111011100011101111111111110100100001100011011000000011011011100011001110001", + "10011000110101100000100101110111011001011110100010111011110011111011110011000000101110000101001101111010101111100010111000100010111110000011001000000", + "10100011101110000001111011001000101111101111011001000111000011111101010011001100010011100010000110111001000100111110110100111110110010011110101011100", + "01100000100110101100000001010011100011111101110011010111101111010111010100101011010111000100011010101001001100111001110001011001110101011000010001011", + "10011111001111110000100110111010111000100110000100111110011101100100010010100010111000110100001100101111100010111000000000111000000000111000010101010", + "00101100000101010110010101000111101111101001110100001101000111101101000101110110011000110010101011001100000001010100001000110100001000110101111110110", + "11001110000101001100010100100001000010000010010100101011001110110000111110100001111110001111010011010100111001010011011110110011011111110011000110001", + "10111001111101010111011000001010111000100111000000001100010110101100001111110010001100011111001001110010001111100010101101100010101100000011001010000", + "00101011111111100110010010001000001110010001001010001001001111010010100100010110001110000010010010011001001100001110110101101110110100001110100011100", + "01000001101110111011111010101100000010000101011001100000101000000000101000011101110101011110010110100001110100111001100011111001100011011000010011011", + "00010111011000110111001101111110011001011001001111110001110111101011100101111100100101010100110000001111110010001000000010001000000010101000011101010", + "00001101001011000001101100111110001110010001111110111010000000011010111001000000111010101001110111000100100001010100011100110100011100110001111100110", + "01000110010100101011111101100001100011111100111111100101000110111111001001111011100011101111010111110100111001100011011011100011011011100011001110001", + "10011000110011100000100011110001001001011110000010111011110011011011110011000000101110000100011101111010110111100010111110000010111110000101001000000", + "10100011101000100001111001001100100111101111111001000110100111011101010011001010010011100010111110111001010100111110110010011110110010011000101011100", + "01100000100110001100000011010001111011111100011011010111001111110111010100101011010111000101010010101001010100111001110111011001110111011110010001011", + "10011111001000010000100100111110110000100111111100111111111111100100010010100000111000110101000100101111111010111000000010111000000010111110010101010", + "00101100000011010110010111000001110111101000110100001101000011101101000011110000011000110010111011001100011001010100001110110100001110110111111110110", + "11001111100111001100010110101111110010000010010100101010111110110000111010100111111111111110001011010100101001011111111001110011011001110001111110001", + "10111000111000110111011010001000111000100111001000001101100010101100001001110110001110001110010001110010010111101000101010000010101010000010100010000", + "00101010111000100110010000011010101110010001010010001000101011010010100110010110001010101010100010011001010100011010110110001110110110001111101011100", + "01001000101100111011111000111000110010000101011001100000100010000000101110011011110110001111001110100001101100101000100101011001100101011001100011011", + "00011111111000010111001111111111101001011001001111110000111111101011100101111100100011111100010000001111100010011111100100101000000100101100111111010", + "00000001101100000001101110110000100110010001110110111010000110011010111001000110111011100000100111000100111001011110111000110100011010110010001010110", + "01000010110111001011111111101011101011111100100111100100001110111111001001111011100011000111001111110100100001100001111001100011011001100101010000001", + "10011101010011100000100001101010100001011110000010111010011111011011110101000110101100110100010101111010101111101000011000000010111000000000110100000", + "10101110001110100001111011010111111111101111111001000110000011011101010111001010010000110010100110111001000100100100010100011110110100011100111111100", + "01111100000001101100000001011001000011111100010011010110101011110011010010101101010110001101001010101001001100110011010011011001110001011001100111011", + "10111010001100010000100110110010111000100111100100111111110101100110010000100000111000010100010100101111100010111010100010111000000000111000001011010", + "00101000100101010110010101011000011111101000110100001101101001101011000011110110011010000010100011001100000001011110101110110100001000110100000010110", + "11000010100011001100010100111100010010010010010100101010001110110000111110100111111101011111001011010100111001001001111001110011011111110111010010001", + "10010100111010110111011000000010010000101111000000001100110000101110001111110000001101011110010001110010001111101000001000000010101100000100111100000", + "00111110111010100110010010000110000110001001000010001001100011010110100100010110001110111010100010011001001100001100010100001110110100001000111101100", + "01010100101000111011111010110111111010011101010001100000000100000100101110011101110111110111001110100001110100110011000011011001100011011011101111011", + "00011011111000010111001101100001001001010001000111110001010101101101100001111100100110011100010000001111110010010010100010101100000010101010001001010", + "00010000101100000001101100110100101110001001110110111010100110011010111111000000111011111000100111000100100001011110111110110010011100110100001010110", + "01100011010111001011111101101011100011111100101111100100001110111001001011111011100011001111001111110100111001100001011001100001011011100011010000001", + "10011100010011100000100011101100101001000110001010111010011111011101110101000000101100110100010101111010110111101000111000000100111110000010110100000", + "10101111001110100001111001010111111111111111110001000111100011011101010011001010010000110010100110111001010100100101110100011000110010011010111111100", + "01001101100001101100000011011001001011110100011011010111001011110101010100101011010110000101001010101001010100110010110011011111110111011111100111011", + "10001010001100010100100100110000110000111111110100111110010101100000010010100000111000001100010100101111111010111011100010111110000010111110001011010", + "00111001000101010100010101011010010111110000111100001100101001101001000011110000011010011010100011001100011001011110101110110110001110110110000010110", + "11000010100011001010010000111010010010001010011100101010001110110110111010100111111101000111001011010100101001001001111001110001011001110001011010001", + "10100100011010110011011100000010011000111111000000001100010000101100001001110110001101001110010000010010001111101000001000000010101010000010101100000", + "00001110111010100100010010000110001110010001000010001000100011010100100110010110001110100010100010111001001100001100110100001110110110001110110101100", + "01000101001000111101111110110111110010011101010001100001000100000110101110011011110101101111001111100001110100110011100011011001100101011001110111011", + "00011111111000010001001011101111101001001001000111110001111111101011100101111100100111111100010001001111110010011111100010101100000100101100111111010", + "00101000101100000001101010101000100110011001110110111010100010011000111001000110111110001000100110100100111001001000111110110010011000110010100010110", + "01011010110111001111111111111010101011100100101111100101101010111011001001111101100110101111001110110100100001111010111001100101011111100101101010001", + "10001000110011100000100001111000100001000110001010111010100011011111110101000110101110001100010101111010101111101000111000000000111000000001100010000", + "10101111101110100001111101001111111111100111110001000110111111011011010111001100010011111010100111011001000100101111110100011100110100011100111111100", + "01110000100001101110000111000010000011100100011011010111001111110111010010101011010001011101001010101001010100110000010011011001110011011001001011011", + "10110110101100010010100100101010011000100111110100111110110001100010010000100110111111011100010100101111111010100001100010111000000010111001000101010", + "00101100100101010000010111001110011111110000111100001100100011101011000011110000011110111010100011001100011001001101001110110100001110110100100100110", + "11000110100011001010010000101111110010010010011100111011000100110000111110100001111011110111001010110100101001011011011001110111011001110110011110001", + "10011001111010110111011100011001010000101111000000011100010100101110001011110000001100011110010000010010001111101010101000000100101000000100001000000", + "00110010111010100010010010011100110110001001000011001000000111010110100010010000001111111010100011011001001100011110110100001000110100001001101011100", + "01010001001000111011111010100011100010011101010001010001001110000100101000011101110011001111001110100001110100101001000011011011100011011011010001011", + "00011110011000010111001011110100111001010001000110110000011111101101100001111010100100110100010001101111110010011000100010101010000010101111010101010", + "00011101001100000011101010101111100110001001110111100010100010011010111011000110111100110000100111000100111001000101111110110100011110110010100110110", + "01101111110111001001111111110001011011111100101111000101101010111001001101111101100100000111001111110100100001101010111001100011011001100100011111001", + "10011000010011100110100001111000111001000110001010101010010101011101110001000110101000001100010101111010101111111011111000000010111000000000010010000", + "10101011001110100111111101000010001111111111110000110110101001011101010011001100010110011010100111011001000100110110110100011010110100011001110010100", + "01000000100001101100000111000010001011110100011011000111001111110101010110101011010111000101001011001001010100110001110011011111110011011111010010111", + "10000110001100010100100100101010000000111111110100011110110001100000010110100110111001001100010101101111111010101000000010111110000010111111011100110", + "00111100100101010110010111001110001111110000111101011100100011101001000111110000011110100010100011001100011001000100101110110110001110110110111101010", + "11000111000011001100010000101111100010001010011100101011000100110110111110100001111111101111001010110100101001000011111001110001011001110100001111001", + "10101001111010110101011100011001010000111111000001010100010100101100001101110000001010000110010001100010001110010011001000000010101000000100010000010", + "00010010011010100100010010011100110110010001000010101000000111010100100000010000001001101010100010000001001101100111010100001110110100001001110011111", + "01100001001000111101111010100011100010011101010001110001001110000110101010011101110011010111001110111001110101000000100011011001100011011011001001000", + "00101111111000010001101011110100111001011001000110000000011111101011100101111010100000101100010001110111110011000000000010101100000010101111000101001", + "00101101001100000000001010101111100110010001110110101010100010011000111011000110101010101000100110110100111001011100011110110010011110110010111111010", + "01111111110111001111111111110001011011101100101111000101101010111011001101111101110010010111001110101100100001110011011001100101011001100100000111101", + "10111001010011100000100001111000111001001110001011101010010101011111110001000110111000010100010101100010101111110010011000000000111000000000001011100", + "10111111101110100001011101001111101111110111110001000110111111011011010011001100011011111010100111000001000100101111110100011100110100011001111110100", + "01101000100001101110000111001000101011100100011010001111100011110111010110101011011110001101001010111001010101011000110011011001010011011111100011001", + "10101010101100010011000100111010100000100111110100011110101011100000010110100110100010101100010100110111111011011010100010111000100010111110101011001", + "00001000100101010000010111011000101111110000111100011100100011101001000111110000010110001010100011010100011000101000101110110101101110110110100010101", + "11011111100011001010110000111111100010011010011101011011111110110110111110100001100111111111001010101100101000001111111001110110111001110100111110010", + "10111100011010110110111100000100110000111111000000011101011110101100001101110000000010111110010000000010001111110000101000000101101000000100010101100", + "00011111011010100010010010010111110111110001000010101000100011010110100000010000010000110010100011000001001100011101110100001000110100001000000110000", + "01101101101000111011111010101001000010011101010000110001001010000100101010011101111110000111001110111001110100100010100011011011100011011011011110111", + "00001010111000010111101011101000111000000001000111110000010101101101000101111010100110001100010001110111110010001011100010101110000010101110110010010", + "00001000001100000011101010110010000110001001110111100011101000011010111011000110111000011000100111010100111000110110111110110010111110110010110010100", + "01110011010111001100011111111010011011111100101111000101001110111011101101111101111111010111001111101100100000001001111001100101111001100101110010010", + "10110101110011100010100001110010011001100110001010101010010001011111110001000110100111000100010101100010101110000000011000000001011000000000011100011", + "10111110001110100101011101011110001111010111110000110110100011011011010011001100001110111010100111000001000101100100110100011001010100011000011101111", + "01100101100001101001100111011111101011100100011011000110000101110110010110101011011001110101001011111001010100101011110011011110110011011111001110111", + "10101010001100010110100100100001000001000111110100011110010101100001110110100110100110001100010101110111111010101011000010111110000010111110110000110", + "00000001000101010100010111000100101110110000111101011100100111101001100111110000010011110010100011010100011001001111001110110110001110110110110011010", + "11010011100011001000110000110011100011011010011100101011001110110111011110100001111101010111001011101100101001010000011001110101011001110101101001001", + "10111100111010110011011100000100110001011111000001010101011110101100001101110000001010101110010000100010001110000000101000000100001000000100000100010", + "00011110111010100001110010010111110110010001000010101000100011010110000000010000010100111010100011000001001101100101110100001000010100001000011111111", + "01101100101000111001111010101001000010111101010001110001001010000100101010011101111000011111001110111001110101011010100011011010000011011011000111000", + "00001010111000010011101011101000111001100001000110001000010101101101100101111010111010001100010000110111110011010011000010101111100010101110101011001", + "00001000001100000100001010110010000110001001110110101011101000011011101011000110110000011000100110010100111001000110011110110011011110110010100011010", + "01110011010111001101111111111010011010011100101111000101001110111010111101111101111011010111001110101100100001110000011001100101011001100101101011101", + "10110101110011100010100001110010011000000110001011111010010001011111000001000110100011000100010101100010101111111001111000000000111000000000000101100", + "00111110001110100101011101011110001000110111110001011110100011011010100011001100010100111010100110000001000100111101110100011000110100011000000100100", + "01100101100001101000000111011111101000000100011010000110000101110111000110101011010101110101001011111001010101011011110011011111010011011111011111001", + "00111010001100010111000100100001000010100111110100010110010101100000100110100110100000001100010101110111111011010011000010111110100010111110110001001", + "01110001000101010100010111000100101001010000111101010100100111101001011111110000010101110010100011010100011000110111001110110111101110110110110010101", + "01000111100011001000110000111111100010111010011101110011111110110110111110100001100011111111001011101100101000001111111001110100111001110101111110010", + "00000000111010110010111100001000110100111111000001011100100010101101001101110000000010001110010000100010001111111000101000000101101000000101100011100", + "11111110111010100000010010011010110011110001000010100001101011010111011000010000010010101010100011000001001100011010110100001000100100001000101010000", + "10000010001000111001111010101000100011011101010000111001100010000100000010011101111010001111001110111001110100101000100011011011110011011011100010111", + "10111010011000010011101011101111111110000001000110101000111111101100010101111010100011111100010000110111110010011111100010101110010010101110111110010", + "10111010101100000101101010100110000101101001110111101010100010011010100011000111111000111000100110010100111000101101111110110010100110110011100101000", + "10111010110111001100011111100111111001111100101111001101000100111011111101111100011001110111001110101100100000001011111001100101100001100101011111101", + "10000010010011100010100001101001011111100110001011100010110101011111101001000111000000001100010101100010101110011011011000000001010000000001010001110", + "11111110001110100100111101001100101111010111110000011110100111011011010011001101101101110010100110000001000101100111010100011001011100011000110010110" + ], + "3": [ + "11111110010001101101110010011101011110000011000110010110001001010000000001100001010000001011010011110101010110010110110000011010001111101100001111111", + "10000010111011011101000100100111100000101100001110001110101000111111111000110100000000101000110010011110110101111011101100000110010111100101101000001", + "10111010101010110001001001001101111101101001000010110001100000101101111111111011000110010000001010100110001101000100101011000000000101100011001011101", + "10111010000111101001110010110111111001010110100110000011001010000010111111111110110100000110000100001010000011001001011010110101100100010011001011101", + "10111010010001011010000100101111101110110111110001100000111111100110110110011111111111111101111001000100100001011111100100101011011000100010001011101", + "10000010000000110001001000011000111101000001000010110011100011010010010100000001110010001101000001110100111001101000100011101101011011100000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000011011011010100101001000110100000110101110001100100011000000010011100110110110001101111001001100000001001000100000101110001000110100100000000", + "01110110000000110110101001101111111010001101011101001001111111011001100100010101100111111101001001010100111001001111100111101001011110110011100000110", + "10011100110001101101110011010101011110000011000110010110110101010000000001100001010011010011010011110101010110000110110100011010001111101010010101100", + "00001111111011011101000101000111100000101100001110001111100110111111111000110100000101010000110010011110110101100011101100000110010111100110011110000", + "11000000001010110001101000100101111101101001000010110001011010101101111111111011000011101000001010100110001101001100101011000000000101100001000110111", + "10010111100111101001110011110111111001010110100110000010011100000010111111111110110111110110000100001010000011001001011010110001100100010000101010010", + "00101000010001011011100100000011101110110111110001100000011111100110110110011111111010111101111001000100100001001000000100101101011000100100100010100", + "01100010000000110000101000001010011101000001000010110010000101010010010100000001110111000101000001110100111001110110000011101011011011100011110010010", + "00011001001101101100110011111110100010110000011000111010011011110110100101010000000011001011001111111010110111100111110110011110111110000010011100011", + "00100011001101011011000100000001010111100000110000100100111100110100001001111000001110110000100100111001010100100111101010000000110011011110011011111", + "01000101101010110110001000001110000101011000011101001101101110001011011010111010001000001000001000101110001101011101101111000111010100110001001100111", + "10111011001101101011110011110001010110011010111000111001010000001111001110000010110011100110000100101000000011010101011010110110100001010000101100110", + "10101101100111011100000111001000010000000100101111011100110111000100010010010110101110000101100111001011100000100001000110101111101000001100101001010", + "01001110111100110010101000101100100010001101111101000001000111011101100100100101101100101101011111010001011000010010000001101100111111001011110101001", + "10011100100111101101010100110101011000000001000111001110101001010100000000101001001100001011001111110010010111111110110010011101101110010010010010010", + "00001111101101011101000011100111110000101100101111000111101000111111111001101100011010101000101100011001010100011011101110000000110110001110011001111", + "11000000110110110111101000100101111001101011000011101001000000101011111110001011011000010000010100100001101100111100101101000011100101011001000001000", + "10010110011011101101110110110111100001010110000110011010001010000000111111001110111000000110010010001111100010010001011100110110000101101000101011001", + "00101001000111011011100011100011101000110101110000111000000011100010110111010111100101100101111101000011100000110000000010101010111001011100100011010", + "01100011010110110000101010101010001101000001100011101010001011010010010101011001101000111101000111110011011000001110000001101101111010001011110011101", + "00011000010011101010110101111110110110110010011001110010000001110000100100100000011000110011001001111101010110000111110000011001011110111010011101100", + "00101111110001011111000011001111111111100000010000101100111110110110001001001000000011111000100010111100110101101111101101000001010010100110111110100", + "01001000111000110110001001101000100011011010011100010101100010001111011011110010010010001000010100101001001100101000101000100110110101001000100011001", + "10111010111001101011110101011010111110011010011001110000101010101001001111011010101110101110011010101111100010101010111001010110000000111000101011001", + "10101000111101011010000001001000100100000110101110000101100010000110010011100110110010001101111001001100000001001000100000001110001001010100100010101", + "01001111100100110110101101101111110010001101011101000000111111011011100100010101100111111101001001010100111001001111100111001101011111010011111110010", + "10010100010011101101010101010111100110000011000110001111011100010100000000100001010111110011001011110101010110011001010100011100001110001011001111110", + "00001011011111011101000111010011101000101100001110000111111111011111111000010100000100111000101010011110110101100000001100000000010110000110100100011", + "11000001101000110001101110101010001101101001000010101000100101101011111110011011000101000000010010100110001101000110001011000010000101000000010100100", + "10011010100111111001110101110110101001010111100110011010111010000000111110011110110011001110010100001010000011010111111011110111100100110000011010001", + "00100000110101011011100100000001010110110111010001111000011101100010110111011111111100110011111001000100100001001111100101001011011000100101111100100", + "01100110000010111000101110011110000101000000000010101011101111110010010101000001110110001011000001110100111001101101100010001101011011100011001110010", + "00011001001011110100110111110001010010110000111000110010000000110000100101010000000001100101001111111010110111111101010110111000111110000011001000011", + "00101110101001011011000000000000011111100001010000101101110110110110001001011000001010000100100100111001010100100001001010100000110010011110101011111", + "01001101001000110110001110001100111101011000111101010101010111001111011010111010001100101000010000101001001101000010001111000111010101010000010100101", + "10111111101001101011110001100101011110011101011000110000001001101001001110000010110010001110011100101111100011010110111010110110100000110000010010101", + "10101100000101010100000011000111100000000100001111000101001000000110010011110110101000101101111111001100000000101011100110101111101000101101111001001", + "01000011111100101010101110101101110010001000111101000001101001011011100100100101101000010101001111010100111000001100100000101100101111101011000001010", + "10010100000011111101010010110111100000000111100111001110100011010100000001100001001010000101001111110010010111111001010011111101110110010011001010010", + "00001011101111001101000011110011101000101001101001000110000010011111111000101100011011100110101100011001010100000000001111100000101110001110100011111", + "11000000010000111111101100101010001001101011100001101001001011101011111110000011011011011110010100100001101100100110001101100011101101011000010011000", + "10011010011111101101110110110110101001010101100010011011010000000000100111111110111101010010010010001111100010010111111100010110001100101000011101001", + "00100000100101011011100011100001010000110101010110111000110010100010110111010111110000100101111101000100100000101111100010101010111000110101111001000", + "01100110100010110000101010111110000101000100000101101011001010110010011101000001100000010101000111110100111000001001100001101101111011100011001001110", + "00011000111011100010110101110001010110110000111101110011110110110000111101011000000110011011001001111010110110011011010000011001011110000011001111111", + "00101110001001000111000011000000011101100011010010101100000100110110011001001000011101111000100010111001010101100111001101000001000010011110101100111", + "01001101011000100110001001101100111001011000111100010101111000001111010010111011110001001110010101001001001000100000001000100110101101011000010001001", + "10111111001001111011110101000101011000011111011011110000110100101001001110011010101101001000011011001111100100110100111001010110011000111000010101001", + "10101101101101010010000001000111100111000110001000000100100110000110010011101111011110101011111000101100000111001011100000001110000000110101111110101", + "01001111101100110110101101101111110000101110111001000000111111011011111100100101000111111001001000010100111111001111100111001101010111110011111110010", + "10011000110011101101010101011000100011100011100000001110100010010100000001100001000110001011001111110010010111111000110100011100001110000010100011110", + "00001010111111011101000111001010101111001001101000000110101011011111110000101100011010101000101100011001010100001010101100000000010110001111101010011", + "11001000100000111001101110101000101011101011100111001001100011101011100110000011110010001000010100100001101100111000101011000010000101011001100010100", + "00011111110111110001110101101111101010111101100101011010111110000000001111111111011011111110010010001111100010011111111011110111110100101100111110001", + "00101100100101001011100100000000110100100101010001111000000101100011011111010011110111111011111000100100100101000001000101001011000000110010001010100", + "00101111010010100000101110001101100011011100000001001010011111110011010101000000010001001011000000010100111111111010000010001101000011100101010101010", + "11011101111011100100110111110101010001110000111111110011010100110000100101011111101011001101001110011010110001110010110110111000110110000000110010011", + "01101110000001011011000000001111011101011011010101001101100000110110110001001101101110101100100101111001010010110101101010100000111010011100111000111", + "10000001101000110110001110001101111000101000111010110100001101001110111010111000011100010000010100101001001100101010101111000111110101011001100001001", + "01110110001001101111110001110110111001101111011110010000100101101000000110011010101100010110011010101111100010100011011010110110000000111000001011001", + "10101001101101010110000011000010000110000110001011000100100010000110001011101010011011111101111001001100000001000010000110101110001000110100000010101", + "10000010001100101000101110100011110001100110111110100001001101011011010100100010000001000101001001010100111001011110000000101101001111110111010010010", + "10001000010011111111010010110111000010000011100111101110110111010101101111100101000001001101001110000010001011110111110011111100110110000100111100010", + "01000010111111001011000011100001101110111001101100100111110010011110111100101101111100100110101101100001001010010111101111100000101110001000111001111", + "00110100100000111101101100101110101010111011101100101000001111101011111010000100110000010110010101011001110010101001101101100011101101011011001001000", + "11101010110111101111110110111001001011101101101011111011010110000000000111111011011000011010010011010111110100000011011100010110001100101011101111001", + "11001100000101011001100011100000010101000101001111011001100000100011010101010101110001111101111001000100100001000111000010101010011000110100001100100", + "10101111010010110100101010101101100010110100001101001011111110110011011101000001110111001101000001110100111001111000000001101101011111100010010000010", + "00111101011011100110110101110100110000110000110101110010010100110000111011011100101101001011001111111010110111110100110000011000111010000010010100011", + "11111111100001000001000011001110011100001011010011001100100000110110111101001111101100101000100100111001010100110011101101000000100010011010011111111", + "01110001001000100100001001101100011001011000111100110101101100001110110010111110011010010110010101011001010000101100101000100111101111011110000111001", + "11110110001001111111110101010111011000001111011010010001000100101000001100011011001010010000011011010111111100100001011001010110011010111111101111001", + "01011001001101010000000001000011000111010110000001000101100010000110010011101001011101111011111000110100011111000100000000001110000110110111000100101", + "00110011101100010100101101100010010000110110110000100000001101011011011000100000000011000001001000001100101111011000000111001101010001110001010100010", + "01111000110011101111010101010000100011110011111001101111010110010101100011100011000111001011001111110010010111110001110110011100101010000010111010010", + "11000010111111111001000111000000001111011001100000100110010011011110110000101100011010100000101100011001010100010101101110000000110110001110111101111", + "11100100000000111101101110101111101011101011101110101001001111101011100000000111110110010000010100100001101100101111101101000011100101011001001111000", + "01001111110110010111110101011111101010111101100101111010111110000000001011111001011011111110010010001111100010001111111101110110010100101100111111001", + "00011000100100101001100101011000110100110101010001011000100011111011011111010011110110001010111000110100111101001000100001001010000010110011100010100", + "00101010110010100100101110101010100011010100000001001001101011111011010111000000010010101010100000001100100111101010100010001101000001100100101010010", + "11101000111011100110110110111000110001100000110111110101100010110000100101011111101110001100101110000010101001111000110110111000110000000000100010011", + "01011111100001111001000001101111111101011011011101001101111110110110110101001101101111111101000101100001000010111111101010100000111100011101111111111", + "10100000001000110100001110101101111000101000100010110001101101000110111000111000011001000000010100101001001100101110001101001111110001011000110011001", + "01111010001001001111110001010111011001101111010110010010110111101000000110011010101011001110011010101111100010111111111000110110000000111001011101001", + "10000000101101010000000010010111100110000110000011000010010010001110001101101010011010100101111001001100000001000111100000101110001000110100111000101", + "10010110101101001100101110001110110001100110111110100001001111001011010000100010000010010101001001010100111001000001100110101101001111110110001000010", + "10101000110010011111010011110011000010000011100111101111010111011101101001100101000100011100001110000010001011110011010111110100110100000100001110010", + "01001110011111001001010011100110001110111001101100100100100000000110111010101101111001111111001101100001001010001111001111101000101100001000101101111", + "00111101000000111101101101111101101010111011101100101111011111100011111110000100110001001111110101011001110010101000001101111011101011011010110001000", + "11101111010111001111100111010100101011101101101011111011110100010000000011111011011111001011110011010111110100011100111100001110001010101010110101001", + "11001101100101011001100011000000010101000101001111011100000000101011010101010101110100101101111001000100100001000011100000111010011100110101011110100", + "10100011010010010100110010001100000010110100001101001001101100110011011101000001110000010101000001110100111001100100100011101101011011100010000110010", + "00110100011011100110111110100001010000110000110101110100100100111000111011011100101100010011001111111010110111110001110110011000111110000010001110011", + "11111011000000100001001011100011011100001011010011001100100010100110111101001111101111111000100100111001010100101100101011000000100010011011100101111", + "01110001101001000100010100101000011001011000111100110100001100000110110010111110011111000111010101011001010000101001101100101111101111011111010101001", + "11111010101001111111101001010000111000001111011010010010010110110000001100011011001111001001111011010111111100111000011001011110011010111110011011001", + "01010000101101010000000000010000000111010110000001000010110010001110010011101001011100100010011000110100011111000100100000010110000110110111011100101", + "00110110001100010100111110001111110000110110110000100000101111001011011000100000000100010000101000001100101111000111100110010101010001110001101110010", + "01111001010011101111010111110110100011110011111001101010110110011101100011100011000010011011001111110010010111110101010111101100101010000011101000010", + "11001110111111111001011111100001101111011001100000100100000000011110110000101100011101111000101100011001010100001001001111100000110110001111101011111", + "11101101000000111101100101111010001011101011101110101111111111100011100000000111110111001000010100100001101100101010101101100011100101011001010101000", + "01001111110110010111111101010101101010111101100101111010010100110000001011111001011001001110010010001111100010011010011101010110010100101101010011001", + "00011100000100101001111001000101110100110101010001011001100001101011011111010011110010101010111000110100111101000100000001000010000010110010111000100", + "00100011110010100100110010001011100011010100000001001001001100001011010111000000010100010010100000001100100111100011000010000101000001100101000000010", + "11100100011011100110110110100110110001100000110111110100000101111000100101011111101010010100101110000010101001110010010110100000110000000001101110011", + "01011111100001111001010011101111111101011011011101001101111111000110110101001101101011111101000101100001000010101111101011111000111100011100111111111", + "10101000101000110100001100101000111000101000100010110000100010000110111000111000011010001110010100101001001100111000101100110111110001011000100011001", + "01111010101001001111101001011010111001101111010110010010101011001000000110011010101010101000011010101111100010111010111001010110000000111001101011001", + "10001000101101010000001000001000100110000110000011000011100011001110001101101010011110001011111001001100000001001000100000001110001000110101100010101", + "10011111101101011100100110001111110001100110111110100001111110101011010000100010000111111001001001010100111001001111110110001101011111110110111110010", + "10101101010010000111001111111100100010000011100111101111010101011101101001100101000011001100001110000010001011100100101111110100101100000100010010010", + "01001111111111010001011111100000001110111001101100100101100001100110111010101101111110101111001101100001001010000011110111101000100100001000011001111", + "00110001000000111101101101100100001010111011101100101111101100100011111110000100110000010111110101011001110010111100100101111011110011011011000001000", + "11100110010111000111100101011001001011101101101011111010000101110000000011111011011000010011110011010111110100010001110101001110010010101010001111001", + "11001001000101010001100001010011010101000101001111011100000011101011010101010101110101111011111001000100100001010100100001011010000100110100000100100", + "10100011110010011100110010001000000010110100001101001001001100010011001101000001110011000011000001110100111001101001100010001101000011100010010100010", + "00111000111011100110111110111000110000110000110101110100010111111000100011011100101011001101001111111010110111100000010110111000110110000011111010011", + "11110010100000110001001011101000011100001011010011001100110011000110100101001111101110100100100100111001010100100100111011100000101010011011011001111", + "01110101001001011101010100110111111001011000111110110101101110000110100010111110011000010111010101011001010000111111110100101111101111011111001001001", + "11111010101001100110001001010110111000001111011100010010010111010000011100011011001000011001111011010111111100110101000001011110011010111110101111001", + "01010001001101010000000000010001100111010110000101000010100001001110000011101001011101111010011000110100011111010001001000010110000110110110101100101", + "00110011001100011101011110000010010000110110110110100001011110101011010000100000000011001000101000001100101111001010101110010101000001110001010100010", + "01111000010011100111010111100101100011110011111101101010110101011101110011100011000011001101001110010010010011100010010111101100110010000010110010010", + "11001110011111110000111111111101101111111001100010100100100001111110101000101100011110101110101101111001010010000100001111100000101110001111111001111", + "11100100100000111100100101100011101011001011101000101111001100100011101000000111110000010110010101000001101010111011001101100011101101011000100001000", + "01001110010110000111111101011110101010111101100101110010000101110000001011111001011000010010010011001111100100010010001101010010011100101101101111001", + "00011100100100110000011001011010010101010101010011010000000011101111000111010010010101111010111000110100111101010010011001000100000010110100100100100", + "00100111110010111101110010001101100011110100000111011001001100001011000111000000110011000010100000001100100111101110011010000011000001100001110100010", + "11100101111011100111110110100111010000100000110011111100010111111100110101011111101011001100101110000010101001100111111110100010110000000100011010011", + "01011110100001110000110011101111111100111011011011000100110011000110111101001101101110100101000101100001000010100111000011111010101100011000111001111", + "01100001001000111100001100111110111001001000100110101001101110000000101000111101111000010110010101001001001000111001001100110111101001011111101001001", + "00111010101001000110001001001011011000101111010100001010010111001000011110011111101000011000011011001111100100110010111001010110011000111111010111001", + "01110001001111010001001000001110000110000110000101000010100001001100000101101101011101111011111000101100000111010110100000001110000000110111010100101", + "01000111001001011100100110001111110001001110111110111001111110101011010000100110000011111001001000010100111111001111110110001001000111110100111110010", + "00000000110010000110101111101000100010001011100101110110100011011011110001100010100110001100010110000010001011111000101111110010110100000101100010010", + "11111110011011010000011111111010101110001001101010111100101011100110101010101111011110101111010101100001001010011010110111101110101100001000101011111", + "10000010100000111100101101111000100011111011101000101110100010100111101110000010110010001111101101011001110010101000100101111001101011011011100011000", + "10111010010101000110000101011111111010010101101101110010111111110000001011111111011011111011100011010111110100011111110101001100011010101110111111001", + "10111010100001010001100001001000001100111101001011000100110011101101000101010110010000100011111000110100111101001100100001011010000100110011100000100", + "10111010110110011101010010001111111011100100000111010001001110010011000101000010110000010011000000001100100111101011100010001101000011100101011000001", + "10000010111101100111111110101110101000100000111011110100010111111010110011011001101110011101001110000010101001111011010110111000110110000000001110010", + "11111110000100110001001011101001110100100011110011010101100001000110111111001001101101111100100101100001000010100111011011100100101011011001001101110" + ] + }, + "34": { + "0": [ + "111111101110001000010011101111010100111111011100011100010000101001000010110111101000010110111011111001010011111101000100011011011011011011011101001111111", + "100000101101100101000011100101101011011001000100110000101110011110100111110100111110010101000011000001101011000111110000011000001101011000001011101000001", + "101110100101011011111011100111101111101011001110000010101000001111010110000101001111100101001101001111100101001001111001111000111000111000111001001011101", + "101110101011000111011111010100111100110001011000101110001010110110000110101000010111101000110100100100100100100010111101000100100100100100100100101011101", + "101110100110100000110111101100011111111100110000000011100000111111000001101010000101111011111001001001001001001000101111101001001001001001001101001011101", + "100000100111110000101100000110111000110101100011010111111011100010000011010111100101001110001111100101001111100100111000111000111000111000111000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001010011011101011111000101000101101101110001111010101100011110010100110010100111110001001101011000001101010111000101101011000001101011001100000000", + "101101110000100001011111111101011111111101101000010101011011111110001011010110100001011011111111100101001111100100001111101101101101101101101101001001011", + "011110001110001000010011101010111100111111011100011100010001001001000010011111101000010011100011111001010010111101001010111011011011011011011011010101010", + "011001110101100101000011100001010110011001000100110000101110011110100110010100111110010100111011000001101010100111110111111000001101011000001100110101101", + "010111001101011011111011100111100010101011001110000010101000001111010111100101001111100000110101001111100100101001110110011000111000111000111000011011100", + "001011111011000111011111010010100100110001011000101110001011110110000111101000010111101001000100100100100101000010111110100100100100100100100100011100100", + "110010010110100000110111101110010001011100110000000011100001000101000001101011000101111111010001001001001001001001000001101001001001001001001001001111001", + "000001111111110000101100000010101000010101100011010111111010010100000011010110000101001110011111100101001111100101001011011000111000111000111000010000001", + "100011000111110110000110110001010001000000000011100010111001000000011111001010011001010111111100000110101100000110100111000000110101100000110100010010101", + "100100111011111010000101000110001001000110110011001110000001100011011000001101011010000101001100111110010100111110010000110110110110110110110110001101010", + "101000011000111110100100111100001010001001101010101010100111110111111100101001111110100101001101001111110100001011111100001101101101101101100101100010000", + "110100111000001000101111101100111011110100101001011101000011111011010011111001010011111001001110101100011111001010011010010101100000110101101001111001100", + "001100010110000000100001011100111001110000010101011001110011010100010100111110010100111011110110010100100111110010101101000011100011100011111011100001011", + "111101100101110001101000000100010010000111101110011000111101000000100001011110100001011111110010010010001011110100001000010010010010010010001011001011010", + "011011011011001101011010000011111100110001011101101110001100101000101100000110101100010010111100100100100100100100101100000100100100100100110101000010100", + "011010100100101011110110011001110011001110111000001100100001001111011000001101011000010101000100111110010100111110010000000011100011100011100010001010010", + "010001011001000000111000000111100111110110110101010100001111110110101001111100101001100001001010110000011010110000010001110110000011010110000010100100011", + "001101110110010111110000101011100100101011011110100011110100001110110101100000110101101000100001010011111001010011111101011011011011011011011011100001111", + "110111010011100101101111100111010001010010110001110001110100101100100111110010100111111110010110010000101111010000100111010110110110110100111110111001011", + "000110111110111110000001011010001101000010011111101011110101001101100101001111100101001111111000011100101001111100101100100011010110000001011111001111010", + "101001001011101101001100110001010100011101111000110100010110111001111001010011111001010110011011111111001010011111000000101110001110001000010110001100110", + "101110111110101010111011011111001001011100110101000011111110011011111010000101111010000100101001001111010000101111010011001001001001001111010000010000001", + "100001001101111011110100110101001010000111101011011000101010011110011010110000011010110100001010010010010010010010011010110010010010010110000011110100010", + "110111101001000110010011110100011110100011010101100001000100100010110101100000110101100000101001010011111001010011111101101110001110001110001111100111111", + "001010000010011001100011011100111100101101101110001111011100101101110010100111110010100010010001101011000001101011001010101101011000001101011001111111000", + "110011111000100101000110011101011111111101101000010111000010111110000011010110000011010111111111100101001111100101001111101101101101101101101101111111001", + "011010001110001110000010001010101000111111011100011000011001100011001010011111001010011110001010111101000010111101011000111011011011111001010010100010110", + "011110101101100001011010000001011010111001000100110000101110101010111110010100111110010110101010100111110010100111101010111000001101111010000100101010001", + "011110001101011011111010000111101000101011001110000100100001100011001111100101001111100110001100101001111100101001101000111000111001011110100001100010000", + "000011111011000011010110110010111111110001011000101000010011111110010111101000010111101011111101000010111101000010111111100100100101000010111101111111100", + "111000011110100010101111101110010001011100110000000101110001000011000001101011000001101101001001001001001001001001011000001001001000001101011001001101001", + "000000101111110010100101000010110010011101100011010011110010110110000011010110000011010011001111100101001111100101011100111000111000111000111001100011001", + "100100001111110100001110110001001011100000000011100010110000111010011111001010011111001001001100000110101100000110110011100000110101100000110100011000101", + "101000100011011110011101000110010001100110110010101100011001010101011000001101011000101001110100111110010100111110010100110110110110110110110110100000010", + "101101000001111000110100111100001010011001101011001110101110100001111100101001111100001011110100001011110100001011100001001101100101001111100100001010000", + "110011111000101100110111101100100100111100101001011101000011101001010011111001010010011010111111001010011111001010001100010101101000010111101001000011100", + "000110000110000000100001011100100011011000010100111111111010101110010100111110010101011011000111110010100111110010111000000011111010000101111011101011011", + "110101111100010101100000000100001110001111101111111110100101110110100001011110100000011101001011110100001011110100001001110010001011110100001011100101010", + "010101010011001111000010000011111101101001011101101000011100101110101100000110101100000000100100100100100100100100110101100100110101100000110100100000100", + "011011110101001001111110011001101000010111011000101000101001101101011000001101011000001000010100111110010100111110000111100011100011100011100010111000010", + "010010011001000010111000000111111101000110010101110100000110001100101001111100101001111111111010110000011010110000000101010110000011010110000010101110011", + "000101101110110011110000101011111100111011110111000001110100111000110101100000111101000100011001010011111001010011111001001011011011011011011011001101111", + "010110011010100011101111100111010000000010011000010101110101111010100111110010101111010000101111010000101111010000111010001100111110010100111111010001011", + "110101101110011010000001011010010011001011101111101011110101011111100101001111111100101100001001111100101001111100111010111001011110100001011111110101010", + "011011001011101101001100110001001111110100000001010010010111000011111001010011100000110110101010011111001010011111010101100000010111101000010110000110110", + "001110100111001110111011011111010101010101011100100101111110101101111010000101101011000110010000101111010000101111010010100111010000101111010000110110001", + "010011000101111001110100110101001011011111100011011110101010011000011010110000011010110110010010010010010010010010001011010110000011010110000010000110010", + "000110111100100100010011110100000101111011011111000101000100000000110101100000110101100101111001010011111001010011100010001110001110001110001111001101111", + "111001000100011001100011011100100110011101101100101111011101010111110010100111110010100100100001101011000001101011000110001101011000001101011001101101000", + "100011111000000101000110011101011010001000000111110111000010001110000011010100001011110010101111100101001111100101010111111100101101101101101101100011001", + "111011010011001110000010001010100101101011010011111000011000010111001010011101000010111101000010111101000010111001000111100000110011111001010010100100110", + "101110110111000001011010000001000000010110110110110000101110000100111110010010100111110111010010100111110010100001100001100011100101111010000100111110001", + "101101011011011011111010000111111001000000110111100100100001110101001111100011010110000000011100101001111100101111100011010110000001011110100000110000000", + "100011111110100011010110110000101111111110110011001000010011111110010111101100000110101011111101000010111101000100111111101010011101000010111101111111100", + "001010001110100010101111101100011000100110111010000101110000100011000001101011000001101110001001001001001001001001011000101101011000001101011000100011001", + "110010101110000010100101000000101010101101101101101011110010101010000011010110000011010110101111100101001111100101001010111000111000111000111000101011001", + "010110001101100100001110110101001000110110000001011010110000100010011111001010011111001110001100000110101100000110111000100000110101100000110100100010101", + "111011111011001110011101000100011111110011011110101100011001111111011000101111010000101011111100111110010100111110001111100111110010110110110110111110010", + "001101011101101000110100111000010110011101100001010110101111010101111100001011110100001001001010001011110101001111110001110110000011001111100101000100000", + "000001110000110100110111101000110101111011011011001101000010101101010010011111001010011100100001001010011110101100010101101110001110010111101001000001100", + "110111010000001000100001011010110000011011101100101111111011001010010101011000001101011000010001110010100110010100101111101101011000000101111010011001011", + "010110111000010101100000000010001101001000000101110110100101101010100000011010110000011001111111110100001010010010010101011100101001110100001010110111010", + "100101001011000111000010100111110100101011010111110000011100011100101100000110101100000000011100100100100100100100111001000000110101100000110101110100100", + "101010111101011001111110011001101000010110110110100001001000111011011000001101011000001110101100111110010100111110000010000011100011100011110010101000010", + "100001001011010010011000000111101011000000110111110100000111011110101001111100101001111100001010110000011010110000001010110110000011010110010011000100011", + "010111101110100011010001101001101111111110110011000001010100100010111101000010111101000100101001010011111001010011110101101010011111000011011010000111111", + "010110000110101011001110000011001011000110111010011101010100001110101111010000101111010010010001001000111110010100101010101101011000001100110110011110111", + "110111100110000010000000011110000001001101101101111011010100011011111100101001111100101010010111100100110000011010100011011000111000111001010111110010110", + "011010011101100101001100010111011011110110000001000011110110100111100000110101100000110101111100000111010011111001000010000000110101100000001111110011010", + "001101100011001111100010111001010000010011011110101101100110110001101011000001101011000010100100111111001001001001001110000111110010100110001000101011001", + "010011011101110000000100010001000000011101100001000110010010101010011010110000011010110110101010010010010010010010001111110110000011010111110010000100010", + "000111110000110100110111110100000111111011011011001101100011010110110101100000110101100011000001010011111001010011101111101110001110001000101110100101111", + "111010010000001000101000011100110010011011101100101110000100000101110010100111110010100111010001101011000001101011010001101101011000001010111000111111000", + "100001111000010100110111011111011101001000000101110110100100010100001011110100001011110010011111100101001111100101000011011100101001111010001100010001001", + "111011000011000110101001101110100110101011010111110000101011100010000010111101000010111111111100100000110011111001000111000000110101100110111010010011010", + "101100110101011001000101000101011010010110110110100000000011000001000111110010100111110001011100111000001011000001111000000011100011100001101101001001101", + "101100011011010001101000100001101001000000110111110101011110010000110110000011010110000011010010110110000101001111110000110110000011010000011000000101100", + "100000101110100100000111010100111011111110110011000000010101011100100110101100000110101111010001010101100100100100100101101010011111001100000100000110100", + "001000000110101011011111001010011011000110111010011101001101110001100001101011000001101101101001001001001001001001010010101101011000001001001000011111001", + "110001101110000100011101000010110001001101101101111001010001100000000011010110000011010101110111100101001111100101011011011000111000111000111001110011001", + "010111010101100001000111111001011111110110000001000101111001101000011111001010011111001010111100000110101100000110111110000000110101100000110011010010101", + "111011111011001111101010011100001111110011011110101001111001111111010000101111010000101011111100111110010100111110011111100111110010100111110001111110010", + "001110001101110000011101010000001000111101100001000010011110100010110000001011110100001010001011010110000011001111111000110110000011110100001010100011100", + "000010101000110010101010101000101010111011011011001111101111101010101100011111001010011110101000110101100000101100001010101110001110101100000110101010000", + "110110001000001000110011110010101000111011101100101100000101100011101011011000001101011110001000001101011000010100101000101101011001101011000000100010111", + "010111111000010010110001101010001111101000000100010110100010111110010010011010110000011011111110000011010110010010001111111100101000011010110000111110010", + "100111010011100010110010111111101011101011010110010010100000100010001110000110101100000100101100100100100100100100100101100000110100100100100100100110100", + "101010110100011011000110000001110011000110110110000110001011101111011000001101011000001000010100111110010100111110001010100011100011100011100011011110010", + "100011001011010011110001001110101001000000110110010101001111011010101001111100101001111100000010110000011010110000011011010110000011010110000011110010011", + "010110110110000010000111111000100111100110110010000100010101000110111101000010111101000111100001010011111001010011110110001010011111001010011110010011111", + "010101000111001011000110010011100110001110111010111001000100110001101011000000101111010110111000001101011000001100110000001101010000101111010000101010101", + "110111111110000100011100011110100000011101101100011001011000001010011010110001111100101110110110000011010110000010101001111000110000011010110001000100101", + "011011011101100101011110011110010111100110000000000001101000010110000110101101100000110101000101100000110101100001000101100000101100000110101100100101001", + "001110111011101001101010110001000010001011001111001101111001000101001001001001101011000101010101011000001101011001000011100111101011000001101010011111010", + "010001000101010100000100001000111101000101101000000100010110010100111000111000011010110010011010010010010010010010010011010110010010010010010010010000010", + "000111111001110110101011101100011110101011010011001011100110000010110101100000110101100101111001010011111001010011100111001110001110001110001110110011111", + "111000010000001000101010010101110010011010101101001110010100000001110010100111110010100111011001101011000001101011000000101101011000001101011000101001000", + "100000100000110100110001001110010001010001110100110010100011110000001011110100001011110001010111100101001111100101000000001100101001111100101000100101001", + "111000001010100110101011111110001011100011111111010100101001011100000110101100000010111010110101100000110101100000111100011010111101000010111101000111000", + "101111100101011111000111000101111010100110100111000010000011010001000001101011000111110100001101011000001101011000010011011001101011000001101010011111110", + "101100001011010011101000101000100001110001101110110111011110100000110000011010110110000010010011010110000011010110010010011000011010110000011010010011111", + "100001110110000100000111011100101110000101101010100000010100101000100100100100100110101001111000110101100000110101101110000100000110101100000111110010111", + "001011011110001111011111010011100110111001001011011111001101001111100011100011100001101001000001001001001001001001001000001001001001001001001001001011001", + "110001101111000000011101011010101000011001110101111101010000110100000011010110000011010011001111100101001111100101010001111000111000111000111000000101001", + "010101011001100101000111111000011110110101010110100011111001101100011111001010011111001010110100000110101100000110101101000000110101100000110101000100101", + "111001111101101111101010010101001010001100101111101001111000101011010000101111010000101010001100111110010100111110011011010110110010100111110011111110010", + "001101011100010000011101001000111100110101001011100010011111101010110000011010110000001100000011010110000011010110001010101101101011110100001011110001110", + "000011101110110010101010101000010111101011001000101111101110111100101100000110101100011001100000110101100000110101111110110101100110101100000111110010011", + "110100010010001000110011110011111011001110110001101100000101111011101011000001101011011001001000001101011000001101001001000011100001101011000001001000100", + "010111111110110010110001101010011111110011011010010110100010111110010010010010010010011111111110000011010110000011011111110010010000011010110001111110001", + "100010001011100010110010111110011000110000100110110010100000100010001110001110001110000110001100100100100100100100111000100100100100100100100100100010100", + "101010101110011011000110000001101010100110101110100110001011101011011000001101011000001010101100111110010100111110001010100011100011100011100011101010010", + "100110001111010011110001001110101000100101100000010101001111100010101001111100101001111010001010110000011010110000011000110110000011010110000010100010011", + "011011111000000010000111111000111111100001000010011100010100111110111101000010111101000111111001010011111001010011101111111011011011001010011110111111111", + "010101011111000011000110010011110011001110010000100001000101000101101011000001101011000010010110001101011000001101001011110110110110101111010001111110101", + "110001100000000100011100011110100100111101111110010001011001010100011010110000011010110110011000000011010110000011001011000011010110011010110001010000101", + "010011011111110101011110011110000110100011011100011001101000100010000110101100000110101011111011100000110101100000101111001110001110000110101101010011001", + "000100110101111001101010110001010011001000000001001101111000000001001001001001001001001111011001011000001101011000010000101001001001000001101010101001010", + "011110000101011100000100001000111001000110010000010100010110010000111000111000111000111011010010010010010010010010000000010010010010010010010010000100010", + "000111101011110110101011101100000010001011000011001011100111101100110101100000110101100110110001010011111001010011100100001110001110001110001110011111111", + "111110000100001000101010010101111010011110111011001111110101001001110010100111110010100000001001101011000001101011011011001101011000001101011001000111000", + "101111101110110100110001001110001000010111110100101010000011011000001011110100001011110010010111100101001111100101010010001101101101101100101000001011001", + "111000010010101111001011111110011110100011111101001100101000100000000110101100000110101111111011111000110101100000100110011011011011011010111100000011000", + "101010111011011111000111000101111111100110100101001010100010000111000001101011000001101101000011000000001101011000010000011000001101011001101010001011110", + "100101001001000010101000101000110000010101101010101111111110010100110000011010110000011101001101001110000011010110011001111000111000111000011011100101111", + "101001111000010101000111011100111110100101101100100001010101101100100100100100100100000010110100100101100000110101111101000100100100100100000111000100111", + "000101011110000111011111010011100010011101001011001110001101001011100011100011100011000000001001001001001001001001011011001001001001001001001001011111001", + "110001111101000000011101011010110100111101110101111101010001011010000011010110000010110000000111100101001111100101010010111000111000111000111000101001001", + "010011001001100101000111111000010111110011010110100010011110100100011111001010011110101101100100000110101100000110110110100000110101100000110100101010101", + "110100110101101111101010010101010011001100101111110001011010000011010000101111010001101011001100111110010100111110001001010110110110110110110011010110010", + "001110000100011001111011001000101000010101001011111010011110010111110000011010110000011011001101001111100011010110010000101101101101101101101010110111110", + "000111110110110010101100101000010010001011001000100111001011101011001100000110101100000110101110101100000000110101111101110101100000110101100111100010011", + "111110010010011001110011110011101011001110110001110100100001001110001011000001101011000000010110010100111000001101000010100011100011100011100000111100100", + "011111101110100011110111101010001110010011011010010111100011011010110010010010011010110000000010010010010110000011001011110010010010010010010001110110001", + "101000010011101010110100111110001001110000100110100011100000100110101110001110000110101101100100100100100100100100110110100100100100100100100100110100100", + "010000100110011011000110000001101011100110101110100110001010000001011000001101000001101011011100111110010100111110001001100011100011100011100011110100010", + "111010011111010011110001010110100011000101100000010100101000010010101001111100110000011011010010110000011010110000000000010110000011010110000010011010011", + "010101111000000010000111110000111111100001000010011100110111111110111101000010101100000111111001010011111001010011101111111011011011011011011010111111111", + "000000001111000010100000011011111000101110010000100001000101100010101111000001101011000110001110010100111110001101001000110110110110110110110111100010101", + "111111101000000100011010000110101010111101111110010001111100101011111100110000011010110010101000011010110000000011011010100011010110000011010110101010101", + "100000101111110100011110010110011000100011011100011001001100100011100000101100000110101110001011111001010011100000101000101110001110001110001111100011001", + "101110100101111000101100101001011111101000000001001100111000111111101011001011000001101011111001001001001001011000011111101001001001001001001000111111010", + "101110101101011100000010001000110100000110010000010101010110011000011010111010110000011110010010010010010010010110000010010010010010010010010010101010010", + "101110101011110110101011101100001010101011000011001011100110000000110101100110101100000101111001010011111001010101111110001110001110001110001111000011100", + "100000100100001000101010001100011011111110111011001111110011000111110010100001101011000101000001101011000001101101010000001101011000001101011000001011001", + "111111101110110100110001000110100000010111110100101010000000110100001011110000011010110011001111100101001111100011010001101101101101101101101100000101000" + ], + "1": [ + "111111101110000110111010110011110010000010111101000010111101001000000110101100000110101100111011111001010011111001010100011011011011011011011101001111111", + "100000100101110111001010110010111000110010100111110010100111101111000001101011000001101011000011000001101011000001101000011000001101011000001011101000001", + "101110101111010011111001111110010011011100101001111100101001110100110000011010110000011011001101001111100101001111100001111000111000111000111001001011101", + "101110101100011111001101000011010000111101000010111101000010101100100100100100100100100100110100100100100100100100100101000100100100100100100100101011101", + "101110101011000111110111010000011111101111010000101111010000111111100011100011100011100011111111010000101111010000101111101001001001001001001101001011101", + "100000100111010010101100100000001000101001111100101001111101100010000011010110000011010110001001111100101001111100111000111000111000111000111000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000010010111001111100110001000100111110010100111110011100011110010100111110010100110001111110010100111110010111000101101011000001101011001100000000", + "111100101000111011110011101111011111101111100101001111100101111110001011110100001011110011111011110100001011110100001111111100101001111100101001010011101", + "010000001110000110111010110011111101100100100100100100100101000110000110101100000110101011100011111001010011111001001010100010111101000010111101010101000", + "101011110101110111001010110010111101010100111110010100111110010001000001101011000001101110111011000001101011000001110111100001101011000001101010110101110", + "101011011111010011111001111110000100011010110000011010110000001010110000011010110000011010110101001111100101001111100110010000011010110000011010011011111", + "111000100100011111001101000011010111011101000010111101000011110110100100100100100100100111000100100100100100100100100110101100000110101100000110011100111", + "111111010011000111110111010000001111101111010000101111010001000101100011100011100011100001010111010000101111010000111001101001001001001001001001001110101", + "111111111111010010101000110000000011101001111100101001111100010100000011010110000011010010011001111100101001111100110011011000111000111000111000010000101", + "101101001001100010100100001010011101101010011111001010011111000010011111001010011111001111111010011111001010011111000111000000110101100000110100010011001", + "010101101011100000001110100100001101010100111110010100111111100001010000101111010000101101011000101111010000101111010000100111110010100111110010001101010", + "100101001000111000001010011101101011010010010010010010010011110000110000011010110000011101010101001111100101001111111100010100001011110100001011100011010", + "000110101000000010100111001110110000111001010011111001010011111100101100000110101100000011010110101100000110101100011010001100000110101100000111011001011", + "110000000100001001000000100101111111000001101011000001101011010001101011000001101011000001101110010100111110010100111101001011000001101011000001000000000", + "001110110000111001011101111101000001101011110100001011110101000000010010010010010010010001110010010010010010010010010000011010110000011010110000101011101", + "010010011110101010111100101101000010000010111101000010111100101000001110001110001110001100111010111101000010111101010100000100100100100100100100100010100", + "100100100100001001010011100011011000101011000001101011000001001111011000001101011000001001000010100111110010100111101000000011100011100011100011001010010", + "011011011111010100010010111100101011000101001111100101001111110100101001111100101001111001001100101001111100101001110001110110000011010110000010100100011", + "111000100110001101100011001001100000100000110101100000110100001100111101000010111101000000110101000010111101000010111101101010011111001010011111100001111", + "111110010011100011010001000110110000011000001101011000001100101010101111010000101111010110001110010100111110010100100111101111010000101111010000111000111", + "110100111110110100010001111000000110001111100101001111100101001011111100101001111100101101100000011010110000011010101101011010110000011010110001101110110", + "011001001001100100101101001000010010101100000110101100000110111101100000110101100000110100000011111001010011111001010001000110101100000110101100101101010", + "010101101011100010000110100110011010110000101111010000101110011011101011000001101011000010111001001001001001001001001010000001101011000001101011110001001", + "100100001000011100001010011011110100110100001011110100001010011110011010110000011010110010010010010010010010010010000010110010010010010010010010010100010", + "000101101001100100111110001110110101000110101100000110101100100010110101100000110101100100110001010011111001010011100101101110001110001110001110100111111", + "001000000100001111001001100111110110011110010100111110010100101101110010100111110010100010001001101011000001101011001010101101011000001101011001111111000", + "000111111000111011010101111111011111110110000011010110000010111110001011110100001011110111111111100101001111100101001111101101101101101101101111111111001", + "011010001110001110111100101011001000110101100000110101100001100011000010111101000010111110001011111001010011111001011000111011011011011011011010100011010", + "101010101101101111001010100011011010110100111110010100111110101010100111110010100111110110101011000001101011000001101010111000001101011000001100101011101", + "100010001111110000011011111110101000111010110000011010110001100011010110000011010110000110001101001111100101001111101000111000111000111000111001100011100", + "110011111110001001100010101001111111111101000010111101000011111110000110101100000110101011111100100100100100100100111111100100100100100100100101111110100", + "110101001011100101011000000110100011001111010000101111010001000011000001101011000001101101011001001001001001001001010000001001001001001001001000001011001", + "110001101110000110000000111000011101010000011010110000011010110110000011010110000011010011010111100101001111100101010100111000111000111000111000000111001", + "100110001100000110000001001011100100110011111001010011111000101010011111001010011111001001010100000110101100000110101011100000110101100000110101111000101", + "111100101100101101011100011010100110001101011000001101011001001101010000101111010000101001101100111110010100111110001100110110110110110110110111000000010", + "001110001010011000010001110000010000000011010110000011010110111001110100001011110100001011100101001111100101001111110001001101101101101101101100001111100", + "100110100010011011101111000101100011111001010011111001010011100001001010011111001010011010100110101100000110101100001100010101100000110101100001000100000", + "101000001101101111111000110011110001000001101011000001101010100110001101011000001101011010111110010100111110010100111000000011100011100011100011110100111", + "110111110001100110000101010000111101001011110100001011110101110110110000011010110000011100110010010010010010010010001001110010010010010010010011111010010", + "111000001010101111000011001111001110100010111101000010111100101110101100000110101100000001010100100100100100100100111101100100100100100100100101111000100", + "001010110011100110100100101000100110001011000001101011000001101101011000001101011000001001001100111110010100111110001011100011100011100011100011001000010", + "110000001110100101000101111001100010000101001111100101001110011100101001111100101001111111100010110000011010110000011011010110000011010110000011001110011", + "000001100001001001010111101111001011100000110101100000110100100000111101000010111101000100000001010011111001010011100111011011011011011011011010101101111", + "010101010101001011101100110011000011011000001101011000001101100010101111010000101111010000111110010100111110010100101000010100111110010100111111010100111", + "010000110110101101011011110011111101001111100101001111100101010111111100101001111100101100010000011010110000011010111000100001011110100001011111110010110", + "000101000000000010010101011110010100101100000110101100000111001011100000110101100000110111010011111001010011111001010101101000010111101000010110011001010", + "101100101010111101011110001011100110010000101111010000101110101101101011000001101011000111101001001001001001001001010010101111010000101111010000100001001", + "001010011100011001110101111001111000010100001011110100001010011000011010110000011010110111100011010110000011010110001011110110000011010110000011001110010", + "100111111110001011001001000101001011100110101100000110101100000000110101100000110101100100100000110101100000110101100110101110001110001110001110100101111", + "100011010101111110011110100010111001011110010100111110010101000111110010100111110010100100111000001101011000001101000001101101011000001101011000010101000", + "110011110111111111100001011001111101010110000011010110000010010110000011010110000011010010110110000011010110000011010000001101101101101101101100011011001", + "110100011000100110000001011110101110110101100000110101100000001111001010011111001010011101000011111001010011111001001100111001010011111001010010011001010", + "000111101101110110000000101000100110010100111110010100111110001100111110010100111110010111010011000001101011000001101011111010000101111010000101001001101", + "111011010110110100100011101000100010011010110000011010110001111101001111100101001111100001111101001111100101001111111011011110100001011110100001001111100", + "001111111111010000110011100110001111111001010011111001010011111110010111101000010111101011111100100100100100100100101111100010111101000010111100111110100", + "010010001111000010101110100010111000101001001001001001001000100011000001101011000001101110001000001101011000001101001000101101011000001101011001100011001", + "010010101000111101111111110011111010110110000011010110000010101010000011010110000011010010101110000011010110000011011010111000111000111000111000101011001", + "001110001000010001111011101111011000110101100000110101100000100010011111001010011111001110001101100000110101100000111000100000110101100000110100100010101", + "101011111100000100111011100010101111101101011000001101011001111111011000001101011000001111111101011000001101011000001111110110110110110110110110111110010", + "100011010110010100110111001000001011000011010110000011010111010101111100101001111100101110101101001111100101001111110001101111100101001111100101011011100", + "111000101000011101111100000011000000111001010011111001010010101101010011111001010011111011010110101100000110101100010101010111101000010111101001011000000", + "010010010100001011110000010001111000000001101011000001101010001010010100111110010100111101001110010100111110010100101011000101111010000101111010001000111", + "101010101001000010001100110110100110001111100101001111100100001010100001011110100001011001100010010010010010010010000010110100001011110100001010101110010", + "001111000010101001011010101101011010100100100100100100100101111100101100000110101100000000000101100000110101100000100110100000110101100000110101101100100", + "111001110011100010111101101100100010101101011000001101011001011011011000001101011000001110101101011000001101011000011001000011100011100011100010111000010", + "001011010110100011001101011101110100100011010110000011010111011110101001111100101001111110001011010110000011010110010000110110000011010110000011011100011", + "010101100001101001010110001111010101000000110101100000110100100010110101100000110101100110101000110101100000110101110101111011011011011011011010000111111", + "011010001101001111101100010011000000011000001101011000001100001110100111110010100111110100010110010100111110010100101010110110110110110110110110011111001", + "101110111110101011001010110101111110010110000011010110000010011011100101001111100101001100000000011010110000011010100011100011010110000011010111110111010", + "101101011001100110011101111100000101110101100000110101100001100111111001010011111001010001100011111001010011111001000010101110001110001110001111110100100", + "100000110010011001010111101101110101001101011000001101011001010001111010000101111010000010111001001001001001001001011111101001001001001001001001110100001", + "111001010100011111101100011011100100000011010110000011010111001011011110100001011110100110110010010010010010010010010110010010010010010010010011011010000", + "010100111110001111010000000001011111000000110101100000110100110111010011111001010011111011000001010011111001010011110110101110001110001110001111011101100", + "010000001101111000010110000110101111111000001101011000001100000100010100111110010100111101010001101011000001101011001001101101011000001101011000001111011", + "100011110111011111100000111001100011110110000011010110000010010100101001111100101001111000011111100101001111100101000011001101101101101101101100110001010", + "110111000000100010000001111110101101110101100000110101100001100011100000110101100000110001111101100000110101100000100111011011011011011011011011110010110", + "110101100101110000010001101110100101001101011000001101011001000000100111110010100111110111011101011000001101011000011000111000001101011000001100101100001", + "011011001111010000101011001010110011000011010110000011010111010001010110000011010110000111010011010110000011010110010100011000111000111000111001000010000", + "001101111111110100111010000000011000100100100100100100100100111100000110101100000110101111010000110101100000110101100010010101100000110101100000011001100", + "100010001111000100110111000000111111011110010100111110010100010000000101111010000101111101101001001001001001001001010101010000101111010000101110000001011", + "100010101000111001100110110111101001110000011010110000011010000001100101001111100101001101110111100101001111100101011000000001011110100001011111101011010", + "111101000000010101111011101011000010010011111001010011111001101001111001010011111001010010111100000110101100000110111100001000010111101000010111000010110", + "111011111100000100111011100010111111101101011000001101011001111111110010100111110010100011111100111110010100111110011111111110010100111110010101111110001", + "000010001110010100110111001000011000100011010110000011010110100011010110000011010110000010001011010110000011010110011000101101101101101101101100100010000", + "011010101000011101111000000010001010100000110101100000110101101011001010011111001010011110101000110101100000110101101010110101100000110101100000101011100", + "000010001100000011110010010001111000111000001101011000001101100010001101011000001101011110001000001101011000001101001000100011100011100011100010100011011", + "111011111001011011101010100110111111110010010010010010010010111110110000011010110000011011111110000011010110000011001111100011010110000011010110111111010", + "001101000010111001111110100100110101010011111001010011111000100011101000010111101000010100101100100100100100100100100101111101000010111101000010100110110", + "111010101111111010011111101101100000001011000001101011000001101110111110010100111110010000010100111110010100111110001010111010000101111010000101011110101", + "001010011110111010101001001100101110000101001111100101001111011011001111100101001111100100000010110000011010110000011011111110100001011110100001110111000", + "010101111111101001010100010110001101100000110101100000110101000110011111001010011111001111100001010011111001010011110010110011111001010011111000010100000", + "011010010111010110001010001011011101011000001101011000001100110000001101011000001101011110111000001101011000001101010111110110110110110110110110110100111", + "101100111100100011001100110100111100001111100101001111100100001011111100101001111100101110110110000011010110000011001110000011010110000011010111011010110", + "101101000001101110011111111100000111001100000110101100000110010111100000110101100000110101000101100000110101100000100110101110001110001110001110111101010", + "100000111010000000110001111101111111110000101111010000101111000101101011000001101011000101010101011000001101011000000001111000001101011000001100001111001", + "111001000100001111001000010010000011110100001011110100001010010100011010110000011010110010011010010010010010010010010011001011110100001011110100010000010", + "011010100010010111110010000000001101100110101100000110101100000010110101100000110101100101111001010011111001010011100111010111101000010111101000110011111", + "010011001101100001110010010111110101011110010100111110010100000001110010100111110010100111011001101011000001101011000000100101111010000101111010101101000", + "101000110001011111100010100000111011010110000011010110000011110000001011110100001011110001010111100101001111100101000100000101001111100101001110100011001", + "111011010010111011100111100110110000110101100000110101100001011101000010111101000010111011010011111001010011111001011010011011011011011011011011011001010", + "110001111111111000010111101111100111010100111110010100111111010000100111110010100111110101101011000001101011000001110101011000001101011000001100000001101", + "010001010111011000101001001010110001111010110000011010110000100001010110000011010110000011110101001111100101001111110000011000111000111000111000001011100", + "000001100111101101011100010000010010011101000010111101000010101000000110101100000110101000111100100100100100100100101100000100100100100100100101100010100", + "100111011111010100010011001001011000101111010000101111010001001111000001101011000001101001000001001001001001001001001000001001001001001001001001001011001", + "101000100100100001000100110110111011010000011010110000011010110100000011010110000011010011001111100101001111100101010001111000111000111000111000000101001", + "110110000000001100011111011000011000110011111001010011111001101100011111001010011111001010110100000110101100000110101101000000110101100000110101000000101", + "111111101011000010111001011011100000001101011000001101011000101011010000101111010000101010001100111110010100111110011111010110110110110110110111111000010", + "001101000100001101011000110100000110000011010110000011010111101011110100001011110100001101100101001111100101001111101100101101101101101101101101101111100", + "011100110011110100111111010011001010111001010011111001010010111101001010011111001010011000000110101100000110101100011000110101100000110101100001101100000", + "001010001011011110111101000011101010100001101011000001101011111010001101011000001101011000101110010100111110010100101011100011100011100011100011010000111", + "010111111100110001111110011010001111101011110100001011110100111110110000011010110000011111111010010010010010010010011111110010010010010010010011111110010", + "101010001011000010101011000101001000100010111101000010111100100010101100000110101100000110001100100100100100100100111000100100100100100100100100100010100", + "100010101110010111010100110001011010101011000001101011000001101011011000001101011000001010101100111110010100111110001010100011100011100011100011101010010", + "100010001111000101010101001101011000100101001111100101001110100010101001111100101001111010001010110000011010110000011000110110000011010110000010100010011", + "110011111010000110001100100101001111100000110101100000110100111110111101000010111101000111111001010011111001010011101111111011011011011011011010111111111", + "000100001010101110100010101000010111111000001101011000001100100100101111010000101111010011010110010100111110010100101001010110110110110110110111101110111", + "111000100101010101101001101011100011101111100101001111100100110101111100101001111100101110011000011010110000011010101010100011010110000011010111010000110", + "010110010111111010000011110011110101101100000110101100000111000011100000110101100000110011111011111001010011111001001110101110001110001110001111010011010", + "011111101101110011000001010001110101010000101111010000101110000001101011000001101011000111001001001001001001001001010001101001001001001001001000101101001", + "011100010001111100111011100010101011010100001011110100001010010000011010110000011010110011001010010010010010010010000100010000011010110000011010000010010", + "001111110011110010111011010100100000100110101100000110101101111100110101100000110101100111001001010011111001010011100010001100000110101100000110011001111", + "111001011100011110001110010110001001011110010100111110010101010011110010100111110010100001110001101011000001101011011101001011000001101011000001000001000", + "000101110100110000111010010011111111110110000011010110000010000010001011110100001011110011110111100101001111100101010000101011110100001011110100001001001", + "101101000111000011001111000101110100010101100000110101100001001111000010111101000010111110111010111101000010111101000100111111001010011111001010000001010", + "101111111110001110110010110000110100110100111110010100111111111000100111110010100111110101000010100111110010100111110001111000001101011000001100001001101", + "101100001001001100110101000101000010011010110000011010110001101001010110000011010110000101001100101001111100101001111000011000111000111000111001100001100", + "110110101000011110101100111100001001011101000010111101000011110100001110001110001110001010100101000010111101000010111100000100100100100100100101000100100", + "000111011010100111100000111001111001101111010000101111010001000011001001001001001001001000010001001001001001001001011111001011000001101011000001011111001", + "111001111101000100001101100010001111110000011010110000011011000010011010110000011010110000011111100101001111100101010100111010110000011010110000110001001", + "011100011001110011100011111011110100110011111001010011111000111110000110101100000110101101111100000110101100000110110000100110101100000110101100110010101", + "010010100111101011100001001000100100101001001001001001001001011001000001101011000001101001001100111110010100111110001011110000101111010000101111001000010", + "011011001001110101111001110011000010100101001111100101001111111001110100001011110100001001001100001011110100001011110110001001111100101001111100100101100", + "000010110011100011011111011101011001011111001010011111001010010101001010011111001010011000101111001010011111001010011010010101100000110101100001100110000", + "110111010010010101100110011100011001000111110010100111110010110010001101011000001101011110010111110010100111110010100101000011100011100011100010111110111", + "000000111110101000010011001000111111101011110100001011110101000010111000111000111000111100010011110100001011110100001000110010010010010010010011010010010", + "101010010111001100000101010110010100000010111101000010111100101110100100100100100100100101111100100100100100100100100000100110101100000110101101010010100", + "010000100110111011010110011101010100101011000001101011000000011001000001101011000001101011000100111110010100111110010111100001101011000001101011001010010", + "111010001110000101011101101101000010000101001111100101001110001000110000011010110000011011001010110000011010110000011110010000011010110000011011100100011", + "010101101010100010001100100001001111100100100100100100100100111110101100000110101100000111111001010011111001010011111111111101000010111101000011111111111", + "000000001011001010101011001110011000111110010100111110010101100010101111010000101111010110001111010000101111010000111000110010100111110010100110100010111", + "111111100101010111101001101111101010101001111100101001111101101011111100101001111100101010101001111100101001111100111010100011010110000011010110101010110", + "100000100111111100011011110101101000101010011111001010011111100011100000110101100000110110001010011111001010011111001000101110001110001110001110100011010", + "101110100101110011001000010011111111110000101111010000101111111111100011100011100011100011111000101111010000101111011111101001001001001001001001111111001", + "101110101001111010110011100000101111110100001011110100001011100010010010010010010010010110010010010010010010010010000000010010010010010010010011010011110", + "101110101011010110111011110000100100011111001010011111001011101110101100000110101100000101111001010011111001010011111000001110001110001110001110110010000", + "100000101101011110000110110110010100100111110010100111110011111001101011000001101011000101000001101011000001101011011110001101011000001101011000001010101", + "111111101100010100111010010111111100001011110100001011110101001000011010110000011010110011001111100101001111100101011111101101101101101101101100000100000" + ], + "2": [ + "111111100110100100000110101011011111011101011100010010111001011000001010101110000100000011000011111010110101111100110000000110101011100110111101001111111", + "100000100110110000111000110011111011100101000011000100010010001100110011100000011011001010000101101010001101000110001110000001101101100001001111101000001", + "101110100101110101001100011100101000100000110010100001100110100011101000110001000010111010100001011010000011001000000111110000011001010001111101001011101", + "101110100100000100101100011111111010000011011110111001000011110010001101001110101110111100111001011011100000100011100111101100000001001101100000101011101", + "101110101011001001101011000110011111110000110001111111010100111111100111000011101001101111111110010111011000010001011111101011000110001010100001001011101", + "100000100101101011100011101001001000111110011000011111001001100011101000111011000000010110001110110001010110011101011000111010110110111011010100101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001110101110010111000111111000111011101001111010111100100010110011101010011001100010001010000001011000010011001000101011000010001011100011100000000", + "001100111010110100011010101001111111110101101000001111110100111110111011111000011000001111111111101101010110010101011111111010110111111011010111011010000", + "101000000110100010000110101010011111011101011100010010111000011000001010101110000100000101000011111010110101111100110000000110101011100111001011010101000", + "000101101110110010111000110011110011100101000011000100010010001100110011100000011011001000000101101010001101000110001110000001101101100000001100001101110", + "100010010101110001001100011100101000100000110010111001100111100011101000110001000010111100100001011010000011001000000111110000011001010000111000100011111", + "010100100100000010101100011111110010000011011110111001000011110010001101001110101110111110111001011011100000100011100111101100000001001101100001100000111", + "000101001011001011101011000110110010110000110001100111010101110101100111000011101001101000101110010111011000010001011101101001000110001010100110111000101", + "011110110101101111100011101000001000111110011000011111001001010111101000111011000000010011011110110001010110011101010101011010110110111011010111010110101", + "010100000011000001111010101010011110010110000100000111010001010101011110000111110100001010010111101100110101111110110001000110101111100110001110010101001", + "111001101001101111000001110010011111101110110011011100101110011111100000100011000011010011010100110110001101001110001010000001101100100000001100001101010", + "011110010000010110110000011101101001101011101010110100001110101110111000011000110010110011110101001100000011001010000110110010011101010001111101100011110", + "101000100011011011010101011110111110001000101110101001111111100001011010001101110110100101101000000111100000101011100011101110000000001101100001100000011", + "111001001110101000010111000111110011111011101001100010111100111000110101101010011001100111111010000001011000010011011100101101000010001011100011111000100", + "100010110010110100011010101001000100110101101000001111110101000100111001111000011000001000001111101101010110010101010001011100110111111011010111010110001", + "101000000110100000000110101011011111011101011100011010111000011000001100101110000100000101000011111010110101111100110000000000101011100111001011010101000", + "000101101110110110111000110011010011100101000011000100010010001100110101100000011011001000000101101010001101000110001110000011101101100000001100001101110", + "100010010101110011001100011100101000100000110010111001100111100011101010110001000010111100100001011010000011001000000111110110011001010000111000100011111", + "010100100100000010101100011111110010000011011110111001000011110010001011001110101110111110111001011011100000100011100111101010000001001101100001100000111", + "000101001011001101101011000110110010110000110001110111010101110101100101000011101000001000101110010111001000010001011101101101000110001010100110111000101", + "011110110101101101100011101000001000111110011000011111001001010111101000111011000000010011011110110001001110011101010101011000110110111011010111010110101", + "010100000011000101111010101010011010010110000100001111010001010101011110000111110100001010010111101100101101111110110001000000101111100110001110010101001", + "111001101001101111000001110010011111101110110011010100101110011111100110100011000010010011010100110110010101001110001010000111101100100000001100001101010", + "011110010000010110110000011101101111101011101010101100001110101110111100011000110011010011110101001100010011001010000110110110011101010001111101100011110", + "101000100011011011010101011110111010001000101110101001111111100001011110001101110110000101101000000111111000101011100011101110000000001101100001100000011", + "111001001110101000010111000111110101111011101001100010111100111000110011101010011000100111111010000001000000010011011100101101000010001011100011111000100", + "100011111010110100011010101001001111110101101000001111110101111110111101111000011000101011111111101101001110010101011111111100110111111011010111111110001", + "101010001110100000000110101011001000111101011100011010111000100010001010101110000101000010001011111010100101111100101000100000101011100111001010100011000", + "000110101110110110111000110011011010100101000011000100010011101010110011100000011011001010101101101010010101000110011010100011101101100000001100101011110", + "100010001101110011001100011100101000100000110010111001100111100011101000110001000011011010001001011010011011001000011000110110011001010000111001100011111", + "010111111100000010101100011111111111100011011110111001000011111110001011001110101110000111111001011011111000100011101111101010000001001101100001111110111", + "000101001011001101101011000110110101110000110001110111010101111111100111000011101000111011010110010111001000010001000010001101000110001010100111001100101", + "011110110101101101100011101000001001111110011000011111001001101111101000111011000000010111110110110001001110011101010110111000110110111011010111100010101", + "010100000011000101111010101010001000010110000100001111010000100001011110000111110101110001101111101100101101111110101011100000101111100110001110000001001", + "111001101001101111000001110010010011101110110011010100101110111001100110100011000011100001111100110110010101001110001100100111101100100000001100111001010", + "011110010000010110110000011101101100101011101010101100001110100100100100011000110011110000001101001100010101001010011001010110011101010001111100010111110", + "101000100011011011010101011110111011001000101110101001111111011001001110001101110110110001000000000111111110101011100000001110000000001101100001010100011", + "111001001110101000010111000111100111111011101001100010111101001100111011101010011000001100000010000001000110010011000110001101000010001011100011101100100", + "100010110010110100011010101001001000110101101000001111110101100010110101111000011000101010100111101101001010010101010111111100110111111011010111100010001", + "101000000110100000000110101011011010011101011100011010111000010010010010101110000101001110111011111010100011111100101111100000101011100111001010100001000", + "000101101110110110111000110011010110100101000011000100010010110100110011100000011011011100101101101010010011000110001101100011101101100000001100111001110", + "100010010101110011001100011100111100100000110010111001100110010111110000110001000011010111011001011010011101001000011101010110011001010000111000110111111", + "010100100100000010101100011111111110000011011111111001000011010100011011001110101110011100010001011011111100100011100001001010000001001101100001010100111", + "000101001011001101101011000110110111110000110000010111010101111111110111000011101000100011010110010111001110010001000010001101000110001010100111001100101", + "011110110101101100100011101000001101111110011001011111001001101111111000111011000000000111110110110001001000011101010110111000110110111011010111100010101", + "010100000011000100011010101010001010010110000100101111010000100001001110000111110101100001101111101100101011111110101011100001101111100110001110000001001", + "111001101001101110100001110010010011101110110010110100101110111001110110100011000011110001111100110110010001001110001100100110001100100000001100111001010", + "011110010000010111110000011101101100101011101011101100001110100100101100011000110011111000001101001100010101001010011001010111111101010001111100010111110", + "101000100011011011110101011110111011001000101111001001111111011001001110001101110110110001000000000111111110101011100000001111100000001101100001010100011", + "111001001110101001110111000111100111111011101001000010111101001100100011101010011000001100000010000001000110010011000110001101100010001011100011101100100", + "100010110010110101111010101001001000110101101001101111110101100010101101111000011000101010100111101101001010010101010111111101010111111011010111100010001", + "101000000110100001100110101001011010011101011101011010111000010010011010101110000101001110111011111010100011111100101111100001001011100111001010100001000", + "000101101110110111011000110111010110100101000011100100010010110100100011100000011011011100101101101010010011000110001101100010001101100000001100111001110", + "100010010101110011101100011010111100111000110010111001100110010111111000110001000011010111011001011010011101001000011101010110111001010000111000110111111", + "010111111100000011101100011011111111101011011111011001000011111110011011001110101110011111111001011011111100100011101111101011100001001101100001111110111", + "000110001011001100101011000110111000100000110000110111010100100011110111000011101000100010001110010111001110010001001000101100100110001000100110100010101", + "011110101101101100000011101110001010101110011000111111001000101011111000111011000000000010101110110001001000011101011010111001010110111101010110101010101", + "010110001011000101011010101000011000111110000100001111010001100011001110000111110101100010001111101100101011111110111000100000001111100110001110100011001", + "111011111001101110000001110110011111111110110010110100101110111111110110100011000011110111111100110110010001001110001111100110001100100000001000111111010", + "011110010000010111110000011111100000110011101011101100001111000010101100011000110011111000100101001100010101001010010111110111111101010011111111000011110", + "101000100011011010110101011110111010001000101110001001111110010011001110001101110110110100111000000111111110101011110111001111100000001111100111000000011", + "111001001110101000110111000001110110110011101001100010111100010100100011101010011000001000101010000001000110010011001101001101100010001101100110011000100", + "100010110010110101011010101101001100111101101001101111110101110110101101111000011000101100111111101101001010010101000100111101010111111101010010110110001", + "101000000110100001000110101001010110001101011101011010111001110100011010101110000101001111010011111010100011111100100000100001001011100001001101110101000", + "000101101110110111011000110011010111100101000011100100010011111110100011100000011011011000110101101010010011000110011011100010001101100010001010101101110", + "100010010101010011101100011010101101101000110010111001100111001111111000110001000011010011010001011010011101001000010110010110111001010110111011000011111", + "010100100101100011101100011011111010001011011111011001000011000000011011001110101110011010001001011011111100100011110010001011100001001011100110000000111", + "000101001010101100101011000100111011100000110000110111010100011001110111000011101000100010011110010111001110010001001101001100100110001100100000011000101", + "011110110101101100000011101000001100111110011000111110101000100101111000111011000000000011001110110001001000011101000000111001010110111001010001110110101", + "010100000011000101011010101100011011011110000100001110110001111001001110000111110101100100000111101100101011111110100000100000001111100000001101110101001", + "111001101001001110000001110110010111100110110010110101101110101101110110100011000011110111000100110110010001001110011111100110001100100110001011101101010", + "011110010001010111110000011111100000111011101011101100101111000010101100011000110011111001000101001100010101001010010110010111111101010111111011000011110", + "101000100011111010110101011110111010001000101110001000011110010011001110001101110110110101111000000111111110101011110110001111100000001111100111000000011", + "111001001110101000110111000001110110110011101001100011111100010100100011101010011000001001101010000001000110010011001101001101100010001101100000011000100", + "100010110010010101011010101101001100111101101001101111010101110110101101111000011000101100011111101101001010010101010100111101010111111101010000110110001", + "101000000110100001000110101001010110001101011101011011111001110100011010101110000101001111110011111110100011111100111000100001001011100001001101110101000", + "000101101111010111011000110011010111100101000011100101110011111110100011111000011011011000010101101110010011000110000011100010001101100010001010101101110", + "100010010101110011101100011010101101101000110010111001000111001111111000101001000011010010110001011000011101001000001110010110111001010110111011000011111", + "010100100100100011101100011011111010001011011111011001000011000000011011011110101110011010101001011101111100100011100010001011100001001011100110000000111", + "000101001011001100101011000100111011100000110000110110010100011001110111001011101000100010011110010001001110010001010101001100100110001100100000011000101", + "011110110100001100000011101000001100111110011000111110101000100101111000111011000000000011001110110101001000011101011000111001010110111001010001110110101", + "010100000011000101011010101100011011011110000100001111110001111001001110001111110101100100000111101110101011111110111000100000001111100000001101110101001", + "111011111001001110000001110110011111100110110010110100101110111111110110101011001011110111111100110110010001001110001111100110001100100110001011111111010", + "011110001000010111110000011111101000111011101011101101001111100010101100001000110011111110001011001110010101001010011000110111111101010111111011100011110", + "101010101010111010110101011110111010101000101110001000011111101011001110001101100110110110101010000101111110101011111010101111100000001111100111101010011", + "111010001110101000110111000001101000110011101001100010011101100010100011100010010000001110001000000101000110010011011000101101100010001101100001100010100", + "100011111010010101011010101101001111111101101001101111110100111110101101110000000000101011111011101011001010010101011111111101010111111101010001111110001", + "101000000110100001000110101001011010001101011101011011111001000000011010111110011101001100101001111000100011111100111010000001001011100001001101000001000", + "000101101111010111011000110011010011100101000011100101110011111000100011100000000011011010011011101000010011000110011101000010001101100010001011011001110", + "100010010101110011101100011010101100101000110010111001000111100001111000111001001011010111001101011110011101001000011000110110111001010110111011110111111", + "010100100100100011101100011011101011001011011111011001000010111100011011000110100110011000000111011101111100100011110000101011100001001011100110010100111", + "000101001011001100101011000100110111100000110000110110010100101101110111010011100000100001000100010101001110010001010111101100100110001100100000111100101", + "011110110100001100000011101000001000111110011000111110101000100011111000111011010000000001000000110011001000011101000110011001010110111001010000001010101", + "010100000011000101011010101100011010011110000100001111110001010001001110001111101101100001111101101000101011111110101110000000001111100000001101010001001", + "111001101001001110000001110110000110100110110010110100101111010111110110101011001011110101101110110000010001001110011101000110001100100110001011110001010", + "011110010000010111110000011111101100111011101011101101001111110100101100001000111011111010011111001110010101001010001100110111111101010111111011101111110", + "101000100010111010110101011110111110001000101110001000011110010111001110001101100110110111110110000101111110101011110000101111100000001111100110101100011", + "111001001110101000110111000001110111110011101001100010011100111010100011100010000000001100010000000101000110010011000011101101100010001101100000110100100", + "100010110010010101011010101101011101111101101001101111110100001100101101110000010000101110110101101011001010010101000110011101010111111101010000110010001", + "101000000110100001000110101001011010001101011101011011111001100010011010111110001101001100101001111000100011100100111010000001001011100001001101011000100", + "000101101111010111011000110011010011100101000011100101110011011010100011100000001011011010011011101000010011011110011101000010001101100010001011000001010", + "100010010101110011101100011010101100101000110010111001000111000001111000111001011011010111001011011110011101010000011000110110111001010110111011101110011", + "010100100100100011101100011011101011001011011111011001000010111010011011000110100110011000000011011101111100110011110000101011100001001011100110000100111", + "000101001011001100101011000100110111100000110000110110010100001111110111010011100000100001000100010101001110001001010111101100100110001100100000110101001", + "011110110100001100000011101000001000111110011000111110101001100001111000111011010000000001000000110011001000000101000110011001010110111001010000011011001", + "010100000011000101011010101100011010011110000100001111110001110111001110001111101101100001111101101000101011100110101110000000001111100000001101011000101", + "111001101001001110000001110110000110100110100010110100101111010111110110101011001011110101101110110000010001011110011101000110001100100110001011101000010", + "011110010000010111110000011111101100111011101011101101001110010100101100001000111011111010011111001110010101010010001100110111111101010111111011101110010", + "100100100010111010110001011110111110001000111110001000011111010111001110001101100110110111110110000101111110110011110000101111100100001111100110101101111", + "111101001110101000110111000001110111110011110001100010011100011010100011100010000000001100010000000101000110001011000011101101100110001101100000110101000", + "100111111010010101011100101101011111111101110001101111110101111110101101110000010000101111111101101011001010000101001111111101010011111101010000111111001", + "100010001110100001000000101001011000101101000101011011111000100010011010111110001101001110001001111000100011100100101000100001001101100001001101100010100", + "000010101111010111011010110011011010100101000011100101110011101010100011100000001011011010101011101000010011011110011010100010001011100010001010101010010", + "100010001101110011101010111010101000101000110010111001000110100011111000111001011011010010001011011110011101010000001000110110111011010110111011100010011", + "011111111100100011101011011011111111101011000111011001000011111110011011000110100110011111111011011101111100110011111111101011100111001011100110111111111", + "000001001011001100101111000100110110100000100000110110010100110111110111010011100000100111101100010101001110001001001101001100100000001100100001101001001", + "010010110100001100000100001000000100111111110000111110101000110101111000111011010000000000011000110011001000000101001100111001010000111001010001001111001", + "010100000011000101011000001100011110011110101100001111110000110111001110001111101101100101110101101000101011100110101000100000001101100000001101001100101", + "111001101001001110000000010110010111100111001010110100101111111011110110101011001011110000010110110000010001011110010011100110001010100110001010010100010", + "010010010000010111110000111111101101111010011011101101001111101100101100001000111011111100110111001110010101010010010110010111111011010111111010110010010", + "100100100010111010110011111110110010001001000110001000011110000011001110001101100110110110101110000101111110110011111010001111100111001111100111111001111", + "111001000110101000110101100001110011110010000001100010011101011010100011100010000000001000011000000101000110001011000101001101100001001101100000100001000", + "100010100010010101011010101101001100111101110001101111110100100000101101110000010000101011001101101011001010000101001000111101010001111101010001001111001", + "100100000110100001000111001001011011001100101101011011111001011010011010111110001101001010000001111000100011100100100000100001001101000001001100000100100", + "001001100111010111011111110011011111100101101011100101110011101110100011100000001011011011000011101000010011011110010111100010001011000010001010010100010", + "100010000101110011101111111010101000101001011010111001000110000001111000111001011011010011000011011110011101010000011110010110111010110110111011111010011", + "010100110100100011101100011011111010001010100111011001000010010110011011000110100110011101111011011101111100110011111110001011100110101011100111111001111", + "001001011011001100101010100100110110100000100000110110010100110111110111010011100000100111101100010101001110001001001101001100100001101100100001101001001", + "010010111100001100000100101000000100111110110000111110101000110101111000111011010000000000011000110011001000000101001100111001010000011001010001001111001", + "010100011011000101011001001100011110011111101100001111110000110111001110001111101101100101110101101000101011100110101000100000001100000000001101001100101", + "111001100001001110000001110110010111100111001010110100101111111011110110101011001011110000010110110000010001011110010011100110001011000110001010010100010", + "100010010000010111110001111111101101111011111011101101001111101100101100001000111011111100110111001110010101010110010110010111111010110111111010110010010", + "110100111010111010110010011110110010001000000110001000011010000011001110001101100110110110101110000101111110110101111010001111100110101111100111111001111", + "101001010110101000110100100001110011110010000001100010011011011010100011100010000000001000011000000101000110001101000101001101100001101101100000100001000", + "010010111010010101011010101101001100111100010001101111110110100000101101110000010000101011001101101011001010000011001000111101010000011101010001001111001", + "100100000110100001000111001001011011001101001101011011111101011010011010111110001101001010000001111000100011100000100000100001001100000001001100000100100", + "010000110111010111011111110011011111100101101011100101110001101110100011100000001011011011000011101000010011011000010111100010001011000010001010010100010", + "111010001101110011101111111010101000101001011010111001000100000001111000111001011011010011000011011110011101010110011110010110111010110110111011111010011", + "010101101100100011101100011011111111101010100111011001000010111110011011000110100110011111111011011101111100110101111111101011100110101011100111111111111", + "000000001011001100101010100100111000100000100000110110010000100011110111010011100000100010001101010101001110001101011000101100100001101100100001100011001", + "111111101100001100000100101000001010111110110000111110101111101011111000111011010000000110101001110011001000000011011010111001010000011001010000101011001", + "100000100011000101011001001100011000111111101100001111110011100011001110001111001101100010001101001000101011100000101000100000001100000000001101100010101", + "101110100001001110000001110110011111100111001010110100101111111111110110101011101011110011111110010000010001011000011111100110001011000110001010111110010", + "101110101000010111110001111111111100111011111011101101001011000000101100001000011011111111001110001110010101010110000000110111111010110111111010101110010", + "101110101010111010110010011110111011001000000110001000011000111011001110001100000110110100000110100101111110110101111000101111100110101111100111000101100", + "100000100110101000110100100001110111110010000001100010011110101110100011100011000000001011000000000101000110001101011111101101100001101101100001010101001", + "111111100010010101011010101101001000111100010001101111110101000000101101110010010000101111000101001011001010000011011110011101010000011101010001111011000" + ], + "3": [ + "111111100000111011010100110111011010100000111001111011100100011011001101011010010000001100111010100000110010111100110000011000101100011001010001001111111", + "100000101001110111110001010111000101101010000011101111101001011101100011001101100110101010100010111000001010100110001110011011101011011010000011101000001", + "101110101000001101111010001110110001011010100000101010011010000110111010100010111101111010101100110110000100101000000111111110011010111110100001001011101", + "101110100101111011011100111101011101010101000001111010110110111110011010111011101111100111000101010101100101000011100111010010000110110011111100101011101", + "101110100101010110111001000010111111101101010100010110001001111110100000110111111101100011111111001101011111010001011111110101000001110100111101001011101", + "100000100010101100001010000010001000110001011000110100110011100010111000010110111101110010001001100011010001111101011000100000110000000001011000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000111010111000001010001101000100001111011110001000001100011100001111001100110100010001111101101011111110011001000100101000001100101111001000000000", + "011101100001001100101010011011101111100011110111001100000000111110101100001101011001010111111011100011010011110101011111100100110000000101001000100000110", + "100111001100111011010100110111000010100000111001111011100100111111001101011010010000001100111010100000110010111100110000111000101100011001010100110101000", + "000011111111110111010001010001010101101010000011101111101001011011100011001101100110101010100010111000001010100110001111111011101011011010000011111101110", + "110000000010001101111010001010101001011010100000101010011010100010111010100010111101111010101100110110000100101000000110011110011010111110100010001011111", + "100101111001111011011100111101001101010101000001111010110110111100011010111011101111100111000101010101100101000011100110110010000110110011111110010100111", + "001010000101010110111001000010101111001101010100010110001001010010100000110111111101100001010111001101011111010001011101110101000001110100111001010110101", + "011000100000101100001010000010001110110001011000110100010010000000111000010110111101110001111001100011010001111101010101000000110000000001011000101000101", + "000110010010111010101100111100011111101100010110011101001100010000001100010100001011001100011010000000110010011110110001001000101100001000010100101011001", + "001000110010010111110001000000100000111000101100010111011011010001110111010110000010001010101000111000001000101110001010111111101011011110010011110101010", + "010001011010001101100010000001110100010110001111001100010010001001111011101100100110111010001100010110000100001010000110001110011010101111100010010011110", + "101110110010011010111100111100111000000111101110000010100100110010001110100000001011000111001111010101100111001011100010010110000110110111101110011000011", + "101011011001010110100001010001110010000001111001110000100001111001100001111001100110100001110111101101011111110011011101000101000001100101111001000000100", + "010011101111001101101010001011111011100011110101001100000000001010101100001101011001010001110011100011010011110101010000000100110000000101001000101010001", + "100111001000111011010100101111000010100000111111111011100100111111001101011010010000001100111010100000110010100100110000011000101100011001010100100011000", + "000011111011110111010001011001010101101010000001101111001001011011100011001101100110101010100010111000001010111110001110011011101011011010000011110011110", + "110000000100001100011010001010101000101010100010101011111010100110111010100010111101111010101100110110000100110000000111111110011010111110100010011101111", + "100101111111111010011100101101001101011101000001111010110110111100011010111011101111100111010101010101100101010011100111010010000110110011111110011000111", + "001010000001010110111001011010101111010101010100010111001001010010100000110111111101100001001111001100111111010001011101010101000001110100111001001000101", + "011000100100101100001010001010001110001001011000110100010010000100111000010110111101110001100001100010110001111101010100100000110000000001011000101110101", + "000110010100111011001100111100011110001100010100011101001100010100001100010100001011001100000010000001010010011110110000101000101100001000010100101101001", + "001000110100010110110001011000100000000000101110010111011011010001110111010110000010001010101000111001001000101110001011011111101011011110010011110001010", + "010001011110001101100010001001110101010110001001001101010010001001111011101100100110111010001010010110000100010010000110101110011010101111100010010101110", + "101110110110011011111100111100111001100111101100000010100100110110001110100000001111000111001001010101100111010011100011110110000110110111101110011110011", + "101011011111010111100001000001110011110001111001110000100001111101100001111001100010100001110001101101011111101011011100100101000001100101111001000110100", + "010011111001001100001010000011111111101011110111001100000000111110101100001101011111010011111111100011010011100101011111100100110000000101001000111110001", + "100110001100111011110100111111011000111000111001111010100100100011001101001010010000001010001010100001010010111100101000111000100100011001010101100011000", + "000010101011110110110001011001001010110010000011101111001001101011100011001101100110101010101010111001101010100110011010111011101011011010000011101011110", + "110010001000001101011010011010111000111010100010101011111010100010111010100010111111111010001100110111100100101000011000111110011010111110100010100011111", + "100111111111111011111100110101011111101101000011111010110110111110011010000011101001100111111101010100100101000011101111110010000110110010111110111110111", + "001000010101010110011001010010110001101101010010010110001001010001100001001111111101100100111001001101011111001001000010110101001001110101011000010100101", + "011001111100101101001010000010000101010001011010110100010011001000111001001110111001110010010111100011010001100101010110000000111000000100111000010010101", + "000110010110111011101100101100010000111100010100011101001100110011001100111100001111001001010100000000110010000110101010001000110100001100110101111001001", + "001011110000010110010001011000100011110000101100010111011011011001110110000110001100001001101100111000001000111110001101011111110111011110110011000001010", + "010011010010001101000010001001101011001110001111001100010010001010011011010100101110111111110100010111100100001010011000101110001100101101100011001111110", + "101111111010011011111100110100110011111111101110000010000101111110001111100000000011000100111111010100000111001011100000110110000000110101101110100100011", + "101011001011010110000001000001111100000001111001110000000001011011000000111001111100100100100111101100111111110011000111100101000011100011111000010100100", + "010000110011001101001010000011111000111011110101001101000000000110101101110101000111010010101011100010010011110101010110010100110010000010001000011010001", + "100101000100111011110100111111011100000000111111111010100100111100101101000010000000001001010100100000110010100100101110000000100100011100110101111000100", + "000010110111110110010001011001011110001010000011101111001000010111100011110101111010101001001100111000001010111110001101000011100011011011100011001000010", + "110000011000001101011010011010100110001010100000101010011010000011111011001010110001111111100010110110000100110000011100110110000010111110000011001110011", + "100110101101111011111100110101001110011101000001111011010110110000011011101011111001100100000001010101100101010011100000111010011010110011011110101101111", + "001000001001010110011001010010110000010101010100010111101001010001000000001111100101100100101111001100111111001001000011110101010111110110111000010100101", + "011001100100101101001010000010000101000001011000110100010011001100111001010110101101110010001001100010110001100101010110000000110110000011011000010010101", + "000110010110111011101100101100010001100100010000011100101100110100101101010100000001001001001010000001010010000110101010001000101110001110010101111001001", + "001011101000010110010001011000100011100000111110010110111011011101110110101110001100001001110000111001001000111110001101001111101001011001010011000001010", + "010011010010001101000010001001101010101110010101001100110010001010011011110100110110111111100010010011100100010010011000110110010010101010000010101110010", + "101111111010011011111100110100110011101111100110000010100101111010001110011000010111000100100001010010000111010011100000101110001110110110001111100101111", + "101011000011010110000001000001111101000001110101110001000001011000100000010001101010100100111001101010111111101011000111101101011001100101011000110101000", + "010000111011001101001010000011111000110011110101001111100000000110101101011101001111010010110111100100010011100101010110001100101100000101101000011011001", + "100101000100111011110100111111011101100000110011111000000100111100101101100010001100001001010100100001010011100100101110011000111010011011010100111001000", + "000010111111110110010001011001011110000010000011101001001000010111100010001101110110101001001100111001101011011110001101011011101101011000000010101001110", + "110000000000001101011010011010100111011010110110101000011010000010011011100010110001111111100010110111100101010000011100111110011000111000100010101111111", + "100111111101111011111100110101001111100101001011111101010110111110011011000011100111100111111001010100100100110011101111100010000100110100111111111110111", + "001010001001010110011001010010111000101101011110010001101001100011000000111111101011100010001001001000111111001001001000101101001001110001011000100011001", + "011010101100101101001010000010001010111001010000110000010010101010111000111110100011110110101111100100110001100101011010111000111000000000111001101011001", + "000110001110111011101100101100011000101100000000011010101100100011001101100100000111001110001100000111010010000110111000100000110100001001010100100010101", + "001011111000010110010001011000111111101000101110010100111010111111110110011110010100001011111100111111001000111110001111110111110011011111010011111110010", + "010000010010001101000010001001111000010110000101001010110010000111011011000100111000111000110010010111100101010010010110001110000010101100000010111011110", + "101101100010011011111100110100100100101111101110000010100100111100101111111000011101000101010001010100000110110011110110010110001110110100001110111000011", + "101010010011010110000001000001110111100001101101110011000000110110000000111001101010100011001001101100111110001011001101000101011101100011011001001000100", + "010000111011001001001010000011101110110011111101001011100001100011101101011101010111010011100111100010010010000101010100110100101110000010101000101110001", + "100110001100111011110100111111001110100000110011111100000101010001101100010010000110001110000100100101010010100100111000100000110010011110110101101100100", + "000000101111110100010001011001001001000010001011101011001001110001000010010101111000101000111100111111101010111110000011100011100101011001100010110101010", + "110001000000001011011010111010101100111010110110101100011010001101111011100010110001111000010010110001100100110000001110010110000000111000000011110010011", + "100110110101111011111100110101011000000101000011111001010110010100111011101011111001100101010001010010100101010011110010001010011000110100011110111000111", + "001011001001010110011000110010100011001101011110010001101000011100000001111111111011100011101001001100111110001001001101001101011111110011011001100001001", + "011011110100101101001011100010010010011001011000110100010011001010011001001110111011110011100111100010110000000101000000111000111110000010111000001111001", + "000111011110111001101100101100011010001100000000011110101101011011001101010100000111001110100100000001010011100110100000100000110110001110110100100100101", + "001011100000010000010000011000110101101000100110010000111010011001010110000110000100001000111100111001001001011110001111100111110101011001110011110100010", + "010100011010001001000011101001111000010110000101001010110011100111011010100100100000111000110010010011100100010010001110010110000100101000000011011010010", + "101101100010011111111100010100100100101111100110000110100100111100101111111000001101000101010001010010000111010011101110001110001000110100001111011001111", + "100110001011010100000000100001110111100001101101110111000001010110100000111001101010100011001001101010111111101011010101001101011011100011011000101001000", + "011100111011001101001011100011101110110011110101001111100000100010001101011101011111010011100111100100010011100101000100111100101110000010101000001111001", + "101110011100111011110100111111001110100000110011111100000101110001101100010010010110001110000100100101010011100100100000100000110010011110110100001100100", + "000000101111110110010000111001001001000010000011101111001000010001000010010101100000101000111100111111101011011110011011100011100101011001100011010100010", + "111001010000001111011011011010110100111010110110101000011011101101111011100010110001111010010010110001100101010000010110010110000000111000000010010010011", + "100010101101111101111101110101011000000101011011111101010111110100111011101011101001100111010001010010100100110011100010001010011000110100011110011001111", + "000111010001010010011000110010100011001101010110010001101000111100000001111111111011100101101001001000111110001001010101001101011111110011011000000001001", + "011011110100101001001010100010000010011001000000110000010010001010011001001110111011110101100111100100110000000101011000111000111110000010111001101111001", + "001011000110111001101101001100010010001100001000011010101100111011001101010100000111001010100100000111010011100110111000100000110110001110110101100100101", + "000111111000010110010000111000111111101000110110010010111011111111010110000110000100001011111100111111001001011110011111100111110101011001110011111110010", + "011010001010001101000010001001111000110110001101001100110011100011011010100100100000111010001010010011100101010010011000110110000100101000000011100010010", + "101110101010011011111101010100111010101111110110000100100101101010101111111000001101000110101001010010000110110011101010101110001000110100001111101011111", + "100010001011010100000000000001101000100001100101110001000001100010100000111001101010100110001001101010111110001011001000101101011011100011011001100011000", + "010111111011001011001011000011101111110011101101001001100001111110001101011101011111010011111111100100010010000101001111111100101110000010101001111111001", + "101010001100111111110101011111010000000000111011111010000100010101101100010010010110001101010100100101010011100100100010000000110010011110110101011000100", + "000011110111110010010001111001011011000010011011101001001000111101000010010101100000101001101100111111101011011110001101000011100101011001100011000000010", + "111111010000001111011011111010101010011010111110101010011010101011111011100010110001111101100010110001100101010000011000110110000000111000000011101110011", + "101011100101111011111101010101010010000101011011111111010111111010111011101011101001100110100001010010100100110011110000101010011000110100011110000101111", + "000011000001010110011001010010100101101101010110010111101001011000000001111111111011100110111001001000111110001001010111101101011111110011011000110101001", + "011000101100101101001011100011011000011001000000110010010010000110011001001110111011110110110111100100110000000101000110011000111110000010111000011011001", + "001101000110111001101101101100101100101100001000011100101101011101001101010100000111001101010100000111010011100110101110000000110110001110110101011000101", + "001110101000010100010000011000100111101000110110010010111011110111010110000110000100001101001100111111001001011110011101000111110101011001110011101000010", + "011100011010001111000011101000100110110110001101001100110010000011011010100100100000111011100010010011100101010010001100110110000100101000000011101110010", + "101110111010011001111000010100010110101111110110000100100101010000101111111000001101000100000001010010000110110011110000101110001000110100001110101101111", + "100100001011010100000000000000110001000001100101110001000000110000100000111001101010100110111001101010111110001011000011101101011011100011011000110101000", + "011101110011001111001111100011000100110011101101001001100001001100001101011101011111010000010111100100010010000101000110011100101110000010101000110011001", + "101110001100111001110101111110001000000000111011111010000101110101101100010010010110011011010100100101010011100100111010000000110010011110110101011000100", + "000011110111110100010111111000000011000010011011101001001000111101000010010101100000110101101100111111101011011110011101000011100101011001100011000000010", + "111011010000001111011001011010011010011010111110101010011011101011111011100010110001100011100010110001100101010000011000110110000000111000000011101110011", + "100011100101110001111111010101001010000101011011111111010111111010111011101011101001101000100001010010100100110011110000101010011000110100011110000101111", + "000011000001010100011110010011111101101101010110010111101000011000000001111111111011101000111001001000111110001001010111101101011111110011011000110101001", + "011100101100100111001100100010100000011001000000110010010011100110011001001110111011110010110111100100110000000101000110011000111110000010111000011011001", + "000001000110111001101101101101011100101100001000011100101101011101001101010100000111001011010100000111010011100110101110000000110110001110110101011000101", + "100010101000001100010100111000011111101000110110010010111010010111010110000110000100001011001100111111001001011110011101000111110101011001110011101000010", + "011000011010010111000011001000111110110110001101001100110011000011011010100100100000101101100010010011100101010010001100110110000100101000000011101110010", + "111010111010011001111010010101101110101111110110000100100111010000101111111000001101011100000001010010000110110011110000101110001000110100001110101101111", + "011100001011010100000010000001000001000001100101110001000100110000100000111001101010111110111001101010111110001011000011101101011011100011011000110101000", + "001011111011000111001001100011111111110011101101001001100111111110001101011101011111011011111111100100010010000101001111111100101110000010101000111111001", + "011110001100111001110011111110011000100000111011111010000000100011101100010010010110000010001100100101010011100100101000100000110010011110110101100010100", + "110110101111111100010111111001111010100010011011110001001100101011000010010101100000101110101100111111101011011110011010100011100101011001100010101010010", + "110110001000001111011011011011111000111010111110100010011000100011111011100010110001111110001010110001100101010000001000110110000000111000000011100010011", + "011111111101100001111001010101111111100101011011101111010101111110111011101011101001100111111001010010100100110011111111101010011000110100011110111111111", + "000010001001001100011000010011111111101101010110001111101000110110000001111111111011110011001001001000111110001000101101001101011111110011011001101001001", + "001100111100101111001100100011010110111000000000100010010001100010011001001110111011101111100111100100110000000100101100111000111110000010111001001111001", + "110010011110111001101111101100111110101101001000000100101000010001001101010100000111010010000100000111010011100111001000100000110110001110110101001100101", + "010000101000011100010010111000100001001001010110011010111101110001010110000110000100000100111100111111001001011111010011100111110101011001110010010100010", + "101001010010001111000101001000100100110111101101001100110111101101011010100100100000110000010010010011100011010010010110010110000100101000000010110010010", + "011010101010010001111010010100000000001111110110011100100001010100101111111000001101000001010001010010000000110011111010001110001000110100001111111001111", + "101111010011010100000000000001010011000000100101111001000011111100100000111001101010100111101001101010111000001011000101001101011011100011011000100001000", + "101011110011010111001111100011011010010011001101011001100010101010001101011101011111010111100111100100010110000101001000111100101110000010101001001111001", + "101111000100100001110101111110010010000000011011100010000101011011101100010010010110011110100100111101010011100101000000100000110010011110110100000100100", + "010111100111110100010011111001101101100011011011111001001010111001000010010101100000110100111100100111101011011111110111100011100101011001100010010100010", + "000100001000001111011011011010001000011011111110110010011110100111111011100010110001100100110010101001100101010001111110010110000000111000000011111010011", + "111101100101110001111101010100001100100100111011110111010000011100111011101011101001101001010001000010100100110010111110001010011000110100011111111001111", + "110010001001010100011110010011011111101100110110010111101100110110000001111111111011101011001001001000111000001001001101001101011111110011011001101001001", + "101100111100110111001000100010010110111001000000101010010111100010011001001111011011110111100111100100110110000101001100111000111110000010111001001111001", + "000010011110111001101011101100111110101101001000010100101110010001001101010101100111001010000100000111010101100110101000100000110110001110110101001100101", + "110000101000001100010100111001100001001000010110000010111001110001010110000110000100001100111100111111001101011110010011100111110101011001110110010100010", + "011001010010010111000101001000000100110110101101010100110011101101000010100101100000101000010010001011100101010011110110010100000100001000000100110010010", + "111010101010001001111110010100100000001110110110010100100111010100100111111000101101011001010001001010000110110010011010001100001001010100001001111001111", + "011111010011000100000110000001010011000000100101101001000101111100111100111001101010111111101001110010111110001010100101001011011011000011011010100001000", + "001011110011010111001111100010111010010010001101000001100110101010011011011101111111011111100111110100010010000100001000111010101111110010101011001111001", + "101111000100110001110011111110110010000001011011111010000001011011100110010100010110000110100100100101010101100100100000100100110011100110110100000100100", + "010000100111101100010011111001001101100010011011110001001100111001011010010100000000101100111100111111101101011110010111100011100101100001110010010100010", + "111010001000011111011101011010001000011011111110100010011000100111111111100001010001111100110010110001100011010000011110010110000001010000010011111010011", + "010101100101100001111001010100001111100101111011101111010110111110101101101111101001000011111001010010100000110011111111101011011001011100000011111111111", + "000000001001011100011110010011011000101101110110001111101110100010001011111100111010110010001001010000111110001000111000101110111110110011010111100011001", + "111111100100110111001000100010001010111000000000110010010001101010000001001110011011001010101111111100110000000100111010111011011110000010110110101011001", + "100000101110101001101011101100101000101101001000010100101101100011001001010000000110010010001100011111010011100111001000100110010110001110101111100010101", + "101110100000001100010100111001101111101001010110011010111000111111000000000010100100000111111100101111001001011111011111100001010101001001101000111110010", + "101110101010000111000101001000011010010111101101000100110111001011010000100100100000110001100010010011100011010011100000110010000100010000010010101110010", + "101110101010000001111110010100110010001110110110001100100111111010110111111111101101100010100001010010000000110010011000101110001000001100001111000101100", + "100000101011000100000110000001010101100000000101100001000000111000100100111000001010100000111001101010111000001010111111101101011010001011011001010101001", + "111111100011010111001111100010110000010000001101000001100011100110011011011101011111110100110111100100010110000100011110011101101111101010101101111011000" + ] + }, + "35": { + "0": [ + "1111111010111101001000110011001001011101111111000100011001100101011000001101001101011000001101011000000111010000101111010000110010101111010000101011101111111", + "1000001011001100110000011111100111011110010110110011000100100011010110000011000011010110000011010110001111111010110000011010110100101001111100101011001000001", + "1011101001010111001100000011110000010101110100101000111001100000110101100000100001000010111000110101100100011001010011111001011101001010011111001001101011101", + "1011101010010000001000110001101000001010010101101100000100101000001101011000011001110010100000001101001100111000001101011000000111010000101111010111001011101", + "1011101001100110010011101000111110000110100100011111111110001110000011010110111111111100101110000011111110010110000011010110111111110100001011110111001011101", + "1000001001111010000110101000100011101000100000000100100010110101100000110100100010111101000101100000100011010011111001010010100010011111001010011100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011100001111010110101100010100011000010011111100011011110000011010111100010000011010110000010100010110000011010110001100011111100101001111101100000000", + "1011011101111101100101011101111111100111111000000000111110001101100000110100111111100000110101100000111111000010111101000010111110111101000010111100001001011", + "0110010110111101001000110010001001011101111111000101010001100101011000001101001101011000001101011000011001010000101111010001010010101111010000101110110010101", + "1110011001001100110000011110100111011110010110110011001100100011010110000011000011010110000011010110010011111100110000011010010100101001111100101000010100101", + "0100110101010111001100000010110000010101110100101001111001100000110101100000100001000011111001010101110010011111010011111001011101001010011111001011011101001", + "0100111010010000001000110000101000001010010101101100010100101000001101011000011001110011000001101101010010111110001101011001100111010000101111010001100111010", + "0101000101100110010011101001010010100110100100011110000010001110000011010110010111111101001111100011011100010010000011010111101001110100001011110101101000010", + "0100101111111010000110101000010000001000100000000101110010110101100000110101110100111100100100100000111001010011111001010011100010011111001010011110100010111", + "1010010000111010100001101111011100111000011001000100000100000101011000001101001101011000001101011000001001101011000001101011010000100111110010100110110001000", + "1101101001001011010011101011110011010001001110110111010110111011010110000011000011010110000011010110010111110100001011110101011100001011110100001010111100001", + "1011110011010000100101011111100100110000010010101000100100001000110101100000111000110101100000110101110100111101000010111100111111000010111101010011011111000", + "0101001010010111101011000101111100100101001101101000010111111000001101011000000000001101011000001101001000100111110011000001001111110010100111101010001111110", + "0010000011100001111010110100000111100011000010011111001111010110000011010110001111100101001111100101000100101001111101001111101111111100101001100100001011111", + "1011011111111101100101011101000100000111111000000001111001000101100000110101100100000110101100000110111111010011111000110100001100111101000010100101101010111", + "1100010110111101001000110010001001111101111111000101011001010101011000001101001100111110010100111110000111001001001000001100110100101111010000101111010011001", + "0000011001001100110000011110100111011110010110110011000100011011010110000011000010010010010010010010001111100101001111100101010010101001111100101000010101001", + "0100110101010111001100000010110001110101110100101001101001110000110101100000100000110101100000110101100100000110101100000110111101001010011111001011011100101", + "0110111010010000001000110000101001101100010101101100001101011000001101011000011000001101011000001101001100101111010000101110000111010000101111010001100110010", + "1111000101100110010011101001010010000000100100011110010010110110000011010110001110000011010110000011000010001011110100001010001001110100001111100101101001110", + "1010101111111010000110101001110001001100100000000101111010010101100000110101101101100000110101100000100101001010011111001101100010011111001100000111100010011", + "1010010000111010100001101110011100111000011001000100010100101101011000001101010100111110010100111110011111110010100111110101010100100111110100111111010000100", + "1101111111001011010011101011111110110111001110110111111110000011010110000011111110110000011010110000111111100101001111100011111110001011110010010011111110001", + "0001100011010000100101011111100010010110011010101000100010000000110101100000100011010011111001010010100010100100100100100000100011000010111101000010100010100", + "1011101010010111101011000101101010000101001101101001101011111000001101011001101011001001001001001000101010111110010100111111101011110010100111110011101010010", + "0001100011100001111010110101100011000011011010011110100011110110000011010110100010000011010110000010100010110000011010110000100011111100101001111100100010011", + "1011111111111101100101011100111110000101111000000001111110110011100000110101111111100000110101100000111111000010111101010011111110111101000010111100111111111", + "0100110010111101001000110011001001011011110111000101110101101011011000001101001001011000001101011001110011010000101111001001000000101110010100111111100110101", + "1100001101001100110000010111010011111010001110110010100010100101010110000010110111010110000011010110011101111100101001100100101110101000011010110001001000101", + "0111100111010111001100011011110001010101110100101000110011000100110101100000110101010011111001010010011000011111001010000110100101001011111001010011000011001", + "0110011110010000001000110001111101101100001101101101100101011000001101011001101101101011000001101011001000111110010100111111110001010001001001001000110001010", + "0111100101100110010011100000110010100000101101111110110110110110000011010110000011100101001111100100101110010010010010010010011101110100001011110100011100010", + "0110111001111010000110110000000101101000111000000100000100010101100000110100011000100100100100100100101101010011111001010010011110011111001010011110011111111", + "1010000100111010100001101110011100011000010000100101010110101101011000001101000000111000001101011001110101101011000001101011001110100111110010100111001111000", + "1101001001001011010011101011000110110011000111110110101110000101001110000010101110110110000011010110010011110100001111100100101110001011110100001010001011001", + "1001010101010000100011011110100100110110011011101000011000000110101101100000100101010101100000110100011000111101000100100100101101010011111001010010001011000", + "1011011110010111101001001100001000100001010101001001111001111110010101011001101101001101011000001101000000100111110100111111110101101011000001101010010011110", + "0001010101100001111110101101000111100011000010011110000101110010010011010110000011100101001111100100101110101001111010110000010011100101001111100101110101111", + "0111111011111101100011011100010000000001100000000000001000110101100000110100000000000110101100000110100101010011111001010010011100100100100100100101011100111", + "0000110110111101001110111011101001111011110110100101101101101101011000001101011000111110010100111111110101001001001001001001000110101111010000101111000111001", + "0000001111001100110100000110110011011110001110110000110010100011010110000010101110010010010010010010011011100101001111100100101000101001111100101000101001001", + "0111100001010111001000000011110001110101111101001110111011000000110101100000101101010011100000110100011000000110101100000110100011001010011111001010100010101", + "1010011010010000001000110000001101101000011101001101110101011110010100111001110101101011011000001101001000101110010100111111110101010000101111010001010000010", + "1011100011100111110101101000010010000000101101011010101110110000011010110110010011100101010110000010101110001010010010010010011011100101001111100100111101110", + "0110111011011010000100100001111101001100111000100010010100010011111001010100000000100100110101100000101101001011111001010010011000000110101100000111111110011", + "1010000110011011000101110110000100111000011001000001011110101001001001001101011000111110010100111111110101110011000001101011001000111110010100111110101110100", + "0001111111001010010101101010111110110111010110110010111110000011010110000010111110110000011010110000111111100101001111100100111110010010010010010011111110001", + "1101100011010001100011010111100010010110011011001111100010000000110101100001100011010011111001010010100010100100100100100101100011000010111101000011100010100", + "1011101010010111001111011101101010000101010101101001101011111000001101011001101011001001001001001001101010111110010100111111101011110010100111110011101010010", + "0001100010000001011110110101100011000011001011111101100011110110000011010110100011100101001110000011100010110000011010110000100011111100101001111100100010011", + "0111111111000101100101011100111110000101110000100110111110110011111001010010111110000110101101100000111111010011111001010010111110111101000010111100111111111", + "0000010110111100101110110010100101011011110110000000000101101011000001101011001100111110010101011001001001001001001001001000010000111110010100111110010000101", + "0000101100100110110010010110100011111010001110010100010110100101001111110101100010010010010011010111001111100101001111100100011100110000011010110000011100101", + "0111110000011010101000011010100101010101110100101101100101000100100100111100011001010011111001010010101100000110101100000111111111010011111001010010111111001", + "1010001100100011001110110001111101101100001101101000010111011000001101000000100001101011000001101010010100111110010100111111001111001001001001001000101111010", + "1011000001101101010101100000110110100000101101111001001110110110000011001111001111100101001111100100010010010010010010010011001111110100001011111100110010010", + "0110011101111110100010110000111101001000111000000100111000010101100000110100100100100100100100100101111001010011111001010010101100011111001010010111011011111", + "1010010111010010000101101110001001011000010000100110011000101101011000001100001100111110010100111001000001101011000001101010010100100111110010100110011011000", + "0001011101110101010011101011011110010011000110010001001100000101001111100100000010110000011010110111001111100101001111100100010010001011110100001010011101001", + "1101110011010101000011011111001000010110011011101101101000000110101100000110100001010011111001010100100100100100100100100101111100110011111001010011111100100", + "1011111111111011100001001101111000100001010101001111011101111110010000101110111001001001001001001100010100111110010100111111000110001011000001101011000110010", + "0001000110101010010110101100010010000011000010011011011011110010010100001010101111100101001111100100011010110000011010110001001000000101001111100100101000011", + "0111101001001000111011011100010000100001100000000101011010110101100110101101001100000110101100000111111001010011111001010010100011100100100100100101100011111", + "0000010010110000010110111011101101111101110110101011000101101101011110010100010100111110010100111111001001001001001001001000010100101111010010111111001001001", + "0000101011001000000100000110001011111000001110111010000110100011010110000010010010010010010010010011001111100101001111100100011010101001111010110000100101001", + "0111110010111111110000000011100100110001111101011010101101000000110101100001100001010011111001010010101100000110101100000111111001001010011001010011100110101", + "1010001110101110000000110000000101001110011101001011110111011110010100111111011001101011000001101010010100111110010100111111001001010000101001001001011110010", + "1011000101100011110101101001111110100110101101010010111110110000011010110000010111100101001111100100010010010010010010010011001010000011001111100101001010010", + "0110011010010110010101100000010101001110111000110011110000010010111101000011010100100100100100100101111001010011111001010010101011100000101100000110101011111", + "1010010101110001010100010110001001011100011001011000100000101000101111010001110100111110010100111111000001101011000001101010010011011000010100111110010011000", + "0001111111111110000100011011111110010101010110100011111110000010110000011011111110110000011010110001111111100101001111100100111111010110010010010010111111001", + "1101100011011101101011110110100010010000011011000111100010000001010011111001100011010011111001010010100010100100100100100100100011000010111001010010100010100", + "1011101010010011011110010100101010100011001111100001101011111000001101011000101011001001001001001001101010111110010100111110101011110010100001101010101010010", + "0001100010001001000110001100100010000111000001101100100011110110000011010110100011100101001111100100100010110000011010110000100011111100101111100100100010011", + "0111111111000011101100010101111110100011110010100110111110110011111001010010111110000110101100000111111111010011111001010010111110111101000100100100111111111", + "0000000100111000101110011011111101111101110110001001010111101011000001101011100000111110010100111111010101001001001001001001101111011000001100111111101111001", + "0000001000100000100011110000110111111000010100000100011110100100001011110100001110010010010010010010110011100101001111100100001111010110000010110000010011001", + "0111010100011100111001101010011100110001110000110101110001000101000010111100100101010011111001010010111000000110101100000110001100110101100001010010010010101", + "1010011110100101011101011011001001001110011001111000100001011111101011000001110101101011000001101011100000111110010100111111010100001101001001001001001010010", + "1011010101101011011010000001111110100111101100010000101100110001100101001111011011100101001111100100001110010010010010010010110011110101001111100100100100010", + "0110111011111110110111100110001101001110000011001101001000010011100000110101011000100100100100100100000101010011111001010010111000011110101100000110111001111", + "1010110111010010011101000011111011011101011011010110011100101001011000001100101000111110010100111111010101101011000001101011100000100110010100111111100001000", + "0001001111110101011100100110010000010100000101110000011010000101001111100100001110110000011010110000111011100101001111100100001110001010010010010010001111001", + "1101100001010101000101110011010000010001111010100100111010000110101100000110001101010011111001010010111000100100100100100100000100110101100001010010000100100", + "1011011111111011111100101001101110100010001110111111000101111111010000101111010101001001001001001001101000111110010100111111010100001101011001101011001000010", + "0001100010101010001001011010101010000111100110000011000111110011110100001010010011100101001111100100001110110000011010110000111010000011010111000100100100011", + "0111111001001000110010110110100110100011110101010101001100110010011110101100011000000110101100000110001101010011111001010010111001100000110100000100100111111", + "0000000010110001100001011010100101110100110111001101110111101010100110010100000000111110010100111111010101001001001001001001101000111110010100111111111111001", + "0000001111001001100111010000111011110000110101111101111110100101001110000011101110010010010010010010110011100101001111100100001110110000011010110000001111001", + "0111010100111110110110101110010110100000110110111001110001000100100101100001000101010011111001000010111000000110101100000110001101010011111001010010001100101", + "1010011010101110000111111101001011011111011110101011000001011110010100111111010101101011000001110011000000111110010100111111010101001001001001001001010100010", + "1011010111100011010011000101100110111111001100010110001100110000011010110000111011100101001111111100101110010010010010010010110010000011010110000010110010010", + "0110111001110111010001000100000011000111100011010010101000010010111101000010111000100100100100111101100101010011111001010010111001100000110101100000100101111", + "1010110001110001110010000001110001001100111101011100011100101000101111010001001000111110010100111110110101101011000001101011100001011000001101011101111111000", + "0001111110000111000100000000111110010101000011100001111110000100101001111010111110110000011010110001111111100101001111100100111111010110000011010000111111001", + "1101100011111101101100110110100010011001011010100001100010000111001010011001100011010011111001010011100010100100100100100100100011010011111001010010100010100", + "1011101010001010111100001010101010101011101110100111101011111110010100111000101011001001001001001001101011011110010100111111101011101011000001101011101010010", + "0001100010101000100000011001100010010110000000001111100011110010010010010110100011100101001011110100100011010000011010110001100011100101001111100101100010011", + "0111111110111011101010010000111110110010110011000111111110110011111001010011111110000110101010011110111110110011111001010010111110100100100100100100111111111", + "0000010010010000001000011110001011100100010111001100100001101011000001101010110100111110010010100110000000001001001001001001010101011000001101011001001011001", + "0000011111000011100111110011011111110001010101100100001100100100001011110101011010010010010100001010001111100101001111100101010011010110000011010111000101001", + "0111110000000000011111101100001100100001010000110000101001000101000010111100111001010011111001010010100100000110101100000110111000110101100000110100111000101", + "1010111001010110011111011010011011001110011000111011011101011111110010100110001001101011000001101010110100111110010100111110000000001101011000001100000000010", + "1011000001001101011010000001010000101111101100010110111010110001111100101000001111100101001111100100111010010010010010010010001111100101001111100100001110000", + "0110101001110101010001100111110001000110000011001010011010010011111001000010101100100100100100100101011000110101111001010011100100000110101100000111100101100", + "1010100101101101111011000011100111001101011011010100000100101001001001010000110100111111010000101110001000001101000001101011010100111110010100111111001001011", + "0001101010001101011100100111000010000100000101110001100110000101001111111100110010110001111100101000001110000011001111100101011010010010010010010011000101010", + "1101110111111011100101110011110110001001111010101001001100000110101100011111011001010010011111001011101101100000100100100100111000110101100000110100100110100", + "1011111100011000100100101000011100101010001110100111010111111111010000101111000001001000101111010001010100111110010100111110001000001101011000001100011110010", + "0001000110110110101001011010111010010111100110000110011111110011110100001011101111100101001111100100010010110000011010110000010110000011010110000010001110011", + "0111101100111011110010110111110110100011110101001110110000110010011111001010000100000110101100000111011001010011111001010011110101100000110101100001101101111", + "0000000010010110011001011010011011110100110111000101100001101010100111110010110000111110010100111111100001001001001001001001001101011110010100111111010101011", + "0000011111000011111111010001000111110000110101100100101100100101001011110100011100010010010010010011101110000011010111100101000011010000011010110001010011010", + "0111000000000000011110101110001010100000110110111000101001000100100010111101011111000010111101000011100101100000110100000110111000110011111001010010100100110", + "1010101001010110011111111100011001011111011110111011111101011110010010100111101111110010100111110011010101011000001100111110000000001001001001001000011110001", + "1011100001001101000011000101000000111111001010011110111010110000011100101001101111111100101001111101011011010110000010010010001110000011010110000010010000010", + "0110001001110101001000000101110001000111100101010011111010010010111101000010101100111101000010111100111001010011111001010011100101100000110101100001110011111", + "1010010101101101110010000001100001001100111001010101100100101000101111010000110100111110010100111111001001101011000001101011001101011000001101011001001101000", + "0001111110001101000100000001111110010101000011100001111110000100101001111100111110110000011010110001111111100101001111100101111111010110000011010111111111001", + "1101100011111011110101010110100010011001011010101001100010000111001010011111100011010011111001010011100010100100100100100100100010110101111001010010100010110", + "1011101010011000100101101010101010101011101000111111101011111111010000101110101011001001001001001001101011011000001101011111101010001101000001101011101010001", + "0001100010110110101001011000100010010110000100001111100011110011110100001011100011110100001011110101100011010110000011010000100010000011001111100100100010000", + "0100111110111011110010110001111110110010110101010111111110010010011111001010111110011111001010011111111110110101100000110011111111100000100100100101111111100", + "0001000000010110011000111111011011100100110111000101011100101010100111110011101000100111110010100110110100001101011000001001011001011000001101011001011001001", + "0010011001000011111110110001100001110000010011100101111010110100001011110101001010001011110100001010011011100101001111100100110111010110000011010110110111001", + "0101100000000000011111101100010000100001010010111001111010011101000010111101001011010011111001010010011000000110101100000110110100110101100000110100110100101", + "1011101101010110011111011101100111001111011000111010100100100111110010100110010011101011000001101011001000111110010100101111110100001101011000001101101000010", + "1001110011001101000011100110000010101111001100011110000000001001111100101000110101100101001111100100001110010010010010001010011010000011010111100100000100000", + "0110011111110101001000000111010111000111100101010011001001100010111101000011111000100100100100100100001100110101100000101100011001100000110100000110000111100", + "1011100101101101110010000001111101001101011111010100010001110000101111010000100000101111010000101110010100001101011000010101001001011000001100111111011111011", + "0010001110001101000100000110111010000101100011100001111101111100101001111101001110101001111100101001110010000011010110000010110111010110000010010010110111010", + "1100100101111011110101010000110110000001111010101000110110011111001010011110000101001010011111001011011001100000110101100000110100110101100000110100110100100", + "1001001010011000100101101010111010111010001000111110100011101111010000101110010001010000101111010001000000111110010100111111001100001101011000001101101100010", + "0011010110110110101001011010100110001110000100001111001000101011110100001011111100000101001111100100101110110000011010110000100010000011010110000010000010011", + "0110001000111011110010110000001100100011010101010111001011001010011111001011111111100110101100000110100101010011111101000011111001100000110101100000000011111", + "0010100000010110011000111101011111110100010111000101011011010010100111110011101111011110010100111111010101001001001111010000100001011000001101011111011101011", + "0000101001000011111110110001100011100001010011100101111111010100001011110101001111010010010010010010111010000011010000011011101111010110000011010000110101010", + "0110000000000000011111101100010100101000110010111001111100011101000010111101001101000010111101000011111001100000110011111000100100110101100000110010110000110", + "1001011101010110011111011101100001011110111000111010100110100111110010100110010101110010100111110010101001011000001101011001101100001101011000001001101100001", + "1010010011001101000011100110000010101111001100011110000000101001111100101000110011111100101001111101101111010110000011010110000010000011010110000010000010010", + "1101101111110101001000000111010011010111100101010011001110000010111101000011111100111101000010111100101101010011111001010010100001100000110101100000000001111", + "1111100101101101110010000001111011000101011111010100010011110000101111010000100111011000010100101111110101101011000001101011111001011000001101011001011001000", + "1010011110001101000100000110111110000101100011100001111111111100101001111101111111010110011010101000111111100100001011110101111111010110000011010110111111001", + "0000000011111011110101010001100010011001111010101001100010111111001010011110100010110101111001001010100010100101000010111100100010110101100000110101100010110", + "1111111010011000100101101011101010111010001000111111101010001111010000101111101010001101001001010001101011011001101011000000101010001101011000001101101010001", + "1000001010110110101001011010100010011110000100001110100010101011110100001011100011110100001011110100100011010111100101001111100010000011010110000010100010000", + "1011101000111011110010110001111110110011010101010111111111001010011111001011111110011111001010011110111110110101100000110101111111100000110101100000111111100", + "1011101010010110011000111100000001110100010111000100100111110010100111110011110010100111110010100110101000001101011000001100010101011000001101011000001101001", + "1011101011000011111110110001000011100001010011100100100000110100001011110101110100001011110100001010101110000101001111100100011011010110000011010110000011010", + "1000001000000000011111101101110010101000110010111001101000011101000010111100111000110101100101000011001101100110101100000111111000110101100000110101100000100", + "1111111011010110011111011101111011011110111000111011110000100111110010100110100000001101011111110011010101001111010000101111001000001101011000001101011000011" + ], + "1": [ + "1111111011011110001100000110111111001001001000101111011000001010100111110010101101011000001101011000000111010000101111010000110010111110010000101011101111111", + "1000001001001010110100111011011011001111100100101001101110000101001111100101000011010110000011010110001111111010110000011010110100110000011100101011001000001", + "1011101011101110110011100000100100101100000111001010001101100100100100100100100001000010111000110101100100011001010011111001011101010011111111001001101011101", + "1011101011000110101010000110100010010100111111010000110001011000001101011000011001110010100000001101001100111000001101011000000111001001001111010111001011101", + "1011101010110101111010110101111111100101001011110100111111010110000011010110111111111100101110000011111110010110000011010110111110010010010011110111001011101", + "1000001000010100011000010011100010000110101010011110100010100100100100100100100010111101000101100000100011010011111001010010100011111001010010011100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001100000001011010011100011100101001001111101100011001111100101001110100010000011010110000010100010110000011010110001100010011010110001111101100000000", + "1111001011100001010101001100111110100100100010111101111110101100011111001010111111100000110101100000111111000010111101000010111111111001010010111100010011101", + "0110100101011110001100001011000011001001001001001111101110010100100111110010101101011000001101011000011001010000101111010001010010111111010000101110101101011", + "1110101101001010110110100111110011001111100101001001110000000011001111100100100011010110000011010110010011111100110000011010010100110001111100101000000011010", + "0011010011101110110001100001000110101100000110101010110011100000100100100101000001000011111001010101110010011111010011111001011101010010011111001011011100110", + "0011101101000110101010000010010100010100111110010000101101011000001101011000011001110011000001101101010010111110001101011001100111001000101111010001100110001", + "1000110110110101111110110100000101100100001011110100100011010110000011010110010111111101001111100010011100010010000011010111101000010010010010010101101001000", + "1001011010010100011100010111001100000111001010011111011000100100100100100101110100111100100100100001011001010011111001010011100011111001010011111110100011000", + "1010000110111011010000001110101000111111110010100110000000010100111110010101001101011000001101011001101001101011000001101011010001000001101011000110101100011", + "1101001111010110100001111011001000010011110100001010001010011010110001111100000011010110000011010111110111110100001011110101011101001111100101001010100011110", + "1011100000110011000001100000101110100100100100100101100011111001010010011111011000110101100000110101110100111101000010111100111111000010111101010011000000110", + "0101011110010000101001111100100000010100111110010101001011011000001100111111100000001101011000001101001000100111110011000001001111110010100111101010011000001", + "0101100101011001100011010111110000011010110000011010000101010110000010010011101111100101001111110101000100101001111101001111110111111100101001100100001010000", + "1110001000101011000111101111111001111001010011111001000000110101100000110101100100000110101100011110111111010011111000110100010100111101000010100101101011100", + "0010010101101111100101101111000110101111010000111111111000001101011000001101001000111110010100100111000111001001001000001100101101001001001001001001010010111", + "1101011100000010101010100001111010101001111100110001101110010010010010010011000100010010010010001011101111100101001111100101000011001111100101001110010100110", + "0100010010010111111101100011000101001010011111010011101101111001010011111000100110110101100000110100000100000110101100000110111100101100000110101101000001010", + "0100111101001100111010100000010011010000101111001001010000100001101011000111011110001101011000001100101100101111010000101110000110010100111110010001111001001", + "1100010110100100110111010110011000010010010010010011010100101111100101001001101110000011010110000011000010001011110100001010001001110100001111100101110110000", + "1011011010110100000100010000001101111001010011111000100111010101100000110010001101100000110101100000100100101010011111001101100010011111001100000111110101100", + "1110110111111010011000001101101011000001101011000001011111001101011000001000110100111110010000101110011110010010100111110101001100100111110100111111001001011", + "1011111110001101110001011000111111001111100101001111111110000011010110000010111110110000011100101000111110000101001111100011111110001011110010010011111111010", + "1110100010000010001000000011100011000010111001010011100011100000110101100000100011010011111111001010100011100100100100100000100010100100100100100100100011010", + "0110101011010001110001111010101011110010100001101011101011001001001001001000101011001001001111010001101010111110010100111111101010010100111110010101101011101", + "0001100010111011001011010101100011111100101111100101100011001111100101001111100010000011010110000010100010110000011010110000100010011010110000011010100011100", + "1001111110111011010111000101111110111101000100100101111111001010000110101100111111100000110101100001111111000010111101010011111111111001010011111000111110100", + "0111100101101001101100010101110101001001001001001000101101110010111110010100101001011000001101011000010011010000101111001001011000101110010100111111111111001", + "1101001110001010110010111111011101001111100101001110000011100101010110010011010011010110000011010111111100011010101001100100110110101000011010110001010001001", + "0011100010001101110101111001001100101100000110101100000000100100110101111000010011010010111101000011011001111001001010000110110101001011111001010011010010101", + "0000111101010110101010000010001000010100111110010101011001011000001101000000001011101010100111110011001001011000010100111111110001010001001001001000101100010", + "1000100100110010111110110101001000010101001111100100010011010110000011001111100101100100101001111100101111010110010010010010011100010010010010010010000011100", + "1011101010111100010100001111101111111110101100000110010010100100100100100101111000100101000010111100101101010011111001010010011111111001010011111000000000000", + "1010110001100000010000010110100001000110010100111110001010010100111110010101100000111000001101011001010101101011000001101011001111000001101011000001011000111", + "1111101000001101110011110011110001001010010010010011100101111100101000011011001110110110000011010110110011110100001111100100110111001111100101001110010010010", + "1010000000000100010001111000011000100100100100100101000100011111001011111001000101010101100000110101111000111101000100100100110100110011111001010010010010100", + "0010011011010001111101100100000110010100111110010101011110111110010001001000001001001101011000001100100001000001101100111111101100001011000001101010001010010", + "1001010000111011001111001111111010011010110000011010110000010010010101001110100101110100001011110101101111001111100010110000000010000101001111100101100100011", + "1101011000111011000011101111100011111001010011111000110010110101100110101101100110011111001010011110100100110101100001010010011101100100100100100101000111111", + "1011110111101001111011101110010011011000010100111111001000001101011110010100111110100111110010100111110100001101011001001001000111001001001001001001011100111", + "1001011100001010100100111001011101010110011010110000100100010010010010010011001110001011110100001010011011100101001111100100101001001111100101001110110110110", + "1111010100001101111001111011001110110101111001010011100111111001010011111000001101010011100000110100111000000110101100000110100010101100000110101100110101010", + "0000111011010111001000001000110010001101001001001000111110100111110010100000010101101011011000001101101000101110010100111111101100010100111110010101001001001", + "0000110110110010000111101110111100010010010010010011110010101001111100101111110011100101010110000011001110001010010010010010000010000011001111100100100100010", + "1111111110011101010000001001110101111001010011111000110011010010111101000101100100100100110101100001001100101101100000110010000001100000101100000111100111111", + "0010000010100001010100010100101001000001101011000001101011001000101111010101111110101111010000101110110100010101011000001011011001011000010100111110111111000", + "1001111111101100010101011001111111001111100101001110111110000010110000011011111110101001111100101000111110000011010110000100111111010110010010010011111111001", + "0101100011000101010111000010100010110101100001010010100011100001010011111000100011001010011111001010100011100000110101100100100010100100100100100101100011010", + "0000101010010000011111100110101010001101011001101011101011001001001001001000101011010000101111010001101010111110010100111111101010010100111110010101101011101", + "1000100010111010001111001110100010000011010111100100100011001111100101001111100011100101001110000011100010110000011010110001100010011010110000011010100011100", + "1111111111111010100101100001111111100000110100100100111111001010011111001011111110000110101101100000111111010011111001000011111111111001010011111000111110100", + "1011110100100001011100110011101011001001001001001000111111110010100111110010001010111110010101011001001001001001001001010001110001011000001100111110001001001", + "1011101100001101100110111101101101001111100101001110110011110100001011100100000100010010010011010110001110000011010110011011111101010110000010110000000101001", + "1111100010001100111001111001100100101100000110101101010010111101000010100101111001000010111101000011001101100000110101111001111110110101100001010010100110101", + "0010111000101101001110000100100000010100111110010100001011000001101011011001000001110010100111110011110101011000001101011001001110001101011001001000111110010", + "0011100001110011100001110000110001100011010110000100000101001111100101010110001111111100101001111101110011010110000011010111010110010010010010010010101011100", + "1101001001101101110010001011010010000000110101100111100100100100100100100101000100111101000010111101111001010011111001010010110101111001010011111001001010000", + "0011010011101101010100010101101000111000001101011111011110010100111110010101101001011110010100111001000001101011000001101011001101000001101011000000011010111", + "1001011001001100010011010110101010010110000011010010001001111100101001111101100101010000011010110111001111100101001011110101100011001111100101001110011100010", + "0110010001001110110001011110000110100100100100100101001010011111001010011111100110110011111001010100100100100100100010111100011101010101100000110011100101000", + "0000111111010000100101100110110110010100111110010101110000101111010100111111011110001001001001001101001101011000001011000000100111101101011000001011011111110", + "1001010100111000001111001111010010011010110000011011110100001011110010010011001111110100001011110101100011010110000101001111001001100011010110000100110001111", + "1111011101000000110011101001001101111001010011111001100110101100000000110100101100011111001010011110000100110101100000110100100010100000110101100100110010111", + "1000110010101100100010101011101010111110001101011001011110010100111000001101010100100111110010100110111110001101011000001100001101001001001001011000010000111", + "0111111111011011010100111101100100110000000011010111010110010010010010010011110010001011110100001010001001100101001111100100000011001111100101010110011100110", + "0110110110000000111001111000000101010011100000110100110101111001010011111000000100110101111001000011001010000110101100000110100000101100000110110101111111010", + "0010001010010111010000001101110001001001011000001100010100100111110010100110111110001101000001110011110100111111010000101110111000010100111110001101001111001", + "0100110111111000000111101000110000010010010010000010011010101001111100101001010000000011001111111101110010010011110100001010101011100101010110000011010011110", + "0001111010111101000000101011011011111001010011100001111101000011111001010010110011100000100100111100100000110100000110101101001010000110110101100000110010011", + "0010110111100011000101010101101001000001101011011001001111010001001001001000010100101111010000101110111000001100111110010100010010111110001101011000001010100", + "0101111111110110001101011111111111001111100101010111111111111011010110000010111110101001111100101000111110000011010110000010111110010010000011010110111110001", + "1101100011000001011111011110100011010011111000110100100010011000110101100000100011001010011111001011100011100000110101100000100010100100100000110100100011000", + "0000101010000000001111011111101011101011000000001101101010101001001001001001101011010000101111010000101011011110010100111110101010010100111000001100101011101", + "0100100010110110001110110111100011100101001110000010100010001111100101001110100010000011010011110101100011010000011010110000100010011010110110000010100011110", + "0011111111111010111101001000111110100100100101100001111111001010011111001011111111100000110010011110111110100010111101000010111111111001010101100000111110100", + "0111010000100011011101011010100001001001001101011001001011110010100111110010000001011000001010100111101000010000101111010001001110111110010101011001111110101", + "0111111000001011110111010101010001001111100011010110100101100101001111100101101111010110000100001011000100011010110000011010110110110000011011010110001010101", + "1111110000001110101001000001110010101100000000110100100000100100100100100101000101000010111101000011011111111001010011111001110101010011111000110100001011001", + "1110111010101101010100100011001000010100111000001101111000111110001101011001010001110010100111110010000111011000001101011000101101001001001000001101010011010", + "1011000001110111101001000011101011100101001111100010001110110000000011010110111101111100101001111100101111010110000011010111100010010011010110000010110101110", + "1101001001101101100110100111100010000110101100000000001101000010100100100100111110111101000010111101100100110101111001010010100001111000110101100000100000011", + "1111010111101101010001101010010110111110010100111001010001010000111110010101001111011001001001001110101100001101000001101011111001000000001101011001111000100", + "0101101101001100001001111010010010010010010010010110110101111100101001111100101011010111100101001001000010010010001011110100010111001110000011010110010110001", + "1010110101001110110100110111001000100101100000110100100110011111001010011111101010110100000110101010000101111001000010111100110101010011111001010100010100100", + "1100101011010000101000001110001110010101011000001101111110111110010100111110110010001100111110010000011111000001101011000001101101101011000001101101010000110", + "1001000100111000011101110101000000011011010110000010010110010010010010010011110101110100001011110101101001001111100101001111000011100101001111100010111101011", + "0011011001000000111111001000100111111000110101100000010101010011111000110100111100011111001010011111101010110101100000110101000000100100100100100000111110011", + "0000010000101100010000011010110100111110010100111111010101101011000000001101100110100111110010100111110100001101011000001100111001011000001101001001101110101", + "1011111001011010010010010001010100110000011010110000111011110100001010010010001000001011110100001011010010000011010111100100010111010110000011001110010110101", + "0010110010000001111010000111111011010011111001010010111100111101000011111000100010100100100100110101000001100000110100000110010100110101100000101100010101001", + "1100111000010111110010100001001001001001001001001001101110100111110010100111110000010100111110001100111001001001001000101111001100001101011000010101001101010", + "1100000111111000100010000001111110000011010110010010010000101001111100101001011100011010110000000010010011001111100100001010000011100101001111100100100010010", + "0001001110011101100101100011100011100000110101111000110011010011111001010011011111111001010011100000010010101100000110101100000000000110101100000110111101111", + "0010010110100011100110101110011011011000001101000001101101001001001001001000101110101111010000101111010010010100111110010100011000111110010100111111100111000", + "0111111110100110101001111110111111010110000011001111111110000101001111100010111110101001111100101000111110000011010110000011111110010010010010010010111111001", + "1111100010010000011101110110100011010011111001010010100011100110101100000000100011001010011111001010100011100000110101100001100010110101100100100100100011000", + "0011101011111000001001001010101011101011000001101010101011001111010000101001101011010000101111010001101010111000001101011110101010001101011110010101101011110", + "0111100011101110101100110001100011100101001111100101100011001011110100001111100010010010010110000011100010110110000011010001100010000011010000011010100011111", + "0001111110001010011111001101111110100100100100100101111111001010011111001010111111111001010101100001111111000100100100100010111111100000110011111000111110111", + "0110110001110011111001011011101011011000001001001000011001110010100111110011010001000001101101011001100111010100111110010001001100111110010100111110110011001", + "0100001110100101010011010100001111010110000101001110001111100101001111100100011101001111100011010111101110011010110000011011000010110000011010110000110101001", + "1101000111010100001011000010000010110101100110101101101100100100100100100101011111000010111101000011100101111001010011111000100001010011111001010011000000101", + "1100011111100101110010101100110110001101011110010101010001011000010100111111101111110010100111110011001101011000001101001001011001001001001001001000011000010", + "1001100010101110101011011000110011100101001111100100010101010110011010110001101011111100101001111101000011010110000011001111110110000010010010010010010111100", + "1110111000010011100100101110101000000110101100000111000110100100111101010011101010111101000010111100100101010011100000101100010101100001010011111001110100000", + "1100110010111001110111101011110110111110010100111111111110010100101111001001010011001000001101011001011111101011011000010100101101011001101011000001010000111", + "0111011100111110101001100010110000010010010010010011110111111100101001100101010101001110000011010111101001110100010010010010000011010111100101001110011100010", + "1011010100011000010100100110011111010100100100100101110100011111001010000110100100101101100000110100001010111101010011111001000001010011111001010011011110100", + "1111101101111110011000011111011101101100111110010101010100111110010100111110011110010101011000001100110101000001101011000001111001101011000001101011101110010", + "1011110001100010111101110101001101100010110000011011011010010010010010010010010000010100001011110101010011001111100101001111101011100101001111100101110110011", + "0001001010001000011001000000000010100001010011111000111100110101100001010011110011111111001010011110100000110101100100100100101010100100100100100101110101111", + "0010010001110101101100000010110000111110010100111111001110001101011001101011010101000111110010100110011000001101011110010100110010101001001001001001001100111", + "0000101110100101000000011001000110110000011010110001110000010010010111100101011011001011110100001010010011100101001000011010110100101111100101001111000010110", + "1001010111010100001000000111111011010011111001010010010011111001010100100100111000110101100000110100110010000110101011111001000001001100000110101100111101010", + "1100001111100101110110111001101011001001001001001000101100100111110100111110001000001101011000001100110010101111010001001001011001010100111110010101000111001", + "1001010010101110110000010000101001110100010010010011000010101001111010110000010010000011010110000010111100001011110101001111110111100101001111100101101000010", + "0110101000010011110100110010110000011111010011111000111001010011111001010011110011100000110101100001011000101100000110101100010100000110101100000110000011111", + "0100100010111001100101101110010110100111101011000000000001001001001001001001001011001001010000101110001000010100111110010100110000111110010100111110110101000", + "0111111110111110001110010110111110001011100101001110111110000011010110000101111111001111111100101000111110000010010010010010111110010010010010010011111111001", + "1111100010011000000000101111100011010011111001010010100011100000110101100110100010101100011111001010100011100001010011111000100011000010100100100100100011010", + "1011101010111111111011000010101011101011000001101011101011001000001101011111101010010100101111010000101010111111110010100000101011110010111110010101101011101", + "1111100011100010011110110001100011100101001111100100100011001110000011010010100010000011010110000010100010110001111100101111100011111100110000011010100011100", + "0011111110101000111010110101111110100100100100100101111111001011111001010011111111100000110101100000111111000010111101000100111110111101010011111001111110100", + "0000100110010100001011001011101110101111010001001000010001110011000001101011011111011000001101011001001101010000101111010100100110111110010100111111000001001", + "0000001011100100100010000000001010101001111101001111110101100101001111100100101111010110000011010110100010011010110000011011001000110000011010110000001111001", + "1010010000110100001000000101110001001010011110101101011110100100100100100100101100100100100101000011100101111001010011111000000011010011111001010010000100101", + "1101111010111101010101001000010111010000101110010101000111011000001101011001110100010100111111110010111111001001001001011000001101001001001001001000010000010", + "1010010100111110110110011100110001100101001111100100101111010110000011010110010010011010110001111101110001001111100101010111100011110100001010010011111101100", + "0100101100000000010110101110111110000110101100000110100100110101100000100100000101111001010010111100110011001010011111010011100000011111001011111001011110000", + "0110000110000011000101101000111100111110010100111111010100001101011000010101011111011000001101011001101001110010100111101011111000100111110011000001001110111", + "0101111011000010001100000011101100010010010010010010111011100101001111111100110001010110000011010110000101110100001011110101001010001011110101001110101110010", + "1101000000101101100110100010000010100010111101000101111000000110101100011110110010110101100000110100100110111101000010111101001011010011111001010010101100100", + "1011011100111011111001011011010000010010100111110100101000111110010100111111110100001101011000001101111111000001101011000000110011101011000001101011010100010", + "1100100000001010111110110011000110011100101001111011101110010010010010010010011011110010010010010101010011001111100101001110010101100101001111100100110010011", + "0000011111010110111000100101111011111101000010111000101100110101100000110100111000011001010011111111010010100100100000110100000000100100100100100101111111111", + "0001000111100101101101000111101111011110010100111111110100001101011000001101101000100001101011000110101010010100111000001101011001001111010000101000100101011", + "0010011010110100110000011000001011010000011010110000010010000011010010010011010010001111100101001010000101111100101111100100010111001001111100101111101011010", + "1011100011101000111000000101010100110011111001010010111001100000110011111001010010110101100000110100000100011111001100000110010100101010011111001100100110110", + "1110101000011011010111011000110100001001001001001001100000111110010010100110101010001101011000001101011110101111010000101110010000010000101111010101110100001", + "1011110110011111001000010100100010010010001011110101001110110000011100101000000100000011010110000010010000001011110100001011111101100101001111110100011010010", + "1101101001010110000100110110110001111001001010011111000101010011111001010010011001100000110101100000010010101100000110101101011110000110101100011110111001111", + "1111100011010001100101101000011001000001110010100110110101001001001001001001000000101111001001011000001000010100111110010101001110111110010100100111101001000", + "1010011001100000011110010011111111001111110100001010111110000011010110000010111110101001100101010111111110010011010110000010111110010010010010001011111111001", + "0000000010001000000000101010100010110011111001000010100011100000110101100000100011001010000110110101100011111000110101100001100010100100111101000010100010110", + "1111111001101111100010000011101010001011000001110011101011011001001001001001101011010000111110001100101010100110010100111111101010010100100111110010101010001", + "1000001001011110011111110011100010000101001111111101100011010111100101001111100010000011010110000011100010101000011010110000100010011010101001111101100010000", + "1011101001110110110010110100111111100100100100111100111110110010011111001011111111100000110101100000111111000010111101000010111111111001000010111101111111100", + "1011101011000100001010101111111101001001001000101111000000001010100111110011110101011000001101011001011111010000101111010001001100111110010000101111110101001", + "1011101011100000110011001001110011001111100100101000001110000101001111100101110011010110000011010111010001111010110000011011100010110000011100101001011011010", + "1000001010111100001000010101101000101100000111001011000101100100100100100101100101000010111000110100110010011001010011111000000001010011111111001010011000100", + "1111111010111011000100010000000000010100111111010001110101011000001101011001011111110010100000001100001000111000001101011000111001001001001111010000101000011" + ], + "2": [ + "1111111000011110011101011100110001001101101111101011001001111011010100010010010100101101111101000110000111010101001111010101010011011110010101011011101111111", + "1000001001111101111001011101011111001011111100011000001001010100101111001011011000100100011011100011101101111011010001111011010101010000011011010011001000001", + "1011101000011111001110010001010111011101011110000010001011101111010011010011110111011101000111111001011010011000110010011000111100110011111000110001101011101", + "1011101000011001111100001110001111100101110001000111000100110001111110111110101100011010011101101111101110101000001100101000000110001001001000001111001011101", + "1011101011000000000110000111111110111001010100110001111111101000001111001101111111000110100110011001111110001110000010001110111110000100010010000111001011101", + "1000001001001010001111101011100011011010101010101110100010010010011001111001100011011010101101010011100011001101111001001100100011100111010011100100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010101101111000100111100011100100001000110101100010000001100101100111100011011011110001001101100010101110011010101111100010000100110000000101100000000", + "0011001111110001010001100010111110100111111100101011111111101100010011010001111110111111110000000000111111000101111101000100111111100101010011100100011010000", + "0111000000011110011101011100110001001101101111101010111011111101010100010011011000101101111101000111010001010101001111010101010011011110010101011110101100101", + "0110011011111101111001011101011111001011111100011000001001010000101111001010111110100100011011100011101101111011010000011011010101010000011011010000000010101", + "0101100100011111001110010001010111011101011110000010101011101111010011010011101111011101000111111001111010011000110011111000111100110011111000110011000001001", + "0010001000000001111100001110001111100101110001000111001000110011111110111110011110011010011101101110110010101000001101001000000110001001001000001001111001010", + "1100010011011000000110000111101010111000110100110000110011101110001111001101001111000110100110011001111100001110000011001110001000000100010010000101110111110", + "0000101101010010001111101011101001011010101010101110101110010100011001111001001111011010101101010010011011001101111001001101100011100111010011100110110100011", + "1000000001110110100011111100111010111110010011101110011111011110111110111100111010000000101010011110110111110101000001110101010001011111101011011110101100100", + "1001011011000111100111010101010101110001001010011101101111011100100101100111110110001001000110110111010101110011001011110011011101010011100101010010100010001", + "1010100101111011110000110001011100000001000010000111010110010000111001111110110101000000010000100010111100111000100010111000111110110011111000110011000001000", + "1101001000110110100010000110000100110001000111000011000010001111110100010001100101111111000000101000110110100000001011000000001110001011000000001011011001110", + "0011010010110001111000100111100001101011001000110100000101011101100101100101011001101011110001000111001100101110000101001110001010000101001110000101110111111", + "1111101101101100010001100011100101001000011100101010111101011110010011010011110011110111110000001011011111000101100000100101101011100100100101100100010100111", + "0111000000000011011101011100110011100010101111101011111000110101010100010110010100011101111101011010100111010101011000010101010011011111001001011110101100101", + "0110011011100100111001011101011111101100011100011000011000100010101111001111111001101100011011111100101101111011001111111011010101010001100101010000000010101", + "0101100100011011010110010001010001010011111110000011110010110011010011010001010111101101000111110011011010011000101100011000111100110010000110110011000001001", + "0010001000011100101100001110001100101011110001000110110100000111111110111110101101010010011101101100001110101001010000101000000110001000111110001001111001010", + "1100010011001101010110000111101010110111110100110001100000100110001111001110000011110110100110010100001010001111110100001110001000000101001000000101110111110", + "0000101101011011000111101011001101011100101010101110101111100010011001111100001000010010101101000101011011001100000110101101100011100110101001100110110100011", + "1000000001101010110011111100011010110000010011101111011110000110111110111100000010101000101010011100010111110100111110010101010001011110010101011110101100100", + "1001111111011010110111010101111111111110101010011100111111101000100101100101111111010001000110111101111111110011010110010011111111010010010011010010111110001", + "1010100011101110111000110000100010001111000010000110100011011000111001111000100011110000010000110111100010111000110101111000100010110010100100110011100011000", + "1101101010111111110010000110101010110111000111000011101011111001110100010000101010101111000000100110101010100000010100100001101010001010111110001010101011110", + "0011100010101101110000100110100011100101001000110101100010000101100101100110100011010111110001000101100010101110011010101110100010000100110000000101100011111", + "1111111111110001011001100011111111000110011100101010111111101010010011010011111110110011110000000000111111000100111101000101111111100101010011100100111110111", + "0111000000010110000101011101101001101100101111101011110001111101010100010100111110101101111101001110110011010100101111010101000111011110010001111111111000101", + "0110011011101101110001011100001001101010011100011000100011010100101111001011101110100000011011110011111101111010110000011010101001010000011100010001010110101", + "0101100100000111011110010001001001011101111110000011001111101011010011010001101111000111000111110000111010011001010011111000100010110011111111110011010101001", + "0001001000000001001100001111111100100101110001000110011110010011111110111111011010011010011101100111110110101000001101001001110000001001001111101000001101010", + "1100010011011000001110000111110110111001110100110000001111101110001111001111110111010100100110000001110100001110000011001110011100000100010010000100100011110", + "0010101101010010011111101010011101011010101010101110110111010100011001111100010101010100101101001010011101001101111001001100011111100111010011100111100000011", + "1000000001110111001011111101100000111110010011101111000011011110111110100101100100001010101010011110110101110101000001110101001111011111101011011110111000100", + "1001011011000110101111010100100001110000101010011101000101011100100101101100111000000001000110110111001001110010001011110010101011010011100101010011010110001", + "1000100101111011001000110000000100000001000010000110011101010000111001100001010011000110010000100011011100111001000010111000101010110011111101010010010101000", + "1101001000110111101010000111010010110001000111000011111000101111110100001000111101111111000000101000100000100001110011000001110010001011000111101010001101110", + "0010010010110001001000100111111111101011001000110101111000011101100101110111010001110001110001000110101110101111111101001110010100000101001001100101100011111", + "1100101001101100000001100010010001001000011100101011110011111110010011011010110111110111110000001010111101000101111000100100011101100100100010100101100000111", + "0111000010000010110101011100101101100010110111101011010100110101010100010100111100001111111101011011001101010101001000010101000111011111001001011111111000101", + "0100011101100100101001011100101011101100010100011000000001100010101111001010100011100010011011111100001011111011001111111010101001010001100101010001010110101", + "0101100000011011100110010000001101010011110110000010101110110011010011001000000001100111000111110010011000011000101100011000100010110010000110110011010101001", + "0010001000011101110100001111111010101011100001000110011110000111111110110111111011011010011101101100010000101001010000101001110000001000111110001000001101010", + "1110010011001101111110000110110010110111100100110000101011100110001111010111100101110000100110010001001110001111110100001110011100000101001011100100100011110", + "0000101111011110000111101010111111011100110010101110010101010010011001100101010000010010101101000000001101001100011110101100011111100110101010000111100000011", + "1001000101101000010011111100100100110000000011101110100011011110111110101100001010101010101010011110110101110100100110010101001111011110010010111110111000100", + "1010111111011010110111010100111111111110110010011101111111010000100101101100111111000001000110111111111111110011001110010010111111010010010100010011111110001", + "1010100011101001011000110001100010001111010010000110100011010000111001111000100011100010010000110110100010111000100101111001100010110010100100110010100011000", + "1111101010111011110010000110101010110111000111000011101010111001110100010000101010111001000000100100101010100000010100100001101010001010111110001011101011110", + "0011100010101011010000100111100011100101001000110100100010001101100101111111100011010001110001000100100010101110011010101110100010000100110000000101100011111", + "1111111111110100011001100010111111000110011100101010111111110010010011011010111110110111110000000000111111000100111001000100111111100101010011100101111110111", + "0101000100010100100101011100011101101100111111101011011110100101010100001100011010101011111101001010110001010100101001010100010001011110010000111111101100101", + "0110011001101000110001011101010111101010000100011000101111100100101111010011000110100100011011110111110111111010101110011010011101010000011100110001100010101", + "0100100010000101111110010001111101011101101110000010110110111011010011000001010100100111000111110010011100011001001101111001111110110011111111010010100001001", + "0001001100000001101100001110000000100101101001000110000010011011111110110110101101111010011101100101010100101000010101001001001110001001001111001000111001010", + "1100010011011111101110000110100000111001100100101001100101111110001111001111100000110100100110000001101010001110010011001111001010010100010010000100110111110", + "0010101101010110011111101011100101011010101010111111011101010100011001111100110011110100101101001001011001001101111001001100101011111111010011100111010100011", + "1000000011110000001011111100110010111110010011111111011001010110111110100101111101001010101010011111100001110101000001110100010011000111101011011111001100100", + "1001011111000010101111010101011111110000101010011100011001000100100101101101010000100001000110110110001111110010001111110010010101001011100101010011100010001", + "1000100001111001001000110001110000000001010010010110110011001000111001100001110110000110010000100111011100111001000100111001111100110011100101010010000001000", + "1101001010110011101010000110001100110001011111010011110100111111110100001000011100011111000000101100101100100001110101000001000110001011011111101010111001110", + "0010010100110011001000100111001011101011011000100100000000001101100101110111100000010001110001000100101010101111111011001111001000000101010001100100010111111", + "1100101001101100000001100011101101001000000100110011101111110110000011011011000000010111110000001000111001000101111000100100100011100100110010100101010100111", + "0111000000000100110101011101111011100010111111110010111110100101011100010100011001101111111101011010110001010101001000010100010001001111001001011111101100111", + "0100011011100000101001011101010011101100011100001001101011100010110111001010100111000010011011111111101111111011001111111100011101001001100101010001100010110", + "0101100110011101100110010001011111010011111110010010110100111011001011001001110000100111000111110010000100011000101100011111111110101010000110110010100001010", + "0010001100011001110100001110000100101011110001000111000010011111111110110111001011111010011101101101000100101001010100101111001110010000111110001000111001001", + "1110010111001111111110000111000110100001100100100000000101111110010111010111000000110000100110010001101010001111110010001011001010000101010011100100110111110", + "0000101111011110000111101011100001000010110010111110011001010010011001100101110101110010101101000001011001001100011000101100101011100110110010000111010100011", + "1001000111101000010011111100010000110010000011111111011011010110111110101101011101001010101110011111101001110100100000010100010011011110001010111111001100100", + "1010111111011010110111010101111111111000110010000101111111000000100101101101111110100001000100111110111111110011001110010010111111010010000100010011111110001", + "1010100011101001011000110000100010001111010010011110100011001000111001111000100010000010010110110110100010111000100101111000100010100010100100110011100011010", + "1111101010111011110010000111101010100111000111010010101010111001100100010000101010011001000110100100101010100000010100100110101010010010111110001011101011101", + "0011100010101011010000100111100011101001001000100101100010001101111101111110100010010001110011000101100010101110011010101000100010011100110000000101100011100", + "1111111111110100011001100011111111001110011100101011111111110010010011011011111110010111110100000001111111000100111001000010111111111101010011100101111110100", + "0101000100010100100101011101100001100010111111111010000010100101001100001101001011101011111101001010000101010100101001010001101111011110001000111110011000101", + "0110011011101000110000111101100001111100000100001000000101100100101111010010100001000100011001110111001010011010101110011010001011010000000100110000110110101", + "0100100100000101111111010000000101011111101110010010111100111011010011000000010100100111000011110010011001111001001101111000001010110011100111010011110101001", + "0001001010000001101101100111110010100011101001011111011000011011111110110111111101111010011111100100101001011000010101001001010010001001011111001000101101010", + "1100010111011111101111010110111110111001100100101001011001111110001111001110010000110100100000000001011111010110010011001110110100010100110010000101000011100", + "0010101001010110011110111010010001001010101010111110010011010100001001111100010111110100101011001001111100110101111001001010111101111111110011100110000000000", + "1000000011110000001011111101001100110010010011111111110101010110100110100101111001001010101000011111110100001101000001110011100111000111101011011110011000111", + "1001011101000010101111101101101011111000101010011101100001000100100101101100100110100001000010110111110010010010001111110100001001001011100101010011110110010", + "1000100001111001001001010000001100001111010010010111101111001000100001100000100110000110010000100111101001111001000100111100000010110011100101010011010101000", + "1101001000110011101010000110111010100111011111010011011110111111110100001001111010011111000010101100010001000001110101000001010000001011011111101011001101110", + "0010010010110011001001010110110011101001011000100100001010001101100101110110100010010001110101000100101111001111111011001110111100000101010001100100100011111", + "1100101111101100000001101010011111001110000100110010110101110110010011011010010000010111100010001001000100110101111000100100111111100100110010100100100000111", + "0111000100000100110100101101100101100010111111110010000010100101010100010101001011101111101011011010000100001101001000010101101111001110001001011001011000111", + "0100011111100000101000001100100111111100011100001000100101100010111111001010100001000010010101111111001010000011001111111100001011001000000101010100110110110", + "0101100110011101100110010000100001011111111110010010111010111011001011001000010100100111011101110010011001100000101100011110001010101011100110110001110101010", + "0010001110010001110100110110110000100011110001000110011010011011111110110111111101111010000001101100101001001001010100101111010010010001011110001010101101001", + "1110010111000111111111100110111010111001100100100000111001111110010111010110010000110000111110010001011111001111110010001010110100000101010011100101100011110", + "0000101101011110000111101011010111001010110010111111010111010010011011100100010111110010110111000001111100101100011000101100100101100110110010000110100100011", + "1001000001100000010010001101101000110010000011111111110001010100111110101101111001001010101110001111110100010100100000010101111111011110001010111111111110100", + "1010111111000010110111011100111111111000110010000101111111000000100011101100111110100001001100100111111110000011001110010010111111010010000100010010111110001", + "1010100011100001011001000001100010001111010010011111100011001000111011111001100010000010001110100111100011100000100101111000100010100011100100110100100011010", + "1111101010101011110011010111101010100111000111010011101010111111100000010001101010011001000110111100101011011000010101000111101010010011011110001101101011101", + "0011100010111011010000100111100011101001001000100100100010001111111001111110100010010001101011000100100011010110011011001001100010011101010000000010100011100", + "1111111111110100011001011010111111001110011100101011111111110110010001011010111110010111101100001001111110100100111000100010111111111100110011100000111110100", + "0101000010001100100100111100010011100010111110011010011110100101001010001100011101101011100101011011001000010100101000010001001011011110001000111110101010101", + "0110011111110000110001011100111111111100000100001001111101100100101101010011010001000100000001101111111110011010101110011011010101010000000100110000100100101", + "0100100000001101111111100001110001011111101110010011110000111001010011000001110110100111000011110011011101111001001101111000111100110011100111010011000001001", + "0001001010011001101100000110101100100011101000111111110000011011111000110111011001111010010111100101110101011000010101001001000111101001011111001000011001010", + "1100010101010111101111110111001010111001100100101001000101111110001101001111000110110100111000000000010011010110010011001111101000010101010010000010010111100", + "0010101001000110010110111011101101001010101010011111001011010010001101111101100111110100101011011001001000110101111000101010000011111110110011100001110100000", + "1000000001100000000011111100011010110010010011011110011101010100100010100100011011001010110000011110110000001101000000010010101101000110001011011001001000111", + "1001011011000010101111101101010011111000101010111100101011000000100111101100000010100001011010111110101110010010001110010101000011001010000101010110000100010", + "1000100111100001001001010001111110001111010010010111110011001000100111100001110000000110001000110110100101111001000101111100100001010011100101010011000110100", + "1101001100101011111010000111100100100111011111110010100110111111110110001000001010011111011010110100100101000001110101000000011001101011011111101011111111010", + "0010010110111011011001010111000111101001011001000101000110001111100101110111000000010001110101000101101011001111111011001110001011100101010001100101110110011", + "1100101111110100011001101011000001001110000100010010011101110110010101011010110100010111111010001000011000110100111000100100101010100100110010100101110100111", + "0111000110001100100100101100010001100010111111110010011110100101010110010100011101101111100011011011001000001100101000010100110011001110001001011001001100111", + "0100011111110000100000001101011011111100011100101001111101100100111011001011010001000010011101101111111110000010101110011100110101001000000101010111000010110", + "0101100100001101101110010001110111011111111110110011110000111001001111001001110110100001011101110011011101100001001101111111000000101011100110110100110101010", + "0010001000011001110100110111101000100011110001100111110000011011111100110111011001111000000001100101110101001001010101001110011000010001011110001101010111001", + "1101010001010111111111100110101000111001100000100001000101111110010001010111000110110110111110000000010011001111110011001010010111100101010011100101100000010", + "0001101001000110010111101010001001001010110100011111001011010010011011110101100111110100110111011001001000101100011000101101110100000110110010000110011011111", + "1011000101100000000010001100011000110010000010011110011101010100111110100100011011001100101110011110110000010100100000010101010000111110001010111110101101000", + "1010111111000010101111011100111111111000110000100100111111000000100011111100111110100011001100111110111110000010001110010010111110010010000100010011111111001", + "1000100011100001001001000001100010001111010110011111100011001000111011100000100010000000001110110111100011100001000101111000100010100011100101010100100011010", + "1101101010101011111011010110101010100111000101110010101010111111100000011000101010011001000110110101101011011001110101000110101010010011011111101101101011101", + "0010100010111011011000100111100011101001001000000100100010001111111001110110100010010111101011000100100011010111111011001001100010011101010001100010100011100", + "1100111111110100011001011010111111001110011110001011111111110110010000110011111110010101101100001001111110100100111000100010111111111100110010100001111110100", + "0101000010001100100100111101101101100010111011111010110000100101001010110101111001101101100101011010110100010100101000010000100110111110001000111111011001001", + "0110011101110000100001011100001101111100000010101000000101100100101100100010000111000010000001101111010010011010101110011011101000110000000100110000010111001", + "0100100000001101101111100001001011011111101111110011001010111001010010100000000110100001000011110011101001111001001101111000100011010011100111010010010100101", + "0001001000011001110100000110011110100011101011111111111100011011111000111111111011111000010111100101110001011001010101001001101101001001011111001000010000010", + "1110010011010111111111110110110100111001111000101001101011111110001100001110100010110110111000000001101111010111110011001110000010010101010011110011111101100", + "0000101111000110010110111010111011001010110000011110110011010010001101010100110001110100101011011001100100110100011000101010100001111110110010011001011110000", + "1001000101100000000011111100100010110010001011011110100111010100100010101101101011001100010000011110000100001100100000010011111001000110001010100001001110111", + "1010011111000010101111101101000101111000101000111100100111000000100110100100100000100010111010111110101010010010001110010101001011001010000100001110110110010", + "1000100111100001001001010000000010001111001110010111011101001000100111111000010100000000001000110111011001111001000101111101001011010011100101010010110100100", + "1101001110101011111010000111010110100111011001110011011110111111110111111001011100011000111010110100001001000001110101000000110011101011011111101011001100010", + "0010010110111011011001010111111001101001010001000101111100001111100100010110110000010110110101000101011111001111111011001110010101100101010001100100100010011", + "1100101101110100011001101011110011001110011110010010010001110110010101010010010110010100011010001000011100110100111000100100000000100100110010100101111101111", + "0101000000001100100100101101101111100010100011110010110000100101010111010101111001101100100011011010110100001100101000010101011001001110001000101000100110111", + "0110011001110000100000001100001101111100000110101000000101100100111011100010000111000010011101101111010010000100101110011100010111001000000100101111101000110", + "0100100000001101101110010011001111011111100110110011001010111001001111000000000110100001111101110011101001100111001101111110010100101011100111001100100011010", + "0001001100011001110110110010011110100011110011100111111100011011111101111111111011111001100001100101110001001111010101001110010000010001011111010101101101001", + "1110010001010111111101100010110100111001111000111001101011111110010001001110100010110110111110000001101111001011110011001011111101111101010011100100000010010", + "1101101011000110010111101000111011001010110100010110110011010010011010010100110001110101010111011001100100101100011000101101011110010110110010000110100001111", + "1111100101100000000000001110100010110010001010011110100111010100111111001101101011001101101110011110000100010100100000010101001110100110001010111111111001000", + "1010011101000010101101011011111111111000101000110100111111000000100011100100111110100010101100111110111110000010001110010010111110001010000100010011111111001", + "0000000011100001001001000110100010001111001110011111100011001000111010111001100010000001001110110111100011100001000101111001100010100011100101000100100011010", + "1111111010101011111101010001101010100111011101110010101010111111100000111001101010011001000110110100101011011111110101000111101010010011011111110100101011101", + "1000001000111011011110100001100011101001010000011101100010001111111001110111100010010111001010100101100011010001111011001000100010011101010001111011100011100", + "1011101001110100011011011000111111001110011110001010111111110110010000010010111110010100001101101001111110100010111000100010111111111100110010111001111110100", + "1011101010001100100110111111111111100010100011110011111100100101001010010101011011101101100101111011110000010000101000010001001100101110001000111110010001001", + "1011101011010000100001011111110101111100000010101001001011100100101100100011000011000011100000001110001110011010101110011011100010101000000100110000011101010", + "1000001000001101101101100010111011011111100111101011010010111001010010100001110000100000000011010011000101111001001101111000000001001011100111010011111110100", + "1111111001011001110110000000000010100011110011100110000110011011101000111110001011111001110111100100100101011001010101011000111001010001011111001001001110011" + ], + "3": [ + "1111111000001110100101001110110101111101011001110000100111000111111011011010101111011110110011011111111000001101001110001101010011001000010000101011101111111", + "1000001010101101100110010100100000001010111101001101110010000100111011011100011111110011110101010011110010000101001000000011010101010110011100101111001000001", + "1011101010110011011100100101010101000110011111010011000101100111000110010101001000111010100000110011110011100110101011100000111100110101111111001101101011101", + "1011101001110110110011001111000110000110101100100111010011101010100100001111110010001110111000001011010011011111010001011000000110001101001111010011001011101", + "1011101001111101111100010001111110100001100010101011111110011100100000000001111110000101110110000101111111010011110101010110111110000011001011110011001011101", + "1000001001100011000010100011100010111111001011111011100010111010001101101011100011000101010101100100100010110010011110110100100011100000101010011000101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001111101100110010011100011110011101001100101100011011001110000100010100010001100001010000100100011010001111101010111100010000011001001111010000000000", + "0111011000110011010110100011111111101100100001001011111110001111001001100010111111100011001011100110111110110011111100110100111111100000100010111001100000110", + "1101100110001110100101001010110011111011011001111000100111011111111011011010100111011110110011011111000110001001001110001101010011001000010000101001010010101", + "0010001000101101101110010101110110001000111101000100010010010100111011011100100001110011110101010011101010000101001000000011010101001110011100101111010100101", + "0100110110110011000100100100101001000100011111001011000101100111000110010101010110111010100000110010000011100110101011100000111100101101111111001100100001001", + "1000111101110110101011001110111110000000101100100110110011100010100100001111010000001110111000001010101011011111010001001000000110010101001111010100011001010", + "0110110101111101101100010001101110100001100010100011111100000100100000000001110100000101110110000101000101010011110101001110001000000011001001110010010111110", + "0100111111100011001010100010110110111111001011110010100100110010001101101010001001000101010101100100100100110010011110101101100011100000101000011001110100011", + "1001010010100110100101001000111010101000110010101110101000011010101011111000100101010111001001011110011110001010100110010101010001011000010010100001010000100", + "0011101110000101111000010101111101011010010111110101101000100001111111010100001001010101100101010000001000000101001010000011011101010110010100001111011100001", + "0000000011100011001000100111011000010110110100001101001010101010010110110111001010110011000110110010101011100100100011100000111110100101111101000100111111000", + "1001011011110110100101001110101101010011100110010111001001001111100010000111111010101000111110001000110001011110010011011000001110010101000111110100001111110", + "0010000000000101111010010010011001110010101001110101110011010001110100100011100000001100010110000100110101010000011101010110001010011011001001111010000111111", + "0101011000011011001110100011010011101101000001001011011110001111001101100010111101100011010101100111000110110010111100100101101011111000100010111001111100111", + "1101100110100110100111001010110101111010111001111000100111011111111011011010111111011110101101011110011110001000101110010101010011011000010100101001011101001", + "0010001001010101111100010100000110001001111101000100010010000100111011011100110111110011100011010010010010000100101000011011010101010110011010101111001011001", + "0100110111101011001000100101010111000101011111000011000101110111000000010101001000111010100100110011110011100111001011111000111100110101111001001100111100101", + "1000111101011110100011001110100110000001001100101110110011111010100000001111011010001110111110001011010011011110010001011000000110001101001001010100000110010", + "0110110101110101111110010001101110100000000010111011111100011100100110000001111100000101110000000100011101010010010101010110001000010011001011110010001001110", + "0100111111011011001000100011000000111110001011111010100100100010001100001010000111000101010011100101011100110011111110110101100011111000101010011001100010011", + "1001010011011110100001001001000010101001110010101110101000001010101110011000110011110110101101011111101110001011000110001101010001000000010010100001010100100", + "0011111110001101111000010101111111011011110111111101111110111001111111010100111110010101100011010001111110000100001010010011111111001110010100001111111110001", + "0000100011101011001010100111100010010111010100010101100010110010010000110110100010010010100000110011100011100101000011111000100010110101111001000100100010100", + "1001101010101110100111001110101011010010100110011110101011011111100001100110101011001000111000001000101011011111110011000001101010001101000001110101101010010", + "0010100010011101111110010011100011110011101001110101100011000001110111000011100010001101010010000100100011010001111101001110100010000011001111111010100010011", + "0101111110110011001110100010111111101100100001000010111110010111001101100010111111100010110011100110111110110011111100110101111111100000100100111001111111111", + "1101110100001110100101001011111111111011011001100111110011000111111101011010110000111110001011011111101010001001001110001101000111001000010001001001000000101", + "0010111101101101111110010101101110001000111101001111111100010100111010111101011101010010000101010010000100000101001000000010101001001110011101001110101110101", + "0100110110110011001100100101010001000100011111000111000101100111000011110101100000011010100000110010100101100110101011100000100010101101111110101100100101001", + "1000011011000110100011001110111010000000101100100000001001100100100100001111010101001110111000001011111111011111010001001001110000010101001110010101010001010", + "0110100111010101111100010001011100100001100010100110101000000110100110000000101000100100110110000101001001010011110101001110011100000011001111110011111100010", + "0100001011000011001010100010011000111111001011110101001010110110001100001011101010100101010101100101001010110010011110101100011111100000101100011000011111111", + "1001010011011110100101001000101100101000110010101100101000011000101100011001101011010110001001011110110000001010100110010101001111011000010100100000001111000", + "0011001000011101111000010101011001011010010111110101010010100011111011010101101001010100000101010000010100000101001010000010101011010110010010001110101111001", + "0000010001100011001000100110010010010110110100001010011110101010010000110111011101010011100110110010000111100100100011100000101010100101111100100100101101000", + "1001101110101110100101001110110101010011100110010100100111001101100001100111000110001001011110001001011111011110010011011111110010010101000110010101110101110", + "0010000000000101111010010011100111110010101001110001110011010101110101000010010110101100010010000100010011010000011101010000010100011011001000011010010011111", + "0101111110101011001110100011010111101101000001001101100100001001001001100011111000100011010011100110010010110010111100100010011101111000100011111000111100111", + "1101110100001110100111001010000111111010101001111101110011011101111101011011010011111111101011011110010010001000101110010001000111011110010100101001100111001", + "0010111101110101111100010100101110001001101101000011111100000000111010111100011100010011100101010011111100000100101000011010101001010000011010101111001001001", + "0100110110110011001000100101000001000101000111000001000101110101000001110100000110111011100100110011011101100111001011111000100010110011111001001101000010101", + "1000011101000110100111001110000010000001010100101110001001111000100000001110110010001111011110001011001111011110010001011001110000001001001001010100110100010", + "0110100001010101111100010000100100100000000010111100101000011100100110000001101011100101010000000100110001010010010101010110011100010011001010010010011011110", + "0100001001000011001110100011011000111110011011111001001010100000001100001010101011100100110011100100110010110011111110110010011111111000101011111000011000011", + "1001010001011110100101001000111100101001111010101010101000001110101110011001001001110111001001011111001000001011000110001011001111000000010011000001001000100", + "0011111110011101111100010101111111011011111111111011111110111111111111010101111110010101100101010000111110000101001010010100111111001110010101001110111110001", + "0000100011100011001010100111100010010111000100010000100010110000010000110110100010010010000110110011100011100100100011111101100010110011111001000100100010100", + "1001101010101110100011101110101011010010110110011001101011011011100001100111101011001000111110001000101011011110001011000001101010001011000001110101101010010", + "0010100010000101111110010010100011110011110001110111100011000011110111000010100010001101010010000100100011010000000101001110100010000101001111111011100010011", + "0101111110101011001010000010111111101100111001000011111110010101001101100010111111100010110011100111111110110011100100110100111111100100100100111001111111111", + "1101010100001110100110001010111011111011011001100110101001000111111101011011010100111110001011011110111110001001011110001100010001001000010001001001110000101", + "0010101001110101111001110101111100101001001101001111101000010110111010111101101111010010000101010011001000000101001000000100011101001110011101001111111100101", + "0100000110110011001001100100111000000100010111000110101011100011000011110101001010011010100100110010101011100110101011100111111110101101111110101101111111001", + "1000011001000110100110001110101101100001000100100000101001100100100100001110001001001110111110001010010001011110010001001111001110010101001110010101001111010", + "0110000011010101111101110001110001000000010010100111110010000110100110000000001110100100110000000100010101010010010101001011001010010101001111110011001110010", + "0100011111000011001110000011000011011111111011110101011110110110001100001010011000100101010011100101100110110011100110101100101011111110101100011000101101111", + "1001100101011110100101001000110100001001101010101101000110011000101100011001000111010110001000111111011110001011011110010100010011000110010100100001010101000", + "0011001110011101111100110100000111011010001111110101110010100011111011010100010011010100000100110001010010000101010010010010010101001010010010001111110011001", + "0000110001100011001011100111000110010110110100001011000100101010010000110110111001010011100111010010110011100100110011111001111100100101111100100100011001000", + "1001111010101110100010101110111111110010010110010100110011001101100001100110110100001001011111001000001010111110010011000111000110010101000110010100100001110", + "0010110000000001111111010010010110110010100001110000011101011101110101000011111100101100010010000100000100110000011101001001001000011011001000011011001111111", + "0101111100101011001011100010100000001100101001001101000100000001001001100011100100100011010011100111100101010011111100100010100011111000100011111000100100111", + "1101010000001010100110101010001010011011001001111100101001001101111101011011010101111111101011011111011111001001001110010000010001001110010100101000010101001", + "0010101001110101111000110100000101101001001101000011101000010000111010111100101110010011100101010011010000000101010000011010011101001000011010101110011011001", + "0100000000110111001000100100100001100100000111001000101011101101000001110100101010111011100101010010110011100110110011111001111110101011111001001100111000101", + "1000011101000000100111101111001100000001010100100110101001101000100000001111001000001111011111101010001001011110001001001001001110010001001001010100101000010", + "0110000111010111111101010001010000100000000010100101110010010100100110000000001111100101010001100100000101010010000101001111001010010011001110010010101110010", + "0100011111000011001111000010110010011111111011110001011110100000001100001011011001100100110010100101100111010011111110101010101011111000101101111001001100111", + "1001100011011010100100001001001101101001111010100011000110000110101110011000100111110111001001011111011111101011000110010010010011000000010101000000010101000", + "0011111110011101111101010100111110111010011111111011111110110111111111010101111110010101100101010001111111100101001010010100111111001110010011001110111110001", + "0000100011100111001011000110100011110110100100010001100010100000010000110110100010010010000110110010100010100100100011111100100010100011111001000100100010100", + "1001101010101110100011101110101010110010010110011000101011001011100101100111101011001000111110001001101011011110001011000000101010010011000001110100101010010", + "0010100010000001111110010010100011010010110001111111100011011011110111000010100010001101010011100100100011010000000101001110100010011101001111111010100010011", + "0111111110101101001010000010111111101100111001001011111110000101001000100010111111100010110010000111111110110011100100100100111111111100100100111000111111111", + "1100010000001100100110001011001101111011011001111110001001001111111111111010001000111110001010111111001000001001011110010101101111001000010101001001001001001", + "0001001011110101111001110100010000101001001101000110110010010110111110011100001111010010000100010010100101100101001000011100001011001110011011001110101111001", + "0111010110110111001001100100010010000100010111001111011111101011000001010100111000011010100100110010100110000110101011111110001010101101111000101101101100101", + "1010101101000110100110001111001101100001000100100000100111101100100100101111100111101110111110001011111110111110010001001111010010010101001000010100110100010", + "0111000111010001111101110000010111000000010010100111010010010110100101000001110011000100110000000100010010010010010101001010110100010101001110010011110010010", + "0111111001000011001110000010100111011111111011110100000100100110001001101011011000000101010011100100010010110011100110101100111101111110101101111000111001111", + "1010110011011010100101001001111110001001101010100100110010000000101100011001010100010111001000111111001010001011011110010101100111000110010100000001100001000", + "0011111000011011011100110100010111011010001111111101111100110011111111110100011101010101100100110000100100000101010010010010001001001010010010101110001111001", + "0001110101100001001011100110100000010110110100010101100100100010010011110111100100110010000111010010100101100100110011111000000010100101111000100100100100100", + "1101011000101110100010101111001011110010010110011101101001001101100100000111010100101000111111001001111110111110010011000111010000010101000000010101110100010", + "1001100000000000011111010010100100110010100001111111101011011101110111000010001111001101010010000100010000110000011101001000111100011011001110011011011010011", + "1111001000101010101011100010100000001100101001001001001000000111001001000010001011100010110011100110010011010011111100100010111111111000100101111001011001111", + "0000010100001011000110101011001100011011001001111010001101001111111110011010101001011110001011011111001001001001001110010001101111001110010101001000101001001", + "1001001111110101011000110100010001101001001101000000110000010100111111011101101111110010000101010010100100000101010000011100001111001000011011001110001111001", + "1011010110110111001000100100010011100100000111001001011001101011000001110100111001111010100101010010100111100110110011111110001100101011111000101100001100101", + "1100101011000001100111101111001100000001010100100100100001101000100100101111000110001110111111101011111111011110001001001111010100010001001000010101010100010", + "1111000011010111111101010000010110111000000010100001010100010010100101000001010010000100110001100100010011010010000101001010110010010011001110010010010010010", + "0000111101000011001111000010100110011111111011110110000100100110001001101010111001000101010010100100010011010011111110101010111101111000101101111000011001111", + "0010110011011010100100001001111111101001111010100100110000000000101100011001110100010110001001011111001011101011000110010011100111000000010101000000000001000", + "1001111110011100011101000100111110110010011111111111111110110011111111110101111111010100000101010000111111110101001010010100111111001000010011001111111111001", + "1101100011100110101011001110100011101110100100010111100010100100010011110111100010110011100110110011100010111100100011111100100010100011111000100101100010100", + "0010101010101110000011110111101010100010011110011010101011001011100100000110101010101001011110001001101011000110001011000111101010010011000000010100101010010", + "1101100010000001111110000010100011000010110001111110100011011011110111000010100011001100010011110100100011001000000101001001100010011101001110011010100010011", + "0001111110101100001010011010111111100100101001001000111110000101001001000010111111100011010010011110111110110011100100100010111111111100100101111000111111111", + "0100100100001100100110011011001101100011001001111010100001001001111110011011100111011111101010100110011110001001011110010001010011001110010101001000110101001", + "0110001111110101111001111101010110100001011101000001101100010000111111011101110011110011100100001010010011100101010000011101010101001000011011001110110011001", + "1111110000110111001001111100100110010100010111001001001101101101000001110101011001111011100100110011110010000110110011111110111000101011111000101101011000101", + "0010111011000111000110000111011111111001001100100101001101101000100100101111010100001111011110001011001010101110001001001110000000010001001000010101000000010", + "1011110001010000011101111000010111011000010110100001110010010010100101000000111100000101010000000101000100001010000101001010001110010101001110010011101110010", + "1111111101000011101110110011100001001111101101110111001010100110001001101011000101000100110011100100100100101011100110101011100101111110101101111000000101111", + "0110010001011010100101010001001010011001111000100100110000000000101100011000110100010111001000101110011110010011011110010011010001000110010101000000110101000", + "0111101000011010111101001100000101010010010101111110010010110011111111110100001111010101100100101000010000000101010110010101011101001010010011001110011011001", + "1001000001100001001011010110100001001110100110010111010100100100010011110110001010110010000111001011110011100100110101111100111110100010011000100101011000100", + "1101011100101110100010000110001100011010000100011010110111001011100100000110101000101000111111010001001000111110001101000110001110010010000000010101101000010", + "1001000110000001111110101010010000100010100011111111111011011011110111000011101111001101010011100101000100110000000011001000010110011100101110011011101110011", + "1111011110101010101011001010110010110100100101001000100000000101001001000010111001100010110010000110100111000011100100100011110101111101000101111000101101111", + "0000100010001011000110100011001100000011001001111010101001001001111110011011100111011110001010111110011111010001011110010001001101001110010101001000110101001", + "1001001011110101011001000101010111011001011111000001111100010000011111011101110011110010000100010010010011111101010000011101000011001000011011001110110011001", + "1011110100110111001000011100100111010100010111001001011101101101100001110101011001111010100101000011110010011110110011111110111100101011111000101101011000101", + "1100111011000001100110110111011111101001001000100101001001101000000100101111010100001110111111110011001010111110001101001110000110010001001000010101000000010", + "1111110111010111111101100000010111011000010000100001100010010011000101000000111100000100110001111101000100010010000011001010001000010100001110010011101110010", + "0000111001000001001111101011100001110111101001110111011010100110101001101011000101000101010010111100100101010011100000101011100011111111001101111000000101111", + "0010010101011010100101110001001010111001111000100100100000000001001100011000110100010110001000111110011111101011011000010011001101000111110101000000110101000", + "1001111110011010011101111100111110100010010011111110111110110011111111110100111111010100000100110000111111110101010010010101111111001011110011001110111111001", + "1101100011100000101011001110100011101110100100010110100010100101110011110110100010110011100111010010100010111100110011111100100010100011111000101100100010100", + "0010101010101100000010011111101010000010000100011010101011001011000100000011101010101001011111001000101010100110001011000111101010010011000000011100101010010", + "1101100010000011111110101010100011100010100001111111100011011010010111000001100011000100010011110100100010101000000101001000100010011101001110010011100010011", + "0001111110101100001011011011111110000100100101001001111110000101101001000111111111110001010010011110111111010011100000100011111111111100100101101000111111111", + "0100110000001010100110111011011110000011001011111010101101001000111110011110110101010001101010100111101011001001011000010001011001001111010101001000100001001", + "0110111011110111111001011100010111000001011111000001010010010000011111000111011101100001100100001010000101100101010110011100110111001001111011001111001111001", + "1111110010110101001000011100100001010100010101001000001011101100100001101010100101101011100101010010000100000110110101111110110100101010011000101100000100101", + "0010011101000001000110100111101011111001001000100100110001101000100100101110110100000011011111101011011110101110001001001111110000010000101000010100010100010", + "1011100011010000011101111000000101011000010010100001110010010011000101011001101110011001010001100100110000001010000101001010011100010101001110000101111010010", + "1111001101000001101111110010100001101111101001110111110100100110101001111111101011011110110010100100110011001011100110101010011111111110101101100111111001111", + "0110010111011000100101110001001100111001111010100101110110000001001100011011001000000111001000101111101001110011011110010011001111000110010101011111101001000", + "0111001110011010111101101100110000110010010011111110111010110011001111101001101111010111100100101000000101100101010110010100110111001010010011010011001111001", + "1001010101100111001011010110110011101110100110010110100000100101010011101011011000110100000111001010000110100100110101111100110100100010111000100101001100100", + "1101101000101100100010000111001100011010000100011011001001001011001100000100000110110010111111010001011110111110001101000111001100010010100000010100010100010", + "1001000100000011111110101010010111100010100011111111111101011010010111011100010011011101010011100100110010110000000011001000100010011100101110011010110010011", + "1101111000101100101011001010000110010100100101001000111100000101010001001011011001101110110010000110110011000011100100100011111101111101000101111001111001111", + "0011110000001011000110100011011110000011001001111011101001001000010110010010110101000010001010111111101011010001011110010000100111001110010101011110100001001", + "1001111011110111011001000100010111011001011111000001000010010000010111001001011101101000000100010010000101111101010000011101101001001000011011010001001111001", + "1001110010110101001000011100100001010100010111001001111011101100100001110110100101101011100101000010000100011110110011111110100010101011111000110010000100101", + "1100011101000001100110110111101011101001001000100101000001101000010100110010110100001101011111110011011110111110001101001111101100010001001000001000010100010", + "1100100011010001111101100000000101011000010000000000010110010011100101011101101110000011010001111100110000010010000011001010000010010100010110010011111010010", + "1101101101000001001111101010100001110111101000010111000100100110100001101001101011011110110010111100110011010011100000101010100001111111010101111001111001111", + "1111100111011000100101110001001100111001111000000100100110000001001100000111001000000110001000111111101001101011011000010011111001000111101101000001101001000", + "1010011110011010111101111100111110100010010010011110111110010011100111111101111111011000000100110000111111110101010010010101111111001011100011001111111111001", + "0000000011100110001011001111100011101110100100110110100011000101111011111111100010101111100111010010100010111100110011111100100010100011111000110010100010100", + "1111111000101101100010011111101010000010000101011011101011001011001100010010101010110011011111001001101010100110001011000110101010010011000000001010101010010", + "1000001010000010111110101010100011100010100001011111100010011010010111000001100011011101010011110101100010101000000101001001100010011101001110000101100010011", + "1011101000101100001011011010111110000100100100001001111110100101111001011111111111100000110010011110111111000011100000100011111111111100100101100101111111111", + "1011101010001011100110111011001010000011001011011011110000101000111110000111010101011000001010100111011111010001011000010000010001001111001101001001010101001", + "1011101011110110111001011100000101000001011110100000010010010000010111011110101111101000000100001011010001111101010111111100011101001001100011001111111011010", + "1000001010110100001000011001100001010100010101101000110101101100100001101011001011101011100101000010110010011110110100011111111110101010000000101100011000100", + "1111111001000001100110100011001101111001001001000101110111001000111100100110101000000011011111110010001000101110001000101111001110010000111000010100101000011" + ] + }, + "36": { + "0": [ + "11111110101111010010010100100001011011001101010100100001111010101001111101111011010110000011010110000110000011010110000011010011001011110100001011110011001111111", + "10000010110011001100001010110001111100010101111101111000001011000010111100111000110101100000110101100101100000110101100000110000101010011111001010011110001000001", + "10111010010101110011010010001100001110000101001110111010010011010000101110101000001101011000001101011101011000001101011000001000010010100111110010100100101011101", + "10111010100100000010001011011110110001100111101011011100110001111100101000101110000011010110000011010011010110000011010110000110010100001011110100001110101011101", + "10111010011001100100101111110111101101111011100011111111001100011111001011111111100000110101100000111111110101100000110101100111111101000010111101000000101011101", + "10000010011110100001101000111100010001111000010110001101100110101111010000100011011000001101011000001000101101011000001101011010001111110010100111110000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000111000011110111000100001100011101000100110001111111110111101000010100011100000110101100000101000110101100000110101100110001111001010011111001011000000000", + "10110111011111011001001111100101101010111100110011111111101010100111110011111111011000001101011000001111101101011000001101011111111111010000101111010001101001011", + "11100101101111010010001100100001011011001101010100100001111010101001111101111011010110000011010110000110000011010110000011010011001011110100001011110101101001110", + "00100110010011001100011010110001111100010101111101111000001011000010111100011000110101100000110101100101100000110101100000110000101010011111001010011110100010011", + "01111101010101110011001010001100001110000101001110111010010011010000101110101001001001001001001001011101011000001101011000001000010010100111110010100110110000100", + "01101110100100000010011011011110110001100111101011011100110001111100101000001111100101001111100101010011010110000011010110000110010100001011110100001010111100001", + "11010001011001100100111010010111101101111011100010010111001100011111001011001100000110101100000110100000110101100000110101100101111101000010111101000011011111000", + "01001011111110100001110111011100010001111000010000010101100110101111010001110100111110010100111110010000001101011000001101011101000111110010100111110011001111110", + "10010100001110101000010001010111010101011110010101100001001000001011110101110011010110000011010110011110000011010110000011010011001001111100101001111101101011111", + "00111010010010110100101101101000000111010001011101101010000111001010011110111000110101100000110101111101100000110101100000110000100010111101000010111100001010111", + "11111100110100001001010111111010000000010110001111111010100001110010100110100000001101011000001101011101011000001101011000001000010000101111010000101110110011001", + "10010010100101111010101100000111001010100011001011001110111101110100001010101110000011010110000011010011010110000011010110000110011100101001111100101000010100001", + "00010000111000011110100111100001100011101000100011010111111110111101000011000100100100100100100100110000110101100000110101100101111111001010011111001011011100101", + "01110111111111011001000000000101101010111100110000000111101010100111110011010100111110010100111110001000001101011000001101011101001111010000101111010001100111010", + "00100101101111010010001100100001011011001101010100100001111010101001111101111010110000011010110000010110000011010110000011010011001111100101001111100101101001110", + "00101111110011001100011111110001111100010101111111111000001011000010111101111111010011111001010011111111100000110101100000110111111100000110101100000110111110011", + "01001000110101110011011000101100001110000101001010001010010011010000101111100010001101011000001101011000111000001101011000001110001100111110010100111111100010100", + "10101010100100000010011010111110110001100111101110101100110001111100101001101010000011010110000011011010110110000011010110000010101010010010010010010011101010001", + "10111000111001100100111000111111101111110010100010001111001100011111001011100011100000110101100000111000110101100000110101100110001101000010111101000011100010100", + "01101111111110100001101111111101010111101000010011111101100110101111010001111111011000001101011000011111101101011000001101011011111111110010100111110011111110010", + "10010000101110101000011100011111010101010111110001001001001000001011110101001110010010010010010010001011000011010110000011010000011001111100101001111101110100011", + "00010010110010110100100111101000000101001001011001010110001111001010011111000101010011111001010011100000100000110101100000110101111010111101000010111101111101111", + "11010101110100001001000000000011100010001110001000000000110001110010100110010101101011000001101011000000011000001101011000001111001100111110010100111111100110101", + "10110111100101111010111100111110001110110011101110100000111101110100001010111011100101001111100101010110010110000011010110000101001010110000011010110001001000101", + "00010100011000011110110010100001000001110001000101111111101110111101000011111001100000110101100000100101110101100000110101100000101001010011111001010011000011001", + "01111111011111011001001010001101001010100100110010111001110010100111110010101001011000001101011000000101001101011000001101011010010001001001001001001000110001010", + "00001100101111010010001011001001011001000100010011011011110010101001111101001111010110000011010110000011000011010110000011010010010011110100001011110100011100010", + "00000011010011001100001010010000111010000101111110010100010011000010111100001100110101100000110101111000100000110101100000110101111010011111001010011110011111111", + "01111001110101110011000111000100001110001100101100010110000011010000101110010101001001001001001001010000011000001101011000001011000010100111110010100111001111000", + "10100110000100000010010001011110110011111111101101100100101001111100101001110011100101001111100101010110010110000011010110000011001100001011110100001010001011001", + "10111000011001100100100101101110001111100011100001101001001100011111001011111000000110101100000110101101110101100000110101100010100001010011111001010010001011000", + "01101110110110000011100111100101010101101000110101111011100110101111010001100000111110010100111110001101001101011000001101011110010001101011000001101010010011110", + "10100000100111101010000100010111110111000111110011001001011000001011110100001110010010010010010010010011000011010110000011010110011111100101001111100101110101111", + "00010010110010010010100111100000100111001001011111010100011111001010011110100101010011111001010011101000100000110101100000110111111100100100100100100101011100111", + "11010101110100101111010000010010000010011111001000000000101001110010100111110101101011000001101011011000011000001101011000001001001000101111010010100111000111001", + "10110111100100111110111100100110001100110011001000100010100101110100001010011011100101001111100101001110001111100101001111100011001100101001111010100000101001001", + "00010100000000011000101010101001100011100001000001111011101110111101000011011000100100100100100100110101101100000110101100000110101111001010011001001010100010101", + "01111111010110111011001010000101101000100100110110111111110010100111110010101000111110010100111110000101010100111110010100111000010111010000101001010001010000010", + "00001100101110010010010011011000111111000101110111011111111010101001111101001110110000011010110000000011010010010010010010010100010111100101001111100100111100010", + "00000011001010001000001010001001011010000100011000010110001011000010111100001101010011111001010011111000100000110101100000110011111100000110101100000111111111111", + "01111001100101010111011111010101001010011101001000010010000011010000101111010101001001001001001001011000011000001101011000001101000100111110010100111110101111000", + "10101111101101000110011111111110010001100111101011111010101001111100101000111111100101001111100101011111110110000011010110000111111010010010010010010011111111001", + "10111000111000100110101000101111101001101011000010001101000100011111001010100010000110101100000110111000110101100000110101100110001001010011111001010011100010100", + "01101010111111100101111010101101010011101000010010101001111110101111010000101010111110010100111110011010110100111110010100111010101001101011000001101011101010010", + "10101000110110101110001000101110010111000110010110001101011000001011110100100010010010010010010010011000111010110000011010110010001111100101001111100100100010011", + "00011111111011010110101111110001100101010001111011111000010110101100000110111111010011111001010011111111111001010011111001010111111100100100100100100100111111111", + "11011101010101001001011010000010000100000110101110111000110000010100111110001001101011000001101011010101001001001001001001001100010100111110010100111110010001001", + "10111110111100111110110011010110001000110011001001011110110100010010010011101111100101001111100101010011010110000011010110000010010010110000011010110000011101001", + "00010001001000111010111010011000100001110000100010010001110111111001010010001100100100100100100100111000110101100000110101100001111001010011111001010010011110101", + "01111011110110011101000111011100001000111100010010010101111011000111110010110100111110010100111110000000001101011000001101011111000001001001001001001000001110010", + "00000100001110010000000001011001011111011101110011100011101011001001111100010010110000011010110000001110000011010110000011010001001111100101001111100100001010010", + "00001010010010001000000101100000111110000101111111101000000010100010111100111001010011111001010011100101111001010011111001010010100100000110101100000110001011111", + "01111100101101110101010111110101001100011101001001111100011010010000101110000001001001001001001001010101000001101011000001101000010100111110010100111110010011000", + "10100010101101100000011100000111010011100111001001001110100000011010110000001111100101001111100101011011001111100101001111100100011010010010010010010010010101001", + "10110000111000100100110111101111101001101011000101010101011101111001010011100100000110101100000110111000100100100100100100100111111001010011111001010011111100100", + "01100111111111000011101000001101010011101000010010000101101111001001001000110100111110010100111110001000001101011000001101011111001001101011000001101011000110010", + "10100101111111001100001100101110010111000110010010100111000001001111100100111010010010010010010010001110000011010110000011010011001111100101001111100101001000011", + "00010110000011010000101010110001100101010001111111111000010110101010011111011001010011111001010011101101100000110101100000110010101100100100100100100100100011111", + "11011101011100101101011010000010000100000110101000111000110000010010100111001001101011000001101011010101011000001101011000001010010100111110010100111110010001001", + "10111110100100011000110011010110001000110011001001011110110100010100001010001111100101001111100101010011001111100101001111100100010010110000011010110000011101001", + "00010001001001111010111010011000100001110000100100010001110111111101000011101100100100100100100100111000101100000110101100000101111001010011111001010011111110101", + "01111011101110111101000111011100001000111100010010010101111011000001101011010100111110010100111110000000010100111110010100111111000001001001001001001001001110010", + "00000100000111110110000001011001011111011101110011100011101011001111100101010010110000011010110000001110010010010010010010010001001111100101001111100101001010010", + "00001010010010101110000101100000111110000101111111101000000010100100100100111001010011111001010011100101111001010011111001010010100100000110101100000110101011111", + "01111100100100010111010111110101001100011101001001111100011010010100111110000001001001001001001001010101000001101011000001101000010100111110010100111110010011000", + "10100010110101100110011100000111010011100111001001001110100000011100101000001111100101001111100101011011001111100101001111100100011010010010010010010010010101001", + "10110000110001000000110111101111101001101011000101010101011101111111001011100100000110101100000110111000100100100100100100100111111001010011111001010011100100100", + "01101111111111000011101111101101010011101000010011111101101111001111010001111110111110010100111110001111110100111110010100111111111001101011000001101011111110010", + "10101000111111001100011000101110010111000110010110001111000001001011110100100010010010010010010010011000111010110000011010110110001111100101001111100100100010011", + "00011010100011010000111010110001100101010001111110101000010110101100000110101011010011111001010011111010111001010011111001010110101100100100100100100101101011111", + "11011000111100101101011000100010000100000110101010001000110000010100111110100011101011000001101011011000101001001001001001001010001100111110010100111111100011001", + "10111111100100011000101111110110001000110011001011111110110100010010010010111111100101001111100101011111101111100101001111100111111010110000011010110000111111001", + "00011000001001111010100101111000100001110000100001101001110111111001010010111000100100100100100100111101101100000110101100000010100001010011111001010010011010101", + "01111110101110111101000111111100001000111100010001111101111011000001101011100000111110010100111110011101010100111110010100111100010001001001001001001001011010010", + "00000000100111110110000100011001011111011101110110101011101011001111100100001110110000011010110000011010010010010010010010010000011111100101001111100100111100010", + "00000011010010101110011111100000111110000101111101110000000010100100100100000101010011111001010011110001011001010011111001010001111100000110101100000110111101111", + "01110100100100010111001000010101001100011101001101100100011010010100111111010101001001001001001001010001100001101011000001101111001100111110010100111111100111000", + "10100111010101100110011100100111010011100111001010100110100000011010110000111011100101001111100101000111101111100101001111100111001010010010010010010010001001001", + "10110101110001000000110010101111101001101011000000111101011101111001010010111000000110101100000110101101100100100100100100100110101001010011111001010010000010100", + "01101111111111000011110010001101010011101000010000111101101111011000001101101000111110010100111110011101010100111110010100111100010001101011000001101011001000010", + "10101100011111001100010011001110010111000110010110111111000001010110000010001110010010010010010010001011011010110000011010110100010111100101001111100100100100011", + "00010011000011010000101010010001100101010001111100110000010110110101100000001101010011111001010011110000111001010011111001010001111100100100100100100100100111111", + "11011000111100101101011111000010000100000110101100010000110000001101011001010101101011000001101011000001001001001001001001001011000100111110010100111111111111001", + "10110111100100011000101001010110001000110011001011000110110100010010010010110011100101001111100101000111101111100101001111100111001010110000011010110000001011001", + "00011001001001111010100101111000100001110000100001101001110111111001010010111000100100100100100100111100001100000110101100000010100001010011111001010010001010101", + "01111110001110111101000111111100001000111100010001011101111011000001101011100000111110010100111110011100110100111110010100111100010001001001001001001001010010010", + "00000001000111110110000100011001011111011101110110001011101011001111100100001110110000011010110000011011010010010010010010010000011111100101001111100100110100010", + "00000010010010101110011111100000111110000101111101010000000010110101100000000101010011111001010011110000111001010011111001010001111100000110101100000110100101111", + "01110101000100010111001000010101001100011101001101101100011010001101011001010101001001001001001001010110000001101011000001101111001100111110010100111111111111000", + "10100111110101100110011100100111010011100111001010010110100000000011010110111011100101001111100101000000001011110100001011110111001010010010010010010010010001001", + "10110101010001000000110010101111101001101011000001111101011101100000110100111000000110101100000110101010100010111101000010111110101001010011111001010010010010100", + "01101110111111000011110010001101010011101000010000001101101111001001001001101000111110010100111110011000110010100111110010100100010001101011000001101011010000010", + "10101101111111001100010011001110010111000110010111011111000001001111100100001110010010010010010010001010111100101001111100101100010111100101001111100100111100011", + "00011111100101010000111111110001100101010001111111111000010110101100000111111111010011111001010011111111111001010011111001010111111100100100100100100100111111111", + "11011000111100110100101000100010000100000110101010001000110000010100111111100011101011000001101011001000101001001001001001001110001100111110010100111111100011001", + "10111010100110011000011010110110001000110011001110101110110100000011010110101011100101001111100101011010101111100101001111100110101010110000011010110000101011001", + "00011000101011100011111000111000100001110000100110001001110111100000110100100010100100100100100100111000101100000110101100000110001001010011111001010011100010101", + "01111111101010101100111111111100001000111100010011111101111011011000001100111110111110010100111110011111110000101111010000101011111001001001001001001001111110010", + "00000101000101100111111100111001011111011101110000001011101011010110000010011010110000011010110000011111110100001011110100001101001111100101001111100100001000010", + "00000111110010100111010010100000111110000101111100100000000010100100100101111001010011111001010011111101111111001010011111001110101100000110101100000111100011111", + "01110000100110011110001010010101001100011101001010100100011010010100111111001001001001001001001001001101000111110010100111110110010100111110010100111111001001000", + "10101110010011100110001011000111010011100111001010110110100000011010110001001111100101001111100101001101001111100101001111100010010010010010010010010011000101001", + "10110001110001011001001010001111101001101011000110100101011101111001010010101100000110101100000110101110100100100100100100100011111001010011111001010010100110100", + "01100111111101000011011111001101010011101000010001010100001101011000001100010100111110010100111110010111010100111110010100111011000001101011000001101010011110010", + "10100101011101010101010001001110010111000110010000110111100011010110000010010010010010010010010010010011111010110000011010110101001111100101001111100100010110011", + "00010110100111000001011101110001100101010001111100101001010100110101100001111001010011111001010011111100011101000010111101000100100100100100100100100101110101111", + "11011001111110111100100111100100001101000000101011110000110110001101011001000001101011000001101011000100101111010000101111010110010100111110010100111111001101001", + "10110011000100010001100100010110010001110101010010010110010110000011010111001111100101001111100101001010001001111100101001111000011010110000011010110001000011001", + "00011101101011110011100111111000111001110100100110001000110111100000110100100100100100100100100100100001001010011111001010011011111001010011111001010010100100101", + "01110011001000111101010000011100001001011110001001001101111011011000001100010100111110010100111110010111110100111110010100111001001001001001001001001000011110010", + "00001100100111101111111100111001000111011011101000110011001001010110000010011010110000011010110000011001110010010010010010010101001110000011010111100010010000010", + "00001111110000101110110010100010101110100101101100111001100000110101100001111001010011111001010011111010111001010011111001010110101101100000110100000001110011111", + "01111100000110001110001010010101000101011011010011101100111000001101011001001001001001001001001001001000100001101011000001101110010101011000001100011101001101000", + "10100010010111110111001011000111010011100101001010000111100010000011010111001111100101001111100101001010101011110100001011110010010011010110010010110001000011001", + "10110100010011001000101010001101110000101001000110001101011011100000110100101100000110101100000110101001000010111101000010111011111001010011111001010010100000100", + "01101010011001010011111111001011000011001110011001000101001101011000001100010100111110010100111110010001010010100111110010100011000001101011000001101010011000010", + "10101001011101010101010001001000010110000110001000100110000001010110000010010010010010010010010010010111111100101001111100101101001111100101001111100100010010011", + "00011110100011010001011101110101111100010001111100110000010110110101100001111001010011111001010011111010011101000010111101000100100100100100100100100101110011111", + "11010101111110111101000111100010011100000000110011111000010010001101011001000001101011000001101011000010101111010000101111010110010101011000001101011001001011001", + "10111111100110001001011111110100011000010011011011111111010110000011010110111111100101001111100101001111101001111100101001111111111011010110000011010111111111001", + "00011000101101101010011000111000101000110110111110001001010101100000110101100010111101000010111101011000101010011111001010011110001000110101100000110100100010101", + "01111010101110111100101010111100001000111110010010101100111001011000001101101010100111110010100111101010110000101111010000101110101000001101011000001101101010010", + "00001000100101100110011000111011000110011111110110001011101101010110000010100010101001111100101001111000110100001011110100001110001111100101001111100100100010010", + "00001111110000111111111111100110101110100011110111111001000110110101100000111111000010111101000010111111111111001010011111001111111100000110101100000111111111111", + "01110000000000000111110111010011001101011101010001001101111100001101011001110101001001001001001001011111000111110010100111110101000100111110010100111111011111000", + "10100111010101100111110001000011001010100111001110100111100110000011010110000011100101001111100101001011101011110100001011110101001010010010010010010010110111001", + "10110100110011010000101101101111110001101101011100110101111101100000110100000000000110101100000110110010000010111101000010111000100000110101100000110100110100100", + "01101011111101010010011111101111000011001000000101111100001101011000001101011000111110010100111110000010110010100111110010100010010000001101011000001101101100010", + "10100001011011011100101100001110011110000000001010010110000011010110000010110110001011110100001011100100011100101001111100101110011110000011010110000010000010011", + "00011011100011010001000111110001100101010011111000010001010000110101100000100101001010011111001010011101011101000010111101000011111101100000110101100000000011111", + "11010001011110111101000000000100011101000100111001011000010000001101011001110101110010100111110010111111101111010000101111010101001100111110010100111111011101011", + "10110110100110001001000100110100010001010111010110100111010110000011010110011011110100001011110100011001101001111100101001111001001010110000011010110000110101010", + "00011001101101101010011010111100100000010100110100100000110101100000110100011000100100100100100100110010101010011111001010011000101001010011111001010010110000110", + "01110110001110111100101010011010011000011010010101111100111101011000001101011000111110010100111110010000110000101111010000101110010001001001001001001001101100001", + "00001000000101100110011011011111000110011111100010000011001011010110000010110110110000011010110000000100110100001011110100001110010110000011010110000010000010010", + "00000010010000111111110011000010100111100001100000010001100000110101100000110101010011111001010011101111011111001010011111001110111101100000110101100000000001111", + "01110100000000000111110110110001001101111001011001001101011000001101011001101101010000101111010000111111000111110010100111110100100101011000001101011001011001000", + "10101111010101100111110001000001000011000001001110100111100110000011010110010011111100101001111100101011101011110100001011110100101011010110000011010110110111001", + "10111100110011010000101100001001110000101001010100110101111101100000110100011000011111001010011111010010000010111101000010111001000000110101100000110100110100110", + "01101111111101010010011110101111001010001100001101111100001101011000001101000000101111010000101111000010110010100111110010100010001000001101011000001101101100001", + "10101101011011011100101100001010010110100010000010010110000011010110000010101110010010010010010010000100011100101001111100101110000110000011010110000010000010000", + "00011011100011010001000101010111110101110111111000010001010000110101100000110101010011111001010011111101011101000010111101000011100101100000110101100000000001100", + "11010001011110111101000110100100011101000100111001011000010000001101011001101101101011000001101011011111101111010000101111010101011101011000001101011001011001001", + "11010010100110001001000100010100010001010111010110100111010110000011010110000011100101001111100101011001101001111100101001111000001011010110000011010110110111001", + "10000001101101101010011001111100100000010100110100100000110101100000110100000000111101000010111101010010101010011111001010011001001000110101100000110100110100101", + "00111110001110111100101111111010011000011010010111111100111101011000001101111110100111110010100111111111110000101111010000101111111000001101011000001101111110010", + "00000000100101100110011000111111000110011111100010001011001011010110000010100010101001111100101001101000110100001011110100001110001110000011010110000011100010000", + "11111110110000111111111010100010100111100001100110101001100000110101100001101011000010111101000010111010111111001010011111001110101101100000110101100000101011100", + "10000010100000000111101000110001001101111001011010001101011000001101011001100011010000101111010000101000100111110010100111110110001101011000001101011001100011011", + "10111010010101100111111111100001000011000001001111111111100110000011010110111111111100101001111100111111101011110100001011110111111011010110000011010110111111010", + "10111010110011010000111001101001110000101001010100010101111101100000110101100100011111001010011111011101000010111101000010111100011000110101100000110101100000100", + "10111010111101010010000000101111001010001100001011011100001101011000001101010100101111010000101111000111110010100111110010100110101000001101011000001101011000001", + "10000010011011011100100101101010010110100010000010100110000011010110000011011010001011110100001011101001111100101001111100101001010110000011010110000011010110010", + "11111110100011010001000010110111110101110111111110100001010000110101100000111001001010011111001010000010111101000010111101000010110101100000110101100000110101110" + ], + "1": [ + "11111110111010001110011100101101001111100101001110001110000011010110000010000100101001111100101001111001100011010110000011010011001011110100001011110011001111111", + "10000010000110100001010000100101001100000110101101001101100000110101100001100101000010111101000010111011100000110101100000110000101010011111001010011110001000001", + "10111010100001001110011101001111010100111110010101110101011000001101011001011111010000101111010000101001011000001101011000001000010010100111110010100100101011101", + "10111010110001110011001001111111110010010010010011110011010110000011010111010001111100101001111100101011010110000011010110000110010100001011110100001110101011101", + "10111010101100111000111111111011111101000010111111111000110101100000110100111110011111001010011111001111110101100000110101100111111101000010111101000000101011101", + "10000010001011001100101000101000100111110010100010001001001001001001001001100010101111010000101111011000101101011000001101011010001111110010100111110000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000001100100011101000100010111111001010011010001001010011111001010010100010111101000010111101011000110101100000110101100110001111001010011111001011000000000", + "11110010101010101000011111100100101111010000101111111001101011000001101010111110100111110010100111111111101101011000001101011111111111010000101111010001110011101", + "00110000111010001110000100101101001111100101001000001111100101001111100100000100101001111100101001110110000011010110000011010011001011110100001011110101110110000", + "11110010100110100001011000100101001100000110101010101101100000110101100001100101000010111101000010111100100000110101100000110000101010011111001010011110110101100", + "01110100100001001110000101001111010100111110010100010101011000001101011001011110010100111110010100100100111000001101011000001000010010100111110010100110101001011", + "01101011010001110011000001111111110010010010010010010011010110000011010111010000011010110000011010101100110110000011010110000110010100001011110100001010100101010", + "11010001101100111000110010011011111101000010111001111000110101100000110100110011111001010011111001010111010101100000110101100101111101000010111101000011000110110", + "11001010101011001100110101001000100111110010100000100001001001001001001000001001001001001001001001001111001101011000001101011101000111110010100111110011011110001", + "00101101111010010101011110010100001001111100101010101111100101001111100100000100001011110100001011100011100011010110000011010011001001111100101001111101110110000", + "10001011100111000101110111001001000010111101000011000100000110101100000111100111001010011111001010000100000100100100100100100000100010111101000010111100010101100", + "01101000000001010101011111110110010100111110010011010100111110010100111111011111110010100111110010101100111110010100111110010000010000101111010000101110101100011", + "00001111110000010111101110010011111010110000011100011011010110000011010111010011110100001011110100001010010000011010110000011110011100101001111100101000000011110", + "10011001001100100011101000100010111001010011111001111000110101100000110100110011111001010011111001001001010011111001010011111101111111001010011111001011000101110", + "11110010001010110001111010100100101001001001001001001000001101011000001100001011000001101011000001110111101101011000001101011101001111010000101111010001111110101", + "10100101011010001110000100101101001011110100001111001110000011010110000010000101001111100101001111100001100011010110000011010011001111100101001111100101110000000", + "10101111100000101001111111100101001010011111001111111100100100100100100100111110100100100100100100101111100000110101100000110111111100000110101100000110111111100", + "11111000100101001111011000101111010010100111110010001100111110010100111110100011010000101111010000101000111000001101011000001110001100111110010100111111100011011", + "00111010110011101010011010111111110100001011110010101010110000011010110000101011111100101001111100101010110010010010010010010010101010010010010010010011101011010", + "00011000101000110001101000101010011001010011111110001001010011111001010010100010011111001010011111001000110011111001010011111110001101000010111101000011100011010", + "11111111101111000100101111101001000001101011000111111000001101011000001101111110101111010000101111001111101011000001101011000011111111110010100111110011111111101", + "00010001111000010101110110011101101111100101001111111110000011010110000010110011001111100101001111110100000101001111100101001000011001111100101001111101100101100", + "10111011000111011100011000101000100100100100100010011101100000110101100000110010101100000110101100001101000000110101100000110101111010111101000010111101100000100", + "01100100000001010101000010100110110100111110010110101101011000001101011001101010010100111110010100111001111000001101011000001111001100111110010100111111111001011", + "00100011010110011111000100100010011010110000011010001010010010010010010010000100010010010010010010001111110110000011010110000101001010110000011010110001010111010", + "10011001001000100010110000111011111001010011111110101001010011111001010010000100111101000010111101011100110101100000110101100000101001010011111001010011010100110", + "11010110101000110001000101010101001001001001001000010001101011000001101011001110100111110010100111101100101001001001001001001010010001001001001001001000101000001", + "10111001011110000111010001111100101111100101001000010111100101001111100100101000101001111100101001111010100101001111100101001010010011110100001011110100000101100", + "10010011100010101001011010000000101100000110101101111100100100100100100100101011000010111101000010100001000110101100000110101101111010011111001010011110000110000", + "11111000100011001110110101000100110100111110010010100100111110010100111111110000010100111110010100101001011110010100111110010011000010100111110010100111011110111", + "00001011110001101010111110011110010010010010010010101010110000011010110000000100011010110000011010111111110110000011010110000011001100001011110100001010010000010", + "00000001101100111000101111001001011001010011111111000001010011111001010010000111111001010011111001010100010101100000110101100010100000110101100000110100010000110", + "11110110000100100010011111111001000001101011000001010001001001001001001001011111001001001001001001010100101101011000001101011110010000001101011000001100001100001", + "00100101101110010100000110001001001111100101001000011111100101001111100101110011001111100101001111101010000011010110000011010110011110000011010110000011100010000", + "10111111011101101000101000111110100100100100100101111100000110101100000111000010101100000110101100000001000100100100100100100111111101100000110101100101000101100", + "01101100010101010010001010100101110100111110010011001100111110010100111110010010010100111110010100100001111110010100111110010001001000101111010000101111011110111", + "00101111000110001011001101010110011010110000011011001010010010010010010010111100010010010010010010010111101001111100101001111010001100101001111100101000110000110", + "10010001001001111011111001001011011001010011111110101001010011111001010010111101111001010011111001001100101010011111001010011111001111001010011111001010110011010", + "11010010111110110111100101000011001001001001001000010001101011000001101011011111000001101011000001101100110000101111010000101001110111010000101111010001001001001", + "10110101001010111111011001010110001111100101001000010111100101001111100100110001001111100101001111111010110100001011110100001101110110000011010110000010100101100", + "10011011100010101100110110101101101100000110101101111100100100100100100100110010100100100100100100100001000110101100000110101011100101100000110101100001100110000", + "11111100100011111011011101111011110100111110010011000100111110010100111110101000001101011000001101000001011110010100111110010101011101011000001101011000111110111", + "00001111101101001100101111101001110010010010010011111010110000011010110001111110000011010110000011011111110010010010010010010111111011010110000011010111111110010", + "00001000111101101011101000101000011001010011111110001001010011111001010011100011100000110101100000101000110011111001010011111110001001010011111001010011100011010", + "11111010111111000001001010111101100001101011000010101001001001001001001001101011011000001101011000001010110010100111110010100010101001101011000001101011101011101", + "00101000111001000100011000100101101111100101001110001111100101001111100101100011001111100101001111101000111100101001111100101010001111100101001111100100100011100", + "10111111110011011010001111111110100100100100100111111010011111001010011111111110101100000110101100001111111101000010111101000111111100100100100100100100111110100", + "01100000110001100100000101100101110100111110010000010010100111110010100111001110010100111110010100101100101111010000101111010100001101011000001101011000001000111", + "00100111010100011010010000000010111010110000011110010100001011110100001010001000010010010010010010000010110000011010110000011010000011010110000011010110000100110", + "10011001101110010110100000110111011001010011111101111101000010111101000011101011100000110101100000100001010011111001010011111000111000110101100000110100000111010", + "11011110110110010111101110010011001001001001001101000001101011000001101011010001011000001101011000011001001001001001001001001110100000001101011000001101011111001", + "10111001101011011101011110011000110110000011010011001111100101001111100101000101010110000011010110010111100101001111100101001000101111100101001111100101010011110", + "10010011110010101100100111110100010101100000110000100100100100100100100101000110110101100000110101110100011111001010011111001011000100000110101100000110110010011", + "11110100000010011111001011011010101101011000001000010100111110010100111111111110010100111110010100101100100111110010100111110000001100111110010100111110001010100", + "00000111100101101100110110101100000011010110000110011100101001111100101001110010011010110000011010100010001011110100001011110100000010010010010010010010000100001", + "00001101011100001001101000001110000001010011111101111111001010011111001010100101111001010011111001000001000010111101000010111111100000110101100000110101100101010", + "11111110000110100101001011011001111001101011000101001111010000101111010001010101001001001001001001011001101011000001101011000111011000001101011000001101011111101", + "00101101001000000000010110000001110111100101001011001011110100001011110101011011010110000011010110010111100101001111100101001010001110000011010110000011010001100", + "10110011001011111010000011111010110100100100100000101100000110101100000110111000110101100000110101110100100100100100100100100011001101100000110101100000110010100", + "01100000100000000000000101000011101101011000001000010100111110010100111110001110001101011000001101001100111110010100111110010011110101011000001101011000001000101", + "00100111011101111110010001000010100011010110000110000010010010010010010011101000000011010110000011000010101001111100101001111101110011010110000011010110000100101", + "10011001111110110110100110110111000000110101100101100001010011111001010010001011111001010011111001000001001010011111001010011101100000110101100000110101100111001", + "11011110100110010111101101110111011000001101011101011111110010100111110010110001000001101011000001111001010000101111010000101111011000001101011000001101011111010", + "10111001111011011011011110111000110111100101001011010001111100101001111100010011001111100101001111110111110100001011110100001001010110000011010110000011010011100", + "01010011101011001000100110110100010100000110101000100010111101000010111101011000100100100100100100110100011111001010011111001010110101100000110101100000110010000", + "01110100010011011011001101011010101100111110010000010000101111010000101111100000001101011000001101001100100111110010100111110001010101011000001101011000001010111", + "00000111111101001100110000001100000010010010010110011010110000011010110001101110000011010110000011000010001011110100001011110101111011010110000011010110000100010", + "01001101001101101101101111101110000000110101100101111001010011111001010010100011100000110101100000100001000010111101000010111110011000110101100000110101111101000", + "00111111100110100101001111111001111000001101011111111001001001001001001000111111011000001101011000011111110010100111110010100111111000001101011000001101111111110", + "00101000101000000000011000100001110110000011010010001111100101001111100101100011010110000011010110011000111100101001111100101110001110000011010110000010100011111", + "01111010101011111010001010111010110101100000110110101010011111001010011111101010110101100000110101101010111101000010111101000110101101100000110101100001101010111", + "11101000100000000000001000100011101100111110010010001010100111110010100111100010001101011000001101001000101111010000101111010010001101011000001101011001100010101", + "00101111111101111110011111100010100010110000011111111100001011110100001011111110000011010110000011001111101001111100101001111111111011010110000011010110111110110", + "01010001111110110110110100010111000001010011111100110101000010111101000010011111100000110101100000100100001010011111001010011011000000110101100000110100001011000", + "00010110000110010111101011010111011001001001001010001111110010100111110010000111011000001101011000000100110000101111010000101101001000001101011000001101011011001", + "01110101111011011011010010011000110010010010010010000001111100101001111101101011010110000011010110010011010100001011110100001001100110000011010110000010111101110", + "01011111101011001000100001110100010011111001010111100010111101000010111101100100110101100000110101101000111111001010011111001000000101100000110101100000100100011", + "11111100110011011011011001111010101011000001101001001000101111010000101111110100001101011000001101001000000111110010100111110110111101011000001101011001111110100", + "11101111111101001100110000001100000101001111100001001100101001111100101001011010000011010110000011011110001011110100001011110110010011010110000011010110010000001", + "10110000101101101101100100101110000000110101100100101111001010011111001011011001100000110101100000100100100010111101000010111111010000110101100000110100010011000", + "11010011100110100101001100011001111000001101011010010110010100111110010100001111011000001101011000000100110010100111110010100101101000001101011000001101010001110", + "11110101001000000000000010100001110110000011010010000010010010010010010010101001010110000011010110010010111100101001111100101101100110000011010110000010111101111", + "01011010001011111010000110111010110101100000110111100011111001010011111001101010110101100000110101101001011101000010111101000000100101100000110101100000111110111", + "10101101100000000000001001000011101001001001001001011011000001101011000000110000001101011000001101001000001111010000101111010010111101011000001101011001101110101", + "11001011011101111110010111000010100101001111100011010100001011110100001011010010000011010110000011011110001001111100101001111110110011010110000011010110010010101", + "10010001011110110110110100010111000110101100000110100101000010111101000010011000100100100100100100100101101010011111001010011011010000110101100000110100010011001", + "00110110100110010111101011010111011110010100111100010111110010100111110010000000111110010100111110000101010000101111010000101101001000001101011000001101001011010", + "00000100011011011011010010011000110110000011010100011001111100101001111101101110110000011010110000010010010100001011110100001001100110000011010110000010100101110", + "00111110001011001000100001110100010101100000110011111011111001010011111001100101010011111001010011101001011111001010011111001000000101100000110101100000111100011", + "10101100010011011011011001111010101101011000001001011001001001001001001001110100001101011000001101001111100111110010100111110110111101011000001101011001100110100", + "11101110111101001100110000001100000011010110000001010101001111100101001111011010000011010110000011011001101111100101001111100110010011010110000011010110001000001", + "10000000001101101101100100101110000100100100100100110110101100000110101101011001100000110101100000100011100100100100100100100111010000110101100000110100000010100", + "01010010000110100101001100011001111110010100111000001111010000101111010000001001011000001101011000000001010100111110010100111101101000001101011000001101001000110", + "01100101101000000000000010100001110000011010110000000011110100001011110100101110010010010010010010010011011010110000011010110101100110000011010110000010100101011", + "01011111101011100010101111111010110011111001010011111010011111001010011110111111010011111001010011101111111101000010111101000111111101100000110101100000111110011", + "11011000100010001000001000100011101101011000001010001010100111110010100110100011101011000001101011001000101111010000101111010110001001001001001001001001100010101", + "10001010111101101111011010100010100011010110000110101101001111100101001111101011100101001111100101011010101001111100101001111110101101001111100101001110101010101", + "11001000111110100111101000110111000000110101100010001100100100100100100101100011100000110101100000111000101010011111001010011110001110101100000110101101100011001", + "00011111100000001110101111110111011000001101011111111110010100111110010101111111011000001101011000011111110100111110010100111011111110010100111110010101111111010", + "00111101111011001010110000001000110010010010010111010000011010110000011011111011010110000011010110011110010010010010010010010100010110000011010110000010010000010", + "00110010101111010001001100101101110011111001010100110010111101000010111100111000110101100000110101111100111001010011111001010111010101100000110101100001110011111", + "10110101110001001010001100011010101011000001101100001000101111010000101110101001001001001001001001011100100001101011000001101111101101011000001101011001010001000", + "11000011111101010100010010100100000101001111100010000100101001111100101000101111100101001111100101010100101011110100001011110011100011010110000011010111011101001", + "10011001101111100101100110110110100100100100100101100111001010011111001011001100000110101100000110110111000010111101000010111010100100100100100100100100111111000", + "01100011000110110100000001001001111110010100111110111110010100111110010101010100111110010100111110001110010010100111110010100010111110010100111110010100001111110", + "01001000101000010001010111001000110000011010110000110010010010010010010011110011010110000011010110010010011100101001111100101100110000011010110000011010001111111", + "01111111001101100011000100001010110011111001010011010011111001010011111000011000110101100000110101111101111001010011111001010101010011111001010011111001101100111", + "11111101000000010001111011010011101001001001001101001011000001101011000000100000001101011000001101000101001001001001001001001111001101011000001101011001010101001", + "10111111011001100111101010011001010101001111100010000101001111100101001110001110000011010110000011001011001111100101001111100001100011010110000011010111010011001", + "11111000011100100111100001110001011110101100000001100100100100100100100101000100100100100100100100110000101100000110101100000010000000110101100000110100111100101", + "00011010100110001111010001111011010110010100111001011110010100111110010101110100111110010100111110001110010000101111010000101000111000001101011000001100000110010", + "00100000011001010011000000000100000010010010010011010000011010110000011011111010110000011010110000000000010100001011110100001010010011110100001011110100001001110", + "00000111111011111101101100100110000011111001010011010011111001010011111000111001010011111001010011100011111111001010011111001001010010011111001010011111100010011", + "10010001110011101110011100010011110011000001101011101001001001001001001000101001001001001001001001001001000111110010100111110001101010100111110010100111010100100", + "11001011110110010101000010111000001101001111100101100101001111100101001110101111100101001111100101001011001111100101001111100111100100001011110100001010011010001", + "10010000110000110010010110111010010100100100100100100110101100000110101101001100000110101100000110101000100100100100100100100010100000110101100000110101011000100", + "01100110010101101001101001000010000110010100111111011110010100111110010101010100111110010100111110010000001101011000001101011010111000001101011000001101101000010", + "01001100110100000000011111000101111000011010110001010010010010010010010011110010010010010010010010000110000011010110000011010100110110000011010110000011101010011", + "01110111011110001110011100010000111011111001010010110011111001010011111000011001010011111001010011100011100000110101100000110101010101100000110101100001101011111", + "11111001000110000001011011000110111001001001001000001011000001101011000000100001101011000001101011011011011000001101011000001001001000101111010000101111010011001", + "10111111111111100000001111110000110101001111100111111101001111100101001110111111100101001111100101011111101111100101001111100011111100101001111100101001111111001", + "11111000110001101111001000100111011110101100000010001100100100100100100100100010111101000010111101001000101100000110101100000010001111001010011111001010100010101", + "00011010111011100101101010110011110110010100111010101110010100111110010101101010100111110010100111101010110100111110010100111010101111010000101111010001101010010", + "00101000110101011010001000101100100010010010010110001000011010110000011010100010101001111100101001111000110010010010010010010010001010010010010010010010100010010", + "00001111111000010100101111111111001011111001010011111011111001010011111000111111000010111101000010111111100000110101100000110111111011111001010011111000111111111", + "10011000001101000010100001011111000011000001101100111001001001001001001001110101001001001001001001011110011000001101011000001110111011000001101011000001101111000", + "11001010101000111000111111010110001101001111100000110011010110000011010110000011100101001111100101001010010110000011010110000100110101001111100101001111001111001", + "10011101001011101100110100011010010100100100100001010000110101100000110101000000000110101100000110110011110101100000110101100001010101000010111101000011001100100", + "01101111000100111011011011010010101110010100111111001000001101011000001100111000111110010100111110000011010100111110010100111011001111110010100111110010110100010", + "01001101000111011001111010000000001000011010110110000110000011010110000011010110001011110100001011100101011010110000011010110011100001111100101001111100010010011", + "01110010010110001000011001100110111011111001010111100011111001010011111000000101001010011111001010011100111001010011111001010100000010111101000010111100011111111", + "11110000101110000001001001110001101000101111010101011011000001101011000001010101110010100111110010111110001001001001001001001010111001001001001001001001000101011", + "10111110001110100010011000001111110100101001111101010101001111100101001110011011110100001011110100011000010110000011010110000010010101001111100101001110001011010", + "11110001100000101111011100110010111111001010011001010100100100100100100100011000100100100100100100110011110101100000110101100011010110101100000110101100000110110", + "00011111110011100011100100001111000111010000101011101000001101011000001101011000111110010100111110010001001101011000001101011111101110010100111110010100010100001", + "00101001111101011010010010101010110010010010010111100110000011010110000011110110110000011010110000000101000011010110000011010111100011110100001011110101111010010", + "00001010110001110110110110111001000011111001010010100101100000110101100001010101010011111001010011101110111001010011111001010111100010011111001010011111111001111", + "10011100001100000100111000011111010011000001101100111101011000001101011000001101010000101111010000111110000001101011000001101001011010100111110010100110101001000", + "11000110101001111000111111110100011101001111100000110101001111100101001110110011111100101001111100101010001111100101001111100011010100001011110100001010001111001", + "10011101001010001110100100011100000101000010111001010110101100000110101100111000011111001010011111010011100100100100100100100110110101000010111101000011001100110", + "01100111011100011011011000110100101111110010100111001110010100111110010101000000101111010000101111000011001101011000001101011001010111110010100111110010010100001", + "01000101010111011111100100100100001001111100101111100010010010010010010010101110010010010010010010000101000011010110000011010001111001111100101001111100110010000", + "01110010011111001110001111000010101010111101000110000101100000110101100000110101010011111001010011111100100000110101100000110100011010111101000010111101111001100", + "11110000100111100011001111010001101001001001001100111101011000001101011000101101101011000001101011011110011000001101011000001010101000101111010000101110100001001", + "11010010000111000000000001101111110101001111100100010011010110000011010111100011100101001111100101011000010110000011010110000011010100101001111100101001001111001", + "10000001100001101001010100010010111110101100000001010000110101100000110101100000111101000010111101010011110101100000110101100110110111001010011111001010000100101", + "00111111110010100011111111101111000110010100111011111110010100111110010100111110100111110010100111111111101101011000001101011011111111010000101111010000111110010", + "00000000111100111000011000101010110011110100001110001000011010110000011010100010101001111100101001101000100011010110000011010010001011110100001011110100100010000", + "11111110010001110110101010111001000010011111001010101011111001010011111000101011000010111101000010111010100000110101100000110010101010011111001010011111101011100", + "10000010001100000100101000111111010010100111110010001001001001001001001001100011010000101111010000101000111000001101011000001010001010100111110010100110100011011", + "10111010001001111000111111110100011100001011110111111011010110000011010110111111111100101001111100111111110110000011010110000011111100001011110100001011111111010", + "10111010101010001110101110111100000100100100100010000000110101100000110101100100011111001010011111011100110101100000110101100001100101000010111101000010111000100", + "10111010111100011011010111110100101110010100111000111000001101011000001101010100101111010000101111000110001101011000001101011001011111110010100111110010100000001", + "10000010110111011111110011100100001000011010110100010110000011010110000011011010001011110100001011101000000011010110000011010110001001111100101001111100101110010", + "11111110111111001110000010000010101011111001010111010101100000110101100000111001001010011111001010000011100000110101100000110101001010111101000010111101000101110" + ], + "2": [ + "11111110000111010010000011100110111100111001111011101110101111011000000100000110011001010110110000100011100010001110000010001011001010000100001000000011001111111", + "10000010011110000101101001111101011011001000100110001011111101010010010011111001110100110010111001111111000001001101100001001000101011100111001001100110001000001", + "10111010000111000111111010111111010111110000000001100100101110010010110100111100001100001000111110111111111001110101011001110000010011011111110101011100101011101", + "10111010000110000011010111001001001000111100110001101001000100100010101111010011011000000001011011011100010111110011010111110110010101010011110011010110101011101", + "10111010110001100011101111110000001010001111001111111000011001101110110010111110101111100000000110011111110100111000110100111111111100110010100100110000101011101", + "10000010010011101101111000110000110110100101001010001110010000111111111111100010011001011111010100001000101100100000001100100010001110001010111110001000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000101010101110011000110010111010011101101110001001000011111111011000100011100001100101010011011000110100011000110100011110001110110010000110110011000000000", + "00110011111101011110001111110010010011100111101111111010011111111001110100111110000011011010000000011111101100101000001100101111111110001000111110001001111010000", + "01110000000111010001000011100110111100111000011011101110101111011000000101100110011001010110110000100011100010001110000010001011001010000100010010000101110111110", + "01100110111110000000000001111101011011001000000110001011111101010010010011111001110100110010111001101111000001001101111001001000101011100111010011100110110100011", + "01011001000111000011111010111111010111110000000001100100101110010010110101011100001100001000111110111111111001110101000001110000010011011111101011011110101100100", + "00100010000110000101011111001001001000111101010001101001000100100010101111010011011000000001011011001100010111110011001111110110010101010011100101010010100010001", + "11000100110001100111110101010000001010001110001101011000011001101110110011010000101111100000000110010101010100111000100100111101111100110010100100110011000001000", + "00001011010011101101101100010000110110100100001011100110010000111111111110010100011001011111010100000010101100100000001100100101000110001010111110001011011001110", + "10000000011100011000100001100100001100101010011010111111110101001001101110000111010111010011111101100100100010101110000010101011001000000100110000000101110111111", + "10010110110000110011101001111111111110001011000111011111110010010100011001100101101110110111110101111010100001000101100001000000100011100101010011100100010100111", + "10101001011100001010011000111101100111100010100000110101110100000011011110111101000010001101100011111000111001010101011001010000010001011111001001011110101100101", + "11010010001000110110110111001011101101111111110000111101001011100100100101001111000010000100010111011001110111111011001111111110011101010001100101010000000010101", + "00110100101010101110010111010010111010011100001100001001000011111111011000110001100001100101011011010010010100011000101100011101111110110010000110110011000001001", + "11111011011101011110000100010010010011100111001010110010011111111001110100001000000011011010000000010111001100101000010100101101001110001000111110001001111001010", + "01110000000111010001000011100110111100111001111011101110101111011000000101100110011001010110101000100011100010001110010010001011001010000100010010000101110111110", + "01101111111110000000001111111101011011001001000111111011111101010011110010111111110100110010111001101111100001001101111001001111111011100111010011100110111110011", + "01011000100111000011101000111111010111110001100110001100101110010010110100100010001100001000101110111000111001110101000001110110001011011111101011011111100010100", + "00101010100110000101011010101001001000111100010010101001000100100010001110101011011000000001000011001010110111110011001111110010101101010011100101010011101010001", + "11001000110001100111111000110000001010001111001110001000011001101111110010100010101111100000010110001000110100111000100100111110001100110010100100110011100011000", + "00001111110011101101111111110000110110100100101011111110010000111111111111111110011001011111000100011111101100100000010100100011111110001010111110001011111111110", + "10000000011100011000110111000100001100101010111110111111110101001000001111101111010111010011110101101001100010101110011010101000011000000100110000000101100011111", + "10010110110000110011101111011111111110001010100100001111110010010101100000010001101110110111110101100010000001000101111001000101111011100101010011100101100000111", + "10101001011100001010001100011101100111100010100100110101110100000011010111101001000010001101111011110111011001010101001001010011001001011111001001011111111000101", + "11010010001000110110101011101011101101111111110011101101001011100101011100000111000010000100011111011011110111111011001111111011001101010001100101010001010110101", + "00110100101010101110000001110010111010011100001000001001000011111111000001011001100001100101000011011111010100011000101100011110101110110010000110110011010101001", + "11111011011101011110000010110010010011100111001001100010011111111000110101111100000011011010011000001111101100101000010100101000010110001000111110001000001101010", + "01110000000111010001010111000110111100111001111111101110101111011001010100110010011001010110100000101100000010001110010010001000010010000100010010000100100011110", + "01100110111110000000011101011101011011001001000101011011111101010011111010110001110100110010101001101101000001001101111001001101111011100111010011100111100000011", + "01011001000111000011101100111111010111110001100101100100101110010010110100110100001100001000001110110010111001110101000001110011000011011111101011011110111000100", + "00100010000110000101011000101001001000111100010010111001000100100011100110100111011000000000100011010100110111110011001111110011001101010011100101010011010110001", + "11000100110001100111100000110000001010001111001001011000011001101111111010000100101111100000010110011010110100111000100100111110100100110010100100110010010101000", + "00001011010011101101110000010000110110100100101000110110010000111110010111011100011001011110100100000000101100100000010100100000010110001010111110001010001101110", + "10000000011100011000110111100100001100101010111110111111110101001001100111101111010111010010010101101001100010101110011010101000011000000100110000000101100011111", + "10010110110000110011101110111111111110001010100100001111110010010101010000010001101110110110110101100010000001000100111001000101111011100101010011100101100000111", + "10101001011100001010011101111101100111100010111100110101110100000010010111101001000010001101011011110111011001010100101001010011001001011111001001011111111000101", + "11010010001000110110100011001011101101111111110011101101001011100101001100000111000010000100011111011011110111111010101111111011001101010001100101010001010110101", + "00110100101010101110011000010010111010011100001000001001000011111111010001011001100001100100000011011111010100011001001100011110101110110010000110110011010101001", + "11111011011101011110001010010010010011100111010001100010011111111000111101111100000011011010011000001111101100101000010100101000010110001000111110001000001101010", + "01110000000111010001011110000110111100111001111111101110101111011001001100110010011001010111000000101100000010001110010010001000010010000100010010000100100011110", + "01100110111110000000010101111101011011001001001101011011111101010011111010110001110100110010101001101101000001001101111001001101111011100111010011100111100000011", + "01011001000111000011111101111111010111110001101101100100101110010010111100110100001100001001101110110010111001110101000001110011000011011111101011011110111000100", + "00101111100110000101001111101001001000111100011011111001000100100011100111111111011000000001000011011111110111110010001111110011111101010011100101010011111110001", + "11001000110001100111111000110000001010001111000110001000011001101111111010100010101111100001110110001000110100111001000100111110001100110010100100110010100011000", + "00001010110011101101111010110000110110100100100110101110010000111110010110101010011001011111000100011010101100100001110100100110101110001010111110001011101011110", + "10001000111100011000101000100100001100101010101010001111110101001001100110100011010111010010110101101000100010101111111010101010001000000100110000000101100011111", + "10011111110000111011101111111111111110001010111111111111110010010101010000111111101110110111110101101111100001000100111001000111111011100101010011100101111110111", + "10101001011100011010000010011101100111100010101011100101110100000010010110011101000010001100011011110111111001010100101001010100010001011110001001111111101100101", + "11010010001000101110100110001011101101111111111011101101001011100101001101110011000010000100011111000100010111111010101111111010010101010000000100010001100010101", + "00110100101010111110010101110010111010011100011111011001000011111111010001110001100001100100000011001101010100011001001100011001111110110011100111110010100001001", + "11111011011101001110000101110010010011100111010001100010011111111000111101010100000011011010011000011010101100101001010100101001000110001001011111101000111001010", + "01110000000111010001011001000110111100111001110000111110101111011001001101000110011001010111000000101100100010001111110010001111001010000100110010000100110111110", + "01100110111110001000010000111101011011001001001101011011111101010011111011000101110100110010101001110010100001001100011001001100100011100111110011100111010100011", + "01011001000111001011111000011111010111110001110010110100101110010010111100011100001100001001101110100000111001110100100001110100010011011111101011011111001100100", + "00100010000110011101011110101001001000111100001010011001000100100011100110001111011000000001000011000001110111110010001111110010011101010011100101010011100010001", + "11000100110001111111101111110000001010001111000111101000011001101111111011110000101111100001110110011010010100111001000100111001111100110011100101010010000001000", + "00001011010011100101111101010000110110100100100000010110010000111110010110101000011001011111000100011111001100100001110100100001001110001011011111101010111001110", + "10000000011100000000100011000100001100101010101000101111110101001001100111000111010111010010110101111011100010101111111010101111001000000101010001100100010111111", + "10010110110000101011101000011111111110001010111100001111110010010101010000111001101110110111110101110111000001000100111001000100101011100100110010100101010100111", + "10101001011100010010000010011101100111100010101010000101110100000010010110011101000010001100011011110111111001010100101001010100010001011110001000111111101100101", + "11010010001000111110100110001011101101101111111011101101001011100101001101110011000010000100011111000100010111111010101110011010010101010000000100110001100010101", + "00110100101010110110010101110010111010011100011111011001000011111111010001110001100001100100000011001101010100011001001101111001111110110011100111010010100001001", + "11111011011101000110000101110010010011100111010001100110011111111000111101010100000011011010011000011010101100101001010101001001000110001001011111001000111001010", + "01110000000111001001011001000110111100111001110000011010101111011001001101000010011001010111000000101100100010001111110011001111001010000101010011100100110111110", + "01100110111110001000010000111101011011000001001100011111111101010011111011000001110100110010101001110010100001001100011001001100100011100110110010000111010100011", + "01011001000111011011111000011111010111111001110011010100101110010010111100011010001100001001101110000000111001110100100001110100010011011110001010111111001100100", + "00100010000110011101011110101001001000100100001010111011000100100011100110001111011000000001000010000001110111110010001111110010011101010010000100010011100010001", + "11000100110001111111101111110000001010011111000110101110011001101111111011110010101111100001110111111010010100111001000100111001111100110011100101010010000001000", + "00001111110011100101101111110000110110101100100011111000010000111110010111111110011001011111000101011111101100100001110101000011111110001011011111101010111111110", + "10001000111100000000101000100100001100100010101010001011110101001001100110100011010111010010110100011000100010101111111011001010001000000101010001100101100011111", + "10011010110000101011101010111111111110001010111110101111110010010101010001101011101110110111110100101010100001000100111000100110101011100100110010100100101010111", + "10101000111100010010011000111101100111110010101110001011110100000010010111100011000010001100011011011000111001010100101000010110001001011110001000111111100010101", + "11011111101000111110101111101011101101110111111011111101001011101101001101111111000010000100011111001111110111111010101110011011111101010000000100110001111110101", + "00110100101010110110010000110010111010010100011100011011000011100111010000100011100001100100000011101010110100011001001101111100100110110011100111010011110101001", + "11111011011101000110001000010010010011100111010101010010011111111000111101111100000011011010011001110000101100101001010101001010010110001001011111001000101101010", + "01110000000111001001011110100110111100101001110010111000101111011001001101001110011001010111000000010001100010001111110011001010011010000101010011100101000011110", + "01100110111110001000011111111111011011000001001000101011111101001011111011010011110100110010101001011010000001001100011000101111111011100110110010000110000000011", + "01011001000111011011111101011011010111111001110001110110101110000010111100001100001100001001101110000111011001110100100000010001001011011110001010111110011000100", + "00100010000110011101010011001001001000111100001110001001000100100011100111100011011000000001000010101011110111110010001110010001001101010010000100010011110110001", + "11000100110001111111101000010000001010011111000100001110011001100111111010011000101111100001110110100111010100111001000101111100101100110011100101010011110101000", + "00001011010011100101110010010100110110101100100101000110010000100110010111111110011001011111000100110111101100100001110101000010010110001011011111101011101101110", + "10000000011100000000100110000110001100100010101010101101110101001001100111110111010111010010110101011100000010101111111011001010010000000101010001100101000011111", + "10010110110000101011100101111011111110001010111000111111110010001101010001010101101110110111110100011101000001000100111000100111111011100100110010100101000000111", + "10101001011100010010000101111111100111110010101001100011110100001010010111110101000010001100011011001010111001010100101000010001000001011110001000111110011000101", + "11010010001000111110101001001111101101110111111110011101001011111101001100100101000010000100011111101100110111111010101110011001001101010000000100110000110110101", + "00110100101010110110010000110010111010010100011100011011000011111111010001000001100001100100000011101010110100011001001101111100100110110011100111010011110101001", + "11111011011101000110001000010100010011100111010101010010011111100000111100111000000011010010011001110000101100101001010101001010010110001001011111001000101101010", + "01110000000111001001011110100100111100101001110010111000101111010001001100101110011001011111000000010001100010001111110011001010011010000101010011100101000011110", + "01100110111110001000011111111001011011000001001000101011111101001011111010010011110100101010101001011010000001001100011000101111111011100110110010000110000000011", + "01011001000111011011111101011111010111111001110001110110101110010010111100101100001100000001101110000001011001110100100000010001001011011110001010111110011000100", + "00100010000110011101010011001111001000111100001110001001000100111011100111100011011000000001000010101011110111100010001110010001001101010010000100010011110110001", + "11000100110001111111101000010010001010011111000100001110011001100111111010011000101111111001110110100101010100100001000101111100101100110011100101010011110101000", + "00001011010011100101110010010100110110101100100101000110010000100110010111111110011001011111000100110101101100111001110101000010010110001011011111101011101101110", + "10000000011100000000100110000100001100100010101010101101110101001001100111110111010111001010110101011110010010110111111011001010010000000101010001100101000011111", + "10011111110000101011101111111001111110001010111011111111110010001101010001111111101110110111110100011111101001000100111000100011111011100100110010100101111110111", + "10101000111100010010001000111111100111110010101010001011110100001010010110100011000010000100011011011000111001010100101000010010001001011110001000111110100010101", + "11011010101000111110101010101111101101110111111010101101001011111101001101101011000010010100011111111010110111111010101110011010101101010000000100110001101010101", + "00111000101010110110001000110010111010010100011110001011000011111111010000100011100001111100000011101000111100011001001101111110001110110011100111010010100011001", + "11111111111101000110011111110100010011100111010111111010011111100000111100111110000011011010011001111111110100111001010101001111111110001001011111001001111111010", + "01110000000111001001011011000100111100101001110010001000101111010001001101000010011001011111000000000101101010010111110011001011001010000101010011100101110111110", + "01100110111110001000001000011001011011000001001110001011111101001011111011011001110100100010101001011111011001010100011000101000101011100110110010000110010100011", + "01011001000111011011111010011111010111111001110001000110101110010010111100111110001100010001101110011111101001101100100000010000010011011110001010111110101100100", + "00100010000000011101000110001111001000111100001000101001000100111011100111010111011000000001000010111100011111100010001110010110010101010010000100010010000010001", + "11000100110111111111101101110010001010011111000100111110011001100111111011110100101111101001110110110001011100100001000101111101111100100011100101010101000001000", + "00001011010101100101100101110100110110101100100011100110010000100110010110110100011001001111000100110010110100111001110101000101000110010011011111101111111001110", + "10000000011100000000100001000100001100100010101010011101110101001001100111100101000111001010110101000110110010110111111011001011001000011101010001100111110111111", + "10010110110010101011110000111001111110001010111110011111110010001101010001100001100110110111110100001010101001010100111000100000100011111100110010100110110100111", + "10101001011100010010000000011111100111110010101001010011110100001010010110011001011010000100011011011100110001001100101000010000010001000110001000111110101100101", + "11010010001100111110111110101111101101110111111000111101001011111101001101101111011010010100011111101001101111100010101110011110011101000000000100110000100010101", + "00110100101110110110010111110010111010010100011100101011000011111111010001010011110001111100000011110000000100000001001101111101111110101011100111010011000001001", + "11111011011101000110011101010100010011100111010011110010011111100000111100001100000011011010011001100111000100111001010101001101001110010001011111001001011001010", + "01110000000011001001011011000100111100101001110010001000101111010001001101000010011001011111000000000111101010010111110011001101010010010101010011100011110111110", + "01100110111100001000001000011001011011000001001110001011111101001011111011011001110100100010101001011111011001010100011000101110110011111110110010000000010100011", + "01011001000011011011111010011111010111111001110001000110101110010010111100111110011100010001101110011101101001101100100000010110001011000110001010111000101100100", + "00100010000110011101000110001111001000111100001000101001000100111011100111010111010000000001000010111100011111100010001110010010010101001010000100010110000010001", + "11000100110101111111101101110010001110011111000100111110011001100111111011110100110111101001110110110001011100100001000101111101111100100011100101010101000000100", + "00001011010001100101100101110100110110101100100011100110010000100110010110110100011001001111000100110010110100111001110101000101000110010011011111101101111001010", + "10000000011000000000100001000100001110100010101010011101110101001001100111100101000111001010110101000110110010110111111011001011001000011101010001100011110110011", + "10100110110000101011110000111001111100001010111110011111101010001101010001100001100110110111110100001010101001010100111000100000100011111100110010100000110100111", + "10101001011000010010000000011111100101110010101001010011100100001010010110011001011010000100011011011100110001001100101000010110001001001110001000111000101100101", + "11111111101010111110101111101111101011110111111011111101011011111101001101111111000010010100011111101111101111100010101110011111111101001000000100110110111110101", + "00111000101110110110001000110010111010010100011010001011011011111111010001100011110001111100000011111000100100000001001101111110001110101011100111010101100011001", + "11111010111101000110001010110100010011100111010010101010010111100000111100101010001011011010011001111010100100111001010101001110101110010001011111001100101011010", + "01101000100011001001001000100100111000101001110010001000111111010001001101100010000001011111000000011000101010010111110011001110001010010101010011100011100010010", + "01111111111100001000001111111001011111000001001111111011100101001011111010111111110100100010101001001111111001010100011000101111111011111110110010000000111111111", + "01101001000011011011110101111111010111111001110101100110101110010010111101110100011100010001101110010010101001101100100000010101011011000110001010111001111001000", + "00010010000110011101000001001111001000111100001010011001011100111011100111100101010000000001000010111110111111100010001110010101010101001010000100010111010111001", + "11100100110101111111100000110010001110011111000000011110010001100111111011000000110111101001110110111010111100100001000101111000110100100011100101010101010100100", + "00001011010001100101100000010100110010101100100001010110010100100110010111111000011001001111000100101100110100111001110101000010001110010011011111101100001100010", + "10010000011000000000101110100100001100100010101110111101100111001001100110101111000111001010110101001001110010110111111011001110000000011101010001100010100010011", + "10100110110000101011110111111001111110001010111100101111101110001101010001010011100110110111110100001000001001010100111000100011100011111100110010100001110001111", + "10001001011000010010001101011111110011110010101101110011111100001010010110101101011010000100011011010111010001001100101000010101011001001110001000111000110001001", + "11010010001010111110111011001111101001110111111010001101001111111101001100100011000010010100011111110111101111100010101110011001010101001000000100110111000111001", + "00100100101110110110011000010010110010010100011000001011010001111111010000011001110001111100000011111111000100000001001101111000110110101011100111010100011100101", + "11001011011101000110011010010100001011100111010001000010000001100000111100111110001011011010011001100101100100111001010101001110001110010001011111001100001100010", + "01010000000011001001010110000100100000101001110110101000100111010001001101110110000001011111000000001100001010010111110011001110000010010101010011100011100010010", + "01100110111100001000001101111001001111000001001100111011111001001011111010010101110100100010101001000001011001010100011000101111100011111110110010000001100001111", + "01001001000011011011110101111111001111111001110101100110111110010010111101110100011100010001101110010010101001101100100000010101011011000110001010111001111001000", + "00010010000110011101000001001111011000111100001010011001011110111011100111100101010000000001000010111110111111100010001110010101010101001010000100010111001111001", + "11100100110101111111100000110010010110011111000000011110010111100111111011000000110111101001110110111010111100100001000101111000110100100011100101010101001100100", + "00001011010001100101100000010100101010101100100001010110010100100110010111111000011001001111000100101100110100111001110101000010001110010011011111101100010100010", + "10010000011000000000101110100100001100100010101110111101100101001001100110101111000001001010110101001001110010110111111011001110000000011101010001100010110010011", + "10100110110000101011110111111001101110001010111100101111101000001101010001010011100010110111110100001000001001010100111000100011100011111100110010100001111001111", + "10001001011000010010001101011111111011110010101101110011111010001010010110101101011000000100011011010111010001001100101000010101011001001110001000111000100001001", + "11010010000010111110111011001111110001110111111010001101001111111101001100100011000110010100011111110111101111100010101110011001010101001000000100110111001111001", + "10000000101110110110011000010010111010010100011000001011010011111111010000011001110101111100000011111111000100000001001101111000110110101011100111010100000100101", + "00111111001101000110001111110100000011100111010011111010000101100000111100111110001001011010011001101111100100111001010101001111111111110001011111001100111110010", + "00000000101011001001001000100100100000101001110010001000100001010001001101100010000111011111000000001000101010010111110011001110001010010101010011100010100010000", + "11111110110100001000001010111001000111000001001010101011111001001011111011101011110100100010101001011010111001010100011000101110101011111110110010000001101011100", + "10000010010011011011101000111111010111111001110010001110111110010010111100100010011000010001101110011000101001101100100000010110001011000110001010111000100011011", + "10111010011110011101001111101111011000111100001011111001011110111011100111111111010110000001000010111111111111100010001110010111111101001010000100010111111111010", + "10111010110101111111110111110010010110011111000110101110010111100111111011110010110101101001110110101000011100100001000101111101100101000011100101010100111000100", + "10111010101001100101100101010100101010101100100001110110010100100110010110001100011101001111000100111111010100111001110101000111011111110011011111101100100000001", + "10000010010000000000111011000100001100100010101000001101100101001001100111100011000011001010110101001111110010110111111011001001010001111101010001100010101110010", + "11111110000000101011110000011001101110001010111100001111101000001101010001011001100000110111110100010111001101010100111000100010110010111100110010100001000101110" + ], + "3": [ + "11111110000011101000110011111010011110110010111101000100010000010110100101001000010110000011001001111110010101010110010100001011001011110011001111110011001111111", + "10000010101011011110000100111000100010000011110010001011100000000110110001001100111000011000100010111101111111010101111111001000101010011000101100011010001000001", + "10111010101100110011101000101000010001000000110101100110011001000001111100100100111110100000010001011101000111101101000111110000010010100000010100100000101011101", + "10111010011101101000110010101010000000011101001001000010011010010001001110111101100010111110011101010011001011110011001011110110010100001110010010001010101011101", + "10111010011111011110001111101100101000000001001011111010000110100000010011111110100000001101111110111111100010111000100010111111111101000101100101000100101011101", + "10000010011000110011101000110101001111101111011110001110001101101011011101100011110101110101001110001000110011000000010010100010001111110101011111110100101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000010111011110001000100101111100101001011010001010110100101100010001100011010011101101111101001000101011111000101010011110001111001101100111001100100000000", + "01110110001100110011101111110001011011000011010111111000100001001010010101111110111000101101000111101111110001011000010000101111111111010101011111010100000000110", + "11011001101011101000110011111010011110110010111111000100110000010110100100111100010111000011001001110110010101010110010100001011001011110011001111110010010111110", + "00100010011011011110000100111000101010000011110110001010100000000110110001011100011001111000100010111101111110110101111111001000101010011000101100011001110100011", + "01001101101100110011101000101000000001000000110111100111011001000001111100010000111111000000010001000101000110001101000111110000010010100000010100100001010000100", + "10001111010101101000110010101010011000011101001101000010111010010001001111100011100011011110011101001011001010010011001011110110010100001110010010001111011100001", + "01101101010111011110000101001100110000000001001001110011000110100000010010011110100000101101111110100000100011111000100010111101111101000101100101000100111111000", + "01001111110000110011101001010101010111101111011011100110001101101011011101000001110100110101001110010000010011000000010010100101000111110101011111110100001111110", + "10010100110001101000111011110011000010011111101100111100000010011010100110111111100100011011001011111110011101001110011100101011001001111011010001111010010111111", + "00111011100001011110000100011100110110101110111011110101001100100111111001101011010101100000101010011101111100110101111101000000100010111000110010111001110100111", + "00000000111000110011100000100001000101101001100100011111101011001101111110000111001101011000010010101101001110001101001111010000010001001000010100101001001100101", + "10010110101101101000100010001110011100110111000000111100010110110000000110001010101111101110010100001011001000000011001001111110011101001110011010101110100010101", + "00100000000001011110011101000101101100101101011010001010110100101100010001111101010010101101111100101000101011100000101010011101111110101101111001001101111101001", + "01010110001110110011111001110001000011000010010110011001100001001110010101111000111000000101000110010000010001001000010000101101001110010101001001010100100111010", + "11011001100001101000100011111010000110110011111111000101110000010110100101001000010110011011001000010110010101001110010100001011001011110011001111110010001001110", + "00101111111101011110011111111000111010000110110111111011100000000100110000111110011001011000100011111111111110101101111111001111111010011000101100011001111110011", + "01001000101010110011111000101000011001000100110110001111011001000001111101100010111111000000010000111000100110010101000111110110001010100000011100100001100010100", + "10001010110111101001101010101010000000011010001110101011111010010111001110101011100011010110011100111010101010000011001011110010101100001110011010001110101010001", + "01101000110101011110101000101100101000000100101010001010000110100010010011100010100000110101111111011000100011100000100010111110001100100101111001000100100011000", + "01001111110110110011001111110101000111101010111111111111001101101001011100111111110100110101001111011111110011011000010010100011111110010101000001110100111111110", + "10010100110111101001100010010011011010011110101100111100000010011010100110011011100100011101001010000011011101010110011100101000011000011011001111111010010101111", + "00110010000011011110000101011100101110101101111100001100001100100011111000001001010101101110101011101000111100100101111001000101111011111000100100111000100000111", + "00000100011010110010010001100001011101101001000110011110101011001101111111000111001101000110010011011000001110010101001001010011001000101000010100101001111000101", + "10011011101011101001011011101110001100110001100101000101010110110010000111111100101111101010010101001110001000011011001111111011001100101110011010101111010110101", + "00100000000111011110101100100101110100101000011010001010110100101100010000111101010010101101111100110101101011111000101100011110101111001101111001001101010101001", + "01011111101100110011110000110001011011000000010001100000100001001100010101110000111000001101000110000101010001001000010000101000010111010101001001010100110101010", + "11011101000011101001101010111010011110110010011101000100110000010100100100000010010110000011001000000011010101001110010100001000010010010011001111110010011011110", + "00101111011011011111000101011000101010000111010011110010100000011100110001011110011001011000100011111000111110101101111111001101111011111000101100011000011000011", + "01001101101100110010011001001000000001000101110111100111011001010001111101000000111111001110010001011000000110010101000111110011000011000000010100100001001000100", + "10000110110001101000110011101010011000011011001010111010111010001101001110111111100011001000011101011110001010010011001111110011001101001110010010001110000110001", + "01101001110101011111111100001100110000000100101011110011000110101000010010101010100000111011111110110101100011111000100100111110100101000101111001000100011101000", + "01000010110000110010000000110101010111101010111110011110001101110001011100100111110100110001001110010101010011000000010101000000010111110101000001110100011101110", + "10010100110111101000011010010011000010011110101100111100000010000010100110001011100100010011001010000011011101001110011011001000011001111011001111111011101011111", + "00110010000111011110011101011100110110101101111100001101001100111001111000000101010101111000101011101000111100100101111100100101111010111000100100111001011000111", + "00000100011000110010110001100001000101101001000110011111101011001111111111010001001101010000010011011000001110010101001110010011001001001000010100101001000000101", + "10011011101011101001110011101110011100110001100101000100010110110010000111111000101111101110010101001110001000011011001001111011001101001110011010101110101110101", + "00100000000001011111110100100101101100101000011010001010110100101100010000111101010010100011111100110101101011111000101010011110101110101101111001001100100101001", + "01011111101010110011101000110001000011000000010001100001100001011110010101101100111000010011000110000101010001001000010100101000010110010101001001010101010101010", + "11011101000011101001001010111011000110110010011101000101110000000110100100001100010110001101001000000011010101001110010010001000010011110011001111110010111010010", + "00101111011101011111101101011001011010000111010011110010000000011100110001001010011001011100100011111000111110101101111000101101111010011000101100011001111001111", + "01001101101100110011000001001001011001000101110111100110111001011001111101010000111111001000010001011000000110010101000000010011000010100000010100100000101001000", + "10001111110001101000101111101010000000011011001011111010011010001111001111111111100011001110011101011111101010010011001010010011111100001110010010001111111111001", + "01101000110101011111011000101100111000000100101110001010100110100010010010100010100000111101111110111000100011111000100011111110001000100101111001000101100011000", + "01001010110000110010111010110100111111101010111110101111101101101001011101101011110100110101001110011010110011000000010010100110101000010101000001110101101011110", + "10011000110111101001001000110010111010011110101110001101100010011010100110100011100100010101001010011000111101001110011100101010001110011011001111111010100011111", + "00111111100111011110001111111101100110101101111011111100100100110011111001111111010101111110101011111111111100100101111001000111111101111000100100111000111110111", + "00001101111000110010001000100000011101101001000111100111010011011101111111101111001101010110010011010101001110010101001001010100010001001000010100101000010101001", + "10011111001011101001011010101111100100110001100111000100110110101010000111001010101111101010010101010101001000011011001110011010010101001110011010101110011011001", + "00101101000001011110110101000101111100101000011111110011000100110100010000101101010010100101111100111110101011111000101101111001111110101101111001001100111000101", + "01011111101010110011110000010001100011000000010111100001001001010100010100010010111000010101000110000110010001001000010001001001000111010101001001010100101000010", + "11010100100011101001100010111010000110110010011100111100001000010100100100110100010110001011001000001010010101001110010101001111001110010011001111110010101111110", + "00101011111101011111010100011001010010000111010001110010000000000100110001111110011001011000100011100101111110101101111111001100100101111000101100011001001100011", + "01000000101100110010010000101001110001000101110010011110111001000001111101000110111111001110010001010101000110010101000111110100010101000000010100100000010100100", + "10000110110001101000110010101011011000011011001100111010010010000111001111001011100011001000011101011011001010010011001111110010011011001110010010001110010010001", + "01100000010101011111100101101101110000000100101010001010111110110000010010000010100000111011111110111000100011111000100100111001111100100101111001000101111000100", + "01000110010000110010011000110100111111101010111100011111101101110101011100010011110100110001001110001110010011000000010101000001001110010101000001110101000000010", + "10011001110110101000001011110011001010011110101001000101110010000010100110011101100100010101001010001000011101001110011011001111001000011011001111111010001110011", + "00110010000111011110010101111100001110101101111010001100100100111111111001111101010101111110101011101011111100100101111000100100101011111000100100111001000101111", + "00001100011001110010100001100001011101101001000111100111010011001111111111101111001101010110010011010001001110010101001000010100010101001000010100101001110100101", + "10011110101011101001101010101111100100110001100111000100110110110100000101001000101111101010010101010011001000011011001111111010010011001110011010101111111010101", + "00101101100000011111111101000100011100101000011111110011010100101110010100101011010010100101111100111000101011111000101100011001111000101101111001001100111001001", + "01011111001011010010111001110000000011000000010111100001001001011010010010010000111000010101000110000000010001001000010100101001000000010101001001010100101001010", + "11010101000011001001111011011011000110110010011100111100001000000100100010110100010110001011001000001110010101001110010010001111001010010011001111110010101110010", + "00101010011101011110011101011001010010000111010001110010000000011010110001111110011001011000100011100011111110101011111000101100100011111000101100011001001101111", + "01000001101101110010010000101000010001000101110010011110101001011011111011000110111111001110010101010011000110010011000000010100010011000000010100100001010101000", + "10000110010001101001100011001010111000011011001100111010010010001001001011001011100011001000011011011101001010010101001110010010011101001110010010001111110011001", + "01100000110100011111001100001100110000000100100010001010111110100010010000000010100000111011111000111100100011111100100101111001111000100100011001000100011001000", + "01001111110000110011111111110100111111101010100111111111101101101111011101111111110100110001001000001111110011000000010101000011111000010100000001110100111111110", + "10011000110110101001001000110010101010011110100010001101100010011000100001100011100100010011001010011000111101001110011011001010001110011010101111111011100011111", + "00111010100110111111011010111101101110101101100110101100100100110111111100101011010101111000101011111010111100100101111000100110101101111001000100111000101010111", + "00001000111000010010111000100000011101110001001110001111010011011111111101100011001101010000010011011000101110010101001000010110001001001000010100101001100011001", + "10011111101011101000111111101111100100111001110111111100110110111100000110111110101111101110010101011111101000011101001110011011111101001110011010101111111111001", + "00101000000000011111111100000101111100100000010011110011000100111110010111011111010010100011111000111101101011111110101101111100100110101101111001001101101100101", + "01010010001010110010111000110001100011011000000110011001001001010010010001000110111000010011000000011101010001001110010101001010010110010101001001010100110100010", + "11010101000010101001101010111010000110110010010010111100001000011100100110101010010110001101001110011011010101001010010011001010011110010010001110010011010010010", + "00100011111101011110001101111001010010001111001010001010000000001010110000100010011001011100100101110000111110101101111000101111111101111001001101111000011000111", + "01000101101101110010010000101001110001000101111110011110111001010011111010110010111111001000010001010110000110010101000000010001001101000001110101000000000001000", + "10001010110000001001100011101011011000001011010101000010010010001001001010011101100011001110011101000000001010010011001110010001001011001111110011001111101110001", + "01100000110101111111011101101101110000011100100100010010111110101010010000011100100000111101111110101011100011111000100101111100101000100101111001000101100100100", + "01001111010000110011100001110100111111110010101111101111101101100111011101001111110100110101001110011001010011000110010101000010010000010101000001110101110100010", + "10011100110110101001001010110011001010001110100101001101110010001000100001101001100000010101001110001011011101001000011011001010010110011011001111111011011010011", + "00011111100111011111010101011100001110100101101011110100100100111111111100101011010001111110101101110000111100100011111000100111111101111000100100111001011001111", + "00011100011001110010110001100001111101101001001001101111010011000111111101110001001011010110010101000000001110010001001000010001000101001001010101001000001001001", + "10100111001011101000111011001111100100111001111100100100110110111100000110010100101001101010010011000110001000011011001110011001001011001111111011001110101111001", + "00011000000000011111111101000101111100101000010011100011010100111110010111011111010000100101111100111011101011111000101101111100100000101100011000101101101100101", + "01110011101011010010111000110000000011010000001110000001000001010010010001000110111110010101000110011011010101001000010101001010010000010100101000010100110100010", + "11000100000011001001101011011010100110101010010010100100000000011100100110101010010110001011001000011101010011001110010011001010011110010011001111110011010010010", + "00010010111101011110001100011001010010011111000010011010010000001010110000100010011101011000100011110100111000101011111000101111111101111000101100011000011001111", + "01110101101101110010010001101000010001010101111110010110101001010011111010110010101001001110010101010110000000010011000000010001001101000000010100100000000001000", + "10001011010001101001100011101011011000010011011101000010010010001001001010011101111001001000011011000000001010010101001110010000001011001110010010001111101111001", + "01110001110100011111011100001100010000000100100100000010100110101010010000011100101100111011111000101011100011111100100101111101001000100100111000100101100100100", + "01001110010000110011100000010100111111100010100111111111110101100111011101001111110010110001001000011001010011000000010101000011110000010100100000010101110100010", + "10101100110110101001001011110011001010011110100101010101111010001000100001101001111110010011001010001101011101001110011011001011110110011010101110011011011010011", + "00011111100110111111001111111101101110111101100011111100100100111111111100111111010011111000101011111111111000100101111000100011111101111001000101111001111111111", + "00011000111000010010111000100001111101110001001110001111001011000111111101100011011101010000010011001000101000010101001000010010001101001000010100101000100011001", + "10101010101011001000101010101111100100101001110010101100101110111100000111101010101011101110010101011010110110011101001110011010101011001110011010101111101011001", + "00011000100000011111111000100101111100111000010110001011001100111110010110100011000100100011111000111000110101111110101101111110001000101101111001001100100010101", + "01011111101011010010111111110000000011001000000111111001001001010010010001111110100010010001000000011111101001001110010101001111111000010101001001010101111110010", + "11001000100011001001100011011010100111010010010101011100010000011100100111011100011010001101001110011000000101001010010011001011001110010010001110011011101110010", + "00100010111101111110001101011001010011101111001010010010011000001010110000011100011111011010100101111011111110101011111000101000101101111001001101110000000101111", + "01111101001101010010010001101000010000000101111101110110100001010011111010001110100101001110010101001001000110010011000000010000010101000001110101001000110101000", + "10101110110000001001101011001011011000101011010001001010010010001001001010001001100101001100011011001101001110010101001110010110010011001111110011011110011011001", + "01111101110100011111010100101100010000111100100011110010100110101010010001101010110000111011111000101110100101111100100101111100111000100101111001000101011000100", + "00111110010000010011100001010100111110010010101111101111110101100111011011110001110000110001001000010110001101000110010101000100100000010101000001110101101000010", + "00100101010110001001001010010011001010101110100110100101111010001000100111010101110010010101001110010010000011001000011011001010101110011011001111111011101110011", + "10111010000110111111011100111101101110000101101111100100100100111111111100111111001111111010101101111011100100100011111000100001000101111000100100111000101101111", + "11010001111001110010111001000001111100001001010110000111001011000111111100000111000001010110010101000011011110010001001000010000010101001111010101011000110101001", + "00010110001011001000111010001111100101011001110100100100101110111100000000101010101001101010010011001101001000011101001110011110011011001001111011010110110011001", + "11010000100000111111111100100101111101101000000000011011001100111110010001100011001000100011111000100100101011111110101101111101111000101010011000110101011000101", + "00110111101011010010110001010000000011110000011010010001001001010010011001010010111110010111000000010110010101001110010101001101001000010000101000001101000000010", + "01001001000010101001100010011010100110001010000101000100010000011100100111011100000110001101001110011000010011001010010011001010001110010010001110010011101110010", + "01010011111101111110001100111001010011111111001010000010011000001010111110011100011101011100100101111011100000101011111000101001001101111001001101111000000101111", + "11111100001101010010010001001000010001110101110101111110100001010011101100001110101001001110010101001001011000010011000000010001110101000001110100000000110101000", + "00001110010000000001101010001011011000110011010001010010010010001001000010001001111001001100011011001101010010010101001110010111110011001111110010101110011011001", + "10111100110100011111010100101100010001100100110001101010100110101010000001101010101100111011111000101110110011111100100101111101111000100010111000110101011000100", + "11001110110000010011100001010100111110011010100101111111110101100111011011110001110010110001001000010110010011000110010101000101000000010010100000001101101000010", + "01100101010110010001001010010011001011011110101000101101111010001000110111010101111110010101010110010010011101001000011011001011001110011100101110000011101110011", + "01011010100110100111011100111101101110000101100111111100100100111111110100111111010011111010110101111011111000100010111000100000100101111101000101100000101101111", + "10010001011001101010111001000001111101001001011100011111001011000111111100000111011101010110001101000011001000010000101000010001010101001001010101001000110101001", + "11101111101011000000101111101111100101000001111111111100101110111100001001111110101011101010000011001111110110011100101110011011111011001111111011001110111111001", + "10011000100000111111101000100101111100001000011110001011001100111110000000100011000100100011111000111000110101111111001101111010001000101100011000101101100010101", + "11011010101011000010111010110000000011101000001010101001001001010010011001101010100010010111000000001010101101001110010101001010101000010100101000010100101010010", + "00001000100010101001101000111010100111010010000010001100010000011100110111100010011010001101001110011000100011001010010011001010001110010100001110000011100010010", + "10101111111101111110011111111001010011110111001111111010011010001010110110111110011111011100100101111111111000101011111000101111111101111111001101100000111111111", + "10111100101101010010000001001000010000000101110001101110100011010011101101010000100111001110001101011110000000010011000000010110100101000111110101011001101001000", + "11000111010000010001101010001011011000110011010100100010010000001001000011110101100011001100000011001010001110010100001110010100101011001011110011010111001111001", + "11001000110100000111010100101100010000100100110001100010100000101010010000111110110000111011100000110011100101111101000101111001000000100100111000100101001100100", + "00110011010000011011110001010100111110011010100000000111110001100111010011100111110000110001011000000011001101000111110101000010010000010100100000010100010100010", + "00000101110110001001011010010011001010111110101100100101111010001000110110001011100100010101001110000101000011001001111011001010011110011010101110011010110010011", + "10110011100110101111011100111101101110000101100110011100100110111111110101000011000101111010101101111100100000100011111000100101111101111001000101111001111001111", + "11100101011001110010111001000111111100001001011000010111001101000111101101010011000101010110010101011110011000010001001000010011001101001111010101011000100001001", + "00101010001011001000101010001101100101000001111011001100101110111100000000111100100011101010010011011000010110011101001110011010001011001001111011010111001111001", + "11110001000000111111101100100101111101101000011100011011001000111110000000111101001010100011100000110011110101111110101101111011001000101010011000110100000100101", + "00011110001011001010110001010110000011101000001111101001001101010010011000101110101000010111011000010001001101001111010101001111110000010000101000001100010100010", + "01111100000010110001100010001100100110010010000111001100010000011100100110001000001110001101010110000101000011001011110011001111110110010010001110010011111010010", + "01011110111101110110011100111011010011110111001101111010011100001010111110001010011101011100110101101110100000101010011000101110111101111001001101111001111001111", + "11011100101101010010000001000110010001100101110111110110100001010011101101010000100111001110010101011110011000010010100000010000100101000001110101000001101001000", + "00000111010000011001101010001011011000110011010000110010010000001001000011110101110011001100011011001010010110010101001110010010101011001111110011001111001111001", + "10001000110100011111010100100010010000100100110101111010100000101010000000111110111000111011111000110011110101111100100101111111000000100010111000110101001100100", + "11110011010000010011110001010110111111011010100000010111110101100111011011100111110000110001001000000011001101000110010101000001010000010010100000001100010100010", + "01000101110110001001011010001011001011111110101010101101111110001000110110001011111100010101010110000101000011001000011011001101111110011100101110000010110010011", + "01110011100110100111011100111011101110000101100010100100100000011111110101000011000101111010110101111100100000100010111000100010011101111101000101100001111001111", + "10100101011001101010111001010111111101101001011100110111001010000111111101010011010101010110001101011110011000010000101000010100101101001001010101011000100001001", + "11010010001011000000101010010101100100000001111010101100101011011100001000111100101011101010000011011000010110011100101110011000001011001111111011010111001111001", + "10000001000000111111101100111011111101001000011010111011001101111110000000111101001010100011111000110011110101111111001101111101001000101100011000110100000100101", + "00111110001011000010111111110000000010001000001011111001001010010010011000111110101000010111000000011111101101001110010101001011111000010010101000001100111110010", + "00000000100010101001101000110100100110110010000110001100010110111100110111100010001110001101001110001000100011001010010011001010001110010100001110000010100010010", + "11111110011101111110001010111011010010110111001110101010011000101010110110101010011101011100100101111010100000101011111000101010101101111111001101100001101011111", + "10000010101101010010011000110000010000100101110010001110100101010011101101100010100111001110001101001000111000010011000000010010001101000111110101011000100011000", + "10111010010000010001101111101101011001010011010011111010010110101001011011111111110011001100000011011111110110010100001110000011111011001011110011010111111111001", + "10111010110100000111011100111010010000000100110100100010100111101010000000100010111000111011100000111100110101111101000101100000011000100010111000110100111000100", + "10111010110000011111111001001110111111011010100010010111110000000111010010010011110000110001011000000110001101000111110101011110101000010010100000001100100000001", + "10000010110110001101011010001101001011111110101101001101111011001000111110111101111100010101010110001000000011001001111011010000001110011100101110000010101110010", + "11111110000110101011011100111101101111100101100100011100100111111111101101111101000101111010110101100011100000100010111000100011001101111101000101100001000101110" + ] + }, + "37": { + "0": [ + "111111101101100100100011110010110110010100001101111011000001110110011111010100110101100000110010011111001111000010111000110101100101100000100100100101000101101111111", + "100000101110000000010110010110101010111100110110010100101011001100101111001000001101011000001000101111010111010010100110010100111101011000010100111111110010101000001", + "101110100101110001100111101100000011100111101111100101010010100010001011100101110011010110000011010110000011111100101000011010110011010110011010110001011100001011101", + "101110101010000110100001011000001110100000001000111010001001101001001010011110011000110101100000110101100010011101000010111101000000110101111001010010011001001011101", + "101110100010101101001110001111100011111001100000010111111100011011110010100110111110001101011000001101011111101111010000101111010011111100111110010100111110101011101", + "100000100101111011001101001000110011000111101101001110001000010111110100001111100010000011010110000011011000101000011010110000011010001010110000011010110000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001100101010111100111000110110011100110100111110001000111001010000101001100010001101011110010000101000100110010100111110010010001100111110010100111110100000000", + "101101110110010110010111101111110100110110111110001011111110011111111010110110111110000011010000011100111111101010010011010110000111111010010010010010010010101001011", + "100101010101100010100011111010010110010100001101111010001000110110011001010100101101100000110011111111000111000011111000110101100101100000110100100101000011011111010", + "110110111000000010010110010110001000111100110110010111011011101100101001001000010101011000001001001111010111010010100110010101011101011000001100111111110011001111101", + "101100001101110011100111100100000101100111101111100100001011000010001111100100000011010110000011010110011011111100101000011011010011010110000010110001111101101011100", + "100110101000000100100001011001101010100000001000111000111000101001001010011111100000110101100000110101111010011101000010111100100000110101100001010010111100001010100", + "001000011110101101001110010111000011111111100000010110101100111011110010100111011000001101011000001101011010101111010000101110010000001100111110010100111110110011001", + "101101100001111011001101001101110011000101101101001101110000110111110100001011010110000011010110000011010100001000011010110000011110000010110000011010110000010101001", + "011010011001000001010001010010111011110111011001010011100100010100111101000010100101100001010011111101010101001011111001010011111101100001010011111001010011011100101", + "001011100101001101001100110101101111101111100101010101100101100100100001101010010101011001101011000111101111110001001001001101011101011001001001001001001001100110010", + "010011000001010100010101001100100000100110111011001100111111100000101111100100011011010111100101001001110001110101001111100011010011001110000010010011110101101001100", + "011011110111101111111011111011100101010101011011111010110110000001000100100101111000110100100100100010111010111111001010011000110000101101100001010010011110100010000", + "110110010100101000111100111111011110111000110100111111010000011001010100111111011000001101011000001100100000100111110010100000001000010101011001101010100110110000111", + "010001111110110010010111101111011100010000111110001110000110011111111100101001010110000011010110000010101100101011110100001010010110010011010111111100001010111100010", + "100100010111000000101011111011101110010100001101111011010001010110011111001010110101100000110101100001010111000010111101000011111101100001010011111001010011011110100", + "110100111010100000011110010111001000011000110110010110101011101110101111010000001101011000001101011001001111001011000001101011000101011001101011000001101011101110010", + "101100001111110111110111100100101101000111101111100101001010100100001011110100010011010111100101001111100011100101001111100101001011010111100101001111100101001010011", + "100110101000100000100001011000000010000110001000111000010000001000101100000111111000110100000110101100000010000100100100100000110000110100100100100100100100101011111", + "001010011010001111010110010111111011111101100000010111111100111110010100111111000000001100111110010100101010111110010100111000001000010101011000010000101111110011011", + "101111111001011001010101001111110011100011101101001111111000110110010010010010111110000010010010010010001111101001111100110110000011111011010110011100101000111110010", + "011010001001000101010001011000110011010101011001010010001101110101111001010011100011100000110101100001011000101010011111010101100010001000110101111111001010100010110", + "001010101101101001010100101010100111001011100101010110101101000100100111110011101011011000001101011001101010110000101111001001001010101000001101001111010000101011001", + "010010001001110110001101001000111000100010110011001110001111100010101001111100100011010110000011010111101000110100001011100101001010001111100101001111100101100010010", + "011011111111001101111011111111100101110101000011111011111110000101000010111100111110110101100000110100111111100110101100000110101111111100000110101100000110111111111", + "110110011100101100111100110110010110011100100100111011001001111111010000101111110100010100111110010100110111011110010100111110010011000100111110010100111110101111000", + "011001101110010110010111101101110100110000110110001100001110111000011010110000000010011010110000011010110011110010010010010010000011001010010010010010010011101011001", + "100111001111100010111011101000010110010000000101111010110001010011111001010010000001111001010011111001001010010011111001010011100110100000110011111101000010101010110", + "111101111010000010001110010111101000111000111110010110111011101101001001001001011001001001001001001001001010110010100111101011011000001000001011000111110011110010001", + "100111000111110011100111101101000101100011101111100001110011000011001111100100110111010110000011001111110100011100101001100101010000000110000101001001111100010100000", + "100110111000000100111000011011001010100110011000111011111000101001001010011110100100110101100000101100001101011101000010100100100101100101100100100010111100111101100", + "001011000010101101010111100101100011111001111000010111111100111001110010100111110100001101011000010100111111101111010000111110010011011100111110010100111111100111001", + "100001100001111011001100001100110011000011101101001100100000110011110100001010011010000011010110010010001001110000011010110000011010001010110000011010110001001001001", + "010011010001000001010000111011111011110001011001010110100100010010111101000010011001111001010011111001011010110011111001010011111111001001010011111001010011000010101", + "000010110101001101001100110110101111101011110101010111010101100011000001101011011001000001101011000001101000101001001001001001011001110001001001001001001000101000010", + "011101011001010100001101111110100000100110110011001100000111100101001111100100110111001111100101001111111100100101001111100101010001110110000101001111110100000100000", + "011100110111101111100010111010010101010101010011111011010110000000100100100100110100100100100100100100100111011111001100000110110101100101100110101100011110000111100", + "110000011100101000111100110110001110111000110100111010101000011000010100111111101100001101011000010100100111000111110100111110001011011101011110010100100111011111011", + "010000101110110010001111101101100100010000101110001101001110011111111100110000010010000011010110011010110011101011110010010010010011010011010010010010001010001011010", + "100110001111000000111011101000010110010100010100111010010001010100011111010010011001100000110101111001001010000010111001010011111110110001010011111001010010001010100", + "111010111010100000010110010111111000011000110110110111111011101000101111001001000001011000001101001001001010101011000001101011000001010001101011000001101010010010010", + "100101000111110111100110001101010101000111101111000000010010100100001011100100101111001111100101001111111100000101001111100101001001111111100101001111100101110100011", + "101111111000100000100001011011010010000110011000111010111000001110101100000110110100101100000110101100000101000100100100100100100100011100100100100100100101000101111", + "000110000011101111010110100101111011111101101001110111011100111110010100111111101100010100111110010100100111111110010100111110010010101100111110010100101111011111001", + "101010100001011001010100010100100011100011100100001101100000110110010010010010000010010010010010010010010001101001111010110000011011010010110000011010101000110001001", + "011101010000000101010001010011100011010101011000110111000101110101111001010010000001100000110011111001001010101010011001010011111110110001010011111001001010110010101", + "001011111101001001010100101111111111001011110100010111111101000100100111101011111111011000001011000001101111110000101001001001001011111001001001001001010001111110010", + "010010001000110110001101001000100000100010100010000110001111100010101001100100100011010110000101001111111000110100001111100101001010001111100101001111100100100010010", + "010110101111101101111011101010110101110101011011010010101110000101000010100101101010110101100100100100101010100110101100000110101010101100000110101100000110101011111", + "111110001101101100111101011000101110011100110101111110001001111111010000111111100010010100111110010100111000111110010100111110010010001100111110010100111110100011000", + "011011111110010110010111111111100100110000101111110111111110111000011010110000111110011010110000011010111111110010010010010010010011111010010010010010010011111111001", + "101010011110000010111011001011010111010000000100000001011001010011111001010011100101111001010011111001000101010011111001010011111001100001010011111001010010011100100", + "110011100010000010001111011101111001111000111111010111011011101101001001001001010101001001001001001001011111110011000001101011000001011001101011000001101010100110010", + "101001000110110011100111101100110100100011101110011100000011000011001111100101011011010110000101001111110001111101001111100101001110001111100101001111100101001000011", + "100111110000100100111001000011110010000110011001100010000000101001001100000110111000110101100110101100010010111100100100100100100101001100100100100100100100100011111", + "001010010011101101010110001110111010111001111001011101010100111001110100111110001110001101011110010100101000101110010100111110010101110100111110010100111110001001001", + "100001111001011011001101011110100010100011101101100100000000110011110010010010001000000011010010010010000100110000011010110000011011110010110000011010110000000101001", + "010000010000000001010000101010000010010001011000010011110100010010111001010011101011111001010011111001000111010011111001010011111001100001010011111001010010100110101", + "000000111101001011001100100110011111101011110100101111101101100011000001101011010001000001101011000001111111001001001001001001001001011001001001001001001000111110010", + "011100001000110110001101111101100001100110110010110110001111100101001111100101010011001111100101001111110011100101001111100101001111010111100101001111100100101010010", + "011110101111101001100010110000010100010101010010111010110111100000100100100100111000100100100100100100110010011110101100000110101100110100000110101100000111001011111", + "110010011101101000111100110111101111111000110101000110011000111000010100111110000000001100111110010100101010100110010100111110010101010100111110010100111110010011000", + "010001100110010000001111110101000100110000101111010010110110011111111010110000001110000010110000011010100101001010010010010010010011111010010010010010010010010101001", + "100111011110000000111011100011010111010100010100110110111001110100011001010011100011100001010011111001000100100011111001010011111000011001010011111001010011100100100", + "111010100010000100010110000101111001111000110100111101011010001000101001001001010011011001001001001001011110001011000001101011000000101001101011000001101011011110010", + "100110000110110011100110011100110100100111101100100011000011100100001111100101011101001111100101001111110000000101001111100101001111010111100101001111100100010000011", + "101101110000100110100001001011110010000110011011000100000000101110101100000110111100101100000110101100010010100100100100100100100100110100100100100100100101010011111", + "000111010011101101010110100110111010111011101111101001010100011110010100111110001000010100111110010100101000111110010100111110010100001100111110010100111111110001001", + "101000111001011111010100000110100010100101100000001100000001010110010010010010001110010010010010010010000100110000011010110000011010000010110000011010110001111101001", + "011111010000000101010001011010000010010001011010101101110101010101111001010011101101100001010011111001000111010011111001010011111000111001010011111001010011111110101", + "001010111101001011010100101110011111101111110110001011101101000101000001101011010101011001101011000001111110001001001001001001001000100001001001001001001001001110010", + "010001001000110110001101010101100001100000100010000100001111000011001111100101010101010111100101001111110010000101001111100101001110101111100101001111100101010010010", + "010111111111101001111011111111110100010011011001010111111111100100100100100100111110110100100100100100111111100110101100000110101111111100000110101100000110111111111", + "111110001101101000111101001000101111111100110111111010001000111110010100111111100011010100111110010100101000111110010100111110010010001100111110010100111111100011000", + "011010101110010000001011101010100100110100101101110010101110011000011010110000101011111010110000011010111010110010010010010010010010101010010010010010010010101011001", + "101010001110000000100101001000110111010110000010000010001001110011111001010011100010011001010011111001001000110011111001010011111010001001010011111001010010100010100", + "110011111010000100000101011111111001111110111011010011111010001001001001001001111110101001001001001001011111101011000001101011000011111001101011000001101010111110010", + "101001011110110011110011100110110100100111101100011010000011100101001111100100001001001111100101001111110101000101001111100101001011110111100101001111100101000100011", + "100100110000100110111111000010010010000010011011100111110000101110101100000110001010101100000110101100001110100100100100100100100111111100100100100100100101000111111", + "001000011011101101001100010110011010111010011001011101101100011110010100111111010000010100111110010100101111011110010100111110010001000100111110010100111110111111001", + "100000101001011111011101011101100010100101101111100010001001010110010010010010110010010010010010010010011011110000011010110000011001001010110000011010110000001011001", + "010010001000000101000000100000000010010001111010010010110101010101111001010010111000111001010011111001000010010011111001010011111100100001010011111001010010001010101", + "000010111101001011010000111101111111101110010110101100011101000101000001101011100000100001101011000001100010101001001001001001001011010001001001001001001001010010010", + "011101000000110110010011100001000001100000001100110010110111000011001111100100001110101111100101001111110101000101001111100101001011111111100101001111100100110100010", + "011100111111101001101000110111010100010010100110111000111111100100100100100100000011000100100100100100101100100110101100000110101110011100000110101100000110100101111", + "110000000101101000101000111111101111111101100111000001011000111110010100111111010010010100111110010100101000011110010100111110010000101100111110010100111111111111000", + "011001100110010000001001110110100100110101101101010001000110011000011010110000111100011010110000011010111110010010010010010010010001001010010010010010010010010001001", + "100100010110000000100001111001110111010111111100110000000001101011111001010010111101111001010011111001000100110011111001010011111100101001010011111001010010010010100", + "110110110010000100000110000110111001111110101100111001010010000101001001001001101001001001001001001001000100101011000001101011000010010001101011000001101011010000010", + "101101011110110011110110010000110100100111011100100100000011100011001111100100001110001011100101001111110100100101001111100101001010010111100101001111100100111100011", + "101100110000100111111100110100010010000011111011000001110000111000101100000110001101001010000110101100001111000100100100100100100110111100100100100100100100111111111", + "001011011011101101101001011010011010111011010111101001101100001000010100111111010101110010111110010100101110011110010100111110010000100100111110010100111111101111001", + "101101101001011111011111100001100010100100010000001110001001010010010010010010110101110100010010010010011010010000011010110000011000101010110000011010110000010011001", + "101011001000000101100100110100000010010000001010101100110101010011111001010010111111111001010011111001000101110011111001010011111101000001010011111001010010010010101", + "110001111101001011110011001101111111101110110110001010011101000011000001101011100111000001101011000001100101001001001001001001001011010001001001001001001001001010010", + "000000000000110110010110001111000001110001001010000110110111011101001111100100001011001111100101001111110010000101001111100101001011111111100101001111100100100100010", + "101011111111101001101011001011010100000011000001010100111111101000110100100100000100100100100100100100101001000110101100000110101110011100000110101100000110100101111", + "000110000101101000101101001011101111101100000111111111011000111000001100111111010101010000111110010100101111111110010100111110010000101100111110010100111111110111000", + "101011111110010001001010011111100100111101001101110111111110001110000010110001111111111100110000011010111111110110010010010010010111111010010010010010010010111111001", + "010110001110000000000100111000110111010110111010000110001001100101100001010010100010011111010011111001011000110101111001010011111110001001010011111001010100100010100", + "110110101010000100000100101010111001101111001010110010101010001001001001001001101010101111001001001001001010101101000001101011000010101001101011000001101101101010010", + "011110001110110011010010001000110100110110111101011010001011100101001111100100100011001111100101001111111000100011001111100101001010001111100101001111100011100010011", + "011111111000100110011110101111110010011011011011000011111000101110101100000111111110101100000110101100001111100100100100100100100011111100100100100100100000111111111", + "011001011011101101001101000001111010101010010001100000011010000110010100111111000000010100111110010100111010111110010100111110010111010100111110010100111111011011001", + "011100100001011111011101111001000010110101110111100010110011011110000010010011001110010010010010010010010101010000011010110000011001111010110000011010110001011101001", + "101011011000000101000000110111000010000001101011110010111101010101100001010010100010111101000011111001010100110011111001010011111010011001010011111001010010100100101", + "110010100101011010010001010001111111100110010110110001011111010101011001101010010010100111110011000001101000001101001001001001001000101001001001001001001000011110010", + "100010000000110110110010010110100001100000001100101001000101010011010111100100011100101001111101001111100110000011001111100101001010001011100101001111100010010000010", + "011010110111101001101001001001110100000010100111010010000011100100100100100101111101000010111100100100100100100000101100000110101001001010000110101100000001110011111", + "000110010101100000001001001110101111101101100110010001010100111110010100111111001000010100111110010100111100111000010100111110010001110010111110010100111001001001000", + "101001111110001000101000010000100100101101101101111000000110011000011010110001001110011010110000011010110100110010010010010010010111110100010010010010010111000101001", + "110100010110000000100000100100010001000111111100011101110111101011111001010010101101111001010011111001010111010011111001010011111010111001010011111001010010100110100", + "000111111010000100000110110010011011101110101100111001101000000101011000001000010101001001001001001001001110001011000001101011000010100001101011000001101010011110010", + "011101001110110011110110010001110010110111011101001100001011100011010110000100010100001011110101001111100010000101001111100101001100101111100101001111100100010100011", + "011111101000110111111100100100010010001011111011001100110010111000110101100111111111001010011110101100000101100000110100100100100101000100100100100100100101110001111", + "111001011011101101101001001101111100111011010111110010011110001000001101011111000111110010100110010100111101011000001100111110010001010000111110010101011001001111001", + "101100100001011111011111101111000000110100010001100100110101010010010010010011001011110100001010010010010010010110000010110000011111111100110000011011010111000111001", + "101011011000001101100100100011000110000000001011111100111001010011111001010010100011111001010011111001010001010101100001010011111100011111010011111000110100100100101", + "110010100101010011110011001011111001110110110110100011011101000011000001101010010011000001101011000001101111101001001001001001001100101111001001001000001100011110010", + "000010000000110110010110010010100111110001001010101011000001011101001111100100011101001111100101001111100001100101001111100101001100001111100101001111100100010000010", + "101010110111101001101011011111110110000011000101010100000101101000110101100101111100100100100100100100100011100110101100000110101111001100000110101100000111110011111", + "000110010011101000101101001010101001101100000100010111010000111000001101011111001111010000101111010100111001011110010100111110010111110100111110010100111111001101000", + "101001111100000001001010010010100100111101001111111010000100001110000011010001001001111100101001111010110011010110000010010010010011110010010010010010010011000011001", + "010100010010000000000100100000010001010110111010011111110011100101100000110010101010011111001010011001010000110101100001010011111100111101000011111000110100100000100", + "110111111100000100000100111111111011101111001010111111111110001001001001001001111110101111010000101001001111101101011001101010100011111111110011000000001100111110010", + "011110001010111011010010001000110000110110111011001110001111100101001111100101100010001111100101001111111000100011010111100100101110001001111101001110000010100010011", + "011110101010111110011110101010110100011011011011001110101000101110101100000110101011001100000110101100011010100100100100100101000110101010111100100101100000101011111", + "011010001111101101001101001000111100101010010111110010001010000110010100111111100011110100111110010100101000111110010100111111010010001100111110010100111111100011001", + "011111111001011111011011111111100000110101110001100011111011011110000011010110111111110010010010010010011111110000011010110000011011111010110000011010110001111111001", + "101010010110000101000110100001100100000001101101111010000101010101100000110100011100111101000010111001001101110011111001010011111011001001010011111001010010110100101", + "110010100111011010010111011110111111100110010110100001010111010101011000001101001110100111110010100001101101001101011000001001001111110001001001001001001001101000010", + "100001000100110110110110011000100111100000001100101010000101010011010110000010101000101001111100101111111101000011010110000101001111110011110100010110000010000100010", + "011000110001101001101101000100010110000010100111010101110011100000100100100100101011000010111101000100100110100000110101100111001110111010011110110101100000000111111", + "000111011001100000001011001010001011101101100000010111101100111000010100111111110001010100111110010101000110011000001101011111110000100010100110001101011001011111000", + "101001101100001000101010000001100010101101101101111010001110011110011010110000010101111010110000011011010010010010010010010011110010101100001010000011010110110111001", + "110111011010000000100010101100010001000110011010011100110111101101111001010010011110011001010011111000101101110011111001010010111111000001010011111001010010110100100", + "000101101010000100000000101101111011101111001010111000011000000101011000001101000110101001001001001000001101001011000001101011000001010001101011000001101011101100010", + "011100000000110011110000010111010010110110111011001100110011100011010110000010101010001011110100001011111011000101001111100101001101111111100101001111100100000010011", + "011111111010110111111100110011010010001010011011001100111010111000110101100000100011001010011111001010000000100000110101100100100010011100100100100100100100000101111", + "111010010111101101101111000011111100111010110111110001011110001000001101011000110011110010100111110010100110011000001101011110010100101000101111001101011001011110101", + "101110111111011111011011110010100000110101010001100011000101010110010010010011111101110100001011110100010000010110000011001001111000001100101001100011010110110000101", + "101010001100001101100110100111100110000001001101111010000001010101111001010011111100111101010011111000101011110101100000101010011101001111001010000000110100110011001", + "110010110111010011110001011010111001110111110110100001010101000101000001101011101110100111101011000000001001001001001001010000101001110111010000111000001101101101010", + "000001001100110110010100011010100111110001101100101010000001010011001111100100001000101001100101001110011011000101001111110100001001110111100101001111100100000010010", + "101000100111101001001101000000010110000011100111010101110101100000110101100000101011000010100100100101100000100110101100000110101100111100000110101100000110000001111", + "000111011011101000101011001100001001101100100000010111101000100000001101011001110001010000101111010000100000011110010100111110010110100100111110010100111111011001000", + "101001101100000000001010000101100100111100101101111010001100000110000011010110010101111100101001111100110110010110000011010110010100101010010010010010010010110011001", + "010111011010000001100010101110010001010111011010011100110011100101100000110101011110011111001010011111001101110101100000110101111001000101000100100110110100110011000", + "010010100100000101000000101001111011101110001010111000011110010101011001001000100110101111010000101111001101001101011000010100100011010111110100111100001101101011110", + "100100011010111011010000010001010000110111111011001100110111100011010111100101001010001011100101010110011011000011010110011010101011111001111010110000000010000101111", + "110011111010111111111100101111110100011010011011001111111000110000110100000111111111001010000110110101101111100000100100111101000111111010111001010011100000111110111", + "000000001111101101101111011000101100100010110111110010001010001000001100111111100011110010111110001101001000111000010100101111010010001100111110010100111000100011001", + "111111101001011110011011101010111000111101010001100010101011001110000011010110101011110100010010000011011010110110011010110000011110101010110000011010110110101011001", + "100000101110000101100110101000101100011001001101111110001101010101100000110100100010111101000010111101011000110101111001010011111110001001010011111001010000100010101", + "101110100111011010010001001111111111101111110110100011111111011101011000001101111110100111110010100111101111101101011000001101001011111001001001001001001011111110010", + "101110101100110110110100010001101111111001101100101000001101010011010110000011010100101001111100101001110110000011010110000011001110101011110010010010000011010111110", + "101110101000001000101101000100000110001011100111010000110011111000110100100100111111000010111101000010110101100000110011111001001011000010011001010011100000110100000", + "100000100001100000001011010011100011100100100000010000011100111000001100111110000111010000101110001101001101011000001011000001110011010010100001101011011000001100101", + "111111101100001001001010010101000010101100101101111010111010000110000010101001101011111100101000000011000011010110010100001011110101111100001111100101010110000010000" + ], + "1": [ + "111111101110100011001101001010011101100000110101111000111000110101100000110100110010011111001010000000110000100010111101000010111101100101000010111101000101101111111", + "100000100001111001000001101001000101011000001101000000100000001101011000001100001000101111010000111000001000010010100111110010100101011111110010100111110010101000001", + "101110101000010010100110010010110011010110000011001110101110000011010110000010000100001010010011010110000110011100101001111100101011010001111100101001111100001011101", + "101110101100000101010010111111001000110101100000100101000101100000110101100001100111001011111000110101100011111101000010111101000000110010111101000010111001001011101", + "101110101011000110010100011111110000001101011000001111111101011000001101011001111111110011000000001101011111101111010000101111010011111100111111010000101110101011101", + "100000100010110011011011111000111110000011010110000010001011010110000011010110100011110101001110000011011000101001111100101001111010001010110001111100101000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000011001001101010001000101000001101011000001010001101011000001101011001100011010000101001001001001000100111110010100111110010001100111111110010100110100000000", + "111100101010110010100010011111111110000011010110000011111011010110000011010111111111111100101111100101011111101011110100001011110111111010010011110100001010110011101", + "101111001110110011000101000010011101100000110011111000111000110101100000110100110010011111001100000110110110100010111101000010111100111001000010111101000011000001010", + "100000111011111000010001110001000101011000001011000000100001001101011000001100001000101111010100111110001110010010100111110010100100100001110010100111110011011001101", + "111000011110010010000000011010110011010110000101001110101111100011010110000010000100010010010010010110000010011100101001111100101010101111111100101001111101110111100", + "000101111010000100010100100111001000110101100100100101000100000000110101100001100111010011111001010101100101111101000010111101000001000100111101000010111100010100100", + "000010000011000111001000001111110000001101011000010101010100111000001101011000111111101011000001101101011101001111010000101111010000010100111110010000101110101101011", + "111011100000110011001011101010011110000011010110011011111011010110000011010110110011100101001111100011010011001001111100101000011110011010110000011100101000000011010", + "001110011110100100010111101100010101100000110101111000011000110101100000110101010010111100100100100100110000101010011111001011111101111001010011111111001011000000110", + "101000111111101000111000101010100101011000001101001000101000001101011000001101001010100110010100111110001110010000101111010001001101001001001001001111010001111000001", + "011001010000000100010011010100111011010111100101001110001110000011010110000010000100101000011010110000010000010100001011110101001010001111100100001011110101110111100", + "001101101110010101111101111100110000110100000110101101001100100100110101100001100101000011111001010011111011111111001010011111001001001100000111001010011110110100000", + "100011000101001001111011100001111000001100111110010101110100111110001101011001011111001001001001001001000001000111110010100111110001110100111111110010100110101100111", + "110011111100110011100011110001101110000010010010010011110010110000000011010111010001100101001111100101001101001011110100001011110111110010010011110100001010100010010", + "101111011110111010100101100010011101100000110011111000111001010011100000110101010010000110101100000110110110100010111101000010111100111001010011111001000011000001110", + "100000110011110000010000010001011101011000001011000000100001001101011000001101101000111110010100111110001110010010100111101011000100100001101011000001110011011000101", + "111000000000010010100000111010111011010110000101001110101111100011010110000011100010010010010010010010000010011100101001100101001010101111100101001111111101110001000", + "000101111010010101010101000111001000110101100100100101000100000000110101100000100001010011111001010011100011111101000010100100100001000100100100100100111100010001000", + "000010001011011111001000001001100000010100111110010101010100111000001101011000111001101011000001101011001011001111010000111110010001010100111110010000101110101100111", + "111011111010101011001011001111100110011010110000011011111010010010010011010111111111100101001111100101001111101001111100101000011011111010110000011100101000111110110", + "001110001100100100010110011000110101111001010011111110001001010011111000110100100010100100100100100100111000101010011111001011111010001001010011111111001010100011010", + "100010101101111000111000111010110101001001001001001110101001101011000000001100101010111110010100111110001010110000101111010001001010101001001001001111010000101011001", + "010010001000000100010011011000101011010111100101001010001111100101001110000011100010110000011010110000001000110100001011110101001010001111100101001111100101100011100", + "000111111110011101111101101111110000110100000110101111111100100100110101100000111111010011111001010011111111111111001100000110101111111100000110101100000110111110000", + "101000010111001001111011101001000000001100111110010010100100111110001101011000001101001001001001001001011110000111110100111110010010100100111110010100111110111000111", + "110000111000100011100011100100111110000010010010010010101010110000000011010111100101100101001111100101011010001111110010010010010010101010010010010010010011010110010", + "100101001110110010100101111001010011111001010011111111000001010011100000110101100110000110101100000110110011100100111001010011111111000001010011111001000010010101010", + "100110110011110000010000001011110011000001101011000001010001001001001001001101111110111110010100111110010011010100100111101011000001010001101011000001110010001101101", + "110011001100010010100000110010010101001111100101001000011111100101001111100011010010010010010010010010000101011010101001100101001001111111100101001111111101100011100", + "001110110110010101010101010010011100100100100100100101111100000110101100011001010101010011111001010011101100111101000010100100100100011100100100100100111101100100100", + "000100010011011111001000010000111000010100111110010011001100111110010100100000001101101011000001101011011110001111010000111110010010101100111110010100111111111110111", + "111101110000101011001011010110101110011010110000011011001010010010010011001110100011100101001111100101001000001000011010110000011010001010110000011010110001010000110", + "001001011010100100010110000000100101111001010011111111001001010011111000100101100000100100100100100100110011101011111001010011111111001001010011111001010011010011010", + "101011110011111000111000111011110101001001001001001001110001101011000000001100111000111110010100111110000001010101011001001001001001110001001001001001001000001101001", + "010011000000000100010011001101100101001111100101001001110111100101001110000011010110110000011010110000000101010011010111100101001001110111100101001111100011000011100", + "001011110110011101111101100110011110101100000110101100111100100100100100100100010101010011111001010011111110111001010100000110101100111100000110101100000000000000000", + "101000010111001001111011101001001110010100111110010011000100111110010100111110001101001001001001001001011110000001101100111110010010100100111110010100111001011000111", + "111000101000100011100011100100101010010010010010010011001010110000011100101001100011100101001111100101011010001111110010010010010010101010010010010010010110010010010", + "101001010110110010100101111101010010111001010011111110100001010011111111001011100000000110101100000110110011100100111001010011111111000001010011111001010010010011010", + "100110111011110000010000001101110010100001101011000000010001001001001111010101111000111110010100111110010011001101000001101011000001010001101011000001101010001011101", + "111111001100010010100000110110010100101111100101001000011111100101001011110011010110010010010010010010000101000011001111100101001001111111100101001111100101100101100", + "000010111110010101010101010110011101000100100100100101111100000110101100011001010101010011111001010011101100100000110101100100100100011100100100100100100101000100100", + "000000011011011111001000000110111000010100111110010011001100111110010100100000001101101011000001101011011110011000001101011110010010101100111110010101011001011110111", + "111101100000101011001011011000101110011010110000011011001010010010010010001010100011100101001111100101001000001110000011010000011010001010110000011011010110110000110", + "001001011010100100010110011000100101111001010011111110101001010011111001000011100000100100100100100100110011101101100000110011111111001001010011111000110100110011010", + "101111111011111000111000111111110101001001001001001011111001101010100111110010111110111110010100111110001111110101011001001001001011111001001001001000001101111111001", + "011010001000000100010011011000100100001011100101001010001111100100101001111101100010110000011010110000001000110011010111100101001010001111100101001111100010100011100", + "111010101110011101111101101010111111001010000110101110101100100101000010111100101011010011111001010011111010100000110100000110101010101100000110101100000000101010000", + "010110001111001001111011111000101111110010111110010110001100111111010000101110100011001001001001001001001000111000001100111110010010001100111110010100111000100010111", + "110111111000000011100011101111101011110100010010010011111010110000011100101001111111100101001111100101001111110110000011010110010011111010010010010010010011111110010", + "101110011111010010100101101000010100111001010011111101111001010011111111001010110100000110101100000110111100110101100000110101111000011001010011100000110100000101010", + "100100111011110000010000011110110100100001101011000101001001001001001111010000101100111110010100111110001110001101011000001101000000101001101011011000001100111111101", + "011101000101110010100000100000110010101111100101001011001111100101001011110100100011010010010010010010001000000011010110000011001110001111100101010110000011010001100", + "000001111110110101010101010000111001000100100100100000101100011111001010011111000000110011111001010011101011100000110101100100100101001100100100110101100000110010100", + "110011010010011111001000011101111101010000101110010000010100100111110010100111011000001011000001101011010001011000001101011110010101110100111110010101011000001000111", + "001111100000001011001011001101101111111100101000011110010010001011110100001011110110000101001111100101010101010110000011010000011011110010110000011011010110000100110", + "111011010010100100010110000110000000011111001011111101111001000010111101000010010100100100100100100101011110110101100000110011111000111001010011111000110101100111010", + "101100110010011010111000110101010010101111010001001101000001101010100111110010101100111110010100111111100110001101011000001101011000100001001001001000001101011111001", + "011000001001100010010011011110100010001011100101001011001111100100101001111100000010110000011010110001101010000011010110000011010110101111100011010110000011010011100", + "001001110111011011111101110011011101001010000110101000110100100101000010111101000001010011111001010010100011100000110101100000110101000100000000110101100000110010000", + "000110011110001111111011111011101111110010111110010000001100111111010000101111111000001101001001001001010011011000001101011000001101010100111000001101011000001010111", + "110111101000000001100011110111001001110100010010010110000100101001111100101001110110000011001111100101011101010110000011010110010011111010010110000011010110000100010", + "011110011111110110100101110001010100111101000010111101100111001010011111001010110101100000101100000110111100110101100000110101111000011001010011100000110101100101010", + "000100111011010100010100011111010000100111110010100101001111010000101111010000101101011000010100111110001110001101011000001101000000101001101011011000001101011111101", + "011101000100010100100000111001010100101001111100101011001011110100001011110100100011010010010010001011101000000011010110000011001110001111100101010110000011010001100", + "100001111111110111010001000000111111000010111101000000101100011111001010011111000000110011111001001010001011100000110101100000110101001100100100110101100000110010100", + "010011010010111001010100001101111001010000101110010000010100100111110010100111011000001011000001110010110001011000001101011000001101110101011000001101011000010000111", + "011111100001101111010111000100001011111100101000011110000010001011110100001011110110000101001111110100010101010110000011010110000011110011010110000011010110011100110", + "011011010011100110011110001110000010011111001011111101100001000010111101000010010101100000110100100101011110110101100000110101100000111000110101100000110101111111010", + "011100110010111010111010101100010010101111010001001101011111110010100111110010101101011000001100111111100110001101011000001101011000100000001101011000001101001111001", + "111001001000000000010101010111100010001011110100001011010001111100101001111100000011010110000010110001101010000011010110000011010110101111100011010110000011010011110", + "101011111111011001100001101111111101001010011111001011111010111101000010111101111110110101100001010010101111100000110101100000110111111100000000110101100000111110000", + "110110001111101111000011111000101111110010100111110010001000101111010000101110100010001101001111010000101000111000001101011000001010001100111000001101011001100010101", + "000110101001100001000110001010101001110100001011110010101100101001111100101001101010000011001001111100101010110110000011010110000010101010010110000011010111101010010", + "001110001110110100100000101000110100111101000010111110001111001010011111001010100011100000101010011111011000110101100000110101100010001100110101100000110100100011010", + "000111111010110100001100001111110000100111110010100111111111010000101111010000111111011000010000101111001111101101011000001101011111111110001101011000001101111111101", + "101110000100110001111000110100010100101001111100101010000011110100001011110100110111010110000011001011101101000011010110000011010101110000000011010110000010100101100", + "110000110111010011110111000111111111000010111101000111100010011111001010011111110100110101100000101010010110100000110101100000110000111011100000110101100000100110100", + "100010010011011011001110010101011001010000101111001001011010100111110010100110101100001101011000010010100110011000001101011000001010100101011000001101011001111110101", + "011100101001110001010001110110101011111100101001100011010100001011110100001011010010000011010110010100000010010110000011010110000010101011010110000011010110001010101", + "011001010010011000101000000010100010011111001010000110110101000010111101000010011001100001010010111101011011110101100000110101100101000000110101100000110100001011001", + "011101111010110110011101101011110010101111010000111100001111110010100111110010000001011001101010100111111011001101011000001101011011010000001101011000001101010011010", + "111011001000001000010000101110000010001011110100001100000001111100101001111101101111010111100100101001111101000011010110000011010011111010010011010110000010110101100", + "101011111111000111100011100000011101001010011111001011100010111101000010111101110100110100100101000010110100100000110101100000110010011011111000110101100000111100000", + "110101011111111100100000101111001111110010100111110001011000101111010000101111101100001101011110010100110110011000001101011000001110101011000000001101011001100110111", + "000110100001110101011011110000001001110100001011110001010100101001111100101001000010000011010000011010100000010110000011010110000110001101001110000011010110000000010", + "001111011110111110110111111001110100111101000100100100110111001010011111001011000001100000110011111001001010110101100000110101100111001100110101100000110100001010100", + "000111110010101010001110101100110000100111110100111000001110010000101111010000001001011000001001001001011000101101011000001101011101110110001101011000001101010000010", + "101111000110101111110010110101110100101001111010110000000010010100001011110100101111001111100101001011101100100011010110000011010101110000000011010110000010111100011", + "110000110001011011001100000110111111000010111001010001100011111111001010011111101100101100000110101010010111000000110101100000110000111011100000110101100000111111111", + "100000010011010011011011110100001001010000101111001111011011000111110010100110110100010100111110010010100110011000001101011000001010100001001001001101011001101110101", + "011110101101110000110101010111110011111100101001100111010100001011110100001011010010010010010010010100000010010110000011010111100110101101001111100011010110001010101", + "011011010100010001100101000011010010011111001010000110110101000010111101000010011001100001010011111001011011110101100000110100000011000110101100000000110100001011001", + "011111111010101111100001101011000010101111010000111100001111110010100111110010000001011001101011000001111011001101011000001100111101001110010100111000001101010011010", + "111010001010001000100000001111001010001010010010010100000001111100101001111101101111010111100101001111111100000011010110000010010001100010010011010110000010110100010", + "101001111111011110000011100001010101001011111001010001100011111001000010111101100100110100100100100100110101000000110101100000110000000011111000110101100000111101111", + "110111011101101100001001001110111111110011000001101011011001001001010000101111110100010100111110010100110111111000001101011000001110111011000000001101011001100111000", + "000111111111100100111010111111101001110101001111100111111101001111111100101000111110011010110000011010101111110110000011010110000011111101001110000011010110111111001", + "001110001110101110010110101000101100111101000100100110001110101100011111001010100011111001010011111001001000110101100000110101100010001100100100100100110100100010100", + "000110101110111011101110011010100000100111110100111110101110010000101111010001101011001001001001001001001010101101011000010100111110101110010100111110001101101010110", + "101110001010100111010010001000110100101001111010110110001010010100001011110100100011001111100101001111101000100011010110011010110010001000011010110000000011100011011", + "110011111111011010001100001111110111000010111001010011111011111111001010011111111110101100000110101100011111100000110101111001010111111011111001010011100000111110011", + "100010011001000011111011001011010001001001001001001000001011000111110010100111000000010100111110010100100010111000001101001001001111010001001001001101011001010011001", + "011111101011100000110101010111000011100101001111100100000101001111100100001011001110010010010010010010001100010110000011010111100001111101001111100011010111010101001", + "011001011100010001100100110001010010000110101100000111100100100100100101000011000101111001010011111001010101010101100000110100000010011110101100000000110100111100101", + "010011111000110111100001100110110010111110010100111111011110010100111111110011110101000001101011000001101001101101011000001100111000101110010100111000001100000110010", + "111001000110011000100000010000011010001010010010010011010000011010110001111101111011001111100101001111100111100011010110000010010101010010010010010010010010001000010", + "100101111001010110000011100001101101001011111001010010110011111001000010111100111000100100100100100100100100100000110011111001010110110011111001010011111001100011111", + "110100010001111100001001011100101111110011000001101010001001001001010000101111001000010100111110010100101100111000001011000001101110001011000001101011000001010001000", + "001100100101101100111010111101100001110101001111100100000101001111111100101001001110011010110000011010101100110010000101001111100010000101001111100101001111011101001", + "000111010110101110010110100110101100100100100100100101100110101100011111001010101101111001010011111001001111010011100100100100100010100100100100100100110100111110100", + "001100110100111011101110001100000000111110010100111111011110010100111110010000010101001001001001001001010111001011011000010100111010111110010100111110001100001110010", + "100111001010100111010010000111101100110000011010110001010010010010010010010100010011001111100101001111100011100101010110011010110100110000011010110000000010001010011", + "110010110011011010001100001011000111010011111001010010110011111001010011100111111000101100000110101100000100000000110101111001010101010011111001010011100001101011111", + "100110001011000011111011001011000001001001001001001000001011000001101011011111000000010100111110010100111100111000001101001001001110001001001001001001001001010011001", + "010011100111100000110101010111011011100101001111100100000101001111100100010011001110010010010010010010010010010111100101001111100000000101001111100101001111010101001", + "010001000100010001100100110001011010000110101100000111100100100100100101010010100101111001010011111001010001010100000110101100000011100110101100000110101100111100101", + "010111110110110111100001100110101010111110010100111111011110010100111111110010010101000001101011000001101001101000101110010100111001011110010100111110010100000110010", + "110001000000011000100000010000011010010010010010010011010000011010110001111100011011001111100101001111100111100100001010010010010101010010010010010010010100001000010", + "100001100001010110000011100001101101010011111001010010110011111001010011111001111000100100100100100100100100100110101011111001010110110011111001010011111111100011111", + "111100010001111100001001011100110111101011000001101010001001001001001001001001001110010100111110010100111100111110010011000001101110001011000001101011000111010011000", + "000100101101101100111010111101110001100101001111100100000101001111100011010111001000011010110000011010110010110010000101001111100010000101001111100101001011011111001", + "001011001110101110010110100100101001100100100100100101100110101100000000110100101011111001010011111001010001010011100100100100100011100100100100100100100100111100100", + "001011111100111011101110001111100111011110010100111111111110010100111000001001111111001001001001001001001111110010111110010100111111111110010100111110010100111110010", + "100110001010100111010010011000101111010000011010110110001010010010010110000101100011001111100101001111111000111100110000011010110010001000011010110000011010100010011", + "110010101011011010001100001010100000110011111001010110101011111001010011100110101010101100000110101100011010111101000010111001010010101011111001010011111000101011111", + "100110001011000011111011011000100101001001001001001110001011000001101011011111100010010100111110010100101000101111010000101001001110001001001001001000101111100011001", + "011011111111100000110101001111111101100101001111100111111101001111100101010110111110010010010010010010011111110001111100101111100011111101001111100100101000111111001", + "010001010100010001100100100101111000000110101100000000110100100100100100110100011101111001010011111001001100110010011111001100000000110110101100000111001011000110101", + "011100101110110111100001101110101110111110010100111010001110010101011000001101001001000001101011000001101100101000101110010100111110001110010100111111010001010000010", + "111100001000011000100000010001111111010110010010010110000000011011010110000010101111001111100101001111111010100100001010010010010110000010010010010010010101111100010", + "111111110001010110000011111110101010110101111001010011100011111000110101100000101100100100100100100100100001011111001011111001010111100011111001010011111111011111111", + "111100001001111100001001001110010100001101000001101100111001001000001101011001110100010100111110010100100001000111110011000001101101011011000001101011000111001111000", + "110111101101001100111010110011110110000011001111100000110101001111100011010110010100011010110000011010110111101011110100001011100101010101001111100101001010101111001", + "101010011111101110010110100011001001100100100100100001010110101100000000110100011111111001010011111001001100000010111101000010100000110100100100111101000010101100100", + "100010100100011011101110010111000111011110010100111111001110010100111000001101000111001001001001001001001100110010100111110010111010001110010100100111110011010100010", + "010111000010100111010010000001001111010000011010110110000010010010010110000010101010001111100101001111111010011100101001111100110110000000011010101001111100110010011", + "110001101011111010001100011101000010110011111001010111100011100000110101100000100011001100000110101100000001011101000010111001010011100011111001000010111101111101111", + "000111010010100011111011010010100110001101011001001101011011011000001101011001110011110100111110010100100001101111010000101001001101011001001001001000101110100111001", + "001001110111100000110101010000011110000011010111100101010101010110000011010110011101110010010010010010010111101001111100101111100001010101001111100100101001101001001", + "010001010101010001100100110011111101100000110100000001010100110101100000110100011101111001010011111000101100101010011111001100000000110110101100000111001010100010101", + "101100100111010101100001111000101011011000001100111011101110010101011000001101001111000001101011000000001100110000101111010000101110001110010100111111010001110100010", + "011100001001011000100000001101111011010110010010010111100000011011010110000010101001001111100101001110011010110100001011110100001110000010010100001011110100011010010", + "001111100001110010000011111010101010110101111001010010100011111000110101100000101010100100100100100101100001011111001010011111001111100011111111001010011110111001111", + "001100011001111000001001011010010010001101000001101100111001001000001101011001110001010000111110010100100001000111110010100111110101011011000111110010100111101001000", + "000111111101001110111010101011110000000011001111100000110011010110000011010110010101111100110000011010110111101011110100001011100101010101001011110100001011001111001", + "101010011111001100010110111111001101100000110101100001010000110101100000110100011110011111010011111001001100000010111101000010100000110100100100111101000011001100100", + "010010101100111111101000001111000111011000001101011111001000001101011000001101000110101111001001001001001100110010100111110010111010001110010100100111110010010100010", + "100100000011100101010100000101001001010110000011010111100110000011010110000010101010001111100101010110011010011100101001111100110110000000011010101001111100110010011", + "110011101010111010010000001111100110110101100000110111111011100000110101100000111111001100000110110101101111111101000010111101000011111011111001000010111101111111111", + "000000001010000101110111011000100000001101011001001110001011011000001101011001100011110100111110001101001000101111010000101111010110001000101111010000101111100011001", + "111111100111000010111001001010111100000011010111100110101101010110000011010111101011110010010010000011011010101001111100101001111010101100101001111100101001101011001", + "100000100100010011111110111000111111100000110100000110001100110101100000110100100010111101000011111000111000101010011111001010011010001111001010011111001011100010101", + "101110100111110101111101111111101011011000001100111111111000001101011000001101111110100111110011000000001111110000101111010000101111111111010000101111010000111110010", + "101110101001111010100110011111111011010110000011010100110110000011010110000011010100101001111101001110010111110100001011110100001011010010010100001011110100001110010", + "101110101001110011001101110101001010110101100000110101010101100000110101100000111111000010111100100101110100011111001010011111001010110011111111001010011111001101100", + "100000101000011111000111001111010010001101011000001111001101011000001101011000000111010000111000001101001100100111110010100111110010001011000111110010100111110101001", + "111111101100101101001111101101010000000011010110000001100011010110000011010110001011111100110110000011000010001011110100001011110100000101001011110100001011110011000" + ], + "2": [ + "111111100001111001000101111001101111001110011110001000100111010110000011110010101110011101101001100110010101010101100101010100111011111100100011111100110101101111111", + "100000100111100110110011111111010110110010001010011111000011010100100110011110111100000100101011010100010010101101011111101100100011000110010011000110001010101000001", + "101110100001110100010101001111110101111100000010101111110110000100101111101111100110001101001010100101100100100011010001100010101101001000011101001000000100001011101", + "101110100001100111001110110010010010001111001110011001010010001000101001011001010101110001010001101101101010100000110010100001000100100011111100100011100001001011101", + "101110101100011001110100011111100010100011110011111111111010111011101110011111111111111100000100001011111111111000001000111001010011111000111001110001011110101011101", + "100000100100111000010010101000101101101001010000000110001011001111111101000101100011101100110000001111011000110110000100110111111010001100110111011101010000101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001010101110110010001000101110100111011101110110001001111111110100110101100010011011110001111110111000111000001010111001110010001010111001110011011110100000000", + "001100111111010100001100001111100100111001111000100111111100111110011111101111111110110100100111011011001111110110000100010111110111111100010111110101010010111010000", + "011100000001110001000011111001101111001110011110001001111111010110000011110011111000011101001001100110010101010101100101010100111100111000100011111100110011000001000", + "011001101111100110110101111111010110110010001010011011010011010100100110011111110100000101001011010100000010101101011111101100100100100000010011000110001011011001110", + "010110010001110100010111001111110101111100000010101110110110000100101111101000001110001100101010100101100100100011010001100010101100101110011101001000000101110111111", + "001000100001100111001000110010010010001111001110011010100010001000101001011011000101110000010001101101111010100000110010100001000111000101111100100011100100010100111", + "110001001100011001110110010100000010100011110011111101001010111011101110011000100101111101100100001011111000111000001000111001010110010000111000010001011110101100101", + "000010110100111000010010100100001101101001010000000110011011101111111101000011100111101101110000001111011001110110000100110111111010011100110110011101010000000010101", + "100000000111000011011111111001000011001010110000011011000100010010011001011101110001110110011100010011010010010101100111010100011101111111010101111110110011000001001", + "100101101100001111010111011111111111100010100011111110111111100101000100110110011001101111111100000000010111001101011111001100101101001111001101001110001001111001010", + "101010010111000111110101001111011001111000101000111111001000100000110101000101001110101011111111010000100011100011010011100010001010001110010101001010000101110111110", + "110100100010001011011000010010011011011111100111110110111110111001001011110010011001101000100110111001101111000000110010000001001001001101111110101011100110110100011", + "001101001010101111001100010101101110100111011001110101101100111111110100110011010101010111110001111110111111111000001010111001110001110101000110010011011110101100100", + "111110110111010001111110000100100100111001111000101100010101111110011111101101110011000110100111011011001100010110000100010111100111110011001010010101010010100010001", + "011100000001110100011011111001101111001110011100010000100111110110000011110101001000010000001001100110010101010101100101010100100101111101010101111100110011000001000", + "011001101111100011001001111110010110110010001011011101000001010100100110011000111100110110101011010100000010101100111111101100111101000111101101000110001011011001110", + "010110010001110101101001001111010101111100000100101101110011100100101111101011000111000000101010100101100100100010110001100010110011001001100011001000000101110111111", + "001000100001100010111010110011010010001111001010010011010011001000101001011011110100000010010001101101111010100001010010100001000000100010100000100011100100010100111", + "110001001100011100101110010100000010100011110001100100010010011011101110011110110101110000100100001011111000111001001000111001010001010101001110010001011110101100101", + "000011111100111101101110111111101101101001010001000011111000001111111101000100111111011110010000001111011111110110000100110111111011111011001000011101010000111110101", + "100010001111000010100001111000100011001010110010011010001001010010011001011111100010111010011100010011011000110101100111010100011010001000101011111110110010100011001", + "100110101100001010100101011010111111100010100111110010101110100101000100110111101010011101111100000000011010101001011111001100111010101000010001001110001000101011010", + "101010001111000010101101001000111001111000110010100110001001000000110101000010100010100110111111010000111000100101010011100010010010001011100011001010000101100011110", + "110111111010001110100100001111111011011111101110110011111100111001001011110100111111011011000110111001111111100111010010000001010111111010000000101011100110111110011", + "001101001010101110110010010111101110100111011111110011010000111111110100110000110100011011110001111110110010111111101010111001101010100010111000010011011110111000100", + "111110110111010100001100011111000100111001100100100010110101100110011111101100101110110100100111011011010100110011100100010111110010101100010110010101010011010110001", + "011100000001110001000011111011101111001110011100001110100111100110000011110010000100011101001001100110011010110010100101010100111111000000100011111100110010010101000", + "011001101111100110110101100100010110110010010010011111001011011100100110011111000100000101001011010100000000101011011111101100100000010000010011000110001010001101110", + "010110010001110100010111001101010101111100011100101110011111100100101111101001100110001100101010100101101001100101010001100010101000011110011101001000000101100011111", + "001000100001100111001000101001110010001111010010011001000011010000101001011010010001110000010001101101100010000100110010100001010101111101111100100011100101100000111", + "110001001100011001110110010110100010100011101001111110111010000011101110011001111001111101100100001011110111011110001000111001001011001000111000010001011111111000101", + "000010110100111000010010101111001101101001011000000101011010000111111101000010001111101101110000001111011011110001100100110111100010001100110110011101010001010110101", + "100000000111000011011111111010000011001010110010011000100101010010011001011101011001110110011100010011011111010010000111010100000111001111010101111110110011010101001", + "100101101100001111010111001100011111100010111111111101110110110101000100110111110101101111111100000000001111101000111111001100101001110111001101001110001000001101010", + "101010010111000111110101010101011001111000101010111100000001001000110101000100110010101011111111010000101100000100010011100010001001110110010101010010000100100011110", + "110100100010001011011000011001111011011111111111110010111110101001001011110010101001101000100110111001101101000110110010000001001101111101111110110011100111100000011", + "001101001010101111001100000110001110100111000111110101011100101111110100110010111101010001110001111110110010111110001010111001110011000101000110011011011110111000100", + "111110110111010001110110000111000100111001100100101111111101100110011111101100100111000010100111011011000100110010000100010111100011001011001010011101010011010110001", + "011100000001110100000011100011001111001110000100010011010111101110000011110100010100010000001001100110011010110011100101010100100110100100110101111100110010010101000", + "011001101111100011011001111100010110110010000011011110010001011100100110011001010100110000101011010100010000101010111111101100111001010110001101000110001010001101110", + "010110010001110101111001010100110101111100000100101110000011100100101111101011101111000010101010100101110001100100110001100010110001111000000011001000000101100011111", + "000100100000000010110010111001110010001111010010010000001011011000101001011010011000000000010001101101101010000101010010100001000100011011100000100011100101100000111", + "110001001101111100111110000110000010100011110001100111011010010011101110011111101001110000100100001011110111011111001000111001010010101101001110001001011111111000101", + "001010110101011101011110101111001101101001001001000100001000011111111101000100011111011110010000001111011011110000000100110111111011001011001000000101010001010110101", + "100000000111000010001001101011100011001010101010011000110001000010011001011111010000100100011100010011011111010011100111010100011110101000101011100110110011010101001", + "100111111100001010111101001111111111100010111111110111111110111101000100110110111110000101111000000000011111101001011111001100111011111000010001011110001000111111010", + "100010001111100010100101001000111001111000110010100010001001011000110101000010100010111010111011010000111000100101010011100010010010001010011011001010000100100011110", + "110110101011001111101100001010111011011111101110110010101100110001001011110101101011010001000100111001111010100111010010000001010010101011110000101011100110101010011", + "001010001011001111100010001000101110100111011111110110001000111111110100110001100010001001110111111110111000111111101010111001101010001011000000010011011110100010100", + "110011111110110101100100011111100100111001100100100111111101101110011111101100111110111110100001011011001111110011100100010111110011111101001110010101010011111110001", + "011100000000010000010011101001101111001110011100001011001111111110000011110011110000001101001111100110010011010010100101010100111001111000100011100100110010000001000", + "010001101110000110000101111110110110110010010010011010111011000100100110111110111000011101001101010100001110101011011111101100100001001000010011011110001010111001110", + "010110010001110100111111001111010101111100011100101001001111110100101111101001001110010010101010100101101010000101010001100010101110001110011101010000000100010111111", + "001000100001100111010000110010010010001111010010011010110011010000101000111010111001101000010011101101110111000100110010100001010101001101111100110011100101010100111", + "111001001100111001111110010100000110100011101001111111100010000011101110111000010101100001100010001011110110111110001000111001001101110001001000010001011111101100101", + "000010110101111001011010110101001101101001011000000000000010000111111100000011110011100111110000001111001100110001100100110111100011110101001110011101010001100010101", + "100100000110100010001111101001100001001010110010011110111101010010011000011101101001100100011010010011001101010010000111010100000001111110101101111110110011100001001", + "101001101101101110111111001110011001100010111111111111011110110101000100010111011101100101111010000000010010101000111111001100101001000110010101001110001001011001010", + "101010010110100110100101011111011111111000101010111101111001001000110100100101000110111011111001010000100101100100010011100010001111001110010101010010000101010111110", + "111100100011101011101000010011011111011111111111110111010110101001001011010011010101110000100000111001100011000110110010000001001100100101111110110011100110110100011", + "001101001010101111100100010100001000100111000111110010010100101111110100110010010101001001110001111110110001011110001010111001110101010101000110001011011111001100100", + "111110110111010001100110000100100000111001100100101100000101100110011110001100001111011110100101011011000001110010000100010011100011111011001010000101010011100010001", + "010100000001010100010011111001101101001110000100001010001111101110000011010101111000001100001111100110011011010011100101010010100000011100100101111100110010000001010", + "011001101110100010000001101110010000110010000011001011011001011100100111011000101000111100101011010100010111101010111001101010111000101110010101000110001010111001101", + "010010010000010100111001011111010111111100000100111000001011100100101110101011011111010010101100100101111011100100110111100100110111001000011011001000000101010111100", + "000100100000000011010010100011110000001111010010000010110011011000101001111010110000001000010111101101111111000101010100100001000100101011111000100011100100110100100", + "110001011101111101111110000100000100100011110000100110100010010011101111111110011101100000100010001011111110111111001100111001010100010101001110001001011110001100101", + "001010111101011101011110100101101001101001001000110001100000011111111101100101100011000110010110001111010101110000000100110111111010010011001000000101010000000010101", + "100000011111000010001001111001100101001010101010101111111001000010011001011111111000100100011100010011011100110011100111010100011000111000101011100110110010100001001", + "100101111100001010111101011111111011100010111110001111011110111101000101010111010100000101111110000000011010101001011111001000111000100000010001011110001000111001010", + "100010010111100010100101001111011011111000110010011100111001011000110101100011001110111010111001010000101101100101010011100100010110101010010011001010000100110111100", + "110111111011001111101100001111111101011011101110000111111100110001001010110101111111010001000110111001111111100111010100000111010111111011111000101011100111111110000", + "001010001011001111100010001000101100100111011111000110001000111111110101110000100010001001110111111110111000111111101100111111101010001011000000010011011110100010111", + "110010101110110101100100001010100110111001100100110010101001101110011111001100101010111110100001011011011010110011100010010111110010101101001110010101010011101010010", + "011110001000010000010011101000101001001000011100101010001001111111100010010011100010001101001111100110011000110010100001010100111010001000100011100100110010100011000", + "010011111110000110000101101111110010110000010011101111111111000101100110111111111110011101001101010100011111101011011111101100100011111000010011011110001011111111110", + "010110010001110100111111000101010011111010011100011100000111110100101111101000010010010010101010100101101100100101010001100010101011110110011101010000000100100011111", + "001000101001100111010000100001110110001001010010000000111111010000001000111011001001101000010011101101100101000100110010100101010111111101111100110011100100100000111", + "111001011100111001111110010110000000100011101001000101111100000010001110111001111101100001100010001011100010111110001000111111001001000001001000010001011111011000111", + "000010100101111001011010111111001011101101011000110100111100000110011100000010100111100111110000001111001101110001100010110001100001001101001110011101010000110010110", + "100100001110100010001111111011000001001010110010101011010001010011011000011100110101100100011010010001001011010010000001010010000100100110101101111110110011110011010", + "101001110101101110111111000100011101100010111111101100110010110100100100010110110101100101111010000000010001001000111001001100101011010110010101001110001000101011001", + "101010000110100110100101000100111111111110101010011110100111001001010100100100101110111011111001010010100001100100010111100010001011111110010101010010100101100101110", + "111100100011101011101000000001111111011101111110000010001010101001001011010010010001110000100000111101111011000110110010000001001110011101111110110010100110100000011", + "001101001010101111100100011110001000100001000111000110111100101110110100110011000001101001110001111100110111111110001010111001110000101101000110001010011111111000100", + "111110111111010011100110010111000000111111100100110111101001100110111110001101100111011110100101011001010011110010000100010011100001001011001010000100110010010110001", + "010100010001010100010011111011101101001110000100101000010001101111100011010100000000101100001111100000001111010011100101010010100100101100100011111100110010110101010", + "011001111110100010000001100100010000110110000011101111100111011101000111011001111100011100101011010010010110101010111001101010111010010110010011000110001011101001101", + "010010011000010010111001001101110111111100000100011101100111100101101110101010000011010010101100100111111101100100110111100100110010010000011101001000000101000101100", + "000100111000000111010010101001110000001111010010000001011111011001001001111011000000001000010111101101111100100101010100100001000110111011111100100011100101000110100", + "110001011101111111111110011111100100100101110001000101111100010010001111111111111101100000100010001001111010111111001100111001010000100101001110001000101110111110101", + "001010110101011001011000110111001001101011001000110100111100011111111101100100100110000110010110001011001101110000000100110111111000101011001000000100101000010110101", + "100000000111000000001111110011100101001100101010101011010001000011011001011110110101100101111100001001011010010011100111010100011101000000101011100111001010010101001", + "100101100100001010111101001100011011100100111111101100110010111101100101010110101101100101011110011010001000101001011111001000111011010000010001011111010001001101010", + "100010000111100100100111001101011011111000110010011110100111011001010101100010100110111011011001011110111001100101010011100100010010011000010101001010000100000011100", + "110100110011001111101110001001111101011011101110000010001010110000101010110000010000110000100110100111111011000111010100000111010111111101111110101011100110000100000", + "001001000011001101100010010110101100100111011111000110111100111110110101110011011000001000010111110100100110111111101100111111101001001101000110010011011110011110111", + "110011111110110001100110001111100110111001100100110111111001101111111111001001111110111110000001011011001111110011100010010111110111111011001010010101010011111110010", + "011110001000010010010001101000101001001000011100101110001001111111100010010101100010001101101111111100011000110010100001010100111110001000100011100101000011100011000", + "010010101110000010000011101010110010110000010011101110101111000100111110111100101011011101001101010000011010101011011111101100100010101000010011011111110010101011110", + "010110001001110110111001001000110011111010011100011010001111110101101111101010100011010011001010111111111000100101010001100010101010001110011101010001111101100011111", + "001011111001100111010000101111110110001001010010000011111111010000000000111001111110001000110011110111111111100100110010100101010011111101111100110010111100111110111", + "111001010100111111111100001100000000100011101001000110110100000010011110111111001101100000000010001101110001011110001000111111001001010101001110010001011111001010111", + "000010100101111001011000111100101011101101011000110100100100000110011100000111000110000110010000010001000001110001100010110001100111111011001000011101010001000100110", + "100100000110100000001111110001100001000010110010101110001001010011001000011101010001100101111010011001000011010010000001010010000100011000101011111110110010100001010", + "101001101101101010111101010110011101111010111111101010111010110100110100010100011001100101011010000000010111101000111001001100101100101000010001001110001001011001001", + "101010011110100100100111000111011111110110101010011101101111001001000100100100010110111011011001001010100011100100010111100010001010001110010101010011110101110111110", + "111100110011101111101110011011111111010101111110000010010010101001010011010001110000110000100000111101111111000110110010000001001001001101111110110010011110010100011", + "001101011010101101100010001100001000110001000111000011100100101110110100110000111100001000010001100100110110111110001010111001110001110101000110001010100110101000100", + "111110111111010001100110011101100000111111100100110001100001100110110110001111000010111110000101000001011101110010000101010011100111110011001010000100001011000100001", + "010100011001010010010001100001101101001110000100101011011001101111110011010010100000001101101111100000011100110011100100110010100100111000100011111100110010100111010", + "011001111110100010000011100111110000110110000011101111111111011101000111011100011101011101001011001010011010101010111000010010111100100000010011000110001010011111101", + "010010010000010110111001000111010111101100000100011000111111100101111110101011100111010011001100101111110101100100110110011100110010101110011101001000000100010111100", + "000100100000000111010000111011110000000111010010000111010111011001011001111001110100001000110111101101111010000101010100111001010001000101111100100011100100110100100", + "110001000101111111111100011100000100101101100001000110110100010010011111111111001101100000000010010001111000111111001100101001001001010101001110001000101110101100101", + "001010100101011001011000101101001001100011000000110100100100011111100101100111000110000110010110001011001001110001100100110111100111111011001000000100101000100010101", + "100000010111000000001111100001100101011100100010101110001001000011011001011101010001100101111100001001011011010010000111010100000100011000101011100111001011000101001", + "100101100100001010111101000110111011100100110111101010111010111101101101010100011001100101011110011010000110101000111110001000111100101000010001011111010000011111010", + "100010001111100100100111010111011010111000101010011101101111011001000101100100010110111011011001010110101010000100010010000100010010001110010101001010000100010001100", + "110100110011001111101110001010011101011011111110000010010010110000101010110001110000110000100110100111110111000111010101111111010001001101111110101011100111110010000", + "001001001011001101100010011100001100010111000111000011100100111110100101110000111100001000010111110100101110111111101101000111101001110101000110010011011111001100111", + "110010110110110001100110001101000110010001110100110001100001100111101011001111000010111110000001011011001100110011100010001111100111110011001010010101010010000010010", + "011100001000010010010001110001101000100000011100101011011001111111110000010010100000001101101111111100010101010010100001000100100100111000100011100101000011000001000", + "010011111110000010000011111111110010111000010011101111111111010100111000111101111111011101001101010000011111101010111111101100111011111000010011011111110011111111110", + "010110001001110110111001001000110011101010011100011110001111110101101001101011100011010011001010111111101000100100110001100010110110001110011101010001111101100011111", + "001010101001100111010000101010110110001001000010000110101111010000000000111001101010001000110011110111111010100101010011100101010110101101111100110010111101101010111", + "111010001100111111111100001000100001100011110001000110001100010010011000111110100011100000000010001101111000111111001001011111001010001101001110010001011110100011011", + "000011111101111001011000101111101011101101001000110011111100001110011100000110111110000110010000010001011111110001100011001001100011111011001000011101010001111110010", + "100100010110100000001111100011100001111010101010101010010001000011001000011100010001100101111011011001011111010010000000101010000111001000101011111110110010110100110", + "101001111101101010111101011100011101001010101111101111100010111100110100010101011101100101011010100000010110101000111001010100111001110000010001001110001001101001001", + "101010011110100100100111010101111110010110101010011111100111001001000100100101100010111011011000101010110101100100010111110010010001110110010101010011110010000101110", + "111100111001101111101110011001011111010101111110000001011010111001010111010000000000110000100001011101101100100111010010000001010100111101111110110010011010100110011", + "001101011010101101100010000110001000110001000111000111111100101110110010110001111100001000010001000100110010111111101010111001101010100101000110001010100101111110100", + "111110110011110001100110001111100000111111110100110100111001100110110110001110000110111110000100000001011101110011100101010011100010101011001010000100001001010110001", + "011000000011110010010001101011101100001110011100101001010001111111110101010011010100001101101111100000011010010010100100110010100111000000100011100100110011010100110", + "011101100100100010000011111100110000110110010011101100110111010101000111011101101101011101001011101010011000101010111000010010111001010000010011011110001010101100001", + "011010000100110110111001010101010111001100011100011100100111110101111110101010100111010011001101101111101001100100110110011100110001111110011101010000000100000010000", + "000100110111100111010000111001010000100111000010000010001111010001011001111000110000001000110111001101111011000101010100111001010100011101111100110011100100000101100", + "111001000101011111111100001110000101001101110001000100111100010010011111111110111001100000000011110001100110111111001100101001001010101101001110001100101001011110101", + "000010101110011001011000111111101001100011001000110111101100001111100001100110110110000110010111101011010010010001100100110111100010001011001000000010101110010000101", + "100100010110000000001111100011100101011100101010101010010001000011011111011100010001100101111100101001100111010010000111010100000111001000101011100001001100010011001", + "101001101000001010111101010100111011100100101111101111100010111101101101010101011101100101011011011011001110101000111110001000111001110000010001011001010100001101010", + "100010010010000100100111010101011010111000101010011111100111001001000011100101100010111011011111010111011100100100010010000100010001110110010101010010000101100010000", + "110100101000101111101110001001011101011011111110000001011010111000101010110000000000110000100010000110110101000111010101111111010100111101111110110011100111000001100", + "001001011111101101100010001110001100010111000111000111111100101110100101110001111100001000010000110101011010111111101101000111101010100101000110001011011111011001011", + "110010100001010001100110001111100110010001110100110100111001100111101111101110000110111110000001111010011101110011100010001111100010101011001010000101010010110011010", + "010100001000110010010001100011101000100000011100101001010001111111110010110011010100001101101000011100111011010010100001000100100111000000100011100001000100110011000", + "010010110101000010000011100100110010111000010011101100110111010110111010111101101101011101001110110000011001001010111111101100111001010000010011011001110101001011110", + "100100000000110110111001010101010011101010011100011100100111110011101001001010100111010011001010011110100001100100110001100010110001111110011101010111111010100101111", + "110011100101100111010000111111110110001001000010000011111111010000000001111000111110001000110110110111101111100101010011100101010111111101111100110100111001111110111", + "000000001001011111111100011000100101100010010001000110001100010010011000111111100011100000000100001101111000111111001001011111001010001101001110001001011111100011011", + "111111101110011001011000111010101011101101001000110110101100001100011101100111101010000110010100110001001010110001100011001001100110101011001000000101010001101011010", + "100000100010000000001111101000100011111010101010101110001001000011001001111101100011100101111101011000111000100010000000101010000110001000101011100110110011100010110", + "101110100010001010111101011111111011001011101111101111111010111100110100010100111111100101011010100001011111100000111001010100111011111000010001011110001000111110001", + "101110101110000100100111010111111110010110101010011000111111001101000101100101000110111011011110101010011101100100010111110010010110101110010101010111110011000111110", + "101110101000101111101110010011111101010101011110000011010010111011010111010000110100110000100011011101100010000111010010000001010101000101111110110100011000111100000", + "100000100011101101100010000100101110110000100111000110110100101000110010010000001100001000010001000101110000110111101010111001101101010101000110001100100000011100101", + "111111100011010001100110000101000000111110110100110000100001100110110111001111100110111110000000000001001001101011110101010011100011111011001010000010001110001010000" + ], + "3": [ + "111111100000111010001000011110100000001100100100001001011100100101001101100001001010100001011101100001001000110100111000110100111101100101000101100001000101101111111", + "100000101111010111100111001110001100100001111010000101010111100000100101011011010111110001010101011001010000010100100000001100100101011111110101011001110110101000001", + "101110101011101100111110101010000101010001011110000001110001110000101011111111110001110101110011010111110110011010101110000010101011010001111011010111111000001011101", + "101110100101111010001001001010100111100110100100110111011100100100011001110100011101010101011000110100011101111101000101100001000000110010111000110100111101001011101", + "101110100101010111100110011111101101100001001001000111111001001000100100001100111111001100110000001100101111101111010101011001010011111100101000001100101110101011101", + "100000100100001100111001001000110111111010100011011010001100111011111100000001100010101010001110000010001000110001111011010111111010001010101110000010101100101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000000110111100000101000111110001010000101111110001010101011110000000101100010101110101000001100111000111111110101011001110010001100100000001100100101000000000", + "011101100011101100111001011111110001010000010000000011111010010010101110000010111111100011101110000010101111110111110011010111110111111010001110000010001001000000110", + "110110011000111010001000011110100000001100100100001111011100100101001101100001001010100001011101100001000000110100111000110100111101111101000101100001000100111111000", + "001000100110010111100111000110001100100001111010000011010111100000100101011011110111110001010101011001010000010100100000001100100101000111110101011001110101001111110", + "010011011011001100111110101010000101010001011110000111110001110000101011111111110001110101110011010111111110011010101110000010101011001001111011010111111011110111111", + "100011110101011010001000100010100111100110100100110001011100100100011001110100111101010101011000110100011101111101000101100001000000100010111000110100111000010100111", + "011011010101110111100111010011001101000001001001000010110001001000100100001100100111001100110000001100101101001111010101011001010000001100101000001100101000101100101", + "010011111100001100111000011101010110111010100011011000001100111011111100000000101100101010001110000010001011010001111011010111111110000010101110000010101111000010101", + "100101001100011010001100111100110011100111101000010001000111000110011101101001000111000011000101100001001000110010011000110100011101100001001101100001001100111001001", + "001110111000010111100011001111001010101011001011011100110001001001110101011001010000111000110101011001110000001100101000001100101101011001010101011001010100000001010", + "000000001110001100111110001000010111011010010011111001101010010011111011010111111100010111101011010111110110000010001110000010001010001011110011010111110010001111110", + "100101101011011010001010101011100001101100010111001110111010101101001000110110011010011100111000110100111101111001001101100001001001001010011000110100011000100100011", + "001000000000010111100101010001011110101010000100011100101010001011110000100100101010101110101000001100100101000001110101011001110001110010100000001100100000101100100", + "010101100011101100111110010100010001010000010010100111101011010010101001000010001011100011101110000010101011001111110011010111110111110100001110000010001110100010001", + "110110011000011010001010111110100000001100100101001111011100000101001101100001001010100001011101100001000000100100111000110100111101111001000101111001000101000001000", + "001000100111010111100011000110001101100001111000100011010110000000100110011011110111110001010101011001010000010100100000001100100101000001110101000001110100011001110", + "010011011010101100111010001010000100110001011111000111110000010000101001011111110001010101110011010111111110011010101110000010101011001111111011001111111010001111111", + "100011110101111010001110100010100110000110100110010001011101000100011111110100111100010101011000110100011101111001000101100001000000100100111000100100111001101100111", + "011011010101010111100101010011001100000001001110100010110001001000100100101100100111001100110000001100101101001001010101011001010001010100101000001100101001010100101", + "010011111101101100111100001111110111011010100011111011111100011011111001000001111111001010001110000010001111101111111011001111111011111010101110000010101110111110101", + "100110001101111010001000101000110011000111101101110010001110100110011101101000100011001011000101100001011000101100011000101100011010001001001101100001001100100011001", + "001110101000110111100101011010101010001011001101111110101000101001110010011000101010001000110101011001101010110100101000010100101010101001010101011001010100101011010", + "000010001110101100111100001000110110111010010111111010001010010011111111110111100011011111101011010111101000110010001110010010001010001111110011001111110011100011110", + "100111111010111010001100101111100000001100010111001011111011101101001111110110111110000100111000110100111111111001001101100001001111111100011000101100011000111110011", + "001000000001110111100001011110011111101010000110011001010011001011110000000100010110101110101001010100111000000001110101011001110010100100100000010100100000101000100", + "010111111011001100111110001010010000110000010010100111110011111010101001000011110000100011101111111010111110001111110011010111110010101010001110010010001111110110001", + "110111010000111010001010110010100001101100100001001011011100110101001001000001111100011001011100011001010101100100111000110100111111000001000100000001000100110101000", + "001011110110110111100101000011001100000001111010100010110111011000100010011011100111011001010100101001010101010100100000010100100000010001110100011001110101101101110", + "010011011011001100111000000101000101110001011101000010001000000000101011011111001101111101110011010111100011011010101110011010101000011111111010110111111010000011111", + "100001101101011010001010111100100111100110100100010001000101010100011111110101000111100101011000110100001000111001000100111001000101111100111001010100111000111000111", + "011010011101110111100111011111001101111001001100100110110001000000100100101100010000000100110000001100111000001001010100101001010011001100101000010100101001100000101", + "010000101100001100111110011000010110100010100001111001101101010011111001000000111100110010001110000010001110001111111010110111111010001010101110011010101111001110101", + "100101001100011010001110110011110010010111101011110100111110100110011101101001111011000011000100111001010101101100011001010100011111001001001101111001001101000101001", + "001100100000010111100111010001001011100011001001111100101000100001110010011000101011111000110100100001100101010100101000001100101001110001010101001001010100101101010", + "000001000110001100111100000100010111010010010111111101101010000011111111110111001010101111101010101111100011010010001110000010001001110111110010010111110010000011110", + "100110111011011010001000101110100001110100010111001111011010110101001111110110001010110100111001000100111000111001001101111001001101111100011001010100011000000000011", + "001000000000000111100011011110011110100010000110011001010011011011110000000100010110100110101000001100111000000001110101000001110011000100100001101100100001011000100", + "010111111011101100111100001010010001011000010010100111110011100010101001000011110001010011101110000010111110001111110010001111110011001010001111100010001110001110001", + "110111010000001010001010110010100000010100100001001011011100101101001001000001111101101001011101100001010101100100111001000100111110100001000101111001000100001101000", + "001011110111010111100101000011001101111001111010100010110110001000100010011011100111101001010101011001010101010100100001101100100001010001110101000001110100010101110", + "010011011010111100111000000101000100100001011101000010001000010000101011011111001101110101110010001111100011011010101111100010101001111111111011001111111011110011111", + "100001101101100010001010111100100110001110100100010001000101001100011111110101000110010101011001001100001000111001000101100001000100011100111000100100111001110000111", + "011010011101011111100111011111001100001001001100100110110001011000100100101100010001110100110001110100111000001001010101011001010010101100101001001100101001110000101", + "010000101101101100111110011000010111000010100001111001101100000011111001000000111100000010001111110010001110001111111011001111111011001010101111100010101111000110101", + "100101001101101010001110110011110011001111101011110100111110110110011101101001111011001011000101100001010100101100011000101100011110101001001100000001001101011101001", + "001111111001110111100111011111101010000011001001111111111000111001110010011000111110001000110101011001101111110100101001010100101011111001010100111001010100111111010", + "000010001110011100111100001000110110100010010111111010001010011011111111110111100011011111101011010111101000110010001111110010001010001111110011001111110010100010010", + "100110101010111010001000101010100000010100010111001010101011100101001111110110101010000100111000110100111010111001001100000001001010101100011000101100011000101011111", + "001010001000000111100011011000111111111010000110011110001011001011110000000100100010101110101001010100101000100001110100111001110010001100100000010100100000100011000", + "010111111010110100111100001111110000111000010010100011111011111010101001000011111110100011101111111010101111101111110011010111110011111010001110010010001111111111001", + "110101001000110010001010100100100001100100100001001001000100110101001001000000100110011001011100011001011001000100111000110100111001111001000100111001000100011001000", + "001010111111010111100101010111001100111001111010100010110111011000100010011010110001011001010100101001001001110100100000010100100001001001110100100001110100100001110", + "010000001011011100111000011000000100011001011101000001101000000000101011011110111101111101110011010111101111111010101110011010101110001111111010100111111010001111111", + "100001101100011010011010111011100110001110100100010000111101010100011111110101011011100101011000110100001101111001000100111001000101001100111001001100111001000100111", + "011000000101000111101111001001001100011001001100100100101001000000100100101101000010000100110000001100110101001001010100101001010101110100101000010100101001110101001", + "010001100100001100110110001100010111100010100001111001101101010011111001000001110010110010001110000010010011001111111010101111111011110010101110011010101111111011001", + "100110011101101010011110101110110010110111101011110111011110100110011101101000000011000011000100111001011000101100011001001100011000111001001101111001001100111000101", + "001100100001101111100111010110001011100011001001111101010001000001110010011000110111111000110100100001100001010100101000010100101000100001010101001001010100101000010", + "000011011110000100100100010010010111010010011111111111110010100011111111110110010000101111101010101111101111110010001110010010001110101111110010001111110010101111110", + "100111110010111010010000111010100001010100000111001111011011110101001111110111011100110100111001000100100100011001001101111001001101000100011001001100011001001100011", + "001011010000000111101011000011011111000010011110011010110011011011110000000101110110100110101001010100110100100001110101000001110101010100100001110100100001010100100", + "010111111010101100111100001101010000111000010010100110001010000010101001000011100100011011101111111010111011001111110010001111110011111010001111110010001111110010001", + "110101001000101010011010100100100001110100101001001001000100001101001001000000100111110001011100011001011000100100111001000100111000011001000101111001000100011000100", + "001010111111010111110101010111001100111001111010100010110110001000101010011010100000000001010100101001001000010100100001110100100000101001110101000001110100100000010", + "010000001011011100100000011000000100000001001101000001101000010000100011011110110101100101110010001111101110011010101111111010101110001111111011001111111010001110011", + "100001101100000010001010111011100110001110110100010000111100110100010111110101000010110101011001001100001100111001000100111001000101001100111000100100111001000101111", + "011000000101011111111111011001001100001001010100100100101001100000111100101101001010001100110001110100110100101001010100101001010101110101001001010100101001110100101", + "010001100100001100100110011100010111100010110001111001101101011011110001011001101011001010001111110010010010101111111010101111111011110011001111111010101111111010101", + "100110011101101010000110101110110010101111111011110111011110111110000101110000011011010011011100111001011001001100011001001100011000111000101100011001001100111001001", + "001100100001110111100111010110001011100011001001111101010001000001110010011000111111011000110100100001100000010100101001010100101000100000010100101001010100101001010", + "000011000110011100101100011010010111010010011111111111110010110011100111110110010001010111110010101111101110010010001111110010001110101111110010001111110010101110010", + "100111111010111010011000101111100001000100010111000111111011100101000111101111111111111100111001000100101111111000101100011001001111111100011001001100011001111111111", + "001010001000000111111011011000111111010010010110010110001011011011101000011100100010111110111001010100101000100000010100100001110010001100100001110100100000100011000", + "010110101010110100111100001010110000111000000010111010101010011010100001000011101010000011110111111010101010101110010010001111110010101010001111110010001110101011001", + "110110001000110010010010111000100001101100111001000010001100000101011001000000100011100001010100011001011000100101111001000100111010001000100100111001000100100011000", + "001011111111011111111101011111101100101001101010101111111110001000101010000010111110010001001100101001001111110100100001110100100011111000010100100001110100111111110", + "010001011011011100110000011100000100001001001101000001101000000000110011000110111011100101110010001111101011011010101111111010101011110110011010101111111011011011111", + "100010110100000010001010111110100110010110100100010101011100101100011111110101100010110101011001001100010000111001000100111001000110111101111001000100111001011000111", + "011000001101011111110111011110001100000001000100100101010001101000111100101100101110001100100001110100100001001001010100101001010000100100101001010100100000001001001", + "010011100100000100101110000010010111110010100001110101110101010011110001011001010001001010001111110010000111101110011010101111111000101010101111111010100110101111001", + "100111001101100010010110111010110010111111111011111111011110110110000101110000011101010011010100111001011100001101111001001100011101000001001100011001000101101100101", + "001111100001101111100111001011001011111011011001100000110001000001111010011000010111011000101100100001111100110101001001010100111011010001010100101001000100110100010", + "000011010110011100100100001101010111011010001111110110001010110011101111110111100101010111100010101111111011010011001111110010010011111110010010001111110011010010010", + "100101100010110010010000111100100001000100000111000011000011100101000111101111100111111100100001000100110000111001001100011001010110011101111001001100011000011000111", + "001010000000001111101011000111011111010010010110011010110011011011101000011101100000111110101001010100110000000001110100100001101000101101000001110100100000000001000", + "010100100010110100111100001000010000100000010010100011101010011010101001000011010100000011101111111010101110001111110010001111110000001011001111110010001111101110001", + "110101010000101010011010110011100001101100101001001000111100000101010001000001000011100001001100011001000100100100111001000100111101001001000100111001010101100100100", + "001000111111011111110101011001001100101001111010101110101110001000101010000010001010010001010100101001000100110101000001110100100011110001110100100001101101110100010", + "010001011011010100100000001100000100001001001101001001100000000000110011000110101011100101100010001111110010111011001111111010101011110111111010101111100011011010011", + "101010101100000010001010100110100110010110110100001101010100101100010111110101111010110101000001001100000001011000100100111001010110111100111001000100100001011001111", + "011100001101000111111111010110001100000001010100101101001001101000110100101100111110001100111001110100100001001000010100101001001000100101001001010100101000001001001", + "011111110100000100100110001010010111110010110001110101111101010011110001011001010001001010010111110010000111101111111010101111100000101011001111111010101110101111001", + "101011001101100010000110101010110010111111111011110111010110110110000101110000001101010011000100111001011100001100011001001100000101000000101100011001001101101100101", + "000111111001101111100111010011001011111011001001111000101001000001110010011000001111011000110100100001110100110100101001010100101011010000010100101001010100110100010", + "000111000110011100101100000101010111011010011111111110001010110011100111110111110101010111111010101111110010010010001111110010001011111111110010001111100011010010010", + "101001110010110010011000110100100001000100010111000011001011100101000111101111100111111100111001000100101001011000101100011001001110011100011001001100000000011001111", + "000110000000001111111011010111011111010010010110010010101011011011101000011101110000111110111001010100101001100000010100100001110000101100100001110100111000000001000", + "010111111010110100101100011111110000100000000010111011111010011010100001000010111110000011110111111010111111101110010010001111100111111010001111110010010111111111001", + "110010001000101010011010101000110001101100111001000110001100000101011001000001100011100001010100011001001000100101111001000100100110001000100100111001000101100010100", + "001010101111011111100101011010110100101001101010101110101110001000101010000010101010010001001100101001001010110100100001110100111010101000010100100001110100101010010", + "011110001011010100100000001000110100001001001101000010001000000000110011000111100011100101110010001111101000111010101111111010110010001110011010101111111010100010011", + "101011111100000010011010111111100110010110100100010011111100101100011111110100111110110101011001001100011111111001000100111001000011111101111001000100111000111111111", + "011111000101000111110111010011001100000001001100100100101001101000111100101100110110001100100001110100100100101001010100101001010001010101001001010100111000110101001", + "011111110100000100111110000101001111110010101001110110011101010011110001011000000101001010001111110010001010001110011010101111111111111011001111111010110110110011001", + "101001000101100010010110101100101010111111101011111111011110110110000101110001000111010011010100111001010001001101111001001100011100011000101100011001010101011000101", + "001110100001101111110111000111011011111011011001100010111001000001111010001001100001011000101100100001101001110101001001010100111100101001010100101001001101000000010", + "000100000110011100101100001001100111011010010111110111110010110011101111111111110101010111100010101111100111110011001111110010010010001110010010001110010011101110010", + "110101110010110010001000101011011001000100011111000000111011100101000111100110100011111100100001000100100100111000101100011001010001001101111001001101111000000101111", + "100100011000001111111011011001011111010010000110011010100011011011100000010100110010111110101001010100101100100000010100100001101001110101000001110101000000110101000", + "111101111010110100101100001101111000100000000010100001110010011010100001001010101010000011101111111010101010101110010010001111110111110011001111110011001110011011001", + "000010001000101010011010110111000001101100100001001001000100000101001001010001000011100001001100011001001001000101111001000100111100111000100100111001010101011000100", + "100100101111011111100101010110110100101001110010100101000110001000101010011011000110010001010100101001010001010101000001110101000100100000010100100001101101101000010", + "101111010011010100100000011011111100001001011101000001101000000000111011000111101001100101110010001111100111111011001111111011001010101110011010101111100011101110011", + "110011101100000010011010110010110110010110110100010111010100101100010111111100011100110101111001001100000100011000100100111000110001000101111001000100100000101101111", + "111111011101000111110111001010111100000001001100100100101001101000100100111100101110001101000001110100111100101000010100101000001001010101001001010101001000110101001", + "000011100100000100111110010101101111110010101001100110001101010011110001000110011101001010101111110010010010001110011010101111100111111011001111111011001110110011001", + "001001010101100010010110100100110010111111101011111111001110110110001101110111011111010011010100111000100001001101111001001100000100011000101100011000101101011000101", + "100110100001101111110111001110100011111011011001110010101001000000011010010001110001011001101100100000010001110101001001010100111100101000010100101000010101000000010", + "110100011110011100101100010001110111011010010111111111110010110011011111100001110101010110100010101110011111110011001111110010010010001110011010001111100011101110010", + "001001100010110010001000100011011001000100011111010000101011100100000111110010101011111100000001000101111100111000101100011000110001001101100001001100000000000101111", + "110100001000001111111011001000100111010010000110010010110011011011000000011100110010111110101001010100111100100000010100100000001001110101011001110100111000110101000", + "000101111010110100101100010100000000100000000010101001100010011010000001001100101010000011001111111010110010101110000010001110000111110011010111110010010110011011001", + "010010010000101010011010100111010001101100100001001001000100000101001001010111000011100000101100011001010001000101100001000101100100111000100100111000110101011000100", + "011011111111011111100101001111110100101000110010111111111110001000001010011011111110010001110100101001001111110101011001110100111011111000010100100000001101111110010", + "111110001011010100100000011000100100001001111101001010001000000001111011000000100011100101100010001110011000111011010111111010110110001110011010101110000011100010011", + "001010101100000010011010101010101110010111010100011010101100101101110111111111101010110100000001001101111010111000100100111001010110101101111001000101100001101011111", + "101110001101000111110111001000101100000000101100100010001001101000000100111110100010001101111001110101001000101000010100101001001010001101011001010100111000100011001", + "111111111100000101111110011111101111110010101001100011111101010010110001000101111111001010110111110011011111101110011010101110000011111011010111111010110110111111001", + "011001010101100011010110100011001010111110001011111110111110110110101101110001101011010011000100111001001100101101111001001101100111001000110100011001010100000100101", + "011100111001101110110111001001011011111011011001110110100001000001011010010111110011011000010100100001101100110101011001010101011001110000001100101001001100010100010", + "100101010110011100101100010101100111011010010111111011110010110011111111100001001011010110011010101111111010110011010111110011010001110110010010001110000011111010010", + "110110100010110011001000100111011001000101011111010111000011100101100111110111000011111100011001000100100001011000110100011001010100111101111001001101100001111001111", + "100100010000001110011011001110111111010010100110010001000011011010100000011010000110111110111001010101000001000000001100100001101010100101000001110101011001101001000", + "110111100010110100001100010011111000100001100010101011101010011011000001001000101000000010110111111011010111101110010010001111100010101011001111110011010111001111001", + "001111000000101010111010100010100001101101000001001011010100000101101001010011111101100000010100011000101100000101111001000100100111000000110100111001010101001100100", + "100111101111011110100101001010110100101001110010111010101110001001101010011110101110010001101100101000001100110101000001110101011001010000001100100001101100010100010", + "100111001011010101100000010101111100001000111101001100001000000000011011000111011101100101110010001111111010011011001111111011010001111110000010101111100010110010011", + "110001110100000011011010100100110110010110110100011011001100101100110111111010011110110101111001001100000001011000110100111000110100011101100001000100100001111001111", + "110010001101000111110111001110111100000001001100100000101001101000100100111010010000001101000001110100100001101000001100101000001010101101001001010101011000100001001", + "001100110100000101111110010001101111110011101001100001110101010011010001000001110101001010101111110010010111101110000010101111100010001011001111111011010111001111001", + "000001011101100011110110100011010010111111001011111101001110110111001101110111101011010011010100111000101100101101100001001100000111001000101100011000110100000100101", + "101100111001101111010111001000100011111010111001110000010001000000011010010011110011011001101100100000001100110101001001010100111001110000010100101000001100010100010", + "111001010110011100001100010100011111011011110111111100111010110011011111100101001011010110100010101110011010110011001111110010010001110110000010001110000011111010010", + "001010100010110011001000100111011001000100011111010110111011100100000111110011000011111100000001000101100001011000101100011000110100111101100001001101100001111001111", + "111100010000001110111011001110111111010011100110010110001011011011000000011100000110111110101001010100100001000000010100100000001010100101011001110100011001101001000", + "000111100010110111101100010010000000100000000010101100010010011010000001001100101000000011001111111010110111101110000010001110000010101011010111110010110111001111001", + "011111000000101010011010100011001001101100100001001101101100000101001001010111111101100000101100011001001100000101100001000101100111000000100100111000110101001100100", + "010010101111011110100101001010110100101000110010111010110110001000001010011010101110010001110100101001001100110101011001110101011001010000010100100000001100010100010", + "100100001011010011000000010101100100001001111101001011110000000001111011000001011101100101100010001110011010011011010111111011010001111110011010101110000010110010011", + "110011110100000100111010101111110110010111010100011111111100101101110111111111111110110100000001001101101111111000100100111000110111111101111001000101100001111111111", + "000000001101000001010111001000100100000110101100100010001001101000000100111111100010001101111001110101001000101000010100101000001010001101011001010101011001100011001", + "111111100100000111111110011010101111110000101001100110101101010010110001000100101011001010110111110011011010101110011010101110000110101011010111111011010111101011001", + "100000101101100011010110101000110010111100001011111010001110110110101101110001100011010011110100111000111000101101111001001101100110001000110100011000110101100010101", + "101110100001101010110111001111111011111101011001110011111001000001011010010110111111011000101100100000001111110101011001010101011011111000001100101000001100111110010", + "101110101110011100101100010011111111011010010111111101010010110011111111100000101001010111000010101110010111110011010111110011010110101110010010001110000010001110010", + "101110101010110011001000100010111001000111011111010010001011100011100111110111011101111101100001000101110100011000110100011000110101000101111001001101100001001101100", + "100000101000001110011011001110111111010010100110010101010011011110100000011011001110111111011001010101001100100000001100100000001101010101000001110101011001110101001", + "111111100010110010001100010100100000100101100010101011010010011100100001001001111100000011010111111011000010001110000010001110000011111011001111110011010111110011000" + ] + }, + "38": { + "0": [ + "1111111010111001001000000110001100010000111111010101010110010011100111110010100110100000001101011000001101011010101111010000101111010001010100111110010100111000101111111", + "1000001010101000000101110010101010101010001001001110100011001001001111100101001110001110000011010110000011010101001001111010110000011111111010110000011010110000101000001", + "1011101001100100011001110100000000100100110101001001001100011000100100100100100101000010111101000101100001000100101010011001010011111100011001010011111001010010001011101", + "1011101010001001011001001011100010100010011000110001000001001111001101011000001101110010100111110101011001110000010000101000001101011100101001001001001001001110101011101", + "1011101000100010011010010000101111101110110111101010010011111011100011010110000011111110101001111011010111111111110100001110000011010111111010010010010010010101101011101", + "1000001000010110110011110110101000111100100000011011100010001101100100100100100101100011000010111000110100111000111111001011111001010010001011111001010011111100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000011001010100110001000011000110010011101100001010010001110100101001111100100100011010110000011010110001000111100101000011010110110001000011010110000011101100000000", + "1011011101101100101100010001011111101010111001000101111011111110011111001010011110111110110101100000110101111111111101000010111101000111111011111001010011111100001001011", + "1001000111110001001000000110001010010000111111010101010101001011100111110010100110100110001101011000001101011101001111010000101111010110001100111110010100111110101101001", + "1101001100101000000101110010100010101010001001001110101101111001001111100101001110101010000011010110000011010010001001111010110000011010000010110000011010110000100011001", + "1011000011111100011001110100000010000100110101001001000011010000100100100100100101000100111100100101100001010001001010011001010011111101100001010011111001010011111100101", + "1001101110001001011001001011110001000010011000110001001000111111001101011000010101010100100110010101011001101111110000101001001101011101011001001001001001001001000110010", + "0010100110100010011010010000110111001110110111101010011011001011100011010110011011111010101000011011010111100001110100001111100011010010001110010010010010010100101001100", + "1011011000010110110011110110101100011100100000011011100101111101100100100100111100011001000011111000110100100011111111001010011001010001001101111001010011111110100010000", + "0110110010010001111101010011000101001001000110111010001011110101111110010100101110101110001101011000001101011001000111110010100001101111110101000001101011000110101100111", + "0010101011011010011010100111100001111100001111110011000000010000101001111100101000001000000011010110000011010011001011110100001011110001110011001111100101001010100010010", + "0100100010011100100101101011100111111101010010111000101000100110001010011111001011001011100000110101100000110000100010111101000010111011100001010011111001010011000000100", + "0110011111110011011110101001111001110001010010010101101110100010010100111110010101110001011000001101011000001001010011000001101011000001011001101011000001101010011000010", + "1101110101001010101111000010110100110010000011111111110101100110010010010010010011110010001010010010001111100111111101001111100101001011010111100101001111100100001010011", + "0100001011100100110100100110011100101111110101011100110101000010100000110101111000111001001011111001001100000010011000100100100000110000110100100100100100100101101011111", + "1001110101111001000001001011101100010101101100110001000000000000111000001101000000100001110011000001110100111010101000010100111000001001010101001001001000101111010010111", + "1101101110100000000101000000011010101010010110101101010011000011010010010010001010101111110101001111110010010101001111111100101111100111111011001111100100101000010100110", + "1011010111111100010000111110101000100100101011010111100110010000010011111001000011000011100000110101100000110100101100011111001100000010011000101100000111101011000001010", + "1001111000000001100001110100111010100111010100101000011011001011110010100111110011010011011000001101011000001000010000101111010000101010101000010100111111110001111001001", + "0010010100101011010011000101010001001010000100001110011110011000111100101001111101111101010110000011010110000110010100001011110100001101010111100101001111100101110110010", + "1011111010011110110011010100010100011101111111111000000011010111111001010011111000011100110101100000110101100100111110101100000110101100110100000110101100000111110101111", + "0110100110010001110100010001101111101000011000100100101110111101001001001001001000101001010001001001010100111100100110010100111110010000001100111110010100111111010001000", + "0010111101010111000010001000101010011001000011101010000011110100010110000011001110001111111101001111111010110100101110010010010110000110000010010010010010010011011101001", + "0100010000010101001100110110000001111000100001011100101101101101010101100000101100101100011110101100011001010111000101111001010101100100111000100100100101000010111110110", + "0110111111111011111110011011011111110000001101110110001011111000001001001001010001111110101110010100101001001111110100100111110100111011111000010100111111110011111111001", + "0001100011001000000110001000011000110011011101100001010010001110100101001111110101100011010110000011010110011000111010101001111010110110001110011010110001111100100010000", + "1000101011101010101100011001011010101011111001000101110110101110011111001010011110101010110101100000110101111010111101000010111101000110101101111001010010111101101010100", + "1101100011110000001000011110001000110001011111010011000110001011100111110010100111100010001101011000001101001000101111010000101111010010001100111110010100111110100011001", + "0001111110101000000101100010111111101011001001001110110011111001001111100101001110111110000011010110000011011111101000011010110000011011111010110000011010110000111111001", + "0111010001111101111001111100001100000101110101001001000011110000100100100100100101011000100100100100111001001011101011111001010011111111001001010011111001010011000010101", + "0111111010001100011001010011101101000010011000110111011011111111001101011110010100101110111110010100100001101001010101001001001001011001110001001001001001001000101100010", + "1110100010100011111010000000111001101110010111101100011100010011100011010000011011001000110000011010101111111011010011001111100101010001110110000010010011110100000010000", + "1001101010010110010011110110110111111101100000011001100000101101100100100010111100001011010011111001000100100000111001001010011111010101100101100001010010011110000001100", + "1000010110010011011101010011000001101000000110111110001000111101111110010000101111010000001101011000001101000001000001110010100111101011011101011001101010100111011001011", + "1110111101011100011010101111100100111101001111110001000011100000101001111100101000010010000011010110000011010111101011110100001011110011010011010111100100001010001011010", + "0000000010011101100101110011110100111100110010111010101101000110001010011111001010011001100000110101100000101010000010111101000010111110110001010011111001010010001010100", + "1001111101110011011110111001101100010000010010010101101100000010010100111110010101000001011000001101011000001010101011000001101011000001010001101011000001101010010010010", + "0011100111001011001111001010111010110011000011111101110101000110010010010010010011101110010010010100001011111101000101001111100101001001111111100101001111100101110100011", + "1010011111100001110100111110000000101111110101011110110110010010100000110011111001010011010011111111001010000100100000110100100100110100011100100100100100100101000001111", + "0110110001111000100001011011100010110101001100110111000111001000111000001011000000001011101011000111110010100000011000001100111110001010101101011001001000101111011001011", + "1100011100100000100101000000011001001011010110101111010110011011010110010100001010100101100101001011110100010110001111100100101001100011010011010111100100101000110111010", + "0110110011111110110000111110110100000101101011010011100101010000010101111101000010100101100000110101100000101100101100000111001010000110110000110100000111001010110100110", + "0101101110000111000001110100111111100110010100101010011000111011110100100111110011001001011000001101011000001100110000101111010000101000001000001100100111010001010000001", + "0110110100101011010001000101100010011010000000001100011011110000111010101001111100101111010110000011010110011100110100001011110100001000000111100101001111100100111100010", + "0100011000011110110001010101000001100101111011111000000001101111111001010011111000101100110101100000110101100111000110101100000110101100111100000110101100000111111111111", + "1000110101110000010000010000010001100000011110100110101110011101001001001001001000110101001001001111010000100110011110010100111110010010100100111110010100111110101111000", + "1100101001110111000010001001101110011001000001101000000000100100010110000101001111100101100101001001111100110010010110000010010010000010101010010010010010010011110011001", + "1011010101010101001010110111010111001000100111011010101010100101010101100110101101100110000110101010011111001011110101100001010011100111000000110100111101000100110010110", + "0111001110011011111000011010101010010000001111110100001101000000001101001111010001111110111110010000101111001011010100111111110010111000001000001100100111110101101010001", + "0000000100001000000110001001001010101011011101100101010011100110100011001011110100010011010110000011010110011100011010110001111100110000000110000010101001111010000100000", + "1000111111001010101010011001011111100011111111000111110111111110011001001010011110111110110101100000110101101111111101000010111101000111111101100001000010111000111111100", + "1101100010110000001110011110111000100001011011010111000010001001100001110010100111100010001101011000001101001000101111010000101111010010001100111110010100111111100011001", + "0010101010101000000101100011111010100011001100001110110010101011001111100101001111101010000011010110000011011010110000011010110000011110101010110000011010110000101011001", + "0101100010011101111001111101111000110101110011101011000110001110100100100100100100100010100100100010111101011000110011111001010011111110001001010011111001010011100010101", + "0111111110101100011001010010101111100010011010010011011111111101001100111110010101111110111110010010100111101111101101011001001001001011111001001001001001001000111110010", + "1101110101100011111100000001100100111110010001101100011001100011100010110000011011010010110000011100101001110011100011010111100101001111010110000011001011110010101010000", + "1010001011110110010101110111011100111101100010011001100001000011100001000010111101011001010011111101000010110010011001010010011111001100110101100000101010011001001011100", + "1011110101010011011101010010000100010000000111011110010110000101111001010000101111100000001101011000001101001010100001101010100111110101010101011000010010100000010011011", + "1110101111111100011100101111111010110101001001110001011101000110101111111100101001101110000011010110000011000101001011110100001011110011111011010110010100001110010101010", + "0000010111011101100011110011010000101100110111011010100100010100001100011111001010110011100000110101100000100100100010111101000010111000011001010011111001010011100100100", + "1001111001110011011110111000110010111000010111110101110001001110010100111110010101001011011000001101011000011110001011000001101011000000101001101011000001101011011110010", + "0011010100101011001111001011011001000011000100011101110010011110010010010010010011000100010011110100001011110000000101001111100101001111010111100101001111100100010000011", + "1010111011000001110100111111001100001111110111011110100111010000100001010011100000100101010010011111001010010010100000110101100100100100110100100100100100100101010011111", + "0110100110111000100111011010111111100101001010110111000010111000111001101011011000001001101010100111110010101000111000001101011110010100001001011110010000101001110001011", + "1100111101000000100011000001101010001011010100101111010111110101010111100100010011101111100100001011110100000100101111100101001000011010000101010000011100101111111101010", + "0110010000111110110000111111101001111101101010110011111011101000010100100101010010001100100000110101100000100111001100000110101011111000111110110011111111001101111110110", + "0101111100100111000111100100100001101110010010101010000110011101110100111111110010110100111000001101011000011110010000101111010001001000100110001001001111010101001110001", + "0110100001101011010101011101100110011011100001100100010010100010111010110001111100000010110110000011010110010010010100001011110101001110101111100101001111100101010010010", + "0100011100011110110011000101011111010101011010010000011100100011111001010011111000100001010101100000110101100011100110101100000110101101000100000110101100000110110011111", + "1000000111110000010100001000000010011001111111010110101001000101001001001001001000011001001000101111010000110011011110010100111110010100001100111110010100111111001011000", + "1100001101110111000010001001111010111001100001110000010001100111010111100101010110010111100100101001111100111100010110000011010010010010000010010010010010010011100101001", + "1011000011010101001010111111010010001001100111010010101111010100010100000110110101100100000111001010011111011101010101100000110011111001100100110011111100100100011100110", + "0111101110011011111000001010110001010001001111111100001100101110001100111111001000110100111111010000101111011111110100111110010011000001011110001011000110010100100110001", + "0000100110001000000110001001011111001010011100001101001101001110000010010011100100111010010110000011010110010001111010110000011101001110001000000101001000011011001000000", + "1000011001001010101010011001001100000010011111000111101011100001111001010010011111011001010101100000110101110011111101000010111100100101001011100100100011111000100011100", + "1101000010110000001110011110111101000001000010111111001001101001100001101010100111011001101101011000001101001001001111010000101110010101110100111110010100111110001001001", + "0010111110101000000101100011101111100010010100100110101011111101001111100101001110111111100011010110000011011111110000011010110000011011111010110000011010110000111111001", + "0101100010011101111001100111111000110101101010111011000110001000100100100100100100100010100101000010111101001000110011111001010011111110001001010011111001010010100010101", + "0111101010101100011001010000111010100011100010101011001010101100010100111110001101101010111111110010100111111010101101011000001001001010101001001001001001001001101010010", + "1101100011100011111100001011111000111111001001100100011010001010111010110000000011100010110001111100101001101000100011010110000101001110001010000101001110010010100011100", + "1010111111110110010101100101011111111100110010010111100111111011111001010010100100111111010010111101000010101111111001010011111110101111111011100110101101111001111110000", + "1011010001010011011101010110001010110001010111010110010101000101001001001000111111001101001101011000001101010110000001101011000110010000101011011110010101000000011110111", + "1110101101111100011100101011101001010100111001110011011100000111010111100100101001100011100011010110000011001000001011110100001010010001010101010010010011001111110000010", + "0000100011011101100011110101011100001100111111010000100111000100010100000111001011000000000000110101100000100010100010111101000011111100110001010011111001010011010010100", + "1001111111110011011110111000111111111001011111111001110110110110001100111110010100001000111000001101011000000000101011000001101011000010001001101011000001101011010000010", + "0011100000101011001111010101010010000011001100001011110111111110000010010010010010101110001011110100001011110100100101001111100101001010000111100101001111100100111100011", + "1010101001000001110100111101011001101110001111000110100101101001111001010101100000101101001010011111001010000111000000110101100000100110111100100100100100100100111111111", + "0110100100111000100111010000110001100100010010111111000000000001100001101101011001010101110010100111110010100110011000001101011000010000100000101110010101001001001110111", + "1100101101000000100011010011100110001010000100100001010010101101001111100011010010100011110100001011110100000010001111100101010110011100101100101000011011001110110010110", + "0110010110111110110000111011100111011100111010111011111000101000100100100000110010100000100100110101100000111011101100000110110101111011000111001011111000101101110011010", + "0101001100100111000111110000010010001111100010101000000111011100001100111110010010111000111110001101011000010011010000101111001001001100001111010001001000010100101011001", + "0110110111101011010101000010101010111010001011100111110001110010100010110000011101110110110000000011010110010100010100001011100101001000000111100101001111100101100100010", + "0100011010011110110011010100010010010100110100010101111011011011100001010011111001100101010011100000110101101101000110101100000110101101100100000110101100000110111101111", + "1000110011110000010100001110101001011000010011010000101100100101011001001001001001110101010000101111010000101111111110010100111110010001011100111110010100111111100111000", + "1100011111110111000010001011001111011000111011110001110011011111001111100011010110011011111100101001111100110001110110000011010110010000001010010010010010010010001001001", + "1011000001010101001010111101111100001001111101010011001101101100001100000000110100111000011111001010011111001011110101100000110101111101001101000011100000100100100011010", + "0111111110011011111000001000101101010001011101111010001001110110010000111000001001111000101111010000101111011001010100111110001101000111110111110011011000010101101001101", + "0000100000001000000110001100100001101010001100001101101110011110010100010110000100010110010010000011010110001101011010110000000011001101110001111101010110011011000101100", + "1000101001001010101010011100110111100010001011000101001010110001100111010011111111010101010011100000110101111110111101000010100100100001100010111100110101111001000110100", + "1101100100110000001110011001101001100011010100111100101010101001111111101011000110101101101011011000001101001110001111010000111110010011011100111110010100111110111111001", + "0010101100101000000100000010100100100000000100100011001101101101010111100101001111010011100101010110000011011010010000011010110000011011010010110000011010110000001011001", + "0101010110011101111000000010110100110011111010111101000001001000110100100100100100011000111101000010111101000011110011111001010011111100110001010011111001010010001010101", + "0111111110101100011000110000011111100001100110101010101011111110010100111000001101111110100111110010100111101111101101011000001101001111111001001001001001001001111110010", + "1101100011100011111101001011011000111001001011100101111010001000111010110110000010100010101001111100101001111000100011010110000011001010001011110100010110000010100011100", + "1010101011110110010100100101011010111110110001010111100110101111111101010101100100101011000010111101000010101010111001010011100000101110101010011110110101100000101010000", + "1011100011010011011101110111101000110011010110110110110010001011001111001101011111100011001001011000001101011000100001101011011000010010001010100110001101011001100010111", + "1110111111111100011100001010001111110100111101010011111011111101010001100101001001111111100101010110000011001111101011110100010010010111111100001010000011010110111110010", + "0000100001011101100011010100000001101110111001010001000111101100010010000110101010101100000110110101100000101110100010111101010011111010111001010011111001010011011110100", + "1001101101110011011111011001100101111011011110111000010010000100001100111110010100010100111110001101011000010110001011000001101011000010100001101011000001101011101110010", + "0011100100101011001110110100011010000001001101001011110110101000000010010010010011100010001011110100001011100010000101001111100101001100101111100101001111100101110100011", + "1010011111000001110100111101100001001010001010100111000010101011111000110101100000000001001010011111001010000011100000110101100000110101000100100100100100100101110001111", + "0110000100111000100110110000000100000010010000111110100111011011100000001101011000111001110010100111110010111011011000001101011000001000001000101111001101011001001110101", + "1100111111000000100010010011101110101000000111100001010011110001001010000011010110010111110100001011110100010101001111100011010110000110000100101001100011010111000110101", + "0110010010111110110000011010010100011110111011011011011101011110100011100000110100100100100100100101100001000100101100000000110101100101100111001010000000110100100101001", + "0101111010100111000111010001011101001111100110001000100000100110001010111110010100010100111110010101011001110110010000101001001001001101011111010000111000001101010111010", + "0110010111101011010101100010110111011000001111110111110001011010100100110000011010011010110000011011010111111000010100001111100101001100001111100101001111100101100000010", + "0100001000011110110010110100001000010110110011011101111111101001000001010011111001111001010011111000110100111011100110101100000110101111001100000110101100000110001011111", + "1000110111110000010101101111000001011010010110011000101101110010111001001001001000111001010000101111010000111001011110010100111110010111110100111110010100111110101101000", + "1100101001110111000010001011010111111100111100010001110100011101001110000011010110110111111100101001111100110011010110000011010110000011110010010010010010010011000011001", + "1011100001010101001011011101101001101111111101001011001010110111001101100000110101010100011111001010011111010000110101100000110101100100100101000100100000110100100001000", + "0111101100011011111001001000110101110011011100101010001000101010010001001000001101001100101111010000101111001000010100111000001100111100111111110100111000001100011001110", + "0000100100001000000110101100100010101000001101110101101011101000010101001110000010010011010010010011010111110110011010110110000010110010110001111010110110000010010011111", + "1000011111001010101010111100110000100010001011110101001101001011100111001011111001111000110011111000110100011011111101000100100101000001010010111001010101100000110010111", + "1101000100110000001110111001101100000011010100101100101010000001011111110011000001000000001011000000001100100011001111010100111111010111010100111110010100111110101011001", + "0010111110101000001100000010111110100000000101101011001001011110010111100101001111001110000101001110000010001101010000011010110000011001111010110000011010110000100101001", + "0101010010011101111000000010101100110111111011101101000000011111010100100100100101010100111101000010111101010100110011111001010011111010011001010011111001010011000000101", + "0111111010101100001001010000001100100111100111010010101111000111110101011000001101101100100111110010100111101000001101011000001101011000101001001001001001001000011000010", + "1101010111111011100101101011011111011001011011111101111110000001111011010110000011100010101001111100101001100110000011010110000011010010010011110010010000000010010111110", + "1010111111110110000100100101011111111110110001000111100011111111111100100101100000111111000010111101000010101111111001010101100001010111111010011001010001100001111110011", + "1011100011000011011101110101111000110011001110101110110010001011001110010101011001100010001001001000001100101000100001101101011001101110001010100001101011011001100010100", + "1110101011110100000100001110011010110100110101000011111010101101010001111101001110101010000101001110000010111010101011110010010011110010101100001111100101010110101010001", + "0000100011001101101011010010011000101110101001000001000110001100110010011110101100100011100110101101100001001000100010111001010010111110001001010011111001010010100010100", + "1001111111111011001111011111101111111011001110110000010111111101001100111110010101111111011110010101011001011111101011000001101011000011111001101011000001101011111110010", + "0011110110111011000110110010011110100001010101011011110101110001100010010010010010110110001011110100001011100011000101001111100101001101100111100101001111100100100010011", + "1010011011000001110100111011110100001010010010111111000111011010011000110101100000100101001010011111001010011000100000110101100000110010000100100100100100100101100101111", + "0110110010100000100110110110011101000010000000100110100000100010100000001101011000110101110010100111110010110110011000001101011000001100111000101001001001011000111110101", + "1100011111000000110010010011110111001000000111110001010001011001001010010011010111111011110100001011110100010000001110000011010111100000001100101111100101010111110000101", + "0110000000101110110000011000010000011110100011000011011010101110100011111000110101111001100100100100111001001011101101100000110100000101001111001100000110110100110011001", + "0101111110101111011111010101011001001111101110011000100011110110001010100110010101111111011110010100100001101001010101001001001000101001110111010100111110001101101101010", + "0110100001111011011101100100111111111000011111110110010011011010000100101000011010010001010000011010101111110011010011001111100100001001110111100101001111100100000010010", + "0100101000010110100010110010001001110110100011011100011111110000100001010011111000110010110011111001000100101000100000101100000110101100111100000110101100000110100001111", + "1000100101100000011101101001000101111010001110000000001110101010111001001001001001101001010000101111010000111000011000010100111110010110100100111110010100111111111001000", + "1100111001110111000010001101000010111100100100001000010000001100101110000011010110010011111100101001111100101110010110000011010110000100101010010010010010010011010011001", + "1011000001001101001011011011110000101111101101001010101101101111001101100000110101011000011111001010011111011011110101100000110101100001000100100100100100110101010011000", + "0111111100011011101001001000101100010011011100101011001010000010010001001001001100100000101111010000101111001011010101011000010100111011010110010100111110001100101011110", + "0000110110011000000110101110100110101000010101110101101101111000010101001111100011001111010110010010001111111101011011010110011010110011111000011010110000000010000101111", + "1000111011000010110010111000110100100010000011110100101110111011100111001010011000010010110101111001001100000100111000100100111101000100011011111001010011100000000000111", + "1101000110100000000110111111100100100011000100101101101000000001011111110010100001001010001101000001110100101000001000010100101111010010101100111110010100111111011001001", + "0010011010100000010100000100111111000000010101101011101001000110010111100101001110000100000011001111110010011110010110011010110000011010001010110000011010110000110111001", + "0101100000001111110000000100101000010111100011101100100011000111010100100100100100000100111101000010111101010101110101111001010011111011001001010011111001010010110100101", + "0111101110101011111001010110011001100111111111010011101011010111110101011000001101001000100111110010100111110101001101011000001101011111110001001001001001001001101000010", + "1101110101111011011101101101000110011001011011111100011011011001111011010110000011101110101001111100101001101101000011010110000011010111110010010010010010011010000101110", + "0011001111110111100101100101000001111000110001000110100111101111111100100100100001001101000010111101000010100110111000110101111001010110111011111001010011110000000110011", + "0000100011000101011100110101111101010101001110101110110110100011001110010100111000010100001101001001010100100110000000001101000001101000100011000001101011011001011110100", + "1101111101110000100101101110011111110000110101000010011011111101010001111100101111111110000011001111111010111111101110010010001011110011111101001111100101010110111110001", + "0000000011001101101011010010011000101100101001000000000010001100110010011111001100100011100000101100011001001000100101111001000010111110001001010011111001010011100010100", + "1111111011111010001110011111111010111111001110110000110010101101001100111110010101101011011000010100101001001010101101000001101011000110101001101011000001101011101010010", + "1000001010111110000110010010011000100101010101011010010010001001100010010010010010100010001011110100001011111000100011001111100101001010001111100101001111100100100010011", + "1011101001000110010101011011111111101110010010111110000111111010011000110101100000111111001010011111001010001111100000110101100000110111111100100100100100100100111111111", + "1011101010100000000111010110011000000010000000100111000111010010100000001101011000011111110010100111110010110001011000001101011000001101110001001001001001001000001100101", + "1011101011000001010011010011110111001110000111110000010111011001001010010010010110010001110100001011110100011011010110000011001111100101110101001111100101001110000010110", + "1000001000101000110001011000001001111000100011000011011001110110100011111001010101110011100000100010111101011000110101100000101100000110111110101100000110101101100001000", + "1111111010101011111110110101000101001011101110011001000000101110001010100111110101001001011000010010100111111000001101011001010000101110100110010100111110010101011001011" + ], + "1": [ + "1111111011110111001100011000110110111110001101001001001001010101011001110010100110100000001101011000001101011101001111010000101111010110010100111110010100101000101111111", + "1000001000100100000011011101000110110000000011001111100100011010010111100101001110001110000011010110000011010010010000011010110001111000011010110000011010101100101000001", + "1011101010001101111000010111110111010011100000101100000111111001010100100100100101000101111001000010111101000001010011111001010010011011111001010011111001001010001011101", + "1011101010100100011001110100000011001001011000010100111111011001101101011000001101110101000001110010100111110111101101011000001100111001001001001001001001010110101011101", + "1011101010101110010101111111001111110010010111100101001111111111100011010110000011111111001111111100101001111111100011010110000010010011111010010010010011110101101011101", + "1000001000001010110111101000001000111001010100000110101110001101100000100100100101100010100100111101000010111000111001010011111001010110001011111001010010011100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000001011010010110100111111000111010110111100101001010001110000011001111100100100010010110000011010111101000111010110000011010110010001000011010110001111100000000000", + "1111001011001000010101110010111111111001010100100100100111111101111001001010011110111111010101100000110100011111111001000010111101000011111011111001010010111101110011101", + "1011000001110101001110011000100011011000001101011001001100001101000001110010100110100001101101011000001100111010101001010000101111010001001100111110010100111001001101001", + "1011101100100100000001011101001111010110000011010111100011100010001111100101001110101111100011010110000010010101010110011010110001111111100010110000011010110110000011001", + "0101000110001101111000010111101000110101100000110100000100000001000100100100100101000101111001000010111101010100110101111001010010011010000001010011111001010101000000101", + "0010011110100100011001110100001110001101011000001100111110101001101101011000001101010101000001110010100111101000001101011000001100111010111001001001001001001101111000010", + "1100010000101110010101111111011101010010001011100101001000001111100011010110000011111011001111111100101001110110000011010110000010010101001110010010001011110101110111100", + "0000111000101100110111101000011001111001001010000110101010101101100000110100100100011000100100111101000010111100111001010011111001010100101101111001001010011110110100000", + "1111110011000111001101111100100010000001110010111110010100010101011000001100111110111001001101011000001100100100100001101011000001101000010101000001110010100110101010111", + "1010011101011100100011000100010000101111110100010010010010000011001111100100101000010111100011010110000010101100101111110100001011110110010011001111110100001010100110010", + "0110100110011010100111110101001110110101100000110100100001100000101100000111001010110100000000110101100001010111000100111101000010111100100001010011111000110101000000100", + "0000111101111001011000000110010101001101011000001100111000111001010000111110010100001100111000001101011001001110001101000001110010100100111001101011000000001101011000010", + "0011110001111111001110100001011111100011010110000010110010110111110100010010010010010011001111100100001011100010000011001111111100101100110111100101001110000011101110011", + "1100111010001101110010000001100010000000110101100001010011000100000110110101100001111000101100000111001010000101100000110101111001010111010100100100100101100000001101111", + "0111000011110111001010101100000111001001010000111110010011010100111110001101011000100000010100111111110010101101011000001101001001001111010101001001010000101110110100111", + "0100001110111010000001011110101110001111111100110000011100011011010110000010010010101110010010010011110100001010001111100101001110000011111011001111111100101000010010110", + "0010010011001010100000000001001111001100011111010011111001111000110101100001010011010010100100110101111001001001001100000110101101100100011000101100011111001011000101010", + "0001001101100111111100001111011011110100101111001001001001001110010100111111110011001010111110001101000001110111110100111111010001001100101000010100101111010001111111001", + "0000010010101100010101010011101000000011010110000011010111001000011010110001111100000100110000000011001111100001110010010011110101001010010111100101001110000011110001010", + "1110011110010100110111101011100000100000110101100000110101001010111101010011111001100101010011100000100100100011100000110100011111001001010100000110101101100000010011011", + "1011100010100100010001101010011100111000001101011000001001110000101111001001001001001000010100111111010001011001011000001100100111110111101100111110010101011001010100000", + "1010001000111011000100110111010100110110000011010110000101110010110000000011001111001110011010110001111101010011010010000011001111100001100010010010010011010111011011101", + "1010100010011010100111000001101011100010111101000011111110111001010011100000101101001101111001010010011110100000110011100000100100100010111000110010111101000010111001010", + "1111111111100001011010000101101111110010100111110011000111111000001101011000010000111111001001001000101110011111110010111110010101011011111000001010100111110011111111101", + "0100100011011100010110110111111000111100101001111101001110001110000011010110010100100010010010000011001111101000111100110000011011010010001110000100101001111100100011100", + "1110101011101010010001110010111010111101000010111100100010101011111001010011111111101011010011100000101100001010111001010010111100100110101101100101000010111101101010100", + "1001100011110111001110010000101000111000001101011000010010001011000001101011000110100011101011011000010100111000101001001000101110010010001000111110001101011000100010101", + "1010111111100010000001000101011111110110000011010110011011111100001011110101001110111111100101010110010010001111110110000100101001111011111100110000000011010110111110101", + "0100110010101001111100000111111001010101100000110101111110101101000010111100100100111001111001010011111100111100110101100111001010011111001111010011100000110101000101001", + "0001111101100000011111101100100010001101011000001101001000010001101011000000010101011111000001101011000110001100101001011110010100111001110111001001011000001100101001010", + "1110010100001100010001101110010001010100001011110101001010010111100101001110011010110001001111100101001000011010100101010010010010010101110110000100001011110100000101100", + "0011101100001100110111101100101111111111001010011110101111111101100000110101111100110010100100100100100011100001011111010011100000110010100101100111001010011110000110000", + "1101110110000111001101101101111100100111110010100110010100100101011000001101001110101001001001001110010100101000000111101011011000001100111101011111110010100111011110111", + "1000111001011100100111010111110111001011110100001010010100101101001111100101001001110011100101001000011010111110001111100101010010010000110011010011110100001010001110010", + "0111110110011010100011110110110011010101100000110101111011000110101100000110101011111000000110101011111001010101100100100100110011111101010101010011100000110100001101000", + "0010001110111001011010010001001110001101011000001101000001010111010000101110010101100000111110010001001001010101001101011110010010100001010111101011011000001100010101110", + "0001000100011111001010100010101111100011010110000011001000011011110100001010010010001111001111100101010010001010000011010000011100101001111001100101010110000011110011111", + "1100011000001101110010000001001111100000110101100000100101111100000110101011111000110010101100000110110011100001000100100011111001010100011010100100110101100001000100111", + "0101000111010111001010110011001010001111010000101111010011001100111110010011000001101010010100111110001011000001111110010001001001001110101100111110010000101111011111011", + "0101011010111010000001011010011001001001111100101001111011001011010110000101001110000100010010010010000101010111101001111101010110000101010010110000011100101000110001010", + "0000010011101010100000000100010001001010011111001010011111001000110101100100100101000100100100100011111001000101101010011110110101100000110001010011111111001010110010110", + "0011101010000111111100001101001100010000101111010000101001110110010100111110001100101000111110010011000001100101010100111110001001001010001001001001001111010001010100001", + "0001000000101100010101000000000101100011010110000101001001100000011010110000000011001110110000011101001111100011010010010010000101001010000011110011010110000010111011110", + "1111101011010100110111111101000011100000110101100110101100100010111101000010100000001101010011111100100100111000100001010011111111001100111010011000110101100001111000011", + "1010010111000100010001111000010100111000001101011110010011011000101111010000111001010100010100111110001101010001011001101011000111110010100010100000001101011000101000100", + "1010101110111011000100110110111001010110000011010010010011010010110000011100101110000100011010110000000011010111110011110101001111100010101100001110000011010111110010001", + "1000100010111010100111011110100111100010111101000010100110100001010011111111001100000111111001010011100000101100010010111100100100100011000001010011111101000010110010110", + "1110001001100001011011100110100010010010100111110010111000010000001101011110010101011111001001001001011000001100110010100000001101011110001001101011000111110011101010001", + "0110100101011100010111010100000111111100101001111100110001111110000011010010010011110010010011110100001111110010011100101110000011010110000111100101001001111100000100000", + "1110111111101010010001100111101111111101000010111101010111111011111001010011100001111111010010011111001100001111111001010101100000100011111100100100100010111100111111100", + "1010100011110111001111111000001000111000001101011110010010001011000001101011011000100011101010100111110100111000101001001101011000010010001000101000001101011001100010101", + "1001101011100010000001101000111010110110000011010000011010101100001011110100010110101011100100001011110010001010110111100101001111111010101100101110000011010110101010101", + "0111100010101001111100110011011000110101100000110011111010001101000010111101010101100011111001010101100000101000110100000110101100011110001111001101100000110101100011001", + "0001111111100000011111001111101111101101011000001001001011111001101010100111110100111111000001101101011000011111101000101111010100111011111111010101011000001100111111010", + "1110110000010100010000101000000111010100001011110100010010101111100100101001111010010011001111100011010110001111100100001011110010010111010111100101001111110100101110000", + "0011111110001100110111001011011011011111001010011111010001010101100001010011111000111000100100100000110101110010011111001100000000110100110100000110101100011111001101100", + "1101000110001111001101001111001110000111110010100111101001001101011001001001001000000001001000101111010100101010100111110100111000001101010100111110010100100110010101011", + "1000001101011100100110010001000111101011110100001011100110000101001111100011010110001111100100101001111010100100001111100011010110010011111010010010010010001010010011010", + "0111010000000010100010010101100111100100100001010011111101100110101100000000110101110010000111001010011001000101000100100000110101111000011100100100100000110101100101010", + "0010001110100001011010110011100010010100111001101011000101001111010000101001001000101010111111010000101001001001110100111110010100100000101110010100111000001101011111101", + "0001010010010111001010000101110001011010110111100101001011001011110100001111100100100101001111100011010110001111111010110000011010101111010000011010110110000010010001100", + "1100011010001101110010100010001001011001010100100100100100101100000111001010011111000100101100000000110101101100111101000010111001010100110011111001010101100001010010100", + "0101100011001111001011110011011100011111010000101001001110010100111111110010100111001000010100111000001101010100101111010000101001001100001100111110010100101001110101011", + "0001001000111010000000011101101101110001111100101111100000000010010111100101001110001110010010010110000011000100101000011010110110000010000010110000011010101111111011010", + "0100100011100010111001000010100011110010011111001100000011100001010100100100100101101100111101000010111101000111001011111001010101100000111001010011111001001101111000110", + "1011011110001111110100001010011100101000101111010100111101011111110100111000001101010100100111110010100111111111010101011000001101011000100001001001001001010001001000001", + "0101100110101100010101100011010001010010010111100101001011010001111010110110000011000100101001111100101001110011110011010110000011010110101010010010010110000011010011100", + "0111101011001100101110011110001111111001010100000110101000100010111101000100100101000111000010111101000010110100011001010011111001010101000011111001010101100000110010000", + "0110000001010100011001111110101010000001101100111110010000010000101111010100111111111111010101011000001101001100100001101011000001101100010011000001101101011001001010111", + "0110101100110010011101010100111111101111100010010010010010011010101001111100101001110011111011010110000011000010001011110100001011100010011101001111100011010111100100010", + "1100000110110011001111111110110001110010111101000100100011111001001010011111001010100100011000110101100000100001000010111101000010100001111001010011111001010100011000100", + "1010011011101001000011000110110110101010100111110100111011011001010100111110010101010100101000001101011000011111110011000001101011011001001001101011000001101100100000001", + "1110010101010100000111110100010101000100101001111010110101010111110010010010010011011010001011110100001011110001111101001111100101010110001111100101001111100011001110010", + "0010111011110010101001100111110001000101000010111001010000110010011000110101100000111001001010011111001010010011111000110101100000110101001100100100100100100000100101100", + "0010110101110110100110111000001010001001010000111110010000001010100000001101011000011111110010100111110010101001001000001101011000001101110001001001001001011000001000111", + "0001111111101010011000101000101111101111111100110000011111111100001010010010010011111111110100001011110100001111101111100101001111100011111101001111100101010110111110110", + "1011100010110000110100010011001000101100011111010011111110001101000011111001010011100010111000110101100000101000101100000110101100000110001110101100000110110100100011010", + "1101101011101001000110001111101010110100101111001001001010101001110010100111110010101010100000001101011000001010110000101111010000111010101110010100111110001101101011001", + "1010100010000101111001001000011000100101001010010010010010001111111100101001111100100010101110000011010110011000110100001011110100010110001111100101001110000010100010010", + "0011111110000010111110101011011111100110101011111001010111111100111101010011111001111111000101100000110101111111100110101100000110110011111100000110101101100001111111111", + "0101000110001001001100101111001010011110010011000001101011001100101111001001001001101011010000101111010000101000011110010100111110001110101100111110010101011000011111000", + "1000011011000110100111010001001111010010010101001111100111001100101000000011010110000101111100101001111100111110010110000011010110000111001010010010010011010111110001001", + "0111010010011110111011010101101011000100111101010011111010101111001011100000110100100100011111001010011111000100110101100000110101100110101100100100100100110011010011010", + "0010101010110100110011110011101000010100100111101011000110010110010001001001001001101000101111010000101111000100110100111110010101011000010110010100111110001011010101101", + "0001000000000111101010100101111101111010101001100101001010000010010101001111100100001110010010000011010110010100111010110000011011010010010000011010110000000100111011100", + "0000101010000010000001100010010001111001000010100100100111100011111111001010011110001101010011100000110101101111011101000010111100100110111011111001010011100100111000100", + "1001010111011011111000010011001110111110010001001001001000111011000111110010100111010101101011011000001101001110001111010000101110010000100100111110010101011001001001001", + "0101011110110111001100011101100011010000011101001111100010110100001011100101001110100101100101010110000011011010010000011010110000011100101010110000011011010110110011001", + "1000010011100001000001000010100011110011111110101100000111000101000010100100100100100111111101000010111100100101110011111001010011111011000001010011111000110101110010101", + "0011101000011111111100001010010100001001001110010100111101010111101011011000001101111111000111110010100110001101001001011000001101011100010001001001001000001100101010010", + "0001010100101000001011100011011101110100001011110101001100011001100101010110000010010011001001111100101000011010000101010110000011010000011010010010010010010101100101100", + "1111111111011001111010011110000101111111001010011110101011111011100100100100100100010100100010111101000011110001011111010011111000110101111011111001010011111110111000000", + "1010100011011101110101111110100110100111110010100110010001011001011110010100111111001101001001011000001101010111100111101011000000001001001011000001101011000111100000111", + "0110101100110100110111010100100011001011110100001010010001010101001001111100101000100011100101010110000011001001101011110100001010010000010101001111100101001010001110010", + "0100110010110110010101111110100101010011100000100100100101010110101010011111001010100000000110110101100000100011100010111101000011111101010101010011100000110100100100100", + "1110011101001010010111000110111100001011011000010100111001101111010000101110010101111110111110001101011000000001001011000001101011000111101111101011011000001101110000010", + "1110110100010111110111110100010001000101010110011010110001110011110100001010010010010001001011110100001010010011000101001111100101001101100001100101010110000011011100011", + "1110011100110000010001100111110011100100110101111001010000111010000110101101100000010010101010011111001011100000100100110101100000110001111010100100110101100001010111111", + "1010010110010001010110111000001100101111010000101110010111000010111110010101011001001000010010100111110011000001011110001101011000001011000001001001001000101110100110111", + "1001001001001101001010101000110111001001111100101000011101001101010110010010010010100100010100001011110101000111101001100101010110000011001101001111100100101000001010110", + "0111000110110010011010010011000011001010011111001011111100110100110101111001010010100110100100100101100000111010001010000110110101100100100110101100000111001010001011010", + "1100111110101111101100010111111111110000101111010001001011111110010100100111110010111110111110010101011000011111110000101111001001001111111110010100111111010001111111001", + "0000100010100110100011000000001000100101010110010010010110001000011010101001111100100010110000011011010110001000110100001011100101001010001011100101010110000010100010010", + "0011101011100111111100110011011010100110110101111001010110101010111101000011111000101011010011111000110101101010100110101100000111001110101010000110110101100000101011111", + "0110100011001100101010100111011000111110001101000001101010001000101111010001001001100010010100101111001001001000111110010100111111110010001010111110001101011000100011000", + "1011111111100110100111001001001111110010000011001111100011111010110000011011010111111110011010101001100101011111110010010011010111100111111100010010000011010110111111001", + "0110010010011100111101010101100111100010111101000010111101100001010011111000110100110011111001001010000110110111010011111000110100100010100100100100100101000010111110110", + "0010011110010110010001111011111010110010100111110010100110111000001101001001001000001001001001010000111110001110010010100110001101011010111110010100111111110010001110101", + "0001000110000100101000111101101011011100101001111100101000110110000011001111100101100100010010010011010111110010011100101000000011010100110000011010110001111100001011000", + "0001101011000010000001111010011001111101000010111101000011000011111001001010000110000111010011111000110100011101111001000010100100100101010011111001010010111101101010000", + "1011110001111101111000011011001110011000001101011001001101010011000001110010111110111111101011000000001100100101001001010000111110010000010000101000001101011001010011001", + "0101001101010001001010000101100111110110000011010111100010011100001011110100010110010011100101001110000010001010010110011010110001111110011100101110000011010111010101001", + "1011110010000001000111001010111001110101100000110100000001111101000010111101010100110011111001000010100100110001010101111001010010011101111111001101100000110100111100101", + "0011011100111101111100001010010110101101011000001100111001011001101011000001101100001011000001110010111110001111101001001000001100111101001111010101011000001100000110010", + "0000010111101010001011110011011001110100001011110100010011010111100101001111100010000101001111111100110000000001100101001110000010010100010110010010001011110100001000000", + "1100011010111011111100010110000111111111001010011111010011010101100000110100100101100100100100111101010011100011111111001101100000110111010101111001001010011111100011100", + "1010010110011111110011100110100001000111110010100111101011101101011000001100111110101111001001001001001100101001000111110101011000001111101101000001110010100111010011011", + "0101011111110100110111001100101110101011110100001011100101110101001111100100110000101001100101001111100010101011001111110010010010010011100011001111110100001010111111010", + "0100010000110000010101110111111010110101100000110100100000111110101100000111010011001010000110101100000001001000100100111001010011111101111101000101100000110101111100100", + "1100011110001010010001010100001100101101011000001100111001000111010000101111001101010000111110010100111001010001001101000001110010100101000111110101011000001101101010010", + "1111000100110111110001111011101110100011010110000010110111001011110100001011100010000101001111100010010010000111100011001111111100101011001001111011010110000011110010011", + "1101111001010000010001101010001010000000110101100001010100110100000110101100000001100110101100000001010011100010000100100100111001010000100010111000110101100001110011111", + "1010000100110001010000100110000011001111010000101111001000001100111110010100111001011110010100111001101011011010111110010100101001001110001101001001010000101111001011011", + "1010101100001101001010100011010001101001111100101001100101100011010110000010010011010010010010010111100101010101001001111010110110000000000011001111111100101001000101010", + "0101110011110010011110011001001100001010011111001010000110000000110101100001010011000100100100100100111001000100101010011001010101100011100000101100011111001010111000110", + "1110001100101111101100010001110101110000101111010000111110111110010100111001101011110100111110010100100001110000010100111001001001001001011000010100101111010001000000001", + "0010100010000110100011000001001100000011010110000011010110010000011010110111100101111010110000011010101111111110010010010111100101001011001010010010010110000011101111110", + "0001111111100111111100111101101111100000110101100000110111111010111101000100100100111111010011111001000100111111100000110100011111001111111011111001010101100000111110011", + "0100100011101100101010100100101000111000001101011000001010001000101111010100111111100010010100111001001001011000111000001100100111110110001011000001101101011000100010100", + "1011101011100110100111011010001010110110000011010110000110101010110000011010101000101010011010110111100101001010110010010010001111100010101101001111100011010111101010001", + "0111100011011100111101001110111000110010111101000100100110001001010011111001001010100011111001010100000110101000110011111001000100100110001000110010111101000011100010110", + "0001111111010110010001111000111111101010100111110100111011111000001101011000010001111111001001001100111110001111110011000001101101011011111000001010100111110010111110001", + "0011000111000100101000101110100111100100101001111010110010000110000011010110010100101110010010010010001011111010011101001111100011010100011110000100101001111100010010000", + "0011111101000010000001111100000000000101000010111001010111100011111001010101100110110011010011111001001010000001011000110100100100100011111101100101000010111100000101100", + "1001010111011101111000011010111111111000001101011000010101011011000001101101011110101011101011000001110010101111101000001100111110010101001001001001001101011001011110101", + "0111011111010001001011101100000001010110000011010110011101010100001011110010010011100101100101001111110100011001110110000100101001111001010101001111100011010110010000101", + "1001010100000001000110001001011110110101100000110101111001010101000010111001010011100101111000110101100100110011110101100111001010011100110110101100000000110100010011001", + "0000011110111101111100100010100001101101011000001101001011101001101011000001110011101001000000001101011110010001001001001111010000111000001110010100111000001100010101010", + "0001010101101010001011011000100110100100001011110010010111100111100101001111111100001111001110000011010000001101000101001011110100010000000110000100001011110101111010000", + "1100011110111011111100110110111011000111001010011001010010100101100000110101111100101100100101100000110011100110111110101100000110110101111101100111001010011111011001100", + "1000010100011111110011010111111100011111110010100001101101011101011000001101001111110101001001001111010000100111000110010100111110001111000101011111110010100111001001011", + "0101001011101100110111001110110111010011110100001111100001010101001110000011010000000101100101001001111100110011101110000011010010010101001011010011110100001010110011010", + "0100110010100000010100010011010011010101100000110101111000110110101101100000110011000110000110101010011111000010000101100000110011111000100100100100100100110100110011000", + "1100001100010010010001010111011010001101011000001101000110001111010001001001001000111110111110010000101111000010101101011110010010100010001110010100111110001101001011110", + "1111100010111111110000011111101000000011010110000011001111100011110101001111100101010011001110000011010010000101000011010000011100101010000000011010110000000010100101111", + "1101111011011000010001101111001100000000110101100000100110000100000110101010011110000100101101100000110011111100100100100010111101010101100011111001010011100001111000111", + "1010000110101001010001100011111101111110010001001001001100111100111110010010100111010100010101011000001011010110011110010000101111001011011100111110010000101110100001001", + "1010101000001101001010000000001101110000011101001111100100010011010110000101001110011010010011010110000101010000010000011010110000000010001010110000011100101001101111001", + "0101110001101010011110111010010001110011111110101100000000110000110101100100100100011000100100100010111101001010110011111001010011100011001001010011111111001010100100101", + "1110011000110111101100010101101100001001001110010100111010001110010101011000001101011110111110010010100111101000101101011000001001001111110001001001001111010001101000010", + "0010000100010110100010100101100101110011010110000101001110010000011011010110000011110000110000011100101001110100100011010110000101001111110010010010010010000100000101110", + "0011001001111111100100011010110111111000110101100110101011111011111100100100100101010011010011111101000010101111000001010011111111001111100011111001010011100110100110011", + "0000100001100100110011000100110011000000001101011110010100100001001110010100111110001000001101011000001101011110011001101011000111110101011011000001101011011111111110100", + "1101111101100110111110011001101111101110000011010010010011111011010000011100101001111110000011010110000011001111110011110100001011110111111101001111100101010011111110001", + "0000000011010100110101101110001000110011111100100100100010001000110011111111001010100011100000110101100000111000110010111101000010111010001001010011111101000010100010100", + "1111111001011110011001111011001010101011000110010100111110101000001101011110010101101011011000001101011000011010101011000001101011000010101001101011000111110010101010010", + "1000001001011100111000001100101000100101001000011010110010001110000011010010010010100011010011110100001011101000100101001111100101001110001111100101001001111101100010011", + "1011101001010011001000111000011111100100100011111001010011111011100000110101100000111110110010011111001010001111100000110101100000100011111100100100100010111101111111111", + "1011101011010101110000011110100001101000001101011110010111110011011000001101011000001000001010100111110010101001011000001101011000010000001001001001001001001110010100101", + "1011101011001000100010101100011110101110000011010000011111100101010010010010010010001110000100001011110100000101010111100101001111111100000101001111100101001000011010110", + "1000001010011001101110101001000011001101100000110011111100100100110011111001010011101101100000110101100000100110110100000110101100011110111110101100000110101011111001000", + "1111111010101100100101000010100100010101011000001001001101011000001010100111110010110101011000001101011000001110001000101111010000101110100110010100111110010001001001011" + ], + "2": [ + "1111111000011011000110111110011011000011100111010100101000000010011011011100111110001011111000000000000100111111001111010101001110001001001000101000010001011000101111111", + "1000001001111100110010000110110100010100100010101111101011111110010101111111110111000110010111110010100000001101101000011101010001100111100100101110011101010100101000001", + "1011101000011011011010010010111101101111000001001011111110011000011011101011110101110101110100111011000001111011001011111110110010000100000111001101111110110010001011101", + "1011101000000100101110110001100100011011110010101101111001001110110100010000010101011011101101111010101000100111110001011111001100101100111111010101001110001110101011101", + "1011101011011101001011101000011111100000111100001001010111111101100101100101100100111110100011011100110010101111110101010011100010001111111111110011001010010101101011101", + "1000001001010011011011101101011000110010010100011001001110001111111010010111000001100010100001000011010101011000111111010100011000101010001100011000101011111100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000010101001110011010001011000110001110111111101010110001011001010101011000010100011000010001000011111101000111100110111111011001110001111011011001000011100000000000", + "0011001111110100011111111000101111100110011111000011100011111000001001100011111001111110000000010000110111101111111101000101111100110111111100011000100011111101111010000", + "0101000000010011000110111111110010000011100111010100101111001010011011011000111110001011111000000000000100101010101111010101001110001111010000101000010001011001001100111", + "0110011011101100110010000111111100110100100010101111101011111110010101111101110110000110010111110010100000001101101000011101010001100010011100101110011101010110000010110", + "1100100000000011011010010011010100101111000001001011111100011000011011101011110101110101110100110011000001110011001011111110110010000101111111001101111110110101011101010", + "0001001010000100101110110000001101111011110010101101111001111110110100010010010100011011101101100010101000110000110001011111001100101101001111010101001110001101100111001", + "0000010101011101001011101001101000010000111100001001010001011101100101100111100101010000100011011100110010101100010101010011100010001010010110010011001010010101101000010", + "0110101001010011011011101101101010110010010100011001001101001111111010010111000000110000100001011011010101001011011111010100011000101001010101111000101011111111100011111", + "1000000001110010101000001010111000010010101100100110001101110000010001110000011000011000011001000011000100110110100111101100100000010111101101000000010011000111001101000", + "0001011011000010101001001111011111001000101001110101010100010110111111010101001111000000110110111110000001000100101011110011001010000001100011001110010101001011000011001", + "1000100111111110101011010011001111111110001010111111000010100111110110110101010011100110010101111101101001000111000010111000100011100010111101000101111100110100100001010", + "1101001100110111101001011100000111110111111001110000110000100101001110100110101101011101001100101001111011010110110011000110001010111000100111110101000110001101011001101", + "1010010110110101101100100101100010001001110111111001001010101110101101011101000011000011000010000101110111000101111101001000000100110010101001111011001000000011101011100", + "1100101111101001000011011101110000001110011111000100010100010011011001111111111001110110000000001111000101011101011100110010100001000001000010111000100011100000001010100", + "1011000110000110010000110010111011010011100111010010001010000110111110111100111110001011111000000111101001110111001110001000111001010001001101001000010001001110110010101", + "0000011111100101101101011011001100001100100010101011111011111001001100100001110110000110010111101101100011111101101000000010101110011111100011001110011101001001010100101", + "0101100100011111000101100111010101111111000001001111100000011101111100011101110101110101110100101110101001011011001011100001001101111010000000101101111110101010100001001", + "1010001000011001110010010100000100000011110010101000001111001101100100001110010100011011101101100101011010011111110101001000010001011010111000010101001110010000011001010", + "1110010001001000011101100101100001001000111100011001110100010001000000000011100101010000100011001011011111110001110011001110010101010100001011110011001010000010010111100", + "0000101001011010000100110001110010011010010100000101011101001000100011001011000000110000100001000100010110111011011000101011100111010101001010011000101011100000110100000", + "0001000101101110110111111110111001010000101100100010010001110101110110000110011000011000011001011110101100011110100000010011011111101001110010100000010011011000101000111", + "1010011001011111110101101011000110111110101001111010100010100101101111001001001111000000110110111001110011101011101010000100010111110111110100001110010101010110100100010", + "0110100011101011111101011111010110111100001010101111100111101011010011010001010011100110010101101010000100011010100011100101010100111100100000100101111100100011000111000", + "1111111110111110110110000000011111110101111001111000100011111010010111111010101101111111001100110110111000101111110011011001110101000011111000010101000110010010111111110", + "0011100010101001110011010001101000101101110111111001010010001011001010101011000010100011000010011010011111101000111101010111111011001110001110011011001000011100100011111", + "1111101011110100011111111001101010101110011111001101100010101000001001100011111000101010000000001000110111111010111000100101111100110010101101111000100011111100101010111", + "0101100010010011000110111110111000110011100111000010101010001010011011011000111110100011111000010100000100111000101000010101001110001110001010101000010001011001100010111", + "0110111111101100110010000111001111101100100010110011101111111110010101111101110110111110010111110000100000001111101110011101010001100111111010101110011101010111111110110", + "0100100000000011011010010011000010111011000001001111111011001000011011100011110100010001110100110101000001100011001101111110110010000001010001001101111110110100110011010", + "0001001000000100101110110000000000000001110010100001111101110110110100011010010101111001101101100100101000100110110001011111001100111011101001010101001110001101001101001", + "1100010011011101001011101001111111001010111100011001010010010101100101110111100100000000100011011110110010101100110101010011100010010011100110010011001010010100100011110", + "0010101111010111011011101101101111111000010100010101001100100111111010010111000000000110100001011111010101001111011110110100011000110100111101111000101011111111100000011", + "1000000101110000101000001010100111110110101100100010001000100000010001110000011001111100011001000001000100110110100110001100100000001010100101000000010011000110111000100", + "1001011111000010101001001111001010011000101001111011010110101110111111001101001110100010110110111110000001000101101110010011001010000010101011001110010101001011110010001", + "1000100111111000101011010011001000011110001010101111000110010111110110110101010010110110010101111001101001011101000101111000100011100011000001000101111100110010110011010", + "1101001110110011101001011100010011010111111001101000110010000101001110111110101101101011001100101011111011010111010101000110001010111111001001110101000110001011101011101", + "0010010110110011101100100101110100001101110111111001001101111110101101001101000010100111000010000011110111010101111011001000000100110111100111111011001000000100000101100", + "1100101101101101000011011101101101101100011111001100010000011011011001111111100000010100000000001001000101001011011100110010100001010110000100111000100011100100100000100", + "0111000000000100010000110010100100010001100111000010001001001110111110111100100111011011111000000101101001110111101110001000111001001000111101001110010101001111111000101", + "0100011001100001101101011011011001001110100010100011111010010001001100100001111110110000010111101001100011111001101000000010101110000010001011001000011011001001010110101", + "0101100000011101000101100111001010011011000001001111100101001101111100011101110100010001110100101100101001011011001011100001001101100111001000101001111000101011010101001", + "0010001100011001110010011100010001000011110010100000001101110101100100010110001101111101101101100101011010011110110101001000010001011001110000010011001000010000101001010", + "1110010001001110011101111101111110101000111100011001110000100001000000000011101100000010100011001111011111101011110011001110010101010101110111110011001010000100000101100", + "0000101011011110000100111001111110111010010100000101011111101000100011010011001000000000100001000110010110111010111000101011100111010010100100011000101011100110000110000", + "1001000101101000110111100110101111010110101100100010010110100101110110010110010001111010011001011000101100001110100000010011011111101100111100100000010011011111011110111", + "1010011011011011110101110011011011011010101001111010100110101111101111001001001110100110110100111111110011111101101010000100010111100000110010001110010101010010010110010", + "1010100101101001111101010111001001111100001010101111100100100011010011010001011010110110010111101000000100011010000011100101010100100101010000100011111000100010010101000", + "1111001010111010110110000000000010010101111001111000100001001110010111111010101101101011001010110010111000100010110011011001110101011001010000010011000000010010001101110", + "0011010110101011110011000001111100101101110111111001010010111011001010101011010010100111000100011010011111101101111101010111111011010001111110011101001110011101100011111", + "1111111111110100011111100001111111101110011111001101100011111000001001111011100001111110000110001000110111111111111000100101111100110111111101111100100101111101111110111", + "0101100010010101000110111110111000110011100111000010100010001110011011011000110111100011111010010100000100101000101000010101001110001010001100101000010001011110100010111", + "0110101011101000110010011111001010101100100010110011111010101100010101100101111110101010010001110000100000001010101110011101010001100110101010101110011101010000101010110", + "0100100010000101011010010011001000111011000001001111111010001100011011111011111100100011110100110101000001111000101101111110110010000010001001001101111110110010100011010", + "0001111110000000101110101000011111100001110010100001110011111100110100010010010100111111101111100100101000111111110001011111001100111111111001010101001110001001111111001", + "1100010111011111001011100001111010001010111100011001011101001101100101100111101101000100100001011110110010100101110101010011100010010000101110010101001110010101010011110", + "0010101111010111011011101101110000011000010100010101001011010011111010010111000001110110100111011111010101010101011110110010011000110011000101111110101101111110110010011", + "1000000111110000101000011010111011010110101100100010010000000000010001110000001001001100011111000001000100101111000110001010100000001001001101000110010101000111001010100", + "1001011111000010101001010111000100011000101001111011001010111110111111001101010111000010110000111110000001010101101110010101001010000011100011001010010011001011100100001", + "1000100101111000101011010011010101111110010100101111001101111011110110110101011011110000010111111001101001000011000101111100100011100000000001000101111100110010000001010", + "1101001000110011101001000100011100010111111011101000100010101111001110111110100100011011001010101011111011010111110101000110001010111000111001110101000110001010111001101", + "0010010000110011101100100101101001001101110111111001001011010010101101001101001010010001000010000011110111011001111011001000000100110110001111111011001000000101010111100", + "1100101001101101000011000101110010001100001001001100011000001001011001111111111001110000000010001001000101000011011100110010100001010011001100111000100011100100110100100", + "0111000100000100010000111010100001010001100111000010000110010110111110111100110110011111111010000101101001110110101110001000111001001011110101001110010101001110001000101", + "0100011001100001101101011011000110101110101100100011111101100101001100100001110111000000010001101001100011101011101000000100101110000101110011001000011011001000000100101", + "0101100010011101000101110111010110111011011111001111111101101101111100011101100100100001110010101100110001001010101011100111001101100100100000101011111000101010100111001", + "0010001100011001110010001100011111000011100100100000010001100101100100010110001100011001101011100101000010001110110101001110010001011000111000010001001000010000111111010", + "1110010011001110011101100101100011001000100010011001111011001101000000000011101101000110100001001111010111101101110011001010010101010110110111110011001010000100110111100", + "0000101101011110000100101001110001111010000110000101001111000010100111010011001000110110100111000110011110111010011000101011100111010101010100011000101011100111010100000", + "1001000011101000110111111110110010010110101100100010010000001001110010010110010000001010011001011000111100000010100000010011011111101101010100100000010011011110001100111", + "1010011111011011110101110011000100111010100111111010101110111111101111001001001110100110110100111111111011110101101010000100010011100101111010001110010101010010000010010", + "1010100001101001111101010111001100111100001010101111101011111011010101010001011011110010010111101000000100011011000011100101010010100110011000100011111000100011100101000", + "1111001010111010111110000000011101110101110111111000100110111110010011111010101100100011001010110010110000110000110011011111110011011110101000010011000000010011011111110", + "0011010100101011111011000001100000001101101001111001001011011011001100101011010011111111010100011010000111111100011101010001111101010010010110011101001110011100010001111", + "1111101001110100011111100001110010101110001001001101111100001000001111111011100001110100010110001000101111100011111000100011111100110101010101111100100101111101010010111", + "0101000000010101000110111110111000010011111001000010100000010110011001011000110110001101101010010100001100110111101000010001001110001101101100101000010001011111101100111", + "0110111111101000100010011111011111101100110000110011111011111100010001100101111110111110010001110000101000001111101110011101010001100011111010101110011101010001111110110", + "0100100010000101001010010011011000111011000001001111111010001100011011111011111101100011110100110101010001111000101101111110110010000110001001001101111110110011100011010", + "0001101010000000110110101000011010100001111100100001110010101100110010010010010100101011101111100100100000101010110001011111001000111010101001010101001110001000101011001", + "1100100011011111011011100001101000101010111100011001011010001101100011100111101100100010101001011110110010101000110101010011100100010110001110010100010110010100100011110", + "0010111111010111010011101101101111111000011010010101001011111011111110010111000000111110101111011111011101001111111110110010011110110011111101111111010101111110111110011", + "1000000001110000100000011010110100010110110010100010010010101000010111110000001100011010010111000001011100100111000110001010100110001110111101000111111101000111111000100", + "1001011001000010101011010111010001011000111111111011001101010110111001001101010101111000100000111110011001001000001110010101001010000110001011001011111011001010010110001", + "1000100001111000101101010011001010011110010100101111001000001011110100110101011011011000010111111001100001010011100101111100100011100111001001000101111100110010110101010", + "1101001100110011111101000100000001010111101011101000100000010111001010111110100111111111010010101011110011011111010101000110001010111001110001110101000110001011101001101", + "0010010000110011111000100101111110101101110111111001001011100010101101001101001010111000100010000011100111011011011011001000000100110011110111111011001000000101000101100", + "1100101011101101011001000101101110101100010001001100011101101001001111111111111110001001000010001001001101011010111100110010100101010110100100111000100011100101000110100", + "0111000100000100000100111010110111010001100111000010000101100110111000111100110100111001010010000101101001111110001110001000111111001000111101001111001101001110111110101", + "0100011011100001100001011011011011001110101100100011111001001101001000100001110110010111011001101001101011100100001000000100101000000100110011001001100011001000010110101", + "0101100100011101001111110111011001111011011111001111111111000101110010011101100001110111011010101100110101001011101011100111001011100011010000101010000000101010010101001", + "0010001010011001110100001100001010000011100100100000010110001101100010010110001110100010011011100101000100010011010101001110010001011101010000010000111000010001001101010", + "1110010111001110011111100101111100101000100010011001111110111101000010000011101101101111000001001111010011100101010011001010010101010001111111110011001010000100000011100", + "0000101001011110010110101001101100111010000110000101001101111010111111010011001010010011011111000110011000110010111000101011100111010100011100011000101011100110000100000", + "1001000011101000100011111110100101110110101100100010010000111001111110010110010001100011111001011000111100000000000000010011011111101000101100100000010011011110011110111", + "1010011101011011101111110011011000011010100111111010101011011111111001001001001000111111110100111111111001101100001010000100010011100000010010001110010101010011110000010", + "1010100001101001101001010111011010111100001010101111101000001011010101010001011001010100111111101000000000010011100011100101010010100101010000100010100000100011010011000", + "1111001000111010111010000000000000010101110111111000100010010110010011111010101101001100000010110010110110111111010011011111101011011111101000010010111000010011001101110", + "0011010010101011111001000001101111001101101001111001001001110011000100101011010111000001101100011010000111111101011101010001100101010101100110011100110110011100100011111", + "1111101111110100011001100001100111101110001001001101111011100000001111111011100011001111110110001000101111111110111000100011100100110000111101111101010101111100100000111", + "0101000100010101000100111110100111110011111000100010100101100110011001011000110110110100011010010100001100111110001000010001011110001010100100101000010001011111011000111", + "0110011111101000100000011111011010001101110000010011111011001100001001100101111100100101101001110000101100000100010110011101010001100010101010101110011101010000110010110", + "0100100110000101001110010011001000011011000001101111111101010100010011111011111100001110010100110101010001101101110101111110110010000101000001001101111110110011110011010", + "0001111110000000110100101000011111100001111101100001110011111100100010010010010010111110101111100100100010111111101001011111001000111111111001010101001110001000111111001", + "1100100011011111011111100001111000101011011101011001011010001101100011100111101110100010001001011110110110101000100101010011100100010010001110010100010110010101100011110", + "0010101011010111010111101101111010111000111011110101001010101011111110010111000001101011101111011111011011011010100110110010000110110110101101111111010101111111101010011", + "1000100011110000100010011010111000110111010011100010010010001000011111110000001100100010110111000001011100101000111110001010111110001010001101000111101101000110100010100", + "1001111111000010101111010111001111111001011110011011001011111110111001001101010100111111000000111110011001001111110110010101010010000111111011001011100011001010111110001", + "1000100011111000101001010011010110111110010101101111001001101011110100110101011010101001110111111001100000000010110101111100110011100010100001000101111100110010100111010", + "1101001100110011111011000100000111010110101011101000100111100110010010111110100110111000110010101011110110010110001101000110001010111010111001110101000110001010011111101", + "0010010010110011111000100101100011001101110111111001001101001011000101001101001011110110100010000011100111101100000011001000000100110100110111111011001000000100010111100", + "1100101101101101011001000101110001101100010001001100011101000000101111111111111111010111000010001001001111101011100100110011100101010101010100111000100011100100110100100", + "0111000010000100000100111010111010010000000110000010000000001110011000111100110100000011010010000101101101101011011110001001011111001001010101001111001101001110101100101", + "0100011111100001100000111011000100101110001101000011111010111101001000100001110111001111011001101001101101001101010000000101010000000111111011001001100011001000100010101", + "0101100000011101001110010111010100111010111110001111111111111101010010011101100001110011011011101100110001011010110011100110110011100100011000101010000000101011000101001", + "0010001010011001110100001100010101100010000101000000010000111100000010010110001111100010011010100101000010000000001101001110001001011100101000010000111000010000011111010", + "1110010101001110011111000101100000001000100011011001111111011100100010000011101100011111000001001111010110110100000011001010000101010100010111110011001010000100010001100", + "0000101001011110010110001001101010111011000110000101001110001011111111010011001011010101011110000110011011111011100000101011100111010111010100011000101011100111110010000", + "1001000001101000100011111110111000010110101100100010010000010000111110010110010000101101111001111000111100110111011000010011011111101111101100100000010011011111001100111", + "1010011011011011101111010011000111011010100111111010101101110111011001001001001001100001110100111111111001011101010010000101010011100011100010001110010101010010000010010", + "1010100111101001101001110111010111111101101011101111101001100010010101010001011001101110111111001000000000000100110011100100110010100100111000110010100000000011000001000", + "1111001100011010111011100000011111110101010110011000100111100110010011111010101100010100000011010010110110010010001011011110001011011100100000001010111001010011111001110", + "0011010110101011111000100001100010001100001000111001001111001011100100101010110111000101101100111010000111101100000101010000000101010010101110000100110111011101110011111", + "1111101110110100111001100001111000001111101000101101111111010001101111111011000010001111110110001000101111101011100000100011100100110001000101100101010100011101110010111", + "0101000110110101000100011110111011010011111000000010100100000111111001011001010111000100011011110100001101101001011000010001011110001111001100101000010001011111001010111", + "0110011111001000100000111111011100001101110000110011111100111101001001100100011101100011101001110000101101001001010110011101010001100001100010101110011101010001000100110", + "0100100101000100101110010011010101111011000001001111111001111101010011111010111101000000010100010101010001011010110101111110110010000010000001001101111110110010100001010", + "0001001001100001110100001000011100000001111100100001110010101100000011010010110010111010101111100100100010000110001001011110001000111000111001010101001110001001011001001", + "1100010001011111111111000001100001001011011101011001011111010100100010100111101111011000001001111110110110110010000101010010000100010010001110000100010111110101110111110", + "0010111111110110010110001101101111111000111011110101001011111011111111010111000000111111101110111111011011111111100110110011100110110111111101100111010100011110111110011", + "1000100011110000000011111010111000110111010011100010010110001000111111110001101100100010110111100001011100111000111110001011011110001110001101011111101100100110100010100", + "1001101010000010101111010111011010111001011110011011001110101111011000001101110100101011000000111110111001001010110110010101010010000010101011010011100010001011101010001", + "1000100010111001001001110011011000111110010101101111001110001010010100010100111011100011110110011001100000011000110101111100110011100110001001000101111100110011100011010", + "1101111110010011111011100100011111110110101011101000100011111110010010111111000110111110110010101011110110001111101101000110001010111011111001110101000110001010111111101", + "0010010111110011011000100101111100101101110111111001001100111011100100101100001010001110100010100011100111100001000011001000000100110101111111111011001000000100000011100", + "1100101000001100011001100101011100101100010001001100011111111001101110111111011111110011000010001000101111101010100100110011100101010010011100111000100011100100000100100", + "0111000010000100100100011010001101110000000110000010000110111111111001111100110100100011010010100101101101110110011110001001011111001100101101011111001100101111011110101", + "0100011101000000100000111011011000001110001101000011111011011101001001100001110111111111011000001001001101000010010000000101010001100000010011010001100010101000010000101", + "0101100000011101101110010111101010111010111110001111111010001101010010011100000000010101011010001101010001010111110011100110110010000101010000110010000001001010010011001", + "0010001001011001110100001100000000000010000101000000010010010100000011010110101111101100011011100101000010000111001101001110001000111001101000001000111001010000001101010", + "1110010010001111111111000101011111011000100011011111111101110100100010100010001100100001000000101110110110101101000011001010000100010001100111110011001010000101100010000", + "0000101111111110010110001000011111111011000110000101001101100011111111010010101011001111011111000111111011110100100001001011100111010100111100011000101011100111000000100", + "1001000100101000000011111110000001111110101100100010010111100000111111110111010001010101111001111000111100111010011001110011011111101110100100100000010011011111011001011", + "1010011110111010101111010011101000010010100111111100101001001111011000001001101001000101110100111110011001011100010011100101010011100100101010001110010101010010110010010", + "1010100111101001001001110111100000000101101011101110001011011010010100010001011001001110111111001000000000011011110010100100110010100001000000110010100001000010110011000", + "1111001110011011111011100000000101010101010110011010000000000110010010111010101100100100000011010010010110011001001011011110001010111011001000001010111001110011101011110", + "0011010110101011011000100001011110001100001000111011001100111011100100101010110110100011101100111011100111100001000101010000000100110011100110000100110111111101100101111", + "1111101100110100011001100001101101101111101000101110111111101001101110111011000010000001110110001000101111101010100000100011100101010100000101100101010100111100000000111", + "0110000001010100100100011110000000000011111000000010100110101111111001111001010111111010011011110101101101110110011000010001011111001010111100101000010001011110111001011", + "0111011001001000100000111110101001001101110000110001111011001101001001100100011101111001101001110001001101000010010111111101010001100010001010101110011101010000110111010", + "0110100001000101101110010011101100010011000001001000011010011101010010011010111100111000010100010101010001010111110100011110110010000011001001001101111110110010110100110", + "0001001101100001110100001000110011001001111100100011110010011100000011010010110010011110101111100101000010000111001000101110001000111111110001010101001110001001101000001", + "1110010001011111111111000001010110110011011101011001111101110100100010100111101111111000001001111110110110101101000100001010000100010111110110000100010111110100000101110", + "0011001011110110010110001001101000111000111011110111001101111011111111010111000001001001101110111111111011110100100110101011100111010110100101100111010100011110000110011", + "0000100101110000000011111010000101010111010011100001110111110000111111110001101101111000110111100000111100111010011110010011011111101000111101011111101100100111011110100", + "1101111010000010101111010111001111111001011110011000101011111111011000001101110101111111000000111010011001011111110110010101010011110011111011010011100010001010111110001", + "0000000010111001001001110101101000101110010101101111001010001010010100010100111010100011110110011100000000011000110101111100110010111110001001000101111100110011100010110", + "1111111010010011111011100101111010110110101011101010100110101110010010111111000110101010110010101000010110011010101100100110001010100110101001110101000110001011101010001", + "1000001001110011011000100001011000100101110111111110101110001011100100101100001010100010100010100101100111101000100010101000000100101010001111111011001000000100100010000", + "1011101000001100011001100001011111100100010001001110011111111001101110111111011111111111000010001110101111111111100101000011100101010111111100111000100011100100111111100", + "1011101010000100100100011000010000001000000110000010100010011111111001111100110101101101010010100011101101100111011111010001011111001101101001011111001100101000001100101", + "1011101011000000100000111111000011001110001101000001111111110101001001101001110110000001011000001111001101010101010000011101010001100101100101010001100010101100000010110", + "1000001000011011101110010111101111111010111110001100011011111101010010011100000001001111011010001101010001011100110011111110110010000110111110110010000001001001100001000", + "1111111001010101110100001100011001100010000101000011110101110100000011001110101110110100011011100111000010010010001101001110001000101110100110001000111001010011011001011" + ], + "3": [ + "1111111000001110100010110010101000000101101000001010001111110001110000000100100110101000001101011111101101011010111001010000111001010111001100101001001100101000101111111", + "1000001011110101111001011100000011001110111110101011001100010011000010110111001011111101001011010011100011010100010111111100110111111001100010101111100010101100101000001", + "1011101010111011001110010101000001010001110111001010111010100000111110101001100010011001000011000010100001000101010100011111010100011010000001001100000001001010001011101", + "1011101001011110100010110111101001111011001001011011010000100011011101111110010011010101011001110010111001110111101100101111001100101000111001010100111001010110101011101", + "1011101001010101111001101001111111111010110011010010110111111010100111011111111101111111010111111100110111111111100010001011100010001011111111110101010111110101101011101", + "1000001001000011001111101010101000111001101000011101011010001101101010000001101101100011111100111101010100111000100001001100000001001110001100011110110100011100101000001", + "1111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "0000000000001001111000100011111000100001000001111110001110001110010110011111011101100011110110000100010110001000100010101111100010101010001111111111010111111100000000000", + "0111011000110011001111011010011111110111100100110000011011111110100010010011101111111110110001100111010101111111100001000100100001000011111100111110110100111101100000110", + "1101100110001010100010111010101000000001101000001010001111110001110000000100110111101000001111011111101101011010111001010100111001010001001100101001001100101001001100101", + "0010001001110101111001010100010011001010111110101011001010010011000010110111000010011101001111010011100011010100010111111100110111111111100010101111100010101110000010101", + "0100110110111111001110000101000001010011110111001010111010100000111110101001111011011001000111000010100001010101010100011111010100011010000001001100000001001101011101001", + "1000111101011000100010110111111001111011001001011011010110100011011101111110010010110101011011110010111001101111101100101111001100101010111001010100111001010101100111010", + "0110110101010111111001100001110011011000110011010010110100101010100111011111111100110011010001111100110111110001100010001011100010001100010111110011010111110101101001110", + "0100111111000011001111110010100101111101101000011101011100100101101110000001101100101011111010111101010100111010100001001100000001001101010100011000110100011111100010011", + "1001010011010010100011110000101100111110011010100101010111001101001111000100000110110100101011011111001101000000111001110100111001110001101100100000001100100111001100100", + "0011101110000101111001100100100010100111010010000110101101111000010100100101011001101110000011010001100011001100110111110010010111110111100010001110000010001011000010001", + "0000000011100111001111001111000101101110000101100111100010011100011111101001011010000101100000110010000000110111010100111001010100111100100001000100100001000100100001000", + "1001011010101110100010001111001000010001100101110000010001001000011011101100011001000110010110001000111000001111001100100111101100100100111001110100111001110101011001110", + "0010000000001001111000111011110111100101000001111100001100010110001100011111001101101111110001110100010111100011100010101001100010101100110111111010110111111011101111111", + "0101011000110101001111011010010100010000100100110110111011001110110010010011111111011000110110011111010100000010000001000010100001010111010100111001010100111000001100111", + "1101100110001100100010111010101000000011101000001001101111110001111010000100100111101000001010100111101100111010111001010000111001001111001100101000001100101000110100101", + "0010001001110101111001000100010011001011011110101011101010010011011000110111011010011101001100001011100010010100010111111010110111100011100010101110000010101101010010101", + "0100110110111111001110011001000001010011110111001000111010100000100010101001101011011001000111010010100000110101010100011001010100000100000001001101100001001000100001001", + "1000111101010110100010111011111001111100001001011101110110100011001111111110000010110101011001101010111000001111101100101001001100101100111001010101011001010010011001010", + "0110110101010001111001111001110011011000110011010001010100101010101001011111101100110011010111100100110110000001100010001111100010001010010111110010010111110010010111110", + "0100111111010011001111100010100101111100001000011111111100100101110110000001010100101011111010100101010101100010100001001010000001001001010100011001010100011000110100011", + "1001010011011010100011100010101100111110011010100101010111001101010111000101010110110100101011001111001100111000111001110010111001110111101100100001101100100000110100100", + "0011101110001011111001101110100010100110010010000110001101111000000100100100101001101110000001001001100010110010110111110100010111100001100010001111100010001110111010001", + "0000000011101001001111010011000101101110000101100110000010011100010111101000101010000101100110101010000001010001010100111101010100100010111001000101100001000101011001000", + "1001111110101110100010011111001111110000000101110100110011111000000011101100000001111110010110010000111001001111101100100001101100111011111001110101011001110100111111110", + "0010100010011001111000101111111000100101000001111100001010001110010100011110111100100011110001100100010110011000100010101111100010110010001111111011010111111010100011111", + "0101101010110011001111010110001010110001100100110010011010101110100010010010101111101010110100000111010101111010100001000100100001000110101100111000110100111000101010111", + "1101100010001010100010100010101000100011101000001010001110001001110010000100010110100010001100111111101101001000111001010100111001010010001100101001001100101001100010101", + "0010111111101101111001010100011111101010111110101111001111111011000000110111000011111111001100010011100011011111110111111100110111111011111010101111100010101111111110101", + "0100110110110111001110001111001101110011110111001010011010100000111010101000011011001011000110110010100001001100110100011111010100011111001001001100000001001100100101001", + "1000011011010000100010110101101100111101001001011111110101001011011111111111010011010101011010001010111001101100101100111111001100111001110001010100111001010101001101010", + "0110100111011111111001100101110010111000110011010001010001111010100001011111011101001111010000000100110111111100100010010011100010010101110111110011010111110010100011110", + "0100001011000011001111110010100101111101101000011001111010011101101110000001101101000101111011100101010100100111000001010100000001010010100100011000110100011001100000011", + "1001010011000010100011110100100000011110011010100111110111001101001111000101100110100110101010111111001100100111011001101100111001101100111100100000001100100000111000100", + "0011001000000101111001100000110111100111010010000100101110010000010100100100011000001110000010110001100010110011110111110010010111110000110010001110000010001111101110001", + "0000010001100111001111001111000100001110000101100111100111001100011111101001111011111001100001010010000001001100010100111001010100111101010001000100111001000100101101000", + "1001101110110110100010001111001000010001110101110100010111110000111011101100011000101000010111001000111001001100101100100111101100100001010001110100100001110101110101110", + "0010000000000001111000111001111011000101001001111100101100010110101100011110101101111101110000000100010111111010000010101001100010101001111111111010101111111010010011111", + "0101111110111101001111011000000001010000111100110010011000100110001010010010111110111000110111100111010100000001000001010010100001010100011100111001000100111000100000111", + "1101110100000100100010111110101001100011110000001010001010100000010010000100000110010100001011011111101100100111111001001000111001001110101100101000001100101001111001001", + "0010111101110101111001000100010011001011011110101111001100101010001000110111011011110011001101010011100010010001110111100010110111100100010010101110000010101111010111001", + "0100110110101111001110011001001101110011101111001010011010100000111010101000001011001011000111010010100001001010110100000001010100000001010001001101100001001101010100101", + "1000011011011110100010111011101100111100001001011111110101001011101111111111000011010101011001101010111001101000101100101001001100101011101001010101011001010100010100010", + "0110100111010001111001111001110010111000010011010001010001111011010001011111001101001111010111100100110111111010100010001111100010001011100111110010001111110010111011110", + "0100001011011011001111100010100101111100111000011001111010011101101110000001110101000101111010100101010100100001000001001010000001001100111100011001001100011001111000011", + "1001010011011010100011100010100000011111110010100111110111001100001111000101110110100110101011011111001100100001011001110010111001110010100100100001110100100000101000100", + "0011001000001011111001101110110111100110101010000100101110010001010100100100001000001110000001010001100010110111110111100100010111100010101010001111110010001111010110001", + "0000010001101001001111010011000100001110111101100111100111001100000111101001101011111001100110110010000001001010010100100101010100100011000001000100100001000100010100100", + "1001101110101110100010011111001000010001000101110100010111110001000011101100000000101000010110001000111001001010101100111001101100111111001001110100111001110100001100010", + "0010000000011001111000101111111011000100111001111100101100010110010100011110111101111101110001100100010011111100000010110111100010110111100111111010110111111011100010011", + "0101111110110011001111010110001111110000000100110010011011111110000010010010101110111110110100000111010010001111100001000100100001000011111100111001010100111001111111111", + "1101100010001010100010100010101000100011001000001010010010001000001010000100010111100010001100111111101010101000111001010100111001010010001100101001010100101001100010101", + "0010101011101101111001010100011010101010001110101111000010101011011000110111000010101011001100010011100100011010110111111010110111111010101010101111111010101110101010101", + "0100100010110111001110001111001000110010011111001010001010001001100010101000011011100011000110110100100001011000110100011001010100011110001001001100011001001101100011001", + "1000111111010000100010110101101111111101110001011111101111111010001111111111000010111111011010001100111001101111101100111001001100111011111001010100101001010100111111010", + "0110000001011111111001100101100111111000001011000001000100010010110001011111010101101111010000000010110111110011100010010111100010010110110111110010010111110010101110010", + "0100011001000001001111110010100100011100101000000001100011001100101110000001101100011001111011100001010100110100000001010100000001010101010100011001010100011001001101111", + "1001100111000010100011110100101000011111100010101111111001110101001111000101111111001000101010111111001000101100111001101100111001101101010100100001101100100001010101000", + "0011001000000011111001100000110011000110110010001100101100010000110100100100000001111100000010110001100100100010010111110010010111110011111010001111100010001111110011001", + "0000110111100001001111001111010001001110100101101111111010100101100111101001100011011001100001010010000111000001010100111001010100111000011001000100111001001100010001000", + "1001111100110100100010001111001001110001010101111100011110100000000011101100011001110100010111001000111111011111101100100001101100100000101001110100100001111100110001110", + "0010110100000011111000111001110011000100101001110100111010101111010100011110111100010011110010000010010111110001100010101111100010101110010111111010101111110010000111111", + "0101111110111101001111000000000101110000011100100010000010100111100010010010110111001010110011100001010100010010100001010100100001010101010100111001000100101001011100111", + "1101010010000010100010101110111100100011010000001010011111001001101010000100001110110100001111011001101100101000111001001100111001001101101100101001001100101001110101001", + "0010101111110111111001010100010010101010011110100111010101111010011000110111000010101111001101010111100010000010110111100010110111100011100010101111100010101111111011001", + "0100000010101101001110000001000101110010001111001010010100011000100010101000001010100101000101010010100101000001010100000001010100000000111001001100000001001100111000101", + "1000011011011000100010101011101000011101101001001111110111001011101111111111011010100111011111101010111111111001001100101001001100111000100001010100111001010100101000010", + "0110000001010001111001110001100111111000010011011001001100010011010001011111010101101111010101100100110001110111100010001111100010010110101111110010001111100010101111110", + "0100011001011001001111100010100100011100111000010001110011001101101110000001110100011001111010100101010010110010000001001100000001010101000100011001001100000001001100011", + "1001100111011000100011101010101000011111110010101111100001110100001111000101100111001000101001011001001100101010111001110100111001101101001100100001110100111001010100100", + "0011001000001011111001110110110011000110101010010100110100010001010101100100000001111100000101010111100010100100010111100010010111100011100010001111110010010111110010001", + "0000110111101111001111000011010001000110111101100111110010100100000111101001100011011001100010110100000001000101010100100001010100100000000001000100100001000100011000100", + "1001111100101100100010001101001001100001000101111100001110100001000011001100011001110100010110001100111001011001110100111001101100111000111001110100111001110100100000010", + "0010110100011011111000110101110011000100111001111100100010101110010100011110111100010011110011100100010011110111111010110111100010110110001111111010110111111010001110011", + "0101111110110101001111000110000101111000000100100010011010100110000011110010110111001010110010100111010010010100111001000100100001010101001100111001010100111001000101111", + "1101010010001010100010101100111100111011001000000010010111001000001010100100001110110100001110111111101010101100101001010100111001001101110100100001010100111001110100101", + "0010111111101111111001010010011111100010001110100111000111111011011000010111000010111111001101110011100100001111110111111010110111100011111010110111111010110111111110101", + "0100100010110101001110000101001000111010011111000010001010001001100010101000001010100011000101010100100001001000110100011001010100000110001001010100011001010101100011001", + "1000101011000000100010101001101010111101110001001111101010101010001110111111011011101011011110101100111001101010101100111001001100111010101001001100101001001101101011010", + "0110100011010001111001110011111000111000001011010001000010001010110001011111010100100011010101100010110111111000100010010111100010010110001111110010010111110010100010010", + "0100111111000001001111100100101111101100101000010001100011111100101110100000010101111111111010100001010100111111111001010100000001010111111100011001010100011001111111111", + "1001110101011000100011101000101001100111100010100111111110100101001111000100000111010100101000111111001000101111100001101100111001101000101100100001101100100000000001000", + "0011111100011011111001110010111011011110110010010100101100101000110101000100000000010010000101110001100100111001101111100010010111100000010010001111100010001111101111001", + "0000110111100111001111000101000101110110100101101111111000100101100111001001100011001011100011010010000111000010100100100001010100100101010001010100111001010101100101000", + "1001011010101100100010001001001100111001010101111100011011001000000011001101111000110100010111001000111111000000101100111001101100111011101001101100100001101101110101110", + "0010100110000011111000110011110010101100101001110100111101111111010100011111011100101111110011100010010111110010100010110111100010110011100111100010101111100011011011111", + "0101001010101101001111000100001101110000011100100010000010011111100011010010110110100100110011000001010100001001000001010100100001010110111100100001000100100001011000111", + "1101010010001010100010101000101000000011010000001010011101001001101010000100001111000110001110111001101100101001011001001100111001001000100100101001010100101000001001001", + "0010001111110111101001010010010111111010011110100111010000010010011000010110100011001111001100010111100010011111101111100010101111100000101010101111111010101110101111001", + "0100010110110101011110000101000100001010001111001010010011001000100010101001101010111000000101010010100101000100001100000001001100000101000001001100010001001101101100101", + "1000101101000000110110101001100000000101101001001111110111110011101110011111011011001000011110101010111111100100110100111001010100111011010001010100100001010100110100010", + "0110000011010001111011110011110011000000000011011001001110010011010001111111010101111100110101100100110001110010010010010111110010010011111111100010001111100011010010010", + "0100111001000001011101100100100001010100100000010001110110100101101110100000010101011000011010100101010010101001000001010100000001010110011100000001001100000000011000111", + "1001110011011000111111101000101001110111100010101111100110100100001111000100000111110100001000111001001100101001111001101100111001101000101100111001110100111000000001000", + "0011111000011011110001110010111011000110101010010100110100101001010101100100000000010011100101110111100010111111110111100010010111100000001010010111110010010111101110001", + "0000110101100111000001000101000101101110101101100111110000100100000111101001100010101011100011010100000001000100110100100001010100100101001001000100111001000101100100100", + "1101011000101100110100001001011100100001000101111100001011001001000011001101111000010101010111001100111001000100110100111001110100111011110001110100100001110101110100010", + "1010100000000011101010110011101010111100110001111100100101111110110100011111011100001110010011100100010011110010111010110111111010110011110111111010101111111011011010011", + "1111001000101101011111000100001101101000000100100010011010011110100011110010110110100100010011000111010010001001011001010100111001010110111100111001000100111001011001111", + "0000010100001010100110101000111000011011000000000010010101001001001010100100001110100111001110111111101010101001001001001100101001001000100100111001010100111000001001001", + "1001001111110111101101010010001111100010011110100111000000010010011000010110100011101110101100010011100100011111110111100010110111100000101010110111111010110110101111001", + "1011010110110101010000000101011100011010000111000010001011001000000010101001101010011001100101010100100101000100010100000001010100000101000001010100011001010101101100101", + "1110111111000000101010101001111111111101101001001111101111111011001110111111011011111110111110101100111111101111101100111001001000111111111001001100101001001100111110010", + "1111100011010001110111110011101000111000011011010001000110001010010001011111010100100011010101100010110001101000100010010111100100010010001111110010001111110011100010010", + "0011101011000001011001100100111010101100101000010001100010101100101110100000010100101010111010100001010010101010111001010100011111010110101100011001001100011001101011111", + "0010100011011000110001101000101000100111101010100111111010001101101111000100000111100011001000111001001000101000100001101100100111101010001100100001110100100001100011000", + "1011111110011011101001110010111111111110110010010100101011111000010101000100000000111110100101110111100100111111101111100010001111100111111010001111110010001110111111001", + "1101000111100111001011000101011101110110101101101111100010011100100111001001100010000100100011010100000111010001000100100001000100100100111000110100111001010101011000100", + "0001011000101100110110001001010000011001000101111100011111001001000011000101111001000111110111001100111111001001001100111001101100111100100000001100100001101101101000010", + "1101000010000011100110110011110111101100110001110100100100010110110100001111011101001111010011100010010011100111100010110111100010110010101110000010101111100011101110011", + "0011011110101101000111000100011100010000000100100010010101001110100011000010110111011001010011000001010010000100000001010100100101010001000101100001000100100000101101111", + "0100100100001010101100101000110000000011000000001010000111110001001010000100001110101000001110111001101010111100111001001100111111001001010100101001010100101000110101001", + "0101001111110111101111010010001011011010011110100111011101110010011000010110100010011100001100010111100100010010001111100010101001100111111010101111111010101110110011001", + "1111110000110101011100000101011001001010000111001010010010000000000010110001101010111100100101010100100101010001001100000001001010000100011001001100011001001101011000101", + "0000111011000000110010101001101001100101101001001111111001001011001110001111011011010011111110101100111111101001110100111001010100111100101001010100101001010101000000010", + "1011110001010001111101110011101111000000011011001001011100000010010001100111010100110000010101100010110001100111110010010111110010010010001110000010001111100011101110010", + "1100111101000001011011100100111011110100101000011001101010010100101110100000010100101010011010100001010010100100100001010100000001010001001101100001001100000000000101111", + "0110010001011000111101101000101000110111101010111111111110100101101111010100000110010010001000111001001000111100111001101100111001101001110101011001110100111000110101000", + "0101101000011011110001110010101010100110110010011100100010000000010101100100000001101111100101110111100100110010110011100010010011100111110011010111110010010110011011001", + "1001000001100111000001000101011101101110101101111111101011100100100111110001100011000001100011010100000111010001010010100001010010100100111001000100111001010101011000100", + "1110011100101100110100001001010110000001000101110100000110110001000011001101111001000111010111001100111111001001010010111001110010111100100001110100100001101101101000010", + "1001000110000011101010110011101001111100110001100100100100110110110100000111011100001010010011100010010011100111111100110111111100110010101111111010101111100011101110011", + "1101011110101101011111000100000000001000000100101010010100100110100011100010110110111110010011000001010010000100011001010100111001010001000100111001000100100000101101111", + "0000100010001010100110101000110100011011000001010010000111001001001010111100001111101011001110111001101010111100101001001100101001001001010101011001010101011000110101001", + "1010001011110111101101010010001101000010011111101111011100101010011000010110100010011100101100010111100100010010001111100010110111100111111011010111111011010110110011001", + "1011110100110101010000000101000001011010000110110010010011000000000010111001101011111111100101010100100101010001001100000001010100000100011000110100011000110101011000101", + "1110111011000000101010101001110011111101101000100111111001011011001110011111011010110100111110101100111111101001110000111001001000111100101000001100101000001101000000010", + "1111110111010001110111110011101011011000011011001001011101010010010001000111010101110111010101100010110001100111110100010111100100010010001111110010001111100011101110010", + "0011111111000001011001100100111111101100101001011001101011111100101111100000010100111110111010100001010010101111111111010100011111010111111100011001001100000000111111111", + "0010100011011000110001101000111000100111101010011111111110001101101111011100000111100011001000111001001000101000100111101100100111101110001100100001110100111000100011000", + "1011101010011011101001110010101010111110110010111100100110101000010100110100000000101010100101110111100100101010101111100010001111100010101010001111110010010111101011001", + "1101100011100111001011000101011000110110101100111111101010001100100111010001100010100010100011010100000111001000100100100001000100100110001000110100111000110101100010100", + "0001111110101100110110001001001111110001000100110100000011111001000010101101111001111111110111001100111111001111110100111001101100111011111000001100100000001101111110010", + "1101000110000011100110110011100101010100110000000100100001101110110100101111011101011101010011100010010011111010011010110111100010110001111110000010101110000010110010011", + "0011111000101101000111000100011111001000000101001010010010000110100010010010110110111101010011000001010010000001011101010100100101010100011101100001000101100001111001111", + "0100110010001010101100101000100101111011000000010010000111001001001010111100001111010010001110111001101010100001101111001100111111001010101100111001010100111000100001001", + "0101111001110111101111010010000110101010011111101111011110010010011001110110100011110000001100010111100100010111101001100010101001100010001010110111111010110111001111001", + "1111110100110101011100000101011011100010000111110010010110011000000010010001101011001010100101010101100101001100101010000001001010000111001001010100011001010100000100101", + "0000011001000000110010101001110100100101101001100111111110101011001111101111011011111011111110101101011111101100110100111001010100111001110001001100101001001100010100010", + "1011100001010001111101110011101001000000011010001001011100000010010001100111010101011110010101100011010001111010110010010111110010010001110110000010001110000011111010010", + "1100001001000001011011100100101101111100101001011001101001100100101111000000010100000000011010100000110010100001011001010100011001010100111101100001001101100001111001111", + "0110010101011000111101101000111111101111101011011111111010110101101111110100000111011110001000111001010000100001000001101100100001101010100101011001110101011001101001000", + "0101001110011011110001110010101001111110110011111100100000110010010100100100000001001011100101110111111100110111101011100010001011100010101011010111110011010111001111001", + "1001010111100111000001000101001000110110101111111111101100100010100111010001100011110111100011010100011111001100000010100001000010100111000001010100111001010101001100100", + "1110101010101100101100001001011101110001000000110100000001001001000010101101111000111011010111001100101111001100110010111001110010111001010001101100100001101100010100010", + "1001000010000011101010110011101101010100110111000100100100101010110100100111011101011100010011100011010011111010011100110111111100110001111111100010101111100010110010011", + "1101011100101101011111000100011001001000000100001010010101000100100010000010110110011110010011000000110010000001011001010100111001010100011100100001000100100001111001111", + "0000000010001010111110101000110010011011000011010010000011011111001010111100001110000101001110111000001010100001101001001100101001001010101101011001010011011000100001001", + "1010001111110111101101010010011011001010011111101111011111010010011001110110100011111110101100010110000100010111101111100010101111100010001011010111111111010111001111001", + "1011110000110101011000000101010010000010000010110010010001011000000010011001101011100011000101010100111101001100101100000001001100000111001000110100011000110100000100101", + "1110111101000000110110101001110010100101101100100111111001101001001111111111011011110001011110101100100111101100110000111001010000111001110000001100101000001100010100010", + "1111100001010001101101110011111110000000011101001001011010010100010001100111010101000001010101100010101001111010110100010111110100010001110111100010001111100011111010010", + "0011001111000001011111100100110000011100101101011001101010100100101111000000010101010110111010100001000010100001011111010100011111010100111100000001001100000001111001111", + "0000100001011000110101101000110110001111101110011111111111110001101111111100000110000110101000111000001000100001000111101100100111101010100100111001110100111001101001000", + "1101111010011011101101110010101111111110110010111100100011111010010100110100000001111110000101110110000100111111101111100010001011100011111010010111110010010111111111001", + "0000000011100111011011000101011000110110101110111111101110001010100111010001100010100011100011010101100111001000100100100001000010100110001000110100111100110100100010100", + "1111111000101100110010001001011010110001000100110100000010101001000010101101111001101011010111001101011111001010110100111001110010111110101000001100100110001100101010010", + "1000001010000011101110110011101000110100110100000100100110001110110100101111011101100011110011100010001011101000111010110111111100110010001110000010101000000011100010011", + "1011101000101101011011000100011111101000000001001010010011111100100010010000110111111110110011000001001010001111111101010100111101010111111101100001000011100001111111111", + "1011101010001010110110101000101100111011000110010010000010101111001010111100001111110010001110111001110010101100101111001100101111001101110101011001010100111001010101001", + "1011101011010111101001010010001001001010011011101111011010000010011001110100100011111110001100010111110100000010101000000010101001100011110011010111111010110111111011010", + "1000001011110101011000000101001101100010000011110010010101100100000010010101101010101001000101010101100101000001001011100001001010000000111000110100011001010100011000100", + "1111111001100000110110101000110111100101101001100111111010110001001111101101011010101111011110101101011111111001010101011001010000111000100001001100101001001100101000011" + ] + }, + "39": { + "0": [ + "11111110101100001010100001110011000010001110101111010010010010001001111100101001110010000011010110000011010110101011110100001110010100001011001111100101001111100010001111111", + "10000010101100001001111101011111101110100000111010111111000111101011111001010011110011100000110101100000110101010100000110101101100110101000101100000110101100000000001000001", + "10111010000101000110011101000010101011001000011111000001010011100001001001001001001010101110010000101111010001001100111110010101011110010111010100111110010100111010101011101", + "10111010101101010110110011000010101110100001010100101100101011111011010111100011000100101000011100101001111100000011010110000011010110000001110010010010010010010001001011101", + "10111010011010110111100111111110110011101000011101001111110110011000110100000000111111001011111111001010011111111000110101100000110101101111100100100100100100100111101011101", + "10000010011011101100111010001111100001001101010101111000100011100001001000101001100011010001001111010000101110001110010100111110010100101000111110010100111110010100101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000100110001001100010001000001110100101111011001000101000010001010010111000100010110101100000110101100010001110101100000110101100011000100110101100000110101100100000000", + "10110111010110101011000011111101001100101010011111001111101010101111110010100111111110001101011000001101011111111111010000101110010000101111111110010100111110010100001001011", + "11100001101100001010100101001011000010001111101101010001110100001001111100101001101110000011010110000011010111010011110100001010010100010100101111100101001111100000010111110", + "00100011001100001001111001011111101110100000011110110100100111101011111001010010001101100000110101100000110100100100000110101101100110100101001100000110101100000101110100011", + "01110000100101000110011010111010101011001001011001001111110101100001001001001000110101001110010000101111010100010100111110010101011110010000010100111110010100111101010000100", + "01101011101101010110110010000010101110100000010100101010001001111011010111100010010011001000011100101001111011111011010110000011010110011110010010010010010010010001011100001", + "11011001111000110111100001000110110011101001111011001100110010011000110100000001000100101011111111001010011100011000110101100000110101111101100100100100100100100100111111010", + "10000110011101101100111000100111100001001100010101110010100011100001001000101001111110010001001111010000101110111110010101011110010100111101011110010100111110010100001111101", + "10011100110100111111010010000110111000010011101011111010011110100111100100001111110000000011010110000011010000010000011011010000011010110100010000011010110000011010010111100", + "11111010111011000110101001110000100001000111110000100010000111000010011111001010110011100000110101100000110010110010111100100011111101010111010011111001010011111001110100100", + "00111000110101010001111110001000011001010100110110001010101111010010100111110010110101011000001101011000001100001000101110010001001111001111110100111110010101011111001100101", + "10010111111100111111001111111001011000010110101110000010010001011101001111100100111011010110000011010110000010010010110000011011010000010011111010110000011011010001000010101", + "00011101001000101011110111010111000110100100110100100010011000001100100100100101011000100011111101000010111001111001010011111000110011111101111001010011111000110010111101001", + "10110010110110001101101001011001110101111011001101110001010010100000001100111001001000010011000111110010100000100000001101011000001101000101001001001001001000001000000111010", + "01101101001110000001010111110000000101011111001101111010000100101110000010110111110010011101001001111100101010101110000011010110000011001011010010010010010010010010001001100", + "11101011110010000001010101001010001100100001111000011111001110001100100101000100010011111100100010111101000011010011111000110011111001010000110011111001010011111001100010000", + "01000101101101100100001001011101100011001000110000100001000101111100111111010100101011011000001101011000001011001011000000001011000001101111001011000001101011000001001100111", + "01001111101101110000011111111110010111110111000110011111110001110100101001111100111111010110000011010110000111111100001010010100001011101111100101001111100101001111111110010", + "01011000111000111100010110001101110100111111011011101000100010111111001010011110100010110101100000110101100010001101000011111101000010101000111101010011111000110010100011000", + "01001010100111100100010110101010000010001001110101001010101010000110010100111110101010001101011000001101011110101001101011000001101011001010100111101011000000001011101011110", + "10101000111110011101000110001001110000110010000010011000101110111010010010010011100010010100001011110100001010001111100101001111100101011000101001100101001110000100100011111", + "11011111111011100000000011111100011001110000100000011111111111001101100000110100111111111111001010011111001111111101100000110101100000101111100010100100100101100101111110111", + "10110101010101011010001000011011011111000010010110101111111111110101011000001100111111000111110010100111110011011101011000001101011000000010101001001001001001001001011000111", + "01010011100100110111100111010100111011010111001110111001111000111010010010010011001111001011110100001011110011010101001110000101001111100100100101001111100101001110110110110", + "00100001000000001001100111001000001110000101011101010100101000010001010011111000001100110101100000110101100100100110101101100110101100011101000110101100000110101100110101010", + "10010010110110101011000000111101001100001000011101010111101010101111110010100110010100001101011000001101011010010111010001001111010100110110011110010100111110010101010001001", + "11101001101110001010100010000011000010001001101101000010010100001001111100101001110010000011010110000011010111111011110101001011110010010000001011100101001110000100111100010", + "00101011101010001001111111000111101111100100011000110100100001101011111001010011100101100000110101100000110010011100000110101100000000101011101010000110101101100111111110111", + "01110100000101000110011010100010101011101001011001001010110111100001001001001001111110101111010100101111010110101100111110010100111000001001010010111110010101011110101111000", + "01101110101101010110110100000010101111000110010110111010001101101011001110000011010000101001111010101001111010001011010110000011010110010100010100010010010011010011110110001", + "11011000111000110111100101110110110010101111111011000010010010001000101101100001010011001010011001001010011110101000110101100000110101101111000100100100100100100100110101010", + "10001010111111101100111100001111100000001100010101100010100001110001010001001000110101010000101001010000101000010110010100111110010100111111111110010100111110010101101101101", + "10010101110110111111010001111110111000110011101011100010011010111111110101001110011010000011010110000011001010010000011010110000011010101011110000011010110000011010000011100", + "11011111011011000110101101010000100001100101110000111010000111001010011111001010011001100000110101100000101111111010111101000010111001011011110011111001010011111000111100100", + "00010000110101010001111001011000011001010010110110011001001101001010100111110011001001011000001101011000010100100000101111010000101001001011010000111110010100111111100111001", + "10111111011100111111001001110001011001010010101100000010010111001101001111100100010011010110000011010110010100101010110000011010110110011101011100110000011010110001001001001", + "00101001101000101011110111001111000110000100110110100001011010001100100100100100010011000010111001000010111011000001010011111001010101100100111111010011111001110011000010101", + "10111111110000010101101111010001110100011101001111100111010110100000010101011000001011110010100001110010100001010000001101011000001101001111001111001001001001101000101100010", + "01001100001110011001010011000000000100011001001101111110100100110110011011010111100101111100101111111100101000011110000011010110000011011001110010010010010010010010000011100", + "11000011010000011001010001101010001101100001111010011111001100011100111100100101011000111101000100111101000101111011100001010011111001010010010011111001010011111000000000000", + "01111000101111111100001010100101100011101000110100111101000001100100101110010101000001011000001101011000010001001011011001101011000001110000101011000001101011000001011000111", + "01100111101001100000011011111110010111010011000010001100110001111100101001111100101111010110000011010110011001001100010011110100001111101101000101001111100101001110001010010", + "01111001011010100100010100101101110100111111011011110000100000100111001010011110100100110101100000110101111001001101010010111101000100100110111001010011100001010010001010100", + "01101110000111100100000010101010000010001001110111011011001100010110010100111111001000001101011000001101001111110001101011000001101101000110000001101011011001101010010010010", + "10100001011100001101000001110001110000110010000000010111101100111010010010010010100101110100001111110100001101110111100101001111100011010010001111100101010111100101110100011", + "11011111111101110000000011111100011001110000100010011111111011001101111000110101111110011111001100011111001111111101100000110101100000101111100100100100110100100101111111111", + "10011000110101001010010110001011011111100010010110101000111111101101000000001101100010100111110100100111110010001101011000001101011000001000101001001001001001001000100010111", + "01111010100110111111111010101100111010110111001100111010111010101010001010010011101010001011110010001011110010101101010111100101001111111010100101001111100101001110101010110", + "00011000100010011001110110001000001111000101011001001000101100001001000011111001100010110101100000110101111010001110110100000110101100011000100110101100000110101100100011010", + "10111111110010111011001111111101001100001000011001011111101010100111110010100110111110001101011000001101000011111111001000101111010000111111111110010100111110010101111111001", + "11000100101100010010101010001011000010001001101101010100010110010001111100101001010000000011010110000011001010001011100100001011110100011100001111110101010111100101010110010", + "00001010101010001001101001110111100111000100011010101000000001111011111001010010110011100000110101100000100100101100000110101100000110111111001100011110110100000110110101111", + "01111100100111010110011000000010101010101001011011001010110111100001001001001000010100101111010000101111010110010100111110010100111110011111110100100110001100111111001101000", + "01100011101011000110110011111010100110100110010100111110001101111011010110000010011010101001111100101001111000010011010110000011010110010011110010001010000010010011100011001", + "11110001011000100111111001001110110010001111111011000010010010000000110101100000111001001010011111001010011011111000110101100000110101110101100100100100100100100100011101010", + "10100110111101100100100111000111101000001100010111100101000001110001001001001000101001010000101111010000101100100110001100111110010100101101011110010100111110010100100111101", + "10100101010100101111000111110110110001010011101111110000011010111111100101001110110010000011010110000011010010101000000010110000011010110011010000011010110000011011001001100", + "11010111111111010110100111000000110000000101110100101001000111001010011111001011010011100000110101100000110001010010100101000010111101011000110011111001010011111000100010100", + "00011101110111001001110001010000011001010010110110001111001101001010100111110010001011011000001101011000001001001000111111010000101111000111010100101110001100111110001101001", + "10111110011100111111011111000001010001110010101100011110110111000101001111100100000101010110000011010110000010000010110000011010110000001001111010101000000010110000000011001", + "00010001001010111011110101101111000111000100110110100111011010000100100100100101111001000010111101010010111011100001010011111001010011110010011001001011100001010010100000101", + "10111010110000011101101000100001111101111101001111100101010110101110001101011001000001110010100111101010100011001000001101011000001101001000101001010001011001001000111000010", + "01000101101110010001001111111001000100111001001101110100100100101000000011010110001111111100101001100100101101001110000011010110000011000011010010010010010010010010101011100", + "11001011010000001001001010101011100101100001111010001000101100010010100100100101000100111101000010100101000001001011111001010011111001000000110011111001010011111001001010000", + "01111100001111110100011100101100001010001000110100101011000001100000111110010101101001011000001101011110001001110011000001101011000001111000001011000001101011000000010010111", + "01010011001001100000010001110111000110110011000010011111110001111100101001111101100101010110000011010000000111100100001011110100001011110110000101001111100101001110010100010", + "01100000011010100100011100111101110100111111011011100010100000101111001010011111100110110101100000110011100100100101000010111101000010110010111001000011100001010011100000100", + "01000111000111100100000100011010001010101001110111000101101100011110010100111111011110001101011000001001011001011001101011000001101011001010100001110011011001101011011000010", + "10000101111100001101000011011001010001110010000000010001101100110010010010010011001111110100001011100100001101010111100101001111100101000100101111111101010111100100010110011", + "11000111011101110001000101001100010000010000100010001110111011000011100000110100101100011111001010000111001110100101100000110101100000100101000100111100101100100101010101111", + "10110000110101010010110100100010011111100010010110101101111111110011011000001101010100100111110010111111110110010101011000001101011000011000001001001001001001001001110000111", + "01111111100110111110000100011101010011010111001100111000011010100100010010010011110010001011110100010011110111111011001111100101001111110110000101001111100101001111111100110", + "00000001100010000000001001000001100111100101011001000110101100001101010011111000000100110101100000110011100100011000101100000110101100010101100110101100000110101101111111010", + "10001111110010101011001011111101111101101000011001001111101010100111110010100110111110001101011000001011011111111001010000101111010000101111111110010100111110010101111111001", + "11011000101100000010000110001011000010001001101101011000110110011001111100101001100010000011010110000101010010001111110100001011110100011000101111100010001111100100100010010", + "00101010101010000110010110101111100111000100011010101010100001110011111001010011101011100000110101100100110110101100000110101100000110111010101100000000101100000111101011111", + "01011000100111011111001010001010001010101001011011011000110111101001001001001001100010101111010000111111010010001100111110010100111110001000110100111000010100111111100011000", + "01111111101011000110001111111010100110100110010100101111101101110101010110000010111110101001111100110001111011111011010110000011010110011111110010010110010010010010111111001", + "11011001111000111000100101000111100010001111111011010101010010011110110101100000010011001010011111010010011111010000110101100000110101101000100100100100100100100100100011010", + "10101111111101100011111001010110001000001100010111101111000001111111001001001001001011010000101111001000101101001000010100111110010100101111011110010100111110010101101101101", + "10110000010100110100001001000111001001010011101111111000111010111011100101001110000100000011010110000101010100000110011010110000011010111001110000011010110000011011000011100", + "11100111011111000000111111101000001000000101110100101101000111001010011111001010011001100000110101100110110011100100111101000010111101000010010011111001010011111001000000100", + "00001000110111011101010110100100000001010010110110000101001101000010100111110010000001011000001101011110001001001100101111010000101111000000110100111001010100111110111001001", + "10011011111100110000100011111101000001110010101100010110110111000101001111100101101111010110000011010010000001001010110000011010110000010011011010110111111010110000001011001", + "00111101001010110010100000101101100111000100110110100000111010000100100100100101000101000010111101000010111101001001010011111001010011101000111001010100011001010010001010101", + "10100110010000011101010010101011111101111101001111110001010110101000001101011001001001110010100111110010100001110001001101011000001101001000001001001100101001001001010010010", + "01101001001110001110010011110111010100111001001101100011100100101110000011010110100101111100101001111100101001100111100011010110000011011110010010010010010010010010010101100", + "11000010010000001110010100111011111101100001111010000010101100010100100100100100100110111101000010111101000000100100011001010011111001000010110011111001010011111000000000000", + "01101001001111101111010010011000001010001000110100100011100001100100111110010101011111011000001101011000001111011100100001101011000001100010101011000001101011000000011000111", + "01010011101001110110001001011000111110110011000010011011110001111010101001111100110111010110000011010110000101010010001011110100001011110100100101001111100101001111110110010", + "01100101011010110000111011001001101100111111011011101000100000101001001010011111110100110101100000110101100100100001000010111101000010100101011001010100111001010011010100100", + "01000010100111101011111000100110011010101001110111001101101100011000010100111110101100001101011000001101011010010001101011000001101011000000000001101100100001101011010000010", + "10001001111100000100010110011011010001110010000000010110001100110110010010010011100011110100001011110101001011111111100101001111100101000110001111100010101111100100111100011", + "11001011111101110000111111000110010000010000100010011100111011000101100000110100100100011111001010011110101100011100100000110101100000111101100100100001000100100100111111111", + "10110000010101010101001000101100001001100010010110111000111111110101011000001101111110100111110010100110010010111100111000001101011000010101001001001001001001001001001110111", + "01110110100110111000100010001100001101010111001100110100011010100011010010010010010000001011110100001010010110010100101111100101001111110100000101001111100101001110101110110", + "00000100100010000010111111110101100101100101011001001110001100001000110011111000110010110101100001010101100010110111001100000110101100001111000110101100000110101101101101010", + "10001010110010101101010010000011100001101000011001000000101010100000010010100111101100001101011001101101011110001111010000101111010000101111111110010100111110010100110101001", + "11010001101100000110001101111110111010001001101101011110010110011110011100101001000010000011010111100011010010010011110100001011110100010011101111100100001111100101110010010", + "00101111001010000110010101001010110101000100011010100000000001110101111001010011000001100000110100100000110111111100000110101100000111001101101100000111001100000110111011111", + "01010000100111011111001101000000101110101001011011001101010111101101001001001000111000101111010000101110010000100100111110010100111111111101010100111111110100111111100101000", + "01111111101011000110001011111000000000100110010100101111101101110011010110000010111110101001111100101000011011111010010110000011010111101111110010010011110010010010111111001", + "11011000111000111001000010001001100100001111111011011000110010011000110101100000100011001010011111001011111110001001010101100000110100111000100100100100100100100100100011010", + "10101010111101100001011010101111010000001100010111111010100001111000001001001001101011010000101111010001001010101111110100111110010100111010111110010100111110010101101011101", + "10111000110100110101001010001011010101010011101111111000111010111110000101001111100010000011010111100011010110001001111010110000011010101000110000011010110000011010100011100", + "11101111111111000111011111111110001110000101110100101111100111001101111111001010111111100000110100000000110011111010111101000010111101001111110011111001010011111000111110100", + "00000100010111011000110000101101100001010010110110001001001101000101000111110011001001011000001100111000001011110000101111010000101111001000010101011110010010111110110111001", + "10011011011100010011100111110100000011110010101100000011110111000011001111100100000101010110000010010110000101100010110000011010110001100110011011010000011110110000110111001", + "00110000001011110111100010111101000011000100110110110010111010000000100100100101000111000010111101000011111000100001010011111001010010000010111000110011111111010011011000101", + "10101011010000111111010100011011011011111101001111111011110110101000001101011001111111110010100111110011000001011000001101011000001100101010101000001001001111001000000000010", + "01100001101111101111110001011001010010111001001100010011100100101110000011010111110011111100101001111101001111010110000011010110000010001100110010010010010010010010001111100", + "11000111010000101000110101001010111101100001111011001000101100010101100100100101110010111101000010111100100100100011111001010011111001001101010011111001010011111001100100000", + "01100000101110001000010100100010001110001000110101010101100001100101011110010101001011011000001100111000001000010011000001101011000001110000001011000001101011000001010100111", + "01011011101001110111101110011000111000110011000011110110010001111011001001111101000101010110000010110110000101111100001011110100001011100110000101001111100101001110011010010", + "01101001111011010101011101000110001100111111011010100100100000101000101010011110100100110101100001010101100110011101000010111101000010100101111000110011111101010011011000100", + "01000010000111001000111100101011011000101001110110111000101100011100010100111111011110001101011001001101011110111001101011000001101010111101000000001011000111101011101000010", + "10000100111101000001010110001111110101110010000000000100001100110000010010010011110001110100001011110100001110010111100101001111100100110100001110000101001001100101101110011", + "11000110111101010010111011110010110110010000100011010110011011100011100000110100010010011111001010011111001100110101100100110101100001000111000101100100100010100101101101111", + "10111000110100110100101110000000001001100010010111001000111110110001011000001100110000100111110010100111110100001101011110001101011001010111101001001001001001001001010100111", + "01110011100110011110000001111010001011010111001101111110011010000010010010010011011100001011110100001011110010010101001001100101001111111011100101001111100101001111010010110", + "00001101000011100101111101001111100011100101011000111000001101101001010011111000111110110101100000110101100101111110101010000110101100011101100110101100000110101100111001010", + "10000010110010101100110111000011100011101000011000101101001010000011110010100110001110001101011000001101011110100111010000101111010000111101011110010100111110010101000001001", + "11011101001101100011101101110000111010001001101100010010010111111001111100101000010010000011010110000011010000101011110100001011110100010011001110000101001011100101101110010", + "00101111101010100101010111000110110101000100011011010101000000110111111001010010110011100000110101100000110011010100000110101100000110110000101101100110101010000110000101111", + "01011101100110011010001001010100101110101001011011011111010110001101001001001000101010101111010000101111010101001100111110010100111110001111010101011110010010111110101101000", + "01110010001011100100001101000100000000100110010101100000101101010101010110000010100100101001111100101001111010000011010010000011010110010001110011010010010100010011001011001", + "11010101011001011001000011101101100110000111111010100101010011011100110101100001011101001010011111001010011001100000110011100000110101111010000100100100100100100100110001010", + "01101010111101000101011010100001010110011100010110100101000001011001001101001000000111010000101111010000101001001110010010111110010100100000111110010100111110010100000001101", + "10111001110101010011001011111001010101001011101110001110111011011111100011001110001000000011001110000011010011001000011100110000011010101011010000011010110000011010001111100", + "00101111111111000001011011111110001100000101110101001111100111101110011001001011111111100000101101100000110011111010111101000010111101011111110011111001010011111000111110100", + "11001000110110111000110110001011100011010010110111001000101100100010100001110011100011011000010101011000001110001000101111010000101111001000110100111110010000111111100011001", + "10011010111100010011100110101000000111100010101101111010110110000001001111100100101011010110010011010110000010101010110000011010101000011010111010110000011100110001101011001", + "00111000101011110111100010001001000001001100110110101000111011100000100100100100100011000010111101000010111010001001010011111001001011101000111001010011111111010011100010101", + "01101111110000111111010011111111011011111101001110111111110110001110001101011001111111110010100111110010100111111000001001011000010101011111101001001001001111001001111110010", + "00101001101111101111110110011011010000101001001100011110000101101010000011010110110101111100101001111100101101111110000101010110010011010110010010010010010010010011111011100", + "00001011110001001000110111000100111011110001111011001100101100110100100000100101100100111101000010111101000100011011111111010011111001000101110011111001010011111001011000000", + "01100000001111001000010110101010001110000000110101001000100000000100111000010100111111011000010101011000001010111011000111101011000001100101001011000001101011000001001000111", + "10010110101001110111101110001000111010100011000011110100010001011000101111111101110001010110011011010110000010010100001011110100001011100100000101001111100101001110110110010", + "10100100111011110101011001110110001110111111011010111110000001001111001100011110110010110101111000110101100110110101000010111101000010111111000001010011111001001010110100100", + "01001010111110101000111010000011011100111001110111011000101101011010010100111111110100001101001000001101011000001001101011000001110011010111111001101011000001111011001100010", + "10000001111101000001010101111111110111111010000000010110001101010110010010010010011011110100001011110100001000010111100101001111111101010011110111100101001111100100100010011", + "00001111000101110010111001001010110110010000100010101000011011100011100000110100111000011111001010011111001101111101100000110101111000101101110100100100100100100101111101111", + "11110000111101010100101101000000001011110010010110100101011110110001011000001101101000100111110010100111110010100101011000001101001000001101001001001001001001001000100110111", + "10111111000111111110000001110010001101000111010100111010011010000010010110010011010010001011110100001011110010101101001111100101001111110011000101001111100101001111101000110", + "00001101101011000101111011000111100011101101010001000101001101101001010101111001010010110101111000110101100111010110101100000110101100001000100110101100000110101100100011010", + "01001111101010101100110101010011100001111000011000101111001010000011110100100110101010001101000000001101011001001111010000101111010000111111011110010100111110010101101101001", + "00010000000100100011101111000000111000001001101100001001010111111001111010101000000100000011001110000011010000000011110100001011110100001001110111100101001111110100000010010", + "00100111010011000101010111101110110001010100000011110100000000010111111001010010011001100000100101100000110101100100000110101100011110111010010100000110101100011110100001111", + "01011000100110011010001110100100101100100001011010101101110110101101001001001001000000101111010000101111010011001100111110010100100110001000101100111110010100100111111001000", + "10111011110011000100001111111100000000100110000101111111000101110101010110000010001110101001111100101001111011001011010110010011001110011011000010010010010010001011001011001", + "10011101010000111001000110101101100110011111111011001001100011011100110101100000000101001010011111001010011111001000110101111000100101100000100100100100100100100101001011010", + "01100110011100100101011110101001010110011100001111100000011000111001001001001000001001010000101111010000101001110110010100100110010100101000011110010100111110010100110011101", + "10111001011101110011001101110001010101011011100111110010000011011111100101001111100100010011010110000011010001100000011010101000011010111110010000011010110000011010010101100", + "00100011000111000001011110111110001100010101110101000011110111101110011111001101000111111000110101100000110100100010111101000010111101010010110011111001010011111000000000100", + "11001001011111111000110000011011100011010010110111010010001101100010100111110101011111000000001101011000001011011000101111010000101111010010101100111110010100101111011001001", + "10101011000101110011100001011000000111100010110101000011000110000001001111100010101111001110000011010110000011010010110000011010110000001100100010110000011010101000010111001", + "00011000001011110111100011001001000001001100110111000000110010100000100100100000101101000010111101000010111110100001010011111001010011100101000001010011111001001010010100101", + "00101110001000011111010111111111011011111101011110101111111110101110001101011001111111110010100111110010100011111000001101001000001101001111111001001001001001010000111110010", + "00000000100110001111110010001011010000100001101101101000110101101010000011010110100011111100101001111100101010001110000011001110000011001000110010010010010010010010100011100", + "11111110110001001000110110101100111011100000100010001010110101010100100100110100101010111101000010111101000110101011111001001011111001001010110011111001010011111001101010000", + "10000010100110101000010110001010001110001000111100111000111000000100111110001100100011001110001101011000001110001011000001110011000001101000101011000001101011000000100010111", + "10111010010001110111101111111000111010111010000011111111100001011000101001100011111111001000000011010110000011111100001011110100001011111111100101001111100101001111111110010", + "10111010110010010101011011001110001110100111111010110001100000001111001010000000011000101011100000110101100101111101000010111101000010100101111001010011111001000011111100100", + "10111010111110101000111101000011011100101000001110001100011101011010010100111000101000010001011000001101011100100001101011000111101011010101000001101011000001110011000110001", + "10000010011101000001010111110111110111100010000001111011000100010110010010010111010011110100001011110100001010101111100101001001100101011011001111100101001111111101001000010", + "11111110100101110010111101000010110110001001010011011100110011000011100000110100110010011111001010011111001101010101100000100011100000111000100100100100100100111100100011110" + ], + "1": [ + "11111110011000011001011000001001111111100101010010010011111100101110000011010001101110000011001001111100110111010110010100001110000011010100110011100101001010010010001111111", + "10000010101000111010001011110010110010110000000101001010101111100010010010000101011011010110010100001011100010010011010000011101001110000011100100110000011101001100001000001", + "10111010011111001011011100101000001011100101010000011111110010010111100101010010001111110100001010000011001011001110000101001000011011010100010001100101001000011110101011101", + "10111010110111010010110011010010011100010010000101001011010110000100101000000011010010101001111101010110011101111010010110000100001010000001100100010010010101001101001011101", + "10111010000010000000010011111010001000010010001111101111100011010001111101010110111111111100101000000011001011111111100011010011110101011111101110010010001011100111101011101", + "10000010100001100110001010001010110101001111111010111000110010010101001110000010100010001011110101010110010110001010101111100010110001111000111011001111111100110000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000011100111010010010001000010010011010101111111000100101001010010011010110100010000011001111110100010110001111111010110111100100101000101110011010101001100100000000000", + "11111011111000110110111111111100100001001111110010011111101001111011010111100100111111010110011010101001100111111011001011110011010111111111110011001111110100010011010101010", + "11011100111000011001011100000001111111100101010010000110011100101110000010110001110010000011001111111100110110101110010100001110000010010100110011100101010110010010010111100", + "10100110101001011010001001111010110010110000000101010101001111100010010011110100100101010110010010001011100011100011010000011101001110000011100100110000000011001110000010110", + "10000100011111101011011000001000001011100101010000010000010010010111100100001011110001100100010010000011001110010110000101001000011011010101010001100101010110011011101011100", + "10011111010111110011110011110010011100010010000101001100010110000100101000011011000100110001100101010110011010000010010110000100001010000000000100010010000011001110111100010", + "10011001100010100001110100001010001000010010001111111011100011010001111101001110001111100100110000000011001011010111100011010011110101010101001110000010001011100011101000010", + "11010010100001000111001011110010110101001111111010101010110010010100001110000011011010010011100101010110010100010100101111100010110001110010011011010111111100110111010101001", + "01010100111101111010110010101000011010011010101111100111100101001011110011010110001110000011001111110010010001001001111010110111100100101010001110000010101001100010001110011", + "10000111111001110110011001010100101001001111110010010011001001111010110111100100010011010110011010101111100101111101001011110010010111111111110011010111110100010111011011001", + "11011100111000111001111100000001101111100011010110000110011100101111100010110001110010000011001111111010110110101010010100001111100010001010110011100101010110010010001111100", + "10100110101001011011001001111010110010110110000011010101001111100010010011110100100101010110010010001111100011110011010001111100101110000111100100110000000011001110010010110", + "10000100011111101010011000001000011011100011010110010000010010010111100100001011110001100100010010000011001110001110000100101001111011010101010001100101010110011011101011100", + "10011111010111110010010011110010001100010110000011001100010111100100101000011011000100110001100101010110011010011010010111100100001010000000000100010010000011001110111100010", + "10011001100010100001110100001010001000010010001111111011100010110001111101001110001111100100110000000011001111001111100010010011110101010101010110000010001011100011101000010", + "11010010100001000111001011110010110101001111111010101010110011110100001110000011011010010011100101010110010010010100101111100010110001110010000011010111111100110111010101001", + "01010100111101111010010010101000011010011010101111100111100100001011110011010110001110010011001111110010010111001001111010110111100100101010010110000010101001100010001110011", + "10001111111001110110011011111100101001001111110010011111101001111010110111100100111111001110011010101111100011111101001011110010010111111111100011010111110100010111111111001", + "11011000111000111001111110001001101111100011010110011000111100101111100010110000100010011011001111111010110010001010010100001111100010001000110011110101010110010010100010000", + "10101010101000011011001110101011010010110110000011001010101111100011010011110101101011001110010010001111100110101011010001111100101110001010100100101000000011001110101011010", + "10001000111111101010001110001000111011100011010110011000110010010110000100001011100011100100010010000101001010001110000100101001111011001000110001111101010110011010100010000", + "10011111110010010010011011111010101100010110000011011111110111100101001000011010111110110001100101010000011011111010010111100101001010001111100100001010000011001000111111010", + "10010101100010100001100111010011010000010100001011110011000010110000011101001111110011100100110000000101001001111111100010010010010101010111110110000010001011100010111010010", + "11011110100100000111001110000011000101001001111100111110010111110100001110000011110010010011100101010010010010101100101110000011010001111010100011010111111100110111001111001", + "01010100111100111010001001111001011010011100101001100101000010001011110011010110000100010011001111110010010001110001111011010110000100110111110110000010101001100011110010011", + "10000110011100010111111110001101010001001011110100001000001110011010110111100100110001001110011010101111100010001101001110010010010111110101000011010111110100010111110011001", + "11011101011110011001100011110001000111110011010111101100011011001111100010110000000100011011001111111010110000011010010011001111100010011000001011110101010110010100000100000", + "10101011101100111011101010001011000010101110000010110011101110000011010011110100001111001110010010001111100011001011010111111100110110000101011100101000000011001000100001010", + "10000000111100001010101101110001001011111011010111111010110011010110000100001010111011100100010010010101001010000110000010101001100011001010001001111101010110011100011100000", + "10010110110100010010011110101011001100001110000010010111110111100101010000011011001110110001100101001000011001010010010111100101010010001010010100001010000011001010001111010", + "10010101100111100001100111010011001000010100001011110011000010110000000101001111110011100100110000011101001111100111100010010010000101010111110110000100001011110010111011010", + "11011110100100000111001110000011010101001001111100111110010111110100010110000011110010010011100101001010010100110100101110000011010001111010100011010001111100101111001111101", + "01010100111100111010001001111001000010011100101001100101000010001011100011010110000100010101001111110010010101110001111011010110000100110111110110000100101001111011110011011", + "10000110011100010111111110001101001001001011110100001000001110011010110111100100110001001000011010101111100010001101001110010010010111110101000011010011110100001111110011101", + "11011101011110011001100010110001000111110011010111101100011011001111100010110000000100011101001111111010110000011010010011001111100010011000001011110101010110010100000100000", + "10101011101100111011101010001011000010101110000010110011101010000011010011110100101011001010010010001111100011001011010111111100110110000101011100101000000011001000110001010", + "10000000111100001010100101010001001011111011010111111010110101010110000100001010011101100100010010010101001010000110000010101001100011001010001001111101010110011100000100000", + "10100110110100010010001110001011001100001110000010010111110001100101010000011010101000110001100101001000011001010010010011100101010010001010010100001010000011001010001111010", + "10000101100111100001110110110010001000000100001010010011000100110000000101001110010101100100110000011101001111100111100100010010000101010111110110000100001011110010111011110", + "11001110100100000111001110000010110101010001111101011110010111110100010110000010110010010011100101001010010100110100101000000011001001111010100011010001111100101111001110101", + "01100100111100111010011001011001100010000100101000000011000010001011100011010110000100010101001111100010010101110001111101010110011100110111110110000100101001111011110011111", + "10011010011010010111101110001100001001010011110101001110001110011010101111100100110001001000011010110111100010001101001110010010001111110101000011010011110100001111110010001", + "11110001011110011001110010110000000111110011010111101010011011001111111010110000000100011101001111100010110000011010010011001111110010011000001011110011010110000100000100000", + "11000111100110111011111010001010000010101110000010110111101010000011001011110100101011001010010010010111100011001011010111111100110110000101011100101110000011010000110001010", + "11000000100000001010100101010000101011111011010111111010110101010110010100001010011101100011010010010101001010000110000010101001100011001010001001111011010110000100000100000", + "00011111110000010010001111111011001100001110000010011111110001100101010000011100111110110110000101001000011011111010010011100101010010001111110100001110000011010010111111010", + "11111000100001100001100010001010001000000100001010011000100100110000000101001001100011100011010000011101001110001111100100010010000101001000110110000101001010010010100011110", + "11001010100000000111001110101000110101010001111101011010110111110100010010000100101010010110000101001010010110101100101000000011001001111010100011010000011101001110101010101", + "11001000100100111010011010001111100010000100101000011000100010001011100101010010100010010101001110000010010010001001111101010110011100111000110110000101001000011011100011111", + "00011111110010010111101111111000001001010011110101011111101110011010101001100100111111001000011011010111100111111101001110010010001011111111100011010010010101001111111110001", + "11111000100110011001110010001010000110010011010111101111111011001111111100110000001000011101001110000010110101010010010011001111110100000010001011110011010110000100101110000", + "11000011100110111011111100110000000011001110000010111011001010000011001011110101110101001010010011010111100111100011001111111100110000010111111100101110000011010001111011010", + "11000100100000001010100010000110101010011011010111101110010101010110010100001010110111100011010010010101001010110110011010101001100101010010101001111011010110000101001110000", + "00010010110000010010001001011001001101001110000010000011001001100101010000011101100010110110000101001000011111110010001011100101010010001111110100001110000011010010010011010", + "11111000000001100001100011000010001000000100001010010110011100110000000101001001010111100011010000011101001010001111110100010010000101011101010110000101001010010011010011110", + "11000010100000000111001111110000110101010001111101000010001111110100010010000100000010010110000101001010010010011100101000000011001001101000000011010000011101001110000100101", + "11000101000100111010011001010111100010000100101000010111110010001011100101010011001010010100001110000010010101001001111101010110011100100101010110000101001000011010010001111", + "00100011010010010111101110000000001001010011110101000100101110011010101001100010011101001001111011010111100000000101001110010010001011110010000011010010010101001111100100001", + "11001000100110011001110101011010000000010011010111110001111011001111111100110110001000011100101110000010110101010010010011001111110100000010001011110010010111100100101110000", + "00100011110110111101111000100000000011001110000010100100001010000011001111110011110101001011110011010111100111100011001111111100110000010111111100101111100010110001111011010", + "01000100111000001100100000100110101000011011010111110011110101010110010010001110110111100011010011110101001010110110011010101001100101010010101001111010110111100101001110000", + "00010010110000001110001111010001001111001110000010000010101001100101010110011101100010110110000100101000011111110010001011100101010110001111110100001111100010010010010011010", + "10010100110001111111100101011110001011100100001010010111111100110000000011001001010111100011010001111101001010001111110100010010000011011101010010000101001010010011010011110", + "11001011101000001101001001000010110110110001111101000010001111100100010010000100000010010110000100001010010010011100110000000011001111101000000101010000011101001110000100101", + "11110100101100101100011000000101100111100100101000010111110010010011100101010011010010010100001110000010001101001001100101010110011010100101010000000101001000011010010001111", + "01100010111010010111101110110100001000010011110101000100110110000010101001100010000101001001111011010111111000000101010110000010001011110010000101010010010101001111100100001", + "01000100101110011111110101011010000010010010001111110001100011010111111100110110010000011100101110000010101101010010000011010111110100000010001011110010010111100100101110010", + "10101111110110100101111000100000000111001111111010100100010010000011001111110011100101001011110011010111110111100011001111100010110000010111111100101111100010110001111011010", + "01000000111000011100100000100010101110011010101111110011100101010110010010001110110111100011010011110100001010110110011010110111100101010010101001111010110111100101001110010", + "11011110100000010110001111010111001001001111110010010010101001100011010110011101100010110110000100101001111111110010001011100011010110001111110100001111100010010010010011010", + "00010000100001111111100101011000001011100100001010001111111100110110000011001001010111100011010001111100101010001111110100010110000011011101010011100101001010010011010011110", + "11001011101000000101001001000000110110110001111101011011001111100010010010000100000010010110000100001011110010011100110000000011001111101000000100110000011101001110000100101", + "11111000101100111100011010000011100111100100101000001110010010010111100101010011010011110100001110000010001101001001100101010110011010100101010001100101001000011010010001111", + "01101111111010010111101011111000001000010011110101001111110110000010101001100010111110101001111011010111111011111101010110000010001011111111100100010010010101001111111110001", + "01001000101110011111110110001010000010010010001111111000100011010111111100110110100011111100101110000010101110001010000011010111110100011000101111110010010111100101100010010", + "10101010110110100111111110101000000111001111111010111010110010010011001111110010101010001011110011010111110110101011001111100010110000001010111010101111100010110000101011001", + "01001000111000011110100110001010101110011010101111111000100101001110010010001110100011100011010011110100010110001110011010110111100101011000101111111010110111100101100010011", + "11011111100000010010001111111111001001001111110010001111101001111011010110011101111110110110000100101001100111111010001011110011010110011111110010001111100010010011111111001", + "00010100100001111001100000110000001011100101010010010101011100101110000011001001000101100011010001111100110010000111110100001110000011010010010011100101001010010011000101110", + "11000111001000000101001001000000110100110000000101010000001111100010010010000101110000010110000100001011100001010100110000011101001111111010000100110000011101001111101110101", + "11111100101100111000011110101011100101100101010000011100010010010111100101010011100101110100001110000011001011100001100101001000011010100111110001100101001000011010011011111", + "01100011011010000101101100101000001000010010000101000011110110000100101001100010001110101001111011010110011010110100010110000100001011101010100100010010010101001111101110001", + "01001100101110011111110111000010000010010010001111101010100011010001111100110110111011111100101110000011001001110011100011010011110100001111101110010010010111100101010010010", + "10100010010110110011111011011000000101001111111010101111110010010101001111110010001110001011110011010110010110001010101111100010110001110101011011001111100010110000110011001", + "01001000111000010010100101000010101000011010101111110011000101001010010010001110010010000011010111110100010100011111111010110111100100111000001110011010110111100101000100011", + "11011010000000010100001100010111001001001111110010011110001001111011010111111100110011010110000010101001100101001010001011110011010111110101010011001111100010010011110001001", + "00010101100001101001100000111000001011100101010010010101011100101110000010101001000100000011010111111100110010000111110100001110000010010010010011100101010110010011000101100", + "11000111001000011101001001000000110100110000000101010000001111100010010011110101110001010110000010001011100001010100110000011101001111111010000100110000000011001110101110110", + "11111100101100110000011110101011100101100101010000011100010010010111100100001011100101110100010110000011001010000001100101001000011010100111110001100101010110011011011011100", + "01100011011010000101101100101000001000010010000101000011110110000100101001111010001110101001100011010110011011010100010110000100001011101010100100010010000011001111101110010", + "01001100101110011111110111000010000010010010001111101010100011010001111100101110111011111100110110000011001000010011100011010011110100001111101110010010010111100101010010010", + "10100010010110110011111011011000000101001111111010101111110010010101001111110010001110001011100011010110010111001100101111100010110001110101011011001111100010110000110001001", + "01001000111000010010100101000010101000011010101111110011000101001010010010001110010010000011010111110100010100011001111010110111100100111000001110011010110111100101000110011", + "11011010000000010100001100010111001001001111110010011110001001111011010111111100110011010110000010101001100101001101001011110011010111110101010011001111100010010011110011001", + "00010101100001101001100000111000001011100101010010010101011100101110000010101001000100000011010111111100110010000010010100001110000010010010010011100101010110010011000001100", + "11000111001000011101001001000000110100110000000101010000001111100010010011110101110001010110000010001011100001010101010000011101001110011010000100110000000011001110101110110", + "11111100101100110000011110101011100101100101010000011100010010010111100100001011100101110100010010000011001010000000000101001000011011000111110001100101010110011011011011100", + "01100011011010000101101100101000001000010010000101000011110110000100101000011010001110101001100101010110011011010100010110000100001010001010100100010010000011001111101110010", + "01001100101110011111110111000010000010010010001111101010100011010001111101001110111011111100110000000011001000010011100011010011110101000111101110010010001011100101110010010", + "10100010010111110011111011011000000101001111111010101111110010010101001110000010001110001011100101010110010111001100101111100010110001111101011011001111111100110000010111001", + "01001000111001110010100101000010101000011010101111110011000101001010010011010110010010010011001111110100010101111001111010110111100100100000001110011010101001100100100010011", + "11011111100001010100001111111111001001001111110010011111101001111011010111100100111111001110011010101001100111111101001011110011010111101111110011001111110100010010111111001", + "00011000100000101001000110001000000011100101010010001000111100101110000010110001100010011011001111111100110110001010010100001110000010001000110011110101010110010100100011100", + "11001010101001111101001010101000100100110000000101011010101111100011010011110101101011001110010010001011100010101011010000011101001110001010100100101000000011001000101010110", + "11111000101101110000111110001011101101100101010000011000110010010110000100001010100011110100010010000101001010001110000101001000011011011000110001111101010110011100100011100", + "01101111111011000101101011111000011000010010000101011111110110000101001000011011111110101001100101010000011011111010010110000101001010011111100100001010000011001010111110010", + "01001000001110111110110100010010000010010100001011110110000011010000011101001111110011111100110000000101001110101111100011010010010101001101001110010010001011100101110110010", + "10100111110111110011111000111000000101001001111100101101010010010101001110000011000100001011100101010010010011100100101110000011010001111010011011001111111100110000100011001", + "01000101011001110010100101000010101000011100101001111000000101001010010011010110010000010011001111110100010010010001111011010110000100101011001110011010101001100101101110011", + "11011110100001010101101010101111011001001011110100001100001000011011010111100101000101001110011010101001100100000101001010010011010111110110010011001111110100010011011011001", + "00010001000000101000100000101000000011100101010010000011111101001110000010110000001110011011001111111100110001010010010101001110000010001011001011110101010110010100001111100", + "11001110101001111101101101000000100100110000000101010010101110000011010011110100011011001110010010001011100100010011010000011101001110011110011100101000000011001001010010110", + "11110000001101110000111111011011101101100101010000000111110011010110000100001011101111100100010010000101001111001110000101001000011011001011001001111101010110011100010111100", + "01101010111011000101101111000000011000010010000101010011010110000101001000011010110010110001100101010000011011111010010110000101001010000110010100001010000011001010000010010", + "01001000001110111110110100010011100010010100001011110110000011010000011101001111110011100100110000000101001110101111100011010010010101010011001110000010001011100011110111110", + "10100111110111010011100000111000000101001001111100101101010010010100001110000011000100010011100101010010010011100100101110000011010001100110011011010111111100110110100010101", + "01000101011001110010101101000010101000011100101001111000000101001011110011010110010000010011001111110010010010010001111011010110000100110011001110000010101001100011101011111", + "11011110100111110101101010101111111001001011110100001100001000011010110111100101000101001110011010101111100100000101001010010010010111110110010011010111110100010011011100001", + "00010001000110101000100000101000000011100011010110000011111101001111100010110000001110011011001111111010110001010010010101001111100010001011001011110101010110010100001001100", + "11001110101010111101100101000000001100110110000011010010101010000011010011110100011011001110010010001111100100010011010001111100101110011110011100101000000011001001010100110", + "11110000001100110000101111011010100101100011010110000111110101010110000100001011101111100100010010000101001011001110000100101001111011001010001001111101010110011100010111100", + "01101010111000000101001111000000010000010110000011010011010001100101001000011010110010110001100101010000011101111010010011100101001010000111110100001010000011001010000010010", + "01001000001011011111100100010010010010000100001010010110000100110000011101001111110011100100110000000101001000101111100100010010010101010010110110000010001011100011110111110", + "10100111110111110011000000111000001101010001111101001101010011110100001110000011000100010011100101010010010101100100101000000011001001100111100011010111111100110110100010101", + "01000101011001010011001101000010111000000100101000011000000100001011110011010110010000010011001111100010010010010001111101010110011100110101010110000010101001100011110011111", + "11011110100001010101101010101110011001010011110101001100001000011010101111100101000101001110011010110111100100000101001010010010001111110000000011010111110100010111000100001", + "00010001000011001000100000101000001011100011010110000011111101001111111010110000001110011011001111100010110001010010010101001111110010001101001011110011010110000100010000000", + "11001110101110111100000101000000000100110110000011010010101010000011001011110100011011001110010010010111100100000011010001111100101110011010011100101110000011010001000101110", + "11110000001000110001101111011010110101100011010110000111110101010110010100001011101111100010010010000101001011010110000100101001111011001010001001111011010110000100010111000", + "01101111111000000101001111111000010000010110000011011111110001100101001000011010111110110111100101010000011111111010010011100101001010001111110100001110000011010010111110110", + "01001000101011011111100010001010010010000100001010011000100100110000011101001111100011100010110000000101001110001111100100010010010101011000110110000010001011100010100011110", + "10101010110111110011001110101000001101010001111101011010110111110100001110000011101010010111100101010010010010101100101000000011001001111010100011010111111100110111101010101", + "01001000111001010011001110001010111000000100101000011000100010001011110011010111100010010011001111100010010110001001111101010110011100111000110110000010101001100011100011111", + "11101111100001010101101011111110011001010011110101001111101110011010101111100101111111001110011010110111100111111101001110010010001111101111100011010111110100010110111110001", + "00001000100011001000110101000000101011110011010111100011011011001111111010110000010010011011001111100010110101100010010011001111110010010111101011110011010110000101100010000", + "11011010001110111100000110010000100100101110000010101110001010000011001011110100110011001110010010010111100010110011010111111100110110010010111100101110000011010001110111010", + "11010101101000110001100010111011110101111011010111101101010101010110010100001010000101100010010010010101001001100110000010101001100011011111101001111011010110000100000010000", + "01100111011110000101001101000000010000001110000010010000010001100101010000011010010000110111100101001000011010010010010011100101010010000101010100001110000011010010110011010", + "01001100101011011111100100101010010010000100001010011100000100110000000101001110100101100010110000011101001010000111100100010010000101001000010110000100001011110010000101110", + "00100011000001110011001000101000001101010001111101010011110111110100010110000011001110010111100101001010010001010100101000000011001001101101000011010001111100101110010000101", + "10011100100001010011010001000011011000000100101000010010100010001011100011010111111010010100001111100010010110000001111101010110011100110010010110000100101001111010100101111", + "01100010010111010101111111011111111001010011110101011111101110011010101111100011001111001001111010110111100101010101001110010010001111111010000011010011110100001111001110001", + "11001000111111001000101101000000101011110011010111100011011011001111111010110110110010011100101111100010110101100010010011001111110010010111101011110010010111100101111010000", + "00101010000110111100000110010000100100101110000010101110001010000011001111110011010011001011110010010111100010110011010111111100110110010010111100101111100010110001100111010", + "10010101100100110001100010111011110101111011010111101101010101010110010010001111100101100010010011110101001001110110000010101001100011011111101001111010110111100100011010000", + "01100111010110000101001101000110010000001110000010010000010001100101010110011011010000110111100100101000011010001010010011100101010110000101010100001111100010010010110011010", + "11001100111011011111100100101000010011100100001010011100000100110000000011001110100101100010110001111101001010011111100100010010000011001000010110000100001011110010000101110", + "00100011000001110011001000101000001100110001111101010011110111110100010110000011001110010111100100001010010001001100110000000011001111101101000011010001111100101110010000101", + "10011100100001010011010001000011011001100100101000010010100010001011100011010111111010010100001111100010010110000001100101010110011010110010010110000100101001111010100101111", + "01100010010111010101111110011111111000010011110101011111110110011010101111100011001111001001111010110111100101010101010110010010001111111010000011010011110100001111001110001", + "11001000111111001000101101100000101011110011010111100011000011001111111010110110110010011100101111100010110101100010000011001111110010010111101011110010010111100101111010000", + "00101010000110111100000110110000100100101110000010101110010010000011001111110011010111001011110010010111100010110011010111111100110110010010111100101111100010110001101111010", + "10010101100100110001100010011011110101111011010111101101000101010110010010001111100011100011010011110101001001110110000010101001100011011111101001111010110111100100010010000", + "01100111010110000101001100000110010000001110000010010000010001100101010110011101110110110110000100101000011010001010010011100101010110000101010100001111100010010010110011010", + "11011100111011011111100101101000010111100100001010011100000100110000000011001000000011100011010001111101001010011111100100010010000011001000010110000101001010010010000101110", + "10101011000001110001001010101000001110110001111101010011110111110100010010000100101110010110000100001010010001001100110000000011001111101101000011010000011101001110010000101", + "00011000101001010011010100000011011011100100101000010100100010001011100101010010011010010100001110000010010110000001100101010110011010110010010110000101001000011010100101111", + "00101110000111011111111011111111111110010011110101011111110110011010101001100010111111001001111011010111100111111101010110010010001011111111100011010010010101001111111110001", + "00000000101111000000101010001010101110010011010111101000100011001111111100110110100010011100101110000010110110001010000011001111110100001000101111110010010111100100100010000", + "11111110111110101000000010101100100011001110000010101010110010010011001111110010101011001011110011010111100110101011001111111100110000011010111010101111100010110001101011010", + "10000010000100110011100110001111110110011011010111111000100101001110010010001111100011100011010011110101010110001110011010101001100101011000101111111010110111100101100010000", + "10111010111110011111001011111100010011001110000010001111101001111101010110011101111110110110000100101000000011111010001011110101010110011111110010001111100010010011111111010", + "10111010100011000001100010011110010110000101010010001001111100101000000011001000101111100011010001111101010011010111110100001010000011010010010110000101001010010011001111110", + "10111010101001110001001001100100001011010000000101010101001111110100010010000101110010010110000100001010000111100100110000011101001111101111100011010000011101001110011010110", + "10000010110001011011010100110101011110000101010000001010010010001011100101010011010110010100001110000011010010110001100101001000011010111010110110000101001000011011001111110", + "11111110111111011111111010011111111011010010000101011101010110011100101001100010000011001001111011010110000011110101010110010100001011101111100011010010010101001110010010000" + ], + "2": [ + "11111110000111010001100111011101000000010001110100110101100001100110111011100111101111010100000001000010111110001110010101010011110101010011010111110011001010000010001111111", + "10000010011110000000001110110001000011111000101010101110011001000011111111010001010101110111111100000011110010011101111110110010000110110100110100011000101011100100001000001", + "10111010000111000010000010001110010000110000010011101011111111010100100110010110001100011110101111000100110100100101000110001010111110001111001100100000010011011110101011101", + "10111010000110000100100110100111111110111100101010011101111111001001010001001101000100000111011111000000000001110011001010000100010110000001111010001110010101010101001011101", + "10111010110001100111010011111011110110001111000010001111110111010000001101010001111111100001110111110100001011111000100011100101010101101111100001000101111100110011101011101", + "10000010010011101101100010001100101110110101000111001000110100101110010010111100100010011110110001101110011010001000010011011111110101001000111001110101000110001000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000101010101111101110001011111101010101111110001000110010111001001011111011100011110000010010101001011010001000101011100111001101111000100001001101111110110011000000000", + "00110011111101011111111111111100100101001111110001011111100100010010001010010110111111011000110100011011011111111000010001011111010001001111111001010101001110001001111010000", + "01110000000111010001100001011101000000010001110100110101100001100110111011100111001111010100000001000010111110001110010101010011110101010100101111110011001010000101110111110", + "01100110111110000000001000110001000011111000101010101110011001000011111111010001110101110111101100000011110110011101111110110010000110110101001100011000101011100110110100011", + "01011001000111000010000100001110010000110000010011101011111111010100100110010110101100011000100111000100110100100101000110001010111110001001010100100000010011011110101100100", + "00100010000110000100100000100111111110111100101010011101111111001001010001001101100100000001011111000000000101110011001010000100010110000111110010001110010101010010100010001", + "11000100110001100111010111101011110110001111000010000011010111010000001101010001111001100111111111110100001000111000100011100101010101100100000001000101111100110011000001000", + "00001011010011101101100101011100101110110101000111000011110100101110010010111100011000011100101001101110011011110000010011011111110100111100111001110101000110001011011001110", + "10000000011100011001011111010101001011100011001000110000100100001111111101001101110111000010111100011111101111111110011101010001111010110100010111111011001000000101110111111", + "10010110110000110010010110010001001000100010011100101011001001111111100111111011010010110111001001110110110011000101111100110010111101010111010100111000100011100100010100111", + "10101001011100001010111010000110011011011100101111101110111010111101100000111101110100001011000010011001100101010101001110001000101111001111110100101000010001011110101100101", + "11010010001000110110111110000111110011010110011100011000101111110101001001100111100011000111001010110101000000101011001000000100110000000011111010101110011101010000000010101", + "00110100101010101111101001100011111111011101111110000110010010111001001011111010100001110101001010101001011001001000101011100111010011100100111001001101111110110011000001001", + "11111011011101011111111011111100100101100011110001000110100100010010001010010111011111011010000100011011011110101000010001011110001101011100101001010101001110001001111001010", + "01110000000111010001100001011101000110111001110100110101100001100110111011100110001111010001001001000010111110001110010101010010000011010010110111110011001010000101110111110", + "01100110111110000000001000110001000001001010101010101110011001000011111111010001010101110001000100000011110110011101111110110011100001010001010100011000101011100110110100011", + "01011001000111000010000100001110010000110110010011101011111111010100100110010110101100011001100111000100110100100101000110001011011001101111001100100000010011011110101100100", + "00101111100110000100100011111111111011111000101010011111111111001001010001001101111110000001111111000000000111111011001010000100010011101111100010001110010101010010111110001", + "11001000110001100111010010001011110110001001000010011000110111010000001101010001100011100110101111110100001010001000100011100101010010101000111001000101111100110011100011000", + "00001010110011101101100010101100101000100001000111001010110100101110010010111101101010011100010001101110011110101000010011011111101011001010100001110101000110001010101011110", + "10001000111100011001011110001101001001101011001000111000100100001111111101001101100011000010011100011111101010001110011101010001100101011000101111111011001000000101100011111", + "10011111110000110010010011111001001001001000011100101111101001111111100111111011111110101110101001110110110111111101111100110011100100111111100100111000100011100100111110111", + "10101001011100001010111011111110011101100010101111111110111010111101100000111100011110000010010010011001100110101101001110001001011110001010101100101000010001011111111000101", + "11010010001000110110111011011111110111111100011100010101101111110101001001100110001111000110010010110101000000001011001000000101010001111100100010101110011101010001010110101", + "00110100101010101111101000110011111101011011111110010110010010111001001011111010110101100100101010101001011010011000101011100110110010000101000001001101111110110011010101001", + "11111011011101011111111110001100100000100011110001001011100100010010001010010111101101011010000100011011011000100000010001011111001000100001011001010101001110001000001101010", + "01110000000111010001100000100101000000111111110100100101100001100110111011100111100101011000011001000010111101110110010101010011100100010111101111110011001010000100100011110", + "01100110111110000000001101101001000101001100101010100011011001000011111111010001011001111001111100000011110110111101111110110010000110101100001100011000101011100111100000011", + "01011001000111000010000101011110010010110000010011111011111111010100100110010110011000011001000111000100110111110101000110001010111110001100110100100000010011011110111000100", + "00100010000110000100100101010111111111111110101010010000111111001001010001001101110110011001011111000000000011111011001010000101010010011100010010001110010101010011010110001", + "11000100110001100111010110010011110000001111000010010011010111010000001101010001110011101110111111110100001011000000100011100100110011100111000001000101111100110010010101000", + "00001011010011101101100000000100101100100111000111001110110100101110010010111101010100011100001001101110011011010000010011011110001010100111111001110101000110001010001101110", + "10000000011100011001011110000101001011101101001000100000100100001111111101001100000111010010011100011111101100101110011101010000000100110011110111011011001000000101100011111", + "10010110110000110010010011100001001101001110011100100110001001111111100111111010000010110111101001110110110101001101111100110010100101001100110100011000100011100101100000111", + "10101001011100001010111011111110011011100100101111111110111010111101100000111100111110000011000010011001100110101101001110001000111111001100110100101000010001011111111000101", + "11010010001000110110111011011111110011111010011100010101101111110101001001100111101101001111001010110101000000001011001000000100110000011010111010101110011101010001010110101", + "00110100101010101111101000110011111111011101111110010110010010111001001011111011110101110100101010101001011010011000101011100111010011100001011001001101111110110011010101001", + "11111011011101011111111110001100100100100101110001001011100100010010001010010110101011000010000101011011011000100000010001011110001001000111001001010101001110001000001101010", + "01110000000111010001100100100101000110111001110100100101100001100110111011100111000111011000001000000010111101110110010101010010000101010001101110010011001010000100100011110", + "01100110111110000000001001101001000001001010101010100011011001000011111111010000111001110001100100100011110110111101111110110011100111001010001101111000101011100111100000011", + "01011001000111000010000101011110010000110110010011111011111111010100100110010111011100001001011110100100110111110101000110001011011111101000110101000000010011011110111000100", + "00100010000110000100100001010111111011111000101010010000111111001001010001001100110100000001010110100000000011111011001010000100010011111010010011001110010101010011010110001", + "11000100110001100111010010010011110110001001000010010011010111010000001101010001010011101110110110010100001011000000100011100101010010100001011001000101111100110010010101000", + "00001011010011101101100010000100101000100001000111001110110100101110010010110100110110010100001000001110011011010000010011011111101011000001100001110101000110001010001101110", + "10000000011100011001011000000101001001101011001000100000100100001111111101001101000011000010000100011111101100101110011101010001100101010111101111111011001000000101100011111", + "10011111110000110010010111111001001001001000011100101111101001111111100111100011111110101111100001010110110111111101111100110011100100101111100100111000100011100101111110111", + "10101000111100001010111110001110111001100010110111101000111010111101100000110100100010000011011011111001100010001101001110001001011110011000110101001000010001011111100010101", + "11011010101000110110111110101111010111111100010100001010101111110101001001110111101011000111010010110101000110101011001000000101010001111010111011001110011101010000101010101", + "00111000101010101111101010001011111011011011110110001000110010111001001011101010100011100100110011001001011010001000101011100110110010001000111000101101111110110011100011001", + "11111111111101011111111111111100000110100011100001001111100100010010001010011111111111011010001101111011011011111000010001001111001000101111101000010101001110001000111111010", + "01110000000111010001100001010101000100111001100100111000100001100110111011111111010001011000000000100010111101111110010101001011100100000010001111110011001010000100110111110", + "01100110111110000000001100010001100011001010110010100011011001000011111111011000010001111001100101100011110001000101111110101010000111000001001100011000101011100111010100011", + "01011001000111000010000110000111110110110010000011100110111111010100100110010111110100011001011111000100110011010101000110010010111111111001110100100000010011011111001100100", + "00100010000110000100100110000111011001111000110010010000111111001001010001010100000110011001010111100000000110101011001010000101010011110111110010001110010101010011100010001", + "11000100110001100111010001100011010010001111010010001110010111010000001101011001100011101110110110010100001011001000100011100100110010110100111000100101111100110010000001000", + "00001011010011101101100101111100001110100111000111001110110100101110010010101101011110011100001001101110011100101000010011011110001010101100100000010101000110001010111001110", + "10000000011100011001011101011101001101101001001000111101100100001111111101011101001101011010000101111111101000001110011101010000000100100010101110011011001000000100010111111", + "10010110110000110010010010110001101111001110011100100110001001111111100111110011010100110111100000010110110000011101111100100011100101000001000101111000100011100101010100111", + "10101001011100001010111010001110011111100010111111100011111010111101100000100100001010001011011011111001100110100101001110010001011111011001010100101000010001011111101100101", + "11010010001000110110111010100111010101111100000100010101101111110101001001101110000111000111010011010101000111110011001000011101010001110111111010101110011101010001100010101", + "00110100101010101111101011101010011011011111101110001011010010111001001011111011111001110100110010101001011110111000101011111110110010010100011001001101111110110010100001001", + "11111011011101011111111101011100000010100011101001001011100100010010001010001110111101000010001100111011011101110000010001011110001000101100101001010101001110001000111001010", + "01110000000111010001100111011101100100111001100100111000100001100110111011101111010101011000000000100010111101111110010101010010000100000010001110010011001010000100110111110", + "01100110111110000000001000000001100011001010101010100011011001000011111111000000110011100001100100000011110001000101111110110011100111000001001101111000101011100111010100011", + "01011001000111000010000110010110010110110010010011100110111111010100100110000110010110011001011110100100110011010101000110001011011111111001110101000000010011011111001100100", + "00100010000110000100100100000111011001111000101010010000111111001001010001000101100010011001010110100000000110101011001010010101010011110111110011001110010101010011100010001", + "11000100110001100111010111111011110010001111010010001110010111010000001101001001100111101110110110010100001011001000100011111100110010110100111001000011111100110010000001000", + "00001011010011101101100001111100001110100111011111001110110100101110010010110101011100001100001000001110011100101000010011000110001010101100100001110011000110001010111001110", + "10000000011100011001011101011100101101101001011000111101100100001111111101001101001111000010000100011111101000001110011101001000000100100010101111111111001000000100010111111", + "10010110110000110011010000100001101111001110000100100110011001111111100111100011010000101111100001010110110000011101111100110011100101000001000100111110100011100101010100111", + "10101001011100001011011100000110111111100010111111100011101010111101100000110100001110000011011011111001100110100101001110001001011111011001010101001000010001011111101100101", + "11010010001000110111111110110111010101111100011100010101111111110101001001110110000101010111010010110101000111110011001000000101010001110111111011001110011101010001100010101", + "00110100101010101110101011111011111011011111111110001011010010111001001011101011111001110100110011001111011110111000101011100110110010010100011000101101111110110010100001001", + "11111111111101011111111111111100000010100011110001001111101100010010001010011110111111000010001101111101011111111000010001001110001000101111101000010101001110001000111111010", + "01111000100111010001100110001101000100111001100100111000111001100110111011111111100011011000000000100000111010001110010101001010000100011000101110010101001010000101100011110", + "01101010111110000000101110101001100011001010110010101010100001000011111111011001101011100001100101100101110010101101111110101011100111011010101101111110101011100110101010011", + "01011000100111000010100110001111110110110010000011111000101111010100100110010111100010011001011111000110110110001101000110010011011111101000110101000110010011011110100010100", + "00101111100110000101100011111111011001111000110010011111110111001001010001010100111110011001010110100000000111111011001010000101010011111111110011001010010101010011111110001", + "11000100110001100110110110110011010010001111010010000110011111010000001101011000010111101110110111110010001100011000100011100100110010101001011000100101111100110011110101000", + "00001011010011101100100000010100001110100111000111011011110100101110010100101101101100001100001000101110011110100000010011011110001010101001000000010101000110001011101101110", + "10000000011100011000011100100101001101101001001000110101100100001111111101011101100011000010000100011001101001110110011101010000000100111111101110011011001000000101000011111", + "10010110110000110010010001101001101111001110011100110011000001111111100101111010111000101111100000010000110010111101111100100011100101000100000101111000100011100101000000111", + "10101001011100001010111101001111111111100010111110001011100010111101100100101101111100000011011010011001100001110101001110010001011111000100110101001110010001011110011000101", + "11010010001000110110011001011110110101111100000100000000110111110101001001101110110011010111010011110011000101111011001000011101010001110010011011001000011101010000110110101", + "00110100101010101111001100000010011011011111101110000011000010111001001111110011010001110100110010101011011111000000101011111110110010001001011000101011111110110011110101001", + "11111011011101011110111110010100000010100011101000111110101100010010001110011111010101000010001101111011011111010000010101011110001000101001101000010001001110001000101101010", + "01110000000111010000000010000100100100111001111100110010101001100110111111101110100111011000000001000100111010101110010011010010000100011111101110010011001010000101000011110", + "01100110111110000001001111111001000011001010110010010000011001000011111001011000000101100001100101000011110011001101111000110011100111000100101101111000101011100110000000011", + "01011001000111000011000001111111010110110010001011001100111111010100100110011110111100011001011111000010110010101101000000001011011111100100110101000000010011011110011000100", + "00100010000110000100100101011111011001111000101010100001110111001001010011000100001110011001010110100110000100001011001010010101010011110010110011001110010101010011110110001", + "11000100110001100111010100100010010010001111001010000110001111010000001001011000010001101110110111110100001100011000100011111100110010101001011000100011111100110011110101000", + "00001011010011101101000010000100101110100111011111111101101100101110010010110101101000001100001000101000011110100000010011000110001010101001000000010011000110001011101101110", + "10000000011100011001111010110100001101101001010001010101110100001111111001000101100111000010000100011101101001110110011101001000000100111111101110011101001000000101000011111", + "10010110110000110011010011111001101111001110011100010011000001111111100011110010111000101111100000010110110010111101111000100011100101000100000101111100100011100101000000111", + "10101001011100001011011001011111111111100010100111101101110010111101100100110101111100000011011010011111100001110101001000010001011111000100110101001000010001011110011000101", + "11010010001000110111111001001111110101111100000100100110101111110101001111101110110011010111010011110101000101111011001110011101010001110010011011001110011101010000110110101", + "00110100101010101110101100010010111011011111100110100011010010111001001011110011010001110100110010101111011111000100101101111110110010001001011000101101111110110011110101001", + "11111011011101011111111110000100000010100011110001111100101100010010001000011111010101000010001101111101011111010010010001001110001000101001101000010101001110001000101101010", + "01110000000111010001100010010100100100111001111100110000111001100110111111101110100111011000000001000010111010101110010101001010000100011111101110010101001010000101100011110", + "01100110111110000000101111101001000011001010110010010000000001000011111111011000000101100001100101000101110011001101111110101011100111000100101101111110101011100110100000011", + "01011001000111000010100001101111010110110010001010001110101111010100100010011110111100011001011111000110110010101111000110010011011111100100110101000110010011011111111000100", + "00101111100110000101100111111111011001111000101010101111110111001001010101000100111110011001010110100000000111111101001110010101010011111111110011001010010101010010111110001", + "11001000110001100110110010001010010010001111001010001000111111010000001001011000100011101110110111110010001010001010100101111100110010101000111000100101100100110010100011000", + "00001010110011101100100010101100101110100111011111101010110100101110010100110101101010001100001000101110011010101110010101000110001010101010100000010101011110001011101011110", + "10001000111100011000011010001100001101101001010000011000100100001111111101000101100011000010000100011001101010001000011011001000000100101000101110011011000000000100100011111", + "10011111110000111010110111111001101111001110011100011111100000011111100101110010111110101111100000010000110011111011111100100011100101001111100101111000101011100100111110111", + "10101001011100011011011100010111111111100010100111101110100011111101100100110100110100000011011010011001100101010111001110010001011111001001110101001110010001011110101100101", + "11010010001000101111011000000111110101111100000100111110110110110101001001101111000111010111010011110011000100101011001000011101010001100111111011001000011101010000100010101", + "00110100101010111110001001100010111011011111100111100000000011011001001111110010100101110100110010101011010001001010101011111110110010000100111000101011111110110011000001001", + "11111011011101000110011001100100000010100011110001100110100100110010001110011110011101000010001101111011001010101110010101001110001000111100101000010001001110001000011001010", + "01110000000111010001000111001100100100111001111100110111111000100110111111101111101111011000000001000100100110001100010011001010000100010010101110010101010010000100010111110", + "01100110111110001000001110111001000011001010110010001110011000100011111001011001110001100001100101000011100010011011111000101011100111010001001101111110110011100111110100011", + "01011001000111010011100100011111010110110010001011001101110111010100100110011111001000011001011111000000101100100011000000010011011111101001010101000110001011011111001100100", + "00100010000110001101000010101111011001111000101010111101111111101001010011000101000110011001010110100110010001110101001010010101010011100111110011001010000101010010000010001", + "11000100110001110111110001110010010010001111001010000011001110010000001001011001011001101110110111110000000000111010100011111100110010100100011000100011111100110011000001000", + "00001011011011110101100011010100101110100111011111100101110101101110110010110100011100001100001000101010011111110000010011000110001010111100100000010011000110001011111001110", + "10000000011100001000111111000100001101101001010001010110101101001110011011000100010011000010000100011011111111111100011101001000000100110010001110011101001000000101110111111", + "10100110100000101011110100011001101111001110011100001011001001011111100001110011110000101111100000010000110110100011111000100011100101010001000101111100100011100101110100111", + "10101001010100001010011100011111111111100010100111101100100011111101100000110100110100000011011010011101100101010111001000010001011111001001110101001110001001001111001100101", + "11110010000000111110111000001111110101111100000100111000101110010101101111101111000111010111010011110001000100001101001110011101010001100111111011001000000101001001000010101", + "00110100111010111110001001110010111011011111100110100000011010111001001011110010100101110100110010101101000001101110101101111110110010000100111000101011100110101010100001001", + "11111011000101010110011001110100000010100011110001100110100100110010001110011110011101000010001101111101001010001110010001001110001000111100101000010001011110010001011001010", + "01010000000111000001000111000100100100111001111100010101111000100111111111101111101111011000000001000110110111101100010101001010000100010010101110010101001010000101110111110", + "01100110110110011000001110111001000011001010110010001000011000000011011001011001110001100001100101000111110010011101111110101011100111010001001101111110101011100110010100011", + "01001001000111010011100100011111010110110010001010101101110110010101000110011111001000011001011111000000100100100111000110010011011111101001010101000110010011011110101100100", + "00010010010110011101000010101111011001111000101011111101111111101001010101000101000110011001010110100110000001110101001110010101010011100111110011001010010101010011000010001", + "11000100100001100111110001110010010010001111001010100001001110010000001001011001011001101110110111110000001001111010100101111100110010100100011000100011100100100010100001010", + "00101011011011100101100011010100101110100111011111100011110101001110110100110100011100001100001000101010011110110110010101000110001010111100100000010011011110010010011001101", + "10000000001100001000111111000100001101101001010001110110101100001111111101000100010011000010000100011011110110011000011011001000000100110010001110011101010000011100010111100", + "10011111101000111011110111111001101111001110011101001111101001011111100011110011111110101111100000010000100111111011111000100011100101011111100101111100110011111100111110100", + "10001000111100011010011010001111111111100010100111011000100011111100100100110101100010000011011010011101101110001111001000010001011111001000110101001110010001011111100010101", + "11011010100000101110111110101111110101111100000100111010101110110101101111101111101011010111010011110001000110101011001110011101010001111010111011001000011101010001101010101", + "00101000101010111110001110001010111011011111100111001000111011111000101011110011100011110100110010101101001110001010101101111110110010001000111000101011111110110011100011001", + "11001111101101000110011011111100000010100011110000101111100100110010001110011110111111000010001101111101011111111110010101001110001000111111101000010001001110001001111111010", + "01110000010111010001000100101100100100111001111100000101111000100110111111101110000111011000000001000110111101010100010011001010000100010111101110010101010010010101100011100", + "01000110110110001000001101110001000011001010110010000011011000100011011001011000011001100001100101000111110101011011111000101011100111001100001101111110110011111111000000000", + "01011001010111010011100011010111010110110010001010111011110111010100100110011111111100011001011111000000101111110001000000010011011111101100110101000110001011000111011000111", + "00100010011110001101000011000111011001111000101011110010111111101001010101000101110010011001010110100110010001111001001110010101010011111010010011001010000101001010110110010", + "11100100110001110111110010011010010010001111001010110111001110010001001001011000110001101110110111110000000011000010100101111100110010100001011000100011111100010010110101000", + "00001011011011110101100000011100101110100111011111101000110101101110110100110101110100001100001000101010011000010110010101000110001010100001100000010011000111001011101101110", + "10010000011100001000111000001100001101101001010001100000101101001110011101000100100111000010000100011011111101101010011011001000000100110111101110011101001001000101100011111", + "10100110100110100011110101110001101111001110011101000100001001011001100011110011000100101111100000010000110110101111111000100011100101001100100101111100100010000100000100111", + "10101001001010001010011111110111111111100010100111011010100011111001100100110101011100000011011010011101100110001111001000010001011111001100110101001110001001001110111110111", + "11110010000110111110111011000111110101111100000100110011101110010111101111101110101111010111010011110001000011101101001110011101010001111010111011001000000101001000110000110", + "00110100111010100110001110111010111011011111100111010110011010111001001011110010010001110100110010101101000010011100101101111110110010000001011000101011100110101010110011010", + "11111011000101000110011000011100000010100011110000101001100101110100001110011110101001000010001101111101001010100010010101001110001000100001001000010001011110010001101101001", + "01010000000101001001000100101100100100111001111100000001111001000001111111101110000111011000000001000110110101110100010011001010000100010111101110010101010011100100000010010", + "01100110110010001000001101110001000011001010110010000101011001000001011001011000011001100001100101000111110101111011111000101011100111001100001101111110110010000110000000111", + "01001001000001011011100011010111010110110010001010111011110110010101000110011111111100011001011111000000111110110001000000010011011111101100110101000110001010111111011001000", + "00010010010000011101000011000111011001111000101011110010111110101101010101000101110010011001010110100110011000011001001110010101010011111010010011001010000100010010110010001", + "11000100100111111111110010011010010010001111001010110111001111110010001001011000110001101110110111110000000011100010100101111100110010100001011000100011100100100010110011010", + "00101011011101100101100000011100101110100111011111101000110100111011110100110101110100001100001000101010010000110110010101000110001010100001100000010011011110010011101011101", + "10000000001101100000111000001100001101101001010001100000101101000010111101000100100111000010000100011011100100101010011011001000000100110111101110011101010000011100000101100", + "10011110101001101011110101110001101111001110011101000100001000001001100011110011000100101111100000010000101111001111111000100011100101001100100101111100110011111100000000100", + "10111101011110110010011111110111111111100010100111011010100010011011000100110101011100000011011010011101101110101111001000010001011111001100110101001110001100100111011001001", + "10101010010101111110111011000111110101111100000100110011101111110110101111101110101111010111010011110001001011001101001110011101010001111010111011001000000010100000110111001", + "00011000100101110110001110111010111011011111100111010110011011101001001011110010010001110100110010101101010011011100101101111110110010000001011000101011100001011010110100101", + "00101111001011100110011011111100000010100011110000101111100101110111101110011110111111000010001101111101000011111010010101001110001000101111101000010001011001001001111110010", + "00000000110000101001000010001100100100111001111100011000111001001100011111101111100011011000000001000110110110001100010011001010000100001000101110010101010010010101100011100", + "11111110100000101000001010101001000011001010110010011010111001010110011001011000101011100001100101000111111010101011111000101011100111001010101101111110110011111110101010000", + "10000010001110111011100110001111010110110010001010101000110110011000100110011111100010011001011111000000111110001001000000010011011111101000110101000110001011000111100010111", + "10111010010111111101000011111111011001111000101011111111111110111110110101000100111110011001010110100110011011111000001110010101010011111111110011001010000101001010111110010", + "10111010100011111111110101110010010010001111001010101100001111110110101001011001100101101110110111110000000110101011000101111100110010110100111000100011100001000011100100100", + "10111010101110100101100101110100101110100111011111101010110100101101110100110100111100001100001000101010010100001111110101000110001010101100100000010011011001110011011110001", + "10000010010011000000111001000100001101101001010001111011101101011111111101000101001111000010000100011011100101101011111011001000000100100010101110011101010111111101010000010", + "11111110000110001011110000111001101111001110011101000110001000011010000011110010110000101111100000010000101010011110111000100011100101000001000101111100110100111100110011110" + ], + "3": [ + "11111110000011010000101100010100000000100010000010101111011100011010000101001011001010110101001100000100101001010011100011010011100011010100110111110010010111110010001111111", + "10000010111101001110010110100011010010111010001011111110000000110110100101110000001011110000100011100101000010110010000001010010000001010101010100011001010100011000001000001", + "10111010101111110011100101001000110100101111110010111011101000001001101000011010010011110011010001011111001100001010111001101010111001101001001100100001101100100110101011101", + "10111010010111111000101100010101111111011101110111111111011100110010000101000110010100000010101101010001100010000100010111110100010111110111100010001111100010001101001011101", + "10111010010100011110011011111011010110010011010100011111111110101100111001111101111111010110111010110010000011111101010100111101010100111111100001000011100001000011101011101", + "10000010010000100011111110001111011111010010100110011000101001011011001000111101100010100001101110001000111010001111101101000111101101011000111001110011011001110000101000001", + "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "00000000000010011110001110001011011001000111011111011000110101100100000100110110100010011101011100110010111110001111010101111111010101101000100001001011100001001010100000000", + "01110110001101011011110111111000100100000001001100111111110011101001011100011100111111000101010110001010100011111111001101011111001101011111111001010001011001010000000000110", + "11011001100011010000101110010100000000100010000010100111011100011010000100001011001011111101001100000100101011010011100011010011100011001010110111110010010111110010001001110", + "00100010011101001110010010100011010010111010001011101110000000110110110101110000101011000000100011100101000010110010000001010010000001010001010100011001010100011000100010011", + "01001101101111110011100111001000110100101111110010110011101000001001101001011010010011110010110001011111001010001010111001101010111001101111001100100001101100100000101100100", + "10001111010111111000101000010101111111011101110111101111011100010010011101000110110100000010001101010001100100000100010111110100010111100001100010001111100010001110100010001", + "01101101010100011110011000100011010110010011010100010001111111001100111001111101111101010111111010110010000001100101010100111101010100100010000001000011100001000011000001000", + "01001111110000100011111111001111011111010010100110000011101001011011010000111101000110100001001110001000111001011111101101000111101101001000111001110011011001110010011001110", + "10010100110100101000111100010101101111110001101001101000100010010010111010000001001000101011101010000100001111010001100011001001100011001010010111111101010111111100001011111", + "00111011100000110110011110100101001001101100100001011001101110100100101001110000000010101000111011100111001100110010100000110010100000101001010100111100110100111101101010111", + "00000000111000001011110101001111011011111001011001111100001110100001010111010000010000100110010111011111110000001000111000001000111000010001101100101001001100101001010010101", + "10010110101011111000100100010101100100001100111101011000100110000000001011000110011101110110010101010011110100000100110111100100110111100111100010101111100010101110010100101", + "00100000000010011110001010110101011001000010011111011110010101100100001100110111111110011111011100110011100111100111010100000111010100000010100001001100000001001101000001001", + "01010110001100100011110011000110100100000110101100110100001111001001000110011101101111011001010110001011011111011111001100101111001100111010111001010100111001010101111001010", + "11011001100010101000101110001101100000100101110010100111001001111010001111001011001011100001001100000101010011010011100010001011100010010100110111110101010111110101110110010", + "00100010011101001110010010110010110010111111011011101110011100110110111101010000101011001100100011100100110010110010000000101010000000100101010100011110110100011111110101111", + "01001101101111110011100111010110110100101010101010110011110001001001100001011010010011110000110001011111010010001010111000010010111000010001001100100110001100100111010001000", + "10001111110110000000101011111011111111011010001111101111110000010010011111000110111110011110001101010001111111111100010110000100010110011111100010001010000010001011111111001", + "01101000110101100110011010001010110110010000110100011000111011001100111010111101100011001011111010110010011010001101010101100101010101111000100001000100100001000100100011000", + "01001010110000100011111110101110111111010001110110011010110101011011010000011100101010101101001110001000101010101111101100111111101100111010111001110100111001110101101011110", + "10011000110100101000111010001011101111110000100001111000101011010010111010000000100010101001101010000101010010001001100010110001100010101000110111111010110111111010100011111", + "00111111100001001110011011111011001001101011001001001111100010100100101011110000111110110100111011100110110011111010100101010010100001011111110100111001010100111000111110111", + "00000100011001110011110111011110100011111010101001110100010010100001010100010001101110111010010111011110001100111000111111001000111001001100101100101110001100101111100111001", + "10011011101011111000100110011100000100001001101101001111001010000000001011100110001011111010010101010010000100110100110000000100110110011010100010101000000010101001001001001", + "00100000000010011110001010111011011001000101000111011110011100100100001100110111001010011101011100110010111001010111010011100111010101100001000001001011100001001011000010101", + "01011111101101011011110011000000111100000001010100101011101011001001000100011101010011000101010110001010100011001111001101011111001101001111011001010001011001010000101100010", + "11011101000011010000101100011100000000100000000010101111001101111010001100001010110101111101001100000100101110000011100011010011100011011001110111110010010111110010000011110", + "00101111011101001110010000110111001010111110011011111001111000110110111101110000111101000000100011100101000011100010000001010010000001010010010100011001010100011000000000011", + "01001101101111110011100111010110110100101001111010110011110000001001100001011010100111110010110001011110001101011010111001101010111001110000101100100001101100100001011000100", + "10000110110111111000101000001101110111011011111111110000110100010010011101000110001000000010001101010000000001010100010011100100010011101010000010001111100010001110001010001", + "01101001110100011110011010110011001110010111000100011001111111001100111001111100000011010111111010110011100001010101010010100101010010100001000001001011100001000100001010100", + "01000010110000100111111101000001011111010010110110010100010001011011010000111101010000100001001110001001011111101111101011011111101011000001111001101011011001110110010010010", + "10010100110100101100111100001101101111110011110001101000101010010010111010000001111100101011101010000100001111100001100101010001100101010111110111100101010111111111110100011", + "00110010000010110010011110101111010001101100111001000110000110100100101001110000111110101000111011100111001110100010100000110010100000101010110100100100110100111111000001111", + "00000100011000001011110111000111011011111011011001110100010110100001010111010001101110100110010111011111110101011000111000001000111000001010101100101001001100101001011000101", + "10011011101111011100100110000011111100001000101101001111001110000000001011000110001011110110010101010011110101010100110111100100110111111100100010101111100010101110110110101", + "00100000000000011000001010111011011001000100010111011111111101100100001100110111001010011111011100110011100000110111010100000111010100000101000001001100000001001100110101001", + "01011111101111000001110011010010101100000000100100101011001111001001000110011101010011011001010110001011011010001111001000111111001000100001011001010100111001010101010101010", + "11011101000001001010101100000101111000100001110010101111101001111010001111001010110101100001001100000101010111100011100100010011100100010111110111100100001111111010111010010", + "00101111011101101010010000101100110010111111011011111001111100110110111101010000111101001100100011100100110010000010000110110010000110101100010100000111001100010001111001111", + "01001101101011010111100111010110110100101000101010110011010001001001100001011010100111110000110001011111010100111010111110001010111110001100101100111101110100101000101001000", + "10000110110110001100101000011001100111011010001111110001010000010010011111000110001000011110001101010001111000010100010110000100010110011100000010010001110010011111110111001", + "01101001110100011110011010101010110110010110110100011000111011001100111010111100000011001011111010110010011000110101010101100101010101100111000001000100100001000100110101000", + "01000010110110010111111101011000100111010011110110010101110101011011010000011101010000101101001110001000101110001111101100111111101100100111111001110100111001110101101101110", + "10010100110110001110111100001101101111110010100001101001001011010010111010000001111100101001101010000101010110000001100010110001100010110011110111111010110111111010000011111", + "00111111100010111100011111111111000001101101001001001111100010100100101011110000111110110100111011100110110111111010100101010010100101001111110100111001010100111000111110111", + "00001000111011110001110110001110100011111010101001101000110010100001010100010001100010111010010111011110001110001000111111001000111111011000110100111001010100111001100011001", + "10011010101011001100100110101010000100001001101101001010101010000000001011100110101011111010010101010010000110101100110000000100110001111010111010110111111010110110101011001", + "00101000100110111010001010001011011001000101000111011000111100100100001100110111100010011101011100110010111110001111010011100111010010001000111001010100011001010101100010101", + "01011111101101010111110011111010111100000001010100111111101011001001000100011101111111000101010110001010100111111111001101011111001100101111101001001100101001001100111110010", + "11010100100010101000101010001100000000111000000010101001101101111010001100001010101001111101001100000100101101010011100011010011100010000010010111110010010111110010101111110", + "00101011111011111010010100110100101010111110011011110001011000110110111101110001100011000000100011100101000101010010000001010010000001000001010100011001010100011001001100011", + "01000000101101010101100111000110010100101001111010100100010000001001100001011011010001110010110001011110001111101010111001101010111001111001101100100001101100100000010100100", + "10000110110100001010101110001000010111010011111111101000010100010010011101000111011100000010001101010000000001100100010011100100010011110111100010001111100010001110010010001", + "01100000010110011100011000101010101110001111000100011111111111001100111001111100011111010111111010110011100010100101010010100101010010110010111001010100111001010101100000100", + "01000110010000010111111111000001011111000010110110011101010001011011010000111100001110100001001110001001011001011111101010111001101010101010100001101100100001101101011000010", + "10011001110000001100111110000101001111100011110001111110101010010010111010000000001000101011101010000100001101010001100100110111100100100100101111100010101111100010010110011", + "00110010000000111010011110111110110001100100111001011111100110100100101001110001101100101000111011100111001110110010100001010100100001000101000100100001000100100001010101111", + "00001101111001110011110001010111011011100011011001110010110110100001010111010001110000100110010111011111110110001000111001001100111001011001001100101001001100101001110100101", + "10011111001101001100100000000010011100000001001101000111101110000000001011000111010101110110010101010011110011100100110111100100110111110111100010101111100010101111111010101", + "00101101000000111000001010101011111001010100010111001001111101100100001100110110111100011111011100110011100010000111010100000111010100010100000001001100000001001100111001001", + "01011111101111010001110101010011001100011001000100110011001111001001000110011100000111011001010110001011011010111111001000111111001000101100111001010100111001010100101001010", + "11010100100000101010101110011100011000111000010010101001001001111010001111001010101101100001001100000101010100010011100100010011100100000100001111100010001111100010110110010", + "00101011111101111010010010101100110010101111111011110000111100110110111101010001100001001100100011100100110100110100000111010100000111000111001100000001001100000001010101111", + "01000000101011010111100101011110010100111001101010100101110001001001100001011011010001110000110001011111001110001100111111101100111111111111110100111001110100111001001101000", + "10000110110110001100101000001000000111010010001111100001010000010010011111000111011000011110001101010001100000000010010111100010010111110011110010010111110010010111100011001", + "01100000010100011110011100111010110110001110110100010111011011001100111010111100011101001011111010110010000011100001010100100001010100110100100001000100100001000100011001000", + "00000110010110010111111011011001000111011010010110000100110011011010110000011100001000101101001110001000111000111111101100111111101100101100111001110100111001110100100001110", + "00011001110110001110111100011101001111100010100001111111001101010011111010000000001010101001101010000101010100110001100010110001100010100010110111111010110111111010001111111", + "10110010000010111100011000111110100001110100101001010110100100100101001011110001101010110100111011100110110111010010100101010010100101000001010100111001010100111001000100111", + "11001101111011110001110101000111000011100011001001111010010000100001110100010001110110111010010111011110001111001000111111001000111111011111010100111001010100111001111101001", + "00011111001011001100100100011010000100011001001101010110001000000001101011100111010111111010010101010010000010000010110001100010110001110001111010110111111010110111101011001", + "11101101000110111010001000110011111001010100000111000000011010100101101100110110111100011101011101010010100011100001010010000001010010010010011001010100011001010100110000101", + "00011111101101010111110011111011011100001001010100101111101001001000100100011100111111000101011111101010111011111001001100111001001100101111101001001100101001001100111110010", + "01011000100010101000101110001100000000111000000010101000101011111010001100001010100011111101010101100100110110001111100010010111100010011000110111110010010111110011100011110", + "01101010111011111010010110101100101010110111111011111010111110110110111101110000101011000000101010100101010010101010000001010010000001011010110100011001010100011000101010011", + "11001000101101010101100010001110010100111001111010111000110110001001100011011010100011110010110001011110001110001010111001101010111001101000101100100001101100100000100010100", + "00001111110100001010101011111000010111000010011111111111110010010011011111000111111110000000011101010000000011111100010011100100010011111111100010001111100010001111111110001", + "10100000010110011100011010111010101110001110100100000111111101001101111111111100101111010001101010110011100110110101010010100101010010101101011001010100111001010101111100100", + "11001111110000010111111111010001011111000010010110010010110011011010110000111101110000100011000110001001011100001001101010111001101010101001000001101100100001101101110100010", + "01011101010000001100111000000101001111100010110001111111101100010011011000000000010010101111101011100100010101100111100100110111100100111111101111100010101111100011011010011", + "01111111000000111010011110101110110001100100111001000001100100100101001001110001011100101000110010000111010000000100100001010100100001000100000100100001000100100001011001111", + "10001101111001110011110111010111011011100011011001101011010000100001010011010001000110100000001110111111101010111100111001001100111001000100101100101001001100101000001000101", + "11010110101101001100100010011010011100000001001101010001001000000000001011000000101101110100011100010011100110010100110111100100110111110100000010101111100010101110101110101", + "10101001100000111000001000101011111001010100010111011000111011100100001110110000000000011001011010110011100010110111010100000111010100001111000001001100000001001101101101001", + "11010010101111010001110001011011001100011001000100111101101001001000000101111101010001001101000110001011011100001111001000111111001000101111111001010100111001010100110101010", + "00010100100000101010101100001100011000111000010010110001001011111011001000001011011001100011011010000101010000000011100100010011100100011011101111100010001111100011010010010", + "10100010011101111010010010111100110010101111111011111111011110110111011101010110111101010010101011100100110001100100000111010100000111000100101100000001001100000000011001111", + "10000100001011010111100011011110010100111001101010100100110111001000000011111100101001110100110100111111001110111100111111101100111111100100110100111001110100111000000001000", + "11001011110110001100101000011000000111010010001111110111010010010001111110100111101010010110000010110001100110110010010111100010010111110010110010010111110010010111101111001", + "11100000010100011110011010111010110110001110110100000110111101001000111111111100001011010101100001010010000111010001010100100001010100101001000001000100100001000101100101000", + "00001111110110010111111001000001000111011010010110001010010011011101010001111010010110111111000001001000111101001111101100111111101100101111011001110100111001110101110101110", + "00011101010110001110111110011101001111100010100001101110001101010110111000000111010110101111101010000101010100000001100010110001100010111001110111111010110111111011011011111", + "10111111000010111100011100110110100001110100101001010000000100000001101000010001111100100000101011100110110001100010100101010010100101000010010100111001010100111001011000111", + "11001101111011110001110111010111000011100011001001101010010000000010010010010000000010111000000011011110001011011000111111001000111111000000110100111001010100111000001001001", + "00010110101011001100100100001010000100011001001101001001101001000011101010100001101011100100011101010010000111010010110001100010110001110010011010110111111010110110101111001", + "11101001100110111010001110110011111001010100000111001001011010100101101110110001000100011001011001000011100011010001010010000001010010001001011001010100011001010101101100101", + "00010010101101010111110011000011011100001001010100101100001001001010100101111100110001001101011001110011011101101001001100111001001100101001101001001100101001001100110100010", + "01010100100010101000101100001100000000111000000010010000001010011110001001001010111101100011010111111101010001100111100010010111100010011111110111110010010111110011010010010", + "01100011111011111010010100101100101010110111111010000111111111010000111100010111111011010010101100111100110000100010000001010010000001000100110100011001010100011000011000111", + "11000101101101010101100101000110010100111001111010010101010111101101100011011100001101110100110001011110001111011010111001101010111001100100101100100001101100100000000001000", + "00001111110100001010101011111000010111000010011110001111110010010111011110100111111110010110011101010000000111111100010011100100010011111111100010001111100010001111111110001", + "10101000110110011100011110001010101110001110100100101000111100101111111111111100100011010101101110110011100110001101010010100101010010101000111001010100111001010101100010100", + "11001010110000010111111110101001011111000010011111001010110010111000110001111010101010111111000110001001011010101001101010111001101010101010100001101100100001101100101010010", + "01011000110000001100111110001101001111100010110001011000101100110011011000000110100010101111101111110101010110001111100100110111100100101000101111100010101111100010100010011", + "01011111100000111010011011111110110001100100101000011111100100100111001000010001111110100000110100011110110011111101100101010100100001001111100100100001000100100000111111111", + "10010000011001110011110101011111011011100011001001011101110001000101010010010000110000111000001100100110001010001101011111001100111001001001101100101001001100101000110101001", + "11100110001101001100100110001010011100100001011100100001001001100110001010100001111001100100011010001010000100000101010001100100110111100111100010101111100010101110110011001", + "10011001100000111000001010111011111000010100010111100111011010000000001110110001111100011001011100110011100101100110110010000111010100000100100001001100000001001101011000101", + "11111011101111010001110101011011001101111001001101001100101001001100000101111100101001001101000110001011011110111111001000111111001000111100111001010100111001010101000000010", + "00000100100000101010101000011100010001011000010010011111001010011001001001001010101011100011011000000101010000110011100100010011100100010010101111100010001111100011101110010", + "10010010111101111010010100111100100011001111101010111110111111010101011100010110001011010010101011100100110011010100000111010100000111010001001100000001001100000000000101111", + "10110101001011010111100011000110010100011001111010001010010111101000000011011101110111110100110100101110001001001100111111101100111111101001010100111001110100111000110101000", + "11001110110110001100101100011000000111010010010110111110010010010001111110100110110110010110000010101000000100000011010011100011010011100111110010010111110010010110011011001", + "11110001110100011110011000110010100110001110100100110000011100101000111111111101011101010101100001001011100111100000110010100000110010100100000101000100100001000101011000100", + "00000110010110010111111101010001011111111010000111111010010010111101010001111010100010111111000001010001011111011110001010111110001010111100111001110100111001110101101000010", + "00101101010110001110101100001101010110100010100001010001101100110110111000000111001010101111101010000101010011010000000100110000000100110010010111111010110111111011101110011", + "10010110000010111100011000110110100000010100100000100001000100100001101000010001000100100000101011100110110011010010100101010010100101010001010100111001010100111000101101111", + "11011101111011110001100011000111001010000011001001000100010001000010010010010001110000111000000011011110001011101000111111001000111111001001110100111001010100111000110101001", + "00100110001011001010110010001010000101111001011100001000001001100011101010100000111101100100011101010010000101100010110001100010110001100111111010110111111010110110110011001", + "11011000100110111010010110101011100001110100010111100111111010000101101110110000011010011001011001000011100100100001010010000001010010000100111001010100011001010101011000101", + "00010111101101010111111111000011001100001001001101100101001001001010100101111101101101001101011001110011011110111000001000111000001000111100101001001100101001001101000000010", + "01000101000010101110111110000100010000111000010010000110101010011110001001001011101011100011010111111101010000110110000100010110000100010010110011100010001000010011101110010", + "01101011110011111010010000111100110010010111101010010111111111010000111100010111001111010010101100111100110011010011100111010011100111010001010010000001001001111000000101111", + "11110100011101010111110111000110001101111001111010001010110111101101100011011100010001110100110001011110001001001011011111101011011111101001001010111001111101000000110101000", + "00100010111000001101101110001000010110100010010110010111110010010111011110100111110010010110011101010000000101100100010011100100010011100111100100010111111011001110011011001", + "10110000000100011010101110100010100111101110100100101001111100101111111111111100011101010101101110110011100110000101010010100101010010100100011001010100111001010101011000100", + "11111111001000010111001001010001011110100010000111010011010010111000110001111011100110111111000110001001011110111001101010111001101010111100100001101100100001101101101000010", + "01101100011110001101100000011101010111000010100001010001001100110011011000000110101100101111101111110101010010010111100100110111100100110010001111100010101111100011101110011", + "01111111101110111010010011111110100001100100100000001111100100100111001000010000111110100000110100011110110011111101100101010101100101011111100100100001000100100000111111111", + "10011000111001110110000110001111001011100011001001011000110001000101010010010000100010111000001100100110001110001101011111001101011111001000110001011001010001011001100011001", + "11011010100011001101000110101010000100100001011100101010101001100110001010100001101011100100011010001010000010101101010001100101010001111010111101010111111101010111101011001", + "10011000110000111010111110001011100000010100010111101000111010000000001110110001100010011001011100110011100010001110110010000110110010001000111110110100011110110101100010101", + "11111111100011010111110111111011001101111001001101011111101001001100000101111100111111001101000110001011011111111111001000111111001000111111101110001100101110001101111110010", + "00001100110010101101111000001100010011011000010010010110001010011001001001001011110111100011011000000101010111100011100100010011100100010111101111100010001111100011111010010", + "10010011100101111011000010100100110111001111101010100000011111010101011100010110011101010010101011100100110110000100000111010100000111001100001100000001001100000001111001111", + "10110100000101010110011001010110001100011001111010001010010111101000000011011100000011110100110100101110001100111100111111101100111111101100110100111001110100111001101001000", + "11001111011000001100100110011000010101010010010110101001110010010001111110100111001010010110000010101000000100010011010011100011010011111010010010010111110010010111001111001", + "11110100010100011011101100111010100000001110100100110001011100101000111111111101100101010101100001001011100001010000110010100000110010100001011100110100111100110101001100100", + "00001111111000010110011111001001011101111010000111101100010010111101010001111010010000111111000001010001011011101110001010111000010010100001100110001100100110001100010100010", + "00100100000110001100001100001101010100100010100001001000001100110110111000000111111100101111101010000101010111100000000100110110011100110111101000000010101000000010110010011", + "10011010101110111010011110101110100000010100100000101111100100100001101000010001011010100000101011100110110010100010100101010100111101001100100011100001000011100001111001111", + "11010101101001110110100011010111001010001011001101001101010001000010010010010000101100111000000011011110001100111000111111001100101111001100110100111001010100111000100001001", + "00100111010011001101110100010010000001110001011010010110101001100011101010100000101011100100011101010010000000110010110001100010110001111010111010110111111010110111001111001", + "11011001101000111011110100111011100111101100010101100111111010000101101110110001101110011001011001000011100001010001010010000001010010000001011001010100011001010100000100101", + "00010110000011010111111101000011001010000001001111110010101001001010100101111100000001001101011001110011011111001000001000111000001000100001001001001100101001001100010100010", + "01000000100010101101011010001100010110110000010000000111101010011110001001001011011011100011010111111101010111100110000100010110000100010111101010000010001010000011111010010", + "01100010010101111011110000100100110000000111101000000001011111010000111100010111101101010010101100111100110110000101111111010101111111001100001011100001001011100001111001111", + "11111101011101010111010001010110001111100001111000010010110111101101100011011100110111110100110001011110001100111101000111101101000111101100110011011001110011011001101001000", + "00101110011000001100101010011000010110111010010010011000010010010111011110100111100100010110011101010000000100010010001011100010001011111010010101010111110101010111001111001", + "10111000000100011011001100111010100111100110100100100001011100101111111111111101011001010101101110110011100001010001000010100001000010100001011001010100111001010101001100100", + "11111110001000010110101001001001011010101010000101001100110010110000110001111011110000111111000110001001011011101001101010111001101010100001100001101100100001101100010100010", + "01101101011110001101000010001101010001011010100001010001101100111011011000000111011000101111101111110101010111100111100100110111100100110111101111100010101111100010110010011", + "01111011101110111010010100101110100111101100100100011110100100101111001000010001101100100000110100011110110010100101100101010101100101001100100100100001000100100001111001111", + "10011001111001110110000001010111001101101011001011011100110001011101010010010000000000111000001100100110001100111101011111001101011111001100110001011001010001011000100001001", + "10101010100011001101000010010010000110110001011110110111101001110110001010100001011011100100011010001010000000110011001001100011001001111010111101010111111101010111001111001", + "00011000110000111010111100111011100010001100010101111111011010000000001110110001011010011001011101010101100001010000101010000000101010000001011110110100011110110100000100101", + "00101111000011010111110011111011001101100001001001001111101001000100000101111100111111001101000111101101011111111001010000111001010000101111101110001100101110001100111110010", + "00000000110010101101111010001100010001010000010010001000101010000001001001001011100011100011011001100011010110001111110100010111110100001000101111100010001111100010100010010", + "11111110000101111011000110101100110111000111101000101010111111010100011100011111101011010010101010100000110010101100000111010100000111001010101100000001001100000001101011111", + "10000010100101010110011010001110001010000001111010001000110111111000100011001100100011110100111101001110001010001100111111101100111111101000110100111001110100111000100011000", + "10111010011000001100100011111000010001011010010010111111110010000001111110111110111110010110001011001000000011111011010011100011010011111111110010010111110010010111111111001", + "10111010110100011011101100101010100000000110100110100110111100101000011111100101010011010101110000101011100010100000110010100000110010110100111100110100111100110100111000100", + "10111010111000010110011001010001011101101010000101100100110010101101110001111011110100111111011000010001011010111000010010111000010010101100100110001100100110001100100000001", + "10000010100110001100001010010101010100111010100011001111101100110111111000011110101010001111110011100011010100110110011100110110011100100010101000000010101000000010101110010", + "11111110001110111010011100111110100000001100100100100111000100101001001000000000001110100000110010000000110101010100111101010100111101000001000011100001000011100001000101110" + ] + }, + "40": { + "0": [ + "111111101011000001110010110000111001101000010011100011101010111001100000110101100000111101001010000000110101111110011000110101100000110101100010011100100100100000110110001111111", + "100000101101100001110010000001111001000010001000010000111111001101011000001101001001000111010000111000001101001110101110010101011000001100111000100110010100111000001110101000001", + "101110100010111001111110110001011010001110010110010101001110000011010110000011001111101000000011010110000011010110001000011011010110000010110100001000011010110110000010001011101", + "101110101011011101110101010001000001110100101001011100010110010010110101100001001010000011100000110101100000110101001010111100110101100001000111000011111001010101100101101011101", + "101110100110101110011111011111111100001101101110001110001111110100001101011001110010111111011000001101011000001111111000101110001101011001011111110000111110001101011000001011101", + "100000100000010000101001011010001010001000010011001011101000110110000011010111100101100011010110000011010110000010001010110000000011010110001000111100110000000011010110101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001010011010100101101010001001010101011101001110011000111000001101011001001000100010101001001101011110010010001100111110001101011000001000110010111110001101011001000000000", + "101101110101101011000011100011111111011011011111101010111111100100000011010110000010111110101111100011010000011011111010010110000011010110001111110100010010000011010111001001011", + "011001011011011001110010110110111001101000010010100011111110011001100000110101100000111101001100000000110011111100011001010101100000110101111010011100100100100000110100111111000", + "111001100101101001110010010101111001011010001000010000111000001101011000001101001000000111010100111000001001001110101111110101011000001100111000100110010100111000001100001111110", + "010011010010100001111110101111011010000110010111110101011011100011010110000011001110001000000011010110000011010000001001111011010110000010110100001000011010110110000010001011111", + "010011101011011101110101010101000001101100101001011100010101010010110101100001001010100011100000110101100000110011001010111100100101100001010111000011111001010101100001101010111", + "010100010110110110011111000011010100001101101110001110010111010100001101011001110010110001011000001101011000001101110000101110010101011001001111110000111110001101011001010010101", + "010010111000010000101001001110100010001000010011101011100100010110000011010111100100111101010110000011010110000011110010110000011011010110000011111100110000000011010111010100101", + "101001000111110111001000000001110100111000110001000011101000110101100000110100100101011111000100100000110011111000111001010011111000110101100010111111010011100000110100111101001", + "110110100110110000011000110000111100000000000100110001111011111111011000001101011110001111110100111000001011000000100001001101011000001101011010101111001001011000001100000111010", + "101111001101101111000100001000001111011110100100010101001000101111010110000011010000001011111010110110000101001010101111100011010110000011010100101010010010010110000010001001110", + "010100101000000100011111100000001100110111100101111101010101100000110101100000100011101010111001010101100100100011000010011000110101100001010101001011111001010101100001100010011", + "001000001001111010100101111100001001011101001100101110000000111000001101011000010001010011011000001101011000001011010010100000001101011001101111010011000001101101011001010100100", + "100101111101101011000011100011111111011010011111101010100011100100000011001111111100010101010110000011010110000101111100001010010011010111100001110101001111100011010111011010001", + "111001011011011011110010111110101001100000000011100011111010111001100000101100011111011100110101100000110101100000011101000011111000110100100010011101000101100000110110111001000", + "001001100011001011110010010101101001010011001000110000111101001101011000010100111111100110001101011000001101011000101001101011000000001101011000100111110101011000001000001001110", + "011111010001000001111110110111000010001110000111110101011010000011010110010010010011101001110010010110000101001110001111100101001110000011010100001001111011010110000110001011111", + "011011101011011101110101011101010001101101101001011100010000010010110101100000110011100010011001010101100110101101001100100000110101100000110111000010111000110101100111101010111", + "110100010110010100011111010011010100000101111111001110010101110100001101011000001011010000100001101101011110010001110100111000001101011000001111101001001001001001011001010010101", + "100010111111010010101001010110111010000001010011001011100111010110000011010110000101011100001111100011010010010101110100101110000011010111100011100101001111100101010111010100101", + "100101000101010111001000010001100100110000100001000011101101010101100000110101100100111110110101100000110101100110111111001101100000110100000010100110101100000110110100111001001", + "111111111110110000011000111011111100000001000100110001111111111111011000010100111111111110001101011000001101011111111111010001001000001100111111111110010100111110001100111111010", + "001110001101001101000100001010001111010110110101010101011000101111010110011010110000100010000011010110000011010110001011110101001110000010011000101011110011010110000100100011110", + "100110101111000110011111111110101100111110100101011101011010100001110101111001010011101011100000110101100000110010101100000110101101100000101010101010011000110101100110101010011", + "000110001010011010100101101110001001010101011100101110011000111001101101001001001000100010101001001101011110010010001100111110010101011000001000110010100000001101011111100010100", + "101111111101101011000011101111111111011011011111101010101111100101100011010110000100111110101111100011010000011011111010010110000011010110001111110100001110000011010011111110001", + "011011001011111001110010111111001001101001110010100011100001011000100000110101100111000011001100000000110011111111001001010101100000110101100111000100100100100100110100101101000", + "111000110100101001110010001001000001011011101000010000110101001101011000001101011110110001010100111000001001001001110111101101011000010100100111111110010100111110001101110101110", + "010010011011000001111110100010110010000111010111110101011110000011010110000011010010011100010011010110000011010011110001100011010110011010110011110000011010110000000010010011111", + "010001100011011101100101010011110001101101001001011100011100110010010101111001010010011111111000110101100000110110111010100100100101111001001011110011111001010011100000011100111", + "010110000110010110000111010010111100001100011110001111101101110101101101000001101011001111000000001101011000001100100000111110010101001001001011010000101000001101011111000111001", + "010011101001110000100001001010001010001000110011101011001110110110100011001111100100001011001110000011010110000100101010110000011011010110011101011100101110000011010000101000001", + "101000001111110111010000000100001100111001110001000010001001110101100000100100100100001011000100100100110011111011000001010011111000110101100100111111001101100000110010100010101", + "110100101110110000000000110110001100000000111100110001110000111110111000001101011110010011110100111110001011000001010001001101011000001101000111001111010101011000001001110101010", + "101101011101001111000100001001111011011111011100010100010111101110010110000011010001110101111010110000000101001001111111100011010110000011010001110010010010010010000010011011110", + "100101111001000100011111100100101100110110000101111101011000100000110101100000110011011100111001010011100100100100011010000000110101111001001010010011111001010011100000011000011", + "001001000000011010111101111001101111011100011100101111100101011000001101011000001001000111001000001101011000010010101010111000001101000001101000101011000001101011011001001000100", + "011111110101101011010011100101000001011011100111101010001010000100100011001111100100101001001110000011010110011010001100010010010011001111111101000101001111100101010110101010001", + "000011001011111011101010111111010111100001101011100011100000011000000000101100000110100010101101100000110101111111001101010011111000100100100110111101000101100000110010101010100", + "000000110100101011111010010001010101010011101000110000010101101101111000010100111111010000010101011000001101001001110001101011000000001101000110000111110101011000001011110010010", + "010010011001000001100110110010111010001111000111110101011111000011010110010010010010111100010010010011100101001001110111100101001110000011010010001001111011010110000100010100011", + "101001100101011101101101011011100001101101010001011100111101010011010101100000110011111111111001010010000110101100111100100100110101100000101010100010111000110101100100011001111", + "101110000100010100011111010010100000000100000111001011001100110101001101011000001010101111000001101010111110010010100100111110001101011000001010101001001001001001011001000000101", + "011011101111110010101111010010011100000000110011001011101110010110000011010110000101101011001111100100010010010010101100110000000011001111111100100101001111100101010110101110101", + "101000001111110111010110010100000100110001110001000100001000110101100000110101100100101010100101100000110101111111000111010011100000101100000101000110101100000110110100100101001", + "000100101000110000001000111110011010000000111100110101010001011111111000010100111111110010010101011000001101000001010111001001001001010100100110011110010100111110001101110001010", + "110101011111001101011110001001100001010111011101010011010110101110110110011010110000010100011011010110000011001001111011100101001111110010010000001011110010010110000100011100010", + "101101111001000110010001111100111000111110000101011011111000000000010101111001010010100101111000110101100000100100011100000110101100000000101011101010011000110101100110011111111", + "000101000010011010111001101001100001010100011100101010000100011000001101001001001001111111001001001000111110010010101100111110010100111000001001010010100000001101011111001111000", + "011111111011101011011101101111111111011011100111101100001111100101100011010111100101111111001111100100110000011011111010010010000011010110011111110100001110000011010010111111001", + "000010001001111001110100111010001101101001101010100110111000111000100000110100000110100010101100000111010011111110001001010011100000110101111000100100100100100100110101100011000", + "000010101100101001110100001010101111011011101000010000101010101011011000001100111110101010010100111111001001001010101111101011011000010100101010111110010100111110001101101011110", + "011110001001000001100100100110001010000111000111110010111000100111010110000010010011100010010011010110000011001110001001100101010110011010111000110000011010110000000010100011111", + "101011111101011101100011010111111111101101010001011000111111110100010011111001010011111111111000110101100000101111111010100100100100111001001111110011111001010011100000111110111", + "101100001100010110000111010000001010001100000110001000011000110111101011000001101010001011000000001101011000010001010000111110010100101001011111010001001001001100111110010101001", + "011001111111110000100111001001111110001000110011101101001111110000100101001111100100000101001110000011010110010111111010110000011010110110010001111101001111100010110000011011001", + "101001011111110111010100000000101100111001110001000111110000110111100100100100100101111100100100100101010011111100011001010011111001010101110010011110101100000001110011111000101", + "000101100000110110000110110101101100000000111100110111000101011010111000001100111111000110010100111111101011000100101001001001011000001101001000101110010100111001101001001000010", + "110111010111001001000010001011000011011111011100010000000010001100010110000010110000001000011010110001100101001010001111100101010110000011000101010010010010010010010011001011110", + "101111101001000010011001100111010010110110000101111101011000000110110100100001010011000011111001010010100100100001001010000110110101111001000110110011111001010011111000101010011", + "000100010010011100111111111101010001011100011100101001111101111100001100111001001001101001001000001101011000010001110010111110001101000001111110001011000001101011000000010010100", + "011110111011101111010101100110111001011011100111101110011110000010100100101111100101100101001110000011010110011111100100010010010010001111110010000101001111100101001110010100001", + "000001000001111101101010111101100111100001101011100101110100011010000111001100000111100110101101100000110101111100100101010011111001000100110010111100100100100001010011111000100", + "000010100100101011111100010010100101010011101000110110010101100011111110010100111111011110010101011000001101001100111001101011000001101100101010100110010100111001101011000000010", + "011111001001000101100010110110011010001111000111110001000111001001010010010010010011001010010010010011100101001010110111100101001111100010100100101000011010110111100101001110011", + "101000101101011001101011011000000001101101010001011010101000011111010101100001010010101011111001010010000110101001000100100100110101100001000101000011111001010100100100100101111", + "101111001100010000011001010000011000000100000111001011011000110111001101011001101010010011000001101010111110010001010100111110001101011001011110001001001001001001001000010000101", + "011001111111110000101111010001100100001000110011001011101110101000000010010111100100010101001111100100010010010111111010110000000101001111110000000101001111100101001110011100101", + "101001011111110011010010010000111100100001110001000100010001110001100001010100100101100100100100100000110101111100011001010011100110101100010011100110101100000110101101111111001", + "000110100000110100001110011101100010001000111100110101000101111001111111110100111111011110010100111000001101000100111001001001001111010100101001011110010100111110010101001111010", + "110111010111001011011100101011010001011111011101110011000011111100110001111010110001010000011010110110000011001010010111100101001011110010000100001010010010010111100101001110010", + "101100101001000110010000111111001000111110000100000011111000000110010011111001010010110011111001010101100000100001010100000110101100000001000111001011111001010100000110101101111", + "000101010010011110111000001101000001001100011101001010011100001010001001001001001000010001001001001000101110010001101100111110010100111001111111110011000001101100111110010101000", + "011110111011101111011100001110110111010011100111110100011110101001100011010111100100011101001111100100101000011111110010010010000011010111110011110101001111100010010010010011001", + "000010000001111101110100111101110101101001101011011110110101011010100000110100000111111110101100000111001011111100111001010011100000110100110011100100100100100100100101111101000", + "000011100100101011110100001010111111010011101000000000110101110011011001001100111111001110010100111111010001001100100001101011011110010100101011011110010100111110010101000111110", + "011101001001000101100101111110001010010111000110001010100111000111010111100010010011010010010010010110000101001010101111100101010000011010100101010000011010110000011011001001111", + "101011111101011001100011111011111111100101010001111000101111110100010010011001010010111111111001010101100110101011111100100100100010111001001111110011111001010011111000111110111", + "101110001100010000000111110010001011000100000110101000011000100111101010100001101011100011000001101101011110010010001100111110010000101001001000110001001001001100111111100011001", + "011010101111110000100110010010101110101000110011000101001010110000100101001111100101101011001111100011010010010010101010110000011010110111101010111101001111100010110001101011001", + "101010001111110011010101101110001100000001110000111111101000100111100100100100100100100010100100111101000011111110001001010011111001010100001000111110101100000001010010100010101", + "000111111000110100000111010011111100001000111100010111011111110010111000001100111111111110010100100111110011000111111001001001001000001100101111101110010100111001001001111110010", + "110100011111001011000010001100111011111111011101101000001110101100010110000010110000100100011010101001111101001011100111100101001110000010011010010010010010010010010010110101110", + "101101100001000110111001100111100010111110000101101101000101011110110100100001010010100111111001000010111100100110100100000110101011111001000010110011111001010011111000111000011", + "000101000010011110111110100000100001101100011101010001110101111100001100111001001001111111001001001101011110010001011100111110010011000001100010101011000001101011000001100000100", + "011110101011101110110101001010011001010011100111001110011111000010100100101111100100001011001111100011010000011001010010010010010100001011110100100101001111100101001110001110001", + "000000001001111100101010011010000110101001101011000101111000001010000111001100000110001010101100000000110011111100100001010011111101000010101101011100100100100111010010000100100", + "000011110100101011011101001010011101110011101000011110001000101011111110010100111111010010010100111000001001001010010001101011000001101010101110000110010100111101101011010000010", + "011100001001000100100011011011100010110111000110001001001110110001010010010010010010110100010010001011110101001011111111100101001111100100111000001000011010110001100100111100011", + "101011110101011001001010111100111001100101010001111010101001111111010101111001010010100101111001001010011110101110011100100100100101100001000011100011111001010010100100111111111", + "101111011100010000011001010111100000100100000110110011010101110111001101000001101011111111000001110010100110010000111100111110010101011001000001001001001001001001001111101110101", + "011011111111110001001111010001000100001000110011011011110011101000010010001111100100010001001111110100001010010000010010110000011101001111110100000101001111100101001000001110101", + "101000000111110010110011001101010100000001110000111100000000010001111001000100100100010010100100100000110011111100110001010011111110101100001111000110101100000110101010001101001", + "000101110000110100001110010001011010001000111100010101000100011001000111110100111111010100010100111000001011000010001001001001001111010000101111111110010100111110010001010101010", + "110110001111001010011100101100100000011111011101110011000110111100101001111010110000111010011010110110000101001010010111100101001011110100011011110110010010010011100100110010010", + "101110111001000110110000100111110000011110000101110011100101000110000011111001010010111001111001010101100100100111111100000110101100000111000011110101111001010010000110111011111", + "000111010010011111111000000000111001101100011101010010010101101010110001001001001001101001001001010000101110010000100100111110010100111111100011001101000001101010111111100101000", + "011101100011101111101100001010000111010011100111001100000111001000011011001111100100010011001111111100101000011000101010010010010011010111110101000011001111111100010010001101001", + "000010010001111101111100111010001101001001101011011110100000011010011000101100000110010010101100011111001011111101010001010011111000110100101100100100100100100100100010000001010", + "000000100100101010001100001010011111010011101000000000111000110011101001010000111111001010010100101111010001001011001001101011000110010100101111011110010100111110010011010101101", + "011110010001000100011101111011100010110111000110001010110110100111101111110100010010100100010010010110000101001010000111100101001000011010111001110000011010110000011100111011100", + "101000111101011001100011111100110111100101010001111000101001110100101010011111010010111001111001010101100110101111100100100100100010111101000010010011111001010011111100111000100", + "101101010100010001001111110111100011000100000110101001011101100111110010100111101011100001000001101101011110010001001100111110010000101111000000101101001001010000111111101001001", + "011000101111110000011110010001000110101000110011000100110011110000110101001111100100001111001111100011010010010001001010110000011010101001110101000011001111111100110000001111001", + "101010011111110010000101101101010100000001110000111110111000000111011100100100100100000100100100111101000011111101001001010011111001001010001110100000101100011111010010001100101", + "000111111000110100101111010011111100001000111100010111111111110011000000010100111111111110010100100111110011000011111001001001001000010100101111111000010100101111001001111110010", + "110110001111001011010010001010001001111111011101101000011000101100101110011010110000100010011010101001111101001110001111100101001110010010011000110010010010010010010100100010000", + "101110101001000111101001100010101000111110000101101100001010111110000100111101010010101011111001000010111100100110101100000111001011111001001010110011111001010011111110101011100", + "000110001010011111001110100110001101101100011101010001001000111100110100101111001000100011001001001001011110010010001100111111110011000001111000101011000001101011000110100011011", + "011111111011101111010101001011111111010011100111001110101111100010011100101001100100111111001111100101010000011011111010010011110100001011111111100101001111100101001010111111010", + "000011010001111100100010011000110110101001101101000010100001101010011111001010000110100100101100000110110011111000011001010010111101000010100011100000100100111101010010111000100", + "000011111100101011000101001001100101110011101110011111101101101011101110010100111110011110010100111110001001001000111001101011000001110010111001011000010100100111101010001000010", + "011111011001000100110011011001000110110111000010001000001011110001101010010010010010010000010010001011110100001110010111100101001111111100110100010110011010101001100100001110011", + "101000100101011001000010111001010001100101010011111010000000011110101101111001010011110011111001001010011111001100110100100100100101111001010111010101111001000010100101101101111", + "101101010100010000001001010101011010100100000000110011000100010111110101000001101011010101000001110010100111110100001100111110010101001001001111101001001001001001001111010101011", + "011010101111110001011011010010111110001000110011011010101110101000110010001011100101011011001111110100001011110010010010110001111101001111100011100101001111100101001001010011010", + "101010011111110010100111001111110000000001110110111110100101010001011001000010100100111000100100100101010011111001111001010010011110101100000101100110101100000110101010111000110", + "000111110000110100001000010100111100001000111110010001100101111001000111110010111110001000010100111111101011000000100001001000101111010000111101011110010100111110010001000000001", + "110101000111001010010010101110000000011101011111110000010111011100101001111100110000010010011010110001100101001110101111100100001011110100010011010110010010001011100101101110010", + "101110110001000110101100100100001000011100000011110100000000000110000011111001010011110011111001010010100100100101010100000110101100011111010000110101111001001010000110000101111", + "000100000010011111101010000010011101101000011101010011010000101010110001001001001001001011001111010000101111010101001100111110010100100111101110001101000001110010111110110101000", + "011110110011101111110010001101100111010111100111001010110110101100011011001111100101000101001001111100101001111010000011010010010010001111100000000011001111110100010011011011001", + "000000011001111101100100111000110111001111101101011110101001111110011000101100000110111000101010011111001010011001100000110011111001000100100011100100100100100100100010111000110", + "000001110100110010000000001011100101010001101000000001110101110111101001010000111110000000010000101111010000101001001000001010100111110100111001011110010100111110010010001000001", + "011100001001010100010001111001000110110011000000001000010011100001101111110100010010001110010010010011100101001111001110000100101001111010110011010000011010110000011100001110000", + "101010111101011001100101111111010001100101010011111100001000010110101010011111010011100101111001010010000110101101001100100101000010111101010000110011111001010011111100101101100", + "101110011100011001001001110011011011000110000100101011001100000001110010100111101011001001000001101010111110010101110100111111010000101111001000001101001001010000100110110101001", + "011000100111101000011010010010111110101010110101000010110110110100110101001111100101000101001111100100010010010011100010110000011010101001100110000011001111111100100000110011001", + "101001001111110010000111101101110000000101110000111110111101000111011100100100100100100110100010111101000010111000100001010011111001001010000011100000101100011111010011011000101", + "000101101000111100101001010110111100001100111100010001101101110011000110010100111000011110010010100111110010100001011000001001001001010100111011011000010100101111001000000000010", + "110110001111010011010010001110000001111001011011101000011111001010101000011010110110001110011100101001111100101111010110000101001111110010010101010010010010010011110100001110000", + "101100111001011111101101100110001000111100000101101100011000011010000010111101010101101101111101000010111101000100100101100111001010011001010100110011111001010010011111100101100", + "000111010010010111001010100011111101101000011011010011001000111010110000101111001101010101001001001000111110010100010101011111110010100001101000001011000001101010100111010101011", + "011111111011101111010011001011111111010011100101001010111111101000011100101001100101111111001111100100110000011011111010010011110100001011101111100101001111100100001010111111010", + "000010001001101100100100011010001110101011101001000110111000101100011111001010000110100010101100000111010011111110001001010010111101000010101000100000110010111101000010100010100", + "000010101100110011000001001010101101110001101110011001101010111111101111010100111111101010010100111111001001001110101001101011000001110010101010111000001010100111110010101010010", + "011110001001000100110001011110001110110011000110001000011000111001101011110010010010100010010100001011110100001010001111100101001111111100111000110110000100101001111101100010011", + "101011111101010001000101111111111001100001010001111100001111111110101010011001010101111111111111001010011111001111111101100100100100111001011111110101100101000010111100111111111", + "101111010100001000001001010000111010100010000000110011000101100001110010100001101101001001000111110010100111110010100101011110010100101001001101001001001001001000101110100001011", + "011001100111101001011011010000100110001010110011011010100111000100110100001011110010110011001011110100001011110010101011010001111100101111110011000101001111100100101001101111010", + "101010010111111010100111101010001000000101110110111110100000001111011101000010111000110010100100100101010011111111010000110010011111001100001000100110101100000111001010100100110", + "000100100000110100001000110001111100001000111110010001110000110011000111110010100111101010010100111111101011000001001001001000101111010000111110011110010100111111010001101100001", + "110110010111011010010011101110100000011101011111100000000110111010101001111100101000000100011010110001100101001000000111100100001011110100001000010110000100001011110100001010010", + "101100111001011110101100000001110000011100000011100100000001110010000010111001010010000001111001010010100100100101100100000110101010011111011011110101100111001010011110110001111", + "000101010010011111101011000100100101101000011101011011011101100010110000101001001001011001001111010000101111010011001100111110010010100111101001001101011111110010100111100001000", + "011100101010000111110011101110000111010111100111001010110011101000011100101111100010110111001001111100101001111011001011010010010100001111111011000011010011110100001011001111001", + "000010011001100101100101011100110110101111101101010110101000001100011111001100000000110100101010011111001010011111001000110011111101000100100000100100100100100101000011001100110", + "000010111100010010000001101011111100110001101000001001111100011111101111010000101001101000010000101111010000101001110000010010100111110100101000011110010100111111110010110100001", + "011100000001101100010000011100111110010011000000000000010110111001101011110100001110000100000010010011110101001001100110011100101001111010111110010000011010110001111100010010000", + "101001101100011001100101011100010000100101010011111100011101011110101010011111001010000111100001010010011110101100100100111101000010111101010011110011111001010010111100000001100", + "101101001100100001001000110101111011000111000100111011011101100001110010100111110011011111011001101010100110010011011100101111010000101111010011001101011111010000101111011001001", + "011010101111101000011010110111000110001011110101010010110111000100110100001111100100110111010111100100001010010011010010110000011100101001101101000011010001111100101000010111001", + "101000011111010010000110101001001001000101110000110110110000001111011101000100100100110100100010111101000010111110110001010011111111001010000100100000110010011111001010010100101", + "000110110001011100101000110101011101101101011100010001101000110011000111110100111001101100010010100111110010100000001000001001001111010100100000011000001000101111010000010100010", + "110100001111010011010011101010000000011001011011100000011110111010101001111010110110000010011100101001111100101001100110000101001011110010010110010010010010010011110101111010000", + "101101110001111111001100000110010000111100100101100100010001110010000010111101000100000101111101000010111101000100000101111111001010011001000101110011111001010010011111011001100", + "000110011010110111101011000111100100101001011011011011001101100010110000101111010101011111011001010000101110001010111101000111110010100001100101001011000001101010100111001001011", + "011101111010101110010011101010100110110011100101001010101011101000011100101001111100110001010111111100101000000010010010001011110100001011100101000101001111100100001010110111010", + "000010000001001101100101011000010110101010111001010110110000001100011111001010011110110010110100011111001011100110110001000010111101000010111110100000110010111101000010110100100", + "111001110100110010100001101100011101010001000110001001101100011111101111010100111111101100001100101111010001011000001001101011000111110010110110011000001010100111110011001100010", + "000100001001100100110000011111111111110010010110000000000110111001101011110010010010000011110100001011110100001000000111100101001001111100110010010110000100101001111100100010011", + "010101111100110000100101011011111000000000000001111100001111111110101010011001010100111110011111001010011111001111111101100000100010111101001111110101100101000010111101111111111", + "000000001100001000001000110010001011000010011000111011001000100001110010100001101100100010100111110010100111110010001101011000010000101111011000101001001001001000101111100011011", + "111111101001001001111010110010101110001010000011010010111010100100110100001011110010101010001011110100001011110010101011001111111100101001111010100101001111100100101001101011010", + "100000101001011010000110101110001001000100111110110110111000101111011101000010111000100010110100111101000011100010001000101100011111001010001000100110101100000111001011100010110", + "101110100001110101001000110011111101101000111110010001111111110011000111110010100111111110001100100111110011011011111001010000101111010000101111111110010100111111010000111110001", + "101110101101111011010011101100000000011100001111100000010011111010101001111100101001010110000010101001111101010011010111110100001011110100010011010110000100001011110101001110010", + "101110101001011111001100000000110000111100101011100100010000010010000010111001010010110101100001000010111100110001010100000110101010011111011000110101100111001010011110101101100", + "100000100100111111101011000011111100101001001101011011000100000010110000101001001000001000101111010000101111010001101100111110010010100111100000001101011111110010100110010101001", + "111111101100000110010011101000111110110110110111001010111110101000011100101110000010000100101001111100101001111011100011010110010100001011101110000011010011110100001010010011000" + ], + "1": [ + "111111101000111111110010010101101000000100110100111100100000101011100000101010011000111100110101100001001010000000011000110100111101000011100010000000110010111100110110001111111", + "100000100100011100110100101011101100111110001100100110010110010001011000010000101000000110001101011001010000111000101000001100100111101011011000111000001010100110001110101000001", + "101110101111001101101010111010011101010000000010101000011000010101010110010100001110001001110011001111110100010110001110000010101001100101010100010110000100101000000010001011101", + "101110101101101111110100100000010111110011100001000011111011111110110101111111001101100010011000101100011111010101001101100001010010100000110111010101100101000011100101101011101", + "101110101101000010011001011011111101110101011110010000101111100110001101000111110101111110100000010100100111101111111101011001001000111000001111101101011111010001011000001011101", + "100000100111001101101000010010001111111011010000011100111000101010000011001011110010100010001110010010001011100010001011010111100100110110011000100011010001111101010110101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000100011100110110000010001110010101011110010010111000101110001101001111010101100011001000001100101001001010001101011001101010111000011000101101011111110011011001000000000", + "111100101011011101000001110111111001010011010010010100001111101000000011001001111010111111001110000010101111100011111010010111110100010010011111100011010011110101010111010011101", + "111101000000111111110010010101101000000100110101111100101100101011100000101010011001011000101101100001001100000000011001010100111101010011100010000001010010111100110100111110110", + "011101111100000100110100101101101100111110001101000110010000010001011000010100101001100000010101011001010100111000101001101100100111101011011000111001101010100110001100001110001", + "000100010111000101101010111010011101010000000011001000010110010101010110010010001111101111110011001111110100010110001111100010101001100101010100010111100100101000000010001010000", + "000000101101101111110101100110010111110011100000100011111101111110110101111001001101100100011000101100011111010101001101100001010010100000110111010100100101000011100001101011100", + "010000001101011010011001111000000100101001011110010000100101000110001101000001110101010000100000010100100111101101110101011001001000111000001111101101011111001001011001010011011", + "000110100111001101101011110110110110000101010000011100101101001010010011001011110011011100001110010010001011100011110011010111100100110110000011100011010001100101010111010101010", + "110010000001111001011011001100101011100110110011111111000110100011111000100010111000111110100101100001000100100000111000110100000111010101100010100000110010000110110100100100110", + "101101100000011010011000001011111010011110001001001111010110010011000000010010100001001110010101011001110100111000100001001100101111001001011010111000001000111110001100011110001", + "001011010110011101000010100011011111010010000101001010011010011101001110011100101111101110011011010111111010110110101111100010001011100101010100110111100100001010000100010000000", + "110000110001111011011001000000000001110011100110101011111101111100110101111001000100001101111000110100111001010101000100000001001010000110110101010100000111001011100111110011100", + "011111001100010100110110100001000111101011011110010011001101001110001101001001010100110101001000010100101111001101010100111001110010111110001111001100111111110011011111010001011", + "110110111011000001000101010000100001100101010010010101001011010000000011001111111011010011001110011010101001100011111011010111100100010010000001100010010011110101010011011101010", + "111101000000101011110000010101101000000100110011111100101000110011100000101100011000111100101101111001001010000000011000110100100101010011100010000000110010100100100100111111010", + "011101111100010110110100101101101100011110001011000110010110001001001000010000101000000110010101001001010000111000101000001100111111101011011000111000001010111110010100001111101", + "000100010111001111101101111010011100010000000101001000010000000101001110010100001110001000010011001111110010010110001110000010110001100101010100010110000100110000011010010011100", + "000000101101110111110011100110010110010011100100100011111011111110101011111111001100100011111000101100011001010101001100100001010010100100110111010101100101010011111001110010100", + "010000001101000110011101111000000100001001011110010001000001000110010011000111110100110101000000010100100001101101110100111001001000111110001111101100111110010001011111001011011", + "000110100111001101101111110110110111000101010000011101001101001010000101001111110010111011001110010010001111100011110010110111100100110000000011100010110000011101010001000101010", + "110010000001111001011011001100101010000110110011111110100110100011100100100100111001011000100101111001000100100000111001010100000111010011100010100001010011111110110010111100110", + "101111111000011010011110001011111010111110001001001110011111101011011000010101000001111110010101000001110100111011111001001100111111001001011111111001001001001110001000111110001", + "001010001110011101000110100110001110110010000101001010001000100101010110011011001110100010011011001111111010110010001111100010010011100101011000110011100100010010010010100011100", + "110010101001111011011001000110101001110011100110101011101010100100100101111000100101101011111000100100111001010110101100011001010010000110101010110010000111010011111000101010000", + "011110001100010100110110100010001111001011011110010011011000111110010101001000010100100011001000010100111001001010001100100001101010111110001000101010111111101011000001100010111", + "110111111011000001000101010111111000100101010010010101001111101000011101001111111010111111001110011010110111100111111010001111100100010010001111100100010011100101001111111110010", + "111100001000101011110000010100010001100100110011111100110011101011111110101100011001000100101101111001010100000001001001000100100101010011100111000001010011100100110010101010110", + "011100101010010110110100101000000100011110001011000110000001010001001110010100101000010100010101001001001100111111110001101100111001101011000111111001101011011110001011110010001", + "000110000001001111101101111110110100110000000101001000000101010101001010010010001110111010010010001111110010010101100111100010110111100101010011110111100101010000000100010100000", + "000000100111110111110011100110101111010011100100100011111110100110101101111000101101111001111001001100011001010100100100100001010100100100101010110100100100110011100100000101100", + "010001000101000110011101111011111101101001011110010101011110011110010101000000010100101001000001110100100001101010111100111001001100111110001010101000111111001001001001011110111", + "000101110001001101000111110111011111000101010000011011011010010010010011001110010011001111001111110010001111100010110010101111100100110001111100100100110001100101001110110000110", + "110001010001111000011011001010000010100110110011111000110011110011111000100101111000001100100101111001010100100101000001001100000111010010000101000111010010000110101100110011010", + "101101101001111010010110001011000011111110001001001000010011001011000110010100100000010100010101000001101100111011010001010100111111001000100111011111001000111110010011101001001", + "001011011001111100101110100110101111110010010101001010000101000101001000011010101111110010011011001111100010110111111111110010010011100100010001110111100101010010010100000101000", + "000011100110111011011001001111111000010011111110101011101100100100100011111001000101111001111000100100100001010010011100000001010100000110101010010100000110110011111110010111000", + "011101011010110101010110110101100111001011000110010011011110011110010001001001010101100001001001010100101001001110111100111001101100111110001000101100111110001011000111000110011", + "000110110001000001110101001100011001100101001010010101001000010000011101001110011011001111001111111010101111100010010010010111100010010010011100000010010010000101001010110011110", + "101100001001101011010000010100001001000101010011111000110011110011111110101101111001000100101100011001001100000111010001010100100001010011100111000101010011100100100010110011010", + "101110101011110110010100100000000101111111101011000000000001001001001110010101001000010100010100101001010100111001101001110100111111101010100111111111101011011110010011101011101", + "000111000111001110110101111010110100010001100101001110000101000101001010010011001110111010010011001111100010010011110111111010110001100100110011110001100101010000011100000101100", + "011100100100110111111011101110111111010010100100100101111110100110101011111000101101111001111000101100000001010110111100111001010010100101001100110010100100110011111100000100100", + "101100000011000111110101101101101100101001001110001001011110011110010011000000010100101001000000010100111001101100100100101001001000111111001100101000111110001001001111011110111", + "110001110000001101101111111001000110100101001000000101011010010010010101001110010011001111001110010010010111100100101010101111100010110000011010100100110000000101001000110000110", + "110000010110111000111011011000000010100110101011100110110011110011111100100101111000001100100010111001010100100001010001001100000001010011100001000111010011100110101010110011010", + "011001101010011010101110010111000010111110010001011110010011001011000110010101000000010100010010100001101100111011001001010100111000001001001111011111001001011110010001101001001", + "010110011111011101100110100011011111110011100101001110000101000101001000011011001111110010011100101111100010110111100111110010010110000101011001110011100101010010010100000101100", + "001011100110011011111001001101001000010010000110101101101100100100100011111000100101111001111101000100100001010010000100011001010101100111010010010010000110110011111110000110000", + "010000011100010101101110100001001111001010111110010101011110011110010001001000010101100001001001010101011001001100111100100001101101011111110000101010111110001011000111011110111", + "101011111010000001001101011011111001100100010010010011001111110000011101001110011011111111001111111011010111100011111010001011100010010011101111100100010010000101001010111110010", + "000110001110101010011000000010001001000100100011100000111000110011111110101101111000100010101100011000110100000010001001000010100001010010111000111101010011100100100011100011010", + "101110101111010110110100100110101101111110010011011000011010101001001110010101011000101010010100101000001100111110101001110010111001101010101010100111101011011110010011101011101", + "001010001000001110001101101010001100010000011101010110011000100101001010010011010111100010010100001111100010001010001111111100110111100100111000101001100101010000011100100011100", + "110111111101110111000011111111111111010011111100110101101111100110101011111000110101111111111111001100000001001011111100111001010101100101001111100010100100110011111100111110100", + "001101001100000110111101111110110000101000101110010101010011011110010011000000001101010101000111110100111001110111001100101001001101011111011000001000111000001001001110001000111", + "111111111110101100001111111001010000100100101000011011011101010010010100001110010011110011001011110010010111110011100010101111100011010001110110000100110110000101001000000100110", + "111111000001111000100011001001110110100111001011111000111100110011111101000101111000011000100100111000110100100010000001001100000000110010000101100111010101100110101011100111010", + "110001111001011011001110000001001100111111010001001000001110001011000111110101000000100000010100100000001100111010111001010000111001001000110101011111001101011110010001011111001", + "110000010000011101001110110010011011110011110101010110001000000101001001111011001110001110011010101110000010110100010111110100010111100100011100001011100101010011110101010011100", + "110001101000111010010001000101101100010010011110110101101011100000100011111000110101000101111001000101100001010101010100011111010100000111011111001010000110110010011110110010000", + "100010001101010101001110101010100101001010100110001101010001011000010001001000001101110101001111010100111001010111101100100111101100111111111111110010111110001010100110001010111", + "000000100011100001010101000110010001100100001010000011010101010110011101001110000011111011001001111010110111111001100010001111100011010011110011110100010010000100001010000100010", + "000000010111101010011000011001011101000101000011100000111110110101111110101101100000111000101010011001010100011010100001000100100000110010110101100101010101100100100011100101010", + "100110111100110111111100101000001011111111110011011000000110001001001111010101001000101000010000101001001100101000111001110100111000001010101101011111101101011110010011011111101", + "011011000111101110010101101001000000010001111101010110001010000101001011110011001110101110010100001110000010010100110111111010110110000100110011010001100011010000011101010001100", + "011111101101010111100011101000100001010010111100110101100011100111001010011000101101001101111111001101100001010111010100111101010101100101011000110010100000110011111100110010100", + "011001010010000111110101101101011000101000101110001101010011011111110010100000010101010101000111110101011001101111001100101111001101011111000001010000111110001100101110001000101", + "110101110111101100100111110011000010100100101000000011011101010111110101001110000011110011001011110011010111100010000010101001100011010001101111111100110000000010101000000100110", + "101101000001011000100011011111010000100111001011100000111100110100111100100101100000011000100010111000110100111011100001001010000000110010000100011111010011100001001010000111000", + "111010100000111010001110000101011010111111010001011000001110001101000110001101011000100000010010100000001100100011011001010000111000001000110100101111001001011001010000011111001", + "001010000001011100101110110111100011110011110101010110001000000011001000000011010110001110011100101110000010101101010111110100010110000100011011001011110011010010010100110011100", + "000011100001011010010001000101110110010010011110110101101011100100100010100000110101000101111101000101100001000101010010011111010101100111011000101010011000110011111111010010000", + "001100001100110101001110110010011011001010100110001101010001011110010000111000001101110101001111010101011000010111101010100111101101011111101000010010100000001011000110001010111", + "100001101011100001010101011110000111100100001010000011010101010001111100101110000101111011001001111011010110011001100100001011100011010011101110010100001110000101001010000100010", + "111100011111101010011000000001010101000101000011100000111110110010011111001101100110111000101010011000110101111010100101000010100000110010101101111101010101100001000011100101000", + "101110101100110111111100101000111001111111110011011000000110001100101111010101011110101000010000101000001101001001011001110011011000001010110101000111101101011001110011011111110", + "010111010111101110010101101001000110010001111101010110001010000010001011110011010010101110010100001010000010001101010111111101010110000100110011001001100011010111111100010001111", + "010111111101010111100010001011111111010010111100110101101111100000101010000000110101111111111111001011100001001111111100111100110101100101011111100010100000110100111101111110111", + "010010001010000111110100001010001010101000101110001101001000111000010010111000001100100011000111110011011001110110001100101110001101011111011000110000101000001000101110100010111", + "110110101111101100100110110110101010100100101000000011001010110110010100010110000010101011001011110101010111110110101100101001100011001001111010111100101110000100101000101010110", + "100010001001010000100010011110001110100111001011100000111000110101111101010101100000100010110010111000110101111010001111001010000000101010011000111111001101100111001011100011010", + "111011111000110000001110100011111100111111010001011000001111101100100111110101011110111110001010100000001101000011111111010000111000010000111111101111010101011111010000111111001", + "001001011001011100101110110011000011110011110100010110001101000010101001111011010001011010000100101110000011001000000011110100010110010100000110001011100011010111110101100101110", + "000000110001010100010000000010010110010010011111010101110110100001000010111000110011011001100101000101100000100001100100011110110101100111001101101010000000110100011110100100011", + "001110001100100001001011010011111001001010100111101101000110011001010000101000001000001001001111010001011001010110111100100110001101011111111101010010111000001100100111111110100", + "100011110011101001010110011010000011100100001011100011000010010111111100110110000010101111001001111101010111111110110010001010000011010011101011010100010110000010001010010000001", + "111111011111100100011001000101110101011001000011100000111011110100011111010101100001101100101010011110110100011111010001000011100000110010110000111101000101100001000010110011010", + "101101110100110111111100001111111011100001110011011000010011001100101111001101011000110100010000101110001100101101001111110010111000010010100000000111110101011001110011101011101", + "010101010111100100010101001000100010001111111101010110010101000010001011100011010111010010000100001110000011001100000001111100110110011100100110001001111011010111111101000111100", + "010101100101011111100111001100110101000100111100110101101100100001001010000000110010011001100111001101100000101001100010111101010101111101011101100010111000110100111101000100100", + "010010000010000101110011101000011000101000101001001101001110011001110010111000001010000001011111110101011000010011011000101111001101001111011101010000101000001100101110111010101", + "110110100111100000100110110100100000100100101111100011010000010111110100010110000101101111010011110011010110010111010100101000000011010001111011011100101110000010101000010010101", + "100011000001001110100110111110010100100111001100000000101011110100111101010101100101100101000010111100110101111010110111001011100000110010010000111111001101100001001010010011001", + "111000101000110010001101000001011000111111010100111000011001001100100111101101011111101101110010100110001101000100001111010001011000001100110000001111010101011001010001001011010", + "001001001001010010101111110011000011101111110101010111101101000010101001100011010001000011111100101000000011001000000011110101010110000010000110001011110011010111110100000101110", + "000000101001011010010001100010010110001100011110110100011110100001000010100000110011000000111101000011100000100001100010011110110101111001001101101010011000110100011110000000011", + "001110010100111111001110010011111001010100100110001100101111011001010000111000001000011001011111001001011000010111011010100110001101000001111101010010100000001100100110011000100", + "100011111011101001010001111010000011110010001010000010011011110111111100110110000100101111010001100101010110011111010100001010010011001011101011010100001110000010001011110110001", + "111111001111101000011110000101110101000101000100100000100010010100011111010101100111101100110010000110110101111110110101000011111000100010110000111101000101100001000011110101000", + "101101100100111011111101101111111011111111110100111000001010101100101111001101011110110100001000111110001101001100001111110011000000010010100000000111110101011001110011101001110", + "010101001111111000010000001000100010010001111010110110011101000010001011100011010011010011100100001010000101001100000001111101001110011100100110001001111011010111111101000101111", + "010101101101011111100000101100110101010010111001010101110100100001001010000000110010000000000111001011100110101001100011111100110101111001011101100010111000110100111101000110111", + "010010000010001001110100101000011000110100101111001100110110011001110010111000001010011000111111110011011110010011011001001110001101001001011101010001001000001100101110011110101", + "110110111111100100100111010100100000111010101001100010101000010111110100010010000101110110010011110101010010010111010101001000000011001111111011011101001110000010101000110110101", + "100011011001000010100011111110010100111001001010000001000010110100111101010011100101110100110010100100110101111010110110101011100000101100010000111110101101100001001011110101001", + "111011111000111010001011100011111000101001010000111001001111101100100111101011011111111110001010111110001101000111111111010001001000010000111111101110010101011001010000111111010", + "001010001001010110101001010010001011101111110010010110001000100010101001100101010001100010000100110000000011001010001011110101001110010100001000101011110011001111110101100011110", + "000010101001001110010111000110101111101100011001010101101010100001010010100000110011101011100101010011100000100110101010011110101101111111011010101010011000101100011111101010011", + "001110001100111011001001110010001000110100100001101101001000111001001000111000001001100010111111010001011110010110001010100110010101000111101000110010100000010100100111100010100", + "100011111011110011010010111111111011010010001111100011011111110111100100110110000101111110110001111101010000011111111101001010000011001111111111110100001110010010001010111110001", + "111101001111101110011111100000110101000001000100100001010101010100000111010101100111011001010010011110110011111111100100100011100000100100111101111100100101100001000101000001000", + "101110100100100101111010101100011010111001110100111001101111101100101111001001011110000001001000101110001001001111011110010011011000010100100101000110010101011001110101111001110", + "010110011111100000010100101010100011110111111010110111100001100010001011100101010010001111100100010010000011001011010000011101010110011010101011001000011011010111111011110011111", + "010111111101000101100110001110010101010100111001010100100011111001001010000110110011100100000111010011100000101010110010111100100101111001000000100011111000110100111000110010111", + "010000000010000011110110001101011001010100101001001100111001000001110010111110001011001100111111101011011000010010001000101110010101001001010000010000101000010100111110101011001", + "110101111111111110100001110111000000111010101111100010110101001111100100010110000100000010010011100101010110010100000100101000011011001111111110011100101110011010110000100101001", + "100000001001010110100010011100010101111001001100000001010110100100100101010101100101000001010010100100110011111101100111001011111000101100011101111111001101111001010011000000101", + "111010110000101000001011100011111000001001010100111001001111001100111001101101011111111001101010111110001011000111011110010001001000010100101101001111010101001001001001011000010", + "001011011001011000101101010110000011110111110010010111100011100010110111100011010001110111100100110000000101001001010010010101001110010010001011001010010010010111110011110111110", + "000011101001001000010111000001110111010100011001010100000100000001000100100100110011110100100101010011100100100010110011111110101101111001001000101011111001010100011000010100011", + "001101000100111011001111110001111000101100100001101100111100111001010100111110001001001100111111001001011110010000001011000110010101000001110000010011000001101100100000101100100", + "100001101011110011010000111000100011100010001111100010010010001111111100110001100101000010110001100101010000011100000101001010010011001111110110010101001111100010001110000010001", + "111101001111101110011011100000110100111001000100100001010001001100011111010010000110100101010010000110110011111111100100100011111000100100111101111000100101111001010011000000100", + "101110100100100101111010101100011011100001110100111001101111110100111111001000111111011111001000111110001001001111011110001011000000010100100101000000010101000001101011111000010", + "010110011111100000010100101010100011001111111010110111100001110010010011100100010011110001100100010010010101001011010000000101001110011010101011001110011011001111100101110110011", + "010111111101000101100110001110010101100100111001010100100010100001010100000110110010010010000111010011111110101010110011100100100101111001000000100101111000100100100100110101111", + "010000000010000011110110001101011000101100101001001100111000111001101100111110001010101100111111101011000110010010001001011110010101001001010000010001001001010100101000101100101", + "110101111101111110100001110111000001100010101111100010110010110111100010010010000101000010010011100101001010010100000101001000011101001111111110011101001111111010101110100010101", + "100000001001010110100010011100010101000001001100000001010001010100100001010011100100100001010011100100110011111101100110101011111110101100011101111110101100011001001101011001001", + "111010110000101000001011100011111000111001010100111001001001010100111111101010111110011001101011011110001011000111011110010001001110010100101101001110010100101001010101000001010", + "001011011001011000111101010110000010001111110010010011100111111010110001100100110000010011100101010000000101001001010010010101001010010010001011001110010011001111100011101110010", + "000011101111001000011111000001110110011100011001010010000010011001010010100101010011110010100100110011100100100010110011100110101101111000101000101101111000101100000000000101111", + "001101000010111011110111110001111000011100100001101010111010101001001000111111001001001010111111001001001110010100001011011110010101000000010000010101000000010100111000101101000", + "100011111001010010010000111011111011001010001111100100011111101111100010110000000101111110110001100101001000011011111101010010010011001110011111110011001110010010010010111111001", + "111110001101001111001011100010001100101001010100100001001000101100000001010011100110100011010010000110101011111110001100110011111000100101101000111100100100111001010100100010100", + "001110101110000101011010110110101010011001101100111001111010110100111001001001011111101011001000111110010001001110101110010011000110010100111010100110010100100001101100101010110", + "010110001111100001000100100010001011000111100010110111111000110010010111100101010010100011100101010010000101001010001000011101001000011010101000101000011010101111100011100011011", + "110111111100000100010110000011111100000100100001010100101111111001010100000111010011111110000110110011100110101111111011111100100011111001001111100011111001000100100000111110011", + "000010010010000011010110001001111001000101001001001000100111000001101100111111101011011110111110001011011110010001011001001110010001001001010101010101001001010100111000111001001", + "100111111000011110111001110000000001000011001111100100110011101111100010010011100100110110010010000101010010010001010101010000011011001110000011011011001111111010110111010111001", + "010011001110010110011010001011110101110000101100000111001100000100100001010010100100110101010010100100100011111000110110110011111000101101101000111000101100011001010100010100101", + "110101100011001001001011100111111001101000010100111111001100110100111001101010111111101101101010111110010011000110001110001001001000010101011000001000010100101001001100010100010", + "011101001011011001111101000010100010011111100010001111111010011010110111100100110000000011100100110000011101001100000010000101001110010011001110001110010010001111100011111010010", + "100001101011101000110111011100110111110100000001001100000001011001010100100101010010000100100101010011111100100101100011100110101011111001010101101101111001001100000001111001111", + "001010000100111010011111111110011000011100111001110100100001101001001100111111001001011110111000001001001110010011011011011110010011000001100101010101000001110100111001101001000", + "001110111010110010100000110010100010110010010111110010010111101111100010110001100100110000110110000101001000011011010101010010010100001111100011010011001111110010010111010111001", + "100011011111101110111011100000010100101000100100100101001100101100000001010010000110110011010101100110101011111100110100110011111101000100111000111000100100111001010101010100100", + "111000100011000101100010101001011010011000010100111111101100110100111001001000111111101001001101011110010001001010001110001011000111110101011000000000010100100001101100001100010", + "100101011000100000101100111111000011000110011010110001111010110010010111100100010010000101100101010011110101001110010000000101001001111011011110001110011010101111100010100010011", + "011011101110100100100110001110010100000101111001010010100001011001010100000111010010000110000110110010011110101011111011100000100011111000110101100101111001000100100001111001111", + "001101010000000010100110011001111001000100111001010000100001000001101100111111101011011110111110001010100110010111000001011000010001001000010101001101001001010100111000100001001", + "010011111011011110000001101010000001000010110111111100110111101111100010010011110100110010010010000100001010010011001101010110011101001110000011000011001111111010110111001111001", + "101011001001010111110010010011110101110001010100011111001100000100100001010010111100110011010101100100100011100110110110110101111110101101101000100000101100011001010100000100101", + "010100100011101001111011101001100001101001001100101111001100110100111001101010100111101011101101011110010011011000001110001001001111010101011000011000010100101001001100010100010", + "010110001001011000001101010110111000011110000010010011111010011010110111100100101000000101100011010000011101010000000010000101001011110011001110001110010100001111100011111010010", + "010101101110101000001111000100101111110101100001010010000001011001010101100101010010000100100000110011111100110101100011100110101010011000111101101101111111001100000001110001111", + "111110000011111010010111100100000000011101011001101010100001101001001101011111001001011110111110001000101110010011001011011110010010100000001101010101000111110100111001100001000", + "101101111100010011001000111000111110110011010111100100010111101111100011010001100100110000110000000100101000011011001101010110010101001110011011010011001011110010010111001111001", + "100000011111101110101011110100001100101000110100111101001100101100000000110010000110110011010011100111001011111110101100110101111100100101100000100000100100111000110101001100100", + "111001100010000101110010101001000010011000001100100111101100110000111001001000101111101001001001011111010001001000010110001101000110010101001000011000010100100000001100010100010", + "000100011001100001011100110101010001000110000010101001111010110100010111100100001010000101100011010010010101010000000000000011001000011011011110010110011010101110000010110010011", + "010101101010000100011110011111111110000101100001000010101111111111010100000111001010111110000000110011111110110111111011100100100010111000111111110101111001000101100001111111111", + "000000001011000011000110010010001011000101011001010000101000100111101100111111110010100010111000001011000110001010001001011110010000101000001000110101001111010100111001100011001", + "111111100001011110101001111110101001000011010111111100111010101111100011010011100100101010010110000101001010000010101101010000011100101110001010111011001001111010110111101011001", + "100000100110010111101010011110001101110000110100011111011000100100100000110010100100100011010101100101000011111010001110110011111111001101111000111000101010011001010101100010101", + "101110100111101001110011111011111101101000001100101111001111110101011000001010111111111111101101011111110011000011111110001101001111010101011111101000010000101001001100111110010", + "101110101000011000011101011000100010011110000010001011110111111011010110000100110001010001100011010001111101001011010010000011001011110011000101010110010010001010000010001110010", + "101110101111101000011111001100000111110101100001001010010100111100110100100101000010110010100000110010111100100000110011100000101010011000100110110101111001001011100001001101100", + "100000101011111010000111110101000010011101011001110010101100101110001100111111010000001000111000001000101110001000001011011000010010100000011110001101000001110011011001110101001", + "111111101100110010101000100011011000110011010111110100000010101001100010101001111100000100110110000100101000000110010101010110010100001110010010000011001111110101010111110011000" + ], + "2": [ + "111111100001110100011001100001010000001010010000101110011100101011101110111001111001010000001000110111110100001000111000110100111000100011100010000001000101111100110110001111111", + "100000100111100000000011111010010000110110101011100101110001101100111111110100010000001100001000010001101110011111110000010100100000010011011000111001110101000110001010101000001", + "101110100001110000100000111111100100001101110101010001111100010001001001100101100110000010000110010100011111101111111110011010101110011101010100010111111011001000000110001011101", + "101110100001100001001001110101111111111110010011101111001011111110010100010011010011110000001101101001110110110111000101111101000101111100110111010100111000100011100001101011101", + "101110101100011001110100001111111101100111100100100011111111100110000011010100010100111111100101011010011001100111111101001111010101001110001111101100101000010001011100001011101", + "100000100100111011011000100010001011101101101111111010101000111011100100101111001011100011010011001010110101000010001011010001111011001000011000100010101110011101010010101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000001010101011111011100010001111010111110011111010111000111000010010111110111100100011011101001111000100110110001101011111110101000110011000101100100000010011011110100000000", + "001100111111010111111111000111111001001000111011011001101111101001000010100101100100111110111011011111000000000111111011010111110011001010011111100010001110010101010010111010000", + "011100000001110100011001100001010000001010010000101110101001001010101110111001111000110000001000110111110100001000111000110100111000100011100010000001000101111100110011000001000", + "011001101111100000000011111000010000110110101011100100000000101100011111110100010000001100001000010001101110011011110000010100100000010011011000111001110101000110001011011001110", + "010110010001110000100000111111100100001100110101010001001000010001001001100101100111100010000110010100011111101111111110011010101110011101010100010111111011001000000101110111111", + "001000100001100001001001110111111111111110010011101110011100111111110100010011010011110000001101101001110110110011000101111101000101111100110111010100111000100011100100010100111", + "110001001100011001110100001100111101100111100100100011100001000111100011010100010101011101100101011010011001100101010101001111010101001110001111101100101000010001011110101100101", + "000010110100111011011000100011001011101101101111111011011010111011000100101111001011010111010011001010110101000000101011010000011011001000000011100010101110011101010000000010101", + "100000000111000110010110001001010010111010011110010111011010110101111111010011010001010100110000100010101001011001001000110011111000101011100010100001001101111110110011000001001", + "100101101100001100100100011010010010010011100000000010110110010010111001111110111110011101100000000100011011011110101000001101001000010001011010111001010101001110001001111001010", + "101010010111000010101111010111100110111100100110011101011110111101111000001111001110000110111110000001000010111100001110000011001110010101010100110111110011001010000101110111110", + "110100100010001101101110010101111101011011000110001111101100100010010010011001111101100001100101111100000011110110011101111001001101111110110101010100011000101011100110110100011", + "001101001010101011111011100100111111010111101110001000110010101011010010111110111100111001011101001111000100110110100101000001110101000110001111001100100000010011011110101100100", + "111110110111010111111111000001001001001000100101011111001011001001000010100101100101000110111011011111000000000111110011001111110011001010000001100010001110010101010010100010001", + "011100000001110100011001100001010000001010001001001100001101001110001110111001111000110000001000110111110100001100111000100100111000100011100010000001000101111100110011000001000", + "011001101111100000000011111000010000110110110100100010000000000000011111110100010000001100001000010001101110011111110000001101000000010011011000111001110101000110001011011001110", + "010110010001110000100000111111100100001100101000100011101100100101001001100101100111100010000110010100011111101111111110000011001110011101010100010111111011001000000101110111111", + "001000100001100001001001110111111111111110001101101111011011111011010100010011010011110000001101101001110110110011000101100000100101111100110111010100111000100011100100010100111", + "110001001100011001110100001100111101100011111101000000000100100100100011010100010101011101100101011010011001100111010101011000010101001110001111101100101000010001011110101100101", + "000010110100111011011000100001001011101101110000111001011011010010100100101111001011010111010011001010110101000000101011001111111011001000000011100010101110011101010000000010101", + "100000000111000110010110001101010010111000000011100101011110000010111111010011010001010100110000100010101001011011001000101100011000101011100010100001001101111110110011000001001", + "100111111100001100100100011111111010010001111110000010011111110110011001111110111110111111100000000100011011011111111000010100101000010001011111111001010101001110001001111111010", + "101010001111000010101111010110001110111010111111111010101000111110111000001111001110100010111110000001000010111010001110010010001110010101011000110111110011001010000101100011110", + "110110101010001101101110010010101101011011011001001111101010101101110010011001111100101011100101111100000011110110101101100000101101111110101010110100011000101011100111101010011", + "001110001010101011111011100010001111010111110011111000111000111110010010111110111101100011011101001111000100110010001101011000010101000110001000101100100000010011011110100010100", + "111111111111010111111111000111111001001000111011011001111111101101100010100101100101111110111011011111000000000111111011010110010011001010001111100010001110010101010010111110001", + "011100000001110100011001100011111000001110010110101101111101101001001110111001111000010000001000110111110100001011000000110101111000100011100111000001000101111100110010010101000", + "011001101111100000000011111000111000110110101101100010010000101001111111110100010000111100001000010001101110011011010000010100100000010011000111111001110101000110001010001101110", + "010110010001110000100000111111001100001110110011010011100011010100001001100101100110010110000110010100011111101100101110011010101110011101010011110111111011001000000101100011111", + "001000100001100001001001110101010111111100010011101111110010011011110100010011010010010100001101101001110110110001001101111001000101111100101010110100111000100011100101100000111", + "110001001100011001110100001100010101100001100010100001110110000101100101010100010101111101100101011010011001100110101101001001010101001110001010101100101000010001011111111000101", + "000010110100111011011000100001100011101101101111111001001111111011000000101111001011100111010011001010110101000100001011010110011011001000011100100010101110011101010001010110101", + "100000000111000110010110001011111010111010011100010101010101110011111111010011010000100000110000100010101001011100011000110101111000101011100101000001001101111110110011010101001", + "100101101100001100100100011010111010010011100110000010111011110110111011111110111111111001100000000100011011011010100000001101001000010001000111011001010101001110001000001101010", + "101010010111000010101111010101001110111000100000011011001011011111111110001111001110100110111110000001000010111101110110000011001110010101010001110111110011001010000100100011110", + "110100100010001101101110010101010101011011000000001111111101000100010100011001111101010001100101111100000011110110111101111001001011111110101010010100011000101011100111100000011", + "001101001010101011111011100100010111010101101000001000111000001111010110111110111101001101011101001111000100010111110101000001110011000110001000101100100000010011011110111000100", + "111110110111010111111111000011100001001010100101011001000100101101000100100101100100100010111011011111000000000111111010001111110101001010011100000010001110010101010011010110001", + "011100000001110100011001100001111000001100001110001100011011101000001000111001111000010000001000110111110100101011000001000100111100100011100111000001000101111100110010010101000", + "011001101111100000000011111010111000110110110100000010010100100000011111110100010000111100001000010001101111011111010001101101000000010011000111111001110101000110001010001101110", + "010110010001110000100000111101001100001100101010000011100011000101001101100101100110010110000110010100011111001010101111100011001110011101010011110111111011001000000101100011111", + "001000100001100001001001110111010111111110001011001111010110011011010110010011010010010100001101101001110110010111011100100000100101111100101010110100111000100011100101000000111", + "110001001100011001110100001110010101100011111010100000010000000100100101010100010101111101100101011010011000000110110100111000010101001110001010101100101000010001011111011000101", + "000010110100111011011000100011100011101101110111111001001011110010100010101111001011100111010011001010110100100000010010101111111101001000011100100010101110011101010000110110101", + "100000000111000110010110001001111010111000000100000101010101100010111011010011010000100000110000100010101001111010011001001100011110101011100101000001001101111110110010110101001", + "100101101100001100100100111000111010010001111111000010011111110110011111111110111111111001100000000100011011011100110001010100101110010001000111011001010101001110001001001101010", + "101010010111000010101111110111001110111010111001111010101101011110111110001111001110100110111110000001000010011101111111110010001010010101010001110111110011001010000100100011110", + "110100100010001101101110010111010100111011011001001111111001001101110010011001111101010001100101111100000010110010111100000000101101111110101010010100011000101011100111100000011", + "001101001010101011111011000110010111110111110001111000111000011110010110111110111101001101011101001111000100010001110100111000010101000110001000101100100000010011011110111000100", + "111111111111010111111111100011111001001000111100011001101111101101100000100101100100111110111011011111000000100011111010010110010011001010011111100010001110010101010011111110001", + "011110001001110100011001100010001001101110010111001101101000101001001000111001111001100010001000110111110101101010001001010101111000100011111000100001000101111100110011100011000", + "011010101111100000000010011110101000010110101100100010011010101001111001110100010001101010001000010001101111111110101001110100100110010011001010111001110101000110001011101011110", + "010110001001110000100001011110001100001110110010110011101000110100001101100101100111100010000110010100011111001110001111111010101000011101011000110111111011001000000100100011111", + "001011111001100001001001010111111110111100010010101111111111101011110010010011010011111110001101101001110110110111111100111001000011111100101111110100111000100011100100111110111", + "110001001100011001110100101010110101100001100010101001110011111101100101010100010100011001100101011010011001000110110100101001010001001110011111001100101000010001011110001100101", + "000010110100111011011000100011000010001101101111111001011011001011000100101111001010000111010011001010110100000101101010110110011011001000010001100010101110011101010000000010101", + "100000000111000110010110101111010010011010011100011101001101010011111011010011010001110000110000100010101001111110100001010101111000101011110010000001001101111110110010100001001", + "100101101100001100100100111000011010010011100111010010110000000110111011101110111110101101100000000100011011111111110001001101001000010001001000111001010101001110001000111001010", + "101010010111000010101111010101100111011000100001110011001100100111111110000111001111000010111110000001000011011111101111100011001110010101000100010111110011001010010100110111110", + "110100100010001101101111110001110101111011000001001111101011111100010100000001111100110001100101111100000010010101001100011001001011111110100111010100011000101011111111010100011", + "001101001010101011111010000110100111010101101001110000100100111111010110100110111100011101011101001111000100010111010100100001110011000110011111101100100000010011000110001100100", + "111110110111010111111111100111000000001010100100001001001011011101000100100101100101110110111011011111000000000110101010001111110101001010010011100010001110010101001010000010001", + "011100000001110100011001000111011000001100001111000100011110010000001000100001111001110100001000110111110100101011011001000100111100100011110010100001000101111100110011100001000", + "011001101111100000000011111000011001010110110100100010000000010000011111110100010001011100001000010001101111011110110001110101000000001011001010111001110101000110001011011001110", + "010110010001110000100000011001100100101100101010101011111011100101001101100101100111000110000110010100001111001000010111111011001110000101000100110111111011001000000100010111111", + "001000100001100001001001010101110111111110001010111111011101101011010110010011010011000000001101101001111110010010011100111000100101100100100101001100111000100011100101010100111", + "110001001100011001110100001110111100000011100010101000010111111100100101010100010100011001100101011010000000000100110100101000010101011110011111001100101000010001001111101100101", + "000010110100111011011001000111000011001101110111111001011101001010100010111111001010000111010011001010101100100011111010101111111101001000010001100010101110011101001001100010101", + "100000000111000110010111101011001010111000010100011101001001010010111011001011010001110000110000100010100001111010111001001100011110101011110010000001001101111110101011100001001", + "100101101100001100100100111100011011010001111111010010010000000110011111111110111110101101100000000100001011011101110001010100101110010001001000111001010101001110010001011001010", + "101010010111000010101111110001101110111010101001110010101000100110111110010111001111000010111110000001000010011101101111110010001010010101000100001111110011001010000101010111110", + "110100100010001101101110010101110100111011000001001111101101111101110010011001111100110001100101111100001010110011011100011000101101100110100111001100011000101011100110110100011", + "001101001010101011111011000010111111110111111001110000100000111110010110111110111100011101011101001111010100010011001100100000010101011110011111110100100000010011011111001100100", + "111110110111010111101111100011000001001000111100001001101001011101100000100101100101110110111011011111001000100100101010001110010011010010010011110010001110010101010011100010001", + "011100000001110100000001100011010001101110011111000101111110010001001000111001111001110100001000110111101101101001011001000101111000110011110010100001000101111100100010000001000", + "011001101111100000010010011100011000010110101100100010000110010001111001100100010001011100001000010001110111111000100001110100100110010011001010111001110101000110010010111001110", + "010110010001110000110001011101111100001110100010101011111101100100001101111101100111000110000110010100010111001100001111111010101000011101000100110111111011001000011101010111111", + "001011111001100001001001010011111110111100001010111111111111101011110010010011010011111110001101101001100110110011111100111001000011111100101111110100111000100011111100111110111", + "110010001100011001110100101010001101100001110010101001111000111101100101001100010100100011100101011010011001000010001100101001010001001110001000110100101000010001011111100010101", + "000010101100111011010000100010101010001101110111111001001010101011000100101111001011101011010011001010111100000110101010101110011011010000001010111010101110011101010001101010101", + "100010001111000110011110101010001010011010010100011101011000110011111011010011010000100010110000100010111001111010001001001101111000110011101000111001001101111110110010100011001", + "100111111100001100110100111011111010010011100111010010101111100110011011111110111111111111100000000100010011111111111001010101001000001001001111101001010101001110001001111111010", + "101010010111000010110111010011000111011000101001110010100001000111111110001111001110110110111110000001011011011110101111110011001110000101011011110111110011001010010100000011110", + "110100100010001101111111110001011101111011000001001110111110011101010100001001111100010101100101111100011010010011011100011001001011111110100010110100011000101011111110000000011", + "001101001010101011101010000010011111010101111001110001110110011111010110100110111100111100011101001111001100010110110100100001110011000110000010101100100000010011000110011000100", + "111110110111010111111111100101100000001010111100001000000101111101000100100100000100000110011011011111010000000010010010001111110101001010010100100010001110010101001011110110001", + "011100000001110100011001000111110000001100011111000100010111110001001000100001011000000001101000110111110100101110011001000100111100100011101101011001000101111000110011010101000", + "011001101111100000001011111110111001010110101100100011010011110000111111110101110001111001101000010001100111011110110001110101000000001011001001000001110101000000001011001001110", + "010110010001110000101000011011000100101100100010101010101101000100001101100100000111100111000110010100001111001001111111111011001110000101011111101111111011001110000100100101111", + "000100100001100001011001010001001111111110001010111110110011001011110110010011010010110000001101101001111110010010111100111000100101100100100100000100111000100101100100100110111", + "110001001100011001101100001000011100000011110010101001111010011100100101010101010101101101100101011010000000000101110100101000010101011110000000101100101000010001001111011110111", + "001010110100111011001001000111101011001101110111111000001000101011100010111111101010100011010011001010101100100101101010101110011101001001110100000010101110011101001000110110110", + "100000000111000110000111101111110010111000010100011100011011110010111011001011010001010001010000100000100001111011011001001101111110101010001111000001101101111110101011110101010", + "100101101100001100100100111110111011010001100111010011011110100110011111111111111111011101100000000010001011011011001001010101001110010000101111111001110101001110010000101101001", + "100010010111000010101111110001000110111110101001110010100001000111111110010111001110110111011110000001000010011010101111110011001010010100011011101111110011001110000101100011110", + "110100100010001101100110010011010100111101000001001110111110011101010010011000011100010100100101111010001010110101011100011000101101100110100100101100011000101101100110100100011", + "001001001010101011110011000000011111110111111001110001110110011111010110111111011100111100011101001011010100010000100100100000010101011110000100110100100000010101011111111110100", + "110010110111010111101111100111111001001000111100001000000101111101000000100101100100000110111011011001001000100000001010001110010011010010010010110010001110010011010010010000001", + "011100000001110100000001100101110001101110011111000100010111110001001000111000111000000000001000110011101101101000011001000101111000110011101001000000100101111100100010110011010", + "010001101111100000010010011100110000010010101100100011010011110000111001100100110001111000001000010001110111111100110001110101000110010010101111011000010101000110010011101101101", + "010110010001110000110001011001000100001100100010101010101101000100001101111101100111100111100110010110010111001001101111111011001000011100111001110110011011001000011101000011100", + "001000100001100011001001010011010110111110001010111110110011001011110010010010010010110000001101101111100110110010100100111000100011111101000010010101111000100011111101000000100", + "111001001100011101110100101000011101100011110010101001111010011100100101001100010101101100000101011010011001000101110100101000010001001111000000110100101000010101011110111000101", + "000010110110111101010000100011100010001001110111111000001000101011100100101110101010100010010011001100111100000111101010101110011011010000010010011010101110011011010000010010101", + "100100000111000010011110101011110010011010010100011100011011110010111011010010110001010001110000100110111001111111001001001101111000110011101001011001001101111000110010010011001", + "101011111000001010110100111111111010010011100111010011011111100110011011111110111111111111100000000010010011111111111001010101001000001001001111101001010101001000001001111111010", + "101010001101000010110111010110001111011000101001110010111000100111111110001110001110100010111110000101011011011110001111110011001110000101011000110110010011001010010100100011100", + "111110101000001111111111110010101101111111000001001110111010111101010100001001011100101011100101111100011010010010101100011000101011111111001010110101111000101011111110101010000", + "001110001110101111101010000110001111010111111001110001101000111111010110100110111100100010111101001101001100010010001100100000010011000111111000101101000000010011000111100010111", + "111111111001010101111111100011111000001000111100001000001111111101000000100100100100111110111011011001010000000111111010001110010101001011111111100011001110010101001010111110010", + "010100000001110000011001000011001000001110011111000100011011010001001000100001111001010001101000110111110100101100111001000101111100100010100100011001000101111000110011000111000", + "011001101101100110001011111100011001010010101100100011010010010000111111110101110000001101001000010111100111011111110001110101000000001011011100100001110101000000001011111111110", + "010010010001110100101000011101101100101100100010101010111000100100001111100100000110000011000010010000001110001101101111111011001110000101010100001111111011001110000101110111111", + "000100100101100111011001010001110111111110001010111110101011101011110110010011010101110000001001101111111111110111011100111000100101100100110111000100111000100101100101110100111", + "110001001000011001101100001110111100000011110010101001110110111100100101010101010010101101100001011110000001000001001100101000010101011110001111101101001001010001001111001100111", + "001010110110111001001001000111000011001001110111111000001001001011100100111111101001000111010011001010101101000100101010101110011101001001100011100011001111111101001001000010110", + "100000000011000010000111101011010010111010010100011100001110010010111001001011010000101101010000100000100001111011011001001101111110101010000100100000101100011110101010100101010", + "100101101010001110100100111100011011010011100111010011000110000110011011111111111000011101100000000010001011111010100001010101001110010000111100111000010100101110010001011111001", + "100010010111000110101111110101111110111000101001110010101101100111111110010111001101101111011100000001000011011010001111110011001010010100010010101111110101001110000101110001110", + "110100100000001011100110010001110100111111000001001110111111111101010010011000011111111000100111111010001011010010011100011000101011100110110001001100011110101101100110010010011", + "001001001010101111110011000110110111110111111001110001100011111111010100111111011111011000011111001011010100010110110100100000010011011110001111010100100100010101011110101100100", + "110010110011010001101111000111000001001000111100001000011101011101000000100101100101000110111111111001001000100001101010001110010101010010000001110010001000010011010011000010001", + "011100000101110100000000000011010000101110011111000100011011010001001000111000111011010000001000010011101101101100100001000101111100110011100010000000100100111100100010100001010", + "010001101101100010010010111100011000010010101100100011010010010000111111100100110000000100001111110001110110111111110001110101000110010010111000111000010100100110010010011001101", + "010110010101110100110000111101100101101100100010101010111000100100001111111101100010010011100111110110010111001101101111111011001000011100110010010110011010101000011100010011100", + "001000100111100011001000110001110111011110001010111110101011101011110110010010010101111000001100001111100110010111001100111000100011111101010001010101111001000011111101010010100", + "111001001100011101110100001110100100100011110010101001110110111100100101001100010110110100000111111010011000000001010100101000010001001111001001110100101110010101011110001010101", + "000010110110111101010000100111000011101001110111111000001001001011100100101110101001001110010000101100111101100100101010101110011101010000000111111010101000011011010001100100101", + "100100000111000010011111101011011011011010010100011100001110010010111001010010110010110101110010100110111001111011011001001101111110110011100010111001001011111000110011100001001", + "101001101001101010110101011100011011110011100111010011000110000110011011111110111110011101100100100010010011111010110001010101001110001001011010101001010001001000001000011001010", + "101010010010100010110111010101100111111000101001110010101101100111111110001110001101100110111110100101011011011010010111110011001010000101010100110110010010001010010100010111100", + "111100100001101111111110010001110101011111000001001110111111111101010010001001011101101001100010011100011011010010010100011000101011111111010101010101111001001011111111110100000", + "001101001110110111101010000110111110110111111001110001100011111111010100100110111000001000111100101101001100010110100100100000010011000111101001001101000001110011000111001000111", + "111111111001000101111110000111111000101000111100001000011111111101000000100100100011111110111010111001010000100011111010001110010101001011101111100011001111110101001011111110010", + "010110001001011000011001100110001001001110011111000100011000110001001000100001111011100011101010010111110101101010001001000101111100100010101000111001000011111000101010100011000", + "011010101100110110001011111110101000110010101100100011011010110000111111110101110010101011001011110111100110111010101001110101000110001011001010100001110011000000011011101011110", + "010010001000000100101001011110001101101100100010101010101000100100001111100100000101100011000100010000001111001010001111111011001000000101011000101111111101001110001100100011111", + "000111111100001111011000110011111110011110001010111110111111101011110110000011010011111110001001001111111110010011111100111000100011100100111111100100111100100101100101111110111", + "110001001001100001101100001010011100100011110010101001111110011100100101000101010110010101100101111110000000000110101100101000010001011110001100101101001001010001001111011110111", + "001010110111010001001000100101111011101001110111111000000101101011100100101111101010001111010100101010101101100110010010101110011101001001111010100011001111111101001000110000110", + "100000000011011010000111101111110011011010010100011100011111110010111001001011010101011001010001010000100001111000010001001101111110101010000001000000101100011110101010110011010", + "100101101010010110100101011110110011110011100111010011010011100110011011101111111001111001100001110010000011111010101001010101001110010000100111011000010100101110010001101101001", + "100010010111100110101111010001000111111000101001110010100101000111111110011111001100100111011100100001000011011101100111110011001010010100010001101111100101001110010100000011110", + "110100100001011011100110010011010101011111000001001110110011011101010010011000011110010000100110001010001011010000100100011000101011100110101010001100000110101101111110000000011", + "001001001011011111110010000010011110110111111001110001110010011111010100100111011110100100011111000011010100010101111100100000010011011110001000110100111110010101000111011000100", + "110010110010111001101110000101111000101000111100001000001000111101000000110101100101110010111111111001010000100001110010001110010101010010011010010010010010010011001010110010001", + "011100000100001100000001100111101001001110011111000100010011110001001000101000111011111000001000011011101101101011010001000101111100110011100001011000100100100100100010110011010", + "010001101100001010010011111110100000110010101100100011011110110000111111110100110001010100001111101001111110111101001001110101000110001010100001100000010100111110010011101011101", + "010110010101101100110001011001000101101100100010101010101001000100001111111101111011101111111111111110001111001110100111111011001000000100110111101110011010100000011100000101100", + "001010110111111011000000110011001110011110001010111110111110001011110110000010011100010100011100001111100110010111000100111000100011100101001010100101111001001011111100000000100", + "111000000100111101101100001010010100100011110010101001111110011100100101000100001111111100001111100010000000000110111100101000010001011111001010110100111110010101001111011000101", + "000001101111101101000000100101110011101001110111111000000101101011100100101110110000100110000000101100100101100110010010101110011101010000011100111010110000011011001000110110101", + "100111010110110010001111101111110011011010010100011100011111110010111001001010100011001001111010101110111001111000010001001101111110110011100101011001010011111000101010110101001", + "101000101001100010111101011110100011110011100111010011010011100110011011101110110110101001111100100010001011111010101001010101001110001001000001001001001001001000010001101001010", + "101000010010111010100111010001001111111000101001110010100101000111111110011110001101001110100110101101011011011101100111110011001010000101010111101110010010010010010100000101100", + "111110101001100111101110010011000101011111000001001110110011011101010010011001011100111001111010000100010011010000100100011000101011100111000100001101111001010011111110000110000", + "001101011110110111100010000010011110110111111001110001110010011111010100100110100000110100100100100101010100010101111100100000010011011111100100110101000001101011000111011110111", + "111110100001001101100110000101111000101000111100001000001000111101000000110100101010100010101010111001010000100001110010001110010101010011100100010011001111100101001010110110010", + "010100001001010000010001100111111001001110011111000100010011110001001000101001100010010001100010001111101101101011010001000101111100110010111111011001010011111000100010110100100", + "111001110100110111000011111110101000110010101100100011011110110000111111110101101011111101011011110111111110111101001001110101000110001011010111100001101011000000010011101101010", + "000100000000000100111001011001000101101100100010101010101001000100001111111100010101111111001100011000001111001110100111111011001000000101010011101111100101001110011100000010011", + "010101100100001110110000110011111110011110001010111110111111101011110110000011011011111110010001001111100110010111111100111000100011100100101111100100100100100101111100111110111", + "000000001001100001011100001110001100100011110010101001111000111100100101000101010110100011111101110110000000000110001100101000010001011110011000110101001001001011001110100010111", + "111111101111010001111000100010101011101001110111111000001010101011100100101111101011101011001100110010100101100110101010101110011101010001111010111011001111100111001000101010110", + "100000100011011011001111101010001011011010010100011100001000110010111001001011001100100011101001001000111001111010001001001101111110110010001000111000101100000100101010100011010", + "101110100010010110011101011111111011110011100111010011011111100110011011101110010001111111010001100010001011111111111001010101001110001000101111101000010100111010010001111111001", + "101110101111100111100111010111111111111000101001110010111000100111111110011111110100110011010100111001011011011001110111110011001010000100010010001111100101001110010101010010010", + "101110101001011011001110010011111101011111000001001110111011111101010010011001000111111001110110011010010011010101010100011000101011100110111001001100000110101101111110110011100", + "100000100011011111100010000100101110110111111001110001110110111111010100100110001110010100010111000001010100010111001100100000010011011110000001110100111110010101000110001011001", + "111111100010111000000110000101000000101000111100001000011001011101000000110101001101001110000111111010010000100100100010001110010101010110001111110010010010010011001010000101000" + ], + "3": [ + "111111100000101010011011000101011110101000000100000110010011000100010010010110110010001010110101111111001101111111100101010101100101010100111010000001010100100001000110001111111", + "100000101111010010110101101001010100101111101110000101111000110001011111100001111101101110111010101111010101001111011111110101011111110101000000111001101100111001110110101000001", + "101110101011111101001001010011101100101010011011100011011100011110000001110001011100101011001100110110000100001011010001111011010001111011001100010111100010110111111110001011101", + "101110100101100000100011000101000001110110101011100101101011000000010111001001100010011111100110010101100111001010110010111100110010111100110111010100100001010100111001101011101", + "101110100101011001001110101011111100000101101100101001111111101010000111111011011010111111011011101101011111110011111000101110001000101110001111101101001110001100101100001011101", + "100000100100001001100110110010001001110100110100010110111000101111010100111010100001100011100001100011010011110110001100110000000100110001111000100011001000000010101010101000001", + "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111", + "000000000000100110110010001010001110010001000100111010011000100000001010101010000010100010010101110000101000010110001010111110001010111111111000101101000110001100100111000000000", + "011101100011001001111101110011111010100000011000011011011111110101011001111111010001111111010100011100101110011111111100010110000100010111111111100010101010000010001011000000110", + "110110011000101010011011000100111110101000000100000110001011000100010010010110110011101010110001111111001101111101100101010101100101010100100010000001010100100001000100100001010", + "001000100111010010110101101100110100100111101110000101100000110001011111100001111100101110111100101111010101001111011111110101011111110101001000111001101100111001110101011001101", + "010011011011111101001001010001110100111010011011100011000100011010000001110001011100101011001010110110000100001001010001111011010001111011001100010111100010110111111011101011100", + "100011110101100000100011000011011001101110101011100101110011000010010111001001100010011111100000010101100111001010110011111100110010111100101111010100100001010100111000001010100", + "011011010101011001001110101100110100011101101100101001100110101000000111111011011011100111011001101101011111110000001001001110001000101110010111101100101110001100101110110011001", + "010011111100001001100110110100001001101100110100010110111011101111010100111010100000110101100101100011010011110100000101010000000100110001100011100010101000000010101001010101001", + "100101001101001011011111100001011011110100101001010111110010101101100111000111101111011101111100011101000101111111100110110011100111010010000010100001001011100001001010100000101", + "001110111000010010100110101010101001111011000011000000011110101110000010100100001011010010001101000111110101000111011111001101011111001100111010111001010001011001010000011000010", + "000000001110011100101101110100001000011110110010110000111101110010100100100000000101111100000011001001111011001011010011100011010011100010010100110111100010010111110010010111100", + "100101101010111111011000000111011001001010000011101000001101011100110010001100010000000011010011000010111000100010110010011000110010011000110101010100000001010100011000110100000", + "001000000000100110010010001010101111100001000000111000011111000001011010101010000110110000010001101101011111010010001010100000001010100000001111001100111001101100100000110000111", + "010101100011010110010101110111101111011000011101010011000101110100100111111111010100001001010110100011010001111100000101001010000100001010000001100010010111100010001110111100010", + "110110011000110100100011000011011001110000000001000100001011000101101000010110110111000010110100000000110010011101100100100011100101000011100010000001000011100001000011011110100", + "001000100111011010111101101111010010110111101111001101100000110100001011100001111011101110111110111000001000101111011110001010111111101010111000111001110011011001110010001110010", + "010011011011111101101001010111101101000010011111100001000100011011010011110001011001111011001010101011110011001001010000000100110001100100110010010111111101010111111100010110011", + "100011110101100111001011000110000100010110101110101101110011000011101101001001100110100111100000101010011000101010110010100001010010100001010001010100111100110100111101110101111", + "011011010101011111110110101110110011000101101001101111100110101001111111111011011110111111011000010010100000010000001000111001001000111001001001101100111001001100100001001100111", + "010011111100000001101110110001101111111100110101011100111011101010000110111010100110101101100101110100001110010100000100101110000100101110000111100010110111100010100110000010110", + "100101001101000011111111100111000010001100101101010001110010101100110011000111101011011101111100000000110011111111100111001101100111001101100010100001010100000001000101011101010", + "001111111000001101001110101111111100000011000110001010011111101111111100100100001111111110001101111000001011000111111110010001011111010001011111111001001100111001000101111111001", + "000010001110011010010101110010001111000110110111110100111000110011011110100000000000100010000010110110000101001110001010010101010011110101011000110111110101010111110101100010010", + "110110101010110111010000000010101111011010000010100010001010111001100110001100010111101011010011010101100100100110101011100111010010000111001010110100011110110100011111101011111", + "101010001000101110110010001110001110011001000100111100011000100000001000101010000010100010010001110001001000010010001011011111101010111111101000101100100110001100100110100011000", + "110111111011010001111101110111111010100000011000011001011111110101011011111111010000111111010110011101001110011111111100010111100100010111101111100010001010000010001011111111001", + "000111010000101010011011000010111110101000000100000010011011000100010010010110110011000110110101111110101101111000110101010100100101010100100111000001010100111001010100101011010", + "101011110111011010110101101000110100100111101100000111100110110001011101100011111100001110111110101110010101001110001111110101011111110101000111111001101100100001101101110011101", + "100011011011110101001001010100101100111010011011100111010011111010000101110101011100110101001010110110000101001110000001111011010001111011010011110111100010101111100010010101100", + "110001101101100000101011000001011001101110101111100111110010100010010001001101100011101101100000010101100110101111100011111100110010111100101100110100100001000100100000100000100", + "111010011101000001000110101101001100011101101000101111110110101000000101111011011010101011011001101101011110010101011001001110001000101110001100101100101110001100101111111001001", + "000000101100000001111110110101101001101100110000010100111101101111010000111010100001000101100101100011010010010101010101010001100100110001111010100010101000000010101001010111001", + "000101001101000011001111100110011011110100101001010001100101001101100101000001101110011011111100011100100101111000110110110010000111010010000001000001001011100001001011010100101", + "101100100000001010100110101110101001111011000001000010011111001110000000100000001010010000001101000110010101000010001111001100111111001100100111011001010001011001010000110000010", + "110001000110011100111101110100001000011110110010110100101101110010100100100110000101110000000011001000011011001110000011100010010011100010010001110111100010001111100010011101110", + "000110111010110111001000000101011001001010000111101010001011011100110000001100010001100011010011000011111000100011100010011000110010000000101010010100000001001100000000011110011", + "111000000000101110000010001111110111100001000100111100001000100001011110101110000111101110010001101101011110010101011010100000001010111000001000101100111001110100111001001110100", + "000111111011010110011101110111101111011000011011010001000100010100100111111110010101011011010110100011010000011001010101001010000101010010011010000010010111110010010110010110001", + "010111010000101100101011000000100001110000011101000010011011000101101000010000010111000110110100000000110011111000110100100011100100110011100001000001000011100001000010010100100", + "011011110111011010100101101110110010110111100011001111100110110100001011100001011010011110111110111000001001001110001110001010111110001010100001111001110011011001110010001100010", + "110011011011110101111101010000101101000010010111100111010011111011010011110111111000101101001010101010010011001110000000000100110000000100110111110111111101010111111101100010011", + "000001101101100111001011000011000100010110110100101111110010100011101101001101000111111101100000101011111000101111100010100001010010100001001010110100111100110100111101011101111", + "101010011101000111100010101111010011000101101001101111110110101001111111111100011110101011011000010011000000010101011000111001001000111001001010101100111001010100111001000110101", + "110000101100000001111010110011101111111100111001011100111101101010000110111011000111010101100101110101001110010101010100101110000100110110011100100010110111111010110110101000101", + "010101001101000011101001100010011010001100101001010001100101001100110011000011101010000011111100000100110011111000110111001101100111010101100101000001010100011001010100100011001", + "011110100000001101000100101100110100000011010000001010011111001111111100100100101110000000001101111110001011000010001110010001011110001001000001011001001100101001001101001101010", + "100010000110011010011001110110010111000110101011110100101101110011011110100111000001110000000010110000000101001110000010010101010010000101010111110111110100010111110010100010010", + "110101111010110111001000000011011111011010011110100010001011011001100110001101110111110011010011010011100100100011100011100111010011100111001100010100011111010100011011100001111", + "101000000000101110100110001011110110011001010100111100001000100000001000101100000011110110010001110101001000010101011011011111101011011111101100101100100111101100100100111001000", + "110111111011110001111101110111111010100000010010011001001111110101011011111011110001111111010110011011001110011011111100010111100100010111111111100010001011100010001001111111001", + "000110001000101010001111000010001110101000000100000010001000100100010010010001110010100010110101111000101101111010001101010100100101010100111000100001010100111001010101100011000", + "101010101110011010100001101110101100100111100010000111011010110001011101100000011100101010111110101000010101001110101111110101011111101101001010111001101100100001101101101011110", + "100010001011010101011111010110001100111010011111100111101000111010000101110101011101100011001010110010000101010010001001111011010001100011011000110111100010101111100010100011111", + "110011111101000000101001000111111001101110111101100110001111100010010001001001000011111111100000010011100110110011111011111100110011100100101111110100100001000100100000111110111", + "111010000101100001000010101010101100011101110000101111011111001000000101111100011011010001011001101011011110001110001001001110001001011110011111001100101111001100101000010001001", + "000001100100000001111110110100001001101100101000010100011101001111010000111011000001110001100101100101010010000010000101010001100101010001110001100010101001100010101110011101001", + "000101011100000011001011100111011011110100111001010001101011101101101101000001101110000010111100011000100101111011100110110010000110110010010010000001001010000001001100111110101", + "101110100000001010100110101011110001111011001001000010011001001110001000100000101010101111101101000000010101000011011111001000111111001100101000111001010000111001010100101110010", + "110001011110011100111001110111101010011110110010110100100100110010110100100111000100011010100011001110011011001101010011100100010011100010000010001111100010001111100010110111110", + "000100110011010111001100000010100101001010001111101010101011111100100000001101110001000111010011000101111000100100110010011110110010000000100001001100000001001100000001010100011", + "111000010000001110000100001110110111100001000100111100100111000001000110101110000111111111110001101001011110001110001010100110001010111000011001110100111001110100111000001100100", + "000111111011110110011111110110101111011000001011010000100011110100110111111111110101101101010110100101010000000000000101001010000101010010010111110010010111110010010110000010001", + "010111001000001100101111000111000101110000011101000010110010000101100000010001110110111101110100000110110011100011100100100011100100110011110010100001000010100001000101111100100", + "011010111111011010100101101111010100110111110011001111000111010100001011100000011010101010111110111110001001011001011110001010111110001010101010111001110010111001110101000110010", + "110011001010110101111101010001101011000010001111100111011100011011011011110111011000110100011010101110010011001101010000000100110000000100100100110111111100110111111010001000011", + "000011101101100111001011000110011100010110100100101111110100000011100101001101000111000010010000101101111000101110100010100101010010100001000101010100111101010100111001000011111", + "101010000101000111100010101100110001100101101001101111111110101001101111111100011111000001100000010101000000010110010000111111001000111001011001010000111001010100111001101100101", + "110010100101100001111010110100010111111100111001011100011101001010010110111011000111110001111101110011001110010010011100110000000100110110010111111010110111111010110111100010101", + "010101011101100011101001100011011101101100101001010001001010101100101011000011101010010010010100000100110011100011111111010011100111010101110100011001010100011001010101100001001", + "011100100000101101000100101101110000000011010000001011111000101110001100100100101110110110010101111110001011011011011110001001011110001001001100101001001100101001001101011001010", + "100001011110111010011001110001110010100110101011110100000100110010110110100111000000001011000010110000000101010101010010000101010010000101000100010111110100010111110011001010010", + "110111110000110111001000000010111001011010011110100010101010111000000110001101110111000111000011010011100100110100110011100111010011100111000111010100011111010100011000101011111", + "101000010101101110100110001010110000011001010100111100000111000000100000101100000011101111001001110101001000010110001011011111101011011111111111101100100111101100100001010011000", + "110101111001010001111101110000101011000000010010011001000010110100110011111011110001110100111110011011001110011000010100010011100100010111110011100010001011100010001111110101001", + "000111001100101010001111000001011100001000000100000010010011000100100010010001110010101100000101111000101101111011111101010010100101010100110100111101010100111001010100000001000", + "101001111000111010100001101111001100100111100010000111000110010001001101100000011100101010100110101000010101001001000111101011011111101101001100100111101100100001101100111001110", + "100011001001010101011111010101101011011010011111100111111100011011011101110101011100100100100010110010000101010101001001100101010001100011000010101001100010101111100011010111111", + "110011111111000000101001000011111101101110111101100110011111100010000001001001000011111111111000010011100110110111111011100100110011100100101111100010100001000100100000111110111", + "111010001101100001000010101010001001111101110000101111001000101001001101111100011010100010011001101011011110001110001001011110001001011110001000101100101111001100101001100011001", + "000010101110000001111110110010101111101100101000010100001010101110010000111011000000101011110101100101010010000110101101010001100101010001101010100010101001100010101111101011001", + "000110001000000011001011100010001101110100111001010001101000101101101101000001101110100010100100011000100101111010001110110010000110110010001000100001001000000001001100100010101", + "101111111010001010100110101111111000011011001001000010011111101111101000100000101010111111100101001000010101000011111111001000111111001100101111111001010010111001010101111110010", + "110011011010011100111001010110101010111111010010110100110011110010010100100111000101001100110011001110011011001000000011100100010011100010011111101011100010001111100010000011110", + "000111101101010111001100100001000001001011101111101010101010011100100000001101110001011101001011011101111000100001100010000110110010000000100010101010000001001100000000011000011", + "111010011010001110000101001111010000000000000100111100110111000000000110101110000110001011111001110001011110001111011010111110001010111000000010110010111001110100111000000000100", + "000111101001110110011111110001101011011000101011010000110100010100110111111111110100110101001110101101010000000111010101010010000101010010010100110100010111110010010111101110001", + "010111001000001100101111100010011100010000111101000010101100000100100000010001110111100011110100011110110011100110100100110011100100110011101101000001000100100001000101000100100", + "011010100101011010100100001110110100110110010011001111001110110101001011100000000010100000101110101110001001011100010110001010111110001010101001011001110100111001110101011100010", + "110010000110110101111101110010010011000010101111100111010101011011011011110111000001010000010010101110010011001100011000000100110000000100111111110111111010110111111010101010011", + "000001111111100111001011100011011101110110000100101111111010100010000101001101000110010010001000111101111000101011111010100101010010100101000100010100111001010100111000110001111", + "101000000001000111100011101101110001100100001001101111100000101001001111111100011110010111101000010101000000010001011000111111001000111111000100110000111001010100111001010000101", + "110001111011100001111010010111110111111101011001011100001100101010010110111011011111101011111101110011001110010001010100110000000100110000010100011100110111111010110110101110101", + "010111010111100011101000000010111101101101101001010001011010101101101011000011110011100110010100011100110011100100110111010011100111010011101111011111010100011001010101101101001", + "011100110010101101000100101010110000000011110000001011101111001111101100110100101111101110010101110110001011011000001110001001011110001001001111101111001100101001001100110101010", + "100001011110111010011001010100101010100110001011110100011010110010010110100111000001010101000010101000000101010000010010000101010010000101011011110111110010010111110011010010010", + "110111101000110110101001100011011001011011111110100010100011011000100110000101101111001101000011000011100100110001111011100111010101100111000100110100011001010100011000011001111", + "101001011101101110100110101001001000011001110100111100001110000000000000101100011010001011001001110101001000010111000011011111101101011111100100101100100001101100100000000001000", + "110111101001010001111101010101101011000000110010011001001100010100110011100011110000100100111110001011001110011101001100010011100010010011110010100010001111100010001111101111001", + "000101001100101011101110000000011100001001100100100010001011000100100010011001110011111010000101111000101101111100110101010010100001010010101001011101010100111111010101100101000", + "101010100000111010100001001100101100100110000010100111010101110001001101101000000100110000100110101000010101001010001111101011011111101011001111000111101100100101101101110101110", + "100001000001010101111110110100001011011011011110100111101000011011011101110101000101010000100010101010010101010011100001100101010001100101011001101001100010101111100011011011111", + "110001111111000001001001000111011101101110011101100110000100100010000001011001000010000011111000011011111110110100000011100100110011100100100010000010100001000100100001011000111", + "111010000101100000100010001111110001111101010001001111000101101001001101111100011010001110011001110011000110001010101001011110001001011110000000101100101001001100101000001001001", + "000001111110000001111111010101101111101101001001110100010011101110010000110011011001111011110101110101001010000110001101010001100011010001110010000010101111100010101110101111001", + "000100010000000011001011000100100101110100011000010001100001101101101101000001110111100110100100011000100011111010101110110010000000110010001001000001001100000001001101101100101", + "101111111010001010100110001111111000011011101000000010011111101111101000111000101011111111100101010000010011000111111111001000111001001000101111111001010100111001010100111110010", + "110010001010011101111000110110001010111111010010001100101000110010010100101111000101100010110011001110011101001110001011100100010111100100011000101011100010001010000011100010010", + "000110101101010111001100100010101001001011101111000010101010111100100000100101101001101011001011000101111100100110101010000110110010000110101010101010000001001011100001101010111", + "111010001010001110100101101010001000000000000101101100111000100000000110001110011111100011111001110001001110001010001010111110001010111110011000110010111001110011011001100011000", + "000111111001110101111111110111111011011000101011000000101111110100110111001111110101111111001110101101001000000011111101010010000101010010011111110100010111110101010110111110001", + "010101011000001011001111100111011100010000111100110010111010100100100001110001110111010011110100011110101011100001111100110011100100110011100100000001000100100001000101011000100", + "011000100101011110100100001101110100110110010010100111011110110101001011001000000011010110101110101110010001011001011110001010111000001010111100111001110100111001110101101000010", + "110001011110110101111101110101110011000010101110101111010110111011011010010111000001101010010010101110010101001011010000000100110110000100110100010111111010110111111011101110011", + "001011110111100011001011100010111101110110000101100111110110100010000101010101000110000110001000111101111110101011010010100101010100100101010111010100111001010100111000101101111", + "101100010001000110100011101100110001100100001001011111101001001001001110010100011110101111101000010101000110010011101000111111001100111111001111110000111001010001011000110101001", + "111101111011100101111010010000101111111101011001111100011110101010010110010011011110010101111101110011001010010101110100110000000100110001100011111100110111111101010110110011001", + "011011010111100011001000000011011101101101101000011001010101001101101010100011110011001100010100011100100011100000111111010011100111010010000100111111010100011110110101011000101", + "010101100010101110100100101011001000000011110000001011110100001111101100010100101011101010010101110110010011011001000110001001001110001000111100101111001100101110001101000000010", + "100111000110111101111001010001101010100000001010000100001100010010010111100111000011100101000010101000011101010111001010000101001010000100010010110111110010010111110011101110010", + "111001100000110011001001101000011001011011111111001010110011011000100110100101101110111011000011000011111100110100110011100111001101100111010001010100011001010100011000000101111", + "100110011101101110100110101110101000011001110101110100001101100000000001001100011100110001001001110101001110010000001011011111110101011111101111001100100001101100100000110101000", + "110101111001010101111101011100001011000010110011010001000000010100110011100011110110110000111110001011001000011101100100010011100010010011100001100010001111100010001110011011001", + "000001001100101011001110010001011100001111100100110010000100100100100011111001110101000010000101111000101011111110000101010010100001010010100010011101010100111100110101011000100", + "101010101000111110100001010011110100100010000010100111000101110001001101001000000101001110100110101000010001001110101111101011011111101010111000100111101100100110001101101000010", + "101101010001010101111110100101101011011111011110101111100011111011011100010101000001111010100010001010010101010110001001100101010001100100110010001001100010101000000011101110011", + "111000101111000011001001010110100101101100011101100110011001111010000001111001000000000111111001011011111110110100101011100100100011100101010001000010100001000011100000101101111", + "111100011101100110100010010010110001111011010001011111010111000001001100111100011000111110011000110011000110001100010001011110010001011111001001101100111001001100101000110101001", + "001111100110000101111111011110101111101111001001111100000101110110010000010011011110001101110101110101001010000010000011010001111011010001100111100010110111100010101110110011001", + "001011010000000011001011000011000101110000011000011001100000000101101100100001110111011100100100111000100011111101100000110010011000110010000010100001010100000001001101011000101", + "101110100010001110100110000111010000011101101000001010011011000111101000111000101101101011100100110000010011000110111001001000111001001000111010111001001100111001010101000000010", + "110111011010011101111000100111101010111001010010000100110010001010010101001111000011110100110011101110011101001000110111100100010111100100010100101011100010001010000011101110010", + "000111100101010011001100111110011001001111101111001010101000000100100000100101101000100011001011000101111100100011000010000110110010000111010101001010000001001011100000000101111", + "110110001010001110100101111110110000000100000101110100111000111000000111001110011010100001111001010001001110001101010010111110001010111111101001010010111001110011011000110101000", + "001111111001110101111111100011111011011010101011010000101111101100110111001111110110111111001111101101001000000011111101010010010101010011101111110100010111110101010110111111001", + "010010001000001011001111111010001100010110111100110010111000101100100001010001110101100011110101011110101011100110001100110011111100110010101000100001010100100001000100100010100", + "010110101101011110100100000010101100110100010010100111011010101101001011001000000100101010101110101110010001011110101000001010100000001010101010111001101100111001110100101010010", + "111110001110110101111101110110001011000110101110101111001000110011011010010111000001100010010000001110010101001010001110000100101110000100111000110111100010110111111011100010011", + "000011111111100011001011101011111101110000000101100111111111101100000101010101000000111110001101011101111110101111111101100101010100100101011111110100100001010100111000111111111", + "101101000001000110100011111011001001110010001001011111101100010011001110010100011001101011101010110101000110010001000101011111001100111111001100110001011001010001011000100001001", + "110011100011100101111010001101101111100001011001111100011100010110010110010011011111000111111011110011001010010001001101010000000100110001111010111101010111111101010111001111001", + "011001010111100011001000010010011101101001101000011001000011010101101010100011110111011110010100111100100011100000110110110011100111010010000001011110110100011110110100000100101", + "010110111010101110100100111000101000001001110000001011101101110001101100010100101100010000010100110110010011011110001110001001001110001000100111001110001100101110001100010100010", + "100101011110111101111001001100010010100000001010000100001000011000010111100111000010110111000101101000011101010101100010000101001010000100010001110111100010010111110011111010010", + "111001101000110011001001101001010001010001111111001010101100100000100110100101101001100011000001000011111100110100000101100111001101100111001010010100000001010100011001111001111", + "100110001101101110100110101101101000010101110101110100010101101000000001001100011010101101001011010101001110010010101101011111110101011111101000101100111001101100100001101001000", + "110101110001010101111101011101110011011110110011010001001011111010110011100011110111011110111011101011001000011010001011010011100010010011111010000010010111100010001111001111001", + "000000001100101011001110010110100100010111100100110010000001111110100011111001110100000110000111011000101011111100101000110010100001010010100001011100110100111100110101001100100", + "101000111000111110100001010110111100111010000010100111000111001101001101001000000100011110100000101000010001001010010110001010111111101010100001100110001100100110001100010100010", + "101111000001010101111110100100110011001111011110101111110101100011011100010101000001101000100010001010010101010110000000000100110001100100110111101000000010101000000010110010011", + "111011110111000011001001010101000101101100011101100110000000011100000111111001000001111111111001011011111110110011100011100101000011100101001011100011100001000011100001111001111", + "111110000101100110100010010111001001111011010001011101010011000011001110111100011001101000011110110011000110001110111001011111010001011111001011001100111001001100101000100001001", + "001111111110000101111111011111100111100111001001111110011010010110010100010011011111010101110111110101001010000010110011010001111011010001111101000010110111100010101111001111001", + "001011000000011011001011000000000101111000011000011111111000000101101010100001110111000000100110111000100011111111000000110010011000110010000100100001010100000001001100000100101", + "101110101010001110100110000110101000000101101000001010010000100001101000111000101100000101100000110000010011000001010000001000111001001000100001011001001100111001010100010100010", + "110110011010000101111000100000010010100001010010000110110111001000010011001111000011010000110001101110011101001010011110000100010111100100010111101010000010001010000011111010010", + "000101110101001011001100111001010001010111101111001000101010100000100110100101101000110011001101000101111100100111111011100111010010000111001100001011100001001011100001111001111", + "110100011010001110100101111111101000010100000101110000101110111000000001001110011011110011111001010001001110001101011011011111101010111111101100110011011001110011011001101001000", + "001101100001111101111111100111110011011010101011010010110110101010110011001111110111001001001111101101001000000101010101010011110101010011111101010101010111110101010111001111001", + "010011001000011011001111111110100100010110111100110110111110101110100101010001110100000101110011011110101011100011010100110010111100110010100110100001010100111001010101001100100", + "111001100101011110100100000100111100111100010010100111000001001101001011001000000100101110101100101110010001011001101000001010100000001010100110011001101100100001101100010100010", + "000100010110101101111101110100110011001110101110101011001110110011011010010111000001110110010000001110010100001001110110000100101110000100110010010111100010100111100010110010011", + "010101100111100011011011101011111101101000000101100111111111101100000101010101000000111110001101011101111111001111111101100101010100100101001111110100100001001100100001111111111", + "000000001001011110101011111010001001111010001001011101111000110011001000010100011001100011101010110101000111110010001101011111001100111111011000110001011001010001011001100011001", + "111111100011111101110010001010101111100001011101111110011010110110010000010011011110101011111011110011001011110010101101010001100100110001111010111101010111111101010111101011001", + "100000101111100011011000010010001101111001101010011101001000110101101100100011110110100010010100111101000011100110001110110010000111010010001000111110110100011110110101100010101", + "101110100010100110100100111111111000000001110110001001101111110001101000010100101100111110010100110111110011011011111110001000101110001000101111101110001100101110001100111110010", + "101110101110101101100001001001110010100000001100000000000011111000010011100111000010011111000101101001111101010100001010000100001010000100010010010111100010001111100010001110010", + "101110101000110011010001101010100001010001111111001010100001100000100110100001101000100111000001000010111100110110101101100111001101100111011001010100000001001100000001001101100", + "100000101101110110101110101000111000010101110011110000000111001000000001001100011011011111001011010101001111010110010101011111110101011111100001101100111001110100111001110101001", + "111111100001010101111101011100110011011110110011010001000101111010110011100111110111101000111011101011001001111110000011010011100011010011101111100010010111110010010111110011000" + ] + } +} +''') + as Map; diff --git a/qr_dart/test/qr_code_test_data_with_mask.dart b/qr_dart/test/qr_code_test_data_with_mask.dart new file mode 100644 index 0000000..117c64d --- /dev/null +++ b/qr_dart/test/qr_code_test_data_with_mask.dart @@ -0,0 +1,194 @@ +import 'dart:convert'; + +// QR Code Test Data for text 'shanna!' for all seven masks. +// (version 1, low error correction) +final qrCodeTestDataWithMask = + jsonDecode(r''' +{ + "0": [ + "111111100101101111111", + "100000100111001000001", + "101110101101101011101", + "101110100101001011101", + "101110100010101011101", + "100000100000101000001", + "111111101010101111111", + "000000001101100000000", + "111011111111011000100", + "001110001010001101111", + "101101110000100010111", + "100110000110001000001", + "101100111110101010001", + "000000001011010111001", + "111111101111011011111", + "100000101101110000001", + "101110101001011010011", + "101110100010001110110", + "101110101100100110001", + "100000101100001110010", + "111111101000101100011" + ], + "1": [ + "111111101000101111111", + "100000101010001000001", + "101110100000101011101", + "101110100000001011101", + "101110101111101011101", + "100000101101101000001", + "111111101010101111111", + "000000001000100000000", + "111001101010011110011", + "011011011111011000101", + "111000100101110111101", + "110011010011011101011", + "111001101011111111011", + "000000001110000010011", + "111111100010001110101", + "100000101000100101011", + "101110100100001111001", + "101110100111011011100", + "101110101001110011011", + "100000101001011011000", + "111111101101111001001" + ], + "2": [ + "111111100011101111111", + "100000101110101000001", + "101110100011101011101", + "101110101100101011101", + "101110100100101011101", + "100000101001001000001", + "111111101010101111111", + "000000000100000000000", + "111110111001010101010", + "111111011011111100001", + "100011111110101100110", + "010111010111111001111", + "100010110000100100000", + "000000001010100110111", + "111111101001010101110", + "100000100100000001111", + "101110101111010100010", + "101110101011111111000", + "101110101010101000000", + "100000101101111111100", + "111111101110100010010" + ], + "3": [ + "111111101011101111111", + "100000100011001000001", + "101110101101001011101", + "101110101100101011101", + "101110101001001011101", + "100000100111101000001", + "111111101010101111111", + "000000000001100000000", + "111100101111110011101", + "111111011011111100001", + "001110110011000001011", + "100001000001001111001", + "100010110000100100000", + "000000001111001011010", + "111111100111100011000", + "100000100100000001111", + "101110100010111001111", + "101110101101001001110", + "101110101010101000000", + "100000101000010010001", + "111111101000010100100" + ], + "4": [ + "111111101111101111111", + "100000101010101000001", + "101110101000001011101", + "101110101111001011101", + "101110100000101011101", + "100000101101001000001", + "111111101010101111111", + "000000000111100000000", + "110011100101000101111", + "100011000111100000010", + "000000111101001111010", + "110100010100011010011", + "111110101100111000011", + "000000001110111010100", + "111111100010110110010", + "100000101111100010011", + "101110101011001000001", + "101110100111100011011", + "101110100001001011100", + "100000101110011100000", + "111111101010111110001" + ], + "5": [ + "111111100000101111111", + "100000100010101000001", + "101110100011101011101", + "101110101010101011101", + "101110101100101011101", + "100000100101001000001", + "111111101010101111111", + "000000000000000000000", + "110001110001000011000", + "110001010101110010000", + "100011111110101100110", + "010011010011111101111", + "111001101011111111011", + "000000001110100010111", + "111111101001010101110", + "100000101010001111110", + "101110100111010100010", + "101110100111111011000", + "101110100001110011011", + "100000101001111011100", + "111111101110100010010" + ], + "6": [ + "111111101000101111111", + "100000100010101000001", + "101110100001101011101", + "101110100010101011101", + "101110100101101011101", + "100000100110001000001", + "111111101010101111111", + "000000001000000000000", + "110110100011001000001", + "110001010101110010000", + "101010110111100101111", + "010000010000111110111", + "111001101011111111011", + "000000001110111010100", + "111111100011000111100", + "100000100010001111110", + "101110101110011101011", + "101110101100111000000", + "101110100001110011011", + "100000101001100011111", + "111111101100110000000" + ], + "7": [ + "111111100101101111111", + "100000101101001000001", + "101110101100101011101", + "101110100101001011101", + "101110101000101011101", + "100000101001101000001", + "111111101010101111111", + "000000001111100000000", + "110100110110001110110", + "001110001010001101111", + "111111100010110000101", + "101111001111000001000", + "101100111110101010001", + "000000001001000101011", + "111111101110010010110", + "100000100101110000001", + "101110100011001000001", + "101110101011000111111", + "101110100100100110001", + "100000101110011100000", + "111111101001100101010" + ] +} +''') + as Map; diff --git a/qr_dart/test/qr_numeric_test.dart b/qr_dart/test/qr_numeric_test.dart new file mode 100644 index 0000000..2d53439 --- /dev/null +++ b/qr_dart/test/qr_numeric_test.dart @@ -0,0 +1,115 @@ +import 'package:qr/qr.dart'; +import 'package:qr/src/byte.dart'; +import 'package:test/test.dart'; + +void main() { + test('all digits 1 through 0', () { + final qr = QrNumeric.fromString('1234567890'); + expect(qr.mode, 1); + expect(qr.length, 10); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 34); + expect( + buffer + .getRange(0, 10) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 123, + ); + expect( + buffer + .getRange(10, 20) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 456, + ); + expect( + buffer + .getRange(20, 30) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 789, + ); + expect( + buffer + .getRange(30, 34) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 0, + ); + }); + + test('single numeric', () { + final qr = QrNumeric.fromString('5'); + expect(qr.mode, 1); + expect(qr.length, 1); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 4); + expect( + buffer + .getRange(0, 4) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 5, + ); + }); + + test('double numeric', () { + final qr = QrNumeric.fromString('37'); + expect(qr.mode, 1); + expect(qr.length, 2); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 7, reason: 'n*3+1 = 7'); + expect( + buffer + .getRange(0, 7) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 37, + ); + }); + + test('triple (even) numeric', () { + final qr = QrNumeric.fromString('371'); + expect(qr.mode, 1); + expect(qr.length, 3); + final buffer = QrBitBuffer(); + qr.write(buffer); + expect(buffer.length, 10, reason: 'n*3+1 = 10'); + expect( + buffer + .getRange(0, 10) + .map((e) => e ? 1 : 0) + .fold( + 0, + (previousValue, element) => (previousValue << 1) | element, + ), + 371, + ); + }); + + test('throws on invalid input', () { + expect(() => QrNumeric.fromString('hello'), throwsArgumentError); + }); +} diff --git a/update.py b/update.py new file mode 100644 index 0000000..1b57be4 --- /dev/null +++ b/update.py @@ -0,0 +1,157 @@ +import yaml # pip install PyYAML +import os +import shutil +import subprocess + +# 1. Read the config file +with open("config.yaml", "r") as f: + config = yaml.safe_load(f) + + +config_lock = {} + +LOCK_FILE_NAME = "config.lock.yaml" + +if os.path.exists(LOCK_FILE_NAME): + with open(LOCK_FILE_NAME, "r") as f: + config_lock = yaml.safe_load(f) + +all_cloned_packages = list(config.keys()) + +for folder_name, data in config.items(): + if "dependencies" in data: + all_cloned_packages += list(data["dependencies"].keys()) + +def print_blue(text): + BLUE = '\x1b[34m' + RESET = '\x1b[0m' + print(f"{BLUE}{text}{RESET}") + +def get_git_head(repo_path='.'): + result = subprocess.run( + ['git', 'rev-parse', 'HEAD'], + cwd=repo_path, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=False + ) + if result.returncode != 0: + raise RuntimeError(f"git error: {result.stderr.strip()}") + return result.stdout.strip() + + + +def integrate_package(folder_name, data): + global config_lock + + repo_url = data['git'] + # Remove trailing slashes from keep list for easier comparison + keep_list = ["lib", "test", "LICENSE", "pubspec.yaml"] + if "keep" in data: + keep_list += [item.rstrip('/') for item in data['keep']] + + + print(f"Processing {folder_name}...") + + # Clone the repository + # We check if folder exists to avoid git errors, or remove it to start fresh + if os.path.exists(folder_name): + shutil.rmtree(folder_name) + + subprocess.run(["git", "clone", repo_url, folder_name], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + last_commit_hash = get_git_head(folder_name) + + if folder_name in config_lock: + if config_lock[folder_name] != last_commit_hash: + print_blue(f"{folder_name} has a new update!") + subprocess.run(["git", "checkout", config_lock[folder_name]], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=folder_name) + else: + config_lock[folder_name] = last_commit_hash + + + # 3. Clean up files (Remove all except 'keep') + for item in os.listdir(folder_name): + # We also usually want to remove the hidden .git folder unless explicitly kept + if item not in keep_list: + item_path = os.path.join(folder_name, item) + + if os.path.isdir(item_path): + shutil.rmtree(item_path) # Delete directory + else: + os.remove(item_path) # Delete file + + # 4. Find and replace in .dart files + + # replacing = [ + # ("import '/", f"import 'package:twonly/src/packages/{folder_name}/lib/"), + # ("export '/", f"export 'package:twonly/src/packages/{folder_name}/lib/"), + # ] + + # for package_name in all_cloned_packages: + # replacing.append( + # (f"import 'package:{package_name}/", f"import 'package:twonly/src/packages/{package_name}/lib/") + # ) + # replacing.append( + # (f"export 'package:{package_name}/", f"export 'package:twonly/src/packages/{package_name}/lib/") + # ) + + + # print(f"Updating imports in .dart files...") + + # os.walk allows us to go into subdirectories recursively + # for root, dirs, files in os.walk(folder_name): + # for file in files: + # if file.endswith(".dart"): + # file_path = os.path.join(root, file) + + # try: + # with open(file_path, "r", encoding="utf-8") as f: + # content = f.read() + + # for search_text, replace_text in replacing: + + # content = content.replace(search_text, replace_text) + # content = content.replace(search_text.replace("'", '"'), replace_text.replace("'", '"')) + + # if "replace" in data: + # replace = data['replace'] + # for values in replace: + # content = content.replace(values[0], values[1]) + + # with open(file_path, "w", encoding="utf-8") as f: + # f.write(content) + + # except Exception as e: + # print(f"Skipped {file_path}: {e}") + + # print(f"Done! Cleaned {folder_name}.") + +pubspec = { + "dependencies": {}, + "dependency_overrides": {}, +} + + +# 2. Iterate through each entry +for folder_name, data in config.items(): + + pubspec["dependencies"][folder_name] = {} + pubspec["dependencies"][folder_name]["path"] = f"./dependencies/{folder_name}" + # update = ["libsignal_protocol_dart"] + # if folder_name not in update: + # continue + integrate_package(folder_name, data) + if "dependencies" in data: + for folder_name, data in data["dependencies"].items(): + integrate_package(folder_name, data) + pubspec["dependency_overrides"][folder_name] = {} + pubspec["dependency_overrides"][folder_name]["path"] = f"./dependencies/{folder_name}" + + +with open(LOCK_FILE_NAME, "w") as f: + yaml.safe_dump(config_lock, f, sort_keys=True) + +with open("pubspec.yaml", "w") as f: + yaml.safe_dump(pubspec, f, sort_keys=True) \ No newline at end of file diff --git a/x25519/LICENSE b/x25519/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/x25519/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/x25519/lib/src/curve25519.dart b/x25519/lib/src/curve25519.dart new file mode 100644 index 0000000..d18fb24 --- /dev/null +++ b/x25519/lib/src/curve25519.dart @@ -0,0 +1,944 @@ +import 'package:adaptive_number/adaptive_number.dart'; +import 'package:x25519/src/numbers.dart'; + +class FieldElement { + late List innerList; + FieldElement() { + innerList = List.generate(10, (index) => Number.zero); + } + FieldElement.fromList(List list) { + innerList = list; + } + + Number operator [](int index) { + return innerList[index]; + } + + void operator []=(int index, Number value) { + innerList[index] = value; + } + + int get length => innerList.length; +} + +void fieldElementCopy( + FieldElement src, int srcPos, FieldElement dest, int destPos, int length) { + dest.innerList.setRange(destPos, length + destPos, src.innerList, srcPos); +} + +void fieldElementFullCopy(FieldElement src, FieldElement dest) { + fieldElementCopy(src, 0, dest, 0, dest.length); +} + +var zero = FieldElement(); + +void FeZero(FieldElement fe) { + fieldElementFullCopy(zero, fe); +} + +void FeOne(FieldElement fe) { + FeZero(fe); + fe[0] = Number.one; +} + +void FeAdd(FieldElement dst, FieldElement a, FieldElement b) { + dst[0] = a[0] + b[0]; + dst[1] = a[1] + b[1]; + dst[2] = a[2] + b[2]; + dst[3] = a[3] + b[3]; + dst[4] = a[4] + b[4]; + dst[5] = a[5] + b[5]; + dst[6] = a[6] + b[6]; + dst[7] = a[7] + b[7]; + dst[8] = a[8] + b[8]; + dst[9] = a[9] + b[9]; +} + +void FeSub(FieldElement dst, FieldElement a, FieldElement b) { + dst[0] = a[0] - b[0]; + dst[1] = a[1] - b[1]; + dst[2] = a[2] - b[2]; + dst[3] = a[3] - b[3]; + dst[4] = a[4] - b[4]; + dst[5] = a[5] - b[5]; + dst[6] = a[6] - b[6]; + dst[7] = a[7] - b[7]; + dst[8] = a[8] - b[8]; + dst[9] = a[9] - b[9]; +} + +void FeCopy(FieldElement dst, FieldElement src) { + fieldElementFullCopy(src, dst); +} + +// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0. +// +// Preconditions: b in {0,1}. +void feCSwap(FieldElement f, FieldElement g, Number b) { + b = -b; + for (var i = 0; i < f.length; i++) { + var t = b & (f[i] ^ g[i]); + f[i] ^= t; + g[i] ^= t; + } +} + +// load3 reads a 24-bit, little-endian value from in. +Number load3(List input) { + var r; + r = input[0]; + r |= input[1] << 8; + r |= input[2] << 16; + return Number(r); +} + +// load4 reads a 32-bit, little-endian value from in. +Number load4(List input) { + int r; + r = input[0]; + r |= input[1] << 8; + r |= input[2] << 16; + r |= input[3] << 24; + return Number(r); +} + +void feFromBytes(FieldElement dst, List src) { + var h0 = load4(src.sublist(0, src.length)); + var h1 = load3(src.sublist(4, src.length)) << 6; + var h2 = load3(src.sublist(7, src.length)) << 5; + var h3 = load3(src.sublist(10, src.length)) << 3; + var h4 = load3(src.sublist(13, src.length)) << 2; + var h5 = load4(src.sublist(16, src.length)); + var h6 = load3(src.sublist(20, src.length)) << 7; + var h7 = load3(src.sublist(23, src.length)) << 5; + var h8 = load3(src.sublist(26, src.length)) << 4; + var h9 = (load3(src.sublist(29, src.length)) & Numbers.v0x7fffff) << 2; + + var carry = List.filled(10, Number.zero); + carry[9] = (h9 + (Number.one << 24)) >> 25; + h0 += carry[9] * Numbers.v19; + h9 -= carry[9] << 25; + carry[1] = (h1 + (Number.one << 24)) >> 25; + h2 += carry[1]; + h1 -= carry[1] << 25; + carry[3] = (h3 + (Number.one << 24)) >> 25; + h4 += carry[3]; + h3 -= carry[3] << 25; + carry[5] = (h5 + (Number.one << 24)) >> 25; + h6 += carry[5]; + h5 -= carry[5] << 25; + carry[7] = (h7 + (Number.one << 24)) >> 25; + h8 += carry[7]; + h7 -= carry[7] << 25; + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; + carry[2] = (h2 + (Number.one << 25)) >> 26; + h3 += carry[2]; + h2 -= carry[2] << 26; + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; + carry[6] = (h6 + (Number.one << 25)) >> 26; + h7 += carry[6]; + h6 -= carry[6] << 26; + carry[8] = (h8 + (Number.one << 25)) >> 26; + h9 += carry[8]; + h8 -= carry[8] << 26; + + dst[0] = h0; + dst[1] = h1; + dst[2] = h2; + dst[3] = h3; + dst[4] = h4; + dst[5] = h5; + dst[6] = h6; + dst[7] = h7; + dst[8] = h8; + dst[9] = h9; +} + +/// FeToBytes marshals h to s. +/// Preconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +/// +/// Write p=2^255-19; q=floor(h/p). +/// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). +/// +/// Proof: +/// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. +/// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. +/// +/// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). +/// Then 0 s, FieldElement h) { + var carry = List.filled(10, Number.zero); + + var q = (Numbers.v19 * h[9] + (Number.one << 24)) >> 25; + q = (h[0] + q) >> 26; + q = (h[1] + q) >> 25; + q = (h[2] + q) >> 26; + q = (h[3] + q) >> 25; + q = (h[4] + q) >> 26; + q = (h[5] + q) >> 25; + q = (h[6] + q) >> 26; + q = (h[7] + q) >> 25; + q = (h[8] + q) >> 26; + q = (h[9] + q) >> 25; + + // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. + h[0] += Numbers.v19 * q; + // Goal: Output h-2^255 q, which is between 0 and 2^255-20. + + carry[0] = h[0] >> 26; + h[1] += carry[0]; + h[0] -= carry[0] << 26; + carry[1] = h[1] >> 25; + h[2] += carry[1]; + h[1] -= carry[1] << 25; + carry[2] = h[2] >> 26; + h[3] += carry[2]; + h[2] -= carry[2] << 26; + carry[3] = h[3] >> 25; + h[4] += carry[3]; + h[3] -= carry[3] << 25; + carry[4] = h[4] >> 26; + h[5] += carry[4]; + h[4] -= carry[4] << 26; + carry[5] = h[5] >> 25; + h[6] += carry[5]; + h[5] -= carry[5] << 25; + carry[6] = h[6] >> 26; + h[7] += carry[6]; + h[6] -= carry[6] << 26; + carry[7] = h[7] >> 25; + h[8] += carry[7]; + h[7] -= carry[7] << 25; + carry[8] = h[8] >> 26; + h[9] += carry[8]; + h[8] -= carry[8] << 26; + carry[9] = h[9] >> 25; + h[9] -= carry[9] << 25; + // h10 = carry9 + + // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; + // evidently 2^255 h10-2^255 q = 0. + // Goal: Output h[0]+...+2^230 h[9]. + + s[0] = (h[0] >> 0).intValue; + s[1] = (h[0] >> 8).intValue; + s[2] = (h[0] >> 16).intValue; + s[3] = ((h[0] >> 24) | (h[1] << 2)).intValue; + s[4] = (h[1] >> 6).intValue; + s[5] = (h[1] >> 14).intValue; + s[6] = ((h[1] >> 22) | (h[2] << 3)).intValue; + s[7] = (h[2] >> 5).intValue; + s[8] = (h[2] >> 13).intValue; + s[9] = ((h[2] >> 21) | (h[3] << 5)).intValue; + s[10] = (h[3] >> 3).intValue; + s[11] = (h[3] >> 11).intValue; + s[12] = ((h[3] >> 19) | (h[4] << 6)).intValue; + s[13] = (h[4] >> 2).intValue; + s[14] = (h[4] >> 10).intValue; + s[15] = (h[4] >> 18).intValue; + s[16] = (h[5] >> 0).intValue; + s[17] = (h[5] >> 8).intValue; + s[18] = (h[5] >> 16).intValue; + s[19] = ((h[5] >> 24) | (h[6] << 1)).intValue; + s[20] = (h[6] >> 7).intValue; + s[21] = (h[6] >> 15).intValue; + s[22] = ((h[6] >> 23) | (h[7] << 3)).intValue; + s[23] = (h[7] >> 5).intValue; + s[24] = (h[7] >> 13).intValue; + s[25] = ((h[7] >> 21) | (h[8] << 4)).intValue; + s[26] = (h[8] >> 4).intValue; + s[27] = (h[8] >> 12).intValue; + s[28] = ((h[8] >> 20) | (h[9] << 6)).intValue; + s[29] = (h[9] >> 2).intValue; + s[30] = (h[9] >> 10).intValue; + s[31] = (h[9] >> 18).intValue; +} + +/// feMul calculates h = f * g +/// Can overlap h with f or g. +/// +/// Preconditions: +/// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +/// +/// Notes on implementation strategy: +/// +/// Using schoolbook multiplication. +/// Karatsuba would save a little in some cost models. +/// +/// Most multiplications by 2 and 19 are 32-bit precomputations; +/// cheaper than 64-bit postcomputations. +/// +/// There is one remaining multiplication by 19 in the carry chain; +/// one *19 precomputation can be merged into this, +/// but the resulting data flow is considerably less clean. +/// +/// There are 12 carries below. +/// 10 of them are 2-way parallelizable and vectorizable. +/// Can get away with 11 carries, but then data flow is much deeper. +/// +/// With tighter constraints on inputs can squeeze carries into int32. +void feMul(FieldElement h, FieldElement f, FieldElement g) { + var f0 = f[0]; + var f1 = f[1]; + var f2 = f[2]; + var f3 = f[3]; + var f4 = f[4]; + var f5 = f[5]; + var f6 = f[6]; + var f7 = f[7]; + var f8 = f[8]; + var f9 = f[9]; + var g0 = g[0]; + var g1 = g[1]; + var g2 = g[2]; + var g3 = g[3]; + var g4 = g[4]; + var g5 = g[5]; + var g6 = g[6]; + var g7 = g[7]; + var g8 = g[8]; + var g9 = g[9]; + var g1_19 = Numbers.v19 * g[1]; /* 1.4*2^29 */ + var g2_19 = Numbers.v19 * g[2]; /* 1.4*2^30; still ok */ + var g3_19 = Numbers.v19 * g[3]; + var g4_19 = Numbers.v19 * g[4]; + var g5_19 = Numbers.v19 * g[5]; + var g6_19 = Numbers.v19 * g[6]; + var g7_19 = Numbers.v19 * g[7]; + var g8_19 = Numbers.v19 * g[8]; + var g9_19 = Numbers.v19 * g[9]; + var f1_2 = Number.two * f[1]; + var f3_2 = Number.two * f[3]; + var f5_2 = Number.two * f[5]; + var f7_2 = Number.two * f[7]; + var f9_2 = Number.two * f[9]; + var f0g0 = f0 * g0; + var f0g1 = f0 * g1; + var f0g2 = f0 * g2; + var f0g3 = f0 * g3; + var f0g4 = f0 * g4; + var f0g5 = f0 * g5; + var f0g6 = f0 * g6; + var f0g7 = f0 * g7; + var f0g8 = f0 * g8; + var f0g9 = f0 * g9; + var f1g0 = f1 * g0; + var f1g1_2 = f1_2 * g1; + var f1g2 = f1 * g2; + var f1g3_2 = f1_2 * g3; + var f1g4 = f1 * g4; + var f1g5_2 = f1_2 * g5; + var f1g6 = f1 * g6; + var f1g7_2 = f1_2 * g7; + var f1g8 = f1 * g8; + var f1g9_38 = f1_2 * g9_19; + var f2g0 = f2 * g0; + var f2g1 = f2 * g1; + var f2g2 = f2 * g2; + var f2g3 = f2 * g3; + var f2g4 = f2 * g4; + var f2g5 = f2 * g5; + var f2g6 = f2 * g6; + var f2g7 = f2 * g7; + var f2g8_19 = f2 * g8_19; + var f2g9_19 = f2 * g9_19; + var f3g0 = f3 * g0; + var f3g1_2 = f3_2 * g1; + var f3g2 = f3 * g2; + var f3g3_2 = f3_2 * g3; + var f3g4 = f3 * g4; + var f3g5_2 = f3_2 * g5; + var f3g6 = f3 * g6; + var f3g7_38 = f3_2 * g7_19; + var f3g8_19 = f3 * g8_19; + var f3g9_38 = f3_2 * g9_19; + var f4g0 = f4 * g0; + var f4g1 = f4 * g1; + var f4g2 = f4 * g2; + var f4g3 = f4 * g3; + var f4g4 = f4 * g4; + var f4g5 = f4 * g5; + var f4g6_19 = f4 * g6_19; + var f4g7_19 = f4 * g7_19; + var f4g8_19 = f4 * g8_19; + var f4g9_19 = f4 * g9_19; + var f5g0 = f5 * g0; + var f5g1_2 = f5_2 * g1; + var f5g2 = f5 * g2; + var f5g3_2 = f5_2 * g3; + var f5g4 = f5 * g4; + var f5g5_38 = f5_2 * g5_19; + var f5g6_19 = f5 * g6_19; + var f5g7_38 = f5_2 * g7_19; + var f5g8_19 = f5 * g8_19; + var f5g9_38 = f5_2 * g9_19; + var f6g0 = f6 * g0; + var f6g1 = f6 * g1; + var f6g2 = f6 * g2; + var f6g3 = f6 * g3; + var f6g4_19 = f6 * g4_19; + var f6g5_19 = f6 * g5_19; + var f6g6_19 = f6 * g6_19; + var f6g7_19 = f6 * g7_19; + var f6g8_19 = f6 * g8_19; + var f6g9_19 = f6 * g9_19; + var f7g0 = f7 * g0; + var f7g1_2 = f7_2 * g1; + var f7g2 = f7 * g2; + var f7g3_38 = f7_2 * g3_19; + var f7g4_19 = f7 * g4_19; + var f7g5_38 = f7_2 * g5_19; + var f7g6_19 = f7 * g6_19; + var f7g7_38 = f7_2 * g7_19; + var f7g8_19 = f7 * g8_19; + var f7g9_38 = f7_2 * g9_19; + var f8g0 = f8 * g0; + var f8g1 = f8 * g1; + var f8g2_19 = f8 * g2_19; + var f8g3_19 = f8 * g3_19; + var f8g4_19 = f8 * g4_19; + var f8g5_19 = f8 * g5_19; + var f8g6_19 = f8 * g6_19; + var f8g7_19 = f8 * g7_19; + var f8g8_19 = f8 * g8_19; + var f8g9_19 = f8 * g9_19; + var f9g0 = f9 * g0; + var f9g1_38 = f9_2 * g1_19; + var f9g2_19 = f9 * g2_19; + var f9g3_38 = f9_2 * g3_19; + var f9g4_19 = f9 * g4_19; + var f9g5_38 = f9_2 * g5_19; + var f9g6_19 = f9 * g6_19; + var f9g7_38 = f9_2 * g7_19; + var f9g8_19 = f9 * g8_19; + var f9g9_38 = f9_2 * g9_19; + var h0 = f0g0 + + f1g9_38 + + f2g8_19 + + f3g7_38 + + f4g6_19 + + f5g5_38 + + f6g4_19 + + f7g3_38 + + f8g2_19 + + f9g1_38; + var h1 = f0g1 + + f1g0 + + f2g9_19 + + f3g8_19 + + f4g7_19 + + f5g6_19 + + f6g5_19 + + f7g4_19 + + f8g3_19 + + f9g2_19; + var h2 = f0g2 + + f1g1_2 + + f2g0 + + f3g9_38 + + f4g8_19 + + f5g7_38 + + f6g6_19 + + f7g5_38 + + f8g4_19 + + f9g3_38; + var h3 = f0g3 + + f1g2 + + f2g1 + + f3g0 + + f4g9_19 + + f5g8_19 + + f6g7_19 + + f7g6_19 + + f8g5_19 + + f9g4_19; + var h4 = f0g4 + + f1g3_2 + + f2g2 + + f3g1_2 + + f4g0 + + f5g9_38 + + f6g8_19 + + f7g7_38 + + f8g6_19 + + f9g5_38; + var h5 = f0g5 + + f1g4 + + f2g3 + + f3g2 + + f4g1 + + f5g0 + + f6g9_19 + + f7g8_19 + + f8g7_19 + + f9g6_19; + var h6 = f0g6 + + f1g5_2 + + f2g4 + + f3g3_2 + + f4g2 + + f5g1_2 + + f6g0 + + f7g9_38 + + f8g8_19 + + f9g7_38; + var h7 = + f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + var h8 = f0g8 + + f1g7_2 + + f2g6 + + f3g5_2 + + f4g4 + + f5g3_2 + + f6g2 + + f7g1_2 + + f8g0 + + f9g9_38; + var h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0; + + var carry = List.filled(10, Number.zero); + +// |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) +// i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 +// |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) +// i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; +// |h0| <= 2^25 +// |h4| <= 2^25 +// |h1| <= 1.51*2^58 +// |h5| <= 1.51*2^58 + + carry[1] = (h1 + (Number.one << 24)) >> 25; + h2 += carry[1]; + h1 -= carry[1] << 25; + carry[5] = (h5 + (Number.one << 24)) >> 25; + h6 += carry[5]; + h5 -= carry[5] << 25; +// |h1| <= 2^24; from now on fits into int32 +// |h5| <= 2^24; from now on fits into int32 +// |h2| <= 1.21*2^59 +// |h6| <= 1.21*2^59 + + carry[2] = (h2 + (Number.one << 25)) >> 26; + h3 += carry[2]; + h2 -= carry[2] << 26; + carry[6] = (h6 + (Number.one << 25)) >> 26; + h7 += carry[6]; + h6 -= carry[6] << 26; +// |h2| <= 2^25; from now on fits into int32 unchanged +// |h6| <= 2^25; from now on fits into int32 unchanged +// |h3| <= 1.51*2^58 +// |h7| <= 1.51*2^58 + + carry[3] = (h3 + (Number.one << 24)) >> 25; + h4 += carry[3]; + h3 -= carry[3] << 25; + carry[7] = (h7 + (Number.one << 24)) >> 25; + h8 += carry[7]; + h7 -= carry[7] << 25; +// |h3| <= 2^24; from now on fits into int32 unchanged +// |h7| <= 2^24; from now on fits into int32 unchanged +// |h4| <= 1.52*2^33 +// |h8| <= 1.52*2^33 + + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; + carry[8] = (h8 + (Number.one << 25)) >> 26; + h9 += carry[8]; + h8 -= carry[8] << 26; +// |h4| <= 2^25; from now on fits into int32 unchanged +// |h8| <= 2^25; from now on fits into int32 unchanged +// |h5| <= 1.01*2^24 +// |h9| <= 1.51*2^58 + + carry[9] = (h9 + (Number.one << 24)) >> 25; + h0 += carry[9] * Numbers.v19; + h9 -= carry[9] << 25; +// |h9| <= 2^24; from now on fits into int32 unchanged +// |h0| <= 1.8*2^37 + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; +// |h0| <= 2^25; from now on fits into int32 unchanged +// |h1| <= 1.01*2^24 + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/// feSquare calculates h = f*f. Can overlap h with f. +/// +/// Preconditions: +/// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +void feSquare(FieldElement h, FieldElement f) { + var f0 = f[0]; + var f1 = f[1]; + var f2 = f[2]; + var f3 = f[3]; + var f4 = f[4]; + var f5 = f[5]; + var f6 = f[6]; + var f7 = f[7]; + var f8 = f[8]; + var f9 = f[9]; + var f0_2 = Number.two * f0; + var f1_2 = Number.two * f1; + var f2_2 = Number.two * f2; + var f3_2 = Number.two * f3; + var f4_2 = Number.two * f4; + var f5_2 = Number.two * f5; + var f6_2 = Number.two * f6; + var f7_2 = Number.two * f7; + var f5_38 = Numbers.v38 * f5; // 1.31*2^30 + var f6_19 = Numbers.v19 * f6; // 1.31*2^30 + var f7_38 = Numbers.v38 * f7; // 1.31*2^30 + var f8_19 = Numbers.v19 * f8; // 1.31*2^30 + var f9_38 = Numbers.v38 * f9; // 1.31*2^30 + var f0f0 = f0 * f0; + var f0f1_2 = f0_2 * f1; + var f0f2_2 = f0_2 * f2; + var f0f3_2 = f0_2 * f3; + var f0f4_2 = f0_2 * f4; + var f0f5_2 = f0_2 * f5; + var f0f6_2 = f0_2 * f6; + var f0f7_2 = f0_2 * f7; + var f0f8_2 = f0_2 * f8; + var f0f9_2 = f0_2 * f9; + var f1f1_2 = f1_2 * f1; + var f1f2_2 = f1_2 * f2; + var f1f3_4 = f1_2 * f3_2; + var f1f4_2 = f1_2 * f4; + var f1f5_4 = f1_2 * f5_2; + var f1f6_2 = f1_2 * f6; + var f1f7_4 = f1_2 * f7_2; + var f1f8_2 = f1_2 * f8; + var f1f9_76 = f1_2 * f9_38; + var f2f2 = f2 * f2; + var f2f3_2 = f2_2 * f3; + var f2f4_2 = f2_2 * f4; + var f2f5_2 = f2_2 * f5; + var f2f6_2 = f2_2 * f6; + var f2f7_2 = f2_2 * f7; + var f2f8_38 = f2_2 * f8_19; + var f2f9_38 = f2 * f9_38; + var f3f3_2 = f3_2 * f3; + var f3f4_2 = f3_2 * f4; + var f3f5_4 = f3_2 * f5_2; + var f3f6_2 = f3_2 * f6; + var f3f7_76 = f3_2 * f7_38; + var f3f8_38 = f3_2 * f8_19; + var f3f9_76 = f3_2 * f9_38; + var f4f4 = f4 * f4; + var f4f5_2 = f4_2 * f5; + var f4f6_38 = f4_2 * f6_19; + var f4f7_38 = f4 * f7_38; + var f4f8_38 = f4_2 * f8_19; + var f4f9_38 = f4 * f9_38; + var f5f5_38 = f5 * f5_38; + var f5f6_38 = f5_2 * f6_19; + var f5f7_76 = f5_2 * f7_38; + var f5f8_38 = f5_2 * f8_19; + var f5f9_76 = f5_2 * f9_38; + var f6f6_19 = f6 * f6_19; + var f6f7_38 = f6 * f7_38; + var f6f8_38 = f6_2 * f8_19; + var f6f9_38 = f6 * f9_38; + var f7f7_38 = f7 * f7_38; + var f7f8_38 = f7_2 * f8_19; + var f7f9_76 = f7_2 * f9_38; + var f8f8_19 = f8 * f8_19; + var f8f9_38 = f8 * f9_38; + var f9f9_38 = f9 * f9_38; + var h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + var h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + var h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + var h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + var h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + var h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + var h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + var h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + var h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + var h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + var carry = List.filled(10, Number.zero); + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; + + carry[1] = (h1 + (Number.one << 24)) >> 25; + h2 += carry[1]; + h1 -= carry[1] << 25; + carry[5] = (h5 + (Number.one << 24)) >> 25; + h6 += carry[5]; + h5 -= carry[5] << 25; + + carry[2] = (h2 + (Number.one << 25)) >> 26; + h3 += carry[2]; + h2 -= carry[2] << 26; + carry[6] = (h6 + (Number.one << 25)) >> 26; + h7 += carry[6]; + h6 -= carry[6] << 26; + + carry[3] = (h3 + (Number.one << 24)) >> 25; + h4 += carry[3]; + h3 -= carry[3] << 25; + carry[7] = (h7 + (Number.one << 24)) >> 25; + h8 += carry[7]; + h7 -= carry[7] << 25; + + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; + carry[8] = (h8 + (Number.one << 25)) >> 26; + h9 += carry[8]; + h8 -= carry[8] << 26; + + carry[9] = (h9 + (Number.one << 24)) >> 25; + h0 += carry[9] * Numbers.v19; + h9 -= carry[9] << 25; + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/// feMul121666 calculates h = f * 121666. Can overlap h with f. +/// +/// Preconditions: +/// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +/// +/// Postconditions: +/// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +void feMul121666(FieldElement h, FieldElement f) { + var h0 = f[0] * Numbers.v121666; + var h1 = f[1] * Numbers.v121666; + var h2 = f[2] * Numbers.v121666; + var h3 = f[3] * Numbers.v121666; + var h4 = f[4] * Numbers.v121666; + var h5 = f[5] * Numbers.v121666; + var h6 = f[6] * Numbers.v121666; + var h7 = f[7] * Numbers.v121666; + var h8 = f[8] * Numbers.v121666; + var h9 = f[9] * Numbers.v121666; + var carry = List.filled(10, Number.zero); + + carry[9] = (h9 + (Number.one << 24)) >> 25; + h0 += carry[9] * Numbers.v19; + h9 -= carry[9] << 25; + carry[1] = (h1 + (Number.one << 24)) >> 25; + h2 += carry[1]; + h1 -= carry[1] << 25; + carry[3] = (h3 + (Number.one << 24)) >> 25; + h4 += carry[3]; + h3 -= carry[3] << 25; + carry[5] = (h5 + (Number.one << 24)) >> 25; + h6 += carry[5]; + h5 -= carry[5] << 25; + carry[7] = (h7 + (Number.one << 24)) >> 25; + h8 += carry[7]; + h7 -= carry[7] << 25; + + carry[0] = (h0 + (Number.one << 25)) >> 26; + h1 += carry[0]; + h0 -= carry[0] << 26; + carry[2] = (h2 + (Number.one << 25)) >> 26; + h3 += carry[2]; + h2 -= carry[2] << 26; + carry[4] = (h4 + (Number.one << 25)) >> 26; + h5 += carry[4]; + h4 -= carry[4] << 26; + carry[6] = (h6 + (Number.one << 25)) >> 26; + h7 += carry[6]; + h6 -= carry[6] << 26; + carry[8] = (h8 + (Number.one << 25)) >> 26; + h9 += carry[8]; + h8 -= carry[8] << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/// feInvert sets out = z^-1. +void feInvert(FieldElement out, FieldElement z) { + var t0 = FieldElement(); + var t1 = FieldElement(); + var t2 = FieldElement(); + var t3 = FieldElement(); + var i = 0; + + feSquare(t0, z); + for (i = 1; i < 1; i++) { + feSquare(t0, t0); + } + feSquare(t1, t0); + for (i = 1; i < 2; i++) { + feSquare(t1, t1); + } + feMul(t1, z, t1); + feMul(t0, t0, t1); + feSquare(t2, t0); + for (i = 1; i < 1; i++) { + feSquare(t2, t2); + } + feMul(t1, t1, t2); + feSquare(t2, t1); + for (i = 1; i < 5; i++) { + feSquare(t2, t2); + } + feMul(t1, t2, t1); + feSquare(t2, t1); + for (i = 1; i < 10; i++) { + feSquare(t2, t2); + } + feMul(t2, t2, t1); + feSquare(t3, t2); + for (i = 1; i < 20; i++) { + feSquare(t3, t3); + } + feMul(t2, t3, t2); + feSquare(t2, t2); + for (i = 1; i < 10; i++) { + feSquare(t2, t2); + } + feMul(t1, t2, t1); + feSquare(t2, t1); + for (i = 1; i < 50; i++) { + feSquare(t2, t2); + } + feMul(t2, t2, t1); + feSquare(t3, t2); + for (i = 1; i < 100; i++) { + feSquare(t3, t3); + } + feMul(t2, t3, t2); + feSquare(t2, t2); + for (i = 1; i < 50; i++) { + feSquare(t2, t2); + } + feMul(t1, t2, t1); + feSquare(t1, t1); + for (i = 1; i < 5; i++) { + feSquare(t1, t1); + } + feMul(out, t1, t0); +} + +void scalarMultGeneric(List out, List input, List base) { + var e = List.filled(32, Number.zero); + + e.setRange(0, e.length, input.map((e) => Number(e)).toList()); + e[0] &= Numbers.v248; + e[31] &= Numbers.v127; + e[31] |= Numbers.v64; + + var x1 = FieldElement(); + var x2 = FieldElement(); + var z2 = FieldElement(); + var x3 = FieldElement(); + var z3 = FieldElement(); + var tmp0 = FieldElement(); + var tmp1 = FieldElement(); + + feFromBytes(x1, base); + FeOne(x2); + FeCopy(x3, x1); + FeOne(z3); + + var swap = Number.zero; + for (var pos = 254; pos >= 0; pos--) { + var b = e[pos ~/ 8] >> (pos & 7); + b &= Number.one; + swap ^= b; + feCSwap(x2, x3, swap); + feCSwap(z2, z3, swap); + swap = b; + + FeSub(tmp0, x3, z3); + FeSub(tmp1, x2, z2); + FeAdd(x2, x2, z2); + FeAdd(z2, x3, z3); + feMul(z3, tmp0, x2); + feMul(z2, z2, tmp1); + feSquare(tmp0, tmp1); + feSquare(tmp1, x2); + FeAdd(x3, z3, z2); + FeSub(z2, z3, z2); + feMul(x2, tmp1, tmp0); + FeSub(tmp1, tmp1, tmp0); + feSquare(z2, z2); + feMul121666(z3, tmp1); + feSquare(x3, x3); + FeAdd(tmp0, tmp0, z3); + feMul(z3, x1, z2); + feMul(z2, tmp1, tmp0); + } + + feCSwap(x2, x3, swap); + feCSwap(z2, z3, swap); + + feInvert(z2, z2); + feMul(x2, x2, z2); + FeToBytes(out, x2); +} diff --git a/x25519/lib/src/numbers.dart b/x25519/lib/src/numbers.dart new file mode 100644 index 0000000..43f36a7 --- /dev/null +++ b/x25519/lib/src/numbers.dart @@ -0,0 +1,11 @@ +import 'package:adaptive_number/adaptive_number.dart'; + +abstract class Numbers { + static Number v19 = Number(19); + static Number v38 = Number(38); + static Number v64 = Number(64); + static Number v127 = Number(127); + static Number v248 = Number(248); + static Number v121666 = Number(121666); + static Number v0x7fffff = Number(0x7fffff); +} diff --git a/x25519/lib/x25519.dart b/x25519/lib/x25519.dart new file mode 100644 index 0000000..5ea48d1 --- /dev/null +++ b/x25519/lib/x25519.dart @@ -0,0 +1,180 @@ +/// Package curve25519 provides an implementation of the X25519 function, which +/// performs scalar multiplication on the elliptic curve known as Curve25519. +/// See RFC 7748. +library x25519; + +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:x25519/src/curve25519.dart' as curve; + +/// ScalarSize is the size of the scalar input to X25519. +const ScalarSize = 32; + +/// PointSize is the size of the point input to X25519. +const PointSize = 32; + +final _random = Random.secure(); + +/// KeyPair is the type of Curve25519 public/private key pair. +class KeyPair { + final List privateKey; + + final List publicKey; + + KeyPair({required this.privateKey, required this.publicKey}); + + @override + int get hashCode => publicKey.hashCode; + + @override + bool operator ==(other) => + other is KeyPair && + publicKey == other.publicKey && + privateKey == other.privateKey; +} + +/// GenerateKey generates a public/private key pair using entropy from secure random. +KeyPair generateKeyPair() { + var private = List.generate(ScalarSize, (i) => _random.nextInt(256)); + var public = List.filled(32, 0); + + private[0] &= 248; + private[31] &= 127; + private[31] |= 64; + + ScalarBaseMult(public, private); + + return KeyPair(privateKey: private, publicKey: Uint8List.fromList(public)); +} + +/// ScalarMult sets dst to the product scalar * point. +/// +/// Deprecated: when provided a low-order point, ScalarMult will set dst to all +/// zeroes, irrespective of the scalar. Instead, use the X25519 function, which +/// will return an error. +void ScalarMult(List dst, List scalar, List point) { + curve.scalarMultGeneric(dst, scalar, point); +} + +/// ScalarBaseMult sets dst to the product scalar * base where base is the +/// standard generator. +/// +/// It is recommended to use the X25519 function with Basepoint instead, as +/// copying into fixed size arrays can lead to unexpected bugs. +void ScalarBaseMult(List dst, List scalar) { + curve.scalarMultGeneric(dst, scalar, basePoint); +} + +var basePoint = List.from([ + 9, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +]); + +void checkBasepoint() { + ListEquality().equals(basePoint, [ + 0x09, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + ]); +} + +/// X25519 returns the result of the scalar multiplication (scalar * point), +/// according to RFC 7748, Section 5. scalar, point and the return value are +/// slices of 32 bytes. +/// +/// scalar can be generated at random, for example with crypto/rand. point should +/// be either Basepoint or the output of another X25519 call. +/// +/// If point is Basepoint (but not if it's a different slice with the same +/// contents) a precomputed implementation might be used for performance. +Uint8List X25519(List scalar, List point) { + /// Outline the body of function, to let the allocation be inlined in the + /// caller, and possibly avoid escaping to the heap. + var dst = List.filled(32, 0); + return x25519(dst, scalar, point); +} + +Uint8List x25519(List dst, List scalar, List point) { + var input = List.filled(32, 0); + if (scalar.length != 32) { + throw ArgumentError('bad scalar length: ${scalar.length}, expected 32'); + } + if (point.length != 32) { + throw ArgumentError('bad scalar length: ${point.length}, expected 32'); + } + input.setRange(0, input.length, scalar); + if (identical(point, basePoint)) { + checkBasepoint(); + ScalarBaseMult(dst, input); + } else { + var base = List.filled(32, 0); + var zero = List.filled(32, 0); + base.setRange(0, base.length, point); + ScalarMult(dst, input, base); + if (ListEquality().equals(dst, zero)) { + throw ArgumentError('bad input point: low order point'); + } + } + return Uint8List.fromList(dst); +} diff --git a/x25519/pubspec.yaml b/x25519/pubspec.yaml new file mode 100644 index 0000000..d98e786 --- /dev/null +++ b/x25519/pubspec.yaml @@ -0,0 +1,17 @@ +name: x25519 +description: Dart port of x25519 from Go Cryptography curve25519. +version: 0.1.1 +homepage: https://github.com/Tougee/curve25519 + +environment: + sdk: '>=2.12.0 <3.0.0' + +dependencies: + collection: ^1.15.0 + adaptive_number: ^1.0.0 + +dev_dependencies: + pedantic: ^1.9.0 + test: ^1.16.4 + hex: ^0.2.0 + benchmark_harness: ^2.0.0 diff --git a/x25519/test/benchmark/curve25519_benchmark.dart b/x25519/test/benchmark/curve25519_benchmark.dart new file mode 100644 index 0000000..56b351c --- /dev/null +++ b/x25519/test/benchmark/curve25519_benchmark.dart @@ -0,0 +1,35 @@ +import 'package:x25519/x25519.dart'; + +import 'rate_benchmark.dart'; + +class X25519Benchmark extends RateBenchmark { + X25519Benchmark() : super('X25519'); + + late final KeyPair _aliceKeyPair; + late final KeyPair _bobKeyPair; + + @override + void setup() { + _aliceKeyPair = generateKeyPair(); + _bobKeyPair = generateKeyPair(); + } + + @override + void run() { + X25519(_aliceKeyPair.publicKey, _bobKeyPair.privateKey); + } +} + +class GenerateKeyPairBenchmark extends RateBenchmark { + GenerateKeyPairBenchmark() : super('generateKeyPair'); + + @override + void run() { + generateKeyPair(); + } +} + +void main() { + GenerateKeyPairBenchmark().report(); + X25519Benchmark().report(); +} diff --git a/x25519/test/benchmark/rate_benchmark.dart b/x25519/test/benchmark/rate_benchmark.dart new file mode 100644 index 0000000..41184a4 --- /dev/null +++ b/x25519/test/benchmark/rate_benchmark.dart @@ -0,0 +1,42 @@ +import 'package:benchmark_harness/benchmark_harness.dart'; + +abstract class RateBenchmark extends BenchmarkBase { + RateBenchmark(String name, {this.runLength = 5000}) + : super(name, emitter: RateEmitter()) { + (emitter as RateEmitter).benchmark = this; + } + + final int runLength; + int _iterations = 0; + + @override + ScoreEmitter get emitter => super.emitter; + + @override + void exercise() { + _iterations = 0; + + var watch = Stopwatch()..start(); + while (watch.elapsedMilliseconds < runLength) { + run(); + _iterations++; + } + } +} + +class RateEmitter implements ScoreEmitter { + late RateBenchmark benchmark; + + int get iterations => benchmark._iterations; + + @override + void emit(String testName, double value) { + final ms = value / 1000; + final date = DateTime.now().toString().split('.')[0]; + + print('| $date | ' + '$testName | ' + '$iterations iterations | ' + '${ms.toInt()} ms'); + } +} diff --git a/x25519/test/curve25519_test.dart b/x25519/test/curve25519_test.dart new file mode 100644 index 0000000..47f26bf --- /dev/null +++ b/x25519/test/curve25519_test.dart @@ -0,0 +1,59 @@ +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:x25519/x25519.dart'; +import 'package:test/test.dart'; +import 'package:hex/hex.dart'; + +import 'vectors_test.dart'; + +const expectedHex = + '89161fde887b2b53de549af483940106ecc114d6982daa98256de23bdf77661a'; + +void main() { + test('testX25519Basepoint', () { + var x = List.filled(32, 0); + x[0] = 1; + + for (var i = 0; i < 200; i++) { + x = X25519(x, basePoint); + } + assert(HEX.encode(x) == expectedHex); + }); + + test('testLowOrderPoints', () { + var scalar = List.filled(ScalarSize, 0); + for (var i = 1; i < lowOrderPoints.length; i++) { + try { + var out = X25519(scalar, lowOrderPoints[i]); + fail('$i expect error, got $out'); + // ignore: empty_catches + } on ArgumentError {} + } + }); + + test('testTestVectors', () { + for (var i = 0; i < testVectors.length; i++) { + var item = testVectors[i]; + var got = List.filled(ScalarSize, 0); + ScalarMult(got, item.input, item.base); + assert(ListEquality().equals(Uint8List.fromList(got), item.expect)); + } + + for (var i = 0; i < testVectors.length; i++) { + var item = testVectors[i]; + var got = X25519(item.input, item.base); + assert(ListEquality().equals(got, item.expect)); + } + }); + + test('testGenKeyAndX25519', () { + var aliceKeyPair = generateKeyPair(); + var bobKeyPair = generateKeyPair(); + + var aliceSharedKey = X25519(aliceKeyPair.privateKey, bobKeyPair.publicKey); + var bobSharedKey = X25519(bobKeyPair.privateKey, aliceKeyPair.publicKey); + + assert(ListEquality().equals(aliceSharedKey, bobSharedKey)); + }); +} diff --git a/x25519/test/vectors_test.dart b/x25519/test/vectors_test.dart new file mode 100644 index 0000000..aedcddd --- /dev/null +++ b/x25519/test/vectors_test.dart @@ -0,0 +1,1894 @@ +// lowOrderPoints from libsodium. +// https://github.com/jedisct1/libsodium/blob/65621a1059a37d/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c#L11-L70 +var lowOrderPoints = List>.from([ + List.from([ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 + ]), + List.from([ + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 + ]), + List.from([ + 0xe0, + 0xeb, + 0x7a, + 0x7c, + 0x3b, + 0x41, + 0xb8, + 0xae, + 0x16, + 0x56, + 0xe3, + 0xfa, + 0xf1, + 0x9f, + 0xc4, + 0x6a, + 0xda, + 0x09, + 0x8d, + 0xeb, + 0x9c, + 0x32, + 0xb1, + 0xfd, + 0x86, + 0x62, + 0x05, + 0x16, + 0x5f, + 0x49, + 0xb8, + 0x00 + ]), + List.from([ + 0x5f, + 0x9c, + 0x95, + 0xbc, + 0xa3, + 0x50, + 0x8c, + 0x24, + 0xb1, + 0xd0, + 0xb1, + 0x55, + 0x9c, + 0x83, + 0xef, + 0x5b, + 0x04, + 0x44, + 0x5c, + 0xc4, + 0x58, + 0x1c, + 0x8e, + 0x86, + 0xd8, + 0x22, + 0x4e, + 0xdd, + 0xd0, + 0x9f, + 0x11, + 0x57 + ]), + List.from([ + 0xec, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f + ]), + List.from([ + 0xed, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f + ]), + List.from([ + 0xee, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f + ]), +]); + +class TestVectors { + final List input; + final List base; + final List expect; + + TestVectors.from(this.input, this.base, this.expect); +} + +// testVectors generated with BoringSSL. +var testVectors = List.from([ + TestVectors.from([ + 0x66, + 0x8f, + 0xb9, + 0xf7, + 0x6a, + 0xd9, + 0x71, + 0xc8, + 0x1a, + 0xc9, + 0x0, + 0x7, + 0x1a, + 0x15, + 0x60, + 0xbc, + 0xe2, + 0xca, + 0x0, + 0xca, + 0xc7, + 0xe6, + 0x7a, + 0xf9, + 0x93, + 0x48, + 0x91, + 0x37, + 0x61, + 0x43, + 0x40, + 0x14 + ], [ + 0xdb, + 0x5f, + 0x32, + 0xb7, + 0xf8, + 0x41, + 0xe7, + 0xa1, + 0xa0, + 0x9, + 0x68, + 0xef, + 0xfd, + 0xed, + 0x12, + 0x73, + 0x5f, + 0xc4, + 0x7a, + 0x3e, + 0xb1, + 0x3b, + 0x57, + 0x9a, + 0xac, + 0xad, + 0xea, + 0xe8, + 0x9, + 0x39, + 0xa7, + 0xdd + ], [ + 0x9, + 0xd, + 0x85, + 0xe5, + 0x99, + 0xea, + 0x8e, + 0x2b, + 0xee, + 0xb6, + 0x13, + 0x4, + 0xd3, + 0x7b, + 0xe1, + 0xe, + 0xc5, + 0xc9, + 0x5, + 0xf9, + 0x92, + 0x7d, + 0x32, + 0xf4, + 0x2a, + 0x9a, + 0xa, + 0xfb, + 0x3e, + 0xb, + 0x40, + 0x74 + ]), + TestVectors.from([ + 0x63, + 0x66, + 0x95, + 0xe3, + 0x4f, + 0x75, + 0xb9, + 0xa2, + 0x79, + 0xc8, + 0x70, + 0x6f, + 0xad, + 0x12, + 0x89, + 0xf2, + 0xc0, + 0xb1, + 0xe2, + 0x2e, + 0x16, + 0xf8, + 0xb8, + 0x86, + 0x17, + 0x29, + 0xc1, + 0xa, + 0x58, + 0x29, + 0x58, + 0xaf + ], [ + 0x9, + 0xd, + 0x7, + 0x1, + 0xf8, + 0xfd, + 0xe2, + 0x8f, + 0x70, + 0x4, + 0x3b, + 0x83, + 0xf2, + 0x34, + 0x62, + 0x25, + 0x41, + 0x9b, + 0x18, + 0xa7, + 0xf2, + 0x7e, + 0x9e, + 0x3d, + 0x2b, + 0xfd, + 0x4, + 0xe1, + 0xf, + 0x3d, + 0x21, + 0x3e + ], [ + 0xbf, + 0x26, + 0xec, + 0x7e, + 0xc4, + 0x13, + 0x6, + 0x17, + 0x33, + 0xd4, + 0x40, + 0x70, + 0xea, + 0x67, + 0xca, + 0xb0, + 0x2a, + 0x85, + 0xdc, + 0x1b, + 0xe8, + 0xcf, + 0xe1, + 0xff, + 0x73, + 0xd5, + 0x41, + 0xcc, + 0x8, + 0x32, + 0x55, + 0x6 + ]), + TestVectors.from([ + 0x73, + 0x41, + 0x81, + 0xcd, + 0x1a, + 0x94, + 0x6, + 0x52, + 0x2a, + 0x56, + 0xfe, + 0x25, + 0xe4, + 0x3e, + 0xcb, + 0xf0, + 0x29, + 0x5d, + 0xb5, + 0xdd, + 0xd0, + 0x60, + 0x9b, + 0x3c, + 0x2b, + 0x4e, + 0x79, + 0xc0, + 0x6f, + 0x8b, + 0xd4, + 0x6d + ], [ + 0xf8, + 0xa8, + 0x42, + 0x1c, + 0x7d, + 0x21, + 0xa9, + 0x2d, + 0xb3, + 0xed, + 0xe9, + 0x79, + 0xe1, + 0xfa, + 0x6a, + 0xcb, + 0x6, + 0x2b, + 0x56, + 0xb1, + 0x88, + 0x5c, + 0x71, + 0xc5, + 0x11, + 0x53, + 0xcc, + 0xb8, + 0x80, + 0xac, + 0x73, + 0x15 + ], [ + 0x11, + 0x76, + 0xd0, + 0x16, + 0x81, + 0xf2, + 0xcf, + 0x92, + 0x9d, + 0xa2, + 0xc7, + 0xa3, + 0xdf, + 0x66, + 0xb5, + 0xd7, + 0x72, + 0x9f, + 0xd4, + 0x22, + 0x22, + 0x6f, + 0xd6, + 0x37, + 0x42, + 0x16, + 0xbf, + 0x7e, + 0x2, + 0xfd, + 0xf, + 0x62 + ]), + TestVectors.from([ + 0x1f, + 0x70, + 0x39, + 0x1f, + 0x6b, + 0xa8, + 0x58, + 0x12, + 0x94, + 0x13, + 0xbd, + 0x80, + 0x1b, + 0x12, + 0xac, + 0xbf, + 0x66, + 0x23, + 0x62, + 0x82, + 0x5c, + 0xa2, + 0x50, + 0x9c, + 0x81, + 0x87, + 0x59, + 0xa, + 0x2b, + 0xe, + 0x61, + 0x72 + ], [ + 0xd3, + 0xea, + 0xd0, + 0x7a, + 0x0, + 0x8, + 0xf4, + 0x45, + 0x2, + 0xd5, + 0x80, + 0x8b, + 0xff, + 0xc8, + 0x97, + 0x9f, + 0x25, + 0xa8, + 0x59, + 0xd5, + 0xad, + 0xf4, + 0x31, + 0x2e, + 0xa4, + 0x87, + 0x48, + 0x9c, + 0x30, + 0xe0, + 0x1b, + 0x3b + ], [ + 0xf8, + 0x48, + 0x2f, + 0x2e, + 0x9e, + 0x58, + 0xbb, + 0x6, + 0x7e, + 0x86, + 0xb2, + 0x87, + 0x24, + 0xb3, + 0xc0, + 0xa3, + 0xbb, + 0xb5, + 0x7, + 0x3e, + 0x4c, + 0x6a, + 0xcd, + 0x93, + 0xdf, + 0x54, + 0x5e, + 0xff, + 0xdb, + 0xba, + 0x50, + 0x5f + ]), + TestVectors.from([ + 0x3a, + 0x7a, + 0xe6, + 0xcf, + 0x8b, + 0x88, + 0x9d, + 0x2b, + 0x7a, + 0x60, + 0xa4, + 0x70, + 0xad, + 0x6a, + 0xd9, + 0x99, + 0x20, + 0x6b, + 0xf5, + 0x7d, + 0x90, + 0x30, + 0xdd, + 0xf7, + 0xf8, + 0x68, + 0xc, + 0x8b, + 0x1a, + 0x64, + 0x5d, + 0xaa + ], [ + 0x4d, + 0x25, + 0x4c, + 0x80, + 0x83, + 0xd8, + 0x7f, + 0x1a, + 0x9b, + 0x3e, + 0xa7, + 0x31, + 0xef, + 0xcf, + 0xf8, + 0xa6, + 0xf2, + 0x31, + 0x2d, + 0x6f, + 0xed, + 0x68, + 0xe, + 0xf8, + 0x29, + 0x18, + 0x51, + 0x61, + 0xc8, + 0xfc, + 0x50, + 0x60 + ], [ + 0x47, + 0xb3, + 0x56, + 0xd5, + 0x81, + 0x8d, + 0xe8, + 0xef, + 0xac, + 0x77, + 0x4b, + 0x71, + 0x4c, + 0x42, + 0xc4, + 0x4b, + 0xe6, + 0x85, + 0x23, + 0xdd, + 0x57, + 0xdb, + 0xd7, + 0x39, + 0x62, + 0xd5, + 0xa5, + 0x26, + 0x31, + 0x87, + 0x62, + 0x37 + ]), + TestVectors.from([ + 0x20, + 0x31, + 0x61, + 0xc3, + 0x15, + 0x9a, + 0x87, + 0x6a, + 0x2b, + 0xea, + 0xec, + 0x29, + 0xd2, + 0x42, + 0x7f, + 0xb0, + 0xc7, + 0xc3, + 0xd, + 0x38, + 0x2c, + 0xd0, + 0x13, + 0xd2, + 0x7c, + 0xc3, + 0xd3, + 0x93, + 0xdb, + 0xd, + 0xaf, + 0x6f + ], [ + 0x6a, + 0xb9, + 0x5d, + 0x1a, + 0xbe, + 0x68, + 0xc0, + 0x9b, + 0x0, + 0x5c, + 0x3d, + 0xb9, + 0x4, + 0x2c, + 0xc9, + 0x1a, + 0xc8, + 0x49, + 0xf7, + 0xe9, + 0x4a, + 0x2a, + 0x4a, + 0x9b, + 0x89, + 0x36, + 0x78, + 0x97, + 0xb, + 0x7b, + 0x95, + 0xbf + ], [ + 0x11, + 0xed, + 0xae, + 0xdc, + 0x95, + 0xff, + 0x78, + 0xf5, + 0x63, + 0xa1, + 0xc8, + 0xf1, + 0x55, + 0x91, + 0xc0, + 0x71, + 0xde, + 0xa0, + 0x92, + 0xb4, + 0xd7, + 0xec, + 0xaa, + 0xc8, + 0xe0, + 0x38, + 0x7b, + 0x5a, + 0x16, + 0xc, + 0x4e, + 0x5d + ]), + TestVectors.from( + [ + 0x13, + 0xd6, + 0x54, + 0x91, + 0xfe, + 0x75, + 0xf2, + 0x3, + 0xa0, + 0x8, + 0xb4, + 0x41, + 0x5a, + 0xbc, + 0x60, + 0xd5, + 0x32, + 0xe6, + 0x95, + 0xdb, + 0xd2, + 0xf1, + 0xe8, + 0x3, + 0xac, + 0xcb, + 0x34, + 0xb2, + 0xb7, + 0x2c, + 0x3d, + 0x70 + ], + [ + 0x2e, + 0x78, + 0x4e, + 0x4, + 0xca, + 0x0, + 0x73, + 0x33, + 0x62, + 0x56, + 0xa8, + 0x39, + 0x25, + 0x5e, + 0xd2, + 0xf7, + 0xd4, + 0x79, + 0x6a, + 0x64, + 0xcd, + 0xc3, + 0x7f, + 0x1e, + 0xb0, + 0xe5, + 0xc4, + 0xc8, + 0xd1, + 0xd1, + 0xe0, + 0xf5 + ], + [ + 0x56, + 0x3e, + 0x8c, + 0x9a, + 0xda, + 0xa7, + 0xd7, + 0x31, + 0x1, + 0xb0, + 0xf2, + 0xea, + 0xd3, + 0xca, + 0xe1, + 0xea, + 0x5d, + 0x8f, + 0xcd, + 0x5c, + 0xd3, + 0x60, + 0x80, + 0xbb, + 0x8e, + 0x6e, + 0xc0, + 0x3d, + 0x61, + 0x45, + 0x9, + 0x17 + ], + ), + TestVectors.from( + [ + 0x68, + 0x6f, + 0x7d, + 0xa9, + 0x3b, + 0xf2, + 0x68, + 0xe5, + 0x88, + 0x6, + 0x98, + 0x31, + 0xf0, + 0x47, + 0x16, + 0x3f, + 0x33, + 0x58, + 0x99, + 0x89, + 0xd0, + 0x82, + 0x6e, + 0x98, + 0x8, + 0xfb, + 0x67, + 0x8e, + 0xd5, + 0x7e, + 0x67, + 0x49 + ], + [ + 0x8b, + 0x54, + 0x9b, + 0x2d, + 0xf6, + 0x42, + 0xd3, + 0xb2, + 0x5f, + 0xe8, + 0x38, + 0xf, + 0x8c, + 0xc4, + 0x37, + 0x5f, + 0x99, + 0xb7, + 0xbb, + 0x4d, + 0x27, + 0x5f, + 0x77, + 0x9f, + 0x3b, + 0x7c, + 0x81, + 0xb8, + 0xa2, + 0xbb, + 0xc1, + 0x29 + ], + [ + 0x1, + 0x47, + 0x69, + 0x65, + 0x42, + 0x6b, + 0x61, + 0x71, + 0x74, + 0x9a, + 0x8a, + 0xdd, + 0x92, + 0x35, + 0x2, + 0x5c, + 0xe5, + 0xf5, + 0x57, + 0xfe, + 0x40, + 0x9, + 0xf7, + 0x39, + 0x30, + 0x44, + 0xeb, + 0xbb, + 0x8a, + 0xe9, + 0x52, + 0x79 + ], + ), + TestVectors.from( + [ + 0x82, + 0xd6, + 0x1c, + 0xce, + 0xdc, + 0x80, + 0x6a, + 0x60, + 0x60, + 0xa3, + 0x34, + 0x9a, + 0x5e, + 0x87, + 0xcb, + 0xc7, + 0xac, + 0x11, + 0x5e, + 0x4f, + 0x87, + 0x77, + 0x62, + 0x50, + 0xae, + 0x25, + 0x60, + 0x98, + 0xa7, + 0xc4, + 0x49, + 0x59 + ], + [ + 0x8b, + 0x6b, + 0x9d, + 0x8, + 0xf6, + 0x1f, + 0xc9, + 0x1f, + 0xe8, + 0xb3, + 0x29, + 0x53, + 0xc4, + 0x23, + 0x40, + 0xf0, + 0x7, + 0xb5, + 0x71, + 0xdc, + 0xb0, + 0xa5, + 0x6d, + 0x10, + 0x72, + 0x4e, + 0xce, + 0xf9, + 0x95, + 0xc, + 0xfb, + 0x25 + ], + [ + 0x9c, + 0x49, + 0x94, + 0x1f, + 0x9c, + 0x4f, + 0x18, + 0x71, + 0xfa, + 0x40, + 0x91, + 0xfe, + 0xd7, + 0x16, + 0xd3, + 0x49, + 0x99, + 0xc9, + 0x52, + 0x34, + 0xed, + 0xf2, + 0xfd, + 0xfb, + 0xa6, + 0xd1, + 0x4a, + 0x5a, + 0xfe, + 0x9e, + 0x5, + 0x58 + ], + ), + TestVectors.from( + [ + 0x7d, + 0xc7, + 0x64, + 0x4, + 0x83, + 0x13, + 0x97, + 0xd5, + 0x88, + 0x4f, + 0xdf, + 0x6f, + 0x97, + 0xe1, + 0x74, + 0x4c, + 0x9e, + 0xb1, + 0x18, + 0xa3, + 0x1a, + 0x7b, + 0x23, + 0xf8, + 0xd7, + 0x9f, + 0x48, + 0xce, + 0x9c, + 0xad, + 0x15, + 0x4b + ], + [ + 0x1a, + 0xcd, + 0x29, + 0x27, + 0x84, + 0xf4, + 0x79, + 0x19, + 0xd4, + 0x55, + 0xf8, + 0x87, + 0x44, + 0x83, + 0x58, + 0x61, + 0xb, + 0xb9, + 0x45, + 0x96, + 0x70, + 0xeb, + 0x99, + 0xde, + 0xe4, + 0x60, + 0x5, + 0xf6, + 0x89, + 0xca, + 0x5f, + 0xb6 + ], + [ + 0x0, + 0xf4, + 0x3c, + 0x2, + 0x2e, + 0x94, + 0xea, + 0x38, + 0x19, + 0xb0, + 0x36, + 0xae, + 0x2b, + 0x36, + 0xb2, + 0xa7, + 0x61, + 0x36, + 0xaf, + 0x62, + 0x8a, + 0x75, + 0x1f, + 0xe5, + 0xd0, + 0x1e, + 0x3, + 0xd, + 0x44, + 0x25, + 0x88, + 0x59 + ], + ), + TestVectors.from( + [ + 0xfb, + 0xc4, + 0x51, + 0x1d, + 0x23, + 0xa6, + 0x82, + 0xae, + 0x4e, + 0xfd, + 0x8, + 0xc8, + 0x17, + 0x9c, + 0x1c, + 0x6, + 0x7f, + 0x9c, + 0x8b, + 0xe7, + 0x9b, + 0xbc, + 0x4e, + 0xff, + 0x5c, + 0xe2, + 0x96, + 0xc6, + 0xbc, + 0x1f, + 0xf4, + 0x45 + ], + [ + 0x55, + 0xca, + 0xff, + 0x21, + 0x81, + 0xf2, + 0x13, + 0x6b, + 0xe, + 0xd0, + 0xe1, + 0xe2, + 0x99, + 0x44, + 0x48, + 0xe1, + 0x6c, + 0xc9, + 0x70, + 0x64, + 0x6a, + 0x98, + 0x3d, + 0x14, + 0xd, + 0xc4, + 0xea, + 0xb3, + 0xd9, + 0x4c, + 0x28, + 0x4e + ], + [ + 0xae, + 0x39, + 0xd8, + 0x16, + 0x53, + 0x23, + 0x45, + 0x79, + 0x4d, + 0x26, + 0x91, + 0xe0, + 0x80, + 0x1c, + 0xaa, + 0x52, + 0x5f, + 0xc3, + 0x63, + 0x4d, + 0x40, + 0x2c, + 0xe9, + 0x58, + 0xb, + 0x33, + 0x38, + 0xb4, + 0x6f, + 0x8b, + 0xb9, + 0x72 + ], + ), + TestVectors.from( + [ + 0x4e, + 0x6, + 0xc, + 0xe1, + 0xc, + 0xeb, + 0xf0, + 0x95, + 0x9, + 0x87, + 0x16, + 0xc8, + 0x66, + 0x19, + 0xeb, + 0x9f, + 0x7d, + 0xf6, + 0x65, + 0x24, + 0x69, + 0x8b, + 0xa7, + 0x98, + 0x8c, + 0x3b, + 0x90, + 0x95, + 0xd9, + 0xf5, + 0x1, + 0x34 + ], + [ + 0x57, + 0x73, + 0x3f, + 0x2d, + 0x86, + 0x96, + 0x90, + 0xd0, + 0xd2, + 0xed, + 0xae, + 0xc9, + 0x52, + 0x3d, + 0xaa, + 0x2d, + 0xa9, + 0x54, + 0x45, + 0xf4, + 0x4f, + 0x57, + 0x83, + 0xc1, + 0xfa, + 0xec, + 0x6c, + 0x3a, + 0x98, + 0x28, + 0x18, + 0xf3 + ], + [ + 0xa6, + 0x1e, + 0x74, + 0x55, + 0x2c, + 0xce, + 0x75, + 0xf5, + 0xe9, + 0x72, + 0xe4, + 0x24, + 0xf2, + 0xcc, + 0xb0, + 0x9c, + 0x83, + 0xbc, + 0x1b, + 0x67, + 0x1, + 0x47, + 0x48, + 0xf0, + 0x2c, + 0x37, + 0x1a, + 0x20, + 0x9e, + 0xf2, + 0xfb, + 0x2c + ], + ), + TestVectors.from( + [ + 0x5c, + 0x49, + 0x2c, + 0xba, + 0x2c, + 0xc8, + 0x92, + 0x48, + 0x8a, + 0x9c, + 0xeb, + 0x91, + 0x86, + 0xc2, + 0xaa, + 0xc2, + 0x2f, + 0x1, + 0x5b, + 0xf3, + 0xef, + 0x8d, + 0x3e, + 0xcc, + 0x9c, + 0x41, + 0x76, + 0x97, + 0x62, + 0x61, + 0xaa, + 0xb1 + ], + [ + 0x67, + 0x97, + 0xc2, + 0xe7, + 0xdc, + 0x92, + 0xcc, + 0xbe, + 0x7c, + 0x5, + 0x6b, + 0xec, + 0x35, + 0xa, + 0xb6, + 0xd3, + 0xbd, + 0x2a, + 0x2c, + 0x6b, + 0xc5, + 0xa8, + 0x7, + 0xbb, + 0xca, + 0xe1, + 0xf6, + 0xc2, + 0xaf, + 0x80, + 0x36, + 0x44 + ], + [ + 0xfc, + 0xf3, + 0x7, + 0xdf, + 0xbc, + 0x19, + 0x2, + 0xb, + 0x28, + 0xa6, + 0x61, + 0x8c, + 0x6c, + 0x62, + 0x2f, + 0x31, + 0x7e, + 0x45, + 0x96, + 0x7d, + 0xac, + 0xf4, + 0xae, + 0x4a, + 0xa, + 0x69, + 0x9a, + 0x10, + 0x76, + 0x9f, + 0xde, + 0x14 + ], + ), + TestVectors.from( + [ + 0xea, + 0x33, + 0x34, + 0x92, + 0x96, + 0x5, + 0x5a, + 0x4e, + 0x8b, + 0x19, + 0x2e, + 0x3c, + 0x23, + 0xc5, + 0xf4, + 0xc8, + 0x44, + 0x28, + 0x2a, + 0x3b, + 0xfc, + 0x19, + 0xec, + 0xc9, + 0xdc, + 0x64, + 0x6a, + 0x42, + 0xc3, + 0x8d, + 0xc2, + 0x48 + ], + [ + 0x2c, + 0x75, + 0xd8, + 0x51, + 0x42, + 0xec, + 0xad, + 0x3e, + 0x69, + 0x44, + 0x70, + 0x4, + 0x54, + 0xc, + 0x1c, + 0x23, + 0x54, + 0x8f, + 0xc8, + 0xf4, + 0x86, + 0x25, + 0x1b, + 0x8a, + 0x19, + 0x46, + 0x3f, + 0x3d, + 0xf6, + 0xf8, + 0xac, + 0x61 + ], + [ + 0x5d, + 0xca, + 0xb6, + 0x89, + 0x73, + 0xf9, + 0x5b, + 0xd3, + 0xae, + 0x4b, + 0x34, + 0xfa, + 0xb9, + 0x49, + 0xfb, + 0x7f, + 0xb1, + 0x5a, + 0xf1, + 0xd8, + 0xca, + 0xe2, + 0x8c, + 0xd6, + 0x99, + 0xf9, + 0xc1, + 0xaa, + 0x33, + 0x37, + 0x34, + 0x2f + ], + ), + TestVectors.from( + [ + 0x4f, + 0x29, + 0x79, + 0xb1, + 0xec, + 0x86, + 0x19, + 0xe4, + 0x5c, + 0xa, + 0xb, + 0x2b, + 0x52, + 0x9, + 0x34, + 0x54, + 0x1a, + 0xb9, + 0x44, + 0x7, + 0xb6, + 0x4d, + 0x19, + 0xa, + 0x76, + 0xf3, + 0x23, + 0x14, + 0xef, + 0xe1, + 0x84, + 0xe7 + ], + [ + 0xf7, + 0xca, + 0xe1, + 0x8d, + 0x8d, + 0x36, + 0xa7, + 0xf5, + 0x61, + 0x17, + 0xb8, + 0xb7, + 0xe, + 0x25, + 0x52, + 0x27, + 0x7f, + 0xfc, + 0x99, + 0xdf, + 0x87, + 0x56, + 0xb5, + 0xe1, + 0x38, + 0xbf, + 0x63, + 0x68, + 0xbc, + 0x87, + 0xf7, + 0x4c + ], + [ + 0xe4, + 0xe6, + 0x34, + 0xeb, + 0xb4, + 0xfb, + 0x66, + 0x4f, + 0xe8, + 0xb2, + 0xcf, + 0xa1, + 0x61, + 0x5f, + 0x0, + 0xe6, + 0x46, + 0x6f, + 0xff, + 0x73, + 0x2c, + 0xe1, + 0xf8, + 0xa0, + 0xc8, + 0xd2, + 0x72, + 0x74, + 0x31, + 0xd1, + 0x6f, + 0x14 + ], + ), + TestVectors.from( + [ + 0xf5, + 0xd8, + 0xa9, + 0x27, + 0x90, + 0x1d, + 0x4f, + 0xa4, + 0x24, + 0x90, + 0x86, + 0xb7, + 0xff, + 0xec, + 0x24, + 0xf5, + 0x29, + 0x7d, + 0x80, + 0x11, + 0x8e, + 0x4a, + 0xc9, + 0xd3, + 0xfc, + 0x9a, + 0x82, + 0x37, + 0x95, + 0x1e, + 0x3b, + 0x7f + ], + [ + 0x3c, + 0x23, + 0x5e, + 0xdc, + 0x2, + 0xf9, + 0x11, + 0x56, + 0x41, + 0xdb, + 0xf5, + 0x16, + 0xd5, + 0xde, + 0x8a, + 0x73, + 0x5d, + 0x6e, + 0x53, + 0xe2, + 0x2a, + 0xa2, + 0xac, + 0x14, + 0x36, + 0x56, + 0x4, + 0x5f, + 0xf2, + 0xe9, + 0x52, + 0x49 + ], + [ + 0xab, + 0x95, + 0x15, + 0xab, + 0x14, + 0xaf, + 0x9d, + 0x27, + 0xe, + 0x1d, + 0xae, + 0xc, + 0x56, + 0x80, + 0xcb, + 0xc8, + 0x88, + 0xb, + 0xd8, + 0xa8, + 0xe7, + 0xeb, + 0x67, + 0xb4, + 0xda, + 0x42, + 0xa6, + 0x61, + 0x96, + 0x1e, + 0xfc, + 0xb + ], + ), +]);